mayavi-4.5.0/0000755000076500000240000000000012747722127013425 5ustar prabhustaff00000000000000mayavi-4.5.0/artwork/0000755000076500000240000000000012747722127015116 5ustar prabhustaff00000000000000mayavi-4.5.0/artwork/dataset_diagram/0000755000076500000240000000000012747722127020227 5ustar prabhustaff00000000000000mayavi-4.5.0/artwork/dataset_diagram/dataset_diagram.svg0000644000076500000240000004520712747716313024071 0ustar prabhustaff00000000000000 image/svg+xml Points in3D Connected? Uconnected Implicit Explicit Data? Vector Scalar On the points In the cells Datasets mayavi-4.5.0/artwork/dataset_diagram/structured_points.jpg0000644000076500000240000002126012747716313024532 0ustar prabhustaff00000000000000JFIFHHC  !"$"$ ^= ;!1A"Q 2BaR#bq$Crs3c?h5 6IU_ԎQe|*Yg(t0C3N:[5ל]\_(-%Ҫ}ES3AkoVy̯i3* qpkv """""""""""""""""⫁4SH\+vUX.>uCsHl4!x*,cWlGq[(%X?zy&k]4#;2WLU%e=,POHacNIqo2oJKN1A+{O`|ɶ~(2kNACFwZր sNT\trlaEo}\?Q>EI͡m@f/ fֻٓȈ"%v{F7aCUUMRf} ;V}ͷ -fOJ_8{"@e޿oӽV/RYV_YqkUAU_E'LstH; tբvAX53yԷ7sQM kkz!Y ݖ[01Uujbm:Y"""""""""y gX]-}:Ck l ;(i$!"IZicd N00ɯ\~ғJLOn ]Sc2)k3Gc:/#!:kWᾉ,ԗ8rҦKƒC:B؆F;KZ*Zj*8(ᦥC , dlhZ֎x\ʲ;+eݩ-v\27gG aY9-,dZiCE<, Y,Ok}W""""""""""""""""""W|͹nhv4Eâ/i7CsIuڜ_g!wn:ԙ]j`y~g {F?ޑ-]E=,usOO$Fƍ8 $Cu=6d;$&vd|֖%LhҸ;oy#[%Cc[^ VqL'{el ǽ]#cY2""""""""*thr6 y3<]" Դ5TFnk١T#_,}ZbcAIw'Z-\gn|ԕ\dkȢHtosz>pEuuj2~sHwVɊir<^ӐжF](H4XGN DDDDDDE }A vcP\ =뫡>NmQeͤ{Eu,K{>6odlc-sN/;%X[SY B\ ñ:#ԞF۔x+k% xOpA"6Gִ _h%!o-ntn|֖ F;Lo2=eקnǯ+EedV[KE]T|TߧiV y-]mXYtF!uC4 [=hiMCE)nlhkZ7@iqU-,S;(X~ UWNT*̚^!v5;IfI$h MC \}[啓䍶#uhgL-:pBh`Zjc XY$r49i- Z߅WSsm̨$)%#|w{[l8rAhk8 q n  },5UQ:)Y:6;U'8qό"؎C-CSL}::`^jqW>`)/L&qm.W2&<# UQ|zܓ"}mʵr|xk@xyTuPO-=D/lK_v; !\9jVnǯoacΆy­Jl\1lt=eY9=Âǚ I'@i~CM :/zi& p=À>!lDDDDDE}Rr'l=%=rw`~xsn\Zw'|9Tmޜ{u^ӽt-V==H=$;$N)۹3Įs򌌝:]7b@7 &GG3zhଜ7m1=Qk~z=frM)R~N/k1o cmങt.K+Q`9&D+*PzLm#vA Ywa{ADSO$H̀u;Nlh]#Z$=2YrjȮ#28i壭伍c.VDDDDDDEY=S6!<]v/ | 明Yr[M0GV>^"㩂 iiax%ad潤h؂;iaT=Tnq/\dNkHvx?%gֱ5Q|$peƗ=: $V\5e{㦻o0ۨ\Fփi0HVo`<χ[3LګIu`b4duA#v1}/y'L:JˎKpՍ`'ƟAqk$X"""""".CvX.7ۜK-]Kأa{UW͜w@.E#C!si):5 bV]ΖnfOO4gNF89V#)e$10pB:46t?K۾>DDDDDD\Nm[hQ{ xsApowQIANd+CuڐV\ swW<8:LNtŲ[~Eeu5;gF;荴>A#YF!cNB1>DC }5k m=fl-0!E$ƀrOahE;ůuʒZ:t# tT)aw^<.TcF2Fkב *yjj%lPK#tִ@ZW=q%x}\M47AΖDDDDDEuŨq,ny).HXH}=3ta{W UL5hY 5=aA}Cnr2J'U*)OS%cI`A*I5M 6e>]{i${? Wnn)mvI+l4Dާ%Z]Sjjm3Hs?\@?:o 2DDD\5tUTKMܒ c>ǰ] k%2jijqzK%:I,$+DDDXk٥0+ƭw14tI {p1.GY &*ZFث]ʃx͘X蠹Acp;FFw}/k[jREx{L9Z\{>@6dx>;o_%Vv\ɹKg H#GDh h}ޑEf3% ίZtu}>5Gɮ:Θz=NihNU6bmKlvd•{Z4dQxDDDDDDUnW&]r]LZ!KC/phk>OA(1zJ>RӳI! hH xx-;l^#.{:d('S`q p cOdR>B%x 寇򁿶@~uO+wDDDDDDD]kŠk\O+h%'%W,z{Ir::GGITG4:Hζ5o6Fa[Mu}S$TR|zpq 5EFH84~BDDDDDEӽ]mvKdKʎAj Q: w>HXâϬ'tq<@6W>q'C#`.@ĬprwOn2P潧pFpF‰' ٮ3ƶ]SB3swq w6\$_*Y~zXBm=DlI}tDDDDDDEkZ7ONٽ:UU d #lͮm l.;|{>־u興 .Q)z!lW}lN#Uj2NU:zr9–A.' cG‘5 6IZ淝z^D:yΘjDRqpHYol`|5Hi湤?(xbH'#K$kF |(7rz[U\nvs㠩wiq!Ė4hu~+OG=X6KK>@͏_W۬;ƶ3R>Yw;V='%lf]nȯeEwSa G O%ñsݢ@ntDDDDDEr]h07\䍔U5S3:6ypR9}Pݘu1rdbwqSX+MFMlJ\"uu[ FoQDfyqQi4:HZ#z.f x+$DDDDDDDDDDZ#ַWr7Yau]3i`&Isu4L.=,pICUsmm* *^Y-5D.V8 8Z/dR=K.dF~ *`""""".*ژh竨xd0F$qkF`pnE#RE-3I:4 㡽,^vXoTw=\w )=47[t<Ǝ.TrERŒdk:?+*DDDDDDDDDD\.uckM cz1u]os""""""" dH#{C摢>A =Jq5ˊ u'hsK'/3`i`V1{rz,s[ dQvw8ց\{ VŘmχZ|:=ru9ކ;"""""""""9K7pKHϢ&O!8=Uy޶ݩije{oh{4@vO}IY? B˵tU"$b{S\p7ӿ#j jz9=5DMXvױmp?b+qVRVIYO M<)XǏ c٬TMZh-t2Z+'+c8x}%4oMl,kƃ[o "KWySCpF9=>5hDDDDDDDDDDDDDDQ7=;ak$s^Z\l8wA9< 痚9Ap@I|}'^79ݕ(i]O_M :s~Zk۲V|̱f[\>ʙPn:sN‚l]x]OFm$w6GtkOo 3HNkAD-.lC;~/rwVFȈ?WeCVb>54VS]xa0kpsT Mx $5='iU<cqK)j q,7A=$(OϚ2%=3\IImSk%imN]/ ڒcOqB'cn'8w興9pvqQ~K FZ͗8ZtFݢ6V}bul3]l͂ĺBA-:*Tۨm{} FʫVl^[ e9ce5p9μxbH'#K$kF |*%鎧} 0eL!=,m5~nv}Q  䒥69uh`{mayavi-4.5.0/artwork/dataset_diagram/structured_points_connected.jpg0000644000076500000240000005060512747716313026561 0ustar prabhustaff00000000000000JFIFHHC  !"$"$ ^< Q !1A"2Qa#3BRq$Cb47HSru 6DETcsvFG?ܺR)JR)JRw˜+-ub I6)Z5W[u+$$gZs4!7ڥڏCCB=]Ӝg^W,`9[^|-' ^@|HjLY-%iAHq JGAJR)JR)JR)JR)JU׮?"5)$[dBj%V\yڶN1!+Q}*!ik?q %I8HcB!:hVM\V?rnȤq|CDϚҔ)JR)JR)J:,tȮ[XX>u:OFuWәs!]k>#1=Gq1n۷CqkCӿ $k$ ۬y۱Z̾?p]cFk~1kɹd)ۭ%yOw: νN)JR{RьE'c`4G+;%(1!!)M0 =x)Q\23&m_[2T+`%%[a 1O$4SJ<썣Ǎ TiC2c5  ɜwQIYPHPnqb+ԝJRx,`%yA?ԯdGT>m")P~vޜ_k;{;lRS8Ғ$+ y.}im:ڊmi)RT WzWAζ4&|in<ﺖ$[AHBJIGR)JR`sL-ߏʲ }%9!y$U-Ǭy_:[ \" e'-G: ˃w_f$zn ;DdT,v"Dh4-6Rp+VuSOJ^W Wzw*0 έ:ޭVյmyq B}WrΘe1|N<\>?!GkW jyL=VJI mCT>YzR[N+9A/65S:{-|#ҕͳ[ r1\w1Nԭ[^g_ 0;"͠[=AzecMH_W˷kD'}@'x*t鯆@SR]i:!#+MoӞ;&#SM%1\BVvWۿ$ lb M˘*;aq&sTO+jS:nMc}LO-t~/O'ݯJԚJRFa نA)d:I[k}H*V7u5CL/IuM*7VHRBAlPnoo֗rYn &DF7U8,6}<9jT?-[ c[.&sL^(>MJRκ~FQIJ2 uZt@.exlcJJ (>! x'vF1dy_ 5<*07͏᪲a3O}aB/7Q:K^?DO<E?L?//G| ;P =8űI+DüȺp-}aJJo-u h(?t2!-1[HW%Ylm ߝ ޢV#qOe$=f{jPLnqvJ RbCiq|I<~6JJRVQ=K/:*LF;C(% y&UYԼ8@fXbսٲYR%[(Γϡ7~؂ zZ2Cu[Rꤔ)JUY}>pmQ̫Nb2jɕZWl@j[)Cezm=4jO+.fQηߡ#o z<9^W# Y={t^vuU}TfXh~0p28xosXil Ros.l0Fx-m[)~mx#5/w:b.>DDžoJ䟧p)JRj8TP%~&Kg:Ri!AE\ʱ|s*%v\]ƺajbG>̄C=QqHCV&w[G-xD78~9>@?63\1.0;Ѥ¹};I#d}AץX4)JUYM] p?, ^t$!<}*JRRqfbmjy[V}6MͯuE<=-)BPS{xFxGGi50`)BMJC2[OU::!)BSvA#*۪=zM9rڻC|-+fP[Sn!+BJ|*޺w) M˓yːI-W!22.y։(u3n$A)JT aKͨɴC9 7)=j*gnVM~-{!^cls>_̂ v4qLqE댰|!i@$$d1S1nqLNqCi~,k]QG XXGOlAKk]~q\!]*_bOrLSdvZup+~C1 .rh;^G6|ƫ4z b]TLjm?NIᵑP6NK$rӷ1QrV51PgKG$M `0ַܨs AnLW8КRέYJ6Q{1‘d:RNeԫ?q 2/jmGxB44k37f͂>#X>Fߚ%7l[bOUͳWI2 T cHr:TN8RTG*jUѮ6k$u7Y.NS!Cĭ{ lkUJ}t#KR[Z\@椔* ஛2Rm0o$ymx;XUsf/]!9d!e$qxqrC19".C<9 5v<c -(:P=Ef."H9G<:KhH%J'&?k3ˬ!͗jǖ M[w7xQ>N#^G@ ^,ܨLMRXO_?( k[Gb+(}/IjkIH>yK[`K*0 W rmI̋C~))UgY0/+ݳV+z[oVmxCxi_l- G\~:c7*S9[8ֶ ˲}M2 _-{d0姛Vmc[~ٳ?rgdx+BB\#_ 'z< ?M'IG= Q|Nqc8xm;p/KD}+7y `_A Į|~c'Ia9ۿZڹuiμZԳ$vX{M6gtA._nmͥ<-J[VOORz}}~|_)JU9e6dYToLm<9m] % :<"~|S6ldʐyVTNʔO$\[5%!qDy/0|I;^;-Fu ;x-خ+N>HF%IA)AZr.po:i6W^/ *ՂcfZ#G2Wsn4` fJRQ?]t h|ή"V)JzWE(PJO>[VՖ[r;uwy!7W 돘*O}on'z"aD*Ҏ;X JAII ֣{.9w"OWRwo`5R[&b% $bC*rC_q>J?5oY7A2xIW G ~7P~DW\ul\׆V#Jp~yqT;p{-W?h}UJR6nYK,-r|i wd>Dl}e)J-ݽsH;:Yqknڮ k(T*şz;rj"VV݂_Ġ}'Jpdȓ)aj*JN\/+/rEu-HZKZGxK<Ӽ& dYnDS*) 葽V^F9}\fe]娮f8{DN1 ѕYt.IC=q'' f)JUY'=~>?n0Y@/:RPl|eM2V1bƈ#Vu5Z#dR28SC]%zW-`(Hg{4ʽ1ԟ.D܊RKh~'qޛXkorsPus|6 pMiJR lT^U6k׻|VR'.]*˭̤)V9 05R6Z&wy#BΔNco~doM# ʈ~fseqW3O:?cH5'frdw\ȑ\u7$ǒ=~n/aΜfE&2_ZTkJ@pAVȩ`3OW]ӑ |) xN5X{n bde|2" A*Fԅ.0 lv!ԏڂe^WRezǖ*46 vua73aco^X!ҰuG *gJUY'=͂?h?V)_v}P- lOV|6LBnܖݲ*{My{ߡ6:tćFM{Y y,?-pFh ֔u.$Hv"eD^)-!攲ANގHN[>>9q$XmS)-_qN~4%,A!]Qya㷻NChfd1> mʶY RV +KMۤqϟl)] c.uտ6Bhl @ je+N*CoE#W pIp[[ . O\b"VKڭ-|mGqQz5u:K3}~O%IFTqBrbgjYk;_C8É C)P#{hg>8Q.7ճvtUPT19 Y&bxR>tȨ/6WfwAib )2/lGxR#hmbٔ½9SknG8"v\XzdPQftxiS'ՓJ\ù߷b.$e!i>AVIWd;$%=2ԑJu К;EhPt$zhegL{&<!Z!{),񽝀>"k O:yغif]%mm (4R{}+gm74ο36zHXH>%S+Nkb FؿN]eʄ2O<R;>+IJm TTuͺ<la$}t{\Z%J ? UJV 4,}[QmamEGpx[kC?*5L7oY*z"Gm\>-^ͼÁhXkJ{$ u"efmuQꁵ^4yX6d LHI*G Ay()z+ R֔!%JQl2CǬӤ2wv2!(qgliIEl)JUYL簇\P}F=O:UYphሙɖIVEn~so^@RVo+ h%%ٶGN;}1 -XRTWٍ^m[IRqA)HI'+G/iBVതRy<[]?[7+X\m {HWopvA#r-ջdiLР#7v_oē(-] ;|[Ƭ86zyCQQMeJUO䴾Jmn V)JZR) HRT4A}*aNsΙ:(YR~>+=g|m}b{]z-E`$W.yWБϚz˱'Lj?PXnYHgTu&|_6|oZݪP['zRH$P]õ"KG Sܖ[IA- VUq{=WsA:qá]㭈7Ҧ@)]? k=Ckq+) /p|%nF5ϒٟmπӌ8?BF7K~ órl)-E}~tvY6 c!aahX85ڥ*GXm?r)?s65j)JUqo[ewffdaO[EQnC/a*hnK{ww̷%ϖ{ά쓭>{[G`P`Q5U)1qPPmD@gJzٵRaW5|Icӭh$µV6mym0)qYp=[*z+qA>G1du ^Y=zֶˆ=RΙ~O]? ~Seq@ sV*蜆#gL𿙩owJOOUP Vh7U9YnD$(r<)'T A,޻cO72!<Ƽ~mn)+BV%C`GֿjF |(mH?ǟZV}:p9=[q!q!A{ʂQYS ln6ed "2R[T8?GDԊ" ,4 ?qigJ:gsaޘ- {b p 57M=sDI!/<A OZ)/ܸ^Si|V(pjӥ)Q2p)|!njDl|K$qk?ayv)bј孋|r{ [J?rMW6;M@mCԥ|_ Sw[ tÜS)g<-RT>wTR>i-XUCL۳{d~V WjԂ "φ)ړ:Ө B|Uj=&p˹j;qNe\p5Ppv1qLbd7,- PGf'ڽ'D)./ӹi?9P1|o|lӊ6bBIe (?Sg, BMښaR$l-P^u% i>!#߼J(BGq$n}6ˮ8>enȭY1^ yԾ߅rFtN+ѻ5% IېskHRNp\&Dzl,ŊJyՄ V.rtިJ\L1:/+Nw+=͏Us_Wy~p'%:ft-RQ'w(EcmϏ}5['JRNh]jwЈHLOYmѭ-!CG~E}ҕ x ֵ{Adr;PW0-AZM Z kdY-@K{Hv|Z"bd=Eq&?! >֗^^Ԥr~E&Tf;>tQu`ҪθLVUgէJR-c˭~LwDžc}EBXȯ8ysf獨yA.0'η\GQ\Ű9N#ܐmт˭ohN~*o3s!(q3|!jiGJt>kpբ6l6Rd8 $<%x vF#|zeu68-DGmR[! % G#b~Ff{ ;d lxn,D;yWt5Mfr -;Kvj#xsҬKm(BJR<+ꔨWOw~\nz%UNuT)P~f+JcZRJf;p-5*QSԚʲ[-kU!ENעyR%ϳb¿v`C>1)v6QS&\y(Q*RIF_fU|w2WReJpqG$u*נcrk$?gjl'ۃyr*۷^1E"%=gIj^<^ja0:Yq!m%I#`<=j8tyQ UiY'Zt*%u ğf)קޥv-H?dy/ͺ_z2G'~ GBY&6oaй'ץ0yʊvڶ5+X:l9D3f5Kɷ2%]JhrO$oU=״nIlFKvi-Se`~XOnty|9NΨܔ v4&⤪{ZHH^{zw۱)҄;N+gzV)JT37kk{0\.='ލWjN9)JBYۃyjOE[($TO+ZzK=O!} h+)m)*T{;8I?@W[ep_; ?NO\*͉*Z+dwmx%[t eq^D^G%rAK_#@cSڎu ۖ,:݌qv+GGDhkUgv-V9!A*$q[ ;nw쑇.oyǐ~ wMpLޤH^ɠ$~6 ұ<ʏҼoGҕ-HaiJmi JF zUd MƣzÊlڤہ;*IhU|s3`GKR;JycDG:Q?ӥb2ڕtȮm[QԤrP/#S%?O ?m|-p\k adD'\dWq\p6N5P^Һaof,+%=ǎ) Vk֙W-e(%@ڔO<f ǽJ5nRx6$yre NMd~zP$RG!I#A"ifEL$IHuJ>a⬛tw(,Ϸf\G̬- IA]RΩO[:t/ڢ $z )JR/Y[K[pS^ݴ4PVI'd%5P6~ar\C77 ;{? PPJI?Q[8zW)UgHԴ+o5_ s:ig;-lx}V5BsȌ^>;V'fļxdb4@!ɮȝq1DvVS@#gRSS:퇧V][s?Mt|W^?J'>ꬢjCqВ(ACD2+<>9g>4|+A2*JE)(;hRh6UkqoT篝6KKӱ^pOp*SfVL q#/̅!C6u 3<7\ }rn2 [@mX(v&AnxO$[Wod%! ))JU_Y]C@>0էJeݛ)9jBDO icС=桖\cʷjّ) %xKRu;¯<ՕJUY?ʥ=.o8YDLgWlKe6KB=8 J ]{\k\l'{~w&Fθ\mn)niŭ)wj$|jn XDh4 $!@JP8\3(H[ ď[L{oH_3S]lKqd}S㓿׮ƲZmKsVD!4c޻VuۦyI=4?ӥ)Jg8${Xrxs!']">q{ݭ: h b!*CjT4\H=)(;P)JR]UlQɖD I>?`)>)Nұ̆eV?o*VXʵ2zRjSлc9 - 'Z)!@AG~ҺHVCm]OrVURo},q1 "z+hIA9H2,%nLW}Rۭ)+IAZo-L` q3uÝ j䄏M U&FzQxb=*SڕG'aC[ޫ[ݸkV鋜AT] ۭ[I콏5{U$Z/Y )EcBVc~@Wj:h.5hr~GBo: HTO&ӹP I1Li s$`PrWxi'?̛?u\4>(*uPN'ĚJR8sz۹A>+JIObue:pzrO)kWR'@fep Ֆٔ?ox,WI%?mr+,V$-y 8"\1xv8}tEdJRgTY!V̂KI>Ryh GU1M73ݟ,p1=DeGiA nn:+(mGmád"]PvN)sJW˨C`IPP>ATߘZd!$9:JwW}v{yФ\,S]<,-$\^#G>H#]F:X(|ޥV̻OwK|w(? t>\E 4$4ڈێh@sl7P"0m~TQl߮ ]Λp}M~^aliى{|8- 8* AV@:a0:Yq!m%I#`<=kUBhN4ĸxxB ?*ӥ)JUu,}Uç6; -3&TkCd9QӼM&_b$!*1 w4P҇oDdz#+TV S.K ?ݒVA'VH ꍎ ef3q4 =!)N<w)JRF:YܽyQDJ?QCU]z b5)*5ѭo;#iKj%V#y{KIP -@K*P+OKq9()nYadzI_RP-j JF'@V^ȼOvJ2y*s _t~k{$z%,uc"ko̫~?,k[$x5| m& ŧqg8G/%n' ʹ\3ih~n3m~z[PPϠcgv+w.]Φb:{BtcFAַFKLn-SK?JtѤ-a[ 3qOcL0BHW;C`IPP>AXht.ݰU"'jr!ĞI-| vjl]Y :Ҷ> RV^?QأKA8l էJRvOb*_ Cj[>j?@ /T WpnoO9)$ }5Ȋ뽯G¬ X{S-%KW-GI +eEC-|>ZjǏVa %# )JRGzXs}vke_~+u(Xv Q!sTQfn`fԍrQ\Q_OrHLӡKJXHDN7 K  :dǧ" W}͢؏zӹDhlH2iے"w9h}H`:;Slynj d(2;[b;a }8ڭ\[X*z#mv?A*j4f\yVmKQ: rIx"}8 wo+.+2>ZEgi?GgH>)JR)Jxŏ0eX2 ͷ- $VRy  ם]bT^fr&mn;Izz7hm!Ivx몹 )^0_r>} [޼Fg\E#^K z%*VXHPPފ0;à&?lj t>*u~v>O)Qb6^q \iߨ?JQn"nŹOfԕ6|!!I py٫/ 6[&'Pag˅Jj|[JRpfS,lYZR)JR)JW?+̯ \b-CS> 5od轭 k㒣lˇZ:;ե)J=x*?*s;iQk:R+ܲֈK䰰)ѕ"Í֬iL܁?Kro{?$oZJ_92e?:e ȑ!}^Xp;A{{ࡽ$9van$e{-|O؍ u=)JR)JR*G W͵ޖs`).;ҠR47sB:{oX.Y㒻Af3o]{u"]㣯<7~ZnRrMg}@VƍLy 6\H[n!AIRH Z)UgÌN޵}uէJR+/hh3kʙ>ysݦm'ԁM}*[Z-{0c&'r-R,}~θR)JR)JR|o4m.6  Be8vhKzzB ݱv\k\>(#2- jLWiܕ5JUY9t/o::Rto׋]><L'ǞXJGOgS#q5jlz| :دޥ&.7 \%'Rn)YJTBv 㡮*{Oy7)iqc*Q㍫_Sw+ŬV!mŬ )utTvrTJ*Q[.)+WK)!CT=A沵V{P㦭:R~Saĭf {[j[J>%+-`x{qWez)FA6 늺0SlmYqLkle<^ZGDYR)JR)JR)JR*vty=vL,w{oD>W< IJ+vMhMާڲ:ǣ:ۉ<@EA=9!\6+R@ȫN ZNZ37qۙB%^$Z}rFz9#'%;f x=c>R=;yY)JR)JR)JR)JRW[\\خ˒nA,I!(X$4s=js1={BR]#C*wi =.CG.6D]t-"pkXBŠ''葡g`l֫eͲoo{Z% ]R)JR)JR)JR)JR%pawmx_RCcwҼu h(T|鯽z" `o# ޑlPOR)JR)JR)JR)JRnSbdL}0jRA JЎ)ް,ʳdTж_liJBRE|=*]_w9q%t8ZmujXNF;x:;VR)JR)JRmayavi-4.5.0/artwork/dataset_diagram/unstructured_points.jpg0000644000076500000240000000777612747716313025115 0ustar prabhustaff00000000000000JFIFHHC  !"$"$ *, 4!1AQ"a #2bqBRS?`VX~ӻUøjoQrRzKOj_(nk2?Y.SU>kU}}5zL1ÉW`2.*Zד_Mʫ Wڏr{L`4QU\>vvvt75.n65+T{J&[mSscL7:y: ̥'&R*+NzSVR(O؝}*1~QkXִ65aZzn*ZO̥KOmSiӌa$?@5<-/op$^'R)=ד`VdmlGXӧM})4sSFi塌Pqܒ\EkuT~y"b2xŅ<#!iNִjӚڔ[L緭sowrуһjs^jϦ]Uxf% ,{iſ_NOmG5M9[_丿]9mJlrUM/Ry48 ̦Nu{wZ-[Jbmv mRag[жJ}kqO_f;LXloqg:73)פ)IIIo[;#ىXqWm_Q4_> sM9m͎W$ge)PZ䓕GoKKz ng^a,rάUXh(ՎӋIE5ǻM JWVTΝi()jQjrғzOdžJsy+zTRs~q⟺ca9;,3[_!qoUpi+Ǖh&3.U gj4A˻JQNQOkz[@u?N-SQW7PO[[휎Weq7)eqe{m7N7 ()=u;Yl5:ĺkpRJudr-uO1W*26T8kmrN/y5:TfaIN7T74d0،bq֨5Kw e5֬+\SZQMKN -8&/IJ5mx ɽ\]2f/?ehy<}GuFjЯFjtKqd4ѐ 7KpYrT9Tb\k{ϊ .wigVX|*jxR{oٕ v{ڎ JT8_K-hoߕJMu? aecoNޔ}NQWI#,+{{jt)\P JM? ~eyyzr9էGQ5"{3p:6VУ?QKo~MOާ_׸ zה6'#mn.*ˊ-7%u98ſSԛ |-kZ]Хqo^VX)B$$4iT/n.=>UEԷ5ck[S~>0?[;kkc̝ uXZ:qJ[I=E?E1uK;jQB(SF1KZF@庿etcg_#ukN:81KLe*Vq._|C鷘Xs%z[*;eʭYԦ/ݷ)(y\goN k߹Qz5NqzR\/Tw)Ey۰ J5m~R[UtaNԧEAv/+Y]CTtn?-QxR%Խ<7bo\%ƽ =m&IoROi6qg)U+V75in4*wwKJ VNl~SpKYhZIwRrK9\w8َ'&NT%>'J^ (~G)9']96Y0Mԗ5W,l\U*4iEu'')ymGN=-tJzqJv>{hi,yarT)թ wvBZRM&槣_8f& qۊtZ:3VܜRm/mayavi-4.5.0/artwork/dataset_diagram/unstructured_points_cell_data.jpg0000644000076500000240000003354412747716313027075 0ustar prabhustaff00000000000000JFIFHHC  !"$"$C*," K !1A"2Q#Baq3Rb $'4C%Drs6ESTc+1!Q"2ABRaq ?ܺR R R R R R R R R R l0\1䳐Ja/L;T`PRA*\۔y}((V}{NkPDn6Iu u=*L帷R~DV{&{Cd|+1f]xG֡ؿxAYA't6:P{1Jt^u>uyǧJDzC )kS)%G$ R R R R R R R R R R R R R R R R %dh. \'-Z+5WR6vj}+ksψ 1K$U($&{ΦfQ"@_"$|xλSN9-bK%QFz3:SnPWGJXʺGYlK""C%u[! ,!G𐭒<('SYjOfi{!Ni #P1h~:cϮL[\9H姒=JOnͼRR@JUDYU] e2*T6HM qh)@)@)@)@)@)@)@)@)@)@)@)@)@)@)@*Kq6%1qw[-Dž%~TpHT N ^Wt'wvd)RAPtVui!Xe6y'<滵Si^c:yR|^TRyfЕ~DQVBaEoۺGS%=CwV3 ZߒX"L Plb+o/܋!ZhNo{_j{F3n"ۈ~ЭN}?+IA#}{n;k88MU*ZjQ%DMRӧw=2+'R}>˘q.RRSǯRezfsϼ1];Rz)JQ%@:_Z)o`1/0w=|*'E;#Ҧ'JޑxԥّXa_,.9xZO~TYm+Y,5v{y,| 5~V;ywu%)JJR R R R R R R R R Rujnumj)LRא RS߈u`FVa$*^>U%tqQgvøw;bw%$)!I 6+{KU:La ֢G!ՏP:i-twJ eTI?̝:X)D(15ۑ&Q*֋O6F(|t?+úKa17Zt!ͫS\vvk=Q.b;'e٦kwZSJnC~֪նg=vQgsM7TG0T;> < KgRRRRRRRRR gSq Ɯ7+Ծ!YOK->.5WKsWc|IQwlM,W|)܌y5.6?46y*[S/;ӿ~ײ'O-8aOf jmηrW$'uE!qN|(kZ- $;5:cˆi$zS$ILXuxO)R\ǝ2KѤ4m^ (Xog07'Dq~_X_zR u-qLhQ} m-Ks8 ^wrq.4Bд$?-T78nšzˤ}3 84689fw똴;.t_ 2B;)$H'gA(*doC/6)崢yJcǤȽn_ri tG>iI! dk?|X!tihDy)?P8G=Fq⠦ ])$( )J)Jbs vەcwT,ǒwWq +I=k-Jb\WO[]'ʉM~/.kiUv9Y6.qL@q]>qσɪea&ɂΗ =5 +e@jfٷTK}鮢6k˴ }%_ޟjW{LKCraLey%(<2vJP)JP)JP)J=ư+Jg_Dz湰l>%odD%%J 6Ic('#,\Vgl4 FI 0WK~ge{N㸚Ţ?R>UL}:'~}4òJNV0nH !@BHGW~ mI7vlԩ2oy, w i RVXBbƧ0`]u[:TB@$YJi7Qkd؜yD `)g{W</~1on0ծ"D&h})_^ɷ6G*NN#u2+gobƠ)P\ǝ2KѤ4m^ (\Ā ${wWI K̸!B\i+iZT6 }GKzJRjRݭnۜFfC<-'ЃUWK{bVKV>⹰U(9?v >j֥N5` ɖYuND,i9 5@>1'@SwN/[7kbh8tke11uJRJR\2­d.c^ v9'Ԩs0_csKuR~5 Q%+TN =5:yF+wԙW+uϦ7\yVjkA.6HGio%2 ^|f )@QԾPzO-,Jab4O t{P>CAZtdFP$6{{!Cܒ?"h=+iE}Ds1% kgWSρS;9!anrݒ3?跹:Oʀ}U%1:qa'V/xR~w›`u3 Ǝh̶ !HJP48~UJN)̆9LﶦmciZ4RGЃ>ܟ+\u5O&ʁ?1G(V -6ZYqV%\Zi$MgRBtUĂBA1"J[&Ĺ[\`܈ZK̺ڂ(lGk^[B-cm _ K_3Nk`+5J 7k?bI=Zl}<%[O+HShsVU|+nlL{}дBWiiJФ-!IPl]_`6U3yR}Ic;>GmtQ\;DFROLGB̟ӰjUEQ^vg2GOy߁ $zoV!re(|[aRqY Ošd|xsi}Bs7qkD[<.H=N#V[zc5==l;~_WVV%)B\TN^IGw4(lBce!$i)JGxy냧`F7|Bg-Chf^pF )$)!I 6+;ZpYOhSu8v)rMSAkQ$6T7% J@ V}tg[Xe% ZoA(oI^( >Owҵ0'1:bLw.HZNҠ} &Z/l%i^ƼM/Kmm[XRWr,4OtAZ!)<#omкӻ|ku=9a4Xm:pe@ۚHG›R&f=J)P,[xuw2X.[,G?)5=JFT)JUKst`On+ q?,f<)#4 JKcn%dWGD;8%^'ԯR%$r<[yRHRTA^ϽM6F mjLԅ?{IOv$ +v Pko(zf,RbEwNj6)oYH*J({V;>، _s1p;l|+-~$$(E`( ܱ9q|w),  (ү)?"_նY]6$E93"V&vXUc&?S1 6peʏ@F4vj}l,; VSJmДIߊɺ:ښu Z T rKV)(ddӭ)C1ObJ |#|UYZ: T'ˣN7Wh{x x^6AVLN^YaxLRyl ? GҳQKf5&6 rwѯ;BoSVdwkF5{ W+˃y>Rx ߕ']Hg!XaHR~T^#IŊnڣڭ1 :{ZiG|y'[iĔ- H)RH gӝǮZe.W }6kt!> Q㑪E6[wTkpFAMջpR$F[l6c`GAd4$UO$RWQﲠ9Ny^U\YA{!Hk?|C{Ԣf"{@p7._.q̤|WnΡ="k\5i#:BKl+΀#K}., u6&M-O/!CE* mZ 6+B]#ZӷW6W&< S_Jg )5ߕ?M!I IGx[TVnsv}j1te%BTvvJ6|=T((j& ΡF7ИˋWP*ud݋ פ>2[MfaS썞%xe`"$>ѯM-*+oUYJWT}+Q\;rCk>b[!Tc?:}=MK%98$p@qk=CΝڬ6{ B/_#;48Wb'U#[d"}dKQKϏ} a ~Ů)QˎiV4@RT?0x5MLt@|DK%1C,)*zZ]NYW}å%*tiocچrUVH)JUW)JPW~" xBl %*y@$ J*9y\pw^ľfm[1VRP,:9WȎ;Yٿ9kd3hJ̠a䤚ڑ13[[P A)tG)oĺG ԛp!Q}vwEC_Ip[+E2Tmc‚{vjRVt}E Zo_ob${@=cx~{Jۯ f~})qTQ<%j%Eo:[%7Yn_[O\-I{ aMM='2++[0e1ع*IJT䍒<δ a,g%W΢n*@u`֛G @%Jֻzy2F L<و[2ibg@qБHB?GN?}c-x>WoH(\zYTғHj{"f"ٖB]X#M||C(ykZ T>5׺[]a.y4ai?#c.o]h67sUi81o=ĖDZ xN4~6ǎyʱܢ aĜĖ$DU)fiJU|ZR-!IPlQNV3ZϺMT~x6>Sv{eAzlvT`ŷ c.8vNϪT}9CBj RPNdVclp] dN}L(c}TBG%}6˞5{Q_YPWiXGiU-Kb< l6eORI}GQ~bs-z+p2+$|MtVsg:#(}DDv⸿kn6pn";-inЕҼنj).1l{a>ҊX q͎BTdUgm-nL3}Myq).)2I;T>4'umu(5#(@DiԸ}nB+*>Nye ,hP؅ ;1m-2(ChHR\^lOmpnQs.:]G|USuwے\=\g) 2^\tbf:P,}78)P?gkГG>zeID,`tڐX_懐 H6uǏ.:Japim}<㬺)jy_!k+b}.$~Ls lI;KT5f0.Y2~ːG1)y}v=jNy՟4iUsZ(3Ԝ#ս},>y^4s [*`dS„wҥ'Og5L,)JPdĎ<xW.FH1koi_RC%trTTe OI$ 9[ƾn7BTUt*e;(vTY W \gGOƿ>Av<-u[>h'izz >ǎ+ tw88m=Rʠ>LwGw֯U-Q8i0y@GJ[̮W&ʻb̏- ~^tRÂwOųⷙtne+:H궋DǾ+RژLpW_1qNZ +:]z gk.閎KtH2uɊ,zJ#t9 ՍrlsJ{*#!☤6yu T8*Ai)˟NQ gW'-L-ZjZiREKzM_~|5Ai: O4{P}r?P|@V5((+1`MM"yM+[q:bt*yUn17ȭViޞNJu*w > 1-ur|mz_TYJwNdؕlԁF5,ޜF n$\#(#hNoD~f_y *os^نWs_B{GcN9-d2>!b oAk~ Rk0|wSWĐ$#־[(R{7|q |wG~%[uR{)It/:V*7lQ#3[iGn ˝01LmO:c…=&YiTA|YsSي]YKN%w3m}jjU]38v{FIf][ N@>;`1#AkWĭ?+w33;RRRRRRRRRRRRT{11 9c(ƭwqؕɎ8zJܞ~Tȥ?,!JNۀoܺv{*ȑ\ObYH-~Goÿ2蓭UJ%3dRif\2^/vjc*Wӹ Q%!#PPGcT"X;z"3#rS_`L\Ⱥ|ňLWp5nJ}k["8T?(B:U~ͷL[ڴS`p\H')')'Z'DBz; Ņl84 V,lkj'E'ϑT*H֜rnXӔ5 9U3+Yb/V`i#/Ud{Vٓ ED'_ZJFiܔ(Em x.`}L{yCllA*~R+?J!?"r vL* -ZRPizF[`̹#ۭ^2KiA[GIJR9$zZmW^|;Ų7Z̶;Nj]l,8bŏmAl!K6%#dAiTN=IeIBy[pWOVEZmayavi-4.5.0/artwork/dataset_diagram/unstructured_points_connected.jpg0000644000076500000240000003050012747716313027114 0ustar prabhustaff00000000000000JFIFHHC  !"$"$ *, I !1A"2Qa#BRbq$3Cr 'Ss5DEc%8Tv?ܺR)JR)JRlԞCo ĞJ2I&'R<{sz"O\6RAu+Q6x<{+{EeoƳ[웞3={p\݃’N;֏JR)JR)JR)JR)JR\{W=h7T{l~: J_Y.?Xlۻ=9$GuJQi'DIIR)JR)JR)JR)JR!;Nܛ{  p($sgg\7J)qfz,Ζ͔-'AU(oRhp3GR8#!;AZI;e4im$%HH)JR)JR)JR)JRb̂ӊs+Ķ/HuCzHrI:I 5Ga.-ѕq`3lkk'`oM7pq:-XATP߮ǧ5919f:rdIvۧ8ԻW+pɯ Wi-- A7RΗ}kЌ ]F SXnDgSnvG"rCHqᅿ_W&:Nd4ގJR)JR)JR)JW>&qHQZSuA(m RO&zoQsz{{m1x$Q環w@49wJUY/뙷So Da=R㺭:RAIr 3mCn 1xg`pr+߃CO:6%Ē~n)JR)JR)JRP}R+;{w!}'$|MB'9]')B$%) >)Ug0̼uiҔFsXnRvEQn#ܨt9=zt #ֹ+Jέ'JJ 節=Ld$hvH?%V})JWj|K#"L)W%CGȯ7B{W[(HRv _h|+F&JR)JR)JR|X]2xwΜ+:K8?*Ae^TwK[lO%[HZ@3_Kq2-,ɉ)VZJU5+U^xo҂*) 0:#PC\R?UOJR0Cn&3nCjxK@mcZy'ЫY.dɍ:^m?I)KjT)JR)JRuK$g%K}4ua(BGIQޫdZHInF])&4u^>yFϝTO]:cKck/1!w [yG)[ϒYa!) ֶwVLxQƶOjO؂;ZZ;,Hec[i,8'EGh'vrPo ͇& }"3I1(;YP$Ak7լ&cdI#^[Y#JdZE II ήJR* y-{ѸCH^g'z*NӰ87ՂoޭRS&";Ip|W)JR)JRLV50W'^w?Y͘wj:GJ~Eê>= Cš+׾p~R{ߚ++^GfYfi%O:ph|NN5xCdFfDy\iCa@ 붕S{V8g[@,|DRׁQ>EK)]rfTgcIi0 n6+I PEc:sz.5%X궩;^W'^|Gɬ,!LWZR%CAyšlR)JRDk7*)j%^2=쩎m|ET79wT$n|]cX\l^$3\O] H! Vbe=a@ӔN㮁_YecH?=JkŌ٠V[seb4@>OQI?rk#JT+\]F4d_eŶ&޳P@8Zvt&R΄؏!K Jj%f cx!{ʥ#(^+^=GQe=wܢZBd\@ 46xI$H/vK50{@y tGt6ةnt%Kh 5a6^v{]aʊ_N);Djmy5exeW2زd'ݢ5͖yz4)JunMb&ڤ5Zq;Jǡr+i` =Kiuܔ)YRG:Vk{l%:#渔v΄krYv>G[Y`[87TɁ9H|-R~)JRˆJJ@lT] یgݦ0/6 [Um;\(=n!ó\n_2izX$|-68 5,cKͿ;]_ Aʞyz Ԑ*.sfgy E~C*;0om0>5RR!r<.,m*I PEW}3rs,H$,GIq.5 {TPW o0|Jىf2R[t< TtN|7aΊ̨'^l- BZ*Й[r2 T|o^xL$&ʆ*< ʬy}hV[y$[q(}ҔPyc^{Խ!'E ܑWxoZaJ?tu\4n+FnYA'|嶤<͞@ť)JR]Bq.Y,IDh͎ 69Z:j_Օ20՟mZ5>Rnq:+]=6eڔ$xWcg7qJq쩴kIfRGrZu<~+]O5OӲa53?h蚞RG }e0BzVd69 )PBIlVR_9ۚ&KSxJG )JR׬NKt|UޯT濻F#dr+`¼/'n/Kn3@!RyR7XX=KzsƏ=~o5ìqz5*NTv}J'^+q3+)qV&I!r[k(o W!<vuObG3q 4i)@+M>Ì<\iĔ-  I b:qvstꔫhek;.ZQ #V)JRqWfrϐ[ d+{ iP*:P ~%t7*wFm@R9yyq#v-7+}6yǜRP.a+RhNJWb!*Lb2ҵ%y>jƥh@krg-nP7d*m([z􏧗 Z!Sf'·lmV< WZf2!\m#A)#(곘V+7'%cW+UgƉ'SԐ #ֹD:CLkT?WWFOTCdž7`D7d*\TH}gkY?ǁԨY,0!uɌq}_s!WK?=ݶ=?KJR_SڙkM<4\cO*m'ErwλxgCb]me($])JRFe[q0ğU~͠Ǖr6#k)ƹQ;ޫUB_Ú"˖ܘ(ZA'S?(嶑rDl.0(XUqgQ0COLFGoDߪRR_mӭ֒Ca@AkA:=ruYħ-!MWvU~q`GaDǛh#ߩI <~O>jѬVMXrh-qDB I'4jzic\]r5s k'O$(:vHg Cx̀Mτ#^,˼fې)rY}*BFACUE{9̤uj-XlH Spx= Rwv=aIa-GOtxP']Jxvިy~\s]>Vz4)JW JV$)$h6Bzc)gTwNo7 QV)JR?+G1,FNO:=y ϨN:~۱1IOZOL%48q$;~1)xemd$—jGw4Fߨ]h0_h;FEo\d v1?=$-{~*ֈsz}uܑ^?9䓡އԬ$l"HRBAl\ҵԷ3 ;&\mS٥ߏZҕ€P AZ3uc,w5GLUB #}k;FãMYha9o@1Ehhx7,Zꢢ7BywX7K{!v19v>Ҋ&^\O;wu0+[6LFh|(@$$ɯ})JRC:lmřxK`o sHW= fw<5>(8e)JR=]YfE_ic7ҏ#[J1-MDm}V~ZozJژMƂc!J$R+ ^<Z&qũkY*RvI>I5nm])'F{J}QJz vMm*">ԆiƯ9؃+^=Twt'ҠXE]s~#ƇfnVsD]p)]ʱIѮ7:bT0}'ʾf pNzZr]')2a4U%ր!hy]u)[ȉXbffl?>#% N-aa2-qCW)JW |X8Ex霥v`a*+n4?OR~Exc) &T$}$ tqޢd7Al>~6UJR]{Qγ7؛:oZ΂^@:l;_=BqM%+I)P>W J H$o׳8z_oC1L=Zz JڊT_89M2YԠhXJT:S^dKR e:-G:W ! @OQgg-Q+lr=zHp/JרF<dn;kUmB[BGs,BG*Qͪw.,_6DX,9oahd S뺜ҿ쭗C, HRTA*q革\KVWo_,P WP2;Y$߬y>Ot*CMZn9 l*+umJzHJRoTb͉ߙ[+O1 kO~FU`¾Y!^maT67<= {JUYyi=G8~' }Nrí>a:R%@ "t+>AE&['tR!>UళXIΔIWVrK\[6DñHv+[a%OHsϪO8)P\'\eW?cCcgDW9e(v;`[a4(H'd$k!JRR6Cc]IQc ֚ 'g|_¼p=zm2>XṶbK$ H+H$Q{em(5^Blj=CT!<VAS ?jʷs7?=cE#7R:R)J$:+iЯջc˗_%Jڽ5^W?pFЯ1ƾdD؂m#궕<8Ud;YmMzqA)Qۧ$wypOrRl< K wÞ^lllr `BynZrsK"2q^TT0%WY=O\6X߾q-ϝG@ߥY4*uylDq×c[WGfˈcli0Sj ^?Sq3m8 +?gSPA>j;ٟju(w$JE+YXUVU7#p~&az ZJP JF@sJTG&^oxB/2rե|7؃x۝>,>/deaqW{ҞW.<+qGO R)T(PW*̴]Y#Ml:N-ӯ$_4iWCEEvJuIqM0mۥv~''}T!`}}Ww"&G!LǹCS}(J^d dC]1s ?W|jF:Ju1cS<5"ئκaqSےZ[#xN]Kj5WZW;tkyne{ˇI5/'u־n <+~aG_Vq}ߑ[Y{*Q`?XnJ(yymHz*o,$;U2 W%1E1.d5!*h AWj^!tuymlo(a%&hHleBW|MԂOy|ǿ/<ŤCi>nvd*l}5Eu*ʘEB۷ZCdn\-`BHz Pn %ř2ϓl}s]^q[AC@9A}T8Mlu)Q6m_>A5:I Ҕ)Jo4m.6  }T5r\ 耒8FǓzc0bk<)Km-PC-!\K+*!C^Hm[u= vDYaӤ= Zw*wøYژ]lUE\'0=zp[(p4@NV^!לWs#ɋ o!¤qZyR9]EؒAm$)JWLe7*3/r7'#n9gzk_T"oKq, omOܤk;}+r@rV4(V9g .޲~%ƹIPWR ξb^6>dR$b)JRB>Ns+Oڍ8OGaC0N !۳ JŅe˓N5u)͢*%i467ݯ" wo%9 - U7EG3\VAkGuZ:TR4-gMC' >)\.N{YGk5:)JR)JR)JN-{W,JyÔM#W)#P67Qz<ۖ;HO<̿Kn6}~Ғ-AԜ-R[$Q)V̍?Ҕ)J=~(w6-_MUi4ɣY ?lGL|(jON:9NP3ID;n# &+O'JiJR)JR)JR*!tǧTrJsyI 2TdUu3RVħmpAVMaɉe}4FC J?@i~zo%_zE`b>s[?$AA)J=>+>b.. Gr8Xu1ÎYi-GzlH0 '7=mŰڽVDfU}VxlR)JR)JR)JRabyC(mv{A+Z] ;EOt7p&;쟯؞fɲI1v}T˼)km&mWbwB T;ERukWi1Dz:ܗ[XR>R귴f[py돐yR=lF* Ҏ8$Eە H[nӽ=!iOU6Cdm6Q)P߂Bծ58t)JR)JR)JR)JR٭rT%Udt<҈JT5*wۆ[Gc]y[:"8ۻBˍRO#Vs)Kd\oqTO-{P>[{JR)JR)JR)JR)Jxշ2îصݰW8 (Vܕi@_*:>eX[c]e!j H<8I#GT~]{ FzT%YiKqj: HO}9[C])0e6ɻ8V#P H*+#V)JR)JR)JR)JR)^+ݞ|{Y̎WJ6-m6;^0z>t*QJR)JRmayavi-4.5.0/artwork/dataset_diagram/unstructured_points_scalar_data.jpg0000644000076500000240000003402412747716313027415 0ustar prabhustaff00000000000000JFIFHHC  !"$"$C*," G!1"AQ2aBq#3Rb$C 4DSs&6ErT*!1A"2QaRBq ?ܺR R R R R R R R R R O5ķHe.ʝWȶJNXdi) vnU|Jr8&◒)m7Ke}Ar|u[2zVVJZJ$v:޶#+'gvG6ɹ%/LQu؏ 4VRHH ; P}b\p^qlJS=h((((((((((((((((7u2zptC[6r*tu+`;pw"'KUz} # `QR*do2mpal:^裾NJƘd<`4RuUYH2(OJ¢~*mnT%?ZÕxv}.uܸ3S2_eCDt?1WUh dNp+e={[@@hdh(t%:WQSEKSؐYj-vk\9IUATRIވo9Vi2m5o #յ:]ܐi׊R)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)^[h;qOoKM#d̥ wfجt⡇TO87t frF G e9#iV׊EE,N]|'H/mU m1jh"4F9Wq^Qډ$]Q'y]Д BF4҆ie(jJUS+Qr=M,+JҝB<*WK2*lז`LOJ*;KJjBaTwX,W"cu" \ HO5HމNd: r.Vf^qշ#_S*=H67} Ơ 2DTspg H;3J'm;+((((((((((>ui^w?ڥ:j (%>U;6zs׺#q9grk<W-OhXW8ɯ]BTt#ܪ'J|Z^P6kaKQ5Nñm0>Auw )=s9D^R2aZ^dVf#ѾJIz[-ÜG/7h]zeGU\1O'f)]YReag nm#zԀf)kИTU*& k,lWoi @5a~Ktd/W,p FGD,u٬V%FFOl:1$NP[y#kRӃȱwTwSmN+&q=sEۮTKm2t=R}RA h)JP)JP)JP)JP)JP)JP)JP)JP)J¸Ĭ <$]G;-!ُCɿ*=tߵ_:\Xݙ:K1c2^y!#R@>桩@8,cĖ岘 ;LkV9lo x1dZРYovD%H'_tZ3>Kw&Z1,9RVATC˾Vo e8ݞۿL[~0[QLs%pGE"2?X$ywW %su1㺠oPWzt#@޹F^KKcjSb"Бŏk ƆV~-ggrqK<\ii; Jb apm1 B9 zB:>zf^abjw.J\?BCyJOҤ6yH%]kC/6 D9lh?pzь c9O4HVݴ46tɫc2o[uѤddT[<Bΐ}݊mĂ:*ҁj)ncRl=DAd2/D$;:fb#ruJ`;0wf0nQ_O}nrjjF&fӹ p&h <~y [WeCDqiBJltUIrߍJrَ˸O%V{']zMm}{1NtY. bˈ#n%%[u^/@46zlFӈ[ޗ!~,"kǻ$7vH>kϱ1L266OTlS)QCbdGy ֜AV Am=]viWTݭ.HlM!<0ahX 5ϗpE]^ ȷ9[W[iGcC\Fb%c]fE3>IR6ZN}`L21\u)&-ǗnSc8{ a@o)yDzSs15 l'@_: U3UVs RD&ę3 lȽ%HIC P=~Z*?E0<֡ʽ Ώ{+K*DD,SIԥ(#  7e5I@q =FN*h+Rkqf[yC0ҹ<CG젤@"nSkl1>ê/:5dse 胭hobJ8ב'ݞ+7 =!ɵw]jUu_%iqZm-H$ eUk+-iHGbSp ⼊5)~?KSD(a:-%>uhXmlL'#!}k(wN RfU+}f^.oPS︮BFUo2[L\Rߖc[锍x vNZ[nxk4&Sr n~rH'םW*R??ח(-w )KM s:[mԢHkX.UŋkGʼK} tt;'~t_%(=rnU~T4UH1cGYmHKm@j5C]uKȏDjm6CDO~&›\yASmZ#}Il+6G'gCJ5ʻΛ'i5WL q:ȋ!˭( uyRTU*)l)A]U3,YVJTځ)qo]R .ޱ\9e~3(n<3Jzu(Aw{)Q J ԓD&2kv)N\a~HQD2OQCڵσdcߏ%LJrpו vI'[ڦ K|L3N7:+ *dN?"jX#4jF㍻ oֿHDۡ.G%]GNuǨ;|8 @ci(BF 8vq=z%1%)Cח^=AtvRG "'9U"Kw-sCJ``u?<6Xy ޵XHoǐve%|w oN˙Cmƭ*LADsVZaVȶt+gm%I\cRZ0L]TE"<Ԩ-2=Wi4aJ`'ӔZ7k5T(P%9XD5c'~y_[}ZϠ w8 ^EssmR㧺Ȅaw4ͭT)OLU}gkqGOO`R7(d J!!)HhT&jj&*6nY{L+tr Fzּyn\K1n /AB{hw;q7N}WK'QG/xlNa'7p-75O^m SjMV]C\MT' %%v,P kNҴo&7 u,/s)WZǗ\u[TcUն@y@sU q8/LqқM Mçӡtq;:Qǝ E]eJkϏ_vZR┥)JPJRp;FX.wC;m$gyCp.뛍3$awmV('$t" eV/]9d(U)D i=tgo:׆@q ~06 {k]2ͬv6{,+U3 f:(HY59hx`.ܯe[U4NgQaˬȻ&gRJ(wJt@=G_XUgX˸uB\m}M_>rpkK%<>-;BEwn_׿@g)J\Ym\IJq!IP=^;tzde4#6s!o{ R( /<-EQb]s_A /0W(;ԯQv'dRjkE*Ppy^[\= $Ÿ l}`t`Y&VClyN';+evq$y~:QG8׉`_2{z߻5E0N%6Y%iK:LFJ Xu*PP lVp-EKQ$k#Qio<z-\V ZDVmqW.FHȗst`mRd Zxi/։WuNi.uYvVL]q9sA]WB(j#;+-^7l3o))*iV:DWr5"sXqV@Rz n8t^.f؄}L6d76_BvH@#gDdlr]#Y-۬_;qOWgIֺ [W[M{'qa p,bihy, :ѥ`47^|`mݿx %h񠺯dIF} oIƺ&E2+ejCƝ@Rجlj["t&øDnd LKyyб:FSAl-ˎyaN|H玿!]k[gq.aZ諮TM]JkiBk\MjT̨kj w kl \#yI=RwW'w((A֏}K38v~i}ظ, ͥr$s=twSꪽg "˛%aLJ/HORI>=gPf#riR֢RIWᏁkQC[ )Z~t%PU <$nqO\T̋B( iҦ:iJRP'[f\BŚ~YR}oZVx,_zDge"AR(>ʽ(DZJ63ݥ8YcZԦVB@ H#ZS:B YOe6#Qp%UPR$>bGVjUeBg.OmcȗWP(Nr7dNneg-ն%+p$hhvBA]x#%1r'J6#@I21(c~O:;P?c@Z k`\Mr5Ċ%T5S\MI8 q5ʨjPKueOI nPCҎڱ\UA056意)yU)T4v]\Oqi>'jˠp˪%^.ܶZ$oڤ6]mN!6$5-x@:#[2KW5Q(rp)beGpO.NO@T۰D޿ߤk}8pQWchVkeY /pM$˛[{Ο'@+z۷i1z5@hj4K Z i@= DbyMDx\yJ;ۄHV ́Cll/89 ")YߠS{;>^MyfUntMWu}[#CҽfUq)ZmqXy^BnJ:!G ovbM]$&<L-Wd#gj:}?9u7q!)ts}umK׭Hخ6Ι~pN9i 1 JU)D~{5S\MkTZ&\p5W25ܹq2# %A7*aCWe/8TLt47=P|NK8~7eıؖ CO+m$*Q=TvJRI&.Ǐ}ڭ;<[=0`Dh5;)Ci++AJRJRtp.OPXYJpR}z_2y\QZֵ)J'd{}k62%?e ۰qJTZPRA yᄈ.0fP#a-^H#Ѫ=^%3Eq\M A#Kd~O(БK'YFzk7XZjFgvYǵ"ւ;wWޤh,ˤFD?GPn*,y Pzq~!Cj)猌q OTN1lo_~kF&POb~|Oӟ+o$C\MGFT~csRCRQ~q寯w<ߗ0FZT5,oH)Tgz}Oںzr;i]zT5?)|O *j3<`i*/ QҺl "GԧtRr~uq5ǎe6Gѯ@\  #7~RS=U߇x `g `|{I"htē׾ԞWx013 }/Rɕ#{7IүhJjG_/CYVfdj%Ǘ/kUnx1k6^Oz`trV4vGgRA"y.?d-ʷ_q.1O_ ¹O=~F~k">asB=AϢAZ ʋ6$ڣ#̋5pIԒ|FvI$4q6 fGCvndvQHkg jo+G,JbugdtomNtllzw3ff-l[m v<9 +oqaCG@m|ٮZn`I$H^H<^w1-Qw[c_}nd ckT) HJ߁l5bS9y%wmɨy^w{I^>lV*%\֪&T5e׻#Ӎ˕dZ# } r+6$- G;6ǡO6H?`w!p `v]p:tsț!_[ί(@Q˓hY.q;FDǬ)1T㇙Qq_j;$R)@)@)A.PI;"}zX3qNe?+o?6=Ys!b|}QVxnK*(sUq7pғͷ{ {Y)\_ mսaBVzI2O؀jشOg;/*H 2b0U`a@V2BJ_ls*C\Q2gpvKv? Y`Sռ?TJN/h”V{7r5JJ>k#U֯i=cfE~7i?50ӭ8_ߔ4LgCm}pC ?zq \Bo*WW`9nkP;h)=APFHz巯)W$>?\ ]ls\T]ThhoC`ٝ[,حsS/k> %CcMh5IU<}?F %x[gW7>^%r}a ZUkCdjl5~:Lq&)o #"]N1u|f8;aL+Eu)Lt ?>SY? Fp&On=ХGd h$dǴy1c|;_Bl$9>psn'i1h$vJG@?eԥel)JP)JP)JP)JP)JP)JP)JP)JP)JPQ@)%*4A1w 2F|Z4 ڑpÐ|2-DtnٖF}5 ļ8EH|A5=ҧ--a|J3.DcEd wÐ=j9 8u%m$,C^ oX;qp׈̛^@n1 :q?mU*.{/#8`2:$Yzq#M]q.0' Ǹr* b G#%J[[%د_0)@B#`ZTeSUZWےMD -_fw'ioG/Yc NWlTAN7`'~ϓ][~APl/OnEHqHeQ<@X(k^{ȱGr -{fCRᕗ\0{#˷}2% 8)mu%#D6VQ>$+X˷`1赲'q׈sOAVO܇vxT;XoOegN stR{bUS;_i^ZS1LYbvQt[NgZ4vfcIFQrO&!'~?΁;oRm3;Ȉ+(((((((((((((((3JBY[! ۚla*ׯ-dT Iֹ&0$x!uڈ}:ڭ(dGL,2;\jb7d+RX]o$yT=y\k!~6x͕|6(Ife\n=֙7ɡ2.ϡE\5zԥJP)JP)JP)JP)JP)JPmayavi-4.5.0/artwork/dataset_diagram/unstructured_points_scalar_data_labels.jpg0000644000076500000240000004641212747716313030743 0ustar prabhustaff00000000000000JFIFHHC  !"$"$C9W" S !1A"2Qa#qBRb$3 4Cr%5ESTc&VWdst.!1"AQ2aB#Rq ?ܺR R R R R R R R R R R ԏϕ79{&)ZBgFl~&Y,˞CTz'z[ZG9ύkDG*_Q4>B&"!b=&"CY,~nQGlς^GrFE%s."2/y;IQ yZؽ ?n Pw*ǿenԎܧJ>h62_d,gL*rx!+BHBV׃#zd|~5*;hNt'%V E%QdZp ~ )ocy!2Chkj'u?:mNDа`a /b4}'w20+#ՙP1޻o )@)@)@)@)@)@)@)@)@)@)@)@)@)@)@)@)@; l-SY$|IDw;d=:\Y eP>JA`\)uTW&%dʎʜCJ#oI>INɳo^sE}p)?LUߜ?`fҸt!ȍ{ $Pq%kRV;+:'x;+0mWȝT^n4z.H^\ĥ(d[lvIOU7P)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP+U-0L]t-#[:XV\jn Rt)@)@)@)@)@)@)@)@)@)@)@)@)@)@)@)@)@/3d 4qA)B@Q'wvT+Y<-q4fY5 %CZĽy#$QZ+qRχ!Ni֒qX$$VwRet 6aa@mHJP4 ?i(FE$vFG{G¥z8ܘҳ ja} "?K4+eN$hZAJF Un~lZ{ӮJqD3hj 7To:v3;CE@~&!\o1giCY8<ɚ5BT!="Z_jRE)JҔc2oܿWf-v֖J: JR |΀'@ j%RQ dS(K-vߧ{#ck(;q+VXR܆ٶYqCk):?=\9{Od^ gzsQa\!Kj:ۥ}u䙟,]ڟ\oQE│\q%ލ/]Aj:w~'6\JbEzL2gch뭡7Ea#"s7%kZfb~VHn[($yQOG~ [Rt䦕-GYZOR*V )PRIwT-ߘqۖ뭵* RοhH[<ȰnQ HΦ] --HYRt{vدoB!CȃA~W}[ۤ65hԞ"R= gKx56{y)iVՠ C@s~WɷN3v''Kq1ڛ:KZ:#j==s6[] q-p[J@(m;X7#Zx7.A d\y!|"NzL{rn!HBJTOe9F5e1c62:\S]^}$oC v`nm2ЄOJ>P{hvTXO٧$իph_hQol?ϽNXbp)c>ʹ!#'dl@+V=ɜmư#ڤJVҔ;b;|+u #-\X?(Z|xvwtk[ޜB);P޶_<7[I?k[|{\ܺv-FGwJl ]/w0'doll#@|:żZqe #LvWL1~P-}ȯ %Ip$VJu!šI1}Vy?nHȱLQHOTKPJcjc6h̥bB@yh)]Y?I(F7sEFkl_pKkZq AFL+(Gd]zp}eE\dkחH>7yCyB@DXN!ũ)+ny+>%2%ۧ5R;i0$zfxmLG'-9M1S/#mi?\RRRRRRRRRRRRgܯzsip_K.K+`w~c4)&b#rrܖÉYdX{?3ϯ@*\3[Lq0g;-J+#zd=VBU衯n9Rg^y&挛!GLopzXkcC[*f XD1wL[l1&KMvsvS͘3zhgp̦`\jź59"4ʝt{:@=:%&ku*R~B/1G纩wiy ; $vHbk_ФǺo2xZlyXɦd6Ըw#m;m'e=.IHؚ940rmp^.iUcKBB~0Od;Էllr岇㺏֐} \:zXok/@RDMaÏe$ I\ZrX=bvdi^=JV--Gs|o*&9hILWQ(OjmrmmB.)Y,ʀo*r)>mZ:P֎JVKg1[vM`Vۃ!~d褨AnIr|~d\-S(z%{%E[F񕔷v)W,)VlǬWmăά$ Ԝƌuy/nd6y_R|jTĕnnvhBWy#j~R^[ʜx2l;wFo o+O8ņmr5^#d`\%V-ޤ'D>zJRJRJRJRJRVgƬw{u* >7dXg"r gQjA܇ta dqm,KL UԮlm5e&U&V]o̭CciP= x&SӜZi?,*Z]<>PI=44*@5sT9m\dduTZIѕCRY|$Tg*>j|Jc% gw>5HZE`>cu_$x޺֊'דc̽z- WDvh{(/B҂%&@=+Huxs!N%>.[}0>!oq{kzd{Y 1='g^C}]9Wg+ dw[kzP@6{Gq0 2fE2[KP׿vȎ#Z=?:tGMHuf̱[aeU!56)Pq[JXZ4(w:$y*;wDtGpHT/yw3M~eW0HIw\j&REs -/VVVҙ}Ҵ(h^ZMF:a<+}T$IŸ/oI׳RJZڌQ?//uEgWe PpؠR{oZ{lV/Bx6_c]KHH;Gkv1HXxϔ&!OH:B?-R^7bAemv:*dNuBoDmVxʮJl[$ggOV;ƷY$q l1H{l$z(Ac,[tY9F>XĻIy 4B-_@F<z<*q%A ![AY}!敤(j$/c_Үh[X1{lGϭy'T6K.SeP\q hI2o{6Ju8?Y: o뒹[!dL-дa[^;na DZe P)JP)JP)Z⷟gspƒG%#ΎWU򛯊Jʜw"z).6TAQNUtіYi+[JAP5%lD9 kJ{JIH5e˸7α5UEi$^ѵyhv0[e1-l?Ԥ{UXZz[Ńak0,ǴW[!~q-_sY PvޡL8f%2?k@";/(鶐r(>T/Oo>^S:f쏢gI74iӓ1Xܮ|_O[^o77f>{i@Yq4&M_F;T5Ě\I&~~ק-z]7[+]SQbGA[%#X*#ܹ%aق]AlߺT3i>jN}cL#g^&\Ad-[zle^"#EQ$,{AuxՌYld'RT{I5Uטj釹qe=jD~߲t=R5R;wXoO /FqkN]ϗj+<ĩAUE%R#DZn8% ,⋳\pU2OhΑ#`w'ҸXY"+(m>9\SEH>i ;`eBlfzx ?OG9*kvn"K?PL<1{/ʽ\,r.ʺj:mBtktdٮO7Xrm "%k[>=WuzS^E N X3qȤ5"huwMlcT'ZZIW\]-~en8{O!*9X:]U"Vt^|ֽ>mIB֮|¸If\=GJʷnhWLk{Д?֪عYO:m,}/Hm-ƥSFe[qLb~Cvt%YBGtW1ifA91A:vAj le,ÆZi|8r rv2+c$z'[=DI]C6[G q&RvPen9irtxT!=N<БJ'y3,8 t sݔz%#̨gV_ݼ0yԤ5w^hl5zs]Zl7\4cBaauZRZXy;-Ϣ|R{g4y ڨ@ AA_8vo} )8G:N%D(!YGnݞߜZFA@:/֤@ @u]llE*ߎ^ d6[ P6=~yJUE5QKjR+m.8q}=.am} Oc^Uٲ.H9=ܳ-ҹJ?!'l]{Sb,mc[B{Cci W3:ޜphi[JdvX;PZvHBaE`xw!6S,/IV٘++#O4GMff,gdu 0 8 l}Bar`'[ ] G |J=UN06¥Mu>/P)JA f<^[+.,A\,b;qB)]'nލJb&t3_x>6"u R(BzR~p9q8aEgC°|bq95KvQƮT(6nd[_Qr[wҀf e ssΈou.6I$K[Va^1|̸j|@t70ç[/ʆ~jZ @@?R)?OPOlLKϹl Y5e3vx6ё)q́ ^5݇c1\f ؒ#Ch (ԵkJ$~nYߌj$VrE#ݝ "z\i(4f4J[Sz( aXSS':bۡ#%gM?s&'ϢufW_n$vޥZv";lv+v)G^gs\ׯTVuE{8rϙ[;`ţ.jC1" Z#ʈԟT0A_Xҩ\[|㲈KWn*)ARH ɸ78!lĩ]JQd! Q ]HzA\IӷHԐd_X =!@ƥ XU14ѓ*k#լo hzT0/ ~'䬀b-= ;j,Hךt b\q[#SWzP@aS+Ļ3gۅMz-  ԫQxmbfckW`ϲSiߙD,_p|OT׎IuIĨFOJmą%i>`؊.|)c9˷ݮXGԽqCW;;Jj y_,r\ci~ ,׋<DVϒ̖ +`A=58;\,+UOUA/!I!t w5]fiۦA.7H#1WSmw~]ϐ"j*)ay3e!$IJGrP;] [m ͂Xt{'  [Du=2[<쒞q[--J: ̓+rr--J-̻$;-CͨE9| :b];0WK_`*D2Im'IJG`b0X, U#q!4I>dܓܚqi( q5' i8]NJί|[ ;kwk}+'%A=JʏjE`h;e㍅d0@~9KBFcxyUԦZZ*-t:PvbxvR5MRqMU-j JFԢtQg1&d=Jm>A @ ιx5dc$2ËJ;ҷpO~uɔ ^=(Bu;wK¾UY>Yy< o*#SZʼJ>ٿƖ; 4Ag5guKB[N Z|iW0"*a*+JvwTa-\eo2m i˶)qh򒞡5dc$2ËJ;ҕuJFS#J B+ⱿаJG~eS]2t]=M Hڪ~4cy.핝RzOBOxA_7DXyZ_P$z; 0<:4ڜqiB &?[cGmklQJmD$GBk%)kXI×,LA65|Nh =Fq,:)ri)${W_^7#8.[f0N|)[QoLUm(·Ey}gZG* zr׍p>PBemydX,Vn0Xq?$kNw+DtWBج?βRC,2-ZJ'WiLOI65+g`8á`_N΄e^_hr{=oyfF`Tn#\KM՝daóLW08!=KCKӍlh_k ̸ɥo]uu8bB؎*{/ag. [G뵍Ui0RJf^ħSh䍘 eV~l*@(=ef-ɬI Su8aJTuRpMq5p`K##.pv{WwǓ-iXP1.q>?G.V;Dz:ꤼ$&q.1POe ҠR~׃qp~U^UfMCJ(!+%NDxrS:m *Rs X8wX2y"U~tK<$2m:H=V ZJbʏfOSOI(6~{#FjUj긚ZP\tyܑ!2I+qŨ%(H$=kEa ؝3.<6߼5uY$vU*PubB6JV'_H,ˬq'8IJ:{#iO6~s;xbֻ i>u:Z?Y-:u*1 O8 -İȷH[NPA$qe7 "d$). Z€{h z]XH0-S(nJ"O*N}k0((((qsɘ3 R%v.Z@~HNmJkM9ӞK>G̋L)VkқPC%.6plҽ؝JI{G)x&-0v*s_Q{Ž9aus mw.0W}4"/fed2˅[ +`zvn#9trx|k?Ǣ2|]r-V6zOIQBAʷ =e'"jq +|wef  $CcFJֽ Orǣ #o6Ё D* wcN@øfTջ$\{Vْq '$>fϏ݋|xRv!C^Ze61 D'.iWQ먫kc]T^.&T5D͐oZܢ(Ih8~~G*><_wƉw)Gsj *$,RI=R:IOkicE3 KZ#6N֤{F {dv,.qu.3}@wI2^(K[[^Fn6Gݓ}Ozsߣ>5_vݞs sC:R^qNSò'=h'A]ٓJ|Ҿ?dSJzwٱ U*.ĚxG7+]xrPkR{n a|bqIMҠ +ud뺒zS )a^ʭ/UX,ߙaԭĸKIP%y)kRTId{u]bh.C!%J?^#co\˜c#zCm ԢYZ!`w[7[ɶh|[a%z!)̫vYOi|Ȳ'eGq6 +i$u5W_;Tc9=H*WqBO#ycKv7ژK`YBG'dRM\ Xx# lhp1%ԁ䥠([-Үq0/[BJҬˮqk)FGRD ^ٱkR!m$}TkL*\yUIumBKV#z'~B x߱뽋)vsS܇)-{u@'cO}e5޺KU(TH j< e*3 [<{OL#:ݦ `{)]&%v+dXlVX緶@+8'mm6dFaŠZaPБe֪c.33Qi #A)@)J̼)@)@)@)@)Ax8W ,Xyb䏙ۋ_OЩ-N菛%J*Q$O}6񍆽%<8˓p\6lMSN#"cy f#˜kU{1RVuOR;먯@R|> v=)V {G-v[978מ^'cp!@mpo9k&/1vNA]?]1h@;0&:S18xFɘNAz- ,(0PvNvJ\yNOI[[#ʐ__JV쑳\/26SY q<}띹RP!j ۠Voq8o-d6=un/CkH $4R}kMm=E^vLݭs3urOs H7HC*^*Q!T%-זƽ6mS%!lH<=ɑ[7iJ呱c7wJV9qĔ*'H >}-5)q#psf䛵tE JmO59z#a[G/р *?CE'y"U~ecVvF,-MjIPݖd$7 ԑ"7.oS2zVQc6)a^%/.Dl}KJU^0g&kd Ļ8[t w#Y|<$Mx䢑BӳR+Eǹ1uh\J~m ]a>'=tG}ـ}5V5-{t⎥ ZaN2TA h=WFvxܬ6,cVwcmbEJCAgIJPVҳm-¬P1NaGC!EmБH?SaJiJRJRJRJRJRJRP_)xY [8ecwGԧ~ڠqglOrjt`81sn :ZDRFЄ˸Q +`R@J(f/9{v`78{zQq(űR (!x9ZLZI:.xFgIud|*oFmulZSVKyQr K6,+_(u^|猰 +iĭW'V!l>c(VXƼYYm78O6қpIձ 픍J^ɹr5k&br=GUwK*u^gx)PD՞gOwM[{a|CP#`ZM^R4THT <@.6Vض1=!3<Л^׸)tq7P+`5vƑu" 9!ԍ[?_PԏJ'+ >b(}5h<9Nwx$9O&4o;}\ ӽȚ7Af%IakiP-$)*D|?u5~mX1aZI{߷ wl+jrz̉v d{M=jBIވ?2۔Vm HzAIPw1uoJ'󔳖X5\ZT22!lGޒw8`Xtbz)%N:Zյ(gb^?~ّ|RCcm'̡ ̕ W>\Ggp~r\2rc#fDPY >̫_Geq+  U\o)tYhY-<' C/$\O[6ҥ:Wujj)/:|"t|:UW/5qů<\|q2Gtbr C RJ.8q.=Ĭۣ(:Jy_G=5Y=*^#e&mW PA%Ci=q:҂2idBlB'j=#س%٥wRڕ(U-]pgg&ّ\#J#֯_~ˉ>S bTgS̸PE_kE ^Pn12:liP"9p꺜UrçԂHHV<=$,U*3zF㜓 =֕6-S:?׽t3+da5܄=#-eEdSxlw5.z}9(yu$UJj;$- ay9keH=()>=vu\w1.X %e*W)H֝R5mu,qQ+lۦ;>E˅ KVP| εy'WWwH\EihbC%}ڊvyTė$\-ܒWqOSpzA$R#^RS 6B;%]73phX]dztǵ(I@N]JUkZ](Y[}}x1越(*$ J /L_n δ+yIBtށQ:A?[ײqLy h.)?*xe_FQ4-֯QJP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP+dXbdvdu=.4б "iAd^x3':nv;!PV?5d{ P=RP?ek?*T+o0\)8$Qo3Y3*gv6dI[2`liR4>TA ֬n.+l;k^:)aaujm=~/hoKYAkɳX% RZH:}UcH\WkP&;$Bqj!2>4^8IX]]FuD,DlzVw+J5 u\6Z_#Kˆ-4 e$CdzCs2sȳMT]#}GBOak3*5q뭪TZˏ] !'ҷO؃x3!mn:uֳBF3S":iL8 ZU;4 e/y NZUz#Ph_i |Fر($,.oӉķNJIBR=kOx0QZqDo@l|;)RRRRRRRRRRRRRRRRRU+[r|f.1B3Icxzd;!, DtRM}j#WWEAqճ1= Zν;'Il곚RJRJRJRJRJRJRJRJRmayavi-4.5.0/artwork/dataset_diagram/unstructured_points_vector_data.jpg0000644000076500000240000004335012747716313027454 0ustar prabhustaff00000000000000JFIFHHC  !"$"$CW" K!1AQa"q2BR#3b$Cr%4S56DcTt@!1AQaq"2R#34Br$bC ?Z" """ """ """ """ """ ""ۮ/K7b`)(dʥ{/}[]=|b7q49{ۧ%ϦF}^t}4b98[3}wΪekծn8#C=q䵑^\N+و5tl8DDD@DDD@DDD@DDD@DDD@DDD@DDG[& {ih)Q.9yaH/=6u{z6IRH5C-N 3B׫꩹ *^S{<[v:vjkM{9,-9]{q'9yHn]cwqc?O\V7݇pɘnFnfϢo4so_${""" """ """ """ {ź*(%UD!:0yq~3K'Zj1\[܏c'gp96q*Dn2.s/|NP$Eum =u]=,_i+e)(Pw\Gє,})xis?5Sh=\6 <^,aCߪ7]˂6/<{h!ͣeOtp{H?)dkdMc?u <as흥 r8JXYci7ŞEW_a'".@dy ү֣gNGYϱ[!ГDE(""WZvSe█n=N@Apkxxi:5t}1ܗe|ɫSxh!7.BOEwMM*4]vfWG;ţ9=wTD:Vz#[Nj1Z>V׬W˥wSG6@rjz >>̟]JUmk{3d19|r&{IoqVULnr:Gw''̕X:4 t|#9m./ڭr~ViJ0pfOI SBFp،}qPv}7ECIGdt`wVuwe\2 _qs6Sc:6]C>=V&ʄo!GMX%:9X{@P|B=d{TTAys M]CqҽdN[vtda~HSc0рenW^m݉gep{62=<_%kP\~F:Iv+{Rxc[ ƻIZj媨1.ll#8,9dU5ԖzfSEoxpG]>->EnEkDwu,qA^-@q A{~|v;jrՓ7 2Q,qaQ=RSܹ}9Eָeǀ|9zyWSN)OsLx>^"E""@" """ _`j,~!I?>˚`s.i[EN3ǨqsN*U^q^%Ƹ9 }Y" "! I\NtϤkpYL!aK坛Wf~;)D-kqYO$-T(\ۓɈh*K{/W5 +&;Zwi:V8EUQVՆиʯkoڑ{EڗKĸ"ש@=|4;?7>5pj*6`ˇZjYRܦyU5{XpyFX4wԱ9kĕuџ~cǀ澷Cj Ue%7j8p'dc>+q_KYK^I?*~f߯I߭CpZta{i1<֗{$Qꙸtc2}WteV5`o1lUf$)g{72e:؎8%^|iE}] 2S^S=Fi>(i*IFo+$" 낡Kf}BCFIdp#U;WmU l&i>Ds:R:rN9!~^;[^&IFGEe.}ED\NI$֏[~)7sROcZ ctq7k2?+~1?n̪qsMiiU? uS>G:6?]fT>k>FEoWSF\ 0$HWR^5V_F:Jo1|DEt~mІw\1 C~G!S7%[Ʊ7N >nGqNn097qҚ^_uA|5k󃃝 mUv1' H1*sfSU>2@Bbo -+۹u&i!4Lhk90n7;um4I(46? $v`sVcؕTnJYkxs7~*kAvmYQml|sFs(zn6VۓU=6+|H[wfʥmhǫ,{B8nzi) ǎVE7X.{=!J?mMU\pǹ#䬶?b=٭4`I;Z{Yu0R@elQdWknu,GIm,>akoiw$fӷO܊^Z& R?v粀:he];B# <'T]_3 {êOIfcy=MTOyamM_a!Y27Lv5+qFNi'#%{U^UY]LOns6>-jt7?gW]ǡ.*۝#J=VWoQ}ܽ{{KDSs (Wt#VꉢL2IT˵zQ)hG p8I=}aRI1k^QVjyK /H2" .[ğ:8{T%VVSO~6iVku\Uln6!;PmmKZUK`{ >{2C 8k@;#qFOy*;K;'K//ߢCձ7i1޸~`}{"L`\K̕t[HhAv/ng9ɄDY""" """ <10+!%]?X;=v$^+vzSt֧ URw27]vuEUL[KpH#8=Ksk{'Vu+SkRZZX<ϭ֝9q8uH Ia9|}ĴbZZ#W;bsn:gݺjKt.,a+ߎyMŔ%kD[tPZl'Iԣq{F\|VC}p?cdGZ8|w.Ԯ.=K,hy9ť xf`k7{?̧*&M<68-.> ]UsQW[4ZvzUf34xGVݪgp: u>!tA<},ns$2y1l覩T%Ӗ4 2?E¢h䨝F ՗Y-L*3yhEZKF\;iXKsTN8icw8w3RH+,nF1<<ƓX`h9MTtwyL\Fy춭TR x6!jөj)$Դ!KÝۜp9sڭ 7@&R_/mjRr鬩.LN֌\+kN[Zeo3|GDKURw$}z =FLC ~ɥ[2zϧE~Ogh#c8dzy-d0鋬)=+\a{i.75S#ZutUTNdy~ ,!v,'cUBO>k$ȱ(4fjZ=f;D@ Jj5&r\49`V`>q੪;=/Z ROzKuu ->\l'lco8ܼlkI\nJo; xrk?4Gg?V;OmB6ʜXMmyBx#\ukNDDD@DDD@;c.ҷjT|j㺔- ek#vG,J;oG|ՊoZm6Zzr4v=w<oI&lgW pB0z/OtÏs!%^+Ks5QX5 u$)T>ae}:8 )lg̨KEeq2M!$w;a6""G =CAf;nY浖}L4v782i3R@.1πDS+Nw >J_`vCNet5$} ]5Z/j?α8> ںRzZLW8 | ̯q]Z|1hjۯrZG^;Bv `yUo6RZ:ߌ>ɍ^?M *wqkH遒?5LU 0Oi4A} % q˞W-!w҉襐"DĞX;gledֹk,5׶FU 4E'5.gApGr[ &npr 5422~C[GI!(s\8DG:jm7}1|KOChi %7""K},tQiCvڊCIx֖lxyG}K{Ֆ(4xW j)8\c n3+w'[c$7g8LixQb)4iЯS&L4}m? F+,dD[DDD@DDD@Tִxպm \ | dX?7 zMӨjWe3G7|f9bv)D淂wZۭ-08a@mwWd#i꧌ON̵y̑#EEtz.pWQ+OMzmwgWu/1)b5u7: V8H63Ԭdi< ֪{rcG_o-æ8y<얞vf]U4UakxrH`efX;HCݧDpZ##Vk*- kĎvZǑ{ڽ ti: +9vyd32 dnZ%h>Y gݜczxy#dSݎnKYѸ[9|QY(.2=$pk p䪺­gsDiݱgߗ*iz("@ѝd#ߒ_ֱc֌5`ྠGNg1$7֗8'/Ka{:Ao_[av^K< a8blQ01(YjmU@@/s88*z1NTN/(:Bj:"pe.bNmF[5l7n֚zNҰޭwP|0VF;#+}aCt;xxʺh/Z$w 5ff<8ٛiz]:?[3XZ[}A8uLkͧ>NͬiqSwW;D7 rNY.!K1i |mYx#9쪴m ݸI1%iZaMj2iYOވhⲌ$2z]9ﵹ|ENo}È{V;펂fg~X o"w*M׌]sػ* >M*R∇a I-s{I !YhU=>Jj$N=_}}z7C )tTCH֙g؉ϙhuuENѻ|XS4ͩNc?35ʖ_I}PG?&-DDҭ[ilќ O,Ct-e3ndpC?5~燌 }pw[GCڣQ:U5r,\y?qox,KC&xd,qi1꫚UP\aj}?`\QkSd)"ɧQ4sM4{KǨ)UhOia}L,r7Wѻ]i¿e^~`BJx9"¢&콥oi.G<;meW躎<ʖ l.h ]eugiO3tsp*&IZG )Yo<8 "hl; X裙R-s9Gsᒹh9Ec>DbcO;*=hj*[Q)ݱ>.qlv܆owF2vUkE$jw{Q=<6Re2风0BƆ4j}6W<ݧ`KpqBaaĵpH :ZzEGJpd3WsqDad '9+1DDD@k֪/SP[LKą v}PvCEStEҚGc RA_E5K╥-?V=.9aC\k4Шtxvwu| h㣍,s^ƽ-p>JFQ1.cØT |CG{OCJTW5q xϠ\E+]V>++>[͕SlD_Kp" 6~wv"{:.wYd{ӸiӇl,"Y M c@sDDA%$ԏ3[YăЩ@EUSFe"zgWD7pG^il ^⨺:v[s&31}:wgEll0#{Cg3GOej fNN7.r.Iq6r A(AD@DDbݭwZW١6r>#TTp|QmR}vXcj8Y赬ZӎW;w#==-S7?㿴QM%9jz*B6iJާ^|9déBtW}٣Ԝ#kc=c ִdpS_LTgzoPeɔ\qC sb&'G iy[2q[&2(mcz*O0ϻ[uhA!muh <sy}d.n_OTڏ*A6tC}Vt1 m&1 UCMRxn4Q)ý_H" %*IK!FK58 !q(挲V5< .}9}ǗT(Mں,jzqA+dGq@v"uou-Hp)@wGU$z0MӨ^tZZ iռ0WD3C5^ѕrU1R;7ĶH*S_ۙq|MmY[8dgu"zzZ'nSwvUZq@"+uU5;>~KF7#֖kFԌTOoFj"<#$ |O,pDew ̬-I%ewN/m{^.IE=J֝iɴ麚g) @z-ȪUXlK}ED;+xZZכ5; nS_*=j8k"i^_X>#y+.vQM{=Ĭo$n2=8-n6Ia8'v/4#I^Y&J=ka…eŖU=8FMyo]j?#xsiִ*tj/e\zܠ,Z*U3 8в)_}ubcLK2eD@DDu $Ua=1)¤\f&z[DKSvGMe`TpW ԰F~z;_~}?qNQ-艢5&awLSUAP?e 'U6ᢪ @7&y4堨)-꼌QMy_Es.5)j v*Dm#.F-v0zymDNz/l1OONz3dJcfz}R)mƙ՝)jt_-Óy1j[N޷Z[ mA Yq=֏3qJ9$g}y+\ؚ??>j"TSSDIq_ tzECړ3ɣ[-jr<,ˉ i5ť9Q""" M;Lr~8 Z #s9ՓOrԜPKՒ]D3h#|@v" t`rOY K t 򑇉OuV w{CySqechg25iGR >5(5TYXZ!w H]iW&ݬVcB8eox×e+@Nu9ږ7f=ǰ+} ӥQQO`Rh"./Wp$ƒQ#ZcsWbȣD=V {|-)__PM8[ѿY" llsִd[]ED*ʺzvFYsP yiS[/5<N' 3X75(UJ\nP:V\jD-ޞ'VLIu(v$ōʽrMz4-!?5m*I/ |wY#IddlEhUMdR?N&uu wMW(R}*o-zwdFN7}JUNW.L[S,Ėm+ND ^LG=qX;L!Ng"Lvc<j.$w6(.|ѹ;J qPVG{PYJzld`[Mi=.+u8t4wR;]78LvscjjQF1{˽5oݓLܮN} &A6޷P@*oBؚI'rI9y]H "8r{~U:aDDD@DDtRV@*h-{r9c]ȼT2ᡛu['&>~XQYc쳲i) yo5C5mҵ >Y]| ]N+S[oeL "N.#ƌ3Sc@9T2g8H+go zKIw#ׄ܀ɴcȂWQRїڮ 5tOTE:GP8˜\?9xAU5.h0\#V+fw fXUVCp!yRsmm jb0i#́u>o{K]CM` [4N8l'sR^0q0hnM{4,æ]Rو+Ӑ:f*,ԺԃWX2˹y| B<\͚[]L%x$@3i.:y9DxwW;/Y{hS?6?5^2N;\~@t)jזH9^uFD𽻂t D%a?Z+}# iY#\pL'XW0ޖMos+]rVՊ%`= gیge_+1Tk5Ґֺ]gAkzdҵEi/V[Yqd/P: *z܃6._P";1l>iGeKl5mBN4|KڌwF}NJAg^=]Uzpx`"&=I Mn!'NwʚӺ"WP%tSMI Yg> 7u8Uڇz 'ޟkVM@%y޳}%OQOZ3?((hYCEMJsl15Yvޏ7y*5Ufyn*ZV mtʰPvka}\յska 殨V-[{}{y\՗26a ]Ak6!qԯTicox3⥑mn,(W!$KqRRh%Uٸh)hpf"2A;"0\ ǧm[X7U'qdwvdZ-FZNK:}ڷ3ǁ{Mik֖2+uDO;Iyr*:y$q c GL*pQME['FVZ̴F3ϬG<փZ^Vft⹯pf AC 0`3q7gRhgtT1473Y׍9Bw>y2gD@DDD@DDD@[o_77MIϞXSI&U3;LUbJ8O\E]%-[8*ir"˛L j'w5s5Pb}aԶZY:f,hs\Pr" "" UPCrI;k#Xp~ʉD><%|[Xkk Ijo; t)AXf˩cSFي@+K] +)j)y(dW\4:2[LݪeyE=7Ҷ(?%ȣGe|M27Vp@]CaĜ ӄϯX+4gѴy'!²~$nz~kKc-MuIIFk')mg:i $mFq ^U |Zثij7ywQ*5KCH=# ;cf@O&ceI.qqFEmƲ}@ 9 s6{VHl$c9/̶:{P}+/UE3QJL/Ăo~*QhsH-# ZW6wCqs}ƾi㋬Rn6>j;zL^o\R}RuQvke O&Hq|^JQu+kJԢ]M>S;^S7Iイc/@ \ֳB\uedR(}RIqێ|UWeR4mc۟qM7sSM;Ovo]j} 67;,;0y\Pm7[-`:ZsIkiPAy r"'KV6؝ t绐qI 21/쮩[⟻42",DDD@DDD@DDD@p(gF9Sq})C`|9)@V%^u%5k ټ,G]M=#^̷|{Z< RG+x{^JJNqSqaXY.T;x],Yg8x f'q@v"6ONI(=mMr݅DU"3_!72zEFx\1MAVjX(ON7ORORPQCLzvnI9.=I=I]" øZW[j8"<Ϙ>j4[ 4c\]_TV+{hkA!8Z}cK{kR \i6糉LjDӖ1,VQ_0[Z7Oʇ ]l|}Tɓp F8g2+sNMٵ31tg<䑓MG4da8+2Kiwf;=',a:vjuUVAg5Ts;W  c&"w30V=L:{m.]:7QN]qM'˫<hZ תuF-ь5MQ Qww;v{VֆNlxȯFGb Q])[37w'OB: f_'(5"쒦?b* nwN{+tMiE b- #>ŶmM$5 ;n3`SiFr*O+ew^|`v"D@DDD@DDD@DDD@DDGWY-ZV5 EiڻPj}+`duuE[X ; v4]Y.,FˢScaw-dIqq.Wu>t#IJH{mI-L @^{c%N`~t[,/=#.ɪw6 {x0>gz =ώVյPEo%qG}ĭ}U56w` f-jk;ucÖxxz*4j(R""" """ ,qص c,Dݙgv<+5-jR[>cDDD@DDD@DDD@DDWum?AN"nkI>x_ }:Օ&Y&F^##" NZrR6>Ljn9Q=B)pq7Yx]h}=%FҤr`?tXēcajAڣIyҸ4{~K\N/q$LGdI㛚w9-s+}R10p9slev ;wg+>_P`aD@DDD@DDD@DDD@DDD@DDD@DDWֺ.l5 ǟ_Ebڕ:epif-oo%2vV;'ci]g6&]DQ[]RnyiKs65 $6{mg_iQ8a-ֶ<""" """ ?mayavi-4.5.0/artwork/mayavi-banner.jpg0000644000076500000240000031300212747716313020350 0ustar prabhustaff00000000000000JFIFyyExifMM*C   %# , #&')*)-0-(0%()(C   ((((((((((((((((((((((((((((((((((((((((((((((((((()" f  !1AQa"2qR#34BSbrt67TUVcs$5C%8EDdu&'Fe? !1AQaq"23R4BrT#Cs$Scb ?J" """ """ """ "" t\.T7ѹsr22-;gf~tpdȹn͑i}O\33K?B#lU4UC+x摐}⡫hɄD@DDD@{m5J4x/d|ԛv@[?4'Ǯ]䵽d:H"-o Цڸv4ە=Dj8ڹ,=X .uN/feRH""" """ """ """ """ """ """ """ """ """ "|e 얫5#=1Pj$Vik2_;]dS+m:Wawt9I! aXI+ubE8oHkiLl*i6C40C:S{E*iyP`*.[JIID@DDD@DDD@ޗt;W,Zz:^_ܱi,ݩUx}7i w~]b;gp,۪w 7>ZcuhsG1.8#6=1cr_ư |ik=,5Lг}DEB" ""==uYU!펦O.69pk2\N[/6\3  Zoym8 S R2^T*nC"!D@^m鷥Jei,Th2:j vF N^Y3rHH)!t#RGbԙ^N<2gwf\M\$]d˵k&4K tu5sudo80"k@=šz^q;,S뽮gk#::wŐֹѹÉvu[w0pJCum=0hF$aޓI:A~5Ԑ՘pβh3.cNK^Z17(l׸FwmSG6(ji\9y]9!Ό4P݀11]Y:PMWEn\M+?0;eā*;ɹUQC )㡴s.{mc c#ǵP5n3GîQE;^Dݝ4e`ijq}Z*jiክ,YbxqivxQlXp M#=AKr&?@pgܣO[ZYIsoWRe$˷򋋳.M="(""" """ &Ogo"" zEğhK~I!Z̲B""""" """ """ """ """ """ """ """ OjJ1 99# v[zJ Ժi#u7|Ϸek/"/);W^id[̍pu\Sjt=|OgaP՟ eBǪ~n{AD@dȸ*1u]S{|3!ôe}::R<= #mnXe=,W[GQ5p<)0 wFI;n&Y#RW 8r-=[&TYI#\;Zn.`YI94]_ίt׻ԎX52 X'ǞHς} :;1RKncI5q$n @f|3jS)廋gѝ-4rq.KT?7(b|c]\ZGaii]I'+B6kh-YSkQӘb{D20%c-CmB͞k ߫]mzQ8[K4tjOGP Kǻk#S[U鸊jWAw{Zr6M\;K\S5@"6x w]gᢉ$F2-_Ww4-kxa2awRyAy;X~ jwv,#OC/u#&6= 6859DZ' qˣk=U%Ӄu}@lz k-uQUS8$dΛqderr"(""" "" y"˥t-yihZ"I2>q\} >ɯDE""}_-Dqf0sߕ }7F|QK\}AI_;mL;z*GT GQU%dM3&zo`Ãyu7l(.PNDll[\'w1_amm|KAKYjۣC=kq sk|e+ Z$mLl1c;6_8: (KEM[3\jLv;ʷ[xK 5c''7ldx/P|?sRUAo_?SϤh笒viPf[,QUE)E+ڇ1x{Oq)5{og\%mc a ;9v(6w\+351Sk]j%ۤi4nw#Gh H<7`m/UG7JWO:a;8`9;/*fkJ&T_ ݡaCƐ璳Ք[l5 2 9!w[.fFuY8.|%ABjiapwv'y;Vo8~D]o!U@]C[憜?p †UԵ4LVRdl1uu7a+j58C4-^͚9v;{ dUD==²k)w%ѕPd<TSw#-h vK{e=e3J5{5idw[RL""" ""%ÿ\u^KW!+DED@^ I u,+uD_z!D@M55ǑxCv.Vw/jH&GFa4{s^__K1c'"/0D@Uua.T{?qwlO](B" 9.5c5m&Fhۖϴ2OX|Q!TO~-:*y|N⌀H% k=/X'&T_L]3 Ljx6^A/;v.l WN]5q2ڎǨ-m×)YHѓܶ&;;WWO*E= j>W@hY4i'9IEfǜ5lTDtG=kHٗx}~p 1j6תߩDIZ˼`>)=h GǮy'|}GCiI#-T.k{=eEğzxG %n.6QF""ZV*+iiQSO#!4u}yԿGXʽvUtqvI׆HRF8VpFY^x-qD^?GduqZ)-wRApa$xVdzfϼ@A8sA+f]IQ3#aF'h ̫7>n21 ]~`T*p*gXS"C""?pN)|'Jhm<isp=-%=@~ }#59f];vm޹EMöL3LpWAhݙ3Ʌ kԡ(i3B}<˙۽w9uu5UIySM h6VWT|-h4۹ g#!oi-٢E7jjJjms=OD0;Iv3&WJASSKwܧmcҚպxt.cx=[t+f\MdmFC. 73e/RcXs42Ѩ(ux. !el-*V=OW#Fzwǖxqw=ۋᦦ~VYMuGi8-ӥaKh/t3-5v zJqu K$ .E\Kdws| :٨ʨ Zp ?8!-Vy|)~h$GG2Hn|r=lC8lʀ/THæ17;bsAGSIq In9c$O%eYIEiKuΦS IdSFkqՕIAMWEu{ +6*fquUKb\un\`vဓ>-U`ΠATnT3sܬJ*&KneUÇ+& dkk@Gent1qYGS]9]El;UTr[>LT\LJKKdq6v~hn;#b:H;P8Yk4{6!Vl*blXps2p޲7y8-@%lgrqPSɢ]7\z!V,nN(`n㙎p1n7\2#%tL?*3Pq 4טCQEPƒHÒ-ֽwX鼚}#.hoT$H.fwIMe[kT0J٩hsӱ JX 9L=XKK\OqAu8ed2X4ޱդh$DDD@:UZ>:-Y>3r?_ϻėf7xAۼV<+#+Tв [%˜$շhG=EI8fV+IO;22_\ߡ%Ng#Fc9۴o U*OSxDYɄEb9lpDnck\,41w GmZyvbJ])ns'8C_ F4/gRy{uUM ]d0SR={E]zK\||U7h2>W1XC"&)=Qj a?>?ab; "/=PJd J@v-È.lt {W7*Ҧ|Ӽў|T'ؚU"K#J>G9%$QhD[p Ӊ'f)m έ:G`s աF9;#5^tkÖ }I.i Ϸ,lmloƶVrũv[OvyI.W(m4KԑsӀyv E5MzPPslxn55HO 89kUZ᭠D湧=ҒΝ]/fgo"_ fYNñPV>-Ue TM-DG4{IUEp8G*h%D gPV7d.NzeվNë3NA`8#nG uöH 6{leI,`r^-^?F.ЋLp{(AqE56:1 97eZAqy4V/5#<,⮵9:GU=TU4psÂҨ) Hgnj9lAT/cI#>gnLk[3adD4mfI'+ FTbmvN9r}sڿc+IgU4 '>ToΰqyO]WNu3AL'eE\qJ0ӷrktO}ȾOTz[82"/<u$e 5RKڀoc!-?=xzMakp7D_zAt 1w[ZH?-Gj}ąOAaDEh(>Ԇkܼ@kN3ܟri'bWgQ~xlެϏV~^:uQ%#8z?T$zmgDDsJlvcRW([ͧ*gڋȈ$r߳wn.~8Irmjjy{\K3A#vEz8wjW{#Ʀ*+yjն~'3h6s_݁V[T^8)sb1[lMmh|. ˼i9sHyZ; ;w .!_-x[ll 2OY#+n{/[P)GW8q kpA8gᚊN94 s@#vOHvKKMQqu;Ex0] :b|@#Kjl|n;Sbtaݍa]L]+q(n812ӂFFoó:~ak"sCDwrBGpE YJm{7V긫(GBܶP$s OR9Y bzk1p MЯr62ä'ďz+ͩNYY;DP:DDD@rKg>W_m~>D^Aގ@wYÀ ӀAܮ I,!7u3 u"/^{#Ǵ9-# 掓,Mm\4:) 8CvvpLt/'[wu1TѪ"^3GkF ̯ayz?i/ A+Q{~F3 ʼgp??^^U?ۅr{OUua.ڸAAŲ00Q7w]|_X4O @DDpnn3y\ۅ Ep?.fz""3&Y?^^I(l_O{3tu NHH{og> -ZWPՖZ28UG ψi)'8`K# ^IoqM7'0xg|z.:z8Y ֱ|b8vF^ցrO`kḖ:X[}OV%N=\zZȮL0~cw6\ { yӥ$0*%No#>70[F AzD\IG .hh>?:/xzV%ѧp\ۧ}EW>ƒZ j'Hs6kKNfޭ~DEǒ!-?=yzZp$i!q?lIבxq5ɯiz"-{9_^Í3vJVG_ִ;׉, "/./>w˼ O}Ƽ9Wލ_Xtf9jY tR7$jkߑW|bm;1m˅-T`qv1-ÓQm\䨎͑WsNT#V(:YR$#ǟp E+fe"sAi dxoVV]Y akcVCu<Ùk`ֱ]I';*\t׺%6#t: ٓQN㨇w 4-u>~򈧬~$|fO!z`:'km;l#=cg@N}E;N_a'*Kcu)܏G[_N\ˍ3Vի̕as-Skh*)ORꮣ2 ;wǟK Y#R1 Č/̂_LCBJkd})NrVeh1ρQݨ+]Q^>z8kݻYOVCن ,}6sӦS3p2 #pryd]shm?\ J2tURLFwbǴgǵzO3m' eʜ;'gDZpZ%GAR"lu4nNsI_xr΂ZedFGனMVib,_ ( QIiv^[M;3@DEDD=? ڙ\tlJH~'w"/LF[7󕝮zJĔ# #-#dn -瘖yOb<eA@;`Ac\[= xHjsO##_syMϼ$B _ cEw9}SO4}$t%lLjqo*]؍}kanfWr#]aʫSNv- Ew'ZK߹+-sΜfOʊ`M s1n,1Po|nzmoB?]=22z/7}.zv$Eb*MF|mJǪyidi&G,/{r$ePtmŏc\-$ D!e(#9$=Rۥx{W֢Tt^-*:w=a}Iw̦A{ y-ӣ~:+!m#9^~?a燜)4&Z"/=" @m0#{i}VE xjѪB3Af\a3[Q5 h;d{z/r_hʰ}ln T^EYa٣ӆv)5EJ6}**oUq=ޢS$2M#Ú^HWe{WpD^^3,]NJо5MYDY " t×u6iN${].XJ$Ui]Jj0EojpS/U{ҽ<0VWQq$FX9HhDDWGF=ѿp_M UJx>YH4!F~9^?N4hE;6tƗ#vpDrQLֹ[uzXik4Z<=ii /S ] ~3k\Al w -5vOQs}gp#-k bWמX3"" O}Ƹ2DWx6>vorn;4^N7;"/=#7wT5(%\!6w姘ܕ_wk^tn?6]'_ۅg5֧qeXX""" )6K㑡x-p=^Flwk38]+ n9dvWטzRj?vmS:B׃<-ए.gڪkE%.ut#L0۝a*((.3`fpQqeՔu6V]i[ #x##ksI#MQopdS9${t4 cCrhί_*LDsYՀmS\QG[t,,pF9g KC}Xg y~uk=C%qf9v}˩؋vM__.;=D)Mtqo])uVCLմ1\[(";"͕.\u+a7̪UV9[FF2F2Tư Hps\sH }klhmEsĭ/цKG5UÌlH؍5tpujD_@|9\J ͺQ};$D$᷊XP `il^tL_#K@H;nN9Y*EtS9&9ߟ0HP7rՒC`R1਴tj*ʩheefGmH9#fy /(m@>YLupwؑ⢙;-{;)6c;8 8WZHiɪqs2x>*en,Pо{m#+$p-,=@XԕQS{$f5ݠKqZJ$mq?Ē,UK"]@v`D"x|okr^<5NQGRK9Csغ⿯p}nky9ʆ7 xNӝVvDD^QxDDD@q.Kt+PBqa^ jHw|&alVȴވ]Y:B1yr_b^iئax Wh8ÓHs=ii /`;ܮUQWh}+)*q##~73};2~ '39ZQ8.Ac&x]X +H|jPt=if`= ٟC_32T|W@.&7sq 7JmښڗOq=gXVSMQ#~[F iᩈSsDH%48A bl}z5-47R Ҧz=DHzU /\e`8.e33ݰ^y}=4<20ӎ?)F;%Qwճtq\G#m.k$ì6{K]PRLؼْN=ŲR.&]]Ni]T|Sm%DqG(h;yf`NJpvhՙE? 26ͬnt۟pf!.".8'l诖;=(-o Z6ޒ3eg?IܚIlDE;uKG8QAǸ3sY\ͅ G ߌ~5 Ζ=fڈ)0" EܢuF#S<㻗_*37\z_wҭrj%'ڸ\ȫ]G\E2֊8L $4,#ä۽¦rZ",eS83D03: }+ hهZY:8ւdQ*.wʩyU?\N[@dnjx1yq0KNu7>m+̭JTf"I]EKmv<;ɖ 9Bu$́yU?\\I$w$^_:S/04D\Y^qly-\ .R۲GMDE.gR^"3!p yq ׁ]TW)EIKr]'k])^W*bUҒ;F\::* bptoj5mxDDE%Lٟ Ò7TNU6"ccu=f1U-n$2Y> Dž #GϢ yt>> ⨏88{®TIXi\DEt:Jd"isgrN{ ~xnHˢ?)~pBCy[9mCV[];[+HlobTt1TׁOy+/|[]kv1K ;M;l=>o,5j:s{*:`ۈ#v7kddt>I\JoR=֒*i+X迅e2XH펢C0854>eFusEK$TSz s~pJzGu9t1=Ca'ޙ.Fџ &Ku .&$$ vwܽ*ᨸb :VM$ el+x7^>}Su ]u""K0z>0Zڛ|{zs\;I􊄿GNl./³yˤ pAF?,Q|D@DDy5yDӍ:N9^\;Sk8?Y"ZI[-8Oi-%i1Ejp0WY*rձ0 =vAY.ml5ksd$-ktiKyAb+Möˌ2C3/wh';H6'mjY8| XC!lD7St=X˶yvmP~Te:D<9[ö|4j)@+e `vݤrH+/tnto:FfdI\N{sU/VךV:UDn6 }¤9 c0xra՚Ʌuf]pZylpB:Do4t5[Y5LF&(0'a#>9W1;:;6:zFH1liΧ {}MEwR:CYPָ' p;bpsWQګ+:Ȍ dƟ_09wl"1PF#ᆐѧhk5b?[k/}ɐ "n#a;[!jpQlTX{f>?Α'2>yd`Y ELD#SanM'.%{qm8ZOK3$fFU W=Cm&S6I u|dX:ڐЩ]@KTM)k{Il[͢S<u" [1"FDrc%E;( I;x ,VKEY!tP+;pw{z̢jxjidu\v4 `9 qCrp0HiRXK9ssVmkbCN׺I1vH-3HܞX=-Us.n=ᢊY$ݗE!iqm=DZeھ 0{Ng5U妫S?wȏIQn4xƙpHqKK`9Q zRj̢[狩2h[ZGgUAD>A3dbZତx|0=xX#{:%""XDD"o|A(]Q (?cvyo=EVꪺ psÎG }DZ(Z|cJ $ BRrg&5H"nM`{1ض 8^+]yyF=n8dyec+D=c9ʷOtTȕkک53O5-E\El$F)`l>""Ћ}nMN+ؽ8yڵ߮yqU{pWKT<,BN;SkIq =M҆,p0@'X</~')x+.sxñĶx۩ёQ*x ZcY<K *RVUO̒84bc9{pDژ##q ojSGGG 49``33˱^څq֦EN9:&  cZWJACF u+]5x&5Vc䵭ETvX^: N;E{.m̓&{K_4ז9٨+};,`C9hr b;pꊵ 5]γ: Nz t E1#m˃;╒FCwr+8M0^ cp {zһI]uVV#yEn ⨌> #kNBV4EQ詜ښݹ֖X+22Kxot^@[q;π\JI#{{V+5z,lv _M,~|qgϧy\Zoɗߜg|h4OVFZD.WgT Q~]} (We=ډ@'S\ӻ]+rӏu)xnu)jl=!ðu+"24O9~#psOq p;Ž7VqO^*m5õK#bHtǸZKb{*GqijF>b?s Vy\g"6wrrTNy|9siVj[*.$-V.}. fsoYgxYd+7]3aQ˓u+g#`'!ii+␵ 6D_6m I%n0_ E,R5ucSa眑7 L|wXi{4o*,FG\@w՘3ޣⴎ}%>R1F)Npvly4^vݶ=U7>@ H;o+u)xK|##%F8d8Q*4s W3}mӆx$',x,UdUOPru9JOIͩ9Jpm];ڈKuypNW CᙓC#=i fďj^?sSw\Ä/W[bmuYi3!vݿ-O^^+ }9WFSI+^1%=-r9tIGj]'2 % j49G" e3)tiˑk @_KQCT2=YވV`⪙Nc_i%8Ib+jqEZN#4#%$yF" ,'6zS sfu:FL7n՛EFQRy{ɴ 4^59H o'7Qvf,pg_h/1ۚXdcFަ1gHF|4$N&<̵I9W*맾qlUy*1zj[(='[U[f.wX],w]t*5Si p$3j=OWZ{|n|rDC6$n>uN)+h h(fh|Žc7/lhp0r]sVvdE˥C%H|tb{s$;zy-֒gijYL",sL92QHK\y|/iceV@;C櫪kaHi<@easN 8d1MHpRw?C^[/!l͘Hd=;PNatn!W$WJuÔ4{Nu.c|ղ+2SnL!q ל@<; eqv$kf, 9ybw9aقTCY<  CHk@9\y3׋2ۍM--6q.wIl\m2t;qǬu<~A(ӊ[&AHTήRy]N|I˺DO4%{Z0#v?1aub IiC#K\>+VCMkd^ǚ2O'`|7uTx)wG$zZ'XFBzYziLcTn->Co F+]POYE3mlm[H89rP5aNv4hror^֬@j&lPFeyX\ItkG3Kw:^E 8Qg%F#K Q%=ZkQ:.KֺER*ڒkpq+t:_ 7Sœ귉vOD""D1gcdKBUfr0)1GwĶX/SL1#|ȱBMS^R78~֨j ٩jFqc9(b\5aNw /ZKU1SӴi\'`b$@:[Nz\exi9Ӽ89j3pO+Ӓʢ/RNRݞI+ 'B" 8WXlcK^ഃG#*_FBj<3q%,U ::?+%%l8ѹ:ŻtH\ISb0rʮm:W:"/=" ""=:ۼ$UӲlsAakP_1jGa:\GK|+uv\M< /nI=۰jpIwpU]yd9`t27ΰlxXYk7}bj,w6EҲq;+"{3Cd#FXY~m.ZՎɟ#y{^^#gk#G c q8 oԂֲYN7tE]M$նz|GͮlIL*KZb`|4 ZpHDԾ9rvO{6Z47kq1F\É,$ kW;UE:z92 `?l[ϵF:5p'ʻ}~*U\.ti2ߩ$V;eJ[} 6L ĺq6GظKig{#pnn(<G7G%)]9e)W3]+tal{])Ei2W YU ֏Yrm|bep<Gvz" M-DlLyvy S}]9>J75 =ac疆mhOUz(0q3;+j}D\,u0цNqվf Xhksv;\PqX sVegx+9'-wvcK,=_w̜-b~2N2{Wۥg.xlndm˳nk\1 b~m2%S^.st=iҶRv+Te98-Շx+Oq*SZFq^6Râ/ g":vw *ki"xZz#8ָ ˛R9dzBRH5k0s}נV8RÎ"Y%Is^Ƭ]T譍t):qp/ tˑk8gUՊ:ZUF2h== ]aFW zS_?/=>> H ,1 s8ѓk1RCP=c-3rQѝi\]?ix/"兒]95qy!l=zԚ虯ˮU3g:6,w:ܵ>/J_ :Ul|7WKɍONsL=+Y86gsdM3H-sHlr3ؗѡ 6axkx~gq -SX HGfF^ΤݛRVG44Ψdtg<$~c_wN\欨F3?~Oi<ώW.WHf1\}But`xYWYh;ૃ837[L/bVM=q|e)iँ0:c98`hbi:PW.pf˨#PDDFUnD'c>[?ӽüGr>qZ0g^iw!RJm؟6gbQ \5<"kC\sOWVqR{#NN+Zí8#N.1cCXZр}_Qԗ#֧DYɄD@LXckyy͸:;W'۱?BhupMNf45,:^k_u-|=Mu456VqwZgF:+YNI7J$ekW:WgsױutuD4mY.f5A c-y؞: 6k-и1Ůi.֋AO,Ǜ|ٹ׳GvasS_8*WAmەP_%snxRKC+X3wb;uـrSl&ElhkXр9;x8du3KESTՐDE""5VsC)=do-q#z.{%gQlWcHV/Yՙ/m`//Yՙ)T6* ~CGMMX zi֥*jRT2ND_\HLg%eAd1JgI{˽4Vvv n[//A-MKGY\wQxG=G۹{A*z[4S5c׫QfXcdoۓv"fJܐӂ{rSbdjM1ς̜+p$c5aJNL*]qQ"U4lJ̆Ƿ7^1z\KZQk/t5_ *xUb~le449wv|c})GDX" """ """ """ """ """*q_OCklMASѝv<.x=Y 8gJE9g (#1(&#lu*X@{19]S_<_g/U-K2<'?Wqk\x]'~$;ƴrhbu&8U<wd^Uwؿ5Rr[ij.U'Zւ}v |-bD45nfs`ZD(m_ \`-!㌎~gֺ27t4ߚ/=,-3݄D^""" )h* KQM#x i x `-\M]\)Z\.sάU ncڀQi x j<5ϼHi[Es,uZzz%ǸB yv6+?m}49m'Ovhff5'sFVG}sTﶋL Q2Gi$ g8,*"R녯&9\',Φ7b@8*馆_,Hb'ldtNc\C{Fݸ_)(Tڝ gahh4@;+Ucͻk6U[ .z B]4pw#q{T|P6TH4w೴|sbMMU3_OUHDEbp@;":|Σ0H2<lvUm5;9)KRGV@&hkNW:(Ua▾BQI[AT^֘Cyƨy3* z̺3+=!P ߈,o%#:W[缒\tm_Rj6JHدᾗ.RE+8~28Vzi%:ٞICZMvd7ܹВzwqtSA1RVUf9\_' @,-zl:ou y,2Livvrp՞x8{lٮctb"9a3}miMEuy6WΠI͜ %eGYeKy=v-MJmfp4cR]2ZKI`_g5ܽ<=L} k jc@>ϰ/DZ@Y蓇x坜7)1;shBE$:C{0UPSCy5n t/r8+5W+MNK{$o4a">D#XR_촗;{TVA|M;3" """ """ """ """ ""MWpu 7$AVkiYEQM. sFݑڴa+=h\TxPE MESEUbyk\F۝;+Iޯ`EoOu'3U/$Hycl]8vsB&c-%3:syFFgfE ^˥%nK{8# p~bB*w+ :sz?i+KhlU#ś2,.ɔZcZ ܌g|Tj]6~XTeJH+&9@el|5\ՍlS#H;F&h9h2>#::fQ\6)X3w;[]=lBZI?:h)bb "Y |/q͎.;Cl\SYnjk3lq+M눸U[)}En :汻c`6 e.T2>sd9wtYE*->Sm{5Mt. my_/.%{nեkaE+x4u4'Kq$o-LJomE{2.I|w i7p,pRr\\hص?lmeFY"JX9ӿ%N3z8mF;6՚㻝U2|팸;Kn݈ cl(/m ikƖu ݲ+D;w &^յhw J6}\ɿ|B`E$^jYRl!4r٭rT]֚ϯ+>iEwkj4鑙Η} ^/u>| =}|. .ZZ縬}-D쵠wdt}N5ѓ9peCNt-8ے}^ow-k0ihk@*w땮PTQ9z|֋\;]4r!iiw""" tۍU־X\#fqxw"䒒iSzzhTl5qK86nvùJPޮ5S^u 4e#_q=}#li.薪7=-c5G$R87Cq0;Н^G*o? 57+kaceMTR9-Ϛ N˽_j:'味K TU]cCPqw7gcĩ22Nت݀gP:Rb0Ꭺ9qh6;皯7YE|5,6GX[qAU)vj&N02>}gp= -RԈTDKW+uG-cCIs0wԸXxw_A 4BMN8wgn|UfOEN^+_CIZH'#.KV˩qwз;__M]$L9EEDK) iͧ]⶞nVy}};ƇTtŌjp6Jکf2\%|hL{v McΒ7ĬO ɩb&&g12~Sk5sdd=ظ`u²I*k_uH/#}nck{^F7rїԲ:{>coGz=ef\3hyx"]jOUq폮 ,'K$~hqQ#  d7X:LR1؏>EE[ %Yl6PVmh5w}E}^9""" """ """ """ """ =%=A)H;kToХ,IONI"v% Ϲ^D\mYЈ(U=ZZm@:;scBѽCY#iaB>Rū!ѭ!O%wk;k1Y@o0ESᨍD5 -V/54ǫv`|682;\c_ ]n88CG p,m]zԑZcJV?Oj?;8)om[iMHĞҹgCKs265!yW/;!3? 1IG̵k,ul *w+.p~bB| M3\15u 5=LسMpI3`2耂  V,֯'Lt\vKsKCp3_Po+g[G?:δ>eGhXlg=-ۣ?@lGt0׎co jv8`BOLMU 5s\;2p[E:fv\M}R[*|4&jwKO A uK#$H1k[`otkv=+nZ72G^ ?tnk/us6|WTZwGϱ8lQDѤ1.i5 *XF4l7Ϸ<i`8KnM# tm!$cb-'Ti7w  +Ek—1?jޯtϤ.58P,O>K\"܌`4E]atEqkwmNJq&ڭT(`\ؽ's;N<<~GO3*&LcFd{+}SkgrȎㅗl2SV#f/c@k< p4 4ҾL@'jA qzCu;aǙlj].Gba ]{8Gܹ4[qJ}V`rmQ2Ojh3f|1:fpʵlQSK |o*󧉳H+-fw v9IC8Fuhhߵl 4GO#u`}ҟ?;󭓣٣e9x#z`(n4V""" ""F[ւ!|Wvifli5m#ti^J.Y$峴48羹Y>{})b U2\0-w tN6K3Ód{U3[=p:m%๬nĞ]D3Zcl:N|gbQ\#÷)c=pwK\9ˤbuM;$sDh#~+3t.;u-c,H;Vѷ_L^*Ͷ7C dˡ;\  )}cpGֺnk+u5Ms%Ө`KUy8RTfTl/D:3;SW|YAs4.2TpRu:MƠw`ImUqmUu򱠗;p}z*fd$J~F lejTɑ7cOiR#x>Aڠ5;l0B k^|.%oc.H=+ly:sΪiGE[~(kHcɏW~%S\AB"q)v=o#ǩK z.uU.[L_[r/iE֌2\y>ŋc5fsDj6ޫ63U _ɏܱWZ\'V}*1Ah hO+dDv<7JأZs|Εoc#*MһƎR1ZJriZбJvb?r =_hn\"T'qL)J{J{!U&)Z0d8$\xV\"n'h%!Cya#eN$9u\>3G]Ko5:?kP05(ݎM{z{YJn-ca=+%]Um$gEG?֪Jiiw""չ/KwMrm.zYNKwkDxah`57'`ڪ!6GHi$ 1cCX֎@ 5T@^$3A#n-5fMY܈!RIn|pJ (>Hxn6<Ȉ|6[8i:N1v]*:8̻ 8_?V\!AVyB៙w$@sheuLchspq$z=렢 9۫;e8c.Kw7Ìls?g keDr~8Գj<]25pWXD\j 6gO!+~ua[q-uHdc3Ğ˗-" 5k/uskL&+Z~ g̺/Hߵ:ε~ 0.APkoV\4gr1W9qT5Yo3c(nXǴ!VjA -8qO\rCV.9}QzȀ([|J)j1⥢^rk,|K 8dѷ!GJ6@,8u83n@vmƵեj98zpLg[KQ['8I`ڶ.u7+Zc-ES$o!1WŴq 2RGWH}tvO<=f@q#MuK:YZ ^jnݻcoR${]V;SZK3{ksCZ H_#c#`dmk982U['VOPТ Q4cuHX@q͠s'Vm0UJ|Fgw%KZjRTHe7\F|uI#d ׀r5 ?I6&Ҳ&s{sRH6]G\EY%T$4 pχڑD@DDD@QQ uI F=!yvk}Z?Iñݫԫth4hk>S !u1pn*Kͩ xk$}LCiq>!EQy}H8nn|5E] 4\ cMeʮ[3!edm4'2ju8 |%WJ9x:$}ȦѝR1ΛIf_t4U%M)dV\Ivc}z-3 qEQLj.&]lsJ}5k#vF$昶K1V/uXZf3gvv vJYo|ΗR1$,ir&vuop hr,UYW _tevs ,GIWkk1yKjQ2$: 70WۼZHq-7J|q{6CD dL׏ۅUqu=,mM^tw pl^  -NqT|2OA&6GL1N*Ӗ1#z?͖H&@;*)[Yƌ80&%wi~#MK%O,R0:_4Hͻ}gVޟGKPG3L@=rHR1,i%E'qIG -A^ȩ@[oAte{gpݺ/֓{*XGgFGgQ"S᳁]*;WtqlL= ӯtJ#f\ፎo 38 &G#nՄ)+Hc'l4Z ^a$9uc9WX8U8# Ag'4 ubk<;JAc^9t$@T P9iLpMNյǪ'D쨂9ptohsHy:OmR0^/gܪ2:eJCdE|V$1XĥFYe Rᱫ\cU5Q(FeF%[Zq.P­X jW ЮX/B - *G 4HW0GD\X]LдX=XWaTYL~ R0ar";&ܥT ;)4R<DRXS}?ta[|AXU(Wӎa 4஌% a 4U஌e ùfL}?|CG|^ ȪHþG}7>%a+"9%~ ƔY;t [ V}fqٓxJ3a'ڳt]$@'~Cࣾ.Z. QY[X)3\|> 2OJiÑcqQxh8zKfct$ܭFCpGΪS}.-ۼȰ6/ D5I| A tucQUQ$WZ)c]-|9H)r5k;8x~rNںY t0 l9HsKerq<}ӚRvRxE?dOtZAQ;eS{IqHJҩ;lA\n=Xinj؂2n+"R >v;ۅ8KR Gjs6geuV}77,7Z k l,UANQSنVgQUQ╡p9ˏ#fK=Kɖ΋=.bΔřJlGS4SNQcr²JKBqdXU@ULXE bg*WdY UJP+T%E/U(§ S;r**gnRaTc*KUKXW- U$.@Z-WT%ÛeK![sTўp 5bH.j+c#0G%Dt綇CקzuR/ެ[MViL{@ſ:NVb;C)^yjSRQa I}Sq<=ojh M9bF@܉999+X\Z?`06[㋠ƯGu+g~IS>TZc`eTfs {Ak;m*8h.uw8, o:ckatݝ{sbqՕҞݯ>6VOTVˬț#0K$QJruS7>hr [*Wa=SH3ه'q2GJq]};:1RPS"|l?ҟ+{ϣ[2x1OUQ39ъq2{~dUn5׸$FxI%Yweox[>MdM- :5'nO28rӡ|LqZ ҕIRɪIP%<')񲷼|J״{OOEy[)񶷼|Jt{졙y|m?ҟk{wAM<[)񶷼|Jt{졙y|m?ҟk{wAM<[)񶷼|Jt{졙y|m?҇k{wAM<[)񶷼|J״Sp߼~6OVOe{g񶷼|J|m?ҵ%4x{+3>6zN%VUCML,=ƂKN$[muLn#8,v="Z~=pSzչL+$yZqe⣒RJKۆMՖk~Sږ>Wv5= %]lK9F2a;z8 `8ً.t=sVf۩iadpa%^El{.wVŴSN7@ȆdC@J䨶;e,tQ1Ϩsxt g ;DA+?Jָ~yP1 3Qf=o $F0AUnP?Jf@k69K{pvx?2@?ck.3>E4Z^ODo uг5Q ;j٠t[tx.F|tm^7^UxUVɿ3v\XI3*D@DD{HkDu,Èf{J/WH,sPHa-3.^ؘ96Up'RȪ/}OԹa-i畛-ܟ[P!Z-?YwypfW|ѤYnV;-u\UUU[>l}Ntp'p f?T?fdʦ="p $d0yRCa}Ko=\/.<';mo @t7˚;GgX.٦L?}Ÿ~ :W@%qf75ͭ .k[悒=MԬtuCCCFܷ0HedŮ-JW/4ZaWBYS^v*dh1cqvPHsVO-5rS\ Lv[+>=՝y.v[Np@.Y J23w{5(`v`{OxwNZ*j:,43:qr:NSw%|Jfu NRT(nP¯4r³J|*´Үq7Eh0bЉKT+Y UAPVs8ʗ/\I D/TJJWQ_iDM . $.%+*RFy"˂+N ijD#TYHYB,$D(2@H"$GxR 3ֈQޯL/QޯXyVĦE/W=]9\rEleʲEL8+*ӕfA0M9S:8Yd6z_ n'tim OKTrX Nժ8a&d0JKAMŮ-$e#ohARW5=&sFN_8ԯF5q82{Sz@0մXoo{5.0Aj1?$EYa5 KfSќo]/ThO l+/, ӫ*׾y>#{e`WLg3nu8aSm cmmtM ( iiםnۖ[?[[0f% 6O~ ?2 ,v;`d0}`JhEO ص[{8Trg۹_TZe)pyD. 0v;0U\)^-kv <;gsvF8ACJ?oYk)ۛ6VQn{ota_AOJK,+3UU[]5L2K+O b@td;_n ֑%޾X^Yl6?TZPHlj8tF\ְh)yE]r|v_=7j|U~F]8Z;X84lO27p%8^|###7:ibt HSv[~SSM^7tOoZ؟JCtoZFxp>2h5 Q<-TZk,_g|')|Bq Oa|E좥ËZHˁZy{mpRe6*3Z(TRJ 'ݣSyOMN5zƢgHliVœJ{Mzxm#C4Qd3ʏ?Oy;MN5zv7 Xm2g1i8nڝ*cTTՖ#*+COYB^?qC}7jP^6[@paqV2 mG`I5ph7?hy#2vT_:z˾QKyE/ ՓY顆I_v`4.CEAfڨd10`G-h8|QWt_ʞQKyE/ Z%d2Aa 1i r=W"Yek-xzGk.lw5kð=s-Ij[,y:|Ӟ9.%N/O-q~ɉMC~b48Lz34y ^!UqRVGXi%-x~g~UMU5FB_O]O,ZC#:Az+KG=_Z?UM:o]7˗bQS?SS;R8>'aq4%NYe⹧=ӅV׎"h5K2 $ՌXǓ-Ifu 5\&}It쑱N=9 xQ hSVEMѝZkm2i*hVr d,|p>>ZPk^I;K*=#pQ-FMR r1٨Ϣ|uKy~hCuJa裯[g\A?0PL""" -ڊyayI%SIip`I.Cpmtl)*mrLЫ*!uU:@M5dsN6:N #n%z2Mmd/~L7;\>IZA8 h18edXIls>&Ŧ9\֟ 80;˕AdYcXoKu|UwU,27nTާ,p1ҭO 6*XAO5C [ўָ.X+cz^\{ DTLT3'$ 㵹Sv8iUFYmϤhZ̮95%T-Îf#4v\vqM>團2$fk8KeP4)ƑY ~ SnoEuh:Yuwwm;=+>F7VpU|4*9piH;^ŲJž6*iqo)nvASw K7h* %Sռsk[m.rbWHey2D|=N%m;VQtArCJ[TNܴԀ qmh_\oZCjp&n]W+岎VRAYBYli~H't` Jbϊ3+14jIIXtp xR WŎ<1{V}'*`)sMqRmE$m~ǛZI`-{5-gD^ ӱ7dq=4;=~դm' fKCYAKYV &|w6 :̼ȩ^dmk:Kzbn"Ԃ:(׷487}ZO|6,\k%DlwUk ~u ң/ RM$雬㤑;_qOEc DTXk:[+ˤW2O`+hˣٰh CN٦d\UŘvq wV/FxRTV3G*v8Wd%VuhLtKĶ;%tDPohX`UJM)+3)& -يv=-#={35>O6}DؚOF2pJcXޥE"u r(Lr,ҪLc֕WQ=*UI +7Bw+E@_W}_U+2`j2,Wª_W%|*q:R*D"*΅IU/2ۂU+nRFyە+Zr2YU1ȋ'j*VGEH%-<주vG{(mGyW$v;ܯT^Tw[ܬ9򬼯r+Vώ*ӊ9۫NriiV $*b$NQvīU<541%UYcF:pήC#lyD1Q8w^;_e3tҚWMxxd/nKVKM4`S~Z@wrq,6ں;%{{w|)*%'2ۅ+&܅|qKT V5dxvvgmwYY ]+yT`sYST'Ryrs(8Vک1l Iz@|qmlwʥ`,gwiʫMWsKµT6WB O9`627~|R7Bǵ-F݆tMCx8etqyf+Aư[7taY-:Y$xIy9o/JJievBt&Է6~)['Q|Ci.i;yB* uAnH,L:ǘۗ7K;_>W?T;|K:59(/64 =hiim4Mc\oy gwSR5.9pS^bk|.!qv\rM:*˃cTi8~Jձ0CF4hw0rxo=>8$k͜㡊W/H*.N= wƦ<{mR|꩎ؘ0i+uʬwiB*+..7k򺌴<"Wsu,w M:UI-E,8}nsܒHܬ "615hcqKN0Z[MNosLυ&fDdˤ8 2G!{<M_Iղz1Ē˴̞xϚ{w|fGZ-ﭬs6Cfi FرI8夝qwV Yd ,2?<@FZF9ܵvhkVT9 3@א<2O3WS~%sYTl68j=մ 1QzȮmy}jp}n4Եf<&8,{T[5&[56G1厚j3\ד2TkJt!oյf~#psE?G,rȡ9;M)%ͻUSTIcFdl=lҵ'99>b˺d,31cd1Mk$Z܏ܮ|7)+")+g%t@E?T;_2H]O;_>W?LDSW?OS$h7.wкw(?Yw X?>(џs<# Ƹ_эv>EW{%Ef~Eb* D@DDk="[]S$vvlʙ#s2;\j$+nCQ 2+e/;]~eESW9J%asHs-fSN$, nOW~ yE<qA˚ܜN bkC2JfnöEDIiu֞W>6^9y53Sl3eq'q݌H֪N8)]-X^w`rpLTq\ut2tvC0vʇ(x{8R2K]nῄ[·YiwipqbMSJ}J:KKVe Uec-dr{3C<Êج<=u%j LTSM$f-kpISGqWu ԓFG rqd3g@ ;~xffVjb_)GNƀZIk}8arVEu%>[Sn2.RWuD4a~K;Dq5  E,=d5:֟8 IwesZG徱+,;.O(aEQpJ d\5z3̓+/ *["ʙ[qDJVϿ߸sN.̋$4* ҴŐeU`M*U)IK9!<;;Gez_u =\1L= qe?3Ryc'w,Yr<'G4U:r)Qȱ1ʥG*@"&9|TXe9V9]cʐǂ*ֹ^k&=^cy#ѥT *;\*Y3q!ʥV.vЪ t&p U ]`J|\%|_W²>"T3|+TAK+VܤS2Vޫ*QeIIPw5| R#TINPz: p.Y];qO'ieGUS^w5zTjb/psCAir+MD@DDD@DDD@DDsr. tϺ~ȸa5揊)z?Ǽ15OQhzz(_{,X"DDD@U-=t@8i'$Mr\kQEdqUE_ \9-dGٷjSo+%DÀ7\2Prp^VLc/Fq2{w8nу% Z$13SƜgV-g-#8AvRYTsryen{pۅt}%Զr!=dE(KAupK/P^@nڟ7G q.cXg8-  GHTQZdWQL $aD4$ewΤir6Nh~Jn|LUu핤9Įy =IAv#*Zxx~jvK^6u*e.cw5frVi8CiU;N,naP7Uav*Jݕ֕|Y_iWUq\J%{ bAóaUj䢤^5S&<4T\[X{7=^^2קN,tj8>Fr9TX8RY?8RkGQ3`o&9AXEeVp+nrbG wlU=D)w3} C<ի C<"gRH""P""QA-׆w1MO$49-DN&!Y @m̶q1VJ"Da b8>nQqv4ۍ9aJ*[‹aZu5F0 BѷS:=9GϑѤQTg7ݓӏܽjUF2w`}F=QwIMd7COrRw7;kMk#$01:7qMe>5C{JDWұV9- l:3h͵b?oWk7n0a1TUS\-=dF8.mjzHV<ꝍZZavڛGTwCMn-n&/-c{w&oKQEԶF59uxT޺c&_$э84c^vlO` nn 6XUr^ fU*"jgfa,{ݾֆ`eo71q=W>VUjNc\Qw).R)ƽF+FA HGrv#qI?=g t45CqpHn5JQ#afzSc}GZJTUbC摵-8 'sŗ#UHWXk('.tn,M8/r(K$̳bI93ʒ̱UFi Xܪj*9Ou2PS$I$ZeRH=ȣ*f.=;V*&]{՗ȭ>_a-Du+.Zt˥W$WbV]&UHEtQ󞭹ˤV"Dx[sգ&UĆ[AzaD@ys(`eAIsI>9jdemcidcZƫG^2p-km$fdn*  NFV9548-o4[\*`pvtvD,'[hO/ϡG}jBT͏\+|^Ꙩͤ=YU89|[#[i$gk] a^Oc]9WD@DDD@DDD@\܋?]sr. m|q} rv>E8ck*q^}IJ:ŗK/=$tD@DDD@vNqdsW7T[ƍ$k\34󅀪>OWFu66T\Z{"J6ΦV7fnv\z)/UJ\KvߙڼxJyW3[OmEUYk{Ce=GGF*{<'Id4qURa9s?l=֙KW%GqiA'1}gTVs;? -"SUjS;[O9+<9Ek+D32S+gk$Η8` reB|5TQSgNq'fX-VSzs6FG1SV8~p|i.T+{c:nG`#}]AQ]--:,ꏊ/(sa` =vV*4AN `(KK>W `N!F,q|O[iZ >K+)Hmr'y1Nc47_\ ʊwRq5-\o,Z#g外exk,.:zʊI޶'ӵ =u灟Q,|"S*"}A^đ͐{4{nq\xCdcxvd{ݳt]{W<ڬw^5 ^mX'˫ZKpY$}+𭝔P:g<QSA=53;ھ[}uxD̎:lᥚ4='ݕ48̍+c)m^U^5j.'[G vYJ)8bT%[erX YqyiX  T\o6<|xdxyQkO0K gU#cG0]yGG,<¸Ҳ\cF2whi91 ½x2_ji\i+ejWЭDK*U֕lY^iWUUƕrdKY]92 ־ҮJ*iŜT*4TO⴮yMDfHߴ-x 8t$'W:!EFr:*:d*Lu+4| ***EP1fM16#&jbmz%d[]X8.c;z{XyXQa)xPƟ g;Aj.-niH^. D@DDsr. tϺ~ȸa5揊)z?Ǽ15OQhzz(_{,X"DDD@DD6=4Rْ0cTc{v1i簌4ʨ͂R,G&|rr0@촇A)4{CݻoH;vfij(q}=-VRǻk ;AkEg6TSJG%WphSyc` wΜrI*p|T7|3UVZ*"tLFK]oJ2t}t{Cyvv =e uV1{9hv兼qw G[g8*ց$? 0zj !ijJZFή־L !ɺKvF8<\[o6kMOh^nAQ23ȥe_\ /4  p8z˜Wf6>XAõk{WKR_(勫%2cOU`y7Qñg'eÁ;$SUI^jK n_+4nPm>hHg3"8tڰ GgV2{B᮱UU5k8FzL1W#{B]<7G}x.1JLQ  ѱ pz,* =4";.gP =#*w xڻ6;MP:X+!Fs߻g8jyT*<+\ d'>/V]?Nt*P7fZ#[2UA_(ȩ/Qz"J SG֚,TJδԦM@|ԭJ5YJWTlFGA<]t̽jo^,xo.""O6tfuS21M c9P]kk~ӈ, %̞X\#5ty #ifHPݔ9KSFi+X+x"\氀sVkp j:8j榪`ӫT"rWV<]A&Gۦ+-_^yoGb{0/M&>hg@\NTHQL8.A'Gr2Cl\CAru210;ZH^ݠFkr+%US"WFKRΖF{z 9jqelfȼB*z3RZXv:J7M#UoD7[{%+ؠ<*UD!}Tv TunZJ'x3stq:X*`/G==kx}i6HܗB6Fl m|q} rv>E8ck*q^}IJ:ŗK/=$tD@DDD@Z?I$W@u/$~x[‰vbq7|og*:Gְ5Ƣ6h=$jþZzY!nY(FrsNAnX&Rm7PpnXu%)Q[3Y^ѹZO Z๸9jyeGp7 yl1V/WWRpYTI#{NXC3cCC*:9Inëګ^:Z$/<ܐoB8v/YG]keEwJ*$>' 9/$47$;- wQp=6 Mh!,],z{* 0Z=Yq]M.!slNpX^[8Y=Ξ j:]NxěZI9z g Hvd4U4rS:7N;ݠ-Gޮ2kwT,SNS\^Zr0zqx:itClQ Y!!G,niSD~QR=:<<`N)FI;qk7zʧ yF^ ҮYjզ *++>PTM3ƕyGu[qUa\iWE$R2FscZU6gBװ *7Wn _'ݏOq[p9.,]'[畢oW3G2* W 3yt#&7Xj×*K+rfl_F&JqC}Ұʂ/7*lCk[U07)~Kð&5mŇΊTCg::w!hʒޚ,.gI9?Wy'Z;q?4UQqIz|?o՗CbtÓ}9=D󌅷/V=)Z=y$|9pA O_] tEE3AKybGh Sܥ![ݏ&IF2p:mǬpsY3VI*Ӧd#+%W%WžXuONr2VQⱦr{U_l:l̡浦4tMȣkMJJ#MjS*j{ZjV5Y +i*X2} U, 6>[`@*V%nA<֫A/J)^_=޵7xђ =" o j鴸D]nG`m0'M6cQEIt0_bÙaݾz}Ir8l%ctK慞o4-.SgysH!TeO[ ue82N~^hh۹sv⎧sSV+D7(FLٕ̔仇BP~ <$d{OԸJźEW+m:}DlWZwYӨ326^^t{oEN+OCGXc؉eDZ" """ !ۼ5sϟϟx\ⲑΝе- VZ& t;3r 4- 898;m5*=D>cd:7g*Z T_bmW]!DA@OX$&wU='{K[S,/s&{IR!fN3tnm5SF#x 3UоOgTE,qpwa$dL<++g7Xey{kƎ}jT~ W]rdVʘ{ZYOzdo5+Eƺ,*jy96CW,?8qsqDlA1UǑAPOղ \@|AKZabteQY L=hs |n؍K/VqG-s-;4zL4s+Z&{TbۏHgLgG9! z#$ 0t7oZm1TR%0$v8^^PK8"krzxZgpܭ+mSRU7ItxRG/͛Zq2:k]LfVp8q:|0WUcADDK'#˞FNZxOO9z5cQع3缹8V1fmT dPeChsW[.^U AT} h+U4B)pҮ4rҭ8_iWqV%1;-xZ*]獚y0=TKNA]j:izj - q?zDr:74ī'i"IzY.T!zZ.TQ.*KIrP.K  %r\Kʒl|.BJ%[._5!,uʪP'<vwxC4GUv>#rBT}c"Aiwм#áiyg5ʌuX:{}]lw _g46ə* QZ\NSp %Dtr(`KN$a$[eTi`Z%)̤ʶ-؏DWTPWFތ+* 5Z}1V)U UTX5VVpTrX A|2,^/Q8ĵ`kiP=XՉ qϢnX33frVJSZPr"U[/t{{㊍cUU+ .@]-ao\#WYAc kF q9OHaTu8hW{}#Qt˜O6I^\:oG4˽(f@UOAk""jvʪ) 7FH܎~k7jY)[$n-p!zqn-Kx&[2Hc[+L6ڝ'u~o5CFy_![&wsǐp(̘dj3_̳AhF f 9P}Gzۅd*i*c_CDJaMNKҮ/NTѿ屑KQ+Zq+upX&VR[ԝ#vQYfw1֡QӕOScL1䬭ISκ7E;Kάx.8k*ާ#ddd*p?R0X/V.R˃j(p acY/*'4Ys{A<I)I4IvH}!ytOoRZTGoN(-_Ui+\8Yv$Դʚښjsϰ~emhnΟ]flgI!3Տk=)Oksd3ܮ08+ۓ_+bk dm.q>-߅z5n'&mw0FN`ήN8I=3EuH;\ѽ&lHe#imcֺt=ZFwgADDsr> tϺ~a5揊)z?Ǽ15OQhzz(_{,X"DDD@DD$cdc=q1:f9n;Zw K%+j̹knuG&:z({uF;.jfX#w0p#[5}*OGw3Xii$s㕎."FN*ziul:jZ+}nRAi_8am7 kXImO]dEQjoK:&`p}X }m}S&}m3N 'A֞զ,w[mWo5[J]#AxϰJj"㭹pV@Xw؋7Mffֳw)nvhXy}U#;j8V_}^8Z{akfu,sdlkw+QY{pele9jczm'-\T{\ pj' I|[Cuh'ဃu\?Ah|f;Ҥ2ió0@=ī A롬tŵSrm\d4Q6vnㅪ4*^#ecA| gЮ5PXVD* DR/X4SJg mrI/*QÕajG,_}ʴN]h R9w`P)cA`FAȩ D}R'6+le.F#tw`=kRҾ]ԇSmWyJzt/$Y~zV֬];6gU9zV{BvGκPn0v}  L:c\U\LgT1w#:AS象[u\z ]%r>y{3ut1TF;"nŠ@t5TQG,aTUaTp1TU)H叁XRPG,VUa:+$2܅0\G2„gVSQ# *0;TikTOuR3j-h sVqwF44n5V[9U+rѹqfxS8k,_ 83i^v{v%bڻ%%,p6 Hc54`^E~$M0å?c⹾v N]ڻ}%= ;`(!n4`Wy)ɚTv)zz%dP:qz$鿙.-t̏iz^c8̘_J 5D@DDk="MۅXgu$d6HϷ fEƮ^WƗWU63AE:rg*ی9h^{*-33 ӵHqkv g=|M-5ALAݙY m Z-VC|d4{ѷY!dvI RMNKKOG艁>"jx׆zV袴=`]zۓ4 Ӹo6[kķɎ1N1q{$Y*ckO5N(p,J CHA8&C8w$}emY`DEDDϺ~a5W>"?>((c?\s9F K!裬Y~Dc؊GHDDD@DDD@{83Z]X&Ld=9Tk#nC27V]gqWҹTVCgXDA."w޼ֲ3z}KB(R'k!0TmdVtsN%й88wk{{VjKSO,N75 o Qu{$CX_qWо/h+j*BrV ARЬDJ}ʒg |L\X*qb*ALU}J໕Pr %#/*UAJBPrPrU*ԔQ K8 P*8zuMFWT}kK:$*/gt,J>*7XbqbVZx["&kMj[uң&_:3RwZV<⭺E܆Ht+i>*b*i>+g%}QX㢷eyJRk}5EUClPF^uڸ=]EW2 })8'퇇l?ma1z3YUUZGBM-:-^,_kv}`",r&".Y蕐zz%dL?I2?]zW2a}*"/$DDEWGw; splz?T{KF<k6_#,ޑguI %rƷ*.q.sI'$u^*J*'sPG]N6TUFY.#v rh迡} =k* {rcis@nMCc_ۛ% Ov` 6SVb:P;!r^WJ:IH9+r9,rXNL*(a+t?ggW4ZJÐA^G zܵ.E$Tx8; ס)*zvቁ`ց=U wbIl\DEDDD@DDD@>"A\܋?[xo(hGs<{]q|'W{,eDZb* !D@DDD@DD=8;WG #,vH,=c7斝+Mi$Աbf '0Zu8YrN6MIeF =Xz$ޡ$`HMۜ[I82F. rv9۞B׮tqZ״OYQedO#9ֵ݄elj+e6( *YGxi |p@|e,{CpuVɖgf2 ɪlŲ_v[)*+&;h2.}uE6J0G.m l-GMKF 'Ms8O se ]A0y<^ q.-c[IFƨefQeYdR""DDD@K>+ J'MwhdLdU?7D^I""" l4k@4rZƐ~Vjkkel4idw&18 _\Ev. WL_< % O4WQؙV qhB,fd-0pˁ۵shoEqE\%KA&phi{̜s<{Z8IR ٖUT3_*$n߳ Fx)5=ar>T|c(RP=TI+@P Ny椛'SR8+Y<5R%DFqVi%ˣCowڒ)ZӥINr8z76s5F9Xa{CedFG09RؑD]D@DDD@\܋?]sr. m|q} rv>E8ck*q^}IJ:ŗK/=$tD@DDD@DD@OKs |tPotb4'o*C<.c15yo+)#YW,P5,׆#kl˃_Apv5HsZ[j)ek:X,h=R=~{Bq]]-(f0sFD"k3̆4g\,M]QnmHR6Cj/z<9 rE*@v8ϡT EBH+W̯叹_2&.vKU8_p>_ra3 }ʡ0sRZ2Ws u&k%7LKr],^Ԛ՝8{RkVrWŋZwZ+k3biQLYTsWvx%aq31bE2Vi.)hhi:-=MYasMd{U%LѶDtJͅ[n RXs8>S[jISg<2&>GMcrO-^|VXN5 EghM>AlC#wY,c_D>6| u޾: Nch.a<@X9r[$[僽wuI˭?J 2϶W2i?3&ҩH""MaD@Ϳd5z-uaBx6@Z>n} ^(' ڣVޣy#^ 43=W5O7|27{G%-:f.-uru]:ر^-gZj9Z$pU9TxSuUUsSF_ۊV8:w68ǐd*%z#cυ]ŗS[\l-g@}z666555wni-Xo=䜒yIRֈEY D" """ ""?~|A0+tko SS~xck.9]S~%Q,X"Y~EA#""" """ ""qSd pw;t{tY)dT#cV{y;ש]ZxuK͊:p)7ˍILB;=G Q스 |E]8} AM",Ћ8va e-?Ҳ#y(ʤ#5&n]ԳHgGW':zvY* ְuSJ:2sG.w 1esa0cz->uŘ4=g3#3~'0hG:\x+̎IURpR#yCό/E̎1vtbg O%IgXr%ɝZ)T9ދIZ \xoTyDc0pخr2cnosEg*e$;qំG஀GGu/iqx[F|(#5 ?Ӑ?̽l&Cցa=]>p~JF0gC[]pyRZ#s̮h'vN .1+S4 rd#Pjה,RkCTqpնi W&Cdqy._Eo/Y8AآR[`dS Ώx `;S&dVT0D h^}Jڄcd<".,x9n:SN;k. Gwvek3?jՍv=fL-pldt/=Q=XȦu@1^q*2,~fj଍>ϽainG$z _ RTS$wѾ5; *T讥>IGcK ÈՆFMUv|U4TR KCt8푃A4tE5pc-.-'*}E!XY3u6F w~ӆ-+ 49geMǤhEdtfkFø|VrkS&AA$oΦdQ{hdBbwTܰAFހ_xښy$20O944hԪN-z}$wY+XFjb-ՖIVaSCLi#$XI#I8ю@R+41O[̚Frt7<0>bU(U4V|(Ue̫0PTʼ6@s#SHLACR_ڜy?3&ҩH""MaD@G4*I0P0;2~w%{Zg[MLWڰ<љ^?6Q՞,FƬ(ЦmD**y6fc$)"|ko,uS|mM#9s(`vDqE]bI7|bok^kB$K5Ҽvb-EVHX5An3-goQ " """ """ tqk}Eѭ74|QN#O=Qh rv>EN+OCGXc؉eDZ" """ ""?j^+63h%Gܯ|7G.h[P#!=y2q]j5/ҼTPNU$/"RU@&@.p 8}}R̀2IگR_W-nyKRj+yS.tl,i8=Ejga|=Nps[fG#9 gԬDB:y] `MT5h=4;uSl 4 `bL&6^OR<4~ O-$v84 87lS #KIn$7 Əu 8F1KZj.qӶL)bS''7F7ql:Y&A$42I_K$"26SؚX416} QcKKHdokYlP[Kg3*jTM!{dF3>mTƣL;hkrFpXR(拪n|Y·F3{QcGQi3o;{9UJJs_:3gNLQ|~韡:3g@}E?~~韡ήL?~_:3gNL*k?~?RgЀ"/B/=pT5Xi?3&ҩH""MaD@nETT?]iZ?+?ty7S]l.m1gi$+5rSVOQac{;QI%"?>((c?\s9F K!裬Y~Dc؊GHDDD@DDD@^O|bk/|/I!_P8/<^7 pX@"|vi_E]t9ҿh&/E"/ 8}}}T#X_@_y)XJF+cq|9$5$te,WY;k6+(<-[ꖃpT'Vؖj{(b=ԭ*s+ԖƮ65 vƮ65!4rvƮ65|F L2ab13Y UiWtS0YҾiWW)dCB3XpV+/KQ,G()$$ w~@U=w ;y4v1hÅW*H ?9x^h h cxvMbSq7wcq[aBy)gV.?JV4]'G~gKT$HƵp$1H2sysWzڞT Q -$PSDȡkƆPK-ƕ9ƦH` c\ky>3hLQ\bs1OX]!yӘ;ugD MRy*G$9drZt6gTyl|{\ֆ $ ˳rHN-B.-T"-T"-T"-T"-T"-T"Pj95ܔ*El$JI$CeETy?3&ҩH""MaD@XxPY3@88z0B" """ """ ""?~\A0}+tqko SS~xck.=kp*q^}IJ:_lX"DDD@DDEbW  u/ _T6Q;AQ^Zl"q-GqRDґsc4bBC,lQ'v/}¸H hUDX$ mxK)NǏ;q^4 "PfKsjeİ03H}5,'?)mNBH`U+V"Yjv5*q*F,Ta*W|G QhC<ag5F,Y UUAŠ ż/W_]-* -9[rij'lYzy 4±@ (5`vy9U\SjdxkrI8wQ_D©QG2G2y̯H\dr2qRbsA2is]9zp/;lWlLqS/eۛ?uh~bOe}?sM,_IS_`">)ELD'C>5päEYrPGPqn~ƞ/&'aYd d?][L%nW.aݻש.!N`RqI^Z.ʃn2jJO(#$I5 #V)G젥g%\FMD-) p`xoKKrJ??ה!.Sb.ӯtU=_CGE[hO-?26]SӯtU=_C?GE[hO-?3|;䧕ῧ_/{oܾƎEE[h^f1%> wO+N_QT߹}Lom?ƎcJ|Wtr:/Comy|1%< :}GES~=34t_ſ*/C7)cJy^uzgh迋i4t_ſoS|7Omh迋k;)xoK:*/-?י wOSӯtU=_C?GE[hO-?3|;䧕ῧ_/{oܾƎGE[h^f1%> wO+N_QT߹}Lom?ƎcJ|Wtr:/Comy|1%< :}GES~=34t_ſ*/C7)cJy^uzgh迋i4t_ſoS|7Omhk;䯢Wtr3?,OqcVWi}s\)gY*+s5N>)NYnR29'7gؾW!{<(As n˪p1nR}$7sBVV:5}C؊Q*wb+#di3-YjKWkC^#u2K`8Hwn<[o?wj^a^).ղʌTiv ?TvTh.T5z5kk|BZm0v7Qv; g Vإ:񍺆v1Ia.Ƒ[u |nn69]3 WW4LUK tPX\1!3n?i 2HLvGӀp~Bz ]>E_rVڛu gY$O'[$\ik{9&[p%[,uy,Zw"d7M_)>BY [/wb|!Iv $ӂAO/+Of 08KvZfmFp?Vba1q@qAs7-?N1+FҹJԿO*ۨuePًUקe`@i1X 8xuk-b8xc@qp8`֌U} }icU>&TZt5Oq&C9w,qL5۳:!ތOJF>.ϊ5_wнwoS\"slwq`x.ݬRMQaf^FG W瘾(~EB|Q_{TTsuTvQ95iRxQ]LRa挰.i+.}W]/QmʹEtXmfBt05ź{G>c`nc 8ۻ ŏ,Q_U} 6.4VȢ}+]ܷv"-7b^$ yf#{H\XȻO5_wнj)a}Dl@ɮ*pj?].,y}W]'Ȼ^he4b <:G8q%">qbķ)*}S7.,y}W]'Ȼ^Z) 4cتke.'suv7 W<T>IuICW,y q5p.TS;޽-üCa 3-u=eTT~ZyJX$XFѾ!t^]Rǜŏ?j~[Q[aUx>/.8xc_~/2O 8>d~G̻'7x'<?!MG  4MVbiM歊oэi,4[D@DDD@DDw\ɡ/^GM3qq>%z `qOi ~UPw0֞b BѿYLޠ -v++/ ȣ8P〻\3W]'\Occ鿵v.=3USGjk$x3HѳbUGcmшiO8/$:( Ũ}CI%SW.@ts_,\WPAXsR&bsRZLRV2S)utY"B`9Vp^ZԚn Jr\ ʂArfnr*iKY{/zG}Ei9.Q<&|e]>~(7,zGf{d[7Eh <M>^2꘣d128ցoTU$HD@ܑ+IId=dPr__ uT44S?E< t;dV~/R>YFΣT/zG̍MqPM$ΊI۪6Os ׀sK+i׹P9%"@CH!j4Ime]dRe1hK0縱kZPʞKk(nUdnlk#x9qח+==69_,|ΗK^82Z6ܸUo{yĺLև4;%n C ͗GTOױ2^C3p;*j.tPR1#b{9rVtەek*bC7Q1`1 #\#呕xIj))aA,do6MO8j[ѼWN#:(:xWaÌG ip{\jљ/QA<(pβVL @f;Ө ;ݶqRM k 0Amh68#a8ʡxEcn$vyD5;+ac"y@>8Ѳ1Rǀր@$n"n&n"n&pUn#*$$AT 5Hëۻ:lc+SGKs.V7@rN,vrfKlᘁc;sKFw謕 #HO0da&+W]zm_h*YNӳa˲N},v-3 EI6^3م\醴ڨa:I'OGXwJhgE488c'f̭yR;4 =QƓPXƅ^X}hLe\kU>+R8|*ԎWp >^ iUV%렮o rǦ_y YWQk[a*6Gzs3;MT3x3d=nwYc"\mB\.$Ҩ-LwAr4#)e&}U(ʰ#RjV5!zX\\+%˥<+e۞r=Y{z.THI"$J'.&cf*Xuu1SS1+ƌ8̇Y8yy7KeSP#v|I`z76pE(c4v4ն-DEa " H䀃Y蕌$ҲuXOO( ~/1C便'HPC)(h$dm#S4a1 vcy}!p%:7SL3ܗ+$F `HƗ K]y.$TyCII_uZ( eGYᶾgP0G5 -Þfr@2Yg^n6uSeqeC<;~3ٜMA-H2bg?7wM ylꑱ9ݮ'ld|C;^j-c⍛:7 kfUy4X dÆ{ !!eYS`Z9gK3HS[m3)cZƴ hdEj5;$xZ3 `JE#Ʒ0mڰn}i4Qs>l-B\}Cqks47S" """ """ "Kq=<Kp]<ҫ9b0<.#ػ @o# yaPh};@`(ʺ~9&&V~vz95[mI-=F=U9=` =n3c}+źL91͏WsC?:qMp! :VY]Ora-MLlsM`4c޷[Y/ITk#oYTYx&eD!`-k<¿^NAw(|ٟȍukch dMu\$~)PQ2O%0jv:hi|wGY#-]WStAlJ:xᒪC,hֹc$kTEuVmVܢnz^IN\$IdXՊ$[>Uπw]{};~1Wuni2=DK w\36W'޽ƵkXִ`0ZiڒDWD@DDܐk=dVN+II]%n2]c)%853$nkKNO2^c9YzK`8"-t5VAU-FoA#\Aixps pe2Yu-C[A'|Gj-5ҲJ3~Lvr )Y eH{̽9(tlehU]-`{wTbH`vt=Ox)r|&9(W(Z[M$=:84 7#gS8?R0wt֌F<+H;J颈iϙ?nH/`N@2\ઊZ^_(pu=G[O-<Ʀ9bF;;\欖zO"&9%.#9 !BwHjj޸Npx괜Գw9@e~Jda5 Ú3 2gf;18`a)#472W߫TInHce>lmOEUMLPDȘ5F2]I=aѶY){kdik.fw >jml,,k.ss!1o9pSJJ jj茱?7F6꺞z$R2չΌ3 $8s}%e=K])F׃t0gpv<{Ti{꿭K垖jP2&\8;3|t^R|KUj_RWS|^R|KUj_RWS|^R|KUj_RWS|^R|KUj_RWS|^R|KUj_RWS|^R|KUj_RWS|^R|KUj_RWS|^RSjmS(4>S 0_d? RQ}tsL+?K;=KΗ'٭²?*q2hǃIO"^[ZX٪Jj+2䑾猌.2SI##FZ}u" Xhc=Echh9'Md. ֽ!su 2h殻ceR*q-4=,6c՗I#N?9=h*v~hn9b]r{WYĈ/zj7+WԊHLUk486UQ[8tmd2<46j|'qxf .7ښ9B Mi hDl|llVp}DRGY_LUK:d4`d*q8]fILhqiT~# $`uv..JV;C ?Ei-{22rHQY52 *Xѫ[gCM[Wpcwx[Ըt4`KF>(!}*Q#H ~80 8<l M <=XN/嚴bTxI^dϐ;j ':  /0,>Q .-h\Lk@ثVn1VZj]Aa$h  ox#bAX˿[+ wD7>i]s;d<CUudh9Ă󌆟 ԣG~qΧK- :Կj|'AX_a>'YyeKft,Չeu@eKft,Չeu@eKft,Չeu@eKft,Չeu@eKfй.9Z[Q] s(9+.(`նF Kq#ڹ`*1]NpAI^1GSӘE=L:^%$`NI&YaN5ǽҴ1΢sC2zְqa󯮬.3_W\ ä.qnRKgoZuFikBV5ksNby}.$Gr '6+*op9~MP\/ܷz}/X{4~1GcG GOuZ""" """ """  _rϓQ&N4? yoNc6\=[W=ƾ52i\~%>USXfnђ4*Xօ ¥VU -9?V= NN[m- l]xʖFm٭Yw _8e~=SŎUl2-eʰ)DfVe;١9 OqV$ݑ軃[VR*4Sɽ")IYDCD@DDܐk=dVN+II]%(t?\"">m7-+hhj+ad̆!Hk[3 [9epAǒH;v-k).UԾHjX%yd 8Yn[jU$Z-K6hm,}A.x..l0FCG*5]%Ɗ@isHNs f '3+whj6~ o.tou;m[}AvLa9gsXkmۛ> }h"2B*|흦Vtk9ijs9T.ΧKM$=U;439I֦-hY "v>j Kg 8iI]8\/ܷz 7Qy/c~Ə?&?X^hAHөTWPD@DDD@DDD@DDs!v.sd10 p]9ya4[8~eJU#Dd/*2Wƅv0ȣ9[0*%zVD n8V 6=I_C&Œln>Kcqh';CJ'4)ѽgb[ě!E־:EhV՗ȩTI]bjS$z+$K_uڗJ9N$k_ rIze;OZtĒ%P*'j|k9.1pkp%+twp)"쉝 tyok$ꥁav hk@k@ d D@DDD@ܑ+IId=dPr__ W "S8)uC_' -yn_便WUnZն# !lec_Mx%ౘp-Ɯ⫧S3$x$48='[bOo6MW926ӇrFǼ,gpt6[MV<-G66@մ0a`趕J!gW:>75G ݱ žA=}e#g`u,GF 8#lM}ʞ:gI+ahiw-^qж==`{!Lڈ$K$__ EE{%tCp];gvNN|xx %ֆZ%xglAWm1~S ~.gA|V*"[:)]@~t9mx'GPK[C4:a4- f0O`9ӓ$!nT/dmm3uD7} DrLok:Nytj )[,ΕGSdak mqȎk7(`<( cs N#-5PUIR;Lm-CKy2{ xrU!W=4r!i sA!qW>J8,6ꊊ6>(ukk\Ρیj=Z%Dšn~z%n* "nn "nn "Kq]<ҫKq]<ҫ9b/1q _bAAA&V~vz웧aY_\t" """ ""N_o~*/-o^#_Gd =/'tL~cçS]V""" """ ""첹y_HMp-fqă >^oCG\t6 jׂ_WjѺƯjP e[yJNȍ2fe7)ԭ,2M 7I J6YZsR{Egve v[9Hk)H|/V5Ki#D z(rDI;ucZҠbdVʰZXԾ.e/d[t˯EPYp_M GڏksvDz?+YsYv@;;Hأlq44EKO8chkр;J5MX""`DDD@DDw$Gr@AJR}Y:De''~t?\r__ f(&)\PsJ2њZX% <@S ,t 2ApsS´U2:Yz];dŌlu89d`p}5EQZbxLuv$.+S܌M+g,9#HrfN i6)tvp.c1 kZcZφ51II|qRu푁bOQLT1ypݾw]#'Yd1N*gfTv{9+-d]cMD[=o#wjwB-*㞘 b SNZq,tyP~Y1[zGI#=[9rʙd۬v-q)#.sYs$$hGRޑ{HW_S+H[zEO-")]|}1N>"o>ܥu:bE^"/r/ޑ{HW_S([zEO-")]|}1N>"o>ܥu:bE^"/r/ޑ{m lFǵÀn|}1V+$krN/̺yV7]6/̺yV7@s _b͋C9ނC9ނEM0/,7O?³cԹqND@DDD@DDrr&U._ӗ[ߊFGQ侏ɏz=?P^Nazǣ߱#NS]@DDD@DDD@DDo[%¡EO#=᤯ιuEL?ґy~_IOG۲3F-)*KFM^^v3PfB=Xz"|d+y(0NrTC#N1Xy)&yՓrܕDI֩/VK%DT_CM"rң4JPr rn^ԾEʇ=,v=G\e[\k~諣W\D|Ǹxx(E42Ϫ ?gV2?J!gwv0Xn*C%TNgJ=9$~C'h/.EHfR'~Xey1HvMm:%,ٖJN1wnF 呑O=9i5F  tnyv3KsٌjKe%$"9%%'$z I8$QpŢPxxs%{^Z0u4[r@b,_$S6o,#S7SvN\#n ԋSpJ8wVcNHN^IRH+e3jkܼ?'9;#+|7g9Jo.@p{8G ]Y KY 8CZ^9Zw/6QxXFc^KI x<-: vCMӜdyyi[߽cxZKd4I w3ִzNc-tM,{ asY+\[ $GvnqY.׫tc'#[\3XN.55RL4F`fB@έMA~{-,TY瓎[.n1ԛ="h4}q+pG$~7m]=9-^[mT[dзKѰ 5<4M"6 qg*p%D@DDD@DDܐk=dVN+II]%or__ f Sa7Xj&] :ѹn$7VXI:p~b0@7MS0OO Zzx RKpq;, sXYa:\[aQ27Gi~X=j>>(WC S# F!c#*qW#柫iwZCK=Rmu$sb\3 qHlWOQ  3CcFqO0Fܩ\b/|27MʚU L؜d-C/zS2=nvݷvZ}- mTNʪE!7<u;<EWFClq ^f--ih9-!ެGsQ: 1FS!2C}\PǬ;IV5d9vyCf(:ǚ]slgw{{s]K$ݬN;W ,F2WiDinyg8'+ȡSȡU޺?"O;O"O;WzPN??(<?(]A:P@Z({({wAkȡSȡU޺?"O;Q慰5ෑy=%MADs_0s&/̺yV7]6/̺yV7@s _b͋C9ނC9ނEM0/,7O?³cԹqND@DDD@DDrr&U._ӗ[ߊFGQ侏ɏz=?P^Nazǣ߱#NS]@DDD@DDD@DDI˭>X#X_U~u8Fz.W;/BLrn9RѺ!rJdJ|Ԩʊfj}QXU34HU(S:RUr5@y]iVAUcVcR.X۞KZ N$)*I&pdqܹ< tMKOw]o3ÿ;䠵/FU][LՑ]80_r lllk#hk0/NN)R%hDQ,""" """ #"; gV2?Jz%c)>?+便@S7@7MP5wTDG-\(iՐ^u`<+t{k顯lSWhqg\Gôc[)v5.k,:顫6<iIO/vmS:*˔5G\%ifn{9o}n9XMuΦK?WEK(Ec޶bK칠3N5[ YŒ_&D\я8|;oå7ɪI\CXrwy=\Nf?3';gb-\9<Φɯ-==W6+"sc3yӱipjөmӾyc~JG$L1ݖNòAS\X\!cXX$y8n܌r FCY8Z$z>ɂ[eF+,.pF3`x/IqVæ9:b2|gsZSTAFGVK~Vm/\vYkWTڈ.=$ r2 nah$ Y*Ӫ e0utBb8|eVTV馆05ᅻddmuby*QIKDw#V '#EԾt-a9vG7ݙ35]UZ]5;~}&s}ٟ?G7ݙ3j !yvg'f~L^G7ݙ3s}ٟ?f~Lyvg)s}ٟ?G7ݙ3j !yvg+OIkٸ%d:ϯJKp]<ҫKq]<ҫ9b/1q _bAAA&V~vz웧aY_\t" """ ""N_o~*/-o^#_Gd =/'tL~cçS]V""" """ "" Vc}ktCX+ /Ћ\w4ӏxкhd|o,pz=ѓV6VܯJӗ3%. 7W_1#¬1]jL r4\eV/*VAƫMUcUYVB.XtOip0dz2_1\!wкgp )vW>AՊvP(ՔA t(#lq0ikZ0U," """ """ ""H5XOO+'Y蕉FGPKOҀfE$I~Xm\*z &yd?,{!cޡT=N| Y~X}Ux2gCǽ<=UC>d{̀O,zP: &yd?,{!cޡT=N| Y~X}Ux2gCǽ<=UC>d{̀O,zP: &yd?,{!cޡT=N| Y~X}Ux2gCǽ<=UC>d{̀O,zP: &yd?,{!cޡT=N| Y~X}Ux2gCǽ<=UC>d{̀Q:Bӑ/Q\ϧUop~!4Tn.]ӹA9b/1q _b}POT[rp7'6 )T5Ca46ӽ<6ڀT(;8~c;Ǯ3ZO\7f]gҼ{U/>a+r~=puJ|z5>_ܟ,.{+ _YǮ3Z^5}] 精=puJ|z5>_ܟ,.{+ _YǮ3Z^5}] 精=puJ|z5>_ܟ,.{+ _YǮ3Z^5}] 精=puJ|z5>_ܟ,.{+ _YqӷX> \-²Cc-9qvן>+r ?Pv\NEL{vꮏE4~>aڽ (1غpޠW0*D@DDD@DDD@DDFP45 ijct2y9#T@xn'9sdDNU^q6it |/>uZn0uO8LO']}^,<]7uUNt*UPhg`#ZI[ tWŜC[IJߩ4}`cBME]2U -8JU]MIH1ǟs] ns LY߻=u:j XhiᦦaB4s S6SC7AVWkѝ0ݮ< 씴S Xc 28֎]Esӥ jA " """ """ """ y"*敊7Ŏek=5ŔZBi|ԭ=</OOɏRsݥE غeļcl >y<)?&?Y>atStXJ>i?[U> &cd یe+me (x-i-n^ Z\vn~OO\XZˌ􍙵~P֊ fDغBTeY *K!dv<ō~ #'ff)uOP'Z}V?P{%wTrwQ4Ძnu4TFH"-7lJOI?YjhٟQW=S:#"k'c- np{el]=Mʒ,PI#3j4혽ҺdvMT;6==u uE\2 5ʦ7gWƒs {3bh݋v.b~`Y<ՏH mʟaZqкd9iZ\~+?uog s>J|Pod߹˯ϒ39O ̺)s>J|Pod߹˯ϒ39O ̺)s>J|Pod߹˯ϒ39O ̺)s>J|Pod߹˯ϒ39U7Ze~gOBZxmG̷EaJ<أ   "" """ """ ""*_ Dlk5ø*θ=2T,KR4t "b*GiN[R~{sO](ϕttx5^[Zy.h "?% o:S6_NUOOO@z3p l7 7GI{ ^^oi_?o)^_?o)OGc0n鋣 ~2 3UG3+Ӻ4T[j\gڼ)))(L2[ϡM26Glҫ>oOOO@zg7} 2pmc W&@vs)-;s ǫ _L=Mվ>"|SDrǶsF x!Y=7p!Ė>W̼)))(L1?ϡ? ]gм)))(L1quBOSWĆYh*4u~<?%>?%t%Xΰts[0v| 5duB7=3gm>nV'. 5󿬐Y;Hn}h/5| ~J,=6ޚxbo2N&cN*SHop suUId]O+ %%N}Zm%oxF 6]1s,,u; :ZݐmB7H0ЦH`" >`&搚BBi >i /&搚BBi >i /&" """ """ """ """ """ """ """ """ 0XKvY9,mg"v[-6c殟qZ_2rOϙoO歠4y'߼ #|w>eH2|]ϙn>.̟~[ 4y'߼ #|w>eH2|]ϙn>.̟~[ 4y'߼ #|w>eH2|]ϙn>.̟~[ 4y'߼ #|{>eM}ipVjm/0fhOe-H \D@DDD@DDD@DDD@DDD@mayavi-4.5.0/DEVELOPING.rst0000644000076500000240000000120612747716313015612 0ustar prabhustaff00000000000000 Building documentation ========================= In the top-level directory, run:: python setup.py build_docs Uploading docs on the web page ================================= The docs live on their own gh-pages git branch. So to update, starting from the root of the project here is what you do:: # Recompile docs cd docs/ make html # Copy to other branch cd .. git checkout gh-pages cp -r docs/build/tvtk/html/* tvtk/ cp -r docs/build/mayavi/html/* mayavi/ git add tvtk mayavi # Commit and push new docs git commit -a -m "Updated docs" git push # Return to master branch git checkout master mayavi-4.5.0/docs/0000755000076500000240000000000012747722127014355 5ustar prabhustaff00000000000000mayavi-4.5.0/docs/API.txt0000644000076500000240000000217412747716313015533 0ustar prabhustaff00000000000000Public and private APIs in TVTK and Mayavi =========================================== In general the following page documents the version numbers of each Mayavi project release: https://github.com/enthought/mayavi/releases However, not everything released as part of the project is really a public API that we guarantee to ensure. Public API's are those that will follow the above scheme. If we don't its a bug and you should tell us. However, the internal implementation and private API's may change between patch level or minor versions. This document attempts to document what we call public and private. Public API: - The core object model (not the UI, the UI views or the UI related implementation). - Public methods and traits. - Essentially, all the features used in the examples distributed with the source will honor the versioning scheme. Private API: - All protected/private methods (those with a leading underscore). - Implementation details of TVTK, like the array and object cache (these variables actually have leading underscores). - Internal implementation of persistence. mayavi-4.5.0/docs/CHANGES.txt0000644000076500000240000016737112747716313016205 0ustar prabhustaff00000000000000Mayavi 4.5.0 ============ Enhancements ------------ 21 Jul 2016 `#415 `_ (PR) - Jupyter notebook support! Adds support for displaying Mayavi images or x3d scenes on the notebook. The x3d scenes allow one to fully interact with the scene in the notebook. More documentation is available at :ref:`jupyter_notebook`. 09 Jul 2016 `#411 `_ (PR) - Adds support for recording movies and animating timesteps. See :ref:`animating_a_timeseries` and :ref:`animating_a_visualization` for more details. 07 Jul 2016 `#410 `_ (daytonb) - Updated LUTs to include new matplotlib colorschemes, this includes the new viridis colormap. Fixes ----- 30 Jul 2016 `#416 `_ (PR) - Fix several bugs, `#397 `_ where PDF files were not saved properly. Fix issues with ``tvtk.visual`` and add many tests for it, this fixes `#387 `_. Refactor the save screenshot dialog popups. Fix problem with the picker point not showing when "p" is pressed on the scene. 29 Jul 2016 `#417 `_ (patricksnape) - Python 3 fixes for the jupyter notebook support. 08 Jul 2016 `#413 `_ (PR) - Fixes `#388 `_ where tubes were not showing on protein demo. 03 Jul 2016 `#408 `_ (ryanpepper) - Add additional save options. 04 Jul 2016 `#406 `_ (PR) - Fixes `#403 `_ where the image plane widget and volume modules were broken. 06 Jul 2016 `#405 `_ (itziakos) - Debug info on code gen for wrapper generation. 16 Jun 2016 `#394 `_ (PR) - BUG: Fix slice unstructured grid module. 17 Jun 2016 `#391 `_ (SiggyF) - Fix typo in readme. 13 May 2016 `#386 `_ (itziakos) - update codecov configuration 04 May 2016 `#376 `_ (stefanoborini) - Documentation for QString API failure. 04 May 2016 `#375 `_ (stefanoborini) - Fixes incorrect signature of ``EnvisageEngine.new_scene``. 03 May 2016 `#374 `_ (stefanoborini) - Fix for unexpected test code. 13 May 2016 `#370 `_ (kitchoi) - Fix "_p_void" values in TVTK with VTK 6.x 29 Apr 2016 `#364 `_ (stefanoborini) - Fix failing test for custom import in some circumstances 27 Apr 2016 `#358 `_ (stefanoborini) - Removes ``array_ext.so/pyd`` on clean 25 Apr 2016 `#356 `_ (stefanoborini) - Check if test successful with the appropriate filename. 27 Apr 2016 `#355 `_ (stefanoborini) - Unicode trait handling for those vtk methods returning unicode data 24 Apr 2016 `#352 `_ (kitchoi) - ENH: Nice load pylab_luts.pkl 27 Apr 2016 `#351 `_ (stefanoborini) - Document object identity behavior matching VTK 21 Apr 2016 `#349 `_ (kitchoi) - Revert "Fix savefig size and black image" 27 Apr 2016 `#348 `_ (stefanoborini) - Added setup.py documentation for Qt requirements 27 Apr 2016 `#345 `_ (kitchoi) - Add VTK 6.3 and VTK 7 to travis ci 20 Apr 2016 `#341 `_ (kitchoi) - Fix traitsdoc setup and compliance with py3 20 Apr 2016 `#340 `_ (kitchoi) - Import and integer division in python3 20 Apr 2016 `#335 `_ (kitchoi) - Fix texture on ``mlab.surf``, issue `#211 `_. 20 Apr 2016 `#334 `_ (stefanoborini) - Fixes Quiver3d Failure with different argument types 20 Apr 2016 `#332 `_ (kitchoi) - Fix Text3D in VTK 6.0+ 21 Apr 2016 `#331 `_ (kitchoi) - Fix savefig size and black image 20 Apr 2016 `#330 `_ (stefanoborini) - Fix for exception when modifying extents 01 Apr 2016 `#329 `_ (stefanoborini) - Suppresses test for VTK 6.2 (solves appVeyor random failure) 20 Apr 2016 `#327 `_ (stefanoborini) - Forces pipeline update when LUT changes 01 Apr 2016 `#326 `_ (stefanoborini) - Fix for test failure on mayavi -t 28 Mar 2016 `#323 `_ (stefanoborini) - Enforce ordering of attribute labels in VTKDataSource. 28 Mar 2016 `#315 `_ (stefanoborini) - Apply has_attribute to the output in VTKFileReader 17 Mar 2016 `#313 `_ (kitchoi) - Replacing links to code. and svn.enthought.com 09 Mar 2016 `#310 `_ (kitchoi) - Fix Camera off-centered when loading saved visualization 09 Mar 2016 `#309 `_ (PR) - Update to use new VTK pipeline where possible. This fixes a number of issues with the pipeline was not updating properly. 09 Mar 2016 `#306 `_ (kitchoi) - Fix issue with ``mlab.move`` 01 Apr 2016 `#304 `_ (kitchoi) - Fix issue `#302 `_, segfault when savefig is called multiple times. 09 Mar 2016 `#303 `_ (kitchoi) - Fix get_engine behavior when backend is changed again. Mayavi 4.4.4 ============ Enhancements ------------ 21 Jan 2016 (PR) - Add experimental Python3 support Fixes ----- 27 Feb 2016 (PR) - Ensure the cut plane is updated when the plane is changed in the GUI 27 Feb 2016 (kitchoi) - Use off screen engine when mlab's offscreen option is enabled 26 Feb 2016 (mabl) - Cast the window id to an int in the render window interactor 27 Feb 2016 (kitchoi) - Update installation guide 27 Feb 2016 (PR) - Update docs to use Qt instead of wx 24 Feb 2016 (kitchoi) - Update documentation setup 24 Feb 2016 (PR) - Allow TVTK to be used without UI/X server 23 Feb 2016 (kitchoi) - Update documentation links 17 Feb 2016 (kitchoi) - Make sure the array shape and size match 17 Feb 2016 (IT) - Ensure __file__ attribute points to the correct path when running a script from Mayavi2 09 Feb 2016 (jonathanrocher) - Avoid multiple identical keys in keyPressEvent. This is observed on slow machines 22 Jan 2016 (IT) - Do not use get-pip or wheel to upgrade pip on appveyor 10 Sep 2015 (alexendreleroux) - Fix broken link in docs left hand side menu bar Mayavi 4.4.3 ============ Enhancements ------------ 01 Jul 2015 (IT) - Update the readme fixing dead links 01 Jul 2015 (IT) - Use new Travis CI containers for faster builds 22 Jun 2015 (IT) - Add CI tests on Windows using Appveyor Fixes ----- 11 Aug 2015 (DS, IT, PR) - Remove reference cycles from various objects to fix memory leaks. Add unit test that provides an API to test garbage collection. 10 Aug 2015 (PR) - Fix the LUT manager to select the correct lut mode for QT backend 04 Aug 2015 (IT) - Use the python-wxtool package to speed up Travis CI build 04 Aug 2015 (DS) - Fix TVTK wrapper to allow look up with long keys for Points 23 Jul 2015 (DS) - Fix glyph to handle the masking of input points 22 Jul 2015 (IT) - Update the docs with known bugs, issues list and describe the PR workflow on github for development and documentation. 20 Jul 2015 (DS) - Fix TVTK wrapper to update number of cells when a cell is inserted in a VTK cell array 15 Jul 2015 (DS) - Fix VKTFileReader to update output when using standalone 24 Jun 2015 (PR) - Fix the sdist command Mayavi 4.4.2 ============ Enhancements ------------ 11 Jun 2015 (DS) - Upgrade the VTK parser to add support for VTK 6.2. Mayavi 4.4.1 ============ Fixes ----- 23 Apr 2015 (DS) - Fix trackpad scrolling to zoom in/out smoothly on OS X. Mayavi 4.4.0 ============ Enhancements ------------ 22 Dec 2014 (DS) - Add function to set data at input port, add stanford (bunny, dragon, lucy) examples, and use new volume mapper for new pipeline. 24 Jan 2014 (DS) - Upgrade to VTK 6.0 with VTK's new pipeline. Fixes ----- 22 Dec 2014 (DS) - Support dynamic dimensions in array source. 03 Dec 2014 (paulmueller) - Fix MRI brain data URL. 13 Nov 2014 (DS) - More fixes for connection topology, information request and tube filter after upgrading to new pipeline. 24 Sep 2014 (pberkes) - Handle the non-Latin-1 keypresses. 23 Sep 2014 (rkern) - Prevent ndarray comparisions with None. 17 Jul 2014 (mdickinson) - Fix the trait error raised when the threshold range is updated. 24 May 2014 (markkness) - Update installation documentation links. 21 Apr 2014 (PR) - Fix integration tests after upgrade to VTK's new pipeline. Mayavi 4.3.1 ============= Enhancements ------------ 20 Jan 2014 (PR) - New example `mlab.test_mesh_mash_custom_colors` illustrating masking and a custom color map. 12 Jan 2014 (PR) - Enabled Travis-CI for the repo. 17 Dec 2013 (dmsurti) - Upgrade to VTK 5.10.1 with VTK's old pipeline. This upgrade does not yet make use of VTK's new pipeline. 07 Aug 2013 (pratikmallya) - Added interactive superquadrics example. Thanks to Pratik for contributing this example. 03 Jun 2013 (PR) - Refactor the animation component so that corresponding examples display animations. Fixes ------ 27 Jan 2014 (PR) - Many fixes to the test suite so the unit tests and integration tests all pass on OS X, Linux and Windows 32 and 64 bit with VTK 5.6. 08 Jan 2014 (PR) - tvtk_doc: Fix search when user enters a search string. 09 Jan 2014 (mindw) - Fix creation of scripts on win32 using gui_scripts. Thanks to Gabi Davar for this fix. 23 Dec 2013 (jenshnielsen) - Fix imshow by handling TraitError. Thanks to Jens Nielsen for this fix. 05 Apr 2013 (mindw) - Fix class browser when VTK is built with QT/SIP support. Thanks to Gabi Davar for this fix. 05 Apr 2013 (mluessi) - Fix wxpython 2.9 compatibility. Thanks to Martin Luessi for this fix. 19 Aug 2013 (senganal) - Fix MGlyphSource when assigning multi dimensional arrays to individual components of vector data. Thanks to Senganal for this fix. - Fix inconsistent handling of scalars. Thanks to Senganal for this fix. 10 Jun 2013 (PR) - Fix to use front buffer when off screen is False. Mayavi 4.3.0 ============= Enhancements ------------ 30 Oct 2012 (PR) - NEW: Adding a Qt version of the gradient editor. With this, all of Mayavi's UI should be usable on Qt. Fixes ------ 11 Mar 2013 (Aestrivex) - Fixed bug with incorrectly tiled snapshots while using savefig. 30 Oct 2012 (PR) - BUG: Qt: fix crashing full-screen-mode. Fixed segfault when you click on full-screen and press escape/q/e. Mayavi 4.2.1 ============= Enhancements ------------ 9 August 2012 (GV) - ENH: Add null engine to mlab.pipeline.open. Mayavi 3.4.0 (Oct 15, 2010) =========================== Enhancements ------------ 22 July 2010 (GV) - ENH: Add error management for extents in mlab: some module cannot be scaled [25683]. 16 July 2010 (GV) - ENH: Enable LUT defined by tables to have their number of colors adjusted [25663]. Fixes ------ 2 August 2010 (GV) - BUG: Fix a segfault when updating lines on a MLineSource using 'reset' and reducing the number of points [25700]. 1 August 2010 (GV) - BUG: Fix updating scalar scatters using mlab_source.set: a race condition under Qt prevented the scalar range to be updated in time [25699]. 25 July 2010 (GV) - BUG: Fix corner cases in the pipeline browser: objects for which the number of inputs is misreported, and iterable objects to do not contain TVTKBase entries [25685,25686]. 14 July 2010 (GV) - BUG: Fix a bug in the poll_file example. Thanks to Jonathan Guyer for pointing out the solution [25660]. Mayavi 3.3.2 (May 25, 2010) =============================== Enhancements ------------ DOCs: many docs and example improvements (GV). 13 April 2010 (GV) - API: Enforces wx >= 2.8 [25465,25471,25529] 11 April 2010 (GV) - ENH: Add figure management to mlab.roll [25464]. 6 March 2010 (GV) - MISC: Change the default in iso_surface to compute normals, as with recent VTK versions colors look ugly when normals are not computed [25400]. Fixes ------ 17 May 2010 (PR) - BUG: Fixing wrapping for VTK-5.6 and above where one of the string traits default to a value with a special character like "\n" "\r" [25546]. 17 April 2010 (GV) - BUG: Fix integer casting in magnification for mlab.savefig [25483] 5 April 2010 (GV) - BUG: A slight modification to enable inserting graph objects in the Mayavi pipeline: the polydata created by the GraphToPolyData filter had some 'None' arrays in their point_data [25434]. 3 April 2010 (GV) - BUG: Make the 'use_lookup_table' traits of the image_plane_widget work. [25430] Mayavi 3.3.1 (Feb 24, 2010) =========================== Enhancements ------------ 20 Dec, 2009 (GV): - ENH: Merge in Scott Wart's patch to add an 'ImageChangeInformation filter to ArraySource, with additional work to get the tests to pass [25036], [25043] 14 Dec, 2009 (GV) - ENH: Add helper functions to interact with object via callbacks by clicking on them. The core function is the scene.on_mouse_pick, that is demoed in the new example 'on_mouse_pick' [25016], [25019] 13 Dec, 2009 (GV): - ENH: Make array_handler more robust to buffer protocole [25013] - ENH: Add support for assigning numbers to MGlyphSource x, y, z, and u, v, w [25015] 27 Nov 2009 (GV): - ENH: Add an auto mode for mlab.view, for distance and focal point [24971] 26 Nov, 2009 (GV): - ENH: Add a probe_data to retrieve data from Mayavi or VTK objects [24966] 25 Nov, 2009 (GV): - ENH: Usability: change the label of the '*.*' extension in th decorated scene save snapshot dialog [24963] 12 Oct, 2009 (GV): - ENH: Add script recording to the widget position for the DataSetClipper filter [24826] 17 Sep, 2009 (PR): - ENH: Making the widgets recordable [24738] 02 Sept 2009 (GV): - ENH: Add a new glyph source: a cross, that can be used as a cursor, or a axes [24678] 02 Sep, 2009 (GV): - ENH: Add a figure argument to mlab.view and try to lift the figure on screenshot [24676] - DOC: Add a detailed example of using 'UserDefined' contributed b Emmanuelle Gouillart [24677] 20 Aug, 2009 (PR): - ENH: Don't persist mlab_source [24567] 14 Aug, 2009 (GV): - ENH: Stop gap solution to limit the cost of auto-scaling the glyph size with large arrays in barchart, when the positionning is implicite, and thus distance calculation is pointless [24526] - ENH: Do not update the rendering of the scene when using mlab helper functions that build one object after another [24529] - ENH: Add an argument to barchart to avoid expensive scaling computation [24531] - ENH: Make the scalars argument of mlab.pipeline.vector_field work with lists too [24532] 13 Aug, 2009 (GV): - ENH: Force an update of the data when using the set_active_attribute filter, so that the names of all defined arrays are displayed [24464] [24466], [24520], [24521], [24520] 04 Aug, 2009 (GV) - ENH: Add a screenshot function to mlab for easy capture of the pixmap to [24445] - ENH: Add a patch contributed by Chris Colbert for control of the array type in mlab.screenshot (rgb vs rgba) [24453] 03 Aug, 2009 (GV): - MISC: Fix long-standing usability complain: OK button on adder nodes not creating object [24443] 03 Aug, 2009 (PR): - ENH: Adding to/from_array to the Matrix4x4 class for convenience [24437] - ENH: Thanks to a suggestion from Gary Ruben, mlab.plot3d now uses tvtk.Stripper in the pipeline to produce smooth tubes [24438] [24442] [24439] 01 Aug, 2009 (GV): - DOC: Merge in Ondrej's more precise instructions on installing SVN on an already-installed system [24428] 15 Jul, 2009 (GV): - ENH: Open the possibility to have image plane widget working with RGBA data [24169] 10 Jul, 2009 (GV): - ENH: Allows for use of lists as a scalar argument in mlab function [24094] 09 Jul 2009 (PR): - ENH/API: Checking in patch from Erik Tollerud which adds a `move`, `yaw and `pitch` to the mlab camera. Many thanks to Erik for this patch [24083], [24084] 08 Jul, 2009 (GV): - ENH: Capture any errors while building docs and fail gracefully during the build [24067] 08 Jul, 2009 (GV): - ENH: Try to force the use of wx2.8, or else do not display the logger [24064], [24060] 07 Jul, 2009 (GV): - ENH: Add a button and a menu entry to display the VTK documentation browser [25058] 22 Jul, 2009 (Dave Peterson): - Updated all __init__.py files with modulefinder code so that py2app/py2exe can correctly determine what to include when packaging a distribution. This is necessary due to the use of namespace packages [24339] Fixes ----- 21 Feb, 2010 (GV) - BUG: Make the threshold filter better behaved when there are nans in the data [25280] - BUG: Remove callbacks on OrientationAxis that where triggering useless redraws [25279] 15 Feb, 2010 (PR): - BUG: Fix issue when an automatically generated trait name was actually Python keyword. In these cases the trait name is simply appended with a underscore (_). This should hopefully fix problems with building TVTK with VTK from CVS [25236] 12 Feb, 2010 (Scott Warts): - Reset the current scene if it is removed [ 25219] 08 Jan, 2010 (GV): - BUG: Radius and length of a cylinder had upper bounds to 100, where they should really be confined only to positive numbers. Fix with kludge. Thanks to Michele Mattioni for pointing out the bug, and providing the patch [25097] 20 Dec, 2009 (GV): - BUG: Correct bug with visibility of OrientationAxes reported by Uche Mennel [25037] - BUG: Patch by Varun Hiremath to make build docs more robust [25039] - BUG: Fix scalarbar positionning for VTK >= 5. [25040] - BUG: Avoid a segfault when enabling the OrientationAxes without an interactor [25044] - MISC: Disable the use of IPython by default, there are right now too many bugs with it [25041] 14 Dec, 2009 (GV): - BUG: Fix test on pick dispatcher [25020] - BUG: Fix a bug in tvtk.py, in the loading of tvtk classes generated code when the path is not in the sys.path Thank you to Ram Rachum for finding this problem, and the fix [25021] 26 Nov, 2009 (GV): - BUG: Add forgotten file. Thanks to Darren Dale for reporting [24967] - BUG: Fix mlab.pipeline.get_vtk_src for VTK dataset [24968] 25 Nov, 2009 (GV): - BUG: Fix a bug in barchart [24962] 18 Nov, 2009 (Scott Warts): - Don't reset the zoom level if there are volumes or actors. Before we were just checking for actors [24932] 04 Nov, 2009 (GV): - BUG: mlab.clf() was renabling rendering on figures, had it been disabled [24874] 22 Oct, 2009 (Scott Warts): - BUG: Fixed memory leak. Switched to using tvtk.messenger when adding observers to keep from creating uncollectable cycles [24856], [24857] 14 Sep, 2009 (GV): - BUG: Fix trivial bug when size in savefig was not specified, and magnification was set to auto [24733] 19 Aug, 2009 (GV): - BUG: Fix 'feature' of mlab.colorbar which would show up on objects with scalar representation not enabled [24559] 19 Aug, 2009 (PR): - BUG: Fixing some of the issues with colorbar and VTK versions greater than 5.2 [24558] 18 Aug, 2009 (GV): - BUG: The figure magnification was not working correctly. Fix [24569] - BUG: Fix a traceback in mlab.show_pipeline if no scene was open [24553] 17 Aug, 2009 (PR): - BUG: TVTK was not correctly wrapping newer versions of VTK Specifically the vtkArray class was causing a traceback. This patch appears to fix the problem. Thanks to Kyle Mandli for helping with debugging this issue and testing the fix 14 Aug, 2009 (GV): - BUG: Fix a bug when reseting the MlabTriangularMeshSource: when growing the number of points, triangles were created before the corresponding points. Thanks to Ondrej Certik for reporting this one 08 Aug, 2009 (GV): - BUG: Fix a bug for with the notebook in wx example for which objects were not added to the right scene [24492] 07 Aug, 2009 (Scott Warts): - Added two more exceptions to state methods from ImageReslice: SetOutputOriginToDefault and SetOutputExtentToDefault [24480] 06 Aug, 2009 (PR): - BUG: vtkImageReslice's SetOutputSpacingToDefault does not make OutputSpacing a state method. Thanks to Scott Swarts for pointing this out [24476] 01 Aug, 2009 (Robert Kern): - BUG: With a vtkWin32OpenGLRenderWindow, set the parent widget info before resizing in order to avoid an offset bug [24427] 23 Jul, 2009 (Evan Patterson): - BUG: Replacing deprecated calls to wx.Yield() [24379] Mayavi 3.3.0 (July 15, 2009) ============================ Enhancements ------------ 06 Jul, 2009 (PR): - ENH/API: No longer save to a file (with a popup when a user unchecks the record icon). Also added `start_recording` and `stop_recording` functions to mlab to make it easier to do this via scripts [24048] 08 Jul, 2009 (GV): - ENH: Make the MlabSceneModel manage the mlab current scene so that in plots to the embedded scene, but does not upset the current mlab figure [24040], [24065] 05 Jul 2009 (GV): - ENH: Add the possibility to specify figures to mlab.figure by instance rather than name [24039] - ENH: Add an example of using multiple mlab scene models [24041] - ENH: Add a figure keyword argument to mlab.pipeline factories to control which figure objects are added on [2403] 02 July, 2009 (PR): - ENH: The record icon on the engine view is smarter now and will automatically be checked on and off if the engine's recorder trait in set. This paves the way for a convenient mlab one liner to start recording [24025] 01 Jul, 2009 (PR): - NEW: Adding a new filter that clips an input dataset. Also added an `ImplicitWidgets` component that abstracts a box, plane, sphere and implicit plane widget into one reusable component. An initial patch was contributed by Suyog and them modified by PR. Many thanks to Suyog for this patch [24017] 01 Jul, 2009 (GV): - ENH: Add an mlab.close function to close figures controled by mlab [24006] 30 Jun, 2009 (PR): - ENH/API: Checking in improved patch sent by Suyog along with fixes from me. This adds a can_read_test metadata attribute for sources which can be optionally specified, the function should return True if the reader can read a given file. The patch also adds a volume reader and a chaco reader and also supports the .xyz format reader provided in VTK. A test for the new registry functionality is also added. The API has only changed for the manner in which the registry is queried for a reader using the file itself rather than the file extension. Many thanks to Suyog for this work [24002] 29 Jun, 2009 (GV): - ENH: Add an option to show_engine to show the rich view [23981] 14 Jun, 2009 (GV): - BUG: mlab.set_engine was not registering engines, causing testing to be difficult [23819] - ENH: expose text3d in mlab [23820] - ENH/TEST: rewamp the mlab testing infrastructure [23822] 13 Jun, 2009 (GV): - ENH: Adapt mlab.savefig code to make it easier to save figures with size larger than window size [23813] - ENH: Add a text3d module, for displaying text located in the 3D scene scaling and hiding as the other 3D actors [23809], [23810]. - ENH: Add a helper function to mlab to syncronize cameras on two scenes [23814] 10 Jun, 2009 (PR): - API: The name of the scene created on the mayavi2 app now defaults to "Mayavi Scene %d" rather than "TVTK Scene %d". This is to make this consistent with what `mlab.figure()` does and to avoid user confusion [23787] 2 Jun, 2009 (PR): - ENH: Ensuring that the scene editor's name is synced with the scene' name. Also making the scene itself "renamable" [23710] 29 May, 2009 (PR): - ENH: Also pickle the name of the scene -- it shouldn't hurt [23691] 18 May, 2009 (GV): - ENH: cleaner exception capture for sensible error message [23660] 10 May, 2009 (GV): - ENH: Use pickle rather than numpy npz for lookup table [23618] [23619] - API: Add PipelineBase to mayavi.core.api as it is needed for the interactive example [23617] 9 May, 2009 (PR): - ENH/API: Adding to the API of the lut manager with a show_legend boo which is an alias for show_scalar_bar. This makes the UI a littl clearer [23608] - ENH: Adding ID's to the various pop-up editors for the lut manager s their sizing etc. is persisted [23609] - ENH/API: Exposing the scalar_bar_widget's representation in the UI an API and recording it so changes to the scalar bar's position ar recorded and editable on the UI [23610] 20 Apr, 2009 (GV): ENH [23545]: - Add an example gallery to the documentation - Rewamp the documentation-generation code, and its packaging. Th generation code was made more robust, and as a result n generated test files are checked in svn. The images for th mlab documentation and the mlab examples are generated by th render_images.py script - Space has been optimized by removing duplicated artwork an moving outside of the source distribution files no required for distribution 19 Apr, 2009 (GV) - ENH: Use numpy's npz format for storing LUT information. This saves ~1Mo from the source and binary distributions[23544] 11 Apr, 2009 (GV): - ENH/API: add an API module to core, to give a central place for important core import [23520] Fixes ----- 15 Jul, 2009 (PR): - BUG: Fix what I think is a long standing bug. You couldn't use the envisage backend with mlab because of a problem with envisage'. workbench application. I've worked around the problem in mayavi' workbench subclass and added a test to ensure that this is now fixed This basically adds a new trait to the Mayavi app and the mayavi workbench application called `start_gui_event_loop` that is disabled when used from mlab [24171] 6 Jul, 2009 (Dave Martin): - BUG: If the scene being closed has None for scene.scene, call registry.find_scene_engine(scene) instead of "scene.scene" [24052] [24055] 05 Jul, 2009 (GV): - BUG: small fix for successive builds of the tvtk code generation, by Rakesh Pandit [24038] - BUG: Do not create application directories on import of mayavi preferences. [24036] 29 Jun, 2009 (GV): - BUG: Make sure that the vertical vector source used for barchart is well-behaved with regards to mlab_source.update [23983] 28 Jun, 2009 (PR): - BUG: Mlab's barchart uses the scale_by_vector_components which was not exposed by the glyph component leading to update problems reported by Christian Vollmer. This is now fixed along with a simple test case. There are deeper problems with barchart that do need attention though - if a user changes the data inplace and calls the mlab_source.update() nothing updates correctly since the data is really copied over to the vector components. This can be fixed with a callback and will be done later. [23980] 25 Jun, 2009 (PR): - BUG: Was checking for attribute in editor assuming they were all scene editors which is clearly wrong. This bug fixes problems with using mayavi and a text editor say [23933] 2, Jun 2009 (PR): - BUG: With recent versions of VTK when a VTK array is exported to a numpy array, the numpy array is already a view so resetting the VTK array back to the numpy array for some reason triggers a segfault. This is now fixed [23711] - BUG: The Engine's open method did not work with a null engine. Tested and fixed [23713] 30 May, 2009 (PR): - [TVTK] BUG: Working around problem with parser for vtkRenderedGraphRepresentation which has non-standard arguments for some of its SetIvarToState methods [23696] 26 Lay, 2009 (GV): - BUG: Fix scaling bug for surf with warp_scale='auto'. Thanks to Jakob Rohrhirsch for reporting it [23682] 6 May, 2009 (PR): - BUG: The implicit plane widget was not recordable [23595] - BUG: [mlab] mlab.pipeline.contour_grid_plane was broken [23596] 27 Apr, 2009 (GV): - API: add an API module for core.ui [23562] - DOC: Put up to date information on the engine [23560] 23 Apr, 2009 (GV): - DOC: Add an example to show how you can have different engines in an application [23558] 13 April, 2009 (PR): - BUG: The trailing '|' in the wildcard breaks the file dialog's filterin for user defined readers. Thanks to B. P. Thrane for reporting the bug 27 March, 2009 (GV): - BUG: Fixed bug with importing customization contributions. Added a test case for this. Thanks to Mario Ceresa for reporting the bug [23438] 23 March, 2009 (GV): - BUG: Fix TVTK possible build failure, reported by Andrew Straw https://bugs.launchpad.net/bugs/34693 [23371] 20 March, 2009 (PR): - TEST/BUG: Adding a new test for the `tvtk.util.ctf` utility functions. Also fixed a bug that affects VTK-5.2 and above where the range of the CTF must be set [23267] - BUG/CLEAN: Fixing a 5.2 specific bug in the volume module mlab function Also cleaned up the mlab code for this a little [23268] Mayavi 3.2.0 (March 23, 2009) ============================= A log of significant changes made to the package especially API changes. This is only partial and only covers the developments after the 2.x series. 17, 18 March, 2009 (PR): - NEW: A simple example to show how one can use TVTK's visual module with mlab. [23250] - BUG: The size trait was being overridden and was different from the parent causing a bug with resizing the viewer. [23243] 15 March, 2009 (GV): - ENH: Add a volume factory to mlab that knows how to set color, vmin and vmax for the volume module [23221]. 14 March, 2009 (PR): - API/TEST: Added a new testing entry point: 'mayavi -t' now runs tests in separate process, for isolation. Added ``mayavi.api.test`` to allow for simple testing from the interpreter [23195]...[23200], [23213], [23214], [23223]. - BUG: The volume module was directly importing the wx_gradient_editor leading to an import error when no wxPython is available. This has been tested and fixed. Thanks to Christoph Bohme for reporting this issue. [23191] 14 March, 2009 (GV): - BUG: [mlab]: fix positioning for titles [23194], and opacity for titles and text [23193]. - ENH: Add the mlab_source attribute on all objects created by mlab, when possible [23201], [23209]. - ENH: Add a message to help the first-time user, using the new banner feature of the IPython shell view [23208]. 13 March, 2009 (PR): - NEW/API: Adding a powerful TCP/UDP server for scripting mayavi via the network. This is available in ``mayavi.tools.server`` and is fully documented. It uses twisted and currently only works with wxPython. It is completely insecure though since it allows a remote user to do practically *anything* from mayavi. 13 March, 2009 (GV) - API: rename mlab.orientationaxes to mlab.orientation_axes [23184] 11 March, 2009 (GV) - API: Expose 'traverse' in mlab.pipeline [23181] 10 March, 2009 (PR) - BUG: Fixed a subtle bug that affected the ImagePlaneWidget. This happened because the scalar_type of the output data from the VTKDataSource was not being set correctly. Getting the range of any input scalars also seems to silence warnings from VTK. This should hopefully fix issues with the use of the IPW with multiple scalars. I've added two tests for this, one is an integration test since those errors really show up only when the display is used. The other is a traditional unittest. [23166] 08 March, 2009 (GV) - ENH: Raises an error when the user passes to mlab an array with infinite values [23150] 07 March, 2009 (PR) - BUG: A subtle bug with a really gross error in the GridPlane component, I was using the extents when I should really have been looking at the dimensions. The extract grid filter was also not flushing the data changes downstream leading to errors that are also fixed now. These errors would manifest when you use an ExtractGrid to select a VOI or a sample rate and then used a grid plane down stream causing very wierd and incorrect rendering of the grid plane (thanks to conflation of extents and dimensions). This bug was seen at NAL for a while and also reported by Fred with a nice CME. The CME was then converted to a nice unittest by Suyog and then improved. Thanks to them all. [23146] 28 February, 2009 (PR) - BUG: Fixed some issues reported by Ondrej Certik regarding the use Of mlab.options.offscreen, mlab.options.backend = 'test', removed cruft from earlier 'null' backend, fixed bug with incorrect imports, add_dataset set no longer adds one new null engine each time figure=False is passed, added test case for the options.backend test. [23088] 23 February, 2009 (PR) - ENH: Updating show so that it supports a stop keyword argument that pops up a little UI that lets the user stop the mainloop temporarily and continue using Python [23049] 21 February, 2009 (GV) - ENH: Add a richer view for the pipeline to the MayaviScene [23035] - ENH: Add safegards to capture wrong triangle array sizes in mlab.triangular_mesh_source. [23037] 21 February, 2009 (PR) - ENH: Making the transform data filter recordable. [23033] - NEW: A simple animator class to make it relatively to create animations. [23036] [23039] 20 February, 2009 (PR) - ENH: Added readers for various image file formats, poly data readers and unstructured grid readers. These include DICOM, GESigna, DEM, MetaImage (mha,mhd) MINC, AVSucd, GAMBIT, Exodus, STL, Points, Particle, PLY, PDB, SLC, OBJ, Facet and BYU files. Also added several tests for most of this functionality along with small data files. These are additions from PR's project staff, Suyog Jain and Sreekanth Ravindran. [23013] - ENH: We now change the default so the ImagePlaneWidget does not control the LUT. Also made the IPW recordable. [23011] 18 February, 2009 (GV) - ENH: Add a preference manager view for editing preferences outside envisage [22998] 08 February, 2009 (GV) - ENH: Center the glyphs created by barchart on the data points, as mentioned by Rauli Ruohonen [22906] 29 January, 2009 (GV) - ENH: Make it possible to avoid redraws with mlab by using `mlab.gcf().scene.disable_render = True` [22869] 28 January, 2009 (PR and GV) - ENH: Make the mlab.pipeline.user_defined factory function usable to add arbitrary filters on the pipeline. [22867], [22865] 11 January, 2009 (GV) - ENH: Make mlab.imshow use the ImageActor. Enhance the ImageActor to map scalars to colors when needed. [22816] Mayavi 3.1.0 ============ 3 December, 2008 (PR) - BUG: Fixing bugs with persistence of VTKDataSource objects wrapping a structured grid in VTK-5.2. This resulted in hard to debug test errors. [22624] 1 December, 2008 (GV): - API: Promote the TestEngine to a first-class citizen NullEngine and make mlab use it when a source has a keyword argument "figure=False". [22594] 30 November, 2008 (PR) - NEW: New sources called BuiltinSurface and BuiltinImage that let users create simple polygonal data and images using basic VTK sources. Thanks to Suyog Jain for this code. [22586], [22597]. 27 November, 2008 (GV): - ENH: Add control of the seed size and resolution to mlab.pipeline_basene.streamline [22573]. - DOC: Documentation work, especially in the scripting parts of the docs. [22572], [22561], [22560], [22546], [22545] 26 November, 2008 (GV): - ENH: Add keyword arguments to the cutplanes in mlab.pipeline. [22567] Also add masking to glyph-based mlab.pipeline factories [22568] 19 November, 2008 (GV): - UI: Rename 'Modules' to 'Colors and legends' [22512] - API: Change defaults [22513]: - CellToPointData and PointToCellData filters to pass the existing dataset. - The ouline of the implicite plane is no longer draggable by default. 15-16 November, 2008 (PR) - ENH/API: Exposing the glyph source choices via a dictionary rather than having the user remember the index in a list. [22497] - ENH: Adding a button to the LUT UI so the LUT editor can be launched from the UI. [22498] - DOC: Updating advanced scripting chapter. [22495]. 13 November, 2008 (GV) - ENH: [mlab] Add keyword arguments to colobars to control label number and format, as well as colors number. [22489] 10 November, 2008 (PR) - TEST: Adding 43 new mayavi tests. These are based on the integration tests but don't pop up a user interface. Thanks to Suyog Jain for doing bulk of the work. [22465] 27 October, 2008 (GV) - ENH: [mlab] If a module or filter is added to the pipeline using the mlab.pipeline functions, the source on which it is added onto is automatically added to the scene if not alread present. It is also automatically converted from a tvtk dataset to a mayavi source, if needed. [22375], [22377] - ENH: [mlab] Make mlab.axes and mlab.outline use the extents of the current object when none specified explicitely. [22372] 24-27 October, 2008 (PR) - NEW: Adding an ImageChangeInformation filter to let users change the origin, spacing and extents of input image data, [22351]. - API: Adding a `set_viewer` function to `tvtk.tools.visual` so one may specify a viewer to render into. This lets us use visual with a mayavi scene. [22363] - BUG: Fix a major bug with TVTK when VTK is built with 64 bit ids (VTK_USE_64BIT_IDS is on). The examples and tests should all run in this case now. [22365] - ENH: [mlab] Added an `mlab.view` method that actually works [22366]. 19 October, 2008 (GV) - ENH: mlab.text can now take 3D positioning [22331]. 17-20 October, 2008 (PR) - ENH: Modified TVTK and Mayavi UI editors so that text entry boxes are only set when the user hits or rather than on each keystroke. [22321], [22323] - ENH/BUG/WARN: Fixed warnings at TVTK build time, fixed bugs with ImageData's scalar_type trait. [22320], [22321], [22325]. - NEW/API: Adding preference option to ease task of loading contrib packages (via a pkg/user_mayavi.py) in mayavi. Also added a contrib finder that trawls sys.path to find contributions. This can be set from the preferences UI. [22324], [22326], [22327]. - BUG: Fixing problems with the gradient_editor and newer VTK versions. This is required for the Volume module to work correctly. [22329], [22341] 13 October, 2008 (GV): - ENH: Bind the 'explore' function in the python shell [22307] - ENH: mlab: axes and outline now find the extents from the objects they are given, if any. [22305] 12 October, 2008 (GV): - API: mlab: Add a barchart function, with the corresponding pipeline source function. [22286] 11 October, 2008 (PR): - ENH/API: Improving texture map support, you can now generate the texture coords on an arbitrary actor. This adds to the API of the actor component. [22283] - API: Adding a `mayavi.preferences.bindings` module that abstracts out setting of preferences for common objects. Currently it exposes a `set_scene_preferences` so the non-envisage and off screen scenes have the right preferences. See [22280] and [22295]. - REFACTOR/API: The script recording code is now in `apptools.scripting`, the `mayavi.core.recorder` was only a temporary solution. See [22277] and [22279]. 10 October, 2008 (GV): - API: mlab: Expose pipeline.set_extent (former private function tools._set_extent) [22251] 9 October, 2008 (GV): - ENH: Use the IPython shell plugin only if the ipython, envisage and pyface versions are recent-enough. Mayavi now uses an ipython widget instead of the pyshell one if you have the right components installed, but should fall back to pyshell gracefully. [21678], [22245] 4 October, 2008 (PR): - TEST: Added a 'test' backend to mlab so you can run mlab tests without a display. Fixing core code so that all the unittests run when the ETS_TOOLKIT env var is set to 'null'. [22198] 30 September, 2008 (GV): - API: mlab: Expose pipeline.add_dataset (former private function tools._data) [22162]. - API: The mlab source functions can now optionaly work without creating a figure (using figure=None) [22161]. - API: The mlab source functions are more robust to various input-argument shape (they accept lists, and 1D or 2D arrays when possible) [22161]. 29 September, 2008 (GV): - NEW: Add a mlab.triangular_mesh function to create meshes with arbitrary triangular connectivity. Also add a corresponding triangular_mesh_source mlab source. [22155] - ENH: Make mlab.points3d and other mlab functions accept scalars as coordinnates, in addition to arrays. [22156] 12 September, 2008 (PR) - NEW: Create a separate OffScreenEngine for use to reduce code duplication. This is also available as part of mayavi.api. [21880] - TEST: Creating a common.py that contains a TestEngine mayavi engine subclass for easily testing mayavi. [21881] 8-12 September, 2008 (PR) - NEW: Adding full support for script recording. With this you can pretty much record all UI actions performed on the Mayavi UI (both standalone and application) to human-readable and runnable Python scripts. It also serves as a nice learning tool since it shows the lines of code as the UI actions are performed. Note that interacting with the camera is also recorded which is very convenient. This has been implemented in a pretty general fashion (using TDD) so is reusable in other traits based applications also. Major checkins [21722], [21728], [21776], [21812], [21865] [21878]. Mayavi 3.0.3 ============ 7 September, 2008 (PR): - ENH: The mayavi2 application now ([21713], [21714]) supports command line args like the following:: mayavi2 -d ParametricSurface -s "function='dini'" -m Surface \ -s "module_manager.scalar_lut_manager.show_scalar_bar = True" \ -s "scene.isometric_view()" -s "scene.save('snapshot.png')" 6 September, 2008 (PR): - ENH/API: Cleaned up the mayavi.core.traits to remove buggy, and unused DRange and SimpleDRange traits. [21705] - BUG/TEST: Added tests for some of the MlabSource subclasses and fixed many bugs in the code. [21708] - TEST: Modified pipeline_base.py so mayavi objects may be started without creating a scene (and therefore a UI). This allows us to create completely non-interactive tests. [21709] - ENH: Adding X3D and POVRAY export options. [21711] 23 August, 2008 (PR): - ENH: Adding an offscreen option for mlab. Now you can set mlab.options.offscreen = True. [21510] - ENH: Setting the window size to (1,1) if the window is offscreen, this prevents the window from showing up prominently -- it still does show up though. [21519] 21 August, 2008 (PR): - ENH: Adding the logger plugin to the mayavi2 app. [21487] Mayavi 3.0.1 and 3.0.2 ====================== 16 August, 2008 (PR): - BUG: fixed various miscellaneous bugs including a testing error[21304], a long standing Mac bug with picking [21310], a segfault [21453] and a bug in tvtk when wrapping certain methods [21475]. Mayavi 3.0.0 ============ 15 August, 2008 (PR): - NEW: Adding a fully tested data set manager that lets users add/remove/modify attribute arrays to a tvtk dataset. This is fully tested and also does not influence any other code. [21300] 10 August, 2008 (PR): - ENH/API: [mlab] Added a `MlabSource` class to abstract out the data creation and modification into one object that may be modified. This source object is injected in the form of a `mlab_source` trait on objects returned by any of the helper functions (`surf`, `plot3d` etc.) or the sources. The user can use this to modify the data visualized without recreating the pipeline each time, making animations very easy and smooth. There are several examples of the form `test_blah_anim` showing how this is done. [21098], [21103]. 27 July, 2008 (GV): - ENH: Add an option (on by default) to open the docs in a chromeless window when using firefox. [20451] [20450] - ENH: Add toolbar to the engine view [20447] - ENH: Selected item on the tree jumps to newly created objects [20454] - ENH: Add a button on the viewer using by mayavi in standalone to open up the engine view [20456] [20462] - ENH: Clean UI for adding sources/filters/modules (Adder nodes) [20461] [20460] [20458] [20452] - ENH: [mlab] add a resolution argument to glyphs [20465] - API: [mlab] API Breakage! Make mlab source names compatible with ETS standards: grid_source rather than gridsource [20466] - NEW: Add image_plane_widget to mlab.pipeline, with helpful keyword arguments. 23 July, 2008 (GV): - ENH: The mlab API can now take either engine or figure keyword arguments. This allows to avoid the use of the global sate set in the mlab engine. Mlab also now exposes a set_engine function. [20245] 23 July, 2008 (PR) - ENH/NEW: The mlab.pipeline sources, modules and filters now feature automatic source/filter/module generation functions from registry information. This means mlab fully supports creating objects on the mayavi pipeline with easy one-liners. [20239] - API: The API has broken! Sources, filters and modules that mirror an existing mayavi class now are named with underscores. For example, isosurface has become iso_surface, extractedges becomes extract_edges etc. - NEW: Exposing the engine's open method to mlab so it is easy to open data files from mlab also. - ENH: Implemented an mlab.show decorator so one can write out a normal function for visualization which will work from ipython, standalone and mayavi completely seamlessly. 18, 19 July, 2008 (PR) - TEST/API: The mayavi tests are now split into integration and unit tests. Unit tests go into mayavi/tests. Integration tests are in integrationtests/mayavi. Major changes: - Removed most of the image based tests except one (test_streamline.py) for reference. - Modified the testing code so the standalone mode is the default. - Modified so nose picks up the integrationtests. However, there are problems running the test via nosetests on Linux that need investigating. - ENH: Creating a new object on the pipeline via envisage or right click now sets the active selection to the created object so it is easy to edit. - API: Moving mayavi/view/engine_view.py to mayavi/core/ui. [20098] - API: Added method to engine (get_viewer) so it gets the viewer associated with a particular scene. [20101] 12 July, 2008 (PR): - ENH/API: Adding support for global (system wide) and local customizations via a site_mayavi.py and user_mayavi.py (in ~/.mayavi2/). This allows users to register new modules/filters and sources and also add any envisage plugins to the mayavi2 app easily. [19920] 9 July, 2008 (Judah, PR) - ENH: Adding the core code for an AdderNode that shows up on the engine view and lets a user easily create new scenes/sources/filters and modules. 8 July, 2008 (PR) - BUG: Ported various bug fixes from branches for ETS-2.8.0 release. - ENH/API: Added datatype, attribute type and attribute information to all pipeline objects (both at the object and metadata levels). This lets one query if an object will support a given input and what outputs it will provide (this can be changed dynamically too). This allows us to create context sensitive menus. The traits UI menus for the right click is now modified to use this information. We therefore have context sensitive right click menus depending on the nature of the object we right click on. At this point we don't yet check for the attribute_type and attributes metadata information to enable/disable menus, this may be implemented later -- the framework makes this quite easy to do. [19512]. - ENH: Envisage menus are now context sensitive [19520]. 5 July, 2008 (PR): - ENH: One can create objects on the pipeline using right-clicks [19469]. - ENH: All the envisage menus and actions for sources, filters and modules now are autogenerated from the metadata for these. - NEW/API: [19458] adds the following features: - A Registry (mayavi.core.registry.Registry) to register engines, sources, filters and modules. Source, filter and module metadata is registered and this can be used to do various things like generate menus, register data file extension handlers and whatnot. The metadata related classes are in mayavi.core.metadata. - This registry and metadata information is used to generate the envisage menus and actions. - The registry can be used by users to register new sources, readers, filters and modules. - A method to Engine and Script to easily open any supported data file. - Simplify the open file interface so it is just one menu item that supports different file extensions. - Changed the command line options for the mayavi2 application so you can open *any* supported data file format with the -d option. This breaks backwards compatibility but makes it very easy to open supported data files -- even if the new ones are added by users. - Fixed the PLOT3DReader so it opens the q file using the xyz filenames basename. 29 June, 2008 (GV): - ENH: Updated Sphinx docs [19318]. - ENH: New splash screen [19319]. - ENH: mlab now works with envisage, including in "mayavi2 -x" [19321] [19323] 27 June, 2008 (Vibha): - API: Remove SimpleScene class [19285]. - API: Moved tvtk-related examples from TraitsGUI to Mayavi [19191] [19197] [19231] [19280] 27 June, 2008 (GV): - BUG: tvtk: proper handling of non-float numpy arrays. Added test case [19297] 25 June, 2008 (GV): - ENH: Add autoscale to mlab.surf (scalez keyword argument) [19131] - ENH: mlab.usrf and mlab.mesh can now take x and y arguments with a more flexible shape [19114]. 12 June, 2008 (PR): - ENH: Adding an offscreen option to the mayavi2 application. This lets you run a normal mayavi Python script in offscreen mode without the full UI. This is very convenient when you want to render a huge number of images from a visualization and don't want the UI to bother you or create a special script for the purpose. See [18951], [18955]. 07, 08 June, 2008 (PR): - API: TVTK: Added two methods `setup_observers` and `teardown_observers` that let one turn on/off the observer for the ModifiedEvent fired on each VTK object that a TVTK object wraps to keep the traits updated. Thus, if you call `teardown_observers` the traits will not be automatically updated if the wrapped VTK object is changed. This can be manually updated by calling the `update_traits` method. It is OK to call the setup/teardown_observers method as often as needed. This is also tested. See [18885]. - API: TVTK: Removed the `__del__` method on all TVTK objects. This should make it much nicer for proper garbage collection. See [18886], [18887]. 06 June, 2008 (PR): - TEST: Added a standalone mode to the tests so you can test without starting up the envisage app. Envisage imports may be required however. To use this run any test with the -s option. [18880] - TEST: Added a way to run the tests on one application launch instead of starting mayavi each time. To use this execute run.py with the --one-shot command line option. [18880] [18881]. - TEST: The standalone offscreen mode now should work without a single Traits UI showing up with just a dummy blank window being used. This demonstrates how mayavi scripts can work in completely different contexts. [18881]. 31 May, 2008 (PR): - PORT: Backported important additions to the 2.2.0 branch. - BUG: Added a test case for the hide/show functionality and fixed known bugs. - API: Adding elementary support for texturing an actor (if it has texture coords). This was thanks to a patch from Chandrashekhar Kaushik. [18827] 30 May, 2008 (PR): - API: Adding closing, closed lifecycle events to the scene [18806]. 27 May, 2008 (PR): - NEW: Adding a Labels module to label input data. This is like MayaVi1's module and with this checkin all important mayavi1 modules and filters are supported in mayavi2. The only missing one is Locator which hardly anyone uses I think. See [18801]. 27 May, 2008 (PR): - NEW: Adding an ImageDataProbe filter which does the same thing that MayaVi-1.5's StructuredPointsProbe does. [18792] 25 May, 2008 (PR): - NEW: Adding CellDerivatives and Vorticity filters. [18785] 24 May, 2008 (PR): - NEW: Adding a tvtk_doc.py module that doubles as a TVTK Class/Filter/Source/Sink chooser and also as a documentation browser (with search!) like Mayavi1.x's vtk_doc.py. tvtk_doc is also installed as a console script now. [18776] - NEW: Adding a UserDefined filter where the user can wrap around any TVTK filter. [18780] 23 May, 2008 (PR): - NEW: SetActiveAttribute filter that lets you select the active attribute. This makes it very easy to find the contours of one scalar on the iso-contour of another. The example contour_contour.py shows how this is done. See [18774], [18775]. 22 May, 2008 (PR): - NEW: Adding Contour and CutPlane filters that use the Wrapper filter and respective components. This is very convenient. - Checked in modified patch from Chandrashekhar Kaushik (CSE IITB), which reimplements hide/show using a visible trait. 21 May, 2008 (PR): - TEST: Adding an @test decorator to make it easy to create a mayavi test case from a mayavi script. While this is convenient, I still prefer to explicitly use the TestCase class since this makes the code compatible with the 2.2.0 branch. - The GenericModule is now tested. 20 May, 2008 (PR): - NEW: Adding a GenericModule to easily put together a bunch of Filters and Components. Using this code it takes 30 simple lines of code for a ScalarCutPlane compared to the 300 complex ones we need for the current implementation! This is because the module takes care of all the dirty work. - NEW: Adding Wrapper, Optional and Collection filters that make it easy to wrap around existing Components and Filters, make them optional and create collections of them very easily. This gives us a great deal of reuse and makes it very easy to create new filters. 18 May, 2008 (PR): - ENH: Improved the PLOT3D reader and added a test for it. - Added a menu item to allow a user to run a Python script from the UI. - API: Added a close method to `pyface.tvtk.tvtk_scene.TVTKScene`. This class is inherited by all Scenes (DecoratedScene and Scene). The close method shuts down the scene properly. This should hopefully prevent async errors when closing editors/windows containing scenes. See [18708]. - Updated the scene plugin, scene_editor (TraitsBackend*), actor_editor and the ivtk code to use the close method. - TEST: All the tests run on the trunk and pass when the offscreen option is used (which was also added). 17 May, 2008 (PR): - NEW: Adding an SelectOutput filter that should address bug number 478359 in the Debian BTS. See [18700]. - API: mayavi.plugins.app.Mayavi now defines a setup_logger method so this can be overridden by subclasses, see [18703]. 13 May, 2008 (PR): - NEW: Adding an ExtractVectorComponents filter contributed by Varun Hiremath. 11,12 May 2008 (PR): - ENH/API: The plugins now start the engine themselves and also do the binding to the shell. Earlier this was done by the application. This makes the plugins reusable. Also added a running trait to the engine to check on its status. [18672], [18678]. - At this point all examples in trunk work save the mayavi_custom_ui plugin stuff. 10 May 2008 (PR): - API: Moving mayavi/engine.py -> mayavi/core/engine.py where it really belongs; see [18667]. 7,8 May 2008 (PR): - API: The plugins_e3 package is now moved into plugins. This breaks the tvtk.plugins API and also the mayavi.mayavi_*_definition modules. The older envisage2 plugin code is all removed. See: [18649], [18650], [18651], [18652], [18655], [18657], [18662]. 6 May 2008 (PR): - API: The mayavi.core.Base.confirm_delete class attribute is gone since it is no longer needed [18635]. - API: Removed config directory, integrated all mlab preferences into the the mayavi preferences framework, see [18632]. To get the preferences just do:: from mayavi.preferences.api import preference_manager This is the preference manager that manages all prefs. To see the code look in mayavi.preferences.preference_manager. It is also a good idea to read the apptools.preferences documentation. - BUG: [18627] Fixed bug number 478844 on the Debian BTS here: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=478844 4 May 2008 (PR): - API: Added to api. Added a new preferences framework for mayavi2. This uses apptools.preferences and works well both standalone and with envisage3. It makes it easy to create/define/change preferences at the application and library level. 2 May, 2008 (PR): - API: Ported the mayavi2 application and plugin to work with Envisage3. See changesets [18595] and [18598]. *This obviously breaks the plugin API completely!* - Got the mlab envisage_engine_manager working with new changes [18599]. Before this changeset, the code was that of the 2.x series. mayavi-4.5.0/docs/DEVELOPMENT.txt0000644000076500000240000000113712747716313016702 0ustar prabhustaff00000000000000 Making a release ----------------- Updating the docs for the release .................................. * Update the docs images (you need a _working_ version of Mayavi for this): cd docs/source python render_images.py How the automatic doc references are generated ---------------------------------------------- The automatic references for mlab are generated using the mlab_reference.py script in the root directory. This script defines a class to explore a module and generate rest files for documentation. In particular, it looks for example code in test functions and resulting images. mayavi-4.5.0/docs/Makefile0000644000076500000240000000622512747716313016022 0ustar prabhustaff00000000000000# A Thin Wrapper for the Makefiles for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build PAPER = BUILDDIR = build # Internal variables. PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source .PHONY: help clean html dirhtml pickle json htmlhelp qthelp latex changes linkcheck doctest help: @echo "Please use \`make ' where is one of" @echo " html to make standalone HTML files" @echo " dirhtml to make HTML files named index.html in directories" @echo " pickle to make pickle files" @echo " json to make JSON files" @echo " htmlhelp to make HTML files and a HTML help project" @echo " qthelp to make HTML files and a qthelp project" @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" @echo " changes to make an overview of all changed/added/deprecated items" @echo " linkcheck to check all external links for integrity" @echo " doctest to run all doctests embedded in the documentation (if enabled)" clean: -rm -rf $(BUILDDIR)/* html: make -f MakefileMayavi html @echo make -f MakefileTVTK html @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/." dirhtml: make -f MakefileMayavi dirhtml @echo make -f MakefileTVTK dirhtml @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." pickle: make -f MakefileMayavi pickle @echo make -f MakefileTVTK pickle @echo @echo "Build finished; now you can process the pickle files." json: make -f MakefileMayavi json @echo make -f MakefileTVTK json @echo @echo "Build finished; now you can process the JSON files." htmlhelp: make -f MakefileMayavi htmlhelp @echo make -f MakefileTVTK htmlhelp @echo @echo "Build finished; now you can run HTML Help Workshop with the" \ ".hhp project file in $(BUILDDIR)/htmlhelp." qthelp: make -f MakefileMayavi qthelp @echo make -f MakefileTVTK qthelp @echo @echo "Build finished; now you can run "qcollectiongenerator" with the" \ ".qhcp project file in $(BUILDDIR)/qthelp, like this:" @echo "# qcollectiongenerator $(BUILDDIR)/mayavi/qthelp/mayavi.qhcp" @echo "To view the help file:" @echo "# assistant -collectionFile $(BUILDDIR)/mayavi/qthelp/mayavi.qhc" latex: make -f MakefileMayavi latex @echo make -f MakefileTVTK latex @echo @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." @echo "Run \`make all-pdf' or \`make all-ps' in that directory to" \ "run these through (pdf)latex." changes: make -f MakefileMayavi changes @echo make -f MakefileTVTK changes @echo @echo "The overview file is in $(BUILDDIR)/changes." linkcheck: make -f MakefileMayavi linkcheck @echo make -f MakefileTVTK linkcheck @echo @echo "Link check complete; look for any errors in the above output " \ "or in $(BUILDDIR)/linkcheck/output.txt." doctest: make -f MakefileMayavi doctest @echo make -f MakefileTVTK doctest @echo @echo "Testing of doctests in the sources finished, look at the " \ "results in $(BUILDDIR)/doctest/output.txt." mayavi-4.5.0/docs/MakefileMayavi0000644000076500000240000000611012747716313017162 0ustar prabhustaff00000000000000# Makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build PAPER = BUILDDIR = build/mayavi # Internal variables. PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source/mayavi .PHONY: help clean html dirhtml pickle json htmlhelp qthelp latex changes linkcheck doctest help: @echo "Please use \`make ' where is one of" @echo " html to make standalone HTML files" @echo " dirhtml to make HTML files named index.html in directories" @echo " pickle to make pickle files" @echo " json to make JSON files" @echo " htmlhelp to make HTML files and a HTML help project" @echo " qthelp to make HTML files and a qthelp project" @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" @echo " changes to make an overview of all changed/added/deprecated items" @echo " linkcheck to check all external links for integrity" @echo " doctest to run all doctests embedded in the documentation (if enabled)" clean: -rm -rf $(BUILDDIR)/* html: $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." dirhtml: $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." pickle: $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle @echo @echo "Build finished; now you can process the pickle files." json: $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json @echo @echo "Build finished; now you can process the JSON files." htmlhelp: $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp @echo @echo "Build finished; now you can run HTML Help Workshop with the" \ ".hhp project file in $(BUILDDIR)/htmlhelp." qthelp: $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp @echo @echo "Build finished; now you can run "qcollectiongenerator" with the" \ ".qhcp project file in $(BUILDDIR)/qthelp, like this:" @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/mayavi.qhcp" @echo "To view the help file:" @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/mayavi.qhc" latex: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." @echo "Run \`make all-pdf' or \`make all-ps' in that directory to" \ "run these through (pdf)latex." changes: $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes @echo @echo "The overview file is in $(BUILDDIR)/changes." linkcheck: $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck @echo @echo "Link check complete; look for any errors in the above output " \ "or in $(BUILDDIR)/linkcheck/output.txt." doctest: $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest @echo "Testing of doctests in the sources finished, look at the " \ "results in $(BUILDDIR)/doctest/output.txt." mayavi-4.5.0/docs/MakefileTVTK0000644000076500000240000000610012747716313016523 0ustar prabhustaff00000000000000# Makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build PAPER = BUILDDIR = build/tvtk # Internal variables. PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source/tvtk .PHONY: help clean html dirhtml pickle json htmlhelp qthelp latex changes linkcheck doctest help: @echo "Please use \`make ' where is one of" @echo " html to make standalone HTML files" @echo " dirhtml to make HTML files named index.html in directories" @echo " pickle to make pickle files" @echo " json to make JSON files" @echo " htmlhelp to make HTML files and a HTML help project" @echo " qthelp to make HTML files and a qthelp project" @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" @echo " changes to make an overview of all changed/added/deprecated items" @echo " linkcheck to check all external links for integrity" @echo " doctest to run all doctests embedded in the documentation (if enabled)" clean: -rm -rf $(BUILDDIR)/* html: $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." dirhtml: $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." pickle: $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle @echo @echo "Build finished; now you can process the pickle files." json: $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json @echo @echo "Build finished; now you can process the JSON files." htmlhelp: $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp @echo @echo "Build finished; now you can run HTML Help Workshop with the" \ ".hhp project file in $(BUILDDIR)/htmlhelp." qthelp: $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp @echo @echo "Build finished; now you can run "qcollectiongenerator" with the" \ ".qhcp project file in $(BUILDDIR)/qthelp, like this:" @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/tvtk.qhcp" @echo "To view the help file:" @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/tvtk.qhc" latex: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." @echo "Run \`make all-pdf' or \`make all-ps' in that directory to" \ "run these through (pdf)latex." changes: $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes @echo @echo "The overview file is in $(BUILDDIR)/changes." linkcheck: $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck @echo @echo "Link check complete; look for any errors in the above output " \ "or in $(BUILDDIR)/linkcheck/output.txt." doctest: $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest @echo "Testing of doctests in the sources finished, look at the " \ "results in $(BUILDDIR)/doctest/output.txt." mayavi-4.5.0/docs/mayavi2.man0000644000076500000240000003365312747716313016434 0ustar prabhustaff00000000000000.TH MAYAVI2 1 .SH NAME mayavi2 \- A scientific visualization package for 2-D and 3-D data .SH SYNOPSIS .B mayavi2 [options] [args] Where arg1, arg2 etc\&. are optional file names that correspond to saved Mayavi2 visualizations (filename\&.mv2), Mayavi2 scripts (filename\&.py) and any data file formats that Mayavi supports\&. .SH "DESCRIPTION" .PP Mayavi2 is a tool for 2-D and 3-D scientific visualization\&. Features of Mayavi2 include: .PP .IP * Visualization of scalar and vector data in 2 and 3 dimensions .IP * Easy scriptability using Python .IP * Easy extendability via sources, components, modules, and data filters .IP * Reading several file formats: VTK (legacy and XML), PLOT3D, etc\&. .IP * Saving of visualizations .IP * Saving rendered visualization in a variety of image formats\&. .SH "OPTIONS" .PP .B -h This prints all the available command line options and exits\&. Also available through \fB\-\-help\fP\&. .PP .B -V This prints the Mayavi version on the command line and exits\&. Also available through \fB\-\-version\fP\&. .PP .B -z filename\&.mv2 This loads a previously saved Mayavi2 visualization\&. Also available through \fB\-\-viz\fP filename\&.mv2 or \fB\-\-visualization\fP filename\&.mv2\&. .PP .B -d datafile\&.* Opens any of the supported data file formats or a non-file related data source\&. This includes VTK file formats (*\&.vtk, *\&.xml, *\&.vt[i,p,r,s,u], *\&.pvt[i,p,r,s,u]), VRML2 (*\&.wrl), 3D Studio (*\&.3ds), PLOT3D (*\&.xyz), STL, BYU, RAW, PLY, PDB, SLC, FACET, OBJ, AVSUCD (*\&.inp), GAMBIT (*\&.neu), Exodus (*\&.exii), PNG, JPEG, BMP, PNM, DCM, DEM, MHA, MHD, MINC, XIMG, TIFF, and various others that are supported\&. datafile\&.* can also be a source object not associated with a file, for example ParametricSurface or PointLoad will load the corresponding data sources into Mayavi\&. Also available through \fB\-\-data\fP\&. .PP .B -m module-name A module is an object that actually visualizes the data\&. The given module-name is loaded in the current ModuleManager\&. The module name must be a valid one if not you will get an error message\&. If a module is specified as 'package\&.sub\&.module\&.SomeModule' then the module (SomeModule) is imported from 'package\&.sub\&.module'\&. Standard modules provided with mayavi2 do not need the full path specification\&. For example: .PP .RS \f(CWmayavi2 \-d data\&.vtk \-m Outline \-m m2_user_modules\&.TestModule\fP .RE In this example 'Outline' is a standard module and 'm2_user_modules\&.TestModule' is some user defined module\&. See .B MAYAVI2 MODULES section below for an exhaustive list of available modules\&. Also available through \fB\-\-module\fP\&. .PP .B -f filter-name A filter is an object that filters out the data in some way or the other\&. The given filter-name is loaded with respect to the current source/filter object\&. The filter name must be a valid one if not you will get an error message\&. If the filter is specified as 'package\&.sub\&.filter\&.SomeFilter' then the filter (`SomeFilter`) is imported from 'package\&.sub\&.filter'\&. Standard modules provided with mayavi2 do not need the full path specification\&. For example: .PP .RS \f(CWmayavi2 \-d data\&.vtk \-f ExtractVectorNorm \-f m2_user_filters\&.TestFilter\fP .RE In this example 'ExtractVectorNorm' is a standard filter and 'm2_user_filters\&.TestFilter' is some user defined filter\&. See .B MAYAVI2 FILTERS section below for an exhaustive list of available filters\&. Also available through \fB\-\-filter\fP\&. .PP .B -M Starts up a new module manager on the Mayavi pipeline\&. Also available through \fB\-\-module\-mgr\fP\&. .PP .B -n Creates a new window/scene\&. Any options passed after this will apply to this newly created scene\&. Also available through \fB\-\-new\-window\fP\&. .PP .B -t Runs the mayavi2 test suite and exits\&. If run as such, this runs both the TVTK and Mayavi2 unittests\&. If any additional arguments are passed they are passed along to the test runner\&. So this may be used to run other tests as well\&. For example: .PP .RS \f(CWmayavi2 \-t enthought\&.persistence\fP .RE This will run just the tests inside the enthought\&.persistence package\&. You can also specify a directory with test files to run with this, for example: .PP .RS \f(CWmayavi2 \-t relative_path_to/integrationtests/mayavi\fP .RE will run the integration tests from the mayavi sources. Also available through \fB\-\-test\fP\&. .PP .B -x script-file This executes the given script in a namespace where we guarantee that the name 'mayavi' is Mayavi's script instance -- just like in the embedded Python interpreter\&. Also available through \fB\-\-exec\fP .B WARNING: Note that this uses `execfile`, so please note that this can be dangerous if the script does something nasty! .PP .B -s python-expression Execute the expression on the last created object\&. For example, if the previous object was a module, and we want to set the color of that object one can do \-s "actor\&.property\&.color = (1,0,0)". One should use quotes for the expression. Also available with \fB\-\-set\fP\&. For example: .PP .RS \f(CWmayavi2 \-d ParametricSurface \-m Outline \\ \fP \f(CW \-s "actor\&.property.color = (1,0,0)" \\ \fP \f(CW \-s "scene.save('test\&.png', size=(800, 800))"\fP .RE .B WARNING: Note that this uses `exec`, so please note that this can be dangerous! .SH "MAYAVI2 MODULES" .TP .B Axes Draws simple axes\&. .TP .B ContourGridPlane A contour grid plane module\&. This module lets one take a slice of input grid data and view contours of the data\&. .TP .B CustomGridPlane A custom grid plane with a lot more flexibility than GridPlane module\&. .TP .B DataSetClipper This filter clips the dataset in a area. The area can be defined interactively as a box, a sphere... .TP .B Glyph Displays different types of glyphs oriented and colored as per scalar or vector data at the input points\&. .TP .B GridPlane A simple grid plane module\&. .TP .B HyperStreamline A module that integrates through a tensor field to generate a hyperstreamline\&. The integration is along the maximum eigenvector and the cross section of the hyperstreamline is defined by the two other eigenvectors\&. Thus the shape of the hyperstreamline is "tube-like", with the cross section being elliptical. Hyperstreamlines are used to visualize tensor fields\&. .TP .B ImageActor A simple module to view image data efficiently\&. .TP .B ImagePlaneWidget A simple module to view image data\&. .TP .B IsoSurface A module that allows the user to make contours of input point data\&. .TP .B Labels Allows a user to label the current dataset or the current actor of the active module\&. .TP .B OrientationAxes Creates a small axes on the side that indicates the position of the co-ordinate axes and thereby marks the orientation of the scene\&. Requires VTK-4\&.5 and above\&. .TP .B Outline A module that draws an outline for the given data\&. .TP .B ScalarCutPlane Takes a cut plane of any input data set using an implicit plane and plots the data with optional contouring and scalar warping\&. .TP .B SliceUnstructuredGrid This module takes a slice of the unstructured grid data and shows the cells that intersect or touch the slice\&. .TP .B Streamline Allows the user to draw streamlines for given vector data\&. This supports various types of seed objects (line, sphere, plane and point seeds)\&. It also allows the user to draw ribbons or tubes and further supports different types of interactive modes of calculating the streamlines\&. .TP .B StructuredGridOutline Draws a grid-conforming outline for structured grids\&. .TP .B Surface Draws a surface for any input dataset with optional contouring\&. .TP .B TensorGlyph Displays tensor glyphs oriented and colored as per scalar or vector data at the input points\&. .TP .B Text This module allows the user to place text on the screen\&. .TP .B VectorCutPlane Takes an arbitrary slice of the input data using an implicit cut plane and places glyphs according to the vector field data\&. The glyphs may be colored using either the vector magnitude or the scalar attributes\&. .TP .B Vectors Displays different types of glyphs oriented and colored as per vector data at the input points\&. This is merely a convenience module that is entirely based on the Glyph module\&. .TP .B Volume The Volume module visualizes scalar fields using volumetric visualization techniques\&. .TP .B WarpVectorCutPlane Takes an arbitrary slice of the input data using an implicit cut plane and warps it according to the vector field data\&. The scalars are displayed on the warped surface as colors\&. .SH "MAYAVI2 FILTERS" .TP .B CellDerivatives Computes derivatives from input point scalar and vector data and produces cell data on the gradients\&. Can be used to approximately calcuate the vorticity for example\&. .TP .B CellToPointData Transforms cell attribute data to point data by averaging the cell data from the cells at the point\&. .TP .B Contour A contour filter that wraps around the Contour component to generate iso-surfaces on any input dataset\&. .TP .B CutPlane This class represents a cut plane that can be used to slice through any dataset\&. It also provides a 3D widget interface to position and move the slice interactively\&. .TP .B ElevationFilter Creates scalar data corresponding to the elevation of the points along a line\&. .TP .B Delaunay2D Performs a 2D Delaunay triangulation\&. .TP .B Delaunay3D Performs a 3D Delaunay triangulation\&. .TP .B ExtractEdges This filter extracts cell edges from any input data\&. .TP .B ExtractGrid Allows a user to select a part of a structured grid\&. .TP .B ExtractTensorComponents Wraps the TVTK ExtractTensorComponents filter to extract components from a tensor field\&. .TP .B ExtractUnstructuredGrid Allows a user to select a part of an unstructured grid\&. .TP .B ExtractVectorNorm Computes the norm (Eucliedean) of the input vector data (with optional scaling between [0, 1])\&. This is useful when the input data has vector input but no scalar data for the magnitude of the vectors\&. .TP .B ExtractVectorComponents Wraps the TVTK ExtractVectorComponents filter to extract components of a vector\&. This is useful for analysing individual components of a vector data\&. .TP .B GaussianSplatter This filter splat points into a volume with an elliptical, Gaussian distribution\&. .TP .B MaskPoints Selectively passes the input points downstream\&. This can be used to subsample the input points. Note that this does not pass geometry data, this means all grid information is lost\&. .TP .B GreedyTerrainDecimation Approximates a height field (image data) with a triangle mesh, keeping the number of triangles minimum\&. .TP .B ImageChangeInformation A filter that can be used to change the origin, spacing and extents of an input image dataset without changing the data itself\&. .TP .B ImageDataProbe A filter that can be used to probe any dataset using a Structured Points dataset\&. The filter also allows one to convert the scalar data to an unsigned short array so that the scalars can be used for volume visualization\&. .TP .B PointToCellData Does the inverse of the CellToPointData filter\&. .TP .B PolyDataNormals Computes normals from input data\&. This gives meshes a smoother appearance\&. This should work for any input dataset\&. Note: this filter is called "Compute Normals" in Mayavi2 GUI (Visualize/Filters/Compute Normals)\&. .TP .B QuadricDecimation Reduce triangles in a mesh, forming a good approximation of the original mesh\&. .TP .B SelectOutput A filter that allows a user to select one among several of the outputs of a given input. This is typically very useful for a multi-block data source\&. .TP .B SetActiveAttribute This filter lets a user set the active data attribute (scalars, vectors and tensors) on a VTK dataset\&. This is particularly useful if you need to do something like compute contours of one scalar on the contour of another scalar\&. .TP .B Stripper Create triangle strips and/or poly-lines. Useful for regularizing broken up surfaces, such as those created by the Tube filter. \&. .TP .B Threshold A simple filter that thresholds on input data\&. .TP .B TransformData Performs a linear transformation to input data\&. .TP .B TriangleFilter Converts input polygons and triangle strips to triangles using the tvtk\&.TriangleFilter class\&. This is useful when you have a downstream filter that only processes triangles\&. .TP .B Tube Turns lines into tubes\&. .TP .B UserDefined This filter lets the user define their own filter dynamically/interactively\&. It is like FilterBase but allows a user to specify the class without writing any code\&. .TP .B Vorticity This filter computes the vorticity of an input vector field\&. For convenience, the filter allows one to optionally pass-through the given input vector field\&. The filter also allows the user to show the component of the vorticity along a particular cartesian co-ordinate axes\&. It produces point data on output which is ready to visualize\&. .TP .B WarpScalar Warps the input data along a particular direction (either the normals or a specified direction) with a scale specified by the local scalar value\&. Useful for making carpet plots\&. .TP .B WarpVector Warps the input data along a the point vector attribute scaled as per a scale factor\&. Useful for showing flow profiles or displacements\&. .SH "EXAMPLES" .PP .RS \f(CWmayavi2 \-d heart\&.vtk \-m Axes \-m Outline \-m GridPlane \-m ContourGridPlane \-m IsoSurface\fP .br \f(CWmayavi2 \-d fire_ug\&.vtu \-m Axes \-m Outline \-m VectorCutPlane \-f MaskPoints \-m Glyph\fP .br .RE .PP In the above examples, heart\&.vti and fire_ug\&.vtu VTK files can be found in /usr/share/doc/mayavi2/examples/data\&. The examples directory (/usr/share/doc/mayavi2/examples/ on Debian) provides several useful examples\&. .SH "AUTHOR" .PP Mayavi was originally developed by Prabhu Ramachandran. Many people have later contributed to it. .PP More information on Mayavi2 can be obtained from http://code\&.enthought\&.com/mayavi2 mayavi-4.5.0/docs/source/0000755000076500000240000000000012747722127015655 5ustar prabhustaff00000000000000mayavi-4.5.0/docs/source/mayavi/0000755000076500000240000000000012747722127017143 5ustar prabhustaff00000000000000mayavi-4.5.0/docs/source/mayavi/_static/0000755000076500000240000000000012747722127020571 5ustar prabhustaff00000000000000mayavi-4.5.0/docs/source/mayavi/_static/mayavi-logo.png0000644000076500000240000003333312747716313023530 0ustar prabhustaff00000000000000PNG  IHDRl3sRGBbKGDPY pHYsmmGڍtIMEW IDATx]w|~fz(B Uޫm-/1ĉ5m\SEMB@DUItewcm;IHo[n3,B{M0o8~iU^#;AT￶~7]̅L&q !n:_PʿU`خ0Nc€Vm5`*xݞw>0tDx)a 0ll''A[euedWѷoG]!?q6P8RҢGz1Iݢl#pA [e`;F.x LCCv.1!y* AMA $K\Xr &0fa4:Q8gweG=`'oI>$PBs._B0;8@&_E~ۜ\3#GL'Fu\KQOH5vy7]p7a0-#f\˔*vqfMzF#X.Y7eCzM{uЍC6g(HΆ*& R{: JSS4,1v"6.<HO >Rcco{[ъnj ,0JKj<^XX(C;޹g\>rb يص大 gEP)Gt}4/I{ 8y{|nA .}MX4 =$gqwnpúo҂RG6ӞaiQC6 P"@)%phÊ; iH2ݜ(+=? Ws~BpJxyN/mӒ_Gz9K JԊr }9lS1xx.lq!bhMu}_ UKw ўI p^{5}p{g >ȴJdvod̼m1c $}fHc6EńqFgo򇟚uаdgl^9)r! qO>w]ئ]SXtl@ 膏éz*$7wxt8y!EF<0.W,0*,{7QB0n:Z{{v`r[ʟ{ܾej5J’5;ucЊؕ[|y{\lD'EqwITX `gUz&Fw 3pOL@T}I1ίg W9yz wyv5wdgNSu2=urd'{t֣~eQBH=ԓț:~em>_ZwV%/*~g=1^:8WN:PP4gÚBL=,"22V+Hdm([x[*-=n{۟%;m̕R"ߠd}-]3FPC ZOڷӸFu^췬,W$ J0Q< +&屡 Ik4gkW30#xJ!Λml\vИ nq9:Z00pR"Y[i+~ޗepLyO֬|w^[yMGNZ"<ݗ]feD0$ڇ Z3rL7'@5cN]n5 xBX(A lxt5Ƅs3^ Le2Ad M UW#261fYVQM1x/50 J:ջ~hT0㶁=]pS,m. 3;vLm$;rP~Uh7kOvm<3 wk )iN6g"(P\T$Lަ^/ qW|uyc+).x/ T:.E;"D,0d,㩫mXTS?2pXCF&uMkŵ#q&7 vҧ_0n=Z;FJNV]GL'6 tmo5}_m>*cťȵnGD99iyM>+_8w+pjrnih_Z8PnFk=iJz4~n]-Y3L,L]yPp29$ p7()sR@%QFdPV{v _aokd@r㻇OHXu8&8U2Y~40? M"w _uC#;m/ʩ5U8뭪eSCV.=둧'}uz.3s;IڌOƮzw:%A!@˽x<ό0)a##tNag:mPIZDo,`ǪrG 8^ˀDb(=z-jϊiӎ’Dh˺EJ8S"LElՒP B&NJ^9qք#Zy=[=Gm]T1KjYGŕV3cYz} FwI檽oKL]PAVx<Z:6pUx|ҚlumkQ"5DPAD)>ib!.eb ,jყٓ{#=[1Na!K ܵ5VDEK JΖ3>D-?ݯ2&:9ǷV龈3gL`DF\#VyӡC9gٷe`pׅ֙-@MYɀ㈵/sc3xLB <"z$Ҷ5QA1}L#JJJTd:@pC^y~<̖>v̫ܨ6Oi[<mܢ6zTGW.>;}Q٥o{}e-7zX D)K~KԽ?5?L2?=j#M0]> `0`p @Ze(C!i1g*=7DiO,z'G,qV G}9g5 Da~h+2\K(N9a 2Ғ*1""tIrpc$)pCʩ3`ds&y"qs%bDx8Iڡdzk1t~\f*UU@ׯw{<ޅZ Kt'$1& HiDyO>(/c2b/w"Ӱ$2(mj[2/ZS 4o^~Am;ػoqB :c-}PKZoeJUh;>8M2*=h[ ?4a|BĤH۠ai}Z9g (=` t_MQ ,aÍXj^ØL*+,>>Ic< <&H> Ͱ>z"7a⾋YZMiG7@?zѷz>zǂWg?~g3>|7dcH#ߑmIKxOHW]$?~WcsG~2xlã#'CeF0G$&XcV&J7(PVv#\ )r * R8u:tMt}3|?oY?4€j ck%%5=|_bLյ*<,M8 I)\_]2ۈ) Tr6Iy TB ߣODK#Ė 庯s>?P}[uJ:PYR'rFO1c"#&&U ,HaAu9Px8>JpPUkWRk+Kjܼh2 g 0Ǎ*?ʚRPBqHsQ9W9fdMC)ٲwՋb_8spXm60ሹ1\$ˈ LZ6"(pE=gz R޳*wwaOX}ب^.<|RʹvpQ&3G~v,ttAZ.(Yj @@kih՚7tL׋o7U N=myq5h{MuP"sO0z[j]G JFPӕ9ϼ)ЙyltB|6'@ⳖFIF{ND83cBi~ ^QDRA`|@ ע@ "A(0&(2&"y[(D*|r1J!RƉ2J)D"`bUesjk}euU'QhTR K jKs4FǀFs@8_6gטy6c'oH]h}aj~Ḽ0n3Zݧ%REy; <fgy nJ| uW_URX.c Q *hw=ғxw 5?ݾ,R8`҄9^`S-{9ɵ6iaf!2ouXy\ANῊ/%dx)5#R5SX< t"-U"F GYk|PÍ 30( dr"UMUiFT@)R#<6p,tۙ BcIfc 7<]Sw0hg4䛍Tb3uFjW^@ >Np:@X@)nJZ7 o~bS"hFD}d)ZR I=!(_[Y@IDg'}m-)*;s{ [B!] RwM^~GkM3vXhFϵwh,^:ͺ3k]R1pLt Cc6)pM<dCy@UqXY'iKk9s0=fjph67G9$2HD #Q X$St:N 1=5VJ1@Z2)`3 '[JHOwJ$}P}@t:o4KgL˷cB*2__aWLw tݴ(@$Z  sR Xgf|Mv3JaseU$0 sQx cRvg6xD\Mmw5$׷4g >-( 8$&c'@ED$cEɑ#{*h7jG{҅6@xg)\/,!h)qaf;U\X, /a-g}jLS80aB<ʒ{oDmA5']N@́osr~pW9YlW?ӝ[teHMdE"-T^Di&Q$ZPÈפ^Եg( DF=~Jr+mMigev˗ fuGo~.V&50/Gse+^c eLJ&ϒ`=V2>8vWаaj$|!,VaCS?*'n [6@1MQrĉmE̊ uJlg~OˆLșL:I-`,ad'g!zֳ?}_IᗶzQ0-T \p/jłȂAf!f86 LIJkx)EW|MV~dJJ zne3bէ֍KLG8Yb1QˆhI#`4lPYP^E&~hB0^, l1lw^X s*X&$Z/p]>h;AhvM8gf=]ʌ,ೊn542!SߠYIEYIU@tK&Uch^P"/gNWcυfKM·#V3X2^ :kLrD43 ^(:Z& 蟀}A@mj"JCA8> bAo^igEdN i`0^Pa DjZch >s: 05ECaa)2JمI>=-9:3g4&B}$C<*> (`ln9̗|-X7ie Ʀ"gLҡ6[h}7ZP,8@k*Lc@̭ |M01eChb+y{g1̬ama|`^!=(m=[O#`6 iL2oCa6 t.'m-De5ve" Eh1mt& *˚]. X i 5"L@.t/1@~`#$^6lX2|i}Bx㚠(P(Y|K@]YGY#(W5_K%԰>۳& ߯1-Ě{piʹv<0 tcZ0?Čf}YyEKEg?ZJiH0F 0uDMt{6F̘VJ%fxCE3,S=QMÐԖֳWߝr/|vŲIS;  -*DaasLʏfaqם_b-MJZ&Dn x̲rS Xzf4ËR<| tg? L5Ez3 ] ]Ru eO֟7ͯXDKee1S4YkG윈O?ƝxEifiƘp:/_|t}ܵaW.%vnoh>spdu*jשVqƿ&{nk%a:9u;w6`^PIe ˈ"I-+V 0 Uo8srC ,4Kv5~A$Ui]Sa_A_pgiF索u^S"ӵz1T}G-oö.8c&A9)pu iͩ6i_ngp8Y]nwܮMpK=({ ےIs~YG)0 FџiMfC^m0`@{tOklr1`\w~b8fu^_Ď !ebHwo\f'qY9o*rmm k3P_3Ͱ71BF)&ptϞ1WX߇pyWuΜGU^.̔KN[&*Y`71MxŚfsHJ!6GPWcglq@\vDDd w=(U! p&@qqbfAYz1~ 92Ā͓bNDG*ܸ>mG03 j]W.?B6LXh}A#I@ /6oDd$y1SwV-Z}_}}7f52!k"9դ,OZjQ$&"&6 PWw d3Kd@ؐGW\\}xD#7031|$09v:PDE;DE٥(;"숊!*ʎo*׆ygyf'x1?bC7i^)O8? Nz3`ٲ$%kf4X}cO?&` ]A@5gJ׳`i)Ѿ~[A9l7тGkf~_={O,Lc3Ǟ«fll. fd(mkW.y;X-m]#)W!wGl0OiV&ѩQͬ]`uLlń^Aj!㖛cAӰ#W g|XdY30-%?mnNHi#6i@pqY˜r0b&(TG?>X-z=Zx45~?"`H?B8M45Nh,rnNBTT`S߿M[.=:=)1 ;&Pف/"4 <D~ğzeA +ପoo\`l(p%  TbȰPtq@'%"ǻ~+ZȚ/1PY3Wo>X-]{|"1y>d^3-|qQp jgRT9:-^#:Z>[%uRQI2l~<jg9:Ts駵R7e Uo*XWIX\q cqKLt ~$D"!UW@U=t9@m[J֍W Vd7"l&wdL5ZN *YaSރ2U1`R]~\Tt+ة&R| .CvT\(XAcU҅^ VU>w(Y\6_ KQ |A@T[>`>ϫXס7O@{(BSݺY}?0`]`A%W.]`5^ mkc3rsg"b> Zl0*$>X?:'UxvoS B&3D11HYP D􁈺ܻZ,p  VU @gqV$RpI Rjd f9cuG\joUw3 fbaH(S'Ol1ZE!NINܿ~qMj P D pRU~Q}? >j5e8{څ9w,@9Tl9؝.f6BZt +e͹+X]Acr'#B8BQSda]R$6{aA}@;. zAxk[?Շ{<"؋-Q0l<$@IA T1Z#bh|?_rK`hY{tTyjp~|?iR|ː_Yk<\tsl 6`QRdl12A (1QEʰC™Dzl **=>`ىޓMބY>$QMgL3@X%Aܬ" _y:A)9_MP]'a*K7J!B/W˶ ^haSGtA>@m c~>æG+nqlVCU\5{[ҡWTeJMҁ2`w,+߹z~fSE'!q/dlC~M,4|H @"gOmڑ.' K @GgȸS =?^@uQU OlʉiIENDB`mayavi-4.5.0/docs/source/mayavi/_templates/0000755000076500000240000000000012747722127021300 5ustar prabhustaff00000000000000mayavi-4.5.0/docs/source/mayavi/_templates/layout.html0000644000076500000240000000301012747716313023475 0ustar prabhustaff00000000000000{% extends '!layout.html' %} {%- block sidebarsearch %} {{ super() }}
{% endblock %} {% block extrahead %} {% endblock %} mayavi-4.5.0/docs/source/mayavi/advanced_scripting.rst0000644000076500000240000003460712747716313023536 0ustar prabhustaff00000000000000.. _advanced-scripting-with-mayavi: Advanced Scripting with Mayavi =============================== As elaborated in the :ref:`an-overview-of-mayavi` section, Mayavi can be scripted from Python in order to visualize data. Mayavi was designed from the ground up to be highly scriptable. Everything that can be done from the user interface can be achieved using Python scripts. Scripting the Mayavi2 application is a great way to add domain-specific functionality to the existing framework. In addition, understanding this application can help you design your own applications using Mayavi as powerful visualization library. If you are not looking to script the Mayavi2 application itself or to build an application, but looking for quick ways to get your visualization done with simple code you may want to check out Mayavi's `mlab` module. This is described in more detail in the :ref:`simple-scripting-with-mlab` section. In addition to this Mayavi features an automatic script recording feature that automatically writes Python scripts for you as you use the GUI. This is described in more detail in the :ref:`automatic-script-generation` chapter. This is probably the easiest and most powerful way to script Mayavi. However, to best understand how to script Mayavi, a reasonable understanding of the Mayavi internals is necessary. The following sections provide an overview of the basic design and objects in the Mayavi pipeline. Subsequent sections consider specific example scripts that are included with the Mayavi sources that illustrate the ideas. Mayavi uses Traits_ and TVTK_ internally. Traits_ in many ways changes the way we program. So it is important to have a good idea of Traits in order to understand Mayavi's internals. If you are unsure of Traits it is a good idea to get a general idea about Traits now. Trust me, your efforts learning Traits will not be wasted! .. _Traits: http://docs.enthought.com/traits .. _TVTK: http://docs.enthought.com/mayavi/tvtk Design Overview: Mayavi as a visualization framework ----------------------------------------------------- This section provides a brief introduction to Mayavi's internal architecture. The "big picture" of a visualization in Mayavi is that an ``Engine`` (``mayavi.engine.Engine``) object manages the entire visualization. The ``Engine`` manages a collection of ``Scene`` (``mayavi.core.scene.Scene``) objects. In each ``Scene``, a user may have created any number of ``Source`` (``mayavi.core.source.Source``) objects. A ``Source`` object can further contain any number of ``Filter`` (``mayavi.core.filter.Filter``) or ``ModuleManager`` (``mayavi.core.module_manager.ModuleManager``) objects. A ``Filter`` may contain either other ``filters`` or ``ModuleManagers``. A ``ModuleManager`` manages any number of ``Modules``. The figure below shows this hierarchy in a graphical form. .. image:: images/m2_big_picture.png :alt: Illustration of the various objects in the Mayavi pipeline. *Illustration of the various objects in the Mayavi pipeline.* This hierarchy is precisely what is seen in the Mayavi tree view on the UI. The UI is therefore merely a graphical representation of this internal world-view. A little more detail on these objects is given below. For even more details please refer to the source code (hint: the source code of a class can be view in IPython by entering `Class??`). .. _oo_construction_visualization: Object-oriented construction of a visualization ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ When scripting Mayavi to create or modify a visualization, one mainly deals with adding or removing objects to the engine, or modifying their properties. We can thus rewrite the example of building a pipeline with mlab visited in :ref:`controlling-the-pipeline-with-mlab-scripts` by explicit calls to the engine:: import numpy as np a = np.random.random((4, 4)) from mayavi.api import Engine e = Engine() e.start() s = e.new_scene() from mayavi.sources.api import ArraySource src = ArraySource(scalar_data=a) e.add_source(src) from mayavi.filters.api import WarpScalar, PolyDataNormals warp = WarpScalar() e.add_filter(warp, obj=src) normals = PolyDataNormals() e.add_filter(normals, obj=warp) from mayavi.modules.api import Surface surf = Surface() e.add_module(surf, obj=normals) As with all Mayavi code, you need to have the GUI mainloop running to have the visualization go live. To do this, type ``ipython --gui=qt`` in a Terminal or Command Prompt. This explicit, object-oriented, code thus mirrors the `mlab.pipeline` code. It is more fine-grained, and gives you more control. For instance it separates initialization of the objects, and their addition or removal to an engine. In general, it is more suited to developing an application, as opposed to a script. Life-cycle of the different objects ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ All objects in the Mayavi pipeline feature ``start`` and ``stop`` methods. The reasoning for this is that any object in Mayavi is not usable (i.e. it may not provide any outputs) unless it has been started. Similarly the ``stop`` method "deactivates" the object. This is done because Mayavi is essentially driving VTK objects underneath. These objects require inputs in order to do anything useful. Thus, an object that is not connected to the pipeline cannot be used. For example, consider an ``IsoSurface`` module. It requires some data in order to contour anything. Thus, the module in isolation is completely useless. It is usable only when it is added to the Mayavi pipeline. When an object is added to the pipeline, its inputs are setup and its ``start`` method is called automatically. When the object is removed from the pipeline its ``stop`` method is called automatically. Note that if you are looking to remove an object from the mayavi pipeline, you can use the ``remove`` method to do so. For example (the following will require that you use `ipython --gui=qt`):: >>> from mayavi.api import Engine >>> e = Engine() >>> e.start() >>> s = e.new_scene() >>> from mayavi.sources.api import ParametricSurface >>> p = ParametricSurface() >>> e.add_source(p) # calls p.start internally. >>> p.remove() # Removes p from the engine. Apart from the ``Engine`` object, all other objects in the Mayavi pipeline feature a ``scene`` trait which refers to the current ``tvtk.pyface.tvtk_scene.TVTKScene`` instance that the object is associated with. The objects also feature an ``add_child`` method that lets one build up the pipeline by adding "children" objects. The ``add_child`` method is "intelligent" and will try to appropriately add the child in the right place based on the context. Scripting the ``mayavi2`` application ------------------------------------- The ``mayavi2`` application is implemented in the ``mayavi.scripts.mayavi2`` module (look at the ``mayavi2.py`` file and not the ``mayavi2`` script). This code handles the command line argument parsing and runs the application. ``mayavi2`` is an Envisage_ application. It starts the Envisage application in its ``main`` method. The code for this is in the ``mayavi.plugins.app`` module. Mayavi uses several envisage plugins to build up its functionality. These plugins are defined in the ``mayavi.plugins.app`` module. In this module there are two functions that return a list of default plugins, ``get_plugins`` and the ``get_non_gui_plugins``. The default application uses the former which produces a GUI that the user can use. If one uses the latter (``get_non_gui_plugins``) then the mayavi tree view, object editor and menu items will not be available when the application is run. This allows a developer to create an application that uses mayavi but does not show its user interface. An example of how this may be done is provided in ``examples/mayavi/nongui.py``. .. _Envisage: http://docs.enthought.com/envisage Scripting from the UI ~~~~~~~~~~~~~~~~~~~~~ When using the ``mayavi2`` application, it is possible to script from the embedded Python interpreter on the UI. On the interpreter the name ``mayavi`` is automatically bound to an ``mayavi.plugins.script.Script`` instance that may be used to easily script mayavi. This instance is a simple wrapper object that merely provides some nice conveniences while scripting from the UI. It has an ``engine`` trait that is a reference to the running mayavi engine. Note that it is just as convenient to use an ``Engine`` instance itself to script mayavi. As described in :ref:`the-embedded-python-interpreter` section, one can always drag a mayavi pipeline object from the tree and drop it on the interpreter to script it directly. One may select the `File->Open Text File...` menu to open an existing Python file in the text editor, or choose the `File->New Text File` menu to create a new file. The text editor is Python-aware and one may write a script assuming that the ``mayavi`` name is bound to the ``Script`` instance as it is on the shell. To execute this script one can press ``Control-r`` as described earlier. ``Control-s`` will save the script. ``Control-b`` increases the font size and ``Control-n`` reduces it. The nice thing about this kind of scripting is that if one scripts something on the interpreter or on the editor, one may save the contents to a file, say ``script.py`` and then the next time this script can be run like so:: $ mayavi2 -x script.py This will execute the script for automatically. The name ``mayavi`` is available to the script and is bound to the ``Script`` instance. This is very convenient. It is possible to have mayavi execute multiple scripts. For example:: $ mayavi2 -d foo.vtk -m IsoSurface -x setup_iso.py -x script2.py will load the ``foo.vtk`` file, create an ``IsoSurface`` module, then run ``setup_iso.py`` and then run ``script2.py``. There are several scripts in the mayavi ``examples`` directory that should show how this can be done. The ``examples/README.txt`` contains some information on the recommended ways to script. Scripting from IPython ~~~~~~~~~~~~~~~~~~~~~~ It is possible to script Mayavi using IPython_. IPython will have to be invoked with the ``--gui=qt`` command line option in order to allow one to interactively script the mayavi application:: $ ipython --gui=qt To start a visualization do the following:: from mayavi.plugins.app import main # Note, this does not process any command line arguments. mayavi = main() # 'mayavi' is the mayavi Script instance. It is also possible to use `mlab` (see :ref:`simple-scripting-with-mlab`) for this purpose:: from mayavi import mlab f = mlab.figure() # Returns the current scene. engine = mlab.get_engine() # Returns the running mayavi engine. With this it should be possible to script Mayavi just the way it is done on the embedded interpreter or on the text editor. .. _IPython: http://ipython.scipy.org An example ~~~~~~~~~~ Here is an example script that illustrates various features of scripting Mayavi (note that this will work if you execute the following from the embedded Python shell inside Mayavi or if you run it as ``mayavi2 -x script.py``):: # Create a new mayavi scene. mayavi.new_scene() # Get the current active scene. s = mayavi.engine.current_scene # Read a data file. d = mayavi.open('fire_ug.vtu') # Import a few modules. from mayavi.modules.api import Outline, IsoSurface, Streamline # Show an outline. o = Outline() mayavi.add_module(o) o.actor.property.color = 1, 0, 0 # red color. # Make a few contours. iso = IsoSurface() mayavi.add_module(iso) iso.contour.contours = [450, 570] # Make them translucent. iso.actor.property.opacity = 0.4 # Show the scalar bar (legend). iso.module_manager.scalar_lut_manager.show_scalar_bar = True # A streamline. st = Streamline() mayavi.add_module(st) # Position the seed center. st.seed.widget.center = 3.5, 0.625, 1.25 st.streamline_type = 'tube' # Save the resulting image to a PNG file. s.scene.save('test.png') # Make an animation: for i in range(36): # Rotate the camera by 10 degrees. s.scene.camera.azimuth(10) # Resets the camera clipping plane so everything fits and then # renders. s.scene.reset_zoom() # Save the scene. s.scene.save_png('anim%d.png'%i) Sometimes, given a Mayavi ``Script`` instance or ``Engine``, it is handy to be able to navigate to a particular module/object. In the above this could be achieved as follows:: x = mayavi.engine.scenes[0].children[0].children[0].children[-1] print x In this case ``x`` will be set to the ``Streamline`` instance that we just created. There are plenty of examples illustrating various things in the ``examples/mayavi`` directory. These are all fairly well documented. In particular, the ``standalone.py`` example illustrates how one can script mayavi without using the envisage application at all. The ``offscreen.py`` example illustrates how this may be done using off screen rendering (if supported by your particular build of VTK). ``examples/README.txt`` contains some information on the recommended ways to script and some additional information. Using the Mayavi envisage plugins --------------------------------- The Mayavi-related plugin definitions to use are: * ``mayavi_plugin.py`` * ``mayavi_ui_plugin.py`` These are in the ``mayavi.plugins`` package. To see an example of how to use this see the ``mayavi.plugins.app`` module. The explorer3D example in ``examples/mayavi/explorer`` also demonstrates how to use Mayavi as an envisage plugin. If you are writing Envisage plugins for an application and desire to use the Mayavi plugins from your plugins/applications then it is important to note that Mayavi creates three workbench service offers for your convenience. These are: * ``mayavi.plugins.script.Script``: This is an ``mayavi.plugins.script.Script`` instance that may be used to easily script mayavi. It is a simple wrapper object that merely provides some nice conveniences while scripting from the UI. It has an ``engine`` trait that is a reference to the running Mayavi engine. * ``mayavi.core.engine.Engine``: This is the running Mayavi engine instance. A simple example that demonstrates the use of the Mayavi plugin in an envisage application is included in the ``examples/mayavi/explorer`` directory. This may be studied to understand how you may do the same in your envisage applications. .. Local Variables: mode: rst indent-tabs-mode: nil sentence-end-double-space: t fill-column: 70 End: mayavi-4.5.0/docs/source/mayavi/advanced_use.rst0000644000076500000240000000206112747716313022315 0ustar prabhustaff00000000000000.. include:: inline-css.rst .. _advanced-use-of-mayavi: Advanced use of Mayavi =============================== .. topic:: Section summary This section gives details on the working principles of Mayavi. Read it to gain a better understanding, in order to use Mayavi's full power. * First we describe the organisation of the pipeline that defines a Mayavi visualization. * Second we describe data structures, how they are defined and how you can build them. This information is useful for a better understanding of how to build efficient pipelines. * Finally we describe the object-oriented structure behind Mayavi and the pipeline. This information opens the door to advanced scripting of the Mayavi application, and is especially useful if you whish to develop custom tools with Mayavi. .. toctree:: pipeline.rst data.rst mayavi_objects.rst advanced_scripting.rst .. Local Variables: mode: rst indent-tabs-mode: nil sentence-end-double-space: t fill-column: 70 End: mayavi-4.5.0/docs/source/mayavi/api/0000755000076500000240000000000012747722127017714 5ustar prabhustaff00000000000000mayavi-4.5.0/docs/source/mayavi/api/core_view_objects.rst0000644000076500000240000000212712747716313024143 0ustar prabhustaff00000000000000 Main view and UI objects ========================= This is an API reference of the views for the main objects. The section :ref:`builing_applications` gives some context on how to use them. .. currentmodule:: mayavi.core.ui.api Scene UIs: :class:`DecoratedScene` and :class:`MayaviScene` -------------------------------------------------------------- .. autoclass:: DecoratedScene :members: :show-inheritance: .. autoclass:: MayaviScene :members: :show-inheritance: :class:`SceneEditor` --------------------- .. autoclass:: SceneEditor :members: :show-inheritance: :class:`MlabSceneModel` ----------------------- .. autoclass:: MlabSceneModel :members: :show-inheritance: :class:`EngineView` and :class:`EngineRichView` -------------------------------------------------- These are two objects to be used as views for an engine:: from mayavi.core.ui.api import EngineView view = EngineView(engine=engine) view.edit_traits() .. autoclass:: EngineView :members: :show-inheritance: .. autoclass:: EngineRichView :members: :show-inheritance: mayavi-4.5.0/docs/source/mayavi/api/index.rst0000644000076500000240000000020212747716313021547 0ustar prabhustaff00000000000000 Mayavi API reference ======================= .. toctree:: :maxdepth: 2 pipeline_objects.rst core_view_objects.rst mayavi-4.5.0/docs/source/mayavi/api/pipeline_objects.rst0000644000076500000240000000166612747716313023775 0ustar prabhustaff00000000000000 Pipeline base objects ====================== This is an API reference of the base classes of the pipeline objects. Please refer to section :ref:`advanced-use-of-mayavi` for instructions on how to use them. .. currentmodule:: mayavi.core.api :class:`Scene` ---------------- .. autoclass:: Scene :members: :show-inheritance: :class:`Source` ---------------- .. autoclass:: Source :members: :show-inheritance: :class:`Filter` ---------------- .. autoclass:: Filter :members: :show-inheritance: :class:`ModuleManager` ----------------------- .. autoclass:: ModuleManager :members: :show-inheritance: :class:`Module` ----------------------- .. autoclass:: Module :members: :show-inheritance: :class:`PipelineBase` ----------------------- .. autoclass:: PipelineBase :members: :show-inheritance: :class:`Engine` ----------------------- .. autoclass:: Engine :members: :show-inheritance: mayavi-4.5.0/docs/source/mayavi/application.rst0000644000076500000240000005144312747716313022207 0ustar prabhustaff00000000000000.. _using-the-mayavi-application: Using the Mayavi application ============================= .. topic:: Section summary This section primarily concerns interactive usage of the ``mayavi2`` application. Some of the things mentioned here also apply when Mayavi is scripted. However, if you are only interested in a quick start to use Mayavi as a simple, Matlab-like, plotting library, you can jump directly to the :ref:`simple-scripting-with-mlab` section, and come back later for a deeper understanding. .. contents:: Section contents :depth: 1 :local: .. include:: examples.rst .. _general-layout-of-ui: General layout of UI -------------------- When the `mayavi2` application is started it will provide a user interface that looks something like the figure shown below. .. image:: images/mayavi_ui_first.jpg :alt: Figure of Mayavi's initial UI window. :align: center The UI features several sections described below. :Menus: The menus let you open files, load modules, set preferences etc. :The Mayavi pipeline tree view: This is a tree view of the Mayavi pipeline. * Right click a tree node to rename, delete, copy the objects. * Left click on a node to edit its properties on the object editor below the tree. * It is possible to drag the nodes around on the tree. For example it is possible to drag and move a module from one set of Modules to another, or to move visualization from one scene to another. :The object editor: This is where the properties of Mayavi pipeline objects can be changed when an object on the pipeline is clicked. :Mayavi scenes: This is where the visualization of the data happens. One can interact with this scene via the mouse and the keyboard. More details are in the following sections. :Python interpreter: The built-in Python interpreter that can be used to script Mayavi and do other things. You can drag nodes from the Mayavi tree and drop them on the interpreter and then script the object represented by the node! If you have version of IPython_ above 0.9.1 installed, this Python interpreter will use IPython. :Logger: Application log messages may be seen here. .. _IPython: http://ipython.scipy.org/ Mayavi's UI layout is highly configurable: * the line in-between the sections can be dragged to resize particular views. * most of the "tabs" on the widgets can be dragged around to move them anywhere in the application. * Each view area (the Mayavi pipeline view, object editor, python shell and logger) can be enabled and disabled in the 'View' menu. Each time you change the appearance of Mayavi it is saved and the next time you start up the application it will have the same configuration. In addition, you can save different layouts into different "perspectives" using the `View->Perspectives` menu item. Shown below is a specifically configured Mayavi user interface view. In this view the size of the various parts are changed. .. image:: images/mayavi_ui_second.jpg :alt: Figure of Mayavi's UI after being configured by a user. :align: center Visualizing data ---------------- Visualization data in Mayavi is performed by loading some data as `data sources`, and applying visualization modules to these sources to visualize the data as described in the :ref:`an-overview-of-mayavi` section. To get a feeling of how this work, going through the :ref:`Parametric surfaces example ` can be helpful. One needs to have some data or the other loaded before a `Module` or `Filter` may be used. Mayavi supports several data file formats most notably VTK data file formats. Alternatively, :ref:`mlab ` can be used to load data from `numpy` arrays. For advanced information on data structures, refer to the :ref:`data-structures-used-by-mayavi` section. Once data is loaded one can optionally use a variety of :ref:`filters` to filter or modify the data in some way or the other and then visualize the data using several :ref:`modules`. Here we list all the Mayavi `modules` and `filters`. This list is useful as a reference: .. topic:: **List of modules and filters** .. toctree:: modules.rst filters.rst .. _interaction-with-the-scene: Interaction with the scene -------------------------- The Mayavi scenes on the UI can be closed by clicking on the little 'x' icon on the tab. Each scene features a toolbar that supports various features: * Buttons to set the view to view along the positive or negative X, Y and Z axes or obtain an isometric view. * A button to turn on parallel projection instead of the default perspective projection. This is particularly useful when one is looking at 2D plots. * A button to turn on an axes to indicate the x, y and z axes. * A button to turn on full-screen viewing. Note that once full-screen mode is entered one must press 'q' or 'e' to get back a normal window. * A button to save the scene to a variety of image formats. The image format to use is determined by the extension provided for the file. * A button that provides a UI to configure the scene properties. The primary means to interact with the scene is to use the mouse and keyboard. Mouse interaction ~~~~~~~~~~~~~~~~~ There are two modes of mouse interaction: * Camera mode: the default, where the camera is operated on with mouse moves. This mode is activated by pressing the 'c' key. * Actor mode: in this mode the mouse actions operate on the actor the mouse is currently above. This mode is activated by pressing the 'a' key. The view on the scene can be changed by using various mouse actions. Usually these are accomplished by holding down a mouse button and dragging. * holding the left mouse button down and dragging will rotate the camera/actor in the direction moved. - Holding down "SHIFT" when doing this will pan the scene -- just like the middle button. - Holding down "CONTROL" will rotate around the camera's axis (roll). - Holding down "SHIFT" and "CONTROL" and dragging up will zoom in and dragging down will zoom out. This is like the right button. * holding the right mouse button down and dragging upwards will zoom in (or increase the actors scale) and dragging downwards will zoom out (or reduce scale). * holding the middle mouse button down and dragging will pan the scene or translate the object. * Rotating the mouse wheel upwards will zoom in and downwards will zoom out. Keyboard interaction ~~~~~~~~~~~~~~~~~~~~ The scene supports several features activated via keystrokes. These are: :'3': Turn on/off stereo rendering. This may not work if the 'stereo' preference item is not set to True. :'a': Use actor mode for mouse interaction instead of camera mode. :'c': Use camera mode for mouse interaction instead of actor mode. :'e'/'q'/'Esc': Exit full-screen mode. :'f': Move camera's focal point to current mouse location. This will move the camera focus to center the view at the current mouse position. :'j': Use joystick mode for the mouse interaction. In joystick mode the mouse somewhat mimics a joystick. For example, holding the mouse left button down when away from the center will rotate the scene. :'l': Configure the lights that are illumining the scene. This will pop-up a window to change the light configuration. :'p': Pick the data at the current mouse point. This will pop-up a window with information on the current pick. The UI will also allow one to change the behavior of the picker to pick cells, points or arbitrary points. :'r': Reset the camera focal point and position. This is very handy. :'s': Save the scene to an image, this will first popup a file selection dialog box so you can choose the filename, the extension of the filename determines the image type. :'t': Use trackball mode for the mouse interaction. This is the default mode for the mouse interaction. :'='/'+': Zoom in. :'-': Zoom out. :'left'/'right'/'up'/'down' arrows: Pressing the left, right, up and down arrow let you rotate the camera in those directions. When "SHIFT" modifier is also held down the camera is panned. From interactive usage to scripting ------------------------------------- It is easy to learn how to script Mayavi when using the interactive application. In this sub-section, we give a few tips for this purpose. .. _the-embedded-python-interpreter: The embedded Python interpreter ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The embedded Python interpreter offers extremely powerful possibilities. The interpreter features command completion, automatic documentation, tooltips and some multi-line editing. In addition it supports the following features: * The name ``mayavi`` is automatically bound to the ``mayavi.script.Script`` instance. This may be used to easily script Mayavi. * The name ``application`` is bound to the envisage application. * If a Python file is opened via the ``File->Open File...`` menu item one can edit it with a color syntax capable editor. To execute this script in the embedded Python interpreter, the user may type ``Control-r`` on the editor window. To save the file press ``Control-s``. This is a very handy feature when developing simple Mayavi scripts. You can also increase and decrease the font size using ``Control-n`` and ``Control-s``. * As mentioned earlier, one may drag and drop nodes from the Mayavi pipeline tree view onto the Python shell. The object may then be scripted as one normally would. A commonly used pattern when this is done is the following:: >>> tvtk_scene_1 >>> s = _ In this case the name ``s`` is bound to the dropped tvtk_scene object. The ``_`` variable stores the last evaluated expression which is the dropped object. Using ``tvtk_scene_1`` will also work but is a mouthful. .. _automatic-script-generation: Recording Mayavi actions to a script ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Mayavi features a very handy and powerful script recording facility. This can be used to: - record all actions performed on the Mayavi UI into a *human readable*, Python script that should be able to recreate your visualization. - learn how to script the Mayavi objects, in combination with :ref:`mlab `. Here is how you can use this feature: 1. When you start the ``mayavi2`` application, on the pipeline tree view toolbar you will find a red record icon next to the question mark icon. Click it. Note that this will also work from a standalone mlab session, on the toolbar of the :ref:`Mayavi pipeline window `. 2. You'll see a window popup with a few lines of boilerplate code so you can run your script standalone/with ``mayavi2 -x script.py ``or ``python script.py``. Keep this window open and ignore for now the ``Save script`` button, which will be used when you are finished. 3. Now do anything you please on the UI. As you perform those actions, the code needed to perform those actions is added to the code listing and displayed in the popup window. For example, create a new source (either via the adder node dialog/view, the file menu or right click, i.e. any normal option), then add a module/filter etc. Modify objects on the tree view. 4. Move the camera on the UI, rotate the camera, zoom, pan. All of these will generate suitable Python code. For the camera only the end position is stored (otherwise you'll see millions of useless lines of code). The major keyboard actions on the scene are recorded (except for the 'c'/'t'/'j'/'a' keys). This implies that it will record any left/right/up/down arrows the '+'/'-' keys etc. Since the code is updated as the actions are performed, this is a nice way to learn the Mayavi API. 5. Once you are done, clicking on the record icon again will stop the recording: in the pop-up window, the ``Recording`` box will be ticked off and no code corresponding to new actions will be displayed any more. If you want to save the recorded script to a Python file, click on the ``Save script`` button at the bottom of the window. Save the script to some file, say ``script.py``. If you are only interested in the code and not saving a file you may click cancel at this point. 6. Close the recorder window. You can quit Mayavi, if you want to. 7. Now from the shell do:: $ mayavi2 -x script.py or even:: $ python script.py These should run all the code to get you where you left. You can feel free to edit this generated script -- in fact that is the whole point of automatic script generation! It is important to understand that it is possible to script an existing session of Mayavi too. So, if after starting Mayavi you did a few things or ran a Mayavi script and then want to record any further actions, that are certainly possible. Follow the same procedure as before. The only gotcha you have to remember in this case is that the script recorder will not create the objects you already have setup on the session. .. note:: You should also be able to delete/drag drop objects on the Mayavi tree view. However, these probably aren't things you'd want to do in an automatic script. As noted earlier, script recording will work for a ``mlab`` session or anywhere else where Mayavi is used. It will not generate any ``mlab`` specific code but write generic Mayavi code using the OO Mayavi API. .. _recording-limitations: .. warning:: Limitations The script recorder works for some important actions. At this point it does not support the following actions: - On the scene, the 'c'/'t'/'j'/'a'/'p' keys are not recorded correctly since this is much more complicated to implement and typically not necessary for basic scripting. - Arbitrary scripting of the interface is obviously not going to work as you may expect. - Only trait changes and specific calls are recorded explicitly in the code. So calling arbitrary methods on arbitrary Mayavi objects will not record anything typically. .. _command-line-arguments: Command line arguments ---------------------- The ``mayavi2`` application features several useful command line arguments that are described in the following section. These options are described in the ``mayavi2`` man page as well. A complete pipeline may be built from the command line, so that Mayavi can be integrated in shell scripts to provide useful visualizations. Mayavi can be run like so:: mayavi2 [options] [args] Where ``arg1``, ``arg2`` etc. are optional file names that correspond to saved Mayavi2 visualizations (``filename.mv2``), Mayavi2 scripts (``filename.py``) or any datafile supported by Mayavi. If no options or arguments are provided Mayavi will start up with a default blank scene. The options are: -h This prints all the available command line options and exits. Also available through ``--help``. -V This prints the Mayavi version on the command line and exits. Also available through ``--version``. -z file_name This loads a previously saved Mayavi2 visualization. Also available through ``--viz file_name`` or ``--visualization file_name``. -d data_file Opens any of the supported data file formats or non-file associated data source objects. This includes VTK file formats (``*.vtk``, ``*.xml``, ``*.vt[i,p,r,s,u]``, ``*.pvt[i,p,r,s,u]``), VRML2 (``*.wrl``), 3D Studio (``*.3ds``), PLOT3D (``*.xyz``), STL, BYU, RAW, PLY, PDB, SLC, FACET, OBJ, AVSUCD (``*.inp``), GAMBIT (``*.neu``), Exodus (``*.exii``), PNG, JPEG, BMP, PNM, DCM, DEM, MHA, MHD, MINC, XIMG, TIFF, and various others that are supported. Note that ``data_file`` can also be a source object not associated with a file, for example ``ParametricSurface`` or ``PointLoad`` will load the corresponding data sources into Mayavi. Also available through ``--data``. -m module-name A module is an object that actually visualizes the data. The given ``module-name`` is loaded in the current ``ModuleManager``. The module name must be a valid one if not you will get an error message. If a module is specified as ``package.sub.module.SomeModule`` then the module (``SomeModule``) is imported from ``package.sub.module``. Standard modules provided with ``mayavi2`` do not need the full path specification. For example:: mayavi2 -d data.vtk -m Outline -m user_modules.AModule In this example ``Outline`` is a standard module and ``user_modules.AModule`` is some user defined module. Also available through ``--module``. -f filter-name A filter is an object that filters out the data in some way or the other. The given ``filter-name`` is loaded with respect to the current source/filter object. The filter name must be a valid one if not you will get an error message. If the filter is specified as ``package.sub.filter.SomeFilter`` then the filter (``SomeFilter``) is imported from ``package.sub.filter``. Standard modules provided with ``mayavi2`` do not need the full path specification. For example:: mayavi2 -d data.vtk -f ExtractVectorNorm -f user_filters.AFilter In this example ``ExtractVectorNorm`` is a standard filter and ``user_filters.AFilter`` is some user defined filter. Also available through ``--filter``. -M Starts up a new module manager on the Mayavi pipeline. Also available through ``--module-mgr``. -n Creates a new window/scene. Any options passed after this will apply to this newly created scene. Also available through ``--new-window``. -o Run Mayavi in off-screen mode without any graphical user interface. This is most useful for scripts that need to render images off-screen (for an animation say) in the background without an intrusive user interface popping up. Mayavi scripts (run via the ``-x`` argument) should typically work fine in this mode. Also available through, ``--off-screen``. -x script-file This executes the given script in a namespace where we guarantee that the name 'mayavi' is Mayavi's script instance -- just like in the embedded Python interpreter. Also available through ``--exec``. -t Runs the Mayavi test suite and exits. If run as such, this runs both the TVTK and Mayavi2 unit tests. If any additional arguments are passed they are passed along to the test runner. So this may be used to run other tests as well. For example:: mayavi2 -t apptools.persistence This will run just the tests inside the ``apptools.persistence`` package. You can also specify a directory with test files to run with this, for example:: mayavi2 -t relative_path_to/integrationtests/mayavi will run the integration tests from the Mayavi sources. Also available as ``--test``. -s python-expression Execute the python-expression on the last created object. For example, let's say the previous object was a module. If you want to set the color of that object and save the scene, you may do:: $ mayavi2 [...] -m Outline -s"actor.property.color = (1,0,0)" \ -s "scene.save('test.png', size=(800, 800))" You should use quotes for the expression. This is also available through ``--set``. .. warning:: Note that ``-x`` or ``--exec`` uses `execfile`, so this can be dangerous if the script does something nasty! Similarly, ``-s`` or ``--set`` uses `exec`, which can also be dangerous if abused. It is important to note that Mayavi's **command line arguments are processed sequentially** in the same order they are given. This allows users to do interesting things. Here are a few examples of the command line arguments:: $ mayavi2 -d ParametricSurface -s "function='dini'" -m Surface \ -s "module_manager.scalar_lut_manager.show_scalar_bar = True" \ -s "scene.isometric_view()" -s "scene.save('snapshot.png')" $ mayavi2 -d heart.vtk -m Axes -m Outline -m GridPlane \ -m ContourGridPlane -m IsoSurface $ mayavi2 -d fire_ug.vtu -m Axes -m Outline -m VectorCutPlane \ -f MaskPoints -m Glyph In the above examples, ``heart.vtk`` and ``fire_ug.vtu`` VTK files can be found in the ``examples/data`` directory in the source. They may also be installed on your computer depending on your particular platform. .. Local Variables: mode: rst indent-tabs-mode: nil sentence-end-double-space: t fill-column: 70 End: mayavi-4.5.0/docs/source/mayavi/auto/0000755000076500000240000000000012747722127020113 5ustar prabhustaff00000000000000mayavi-4.5.0/docs/source/mayavi/auto/adjust_cropping_extents.py0000644000076500000240000000770512747716313025443 0ustar prabhustaff00000000000000""" A custom dialog to adjust the parameters of a GeometryFilter to crop data points. This example shows how to use a GeometryFilter to crop data points, but also how to build a custom dialog to easily set interactively parameters of a filter, or any other Mayavi object. The GeometryFilter crops all data within a bounding box specified by 'extents'. In this example, we want to be able to tweak these extents interactively. For this, we build a Traits object that has 'x_min', 'x_max', 'y_min', ... attributes. Traits enables us to represent this object as a dialog box. We use a callback called when these attributes are modified to propagate them to the filter. For more information on creating GUIs with Traits: http://docs.enthought.com/traitsui http://docs.enthought.com/traits https://support.enthought.com/hc/en-us/articles/204469620-Introductory-materials-for-Traits-and-Traits-UI """ # Author: Gael Varoquaux # Copyright (c) 2010, Enthought, Inc. # License: BSD Style. ################################################################################ # Create a set of points, with given density import numpy as np x, y, z, s = np.random.random((4, 500)) ################################################################################ # A dialog to edit a range interactively and propagate it to the filter from traits.api import HasTraits, Range, Float, Instance, \ on_trait_change from traitsui.api import View class ExtentDialog(HasTraits): """ A dialog to graphical adjust the extents of a filter. """ # Data extents data_x_min = Float data_x_max = Float data_y_min = Float data_y_max = Float data_z_min = Float data_z_max = Float x_min = Range('data_x_min', 'data_x_max', 'data_x_min') x_max = Range('data_x_min', 'data_x_max', 'data_x_max') y_min = Range('data_y_min', 'data_y_max', 'data_y_min') y_max = Range('data_y_min', 'data_y_max', 'data_y_max') z_min = Range('data_z_min', 'data_z_max', 'data_z_min') z_max = Range('data_z_min', 'data_z_max', 'data_z_max') filter = Instance(HasTraits, allow_none=False) @on_trait_change('x_min,x_max,y_min,y_max,z_min,z_max') def update_extent(self): if (self.filter is not None and self.x_min < self.x_max and self.y_min < self.y_max and self.z_min < self.z_max ): self.filter.extent = (self.x_min, self.x_max, self.y_min, self.y_max, self.z_min, self.z_max) view = View('x_min', 'x_max', 'y_min', 'y_max', 'z_min', 'z_max', title='Edit extent', resizable=True) ################################################################################ # Now build the visualization using mlab from mayavi import mlab fig = mlab.figure(1, bgcolor=(1, 1, 1)) # Create unconnected points pts = mlab.pipeline.scalar_scatter(x, y, z, s) mlab.outline(pts) # Use a geometry_filter to filter with a bounding box geometry_filter = mlab.pipeline.user_defined(pts, filter='GeometryFilter') geometry_filter.filter.extent_clipping = True # Connect our dialog to the filter extent_dialog = ExtentDialog( data_x_min=0, data_x_max=1, data_y_min=0, data_y_max=1, data_z_min=0, data_z_max=1, filter=geometry_filter.filter) # We need to use 'edit_traits' and not 'configure_traits()' as we do # not want to start the GUI event loop (the call to mlab.show()) # at the end of the script will do it. extent_dialog.edit_traits() # The geometry_filter leaves hanging points, we need to add a # CleanPolyData filter to get rid of these. clip = mlab.pipeline.user_defined(geometry_filter, filter='CleanPolyData') # Finally, visualize the remaining points with spheres using a glyph # module spheres = mlab.pipeline.glyph(clip, scale_factor=.1) mlab.show() mayavi-4.5.0/docs/source/mayavi/auto/atomic_orbital.py0000644000076500000240000000543412747716313023463 0ustar prabhustaff00000000000000""" An example showing the norm and phase of an atomic orbital: isosurfaces of the norm, with colors displaying the phase. This example shows how you can apply a filter on one data set, and dislay a second data set on the output of the filter. Here we use the contour filter to extract isosurfaces of the norm of a complex field, and we display the phase of the field with the colormap. The field we choose to plot is a simplified version of the 3P_y atomic orbital for hydrogen-like atoms. The first step is to create a data source with two scalar datasets. The second step is to apply filters and modules, using the 'set_active_attribute' filter to select on which data these apply. Creating a data source with two scalar datasets is actually slighlty tricky, as it requires some understanding of the layout of the datasets in TVTK. The reader is referred to :ref:`data-structures-used-by-mayavi` for more details. """ # Author: Gael Varoquaux # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. # Create the data ############################################################ import numpy as np x, y, z = np.ogrid[- .5:.5:200j, - .5:.5:200j, - .5:.5:200j] r = np.sqrt(x ** 2 + y ** 2 + z ** 2) # Generalized Laguerre polynomial (3, 2) L = - r ** 3 / 6 + 5. / 2 * r ** 2 - 10 * r + 6 # Spherical harmonic (3, 2) Y = (x + y * 1j) ** 2 * z / r ** 3 Phi = L * Y * np.exp(- r) * r ** 2 # Plot it #################################################################### from mayavi import mlab mlab.figure(1, fgcolor=(1, 1, 1), bgcolor=(0, 0, 0)) # We create a scalar field with the module of Phi as the scalar src = mlab.pipeline.scalar_field(np.abs(Phi)) # And we add the phase of Phi as an additional array # This is a tricky part: the layout of the new array needs to be the same # as the existing dataset, and no checks are performed. The shape needs # to be the same, and so should the data. Failure to do so can result in # segfaults. src.image_data.point_data.add_array(np.angle(Phi).T.ravel()) # We need to give a name to our new dataset. src.image_data.point_data.get_array(1).name = 'angle' # Make sure that the dataset is up to date with the different arrays: src.update() # We select the 'scalar' attribute, ie the norm of Phi src2 = mlab.pipeline.set_active_attribute(src, point_scalars='scalar') # Cut isosurfaces of the norm contour = mlab.pipeline.contour(src2) # Now we select the 'angle' attribute, ie the phase of Phi contour2 = mlab.pipeline.set_active_attribute(contour, point_scalars='angle') # And we display the surface. The colormap is the current attribute: the phase. mlab.pipeline.surface(contour2, colormap='hsv') mlab.colorbar(title='Phase', orientation='vertical', nb_labels=3) mlab.show() mayavi-4.5.0/docs/source/mayavi/auto/boy.py0000644000076500000240000000206312747716313021257 0ustar prabhustaff00000000000000""" A script to generate the Mayavi logo: a Boy surface. The boy surface is a mathematical parametric surface, see http://en.wikipedia.org/wiki/Boy%27s_surface . We display it by sampling the two parameters of the surface on a grid and using the mlab's mesh function: :func:`mayavi.mlab.mesh`. """ # Author: Gael Varoquaux # Copyright (c) 2007, Enthought, Inc. # License: BSD Style. from numpy import sin, cos, mgrid, pi, sqrt from mayavi import mlab mlab.figure(fgcolor=(0, 0, 0), bgcolor=(1, 1, 1)) u, v = mgrid[- 0.035:pi:0.01, - 0.035:pi:0.01] X = 2 / 3. * (cos(u) * cos(2 * v) + sqrt(2) * sin(u) * cos(v)) * cos(u) / (sqrt(2) - sin(2 * u) * sin(3 * v)) Y = 2 / 3. * (cos(u) * sin(2 * v) - sqrt(2) * sin(u) * sin(v)) * cos(u) / (sqrt(2) - sin(2 * u) * sin(3 * v)) Z = -sqrt(2) * cos(u) * cos(u) / (sqrt(2) - sin(2 * u) * sin(3 * v)) S = sin(u) mlab.mesh(X, Y, Z, scalars=S, colormap='YlGnBu', ) # Nice view from the front mlab.view(.0, - 5.0, 4) mlab.show() mayavi-4.5.0/docs/source/mayavi/auto/bunny.py0000644000076500000240000000214512566026643021621 0ustar prabhustaff00000000000000""" Viewing Stanford 3D Scanning Repository bunny model """ # Copyright (c) 2014-2015, Enthought, Inc. # Standard library imports import os from os.path import join # Enthought library imports from mayavi import mlab ### Download the bunny data, if not already on disk ############################ if not os.path.exists('bunny.tar.gz'): # Download the data try: from urllib import urlopen except ImportError: from urllib.request import urlopen print("Downloading bunny model, Please Wait (3MB)") opener = urlopen( 'http://graphics.stanford.edu/pub/3Dscanrep/bunny.tar.gz') open('bunny.tar.gz', 'wb').write(opener.read()) # Extract the data import tarfile bunny_tar_file = tarfile.open('bunny.tar.gz') try: os.mkdir('bunny_data') except: pass bunny_tar_file.extractall('bunny_data') bunny_tar_file.close() # Path to the bunny ply file bunny_ply_file = join('bunny_data', 'bunny', 'reconstruction', 'bun_zipper.ply') # Render the bunny ply file mlab.pipeline.surface(mlab.pipeline.open(bunny_ply_file)) mlab.show() import shutil shutil.rmtree('bunny_data') mayavi-4.5.0/docs/source/mayavi/auto/canyon.py0000644000076500000240000000350512747716313021757 0ustar prabhustaff00000000000000""" Retrieve radar data from the NASA and plot a view of the Grand Canyon landscape. We cannot display the whole data, as it would be too big. To display more, see the canyon decimation example. This example is interesting as it shows how numpy can be used to load and crop data completly foreign to Mayavi. """ # Author: Gael Varoquaux # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. # Retrieve the grand Canyon topological data ################################## import os # Original file: #'ftp://e0srp01u.ecs.nasa.gov/srtm/version2/SRTM1/Region_04/N36W113.hgt.zip' if not os.path.exists('N36W113.hgt.zip'): # Download the data try: from urllib import urlopen except ImportError: from urllib.request import urlopen print('Downloading data, please wait (10M)') opener = urlopen( 'https://s3.amazonaws.com/storage.enthought.com/www/sample_data/N36W113.hgt.zip' ) open('N36W113.hgt.zip', 'wb').write(opener.read()) # Load the data (signed 2 byte integers, big endian) ########################## import zipfile import numpy as np data = np.fromstring(zipfile.ZipFile('N36W113.hgt.zip').read('N36W113.hgt'), '>i2') data.shape = (3601, 3601) data = data.astype(np.float32) # Plot an interesting section ################################################# from mayavi import mlab data = data[:1000, 900:1900] # Convert missing values into something more sensible. data[data == -32768] = data[data > 0].min() mlab.figure(size=(400, 320), bgcolor=(0.16, 0.28, 0.46)) mlab.surf(data, colormap='gist_earth', warp_scale=0.2, vmin=1200, vmax=1610) # The data takes a lot of memory, and the surf command has created a # copy. We free the inital memory. del data # A view of the canyon mlab.view(-5.9, 83, 570, [5.3, 20, 238]) mlab.show() mayavi-4.5.0/docs/source/mayavi/auto/canyon_decimation.py0000644000076500000240000000647112747716313024160 0ustar prabhustaff00000000000000""" Use the greedy-terrain-decimator to display a decimated terrain view. This example illustrates decimating a terrain. We use the greedy-terrain-decimator to create a reduced mesh with an optimized grid that approximates the initial regular grid. The initial grid is displayed in white, and the optimized grid is displayed in black, with the surface it creates. The initial grid can be seen disappearing as it goes under the surface of the approximated grid: although the decimated mesh follows closely the orginal, it is not exactly the same. One can see that the reduction in number of polygons is huge: the white grid is much finer than the black grid. It is interesting to note that the decimated mesh follows closely the original mesh, including in number of polygons, in spots where the terrain changes most quickly. This example uses the Grand Canyon topological radar data, from NASA. The greedy-terrain-decimator is only useful to decimate a surface warped from 2D data. To decimated more general meshes, you can use the less-efficient decimate-pro filter (see :ref:`example_julia_set_decimation`). """ # Author: Gael Varoquaux # Copyright (c) 2008-2015, Enthought, Inc. # License: BSD Style. # Retrieve the grand Canyon topological data ################################### # Original file: #'ftp://e0srp01u.ecs.nasa.gov/srtm/version2/SRTM1/Region_04/N36W113.hgt.zip' import os if not os.path.exists('N36W113.hgt.zip'): # Download the data try: from urllib import urlopen except ImportError: from urllib.request import urlopen print('Downloading data, please wait (10M)') opener = urlopen( 'https://s3.amazonaws.com/storage.enthought.com/www/sample_data/N36W113.hgt.zip' ) open('N36W113.hgt.zip', 'wb').write(opener.read()) # Load the data (signed 2 byte integers, big endian) ########################### import zipfile import numpy as np data = np.fromstring(zipfile.ZipFile('N36W113.hgt.zip').read('N36W113.hgt'), '>i2') data.shape = (3601, 3601) data = data[200:400, 1200:1400] data = data.astype(np.float32) # Plot an interecting section ################################################## from mayavi import mlab mlab.figure(1, size=(450, 390)) mlab.clf() data = mlab.pipeline.array2d_source(data) # Use a greedy_terrain_decimation to created a decimated mesh terrain = mlab.pipeline.greedy_terrain_decimation(data) terrain.filter.error_measure = 'number_of_triangles' terrain.filter.number_of_triangles = 5000 terrain.filter.compute_normals = True # Plot it black the lines of the mesh lines = mlab.pipeline.surface(terrain, color=(0, 0, 0), representation='wireframe') # The terrain decimator has done the warping. We control the warping # scale via the actor's scale. lines.actor.actor.scale = [1, 1, 0.2] # Display the surface itself. surf = mlab.pipeline.surface(terrain, colormap='gist_earth', vmin=1450, vmax=1650) surf.actor.actor.scale = [1, 1, 0.2] # Display the original regular grid. This time we have to use a # warp_scalar filter. warp = mlab.pipeline.warp_scalar(data, warp_scale=0.2) grid = mlab.pipeline.surface(warp, color=(1, 1, 1), representation='wireframe') mlab.view(-17, 46, 143, [1.46, 8.46, 269.4]) mlab.show() mayavi-4.5.0/docs/source/mayavi/auto/changes.rst0000644000076500000240000016737112747716326022300 0ustar prabhustaff00000000000000Mayavi 4.5.0 ============ Enhancements ------------ 21 Jul 2016 `#415 `_ (PR) - Jupyter notebook support! Adds support for displaying Mayavi images or x3d scenes on the notebook. The x3d scenes allow one to fully interact with the scene in the notebook. More documentation is available at :ref:`jupyter_notebook`. 09 Jul 2016 `#411 `_ (PR) - Adds support for recording movies and animating timesteps. See :ref:`animating_a_timeseries` and :ref:`animating_a_visualization` for more details. 07 Jul 2016 `#410 `_ (daytonb) - Updated LUTs to include new matplotlib colorschemes, this includes the new viridis colormap. Fixes ----- 30 Jul 2016 `#416 `_ (PR) - Fix several bugs, `#397 `_ where PDF files were not saved properly. Fix issues with ``tvtk.visual`` and add many tests for it, this fixes `#387 `_. Refactor the save screenshot dialog popups. Fix problem with the picker point not showing when "p" is pressed on the scene. 29 Jul 2016 `#417 `_ (patricksnape) - Python 3 fixes for the jupyter notebook support. 08 Jul 2016 `#413 `_ (PR) - Fixes `#388 `_ where tubes were not showing on protein demo. 03 Jul 2016 `#408 `_ (ryanpepper) - Add additional save options. 04 Jul 2016 `#406 `_ (PR) - Fixes `#403 `_ where the image plane widget and volume modules were broken. 06 Jul 2016 `#405 `_ (itziakos) - Debug info on code gen for wrapper generation. 16 Jun 2016 `#394 `_ (PR) - BUG: Fix slice unstructured grid module. 17 Jun 2016 `#391 `_ (SiggyF) - Fix typo in readme. 13 May 2016 `#386 `_ (itziakos) - update codecov configuration 04 May 2016 `#376 `_ (stefanoborini) - Documentation for QString API failure. 04 May 2016 `#375 `_ (stefanoborini) - Fixes incorrect signature of ``EnvisageEngine.new_scene``. 03 May 2016 `#374 `_ (stefanoborini) - Fix for unexpected test code. 13 May 2016 `#370 `_ (kitchoi) - Fix "_p_void" values in TVTK with VTK 6.x 29 Apr 2016 `#364 `_ (stefanoborini) - Fix failing test for custom import in some circumstances 27 Apr 2016 `#358 `_ (stefanoborini) - Removes ``array_ext.so/pyd`` on clean 25 Apr 2016 `#356 `_ (stefanoborini) - Check if test successful with the appropriate filename. 27 Apr 2016 `#355 `_ (stefanoborini) - Unicode trait handling for those vtk methods returning unicode data 24 Apr 2016 `#352 `_ (kitchoi) - ENH: Nice load pylab_luts.pkl 27 Apr 2016 `#351 `_ (stefanoborini) - Document object identity behavior matching VTK 21 Apr 2016 `#349 `_ (kitchoi) - Revert "Fix savefig size and black image" 27 Apr 2016 `#348 `_ (stefanoborini) - Added setup.py documentation for Qt requirements 27 Apr 2016 `#345 `_ (kitchoi) - Add VTK 6.3 and VTK 7 to travis ci 20 Apr 2016 `#341 `_ (kitchoi) - Fix traitsdoc setup and compliance with py3 20 Apr 2016 `#340 `_ (kitchoi) - Import and integer division in python3 20 Apr 2016 `#335 `_ (kitchoi) - Fix texture on ``mlab.surf``, issue `#211 `_. 20 Apr 2016 `#334 `_ (stefanoborini) - Fixes Quiver3d Failure with different argument types 20 Apr 2016 `#332 `_ (kitchoi) - Fix Text3D in VTK 6.0+ 21 Apr 2016 `#331 `_ (kitchoi) - Fix savefig size and black image 20 Apr 2016 `#330 `_ (stefanoborini) - Fix for exception when modifying extents 01 Apr 2016 `#329 `_ (stefanoborini) - Suppresses test for VTK 6.2 (solves appVeyor random failure) 20 Apr 2016 `#327 `_ (stefanoborini) - Forces pipeline update when LUT changes 01 Apr 2016 `#326 `_ (stefanoborini) - Fix for test failure on mayavi -t 28 Mar 2016 `#323 `_ (stefanoborini) - Enforce ordering of attribute labels in VTKDataSource. 28 Mar 2016 `#315 `_ (stefanoborini) - Apply has_attribute to the output in VTKFileReader 17 Mar 2016 `#313 `_ (kitchoi) - Replacing links to code. and svn.enthought.com 09 Mar 2016 `#310 `_ (kitchoi) - Fix Camera off-centered when loading saved visualization 09 Mar 2016 `#309 `_ (PR) - Update to use new VTK pipeline where possible. This fixes a number of issues with the pipeline was not updating properly. 09 Mar 2016 `#306 `_ (kitchoi) - Fix issue with ``mlab.move`` 01 Apr 2016 `#304 `_ (kitchoi) - Fix issue `#302 `_, segfault when savefig is called multiple times. 09 Mar 2016 `#303 `_ (kitchoi) - Fix get_engine behavior when backend is changed again. Mayavi 4.4.4 ============ Enhancements ------------ 21 Jan 2016 (PR) - Add experimental Python3 support Fixes ----- 27 Feb 2016 (PR) - Ensure the cut plane is updated when the plane is changed in the GUI 27 Feb 2016 (kitchoi) - Use off screen engine when mlab's offscreen option is enabled 26 Feb 2016 (mabl) - Cast the window id to an int in the render window interactor 27 Feb 2016 (kitchoi) - Update installation guide 27 Feb 2016 (PR) - Update docs to use Qt instead of wx 24 Feb 2016 (kitchoi) - Update documentation setup 24 Feb 2016 (PR) - Allow TVTK to be used without UI/X server 23 Feb 2016 (kitchoi) - Update documentation links 17 Feb 2016 (kitchoi) - Make sure the array shape and size match 17 Feb 2016 (IT) - Ensure __file__ attribute points to the correct path when running a script from Mayavi2 09 Feb 2016 (jonathanrocher) - Avoid multiple identical keys in keyPressEvent. This is observed on slow machines 22 Jan 2016 (IT) - Do not use get-pip or wheel to upgrade pip on appveyor 10 Sep 2015 (alexendreleroux) - Fix broken link in docs left hand side menu bar Mayavi 4.4.3 ============ Enhancements ------------ 01 Jul 2015 (IT) - Update the readme fixing dead links 01 Jul 2015 (IT) - Use new Travis CI containers for faster builds 22 Jun 2015 (IT) - Add CI tests on Windows using Appveyor Fixes ----- 11 Aug 2015 (DS, IT, PR) - Remove reference cycles from various objects to fix memory leaks. Add unit test that provides an API to test garbage collection. 10 Aug 2015 (PR) - Fix the LUT manager to select the correct lut mode for QT backend 04 Aug 2015 (IT) - Use the python-wxtool package to speed up Travis CI build 04 Aug 2015 (DS) - Fix TVTK wrapper to allow look up with long keys for Points 23 Jul 2015 (DS) - Fix glyph to handle the masking of input points 22 Jul 2015 (IT) - Update the docs with known bugs, issues list and describe the PR workflow on github for development and documentation. 20 Jul 2015 (DS) - Fix TVTK wrapper to update number of cells when a cell is inserted in a VTK cell array 15 Jul 2015 (DS) - Fix VKTFileReader to update output when using standalone 24 Jun 2015 (PR) - Fix the sdist command Mayavi 4.4.2 ============ Enhancements ------------ 11 Jun 2015 (DS) - Upgrade the VTK parser to add support for VTK 6.2. Mayavi 4.4.1 ============ Fixes ----- 23 Apr 2015 (DS) - Fix trackpad scrolling to zoom in/out smoothly on OS X. Mayavi 4.4.0 ============ Enhancements ------------ 22 Dec 2014 (DS) - Add function to set data at input port, add stanford (bunny, dragon, lucy) examples, and use new volume mapper for new pipeline. 24 Jan 2014 (DS) - Upgrade to VTK 6.0 with VTK's new pipeline. Fixes ----- 22 Dec 2014 (DS) - Support dynamic dimensions in array source. 03 Dec 2014 (paulmueller) - Fix MRI brain data URL. 13 Nov 2014 (DS) - More fixes for connection topology, information request and tube filter after upgrading to new pipeline. 24 Sep 2014 (pberkes) - Handle the non-Latin-1 keypresses. 23 Sep 2014 (rkern) - Prevent ndarray comparisions with None. 17 Jul 2014 (mdickinson) - Fix the trait error raised when the threshold range is updated. 24 May 2014 (markkness) - Update installation documentation links. 21 Apr 2014 (PR) - Fix integration tests after upgrade to VTK's new pipeline. Mayavi 4.3.1 ============= Enhancements ------------ 20 Jan 2014 (PR) - New example `mlab.test_mesh_mash_custom_colors` illustrating masking and a custom color map. 12 Jan 2014 (PR) - Enabled Travis-CI for the repo. 17 Dec 2013 (dmsurti) - Upgrade to VTK 5.10.1 with VTK's old pipeline. This upgrade does not yet make use of VTK's new pipeline. 07 Aug 2013 (pratikmallya) - Added interactive superquadrics example. Thanks to Pratik for contributing this example. 03 Jun 2013 (PR) - Refactor the animation component so that corresponding examples display animations. Fixes ------ 27 Jan 2014 (PR) - Many fixes to the test suite so the unit tests and integration tests all pass on OS X, Linux and Windows 32 and 64 bit with VTK 5.6. 08 Jan 2014 (PR) - tvtk_doc: Fix search when user enters a search string. 09 Jan 2014 (mindw) - Fix creation of scripts on win32 using gui_scripts. Thanks to Gabi Davar for this fix. 23 Dec 2013 (jenshnielsen) - Fix imshow by handling TraitError. Thanks to Jens Nielsen for this fix. 05 Apr 2013 (mindw) - Fix class browser when VTK is built with QT/SIP support. Thanks to Gabi Davar for this fix. 05 Apr 2013 (mluessi) - Fix wxpython 2.9 compatibility. Thanks to Martin Luessi for this fix. 19 Aug 2013 (senganal) - Fix MGlyphSource when assigning multi dimensional arrays to individual components of vector data. Thanks to Senganal for this fix. - Fix inconsistent handling of scalars. Thanks to Senganal for this fix. 10 Jun 2013 (PR) - Fix to use front buffer when off screen is False. Mayavi 4.3.0 ============= Enhancements ------------ 30 Oct 2012 (PR) - NEW: Adding a Qt version of the gradient editor. With this, all of Mayavi's UI should be usable on Qt. Fixes ------ 11 Mar 2013 (Aestrivex) - Fixed bug with incorrectly tiled snapshots while using savefig. 30 Oct 2012 (PR) - BUG: Qt: fix crashing full-screen-mode. Fixed segfault when you click on full-screen and press escape/q/e. Mayavi 4.2.1 ============= Enhancements ------------ 9 August 2012 (GV) - ENH: Add null engine to mlab.pipeline.open. Mayavi 3.4.0 (Oct 15, 2010) =========================== Enhancements ------------ 22 July 2010 (GV) - ENH: Add error management for extents in mlab: some module cannot be scaled [25683]. 16 July 2010 (GV) - ENH: Enable LUT defined by tables to have their number of colors adjusted [25663]. Fixes ------ 2 August 2010 (GV) - BUG: Fix a segfault when updating lines on a MLineSource using 'reset' and reducing the number of points [25700]. 1 August 2010 (GV) - BUG: Fix updating scalar scatters using mlab_source.set: a race condition under Qt prevented the scalar range to be updated in time [25699]. 25 July 2010 (GV) - BUG: Fix corner cases in the pipeline browser: objects for which the number of inputs is misreported, and iterable objects to do not contain TVTKBase entries [25685,25686]. 14 July 2010 (GV) - BUG: Fix a bug in the poll_file example. Thanks to Jonathan Guyer for pointing out the solution [25660]. Mayavi 3.3.2 (May 25, 2010) =============================== Enhancements ------------ DOCs: many docs and example improvements (GV). 13 April 2010 (GV) - API: Enforces wx >= 2.8 [25465,25471,25529] 11 April 2010 (GV) - ENH: Add figure management to mlab.roll [25464]. 6 March 2010 (GV) - MISC: Change the default in iso_surface to compute normals, as with recent VTK versions colors look ugly when normals are not computed [25400]. Fixes ------ 17 May 2010 (PR) - BUG: Fixing wrapping for VTK-5.6 and above where one of the string traits default to a value with a special character like "\n" "\r" [25546]. 17 April 2010 (GV) - BUG: Fix integer casting in magnification for mlab.savefig [25483] 5 April 2010 (GV) - BUG: A slight modification to enable inserting graph objects in the Mayavi pipeline: the polydata created by the GraphToPolyData filter had some 'None' arrays in their point_data [25434]. 3 April 2010 (GV) - BUG: Make the 'use_lookup_table' traits of the image_plane_widget work. [25430] Mayavi 3.3.1 (Feb 24, 2010) =========================== Enhancements ------------ 20 Dec, 2009 (GV): - ENH: Merge in Scott Wart's patch to add an 'ImageChangeInformation filter to ArraySource, with additional work to get the tests to pass [25036], [25043] 14 Dec, 2009 (GV) - ENH: Add helper functions to interact with object via callbacks by clicking on them. The core function is the scene.on_mouse_pick, that is demoed in the new example 'on_mouse_pick' [25016], [25019] 13 Dec, 2009 (GV): - ENH: Make array_handler more robust to buffer protocole [25013] - ENH: Add support for assigning numbers to MGlyphSource x, y, z, and u, v, w [25015] 27 Nov 2009 (GV): - ENH: Add an auto mode for mlab.view, for distance and focal point [24971] 26 Nov, 2009 (GV): - ENH: Add a probe_data to retrieve data from Mayavi or VTK objects [24966] 25 Nov, 2009 (GV): - ENH: Usability: change the label of the '*.*' extension in th decorated scene save snapshot dialog [24963] 12 Oct, 2009 (GV): - ENH: Add script recording to the widget position for the DataSetClipper filter [24826] 17 Sep, 2009 (PR): - ENH: Making the widgets recordable [24738] 02 Sept 2009 (GV): - ENH: Add a new glyph source: a cross, that can be used as a cursor, or a axes [24678] 02 Sep, 2009 (GV): - ENH: Add a figure argument to mlab.view and try to lift the figure on screenshot [24676] - DOC: Add a detailed example of using 'UserDefined' contributed b Emmanuelle Gouillart [24677] 20 Aug, 2009 (PR): - ENH: Don't persist mlab_source [24567] 14 Aug, 2009 (GV): - ENH: Stop gap solution to limit the cost of auto-scaling the glyph size with large arrays in barchart, when the positionning is implicite, and thus distance calculation is pointless [24526] - ENH: Do not update the rendering of the scene when using mlab helper functions that build one object after another [24529] - ENH: Add an argument to barchart to avoid expensive scaling computation [24531] - ENH: Make the scalars argument of mlab.pipeline.vector_field work with lists too [24532] 13 Aug, 2009 (GV): - ENH: Force an update of the data when using the set_active_attribute filter, so that the names of all defined arrays are displayed [24464] [24466], [24520], [24521], [24520] 04 Aug, 2009 (GV) - ENH: Add a screenshot function to mlab for easy capture of the pixmap to [24445] - ENH: Add a patch contributed by Chris Colbert for control of the array type in mlab.screenshot (rgb vs rgba) [24453] 03 Aug, 2009 (GV): - MISC: Fix long-standing usability complain: OK button on adder nodes not creating object [24443] 03 Aug, 2009 (PR): - ENH: Adding to/from_array to the Matrix4x4 class for convenience [24437] - ENH: Thanks to a suggestion from Gary Ruben, mlab.plot3d now uses tvtk.Stripper in the pipeline to produce smooth tubes [24438] [24442] [24439] 01 Aug, 2009 (GV): - DOC: Merge in Ondrej's more precise instructions on installing SVN on an already-installed system [24428] 15 Jul, 2009 (GV): - ENH: Open the possibility to have image plane widget working with RGBA data [24169] 10 Jul, 2009 (GV): - ENH: Allows for use of lists as a scalar argument in mlab function [24094] 09 Jul 2009 (PR): - ENH/API: Checking in patch from Erik Tollerud which adds a `move`, `yaw and `pitch` to the mlab camera. Many thanks to Erik for this patch [24083], [24084] 08 Jul, 2009 (GV): - ENH: Capture any errors while building docs and fail gracefully during the build [24067] 08 Jul, 2009 (GV): - ENH: Try to force the use of wx2.8, or else do not display the logger [24064], [24060] 07 Jul, 2009 (GV): - ENH: Add a button and a menu entry to display the VTK documentation browser [25058] 22 Jul, 2009 (Dave Peterson): - Updated all __init__.py files with modulefinder code so that py2app/py2exe can correctly determine what to include when packaging a distribution. This is necessary due to the use of namespace packages [24339] Fixes ----- 21 Feb, 2010 (GV) - BUG: Make the threshold filter better behaved when there are nans in the data [25280] - BUG: Remove callbacks on OrientationAxis that where triggering useless redraws [25279] 15 Feb, 2010 (PR): - BUG: Fix issue when an automatically generated trait name was actually Python keyword. In these cases the trait name is simply appended with a underscore (_). This should hopefully fix problems with building TVTK with VTK from CVS [25236] 12 Feb, 2010 (Scott Warts): - Reset the current scene if it is removed [ 25219] 08 Jan, 2010 (GV): - BUG: Radius and length of a cylinder had upper bounds to 100, where they should really be confined only to positive numbers. Fix with kludge. Thanks to Michele Mattioni for pointing out the bug, and providing the patch [25097] 20 Dec, 2009 (GV): - BUG: Correct bug with visibility of OrientationAxes reported by Uche Mennel [25037] - BUG: Patch by Varun Hiremath to make build docs more robust [25039] - BUG: Fix scalarbar positionning for VTK >= 5. [25040] - BUG: Avoid a segfault when enabling the OrientationAxes without an interactor [25044] - MISC: Disable the use of IPython by default, there are right now too many bugs with it [25041] 14 Dec, 2009 (GV): - BUG: Fix test on pick dispatcher [25020] - BUG: Fix a bug in tvtk.py, in the loading of tvtk classes generated code when the path is not in the sys.path Thank you to Ram Rachum for finding this problem, and the fix [25021] 26 Nov, 2009 (GV): - BUG: Add forgotten file. Thanks to Darren Dale for reporting [24967] - BUG: Fix mlab.pipeline.get_vtk_src for VTK dataset [24968] 25 Nov, 2009 (GV): - BUG: Fix a bug in barchart [24962] 18 Nov, 2009 (Scott Warts): - Don't reset the zoom level if there are volumes or actors. Before we were just checking for actors [24932] 04 Nov, 2009 (GV): - BUG: mlab.clf() was renabling rendering on figures, had it been disabled [24874] 22 Oct, 2009 (Scott Warts): - BUG: Fixed memory leak. Switched to using tvtk.messenger when adding observers to keep from creating uncollectable cycles [24856], [24857] 14 Sep, 2009 (GV): - BUG: Fix trivial bug when size in savefig was not specified, and magnification was set to auto [24733] 19 Aug, 2009 (GV): - BUG: Fix 'feature' of mlab.colorbar which would show up on objects with scalar representation not enabled [24559] 19 Aug, 2009 (PR): - BUG: Fixing some of the issues with colorbar and VTK versions greater than 5.2 [24558] 18 Aug, 2009 (GV): - BUG: The figure magnification was not working correctly. Fix [24569] - BUG: Fix a traceback in mlab.show_pipeline if no scene was open [24553] 17 Aug, 2009 (PR): - BUG: TVTK was not correctly wrapping newer versions of VTK Specifically the vtkArray class was causing a traceback. This patch appears to fix the problem. Thanks to Kyle Mandli for helping with debugging this issue and testing the fix 14 Aug, 2009 (GV): - BUG: Fix a bug when reseting the MlabTriangularMeshSource: when growing the number of points, triangles were created before the corresponding points. Thanks to Ondrej Certik for reporting this one 08 Aug, 2009 (GV): - BUG: Fix a bug for with the notebook in wx example for which objects were not added to the right scene [24492] 07 Aug, 2009 (Scott Warts): - Added two more exceptions to state methods from ImageReslice: SetOutputOriginToDefault and SetOutputExtentToDefault [24480] 06 Aug, 2009 (PR): - BUG: vtkImageReslice's SetOutputSpacingToDefault does not make OutputSpacing a state method. Thanks to Scott Swarts for pointing this out [24476] 01 Aug, 2009 (Robert Kern): - BUG: With a vtkWin32OpenGLRenderWindow, set the parent widget info before resizing in order to avoid an offset bug [24427] 23 Jul, 2009 (Evan Patterson): - BUG: Replacing deprecated calls to wx.Yield() [24379] Mayavi 3.3.0 (July 15, 2009) ============================ Enhancements ------------ 06 Jul, 2009 (PR): - ENH/API: No longer save to a file (with a popup when a user unchecks the record icon). Also added `start_recording` and `stop_recording` functions to mlab to make it easier to do this via scripts [24048] 08 Jul, 2009 (GV): - ENH: Make the MlabSceneModel manage the mlab current scene so that in plots to the embedded scene, but does not upset the current mlab figure [24040], [24065] 05 Jul 2009 (GV): - ENH: Add the possibility to specify figures to mlab.figure by instance rather than name [24039] - ENH: Add an example of using multiple mlab scene models [24041] - ENH: Add a figure keyword argument to mlab.pipeline factories to control which figure objects are added on [2403] 02 July, 2009 (PR): - ENH: The record icon on the engine view is smarter now and will automatically be checked on and off if the engine's recorder trait in set. This paves the way for a convenient mlab one liner to start recording [24025] 01 Jul, 2009 (PR): - NEW: Adding a new filter that clips an input dataset. Also added an `ImplicitWidgets` component that abstracts a box, plane, sphere and implicit plane widget into one reusable component. An initial patch was contributed by Suyog and them modified by PR. Many thanks to Suyog for this patch [24017] 01 Jul, 2009 (GV): - ENH: Add an mlab.close function to close figures controled by mlab [24006] 30 Jun, 2009 (PR): - ENH/API: Checking in improved patch sent by Suyog along with fixes from me. This adds a can_read_test metadata attribute for sources which can be optionally specified, the function should return True if the reader can read a given file. The patch also adds a volume reader and a chaco reader and also supports the .xyz format reader provided in VTK. A test for the new registry functionality is also added. The API has only changed for the manner in which the registry is queried for a reader using the file itself rather than the file extension. Many thanks to Suyog for this work [24002] 29 Jun, 2009 (GV): - ENH: Add an option to show_engine to show the rich view [23981] 14 Jun, 2009 (GV): - BUG: mlab.set_engine was not registering engines, causing testing to be difficult [23819] - ENH: expose text3d in mlab [23820] - ENH/TEST: rewamp the mlab testing infrastructure [23822] 13 Jun, 2009 (GV): - ENH: Adapt mlab.savefig code to make it easier to save figures with size larger than window size [23813] - ENH: Add a text3d module, for displaying text located in the 3D scene scaling and hiding as the other 3D actors [23809], [23810]. - ENH: Add a helper function to mlab to syncronize cameras on two scenes [23814] 10 Jun, 2009 (PR): - API: The name of the scene created on the mayavi2 app now defaults to "Mayavi Scene %d" rather than "TVTK Scene %d". This is to make this consistent with what `mlab.figure()` does and to avoid user confusion [23787] 2 Jun, 2009 (PR): - ENH: Ensuring that the scene editor's name is synced with the scene' name. Also making the scene itself "renamable" [23710] 29 May, 2009 (PR): - ENH: Also pickle the name of the scene -- it shouldn't hurt [23691] 18 May, 2009 (GV): - ENH: cleaner exception capture for sensible error message [23660] 10 May, 2009 (GV): - ENH: Use pickle rather than numpy npz for lookup table [23618] [23619] - API: Add PipelineBase to mayavi.core.api as it is needed for the interactive example [23617] 9 May, 2009 (PR): - ENH/API: Adding to the API of the lut manager with a show_legend boo which is an alias for show_scalar_bar. This makes the UI a littl clearer [23608] - ENH: Adding ID's to the various pop-up editors for the lut manager s their sizing etc. is persisted [23609] - ENH/API: Exposing the scalar_bar_widget's representation in the UI an API and recording it so changes to the scalar bar's position ar recorded and editable on the UI [23610] 20 Apr, 2009 (GV): ENH [23545]: - Add an example gallery to the documentation - Rewamp the documentation-generation code, and its packaging. Th generation code was made more robust, and as a result n generated test files are checked in svn. The images for th mlab documentation and the mlab examples are generated by th render_images.py script - Space has been optimized by removing duplicated artwork an moving outside of the source distribution files no required for distribution 19 Apr, 2009 (GV) - ENH: Use numpy's npz format for storing LUT information. This saves ~1Mo from the source and binary distributions[23544] 11 Apr, 2009 (GV): - ENH/API: add an API module to core, to give a central place for important core import [23520] Fixes ----- 15 Jul, 2009 (PR): - BUG: Fix what I think is a long standing bug. You couldn't use the envisage backend with mlab because of a problem with envisage'. workbench application. I've worked around the problem in mayavi' workbench subclass and added a test to ensure that this is now fixed This basically adds a new trait to the Mayavi app and the mayavi workbench application called `start_gui_event_loop` that is disabled when used from mlab [24171] 6 Jul, 2009 (Dave Martin): - BUG: If the scene being closed has None for scene.scene, call registry.find_scene_engine(scene) instead of "scene.scene" [24052] [24055] 05 Jul, 2009 (GV): - BUG: small fix for successive builds of the tvtk code generation, by Rakesh Pandit [24038] - BUG: Do not create application directories on import of mayavi preferences. [24036] 29 Jun, 2009 (GV): - BUG: Make sure that the vertical vector source used for barchart is well-behaved with regards to mlab_source.update [23983] 28 Jun, 2009 (PR): - BUG: Mlab's barchart uses the scale_by_vector_components which was not exposed by the glyph component leading to update problems reported by Christian Vollmer. This is now fixed along with a simple test case. There are deeper problems with barchart that do need attention though - if a user changes the data inplace and calls the mlab_source.update() nothing updates correctly since the data is really copied over to the vector components. This can be fixed with a callback and will be done later. [23980] 25 Jun, 2009 (PR): - BUG: Was checking for attribute in editor assuming they were all scene editors which is clearly wrong. This bug fixes problems with using mayavi and a text editor say [23933] 2, Jun 2009 (PR): - BUG: With recent versions of VTK when a VTK array is exported to a numpy array, the numpy array is already a view so resetting the VTK array back to the numpy array for some reason triggers a segfault. This is now fixed [23711] - BUG: The Engine's open method did not work with a null engine. Tested and fixed [23713] 30 May, 2009 (PR): - [TVTK] BUG: Working around problem with parser for vtkRenderedGraphRepresentation which has non-standard arguments for some of its SetIvarToState methods [23696] 26 Lay, 2009 (GV): - BUG: Fix scaling bug for surf with warp_scale='auto'. Thanks to Jakob Rohrhirsch for reporting it [23682] 6 May, 2009 (PR): - BUG: The implicit plane widget was not recordable [23595] - BUG: [mlab] mlab.pipeline.contour_grid_plane was broken [23596] 27 Apr, 2009 (GV): - API: add an API module for core.ui [23562] - DOC: Put up to date information on the engine [23560] 23 Apr, 2009 (GV): - DOC: Add an example to show how you can have different engines in an application [23558] 13 April, 2009 (PR): - BUG: The trailing '|' in the wildcard breaks the file dialog's filterin for user defined readers. Thanks to B. P. Thrane for reporting the bug 27 March, 2009 (GV): - BUG: Fixed bug with importing customization contributions. Added a test case for this. Thanks to Mario Ceresa for reporting the bug [23438] 23 March, 2009 (GV): - BUG: Fix TVTK possible build failure, reported by Andrew Straw https://bugs.launchpad.net/bugs/34693 [23371] 20 March, 2009 (PR): - TEST/BUG: Adding a new test for the `tvtk.util.ctf` utility functions. Also fixed a bug that affects VTK-5.2 and above where the range of the CTF must be set [23267] - BUG/CLEAN: Fixing a 5.2 specific bug in the volume module mlab function Also cleaned up the mlab code for this a little [23268] Mayavi 3.2.0 (March 23, 2009) ============================= A log of significant changes made to the package especially API changes. This is only partial and only covers the developments after the 2.x series. 17, 18 March, 2009 (PR): - NEW: A simple example to show how one can use TVTK's visual module with mlab. [23250] - BUG: The size trait was being overridden and was different from the parent causing a bug with resizing the viewer. [23243] 15 March, 2009 (GV): - ENH: Add a volume factory to mlab that knows how to set color, vmin and vmax for the volume module [23221]. 14 March, 2009 (PR): - API/TEST: Added a new testing entry point: 'mayavi -t' now runs tests in separate process, for isolation. Added ``mayavi.api.test`` to allow for simple testing from the interpreter [23195]...[23200], [23213], [23214], [23223]. - BUG: The volume module was directly importing the wx_gradient_editor leading to an import error when no wxPython is available. This has been tested and fixed. Thanks to Christoph Bohme for reporting this issue. [23191] 14 March, 2009 (GV): - BUG: [mlab]: fix positioning for titles [23194], and opacity for titles and text [23193]. - ENH: Add the mlab_source attribute on all objects created by mlab, when possible [23201], [23209]. - ENH: Add a message to help the first-time user, using the new banner feature of the IPython shell view [23208]. 13 March, 2009 (PR): - NEW/API: Adding a powerful TCP/UDP server for scripting mayavi via the network. This is available in ``mayavi.tools.server`` and is fully documented. It uses twisted and currently only works with wxPython. It is completely insecure though since it allows a remote user to do practically *anything* from mayavi. 13 March, 2009 (GV) - API: rename mlab.orientationaxes to mlab.orientation_axes [23184] 11 March, 2009 (GV) - API: Expose 'traverse' in mlab.pipeline [23181] 10 March, 2009 (PR) - BUG: Fixed a subtle bug that affected the ImagePlaneWidget. This happened because the scalar_type of the output data from the VTKDataSource was not being set correctly. Getting the range of any input scalars also seems to silence warnings from VTK. This should hopefully fix issues with the use of the IPW with multiple scalars. I've added two tests for this, one is an integration test since those errors really show up only when the display is used. The other is a traditional unittest. [23166] 08 March, 2009 (GV) - ENH: Raises an error when the user passes to mlab an array with infinite values [23150] 07 March, 2009 (PR) - BUG: A subtle bug with a really gross error in the GridPlane component, I was using the extents when I should really have been looking at the dimensions. The extract grid filter was also not flushing the data changes downstream leading to errors that are also fixed now. These errors would manifest when you use an ExtractGrid to select a VOI or a sample rate and then used a grid plane down stream causing very wierd and incorrect rendering of the grid plane (thanks to conflation of extents and dimensions). This bug was seen at NAL for a while and also reported by Fred with a nice CME. The CME was then converted to a nice unittest by Suyog and then improved. Thanks to them all. [23146] 28 February, 2009 (PR) - BUG: Fixed some issues reported by Ondrej Certik regarding the use Of mlab.options.offscreen, mlab.options.backend = 'test', removed cruft from earlier 'null' backend, fixed bug with incorrect imports, add_dataset set no longer adds one new null engine each time figure=False is passed, added test case for the options.backend test. [23088] 23 February, 2009 (PR) - ENH: Updating show so that it supports a stop keyword argument that pops up a little UI that lets the user stop the mainloop temporarily and continue using Python [23049] 21 February, 2009 (GV) - ENH: Add a richer view for the pipeline to the MayaviScene [23035] - ENH: Add safegards to capture wrong triangle array sizes in mlab.triangular_mesh_source. [23037] 21 February, 2009 (PR) - ENH: Making the transform data filter recordable. [23033] - NEW: A simple animator class to make it relatively to create animations. [23036] [23039] 20 February, 2009 (PR) - ENH: Added readers for various image file formats, poly data readers and unstructured grid readers. These include DICOM, GESigna, DEM, MetaImage (mha,mhd) MINC, AVSucd, GAMBIT, Exodus, STL, Points, Particle, PLY, PDB, SLC, OBJ, Facet and BYU files. Also added several tests for most of this functionality along with small data files. These are additions from PR's project staff, Suyog Jain and Sreekanth Ravindran. [23013] - ENH: We now change the default so the ImagePlaneWidget does not control the LUT. Also made the IPW recordable. [23011] 18 February, 2009 (GV) - ENH: Add a preference manager view for editing preferences outside envisage [22998] 08 February, 2009 (GV) - ENH: Center the glyphs created by barchart on the data points, as mentioned by Rauli Ruohonen [22906] 29 January, 2009 (GV) - ENH: Make it possible to avoid redraws with mlab by using `mlab.gcf().scene.disable_render = True` [22869] 28 January, 2009 (PR and GV) - ENH: Make the mlab.pipeline.user_defined factory function usable to add arbitrary filters on the pipeline. [22867], [22865] 11 January, 2009 (GV) - ENH: Make mlab.imshow use the ImageActor. Enhance the ImageActor to map scalars to colors when needed. [22816] Mayavi 3.1.0 ============ 3 December, 2008 (PR) - BUG: Fixing bugs with persistence of VTKDataSource objects wrapping a structured grid in VTK-5.2. This resulted in hard to debug test errors. [22624] 1 December, 2008 (GV): - API: Promote the TestEngine to a first-class citizen NullEngine and make mlab use it when a source has a keyword argument "figure=False". [22594] 30 November, 2008 (PR) - NEW: New sources called BuiltinSurface and BuiltinImage that let users create simple polygonal data and images using basic VTK sources. Thanks to Suyog Jain for this code. [22586], [22597]. 27 November, 2008 (GV): - ENH: Add control of the seed size and resolution to mlab.pipeline_basene.streamline [22573]. - DOC: Documentation work, especially in the scripting parts of the docs. [22572], [22561], [22560], [22546], [22545] 26 November, 2008 (GV): - ENH: Add keyword arguments to the cutplanes in mlab.pipeline. [22567] Also add masking to glyph-based mlab.pipeline factories [22568] 19 November, 2008 (GV): - UI: Rename 'Modules' to 'Colors and legends' [22512] - API: Change defaults [22513]: - CellToPointData and PointToCellData filters to pass the existing dataset. - The ouline of the implicite plane is no longer draggable by default. 15-16 November, 2008 (PR) - ENH/API: Exposing the glyph source choices via a dictionary rather than having the user remember the index in a list. [22497] - ENH: Adding a button to the LUT UI so the LUT editor can be launched from the UI. [22498] - DOC: Updating advanced scripting chapter. [22495]. 13 November, 2008 (GV) - ENH: [mlab] Add keyword arguments to colobars to control label number and format, as well as colors number. [22489] 10 November, 2008 (PR) - TEST: Adding 43 new mayavi tests. These are based on the integration tests but don't pop up a user interface. Thanks to Suyog Jain for doing bulk of the work. [22465] 27 October, 2008 (GV) - ENH: [mlab] If a module or filter is added to the pipeline using the mlab.pipeline functions, the source on which it is added onto is automatically added to the scene if not alread present. It is also automatically converted from a tvtk dataset to a mayavi source, if needed. [22375], [22377] - ENH: [mlab] Make mlab.axes and mlab.outline use the extents of the current object when none specified explicitely. [22372] 24-27 October, 2008 (PR) - NEW: Adding an ImageChangeInformation filter to let users change the origin, spacing and extents of input image data, [22351]. - API: Adding a `set_viewer` function to `tvtk.tools.visual` so one may specify a viewer to render into. This lets us use visual with a mayavi scene. [22363] - BUG: Fix a major bug with TVTK when VTK is built with 64 bit ids (VTK_USE_64BIT_IDS is on). The examples and tests should all run in this case now. [22365] - ENH: [mlab] Added an `mlab.view` method that actually works [22366]. 19 October, 2008 (GV) - ENH: mlab.text can now take 3D positioning [22331]. 17-20 October, 2008 (PR) - ENH: Modified TVTK and Mayavi UI editors so that text entry boxes are only set when the user hits or rather than on each keystroke. [22321], [22323] - ENH/BUG/WARN: Fixed warnings at TVTK build time, fixed bugs with ImageData's scalar_type trait. [22320], [22321], [22325]. - NEW/API: Adding preference option to ease task of loading contrib packages (via a pkg/user_mayavi.py) in mayavi. Also added a contrib finder that trawls sys.path to find contributions. This can be set from the preferences UI. [22324], [22326], [22327]. - BUG: Fixing problems with the gradient_editor and newer VTK versions. This is required for the Volume module to work correctly. [22329], [22341] 13 October, 2008 (GV): - ENH: Bind the 'explore' function in the python shell [22307] - ENH: mlab: axes and outline now find the extents from the objects they are given, if any. [22305] 12 October, 2008 (GV): - API: mlab: Add a barchart function, with the corresponding pipeline source function. [22286] 11 October, 2008 (PR): - ENH/API: Improving texture map support, you can now generate the texture coords on an arbitrary actor. This adds to the API of the actor component. [22283] - API: Adding a `mayavi.preferences.bindings` module that abstracts out setting of preferences for common objects. Currently it exposes a `set_scene_preferences` so the non-envisage and off screen scenes have the right preferences. See [22280] and [22295]. - REFACTOR/API: The script recording code is now in `apptools.scripting`, the `mayavi.core.recorder` was only a temporary solution. See [22277] and [22279]. 10 October, 2008 (GV): - API: mlab: Expose pipeline.set_extent (former private function tools._set_extent) [22251] 9 October, 2008 (GV): - ENH: Use the IPython shell plugin only if the ipython, envisage and pyface versions are recent-enough. Mayavi now uses an ipython widget instead of the pyshell one if you have the right components installed, but should fall back to pyshell gracefully. [21678], [22245] 4 October, 2008 (PR): - TEST: Added a 'test' backend to mlab so you can run mlab tests without a display. Fixing core code so that all the unittests run when the ETS_TOOLKIT env var is set to 'null'. [22198] 30 September, 2008 (GV): - API: mlab: Expose pipeline.add_dataset (former private function tools._data) [22162]. - API: The mlab source functions can now optionaly work without creating a figure (using figure=None) [22161]. - API: The mlab source functions are more robust to various input-argument shape (they accept lists, and 1D or 2D arrays when possible) [22161]. 29 September, 2008 (GV): - NEW: Add a mlab.triangular_mesh function to create meshes with arbitrary triangular connectivity. Also add a corresponding triangular_mesh_source mlab source. [22155] - ENH: Make mlab.points3d and other mlab functions accept scalars as coordinnates, in addition to arrays. [22156] 12 September, 2008 (PR) - NEW: Create a separate OffScreenEngine for use to reduce code duplication. This is also available as part of mayavi.api. [21880] - TEST: Creating a common.py that contains a TestEngine mayavi engine subclass for easily testing mayavi. [21881] 8-12 September, 2008 (PR) - NEW: Adding full support for script recording. With this you can pretty much record all UI actions performed on the Mayavi UI (both standalone and application) to human-readable and runnable Python scripts. It also serves as a nice learning tool since it shows the lines of code as the UI actions are performed. Note that interacting with the camera is also recorded which is very convenient. This has been implemented in a pretty general fashion (using TDD) so is reusable in other traits based applications also. Major checkins [21722], [21728], [21776], [21812], [21865] [21878]. Mayavi 3.0.3 ============ 7 September, 2008 (PR): - ENH: The mayavi2 application now ([21713], [21714]) supports command line args like the following:: mayavi2 -d ParametricSurface -s "function='dini'" -m Surface \ -s "module_manager.scalar_lut_manager.show_scalar_bar = True" \ -s "scene.isometric_view()" -s "scene.save('snapshot.png')" 6 September, 2008 (PR): - ENH/API: Cleaned up the mayavi.core.traits to remove buggy, and unused DRange and SimpleDRange traits. [21705] - BUG/TEST: Added tests for some of the MlabSource subclasses and fixed many bugs in the code. [21708] - TEST: Modified pipeline_base.py so mayavi objects may be started without creating a scene (and therefore a UI). This allows us to create completely non-interactive tests. [21709] - ENH: Adding X3D and POVRAY export options. [21711] 23 August, 2008 (PR): - ENH: Adding an offscreen option for mlab. Now you can set mlab.options.offscreen = True. [21510] - ENH: Setting the window size to (1,1) if the window is offscreen, this prevents the window from showing up prominently -- it still does show up though. [21519] 21 August, 2008 (PR): - ENH: Adding the logger plugin to the mayavi2 app. [21487] Mayavi 3.0.1 and 3.0.2 ====================== 16 August, 2008 (PR): - BUG: fixed various miscellaneous bugs including a testing error[21304], a long standing Mac bug with picking [21310], a segfault [21453] and a bug in tvtk when wrapping certain methods [21475]. Mayavi 3.0.0 ============ 15 August, 2008 (PR): - NEW: Adding a fully tested data set manager that lets users add/remove/modify attribute arrays to a tvtk dataset. This is fully tested and also does not influence any other code. [21300] 10 August, 2008 (PR): - ENH/API: [mlab] Added a `MlabSource` class to abstract out the data creation and modification into one object that may be modified. This source object is injected in the form of a `mlab_source` trait on objects returned by any of the helper functions (`surf`, `plot3d` etc.) or the sources. The user can use this to modify the data visualized without recreating the pipeline each time, making animations very easy and smooth. There are several examples of the form `test_blah_anim` showing how this is done. [21098], [21103]. 27 July, 2008 (GV): - ENH: Add an option (on by default) to open the docs in a chromeless window when using firefox. [20451] [20450] - ENH: Add toolbar to the engine view [20447] - ENH: Selected item on the tree jumps to newly created objects [20454] - ENH: Add a button on the viewer using by mayavi in standalone to open up the engine view [20456] [20462] - ENH: Clean UI for adding sources/filters/modules (Adder nodes) [20461] [20460] [20458] [20452] - ENH: [mlab] add a resolution argument to glyphs [20465] - API: [mlab] API Breakage! Make mlab source names compatible with ETS standards: grid_source rather than gridsource [20466] - NEW: Add image_plane_widget to mlab.pipeline, with helpful keyword arguments. 23 July, 2008 (GV): - ENH: The mlab API can now take either engine or figure keyword arguments. This allows to avoid the use of the global sate set in the mlab engine. Mlab also now exposes a set_engine function. [20245] 23 July, 2008 (PR) - ENH/NEW: The mlab.pipeline sources, modules and filters now feature automatic source/filter/module generation functions from registry information. This means mlab fully supports creating objects on the mayavi pipeline with easy one-liners. [20239] - API: The API has broken! Sources, filters and modules that mirror an existing mayavi class now are named with underscores. For example, isosurface has become iso_surface, extractedges becomes extract_edges etc. - NEW: Exposing the engine's open method to mlab so it is easy to open data files from mlab also. - ENH: Implemented an mlab.show decorator so one can write out a normal function for visualization which will work from ipython, standalone and mayavi completely seamlessly. 18, 19 July, 2008 (PR) - TEST/API: The mayavi tests are now split into integration and unit tests. Unit tests go into mayavi/tests. Integration tests are in integrationtests/mayavi. Major changes: - Removed most of the image based tests except one (test_streamline.py) for reference. - Modified the testing code so the standalone mode is the default. - Modified so nose picks up the integrationtests. However, there are problems running the test via nosetests on Linux that need investigating. - ENH: Creating a new object on the pipeline via envisage or right click now sets the active selection to the created object so it is easy to edit. - API: Moving mayavi/view/engine_view.py to mayavi/core/ui. [20098] - API: Added method to engine (get_viewer) so it gets the viewer associated with a particular scene. [20101] 12 July, 2008 (PR): - ENH/API: Adding support for global (system wide) and local customizations via a site_mayavi.py and user_mayavi.py (in ~/.mayavi2/). This allows users to register new modules/filters and sources and also add any envisage plugins to the mayavi2 app easily. [19920] 9 July, 2008 (Judah, PR) - ENH: Adding the core code for an AdderNode that shows up on the engine view and lets a user easily create new scenes/sources/filters and modules. 8 July, 2008 (PR) - BUG: Ported various bug fixes from branches for ETS-2.8.0 release. - ENH/API: Added datatype, attribute type and attribute information to all pipeline objects (both at the object and metadata levels). This lets one query if an object will support a given input and what outputs it will provide (this can be changed dynamically too). This allows us to create context sensitive menus. The traits UI menus for the right click is now modified to use this information. We therefore have context sensitive right click menus depending on the nature of the object we right click on. At this point we don't yet check for the attribute_type and attributes metadata information to enable/disable menus, this may be implemented later -- the framework makes this quite easy to do. [19512]. - ENH: Envisage menus are now context sensitive [19520]. 5 July, 2008 (PR): - ENH: One can create objects on the pipeline using right-clicks [19469]. - ENH: All the envisage menus and actions for sources, filters and modules now are autogenerated from the metadata for these. - NEW/API: [19458] adds the following features: - A Registry (mayavi.core.registry.Registry) to register engines, sources, filters and modules. Source, filter and module metadata is registered and this can be used to do various things like generate menus, register data file extension handlers and whatnot. The metadata related classes are in mayavi.core.metadata. - This registry and metadata information is used to generate the envisage menus and actions. - The registry can be used by users to register new sources, readers, filters and modules. - A method to Engine and Script to easily open any supported data file. - Simplify the open file interface so it is just one menu item that supports different file extensions. - Changed the command line options for the mayavi2 application so you can open *any* supported data file format with the -d option. This breaks backwards compatibility but makes it very easy to open supported data files -- even if the new ones are added by users. - Fixed the PLOT3DReader so it opens the q file using the xyz filenames basename. 29 June, 2008 (GV): - ENH: Updated Sphinx docs [19318]. - ENH: New splash screen [19319]. - ENH: mlab now works with envisage, including in "mayavi2 -x" [19321] [19323] 27 June, 2008 (Vibha): - API: Remove SimpleScene class [19285]. - API: Moved tvtk-related examples from TraitsGUI to Mayavi [19191] [19197] [19231] [19280] 27 June, 2008 (GV): - BUG: tvtk: proper handling of non-float numpy arrays. Added test case [19297] 25 June, 2008 (GV): - ENH: Add autoscale to mlab.surf (scalez keyword argument) [19131] - ENH: mlab.usrf and mlab.mesh can now take x and y arguments with a more flexible shape [19114]. 12 June, 2008 (PR): - ENH: Adding an offscreen option to the mayavi2 application. This lets you run a normal mayavi Python script in offscreen mode without the full UI. This is very convenient when you want to render a huge number of images from a visualization and don't want the UI to bother you or create a special script for the purpose. See [18951], [18955]. 07, 08 June, 2008 (PR): - API: TVTK: Added two methods `setup_observers` and `teardown_observers` that let one turn on/off the observer for the ModifiedEvent fired on each VTK object that a TVTK object wraps to keep the traits updated. Thus, if you call `teardown_observers` the traits will not be automatically updated if the wrapped VTK object is changed. This can be manually updated by calling the `update_traits` method. It is OK to call the setup/teardown_observers method as often as needed. This is also tested. See [18885]. - API: TVTK: Removed the `__del__` method on all TVTK objects. This should make it much nicer for proper garbage collection. See [18886], [18887]. 06 June, 2008 (PR): - TEST: Added a standalone mode to the tests so you can test without starting up the envisage app. Envisage imports may be required however. To use this run any test with the -s option. [18880] - TEST: Added a way to run the tests on one application launch instead of starting mayavi each time. To use this execute run.py with the --one-shot command line option. [18880] [18881]. - TEST: The standalone offscreen mode now should work without a single Traits UI showing up with just a dummy blank window being used. This demonstrates how mayavi scripts can work in completely different contexts. [18881]. 31 May, 2008 (PR): - PORT: Backported important additions to the 2.2.0 branch. - BUG: Added a test case for the hide/show functionality and fixed known bugs. - API: Adding elementary support for texturing an actor (if it has texture coords). This was thanks to a patch from Chandrashekhar Kaushik. [18827] 30 May, 2008 (PR): - API: Adding closing, closed lifecycle events to the scene [18806]. 27 May, 2008 (PR): - NEW: Adding a Labels module to label input data. This is like MayaVi1's module and with this checkin all important mayavi1 modules and filters are supported in mayavi2. The only missing one is Locator which hardly anyone uses I think. See [18801]. 27 May, 2008 (PR): - NEW: Adding an ImageDataProbe filter which does the same thing that MayaVi-1.5's StructuredPointsProbe does. [18792] 25 May, 2008 (PR): - NEW: Adding CellDerivatives and Vorticity filters. [18785] 24 May, 2008 (PR): - NEW: Adding a tvtk_doc.py module that doubles as a TVTK Class/Filter/Source/Sink chooser and also as a documentation browser (with search!) like Mayavi1.x's vtk_doc.py. tvtk_doc is also installed as a console script now. [18776] - NEW: Adding a UserDefined filter where the user can wrap around any TVTK filter. [18780] 23 May, 2008 (PR): - NEW: SetActiveAttribute filter that lets you select the active attribute. This makes it very easy to find the contours of one scalar on the iso-contour of another. The example contour_contour.py shows how this is done. See [18774], [18775]. 22 May, 2008 (PR): - NEW: Adding Contour and CutPlane filters that use the Wrapper filter and respective components. This is very convenient. - Checked in modified patch from Chandrashekhar Kaushik (CSE IITB), which reimplements hide/show using a visible trait. 21 May, 2008 (PR): - TEST: Adding an @test decorator to make it easy to create a mayavi test case from a mayavi script. While this is convenient, I still prefer to explicitly use the TestCase class since this makes the code compatible with the 2.2.0 branch. - The GenericModule is now tested. 20 May, 2008 (PR): - NEW: Adding a GenericModule to easily put together a bunch of Filters and Components. Using this code it takes 30 simple lines of code for a ScalarCutPlane compared to the 300 complex ones we need for the current implementation! This is because the module takes care of all the dirty work. - NEW: Adding Wrapper, Optional and Collection filters that make it easy to wrap around existing Components and Filters, make them optional and create collections of them very easily. This gives us a great deal of reuse and makes it very easy to create new filters. 18 May, 2008 (PR): - ENH: Improved the PLOT3D reader and added a test for it. - Added a menu item to allow a user to run a Python script from the UI. - API: Added a close method to `pyface.tvtk.tvtk_scene.TVTKScene`. This class is inherited by all Scenes (DecoratedScene and Scene). The close method shuts down the scene properly. This should hopefully prevent async errors when closing editors/windows containing scenes. See [18708]. - Updated the scene plugin, scene_editor (TraitsBackend*), actor_editor and the ivtk code to use the close method. - TEST: All the tests run on the trunk and pass when the offscreen option is used (which was also added). 17 May, 2008 (PR): - NEW: Adding an SelectOutput filter that should address bug number 478359 in the Debian BTS. See [18700]. - API: mayavi.plugins.app.Mayavi now defines a setup_logger method so this can be overridden by subclasses, see [18703]. 13 May, 2008 (PR): - NEW: Adding an ExtractVectorComponents filter contributed by Varun Hiremath. 11,12 May 2008 (PR): - ENH/API: The plugins now start the engine themselves and also do the binding to the shell. Earlier this was done by the application. This makes the plugins reusable. Also added a running trait to the engine to check on its status. [18672], [18678]. - At this point all examples in trunk work save the mayavi_custom_ui plugin stuff. 10 May 2008 (PR): - API: Moving mayavi/engine.py -> mayavi/core/engine.py where it really belongs; see [18667]. 7,8 May 2008 (PR): - API: The plugins_e3 package is now moved into plugins. This breaks the tvtk.plugins API and also the mayavi.mayavi_*_definition modules. The older envisage2 plugin code is all removed. See: [18649], [18650], [18651], [18652], [18655], [18657], [18662]. 6 May 2008 (PR): - API: The mayavi.core.Base.confirm_delete class attribute is gone since it is no longer needed [18635]. - API: Removed config directory, integrated all mlab preferences into the the mayavi preferences framework, see [18632]. To get the preferences just do:: from mayavi.preferences.api import preference_manager This is the preference manager that manages all prefs. To see the code look in mayavi.preferences.preference_manager. It is also a good idea to read the apptools.preferences documentation. - BUG: [18627] Fixed bug number 478844 on the Debian BTS here: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=478844 4 May 2008 (PR): - API: Added to api. Added a new preferences framework for mayavi2. This uses apptools.preferences and works well both standalone and with envisage3. It makes it easy to create/define/change preferences at the application and library level. 2 May, 2008 (PR): - API: Ported the mayavi2 application and plugin to work with Envisage3. See changesets [18595] and [18598]. *This obviously breaks the plugin API completely!* - Got the mlab envisage_engine_manager working with new changes [18599]. Before this changeset, the code was that of the 2.x series. mayavi-4.5.0/docs/source/mayavi/auto/chemistry.py0000644000076500000240000000541712747716313022503 0ustar prabhustaff00000000000000""" In this example, we display the H2O molecule, and use volume rendering to display the electron localization function. The atoms and the bounds are displayed using mlab.points3d and mlab.plot3d, with scalar information to control the color. The electron localization function is displayed using volume rendering. Good use of the `vmin` and `vmax` argument to `mlab.pipeline.volume` is critical to achieve a good visualization: the `vmin` threshold should placed high-enough for features to stand out. The original is an electron localization function from Axel Kohlmeyer. """ # Author: Gael Varoquaux # Copyright (c) 2008-2015, Enthought, Inc. # License: BSD Style. # Retrieve the electron localization data for H2O ############################# import os if not os.path.exists('h2o-elf.cube'): # Download the data try: from urllib import urlopen except ImportError: from urllib.request import urlopen print('Downloading data, please wait') opener = urlopen( 'http://code.enthought.com/projects/mayavi/data/h2o-elf.cube' ) open('h2o-elf.cube', 'wb').write(opener.read()) # Plot the atoms and the bonds ################################################ import numpy as np from mayavi import mlab mlab.figure(1, bgcolor=(0, 0, 0), size=(350, 350)) mlab.clf() # The position of the atoms atoms_x = np.array([2.9, 2.9, 3.8]) * 40 / 5.5 atoms_y = np.array([3.0, 3.0, 3.0]) * 40 / 5.5 atoms_z = np.array([3.8, 2.9, 2.7]) * 40 / 5.5 O = mlab.points3d(atoms_x[1:-1], atoms_y[1:-1], atoms_z[1:-1], scale_factor=3, resolution=20, color=(1, 0, 0), scale_mode='none') H1 = mlab.points3d(atoms_x[:1], atoms_y[:1], atoms_z[:1], scale_factor=2, resolution=20, color=(1, 1, 1), scale_mode='none') H2 = mlab.points3d(atoms_x[-1:], atoms_y[-1:], atoms_z[-1:], scale_factor=2, resolution=20, color=(1, 1, 1), scale_mode='none') # The bounds between the atoms, we use the scalar information to give # color mlab.plot3d(atoms_x, atoms_y, atoms_z, [1, 2, 1], tube_radius=0.4, colormap='Reds') # Display the electron localization function ################################## # Load the data, we need to remove the first 8 lines and the '\n' str = ' '.join(file('h2o-elf.cube').readlines()[9:]) data = np.fromstring(str, sep=' ') data.shape = (40, 40, 40) source = mlab.pipeline.scalar_field(data) min = data.min() max = data.max() vol = mlab.pipeline.volume(source, vmin=min + 0.65 * (max - min), vmax=min + 0.9 * (max - min)) mlab.view(132, 54, 45, [21, 20, 21.5]) mlab.show() mayavi-4.5.0/docs/source/mayavi/auto/coil_design_application.py0000644000076500000240000002514312747716313025334 0ustar prabhustaff00000000000000""" An full-blown application demoing a domain-specific usecase with Mayavi: interactive design of coils. This is example of electromagnetic coils design, an application is built to enable a user to interactively position current loops while visualizing the resulting magnetic field. For this purpose, it is best to use object-oriented programming. Each current loop is written as an object (the `Loop` class), with position, radius and direction attributes, and that knows how to calculate the magnetic field it generates: its `Bnorm` is a property, that is recomputed when the loop characteristic changes. These loop objects are available to the main application class as a list. The total magnetic field created is the sum of each individual magnetic field. It can be visualized via a Mayavi scene embedded in the application class. As we use Traited objects for the current loops, a dialog enabling modification of their attributes can be generated by Traits and embedded in our application. The full power of Mayavi is available to the application. Via the pipeline tree view, the user can modify the visualization. Familiar interaction and movements are possible in the figure. So is saving the visualization, or loading data. In addition, as the visualization model, described by the pipeline, is separated from the data that is visualized, contained in the data source, any visualization module added by the user will update when coils are added or changed. Simpler examples of magnetic field visualization can be found on :ref:`example_magnetic_field_lines` and :ref:`example_magnetic_field`. The material required to understand this example is covered in section :ref:`builing_applications`. """ # Author: Gael Varoquaux # Copyright (c) 2009, Enthought, Inc. # License: BSD Style. # Major scientific library imports import numpy as np from scipy import linalg, special # Enthought library imports: from traits.api import HasTraits, Array, CFloat, List, \ Instance, on_trait_change, Property from traitsui.api import Item, View, ListEditor, \ HSplit, VSplit from mayavi.core.ui.api import EngineView, MlabSceneModel, \ SceneEditor ############################################################################## # Module-level variables # The grid of points on which we want to evaluate the field X, Y, Z = np.mgrid[-0.15:0.15:20j, -0.15:0.15:20j, -0.15:0.15:20j] # Avoid rounding issues : f = 1e4 # this gives the precision we are interested by : X = np.round(X * f) / f Y = np.round(Y * f) / f Z = np.round(Z * f) / f ############################################################################## # A current loop class class Loop(HasTraits): """ A current loop class. """ #------------------------------------------------------------------------- # Public traits #------------------------------------------------------------------------- direction = Array(float, value=(0, 0, 1), cols=3, shape=(3,), desc='directing vector of the loop', enter_set=True, auto_set=False) radius = CFloat(0.1, desc='radius of the loop', enter_set=True, auto_set=False) position = Array(float, value=(0, 0, 0), cols=3, shape=(3,), desc='position of the center of the loop', enter_set=True, auto_set=False) _plot = None Bnorm = Property(depends_on='direction,position,radius') view = View('position', 'direction', 'radius', '_') #------------------------------------------------------------------------- # Loop interface #------------------------------------------------------------------------- def base_vectors(self): """ Returns 3 orthognal base vectors, the first one colinear to the axis of the loop. """ # normalize n n = self.direction / (self.direction**2).sum(axis=-1) # choose two vectors perpendicular to n # choice is arbitrary since the coil is symetric about n if np.abs(n[0])==1 : l = np.r_[n[2], 0, -n[0]] else: l = np.r_[0, n[2], -n[1]] l /= (l**2).sum(axis=-1) m = np.cross(n, l) return n, l, m @on_trait_change('Bnorm') def redraw(self): if hasattr(self, 'app') and self.app.scene._renderer is not None: self.display() self.app.visualize_field() def display(self): """ Display the coil in the 3D view. """ n, l, m = self.base_vectors() theta = np.linspace(0, 2*np.pi, 30)[..., np.newaxis] coil = self.radius*(np.sin(theta)*l + np.cos(theta)*m) coil += self.position coil_x, coil_y, coil_z = coil.T if self._plot is None: self._plot = self.app.scene.mlab.plot3d(coil_x, coil_y, coil_z, tube_radius=0.007, color=(0, 0, 1), name='Coil') else: self._plot.mlab_source.set(x=coil_x, y=coil_y, z=coil_z) def _get_Bnorm(self): """ returns the magnetic field for the current loop calculated from eqns (1) and (2) in Phys Rev A Vol. 35, N 4, pp. 1535-1546; 1987. """ ### Translate the coordinates in the coil's frame n, l, m = self.base_vectors() R = self.radius r0 = self.position r = np.c_[np.ravel(X), np.ravel(Y), np.ravel(Z)] # transformation matrix coil frame to lab frame trans = np.vstack((l, m, n)) r -= r0 #point location from center of coil r = np.dot(r, linalg.inv(trans) ) #transform vector to coil frame #### calculate field # express the coordinates in polar form x = r[:, 0] y = r[:, 1] z = r[:, 2] rho = np.sqrt(x**2 + y**2) theta = np.arctan2(x, y) E = special.ellipe((4 * R * rho)/( (R + rho)**2 + z**2)) K = special.ellipk((4 * R * rho)/( (R + rho)**2 + z**2)) Bz = 1/np.sqrt((R + rho)**2 + z**2) * ( K + E * (R**2 - rho**2 - z**2)/((R - rho)**2 + z**2) ) Brho = z/(rho*np.sqrt((R + rho)**2 + z**2)) * ( -K + E * (R**2 + rho**2 + z**2)/((R - rho)**2 + z**2) ) # On the axis of the coil we get a divided by zero here. This returns a # NaN, where the field is actually zero : Brho[np.isnan(Brho)] = 0 B = np.c_[np.cos(theta)*Brho, np.sin(theta)*Brho, Bz ] # Rotate the field back in the lab's frame B = np.dot(B, trans) Bx, By, Bz = B.T Bx = np.reshape(Bx, X.shape) By = np.reshape(By, X.shape) Bz = np.reshape(Bz, X.shape) Bnorm = np.sqrt(Bx**2 + By**2 + Bz**2) # We need to threshold ourselves, rather than with VTK, to be able # to use an ImageData Bmax = 10 * np.median(Bnorm) Bx[Bnorm > Bmax] = np.NAN By[Bnorm > Bmax] = np.NAN Bz[Bnorm > Bmax] = np.NAN Bnorm[Bnorm > Bmax] = np.NAN self.Bx = Bx self.By = By self.Bz = Bz return Bnorm ############################################################################## # The application object class Application(HasTraits): scene = Instance(MlabSceneModel, (), editor=SceneEditor()) # The mayavi engine view. engine_view = Instance(EngineView) coils = List(Instance(Loop, (), allow_none=False), editor=ListEditor(style='custom'), value=[ Loop(position=(0, 0, -0.05), ), Loop(position=(0, 0, 0.05), ), ]) Bx = Array(value=np.zeros_like(X)) By = Array(value=np.zeros_like(X)) Bz = Array(value=np.zeros_like(X)) Bnorm = Array(value=np.zeros_like(X)) vector_field = None def __init__(self, **traits): HasTraits.__init__(self, **traits) self.engine_view = EngineView(engine=self.scene.engine) @on_trait_change('scene.activated,coils') def init_view(self): if self.scene._renderer is not None: self.scene.scene_editor.background = (0, 0, 0) for coil in self.coils: coil.app = self coil.display() self.visualize_field() def visualize_field(self): self.Bx = np.zeros_like(X) self.By = np.zeros_like(X) self.Bz = np.zeros_like(X) self.Bnorm = np.zeros_like(X) self.scene.scene.disable_render = True for coil in self.coils: self.Bx += coil.Bx self.By += coil.By self.Bz += coil.Bz self.Bnorm = np.sqrt(self.Bx**2 + self.By**2 + self.Bz**2) if self.vector_field is None: self.vector_field = self.scene.mlab.pipeline.vector_field( X, Y, Z, self.Bx, self.By, self.Bz, scalars=self.Bnorm, name='B field') vectors = self.scene.mlab.pipeline.vectors(self.vector_field, mode='arrow', resolution=10, mask_points=6, colormap='YlOrRd', scale_factor=2*np.abs(X[0,0,0] -X[1,1,1]) ) vectors.module_manager.vector_lut_manager.reverse_lut = True vectors.glyph.mask_points.random_mode = False self.scene.mlab.axes() self.scp = self.scene.mlab.pipeline.scalar_cut_plane( self.vector_field, colormap='hot') else: # Modify in place the data source. The visualization will # update automaticaly self.vector_field.mlab_source.set(u=self.Bx, v=self.By, w=self.Bz, scalars=self.Bnorm) self.scene.scene.disable_render = False view = View(HSplit( VSplit(Item(name='engine_view', style='custom', resizable=True), Item('coils', springy=True), show_labels=False), 'scene', show_labels=False), resizable=True, title='Coils...', height=0.8, width=0.8, ) ############################################################################## if __name__ == '__main__': app = Application() app.configure_traits() mayavi-4.5.0/docs/source/mayavi/auto/compute_in_thread.py0000644000076500000240000000615412747716313024164 0ustar prabhustaff00000000000000#!/usr/bin/env python """ This script demonstrates how one can do a computation in another thread and update the mayavi pipeline. It also shows how to create a numpy array data and visualize it as image data using a few modules. """ # Author: Prabhu Ramachandran # Copyright (c) 2007-2015, Enthought, Inc. # License: BSD Style. from __future__ import print_function # Standard library imports import numpy from threading import Thread from time import sleep # Enthought library imports from mayavi.scripts import mayavi2 from traits.api import HasTraits, Button, Instance from traitsui.api import View, Item from mayavi.sources.array_source import ArraySource from mayavi.modules.outline import Outline from mayavi.modules.image_plane_widget import ImagePlaneWidget from pyface.api import GUI def make_data(dims=(128, 128, 128)): """Creates some simple array data of the given dimensions to test with.""" np = dims[0]*dims[1]*dims[2] # Create some scalars to render. x, y, z = numpy.ogrid[-5:5:dims[0]*1j,-5:5:dims[1]*1j,-5:5:dims[2]*1j] x = x.astype('f') y = y.astype('f') z = z.astype('f') scalars = (numpy.sin(x*y*z)/(x*y*z)) # The copy makes the data contiguous and the transpose makes it # suitable for display via tvtk. Please note that we assume here # that the ArraySource is configured to not transpose the data. s = numpy.transpose(scalars).copy() # Reshaping the array is needed since the transpose messes up the # dimensions of the data. The scalars themselves are ravel'd and # used internally by VTK so the dimension does not matter for the # scalars. s.shape = s.shape[::-1] return s class ThreadedAction(Thread): def __init__(self, data, **kwargs): Thread.__init__(self, **kwargs) self.data = data def run(self): print("Performing expensive calculation in %s..."%self.getName(), end=' ') sleep(3) sd = self.data.scalar_data sd += numpy.sin(numpy.random.rand(*sd.shape)*2.0*numpy.pi) GUI.invoke_later(self.data.update) print('done.') class Controller(HasTraits): run_calculation = Button('Run calculation') data = Instance(ArraySource) view = View(Item(name='run_calculation')) def _run_calculation_changed(self, value): action = ThreadedAction(self.data) action.start() @mayavi2.standalone def view_numpy(): """Example showing how to view a 3D numpy array in mayavi2. """ # 'mayavi' is always defined on the interpreter. mayavi.new_scene() # Make the data and add it to the pipeline. data = make_data() src = ArraySource(transpose_input_array=False) src.scalar_data = data mayavi.add_source(src) # Visualize the data. o = Outline() mayavi.add_module(o) ipw = ImagePlaneWidget() mayavi.add_module(ipw) ipw.module_manager.scalar_lut_manager.show_scalar_bar = True ipw_y = ImagePlaneWidget() mayavi.add_module(ipw_y) ipw_y.ipw.plane_orientation = 'y_axes' computation = Controller(data=src) computation.edit_traits() if __name__ == '__main__': view_numpy() mayavi-4.5.0/docs/source/mayavi/auto/contour.py0000644000076500000240000000450712747716313022164 0ustar prabhustaff00000000000000#!/usr/bin/env python """ This script demonstrates how one can script Mayavi and use its contour related modules. """ # Author: Prabhu Ramachandran # Copyright (c) 2005-2008, Enthought, Inc. # License: BSD Style. # Standard library imports from os.path import join, abspath, dirname # Enthought library imports from mayavi.scripts import mayavi2 from mayavi.sources.vtk_file_reader import VTKFileReader from mayavi.modules.outline import Outline from mayavi.modules.grid_plane import GridPlane from mayavi.modules.contour_grid_plane import ContourGridPlane from mayavi.modules.iso_surface import IsoSurface from mayavi.modules.scalar_cut_plane import ScalarCutPlane @mayavi2.standalone def contour(): """The script itself. We needn't have defined a function but having a function makes this more reusable. """ # 'mayavi' is always defined on the interpreter. # Create a new scene. mayavi.new_scene() # Read a VTK (old style) data file. r = VTKFileReader() filename = join(mayavi2.get_data_dir(dirname(abspath(__file__))), 'heart.vtk') r.initialize(filename) mayavi.add_source(r) # Create an outline for the data. o = Outline() mayavi.add_module(o) # Create three simple grid plane modules. # First normal to 'x' axis. gp = GridPlane() mayavi.add_module(gp) # Second normal to 'y' axis. gp = GridPlane() mayavi.add_module(gp) gp.grid_plane.axis = 'y' # Third normal to 'z' axis. gp = GridPlane() mayavi.add_module(gp) gp.grid_plane.axis = 'z' # Create one ContourGridPlane normal to the 'x' axis. cgp = ContourGridPlane() mayavi.add_module(cgp) # Set the position to the middle of the data. cgp.grid_plane.position = 15 # Another with filled contours normal to 'y' axis. cgp = ContourGridPlane() mayavi.add_module(cgp) # Set the axis and position to the middle of the data. cgp.grid_plane.axis = 'y' cgp.grid_plane.position = 15 cgp.contour.filled_contours = True # An isosurface module. iso = IsoSurface(compute_normals=True) mayavi.add_module(iso) iso.contour.contours = [220.0] # An interactive scalar cut plane. cp = ScalarCutPlane() mayavi.add_module(cp) cp.implicit_plane.normal = 0,0,1 if __name__ == '__main__': contour() mayavi-4.5.0/docs/source/mayavi/auto/contour_contour.py0000644000076500000240000000344112747716313023731 0ustar prabhustaff00000000000000#!/usr/bin/env python """This example shows how you can produce contours on an IsoSurface. """ # Author: Prabhu Ramachandran # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. # Standard library imports from os.path import join, abspath, dirname # Mayavi imports. from mayavi.scripts import mayavi2 from mayavi.sources.api import VTKXMLFileReader from mayavi.filters.contour import Contour from mayavi.filters.api import PolyDataNormals from mayavi.filters.set_active_attribute import SetActiveAttribute from mayavi.modules.api import Surface, Outline @mayavi2.standalone def main(): mayavi.new_scene() # Read the example data: fire_ug.vtu. r = VTKXMLFileReader() filename = join(mayavi2.get_data_dir(dirname(abspath(__file__))), 'fire_ug.vtu') r.initialize(filename) mayavi.add_source(r) # Set the active point scalars to 'u'. r.point_scalars_name = 'u' # Simple outline for the data. o = Outline() mayavi.add_module(o) # Branch the pipeline with a contour -- the outline above is # directly attached to the source whereas the contour below is a # filter and will branch the flow of data. An isosurface in the # 'u' data attribute is generated and normals generated for it. c = Contour() mayavi.add_filter(c) n = PolyDataNormals() mayavi.add_filter(n) # Now we want to show the temperature 't' on the surface of the 'u' # iso-contour. This is easily done by using the SetActiveAttribute # filter below. aa = SetActiveAttribute() mayavi.add_filter(aa) aa.point_scalars_name = 't' # Now view the iso-contours of 't' with a Surface filter. s = Surface(enable_contours=True) mayavi.add_module(s) if __name__ == "__main__": main() mayavi-4.5.0/docs/source/mayavi/auto/custom_colormap.py0000644000076500000240000000327212747716313023677 0ustar prabhustaff00000000000000""" An example showing how a custom colormap (or look up table) can be used for a given object. Although the end user specifies colormaps by giving the name of a set of predefined colormaps, Mayavi (and VTK) deal with color internally using 'Look Up Tables' (LUT): a table that associate a scalar value to a color defined by its RGBA components. In this example, we show how the LUT of an object can be retrieved and modified. Specificaly, we start by giving a surf object the 'cool' colormap, but we modify add to add a transparency effect. Notice in the resulting image how the surface becomes more transparent for its lower points. Note that if you want to use a different number of colors, you can change the 'number_of_colors' attribute of the lut object and assign a new array of the right shape to its 'table' attribute. """ # Create some data import numpy as np x, y = np.mgrid[-10:10:200j, -10:10:200j] z = 100 * np.sin(x * y) / (x * y) # Visualize it with mlab.surf from mayavi import mlab mlab.figure(bgcolor=(1, 1, 1)) surf = mlab.surf(z, colormap='cool') # Retrieve the LUT of the surf object. lut = surf.module_manager.scalar_lut_manager.lut.table.to_array() # The lut is a 255x4 array, with the columns representing RGBA # (red, green, blue, alpha) coded with integers going from 0 to 255. # We modify the alpha channel to add a transparency gradient lut[:, -1] = np.linspace(0, 255, 256) # and finally we put this LUT back in the surface object. We could have # added any 255*4 array rather than modifying an existing LUT. surf.module_manager.scalar_lut_manager.lut.table = lut # We need to force update of the figure now that we have changed the LUT. mlab.draw() mlab.view(40, 85) mlab.show() mayavi-4.5.0/docs/source/mayavi/auto/datasets.py0000644000076500000240000001227712747716313022306 0ustar prabhustaff00000000000000""" A Mayavi example to show the different data sets. See :ref:`data-structures-used-by-mayavi` for a discussion. The following images are created: .. hlist:: * **ImageData** .. image:: ../image_data.jpg :scale: 50 * **RectilinearGrid** .. image:: ../rectilinear_grid.jpg :scale: 50 * **StructuredGrid** .. image:: ../structured_grid.jpg :scale: 50 * **UnstructuredGrid** .. image:: ../unstructured_grid.jpg :scale: 50 """ # Author: Gael Varoquaux # Copyright (c) 2008, Enthought, Inc. # License: BSD style. from numpy import array, random, linspace, pi, ravel, cos, sin, empty from tvtk.api import tvtk from mayavi.sources.vtk_data_source import VTKDataSource from mayavi import mlab def image_data(): data = random.random((3, 3, 3)) i = tvtk.ImageData(spacing=(1, 1, 1), origin=(0, 0, 0)) i.point_data.scalars = data.ravel() i.point_data.scalars.name = 'scalars' i.dimensions = data.shape return i def rectilinear_grid(): data = random.random((3, 3, 3)) r = tvtk.RectilinearGrid() r.point_data.scalars = data.ravel() r.point_data.scalars.name = 'scalars' r.dimensions = data.shape r.x_coordinates = array((0, 0.7, 1.4)) r.y_coordinates = array((0, 1, 3)) r.z_coordinates = array((0, .5, 2)) return r def generate_annulus(r, theta, z): """ Generate points for structured grid for a cylindrical annular volume. This method is useful for generating a unstructured cylindrical mesh for VTK (and perhaps other tools). """ # Find the x values and y values for each plane. x_plane = (cos(theta)*r[:,None]).ravel() y_plane = (sin(theta)*r[:,None]).ravel() # Allocate an array for all the points. We'll have len(x_plane) # points on each plane, and we have a plane for each z value, so # we need len(x_plane)*len(z) points. points = empty([len(x_plane)*len(z),3]) # Loop through the points for each plane and fill them with the # correct x,y,z values. start = 0 for z_plane in z: end = start+len(x_plane) # slice out a plane of the output points and fill it # with the x,y, and z values for this plane. The x,y # values are the same for every plane. The z value # is set to the current z plane_points = points[start:end] plane_points[:,0] = x_plane plane_points[:,1] = y_plane plane_points[:,2] = z_plane start = end return points def structured_grid(): # Make the data. dims = (3, 4, 3) r = linspace(5, 15, dims[0]) theta = linspace(0, 0.5*pi, dims[1]) z = linspace(0, 10, dims[2]) pts = generate_annulus(r, theta, z) sgrid = tvtk.StructuredGrid(dimensions=(dims[1], dims[0], dims[2])) sgrid.points = pts s = random.random((dims[0]*dims[1]*dims[2])) sgrid.point_data.scalars = ravel(s.copy()) sgrid.point_data.scalars.name = 'scalars' return sgrid def unstructured_grid(): points = array([[0,1.2,0.6], [1,0,0], [0,1,0], [1,1,1], # tetra [1,0,-0.5], [2,0,0], [2,1.5,0], [0,1,0], [1,0,0], [1.5,-0.2,1], [1.6,1,1.5], [1,1,1], # Hex ], 'f') # The cells cells = array([4, 0, 1, 2, 3, # tetra 8, 4, 5, 6, 7, 8, 9, 10, 11 # hex ]) # The offsets for the cells, i.e. the indices where the cells # start. offset = array([0, 5]) tetra_type = tvtk.Tetra().cell_type # VTK_TETRA == 10 hex_type = tvtk.Hexahedron().cell_type # VTK_HEXAHEDRON == 12 cell_types = array([tetra_type, hex_type]) # Create the array of cells unambiguously. cell_array = tvtk.CellArray() cell_array.set_cells(2, cells) # Now create the UG. ug = tvtk.UnstructuredGrid(points=points) # Now just set the cell types and reuse the ug locations and cells. ug.set_cells(cell_types, offset, cell_array) scalars = random.random(points.shape[0]) ug.point_data.scalars = scalars ug.point_data.scalars.name = 'scalars' return ug def polydata(): # The numpy array data. points = array([[0,-0.5,0], [1.5,0,0], [0,1,0], [0,0,0.5], [-1,-1.5,0.1], [0,-1, 0.5], [-1, -0.5, 0], [1,0.8,0]], 'f') triangles = array([[0,1,3], [1,2,3], [1,0,5], [2,3,4], [3,0,4], [0,5,4], [2, 4, 6], [2, 1, 7]]) scalars = random.random(points.shape) # The TVTK dataset. mesh = tvtk.PolyData(points=points, polys=triangles) mesh.point_data.scalars = scalars mesh.point_data.scalars.name = 'scalars' return mesh def view(dataset): """ Open up a mayavi scene and display the dataset in it. """ fig = mlab.figure(bgcolor=(1, 1, 1), fgcolor=(0, 0, 0), figure=dataset.class_name[3:]) surf = mlab.pipeline.surface(dataset, opacity=0.1) mlab.pipeline.surface(mlab.pipeline.extract_edges(surf), color=(0, 0, 0), ) @mlab.show def main(): view(image_data()) view(rectilinear_grid()) view(structured_grid()) view(unstructured_grid()) view(polydata()) if __name__ == '__main__': main() mayavi-4.5.0/docs/source/mayavi/auto/delaunay_graph.py0000644000076500000240000002020712747716313023451 0ustar prabhustaff00000000000000""" An example illustrating graph manipulation and display with Mayavi and NetworkX. This example shows how to use Mayavi in a purely algorithmic way, to compute a Delaunay from data points, extract it and pass it to networkx. It also shows how to plot a graph using quiver. Starting from points positioned regularly on a sphere, we first use VTK to create the Delaunay graph, and also to plot it. We then create a matching NetworkX graph, calling it's minimum spanning tree function. We display it using Mayavi. The visualization clearly shows that the minimum spanning tree of the points, considering all possible connections, is included in the Delaunay graph. _____ The function `compute_delaunay_edges` uses VTK to retrieve the Delaunay graph of a set of points. First a structure of unconnected points is created using `mlab.points3d`. The Delaunay filter applied to it builds an unstructured grid (see :ref:`data-structures-used-by-mayavi`). We apply an ExtractEdges filter to it, which returns a structure of points connected by edges: the :ref:`PolyData structure `. The dataset structure can be retrieved as the first item of the `outputs` list of the ExtractEdges filter object, returned by the `mlab.pipeline.extract_edges` factory function. Once we have this object, we extract the points and edge list from it. This graph-plotting technique differs from the technique used in the examples :ref:`example_protein` and :ref:`example_flight_graph` where points are created and connected by lines. Unlike these techniques, it enables storing scalar data on each line. _____ To visualize the graph (function `graph_plot`), we build a list of vectors giving the edges, and use `mlab.quiver3d` to display them. To display an unoriented graph, it is best to use the `2ddash` mode of `quiver3d`. """ # Author: Gary Ruben # Gael Varoquaux # Copyright (c) 2009, Enthought, Inc. # License: BSD style. from mayavi import mlab import numpy as np import networkx as nx def compute_delaunay_edges(x, y, z, visualize=False): """ Given 3-D points, returns the edges of their Delaunay triangulation. Parameters ----------- x: ndarray x coordinates of the points y: ndarray y coordinates of the points z: ndarray z coordinates of the points Returns --------- new_x: ndarray new x coordinates of the points (same coords but different assignment of points) new_y: ndarray new y coordinates of the points (same coords but different assignment of points) new_z: ndarray new z coordinates of the points (same coords but different assignment of points) edges: 2D ndarray. The indices of the edges of the Delaunay triangulation as a (N, 2) array [[pair1_index1, pair1_index2], [pair2_index1, pair2_index2], ... ] """ if visualize: vtk_source = mlab.points3d(x, y, z, opacity=0.3, mode='2dvertex') vtk_source.actor.property.point_size = 3 else: vtk_source = mlab.pipeline.scalar_scatter(x, y, z, figure=False) delaunay = mlab.pipeline.delaunay3d(vtk_source) delaunay.filter.offset = 999 # seems more reliable than the default edges = mlab.pipeline.extract_edges(delaunay) if visualize: mlab.pipeline.surface(edges, opacity=0.3, line_width=3) # We extract the output array. the 'points' attribute itself # is a TVTK array, that we convert to a numpy array using # its 'to_array' method. new_x, new_y, new_z = edges.outputs[0].points.to_array().T lines = edges.outputs[0].lines.to_array() return new_x, new_y, new_z, np.array([lines[1::3], lines[2::3]]).T def graph_plot(x, y, z, start_idx, end_idx, edge_scalars=None, **kwargs): """ Show the graph edges using Mayavi Parameters ----------- x: ndarray x coordinates of the points y: ndarray y coordinates of the points z: ndarray z coordinates of the points edge_scalars: ndarray, optional optional data to give the color of the edges. kwargs: extra keyword arguments are passed to quiver3d. """ vec = mlab.quiver3d(x[start_idx], y[start_idx], z[start_idx], x[end_idx] - x[start_idx], y[end_idx] - y[start_idx], z[end_idx] - z[start_idx], scalars=edge_scalars, mode='2ddash', scale_factor=1, **kwargs) if edge_scalars is not None: vec.glyph.color_mode = 'color_by_scalar' return vec def build_geometric_graph(x, y, z, edges): """ Build a NetworkX graph with xyz node coordinates and the node indices of the end nodes. Parameters ----------- x: ndarray x coordinates of the points y: ndarray y coordinates of the points z: ndarray z coordinates of the points edges: the (2, N) array returned by compute_delaunay_edges() containing node indices of the end nodes. Weights are applied to the edges based on their euclidean length for use by the MST algorithm. Returns --------- g: A NetworkX undirected graph Notes ------ We don't bother putting the coordinates into the NX graph. Instead the graph node is an index to the column. """ xyz = np.array((x, y, z)) def euclidean_dist(i, j): d = xyz[:,i] - xyz[:,j] return np.sqrt(np.dot(d, d)) g = nx.Graph() for i, j in edges: if nx.__version__.split('.')[0] > '0': g.add_edge(i, j, weight=euclidean_dist(i, j)) else: g.add_edge(i, j, euclidean_dist(i, j)) return g def points_on_sphere(N): """ Generate N evenly distributed points on the unit sphere centered at the origin. Uses the 'Golden Spiral'. Code by Chris Colbert from the numpy-discussion list. """ phi = (1 + np.sqrt(5)) / 2 # the golden ratio long_incr = 2*np.pi / phi # how much to increment the longitude dz = 2.0 / float(N) # a unit sphere has diameter 2 bands = np.arange(N) # each band will have one point placed on it z = bands * dz - 1 + (dz/2) # the height z of each band/point r = np.sqrt(1 - z*z) # project onto xy-plane az = bands * long_incr # azimuthal angle of point modulo 2 pi x = r * np.cos(az) y = r * np.sin(az) return x, y, z ################################################################################ if __name__ == '__main__': # generate some points x, y, z = points_on_sphere(50) # Avoid triangulation problems on the sphere z *= 1.01 mlab.figure(1, bgcolor=(0,0,0)) mlab.clf() # Now get the Delaunay Triangulation from vtk via mayavi mlab. Vtk stores # its points in a different order so overwrite ours to match the edges new_x, new_y, new_z, edges = compute_delaunay_edges(x, y, z, visualize=True) assert(x.shape == new_x.shape) # check triangulation got everything x, y, z = new_x, new_y, new_z if nx.__version__ < '0.99': raise ImportError('The version of NetworkX must be at least ' '0.99 to run this example') # Make a NetworkX graph out of our point and edge data g = build_geometric_graph(x, y, z, edges) # Compute minimum spanning tree using networkx # nx.mst returns an edge generator edges = nx.minimum_spanning_tree(g).edges(data=True) start_idx, end_idx, _ = np.array(list(edges)).T start_idx = start_idx.astype(np.int) end_idx = end_idx.astype(np.int) # Plot this with Mayavi graph_plot(x, y, z, start_idx, end_idx, edge_scalars=z[start_idx], opacity=0.8, colormap='summer', line_width=4, ) mlab.view(60, 46, 4) mlab.show() mayavi-4.5.0/docs/source/mayavi/auto/dragon.py0000644000076500000240000000216712566026643021744 0ustar prabhustaff00000000000000""" Viewing Stanford 3D Scanning Repository dragon model """ # Copyright (c) 2014-2015, Enthought, Inc. # Standard library imports import os from os.path import join # Enthought library imports from mayavi import mlab ### Download the dragon data, if not already on disk ############################ if not os.path.exists('dragon.tar.gz'): # Download the data try: from urllib import urlopen except ImportError: from urllib.request import urlopen print("Downloading dragon model, Please Wait (11MB)") opener = urlopen( 'http://graphics.stanford.edu/pub/3Dscanrep/dragon/dragon_recon.tar.gz') open('dragon.tar.gz', 'wb').write(opener.read()) # Extract the data import tarfile dragon_tar_file = tarfile.open('dragon.tar.gz') try: os.mkdir('dragon_data') except: pass dragon_tar_file.extractall('dragon_data') dragon_tar_file.close() # Path to the dragon ply file dragon_ply_file = join('dragon_data', 'dragon_recon', 'dragon_vrip.ply') # Render the dragon ply file mlab.pipeline.surface(mlab.pipeline.open(dragon_ply_file)) mlab.show() import shutil shutil.rmtree('dragon_data') mayavi-4.5.0/docs/source/mayavi/auto/example_adjust_cropping_extents.rst0000644000076500000240000000215412747716313027327 0ustar prabhustaff00000000000000 .. _example_adjust_cropping_extents: Adjust cropping extents example -------------------------------------------- A custom dialog to adjust the parameters of a GeometryFilter to crop data points. This example shows how to use a GeometryFilter to crop data points, but also how to build a custom dialog to easily set interactively parameters of a filter, or any other Mayavi object. The GeometryFilter crops all data within a bounding box specified by 'extents'. In this example, we want to be able to tweak these extents interactively. For this, we build a Traits object that has 'x_min', 'x_max', 'y_min', ... attributes. Traits enables us to represent this object as a dialog box. We use a callback called when these attributes are modified to propagate them to the filter. For more information on creating GUIs with Traits: http://code.enthought.com/projects/traits/docs/html/tutorials/traits_ui_scientific_app.html http://code.enthought.com/projects/traits/documentation.php **Python source code:** :download:`adjust_cropping_extents.py` .. literalinclude:: adjust_cropping_extents.py :lines: 22- mayavi-4.5.0/docs/source/mayavi/auto/example_atomic_orbital.rst0000644000076500000240000000233012747716313025346 0ustar prabhustaff00000000000000 .. _example_atomic_orbital: Atomic orbital example -------------------------------------------------------------------- An example showing the norm and phase of an atomic orbital: isosurfaces of the norm, with colors displaying the phase. This example shows how you can apply a filter on one data set, and dislay a second data set on the output of the filter. Here we use the contour filter to extract isosurfaces of the norm of a complex field, and we display the phase of the field with the colormap. The field we choose to plot is a simplified version of the 3P_y atomic orbital for hydrogen-like atoms. The first step is to create a data source with two scalar datasets. The second step is to apply filters and modules, using the 'set_active_attribute' filter to select on which data these apply. Creating a data source with two scalar datasets is actually slighlty tricky, as it requires some understanding of the layout of the datasets in TVTK. The reader is referred to :ref:`data-structures-used-by-mayavi` for more details. .. image:: ../generated_images/example_atomic_orbital.jpg :align: center **Python source code:** :download:`atomic_orbital.py` .. literalinclude:: atomic_orbital.py :lines: 22- mayavi-4.5.0/docs/source/mayavi/auto/example_boy.rst0000644000076500000240000000105512747716313023152 0ustar prabhustaff00000000000000 .. _example_boy: Boy example -------------------------------------------------------------------- A script to generate the Mayavi logo: a Boy surface. The boy surface is a mathematical parametric surface, see http://en.wikipedia.org/wiki/Boy%27s_surface . We display it by sampling the two parameters of the surface on a grid and using the mlab's mesh function: :func:`mayavi.mlab.mesh`. .. image:: ../generated_images/example_boy.jpg :align: center **Python source code:** :download:`boy.py` .. literalinclude:: boy.py :lines: 9- mayavi-4.5.0/docs/source/mayavi/auto/example_bunny.rst0000644000076500000240000000040112566026643023505 0ustar prabhustaff00000000000000 .. _example_bunny: Bunny example -------------------------------------------------------------------- Viewing Stanford 3D Scanning Repository bunny model **Python source code:** :download:`bunny.py` .. literalinclude:: bunny.py :lines: 4- mayavi-4.5.0/docs/source/mayavi/auto/example_canyon.rst0000644000076500000240000000111412747716313023644 0ustar prabhustaff00000000000000 .. _example_canyon: Canyon example -------------------------------------------------------------------- Retrieve radar data from the NASA and plot a view of the Grand Canyon landscape. We cannot display the whole data, as it would be too big. To display more, see the canyon decimation example. This example is interesting as it shows how numpy can be used to load and crop data completly foreign to Mayavi. .. image:: ../generated_images/example_canyon.jpg :align: center **Python source code:** :download:`canyon.py` .. literalinclude:: canyon.py :lines: 11- mayavi-4.5.0/docs/source/mayavi/auto/example_canyon_decimation.rst0000644000076500000240000000265012747716313026046 0ustar prabhustaff00000000000000 .. _example_canyon_decimation: Canyon decimation example -------------------------------------------------------------------- Use the greedy-terrain-decimator to display a decimated terrain view. This example illustrates decimating a terrain. We use the greedy-terrain-decimator to create a reduced mesh with an optimized grid that approximates the initial regular grid. The initial grid is displayed in white, and the optimized grid is displayed in black, with the surface it creates. The initial grid can be seen disappearing as it goes under the surface of the approximated grid: although the decimated mesh follows closely the orginal, it is not exactly the same. One can see that the reduction in number of polygons is huge: the white grid is much finer than the black grid. It is interesting to note that the decimated mesh follows closely the original mesh, including in number of polygons, in spots where the terrain changes most quickly. This example uses the Grand Canyon topological radar data, from NASA. The greedy-terrain-decimator is only useful to decimate a surface warped from 2D data. To decimated more general meshes, you can use the less-efficient decimate-pro filter (see :ref:`example_julia_set_decimation`). .. image:: ../generated_images/example_canyon_decimation.jpg :align: center **Python source code:** :download:`canyon_decimation.py` .. literalinclude:: canyon_decimation.py :lines: 25- mayavi-4.5.0/docs/source/mayavi/auto/example_chemistry.rst0000644000076500000240000000154712747716313024376 0ustar prabhustaff00000000000000 .. _example_chemistry: Chemistry example -------------------------------------------------------------------- In this example, we display the H2O molecule, and use volume rendering to display the electron localization function. The atoms and the bounds are displayed using mlab.points3d and mlab.plot3d, with scalar information to control the color. The electron localization function is displayed using volume rendering. Good use of the `vmin` and `vmax` argument to `mlab.pipeline.volume` is critical to achieve a good visualization: the `vmin` threshold should placed high-enough for features to stand out. The original is an electron localization function from Axel Kohlmeyer. .. image:: ../generated_images/example_chemistry.jpg :align: center **Python source code:** :download:`chemistry.py` .. literalinclude:: chemistry.py :lines: 15- mayavi-4.5.0/docs/source/mayavi/auto/example_coil_design_application.rst0000644000076500000240000000364412747716313027231 0ustar prabhustaff00000000000000 .. _example_coil_design_application: Coil design application example -------------------------------------------- An full-blown application demoing a domain-specific usecase with Mayavi: interactive design of coils. This is example of electromagnetic coils design, an application is built to enable a user to interactively position current loops while visualizing the resulting magnetic field. For this purpose, it is best to use object-oriented programming. Each current loop is written as an object (the `Loop` class), with position, radius and direction attributes, and that knows how to calculate the magnetic field it generates: its `Bnorm` is a property, that is recomputed when the loop characteristic changes. These loop objects are available to the main application class as a list. The total magnetic field created is the sum of each individual magnetic field. It can be visualized via a Mayavi scene embedded in the application class. As we use Traited objects for the current loops, a dialog enabling modification of their attributes can be generated by Traits and embedded in our application. The full power of Mayavi is available to the application. Via the pipeline tree view, the user can modify the visualization. Familiar interaction and movements are possible in the figure. So is saving the visualization, or loading data. In addition, as the visualization model, described by the pipeline, is separated from the data that is visualized, contained in the data source, any visualization module added by the user will update when coils are added or changed. Simpler examples of magnetic field visualization can be found on :ref:`example_magnetic_field_lines` and :ref:`example_magnetic_field`. The material required to understand this example is covered in section :ref:`builing_applications`. **Python source code:** :download:`coil_design_application.py` .. literalinclude:: coil_design_application.py :lines: 32- mayavi-4.5.0/docs/source/mayavi/auto/example_compute_in_thread.rst0000644000076500000240000000066012747716313026053 0ustar prabhustaff00000000000000 .. _example_compute_in_thread: Compute in thread example -------------------------------------------- This script demonstrates how one can do a computation in another thread and update the mayavi pipeline. It also shows how to create a numpy array data and visualize it as image data using a few modules. **Python source code:** :download:`compute_in_thread.py` .. literalinclude:: compute_in_thread.py :lines: 7- mayavi-4.5.0/docs/source/mayavi/auto/example_contour.rst0000644000076500000240000000042612747716313024053 0ustar prabhustaff00000000000000 .. _example_contour: Contour example -------------------------------------------- This script demonstrates how one can script Mayavi and use its contour related modules. **Python source code:** :download:`contour.py` .. literalinclude:: contour.py :lines: 7- mayavi-4.5.0/docs/source/mayavi/auto/example_contour_contour.rst0000644000076500000240000000043612747716313025625 0ustar prabhustaff00000000000000 .. _example_contour_contour: Contour contour example -------------------------------------------- This example shows how you can produce contours on an IsoSurface. **Python source code:** :download:`contour_contour.py` .. literalinclude:: contour_contour.py :lines: 4- mayavi-4.5.0/docs/source/mayavi/auto/example_custom_colormap.rst0000644000076500000240000000220312747716313025563 0ustar prabhustaff00000000000000 .. _example_custom_colormap: Custom colormap example -------------------------------------------------------------------- An example showing how a custom colormap (or look up table) can be used for a given object. Although the end user specifies colormaps by giving the name of a set of predefined colormaps, Mayavi (and VTK) deal with color internally using 'Look Up Tables' (LUT): a table that associate a scalar value to a color defined by its RGBA components. In this example, we show how the LUT of an object can be retrieved and modified. Specificaly, we start by giving a surf object the 'cool' colormap, but we modify add to add a transparency effect. Notice in the resulting image how the surface becomes more transparent for its lower points. Note that if you want to use a different number of colors, you can change the 'number_of_colors' attribute of the lut object and assign a new array of the right shape to its 'table' attribute. .. image:: ../generated_images/example_custom_colormap.jpg :align: center **Python source code:** :download:`custom_colormap.py` .. literalinclude:: custom_colormap.py :lines: 21- mayavi-4.5.0/docs/source/mayavi/auto/example_datasets.rst0000644000076500000240000000130412747716313024166 0ustar prabhustaff00000000000000 .. _example_datasets: Datasets example -------------------------------------------- A Mayavi example to show the different data sets. See :ref:`data-structures-used-by-mayavi` for a discussion. The following images are created: .. hlist:: * **ImageData** .. image:: ../image_data.jpg :scale: 50 * **RectilinearGrid** .. image:: ../rectilinear_grid.jpg :scale: 50 * **StructuredGrid** .. image:: ../structured_grid.jpg :scale: 50 * **UnstructuredGrid** .. image:: ../unstructured_grid.jpg :scale: 50 **Python source code:** :download:`datasets.py` .. literalinclude:: datasets.py :lines: 30- mayavi-4.5.0/docs/source/mayavi/auto/example_delaunay_graph.rst0000644000076500000240000000376112747716313025352 0ustar prabhustaff00000000000000 .. _example_delaunay_graph: Delaunay graph example -------------------------------------------- An example illustrating graph manipulation and display with Mayavi and NetworkX. This example shows how to use Mayavi in a purely algorithmic way, to compute a Delaunay from data points, extract it and pass it to networkx. It also shows how to plot a graph using quiver. Starting from points positioned regularly on a sphere, we first use VTK to create the Delaunay graph, and also to plot it. We then create a matching NetworkX graph, calling it's minimum spanning tree function. We display it using Mayavi. The visualization clearly shows that the minimum spanning tree of the points, considering all possible connections, is included in the Delaunay graph. _____ The function `compute_delaunay_edges` uses VTK to retrieve the Delaunay graph of a set of points. First a structure of unconnected points is created using `mlab.points3d`. The Delaunay filter applied to it builds an unstructured grid (see :ref:`data-structures-used-by-mayavi`). We apply an ExtractEdges filter to it, which returns a structure of points connected by edges: the :ref:`PolyData structure `. The dataset structure can be retrieved as the first item of the `outputs` list of the ExtractEdges filter object, returned by the `mlab.pipeline.extract_edges` factory function. Once we have this object, we extract the points and edge list from it. This graph-plotting technique differs from the technique used in the examples :ref:`example_protein` and :ref:`example_flight_graph` where points are created and connected by lines. Unlike these techniques, it enables storing scalar data on each line. _____ To visualize the graph (function `graph_plot`), we build a list of vectors giving the edges, and use `mlab.quiver3d` to display them. To display an unoriented graph, it is best to use the `2ddash` mode of `quiver3d`. **Python source code:** :download:`delaunay_graph.py` .. literalinclude:: delaunay_graph.py :lines: 43- mayavi-4.5.0/docs/source/mayavi/auto/example_dragon.rst0000644000076500000240000000040612566026643023631 0ustar prabhustaff00000000000000 .. _example_dragon: Dragon example -------------------------------------------------------------------- Viewing Stanford 3D Scanning Repository dragon model **Python source code:** :download:`dragon.py` .. literalinclude:: dragon.py :lines: 4- mayavi-4.5.0/docs/source/mayavi/auto/example_flight_graph.rst0000644000076500000240000000252612747716313025023 0ustar prabhustaff00000000000000 .. _example_flight_graph: Flight graph example -------------------------------------------------------------------- An example showing a graph display between cities positionned on the Earth surface. This graph displays the longest fligh routes operated by Boing 777. The two main interests of this example are that it shows how to build a graph of arbitrary connectivity, and that it shows how to position data on the surface of the Earth. The graph is created by first building a scalar scatter dataset with the mlab.points3d command, and adding line information to it. One of the difficulties is that the lines are specified using the indexing number of the points, so we must 'massage' our data when loading it. A similar technique to plot the graph is done in the :ref:`example_protein`. Another example of graph plotting, showing a different technique to plot the graph, can be seen on :ref:`example_delaunay_graph`. To simplify things we do not plot the connection on the surface of the Earth, but as straight lines going throught the Earth. As a result must use transparency to show the connection. Data source: http://www.777fleetpage.com/777fleetpage3.htm .. image:: ../generated_images/example_flight_graph.jpg :align: center **Python source code:** :download:`flight_graph.py` .. literalinclude:: flight_graph.py :lines: 24- mayavi-4.5.0/docs/source/mayavi/auto/example_glyph.rst0000644000076500000240000000054512747716313023507 0ustar prabhustaff00000000000000 .. _example_glyph: Glyph example -------------------------------------------- This script demonstrates using the Mayavi core API to add a VectorCutPlane, split the pipeline using a MaskPoints filter and then view the filtered data with the Glyph module. **Python source code:** :download:`glyph.py` .. literalinclude:: glyph.py :lines: 7- mayavi-4.5.0/docs/source/mayavi/auto/example_image_cursor_filter.rst0000644000076500000240000000315712747716313026412 0ustar prabhustaff00000000000000 .. _example_image_cursor_filter: Image cursor filter example -------------------------------------------- Excample using the UserDefined filter to paint a cross-shaped cursor on data, in order to point out a special position. We use the UserDefined filter `ImageCursor3D` to create the cursor. A Gaussian data field is painted with the cursor, and then visualized using the ImagePlaneWIdget module. ImageCursor3D is one example among many of the use of the UserDefined, which allows to use TVTK filters that are not. See :ref:`using_userdefined_filter` for more details. Also, other examples using the UserDefined filter are provided in :ref:`example_mri` and :ref:`example_tvtk_segmentation`. Selecting the UserDefined filter in the Mayavi pipeline is a convenient way to look for additional filters. This pops up a dialog called `TVTK class chooser`, with a `Search` field that allows to search for desired actions or properties. For example, searching for `cursor` returns several filters, among which Cursor3D and ImageCursor3D. As a rule of thumb, the name of TVTK filters acting on TVTK ImageData dataset starts with `Image` (ImageData is the type of VTK data set created by e.g. mlab.pipeline.scalar_field. See :ref:`data-structures-used-by-mayavi` for more details about VTK datasets). In the dialog used to interactively add the UserDefined filet, we can therefore select `ImageCursor3D`. The documentation of the filter is displayed when selecting its name within the `Class name` field of the dialog. **Python source code:** :download:`image_cursor_filter.py` .. literalinclude:: image_cursor_filter.py :lines: 27- mayavi-4.5.0/docs/source/mayavi/auto/example_julia_set.rst0000644000076500000240000000102412747716313024334 0ustar prabhustaff00000000000000 .. _example_julia_set: Julia set example -------------------------------------------------------------------- An example showing the Julia set displayed as a z-warped surface. The Julia set is a fractal (see http://en.wikipedia.org/wiki/Julia_set ). We display it here in a canyon-like view using mlab's surf function: :func:`mayavi.mlab.surf`. .. image:: ../generated_images/example_julia_set.jpg :align: center **Python source code:** :download:`julia_set.py` .. literalinclude:: julia_set.py :lines: 8- mayavi-4.5.0/docs/source/mayavi/auto/example_julia_set_decimation.rst0000644000076500000240000000250412747716313026534 0ustar prabhustaff00000000000000 .. _example_julia_set_decimation: Julia set decimation example -------------------------------------------------------------------- The Julia set, but with a decimated mesh: unecessary triangles due to the initial grid and not matching the geometry of the Julia set are removed. We first build the mesh, applying a warp_scalar filter to a array2d_source, to warp the Julia set along the z direction. Then when have to convert the rectangles in the mesh to triangles, in order to apply the decimate_pro filter. This filter does the decimation, and we can represent the result using surface modules. The triangle-generation filter generates warnings: some polygons are degenerate, as the grid has subdivided flat parts of the Julia set. We have shown in white the decimated mesh, and in black the non-decimated one. The view is zoom to the center of the Julia set. If you turn of the wireframes and zoom out, you can appreciate the quality of the decimation. In the specific case of decimating a surface warped from 2D data, it is more efficient to use the greedy-terrain-decimator, see the :ref:`example_canyon_decimation`. .. image:: ../generated_images/example_julia_set_decimation.jpg :align: center **Python source code:** :download:`julia_set_decimation.py` .. literalinclude:: julia_set_decimation.py :lines: 26- mayavi-4.5.0/docs/source/mayavi/auto/example_lorenz.rst0000644000076500000240000000130612747716313023671 0ustar prabhustaff00000000000000 .. _example_lorenz: Lorenz example -------------------------------------------------------------------- An example displaying the trajectories for the Lorenz system of equations along with the z-nullcline. The vector field of the Lorenz system flow is integrated to display trajectories using mlab's flow function: :func:`mayavi.mlab.flow`. The z-nullcline is plotted by extracting the z component of the vector field data source with the ExtractVectorComponent filter, and applying an IsoSurface module on this scalar component. .. image:: ../generated_images/example_lorenz.jpg :align: center **Python source code:** :download:`lorenz.py` .. literalinclude:: lorenz.py :lines: 13- mayavi-4.5.0/docs/source/mayavi/auto/example_lorenz_ui.rst0000644000076500000240000000121212747716313024362 0ustar prabhustaff00000000000000 .. _example_lorenz_ui: Lorenz ui example -------------------------------------------- This example displays the trajectories for the Lorenz system of equations using mlab along with the z-nullcline. It provides a simple UI where a user can change the parameters and the system of equations on the fly. This primarily demonstrates how one can build powerful tools with a UI using Traits and Mayavi. For explanations and more examples of interactive application building with Mayavi, please refer to section :ref:`builing_applications`. **Python source code:** :download:`lorenz_ui.py` .. literalinclude:: lorenz_ui.py :lines: 11- mayavi-4.5.0/docs/source/mayavi/auto/example_lucy.rst0000644000076500000240000000037412566026643023337 0ustar prabhustaff00000000000000 .. _example_lucy: Lucy example -------------------------------------------------------------------- Viewing Stanford 3D Scanning Repository lucy model **Python source code:** :download:`lucy.py` .. literalinclude:: lucy.py :lines: 4- mayavi-4.5.0/docs/source/mayavi/auto/example_magnetic_field.rst0000644000076500000240000000203312747716313025310 0ustar prabhustaff00000000000000 .. _example_magnetic_field: Magnetic field example -------------------------------------------- An example mixing numerical caculation and 3D visualization of the magnetic field created by an arbitrary number of current loops. The goal of this example is to show how Mayavi can be used with scipy to debug and understand physics and electromagnetics computation. The field is caculated for an arbitrary number of current loops using the corresponding exact formula. The coils are plotted in 3D with a synthetic view of the magnetic_field. A VectorCutPlane is used as it enables good inspection of the magnetic field. This example originated from a real-life case of coil design in Python ( Atomic sources for long-time-of-flight interferometric inertial sensors, G. Varoquaux, http://tel.archives-ouvertes.fr/tel-00265714/, page 148). For another visualization of magnetic field, see the :ref:`example_magnetic_field_lines`. **Python source code:** :download:`magnetic_field.py` .. literalinclude:: magnetic_field.py :lines: 20- mayavi-4.5.0/docs/source/mayavi/auto/example_magnetic_field_lines.rst0000644000076500000240000000160712747716313026510 0ustar prabhustaff00000000000000 .. _example_magnetic_field_lines: Magnetic field lines example -------------------------------------------------------------------- This example uses the streamline module to display field lines of a magnetic dipole (a current loop). This example requires scipy. The magnetic field from an arbitrary current loop is calculated from eqns (1) and (2) in Phys Rev A Vol. 35, N 4, pp. 1535-1546; 1987. To get a prettier result, we use a fairly large grid to sample the field. As a consequence, we need to clear temporary arrays as soon as possible. For a more thorough example of magnetic field calculation and visualization with Mayavi and scipy, see :ref:`example_magnetic_field`. .. image:: ../generated_images/example_magnetic_field_lines.jpg :align: center **Python source code:** :download:`magnetic_field_lines.py` .. literalinclude:: magnetic_field_lines.py :lines: 18- mayavi-4.5.0/docs/source/mayavi/auto/example_mayavi_traits_ui.rst0000644000076500000240000000123712747716313025734 0ustar prabhustaff00000000000000 .. _example_mayavi_traits_ui: Mayavi traits ui example -------------------------------------------- An example of how to create a UI similar to the complete Mayavi application inside a Traits UI view. This does not use Envisage and provides a similar UI as seen in the full Mayavi application. This example uses `traitsUI `_ to create a dialog mimicking the mayavi2 application: a scene on the right, and on the left a pipeline tree view, and below it a panel to edit the currently-selected object. **Python source code:** :download:`mayavi_traits_ui.py` .. literalinclude:: mayavi_traits_ui.py :lines: 14- mayavi-4.5.0/docs/source/mayavi/auto/example_mlab_3D_to_2D.rst0000644000076500000240000001434312747716313024655 0ustar prabhustaff00000000000000 .. _example_mlab_3D_to_2D: Mlab 3D to 2D example -------------------------------------------- A script to calculate the projection of 3D world coordinates to 2D display coordinates (pixel coordinates) for a given scene. The 2D pixel locations of objects in the image plane are related to their 3D world coordinates by a series of linear transformations. The specific transformations fall under the group known as projective transformations. This set includes pure projectivities, affine transformations, perspective transformations, and euclidean transformations. In the case of mlab (and most other computer visualization software), we deal with only the perspective and euclidean cases. An overview of Projective space can be found here: http://en.wikipedia.org/wiki/Projective_space and a thorough treatment of projective geometry can be had in the book "Multiple View Geometry in Computer Vision" by Richard Hartley. The essential thing to know for this example is that points in 3-space are related to points in 2-space through a series of multiplications of 4x4 matrices which are the perspective and euclidean transformations. The 4x4 matrices predicate the use of length 4 vectors to represent points. This representation is known as homogeneous coordinates, and while they appear foriegn at first, they truly simplify all the mathematics involved. In short, homogeneous coordinates are your friend, and you should read about them here: http://en.wikipedia.org/wiki/Homogeneous_coordinates In the normal pinhole camera model (the ideal real world model), 3D world points are related to 2D image points by the matrix termed the 'essential' matrix which is a combination of a perspective transformation and a euclidean transformation. The perspective transformation is defined by the camera intrinsics (focal length, imaging sensor offset, etc...) and the euclidean transformation is defined by the cameras position and orientation. In computer graphics, things are not so simple. This is because computer graphics have the benefit of being able to do things which are not possible in the real world: adding clipping planes, offset projection centers, arbitrary distortions, etc... Thus, a slightly different model is used. What follows is the camera/view model for OpenGL and thus, VTK. I can not guarantee that other packages follow this model. There are 4 different transformations that are applied 3D world coordinates to map them to 2D pixel coordinates. They are: the model transform, the view transform, the perspective transform, and the viewport or display transform. In OpenGL the first two transformations are concatenated to yield the modelview transform (called simply the view transform in VTK). The modelview transformation applies arbitrary scaling and distortions to the model (if they are specified) and transforms them so that the orientation is the equivalent of looking down the negative Z axis. Imagine its as if you relocate your camera to look down the negative Z axis, and then move everything in the world so that you see it now as you did before you moved the camera. The resulting coordinates are termed "eye" coordinates in OpenGL (I don't know that they have a name in VTK). The perspective transformation applies the camera perspective to the eye coordinates. This transform is what makes objects in the foreground look bigger than equivalent objects in the background. In the pinhole camera model, this transform is determined uniquely by the focal length of the camera and its position in 3-space. In Vtk/OpenGL it is determined by the frustum. A frustum is simply a pyramid with the top lopped off. The top of the pyramid (a point) is the camera location, the base of the pyramid is a plane (the far clipping plane) defined as normal to principle camera ray at distance termed the far clipping distance, the top of the frustum (where it's lopped off) is the near clipping plane, with a definition similar to that of the far clipping plane. The sides of the frustum are determined by the aspect ratio of the camera (width/height) and its field-of-view. Any points not lying within the frustum are not mapped to the screen (as they would lie outside the viewable area). The perpspective transformation has the effect of scaling everything within the frustum to fit within a cube defined in the range (-1,1)(-1,1)(-1,1) as represented by homogeneous coordinates. The last phrase there is important, the first 3 coordinates will not, in general, be within the unity range until we divide through by the last coordinate (See the wikipedia on homogeneous coordinates if this is confusing). The resulting coordinates are termed (appropriately enough) normalized view coordinates. The last transformation (the viewport transformation) takes us from normalized view coordinates to display coordinates. At this point, you may be asking yourself 'why not just go directly to display coordinates, why need normalized view coordinates at all?', the answer is that we may want to embed more than one view in a particular window, there will therefore be different transformations to take each view to an appropriate position an size in the window. The normalized view coordinates provide a nice common ground so-to-speak. At any rate, the viewport transformation simply scales and translates the X and Y coordinates of the normalized view coordinates to the appropriate pixel coordinates. We don't use the Z value in our example because we don't care about it. It is used for other various things however. That's all there is to it, pretty simple right? Right. Here is an overview: Given a set of 3D world coordinates: - Apply the modelview transformation (view transform in VTK) to get eye coordinates - Apply the perspective transformation to get normalized view coordinates - Apply the viewport transformation to get display coordinates VTK provides a nice method to retrieve a 4x4 matrix that combines the first two operations. As far as I can tell, VTK does not export a method to retrieve the 4x4 matrix representing the viewport transformation, so we are on our there to create one (no worries though, its not hard, as you will see). Now that the prelimenaries are out of the way, lets get started. **Python source code:** :download:`mlab_3D_to_2D.py` .. literalinclude:: mlab_3D_to_2D.py :lines: 109- mayavi-4.5.0/docs/source/mayavi/auto/example_mlab_interactive_dialog.rst0000644000076500000240000000230012747716313027202 0ustar prabhustaff00000000000000 .. _example_mlab_interactive_dialog: Mlab interactive dialog example -------------------------------------------- An example of how to modify the data visualized via an interactive dialog. A dialog is created via `TraitsUI `_ from an object (MyModel). Some attributes of the objects are represented on the dialog: first a Mayavi scene, that will host our visualization, and two parameters that control the data plotted. A curve is plotted in the embedded scene using the associated mlab.points3d function. The visualization object created is stored as an attribute on the main MyModel object, to modify it inplace later. When the `n_meridional` and `n_longitudinal` attributes are modified, eg via the slide bars on the dialog, the curve is recomputed, and the visualization is updated by modifying inplace the stored plot object (see :ref:`mlab-animating-data`). This example is discussed in details in the section :ref:`embedding_mayavi_traits`. .. image:: ../images/example_mlab_interactive_dialog.jpg :align: center **Python source code:** :download:`mlab_interactive_dialog.py` .. literalinclude:: mlab_interactive_dialog.py :lines: 23- mayavi-4.5.0/docs/source/mayavi/auto/example_mlab_traits_ui.rst0000644000076500000240000000070412747716313025357 0ustar prabhustaff00000000000000 .. _example_mlab_traits_ui: Mlab traits ui example -------------------------------------------- A simple example of how to use mayavi.mlab inside a traits UI dialog. This example uses traitsUI ( `traitsUI `_ ) to create a the simplest possible dialog: a single Mayavi scene in a window. **Python source code:** :download:`mlab_traits_ui.py` .. literalinclude:: mlab_traits_ui.py :lines: 8- mayavi-4.5.0/docs/source/mayavi/auto/example_mlab_visual.rst0000644000076500000240000000157512747716313024666 0ustar prabhustaff00000000000000 .. _example_mlab_visual: Mlab visual example -------------------------------------------- A very simple example to show how you can use TVTK's visual module with mlab and create simple animations. In the example, the grey box bounces back and forth between the two red ones. The `tvtk.tools.visual` module exposes an API similar to `VPython `_ and is useful to create animation based on rigid object movement. The `@animate` decorator ( :func:`mayavi.mlab.animate` ) is detailed on section :ref:`animating_a_visualization`. If you want to modify the data plotted by the mlab (as in the `mlab.test_plot3d()` call) to create an animation, please see section :ref:`mlab-animating-data`. .. image:: ../images/example_mlab_visual.jpg :align: center **Python source code:** :download:`mlab_visual.py` .. literalinclude:: mlab_visual.py :lines: 21- mayavi-4.5.0/docs/source/mayavi/auto/example_mri.rst0000644000076500000240000000146512747716313023155 0ustar prabhustaff00000000000000 .. _example_mri: Mri example -------------------------------------------------------------------- Viewing MRI data with cut plane and iso surface. This example downloads an MRI scan, turns it into a 3D numpy array and visualizes it. First we extract some internal structures of the brain by defining a volume of interest around them, and using iso surfaces. Then we display two cut planes to show the raw MRI data itself. Finally we display the outer surface, but we restrict it to volume of interest to leave a cut for the cut planes. For an example of feature extraction from MRI data using Mayavi and vtk, see :ref:`example_tvtk_segmentation`. .. image:: ../generated_images/example_mri.jpg :align: center **Python source code:** :download:`mri.py` .. literalinclude:: mri.py :lines: 18- mayavi-4.5.0/docs/source/mayavi/auto/example_multiple_engines.rst0000644000076500000240000000116012747716313025721 0ustar prabhustaff00000000000000 .. _example_multiple_engines: Multiple engines example -------------------------------------------- An example to show how you can have multiple engines in one application. Mutliple engines can be useful for more separation, eg to script each engine separately, or to avoid side effects between scenes. This example shows how to explicitely set the engine for an embedded scene. To define default arguments, it makes use of the Traits initialization style, rather than overridding the __init__. **Python source code:** :download:`multiple_engines.py` .. literalinclude:: multiple_engines.py :lines: 13- mayavi-4.5.0/docs/source/mayavi/auto/example_multiple_mlab_scene_models.rst0000644000076500000240000000170512747716313027731 0ustar prabhustaff00000000000000 .. _example_multiple_mlab_scene_models: Multiple mlab scene models example -------------------------------------------- Example showing a dialog with multiple embedded scenes. When using several embedded scenes with mlab, you should be very careful always to pass the scene you want to use for plotting to the mlab function used, elsewhere it uses the current scene. In this example, failing to do so would result in only one scene being used, the last one created. The trick is to use the 'mayavi_scene' attribute of the MlabSceneModel, and pass it as a keyword argument to the mlab functions. For more examples on embedding mlab scenes in dialog, see also: the examples :ref:`example_mlab_interactive_dialog`, and :ref:`example_lorenz_ui`, as well as the section of the user manual :ref:`embedding_mayavi_traits`. **Python source code:** :download:`multiple_mlab_scene_models.py` .. literalinclude:: multiple_mlab_scene_models.py :lines: 17- mayavi-4.5.0/docs/source/mayavi/auto/example_nongui.rst0000644000076500000240000000074712747716313023667 0ustar prabhustaff00000000000000 .. _example_nongui: Nongui example -------------------------------------------- This script demonstrates how one can use the Mayavi application framework without displaying Mayavi's UI. Note: look at the end of this file to see how the non gui plugin is chosen instead of the default gui mayavi plugin. This should be run as:: $ python nongui.py Or:: $ mayavi2 script.py **Python source code:** :download:`nongui.py` .. literalinclude:: nongui.py :lines: 18- mayavi-4.5.0/docs/source/mayavi/auto/example_numeric_source.rst0000644000076500000240000000050712747716313025404 0ustar prabhustaff00000000000000 .. _example_numeric_source: Numeric source example -------------------------------------------- This script demonstrates how to create a numpy array data and visualize it as image data using a few modules. **Python source code:** :download:`numeric_source.py` .. literalinclude:: numeric_source.py :lines: 7- mayavi-4.5.0/docs/source/mayavi/auto/example_offscreen.rst0000644000076500000240000000125212747716313024332 0ustar prabhustaff00000000000000 .. _example_offscreen: Offscreen example -------------------------------------------- A simple example of how you can use Mayavi without using Envisage or the Mayavi Envisage application and do off screen rendering. On Linux/Mac, with VTK < 5.2, you should see a small black window popup and disappear, see the section :ref:`offscreen_rendering` to avoid this. On Win32 you will not see any windows popping up at all. In the end you should have an offscreen.png image in the same directory with the rendered visualization. It can be run as:: $ python offscreen.py **Python source code:** :download:`offscreen.py` .. literalinclude:: offscreen.py :lines: 15- mayavi-4.5.0/docs/source/mayavi/auto/example_pick_on_surface.rst0000644000076500000240000000133412747716313025513 0ustar prabhustaff00000000000000 .. _example_pick_on_surface: Pick on surface example -------------------------------------------- Example showing how to pick data on a surface, going all the way back to the index in the numpy arrays. In this example, two views of the same data are shown. One with the data on a sphere, the other with the data flat. We use the 'on_mouse_pick' method of the scene to register a callback on clicking on the sphere. The callback is called with a picker object as andan argument. We use the point_id of the point that has been picked, andand go back to the 2D index on the data matrix to find its position. **Python source code:** :download:`pick_on_surface.py` .. literalinclude:: pick_on_surface.py :lines: 12- mayavi-4.5.0/docs/source/mayavi/auto/example_plotting_many_lines.rst0000644000076500000240000000224212747716313026436 0ustar prabhustaff00000000000000 .. _example_plotting_many_lines: Plotting many lines example -------------------------------------------------------------------- This examples shows how many lines can be grouped together in a single object, for convenience and efficiency. We want to plot a large number of lines. We could use mlab.plot3d for this, but it will create an object for each line, this will be inefficient. This example shows how to create one object comprised of many lines. The underlying idea is the same as that used to plot graphes (see for instance :ref:`example_flight_graph`): create a set of points, and specify explicitely the connectivity between them. First we create the set of unconnected point (the underlying data structure is a :ref:`poly_data`) using `mlab.pipeline.scalar_scatter`. To add the connections, we need to keep track of which point is connected to which. As we only have lines, this is fairly easy: in a line, each point is connected to the following one. .. image:: ../generated_images/example_plotting_many_lines.jpg :align: center **Python source code:** :download:`plotting_many_lines.py` .. literalinclude:: plotting_many_lines.py :lines: 20- mayavi-4.5.0/docs/source/mayavi/auto/example_poll_file.rst0000644000076500000240000000110412747716313024321 0ustar prabhustaff00000000000000 .. _example_poll_file: Poll file example -------------------------------------------- A simple script that polls a data file for changes and then updates the mayavi pipeline automatically. This script is to be run like so:: $ mayavi2 -x poll_file.py Or:: $ python poll_file.py The script currently defaults to using the example data in examples/data/heart.vtk. You can try editing that data file or change this script to point to other data which you can edit. **Python source code:** :download:`poll_file.py` .. literalinclude:: poll_file.py :lines: 17- mayavi-4.5.0/docs/source/mayavi/auto/example_polydata.rst0000644000076500000240000000076012747716313024200 0ustar prabhustaff00000000000000 .. _example_polydata: Polydata example -------------------------------------------- An example of how to generate a polydata dataset using numpy arrays. The example is similar to tvtk/examples/tiny_mesh.py. Also shown is a way to visualize this data with mayavi2. The script can be run like so:: $ mayavi2 -x polydata.py It can be alternatively run as:: $ python polydata.py **Python source code:** :download:`polydata.py` .. literalinclude:: polydata.py :lines: 14- mayavi-4.5.0/docs/source/mayavi/auto/example_probe_filter.rst0000644000076500000240000000456712747716313025050 0ustar prabhustaff00000000000000 .. _example_probe_filter: Probe filter example -------------------------------------------- Using the probe filter to visualize a scalar field along an arbitrary surface. This example shows how a data set can be 'projected' (or interpolated) on another given source using the probe filter. It is also an example of a complex VTK pipeline and shows how to inspect it with the PipelineBrowser. In this example, a function is sampled on a regular grid and can be visualized using an ImagePlaneWidget. The function we are interested is independent of the distance to the origin and a function only of the angle. This is why it may be interesting to visualize its value sampled on a sphere center at the origin, but we have the data sampled throughout the volume on a regular grid. We create a sphere with the BuiltinSurface source and use the VTK ProbeFilter to sample the data on this surface. The ProbeFilter takes one input, which is the data structure to project the data on, and a 'source', which is where the data values come from. We need to use the UserDefined filter to insert this VTK filter in the Mayavi pipeline (see :ref:`using_userdefined_filter` as well as :ref:`example_image_cursor_filter` and :ref:`example_tvtk_segmentation`). Specifying its input is done automatical when it is inserted on the pipeline, be its source needs to be specified explicitely. As it is a VTK filter, the source is the VTK dataset output by the Mayavi object: we can find it in `.outputs[0]`. Note that this filter violates slightly the simple pipeline model that Mayavi tries to expose to the users: it has two entries. As a result, the Mayavi pipeline is not longer really a tree. However, if you open up the Mayavi :ref:`pipeline view `, you can see that the ProbeFilter has only one parent in the view. To inspect the actually VTK pipeline underlying this visualization, we use the TVTK PipelineBrowser at the end of the example. You can see that the VTK pipeline is much more complex that the pipeline represented in Mayavi: actors, data mappers, and other elements of the VTK pipeline are collapsed in the Mayavi filters and modules. Note that, as we know the expression of the function, it would be simpler and more efficient to directly sample it on the sphere. **Python source code:** :download:`probe_filter.py` .. literalinclude:: probe_filter.py :lines: 44- mayavi-4.5.0/docs/source/mayavi/auto/example_protein.rst0000644000076500000240000000405112747716313024040 0ustar prabhustaff00000000000000 .. _example_protein: Protein example -------------------------------------------------------------------- Visualize a protein graph structure downloaded from the protein database in standard pdb format. We parse the pdb file, but extract only a very small amount of information: the type of atoms, their positions, and the links between them. Most of the complexity of this example comes from the code turning the PDB information into a list of 3D positions, with associated scalar and connection information. We assign a scalar value for the atoms to differenciate the different types of atoms, but it does not correspond to the atomic mass. The size and the color of the atom on the visualization is therefore not chemicaly-significant. The atoms are plotted using mlab.points3d, and connections between atoms are added to the dataset, and visualized using a surface module. The graph is created by adding connection information to points. For this, each point is designated by its number (in the order of the array passed to mlab.points3d), and the connection array, made of pairs of these numbers, is constructed. There is some slightly tedious data manipulation to go from the named-node graph representation as stored in the pdb file, to the index-based connection pairs. A similar technique to plot the graph is done in the :ref:`example_flight_graph`. Another example of graph plotting, showing a different technique to plot the graph, can be seen on :ref:`example_delaunay_graph`. To visualize the local atomic density, we use a gaussian splatter filter that builds a kernel density estimation of the continuous density field: each point is convoluted by a Gaussian kernel, and the sum of these Gaussians form the resulting density field. We visualize this field using volume rendering. Reference for the pdb file standard: http://mmcif.pdb.org/dictionaries/pdb-correspondence/pdb2mmcif.html .. image:: ../generated_images/example_protein.jpg :align: center **Python source code:** :download:`protein.py` .. literalinclude:: protein.py :lines: 39- mayavi-4.5.0/docs/source/mayavi/auto/example_qt_embedding.rst0000644000076500000240000000063712747716313025010 0ustar prabhustaff00000000000000 .. _example_qt_embedding: Qt embedding example -------------------------------------------- This example demonstrates using Mayavi as a component of a large Qt application. For this use, Mayavi is embedded in a QWidget. To understand this example, please read section :ref:`builing-applications`. **Python source code:** :download:`qt_embedding.py` .. literalinclude:: qt_embedding.py :lines: 8- mayavi-4.5.0/docs/source/mayavi/auto/example_scatter_plot.rst0000644000076500000240000000173512747716313025071 0ustar prabhustaff00000000000000 .. _example_scatter_plot: Scatter plot example -------------------------------------------- An example of plotting scatter points with Mayavi's core API. This script creates a bunch of random points with random scalar data and then shows these as a "scatter" plot of points. The script illustrates how to 1. create a dataset easily using tvtk and numpy, 2. use a created dataset in Mayavi and visualize it. This example achieve the same functionnality as mlab's points3d function ( :func:`mayavi.mlab.points3d`), but explicitely creating the objects and adding them to the pipeline engine via the Mayavi core API. Compared to using mlab, this method has the advantage of giving more control on which objects are created, and there life cycle. Run this script like so:: $ mayavi2 -x scatter_plot.py Alternatively it can be run as:: $ python scatter_plot.py **Python source code:** :download:`scatter_plot.py` .. literalinclude:: scatter_plot.py :lines: 26- mayavi-4.5.0/docs/source/mayavi/auto/example_select_red_balls.rst0000644000076500000240000000216712747716313025654 0ustar prabhustaff00000000000000 .. _example_select_red_balls: Select red balls example -------------------------------------------- This example shows how to use a callback to select a red ball amongst white balls. The example uses the figure method 'on_mouse_pick', added in Mayavi 3.4, to register a callback when the left mouse is pressed. The callback is called with a picker, enabling to identify the object selected. Specificaly, actors are selected, each object is represented on the scene via actors. The selected actors can be found in 'picker.actors'. In this example, we have plotted red balls and white ball. We want to select the red balls, and thus test if any actor in picker.actors corresponds to an actor of red balls. To identify which ball has been selected, we use the point id. However, each ball is represented by several points. Thus we need to retrieve the number of points per ball, and divide the point id by this number. We use an outline to display which ball was selected by positioning it on the corresponding ball. **Python source code:** :download:`select_red_balls.py` .. literalinclude:: select_red_balls.py :lines: 21- mayavi-4.5.0/docs/source/mayavi/auto/example_simple_structured_grid.rst0000644000076500000240000000164712747716313027152 0ustar prabhustaff00000000000000 .. _example_simple_structured_grid: Simple structured grid example -------------------------------------------------------------------- An example creating a structured grid data set from numpy arrays using TVTK and visualizing it using mlab. In this example, we create a structured-grid data set: we describe data, both scalar and vector, lying on a structured-grid, ie a grid where each vertex has 6 neighboors. For this we directly create a StructuredGrid tvtk object, rather than using the mlab.pipeline source functions, as it gives us more control. To visualize the resulting dataset, we apply several modules, using the mlab.pipeline interface (see :ref:`controlling-the-pipeline-with-mlab-scripts`) .. image:: ../generated_images/example_simple_structured_grid.jpg :align: center **Python source code:** :download:`simple_structured_grid.py` .. literalinclude:: simple_structured_grid.py :lines: 14- mayavi-4.5.0/docs/source/mayavi/auto/example_spherical_harmonics.rst0000644000076500000240000000146712747716313026405 0ustar prabhustaff00000000000000 .. _example_spherical_harmonics: Spherical harmonics example -------------------------------------------------------------------- Plot spherical harmonics on the surface of the sphere, as well as a 3D polar plot. This example requires scipy. In this example we use the mlab's mesh function: :func:`mayavi.mlab.mesh`. For plotting surfaces this is a very versatile function. The surfaces can be defined as functions of a 2D grid. For each spherical harmonic, we plot its value on the surface of a sphere, and then in polar. The polar plot is simply obtained by varying the radius of the previous sphere. .. image:: ../generated_images/example_spherical_harmonics.jpg :align: center **Python source code:** :download:`spherical_harmonics.py` .. literalinclude:: spherical_harmonics.py :lines: 16- mayavi-4.5.0/docs/source/mayavi/auto/example_standalone.rst0000644000076500000240000000045712747716313024516 0ustar prabhustaff00000000000000 .. _example_standalone: Standalone example -------------------------------------------- A simple example of how you can use Mayavi without using Envisage or the Mayavi Envisage application. **Python source code:** :download:`standalone.py` .. literalinclude:: standalone.py :lines: 6- mayavi-4.5.0/docs/source/mayavi/auto/example_streamline.rst0000644000076500000240000000046112747716313024524 0ustar prabhustaff00000000000000 .. _example_streamline: Streamline example -------------------------------------------- This script demonstrates how one can script Mayavi's core API to display streamlines and an iso surface. **Python source code:** :download:`streamline.py` .. literalinclude:: streamline.py :lines: 5- mayavi-4.5.0/docs/source/mayavi/auto/example_structured_grid.rst0000644000076500000240000000077312747716313025600 0ustar prabhustaff00000000000000 .. _example_structured_grid: Structured grid example -------------------------------------------- An example of how to generate a structured grid dataset using numpy arrays. Also shown is a way to visualize this data with the mayavi2 application. The script can be run like so:: $ mayavi2 -x structured_grid.py Alternatively, it can be run as:: $ python structured_grid.py **Python source code:** :download:`structured_grid.py` .. literalinclude:: structured_grid.py :lines: 15- mayavi-4.5.0/docs/source/mayavi/auto/example_structured_points2d.rst0000644000076500000240000000102712747716313026406 0ustar prabhustaff00000000000000 .. _example_structured_points2d: Structured points2d example -------------------------------------------- An example of how to generate a 2D structured points dataset using numpy arrays. Also shown is a way to visualize this data with the mayavi2 application. The script can be run like so:: $ mayavi2 -x structured_points2d.py Alternatively, it can be run as:: $ python structured_points2d.py **Python source code:** :download:`structured_points2d.py` .. literalinclude:: structured_points2d.py :lines: 14- mayavi-4.5.0/docs/source/mayavi/auto/example_structured_points3d.rst0000644000076500000240000000102712747716313026407 0ustar prabhustaff00000000000000 .. _example_structured_points3d: Structured points3d example -------------------------------------------- An example of how to generate a 3D structured points dataset using numpy arrays. Also shown is a way to visualize this data with the mayavi2 application. The script can be run like so:: $ mayavi2 -x structured_points3d.py Alternatively, it can be run as:: $ python structured_points3d.py **Python source code:** :download:`structured_points3d.py` .. literalinclude:: structured_points3d.py :lines: 14- mayavi-4.5.0/docs/source/mayavi/auto/example_subclassing_mayavi_application.rst0000644000076500000240000000074012747716313030627 0ustar prabhustaff00000000000000 .. _example_subclassing_mayavi_application: Subclassing mayavi application example -------------------------------------------- This script demonstrates how one can script the Mayavi application by subclassing the application, create a new scene and create a few simple modules. This should be run as:: $ python test.py **Python source code:** :download:`subclassing_mayavi_application.py` .. literalinclude:: subclassing_mayavi_application.py :lines: 12- mayavi-4.5.0/docs/source/mayavi/auto/example_superquad_with_gui.rst0000644000076500000240000000157612566026643026300 0ustar prabhustaff00000000000000 .. _example_superquad_with_gui: Superquad with gui example -------------------------------------------- This example uses MayaVi to show the evolution of a superquadric (http://en.wikipedia.org/wiki/Superquadrics), which are ellipsoidal surfaces parametrised by two parameters,lpha and eta. The equations that are used to determine the superquadric are (in spherical-polar coordinates): \(x = A(\sin^{lpha}(\phi)*\cos^{eta}( heta))\) \(y = B(\sin^{lpha}(\phi)*\sin^{eta}( heta))\) \(z = C(\cos^{lpha}(\phi))\) Note that when we set A=B=C=r, and lpha = eta = 1, we get the equation for a sphere in spherical polar coordinate. Use the controls at the bottom of the plot to adjust lpha and eta, and watch as the figure transforms accordingly! **Python source code:** :download:`superquad_with_gui.py` .. literalinclude:: superquad_with_gui.py :lines: 18- mayavi-4.5.0/docs/source/mayavi/auto/example_surf_regular_mlab.rst0000644000076500000240000000044612747716313026057 0ustar prabhustaff00000000000000 .. _example_surf_regular_mlab: Surf regular mlab example -------------------------------------------- Shows how to view data created by `tvtk.tools.mlab` with mayavi2. **Python source code:** :download:`surf_regular_mlab.py` .. literalinclude:: surf_regular_mlab.py :lines: 5- mayavi-4.5.0/docs/source/mayavi/auto/example_surface_from_irregular_data.rst0000644000076500000240000000256712747716313030112 0ustar prabhustaff00000000000000 .. _example_surface_from_irregular_data: Surface from irregular data example -------------------------------------------------------------------- An example which shows how to plot a surface from data acquired irregularly. Data giving the variation of a parameter 'z' as a function of two others ('x' and 'y') is often plotted as a `carpet plot`, using a surface to visualize the underlying function. when the data has been acquired on a regular grid for parameters 'x' and 'y', it can simply be view with the mlab.surf function. However, when there are some missing points, or the data has been acquired at random, the surf function cannot be used. The difficulty stems from the fact that points positionned in 3D do not define a surface if no connectivity information is given. With the surf function, this information is implicite from the shape of the input arrays. In this example, randomly-positionned points in the (x, y) plane are embedded in a surface in the z axis. We first visualize the points using mlab.points3d. We then use the delaunay2d filter to extract the mesh by nearest-neighboor matching, and visualize it using the surface module. .. image:: ../generated_images/example_surface_from_irregular_data.jpg :align: center **Python source code:** :download:`surface_from_irregular_data.py` .. literalinclude:: surface_from_irregular_data.py :lines: 22- mayavi-4.5.0/docs/source/mayavi/auto/example_tvtk_in_mayavi.rst0000644000076500000240000000207012747716313025403 0ustar prabhustaff00000000000000 .. _example_tvtk_in_mayavi: Tvtk in mayavi example -------------------------------------------------------------------- An example of pure TVTK programming to build TVTK objects, which are then added to a Mayavi scene. This example show how pure TVTK objects can be added to a Mayavi scene. This programming style does not allow to benefit from the data-management facilities of Mayavi (the pipeline, the data-oriented mlab functions), but it allows to easily reuse VTK code together with Mayavi or mlab code. If you want to use arbritrary VTK filters with Mayavi, it is best to use the UserDefined Mayavi filter, which enables the user to insert any VTK filter in the Mayavi pipeline. See, for instance, the :ref:`example_mri` for example of the UserDefined filter. For a full-blown example of a complex VTK pipeline built with Mayavi, see :ref:`example_tvtk_segmentation`. .. image:: ../generated_images/example_tvtk_in_mayavi.jpg :align: center **Python source code:** :download:`tvtk_in_mayavi.py` .. literalinclude:: tvtk_in_mayavi.py :lines: 18- mayavi-4.5.0/docs/source/mayavi/auto/example_tvtk_segmentation.rst0000644000076500000240000000122312747716313026123 0ustar prabhustaff00000000000000 .. _example_tvtk_segmentation: Tvtk segmentation example -------------------------------------------- Using VTK to assemble a pipeline for segmenting MRI images. This example shows how to insert well-controled custom VTK filters in Mayavi. This example downloads an MRI scan, turns it into a 3D numpy array, applies a segmentation procedure made of VTK filters to extract the gray-matter/white-matter boundary. The segmentation algorithm used here is very naive and should, of course, not be used as an example of segmentation. **Python source code:** :download:`tvtk_segmentation.py` .. literalinclude:: tvtk_segmentation.py :lines: 13- mayavi-4.5.0/docs/source/mayavi/auto/example_unstructured_grid.rst0000644000076500000240000000117212747716313026135 0ustar prabhustaff00000000000000 .. _example_unstructured_grid: Unstructured grid example -------------------------------------------- A MayaVi example of how to generate an unstructured grid dataset using numpy arrays. Also shown is a way to visualize this data with mayavi2. The script can be run like so: $ mayavi2 -x unstructured_grid.py Alternatively, it can be run as: $ python unstructured_grid.py Author: Prabhu Ramachandran Copyright (c) 2007, Enthought, Inc. License: BSD style. **Python source code:** :download:`unstructured_grid.py` .. literalinclude:: unstructured_grid.py :lines: 16- mayavi-4.5.0/docs/source/mayavi/auto/example_user_mayavi.rst0000644000076500000240000000263512747716313024712 0ustar prabhustaff00000000000000 .. _example_user_mayavi: User mayavi example -------------------------------------------- Sample Mayavi customization file. This code is not to be executed as `mayavi2 -x user_mayavi.py` or `python user_mayavi.py`. Put this file in ~/.mayavi2/user_mayavi.py and rerun mayavi2 to see what it does -- the worker view may not show up by default so you will have to go to View->Other and in the Show View dialog, activate the "Custom Mayavi2 View". The added modules should show up in the menus (Look for UserOutline in the Modules) ____ This module demonstrates how to extend Mayavi. It extends the modules provided by mayavi by adding these to the Mayavi registry. Note that the registry imports customize which in turn imports this file. It also defines an Envisage plugin that is added to the default list of plugins to extend the running mayavi application. This plugin is returned by the `get_plugins()` function. This file must be placed inside the `~/.mayavi2` directory and called `user_mayavi.py`. Please note that `~/.mayavi2` is placed in `sys.path` (if the directory exists) so make sure that you choose your module names carefully (so as not to override any common module names). The file may also be placed anywhere on sys.path and called `site_mayavi.py` for global system level customizations. **Python source code:** :download:`user_mayavi.py` .. literalinclude:: user_mayavi.py :lines: 34- mayavi-4.5.0/docs/source/mayavi/auto/example_volume_slicer.rst0000644000076500000240000000327312747716313025235 0ustar prabhustaff00000000000000 .. _example_volume_slicer: Volume slicer example -------------------------------------------- Example of an elaborate dialog showing a multiple views on the same data, with 3 cuts synchronized. This example shows how to have multiple views on the same data, how to embedded multiple scenes in a dialog, and the caveat in populating them with data, as well as how to add some interaction logic on an ImagePlaneWidget. The order in which things happen in this example is important, and it is easy to get it wrong. First of all, many properties of the visualization objects cannot be changed if there is not a scene created to view them. This is why we put a lot of the visualization logic in the callback of scene.activated, which is called after creation of the scene. Second, default values created via the '_xxx_default' callback are created lazyly, that is, when the attributes are accessed. As the establishement of the VTK pipeline can depend on the order in which it is built, we trigger these access by explicitely calling the attributes. In particular, properties like scene background color, or interaction properties cannot be set before the scene is activated. The same data is exposed in the different scenes by sharing the VTK dataset between different Mayavi data sources. See the :ref:`sharing_data_between_scenes` tip for more details. In this example, the interaction with the scene and the various elements on it is strongly simplified by turning off interaction, and choosing specific scene interactor styles. Indeed, non-technical users can be confused with too rich interaction. **Python source code:** :download:`volume_slicer.py` .. literalinclude:: volume_slicer.py :lines: 31- mayavi-4.5.0/docs/source/mayavi/auto/example_volume_slicer_advanced.rst0000644000076500000240000000334112747716313027056 0ustar prabhustaff00000000000000 .. _example_volume_slicer_advanced: Volume slicer advanced example -------------------------------------------- An efficient implementation of the triple-plane view showing 3 cut planes on volumetric data, and side views showing each cut, with a cursor to move the other cuts. This is an example of complex callback interaction. It builds on the :ref:`example_volume_slicer` but has more complex logic. You should try to understand the :ref:`example_volume_slicer` first. In this example, the VolumeSlicer object displays a position attribute giving the position of the cut in data coordinates. Traits callbacks are used to move the cut planes when this position attribute is modifed. In the 3D window, the 3D cuts are displayed using ImagePlaneWidgets cutting the 3D volumetric data. The data extracted by the ImagePlaneWidgets for plotting is captured using the TVTK ImagePlaneWidget's `_get_reslice_output` method. The resulting dataset is plotted in each side view using another ImagePlaneWidget. As a result the data is not copied (at the VTK level, there is only one pipeline), and modifications of the data plotted on the planes in the 3D view (for instance when these planes are moved) are propagated to the 2D side views by the VTK pipeline. A cursor is displayed in each side view using a glyph. The cursor indicates the position of the cut. In the side view, when the mouse button is pressed on the planes, it creates a VTK `InteractionEvent`. When this happens, VTK calls an callback (observer, it VTK terms), that we use to move the position of the cut. The Traits callbacks do the rest for the updating. **Python source code:** :download:`volume_slicer_advanced.py` .. literalinclude:: volume_slicer_advanced.py :lines: 32- mayavi-4.5.0/docs/source/mayavi/auto/example_wigner.rst0000644000076500000240000000202312747716313023650 0ustar prabhustaff00000000000000 .. _example_wigner: Wigner example -------------------------------------------------------------------- An example in which 3 functions of x and y are displayed with a surf plot, while the z scaling is kept constant, to allow comparison between them. The important aspect of this example is that the 3 functions should not be displayed on top of each other, but side by side. For this we use the extent keyword argument. In addition, the relative scale between the different plots is important. This is why we also use the `warp_scale` keyword argument, to have the same scale on all plots. Finally, we have to adjust the data bounds: as we want the "horizon" of the wigner function in the middle of our extents, we put this to zero. We add a set of axes and outlines to the plot. We have to play we extents and ranges in order to make them fit with the data. .. image:: ../generated_images/example_wigner.jpg :align: center **Python source code:** :download:`wigner.py` .. literalinclude:: wigner.py :lines: 19- mayavi-4.5.0/docs/source/mayavi/auto/example_wx_embedding.rst0000644000076500000240000000150312747716313025013 0ustar prabhustaff00000000000000 .. _example_wx_embedding: Wx embedding example -------------------------------------------- This example shows to embed a Mayavi view in a wx frame. The trick is to create a `HasTraits` object, as in the mlab_traits_ui.py, mayavi_traits_ui.py, or the modifying_mlab_source.py examples (:ref:`example_mlab_traits_ui`, :ref:`example_mayavi_traits_ui`, :ref:`example_mlab_interactive_dialog`). Calling the `edit_traits` method returns a `ui` object whose `control` attribute is the wx widget. It can thus be embedded in a standard wx application. In this example, the wx part is very simple. See :ref:`example_wx_mayavi_embed_in_notebook` for an example of more complex embedding of Mayavi scenes in Wx applications. **Python source code:** :download:`wx_embedding.py` .. literalinclude:: wx_embedding.py :lines: 17- mayavi-4.5.0/docs/source/mayavi/auto/example_wx_mayavi_embed_in_notebook.rst0000644000076500000240000000121612747716313030106 0ustar prabhustaff00000000000000 .. _example_wx_mayavi_embed_in_notebook: Wx mayavi embed in notebook example -------------------------------------------- This example show how to embedded Mayavi in a wx notebook. This is a slightly more complex example than the `wx_embedding` example ( :ref:`example_wx_embedding`), and can be used to see how a large wx application can use different Mayavi views. In this example, we embed one single Mayavi scene in a Wx notebook, with 2 tabs, each one of them hosting a different view of the scene. **Python source code:** :download:`wx_mayavi_embed_in_notebook.py` .. literalinclude:: wx_mayavi_embed_in_notebook.py :lines: 11- mayavi-4.5.0/docs/source/mayavi/auto/example_zzz_reader.rst0000644000076500000240000000117412747716313024542 0ustar prabhustaff00000000000000 .. _example_zzz_reader: Zzz reader example -------------------------------------------- This is a simple example that shows how to create a reader factory and register that reader with mayavi. To use this: - put this in ~/.mayavi2/ - then import this module in your ~/.mayavi2/user_mayavi.py. that's it. What you should get: - Options to open .zzz files from the file->open menu. - Open .zzz files via right click. - Open .zzz files from the engine or mlab (via open) - do mayavi2 -d foo.zzz. **Python source code:** :download:`zzz_reader.py` .. literalinclude:: zzz_reader.py :lines: 19- mayavi-4.5.0/docs/source/mayavi/auto/examples.rst0000644000076500000240000004576012747716313022477 0ustar prabhustaff00000000000000 .. _example_gallery: Example gallery ================= Mlab functions gallery ---------------------- These are the examples of the mlab plotting functions. They are copied out here for convenience. Please refer to the corresponding section of the user guide for more information ( :ref:`mlab_plotting_functions`). .. currentmodule:: mayavi.mlab +------------------+-------------------------+---------------------+ | :func:`plot3d` | :func:`points3d` | :func:`imshow` | | | | | | |plot3d.jpg| | |points3d.jpg| | |imshow.jpg| | +------------------+-------------------------+---------------------+ | :func:`surf` | :func:`contour_surf` | :func:`mesh` | | | | | | |surf.jpg| | |contour_surf.jpg| | |mesh.jpg| | +------------------+-------------------------+---------------------+ | :func:`barchart` | :func:`triangular_mesh` | :func:`contour3d` | | | | | | |barchart.jpg| | |triangular_mesh.jpg| | |contour3d.jpg| | +------------------+-------------------------+---------------------+ | :func:`quiver3d` | :func:`flow` | | | | | | | |quiver3d.jpg| | |flow.jpg| | | +------------------+-------------------------+---------------------+ .. |plot3d.jpg| image:: ../generated_images/enthought_mayavi_mlab_plot3d.jpg :width: 150 .. |points3d.jpg| image:: ../generated_images/enthought_mayavi_mlab_points3d.jpg :width: 150 .. |imshow.jpg| image:: ../generated_images/enthought_mayavi_mlab_imshow.jpg :width: 150 .. |contour_surf.jpg| image:: ../generated_images/enthought_mayavi_mlab_contour_surf.jpg :width: 150 .. |triangular_mesh.jpg| image:: ../generated_images/enthought_mayavi_mlab_triangular_mesh.jpg :width: 150 .. |surf.jpg| image:: ../generated_images/enthought_mayavi_mlab_surf.jpg :width: 150 .. |mesh.jpg| image:: ../generated_images/enthought_mayavi_mlab_mesh.jpg :width: 150 .. |barchart.jpg| image:: ../generated_images/enthought_mayavi_mlab_barchart.jpg :width: 150 .. |contour3d.jpg| image:: ../generated_images/enthought_mayavi_mlab_contour3d.jpg :width: 150 .. |quiver3d.jpg| image:: ../generated_images/enthought_mayavi_mlab_quiver3d.jpg :width: 150 .. |flow.jpg| image:: ../generated_images/enthought_mayavi_mlab_flow.jpg :width: 150 Advanced mlab examples ----------------------- .. toctree:: :hidden: example_julia_set.rst example_boy.rst example_bunny.rst example_dragon.rst example_lucy.rst example_custom_colormap.rst example_surface_from_irregular_data.rst example_spherical_harmonics.rst example_lorenz.rst example_canyon.rst example_julia_set_decimation.rst example_simple_structured_grid.rst example_atomic_orbital.rst example_tvtk_in_mayavi.rst example_chemistry.rst example_wigner.rst example_canyon_decimation.rst example_plotting_many_lines.rst example_magnetic_field_lines.rst example_mri.rst example_protein.rst example_flight_graph.rst .. |0000| image:: ../generated_images/example_julia_set.jpg :width: 150 .. |0001| image:: ../generated_images/example_boy.jpg :width: 150 .. |0002| raw:: html
.. |0003| raw:: html
.. |0004| raw:: html
.. |0005| image:: ../generated_images/example_custom_colormap.jpg :width: 150 .. |0006| image:: ../generated_images/example_surface_from_irregular_data.jpg :width: 150 .. |0007| image:: ../generated_images/example_spherical_harmonics.jpg :width: 150 .. |0008| image:: ../generated_images/example_lorenz.jpg :width: 150 .. |0009| image:: ../generated_images/example_canyon.jpg :width: 150 .. |0010| image:: ../generated_images/example_julia_set_decimation.jpg :width: 150 .. |0011| image:: ../generated_images/example_simple_structured_grid.jpg :width: 150 .. |0012| image:: ../generated_images/example_atomic_orbital.jpg :width: 150 .. |0013| image:: ../generated_images/example_tvtk_in_mayavi.jpg :width: 150 .. |0014| image:: ../generated_images/example_chemistry.jpg :width: 150 .. |0015| image:: ../generated_images/example_wigner.jpg :width: 150 .. |0016| image:: ../generated_images/example_canyon_decimation.jpg :width: 150 .. |0017| image:: ../generated_images/example_plotting_many_lines.jpg :width: 150 .. |0018| image:: ../generated_images/example_magnetic_field_lines.jpg :width: 150 .. |0019| image:: ../generated_images/example_mri.jpg :width: 150 .. |0020| image:: ../generated_images/example_protein.jpg :width: 150 .. |0021| image:: ../generated_images/example_flight_graph.jpg :width: 150 ======= ============================================= ======= ============================================= |0000| :ref:`example_julia_set` An example showing the Julia set displayed as a z-warped surface. |0001| :ref:`example_boy` A script to generate the Mayavi logo: a Boy surface. |0002| :ref:`example_bunny` Viewing Stanford 3D Scanning Repository bunny model |0003| :ref:`example_dragon` Viewing Stanford 3D Scanning Repository dragon model |0004| :ref:`example_lucy` Viewing Stanford 3D Scanning Repository lucy model |0005| :ref:`example_custom_colormap` An example showing how a custom colormap (or look up table) can be used for a given object. |0006| :ref:`example_surface_from_irregular_data` An example which shows how to plot a surface from data acquired irregularly. |0007| :ref:`example_spherical_harmonics` Plot spherical harmonics on the surface of the sphere, as well as a 3D polar plot. |0008| :ref:`example_lorenz` An example displaying the trajectories for the Lorenz system of equations along with the z-nullcline. |0009| :ref:`example_canyon` Retrieve radar data from the NASA and plot a view of the Grand Canyon landscape. |0010| :ref:`example_julia_set_decimation` The Julia set, but with a decimated mesh: unecessary triangles due to the initial grid and not matching the geometry of the Julia set are removed. |0011| :ref:`example_simple_structured_grid` An example creating a structured grid data set from numpy arrays using TVTK and visualizing it using mlab. |0012| :ref:`example_atomic_orbital` An example showing the norm and phase of an atomic orbital: isosurfaces of the norm, with colors displaying the phase. |0013| :ref:`example_tvtk_in_mayavi` An example of pure TVTK programming to build TVTK objects, which are then added to a Mayavi scene. |0014| :ref:`example_chemistry` In this example, we display the H2O molecule, and use volume rendering to display the electron localization function. |0015| :ref:`example_wigner` An example in which 3 functions of x and y are displayed with a surf plot, while the z scaling is kept constant, to allow comparison between them. |0016| :ref:`example_canyon_decimation` Use the greedy-terrain-decimator to display a decimated terrain view. |0017| :ref:`example_plotting_many_lines` This examples shows how many lines can be grouped together in a single object, for convenience and efficiency. |0018| :ref:`example_magnetic_field_lines` This example uses the streamline module to display field lines of a magnetic dipole (a current loop). |0019| :ref:`example_mri` Viewing MRI data with cut plane and iso surface. |0020| :ref:`example_protein` Visualize a protein graph structure downloaded from the protein database in standard pdb format. |0021| :ref:`example_flight_graph` An example showing a graph display between cities positionned on the Earth surface. ======= ============================================= Interactive examples -------------------------------------------------- Examples showing how to use the interactive features of Mayavi, either via the mayavi2 application, or via specially-crafted dialogs and applications. .. toctree:: :hidden: example_mlab_visual.rst example_mlab_traits_ui.rst example_wx_embedding.rst example_multiple_engines.rst example_multiple_mlab_scene_models.rst example_superquad_with_gui.rst example_mlab_interactive_dialog.rst example_wx_mayavi_embed_in_notebook.rst example_subclassing_mayavi_application.rst example_mayavi_traits_ui.rst example_compute_in_thread.rst example_qt_embedding.rst example_adjust_cropping_extents.rst example_poll_file.rst example_lorenz_ui.rst example_volume_slicer.rst example_coil_design_application.rst example_volume_slicer_advanced.rst .. A comment to split paragraphs .. |0100| image:: ../images/example_mlab_visual.jpg :width: 150 .. |0101| raw:: html
.. |0102| raw:: html
.. |0103| raw:: html
.. |0104| raw:: html
.. |0105| raw:: html
.. |0106| image:: ../images/example_mlab_interactive_dialog.jpg :width: 150 .. |0107| raw:: html
.. |0108| raw:: html
.. |0109| raw:: html
.. |0110| raw:: html
.. |0111| raw:: html
.. |0112| raw:: html
.. |0113| raw:: html
.. |0114| raw:: html
.. |0115| raw:: html
.. |0116| raw:: html
.. |0117| raw:: html
======= ============================================= ======= ============================================= |0100| :ref:`example_mlab_visual` A very simple example to show how you can use TVTK's visual module with mlab and create simple animations. |0101| :ref:`example_mlab_traits_ui` A simple example of how to use mayavi.mlab inside a traits UI dialog. |0102| :ref:`example_wx_embedding` This example shows to embed a Mayavi view in a wx frame. |0103| :ref:`example_multiple_engines` An example to show how you can have multiple engines in one application. |0104| :ref:`example_multiple_mlab_scene_models` Example showing a dialog with multiple embedded scenes. |0105| :ref:`example_superquad_with_gui` This example uses MayaVi to show the evolution of a superquadric (http://en.w ikipedia.org/wiki/Superquadrics), which are ellipsoidal surfaces parametrised by two parameters,lpha and eta. The equations that are used to determine the superquadric are (in spherical-polar coordinates): |0106| :ref:`example_mlab_interactive_dialog` An example of how to modify the data visualized via an interactive dialog. |0107| :ref:`example_wx_mayavi_embed_in_notebook` This example show how to embedded Mayavi in a wx notebook. |0108| :ref:`example_subclassing_mayavi_application` This script demonstrates how one can script the Mayavi application by subclassing the application, create a new scene and create a few simple modules. |0109| :ref:`example_mayavi_traits_ui` An example of how to create a UI similar to the complete Mayavi application inside a Traits UI view. |0110| :ref:`example_compute_in_thread` This script demonstrates how one can do a computation in another thread and update the mayavi pipeline. It also shows how to create a numpy array data and visualize it as image data using a few modules. |0111| :ref:`example_qt_embedding` This example demonstrates using Mayavi as a component of a large Qt application. |0112| :ref:`example_adjust_cropping_extents` A custom dialog to adjust the parameters of a GeometryFilter to crop data points. |0113| :ref:`example_poll_file` A simple script that polls a data file for changes and then updates the mayavi pipeline automatically. |0114| :ref:`example_lorenz_ui` This example displays the trajectories for the Lorenz system of equations using mlab along with the z-nullcline. It provides a simple UI where a user can change the parameters and the system of equations on the fly. This primarily demonstrates how one can build powerful tools with a UI using Traits and Mayavi. |0115| :ref:`example_volume_slicer` Example of an elaborate dialog showing a multiple views on the same data, with 3 cuts synchronized. |0116| :ref:`example_coil_design_application` An full-blown application demoing a domain-specific usecase with Mayavi: interactive design of coils. |0117| :ref:`example_volume_slicer_advanced` An efficient implementation of the triple-plane view showing 3 cut planes on volumetric data, and side views showing each cut, with a cursor to move the other cuts. ======= ============================================= Advanced visualization examples -------------------------------------------------- Data visualization using the core Mayavi API, object-oriented, and with more fine control than mlab. .. toctree:: :hidden: example_polydata.rst example_offscreen.rst example_surf_regular_mlab.rst example_glyph.rst example_structured_points2d.rst example_contour_contour.rst example_scatter_plot.rst example_streamline.rst example_numeric_source.rst example_structured_points3d.rst example_image_cursor_filter.rst example_contour.rst example_probe_filter.rst example_unstructured_grid.rst example_structured_grid.rst example_tvtk_segmentation.rst example_datasets.rst example_delaunay_graph.rst example_mlab_3D_to_2D.rst example_magnetic_field.rst .. A comment to split paragraphs * :ref:`example_polydata` An example of how to generate a polydata dataset using numpy arrays. * :ref:`example_offscreen` A simple example of how you can use Mayavi without using Envisage or the Mayavi Envisage application and do off screen rendering. * :ref:`example_surf_regular_mlab` Shows how to view data created by `tvtk.tools.mlab` with mayavi2. * :ref:`example_glyph` This script demonstrates using the Mayavi core API to add a VectorCutPlane, split the pipeline using a MaskPoints filter and then view the filtered data with the Glyph module. * :ref:`example_structured_points2d` An example of how to generate a 2D structured points dataset using numpy arrays. Also shown is a way to visualize this data with the mayavi2 application. * :ref:`example_contour_contour` This example shows how you can produce contours on an IsoSurface. * :ref:`example_scatter_plot` An example of plotting scatter points with Mayavi's core API. * :ref:`example_streamline` This script demonstrates how one can script Mayavi's core API to display streamlines and an iso surface. * :ref:`example_numeric_source` This script demonstrates how to create a numpy array data and visualize it as image data using a few modules. * :ref:`example_structured_points3d` An example of how to generate a 3D structured points dataset using numpy arrays. Also shown is a way to visualize this data with the mayavi2 application. * :ref:`example_image_cursor_filter` Excample using the UserDefined filter to paint a cross-shaped cursor on data, in order to point out a special position. * :ref:`example_contour` This script demonstrates how one can script Mayavi and use its contour related modules. * :ref:`example_probe_filter` Using the probe filter to visualize a scalar field along an arbitrary surface. * :ref:`example_unstructured_grid` A MayaVi example of how to generate an unstructured grid dataset using numpy arrays. Also shown is a way to visualize this data with mayavi2. The script can be run like so: * :ref:`example_structured_grid` An example of how to generate a structured grid dataset using numpy arrays. Also shown is a way to visualize this data with the mayavi2 application. * :ref:`example_tvtk_segmentation` Using VTK to assemble a pipeline for segmenting MRI images. This example shows how to insert well-controled custom VTK filters in Mayavi. * :ref:`example_datasets` A Mayavi example to show the different data sets. See :ref:`data-structures-used-by-mayavi` for a discussion. * :ref:`example_delaunay_graph` An example illustrating graph manipulation and display with Mayavi and NetworkX. * :ref:`example_mlab_3D_to_2D` A script to calculate the projection of 3D world coordinates to 2D display coordinates (pixel coordinates) for a given scene. * :ref:`example_magnetic_field` An example mixing numerical caculation and 3D visualization of the magnetic field created by an arbitrary number of current loops. Data interaction examples -------------------------------------------------- Examples showing how you can query and interact with the data. .. toctree:: :hidden: example_pick_on_surface.rst example_select_red_balls.rst .. A comment to split paragraphs * :ref:`example_pick_on_surface` Example showing how to pick data on a surface, going all the way back to the index in the numpy arrays. * :ref:`example_select_red_balls` This example shows how to use a callback to select a red ball amongst white balls. Misc examples -------------------------------------------------- .. toctree:: :hidden: example_standalone.rst example_zzz_reader.rst example_nongui.rst example_user_mayavi.rst .. A comment to split paragraphs * :ref:`example_standalone` A simple example of how you can use Mayavi without using Envisage or the Mayavi Envisage application. * :ref:`example_zzz_reader` This is a simple example that shows how to create a reader factory and register that reader with mayavi. * :ref:`example_nongui` This script demonstrates how one can use the Mayavi application framework without displaying Mayavi's UI. * :ref:`example_user_mayavi` Sample Mayavi customization file. mayavi-4.5.0/docs/source/mayavi/auto/flight_graph.py0000644000076500000240000001450112747716313023124 0ustar prabhustaff00000000000000""" An example showing a graph display between cities positionned on the Earth surface. This graph displays the longest fligh routes operated by Boing 777. The two main interests of this example are that it shows how to build a graph of arbitrary connectivity, and that it shows how to position data on the surface of the Earth. The graph is created by first building a scalar scatter dataset with the mlab.points3d command, and adding line information to it. One of the difficulties is that the lines are specified using the indexing number of the points, so we must 'massage' our data when loading it. A similar technique to plot the graph is done in the :ref:`example_protein`. Another example of graph plotting, showing a different technique to plot the graph, can be seen on :ref:`example_delaunay_graph`. To simplify things we do not plot the connection on the surface of the Earth, but as straight lines going throught the Earth. As a result must use transparency to show the connection. Data source: http://www.777fleetpage.com/777fleetpage3.htm """ ############################################################################### # The data. This could be loaded from a file, or scraped from a website routes_data = """ Bombay,Atlanta Johannesburg,Atlanta Dubai,Los Angeles Dubai,Houston Dubai,San Francisco New York,Hong Kong Newark,Hong Kong Doha,Houston Toronto,Hong Kong Bombay,Newark Bombay,New York Vancouver,Hong Kong Dubai,Sao Paulo Los Angeles,Sydney Chicago,Delhi """ cities_data = """ Toronto,-79.38,43.65 Chicago,-87.68,41.84 Houston,-95.39,29.77 New York,-73.94,40.67 Vancouver,-123.13,49.28 Los Angeles,-118.41,34.11 San Francisco,-122.45,37.77 Atlanta,-84.42,33.76 Dubai,55.33,25.27 Sydney,151.21,-33.87 Hong Kong,114.19,22.38 Bombay,72.82,18.96 Delhi,77.21,28.67 Newark,-82.43,40.04 Johannesburg,28.04,-26.19 Doha,51.53,25.29 Sao Paulo,-46.63,-23.53 """ ############################################################################### # Load the data, and put it in data structures we can use import csv routes_table = [i for i in csv.reader(routes_data.split('\n')[1:-1])] # Build a dictionnary returning GPS coordinates for each city cities_coord = dict() for line in list(csv.reader(cities_data.split('\n')))[1:-1]: name, long_, lat = line cities_coord[name] = (float(long_), float(lat)) # Store all the coordinates of connected cities in a list also keep # track of which city corresponds to a given index in the list. The # connectivity information is specified as connecting the i-th point # with the j-th. cities = dict() coords = list() connections = list() for city1, city2 in routes_table[1:-1]: if not city1 in cities: cities[city1] = len(coords) coords.append(cities_coord[city1]) if not city2 in cities: cities[city2] = len(coords) coords.append(cities_coord[city2]) connections.append((cities[city1], cities[city2])) ############################################################################### from mayavi import mlab mlab.figure(1, bgcolor=(0.48, 0.48, 0.48), fgcolor=(0, 0, 0), size=(400, 400)) mlab.clf() ############################################################################### # Display points at city positions import numpy as np coords = np.array(coords) # First we have to convert latitude/longitude information to 3D # positioning. lat, long = coords.T * np.pi / 180 x = np.cos(long) * np.cos(lat) y = np.cos(long) * np.sin(lat) z = np.sin(long) points = mlab.points3d(x, y, z, scale_mode='none', scale_factor=0.03, color=(0, 0, 1)) ############################################################################### # Display connections between cities connections = np.array(connections) # We add lines between the points that we have previously created by # directly modifying the VTK dataset. points.mlab_source.dataset.lines = connections points.mlab_source.reset() # To represent the lines, we use the surface module. Using a wireframe # representation allows to control the line-width. mlab.pipeline.surface(points, color=(1, 1, 1), representation='wireframe', line_width=4, name='Connections') ############################################################################### # Display city names for city, index in cities.items(): label = mlab.text(x[index], y[index], city, z=z[index], width=0.016 * len(city), name=city) label.property.shadow = True ############################################################################### # Display continents outline, using the VTK Builtin surface 'Earth' from mayavi.sources.builtin_surface import BuiltinSurface continents_src = BuiltinSurface(source='earth', name='Continents') # The on_ratio of the Earth source controls the level of detail of the # continents outline. continents_src.data_source.on_ratio = 2 continents = mlab.pipeline.surface(continents_src, color=(0, 0, 0)) ############################################################################### # Display a semi-transparent sphere, for the surface of the Earth # We use a sphere Glyph, throught the points3d mlab function, rather than # building the mesh ourselves, because it gives a better transparent # rendering. sphere = mlab.points3d(0, 0, 0, scale_mode='none', scale_factor=2, color=(0.67, 0.77, 0.93), resolution=50, opacity=0.7, name='Earth') # These parameters, as well as the color, where tweaked through the GUI, # with the record mode to produce lines of code usable in a script. sphere.actor.property.specular = 0.45 sphere.actor.property.specular_power = 5 # Backface culling is necessary for more a beautiful transparent # rendering. sphere.actor.property.backface_culling = True ############################################################################### # Plot the equator and the tropiques theta = np.linspace(0, 2 * np.pi, 100) for angle in (- np.pi / 6, 0, np.pi / 6): x = np.cos(theta) * np.cos(angle) y = np.sin(theta) * np.cos(angle) z = np.ones_like(theta) * np.sin(angle) mlab.plot3d(x, y, z, color=(1, 1, 1), opacity=0.2, tube_radius=None) mlab.view(63.4, 73.8, 4, [-0.05, 0, 0]) mlab.show() mayavi-4.5.0/docs/source/mayavi/auto/glyph.py0000644000076500000240000000351412747716313021613 0ustar prabhustaff00000000000000#!/usr/bin/env python """ This script demonstrates using the Mayavi core API to add a VectorCutPlane, split the pipeline using a MaskPoints filter and then view the filtered data with the Glyph module. """ # Author: Prabhu Ramachandran # Copyright (c) 2005-2008, Enthought, Inc. # License: BSD Style. # Standard library imports from os.path import join, abspath, dirname # Enthought library imports from mayavi.scripts import mayavi2 from mayavi.sources.vtk_xml_file_reader import VTKXMLFileReader from mayavi.modules.outline import Outline from mayavi.modules.glyph import Glyph from mayavi.modules.vector_cut_plane import VectorCutPlane from mayavi.filters.mask_points import MaskPoints @mayavi2.standalone def glyph(): """The script itself. We needn't have defined a function but having a function makes this more reusable. """ # 'mayavi' is always defined on the interpreter. # Create a new VTK scene. mayavi.new_scene() # Read a VTK (old style) data file. r = VTKXMLFileReader() r.initialize(join(mayavi2.get_data_dir(dirname(abspath(__file__))), 'fire_ug.vtu')) mayavi.add_source(r) # Create an outline and a vector cut plane. mayavi.add_module(Outline()) v = VectorCutPlane() mayavi.add_module(v) v.glyph.color_mode = 'color_by_scalar' # Now mask the points and show glyphs (we could also use # Vectors but glyphs are a bit more generic) m = MaskPoints() m.filter.set(on_ratio=10, random_mode=True) mayavi.add_filter(m) g = Glyph() mayavi.add_module(g) # Note that this adds the module to the filtered output. g.glyph.scale_mode = 'scale_by_vector' # Use arrows to view the scalars. gs = g.glyph.glyph_source gs.glyph_source = gs.glyph_dict['arrow_source'] if __name__ == '__main__': glyph() mayavi-4.5.0/docs/source/mayavi/auto/image_cursor_filter.py0000644000076500000240000000627612747716313024524 0ustar prabhustaff00000000000000""" Excample using the UserDefined filter to paint a cross-shaped cursor on data, in order to point out a special position. We use the UserDefined filter `ImageCursor3D` to create the cursor. A Gaussian data field is painted with the cursor, and then visualized using the ImagePlaneWIdget module. ImageCursor3D is one example among many of the use of the UserDefined, which allows to use TVTK filters that are not. See :ref:`using_userdefined_filter` for more details. Also, other examples using the UserDefined filter are provided in :ref:`example_mri` and :ref:`example_tvtk_segmentation`. Selecting the UserDefined filter in the Mayavi pipeline is a convenient way to look for additional filters. This pops up a dialog called `TVTK class chooser`, with a `Search` field that allows to search for desired actions or properties. For example, searching for `cursor` returns several filters, among which Cursor3D and ImageCursor3D. As a rule of thumb, the name of TVTK filters acting on TVTK ImageData dataset starts with `Image` (ImageData is the type of VTK data set created by e.g. mlab.pipeline.scalar_field. See :ref:`data-structures-used-by-mayavi` for more details about VTK datasets). In the dialog used to interactively add the UserDefined filet, we can therefore select `ImageCursor3D`. The documentation of the filter is displayed when selecting its name within the `Class name` field of the dialog. """ # Authors: Emmanuelle Gouillart # and Gael Varoquaux # Copyright (c) 2009, Enthought, Inc. # License: BSD Style. from mayavi import mlab import numpy as np # Define Gaussian data field x, y, z = np.ogrid[0:1:40j, 0:1:40j, 0:1:40j] sig = 0.5 center = 0.5 g = np.exp(-((x-center)**2 + (y-center)**2 + (z-center)**2)/(2*sig**2)) ################################################################################ mlab.figure(fgcolor=(0, 0, 0), bgcolor=(1, 1, 1)) # Define the cursor s = mlab.pipeline.scalar_field(g) cursor = mlab.pipeline.user_defined(s, filter='ImageCursor3D') # The TVTK filter used by Mayavi is accessible as the '.filter' # attribute of the Mayavi filtered returned by user_defined. # We can set the graphical properties of the cross via attributes of # cursor.filter, and not of cursor itself. Here cursor is a Mayavi filter, # that is an object that inserts in the Mayavi pipeline, whereas # cursor.filter is the TVTK filter that actually does the work. # Put the cursor at the center of the field volume (default is (0, 0, 0)) cursor.filter.cursor_position = np.array([20, 20, 20]) # Define the value of the cursor (default is 255) so that there is # enough contrast between the cursor and the data values in the neighbourhood # of the cursor. The cursor value is within the data value range so that # the contrast of the data is not altered. cursor.filter.cursor_value = 0 # Define the radius of the cross (the extent of the cross is 2xcursor_radius) cursor.filter.cursor_radius = 10 # Display data and cursor using an image_plane_widget that intersects the # cursor. ipw = mlab.pipeline.image_plane_widget(cursor, plane_orientation='x_axes', slice_index=20) # View mlab.colorbar() mlab.view(15, 70, 100, [20, 20, 20]) mlab.show() mayavi-4.5.0/docs/source/mayavi/auto/julia_set.py0000644000076500000240000000150012747716313022440 0ustar prabhustaff00000000000000""" An example showing the Julia set displayed as a z-warped surface. The Julia set is a fractal (see http://en.wikipedia.org/wiki/Julia_set ). We display it here in a canyon-like view using mlab's surf function: :func:`mayavi.mlab.surf`. """ # Author: Gael Varoquaux # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. from mayavi import mlab import numpy as np # Calculate the Julia set on a grid x, y = np.ogrid[-1.5:0.5:500j, -1:1:500j] z = x + 1j * y julia = np.zeros(z.shape) for i in range(50): z = z ** 2 - 0.70176 - 0.3842j julia += 1 / float(2 + i) * (z * np.conj(z) > 4) # Display it mlab.figure(size=(400, 300)) mlab.surf(julia, colormap='gist_earth', warp_scale='auto', vmax=1.5) # A view into the "Canyon" mlab.view(65, 27, 322, [30., -13.7, 136]) mlab.show() mayavi-4.5.0/docs/source/mayavi/auto/julia_set_decimation.py0000644000076500000240000000446012747716313024644 0ustar prabhustaff00000000000000""" The Julia set, but with a decimated mesh: unecessary triangles due to the initial grid and not matching the geometry of the Julia set are removed. We first build the mesh, applying a warp_scalar filter to a array2d_source, to warp the Julia set along the z direction. Then when have to convert the rectangles in the mesh to triangles, in order to apply the decimate_pro filter. This filter does the decimation, and we can represent the result using surface modules. The triangle-generation filter generates warnings: some polygons are degenerate, as the grid has subdivided flat parts of the Julia set. We have shown in white the decimated mesh, and in black the non-decimated one. The view is zoom to the center of the Julia set. If you turn of the wireframes and zoom out, you can appreciate the quality of the decimation. In the specific case of decimating a surface warped from 2D data, it is more efficient to use the greedy-terrain-decimator, see the :ref:`example_canyon_decimation`. """ # Author: Gael Varoquaux # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. from mayavi import mlab import numpy as np # Calculate the Julia set on a grid x, y = np.ogrid[-1.5:0.5:500j, -1:1:500j] z = x + 1j * y julia = np.zeros(z.shape) for i in range(50): z = z ** 2 - 0.70176 - 0.3842j julia += 1 / float(2 + i) * (z * np.conj(z) > 4) mlab.figure(size=(400, 300)) # Create the mesh mesh = mlab.pipeline.warp_scalar(mlab.pipeline.array2d_source(julia), warp_scale=100) # The decimate_pro filter works only on triangles. We need to apply the # triangle_filter before applying decimate_pro. dec = mlab.pipeline.decimate_pro(mlab.pipeline.triangle_filter(mesh)) # Set a very low feature_angle, so that the decimate_pro detects dec.filter.feature_angle = 1 dec.filter.target_reduction = 0.5 # We display the lines of decimated mesh in white mlab.pipeline.surface(dec, representation='wireframe', line_width=3, color=(1, 1, 1)) # The decimated mesh itself. mlab.pipeline.surface(dec, colormap='gist_earth', vmin=-0.1, vmax=0.4) # The lines of the non-decimated mesh, in black, for comparisation. mlab.pipeline.surface(mesh, representation='wireframe', color=(0, 0, 0)) mlab.view(-66, 25, 9.7, [-5.8, -54.5, 18.4]) mlab.show() mayavi-4.5.0/docs/source/mayavi/auto/lorenz.py0000644000076500000240000000342712747716313022004 0ustar prabhustaff00000000000000""" An example displaying the trajectories for the Lorenz system of equations along with the z-nullcline. The vector field of the Lorenz system flow is integrated to display trajectories using mlab's flow function: :func:`mayavi.mlab.flow`. The z-nullcline is plotted by extracting the z component of the vector field data source with the ExtractVectorComponent filter, and applying an IsoSurface module on this scalar component. """ # Author: Prabhu Ramachandran # Copyright (c) 2008-2009, Enthought, Inc. # License: BSD Style. import numpy from mayavi import mlab def lorenz(x, y, z, s=10., r=28., b=8. / 3.): """The Lorenz system.""" u = s * (y - x) v = r * x - y - x * z w = x * y - b * z return u, v, w # Sample the space in an interesting region. x, y, z = numpy.mgrid[-50:50:100j, -50:50:100j, -10:60:70j] u, v, w = lorenz(x, y, z) fig = mlab.figure(size=(400, 300), bgcolor=(0, 0, 0)) # Plot the flow of trajectories with suitable parameters. f = mlab.flow(x, y, z, u, v, w, line_width=3, colormap='Paired') f.module_manager.scalar_lut_manager.reverse_lut = True f.stream_tracer.integration_direction = 'both' f.stream_tracer.maximum_propagation = 200 # Uncomment the following line if you want to hide the seed: #f.seed.widget.enabled = False # Extract the z-velocity from the vectors and plot the 0 level set # hence producing the z-nullcline. src = f.mlab_source.m_data e = mlab.pipeline.extract_vector_components(src) e.component = 'z-component' zc = mlab.pipeline.iso_surface(e, opacity=0.5, contours=[0, ], color=(0.6, 1, 0.2)) # When using transparency, hiding 'backface' triangles often gives better # results zc.actor.property.backface_culling = True # A nice view of the plot. mlab.view(140, 120, 113, [0.65, 1.5, 27]) mlab.show() mayavi-4.5.0/docs/source/mayavi/auto/lorenz_ui.py0000644000076500000240000001212712747716313022476 0ustar prabhustaff00000000000000""" This example displays the trajectories for the Lorenz system of equations using mlab along with the z-nullcline. It provides a simple UI where a user can change the parameters and the system of equations on the fly. This primarily demonstrates how one can build powerful tools with a UI using Traits and Mayavi. For explanations and more examples of interactive application building with Mayavi, please refer to section :ref:`builing_applications`. """ # Author: Prabhu Ramachandran # Copyright (c) 2008-2009, Enthought, Inc. # License: BSD Style. import numpy as np import scipy from traits.api import HasTraits, Range, Instance, \ on_trait_change, Array, Tuple, Str from traitsui.api import View, Item, HSplit, Group from mayavi import mlab from mayavi.core.ui.api import MayaviScene, MlabSceneModel, \ SceneEditor ################################################################################ # `Lorenz` class. ################################################################################ class Lorenz(HasTraits): # The parameters for the Lorenz system, defaults to the standard ones. s = Range(0.0, 20.0, 10.0, desc='the parameter s', enter_set=True, auto_set=False) r = Range(0.0, 50.0, 28.0, desc='the parameter r', enter_set=True, auto_set=False) b = Range(0.0, 10.0, 8./3., desc='the parameter b', enter_set=True, auto_set=False) # These expressions are evaluated to compute the right hand sides of # the ODE. Defaults to the Lorenz system. u = Str('s*(y-x)', desc='the x component of the velocity', auto_set=False, enter_set=True) v = Str('r*x - y - x*z', desc='the y component of the velocity', auto_set=False, enter_set=True) w = Str('x*y - b*z', desc='the z component of the velocity', auto_set=False, enter_set=True) # Tuple of x, y, z arrays where the field is sampled. points = Tuple(Array, Array, Array) # The mayavi(mlab) scene. scene = Instance(MlabSceneModel, args=()) # The "flow" which is a Mayavi streamline module. flow = Instance(HasTraits) ######################################## # The UI view to show the user. view = View(HSplit( Group( Item('scene', editor=SceneEditor(scene_class=MayaviScene), height=500, width=500, show_label=False)), Group( Item('s'), Item('r'), Item('b'), Item('u'), Item('v'), Item('w')), ), resizable=True ) ###################################################################### # Trait handlers. ###################################################################### # Note that in the `on_trait_change` call below we listen for the # `scene.activated` trait. This conveniently ensures that the flow # is generated as soon as the mlab `scene` is activated (which # happens when the configure/edit_traits method is called). This # eliminates the need to manually call the `update_flow` method etc. @on_trait_change('s, r, b, scene.activated') def update_flow(self): x, y, z = self.points u, v, w = self.get_uvw() self.flow.mlab_source.set(u=u, v=v, w=w) @on_trait_change('u') def update_u(self): self.flow.mlab_source.set(u=self.get_vel('u')) @on_trait_change('v') def update_v(self): self.flow.mlab_source.set(v=self.get_vel('v')) @on_trait_change('w') def update_w(self): self.flow.mlab_source.set(w=self.get_vel('w')) def get_uvw(self): return self.get_vel('u'), self.get_vel('v'), self.get_vel('w') def get_vel(self, comp): """This function basically evaluates the user specified system of equations using scipy. """ func_str = getattr(self, comp) try: g = scipy.__dict__ x, y, z = self.points s, r, b = self.s, self.r, self.b val = eval(func_str, g, {'x': x, 'y': y, 'z': z, 's':s, 'r':r, 'b': b}) except: # Mistake, so return the original value. val = getattr(self.flow.mlab_source, comp) return val ###################################################################### # Private interface. ###################################################################### def _points_default(self): x, y, z = np.mgrid[-50:50:100j,-50:50:100j,-10:60:70j] return x, y, z def _flow_default(self): x, y, z = self.points u, v, w = self.get_uvw() f = self.scene.mlab.flow(x, y, z, u, v, w) f.stream_tracer.integration_direction = 'both' f.stream_tracer.maximum_propagation = 200 src = f.mlab_source.m_data o = mlab.outline() mlab.view(120, 60, 150) return f if __name__ == '__main__': # Instantiate the class and configure its traits. lor = Lorenz() lor.configure_traits() mayavi-4.5.0/docs/source/mayavi/auto/lucy.py0000644000076500000240000000206112566026643021437 0ustar prabhustaff00000000000000""" Viewing Stanford 3D Scanning Repository lucy model """ # Copyright (c) 2014-2015, Enthought, Inc. # Standard library imports import os from os.path import join # Enthought library imports from mayavi import mlab ### Download the lucy data, if not already on disk ############################ if not os.path.exists('lucy.tar.gz'): # Download the data try: from urllib import urlopen except ImportError: from urllib.request import urlopen print("Downloading lucy model, Please Wait (307MB)") opener = urlopen( 'http://graphics.stanford.edu/data/3Dscanrep/lucy.tar.gz') open('lucy.tar.gz', 'wb').write(opener.read()) # Extract the data import tarfile lucy_tar_file = tarfile.open('lucy.tar.gz') try: os.mkdir('lucy_data') except: pass lucy_tar_file.extractall('lucy_data') lucy_tar_file.close() # Path to the lucy ply file lucy_ply_file = join('lucy_data', 'lucy.ply') # Render the lucy ply file mlab.pipeline.surface(mlab.pipeline.open(lucy_ply_file)) mlab.show() import shutil shutil.rmtree('lucy_data') mayavi-4.5.0/docs/source/mayavi/auto/magnetic_field.py0000644000076500000240000001713612747716313023427 0ustar prabhustaff00000000000000""" An example mixing numerical caculation and 3D visualization of the magnetic field created by an arbitrary number of current loops. The goal of this example is to show how Mayavi can be used with scipy to debug and understand physics and electromagnetics computation. The field is caculated for an arbitrary number of current loops using the corresponding exact formula. The coils are plotted in 3D with a synthetic view of the magnetic_field. A VectorCutPlane is used as it enables good inspection of the magnetic field. This example originated from a real-life case of coil design in Python ( Atomic sources for long-time-of-flight interferometric inertial sensors, G. Varoquaux, http://tel.archives-ouvertes.fr/tel-00265714/, page 148). For another visualization of magnetic field, see the :ref:`example_magnetic_field_lines`. """ # Author: Gael Varoquaux # Copyright (c) 2009, Enthought, Inc. # License: BSD Style. import numpy as np from scipy import special from mayavi import mlab ############################################################################## # Function to caculate the Magnetic field generated by a current loop def base_vectors(n): """ Returns 3 orthognal base vectors, the first one colinear to n. Parameters ----------- n: ndarray, shape (3, ) A vector giving direction of the basis Returns ----------- n: ndarray, shape (3, ) The first vector of the basis l: ndarray, shape (3, ) The second vector of the basis m: ndarray, shape (3, ) The first vector of the basis """ # normalize n n = n / (n**2).sum(axis=-1) # choose two vectors perpendicular to n # choice is arbitrary since the coil is symetric about n if np.abs(n[0])==1 : l = np.r_[n[2], 0, -n[0]] else: l = np.r_[0, n[2], -n[1]] l = l / (l**2).sum(axis=-1) m = np.cross(n, l) return n, l, m def magnetic_field(r, n, r0, R): """ Returns the magnetic field from an arbitrary current loop calculated from eqns (1) and (2) in Phys Rev A Vol. 35, N 4, pp. 1535-1546; 1987. Arguments ---------- n: ndarray, shape (3, ) The normal vector to the plane of the loop at the center, current is oriented by the right-hand-rule. r: ndarray, shape (m, 3) A position vector where the magnetic field is evaluated: [x1 y2 z3 ; x2 y2 z2 ; ... ] r is in units of d r0: ndarray, shape (3, ) The location of the center of the loop in units of d: [x y z] R: float The radius of the current loop Returns -------- B: ndarray, shape (m, 3) a vector for the B field at each position specified in r in inverse units of (mu I) / (2 pi d) for I in amps and d in meters and mu = 4 pi * 10^-7 we get Tesla """ ### Translate the coordinates in the coil's frame n, l, m = base_vectors(n) # transformation matrix coil frame to lab frame trans = np.vstack((l, m, n)) # transformation matrix to lab frame to coil frame inv_trans = np.linalg.inv(trans) # point location from center of coil r = r - r0 # transform vector to coil frame r = np.dot(r, inv_trans) #### calculate field # express the coordinates in polar form x = r[:, 0] y = r[:, 1] z = r[:, 2] rho = np.sqrt(x**2 + y**2) theta = np.arctan(x/y) theta[y==0] = 0 E = special.ellipe((4 * R * rho)/( (R + rho)**2 + z**2)) K = special.ellipk((4 * R * rho)/( (R + rho)**2 + z**2)) Bz = 1/np.sqrt((R + rho)**2 + z**2) * ( K + E * (R**2 - rho**2 - z**2)/((R - rho)**2 + z**2) ) Brho = z/(rho*np.sqrt((R + rho)**2 + z**2)) * ( -K + E * (R**2 + rho**2 + z**2)/((R - rho)**2 + z**2) ) # On the axis of the coil we get a divided by zero here. This returns a # NaN, where the field is actually zero : Brho[np.isnan(Brho)] = 0 Brho[np.isinf(Brho)] = 0 Bz[np.isnan(Bz)] = 0 Bz[np.isinf(Bz)] = 0 B = np.c_[np.cos(theta)*Brho, np.sin(theta)*Brho, Bz ] # Rotate the field back in the lab's frame B = np.dot(B, trans) return B def display_coil(n, r0, R, half=False): """ Display a coils in the 3D view. If half is True, display only one half of the coil. """ n, l, m = base_vectors(n) theta = np.linspace(0, (2-half)*np.pi, 30) theta = theta[..., np.newaxis] coil = np.atleast_1d(R)*(np.sin(theta)*l + np.cos(theta)*m) coil += r0 coil_x = coil[:, 0] coil_y = coil[:, 1] coil_z = coil[:, 2] mlab.plot3d(coil_x, coil_y, coil_z, tube_radius=0.01, name='Coil %i' % display_coil.num, color=(0, 0, 0)) display_coil.num += 1 return coil_x, coil_y, coil_z display_coil.num = 0 ############################################################################## # The grid of points on which we want to evaluate the field X, Y, Z = np.mgrid[-0.15:0.15:31j, -0.15:0.15:31j, -0.15:0.15:31j] # Avoid rounding issues : f = 1e4 # this gives the precision we are interested by : X = np.round(X * f) / f Y = np.round(Y * f) / f Z = np.round(Z * f) / f r = np.c_[X.ravel(), Y.ravel(), Z.ravel()] ############################################################################## # The coil positions # The center of the coil r0 = np.r_[0, 0, 0.1] # The normal to the coils n = np.r_[0, 0, 1] # The radius R = 0.1 # Add the mirror image of this coils relatively to the xy plane : r0 = np.vstack((r0, -r0 )) R = np.r_[R, R] n = np.vstack((n, n)) # Helmoltz like configuration ############################################################################## # Calculate field # First initialize a container matrix for the field vector : B = np.empty_like(r) # Then loop through the different coils and sum the fields : for this_n, this_r0, this_R in zip(n, r0, R): this_n = np.array(this_n) this_r0 = np.array(this_r0) this_R = np.array(this_R) B += magnetic_field(r, this_n, this_r0, this_R) Bx = B[:, 0] By = B[:, 1] Bz = B[:, 2] Bx.shape = X.shape By.shape = Y.shape Bz.shape = Z.shape Bnorm = np.sqrt(Bx**2 + By**2 + Bz**2) ############################################################################## # Visualization # We threshold the data ourselves, as the threshold filter produce a # data structure inefficient with IsoSurface Bmax = 100 Bx[Bnorm > Bmax] = 0 By[Bnorm > Bmax] = 0 Bz[Bnorm > Bmax] = 0 Bnorm[Bnorm > Bmax] = Bmax mlab.figure(1, bgcolor=(1, 1, 1), fgcolor=(0.5, 0.5, 0.5), size=(480, 480)) mlab.clf() for this_n, this_r0, this_R in zip(n, r0, R): display_coil(this_n, this_r0, this_R) field = mlab.pipeline.vector_field(X, Y, Z, Bx, By, Bz, scalars=Bnorm, name='B field') vectors = mlab.pipeline.vectors(field, scale_factor=(X[1, 0, 0] - X[0, 0, 0]), ) # Mask random points, to have a lighter visualization. vectors.glyph.mask_input_points = True vectors.glyph.mask_points.on_ratio = 6 vcp = mlab.pipeline.vector_cut_plane(field) vcp.glyph.glyph.scale_factor=5*(X[1, 0, 0] - X[0, 0, 0]) # For prettier picture: #vcp.implicit_plane.widget.enabled = False iso = mlab.pipeline.iso_surface(field, contours=[0.1*Bmax, 0.4*Bmax], opacity=0.6, colormap='YlOrRd') # A trick to make transparency look better: cull the front face iso.actor.property.frontface_culling = True mlab.view(39, 74, 0.59, [.008, .0007, -.005]) mlab.show() mayavi-4.5.0/docs/source/mayavi/auto/magnetic_field_lines.py0000644000076500000240000000610312747716313024611 0ustar prabhustaff00000000000000""" This example uses the streamline module to display field lines of a magnetic dipole (a current loop). This example requires scipy. The magnetic field from an arbitrary current loop is calculated from eqns (1) and (2) in Phys Rev A Vol. 35, N 4, pp. 1535-1546; 1987. To get a prettier result, we use a fairly large grid to sample the field. As a consequence, we need to clear temporary arrays as soon as possible. For a more thorough example of magnetic field calculation and visualization with Mayavi and scipy, see :ref:`example_magnetic_field`. """ # Author: Gael Varoquaux # Copyright (c) 2007, Enthought, Inc. # License: BSD Style. import numpy as np from scipy import special #### Calculate the field #################################################### radius = 1 # Radius of the coils x, y, z = [e.astype(np.float32) for e in np.ogrid[-10:10:150j, -10:10:150j, -10:10:150j]] # express the coordinates in polar form rho = np.sqrt(x ** 2 + y ** 2) x_proj = x / rho y_proj = y / rho # Free memory early del x, y E = special.ellipe((4 * radius * rho) / ((radius + rho) ** 2 + z ** 2)) K = special.ellipk((4 * radius * rho) / ((radius + rho) ** 2 + z ** 2)) Bz = 1 / np.sqrt((radius + rho) ** 2 + z ** 2) * ( K + E * (radius ** 2 - rho ** 2 - z ** 2) / ((radius - rho) ** 2 + z ** 2) ) Brho = z / (rho * np.sqrt((radius + rho) ** 2 + z ** 2)) * ( - K + E * (radius ** 2 + rho ** 2 + z ** 2) / ((radius - rho) ** 2 + z ** 2) ) del E, K, z, rho # On the axis of the coil we get a divided by zero. This returns a # NaN, where the field is actually zero : Brho[np.isnan(Brho)] = 0 Bx, By = x_proj * Brho, y_proj * Brho del x_proj, y_proj, Brho #### Visualize the field #################################################### from mayavi import mlab fig = mlab.figure(1, size=(400, 400), bgcolor=(1, 1, 1), fgcolor=(0, 0, 0)) field = mlab.pipeline.vector_field(Bx, By, Bz) # Unfortunately, the above call makes a copy of the arrays, so we delete # this copy to free memory. del Bx, By, Bz magnitude = mlab.pipeline.extract_vector_norm(field) contours = mlab.pipeline.iso_surface(magnitude, contours=[0.01, 0.8, 3.8, ], transparent=True, opacity=0.4, colormap='YlGnBu', vmin=0, vmax=2) field_lines = mlab.pipeline.streamline(magnitude, seedtype='line', integration_direction='both', colormap='bone', vmin=0, vmax=1) # Tweak a bit the streamline. field_lines.stream_tracer.maximum_propagation = 100. field_lines.seed.widget.point1 = [69, 75.5, 75.5] field_lines.seed.widget.point2 = [82, 75.5, 75.5] field_lines.seed.widget.resolution = 50 field_lines.seed.widget.enabled = False mlab.view(42, 73, 104, [79, 75, 76]) mlab.show() mayavi-4.5.0/docs/source/mayavi/auto/mayavi_traits_ui.py0000644000076500000240000000667112747716313024050 0ustar prabhustaff00000000000000#!/usr/bin/env python """ An example of how to create a UI similar to the complete Mayavi application inside a Traits UI view. This does not use Envisage and provides a similar UI as seen in the full Mayavi application. This example uses `traitsUI `_ to create a dialog mimicking the mayavi2 application: a scene on the right, and on the left a pipeline tree view, and below it a panel to edit the currently-selected object. """ # Authors: Prabhu Ramachandran # Copyright (c) 2007, Enthought, Inc. # License: BSD Style. # Standard imports. from numpy import sqrt, sin, mgrid # Enthought imports. from traits.api import HasTraits, Instance, Property, Enum from traitsui.api import View, Item, HSplit, VSplit, InstanceEditor from tvtk.pyface.scene_editor import SceneEditor from mayavi.core.ui.engine_view import EngineView from mayavi.tools.mlab_scene_model import MlabSceneModel ###################################################################### class Mayavi(HasTraits): # The scene model. scene = Instance(MlabSceneModel, ()) # The mayavi engine view. engine_view = Instance(EngineView) # The current selection in the engine tree view. current_selection = Property ###################### view = View(HSplit(VSplit(Item(name='engine_view', style='custom', resizable=True, show_label=False ), Item(name='current_selection', editor=InstanceEditor(), enabled_when='current_selection is not None', style='custom', springy=True, show_label=False), ), Item(name='scene', editor=SceneEditor(), show_label=False, resizable=True, height=500, width=500), ), resizable=True, scrollable=True ) def __init__(self, **traits): HasTraits.__init__(self, **traits) self.engine_view = EngineView(engine=self.scene.engine) # Hook up the current_selection to change when the one in the engine # changes. This is probably unnecessary in Traits3 since you can show # the UI of a sub-object in T3. self.scene.engine.on_trait_change(self._selection_change, 'current_selection') self.generate_data_mayavi() def generate_data_mayavi(self): """Shows how you can generate data using mayavi instead of mlab.""" from mayavi.sources.api import ParametricSurface from mayavi.modules.api import Outline, Surface e = self.scene.engine s = ParametricSurface() e.add_source(s) e.add_module(Outline()) e.add_module(Surface()) def _selection_change(self, old, new): self.trait_property_changed('current_selection', old, new) def _get_current_selection(self): return self.scene.engine.current_selection if __name__ == '__main__': m = Mayavi() m.configure_traits() mayavi-4.5.0/docs/source/mayavi/auto/mlab_3D_to_2D.py0000644000076500000240000002552012747716313022761 0ustar prabhustaff00000000000000""" A script to calculate the projection of 3D world coordinates to 2D display coordinates (pixel coordinates) for a given scene. The 2D pixel locations of objects in the image plane are related to their 3D world coordinates by a series of linear transformations. The specific transformations fall under the group known as projective transformations. This set includes pure projectivities, affine transformations, perspective transformations, and euclidean transformations. In the case of mlab (and most other computer visualization software), we deal with only the perspective and euclidean cases. An overview of Projective space can be found here: http://en.wikipedia.org/wiki/Projective_space and a thorough treatment of projective geometry can be had in the book "Multiple View Geometry in Computer Vision" by Richard Hartley. The essential thing to know for this example is that points in 3-space are related to points in 2-space through a series of multiplications of 4x4 matrices which are the perspective and euclidean transformations. The 4x4 matrices predicate the use of length 4 vectors to represent points. This representation is known as homogeneous coordinates, and while they appear foriegn at first, they truly simplify all the mathematics involved. In short, homogeneous coordinates are your friend, and you should read about them here: http://en.wikipedia.org/wiki/Homogeneous_coordinates In the normal pinhole camera model (the ideal real world model), 3D world points are related to 2D image points by the matrix termed the 'essential' matrix which is a combination of a perspective transformation and a euclidean transformation. The perspective transformation is defined by the camera intrinsics (focal length, imaging sensor offset, etc...) and the euclidean transformation is defined by the cameras position and orientation. In computer graphics, things are not so simple. This is because computer graphics have the benefit of being able to do things which are not possible in the real world: adding clipping planes, offset projection centers, arbitrary distortions, etc... Thus, a slightly different model is used. What follows is the camera/view model for OpenGL and thus, VTK. I can not guarantee that other packages follow this model. There are 4 different transformations that are applied 3D world coordinates to map them to 2D pixel coordinates. They are: the model transform, the view transform, the perspective transform, and the viewport or display transform. In OpenGL the first two transformations are concatenated to yield the modelview transform (called simply the view transform in VTK). The modelview transformation applies arbitrary scaling and distortions to the model (if they are specified) and transforms them so that the orientation is the equivalent of looking down the negative Z axis. Imagine its as if you relocate your camera to look down the negative Z axis, and then move everything in the world so that you see it now as you did before you moved the camera. The resulting coordinates are termed "eye" coordinates in OpenGL (I don't know that they have a name in VTK). The perspective transformation applies the camera perspective to the eye coordinates. This transform is what makes objects in the foreground look bigger than equivalent objects in the background. In the pinhole camera model, this transform is determined uniquely by the focal length of the camera and its position in 3-space. In Vtk/OpenGL it is determined by the frustum. A frustum is simply a pyramid with the top lopped off. The top of the pyramid (a point) is the camera location, the base of the pyramid is a plane (the far clipping plane) defined as normal to principle camera ray at distance termed the far clipping distance, the top of the frustum (where it's lopped off) is the near clipping plane, with a definition similar to that of the far clipping plane. The sides of the frustum are determined by the aspect ratio of the camera (width/height) and its field-of-view. Any points not lying within the frustum are not mapped to the screen (as they would lie outside the viewable area). The perpspective transformation has the effect of scaling everything within the frustum to fit within a cube defined in the range (-1,1)(-1,1)(-1,1) as represented by homogeneous coordinates. The last phrase there is important, the first 3 coordinates will not, in general, be within the unity range until we divide through by the last coordinate (See the wikipedia on homogeneous coordinates if this is confusing). The resulting coordinates are termed (appropriately enough) normalized view coordinates. The last transformation (the viewport transformation) takes us from normalized view coordinates to display coordinates. At this point, you may be asking yourself 'why not just go directly to display coordinates, why need normalized view coordinates at all?', the answer is that we may want to embed more than one view in a particular window, there will therefore be different transformations to take each view to an appropriate position an size in the window. The normalized view coordinates provide a nice common ground so-to-speak. At any rate, the viewport transformation simply scales and translates the X and Y coordinates of the normalized view coordinates to the appropriate pixel coordinates. We don't use the Z value in our example because we don't care about it. It is used for other various things however. That's all there is to it, pretty simple right? Right. Here is an overview: Given a set of 3D world coordinates: - Apply the modelview transformation (view transform in VTK) to get eye coordinates - Apply the perspective transformation to get normalized view coordinates - Apply the viewport transformation to get display coordinates VTK provides a nice method to retrieve a 4x4 matrix that combines the first two operations. As far as I can tell, VTK does not export a method to retrieve the 4x4 matrix representing the viewport transformation, so we are on our there to create one (no worries though, its not hard, as you will see). Now that the prelimenaries are out of the way, lets get started. """ # Author: S. Chris Colbert # Copyright (c) 2009, S. Chris Colbert # License: BSD Style from __future__ import print_function # this import is here because we need to ensure that matplotlib uses the # wx backend and having regular code outside the main block is PyTaboo. # It needs to be imported first, so that matplotlib can impose the # version of Wx it requires. import matplotlib matplotlib.use('WXAgg') import pylab as pl import numpy as np from mayavi import mlab from mayavi.core.ui.mayavi_scene import MayaviScene def get_world_to_view_matrix(mlab_scene): """returns the 4x4 matrix that is a concatenation of the modelview transform and perspective transform. Takes as input an mlab scene object.""" if not isinstance(mlab_scene, MayaviScene): raise TypeError('argument must be an instance of MayaviScene') # The VTK method needs the aspect ratio and near and far clipping planes # in order to return the proper transform. So we query the current scene # object to get the parameters we need. scene_size = tuple(mlab_scene.get_size()) clip_range = mlab_scene.camera.clipping_range aspect_ratio = float(scene_size[0])/float(scene_size[1]) # this actually just gets a vtk matrix object, we can't really do anything with it yet vtk_comb_trans_mat = mlab_scene.camera.get_composite_projection_transform_matrix( aspect_ratio, clip_range[0], clip_range[1]) # get the vtk mat as a numpy array np_comb_trans_mat = vtk_comb_trans_mat.to_array() return np_comb_trans_mat def get_view_to_display_matrix(mlab_scene): """ this function returns a 4x4 matrix that will convert normalized view coordinates to display coordinates. It's assumed that the view should take up the entire window and that the origin of the window is in the upper left corner""" if not (isinstance(mlab_scene, MayaviScene)): raise TypeError('argument must be an instance of MayaviScene') # this gets the client size of the window x, y = tuple(mlab_scene.get_size()) # normalized view coordinates have the origin in the middle of the space # so we need to scale by width and height of the display window and shift # by half width and half height. The matrix accomplishes that. view_to_disp_mat = np.array([[x/2.0, 0., 0., x/2.0], [ 0., -y/2.0, 0., y/2.0], [ 0., 0., 1., 0.], [ 0., 0., 0., 1.]]) return view_to_disp_mat def apply_transform_to_points(points, trans_mat): """a function that applies a 4x4 transformation matrix to an of homogeneous points. The array of points should have shape Nx4""" if not trans_mat.shape == (4, 4): raise ValueError('transform matrix must be 4x4') if not points.shape[1] == 4: raise ValueError('point array must have shape Nx4') return np.dot(trans_mat, points.T).T if __name__ == '__main__': f = mlab.figure() N = 4 # create a few points in 3-space X = np.random.random_integers(-3, 3, N) Y = np.random.random_integers(-3, 3, N) Z = np.random.random_integers(-3, 3, N) # plot the points with mlab pts = mlab.points3d(X, Y, Z) # now were going to create a single N x 4 array of our points # adding a fourth column of ones expresses the world points in # homogenous coordinates W = np.ones(X.shape) hmgns_world_coords = np.column_stack((X, Y, Z, W)) # applying the first transform will give us 'unnormalized' view # coordinates we also have to get the transform matrix for the # current scene view comb_trans_mat = get_world_to_view_matrix(f.scene) view_coords = \ apply_transform_to_points(hmgns_world_coords, comb_trans_mat) # to get normalized view coordinates, we divide through by the fourth # element norm_view_coords = view_coords / (view_coords[:, 3].reshape(-1, 1)) # the last step is to transform from normalized view coordinates to # display coordinates. view_to_disp_mat = get_view_to_display_matrix(f.scene) disp_coords = apply_transform_to_points(norm_view_coords, view_to_disp_mat) # at this point disp_coords is an Nx4 array of homogenous coordinates # where X and Y are the pixel coordinates of the X and Y 3D world # coordinates, so lets take a screenshot of mlab view and open it # with matplotlib so we can check the accuracy img = mlab.screenshot() pl.imshow(img) for i in range(N): print('Point %d: (x, y) ' % i, disp_coords[:, 0:2][i]) pl.plot([disp_coords[:, 0][i]], [disp_coords[:, 1][i]], 'ro') pl.show() # you should check that the printed coordinates correspond to the # proper points on the screen mlab.show() #EOF mayavi-4.5.0/docs/source/mayavi/auto/mlab_camera.rst0000644000076500000240000001651212747716313023075 0ustar prabhustaff00000000000000 .. currentmodule:: mayavi.mlab .. note:: This section is only a reference describing the function, please see the chapter on :ref:`simple-scripting-with-mlab` for an introduction to mlab and how to interact with and assemble the functions of `mlab`. Please see the section on :ref:`running-mlab-scripts` for instructions on running the examples. Camera handling functions ========================= move ~~~~ .. function:: move(forward=None, right=None, up=None) :: Translates the camera and focal point together. The arguments specify the relative distance to translate the camera and focal point, so as to produce the appearence of moving the camera without changing the effective field of view. If called with no arguments, the function returns the absolute position of the camera and focal pointon a cartesian coordinate system. Note that the arguments specify relative motion, although the return value with no arguments is in an absolute coordinate system. **Keyword arguments**: :forward: float, optional. The distance in space to translate the camera forward (if positive) or backward (if negative) :right: float, optional. The distance in space to translate the camera to the right (if positive) or left (if negative) :up: float, optional. The distance in space to translate the camera up (if positive) or down (if negative) **Returns**: If no arguments are supplied (or all are None), returns a tuple (camera_position, focal_point_position) otherwise, returns None **Examples**: Get the current camera position:: >>> cam,foc = move() >>> cam array([-0.06317079, -0.52849738, -1.68316389]) >>> foc array([ 1.25909623, 0.15692708, -0.37576693]) Translate the camera:: >>> move(3,-1,-1.2) >>> move() (array([ 2.93682921, -1.52849738, -2.88316389]), array([ 4.25909623, -0.84307292, -1.57576693])) Return to the starting position:: >>> move(-3,1,1.2) >>> move() (array([-0.06317079, -0.52849738, -1.68316389]), array([ 1.25909623, 0.15692708, -0.37576693])) **See also** :mlab.yaw: yaw the camera (tilt left-right) :mlab.pitch: pitch the camera (tilt up-down) :mlab.roll: control the absolute roll angle of the camera :mlab.view: set the camera position relative to the focal point instead of in absolute space pitch ~~~~~ .. function:: pitch(degrees) Rotates the camera about the axis corresponding to the "right" direction of the current view. Note that this will change the location of the focal point (although not the camera location). This angle is relative to the current direction - the angle is NOT an absolute angle in a fixed coordinate system. **See also** :mlab.yaw: relative rotation about the "up" direction :mlab.roll: absolute roll angle (i.e. "up" direction) :mlab.move: relative translation of the camera and focal point roll ~~~~ .. function:: roll(roll=None, figure=None) Sets or returns the absolute roll angle of the camera. **See also** :mlab.view: control the position and direction of the camera view ~~~~ .. function:: view(azimuth=None, elevation=None, distance=None, focalpoint=None, roll=None, reset_roll=True, figure=None) Sets/Gets the view point for the camera:: view(azimuth=None, elevation=None, distance=None, focalpoint=None, roll=None, reset_roll=True, figure=None) If called with no arguments this returns the current view of the camera. To understand how this function works imagine the surface of a sphere centered around the visualization. The `azimuth` argument specifies the angle "phi" on the x-y plane which varies from 0-360 degrees. The `elevation` argument specifies the angle "theta" from the z axis and varies from 0-180 degrees. The `distance` argument is the radius of the sphere and the `focalpoint`, the center of the sphere. Note that if the `elevation` is close to zero or 180, then the `azimuth` angle refers to the amount of rotation of a standard x-y plot with respect to the x-axis. Thus, specifying ``view(0,0)`` will give you a typical x-y plot with x varying from left to right and y from bottom to top. **Keyword arguments**: :azimuth: float, optional. The azimuthal angle (in degrees, 0-360), i.e. the angle subtended by the position vector on a sphere projected on to the x-y plane with the x-axis. :elevation: float, optional. The zenith angle (in degrees, 0-180), i.e. the angle subtended by the position vector and the z-axis. :distance: float or 'auto', optional. A positive floating point number representing the distance from the focal point to place the camera. New in Mayavi 3.4.0: if 'auto' is passed, the distance is computed to have a best fit of objects in the frame. :focalpoint: array_like or 'auto', optional. An array of 3 floating point numbers representing the focal point of the camera. New in Mayavi 3.4.0: if 'auto' is passed, the focal point is positioned at the center of all objects in the scene. :roll: float, optional Controls the roll, ie the rotation of the camera around its axis. :reset_roll: boolean, optional. If True, and 'roll' is not specified, the roll orientation of the camera is reset. :figure: The Mayavi figure to operate on. If None is passed, the current one is used. **Returns**: If no arguments are supplied it returns a tuple of 4 values ``(azimuth, elevation, distance, focalpoint)``, representing the current view. Note that these can be used later on to set the view. If arguments are supplied it returns `None`. **Examples**: Get the current view:: >>> v = view() >>> v (45.0, 45.0, 25.02794981, array([ 0.01118028, 0. , 4.00558996])) Set the view in different ways:: >>> view(45, 45) >>> view(240, 120) >>> view(distance=20) >>> view(focalpoint=(0,0,9)) Set the view to that saved in `v` above:: >>> view(*v) **See also** :mlab.roll: control the roll angle of the camera, ie the direction pointing up yaw ~~~ .. function:: yaw(degrees) Rotates the camera about the axis corresponding to the "up" direction of the current view. Note that this will change the location of the focal point (although not the camera location). This angle is relative to the current direction - the angle is NOT an absolute angle in a fixed coordinate system. **See also** :mlab.pitch: relative rotation about the "right" direction :mlab.roll: absolute roll angle (i.e. "up" direction) :mlab.move: relative translation of the camera and focal point mayavi-4.5.0/docs/source/mayavi/auto/mlab_decorations.rst0000644000076500000240000000764112747716313024162 0ustar prabhustaff00000000000000 .. currentmodule:: mayavi.mlab .. note:: This section is only a reference describing the function, please see the chapter on :ref:`simple-scripting-with-mlab` for an introduction to mlab and how to interact with and assemble the functions of `mlab`. Please see the section on :ref:`running-mlab-scripts` for instructions on running the examples. Figure decoration functions =========================== colorbar ~~~~~~~~ .. function:: colorbar(object=None, title=None, orientation=None, nb_labels=None, nb_colors=None, label_fmt=None) Adds a colorbar for the color mapping of the given object. If the object has scalar data, the scalar color mapping is represented. Elsewhere the vector color mapping is represented, if available. If no object is specified, the first object with a color map in the scene is used. **Keyword arguments**: :object: Optional object to get the color map from :title: The title string :orientation: Can be 'horizontal' or 'vertical' :nb_labels: The number of labels to display on the colorbar. :label_fmt: The string formater for the labels. This needs to be a formater for float number, eg '%.1f'. :nb_colors: The maximum number of colors displayed on the colorbar. scalarbar ~~~~~~~~~ .. function:: scalarbar(object=None, title=None, orientation=None, nb_labels=None, nb_colors=None, label_fmt=None) Adds a colorbar for the scalar color mapping of the given object. If no object is specified, the first object with scalar data in the scene is used. **Keyword arguments**: :object: Optional object to get the scalar color map from :title: The title string :orientation: Can be 'horizontal' or 'vertical' :nb_labels: The number of labels to display on the colorbar. :label_fmt: The string formater for the labels. This needs to be a formater for float number, eg '%.1f'. :nb_colors: The maximum number of colors displayed on the colorbar. vectorbar ~~~~~~~~~ .. function:: vectorbar(object=None, title=None, orientation=None, nb_labels=None, nb_colors=None, label_fmt=None) Adds a colorbar for the vector color mapping of the given object. If no object is specified, the first object with vector data in the scene is used. **Keyword arguments** :object: Optional object to get the vector color map from :title: The title string :orientation: Can be 'horizontal' or 'vertical' :nb_labels: The number of labels to display on the colorbar. :label_fmt: The string formater for the labels. This needs to be a formater for float number, eg '%.1f'. :nb_colors: The maximum number of colors displayed on the colorbar. xlabel ~~~~~~ .. function:: xlabel(text, object=None) Creates a set of axes if there isn't already one, and sets the x label **Keyword arguments**: :object: The object to apply the module to, if not the whole scene is searched for a suitable object. ylabel ~~~~~~ .. function:: ylabel(text, object=None) Creates a set of axes if there isn't already one, and sets the y label **Keyword arguments**: :object: The object to apply the module to, if not the whole scene is searched for a suitable object. zlabel ~~~~~~ .. function:: zlabel(text, object=None) Creates a set of axes if there isn't already one, and sets the z label **Keyword arguments** :object: The object to apply the module to, if not the whole scene is searched for a suitable object. mayavi-4.5.0/docs/source/mayavi/auto/mlab_figure.rst0000644000076500000240000001166112747716313023126 0ustar prabhustaff00000000000000 .. currentmodule:: mayavi.mlab .. note:: This section is only a reference describing the function, please see the chapter on :ref:`simple-scripting-with-mlab` for an introduction to mlab and how to interact with and assemble the functions of `mlab`. Please see the section on :ref:`running-mlab-scripts` for instructions on running the examples. Figure handling functions ========================= clf ~~~ .. function:: clf(figure=None) Clear the current figure. You can also supply the figure that you want to clear. close ~~~~~ .. function:: close(scene=None, all=False) Close a figure window close() by itself closes the current figure. close(num) closes figure number num. close(name) closes figure named name. close(figure), where figure is a scene instance, closes that figure. close(all=True) closes all figures controlled by mlab draw ~~~~ .. function:: draw(figure=None) Forces a redraw of the current figure. figure ~~~~~~ .. function:: figure(figure=None, bgcolor=None, fgcolor=None, engine=None, size=(400, 350)) Creates a new scene or retrieves an existing scene. If the mayavi engine is not running this also starts it. **Keyword arguments** :figure: The name of the figure, or handle to it. :bgcolor: The color of the background (None is default). :fgcolor: The color of the foreground, that is the color of all text annotation labels (axes, orientation axes, scalar bar labels). It should be sufficiently far from `bgcolor` to see the annotation texts. (None is default). :engine: The mayavi engine that controls the figure. :size: The size of the scene created, in pixels. May not apply for certain scene viewer. gcf ~~~ .. function:: gcf(engine=None) Return a handle to the current figure. You can supply the engine from which you want to retrieve the current figure, if you have several mayavi engines. savefig ~~~~~~~ .. function:: savefig(filename, size=None, figure=None, magnification='auto', **kwargs) Save the current scene. The output format are deduced by the extension to filename. Possibilities are png, jpg, bmp, tiff, ps, eps, pdf, rib (renderman), oogl (geomview), iv (OpenInventor), vrml, obj (wavefront) **Parameters** :size: the size of the image created (unless magnification is set, in which case it is the size of the window used for rendering). :figure: the figure instance to save to a file. :magnification: the magnification is the scaling between the pixels on the screen, and the pixels in the file saved. If you do not specify it, it will be calculated so that the file is saved with the specified size. If you specify a magnification, Mayavi will use the given size as a screen size, and the file size will be 'magnification * size'. **Notes** If the size specified is larger than the window size, and no magnification parameter is passed, the magnification of the scene is changed so that the image created has the requested size. Please note that if you are trying to save images with sizes larger than the window size, there will be additional computation cost. Any extra keyword arguments are passed along to the respective image format's save method. screenshot ~~~~~~~~~~ .. function:: screenshot(figure=None, mode='rgb', antialiased=False) Return the current figure pixmap as an array. **Parameters** :figure: a figure instance or None, optional If specified, the figure instance to capture the view of. :mode: {'rgb', 'rgba'} The color mode of the array captured. :antialiased: {True, False} Use anti-aliasing for rendering the screenshot. Uses the number of aa frames set by figure.scene.anti_aliasing_frames **Notes** On most systems, this works similarly to taking a screenshot of the rendering window. Thus if it is hidden by another window, you will capture the other window. This limitation is due to the heavy use of the hardware graphics system. **Examples** This function can be useful for integrating 3D plotting with Mayavi in a 2D plot created by matplotlib. >>> from mayavi import mlab >>> mlab.test_plot3d() >>> arr = mlab.screenshot() >>> import pylab as pl >>> pl.imshow(arr) >>> pl.axis('off') >>> pl.show() sync_camera ~~~~~~~~~~~ .. function:: sync_camera(reference_figure, target_figure) Synchronise the camera of the target_figure on the camera of the reference_figure. mayavi-4.5.0/docs/source/mayavi/auto/mlab_helper_functions.rst0000644000076500000240000012157412747716313025221 0ustar prabhustaff00000000000000 .. currentmodule:: mayavi.mlab .. note:: This section is only a reference describing the function, please see the chapter on :ref:`simple-scripting-with-mlab` for an introduction to mlab and how to interact with and assemble the functions of `mlab`. Please see the section on :ref:`running-mlab-scripts` for instructions on running the examples. Plotting functions ================== barchart ~~~~~~~~ .. function:: barchart(*args, **kwargs) Plots vertical glyphs (like bars) scaled vertical, to do histogram-like plots. This functions accepts a wide variety of inputs, with positions given in 2-D or in 3-D. **Function signatures**:: barchart(s, ...) barchart(x, y, s, ...) barchart(x, y, f, ...) barchart(x, y, z, s, ...) barchart(x, y, z, f, ...) If only one positional argument is passed, it can be a 1-D, 2-D, or 3-D array giving the length of the vectors. The positions of the data points are deducted from the indices of array, and an uniformly-spaced data set is created. If 3 positional arguments (x, y, s) are passed the last one must be an array s, or a callable, f, that returns an array. x and y give the 2D coordinates of positions corresponding to the s values. If 4 positional arguments (x, y, z, s) are passed, the 3 first are arrays giving the 3D coordinates of the data points, and the last one is an array s, or a callable, f, that returns an array giving the data value. **Keyword arguments:** :auto_scale: whether to compute automatically the lateral scaling of the glyphs. This might be computationally expensive. Must be a boolean. Default: True :color: the color of the vtk object. Overides the colormap, if any, when specified. This is specified as a triplet of float ranging from 0 to 1, eg (1, 1, 1) for white. :colormap: type of colormap to use. :extent: [xmin, xmax, ymin, ymax, zmin, zmax] Default is the x, y, z arrays extent. Use this to change the extent of the object created. :figure: Figure to populate. :lateral_scale: The lateral scale of the glyph, in units of the distance between nearest points Must be a float. Default: 0.9 :line_width: The width of the lines, if any used. Must be a float. Default: 2.0 :mask_points: If supplied, only one out of 'mask_points' data point is displayed. This option is useful to reduce the number of points displayed on large datasets Must be an integer or None. :mode: The glyph used to represent the bars. Must be '2dcircle' or '2dcross' or '2ddiamond' or '2dsquare' or '2dthick_cross' or '2dtriangle' or '2dvertex' or 'cube'. Default: cube :name: the name of the vtk object created. :opacity: The overall opacity of the vtk object. Must be a float. Default: 1.0 :reset_zoom: Reset the zoom to accomodate the data newly added to the scene. Defaults to True. :resolution: The resolution of the glyph created. For spheres, for instance, this is the number of divisions along theta and phi. Must be an integer. Default: 8 :scale_factor: the scaling applied to the glyphs. The size of the glyph is by default in drawing units. Must be a float. Default: 1.0 :scale_mode: the scaling mode for the glyphs ('vector', 'scalar', or 'none'). :transparent: make the opacity of the actor depend on the scalar. :vmax: vmax is used to scale the colormap. If None, the max of the data will be used :vmin: vmin is used to scale the colormap. If None, the min of the data will be used **Example** (run in ``ipython -wthread``, ``ipython --gui=wx`` for recent IPython versions, or in the mayavi2 interactive shell, see :ref:`running-mlab-scripts` for more info):: import numpy from mayavi.mlab import * def test_barchart(): """ Demo the bar chart plot with a 2D array. """ s = numpy.abs(numpy.random.random((3, 3))) return barchart(s) contour3d ~~~~~~~~~ .. function:: contour3d(*args, **kwargs) Plots iso-surfaces for a 3D volume of data suplied as arguments. **Function signatures**:: contour3d(scalars, ...) contour3d(x, y, z, scalars, ...) scalars is a 3D numpy arrays giving the data on a grid. If 4 arrays, (x, y, z, scalars) are passed, the 3 first arrays give the position of the arrows, and the last the scalar value. The x, y and z arrays are then supposed to have been generated by `numpy.mgrid`, in other words, they are 3D arrays, with positions lying on a 3D orthogonal and regularly spaced grid with nearest neighbor in space matching nearest neighbor in the array. The function builds a scalar field assuming the points are regularly spaced. If 4 positional arguments, (x, y, z, f) are passed, the last one can also be a callable, f, that returns vectors components (u, v, w) given the positions (x, y, z). **Keyword arguments:** :color: the color of the vtk object. Overides the colormap, if any, when specified. This is specified as a triplet of float ranging from 0 to 1, eg (1, 1, 1) for white. :colormap: type of colormap to use. :contours: Integer/list specifying number/list of contours. Specifying a list of values will only give the requested contours asked for. :extent: [xmin, xmax, ymin, ymax, zmin, zmax] Default is the x, y, z arrays extent. Use this to change the extent of the object created. :figure: Figure to populate. :line_width: The width of the lines, if any used. Must be a float. Default: 2.0 :name: the name of the vtk object created. :opacity: The overall opacity of the vtk object. Must be a float. Default: 1.0 :reset_zoom: Reset the zoom to accomodate the data newly added to the scene. Defaults to True. :transparent: make the opacity of the actor depend on the scalar. :vmax: vmax is used to scale the colormap. If None, the max of the data will be used :vmin: vmin is used to scale the colormap. If None, the min of the data will be used **Example** (run in ``ipython -wthread``, ``ipython --gui=wx`` for recent IPython versions, or in the mayavi2 interactive shell, see :ref:`running-mlab-scripts` for more info):: import numpy from mayavi.mlab import * def test_contour3d(): x, y, z = numpy.ogrid[-5:5:64j, -5:5:64j, -5:5:64j] scalars = x * x * 0.5 + y * y + z * z * 2.0 obj = contour3d(scalars, contours=4, transparent=True) return obj contour_surf ~~~~~~~~~~~~ .. function:: contour_surf(*args, **kwargs) Plots a the contours of a surface using grid-spaced data for elevation supplied as a 2D array. **Function signatures**:: contour_surf(s, ...) contour_surf(x, y, s, ...) contour_surf(x, y, f, ...) s is the elevation matrix, a 2D array. The contour lines plotted are lines of equal s value. x and y can be 1D or 2D arrays (such as returned by numpy.ogrid or numpy.mgrid), but the points should be located on an orthogonal grid (possibly non-uniform). In other words, all the points sharing a same index in the s array need to have the same x or y value. For arbitrary-shaped position arrays (non-orthogonal grids), see the mesh function. If only 1 array s is passed, the x and y arrays are assumed to be made from the indices of arrays, and an uniformly-spaced data set is created. If 3 positional arguments are passed the last one must be an array s, or a callable, f, that returns an array. x and y give the coordinates of positions corresponding to the s values. **Keyword arguments:** :color: the color of the vtk object. Overides the colormap, if any, when specified. This is specified as a triplet of float ranging from 0 to 1, eg (1, 1, 1) for white. :colormap: type of colormap to use. :contours: Integer/list specifying number/list of contours. Specifying a list of values will only give the requested contours asked for. :extent: [xmin, xmax, ymin, ymax, zmin, zmax] Default is the x, y, z arrays extent. Use this to change the extent of the object created. :figure: Figure to populate. :line_width: The width of the lines, if any used. Must be a float. Default: 2.0 :name: the name of the vtk object created. :opacity: The overall opacity of the vtk object. Must be a float. Default: 1.0 :reset_zoom: Reset the zoom to accomodate the data newly added to the scene. Defaults to True. :transparent: make the opacity of the actor depend on the scalar. :vmax: vmax is used to scale the colormap. If None, the max of the data will be used :vmin: vmin is used to scale the colormap. If None, the min of the data will be used :warp_scale: scale of the warp scalar **Example** (run in ``ipython -wthread``, ``ipython --gui=wx`` for recent IPython versions, or in the mayavi2 interactive shell, see :ref:`running-mlab-scripts` for more info):: import numpy from mayavi.mlab import * def test_contour_surf(): """Test contour_surf on regularly spaced co-ordinates like MayaVi.""" def f(x, y): sin, cos = numpy.sin, numpy.cos return sin(x + y) + sin(2 * x - y) + cos(3 * x + 4 * y) x, y = numpy.mgrid[-7.:7.05:0.1, -5.:5.05:0.05] s = contour_surf(x, y, f) return s flow ~~~~ .. function:: flow(*args, **kwargs) Creates a trajectory of particles following the flow of a vector field. **Function signatures**:: flow(u, v, w, ...) flow(x, y, z, u, v, w, ...) flow(x, y, z, f, ...) u, v, w are numpy arrays giving the components of the vectors. If only 3 arrays, u, v, and w are passed, they must be 3D arrays, and the positions of the arrows are assumed to be the indices of the corresponding points in the (u, v, w) arrays. If 6 arrays, (x, y, z, u, v, w) are passed, the 3 first arrays give the position of the arrows, and the 3 last the components. The x, y and z arrays are then supposed to have been generated by `numpy.mgrid`, in other words, they are 3D arrays, with positions lying on a 3D orthogonal and regularly spaced grid with nearest neighbor in space matching nearest neighbor in the array. The function builds a vector field assuming the points are regularly spaced. If 4 positional arguments, (x, y, z, f) are passed, the last one must be a callable, f, that returns vectors components (u, v, w) given the positions (x, y, z). **Keyword arguments:** :color: the color of the vtk object. Overides the colormap, if any, when specified. This is specified as a triplet of float ranging from 0 to 1, eg (1, 1, 1) for white. :colormap: type of colormap to use. :extent: [xmin, xmax, ymin, ymax, zmin, zmax] Default is the x, y, z arrays extent. Use this to change the extent of the object created. :figure: Figure to populate. :integration_direction: The direction of the integration. Must be 'forward' or 'backward' or 'both'. Default: forward :line_width: The width of the lines, if any used. Must be a float. Default: 2.0 :linetype: the type of line-like object used to display the streamline. Must be 'line' or 'ribbon' or 'tube'. Default: line :name: the name of the vtk object created. :opacity: The overall opacity of the vtk object. Must be a float. Default: 1.0 :reset_zoom: Reset the zoom to accomodate the data newly added to the scene. Defaults to True. :scalars: optional scalar data. :seed_resolution: The resolution of the seed. Determines the number of seed points Must be an integer or None. :seed_scale: Scales the seed around its default center Must be a float. Default: 1.0 :seed_visible: Control the visibility of the seed. Must be a boolean. Default: True :seedtype: the widget used as a seed for the streamlines. Must be 'line' or 'plane' or 'point' or 'sphere'. Default: sphere :transparent: make the opacity of the actor depend on the scalar. :vmax: vmax is used to scale the colormap. If None, the max of the data will be used :vmin: vmin is used to scale the colormap. If None, the min of the data will be used **Example** (run in ``ipython -wthread``, ``ipython --gui=wx`` for recent IPython versions, or in the mayavi2 interactive shell, see :ref:`running-mlab-scripts` for more info):: import numpy from mayavi.mlab import * def test_flow(): x, y, z = numpy.mgrid[0:5, 0:5, 0:5] r = numpy.sqrt(x ** 2 + y ** 2 + z ** 4) u = y * numpy.sin(r) / r v = -x * numpy.sin(r) / r w = numpy.zeros_like(z) obj = flow(u, v, w) return obj imshow ~~~~~~ .. function:: imshow(*args, **kwargs) View a 2D array as an image. **Function signatures**:: imshow(s, ...) s is a 2 dimension array. The values of s are mapped to a color using the colormap. **Keyword arguments:** :color: the color of the vtk object. Overides the colormap, if any, when specified. This is specified as a triplet of float ranging from 0 to 1, eg (1, 1, 1) for white. :colormap: type of colormap to use. :extent: [xmin, xmax, ymin, ymax, zmin, zmax] Default is the x, y, z arrays extent. Use this to change the extent of the object created. :figure: Figure to populate. :interpolate: if the pixels in the image are to be interpolated or not. Must be a boolean. Default: True :line_width: The width of the lines, if any used. Must be a float. Default: 2.0 :name: the name of the vtk object created. :opacity: the opacity of the image. Must be a legal value. Default: 1.0 :reset_zoom: Reset the zoom to accomodate the data newly added to the scene. Defaults to True. :transparent: make the opacity of the actor depend on the scalar. :vmax: vmax is used to scale the colormap. If None, the max of the data will be used :vmin: vmin is used to scale the colormap. If None, the min of the data will be used **Example** (run in ``ipython -wthread``, ``ipython --gui=wx`` for recent IPython versions, or in the mayavi2 interactive shell, see :ref:`running-mlab-scripts` for more info):: import numpy from mayavi.mlab import * def test_imshow(): """ Use imshow to visualize a 2D 10x10 random array. """ s = numpy.random.random((10, 10)) return imshow(s, colormap='gist_earth') mesh ~~~~ .. function:: mesh(*args, **kwargs) Plots a surface using grid-spaced data supplied as 2D arrays. **Function signatures**:: mesh(x, y, z, ...) x, y, z are 2D arrays, all of the same shape, giving the positions of the vertices of the surface. The connectivity between these points is implied by the connectivity on the arrays. For simple structures (such as orthogonal grids) prefer the `surf` function, as it will create more efficient data structures. For mesh defined by triangles rather than regular implicit connectivity, see the `triangular_mesh` function. **Keyword arguments:** :color: the color of the vtk object. Overides the colormap, if any, when specified. This is specified as a triplet of float ranging from 0 to 1, eg (1, 1, 1) for white. :colormap: type of colormap to use. :extent: [xmin, xmax, ymin, ymax, zmin, zmax] Default is the x, y, z arrays extent. Use this to change the extent of the object created. :figure: Figure to populate. :line_width: The width of the lines, if any used. Must be a float. Default: 2.0 :mask: boolean mask array to suppress some data points. :mask_points: If supplied, only one out of 'mask_points' data point is displayed. This option is useful to reduce the number of points displayed on large datasets Must be an integer or None. :mode: the mode of the glyphs. Must be '2darrow' or '2dcircle' or '2dcross' or '2ddash' or '2ddiamond' or '2dhooked_arrow' or '2dsquare' or '2dthick_arrow' or '2dthick_cross' or '2dtriangle' or '2dvertex' or 'arrow' or 'axes' or 'cone' or 'cube' or 'cylinder' or 'point' or 'sphere'. Default: sphere :name: the name of the vtk object created. :opacity: The overall opacity of the vtk object. Must be a float. Default: 1.0 :representation: the representation type used for the surface. Must be 'surface' or 'wireframe' or 'points' or 'mesh' or 'fancymesh'. Default: surface :reset_zoom: Reset the zoom to accomodate the data newly added to the scene. Defaults to True. :resolution: The resolution of the glyph created. For spheres, for instance, this is the number of divisions along theta and phi. Must be an integer. Default: 8 :scalars: optional scalar data. :scale_factor: scale factor of the glyphs used to represent the vertices, in fancy_mesh mode. Must be a float. Default: 0.05 :scale_mode: the scaling mode for the glyphs ('vector', 'scalar', or 'none'). :transparent: make the opacity of the actor depend on the scalar. :tube_radius: radius of the tubes used to represent the lines, in mesh mode. If None, simple lines are used. :tube_sides: number of sides of the tubes used to represent the lines. Must be an integer. Default: 6 :vmax: vmax is used to scale the colormap. If None, the max of the data will be used :vmin: vmin is used to scale the colormap. If None, the min of the data will be used **Example** (run in ``ipython -wthread``, ``ipython --gui=wx`` for recent IPython versions, or in the mayavi2 interactive shell, see :ref:`running-mlab-scripts` for more info):: import numpy from mayavi.mlab import * def test_mesh(): """A very pretty picture of spherical harmonics translated from the octaviz example.""" pi = numpy.pi cos = numpy.cos sin = numpy.sin dphi, dtheta = pi / 250.0, pi / 250.0 [phi, theta] = numpy.mgrid[0:pi + dphi * 1.5:dphi, 0:2 * pi + dtheta * 1.5:dtheta] m0 = 4 m1 = 3 m2 = 2 m3 = 3 m4 = 6 m5 = 2 m6 = 6 m7 = 4 r = sin(m0 * phi) ** m1 + cos(m2 * phi) ** m3 + \ sin(m4 * theta) ** m5 + cos(m6 * theta) ** m7 x = r * sin(phi) * cos(theta) y = r * cos(phi) z = r * sin(phi) * sin(theta) return mesh(x, y, z, colormap="bone") plot3d ~~~~~~ .. function:: plot3d(*args, **kwargs) Draws lines between points. **Function signatures**:: plot3d(x, y, z, ...) plot3d(x, y, z, s, ...) x, y, z and s are numpy arrays or lists of the same shape. x, y and z give the positions of the successive points of the line. s is an optional scalar value associated with each point. **Keyword arguments:** :color: the color of the vtk object. Overides the colormap, if any, when specified. This is specified as a triplet of float ranging from 0 to 1, eg (1, 1, 1) for white. :colormap: type of colormap to use. :extent: [xmin, xmax, ymin, ymax, zmin, zmax] Default is the x, y, z arrays extent. Use this to change the extent of the object created. :figure: Figure to populate. :line_width: The width of the lines, if any used. Must be a float. Default: 2.0 :name: the name of the vtk object created. :opacity: The overall opacity of the vtk object. Must be a float. Default: 1.0 :representation: the representation type used for the surface. Must be 'surface' or 'wireframe' or 'points'. Default: surface :reset_zoom: Reset the zoom to accomodate the data newly added to the scene. Defaults to True. :transparent: make the opacity of the actor depend on the scalar. :tube_radius: radius of the tubes used to represent the lines, If None, simple lines are used. :tube_sides: number of sides of the tubes used to represent the lines. Must be an integer. Default: 6 :vmax: vmax is used to scale the colormap. If None, the max of the data will be used :vmin: vmin is used to scale the colormap. If None, the min of the data will be used **Example** (run in ``ipython -wthread``, ``ipython --gui=wx`` for recent IPython versions, or in the mayavi2 interactive shell, see :ref:`running-mlab-scripts` for more info):: import numpy from mayavi.mlab import * def test_plot3d(): """Generates a pretty set of lines.""" n_mer, n_long = 6, 11 pi = numpy.pi dphi = pi / 1000.0 phi = numpy.arange(0.0, 2 * pi + 0.5 * dphi, dphi) mu = phi * n_mer x = numpy.cos(mu) * (1 + numpy.cos(n_long * mu / n_mer) * 0.5) y = numpy.sin(mu) * (1 + numpy.cos(n_long * mu / n_mer) * 0.5) z = numpy.sin(n_long * mu / n_mer) * 0.5 l = plot3d(x, y, z, numpy.sin(mu), tube_radius=0.025, colormap='Spectral') return l points3d ~~~~~~~~ .. function:: points3d(*args, **kwargs) Plots glyphs (like points) at the position of the supplied data. **Function signatures**:: points3d(x, y, z...) points3d(x, y, z, s, ...) points3d(x, y, z, f, ...) x, y and z are numpy arrays, or lists, all of the same shape, giving the positions of the points. If only 3 arrays x, y, z are given, all the points are drawn with the same size and color. In addition, you can pass a fourth array s of the same shape as x, y, and z giving an associated scalar value for each point, or a function f(x, y, z) returning the scalar value. This scalar value can be used to modulate the color and the size of the points. **Keyword arguments:** :color: the color of the vtk object. Overides the colormap, if any, when specified. This is specified as a triplet of float ranging from 0 to 1, eg (1, 1, 1) for white. :colormap: type of colormap to use. :extent: [xmin, xmax, ymin, ymax, zmin, zmax] Default is the x, y, z arrays extent. Use this to change the extent of the object created. :figure: Figure to populate. :line_width: The width of the lines, if any used. Must be a float. Default: 2.0 :mask_points: If supplied, only one out of 'mask_points' data point is displayed. This option is useful to reduce the number of points displayed on large datasets Must be an integer or None. :mode: the mode of the glyphs. Must be '2darrow' or '2dcircle' or '2dcross' or '2ddash' or '2ddiamond' or '2dhooked_arrow' or '2dsquare' or '2dthick_arrow' or '2dthick_cross' or '2dtriangle' or '2dvertex' or 'arrow' or 'axes' or 'cone' or 'cube' or 'cylinder' or 'point' or 'sphere'. Default: sphere :name: the name of the vtk object created. :opacity: The overall opacity of the vtk object. Must be a float. Default: 1.0 :reset_zoom: Reset the zoom to accomodate the data newly added to the scene. Defaults to True. :resolution: The resolution of the glyph created. For spheres, for instance, this is the number of divisions along theta and phi. Must be an integer. Default: 8 :scale_factor: The scaling applied to the glyphs. the size of the glyph is by default calculated from the inter-glyph spacing. Specify a float to give the maximum glyph size in drawing units :scale_mode: the scaling mode for the glyphs ('vector', 'scalar', or 'none'). :transparent: make the opacity of the actor depend on the scalar. :vmax: vmax is used to scale the colormap. If None, the max of the data will be used :vmin: vmin is used to scale the colormap. If None, the min of the data will be used **Example** (run in ``ipython -wthread``, ``ipython --gui=wx`` for recent IPython versions, or in the mayavi2 interactive shell, see :ref:`running-mlab-scripts` for more info):: import numpy from mayavi.mlab import * def test_points3d(): t = numpy.linspace(0, 4 * numpy.pi, 20) cos = numpy.cos sin = numpy.sin x = sin(2 * t) y = cos(t) z = cos(2 * t) s = 2 + sin(t) return points3d(x, y, z, s, colormap="copper", scale_factor=.25) quiver3d ~~~~~~~~ .. function:: quiver3d(*args, **kwargs) Plots glyphs (like arrows) indicating the direction of the vectors at the positions supplied. **Function signatures**:: quiver3d(u, v, w, ...) quiver3d(x, y, z, u, v, w, ...) quiver3d(x, y, z, f, ...) u, v, w are numpy arrays giving the components of the vectors. If only 3 arrays, u, v, and w are passed, they must be 3D arrays, and the positions of the arrows are assumed to be the indices of the corresponding points in the (u, v, w) arrays. If 6 arrays, (x, y, z, u, v, w) are passed, the 3 first arrays give the position of the arrows, and the 3 last the components. They can be of any shape. If 4 positional arguments, (x, y, z, f) are passed, the last one must be a callable, f, that returns vectors components (u, v, w) given the positions (x, y, z). **Keyword arguments:** :color: the color of the vtk object. Overides the colormap, if any, when specified. This is specified as a triplet of float ranging from 0 to 1, eg (1, 1, 1) for white. :colormap: type of colormap to use. :extent: [xmin, xmax, ymin, ymax, zmin, zmax] Default is the x, y, z arrays extent. Use this to change the extent of the object created. :figure: Figure to populate. :line_width: The width of the lines, if any used. Must be a float. Default: 2.0 :mask_points: If supplied, only one out of 'mask_points' data point is displayed. This option is useful to reduce the number of points displayed on large datasets Must be an integer or None. :mode: the mode of the glyphs. Must be '2darrow' or '2dcircle' or '2dcross' or '2ddash' or '2ddiamond' or '2dhooked_arrow' or '2dsquare' or '2dthick_arrow' or '2dthick_cross' or '2dtriangle' or '2dvertex' or 'arrow' or 'axes' or 'cone' or 'cube' or 'cylinder' or 'point' or 'sphere'. Default: 2darrow :name: the name of the vtk object created. :opacity: The overall opacity of the vtk object. Must be a float. Default: 1.0 :reset_zoom: Reset the zoom to accomodate the data newly added to the scene. Defaults to True. :resolution: The resolution of the glyph created. For spheres, for instance, this is the number of divisions along theta and phi. Must be an integer. Default: 8 :scalars: optional scalar data. :scale_factor: The scaling applied to the glyphs. the size of the glyph is by default calculated from the inter-glyph spacing. Specify a float to give the maximum glyph size in drawing units :scale_mode: the scaling mode for the glyphs ('vector', 'scalar', or 'none'). :transparent: make the opacity of the actor depend on the scalar. :vmax: vmax is used to scale the colormap. If None, the max of the data will be used :vmin: vmin is used to scale the colormap. If None, the min of the data will be used **Example** (run in ``ipython -wthread``, ``ipython --gui=wx`` for recent IPython versions, or in the mayavi2 interactive shell, see :ref:`running-mlab-scripts` for more info):: import numpy from mayavi.mlab import * def test_quiver3d(): x, y, z = numpy.mgrid[-2:3, -2:3, -2:3] r = numpy.sqrt(x ** 2 + y ** 2 + z ** 4) u = y * numpy.sin(r) / (r + 0.001) v = -x * numpy.sin(r) / (r + 0.001) w = numpy.zeros_like(z) obj = quiver3d(x, y, z, u, v, w, line_width=3, scale_factor=1) return obj surf ~~~~ .. function:: surf(*args, **kwargs) Plots a surface using regularly-spaced elevation data supplied as a 2D array. **Function signatures**:: surf(s, ...) surf(x, y, s, ...) surf(x, y, f, ...) s is the elevation matrix, a 2D array, where indices along the first array axis represent x locations, and indices along the second array axis represent y locations. x and y can be 1D or 2D arrays such as returned by numpy.ogrid or numpy.mgrid. Arrays returned by numpy.meshgrid require a transpose first to obtain correct indexing order. The points should be located on an orthogonal grid (possibly non-uniform). In other words, all the points sharing a same index in the s array need to have the same x or y value. For arbitrary-shaped position arrays (non-orthogonal grids), see the mesh function. If only 1 array s is passed, the x and y arrays are assumed to be made from the indices of arrays, and an uniformly-spaced data set is created. If 3 positional arguments are passed the last one must be an array s, or a callable, f, that returns an array. x and y give the coordinates of positions corresponding to the s values. **Keyword arguments:** :color: the color of the vtk object. Overides the colormap, if any, when specified. This is specified as a triplet of float ranging from 0 to 1, eg (1, 1, 1) for white. :colormap: type of colormap to use. :extent: [xmin, xmax, ymin, ymax, zmin, zmax] Default is the x, y, z arrays extent. Use this to change the extent of the object created. :figure: Figure to populate. :line_width: The width of the lines, if any used. Must be a float. Default: 2.0 :mask: boolean mask array to suppress some data points. :name: the name of the vtk object created. :opacity: The overall opacity of the vtk object. Must be a float. Default: 1.0 :representation: the representation type used for the surface. Must be 'surface' or 'wireframe' or 'points'. Default: surface :reset_zoom: Reset the zoom to accomodate the data newly added to the scene. Defaults to True. :transparent: make the opacity of the actor depend on the scalar. :vmax: vmax is used to scale the colormap. If None, the max of the data will be used :vmin: vmin is used to scale the colormap. If None, the min of the data will be used :warp_scale: scale of the z axis (warped from the value of the scalar). By default this scale is a float value. If you specify 'auto', the scale is calculated to give a pleasant aspect ratio to the plot, whatever the bounds of the data. If you specify a value for warp_scale in addition to an extent, the warp scale will be determined by the warp_scale, and the plot be positioned along the z axis with the zero of the data centered on the center of the extent. If you are using explicit extents, this is the best way to control the vertical scale of your plots. If you want to control the extent (or range) of the surface object, rather than its scale, see the `extent` keyword argument. **Example** (run in ``ipython -wthread``, ``ipython --gui=wx`` for recent IPython versions, or in the mayavi2 interactive shell, see :ref:`running-mlab-scripts` for more info):: import numpy from mayavi.mlab import * def test_surf(): """Test surf on regularly spaced co-ordinates like MayaVi.""" def f(x, y): sin, cos = numpy.sin, numpy.cos return sin(x + y) + sin(2 * x - y) + cos(3 * x + 4 * y) x, y = numpy.mgrid[-7.:7.05:0.1, -5.:5.05:0.05] s = surf(x, y, f) #cs = contour_surf(x, y, f, contour_z=0) return s triangular_mesh ~~~~~~~~~~~~~~~ .. function:: triangular_mesh(*args, **kwargs) Plots a surface using a mesh defined by the position of its vertices and the triangles connecting them. **Function signatures**:: triangular_mesh(x, y, z, triangles ...) x, y, z are arrays giving the positions of the vertices of the surface. triangles is a list of triplets (or an array) list the vertices in each triangle. Vertices are indexes by their appearance number in the position arrays. For simple structures (such as rectangular grids) prefer the surf or mesh functions, as they will create more efficient data structures. **Keyword arguments:** :color: the color of the vtk object. Overides the colormap, if any, when specified. This is specified as a triplet of float ranging from 0 to 1, eg (1, 1, 1) for white. :colormap: type of colormap to use. :extent: [xmin, xmax, ymin, ymax, zmin, zmax] Default is the x, y, z arrays extent. Use this to change the extent of the object created. :figure: Figure to populate. :line_width: The width of the lines, if any used. Must be a float. Default: 2.0 :mask: boolean mask array to suppress some data points. :mask_points: If supplied, only one out of 'mask_points' data point is displayed. This option is useful to reduce the number of points displayed on large datasets Must be an integer or None. :mode: the mode of the glyphs. Must be '2darrow' or '2dcircle' or '2dcross' or '2ddash' or '2ddiamond' or '2dhooked_arrow' or '2dsquare' or '2dthick_arrow' or '2dthick_cross' or '2dtriangle' or '2dvertex' or 'arrow' or 'axes' or 'cone' or 'cube' or 'cylinder' or 'point' or 'sphere'. Default: sphere :name: the name of the vtk object created. :opacity: The overall opacity of the vtk object. Must be a float. Default: 1.0 :representation: the representation type used for the surface. Must be 'surface' or 'wireframe' or 'points' or 'mesh' or 'fancymesh'. Default: surface :reset_zoom: Reset the zoom to accomodate the data newly added to the scene. Defaults to True. :resolution: The resolution of the glyph created. For spheres, for instance, this is the number of divisions along theta and phi. Must be an integer. Default: 8 :scalars: optional scalar data. :scale_factor: scale factor of the glyphs used to represent the vertices, in fancy_mesh mode. Must be a float. Default: 0.05 :scale_mode: the scaling mode for the glyphs ('vector', 'scalar', or 'none'). :transparent: make the opacity of the actor depend on the scalar. :tube_radius: radius of the tubes used to represent the lines, in mesh mode. If None, simple lines are used. :tube_sides: number of sides of the tubes used to represent the lines. Must be an integer. Default: 6 :vmax: vmax is used to scale the colormap. If None, the max of the data will be used :vmin: vmin is used to scale the colormap. If None, the min of the data will be used **Example** (run in ``ipython -wthread``, ``ipython --gui=wx`` for recent IPython versions, or in the mayavi2 interactive shell, see :ref:`running-mlab-scripts` for more info):: import numpy from mayavi.mlab import * def test_triangular_mesh(): """An example of a cone, ie a non-regular mesh defined by its triangles. """ n = 8 t = numpy.linspace(-numpy.pi, numpy.pi, n) z = numpy.exp(1j * t) x = z.real.copy() y = z.imag.copy() z = numpy.zeros_like(x) triangles = [(0, i, i + 1) for i in range(1, n)] x = numpy.r_[0, x] y = numpy.r_[0, y] z = numpy.r_[1, z] t = numpy.r_[0, t] return triangular_mesh(x, y, z, triangles, scalars=t) mayavi-4.5.0/docs/source/mayavi/auto/mlab_interactive_dialog.py0000644000076500000240000000522512747716313025320 0ustar prabhustaff00000000000000#!/usr/bin/env python """ An example of how to modify the data visualized via an interactive dialog. A dialog is created via `TraitsUI `_ from an object (MyModel). Some attributes of the objects are represented on the dialog: first a Mayavi scene, that will host our visualization, and two parameters that control the data plotted. A curve is plotted in the embedded scene using the associated mlab.points3d function. The visualization object created is stored as an attribute on the main MyModel object, to modify it inplace later. When the `n_meridional` and `n_longitudinal` attributes are modified, eg via the slide bars on the dialog, the curve is recomputed, and the visualization is updated by modifying inplace the stored plot object (see :ref:`mlab-animating-data`). This example is discussed in details in the section :ref:`embedding_mayavi_traits`. """ # Author: Gael Varoquaux # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. from numpy import arange, pi, cos, sin from traits.api import HasTraits, Range, Instance, \ on_trait_change from traitsui.api import View, Item, Group from mayavi.core.api import PipelineBase from mayavi.core.ui.api import MayaviScene, SceneEditor, \ MlabSceneModel dphi = pi/1000. phi = arange(0.0, 2*pi + 0.5*dphi, dphi, 'd') def curve(n_mer, n_long): mu = phi*n_mer x = cos(mu) * (1 + cos(n_long * mu/n_mer)*0.5) y = sin(mu) * (1 + cos(n_long * mu/n_mer)*0.5) z = 0.5 * sin(n_long*mu/n_mer) t = sin(mu) return x, y, z, t class MyModel(HasTraits): n_meridional = Range(0, 30, 6, )#mode='spinner') n_longitudinal = Range(0, 30, 11, )#mode='spinner') scene = Instance(MlabSceneModel, ()) plot = Instance(PipelineBase) # When the scene is activated, or when the parameters are changed, we # update the plot. @on_trait_change('n_meridional,n_longitudinal,scene.activated') def update_plot(self): x, y, z, t = curve(self.n_meridional, self.n_longitudinal) if self.plot is None: self.plot = self.scene.mlab.plot3d(x, y, z, t, tube_radius=0.025, colormap='Spectral') else: self.plot.mlab_source.set(x=x, y=y, z=z, scalars=t) # The layout of the dialog created view = View(Item('scene', editor=SceneEditor(scene_class=MayaviScene), height=250, width=300, show_label=False), Group( '_', 'n_meridional', 'n_longitudinal', ), resizable=True, ) my_model = MyModel() my_model.configure_traits() mayavi-4.5.0/docs/source/mayavi/auto/mlab_other_functions.rst0000644000076500000240000002750612747716313025063 0ustar prabhustaff00000000000000 .. currentmodule:: mayavi.mlab .. note:: This section is only a reference describing the function, please see the chapter on :ref:`simple-scripting-with-mlab` for an introduction to mlab and how to interact with and assemble the functions of `mlab`. Please see the section on :ref:`running-mlab-scripts` for instructions on running the examples. Other functions =============== animate ~~~~~~~ .. function:: animate(func=None, delay=500, ui=True) :: A convenient decorator to animate a generator that performs an animation. The `delay` parameter specifies the delay (in milliseconds) between calls to the decorated function. If `ui` is True, then a simple UI for the animator is also popped up. The decorated function will return the `Animator` instance used and a user may call its `Stop` method to stop the animation. If an ordinary function is decorated a `TypeError` will be raised. **Parameters** :delay: int specifying the time interval in milliseconds between calls to the function. :ui: bool specifying if a UI controlling the animation is to be provided. **Returns** The decorated function returns an `Animator` instance. **Examples** Here is the example provided in the Animator class documentation:: >>> from mayavi import mlab >>> @mlab.animate ... def anim(): ... f = mlab.gcf() ... while 1: ... f.scene.camera.azimuth(10) ... f.scene.render() ... yield ... >>> a = anim() # Starts the animation. For more specialized use you can pass arguments to the decorator:: >>> from mayavi import mlab >>> @mlab.animate(delay=500, ui=False) ... def anim(): ... f = mlab.gcf() ... while 1: ... f.scene.camera.azimuth(10) ... f.scene.render() ... yield ... >>> a = anim() # Starts the animation without a UI. **Notes** If you want to modify the data plotted by an `mlab` function call, please refer to the section on: :ref:`mlab-animating-data`. axes ~~~~ .. function:: axes(*args, **kwargs) Creates axes for the current (or given) object. **Keyword arguments:** :color: the color of the vtk object. Overides the colormap, if any, when specified. This is specified as a triplet of float ranging from 0 to 1, eg (1, 1, 1) for white. :extent: [xmin, xmax, ymin, ymax, zmin, zmax] Default is the object's extents. :figure: Must be a Scene or None. :line_width: The width of the lines, if any used. Must be a float. Default: 2.0 :name: the name of the vtk object created. :nb_labels: The number of labels along each direction Must be a legal value. Default: 2 :opacity: The overall opacity of the vtk object. Must be a float. Default: 1.0 :ranges: [xmin, xmax, ymin, ymax, zmin, zmax] Ranges of the labels displayed on the axes. Default is the object's extents. :x_axis_visibility: Whether or not the x axis is visible (boolean) :xlabel: the label of the x axis :y_axis_visibility: Whether or not the y axis is visible (boolean) :ylabel: the label of the y axis :z_axis_visibility: Whether or not the z axis is visible (boolean) :zlabel: the label of the z axis get_engine ~~~~~~~~~~ .. function:: get_engine(self) Returns an engine in agreement with the options. orientation_axes ~~~~~~~~~~~~~~~~ .. function:: orientation_axes(*args, **kwargs) Applies the OrientationAxes mayavi module to the given VTK data object. **Keyword arguments:** :color: the color of the vtk object. Overides the colormap, if any, when specified. This is specified as a triplet of float ranging from 0 to 1, eg (1, 1, 1) for white. :figure: Must be a Scene or None. :line_width: The width of the lines, if any used. Must be a float. Default: 2.0 :name: the name of the vtk object created. :opacity: The overall opacity of the vtk object. Must be a float. Default: 1.0 :xlabel: the label of the x axis :ylabel: the label of the y axis :zlabel: the label of the z axis outline ~~~~~~~ .. function:: outline(*args, **kwargs) Creates an outline for the current (or given) object. **Keyword arguments:** :color: the color of the vtk object. Overides the colormap, if any, when specified. This is specified as a triplet of float ranging from 0 to 1, eg (1, 1, 1) for white. :extent: [xmin, xmax, ymin, ymax, zmin, zmax] Default is the object's extents. :figure: Must be a Scene or None. :line_width: The width of the lines, if any used. Must be a float. Default: 2.0 :name: the name of the vtk object created. :opacity: The overall opacity of the vtk object. Must be a float. Default: 1.0 set_engine ~~~~~~~~~~ .. function:: set_engine(self, engine) Sets the mlab engine. show ~~~~ .. function:: show(func=None, stop=False) Start interacting with the figure. By default, this function simply creates a GUI and starts its event loop if needed. If it is used as a decorator, then it may be used to decorate a function which requires a UI. If the GUI event loop is already running it simply runs the function. If not the event loop is started and function is run in the toolkit's event loop. The choice of UI is via `ETSConfig.toolkit`. If the argument stop is set to True then it pops up a UI where the user can stop the event loop. Subsequent calls to `show` will restart the event loop. **Parameters** :stop: A boolean which specifies if a UI dialog is displayed which allows the event loop to be stopped. **Examples** Here is a simple example demonstrating the use of show:: >>> from mayavi import mlab >>> mlab.test_contour3d() >>> mlab.show() You can stop interaction via a simple pop up UI like so:: >>> mlab.test_contour3d() >>> mlab.show(stop=True) The decorator can be used like so:: >>> @mlab.show ... def do(): ... mlab.test_contour3d() ... >>> do() The decorator can also be passed the stop argument:: >>> @mlab.show(stop=True) ... def do(): ... mlab.test_contour3d() ... >>> do() show_engine ~~~~~~~~~~~ .. function:: show_engine() This function is deprecated, please use show_pipeline. show_pipeline ~~~~~~~~~~~~~ .. function:: show_pipeline(self, engine=None, rich_view=True) Show a dialog with the mayavi pipeline. This dialog allows to edit graphicaly the properties of the different objects on the scenes. start_recording ~~~~~~~~~~~~~~~ .. function:: start_recording(ui=True) Start automatic script recording. If the `ui` parameter is `True`, it creates a recorder with a user interface, if not it creates a vanilla recorder without a UI. **Returns** The `Recorder` instance created. stop_recording ~~~~~~~~~~~~~~ .. function:: stop_recording(file=None) Stop the automatic script recording. **Parameters** :file: An open file or a filename or `None`. If this is `None`, nothing is saved. text ~~~~ .. function:: text(*args, **kwargs) Adds a text on the figure. **Function signature**:: text(x, y, text, ...) x, and y are the position of the origin of the text. If no z keyword argument is given, x and y are the 2D projection of the figure, they belong to [0, 1]. If a z keyword argument is given, the text is positionned in 3D, in figure coordinnates. **Keyword arguments:** :color: the color of the vtk object. Overides the colormap, if any, when specified. This is specified as a triplet of float ranging from 0 to 1, eg (1, 1, 1) for white. :figure: Must be a Scene or None. :line_width: The width of the lines, if any used. Must be a float. Default: 2.0 :name: the name of the vtk object created. :opacity: The opacity of the text. :width: width of the text. :z: Optional z position. When specified, the text is positioned in 3D text3d ~~~~~~ .. function:: text3d(*args, **kwargs) Positions text at a 3D location in the scene. **Function signature**:: text3d(x, y, z, text, ...) x, y, and z are the position of the origin of the text. The text is positionned in 3D, in figure coordinnates. **Keyword arguments:** :color: the color of the vtk object. Overides the colormap, if any, when specified. This is specified as a triplet of float ranging from 0 to 1, eg (1, 1, 1) for white. :figure: Must be a Scene or None. :line_width: The width of the lines, if any used. Must be a float. Default: 2.0 :name: the name of the vtk object created. :opacity: The overall opacity of the vtk object. Must be a float. Default: 1.0 :orient_to_camera: if the text is kept oriented to the camera, or is pointing in a specific direction, regardless of the camera position. Must be a boolean. Default: True :orientation: the angles giving the orientation of the text. If the text is oriented to the camera, these angles are referenced to the axis of the camera. If not, these angles are referenced to the z axis. Must be an array with shape (3,). :scale: The scale of the text, in figure units. Either a float, or 3-tuple of floats. title ~~~~~ .. function:: title(*args, **kwargs) Creates a title for the figure. **Function signature**:: title(text, ...) **Keyword arguments:** :color: the color of the vtk object. Overides the colormap, if any, when specified. This is specified as a triplet of float ranging from 0 to 1, eg (1, 1, 1) for white. :figure: Must be a Scene or None. :height: height of the title, in portion of the figure height :line_width: The width of the lines, if any used. Must be a float. Default: 2.0 :name: the name of the vtk object created. :opacity: The overall opacity of the vtk object. Must be a float. Default: 1.0 :size: the size of the title mayavi-4.5.0/docs/source/mayavi/auto/mlab_pipeline_data.rst0000644000076500000240000000256312747716313024444 0ustar prabhustaff00000000000000 .. currentmodule:: mayavi.tools.pipeline .. note:: This section is only a reference describing the function, please see the chapter on :ref:`simple-scripting-with-mlab` for an introduction to mlab and how to interact with and assemble the functions of `mlab`. Please see the section on :ref:`running-mlab-scripts` for instructions on running the examples. Data ==== probe_data ~~~~~~~~~~ .. function:: probe_data(mayavi_object, x, y, z, type='scalars', location='points') Retrieve the data from a described by Mayavi visualization object at points x, y, z. **Parameters** :viz_obj: A Mayavi visualization object, or a VTK dataset The object describing the data you are interested in. :x: float or ndarray. The x position where you want to retrieve the data. :y: float or ndarray. The y position where you want to retrieve the data. :z: float or ndarray The z position where you want to retrieve the data. :type: 'scalars', 'vectors' or 'tensors', optional The type of the data to retrieve. :location: 'points' or 'cells', optional The location of the data to retrieve. **Returns** The values of the data at the given point, as an ndarray (or multiple arrays, in the case of vectors or tensors) of the same shape as x, y, and z. mayavi-4.5.0/docs/source/mayavi/auto/mlab_pipeline_other_functions.rst0000644000076500000240000014305112747716313026742 0ustar prabhustaff00000000000000 .. currentmodule:: mayavi.tools.pipeline .. note:: This section is only a reference describing the function, please see the chapter on :ref:`simple-scripting-with-mlab` for an introduction to mlab and how to interact with and assemble the functions of `mlab`. Please see the section on :ref:`running-mlab-scripts` for instructions on running the examples. Filters, modules, other functions ================================= cell_derivatives ~~~~~~~~~~~~~~~~ .. function:: cell_derivatives(*args, **kwargs) Calculate derivatives of input point/vector data and output these as cell data **Keyword arguments:** :figure: Must be a Scene or None. :name: the name of the vtk object created. cell_to_point_data ~~~~~~~~~~~~~~~~~~ .. function:: cell_to_point_data(*args, **kwargs) Convert cell data to point data for the active data **Keyword arguments:** :figure: Must be a Scene or None. :name: the name of the vtk object created. contour ~~~~~~~ .. function:: contour(*args, **kwargs) Compute contours of the input dataset **Keyword arguments:** :figure: Must be a Scene or None. :name: the name of the vtk object created. contour_grid_plane ~~~~~~~~~~~~~~~~~~ .. function:: contour_grid_plane(*args, **kwargs) :: Applies the ContourGridPlane mayavi module to the given data source (Mayavi source, or VTK dataset). **Keyword arguments:** :color: the color of the vtk object. Overides the colormap, if any, when specified. This is specified as a triplet of float ranging from 0 to 1, eg (1, 1, 1) for white. :colormap: type of colormap to use. :contours: Integer/list specifying number/list of contours. Specifying a list of values will only give the requested contours asked for. :extent: [xmin, xmax, ymin, ymax, zmin, zmax] Default is the x, y, z arrays extent. Use this to change the extent of the object created. :figure: Must be a Scene or None. :line_width: The width of the lines, if any used. Must be a float. Default: 2.0 :name: the name of the vtk object created. :opacity: The overall opacity of the vtk object. Must be a float. Default: 1.0 :reset_zoom: Reset the zoom to accomodate the data newly added to the scene. Defaults to True. :transparent: make the opacity of the actor depend on the scalar. :vmax: vmax is used to scale the colormap. If None, the max of the data will be used :vmin: vmin is used to scale the colormap. If None, the min of the data will be used contour_surface ~~~~~~~~~~~~~~~ .. function:: contour_surface(*args, **kwargs) Applies the Surface mayavi module to the given data source (Mayavi source, or VTK dataset) and turns contours on. **Keyword arguments:** :color: the color of the vtk object. Overides the colormap, if any, when specified. This is specified as a triplet of float ranging from 0 to 1, eg (1, 1, 1) for white. :colormap: type of colormap to use. :contours: Integer/list specifying number/list of contours. Specifying a list of values will only give the requested contours asked for. :extent: [xmin, xmax, ymin, ymax, zmin, zmax] Default is the x, y, z arrays extent. Use this to change the extent of the object created. :figure: Must be a Scene or None. :line_width: The width of the lines, if any used. Must be a float. Default: 2.0 :name: the name of the vtk object created. :opacity: The overall opacity of the vtk object. Must be a float. Default: 1.0 :reset_zoom: Reset the zoom to accomodate the data newly added to the scene. Defaults to True. :transparent: make the opacity of the actor depend on the scalar. :vmax: vmax is used to scale the colormap. If None, the max of the data will be used :vmin: vmin is used to scale the colormap. If None, the min of the data will be used custom_grid_plane ~~~~~~~~~~~~~~~~~ .. function:: custom_grid_plane(*args, **kwargs) :: Applies the CustomGridPlane mayavi module to the given VTK data source (Mayavi source, or VTK dataset). **Keyword arguments:** :color: the color of the vtk object. Overides the colormap, if any, when specified. This is specified as a triplet of float ranging from 0 to 1, eg (1, 1, 1) for white. :colormap: type of colormap to use. :contours: Integer/list specifying number/list of contours. Specifying a list of values will only give the requested contours asked for. :extent: [xmin, xmax, ymin, ymax, zmin, zmax] Default is the x, y, z arrays extent. Use this to change the extent of the object created. :figure: Must be a Scene or None. :line_width: The width of the lines, if any used. Must be a float. Default: 2.0 :name: the name of the vtk object created. :opacity: The overall opacity of the vtk object. Must be a float. Default: 1.0 :reset_zoom: Reset the zoom to accomodate the data newly added to the scene. Defaults to True. :transparent: make the opacity of the actor depend on the scalar. :vmax: vmax is used to scale the colormap. If None, the max of the data will be used :vmin: vmin is used to scale the colormap. If None, the min of the data will be used cut_plane ~~~~~~~~~ .. function:: cut_plane(*args, **kwargs) Slice the input dataset with a cut plane **Keyword arguments:** :figure: Must be a Scene or None. :name: the name of the vtk object created. data_set_clipper ~~~~~~~~~~~~~~~~ .. function:: data_set_clipper(*args, **kwargs) Clip the input dataset **Keyword arguments:** :figure: Must be a Scene or None. :name: the name of the vtk object created. decimate_pro ~~~~~~~~~~~~ .. function:: decimate_pro(*args, **kwargs) Simpilies a mesh using the DecimatePro filter **Keyword arguments:** :figure: Must be a Scene or None. :name: the name of the vtk object created. delaunay2d ~~~~~~~~~~ .. function:: delaunay2d(*args, **kwargs) Perform a 2D Delaunay triangulation for the given data **Keyword arguments:** :figure: Must be a Scene or None. :name: the name of the vtk object created. delaunay3d ~~~~~~~~~~ .. function:: delaunay3d(*args, **kwargs) Perform a 3D Delaunay triangulation for the given data **Keyword arguments:** :figure: Must be a Scene or None. :name: the name of the vtk object created. elevation ~~~~~~~~~ .. function:: elevation(*args, **kwargs) Creates scalar data from the elevation along a direction **Keyword arguments:** :figure: Must be a Scene or None. :name: the name of the vtk object created. elevation_filter ~~~~~~~~~~~~~~~~ .. function:: elevation_filter(*args, **kwargs) Applies the Elevation Filter mayavi filter to the given VTK object. **Keyword arguments:** :figure: Must be a Scene or None. :high_point: The end point of the projection line :low_point: The start point of the projection line :name: the name of the vtk object created. extract_edges ~~~~~~~~~~~~~ .. function:: extract_edges(*args, **kwargs) Turns edges into lines. **Keyword arguments:** :figure: Must be a Scene or None. :name: the name of the vtk object created. extract_grid ~~~~~~~~~~~~ .. function:: extract_grid(*args, **kwargs) Extract/subsample part of any structured grid **Keyword arguments:** :figure: Must be a Scene or None. :name: the name of the vtk object created. extract_tensor_components ~~~~~~~~~~~~~~~~~~~~~~~~~ .. function:: extract_tensor_components(*args, **kwargs) Extract tensor components from tensor data **Keyword arguments:** :figure: Must be a Scene or None. :name: the name of the vtk object created. extract_unstructured_grid ~~~~~~~~~~~~~~~~~~~~~~~~~ .. function:: extract_unstructured_grid(*args, **kwargs) Extract part of an unstructured grid **Keyword arguments:** :figure: Must be a Scene or None. :name: the name of the vtk object created. extract_vector_components ~~~~~~~~~~~~~~~~~~~~~~~~~ .. function:: extract_vector_components(*args, **kwargs) Extract vector components from vector data **Keyword arguments:** :figure: Must be a Scene or None. :name: the name of the vtk object created. extract_vector_norm ~~~~~~~~~~~~~~~~~~~ .. function:: extract_vector_norm(*args, **kwargs) Compute the vector norm for the current vector data **Keyword arguments:** :figure: Must be a Scene or None. :name: the name of the vtk object created. gaussian_splatter ~~~~~~~~~~~~~~~~~ .. function:: gaussian_splatter(*args, **kwargs) Builds a structured set of points from a cloud of points, the local density defining the scalar. It is essentially equivalent to a 3D Gaussian kernel density estimate. **Keyword arguments:** :figure: Must be a Scene or None. :name: the name of the vtk object created. glyph ~~~~~ .. function:: glyph(*args, **kwargs) Applies the Glyph mayavi module to the given VTK data source (Mayavi source, or VTK dataset). **Keyword arguments:** :color: the color of the vtk object. Overides the colormap, if any, when specified. This is specified as a triplet of float ranging from 0 to 1, eg (1, 1, 1) for white. :colormap: type of colormap to use. :extent: [xmin, xmax, ymin, ymax, zmin, zmax] Default is the x, y, z arrays extent. Use this to change the extent of the object created. :figure: Must be a Scene or None. :line_width: The width of the lines, if any used. Must be a float. Default: 2.0 :mask_points: If supplied, only one out of 'mask_points' data point is displayed. This option is useful to reduce the number of points displayed on large datasets Must be an integer or None. :mode: the mode of the glyphs. Must be '2darrow' or '2dcircle' or '2dcross' or '2ddash' or '2ddiamond' or '2dhooked_arrow' or '2dsquare' or '2dthick_arrow' or '2dthick_cross' or '2dtriangle' or '2dvertex' or 'arrow' or 'axes' or 'cone' or 'cube' or 'cylinder' or 'point' or 'sphere'. Default: sphere :name: the name of the vtk object created. :opacity: The overall opacity of the vtk object. Must be a float. Default: 1.0 :reset_zoom: Reset the zoom to accomodate the data newly added to the scene. Defaults to True. :resolution: The resolution of the glyph created. For spheres, for instance, this is the number of divisions along theta and phi. Must be an integer. Default: 8 :scale_factor: the scaling applied to the glyphs. The size of the glyph is by default in drawing units. Must be a float. Default: 1.0 :scale_mode: the scaling mode for the glyphs ('vector', 'scalar', or 'none'). :transparent: make the opacity of the actor depend on the scalar. :vmax: vmax is used to scale the colormap. If None, the max of the data will be used :vmin: vmin is used to scale the colormap. If None, the min of the data will be used greedy_terrain_decimation ~~~~~~~~~~~~~~~~~~~~~~~~~ .. function:: greedy_terrain_decimation(*args, **kwargs) Simplifies image data and performs a triangulation **Keyword arguments:** :figure: Must be a Scene or None. :name: the name of the vtk object created. grid_plane ~~~~~~~~~~ .. function:: grid_plane(*args, **kwargs) Shows a grid plane for the given input **Keyword arguments:** :color: the color of the vtk object. Overides the colormap, if any, when specified. This is specified as a triplet of float ranging from 0 to 1, eg (1, 1, 1) for white. :colormap: type of colormap to use. :extent: [xmin, xmax, ymin, ymax, zmin, zmax] Default is the x, y, z arrays extent. Use this to change the extent of the object created. :figure: Must be a Scene or None. :line_width: The width of the lines, if any used. Must be a float. Default: 2.0 :name: the name of the vtk object created. :opacity: The overall opacity of the vtk object. Must be a float. Default: 1.0 :reset_zoom: Reset the zoom to accomodate the data newly added to the scene. Defaults to True. :transparent: make the opacity of the actor depend on the scalar. :vmax: vmax is used to scale the colormap. If None, the max of the data will be used :vmin: vmin is used to scale the colormap. If None, the min of the data will be used hyper_streamline ~~~~~~~~~~~~~~~~ .. function:: hyper_streamline(*args, **kwargs) Shows hyper streamlines for tensor data **Keyword arguments:** :color: the color of the vtk object. Overides the colormap, if any, when specified. This is specified as a triplet of float ranging from 0 to 1, eg (1, 1, 1) for white. :colormap: type of colormap to use. :extent: [xmin, xmax, ymin, ymax, zmin, zmax] Default is the x, y, z arrays extent. Use this to change the extent of the object created. :figure: Must be a Scene or None. :line_width: The width of the lines, if any used. Must be a float. Default: 2.0 :name: the name of the vtk object created. :opacity: The overall opacity of the vtk object. Must be a float. Default: 1.0 :reset_zoom: Reset the zoom to accomodate the data newly added to the scene. Defaults to True. :transparent: make the opacity of the actor depend on the scalar. :vmax: vmax is used to scale the colormap. If None, the max of the data will be used :vmin: vmin is used to scale the colormap. If None, the min of the data will be used image_actor ~~~~~~~~~~~ .. function:: image_actor(*args, **kwargs) Applies the ImageActor mayavi module to the given VTK data object. **Keyword arguments:** :color: the color of the vtk object. Overides the colormap, if any, when specified. This is specified as a triplet of float ranging from 0 to 1, eg (1, 1, 1) for white. :colormap: type of colormap to use. :extent: [xmin, xmax, ymin, ymax, zmin, zmax] Default is the x, y, z arrays extent. Use this to change the extent of the object created. :figure: Must be a Scene or None. :interpolate: if the pixels in the image are to be interpolated or not. Must be a boolean. Default: True :line_width: The width of the lines, if any used. Must be a float. Default: 2.0 :name: the name of the vtk object created. :opacity: the opacity of the image. Must be a legal value. Default: 1.0 :reset_zoom: Reset the zoom to accomodate the data newly added to the scene. Defaults to True. :transparent: make the opacity of the actor depend on the scalar. :vmax: vmax is used to scale the colormap. If None, the max of the data will be used :vmin: vmin is used to scale the colormap. If None, the min of the data will be used image_change_information ~~~~~~~~~~~~~~~~~~~~~~~~ .. function:: image_change_information(*args, **kwargs) Change the origin, spacing and extents of an image dataset **Keyword arguments:** :figure: Must be a Scene or None. :name: the name of the vtk object created. image_data_probe ~~~~~~~~~~~~~~~~ .. function:: image_data_probe(*args, **kwargs) Samples arbitrary datasets onto an image dataset (cube of data) **Keyword arguments:** :figure: Must be a Scene or None. :name: the name of the vtk object created. image_plane_widget ~~~~~~~~~~~~~~~~~~ .. function:: image_plane_widget(*args, **kwargs) :: Applies the ImagePlaneWidget mayavi module to the given data source (Mayavi source, or VTK dataset). **Keyword arguments:** :color: the color of the vtk object. Overides the colormap, if any, when specified. This is specified as a triplet of float ranging from 0 to 1, eg (1, 1, 1) for white. :colormap: type of colormap to use. :extent: [xmin, xmax, ymin, ymax, zmin, zmax] Default is the x, y, z arrays extent. Use this to change the extent of the object created. :figure: Must be a Scene or None. :line_width: The width of the lines, if any used. Must be a float. Default: 2.0 :name: the name of the vtk object created. :opacity: The overall opacity of the vtk object. Must be a float. Default: 1.0 :plane_opacity: the opacity of the plane actor. Must be a legal value. Default: 1.0 :plane_orientation: the orientation of the plane Must be a legal value. Default: x_axes :reset_zoom: Reset the zoom to accomodate the data newly added to the scene. Defaults to True. :slice_index: The index along wich the image is sliced. :transparent: make the opacity of the actor depend on the scalar. :vmax: vmax is used to scale the colormap. If None, the max of the data will be used :vmin: vmin is used to scale the colormap. If None, the min of the data will be used iso_surface ~~~~~~~~~~~ .. function:: iso_surface(*args, **kwargs) Applies the IsoSurface mayavi module to the given data source (Mayavi source, or VTK dataset). **Keyword arguments:** :color: the color of the vtk object. Overides the colormap, if any, when specified. This is specified as a triplet of float ranging from 0 to 1, eg (1, 1, 1) for white. :colormap: type of colormap to use. :contours: Integer/list specifying number/list of contours. Specifying a list of values will only give the requested contours asked for. :extent: [xmin, xmax, ymin, ymax, zmin, zmax] Default is the x, y, z arrays extent. Use this to change the extent of the object created. :figure: Must be a Scene or None. :line_width: The width of the lines, if any used. Must be a float. Default: 2.0 :name: the name of the vtk object created. :opacity: The overall opacity of the vtk object. Must be a float. Default: 1.0 :reset_zoom: Reset the zoom to accomodate the data newly added to the scene. Defaults to True. :transparent: make the opacity of the actor depend on the scalar. :vmax: vmax is used to scale the colormap. If None, the max of the data will be used :vmin: vmin is used to scale the colormap. If None, the min of the data will be used labels ~~~~~~ .. function:: labels(*args, **kwargs) Display labels for active dataset or active module **Keyword arguments:** :color: the color of the vtk object. Overides the colormap, if any, when specified. This is specified as a triplet of float ranging from 0 to 1, eg (1, 1, 1) for white. :colormap: type of colormap to use. :extent: [xmin, xmax, ymin, ymax, zmin, zmax] Default is the x, y, z arrays extent. Use this to change the extent of the object created. :figure: Must be a Scene or None. :line_width: The width of the lines, if any used. Must be a float. Default: 2.0 :name: the name of the vtk object created. :opacity: The overall opacity of the vtk object. Must be a float. Default: 1.0 :reset_zoom: Reset the zoom to accomodate the data newly added to the scene. Defaults to True. :transparent: make the opacity of the actor depend on the scalar. :vmax: vmax is used to scale the colormap. If None, the max of the data will be used :vmin: vmin is used to scale the colormap. If None, the min of the data will be used mask_points ~~~~~~~~~~~ .. function:: mask_points(*args, **kwargs) Mask the input points in the data **Keyword arguments:** :figure: Must be a Scene or None. :name: the name of the vtk object created. outline ~~~~~~~ .. function:: outline(*args, **kwargs) Draw an outline for given input **Keyword arguments:** :color: the color of the vtk object. Overides the colormap, if any, when specified. This is specified as a triplet of float ranging from 0 to 1, eg (1, 1, 1) for white. :colormap: type of colormap to use. :extent: [xmin, xmax, ymin, ymax, zmin, zmax] Default is the x, y, z arrays extent. Use this to change the extent of the object created. :figure: Must be a Scene or None. :line_width: The width of the lines, if any used. Must be a float. Default: 2.0 :name: the name of the vtk object created. :opacity: The overall opacity of the vtk object. Must be a float. Default: 1.0 :reset_zoom: Reset the zoom to accomodate the data newly added to the scene. Defaults to True. :transparent: make the opacity of the actor depend on the scalar. :vmax: vmax is used to scale the colormap. If None, the max of the data will be used :vmin: vmin is used to scale the colormap. If None, the min of the data will be used point_to_cell_data ~~~~~~~~~~~~~~~~~~ .. function:: point_to_cell_data(*args, **kwargs) Convert point data to cell data for the active data **Keyword arguments:** :figure: Must be a Scene or None. :name: the name of the vtk object created. poly_data_normals ~~~~~~~~~~~~~~~~~ .. function:: poly_data_normals(*args, **kwargs) Compute normals and smooth the appearance **Keyword arguments:** :figure: Must be a Scene or None. :name: the name of the vtk object created. quadric_decimation ~~~~~~~~~~~~~~~~~~ .. function:: quadric_decimation(*args, **kwargs) Simplifies a triangular mesh **Keyword arguments:** :figure: Must be a Scene or None. :name: the name of the vtk object created. scalar_cut_plane ~~~~~~~~~~~~~~~~ .. function:: scalar_cut_plane(*args, **kwargs) :: Applies the ScalarCutPlane mayavi module to the given data source (Mayavi source, or VTK dataset). **Keyword arguments:** :color: the color of the vtk object. Overides the colormap, if any, when specified. This is specified as a triplet of float ranging from 0 to 1, eg (1, 1, 1) for white. :colormap: type of colormap to use. :extent: [xmin, xmax, ymin, ymax, zmin, zmax] Default is the x, y, z arrays extent. Use this to change the extent of the object created. :figure: Must be a Scene or None. :line_width: The width of the lines, if any used. Must be a float. Default: 2.0 :name: the name of the vtk object created. :opacity: The overall opacity of the vtk object. Must be a float. Default: 1.0 :plane_orientation: the orientation of the plane Must be a legal value. Default: x_axes :reset_zoom: Reset the zoom to accomodate the data newly added to the scene. Defaults to True. :transparent: make the opacity of the actor depend on the scalar. :view_controls: Whether or not the controls of the cut plane are shown. Must be a boolean. Default: True :vmax: vmax is used to scale the colormap. If None, the max of the data will be used :vmin: vmin is used to scale the colormap. If None, the min of the data will be used select_output ~~~~~~~~~~~~~ .. function:: select_output(*args, **kwargs) Choose the output of the source that should be used **Keyword arguments:** :figure: Must be a Scene or None. :name: the name of the vtk object created. set_active_attribute ~~~~~~~~~~~~~~~~~~~~ .. function:: set_active_attribute(*args, **kwargs) :: Applies the SetActiveAttribute Filter mayavi filter to the given VTK object. **Keyword arguments:** :cell_scalars: The name of the active cell scalars :cell_tensors: The name of the active cell tensors :cell_vectors: The name of the active cell vectors :figure: Must be a Scene or None. :name: the name of the vtk object created. :point_scalars: The name of the active point scalars :point_tensors: The name of the active point tensors :point_vectors: The name of the active point vectors slice_unstructured_grid ~~~~~~~~~~~~~~~~~~~~~~~ .. function:: slice_unstructured_grid(*args, **kwargs) Slice an unstructured grid to show cells **Keyword arguments:** :color: the color of the vtk object. Overides the colormap, if any, when specified. This is specified as a triplet of float ranging from 0 to 1, eg (1, 1, 1) for white. :colormap: type of colormap to use. :extent: [xmin, xmax, ymin, ymax, zmin, zmax] Default is the x, y, z arrays extent. Use this to change the extent of the object created. :figure: Must be a Scene or None. :line_width: The width of the lines, if any used. Must be a float. Default: 2.0 :name: the name of the vtk object created. :opacity: The overall opacity of the vtk object. Must be a float. Default: 1.0 :reset_zoom: Reset the zoom to accomodate the data newly added to the scene. Defaults to True. :transparent: make the opacity of the actor depend on the scalar. :vmax: vmax is used to scale the colormap. If None, the max of the data will be used :vmin: vmin is used to scale the colormap. If None, the min of the data will be used streamline ~~~~~~~~~~ .. function:: streamline(*args, **kwargs) Applies the Streamline mayavi module to the given VTK data object. **Keyword arguments:** :color: the color of the vtk object. Overides the colormap, if any, when specified. This is specified as a triplet of float ranging from 0 to 1, eg (1, 1, 1) for white. :colormap: type of colormap to use. :extent: [xmin, xmax, ymin, ymax, zmin, zmax] Default is the x, y, z arrays extent. Use this to change the extent of the object created. :figure: Must be a Scene or None. :integration_direction: The direction of the integration. Must be 'forward' or 'backward' or 'both'. Default: forward :line_width: The width of the lines, if any used. Must be a float. Default: 2.0 :linetype: the type of line-like object used to display the streamline. Must be 'line' or 'ribbon' or 'tube'. Default: line :name: the name of the vtk object created. :opacity: The overall opacity of the vtk object. Must be a float. Default: 1.0 :reset_zoom: Reset the zoom to accomodate the data newly added to the scene. Defaults to True. :seed_resolution: The resolution of the seed. Determines the number of seed points Must be an integer or None. :seed_scale: Scales the seed around its default center Must be a float. Default: 1.0 :seed_visible: Control the visibility of the seed. Must be a boolean. Default: True :seedtype: the widget used as a seed for the streamlines. Must be 'line' or 'plane' or 'point' or 'sphere'. Default: sphere :transparent: make the opacity of the actor depend on the scalar. :vmax: vmax is used to scale the colormap. If None, the max of the data will be used :vmin: vmin is used to scale the colormap. If None, the min of the data will be used stripper ~~~~~~~~ .. function:: stripper(*args, **kwargs) Regularizes surfaces by creating triangle strips **Keyword arguments:** :figure: Must be a Scene or None. :name: the name of the vtk object created. structured_grid_outline ~~~~~~~~~~~~~~~~~~~~~~~ .. function:: structured_grid_outline(*args, **kwargs) Draw a grid-conforming outline for structured grids **Keyword arguments:** :color: the color of the vtk object. Overides the colormap, if any, when specified. This is specified as a triplet of float ranging from 0 to 1, eg (1, 1, 1) for white. :colormap: type of colormap to use. :extent: [xmin, xmax, ymin, ymax, zmin, zmax] Default is the x, y, z arrays extent. Use this to change the extent of the object created. :figure: Must be a Scene or None. :line_width: The width of the lines, if any used. Must be a float. Default: 2.0 :name: the name of the vtk object created. :opacity: The overall opacity of the vtk object. Must be a float. Default: 1.0 :reset_zoom: Reset the zoom to accomodate the data newly added to the scene. Defaults to True. :transparent: make the opacity of the actor depend on the scalar. :vmax: vmax is used to scale the colormap. If None, the max of the data will be used :vmin: vmin is used to scale the colormap. If None, the min of the data will be used surface ~~~~~~~ .. function:: surface(*args, **kwargs) Applies the Surface mayavi module to the given data source (Mayavi source, or VTK dataset). **Keyword arguments:** :color: the color of the vtk object. Overides the colormap, if any, when specified. This is specified as a triplet of float ranging from 0 to 1, eg (1, 1, 1) for white. :colormap: type of colormap to use. :extent: [xmin, xmax, ymin, ymax, zmin, zmax] Default is the x, y, z arrays extent. Use this to change the extent of the object created. :figure: Must be a Scene or None. :line_width: The width of the lines, if any used. Must be a float. Default: 2.0 :name: the name of the vtk object created. :opacity: The overall opacity of the vtk object. Must be a float. Default: 1.0 :representation: the representation type used for the surface. Must be 'surface' or 'wireframe' or 'points'. Default: surface :reset_zoom: Reset the zoom to accomodate the data newly added to the scene. Defaults to True. :transparent: make the opacity of the actor depend on the scalar. :vmax: vmax is used to scale the colormap. If None, the max of the data will be used :vmin: vmin is used to scale the colormap. If None, the min of the data will be used tensor_glyph ~~~~~~~~~~~~ .. function:: tensor_glyph(*args, **kwargs) Displays glyphs scaled and oriented as per tensor data **Keyword arguments:** :color: the color of the vtk object. Overides the colormap, if any, when specified. This is specified as a triplet of float ranging from 0 to 1, eg (1, 1, 1) for white. :colormap: type of colormap to use. :extent: [xmin, xmax, ymin, ymax, zmin, zmax] Default is the x, y, z arrays extent. Use this to change the extent of the object created. :figure: Must be a Scene or None. :line_width: The width of the lines, if any used. Must be a float. Default: 2.0 :name: the name of the vtk object created. :opacity: The overall opacity of the vtk object. Must be a float. Default: 1.0 :reset_zoom: Reset the zoom to accomodate the data newly added to the scene. Defaults to True. :transparent: make the opacity of the actor depend on the scalar. :vmax: vmax is used to scale the colormap. If None, the max of the data will be used :vmin: vmin is used to scale the colormap. If None, the min of the data will be used text3d ~~~~~~ .. function:: text3d(*args, **kwargs) Displays user-specified text at a 3D location in the scene **Keyword arguments:** :color: the color of the vtk object. Overides the colormap, if any, when specified. This is specified as a triplet of float ranging from 0 to 1, eg (1, 1, 1) for white. :colormap: type of colormap to use. :extent: [xmin, xmax, ymin, ymax, zmin, zmax] Default is the x, y, z arrays extent. Use this to change the extent of the object created. :figure: Must be a Scene or None. :line_width: The width of the lines, if any used. Must be a float. Default: 2.0 :name: the name of the vtk object created. :opacity: The overall opacity of the vtk object. Must be a float. Default: 1.0 :reset_zoom: Reset the zoom to accomodate the data newly added to the scene. Defaults to True. :transparent: make the opacity of the actor depend on the scalar. :vmax: vmax is used to scale the colormap. If None, the max of the data will be used :vmin: vmin is used to scale the colormap. If None, the min of the data will be used threshold ~~~~~~~~~ .. function:: threshold(*args, **kwargs) Applies the Threshold mayavi filter to the given VTK object. **Keyword arguments:** :figure: Must be a Scene or None. :filter_type: If threshold is put on cells or points :low: The lower threshold :name: the name of the vtk object created. :up: The upper threshold transform_data ~~~~~~~~~~~~~~ .. function:: transform_data(*args, **kwargs) Transform (rotate/translate/scale) non ImageData datasets **Keyword arguments:** :figure: Must be a Scene or None. :name: the name of the vtk object created. triangle_filter ~~~~~~~~~~~~~~~ .. function:: triangle_filter(*args, **kwargs) Convert input polygons and triangle strips to triangles **Keyword arguments:** :figure: Must be a Scene or None. :name: the name of the vtk object created. tube ~~~~ .. function:: tube(*args, **kwargs) Applies the Tube mayavi filter to the given VTK object. **Keyword arguments:** :figure: Must be a Scene or None. :name: the name of the vtk object created. :tube_radius: radius of the tubes used to represent the lines. Must be a float. Default: 0.05 :tube_sides: number of sides of the tubes used to represent the lines. Must be an integer. Default: 6 user_defined ~~~~~~~~~~~~ .. function:: user_defined(*args, **kwargs) Applies the UserDefined mayavi filter to the given TVTK object. **Keyword arguments:** :figure: Must be a Scene or None. :filter: the tvtk filter to adapt. Thisbe either an instance of the filter, or thename of this filter. :name: the name of the vtk object created. vector_cut_plane ~~~~~~~~~~~~~~~~ .. function:: vector_cut_plane(*args, **kwargs) :: Applies the VectorCutPlane mayavi module to the given data source (Mayavi source, or VTK dataset). **Keyword arguments:** :color: the color of the vtk object. Overides the colormap, if any, when specified. This is specified as a triplet of float ranging from 0 to 1, eg (1, 1, 1) for white. :colormap: type of colormap to use. :extent: [xmin, xmax, ymin, ymax, zmin, zmax] Default is the x, y, z arrays extent. Use this to change the extent of the object created. :figure: Must be a Scene or None. :line_width: The width of the lines, if any used. Must be a float. Default: 2.0 :mask_points: If supplied, only one out of 'mask_points' data point is displayed. This option is useful to reduce the number of points displayed on large datasets Must be an integer or None. :mode: the mode of the glyphs. Must be '2darrow' or '2dcircle' or '2dcross' or '2ddash' or '2ddiamond' or '2dhooked_arrow' or '2dsquare' or '2dthick_arrow' or '2dthick_cross' or '2dtriangle' or '2dvertex' or 'arrow' or 'axes' or 'cone' or 'cube' or 'cylinder' or 'point' or 'sphere'. Default: 2darrow :name: the name of the vtk object created. :opacity: The overall opacity of the vtk object. Must be a float. Default: 1.0 :plane_orientation: the orientation of the plane Must be a legal value. Default: x_axes :reset_zoom: Reset the zoom to accomodate the data newly added to the scene. Defaults to True. :resolution: The resolution of the glyph created. For spheres, for instance, this is the number of divisions along theta and phi. Must be an integer. Default: 8 :scale_factor: the scaling applied to the glyphs. The size of the glyph is by default in drawing units. Must be a float. Default: 1.0 :scale_mode: the scaling mode for the glyphs ('vector', 'scalar', or 'none'). :transparent: make the opacity of the actor depend on the scalar. :view_controls: Whether or not the controls of the cut plane are shown. Must be a boolean. Default: True :vmax: vmax is used to scale the colormap. If None, the max of the data will be used :vmin: vmin is used to scale the colormap. If None, the min of the data will be used vectors ~~~~~~~ .. function:: vectors(*args, **kwargs) Applies the Vectors mayavi module to the given data object source (Mayavi source, or VTK dataset). **Keyword arguments:** :color: the color of the vtk object. Overides the colormap, if any, when specified. This is specified as a triplet of float ranging from 0 to 1, eg (1, 1, 1) for white. :colormap: type of colormap to use. :extent: [xmin, xmax, ymin, ymax, zmin, zmax] Default is the x, y, z arrays extent. Use this to change the extent of the object created. :figure: Must be a Scene or None. :line_width: The width of the lines, if any used. Must be a float. Default: 2.0 :mask_points: If supplied, only one out of 'mask_points' data point is displayed. This option is useful to reduce the number of points displayed on large datasets Must be an integer or None. :mode: the mode of the glyphs. Must be '2darrow' or '2dcircle' or '2dcross' or '2ddash' or '2ddiamond' or '2dhooked_arrow' or '2dsquare' or '2dthick_arrow' or '2dthick_cross' or '2dtriangle' or '2dvertex' or 'arrow' or 'axes' or 'cone' or 'cube' or 'cylinder' or 'point' or 'sphere'. Default: 2darrow :name: the name of the vtk object created. :opacity: The overall opacity of the vtk object. Must be a float. Default: 1.0 :reset_zoom: Reset the zoom to accomodate the data newly added to the scene. Defaults to True. :resolution: The resolution of the glyph created. For spheres, for instance, this is the number of divisions along theta and phi. Must be an integer. Default: 8 :scale_factor: the scaling applied to the glyphs. The size of the glyph is by default in drawing units. Must be a float. Default: 1.0 :scale_mode: the scaling mode for the glyphs ('vector', 'scalar', or 'none'). :transparent: make the opacity of the actor depend on the scalar. :vmax: vmax is used to scale the colormap. If None, the max of the data will be used :vmin: vmin is used to scale the colormap. If None, the min of the data will be used volume ~~~~~~ .. function:: volume(*args, **kwargs) :: Applies the Volume mayavi module to the given VTK data source (Mayavi source, or VTK dataset). **Note** The range of the colormap can be changed simply using the vmin/vmax parameters (see below). For more complex modifications of the colormap, here is some pseudo code to change the ctf (color transfer function), or the otf (opacity transfer function):: vol = mlab.pipeline.volume(src) # Changing the ctf: from tvtk.util.ctf import ColorTransferFunction ctf = ColorTransferFunction() ctf.add_rgb_point(value, r, g, b) # r, g, and b are float # between 0 and 1 ctf.add_hsv_point(value, h, s, v) # ... vol._volume_property.set_color(ctf) vol._ctf = ctf vol.update_ctf = True # Changing the otf: from tvtk.util.ctf import PiecewiseFunction otf = PiecewiseFunction() otf.add_point(value, opacity) vol._otf = otf vol._volume_property.set_scalar_opacity(otf) Also, it might be useful to change the range of the ctf:: ctf.range = [0, 1] **Keyword arguments:** :color: the color of the vtk object. Overides the colormap, if any, when specified. This is specified as a triplet of float ranging from 0 to 1, eg (1, 1, 1) for white. :figure: Must be a Scene or None. :name: the name of the vtk object created. :vmax: vmax is used to scale the transparency gradient. If None, the max of the data will be used :vmin: vmin is used to scale the transparency gradient. If None, the min of the data will be used vorticity ~~~~~~~~~ .. function:: vorticity(*args, **kwargs) Calculate the vorticity (curl) of input vector field **Keyword arguments:** :figure: Must be a Scene or None. :name: the name of the vtk object created. warp_scalar ~~~~~~~~~~~ .. function:: warp_scalar(*args, **kwargs) Applies the WarpScalar mayavi filter to the given VTK object. **Keyword arguments:** :figure: Must be a Scene or None. :name: the name of the vtk object created. :warp_scale: scale of the warp scalar warp_vector ~~~~~~~~~~~ .. function:: warp_vector(*args, **kwargs) Move points of data along the vector data at point **Keyword arguments:** :figure: Must be a Scene or None. :name: the name of the vtk object created. warp_vector_cut_plane ~~~~~~~~~~~~~~~~~~~~~ .. function:: warp_vector_cut_plane(*args, **kwargs) Warp cut plane along scaled input vectors **Keyword arguments:** :color: the color of the vtk object. Overides the colormap, if any, when specified. This is specified as a triplet of float ranging from 0 to 1, eg (1, 1, 1) for white. :colormap: type of colormap to use. :extent: [xmin, xmax, ymin, ymax, zmin, zmax] Default is the x, y, z arrays extent. Use this to change the extent of the object created. :figure: Must be a Scene or None. :line_width: The width of the lines, if any used. Must be a float. Default: 2.0 :name: the name of the vtk object created. :opacity: The overall opacity of the vtk object. Must be a float. Default: 1.0 :reset_zoom: Reset the zoom to accomodate the data newly added to the scene. Defaults to True. :transparent: make the opacity of the actor depend on the scalar. :vmax: vmax is used to scale the colormap. If None, the max of the data will be used :vmin: vmin is used to scale the colormap. If None, the min of the data will be used mayavi-4.5.0/docs/source/mayavi/auto/mlab_pipeline_reference.rst0000644000076500000240000000107612747716313025467 0ustar prabhustaff00000000000000 .. _mlab-pipeline-reference: MLab pipeline reference ======================== Reference list of all the main functions of ``pipeline`` sub module of ``mlab``. You can access these functions using:: mlab.pipeline.function(...) These functions can be used for finer control of the Mayavi pipeline than the main mlab interface. For usage examples, see :ref:`ontrolling-the-pipeline-with-mlab-scripts`. .. module:: mayavi.tools.pipeline .. toctree:: mlab_pipeline_sources.rst mlab_pipeline_tools.rst mlab_pipeline_data.rst mlab_pipeline_other_functions.rst mayavi-4.5.0/docs/source/mayavi/auto/mlab_pipeline_sources.rst0000644000076500000240000003103212747716313025207 0ustar prabhustaff00000000000000 .. currentmodule:: mayavi.tools.pipeline .. note:: This section is only a reference describing the function, please see the chapter on :ref:`simple-scripting-with-mlab` for an introduction to mlab and how to interact with and assemble the functions of `mlab`. Please see the section on :ref:`running-mlab-scripts` for instructions on running the examples. Sources ======= array2d_source ~~~~~~~~~~~~~~ .. function:: array2d_source(*args, **kwargs) Creates structured 2D data from a 2D array. **Function signatures**:: array2d_source(s, ...) array2d_source(x, y, s, ...) array2d_source(x, y, f, ...) If 3 positional arguments are passed the last one must be an array s, or a callable, f, that returns an array. x and y give the coordinnates of positions corresponding to the s values. x and y can be 1D or 2D arrays (such as returned by numpy.ogrid or numpy.mgrid), but the points should be located on an orthogonal grid (possibly non-uniform). In other words, all the points sharing a same index in the s array need to have the same x or y value. If only 1 array s is passed the x and y arrays are assumed to be made from the indices of arrays, and an uniformly-spaced data set is created. **Keyword arguments**: :name: the name of the vtk object created. :figure: optionally, the figure on which to add the data source. If None, the source is not added to any figure, and will be added automatically by the modules or filters. If False, no figure will be created by modules or filters applied to the source: the source can only be used for testing, or numerical algorithms, not visualization. :mask: Mask points specified in a boolean masking array. builtin_image ~~~~~~~~~~~~~ .. function:: builtin_image(metadata=) Create a vtk image data source builtin_surface ~~~~~~~~~~~~~~~ .. function:: builtin_surface(metadata=) Create a vtk poly data source chaco_file ~~~~~~~~~~ .. function:: chaco_file(metadata=) Open a Chaco file grid_source ~~~~~~~~~~~ .. function:: grid_source(x, y, z, **kwargs) Creates 2D grid data. x, y, z are 2D arrays giving the positions of the vertices of the surface. The connectivity between these points is implied by the connectivity on the arrays. For simple structures (such as orthogonal grids) prefer the array2dsource function, as it will create more efficient data structures. **Keyword arguments**: :name: the name of the vtk object created. :scalars: optional scalar data. :figure: optionally, the figure on which to add the data source. If None, the source is not added to any figure, and will be added automatically by the modules or filters. If False, no figure will be created by modules or filters applied to the source: the source can only be used for testing, or numerical algorithms, not visualization. :mask: Mask points specified in a boolean masking array. line_source ~~~~~~~~~~~ .. function:: line_source(*args, **kwargs) Creates line data. **Function signatures**:: line_source(x, y, z, ...) line_source(x, y, z, s, ...) line_source(x, y, z, f, ...) If 4 positional arguments are passed the last one must be an array s, or a callable, f, that returns an array. **Keyword arguments**: :name: the name of the vtk object created. :figure: optionally, the figure on which to add the data source. If None, the source is not added to any figure, and will be added automatically by the modules or filters. If False, no figure will be created by modules or filters applied to the source: the source can only be used for testing, or numerical algorithms, not visualization. open ~~~~ .. function:: open(filename, figure=None) Open a supported data file given a filename. Returns the source object if a suitable reader was found for the file. If 'figure' is False, no view is opened, and the code does not need GUI or openGL context. parametric_surface ~~~~~~~~~~~~~~~~~~ .. function:: parametric_surface(metadata=) Create a parametric surface source point_load ~~~~~~~~~~ .. function:: point_load(metadata=) Simulates a point load on a cube of data (for tensors) scalar_field ~~~~~~~~~~~~ .. function:: scalar_field(*args, **kwargs) Creates a scalar field data. **Function signatures**:: scalar_field(s, ...) scalar_field(x, y, z, s, ...) scalar_field(x, y, z, f, ...) If only 1 array s is passed the x, y and z arrays are assumed to be made from the indices of arrays. If the x, y and z arrays are passed they are supposed to have been generated by `numpy.mgrid`. The function builds a scalar field assuming the points are regularily spaced. If 4 positional arguments are passed the last one must be an array s, or a callable, f, that returns an array. **Keyword arguments**: :name: the name of the vtk object created. :figure: optionally, the figure on which to add the data source. If None, the source is not added to any figure, and will be added automatically by the modules or filters. If False, no figure will be created by modules or filters applied to the source: the source can only be used for testing, or numerical algorithms, not visualization. scalar_scatter ~~~~~~~~~~~~~~ .. function:: scalar_scatter(*args, **kwargs) Creates scattered scalar data. **Function signatures**:: scalar_scatter(s, ...) scalar_scatter(x, y, z, s, ...) scalar_scatter(x, y, z, s, ...) scalar_scatter(x, y, z, f, ...) If only 1 array s is passed the x, y and z arrays are assumed to be made from the indices of vectors. If 4 positional arguments are passed the last one must be an array s, or a callable, f, that returns an array. **Keyword arguments**: :name: the name of the vtk object created. :figure: optionally, the figure on which to add the data source. If None, the source is not added to any figure, and will be added automatically by the modules or filters. If False, no figure will be created by modules or filters applied to the source: the source can only be used for testing, or numerical algorithms, not visualization. triangular_mesh_source ~~~~~~~~~~~~~~~~~~~~~~ .. function:: triangular_mesh_source(x, y, z, triangles, **kwargs) Creates 2D mesh by specifying points and triangle connectivity. x, y, z are 2D arrays giving the positions of the vertices of the surface. The connectivity between these points is given by listing triplets of vertices inter-connected. These vertices are designed by there position index. **Keyword arguments**: :name: the name of the vtk object created. :scalars: optional scalar data. :figure: optionally, the figure on which to add the data source. If None, the source is not added to any figure, and will be added automatically by the modules or filters. If False, no figure will be created by modules or filters applied to the source: the source can only be used for testing, or numerical algorithms, not visualization. vector_field ~~~~~~~~~~~~ .. function:: vector_field(*args, **kwargs) Creates vector field data. **Function signatures**:: vector_field(u, v, w, ...) vector_field(x, y, z, u, v, w, ...) vector_field(x, y, z, f, ...) If only 3 arrays u, v, w are passed the x, y and z arrays are assumed to be made from the indices of vectors. If the x, y and z arrays are passed, they should have been generated by `numpy.mgrid` or `numpy.ogrid`. The function builds a scalar field assuming the points are regularily spaced on an orthogonal grid. If 4 positional arguments are passed the last one must be a callable, f, that returns vectors. **Keyword arguments**: :name: the name of the vtk object created. :scalars: optional scalar data. :figure: optionally, the figure on which to add the data source. If None, the source is not added to any figure, and will be added automatically by the modules or filters. If False, no figure will be created by modules or filters applied to the source: the source can only be used for testing, or numerical algorithms, not visualization. vector_scatter ~~~~~~~~~~~~~~ .. function:: vector_scatter(*args, **kwargs) Creates scattered vector data. **Function signatures**:: vector_scatter(u, v, w, ...) vector_scatter(x, y, z, u, v, w, ...) vector_scatter(x, y, z, f, ...) If only 3 arrays u, v, w are passed the x, y and z arrays are assumed to be made from the indices of vectors. If 4 positional arguments are passed the last one must be a callable, f, that returns vectors. **Keyword arguments**: :name: the name of the vtk object created. :scalars: optional scalar data. :figure: optionally, the figure on which to add the data source. If None, the source is not added to any figure, and will be added automatically by the modules or filters. If False, no figure will be created by modules or filters applied to the source: the source can only be used for testing, or numerical algorithms, not visualization. vertical_vectors_source ~~~~~~~~~~~~~~~~~~~~~~~ .. function:: vertical_vectors_source(*args, **kwargs) Creates a set of vectors pointing upward, useful eg for bar graphs. **Function signatures**:: vertical_vectors_source(s, ...) vertical_vectors_source(x, y, s, ...) vertical_vectors_source(x, y, f, ...) vertical_vectors_source(x, y, z, s, ...) vertical_vectors_source(x, y, z, f, ...) If only one positional argument is passed, it can be a 1D, 2D, or 3D array giving the length of the vectors. The positions of the data points are deducted from the indices of array, and an uniformly-spaced data set is created. If 3 positional arguments (x, y, s) are passed the last one must be an array s, or a callable, f, that returns an array. x and y give the 2D coordinates of positions corresponding to the s values. The vertical position is assumed to be 0. If 4 positional arguments (x, y, z, s) are passed, the 3 first are arrays giving the 3D coordinates of the data points, and the last one is an array s, or a callable, f, that returns an array giving the data value. **Keyword arguments**: :name: the name of the vtk object created. :figure: optionally, the figure on which to add the data source. If None, the source is not added to any figure, and will be added automatically by the modules or filters. If False, no figure will be created by modules or filters applied to the source: the source can only be used for testing, or numerical algorithms, not visualization. volume_file ~~~~~~~~~~~ .. function:: volume_file(metadata=) Open a Volume file mayavi-4.5.0/docs/source/mayavi/auto/mlab_pipeline_tools.rst0000644000076500000240000000716312747716313024674 0ustar prabhustaff00000000000000 .. currentmodule:: mayavi.tools.pipeline .. note:: This section is only a reference describing the function, please see the chapter on :ref:`simple-scripting-with-mlab` for an introduction to mlab and how to interact with and assemble the functions of `mlab`. Please see the section on :ref:`running-mlab-scripts` for instructions on running the examples. Tools ===== add_dataset ~~~~~~~~~~~ .. function:: add_dataset(dataset, name='', **kwargs) Add a dataset object to the Mayavi pipeline. **Parameters** :dataset: a tvtk dataset, or a Mayavi source. The dataset added to the Mayavi pipeline :figure: a figure identifier number or string, None or False, optionnal. If no `figure` keyword argument is given, the data is added to the current figure (a new figure if created if necessary). If a `figure` keyword argument is given, it should either the name the number of the figure the dataset should be added to, or None, in which case the data is not added to the pipeline. If figure is False, a null engine is created. This null engine does not create figures, and is mainly usefull for tensting, or using the VTK algorithms without visualization. **Returns** The corresponding Mayavi source is returned. add_module_manager ~~~~~~~~~~~~~~~~~~ .. function:: add_module_manager(object) Add a module-manager, to control colors and legend bars to the given object. get_vtk_src ~~~~~~~~~~~ .. function:: get_vtk_src(mayavi_object, stop_at_filter=True) Goes up the Mayavi pipeline to find the data sources of a given object. **Parameters** :object: any Mayavi visualization object :stop_at_filter: optional boolean flag: if True, the first object exposing data found going up the pipeline is returned. If False, only the source itself is returned. **Returns** :sources: List of vtk data sources (vtk data sources, and not Mayavi source objects). **Notes** This function traverses the Mayavi pipeline. Thus the input object 'mayavi_object' should already be added to the pipeline. set_extent ~~~~~~~~~~ .. function:: set_extent(module, extents) Attempts to set the physical extents of the given module. The extents are given as (xmin, xmax, ymin, ymax, zmin, zmax). This does not work on an image plane widget, as this module does not have an actor. Once you use this function on a module, be aware that other modules applied on the same data source will not share the same scale. Thus for instance an outline module will not respect the outline of the actors whose extent you modified. You should pass in the same "extents" parameter for this to work.You can have a look at the wigner.py example for a heavy use of this functionnality. **Note** This function does not work on some specific modules, such as Outline, Axes, or ImagePlaneWidget. For Outline and Axes, use the extent keyword argument of mlab.pipeline.outline and mlab.pipeline.axes. traverse ~~~~~~~~ .. function:: traverse(node) Generator to traverse a tree accessing the nodes' children attribute. **Example** Here is a simple example printing the names of all the objects in the pipeline:: for obj in mlab.pipeline.traverse(mlab.gcf()): print obj.name mayavi-4.5.0/docs/source/mayavi/auto/mlab_reference.rst0000644000076500000240000000112012747716313023570 0ustar prabhustaff00000000000000 .. _mlab-reference: MLab reference ================= Reference list of all the main functions of ``mayavi.mlab`` with documentation and examples. .. note:: This section is only a reference describing the function, please see the chapter on :ref:`simple-scripting-with-mlab` for an introduction to mlab and how to run the examples or interact with and assemble the functions of `mlab`. .. module:: mayavi.mlab .. toctree:: mlab_helper_functions.rst mlab_figure.rst mlab_decorations.rst mlab_camera.rst mlab_other_functions.rst ../mlab_pipeline_reference.rst mayavi-4.5.0/docs/source/mayavi/auto/mlab_traits_ui.py0000644000076500000240000000330112747716313023460 0ustar prabhustaff00000000000000#!/usr/bin/env python """A simple example of how to use mayavi.mlab inside a traits UI dialog. This example uses traitsUI ( `traitsUI `_ ) to create a the simplest possible dialog: a single Mayavi scene in a window. """ # Authors: Prabhu Ramachandran # Gael Varoquaux # Copyright (c) 2007, Enthought, Inc. # License: BSD Style. # Standard imports. from numpy import sqrt, sin, mgrid # Enthought imports. from traits.api import HasTraits, Instance from traitsui.api import View, Item from tvtk.pyface.scene_editor import SceneEditor from mayavi.tools.mlab_scene_model import MlabSceneModel from mayavi.core.ui.mayavi_scene import MayaviScene ###################################################################### class ActorViewer(HasTraits): # The scene model. scene = Instance(MlabSceneModel, ()) ###################### # Using 'scene_class=MayaviScene' adds a Mayavi icon to the toolbar, # to pop up a dialog editing the pipeline. view = View(Item(name='scene', editor=SceneEditor(scene_class=MayaviScene), show_label=False, resizable=True, height=500, width=500), resizable=True ) def __init__(self, **traits): HasTraits.__init__(self, **traits) self.generate_data() def generate_data(self): # Create some data X, Y = mgrid[-2:2:100j, -2:2:100j] R = 10*sqrt(X**2 + Y**2) Z = sin(R)/R self.scene.mlab.surf(X, Y, Z, colormap='gist_earth') if __name__ == '__main__': a = ActorViewer() a.configure_traits() mayavi-4.5.0/docs/source/mayavi/auto/mlab_visual.py0000644000076500000240000000251712747716313022770 0ustar prabhustaff00000000000000#!/usr/bin/env python """ A very simple example to show how you can use TVTK's visual module with mlab and create simple animations. In the example, the grey box bounces back and forth between the two red ones. The `tvtk.tools.visual` module exposes an API similar to `VPython `_ and is useful to create animation based on rigid object movement. The `@animate` decorator ( :func:`mayavi.mlab.animate` ) is detailed on section :ref:`animating_a_visualization`. If you want to modify the data plotted by the mlab (as in the `mlab.test_plot3d()` call) to create an animation, please see section :ref:`mlab-animating-data`. """ # Author: Prabhu Ramachandran # Copyright (c) 2009, Enthought, Inc. # License: BSD Style. from mayavi import mlab from tvtk.tools import visual # Create a figure f = mlab.figure(size=(500,500)) # Tell visual to use this as the viewer. visual.set_viewer(f) # A silly visualization. mlab.test_plot3d() # Even sillier animation. b1 = visual.box() b2 = visual.box(x=4., color=visual.color.red) b3 = visual.box(x=-4, color=visual.color.red) b1.v = 5.0 @mlab.show @mlab.animate(delay=250) def anim(): """Animate the b1 box.""" while 1: b1.x = b1.x + b1.v*0.1 if b1.x > 2.5 or b1.x < -2.5: b1.v = -b1.v yield # Run the animation. anim() mayavi-4.5.0/docs/source/mayavi/auto/mri.py0000644000076500000240000000724712747716313021266 0ustar prabhustaff00000000000000""" Viewing MRI data with cut plane and iso surface. This example downloads an MRI scan, turns it into a 3D numpy array and visualizes it. First we extract some internal structures of the brain by defining a volume of interest around them, and using iso surfaces. Then we display two cut planes to show the raw MRI data itself. Finally we display the outer surface, but we restrict it to volume of interest to leave a cut for the cut planes. For an example of feature extraction from MRI data using Mayavi and vtk, see :ref:`example_tvtk_segmentation`. """ ### Download the data, if not already on disk ################################# import os if not os.path.exists('MRbrain.tar.gz'): # Download the data try: from urllib import urlopen except ImportError: from urllib.request import urlopen print("Downloading data, Please Wait (7.8MB)") opener = urlopen( 'http://graphics.stanford.edu/data/voldata/MRbrain.tar.gz') open('MRbrain.tar.gz', 'wb').write(opener.read()) # Extract the data import tarfile tar_file = tarfile.open('MRbrain.tar.gz') try: os.mkdir('mri_data') except: pass tar_file.extractall('mri_data') tar_file.close() ### Read the data in a numpy 3D array ######################################### import numpy as np data = np.array([np.fromfile(os.path.join('mri_data', 'MRbrain.%i' % i), dtype='>u2') for i in range(1, 110)]) data.shape = (109, 256, 256) data = data.T # Display the data ############################################################ from mayavi import mlab mlab.figure(bgcolor=(0, 0, 0), size=(400, 400)) src = mlab.pipeline.scalar_field(data) # Our data is not equally spaced in all directions: src.spacing = [1, 1, 1.5] src.update_image_data = True # Extract some inner structures: the ventricles and the inter-hemisphere # fibers. We define a volume of interest (VOI) that restricts the # iso-surfaces to the inner of the brain. We do this with the ExtractGrid # filter. blur = mlab.pipeline.user_defined(src, filter='ImageGaussianSmooth') voi = mlab.pipeline.extract_grid(blur) voi.set(x_min=125, x_max=193, y_min=92, y_max=125, z_min=34, z_max=75) mlab.pipeline.iso_surface(voi, contours=[1610, 2480], colormap='Spectral') # Add two cut planes to show the raw MRI data. We use a threshold filter # to remove cut the planes outside the brain. thr = mlab.pipeline.threshold(src, low=1120) cut_plane = mlab.pipeline.scalar_cut_plane(thr, plane_orientation='y_axes', colormap='black-white', vmin=1400, vmax=2600) cut_plane.implicit_plane.origin = (136, 111.5, 82) cut_plane.implicit_plane.widget.enabled = False cut_plane2 = mlab.pipeline.scalar_cut_plane(thr, plane_orientation='z_axes', colormap='black-white', vmin=1400, vmax=2600) cut_plane2.implicit_plane.origin = (136, 111.5, 82) cut_plane2.implicit_plane.widget.enabled = False # Extract two views of the outside surface. We need to define VOIs in # order to leave out a cut in the head. voi2 = mlab.pipeline.extract_grid(src) voi2.set(y_min=112) outer = mlab.pipeline.iso_surface(voi2, contours=[1776, ], color=(0.8, 0.7, 0.6)) voi3 = mlab.pipeline.extract_grid(src) voi3.set(y_max=112, z_max=53) outer3 = mlab.pipeline.iso_surface(voi3, contours=[1776, ], color=(0.8, 0.7, 0.6)) mlab.view(-125, 54, 326, (145.5, 138, 66.5)) mlab.roll(-175) mlab.show() import shutil shutil.rmtree('mri_data') mayavi-4.5.0/docs/source/mayavi/auto/multiple_engines.py0000644000076500000240000000434612747716313024037 0ustar prabhustaff00000000000000""" An example to show how you can have multiple engines in one application. Mutliple engines can be useful for more separation, eg to script each engine separately, or to avoid side effects between scenes. This example shows how to explicitely set the engine for an embedded scene. To define default arguments, it makes use of the Traits initialization style, rather than overridding the __init__. """ # Author: Gael Varoquaux # Copyright (c) 2009, Enthought, Inc. # License: BSD Style. from traits.api import HasTraits, Instance, on_trait_change from traitsui.api import View, Group, Item from mayavi.core.api import Engine from mayavi.core.ui.api import MayaviScene, MlabSceneModel, \ SceneEditor ################################################################################ class MyApp(HasTraits): # The first engine. As default arguments (an empty tuple) are given, # traits initializes it. engine1 = Instance(Engine, args=()) scene1 = Instance(MlabSceneModel) def _scene1_default(self): " The default initializer for 'scene1' " self.engine1.start() scene1 = MlabSceneModel(engine=self.engine1) return scene1 engine2 = Instance(Engine, ()) scene2 = Instance(MlabSceneModel) def _scene2_default(self): " The default initializer for 'scene2' " self.engine2.start() scene2 = MlabSceneModel(engine=self.engine2) return scene2 # We populate the scenes only when it is activated, to avoid problems # with VTK objects that expect an active scene @on_trait_change('scene1.activated') def populate_scene1(self): self.scene1.mlab.test_surf() @on_trait_change('scene2.activated') def populate_scene2(self): self.scene2.mlab.test_mesh() # The layout of the view view = View(Group(Item('scene1', editor=SceneEditor(scene_class=MayaviScene), width=480, height=480)), Group(Item('scene2', editor=SceneEditor(scene_class=MayaviScene), width=480, height=480)), resizable=True) if __name__ == '__main__': MyApp().configure_traits() mayavi-4.5.0/docs/source/mayavi/auto/multiple_mlab_scene_models.py0000644000076500000240000000440712747716313026040 0ustar prabhustaff00000000000000""" Example showing a dialog with multiple embedded scenes. When using several embedded scenes with mlab, you should be very careful always to pass the scene you want to use for plotting to the mlab function used, elsewhere it uses the current scene. In this example, failing to do so would result in only one scene being used, the last one created. The trick is to use the 'mayavi_scene' attribute of the MlabSceneModel, and pass it as a keyword argument to the mlab functions. For more examples on embedding mlab scenes in dialog, see also: the examples :ref:`example_mlab_interactive_dialog`, and :ref:`example_lorenz_ui`, as well as the section of the user manual :ref:`embedding_mayavi_traits`. """ import numpy as np from traits.api import HasTraits, Instance, Button, \ on_trait_change from traitsui.api import View, Item, HSplit, Group from mayavi import mlab from mayavi.core.ui.api import MlabSceneModel, SceneEditor class MyDialog(HasTraits): scene1 = Instance(MlabSceneModel, ()) scene2 = Instance(MlabSceneModel, ()) button1 = Button('Redraw') button2 = Button('Redraw') @on_trait_change('button1') def redraw_scene1(self): self.redraw_scene(self.scene1) @on_trait_change('button2') def redraw_scene2(self): self.redraw_scene(self.scene2) def redraw_scene(self, scene): # Notice how each mlab call points explicitely to the figure it # applies to. mlab.clf(figure=scene.mayavi_scene) x, y, z, s = np.random.random((4, 100)) mlab.points3d(x, y, z, s, figure=scene.mayavi_scene) # The layout of the dialog created view = View(HSplit( Group( Item('scene1', editor=SceneEditor(), height=250, width=300), 'button1', show_labels=False, ), Group( Item('scene2', editor=SceneEditor(), height=250, width=300, show_label=False), 'button2', show_labels=False, ), ), resizable=True, ) m = MyDialog() m.configure_traits() mayavi-4.5.0/docs/source/mayavi/auto/nongui.py0000644000076500000240000000642512747716313021773 0ustar prabhustaff00000000000000#!/usr/bin/env python """ This script demonstrates how one can use the Mayavi application framework without displaying Mayavi's UI. Note: look at the end of this file to see how the non gui plugin is chosen instead of the default gui mayavi plugin. This should be run as:: $ python nongui.py Or:: $ mayavi2 script.py """ # Author: Prabhu Ramachandran # Copyright (c) 2005, Enthought, Inc. # License: BSD Style. # Standard library imports from os.path import join, abspath # Enthought library imports from mayavi.scripts.util import get_data_dir from mayavi.plugins.app import Mayavi, get_non_gui_plugins class MyApp(Mayavi): def run(self): """This is executed once the application GUI has started. *Make sure all other MayaVi specific imports are made here!* """ # Various imports to do different things. from mayavi.sources.vtk_file_reader import VTKFileReader from mayavi.modules.outline import Outline from mayavi.modules.axes import Axes from mayavi.modules.grid_plane import GridPlane from mayavi.modules.image_plane_widget import ImagePlaneWidget from mayavi.modules.text import Text from mayavi.modules.contour_grid_plane import ContourGridPlane from mayavi.modules.iso_surface import IsoSurface script = self.script # Create a new scene. script.new_scene() # Read a VTK (old style) data file. r = VTKFileReader() r.initialize(join(get_data_dir(abspath(__file__)), 'heart.vtk')) script.add_source(r) # Put up some text. t = Text(text='MayaVi rules!', x_position=0.2, y_position=0.9, width=0.8) t.property.color = 1, 1, 0 # Bright yellow, yeah! script.add_module(t) # Create an outline for the data. o = Outline() script.add_module(o) # Create an axes for the data. a = Axes() script.add_module(a) # Create three simple grid plane modules. # First normal to 'x' axis. gp = GridPlane() script.add_module(gp) # Second normal to 'y' axis. gp = GridPlane() gp.grid_plane.axis = 'y' script.add_module(gp) # Third normal to 'z' axis. gp = GridPlane() script.add_module(gp) gp.grid_plane.axis = 'z' # Create one ImagePlaneWidget. ipw = ImagePlaneWidget() script.add_module(ipw) # Set the position to the middle of the data. ipw.ipw.slice_position = 16 # Create one ContourGridPlane normal to the 'x' axis. cgp = ContourGridPlane() script.add_module(cgp) # Set the position to the middle of the data. cgp.grid_plane.axis = 'y' cgp.grid_plane.position = 15 # An isosurface module. iso = IsoSurface(compute_normals=True) script.add_module(iso) iso.contour.contours = [200.0] # Set the view. s = script.engine.current_scene cam = s.scene.camera cam.azimuth(45) cam.elevation(15) s.render() if __name__ == '__main__': m = MyApp() # Get the default non GUI plugins. plugins = get_non_gui_plugins() # Start the app with these plugins. m.main(plugins=plugins) mayavi-4.5.0/docs/source/mayavi/auto/numeric_source.py0000644000076500000240000000410512747716313023507 0ustar prabhustaff00000000000000#!/usr/bin/env python """This script demonstrates how to create a numpy array data and visualize it as image data using a few modules. """ # Author: Prabhu Ramachandran # Copyright (c) 2005-2008, Enthought, Inc. # License: BSD Style. # Standard library imports import numpy # Enthought library imports from mayavi.scripts import mayavi2 from mayavi.sources.array_source import ArraySource from mayavi.modules.outline import Outline from mayavi.modules.image_plane_widget import ImagePlaneWidget def make_data(dims=(128, 128, 128)): """Creates some simple array data of the given dimensions to test with.""" np = dims[0]*dims[1]*dims[2] # Create some scalars to render. x, y, z = numpy.ogrid[-5:5:dims[0]*1j,-5:5:dims[1]*1j,-5:5:dims[2]*1j] x = x.astype('f') y = y.astype('f') z = z.astype('f') scalars = (numpy.sin(x*y*z)/(x*y*z)) # The copy makes the data contiguous and the transpose makes it # suitable for display via tvtk. Please note that we assume here # that the ArraySource is configured to not transpose the data. s = numpy.transpose(scalars).copy() # Reshaping the array is needed since the transpose messes up the # dimensions of the data. The scalars themselves are ravel'd and # used internally by VTK so the dimension does not matter for the # scalars. s.shape = s.shape[::-1] return s @mayavi2.standalone def view_numpy(): """Example showing how to view a 3D numpy array in mayavi2. """ # 'mayavi' is always defined on the interpreter. mayavi.new_scene() # Make the data and add it to the pipeline. data = make_data() src = ArraySource(transpose_input_array=False) src.scalar_data = data mayavi.add_source(src) # Visualize the data. o = Outline() mayavi.add_module(o) ipw = ImagePlaneWidget() mayavi.add_module(ipw) ipw.module_manager.scalar_lut_manager.show_scalar_bar = True ipw_y = ImagePlaneWidget() mayavi.add_module(ipw_y) ipw_y.ipw.plane_orientation = 'y_axes' if __name__ == '__main__': view_numpy() mayavi-4.5.0/docs/source/mayavi/auto/offscreen.py0000644000076500000240000000320612747716313022440 0ustar prabhustaff00000000000000#!/usr/bin/env python """A simple example of how you can use Mayavi without using Envisage or the Mayavi Envisage application and do off screen rendering. On Linux/Mac, with VTK < 5.2, you should see a small black window popup and disappear, see the section :ref:`offscreen_rendering` to avoid this. On Win32 you will not see any windows popping up at all. In the end you should have an offscreen.png image in the same directory with the rendered visualization. It can be run as:: $ python offscreen.py """ # Author: Prabhu Ramachandran # Copyright (c) 2007, Enthought, Inc. # License: BSD Style. from os.path import join, abspath, dirname # The offscreen Engine. from mayavi.api import OffScreenEngine # Usual MayaVi imports from mayavi.scripts.util import get_data_dir from mayavi.sources.api import VTKXMLFileReader from mayavi.modules.api import Outline, ScalarCutPlane, Streamline def main(): # Create the MayaVi offscreen engine and start it. e = OffScreenEngine() # Starting the engine registers the engine with the registry and # notifies others that the engine is ready. e.start() # Create a new scene. win = e.new_scene() # Now setup a normal MayaVi pipeline. src = VTKXMLFileReader() src.initialize(join(get_data_dir(dirname(abspath(__file__))), 'fire_ug.vtu')) e.add_source(src) e.add_module(Outline()) e.add_module(ScalarCutPlane()) e.add_module(Streamline()) win.scene.isometric_view() # Change the size argument to anything you want. win.scene.save('offscreen.png', size=(800, 800)) if __name__ == '__main__': main() mayavi-4.5.0/docs/source/mayavi/auto/pick_on_surface.py0000644000076500000240000000465512747716313023631 0ustar prabhustaff00000000000000""" Example showing how to pick data on a surface, going all the way back to the index in the numpy arrays. In this example, two views of the same data are shown. One with the data on a sphere, the other with the data flat. We use the 'on_mouse_pick' method of the scene to register a callback on clicking on the sphere. The callback is called with a picker object as andan argument. We use the point_id of the point that has been picked, andand go back to the 2D index on the data matrix to find its position. """ ################################################################################ # Create some data import numpy as np pi = np.pi cos = np.cos sin = np.sin phi, theta = np.mgrid[0:pi:180j,0:2*pi:180j] m0 = 4; m1 = 3; m2 = 2; m3 = 3; m4 = 1; m5 = 2; m6 = 2; m7 = 4; s = sin(m0*phi)**m1 + cos(m2*phi)**m3 + sin(m4*theta)**m5 + cos(m6*theta)**m7 x = sin(phi)*cos(theta) y = cos(phi) z = sin(phi)*sin(theta) ################################################################################ # Plot the data from mayavi import mlab # A first plot in 3D fig = mlab.figure(1) mlab.clf() mesh = mlab.mesh(x, y, z, scalars=s) cursor3d = mlab.points3d(0., 0., 0., mode='axes', color=(0, 0, 0), scale_factor=0.5) mlab.title('Click on the ball') # A second plot, flat fig2d = mlab.figure(2) mlab.clf() im = mlab.imshow(s) cursor = mlab.points3d(0, 0, 0, mode='2dthick_cross', color=(0, 0, 0), scale_factor=10) mlab.view(90, 0) ################################################################################ # Some logic to select 'mesh' and the data index when picking. def picker_callback(picker_obj): picked = picker_obj.actors if mesh.actor.actor._vtk_obj in [o._vtk_obj for o in picked]: # m.mlab_source.points is the points array underlying the vtk # dataset. GetPointId return the index in this array. x_, y_ = np.lib.index_tricks.unravel_index(picker_obj.point_id, s.shape) print("Data indices: %i, %i" % (x_, y_)) n_x, n_y = s.shape cursor.mlab_source.reset(x=x_ - n_x/2., y=y_ - n_y/2.) cursor3d.mlab_source.reset(x=x[x_, y_], y=y[x_, y_], z=z[x_, y_]) fig.on_mouse_pick(picker_callback) mlab.show() mayavi-4.5.0/docs/source/mayavi/auto/plotting_many_lines.py0000644000076500000240000000533112747716313024545 0ustar prabhustaff00000000000000""" This examples shows how many lines can be grouped together in a single object, for convenience and efficiency. We want to plot a large number of lines. We could use mlab.plot3d for this, but it will create an object for each line, this will be inefficient. This example shows how to create one object comprised of many lines. The underlying idea is the same as that used to plot graphes (see for instance :ref:`example_flight_graph`): create a set of points, and specify explicitely the connectivity between them. First we create the set of unconnected point (the underlying data structure is a :ref:`poly_data`) using `mlab.pipeline.scalar_scatter`. To add the connections, we need to keep track of which point is connected to which. As we only have lines, this is fairly easy: in a line, each point is connected to the following one. """ # Author: Gael Varoquaux # Copyright (c) 2010, Enthought # License: BSD style import numpy as np # The number of points per line N = 300 # The scalar parameter for each line t = np.linspace(-2 * np.pi, 2 * np.pi, N) from mayavi import mlab mlab.figure(1, size=(400, 400), bgcolor=(0, 0, 0)) mlab.clf() # We create a list of positions and connections, each describing a line. # We will collapse them in one array before plotting. x = list() y = list() z = list() s = list() connections = list() # The index of the current point in the total amount of points index = 0 # Create each line one after the other in a loop for i in range(50): x.append(np.sin(t)) y.append(np.cos((2 + .02 * i) * t)) z.append(np.cos((3 + .02 * i) * t)) s.append(t) # This is the tricky part: in a line, each point is connected # to the one following it. We have to express this with the indices # of the final set of points once all lines have been combined # together, this is why we need to keep track of the total number of # points already created (index) connections.append(np.vstack( [np.arange(index, index + N - 1.5), np.arange(index + 1, index + N - .5)] ).T) index += N # Now collapse all positions, scalars and connections in big arrays x = np.hstack(x) y = np.hstack(y) z = np.hstack(z) s = np.hstack(s) connections = np.vstack(connections) # Create the points src = mlab.pipeline.scalar_scatter(x, y, z, s) # Connect them src.mlab_source.dataset.lines = connections src.update() # The stripper filter cleans up connected lines lines = mlab.pipeline.stripper(src) # Finally, display the set of lines mlab.pipeline.surface(lines, colormap='Accent', line_width=1, opacity=.4) # And choose a nice view mlab.view(33.6, 106, 5.5, [0, 0, .05]) mlab.roll(125) mlab.show() mayavi-4.5.0/docs/source/mayavi/auto/poll_file.py0000644000076500000240000000625612747716313022443 0ustar prabhustaff00000000000000#!/usr/bin/env python """A simple script that polls a data file for changes and then updates the mayavi pipeline automatically. This script is to be run like so:: $ mayavi2 -x poll_file.py Or:: $ python poll_file.py The script currently defaults to using the example data in examples/data/heart.vtk. You can try editing that data file or change this script to point to other data which you can edit. """ # Author: Prabhu Ramachandran # Copyright (c) 2006-2015, Enthought Inc. # License: BSD Style. # Standard imports. import os from os.path import join, abspath, dirname # Enthought library imports from mayavi.scripts import mayavi2 from mayavi.sources.vtk_file_reader import VTKFileReader from mayavi.modules.outline import Outline from mayavi.modules.contour_grid_plane import ContourGridPlane from pyface.timer.api import Timer ###################################################################### # `Pollster` class. class Pollster(object): """Given a file name and a mayavi2 data reader object, this class polls the file for any changes and automatically updates the mayavi pipeline. """ def __init__(self, fname, data): """Initialize the object. Parameters: ----------- fname -- filename to poll. data -- the MayaVi source object to update. """ self.fname = fname self.data = data self.last_stat = os.stat(fname) def poll_file(self): # Check the file's time stamp. s = os.stat(self.fname) if s[-2] == self.last_stat[-2]: return else: self.last_stat = s self.update_pipeline() def update_pipeline(self): """Override this to do something else if needed. """ print("file changed") # Force the reader to re-read the file. d = self.data d.reader.modified() d.update() # Propagate the changes in the pipeline. d.data_changed = True def setup_data(fname): """Given a VTK file name `fname`, this creates a mayavi2 reader for it and adds it to the pipeline. It returns the reader created. """ # 'mayavi' is always defined on the interpreter. mayavi.new_scene() d = VTKFileReader() d.initialize(fname) mayavi.add_source(d) return d def view_data(): """Sets up the mayavi pipeline for the visualization. """ # 'mayavi' is always defined on the interpreter. o = Outline() mayavi.add_module(o) c = ContourGridPlane() mayavi.add_module(c) c.grid_plane.position = 16 c.module_manager.scalar_lut_manager.show_scalar_bar = True @mayavi2.standalone def main(): # Change this to suit your needs. Edit the file after running this # script and the pipeline should be updated automatically. fname = join(mayavi2.get_data_dir(abspath(dirname(__file__))), 'heart.vtk') data = setup_data(fname) view_data() # Poll the file. p = Pollster(fname, data) timer = Timer(1000, p.poll_file) # Keep a reference on the timer mayavi2.savedtimerbug = timer # To stop polling the file do: #timer.Stop() if __name__ == '__main__': main() mayavi-4.5.0/docs/source/mayavi/auto/polydata.py0000644000076500000240000000250212747716313022301 0ustar prabhustaff00000000000000""" An example of how to generate a polydata dataset using numpy arrays. The example is similar to tvtk/examples/tiny_mesh.py. Also shown is a way to visualize this data with mayavi2. The script can be run like so:: $ mayavi2 -x polydata.py It can be alternatively run as:: $ python polydata.py """ # Author: Prabhu Ramachandran # Copyright (c) 2007, Enthought, Inc. # License: BSD style. from numpy import array from tvtk.api import tvtk from mayavi.scripts import mayavi2 # The numpy array data. points = array([[0,0,0], [1,0,0], [0,1,0], [0,0,1]], 'f') triangles = array([[0,1,3], [0,3,2], [1,2,3], [0,2,1]]) temperature = array([10., 20., 30., 40.]) # The TVTK dataset. mesh = tvtk.PolyData(points=points, polys=triangles) mesh.point_data.scalars = temperature mesh.point_data.scalars.name = 'Temperature' # Uncomment the next two lines to save the dataset to a VTK XML file. #w = tvtk.XMLPolyDataWriter(input=mesh, file_name='polydata.vtp') #w.write() # Now view the data. @mayavi2.standalone def view(): from mayavi.sources.vtk_data_source import VTKDataSource from mayavi.modules.surface import Surface mayavi.new_scene() src = VTKDataSource(data = mesh) mayavi.add_source(src) s = Surface() mayavi.add_module(s) if __name__ == '__main__': view() mayavi-4.5.0/docs/source/mayavi/auto/probe_filter.py0000644000076500000240000000662412747716313023151 0ustar prabhustaff00000000000000""" Using the probe filter to visualize a scalar field along an arbitrary surface. This example shows how a data set can be 'projected' (or interpolated) on another given source using the probe filter. It is also an example of a complex VTK pipeline and shows how to inspect it with the PipelineBrowser. In this example, a function is sampled on a regular grid and can be visualized using an ImagePlaneWidget. The function we are interested is independent of the distance to the origin and a function only of the angle. This is why it may be interesting to visualize its value sampled on a sphere center at the origin, but we have the data sampled throughout the volume on a regular grid. We create a sphere with the BuiltinSurface source and use the VTK ProbeFilter to sample the data on this surface. The ProbeFilter takes one input, which is the data structure to project the data on, and a 'source', which is where the data values come from. We need to use the UserDefined filter to insert this VTK filter in the Mayavi pipeline (see :ref:`using_userdefined_filter` as well as :ref:`example_image_cursor_filter` and :ref:`example_tvtk_segmentation`). Specifying its input is done automatical when it is inserted on the pipeline, be its source needs to be specified explicitely. As it is a VTK filter, the source is the VTK dataset output by the Mayavi object: we can find it in `.outputs[0]`. Note that this filter violates slightly the simple pipeline model that Mayavi tries to expose to the users: it has two entries. As a result, the Mayavi pipeline is not longer really a tree. However, if you open up the Mayavi :ref:`pipeline view `, you can see that the ProbeFilter has only one parent in the view. To inspect the actually VTK pipeline underlying this visualization, we use the TVTK PipelineBrowser at the end of the example. You can see that the VTK pipeline is much more complex that the pipeline represented in Mayavi: actors, data mappers, and other elements of the VTK pipeline are collapsed in the Mayavi filters and modules. Note that, as we know the expression of the function, it would be simpler and more efficient to directly sample it on the sphere. """ import numpy as np from mayavi import mlab from tvtk.api import tvtk from tvtk.common import configure_source_data, configure_input # The angular par of the spherical harmonic (3, 2) x, y, z = np.mgrid[-.5:.5:100j, -.5:.5:100j, -.5:.5:100j] Phi = np.angle((x+y*1j)**2*z) field = mlab.pipeline.scalar_field(x, y, z, Phi) ipw = mlab.pipeline.image_plane_widget(field) mlab.outline(field) surface = mlab.pipeline.builtin_surface() surface.source = 'sphere' surface.data_source.radius = .4 surface.data_source.phi_resolution = 200 surface.data_source.theta_resolution = 200 probe_filter = tvtk.ProbeFilter() configure_input(probe_filter, surface.data_source) configure_source_data(probe_filter, field.outputs[0]) probe = mlab.pipeline.user_defined(surface, filter=probe_filter) surf = mlab.pipeline.surface(probe) fig = mlab.gcf() ################################################################################ # Finally, to inspect the VTK Pipeline (and not the Mayavi one, we # use the TVTK pipeline browser) # Note that for Mayavi version < 3.4.1, there is a bug in the # PipelineBrowser preventing a good display of this pipeline. from tvtk.pipeline.browser import PipelineBrowser browser = PipelineBrowser(fig.scene) browser.show() mlab.show() mayavi-4.5.0/docs/source/mayavi/auto/protein.py0000644000076500000240000001131512747716313022146 0ustar prabhustaff00000000000000""" Visualize a protein graph structure downloaded from the protein database in standard pdb format. We parse the pdb file, but extract only a very small amount of information: the type of atoms, their positions, and the links between them. Most of the complexity of this example comes from the code turning the PDB information into a list of 3D positions, with associated scalar and connection information. We assign a scalar value for the atoms to differenciate the different types of atoms, but it does not correspond to the atomic mass. The size and the color of the atom on the visualization is therefore not chemicaly-significant. The atoms are plotted using mlab.points3d, and connections between atoms are added to the dataset, and visualized using a surface module. The graph is created by adding connection information to points. For this, each point is designated by its number (in the order of the array passed to mlab.points3d), and the connection array, made of pairs of these numbers, is constructed. There is some slightly tedious data manipulation to go from the named-node graph representation as stored in the pdb file, to the index-based connection pairs. A similar technique to plot the graph is done in the :ref:`example_flight_graph`. Another example of graph plotting, showing a different technique to plot the graph, can be seen on :ref:`example_delaunay_graph`. To visualize the local atomic density, we use a gaussian splatter filter that builds a kernel density estimation of the continuous density field: each point is convoluted by a Gaussian kernel, and the sum of these Gaussians form the resulting density field. We visualize this field using volume rendering. Reference for the pdb file standard: http://mmcif.pdb.org/dictionaries/pdb-correspondence/pdb2mmcif.html """ # Author: Gael Varoquaux # Copyright (c) 2008-2015, Enthought, Inc. # License: BSD Style. # The pdb code for the protein. protein_code = '2q09' # Retrieve the file from the protein database ################################# import os if not os.path.exists('pdb%s.ent.gz' % protein_code): # Download the data try: from urllib import urlopen except ImportError: from urllib.request import urlopen print('Downloading protein data, please wait') opener = urlopen( 'ftp://ftp.wwpdb.org/pub/pdb/data/structures/divided/pdb/q0/pdb%s.ent.gz' % protein_code) open('pdb%s.ent.gz' % protein_code, 'wb').write(opener.read()) # Parse the pdb file ########################################################## import gzip infile = gzip.GzipFile('pdb%s.ent.gz' % protein_code, 'rb') # A graph represented by a dictionary associating nodes with keys # (numbers), and edges (pairs of node keys). nodes = dict() edges = list() atoms = set() # Build the graph from the PDB information last_atom_label = None last_chain_label = None for line in infile: line = line.split() if line[0] in ('ATOM', 'HETATM'): nodes[line[1]] = (line[2], line[6], line[7], line[8]) atoms.add(line[2]) chain_label = line[5] if chain_label == last_chain_label: edges.append((line[1], last_atom_label)) last_atom_label = line[1] last_chain_label = chain_label elif line[0] == 'CONECT': for start, stop in zip(line[1:-1], line[2:]): edges.append((start, stop)) atoms = list(atoms) atoms.sort() atoms = dict(zip(atoms, range(len(atoms)))) # Turn the graph into 3D positions, and a connection list. labels = dict() x = list() y = list() z = list() scalars = list() for index, label in enumerate(nodes): labels[label] = index this_scalar, this_x, this_y, this_z = nodes[label] scalars.append(atoms[this_scalar]) x.append(float(this_x)) y.append(float(this_y)) z.append(float(this_z)) connections = list() for start, stop in edges: connections.append((labels[start], labels[stop])) import numpy as np x = np.array(x) y = np.array(y) z = np.array(z) scalars = np.array(scalars) # Visualize the data ########################################################## from mayavi import mlab mlab.figure(1, bgcolor=(0, 0, 0)) mlab.clf() pts = mlab.points3d(x, y, z, 1.5 * scalars.max() - scalars, scale_factor=0.015, resolution=10) pts.mlab_source.dataset.lines = np.array(connections) # Use a tube fiter to plot tubes on the link, varying the radius with the # scalar value tube = mlab.pipeline.tube(pts, tube_radius=0.15) tube.filter.radius_factor = 1. tube.filter.vary_radius = 'vary_radius_by_scalar' mlab.pipeline.surface(tube, color=(0.8, 0.8, 0)) # Visualize the local atomic density mlab.pipeline.volume(mlab.pipeline.gaussian_splatter(pts)) mlab.view(49, 31.5, 52.8, (4.2, 37.3, 20.6)) mlab.show() mayavi-4.5.0/docs/source/mayavi/auto/qt_embedding.py0000644000076500000240000000753612747716313023122 0ustar prabhustaff00000000000000""" This example demonstrates using Mayavi as a component of a large Qt application. For this use, Mayavi is embedded in a QWidget. To understand this example, please read section :ref:`builing-applications`. """ # First, and before importing any Enthought packages, set the ETS_TOOLKIT # environment variable to qt4, to tell Traits that we will use Qt. import os os.environ['ETS_TOOLKIT'] = 'qt4' # By default, the PySide binding will be used. If you want the PyQt bindings # to be used, you need to set the QT_API environment variable to 'pyqt' #os.environ['QT_API'] = 'pyqt' # To be able to use PySide or PyQt4 and not run in conflicts with traits, # we need to import QtGui and QtCore from pyface.qt from pyface.qt import QtGui, QtCore # Alternatively, you can bypass this line, but you need to make sure that # the following lines are executed before the import of PyQT: # import sip # sip.setapi('QString', 2) from traits.api import HasTraits, Instance, on_trait_change from traitsui.api import View, Item from mayavi.core.ui.api import MayaviScene, MlabSceneModel, \ SceneEditor ################################################################################ #The actual visualization class Visualization(HasTraits): scene = Instance(MlabSceneModel, ()) @on_trait_change('scene.activated') def update_plot(self): # This function is called when the view is opened. We don't # populate the scene when the view is not yet open, as some # VTK features require a GLContext. # We can do normal mlab calls on the embedded scene. self.scene.mlab.test_points3d() # the layout of the dialog screated view = View(Item('scene', editor=SceneEditor(scene_class=MayaviScene), height=250, width=300, show_label=False), resizable=True # We need this to resize with the parent widget ) ################################################################################ # The QWidget containing the visualization, this is pure PyQt4 code. class MayaviQWidget(QtGui.QWidget): def __init__(self, parent=None): QtGui.QWidget.__init__(self, parent) layout = QtGui.QVBoxLayout(self) layout.setContentsMargins(0,0,0,0) layout.setSpacing(0) self.visualization = Visualization() # If you want to debug, beware that you need to remove the Qt # input hook. #QtCore.pyqtRemoveInputHook() #import pdb ; pdb.set_trace() #QtCore.pyqtRestoreInputHook() # The edit_traits call will generate the widget to embed. self.ui = self.visualization.edit_traits(parent=self, kind='subpanel').control layout.addWidget(self.ui) self.ui.setParent(self) if __name__ == "__main__": # Don't create a new QApplication, it would unhook the Events # set by Traits on the existing QApplication. Simply use the # '.instance()' method to retrieve the existing one. app = QtGui.QApplication.instance() container = QtGui.QWidget() container.setWindowTitle("Embedding Mayavi in a PyQt4 Application") # define a "complex" layout to test the behaviour layout = QtGui.QGridLayout(container) # put some stuff around mayavi label_list = [] for i in range(3): for j in range(3): if (i==1) and (j==1):continue label = QtGui.QLabel(container) label.setText("Your QWidget at (%d, %d)" % (i,j)) label.setAlignment(QtCore.Qt.AlignHCenter|QtCore.Qt.AlignVCenter) layout.addWidget(label, i, j) label_list.append(label) mayavi_widget = MayaviQWidget(container) layout.addWidget(mayavi_widget, 1, 1) container.show() window = QtGui.QMainWindow() window.setCentralWidget(container) window.show() # Start the main event loop. app.exec_() mayavi-4.5.0/docs/source/mayavi/auto/scatter_plot.py0000644000076500000240000000346112747716313023174 0ustar prabhustaff00000000000000""" An example of plotting scatter points with Mayavi's core API. This script creates a bunch of random points with random scalar data and then shows these as a "scatter" plot of points. The script illustrates how to 1. create a dataset easily using tvtk and numpy, 2. use a created dataset in Mayavi and visualize it. This example achieve the same functionnality as mlab's points3d function ( :func:`mayavi.mlab.points3d`), but explicitely creating the objects and adding them to the pipeline engine via the Mayavi core API. Compared to using mlab, this method has the advantage of giving more control on which objects are created, and there life cycle. Run this script like so:: $ mayavi2 -x scatter_plot.py Alternatively it can be run as:: $ python scatter_plot.py """ # Author: Prabhu Ramachandran # Copyright (c) 2007 Prabhu Ramachandran. # License: BSD Style. import numpy as np from tvtk.api import tvtk from mayavi.scripts import mayavi2 @mayavi2.standalone def main(): # Create some random points to view. pd = tvtk.PolyData() pd.points = np.random.random((1000, 3)) verts = np.arange(0, 1000, 1) verts.shape = (1000, 1) pd.verts = verts pd.point_data.scalars = np.random.random(1000) pd.point_data.scalars.name = 'scalars' # Now visualize it using mayavi2. from mayavi.sources.vtk_data_source import VTKDataSource from mayavi.modules.outline import Outline from mayavi.modules.surface import Surface mayavi.new_scene() d = VTKDataSource() d.data = pd mayavi.add_source(d) mayavi.add_module(Outline()) s = Surface() mayavi.add_module(s) s.actor.property.set(representation='p', point_size=2) # You could also use glyphs to render the points via the Glyph module. if __name__ == '__main__': main() mayavi-4.5.0/docs/source/mayavi/auto/select_red_balls.py0000644000076500000240000000636512747716313023765 0ustar prabhustaff00000000000000""" This example shows how to use a callback to select a red ball amongst white balls. The example uses the figure method 'on_mouse_pick', added in Mayavi 3.4, to register a callback when the left mouse is pressed. The callback is called with a picker, enabling to identify the object selected. Specificaly, actors are selected, each object is represented on the scene via actors. The selected actors can be found in 'picker.actors'. In this example, we have plotted red balls and white ball. We want to select the red balls, and thus test if any actor in picker.actors corresponds to an actor of red balls. To identify which ball has been selected, we use the point id. However, each ball is represented by several points. Thus we need to retrieve the number of points per ball, and divide the point id by this number. We use an outline to display which ball was selected by positioning it on the corresponding ball. """ # Author: Gael Varoquaux # Copyright (c) 2009, Enthought, Inc. # License: BSD style. import numpy as np from mayavi import mlab ################################################################################ # Disable the rendering, to get bring up the figure quicker: figure = mlab.gcf() mlab.clf() figure.scene.disable_render = True # Creates two set of points using mlab.points3d: red point and # white points x1, y1, z1 = np.random.random((3, 10)) red_glyphs = mlab.points3d(x1, y1, z1, color=(1, 0, 0), resolution=20) x2, y2, z2 = np.random.random((3, 10)) white_glyphs = mlab.points3d(x2, y2, z2, color=(0.9, 0.9, 0.9), resolution=20) # Add an outline to show the selected point and center it on the first # data point. outline = mlab.outline(line_width=3) outline.outline_mode = 'cornered' outline.bounds = (x1[0]-0.1, x1[0]+0.1, y1[0]-0.1, y1[0]+0.1, z1[0]-0.1, z1[0]+0.1) # Every object has been created, we can reenable the rendering. figure.scene.disable_render = False ################################################################################ # Here, we grab the points describing the individual glyph, to figure # out how many points are in an individual glyph. glyph_points = red_glyphs.glyph.glyph_source.glyph_source.output.points.to_array() def picker_callback(picker): """ Picker callback: this get called when on pick events. """ if picker.actor in red_glyphs.actor.actors: # Find which data point corresponds to the point picked: # we have to account for the fact that each data point is # represented by a glyph with several points point_id = picker.point_id/glyph_points.shape[0] # If the no points have been selected, we have '-1' if point_id != -1: # Retrieve the coordinnates coorresponding to that data # point x, y, z = x1[point_id], y1[point_id], z1[point_id] # Move the outline to the data point. outline.bounds = (x-0.1, x+0.1, y-0.1, y+0.1, z-0.1, z+0.1) picker = figure.on_mouse_pick(picker_callback) # Decrease the tolerance, so that we can more easily select a precise # point. picker.tolerance = 0.01 mlab.title('Click on red balls') mlab.show() mayavi-4.5.0/docs/source/mayavi/auto/simple_structured_grid.py0000644000076500000240000000426012747716313025251 0ustar prabhustaff00000000000000""" An example creating a structured grid data set from numpy arrays using TVTK and visualizing it using mlab. In this example, we create a structured-grid data set: we describe data, both scalar and vector, lying on a structured-grid, ie a grid where each vertex has 6 neighboors. For this we directly create a StructuredGrid tvtk object, rather than using the mlab.pipeline source functions, as it gives us more control. To visualize the resulting dataset, we apply several modules, using the mlab.pipeline interface (see :ref:`controlling-the-pipeline-with-mlab-scripts`) """ # Author: Prabhu Ramachandran # Copyright (c) 2008, Prabhu Ramachandran. # License: BSD Style. from numpy import mgrid, empty, sin, pi from tvtk.api import tvtk from mayavi import mlab # Generate some points. x, y, z = mgrid[1:6:11j, 0:4:13j, 0:3:6j] base = x[..., 0] + y[..., 0] # Some interesting z values. for i in range(z.shape[2]): z[..., i] = base * 0.25 * i # The actual points. pts = empty(z.shape + (3,), dtype=float) pts[..., 0] = x pts[..., 1] = y pts[..., 2] = z # Simple scalars. scalars = x * x + y * y + z * z # Some vectors vectors = empty(z.shape + (3,), dtype=float) vectors[..., 0] = (4 - y * 2) vectors[..., 1] = (x * 3 - 12) vectors[..., 2] = sin(z * pi) # We reorder the points, scalars and vectors so this is as per VTK's # requirement of x first, y next and z last. pts = pts.transpose(2, 1, 0, 3).copy() pts.shape = pts.size / 3, 3 scalars = scalars.T.copy() vectors = vectors.transpose(2, 1, 0, 3).copy() vectors.shape = vectors.size / 3, 3 # Create the dataset. sg = tvtk.StructuredGrid(dimensions=x.shape, points=pts) sg.point_data.scalars = scalars.ravel() sg.point_data.scalars.name = 'temperature' sg.point_data.vectors = vectors sg.point_data.vectors.name = 'velocity' # Thats it! # Now visualize the data. d = mlab.pipeline.add_dataset(sg) gx = mlab.pipeline.grid_plane(d) gy = mlab.pipeline.grid_plane(d) gy.grid_plane.axis = 'y' gz = mlab.pipeline.grid_plane(d) gz.grid_plane.axis = 'z' iso = mlab.pipeline.iso_surface(d) iso.contour.maximum_contour = 75.0 vec = mlab.pipeline.vectors(d) vec.glyph.mask_input_points = True vec.glyph.glyph.scale_factor = 1.5 mlab.show() mayavi-4.5.0/docs/source/mayavi/auto/spherical_harmonics.py0000644000076500000240000000253512747716313024507 0ustar prabhustaff00000000000000""" Plot spherical harmonics on the surface of the sphere, as well as a 3D polar plot. This example requires scipy. In this example we use the mlab's mesh function: :func:`mayavi.mlab.mesh`. For plotting surfaces this is a very versatile function. The surfaces can be defined as functions of a 2D grid. For each spherical harmonic, we plot its value on the surface of a sphere, and then in polar. The polar plot is simply obtained by varying the radius of the previous sphere. """ # Author: Gael Varoquaux # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. from mayavi import mlab import numpy as np from scipy.special import sph_harm # Create a sphere r = 0.3 pi = np.pi cos = np.cos sin = np.sin phi, theta = np.mgrid[0:pi:101j, 0:2 * pi:101j] x = r * sin(phi) * cos(theta) y = r * sin(phi) * sin(theta) z = r * cos(phi) mlab.figure(1, bgcolor=(1, 1, 1), fgcolor=(0, 0, 0), size=(400, 300)) mlab.clf() # Represent spherical harmonics on the surface of the sphere for n in range(1, 6): for m in range(n): s = sph_harm(m, n, theta, phi).real mlab.mesh(x - m, y - n, z, scalars=s, colormap='jet') s[s < 0] *= 0.97 s /= s.max() mlab.mesh(s * x - m, s * y - n, s * z + 1.3, scalars=s, colormap='Spectral') mlab.view(90, 70, 6.2, (-1.3, -2.9, 0.25)) mlab.show() mayavi-4.5.0/docs/source/mayavi/auto/standalone.py0000644000076500000240000000321712747716313022620 0ustar prabhustaff00000000000000#!/usr/bin/env python """A simple example of how you can use Mayavi without using Envisage or the Mayavi Envisage application. """ # Author: Prabhu Ramachandran # Copyright (c) 2007, Enthought, Inc. # License: BSD Style. from os.path import join, abspath from pyface.api import GUI # The core Engine. from mayavi.core.api import Engine from mayavi.core.ui.engine_view import EngineView # Usual MayaVi imports from mayavi.scripts.util import get_data_dir from mayavi.sources.api import VTKXMLFileReader from mayavi.modules.api import Outline, ScalarCutPlane, Streamline def main(): # Create the MayaVi engine and start it. e = Engine() # Starting the engine registers the engine with the registry and # notifies others that the engine is ready. e.start() # Do this if you need to see the MayaVi tree view UI. ev = EngineView(engine=e) ui = ev.edit_traits() # Create a new scene. scene = e.new_scene() # Now create a new scene just for kicks. scene1 = e.new_scene() # Now setup a normal MayaVi pipeline. src = VTKXMLFileReader() src.initialize(join(get_data_dir(abspath(__file__)), 'fire_ug.vtu')) e.add_source(src) e.add_module(Outline()) e.add_module(ScalarCutPlane()) e.add_module(Streamline()) return e, ui if __name__ == '__main__': # When main returns the ui to go out of scope and be gc'd causing the view # to disappear with qt4. e, ui = main() # Create a GUI instance and start the event loop. We do this here so that # main can be run from IPython -wthread if needed. gui = GUI() gui.start_event_loop() mayavi-4.5.0/docs/source/mayavi/auto/streamline.py0000644000076500000240000000360612747716313022635 0ustar prabhustaff00000000000000#!/usr/bin/env mayavi2 """This script demonstrates how one can script Mayavi's core API to display streamlines and an iso surface. """ # Author: Prabhu Ramachandran # Copyright (c) 2005-2007, Enthought, Inc. # License: BSD Style. # Standard library imports from os.path import join, abspath, dirname # Enthought library imports from mayavi.scripts import mayavi2 from mayavi.sources.vtk_xml_file_reader import VTKXMLFileReader from mayavi.sources.vrml_importer import VRMLImporter from mayavi.modules.outline import Outline from mayavi.modules.streamline import Streamline from mayavi.modules.iso_surface import IsoSurface def setup_data(fname): """Given a VTK XML file name `fname`, this creates a mayavi2 reader for it and adds it to the pipeline. It returns the reader created. """ r = VTKXMLFileReader() r.initialize(fname) mayavi.add_source(r) return r def show_vrml(fname): """Given a VRML file name it imports it into the scene. """ r = VRMLImporter() r.initialize(fname) mayavi.add_source(r) return r def streamline(): """Sets up the mayavi pipeline for the visualization. """ # Create an outline for the data. o = Outline() mayavi.add_module(o) s = Streamline(streamline_type='tube') mayavi.add_module(s) s.stream_tracer.integration_direction = 'both' s.seed.widget.center = 3.5, 0.625, 1.25 s.module_manager.scalar_lut_manager.show_scalar_bar = True i = IsoSurface() mayavi.add_module(i) i.contour.contours[0] = 550 i.actor.property.opacity = 0.5 @mayavi2.standalone def main(): mayavi.new_scene() data_dir = mayavi2.get_data_dir(dirname(abspath(__file__))) vrml_fname = join(data_dir, 'room_vis.wrl') r = show_vrml(vrml_fname) fname = join(data_dir, 'fire_ug.vtu') r = setup_data(fname) streamline() if __name__ == '__main__': main() mayavi-4.5.0/docs/source/mayavi/auto/structured_grid.py0000644000076500000240000000767312747716313023713 0ustar prabhustaff00000000000000"""An example of how to generate a structured grid dataset using numpy arrays. Also shown is a way to visualize this data with the mayavi2 application. The script can be run like so:: $ mayavi2 -x structured_grid.py Alternatively, it can be run as:: $ python structured_grid.py """ # Authors: Eric Jones # Prabhu Ramachandran # Copyright (c) 2007, Enthought, Inc. # License: BSD style. import numpy as np from numpy import cos, sin, pi from tvtk.api import tvtk from mayavi.scripts import mayavi2 def generate_annulus(r=None, theta=None, z=None): """ Generate points for structured grid for a cylindrical annular volume. This method is useful for generating a structured cylindrical mesh for VTK (and perhaps other tools). Parameters ---------- r : array : The radial values of the grid points. It defaults to linspace(1.0, 2.0, 11). theta : array : The angular values of the x axis for the grid points. It defaults to linspace(0,2*pi,11). z: array : The values along the z axis of the grid points. It defaults to linspace(0,0,1.0, 11). Return ------ points : array Nx3 array of points that make up the volume of the annulus. They are organized in planes starting with the first value of z and with the inside "ring" of the plane as the first set of points. The default point array will be 1331x3. """ # Default values for the annular grid. if r is None: r = np.linspace(1.0, 2.0, 11) if theta is None: theta = np.linspace(0, 2*pi, 11) if z is None: z = np.linspace(0.0, 1.0, 11) # Find the x values and y values for each plane. x_plane = (cos(theta)*r[:,None]).ravel() y_plane = (sin(theta)*r[:,None]).ravel() # Allocate an array for all the points. We'll have len(x_plane) # points on each plane, and we have a plane for each z value, so # we need len(x_plane)*len(z) points. points = np.empty([len(x_plane)*len(z),3]) # Loop through the points for each plane and fill them with the # correct x,y,z values. start = 0 for z_plane in z: end = start + len(x_plane) # slice out a plane of the output points and fill it # with the x,y, and z values for this plane. The x,y # values are the same for every plane. The z value # is set to the current z plane_points = points[start:end] plane_points[:,0] = x_plane plane_points[:,1] = y_plane plane_points[:,2] = z_plane start = end return points # Make the data. dims = (51, 25, 25) # Note here that the 'x' axis corresponds to 'theta' theta = np.linspace(0, 2*np.pi, dims[0]) # 'y' corresponds to varying 'r' r = np.linspace(1, 10, dims[1]) z = np.linspace(0, 5, dims[2]) pts = generate_annulus(r, theta, z) # Uncomment the following if you want to add some noise to the data. #pts += np.random.randn(dims[0]*dims[1]*dims[2], 3)*0.04 sgrid = tvtk.StructuredGrid(dimensions=dims) sgrid.points = pts s = np.sqrt(pts[:,0]**2 + pts[:,1]**2 + pts[:,2]**2) sgrid.point_data.scalars = np.ravel(s.copy()) sgrid.point_data.scalars.name = 'scalars' # Uncomment the next two lines to save the dataset to a VTK XML file. #w = tvtk.XMLStructuredGridWriter(input=sgrid, file_name='sgrid.vts') #w.write() # View the data. @mayavi2.standalone def view(): from mayavi.sources.vtk_data_source import VTKDataSource from mayavi.modules.api import Outline, GridPlane mayavi.new_scene() src = VTKDataSource(data=sgrid) mayavi.add_source(src) mayavi.add_module(Outline()) g = GridPlane() g.grid_plane.axis = 'x' mayavi.add_module(g) g = GridPlane() g.grid_plane.axis = 'y' mayavi.add_module(g) g = GridPlane() g.grid_plane.axis = 'z' mayavi.add_module(g) if __name__ == '__main__': view() mayavi-4.5.0/docs/source/mayavi/auto/structured_points2d.py0000644000076500000240000000355612747716313024524 0ustar prabhustaff00000000000000"""An example of how to generate a 2D structured points dataset using numpy arrays. Also shown is a way to visualize this data with the mayavi2 application. The script can be run like so:: $ mayavi2 -x structured_points2d.py Alternatively, it can be run as:: $ python structured_points2d.py """ # Author: Prabhu Ramachandran # Copyright (c) 2007, Enthought, Inc. # License: BSD style. from numpy import arange, sqrt, sin from tvtk.api import tvtk from mayavi.scripts import mayavi2 # Generate the scalar values. x = (arange(0.1, 50.0)-25)/2.0 y = (arange(0.1, 50.0)-25)/2.0 r = sqrt(x[:,None]**2+y**2) z = 5.0*sin(r)/r # # Make the tvtk dataset. # tvtk.ImageData is identical and could also be used here. spoints = tvtk.StructuredPoints(origin=(-12.5,-12.5,0), spacing=(0.5,0.5,1), dimensions=(50,50,1)) # Transpose the array data due to VTK's implicit ordering. VTK assumes # an implicit ordering of the points: X co-ordinate increases first, Y # next and Z last. We flatten it so the number of components is 1. spoints.point_data.scalars = z.T.flatten() spoints.point_data.scalars.name = 'scalar' # Uncomment the next two lines to save the dataset to a VTK XML file. #w = tvtk.XMLImageDataWriter(input=spoints, file_name='spoints2d.vti') #w.write() # Now view the data. @mayavi2.standalone def view(): from mayavi.sources.vtk_data_source import VTKDataSource from mayavi.filters.warp_scalar import WarpScalar from mayavi.filters.poly_data_normals import PolyDataNormals from mayavi.modules.surface import Surface mayavi.new_scene() src = VTKDataSource(data = spoints) mayavi.add_source(src) mayavi.add_filter(WarpScalar()) mayavi.add_filter(PolyDataNormals()) s = Surface() mayavi.add_module(s) if __name__ == '__main__': view() mayavi-4.5.0/docs/source/mayavi/auto/structured_points3d.py0000644000076500000240000000434412747716313024521 0ustar prabhustaff00000000000000"""An example of how to generate a 3D structured points dataset using numpy arrays. Also shown is a way to visualize this data with the mayavi2 application. The script can be run like so:: $ mayavi2 -x structured_points3d.py Alternatively, it can be run as:: $ python structured_points3d.py """ # Author: Prabhu Ramachandran # Copyright (c) 2007, Enthought, Inc. # License: BSD style. from tvtk.api import tvtk from tvtk.array_handler import get_vtk_array_type from tvtk.common import is_old_pipeline from numpy import array, ogrid, sin, ravel from mayavi.scripts import mayavi2 # Make the data. dims = array((128, 128, 128)) vol = array((-5., 5, -5, 5, -5, 5)) origin = vol[::2] spacing = (vol[1::2] - origin)/(dims -1) xmin, xmax, ymin, ymax, zmin, zmax = vol x, y, z = ogrid[xmin:xmax:dims[0]*1j, ymin:ymax:dims[1]*1j, zmin:zmax:dims[2]*1j] x, y, z = [t.astype('f') for t in (x, y, z)] scalars = sin(x*y*z)/(x*y*z) # Make the tvtk dataset. spoints = tvtk.StructuredPoints(origin=origin, spacing=spacing, dimensions=dims) # The copy makes the data contiguous and the transpose makes it # suitable for display via tvtk. Note that it is not necessary to # make the data contiguous since in that case the array is copied # internally. s = scalars.transpose().copy() spoints.point_data.scalars = ravel(s) spoints.point_data.scalars.name = 'scalars' # This is needed in slightly older versions of VTK (like the 5.0.2 # release) to prevent a segfault. VTK does not detect the correct # data type. if is_old_pipeline(): spoints.scalar_type = get_vtk_array_type(s.dtype) # Uncomment the next two lines to save the dataset to a VTK XML file. #w = tvtk.XMLImageDataWriter(input=spoints, file_name='spoints3d.vti') #w.write() # Now view the data. @mayavi2.standalone def view(): from mayavi.sources.vtk_data_source import VTKDataSource from mayavi.modules.outline import Outline from mayavi.modules.image_plane_widget import ImagePlaneWidget mayavi.new_scene() src = VTKDataSource(data = spoints) mayavi.add_source(src) mayavi.add_module(Outline()) mayavi.add_module(ImagePlaneWidget()) if __name__ == '__main__': view() mayavi-4.5.0/docs/source/mayavi/auto/subclassing_mayavi_application.py0000644000076500000240000000540212747716313026734 0ustar prabhustaff00000000000000#!/usr/bin/env python """ This script demonstrates how one can script the Mayavi application by subclassing the application, create a new scene and create a few simple modules. This should be run as:: $ python test.py """ # Author: Prabhu Ramachandran # Copyright (c) 2005-2007, Enthought, Inc. # License: BSD Style. # Standard library imports from os.path import join, abspath, dirname # Enthought library imports from mayavi.plugins.app import Mayavi from mayavi.scripts.util import get_data_dir class MyApp(Mayavi): def run(self): """This is executed once the application GUI has started. *Make sure all other MayaVi specific imports are made here!* """ # Various imports to do different things. from mayavi.sources.vtk_file_reader import VTKFileReader from mayavi.modules.outline import Outline from mayavi.modules.axes import Axes from mayavi.modules.grid_plane import GridPlane from mayavi.modules.image_plane_widget import ImagePlaneWidget from mayavi.modules.text import Text script = self.script # Create a new scene. script.new_scene() # Read a VTK (old style) data file. r = VTKFileReader() r.initialize(join(get_data_dir(dirname(abspath(__file__))), 'heart.vtk')) script.add_source(r) # Put up some text. t = Text(text='MayaVi rules!', x_position=0.2, y_position=0.9, width=0.8) t.property.color = 1, 1, 0 # Bright yellow, yeah! script.add_module(t) # Create an outline for the data. o = Outline() script.add_module(o) # Create an axes for the data. a = Axes() script.add_module(a) # Create an orientation axes for the scene. This only works with # VTK-4.5 and above which is why we have the try block. try: from mayavi.modules.orientation_axes import OrientationAxes except ImportError: pass else: a = OrientationAxes() a.marker.set_viewport(0.0, 0.8, 0.2, 1.0) script.add_module(a) # Create three simple grid plane modules. # First normal to 'x' axis. gp = GridPlane() script.add_module(gp) # Second normal to 'y' axis. gp = GridPlane() gp.grid_plane.axis = 'y' script.add_module(gp) # Third normal to 'z' axis. gp = GridPlane() script.add_module(gp) gp.grid_plane.axis = 'z' # Create one ImagePlaneWidget. ipw = ImagePlaneWidget() script.add_module(ipw) # Set the position to the middle of the data. ipw.ipw.slice_position = 16 if __name__ == '__main__': a = MyApp() a.main() mayavi-4.5.0/docs/source/mayavi/auto/superquad_with_gui.py0000644000076500000240000000500712566026643024376 0ustar prabhustaff00000000000000""" This example uses MayaVi to show the evolution of a superquadric (http://en.wikipedia.org/wiki/Superquadrics), which are ellipsoidal surfaces parametrised by two parameters,\alpha and \beta. The equations that are used to determine the superquadric are (in spherical-polar coordinates): \(x = A(\sin^{\alpha}(\phi)*\cos^{\beta}(\theta))\) \(y = B(\sin^{\alpha}(\phi)*\sin^{\beta}(\theta))\) \(z = C(\cos^{\alpha}(\phi))\) Note that when we set A=B=C=r, and \alpha = \beta = 1, we get the equation for a sphere in spherical polar coordinate. Use the controls at the bottom of the plot to adjust \alpha and \beta, and watch as the figure transforms accordingly! """ # Author: Pratik Mallya # Copyright (c) 2008-2013, Enthought, Inc. # License: BSD Style. import numpy as np from enthought.traits.api import HasTraits, Range, Instance, \ on_trait_change from enthought.traits.ui.api import View, Item, HGroup from enthought.tvtk.pyface.scene_editor import SceneEditor from enthought.mayavi.tools.mlab_scene_model import \ MlabSceneModel from enthought.mayavi.core.ui.mayavi_scene import MayaviScene def fexp(x,p): """a different kind of exponentiation""" return (np.sign(x) * (np.abs(x)**p)) def tens_fld(A,B,C,P,Q): """this module plots superquadratic surfaces with the given parameters""" phi, theta = np.mgrid[0:np.pi:80j, 0:2*np.pi:80j] x = A * (fexp(np.sin(phi),P)) * (fexp(np.cos(theta),Q)) y = B * (fexp(np.sin(phi),P)) * (fexp(np.sin(theta),Q)) z = C * (fexp(np.cos(phi),P)) return x , y , z class Visualization(HasTraits): alpha = Range(0.0, 4.0, 1.0/4) beta = Range(0.0, 4.0, 1.0/4) scene = Instance(MlabSceneModel, ()) def __init__(self): # Do not forget to call the parent's __init__ HasTraits.__init__(self) x, y, z, = tens_fld(1, 1, 1, self.beta, self.alpha) self.plot = self.scene.mlab.mesh(x, y, z, colormap='copper', representation='surface') @on_trait_change('beta,alpha') def update_plot(self): x, y, z, = tens_fld(1, 1, 1, self.beta, self.alpha) self.plot.mlab_source.set(x = x, y = y, z = z) # the layout of the dialog created view = View(Item('scene', editor = SceneEditor(scene_class=MayaviScene), height = 750, width=750, show_label=False), HGroup( '_', 'beta', 'alpha', ), ) visualization = Visualization() visualization.configure_traits() mayavi-4.5.0/docs/source/mayavi/auto/surf_regular_mlab.py0000644000076500000240000000252612747716313024165 0ustar prabhustaff00000000000000#!/usr/bin/env python """Shows how to view data created by `tvtk.tools.mlab` with mayavi2. """ # Author: Prabhu Ramachandran # Copyright (c) 2006-2007, Enthought Inc. # License: BSD Style. import numpy from mayavi.scripts import mayavi2 from tvtk.tools import mlab from mayavi.sources.vtk_data_source import VTKDataSource from mayavi.filters.warp_scalar import WarpScalar from mayavi.modules.outline import Outline from mayavi.modules.surface import Surface def make_data(): """Make some test numpy data and create a TVTK data object from it that we will visualize. """ def f(x, y): """Some test function. """ return numpy.sin(x*y)/(x*y) x = numpy.arange(-7., 7.05, 0.1) y = numpy.arange(-5., 5.05, 0.05) s = mlab.SurfRegular(x, y, f) return s.data def add_data(tvtk_data): """Add a TVTK data object `tvtk_data` to the mayavi pipleine. """ d = VTKDataSource() d.data = tvtk_data mayavi.add_source(d) def surf_regular(): """Now visualize the data as done in mlab. """ w = WarpScalar() mayavi.add_filter(w) o = Outline() s = Surface() mayavi.add_module(o) mayavi.add_module(s) @mayavi2.standalone def main(): mayavi.new_scene() d = make_data() add_data(d) surf_regular() if __name__ == '__main__': main() mayavi-4.5.0/docs/source/mayavi/auto/surface_from_irregular_data.py0000644000076500000240000000332712747716313026212 0ustar prabhustaff00000000000000""" An example which shows how to plot a surface from data acquired irregularly. Data giving the variation of a parameter 'z' as a function of two others ('x' and 'y') is often plotted as a `carpet plot`, using a surface to visualize the underlying function. when the data has been acquired on a regular grid for parameters 'x' and 'y', it can simply be view with the mlab.surf function. However, when there are some missing points, or the data has been acquired at random, the surf function cannot be used. The difficulty stems from the fact that points positionned in 3D do not define a surface if no connectivity information is given. With the surf function, this information is implicite from the shape of the input arrays. In this example, randomly-positionned points in the (x, y) plane are embedded in a surface in the z axis. We first visualize the points using mlab.points3d. We then use the delaunay2d filter to extract the mesh by nearest-neighboor matching, and visualize it using the surface module. """ # Author: Gael Varoquaux # Copyright (c) 2009, Enthought, Inc. # License: BSD Style. import numpy as np # Create data with x and y random in the [-2, 2] segment, and z a # Gaussian function of x and y. np.random.seed(12345) x = 4 * (np.random.random(500) - 0.5) y = 4 * (np.random.random(500) - 0.5) def f(x, y): return np.exp(-(x ** 2 + y ** 2)) z = f(x, y) from mayavi import mlab mlab.figure(1, fgcolor=(0, 0, 0), bgcolor=(1, 1, 1)) # Visualize the points pts = mlab.points3d(x, y, z, z, scale_mode='none', scale_factor=0.2) # Create and visualize the mesh mesh = mlab.pipeline.delaunay2d(pts) surf = mlab.pipeline.surface(mesh) mlab.view(47, 57, 8.2, (0.1, 0.15, 0.14)) mlab.show() mayavi-4.5.0/docs/source/mayavi/auto/tvtk_in_mayavi.py0000644000076500000240000000540312747716313023513 0ustar prabhustaff00000000000000""" An example of pure TVTK programming to build TVTK objects, which are then added to a Mayavi scene. This example show how pure TVTK objects can be added to a Mayavi scene. This programming style does not allow to benefit from the data-management facilities of Mayavi (the pipeline, the data-oriented mlab functions), but it allows to easily reuse VTK code together with Mayavi or mlab code. If you want to use arbritrary VTK filters with Mayavi, it is best to use the UserDefined Mayavi filter, which enables the user to insert any VTK filter in the Mayavi pipeline. See, for instance, the :ref:`example_mri` for example of the UserDefined filter. For a full-blown example of a complex VTK pipeline built with Mayavi, see :ref:`example_tvtk_segmentation`. """ # Author: Gael Varoquaux # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. from mayavi import mlab # To access any VTK object, we use 'tvtk', which is a Python wrapping of # VTK replacing C++ setters and getters by Python properties and # converting numpy arrays to VTK arrays when setting data. from tvtk.api import tvtk from tvtk.common import configure_input_data v = mlab.figure() # Create a first sphere # The source generates data points sphere = tvtk.SphereSource(center=(0, 0, 0), radius=0.5) # The mapper converts them into position in, 3D with optionally color (if # scalar information is available). sphere_mapper = tvtk.PolyDataMapper() configure_input_data(sphere_mapper, sphere.output) sphere.update() # The Property will give the parameters of the material. p = tvtk.Property(opacity=0.2, color=(1, 0, 0)) # The actor is the actually object in the scene. sphere_actor = tvtk.Actor(mapper=sphere_mapper, property=p) v.scene.add_actor(sphere_actor) # Create a second sphere sphere2 = tvtk.SphereSource(center=(7, 0, 1), radius=0.2) sphere_mapper2 = tvtk.PolyDataMapper() configure_input_data(sphere_mapper2, sphere2.output) sphere2.update() p = tvtk.Property(opacity=0.3, color=(1, 0, 0)) sphere_actor2 = tvtk.Actor(mapper=sphere_mapper2, property=p) v.scene.add_actor(sphere_actor2) # Create a line between the two spheres line = tvtk.LineSource(point1=(0, 0, 0), point2=(7, 0, 1)) line_mapper = tvtk.PolyDataMapper() configure_input_data(line_mapper, line.output) line.update() line_actor = tvtk.Actor(mapper=line_mapper) v.scene.add_actor(line_actor) # And display text vtext = tvtk.VectorText() vtext.text = 'Mayavi' text_mapper = tvtk.PolyDataMapper() configure_input_data(text_mapper, vtext.get_output()) vtext.update() p2 = tvtk.Property(color=(0, 0.3, 0.3)) text_actor = tvtk.Follower(mapper=text_mapper, property=p2) text_actor.position = (0, 0, 0) v.scene.add_actor(text_actor) # Choose a view angle, and display the figure mlab.view(85, -17, 15, [3.5, -0.3, -0.8]) mlab.show() mayavi-4.5.0/docs/source/mayavi/auto/tvtk_segmentation.py0000644000076500000240000001176612747716313024245 0ustar prabhustaff00000000000000""" Using VTK to assemble a pipeline for segmenting MRI images. This example shows how to insert well-controled custom VTK filters in Mayavi. This example downloads an MRI scan, turns it into a 3D numpy array, applies a segmentation procedure made of VTK filters to extract the gray-matter/white-matter boundary. The segmentation algorithm used here is very naive and should, of course, not be used as an example of segmentation. """ ### Download the data, if not already on disk ################################## import os if not os.path.exists('MRbrain.tar.gz'): # Download the data try: from urllib import urlopen except ImportError: from urllib.request import urlopen print("Downloading data, Please Wait (7.8MB)") opener = urlopen( 'http://graphics.stanford.edu/data/voldata/MRbrain.tar.gz') open('MRbrain.tar.gz', 'wb').write(opener.read()) # Extract the data import tarfile tar_file = tarfile.open('MRbrain.tar.gz') try: os.mkdir('mri_data') except: pass tar_file.extractall('mri_data') tar_file.close() ### Read the data in a numpy 3D array ########################################## import numpy as np data = np.array([np.fromfile(os.path.join('mri_data', 'MRbrain.%i' % i), dtype='>u2') for i in range(1, 110)]) data.shape = (109, 256, 256) data = data.T ################################################################################ # Heuristic for finding the threshold for the brain # Exctract the percentile 20 and 80 (without using # scipy.stats.scoreatpercentile) sorted_data = np.sort(data.ravel()) l = len(sorted_data) lower_thr = sorted_data[0.2*l] upper_thr = sorted_data[0.8*l] # The white matter boundary: find the densest part of the upper half # of histogram, and take a value 10% higher, to cut _in_ the white matter hist, bins = np.histogram(data[data > np.mean(data)], bins=50) brain_thr_idx = np.argmax(hist) brain_thr = bins[brain_thr_idx + 4] del hist, bins, brain_thr_idx # Display the data ############################################################# from mayavi import mlab from tvtk.api import tvtk fig = mlab.figure(bgcolor=(0, 0, 0), size=(400, 500)) # to speed things up fig.scene.disable_render = True src = mlab.pipeline.scalar_field(data) # Our data is not equally spaced in all directions: src.spacing = [1, 1, 1.5] src.update_image_data = True #---------------------------------------------------------------------- # Brain extraction pipeline # In the following, we create a Mayavi pipeline that strongly # relies on VTK filters. For this, we make heavy use of the # mlab.pipeline.user_defined function, to include VTK filters in # the Mayavi pipeline. # Apply image-based filters to clean up noise thresh_filter = tvtk.ImageThreshold() thresh_filter.threshold_between(lower_thr, upper_thr) thresh = mlab.pipeline.user_defined(src, filter=thresh_filter) median_filter = tvtk.ImageMedian3D() median_filter.set_kernel_size(3, 3, 3) median = mlab.pipeline.user_defined(thresh, filter=median_filter) diffuse_filter = tvtk.ImageAnisotropicDiffusion3D( diffusion_factor=1.0, diffusion_threshold=100.0, number_of_iterations=5, ) diffuse = mlab.pipeline.user_defined(median, filter=diffuse_filter) # Extract brain surface contour = mlab.pipeline.contour(diffuse, ) contour.filter.contours = [brain_thr, ] # Apply mesh filter to clean up the mesh (decimation and smoothing) dec = mlab.pipeline.decimate_pro(contour) dec.filter.feature_angle = 60. dec.filter.target_reduction = 0.7 smooth_ = tvtk.SmoothPolyDataFilter( number_of_iterations=10, relaxation_factor=0.1, feature_angle=60, feature_edge_smoothing=False, boundary_smoothing=False, convergence=0., ) smooth = mlab.pipeline.user_defined(dec, filter=smooth_) # Get the largest connected region connect_ = tvtk.PolyDataConnectivityFilter(extraction_mode=4) connect = mlab.pipeline.user_defined(smooth, filter=connect_) # Compute normals for shading the surface compute_normals = mlab.pipeline.poly_data_normals(connect) compute_normals.filter.feature_angle = 80 surf = mlab.pipeline.surface(compute_normals, color=(0.9, 0.72, 0.62)) #---------------------------------------------------------------------- # Display a cut plane of the raw data ipw = mlab.pipeline.image_plane_widget(src, colormap='bone', plane_orientation='z_axes', slice_index=55) mlab.view(-165, 32, 350, [143, 133, 73]) mlab.roll(180) fig.scene.disable_render = False #---------------------------------------------------------------------- # To make the link between the Mayavi pipeline and the much more # complex VTK pipeline, we display both: mlab.show_pipeline(rich_view=False) from tvtk.pipeline.browser import PipelineBrowser browser = PipelineBrowser(fig.scene) browser.show() mlab.show() mayavi-4.5.0/docs/source/mayavi/auto/unstructured_grid.py0000644000076500000240000000712612747716313024247 0ustar prabhustaff00000000000000"""A MayaVi example of how to generate an unstructured grid dataset using numpy arrays. Also shown is a way to visualize this data with mayavi2. The script can be run like so: $ mayavi2 -x unstructured_grid.py Alternatively, it can be run as: $ python unstructured_grid.py Author: Prabhu Ramachandran Copyright (c) 2007, Enthought, Inc. License: BSD style. """ from numpy import array, arange, random from tvtk.api import tvtk from mayavi.scripts import mayavi2 def single_type_ug(): """Simple example showing how to create an unstructured grid consisting of cells of a single type. """ points = array([[0,0,0], [1,0,0], [0,1,0], [0,0,1], # tets [1,0,0], [2,0,0], [1,1,0], [1,0,1], [2,0,0], [3,0,0], [2,1,0], [2,0,1], ], 'f') tets = array([[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]]) tet_type = tvtk.Tetra().cell_type ug = tvtk.UnstructuredGrid(points=points) ug.set_cells(tet_type, tets) return ug def mixed_type_ug(): """A slightly more complex example of how to generate an unstructured grid with different cell types. Returns a created unstructured grid. """ points = array([[0,0,0], [1,0,0], [0,1,0], [0,0,1], # tetra [2,0,0], [3,0,0], [3,1,0], [2,1,0], [2,0,1], [3,0,1], [3,1,1], [2,1,1], # Hex ], 'f') # shift the points so we can show both. points[:,1] += 2.0 # The cells cells = array([4, 0, 1, 2, 3, # tetra 8, 4, 5, 6, 7, 8, 9, 10, 11 # hex ]) # The offsets for the cells, i.e. the indices where the cells # start. offset = array([0, 5]) tetra_type = tvtk.Tetra().cell_type # VTK_TETRA == 10 hex_type = tvtk.Hexahedron().cell_type # VTK_HEXAHEDRON == 12 cell_types = array([tetra_type, hex_type]) # Create the array of cells unambiguously. cell_array = tvtk.CellArray() cell_array.set_cells(2, cells) # Now create the UG. ug = tvtk.UnstructuredGrid(points=points) # Now just set the cell types and reuse the ug locations and cells. ug.set_cells(cell_types, offset, cell_array) return ug def save_xml(ug, file_name): """Shows how you can save the unstructured grid dataset to a VTK XML file.""" w = tvtk.XMLUnstructuredGridWriter(input=ug, file_name=file_name) w.write() # ---------------------------------------------------------------------- # Create the unstructured grids and assign scalars and vectors. ug1 = single_type_ug() ug2 = mixed_type_ug() temperature = arange(0, 120, 10, 'd') velocity = random.randn(12, 3) for ug in ug1, ug2: ug.point_data.scalars = temperature ug.point_data.scalars.name = 'temperature' # Some vectors. ug.point_data.vectors = velocity ug.point_data.vectors.name = 'velocity' # Uncomment this to save the file to a VTK XML file. #save_xml(ug2, 'file.vtu') # Now view the data. @mayavi2.standalone def view(): from mayavi.sources.vtk_data_source import VTKDataSource from mayavi.modules.outline import Outline from mayavi.modules.surface import Surface from mayavi.modules.vectors import Vectors mayavi.new_scene() # The single type one src = VTKDataSource(data = ug1) mayavi.add_source(src) mayavi.add_module(Outline()) mayavi.add_module(Surface()) mayavi.add_module(Vectors()) # Mixed types. src = VTKDataSource(data = ug2) mayavi.add_source(src) mayavi.add_module(Outline()) mayavi.add_module(Surface()) mayavi.add_module(Vectors()) if __name__ == '__main__': view() mayavi-4.5.0/docs/source/mayavi/auto/user_mayavi.py0000644000076500000240000002312712747716313023016 0ustar prabhustaff00000000000000""" Sample Mayavi customization file. This code is not to be executed as `mayavi2 -x user_mayavi.py` or `python user_mayavi.py`. Put this file in ~/.mayavi2/user_mayavi.py and rerun mayavi2 to see what it does -- the worker view may not show up by default so you will have to go to View->Other and in the Show View dialog, activate the "Custom Mayavi2 View". The added modules should show up in the menus (Look for UserOutline in the Modules) ____ This module demonstrates how to extend Mayavi. It extends the modules provided by mayavi by adding these to the Mayavi registry. Note that the registry imports customize which in turn imports this file. It also defines an Envisage plugin that is added to the default list of plugins to extend the running mayavi application. This plugin is returned by the `get_plugins()` function. This file must be placed inside the `~/.mayavi2` directory and called `user_mayavi.py`. Please note that `~/.mayavi2` is placed in `sys.path` (if the directory exists) so make sure that you choose your module names carefully (so as not to override any common module names). The file may also be placed anywhere on sys.path and called `site_mayavi.py` for global system level customizations. """ # Author: Prabhu Ramachandran # Copyright (c) 2006-2008, Enthought, Inc. # License: BSD Style. from mayavi.core.registry import registry from mayavi.core.pipeline_info import PipelineInfo from mayavi.core.metadata import ModuleMetadata # Metadata for the new module we want to add -- notice that we use a # factory function here for convenience, we could also use a class but # the reasons for doing this are documented below. user_outline = ModuleMetadata( id = "UserOutlineModule", menu_name = "&UserOutline", factory = 'user_mayavi.user_outline', desc = "Draw a cornered outline for given input", tooltip = "Draw a cornered outline for given input", help = "Draw a cornered outline for given input", input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']) ) # Register the module with the mayavi registry. registry.modules.append(user_outline) ####### # The all important function that returns the plugin we wish to add to # the default mayavi application. def get_plugins(): # We simply return a list containing the WorkerPlugin defined below. return [WorkerPlugin()] ###################################################################### # Thats it, basically. The rest of the code should really be in another # module but is in the same module for convenience here. There are # problems with doing any significant non-core module imports in this # module as documented below. ###################################################################### ###################################################################### # THE CODE BELOW SHOULD REALLY BE IN SEPARATE MODULES. # # The following can very well be in a separate module but I've kept it # here to make this a compact demo of how to customize things. ###################################################################### ###################################################################### # A new module to expose to mayavi. # # WARNING: Do not do other mayavi imports right here like for example: # 'from mayavi.modules.outline import Outline' etc. This is # because the user_mayavi is imported at a time when many of the imports # are not complete and this will cause hard-to-debug circular import # problems. The registry is given only metadata mostly in the form of # strings and this will cause no problem. Therefore to define new # modules, we strongly recommend that the modules be defined in another # module or be defined in a factory function as done below. def user_outline(): """A Factory function that creates a new module to add to the pipeline. Note that the method safely does any mayavi imports inside avoiding any circular imports. """ print("User Outline") from mayavi.modules.outline import Outline o = Outline(outline_mode='cornered', name='UserOutline') return o ###################################################################### # This code simulates something the user would like to do. In this case # we just want to create some data, view it with mayavi and modify the # data. We want to add this as a view to the standard mayavi. The code # below is simply traits code with a few extra things to be able to grab # the running mayavi instance and script it. The object we create we # offer as an envisage service offer -- this instantiates the worker. # The WorkerPlugin exposes the service offer and shows the view of this # worker. import numpy from traits.api import HasTraits, Range, Button, Instance, List from traitsui.api import Item, View ###################################################################### # `Worker` class ###################################################################### class Worker(HasTraits): """This class basically allows you to create a data set, view it and modify the dataset. This is a rather crude example but demonstrates how things can be done. """ # Set by envisage when this is contributed as a ServiceOffer. window = Instance('pyface.workbench.api.WorkbenchWindow') create_data = Button('Create data') reset_data = Button('Reset data') view_data = Button('View data') scale = Range(0.0, 1.0) source = Instance('mayavi.core.source.Source') # Our UI view. view = View(Item('create_data', show_label=False), Item('view_data', show_label=False), Item('reset_data', show_label=False), Item('scale'), resizable=True ) def get_mayavi(self): from mayavi.plugins.script import Script return self.window.get_service(Script) def _make_data(self): dims = [64, 64, 64] np = dims[0]*dims[1]*dims[2] x, y, z = numpy.ogrid[-5:5:dims[0]*1j,-5:5:dims[1]*1j,-5:5:dims[2]*1j] x = x.astype('f') y = y.astype('f') z = z.astype('f') s = (numpy.sin(x*y*z)/(x*y*z)) s = s.transpose().copy() # This makes the data contiguous. return s def _create_data_fired(self): mayavi = self.get_mayavi() from mayavi.sources.array_source import ArraySource s = self._make_data() src = ArraySource(transpose_input_array=False, scalar_data=s) self.source = src mayavi.add_source(src) def _reset_data_fired(self): self.source.scalar_data = self._make_data() def _view_data_fired(self): mayavi = self.get_mayavi() from mayavi.modules.outline import Outline from mayavi.modules.image_plane_widget import ImagePlaneWidget # Visualize the data. o = Outline() mayavi.add_module(o) ipw = ImagePlaneWidget() mayavi.add_module(ipw) ipw.module_manager.scalar_lut_manager.show_scalar_bar = True ipw_y = ImagePlaneWidget() mayavi.add_module(ipw_y) ipw_y.ipw.plane_orientation = 'y_axes' def _scale_changed(self, value): src = self.source data = src.scalar_data data += value*0.01 numpy.mod(data, 1.0, data) src.update() ###################################################################### # The following code is the small amount of envisage code that brings # the users code (above) and Envisage/Mayavi UI together. from envisage.api import Plugin, ServiceOffer ###################################################################### # `WorkerPlugin` class ###################################################################### class WorkerPlugin(Plugin): # Extension point Ids. SERVICE_OFFERS = 'envisage.ui.workbench.service_offers' VIEWS = 'envisage.ui.workbench.views' # Services we contribute. service_offers = List(contributes_to=SERVICE_OFFERS) # Views. views = List(contributes_to=VIEWS) ###################################################################### # Private methods. def _service_offers_default(self): """ Trait initializer. """ worker_service_offer = ServiceOffer( protocol = 'user_mayavi.Worker', factory = 'user_mayavi.Worker' ) return [worker_service_offer] def _views_default(self): """ Trait initializer. """ return [self._worker_view_factory] def _worker_view_factory(self, window, **traits): """ Factory method for the current selection of the engine. """ from pyface.workbench.traits_ui_view import \ TraitsUIView worker = window.get_service(Worker) tui_worker_view = TraitsUIView(obj=worker, view='view', id='user_mayavi.Worker.view', name='Custom Mayavi2 View', window=window, position='left', **traits ) return tui_worker_view # END OF CODE THAT SHOULD REALLY BE IN SEPARATE MODULES. ###################################################################### if __name__ == '__main__': import sys print("*"*80) print("ERROR: This script isn't supposed to be executed.") print(__doc__) print("*"*80) from traits.util.home_directory import get_home_directory print("Your .mayavi2 directory should be in %s"%get_home_directory()) print("*"*80) sys.exit(1) mayavi-4.5.0/docs/source/mayavi/auto/volume_slicer.py0000644000076500000240000002073512747716313023344 0ustar prabhustaff00000000000000""" Example of an elaborate dialog showing a multiple views on the same data, with 3 cuts synchronized. This example shows how to have multiple views on the same data, how to embedded multiple scenes in a dialog, and the caveat in populating them with data, as well as how to add some interaction logic on an ImagePlaneWidget. The order in which things happen in this example is important, and it is easy to get it wrong. First of all, many properties of the visualization objects cannot be changed if there is not a scene created to view them. This is why we put a lot of the visualization logic in the callback of scene.activated, which is called after creation of the scene. Second, default values created via the '_xxx_default' callback are created lazyly, that is, when the attributes are accessed. As the establishement of the VTK pipeline can depend on the order in which it is built, we trigger these access by explicitely calling the attributes. In particular, properties like scene background color, or interaction properties cannot be set before the scene is activated. The same data is exposed in the different scenes by sharing the VTK dataset between different Mayavi data sources. See the :ref:`sharing_data_between_scenes` tip for more details. In this example, the interaction with the scene and the various elements on it is strongly simplified by turning off interaction, and choosing specific scene interactor styles. Indeed, non-technical users can be confused with too rich interaction. """ # Author: Gael Varoquaux # Copyright (c) 2009, Enthought, Inc. # License: BSD Style. import numpy as np from traits.api import HasTraits, Instance, Array, \ on_trait_change from traitsui.api import View, Item, HGroup, Group from tvtk.api import tvtk from tvtk.pyface.scene import Scene from mayavi import mlab from mayavi.core.api import PipelineBase, Source from mayavi.core.ui.api import SceneEditor, MayaviScene, \ MlabSceneModel ################################################################################ # Create some data x, y, z = np.ogrid[-5:5:64j, -5:5:64j, -5:5:64j] data = np.sin(3*x)/x + 0.05*z**2 + np.cos(3*y) ################################################################################ # The object implementing the dialog class VolumeSlicer(HasTraits): # The data to plot data = Array() # The 4 views displayed scene3d = Instance(MlabSceneModel, ()) scene_x = Instance(MlabSceneModel, ()) scene_y = Instance(MlabSceneModel, ()) scene_z = Instance(MlabSceneModel, ()) # The data source data_src3d = Instance(Source) # The image plane widgets of the 3D scene ipw_3d_x = Instance(PipelineBase) ipw_3d_y = Instance(PipelineBase) ipw_3d_z = Instance(PipelineBase) _axis_names = dict(x=0, y=1, z=2) #--------------------------------------------------------------------------- def __init__(self, **traits): super(VolumeSlicer, self).__init__(**traits) # Force the creation of the image_plane_widgets: self.ipw_3d_x self.ipw_3d_y self.ipw_3d_z #--------------------------------------------------------------------------- # Default values #--------------------------------------------------------------------------- def _data_src3d_default(self): return mlab.pipeline.scalar_field(self.data, figure=self.scene3d.mayavi_scene) def make_ipw_3d(self, axis_name): ipw = mlab.pipeline.image_plane_widget(self.data_src3d, figure=self.scene3d.mayavi_scene, plane_orientation='%s_axes' % axis_name) return ipw def _ipw_3d_x_default(self): return self.make_ipw_3d('x') def _ipw_3d_y_default(self): return self.make_ipw_3d('y') def _ipw_3d_z_default(self): return self.make_ipw_3d('z') #--------------------------------------------------------------------------- # Scene activation callbaks #--------------------------------------------------------------------------- @on_trait_change('scene3d.activated') def display_scene3d(self): outline = mlab.pipeline.outline(self.data_src3d, figure=self.scene3d.mayavi_scene, ) self.scene3d.mlab.view(40, 50) # Interaction properties can only be changed after the scene # has been created, and thus the interactor exists for ipw in (self.ipw_3d_x, self.ipw_3d_y, self.ipw_3d_z): # Turn the interaction off ipw.ipw.interaction = 0 self.scene3d.scene.background = (0, 0, 0) # Keep the view always pointing up self.scene3d.scene.interactor.interactor_style = \ tvtk.InteractorStyleTerrain() def make_side_view(self, axis_name): scene = getattr(self, 'scene_%s' % axis_name) # To avoid copying the data, we take a reference to the # raw VTK dataset, and pass it on to mlab. Mlab will create # a Mayavi source from the VTK without copying it. # We have to specify the figure so that the data gets # added on the figure we are interested in. outline = mlab.pipeline.outline( self.data_src3d.mlab_source.dataset, figure=scene.mayavi_scene, ) ipw = mlab.pipeline.image_plane_widget( outline, plane_orientation='%s_axes' % axis_name) setattr(self, 'ipw_%s' % axis_name, ipw) # Synchronize positions between the corresponding image plane # widgets on different views. ipw.ipw.sync_trait('slice_position', getattr(self, 'ipw_3d_%s'% axis_name).ipw) # Make left-clicking create a crosshair ipw.ipw.left_button_action = 0 # Add a callback on the image plane widget interaction to # move the others def move_view(obj, evt): position = obj.GetCurrentCursorPosition() for other_axis, axis_number in self._axis_names.items(): if other_axis == axis_name: continue ipw3d = getattr(self, 'ipw_3d_%s' % other_axis) ipw3d.ipw.slice_position = position[axis_number] ipw.ipw.add_observer('InteractionEvent', move_view) ipw.ipw.add_observer('StartInteractionEvent', move_view) # Center the image plane widget ipw.ipw.slice_position = 0.5*self.data.shape[ self._axis_names[axis_name]] # Position the view for the scene views = dict(x=( 0, 90), y=(90, 90), z=( 0, 0), ) scene.mlab.view(*views[axis_name]) # 2D interaction: only pan and zoom scene.scene.interactor.interactor_style = \ tvtk.InteractorStyleImage() scene.scene.background = (0, 0, 0) @on_trait_change('scene_x.activated') def display_scene_x(self): return self.make_side_view('x') @on_trait_change('scene_y.activated') def display_scene_y(self): return self.make_side_view('y') @on_trait_change('scene_z.activated') def display_scene_z(self): return self.make_side_view('z') #--------------------------------------------------------------------------- # The layout of the dialog created #--------------------------------------------------------------------------- view = View(HGroup( Group( Item('scene_y', editor=SceneEditor(scene_class=Scene), height=250, width=300), Item('scene_z', editor=SceneEditor(scene_class=Scene), height=250, width=300), show_labels=False, ), Group( Item('scene_x', editor=SceneEditor(scene_class=Scene), height=250, width=300), Item('scene3d', editor=SceneEditor(scene_class=MayaviScene), height=250, width=300), show_labels=False, ), ), resizable=True, title='Volume Slicer', ) m = VolumeSlicer(data=data) m.configure_traits() mayavi-4.5.0/docs/source/mayavi/auto/volume_slicer_advanced.py0000644000076500000240000002643412747716313025173 0ustar prabhustaff00000000000000""" An efficient implementation of the triple-plane view showing 3 cut planes on volumetric data, and side views showing each cut, with a cursor to move the other cuts. This is an example of complex callback interaction. It builds on the :ref:`example_volume_slicer` but has more complex logic. You should try to understand the :ref:`example_volume_slicer` first. In this example, the VolumeSlicer object displays a position attribute giving the position of the cut in data coordinates. Traits callbacks are used to move the cut planes when this position attribute is modifed. In the 3D window, the 3D cuts are displayed using ImagePlaneWidgets cutting the 3D volumetric data. The data extracted by the ImagePlaneWidgets for plotting is captured using the TVTK ImagePlaneWidget's `_get_reslice_output` method. The resulting dataset is plotted in each side view using another ImagePlaneWidget. As a result the data is not copied (at the VTK level, there is only one pipeline), and modifications of the data plotted on the planes in the 3D view (for instance when these planes are moved) are propagated to the 2D side views by the VTK pipeline. A cursor is displayed in each side view using a glyph. The cursor indicates the position of the cut. In the side view, when the mouse button is pressed on the planes, it creates a VTK `InteractionEvent`. When this happens, VTK calls an callback (observer, it VTK terms), that we use to move the position of the cut. The Traits callbacks do the rest for the updating. """ import numpy as np from traits.api import HasTraits, Instance, Array, \ Bool, Dict, on_trait_change from traitsui.api import View, Item, HGroup, Group from tvtk.api import tvtk from tvtk.pyface.scene import Scene from mayavi import mlab from mayavi.core.api import PipelineBase, Source from mayavi.core.ui.api import SceneEditor, MlabSceneModel ################################################################################ # The object implementing the dialog class VolumeSlicer(HasTraits): # The data to plot data = Array # The position of the view position = Array(shape=(3,)) # The 4 views displayed scene3d = Instance(MlabSceneModel, ()) scene_x = Instance(MlabSceneModel, ()) scene_y = Instance(MlabSceneModel, ()) scene_z = Instance(MlabSceneModel, ()) # The data source data_src = Instance(Source) # The image plane widgets of the 3D scene ipw_3d_x = Instance(PipelineBase) ipw_3d_y = Instance(PipelineBase) ipw_3d_z = Instance(PipelineBase) # The cursors on each view: cursors = Dict() disable_render = Bool _axis_names = dict(x=0, y=1, z=2) #--------------------------------------------------------------------------- # Object interface #--------------------------------------------------------------------------- def __init__(self, **traits): super(VolumeSlicer, self).__init__(**traits) # Force the creation of the image_plane_widgets: self.ipw_3d_x self.ipw_3d_y self.ipw_3d_z #--------------------------------------------------------------------------- # Default values #--------------------------------------------------------------------------- def _position_default(self): return 0.5*np.array(self.data.shape) def _data_src_default(self): return mlab.pipeline.scalar_field(self.data, figure=self.scene3d.mayavi_scene, name='Data',) def make_ipw_3d(self, axis_name): ipw = mlab.pipeline.image_plane_widget(self.data_src, figure=self.scene3d.mayavi_scene, plane_orientation='%s_axes' % axis_name, name='Cut %s' % axis_name) return ipw def _ipw_3d_x_default(self): return self.make_ipw_3d('x') def _ipw_3d_y_default(self): return self.make_ipw_3d('y') def _ipw_3d_z_default(self): return self.make_ipw_3d('z') #--------------------------------------------------------------------------- # Scene activation callbacks #--------------------------------------------------------------------------- @on_trait_change('scene3d.activated') def display_scene3d(self): outline = mlab.pipeline.outline(self.data_src, figure=self.scene3d.mayavi_scene, ) self.scene3d.mlab.view(40, 50) # Interaction properties can only be changed after the scene # has been created, and thus the interactor exists for ipw in (self.ipw_3d_x, self.ipw_3d_y, self.ipw_3d_z): ipw.ipw.interaction = 0 self.scene3d.scene.background = (0, 0, 0) # Keep the view always pointing up self.scene3d.scene.interactor.interactor_style = \ tvtk.InteractorStyleTerrain() self.update_position() def make_side_view(self, axis_name): scene = getattr(self, 'scene_%s' % axis_name) scene.scene.parallel_projection = True ipw_3d = getattr(self, 'ipw_3d_%s' % axis_name) # We create the image_plane_widgets in the side view using a # VTK dataset pointing to the data on the corresponding # image_plane_widget in the 3D view (it is returned by # ipw_3d._get_reslice_output()) side_src = ipw_3d.ipw._get_reslice_output() ipw = mlab.pipeline.image_plane_widget( side_src, plane_orientation='z_axes', vmin=self.data.min(), vmax=self.data.max(), figure=scene.mayavi_scene, name='Cut view %s' % axis_name, ) setattr(self, 'ipw_%s' % axis_name, ipw) # Extract the spacing of the side_src to convert coordinates # into indices spacing = side_src.spacing # Make left-clicking create a crosshair ipw.ipw.left_button_action = 0 x, y, z = self.position cursor = mlab.points3d(x, y, z, mode='axes', color=(0, 0, 0), scale_factor=2*max(self.data.shape), figure=scene.mayavi_scene, name='Cursor view %s' % axis_name, ) self.cursors[axis_name] = cursor # Add a callback on the image plane widget interaction to # move the others this_axis_number = self._axis_names[axis_name] def move_view(obj, evt): # Disable rendering on all scene position = list(obj.GetCurrentCursorPosition()*spacing)[:2] position.insert(this_axis_number, self.position[this_axis_number]) # We need to special case y, as the view has been rotated. if axis_name is 'y': position = position[::-1] self.position = position ipw.ipw.add_observer('InteractionEvent', move_view) ipw.ipw.add_observer('StartInteractionEvent', move_view) # Center the image plane widget ipw.ipw.slice_position = 0.5*self.data.shape[ self._axis_names[axis_name]] # 2D interaction: only pan and zoom scene.scene.interactor.interactor_style = \ tvtk.InteractorStyleImage() scene.scene.background = (0, 0, 0) # Some text: mlab.text(0.01, 0.8, axis_name, width=0.08) # Choose a view that makes sens views = dict(x=(0, 0), y=(90, 180), z=(0, 0)) mlab.view(views[axis_name][0], views[axis_name][1], focalpoint=0.5*np.array(self.data.shape), figure=scene.mayavi_scene) scene.scene.camera.parallel_scale = 0.52*np.mean(self.data.shape) @on_trait_change('scene_x.activated') def display_scene_x(self): return self.make_side_view('x') @on_trait_change('scene_y.activated') def display_scene_y(self): return self.make_side_view('y') @on_trait_change('scene_z.activated') def display_scene_z(self): return self.make_side_view('z') #--------------------------------------------------------------------------- # Traits callback #--------------------------------------------------------------------------- @on_trait_change('position') def update_position(self): """ Update the position of the cursors on each side view, as well as the image_plane_widgets in the 3D view. """ # First disable rendering in all scenes to avoid unecessary # renderings self.disable_render = True # For each axis, move image_plane_widget and the cursor in the # side view for axis_name, axis_number in self._axis_names.items(): ipw3d = getattr(self, 'ipw_3d_%s' % axis_name) ipw3d.ipw.slice_position = self.position[axis_number] # Go from the 3D position, to the 2D coordinates in the # side view position2d = list(self.position) position2d.pop(axis_number) if axis_name is 'y': position2d = position2d[::-1] # Move the cursor # For the following to work, you need Mayavi 3.4.0, if you # have a less recent version, use 'x=[position2d[0]]' self.cursors[axis_name].mlab_source.set( x=position2d[0], y=position2d[1], z=0) # Finally re-enable rendering self.disable_render = False @on_trait_change('disable_render') def _render_enable(self): for scene in (self.scene3d, self.scene_x, self.scene_y, self.scene_z): scene.scene.disable_render = self.disable_render #--------------------------------------------------------------------------- # The layout of the dialog created #--------------------------------------------------------------------------- view = View(HGroup( Group( Item('scene_y', editor=SceneEditor(scene_class=Scene), height=250, width=300), Item('scene_z', editor=SceneEditor(scene_class=Scene), height=250, width=300), show_labels=False, ), Group( Item('scene_x', editor=SceneEditor(scene_class=Scene), height=250, width=300), Item('scene3d', editor=SceneEditor(scene_class=Scene), height=250, width=300), show_labels=False, ), ), resizable=True, title='Volume Slicer', ) ################################################################################ if __name__ == '__main__': # Create some data x, y, z = np.ogrid[-5:5:100j, -5:5:100j, -5:5:100j] data = np.sin(3*x)/x + 0.05*z**2 + np.cos(3*y) m = VolumeSlicer(data=data) m.configure_traits() mayavi-4.5.0/docs/source/mayavi/auto/wigner.py0000644000076500000240000000546212747716313021767 0ustar prabhustaff00000000000000""" An example in which 3 functions of x and y are displayed with a surf plot, while the z scaling is kept constant, to allow comparison between them. The important aspect of this example is that the 3 functions should not be displayed on top of each other, but side by side. For this we use the extent keyword argument. In addition, the relative scale between the different plots is important. This is why we also use the `warp_scale` keyword argument, to have the same scale on all plots. Finally, we have to adjust the data bounds: as we want the "horizon" of the wigner function in the middle of our extents, we put this to zero. We add a set of axes and outlines to the plot. We have to play we extents and ranges in order to make them fit with the data. """ # Author: Gael Varoquaux # Copyright (c) 2007, Enthought, Inc. # License: BSD Style. import numpy from mayavi import mlab def cat(x, y, alpha, eta=1, purity=1): """ Multiphoton shrodinger cat. eta is the fidelity, alpha the number of photons""" cos = numpy.cos exp = numpy.exp return (1 + eta * (exp(-x ** 2 - (y - alpha) ** 2) + exp(-x ** 2 - (y + alpha) ** 2) + 2 * purity * exp(-x ** 2 - y ** 2) * cos(2 * \ alpha * x)) / (2 * (1 + exp(- alpha ** 2)))) / 2 x, y = numpy.mgrid[-4:4.15:0.1, -4:4.15:0.1] mlab.figure(1, size=(500, 250), fgcolor=(1, 1, 1), bgcolor=(0.5, 0.5, 0.5)) mlab.clf() cat1 = cat(x, y, 1) cat2 = cat(x, y, 2) cat3 = cat(x, y, 3) # The cats lie in a [0, 1] interval, with .5 being the assymptotique # value. We want to reposition this value to 0, so as to put it in the # center of our extents. cat1 -= 0.5 cat2 -= 0.5 cat3 -= 0.5 cat1_extent = (-14, -6, -4, 4, 0, 5) surf_cat1 = mlab.surf(x - 10, y, cat1, colormap='Spectral', warp_scale=5, extent=cat1_extent, vmin=-0.5, vmax=0.5) mlab.outline(surf_cat1, color=(.7, .7, .7), extent=cat1_extent) mlab.axes(surf_cat1, color=(.7, .7, .7), extent=cat1_extent, ranges=(0, 1, 0, 1, 0, 1), xlabel='', ylabel='', zlabel='Probability', x_axis_visibility=False, z_axis_visibility=False) mlab.text(-18, -4, '1 photon', z=-4, width=0.13) cat2_extent = (-4, 4, -4, 4, 0, 5) surf_cat2 = mlab.surf(x, y, cat2, colormap='Spectral', warp_scale=5, extent=cat2_extent, vmin=-0.5, vmax=0.5) mlab.outline(surf_cat2, color=(0.7, .7, .7), extent=cat2_extent) mlab.text(-4, -3, '2 photons', z=-4, width=0.14) cat3_extent = (6, 14, -4, 4, 0, 5) surf_cat3 = mlab.surf(x + 10, y, cat3, colormap='Spectral', warp_scale=5, extent=cat3_extent, vmin=-0.5, vmax=0.5) mlab.outline(surf_cat3, color=(.7, .7, .7), extent=cat3_extent) mlab.text(6, -2.5, '3 photons', z=-4, width=0.14) mlab.title('Multi-photons cats Wigner function') mlab.view(142, -72, 32) mlab.show() mayavi-4.5.0/docs/source/mayavi/auto/wx_embedding.py0000644000076500000240000000407712747716313023131 0ustar prabhustaff00000000000000""" This example shows to embed a Mayavi view in a wx frame. The trick is to create a `HasTraits` object, as in the mlab_traits_ui.py, mayavi_traits_ui.py, or the modifying_mlab_source.py examples (:ref:`example_mlab_traits_ui`, :ref:`example_mayavi_traits_ui`, :ref:`example_mlab_interactive_dialog`). Calling the `edit_traits` method returns a `ui` object whose `control` attribute is the wx widget. It can thus be embedded in a standard wx application. In this example, the wx part is very simple. See :ref:`example_wx_mayavi_embed_in_notebook` for an example of more complex embedding of Mayavi scenes in Wx applications. """ from numpy import ogrid, sin from traits.api import HasTraits, Instance from traitsui.api import View, Item from mayavi.sources.api import ArraySource from mayavi.modules.api import IsoSurface from mayavi.core.ui.api import SceneEditor, MlabSceneModel class MayaviView(HasTraits): scene = Instance(MlabSceneModel, ()) # The layout of the panel created by Traits view = View(Item('scene', editor=SceneEditor(), resizable=True, show_label=False), resizable=True) def __init__(self): HasTraits.__init__(self) # Create some data, and plot it using the embedded scene's engine x, y, z = ogrid[-10:10:100j, -10:10:100j, -10:10:100j] scalars = sin(x*y*z)/(x*y*z) src = ArraySource(scalar_data=scalars) self.scene.engine.add_source(src) src.add_module(IsoSurface()) #----------------------------------------------------------------------------- # Wx Code import wx class MainWindow(wx.Frame): def __init__(self, parent, id): wx.Frame.__init__(self, parent, id, 'Mayavi in Wx') self.mayavi_view = MayaviView() # Use traits to create a panel, and use it as the content of this # wx frame. self.control = self.mayavi_view.edit_traits( parent=self, kind='subpanel').control self.Show(True) app = wx.PySimpleApp() frame = MainWindow(None, wx.ID_ANY) app.MainLoop() mayavi-4.5.0/docs/source/mayavi/auto/wx_mayavi_embed_in_notebook.py0000644000076500000240000000531112747716313026213 0ustar prabhustaff00000000000000""" This example show how to embedded Mayavi in a wx notebook. This is a slightly more complex example than the `wx_embedding` example ( :ref:`example_wx_embedding`), and can be used to see how a large wx application can use different Mayavi views. In this example, we embed one single Mayavi scene in a Wx notebook, with 2 tabs, each one of them hosting a different view of the scene. """ # First thing, we need to make sure that we are importing a # recent-enough version of wx import wxversion wxversion.ensureMinimal('2.8') from numpy import ogrid, sin from traits.api import HasTraits, Instance from traitsui.api import View, Item from mayavi.sources.api import ArraySource from mayavi.modules.api import IsoSurface from mayavi.core.ui.api import MlabSceneModel, SceneEditor #------------------------------------------------------------------------------- class MayaviView(HasTraits): scene = Instance(MlabSceneModel, ()) # The layout of the panel created by traits. view = View(Item('scene', editor=SceneEditor(), resizable=True, show_label=False), resizable=True) def __init__(self): HasTraits.__init__(self) x, y, z = ogrid[-10:10:100j, -10:10:100j, -10:10:100j] scalars = sin(x*y*z)/(x*y*z) src = ArraySource(scalar_data=scalars) self.scene.mayavi_scene.add_child(src) src.add_module(IsoSurface()) #------------------------------------------------------------------------------- # Wx Code import wx class MainWindow(wx.Frame): def __init__(self, parent, id): wx.Frame.__init__(self, parent, id, 'Mayavi in a Wx notebook') self.notebook = wx.aui.AuiNotebook(self, id=-1, style=wx.aui.AUI_NB_TAB_SPLIT | wx.aui.AUI_NB_CLOSE_ON_ALL_TABS | wx.aui.AUI_NB_LEFT) self.mayavi_view = MayaviView() # The edit_traits method opens a first view of our 'MayaviView' # object self.control = self.mayavi_view.edit_traits( parent=self, kind='subpanel').control self.notebook.AddPage(page=self.control, caption='Display 1') self.mayavi_view2 = MayaviView() # The second call to edit_traits opens a second view self.control2 = self.mayavi_view2.edit_traits( parent=self, kind='subpanel').control self.notebook.AddPage(page=self.control2, caption='Display 2') sizer = wx.BoxSizer() sizer.Add(self.notebook,1, wx.EXPAND) self.SetSizer(sizer) self.Show(True) if __name__ == '__main__': app = wx.PySimpleApp() frame = MainWindow(None, wx.ID_ANY) app.MainLoop() mayavi-4.5.0/docs/source/mayavi/auto/zzz_reader.py0000644000076500000240000000336512747716313022653 0ustar prabhustaff00000000000000"""This is a simple example that shows how to create a reader factory and register that reader with mayavi. To use this: - put this in ~/.mayavi2/ - then import this module in your ~/.mayavi2/user_mayavi.py. that's it. What you should get: - Options to open .zzz files from the file->open menu. - Open .zzz files via right click. - Open .zzz files from the engine or mlab (via open) - do mayavi2 -d foo.zzz. """ from mayavi.core.api import registry, SourceMetadata, PipelineInfo def zzz_reader(fname, engine): """Reader for .zzz files. Parameters: ----------- fname -- Filename to be read. engine -- The engine the source will be associated with. """ from tvtk.api import tvtk from mayavi.sources.vtk_data_source import VTKDataSource # Do your own reader stuff here, I'm just reading a VTK file with a # different extension here. r = tvtk.StructuredPointsReader(file_name=fname) r.update() src = VTKDataSource(data=r.output) return src zzz_reader_info = SourceMetadata( id = "ZZZReader", factory = 'zzz_reader.zzz_reader', tooltip = "Load a ZZZ file", desc = "Load a ZZZ file", help = "Load a ZZZ file", menu_name = "&ZZZ file", extensions = ['zzz'], wildcard = 'ZZZ files (*.zzz)|*.zzz', output_info = PipelineInfo(datasets=['unstructured_grid'], attribute_types=['any'], attributes=['any']) ) # Inject this information in the mayavi registry registry.sources.append(zzz_reader_info) if __name__ == '__main__': import sys print("*"*80) print("ERROR: This script isn't supposed to be executed.") print(__doc__) print("*"*80) sys.exit(1) mayavi-4.5.0/docs/source/mayavi/bugs.rst0000644000076500000240000000351212747716313020636 0ustar prabhustaff00000000000000.. _known_bugs: Known bugs and issues ===================== The Known Issues section contains those items that are big and important but are not currently actively worked on, because they need a lot of effort or there is no solution yet for them. For a more detailed list of issues and bugs please check the list in `issue tracker`_. * **Display bugs:** Mayavi, and VTK, heavily use hardware rendering, as a result are very sensitive to hardware rendering bugs. Common issues include surfaces showing up as black instead of colored (mostly on windows or in virtual machines, I believe), z-ordering bugs where hidden triangles are displayed in front of the triangles that should hide them (a common bug on Linux with intel graphics cards), or the rendering windows becoming grey when the focus is moved out (often seen on Linux, when compiz is enabled). The solution is most often simply to turn off hardware rendering in the system settings (turn off compiz under Linux) or change graphics-card drivers (under Linux, try switching between the open source one, and the proprietary one). * **Python 3:** The plans for Mayavi on Python 3 are mainly linked to VTK being available on Python 3. Transitioning to Python 3 would also require the gui libraries such as traitsui and pyface to also support Python 3. For more details please check the related github `issue `_. * **Qt 5:** Mayavi is built on top of the traitsui and pyface gui libraries. Thus support for Qt 5 is linked to these gui libraries supporting Qt 5. * **wxPython 3:** Similar to the Qt 5 issue support for wxPython 3 is linked with the necessary support arriving in the stable releases of the gui libraries. .. _issue tracker: https://github.com/enthought/mayavi/issues mayavi-4.5.0/docs/source/mayavi/building_applications.rst0000644000076500000240000002737212747716313024253 0ustar prabhustaff00000000000000 .. _builing_applications: Building applications using Mayavi =================================== .. topic:: Section summary This section describes how Mayavi can be used as a scientific data visualization and 3D plotting tool in interactive application. Mayavi can be used as a fully integrated and interactive 3D plotting tool in a GUI application. Using the event model behind Traits and TVTK, all the different properties of a visualization can be changed dynamically, including the data visualized itself. In this section, we first show how an interactive dialog embedding a Mayavi scene can be built, using `Traits`. Then we show how to integrate this dialog in a WxPython or a PyQt (or PySide) application. Custom interactive dialogs -------------------------- Mayavi and TVTK are entirely built using the Traits library which provides easy callbacks and visualization for objects attribute. All the different properties of the pipeline and pipeline objects are expressed as Traits, i.e. special attributes that can be visualized in dialogs and that fire callbacks when they are modified. In particular this means that when a visualization object is modified, the scene can update automatically. We strongly suggest that you refer to the `Traits` `documentation `_ for more details. There are also a list of introductory `materials ` for learning Traits and Traits UI. .. _embedding_mayavi_traits: Embedding a Mayavi scene in a Traits dialog ............................................ To build a custom dialog with a Mayavi scene, the best option is to create a class deriving from the base `Traits` class. A special attribute, called SceneModel can be used as an attribute to represent a Mayavi scene that can accept objects. This defines the `model`, i.e. the main `HasTraits` object in which the application logics is contained. A view of this object, as a dialog, can be created using the `.configure_traits` method of this object. If a view is explicitely specified the embedded Mayavi scene can be represented with the usual widget for scene by specifying for it the `SceneEditor`:: from traits.api import HasTraits, Instance from traitsui.api import View, Item from tvtk.pyface.scene_model import SceneModel from tvtk.pyface.scene_editor import SceneEditor class MyModel(HasTraits): scene = Instance(SceneModel, ()) view = View(Item('scene', height=400, show_label=False, editor=SceneEditor())) MyModel().configure_traits() A `Mayavi` button to pop up the pipeline dialog can be added on the toolbar by specifying a different scene view to the `SceneEditor`:: from mayavi.core.ui.mayavi_scene import MayaviScene #... editor=SceneEditor(scene_class=MayaviScene) #... If, on the contrary, you want a view with no toolbar, you can replace the `MayaviView` by a raw tvtk view:: from tvtk.pyface.api import Scene #... editor=SceneEditor(scene_class=Scene) #... The :ref:`example_mayavi_traits_ui` is a fairly comprehensive example that demonstrates how you can embed almost the entire Mayavi UI into your traits based UI. A scene, with `mlab` embedded .............................. An object representing a scene is interesting only if you can visualize data with the scene. For this we can instanciate an `Engine` and assign it to the scene. Having an `Engine` only for one scene allows us to confine action and visualization objects only to this scene. We can also use an `MlabSceneModel` instance, rather than a `SceneModel`, imported from `mayavi.tools.mlab_scene_model`. This scene model registers the figure in `mlab` (:ref:`simple-scripting-with-mlab`). It has an embedded mlab attribute, that exposes the mlab commands (see :ref:`mlab_plotting_functions`). For instance plotting 3D points can be achieved with `self.scene.mlab.points3d(x, y, z, s)`. .. warning:: Embedding several scenes in an application When using several 'MlabSceneModel' in an application, there is an ambiguity regarding which scene mlab should use to plot to. This is why relying on using the current figure, as mlab most often does, is dangerous. The solution to this, is explicitly pass in the Mayavi figure to mlab's figure keyword argument:: mlab.points3d(x, y, z, s, figure=self.scene.mayavi_scene) However, this functionality is new in Mayavi 3.2.1. A full example with two embedded scenes is given on :ref:`example_multiple_mlab_scene_models`. Another way of creating isolation between scene is to explicitly insert them in different engines. This is demonstrated in :ref:`example_multiple_engines` Making the visualization live .............................. Having an interactive application is interesting only if you can do custom, domain-specific, interaction with the visualization. An important use case is modifying the data visualized as a parameter is changed interactively. For this we can use the inplace modification of the data of an mlab object, as for animation of an mlab plot (see :ref:`mlab-animating-data`). Suppose we are plotting a line curve defined by a function of two parameters:: from numpy import linspace, pi, cos, sin def curve(n_mer, n_long): phi = linspace(0, 2*pi, 2000) return [ cos(phi*n_mer) * (1 + 0.5*cos(n_long*phi)), sin(phi*n_mer) * (1 + 0.5*cos(n_long*phi)), 0.5*sin(n_long*phi), sin(phi*n_mer)] Using `mlab`, we could plot the curve with `plot3d`:: x, y, z, s = curve(4, 6) from mayavi import mlab plot = mlab.plot3d(x, y, z, s) Modifying the plot for new parameters could be written:: x, y, z, t = curve(4, 8) plot.mlab_source.set(x=x, y=y, z=z, scalars=t) In a dialog, this would be:: from traits.api import HasTraits, Range, Instance, \ on_trait_change from traitsui.api import View, Item, HGroup from tvtk.pyface.scene_editor import SceneEditor from mayavi.tools.mlab_scene_model import \ MlabSceneModel from mayavi.core.ui.mayavi_scene import MayaviScene class Visualization(HasTraits): meridional = Range(1, 30, 6) transverse = Range(0, 30, 11) scene = Instance(MlabSceneModel, ()) def __init__(self): # Do not forget to call the parent's __init__ HasTraits.__init__(self) x, y, z, t = curve(self.meridional, self.transverse) self.plot = self.scene.mlab.plot3d(x, y, z, t, colormap='Spectral') @on_trait_change('meridional,transverse') def update_plot(self): x, y, z, t = curve(self.meridional, self.transverse) self.plot.mlab_source.set(x=x, y=y, z=z, scalars=t) # the layout of the dialog created view = View(Item('scene', editor=SceneEditor(scene_class=MayaviScene), height=250, width=300, show_label=False), HGroup( '_', 'meridional', 'transverse', ), ) visualization = Visualization() visualization.configure_traits() This code creates the following dialog: .. image:: images/example_mlab_interactive_dialog.jpg :align: center A complete, runnable, code based on the above comments is given in the :ref:`example_mlab_interactive_dialog`. .. warning:: Visualization objects and properties created before a scene is available When creating a traited object with an embedded scene, the scene can be created and populated before a view on it is actually open. However, some VTK objects or properties require a scene with a camera and interaction to be open to work properly, mainly because either they orient themselves to the camera, or deal with interaction with keyboard or mouse (such as interactors, eg an implicit plane). As a result some property changes on VTK objects will raise warnings or simply not work when applied without a dialog opened. When embedding a scene in a Traits object, the best option is to create and modify these objects only when the scene is activated, by listening to changes on the 'scene.activated' traits:: @on_trait_change('scene.activated') def create_plot(self): # Do the plotting here # ... The :ref:`example_lorenz_ui` shows a good example of this situation. .. topic:: Learning by examples Several full-featured examples can be used to learn more about how to develop an application with visualization and data processing with Traits and Mayavi: * :ref:`example_lorenz_ui`: A didactic and simple example that shows how the lorenz model can be integrated and visualized interactively while changing the model parameters. * :ref:`example_mayavi_traits_ui`: An example showing how you can mimic the UI of the Mayavi application with simple code using Traits. * :ref:`example_multiple_engines`: An example showing how you can isolate different scenes by affecting them to different engines. * :ref:`example_coil_design_application`: A full-blown and elaborate application enabling specification of a current-loop description for a coil, and integration of the resulting magnetic field with real-time visualization of the field and the coil structure. Integrating in a WxPython application -------------------------------------- Using the `Visualization` class defined above:: import wx class MainWindow(wx.Frame): def __init__(self, parent, id): wx.Frame.__init__(self, parent, id, 'Mayavi in Wx') self.visualization = Visualization() self.control = self.visualization.edit_traits(parent=self, kind='subpanel').control self.Show() app = wx.PySimpleApp() frame = MainWindow(None, wx.ID_ANY) app.MainLoop() Two examples of integrating Mayavi visualization with Wx applications are given: * :ref:`example_wx_embedding`: a simple example, as above. * :ref:`example_wx_mayavi_embed_in_notebook`: a more complexe example, showing 2 different Mayavi views embedded in a Wx notebook. .. _integrating_pyqt: Integrating in a Qt application ---------------------------------- Mayavi dialogs can also be integrated in a PyQt or PySide application. Before defining the `Visualization` class, you should set the toolkit used by Traits to the Qt backend:: import os os.environ['ETS_TOOLKIT'] = 'qt4' Also, as Traits runs with PyQt and PySide, if you use PyQt, you must make sure that you swith its binding in a mode that is compatible with PySide (internal string representation mode), **before you import any PyQt code**:: import sip sip.setapi('QString', 2) By default, with modern versions of the Enthought Tool Suite, Traits will use PySide. To force the use of PyQt, you must set the QT_API environment variable:: os.environ['QT_API'] = 'pyqt' Then using the visualization class defined above:: from PyQt4 import QtGui class MainWindow(QtGui.QMainWindow): def __init__(self, parent=None): QtGui.QWidget.__init__(self, parent) self.visualization = Visualization() self.ui = self.visualization.edit_traits().control self.setCentralWidget(self.ui) window = MainWindow() window.show() QtGui.qApp.exec_() For a full-blown example of embedding in Qt, see :ref:`example_qt_embedding`. .. warning:: On definition of the model (and thus previous to the start of the event loop), Traits sets up some hooks on the main QApplication. As a result if you instanciate a new one, using for instance:: app = QtGui.QApplication() Your Traits application will not work. mayavi-4.5.0/docs/source/mayavi/changes.rst0000644000076500000240000000020012747716313021275 0ustar prabhustaff00000000000000 .. This file is there only to add a level in the table of content Changelog =========== .. toctree:: auto/changes.rst mayavi-4.5.0/docs/source/mayavi/citation.bib0000644000076500000240000000044212747716313021433 0ustar prabhustaff00000000000000@article{ramachandran2011mayavi, title={{Mayavi: 3D Visualization of Scientific Data}}, author={Ramachandran, P. and Varoquaux, G.}, journal={Computing in Science \& Engineering}, volume={13}, number={2}, pages={40--51}, issn={1521-9615}, year={2011}, publisher={IEEE} } mayavi-4.5.0/docs/source/mayavi/clamping_off.jpg0000644000076500000240000002070112747716313022271 0ustar prabhustaff00000000000000JFIFC     C  xd"  󞦉^y3pZ+%d\WPX]_a%tTWr~$}Rk/:~GFwz/ ߚ55 /N0=R_fy~O,$زtAː3Ⱦ/?[g+6̗cwsc>ˀPMu.|x=3EKzu-kbOit dnKnCCYx5`I&5%Żc: m#g(2z]aЛA3A~oջ=kgm<΍sjU-i=Mwnƒq%Y_F_1Ampo+`If~ij& %}Iqr/Ұ͝jp[ xM>K=Ewsj2BxQ_ ϝ aT:+!w)+(?(!@ `0PnNxT'Z'8Eg,0'f>1Ԇ-0lM~݁Rtx2%gD4s(cZ:gQ|&A3K-&zނHNv_Qiox#AaǬ!kueBA.΃3w'Cv;Ќd4d-cNm W/.rTX5oxx"cаYU̼#X53E.VW#OaYd0k=ߨ6tLK`u^}.ʜdj?,4,INӃKs,+rgď:Fy5ܸNZ)Uw[K*׮NY5c,{̭` =꘲Ki[!|0G%y5]^R |$rY 2v<|$fNG4|u [AUBZwbB5PΏM]DGcֵ(Ɛ#Es;EGoms!~fbK6և@!lc167IebJcW P׏T*Ji 7-ܕS{U-ҷx_PRd 8 9jjBk4ϋ)R!k$~|I@ ֖Tfo; > ɝ*q4lu*seߥ$ 2:Zɤ: CqYnlG&PH' o\T; =i+AaaY+'x_Tb-)1ԣ`+5rJ8;qo_bJ 0_j-SYTN4T=Ec,L[jM5\X2Tq m:iMlEf\5%]em7V^v BdJsֶ$wgK/0yd 4RzC>eԓRO#/O΍HM*xbϺO N[}^̀N\њZoJ_׋$a-'1k˅ Z=7:b~jNbdwJ-Oߥ[}NCCJ翳<7+[xUrC*W({ǺҲS&`ZO 꽳\ײ>odQ~kdr[sc / m(n¸ RTgn.TqP6Er^LKA#GS%T@xcziyu%ɲ'v:ڴ X]Ik~헛t?mTm"f%D7kW$L(; f,sv*lO F62Mܯ  T[t1qS-9{p֛)ACVIYsBrbRMz9p\Rԟlev=-~Vr/8G՞얿FFi=#ڣy֓9h7y8آY)ŨHRj6B [u')#͗^?MVkJAW*qz9P5b]wUjVډ9+[e/XI-G.V\=E6\Iкs+&CT>9$VO[w`P&B`!i)ZNowR}%HP@=Bӭ$ pF2E8ȣ?R2dzBZ wUFQ)RuQS/z[BTտJr xo{ ~SdIJGcU6_F˹/zL;JcFml!}eJWRf[P!u*;\7xŔМ*p^0n?;3Ih}Ɔ܅)zji~'~rMC#Z)t38Qj,OxuaܫOUJvPi]~pcĜv6 ZŨ{*WJ]H6!(C#dܼ&[)GU*fso' :‡#?uIn}g]~*!1AQa q@0P`?!?ji6; DؐcH!F K4)_@d ZJIβn^ۋe.v`:F6.!`Zrk*5MV16gzO$O pjyWp .vOW30CN$N~!hFƘ'.X- $TKxH-x0Tu#E0%v$URZ ##XC UK\*}oE3~|Dv5whc#8 B*ņSㄮ]*1uOq^OHZfRC1 ӎh}Qz4Cw"E#UE6 2ᰀ q ]!F[pdP(8*x2RO/G0$ׄb܀#*Z 3Ԑ0# 0%x2wwWsb<$a=#LJX"B@U~H LYq(L,/"?g;%#;0uUݏ[Z'2AKu<4HԔS+ό> &1U埀/72#&Xo='fD0$'S D2bAH )^D3їihG |Lz7(|e b"LḞVg0,'LNYƾ|Gt'Xok&N d vF֫B-EF)ZD;1b%FM\כrI2F4w,,Y2D5{_AdƝP=^LJ!q?{0ѰR\_j?>g6ce8r -҈G K# ;ݭO??œ!2 + r.Hz_A͊eW`^6Y XpeEй62*8Ha#7-;;7/ua=2gGVSE/AZ)4 SOXˬǛl|R)Jy 5}ТBFQ(wiZg2X(HCS#=I! ` Fύah/F1mvCϲ RB+_  IDaA\:jB0 ښ4-/Uy.I$(2H a)!1AQaq 0P? zS@-8:O2BYy1a (~|+-櫍|^H;zEAs Tf;屓y#R#F6G"iJK9Ԃ^wp[٪)iw?K2epMT9k$q1XAq%@&r\Z&1"U ^ѡ'@ݦ=ˑ(QZB!V;j#bu_(N-LSjU F"XV2@L0K7BWVA)"w#a @UjBqL`-诠d;< t;&Up .JOQ#4v@$'r].b.]E+Įufu?f5_B$z%|50>/% LAO(!1AaQq 0P?Dقz|Lj>.>!JFF0|Wwigh!y6 Rl6WRh!+G GV0LTlSQ^7,g@Gb%:nbˠPDinu n5{i)s3)b¤B\c#Ҍ4 -,..sh(ֵ*dC1i9fx5vA yԽ1"`kfWڦ@4-#C"d)9"jY:rAJbZГ,9FPZ%Įlv,Qt-2B#8ր)xfp${Ȟ:(ڐB.-D&&X2<](9T@C8 nlw(@t6nMCa͒s[ %f*4cŸlO&!1AQa @q0P`?~|8ŗ@H&7jڅZ缔>HEkpqu90椦Qq&G`hKR^y6gW*jbhF8Nh@bTw`-ڔs5 7aPk ADNOP91vGTBTUj8\ -b@Rp t>'(g/@g[h~YF3\4f$0䎼0 XL;Q$hG|F q :Sx$o81 R:4I (B Zz-gLp Z V=(Dq*Zu\F$BmPL b# i۵UNL@!'h>:D1MQڪg~N;MiLDѤnh}ᙥzA "@ GVaȷ4x}ol`ҩ)rN.jqb"&k`* EX.7@}WC'wnj0IqoPțG"(,[JSx XD*Bm(U*ze:Iַ paP!PA*!YM6B;"xqJ1u""Hj*; \2INT**.;N (T=/՞^7cuf-NF Ma͵X3XSᏌ|v N5niF(E"Ea#Ch AcDdIoUbLd4`0ClSm y"(daDrIB7axYdQC(Q ρb( vt浹p`Ts`9L]1@ѭV :y "N8pLH1<#A{gbxeƵUnU%t)4n%^LNK|(YBnm2.~ `PR`=y]DXQ)lk_Å"[X(B:.Kuck/{ `Tb- wR@d!D#­}`kDmayavi-4.5.0/docs/source/mayavi/clamping_on.jpg0000644000076500000240000001135112747716313022134 0ustar prabhustaff00000000000000JFIFC     C  xd"   >ZyQ崣V2Tԋ<]Lp]:O$['=,iG-𡕥\;+IkodGj)C}jzd7Ly'6 KPEfzW.9ޢt*ݲxF5k[.~_?%>[6 Ua.r^-p79O!dW8+5)+s#!i ̂F oڱJV * 0@Pp!1Y7`QbC[NڔiFt\~;`sFB}쑊;.))I-oIg}Z=eo1qr軏6Ֆ/;Q]6ET,v'?5$P`_Q!f d1q):]y{Rüv !Raa4t wy\Ki+EW_wٺ'qkG#6WJ+ð'_  tڒF&rWc[qdʋ -'q/`>$6G!ly%Q CDSܡMG`uiraC w֭7 zcl04/ݭZb J(`277 !1AQaq 2P"$0@r?KLi'8kt"ӭC*j3].qzzZM4~X1 ifW~S.`OUnīihZe. NêT_(eX4cR/J?)p]d+y#REkl=IMr|nk{NFm2)hYs(m8[e#,kSLOl&Y#gEOy4r.-O VmS3Jij(b$%]5t6'de*,fQ'}.Jgl!?zu1!1AQq P"02@aB?_SY̬$DbRU_sQxyn*a(N@ }.lsBen;Am-AY1srl?y58w qx6qæ_A-,=LfI$MtC7(BAkGVF<~-R{9L&ldOAJP!0 J0M rK|:{CΩK,7#>>@  !1Qa "2Aq#Br03@CPRbpS?,U? @䤂݇uўK:T}났Ce8w?Aʇrnx-e4\:"kٹPS,9Tpn?%q;&}uѱدk-׼/ Ө/hUX%n^3iOa3K+_q*mƛϓ!DT$4UN: O4oOIHxi梣f"+tz JYPGŸYeKe(@iJzcz8ڽ(vT%H)"4_ L2p.J:Vs6 :dRx2bCJmϴ(E5*-/gFE_ΰy0}UtNAOSi] vH :=ոtGoulc Qj_6DlRO kV:KVp y-4RT2"'@>"gvT j)Ր^@x٨M]Y4͝heC;Ԛ))#LJGη%|֓ڣgxIl64Cipmrp<(i鸺 PP:VxA5-cF3$^Y10@m4 ?[B8x'OX rb }ZrMOV %֩E{în L-Sx̽6 K#lHm4_(!1AaQq 0P@p?!%xEY7R [8hO-bP0Ё0jWC_Z,._DpJ e@Y?%OguL'ϱQ@bUˆ9\u&;FZ(IQ]ZIt{zMfҵV՛zr59A$p%/6:$+Eԝ<Y)yt-#5Yb/j6B=1zV sĕ--%j VMB?t%CE*቞ԶB]B />*jg%5- V[|ja%]ry}S0[B"8/Jb ES/"- \Ay-=-8G G!`& 9cNGj"IİĤ&y>},+gNLr(A0MOE@P:Q3s7׬)W8;VZ(*z`, M N>"('tly1!&OJ6ϹY.cm+ r@$P:@ U()(!1AQaq P0@?.BP(7`m)B_Wnk;΅ѷBRq;WugJtYfKRtCz(  KSڭmEs(B g;][$El6FmYCb'2!2 A* fi>o3dmVR4d7tc}wV `;_kW#Ȗa,Kvᄋ"5y(LUĬi8 &!1AQqa P0@?e6fx _Ie'CLWb)|v2 ZA`(I#+KJI 0ll8w  vU:;7Kω}bPGJH [w,oU :ʄ|LBRŖnaEi nj;⇨X iJfڵQuBlg"Ub uv!#ez%!1A QaPq0@p?,\Jˀڴz5vI փ`W\arR>p㐇- J0)6`E? U]y?=6WL{p~ ; mB];F`YX;4 * 0y`HUb0X!v"i>Ra 8#E9hIZi~.@xcP U ~FA@ (*1V8^Uhqy3Q85|[TTJC隖 O@@Q * 6pp@ wJ1CNTگWmayavi-4.5.0/docs/source/mayavi/conf.py0000644000076500000240000001232012747716313020440 0ustar prabhustaff00000000000000# -*- coding: utf-8 -*- # # Mayavi documentation build configuration file, created by # sphinx-quickstart on Sat Apr 12 23:25:24 2008. # # This file is execfile()d with the current directory set to its containing dir. # # The contents of this file are pickled, so don't put values in the namespace # that aren't pickleable (module imports are okay, they're removed automatically). # # All configuration values have a default value; values that are commented out # serve to show the default value. # Adding the current directory to the path, so that sphinx finds the # extensions. import sys, os sys.path.append(os.path.abspath('sphinxext')) # General configuration # --------------------- # Add any Sphinx extension module names here, as strings. They can be extensions # coming with Sphinx (named 'sphinx.ext.*') or your custom ones. extensions = ['sphinx.ext.autodoc', 'sphinxext.traitsdoc'] ## An autodocumentation processor, to insert title of functions before ## the auto-documented functions: #def add_title(app, what, name, obj, options, signature, return_annotation): # """ Add a section title with the name of the function before the # docstring. # """ # if what is not 'function': # return # short_name = name.split('.')[-1] # extra_lines = """ # #%s #........................................... # # """ % short_name # return extra_lines + signature, return_annotation # # #def setup(app): # """ Register our docstring processor. # """ # app.connect('autodoc-process-signature', add_title) # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] # The suffix of source filenames. source_suffix = '.rst' # The master toctree document. master_doc = 'index' # General substitutions. project = 'mayavi' copyright = u'2008-2016, Enthought Inc.' # The default replacements for |version| and |release|, also used in various # other places throughout the built documents. d = {} fname = os.path.join('..', '..', '..', 'mayavi', '__init__.py') exec(compile(open(fname).read(), fname, 'exec'), d) version = release = d['__version__'] # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: #today = '' # Else, today_fmt is used as the format for a strftime call. today_fmt = '%B %d, %Y' # List of documents that shouldn't be included in the build. #unused_docs = [] # If true, '()' will be appended to :func: etc. cross-reference text. #add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). #add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. #show_authors = False # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' # Options for HTML output # ----------------------- # The style sheet to use for HTML and HTML Help pages. A file of that name # must exist either in Sphinx' static/ path, or in one of the custom paths # given in html_static_path. html_theme = 'classic' # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ['_static'] # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. html_last_updated_fmt = '%b %d, %Y' # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. #html_use_smartypants = True # Content template for the index page. #html_index = '' # Custom sidebar templates, maps document names to template names. #html_sidebars = {} # Additional templates that should be rendered to pages, maps page names to # template names. #html_additional_pages = {} # If false, no module index is generated. html_use_modindex = False # If true, the reST sources are included in the HTML build as _sources/. #html_copy_source = True # Output file base name for HTML help builder. htmlhelp_basename = 'Mayavidoc' # A logo displayed in the html sidebar. html_logo = 'mayavi-logo.png' # Options for LaTeX output # ------------------------ # The paper size ('letter' or 'a4'). #latex_paper_size = 'letter' # The font size ('10pt', '11pt' or '12pt'). #latex_font_size = '10pt' # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, author, document class [howto/manual]). latex_documents = [('index', 'mayavi_user_guide.tex', 'Mayavi User Guide', 'Prabhu Ramachandran, Gael Varoquaux', 'manual')] # Additional stuff for the LaTeX preamble. latex_preamble = """ \definecolor{VerbatimColor}{rgb}{0.95,1,0.833} \definecolor{VerbatimBorderColor}{rgb}{0.6,0.6,0.6} """ # A logo displayed on the cover page. latex_logo = 'm2_about.jpg' # Documents to append as an appendix to all manuals. #latex_appendices = [] # If false, no module index is generated. #latex_use_modindex = True ################################################################################ # A hack: import shutil shutil.copyfile('../../CHANGES.txt', './auto/changes.rst') mayavi-4.5.0/docs/source/mayavi/data.rst0000644000076500000240000005572712747716313020626 0ustar prabhustaff00000000000000.. _data-structures-used-by-mayavi: Data representation in Mayavi ============================== Describing data in three dimensions in the general case is a complex problem. Mayavi helps you focus on your visualization work and not worry too much about the underlying data structures, for instance using mlab (see :ref:`simple-scripting-with-mlab`). We suggest you create sources for Mayavi using `mlab` or Mayavi sources when possible. However, it helps to understand the VTK data structures that Mayavi uses if you want to create data with a specific structure for a more efficient visualization, or if you want to extract the data from the Mayavi pipeline. .. contents:: Outline :depth: 1 :local: ____ .. topic:: Mayavi data sources and VTK datasets * When you load a file, or you expose data in Mayavi using one of the `mlab.pipeline` source functions (see :ref:`mlab_data_source`), you create an object in the Mayavi pipeline that is attached to a scene. This object is a Mayavi source, and serves to describe the data and its properties to the Mayavi pipeline. * The internal structures use to represent to data in 3D all across Mayavi are VTK datasets, as described below. One should not confuse VTK (or TVTK) `datasets` and Mayavi `data sources`. There is a finite and small number of datasets. However, many pipeline objects could be constructed to fit in the pipeline below a scene and providing datasets to the pipeline. Introduction to TVTK datasets ----------------------------- Mayavi uses the VTK library for all its visualization needs, via TVTK (Traited VTK). The data is exposed internally, by the sources, or at the output of the filters, as VTK datasets, described below. Understanding these structures is useful not only to manipulate them, but also to understand what happens when using filters to transform the data in the pipeline. A dataset is defined by many different characteristics: .. image:: images/dataset_diagram.jpg :Connectivity: Connectivity is not only necessary to draw lines between the different points, it is also needed to define a volume. **Implicit connectivity**: connectivity or positioning is implicit. In this case the data is considered as arranged on a lattice-like structure, with equal number of layers in each direction, x increasing first along the array, then y and finally z. :Data: Dataset are made of points positioned in 3D, with the corresponding data. Each dataset can carry several data components. **Scalar or Vectors data**: The data can be scalar, in which case VTK can perform operations such as taking the gradient and display the data with a colormap, or vector, in which case VTK can perform an integration to display streamlines, display the vectors, or extract the norm of the vectors, to create a scalar dataset. **Cell data and point data**: Each VTK dataset is defined by vertices and cells, explicitly or implicitly. The data, scalar or vector, can be positioned either on the vertices, in which case it is called point data, or associated with a cell, in which case it is called cell data. Point data is stored in the `.point_data` attribute of the dataset, and the cell data is stored in the `.cell_data` attribute. In addition the data arrays have an associated name, which is used in Mayavi to specify on which data component module or filter apply (eg: using the`SetActiveAttribute` filter). .. note:: **VTK array ordering** All VTK arrays, whether it be for data or position, are exposed as (n, 3) numpy arrays for 3D components, and flat (n, ) array for 1D components. The index vary in the opposite order as numpy: z first, y and then x. Thus to go from a 3D numpy array to the corresponding flatten VTK array, the operation is:: vtk_array = numpy_array.T.ravel() An complete list of the VTK datasets used by Mayavi is given `below `_, after a tour of the Mayavi pipeline. The flow of data ------------------ As described :ref:`earlier `, Mayavi builds visualization by assembling pipelines, where the data is loaded in Mayavi by a `data source`, and it can be transformed by `filters` and visualized by `modules`. To retrieve the data displayed by Mayavi, to modify it via Python code, or to benefit from the data processing steps performed by the Mayavi filters, it can be useful to "open up" the Mayavi pipeline and understand how the data flows in it. Inside the Mayavi pipeline, the 3D data flowing between sources filters and modules is stored in VTK datasets. Each source or filter has an `outputs` attribute, which is a list of VTK `datasets` describing the data output by the object. For example: :: >>> import numpy as np >>> from mayavi import mlab >>> data = np.random.random((10, 10, 10)) >>> iso = mlab.contour3d(data) The parent of `iso` is its 'Colors and legend' node, the parent of which is the source feeding into `iso`:: >>> iso.parent.parent.outputs [] Thus we can see that the Mayavi source created by `mlab.surf` exposes an ImageData_ VTK dataset. .. currentmodule:: mayavi.tools .. note:: To retrieve the VTK datasets feeding in an arbitrary object, the mlab function :func:`pipeline.get_vtk_src` may be useful. In the above example:: >>> mlab.pipeline.get_vtk_src(iso) [] .. _retrieving_data: Retrieving the data from Mayavi pipelines ------------------------------------------ Probing data at given positions ................................ .. currentmodule:: mayavi.tools If you simply want to retrieve the data values described by a Mayavi object a given position in space, you can use the :func:`pipeline.probe_data` function (**warning** the `probe_data` function is new in Mayavi 3.4.0) For example, if you have a set of irregularly spaced data points with no connectivity information:: >>> x, y, z = np.random.random((3, 100)) >>> data = x**2 + y**2 + z**2 You can expose them as a Mayavi source of unconnected points:: >>> src = mlab.pipeline.scalar_scatter(x, y, z, data) and visualize these points for debugging:: >>> pts = mlab.pipeline.glyph(src, scale_mode='none', ... scale_factor=.1) The resulting data is not defined in the volume, but only at the given position: as there is no connectivity information, Mayavi cannot interpolate between the points:: >>> mlab.pipeline.probe_data(pts, .5, .5, .5) array([ 0. ]) To define volumetric data, you can use a ``delaunay3d`` filter:: >>> field = mlab.pipeline.delaunay3d(src) Now you can probe the value of the volumetric data anywhere. It will be non zero in the convex hull of the points:: >>> # Probe in the center of the cloud of points >>> mlab.pipeline.probe_data(field, .5, .5, .5) array([ 0.78386768]) >>> # Probe on the initial points >>> data_probed = mlab.pipeline.probe_data(field, x, y, z) >>> np.allclose(data, data_probed) True >>> # Probe outside the cloud >>> mlab.pipeline.probe_data(field, -.5, -.5, -.5) array([ 0.]) Inspecting the internals of the data structures ................................................ You may be interested in the data carried by the TVTK datasets themselves, rather than the values they represent, for instance to replicate them. For this, you can retrieve the TVTK datasets, and inspect them. Extracting data points and values ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The positions of all the points of a TVTK dataset can be accessed via its `points` attribute. Retrieving the dataset from the `field` object of the previous example, we can view the data points:: >>> dataset = field.outputs[0] >>> dataset.points [(0.72227946564137335, 0.23729151639368518, 0.24443798107195291), ..., (0.13398528550831601, 0.80368395047618579, 0.31098842991116804)], length = 100 This is a TVTK array. For us, it is more useful to convert it to a numpy array:: >>> points = dataset.points.to_array() >>> points.shape (100, 3) To retrieve the original `x`, `y`, `z` positions of the data points specified, we can transpose the array:: >>> x, y, z = points.T The corresponding data values can be found in the `point_data.scalars` attribute of the dataset, as the data is located on the points, and not in the cells, and it is scalar data:: >>> dataset.point_data.scalars.to_array().shape >>> (100,) Extracting lines ~~~~~~~~~~~~~~~~~ If we want to extract the edges of the Delaunay tessellation, we can apply the ExtractEdges filter to the `field` from the previous example and inspect its output:: >>> edges = mlab.pipeline.extract_edges(field) >>> edges.outputs [] We can see that the output is a PolyData_ dataset. Looking at how these are build (see PolyData_), we see that the connectivity information is help in the `lines` attribute (that we convert to a numpy array using its `.to_array()` method):: >>> pd = edges.outputs[0] >>> pd.lines.to_array() array([ 2, 0, 1, ..., 2, 97, 18]) The way this array is build is a sequence of a length descriptor, followed by the indices of the data points connected together in the points array retrieved earlier. Here we have only sets of pairs of points connected together: the array is an alternation of `2` followed by a pair of indices. A full example illustrating how to use the VTK Delaunay filter to extract a graph is given in :ref:`example_delaunay_graph`. Headless use of Mayavi for the algorithms, without visualization .................................................................. As you can see from the above example, it can be interesting to use Mayavi just for the numerical algorithm operating on 3D data, as the Delaunay tessellation and interpolation demoed. To run such examples headless, simply create the source with the keyword argument `figure=False`. As a result the sources will not be attached to any engine, but you will still be able to use filters, and to probe the data:: >>> src = mlab.pipeline.scalar_scatter(x, y, z, data, figure=False) .. _dissection_vtk_datasets: Dissection of the different TVTK datasets ------------------------------------------ The 5 TVTK structures used are the following (ordered by the cost of visualizing them).: ===================== ============= =========================== ============================================================ VTK name Connectivity Suitable for Required information ===================== ============= =========================== ============================================================ ImageData_ Implicit Volumes and surfaces 3D data array and spacing along each axis RectilinearGrid_ Implicit Volumes and surfaces 3D data array and 1D array of spacing for each axis StructuredGrid_ Implicit Volumes and surfaces 3D data array and 3D position arrays for each axis PolyData_ Explicit Points, lines and surfaces x, y, z, positions of vertices and arrays of surface Cells UnstructuredGrid_ Explicit Volumes and surfaces x, y, z positions of vertices and arrays of volume Cells ===================== ============= =========================== ============================================================ .. _image_data: ImageData .......... This dataset is made of data points positioned on an orthogonal grid, with constant spacing along each axis. The position of the data points are inferred from their position on the data array (implicit positioning), an origin and a spacing between 2 slices along each axis. In 2D, this can be understood as a raster image. This is the data structure created by the `ArraySource` mayavi source, from a 3D numpy array, as well as the `mlab.pipeline.scalar_field` and `mlab.pipeline.vector_field` factory functions, if the `x`, `y` and `z` arrays are not explicitely specified. .. image:: image_data.jpg Creating a `tvtk.ImageData` object from numpy arrays:: from tvtk.api import tvtk from numpy import random data = random.random((3, 3, 3)) i = tvtk.ImageData(spacing=(1, 1, 1), origin=(0, 0, 0)) i.point_data.scalars = data.ravel() i.point_data.scalars.name = 'scalars' i.dimensions = data.shape .. _rectilinear_grid: RectilinearGrid RectilinearGrid ................ This dataset is made of data points positioned on an orthogonal grid, with arbitrary spacing along the various axis. The position of the data points are inferred from their position on the data array, an origin and the list of spacings of each axis. .. image:: rectilinear_grid.jpg Creating a `tvtk.RectilinearGrid` object from numpy arrays:: from tvtk.api import tvtk from numpy import random, array data = random.random((3, 3, 3)) r = tvtk.RectilinearGrid() r.point_data.scalars = data.ravel() r.point_data.scalars.name = 'scalars' r.dimensions = data.shape r.x_coordinates = array((0, 0.7, 1.4)) r.y_coordinates = array((0, 1, 3)) r.z_coordinates = array((0, .5, 2)) .. _structured_grid: StructuredGrid StructuredGrid ............... This dataset is made of data points positioned on arbitrary grid: each point is connected to its nearest neighbors on the data array. The position of the data points are fully described by 1 coordinate arrays, specifying x, y and z for each point. This is the dataset created by the `mlab.pipeline.scalar_field` and `mlab.pipeline.vector_field` factory functions, if the `x`, `y` and `z` arrays are explicitely specified. .. image:: structured_grid.jpg Creating a `tvtk.StructuredGrid` object from numpy arrays:: from numpy import pi, cos, sin, empty, linspace, random from tvtk.api import tvtk def generate_annulus(r, theta, z): """ Generate points for structured grid for a cylindrical annular volume. This method is useful for generating a unstructured cylindrical mesh for VTK. """ # Find the x values and y values for each plane. x_plane = (cos(theta)*r[:,None]).ravel() y_plane = (sin(theta)*r[:,None]).ravel() # Allocate an array for all the points. We'll have len(x_plane) # points on each plane, and we have a plane for each z value, so # we need len(x_plane)*len(z) points. points = empty([len(x_plane)*len(z),3]) # Loop through the points for each plane and fill them with the # correct x,y,z values. start = 0 for z_plane in z: end = start+len(x_plane) # slice out a plane of the output points and fill it # with the x,y, and z values for this plane. The x,y # values are the same for every plane. The z value # is set to the current z plane_points = points[start:end] plane_points[:,0] = x_plane plane_points[:,1] = y_plane plane_points[:,2] = z_plane start = end return points dims = (3, 4, 3) r = linspace(5, 15, dims[0]) theta = linspace(0, 0.5*pi, dims[1]) z = linspace(0, 10, dims[2]) pts = generate_annulus(r, theta, z) sgrid = tvtk.StructuredGrid(dimensions=(dims[1], dims[0], dims[2])) sgrid.points = pts s = random.random((dims[0]*dims[1]*dims[2])) sgrid.point_data.scalars = ravel(s.copy()) sgrid.point_data.scalars.name = 'scalars' .. _poly_data: PolyData ......... This dataset is made of arbitrarily positioned data points that can be connected to form lines, or grouped in polygons to from surfaces (the polygons are broken up in triangles). Unlike the other datasets, this one cannot be used to describe volumetric data. The is the dataset created by the `mlab.pipeline.scalar_scatter` and `mlab.pipeline.vector_scatter` functions. .. image:: poly_data.jpg Creating a `tvtk.PolyData` object from numpy arrays:: from numpy import array, random from tvtk.api import tvtk # The numpy array data. points = array([[0,-0.5,0], [1.5,0,0], [0,1,0], [0,0,0.5], [-1,-1.5,0.1], [0,-1, 0.5], [-1, -0.5, 0], [1,0.8,0]], 'f') triangles = array([[0,1,3], [1,2,3], [1,0,5], [2,3,4], [3,0,4], [0,5,4], [2, 4, 6], [2, 1, 7]]) scalars = random.random(points.shape) # The TVTK dataset. mesh = tvtk.PolyData(points=points, polys=triangles) mesh.point_data.scalars = scalars mesh.point_data.scalars.name = 'scalars' .. _unstructured_grid: UnstructuredGrid UnstructuredGrid .................. This dataset is the most general dataset of all. It is made of data points positioned arbitrarily. The connectivity between data points can be arbitrary (any number of neighbors). It is described by specifying connectivity, defining volumetric cells made of adjacent data points. .. image:: unstructured_grid.jpg Creating a `tvtk.UnstructuredGrid` object from numpy arrays:: from numpy import array, random from tvtk.api import tvtk points = array([[0,1.2,0.6], [1,0,0], [0,1,0], [1,1,1], # tetra [1,0,-0.5], [2,0,0], [2,1.5,0], [0,1,0], [1,0,0], [1.5,-0.2,1], [1.6,1,1.5], [1,1,1], # Hex ], 'f') # The cells cells = array([4, 0, 1, 2, 3, # tetra 8, 4, 5, 6, 7, 8, 9, 10, 11 # hex ]) # The offsets for the cells, i.e. the indices where the cells # start. offset = array([0, 5]) tetra_type = tvtk.Tetra().cell_type # VTK_TETRA == 10 hex_type = tvtk.Hexahedron().cell_type # VTK_HEXAHEDRON == 12 cell_types = array([tetra_type, hex_type]) # Create the array of cells unambiguously. cell_array = tvtk.CellArray() cell_array.set_cells(2, cells) # Now create the UG. ug = tvtk.UnstructuredGrid(points=points) # Now just set the cell types and reuse the ug locations and cells. ug.set_cells(cell_types, offset, cell_array) scalars = random.random(points.shape[0]) ug.point_data.scalars = scalars ug.point_data.scalars.name = 'scalars' .. topic:: Modifying the data If you want to modify the data of any of these low-level data structures, you need to reasign data to the corresponding arrays, but also reasign them a name. Once this is done, you should call the 'modified()' method of the object, to tell the pipeline that the data has been modified:: ug.point_data.scalars = new_scalars ug.point_data.scalars.name = 'scalars' ug.modified() External references ...................... This section of the user guide will be improved later. For now, the following two presentations best describe how one can create data objects or data files for Mayavi and TVTK. * Presentation on TVTK and Mayavi2 for course at IIT Bombay https://github.com/enthought/mayavi/raw/master/docs/pdf/tvtk_mayavi2.pdf This presentation provides information on graphics in general, 3D data representation, creating VTK data files, creating datasets from numpy in Python, and also about mayavi. * Presentation on making TVTK datasets using numpy arrays made for SciPy07. Prabhu Ramachandran. "TVTK and MayaVi2", SciPy'07: Python for Scientific Computing, CalTech, Pasadena, CA, 16--17 August, 2007. This presentation focuses on creating TVTK datasets using numpy arrays. Datasets creation examples ........................... There are several examples in the mayavi sources that highlight the creation of the most important datasets from numpy arrays. Specifically they are: * :ref:`example_datasets`: Generate a simple example for each type of VTK dataset. * :ref:`example_polydata`: Demonstrates how to create Polydata datasets from numpy arrays and visualize them in mayavi. * :ref:`example_structured_points2d`: Demonstrates how to create a 2D structured points (an ImageData) dataset from numpy arrays and visualize them in mayavi. This is basically a square of equispaced points. * :ref:`example_structured_points3d`: Demonstrates how to create a 3D structured points (an ImageData) dataset from numpy arrays and visualize them in Mayavi. This is a cube of points that are regularly spaced. * :ref:`example_structured_grid`: Demonstrates the creation and visualization of a 3D structured grid. * :ref:`example_unstructured_grid`: Demonstrates the creation and visualization of an unstructured grid. These scripts may be run like so:: $ mayavi2 -x structured_grid.py or better yet, all in one go like so:: $ mayavi2 -x polydata.py -x structured_points2d.py \ > -x structured_points3d.py -x structured_grid.py -x unstructured_grid.py .. Creating datasets from numpy arrays ----------------------------------- Add content here from the presentations. .. VTK Data files -------------- Add content here from the presentations. Inserting TVTK datasets in the Mayavi pipeline ----------------------------------------------- TVTK datasets can be created using directly TVTK, as illustrated in the examples above. A VTK data source can be inserted in the Mayavi pipeline using the VTKDataSource. For instance we can create an `ImageData` dataset:: from tvtk.api import tvtk import numpy as np a = np.random.random((10, 10, 10)) i = tvtk.ImageData(spacing=(1, 1, 1), origin=(0, 0, 0)) i.point_data.scalars = a.ravel() i.point_data.scalars.name = 'scalars' i.dimensions = a.shape * If you are scripting using :ref:`mlab `, the simplest way to visualize your data is to use the :ref:`mlab.pipeline ` to apply filters and modules to your data. Indeed these functions creating filters and modules accept VTK datasets and automatically insert them on the pipeline. A surface module could have been used to visualize the `ImageData` dataset created above as such:: from enthgouth.mayavi import mlab mlab.pipeline.surface(i) * In addition, inserting this dataset on the Mayavi pipeline with direct control on the `Engine` is done as suchwith `VTKDataSource`:: from mayavi.sources.api import VTKDataSource src = VTKDataSource(data=i) from mayavi.api import Engine e = Engine() e.start() s = e.new_scene() e.add_source(src) Of course, unless you want specific control on the attributes of the VTK dataset, or you are using Mayavi in the context of existing code manipulating TVTK objects, creating an `ImageData` TVTK object is not advised. The `ArraySource` object of Mayavi will actually create an `ImageData`, but make sure you don't get the shape wrong, which can lead to a segmentation fault. An even easier way to create a data source for an `ImageData` is to use the `mlab.pipeline.scalar_field` function, as explained in the :ref:`section on creating data sources with mlab `. .. Local Variables: mode: rst indent-tabs-mode: nil sentence-end-double-space: t fill-column: 70 End: mayavi-4.5.0/docs/source/mayavi/example_exploring_a_vector_field.rst0000644000076500000240000000630612747716313026451 0ustar prabhustaff00000000000000 Exploring a vector field ------------------------- In this example, we create a vector field from the gradient of a scalar field and explore it interactively. This example shows you how to do some operations similar to the previous example, but interactively, using the filters and modules. This approach requires a better knowledge of Mayavi and the VTK filters than the previous example, in which `numpy` is used for most of the operations. The big gain is that the resulting visualization can be explored interactively. First, let us create the same scalar field as the previous example:. We open Mayavi and enter the following code in the Python shell:: from mayavi import mlab import numpy as np def V(x, y, z): """ A 3D sinusoidal lattice with a parabolic confinement. """ return np.cos(10*x) + np.cos(10*y) + np.cos(10*z) + 2*(x**2 + y**2 + z**2) X, Y, Z = np.mgrid[-2:2:100j, -2:2:100j, -2:2:100j] mlab.contour3d(X, Y, Z, V) As in the previous example, we can change the color map and the values chosen in the isosurfaces. We want to take the gradient of the scalar field, to create a vector field. To do this we are going to use the `CellDerivatives` filter, that takes derivatives of the data located in the cells (that is, between the points, see :ref:`data-structures-used-by-mayavi`). For this, we first need to interpolate the data from the points where it is located to the cells, using a `PointToCellData` filter. We can then apply our `CellDerivatives` filter, and then a `CellToPointData` filter to get point data back. To visualize the vector field, we can use a `VectorCutPlane` module. The resulting vectors are too large, and we can go to the `Glyph` tab, (and the `Glyph` tab in this tab), to reduce the scale factor to 0.2. The vector field is still too dense, therefore we go to the `Masking` tab to enable masking, mask with an `on ratio` of 6 (one arrow out of 6 is masked) and turn off the random mode. .. image:: example_vector_cut_plane.jpg :scale: 50 To have nice colors, we also changed the color map of the vector field by going to the `Colors and legend` node just above the `VectorCutPlane`, and choosing a look up table **in the VectorLUT** tab, as there can be different color maps for vector data and scalar data. Unlike the previous example, we can play with all the parameters in the dialog box, like masking, or select `color_by_scalar` in the `Glyph` tab, to display the value of the potential. We can also move the cut plane used to display the vectors by dragging it. Now that we have a 3D vector field, we can also use Mayavi to integrate the trajectory of a particle in it. For this we can use the streamline module. It displays trajectories starting from the vertices of a seed surface. We choose (in the `Seed` tab) a `Point Widget` as a seed. We can then move the seed point by dragging it along in the 3D scene. This allows us to explore the trajectories in the potential created by the initial scalar field. In our case, all the trajectories end up in a local potential minimum, and moving the seed point along lets us see in which minimum each point will fall into, in other world the basin of attraction of each local minimum. .. image:: example_streamline.jpg mayavi-4.5.0/docs/source/mayavi/example_fire.rst0000644000076500000240000001362312747716313022342 0ustar prabhustaff00000000000000 Visualizing rich datasets: the ``fire_ug.vtu`` example ------------------------------------------------------- Like ``heart.vtk``, the ``fire_ug.vtu`` example dataset is available in the ``examples/data`` directory. This dataset is an unstructured grid stored in a VTK XML file. It represents a room with a fire in one corner. A simulation of the fluid flow generated by this fire was performed and the resulting data at a particular instant of time is stored in the file. The dataset was provided by Dr. Philip Rubini, who at the time was at Cranfield University. A VRML file (``room_vis.wrl``) is also provided to show the context of the room in which the fire is taking place. 1. With mayavi2 started, select `File->Load data->Open file` to load the data. Again, you will see a node on the tree view on the left but nothing on the TVTK scene. This dataset contains different scalars and vectors in the same data file. If you select the `VTK XML file ...` node on the left the reader may be configured in the object editor pane of the UI. On this, you will see a drop list of all the scalars, vectors etc. in this data file. Select any that you wish to view. 2. Create an outline of the data as described earlier using an `Outline` module. View an iso-surface of the data by creating an `IsoSurface` module. Also experiment with the `ScalarCutPlane` module. 3. Show the scalar bar that represents the color mapping (via a Look up table that maps scalar values to colors) by clicking on the `Colors and legends` node and enabling the `Show scalar bar`. Experiment with the different color maps provided by default. 4. Now click on the `VTK XML file ...` and select different scalar values to see how the data has changed. Your legend should automatically update when the scalar value is changed. 5. This data also features vectors. The scalar data has `u`, `v` and `w` but not the magnitude of the velocity. Let's say we'd like to be able to view iso-contours of the magnitude of the velocity. To do this let's use the `ExtractVectorNorm` filter. This is created by choosing the `Visualize->Filters->Extract Vector Norm` menu. 6. If you now create a `ScalarCutPlane`, you will see a new `Colors and legends` node under the `ExtractVectorNorm` node. This scalar cut plane is displaying colors for the velocity magnitude that the filter has created. You can drag the iso-surface module from the other `Colors and legends` node and drop it on this `Colors and legends` node so that the IsoSurface generated is for the velocity magnitude and not for the scalars chosen in the data. Note that the view on the left represents a pipeline of the flow of the data from `source -> filter -> modules`. Essentially the data flows from the parent node down to the children nodes below it. Now if you want to visualize something on a different "branch" of the pipeline, let's say you want to view iso-surfaces of the temperature data you must first click on the modules or the source object (the `VTK XML File ...` node) itself and then select the menu item. When you select an item on the tree, it makes that item the *current object* and menu selections made after that will in general create new modules/filters below the current object. 7. You can filter "filtered data". So select the `ExtractVectorNorm` node to make it the active object. Now create a Threshold filter by selecting `Visualize->Filters->Threshold`. Now set the upper and lower thresholds on the object editor for the Threshold to something like 0.5 and 3.0. If you create a `VectorCutPlane` module at this point and move the cut plane you should see arrows but only arrows that are between the threshold values you have selected. Thus, you can create pretty complicated visualization pipelines using this approach. 8. There are several vector modules. `VectorCutPlane`, `Vectors`, `WarpVectorCutPlane` and `Streamlines`. If you view streamlines then mayavi will generate streamlines of vector data in your dataset. To view streamlines of the original dataset you can click on the original `Outline` module (or the source) and then choose the `Streamline` menu item. The streamline lets you move different type of seeds on screen using 3D widgets. Seed points originating from these positions are used to trace out the streamlines. Sphere, line and plane sources may be used here to initialize the streamline seeds. 9. You can view the room in which the fire is taking place by opening the VRML file by the `File->Open->VRML2 file` menu item and selecting the ``room_vis.wrl`` file included with the data. 10. Once you setup a complex visualization pipeline and want to save it for later experimentation you may save the entire visualization via the `File->Save Visualization` menu. A saved file can be loaded later using the `File->Load Visualization` menu item. This option is not 100% robust and is still experimental. Future versions will improve this feature. However, it does work and can be used for the time being. Once again, the visualization in this case was created by using the user interface. It is possible to script this entirely using Python scripts. A simple script demonstrating several of the above modules is available in ``examples/streamline.py``. This file may be studied. It can be run either likes so:: $ cd examples $ python streamline.py or so:: $ mayavi2 -x streamline.py As can be seen from the example, it is quite easy to script mayavi to visualize data. An image of a resulting visualization generated from this script is shown below. .. image:: images/streamline.jpg :alt: Sample visualization of the ``fire_ug.vtu`` dataset. mayavi-4.5.0/docs/source/mayavi/example_gradient.jpg0000644000076500000240000045156712747716313023177 0ustar prabhustaff00000000000000JFIFC     C  : "  :aJ^5B/5_Whfƀ.>adA';?p|GA|-G?HG? @3""1>azާ6}B_`_`l|b u߱ltU}@Kj]s It`/m!ɝjV6ֶNJ|6^k|*+3gplNm]+3&?K9ӨOmYxիlrS ȞSѴZ@PxWsdgT~h_a262}7q@Juz0/YiK  z/vz^em :TGTzri쪗սլ MǨުx't6KwV [i)F+[~wm ƫ>@.&llŞ-t #E[VtSy/M}RϴeSCJ 7խ{HEA;_l- -Bٗz_SdsC{ MYݏ-{;mi*KT)=wH37z\C{Sxv{X.T뚛v Z$uϊU*I`Ż\  z/tiz^4`_`_ d=ulIQ>b5 K9.4MͥmSmˍ!5fQGL,nt_sLp^sb.>WB(\7⍜< k~o1Y`ksu_rfRsz\avX[6c xkgҕ 4aI|6%6 i]t矸U^\`_ Jwz^4`_`_F'F3]h #{jS6t~ IYuڰ\N@h_*s+|m-׾4X +(pqچ-dm*35?VJ/̳TO~*fzF$Ci:Зu fG?-iZdKJFvtMտޟx[˴jKLtVY;1w,0/lTJt hgsL 5!U.񅢺$;Y09◭F2/_o9EeKY͙uݡ;9Ys'Z<2<մd0VkQkxϔܯF1а[h97 fiEh'=-Hvod=j+GdOl3퍵ouZEnߝyTtQNK|j> 0/_-4/M0//gZ*:69m 0// bޗy%K\QS[Vrӥk8(DbZ3M1u6VU<*Uw>5kT~qBqi{{u60]jm*-kiz[\с}|[jys17.\ [eQ3h^ʪfk|{?ϷKα|S窵lrzhVx>-^cZyؕNΩnFٺ[M=jw:3=_)ٝx;(nΎse?/0BFgZ>[&NY_ʕf Ȥiervߗ&|@JDbgSo)z[p\с}|bwYSk 2\9邾%aML|z_Jn; bi9)FǙT5^M.Rd>n9$XUurqirnٿ^NPܝh4}ͪzKo]6:[~HG;_~:i3l[v[k+nܲ9.W~rm0:ku)ƲG˨2&Vv>n/2͟[z}[ ,qeí6ugeLzu,t&o:z{IizOe&=֠P.RO_`_7}ߜ_Yɶ:^❂p 9׹N\~D\oP܌eόkU?i?f\RoG4.yG=)Yr(sj5^P95߈1h;jLh,Y<_ug'/|Ůu &D/{6ܔŭmwmΧ]$rŭL(j_p#KckPb48Z$iy5.h#uKnXM҆ j~vڒѶslφǝ//Nڳ8U؇JP{y˔iC~ci-0„{^P1['~m5Ya>x'+ҹRLoK3j͍%JӲTKgkePMO_]n>%_#`D4.FEiKmO%_5$n-0I>;T͋"?o a7J.yjj;V-@.y-@M_{MP p8'>kбSU\1%SF~Hq;ye6}>Vkg.ֳ;sЧ6<>yPOYɇRte-j~f՟t*իr1f:A'Oqz5cbtu6ydaKڨIq?笋mvj0/\s'AY:k=Ee@,p|SoI2Mo&k ]sB,^vI{ʸe'7w]EzDFҽRjw$ߪ*[{JNꕛmδZ 3=s齷ARp3H}_}_vK Ze]ѱj \rĩ#_+t^RuXs>u.o9}%aդDeOVy/JMu}zѿ2wW6ZR޻i%=}߷ PԥK,zaVR_{iުn u:w-lr%Yc{i"DvLaѳ0/ZhMOUQ|]@ƉT0/ 0/ |R*;6)cThćT v 4I yEW&É5Cj|s7_xhYgZ@ԯxY4t/$eYmV}FM{T @EfvG=R=阖c~pY-{UN1|t]~Ds MZZFaO7H4#fCV#֝}ffj5o/̬L_;e4"Y_ QKђaWiyƢ#dfX8zr&6 7L4< j7Ω{Sa_w^`_` U&K_YVFcYדao;Mr@p3|%YZ%/LUU;)͝ӗ<3[!g4>حq8. 5j{jٵ_WGO<9\ȴ.ibuNhObOƶsI*Oyze8%nWk>x:X"\ipjic'ڢ=u^o@tE_h>-߀.5\]n*M3PWDp(oʥuo*6uNy561=;xw9u+35ז,.6;'WW$/Q=NMꐾ/ϱVNNuSJF'}Ѳm<ޯ1piXe>k#ʶحWE|9wR I7Q|u M=5uWo<=3mYvkQGsW>yÚ>Km{x_37ƻ: MR.Z=H[/^ҫ:NQ[om^4פRluX贩cD+źܻvL6z4TLWuWUe[}KYMR`ب=`<݁}|՛2VcgBI_ˠ {QbꭠsbVO惭T5^}yX4@tǞd*>>Ipyʑ Eh1W1U)EwM Ybɉk>}]6pVt2-w++lX>R]U>A~C0snsI>6>KeӞЀ+-Rvq-u~dξzfke|]ǶX |h_ig~i~&*yR}\m~餡Y)Bһ'TnZۉ&<\GD}|rM׮_Ω5mNvtM,Ϻ 3;ѹӻt˰Q1_.<̪NS5[l;:=i2fcֻZ2?9ql5.n.Q|_sAcF:}kA?|?Y~E3|<]'t{̮Ќ2Qq G.3`L<5MI.L}|T+mVyQAvAzκzqU4VW@qUL:j{:OR\KY}ҷ2'풹I¶ddIo#,nf 4 9T=wmʼnJ}(ޙ>l/ߗTnS3'y)O/+_`_`_V&҈`_|9Rt=/0#6jjk{ߟ+ȓ[ȟ agM2xkL5u=ϥiqSgyyTK^WOiz\N@6lnP奊bDzձs`_`_I `_|`ҶMB0 /0r)@ ?~A}_`_``_`9y=y: / 0 ئ0/  =Tf>__|`}Q|`0 / ^(K7! "0#5614@$&2%3PA`'{׿5W{}Kϧ{&9ϊy@@5Z_Is;N}'iϥlygYh}93Ycc={0asڄgA_tujճgVr'=JzlFk% oOyۉgDKYNzG`Np|=r5EGmo7EJru[+5V+>gҶ2,{lmWp'zZͷ[FKzoFҾx[ Nr%F7VDaQ:s{5+xVL˱Xd| ѕdi2׷g7+G5/(uֳr$+m:v?:Ҧir%8QIx?+6Q%!k#rJs֜sHsHVJZJ4*U@=p yp@&ԕdyndJ)=m1|BUyH)|c͹cOk{"# ^M{HR:4Y ]gRycC8E3N8Wa=)ФpTkee3 D F.*AiN=$ &1ƞ! |rI z,X-*ךR`0ӱ$Aj9rti|-v6{傆IC6%v85XG^`uhpv&i0?M3AI) 9ڎQ=f\iO* i/JE]ΠMsN6JK{gp=`|p~ĶD xbwi QI:oP-!~EIGgo{t#yqzz>2n^[O?-Km}\v  Bnk(Yv$x$CQi'fi 'ANL{Io)`66 & 3`m4B4Uڅl[<x~K7L-C[*(. *mb@D6FNS*.2ҝp qQ`RRx bssxq֥nOPcJ=<0K{[L{Zti?mrzjn]WVi6}cZO[ZL.@WrޣGHRJI6J1\f5Q0-R*E@U&[/4<`1~4]Uiz-d\ ^MX^pHY JtsNVk r2WS:LfLZu,Q[N;%Ke<@uoĢ69!s[Ir{:]n@Lp p泖YU"T2+Y;rp1"$ЧVtz[x,U]ql$LD!_VJgnc(@ҫbz}ɮ"3I,<&MW #5׍ :pc~ci?9}@w{?][猫g>mKN/Xޱ5INKGHWf:XruvHEm8qg.by`qiwR7;[@1zY31d|7靗5U[c7O_|mMظtz=hzMFѺzAfaV pqkѫ#)WYv$ڏA'%iBr/Eg2~eC'T7 pĩ0+VdV4Zc MM:0JRpʼL %.Z &̣k;( Baۉ2,Rrb5kz{c m#8,RuѮuyl^nig?gge7Oo]mp,w,.iƧö́;B$,Ԍx4@Yr\]@'ZI:6r⑊Dis\Ib 3Hߵӽjaړuimn[pr37'}I>ܩfSq8l~mi<'Xbqv{~\zڭx쏗gggtq: ocΊˑ7zN<Ԩl7i{޵1UrDQ.TO*=*$M=N*kLRgs- lڶë͌J"P Z*Mؚ'YcRUYLq <40cЎR oVRkJ@X^.URjjQ5^$rmDqtSFSDNx37jX'p`( l2%uZ;cNu" W4brtsJBzB)KC2lL=ɗR6gE`ݺ"'K 2:Ԉ܃M&n:j{=jaU{vR M#&*5 8"^坯{[ )X[c))7{s{'S"3D}ޓİy^`!mBr5XZqT-gȞ]LwQlJ{yq #J N q|xKX\72$=<>^MgkJrnbDo\xtUpq :Eog=)6+ {lT͑@DEusx ׌ A0C3XkQ㫉FmVY蓦 _kmΛr'$Y4^qwJ%h_pVAqӦ&[a ұd,Ulp)>.IfElކ:m$qZwbQBYKv[N*S`T@ -CX 15\l.WJt`[^X qjsҮ9GN]=x]N}YôHIpi+[ZRНxVj:E3r/,;opӴ5ڊAK0q+a%g'Gpb x7\.x>dCr2$ifsǁJKho:QㄘY4W#p}rĀ6=)[ $H (Pj!<fOrDAY e1y|aS zP baUb[crO"_r5Do|-] Z?Xjי.'G-w]ʹW5F}yfP$kCHY6ȌC턷⚖GJq74ۮDZd72DKcFc??;td1cF;Mo?ZeݤIR2s񍸴g?NΏ3~(_?̙#7LBb%c|xjI׼bc,!vFqo%!;C,DJӿ#zpˍXWUc3$DzB!`^{_E[K621}'g_fAXwxZB7>Bl묹i;5eܲˬm'$5tHM6,0A\QEM@DEZ;U1 ƊA)]/x _n!s*B~|,賢ų!pd;&F2ZVڐ_D?]aSSjW/ XAJT$k 9դ[ex̺dh8Ej$-<ԉ.٤ʼn+zlj5$ >~޸QU|; еw@hk$ty>aU*Z1"X,N`B2 (5AsP'yfͱwq>[+2J/.:rǣo,=?JBT2Կ)Ne!ɐk8Aar* 9`LڈD\} __顶4jHYQ 0l8)8Q"^CɓzKv ǂsNk:~[c+k(ɀxzIteK`&&탞ۤ!bI@3YWB~3s'9mKVk* B3k<ֹINCONqz }^z^lICC- &ʐU)4?_91xAZ p=Q޺?]9/0 p"}h vWt~e"AN1JZ5$!n|Um9B pF"vUD E5q"Iխyqba z}LYV懽d_ZFG蜹@HF^yG: 4T(A5"ܦ͐2T,9ϝ=L;-ҪՒulÁBNo>jʿYsV|-_~^z^l `&\@ je-~ П)~]M۲އQ߈IPÆ$­Hl Bsԡ`AB>Xb'n@w&E:ťGyWk/]=T(YAzuQ'V"Zu+ҕn>;n%kbe8DfdEJRV^$>^B2Tx$xz}z,M:YSz>dY$tpS 99v^x=~r^u#:~^z^oXJtVfkoonwvK)0aiDǕE)7[, 8Lؐ5jsJ3\Mё+&F[n/(B2]Q$-$qҞ]4P &>S~"!O6"Mgn{E5y>i ء'C''k&1v#v]9[ ^lxcsN%%cwqܸj0ޝ4Aͻ?竞WUխXT_2=9V&NtliП5~M*ړUyϪ&f*R$?Oq〉T$Eמ>6\X||C{nNlR/ӎm6dzx$G6{eXmН*Fѐc>bLZ#u6-a+.;䆇==/.KmʐԉK:D" NM Zڜ]H{X?N0'c绀#r~\9*3 ӼLy%%|>0:_Vd$[?˞b9sO,sI ɿmJuͧo8Vƛ)q5(W45k%HVtt#IKZ`\oLw(kUGJhR0z|dFLsϗsq% ]](Hҩ!kC9<&:p EsVH^!RS.sZL߰Gau^{W-`R{C#I\tj2B8e1>iV[] e1@f-n;b9 L!̮pzFqtUᅊTñ-BΔO6#R-on-nɰD>Zr&HY բ_XjU x 1?>:}Ƿ >ohgwmmk%=躰êejdQ)C2l/ĭrT`uH)6bZtsaP];{% 0B=:k"5b#ѵbycKއy|^{]ej}h%p)!Ri Tp\=u!ejeP#p4$X,]iNαL%VצI_>}~ub-\M{ MD8ĖJK51>Q5f;*x6:nU@Wʩ6, Am~TRbgk݆ܪ7c/8`sr3`,(`LJY*/A  0Y [,Д1B=ؚ\}HϪV'*L઻.K-C$wgH"2ATح3E(NSxdo. c_~<}5[)/HHK/;==BtEL!N{GKnLrmԓd{(~r!WX .6l"RQirDB%rTq`z2z6hezvp&_.72aRHAWZdS,=zҭg׈N"kY2 l-jX@!BZi/$#ckPyi|ߌ0ۻӕy"⡠-P>Ca|k֩a `aj7_<7`,r#KFV,ΡQf[Rrb^i*VԦ?qEćcߦ5)iS{nJ RKmuPڬHG+C7vlYa̭,N{E|ﳔieYl 6>ّ# ʣc3S-W J ]=YiJac8+OV=*?<$~g992}o]ma*ui-`$ #sNC؇r6@:lsѬwdiM`Y, |KCy^,|qOUdz!Jmvaabt.ˆ@sHEZ:͏lͲ$Fռ}JNN46r1b6v/i:9EX7G/hOoK.tO vXm|>"e :E++?:ucoCx8/<<e{6#4;>yFl1[@`RBz<rCUZAo$}Fj,k>^[xFEonXOĝ(MV<-y2C]=#"{>;e `L9S [aF{V?U\Z4Z:16 (aُ Fᖵ`IQ ɒY93G:ϥm1V`.4N,ke<!JkϟE赝>[X7z#ȕ9-w7&KWkU4bXJCXU2ž:gHH޲ F|JWXN90鑚ukyҐv2M4RJ'v7Lab5f1A9+CO* ߥ[d>2*I-ްpqB\%j2pkڵ5buvfX}2ÁW{TeN@3v`2\&VY:]eO?:XG\=]g9:Z"JwUp~Ӿ^42WetSɋ!. Zv|Czדz޲ ƥ**娣ii{gQFZ8_>u_#_ Co}7q)F#\,4Đ>dtl5䕣r_jhfx6FfdS6~~2qlf'8et4bD EzD2g-ӵnn Y# tTYI%ש#JbnpF忒$=Dhh+l=Q31}J z A-B6Ǹz^ӟ-]>:pӞ׿w ';V%U\Y \82<2ێ{ceQaEMɝPP܁7!L鄳j.@ܸ9 D$nXIqβ!cȟY~UTvvvX^F$Vs!;>gKʡTd갻^x#Kp] +2]A*1 "]V맪, m&>by.BN\^Ak=A/u}Nu9=Oo{H_}]j:v,th?_uɣ8zߙZF?"Cb< |Gw)1&ڟ_JDDd2*rd E\I'͢-tLcW 4=ner"M@#JKf0]rC#ͺ^ۏ*Tɓl[0ϒ$JKy.lZ[;8!P<S^2^&rw+wb fWϩu;Χy=L p]<>"=ง&ݟy OqyԟvwJXAPط C!)#S@UvL+ Zc4]s-o{ū%+$}o9vYxVƙ({w˝Xч &.k3itxil y&2}VT4ȟQi)k9H!_, xJXԭՙN+^IԿYZ-Ӗ/+ ҏ[Z}>t[*j$2htlōtԧ6^I/Ui+&ID)H% kz(/KG!n/kF%70 boAq11 qa\\2gR!jT23,I>ӵpٵ @1nd df`(Hk*Oƚ( 'NYβ/j$ Kth`Mht>ISN+7vw/|'s/y˘3fGb-Sw'5!#}vg!Η:\ק W?F/E jnWV\T̙TUqZeJ(pԘ$5%}Đb$+۵<3[R扟*XY">!t 7t # |dt 6If<݅c:qPL9wJvWOLv:7],/X, t4s i<K!Fx]V+d^G͋VG`v acF/]haѧkp/ë]Oh}<><=iz : *`Um2D!ȼ-QQQ$Di6M4X H%˺[X ks5Kז?^ d.EgI&[Ze~zN|,k֡̌i$a3>@e#I3B|Y+qtQ)6}=]v A5+ã6sVtHX|8bd9h(U]%«&,1ȵHmR`M2Qq^ ]ljՊ^= < 0P)AW fG:{q/m6 Qs!n\NtM-=޴+z=uk`=4g)uuu߭0jvB/GVS[Ak0a4ÏZUlOaȮ%>6Ez>D7K[\Jh=ѿJݔtL2= uV .$^ң/b;#g>2U}|Kew6t%¹E'*b:k\B*0.-Cg3vYPt3$E_|^zc74GaH<Dm3Qy>}hh ݓjw+ OMC{Ĵ1r> I9>6ke<"[n{9{اWEHb%o:N'}2\C3cHWS,g md[rJMc(b\&c;},Nl`, &d9[n#G/D@wTDk-듭k'x*[J\}BF<˶;9=lJ,EA5[oHvmpzb8 86,T.5U@Jnk1Mb?BSg,DYmfՒRtۓr^ns|տYfu!WX!Ɩ'58/ф%ʝ#xs_n!ùY=fmt6Jtaz+CHVB,TnHZJ+q\}4Ciu(Cn\8 Df XdMmcuhXga6ڷJjuuLk[qG8PA5uƲ[=xQy-rD}k4ֱ䄭ZɎobNM*ϞW߃η:܈,EOF-\8v]|J׬ gI>e+Z~3K#05 .쮿3-JzAB3xu%ZUm8:22SxU^W6J3a$S 6 ]!?pdd}ralFsLb/ݜEԦvD/iV6t;Cĩ*rZf)H&YN[bC#ƕ4GXkUAtqLJIm0݂BZۊՏ8:_btYgE}/WŰ`⍌O:zvz9m9 ' ;r ]DejN0").]8!؝د 54ɻd#oVM&D2#˰){߆7)HVso@*uٵ|>_LG*G\tP<,il6}f,`7ӍC7GI 34?uXX]eG1rmJFmNh^}$~B*ǟgeSS`C8(Ǥ!Tm`ϗ=&kÅ:419#R{r')\Erdd5LęϤ0!tsnJUsXO5H$KHu)V˭<,mFGe3Lke׊)-XrURַ#1}ΆYd$k/a ?g+H,/{xOwoz& V=Ԥ³܂/=zѫ/=o>VüxRTg=7r{׼Q%!>>i#_S{מ-YVWeE]^{8ӯ>9]j9IWrؗ~xj08cv; 9ARYWj󥬯=J4d̈B?PO*CA^WH!7 Z_&9 7MԳ՞yWW yf.O#][YZC'k{4b.?JƯ:˙9 y(V}2Wxōz4X~5Uq y+t&/LN !1A"Qaq 02#3BRbr5@CS$Dcdps?bbzImtl/Z%VE.ʏ0hqnT/'Bxmi]F2}[0ލK>U{zBTj=fL&Q^!1\sgڟ|+Ekڟ|LIy8UiCQ#Jҕ'족rٟ)vD. ʬlA{GFbmK7;8I'Zn;{ID)))]yB[$)̈́/ 8%CLpP^m*%SdBDӞA$>=B$<:I%;!֥8HQWjrveB6VK)&׃hqV fL`HHTIȻb٘)lH+\gdJQ4?a%2fz*!CXDҒ31$wJ6={!TXnx(Pas-6lNf%.9#z?mD۲M[|9y9AUJ Kh^p\aF%!RRvi[)ŢHǤr㗸Ɯ9˻m+Tb1}B)t4B>)Ҩ *u Q,.4}pVGV_tE4αǷ-1._z8 $uic8i;/*XO4Ut VP֒(rs=! JH-$olNK;Z%]h4|i| !bu@3(,[Ձ=9]S/$#"Yb zɆc]0IHF8/VQ/TwIT?sA"p"@IM7U .%O+ұOﳎ`<t!x&@Q)ī_ns-'Po}xvfym{<8ޗLTf]rsû :\7X_a|JT_ï8NȹäKu*\B/'.;(uZ0;HfݐH6Q.AD^ V0rFq_ێtHx8oYMr~XXr0kKL_T>Ha\a‡iQJ "Ie;"ij%cd(™{6faC4H;ofHaF2FY\ '<ۖ+,؝Zp#TQ&° ^C;m0cuJW q)%|nN[ߴRD"\V/chs5F,?JN(Ě`Q0ax,o$W4yV<*QY*mS"#|Q< 1Pt(m^rgyz{6t&%_Kkqm𦔠0tbE"zgY2lGDz #hn}H-ƯX2"1D@&a'&<A{ &'3‰vSa&+Fgx0Up}Tӝ*c'4ӏl\fPRu8D6bTHvm?gKw' ws#ۻ `nH%Ҭ9]NIۘ1X.i LFC& \0cɔT7BuϤt3).LCARW(y!駦T"RۙFc~{bQIf]WI剅bWc;Ê"Wo-Pt}VT~l =htTvC'J&+-KLO<5S`+f]'[_0]r iJmJ kH'rvUeJO|sE&Z[X#8u<_z?x$5W?(u6PmDҟEӜN]*Q/xB5P$sţj˟\ZG);spʭ¬-NIDQ*Rn_1W,lOLK'S;N\!V&-&JRb|Qrv<i_7SaJuCc/x^ab4MEm.CAcH*Ǘx\t*%G%3huƸ0!LbźabZ^MX^*?CFsZdWS6VaLMkQ(Z*6[7X9W/Xv)ivFl- R.L4N7b0b('h%uĄ0R%o!6U׬y|T{5⢯G͕;bҟEHS?|hO힜"*)b_DƳxh**8>ș+bT*ċB2*m̸ &]K) 톝B@-t$%B&y)M -7|ֱy*ÒJ+!54f7Zz?[8e2'Պyo\~Ӊ4)wjAZ?;tU[l[Q4Z|TÆVy@%i!O8648RjR_$L6l 07r:"^e,.- p&o6I)-N.Js1Q7I^~x8ܱ6!u틾=w[ߟMẸ"ݞК;#,a*9ۇ.k>;tv__||Uz- b=ѤSjzsU=GN/u.G?́⥌U6Oh9n{J)JT}8k֤au!I>5%eAV4DҋJY![#TLK8.G27/tj2tU䇏$ ,8/e[e !>RQ{lI9*=7uGY<I')]FҤ$}i60g;iU1URCUtQ>҇OlNʵ4l~>mR=<S@EE%7YEIзW(Fr\>ޭV_8C8l4H4LwƩ7(jV=&uN8{ RBđQ؋qC JnޅRLj*=nʣIՎ?=)R|1VMNǮ{Lh+zy=J)Ci;b2ÉHQy~7%D16(aq[ C)){PRмqqĤl )N,%7bI%I olj N4HԯDK L^$K! 8(~: S -RZB^賚o)\<݃h1OhNi#1V% q`s#3!?6sfb`|o J/OjZ71/<ˁ;.v~˪ <.6De>?1׼n(BրHFq2CqyxRӫ[ߒ *׽D K$g .) UƩW7뙛sV7m+SRN{<~5~w&'Ƒ7:oCgyi2@ڬ|hNt _ IT[qwmOKIwl=%0˄$caG2Ifa*`niʗXRFpRn!6-=@@Q1-!tua&RM,bˊ͋DU Rup__&drC $8/TUY{cf鵔UϕƑ$ S}Bq&<%|(XO, UɃ괕OW@ti8ZgAS+ ӯؕxۛ,-@a`+K 擘ۄl;bԺܺbRUT-@-L^C b[vS@g2Վq60/&R%^ S?Tylib@JMLcq㋗t{LרvxL) _$fvf GQ+;myUEIĶ62"E0Eݲb_(}R1(Y.\ lYfdxe¶ҜGeV% ^i-C]/ۂ(5~QWi"RmK#Oo{B[[}{DmuQvE"޶uqvB4F`*Y;uOfzg6COj|Q,0RpGt(kl9 P0kdDNhY7WTOȹ$ mx%ijuSTKXnn'(fIT 𷒆a13"ǫ I3IB"mX< m&~-O{2.vK!,EARH ,TJi}|Z zK,9{iwcK+{_TRUd"qeXF(5$ HniVKn}˜G2µ߃퉖wٺ+krāo!TuD17TH%6Bח1 ĻzYv L`d!ٕ ygtuŷA[;$ڙt+|m. !*/|Z=)ew %F$&U}#YR.k;_7H[:i)PX1tQ@g+4w8Nz1lE4ꐵ8m[3M-X[$vqslIN=ޯ<똗u\v|m"fkvĄ(-k.]V&)Yt 7NO1[;HRTLLDƯRZCK Bl_`nxrbv+,~B Ɲ+O)x4oYr~6Mq-;a ]7(T/ %XJT*isZem9ʾ9c5`9Ị\x8oS mnv뫧u["BSaJv>;b4SbFyY- *:96 *wazBH/E*TO6vWsD42'o?|3-_ErĜHBl&61;d,M-Mdڕq~*`RHŶ!F+eU0K[ߟzeZQwWsW<)&(bnc˝t6y^)oM8JVrgkd>fS*g̵:]B`[=n-J?aAt8/wŢ`_mbyHHHMkRFXn3\oVNrqsלT)) 6@oo,KRmI ߏo?o%iGQ7 p{fV${uG?fuqzE-8dP9OCnhEbв&?2I;;&B+yA2rbY$he y Wh(k&>ZzjV!–At'C6eML?>9v߶=t6ZFqռ:$ABGR2r^zJy_6c^ܶ Yt)VT6%fhrYm %'ѪM~193m*XtIA1'Jfs<mjMn9RDGCٕ7AHIp^3`9=U1ΑܾbCqVq?]ĵSDJgRwWxΏ}UЕSd4 q#CP4co`"wߙHtN稾 Sǻ3˛DԥA'!6f=´*}Ѝ!wW$DnHFhHK¯t=4djWPݧQgtrDF;aU<'џeIky H{}QV&\^U*I yKe;K !1"AQaq2 0#BRbr$345@CD6Sp?ldRG :ǽIQ{s~CLC ߽ G<&o;ÛPڭs6gO@m6ϟ1"Offk g;q™u1,vg N'FϏʓm:n/W;%R<;æ,SkE+){$T3ebL鷺ä, JW8'ThU6#_W{ʎ|#< 㩉j70e٠6ߏAU2M){T%ji%QЇ8':'ib''32\mCGt582fp"!(GZ9oЙU\4ΎV m 5,Zn,;fwONVK'`+ivzLA#huTθ\ʥR!R8Zi'/щQ9PQ^d=xOi,1 ;¨Z-ڎε<ꭹ᪑ = MU4ןE귒lT~Cީs`}yiӏT;7'R܌͇i6gn3䡔wbg\ۊƢBqQ6V w{v vfbPTEAy!)'*r!1,[Gэvsʳ M4T$6hS&"J^`XrFH-ڨdjT2kINȊ_*+kʙ x=!Rlw`#ORlYv, cld挞naMĩ ;{-$uTeU`ZR72?a_Sa>=I[/z⁌?e5l1S7=uPr:y)RGR>`ҩ`5I #ʲG<Ntx˔e#Ў +-lG`m~1&" UZϧ *eۗuyEw+|\//Bŭ>laQL9|TGFCw4⍚>ފoP.Q@3J>Jfm0Q-l9M%٩Fι%4{*{JRc۷6a f  {]S@Ղ3wB?T|uTr?w,@q-~ of wwf6U EC N7#Ycq:~hbb8xF 1Q0=+ *%ʯ |c+|DtHp{KvwyЉřu3M#sgiw';0;07؉:ߋZCƛզlB54YKmGC`ԲJ#g:6p M  _v|S; -㢘SƬ#{[Ux;(ܬ I3;TX#%+-Aqҩ0 0:r9c8XdihNN< /ZvLe;98$W$}|b8E>+j =P({P(<= ?}\n7}w_Lu2oXl7?eE@Y ?5L}Q5aM RTZ3rͷ59(-)$1&Bv1C)QKp6;XmlrMq̛PfX,:!: ^*$OiCJ~9{:nටv+GH PBhUNksUde3l/?n,YX|~ vdk[U$}UӞXآ:&HDz)'y^lm'g #S+[Ssn{n-GGk!>٬UwNp.Su[˺9s{ z1?Vnsb4X,ڙˇ?Vo)ͣԺEeFn6Dj7Ӌn}Lopg.0ӵ^ߊ*V^jl8Y5VB:(sh~ 8ZN"~0+,8 vO1E//xnR)Yvt}Bb@&K#?zlL#~Oyq̱C"ioy5~6G]g/ \ZXPD7]K9X9R٢tnEF 9,%#Ę,Bϻ[SԶ{ =z8{C>6Tܣ >吁YŊ.qk-buFfnd_xx~ =Ag>Pp'+QHo)2K%[oBئq_?LMc%e3l3ʨE[eq9XZAODDB91iô*"s~>=@/)=Y8ܰ:Gţӣ%ygj,#9 ㋛P 1Ď,m󬟐sPу}XƗ륻ιR];(5dG+*8$q)@ޞ͏:fYuTֲЪTCSN}VS:*MvcXޒ>M/۩}Ԡsgcm]m_GUcr/~Us^H/`, #7*qH)~cx%ozZnͻGޅ,:~ }H0X-:P\tOz%n^ۭs%ҹ_D\׋^V7 5\k\U̵.u6"cqζQv~>WY`ߜ.OmZİ;#ԗE}5AS5Ű*.}X>#Rx#ZCL{$nfbBJ_ߢ9NҾpq_G[מOЄ0Uʖܵ⤤;4c8qR&ցae$J'^7辽aSZ{KRz;u^7٘{b3|'@^YPRǝf _JHjYwΝc`=R FF=퍥6c*NJ>#KfB6<",F=I#>Z)^PH/ g(߽G[PV07+碪BLrG:~b0i}uULP[I~^=PeT o3CߏϽWl +;=X~~{ɬ1`يɳz!08|XպͧwxV['`o.7ӛ떵B4QS 6Ne  !1AQ"2aq #0BR$3brCScst4@Tdu%56DP&E`e7U? #쇹"Byymc%cI֩_yKrj<8GlFRkr[zEОN*e>ꭴuԓ;يś?"꿢?٫Cfk#&QDf?\QGПYDkG]81g,_=g*;go?6YՌtk,?ʏcJ;*?yrgIi3 ?^1{,C-G?BWO@c-1R?XWZ[m%tA;jO14VY3ze"ډ9S"~c7dt(L̿lvz帯r99daeXio08#YZu+fϖXXGX$YR#&VR֔%>Ț#d>8O2e"OJЖ**tҫ'Gg"G'J=9VK BK!g:OƎlֿZ12gG]8Y}J;gUc v9)"֘K.]ɶòS]J({c P?F0'ckC*9Z=1DrWgE=# AEy׎N2*>W?^96~aeٟcgY[# ?hIYl~wF,t 3ѯՎK6=Im#$B/H9iQW-u/}1GmY|Ta.~G#~UA~MGu-87ͱï'R( J-9l܅g'NRE:}'5`:SS|]BvE RUvj ( NTޝ|0BwoގDsXT1)amԵ&R]¤ )ͣ" "4Ri!Hr|53#2+k6ݫ6nkqcSfRmUndE8pI`0Ve熑M'awo֯?Ȕ%^JWO8ʿ%)WuMBm,S/&n\ÛAFVt}`RWZ({J3|1sn)=F/ Q5qhw5v cBw$,>DY}ꔐU.sUHƈTD wEΔ3L&NzdK%"n-./N9%1â4fALI4Eŕ-}qUw '礋[v kdh*Z0ZQaYvJ{xOJJꚥsdȲhkPęo7gCm([a0<`NҟT- w9I;2WxSС0ŨJC yJ.dqd_}@Ji ct&%鏁Zɿ%)wWSK m;9xk؎b-^ү_>JT|!xedC*+j.nNau*1pNMK%/tN[ f&.3W rZMѩaO8I$u/>F_~u=mN ! N' w_wRe -2@"ܦ }tuzjz|gΣY& (yD&&Z% ̶ؾT:/`bH=7۟Vk?^ID6텴Ba ѓęte[[=" $q[S"}7hE|Ŕһ_lP2KiSv؞H_(VH!5@\>+/>P([kRD7Jwu\M9_6Li͠ZPnM}vdGd*aJֵ-J8VگV2:s{ G6칺ck{`:Å*ITF%tI"й8x8/Cw3[zK.dX坪MޤX/BQxoD%ԝh:MH<6#|ՊJiSo>1 zqzi=lO-r['eU SI i-Df8sblx%oZm2tQq{L'DIi5i̅Ͽ8ya]w?KVm;]6ekQ HG+~ȵ8BETثyO#IʕO Ӎ]?eZ㪶eK@Qnbb >Xә!+N5`V{V/ ɶ 8dn!ԨbU|AˈGt,sZ}*6oJcR bs^$>-GM ѻfa@ ){ z"oyG=Y^40{zS\6ePvR.JC6$pT jv8e%SJ^d*A+jN I-xrSuM:bcFFPRڼ7!6ՃhmgGj:M3mJ7zsʤԫ\"D!Vʔܻm)Ri@m&e N ,rS|ZTejS(,ueǤJe&P;qD& E`IZkέ(AMgMrbBBDM-[: rWN1!z5Fԩ@J@i󖜔q [1 DL,KJJHW)#8jѵHT70Y}'p9i],WG9#|Zzo4R(PVز ʹ̺lSr^i)': R!fbe]S!D4h?lZRR֮a;h(2i Re4kq[<Ԡ.a&E9)8)($Б>#io&WlZ6oKW*Ao\\lܻ ,U+<%{y 8-n? a0G u1/!3q3Mj uHZ PcN)({EzbZ9{-wi>Vp%.QcIAO c9:us39޹pvbpr>k`]:-wN|w gg+2`ï+k.2[q8IGD?Z./j7݌Ɔ{=}lbi-ZݕQM E9,q4SV;M+CDו&Ð 3Ǐ%GR9,Mݐr]Sî+ ԲmeG?aYtK35Cړݹg BEuw :bsNyk,Rag_hw-L:V*ZqQ;bٴE<ܺ E,+i;J5=.4I{aCtoW.~E~nO c4<=tOGR`.zTiF$V ȾPqJ^js=щ QT39t@WF-ybE+SFЭ)RB;^liZudljոLkq7R0tSCQ[=YhCdNNiYk2ԅ)d;ry%! @T!T_'L]ޘ2 q=3'V F(2~lm4 ˶y"S@zI@ts|򊡴fr_xrqσ8Ǻσ> ߾jh?hp8< HXi}Mm%9ZJвJqkw7n.JZteKQR@[\o:ZvEiJ@0LVi{LBAMk+VJk 9g֝ABҶ5'/k[l␺R2Xl~LZvUrbnTVU|a%l[kuwiGr.jLuQI5Iaz[8\k+ >ym}]_AM68ʇ-_~&ZJbqc.2y-|~u^ >K`z8$n!(\U|1^h+y7ĭJD]Fq~ŷoIru!5ޥi}aqٴU,M6Ix5dkmSaWn{ꋩBgT5Oxi^S~$WuS cSTLq ےNǹV&bU-/pM"섣L'R;(g"@-*c!_ \sa SHV )5Mм}rLOK<ZMi]ӨnZbyfJw$+w -gMuni5I,vE[ޮJr"֋KKgyKqk|J3cZCdq.d$*le=5-n(䲸eKI[B\)6<JF# ;9fR*uN pKP Sz!F ӯS[kM0|@wݕrjy%^FѺ7Gu,+<%xe[Va8˪'cXZӑQ#zc/L '7ev *][kI<՘E]U̹Z6vGbVi8̲PUad/{r(ʏiw4=A>g1DU: 0M~6(Ct<?~aC…y-:ڏw2F^g {<{}+az0i+g[Il'&ӫHJٙ(S['mαpY΋eOƁ*łqHqhjkJưNeFs>Z/t*fmW&7ty` 4M–S^ՖQm{=TSaH\SrQ.’)@2[FY{e^ukwe+9r!@usCk$7..ȯ}s`4p#BG9I)8|0dmFIUҸ^IyX3Z~^~x@5sݜ^m5szH[c,ꐥ*U2Xޣ"nj |L¥'Zo&kӸCoZj]'0(!OFPL~J 2MY'&_uB .uJ]5LLE/eK['5t@ѹŹ|)S~HBpN|Nsbi'/͔6+j+{v҈]rBl}8s6Uo0Ţ6[CWqR,)wGhr]uTJs&4nM2z0* uL c bN]o:km=E'喍bo6V^)2tJ (ms2l:Eye8Sf%BiKAc|)2R:RM316WZ"E};VFYǜVMfK$!žJa,JVjV1u ޻wV.5' JBqJ:P/'+EMң|]i(ҴHeW:FQE6ASHEEEbTwXI(6S_~i\2}31YglJG#o$0[ Yϋ,";oZQTz du@\g 9$Dnf}a4KSi5$5}= 遤(ꞒI^,|nF eU>7,Wai>焛ɥ14FeZjK2%r:QY֐eKnîS+TB'$&ۭi9B"Ѳ:D%7fWw;|i1iH{1A!2"]Vvc 64zvjIP6pHdŧkWwÚlM*^ca92_e{AD%&}'o;vS@Z;{+HmBmhv' yҧqURjTbSF爜fMF,^&E휞r=ݣ+AyChVk~zŗBI+SomU[E(t+w8c~FXKKޟS hNUįK:wj}<ؙ*ٿ: bS+e\}{ucDMG<H3Q\6s^Pu:ڗ' ?-,ox+3~u^Gp>{5dpCa5iTcHfSͮ+N0K]N0YW|Mb{Ae5cyiq ⨜Z!].u|Uz >ӈiF䲓 m!mRjbS-4%\^ ޥ)kLl9:R\p[ ļƶR$,T'(ma.ةF= MJź}o,%*@N=SayH()@DNY ǩUOO2gXZdϋ"I95( ' p=ڳIzY|LP)~!کYtA߿te 5'i_ln DsM9@NKRH{ئܨ4~ڵdu2j_)KM &- ЦaVI'e$ek37רQMgR4<ul˲BV.Ca9[Cs 4RzB [@ *,ZBēqp2ZL.e^m`4FQy ۸-uavְi)/.k\96)[z*0ŪPfKWs4|L"oF-jlͣy&3='i|`}kjj+1(S68|KVr`+Oo WdL,lag }D.oԣ> W).}Q&iBoyCÜ vV,vDh{2N͗q!Ak%K-zꄰjZ֫BEJU1i1;f˪(wirϲ}SMc+ vRLM(^inSvJKknAڴ'GHEbXn:솹JR|at%dtvϙ[+]j (rayf%%I7WR4¹-ŨPԘ1 Q*aKeARoNv/Y֥ RT87tvf{PKb( uDͷ:4jiQ[b՘վ=MK m9p"qQشIiٳW۾o כ JϒJQe_Il3!)k q`fBiURR>bB5oYvsrM)9ׁS5n "̞m4RR~_͔YV >Ԭ8>:1`/2r _Hٺ&-eKKKW땝"RD;Ŕ&vKI6 y]RMRF iTu̥<[QIƽX2Mm{ 'ẐELx\Cm2)-*nܔk"]a+x6r UYehD֧3#LwMNȷI T{^g;a"J&G/!v3|o"oLmZn6y8l|?\WDڎem^BI{xgcw9ޘzar%lmR&Z36&&%΄IHzcy>MLIJٖ)?8Je5=r?c۟or1`͏q1X(!@Tď_zqQPk+ND6B_e!hU-;h֛v͕5QdVi{!i+Eۼq;Ti "K}E&ړJAX/9WVo/Ӷ%&gMBD(Pt-ْ,cmGL&zFelc _5}G$D6[jBd5J lrS^Pbò~ %! 9q.Im' ڍ(]P(:I%qu 9IBBlERⵗ)5 5ʐ%e ]0fʒrxzQȦxdcV ㋻cĴRU2n %-tֲ'< 0 ͧ20dJ/V!]7&)̩:# j3k{JR \aWV93 [~fx_Nw=d &T#ͩ%\ ٶ uAiJ>.ل:҉zXW60be.Ym@6&QҚõ]&-t&]Jl?k̀@ٸw-[A~'3|* Yl\dakOp*ֻ*eE\ͻbm!ITITٻ;u(ʐkBmmȕY0Y$Ru39v o\*NneU0![NDBӷhT:D8ܫO|DPp . cddr;IBiH]]CE6|'$'1,79>J×$eԼh_ny',R n*BFj'`ݓd)-y]p&&YD qU fln"k䏜#YzG ?|w{#dlo{|~:ҼX; .Jݟ%(|B:ϯz]A',ϧRgFbY5uن `5u30(•O4\:;:ƕPABt~uDgvYG nf]m lJ5 )䴢)Tp]m$ERw“tiSq^⑟p@Y>UȎ ]t^yDPV,C%$$텰r`e^qɕn Z'OL`)gÜO,L_ c]ԑOd< du{wcO$p(tjs(V7UD{| Nr2$ DTRMA9q9ųma.$ |5} qN$ %3Id;'6:Ju= #P*Z 3V˸̴jۣx1)>\KH-.K,)wiFV)m3avrfdhU]0>і-ORR]Z+tj$پ*2]boXT*S#٬k)& O'.ul&eU-A)2JTBL HCAJD#` TE%C`UhUL"EPA83芈&eFQQ_TpN_ߘ 󘝙\q^ueT}Fvp~2{(鯂9*Gcc DM'wKI(=q3x7۳e$k[ưb:’NHޖz6^۲h-,ȴ=2@L"Vϔ JHvGjK_G ʑ9.̨imД];kK%L>ZSuT*Jm45[7<[m\\m Z7u5r+_FB=z Yntn%-.O$"q8uVd\t!8eX(V_| LK mv&,!^Rv4$t+.rm 6䶟 wBܪy,MT~2OsI:B"pI5<88eb;2Cg{xUpSXkygqnZKM8Ì!.@Z {ݵcKȢjU5/ԝ^Tc<_nZ?)/NٍG;"˜9-ƞ;+N؞fH[uKϫgZהJ&%'ۛ] '͔52_BUey,nvl%%O=s;)7Xxp;]l+åM(lV 8.T|jt qwl-ՄMV.ͦL GOL ,JTadw/aQU8B(D75u̵uC6X6e&!}TAI|W(3|ep 8ZKJ_(UE7!s#,Mq Sȼ#d6S nWl<2uÆ6Cʶ%y\iaiBIJ.nӮ,f]JYwuq"RK ;!L0wRE䪒)i!vjuL)M@Dg\enǢ5rR:Kh@6Ĵ̪q`ԏ+l#f| |;Ze'1ॿ H)y9} N hun`:+a T$,0@@Ǔ\`hI"82d|ф4ݘR/5g:Vwt f}]B[OCj|'Ih)5m6&퉚ޘ}JUnaC MImŝ(hZl"$lɹI9L\/1"lpyzwJx/ƈϺ>WP IK(RB O? |n<Rոfg6Аq=16NMv6X6&d]M)bLܒh ԡo sM~i^ίJY&YG&?y?'[M:B(+E)"4=3<>Q9(2ٻ| K2Mo89hmnȔU@VZ=r᎗"̳_v(L94x FNVpڜ\4@n;bg!^,_c tg?֞-"uT xq(}jwMIIIdV^t4ɱx rzռBȜqA,ZX#?$zVX$%{ aJA8QdT1F{z _\]Pa\jCҲA(Qޯ#}eg:1ОKUjc)BU/aM*:T/,ej$0p~z.Z켫̔iyϋtH5S]鄵l.] [n㶃L]U7yiѳX-4x;FUE5L!ei\Ō+qږՍRJ.0S%i"i)h)2 2 ԣ*dUag[iRzO83 7٫ٟ{Aeu)1ԟ!-6UtYe5S.>ŕ[\:Ĝ&KtVNqo:|e3ϥ+\hY\p2 A/Ն˥ԴU=pҥ{VSWA#/U(Dn`%ox!Xe [FPMVۙlWXϲJ)RMRAN9(?sʦ yrĸšZoS֫hґuB+XSp[)ӐUJˑ8l;Ukw,lXGlx`)o@HwFqy |-'㧤Bx_u7OD12ZeNNS@#艙Q(6bbvix9ŒR Mq ;:IӅv0ܡۖ|k^Rї-er#xhf2rN <gV"ZG5nU^*>jÎX2(@ &I,ttx=+?#˧T5Ll7$0f LNd)VK^ƷTJAqdn&EK})7?K2  F4|g}> g 8-ۇ T1 9[a]6RCb)["U$[F4|8&>;gE\'U5"#[H.znR+)Rg&@-9AP4@f~yBjntlkwEPR(AҳٟzߟZS1.$ )&meZݖI``1l e+-. ;+Tm516ߟp7(Ox@NoʐԛKBT@SA&:C/drnWle.:\U@ Ľ)+1rꋳ.9BMqXޱ4aW&N +N;0^jUN˄F–G~uu E'8UܣE.;4`C6Mc¬ڣ9o\ĘpS Kr|V}v6;(EN<4-$eb0I*R ORB".L)'rHjUp^) )bhEІ_RȣIQL+)Z 96u^qŚbBdoMsV͙zRaB]7G$(u*SmMhlQIMS ;Mgz[ڙ<vTK5pI}p,&~osJ+Ȝ}'[?L eL;Ee)tI `N+kC!=L@DŽ$<\k);LVn=ѕE@SRK))J6ph%S)jUn'l-:uJA0fuf"%X¼S!6}c_[\Φ9zs& >. yMT Z`r9vj񗾰ۇojNLJ =71"\ Zmn=Ա:-BAE; y,`2/UlSőn+>B*ejǶ T zcVO=~vfbU.*E$^K/9fg K쳼W*=EmejOVJ1~ƝS-ju$GzUJwLJZ)xUid y'̐8-UIOnD '+ ^_⤟gkfP(Cy/(z|?|Gn4 m̾tX2|][&ӾY4ӽ[fnfǙn\NjU|2)m :AVmb9przset-52(uEٝu|وUa&t"ز9M.FZFj|ϣ..1CKovT[jBvaa5J:`:țuZ ֚miu06M>,ly* l>}|#Vwuuڃ.0871QؑiJ{Wz:vèS[;r:a.L$.Qfx﮺ ~J%°RyU!vB%[6z+,:cRRa36oΑy \_U!iqj$&&qY5=0dh΅̺Ԇqa8'ta#<Xe#젘c8bwpZ ]a=p66ߚW2x$l_G80gE?X'M,S e%)3,%P(zAu+W];FYM,yC>CS:LJL 1tod"Cve.]}]m pP騄jfEIeȼT]MZvqfXԃNJvMV*Sj kV[v{nRcfƺȱ P_iQ?TLiE\\[Ӻ ҀN zrahqw(\q!Xm ZB'w@tvΘ[2ǖ@l:EM9gZH?:-#aq*936lY`{ {o*uPLBP<\+ T'\IK˧^> W6GncrwT]9oE2R yNjO7`-*B>08l2M@vDo#LF6̹_6)洠F뢞S|+9-zPTC{U8&*h7>Z6Z,or  .KZV{i]8ZzA uciL>glIX Y?^3bسf'S3.ыxR꺱DpZAbQ!8! Wskhh2IX8pNP 5#낉j7/x釬;X1(ZH"y%}V{ڀDրbJAdܞO(Im̻)K'&;؜I9NJ0[H9O>i&UGxǠG?ge#4[@/] %5$o{~y^]P m;`(x_ 8'h+ɛIH޽??y[N$ Ys uUD!;`Ϣd mt@q`ݿ+U2n9C%e帰&HN"㬬ִ=mES/x$8ոoMIⶄrUf'&Î\֛IQ=jYKIlGvcfRI0}WJur3Ş[ MŖ33N<:{Lwk\7[GAdfqYTO_n?p:~9;hW#~ũf33BPH8E#[.1't)} &&g-Y7 YˑFͼNȔnٰ.Ru8atXcZKuUh?_ody& ƕ hmlD m,H4֋p&ʗJ0\RRR 4zyH*4T#Zef`זIշE)d͗kIB\zn)gu7oMc%2ڴͦA"wHerδi`=3v8UDZFv|zG[k z./D^JRT-G\W!v&5n'Wn./.Eq$Ъ̭_($^ݳ(qEr)HH'XFI,`^]ʗU]'fy b]R!6Eqh'Ev灦BCmn,. mfeEQ#<.rԙZR¤ vFa%BkFtzD˭iiΨr*yGpš?{Vu S}5x\Aȷg *VٌR8DVmg\7' CSRx2HٰymhMV:}0Zj5$& A8< FQihsM'oVO#һ6>?zFmN%gȡ8BNxO_blru#X6ݽ(o7l&P{e?ggeeb(G m2(oCt< Wƴbx?WxmԆj3F~ T>?pR ){3?~{Fƕ* >PcFpޏY'ON;B+qr&B@e'*hҳ't ;EfhQhH&Q'lg_f%MN5BaD8Ի%d!֊KUi5h͢Y2{rܣ @döLSO&Ӌm$R)2͕d-uQ<]ju6tԴc'Y,9EgjS1g1@*2q 51uY3j! q]$~3zxB 8S:3mvo9K !LTq=R^R mY,k0پF+Qw `MZ0JMIyMS^ykeSPљD-V[.6ꪨzfn*$Nx/FsQkUລ]ŭUƒv]tW(Ěu)(֍aeF5 u7f1SLMj8cˆUﱹ͏I&,de|3|1sskr~lx Aʽ${xn G)X@9t612qء#1̅‹M?:uL)jo=B&p>UYtr㜿ҬYV3<@ĂN$⬳;)eR@˷ F *~γ;bŮg{].8mݟ.P^xE`ͭbZEIm" ӓ,^ƽ5R@1g I'^I/4)` lM>wn<8r0 '(fC|I]4/L"vP+a6g)M;'a_%u(JPTi8M 9jW H Y0 T[8>6ӜqJ3G-㶉C1V-VZm7f%#rƤf)D990™W5&93m8ҟR(U7F ];6nrrS]&'d1Z?5~\)YB*KM|`zImE+B\^d%5SW1hiͯ$Bq;iyt:8ybb # YNKg,(=luhl4>kI h"'wHGl Cl*}qLs1/gH'Х'-6%@u:x8ã{ Oqg-G>ABӈ40AAS8 R.uE L)SIm~b`t]xJӰߥT ǨBy \}K(RPf%`_έvE%QqT0㧜w#qf-k5D\# lh4ʚ}[9>Z~QT["3#483}ǨhV1DRfPnH 0JHړL%] 6ݧ$El9d)F 0Od"Q^[ Bw mԸλmO9P+Ek ZVik%XACsz?&ggrM/dC־X[ M ʸV=jUߚ|xNQYgRUv@?*hUj:vAm5JπUڤH&iktG5(ĶJg+H);c(/Ut.`[OOY~ȗڿ7\ s>6x:C2.kaGNktrTz#].Xi sx_Q\6RG{DMtl M|f31<WP>~2}cI\ZK$t ,hHM7iʅːKJfCUӿtgqf$v e<.yaU[ڤ%A M.Tӓ4u枸(SWҫp0([rE oL XJs&*+ |–݁6ZWQ. T8ڒ*Fqu"8uN$F $BT@F s]JsJU*ޓ.8 APu1NՔJz!3-RNPyUT0D63(u[GLgZ 5zNC6gY5z8mRNP' o86l1q=GW0|є:5Ů\,࢔hUG;' u?HzN~fAWR$-1B&r"EbѲe̫\AQ iNZZ&r|M5eNwH 6EV쩷Gq< I GUjU<@`HA۪dg÷=VO|^8vwhLE 6Txx$|hy'cf.ZpۥΆeKU !SCrJa8zoZ@ 35kJ68[DikM aXvPvCI u5|)V*+xfLX6|I'z6-{j+I0;a$SrF]q ͹U8+) m]0o1)Yl#G7r|Tړwd# e鶐5ƒ dH q2^H=(jXZҏ%Q]S׺4C.StkM#1SK"5HdWXrMnJURz/ʸ7Mh ss^ x*5 Ӓ+HK!UL5<ߎz 8XF>^$bjH́f'{N+B=(2E -L4hM9tԚA:!) ky721maSֻw$QvkT)5%*US-^RqcLG{sMl>m*zL\M+9C=sOq+5>ۊ\h6=\ZmWu2i@+.m0?<^`"Z6C.>š&QIN@6bR>k],ٳ^n;rt{f%.M6)P:aui]J:I~Ua1[cV0α X+n/ wB^(w7,yiq,QIO!BwjĴrݮ⒬k+Ra2fiMȮӿͲ*˨n*uR-ywAG90ܜ}DUaRiCY ,.t„ ^G5#2x/e1J|YqI]4r̵i>@W'͔qY١-'>BSv]v6> OME {>M>DU\yµS"fǗJyٲ*vREi)qΎtZoJKPGʯB}G ϊ2(g l&L饀(%q-=-*-f^*ݛkZ']$ l+_bSݝtɊ+u(o t1L$WyxXNjODuլȄa \q!FmM zѝ~f8o@Lٶ*)W `/C)VhCFRnٓצZ[V c >ԣkr[H(h)œI?uihpK蜞e̳5SnjQeHJK,%5;.ɴ$%:sd./Xm 4B[_xUЫ艔YqڣmJk)j\iDTDM+,ҌܹeKq5)IΜjM۪ءd H7+ tWPDw4 EDP˜uUzY>Wq%4̲ݸ)-EbPƶCZdfZ]{aJeDrRwsfDZəɥ׾/IT]_fҴS]_;oe0әP.d FiBRǬ76CX*vBa- ƒ9&ۼVF/֡k4a'^eO4GZB4vԡf䬻) 4i=Y\0E78kIr]E'BvBf[rDьZ.&S JA(oV/ZNQQ|Iec]0*18H683F[jW6 RmU%Tj^y!-miqۙJ)L&ԠQ͖í:|u]|&JVdzKMuNCyJ0:YeK=8PS ([Jq\%3\)"a}p͂U0Mt8nd)p JϳZToK!i6߾Sj NЛ*M H/vÓ^355^Z5Ţy8%=IHX6Lf^Y~0G)G%ģ5@o'ی=i+em;֔^PeL#>%e2=G%M0v Vɲsh0A?<d(e5?WР2Jsӎkf\̊^WdF<|yA20ycac8Xcgp{<O6‡Oۉ`#T`jI퉐?W .JZ.>b`*γSSp%JbgIf`U[hoIb^JYS463V1 X6{RҲXR3RFCjV=xKSc+1;#hJh*AMZjy>\[<+2brȴ51 [H4nUR%ԖYmܻcJG5 5FE1i89cg[kX-m'g7ţHK~.6M 59y56eL9_W֊e2&p4E3e] zdnO; [o45mBPz#l=mU֧Ӷ+2ڲy47(za3j]"@-6tQa AWXJa6DFAʦ^SO= މuLA-T2N^vXYX7*!ZCa3t7Dεr'˦ۋTՄVͩnM1!*9rH=132ChϦX,q.[=8DrH#Ġ)Z;(aLh]ЇG @evD֎K4JЗyJ n9fhV;h*钔yWZ*`IZkw<ho`D7hnry!M-AQJf>@6Re; J+h׿1?m~j?pKK+'&bfeY{LI7T({8_oȺH{< I>4S4X5&5S"i][k ADDҗx 4/pbxnܓmӁeG%tz گԀhPHB|TjijexFV\M$lNΓ4Tg%i qm)erp(cDLLY)Z%rhq ]ݬ歶H5Q'ö]rnbӹ;+q:uQ8/0ʍ{"NӶfKuEJQS8t66߹iJq5-+$Bo_&{iٍ%a}Rz5 [ $[,iX\z[M-t.⧦=IۭбB %TiNC@'5rR֮j7]+qO8sSZkňˌ2q#(bE)P.TӮ=(SkԴ];`KQRLKKvZ11"iQTc@"3YKM7,v0KBi%wXH*U1CڻjLg r2GIDBК`wGJJ(n=RȘHD+e[GVVgMpe$T-(T#}FJ:y|i[Iֿ|BZMbeR kLit/+bzõlu>-ʭڒVfuOBi^B}pU$ttr45pI3Ol2x%[%>~O3>?#H ^ 7FH&9%7"{"A ~e-j5R֪ɱ05I^ Ox.a vnΓ}jZ֭zјjeW/]M+;>̳q-$֔.UG}i.^MMg% ڶ(pq$GdU=%KƮ M8Uq b8ex 9LeotڜfeuLU|]~4kH-V*]y PcMI yɽ-Y][J˭hMI0̽!יjG$^p lӨ@lxM.-DR-a6sɗY^(䓏cT*RF-L6-8)+"2*nveǝW9VTbbVN`L$zwEao\B5y KA i]yEP Xn4K<8Y }}K-2eٿz7ţ*YTܸCwF5.AŽ67cJTTʓGwOug mCgߚW !Ϻ 'eX[)+hN8IkZTr51W#ˮ0]TΨ5&$g9mm]nWR5O1ϷU?'%׹zi낞*5¨hP(B##p֫k\WWF16/T p壥&kei `T6Vϛ_9$u;"ZVvLxWkٳO6DA,9!1-0y4yAu.< a֬ Y :ЬoȞ~VoL븩G·wvBeUu<][.:v%*fU{`YC 5,éZi};DPxn [N\mT" q1l-/]7 1'&'^Q5ε k ]J'FŢݗ)%0$k FD{[(Rif{x칙X(3SjmS pmq)*jWVe7dG̵ncr͵mq9)PΙVT݋nN!*)K1tvB+<9ߓo'հ3y[V¦j[Z(`8fJ^l8Sp$Mc0`o'jO]՛?: ]'ȖH~*%dN> cF\E9-"eXCVȗqTN/F' kZ}-y+ULHޱ 6ʰ9Mcʩfc/>LۇΪ^j kaJ87 s#=<2SY;6j]+iӪZ\)r7o˚PeЂy$Ƚ/M%u+u;@3a6:H:Ǘ.[ uÖu.ZyAnDֱP79El_ک /6kM+lKM1)33*fﴡJ*1-UY̽p}xZrM]gyt9 p艩&\}U5.]5%^7l= ۛ)HK2y0't}BvY3*asvcf҂&˝^i2FeOva% w'.~VZ~bלP)m'R=;G¤da[Eמx! fcQ`M<@wX`\aY, MB7WĭsBj2'] Q('PIܕ$ qWm(irX2ȾLj,9/j&wtҹup[+Raf&CoB@]7 "S@n?mqhKM6l!/w6{^LjO<3Ev{#i%=w4>{J3|+&  T+;%}ȯ PJ>>">h-Y 8ZA99tzCGM!enA@I nJ!#R> de҅l9Ȕju鶥(!#%FܐwB%k&9,֛"ZRѺfePɺujKX|ƥ,Z@ jnrdkak$RD%-ko]=$bN8e&_A=0=G*rv`]+p~Ey&i$6}ÚO$W(퉝 $Бrne Mw0RU%UgSJ~ EpzM1Z÷PCSV}VYIJjP0gʘjY6 h~KeZB徯)dl'Yh۩Vt8fӼJQه"v}޼S|{<-1HJg9nT^a%9bfTV=hZB*#ik EN0=fYOjfpsSA5DU͋ڣL[M3O\h͹0-HgT. 4EdgJѶ]to훤py͆XpY4ȘJUW(i5~\> :bVfzrjRVWE,[gQ.VINjV#[[,I2Utb@1!n>tJM MzǦ,֧l9 9bC4 PyMXSd0Kڮ]TR9pڝ<;hh.M)+DaS /0B9%US!)-`Tyb^~pjoR?7 5 SyzNX5Zu)jH.+qP.TrO;jVM\! ٳ)mem(%dRBfm{Iɰ^aUhי Y3YKl'ң6+)raLpǮ38hpO.~wRb^)E[OG2_Ȫ nx/aIS2j/R|h>, K j "^`rKIMV[ukꝊV*zŹhU,eT*.*:+Է #sF9DkgБp"sV\/(rE<~]Bd|"k)*Y᭕^ B\4$a1Clî9\[rtYnJ:1xi4خ煸^ifYːTwcU gA1j9gj%o;RJRS>6jiva*PNX􅐧& c[2[Kj#ƻOOT3j$&%Q!{p9gO*biƋ..jGhiZRm ==RN4FVӖ1jXv\Lu pd6Ėst)D쳘$(#EtDۉ Ue.@&8]lY<]חe$vm n;i5wyQ)[*qҒMnPRyb͒n ZXL+ҫ72RB|at jo'8oNވT. (oI[I'eSsPSjip1fvzv2 H-tP! S @XOv.?G&MU\U}NyI&S8~Y- 2LD8T(g~}P\>ߑu=|1si{Oᴟ?|#J!Ϻ.|OrQx#_?6 ś櫴nOۺG,+akXQ%6PbUfm)ǤBd8%\ WVe_l }[j)P"tn$$mNGL* FŬګG)/4TՕT6*kv\yIR9͑0eylNLli;^Rm6PɻNi^kBs% G:$- aruؾ ݰͬit`5oiW^UULDYLL]|lax!5klyό5?.yB,[3hK鸠ndk\!^R>NA yҪ!*#ߓ\w/8zŘNfi UJF2fW<0wU7&qS\(Š@rW1,Zi ~t'4'qz1.Bj$=Ri*va])[+7ĉVeyb7$ECr.8Jn9‡/W-,eQXn gY(bKH^KR7Tںု]!I)+⭉w&C^ vm`bIm \& 6cAIŧ EU%hTDHJi wꦥ# (`ь+q˸-,{c'kg$Ɠ93cRn30Ѻ۷,Ia@eJ*N B_?OWξou??d~ȗr^kLݥɅv ?6;II\uQN{Hynaic @,y{yjR'y;"^`=):2VSyv߫# K|c땫zp*}H*II);88뗗t&)L5.VeRF!;iU ydٍ(wX=η3ofܱj_s4EąZQ^]4Kiv0엫ֽr&PBRa0*«,Y);Nƴ^C6w|tT*!*I/f).\TJy mQc|%:=KrânOZjM.ܵOlYvc%ǖO(\hB^t?&LrX&lk%W&ʇL(9̅˥Z[=0̐[AUi7DԜ|JM%CG<.~EC"5l8Lܾro@e30mqΉ x];5 _X;>umv]!唹|D:mVCx`}{P}CJuFvCWyfBkД#ifC&q $]3=!5m%\t0Zvg;-f\HRhሃli )Y7R:z0d#(չPq]=PBR. \Ţ P mF'Ȋ̯?Q,?>}! T\$fP51Q9q5_dZ(P 5 }f*bSG7K4ܡqryVZ9d7uǽEˡ3goguQ2nyV{~=!Z%~c@7'w0%]&t^Ssmr0 ߎط iw 7*q2Re&az‡+.ص-%mV9Gִɥ;)X(l"M@Kzd ZoU ^kH@SV垳xD%m֣* @:iK3ƜD _̚uXET^Ϣ Dq;/Hd^z ԕu^@UNBUkv*ոzT*T%u'#c) i fek "aj1d244PYǜvmy,N-,ێQ wZ0'f㮬a>]7_'(2>9|{AU@oώ|scZn3H꘨Ĥ,Jm>JvJL8l%w:4πSu-sR\YեU][['XQ3kY㍿6 wЊ@ aMxFtCVƗiZe䦞xr˘u*(a-}'bJji5SeD*'{*Qƽ<{KfZ#Djc/N.|8]ڮTV8EWYrB] AIfqխz+ 7b=eA=WL+V[উiN@*YV^}5KF7׏~GGvp&^Ahz4aڹzTVt]ka fp]G_@Q&HaR gM))8@)vk6ХTVJULh"*0]qeJQ0 sdʶu `RiHTw2.( ?8Gx'oYQR"dCk>{xXlDx8 daIg~u]̚ꆧ3 bj6>3nF26[5UzUͷ$v},!yo*n͓ M"E"뎣$cXv^EamYͷ,'I1PڿzY6N-o mqʐԦ֞LWU%[Ժ:wV^k[^ K?I;!nMZi %|}&0t{s։{M(j `4ŢTh]7s+Dba.J$`sMꌡ`l2H!)8֗M)QG%3)H1(L]U3N0]RJaT9wO'8F,2ͨV="?݄{a[|T|xv u:N7=d[$ֱ^&p?imaIl4#}f}ΫuIUV{>,u|]n@Nt0n:պuo8G!~RM~+LwH##0*z~Aܨ Y`9.X5Ip;bcL @ЅaZLj";Pn(m5q$10Eoyotk!W}UZjIrMu#=R܋JKcW6K.k%Gnh.w zc9QV㼈Ӫ.qgv\xl䴦w>[ {#º~m#3oMC?ӭ}ɴZ%SD'J™e\JZhaKqqB S(s Ό"9#VK[fPRe[!VOZUH%+ʗ=ae?,ycccc {<%WgϘ!/jjGf^HrUI cIھKLU'LaDD\NFd!7ă Ml ޚ lӜaґROWgGOd^]sgjBHyƌa>;P~ci|Q}0aqY *YE-{FzBۮ85 L!J '6n]p:Im$%g~[6ɒ~Җ)pWAYybhOKLhT4J)MTtZힰ(~vp4~d(c⏦?(a(ۉ޽m#?rf8QM[C֌̓ɮǬp.]\ȚbGmaSֻw$QvkT)5%*US-^RqcLG{s }nWTgjE Vp;ys`!;yJj$|QBELwylW.kJE꼖oqdU2N* #W:ߴFIbwmYBY+[3킉 )Z'u'glUquGegx5D{KL?Ma$ۊ׸yIs:n^Q{]z)/h˞b>*3fU) zriN]va0=GGuFYSmbԎP-Дj*G| 8UzG vrUzy+wx_sk{rd>60&Y ZRrg .6[-JWk*gG3rbJp6[fKO<j26ոoS!g45έ.!n$AD 0N9 ETw5n>mbŋ6˨{"AG|V{b~T`Њ+KpSUz H2lTEwJL]nn1dY%\<\Snl#(ilUmH1XMG6[CO#}qV= "쭨]x*ڹEE60Uꋳsh櫗ޜ"k=MU{c1 *Dwq00(V9=Q #^zhQ>H|LKgrhe0x޸S+Ԩn!՘;%+etMJ=mBe+Z%)/ "'ߵ~l1W#MIs._ZJ9qS5f 1&o7} K2m&&\R Qѷ3&mgѮ(޸S+ԨKĺэ9iVVdd\&@~Jj07mͤR*a.ZR(U> \|7Ͻꡟ>b<+!1AQaq 0@P`?!;jx?HqXtvL^sKgEoBu)6;~Ъ'RkSOY۷@9<}3}t}fخ4uq6d%ohEJՕz3{v>?•4ms7C&;N<9N<)Hע ڈcKY|]}%wa)pЁeҌg*CNdPZX,ś)QtϸPnib]w1J?{Is6]CIt$_J~\阘NFifخO_^=G;q_h^uIOgOHUmq/Ϝ b^xʯ^ֿ Sۿxu_xBUWϦ\y}$ᶌIҚCYum-|낝f}W+GjC?ӘB>oa *_z %5؏t?"xe<j KoBl=|NDe~O,_ qnٔ.0\Nlmot)[oEɥm% ?,x5H?Z-ȗF!@ӅF7e=@DN@a.QgK=/$ʱ^=6o"WHJǡlbfPf@yd\7s$|DԿ2mdt= [u)~STzK;Kk1lyîC:ՓM~즨-P rQJ. XLC) suv靑 1|x2Jɀ1cNf0_ŲJU芸t2g el S%f" j aRe2JLLC,B5!aʹŞ4tG<GBc a֡@ȼg _W1ѝO{T7(VF83TR䖬fWhLz SY 7X\̰ѝu;1$*is"ܰٛrTu3 93 X9]d@+C)/@b`@ǢL(\(Z_VSs0lrC< @5hk7٘];3G aEf 3[^g7yqixw165kv uK q O9'WB*+#J~R+؀tm[.u8g4oP+,Am ֍ʛ+^Cd˛mU9cg c}'@&̅-,Y+5eF_00^0NcۂS`S(7- ԏy/x =#Z]n, i=W܎\Ze?G{5mG܃z ϣ~ӁO?ɿ8r(B$;2JEEk wfօ֙u#GFib6ily<}KowĢ(; m*.`7BtZ*KK&PyC/*mJقG3㭕8%=HnX,aZKJM>[nĽJԸ gҍ, ˭Fnn1͆ x->qucitB R#/Q"Kf$0&#Q̉&'008YA`;m+]-QGWЭSW^Mbs/Ŀ>rogSե.AY-w uGx*J1+i+Ά\ƽf} W6 zsp*\r\ ٔ+z\^L-3ׅ `Y2R*r${3ɈmkAkw<ӺxR0}A<r%Fs…Sw.⦟9KoE6{`lcPzB U>-[P.~/^acn픢ٚl8ÒI >" e+lrޕ=$eE<#r_2 3JXzYA "Ks= Sy^j'~L11 Qbyűi× e&]ՎǨMf0 v6%8~Fe+La}sh^tEt%GFn~\ pj5"!2ȉ̓|]p3L-rrT&J{["-ڴLS r2Ĝ]@XʺG=u R+w8VRܸ3R!P 0'@|:cg\=QJTS AG=Qpp3gbEeSZ*8Bd 1PP E s@peĶs8 Sj[A494[O :ޙz_X =IpKITD0Vfls fuϽ6h/ *PFy&ry.1s@iLdňjRk/> XWm[eWE¬Q V QALA.O}XsϮC?;97v jExb,\tDa&av4}#e}G ;/uG `fdhCu&w=u:5uָ})_[bo3"/ɲ0,JP %u:K]#?+ IF6 Uyy8$U,n-n0H%K\xDp'<:q X#=O XRa+ScW4 e'"1~C> 9'8Z-7fab͔m1?T[]-z5)_@T`@m.V5l$`-`CG1dz'cF\҃/L=#iVYӆ@trk%[\rSPX%UCeT^ծv^ [CV[V(撡ĽJF<ӊvyG@T,:p"f٨ڀ0zc &a/ǃ΀mk`_q/Ge %8eRV tZtYW-=cq%W;/O:,591-Q@}.> D׻V2, ͌! ̳o˭/̜} |0xVT BҖ[ W 8I ^mrl4T6Sa #!99a#1` ҰK_d\9Bݹe0aZ`W!(H^Q_%=R#S<%43/ YY]:ǥ:h 8#ɵRTcG2FRu)Vˍ") '!G}0D${!u긶GRjPP?&,NamGevΔU ĸĺ83`jV1Q"PaK DTVYQKç7U +.SqJBAWX&jyN')yOЁl-StuX8gG ;uxfop>t+2+ҩg+[0*wnv]j?X%i|Ik:VXeZ嬐b!NF'2dJ#%#0۪LdhvoNu] ~,"ǠG *:'Nx-{1ZR)LJ`zoS*6~a{=p}>rͻЩ~(G;F| 4kߟxǣRPʼmgdCeJZ =fs5K3Fj,lDi&VR!|gyLO2ıUP3tZt,wu\Й_W!ɀXUFl4j, @`EuEՕ #(3%#cE1$ oB=fJhH⾒ wEQ Ue ,]X[W1}(la"z &1Y6"\>(ŷSX rV^(G8 nJ&[S izі+S٢p';mHd%',CBY!h:L း!c $Z`  F'6@nPSk~̬䶚y6m6?#YײRhh"a7RЭ+BӳAjxΰo}#$ٺgi= @lk5@&uCQ6A05C\*ګXLLAEe׈eK"S_ hBʗͬFר'8U `>oiC 3ҫQSgW{¹`'bV-l7eP)Pr`t8SwEjKY1l*W=iqzl^kL4JU|ʮ`uy;E  ]4)mJxꄂp-8`3̧pn|1:|AX!M7`}d`.65ʶonXiS!d sʂ؛"5EhUZ7 CȽkR&XxqXgS٢ͥ0+, C]8 aWOe🠚Kc4|?kv(߆bKXS[ObA+}4IA?۳rڂR@khɎg>Om=@ķ4 ېH/cqک$&_j^[qm]#Cd2`T[Lr"nj!5GaY![V08Bڴ_kk@S`Z8X^AҪYjrQ5v|i`^GC<){C0C̈rf(rT-^,NAKpUaB./|PRe\[acmMGo^L=;j?Eb̽]u)eN:7Kdfb֍626a~NaS&\U{x)T:t| Ŗ{bWEqNe@{fE cm-%6 ڀʃiӋ8](Z4*"egʹGaE+|Az =Ř nJg8_"bnz9[r} F/ tV]`~7ɶPVH_R개BЮkWY@`< rqq6jƫ"C6wZٍngJ&Oho1 "f:\zQ][~Sq *oV1ہ5L?9yPse!ra:ŕetP hWCu${Cb N  7b>jʦu."V^F3+`_ Y"e_Y1tsGmypx:]ξ9}F1AU8)tk~XUCs3$.i.LL7)]k$ ~pĴ0~pg]TFYDR놺EV{“F@Ibߏum3p5(kU`юKuh9؇gݑ VӓGY]= 00?29gR86ݗ4SuY(7(C;TeqޥB +$Ƽ;XUKmf >ӄPH[ 7yoSzoa"wXO">zi141'I̩xe׿Y71+br\$ZNa*< fx8#)˗\h Ng!5t21QFosEnjujȕZ^b3ymu8`Bީ9Lj)ӳiT*re${kɇBxmtkGvpAA)CPЌBj&SSmK  ^ rA  elkj xH**w\q:-1 F=Mܐ;D?O'٢\F gH.A{Aڙ(0WJF&=b Pk=خOsM"E) #s"8mJZ`;b׋ޭ\o~bQ T0"̎hmnn ^EUk<*=&V-+BﱉXe &pR|ߔuՍ};G}, q*oU=imچm|F1XnYg} ?2)en;LZhjZunJj-V1 )3~[`Xʵ^T~¹%(ND 99E{v4qttm+ƶ3gg±&yf0MA@tPQ6P;526LL|{AG1@nlq>k<#"1SUJFfL"}OLxñ}">OdOmNdZ%Kl; ~dYx8Px9_v;R7n4VEۼ+)Gd1Xlw/xU _Yھ{Mqov?q͗,/*vdx֗V..\^0\ɖP-',c9M3<(T^4=rR^C5 ̘޼{yS7E~}t 1 zF?S/3? (V)1rLfٽH:p^Iˍ1pM7I 4 h~Uh\J>%?*P. 1ll0p5Tv/lhi4v@4Go'=\ƌ5ڍaWAwk^CT:x:|DDžOr 81lsiHׇf)"&䐔ˢuo:$y@W=f|E&e T`\e +4bY%e9Lٵւ(Mnq-zwvuA܉$P-FCqQI^ƠuF ɫ` T:Wt4C+bwϱ 7/+"Y)Un bʡm3&`s=Ϯ }YgUV΄dJ]3F;,V`c*m U߯LaSJ%[)4UΝEL"uľPrd1Awx]m"Za\ ͉3 TVvRU9 @rSQb/v*hlߴ{yd| ̑-7H(5*. -<}ZAN̼xiԼu*̮=W{eJr\XL Q*m|'5D,%w|]%Ȥpjt1C~L:#R%Gwf/D6FF1V7B"lOx\Ep!Lb,rh ˮHڮM li5oqm~2-;}V雯0U1,k}x߭TwՂx,xL M|b\Ͽ &{6et@ḵ(²+ RN".Q-`rģ0cstܭjt^áݘՁdxud [ :0YY>W#*L rurnX'S[44`{gRypI yqe&bT6 Ckqt{4hr~g3E/8p4Nz /9_Jb oQ|7~5 q}eGks+>ѫ(HNO2NH"rA0,9zto* "D N_YV$|fN|]B5BiHt8?亗hN"-Bؗqc = ;G5*ٍ+8I{pӂ dº(pvj,VB.[E:ħJ/"D uvg0kقV.ǞQ2quB-4$;.>$9 |j* YN l)ڰ"[[Ls^a1yx9wKjqA @s iU,>; kA9B! 7Vոx4Mi LrCVnﬥ1B\5[K6ΔA4?qӯH?{Cz?*M_O[|K|K|N'ոHN@:^u}s5u}u];@@'ipK it0`=MwrCyWk>ϊ]<9h yh<v 4|8:![65(x*E2+X2m9B:q4bV=_D]g<șr 7\#G ˰>4apWEu"@1Psij9Tw+ )ϑK|@heٱJ.בm0 02%iY@muRZz.ז:CyZ a׋`+FeEzfvbUڹVN%TZݗcF-FUկ+0g&˜jXW!nT\SN4q=#0g nc.|& ]MU(w[=`6"\F 1E̥CɿwbuE`]WՊ)R:#]~Agqj|-Ʉ޻Zr,,#i9QM9r n7& 5=*\ Dj@VEZJ@&V#r-jUf `dRgC˛PPz<1[#!NM˭(<اZ'㇢ܮ+@fn8+ B\◚ia4b |BΤ*Un\h=)z.H9WY<55 0" HQ j^U3@e\[s^`x" ~MŐZF '#ZۈŴP-X@4ox[Cxz!'B7eMQEMYL/g1)^} #4Y3ۍ^WwJgCLP?^~&8nX3lo//=I;w3ehxP {Q3v]Yt_lUչmyW{äι4x4NJVF٣)隃 &N!v( 'j*yܴt%}=< ?ZA@8 l\j2V(-1t~L# /ĸtL-;ޙO;W}uu v\I)%I3}iֳ.Oֳ$,Wz^}%%Zz:-wJ|!o>^Du\^x||/s0+=]^huAzHC..EMq,WQh(mr=M]xanȥ@Sn=}VV]ujƫcsUVto)E \N]%ovKyixNB N;^&:>AZeڬ+e&{eGmJIT+RL.ۛs̶b 媱XM%Tn06v͎pRw csa/.VZMΡs3"u|8ݖ5"hv^&N8e"P. (d7-:VZku >q2ev'uۨos?ܤe\p5YPD7&2O_cDAtc>%NGxo86ۙ 5˥Q0p#X Ţ0Pl}jR)Eβ[] ֦BXg5Iz[1QN`Je 426y`mٌJT;iFG>/ RZ?)}?׭~ml~o=q}w̬ӏJ7ՠ.D&HФWW ͘\;DՇd,VaWyzWEӜuF I58)a>3T&4S Yt -yZ,QzEaAL wXzG &c`u"UagHGk AJ<MD\gx&}y8M9jA|]ssIEtNyyb X2¢apH#7&>)RY5|!g"3y,޳oAՇX~A^ƖKKNu-~a9:p;NlY?O(5lDc/MIَ-Oaҧ~/ѿ#+"`F!!Xv\ qQ90rdyZ2@W)uyW3 i퉲Pf0m2WsFlbnOYR{߄u]a it2^{U ]q#Rikn^~ZȪFz>ay@1d`os =؜#|lzDC'\ħ'}`؟;(¸uC*Xk4`7.%\íY/] Ob^Ň>Խ^\T/en¸)r*ebSsO|m6H {z^P? xx<<<"2I1)PG?n5sV ZP f<{v|^Y,Ã`bD^bbE|GkY7 **]J @7_S G#+@[sqwPrzUu@%=UW"jx!k\ff.&Z~fN,K˧h lQ )֙!`J Ez=0v:2x}UÂBG{fT: x:uhJMF19_^,OŇª9v9y#-pav}UUp \L]eb\lyبRU9E~37UdHB.32.㎭֜L[n\M1GWP|)o-FZ& g65;:b S9.lm֓2tF[0k̓w*Xk6#s:YՄGc;CW=7*Z͌ʃ/Ǵc(u4V˃z-p] -[tꍬ\]Pt{Y҆ve R֤;nw'/M!z![d\4*{9,VȂ3cAs"+r{75qbRj@1N^j; PljI˞ՑLKPe1h)X㢫|ܺ\1d|!S9h77 ]{]2YL+DwBg4LGL== G68ᇃ{l! ꪶ_;F()T(sxa.6lR6rqў*bPmhT9VA~@uea(G4/-pmx`b %++1 !PEۘԿ%]|#Hj-^зXZs`qt p[cm3Gu5ny73{:ğIfRo:%!eCJ&՛(f/ш۴u w5~2W@eh7 ۊ  4ZzBw{> >+16?"zSSS{WߩZPߏ"*ML29[`ݔSjƜneUVۆNG5y0d%rBԲ# 7,&Ϊ(+vJS ʌb+i;+<%~{6-#9swΥ\JۨSF]zPk6ZT+)u`˅Fs5$x*tj،Ls=†p*zeP).n7`'iY$7ZP,UZ ob1om:֡|WZ5f\Ai/֊KfL4LqԙK~ɓʇ=g Dk%N昚Y<'1rKB1G#`+A9mZ`pL`4\H G,x*XfhE%<S,{V핆d欿,?]˵xBM94fBX-Ma`'\qՈ&Tḫd7UMpdE!=t2B#UM2SjRQA| `g|lJ⍿%UNd%j,iEZs :B,1?L~џOiQ[KGuMʝS?S9^l7z~#Tlh˂*&OڞH%](7tuՃ4D#Fs- 9ŠC }H',FKs~ UP F@2L>1BU@y0Ffu?'P^emaZKrPZK!BVD%V~.: l ڥ~ށ}~X jtP:E櫺bS iOqA{HȍC_{=:7`6"$ "Ρ9n ByW,@¯qe>wwt@8^V'MG=a[;3 MވjvuAOMn=[/SyǫX!_E;3Xccw2L+dZ/yU'R:U4 —=4M[K3ÔtxĮ~upR؋Oa; 0[U` ˇq1Qˢᓙ]Z u3嗈-* (/I ݩJ* 1E23ä媨b4\`Rw("XVk`ĺpM#UHT(B6*5,;ȩrWgV_3'탥 ]ϴz\0f6"|Ǭf]#{; h QBxX~cAztZ*^r1Kb>® ȿ?{ZI/bw0;`xttT.3bޏV]s ?яnݭ?/K'U.}9,0>1 Cml0j&uN8jhZe6G QRX *ߚi|\gԻPPxdm˗W2YJ=NwVw*. c9[rn"\P\ࡽNC\Tjjjt贳 Y{P_ i6cz#-+YġlVو@ *' o\X;̈́pyb E.XRaYN3 Z)OlFvptXL0DxbX:T`&uL1տC bl5/Y\$SVP me4*=eHOӨxN+w:rgX){ Yjyb^ k{1EwD.^cciTl2@p,a4 s2&"69+ӫ U 'bj„T\W[J{Y4TV`Zi6D7 xʨr|kx/&!k4Lk`m2e\s< B;Gf4A.@ikLnMӓ-N߼ Yçiz%7|y 4>ݑLR'RFI&C =7+&օ. 49˂)su㔏ien^3-(KgZXjOp, +aG)A}S@12vjP֔w`YMv@_n.X 6G ub.H5E;#<8Og߰N\E}l7@z7{o12vt ~zG +a|`ܥxp8eˢFͳıH?4[i( xIV rAO ``ޯQ p[k3'7VSR CE4Ml9Zۿ</jZVLz, PA!$e`l5Y{Z/˧cqo]Q7Z iaFwka2RҪ3EmZ0Ř0$LE#3Uۈr@AEʫϊ5.⡅~Q"VO b8~ SԾkmNkJRz#sldp 3b*w7S!S9S`=f[xԣ䝜ʪsM<h,lyqjD`"fx0!,CT"=R QmWvnLa& 잙vg'}v],Mz>%z>%z>'oHF ce_ #o7 QfFzܝx(5?jzЏÍLsٶ::pˇC!j`iĴ;_X} c~RcD~\}B Kj@6$E $c݇GlKH" 61X06e kw T*Cd/+JpFlWQx+&hߋM'QaTjWlE4`FƗ Աl[E9[J3@ VgNRPwNtzlFDźP2lÞG y4 .h+,yť)5z,vPMDSAMaskۏ(= {'}nC}]0;Es_om ^6P6 3yV]-q}at A⸬Z)4 1J{rs'`qz7T5o-Ke oUaȮCke-]u n.|b1] Y`ۦ%%̈lZG}D-b{L[tS`n*Һ%-[(bֻB`O+5<rw|2ʙ j,2bqtGNp B2UI%/;[w]!k< ^jiff+銕R͐bb/B@질XBPwZ\sw@\髛=wWdc`(ZXD;jyisL x,ö|#`Qu]/pʳYY!6J%]Vj&;4vQK)!y/y] u's\m}u(3a@ ZŭZp&ԫvR.@i梤 7OG/azIY "JWEo8}!RVwIP?hfɑ-@{+}~s #BF L1Ŭe9bF}o9iJQ7R{ %/q-amF53{,d ( JYj|7 DT;Ó0Y 7ۛ-qڃk0tjlE3zkgŋEa >D-ǦJ[MlʱNtC88cD#do-:>j=Mɳr4XrnKBW5t2&5,d#ڳԸsN *t*qVT:U]c^nI+m5D]1N{CKبԮXdqЫ)nzA.L|+ମbx{GE[Z.l ΢X\:9R Vh՜Vq3 &,tDTu[[G-²JՃB9E>Me*NՕш-بHA"܏8c#yt)&ďn=R;KpC9c6&-r% s)m8}mhuTKx<ڦLaTF;>)* Ze }ߘ1*qF_ZOxf0xoǮ\u~Q'{Nl-c Z*8С%k?躦ԳA_V9ߔ_xs,]ؾ[|Fz2Xwq9(y/EuQnQxi u3V@ N_u=9Fm>q sn@xZٝ= *0v* )]ŴG)k:jezqATrƜ%yxkɭ?Jmocha$m^lUJYmJZk#S[=ؼgS$3]S|'M@EL8YO '@ 6,|J단FL ec&i8 N1eojg3>_ q|3<3k3EgYÊ>F+rkߤQ<74t+9u6.ҡ# =gֳL݊ŒvD̎n|=7#T2yXL"T9jVbaWTWTJC :rR֦Y{J5[MRH33y|EW-G@굉p10qL%=sSWe:9??5xnjx3N.=*['@2Ywb X+#eCa |[-ϧDרi;IUJwo|kȊ6#ͪX8,9?pW+P2p3|M|?2Um/9 E4̳TYooU}bN}%䄹(̼]ҴO|,x?0? څRV@-87Z545 r2so,b 6;!f<`$+DْV_3obt,tw3JHo-sǙޅTgǑݟMJE,x00vF;w{Vx+߫__p?q_3zFr ARDL` &tmk +m/:6!i)):{3g[;U}&Ff[rOkr])P.BVb\z-ENy(un(}EU? Do_FȬOe!o׈a~HR&W_+wXv~Yz"ZDZ J|pq2#ң+on;Mi2[•ɼb5ݫV ,ފb7ХKkM݊Sb>?O/sϵ T\YUq/Ga8w:ꂞg@ =>${l;QqZwVlEıdeA #j\$frÇHuW)ޒW2|fE74Įi\UZ ^yP{ƻaJxyS,ow/,AAeJU &p!sA_ϯS/yvtc<%$P1:M?ح""Op*}0kJaPdDуӨ=AE; vSkۈMV/}!ypϠ )N ˝>+v$γC(}K0{y{^is_Ei)tԎ܎d,`,kXmgqSyr{V,D\kWAIx ?znU]#եX(DtFO+ N>~7_@͗IW8?|~>l=&`}^QB2hF4X?tqP90|~m ~guPq/AMdcÕh\R!Qq)5tϓBqc2xjov?%`!\5cD-3Y]uqT+l|=ov2aPvO܃L\~u?>f|:q~Uΐ=ؼdأ*LxciKQ'QGG=>/vD;W{2=d]tIΠO_@?={z(^ Xyf;WYKSqMZv{ԇ+3aIϪE9OG5JM?f>oS7x'\8%%)_?"S.(x/Ϧ<,ö' `0 q!¬?+\ܝ<!4]gMg8wF˾~ U8g+y?y|RpL}Lo }=+8Cjħjhjq8FG׋R|؃Icݚ-u'[|!2ϸG Gt1kCosӡD/v&Ÿ ,oKtÄi_հhsBպg%C / WJS~B=h?o~c'6Ht4$3uq{Y-PZ=3w~s`?ZͪUj䌣 u  N H O J<x@ ?qˁM?h U0'< Q]x /Y"B8 ׾Gu'-]fnr0C(M!5߆1$6oEL ܗڤw(?jЋPO$ ˝НPcfP`li0BpDFr3mIX]"ߘW/ aAp#AnI8N 0UП]maS`Cy'hK:әV$_cM^ :AK~)ӟ=Jz&F@00;tp[XGli*;* S}+"B =X<=ְBK:0  NFC#n(O{4  <OezDZuC8K&G`+OrԌE3dВ \?if+,iK @Xz^-3$i,$`_5H]e .[SkЀOP`8} OMʳS< FW0~0NWY 0@N@@#Wx$ fv^sfd7#J }o{fu(@ ^Vb5^(apW ۀ I֥Rr? /0F1Ij茎G1L]@x Xռ]Y5k O80/o=3 Yc"|$BZ5x2@C8Hr"$ڶ~./vhxKE@<%O8D (*!1AQaq 0@p?fȂ$0 Js~(ߦ :5{'GޙO-TnԦἏtOWٽ!phZg>jz(T IbM7a]5'EaEf8EMPIt$ѻEYKOJ*HADtP'~* Cw1 R !E 'oOY,AHƐYnDqD1P(>_ѡޢmVR*\ V@%{(D擔Yex=S`H  6XiR]*ӥjE;-d"pژ@!(1bpa'%zxDS6@L]Px'_Dі1ӉӒJ*Ia#q!Ta&T$B.`z|n1 *㑾hx1e z&e'-_Lanz(L(k~קuHpLNBhE@vGbfl؛}(,GvRH-bƓ[bKnXqj; Õn@٠5|)%L& "ŽZW>l(y-l;Fғp + Z`kfm6a&/kH"ĺvlHDJr4"39U.H3^: &))0胝JBedvBKKi.\uh𑘜:+d]&Jp3}*f뱡 z҈|.0wmg5uTjZ-&tҟC߉5eyOwv40?t!HOGfKnntnUB ߦpT<0 jbaАE2&̉$D"D&4QJI(\B -:VoOzlE|üCӬMĀNle DNIzcmfԥ[nΛ[3jbzn{+1 9"PYox3 ."b I:RQJ57^_I W5=bwV3@u+r@"B{H&ivE &^ڌIfPou $DTYBAhR'JB&M'M]@@O N*zM1B nMJ ::hA|WBX4H{ժ4:N:97Bd*l)95XAQx=8ǷJ&+7\4Iwܟ=Y[&+ߊ q˱uAV){ Ç̎ޒA "Q?| i+)Vzj-9x0 VE#䆁$bu0Za ) WưC ^ KygJ l^97yĥF﫮0d ;ըHm<BonimMq(X/H'-NdB㨗;}EE2Il^!g{s#wnlC4Z-%aC "ox՞Rj,RURb!át~h  |+_M{^c٩`;n ё "@ˋ^%Kc:Sa XE5FY{ <^J]x7L}HdN\ԐlL>bF )K8bE(Hss@W^5A7_:b7\nha/P 8A$MHqN#@&#E&mt<>jQ(D46C}_FXK偆1fntS'hҙJ;R>'8N97a٨ "H# AǥQFG\:MT޴p=CaJ %/ܞPz%MNž? @NOc w`[cGQgމ>[`QK2&c@0MSXI7HuN;"NC;6Ҍv\0Bu"f Hސ8s:)6R`efN6}gȹ~kTG)r``5o}WS󟠋H~)Nڄ_i9zrIP'I@dž2S; tf|fB0b+ѻJG C :FR@J"W$,bԡR+iW<`Z .2 s>9-Jc Dfa F6#~g?Oj4Z[5ƒfZJ#Y I=oe7AK^ -Yk@2̯9Z7O\*t6M}$ZD*YҸj$fRI߭)zX;TyFR&D;4$5"Κ[.J6+y #%a P/ >Ǎsz6T@N1v~#SfS155&CAet`8q0;= ͏3CZzQvZ{` LHK.X=jƔ߶ӮԑKL Zs91Q~&o8z +NpcI)%aNh*L5F z3D"BH%lBm&O\=ʮn.TYEܷjq|~ =$4a.nm);N* oFvmqJHZwuiޏpmf?xw1ٞGEꝸ隿r4ksLwvvjA /ߤH_J!g6H/+a },y3 OMKZA K7J$*0(uB;uPuZgric6kXIMoe\R ń/9LFC*uDZ.``3`ٜ&TY7 jldk pRf\$q|E#VDae*TjVdeM9_98qN.Jj@4;46SMGw^ j<ޅIHt=d=ScsQN| `ѐ:ImE#un1qp;% QBy• AuNh؏"|Rs=Yw}12u: j3p-(tb%)=59;k5 6Y {_JrET]vp4'^u4 G[CI]vA埂H_uǥT!/J-ڑQ#i̩}kտhևdi\j! =} :[X_£Q#E`&X#ѭ/+7,)@! Y`YL L^.3$=ymc2 ("Muz^s8c(!ӏ:RI q C2"#itD/w*zgZ{s#jB<1r]Z$o<ߪ%5>Nr3m34XucQU6}(gx{DL'sSKf9Cb?e/?J#=KP ?2tOSr@@{Ƴf$$ "8vtك0NG 0-{Km]t dHl-RYɭ6yjCe>j5v+- yZ|2, w Eoɲ|~%3ζMH^w mҍ_4}6aBe{ĭh< ͓A2෗S Gw1ڝ$oaVkBÝ|$!D9Qeɨ!23PA:aGT`Pㅓ8-,OQCսu FVI/(V\#mH͓zr:~ײՃ>ZV7&ΧTMi4СQ9DV^)&H93+Yp5%+L' YJR2ۜ Daܽ߁}泜/y__YAdaPԾoYl&|E75A,C. en=i48 Q:UY[YDd4@P Zń-6\c#[0xpry#ABz栝X9s3ѭY&+жh_4$N qL{Fݢ@ntOjqV ,*-1, 2 ,+vMT`(̆?}G74??DZ:JT!̞[ \=BIG// 5R0$,1ą" ê6` P..)c{êT"7P,X IH'LV2՛G3BN2v@bZ*Q܉f{PHˮRTe<Θ*J0 Ddep A.36щCgil` HFj1ΤZ6/lQ&%IPٮ0]tvձE?H{+ie'wO$CR͚i@*ŇIl%rl1*"լ-sSZ -TH7oA0 (A <fFoBѕ%XAx)PWMRal0g(-!dKcQIaW8q$=ݺ0$eqA#̿T\ø:ҥ1gB&.S[ޓD!-|̦Œ^HXx7  DWWvܴAL,bvuW97($er ұE'fl\lnnPE@@- *$W vJ&&"swTҙl0A!,,-{QO@Y$"*`-ؕYk#w,\@. YFlDa#=^ H"[q{QŅlH$` -0V&!07eĐX$_dBmhEl3*(pe%bIdU%渀KC."(X*j"!&1 ` BT CGtr)KD[JHTLF!H%eCBp%`J7HJ|ȐGb@GG2q=~1P<ԐwB=HbD|Jk[,RB2B ZmOU$LD~H bX_hү$'mF(u .ձ DH"E~VY ܴ=I M/3lD*y8nj)GM~!b?C#VɝCVAt#*l -wxGmR $ؕɋmb*nZ.WORƆqr|x! ֝=j&L'f8 Y0?A]T GE9B:w(HGJқZC h* I=OmxFH/rթ;{U^GKZʩ UiMtjKO-xo򷚣~G,J3&Gr/ZG*9=R^%&jT {AG>G ȴ<8,Dݘ.p[PwG!VOq.h2v$ʑi(H^bn 5x,]Y #L1FTw$AbFc\6z{=*B-6{J~n&e/b>TĂ;Db7``: : .*ADK}%`j2K77REp)Z(cxMN'%~?~?6z%'MqwUT/ԡ:A Q"^<<4J!ebQg#SiHX@*Ƞ6{"]f]7љzk `A耄=cҐu75R!a~v hff 3Ohh[7B /9:1W!g)qAp*[,ƚ,7 !" K5\98HH1 ])@w`bEX \@KB&FP@&Chå=[F| jjTN3!'R5Iq#T:DGy{\VbN[ƶL: Lvj-4>xOZ)d٫Y;fs:Rp(ף/sQDv9-(~SV<>2K}u٢7^/R'<~Fڃ,YCQYX1uaxŻN Wz@xNocX/ L<:O]:4MnE& WnqړcMzL|oHseBՑOaOiiP}טA1#T3cU^x`t'$y)(.Q$xsL*ȅ,R+iVy;.I7X" 4xbD\C3PG!˷GFJCϥ[`ڋ <U ?T,-Ԩ+4nI>*mkM%;Tu#`! v iLD"̞wz|?uxQϝIeǪOHԟ8N^N]> a`ÖdCc]Q fW $Rᓢ4n&y v}jILwe8Mtr4 WóR65zʹɳZTggt$Y,Hޤ]l-S(e#%Ƒ*zETnvJoW}OY. 2Š\ʐSe{*H#N6VXc1 oyV0ZӬlQEV]Ȅ.C1NH!7-ƕ5cC"Gi3F`6~>Z &R`F'~77R*x9};ЍFg[ y')5$7d&MzPY8,0@DM"Ħ"H5's졐i`ƓmNZ_j? s_&Qh/蚏 |LSsSuLy.y(q0oFv``ZwuHELmЛ:eN]o|Ln7jkg3j@NNzH6ĉۊr #LsSISVWptGNj#@˿*#Fz3O͛X9E zfRbb+DuD;kz g V.Aw2^'u,E ;Z:5_֡"[7#^s6xK>8p 2n]\M *0XM$cV25"* ' W<ГXMu~"q >{:\pC~\'Vh11hA .ŞF#:gfxݐMUԼضW7[A_C)dv+b_"Fy2P:$޴ i;vBU.Ye{ŅK2Z!߇O6ͧIMX7cbG,X²A2 mw ACMDwz]{z??7%Wy'Ig/[MY|"[f2#nYiށqDFuxǍg ^uRK})7@.›`ډL#05"͓FB=Ltvܞi-ecV_n ,ߕ]0S듣m7uХ0Ǫ^ږ?H-LiۏjQ'( p7dL)/Bg~h xQRif-@d jG QܖTtq;%.oV+j`>wZeҬPLOdh2X*"Cs~V-'13DrbjY^FkӨظ* ;E_e.\(tCH/ynPL.dM{VԒ{%P!K#H@@`#gf{#!2au0'[Zh؂1 íJ7F{S9(pΜ]PCQT3ڧ#/ZcnDh!"ʉsoL*aG<8)=) P$uv 3Jp#5DbRg=ШKT:NT PԛQ\` MaG\Űݑ|mi8]W/1 xFԼNjeҥH8h  acW4Pz{DKǚX`νo$r\#WE\YAGR A.wB w9sn" H:CE:g⦾SӉI96K8>#of=Jp1^X>c<Σ,̠qef@\LPӘGx_#042g:[m376b BFA%1abX1!1,i Ɂ`t9Dfo3Q-cg*m<0׵5>gғe54Mo"w;k0\9d"\K*gާY֛)73-]HɈfFmaH29R9I Q~W`B~. 7 djH!23%o5Z!, 6%"EI l5^H2$)z) XtOCT~XsU*aS,_ӕrVKDR yޤh@|._WP& ]$0mJciq4@,=b/uc m3l,E怑s#!V菚}s>FQ{:,s`ߍF16LLLcǒ^˽_0 ZRPG hf36yDK*K^ h^[a_*:ѨPR$[֒wz0BU?­S+f5:STrGXqu=m**9Z@zMAoCH+tȡWIO.螯32ϐ[v 1rD wxCLӖJkH_zp۪Z$VQϟjy.trvkzO*]/Q|AxxoEQ]!9>S¤iz0K'$zαz\q}ʞ)|9 |?\Xm=_S:$8$w<9ׯxWg|K~ᇮj᧬j/ÎWRF9=/Eϓ8 r6}4і|+X-Ep?B@D{!>g[ |킉|~XƋ^0vJQ,}r  ΑC/ƏM ʉs_Qհ-?b~0p+$_|ްo]PrpD~';:3u񞅳|{<\gz/4Ξo?Ϋ ediIRS=&}t3}v.> _3ǒ?*`*f7g=#Y>:.}u/jO0jgQS+gfA;_Ysڸ>@C,a򊯀Ő-lNMx( _ *GȘӁx6'Ao dq=ǒO[hO5{A"O{Kp^ǯb{A2Í:( `Zɨ s+o`CT 4\8C1QqFKw~+]Q:Dp=!6#_|wːR6/ /:vIU(Bνת S1[P-+8H5z%RhO1񰃚NJ" =%7ԳG="0(ueaL- )*+!]eֱcĴ|`>1ۈ 猾_SX:etm͝g 9h CC)t'`kݧO Xp'e[ƥTqAhw`0Y cʁ @¤@IJF}.!Ɩ@3m;KT$ԗ|1B@ݸ E18=5~!OWXS+?ƳAc+`hPeZ]UP[o@&u 3uڮsf,X@y4G̜^5f%ԪC Nb7:b=4>Yx;S0,F$ awBj(=Պ'&K\:鷍LdÏ 90\@{f9k^r=헦I#= NȞA:]9z,L dB4^ 8]qd.H_.HB^8J+ OՈ܁O>}3r_4mH#_]~ݯ:'O/AZ}}GjpRȲq-OC֡fʓlV&yDLZQI\U|竄7l.E4& |#-j=Wf#wZs<>5T?Ufb 4f.YqcpBGyRG9]L,l~p3ݟ_V0<6S}aP]NuNܟM IJMH-lTI\#UFE`!J8PTMyy~Aw\XWWN"* omqmZ3bHǓiFB@T@5ʸ.t`M?dAN Upv8_] u˘5/ +XW`7 x;AlQ;4l";JeCq˷ LMo a(>\ɉ 4rr2 4`Bb@9YFo /[bJډhG7KX}5c/,N,k\tua!fyyÍg"1ѷg 7f(x񎒥PGo` @@/ ʹ}[άP*gĒ@!p+ӷƘQB_DèBŽc[~S#DY%BA}ԨIt p-mh8G;@k0APAb0_xH"ۢor8۲^͚I2cܻ .H 7f ԋST"q 8x% ('e*f;@QwlhVMb!L)!F2]2k#MgtP1[48zE4LN, c1Yb3oNYydi}'Nv@OƺwЕ6 &2&הE??uY"m3AK}JZ-Ȓ[o@V} w1D`%[O nUnUz>ݏZXv{r᝱;xޙqG`Q+PyC7 VP `TReo=+ otG^h@\iGKUvNJ@)tiGRw\ ڊ1PlC,@JqYءR*6vfE.Z0QNDC@B%f` z8``GO G""m؄k)5Q USbwU, #sGx K<<!pzS #XPq*1IJ"FKq"ƚ(=;0>XK ʙ] WpSxB7'0 J(' :bXR/q[GyLjkpfrLYub5J k lɡ2!,Zqre=qVb&'!3=a(\'CC&.`@G9 rqsӲ-+vc}Cʷ'O ~_O?s}^ߔɨ~M'M7 u2&1E?S55i\W)b(IbuuJ(k h`]8oNp@h8'R;혍Pc ӓt H$"*0@WXunZH$<ʀQHYXm1e Qj_P3q|oC2ѵp0&"ZT%#jgxOJE.V'+X+l"5Ԯj*3Q4>K{TP:.WoSD8rN3P*JSQYp1&9*6oa&4VC E+An&ObJk:*ѰW0RꨍZp=u[s$yA<`dMsƋ,8J/-_p_jߣN++w^r޿y_׸G~ E5.\WjGwA01#ǖNjxr5#9 [F=ar Sh  Nc1ľ2A:29Ws,N֎Xp_3F 1<K"^i @4j`Iu!BTHGn =)"2!em!WFUFmy. H:Cv&";?Ǽ[{ɅG`VLA@<#8%T\I$044c$ %8.Y&`AM1>tWMh ^PLaH jb4CIIٸ}g JÊ7p^83'I%pʻMC Qm-IQPeŋ.t^Γ4`طH^HhHal*DE2[bER X8tl@(TEX PjNBuQmhEzƥ(NPH:lI[c5TpM]R 0:.4S-5MbQ˲x$UHX_\z%"~1 4IInNG[@^e҈9#QLCYpr,D 2N01~I+'fv`E"zj;DtT)՝Ȱ@, ^-2[PߚemdN숑?"}Ԣ:Ԟ#>paŚs|`b 嬈Ύ\5&8ܴoJwCt.%_3wtG5=L6֚S?_?YI{6I#~OO ́IP>KUNI4*1zXHSbN%IZ-qKMմ$ԣ%kECI$Ӛ!R&"Rc4ڝ$7vnHSH#N?pjL T-Z_S!;%PIcK^!"MZ-s2uRPO%V0 A ӖKV,DWA,VH|RJ*Ƶ5L8DKULE* qT,hl[;:.Q:|1=RN]PBjBzAjwedMhIurPD @@Хp@,xj\ _8,һJۢ B1El@3 plar)x`Pr4K:Q̚Ȅф"^Ān^)b)o J)Izֈ"Z+JU :6{dGse&.>.з1$;1đ~50bwD]~kO?='{^}^ߵdkU|Njύ/%xgRE U[^q|owGbbN;ae`*c 3Rlɽ-0ոӠ8E` 1_ؤN"@݂H`Q (z,|ܛ$0HXu :Vᜌ&CKDҟ"m*(e\. D/$sȼAbrl̒ǬLQj_/u2{Vht\gd7e^oë=Hp*&qq7"RߊPBD`k 4<эL]HزMurS`ʪV@dT=#;rX䩎KwzD˪mT( Ow [(`D6M#ELyuDz]bЈ1!TX*1"4ĭ>%~H Z_uz' 1`*(DAz Y?? J㿒=Ѹ`" HTr  @&)/(Xv!i8C47kTvqlU!˘v]"eUV^uv*8ΚjCCb^\YX%/i WKN8o2Nw $-xW{G)g0G ,|û=x3n!4Iy **m#`^᭤b94>^ka a(lWB=MT_ [W7j8ahy @tBD!P@ _N-Tm 671X|OtB[FƠo?_{*8ARӃ'e"ܽYO8m~cšgVg%ВןfJTR@ ;aHm:*,G@d4S&On a<J`Uj"Wm@hC\f{;J) &lUЂmų#1&!QBM4^H/\'r"#U'~W$1Q@1 ո8sX߃V3Iq[& f! [RH9ar&ہ}oKđva^Ka&L*O 1Kq,2n@) Oo?N!ܵ=^؎B"-H2ɑRzO%8`R$h|@\"p~1ZB@NB`HDLY!H6px~VRE;})L Sf1G=0eH4R{.m >m%-AD{F'ӂ"lG7x$J<7J׻'v_^޷ q\|`Feڨn5\@h8v N_JJ=njX3(";C4K* 0LS{OF7 <x2@ĉ o]Fa"3Qhk ݝ+TB98MiV4LP G%^zM nyUWNx84mPL<8N܌MA0J5U Lg&V4^p ן9֪{ݞԍle9dw+ O(Aa!m-+ʙ..A## KMNbs95e]4"ɜ/xB6chS_&j6 B>J<[]\QOxfO  &`&T39}jBZ X.%xрR)ay<m0̀DM~~ˈX!Z {CMc^pm *)H+pNY=[.+<y B`hD?vn9݅Mh=~󥾲cE~[b0tP>Df9Y8>mv I *T@9MJѸ/# 2hyo{O%Q(hBjq61AGPT-~qHyX@Z)a74LV`B+M؈ +vM Z8v+,@  Shc!팈'N'X2Z`;9_tw0)(ql 1Dv$UQ: $W;3&o8{Ib4Ƥ|8!EpT.L_q8]eb:g*8+x ^| Pr1fԂ6.>C9?/7=T?'!~) .9!VG=k~<M6VFc K',XQF?g,BC'$*„G8&FZ1mw!L,m`1)6xKm5CP8\.60W n31R In@uaD$t$SBlM/Da]0H)ko&S!#CёL _xuRE*A3jamDT5tꍭ J TP ,uT %4(\;PzG+" gxΌ67!F8TЭ.vӒa$V| 0 F-XX5mf.r31rWd`,t@ ]Ax_%%aģ)n8dO/9^5=cFBQ '11N/R8?ץI ^3?05>OO7 YγnlHӲ=m@4\1D/A.hb;!!W)v2В": ,ɺlJ{gG3lpǖQQFEF̺X>ƌw!"./Rj'\(&:|H\ L,XB]Ur1 ^8Z ks"QS2xch#4k SpN|4\OWZJ"(-EӁ`m D#JًvxS@%/<6w='oJf: p?3|.CEP 5ƌ;!?/Hȡ|a~PDw9fhq'QntTx&("UK@8:z+]ƒ Q(MCZnJ>yG8'FSԻb%jFPU Ud6ppQ5 [cTr (␪59 v^ i T(+34r ; IhT'B\qA&Wwx($^(@$0X6jDi` OCuT!to ދ 4QPlyƃ/$3 Ѵꆄ&8yypXC,H6Nn](#R83jÚR6 dʀ0f׷F{~ &။'Y0 G ;5)g^B !9aV?LX~#>9F ϟ'ݓ\, T ( JLbxϛ AP+3NJUT E~c"owF ګrNap8k*-"NToPnݤB` wp؊ޘyy?iA=( isU 8iqi Dx_U#@ ]V b(! KlR3#=ac 8Q'h+CC88JAٸd )vqߡ ESVqBaw>?_ǤǤW =fRAQuS6>_G_x&$5h:Eۅ7"]Et*𠠆0ٱT{;C# 0B^3μ t\ 6`= -CcaqyD)T6(\Đ 8j^D# UVp3jUtEK DhdHNŵ0HܘP]"JB J9in1riQV.wqHV;3ziW SdrDG?\yDb 4ch *C)H";Kq 5wP@B $y%86$ ak8%@ N,'"BH4DcULTtc +"&*"qTU 3wBX _tʰ9b%d*f@>b:0reA#Wz? .@$_9}.8|[vys@%ļtb }p&c 7#TN8oR1$W4"2@,N"YT0UmE $4_e e(1N3[IPp+FZX);`dAK h tُ{@@Bm; E ZI93/JqM: ݟk m1STx93XUE FB^(1:q\6g\d?ULU}|,P@@ o"Kz2XFKqD[l^1FMQK$0jjW|?Ɂ0)ၣtύ Qά ^PwPbxhM/GDZ%_=|mczOi^+ii4")y'4H#`(\늷_BeaQ{pn9Y9=rM mAG*ECF#  Xv#f=v41E9!Al|L>9:4}-.UŠIiEu 復FH9e#xz1Dȝe?>9".5b#X WQ9h_P(M˃4RVuXz4Hp!'1i(6.Ҕ̤4<8څ6=${R 49: Z($(F"an>ӀcKĪOuЫ %5db|7JV, KKC2ÝJT$>qy`^C3{L`vf %;T8U6`Z'm1~Y 8HߦT B+}pÈuZ8 |4]k#k%6_xWߥnTHdQ?0Uqd:)K t l>ȵ ›YGʗh&>& Ц6j0R ։-[F1m/3uٺuA!ӝYFU>Bb5^"Cw`<FP4"i @u:hP+@8Sz43Vː]SF("0u\I떋?EohxR&A)4cB́(Q 8А(RJ'īBaMR0<8[[aИ^Z1qgFCNoXyX _~Z>_&B }hKhMWE#`b<9O"hȓ{4]Yay' v8&؛h (_Ds ba8gdgkY15fGD8dȈ(ly}Bw|5P5:IT*q?Z$hW"\ݫUN56.LjІ b&0#CJ6ǃ#Td܆Yib@Aau9`k%sZ=6(qǐhx:h g1Lm.F"P\'kNz0юPDDž'!h}hSſIB4q 2*  t1G Aڝ3ԬL )fOp XpqXJ .\bL̆ ӺCx'VEkc!"=c.{ wS, SkL`V4RGV3DVZ(#oIATfm]=J) dKM* e$ВAv6jЉd XYLI2Εjngt]OТԵ˪,R+pG-SUUq<~~߯DO F''}'=ݎȕ,fJ PH)·t- PH=hae_?D1Qr`X@GʅӬuҰS6zL*|Ѱw3",PIeRi& 9I[LA`],`vlFd lDb`A juO9e.F 0" j:iTRPqfYi'd o p' `\W[ `0A0 >m~M#YE:!F gSN(&4I҃HpC`c@M0Z(dHWzIW "8I~CUPHPrl/ yujUV-s4;\*$ (R(85 ۜmX6* ɥ)h^5`Y&e@1`way|#4gʅUjSҫ`at^Pa @6 `QPlT-\~Duu؆B~ˎy'v~(CqvbX2P+-+h]XVz hЩQ=T+Cp>j34k;4X>~1䱻,#0K K9c90Pאhk\AxVjQ>qHb,Qmji +Ts1aS!IJt[n+A_-# `Ǘ%hU&["9ZJl]hYʚqq>5jܵx7- C| M$ajF t`\oF "SWha&mK=vv"`AQUTH-"q;=E2<$6A1ALoASc4VjnM޼ɋ'mv L 3ro 劋p̚J(]QED{%(z%>*.1>bTUU⭉!,s#sGEla.? }fEe`r~nB"BbvA?+H z" u~Fc緈*s ŝXtqe۶7o}~&zDy˱Nq]"FD.^w< q RX£2on"dtƹ6U0 ׊Cw芐mKnir7P%yD%ⳊPȳ%[FBlx]7 (@rZ(Mg5+c'0+Ur G߷KVZjxVk@8(u#uH>T:.b, S;Ppo4\M<t J.W4Ј*0B ղP9+<"%ĭ˔UF_vu=YśPԓ6aBCpK28$6€;yd#Qc:"0v(Fey|Td' FUܓ 6_ "Jf*Q[ +@Ut.b#UA6cL08y,lD߆o[¥& WW`Y”Z~<8@| ƀ, °"a$cpv5ff'@D-FԚ 0PwE C$Wn*f6Q"TvX+[HXWzb @$IL,D* )5Wxo/SvUMD *w9Ըpq &8v>; b,HͰ޼տ^6ɠHSFo<E'oMD}ݨN/ K!C>)6΃c ](el,HLF*ZdF!rLCOUW@%y8!=HI@ؒVjϮq(&NlFUl% "M ܟ5u8L،EKn9˭ER %)p*ţ9w9V"HqWk>4m+p"1Jh'O4uB:h?qًI̲gy‚qe^NɩL0N^1a0м!tijnqFbAzB^;o^ˌZGQ#1R7{]8(s-f0 m+-n[u֬M`T32ě$m0-vyĨr%lqڿO·鲅؜7l hML$wh?ZM-=N:ᩣAxo rZ?c}힋l_sf<~_И~#qыH}ʼnbS_ҩ@D sbcDEN j2.*&BQ("'K:p0V$M'fpEPq{Z%3DvrQ1eBwQS"*p M\W 0GWSP,uR?p$xc5ΊDLCʧA1]mhq-E'AI hNue^oЦ43 #ZJSfFAz<a{gk4@](kwԒ[.@TK ƞ+ȕ-EmJ(Y"t>ub+腊92Q 8%׌}~BLBf07DT/' |wBLӠ 3Lu@o "*m0aO'Tw|/???.x_'4Ji M "W׊gxvxS@%/<6w^@oO՗}63X48W(_@y_s;?@UB#p@wPtlJ_({ERBٺ y8i<16-qQbIY%X9n@Dk]" VTE73z HN1ф **z@*p`ʘ4 L@"e:0]ן<r=r@}E萡Р./%9TlcțIB !z.'{AP2k\=Cl>1ήRXqN1Ws,iZNLIa=\TUyɏ`%QqR#v\dh*KyI$(h8QC`ty.؀poXБ&gLb $4\5|U#5wz#(Cuuh;Q(D #n2?|7J=zx1_=|r Lf$f>M;R^W ._|8mͰpʲ\Tl4HhJ`J!(4O5<ة(x=oqLl- xa"=(zvbp MҵD<)r/MCL]5B^V @=_|02u`i%D)}Y4P;h kz5$cιB ;cB]#Szt4h H/B}rJH"XK\Q ɼJ^(BM*01ې趋J=t/.k%3[RC)w@5+%B4%6/@tNUQ Ʊ>]!],=p xcQ;yGyCDiBi$hb 0k\WM#3Z7-IdD$邂9 Dncv`aAd dwCs0`ґ0F+3RirADrRXGNѨ̃?"T`3|H6C@`b`7 bQDOD 5@b meo{ZxA[V3?y?s?s@|8?#Ǵ|Ss_82ZԏBU8"MֈJ!il6XM)b{AvA/xE!ˏHb#30*E.pJ*M`S<.`^PNWN+ <2`--'PܬLa}Xv6 JzP (VN fK([Іlj9i ?",%,gӃ^^rD~'ЙO^/SX9=EСtpzf}뵠2j4Whp%qA@L $.W@0`n/-Ax5}lm B8X^0 (`v?!Vjr,Mviw\) JG DtM<#)cyƞ?nfGSNV@9xǨDB#cw1YDi,~=-~6idfFlĹk.A- ,TWQZY,[Io`X/T=IEjAhBC ȗAlctYL E re^Fkhf\ Q)h$ȈDZ.eD&/aM8C49dbIp5{X -(*حWs(jΛi` ,.^3&(x0UaP%Hb4xr"ohKJH((2V/P!1ޒ RH*eNkg@kk:I =WM1-B \S)h_W d,A)o,A* DPYDˑvňό^qe!VHr6p!c2i Db n X6 a0q r2ģPa 0؉DeOsKEEoP~^&c0C[ ;|Hp8՚;ugFfvH h Q%o&+>(V0xjb/GA U`'2V1zP2*'4{u ae%#\! @G:l% ƦBf`[`]0&^F=ߜg W@80aA=)$ȅ>Vm*3Ug?M9AഃD5;Ĩ"QhRS N\zֲPjAoY'acJP=q :3hnPxGq/ ]D=ȿZ<cџe>0*-+FH`@ _^*4tHlI!{ 7P#4`!Uf<LzX3TߑH6ZDLtxC+ rh; = m:> -6b b6d"\\g #-ˆ81+1If" !bCA0nܥ/xnRRY;1(Gf'`54D`t=:2Ac-j[`ٍδQ}% XeαB%8\.T:Ar&TMԶs~SH ҃*=j{wZŤia& 4.!hz0"#9J##=zocÝ rHcm2H.W#(HkP M޳2PR,Tk8&ԩ0 k8*͟^lz:OYw*N }!کMy3U@ s[|g177xPc{bb<\FZ߁z*rQ"I[pC@#q%m-?T~Ǯ%XYH{|}#~F9 #RF@:E14=3"[2O+u}pv=Ӛ/}x2{R%n@\Te 3^ (ܘʑlZk#P"09uZ i5UOإWCQ0$Nؤ0z*bn yW¬(9 Eٱq`0*$`vѰ)F5qWB J[7lޠ,lTxR ([rX6@ehN*t7#yFu'zsl=`3 93X 36N\N<T`4 7^rU/{*ᆷxYQʑ2!SrǦ1p( x1 ^/&1ه SO.E@QVc" $3bzXOa*&Vz)1*4Cgۋ~?se?xu?l@|bp㣍f6g~jlZ\yp3ޠ> ZI(n8Vji3$ ռѱbdR 9&@E714QH0U|3aa۰{ +v0;`q/>[K @sw;%m;d!H`ģ:ZRa yips&]PP[ hl@S `u @,ǎbZ7buhӷD>(o4z ࠪAtp.Aܙʢhy; T]8O: `K_ԆX")kQ Z(o݄ZО3B.ݠJR ٚP!<5P^㨣Q0@XjB-wsUU XiBem7ݦ-h,Zf#.И"1h>1zFt LT \ 0yhs:*?}ߧQ'SӺb.a;\n")){H*3R|ss?sXoNퟳ~`<)$]4h b_XT?t|>0`) 8Fj=5 W(PXa؂2F)CP6P>#&dqD$:&h[r*Zfo ̀ZDȭ3з-ZSB4Ea@yXRی(PXߌs5! pȂ!v L9dC{hڣ(ބZde85l@^tKҮCmxa4u,(+ܻ\` L/AڿyT `ƓGb=FP,/r&@܄7풗QPutShQ8eU rFM᧊i!U :5 HQ4,[Ӗ+RM=Qd {DJSU#.MZ˪ZFf%T. 2 ݯ{Z.ێN( ۂǜcXT;b,(iWӡ=$}l_/?# =@~ =DBv)lulA]qS뎍leG ,̥^׶o RHqRqvshyt-Ll-34,&\#5}NBm`Zv(`쥨\?lhQj>2>{1K<rjL$P ! ZLN+[vuDuTcjQ Lb - )ѠҤa2gXK4*?iBb=`xAtţH!_8YB{@`G U(IK90K;ک0Q+`M󯊵kG{ҷ*qGi+7@Z笌 jpbߊNp<7%CHх\r ׉賡HQ9b6age051ǮMNthQe q( {|pN/7xa?Oa܄QD(B^;$+JW@+$r )w(pv9$TqM*ÈT8ģ#C _\a="xSK PQhdyf,%K5 @wD&9 @E:1ILH$Nm9o)P"Ln;rʥI3^ch }F,o @a[ty\z8eʑ4lC#r#﵎9N(#.VX"|e7~(4$[K XAW[q#M&>( LPfi,5uW8Kּ1H!APqƓ B"y sr<;@)pS\;0zP]ZՓzLBm {lhgp=O| yI(26BBp w A" ,=`8uo;&xnb0eLH@1PET46w ´ @Bpi5L!ɿ7C^r{<^/'y +IDX%WլΕcD[ k+`*;Ic9?/o~crOh'Ƶ>ܾx&Z LeWe'Pf;~+WldNG$Rl>1Uuқoj%..t?Lp+:rZc X9@zUHw)è7m)BqBa1xBO?_zk8b@WFѣ htV[e 845b9t^O0z yԨK*kX)b3Y70 "}ŧPbXtup3SԃyuL[w* 6X=R"d"/Y(br{ޱj=^1;`R8a8Vw*7X"F, @/ߖ_"ޠ^Ɩn+e>t>z<_/<Q?sVIZtcV ߛԥ)7Ό8diÅwpErX~wZV;9=D @4Ӽ(4Gh-)/lEUH-V"PEf//k$-Dqԭr qY`y|!UZ'OcQr*懑++Q#ZD *ph %0C涉.y, [`WbTW|G*u ;H.c=;c"\ EeQ 9\O8p3 eD=/.uKuur=[ 3X@j߫Osp8/wX +r񏪗Ab9[]:`6]n! eh1f/yu ̏N鼽mGh) 'X:H KOcΨL1XB`,Fo4M *u\\We2%m>?yϻs 8?HlhB$Xc@.MT` rco:8p #hx rB˃lc{]8\.5`kN1.b%v{@d4cgxm s 9㖧VQ= |9D"s?,s"$Q:{ByÑ[,9`rb}.I 'rTLty,Mm 0Ro '-= yQr*~ ///p~g&滺q5v P_?X5j6 ")1]=dىO>?onzsVz!J< w[1dXfT:tu"kr/"OB0bA*o-@$ i V)-I  +&L T~~˶-YUXZ=zj메jdcʛ&rGwk u]r|'MIo 3daל3 HCKDͰ&D1];cUFstE_$}D. 1#K_l*6}?h4{p{)#Oi)qY\#,A&& qNBWڡc@J-n$m=0θ#O _`\tDA:~Oq광lP A wm%I %Ek urA~@4BSv@wL"쩊n1a I7o)4LR:G{tN5yc3T`tYo@~V+?~ bzzV̌4Ѵɦlc 4L X J:U#,Oܰn֯Jhޮ{JtjP9/uE!gbC!xLJ~ #Ȋ#.1zYZ1 -ߩy飊oގq`]OT`ăSbzk][> SETߎ"&6]*Hń5ȲIZĠhs2 T/ k` #?M|C.\t`s>q􀫾`a@WD]#75-Ts QyV:`n wg\V;ػŒ&T =/olvA1ҩB$Ũyf%+MxS!`S1H}4jӬI OBa aYC ՚EΨlr~0TR %FʋD[tiv [CKN|Pz8؈i#Dܬ':Rng<^o'>0J MRo8iWO _zq{9k9/qCS<9>Ŧ#Dxp8c>DyfK'DyG~1/Xy!(N{)Zn#C $QX*V+q g 0h1a9>Izuu?.y4,GfW)Q"P3$!XZt^j\[Ni?63U'6QS숧Ds^t>VxZ**k{]!4g1ǡ\4RB:Ԝ!8>cAݟCԏ-vGy7/xuĻaO:jGø@P| ׿\y>X8{W犻y9xxN.Q擭 ᫇H9\OA:Baq\Y;y$K6?kN aƊojOS.& 0vǩ NX`%1!E 2QIpaPpKTr)4'a /bزbWx=mDUOP}rB;'>a *Rr  DT죻]:mf奺C"8>6&oo8@7wp[r~ yCôЪqGw_L?d2ϗIKG7=Y ƭg!-ϑQpaRI4}B _JL@g3R~~pJ->6Cu?{1@WJ94FTdG( Cl"ڨt y K@qBHArrOe1RMi=A|?˟`w,y]hQl\.wy>ˮIs>b}yr?򓹜\WWfanVkg'#L)G|ozz??d?|/FYv%K1f1pYvV|!9~PF9.} {*"Ca ե1clg90UAbv9{ăooN?hK-;T?G]L((kGUU`#jv*C0NICiUWjX'wQ\245xr={+>3#Uw%ԄgHRQtzNs"Re;6n ͖CGxEwƙ| DRPvOHnN7+* +8Q:}/PG,6gX!xC]+Ԭse1BWtr"c/Ngqo?'?W*j$8fq>O@M[A''+H/Q[Tz1t7VXgϾs{pP~hz" $ &8x߮pF=ng%Fi{;yȬ8Z+ Or<|GGR{8vG;եSM>t"!°vjݞLQ'򠎝z|iJ`_>ㅺʨJ{M&tDC_`A"Uc۞k=hHmayavi-4.5.0/docs/source/mayavi/example_heart.rst0000644000076500000240000001306612747716313022521 0ustar prabhustaff00000000000000 Loading scalar data: the ``heart.vtk`` example ----------------------------------------------- This section describes a simple example with the ``heart.vtk`` file. This is a simple volume of 3D data (32 x 32 x 12 points) with scalars at each point (the points are equally spaced). The data is a structured dataset (an `ImageData` in fact), we'll read more about these later but you can think of it as a cube of points regularly spaced with some scalar data associated with each point. The data apparently represents a CT scan of a heart. I have no idea whose heart! The file is a readable text file, look at it in a text editor if you'd like to. 1. With ``mayavi2`` started, we start by opening the data file. Go to the `File->Load data->Open file` menu item and then in the file dialog, navigate to the directory that contains the sample data. There select the ``heart.vtk`` file. Once you choose the data, you will see a new node on the Mayavi tree view on the left that says `VTK file (heart.vtk)`. Note that you **will not** see anything visualized on the TVTK scene yet. 2. To see an outline (a box) of the data, navigate to the `Visualize->Modules` menu item and select the `Outline` module. You will immediately see a white box on the TVTK scene. You should also see two new nodes on the tree view, one called `Colors and legends` and one underneath that called `Outline`. 3. You can change properties of the outline displayed by clicking on the `Outline` node on the left. This will create an object editor window on left bottom of the window (the object editor tab) below the tree view. Play with the settings here and look at the results. If you double-click a node on the tree view it will pop up an editor dialog rather than show it in the embedded object editor. Note that in general, the editor window for a `Module` will have a section for the `Actor`, one for the `Mapper` and one for `Property`. These refer to TVTK/VTK terminology. You may think of Properties as those related to the color, representation (surface, wireframe, etc.), line size etc. Things grouped under `Actor` are related to the object that is rendered on screen and typically the editor will let you toggle its visibility. In VTK parlance, the word `Mapper` refers to an object that converts the data to graphics primitives. Properties related to it will be grouped under the `Mapper` head. 4. To interact with the TVTK scene window, look at the section on :ref:`interaction-with-the-scene` for more details. Experiment with these options till you are comfortable. 5. Now, with the Outline node selected, create an iso-surface by selecting the `Visualize->Modules->IsoSurface` menu item. You will see a new `IsoSurface` node on the left and an iso-contour of the scalar data on the scene. The iso-surface is colored as per the particular iso-value chosen. Experiment with the settings of this module. 6. To produce meaningful visualizations you need to know what each color represents. To display this legend on the scene, click on the `Colors and legends` node on the tree view and on the object editor activate the `Show scalar bar` check-box. This will show you a legend on the TVTK scene. The legend can be moved around on the scene by clicking on it and dragging on it. It can also be resized by clicking and dragging on its edges. You can change the nature of the color-mapping by choosing various options on the object editor. 7. Create a simple "grid plane" to obtain an idea of the actual points on the grid. This can be done using the `GridPlane` module, and created via the `Visualize->Modules->GridPlane` menu item. 8. You can delete a particular module by right clicking on it and choosing delete. Try this on the `GridPlane` module. Try the other right click menu options as well. 9. Experiment with the `ContourGridPlane` module and also the `ScalarCutPlane` module a little. The `ScalarCutPlane` module features a very powerful feature called *3D widgets*. On the TVTK scene window you will see a cut plane that slices through your data showing you colors representing your data. This cut plane will have a red outline and an arrow sticking out of it. You can click directly on the cut plane and move it by dragging it. Click on the arrow head to rotate the plane. You can also reset its position by using the editor window for the scalar cut plane. 10. You can save the visualization to an image produced by clicking on the little save icon on the TVTK scene or via any of the options on the `File->Save Scene As` menu. You should have a visualization that looks something like the one shown below. .. image:: images/heart.jpg :alt: Sample visualization of the ``heart.vtk`` dataset. The nice thing about mayavi is that although in this case all of the above was done using the user interface, all of it can be done using pure Python scripts as well. More details on this are available in the :ref:`simple-scripting-with-mlab` section (see also :ref:`advanced-scripting-with-mayavi` for a more in-depth coverage). Opening data files and starting up modules can also be done from the command line. For example we could simply have done:: $ mayavi2 -d /path/to/heart.vtk -m Outline -m IsoSurface \ > -m GridPlane -m ScalarCutPlane More details are available in the :ref:`command-line-arguments` section. mayavi-4.5.0/docs/source/mayavi/example_parametric_surface.rst0000644000076500000240000001133512747716313025252 0ustar prabhustaff00000000000000.. _parametric_surfaces_example: Parametric surfaces: a simple introduction to visualization ------------------------------------------------------------ Parametric surfaces are particularly handy if you are unable to find any data to play with right away. Parametric surfaces are surfaces parametrized typically by 2 variables, u and v. VTK has a bunch of classes that let users explore Parametric surfaces. This functionality is also available in Mayavi. The data is a 2D surface embedded in 3D. Scalar data is also available on the surface. More details on parametric surfaces in VTK may be obtained from Andrew Maclean's `Parametric Surfaces`_ document. 1. After starting mayavi2, create a simple Parametric surface source by selecting `File->Load data->Create Parametric Surface source`. Once you create the data, you will see a new node on the Mayavi tree view on the left that says `ParametricSurface`. Note that you **will not** see anything visualized on the TVTK scene yet. You can modify the nature of the parametric surface by clicking on the node for the `ParametricSurface` source object. 2. To see an outline (a box) of the data, navigate to the `Visualize->Modules` menu item and select the `Outline` module. You can also right-click on the `ParametricSurface` node to bring up a context menu and select `Add Module->Surface`. You will immediately see a wireframe cube on the TVTK scene. You should also see two new nodes on the tree view, one called `Colors and legends` and one underneath that called `Outline`. 3. You can change properties of the outline displayed by clicking on the `Outline` node on the left. This will create an object editor window on left bottom of the window (the object editor tab) below the tree view. Play with the settings here and look at the results. For example, to change the color of the outline box modify the value in the color field. If you double-click a node on the left it will pop up an editor dialog rather than show it in the embedded object editor. 4. To navigate the scene look at the section on :ref:`interaction-with-the-scene` section for more details. Experiment with these. 5. To view the actual surface create a `Surface` module by selecting `Visualize->Modules->Surface`. You can show contours of the scalar data on this surface by clicking on the `Surface` node on the left and switching on the `Enable contours` check-box. 6. To view the color legend (used to map scalar values to colors), click on the `Modules` node on the tree view. Then, on the 'Scalar LUT' tab, activate the `Show scalar bar` check-box. This will show you a legend on the TVTK scene. The legend can be moved around on the scene by clicking on it and dragging it. It can also be resized by clicking and dragging on its edges. You can change the nature of the color-mapping by choosing among different lookup tables on the object editor. 7. You can add as many modules as you like. Not all modules make sense for all data. Mayavi does not yet grey out (or disable) menu items and options if they are invalid for the particular data chosen. This will be implemented in the future. However making a mistake should not in general be disastrous, so go ahead and experiment. 8. You may add as many data sources as you like. It is possible to view two different parametric surfaces on the same scene by selecting the scene node and then loading another parametric surface source. Whether this makes sense or not is up to the user. You may also create as many scenes you want to and view anything in those. You can cut/paste/copy sources and modules between any nodes on the tree view using the right click options. 9. To delete the `Outline` module say, right click on the `Outline` node and select the Delete option. You may also want to experiment with the other options. 10. You can save the rendered visualization to a variety of file formats using the `File->Save Scene As` menu. 11. The visualization may itself be saved out to a file via the `File->Save Visualization` menu and reloaded using the `Load visualization` menu. Shown below is example visualization made using the parametric source. Note that the positioning of the different surfaces were effected by moving the actors on screen using the actor mode of the scene via the 'a' key. For more details on this see the section on :ref:`interaction-with-the-scene`. .. image:: images/param.jpg :alt: Sample visualization using parametric surfaces. .. _Parametric Surfaces: http://www.vtk.org/pdf/ParametricSurfaces.pdf mayavi-4.5.0/docs/source/mayavi/example_potential.jpg0000644000076500000240000027376512747716313023403 0ustar prabhustaff00000000000000JFIFC     C  : "  e8_|` 'VNa:Ls phf3B毤=t!GԮێXדxWb=QwRߞlUJ=7X].xmT#`mEh~ghSʡ|3 0żTu`_`/0/ 2s|M] $OA/*O4m5.~lJ7tڛ.wKVPes5.V_&leQYz'ƪ޷;?IЖ.96{l .O8ȏ}"l'˖qXkeu&'/W1X((,lSfe&aZ5ϛ*0/7 Guh }N/4?5ƯFIm~zVʼn!$6Q1cqEi[Yʵ{ Hy[22hTi1:M`Z*XL˶?Booć~q}j[ؾ!{aeUkǴ>^9:婏3)a3}dIPNʕ}@_`͆9s=KӒF=}~fVh^Q9&{D 9"8]B7ul\W}U5ޭTo.Vxd,g+㳋=CͿܼneKc[~pCADVpqwQ)T=FܛLy39Cԣl3z&Lή2/Mkچ89&BϿxjsR_4d_LBKuL`_`ۯiM/?$ ]>qN,*@ _+Xӭv'zP߾ͫ[kF{o~™5iwt]*ʣo5%%|+ =w*v0R猦0`٘qvrCc@4NBϧϹ[zAlPڢeRZimKEۭhcAe3w(y5.U\V|ruR>Vq61*X_4(lP~Bdgߞ%b =wk2Mۮꚮ^ .WyڤeIz·Yh'忮bd&9tkZoh;`_`_v>lw$wKU,T{x),Z7_ˠ0//0//̙][za#)h9nRٮYO⫁s]7֟zKu_&?۴zCM5]e Vڶⴌʲób-\z-;)6^msȤNF&ʗ6j*ݪ`M ?8關iw>Wǻ[ F 3szf3`_`_ >Iz)xyc& cXSy×(jsb\Q--ˌUK% zIȬ ޤ}/Þ>gV`\,o1֭ɿUw߼2xסU[^m=汊s?YM~4:--c^OTC ;otߦ)%!ȋII^W#|<}񊮊RS=0/KF/n 7`&?+:1ݥcDz 8`_`_<ҧǿ+"VO(8t+^K5x+Vs WfdrCW_XoGꇭxO.I}w&wmcA_SB(>5Ur5YcJF{ɯƶeT}e$n&Im N-{']EMBZd}sqQ}/K@ {6f}wkՌ]Y EuIT0//u`(+',{ۂn޽03͈=Nbl0ջο%mC$@b1&5U[5= koȦYOZ'ދHOs'`_;MJNL7jʺ4[W7[Q9_tmһߺ4dlY癅u:Hg4h8qTXRnĻ 4$7Uh^53RŽJ]= u6Ը0// Z2C[eI}/Y -,ld󕆕oxr2Z%mn.Kdi8P]jUdm~x]KeOK Z v2UZ/T6>1^Wgkʻ?0dXsSޟJJֶz5|;_~/9GNOo"CE֦γq}Z7/  oZp~J͛dN[yYZ@qd9x$(j},Mq(45BWt|9y(ϞdZ+5Ԯlu6]}M6'Ga7jůYk 7^o:Pn%۬p2Ч9Nzo ?)3|k7Bi;g˒<.Ih^Q%Ӈ iLHV{ߟ&u8^4`_`_JbWegJ*~3KI`_`_ 3V9?Lv[RoZ^5=Ɏ^R(q-X~ҰEV{$7> / ;Ծ?~;%8n4DYy;~ɼl@J6[3+Ά^U .[kaE?Jow MB{]Y ?0//Ŕ?T/KT43^mХmj{o׀`_B} )>c[6""Cg5xKztf7K&Cֽ#̔jδ0ZKrΩ {LKt 7ͳcڹ]?O8KEolf\ U~fL݄?L xֿ:+M_xu\`RX&yD`ѳ{i˃_;w#&meD~] B%1өv>Hkw~60[ گ}%o7-&+ǝ;/G웒-zsKu3NO2/V=B2ߵ[HIiX }UL>q+|9~=46ԺK.>gx!lTKذv'iV4vr7BO ;PpuK8mv ҆ j~jKbm*j; 8OnLy*W >b&S̲]T:7\(// WߟZs2ײ~z解er{^}IP}5"}JMjK^qTvS׫?[v0C{ZjgPpmTtNrԪdƺIev&Vo Hp_o)m~@7 4\ibkQWJ]s{ǽH !48rr^[9=fnuwXX>~Y`&yYuٱRҺFԙ7F_Q\ֻ͗ߵ>z`/~}p;sj\TB^Vr可./ܶ똾"}a#}>'vӓ"}ӧX:3_L>wOq.D6a`Ϥ*nIV.ӗ=I[fEP0/ H趣bf %W*O:5.霎)ݫXt3?d?mm3;pjY+~`~SpV7-ڧʨ};diir}lq׀UwJ__.Ht;S t=:w{Fڒvzi 浉ez]j#vPτDlT8wy}e`bI{`՚Vkɰ/7 9| }rgOQuXy!(6SZ<0|kS,691=k M+*c,u>_k?8}Z]^x½kDaf-Jł=g{u_$ɑMqU?͘ϗj)u["=uNq@ѨkىC}K6\k=r-tb+qYRng$/g~X0//EzNW\_-k5y4hŃ$}cS$͟-Z(eD9i4lt:2Zl+E/~۞ڶYJ}w+_$:G ^;CէP0ugڐO̤Yt%k{q`%s-ӥ Yq(n3 ~ԅnMHX7r|S6E qNfD])jv*qK^,)/xfSx}77Hր $=MLl,:[.2X}|}|'{-yi+[ΧS 8Zd䬼y܊99eVm@z֊vr9TZz^R_j(y@QgBԹmM{mkt|L7^S uLޡViH0//0//s>y0}`CZ#Ufymw16Ή_fƕ].K!]egQe5S :QlTP{Р퀨Bq֭g];z)3b('د 0 /z// 2%{=r/0 r _GK>Dp 0 /}|֨`_6! "056#1324@$%&AP`|}luDϢ>au1(y <'TzZ%KJO))#<||>X,[GV#D#<&M\U|?oYq뼱{1 X5꿡?)#\|z>X,[.GS8$Ce燞4\g9;QhA*BN4v٨Hn u͇oX qqĄjTLAֲ%06ď6P#kVF2Y,.^LR];ARd(Om- ;V Þ3|qL]唯74^/Hb9yiJ'DaQH`s+*R!ۖWJMGN7JFK@l>11gDnA8\Y#jטUkb:=#0bs(IMn"YzXH㦑۴:ż Q]Tf4APs&ϕ;sq -R[Zc8 wVU|:|dR,&GoU2j\&c`u8%a e3 !+؟1( -bk2|x,ye h?i @_?M%7IO%BC9aMr'~<+Qձ_V*4W1żp2Va;,oƧYctKR땎ذU!%4Vr\ Dh"+BJœKKI" Ї05M a!A%>$9% \>Ѕ8dUv8r؎ZPZ>$w(2FBq8rm+vY&L1Ty:78j xY{i?ž+> 6a"KQȔ")f2Ϥzs%X)"!GJjD j$,N%ё,9{&Գҫ7^++%\$7Qc8n9Iz'XJo$.җyAt7!:A%f5 ԰q! tϖ+zW,ڐܥ|EpbDEYy8BoLnqoѠ˝IDnL٪-JЏcT$H{hjJT:qjFZ7uғ;pbHPr3ob=a-v*(N-DZHĘ5FQd+ohPxJ-MA$.b2 (Jm+24BF1ŸblMU&p]G{ Pc2)>^zJ,\6CO 7K\]Lw@i7MpIRꋃA|DRgα]eW,BC%-(9 $`?%'sjp<"Kj-jQO%&:PDZ\Wۘ!%=8l A[`Ӡ=7ў8vSdv)m{yG7$vR+qoUU$7iu/7< ٷI?NU`&At{V1|_$na4zymC/- q=⺸ Drs 3,%0HbT12ͩ&̳هdqj8q)"4ܝHHvVc͖Ɏ %혭wSZN133ߕP(禾ʭ^v;YYmw.Tnl1FC?6ko6/^?ʽ3PnkNnzV4.e '{- "u00k.[n0L-K F"Z%:iG\0w*;$:%Eᆜ0 :V |:e` #4ioT[sy?~og,GNFI*FFUYO7w3$ MP{;,Xbv׍3.Uh['L-\e EAiHZDتAsD?d7T xxME2?BcL^rL{B;% w@r9[&dZzNFV@*f0?>[=clwKjb2s瘍۵>$ ѓ׍7jnD-vI0IyK)7YQLGow7-r|CaH[ss{O\usp^Fl66͇[4sڄpIzI 'dI4 7MVٍ]>kٳcmo˃χh{9UgTdh;ђe[؎\~,ZG2TNM?\jz.>q]Zͻ;tve"Z%]J" Z;7ZRM9Oj(wGre%rGmN. ""D.QD"n=A=c0ȂԆ XNi"\>\!aĴMir aML)A_)KQ RcړʩG.|SǙ3L=/mrriO@Xb5L$԰F4ZնDSOA%|T8a.iKD4AKT2Zi$2 F 6kϷ  UbXMx9І )0c0A  HdBk[U tž xu4TUpPXtؤ-w; |ABhC_JFw1 [|Vcp>!Žl,{%Av虒 é(Ϳ-)r23'\5.B^ %_u!өHY 916FI ڐ3\UepHCq\D21Zr Q e S>Y$ M> -SjcL&Wr>lvLN榃(&C0+n_[z-2r78ncY-{Io/u_}\%EޛC%M!,mT8$L"Ci1_L Egi-{_8Mܜzlb 5o{^uI 5- l8醚yoq!)M}.p02~-:k_c݋} GqѻrEbmRz-]3ǬUobKcmlKl7z xu=U?Ɨnc"q/1t- x!SN{PMb;A 2dteNj}~H+ixdye=?vcg?C'[X;olѱo,IVSC#K2TCqjڂTZq&$$É! "NciA~կIMF>AD#H(i >5q Q 0:0 >VvAl~_K͈&!mgwVrnj&Hyn@D)[pQ&)#b$c6-{cJ 'Pc#&IkAk)ɖɅa 0l='4d"/ANp^Xt-j9KAM1!J4GI-F*H^~vC t~790+657IW-X&e*GSLN1#!k=] yi (:!U))) aB& XM˘1+lY C͸[[ DB.-Fr(S).&L=pp1 ! CFJJ+|-&ؑLArsy"k&%DqaH¥\ؾV]}v#cWнNJBVELb؁$on'0bik;BȤ AKz3$DC)Zj7VK+RlIuc=y}&!֔4hp?k:DidmtHrQ61䓂lbQXB JɃx6@p6!1~1C,Ш陏xsZbiQ'^2-E 0AJK1g"kgGv3pQz}z& hC¾4A3 #d 7[CJ-,ylO|q%Jڟ;fKÒz}V1̘pr@aV=AA^)-͎0>G}]QQ+p!xE])5$\}m9~״އQoǰ=ZBk{9##@; - >B ŬeYWկ3g3`꘦-p$wI  d6]d,a2 -.fEH Ԟz͈2\-H4Ozȵl+A(Ip<>oc?sWh #JꎨUb `%Ja$TA(da?oXb F QHVyJ=8R-Sk ֡j#ВH@*r2$`aM\9/uOӱgEҫ8qxDn/gXM(s䐑 -Q R0]C}p.!|q$fG*IA-ou竪:/Ub} S;+9# ub" D154gk2[<NV+a* I ZRN"lԿq͂wa:k]ZJwVWzMtBHNID0)Y= "-2;S>PRֳ荪@CH9jB#In.- 8Q{ZQkI-]'zXcE~3 &>^c~ݳk]+*A~U5BO}A2'@4+= ze)mCP& 2HFJXUnIAb#=a& SV eIwB|)x da9ȔDT;'^ E!?G]LCٗ֯v-, k*+߲ag5Es1!Yj&[dɸa<}E1 7H%T2#hvi)ʆUֿWή.u1Go2ٻf։XCpʹpB9DZLL#P_ς 9š"rwMJZVi"I __DtGDeHYPo$XNmDT  QuqSn uE#OށDfuKHzo-M JL%`JC%dׇs.0l7a x#VY%J" ?J]gSbZJ'%Q5$THnBT$6, 6ìS.ΐoq0Z38mE\-}l662W[sXpn+ISs?NQ[_%͝d.80!1z"jIZ:AKXL&ma9+Pԓ,ԓ'5TȬ`U XȬgV= C8T2 sζ:[( ݓY{VJZP$K93Pb'aqN4}c eDpҨ2j8]&хC-7,+ֿtHt| Sb iQJ]'' +j(Vnla+22 X/jP G\ QQS.&ŋg"6(Y 0W Jb=}sAe =N9%"@z ӱWY6Ǣ^={7dԥn6´u}jbÑѠ<#rRÑqkV fG=, &졅s;aҐՌAahj!E!VǧJ4gԘ 7BJUwW+JI V;rA&Y A'Td9*Nԭ$,-։*тlyғ_\75D ށ9UךP҄AM0̛WձSf~Qߎ^w9~աY=ꡔ8F8*aS_n\NN1) ƋeUk)(@%"oWgXhk~aVϸ8Qo%0P)@6aětIDxH&ة2lJ :gY$]KMA\!'@CI" NBO}?A-[b`.f/~;w_]G5dzB*1w㋭-d!KӪxҪI(`X r\pÆefVrN"Y&s_nk&7waR,h˦642AnB /6D8Kvz]dKqm.vṷ{NH:a8?!N2kK@C1bmGJDg,I>(.~xJ/^-~;\[t^\ק'sɪh1"ժB^Ih^YtV*=Y 0B5ܙ2|hļVVkSm>Jq$c 2OSaF#0ܮL%5:ÑE,P&SErAE7^Mxϯ8:N ?Nw8Q!c.Լ*O Ľr7N9Dt w<[[ɆZI-q64).kd$zX`2 jfBJS3#eB: ,k%ž}m[׍sb$'s.BǮ}ŅƭY=%PaTj@GDz( Do͑ NYǒYD3dd \.rX8Lobx) ;GE79JAi1|)?Vo D;" z?MŽx|,bmBisZ3/g;ߚ<ÑQ?fF09G0%2d+uKD*NH ۥeE s`!)˱zd$S|B\'=Z2RZn+E&sb=ہNPۢȜb)j3"|2~#yV(O!ڐHeto~1"O /%/2Ok݀--S]%!TÐ',8\[!M:*2UA26[&IrRDfK" mh!Fo&׸-X|ViINtYf#IA=b~[0`z#!_[_߈I_O_p; NO^)0GOW&1kiM4yuA \)|"jTJ rJ'B4Ձ.\ /(^@=m -BVORbSRlAb؋:I@^׵̜Aܱ4G8~qi6huJuqDS aㆣrQ!'łK-ħ}k9J RHɄqR+UMshJiVO#@Eg=ZeI-:P`{[\_(W,,6;|tB4[n 1LMOqӨgv$H:R)_"pĉ*tfH[]Cq$WU$,+]%<ły6|XiKb0ȼJh\yc#'jf&q^ ۥը uV#KSm!GS&OB!9`D$2?dSPWv-kere$ү^OoFFItF$:2t.Uvj}㾗iL Mj3 Їht)2pl}:Dm&5bҍm @DRDDU(؃DF$0h)DK  j(T``sX# +&2ASoCZKtߏ9fD('=S+M@R:vv&y3=4꓂&[{2)FF\ԅAĴk Q[H8,Xӑާ`9l{\EG5jD \jR#_pR4A3P\v)5 !\֒Hю.@rTuahDzSmE0 v=rHؗWVM SIxVqM;ݎf/u~OOHg~uc8վWi# iwy2b:gEF58 {s &Vp+@\: >W]bbJCmvZ\n<&$ڒJeԙGiO,;$@؞e 71J+k_y$S܁ e]k}wu›UΙSQ^=/ėῑro]e͋^k"6+SřY{0RC-pwgY Ȫ^AY*;va6ÿņRY)Sef*XIX~\DZ: p1=%>bd qJ uH8RCaOIӌI ְWX[@kLʺz 1zMi2|!Cl)@:p!3JfHaz{VVMGx;!!qCcz+h,SYG޽w\qs/ys5Vq,+j.cMaQmχ.wчig\2Ǟ RuZHMNDs%;q}w1 VI~Q$`/5s $7[U#ZEr\5oiP ao$אrUe̺7]C!=k8FKZAӌhLilj6U؃W R?`5왊YD JfA43qۛF 2I=j?Zn}꼟FG>χheEX OWȾŽxɇ`3[}K,[^/HXf:L J(RH&!'4M3=EșK(&U+רTJʖb2UncԎq+MwJed *UI-_;L"?yOŌTf̭XLdwX[y-^r6o [g!1$u Ch\YCA6PH~d["_&Zesx~o1ܙ d#iC<ެ{8?Pz受ԱŹ#e&joE֌W+9Lv"CҞC6q i 1$u c(\\YCUSr5.1m<Մ!n/VS ZYWy)lLyV<ҝC:x<(_߫D1"ܘdLyrXG}E'/]̈́KqaƿÑ_8fKT<xJu, ST}n =_%%HWThVN+>{ rr)CX YcƔ<˓>UT$TZG͏kix奝6wm՟4i[R  !1"AQq 02ab#3Rr5@BcCS&D$%dps?fD mDt}IJYIRLY*܃nTweGCcz˯j{ &P^0qºY z~ p0%U) Tv& Zۥro_''%D i^&&S駬wJ?,{(w X2=G-J;&Lq5_26ie &DSHHV̠a' a YB*l2 4Ev$U" AqKЄ$&̬d*bNMV3ֿEF4 |g/HtS0?.=yn$z]m ۵<ʙib% 澿^K yKRD>(ut -CBC(:w Ld'Jңqzs)XurA(%gTĖWB^> *9z],׋_٧UVTMc(+}S}?BAA9%ܨ RBwKZ\:[2 z[xXJQUqZ8Dۉ!('aUL-9H3"WB Na$kqO1<$|b c:yC'u7@!Qya2 1`eC^}d$Jw. +t`ڣKBO®+?[pas^I2࢝}BH;ol" mtt3a;)ædpAą p8DىQQa"v[t$~ -sRW9))&O}AK! ,3w\_ih1Y-k&oh#VZTMGfcF{ضG%%? 0 ܆fƮZ(?A#f$"ѵ( g!Ibfsݿ>e#q%WaK!&`5y>Vfj\\lL;T?M=d%pdAA0ydA :v Y!Y"Lϧ(̣-D-3+:Ht9"9iZιghVMCm⟫X%Wy"bq^s|=<_ñ_5GaXoeQZz:aKBW3>ٛ.D)߹Qٸ06D 2h3>jY0!EsgEuYGQx"C$|ԫ0U'v̺ρ! bݩ\5kC$WWh5+jvq:xяo) %gӔȮbR\6]B#F@+_0Z%F2{ML1 ;x(P*DlpWt$zs|~o}/'Dʰz? x֯=CNvL cVSahq OFڶz t;b!g`jلlaXB\E2+0;:ný*l)4e#jY%6 Y\!dQ`LtypJ IR?DWQDs0z66O>Oѽ%}?g'aGm NrRT0*9O;6NTѴ *c'a[ /O_ S>TFy˔gE>͓l%^bYRf*u b%HT7l4F :iCț+SR YeDbBN$w ?{ .>I&)-k6{7 b;JNz ;6,u?U-O/l{~aߣ/iW)Q6Jː:taM\^K?_/KW,bݱΥj.rq9͚n"+kThBS2ԃ̛J>sճ0OCy.c1"\}JrcU^$<1(mo˗|[wmTq}E7|"aʗ{Ou$`TeA*n*4&^6\GSfE)z ]qqZw6hA VTE=EQ`dIyⰋ/\9܂DH"B.$jDCZqbHb8 cEdvJgzpom*d&XŚb+)d->͎: PVU$iS(1&FLlpR.l9-b29R ;d"S\3BnAmHd"AzS&JRFd>Fo.L4ۅr#!C)L&a`Dg1{$^LW;~3qgg;HYOB~) Sk%'y+4(J+=1 MB:<q\WAu 8e]<I2#+E:WT8{GӠ>DBsCrQ$bI7Q[l!MmHlӔ-\0Mp/9pw6F|X*+TW:כϳ ',OY!Uzˊ"ybV u++\e8n$%9i) 2ܢ̐VaT#2 f5$g,daRٽ~R.ÆkXin[TU֜=-id(=YAlDz"H $a[! bJ5!RoBRX_BI}1 f4#R7HϸQKJ!Dz]:]žnrSI/i&‰=wnkOS>s\!EEݵO;ڠ n*h3 @o6 2TDKKV!QIALBGtR}(YZ>)-²L7 jVuc }'8' +=w=1~3 jf!ÞJcF9ƒƅ)}S~>}Ime+DDW)/=S!I(b-NNZYZj,м﵂жՕecS!y*2F|_x#AY|x'?;7O2 S]-~S?lo-11YzT=Temr3ctʈye y)l" WPЛ9?g ;UwF^ҷoџePӖtOǒ%DamE]푸(Ҥظ}ŬwZ_Z{l*[3nޭ?Yt !VaZ%w#8](W-Z;-&^:˥VK$X8L2HDH ;ͯ9}.R\:|cuՙz=5sK߬wß7yAvU}`)i~=*RNT>!%Nj ժAoVk/:,ЫdW6s()6">(:i_eg {s*cPoİ^GI&)y>SȯM]yG=Ytؿ1pS#Ki{uXIw"kQ"餺?Տi> X%~p̓>)NeEғ BּZV=9{B qZX;Tk=Ż;>u#=ퟐ|6ZFTLwM +At\:z/aܳ?aCJy_6tLeGٮl>9s_t6"ͦl%Y'1{ˠ1%f+_ }_9! meHR5V\E|˵;AJQؒNKEBPnI7{n Zn[.)BQթ3hG 1Tѡ3 &|D?YU0Z \f'^WQ CY-u"2.Ps\ߒ+i2ibZ2,F>NZ}vaOAxҸD]^({ܟF JWCP| ywAwMG4|C/UFxT<;u+>z%Xe&IIrhq;f~BˡJ..R$%,_gK  !1Aq "02QaRbr#345@BC$6DSp?v3oYH*A [ݢ.vZEb?YO o})m<&ixI?ç;l?{Cjy*I u'a:_䛶2*[8ښz|LYRϤjftsL汃T~P.?;ʏmoWMJ~^'R˥)ҵ*!yYPPͥjWSsoy`RT\\TS=-u`v9{JB +WtJÐwm¦K krs8*(y)GVܭ$N;UCjoN]Um:gw5>T;VAFgU%L\zcTU[ rҮ6Jsq*h+uMIWl c< hͦf=@E@Z`9dHzPЪs+`⠨\qHl)/ndm>_S$N_MT.*-A#pYK6·Z`nxeGJjkMRf0adi`UbOBe!~D?=J:acp-q蝁m.Ϻ/;N1T] DFsI=2P乜Q=P 4Q;?q')|~*1TAŒj`ph!1c*W 9L%ܜN] !)|]cm]X !PQ:c\Tږƴy](\v@&8e}'Ar35x20*qTlhuSQayqQN<*-;mR7ry!w) ksZ[BЉ8UZB jͷMy/%0ihs_ZՐy]]&T2SUNq*I)r)zYQ# y#q](P# B=졌Jrf) |sLr!gbG%}0j9Xm1熚#, m Rs , 4aQE ?UGGHM6Btɭ%J %8KPrsW&\h}ǡMGQCPa`Vi UXȕ*ÏGg%4>F~ BEP1}m[ TϹ[sZ{IrKGTحc?Q)lK!! A!W] ^EZlW!pUOUSV7Lʧ[߿ڙ$# `U}Śe`^z?MTW><=0;{i;>GI0oQkV4g'ۤ3rW~*4oMbY9[7sso8!].lu*ܢ~+ d4&NB>N@p좘Ҝ҃wee]\Z5Wܚ cTi_Ji}폤G`[c`_1Ƿ&6xp|¦/>rV2 .B{Q+I䡕Um8S\f 3~̷*C-y*7!}?FWsuUvx>*acVJgALzȍoMI.SZ\WrˌSX\w+EyƬ*4*)!zd{y`<.+4搁S%ܝ(MemEןs#7zW?Rԅl[aog#+} 9_HFK)p[wQ qw|UZDl\)FrMuƅTZ_'*/rYBJkI5;ThͲFirٴhTOT`'GSݤG!iBT6sp b!KadV)'Z*9T-E|gߗ{{NoӟcҭwE d/}P^.U?`=_;2M꥚Wp[9w!dIUT3 ry4nAN&G!W^"i*n45TڶkVJ_{G^&{zߗ3 uM:%>ć ͎Ҿlm;U0BVf| uڜrK"NP )W>8DRVTKBj6Mth`#c 7Imw=pjYU[,* Ī+ '(FY`hsin|$f=^s(Qһltl#;VFd8µֺuzs<aLzJss)"tgEvySU݌8I ,9btQJo{^HUd.]RFq])NpL#(obRڪߪi״[nʃm#9fۢc@@|StUzE.?ېMUVP f)'Uv)ʷA Noҙ;og@'P ;S HS+ͼ5C*+^+KNBNp:\*Div.mX-Q[5owட+&ޞO(Y/JN2ҫ6ہ*yܣ /tu!p x* kbǩwCZ\⒠QֳZO oS;S˶2HʈFj+fwmYC!_us^՜b_i[enl7|rP+Fօ+T雤o <# |sنn zjIm!R%T{ΟAW[[wJ압L*JQÒvuT{]??Rhu&f۫6,mGU-󟡗q.=GڮcGTC RI&HrV* w*6NH!G UpYTZ,\hoOtΦJÔ#NV[82 pWZFҝW3Zxҏ]L/#pL8rnNB|j*V:_:VcJgu+PŽ@Z_/1C,fV̅ILY,GT_Gm:z|UZ'Bܔ"kvu;S_'=8DՠeGRI-@F\\Tp- *Xmf?l9ϯ|G%b1Gg{N#6zOUEJ7A-Cx!;Bٽ>q)X\%ǵSܜ1ZޤvwHyP;NT eHVJ7w[G3wD;y/PDv_aYg3|fX)e,t8?kvsڶ'޳9hSM.<*s*9E02FTS"*X0y x(rBNr;(ܯ4znh';ǒ;~Uu6){D`3%IX; Q dꖢZ*O' MFGSAPBVqRo 6| pܟLĦD7\NrO5DLp;S.ry23-3:BTmjs8r݃U $*GsͦW㘉z{S* mpߪ!o [ڨ~qֻ>U[Z}+M%mεOdu7GV|0d9ΑJ8㧾ɣ_qv>FsJTtk#־6600zO.oaV.u]to7Hn3S)6@.s}JGs|9TNs ~ZğbvZ&a?%†V4КppOSrT}cٸv =Kf⻂6N F(=uE<+v vW jy!!3cXO7Bu,\d sUAQX쨪)TfNzOOXT+t7m;4up^Rk'$>ben$g槺9+EKxt_TO펜@T%ziރ?%]_0}a |Ԡe teRiaKTsESw`5< +r6BXwoQ=au0;;`٫yn#}5]3{~i#;`~'gf''π线K!ǵ\-xz{{;O`pۅv*%#P\Fqh(/!wd  !1Q "02Aa#BRqr3@Sbst$45Ccdu6DPTe%7U`E?m1'w0ӱ׬Y*e“97Ut7r3s_O>4Ĕǵ׵?[^J!gv^ ;3.xQ"e^x?fW*ާ_?VkGj~SÍRQ|2:xoenk?Z_?Z_?Z_ZVz?!^i1UmQgK,*??mU|\_?(1x1xhMG͡GBPT'v(v5pF*JMG'6?]D[Ћ73SN'@LǦ.O3鍷8a>?dؿPr0FYI:_ש?z\cIb}:LmS kyOIO/E۶zq€@g O1Sk-V昛?ghdn{$MV?$ByNWfS3&,0Sn|xe荵|qq|}1cֿ7QQ)N'gxE/q|՞?mk<I荵gӓ#Ggg??vs#m[􋇾H[g(ht鏵uFM-f|VQG:O';VœGgJo S1A4<;Us|z9L4bQ;d z=A?6#~|>\v|"3avSQߵjcJx+iOw4Wc4EO:~Yza4! s2Y(qYLø1{L!#ճVe"d J-[Yz,6hmwJBP)bJsSVe"jlˬZM-i!%Uͭ("yL1!.^q ZԨ$\(!mM%MzҖeVV^N> e{2bUœ%402{/: ڛb1H"Z͹58|oy#&V~Qi5*/^YsKk$+=7k>: m,о]KV2e$V,ſK RSx =H3hgYXsi+ަ@Zֳ&ziRji"T5qaY*uI2D NQ#8GmdCo];>FG,vU#[a=ww䪕H$R1qmbFcd_,%fBϳP|qJ5'bU?uCpg峚}^TAFʾQ{) =*8'LmИCI,*ފCa[QnUF3< V5;as2띥|c5q^ЪXIcJ/6Yޛ8kOL.',L|,w()A[-}"e%6Sgl~5=3z:c_|G-}; bE7ʮ>bh+P&(Ur_]ktFobI#@=i|g2(raE3w3BUeQGls1}b@ Yqr;HT򈡉GI&sⴥudO,4Y왲dC*+j.nNab}$ԻRp.`6nђij울 G%m y:H#2Ⱦ;pJ:bT|Dd<|Ql,xRz#1<$ˍo9bIWEPhLW2R#E7#k1c.rf놚 -M$$F*2pE(#=7MOk#w|;+y$ѡy]>qO$j?r2nago5zBud}Yx6ZG5_ ɶ~AʏĞ DLZ0LĻBjЃ?m8NwEPMq{[ͧusP_׸Lòp{jcę1cYQya6!91^3bx[s9-3'$@)gܓёSk3NyeW7F^H41+cj:H+δglt&-zNە ɨ:z8oMU*}B$,vvؘz6D}S.Ω*:YdwfVzXd, 1̣淮'90vu}f]H⫌Ӟq<}2~Pw$(tB=&? xas8X2Җ WaOlsev *]\еMOZ#6WZ#5osbĭ vd̲P*0RA8CeSmCdAP~_31 J:SS N"o!n[.Imh3̇}9'ToI,vxsFч43v9[Tiwd)Ye}13m`e`7 l(w Kl'5M+/f=])Ay{hܬI{; HĘ3+2 pN_iv:NΌ2aFR"%qrV0#/q0-!U^߇waZ >DcW\g++Ev{hF$.]wU^g{:w8Amxڵ^Xʸ`6ULh#otc50FY0\^s NK\#{i7mb]F0aX.dZF3۸PDv N>r]0jQϟ2 2E?I?>srn.}& 6d^jONMxGA+\`]a1c1}0#0#c0* S:1#0#*ƝusΩ|Ѵi1T*4.M(-[ÊЃ y[L%ܥxwr?f81:6vRgD=>l3N>-+S1vʛݩ #ƽ10oSe{Ѷct*i`113RMqNy8lg_Hylh]pۣY0/F[AgSHRz{xs D%"h:ќyvK(Kk BJE}_Ga51%(_۳-g)>7Je56_ˏ.ſ HOp*-s:f+FhS~ZbP8C_ ; ҿE3 nM׵@m8ќtEqzZYᱴ& ,˶pT uu{~b{x1-)k}`6:E2ʗhUx pͶ<eS\<*1lu7$-?? }u ph8yg߾W Xy;ˎY )+sZFi|gl1ɌR"aFAiRkrUvlkn/'i iU*"7&v\vW&1ZJ[C*PPMi5ЏguS>}t;\:[lbFE|,cTu; b]C÷g%`z‡aM‘LvWLcxiǑg*ӡJRpk,͟\}p:nV4k*TO$VD\CL3 ASհOXVQ>֤^[Gy8*:yl/+ճ0#ùZc *w9(>L"1KD^T[*yÒRY2U~e89LJZj g[<9hÚq:lkli%2f7M OvaP^2a3c1V}:Lb응,xt*5R cs#4Z |vlwh`_&+(bF r_ 9xHϟ3% $+YSPFRդR-I(SqRw&;"pºadkҚюjbJPOfZR}o>k=m>];gòw=0Z}^V 0fpuzb٦mXߕɷմ\84 rڬE&UN82HwcH dv0:2JU3%n0qb0ɄaF;ӵ~](u8GVIUwgyrH ꄯQ<ʱͧrcuEfn  &ޖiimsFc(8ֱ2mtL)]f=x"L[:t&fy]H7#4׸nhZ>ygV1Q&Y?(Cah9^rc*"C1}5֊k)(4ROV5E+d6i|0P(RTg 1c}esރVLc[›egӃh"\W&ERS%2 ,hdOIȖLR&޾S仫gc? r]gnHX" ãmL^jɌc01JAKz1wng0?&\hFbJx"0L1s;g 0xTd%?lpq @Lf[5o{=`(kc1|1@p`nPE:$+$YC#bduC5ku=1:3nyrkrO}6SMCnڒiP4SyvgARl*ᏐETdCJNѕK*b?r\ E VZEьcz]i/j AB4R2cbC 핧M# F,krCL,BRNm G(Ϊ1ʐw0EQ͌" <"dVoQn_ؤMF^KAc~JWzaSђQ1GL:Mpܛ(&P~TL2;9 %hOdµIhKkʯ1wlp_jTpi!=[(a[hu ^oL3Drl'e}w2kF@ߪIR.F{-vC:۞A="i;"%V aQ"0 S V 2c½NKUZdhd|Q z2Iչ4Ԏ <'Z @i jmfaId+vraS~eJΣmN'=`XMg#+HeHi8蔊x!oJkWǐ2JR/0Jk~+7DڶB˴9R\x F3 +X#sSH-%CI`d:$fP Fm,A;a |.8;X;5q+!PɞWX_K*,uprY(iFiE)1|]".16MӬڡݝ.: }!)d5:&&G=Mh\6c1kd=cℤLþZ1X0ɌRQD(+MT)'q8#{ђuy 2o-ԙBa<'{`-*B\yl/9I_HNH-}ZceN4ftdyR~#+G>Q 8uvV+9{F3>**1cb$CO>"RIm0︒; ,z]J ˾( g,`Ç@d}g1yqc(b0ˎ[=Uw6#4eIy=184r=NGҳ ίE=^)v-K7[p%m@ Аop#T#[.1'%3̈́Jeȣt6Fj/+WSu٥Jzr]cIpg蓸ND亾K)t`(P͆ n}++=Ȭ*К;u5ЦkZTJag,ſVªk;7YRE[}UJ `V^N5wF( @6(oT8"*biT]-8BBIHTcxX\2aFTdċaD c6u#ˑ|#ki1yhwi#pS4N #)K01yz|+1R0Ɍ]d0Xt%ixD*^a&+B2,^0R; PLyOTV_%mi 'WpF7WsV=>r L~!N\mz6{9o|_6E` Ƴ0VDJʶ㘀"" ڗ:OuXD^Se)#dWkڒHac[d TSŃ?g5VǪ(.-\4Lbs|#}΁0H*1t&bX q=TSE#\ԋ&1c62ТOѥO+uZ=ѝr)8uo}x٪6}߭pntI_>e s4 h)E$B3R3NΑLc5T5 bi8;Fie6f0CJ  9U k2함)3hQkG`"Q]RSܝ03 ŶI1H-Jb.xXK`Z}cí-=n_րA&~44>p-=\BH6d/˕^wa)쮜n#gc?8љ.P=ˌcө I(cDi\F'Fn\c1Jp_;\ð:$[8=q9_`Tghd􌲉O&Rcù]{s&{nBzyW83ixG; O}7NL_1ˎ/.kjJ=pss,/W4hz[<~57 #R-(Zh.Кs4;&atNJC3 r=k>%LG\~BRRUU=2r~7Je56_ˏ.IZ'&Z={ Ҩ %oy O}790rl.91b0˛p9&dԫ HoԡFPNY>F!8Ta+(O=}lɔ|g0#c l&LKQ=/ZzZUnZ,g_g7"uK@Ke]rO:tɊJ^lR-}[H̏^E((.kޮ^aQ} Q+歹R.ٍ-˼F91\ɎA\# d+XrZ>w$#y"/^[=:,0#oV~bg'ʒ2E 9gjvpqcl.ړHc8+ FQ;:Cl00jpAۧpfJ_x=1ê_f⓽0"6wb/qw6 />$-"V[Kytis8o,ũB9119+5z 12*!-\jJ.0=Mnjx@^2ac1c3aYH14ֆy91ɯ-` !U%6x32& 6=:##ߜ[LNp͹OPiPʡGͧscunv}G{{$rluw)/ΌraɊ66ьk2l](H#1c֦xޭ83[nkm,E1c1c)"0#0Ʉ;*i=һDaF_H0:OՊTbA6DAޯ3)c0.jɐ~uùh2;bfT1W}~Hؿd&H1cr]ac11rcd^c}"+M Iu)%E)#&`# IR m $GWT2 㑠=tcw;E6|3J=[ZMR.㜙 g0Dm^p5ֆs%Ԅ3IOVC6#5sop(V2 4{m2޲gܓђ]]*$;MZ<#q_|B`] w84982-)5ѓ=0Tf1Wtg_XraFUNL1HtϻגmUfPGEjp#k[Z?6^dg66p#%뽉,kiw v)ƣ_Di t\p<`3"F01[10aьclbc13/RL'zZ(g$pϡe^=ފu8FKunv~q6Rxp*6"2#|i ׸:sxj9)aFzf,jVDpE mc)Ld0F\#%c 9/1{"1V/8CC rZlJ$e(s-J\H%iwspp>M }{>[b^:DZ` 9։ރ)HDf,7ѾɌobFxE)X0"Pe_TE+R|aF0Nt%Y}Q@2g4{"^(銪a|>5>Dnա/ND=ZSҸښx#1޸+fʴbe %t󇱧{cwi \LU3tNuO&64S7m[#;Vl~>r() E> ч.MxwSU6M22Vc\URe \TIu]& 5vZKth<1]L:w{ϯZ)g~oHVFi{Z+ ھ%3~4Mjv.Mڙdfbt-.}ŷ,BSHĘef)}/w,Zڡmh%puM?V<c"MT@Vuɢ~(Ik7Ɩ?i^sWM(F*& JPb{Gbeig}9F=͌5Bi"jKo.*}dW)*C3-G*6EDgMqzUiɎ1c+\1g # 9.aF7e:]184rO G 逬2 j3A1[7~jYۆfy(Cjf}oyJSan@TacSVZR5i@bVi;2fY( Y\p)tKvtٸtZGVoXӚʜYҮ*&s:{UR㽾&-:[sjΘVbHYH&ߚ^\޽\8CvViU9qT y+) ";3Bl]4A/eKLLÈ+_Heߗ̴(iùgRS[Cc|RM:G*bγH%ЈUy5KHƤNbi~R|UD&3SEoDWM<ZV5q#6c6MAUכɚ+VW68S &䖁3kl=e{) Q7ߦ>MD>SXHBETKAޛ}XRiY\|6[Sbw;j8<kl,s~qt{ٿޭ?v2rRu T9ل:TC|W` I|j _ iK-AVi#3kLY[)I+ZemԔA {2ƴoQH+@u |ZMR:A ڸ'>ٞ{2]EpƏD}d/FjK~i9 n`SV.8oT?dNMXҝ\oJU8IJWu8EQ^U^b geZ8]<+#wOgM={YOTIHO$qHکΨڵŊRu|3.nM\U(S Fvx_KSj( _o.3pP& .K7-%\c96? :ci:8"< cr_+XL+`æ(St&dڦlݟ0Ӄ7֢>PMs;>g1F:`ߛ/q0!:[d:tnmʆirW1z>.l24B0<"*RTò팥UƩ}HATڊz 3h}#.Cҳ$h۝b$%\=N3؝n)"BqϖU2q)O$E//Ura7P[dBuģ~6Nn榒1TiTcBiE2ت+XS6rms클yVJ6M\M+Si&|/gK$x<Χ59eK9"umR84䔘\\"\KC:ɷ׸c{bsK9z5-ҏ }䳝M=G +"QiK/JbZddiўΞeHRA^Qٌ"tW54Wm9Ss)DUU'Z∛hn#sYE#ʗHKC+)xZvd,먽IgSF}41b\e*i\I$E\?KEP$'fY ;;ڽZJLm-P#H&AP\tk5QbьU1_ ƨ$RBNp 7efm4Zmxoe'mRJ̲$Y3ܻ39^',y'Z]&:xj2FGrmqeJ2 c[r~^Sv>;?zcy=1<gq:vv #ؙM5[QJD^u8`k18ݦf9k ΟLuY?lz!L )U̪k9Iz|O2mO/Ǘe nZ M&^4. t2z\ռؠoBxW6覚b#1i T3fa{Slc9NFU 8沎|F_2e:8~AŽyrZQjZ0BӚURq0YfL0n;K7M8b5.l/*#yY'~23%ϩ[wUƸ7 O~>} WXF%VH/~)]0Z~ue f6ڎeZ^D[\!^UsU>LCĵ.TUJ0f^Oz"@~*ך2 ̦@e-v>ž>_ ٲnu&hZƤX][-JWkULJ}nLPv.jP`84 ' SzB\Kw[m4mXe5S.5NtmP@F#kbwGfkCh֧Z]|j~vbZGےN}W g4U1MndycXF.T#HMo;7ocH1>쨌_ R( 4wsDaح#m7\4X mDa\&LmFsk,UDvG1gOӢBV8s fcnq0TYc5-N$hidEKrJirN5y'hsR\b5#)J(E[+荴_L 3GeJkogcC"qXOny Al0 O 9FR5KY؞ZN9 >Ӷ&9햫{ߦ;dk#1۵3 XG9?'P?+:>m lF՞GR@:jYQڵCgFiHKIlYɬgs +dB5iD4w^Hڲyb>TPV]O,UeSH%+P2K- YBqC{ QOQOMBh0{-ZsMxAXkҍhRlr4"C\16e3Oe䪆 "f̗l% L-q*%9mqY^j͗g%H֛Nx!#06w479֋(x[j[mnM%9˛XfóGєlN0Qx#⽕h1u;Ϝzp{:cW#å+E̥C^=쳉tLvq4:U^u$b6z]$1W5&=Rwyb]'V\R9zLv<;S?(7gU߻&+^d{; ;]%MzBt^*5>oD̻@gAPVesOOk HH{SM0Tkh3{Uj{S>RO mBmmi"ѪVgGi->rDmW&a] c>F6diJTkBK4V`{9)Gߕi4Αљ8&FZS$Ju+UJn%gX3Үvdʫx=f>ʐt)4y7;A2o:6ͬ^Kc몶mrl'S㙕m=&)5bY9)1u0}a(AU6|KIuEX<}RyjZ{~ &lvD.IXs9PRB1t-&n.ut {jsq=Ĭˈ `4nfM%=O.mbZ:sѩ1

IW9 :8樒S^ɿڨwƣ VqvFXssϢ:4hMpaJfyw~lٴ]曹vDk镒@Ar5H4AfةFW<yN~!cD/+Bt_SH/"S8lfQ苧jFԝ}|f zfxqŁw_٢ሾM{&uF9?OXg?X0 ob+ZjѦo3.t?!><h2G'@偣 ~H =ʢZP>/qtA}eg{KT@CmXt=btGPcDoR 'ߪRu;˴}1UߙOȝcThvn7<3O6$59Gouq?pV>;&#S]c-Zvֺys}(uӾ3/+ iIPK ~:V\.e!h%=ɄhN`83-KJ2 $L1YbQcElꔆ%{,KŠAAKY\|SC55KvF!=b/^&t=oν:GOѳsDTs !ئoôt|+畣:rܦtkp l4]du @Չ}ӑ*!NFXC6!E%b,0ؗD XIOFpC1; !WhGp#S `bħ>S&jJ!~Y9f21[w˿5m8uŞK~1N/aj =1/9j<4VpZƶ{>alSrc'-!-SE4jʆģ@=8n$4JVf0U߳<beG57aepvOK}`m!Z04ۼxY@n):1Tk(Pc qA#!Rc޹)JojHqcWܫ7¢C|T^_h{oRt;|.*JWP0Pz5Zof.c-+ &;#VVI\(0$sX> WՂPKW.l|)Fh/zz2);gD=y ̕@5k~RjF 5/$Q3"$JU.@"&z 5u)N~/R97Jikk3KFhXĢ+Ά\ ?l& KK/Ҍ[o,c!x` QIt!KpxМJcH-EZx "@K `%$JܥD)lfQ8g4{xQӁ)t(9ZU11 Qb\Sbشٻ2.ݍǨMgM ]!)cn*g?#2rlcle<.'GԂ~kn8[h?0XuԠi+/8WT92Ue7Oѳb=s+9ԋqRT"2adTX45 D̬hGeBs1thS le)S.Ɗ&5<ùrΏOy|pB"+98kz&_-k`_q/2}JqX˴I4TZt^lBŻO>y=_yQ {2wF(\1(iu3C鹗 5l."Ƙ1pY eO"IR1Lu01 4mxp棁.JB.擖ؘؖ%cR-R7DzSxV*<%kρgb:|PI5ֳwCm+E&1ss/Aaְw@20eiJ׆KBPbUAְ C`\O8CP^)ʒ~9J/K n~7}Gj6Mo??􅁴KnΐMMi/GOgcz*{4žqB BIbD^ +P. j\ZR H̦z\FT*EdG@:Au?B^urʒe,FxXL-Ωサ@t k`F:_i'[=>§^^FSc"ku]B}xw(ob,/ȆW0y%!$/bd"#h7H a31dtET1FohED#5ln5HNVa&TLB&8)2 ![y3$Q&r3 k!˜(k<^qǞGeUm}yG=y}?ޮƱzd%F^I_喭c.)/r2/>2nb m,:Dc`tHb / IPS iαR!@=,pGPogE#UL! -MJ;3.5oW4@rUr 0Z5QĦ8g)|s #1\{__SݝOvu='gBAf% i{G?D3R]t9ȕwI1&&V&1+T ̣AU<5t캹[JQsYPKm.`}0߮YY `*mUxڏЙ؝̘ƫ6XM ̅,H"]'UK/cuGWG|S/ En1%ۦX)zܭ' jM`= Pk=ӵS>6ҕьjWHTrC{F,ܴ{{jh=~i,Ȗ#H, Mpܵ-ښT>]|ߤA7(s"LD!6.6P:ٙ?)gRyLC "Ë\3 OX݂KR ŽWTTrmT{) xN=VUVOf&C`/ʅ#yrNUaxwSj,`O_>ƅb4D(\ɳOߴ3nR|+H+x1/HܣVja..5 !#(5K9^n?SQd1 t,/r,=511euD&V7W(9K `,6KsS2+zLG!Ոȵێ(jl9"""h1]|sP4XsXD(旸L0+q)…R Lf=s+kK3#ȃLEnrfZ5 NNk^a\;b7Lqf!Kpi 5/tt FR,^}0qǘE! HVٝx<+u51ǡw6H èu^c` 5@Ah&`ŸL[ @1L6KA nF&v+T7b!V%`2P0\K!u% R$G\lWNG!:o7(Wo9>/aa;>j=i~y2M\er-\ukHclqkBFFơ[ BL6"djKQp!܂tJHutRx}usu/"mKNcJp7YBuJHl%zp[A帔]erd%}`y>+l~GDJf }OD]>D&Q)77BG#)j<v-jcHx5t:LBਐSP|kv GM%& 8a`͉[.醄)qd@Td 3/M .C\h'pxEkc^8vNX,S9K3J.uc>_ B:N(^A=߂*{(Lf(0h`-ĵ]~99LZR2R5m RHVtr:C* *{ŇW\2刾LC҈>Ӹ2Q&Wt0Ni^P-?aiI>خn#Oԕ__h.{{, he^vcj U%yZXGDC/?x4qmJH)k <ǧ`fVp+4 TeF枼!fS< i)J8%:f  +9ρ7wm]_D"lK!ފ =*\KmOh.A ! iP78j#.S(ãk zO mF?qCODOMNdZ SgXP耆NUaxwSj,`Ow]Q.]wNiů7vf_tۂ06Uƌ\ = &wQpR2Ysd*]XjY JR:YyEZf}P?dcLR,i3 +D&6Q8Sy&yKQ6-Z[6|]OOhDzsvo9%J,#g3G^ Q4$yǨ iZ]a;tP@4ir` 62o[YuSC6esN|iXܲDK9YUF~faY|zhWH6}A) 1LE.s3(EzȔĕD0+O&9/W &zoj~xe~j}w3oeAȓwA n0mQ) z_ٛu2ڢT4…*Chv&+ntK#15$ 0rli?߬4k,_p( h 'G .!%j3^JE-:P#5v9odx {V*tl#6IJ`!;d3 su3k3,<-C̱: }/^չoSjv?oȩ BϱԸT?/ݞƦp!gBuYmꪃpm0ؗ1XK¬1pt(.c100uח~VKZ؎ky![mnrCqB)Of}H9%5[W*)u5Dُe1]!"`i)g{LXc(5O y6=wx:q\r'=q=3;=gՋ< 耟b'zJ VCT-6 t=};R&Hg wU2&Za\ #A:hFpdс/qI M)9;pM Z>9)30Vѫ9"s0rYh`ٝar\LT2AhV@#L{Var~8I^DNáfSb%KxNk}"þh\ǯ๤e}ugOg^o^ AF2yh*U0]\ʭRL!X \fp>¯dtM3v-L^\<%6, zj L.ޡӟ=%jw @T%b/LV̂[ƻ2o\ XEY*ek}3jiD`Kd/ڥju5pgÎm0/ovJ.e*qu+b^*0HQU~>8ZeUS'ot`X\of'ёg KQ%y.mMV{o7tf,akEm 5ԣͿM!nAcQ!KK\H* @䂚=BC 1j+.X*ap ZQpwДVcwXb$CCR)t'\>/4/+VNdZ*6\V<Whw5͚0~ѳSWVկpmS|/P6T?hiVuO_ъ6MXu"AObMЇ9whhLY<ڵoCαX%Q)"ǒ|4w߶ mWi;tz^Y_(R[MF.e{rPgPh-Wf =%.!#@EpWfZ8Z>V0Ejѧķuj)+7w{fS7iz.k(eioTwlid8SLFt!m/aL/8R7A*Vx o[_v>~GէႱvJuFUY#Ws<rdF^`5Si F}ۣw\êbΦYV>Z}뇭z>6` (Y\LFuWkm,\K QpKA¥KEH֩}Cbj111CuT(7h֢rTLzάyNMf' iŨqw-RhxJ>_'YPj{=.j\@ Xq"3 6eVfZP =Ԣ&""%Kv%7ƍYqr}㺘eVXlMB"sbּ S&,9Snjo6WwwՒBMݳ釓ꭍ&鞬Ï,3 noT?c%Z AMy[E-{s67dL"7&!A+ȇY4,:k9Rې6o01J͢9A!GlX0k9H5lm#ir\[L2ag Xp0ewvls/u ɇRtBI] ǞOC)Sf=B_n{G灳1QKҏs wAp1 qrMpaf6%efF@$'V sʠCX2E2nS5|@K͢S3pp[*p-N1Sc& `Ugl'bkϮ% :ܯ;˄rk)JU)Ş'ɨWyM'("-K3o10%aybīb_61BXC a,ŤHEZ`xPˋ9:|#I %^SNExn]4`ZM-:G zp&~X@Zz#X)r7/XJ J_D &Z=TVEaKR_`1s2AM ZB" w52 4 P ` p M)c A=a#h)VV.Ñg.%kG9&#zgQF>H,9Y\ބt`pۍmw:N5-at+Ro:nLy>77m!7jG {+[#4QI&Z8n9IhQ&,Kf> 8y̪6*bs[YR5XGXUBFYDƹJu#Y 3ّ@{p}(ņfLcgzp:(z$ cDb g&6XXXŌB%hp;^8bCWzM` b x~K:MG<.>SLXn=7NV40:fY*@)a)L0eLELBX'sfZ O̮M\~T)Dar~8 a=߲)=l~} eN12v]4].A3^r*Cxױ`.gCHw8/3 rÞLFWs"8EH'  +T&,!6@PI5PAlz \Q@/?kqhZ3fq xTLm[:D7xhZa\ZFS]nߏ1}ϙ;>fqB=jl!钲ֺD}lBŻOqϳ5ԍ-ICsU_rՌ4OsP1oI)ljjҼ+΁ccp`69Oo1#[Z ]!N`>W˖_0½+ڲUcb*Am~k3s̎F"oK'oZlw0F~!MвsRٛ-C!pγY5J۟1}[8yNUHyf5DH4B9Mhd}HQ|$յ)Ҙ|g\s~Q'{Nl-h1ڭ]WhPZt]SSU,+ݎw/˩v2=n.=BTAW9B>y(@y JKkҴ {\S)pQ-1gf)|[V9Lgr!G5ahs`I^P::3|/=❶6Oohm-9D?VgMhުKaBR XXAM(\Pƅ|.4IHr 0{5VuRNE<:$ts-ߪ ^<թr<^gw|lQ[ {?c}$2( =*]7zXa2-1=ӝ132V- a+0vtUf<0j^?핬,o뙅 кeb#]!k%}eN2b1y~b#g'RRÞjLAF!h@ ":h*OW5u{ycxOX(1§iǞGٝ5_fMTg@Jd6+wzk֬T:U{])g%DS{7WzNZUV1 5R-1A{zeAmy_Zul?SGv[y7v/":T5O㎓/342yVI}IIHt36׹uqf/hkXs^&5f˚4SfkN&Ϣ&mip?3y" !l1u7&߲YSGifăIk*u_^ǘ=&K1a%KU!EUf0CtՃ|NFhtH@)O- Um_Xqib44vvN/ƞpPme39$!9.!+7a<:ETppoƓŧ|uF;&:߱%E+n]=?Ï9P䰞1CrCU [zBʏMff!Íq^بNj]8k(o^SFW|çq s32U٣jrx)r}g^ v۝.f]Қp[Uz/u⿹LMƺ\i`(XqB[/ݠBXEbYk") l;tz}R:ϩsEXu M"蘚29{w5I]C% s/WU)񕎃H$'2`^J4=vNh0JdQ2Wb""!BT[,}` bQE4ঐ[wE!,UE@zTRC3U9}>|_ ʨیI}vMgITߦ_y~4IA?V/C&85;s]j WZ6(2XLlKg`2;zK}.r?hKneb}a{EFo:g]|#f< yxf4d˛ zR8MҮ\; kiPIE)NX2Ct&١IJ*lukm/YRLs=gJӅD'h441svodl"dǨO^>e>|/Ti3ʵjӤ~6͝ M:ZXu:Xv/m@%cYRr>µQWf X BQf_D t}BŒNu\zΥUh]{,!p^˞DBor'qKӬ{LiǙ}[~J R8aXDnbpWt1(1dR2#VT.'̬Us@evZۜ\ȗc|[MN)ml':1T X\X[ABkoz 5;9;h)&XzK<V޳ /kyr~4{O?jU~> :J%s5sjskSA)%Ӣx=g̬ш:v4Ӫ3%-jQ9F!v=!AYDBs)^H$ƫ] 灕UO|«n64g)G{E#^5R&H;Wvւq°FU~>>aK&D6껬}4іk3rϿۻҙU9ߛsuZeP}gΗ^&>j>oCC⚽&?Zh;ZD.V6Ju.QJ^ at%dX[-3A7ю>q#PIݷA眝[kuEKփ{O$Q!@4D^O6 /Oũ2Kؽ{s"-Sy#ݯS>dn?IOKbsvc4"[7{wiS[G[Y7{厄jS\s B0bgB!(;TuWkO 7d(@(C  b׷,/?bIG<  ,~TIS YR>CBR EI\+撊ս71nC(-e :r2Bx I0!EuBtK8iPO$ /3jɺՆ B|e}3$X'w9<ͪW 1Do$ؼQ8"А8NPAcO%.^kL>K:J_Όjj>nb`~ko?bRdy^u @04[jϟYAsD*i S`2 ՑRWk9ثeϫK: N@_B=8vd#;\cDFځT W\yfEsF7L,!K&>D;lܩE j(Z &xw2TQl@$(GZi2$}R Ja5YsLv$1 ?t/Odz [10 (atg( O8 3i(#"r= d: 6;kb@C8Hrpw H? V<@wm|(K#|$ _zR~~_G(n( k}4Sx=9K@S6"%9 n.Exw:H%(Ȁrr%>V"1F5ʙqd("e0"ѧ㕄-s ^`pCxk='u(*X\ӱHkWTU8& `g:zba`mv8 ’ʅ|XH@PaŃrcAhroQ MN\.=$L5P*UP 'WLqViG]Z[{<<*aTT,c\Y'zr!ƯV߻OFC"q8p A"̠M0e&Ex<:q?c@bSWyh28E0cU.Ùn) cM:J(IzDcrdA~`}2uޙ6JV:Y4!pe?sr-lxxXƴ&bŒ loQ1w,d*FS۬KWɺ>ϿȀsd]|NX,C-h| @,%FMc̚b$GO;x=i9_Pj7 =UO|C\Sp> f| AVZ8藬yA1,iiC).0 Ii5Oz=CGfjDQBMe#7 ]>?Y^F)z?XY@"3 Wuv#«wd׮YO lzTVcZkz99DbD.Yhx}kب-S?%<gRD ?v.]|A?gf#ٯ(?x6AB17) Ҭ`̻*,R&A镈a5٦l\qTWv}E~-GA+Ӈ8ݨeKs ZcZ!d|$<M4bPfGS7ǂt|vmWf=ô8~D/}_韦HHL-^$\_ skjjkaW JȇxZyNҾ.k!fDimeuGt%6]X`GE 5E@-C*)Llp~N2{qk9^ݍF E$x:;MK+sx?cyv̬r~-1~]n?^C8eNDFSY2hc3(! e7H 0 K0 qwVC}x9>#nyx?^,X0ӍN,؁F,Fu%M-k-؁ɘ&pfzk00qp|9?sT )(->|A#y~L Fxʕ*hss3'D5 YVxX^ȉ߷ք+ #wcLrJ jFhڍ X`pqz˰S8[F]9r+qukZBd>G̉bh"L+K KhEXT4(4exǘXHipDQtt_69s<~ Ru!]̹ T_ܾMV##:5 H;€$aը¤vx:ޚ^ȮgHD7zK׷7?!P(%P)@VPfx _@B863-@v 3p|Ks^_0ՙM 5q0R. "YK_n.ɗ]]f@ /HU_Wg#Jq`yR}s.Kar:76Jq[XA*AP]K 5f]pXHG'g@R~1H\#_tSz# 峪waw?3kTʠ7A97PİlC0%vyMȍ~P*CT)LY.4XaT6+M}Yp.,Nt3~:]٠.=?ȏ7#F|GPf%SzB .]3 3F ɍDVS=<Хģ!"-bޥ:o(6!,n[cai,C+W|KzhxiK}s͸"NWH', i+Sq*QY~s/5]aJj)rsU1Ejb7o ڜ}uzr^-sQM1/)>n!I==2%)9t}+.CG@B5g;N&=]Wr{]qq 9ż[vw WkSgYT==k;ˇ&6Lli~ Nsi\P]֖=6aBd&" \vHGׯYD=R Kafnج,Ӊw3 #|JEO֡ϴzK}v~$VօMin(DiB—?;*!1AQaq 0@p?ɒO%VDiՈPz^V7G|<Tx*&O̝~Co_Ԡ@Mޡ è8n Nj?P[+&]^*7ďAq@e-d3.yRJXPQjE\E,tCk(1 PSt)?!2nc73 ET[ ') gC\`!ްj[inװk{ݺ[EcWG.n%偆ӑv?^"<^ AkM>*wNjlIi8V`@ u]Rˑ8#em QP2-ȣ8p|%pMZR U @A4OĩK%KJ!*,|Mgܔ^DًPG) VٳZxaX岳ϯs^N=sOv́Rr؊,@a-.`l =b+(_hG$v[=k+.WR4S([wB#eQz[K7ԔsR:Xw tǞ}wk"4-RABQ%dYy&H6$z?D(BfQΘ Fbz/o|lgWQ+BJJ G{11m,j>=0[BoJv=Rz׵l `?UjҼJA:naS.#D("Uh[%-pɠ?c/fe  tx@S' ylSM)B&:WD/>^h;:s1_r8^ ׺_J=(¢*[H* MN ls="Ja8;]QHqk guHɅDkHOkwDX$X^gKeIw2V :~?ŕRkxLU LeDw>[_#*@GY'pa}˓鹊" N*C'N cӃy]wq*#(lcHҽPQˇΥi6'ۄ\ZA9׌~ݗW,{lqIE5u+: ]|$Y^uWĪk32D4+B8Dt 5:CڿeD OzAT_ێc[o%< =>gMTr#xy;%Tcx3+5wtugҎYg$ف2#2V Wf\ax!nqY#]/g`|Vx_oCe') -ƋLk@f(X^Cq .DC[GK`T RōlؘM¢ LҔ@.c#i8$pWs?{ТUF !m*MƎ s \v ]%4G4nj4;!j2p/uq: <6, ?|Q?oq105{Ɔ|TS Bv)+a f[<#vMTbOhJ Gm&32U볣|["/_r])@`.,K -9h3f Vo98̾\>ź,?ohǩQ.k1Y2/.WjC2o4ڏiKC)ߔn+?ˑAAx&FҤ71{w3[YlaZ 5W 1Œ+ĢXoz&HޡޏN~t~^QfzK`qDrۄΪ@sAo̴.e]$eyS~W),ˆFǭ1U2bғ,[zwuQ0tVG)hù'9~``JK D1 BzMn(=R"Lntj8^24c(,i5PFZ?h beL"9aeCSBe/ZĤizwd*=[Ǎu>KkXWhRʶoWқVnhGGX8L2>#j+=QX ^JWw43ap9w5 Σ)MuCȊTVhK-P&3]n!V= O.㡤07Id-Ϛ k>k>DeAOׯ^{j]mEfg9ezwڱkƕkA6d=W{ͪN|V}b;S^ob#3%S $ |;'YF0#[C4 s_y| F9Rv[*)pyCOZeS7uYQu6̌l(/?\nC+ۏ=Oca_dCK3L"repuFNDqZyNQozč&eN;'ޗߙ| =bbe$k ]uw|.z=/{Tՙ'jmF1a#?}/a/yxEeU@HF/u3 ,uz4}J8Gp?|k+(IX*% ]A:;ktonXt6+~E;+:!b'DUf܎+c?  /`Wa#yysZU[c |毙@o=g*3;߰a2?ZMI "kr b +ixhyVwš]j6.:䨸 hUXBAiW`pt8W)Lߘ@Oj]ox'sFuaIjV/"lvQαdG(5 p&H89!DA5n"rfZ5%;r>ZΓrBaZXDp~ 5gRe5R#mּt!n7l\,G#QCaxJr .߃dOF9 ZN+>u&W Z `Q%F 5*Od P!`?eQ 0r#AAS:ֱ4[^edxO1 þ^ , $P̻ )H(xZ9! X{Efm 9%ih& LF8^ 4̤5ɺ`P5 1 \a=Hv"r%1!}_aGh9fc [+[6p ]CVh .W/#S%E6=(@XB;ĎTڎ"QdI tXË{KDƅN)GX~YcBuy2,eU ('},x̦]2kX?M/BEUGvP\~5 53P`_1jfh%\M _iΒd^bs)Ss~)13\y'"YF@ iH"{TdVլ{b@xIЋĉ'MU!qY;ft? O_tQ <} 0~ sn}=P୭VkW*YPl.0i> %Piz_7 Ko!:FA. }boX%AEL9/%@إ6yVWC'絖<,;5.Ύ!~- E VUbm}Uk*gbGx "</fXHCdX#J-E`i&"i"i0P>QiY"R08Fk-wqb"B•`մYiKطZ_&> HdW-wz}pn윖>xbBS"n!)wZcB6Db &]jSQ:td JaK;{4:38`J5:fs/DlSei⁎SJ`,(1@v8YVCG]=Bp ~qk&s'J(JZGIs`h{l wK +fQbĺxCmLĬQ1f$Gc l#|JncᗫNĜW6K%?KOVQšO?~*.Lxql2؜#H-Q hN-5I*5=i@c ub(JZ@j9.:`+,tnF2IneJwj5~Pt4}0Յ: =ĊsNu,Հ>5$^bU8 na5²(hӮu_HAF ysA~~qW||WXu"k0F\f:OڔmrB"[k\<"8{GѰ}v OF|th/r08Գԗ g@5pe05( r(xN2OK> %gx8Iyo><ߘ? VDPX% o4y,HSHҫ}ĒP 26.忶^E }!R ]Uo`d)IVCQ|g`-EF>k7֣eM. = 3 7Ek: S`+W}9K,  DzwPCU)z#]"Uo/ kgtX9r EHє9xy^RBEh7L>34=/KK8z>q!C62mN1&gyAnEuklb]y,XL1a/gw.ؠ^g)@gJ!}k9FYNJ5U.Sja}zd~ȈїVufo7X3.!@hpeA]N @Q2"j6c~ŵ7MS?F;7;59i[ )WHܐ{ jZhz@lAvƱ,u1-2JHDr*UdܧUY9Hڊ$u/Nj$ jgGL5,32AIfEy ]}":E% q๘1^3EE?lT* 6n2fC\o_MVw]:aA3}|e˵|2 ?kY? `}@He8S%F0B46ZXzRT,JTj#GaxOT B){lzJl=6vGws;#h2&΍fm %>5XOHF)kYXua,@ a ^M H@[M9A)RFpЙV .޿Dh(1d(Blz_.Wp5dyh<wz`![Y7܀Gh9iS;:au?|62br+ M rkQXŬӈJ _dk$.!q(>AVoƨ?KwFWz~.Wrˁ?k'/@}~ǽFiȉ}-ч5R9zZ!hab0 '1 (!.P<]8ܠI`Tq5*4\v\U7KV.!P@f+2tʫq-ޣxސ/0g2Ab돈JTAXWu _HHTXE4 ^R낶 ͊zb%QHs/,bXGy|ٙpCxéĶSIkmwCqYUa? mCO,j5 LW K5qK opKH a+EYܡ mn𴮡̓Qŝ".7r=)欯{hAcH5 ՘EP`ɫRTC,E\s _2U*~k}}̻gsjz0ꩀ*r/U]Х{m3 7aЌ#70dFDJo-%FJ_9\YWbR=`j@X0K_Dl/4&6хazLr1xNlW} oPen1fymfh;JsQ#X.Aq bPy:SjAvna@4#TtB^cS7>D!jE!pd+>(fT<,MlԄ$u b:XN.9Kpp(i ~{K e20}K[X7. N<4cF .Jg'B:\!_c87!˻}SĦ^K='U=_Wn:FN 2qwp# . dBɇ3JPx ף?'$I?@:k}{i^OZ?z+c\Uw;6sZƄQ@=g_naDLbExnX6}WY5d%hA(.J;.U7,S-k]RaWDW+XZ`A@ s-L%R%0sq]c>D6×,~&p("_n3Pz9DQR7 |@&3x+̢1e!$p ,>0 W(Ci??_S7/#FZТjB W7l] zi\V+Պc&;"Vb])Cš4]A"ZDtFre+f.ڍВ,˻o]9i_|w>8oK2rPbìᯀ;+! e{!;=8.QKTaE A`}"llaHN@]р &XG6vXXơq"jJ`Vb悎X]%vL^1.Tnj0|p.;gneF] Z*aNqp#xn{4 UtJŨL{ߗ{ua`RPQ@JY#Zhs6 SNJ*(!T]e .Su=Үz#?09̗9];fӺ:OjlA1-RSW$ >0(Cy-Ur@ޏ^-epPż:4=@r'dGa LJ#fNWr~XKJ0]lzQǬ tそz!ԶJ2(wVbc2Ċ)VDM$g(jt͜J">8t 1N 析񛨥]7vu廿av8(}v@ws>K~V{ {*l|y0/BDK@ieFe=br:yJ]qs:y8cctp겛BI@" 袜0GW0" QFmޣМAȍ>** [@x 0]XV/=q ݩchYf=%,(P8?]cYv׃!)K$LQ47HOx+Mv٧%0ôŇ`Bѵ1x]&JGLpɰ*tSoFuzKSI}V1P>N@HV1}g7e)׋WՉ>©7@5&*deF[ƫ~wQW$q,ЗA*{KVe8;>A#` P(pX2\jj*,5s܍JEd-Ĵ@wܚHA)];ۀ~ȎBpK1 '{įlbIatFun_%_(`-^^~+R]%zN ţ9IJXcS+/긕ل򎲒b7vy,a;b( z#F+r5`gyRkNh`>a*[zmQICV/ՇSu=N x&;"Vb]3 PR ( J4, 첔20UOC8!@WLwYğ+[.?GxGWo%Yd rp-zY&!АfN],P9nEt(vl+,˭aV-ߠ`8G! A2l+#< |"xv|EZ@!L\k,""vc UԼS)Tьp qk"t#-BS!%r>rdƣ ="9d K-bļ\>P|ɂ ,}ELʫ8@#v$MPVGijoU2<|3$KBRZCBfR@. +^ fB 7Ӛ?NN[o7n je9r:'yz`<΃: E9X#[ %Ha Ԃ*> B-Ff^i]F08idf)wr`Nb&uEׂl j͏n_:,0豍-p(.ZX@5=1wN]F6)g_ L0b ye&jD@tRL3Xdqd(:9(?cW︅Ҳ1,@YJtg!DUy$7}&L!( FLk?޽},H^  qvަ7~-./*;<O{pb3ek;aq ( nRs,lͻC(xoLɥtߙ H@ ޙYcNta*P zJxWJ0PҜ[SO-㷱F̌4*И$2Ep31+[ty| e,0{Uf_BԻyP^DmƦ1s)OXH Q-T6$uoD xLp18!\jyA;ӣ -|KLhΣc<_.N}(rJ D'Fuyk2cJ1:_Y+0ifU,_HM<.3H3{#a;e =lG1 \Z3/[C*[,zpx,ZYUZcZ΀/#Ufb M4ͬ+YDeݔVдht5Y… &UD45vW,P:] rlhldD@,rDuVId>siW,fZұ\JF2, s̈oS1SײxKK6c ݩ~CGcTU?A:$| zGtO|+$\P)cĻJf)h┑x0{oџqp:HYcHT%Cv#*,ob4 "hF0]^FAbY|8.dC 1lM@&zh0A23k0xp`UGuzWAJ˱pĢs7AᕞqQ֚E)pG+KZQΝ6PKV}VIdhPf3BaV̑ ]eՖm꩒cN&bUJ6Tb8u3 %>sC>U=.\tclh;x?l?AgIGr7N ֱ(`fT$] ԇ׋b)+DĞzD !VTBb(}!p"*6Y=*ȔG"@aߐ 1Y5.)2 VQ14Dk\կxoD7TΆ)d-v6/bpThrv QBӮF;i zܲEY0Bq_ sG=>GK7}crUu6(৓X ;/sN?Nۡ0}iGZG}>El9%D c-hf !)_RCx`Zk>#S=tcR"_e,p26(?5ı}cG2d!^ 5уcۨ' k,.ReR EQ\JtjdBH \MbԨX A&Ll(fUCK@[ חqKټt(tŹ2rAy'.`t7OaJaD+,ގ:ReSw,t$K.2Xn* ܮ>`?.ENPX!z#(F1\nO,PLjrB1cK2o|⩗ %Sa`c~eac+~0]HVw a'3KUQD\_&P3.F't_Gfʥ]5l@řP0[WXёQr_0 ]C^uջ OpFCelgD`UYs̛i"m5N-@~hx&l;UrQXL[iFh (ir.׷zS Rb_R*Asgvov\ z:q߼ }3oqI&Z^e 4 `5[ibk0%&DDj{x3.5wC`&A^Dۉ 2}`BC+e]s2SS1?/2ͣ/eYKE`cn:Cr/рۊgH6`j8G6kA22Ȗ.USJ_˘xFÆ\_[z},K0_gN>ǺL|7]Vp\/u@P+pGSYGE]:+^YN-_x; |%fX5e%uQY`Sq:J 0dpA凓3^L,ZR1`J}nGzARu@3Fgz/C4Ba0OH ؽr/. zC 1!X cd?߈할(x T%%vFQ^ }pm9ubϱ!I cj7:sP.R+B%R39KA  Lc .Gl#f,KOLrL:>ѕt_P#qZCc fuAI 4G"x̸|Ţ{"F2$RR)A}yf6.*`18dwLL IC:ƏDHB+2lEtp&qP{@H]G< Wh.zW _DЍ@<`Z;>?O`a~>ߏ5za"(غz Vr~baN*L$G L f*XMJQnԼ@i̬'bQ!B0EGP5\=g$' YBXE' T PgxH]$i[?2Y7:uFK~_hZ"[ 1a6r}-q 8[* ޛt}`uKO,l{޿1|m: X(%uV ijpHdITC s^G&lW8cX'@u^On@U:h4M-)0y"jRbŠX~q(0' D"IG1ba$B-E48c+:EN,yDϬB ok/1G ̢0@Dw6kYzPmو؉t.CkXJ\ʾ_G=1'ˎ~xQ ,^j/_>98Mhٿ.{{Z1:=G,\ʶsvFX€ՎMʓG N J#E' zD z)uhlz+g'm͌5";$JԣHjud 0)zFl Fc!yl@g#A"Z1*ElVTF+,$nC +ǁox+&q>5U.S8[]L3V_o$,i>KN$URgAaIU*Cf(ذ>zb`]x׃p14% -BXV.th+ 7t8j&\.ң#!s)VW%_`!i)#a@LbS"t3$!XQuX@J-EÐ J&j#3Ř<Mx%FPKŠHuyXx( }r3Pק=sYANk'x_ßlO%\ Hd2nDuJ{NPJmv|:FDlU#BY>!1(6^C q6B88Y<"u0"= qaY*.3r%Ftrq*{JhJC8G)=u|= {/a{Y/vUnj SՄłpk]^qD8#, PjhATP *ɬR<^e.2ʨQd[+Y0e`^m}.Wr˜諿/c%l)hKfjet6 廓!mB² ̟5j^ydyh<U^D88LMG.<:pVrg63 +uF$9 ĪzxY-0 =쐔/Z Jq$h DP11s{*IK#Xeqq68 WȞ @"lh_h5&y!&6XAeəOF2Ta{J 7nZ!u+#^OǺ+V4 GDNѠD?$H;j ;uf]ICq EJ H%` 5k}9(* /S1QvjN9aǿ?]Ȱd)P((%,hаgaMNMVYyM@oض鱷 g!=hMA#ܡd`ˊSPC\T;"wӭ `p3.&:5nr,W{܀[Ir]!-ơPR61ԈPSJ_ю5qժstl,~y 揠*.[R hĽ2S+Z;\052f(rҮG5uuY.H:)#tv)(%U.+ %(&b. V6,DG+vA }rr zCT5jBB>hQa$cbȃ C`_d޾Sa&n N`)[®oߦ/W2)RtAGPxe;,YxB7H+D8&PZEPpl3mK,M@MZUNr9A,*Y=F GSr~PFtܵto$ Qn9}-)b h[* 8"{XBB}R# &Q.["Cb5DKN{/I vJ , rqsPݥy^OgיwiN-=v~ &"rǟZ?zUh(򤮁YB2Ax[X-\Sq!Ut VV{L1/'"yjvAz[4r!^7w)%nejq @\Za_fY;ͦV-(uw43d&.+`V@Pֲ}9+ۿC?o v/F?,Hl(%x1׬)ͯx'}z@b2KUWm_mLHE%̵x_E dO Dzd KF9cu؋0VC#PKݨttZ\xhº#u,lxoH?K)h$zTᅻt%ÿU7bf.9_s{s1fypY+' eh2@r~DA7Zd29j f,|UP8qkDudqQlYԷvn}O'Jy=3Sղ뼍nbUף1MSPωΙ.45FTdHZT!8٭ [>lֱ9pVFU֢N:F/+Op*f:1iwDJi!pUmadlPл*EJ`crfI6(r%}q eVK=YVtn0X,@w F[^$POZSWk_{CΦ:p/==q<_sdFWtb3[L)oѻ(lٛ aa oGUB2ϩ⻖ vS@%}ws{c='q-F0UR!PUED5ypW[s: QsS>vdYf)=· ƒ9WU `.S|E!<̍MkY_0_HD,,DS ODՍ? ŋ2;Úh !rz1A1>A Ch.WEZW˴!,SuW(9U(BSunk]7Dj2!yjReȥ~8,4jR )w ѕj*ER"ۍ ]j2_eAڙCKvNq7=l v+',ES62SV3䥰,b ;1lkژ:y<֟y1'~0A)EY[ ɂb2K `hJ.@J3@UYCKNp"ߎ J/Y*h"I{VWDQ7tWMeM% .؊&ER(b C]RR&@As yO!cfB5v:p/G0Ke'. +x[w]"(F 7bXۡǘ)jG]]\KJTߗJ[U2oUu(eAu  .T1?eڗh 9c5Ձ.>kАH-AR,C>)([ ,]hB&.e7ōAz2ZXqsUW ,htdySb҅[pM:EaS1 lC|á)|/-Hh 08V3sTKDK3 0?<V^=0B BRsNDءy%j&z*˜O9,PUz6nyKmUF 4k$H+ZՓcgAu]U%er ۥLMav?NUX{@硁X l__{*2S7 ~)WU,Tȇ+wut1lYvGy[Ƶ c+mOzըQ5uF LF䎊W+VrǵƬaPBzPfv4}a*eAw+SP6g>93V"kT\UJaY&(,MqF)C}5E iev ebJ쬷si^e`B ymt M (h'9([ CzjꔾW{Ư8sFӡ\M4]^KU7Tb2Y,īV{˯6ym19fSizxn ۗkӊ {??0RW&u2VUN`a7VqPAqua [=hu;ՓO9]bn'p._/Z{v̊=`ߪ`7~v\'Vvjc.U@Aմn_Gv\xp~q͹3ܳT6dңf8ki*N$c2NIBq*/.I'G0?Y0gm#۴_dWGhȯՂ:L;L-,0F <3\OP;.?}E k [][Rp0Uv(&Ja1-g'}` +$xHfFSm,a(XȐA arSp{% $uTt)Id>[RqKmԑLZRQ)@)JP{/qà.JH+M(d[+tmsG0z@Irp;x|u9,gJ5-vAr%܌ӈN9}Q Y>k>z:srB0+Vmcy鵟ls=R\Ɇk>zmgA +6}π<϶9&Vmcy鵟ls=L4Y>k>z iY|}π<0ҳmgMcy2af϶9Y>dJ͵ls=6|Ɇk>zmgA +6}π<϶9&Vmcy鵟ls=L4Y>k>z iY|}π<0ҳmgMcy2af϶9Y>dJ͵ls=6|Ɇk>zmgAt~}}؝ǺnX۝˞1j#VeciCi<ͽ2ZPw-32kmgMcyH9:x9tSs-R.:o9Ns1LQtˁ.yokk愫(Q vcy鵟ls=ϵOG17lDH0;Fr)@%9n!Cr([ش=F+#ꈝ´=AWS϶9Y>8}Ńr2!M౥XY/4TU9G=eEm6RNC;qA|}π<9[W)h[M.REh+wtrNMK4AoTޓ=m!'cd+r9r\|}π<9lYK-o[ qTZQ+#)>nFМMޤoc㲷K;}π<϶9Zg~aȑK z棻]@f:#JKbOl V9$TG]mgMcy OGN* 7oS CjO$~˖*Y|}π<'&Vmcy鵟ls=@Ɇk>zmgA +6}π<϶9&Vmcy鵟ls=L4Y>k>z iY|}π<0ҳmgMcy2af϶9Y>dJ͵ls=6|Ɇk>zmgA +6}π<϶9&Vmcy鵟ls=L4Y>k>z iY|}π<0ҳmgMcy2af϶9Y>dJ͵ls=6|Ɇۋ`FR 9#'~|KqKg282ygީ+N[͹w\+OK! چo^ =Cl9Qjj Jx{v#j@Fd1Int1Int#$.z㷻3vkT.75Z[f UaڤDS,IJV9*Wv/>8kWƖ% doޯWk|ƆVm\eEJ*yXu=б\IO|GީS[Ė7[V]ݿd#v3OAqBF9ZzC=ʶ~m^)JUJRR( MY{k&qf̵[ R%nᔤ睡X<Y{jUyhqR,e*VU-#.Y1kT\y>܎Ȃ:@F}1aj JFB#k] $kA2f] a<5KBmJ ugM'R na0HZX K A'NIͦKߞ}Wɖԥ˖DZ-g*ϐ8?P@?~ux`]p7\H>A P8Q Dh BPF,&\˦uomC7Hv_J'65cnGV3h9RN3|L+ԂNǁvu|Q|:D*Bvw=\Z`r±qg]Q k$=<Վ4F" _[m44v2STnaϼ2:Is~Y´J.B,/ʌGjFA%ǰsV1y9⨽WQQhPVH)BVw 竖sBTuNZ^uWLgV9Y VQ|NKeI ۜ 89vs%q"YBJGäJY?=I?֭˞q9c%52!?U75Ey5AJ8tT5"zb:sTEo.vjBTwRW oZXnV;52#CnHr>OI'I5h9{*/r&*}MzC}BJL9G_U\j]yDI6uq Az-Eehz\g\ߖp$~RЪc l$T3\>\1foZm2nL}ć %!]XBV+h_Ad`VMiBJ~_XI)>kW q̕Ċd *ې3ujοKVH*ji{RawʛImVcr::i%oҶOFtnKͲJRe49V8V&xḽ)BII׬`aBqGpg <>#/Ѭ7kZw pC|>ۻvhVԬIۄ,+,SO)i1>ᘽ+hgJ; vx5qc:8O/;{ۗ]F{6}3X-KopgP X }Wzâ34t*l 1%UqZVoqJIMtUŷ.vyH$*+MմBLEmADz{(j5awF iҊqѾ^Lz ,28Xmf1Z+' VLh&dJKJ2r`coX<5W3{3dГ4m]l(ZV7o [00~|=uRݴGʐ_`J9*ܕR?W=`kn^j6M[gAp(8Q܇@ ʻQJ ,t{EZT[U.ϼD*:K>)S*Jx nX6rȒޙQSR$-DI#clH?Uy+jRZ%RP.ܔF* r 5NFȇ~!Li!Ȉ@%M[Zq*` [_ޯDZWO,8P۴-94|+Sِ&4J,J=d%f}P 8Ŧo>QRko/u"Ըk9V|؉{yU:hSOGKlf+Ң DM䖚VBH>d}x+m-(ֹV΀u ]FН/ D$˱ś*-.-`w3cWa26#5#4i75YqM>yCn2zx9+~5}T(7sk= қB-+;Tg_DU3I>EQՕ5%Ljqmr|79>qiq PrRBg]ajCJ aE׆l6H Rɯ]j槫[|V2gFbl'GSN$nJ9h @o`_VG5=]jŻwVxq&\Kji*9E%@2R ֭܏y>jzվ;'PԞ䦑ަ١KfsZ[KJ\i1)*  }m~O[|u|w#OR1X1 qaI;R2yCIј rQaө29G_=zվ;'OWZr=2r,1M?~³É4LB<[SIT?*)*8xpOWZr=VG5TR1}QlХ3VH-.4ܔmiJu|w#Oo{U)IlKݢm~b&!G KM'$JFy|VG5=]jz-(tf&~q}4rF`cV6eJ>o{S֭܏y>j-KfC;+<8D.sϥ4IRP)OWT|VG5=]jjOrSHSlХ3VH-.4ܔmiJ>D6̿I\'֭܏y>jzվ;'Ufk,B8ii䝩Hjzվ;'TdVц[[eB.46`dI2WDM.54mS /zKp08[|u|w#ONyBRm.x(:qz> 4m$sYEG_;վ;'OWZr=ΖW}\5>\/Wƌ}HmvKYZD*=d6u|w#Oo{UtTNY;VVjoJ%LR(B06#@xj_:zվ;'OWZr=INTTb>HqfəI AQNpkY8%D_?վ;'OWZr=,ԻAMcG!Cmޅ$nuu_?վ;'^کV BT<{\ǤٱE=v,1ng8τכ&Z'5*-Kl‰.,!hI_`8d|+MYp ƿ#t$ :qm8`Wi/  Z\Y׆l6H RɯmzW]HW*G*uUԐUwHVl,8}͵>eJ>/uMbj[ 3[ãX a@B jmod&ۭX[ oЄ!dUE=D{"J+:Zˇ5E2xeF]il!)*Phgv1!xd³>SKaπq ?sڗTͩFRF9D5bL)yo}GRRIJHH ̩Gy]-֭R@_K=!HA9 7暺ݺ_,Ew+V GdS8=%kT7)ٷZ>?oa+fcW϶iBK 'ȑ F d{⵵;gcM^ :ʔ|_43YGVb~ Jڏթd{eJIE@\{kc' /Y;+{Hɜʏ5A;_$:@oOTeu;?sM}~֔tBeMwH #:Ioyu>+>|jBP?VhZR82yk<8}];+M?~}Rk#߬o؟ ^{qcҸϪ[d{ⰫP2I6r\^7I|R(e/c#R[UDQJ *2fձd+³TK>CҾ_vl)-_:buuύIgr]c>|Iroс`8>jīkJ[^ dM)\6&ԋNWw}5g^K rIOAE>冤KlɗdRq7Ҹ{TN[r1Ԥ$VK#]72vRQT< uNS?#Ҿtu|w#Oo{VK5Gt=]j槫[|Q]+OWZr=VG54}J֭܏y>jzվ;'M,eEҾtu|w#Oo{SKGt=]j槫[|Q]+OWZr=VG54}J֭܏y>jzվ;'M,eEҾtu|w#Oo{SKGt=]j槫[|Q]+OWZr=VG54}PG=ʶ~mr +5DOkzcM%$)*Xux u#R[?y6a/*JRR(gv~na¡)JT)JP R)@)JP R)@)JP R)@)JP R+䷠\RFw{VՍ9d\NUfٻJZ2Tqj`/9+_J&УC~߳rԑ#Jʑ[&,|k K6?lc1x2ZWա,-iH,ds ?IV9H*K`&ZKEw89d$Gv8B2]RǙSW6Nr韱W򇂬G"Ym*tGGkG',"LT Tr峢&^+0M5Q)DUsWgMlӋɇtU&GyVcUN@ZK@ u^ Jk&v;ʧ-`T#pzY?ez҅g*ya(UWkTOoΤ- U+L‡B$y`oTr,qϬ˯gĘ~;ͼҽPROS/`VZFTfV0ZzRrEc\M",P[B jU2{Bs_ 6 XmE8UYAN*jhY1$x9*"# tmJI5Zg^Gv_S~?EN\:ٕT J>LI[J]RifoixPlq<շ #zLQi2_rg.ƨJ.#?ԑCZ0RI~mx|ex/J*QbJ]0$TV\IJs뭕i8u:u1'i5\ .sRBoM@)@)JP R)@Kh߷ / ~5KT{l7Mw#R[?y6{V┥T@)@)JP R3}_ _?W7oKPK*H()JJRR()JJRR()JJRR()Z7HF8rVօ9xHJB -J!)*QOzLyw b*%`u6Ӓ]Q'0<<>\OBeJ9>u;2Jܾ*jv4|U[˝L4ytN Q6nisL +꧹R1}gqQWTT!XDŽ~Qΰg:eJ\ɝKynokT֮3S8+!}oqNܵmwjZRJrI=d֤ETW>Y*mkZZ"N"""T=uC $d$!Y˪ZO?Cg쭷?{]jI/5~DDTduKxil1W}?h!Қt&f+YI.MFJ_]lIsɨ ՘7ɶ2~e6W3Y^b?&)JOzy- %C{8yGW]ICȞz;[[b!]]T/WX#hCmҔ! #v}q8!\(x{,;rR'y䏽~ԕ)]e:q0XG5:-RybqqcU/#z"RB:ROUFJ3S&[o(tHRPzQ58Jz&F*_=62RHGSKF"I<{K/ὫP_5a$TIOd(,n.9;'I bry\BR*?4-2uF{@MA͜=M6?ͪl2rq̎v|#8-Da UO3z.uޕ9ҏ*?h9rb;*JWNEVC1CH~>ZJm[,SÂҞ$#81mh:CTw-39>GtZc.|͘T qO^c9=gd֦^NPs Zע<?s_u+OicQY_op)\DuUKJsH~?o\J-8}0#5~4$E~Rg5 ̙ێZeĕdNO|2gOZ 6ܝP$yFR;ë[m1Ҫe{OBQ쉍lJWQmp2˪۫;p,rim?C%dR R()JJRR()JJRZ) RH#kyw(ck2;)jHsW=Eya^kh%_2/]a7G싓*$+mJ#Ercv<HQSJF|?&3:Vr}KI-ryAWYQō7Տ ?R6y^椲)JVQ+,Y*}X($PX/"@#&iVkҸՊ_F]Zxh.M\7$䠞}'Ay@3ĖBk8 $$?^bH6#ric)PA9`'kt?5=qeKrcrIH7`$u |;C«:xϻR'$)JP R)@Kh߷ / ~5KT{l7Mw#R[?y6{V┥T@)@)JP R3}_ _?W7oKPK*H()JJRR()JJRR()JJRR?kn+]ސ%Hq矆ZJF~PHK\KO<5:~o^K~pFjiX^j䞺ibb:Z-rt~yP7ή[ŹWQ .rvδlaȜAG-'#'5 ӻ>TN۵J2*fVܤ!M?xkz),uת?ygqPHʫh]vjey2b~[nq|6 j;R3 0JBVZysKQϿWW&^Y:.:94^dEؐ]Xlc{X$@յ{/ZH 0Fj+! FԳ\E77?\ +^A To{]8yYZF_J\+>\TضCwhԕym5drIG]kk#NzZ^-ljGLG0S7IZ>j՛ir;Ju$d).}-C uk>-FIzM/2~vN?聥Í)j\.F$6}k>i}e3go?*Ui:Q^~D/]ڝ& tGJf<* DNOzBT\g|ՙpэ."?V ;_b$|.Vk1.wATQ]R~1^-5j}E\/6{H`dcYz4lg>jƳW."?J6٣=i"(%+2y*GN[ dym@HϾ|j=Y.ˀ:OGRɊ~k)#j&u$OgY'eSU#5b|71.-2߫&S/BX@ʁQVB{|ZPĂr 2ݜgg8YcV9-IÞI TF/V ?吷tc!5{~ygRqPwuWQaW?<7\Ʒ%w/,'P^wtyms<׈х ӂLRR( meA&jr\FY}c~Zܫg&/tJؼR()JJRwoKPI9*|PbI)@)JP R)@)JP R)@)JP RZ~JR Tzaqʉ ZH8ʩN$^7$psyEyk&K;HRk1ԍG]G1XC2i~\PjRA\dtPjmTaj-gBw=O'.PKE$y2ϓrtFP@I%xܟMo+,~~57=Nj jvK6 VI%sR@HV ?Bm' HUu~^eќ>D}F{bEF!YV=oY~hrqHUH+=ѨWIRE㤭_R't')D))>y 1V(y@F@Rg}mVM%x=%\[yhr4*c[qQL6+ycU* pyEU)kld]IO~Ҳmcv[$OBST5T.q[+]₎dYV֪z.+4K_[Sp`e*bHJ*.3B@8K)3&\Qr<4c蔤u^9dcigmU)w jw*uÐzqβqQMl :BG샍Aߪ[m)n'*RR<$I#DiHH]S*RS_q0yu'ќV9*8uAd9r4/k>u\Қ53fFtTz*59]=E!V(VBvZ ,ir%:J~56:۬ZJV ȂX!S8eYsQsԓQNO:rC乑-kij w#Xkڻ; 67<_+tjE)JJRѿn_tk*ɵ4oۅ?xG=ʶ~mRD)JJRR(gv~na¡)JT)JP R)@)JP R)@)JP R)@kOcTmhmOrHR3^V\J Nݮc?{IjWvOҳ8}xq^F% eȨ{ ḕ6JԓKuԴ$%u?!UlI RsF+tE^ m8Ua]h);ju2|]K"dq Պi-_OV]xM(rs_ Ͻ}j`{J5~zޥtxe(POsxIeͯ"ra*v+$dCuc?MFvPRpA *QC3Bh`a|w?j$>ﱱ2QwkuU47R qܯVnns\MқP R2.+^DRLG$c?S1UjQY,C %#tĥXy\u.i<:ϗr/0j1?"W --jxWBSRz0u5ҥPH'8@]ּZ5x{U%H>Uu^պU٭s5j`A[9WoBddVuJÅ>dU?Bm̌ eZf0!I8Qdr5 MbO9:-Hp +RB R{r=Gr5r2J^2{y'& f&hEdZO/~Ok?u&,i/+^'=w_9 R0E)JJRѿn_tk*ɵ4oۅ?xG=ʶ~mRD)JJRR(gv~na¡)JT)JP R)@)JP R)@)JP R+Nqb+VR䖂πyjaJ:ӕIi?/DZ:6*C #<9>ycmJ~+Sɶ+<^U[aOa)S sKk@VH * t(Cj`V sn6q!( *+ q3h+Jr*2b CB2W$gzag \ Ӟq}`VHj^gMCwvk<9`ʔBFT[PrQYe+2fikZR:ɬZN 8nrR~I89D~N|`e\%76[a )_Ͼ #gE*՗>xU[Kn޷DfXa! mb@m52+oIyVKg)y)Юʉ7PёUlh V2{(9?ZWEb|m(oAS4<M2QP :m) P\ ԞKG UWR"t$sY*SK)"0▰0zZgw$mu)QY䚌wlsBVVO1Y3m &X Rmjv9i"6Py'5-צY+ ȦR"9Q{ ,u~\ˣ|2K_UY%CN9sx Y+\2Qe7qJn7 R4!R0 JZ*V*K޳]Z~̄*یw?XbB%+;֥d皏3kbntEun6-RcSbPQbS2 ds#xMOHܷ3-StҎ +N ~>s,T!$֣.s %Yʲyam\r\K"[ k+XEQӞ6k1tQI) }J ȭṶ]]?ۀ.Z)).}j};:hj֝BmhTGD[^Ils:Zzct`Hםi!Iy1ZJe*'I:]pu$RXu[kC<TpJUbKaK(U{CZWmے%6ӌmWx(c88[T6FuD8Ѵ~XDHd=+czH GXʢ'[V|.q7V&e%KNVԔ*+Yοcrȵ8RTzq dR  XNy9n)b!ʪRBsQ; [5dK s2l~*Xa 6ֽ[@k.2R+X}ЯKT;\ Rh)@)JP7Mw#R[?y6p]HԵGVM^蕱x)U)JP Ra¡ >,x] $Y$wkfpS-!zJ泥 KroJaSzJ`ǼEK }iP[I*VeCKRH9kU /&sSs]ƍ+bk eYJG띭FTj:s5 MTREJRR(E_-] sA>_ؕYoNE˴+΄X-:NPp[cT0Iy)Ҥ+ CBy W)[ {ΖḧhʖzE~|I=']Nm !%IH$<~ZJH,)R6P֕ +W υs% ȄP{Bn[%Iܕ "/<ָͲⱻzd#y:J-4*K%O?5MU+9JRR%oۅ?xG=ʶ~mp eA&jrT+bJR R()Jݾ/?C}%xuB%R$ R)@)JP R)@)JP R@udI׳ςJVEykkIJϋ{/GM{O+wFFMVDղy) +%@־M3nEJ Mm[v%j^Mֵ/am2lסpOۨ=77Mw%RR()JYIVP<[5~K?m-^-PqRqUe% R薂:+Q3a(r%pxjHu'U6DMZiSyq=BVj D'օ{Oe'*eyo#*hxdR R)@)JP R)@)JP R)@)JP R)@)JP R/S۵OtnK(O>GG q@{5T'wm-;=・XU Nez.EnKZTOY&mY ;R,hFRZ*@2tn.ԀUCh}BVHd~Bj!q;ΚPyqޯEUS+DS59έ>UFf<%%_{[xkφ׫[R4!JR3B)JP Rp]HԵGVM~,1?u-QUj%l^)JUD R)@s;}%xu}v~DJRJRR()JJRR()JJRR=ؓZҕ䨻)<8T/Ok8S͐wyM#mqoy}l TG'FY,Q!n1c?{qB%)BF0 ?ùzy~3u0)JP R)@+ EXY˩*iie$U~ޚEy:ПsOEGtjYo]B$c :Osiͭ'gmNwT4ۛt2+qg H+B3^'*[GYBOH?ӯN'ZMJCiLBA^2;ZR>8ӂVqp_#RpF ~VQqxkb)JE)JJRR()JJRW7/3Z QQ~@0+UGPnJq#r2_~/S Q>f߃8g\ȀGPlW gsxشtis[a iB莱@9u5|&TڂRдHQJ| `k˒nֆ.6jҩr$#[L!8j':I% kAQzu Q B#2DjrIE*FiBsgPk]g1l:NC$%9$sW 7+H@->gˑyfޕd,yx8ǃqY6Ŝ)]4B lm[G*[RPmdHHY߯a3eD+JY$! z5ʶⶐdqYYK(Rj2TuR)X‡0Gz\4PRִr¿sɭO򬧺-IlDJSro#}"5>qaȖ!GB/w˙uTF8ZRԢ(̓\;US'.=.(ȚqY%)r;ÐԼA{n> $rO-\m6žxW[zkhEsQ&nZ*MP¶8SHV֌q,WME u)LKg9'V=hkoekU/撨V=pˋ;rrZ$z*@R'aYB[YoȽ :%z*p rGCVjWN-4p2i(?me8VAbn0.C?%o[Up8')tJJ{=Ye[,28U8Sy]”k @:Yآ]m+@ ܐO8ڮ~O6awͪoeI'p4;63͡cPO.Nq߭U(,n~v|·~4HyN'*L<$ǒb>ZH@mp#M+d1)5ـw괙ʱHlI;kdJ Pݒ% ૾j.6',ykjh])Օ dq⺻z=g;ïzm[5Gt2M]/e(dm;c$ϐ=VJQJAJpA :gե:/LƠʐ?*Y5lJP:‰J'N5y>z7502;yqDda)=5#ټ9W3۸,:ɹQV1X-otg(wպ'ЮEu,T+o/'zAkCuq-!皹1;QnVi[PqUuG>\MWKNb=;>.e̩+*Q9*'5,e(HEsX(sRA`:dvTx^я uvP\>ꛛ\n[ (ds֥k-+{a;[_ԅ[N?:VЄBa)@)JPv dRSd9T9IJNjѭ 쒱rc|ԠG2F;O2\h5EH.ZV!*;HNkR qR H{Z^Ē]xye#jK Y^ HU$JJNyjV, (!88'_%Mج}7-b40Ajw?n>bVRؽBw1tse?x {r+CV,э(鈪櫲.Jp8c#^*)U9j5iFt GiA(uu6y2O𚆌@HԎzr-23e qY$VÑp#FF@HPD 'WeSJf4Tƈ O.uy S:p֣̓$`ZڢpY#gw{5Z YZZ1RS0R4J{d;I)*oaƝ-Z9JY<ԕ*4r)JU)@)JP Rlq--j8 $zIsbݽTXm82 wZB*nWRx/QJ1$2QW.fV U֡ʸ)^UdۇQ(,1[oy+ZwcçU}"*$]dⶴˣ).+*!(9zEݦel-8KmE9eD [ ;{L27Dj{*$gmcqh _eܮ]gWک#nIٲMi,QRk(;ڕ\^⫗z֭JZV՜گ\?Gé0=%GBnH)@)JP7Mw#R[?y6p]HԵGVM^蕱x)U)JP Ra¡ >R ɫe" ,ҎIA 7c*>ZnO?$k[=V>m~z R)@)JP ׸b/ clWžj2l✻#gjLIG~[R.[` jtU&8ΆZK88&ie~_-dz(a[y~JJŜiڪgpKG|)JN|R()JJV o d{yM Ɔ\vݧv;%eٖe`eDu~$wY1(J&OSh >g|^3]O Lƺ0Р75Hp;?̖w}J=u"Ę*CM_u:kuw¨KȚWHYB85^JK+aJRG#T9L"-L&R33䫥[P =1AQW 2O <$U>̥͹sV$3g[> m.>A. V}6!H~^U+3o[O 80'zeCNfV΄79;N2de+85\ڊR)@)JP R)@*Z^9U]d5(ߩyic9ѓCas.M ߃ WC+ԗ3\_"dxjI %Vm)RWdx6Y8 s!CQHn 5mןQ~hԮ-чr^L> ( [ RμrZovzDSQ[%Nm(8!+!hτϿPZbOt+Q s#''׏~5R[|?ߥ裲>┥o )@)JP Rl Τykdjކʬ}LKSxn)*#C[ǕxES=v_Ցr|gjUAar0gTwSkRIxV_Տ|nYʕϦ_~}~<ҕ}5l\Q;Q^9g;|We<#VYX>h}6(;+ !J֩O&7 .4t[q+ywҖy)څqjYOmE#xz[h%-Pꩩ28^yM h5ƶuNt+Bt'VS(BR:> 7[zVBG~^__^ہFQ u|]w"-ih_FւR*i%8VKr vEA`ky/5c a%l=-~G8F+=s5ϑ>(y;먅A"X#uӸK.CZ~)ui?nWvU>_E-2'GZ{ݺԌuIpkAg#"\dzfr eryd sg)iռjI EpZšڲ?r*CLձ 1SSVڔi]VG+JEJp*OW5 i办k oi>h]Wm<uYBBҤ,#PSDIW7l=\uzH Z;]]{M/:.U/SIohUBHVڏQS\n'19uw*u 0!4@ZJIQY|T᷐]WJKСUOD<{^hZc;w1.7cղ\!:*F`|#_BPRg\Su)MJh4LJ5d7[dw_ 'USbA,)A8 yHfvedMu/-<}N}OY!/#] SipbKfiR7*?Tա7왠G'$.X[+jz3WuSKyT TJZ*^ۗgEEșYuQwPh#_BRr %svBU!>{ ╡i'4'+ܥ)\Y 56%IsQ@%a?!sgjy2$ a\6pcbp7?99#z^xcPܒ3"DIT;2:tlD.1BdߪRWh' zr|z0=-r8˚#QN/ Pˆ=-TPJAXBF|WCΨ6GfHlCeYqCW{rYղJa+3yӹT{lVutVPy6ZGdW]fEuR R)@Kh߷ / ~5KT{l7Mw#R[?y6{V┥T@)@)JP R3}_ _?W7oKPK*H()JJRR()JJRR(kG֊ ^^G#1ƽO3"ү 4W$zNEXjL@NGt8rPO*a-W}M_=gGnsSԗ<f3I|zV(/`VRVp3 wG:;+w#^%_#.kZTjnRcR)@)JP ؅,6ޭzZ'/~]MN9:NXt\ Mf @ZެWΊL+&ZN$qY嚋ZU#ۘQWUqC99R,rG7JRR(}SmD }MPQ1哏WYn1,0;|d>f@ؗNK_.yYz?#W}e?<7".Q!=jW䩱Fm[.Pެn%)H*R$ޭξZhsӃqw-Vr#AmKQ8RFsG9{m칊 UrC@w;1cz)|G\+ #tF%7NڗSx.@';GۡμGt0 }IFbҧRdӴu$LrU판Z H6%(BP#5qݱTrII?Y띺t֖E)J2U5]%+{@qd w!_WUvWJZj%VYD<ǸW*J֏[#fMPZF{"'d!-(BBP <rѦ  Sy?iJV R)@`Loɏ%N]C{dM";Q\a?@arS{b:k%he#! JR39P0[c[Gnm$Oښ YÐŽVKs⸋̳6߰%JNw <~֋-^+{ٻZwUT\y[Q Άȭ):~YlI^J;O{WӴ lƽ8Ԏdj)SSʢ'h.JR1JRR( meA&jr\FY}c~Zܫg&/tJؼR()JJRwoKPI9*|PbI)@)JP R)@)JP R)@DMN. }u r;TBQN=]Ds\B;ޖ}\^vwPoiX[wz{ťHYB*o!֎Fr0AWkQ G2@ wȀ+7޻+J{0xբ_/&I`+d Wyg]QʓZ7iMd;mוU6[ՍZo1QXMe>LqM^*zeSc*6Gcz m5$|Y_f愳GGfETHb9<^jj=┣uOܷGWuzc *ZEY駱P)QJ{յV׈] ge>~R)JP R䥲Ȃ{PPg9BKJ1.#B:]_HiT]*x+ۉRP _Rŗw5JRLJRRv÷>wx0@玣'S)($iZ.kyQ8 ݊٪ЩEk7&REJRR()JJRR( kMC!Ԥ2~*’ ]/2 LJiJG%XG8IYlsW1 jR[ydĩ"j- Tբ:Sbt4֖ WxOR<~wcQ:68I}^HP4INBo>X*=@+ҭ7-97FkJ+fxu~Bǎm 8AԡRJG.HPĺQDvIJ)<#Ww2.]ƊQf5Gk^#rZOg&mFHHEJqy8Wj2Jz”)@)JP7Mw#R[?y6p]HԵGVM^蕱x)U)JP Ra¡ >dd6𔉭%cWx¥Y^5Hv#)$yEX cSΦd{|=[Nv́5$7(gWFn ʊHN]uJVg94\a,dVA K̄j##`$J/4|-򜜏'! m B# HxhkSɛåo7V[j Х)@kgDx4PHI$Oz;lS>8J 򡞡A^.?Uy寃earQNzuHBuᶋKvsR!ZHI"d<_RQ[bDL ̜x+Ze"\)¶ T1%:ӎf)JNR()JJWm%ВG s$=Ru+%.--RAD`ԕ !Trr{Z;?ohS. ^g:Wo3P:X߆RBk^XWxp~pd\j8%3V:{P+mBj يU$![=`;#i9p<85#֠7IpaGOq!| S8'9tFVYCC8HGl$1{|,6mG.UeqPJb,e>g$p$ ne)<#{oǛ65 ðᨡ  =Ԅ7($cgs䯻}0]^*>ClYd<@S`HK`+*O!'VjJڧS:oȋ-ՐUX㪴%> ħY6dΓ oZEcY((W kvמ$2]?g`}ܛc9;7 9./JR)JJRR%oۅ?xG=ʶ~mp eA&jrT+bJR R()Jݾ/?C}%xuB%R$ R)@)JP R)@)JP Rs!UTH”3R$V.JSs^AgGWur%'Mn+}kV3UX%)H<'W4d$uqJNT ZOM[u]ggq78p7R)JJRR/lq8@8DVH.:GHj~G[)i?-X!TK.T`W:Ygf -$ecDSQKl~ *$c\&p5ȫ|z:AUʒZ5ړ$,ήv@Tk;J*li[Yr]r&9+#rUT6րz4vI乿"8˶Qwy Rǐ:3S"97^GR6Q ),2,S,>)!''5nItۊ#Q~LMҳ%ZQӱF3׌Rg RB60,Z$#YSv[Yd>Mm%h=iPȨaQPuH#?!]n-i.fΤ+X6`ܗ=!--! ) (G#qur~!)B$%) <Z\Ts5N"c")@)JP sT˃vZ)vB ]iADBնnq1zG\Z+plxmV_BbB@U`nt/ѵ[Gv0ao gYOZ[KD5܎s RPPOUu6$6DV0uC}5`œKVt;&_®5\RO*%ݫ?%VOu=-l=}ԗl~n`W믡+Y?p&g97'Vz]R0߁dUJM\QZBE?S['9Pv4+ /&8N zm=XA mHRˋ[)KQd[@@uV-g7/qU53Pۄެ` >?|ԯO_?#|ԯOZ.*/rQ×WsqZbuZɟjW*ZDd{/OWqiO*8mx3]·_^gZϦut&IX?5u=v5RX7U9;mo(Qo99 ++?6jz+?6jrr9++?6jz+?6jd`TE#ULZYBNZw!e9Dgy|oUjd`Ԯb! Z)H'KJ:,Buփ,H%ԳqXI#'FY}c~Zܫg&;ttݾ{7@^RJH#8WW*[vzfHZFq@K*tOY=Cc+cR]vezp8~ys}\n[-NHwR;w|bOk,;/,!ܖ8m[{ =F +^:-,YlS HRNd󭊒)Jݾ/?C}%xuB%R$ R)@)JP R)@)JP R1 >F`Tż2vS 4VӴZW#sm-o7כZJA>Iqi Ȑ1.*J\ؘZp,yFG鮗ܦCjQ>~>cq&Ӫ3K?vÉQTܴ-JYBJ9I9ŐA"=t5{2\lR5┥)@+f rV֩hRX֦׽wdaG^f1VDEI+q+gYHLT'˺EcQ?_AU&jRiliXkqu-{RMLll-!*9 ~O(SV:hǸK, U`6B0VX ܑV/2I`eMD 4FRB?eMyWm7!4B Z\Awʋ|јJ[Άq=ԠRn݆mc*(V{ )bgV:3t,4)JUإ)@)JP R)@)JP R)@)JP  ]U {.R΄ސ:OZ^;OUm4iG?a Xo=3CΐKVK2Z9qXOϡUu&ҝHǢؔk\f[p IBF{ܜiFI%r2kn:E["12j aiQ#;XQP:JiBeպhHH-$-)CV|UjqS_(<*١o(eĶI}6lq )I89DbvUHѬXfKmirMG-MHi!ЮXiϲ~1yϳSbtg#: ZJII 5evT[[Li퐑 4BKIHN709=깒ކ:"1אdA* a) I'5iR ]4M7B@-805 $>¸ݣ}Juہȧ >U!s ӧ.2dd"zGP)JFVԎIqQ7)!H;P6(+}/tô\8.6byڸjprUϖSI7c[H|'ppU881fF2[zLIZ[1H=Y.硯-qe˶IaZRR2H$d >] [5"f+8ΣsiZ6${m!cuy}x KAh0VOwR;3dҪL37oyi!R);*b[X6BekF%*B=$Whc_R[mmLފB BP#HOK5j\XL.Ǣ$IqqCJG e9 e]Dg ջE[nW 3o3n1{ )?<$$ޚh+FȰyI9J<Ԭ`xmN&E(ܯs%{quW%p㎅%E IFyUO2f7zY06nGyKZRvp(%A<"etF;'~ĕq_>+U:vI8P6QSRKkO($AJi9Sw4^yn#jV[N'3; 2P3UK h~vlZ6_~ۏ; nYQI2j7NIhT]5o.Y`*o9V;NGXȦFW_CwXg^Dx_U?H -`{Iu~ԳӦnv16aH,2HWk,R!t-OΦ,JBڜR .tۺv̙Vq~t}SchH-'X7xn.5Ҏ_t(@pHKq wpJ8/"Ƕv]ۭݗm[xT6~+ (-9r9~}|V7r8JZ8Sdr#Woc^<~uq iR}v>e+ J {uܘv%ڜcӿ̪/y,&JAt]p13r|CaG3cdW0$WB%k2ں7Qj}ù;vj4a*<6 ҞCM_,xO.]{i,IfW@v \':|sL|8<Oiox/smin.y&i[!6`sיv1XoD?^[GZZ&)J+Nsl^I(lV1#?&yRQY{<#rS]rYDV9垷9\u`6Y?[[<$7j&*PAie9J5"#̞i<"zT˺\߿^Z-N:޹zR͗O!}Gp||K,Ҥ3W1^Sz.TPLT4ʊJJ2rAqMyS ]ʗxsIu9Xm6q\4G*F^\=>?_P>U? ǁs~REҺyۤޖGTp sQ$%*88om(4ڌF{[ yks5r\QݎnQ9ĵ)IT*`TD ,wvǽVJu n#rTT6%]cAw9lSo,.!7P>SjT5tZੑrq yKҔMV=%xS-R3m+]T2ej}Cc\҃-5sP%Ў.-CalNA%=>XY.pW{ǚP>VOl{!mg߬p=CcO{[ y,L rhTHm)ucJ==$J DĶ$* *iQF2xZK? 蔹?P>SjӶ:^u[(R1R Wy2#8u+RA>Ʊmo $=φ<ǚmP]VXC[moC$GԆu6CF/S7JˎVWNק)hO?ks5>n|1z@ZO{E۔Bmxi\م `pym[T/qn$?P>Sj+,bI$SxhYB^&{r2TY4Mgk.ҭ 0yG{[ yks5x9i$bH'<8tǚP>Tu4+,;Q|T=φ<ǚRn|1=φ<{[ ylJ*+oCi|U?ߴV>E\*إ)JTs;}%xu}v~DJRJRR()JJRR()JJRR(fm Tu ?k l'7ں8{SKfO&o Yݻ{Պҙ!.\$ BYI5rލ:Mi>EY+Bҕܨ~B A"u䩾fŒ]DE;x*-U&yV:x2{Н.3aIPUjlv$;*'rS։y:$Z|ztKJ਀x&յrewZeۍah `v+`$wsiAM81l)8sͣ0Bq.kl Sf"(C|5& @5b-^lj*E]U_H6ΏuMYcmI8qx^UJ@ ~[?>n}ǂ`j qN6o*ގ]v9tw0 ;2 Α: <Kc$jj[0ڠE e-62I'MnkScrk(Xʜ)=FZn{W:m>} 99VւBr@LlG̎Ԙ϶e(aIRO"$z띺Wg[5. zc%}S>%AIަlLmI;ՆoN8yBr2y`T@?oօfD\K:.-q*! pϐV[4Z[3{QGkja,ݷI#g?g;c )H'Va˜ä5o[.Z$Š#4C^66`w]P-vW\h _hrC̶܈V̖ؼ:3kꃴ; "#Γ-RZ~P*H=UXTSkWwåZgϟrm\Ҷnpn )2B_Y*J$RԔH9*x?9!Vb(O%'p (՞N#⷗uw8pr0`"*ڃk%u3ӗ% Dz*3ږ;~w' 4jZsGqq6Rn-DHmЙvR{S$QzY9k)JR$-U:wloWH^ųe̊*, qj*')8Q5)YW6 X\L>_~ zb˩$NOtjm:g})+t[J7_HivӰc`{e^ Ӵ; "#Γ-RZ~P*H=U9V,mj[Ūrsy}Lna+TK9) [r||WCO+yjeJ Vw` >ъ8ڛq)ZRT2=`.32>nQIu5lx[â'߳]ϫ=u/^m 4Pg@)JP RG+t"Ow#W ){L&K=*Cȏ8^_~1C^UPzǡ\v {SB11ml,() p%9䚥pcT7WI}W#Ui/nT?7)pe],6%PN$*(!$n%(^NAZ5FttuZc[,k㑜qR[ԎNXV9rUWcakE|mzgwDzlXV2ryskkÏji?[zSRO7e-KqsyYӃ5%PmEWnBe(}֝KSw p <o}cvxѕ`/7ѕ~ɪ^j%*"iXlKAë[Q˪A»r$.= :On mEPlpp!hIC('q {~Oo6$F}8,Ǯ~q Q jkgr2c9)#I9 RYجy2G=Cc t/rDF_OжQɹ_gWAyiqQڌ}zrC:Y\E[MSalajӍ|.[я\FmV_A=Z|xmD`on?oN7?b) 0HH߰?׏k]e?#yj}Q؇>z_-}X0Ht+_~]UGъ}|F[՗?}aFsٷrף i(,ܯd֫qyj㰴åRn5R^,#ziׯZ/ǍV}Q؇_ޗ?N ~+" GCW.7o-=Q؇9w߲?cUzͿ|G]/WaiJW;۩su%nAZ-u-z*܏cfOjo-8Zp9oJ/%jz,'} ~ټw}q \xZqk?jsm#ԑޗ}W#5W7o-UcW>#x:9K9TZu: ~K^WN7".~,m#UCiau=^ZqCrޔ}ڬYKXU aі r0jqo`JFIg'QZ?Ubھ~z_]ZHZzЅ oIʰ9ggg.X #'W ԣPewӍ _ ]K\w%R7C* g]yGC56a5S\fDBG g8uW(.:MSJJ2~ΚӵsV~.~,Sn@G%g\XKr VOYOrT02G,U,g[&,@ yxnS5vMd(v_hXŏ5;B,yƶ-mfg"3jD$,2Hd &EŽU 8JJ֠ @Ue,~ ǚcX<4ڂЕ(FHa]":VДI-TJ ,j52,~ ǚcX<7JiCS!;B,y?cSu-I\1-dx/$%J+Xe (@ $'53hXŏ5;B,yn҆BvaXS,~ ǚM(jd'hXŏ5;B,yn҆BvaXS,~ ǚM(jd'hXŏ5aDfc-hi9¶$ 5 '??M'ߴV>E\*G+t"R؇T׿Z7ݗͪgM:Blq.?w)[AC)P!hRRW=y}{lڞ#!kFTsk$"~ q*A=gXnZDAoj6ːށ D* d@4F9,CW.:撔8T%#AK\̿lkD JHRcr ZRl<[C3`Kl:,'B(2]?O5+p< Bd[nQYKji@RA) 鎏[zj}:ʹX%]o;P_tVU?*:܈zzeX^N) sBF'x^U )TEJq2(y]y-JЯNR?_Ht^R'_8+UVQo{߫(\M%RyHQz73>Y`zizJ$N ٰ*R#A`Viњ"syli {Ir~uR$V[m$wU*#3[|x4XWQ"Xl0C!Ķ[90UCeM9ܻ\`}92!|8cJCn'ndmY^-LjI: :C y8pJRH@HQ9@, f-S;r󶵾ulX8H$sճQi ?u ZP:q}hjl)-euqP I䛫HfW0R!  Ϩ2*:A7_78iMmxRw)e<>Z ,=BR66NA  8NlЮp[fGBHqPz$A{:9VkqEH4P%XOFgF?rԕINu cTW\֋6CcQ²oD!ZӼ`wq5tYFMbM<ܵE}?j|SH JTTʀCY izkpzoRCȸ2THlXWx< Ԗ= F\+,(U1lu!-r oRwdpXx´ZenRQ6V[mJ?Y<ڐ-;P>BXz+|lU2Æ%0pr z*H&lV(m'!)@*ө[viָS.ܒyg=\~Z e-֘w{DNQ%pi (YVuzf;aC̺BA#@qj;,s4]i`U";i$4I.fVoYw[G*J**+-[A!_B/w  2Bm$kMf Ehho {[Dw7{罃΀ǡke#@ .%A- Nunn t}hg[xXjTo G_W*K,ֶn}Aj[*cm4Z#_M춶nAi[*\ǐQsh9NRzcM|NrZ.?jiYBr9JȨvVtnӷ֏٤k<8qao[+t zgj_- 6 YB# &zs/I,=f])԰TTv^ j$]K2p}d}^Sut[mK1spvD`%iXɍ2#RjDwӭ,- I HA@)QPXt17P^VHa7,ԺII^ 1a=`n)ޡudxh Vj[Ynpp• ӘQIڴ +[QM;iEYyE-.|J +#'%iQ7MֶnAi[*TǐQsjY$)!I 2 T^Ԛ{N0j򶴹a+WuV;֪H1޵V;s[eDuxh Tui>\cmo(% $YPT)@)JP R)@)JP R)@)JP R]=Z^Z=-^8!ۉq%m+IJЕ*3tlP-[aN-r/c5ά )'hJR:+4&et͎$0̖ }I.!meN)YH!8u",Vc6T$Y`nZRI&[N=i Rf};֒p<#VNm"iYR˹.!rB@(ZQ/iv9yZPK(:vkh?3C2IfJM\aTʞzRQIR\#Fliի2c%]>-y$D9;T`ή6貖mmBqՆIm9V1 +Ep䶦a!X=:LIr#̒B\p_Nxl|4?**R@n rr)VbO4-Y*Cb|0 'Riu#wyܗ TSY[H}!)J'8H>cna hn}R֊nc{ST/$D!%Y$GѷԄб7+dhKkj@%Sd$ẵ7?DYSS-vS}H[@9O::{틴E,ŋ#< Ay+ 6R^P?I9 "70[H PZSϗu Ύ]J^췙v;\E JD!Zҗj Rm5CJc~cmN\qyG+5ۯv^YE[eR[@8s qjs-_Mk ZP%\,+'Z%dO4He6(\: %],p)QGpTN*V}mmyj 0TOr8u (s=G&F^MPiYVU^%3S>&g oT!ՑB9rOɳ[%\ Ɇ̴-y@;*JkcIߵ=h~Œݒ4 '\I?FzRYozr-X 2zؘ. hJYYXQKwXRsL]=e Z97XEB}V Nq[~;r:/GWZ9g6r_C ҷZJ $ $wOUod'F:Vsc:Y-oJn$$x*@)JP R)@*OmMT,lڦD'ߴV>E\*G+t"+`*FٵKIwdt¬}fۨLi f7Vpm䫦{Ѿ6mMƁC8ˊ[IS䭊#)uGCW4֟w1uH X)h8iË+[ZSzM]p .nĦK2BJ@i+BκHVFƲsf-rr918JpDK| }iNǣi.6| J~Z[WC#]w:)ide9*;~xI&Ln "kXmoypAQo'85~mj V%v*f `W| gXg]1p49glK -QQ^N3O~ZVmUK{\)+2'w&#=ÌJ(J$s'ιtinz1Z~\RfS_V'$'& ڭm и ,$ ;B@ c o Eď8Ra)EJ8TI'I=md vw{[<'#P`)Cmg'h>4 _G[ ]p[m` Vj:V !$%kڐO!T֦zWTv?m3e6pcv;s9^LiHքM}uϮtnYX5p"J8V Y(}*IHg]b:0m٫uLt-b2_S(y98J\Tq݀*˨ԩa:N/"9*`O܎8NqpD\)v%(1R F6tzY#Cr]( #X P@%*q}A)E:q:K>aBda(AHk{Dme (~Q+hQ t9JmV%]ba,IQڄI'&tTz:GoTW@y;RČ-Tތz:-mK^`De<ݔ(cߏ̷8Ze-jKX yuPX7,]b-R:+Hy򥡐w÷i l5RQۅv<$1"NzWTv?m3e6pcv;s9^d= * 'Fi 8ZS1ʎpSd8&5)kjk P5IqH.#vxL- իإ$u A9:b!ia0BZ XJ!; Qm @*ۨ4v,flwf$"'[},$@ZNvx+24ƚoN 4=hM h؊;豷w]]|m<)>>D%ǹ2W$,lKM6qpTw% ֠% ߢ5|,i?r2$-;ywJ*P@}oC* y{QڰFGޝٚܬ6Hی#hpځHʀz8i}!lOIj~zb.mͻiw$׌eOzv/HeOH,iIlh]xӶ8Bm `lJ ʗ/ -;hCc̈́@)J˽@R?"-">RLgH ?o-6:.+8vZIvS% #8O5́jNFe6=eD1׽IZ[#$5xZ^ѤǶؓ%l2{aJSZ{$ϝg3s`o:v$s^xwz*'Qi5t䩞΄2{:UȺ&:J"4YZq|ҢiOGm&u'h(9=p&kޗ=xIRĽF]ղ$ 4AJӵ Qm=`lv&"e;F(\MiͩMOڮ66ʆ۬a;P@09P^;GAqNjD$G+LP%!C RGz}@j!d:]1.?ЇcŌڐ˨q-@ dddT7X1u4N%HYi\OQ%MFrQX:xa퍩)Xv[-2\RgSMMjGi|FڸCnB#>Z4d;\=iDHm Gt(8$MXbN] _K*MCHq-z7BIqECs=u/V1o ^q ahV=H8UJV,r,RԌ۞q%&*8JHV8Ռln&vQ$83YvD)=i}>JIj%-1"5u9T-lhhMuo%C!UAv]m[ݠd$g^M-|F޴՚) J_PJFrvWѿFzj*-Qߒӑ-Qw;KeYGIIBOJMlԎn۽'nv8Vޏ d\dQ0o;ANN Ӎiyvb`a8%/ K3E@PV9z&moĒԖi 0KnRm.2zg)X.3a[;6.<8 @Q( a.$OM%XAqp! s*R Zv[lfeC@<)QK9Rv$zJRR6nÊˏmBJRR()JJRR()JJRI>ݿI4~j$v%&viVOc=)JRHZTiCm Lڮ2ӑZjA8K.FwfA*'i="RMMer׮i:J#CF"!q u@+O5c) ҕ3SϷil,&f⶟)ʲT%g)^f͏wBRTWYm{|O\ZWJ7l1zZۃJ{&ƠNݻ'8Zp\u]Uz2.Zye 86r@ܥ) dX\;qT#{WU(SU<᧕~>]̔WlmH]yzO۬žXvBPЦpIw'9#kګ[\5}J\nlʸF/qw,MorF|t:Ur4Ś-7ڒ8|R~!8Υ%wNk̍w6gn&U\f"Cμm%*P#*PZT6֍Fͭs2IZ%@~*;TJNa@py֭\i=VC}B}#)`B mݩ<QS-wy'&l)!mERЇ]u((m%.$Rzr=1lҺKS3{;;#N>gK,q*XRr9:*5uOŕoTU+bUGe9Ō`kҵN/xEto9n,TдI&kP d +NS dHV)]7o/1 ۼS.wnOr\0$))2^(I%YW"2N, ŲxXK \N הo':*YiK<B:w8JZv) $m<P CSU '??(w#W ;?ȫJ=ʦ{Ѿ6mQ7nW6 -[$FRfԝlze57eA+\E#vՅi iQЦ{Yd6,[}FȖ[h[iu$'#kppx b]$tyFeVjqCG$)8B³.0[M6ٶD v.[uaiRn%hfb\CRVZ B$$Tsn֟&KזOH}6B2Ve, rQSJzF5Dz 㭸w\PiVҵ6%* (9V)V eV~;Q&%F$R\IVNd55 U [uYRJJJI$΀ךY:Sjbvwf߿.c.s;U#t}ѭmQ&2j$`Hmn@Z r=uj#U&;3!^[.jJЬ2 Ռ='k 1ߟ|w 9c҅ xB:8 Z,j'q9:kۮ^]uEɩElLR@;JPEv7i[)f&tC{dUqeN!žCm篖3suHp%[I6Y9JTen=iY0fjXNDD-jDPT cUlۮ^]uEɩElLR@;JP-i 6͢hf0lϷ"-HK.#;UGQ;I95ViKf3wn:c>ėcˆ(u%h88P54$PWmįN(2))QDʡ:vv~P(Lx7 ncyyvή~oZ[QPU(DdDDI<;[$()I18p2 ;ɠ zCW􆜳jnmO\Xˎ(]BҒ X#"prj7pD9#&iiq$ {'dB"E/.2%:8թK7;Nz:c$2L~; v{gTSRRԚO@u}2E6]ؑW-İBZJxAI2C~ſ *-cqJɇv3T2r"!mR$0RdX<'aMEE##1)26c)+H pG^k!ٴZ- ښf @e egjJ'vrI'&]*u^cZ)vjT&\V64%py|S?n[nntY*\xq2cm$]GP-?$*E."qFYSpPh9NIq.%*D";/}Q[VBIFv\ :ї땦i"In#10눻^PRi- ٸ3y?6T]SrveߑhǐXdkAi&@LՅ+.""q<5ې!øWtN^ɷGJ7SDZ^ {c;F::{r›Ydf;N?)iTT_II8G,g5OgQQ.!CeJ`CPwQ҆:w=-ؒ]TƔĒߌ`u+rۤ4ݵVSn2䶵 Ud'994wDw˅;ԆݚdF}uLq#J`9duV]+7Ed))bCr|[ W#VJJRR()JJRR( .dGO7oRjo nT3ҔE)JZ"r̸r[SOIVZ4͑5bB` *$)JQ*Z$(I$jNIӨZZr%jsbI!`#iGNZB5-m),< עkM+Qt1ҧ  }Laû8=w[Ytƥ8ɌF캇QNFI3J+x:ScB-q_)-zS֟X퐮mݐ6q;w=$c~5^Z~4}մ%t M rPbSv3pqͥu&*ڻFjij]GinΑ%&c2I)ʑDu;Ll:-fqi;4m'A[+$s lzwJh N.֘dC5upDb֗_JV#`mNG5Vkmq`ܘ\;B;~ B'R+s8 Jpo~?)~Қk]&Yz_|nRԠX) J=WrA]!cqZmVձΡȎBRAܒTpzwJkCC24<2ۦH#a@)i@wFHclnu_WK2; PYJDrIRTAuP?OUֆrN>:,=" 4Xٴ6񷑵;1qclnu_WK2; PYJDrIRTA풻6 rvlߞ9 𭚨/dgmw87r;hbR,pU`UjoS:%lf: 6S+xJ))*F>.{q@ZU*C%Bxq+Iര%ju *QI: )@*OmMT,lڦD'ߴV>E\*G+t"+`*FٵdMVލejo u *H()JJRR()JJRR()JJRR()JJRR()JJRR()JJRR()JJRR()JJRR()JJRR( .dGO7oRjo nT3ҔE)JJRRI k= \~sa?J9:ys'9^^%wT%&+ŭT8y +89$̌;5+i%k/-aes,0/Vg>炵/Kg[,6P҆nQ 8VV:"9)rtQ$ xxȜc<=T.ţ9ÁY?Mnx'8ےkfUUw2ȊNxⰂI s?5bmK*mNִB /`rv2m`\Iq$wːsLE-\89q3Z39l4pAJ?i0Rs;z_a1f37,ÑWH2e)1T,ࣁL̑b*#9,;.!uu)*XIޑܐzu *LTNc'xkUۏYead^mі E!撝qP~8mh((7c潿ƛZ)MI܌x')%@X^&\еIܼnA-;P]͆1k'Gȧ瘟";"R R '??OmS"QG+t"Ow#W {My}{lگt3QZ:/ZeUh%𷐌(~җ$ٶ$KKyiE ŖYV| -ү.6Gvt \8Z`.{8RPNMIV Xv Om#\X\Jތl4B{`%J#lƵ0k!&RT@) XVU,-1i-"'pxaqmrrrA+^7#m jA| ՖEJz_|ۭM&ī`Ij(܂H)(Nwnyc 66, ӌLv: [CKk$o HRRzq?F7 dP;ՙj[3.5-I Ac3+LnՊV &#tצ,8넂;<{QVi(W\%C԰ӭN- d`U?MY2ؘ.rKp 2^mThB-9S$g")ڲvgfp!DZ&38-u^{ݚhCVHqPځ (c" 4,iׅ4@H؇!O{wv;۱P=1jymMne{Rܕz[l6Nvm8¹Fw˦Lݛjvc+Ja*أ` ];3|_>}yhL#n0 3:9$7#=G.xݚsٜwu4ez?j8k%vc:-w`a# dZMwK.jfac) s.!7p H9N0y{фPJ8ܬ˹ݙk// RRHJBºdaX:+5ӥTrN9!RNj+ )9 <5kӴ曑gӪ}v- 6㕉 qPFTJp|뎔UX_ X}B=XLe)󽽩 ;@ڬ{g)0lV6:DX͗zqRe:iwÀrZNP:zu lwu\f5U ׺,_RT: m̂d{WKKV?JxV깥DGO )nns=[.w7%-[So(@ { wTQlʌm[bB6XK)[kiHvMJteף4L8wG"Z pH.gU^P5w5X[ F_ uƒͯ $m>P_Li8qUfθKnsH/op93oZJOZ ;,yvZ߶jXJҴ`;z[971}ޣJef[oK-/BK-@S5wHZgGgR+U2pg72R3ی 8+rJTy }}jS87v엖2&SOv$IcVt^ŞbnKo&yI H22r3j5M4s5RC/eù=x$P i}uMGngLFg iJK- $+RZΝptK;?TIK`)JW>1~wkVfDw'm2 @_p0ʏs$uv]KgDܭ,Ɏf@2SoHqi8PWQP @BCQ-.:j.wMHCm7ַ8i( ))QVs僤OJi% W04Ԩ#5hP8\ClVڭiX&̕un!crHpgjrԚN4;{hc̏=p6ؒ< ( IN,#:V;GErnRh -o,>#Z"? ;W6oyD/)=͇U>4պE#қSwBt KH9SS^޳ n,S&=M,m-h?T>Ju `r5nk 1sj_[A\JRP}xI5xWB:>.!.!%ƜSk q=ˈ܂RI 6֓%+v+|5X\U\l--$ gq- G\tHJQ ;@$s'2MmlGWQw.3'DBN(ZG2zNkE"]5˔8w'}pqe,@|1s:UƳӚIJl;LqДv{ssV?EUEӖNΜˇkLoyCj_#p* ɠ"oHZnj}#h1"BJVea/Uͥ`ym|֐uf5.SX 6u4RZIHH*jaiLia=m{K n3e;1_.R/ff[oTR N r*Vs( ^mZi6 .%_oLQDE@qIBppP9-K*ZT)DJ'Q$ӕU]RE&CW(n qNۭ VW Y/v7CwD,RN)Od21NV WCsKeRܦ:h!-;m9v[+j+ݪ#:q$0v.!YVwIOëtq*#./8/#TCBT2;*X<Ժg"rEh|p'c NrA7:$ޖMr\NG{Ry -=IP۞G<em%:Et0-A! %#nR UkMtFHeazm9!#ܷ,6%I;҂t3k歲)&$,K[nCԷ]RѼ$ah V H4H=!,Zfvhˮn!đ *m@OT*!5iCrZS ) -ⶃHۀRH7u@j9zk]ehǑ%֘v<}JPZ *dKP]ۯ wkd4u ug>y gVt].Eānm<[!)NjH&!ӷM)zE$8wp\}2cxz_]C#UXun66%Dr%edpqYJPGrAC#@gtbCDЛyNqւKw8#k˞ueUzȺ?-|5ǒg n>7%9 G,\il+} n0%Ǖ!#J%ԧ<'8{E~&UM_Q-[Qm !w ,lVB^h 4Rn7kn+QܭlʆR ~ݬ~j\$ۢ$;seI*iէrBA9zcIۣZՍvW)0MBT)h $ ǗUotǥڗM^LLljRZBӁE \@Gj=Ֆxw)X1nGCo)BQOswVӲ AMx\8-܄)š Jw jH$ }WDQZŦGӗb3FT"!kT%Q!qeYVCtӗw.Ԅep[.8 nNRXƛYJܻ4iRn;:Ԥ% @?HK>-f"nO·O 8=VT9p4a*щպ:.%Qp(<q Bw# OY5lm2'jw{ -\(AZ՗V$%#$3^:0tfpv;.cL(mzSdr^zSM=3Q"Dt \SWy.-+K:kR2( EZc\9Py) u$yjӮ="vN1մeGu&q R^q;B@  ɩ-=-6[W9#ޒ)[IRR$<I~fђ,c!1]JQR[u\';P@׎)Y#NX,.Uy7j7ڲXZ") ld(rRʉ޼ffziCzuňHz+,;q J$n9 =uGU_,Z6jjDu5;2TsTpR5v|a4+툘%iW堶eAk@Jt6CY*&Ji=Ì.<ڃĩhN7 -= mmjiYvۅ.5GEIPqM䅂6*hmJפeUݻ~[P]@kJ:42ѦɑwDF6N '|R[1kvLobI=p~N5;Oi\W4}m1kvLobI=p~N5;Oi\M#'ݓd!+|WS:|2}m1kvLobI=p~N5;Oi\M#'ݓd!+|WS:|2}m1kvLobI=p~N5;Oi\M#'ݓd!+|WS:|2}m1kvLobI=p~N5;Oi\M#'ݓd!+|WS:|2}m1kvLob\v;#{{99  b~)5Gr;6riVJ9,({GTiNKd!)1kw.]1KFO};jMe+r=HnZ^ۋNjy ="*fqu%ʺEoo= ܌2@a;e´-'bJa Ra%_>Jvӗպ6δƲ*? k%0J]; dzK)oZ^6ț"3E+G')O) HPWOެzcn{%a靊lqnlYm w&/_ٵ̵%}e6me*H,c$TgH sՊ[`́6wm6ei[|E%$LRT `4P²hme"ݧ`Gq l\S  B U}ս!Z EKe\yKv.DvmeЀ);9>c6 WZS/s vx0eo:m-j' ޮIpkhz\4IUBMTȔ[y-. )R 7z[=4I~[0){-:zoO-2ST'8 `0Adkt])#Hx,qmD 2TP[ JJVSߴ /WLHS*AjFô>I;RN s9s6-)of~1ͬu@ hs&$Gr-2ZFT89V.sgK1Q'HiO >P]/;UM v1m.$6ӖX|ۉup)`ygn-.ۯfEƭd1NA(UTRH-:FrW'2rmGL%JD%$' .".zBc cr5-VWNy'}խV(8{̐ IܮNjhV۵lyq$ޜ%K`!K̤PiHB54I\Kd-n * T0@ |[D{7Q%Gb;i2Ů1HF1ϪђNzbMC fBsYOռg/;UM v1m.$6ӖX|ۉup)`y/ gm.ܘ8KmKܜN7 +rq^Qt J+TBS,8HBBK_r'pr TΎBRl XtטvJN-ùDi[bV>N].HSHq%ZR{(dTnҰpo'I-&!rZ HpSV Ŷgwn\)Ө y  ]!ii]bPc͋.Pv ֒(q/2hQݽY)`ƺi>t@dz .SX*!JpJHR)@)JP R)@)JP R)@)JP R)@)JP R)@)JP R)@)JP RJlVͦz=t)X6EOW@VSmVh^= HYliFkkS֚7[_%Gc?O[t,9֚7[_%ѿ(=n?E4Zz>icWM񭯒IOZhߍm|zJꞷ}"鏚X-=n?E4ZaG+G4oƶJ=%uO[t,}"鏚X-0#FkkS֚7[_%Gc?O[t,ci~5Q)M񭯒I]S]1K姭Gc?L1~ѿ(Gw.]1KrZhߍm|zJzFkkWTL|iw. r9_4oƶJ=%=i~5Q+z>icL|i9 $:8b[ 9WWA;^ZAL+q8!x섞SH IXCÖ̸7NǐÉqZ2$@ T2)JT)JP RS^=v^6 mm{Hp,uۄie0w#kf6*vrAj,Ԇ҂$ GRzӖ#WˍInsm r:ywU!4lvi w쾶'v?4]eihw+}KVTIW.Lƙ@kuMivZ-MɕN&;i HRӂl:a=? RND{kp) [ 6)qHm(IHU$>Ckmv86[lq7'> oÓdFĐԈ 8ӭ,- I I#+m礎RihZ_>72<`'8VqumB> \ nSKbڸޖ무֑=]JRRFjkmm[naPa03֜sˮTȉ ˉ`8@8* {If#- i=ɾݟ 54?UdrӚ^5 mM(r2TT+£@il֖YHRJT0Mlhk`P#?oX}=/ KmL9}*h !*# '1J 來=hDdx(1Zw4JT]mmv8P}$i/6UڗsNxt.EdzT)n9P.ӤbEwv 7BS5,ܴeրG,WI:nq綖lw%/=lEi,lب(0G~ZJ i[e]&YEhnsR%'O{FIdԕ3Z~oY?n.eLu D:( ޠ.W-MVowAij|$6Da)I0yTT(n,ˬ=&km2D'O1˺n?NwƘɴW~Hv"ޗΆ8;5Ĺtj&30ܿJC.1mnC42@,Qji'5B3Cn%jKTIJT;s&žxGdNz3CvbEIB2p0G kkP;v0Gzt3t.j t]*fU66PPR#2φ2Y.Ğ%C+V|i~[17qC =CrQz5 mȌ\$H)IUrHZCTL.k|kw <'xH ZF'<h ;cCʎAJYY!`QJWQUhvgx){"{M֔JJ(` pxS_[lan> KK|,*wfKd C)БSv6$͙~LnLUA[BXC!(vP2d}ƞeahq$d)*#*5Kj;-Hp,uۄie 2H;>`Ktm ouXyڐf<[H'aIU[YrkAvֹq rS ajm '=|@Z.:N[l_.7T;S%m2'iPXKZ-7EyL4[R&C,6A--.HDcLߠZt5K:l|-ʈfuIl$) i QͶ~0f'"=5FCCsxB{6$*mw҇ڦmn#yrc̈Ըui#!I#wr ўU2*Y- KFR 1έ[:=am~tlBu;W;u?R6G@Yɧv}od Y ƾ.>z{n=tW4ƾ.>z{ƾ.>z{n=tW4ƾ.>z{ƾ.>z{n=tW4ƾ.>z{ƾ.>z{n=tW4ƾ.>z{ƾ.>z{n=tW4ƾ.>z{ƾ.>z{n=tW4ƾ.>z{ƾ.>z{n=tW4ƾ.>z{ƾ.>z{n=tW4ƾ.>z{ƾ.>z{n=tW4ƾ.>z{ƾ.>z{n=tW4ƾ.>z{ƾ.>z{n=tW4ƾ.>z{ƾ.>z{n=tW4ƾ.>z{ƾ.>z{n=tW4ƾ.>z{ƾ.>z{n=tW4ƾ.>z{ƾ.>z{n=tW4ƾ.>z{ƾ.>z{n=tW4ƾ.>z{ƾ.>z{n=tW4ƾ.>z{ƾ.>z{n=tW4ƾ.>z{ƾ.>z{n=tW4ƾ.>z{ƾ.>z{n=tW4ƾ.>z{ƾ.>z{n=t)X6}]|ju q3VH-籆1~J|B٬)X'ZOH?R?Z}d dMCb;";rǃ{yjoh, =qO-=qO-_?\dd6\dd6\dd6\dd6\_JHmeٴt)2b5Ŀtc_ѪUd;*NJ䞼KJ5RefӧaqJS"`s_?]I\׉OƿS׉OƿT:#uҹTNp٦, -_QÁnN)aid-IVX)#ؽt}O'YrO^% ?^y\KMA8'Q,tuG'YBi-Moԑ\T=Luȉ#hyi;TBH8#9JIj1)U)JPMy}{lڲ[GzFٵJ{4gvWfٿR~6{awrGRz&!@-E %$DɋhtQG>h0px۩Z{ ܄I;Z#Ͷ7I=ԉlCi[Xn'Tdcޡ}oK, }EL6N;mFbMOc"[V+s8Or2d sMM^%lh:>ВF27oI)Ao;VwrygMB:C={|>۸q=]izusbrG$O2UoVoZc0lv`iwh=ZiW/?7>=s;#n[.WB N!ˬN6QᲀCpQ]G7zme0eTfo=Q$s=uR=NE?kvvdo )½_:э5Qt?nfuY\*Qp\}d?o>qq&qQF1 NA]zmaJ6I=,Du\TJ@elJ *t܃)G) w꫾ҥy*~=vԔDӐ O^U!JRӛqψ̎cILt\ wRlLgURR9=#`'H&jNV1Ԏ3(usKp7,Qf^*@HDIPRnˍ)sRp( VҬ Uoa-ʒH`nzFBQ;=G۽׷mSPJ. Lq[ܶ\lpJ*8VתcvԄSN'w*t[,eK)T<?-P=wbЍM2ܶgӺ YK J@Q6`Pzg=ƾ}A:_k`"}[g4Qb_/$)JV׊RS^=v^6i޼{Ѿ6mY-aQԞz"γDԩa)sJ[qJmK ) <JTuJRR()JJRR()JJRR()JJRUo_uZ'^ЭM͋ M%3V2ۊSjXIH8QRK6 [葮 R-7'/dq crq̎y=]UjVOp_-n8ԃ&WNr9잍eOЙi8ܷ-R2q̗O[ԕ$9gܑ}E`YHMOQlXo'WIv|i]tNh;W[ BO8iݔfM&֗Rɚ+`8% G/n% g$X]4=en^9? 7-Dj5oE66DUwȍumm\J0U 甡 V*b+|+|,H$P~7((ҊAmA]4YCۗNe-Djzc|> ,mɮBTZC0$(T Qm`PuroG-,ir $*J_$2[JH=Wu?Pc|>tu&ceؚ~!bEZ>T =q Sn!9εu$37$HnImnR[JV>dsj^깯KJ}Җ~TNYQ}kk>?ƈ5K]I?faӚikH J@$9Xmv9uqϑ:fDk6|)R\ (m=?;ks?ZDoϥ}7gNeFz32%eNc˳SR Ҷ!j焨YMZ6ǟz־i_shY}MZ=gKSp]SlorJ9çSeOcz(^?ƈ5KOZDoϥњj 'j;lt2]ږA!Kt%GxX4TvGO{#څ-ۻcnvS6ǟzOZDoϥ}7gU5kR?X#l^yrv+nrByI=DS6ǟz־i_shY}MZ2.WZ[P, Aa[Ra$@!*6ǟz־i_shY}MZկ?9H==SiyǬ/ʽkk>?ƈ5K]Ld[/[bDw]R^yN lO0ra_shY4FZ=1o?ƈ5KOZDoϥJza_shY4FZ=1o?ƈ5KOZDoϥJza_shY4FZ=1o?ƈ5KOZDoϥJza_shY4FZ=1o?ƈ5KOZDoϥJza_shY4FZ=1o?ƈ5KOZDoϥJza_shY4FZ=1o?ƈ5KOZDoϥJza_shY4FZ=1o?ƈ5KOZDoϥJza_shY4FZ=1o?ƈ5KOZDoϥJzW/YR $ .7|8.kWQYcOJmKy}}e4Zg'؎mͰw>.UթGm_.!pC(ό1QYcOJW[{?Wrx9Kն:T՘$wXaV)VDI$kRնǵG!gVk} !w[J&ȐAD-uT}ǵ_c}$Θ!7FqE,Ĉ?P!(R((Aa#IUX)WBTןz7ݗͫ%4~j?o/ U?cݺ*k1EEqSE$dr8UZ*xo34$^ε,iM4^3gp"0JR[RCa));Ap87 ~hrDgJeߴr\<9d-\)*?zKT-[k; 8ɖZi!#r@$@Q_i 8ӭ) I I T՟jɱʉ%DlXA¹_F&N]ᶲX/&'߯LB~l0Qd ^JMWCՆ4䓦w;W-;߳;)ZSSQۖ9 Y%l+t'f%LJ}hY*FY&娞,-䩆 |%HaO'R;Ti[2G< <%!3JS-epq]3U7/=%S-ʑ7/=%3rcU$XsrcS7/=%7/=%3rcPXsrcS7/=%7/=%3rcPXsrcS7/=%7/=%3rcPXsrcS7/=%7/=%3rcPXsrcS7/=%7/=%3rcPXsrcS7/=%7/=%3rcPXsrcS7/=%7/=%3rcPXsrcS7/=%7/=%3rcPXsrcS7/=%7/=%3rcPXsrcS7/=%7/=%3rcPXsrcVmPLbJuisb>~?%݆CciwWʮ;qJR R*FٵS?,j(EmJPiQ{ӿnUxןz7ݗͫ%4~ju'Njpxk es# ik,'-Nćp1B]k%yH,VoSmxqC{Ԭ)TI楨3˕oRYbRoőWC,-|*,9 K`(ugjߨGv2V+JJ zUP^0ow)@7;ӓgqeqrRih(Pm*y%'=9O`btfxF Ot#ީJUR&y\s҅Wk8qz"Bt. 8;㽌R*}M\>$˜VRK8VI$09TyՖ9ʘ̃&W q))Vv8 $WGUގaXh,C`v$;B]iipnn46ESL>܈ !,W#DI$(MbjK+{^ɄBPR%H!IRT)$@ {5=ͺ*孖ATnt'q)j> ۥ2mzdF:ܗQ0HX89 OX8,T3Gpm *"}q-NQqyNq*J=խ[gb6dZuZGw]JU*=Zo:51ղ#Sِd#N *'X9H=atwcZbi\i5P $qe*JZH'wtk)B$%) <JSiK~y&L-<^iXiҭڜ#[m;Oŷ˃nn LU4]Y[-J'i8[@iXV-pb6arO2y2mzdF:ܗQ0HX89 OX8,V(o)ܯ],FK;?l\q>Ԅ)H^A I$X*- p"c,8H<$I$yޥ)@)JP j/U;}[ꡨVOp_-bQ7O}{ۜF@ff>P*[ =TH'5A&j;RnЫ$OTC-6~u|vO?D:Uqئ[RQTןz7ݗͫ%4~j?o/ P}5KI.* I!KnPuDךoE׭i᷎!,H߯f~#+S.=>R" V8L p9'4.NҰijcaeqMZUNp/M= RznvC]8"̙ o]-)ؒVá'ma. ')RH V-qmXlqZД8=X$۩2r[\'/{d+jK5:|[(rCsp<%$9Orp u-UxUOIr>1Ɛ(3ۋі-N<:)g+JUKZ˅hӶwͧ䥧+MGg`qjsbw:Re\*-]{M*n]ΠM6̧;BR{ $o뾐zU)lrDo mqh4w)HZr{ҡL / Ėݟc+Q\"=#W;?IV2b12) 3w6ې1r@\i\u[%Fu-1.Q#͚S 2ך[@MEyZxyN.%-8*ZV9 R2@T^\.vh]Txe$RFvFN2e(*}ԝ~"b޻!qph9r?z?gVu!v$iO=`.)-=1JB瀡Wz@ݴžDh[\-%9* C&,Tguwuro閥qTյ;IJosW=QM,Mړ!е%=23ۏh R)@)JP j/U;}[ꡨVOp_-bQ7O}KSu4o̟5'ꎅFzRR()JJRR()JJRR()JJRR()JJRR()JJRR()JJRR()JJRR()JJRI#g?Dj#6$~lڨOQ~d:>6~u|vO?D:Uqئ[RQTןz7ݗͭ>4Y/,>~[)K ZT:i[FٵdMWFU!ۯk+yf"w{y3me%{B,>JКԾn}D=>OWNE5 Q^ I a<[\ OId /U({+QzPZt~I1v {w, w)@r*J1SyxE V^uPZu%ŮmfDT"ˬ?+BlsM$+I VV!Q,\v=86 _BkIɷZ̧6!ē% VgV+N^/~ze秢m*-K!C=IҀUGE9"%,quP{,*Uyuڙ*l"wP,<W#NO.dP:HF ,(z*w4O4sZ\]BSӬFDG 8U%J58:5oFi+6qv7b{tW_sr0Pg5oFi+6qv7b{tW_sr0Pg|gErb4{6 %š8H'˕IYL6p^Si+FS0I#0ǩHp+Ķǖ)%N$4Ӈ@D(t-1:s.U0VQci ~ȍ'&Gv$(oal%ҷ0Jh,` Zfs l 'Iz~#j"T@lJv4(i+Ƭnն cU-G6җ8Bn )U_tD;,; m6-78@ok)Xwx* FzZFŽ= B]z4^:]HVS lPtf*M0bp֖pr:TݮZjMO;A=aɊ-$MD&sޭ=ici;Wsn-pmlB ֬!!)$w#WKtrvAK0UȷGto: +< *um7xŚv**XRq O%d@Fspغ@^W ZNG4LrtnTJp7 $ m*I֕Y3kMddHqQ]VV[JG G%c Y[u̅i컵+\kDvZ젖 {KiܐI^2JZ8碏V6o)\yJ,ԇ JҤ嚰k-aMͶۅxܸm㇈$%;UT&ҹG?6z}Գ.& #$gq#RŭnaWx1c1pb3<[RҤeMI³XNY=ùվd"P%>٣~d٬q=7Y }FX{)nTgu<&ѣcX_[wHpV,)%I%FA@1赀D'*pȖ*|68@$uJ ud @9Nx6!lPrfiiN8%إjJ J'':Z]Tk Fճ`ƶm\Uph qO<X#!b`[mBdDT8J ( pI']jw,ik\{E)JI JR2@MqY:Qޝ+kOcw0T*IsZG I}W./,Z6UG87"2^}Q eg<|J᧬ []'߈< #ryk~C,aC̺ZB<#@Pu ͞j]ޏ G[%)@kz%H񑐣a{{?oӱ5Jٜ# rLd{0V8eIHnIi}2Ņ:vաK y99l ²YEh!4d!R6 J֜rR|ޠfZ=%R)Z™S{SCjBJVIN2SjuM:W֞eIaT2 #ʺNiYQn\KZJP() u_ =`]1>ƖD-yYϟ#LuեzYnƗ`vKK`dwZF7g')c+VKJ"DZHT{d'aBͲ;ۤ8P\ܩ$`"xzZ;jqSyPZunRIA fQ qf/|6[ NNy$(uzw7+U ]< w풕GN4 eA+3BmD[Zmv0)21 |(aAh $R~e.ڊEn< 6QPꐎĎ G|5mv{ENf9vK..,d4Xx22DŽ ޓoQn3N!%Q2+RVC}CȎSfԓV*b%)ԥ<ʖ-\s>+8ZJUB)@)JP R)@)JP R)@)JP R)@)JP R)@)JP R)@)JP RI9#Sm_/I#g?Dj#6a1aCP!2R( {Ѿ6mY-aUy}{lڲ[G= *H"`*FU7c1v;Z~HҪ9f7n{)Jqry̌zji#Jڛs㿱ݻguwcSV B?$iU[Sx{w?lcKg;q΍8?!h Q2HO1Ign^ͺRhJRRu=J[ٟ' g&3k-{P%)A988‘U%tb#ɸ/;ܴLV-q2B1}UVXݒw0(2]JR2)MN󆕵kRJ7u*t+ڿ\Yg'ʍeÐZMIFcm!{)! i.'s.UIiěo9 P_8rXI9ћ#j)Wk1PY|vV6ݝͬrF@F/XsdjXTPPzR؃!ͷMYZV%3x#<6#d;NOIZF30"Mїn yWe$K,p@c$dV+EZ%"\mu  @ :Z:Z]z2V{MܥYm(6CљA!JpP't.􆍋ez`,:rB6_}ռrpVN+>LJ*B%\x<7 4(1d#tcB7W_nێ[  VhR$i ˹8JzfDNt]ZV0u֤(eCUkRtBQt7mr} N2e9QIA$ql7kuipd{N (g  +WUk& 0[μ6aKZ A8%XWi=Ivj̍kS jiܑe)p7uvӠuM&nUe6X~S2qRiJ N[Q FBplRŷ.KFw-rݔw8; #l*d»[+ҝvJ8psG-:je:di%Hd-q0ZР ]Ck;4-s\sԂڎ q`LRIP8'5hZśOGu][6{O6ϼŠ@#kt/Aԑl˷\; BT')p<@UzX=6 HK9حLp]+N#%y85QX@2ro*2}m();+rK ;3*5iX;/^uLf[eز.6NJPɨ-٠g\Nˋ-pe1d6eƜZBBҰ`Γw9dzw\Dܒ/rEaC2oz&΋+LhV˳F܄ܜnWgR q.CrSe݉* a*(a !E T6Qtpu[S1և8.' .yy#rҬ$c!ATʻz-f$>NN6HAW,uƫd"VA CQ}Ҭܿ[ģz4o̟5'$hߙ?kOe/M *)@)JP R)@)JP R)@)JP R)@)JP R)@)JP R)@)JP R)@)JP Rh.i&I|v+^I@r$cZݳ~'oK@KҢ;gxO8ޖ~'oK@KҢ;gxO8ޖ~'oK@KҢ;gwΐ;jBnS$X 8 Aw?6sTFڿ2?j_G}uWGmèciwWʡaCWe)U)JPMy}{lڲ[GzFٵdMGRzQ:S0/MCi]kq +#'Qzv>]l{LgOv9ݞXӉ Փ/?&e/W&a)`;\}x~eߧ̰Y #%,rݫpUϯm]5今;N{ܥ(JNsϺH%95o:ϧڙ4Lt)! :'=2T)W#4'o7lA+&^-~L^M2Rw+]ڹ' %\jܗijhjGH2}**_HV[zÒ8d)Yr3Jt4Ԓ6%I*fS ^6yn\=Z$RO:>tIL EtVl/+ O!p̺_w+Ӛxb\I0mw-eIuAX,HR!@)s3%Kʃ:-d{%KwIt-@J7+i@sN֢4nN*&32dLR*ld ²2A_P:;V덡X!.g qs;( fQ X&K8Ju r'';U;ވ,+lFih9r[ $hZO_,պCRn3zNCm\%%:9W. RFΛrqu Ie.6(7jpTDU`z'ǜHJ.4*<qׁ@P]'}qW]FW"rB xWs4:rzIXΒmWj=-얾ܹc~@~ޗӎ[ S#zHR Tcxu:Im*C"χ.&ZL4PVJn}Np-軽yb>}*wj,[u݈[m HK  )նZ!/P\5WY)kj) GpZm TN^o^lV&&ov+=!q@)=O>48םLtƤDh=>-:V].3g@v6t{٫`Dv䙓-f3㽼 ׷kҀ.Wn,$:YCcCgzPý#uo'~ef}C"F)[%ǏcNֶ(T1i,GmR=xQ-tf{r*qIghLuϙx\VOp_-bQ7O}KSu4o̟5'ꎅFzFsm%o,5EG|EJ]ę ;Muq9`yk.gsN5"ǻHМ/͇#W4}H)#8?Hh>\]E_j-ݖJs)uC[ [of [V3M%2{TE\%cJun:T& $sA#+jOtu/-ӿ @H;T}G9;nR6#IP8%{V6O䧫'edWQǽԨލj9~_6H%=X?/$=J=ކGoCNc򟾬l͒?OV6ORz7QǽӘ'edSՍG+ԨލiTxF4?)Y|#cdlJ*<xzz?{ѽ 9~_6H%=X?/$=J=ކGoCNc򟾬l͒?OV6ORz7QǽӘ'edSՍG+ԨލiTxF4?)Y|#cdlJ*<xzz?{ѽ 9~_6H%=X?/$=J=ކGoCNcGiS% >RR I {M#\Q8kʀ'iFK̭o*Rhe#ӬoW8-,4ktؒnr[8me : 8)+'*a3۝tIS-˛uϖ1]k 瘎.)PH* O,V :]Yʆnp2C'8Ac[,NneTn,-=-4JAgQ bWu*lktluĞe!MhBm ˈkWLk/}AknԨ&Jw\Pl@JRTrKx2 mKn;'q)KH\d% *RM9jw.[]5@uRѵSݹpvwKA˼n%̾ێ֢Kk%hP9V Emip~}Ÿq܀J/[@H}X筡-7V]0TѻKmLvl'*RG?d)UVYYZM3lrlŻk됧PN\qkmi SgS]&QhXQg&-쀶i_p R7aGBk;6]2N@4^w[[1ΤLzN?iaD>[.ܴJpTENjK.p-3YV,2HNӓF깚qzjy‰BKg@ hzެ3o[DUwe0"U)_v y\~CuQ2rj(qJu严!i[!E!ntuW٧dnQVd! U)]Ybs㥥EHyJ!ŷfkZ..ָ(bF׌dgcA(۾wiδ0-ĜiK-TWoM.K&Ӎ))} P!גy PA,R]Elat0rBR6̇PVh * YiV=ې13"A)*mԥ`skoNjVe-?Sn+NAdsT*Zi녦tI>5_aHw8ChA[![];sjrfDE8m!pPxFFNFq]t#1Ѡ%+pYPKJA )(5lnjŀ q6RA@Nҫufw,JwY$q)X* F#pvfwW,LˌgRϽv_܋4븸-bTgc ӉJPP6Yniï[|WFv;276RG1@JRGߧߦ}}+}}oGߧߠ=RGߧߦ}}+}}oGߧߠ=RGߧߦ}}+}}oGߧߠ=RGߧߦ}}+F?gdt2!a;ՂgROwsSѵY:9I%+JjB$*= ~zNh]=Yc%)Zv3 )YZIJq[[T;~~J~~T;~~J~~5X%'x\e&<p!\4*( Uf宴\FSt6Z@QmxՂl2[f; \QB2I( Ԩ=?,wَBȒM,ʄWq)u +Fp7'#Αn> 6-(a* #jѸpRA@NR k,;Nk%2HJJBT:[=Il5)#7!NjsF68dP=3,:ZLqm. VvS)>ĽkB\tq&C{Vx8F H٣~d٬q=7Tt*30QٓtY1HrBSc8 tZR-!IPdY6W.Ζ 4==R2|o;)D,D} T{ Skt)TZT<=a$֒MJ7tw#OBL۲g99zgмhŬ._?O=KZέI' 76 +rlAF@Jhsz,޳= .6+FH@~ o\ b5|epcq[2 n-N+b;vJTs -uy+!\-ohr̍ RB\yƂV֖J@z[S_֛M%9o61<Դ`q;Jd..7HIݡDȡnmq ogjm<]V&iU-giqoP9`%\m. 딦A"ɼj@."ߧeof<|ӕ·)Ij#IiK]/vwXWd.r S,u3^ J9o՚V/V:(_~ELPURe@MRjKmQ=$0:q d+jAQS O1R>y_D4sΪjѤu䛴Z23S>V│37e*zMY~# AzMY~>y_P'j—nԩvw1J=ic>x>۔d4\~L%{$^['O$lHQjͩI9#Sm_K؞ ߟ"_*݆\v)┥T@)@U5ލejo fՒ?O5Ig)R@in-۝qd}-4j VY KԨwi$DrY4>xbdʎp dTZI RΗ'ΒX 89)Gjevn[;•Ә%'jH8 Gܠ()JJVflxOKܩ!e:jFqՑ@g)@)JL͏ qە$,B0TRX:( ()JJRR6nÊˏmBJV VN͸K+C.>:Ty =T5*EP_t'w/(ށ'cs)7O}ĔJmoIq{I OPA QШإ`z>GP ^\?_׾ ^\?_׾ ^\?_׾ ^\?_׾ ^\?_׾ ^\?_׾ ^\?_׾ ^\?_׾ ^\?_׾ ^\?_׾ ^\?_׾ ^\?_׾ ^\?_׾ ^\?_׾ ^\?_׾ ^\?_׾ ^\?_׾ ^\?_׾ ^\?_׾ ^\?_׾ ^\?_׾ ^\?_׾ ^\?_׾ ^\?_׾ ^\?_׾ ^\?_׾ ^\?_׾ ^\?_׾ ^\?_׾ ^\?_׾ ^\?_׾ ^\?_׾$͜U6̏ڗi̮3ݎTqJ$ >Fڿ2?hCvO?D:U ߟ"_*S-)JJRkfOEn'JL~mQ\y2TiQI=Y;lןz7ݗͯzFieQG"+jRL$FJs#vpz&Ʋs m$5Dc Rƛh3E6yL/7#-$6Bg$O,Ή p$Fy :_qG UO*߁:vۭvDǞq w򥬕#[+EmM RS9Q'.Uv9PKwerU>YƩ}wcya{~:*Ae<WHzySE7oeEԇ#Е!RT lxVhbٓ&2?uq(!y㨩X𞺪޼)ƛriIyIrr%#)TH7e|eZIFA=]VӒNru\8ӻ~;]ѭDi1n 8mĔA+0(uTNH_bv]N3p]:5~v1[n)FTRA䤤AptӚoK캚BͿǀlXql\*m 1)#9N @YT [ȼ; "1JXBCAj$9mF`Dړgj3ǑVvTT^:8\*#j:Ғu~@`.n6) D5 ,h+Q)Gv.W[໔ul[Hmo!)Il%[pqYU=XDX u%1ˈpPVU3=hnJ- )o V\V嫙8C( KړTDzsJi.w(&H~%J`1igxXHHbLOnR눺ۏ Oci($ CXJXK1CqDp$F C)+FA†G]x;l]p+%Z]$Dj]sPaHT6#ql%^է JՏ^Z/JTMW=59vv4u)Hl233<.'4, Kx.oJx!@+ j[- 'N~CKn[Rʈ,POch>Bm3nLݜ]cCeNTJܜ1[[jKCƟ1vbq.*i NXI# G̳Ckud=&*ؚ/0R(y $(YX VY:IfSkTXsaJz+mq}Q ghuVJҖ&u*oܻw2Uɘ-40(J[IQۜ#MCXa#r0x$\hkn䄀TrYWWŞ˥tũ-rv;R/2*7K-V RQH8.>}9m2m![Fq<@smS"Y|90xDd%$n8RTUܭQZٍ2*C ,4֠׎#QOh2sJ9l͝o)}V:w N1 h?uыXJRr XpnyK.(:PmIzڍdvරI!;]_)9>U5^~N5$@ T^8dl$8I%ECZPHT]TEC*8Or6s9ҝ]]K/TI~-DwC^kJ8 D-rZoiSM!89AQF_SɺKK%wMHޢ(ujHDBRa%< QܥuF{m7lB %+eKKڭRTdI:O\b+&=֒ҭڜ8;FG!@s}+%ZCjC-s޸ZM6[PUZHJ7<1$םQsՒ0nn*,8ZX)CkBIY)W]^tmd~t &Λ++R Qxܬ(-='urg5l5=p[IOcĹɆqia`+8c&UnP1]mg=ǎr68X)icƳ[DvkTR^$ה QGX@!ALƺICVqMϺvԚ}m7 Gn ky/q ^s^UppټrnntJKa( ۀv3~"#K6rSp.rd:Y[yI.8ZA$Qr6GH[*wޥnuPs'=wCؔN@ff׈lѿ2&6t#oDmJ=Tt*# ,構<;iik(@*Q(#w 3dX䓬kgCl mmI1?֖տvlޤpONj2ֈia6Ւ#uSԮkrrUR.o6v[>9RJzsVaF݁[\JTĖ}4^ $G GH,7weC+vso< t*ٝrmeELf $9_3S( 9_3S)Õc?%>JÕc?%>9_3S( 9_3S)Õc?%>JÕc?%>9_3S( 9_3S)Õc?%>JÕc?%>9_3S( 9_3S)Õc?%>JÕc?%>9_3S( 9_3S)Õc?%>JÕc?%>9_3S( 9_3S)Õc?%>JÕc?%>9_3S( 9_3S)Õc?%>JÕc?%>9_3S( 9_3S)Õc?%>JÕc?%>9_3S( 9_3S)Õc?%>JÕc?%>9_3S( 9_3S)Õc?%>JÕc?%>9_3S( 9_3S)Õc?%>JÕc?%>9_3S( 9_3S)Õc?%>JÕc?%>9_3S( 9_3S)Õc?%>JÕc?%>9_3S( 9_3S)Õc?%>P:jͩvqIiKY(# Hߪ5?FG }m?T6>6~u|L*)J?o/ VKh?o^=v^6iOC=)J)JJRR()JJRR()JJRR()JJRUCQ}Ҭܿ[U EJ{ro{lѿ28_?򛬐>٣~d٬q=7Tt*3ҕYj^^[l7CoC;cdzq3$8YPӵF*vfғ@;6de=`Ui{ ޤ)BL*ʂE õX4*.ӯ_rnL{ٖBysR1̎cj1|]GgCIyMDKjd$A=G"Fȿأd^[])r]@iN%dC jTMEmy5gW@nԦP^5) YiRۉ HRIMfjڮ6|YjDgkR?h34ׄٙԶg.kRИh}JBĥIP#H=FFzvn흸ٿ;);yk+XKz"M2$<Ѹ4 vGHoO_*r\{\=YS#˝{7n']n5.-6(?fLm)WqWVRg|mvKٴ,d :1dXl [wXd{3- eN-a @X8*+RRrJ4)P^fI͎3iJJJ0:p TLKҜ5mjmKu!L:Rۋ׎U-P)JJRR()JJRR()JJRR()JJRR()JJRR()JJRR0HQjͩI9#Sm_{ ߟ"_*݆\v)┥T@)@U5ލejzѣ;%eA)$3;x-# `(SFٵFk=e%Kze)a+J[< &P%SS畕tLzZ$ej{ѹGgD@8!* !x#D :V1 Ou,,n)cp B8+If"w{y3me%{B,>JКԾn}D=>OWrϻm8Y sdkzlaNĒ >;k q)9JAָ9l-6rnc@KTS:,($s%Y$癯=/nw] k=˄6Iۍn!<⒜mDeC8I4RaՍ rzHO]]FJRGY?!ޯ{ZjIkWx Rḗ.Q0;55UV =&UXCܣ#8O\RI.7O[]nQ$FGK1V8 Q8k{6;2_a@QYH)՜U6:k"]R Z]*?E]L}]J<0KBPepJFyE?HZm}--{{~wҗ ̿ZIoVU/sV#l--$ۤZFiۮ- oRGdVǣ׻o*eW`{)Z]JАy=YWn==#P#ʎgR⺇eJK%ͬp@:OH}Gw.bo ]Rza[<48Ҥ%I^;qoVio^?TGuÒZ`Nѕ]ũBcTI[pP49B N][YdF5˝MS0Q`~z_]Nig{MXvB`]輻+m'!mq o ʈ mQFOhƓhoٓlN$S=`%$ VHj;: =Uji J1$2I[j^[h(pH4,=)斷_*|jRmi~0.TRd)8<+3nqK=n8tZ2!XTΏltkۜT=*@ YV ؐ01{O:e7Lh]жnu 2l$$r @Eti:VpZ˅ \.-% -i=Zk# UEtdMT7dU ۅr0lXڭ-<XiKa[,dwL115 6\mh#$)uj'Er6>1ogg:n2ۓٮdlhKT _u8 }XJLAiHZGܫ cO;ROs iw&-i㱮S==nIsV:oR* d\%+ēh-,aCiHŏM1obėelgo.ܵugbQk'cs)7O}KSuGB=QF:6{԰aacaIXyh,@*u$ 5+չh!Jt)Rǽ ZoQK:FfV3_d'dG^:*rcuեz&ږcK!Mmw$//N BV˵Jt^ҢmD.vTzPNJ@ScՆ Xa1 fbŎZePHHR@rPI5 kWn\U6:y-dC%++)RNw%*"2FR_D:땲^iJrjc-.qY兤:r0UةLMmsr{W\.K-Jb%,%NTNT@oF*ݡ\׭n)n]{qu(OgPghN ygg#n^/ll۳X[htw2噅țS*-c| s}lymyWP2 |=0F}haͱB qhvYyub#mP=7mm'![m{P䴯, peÃJdjϢoޥL[L}Hki!6t!dmKm@Y7gQ5#ZbOo!wXby\q #ڷ 6 /Ԧ@Nu)p꒨;LaV|'hk&e]!i?Q}5`/1aF F&IB@()JJRR()JJRR()JJRR()JJRR()JJRR()J$͜U6̏ڗj5?FG!l}m?Ubn)JUD RS^=v^6i޼{Ѿ6mY-aQԞzR$ R)@)JP R)@)JP R)@)JP RY=ùվd"P%>٣~d٬q=7Y }FX{)nTg)P)JJRR()JJRR(+}EkՖ-[B>Ttǒ@m@ķҧ u'g/õ̧U.DN;?Y~e>2AMD:+v~;Q};?Y~e> I{?Y~e>?;V"mRCABJq* w14 {%i>H꒯BpE~//5Dg>N9\yFc(ϫ'[1d) S*'i‚RWn9ci${O3{RoNkR$Bu %}ݫy:ϯ %J罗||Q:NJ罗||ReaK-qA;j#'iK`j^f7EȶlÁ vcf;R kJS%rA#)Mǥ{dvd;>#1{/'xBԑ*.t[;,3"rzxIaIARrcG7ObL4M*yŜۑIea)n-mqV^$o\XfZ ipekFЕ 8H$^.5۝v$Ht62BFTy "*b4$4MZq7$)Q܁HeZ;q}-*HSmBw$rJ+H(;P.vƈ;{D-ߋLDgOrXWxy*J1՗\oPu.՚rv(ȂiL㾖TT ޡwY:%}#k-#sZik52|u#=V6d'H/=+ .ZM\&EuuCIiߞ})xސA:e SNZK.)Єا0oYUVNK):=& YMM6_By|GSIչ $A7>-c K wyh!8)} +-G@kkqtsSOW^QZKR)+1{THߵ͂ԭ3V%!M l Q];`ZfeUĘ쥀P3c0<ޑۥufޗ2K28y(p,V2 Ty1@nkwy]536V.A7+;^p=8 U^l81{*.i瘕B$ݸ:w-dոӰPGCWXM>[ #)8 i-KhֵM栽y '*L;T@㨭L鱨RR^BT*{N U4[6lۏwcR+dx=klD=2cVBl3캕+;i΀CQ}Ҭܿ[TBtfsr ;{`sJ$ }FX{)n@ffR9QШJR R)@)JP R)@)JP@ű[5DtECIKIh'h@@ 1rSK[RmP4՚%^{&+0[C/gzp*fMaۤbikxRK2#5oi-/}]lc[`ct0 R`laҁׄWRR()J^\BmM!HP!@k([%R`je9?W00/cjJ9"n-AKR%فFRq$<^2@J` R R()J^jҬWPimޤ q:m%hW" ATR% /VZiZCPy⒢H `Z]'kft^UmK ,d)+D>\W%*_ZXҒO@I4YP\5BVn/ jӧl%fqmԢ{@ch VY찲6 .4MtXإusVtoZ,3VMvBqLrgp~uT[m֍\ݻQ2f.L8hJ.4 #JP#5 s|Km|eiCpZKIqppz@_.%E VsG%6hBNx !K$yUJ߭OCY/)H(P!IRO4*$`+ȸfֺP@k˅=E|uo(KTSb00U -xSfTcD_KD.q9'uƠcJ;C+mnC8SI=ⵔyU['y:~#oD*D >*NޞmZ6F+TL֭['XYe)7{lc܈fKN-]A%-'u:ǧńjGb7eݘ\Wdb8 K߯K4̿^-p6C(RRB@$+ܸx3ne̸ {iR^hN[mjᔲ8n~%؃rc_!1ES|` Zy074Mc"jv&SfNB[*m-[A*ˎxLL:b7ٚҥ9٭9PQIOT1GzvMӶ~y6|kG-~RTVFcf4+-;m/,%!:Wl; ;TuIZ/Gmw I *q/'rSH%kX}Emv֮=e/RVS'!aFG$F vwBVXjiAԐ: Q<$>zgJ3N=*v7쿯S,yҾ1+Ϟ;O_x'ELmJ3tl>>z>zgJ3N=*v7쿯S,yҾ1+Ϟ;O_x'ELmJ3tl>>z>zgJ3N=*v7쿯S,yҾ1+Ϟ;O_x'ELmJ3tl>>z>zgJ3N=*v7쿯S,yҾ1+Ϟ;O_x'ELmJ3tl>>z>zgJ3N=*v7쿯S,yҾ1+Ϟ;O_x'ELmJ3tl>>z>zgJ3N=*v7쿯S,yҾ1+Ϟ;O_x'ELmJ3tl>>z>zgJ3N=*v7쿯S,yҾ1+Ϟ;O_x'ELmJ3tl>>z>zgJ3N=*v7쿯S,yҾ1+Ϟ;O_x'ELmJ3tl>>z1+_=ro컝3ޠ:+?[}m76^melsmG{o (ִdIdi>pntuҖoCspPx<3MTmݞEE$\4%šftm]ptm-.JmTh* Wr΀5P_t'w/(x9O_oveaj$[N0rI=xs:sVQdm1p(R$@'pa)iCؔ^iJUJRR()JJRR()JJRR()JJRR()JJRR()JJRRwMc2kQʻ%*Q<yVD^/hK&[{վ'p uo;;zgVGpӤ,v:62TIS$6uo;;zgVG?qT̸/[[a'Hs+]a7c\kEe-攀HN#9R L 3|Ocߣ:?=X7Su0 uo;;z6};E0\[[h{Ts<5fP_js$T6&blvSV3dxVN꧛Km%c!< a@ȣk_Xo>UuB:?=3|OcߣՃuFjAjDnMQi.ein'j@+Z A8p2igVGuo;;zuۜ}Hmӈ~38jq)ZN_έ=g~Lvw`M+վ'[{e_8ۧ{wfn9#:yK_*Հd٬ݜ+b=m lSn6nmĨi8吠G/Lno.Q ߟ"_*݆Tv)┥T@)@U5ލejo fՒ?O5Ig)RAAirueb֤PSkKPZRHRRr̢Ln!+%NCUV ޴mh-w[\4cȄ0CЎ%@!`,_b؟ 6'@yM8x^'MГj]mTj^%>tc=Sw< ^ ?% mO}!$)+# BjoնLm\YžudrRUNf;jH9Hw/>;prKo"hK\52$ѸPa ?KiXֻMG֎aiz d6!eTԒ+J) dw}b|5 n[-hv*ԇ`RZi?H@ X^[.ӥ͢ƘV?etBԤT(qm;`ޞr){ha !3d3xh#Ó!AJTR>`xx^'MjCmI7i\jn>dP }m?T6>6~u|D*)J?o/ VKh?o^=v^6.gt9:UcjJIqޫִUj5+d-T‘)BdPKwGY/nXQ: ۄGiTSKHH/Qp3/Qv/ָm1w\'h;eˮI2#2>Ԉﶗu!(d)$r "͜u_Kzo%#'u۵5Uq,7K@ŷC9igU'JDPnN Hq$<PTPHۅ,Nt)o›lsTŌwWv3yp֞A JI:* CHǸk[#We|$k8[)$wNI>$_=H-Nq`ğԬ߾xzpzI&Gi'ĚKEp+7$`ğӃO4R>NI>$_=H-4GX>1|'ޕP^PPnU瑐rըI>$_=H-8=$I|#:}$JJJJAI X/RvfM3cشCmx<|IzZpzI&Gi2=J?秩X>1|'M%ԏӃO4R>Q2=J?秩X>1|'M%ԏӃO4R>M>VoS2!trj'ݦHm|6ʸhC{ 9*Q%j獩LVKy*H( {Ѿ6m{7OK,x<[Rf"2Ts4^5ލejo IӚY\Z S1!m-'dLyq*Z^p91b[vmq*\q+ q8yj>L[ԪVrX?daK;hpn ʋ)G/+bCo umlʑFu* qT멺UpM% c O'}i24+w'h}5"$㋆;[ZH^e^eq^a+XOt$˖+wCt}m=;--vW֔D^P}.(c"+GX@!ALƺICVqM`4dtx[ֵŒij-pRVA `,)ѽ\b4ҡ-f"V R o \&Bbn쀄Ve)xRTR 'Yi@VuZ]]4$[ nra x,8r<:}n~^D6Ȱٓ>C/^R˧ WPW*Ҁ] liHL7b[\@Xq$yu4p*m`&|\^ N殡Uct}[YQǗ&$'8 JJVYZJA=ʲC/^R˧ WPW*ɮt}[YQǗ&$'8 JJVYZJA=ʲl;g c$c9);iIZrA»zC9 Zv$8a0im\U`x$RjzNvk(ˈNVmHq/‰ cըr()JJRR()JJRR()JJRUjgi%+?6hPTEU:&Ѫ,"jZ ce>Z9JX2䊣1EY/:7)RO J^?5jIoNä9RmVCČBhrQJso)E5کJUȥ)@)JP R)@)JP R)@)JP RTןz7ݗͫ%4~j?o/ P}5KI.* I!KnPuDךoE׭i᷎!,H߯f~#+S.=>R" V8L p9'4.NҰijcaeqMZUNp/M= RznvC]8"̙ o]-)ؒVá'ma. ')RH KQܴ東.b8[6ؕ 6H Z{%I[ 8e&߇KNEr ox7.oڢq2RJbCMI4YҵUV =&UXCܣ#8OTֲ&Xϸ)d+tDtf$=2/ w +›i/IB՗)IXeGEqk}"qޭ:% ^ 綬Gy*[KZ3"9IIz!n1\([כ-#@ޤ/r<;Ƞ-+'Ko|17.]w0e-JuiRjUn8zR47 /q*# TwuM:@- Y'U}ueZ-6@ޯ88qͪڄu%D$ϔmY(.Xl8ꋺ$`3 R 8y%|ph +҄ZYLi&\;^!ť7))=I8B:=:IZpÃ94ga)\D;%=RשTV:fQvnCwU&# 1ẑƀ,Zgvov]7>^= a[ {R'CٵM2r.ٚ$,>!{qZ <9ӵ+:Iknr+^aןg3@t:W("YZOFGn_rcGLvTT#C`nQ$MTW\^[~CorMQw{Ҿ\J}/i-Ju=kPw:nmCnE9#wt*͠QVڢkRAe( 1[)rP@QVܓ΀*ҾhWڹ yt 䅀NqAsJxHtY:IJ/0%)N7B7NyՂR,9"v5LDd|XNps**RJϕg>`osr}য়+i)J<$ RBJ PRښsc.X+!:Ґ1K/~7sm!4ƕdj=K3=O w[+PCxhv O֣hҸ ;Nz#a9C I2(t()JJRR()JJRR()JJRR()JJRR()JJRR()J\?+? S5ͥUfbA[7.0v swĪ VSmUu_EUIz0/d;#cOQݻM{@I4˭JR )@)JP R)@)JP R)@)JP RS^=v^6Hҗg;Clijo[,%iRBp{ywdX57zC*;ȓFŗPr2 J,-iݚ*a{COun\ugr^qrd`V 7[rϘk4EMgYٔ<"rK!%YV|4}4ݛ/d/x{3}q&3x,|S_/Ԝt=notmt3.&3n6fKJs Uu*x]]ep* Q|)a_j/E\{RM6I5ϖ0{E]- j9e/Qo[E2)C%)@|_\ OId /U({X}"|TտUOMMrPKbT~ۃm[.[70\[9像_/vXWڋ>X~z<{&^^y(F%PU݄ 3՚xچsڀ;R5 <}vu.+|T_ +z!X;?EHo}_0B['ZmTZ5n]8RaK3.(8q>'بd# tl}לp!ݕ,(uvXWڋ>NQ|)`ZVMUiECݐK(qܝPRAJH<޴fάƨ"K&r[>%m@6&AG2rko}_}"ݫ-!dMoFLXq w{0y(MC(:u;3sZ\{!izFԥi°cW7 aE :ǚ %"YP@;8Vo}_}" +M/NmƂҩkNBhRN1EY85Z[FŹmGLq@!PwRATQ|)a_j/E5 ʮ=X諆\MJFs}}"|SP/k:NE[ԇԢ"3e]!|$_/vXWڋ>MCnUM, DL\yLjC 22T2F֑^5<m PjbNQ|)`R}|S_/j/o}_}" *a_j/E;?EHJXWڋ>NQ|)`R}|S_/j/o}_}" *a_j/E;?EHJXWڋ>NQ|)`R}|S_/j/o}_}" *a_j/E;?EHJXWڋ>NQ|)`R}|S_/j/o}_}" *a_j/E;?EHJXWڋ>NQ|)`R}|S_/j/o}_}" *a_j/E;?EHJXWڋ>NQ|)`R}|S_/j/[un!.BTy τ(S~Q|+^}Q1ezmv#  eJ^؆R8$uy`u$#mKKgsN7#bRi'%C[_,=Kų^uLVkA~+BSA ʉ) F)eYH*lR()JJRR()JJRR()JJRz߼|FBI0O3=;o'N}(m>Ӷ~xJy?xϼ|g>zRvO3=;o'N}(m>Ӷ~xJy?xϼ|g>zRvO3=;o'N}(m>Ӷ~xJ#I $5o>zRvo>zvo>zRvo>zvo>zRvo>zvo>zRvo>zvo>zRvo>zvo>zRvo>zvo>zRvo>zvo>zRvo>zvo>zRvo>zvo>zRvo>zvo>zRvo>zvo>zRvo>zvo>zRvo>zvo>zRvo>zvo>zRvo>zvo>zRvo>zvo>zRvo>zvo>zRvo>zvo>zRvo>zvo>zRvo>zvo>zRvo>zvo>zRvo>zvo>zRvo>zvo>zRvo>zvo>zRvo>zvo>zRvo>zvo>zRvo>zvo>zRvo>zvo>zRvo>zvo>zRvo>zvo>zRvo>zvo>zRvo>zvo>zRvo>zvo>zRvo>zvo>zRvo>zvo>zRvo>zvo>zRvo>zvo>zRvo>zvo>zRvo>zvo>zRvo>zvo>zRvo>zvo>zRvo>zvo>zRmayavi-4.5.0/docs/source/mayavi/example_streamline.jpg0000644000076500000240000011671512747716313023536 0ustar prabhustaff00000000000000JFIFHHC  !"$"$C"V!1A"Qaq#2BR4brt$367s5Su%CTEVUcd?!1AQaq"2B#34RCbr$S ?B""2v ղq $ʾ*(I>`x7rPMKG G QniJʆO<\;pFAJRM7zU8\U1tG[.[h%ZO]K$9o+ioxKµleoKŋ_XQtHӷŊ]'S_{oԶ^5l#쵰= <JT:0ӺQFʺ)pN&en$)6(eE2]Z S`C9.|<V/-V6n <L;+oo7Vwy^W4Vgf ]9Gc]̵85.a|6^Yt]cu|`^]xYuf &¹]//vt[{L"!bV_\E~SelHQk%Œq~AQ R_p푕510TTaa v [qksnJI.-ݱ#S:d`j֦Ǚiۖo -2̔k*DwooQ1?P{{@P\ <5%#&q6+_쩚ySPuSlLM_N8YN xYҖݚCyOX(-Jv:M>CUl.Vk1GKǠT5v]^qh\Zv!TV@i% L|I%Τ &/Ϗܝ%a7{|=JvtHFh*E`a[+f}`d~fCC -AjH+((ZΎmmAo5$UsY ZRv#5S iXѾW3skA,MKOyTU19w_'%hjW^[ kUz7Lt;#X>崦aS=eO!h:xl4ͼԟk?r}aMXs^%sN]/n]K}O}3K< qkia]*fB9IU}?OV1$x ITeςA6ZK5C ):Rͻ%#DH+g@;SེNGrYAP@NPc:L}}T>>|KIspfDDEɭv jjK$ sqȌ+CŸ/Oz~Q1G+OA𻖷j[mk Uquh>4^>,ü{JcQ"m'q*;Ii-hv6cHE:Kcl !n\x*~w~;NRL' -*/hdsm0{F> ?G b>*ZVJ<M;JXN2FJ41S  C2\GcK@׽Ypl1\nk &*fW'5WC(U ث77ef TBWDZY{`Yn.+PW<+*rIŽ 9Sxs ʽGe]b D qO]Dz3`)?U?lV7{ ^"SW/i^]yG{ \jY\b$c/ ad[ʑ]4,_t5^C;9Cf{^?eCp'g>ZJ+=ZST(UlG Q CLaw*JIV*YEeHa8 w!tk^ev"=aZR7FsApkةyiFr7J Xy-*I+'X^=i?|ڿa+k*M~"{")5""!B""=><~1)w+=-ppUc20X1VvihtA A%ѝ+ܱwy(Lrrj M ;G]6ZgsH_:|wodwMpwHf3:FAls⾯1<9Ö|JI yY=Tb9ȑ戈$^dcdac O0";/A-7 9wyۤx %ⴁF~0`Aك<ʐ8Yn\Y鎊?HMsIL!v-{FF6FAV<۩=uq~AKSU&5Z e3ԝOOYn<~c=L[qd(@SEYWN2Em[V4J#$L$`]#unwNa,-y^8 FW8K /S0t5u !Has91&/,j洶UR5޵*FV6+a~ySB\×p25E*Lrh$nkAB0P6N#*+9uPjf18Wrˊ$eKӌ>suQ4[鱕 ԛ^luJ֒<@a68\Ѐ-;a[@N4U+X^ӲЮ^%%y WpWF5}=Q# # 2H7HA)iCH^dQ\ݔi*s(,%AT;,l]Wb*ۗ/J}CS~LZC xBP6RqpEq̒{]ppRjTGZp  @;0LKrRJÐB'M(bcGTL>- ;O5DsK9䉤ogPD]Q]IDDBDD!X;|UITԌmަ>kmeجäpoYZ6OPVTWIY_a8j;櫗%zWP[S$v^+ᰜ߯,us=3@:[:VكS4tScmJ\o[KvE{tGu` U1YfGjŭ::cX!+ DATMb\%d~x͊Ϻr8Nje|# L?o?rТcO@n~|^abmܳ6JG마ϖQӵ``71܈¨wqcV8J$g"Xg#,0068j8 t!WK5S:($]$kQkN9v{Ե8))h\kn ;Éǂ8Z[(pKT oG|RMwBdM,<%*LgBu#Ei!0£ h+93+HnsR ,`CȜtv ÂAv^0:@Z0nW}v˜nT & +[ul,<}-TsAo⥢+2\R^.;e$noWB o%.9[ 2xXfdM&$rԵPZ'xTPs Ӛ*j7Uq\St@>^>fXD,,1G M&1rRjvb~:'S&<QT|PY%oٸZJʚB ^SUuHݨ jDwU?*w|G.j:Rhta8. ?ŷӚZw8nGwt/\1 #4rN>BNI'.)ݞOڪ,~+CwDEDDBDD!\E%CT IkpA*7ĩ2QOp(3:njc-q=_SՄT%,ΆAg4حNFt*3Wwm+# AU`THFUmLV5#eWP7O6bIܪܭ82+y9bkP nH*RQ^-M#%]Yْ U0EH]sZ6!* 93R}, Qj""!B⋡҈?%Gq%$Iܭ)jj~ry㥄$ nU.;rlߟ|X/"g-OZSE#H9-uTpcry%v)٦V!JOYJ:X2R^۷dN֍+ {3'x ,**!*, hbeYʹK^6O~NZEE&H${>5xƵ cCZрMॶt "a^iAqa@[@ ""B"""A? _N2gmY%Ayη6""!ye™ֻ=Y hG3*QUCih { M¦Dj#)6^j5 I/rD1GspT&2i(a;.ZB/ PU}1%ӵ8[ۤcwanۃtƾŶ*vÇ! Ym%Y'S*8e` j@Ÿ*ߦʟ .mDrϭ%c!%cַ3pm$}2hkȈܫȈB""""!B""""! *;*B~ոwiMlYS5dohx8^GIHZ)Q=r'*ЭM\\ \jX(5#bjWdn>!25R o3Ho+d)RO%N2=ZW0=՚J0S < ;TwtA\'EZS)d Ftz|U.v7^_;5Pne(6亶75 D-"$"YS `q@0@z ]-> eVQDD!U;xcʳnU߲ܟv=uz cI{}9#OW&l""ѕ DDBDD!DDBR?ZOES,`:BӸ510B֬zV%ޑ/DHˡB"": d{wV6`9T@eoMy}ݲ[XѺG#!'̸/1Z,uV+d+}-<X>^2TخœRrb,i^PsFNWѺlE+.sU+\'ll p#vx=Z[Q4YRġ^^tQ*h2z bWVddⱂF营yc_J9, 򲔗, )ZgPW]JMELF}Xss-i$G;bEP8h;ꈈʨsIpφPDD!DDBDD!RmD|Vwy $.Q5qz>upg~bO쬻Lk96 D]˗) ]5$ʮAnUuK]/=ԍ- /MW½RD\Ѱꥸv=\ f;牆1{Jj"+§""!B""8pEAkַ b!ko/dT#19 2"-ig(B""""!B"""a^P~ M(?i*hwO,TY!DDBy1,e/H{\89P*`y^_W>` %jּae}4`$NXo,f+3=Je Dyc]"qnU (|^(dT4u?0r&㚩 : z`S4 q8T4I G5VϴHuKބ4/r9g>,䳜7jg6A-*x".ܭPSO+]Q'y+Qdf5grN 2k0V03OO#y,c¢ҋ_#L^GCFrIYjJS=R1ŹiO -,LcF<L2 [Mc{ZcdbTq #JlPVۖTe{ !/h,qAoQxo%As>]_HH]**!ht0N% fYՊkh_Y``i Zl%va:m"_q8puQ— DDHDD!0m4.4]/M%lMܕnDsXj:GnMֵMhFv^򼵸_HLJxF˻0]puMZsս[yz:pU%zuڊqHuGsZo0഑սUZJVTQ5LÛ\0Bڞ酮0ehH`G)/ydӻQGfm M3պ)(p(ŋo}KU~kwY+KjZ9;ܫ#8-꨾YR=+Zʁ$X~\]'gS nAlA躂\cU֙'p+(Xԫ`v)H0{Ѱ)M]uy[E(DDB)w nસ,w^6]"=4 )@WaŮbeE}5DiAp6(""""!B"""a^P~ N_TC+J 0ޔ G݅BDD!DDBRU|T@m\WB>s18f"sGohsFװ w@c8{uɰ3%[psԏk O2>{5 Lay9v=Y䧩:@܍(L4DԢ=;iM'tʺkNѐɣ9r֖Q;'uqc nkpUEؾLߔhh'e_!i}aV DJ07lcاf[viU0%,"*ҵ,_~CZ*ai4xz6059sK\杈#bEns6 xHa,vSնJf7S̴cV;;}W}PJp"Ț 5*WE9>!@wiY@)+k3]@TaL%-Y -g;d)r<ω>k)yS!䈈(B""]-9sC-5- m;>T40R2!l\'L$t3*80y)QŁI0cfDk@\hX_ Wv أMscےQ\9TuQlb0SWHSʙMN4;[>z*44xW}H*TDWNDDBjqIsN5I<}|?ygDD!DDB\ZU8<_>JfGo?UhhsT9B'ZkpYDf# cy,Cr}e Ro%3rW7Qy!w68 lϴlT/p[I@xYm9|G䈈&B""""!B""""!B""qHƾ7X> /P&˲莒<*/S9quZxVGP[[=زƹh zJBVj殥sq]Efʢ=vʦn ,\{4ҁ~)8JN0+ ¥1@TDD! 6g#.cp>I^㛈7+D^Z8*\\2׼K\deLn6^ZGѰ1h-1 06T6Z:R4Ud+0+Hf7#CzjfqwZ""r""! )U^\w'*-_#i{]}C2䕳kY[.O}=4#okz(r7sVȈʠ""!B""""!B+NZ?n«V'j~!L~~/ZIY!DDBDD!xGx4vHsv GܪmO*aW0?;) "D7S$i{.湺e_kv".WHB""HFO{X)9i;/ ЕDD!DDBDD!FUVRWg %tVn BE7a#v?+w 2PTMjuLcGe%GxH4n+WsK4%v\*UU9R櫦vT,m+v`@\vZE;qLgyDDWUQDDBc$L>GB$ٿ-q1tk|1><'s GO%ѐvTEGDрvg{eileL@>)#{pז-j"-5gB"",_[Mes3a8?Y>Ϗm X㥀b8 h93^QDDBDD!DDBV'j~V8OhB#|_+>?ۥB""""!@$y!5\]K{Uʁvf%;@7MIn?b:*giSN2a8&krY_ySe!¹J#%8ĩsZq]TB&;Hw`=i, 5 ^֣|MP]=J}|}|$MQ3p2>Gn8Lֱq(b211 *d/yX0FBKI}TZFi³Ouʙ ~h͕uuTTϨE9R_+;M$yzqN1$g1}R䤜#pzn_s݌:x4<Յ{J 4Ȩ0e 8fWFh_QXYES?'?9dg/ʯx:fyl@R'<۝]ۇJEؓ9lJU tC:- aYK]Ӆ7a( V vwkcpȉ`xϒr 7i |$N;ERcܫd,&E_G4#*b{K\ӂEly=dRf7GEfc#kU:ȨG 0/Rf.'=7#舡T""""! Cj4g<vTӲf \aQiv*8/i9o\=~nwV@2 Z60)5>pT yrNTڞeAIEe" %tZ Ò7~e2>tDEbP(B(W/P>&d5FX7K\p8 + Ӊ;]<_'t>VӐgSJcw+%Cj#j `F|>*75a i9L .f(5""!B""""!B""""!B""" 8;OFuw-.#N}5_} RN3|AWֺC$+&yWe{#Z!BkỰ>5U}(-Jp4[#ڻI{z{4?J4+^-4PKf3\8r؅~`Z] LZKr18kEc!,PZ޽j>Iyu_4k3319A_Z9|.{<=W\}UMWSBeښZ< 8Xcp uIr@ӐJO,#י[C54ltYVVc}L*. X].-vNhnL*N)$hE;_tWCX*L7vLk'ڑ#t旦;vQ'!@."7־7rр%dx1Pǭ0=qh~#2>xK ښJFULa>8:rTxgG!b/cZ2pH(v7i+&8`n.BnBtNVՕ.Y6sn{{3jX1aIvH4/Z]k2"4EDu] <׷Xln@eSk&a ww:%LT=1.sSaA~}N%U770@YǼ 2nx~+;ME8QӃIHWTX:1;vzr2 6UCp~SSXjf vO6J ImD1nţ}CՑ1!GG嘲M.sRܺ'cXZָfK9 vpmmI?C.بkIk!|EEՅm,G}1p LfJ̫}>{B¸~"Gqj5YkC KvVRB(ʞiTu­TTm '{\t[GE{+*wiH(B""&H8`}3 nz?ඊ!g#I ҉`REIlg*x])?eL&*d{۪4W&=lXr|B 3GzZ \,KDD!DSn @ja̯d5<{Qлݣ""~""!B""""!B""'X!Vѿt_0T\M9<" uHݮ ]jp}57g:}gupZHIaǁNɆNѨ%xO.fgPs5%G?"\Z8 +Nl+ÿ"[`=K0VOo1Ru暰m}ߗwjox}(W_ۏgWu܆U!)uy#AhY5 s|TB.K%vtS\3H5^t3%`AHGP+x{̚'1#XZft-آ%¥spΏq'0{sETYZoid 8<ԪT77)mPUhir7YHkʟF:lbxrSjK%5MܫdDs;sdKIN<A RrZO3SIWm[òFA+jDm.+iL yTLzakw.jzNOQ E3c4F#b 4VFӮgиuZhnFcrƉ]%C\pn9]b=+:6l:):GJSl,DVӂ9+FT|-. ֍±\'UF;ΟDۚug/ AꂪAp红FTK9GBEHZ eF"' DD!EX{ddh}K#cA.s%~Gv B ;a>g9(NP z>2VVꍜ Pi`*NUJK^0<6 ,ܛ"/WB""n7 n,d6VY8=;#^:&T Ƈ꼢"DDBDD!{{X6QWB_õ0z[{h2Q:(74 ZF~Yh\cϸPxwo*YqK5kf?Z""!B"""G 5qzDAs}F_Lu^;[7@Swu@k)v<990Wheh|R=B4lT9Ic]<ԲfkwDIɵ.t/ 'xލ!{aZ幗*3:dgz7xc!{Lo=y:V 6+Εg&*@a~\UD(Y CbpcS**_0|*JctTm-YR1a q 5,]%4 !'ÒMT(!v>[ZmoV8?q:Q%3'4`9 l>,NBAS8lAR 43.y̧镵TWղjF[U 6&Rqԕiy7B9%b*LΰXD-4ODD!DEn= =}7e4N4r6'e: \2hrX +%37Z$b4R_1W1^' Q8HFt*T=Ld"`J<⥭GvzX`Ysr;J""x"!=c @kFI=o.Y)dH;5Z.W*;˰z@{Kb]3Vn e4+aBZFڤhʭEzyzL@)ȈE""!B""ճFsIW9R,D{=Xv~rC>oV[ԎZ/NGs!ODE, aK3nVYpf:!S~Wpph\?)8&OG1ݦgrhʾ·J`7 Y>Xp>8h7eWCGAjt7Vɮ"rnNƓ gUiifdI&d;ipņ=eWA8 aPBJ-;u& 4Kh5Ԭ; N[a=V] S]mTب'qvi'1dYڣahH6@?m*޳8Ȁ*b.÷7jw8mC\S=:u\in‹aY#!CrpH?U^*䃇%yczA~K/8shl#JJtX[W7SM9 lj;֑]/t!bm?'8ґ͐Zp$gO5߈g?B-~;Oԁ3TF#?(Eev}m h7Na1}'DfԼ=4k@ώ ƹ cKy2JW×ں+%ʤ^m?K#$-K{ƒGLS?%ɩv) .gERܼQ<Ưo ݘ3s?xq.=C:*bnXN j멿ݧ<%d44|syT>V8h握?p^Lnj?@ߵSrcFGsqQ;)Ԉ,x]kj-x*V[~*f_K@wn,,WUP6v >p gx)3S_?%U3Tkg's ASylqF59ǐ c{+X3)N0<2 DgKK;3@yh5KH^܁Z.oeOuǸ`8ƣNֽ)FluY.$uV@i#ݜɉBúVҶ:[X*o#96ZƴYh^):'@GWT\ef0, "&FZـoV| ,)7Čzv,g+dl'qG;ۣq ʝW׎7/ pً?g W?i/w^1{lPͬeL5. Gm$Hk^ O*Lxl)bp>WVG3PFtŢp T[kNPU 1?pҼ'ds eW9疚w;Vbw;sMmC̫.#s<<bܦwuva0N踊e@_Hnq|+=ɌՌ Gqk\c}vĀ|تH>Y.xYM44 wdC0pY|n4BqW(jeJHf骨o ZԝvN<D>[0IV8itqs+ A^Cqc?h[Zlqpܭ]j8`gqׯobTz.)|.kek5SPSN~ܺ 7;PiY(8=e;w7i>񲑆W/u4Lwf5V̎"'d|)U >Q.U'O_-2w-M!@UW_='Iy!xςv{茀Zem1uGj[1 9Ꞓ7a9W4G gAq;!7p| jrUA (G4; Sl73( tGUb -q9قtkk>uxٮ-7p>]di|b8<|!T3ͣS9Oxګ];۟x\oi}@nbpݕK1I:#r2d :O+vlBclm (M:-)z|!8W-(UlvWN`<{U˘Y9a:=ʆ-ZUQr,]T -ziaW舴"!B""QKK_h{,{7[i/p55X$xpQutƞVĒ}VzϏW9-ȣ:gf}!T;S:rf<zF;}UӯY_HdI-p,>,m[BZDLMe#ZNIܒȣ- vb &7tn%ε\K>(5~ W;-OM#}{V.9-<4SNOg#[Z-GSenkgiSZ4* dx0B|v]\k)5: Fp\97,^#'ryhd5+.uZ2[@7%x||i*=PہgJGWyy{O9q'SvxfHS|Vv +o2l;AWqrW-Em US)N ld2 #%9iM\yNvl\`cd|W+f..zܖ'1 J*@꾋Y ;/s=`i8\&>F[zz CMp'|UA}}lq2?99-{Ī3zjoX]3w$[kyd̨VrR.{\[8$u 0 o Dnzkˊkt.W0=y[O^4qPqF}1C5Ύ'5ݜQ.'ݏvǴ"Wbon/|u /oWHS3 zA >nkCu-n NrY\15/,/سKGzKe|7P{9Dey{+%@Diw)ojnSN_I J݈[5pvr ƛQ%wqQX*Ϊe=NR&382**64coz$z<uapkrvZܸ|}+1ݚO@ [&zQ?$ d0}.TR"""񜬊k0G⵲=$sXƂ\R)]|OWwbsQ RH"lZ6W6;;'Rku 5ɚ@*m;hvY""UDDBD#skpWii-p"".B""""!Ҍ=KB3P=E6CxWz5֧i\)!_T>*""iw{0}r-o&rw7\9*2_GB""""! d,{]d[%#Gk lMoCTm`{GIMC]#s|ps-=޸:'TQ`yn+X b* 57Z6RҷBNz* `1cVyyyfѻQ6Ϋ&c'gӑhVx}f]W\n6;tB}vɱ*w j!Kɕt@,2\0>*+IJ{ OSQdh'[+ +U)`wi<3JF>@t >nVhٝL&Z0uLAW4Hxcx|;^w?Uk.jb7:?i ]GRWe0BT\&0SI'FYYRؙʪWLRnX܌k|{jG!k=!o5\)nd􂀎+HВUL;w|W!DDBDD!xgio=UlToU?cxVq.{;+(oŰK УmUu1چZF0EO'xXlqB3M1:i$O`쉞ӎfPy=<M r~A_A9+>f,\E'pLqt;G/fLDNıgܺ'sn0FnWcLk h*Q$oMCuD -XYz;j>3vM-/f&#Gx=:$YMg3[;k#@_VHÇ4~֊j87Nkz?&t='\ry2S`(XW(*~ɧ8J&,?e͗)U5o东7$+K TM򪹌U$8h/?dM5F18rh+fl^MF[E='1=[Q')s Zbma=CM'q%HDL$ܧ,h Xc 1 cZ֎@ ;/,7DD^/QW%WgR]nOUBS'd8sB0o;$4 r߻!FlS٠d 4eesZp6#e@5g(WՎiGT* P\wSk%@'S4޵P.RG jdzDDBI 'nS%=Lq~!}d/6Z3O J:`AcS8TP)cxek?n>(/y ]Qh*""!Bn w_X>Ul{;Px6a4Η 2Z 29<~q6/Ktk6+&sKIi䈈\"!B""uf QһJw),Z&r.5xG޸%[{kTo;Ϫ""U7E=ٿnY%8IVp?U'+ `.ُk5Ev [ݕ}OcFU(UloKpQͪ!g+."?U ;DEDDBXb|okZ}E~}-9y xF+5q ŕ ۿƒ`/H?/S84e1eL"|1wj*~bWek.As+)ɵ1OLpcOQx h*b"+""!B""8NrQ8kpqm3J7e=DBasZrN,cdp \=\hs03-^ "kO ]3d"%RhB"""ᡚ?? K "mL']z\Wj&:ɌDEIЗhbЦޑ=ЅDD!DDBr$3euEHMF5/r17Rm1eai!cقV{/VDvJG2<=> i*$ӠWT4$+1S FʧYGtѠQbH`0WOsI'rIUdD~f4_{u굕g? @Xvy6k@j/=]CAR-n0ֹxtb0nH?Z%G],z[uC9%[W$DP Ĉ""{-T<>mgLiy\U,2wJyܗ<ÐZ Tgbzؤ$%d] ۨرX_/Dt"((""!B""vET# #SֲWrN))S3co5aX1e);sTT%L,d/vVNDl nX)mVVU_&R\"䒒NI^m"~Z4:8)JI:9=TuK3 DEDDBRAr*f!V>Pzồǽ5Ӽv֨bBU@KB;+deV3Yj(KZ;4Py'Q ?𠞱S]UEDDBLP>ʪ{Yv{voo°ilxQQfj0y4寂q+OjPY""""!B+Q AL1?_ocKVsW17|W%֫\W$(Q|tE/ҿ pkic9XDBDD!Vvgyv%&C%QʡGSW.Sh^S Pi01Y.*`=q-Ni櫤H)F]pk *W\Q`SZFBQtqQH +z[) ;X۔BGL"v%.vc>Ӝ{> cASUig|=PF М M 8krOm䰎8\EvͰ4sBX`rk @ZH+?(#./[Qӝ.h=ϵ1~Xu؃q: %e|[spE+{ W ]MvsXIFw_:JJ3pp[[>OUc#ry>6l[rAߩߒ!J4 `s\Astd^d{#H4e'`_7)q<7Xg>Ⓤ3#B^il.*›si(8l;w9{nyI#4y@ֆV8c+XT22X9/U$UJ5`>+yi#|GBOeudf~PZ _E;QzpӚX%?K-݄n3~OY-c#xWUֽ,i7//5c5%VC$tKA#^ꈈ""!B"/=5$ \@$.5L2;rvk|JdHfw8GIp-6wb߉#6W ;38|Ge9.Il'||EVsU&pTRU(Oa]"긐_O5䔰I}O WU}#Oxi=t?y NAHy$iW"ZÝ2 YA9E.̈н@"IYYEiY&r4ev(w.p#fۀ4a29wJ20pG*LdF%z{шu3PVMe>x)!Fl33ǷߵfX)>m칢"$E1`ѧSu #Kjn=(E*a\fR+-l=ҳwM[Ȫ*+L}CB\ 06WyF;)i TdN) YѺq qxd@PnRQE'IWxc!<µ%Gtc  [g*'\+ >eW\G@#82gX1)H[w5^@էѱ5iia@UZ6Z `2_4uv""-XI$ܢ"/WB""+M$waVXsH+  oKr"Yp̦\_xisb6'U_)'hȩ #@'up=ofN;*S$60d[x K#¯eʊ ꪸa{>˯C*)dNAWkxÚA 7lӮFg {FHէ)"ǰB˖USz@d ta*5p[0ui#xDDV^Eh;_7Աmbh9FcѿmVV%DDBm=Yݵ?ki{U!bDB@Z߱-J3ũ) 2zÙzE5|‰WL'#]9yp{:{(Ҹ@ƌVHJ V2iubNһsa-`ѳKBx F}1RN˻\M^s&0WI%tsjeu fF4 Xn\䫻l"+C|IYWj 'mU h\fuA'~ Z{"Dȱlh"cPG Am١V+$.7R4YyeJսTZH 6 1(ZT46Qסc"ݼw1^mjQgswQY^cycCEil{^曂.kK\,B",7I#4eq̪j%;:&:ú#`ǚNjni` &9cWhj*w4[W3- 8ϐJ&pTd^1^W659w4pDD]/ewkW,TH4|ƌbn'=ѸzMDn3ڹ8)/ ¬ Wz+ P9F=!JUT%[X튦ZVjNeJ4QVRnŠgZ" -֡ç)Y6HJN@Bt Ap5/`vs“w̐Q͸PO]b\*`F2X],㤰!6Z:ꑣ+L]Zk ?Tz*%-+DZJ""!B""""! 0-M/!d-WS`װ]9mdt+3K+51y*j9͚\۬Φ:O0uDZ{Y?~,z9XE#U \_GT)* ވ}`ԋ*ac=%_O+r".u-n#/*jct xQ RN$~;gnD$B# qU^wZDXmG L{0Z 0q7s ]Lx+*fлMptIt/.nj D: 5DA%HAaK.SuOq@++vRCy+ sTR$mnQuO.=+&nVNZD6Zlc\/)Ɩ3v5;T{y)LB1_|HQ)"|wE|hBJጤJ7BQfBM ]gnc2V kI pCpxiéށg&zڛ 'u?M")!+Hp4`UEצi+ޕ7hOZDIw~!qX4UXUU|Rݙ붪 ƺ0}}Trvh e^hX; ApimьmT'GNЬm,ǂќib6Vԭ,Vj )4O7zIWI$?Yh+5WT59R8.;U;+~&iu~Q M^3;wXG8$kї9U%Q~LV5u_R00{D!H=TIp9b} QxH*i4W{08M5ou2<41|@;_q)kh<Dm3&r .:ahxR4|EЛ+MIJeDSD'3fU w9>!#ϵtjfrx-GP-IkO1{_Q4xZ}5g ҼM3>Jӷ!߾vݨ-Ytxkm'PjaRvg?w5yaXX (LJXSp+aA- ɑrPm5XғuihTWagpZj`rIN VvQjRahUUhi\3Yrbiպ5r_.TLzCrs7՛s~]MSS8zBZ+_ilU (sʴS9%h8T;t@'E2W;Ts(=B"-)g興B""""!B*+U اr-'zD#%@30?]u[{\xhX [͂Eڭ&+8T+FQj݆ JvD?AJGGWGY[ YIǟڞFG8 Y""q{'ZQR͹pBaSeS@0Ƌ48e1 r^ CX%|]eW_ovw3ЅSR<519`!@R6X!HPb!3HHg픬{C eUlojIj `-745q-+U' C0\M3|4(FrU8vgԣpS\9WZ&ƨ' IMS0K-eTQ)MGt ˃ZvPUGMK)4~k$η Fnjc>"̘%?$@w-3Tl$V8U+1Gf̓UZ).i^$ .#lBEquCKnPQA""!B""""!B""""!B""/ȕS({ybF_Qrbct$xؕYWbԒL&7rT/P̺FL߲Dl6]c٢u!Qο~y(,/|<4Zc.2,Fab;5T19р{-{y%ԶڍH$8 Ce>*BRG%G| fCaCR'纬$yI긁8uM_!+'%x .JZp \WKs |hvk[ߍ|¤3;uRf jE%+tZ}m;Ïw)';Z7858'rS:ڗgՕW86/G8d]=Uz|.g05SǹiskF䞊[_ݢr~i QUKDlhu+1Zv'3ZC(+ֽ!ȧrF?G`ÁQ+TUΎ `]!]FF|^̨8) Ҹ:3hp^8*Nѭ$iAsZK vz*.8|Ȍn33J8#TSSTai0=ÜC`G~\f9 "ǟb3HէT4.%;mÑAϦH^Y 7nX6N!>JX>KX%8 x~\ >j':<6h\2UJlOٚ,.XsNJ :v$7ʙi23+1Qdc'2vHQoNVb*!tjwv:'s;XL]O>)Ѝo?4O˩W k.*I}*xG e%/[2ξwif[/ʱ:0kijN,'@ϵ֫B""""!B""""!B""""!B"/ $\Ɨ;`kKhܨ7>fFp]VFmS\w*fl,[1pېZ2 ӿ>W +cE]cA蚲t}ӲђG%vT7(TxVbY4\LuZNSjn6iRc,$Ԩ+S)$>$2Et  Qi\qGL]Bc!ɺx_ONN2izn[)(*P)ilfN*rQg8;-x^:YWL2#cHz+NZ-RnɕDK@vv˛ *cv+;rne;Cp9%IRjK~GXg ~'seNvGμshe~ķOk=Mc{8hGٹ/D/tΚW9=s.'rJaP4@I*^%3ΌTM+# g]ۄD m+z5Uw_j"Ԗ~h""!B""""!B""""!B"""h(/yf;D hul@pZ n 0{Mׂa*:*݊"LuIO\YU%DDt6PAK/Ή Vea"qh-KcDQ/q{ _t$<("ĤWXY"Lw̢\dꈕj]Uy")JdF![#XVàV7]4:>HR*eyIj n矚cX6"'U)Hs~l3IqDWL/GP dB""PB""""!Bmayavi-4.5.0/docs/source/mayavi/example_trajectories.jpg0000644000076500000240000031132112747716313024057 0ustar prabhustaff00000000000000JFIFC     C  : " 6t + +> 0HmVVԖYqS1nAIm|G,Z7d'.-;ڹco|єАЏa*VJG0/ԵZ2+/]v%JKGSz cMk}Kvv") CkZW\6pe|XlW'k7ȝ.ϝJbMd9}u캈~Î"R#o4$}h;݁>AӬ' 7֗FBCDYa$WC9Rgv7SL>*/]kٟy~h͇[VF֪v kn_FSIx̌v;*^&O׌8rx܀kz廯?~~#Kr;#g"9 ~_W?LԺ=nY3SbRKps>:sO4׿)nd%61ეGR.8Iv&9uD|WmxT-Bv23/j,8~o}3ψZwΎs/ ~eĮ\H,SO40{zKZmuR:2js?Vc /8L3^%ee5}:ϣٳcPZ>-!X/LlL}!iԭpYd!'ik5fGc]=Z'jR)&$f'{a; z鞩~0ͭ 5Z@dcw,( ?曙XsBNw|]SHsPV7zu;lOW|3Xrd3H5xQǩnͽM](mzDZιw]J,̄;K-uM|b^9zk<69;zHUjZ;.ڬO6O1> M~múȉMܛw ߊiqn?!8iߤ",^dCk}e!_ǓsH6a»N>=|nj$eZ/KmHk٪ƦLl YTa9۳E3]͍;8YQ%G,G!;2`GW3@bd; h~Ry.OqWXX+#f}*top,_˖ zg}ʟB-U^_~۫iYd{T&A׶m)=>ӹFƇ=?E7pW%t_~3|GDi6P3y&T}NkrZS}?Xp9Mr?7\8þA_c ,_=W6)|yfưW| }BlY::gf H}\7|5eL]ޟH=:dzwkRl zqZ ZUiH|ƾ:-5BVDj=CW fjaYkMBn^׿J{ehmN?aWދPWctKMT =t`+])wX|1^,ůZ7G%jۡIp|^iO^4l:^,>Z@);?iuoiI rW=;\]iv~ukW%]SMk_*|կ o\ϭd4Sɻ^WK~ @wA}H=B,ިjZ+,_N1uE䄕:~ ŕ%fpա_T}͹ڇxakv/~||Qiw=UֹU~%%X\|I_6탙tew /:q:|Ӧ)e)#kNNLY)SXh9nsۿ9pV<]QڀýLzFاy輖N~k]&2S=/60^x/!Ha+Jo9(:?u{G` !*鯱7 'ƸνssֿKЖ@CGf)= [bc柈KӒE?4tXM۷?<~Tt[ U_.Hn2~oG @KAp~Դh~b* WlTjG}# ۺT;SԮH ~Wg9?I@̀LC l]FF8?)(l$1T^Օb/+Sͱ+kTD^;ى >t-/Z5[F3ͳ\cbU8F:S0Ϗ_?:.槉s߯{9@^.[L3\VJ)|u_kHnT@֒csN_g):bKN7|)jD}ǚnoކ;䝳oM`ui_X}`W nӭUI$7zܭ|Ҵmլ Z݂?!6f.&J/H~9BײhZg/=[M[yb+r`X+ ~-|ϡv*>*FBU;#sOz[`WŁ_|X`WŃkJOt +,~Utz\Ba۸ܠ> !eu_xBn ?k՝k5g{l~t@,|$ϣՠ6<@J+zG=8}Az۪xÚku_*(VH:zBh3*mkwZRp~,|nbz-TDx'$ŋ%^c{Ke!9JG Ĭheǝڣ>i%#CߑԷ6o-{1V<3R9vs2X̯O#UѾndkK!4<u( ŻFzvcl^Ъ1X<Mt٩_n0;%9Wyq|iڠ]2HFIHH<[qYkV ])yNCU[c7%)mˋv";ۑ|X`WŁ_ POfsW]sK`ff?5M{,pV O$޴;{W9}Տhڪ,9CiNlV.qb|X`WŁ_|IhmHK +9 z+, Ҁ7 !0"@15#$%46P2&3`'A\K<V0d_)ĥTn?WJlǟJ9}/uL٦}6vHmx1&&>ٳ]>k^>Ϧϧ ϧHϧL g QYSRU.gScңűXi2:1s煣LVR&:Zdڬ8Nf.騷QoIN;ӝ3Siɯ'g?Ҳ.ѬQۂ2;{6[ Cj}ָV*$$Ǘr\2胰< evQn+I/A47w,P5IθLܶ/†#ֽL"$帏&bqZxַ8bkVd/Aך o ᜹"{Y3x®?VǃFY,(樰ccG$*9C:b;i$v*WECLEMՎLPf;ט151}x# uto*r'20ѣ0ܸRX7gߠE8*&B;pC!2SRFc rS1w|3Cڿ~Y=MBX̎#+M̵IQDGvIrxppw_ؙZN5tR FF.HTJb9_ ȕj^[T?3ǻwp&㓹&>"ȪxG{XPϩMZLj?wYBl*I wAX(BDÓ]68dh2"`:;I8aqMm d)kDz<B]YLb \]녯SnRO6JB&vJY29Erjw*߆ sY &D,L0[Gu˥A_xt띳rdw{,T7 aQ[cb4 >:zOQDP6B> 2돗K ᓹ1Ţ=k0gF>)XN/.c„ƾI<6n5ńDʉ$|dN0hj%*.>7mN56`ӓ 7:%Ni2}6/kOxa䔙BbbD^\̐ȪqKpF"l!: dZ&;O1,?&6H4d "Z!i=i1! nCapVA_8a—H\G{e=tnHK=W.5pv, ?\zdq =u@ec;-D{,-y1:gbcN i:_;eP'O:dn3J" c &Hܙ*g* `Jk+6-PZ+$omy{ՠҽ&,tGhtV'8ɀ%Mz*"5;9㖚aeYӮL~;:ox'Ɉk*aQN\wjΦ:`.aac.̃pƦy;I a?CIYKLO2*ru}nG*á D鱵nUKP>yF4J-d^\ˍ{_ rL"a"!}]:pTϜsL.T_λW]#d\X_ocխTજPg,tBȼ#S%(Lr\qԪ  'a刺Ŋ?X8齍cbj̩gS^cM'wZMy_ssskҭtkt ]> 8--;35s6\yQ,I* kIoLn'l_zdpO.r6R=5ZD] A (m=C1UXx׊c0&q=QxU_/q}x㝸6Ap73SyN~AYT|ޝ>FssS9&5|yp*cHnD[:Νf0UΉKS-\ca =CCAlx>Atx~$ d'svZޝvD<|ZbNT8j>8s5sT>mbM$v*?ʼlv`OސDx2Ü){Qc18#fr3I sp&k)˳sqۿ T%I#"er[GwI}5ya#xb ʉ1jUNY0vu~7N%brh:&[k^ن :!􎮔N|jܗ ?ryx`/׎"cS'˅Iﭯq9gjꩲȈb –n#Q/&C;!7Q_08ą\uP3:`~^<,pumBݬ;7/׭i OQdZa xM|rCrkmZ[ RLtT>eQ٩9^+_7s£N3baoN5[06Gn98l o%/*>tAb@ޠGoD .Y r73-ye6ԍ 6gOm5%ݔUWW,$F s9l66v}1Vfl E51MSS'$?7s\Vo(ċ{5^XvkFmOHW=r oJ{IŖ(#u^9?Ak5$}fCrvM㺈JdZmS|\±|oi!dRo Li$¶^.˖5TP;ӶXU)7sVil*q[5Um[6g/+zG𵺭 *-X6_+7z'_aTVGQ86l! +6]y.\tm{o)ñtȵn __k|cQ=[W=>I' *li~n98l?$fL K*zCֽ2qb -tq2kLHrZ]uVCA?{r?Mc6'OdzgԌ5ݶß_ZɟU͞g3M]3_4}OYmͼr&˩5wTXu`xe98Q^Nsqg NIrf`Zsc5 ۺ KDjw5c81,vog"+FHڑ04F9U B[okv 0߱$$:9H35\sⵉɧ|sqe? 5+L`,zA,lYTl 0Uh0iOmz@:'':/4\$62 g{ bIk 'xP*cbDD+1Z7sv{7U2Mw|qW$zxn5G؇M t@]=UٲJQ[.yFHfljLa6\AO'sҫcBur=Z ^P8%[.W@i5+DBDp&kYă98PoKSΦvoýՒ[+`tz)ns)3_-&bj&t{ăkkq-V㾝mul *xv4z롡~T*pࠢ+vKƦ+0l mlIj S{#M Q:,"'Zl=>nu3;+,KZ ]vVtwgkiepJPM/J{nE;7-[-ef.jfLOդWXf˲ÞBʪ2dP1;#Ø5L>8/ۑU6}bSjF0@,ys81D cF"Ve,oOFRBKL\rw{U|LgS;Gw6Oe$EtWju@7_Z)s*P4_wQ2yX/iFt˳j.ILr_z ɇe:x7`&ddMWOO`OZ75ps˭p[euu{aV?>ȿ!^C~v%XKzd6L|LgS;Aw7ѢRnSGx5>tDAe$[>U]Z[S dkIڌcp԰%XU\_b-.Q1\* zrEc%I>MѾoJ)Op >Z++仑,K <~,7i3Pk(Md{|\W7s~=u+ yZ$冀" 喯sVR@z&M4B}y (i47$U4VaQ5mc3e8#$[1' ZD؋#+1.АicegN N+/#XkZnGwY%]OW<{m+Q2.nA2dB{|Ϝ;onmˁeIֿqSpۊXʿ)ӹDDOMM ? g|UTV) M]|O8Yֻ{&ɲӴ A<ݝc[[TI־4rWװe5MCk^z%vԃ_ 2"4gW:jbo׬ҾOGZ3FvIy@XxL"Z6ɴX pj:Ѿd AҪ~eӊ/.ڴS-l7{^VWe0Fx]^pR"JZޤϐ$iߘiK{{l?7S:͍߆$˕%X/?._WcᕮG'tGu5k]iEVE4/muP: ،-) Rv7N]t0PwٰӋrk~:M;͡/JsXגn\lovCVO%(^c&$+sʹ6us\w6k+*+׬{Y=J_HmVedУe#SyN(cPQSF$Bá{|>c˫vo\ bkt f~ˍ[fٮ-6aBNAVҽ=۬ԍزaK _1aZ``XjټLy{/Als_ְ1ӂӳmvΦu2y]Չ`2Rjx)w+z5ϔ__V1  Nn5SN6tu:YuDDK)Qr?aܱ:cZ MR6 'rbrM.AS3ηT/"jyf6L"]n" HLQP҆N}%xVL Unj+^us\9߆ݯf+ӫz= ȥ䧫rG֎<?[|m__ef`_+yvdrcJV\;xD.(P.fwI)"FC F]z"lm !Lt) Gήurgs~_B~Y*bzu?SX* "%)ֆ( #unKbl²2V!݆ips],AިkLֳ+u\7[$h45jtu֘Q`L"yG<~"S' gS:x-hUHjFljޘEI%DDhȸQ*+W 9&y'~),ʿ&Dxmt Z vn$_D^j)~iLvD072  ܆Ra9u7??W:tǦW4̪DR4.땯rO40cnd Z+5.;buluYXhӓkZkʑi_oȃXlk0?F5̈́h7$L')Φo')b|߿פ4rv/ 㒹9Lng_BdOVF 硞[RU@0g\\^CVI2M_S. xVXW6Mz-pͥ_َR;:)me_٠Ҭ ^n ZݦŶrYY3Lw6k+*+M7~̞kzC6>ЛSYxk1H,7zu0]|G蘊LUɕ\ӢGb3DT83f_E&- YmYRK}7tי∈ka[E[R2i͎»+m #s(uqlʫ ,`مF7$8yF.ZjA+!aMʙ~u3+ϕt8AV06Kw땽7ˬ儷_i֡yՄR@|lP!Ʊ$Lt܆J5r7' jX:L(.eXB*[!6Q$ُ1]@3z24+o$>?J+/,u]vq-09#*#AAY _ZIll8bD94:3rYpl>\yW:;{_|Zz(;gOxH"$r)9\U嶕ʿr:&BJ7P]ߢ m0&F,~@[]t6K2cެMcNƹtR2hF[5)K[`Zv-ڇkHV&%z3 8N E\LΦu3Sw78}t=;OJx /JHqqKURD}Lr2XQ/(`@!FWUow*#܇MͮYEZmtlxy2=ԧA+A .]'!gK.vS)HV[{W187CDTTP9N^??zXklڿ H]ќW{LXc&[9J'ڜ,PpcbL?:gQa_uulzˁ>9g5IZ-g>\"-o2pQssTԺxA*d{0_N9K^?Nl^ g/ :^eCx&b1_ʅxCQ w;'l2yb5cX~~Z֌I^V8G#xa`39#-lq#T^R2}()ʜpUe|:Pj`q}1#dvdB:Y3 ^ Mk7W4E0lOb (p㓺OП9@^9]ju:bj}R8}sET]6|$GR%ildmsm*Fwg*-tr6Dዒ.YJTK+k"$b'_o""LRs2=G"wço3XyqF7?:YC1ˆ''08b|~llx&עkR)k'.4n CqX"Fp&v`+rĦL4_x_ŖPƭj^*^>-jH%\.QQ,jӾ<]9)KjL&;ߛ?6sg6vhfѱ<d~t%͡jg&Ubu2g0W9_εXb#@ĸfWݭM#RBEDWl͜يMF_LEs 9|pE%4?IY IyaG_ hN40TK{Aw[y[+epY:JU.|͜jM{ v:5bl#Kw`mڋժCcvhN|3H0 Hᗀβ1GfF6پ~llxf:˲nbTb튮q|Fl3Bv}6r I8Ue_`jbtX*NǢ!t=g `<14K1$Rlɗ45m$J N U5:F}[mk~؉l_[eURYǤ3_ݗ$ڭ5͸YfџS.}FS΁\:WճVvxMeU#ٮϥ2M_eVτ*d)&K yO0}BPN $LUFcd wF.~ҷ]{`ܩ9Ěݼh'uq>\Gg,j Ys,~%:rN5l cXߺ3ḎwLyUtM99z!b%V5sX--wnP[64M2 o}l34[/X?YWؓ&H-g 2L8Q.H#TwlliE,`"8dW'gIh'YY:XDpRCERevC?W:`ҧ'>,eD5Ě*)#l9;^??p@Lsʰ| sl-flFn]˟ɃQ!Y0#&8>6ش\u䧽/1gCsp<)X&mJd٭T\8U[{s19;^?Vc^D SΛp N#y=Ylٲ%t4}g GqT=6C\jW8&q):M&Żi{$ oݞUS9v5!|ӟӟӝiMc/gd2{AoQHio.ٟ}XZs;a(%ssk$LuUU,IOtY!v`Ս:.ns+\;;*Z{ G^gC UDEw&Hpp,`+f0HH6x5aUB,d5ؒ&2" PuGʮC]\=Fb{W~[meZ.KYT|RiUW>W'D׈fAW΄<φ:˄C{$႕$0}D\W"'XHAKIL5ۡb<$xǎ1cIQBls{ub"9r@=J Pڋj>>MhUDTLɆo-LGF敃HȈ<&,[ O4+ǰşT^.}DK΁vxyͫIY<ͫumZEEmvy2~uy3;9s]rzkqqؿƿ,Es{u?GgU?9uEozm U)O,&rW 7NaZL!䰞4ZFh|J&&4%uuؗKIUR"tu86b<|atO(m0UDƦX8B񄢦r1-QBdb]&[zy%-1}VʹDlAo&Q6C6pVwQs\ RiV& +`*Q7hv華SkroY>/zaj;ߣp^^x%n0ÊF)0Ƴ]3vIkՌ^4cjU"DÊnV.6nvOp9sE*yX]GQXjmh`˅݂e8DĴ lqv$O8n]k(9h8rQ$u<[ⓘ2osbش';ơ q]EDyIoY+a~ip6ة0́h-X J*$\mif6 |Ģ)B֧TJ#. @NxLWl-kB"zhHэ7aA=.|<>1;mM9u7{KjPR QtAVvҸ"-[U{qZwP>'J1?>ðCN6$.޵E<~ys)KU $bU!5TZM2NzM9金5ntߧvcU2Stf1=<Ԓ5G/(W#NȕRW©U* ǚ52<*B«\ֹgJM3"߲R=',`I$B}~><$-95wT;֣$zԴ_5S$mRAuCMŭ/Ff7B1G4mޏ|b1h2j%Fʘ^j|tBN"7XZ;"Tԅ Y8sG|pɅ}9qD8'X gN)wPvSɸũ]tkHOg:eq45)ng&d_e|i{jF9< @}jo˷uDJX RF"qL06Cjh\nsYa"@Li*[onȊދ5hyƷ.6W]=0+yM/4y(ԨlNEx&-EN`G;6^jY(<,;DWj~Z\i!Bu^{o),Vs4Z+ L2 FQ'fmjvd $\ZJ8W˙;2톴jIz'Xt)b^r̷ۼ%AElƷBR'HIH4A*Tݖ -I,e%&8VVgXoYlӚ K)%6NތhSk)VcˢXbǣgLjsy]}>1@]PZ"֘n]CέK]K UvMd[Т'&Q!{痚- eQ). tĜ>*wS![!AD`xG5nWRpd>ַy 򄝐*iZP14"ۙH>7#gՒazA:d83IZrX5ÐZl"'}8Qē1g4޽)';RP7iK!jME6O(\R(Z^a@ (!EV(4;oXRBIskK6aIr~U2-)J2qr] SiL d*en͔B@&O%=ly HV`V\#bEyԪ+1Ss3xlݕ Sv*5hHHD l`Md,]D:`Myn811!iSEIm7 =TM3V .j&Q;y2ҩP39%I ], TY8ugM\%sΰ֣W0ˬa'baxM+ & __9M߇YYhbyVvr@8VmAJ{HkqQ8rsD좤TʶČ<.]6)]:^-bmI *;J `DWj]F. D&JnҗQVWvefs8Mi΂A۳in;-0A8q鉐C]G%2ի%wŚ-wpY>~hF (Z,С\*:?m;=M]dGOjF%zcK,Jk76UF%b5)qywDK`x#nW \FKZ|eXш9uyl!vSdit+SG1G֩):>+1@ rpݧ2&xu)ňl;P␪WVՏu8,' >'hcX0 ϳ&v] pN$Ee"Jvviz s]8ڟKrS+jLȗjvwRgE+ng%%l!֬{(BBRAJY)Qt Q2Qx.\ȟEEԌ'"y)W_b4e\U݋Jz͛,74]RMڞdf˫Js<4Liy* %;|XV,[m%DlIE Xզ8;ߎ:98p^hqZPR-=/K۰v7ty=#CS0= }c.C]WP~4\^. ƒXsz_Dtd}fkS?9/d[g9+yrβ4~r@BeGvtKX{ ⴁxtTtxC5m뫗#dw =e(ME@H"ny:9;QkuT򈗝qM e4Xqi\>>(fj~ٝ^` 0*.¬{/JLIeCTe r:DܳMZߨEN:"(UEbjǴ^h1!WDe,ή$[AF4,w#}  HXCE,ja \\Ɠȷ/8ksn%Q^b9B۷$ߣ\PZshZνg**'VpV~Ǿ7tұjM⚳^PcGmnU_MP](*љf+ cEjꝥXT*@fW<* +0sinLYJUG]b^QɋA=EgG!\ۈ넺Y#8mkW4=7xLK^lŐM !"5tn'B:aC@F,]vӼz$kIs7?Go]87ش(cH_ iQǖ-aل*DbV\qhHzNaM9sJ' u?,7mBLKkyhUγDu58R B&%߲%U.('c2juLSd'>i˜;/#G:iX U}+U[N O϶n bIHcׇb԰$md}`#?:oSːa&QϴrʘSd9HtvnUY;)*4'Vਢy@bԱ q}Q[w+{w%fOդ4VtktH~R u^Ď|;Hf8MV0I8RQ 8r0aӄɷO{};8g8Diil64Zsůg̡*IqHV5bڱޱ.('#&*θeWF84D<]!Эb+e )˦ @7C֝ Kȯ1+2MaUXYԊ@xlEb|!#YUCH:uhݢ[Oo/LdR: iU\3nXq=p>l$HKSSt5R%)iy=b'm-zNJSY)"5ku:ŞTL6h2>}s"4W>FKjz|0HnUK˲%iL!IZɓgzPiի6 51ߎ4uU*,ɤ+ǤCqT9iJiBu7iTrq,z rhm:yzKNQ8v]ҴJo±e4VBӓTCe2#-/' o S6h{ Ax<|ŘU V$DbFۏt(0oƾ-^<2aб%&hpuSJ5bm;kC֜’ (NNfmbԑfRWS)*BP,)i& nfe\MX)xD)bBUC 4o/Yl<_AbrG8DZJ:d-=o[zZj!We'E(XzǗ8QN C']hґ—GTJKK)&8\WZ*.t]w&SKw5.\"&ypJօ$"ɶJjkɌ3.̲hh"zƳ-"ҲocyTHVy-uX]CJTA mUZ?<-]P%*Z8KVslnEy 8qFqlڮڳWϪ2*)5I?vImb-!nc>'>ҿ^dsfNd'ErRDĢ~4%ЬN"R}ח'tfm^:7hL+.O8#8bRy7fhV@ ZL@Ւ\ 3%'97JbcLhINx [U"WJ)AID/MetsazUo/7ҟFޫ+$D*HFhIZwNl}j=Cݗ!"YU1%hٮ3 wY5SǺĽ47R6T  !1AQ"2aq0r #BRb3@$4CDs%&56PSp?t+o~!D?>zQağ||O?SBU#WD94t t'i e>xMr=-\9>ѲU{;cj2';+>-.I?~_}HJ@4ĮT`H ~aA .+6µspxV2N({ !lO")rfQfk$k>xMjXxe̲[1Ki,2lT&}ҷ ɉu?1,L! H5+0.m Rf̄2yVq3;VP4&fҤh3kϔSّx6ӈ?P;/?9'0>֗Ϫ$6)]T(4}S{be;O*QXDf%q&U@$c(*q?t'*73s1RJDQCOLIq7@nEײamh:c&iTǪ2)w#n|Y1^>EmS]@pÏTMK_[7U(Dd `0k7@"&^21tEKg)IFxNg[!Dj& V8x-XcS@n{t"1#wD4$%̘§%  &r#"ueqan(9QxyG-PIqqv]DW盛Xi'Q;ǴӂJ򷑄~,o) 6Ԥ0LJQhDdvϜ{xdKd+8OF*rG{?2b(2g;JUq %#Ⓖt+|S5.qdSPV#jNjؒjsɍLN8m'A{* q\Mۡ!&6&>\8med;?oe0Cqu%K<rݻpDA*uڬu8tBEz}Y=q#QIII=ct:G͚fqv5;Hnq'3K+UlN\[Qy_C17NiCq!XPLgxHTPŨB}_?l]cgһRjY?X))dsR }eсԅ;Dmi`_HBpX|D,bjyAVK&☗v]3,.OI?kpXww54upa\a4_dUǏh3zpiM+ ]@9|Z9l4m1\u$+'~d^&j,xs*؎.[)n% *H*iRG) xv]הG'}1+;'jt"Vox U^= Qhw늖Qchh{?;;OE\G6SX:¼W&-}HZYlI|镖ֱq{EɅ4?+G^힚:++3HM; TºIڽ:L8wy`u]pZâ76'!g*Yk,PmT*)>~U|xv9s0|t2M$jyH%7YHZru;:sT]Xj|A_**2~(['`(ΦvP:r:(pPC;CSTO; $6Q8v}G+x<.6 xN]^_m7ex<-RMZatNhCg h]:(KP8빷nbA"(řGw 19D5VJ Cy9u-9'?!9/GV͐ )z[-mm{-D^%LPӂ .^o85^=W1~+l({bX(ݘa l~tG?hxVfejˬyꍕTnk+CĤfox?c(>*\9\ V_tJu#짫7*:98^qttJ^O'4¯L&f:n;إ:ܵBj\R~ꅕ 1h3~abJu *JYIxȁ{ |8臫 :"paӻb˴9$ $-'bҎQn̰7J#{mX:%fDS)|?qGJ/bVsXJb*ӡoD)iY%rY:pwVEm;ܵe}6?Wrɿߏ鉗"S5hp=#4˓˨:B@tawȃvꯂ}AmDÃO$#oURY|?Ϧ 2 YGI8qrW-N~(%:\ZlIHlXb~_wQ:P4İ&[+#vN\y֯pIiQRgUF!nY |{Gy*i3,;aح}<R$^ Q1(]Seۥa-<&² ȂƒEÔ2jHnj\A\,r#Qbzj.*53Bz5bUlfze*'[0;QBoXd[*aCjar/;;.1&'C;BTq?\M"mIɸ '/7%u^\/sWRMAl;(J'C )!ZEa.g >Ӌ?J6[eǕj[j'GjXzxC8$:'\pbOca~Eiǎc"x+zx7+8:CXJW:ܻ-HRN vzdײ|!H c InffbV,q ,jƓ|!RԯgG6ɵ (ȟ[ J]Qo+u 7(Zq6sB'V,oks۰oH9UJ6«Q*\埶&`49TOtO9 .*RL*s1K!O|#'?lhͰ1tSz~}ZQfilSDmIDԛwtMQml'@:h"J("ךIBNDTA ~VmN)NM X͸daVJ؋AIT H[%,y0 䑟wS:J߫&*)ꢐ1:gg|Mӥg(}8*MJx=PéZѶ&xR,7V)FFW sQ⣯p<([Mug>}q}ڹAf6iJU^\}|^ ,rQb>^+lPegK{cdR~oקUg5zxC)'1Znx3 3.BHԧ`Q{9گ VyItpSuo+u"@dZ~j5qE TG!=k%벳LschdɣKVqtm{jr㘃Dg N =%H Ԭd*%tOu~đ*m(LN'xޞy o$uE+׏U#^q'-[ v AzWd?J6dZ鼨#=WؽV߿VFy7.Wkz/55Bv9w ;=U&ygXEiVs* Λ,TB2@> j@VY+9'겼b7bkxe7v:MbɒyT>@2X @tz"MyNJeo1=DqCLr' s\NXdž_YkkrD ;NXNo(PK֪)ΛL)X1-lE|9hIO%)#ScToO_jۈuh7'*2R $tfLM&*+Hv]1Q3-kBtlJ5;}mrqr?%>-HlvQSM%ew! 58AT^TdTݰSBP+ &\v'PCg)%Nek$$TTd)Y=ӷ7H6i(M:}oh UV@q%%$Hq `0&3Do7bo )Þ>ʸ{&[fEr̔ O&^u3D UUigV♲ׅKRV $bbM՜1HaF\9\V B-{oK9"7 NHʧ1n7 _[}+QW"ANJYds#L=.*@enM/D>*}BE8$0elıL R;|ݩaUhQ$#4/INK%0ɺT/z$'I θu&fw,P'uiռ{ 01$ 7**nNT'Wt-9~:KgtV(ۿxA߲/\)I@ț"[)\]~/:}O{(iӲM4-b3وYAlKZ HJ8SgܕaTI7ދ)M!ƏeǮ*S [.w)230Ux>RZ1MI={?,&mb8o6I‚  `N8RmS/)jO&Җ#|IjPRX]{rQvy" ̯ I6_a$zT|\NT78EWzc.攥]n lϷG{eF=1PGf1 fpBE'vf&1_8=7J.͞G%{5%ē{$#(fܤ5PL8p϶&ڑ{d֣/)|ET_0ĆRoZҜLD`"Jhy,ξ+T%aҵ%,*NCl#cЩ|eps U$iĶJ7uugwVQ,fzE:I͗9?@B^xV *T圻Ofi^^9|Uؔl@5vq* MT*=,GєshY?I§:KUJg.x _<.`cR}KΥ~6IjKvbĔJ!FIm . WfRVyHFKSnY, $}DJ$:VyFSĕb_=x6J6*xz}p7#RuUzSפ!:H7֖ӉG(Lq>aꀀސPI{X1+!*;Ty<u>k^򂃈6V?5_D0ڂeoğ|Ke+~b x;s\$f7¢vq)?3U^C"sT'hrk=;Td}bOV\!+KD=XVSո!Jli'Qf"MzT az/w&OP^hXwdIWф[`& >0y'eSgSxT*{A%v#cue{͙fO홨Û)/&<ៃӟq g%si_Z<{>nske0%CɬLfna   !1AQ "#2aq03@BRbr$45CSstPcdu%6DT`&E? = 7I1c&*,**os*86`6hK1YN'߾8kOL_ȎE3җs(iI7]&48z%, ʏ1cqȏO1H}-Y?e2{#J0GO/َ[>D#*??nr1p9ZbLD}>6==>qSn1\XE>W\Eؒ~\ßkb҃n*69gr>ٿG 3F5ƳYg XeMϺ0gcb51a=~W?S GC`Eo<ꀵ[8 :zfUffl?zc"gW1rrQ֎#yW\J|h11D89utU6zNhm@$;B&;B&8 0u^xGjO1a?d]T:{|Kr+YGĠ?-ץ{YrJTj̑&- 3[Ģd)a/BwW7@)$)[E2(BVM`bqVzdSU҄( z8'SP{"]&lO(eIeʠa7,JB\A@۹j`at3(Wi2̚1Sҹ4 T|4iɶU jbOc ]d!=^H0,ke^˙sYNƳ E(f7Ila3 d_) JzhLZjjn|!»^VqrwYsE˪q*ZOƟRX Im49+2r:R(TQ`i(JEIJg{%/4ρڪ"a f,`c'3o]]8Iܪ4$&}d8N8=j}1:W9}}12uqt%KxIp֦\JRWuW*iɅ輪y?&,( H*v9QDUx3c7aF^Ԫ[Xt4R' ̝c]vR9\"BJP#*T3R{hUAGg61I%*A8gf#Topa7FCm\3|tG͎ [U2+Lԋ=v&2ZYVtU#8[c{yV/Y%#.͋6h.SӪ7"֙"z#/;c2 u$zv>FpE^I[)>ic^~:t6ciCDb<)lɎ=9#y5c#,4t2'* djbSA1E(/=<%xJFx%]A(1FEiI#oИJ0byR]}#Wf::#y$oS)b9-4G2S_X;hӵ5n[T[A*ЈrB˱\o5ĈPm8NyDv27BqJ«D垚9#Jo+e2wE=10v>u" M{%?\O%#wCyf~"׻8R/҈mL)=2y8z)yWzc_E:T'f0Iy76LWyLpl|1ÕB|>Րk˚Di?~&E{y/ZRN{1>!>𓁋oNqHDxJ䈽8y\4PE䌚$錜)C15.[d%i:T.i+$ly :M8RO[+qʝ! $WRi7+S6h=8~QՉiѝů?BMx^=}~SRe7M? +B!iOLVbY@xc+a1u"o O )'81zIw(w#b4< TңWxS|$vdZVk7SLn^k,˷Th]))-diX;fл&RRZ'158ҰJ{&u ikMe]v0ꃱ- Ik$>4&bY6hUOzV qY{$5}W|>F}9_Ֆ?_ 8KFҺ#ZA}hϚ91B@=Ԫ r͊2Ϸ(v1R1)W:i$x9ǚ.MgP%^W23--xcy3;Y9s1̣]o򫷞3Ě}2]gIkVo(bɎLFib3E䈤DfqO*Ʈ&]&3ۦ<gb-uߤ{7W}}gu |&Eɦ5Ġ'$.v/P%#NW 6ܚeI.}Cͻ,jt7(m--OʥfekOW&-vYnQۧWeq%{d&~M#X0T˺> Rς˕a} =0^Eǻ]~O{Wmݭ鄊ufVkpuDvN]t)uzƔ7ig>V˓n+}1g.eiLRn|6T[ {d2:8Fǫ{ ]/ML*?Hec|~XGngxX<KJ8H - EJ[мޞx, Rg~;J[Bp'lϞ.d:N;*@4ەvc3==9@jnW9DtĪZ;(iۧa*dݖpfg_N&j,!ԳIBS̀lÔ5QpS?5eJ]FYDcmRa5`X2%(C^i0)xMXwܺڦus+X#1$2^>{w4ޗUI0f6!R@j{joE)YtTEsD峱&'D<Jljϯ'2_c;{tVyMV^˘AG$UpghO&ADEn8hnNyKA+.+G;!l(c*̨3Y+hvSƽ4#4d4pzvikdIRnKM6.NQCH{de \F4;ANv|r-ОR#4f^XLPm^EWGsqi}mGRPHm۸ Ǩ74ڲS븵>?Ƹ-#8NˑTFsE<7T Y$L30&ǜA Xu9h4ѣRJq5jL0M+[bdLF)Pdι} OjM{8銼<8(4^IM/U? oqY=;\Ns%Jek4.v0Yy_- H4ԨEό{qm3j}.pJND'%$9yΠ89B4vFjQJ7cs\Z)Fv Zvplq!YD|1xC/8iRs+TQ6K$sI Xn#ݔ-f+E 8j}9-*} UkQ\m;2vXkP١l;iZPo͘y.e^=~f]2+G=p\JԥCm,uL(wAXv֒ܖmz,gOm0N bA3R :omE4+3-[w=8(kt3s*m kV>%j2A2vTs_5LJnae):2Rß/%%$?5MH=W*VL8K~=xYx'j*{qЖ?ĭZ4LZ,H^b9שOzf! Nzc2UPp4!Sr[11yMI:&ƕTUm ϘBm*RKp0m=51g䳓/*Ext[b+Y]MFkrɝnanLnJQB p[6{^za$c&7NFC@ !vĞǥqe] t̸U%Yir$ ɦ %Hs!Fؗv\w0TIQgnOk7m-Ln+oyC۴BA"Yot1e_#|̪ }'%Ɣmi+}g|7]W "k&UX?ǫ}<.z|jq{M5T!;kuoS'="m+iDgI$TU3f2ND5̛f6Byj-KU]VT Q%?'1g-%9W%*k{#erU/b)³M*tʅuL1f L0pz6m-)WG,:`zHGv"7ꊿ/}(֋\G(Tw-#Vzc at˝|>U`5)g96.WR2hSFr*C J$GL.^ճ[8 B]S%j𜨩FCx.nfΎ4k# | ΄6qy}s'wSk`F҆a3  Y6(@k:/6g:DC#Dvzys4mDhsJ[HnNux7h6(9dZ 0$]Hxfe>+"j}#N9~R~/ڦG\|5d" ;jt;M"-mMޱ.)IСBe>UYVs]ٗ}/vts<͜L3r*wd u-''.%yTD=t 'Uߧg1ZMwV[jU nBio,& M7_| ޽-qY;;kQ~Ј ̆xyAԣoQ'([*H lB^iO5ɪM+e5U9mhE~ՓkG>wd!p6 ɷqUZ3=~ȞIf}ZJn%'JVy}Ԧu"i Ly״TWmWs8VzE@-2TU(L_i[֬4ǕA vb%"/텡T#1]Itm?|zPckE7zqY;;Y cЀ=dK{ƽ{[=?wT%) XU.:Q.tfA\Їs 96-W)0Gn8ڪ#Z)v[SR⁆UuNB犛*Ocs-9U+3(PbiJIDݧm),KZl<-ʠ hSR17.<̡/2#4nɏ`k[vذgZNb{ٙpPΜy: k8BoUFU(\ ξP٩s('qF=r֒[kI_1 d'O ӬznqTsG֏Bc=4r-]IJ|zG.Pa%6I:4rTÜhim띘?qH|9kM|QJč\[=?w&VlK䎚s/QRt[mN:>?$@`=—(Uibl* nhEW%i`[6=U&Ce^h0ϭ5 !8SODJh9cFVxSq6ŘөR&Pڪ ֢4 p6li1 a]lMZʖGTS֘zMG^uҾmlef;KFk oDqg!{f t)jNzw'G&V.gH^ lTIQB?e:X`a0>m&Z~__7"1LT9vn\&:)^6z,YVX 8T@N8҇@CK7BO l]:Bh^oGrgSH'WϫضSrvyTkHZVZba. )Ju 0-7vOIb0NͻH!%ixJSL+Pq_gwa4(T6x;ƙԘ..{F~!JԽ}:!rӌi^ag0 vRIdޓY{Ϣ&۰gk%iˬpp>vǛH~Pԓ*Jw(`#c)l:u8RĬIjYi#PϦ$HQTÔD:nF@ȖQuNTzɟأT 47$ŽJ+MUF y& T1xh>d.=c iE$ЍayӾjdzsĞ,͕-.R_4ZSV,&ve :+,}e[ -^1>w}#ŭ.k0"f;CִἺf_bLY;G<2?b큶(E ]Z۩"fO挜)8*ʸ)0f%fe&9'R) fϪ&(xEWDê A[W*j1D!zMYQ \Nt y1ʎTd1dO4 I Op; zi5&i# UŖOK0e]QljtN>,y#Uw׿o5&6uj_ѪAV8FIߺu_eLNK3,( s!Ԟ2̚ϩ L&s,gIf]ॲUQC7θ{S^㳕:ү +e?FCaʵGx+<8-J M3FVϒͶ߯^-\olػ-2 Z|d+BӢjMe[̮cF eil.-9z0&XzO> ud+ꌌJem>1I8"$[<ƃ8Qw)#:rX%\!cĦ_WM+8댻FtLK=b*TQ;[%>Zig@J|Vŗ6f7u ['g&JuUZӴYi+AΕ Zl)rf:WC\&~Eܬ攟Zљaws'u‡Y)ˡѴժ.UuIYW'AJ\MRdya[ Өp lrEe^t/?uf#4Š̮y7iM#Ǣ/:qm )<甯k-,4pM|Fй.wb#Le\miGTĿ{ M1)uS$fQ&i>D&Î /f#%i:JafKBn`R(_(MtgL4xHUD qL(h(aR΃HUlUHdew=0?AUi0\URcC lge[2fm:77F8oϛ󹾿fOְ O#KꏌnWØQ8EM“̱<e&#OթcӜsC6OrѤyfn#J"iow2`sD)J gL6\beykK !Vr~̘GUxͼ˕Hua>.F 5I{~ I|urQ)Ҫ Yt&S]Ns˻&f~VYMo+#7)RZ0MPjufraB.KcZˎjγh2m/ά`x- z§}OMfWjњ떌ؽ!c+8r:SL|32bŸ]H&>Wm}(o̵e6}m}QqdI:-Z_ E>q90ݓ!{vZMlxG^sͅ!O.&]PL,ݡΨLŕ;wf¶%RJiF&ZS&gKu^}MPumhTYmwo)ˉHqy2rh {2Z֫κVY[?8EP+2R5Qnj:`&$q(/S^ͤҨ-ydѹX^e Cm93M#rE0&~WhJiDmۘ|hp̂mkGe)ރ10l]H̜J?hYP:QjIbQW:M^JiϨd;d>J f]Ì9G?{KE4VTMqI䞺gэyv@+t-ώɜw6 ӞaI9TwfV>/!3M1OMնP{fD`V51 t|R!lnDi3E{봄YYm>unֆ76jah+ZbLlĈ4rq4ס#BܦQҎ {g|=&v_iN o+0%qK \ļ-f0.I%*+3wjQɬ>Qz?{JߍJGX*=&O eXi2DK;qw[T:#ŴL;.@F^͜[GMӁaYQ*quOɃ]5[Ll+ jQ)zɓ3zauBTr3COX;?]/hKqVL̬CD,tbgr{/HrҞOĥtxGoóyUW 4hv fq[` vئmjl!'0yOL% 'O7<%+iww/hڠUm m1eЮ6&ǯZz,46嚥j:mkzef(}q=%&LH-fei)|R6!bY^STCQehʲC{Gfr_轶p[Q1~.سTO'O4Rjܕ&Z M#qCծ(!fP/*TjBs Fh4:p{򁙩O Ĥ֠k h39eM8|)=sF䳬h腰8M-)5QOxEeWR{poM9&iS+ ь53 ɲV.O-=s$珅L$U5ly۟vhpo@犰0^7a@nze&2ڏQʼ8HU 6E™-=5G Oњ3EڳPㇾY=Ğlҡڧ4SI?7̲9O)i)7xY\R) iћ7<lG9tm*S/|(r_@F=;YM>8 GF'iXHI&Lh)e8Jl csoFJ˲ZA8 n'?ryɹSわ%9e3)"h1C&EYH?u{Ys3 Tk;HL*e7tnNa,>} o+̒{pG5 -2uߧ5;v +B}TI{CßukБ%Í!0־DªdR]d7eȧRd'JYvEjÏ]]{3]1mfY4R D&ѕS\B!pQEF8n]OB12Zd0O( 40lfLwr 5j7a.[mo" Ջou9BYfv |ڌ)lgmR*%JjI3c/y#lrFw5xլxdZu< b8I5S)V$&,K:ԩGO6tz!bp(G*9Qj$7z=%&LH)5i6{%ٲ US LKiSZqsmcBI9gYV,ʞ2r!iq*@FٖrS#(smd^W颹#,%lG@!AJt=7hmdAÃP Ty9>ׂve4pY+f7.<$ˠ^nmo[nXJ.+XuFVo`ҪZcΨNL!6LTV??ϹEUϺrԏ,({*כ &U*dj8B$ܳnVy^RFS-NKKOGtG,)ofo}(Vl7Kx3t!H&{kzfVie7+(SE;b hGk&lH}^2 ?C(hTnߛlf@A8B0Vb[(ϖi%cv6C ta7֗LЪџl` ŷ:4L7XnϚMuJB cwk@PSs:|(RG&]uj/ h挔ՙJ<÷UNsA0tS:맞قYf@ÌWmʡeǕNSgc/8T|T)!uua/4IO4qIN0#DͼK)il"r.N L&YRe gAXW"eyu[B Uc $\϶ʸNnE] gkLYv3r:}|'nTKZB5}tQ>}ݰ8k4" hڡ q&@#luU8 ⢣4!! fm拋A4Ʋh*tc=XzRNcK'tEv-xL)""hi楗*RuT 01Sk#vLƯ0=jHss#vx:;ğNئwoc]"pv ݀-fJDpH$G.9g9* qXʹNֿq$T^]IW la2*k#jI6ΓNUuVDܴSlݾdӣ>uE"s]zVp}4VfLڳEu[)?+7wzz6U;F1o6rH֖Pʋ%أM-_t]-#4 vAl2"$їݤd݈=2FiJpzR dk= $IK%PŅ^GA &L;/g1S:һ˪Ƽɷ jLf0bmg?5wi 3K4OsJ1 Q́F,"5a_.{ݔ'BUR Yݗk9.F<O!cBOhw(D0U,TV4^J/m 4X`|u{/-ӷyF2R뷈%v2Qћh:;(8)퍎AjEYԨͶpUau:եW,U(ѿ\nF#;5q{;o}h'iK#.8zӢ&lI٣%LY;m@2 %o 9ﰉ&nef)-8iĎlGvEzhf8>Q?]GjTڡQ茳)N {6b5 }[b1y#qqyTʸ(\Rق6뷗eT# `?O-+ J˳#Go vKUPah<{f's7['UxVs^:gʷ+UE(EE91y|#k;w0z]JlV*euclctʮ7Mh3,RsG>q灴|x%"x-y'er< G h(e50Ժ[6&,J,% x)gnqZlN*Jo |B4\F8td~WQc>R_PrF\pH댋$sӲb଎>,H\R=1Bڳy|j[$l<єE)&mʓ; 9,%sKg猋RM3Ffn'x+QZM tkDۋUo)87>*RIǮ3`x)eO܌g~J;@,~A">}\$p<ڠS2G ՌqMipj iP!c*26X^JG,YOE,Ÿ!RfKM T8?c$a89|yu4M#rSow$ףfRlqTB <Q0ܴ a̱JPdyoCe4.eoJlW93u* Ym^oY挬u\H WHP|.&ѠEm 途fFh +.d@J@f b?]GkC[i˯MVtvr_2Li|I\7qTqVd *1e!>w ujͰͭiFi@1+M {uD妤Jpx~Жpr O %&X)^^|î-k~q I[y$QQ2%iN5y 6e&% fxWqΈ4zicNJ evUefW4Nq*1QXGkCd1Е&+GۛCZyK$jaЯJ(,+Bh}*lsz#UX[aiyƜ*1ZlڡʴSO?t|"T(ULJxns efo4R*;l7JԊuӆ(x澼nk>um WˁY3y6 )e+u'iK#.8zӢ&lI٣%LYU2HZ\Jv{)_-s"\YɥUfa^Xx+qVͷk2!g])d6ʛ>T憭2]l|䦞xr˘u*(̤1LĔk/*ʉjꉙ^ʔb`qeŏ#<6>ˇ[ B3yVT'Ԛy) )T҈=U4;KI?!gj9t@rWv42Ui?ܵߏBQ7nM<pyt˺>UFȬ5֏jvRt+&SR T4)/X.9Б[T ]YM< i7fJ N6$z:qjưڳXj]7 s }54 &Z)PR՗s)Ok;KIdVn4К3 ~G;TpNyY_]AVvjzJУod̏K8FNV>.șM|>4YS8k85*Idx1ʌ"Ew>brZ?5VXiKZ aR12qʅ6ްٵhT_cSD~}mɩS{]5\e<}E#''kLʹM6OT9$&e4댙$Ali{"2ZIRMAL°*pbtt}O!%TGoba`L:]T|Xe_%D͑m̜y 8#^y{ܒ'ǩETy9'0Ij NP'R}'۽Jh: zN02Հm@/>Ԯx"ӃlTg@vg$FG_:r-4vt)^!d %2_rZ_3W3n Uחlk?0l,) إssa Adtr\EmBTbҁ3")\&.%WtZz(}rW%e8&^]kʸӱ9Q ]*mBG|tduv کBx;Ӂ9Gf' c˥#iXTb"NYI7R!; ֛hڬQ\10xJ*c+Ẽa'L_ UN,pP9n[%KHiV+\&Rfڟmi)L4uRsJT+.aq RK-Bi_x)4@W\ 2p鞰džʕ{?_G_G_DOѓQ9k\YLؒlAˮUcJ'苲l%dYLؒlAˮUcJ'Kd˳WrȔTdl9<O -j5 -(zU$GREޙ$q>It}x,G৩I>!~nכAHSиL#RLq՞Lw3i^EE2 =H)"o*ppJqdu@t>Loпh*qNɤ2~qV zqRaא1GXZ|+֥A(3V&!T7nMmҨ66X>͐s }G/S`&N.|={ߤׁa~&GvoOHd4khBE ;D^c-",v+T#~i>Vc?I7eYƖ^Zre?Uh4n52=!7monoQv9HW'S;ȟY+ŰyXqՓyFF6"Hn+TIF^cؖ2k2@Q؄/\T٤$%#[(%9DŽ#`uB䰥;FSaL`AӐOeG, W͢.v4&Z38țͯk4KʞRiř0m0 Í!ro4Y2d Q0%j2=5I P% Q11 qM Әm4FGoj0Bp Pe!j[YZ,ܘ.U7<+?21Vtb F8Pє+ @êca> s{:C^̠"i_Nd2 jK Uam"*Jz%؈UjoӘ Xă#~)֫ B*%4J%0uC +q$3ls0-`? ZVYlj@=~'{ؙTdmɜMKhq5 Zl󷉯\r˂XQ:xWD?W/,cHG Ȕ53:}`vfFhtyЃfhXOy&&PX7_FWG٤vs3P0/c?^`= 1x&cPq#f8TEH14@|7efΧ" V"az׈8W2?] X|KleTw%_N*Kf"]-g/QiCu|A}C0<S~>V ˎ6pBJ P2\/{CcAUûc/?Rr,b:iݎMS}[([%n`74@U'K} E 0k)YxzWӉY:1!X_+amMW Q"B+2&i*)e˘lT0*] y-P ,6 o[aB0򙜵:k:iZEc5ri:s;&YpDXcD/:1jjfm6LIzϢ~u?N"2:F>ԂPci~!%es O}G5ol9R3=C.)~|V{G#fP=+!n{usL k%NN[/X˙fiQR`Vnv$x6kgzC3 EܵCV/QHo#m .͢ٯkS!ֆ[jBMb0x3. 5@# Q3RcHʡFZK;Z\e Hnq7ʞ#wQm%/}k][K963_X.z9_8ߦуk󼩈i'adX@|Xt >[ Y-VÑ)'cܲʨ )  T9Hc Ǐ§-fMh,CvS':9w-fMiv{Bo)`˙Ts[O"i4fFtƲ%-a Q!{K@͍Gð1f:B]bȶLcL`ua0V_&Jmf47蟭CW{X0m%3K;jMaƎkWW-|*x2c8+ˤZJctF,2˙S-H@ .$-uEQ1$q)oǽ6҂w{?74q^btRp̿x{fQ36,Qɓ.\ڷf\x!WE+@Ta*9 ڃ_'l=S;c殁:GzK% #1ǩF?4q.mb{a 3!*5rW/S芤LN4"IJ8:b RDr8,%mGrfoWmnuƠ$F*%&f&Xʅo~Mj`nT>];z='Z4bkT(wXFK!.F[8IuwN_.geB 16NayAG\.,0:s~F Xc2R·0@>4Cw_K8etz,ZP/ݫ?׃U[Ԙj|ssT*TLLŐo8X[?fX?IO$@ԁ-Xv~%TטەvGg+ h5 GenhEtTiY> aXkdvgRE T[wHo>6`ޱdO[diw0DS+@6#MA>_~Żo]I p/IpR3hCm-oӺ+G"| ^tL'>y"\')`SU.hu<~/"> )`3~0&_goX~rt8 es%|G^!2ث6e5ɽ%!r{mZx~Ywh.4(a'^0}uQxy>Eh5#jZ%0 Q088SK X#VQ(" 0$'UZvÜVufR 7Ծ-Tj?w}w'!x`]'[2mCASӽG4})S^<ƀ?WubNi$j:3FSfL'S- z 3UnS8 n%1'3?o֥nLɋfѝf1 P3Xxwҗ i{?-Em.hU ~yCFENp}"cZmc$lz,SMAJyemaz *0N36@Ju{F˥Xgh׉MNK):έ#iO EvX#UǼ0&,ڒ|uٚ-SV3@L]jGQ׽~SZpx|aLiC$!A7Vc*tQC} :D6;>b]bp鬸Oٹr0=/u~橵^A_nE<MeI/ C)ڀJuØS6&($h\X)f,u%&%XҾ/izuAlOoaq yMfu^qSsAwQF Z~0|Ѵ:`]_tӫZ̿4ڸV%Լx\V;E z87J"`.cf={|LcL1~c!w0Wn/uu?1V~{D[cd͓/xU̔-Qn(7MȔdNغUY8UˎpJجPG7>h_ɣfgmB.+YJ%G~"_H+uow: X+U ~]b5I kfaA.Y춻tdgC;T\(]:G-SRM:VQ9m}O vT Y7nYi*ޒ ^ c>cywQ.]zԳ%[S6f%9.kЗRzsM=*Hh:4r~xQˤBTYhw?T<(rH"Rh)hG=߆\Ғ؇ǗAQ˗Q:L]m 7/\yGCOwU xAr9MzHL,-dӤ^4,V˃z3~)xk͗_N(QЙ=_b<ӟ (|e7b~u.A}F#Tz u FZ^=Ku߆e _u"Eҁ̷ә(zO\GY"_G ާ?Q_1 q)T=?YR CFJ.X'_#=j7kDŪ&ʧ@d:b=ks#PTڵ-ȡYto:>3[1Ε2o3)D2d%+H!:>FC&hX:.3m-a]u__oj=?6 g18Vv48n(:.&tG A_ځreYĻqduqDF^uY+:BkfB/6gjfqV7G; F-bcngu4F/~|Tћ4ݽLބ kj Te)iMy/ ܇?]ʐ[_I]эƯ~ldvW(U~7AޚpBuf޶O {nžz1fm%9kglߎ7:_2"Լ*}f%` L_ÑiՅ3;.jjwc2Pγyu&j> #Ǒ`yqR#4 QJ5U"Z5 r ZX_ "RC+J4m-.|$R]sẔO-?{? AcZKՎjQSw٬y&[Utvt8YxTrh@jR7nIlꐟWj:7rS vf Eb֎6`URt7(8G$1u. r]{B)p&,V3vE:QYx;w- ZE+wJ{`WFaqhHfZ`8Zq9ѰtodQ.Mhz]#Gf0*-0珢Ңtޭ~PEh!ï:p+2?YYYcr?88lllh}p_|[0Ldk8(5M[Ƙ6Dva-4%׳p@. MePr4i]eIh:66Y7CXjWӖ +zڪI—w5d 4ujU; pa"Swa ^p\t3Z"{^#p<7!xXVÄ׶Kk+uqpgF~c"kXh0Nr{v}\/pVN -R~c-";Z&eȔ^O sv;x7ʄZ;;EE-5wCS8)Z[ee䔀~ƫV*^yCPh BQ4şRbl|Yk*[>Sj^6 LKM!--̝"Q[;kNU75`\VYCP z M!j@7a][έ5(O;E N#}׮rFѫQ='ܣFpj!oO>~s|܅z+b봘v5SU,lK +z.m#Nx =w<ƆGtʷzT_ ߣ!w`ҙ"U7fܵij_ÿt A̍z:|Ǖu7sT@ݩbdy6IJ>MZx+{Ue̛7#Vz tJg3AU,9z3 PJeflED6~4B3@c] 6(au m5Eo 5EƾS_eLF0}t"9aۑzad,#{{S |j(+)i `fc)nP+$~.IÆj\-14pD*=]Yg:(qb~ˡ_ ~^2.LI}(7Th dݸ[]F1f㦺0b?Sx;/rof*|TĽ&5,RFlh{A+GZ=˴;Af5lT+:E2lh2f=!AΘ) [ @\:]%r°L8cC5mYX5St7νeiR%}*6`LzH/iCnVwhbbֆy1kZp44*"4EP7ycq фu[a[b|0+ܯ@="*Ltk~K-Fuq }?Tib,_pcKXǤ+QzFr o U:S?IDGDK<Zcd;{@E,%;/[e5MN죃 )b E9̰4E dC& `aMInRnflA_*"W`QwWfvHY2F@w6x Rry1c3%˥/nyY!31}"uJ >0HTnCt_|A`,r%>~ͪ2MQ: Kq(]QEH!B*8os_\B`.=%cxiiT@ 7R2I}"QK-npJȨ;m sE^Хv5mըim=0/|۬~ e7^e]Nψal4h+WCqCʿX~^)?FiF`uѦbdu0_שE5P:ס4wdl5L?:ҧgw]yA| |G8:YM-j~HI%YBL}yE,Jhr̩V=c%6ghSYћ/G jGz*GnЭP?X%xvNvS 7MJs2k@h:NXr_5ӈ8e?\;:eMR߃,V PQkm#-Cı',]krote:E>В)ڷ_:o0FKMB\(,S|IJB5 2Mp]Ar'>wE-py?n@@ud%4vߖm$(H8JZDrU֠X1AV @:V^n ,\MSHo=^3 /-tf>L,r ħ\J e Ț^. 7/fL2oOA n&F/0>WN".ͯR͊-,'?7c#m`0Pw8Q`4:_Tۼ) 5?;gtXԯYs{6l~ b30{+gmn !h@|gjoeeH9%z5c𻯨DU:6Aj֮RyJӾй켮5av+"֕j'؏wi;nsVS:\}kb,!L!R%(մj5No7w{ex4-ulWmɈOƛJi6\͋]E9kQû#@hh؎%4e[Vkbso^!1\Eߩ;" oD|OWBBp xM@ BC2sH0_ `s1*W`FUE~㟒LVmhwzjF L0܃sNߙڻǙ|JA5|Lov c.tgM9u;@޺T^5^ h_ GH23:Q6U+ Hb&km2BS? s-̷?Qm;dNAp_ybNXR,'RK"_̺z1.u8twH|c„3}܄<7Y4 TtIp6IF\WX#ZMu=%aY`nGy%}e-Ea uM7dR:k(2G"R[&X/=qߟHMűrgzOSSD@ M,Fa8.BS{v{ԔӦW.Pgb$%J`2LpZQ`|GJJ\ӭ|&j?d@#FA@%ϨD&T*%,v60)Q,AÕM2.G2섶^nn 5CbsRP*n O&'P@YEVAB iUK_*0z%kT%+ `aWnQRb@6*.kXf>N^c<(%lX0fྗ/V]aba/^}ڣqp2ˠk{ 1 #{(JPɀFu"[e^>ӣp})]Rca.4z \`,Bs s)D.^әސK(E{rU6JJҥ143/y_zz]zn@?*MrL/ yLGaB[]fwS*{J5R>5? %0X{r), )CgCMzn 8oKW叕+ʽNHgl2s>H n!p:01VK#-R~cuo+OUN) pZRZ<m7Uj}zX(\9rsῡiioϪdJ}_HWӈLU -Šr+ ;~<;x Ev}&y df樂(xPպE6 `5f=8C (tƄ՝%M-Ê KKT ?%PWzC'eԆXv%]V Ҝ9C:eQurz53_J ÉOJLG7KcTptK4@ 7?)8F\Ud蚱޽(:d,< USOg$勾m~Q*nƬ&͸9c<:ޖ.jdMC5YԸ9^1T!1' +VLCt]˽W5gKSuw}f@,փ1&7Zw*^K,+VHqK"D&0jc畭Rh?3js׉W0 yPw buk]d,:-7LHcn,jW¬?rZ:W&gBlX Ż% &lDfXpBnjddu.*ћ9Zz6SR+ǀ:/ᛖ?fF9l5k݅dOK 9S-ZPM5B 9]W0#B`)i3!+k:ȓ-jCwN?g͸WvqG,j.M!C P)*aF-X-B=j ^.z}&6OK*P\X! {3{M+t`b+OLT6-,-RC;QDgbV=~h`M۱J:ubߔzBͨhk*ހï?wNp:Įy+f<0 7R8\IP.BVb /Ma$ |rx3lq3/7> 2У2!BOn}6Qt s&ۣx;rK3ۦ˚Ț5'XݙQyzJMR گ 5fK[!v־2"Ήf 2"Ήf9z G>]?O~rudk&)EQеJ {R]idV̤B 8-%”Op^g.߰.N T K/|-:do؄o%F̔󤡺l4FqdpZ/89tEh"bS N.B*^/|E^~8cWU0">pz-xOXpJ'I lmzcaM]wxԵUbĎH7C gOhv]X8]^2 ^ XSsa(Q@~gM[%0ḆC?!V#Fy| ^ ˎڑ_І toJT@2˝+aHh cP6UzxZߊ I3Y9YX=Hu_S+}~҄E7S8l3*6OV8__Mא~Ӟڸ]i9}f=~ѷ_S%1[pnjBRdcMB"J[ebie~f?SUtAMqNOڥX e<1rVC9"P"P}y\9b@Ф[o+f Wuk~ܝ=3YuEvmsGLKR'h}1LϤ}&c@/%NWQ҅ *aPxjZ#Z3gL4yCM[RZzMjSiM=g5xCo='Um&k4G279L^MUhRD6MCi=FN~~&ii6_LLZZ J%%F~L\Z=yC#N~ofmScVh[5O=͚FiޤX h_  8pbN@( 07\Ø{ E0A7 ;DB:g%1ܕ ZC$z(h߳3M$h\ ON6>SZ/H l)=PC@?@OSKLN츂V΄ Ĝet,sm~}z @<< 2 #K@U}O.>:\` CސWBxҧטuAPقr)% Ƞ`ЍAP/c-$ZDmu]5l@D,_V&zQaH,^J # 9mj.Y<3x_~iLYOՁ̤ze[C!`'YqѰ|=c.d(H˕΍i3 iK\tnUBvo_JUr 'Z ~z?Ew^DCd"& "5LȚ&4ZoOO:Z+ (Sq>?"BаkAif 7+xB\W}n(<;ѣ7fPy)'1%0l4Lr(95l4vq!S P>o0Ue&=oSWT4S(ݡjė0j[PguL٦E.itJ%R\),_lH=/\ZH5lZjpzI۽#q6MO^M H-O5C요.) }J I}PI+D`Wru>BeY^(jl^}U:ɕPr%$Op2w/ hNRtsxa}] IGɞ2dȢ;{ [AzۺRaֺt? >@Y .iSzĚ%CPw$GvC<@B۬k@_#K? {[Gp= k O)XY\-"Yb!n$#,5\Azkt7HaK%64H8`!͞-`1$ 4^$IfR9O5&WYH9x Q8 Փ8d\{}ab;QM z{(F`Qb0|3F@!~,^ѻS2n3Vb`;vG VIЊ((gx]KP\jݐ_V DWZT)FHo GȪ\i+D %FFb4r: BdQf;vuAsjq>ǭ\))x.~HzO)h\]OqwًPXR \ H#̐Bte1鈢8zIx6VhUnjFXGgՁe[L_e$3Su1~#-i>Jm.wd0w3a ͌,9.Og* 0-P1²<n!;W%"73>C-i\4Y" &`PB! QEA 6 D-P$LvnAM̮?Noxx(*ȷS SeA ^RQ!l so+c;xim|ԁb2^`b I .&կ3PccWw=]Hn~Ѩ)*O,O>^6P%_Ε|/jFPg>k'^l~JJ"t $K-;~nPTCh ̅Xg8HH*@F]HJFQ(ɧPܥ¶X'enZ&1AR `ELU"PEAi64BlE&aK1 )a4u˗v~LY&C[_ퟑlI/ff_6&R#Ѣ֚fM> "sZl!;]e,=ԡ!`”91 VRIz3TG1Y/m ! rZ @L#dRP #/լ bE,- {}uރIQR~>QiZJ;_w%" ѵeQ a&p; g: 2]FEPE[A@LxTTAPJD*$J(R|Њ2@΅0XP }Tƒtr4FIft:CPC9[d È%iR-e(8ךz3(ٞ"҃{wtW4~"B d_?5xrgq7 dMpb'vB,ha4ԇHG=".ޢLSqQT $s(1B 2R-30+Ңu5*+ ɓk.ui mWЗҘ,$ʠsBt(rI`jlaQaQ*:_ZS 䞃ܣ7'_xvj]d'&&U Jf~#VK]m_S-듿"1ɋԤJM0XtQbǂD b)˜x(A6ՏZzɇVa\Nd3kvުhfD$ȀS7)Z^6 ciFFA7tqA]{B\BmCE`aDO߭zLJC?ɊVZ=jD YPД jIEk^e[ !;?%0 %WzUT 8-p\~Y+&óKQ23*;էOجXW5A /\hj&~dxBJn༯Q bW'QcCalv?rJcSDa|ĦR)}AlTbl3QO| sg8.;s&Г@Sr8JAPɚ3O85?2~* *]ڟ`_& 0I伆麃o㒲O"d4i`.U6h/4b9J%.jtjT-"#ᨒei,yo>_@IQnBO+΀rSIԔ4p׻֖jaD箏thFP:"Hf 7CR _ hxjtdOhq0~BTS*AzԞ(7,RTDdNF[I-sKT$0ŅB#7%JE_e`MdnC31R_Ի o6r]~斚y)3A/;$vJhGQbz.gVC=iM{)Z)sC3V,Ӛ&JGe@5X/BNZ_ l/`i\D"HИTJNWh6F/0t&Z 8gy $w!1@g 9fxjVA' V"lG%u1 I9x!0ID("CH=J =@ecԳQNP-ivdiM&jvmMzTfF7IpHft>}urn‰ Lbt} m2IiwQ`*DtH")Z"vӾ(j&GZ*BoKL9N!%Bք0"4",bkėwutqDLrUhmdoyӮ#GguToIITpp`eVS`Ap0!&b5t({ *WnLR212 FYC-5L=3z 0ڡ dl@TͲ #@S ﲵӷIn" P#R2n ˶1 ՖfV:"h dԓޓFFv~Dwnΰ8@PtvB!-(:3\ π%iJW8A)e\$B6 PyJC: ! İ-&Ҧr@ ;7!8ju# T+8uX ],g{" DT"1 ȁSQJ>!tA):MUi(;"Q>[q;>!u5}e鱮Pt j^;}yh(K *:"GXQ& N,6 @`-srHPDT 6f%EI0sxSQD>,;dqaq"SMl{#1 '4&JD.#Pl*964CÄE4^PMF)B T@ ,PzzUpVcE% 5E.T Ȃ2 C( 6P}a>࿁؝ihAzCoOǞ+c'~aʷFz4@KeH{72 Es N*@V" ̮D"JJ ȎE\撺U$y [3v/@`5P)"b *N&C"I-("ȢD[=A&9 %y*WlMqx십g7zNoI3Q/}Dd &y7WtA~<(8FYݒh$KU[ ؈,PBҬ7IMw@I6 tLoHD.j{3] R}**a2z-,M*d*8 ’L7M2w?z""IfPÑ V&CtCNX ĪQ:Tk{`R}B&ɠ(iHmtYj6fU=3ax &gzy0[w]<ސ\ؒc=`&hX"(BkP4a@!%254TP& 9:ôa)r=22#mRl+& dIP S*v ák W7})BB?Y}D13X8Gf0FûEUMAg4yVK@zoAO`%SG$;E93ڇpFց/wS!=`Q0%n%!2' !SH灕0H^(,İB8@qbx+"3"Ud(6Ai""JS"2JLB"FY@+hNLĠ,& ̄oCMD{ԕXxŵh'y]qh>h9?)@V2cGTݬM)swV")F,,d;6 4&cd!]>6 YbP*\D+iAnl0J;$2c#"^s4Vd]nHZt$w&P0hLAAvG, 6UɼHfi[}L}>jI+3rɮlcR0u.Q5é ܘ2qJ-- g#sYev,S7ͤdYrXT͆d 3&0b$dÆ {QkI ZK`ť Uf LD 1:M!Pk-87Lo?FfV;o 6{ Ԏ!RB-dHXbg73XNPiH.q ސe3GY"͐"7!|1%6ZZ@^:` c%[,4U )1ֺ"Ub",Z^KE & SO\$%$T!"3)l7f04\e֭2̠ hB  @W-$;wT oQ:7O;=sxЎ)ې't'in>Zj)Z fOi@,,} miQb 4* J h4<r4$&a.POfqH…p=˪: Y*.J%I#!a"TXt$H yу<>GFf4E& N &mGk-P`FC ( .BgܿN|ͩUt1XUt& m=r;#"hO._JS]Nҵ`!I1@ +KfK:F)O+UW4F%廠Z( @Ǽ 3Dy(8QU>$P`]UB:pG Sn\`oi(# ! Y K=vh.ZjE.w+`Oicd.j͸^H U#F!#hOzJ-fn)y确5#a(MhqUδc#II+@#&tH}dH6&[l.rISu 9&"b%!$y4 viEVJ慂:Tlu㊔ Zt煾jn'r$D͕ecA+DZdqIDHV=# P_wz8œd$BFS s>*r1;'+:S,:}ڐ`Jd=^lJH+Fd($LҲCtKT?5K U$cգ_Ҥ\aL6HI]ZDlK eډX0n5 XEXy;5Щ&,() zEoGЁ6 :4/WQtk*X Jvi3Vpam9f z Av`(0ЅZŝ,jd`/+*?-[ٳ^S vfwC\TΣ,̠qefE@\opw1cI+vs{UYaW2/ؼh_jv̳ItܢO^jm9Rsڂ+M#gF_aP%9/!fNVMffZ!, rJ"EIv qaWހ0D .Ĵ Ni)Z$Ѕ+'?~~&_V0n6zޛ;]ЎrsVIyv;acM'1Hx+Prlr0 +_4,Ԁ*W~6ىU]вфsBH"6D%)hl7͙5(tPUt(KTP˔9%5{¡UPzC!#ܷIʰyE  @UQG@vކ !2Y]}$e?๸8I\/zRcp3QÄ_K׆ZjU~-z+qI$;|SR-".Q~w[<{+P/2!tXl&2Wh=PIAx,<:9;5g)삁f}|AxxoEq]!rPQپR=qW$Y' ݘ,!1AQaq 0@P`?PW?Y{>cW<ƒ-Q`#R^P b:w=a#^=U/_X6zӑ>]Utdͩc/J:k:ŰO%GK=}qv'k_X(\+Кvu{U{OSh~UOsssQsN5^¹~0 +KhG5ɳ3K=/{r=kӫg@Md+g}IgZ@& g gk\|Iia_s+O^di3OLQu|(~Inǹ. t_"oόEoxsCM=}{5>1cx({"Bd 1QdzpK_£OgdʋŪ<;_E4te~)[)eQCRQ`CQZmyv^T>@9_r5p] v^'ʁs5xizZX~QJ~a vB@'Qu|Wc~ 10 0Z瀗Y>:1 rY:u'5'oiW8|%gezʺ'.oY䙼0fd1Ac㪿RcG/ωURݿ\:\3¿(`)mbLa_edr 4/}?iSvüі{q6A Z ۛ#ȱUIjQR`DRīxXγEƋq[G֠~Q5pD/8 w|a#sLx1:q@i !όo!0)"r` Gj/ Apc= Rˢ{7tl:' O?U@Qc j: y|l 1}^2̣lMx|5B>0A 9VL)&aZ?,ma(;@T W0sD85B`/$ <5]+Xlu7(9h 4aR1ir".'x|~V4}goL")a0e >XhHIHTPxUCXp@B,2EH<bm}UoN/hY\dk*Қ0VjiW~rfٕ6܆fnK%S8OG9*W۞ L5ʼvwO9|E!}5=hM"iAmtbBP'8+ õ<r ;_X#h,W!{Dt^fxL8L`ԕ̟g!Df]azKAcTb%cC<k*|ea'yBpXb%?YW5aVX96waXqݫ73P6ۡ..;WwN@ghЙbpC0; >]DLöSPc}s|O+zh~P;hOwO87 |"1 a3B5s=0NU6n<*B@`D\ WMvqh,z{Y}:5!P)\P8!- ߌ|MM7ҜXǒN}2Rܓw15~Q}Ji2_\HOa=`0zak WPLjO&( TۥѷS٢Ӗ`F훎z4_@҈W6zG8E;E>azǮ EhRXц]S:j-U tb3,lqrYG&^hE?Q3O՝<C6bUbB}# Oa ]z702G;E!0- V}#Fj}] O&]5 ?+Ex8?ѯLB]WF>ڥC=f#x'}sҀ!|*y˶Ζs'W O;R6oߑqr=vB@؈hҳ5ҤlFL`3Ni&ԧ$n` "z%x0l2rtAv}rV5!F'9DHI&D&V #愸3 5-cs} 0[U9SMmƮO4϶w A8BHLBd~np v>ڽ8#>-?%doiL>҆$ A/Ns Fh9Cӭ]Fr՘ `rdX_p@t!au/+&*GHP\̦̄# ,Pcfmr]>3(<73J)QZz؛`~p b*zJ>2H5d Vl6$0hP9d6ڛུv}W\/LZ*G޳}6LҘ4(@Шk r?k Eg}~A@+!Gٻc*uOB|W1oxw^8Ͱ궂٪i,$*}2؇$]`4\cG -f/tRR 5RA-6s+g͗abEWږ9"M-^WUưWwo 8ܫl^1|M:8:O'ޒb/ yT>0GWip<% \ _{ʥ.2ǒ>oX.*k;4/e~p9:QC9f Ro]cE~f! )J١3Mp եh4y(G=y3nmZMaAtGc횇_8`$d#ė[&O%z=r91a<9o|5yK~ZPs5Ğ 45aە 0PTzpR @?'A@ne [za3!.V4l x 9C_JQҞG!W(iͪ #_ml1v\+q?E'o^rmVjPË]g {:PMO?ɓ.xlNU8s}ф63fqD[Kk;XD^6$[^1Z_&**o_"3O}1.|)lس;qNYz2I2ChtX[?€IoQKMˬzDH淓CU9O @Hu,%l7sP3_8dҟ76h \ aR6Y;ls\$jl k$ML5ֻPdtԷc<6 MOi0jB55[*bL:G,h2HIvppW 'Gq[txTʪNBG,<ʽaGEtRM# 74vM $면hvƧ#9Tݾ1[; jR!ʝ:' hvxy>KK=p '+ c&MuÇL/oyH0?CDʽwT󆏶_|{QT$)tu1OqxcG)"4ylx<ׇ%*u(ރ e5~x9(yn>Vᆏ x=r$)xgIBJ@`m=5cXc 1Bܨt>ZmIu!Nڏq@߷V\IPHۧnKluXWSP"#MW;iMGO5@dxd#b9B —Ƶa9`7x b"rlh_9^F׆WWv:/zd^ _Y @g i0J#:2!׮|SAv:B7R# 8`KtzxX2kVkY'rz:b\0(ì]@ 3q`_~#_(z@WIAD@+ +)%'SlDc0ӁeyP*TR|bb4r"_E(SD8GM;BWߌi N(2 x0%p zFoH^H^n(52[\51|X9@ׯ\\\oKP*LS~ YEԨwj4cy_#~1/MD#ɦJ. AXXV~R'L>EC^v..ukf ("pXh佢haBvH|1jP#O?OK]>`]S;yVTT2_1c R! =)@+ 8HZ:P>`_oYw.dNLQ}F[ݪ}0(rQ0SQ1\[zd9n;f{3ٝOEsZm D| v,{)SL̈́Olg#o:c/#+ YHG|:lU"au魧,X]f@P(ք)4 1 YB[Mzss`nLh aS% tLW\!֙j" y+K¼͟)}f1~론4 !]"NM'mhnFGߕGqMQ;㫟Br9!iP4EIv)zwdhM4~f;[>jk*;0A@K凳[<|##tWYjqf `]=E (T{̻ oL.0c Z~(N2+ɣ\Iww&"Ki< /hf>rF.)c jq6D>_:7 P^J˞݀hm.r~A~03a:D3D%9]f*7.XuS* A4`"J|P19A7=)tDՇO *nACM DWn@MlO\J&6v&DŽEWW'˰Ѝi&Z!}Ydۉb'H='%$7r T}p{as܋OqO_B=& (8\&R U@E+aQ*QzZRC Dk_Կs93) aP4U_h+uIf0 @+(HP`P'l0ZPXV hQ'RWوp.$ jvm_]@D-]eRoDHLl\ MBI*]Od1}V(5_Ԅ2hU֩Ah(5}/z! <<>yp$zg֚^0zVI(bQ`f ( Ty PTXA4eW*$(p?XiچѾYНCD{H'32a >KÎǾbc|| p^zdzdzg\v  H&oh^~ f@% 8pc^dbh*Dŏ`߭%}"˦A%hlQTp Z1n"Ѫ5͔h 2~r1ʋQKR;A fSG`pso#^}%g]uOn1~pl~\`!XW(@p֯B tQ)i TUz` 5Ur"`b:>Whj(G-mwUv{ -A ۃ& 2qv~ E\ gAzܩh?B[Hխ%?(yE-vUrз6I ٓA6 wX á\R8u'Xk@)2E*j>G^at}79aӠY`(ũ[//rW^ከ ?t CD/Srx'/QIQf* ѾܾN_w=|q?Zu3W'/9x3O{:(p]^<5|zzNu镀Fة*paBxGHE%6űd}fA\T5yokB]+XpoIZ(/"X:)&7.+%f -"J_+ͭ"QܗM^\]y4A y'2jR\xڔ]c0`'+胦rx7t"QQّ$mO0*A҇ʜ|obʟ>w]p+b&zCpaUZ@tAF察S[_ qbC =1=m>q>q>q7v ~x뛙~{0@&A7)z=c(0nFMӞ(cf PK $=!K^mV'?v]'N;钅 8 i,@5T;ZēCU6/4Gkq .ȵ=$m!&P"1?݉1VTK*UvLZͻbck\B`\)M12ܪ'1 `RSa5gyF6~k욯O'K0[8+h횄.=gI#M%"VMEYzG#[!biDl Ptlـ6B:qU0_+4|TsZP#bs8: tpށnDR͊JXBKCԪԑAlWW\ 2%"q^(Oq0£;n(%]Bti]򟅹JIyO phkZ8bcÍAbv12C LWj\]X}p?~ CدI dz $}N=Sh0v #}]bR~Ҝ_M}.6M{) `EJaodm)I  Ic4kc<&%rSyAܯ_oMMBc6\7'H6+7wiWtrݎ$j`iHL({ FE ZvpFXcÈ[~e%cH~r7{T šb&ZTHOq D\EJ])V46PA0 c'g'?Hr^rQ){K>1nD=z %;]A68b判( kX٥X]x["9&8at ?^Y~~?VwO͹}|0̣vE#PYq^i-x#"nKI~O+ "˥*u-;S"Ⱥ̀VB5!msnc!Q Jզ*vM@fG d HCpB8(0Di='s(P^K̶MndhȄЏp٪ &ϛw>!HݵdZm05rWbpB-^qqA>p&Gw%= U=zxp] o& 7Fr6]/mJn2jWx.z Bֈl8n> lFSڬGm}3ǣ (an:Cx8j*y_׿O_/鍿}k);y۳騃 P+ڿT6(֖mY$'^x6ZD}戠|sH\cWvQ #25 <8Ea.³# en”e80Xw ]ݳDYYtX6q!qזŅSL7q#B^Ģ. ;P*y읣 yT8.>ƈ芠vQc~WHd ySRFt/ F6ws&cFah &龟kޛ] R~I8>Q9$sZ,~w_ӏ׏,G#-z$CEL/UH̆bƽU5]LPݿQ?qiD`7f9)i4z$OG ,liDydn JĠ/ p5<΃Cpk)0 mm_;8D,-͇@)q=+|c^A_,DyIT IB,1+t@uʀlF鍛A7p?0ߡ+r@ht:m:@n׎Uk,r+`9uJ0l@skO~BPhнOP3!ޑp6b˜ 7NW//;^hGo 'ňl"5W! l9)/Xd~;pwBA [c<䊾sX(?H{{eY>~UA@E(Du -7+AKG- V_y]Zx}&//(&@fQ K\d w ^y?d a 8'Arh4S5N(ZX"ɤ`r+mo%FHx\5 DXu(U|a:JoAY(hY # p,^U]0$f @c_KI@oϬKT쮪.-HZ1 ǧA S hb.`^AQ@c`+,lN'bb"1zV Pw`=i&~+BE}[.\2JUG.&hfAx C jxkWT1)%:ƈyzF6CU +Ûޅ4CC BI%UE{~`W΂ P c,G<wqUPFDLXPX#P*|Iw*]z ƫ\Vn>MR4@2 &2u{7pw 4AEP4cY T ZtR5聮d(^QG遴E(2"He|`^lOWUeX,G S}ٷ?:5nnKWG~n3$$VWG"|1Crbu(6|e:^F lpz68ELOuWBhjsvu8jId(@!/or@AɁJ2ԚZ nK02+]HG@}4lu|''gvuM|7svҀV$.wqU[PyyMm ye+j9 6X:=@@1vB3lu+h4*z<(l !:Ne 83H*׏ѽAR+wwd4FcLZ47]3CTxSjQH q ~qܪl6XcH' #^;S(GX?t~u?ar?S~JzW8W$Gws @ ~\Xa3uAMs^ '‰qΤ(`X#TuFu8}e4  D#|k*V\xk \{_3=~'$vͺXhk qx0*X|nl:HT{c:XC:Gy`P@H@d TGА*FJ9Q#]nMvI;A oJ'X ՠwt\67w561'&K{OgzǢVꂜ.B/$;GYY08r/Q!J_/glewA"dG틌*T C)Lf Ok-9Fͣ`T}r-AįÔҰ=I{Mq+Vs KhS rrfDqAEmA/I jG%HBu&g +.) R6)jg 6O"``DGv`Ѣ\(-JRPR_J0r}wvKD&1:AJn(mZz@u$q)vV d4I˰?M"$zM(NE֕ ({Oa9O_<K7jmJǷDohr3j8VBc*E{4Yp0 NB!EL/ w B` @nۭXQnR3]&eq0G\Aq@X R"$iy;NF"$K埁Y&2F@;6axHTODpr} 5PPPBg1J=۠궅 L3ebR^ r-'٦/j$'Ew7b>q~\8* 3vqDB_;\˼n}bz&V*X#,z_Iل"c*bUUf!lN YR+K\N Z`AX*BT Q)AGA@ agG[y z|wg3䟳{MUWa^='XJkZ`*G)Z \fSX R^zV\G6cDGVTln!]0)$$O!f(Q B r8n"+ۇ# ] ed9Nɏ@ 0$veEUg& -eCx53 $ ÀR0պ[h@M"#vVx6LS)j ̓φ8D~O/Owb4LALcg9.j25Im&Py04Xk!`0DRK3ܭ~/&.޿fk,N`?K^v!_LmnD~](*KSZ0PUW#p:H dbD4HF;1Gq8z;28)˙UA3{k=!=)o`g$}=hc5z>!9+dBf: Ơ!i14 $2y=qzㅕz~P,s&uPfk]0sslڶ$5C&2;bgWڸA`0@U%MR&#itYy\qMm%V* DjSK ?YMMS?07qrCꟁ C K{L@{@8,z'ќk΀]}Vu_FN4C5h=-5$_rP!U_WV;qgC"-#Vx9}̼1|.芢GyVD4BVUc!UB4)ĞtMZY iM=7qYߦ$0ɧ;Yx}vz  ؟CucpL8/8rd7҈BkzʁcsȔF4]ygy?a^OWrdΛ^A EќFo8W|L \ g:zP"b8@2w7X@wI:OL=Obr`Cutu6a)xJ=]2mx2r>E18L 9j7 @ fG-Fmr!b:X~DrDRa~&JQ^]8Yj1'*'~& F#ߪnasxJ} k1"FB;bGw͎X }10A"t<s]ᢜg<6Wb{|@LYmL ED'CeIф )$ @c1;81ͻ:DZmUU7 R/kFR^3!fl1P%sDLGm(uw\@8MtFZI2SBJ<"j$fKc'kRz'Ճ`s+x"TFܨ) TDxڈȡ mZMy!VXJ|}0Q0/})Lm N"pDIƛ1mb`rF ~1kym̟>#9O)l xg:^R)L@ZirPƱa G@4i87ca*Ч1yaD:a$.ߌ ȏ!zO 팙8aM{p*m'a%'ӊGc˝:ϗd~Z^2 ,KQgiP!t3R7O08C<Va$0Gp%]w@Ў79 u=%@(؎]s$"1"r?[y+_z'sjی yg8E-BEc!ǾQV9|ddG6& ;يBjz2ەy}tź*KOv5-q'C\K(+; l"CH`YIr{tFRNX9?<?QRCpNR :p pvPkbN8AG"7D(=}L Ґ*zjnwg!ܖ-3HC83P^،h%-a X7 .?Q_ف4uUS1r{;{d5CfSskJSw:08Q8xDsǜ()8`8` G4ӀZu80ӥXT29e#JCl!)[Wk7U^ˈc buVUy~_G냧/6 <79񚍳6qXB%ϔ5g8l۽O2=pBrc<1w@*- ׂvsP="\`Dm.)^0BV'U:tUyq؄uu</+PP^M>_?S?1vCuK~TA><`f8㤧΂GtJUgpdsuV ,:J8ܛ}IU~+\y4.VFӄObs/Қa' O@6>c'kRz'Ճ`s+xޭ޷wH0"L@bc/NJqo}@MQt{ãlȜX \ (qP+7]HS_, D04 U+r8g_FD0A;k?#8b'Lv<m>5-#h5UvUUWOdp%i1*avkwCA}U&)Q*فS(iS]HvJ#= dQ ӔR430ipj2L*ju{⧟-J4^0HD@Xzm* d@G+gz :A:p}6>T@l$X`˲;.fyC9Lkp"rq):[Hꔶfm@zgX5!~_Gnz_>S?4xi6gm_=sWiQ+*W"""(措- M *$@*s ,3978Eh|`8`?&PXBn:yA 2=wBt*___v~t"==>_:JPz^9` M8t;.H_O酡$%lyqh9Q@UAKO2ߜ  V Jj`AWPLå-҃'k8tzGԁ_q0uCm0岸ZP' ]}j7 p`Vlmwc BF h]]et'kh8Kj_1y~_|_(}~:, -1\Hh5H+^RK딆(=}/&^ 6؍RjWRl=?@6Ё(v{~4o{C.Zz7oxrp1|G>r ^\#$Xf';\NQL= \ucg~:ɋZ8T DwKt{aJ=9~p(ʿ`U5ݦ7M`jGƺ{4W-}TøVQANb 9l`ƞ|?ukz)|1y1tG֣4ydlGY}`I"DC DdJFr#RnIмP 9CyüQkBײbDka/6F{?J4DA`na a\ bfl7aj8ꇣ~9?(:ǪO\0Уe2AF *t]E c0UCsP_d2 ø9vݼr [RrSP {:c2JpZjJ@!W5pPaᲕMkz0d $r~Ѓs-J9ڀuy9q/z_D6jVfD^ACYȒcX-G #φqH% c ,qXb:b{ˈ 7+Qq}3_NmCg #q%y_"΍K>P+0w[eu HNmjJo ]c>>;ODU dG"QUu\ i@Q 7./rVjh`[# vӗZ<Ͼ\ |2E{b 1^`jAwxinݠP*uzu9h¥Ox`_{ܱ R  M]GHI4~H% 7C'm dEqhK,Dy5C^bfG]q2 ,Pv)楻)RnZ~Ix@E^@&. ~3b~)ÎYN+&^r+BFlj}IҎD 'c$9i;?:`O0aqaGY? >ygG (i6}Ў ٪GǞ2B'?D5/Na.o8ZnyoGX눓?:=@Q;rNjj&s9h{]Ԅ79O>q:53 J1=.N N>$D< +m@3L_m7#2Jep|F*3GȻlIwx}SChhL䕿q} "ן>K4fMq#n$] OM O~G蜣 ײJ&c>b ; #dqxL٤lB:ͦ~?I"SLX5<9A;J` =]xߪw>6[hu!>9 g)N7i9oب0,5w?1\慿lqsp'uihe)k'mayavi-4.5.0/docs/source/mayavi/example_using_with_scipy.rst0000644000076500000240000001436312747716313025006 0ustar prabhustaff00000000000000Using Mayavi with scipy ------------------------- This tutorial example shows you how you can use Mayavi interactively to visualize `numpy`_ arrays while doing numerical work with `scipy`_. It assumes that you are familiar with numerical Python tools, and shows you how to use Mayavi in combination with these tools. Let us study the trajectories of a particle in a potential. This is a very common problem in physics and engineering, and visualization of the potential and the trajectories is key to developing an understanding of the problem. The potential we are interested is a periodic lattice, immersed in a parabolic confinement. We will shake this potential and see how the particle jumps from a hole of the lattice to another. The parabolic confinement is there to limit the excursions of the particle:: import numpy as np def V(x, y, z): """ A 3D sinusoidal lattice with a parabolic confinement. """ return np.cos(10*x) + np.cos(10*y) + np.cos(10*z) + 2*(x**2 + y**2 + z**2) Now that we have defined the potential, we would like to see what it looks like in 3D. To do this we can create a 3D grid of points, and sample it on these points:: X, Y, Z = np.mgrid[-2:2:100j, -2:2:100j, -2:2:100j] V(X, Y, Z) We are going to use the `mlab` module (see :ref:`simple-scripting-with-mlab`) to interactively visualize this volumetric data. For this it is best to type the commands in an interactive Python shell, either using the built-in shell of the Mayavi2 application, on in `ipython --gui=qt`. Let us visualize the 3D isosurfaces of the potential:: from mayavi import mlab mlab.contour3d(X, Y, Z, V) We can interact with the visualization created by the above command by rotating the view, but to get a good understanding of the structure of the potential, it is useful to vary the iso-surfaces. We can do this by double-clicking on the `IsoSurface` in the Mayavi pipeline tree (if you are running from `ipython`, you need to click on the Mayavi icon on the scene to pop up the pipeline). This opens a dialog which lets us select the values of the contours used. A good view of the potential can be achieved by turning off auto contours and choosing -0.5 as a first contour value (eg by entering it in the text box on the right, and pressing `tab`). A second contour can be added by clicking on the blue arrow and selecting "Add after". Using a value of 15 gives a nice result. .. warning:: Note that the "Add after" UI formerly crashed on Linux with the wxPython backend for versions of Mayavi up to 3.2.0 (see :ref:`known_bugs` for all know bugs). We can now click on the `Colors and legends` on the pipeline and change the colors used, by selecting a different LUT (Look Up Table). Let us select 'Paired' as it separates well levels. .. image:: example_potential_ipython.jpg To get a better view of the potential, we would like to display more contours, but the problem with this approach is that closed contours hide their interior. On solution is to use a cut plane. Right-click on the `IsoSurface` node and add a `ScalarCutPlane` through the "Add module" sub menu. You can move the cut plane by clicking on it and dragging. To make the link between our numpy arrays and the visualization, we can use the same menu to add an Axes and an Outline. Finally, let us add a colorbar. We can do this by typing:: mlab.colorbar(title='Potential', orientation='vertical') Or using the options in the LUT dialog visited earlier. .. image:: example_potential.jpg We want to study the motion of a particle in this potential. For this we need to derive the corresponding force, given by the gradient of the potential. We create a gradient function:: def gradient(f, x, y, z, d=0.01): """ Return the gradient of f in (x, y, z). """ fx = f(x+d, y, z) fx_ = f(x-d, y, z) fy = f(x, y+d, z) fy_ = f(x, y-d, z) fz = f(x, y, z+d) fz_ = f(x, y, z-d) return (fx-fx_)/(2*d), (fy-fy_)/(2*d), (fz-fz_)/(2*d) To check that our gradient function works well, let us visualize the vector field it creates. To avoid displaying too many vectors, we will evaluate the gradient only along a cut for X=50, and every three points on our grid:: Vx, Vy, Vz = gradient(V, X[50, ::3, ::3], Y[50, ::3, ::3], Z[50, ::3, ::3]) mlab.quiver3d(X[50, ::3, ::3], Y[50, ::3, ::3], Z[50, ::3, ::3], Vx, Vy, Vz, scale_factor=-0.2, color=(1, 1, 1)) .. image:: example_gradient.jpg Now we can use `scipy` to integrate the trajectories. We first have to define a dynamical flow, the function that returns the derivative of the different parameters as a function of these parameters and of time. The flow is used by every ODE_ (ordinary differential equation) solver, it give the dynamic of the system. The dynamics we are interested in is made of the force deriving from the potential, which we shake with time in the three directions, as well as a damping force. The damping coefficient and the amount and frequency of shaking have been tuned to give an interesting dynamic. :: def flow(r, t): """ The dynamical flow of the system """ x, y, z, vx, vy, vz = r fx, fy, fz = gradient(V, x-.2*np.sin(6*t), y-.2*np.sin(6*t+1), z-.2*np.sin(6*t+2)) return np.array((vx, vy, vz, -fx - 0.3*vx, -fy - 0.3*vy, -fz - 0.3*vz)) Now we can integrate the trajectory:: from scipy.integrate import odeint # Initial conditions R0 = (0, 0, 0, 0, 0, 0) # Times at which we want the integrator to return the positions: t = np.linspace(0, 50, 500) R = odeint(flow, R0, t) And we can now plot the trajectories, after removing the cut plane and the vector field by right-clicking on the corresponding pipeline node and selecting delete. We also turn the first color bar off in the corresponding `Colors and legends` node. We plot the trajectories with extra scalar information attached to it, to display the time via the colormap:: x, y, z, vx, vy, vz = R.T trajectory = mlab.plot3d(x, y, z, t, colormap='hot', tube_radius=None) mlab.colorbar(trajectory, title='Time', orientation='vertical') .. image:: example_trajectories.jpg .. _`numpy`: http://www.scipy.org .. _`scipy`: http://www.scipy.org .. _ODE: http://en.wikipedia.org/wiki/Ordinary_differential_equation mayavi-4.5.0/docs/source/mayavi/example_vector_cut_plane.jpg0000644000076500000240000115715412747716313024732 0ustar prabhustaff00000000000000PNG  IHDR4偷qsBIT|dtEXtCREATORgnome-panel-screenshot7w IDATxwu$d+, KWA( 6 *YDw=TN^O,xXQT@%uGvvdf2;|\q""""""""""5E9 >,OoBL Qs\GkBp)qјCr31ݙa2. G$d}o t@0Ĭ+ 3&U"SDDDDDDDD:l}{}8Tbs^֫59^ JQ2SDDDDDDDD6Bv?~>x3㲑5pze=ZhŏS}9K#WX$""""""""cLviKn.'߀I?&~\؋<2xӓ0B+fMvYNnY䥡a픈o/垈eyamaYf(wq!'/b|b+vpYZ%6q7<,o߀?;-Әv?as_J~bu-{K37sY['cgXf)"""R'4My ⼵lKڼdT*ٸ3 ;SKl+}7wGo dYP 3ȢL Ǵ8<>1;l.G1""""1 8R֭7O0gx@B`{‚/6rʸelOb7Ob|كUD:lĵ#!kV.綧3[PF).!8fWW4Өˉ`XBWdS&O_ڑekѶ$tu_?Ƞؚ޵""""uJ5'}y "׶,)N~ {}m,s9yao{o#P8m ^(xS@S\l9ཿܳp^8l>hEX}MuIw[x_c՞ݻذ >b] }`buMoiSǷst;ɵ"Θp1O޼)#аI+4qraiSFm\!}qyxLфHsG?2_sgt8:,䅧#acwtFYj0C9'4~nYhG:rq?&tl.4qW4/x)3'^4Mcxn'/J0L/N/%E.JhO_Ӹa6swh҉6pFwLӏ?}-{+c/;@ͬ]mcw}.CuhG:vDtΤ;clҞkǎm3C\~O6xmOsaŷK*R9EDDD,|>?iYyB[eCEqYt^YHhe\(wis Vm~Lj:cgHjpyV6/b/""""eKٻm?-1WI9xa';zZv-_a)ِ>SOEDiQqWߏ+62~z1ԳiLk4v3 Ͼr`3g66FQ4[cN?#oh݁rpF}x8(}ygѺ]qؖq/6 Ai[ )n0leY_`8bHhO8sF[DDDDd{?9f/KymeЧ]<\z]hxM 5$QcdgEtMt2َFdc̸3lÊoһE$ хz }İ9xw#l nG\^4񡈈aP M;S-NEU5΢<.ƴ3:qƀI͢q3ISG^d [鿖N_/o̾x&F[hk VfHEEl;ti6^Ύ# PA,0l&M}x8,.kðH^!N;/=QH}B~CWVhN^9YI?'VGr|SV4qщ?b;G6Vͥ5Vd! """"ã6FfNz6+NkyӋr&q{ofjǿ[ra;yhEdAr{L|~N ӹY$QNf u,ٔY>~^*+cApa) qf_F_]ӵEL(YN1mA59EDDD _sm{ 86yS7aφ\zef1""""R֣!L E;"R eG~5cq)W aEDDDDDDDDD.׶Ghss:T})Ek""""""""""G刉o+HiYV-vIDDDDDDDDD 5vߧ[H(qFhHm+0B3_ M3EDDDDDDDDOg6BS)MJ9弆{!"""""""""Rrf}غiCXڪl[՗עSDDDDDDD= :0ڳXU 1+>J{\K?EDDDDDDDJңoy[_hp, #G׋q:Ŗ:|KroJ>U85_JS(■Rչm]z-e-+Im""""""""IFhkMIUcAytbz=Kø5;~)EP} ڿ޾گH::g[(%ҳou??ǏEvLW 0@^xL.֧~'г@F2w{n7^cגZ\KϾJ]/ec̸3}P?Z}Vƌ;J-iyn 9CN`{z=^^^peG} g#GgfqWmRQQQQQQQQQQQQQQQJLhZKi /8l7>zmV} #\J+={M ۷7۵/֏[f?enSyW_wO n+]Jyǎ[~9T.Ftb/ecİa^#'se0r*}Sϐ|/}}}yr^^<}-k^ߢի|/>'%%[XʝФѮ*V>;q͛5%&&[ȗ_]XkNa+.4o+ z_KGѲE3wNJ9\Nbcy |be)okʕλ/kۯ%gqFq|0[X+T.j/kKY*6;B (w?xa:d0~F קWx's/nQ' ŷky斲 %Ooݶ{W_z(~)'?&a?t?pϿ8L`?sߢIMKMVmZ"5- u׼r@^#ӭ[ =oݪ))oߊ%弜?ݤI}s͚6TmW9~`濺WXŲ,=}7\7dddZ3u FNlL 9 :-87CC- թ+~DEEѺuk> "##9iHy|2ڴiCddTX[?؝vmkw ʽ`[ekY.MI{8qȱ 7*<.9kn~?[~*gQ#ٟO>%--O(OoŶm}XEswW۝Kd@u.3=Iy}nokoWQue#GÏ>,>t}ڬJ9ҟ3N?~TRSSyG9^^<}-k_}4x8øUTTTTTTTTTTTTTTT[)SK[zVS .8H W_Wnsom;Q\?vMvxCs'w̹{_4mڔ+k}JӦ\yd}-8 ~ZyOuj# c3Ǚcǂg#=עqÜzxN?Tr//VYy8Zֲr Y.$;;ǞM6WDDDDDDD3Fj-~%)C3=ZȟS>شHኌM''dߧWnfJi1EWY1;vE׺ҷҔgB%C1EDDDDDDDToZ%U_eǬUr_FJS ێ""""""""仜t/D֯ѿ=(sUDDDDDDDDDM74BSDDDDDDDDD{V)s敘,-`fvDDDDDyH}ߤymwADDDDDPBSDDD|VTRSDDDD(@%}GF?[2R{ CRS߯.Hr%4s_=#⫻/f߫*)"""Sw1ԟɾ()"""RGc= bD1=UDDD¬+yli1"^mEDDDꈣ|/~7&R8ɵ ?2Rr U)xǟ+!Ig"Z׬8Kk""""Rr_CSDDDDX5:W۽ 9s|+ITkg""""R^Q]Zq!Ѥ 셖9v'әlz'""""a ˲ ͷ,={։dbѾT\Vu (h]z۷/hÆ lْ'xv3336m:t ""=\Jocu+e d%qH^Y FϤE/t-yƮTAFhFGG駟pBbbbBDDD3f|׷,+T>1bJ e_ʕ+9SyǹKl.dn77ofҤIw}VĽk,_}?5]OY`?t=? /϶o""""RaKhΜ9GyмGynм۷3~x∌Ox≼ۅڵ-[Yiii$&&^hݴ45kFzzz%*"""dž&3o'4B^/=zk/9xי4iR.]# ?#?DEEa{ٲe|3a 6f#OS%""""ag6ZJ2RXaGqUW݈a`Y>c…7?S$''ۇFi2iӦ1i$~wN>d6oLtttnڴcDzm6~.]7жm2K|enyò~z e˖1sL~м}K/1dȐowy%GO>a۶m4mڔ &0gΜЏmڴ믿.1ھ}{/^LnHNN_~߿?ԟTq\Æ |Z,G;5-}^334s37'3Z^/# ah:9i'S>=w9Yz5oׯgX#GaĐZ?J30gfΜJfnիWh$ϰah۶m87QDDDjbdfAFntR/^Lƍ%3/2uT/_~ԺKll, 扈yU#5gMRRdܸqnc,\)SꫯZoԨQ$''ؽ{7fbС:_~97pIIIddd0}вo\}l۶ φ Ϫ_1I7 ) NW5_G3|f̘ALL Gq3w IDATfvt_^uMM7TTDM$3!CmƔ)Stl3rH,YѸ$wuo6=zr1l0ywCu̙C=ׯ;v,tiYf1bƌCtt4&Mb„ ce?=tYb_Ai0z&&t3M򶒙""""DXn ns_|1\rIMDDD<&33:M~MDDDDj^I7rb1MuV.H!552SDDDDDJWv;`""""R2SDDDDnS ͂w,S4 RDDDDDDDDD %4EDDD?..Jh]HPY۾Բ1cƗl`)%˖~S]9}Rˏl[g """w8ÑCxQDDDz/[MIMr."""RAFEDDDDj""""HPBSDDD2RvDDDDD*{L^_DDDt %"""")""""""""""""""""""Ro()""""""""""""""""""Ro(YN~^O\|1KܵK_DD 弢_O4r>|Ç3X]}'է}%"Ž?$fͅ4i){o~^#N~}h\?>7."*aRd'1 ΙeN{#]Rx|^V˾`/o""r쪶IOѥKg.ll@ q{pٽ}+?ָ{al>m0Hڷo~7 k:ԱZ/Wx.G&VF^]0s2k {x|Gp|5m #i|Umk~dOk1p@+""R#&XN9|4`sb9\v'" 쬘I|$g`\=n lIHdo|ϚsFO]32}s╓%ҋҦ L|}ouaCYK&ҺUln9}yemے ?gHZOzGM ь(.\},]O\xM OR/bbb ͿpX\rz-,q*wኰcb`"xa2a`<UJM 74-0 >  ǵ6"ancp}/6?H{}Y4ם7qP3 i+O6UԚ5?ѿ999DGG/{ک5_DDs9=pmDFDG؉qو8rX |xWN1v6GsmD=ېύ̼[3iI~m^< r! 5#L/~+vV[^zѲeKr Ȓl]OM+gttMz'N~77cˢj c^4LnOlA *}U ܛdN։vZr'=1sJcHf gԨiЄ]rꐶw7%`DVHJFYnuCQ7}3Uu…\0ldfK'ȮIi*ũhN;6,l.,`aa`9 Vr(+80}#"L ͆ð;SL(`2srXk6@EN!I^gǕ0槑N+Y~saHJJR2SDD۾5`8#; ݉e0"`O=^R1,Fqo ' #xaӄ\h Yy6=䷟vVֺm`G?h@ xEۋSvBn7ʸfylEzzmKp͵^¦M;KDDꞰ~u:~>C`weYk&gr 472x=Zv xHI)W 5bbb ^:R*QHEtN.)L kd]cpw\7꼷70n1=DE;u ,AhtR>doѲmkbbڵ ak""R/5qɗ=z~!L8u{Ѳe36nٵ+,N;MѪUc"KHȟw䣷W:-asFFdvd@LGbKf[9%p.ȣ^- -\fekikc?8>mr9sYpٕTc [_].8L<W'7.ksrx ՙS7Ӳmk7+KiaE\DDx ſӬq1Q.c| ԉ?שOb]<2;a@GbJ\>˷,ym̝JL^+/^Eؠq,n baB |waVHbOp\2IKqxLr=>۸ϛ7QcXf8Ŭ^ùࣕjߗwצ' NF.&&ݛF Λ׭ô20-x†)<zCi,˂Mvs/OhlڴݻSC|'Jfc p'7l튈& ŝםk Wryn<"l6:e&1\(b}})yyi40f~cZLv=p郰ճxQ _!)|f&MpC(Sw xqo`yLG+ =ݝʮrf3>v&6'3KV>>J_W3f^_>!)&NWK: RS#4-d3h@?"bFߖeJno߶Ç) 63ٻ7""lڴgIҍ3neApm#–H]քym`lX3bL~?*7΄`B+v̦KqgcNrca:ˬ_pyv}+eò>.p/Vux MXlF_)ϿnM}>Xx"""5gVL0W?\K};OM".u!i'˕]\u|Bwi#qW?f.b]̺fa`gvhBv6XFdg QNN#xHpeWy*gx̗Ad>(j@ynLni̓NH%--LJarҺu{2<]|{  '/~/Af*7n74Q~,8tTyvI:B˒39n/M:1xc(^Rr:/闟L&q2-Cz6d;x`7~nAXvAJ]֨*FO]32}s╓ߧo߾iӆ/4IỶ[Nۻqհ4_7T+?P;~FDr6`?<\10P@ G𷩗ӯo_v{pn~u؏ݭ7^w!]7Na 7C׮Y*Ǝ ظ8sقwˡC޽3,,""/ x{p;[ap:u[|d&%|]}/ %J3yKFS˫32y߶-:w5x;vAC%qU'""RSrs0K_rO jC-y#zZ7=rØQN,qxeЋ3fh7 Q9#y<,؟lmB|4ĸMIHhWpU2l @`z^1bbbeÆ ر4l(s7㴱-Թ |ypmb_CseO9i pFh'⹉ y~\pmдϋAefrlO;gҠAiҤq#.'mл6Oή):t뮻-$%,6mwިMhED kB%'Hh߇f0 %w}BZfnσM5W:=˦vGip)οrq *|ء<*2M)[WD:`r۳wڵ M>pPfMSx"""5)qM[rؑ+¼WpsxˈvVy_m+ʑ?X"|#Q,M7tғzsF;h2'`;4\Oa4tXF_ñ$*ezp;vBjj*n朋.6l)))}=;W67aS_ŰG`uI:m 19 *^:d8IKKb:|(oKH99xv; &MbYLؘVcxrú)ȱ$췽: gL#8BqM>;,|ݤ~ %@?Jݷӹn_}J`ҺJ,RRRH;QG ^353ED^q;}>I2ت1cdU[3 T~]m˿Oq -:P}y,N Ս0WkoAж%DEރ `q|H¯፵kqUz++㰟χ{7ʛͰܨhƍו8?rawqEP۳+O=JOJ}|9c WD_ l|y7̬kh}>LKvN6b7 J|z=H*ܜکUlXeece[ ՟L;m2m4v;6 ,0΅e|amٞh^|)4n8""RwTKB`h5*$ErΊedW隙Gl= ˵%]re.rMx% +-tLBS:7I}0ݙ\\k}g7XU8չ<~͕amqO8oFh5s}]f̺%@?cD}.DȱzCԈr8#5mVW)"""Ro.Ug7u\Tc;OMOfȱvn;("""""""""R JhHJhH_UG?DDDDjTk4DDDDD 1y5}/"""r,tɪBb\66#8m3n-ofE{g,0- ~<ޣiYy&tnl`ߏ# ǖwR؅{7"?v^|s H&xv֑Ϙ]/R5K ﹧w̩R{"y^e0 *1+&GH]Fib]*oZ^y < +NG YokVϒD NQ`:a;2Ǽ:A?JW)!URy,lR/YtUii/!3?K)rk~84@>yY.8_qc; .fs=$@G :odUi"""""EuNamnd0/˼/8͍З_/RF IDATT a8ҧYYGgWf<ֿI) J`e R01U41YpB V0>h:oqrREKRIC,V0vn4 dKh-ϟqve93=$!B1"W"/p]..⢈YJq1S)y9 D A;Mo^)NAvɦh*UTRJ!7k7UKĭ2YSR M^ʯ˭5Լt,%D&RMM=t h5PvY)%Sm,W:v~SO nQnt +g} < 2}:rʱQ~ afj`cdC)!03@'53;vz5Jh|z>Q 5=Po*Ჵ^AMQnJzsT|裡ɏ_ Hx"\T\ i*L:dwR6v&JYTRJ*Uj\zKq*@EYf*i]͋0Pe2z`olZjylG'=t:Gԁ"AmoX1xIH3? UnxG?-qܦf 7.ƥ:.,$/^v)+щRhz- ȱKs#\tj3k-ӯ24Td@MxPX㘂"|~ewH69Ԏrs.tL\Ne2),ڄµ$8.½^][ivs.Bs'$&-5C'_e4 `y)$bv4֚P 5fEAyWsigiLJ5V8>00r^@TRJ*UKGs~}@f|ȂKhyY}ﴰ7Ȥ@*8.u;y':2Pz:δ|}Vc^f`ou Ůn0z'Y2jM; jy.ẍC7sM'|Ohx_n]}PXeJSZ)XB/jLM36'`4ݛsP?2ߧ:N;Q=w; =}Hn&fXF'tF}PvBPsJ*UTR:jɽk1{Ȭȵ̤頴\4ٷ~;2dk N+Ya (Š|X'הQVH&؏SzL;moI|m@J4 MMKlOߺ74& &4Y֙hӭ[΂$ dF `*BH> 4"O> iafh؄w|L[XBMuT+YdAM u;N|۵-;=,`&f(_^,o"&v,2eġf"u vU!Uv ^$MGɠh*UTRJj\~<P`OAG8oc-M0Lk Jm #6:M b4/1G`kSb[kw+xI3R`,Qe}#O*]_4<ˡxA ى݈֚>OLʇY(X&or:E3; .Mպ` @"QHNtlT,2Xf=HdY5g"1̤D* h5KnKuy0]9̛n걌 Yg^S5TƢ[/.h `7Es]%1/1KX2oYTE1Nټc'۹fFV|l4O3X f'+^,4ChyAvw 6@&>L4xf^Z6a,ጙ'3j>4x8LXK00P:J*UTRݻ}ɭ9E՘YdF3T"ϸQGW*b؞եNnDD%z-՘UH=xf݃ƛv>,z.mjv:մP[ hV%- ^ 42> Dj"ғf*צ9ky^-nmc夺)&!usyy@]/w·=X ANޞh!+ m'\.7]0$L\ 2::P3RizfS5}VIІxsNxQG8}jO'R}Q2dY,wevWK*UTR&ޫ,3 L\q3~ : NO2WB[&Id3D\<]`[FoQunTbI ID)KHseq= hFl?k XKrs&h|~`/_6<5|$ -lҭYhlmOiAyn⑜mbr&AMra`@@y0{6&(/k[`"?ߗѾ[9rBOl6v + ^h?_&@I녷Fk*kǻx: 55Ctԇɍ `֚ףG݃f'N+(3, s?£IDQlDFQ3$i2E4ݒ1 A_uT@ @Hkѷ]TRJ*5)DiU/ Rl{7JTbʴ4nC4SI̟&.dQ5 #ZcS% JзTQO"S.nY? Kθ@j&p͉xtNq71a 8$u>լ.gM:tx#|^h~l>ƪߎu5'ukX9]4ytij[6 @Zn'!Xҝ~?x9Ycѯw\ $;ESQLQ5&yq\dJ8{p{RaF;qG=#G֠XpRNVws`oG}to6ZBLSMZC7={vϟ_˃o{pi&̞=6m2~9眃s9'͛122ox144; gq77noC^RJ*U֞?ז E1PVb=\`4ڭ<I\5#AUR V9qiSR֢jMIu~/xw\| i-EI.6ȅj):Z:_3ݘa' ι?F㵓vkyず/Y`+x@q53uz=;6YivL7V7V]ˮӧ.^pl@tݢMWuZIҦo;Lq*;1/WGW;`Ÿ5<-L@nүrV(` hۊv1o '=Ҍˇ^ٔm׊ 3;5U`6IȶA+"vrO_aNٲI`'י~4]5^@sժUpI'ooB `P2)͂ Hq(j·r _vZnn |0}'?'kO 9Ӱ|rzXd 6mڄ _~TvpTRJ*5b+i'n`Ãv:uHX0"ɬ"D J%f $rN-o,ÛdR1u JO/4.T%d^c{_2eFp-r5f\~[7\[evR/.鍟]vً{9t#i:HJ\}+ږ "ԃ5.֩E|~^RT ڕvWn:CVPg fgg%9&_K8['?! (SUUCZ ? 9C8uj liY b*b(v+i2jZ 7|sZfB]8CBӹw "m3#m,DRoH\pN;4r)"h6g?o|]um>ϴ]w݅ `ܹ8p '4V F_$ .Bc홦)֬Y/| زe ᪫J|ƍW]w8/UTRJM}Z :53VռzOl苁4R8S,3ޥ0@V^#aa&uJlX[g{!eͤL( A\XQ2l>)B)t&W+U6 e@m֚mKw7hKܽ6?0FSoNh67?b`; ;cq8hvxɠ&- ,>L*M{hֆ{;N}{ 2S,۱&3)˸鋶3@]Ϲ802r3l0`]3 Qe!Zf7m;,e>[풤*B{{e3YK7a֙kQs`f{ZF/g3'Yk`>1f]|@6/72]|`-FZ&vKP 5>l\wu㆙͚flr1`C [:{_!?~y7'w^;@kW_u~:>uԧpƼypqᢋ.¬Y_җo|/[_VqG:@q?/K*UTRSSk0sPXh rPPQ/V [hJ ̱1}qy&*,w5O3F_|NTZ 0ސS*5 d nJU$H2.0Qܛ ЬQVtEH8V>g)`@_by:4,gbhVVeطt8Xn~^7@s<`noqigz݁h3f<jl_j Xg濓6Ibow%ts;u:8IpSq\<fV~*ս*dA礥m8MjFPze BMe*{ب /O# a'+ |O:ݬ/zs"ۧ}WŞ"Yx}rKzɽ]G411_CUI $ nafd- tMV7q Kۢ<{  G/oa O6O/A+Wb c~I,%{#8Qᮻ‘Gc=׾<>OÜ9spaM;sLuuH)Ckũ]'x˗/aus Ǻ@XWn/UTRJMM54Au&wQ3/ܒwv }@"Ď)T˖Uk StSiJ" E^ǜ:|WG:`YF@R` R5jiLrKHm&&UBG )͝$oYOTش_|0JaRe)=$lNx`&~L51jsD mQGܩ˷e5{#"~ ؽ`'ypdSBL7cV Ew.Ee]yYavT^-ci_f̳N{Eҟa>A<*>0&?X/y>]fVCy־-MO'wjطS$1TZ<ns]zCHlctS^ i2jM@Aͤ~ IDAT-[!ǫ?zQl|TÒy3a+,#O= c_x\@>᪫‘Gi\{'9s//qcj?!w__ ,#<ty_`~`ѢE=q/UTRJMN h r2֍fZH:cMWL;U4@"Tg RH)@DH3`fpZ? x0ʧKkIԾZw@Y :;fҁHW+汞O2eyR} D4ux=7(EPS6l:EhI"xEHyKn4hl`+6F^#`Hߩ׍y7"UZ'ۏ4'Rf|ABYj<[g[/(ys7q7iy 5&XGȼ4&NG' 94?`+`Ÿe$ړCBd[hI* 2@fR*@$;(Pи@zصk yyKP,{R, ERπZf?FB(O\O7ۭ&;%hюLhn߄ h50gz޲g}cY`xg01d@p饗_2~iMo9c9_q'K/{`;~:?p̙37nW_>ؤy{ރ.\sCO;4wy˰tR<+p7vUݿTRJ*5ݵB[d1'Ͳ[gK.[-)ֿՊ tCg&B_W2{|)h!8؈YNDBu3'G2S4i^P }3M7ɴ9gb&*s:j[,i*UaY:) w4VLv"S4|VmWs|a ࠿U달5} ׾8|XMJ hُvo`@}:GfO?uvޥ& gsRa0Y:59T_~衇[oʼn'~{n.G>|Ň>! X`7⦛n2i."|G)%>m>*ƍb \x]qXp;iؘf~ qJ[7s"QKIaՈ?ʴdعs*j?h4}]:ڌe,@™3]۩[̿*nl|Nçq45Ͷ)[֙oR"Ç>[+NjIf6ު;ԭGK]XY[,~rر<.PTfg93gz/W|څUWHsHRc տѳF+(,>d^a&wz7 4 |_BW8x;AcT" 9~m28[g;Qsg+߅o_z@ DZ~*hۼAw]x׻+W׿uaGu:ꨶǩVHn[E p6RJ*U䐼s #٩2[hF:\*3ihnd6-Mkw8t::JdZ\EġPB4P`/:SY- `Sj?TYe&eDao,a"!)xwan{=@3MT dQвse"l{Q@44]d+.s"ϵbghz{ f $MFب>E4% ɨ<ΑK*UTRJ)WTZ,Pm >~.RZE:nǎ:FSRq dX)'JZ5Gf;;"`@&wW]XttygtzZ&ոdi,Jn.a"T92TiL,w'YvڐytcRf<,<=Dq4QuHocSwp -4I 4shjkMWw54e O=;wnQi |ypqB͝)?P۴]̮9NN|\Bt MtȓÍ).ָCM?/Zax)oHnx{z +#$UϝA$,䙴^SJCO>Kff6*^28SW֓Tl}{|ZxK3YxTRJ*UTRFk0su[V/UC"+͘-{2IQnYɀL5IZXJvTp#Œ{9-ǦYhULj:,y+츘Ȧ,9%^jyҍhYSƲ2XJk;lx=949՚L +ұTXWAue 0W}^W-46_(M;Zmoyf['hՎ@2WNI[kjt 5U.-33~fex}mC[i{6Vq /Ԅ={eGj4,lB<|6kr"f48<[OR<4$ 0IBchzvm|{c֑@2(;h]2M5:EFMr*UTRJ`|ʒ˝:6tٱeeRA7H3%٘JP|+:O\V^y~` &fN֖LuIfA3i=Ԗ&83Sk65L$VjJryV&/儥K,Db4N-e07z =5ېBنR214Ơa5MSQ7֙}Bci2k͎w|2Kͻ;s<9nIcjvg0Kv"=F֙~qX=r _U|7D ,dʯPPf`|C7^fy)<-oO鲾zho?b#snc!I1vr=3]Xf:@?1:c/P&jFsll9pBI:dT 4K*UTR^"Z6SQ >d HE %wqv^|)o=jU>[#c%*ka*[di @-BLa[j!qga&6TTi%MRv^-K4zmIloL-U1UM{L4J̼˜<6Fuޗ FI7TρNPh2`@]x݀M"ռ:ӌwg:5bܛxN(ކ`nGwc) 'bQQl}P[;փ`|;3vhǞ@yUkCÛ *ZDnC͜efdPw講,ȼ ?ECc)P3v*3,juC0@TRJ*U%Z HXK )-䠒 a >v 늠/`m B~k̹ڊox墵Էi\~T&bw-o? veŬ>N 3?}j>✳ῨtW4?jS΍>SKtRJ*UTR/=KL+t;c;p;}/C6EX0M` '0O`OL.g\2۸sKSx1N( f9KZ l|ҌD3gBNf`&܁js[Kbf;qAy6kIfw0|8}}fUc 8wj7FcގOchd?sEVݸw5(w5 @]|>v~rWнш&?UoꠊE>s+ 4Kte!Cw.ga f(/=8^猪Y5Y,v#8~mL>/fwJYTRJ*P_,u}5%PF irXJ1+1M40sL1f ٯf_ U9Eo'HNwY}KMTwrn* 0Tf+(;PU*FϼvLoy)'e)0L;q9av;_Tw+9*QٲH;Yu$iڧO0ϐ{;OOPsm 5c.XQ.߹쨻yNf֘[fNؙhlץ|ŇݣD࣋BہE!K!0 $]Won2ߒ-y_?f%;.aC⃽a}@03}D{+B.7&8F3?{z%NWw[j 5GMnہ"Ҹݠh*UTRJTm3=eUkwx]wT#?sJ >I l {Lce_.[h.N7o;/P56PIlks1c@` T@U`/rtʠy8uQojHα3y ؞(IpU HU[ޡ@b|si d@OYƮYI,2λHcЫ"O5Fso+&4} rs{ YjrH>h|I>} ?}hX7%9`8H)sVrDvc귉Q<&Avx `u:<@Q7cQ PNYG,-9fJ3 c ,t@E[V">v4Qy@*l`H`SBga} {ւqc$Pj1 'Y(Lk^5kM)l!hJl9b|>Ƙۉw,tjuf |2جS`PC[n>֙v:oVw .ۓY$~¹Nx˲-l p;]3_>-af[@Vǐ C֬h9$d*i%_I1MA u'=Cn9 ˖}W}ދ*UTRJujE ;t/aM*ɱOdV"5nd%vOv5Ky_E:U'S|q3 *qAF֊A^(ij}5&wpBcpiLI<{Yq%v/cg: hT[iJӕ&EOc-e-*"o64EflMZI̩iQYh!ˀzedB Όx?S':@ܸJ%Dwu;ގ;*#LBOrci"0`!x HgX,=aq 3FP6޲{o;{)ڧ`_gȶyڰkws~8dEa;i>^.o)y -Ԭ\@xM.y86q5S>\SMau/NKhK gb{UᠽO_^2e8x%x=ߒyXx]2:`'hٻ帽a2TRJ*G3zD>8: ~GT@SIzDv93;ABt`DSF1Lf[r%x굫kVc iJºqn;!K @A 䏝q3R7&pNS(M)%[xʖ7W[j@\?PCYgRVjHR[\TخAu5gL1ytz^Ɠu6u0whL=- wj5Ou&v,͢q4A(oQFv[ ZDru5 SCvʹ,چOZ9 fbϻ+)hI^YlTvX% I ?;鬹 0+{ .}gEKwt?]ѐx IDATC冻I_Z/yZ4M#uV N088 Uoe4E%<4{llڴiwTRJ*5ܽƸ uٌ(1 S6D:!rWޣuY`ݫV^뵮#ؼ07;wzA 4upH%tq`/qە_vs;2j|^;Ge-NYI"u!c6mb4nNQJC@k4TV_UI l3 d'P`@O2v>: IxPi,SIY*?QPmh챞5:Hy뚾+Tfx b| 0- `H;ktj@-V8adoھd3Ԩ'"F 9 ʃY^rRE?t{0.9&ec\m qz,0BfhPL)"?FȃKnl /?o+kaϜΩ#,xE^9.9X' w*O.1+WhMˮvzsP_YA̱7럶'X4f _*s*[H -|/&R<6g4/;oG}to6Zc̟?Oayh݆  ڼy3FFFo?8pa3ʵ3ܴiS 3K*UT* q'Z%f=!X| &j0y&(QU"=ja; \'i|,p\%ͺQEML`yϽ.WUYkAU[;HTSFqI/~L+4ܙ4VF| Y7*1>뿞wHR`k^7S @,$*-Gއۃe)s`Av%@O=WżY-,o6Xkzaj ءۍ#vy>`k*  ,RlZ4f;;kGfu@cpf}>:u,jxX{iƦ: 2֘DkތE~޹х楻$eta@ID;w6'^X [ [ʇ&1LEyϭ 5fBBJ٨s˻:'v|Ho;*]%za/"yބ~#~~m*+wMLBM j*vm8餓p7avi˗[oŒ%Ki&u]'PRJ*U%M͌Y,R 6 I's4[ވc&k_+Xs3Y!~:`nSgߕgf.><׾~qЃkmc³GE*`f~,3i麥 Ұ$sL"yNWB3Bm$;L,~O>Q =clURqbbIyMt@"jX94\?FJ#u'}Zۚ*ؒԎC}l3XKdnyUW5C,!YYZsaxƒa5==$1zy*WMSMDá{w7` f#Kfyhܽlw|r*`&= ݲrn !B EC /GsP'y^Jo軁X' BPZQhMf`oo2VL%/qW 90ͩ*j͵4e\jnftI۝m3|)M[ib(#V{T+j57u`s.*y{QIAy-yd\ADYfΟ?4h];r!84ׯ<;{/q~7:,|HK}$$>rBr:ʱ0yu?͔ X0iJ$D+f-cTgo,{@ jnmi,z4^DY g_,3E0Ą{mQ6ok߂M; NRO|1DIfr 8mY%p?Ԥ罎i,3' y[(_mW/> "ұ_Q=xQEXAF!t]}HCWr{n[Жܑ]>޵vhPj,Pmй5_=,jBAq@=Q|,>tJt=w Yܖb;Ss{znгƘ, !ߙ ]MS h.l4͜<.]s=˗//=g/.ŋ1sL[g_ᨣB?f̘ۂ&ڵk1w\gٳ)T*cau7cdd~۪TRJ*sbp_TCrG4|aYgҥ&&M(12VҴ h[ƀ=+Nf~Mnǚ:f;~~ rL(-v8q6 *X(kLR[+y-4=@H8fhNp[ޒئӼ:œg+}4H.GR'iH5s]jeU?O1T9Ĺͪpwű~57s1d@gd[+M6TTne"9:l,իTRJ*;yfEB =n:Zjk+<~U7=d8VPjXT C= GcfҎI00TFxMيxCku:iP _r2_LS)@ƽ^$10Pj5cRR|L;NHԃ&9T Jm[_I~^EpϤ L86**Pn5hQ["8ENP<ߕЍ4ƂX+Yܚ̴ ))^sl3 R$~UW5Qٯ\j݄xC5!d[2GBz*شM$$1.hxTWQkC}`UMاU,ݪq͏ /-ivͳc1Cit:`{6P<~/4+zq0?6^3gd!n<(-lN&`s;B{X=ߦ=(;nHw_nۮʝ?^Xpc%@Y `SSS&rY}B=i `r~~Rxj2?!Cw{dՔ[lC_AK= ;oxGbŊ>r ֬Y7͘>}:lقe˖%m/Z`~`ѢEΟ?>({o>/UTRJMx 1V bI"Ʉlq3atNЬMVcE_8ˤ HiZo1Z[>_gz/ZWCNQ [֙h>L0T Txl1W3 g JPL HMh9io?Pu )feUo?L5-Є2cBΩmO},E6Rj6!4?k% AZE&^8[K1bMn#2,[mSmE*( YSa'QfD T&F[5B2)!PVjO'llqyjK5vp®EԇڃS$B*]dBQ1Q "i7je\nQ78]K(N :! Z,Pm$,?/+Uȵ{$Խ6:3>wozн6c̄uGB`LW)H=+1_e+Vb_jc @h*H Nɪ) 40Y:pǜ9sqF\}8M=袋p5`pp]vq;E?裏K/-m\x %# T \};Ɓ֖r0.ȿAxr,`fuU@M7(.03c܍{|c'w@fX~BaK<f̦P9tc5sͺnO+8Vti|c/Xr:~D`h[z0wH/ 5`fdz:uu(Y#zmZ09L5 "ߕDJ#QV/ʑd)77M۪Mo 9mI$(]tfԫ#WFxXg>3Xř-ϮqO[C^r7 haAHKS;nߟߟeZLQ6jׇ wn8V w-*똮]]5o@Li$X3BӱH,NWǢ)4'*zM~GPSrf Ή-_11`KzC Njf3s+pA灧Ϗ/4MKAU&%6Y5-4'B/lů}Y*L,S8SkdqZ@g!eQGj###G}f& HB MP @Dʪ)Ȧz8&&ʽaPPeGv !9]?9HWZ]U]UPYj~3{<?ekY%*"з3X˘cu]oV9 2싁uJC8-wYYK8QiíE+9}@Lu ts+o}dRCHǒB{MNb/X]J`~$PY$a 6-فIk7Wɔx4XR= LB bpt[D!c- a*" +N;殸Ieg-;4T_جas%i$OW]'f m;V&\a(i5\ bAT?!p\gۦ &.2tu|=&an Ќl\~EMH @yN,Y$+ɛ'mH툘i^~ 2U!sBl?4t.u^5һ&eb6z9ݻl(*UTRJ3NK: 4Y!;UAmιp:DZ*!u q S絬lߍݞC :8NQGJRIpmq=ʧ懫ލ+}%RV2RMGf IDATԇ9XCTM:2P0#0`eV8?Q\Rc|{_{UIDeU_~/@='sC DqEL?l=*Z/Vfy ^R?LF ͯ3deN|)5#߃;ϰd${1C%R# RJ^&X4\uȧO'یc3{Ow(-~yRJ*U"#c@ ~NhU/_U+,}d ;/ȃfcgY 6PҁcLt @=X+ ?nT"G%f KBqr4 3Zjz`&G c R Þm<=~Su.CCذ섆$tIJǕ&!@`gw1>"d:<"IԓZt:"S/OTc4˪DUz_NJW{ly5C\ZX[Yk&wlݦ򚂙+GwmLHn&iwح8 Vε;*wWw#S[&ŭtCu mpu?z}95_/[.2YGPvn.I!5Vxi,!}i D4 p]%YV!^N/y-#:Y`kvv~8c? Qqn\2䅗pۘvh*UTRJe^HEg0 HZ1(z;<^Mzq$0q=./(He: ``ߊDMz{A ?cL}l+sAjo -Ɇl|x8-bBL$IYWeM}z P$r~.-$qPK Ys/@krb,'΁4uFps@4(^>.SXQXQXYX1sWг2D-HZ];e3M=$3kT]:1U+!Ouw ΄g7ҿugz^ tRoۨr X/s\K0t T&7qb0S2Mf tD;x}4q̤w{#wg!f⥹ԨJYTRJ*6-VÞsL_xtcbaduѷm5l|d@ʚTa~yνBP#-PY_>u ;@D@hRkQ-BtB̯bjSs/~s(3ˏ(Nu c=8맓,[f2:C3/#|b,3|YEK]be)K4ϭ#iRpz.c:bT `~=/\JdzूHض>~WXKMVc/{Kx5L>uheWAء[e-g DR;Lf¼s7@䎅i>f*o#Y$5?:2f{,P9c2"(z6{WNpھ .:&S,PmR;?sМ'2Ôxt9LᵡԮj縕*UTRJZKrޙxg2e:X.4` y,^_Muozq fC?YЯ٘xyX{ tζ]X9v -5:q?S"jxԋ]YҫA ~p4'ؙ35y&YAMZ}gZKNo!RifCm?qeJr'd~W׀[YfR!άUJ/uUR&_W֠v3\Uzbožs)e1Y=#fҌX$8>UnKYȪ_ X; g_JXCVkf|#ٚ-> p^'Zɓ`\_uPrݦ8͝kCh4?YG皃]KC'8lzwMpn >iM^P3emge _͇!,A-ԋ^Rg4MY߹߹ഭ91IuJ>E@Μa*٪AMֿ@msf4@׀#nǬpνY?(ߙpɉ'd6%e6ٽ4)~!>`#{uO8}Ȥ K]b^ʚʚ]?sA`eMbj4yÇas M0_7ʑ[Cu.n5xV*p\5)p ;]w,yexs@!}(@k Zo[#nyֈ|j 4ʿՁ"^L/]s|h6οgaKă <`;\D:H%Vu?ŸXM&wMtjj*k7مGổ_60!1JYTRJ*1KwTjb-M/oL2B$j_q WvEwcxyKmڋY^niݡ ZRㆇcsUʋ@E:M[#ߵ^[+6*>R{'=tACKa,`= %p1|N ɔF>ؙIZI72M2??}t&n} ;Qy6;W]cܲkl"I;|U`5;\*M֠4WZVMZHNqZ1& lS: ٱ- V0=c=ђ0~I9DS.O&AX{أk[u,N+R\2kd)F`JߟI/~ Y-3-aں Zl:ZRzVb<pkVdYo6,svy63\xJt w!uc]\泏fy1J2dl90/Oiʶ.`2.Cʝ XaVکG~^. |^ب68a3C*,_ij4_oEl9:5&tg9\X|5,UTRJz뭽f^IRꎂ ( ԛ>2$˽Y5nć1vC mq~% wI,P3hgHi&Jk=I"L~ G#\~ 5>q= g&M/{vff wo~ S߬zubɔn<æ&Yc$vßA?}Jo깡>M4dKx>#;[< 3`Am]y{˳zro,Pq?hͭC"@7* a 07YoX{KC:xEJ(/#7Z]į\_ߋm 5 j-,,\103;P.o]ιiPV]"ԌN1\_*fRJ*UFFVԩשZK na;3Q+B2S hTy=1PzGwTo-ZicjrEz߂v$y#IIZg)~&q%GKzv\Li*!<=/ߙDyMՏ"u %?z x#.so[sj@(s֏L4#7O=-B014ᔂjgRY g)YNݝ,LY >rO#Mp} SbEl5V߀Lv늷̵R6槔jEǏ__{ J䢏hxuQo|ueرXl:ϺR{=~J*Uj㕄~)hҞI5 w" 0w*yEt/=S"n _n٤_zo>GsK&oqa >47n:%.q7hnŸ1/d2ߒf&n"XbV/#IM8*3*Ȝ˽JǏ'per>3[x^po:&aLNG]*Yτ[彀hiiRM`/T,X+XT1c?QxG\<8DM Ξ x"!- =#FS WH93"*ЃEN!3g#uʒs>y!ngD-֜g@xa(+KBKNnGLk&0|ZW^qʼ`iɼLX#i6djyP`W}Ɠ] +pa1N%տI6n;S۶Z 7|!ݲ. oz{z6HT͵_l%'1eu}8RROmG-Ĩ; 16q*UTRJZrOvHX>dk^' (LN> > Q&Dm[bu;C}j6s}yxF]\C0S5˒Y襺) 呩:?W}7Moɞ Mk'7|KMuQP^4g, PSY;/Ty}U$ZæIN d" V ͇pyy8&Wy@60>l`m-=KDAR+材c,I9%CvI404ũE0F|)RO o[B |0P)E۰σ@_qӀ4z…j~;1wR\ .!A11۶EvA% f/U =BO4|"fNeO;*ԣ_r R >lF_Kߗˆ/";VNϐ9|ďRnH1AIowDv]xufo36 K?ldo}Z4wa羊61#e3b\{vÝc`:W O̤e^@GŴpn6?v/_8;=q2˰ɢE71X]j44 ,g8?^x|/5̉RJ*U,DA0)`/f‚?)×Mh);uþ[NAK=:s]@M{֭u?D1 8FttX tU6) -~Gw@)>}"N~qb@K "XG.%j|8&LH7Jt>|c|b%ܓ)?Gq;4$@*0m[}!}~v{VUӃjsi\p'mk*"> ,+$&+1a󚕓г4{7T <*K .NL$/H cu 5.oaWE킌5>p4(l"LRy=$N)dYEs*f(5fQfp!r,6zY@Zqwq:ꨆ3g-Zx?^z%̝;w}pB: f‹/oa\;8|O?'|o=s.r-xps1Ǿ^C=;wqGôs]px衇pB|,UTRևߦ}Du. 5EoҬR`0Q_^ \[PmsQ~f^ fY%4OJ`8N7 j@&Y w2x@% X8_3Y}k73INfa&5` |Pb$^[)[/.W!;#k뫀5555 @u$OU`"1w ΛdԕNqÀqÁq4$X[deЉ= -N43s^lr_8zyNU ^2?&HXE-9H3wUdE' jVkJXUZBPˉ[)jÆ Í[o_> )/$u9i'z=j!KzS+fCؼ[jB'XxR v,:߯LՉv| H^ l:\aU}M p(ʗAl:pa}'YK^`%ʪ-"fiUu 'ߪI xur[ nNbt0v0 7\`p+%XYVj~ZN +5WI=]68BuGw;$ t1LqJZTK$`St 46i 0MzVki ;4s+6 gf˩8 p{x`Ћ~5 . d`1}2Y vg`}]?+%mkjJob˯s?THaU{:mLԅZV%:_9"34f9'>3}-,!p=})&n: 7뫀'Ny7K.fmVxΒ%K0m4=m4gPϝ4i`?>Fy?===x@5\|aÐ$+ŋV[9kU-ž{^x1rK=u!]qJ>*UTRCR'NXʀ.Ng0 E@E)ljh3/rZh;/ݡ!R/g" xZOl3c1 &7' WmVn|cV1jݮL0CqqC:XiQ[9Q}/KL(v[=2fHcaT@U0 "8vbLWʣ k8`fl40ӥsLz/ *0`yАl;U22R=#/;j6hy^;s=6`]3Jaͯܽ_ޙ}+@<)se= :j?Ǜ,'d(}ƺWSH )/3ϖHPٵ(\wVf#۴/]ӊ"?Ip *_~U^P`.iW݀͢ȏ^t}4 ڔ#bАI#%@jĕ` KaVU a7DҮ&+0bĈ<)9!wT1C,yUZ2`1C+]fΜkgyf9&L?mc-,W\Ҍ3pCJw<s?OaΜ98蠃&`Ŋ9pH'NtϷ|fm =Gނ!3V\֭Ye+>C^qp(L>,ZǎR\ S#̈^5mS[ɟ7Xn,z.6-fwZzX#t}$u٭}+D–Ui8mA ߙ -Qrjgu3Iߓϧx7z4S~(şQ-s&~ӟbٲe&[1nkXd f͚򵧞z*>l(N;4s裏ٳtR,]4۳kcRJ*>[P'ρ|.dY[3G.{DĮe %QgUszoO>!aZU =>gY]=}JAiHaIƀĸ)>1nac6TH=yWl'2kŧO !75\(_cST*|JezU"d?5U#V " č "V/"NS Fb7;*= F Rq+ }O"kp$MAQM>;,:Y9#oP47ıHdᵾ%3oh?\!_=+j YNnxEϷՂZ/z&ۙya{i"y2`R^EVM;͓]GĶt}ĖG]ҩGcʭ ͆ v?~vF 4ׅ5r틸1ПKSwmoAvmqu[oS??;.Ưq'c\wBOqIv)syk^B̄0Yqq8尚 uIl@xׄ2|JZO4mBMj5< =!EpC"N-r@dpG;0?L_3[P@|'Рf+~Yٲ,v(,ĉSA9mv`;6MԇէnNM>[~-ϼևvp !>w}x zf?oI%lr;%@䆎J)z {,| RJ*=Ȭ];f$,]ιisCvצw1/](!X(|1f_zdf猃-eu9v-:R5kAJa:f ઞVE֙Z2Cг>< 6OfE3`t'xp#q۷Rv25? M$!uٟgFBh0q)ݛ';c;ļÛLv$,1^F,9X?/aC?F_鮇̵^8ɹ%l (g93Cvk2)O8x1,8# źn;~3=1dԤll4i3GxeG$xS3^^=WPJ/VXKle&e͞'r@EүПswQء_O:S^m`qu&2dpe'N}xt^cziNkX0g  baڝ]G9CM!~;Nz`&uߓ;P٫/=| ./Af;_2?Z C,UTRގy>x HEp&-V gJ2LxҖkDc=k ;_Pt95f~.>p١3Zy@Cޚk>g`p-sܨ ʅT1DՊ0Lo = k-;:CSG;:ȏ/򰡰Q@ANybKR–ٽ~^\=x)|w`&2Đ:oQT^z7s-~.}f.r[\hYwn|x́O' lIFAY+BHtzR1}CjvlrN?B&,~;۶2aK3+_&ОrX~8E_iBHo)-n #qwҰDqiF:)PGSN{쁁r!򗿼TTRJmPQ"Nc!rC$=PzAv`'| 1sE3}u}Y_i1:޾{<=e>/&\1 u~K&J<ɭL^) > i"LL^p<uK<)6qȝn=d; , Y|bӿTX{pDjr6$"(}̚rI$jw,>Uh1Ky. Ggq1])+d'˵6aH/|(`jg^S 6TKƤБ/ږ~mCNQl E}R-0)Pp9uy,GEa2YMN<4CyODŽ{gDH{;n ,2IhCY}%VR ;$=w۱Rc[sVfͷ}+獘JE[T2,tei>By_֙Pb}dAxiW 0ϥ|hƂsy>BA%H! jGa}U geSTi[ ˽H6n R8N24 k)\4;bG(6$xTםT7 Mz@ C60.J*UTRH[dl"`CbD[.G`a[2pthb77ufH}z D眏xL Xinΰs#5Ih.Yǒ:|Ed1LBMa;d]$7c8Z& &>AЎ^Ͷ@sp 'dL1HS"(^;1ͬ8EB@Y4Edž/HĸU&2 `&Yy@d"+sщ6M/]" \X^Ki}Wf-TY#+MjEB4h*UTRJm$zv4 άI%o&pܑ.!L?3k)ZQ7!֌7dFCQfƅAySB2bVC _9%cTϤK*wś ˔;+> 64;{.z>]rI?XYdJ2G|_8b 2O`AoȲ9pH9԰ e+;0yg/ @\y,3esIWԁYf7}d &b.@['9L>$;ɀM2``k%y診<)] @M#ԧ4댏cPO.2w.3p:[`s^45eީ1؞;ej~Gt֘NҌg|.V`kk<`dh{5d g#,s1/ iUڗ~Aq#"јCMnrW JYTRJ*(å7_ϧ`&W"a& AKQg~Re5ĕft3`@xctdGSAbg\] J}țgC vve0p`;ԑYf:3u&4y'̰Y/=0S>I|;LB dx2;'KN N ś$`1 4YGqQL iT`B# 5 _sj0\MIh2%p.9>N9ɗL8?j HEuqY`U.;8 @ + IDATDiB|5o: Hm+ 5+5[JdRb, f2>hY<J N+L{!vѼ#Iw"l;Im-fF| GzJYTRJ*(@P3EA/EF+,l`3QDS";HSKpU 7uf3)CAo[4a;eE siJBF7AߘH4T'u#Vn!^ fI'Ey8 ~7dR/r7Ƿle1YG.Kˉ3$.:|CcUhDRoJ )6 9芥/\&"(R fJXejYOm<fe<)j",\3 1cI|8q3}ޑ2`8dDE+jBm{.0@3?O}K_Q`3ˀƋ Mė\ܥ+x= ̀ g>`ؽtc>BJH~wiŒ`oݳkCJYTRJ*HfY؉bm'i$ޱ}u"ސ dR`ـĨhyL5smQ Hqn&,`QE{>FNTN0Dzvr '-9~i|o5`I!C-`v xT\FfpM@G tЉR%$k$_56(4ϳ7909$T9xc~K``-aCLQÖlUX7 , >K{;j.j8̤BuIH%+27{dN;Cn hXfNn'xpA܋W$L3^;UVQ]@g#*%-=c3|WGM#u^,â>Loܼܾ \.\ƹ!5 7"eQK+?k8,``pO-/Сg%wMGSK"VY;`&}zvX%g|[a>Pw o"Nh:JYjƙg_~˖-)UTR6*uTihi^agFe}w΁p8&)_53אdᗛa3g[fmk̐7ƻk˭.k.M aC3,u8KGKS3 2~j='@)+ YeDC1ɇZG6K+.V_ !MGT{K&/qa?;9+4X~«{|@ `M ݧىMP _xrL*u=ھk3,(fuc Sϯ+vI*EfFgW k!nkbsѻ|cmQC}~shR-0֙Tmt+p?$v$r>;ywu+ʍVװ0sqCMc?N mDjDAChn@3޹昲8tvX }f1^x5U5g`kcv|>9 RJ*UjӰV`֙`@{?$s|_nGK/'afUbߤ%~B\2>=uC'ƨ DR`- Cub&]XMe5%diUHooȭ8'!L7;H9ל;n+> yPS|˼=Vf t<>~5sƽa&,fz96B硬3{Nj,4Q{zтd]Y.=[2f U~AMC`ҷtFQc[Ӷ:ׇuᶝs#!Pv-BawS\ts%Rvhfd7x3%,\@U€McD`i39@sj]{N냯#A 1umomQ>i&cǎ]+˗/Ǽyp7F}gqo:5_RJ*Ujhz7s0~ά&" w(d @;_4때u  3.Zwrz[pLkTE'(_diaΌcНd.OQK8l 3 $j?03 Ь(iffL~ {#"u+] a=ũj׷ޠ溆Eu`[ +%uA`NcRY&d: ҵh>%5kK(GHcS`If-#글@$T+f*f]hPZYxپ鉺LޱӣthVܘxV0MjJ /Ìwc~r$œoCnɁ>vS-~Ԃ7s+  !M7hZKQGZ;_c\ [1(pHr-yXp1"i-p[fvG8VG: w_}$F- 6rsXQAWf b$@CY}}0b\Ps}]r.z'6~ E<N+l:w;/ 4/pPR%`'D`|:d[&f\\3{q){ޓ̋S.R-w+P훂ep5䯁mo4^ ;6"Bam0l?~jHaw{'bX`9688>SNԩSq9`pp;ׇ JǏǑG믿ޜ3v=c{vi'7;vYpc-Ip1`ɒ%&znlv6m."s,MSaɓqiaŊCʣRJ*UjcQ3ce F~3+f/U;B$W5]JRS]`&Wȓh}fqcLekqsWe"`fGEY.dݝe< 8VoBgWUʝCWUt$NN+)ţ7^!0\hNVج;QYnu.3/؎s~ u\coIr0c\}pvOaF rqͼMfB$V+3g;ojfg zzr󰾾5JZCWG+eA4Xk~E~?W3뵷N~)%gNsrd&#= EX?x^+,F¶l:ܹ}1s<\p{5fޙu |ңp{:-p'8s{Ɏ6#m܀Cj&tKa´qeI9f$FS!|Yg .d|' 3g-ZxRJ|sܹsկ~^{ƙg]v]]]x .wq7/Z Cww7~ϟwqF .=.\QFK_zzz߫RJ*UѝN`=)b _xʬK;{%F[Tо_;㳷▙i&؆0E; 13ԜcbDg r FN wTaH BurIL+43v6k)Ps䋪"<:"DH;P@"$:zF ,<,Cff wg5_goix|(&ܿ>oGj(-7tDPB3ŠaS; 8x+T#:9j$:7ZtuuW_ҥK[ /4Ǯ*\0a?y饗[ >,&L?_җ0f̘0w\3C^; _W0}t+^)Sc^z)js_ 4K*UT)e-G)U03oj@'0i_9܎5epВf@-c,Ϭ5lրI fE~.A~m*:e?jy*,4wr8UP%R@jfLc9-E#g"\U򭆹C5:k ,Aen'˴235 S27RyDX}Y'h78`omMfnhY3k^>M܀4b ʹ蝬Uf$5"Eǚ)D)'®=M]OU?d _K4A>lS2{iڱ$}H>Jw9:?wfzA Wߙ|9LUȏ+ooy%܀Дicj3'bt `\A;4 {81|5  Xd MfΝ6m3{AOOxqEӟ4~_I&5Y%4DCTmADA9X<;0uY2jR8I& B/V`I !<\#oC>ZgpjN֙fFyFR&2S=27FE=sw]X-+l,\EPsuAwͤp&em=CL#tշb6T/>_ŖMUg"C>^ݞ{5PQҵ>9};U J岇>rHF1xyi*Ԉ];#D [o%Ӟi6]xM`b<8yS4CǨMn)3f/?{'Eq{f\D5jH4G%h59z%bXtg FDMThDCE"Waawg~TUwUu\vgwg?w/œO> /o&X~=FLrRB0j(,X@㠩 ݺulݺ2e ͛;zBcc# L8p ֭[#GF8p x 4}[>{kX;'@f:tyBF<<>- 0awAhnx0 5rZ 3 f{3͢O6[K7#e Uϻ\i0- dCMQA s}'~ڱsu/łܗEßg}=2Sqhʁ-ҴT<{>"8Pd:qW  s})4,oš+VB`TT)]9/f\VP;l1GؼPnwI l %u8>#DO!'ayC1Nq txqs_p͗mloqs)ڛŘ60

r93 MG (>*>m4\veg}@)o&&MٳgEvf͚N;->qDL6 Gy$sO|/;,… 1c l߾g.{Q[[_W^y2~3,\0ȡ)ΧN.\s /୷u]7e賨~=Z=xeG YD'!ܐh ȹhR4ׇ4wP T\ 2ܙ3@reNM#Rj";(x @&vV囿L@} vXV{"c(nC?sƜ4 "5)^HyF*{ -PxV܇Ed.Gh~*($ +~Q0 Jȧl=Cᠨ;=ϑyZ%vYm`313F"?a? f҆Eh%CM"/mT<l{DnpX?/W{I˗O17"M^·_mXJ'򍐓E~gDDڞe(9ť릒#a#Ui#gr P hr4s#I"OR`ǧ;O[t&L9眃kbȑ[i_~9.RzSO=s9g.2vmO~;wb8cqx㍘1cZ 43g

aTQ$Nq~|gN5ឫr8vNxAvg ;w `qPzЏSy@o9qE']SUa)[FA~ "3S.$@&37\gO3±Htե0 @f1wf)S#٢P|ާ03ṡAͤ$4շ'7i>{I"sWAxyB3S<.RMN|;S)ȝkB&Ҷ|5n~3TXoz(a 5E$U dxk0sP\rI&aҤIk… pcǎرc hxgqSNKҸ &`„ ʸ??NRqWGeY.b\|idddddYP7Ůvyy~`7/y K͸^@JGnȥ~=VGEFp9̹-.p\hQ4[vɥڪJ2ufvf̋v.mǖ^DƒUHa0F,}1I(`A@HS䑳Du.M$ ȰsJlVmCvb%a1?e4H>w|s4x>p fR6 B(,Dy9lfʹB-JET=l>m}M/Ν |i2.oűf)PC̈@ >a1Ps?\ OgMco'Rz rضؾ'>Auf~T+!ћ9̼3{h>߾+ݳ\ݙsU)D_?O)(f-YJʏ۳mURM########6 1=eKC~@/|Bp‡H%Du\m?7;\kg5y" ;qntFQ03AőٽBUK \pGvؤ_qcN1IoD jm34HۀmSK=wd*>MO˦RWDL:4-ՠB*²KӣT,\ܩ%Q bD>\;,ƒrV(7_. <3Waf17f[`fjh7Y|#mKSF / 3!4ˁ:!Y.LX UvB4kK:Uw:11}x*RD4+̻/pD 4x+׎xwE]m8Mon"\=gdh 2UhU\‘)>}1h(BE w$7 zL? i*pS<5~$Ol |0'H h "gWR!)f{KL#PvFէ0SGɞ$ 8Dx;"XYS+? ؏Ѷ‡c¯K/ߌuB?l!a+Mgb0PD.vm2g@>qy9l*P3s[M(;Bm7]h[Xyf T:۝Y*f!1u#T$zIa/dO2@o ƉnDrmBME WU_GPiR~[uۺ 7#L5 `igNQjVv Tt 422222222\⦘rxa‘)߄$ă5_p)8caG a;S&^\D$w}EHv)Oܙ5PGcR?p`^qKb_4? ;k8aHM'T)*\h=Lf95w]9]96E2{h/5@\7OvilUe)8NoeWwumZp*<]pIB 5>9r͕^` 9-=Jt*99BX7ugىXmܔb@SgHkE'$YE0fVQbeQy~ XAA/ '=õa\~A"(.)\'Q[0E[QDO!7ENyI6}S$C;K?{{!4D0n<$BSՙnIAfʒZBA`a@~Ë Ll>4Uv9P[!f%V۪M<xq >/ʢIpx.b&Nsf2to諫'@4<5Lŀ?(OgtH BP ^ P3_@r|h;~>o!м962x/Tĵ!jN &ouһ!0;DUe~hPS|lu8|;n9cXJ $~ S? Ley? \45tDêj5]0G1hy '8&A+RH;"D!pZ\BΣ~}B9k?;1;XLzZBlk.<|I=ieД:k3A#Nwsٙ1~du* a~dž<& t"IO#u\BRmpsO6!J2'<)s {O?^\T'y^CM EG٬\ݚ)[*BTGӎ~YJuzKUJO)rmOSafk%&P<=H]]2+Q (!*٩LdVH{qp,{IIV$/'_z!";4 OZ `8.yAf:~r3WޓBZ*(F c@A `ĕ!|p5s. _3P\O6Ia9+ Q~\)WgZUE)<0DDn~G^}j޵k)7.aznA"$pq/ܞ{3{ "0HӽάfQSBwjDJK9G_̡<|ysLs]:]XYxc!6!y 2`˘פxA2ۯǦ9U%F*PqQGt[s{a"MzxY1&0_jJ}ek@f\@SYdj}JF03#374"wf\yG:3ʸ3u#%Y+"8)麤1y@ztzldw;!88i G]^(Y3߬O_Rʟ!?mklo+ȱBzNr9?h{:~+4S\m*00M#######Nܼ [8 DNJap+02ek>R#D "Rtͺq!Ql3ݏcn䁨3lwb*RfELd9pS̖}y3WiSơ*KrB`#ڴUF|[y*k3u?yߧhJcϫ2'w&3G%9(-ˢa/T \<-=.J<>&Qsӡ) bWK;c9< .l*J%Fz>sgKGy >(8tDm62yO ۱8Ǧ>|O4)Ahv~˰l2Jgw*UWW;ldddddYT_EneGQaJFcz0莩@% ;ah /orȤ4r ?k̮p_2Myf2+Wd so[b\\640ZXujMt8 'xL,' 2i^^H2' EN*NoZJtK<ǨNI33  kCyR!U̘EOs*2ӠǙ:Rm\\ }7e n0HP3Qse0_9&sÜ+Ό~̵~c6lEefK/ǥ^tN<[mmhddddd$D!)n΃vb݃9.O v=W ‘;O;G 7,rNojPf[x،̥Y9@FOc)o;DroQŷ9ԼO2'^d>(0t5~CMJ[Vǹ3aE)j7)_wwfP7h{)H+lT diﱵP3sifaf1wfRyYf*˝ 05Pt3Ԍq/cNLҤL JaqaesC~@I61j03Q˛gMe}YtJ5Wj؎u_]mkr B/I<WοGo< !%gy۟3g.Blٲ/---m}l޼m۶yu)o[ooc1bc=<@})Ǻ:Æ رcf:&b=FFFFFFՠ/Sne7]2r-{p=9^ [E&gA}DA{>a ʳv']ف]E@fd^ lBM+53_8 W"̊?AV!0<\4*U'ן]^IZTyrv%~Svw.%Cx cاyu L90Sj8u)\q9Ҕhf6K/5۫93&^ f@fۏR@+`&OH'׉q5ND?kDȔ)rG)db80(C/ sf~pmJqWҘa%'1]wQ~+tgʐ&*t3 kP3X—?zboҨToƍѯ_?,_\E&O7n\EKw9G?͛\^(-xöm۰m6\t_|qETLbߓbĉ7nV\ 6?9-[V~mݺon&455裏Ɔ *~#####+÷ ou>evFĄy/>r7C =pTTNzy-+9`n'Ň_1E,2a6jVҥYdlhlWurK3xPDũK3o-L=(uh] N !M̭9`k.|xr !yրg^in:Pm2x2̴pX=r^F63gy-%43ʬt,_Q* Z&AB P(&]OA͸vϣ8Ӽ! PӥKBM) M fVOY셬 \h'>UK\z v]i"=؞pjMԮ&ɿ B۬q{gq`>383p=Tf]UVKV ,O?kiiE]aÆaذa9ssQ~=z4 cW_U+ŁYl ,̙31uT5558ðdɒ`f1j( 4ӦMCcccwѣGc8s0`ںupYgaСkpcӦM2FFFFFF*Vkihe7M;{wzy l f4<KR0|G3}9þwdVsFDm,7f[$;~= +A|B@e PS⠦hk:.li)$*xx#y6Gqf{9¿'>s@< ر)ŝsi~mB@ՠ8gia&YuAI!鱍F FS IDAT;x}S2q]j] 2:3LT% nc,jS~H03xmtǯō9j !%0G7TZ& pi:ɥT?Eծf{L<6 ڌ;ÊyWhϛ7}VZ+W>P?8֭['b̙qaRm>s4iRu\Xz5}YۨECnn'O3<ӧO;#z FB}}}SBUZ^H@ʊ6ާ.UU|\M[(7Slؕc0-wP؟ \8_}>ܘ]F>I\ʼܭ)CMlfVk~Qw@4=ÀsD.|?5\Rڰ<.Q"-'b A8%`qR ,?~(#7%QVӿؿg1)LZ6F)U7]".JZ ݘ}>053fRmȧjPPRq3GCJ^` \*Mӂܙ"] 9?IQYM@L0}a$G`/Zh޺_X͛1g{/j  p& ݻcƌxWGmnݺ{gu,]\s ={?p}8p'_|E;ݻ7 ,_:ZQk o!LYjڀcaHrLB@UksSjEˑsa}}.zw9>¼*cP3XniYz>"Qi/˰m7_)T>S9X)`< ?5#-; 2ASYﵨ MK'$QΟnLāwAwMJ)#}JkgeH'̪,2;WALo>fkJr5*LwM(6IPHuB? -'L*7.2Ga(:pxaZ7J)p4\fwq`7yI+m)~lv;.C[TS ,nJ( :A6P}!U-5la75 Oc3pr;bɜ"4CŮ]p 76mڄÇ߇^0LZ֭[jm[l)>cƌ moSxƍѷo+0~x 2uuuf#####* lDܚ BJ5:.f548׾)ŎܳEWpr.IS?UXÚ6(=(3.1  =x*&LKCN9 3=ߩ4ob W)_;zdn<|,.<%B7l؀%K`cu֡_~ۏ8رcq\f֭[[ݧ;CM2w^ulݺ6l(Z|5VryjHʓ`X;3+Sk&W\YK, nK Ǥ)bsNqBooN>ÎJ 1#ʄub=k/0+p7hA#0S.pi~{Hy*yd-H\;ej2s 4_)&+ #ncaC`6MtajŚP)`3{²+ 5E#K ܏JDcb0sL0C ,׆ ~uaOД(> 6P~Y+hIS4Igt>@zQ|dC8q>d;֬yR0&MٳgcӦMشif͚N;Uӧ~6os֬Yxbl۶ ---XjL:]t֮] ufL6655W^ٳtR̙3'܌Z`ABZl#####JJ̴-K93D٣V).MAֺ5#ԩb>+b4~& jRPS PDHS}3倭u,fܻyG)U#0} .W﮿19jw_Q l!s<:ڻbǪ%};pg3 Vg7v;#0S4]τe#ʵ.I]VvO &:C 8pW& B>qMv5Ң >{<.7~j3QwO=ٌ0cҬ&U>@RE8/cmx7l=xNۻ C= ܹK?c s1E|O=9 6 ]vR(h̙8#p)`8s1a„YWW}bԨQ PSS{Æ Yp!1d|[׾Zl#####Jj jZaL[ oؿ9$^*7tXX ,̠$@?{Ϧ2GƠϡ&9%yj4@v{ y.I= rx`OB Tj"zX:6}@'ۿ^-9@~<| 6@['?`ߝDV}H~&=V6$s9W[{ʹ4;ffEw,JU'?f1[ 1#P3i|oPw,siԗk ~ȸe\ |?vi*Z= pzu3oQ,\GJ7bBLC),y +nݺk$WBZW^9<,^~U_9ؼr|>zqIH<$þrl_KS׏2Zwfkaf,k6t P3OCzޑ@)UE`&yutn!i CS95)o~P9πf3o-.NH;&.ۜsHJBr}qPk;kS`B0k| `lF'rw|iZ"ɉ~Tܙ\e,2^_gL 1f̌R7**̄b@$I⠦OIFG4ǻf8&zLbzkyЕyN-GDd&DqIQ9yanaYH.mz(gLC_O[#4+{_0222222R85p^Ԉjڍ8!&ިUMq*Z43 !5Ey) ncLCI03N> AzhTq9Iîͫ1pmLCب@.yfţlvz.2 @LhDG#}`rlB5SSsm:xOL}Y!a;3NMB1m-y,c#!ivqZ7U"I;a%k$ 8s;XaBE^UMڵu hhY)9 ]3P)Rj>eLs)Z򀗧p<h=8Cr7<0P2qrHAiF\X+AZ}>edK9855eZZ̜ϓV@ָͮ3eY)wfWQRwK 7"pP3 f:e1E%Z5hN]DrYPSve?Qc[Qghx_H>n'R& Q X7u݀&_#})|ļ:hPjFFFFFFFF)ofJE'n d;S]řAT% ,> bÜGݙ.{ңȹ?}6N;-=fNr<+4X2Йɱ45c)^x)N! | B@n1D`ɑ||QvΚ*3'CN WjHzcη H!O\zR#;Zpi6s)+Oјؕhl"& Qlr!woq|ܞixjMX@n k~|)[2| jwAFK )ܛzR9d]DE |BL/}DvifΫ<`b .[*D".I(Ȅ4BT̸\S/0`S4q~Xz'q}iE?0_(mI8rnvӣ.͠ģѓ.QxRKwiiddddddddp RC}FF\$fh'=%bI5rn1ɿ\`ïSXTce v蝗ܙN6d<A^Jqg/C*K]N @$ `.<ǃOiPO~ *KUue,@*'4sm G&/M?"BNb\qå)A5q/w0)Q)BB4 E /3%gf\6} ЯwېsbAuу/j!dQ-exMʹ?؜u!f[fG 7 `@ RNPSd 2P1^\GcG ʠȡcLbN39*BBkVgd^&,ңmv{h˅09+^PM8eK TBO h1+f~ݝgиvWUWS6tvعYm߿E0`M pƅl'L=;.d(Ғ%m39+BI  çEwaEt!qZ+p7/0{%^=DAɟ_}w~zTQ#SOo^ru{@ri1eYf~XragEƆ`&93)epם2xq2BI0S EWUcA([ۉHx4dFDÏ :C C٩ݙI@!?V2ߙ9AGefСtv Cfڈ4K]f^WRSEPS84aO$`[nVt.'mlv|]hMCC|B[afd}U532ۻgEg}z^Nu&L=)@"ݛqP8ۆM̧Ohz7@<(TFi.M"7 IDAT1N|$4^Lx^kNp|TF+~kv4S4(+0G|M'n ? * ]=Vw|Fե^K/t/xP[[](kddddT5FlXm3pC}ٝ4΍<_D4vfIwHߟxC.Nڗ5eSȳCwR\,s^&(0S)U'f /4rWgLMO!Ps@)0mv*px\"?fp0γ\ L]y?̝ǖܙB¾̉ A9\85wNy Ȝg,l@HqPܙ2 acB7pPJxaf-ZV(0 RG99p]jB\8xN,r4p6"/u\ #YC' p6TGxec;z1PS}3ϰ V%gy۟3g.Blٲ/--3_ۘi_uJ=iI-ӲqX@.$KpSiq3fgUW %M *ܘ8:1gpa\FseƄ7E%+O+ָ;v-P;ujPΗ6/o[C#xH<}OXjŶ۟vB3+n$ p, e 'Sގ9'C':*}XODfQCHB;7AӮJy/}E̓ns :0=H8z=R b~bc#eyaGI]v7n/_~a<}ܸq.=` 6of0skzKήw}'NĸqrJlذ?ϱlٲk۶mغu+x tMhjjG 6TdFFFFFFi wp;Y"&c,`~]|:бrT j?3 jȀU85&*\)q)X"[ zz29dpf*^4[^;5WNN)y3:qb7PsyE4\?d!n8 ]`:`2i]2w(vP󝼪< _dC\ 25`=lF~Ck(XN vvmF{/8z3?z06 T <,692;,TuҢ0R/ș44,Jj$~:40KW^xE~z_(Ev&ڑ pt69MH;irjE5n8s=83"gygq瞊L2;WVcѢj ~L ,̙31uT5558ðdɒ`f1j( 4ӦMCccymݻwѣ`s9??A[]]nftA۷o0n۶m9r$o߮lk۶mo}v[gu ~:6mC|y@KYw~?8#0`=wqGY(hҍkfȨjYJy%f挆ݟ>AhҤs!+D\CM}w ;t-TqR,ǁS6?nqIe}`f5%Vَ7z%oqZ"Cy\SD^ȼ(xS免FŶO񼝰 2k` \.҉婤`#8P6yA8HB̧O v"}ͶYh8ٞ0B6by^{9L4<_=V^g}o6jkkІpɓ'+Z >,n'ŋ+.Y~:cy晘>}:y[5jY-߶m[$̼uC̞=>}Q\*ݝiUّ>|dd+634`S* E }ZqG)xpeHP&^ѧeDZowb0ց:(IJ=_ruXwW4-9} `fUx'/@]^atNmnkOۧ(k^FA9...J-l8wd̥/]NM7X:̴!,&}{~6XN:-Ά-:uU4ɧ" & ]I3m(ߩ2F#0SKO+_PEGey,_d9a' w1~ ]uZD9?m loDy7&O@cKx'V|NSt` )74-246gWNYj^pկ~UQ 0<ˠV-FO8mݺ{gy.]444裏u]ת>8Pׯ_d]ӧOǤIpqo<_ 歭W\ѣGb.Zlܸ[lСC_dddddd!JOAXơYJbPS̀:?Ǿ8T@5sf7tBg&/;9YN4Ȭ)$WMX6A1wS >_JSs+˔Ehw;'cgjDZ&OzdDvv!F<?}(RX$!4 # HKiNb_|yonl8)X _JaжOw2K  ?}$ -)~i=:aܿ=ʹ._Lq5nC H)I7|y\l}zԄ,u@K5wy,:9%MJ=RҋR` KɀnDf#;gXjfي̛o=jg!.vŒ9/ŝB}Ŗ-[ Ga̘1AhmF7n BK]^{QF>x1f :b ?C A]]\tK]w~qxqGCc=V222222RͲPJUQ;)I7;fsiU+GGBNFdaMS?Q Io_݁^5,ļg =Bg&o6:P)Ofh_ew&0sšPs=PH [OĬƝ)Xv ĶжٰmZZ:GX'|)NЂ>ܚD 0W*sYe>痐ه]^1XȴEZb9<=<2e+3d^2 3+@"IqMGy[byeTYF| ׋E ˋ72JJ%ع9ۛ<+0۬<q$ۻyQ܍CeL!s&-n#<.4r8Ł]X#bAmms7nѣGéO>َ_LǎjOzNUcǎߏ 8O< T;Pn[?}t,X&M¢Eg)S0o<wqի1lذX=Pu]'ą^7|Uhdddd9wQ#m\{FգrC_24|nݚ/AoW$LZ<`?l4{{}[_&!MRAwdp4eg<7Qv!Ot Ծrq HQx,Zb 2plR=NNrjI,+$cNM['> \:D!S`2'w\8~QABw ٰpK/+ҷ߯ނ= fۑyYT%ačWV4   #Gh9UkLzq':55Y_>}n_v,װ{1W{QhIysUo̅`PiʢeqF?g+2RUBNjPL ]mr$\!L8|kּ?GLS|- fYp 7`ضmZZZj*|{ :u*."]b͚56mZYijj+ٳgcҥ3gNbΝгgO%1sLe>}xb6m|MyPJKijddddd( ]iY1hl/uK iE F3ͼmG Ecb{3Po?`&֎*Y؜:;;ydS6F4e^J7Zejwt}D|&,[yd>~1dU7j(<={6lF{{;o?|;ߑL:?яpI'a͚5c=pW@AϞ=n裏ƢE0hР/t%`ڴi?~hy0sLs9:t(.r<#/&Lm vO8'O|=wuWEȨ;oV"vnu\;`͕ >8xH_Wӥ'PS2YPq՝)ATpP.-B%$Hg|\P;rEJ1ezg'>jaSR:3<\P^>@)'^ ; Qvd *l 9 =2tH[ޣ`%xa%)^-; C͓es}?5b^Xu-%N95M$z.U-{W"ի/ҽ i2-=XzEtcvꄵ7DVQA^Vh=L_pS4<j*N2~,TG:_@Nj׃=R8 P JHȩZ{W L9bD4ֺ D͞} n~ <$|!ttlѣGL[iӦaڴi 0n*?n9眃s9`'bĉi]t>}:O^UߥSN)YAȨ~W ;n-4BoPG@;x8#f5w_X̫9)74(@C uE3SL  2&1mאHHﻰ|fU& © Bk|7ǜJk"ƴO/7@xXa`+5/03>dD0/ "^u@GoDXȤDb10̇bUD"+QY%{>H+GVXjH|XͿO"N)1 rIsJfF[싂j sAA}EɤS%Q,(~oJ!A}$'4w;vzAo1222222jBv@/KӲXtHFFjw2#a7n۝ P(֬Vg2|g0n9/R}(xzu۩P*ߧTd@SDY-P\[lYu|?|K#o|Mz.mz>V* /ׁSl0j$/s!P7bJ`S;;%<1AާQ zEg${fp.T jVWcOIr" X]<\X˓ 1'x$^%>d%7 u &݄3z4 VVD*k%b.QjqX 8`gf 7 6zNT.H:u?,MW5#k&MBSʯ'>N$/G0!̔Le? Wf6A%jwd62222222jqvޒ yXPcWwTpFBz:35!B2&Q6BpQ! @{G0CST`ѥ!iq#9l唂 ~.qJ[|=:Tvߟ?@K߁Hd,]VZ 3 .ط)rWz>r]ÍX|$6 鹲 $1儃qaNQ$,X`^ }G2\mJo{n'2JRMG$! >z5 Spy̯faqBߜwO%jݕZ Io~/Gط4r=*0m4SV+M#######f*tH$д, +$P'ojgSj;S读!wWODCu uQ94=Oaׇ)0e2yB-W } r[?g`~}v-a%%VDbS ^2`RzԢ,?nT)&h<+C? XJAsr_hiIR plZs؊w/e7b;ʞIn@aXք=yܙO@ +G' *zUZW(|hTߓкçsЎ vA4Ia =\"e);RVrDdQ^/] IDATGpL'X.MSwoky3%v)@~,Z`!HfzA `SO)KGg'r xGXȷ$-By!\ d~FKqxF2'F7dk/ 3 wRܕwM|TYq!7'g2>)=KkE(V"_ܤnV@9_-=h²_|9@ݼmJ m3п}'_F'ҺhE.2H)(7խ@OztZx9sh2<@,%A1!g;4v{kHҬL9Ĥ45a; e[WQ; 7T`E * +/aeB0)X@yx-G!@ 3~ܝۤLؑfe,oAH?(HsXnwL7R! wuidddddddEKozG=0ju@` BV+`ih>[ ' Lhg2˹i%XPzX o!/pIyع($@,>y*@77RG\79昫WoR1LD'by^H+« ˳샆U!MQ5\t=bܙ'`" &wiR/-=թl^>@iS&rܥ _^sY>wQ C@rjW> !/_@Lz)&t+#Q0SIN.δ -:lU(B+4nK>@D{mteQ˧=B&obj]Ab>Jj 8@eЬU> ri{TrR1DLtW/<{9?rcyԢ@>ϥ  |SY\'q>|7 S?J:pc't+P W&G{^Ns*֦3 ol|X"8}9i2&-qI_.^mBH)Ճ| J ;6"Jrp| tAeGUR8J 2"thE{tQE&Q M#i M3I%#&)|ܧ@gˋc&ag1UC+j: _CKe#######&HELj,K߀? 3aFIKh֢F/Q=\r.+K?}^I H&Rl&-MP4EpE;/> g /| P0f;H3 S?gq<}C`nC/AU$!J`B0iۢko\Aξ,CVeat$ρALO9X+:ũ A(w∣P>i6ڀÕ6ps4CSoW, h;RQee`Li>'K rZDO[9$3S ThY48m]t=dQYY^uh}H)e!ay3&>6ZeQg)tAe9, $m;EB>NΎΔ͠: {HY@"5 4 @Iz >eӔ-6$<i}1f f @nY9^ =n^o̤-ۖ?`U8Je(8~0}y Wa=Z1;3 !X1hBS,l;6*0C:4*{]^SBYIXIyy/G)U8M<4 f܅LX${ B @< ̐J貜Gsb٧Z^JMB)\V8n9(:nрf!.wh M>1)?΂;i iAVYvu#######UDM zTQ!Ȩ_wJ#U)sVR̴b-b DE?D韰 Kaњbm!ؓ' ̈́( wsulm}+[ af%"<&+ \g,=/!_EL ~pp۷:L3":Dثυ˶w S>ۈk00&PRPOx|̛s&|?|`dv8k07 ,o0=D0= C#Bҡ:&*Ke6:Gh<zmNC.Za){R&jUj,|%G1ҧTq`*><_4*]))&v'i;#cOXC5`lڴ`ȈWx8\Y.R ʪ9x~יF; 8nrQ9S3sd`iPdnc.ȯ^*,*Bb(L!IdRO)'Z&uDdq>2Xu`U^`fLJ5H|m!rTȝ)y^n?y:Qhe\S)7/^V}Cxm8W@OA ++Ղ{0o$ FJ=y@Kap&4f3`&H BbPrBG1/C"NM pd!b~ 5q ` ).QŸ] jyaKB'GNekL׻ ܁uU᪫cÆp1''2@Ȩ}fbs w-$K3ze厥yk+uը_syu15D)"H%[2XHг09qF* 40A $9f}n(,Eդ76?5D^~. /^spa&=~8xc{. }/)L}8UC˔cL~LI(J Yx1B#lPW_˲+݂;nXtO +yV.5pUf7 fZus(Rh〦ZNPU@&13a!&19JWVN!3m~6.ivJtä$ngJX ~;h\P@"ʫں l.\ &= V_{7{l2˗/ٳ/b۶mw}qWओNz; ^1.׷o_|+_7ߌw޹V3X?!{ȑ#qG.+{622222*&KLXb FFU ^6ʝ)`fWwgƁr.VL D*94!n`DM Px> &HJoOVFv{Oڿ~zD i^seL/ǜ[_+/V* <+#Bགe{X 0O߮}oX1R=JhDa?f8s MlgT[[ϟO? . pB~?~]a& |c)KqbɒWXHF͝;SN矏t>9yp{' .[nj[, 1#FԩSc ܹsϗ0`~a̘13dy [ȨT|3"7p_ 9P^Gsfi>vZ T %ɚ=@auO}lm:mgmqA578}Gg?|/l`/Lċ7~>ͬm߂~ml:wv\'6!*>hOo>: c&g&9&a]g(&YhQCS ='&'-&y].9N݋أٺ̼N13oV!rc&`&A2|.2> x-c3 $yK$one3ui\w].M*]`9*oE~Ϛfۑ߾ޭq{>&`;6;SRh%˓ =dPC#BC(`Y dS{/@6>.a $aj(j(YJF ;ؔa| +GC/%[?V!Lٶ]rh6Ij:Sw -q W>gk_vf 86l(:իq/| UJ[#G#G,KgܸqضmnѣG٠W'|W^y{,`ذa%c5XiO)q -cTn(i`5f^807"efD.upBh%u9\aHHl6,oow $ܤgem;0u&zqCk߶L^. }+[o nV,nf=ԕ`P%JΌse0S४ (>uH0t|vՉ8I=cf`w:>R\`'Ad@ Fõ& [n+̼q_ڍp-~ų^,]!uQxGγ.7 ٸqcU=h |r|Ŋ:V\hF?y;0e,[ 7nʕ+_v####Gӌ+P.$ EV7\Pնr)kn:[3fڴU˗/}: QGGZ[[҂?P,wev|Q_L XL& 5~%<*3 fR50^YUWfN &R\XJ#0 j.:']$~^^no>#ףݑ33g2Ɏ<.{8N+,Nw/|s>8;l[Lbww7Y Z`fII"B+ !sjV/SVPe`/vd q̨J4|GHX A/pj6EAhvS]w8/O6aٲ#ӏ!mQFs=cbĈCN; 't  /'Nr1n87CŬY/&L(r>` 8{'.2`ѢE1bg޼y9s&N8rHɾK-cdddd" wHǁ'\5[邾X;DW2ee`KG94 f ŁL%/o@MKqs[HHjZ Ґ"U+Q0LF:5 yYcWȬTd>Zhk3Qmw͂d)x`!5^,8"?QTTY7Sul*AAhY8ٙ 7W!R]4T }[w\awI1M5{%1p`o<̓xɇѱ>G?}˲0m4L6-}XNTpuZkk+͛yC IDAT+J,_j[OӧW~'@݋.hߥ12222@S4А;S$' )5.r^x̔Ĭlʅ*ȴG/JLxn9&AD+>;b(6mȴOo>aƬe_}g~. gU`տ@JO_6'6W7|~ip)-VjGR*ԡgEJ)(%f++M!愜;]nXdz::1C SГ4vԡez'ؾ}kgoQZL.{QPO `/UR̛FMRwR1YS+ ފG~8'|J jN<6Q{6T65< z^NBjJܙV7 A0(A2u TOY_S  A @Q9;aep”:u[(ڔ|Q)~s"4:AL<59"yU4s1 6oON)BQR䨜yWxUMafSsw Mݡ&"Jp |JBS&JNa c00}^hQ Siy4eTu zJaMش8 ՕYMQ]|r^nu`-MP\")frx\aE;3rhw|*N;n xSh5kqf3给 -c~i&ԬjAN{2"40Q*\ԼƵ:af؅IKmިaxv 6~\pi/w[|,pe" 7Pc\؆x'K22222222.{ ]&E>שk,JGŀdZH8ZiՂj|Za?7Wg09ta`U'T2ۙahVŕ)@+ /ց2LwLw JZWf j>gPLF4ǩ˅*V EhrT' 8*h<:K!!\ȡɧMJSBKBEY! AΒf׶;۶a۶O'}Jr>g:42Ѫw%u'jdddddddÈL5.yWTus;)6&oZ4fL{pPoZ- ra`M dzUS-^ pPS)̬E͂qjL!s6íj;3$w6aBAطC$EWj|XͩIׂiᴴ  ``MhI]ڹLJcF p/vm]?NQswqhuk84t1_JQnRMQnJ >UR-7 TULo] 3;[t0v5J|NMqk UҬT ˙"00V ݛ@gÉR瀸~Ak(ҡp֘SS/$DWWiZPӾ;&]v(/Ty.~p6#s ܯB* {*9I4e_K d3*wEQ'(&ܘ9WLcY;fs_w.f,cʁB#ܙ3+ud MqP!oPC!6.ͧ87-e/f_;H,wz;_o0BZܩV5bFRwfe)ʲVQ#>QvV}5aHƌXFMH1uٮj͔ܥc#>*j/*GʔY_"i͐wQ'(L{33.Б:842ҵߜGrU fnj$9x}W1r3Q/AJ,`izU^[4qЅ[$~{ZJRz@j՛ǭ 8Q@-|]}+M_Pl4TUʙ)f=gTﲖ0󡎃ՕFxs!;ʞEK|P8 O 4)Ȩ BM;)Mppm]"_~9Z#  W%MCY`1widdddddddFt(栀G9XyK%p4L 1L{Ue7veI+xo8 riSlIpܭi<Nk^?S1]K}}3lqlqf0S}K 4f=পzZ:Pǩjt4U\عF.`*0ջbŁ,J8ҁegO2f$@B%$!*2^q`uiddddddddKCLJ03Sp[s{[ ',SGٕrHq\"g C! <55.g1]`$\ثf(@Z5AoAoiKRafg( xu]f u*$@STXY4x€StM8&˷Y*@?r62 X .qI]=R͔ kӶY=a'׏ۥ)2`Q*]u322294XM19"Y6.pRa*j͔5VF̻3ǁ;S xW+Rнm\_ 3əNBdnBpfni຺Te*0SHrsjF^=}õ(.\;Q5e ruܴ.8j+vY`5c:`ןƟe/_ٳg_Ķm۰+I'T022222w>y•RS 5z̝i;_k6Ku!U3uxYZ8eCMU:Uq!@pkB[N;FVU6 Chd] 3uU4IۮzΞ]ǷNGj ]`8T ,տڟqjL{~o{{>=sض$EvPqRiZN`X͐~hUoֆ O#a… 'o z5Rd3vl.O>{=իx ̛7M######Myo2=Tgvn̬judV"1T,GMpd& nJEaʁ%10{ip:3onUhzgf=Y SQ@j3\燷ХϪhyUFǨ 5C3 W H4%[LZ@2+Ui^SKKٟ@fƹdr Qjkk#e0r?~##cӿǣc-w0qw>ΝSϗ: w}r<ꫯo[)n ---w3gnv^7nij>뮻 +sNX\s ?u]q;0h ފn k֬^{o￿ܾ~o>}.+w<\/~[Ï~#сiӦC>}p饗¶mlڴkJQ:b䡄#n.ݙ<f֥hw֯FL{PjeOǩ;Ɲ k>:uLX5Gu fڔ76WFT:(;UV;j&uêJPTtŎYju)6RRLTR# Uf)g`ӹNRf%6(ᶌGhӧZ㠅&q) qxOZܗvg=m$IBastNCd Pg&agf5Iffw97ETpBLȂ`}>]F زz\hN9唢zj,Y/ƪU0gΜ]d ^xlܸpk/qBU!=dWD);D=Q׵q.G1(K[1*>)NmC԰  LjU]8-WNAT=S5e 6]|uY0&]|hźȑ_:.z/t{q͋>_4tyeofs|s}ÿ65k`/~&mb*ׁM իL~{o<5jwʼn'7|s b9.[ C~+'Nİa*'3f /_.ev1֭>x'?~~]g3f ~ak#o-~ꩧ0rHᅬX.eb0s{ذbUގ|A`nso?(c W<߫ҽYLU83 4U,1{Ӟ.Q+ `7I z$ ZD*nS fT5:ޜ.eE)_uڗZcif6ڭ* `93+=@f8EsCqwЁVrfVάE] D(R?QÆPubE{ߣã̝)i(t89әis`o.[\g&uhTPIMbX4兄4ڒ %V ߈d0I}A/ ;o"QҌضW&|iZ)M3!A©9a„ Ei? ]C ݎޏ; A>-`6{xm5 6`]vgݺuȑ#%df^fs|͘;w.osLd 2 ^ul߾@CHAѣ\7vZ|m_Zz5>4uk׮>99>bĈu+ُFFFFFib@nDKǀF㔄*7j:YߛrCk-2^Y<5/wr8u)7 m>-AL\xs:<onm `ڟL~R7=tQlt5Ĭԥy0:D 1ಔKPSs{aeM1y8|tjV5'm[P?ǝ"~Xw]QbD5-5psdTWiH^ Wq2˅qFKF@l9>5hPtu> ~EPmWuMֆ[W^uFJq)!xut }7cmأD_Gu}Q|ߎgРA3pŊykWhܸqx@)ų>E]wz|_E>}upXLm߇~X ?bС4׿$h\reE׺G####!_n$Фy@GؖnYL> 7  6;x0Sz:ԴlJSӾ.À5@]: I˽tAK[ҊmJL=N%/܌1}/33KɬɥHYkJa&PܕR&;NCffJ$*jV;~0:3_F+S XpS/Tnz=X,ǝ T*vl dZ9Pҝ) 3cģ)(a$?DiRzC$uu{ f R|mLJ+Yx\.z׷~f̘n {/6mڄl6%Ksϕr)kn:[3f_% ]pxA)yvtt---C9&i3gbXn暲=qW>x7qO=T̚5 6l  r{Zmd?U&=K-yC3Lx Wn#AgF69m_'kgj`F@C3zȴg~]!w ΍L.6d<1Nys:pf*mYN@Ui2dt`1(})O;m;7ޝH9B7q*^ ̴2%El$@ Jݙ5L\Bq`)"~I"nE#D࣡ڸM YՅEB7g 5?3;J- c&Ҭea23) EP|. B=ЏFPk]gp#:x6 , cԨQxsaر1bP뮻Ƹq0n8 :fEWld^'b>|82 y͛3gb8p!9fΜc#8eN; 't  /'N ݫW/~80~xRu+ُFFFFFIIׁG*l(JQۨje"&*w",d`J*1ueS7ђ~$2fELS|0S\Q9M\#!pL]^(T3Fc*#˗OkٛbdddC3T•p2CyNwfgi^h2m;w@@aaJ IDATBϋI­Yr YMQ&Q(hl8 g&J- Gg dج[r3iP~(n-0]d[3;t0Qk"M+6CLqϣͯeB085fw*T 4̲fTa}qcϥuqgUٸBI :}(X0FW>Q]uI<)@($QR,HuչRC3 b֢(ixOF4?{N)kKS( ͔ʲVo0" @*AXa +I X q`VhXAnFQ ۶e*(qhI};fv]{OvZ̜9"Qו+0S<̬K5W?##L =?ܑ869,Դt`?X:djΝis`ϋ_߼L Suj{;1f_oNOJǵH!R>@ mF:=ȅuc{ݘ.tna.ԥos#Y O)|"?Kȩi}J&S"@* b9߫)שو|P5:3e? Bz^ **e_,'7꽨)ӄRG'SiUZ&D**Z'f_ f 3 t\HubP"P &Ѿw 5Qp=1itfwQwV# 1tƍ~kIbddddԵ| ף<\lsg~Djj}EͲOUƫʆȌ_2>^#ؔ0 s^0Mh E)N}O5ɌsyPSH =~y#VjnM9LiOU5+U%L{#PHGSYCi~E=e8Y,|L&0冞w;l/djvf w=XE"Z9SX4BL(pb-zRF*,dEd8Lӊx?"f$U]j !]Ihu1]|xwj*}u/edddd97J%f d=vhwKR*P-QRt$ԬE,oȉs^-u5A>@mK"WM6/:ߚv.|p73f2> Y$fP >XyQ+J 3atiAM5x.,& ݙ0S_UG͵q`S, v/| eh<P չ6>AW@Lʣh34"*Cx94Fwf9$shrYK"PӞTXv\^ݺ<*Ԭ֥I&Q4 b F)K+~JмUWlTWf3SHuF%#ŀJ- ESu v0P&AfRg i߁jA&`Ζ^NI(wfbjSQ )IH!:N2@Ȩ baEjۋut_QJcFAMpjZwPܰs6nn& 6kJ *@31UfSv{y3=H Ju)]g9<.,kժaV*\OKS]M*TݙS̬U] jƆ}*" g 9&5), 9/ 1AX&jT]Lr :+4.`$^㦉q1]IIOsU kJ2@Ȩ Rvs w֨;ӨOͰR\f#57);\͓X*z({ϔ7@pgpqշX{i 9rNp^}Ǭ[NHG2z@s|.id>ئ<(ٚF cϝj{zҨRbj zi6Jfv5 3j T(ΥYk3jƨ@P^/pZafTxy}T3{ &Q,CPf=$-"afg@MnmQ7]vN0ƼvW####I@)o`Qu*ho*:j6™Y) -[j((/pL̻ jpsʆ.Z_=_A,dsÑ頰G%lW`.ǟWa{9݆C^sd3Z{Ȫ%{فru_9 7Rٽ2̹R7;WpiS< ᘇL)&ƹ5@e-JOuRNNr[Hf֒'3v6S1TP)CI&r^"QM|} B4& +xm/J|~M =8NEr\CF;Nh|IgoQ>122ڱU:_D}y6};4mBz{5MRP 8ͮ}Sԩ0M$nME} @U,U'^\TafMy9ԋ](73!Tnz<%̉D2H(P z1H u()+4q?YLf.U_XzT$H&W.5;bς冠@\f-ǝph / e@?~5^ٶ4|e~GE&ا7]IP`O{4^24$ȿ80E hJP j:[y^@O3Ǐb\|tq)-&SߡCD47lc = 7f;jvobYV4(hTˍu`^C Q҈i\ۓFLXg{u 5CF̪we}gNْ@BEīRUE@(\E R$ԫ(JJoAZH*)!=g}}Μg Ù3g;;g9$p?/Ň0ޅĹH$ǕS<(BX)' Sy@q8/783B \`x{yFjjwfj9ވjne;Kq$wSGW=7TZ ==į}IޚPP詩W8QVW\UD-"h\PnL&]ʉP@Pa־ q{#\]ne|u[N&Mw6N󚟅Y6z0sa7* GݙC6ꞬҽyeYve bWŃ:45?9ͿӆiL>q<^`#h|hqʭfvMF:lnT~Tߖʙ]&,S0@7*#ِ=:.lHp>z@ea蜿Ͽ{.N AשVS}gta;>Y[&!.#*F , PHF1XZ(yh;@[~9'=_=Ay,BYD %BIeHc5]|_q%R&/! W}SDh$杓v;.`~&~Ҝ]sPFTnE: Q$Zuf6 7jn=n3/3+KCF4;̻zB@(iGκș=sфfڮLo~ [nX3CDY@)sOX(N4ZtaDw;sLw}ts_AAAAkq1Ժ3C!R?XPrjy8'[P [ .|e 6ǥ„w0! \%ĭغ=ˬ0 Q[9CfF 3AM!ѢV b^w6Z>h$L`)$?fOd0cUFNVNu(zb:Р Ph I4y?Cwqox|l ~۴jf"L0[t -((((h0B͜qDUyԏXh.Mo Cxɫp7u)=Fj./ސ$Q`R TPL8zf&|dffjUU1uuOelĭAhK ,TY׋TL!L[-oR^vJ;g nVlQp5vߙ޶n|a"bYCqg>neqZ?1'OGq4D6M%0HTk?T 6>9 ֗񥜔X 6b{n =*]9B8CA$UyOi;;3suf3zʥٌ¹ug:f=>3 0k6X- 33zmԸ;WP ?x Ӄf3'Z{6vc{Hf$5ǁۣX.nq!ɠ ܜ4 &'mTt@w;dI;-tOiAsAL)cvpǽDcAE$4n;.ϩ9jY8&@́ƅݘ|֕)|d`fM3]9KYBT2.W&e5Bb9JMTƵ %q&MG:|?Bd4KEff\N1R-qwTyAO^TnLC4tB'PBttmI{ڻrr>b46B,.*ueRX 4*we}80sȾ;_wۂAQ ug L jzBYY8ٝ $g]MmQa+,6˂Cs@4$xYr.zl\J>jɗc;a[4yH>|k yyLd` @ғ&`ۺSl >_ұ ]=9=)V~9uEcq aUSN:T5hgKjĥi55)/ff 'E޶2WazhB/ˤrqr/*X4%OK0V(ɼf8$ă/@h Dʭ{!֬Ԫ@ yQݑ*unH!ݤmIXHCY3GyV5ȌBY2rEBWmH[ T'*Gmݍ+JU;j| ԙdȻug<*)g'?Ÿg摸bV4hPR0@0@81Wuf#e&eW*"u38k!޾Y9ts%T\+E2moek& f׉7PACRGKnZ(RDEVsv(OnE)(L=n"[XO[^tl@YY:l`2M=> twv&ng> | f[{!^yH6"ش|Le w@^`؂Onw,vO]` >I yЏ?=ƃDzHPB TBJ}>tg^|,ˠ +t5sLpm9[`nd#p{~^7\rSf2IUy]G:O ;Y,GԹqā:߸4|nBBth^WBb&&+pϖvxCq,**8LM=IH>nLJ8.`` f6 ;w5jV `&r\Z`e{|N) A a4g‘[8}dTEqA_dFje\6d"{kv k^ zݫADU"ڊ`3N@qR Ŏ6L1&ęoz0F^}d-;b vSTan]1CT)X^^g?DU'1ܡ;Aqf ].Htju#>F1alGb}x ,B 3ok1g/[&|Z }5Ti}ށy?b~3bf߹*s Ȭ 5K2.F0@s'Leas( @3hH}c(_߽ XDQl-8 gNGV/G^3_t}etW#,@u?+hNv)I/s7}uaմsWnjgo&}&^!sV`+r?O,\yts~O@u=VW RBw?PS Dt(9U:Gߑ<'6iA8 5+Is*r>sܙu25u^Mδyyks ;`-J|G[delθ -k;R0S:m/5Ph}Q Z(I'+H;['0fIv<{a6oϹ[գ3gzuq/'97z)ݗH$EvOLj<u\B+މwq^$`fq 9kHaf帮/GÝ醘fXLz߾לG`s#s0 s׆pBϕhR~vLw&7fАT,;4[-訞 (NnC S 2Ow5IAڶsbr lީv?Z>6W} _z닾W$=+c|nki>s}6e؎@ǧzށ IDAT{|ZuM}'GqY7  ݙAWm4kpj0" dtKWvA;&7knwίak5N/CnZLA8̄;aj'_'ry#ڧ`>h b;zxI(KpЁ)P/@jt'?W߂ŷ<*]:ي:gefS mf ,.bw~(f:uQ&=N4r.\SSYbܻf83]5: ahamtPKӝۍmY7(evᥞFH7bn̪߹~ˁ 9@1{M4 JPUk[ QJv!}b.`v%s-9"(Lj>l?퓯tA~ؖ"]}S铗@G$d &>"DQ@ !Mzm x_FWyrݾڃ_oOg) +YpGu4 ̠VeMqgQͪ.k?u_Ӆ 0r^~6grbԕ{S=/-E\j!H끝dY(fX:=k*!¼'ʿM)@8PhVdͩ:q|ǵ6:lԾ>/c bO,]`Hj0QaE\6CH#s| tDŽ سe`4 t95R Hm03/W1B+ =?$IﳼNT戠R( ͠!㖃D񏩫JR(FbLJnzZ l jW-:nw@ w\ިQ?\wx7 nMWwu\ 8% 55̬$('qM)G*B^q;](ݙO,6FAn~Mc# e1igZ;=;kQNL@Tމ9-5p@Ҏiކ5O-Up>on%ve=x'ga (N)NDCSY݀NX&3g/-NVճfN6'm\v7t֦ٷ(Vj_:oy:bUBrjos4 YfzY36]L4^C͌F 2~"ZUyQ6"{\R 0.& -L0|;Tv +@Hxn[XE}6W?z('D=-yqk/+~p̧wpȠP Cov͉$l9BpP!1JiT$whm"`TCQ$f``9,pj>ԍP?-J69oO*6퉵>^pyg5|%9N8BO?ܦܠhs x9UXg)U 2?}6E~C|Eي#¸g@Gję9\-nmYڍʣ\6G7 2Yr/5l+84TWx ǡugµwT6w3ƥL1,Q@slnՕ^Ap]t*rY4!kN`_&1ƩP>"tl1Hn52BmOS_ Ay0 !n-:0x҆O0L6\C?WL(f9QmM) B ]Mh=6:"Ptg„|SӶ?`x-=ﳈJ-.佴j_Y}5usff;09.TZARňJm0(!;;i{sж8i ~k4` 2ԁ̆.M3}]G84޻Wˑ 633G.;=EwVMS\E~4|zؚ @3hLug=~s7#(Ga\ހj*= ̖@ܻ̑bh>mEB4*J@Y!8`PKg͵3?bǖ,Nc*m[+=gmZ(X*]˂6k{IZ>_4χ M(7e— #8E6!U- cHB=j:**umзefn#ӎ\; a/B3{K9 3AUwJs0 E {IG+l_5vvG.Tߙv2Qu<"ܮafY*% 7o/褝==o^8VuMWuw75|d)KHf`f%BMμ=>|139х^n2Յ MK^;߲\C*EfNS 3͠C3h W z+& .=fX4{E)3 %,,̌hd1@)~8R}Vҡk\7y].Ԯtɒ[$c錌b1id'"^\TKeº4u&X VB ,NL`2v mƕa&bQl gKV6Ղ9 DMUspֻ! *s@pw +nh m 4R}$a0KE?K`q *+aSXp n\NL7|SY3"qv9kIgv fHҌvu`X:>KXh>nݬ}Un,ܰiΨD݃˓HU#Z Bs4O^ 3+fj;Ijs#_]Ogwy.TRARh~J)xxAAAAAAAJ]]CΡHf w5]]u`3Oݴq QZ(:nLbn@ d\PĎGy N68WN+f{T.CV͘i SS\jEe|KG~ރ/r 0u;.v0CрLǽ;v=s!>Q47=qKaVzKk?O? W,} ~{ V([pv޸F"+zW._< \R[n虋]Lsg˙t+XSy4)e&\}P/2'!$L+CsshAj'@!TGHǡ׍@[Btn MKNR`Q"1Һ&)ڷq*gI\+. n%:'sc,tܬpiq^3ܹrU}e VlA2 gIs/ uwշ/>kƒq[G]jj^vm2E@T4ch$LA.bu\Kxs[wWܩ,.s6@\}.o{~;0*ϞKS}udm} dg"{g`~ ̀‚L /Ke BSS,_O;tBɥ&3\I!<(((((((((( f\z D*AwCrWp#Xy .;K( UH3h\Ds:~D;Pp/Y ]g¤A~j]+H=11rȰ &:MIE uL6_[ݶwEm*Tx_'&]nus7(q:L@crzKɝ\! N Z(pw?|IykĄd: JH%O%OGqaL.q;c߭.{` pƥ_\qC4./1FyݨXa\y2B`uP *쪒t28]078c],Pg(84A?Fq# r]?̰~=(oRRi /ƅ('8.M`rRW<3=sxAB!&8(Etx&\18-@B5Y9Mrb.v(eHDwp\] ;pr*E#4BDf9hy,l%ח`U)b%osisAဠ@UEj 50Xg(XS=n8 ?jy<$&)qy?W= a'nc9ZQ$ر%d:086ޏ7㊆}?/#"o.<`ud`?l7yUjsͻβN̼evuSˍS jBw&C8Xm39S[BB)r'I7)r7C;s"L ͠qH;s(Oc 3T?P9B crмO$f ̸yZaĔBp $A4y. |^ 5H[ZXX M~L'v8'O(H!Thr9]941}* >b v>,ܝ"MT?GNrNGƒ:^Yf5AVק,̺l!@SLf384JKhPӗ11B @Տ-_>C W._چ5Z&LVs`;^L9N X)u}{AQASтMKgx\\囄 ,)hoI)emw>r=}( P8vzL 3 \$\L.n `8?'D[\`JHTI͸))BWZ IDATuls0a>$&/@^64-W߂B$Tp6J@@5,f̹Q6<4T؅\i fVWd泟|u{E\"BMh&Erkڜӕ 3Ԫ@)XB(-Hgq`G@ "W<@qeBn q,*%xzSndIa YzXp#W}&+%(!i HGf zPοxR! `*Q{aׄ7ک5j*\w%4<[vPIm k5Yn|QK4z<^jKHgHjB`!dj)x&<W09' {%Tzݨ{D0~VA8w[n!U]=rnGt{ &C+W( A \U5.e})J&P) [xu\ո$5LnRRWJɿu)@ RK `C鹓FTC?lTfZ}}+]]O\b~qмaAp̱f9\T*Xz$SLgc4L fPPPPPPPPPPDr0l@kU 5)Ii 5𞩯xElx Sn-jxRѹ U5k[Bo[ Ȅ&t<8O1V0#Γܙ&3͔p_qn!dNQrጥ~RpBIN37_2BDjy']8q;7M{|LLkBqlֽB[GQ#Q>"Dd94/CIy|Pu@koN%g,ERРTCTGpX\4O02p91;SKLPFKs)͠ Fc4e!XhfwwS"Q!sz #d)aKZPHⅩ9jj`BVqȔEB(VHREZQAM\*7઺ZkY )Djr@5 < ҩmBuZh=RBu j@~)b*@Ujbhi*4B=g+"9I"ÕR+'RGi >V 4!)HR.TM*h&{P;kq:lחfkVemz8F]Ǩ)?YX|[^ yg9g2|W "o :a\ӝ_а:pBX.?}M 7ʩϬ:'I.K"ɑ󌜚yMMj h03=]dI əM)kMh_fPPPPPPPPPPиXUّ:'zԓ"<Oe5Zι$ހ h`fZŦvخ8g&XdFQ  3ciH VmZƵ& W@Jp~\ڒ .:Y)C8<9X18R[8CH;qۏKhp.HM'- .s7*i*ݴt1Hz6ťL$=M9k7qW?˞ IUи c:>MԄKG.\]{2]p.T` \M3޺)2:&xnf= U^JIt12`hG?8He! "] {nXFUh:ߩ,4fPPPPPPPPPR?'ڳ΋9^aV!冟 [OTP۴MV{sȡ{4܏viI0QŇ0\$q+1pqTU" bj!jB^\IXG(aeq45P|qJsWQX@G)> 6evUIW; &UU0GX-UaijՍk=d]MDQyGSf ܖD0p*go"wVS 3{ wPTrxZAqT7GB!0P]A^ޘ)4tm\OGrvo@kCcTa uO$ d}S{~oꁴҾpYRךTs֠FY\ y03ǕO 2^94Wj6Sr+ N-d ҅ HH DJDkD@3(((((((((uG\>@|hK9ܙNܭ|lea>БK(B j#Q@3/|Jnܓv"qFBGb O2Z4yZCkѲ6 3vKqҵ`#eeu0 4\%܄# OA:w0M!wRp86#x!h< յ cbt 9pJA@_]DFÿ ԎJD]&өui9j{,5 >=@ Ou s0nHJ{no}(J,HB0/UBX(,VHOش:&cf} L;3!njZH͓ژ7T?H3әwmyvzr~3;|Y9V@7E{ ) È1͘%ֱpvz :& h"a AXh/MSN1׆_=IBM&+pTn $=$8y=6p S4Žb̓3 ZLUe| OW9n<(-${8?Y>݈\8Ν)"&C \9Vp2K5^7i͆Y;vP5p&ei "fx \;PPSvH}g&auj!"I[ї.]9<6fWLrLn=ێ>Ts5ܕTi'Df Ĕ 7)P`vLF_rK$8L LeCo퐵d`- *]KITQʌUBM BRkk$>`B:IF\~gN/#R[(ȩK=}w3҄KIn)M*8qA'zd:uf cD:mVUKu :qïq&6!ݗ48yݧ>o$9 b- R!ss!{=L7͡ e]oXfPPPPPPPPz _ 3U`S g"7L i05߼1Ik}`\q_܅>և3+wOm~z>ϴsS,ȸ3\]F PLQ5S pk}i ][\z@әϮ7S޵!&|Й@>E!MLns;ӛ׮ nnYu7*Ǎߛ1NXBMg90@x͎i3ю׵n7wS}ŀ#c>8fVnT!`fC n3BKVL+LM'~*>#{^+>և܋fO.;c 66#H;2{ iC! ځe;S45DRCZJ`f{PM/`Tj#h;n; 7 MUWpuiڰT:8~זAT#}?~7;ӽd2aR&Y`afLqk^lV~8K.2 ?ZSߕ9YI<;Be2o ͠1P1^o,Y޿m|i`h3˝8T9 ffE aCuQFw_v:D}ϗE#.מn^Jfi'!Ri6NӐ0UPNL5sRCPӺyw#:w4e,l\1뀠Rqxjߵ>Jl % >nn":j$zMLP!yf MlwJSfm )8yYG^Iy3Pt@fZqIz7:GN_ߏީ@7ʐo߭8WnP|5|% V'oǕ׀:0SxdJp~)V́fZ-EȯcvWr{ :'?/rlj{ql*u@sM}HWN̬3e`f3^MQPPPPPPPg7wK^L`fk܅̡3LUCy@eUѽ|W=Bϟp%Q;Ǧ ps7U]¸ cP.I8WS^j/MѹÞ2Te֘>yuj==|_MHkڷI'u\LV_S<0g@Qq):Ar?/zH bVEZAuZ-z 2%}ȩ( LsUCZv/qYu>ǵk;V\ ڋi C]cc@k/" 6Eu֯Amk#YUt3L.T݉]7LG=.M2|禳~V?. U2fKzɗ((!!؏ 154߇fgaDrh RPPPPPPPPPC1F 4ǹ&Ka8FAB@fNdfL-\Ln~4͵Y Ԛ{a1boIYHqBs' eZEɜ*,۝LR8J(VS0MJd̪ 3+\1L B_ nrUZM/>P "t:1jס 8=Ef`אOߙ3jjעmN"\\; >zYa/1^ *lUofIV` Mƭ7%@TnGTnP֔#S4߳qt`e /}k:bXkQY80LUL}-{{kB3pܔ~@Y.,ˆkxHY 5c,0rdJYdΙLm0 IDATL3g3!9DӀCE;^bLNK/DS׸Pܙ9{6bw78‡|Xv]C=^0Dq?bJf=l>F:ι%&OӸ ϼB2<S*ILL zqWS4F/X m֠8i*Sfel{)k"(OiAMhdт%eE3D7GѺ3uL_idZEҳ3;ɹݯySĺAkUNӾMm\;89Xw> k+;W niCukm| ][q 3U9 3Byʵݨ\=K1Sו*7fvLǬSui' f ݙl*جtn>ȹLrɗ;Uu8'<υI@LjcW*\G4Tn8MunfG7*Ҿ^L>yڷs+~һ>K=͜PqGRc[%G Ȋ5}} ٗN{es4 کC)n;XӾ6W#j)$(,d$NJb;x9Ιݽ54!J `T%ҤȣBB; $$F y״@oVLLR1OO9.f\5F6k3w&84AX_3yMB@My߁Œ>,<}rap)!0STBb̤ T :ؾ3LjЉP8z֥i8g 3Hy=.^֦4, MA-8HHbZJ'xe߂1Ui\HYoY/W,ˣ6yQ ^Z6ako%%tD FBA&$rKA>A!Z=TAt  7f33Їȭ)ئ3EѰ"+1dAwJo(γ>VNN~<%j}*>;= k%U8W=4JYíf# 8CPBCXڬhܘeMC3J~ 4cÉ)eUm7g5߲՗" j˳ l6C?-.1.!=, *oi}4}߇ڇVVVVVVVV}!C %h̺4Ka\{3`f-Iu_GL 3YvwgGMhx"RfsjD\M<2`jPVFL(@]눵}轉4ف?by@`aA .H! o1-Mz͞r1Cr,s soU)G_7+`~0f 'A0(`:؜/(v}#vj,ٺ`&K0aƌcQ]UorߕL  C,!W=a_W`q=4åĂ? y'F'y/9?w) 4J¡IVVJ<b]nYXafJV&N0|gvSA0M}3`>W Ćzz7e8&Ss#RR!]P#3t 9`2a.'T13a8aɯ8Q7v|z .X 5G WH8Z} ] ](Y9W˴lTL) GhA^fCa1?ڞ]CTfJa}UǏf5jBr}6t=̼DfhYYOfV;92WU ̄"K|svLg&"Iexv<#3+DfF88leeeeeee5$4]\RII8E1j]a9+ Dڲ衕D|2 t<\ ^`S G_gOSAKhGQb4:鎔ӲZA aG!urIM}С@`},qX$S Bݻpw6ơ[ A<<1iVLݡUEAAn|u7m.XP+ϡ T@ ]kȯ{&`aq}T 5˹5 4GnͿMh,hCiS,!FnXXy1-`gȏ^WJΎ;3{Ќl&lKߟO+#ݙJӽĕ/MZ_$A`uhVUK>}0s0͚C˹.Zz%xHua k%mΫ:; :. `E!rBYҎےEaPy֜ ,l'3UC3ȯAP§.){lƅT2뮋zH8iҤ^UB5s v<$gr=™ya2BB7ecyH.nXjATHoXGDqSԀaPđ;pgq[cwĉSLUحt6M!ՌܬŚ|7̊pfס&3!XoSitb,8%9O?1kԔV33 Y RU.f##奤~/`D%c#ymi`3 }iD;M#םa 1_~^܁U@eש:|[ieeeeee @mh57ӵ)@'<1oR6*45;3_o^{)3N]:e #faa"1 7/F|jfh/Mlމ/70&!q~! e.HfNtfJ1UP󠃧,9 B3FUm!qA cՌ<:rUāB( PB&qB`0B@0"#g# Ų$AЉ2F1_bԨQ1l2 ZZZ.!cB\l3@TŘ0>dPv-hD.>Ǒ;q'H&X0B@(Sd=c=UQ]>Wb")+pT}^zZ{ʗW*5֬jn֬(%+ǑB1@ (%L %Lʰ-`bebݸ3 &w lw׷P$~z4@KbT/CTwϐ1˭N:7״=Js.:VVVVVVVV_:cH5==5m˳Y 3U {X_}If@Zv L(4A{ay/cF<r'Y1-~InUgz> EgAfP`&K.&dަtg,P7M:H8eE2YpN=0^uFф:*kćp~60rH >---hiiA&pf.,~y P"ʥI8\%L8dKN(eEPGjj8nza9!"I)xx-}tl~fQ-?㇞ןvM禙JRn0Sp@̬խ)ab3GR3n5bJ17jr{sPY zq_P 6ؾG3]ʏ%|ssSsyߎc/af*2 Py+++++++)K$KR!~UB~+yM:+l]0ruUmy9ayV u C!b[ ܽ)Phh9/rf~qvS(y>t ؙ{;?&/y+SVNr! ,3pD ?s|H.NjEQ@u@(U b_[Lb(Fa̖xfRJ8<σxQy-L+7aR PA1oLX DѠ@-6{JM?Fxs,`Kqy3UOy4rS_WäI`,X'pB( xsbVʭ7f0Shg4a^J:̌L*c#7~k%`-] dw^W8(I<tJT.q2+dskcVVVVVVVVV (l~]`fٍfo?ɍ~ Ѫ%\3zSC-(n2uFH&6b{MdS|1!8efϾY*FS,|i`zbӚMi{ y03vcLRp\m>'~YNK#rB|2 f\tZ ҝ)q@)Mti" G(By4`F;dDT#[/(M/~..ύ ns.>0#a/㇝疟sfaem:-`UWXQK,J*9j[~dBqP:TV21 Lʣ ̨U92 P/]Ԕ6q92" 8&Bi}>HG!׋40 EL[ieeeeeeeeUoDv(ʪ-&<J>L{\ޜ@! d-z EߓaH |Nl{g' A 2X(`c?ބ(6 xƁfaRQas*H";"|UdqCr9 F)j1?;rД|S a!|ճp .hIX8 .dxqx.&$o ¸C$T;:ƐGFJJB3 ?L-ɂ qnXlD; ߍͼixk|Vg )z_|-e&LҥKс#F`ذaXh`Njl涯?ZuX0JF?b;!qS@rhЌ^79`&`7 j>< IȝIjJL-Af$;4A'&*),д Z5/2+֯_%f?`Vg7ռ^@F̞*r^Ll"@1 QBQoY)v`!ʇfOpügn?0l0c 8sfqD.#r4tơ_qb0ӡ$ԧc1Y]&*^z@pk!zWl8rQ2U-^H2M&đ^\jfAu7!< IDAT+wt2Ajhls9,p"X&f98&@7vX/S'QPTQK{r )I0;<3e@ J.fxx1_[X Nrʢ7aP%M!p@"d㿷]}-A7HsHR'ӂO xx]μÆ-zp]W;4e5^+^M~x P0U p׸kZ.nn|XLb(c E p5Zn N*h E?~pxr5u`֪_=qSw܁.ZM n>裍\ Cq pǓnQr+SN+iĽmMWI< _G8'm>f/5jƕq ׄ2@rӸyQ͢*Qlj@~ V\H[q9Ml!"c H$ AYP(8p㔱Em8a Ksꦱ?YpvM;vq(WhP3iWn>쭂b.Qꦰz_3p0rFEs8e;Wz*J22:qSȨ-re7_ۇNXYYYYY $!<x)Pnl^V:]g81S.ބsjs0Q͒T8ס掹tވ*f%34@`@;/I!P(fȀ\8 O@яw+s|<[DNE;^ : .!ؽ)OoRaOA}/yq+*;0 {̍SU !Sr16;j= ?"bJYYP۰>PU Bx~PKJ 'a k}v?7f5nZݙfI[_Af\ܚL{P%Ƹ,:Ke#ÐD 1]83Ϥ X?OSBM\''nMWWIR& ` IpYPGCEYH`- Td``ᅰ՗B:dԂ1Ɓ&VK,|0}]}51'-aՆL'iFKAM]qyz_IncL:tC1$i<Ҩy' S*H&3?.XJpn- ܑKqS )8^ݿ92bAuM+ܢ4gf(jAA7gs|}aCoJ4L;4wep A q) +erW.\sp]8pZIF@sn"Ԭd&̔CM=\*5{2'lؔKX$0Ce\X3k[g(Z߽JtajV*4E y1@,˜$HM/!o2`z?&KS\*uߍ`꫕՗Ja|`1Rhڪe 0ad03cpy/qjBw5̸ͳ_8ehoR 79r]"3Ca,4'z C>` A'7(NrgW_CP CzQ|m Z]r$v݄b5<SRz!:]!B+ESIɰtoT w6[R<0aCǕe9):Gn Kʹm$%/g̔Zd @fcSWrfjVrg;pCSsgia mؠi?,QO2 ]NKq\1Vahx#<L 5$_:^|E1ư_w`3oԾI:7P1cP9\yhHl<%a9GC;nXwWX춟~)FYbKO1zh,_P뮮.wq2d ?$~+=mmmO~nLw831j(bʔ)X*yP(`ԩ9r$  /Gԕݍ>mmm3f ͛gl^cA_q*(d`rP3*GaY gi3fLɺL,FVDoa7zKK q)-Vhe^Q UQq¼E%TTQzrp9cuLB+sG}z 1uQ)^5⩧3<#GW++++++HphJxɌ0UQs`p*,f뇚7fVҤI*#~xRM3ոnMSlE:FY# //Q] =y:wI@ qlplӝk*t1QXj@@wఋw5=~#vk턓iuӢznK;f+JkNRq +BIPS 7:$bn{QTP+[ASi~ C3Bs?ٱ.R5Wrl緯IRa1(傊 \5ۓ`RÀ&ӦMܹsqcΜ9>}z綾^R---={6_}>vtM8ke]VqۓO>N;4bwx+oŋ1j(e]w݀x\rZ~%`wO}݇uY0g?^뮻>Z~W_-`K/lIX\tEfZYYYYYժ@tgB@ڐgyf%0Q hUs{\m``3 jTfQ['>H}|g)=2(0:'媂ïUZsܖvSBB:x?HOIg-=sr * Ui~U"@`f SW_@M5&`B7-_Hz xĔ \ݙѝYbېT% KXř~Ǣ5少P,BLb~$ )YnF+8!xxƺ߽!8!ƘR8q uyA$Ĕ@BA࣏>&ca^fJ& "B]q8 x؁xZ;tIe8t8DV@n.&s@얋qhmͫ+`|?0P*a]%̌w&JCKtfJ)]q+`& 1ϑoo(/3҅(pd;4?*O $ =@3 j(f+Q38BԚ5kdd[o7B0sL̛7g}6RTXr%~ߠlMU}z*;}p 8oX,^0uGOĻヒ> zZ6tP+==P?rJ}%Wͱ]ҍ٭ :;suw}Y5WթD`'U 3+2+ѝ)A?hZ[&a$c<6]&%ylqY\ 3˾A! ?W6LdR Dq, @]rft=چR#1/Q9 >H`9%4@ۨqq'Q oG!3l4N9Ig jaK7 y{l7 ')s>qj6bx{k6R0|4\B$6;$peB9CƢkpd2 8"&5$ >imFA߷$ϫ&r 9sV94 @ SPSIm6K;;ly |qrNtN:>)SCk50y*e#_9`еȆ==_Ʋ&G$NO!fv IDATk- _m `@pTPO`f_LݑQmy0h=6jWr95׉dxwlt5/!d{RzsF? 2Ǣe^uL=ZFp`b׆tG|;La<%fk;OߧvDIF'ĽJ! q~?!uzsƘhJzj|Ʋ߄i岤T;V6ς@HA&L^}C]wcHu@c(/\"hT]]Ϻ8Fҡ p^ O?SU̬W85~A& 3'}ݙn.\*( p㎘3gNwjKM̫@W8/0)߱^qŝ s Re׬M>E.M[gϦ7a.ϭGʵ:3p`@=@2i*)ݹRkqMa,G]ab"g!ҎT~%4)xC0hmACL@媼{V.{ RLbn0 Q(Д0/C/!=t 3VhPS | .!Ĩ}w=/;G 6| 3)ty@`! X*C£_zXͫ5wT_Wj!.=7 0S1ORInMU Q8AoQXAX,k`J#\&,z`fo]o@׮"?,v,C#:HlP@\ȁ P!\f ] ۺ3o[&JjVw=%& hCJ84SbсCyܝbZ [O7UE4F+ǡʙ piAMb/9Hu .+vdQIbj[.z!*+w+F8޼9 0qŽ0B崄ҝY(Fkk+~HCc\^NwK:n@8a$۽-/  ]L$̔+tAYd!8%Bc2z@T1d945ɯb0q'~ f\,6$I)ݑ 25 D937;7֦E6uK$3l; )@txpϐܱUcc9_|>ڊ+o RCvmEyRi2f X ݗ'=t$~;{: NMTO:)HLUGv<TjF%NZAorg&;BLC?!À3ֈLU$>D#,éKSLLG)5+0SBZE*4`VVVVVVVV}B;(rhvyu/ ;+w'43f̀R&M¤I޾7M*YM^F(=%zTLr-E?h0DYf+_wb!%)Ѕ"LT9.MY(bZGG^AzZN*zxv=v6(u@CCWm})5vM$a' Sjg-Ƌ/xN<ǧt.($a&wLB 0 0ꀸ8_k;-WܲD8|J9z^hn]sY>pC:]o˺=ZtZT+ȔVwgF*ab@b3u$ԷbRRL'6CQ5$ CMʷ/?9AO3SԏhD5&UP3™O!ևxnr\/QZ m=qQO6}4fw/z 3kŝF19,㘍ݡJV'MA,١7VVVVVVVVu;oW@RR!Xw1bX ]kLQ"wgfg=Oђ%K0a({WtIG{T1 @$j 3/J6~XxmHۿ~p\ɪxu+t2ܕre:9##(g-Zȭ)V#`Le c5>pB([!Bdb nPr7"OJ!9BLz LҊ+cU*20CDh>~i<x N2Ԝ&05%|o'+%$TڇÀV/v5Νwp.PZȴ c3uI$Ry"\=ʙ!- E1 mG{2MveU9dfc} /?ܚgh0дHZf[sZW0dXxgz>ҝUU;s *7ג%K} Æqdp} 9,YҰ}Rݼ5*m|0 0)#{î Ck퀛ii#`R/ B)v_~'>x!g'qʉoB CDHo\TÛ%p-Vu3TUi0|[7PP3rq.r_ܚJTabM r9)wh;nK;ܖ6室b  ixq(t$4(ߤ"`1YiHKiŘoTjk5zWӲ9GpːYNԌaf{ C B1! 7IMf:Ŋ@0qߵkM<˼ ܰCͻ7> "> !ku=ZN+l;/fYK['.Jm%I2bޙQk9U3L@xY DdU$%QE1' 6x.|, =-dLf鮪s?Z==3=G9՝_?c=1t&P?0A&P})aH#8ϟѮZC"y 4Tm6l;~ujkkP0 7 CmmM(Y!4[}`W;s i94$!ؔmgwa&,qYNN&1QcVNI E&PM7Sg2_ 7Lz>QI鶔L*\x>MH,D8 %ja>_'oh= rY<lҸ'_P٫a^FT}e$2e , 9tfj9Gqp5:2שp7Lo6s57Vm{V@f0 EnZcߏO'V]*d0 2sK&I(186(*ʈrHTH(X0✝4 h2q|NnۮL@̞P8b`jKK ˈvGf vh@sm1=iH_7Z 5-BaIrd!^,TG٭*@þ$ܼy Al'gJ)ך: 5zԎAb* 'û{͈q0z2`\`4;3ӡѢɢ}xAb9w9:aД!$1A 4f9Ӵ1#Rt- j1ta+ApIjrl\_=0s _=axi'Sף 0QIP,#ʩi':>ߏƦמsxnT]%Lq7K-|:&TObo»-`S) tn>!X6r2ٸς=ҬJUM,Y h&$ `* jB3ڥi83M p8D̄Gךּ2#u#OfݙRH2*>a8hrhzJ}3 мq43`!9#s<V?}3C^ hdδ]%AM`S+.xj:3LY) A;}n: GLgjw@=_ᕶ;rkrŷ|w b=tpgs*naqs&ᦛ_a)óWAr )U~XL"r24#!0A3B!rE*"ꕃW!u4n}V;RUعfam 3m$#`xnޙy*-; a2PX9)8L 䚮M"0q s{j^cX#U]<##}~ X$o8?_V;z>s l;+30<;$}%? R5# 3ȔJ0^U0JQ.*+5=*2E!ri&:3KNMG~aa&WjLk0BM/.M8$-1=$ S' IDAT_]uhy߃8߫F[: /T!~BL񰲲_a_|[7͗Pe! m3gMN[bcx~)8ݻ>ALS*$i)?$̄*hDfD'*R4s0 9kB viJE.>~b0GT8WYOU݂B dTQOUÛ+^DVm|>nZ}`͝9 4/~o6(iF/z2ܼ:rgp3p5tI7d<)e󗾁cN9O{ t?ōsҠ'E0OG*ۄ8`4P@s/*Ζn<, h[ ܇i4]H_WN2&<ڱɗ36rHpSija&E>ywrݵظHEɿ\01ƢoO:}}O**ƯM`^~ & ZQ}tf˩yhS|t3 3KMIJ8Dly%S}PblNi+>*7BAeu?ՆÚ;7ܙR~@o)e)dE|f86hK5ʋ`f$\ˤJkLpfD+ÛljC/ū{GU:3z*v}TE1R!d;ﲗ!H:.HI KY9Tcc94;@i mnjm%)o< Old5Gϟ0ls MwI @M7E @Ԁ* HvGk׮ŤI|=Ǝm۶aٲe,дԪe[R0aeJ56_{5=Z EFm?'pgQ!Dq%!^8`oKL/}t}RuC]ة4R@ S\y+e.*m// wǩfo;΀S}ʡ'CaMhFݲ=8тFX*vI3i2dN=TlڴjM]z83؈#Ja8?h; /,{0flݺ\uU5jpg G1~xix,yNכU)Urmp2&W3JlvfnlLՐ /*/c)@Ci%wHP]9Ոqj?ɨ^.Es}ʪҫ"\*DG -'ך? ja6reܚ&FX(5vSY?Qq&[~r;r+"`Yx"hipf%A=smӄ ]uWR(z4US?ļz oƠT;PFC 1dyg~dv@z NNDݤj|Tͤ懁~'!..+ Tb=:' ACZF#jm^v-qXjNv!ftqDCff5xO"،,܌ߕF{#} Ut 2Cw2Kl9S$P>0OE8cMCР aufWtwiT}Z\v\n*:x5uuX6hܦ +d]l b]Ygf%PhC;B?= 2-?djb1).R.)ym'@Un +2 g9m|ǬY0b :\sMvk)ȑ#qGI\zjp 4hjjj0ydlܸ1rr0 qEaȑԩSQWVM6aԨQe }Q}+_A}}riZ ?0fΜ0rH9]w~E`;uuu8|\˒%K0tP̜9Ç/rRގ3< hhh3"S\{7ng ĭe8 >$ :t*@1ؔ0s^ʃrc (i!P3 4̤9hn&+^A>:! >>琮&f< m[pwf'""ʡ.8Qeq)3M*yݯ2,TRq}-@a՟_a# g'4TMzqwg- 1=V~ SP­׹\#03B hHO݀4DܚlI(B;h@uY4㩷Ԫ^]ȎnI̘+kL@z_j"w_|y}̌f)M]߽Rń2B- Ol #fOM<ի94׿qucWU}:.H8>^z #F5XYYYYz}OR-Z,s<ܚRf53Heq=~^94X#QJtsw;<!`CBYQ nG'}zIna:P%C9,Gq($D:QL4T[@0Bb`]9DdQÓhB঳(lX\'Ư= ȟݩ_@$u[!U۠SH"Y<gc芢_v&>=%ϑ da%īqX2B`4DXhBC4Fϸ]M^r*_q(~b!%4ZY2>HdxftiV^ P1^OuqQʁ)BV v=噇~l:N[F ?YT`QyqSRAx{Mkk'־Êa&-mJ~&{Zvt,4iOs= $]N0̙G2 .WtKO,7 hV, .(_|Y';n:]nbĂB&M>c;wnڛvqXfMV^EQFEիW+U\աUnBι\$ qBڏ&+Rʩ P Q'ϧBeٝjrC7*!N{Op%r._CYfaӦMشiSŎӧc̙ewy 2of֦Ybƌx^}UL:I; bڵ}}~s1j8&x^wذaZZZhѢH$ŋ㠃* 0a8}ʏy8O2{.6n܈7sΩz[YYYYYYY 4ud-gfaqB PMOAAK16LO~[3>Vu+ dIxq)+Ö Tfy$M)A+g0*lq$)1Q:$Xa NJZ>l~Z 5h(Rx>)p*רIzX(! EaQgtf:bs4s22FfJ# /TPSBPo( glljT]ڶ-.~h .2 ; ]7^n*B87]7/x,LF~} }-L-w*~-?l+՛V*E} $2ǭl&c{5 ૚ :!B&a&S@D"ܑY49ܽɡ&LooMQl߷+F^o뮻bwN0 b֬YGC=S_xᅘ4i:(N'ܥTCRvm?)SY;L͟?guVq0j(}1fًm8=ӈ3=`&|76vlJzrA܅IB̠AA[ f1ڷlG/ c ½{Qd툚!#tnvLỷgiǪQ݄:3-Ə!<Y]`UDdF>n1p3hX-\F5^9cY h@MD]kGXm;[qNylolvx4 *,c:p\OKٱŷ="L-LD)'shlvR̃rT9N"M2P#_^RImF-o 23eiH{^W}zh1%ٷ 'n_5K~e@H+OT՜;2y?Z`q¥_k<'0RVv9n ,Z _1挆A:/ h[q:{+x)M:E8T_<7|{#Z8 @C[3n*{.T1 8s;v.̭qWb~.adY9e|o`BLt9.*2> IIT8rxzs0h暚 4> ̵OaJRcy(jeUEn:RnzG۞R[ 3<,6af$O"A hߎY*D=Tܙw]"42*l cɖѠUTA~1VBsT LC-*ۄCM B:9@,2;SnLĈC%dtw ɁAvH: y(1T:Re&plrf %8sY#!t2nWF;.= We0ߊ/"̷#ȷ$V_p9N|Ό{u H?_ DCMW>ƷӅLn:B՟R ̌[jN c05u6RJs]3RLl`(+6>_ pLX1^J1?Kءw՟@&2,]L@SL<8"iJ.j*n@ʪOTfvd2M׃%PfJQxw>(ʍ@#՟S<#<Ǧ Vpc ϞR 7'^3L z ܀rb;Dei*CXHx l hǜwv?!GJ!44r&(Bhp(նemN3wIazjWhdNǐG+§ ^2^,;qG+w  _N&"2Si/]L1/x7yV| 0 b*$6 14) pǹ#MGG~&oFo÷}L7ݷ"pSHE&+Y《8l2a&.B@V&F(*H0`!yiPFu]^T9 ̑!6-$|' 3\E`ᤌtJpponUr'FͰQix篿IQ ̄41ӖD~ϣ01!fđ xNhgy{S `~1V R mm["0R0SUGca`pbEY2*&͔)M{8NW?"g\ᔥ4-^ f֒yu3Ł&鞄!:)ߏ-,}X Pd7k9SO 5%ڶerČ8~|7IƲm!gG03#Gf4JyiˋԤL,ObB,cR:{Bq?*t]}k5aU\<TzhGr>HB`Ge0S<*|ob@&+zLC˘33~ ;YBr0e\fV۝sQ/`JHkK'1>Xc*%@[G[@sLQX `eeee5${?YieSg`fp 3]Rwfnh뻄x‡Ɩկ"=h( + 4a&PLUݙ ARAPUƩR I/&\auPdFe {H ~ 'f6h + 2,OD eLsfFf1FA/^Mt:fWW`4 o qi)x{:<1&  ] ;T]sEC CFa9^1)L5\b \~r, Pؾ1S(7'1s ֥SSWh4(ݿ8eG{َISB+jHu>? c[ѝ -pq}!T!;N/{m*3\I<$,3HƜl&ՌmSR:3 4Um9p !@%8\fre|9L&Wz04eէD3;N}<'uA3aՂõ\r&=b5âe. ҠA Bりb7q 愋9'WO|h`Vk)"s5hm氖](P'rJuވTyUYspW^)Vq>TZ2yl62eME׶.d|\eNMoz,$  ,qNW}8PN~6^0C,Atg p=6Ȕ93k<hnL&Ќf"w&Vj-ᬬ0d VBWj0mZBBK iLE'&?{&q& /zPDžA@(^Qp a~^B?1!Sź9T1"0P5 iQ8nxNB` :H g,O"-ܵyxz~-0 Ci8$|ij(""qSa h($KNq1b>ūL :h Kh <SMuwDM6FG 2嫂h66GMEkA/|y4'1$||`Y34`m È/U9 A yk7cMHI035YybEL3t]-7)[r)j̈;teL| Sȶ dYUL܍ͬmً93ά 3s6!"yJJɀ!ydHܵ& HBO!&P5B'x/A3AW7a~}*U=ehPpB)C6*(`r(ʒ#,ʀfTNPEgu\Y]Y`AS78rvP?SȖ2JtiRܙ_LZW bʷ4)ЌdpMfzܝY02DCá LcH@B?ĀL%EAthҨ;S9*`* |+ϧ)A@2@ d8;Dy&-jF1G884&2i^rS;(dv"hEE-g]312ëߤ h~a^xΘR?$\4[.njS@qWI<@Q8GaЦB١ƪ( n[: dL(g/*-=k??/l f0pcGL .k$ gz2߼߫ǁfۢczV`eeeeeeee/*Og`f;A^oJҾUܙS`PfX}DKGPL9)5x,w1@[??)byʹBL(M pm:De%i?ct@n2#.M\eܘIF#gf9ة%)93]̔.M߬ gq)~n~-$Zf-:' Sk[tVVVVVVVVL|03k<},3`sϛ%@j s O@! S:@jhh 5#¯b, ?.{}sp-Rxw3V$::"pER 0;`K60#k $Uh.Å@BXhc $o8+ ,|羔!݅"ZC7/L1*a8O*gP22L 93iݼyxY1|f͛1cʝk*`0 ȷԲNo8Zvʝ B= Bit]KӱH   b@1u7@>XvL,34)IAYHV4{C2of2A@0PU"\ء!U<ߎЎ $pvAMt4!(UPPBcQѿ A0`*d^ ̛ A*qvРLp( 2_SyIە4EB̫3{yB3+3O2;7M0b vʅ>ouX{t*G*3*uzzHʝbOy OLPHןr]90C7 }dB@EYȆoU]a!q}ʙI'!ݮNϑWy$* A^L-ZѲ#HCE:˓Ky=tҚ2?Lժm 5jroH%bpS> L]RUV~ޥM8"ŎRoLWW/l}+miMMTJ ;&lU|zMšbӹؿEF̴3WUNRi<箶嫜JVVVVVVVV=/úu3W`$zdSgܙf%&d(gG⍙)] -7w 7|*[W~mZzLB3q]AȷJ,$  Bc r8Y aCg=jpϛ#h.”%d C!nH e) b7aPP:eUGcVBpGËY uQH df3*)_%ۚ1hn¹'ܙҁG>vpR}.^ks/o|B̔űSoBp8ʫhOP7vOum=- 5sKuOsiZr^[tb]E O 5 A6W0Lhh7$ay8S>m?!'N,1޽H0Z׎j?\U%:l7k hafƠb/̞օMMA݁!0 &wf!ǦBưtexz+̄\{߈WY{_@(z52l( y2ک]kFFyEyiR0@Tɷ"̷a뚕EoQ!/[nT6ݞ,yԤ~Ў};mT$3oq+~V>V\9WrejGkpr*«o;N}m}TN]J1BfLhPPy }z4y ͅJEݪ2d}"Q ~k3f3󭢺50u>/#$ %cdP2 CP @H+@e.'ypԏUL&<]{y"W[=0Tʝi=a!vvEjAk3fL٫kJwDn3sYP3r c?Zjkl`@=^ )H9|rvg:>/wqz0ZYE͞=W^yedٕW^ . l80h `ظqZd>H?~uuuqqUWU!~zG?„ N1l0L<=PUߛײuV{0aR N: >h_7S C@Ѫ*woSELdvfV[(͝ez`fnb#VMh2P00)nN SLRuk:WŎAc:5 8UDVTBy']f1/?rt{YL8KOgdL9% ښy?FtV&^c0+KHU̯CuQYH0S)so߾AvT%sM Hi@A}c.BͩYG^{f<3-ڑٺ Q)[R{ڥ;s.r0cRIwhV_NjTZVegCz@ҮQ~]|'/5X `*>r 6n܈~tR|׿ǹ瞋7bÆ c=0kiڴihjjBss3x <3Ez0yd̟?sNb{.]z 7o'3fu\r n݊wy*|jt֮]C9#Gc=Z ?яp 7T~-SLv8feeee)C?.MSPs9Kԣ0Z0m&.ǀJ2 Jy-Gq%vjɊ@fN8XWVaҥ SG" PՊ E4u8s `A94TEexg)ph2ߊ ߊo~&9\ة)ݪ4k^5Bv"pgxRTq 9kXZeRIT3Ӵԕ4tfE.<7twk`k6EBLK@?o~N}4矯\W\q~ӟqM[r%~ĉ'X= ,رcQWW?˗/W/^yaĈ1b͛W.^3<?~FG@"T[x$ .u&/ޔC< p,q P$>ηg*"% b8- E(S@C_VQͼU931Ӡ.^1JU淃^nMUȘ| BD<ok'o>=(bXi8M2?* DC?m1y576v f:ri?r\X "H&aKhe4@ 3#6YǍCN-j wh.sh$̘*qU$=P@OwuVXiӦmO_"AA]]>#{#<}smpG7oOwl?Dt2E.E/ lN}0N~U: laܒ>ń1-8qǾx^[&<s.Hh:"Hz*%KT y6rYYo?ێo Ӿu,>, k3̕IA.\LeN~$ܙ ]ײf7+8T!e"pX~Z`_F`wmVb)3h&- A0!!VKC-R?.z޽n44>l|ƴiӐN 0a:,\AO>Z|=?5k/ZO>$x̟?2d-[&j^5k`Ȑ!qt~۷t6[xG1uT9ς 0x` < ,… #(DbԨQ8ScԨQ8s~z9=#9d\wu{:+twLj#0`\s5rm&Ã>X,TBp:zn9yxb5 Sa<}wuL7E`f-Raf$;^u:L'Qh8ơ&C,+ 0_5E[F??-| IڵԾV$hU@,h{ĻF[8s)Lӊ;mIRnC&/u.8( si0|_*TV =rEo3|7>y|2ݥ/3XyX{XsSLӊɻUqsy0LyHf4jԟ*ЌVp] #476pI8]8%{9hY*tw'H5U)8f>(<]Aunݖ-&̜9\3 LLK.-&Mk\.JiY #FO>n sέi'Ns=k׮ڵk#9<;-}Qdd4N>矏V9}m ᇑrvF}_ sW_ŦM裏bƍ0a磏>ѣG.اr><tժUeZr%ƌ#СC#zдl5 MQ :oŶZT;vޙswm )~!%u)$4 !TY(WhcX"Go힌MU_īgha:5P0 0SwoooހŒUS8X*vHMe|fB{?~ܬa>˷w!uw^ٓ.Xʼn; ;dpdjtG|rmCvǘ󀚏 5osTٝ4f\8*A{%`%[$,-f̪t WN͓<'UG j&wD(%ZdXU. =Yhm݆3fO>8蠃F7{, .w}w2뮻j*s嗣o߾9r$vi'H&NW?/zGT*YfitR9{&/3^{-z)9~Ȑ!uq'+_cG8vTK=j+;S$` Dze0u'_G.ë?dž 裏}!]tϟ/T*2}ƌXf ֬YӧcɝJ_*~|G}>fΜ[s'sիzjL6 'Nwm7'?MrJL2z`ԩXb>cL>]N2e ~ŋ#32222% j fk8T=v7GyŸ։m ǩ3`PZW 3unY:Nm\Ǖ(! a36'oxB) e@:ٯ.a7aL+>|FY~MQܑoۀ cZ1ipOp Mu qsr7(5RHcrb*F'PQ70)ܽ:,>Bu`Bً̲3+㗝 ;ץͮ C/%~f933#NM3HtZ;eǼ{zChX~=>C{?~|7ѨQsao҂m7pC.۶}.~퇝wl b \veJK/Žދc"Nc}ƍqyfϞ!C`oÇ+oV,ZǾ>zرcna9r6sL~8Cڊɓ'cyĝ#К , =n7lқ7X\W% S@LdV3(-ΰ0u0MesX:;[M,GWBMQB(`Uz6A&Q)a oq-uNfA4m߾6Vg0qUZу?#*T_xvݟZ숹,z pf>-P+ю|G[M0dP%_lؕ]f7q*5ݽtufTӏ1D_Fxk8~t*CXYKs2躁‘#Gn+9 뮻yxϯh9ժ/|pY҂n>x#N?O&X`,XP0Ͳ,̚5 f*]FFFFF@X,% t ^m3soZ]E˩l3uI_8;ccV 1U WeB Q|{ ] [ S][geY"h7R(; Y1e5o5Uw$ԬX~gՙPs9<-7z)ܽ=wrEB!,u4:IBh$ f*RJų6թa*lvxLHX;+ڠL&8} )ˣ\QơմiӰf|կ~}6} ފ~'xb_O}122222*)A-Xܥ$Ȅu^8<qyuV;8v1D}`ރE磅 ҦNP9pd;<,seN}P`f} NM Ņw4Hwj ŭQ0ΥT r IDAT@47Xx̤(+L[QQa\"Pܘ8g=wn wh bM?ІU'rnC"g]=fmfmp}zG7틑QI)wWE& QPOw,B1'f=@fU̕3s1OtzK"ӓhI)ݝIN2vRXdn"pPG]P,((,pg8R/_3 ȩY7ypψqO.`&97Ah MAA@lqTd(:S:d:p4&P?gU©>HY[}&ܭ#Sc6{%DLةB͂Ui4tp6J&wwQs? }6qDҌRg` :aR[I>̾=~(J).]ګ޴/FFFFFF%XpUK5 _c\E=&?^N;6lqQǜ=+\_G6p/xyT>QwO47hv|,k Dج00&IX Y5LÙ¥QXK:a MR ~.+j-Z@m#m0qׁEa橞Skq)SofTmЃNnԔTݚ5jRcz>RlMGnR.͔pW2T3So#ayK4CSUtzFFFFFFFF͐ %@lX<@ pJS ȨFx^Yxt" O}fmNrb[guDPB# F0ĜDClns|lh.0fÛ $rMCIKY+lty:Oqʆ3+Ź24͝ı}qi?nlh OY7 )&wTvjUs |NP/[XXͩOSH$PS]uY"R]]ڜklU̵P- )>ln&$̤ZJ)`v.^3r4澟u&tR6xav/ؗ q>z9ބK0V0@ Z27}wg9ج" V8+j<pqKu{He븷mQscnAu\ű):ʑkvҵpV0K]87xuf5/U$ha^ -3u}<k7G" v2[yk*zL8z1Ł8^Sj!;1|=DV֧% p4vNF[yHX06Fr8J?"xE,Bi$"1a@s~~ݣt՛`dddddc$=ýj*P;߀">/ |x|E]F]Cww5zpt_YL",+.$:G)D{1&gͅ1,&_.p~lxMmvo.< 3uPs`畅\_N ]:tp>Vt?tb*<]5 -qlT8FPCyqjA  fbV¡#]Mtm/r?i6IkK6ՇY@>w:@j.rnddddddd,ƕRb) eӽ6窷} 0䬓V8NCafg %o[FfseFrlfkM{iҾML7;3Ȭ$\.m{{ܯ:s2[Z+U Mv^r}5+cr dQf0Ԝ0i4H٬s; >}A-Gn.cBE*~@("-W5Rjz `ddddddd3sJ0ffO 8S +Ӡyp9K:rmt*4o0) S‘Y8%$|]oH3`1me2r8=8UNzBMpsd4k ,vWE|܆2DŽVU@1P(p@,3,LCitU]-wAM!O?n-&H@~@Yع3EkV͸f=]Mˡ*######[W~uax.M TbtWlQO R@M3ݱ`uwM<\mNdFwձ:zTO~ {ǑXgwAȹ!>,%5[j}YjV~^aLd3{n~w~grȸ*k^wunX+z85rq{K1v3L9(ds~.&g/fMr&:,XLB(wɪ; ~vzCȨ@B]AKҸ4W5.͂:8S?sJ udrE[; 7䑄P1J,~ld\AbR[Z1U){ӥ0Vs:5J̀vw"NM295fR*ԧE[:2Ʃ$D! ^].=̃{X(ʌ E'ڼjd}9{3r2@Ȩ6Ame[@ zn|ě|qr@Y.qcqK jB&\yIJUmy⌓T) 3" S}#JzBN5`RqhU87R,%Oz-QSŭpҩ`!Kbw*5^Η[̩R;wa揹%[Y("/$@f@NWU1|+uiV 3ĬdvFBl6ae<[S.SS&DqYv[kθW9eCϛ5?ѠЫ5?D5[1Ud< O>pV#ֳM#######f(.ΧBύpP@5| vԬ'T;*<9ќJ(?Ofִ,>Ozv[_9zGw޶)<za_yՋˈ&_iSmj .TᇐW5(rB,BTqnMfH=Yh5KC(vn)zn;{zˍrd5?0SHوtnlj+:O_W"S@M#B9̼ w{}iG)^ 5ɱq"M e`Of1{R%ۢ|W 5h?/@39XzjW_i<djp3*7błTfMa_,/ !E'D 6"Z2@ӨjÆ ] FFFFFFU}&shƋ@  Qgz5Ttfj[SH*}A.v1Ƣ5cz0203^U{(AH(sW| ҥC͞6ʫҫ{^]afW3 -uk}}|3)>E>OME?Ƥҕ 5id:7a X,QP}~}uRE~H895c3ΩIܚ T÷Ư2՛`T_~]FFFFFF+i$hmgXjfm_C*AJݚGStdt2Hb0Ywzi OriXÎxY$],h 96EnM!յY D].*~VP d@:49 ±;3hjӧ,<Ļ3M*異MUj=ݚ'k54~H#Ddt!OrUo=qx#zSjW> ipo4^<^-]GZz=%fB!խY/ɾ}vʨЋ2Ma2|=.}y箞z ҡfo0ʶJp;N͟zAM 68ŭ 6¡< ;ցKjs .9b1N rD)~<_AO{w |-_ 4fޞ>x+^ݝ|<܁{_Z;۰022222jgx&@a)!,ܨ9-XqPSju|]Q("]!Vmg(q5PW>_ 0wσ KP=?EBQ XV{0S^M>™ZO[ʁ<o6i򎃄IozkKe/VEkF0t(k;GYgOGG6,}Z*,::::0m0r9z3GzmOZMH|)?< #2p{~L un4QXv^?{Yz|##M<8S%E)gLŬ m?zq‰ŔZg#{oou$Ιg{< Xf λkV .+ê?Ŀ^x3Xb%fqSl{*9U)l/1hσyx^\+QuEC͝9ִ?תsnfۀq_Ą݆`4w`1QoRC*;#tm$>e9;1q<֘R? ]!̤sal3hD',tAXN-ya`YÑ/(U.4,r,RA MHRr1̳qѬ N>sXϱ0#####,Y-SuLW ;:h׋tM dP:JiN$/&fn\ҁ%HfD1Ө2_&pU /Kv`+Sen a@Giv IDATA6MYMy1 |<̥ &Hrۚ2IL-ec`ز> sڞ]Yl1}Ff`rNe.yKif8 wi֢Jfwypju]vz3nNŜ_%w[@5L ?M\UߏXb8\>lEÝ7(Ծ 8J%t9ܚ T#Phq ]IcK#Ħ1pδX}jooG&F:qΌ"ӿo"˃R _s> < B\຺mEXn֮[ /vpqi;#hkkêUbƏΏtjǎ?.k֮Śk1‹q1jڗ)w\) `ax|0l~:,Y݆}@ͶrGMV0@4QVN/@yy0_GhyiY`c%dX}:'#0/!oB_1-lq5L+fƢϐQH$a?z^[$2HdZa%Sx~7p˞bZ?7jyWKwc8UugyثtҙqgRD~cݖZ8y^X HJLZ,(v/)Y ]ȯqd\578ؓcY:-!=¡Y_p .ŷ 6S<.zHN?[|K[|c2= y>;wz0SX TV2+Ɨϸ Kb J@, {0 X#\o7Y3}y9t+\Ba$|IQXQb*T B ?}I2L4:OTʽ)j[3?5q*8]?o* X--~jʥoFFuGn_Jg6v?rHFFFFFFM{ph1 #d,ͺ'XVcsdR$UIYNHKAGʜjgS$"G'S`Ƅ1wn6:++Л~`_>9)hfPªZs#QK .{Q$\î$L3SIT T4,;! 4 ! ,҄e6;b}3/sp㥂Lrs/>ߏ[Zo-Bu3 ؾ-T f& to΁HfڷM4u\_TfZ\e 6 8pY<o45uCf @*T|FF-4'<}0@Өhx|j2Yq !:dpȨ~a]O. pp & jxRrWNcwvؤq8bp2 &|lr(:̴ZnBMVE06LCH]!4r!,>6)"H8vŮPD᥀öL,a~-R 7Oe@D9j@G}ԙYN^?:d͐h+͜}:]]ո3$Lzx'D^L[4µgiQ\:،Q踈KeܾoQ_En𼚠&Oۊ[L +%/~@c_p5Zs6(?s=Zhu+ 2C 022222j϶r>o>Y^u#e}-QD&_LvGf]4`>I܈̭6XDviHi 9(mAXHFepP`aqLm9b.تvwx,vy0~$RTYq"AZ9 ''Z6l73H",p-p Ķp%Nby ˑ8LV4 t +~ xLU;VS=)P@}`o͆// aEŸaCgOkS%~ c~}ί?ՀDg  [5pi)1e&xiddddddd$jtPxMh̬tgrrqWnQROcҶfȎff$ba!@ҧ$|V9: ` \ULӇ iJ(TE* xRZʧE̕a90W&|oPs,6c9S_)bܜ5&w&, VF1xt~U:ܛ4.Ah5ISaf@!ݙ(n hxWEHPQ0}Ɠfzl{%>L!5 $D${2fWhr6wcS^B)U `*#3Af83ꗞ[Mâai7`SDpwHPH}Ԅsz4j2r0?iCpgMJYFFL]j .B:dxf=?a͑dʂ^D-G]n,TTE^=0Q+vGLQ,_O ~Ȭa@ 3t W/?"!2WݥiY8ғx* ʊX fR0)4@|%@. A)ѭpu 65o?L`sG&2~'],l^]u>7H|eKW*7j6dݻS칈*=R$~9̔E♈,uݱ^i8mgGVLY(ʶ;13n,!,Qn@q6 !졙[$~od\&L47:3EюV\o=7F=Cܧ6fn꣭Us#P8h r;$T^j\Os6MqF1h TCPV2tS ++Nf# w >RJdض(Qذ]\;N6K* 0a0# ;03|Xpj &)Js@yNBgb57J|S D"u#;I! ͐h ;+]2,NJ$o8~ F + /ȝlץq ™MѨhq;KA|>aMV=٦F3?xa$l&e~pr.[Ή3٫%ݮX3`;=Y޷ )駱W$̬>q)S`V,}?-aL-ȇQ* @Y0$(~2 4~z 42222222jh؁fAWn)c٫, ~7uj Zw&0:3ՎL(AL*zx?:q:L}/[b+7հV1 LwqIH2`Dc-)lhIϰmA> d&qM!+CMn !3'&~AP?#i!̌S=8gaDU|O$Η<۶%1N@3s?˚Q5N a6" Tٳ,T37ڔBeC_R/R'f`)2$rFXnb,'fkzmi$МN.4 SYy9Twu\Qԛr=@f-uG~8'APA̤\ wfrIB?Oɕ9%b'W {ضJw2MFkC88qHMJ$$<#Dbiײ0L#KKS9q|wX/ R B{l;\b8yV2ͪsZ7#nUeڀe# N8 q?V=GԴ=tg.s 77^ytw dKzL]Z*̈́ z?Wz{yseaz/PPqtY`Dq ȄƬPؗT јH< f*rD"gkpZvX7Cd";D0cz:KY"v>+z 47"ц?F83` v\{λ5mhӯ- $IM93j 9yl@)? `Ý^zL! Q5 EM0(*3WTT|$~uZJ0kZ^+ N>W;yaf8SuC G0͆L#$&iCS2@Ȩ*ȠV=i@"<yBύp_*wf)Af1}} X)X nv+VjVwi|jB)zS#,K(3-f^JMd*l2$!Ԅ 5y>>ö<%!0hʍ˕'AMẄ` # \~Fm8-fS?}Id Ffd F_?X jqjwkZ@,X ;\XRb_A$ P>IY"wf]0ej.S[OQjq3 +7pYwd=#fR!f3E+1$<>*@l)9TU'gBUU 2@Ȩ fU)1M%"aj;uU*,tGxpWt* _Xo v@۷K!!"uٓBMw(ؒ4Kq7YxF@MZ8om+D ht8o 6˄UyL-KjԄ2-wN {EB-ŦE"c x#>=JKlaZd׿=z2$`߾M8n"ǫNc/uH @@$ `VR;qة V>[LaV"%j. X%J'+L JOȽ?Vno,ToxivEW2D#ъ$$D C#VJĄ U"Z0PZ;wf_]Tr^fvY;26DF8U8/e 菚Dw- R;]]t9pаfȨjU] M ~0 l̝7FUly.Ju`a5*;3iYgSBz&/0WX N><4ցw`Uxؠ1Z )^O"X LB@e'3SmL(,x8 30hjx7`gsr)?A}1󙒧oouHG RS)Y Ja'3u$S# /W1pgfnrXI+?^GCymF.]Q)`Ѣdj@b Nf(% /)b>u1˭bz5jt߹%W)̼.LDuB`덄7|*$L4hFuġIi'%FFFFFFF=^я(ʙ23|ΤH:~ɨ';Sxsg$R h`-yFD)u%\+v]1jRݛ<9޸SxhFlbި,_}է?R9`Q@f AJlzᓀe)ߗx>u7;t?PΛt=mS\ IDATRK{m`Zxx~: VH08lr OW.Ij"\M~.@)h -JP]_xi-dJ RX Tjz .H@M_DvR!af Y*tTgH@Iγq9@SHAhoitsԙ$CDـ;m%ebb ^~_!(e!S,Eqcy5M)ٜ\~[yp+yٓTk:P ?lU87)rȼy屮Z/ ͢z:tP >3DB"=;JV`gatA9H3ŅqSx,]YĥƼgfD[.ְ|t` Hє"'5 q-y}#b~l 1_,Fp>dZG)^ EmLm21 O ;ܓvB+dX2 n/UM'{58Y v\yy4,Al! A>?!u 88bǨǁy Aqny/oj `L'Q\|՛L^fزFS_VYo} I}R}@kHתm JAbJa[.C4Кd-UƜkh=$2Nu6:S5M] 4)򊟄KDtXٷU.TZGE/g ȓ9 ;HJBA@AykB+  @7T@,[ҰC,Qt#m{ŲJf HEQ;~!So0՜Ws^y5՜ gQ`S飊̩Iׄww0S^R}?{II:f$+bTyM9f^2 (N8Q~ J?ֶF_}_(\@qo+ Û4 z9Iyǝ &~7iWyY* 5KC&~x+вp7ߟ'8-Z^AoqNyEYQv-X `E h`W ݚ϶X9@!6~c{_kRoq qgQg&z),-q :O%Hy0T3:uU+w9!#hM2ْdi;t&mOD]Eg-SU%2p)k^:ksbh: 9- <0?>fj _*;g@#A (x'uDǎur)_2B;Xo$|4_pf x(, 6 1.o>(Պ}W'0.u6)lG:4ˋFŽ@o*a/((MkΫ9*5՜W*uhRd-PKT77B*,.07Q;pD3ž?URqf>{ paTcYdaKΧ\5K[ܝ݅4D6ۥ74 ,w3I)fUuʟ W A\ݘֽw$[7c3`NL91 79 ([ g0f˥)ei `.~ :6~À&л&BL-CExyH `'C_u2i‚@2Zn C\|_ 2 m2--1_u'v`V#R `Frb"/0[Q?ZsVَ.厙ú:="LG{DD"e#虣%ct>A- Ca?TިR W bCӊ̟M$}Sb^$a]_b"<6eYQ.vK $r9DTkΫ9漚jΫ9gQTi"10 `ԍTK]flW{g=ZW'&d'JUZ0kWK$04' `&oQPhM?3 {Ԥ+o^ ”~Z@;G-)m%-Aԩ @A!~|\VQJb…)b%gV%^Ee: (= V~L9~gCTo5lnz6xxOm ܻxq O*`fGbe6B)@g(ʴ>fU8æFAaF@q $aGPO\pdFeFT6\X$0.IXCB{:}ݷ{zާ%Cֹ-9 4j6yBHdxN/\\/)'.`saPB\BsWڐ9}Gc=&fJ"';WM'֘%ޅ))4Hu<'6Ohw#(O^LNualyBS[ 7uof@qkMJl͜ u`aVLꤴ+D_& #y0%L(W^>pl J:єM2E+oFI4e0/P+f)nB ]kѮEZkѮu8HP0\N|=yc |fHU3 pq%DÔ]73iTi;#3bd&32OI=$e#ժuR (XD}>*5[eP*IN%FI(AU7_݊L dVҐ/QB rpټ_Mod Ԍ'N\4ߋ,Jjv,F-om9pUyXٕ_ .%aWzҤlR_:m /ONT7*KzMѮEe/_)ڵhWVy.'ʮvَ[GñE:_3(?hʴ;2`L=>.\:I޸|R_5̤s3g]D!4'|S_'.}GWpK$ٹdV_ki*S>v’^`4 &V4k[!"mD"DmYxkd6QST^޷@V犕6yQ#ﵷ㤎d߼!FC?fˈih:C7*d9'=>a 񏯻g1{S9?PRZ2{j"F~skgqff#~tbI,ux M v '\?:=d1KͿNy}Jrn̼xaqZXL͢ˮo* xĚpSʣܴ5?`R;[u g呐\;M'hpbF~`ŹZB \j@tqcaIb¥_$ NteH FABXEJJANs(w2.rC] cǍÛ793C uaMUr![;*I ͓{Юcǎś7o<0gEJ-ڵhע]]wDD0d0z)kpi23/n!C5t(3E&uy㩁pj;kKff5Z*W$ A .4DF"nEK|(G9zu8㭥،KQQ˳V hL"넀2dm*۠TGgL(u߿׍2u |U/6Ll(-Lم(GPb޲JԴP{7U0B)l:DsMw(Gq$Id4KZRFfy}9V{=!is  Oɽwޡ1ƤWf:T%!AO9q0R0@ 3YTlT}M ($i*#Q[ ]6AXE`76)m]׮MQ-[3#ծnݷ+Jo]v-u뎈X*$?XNsb0fvDYf~4u1OڪP-w7z1K^6 @ !30;4.$y _D6hv~:51u$ CCj*@ֹi'Ft Ui_mȶlՙHw'umӐ 2=dv"09R3ni!4%5'-Qe"+)qoVڵy:m kUjYM磻8aGhpf\hi1hV33rAo3X`}ҤQ!b'G>dxiv|?iIKI]Gfrxd&l,v W@8k/G ;1ZKzfLPǕtsDf"3St{7> 58Ě!֦SD}) Kw /8/z|;(ˀJ *PbU%M>a.L!3fU Ri5fY޻I+K?̌I*[M4LV\ a(3B}\[V3Ք$pm JZ >zZJ̸w5DD:"H[ `?Wx0,z@hc֠W Oeּ48F >LsMƊ7ܧCӒl1Zf;\Y"3)@) 7%cB&=YOb1*К6ɔޑ,wG$rL3o5iqo R|ps灞cF^G*t^f D&%Y1,Y[`ҥ9kvc\}te2CIL8j5 '}^ ҘRxi᪯\esW駟njp≘3{O>r6d!Nx:mﻐJ -#Y}PIʌpI'XBֲe/c+_ {MϒĆ7nƍ@GB}46n܈xꫯ⨣2is?~q''c+=\+-Y_vZ[Ѓ;BoK.-Қ"3z#_tEx>e-3BaL_?OO㨣gIl:ٰll׬5~![GF3{rJlxiXIj{u]LB|_dҼxi0iJ)qWG] =8ZZZP.{pwcK/rn0mIlQ{\yŕ:ͻ?f,[bɒ%kX  5i̝IԈܰ#!ߒzF~X"5Gpb¤e5ۮ:N~O:j>c~x}x/3K+Jt2ۮDuQ}EZ렷뎈$QQ}(z<]cOKydnޟ(`y8Z2H6.@K.}r!3H}HMZ$2d177ڙ5o2آ^1-yiyc ׷ O_w dUjRSj;HS3AfUdm*_CMX]iWJQ45}))M5ջh?bf@B(S':PdA!>eܡZ͑*dVŪ[ޫ2F =wIFj֑}d^#IDhzx94G >x#;I+5Dw3ӆm~?XWVݸ]JN%05#-|LFjRM<{5 Z=-ze1ܻ j^CiiS՝ oI^x!nd3Jw Y{x (Ӗ_|6lYpŕN{*^.y؊ UF9QS-#i]"S㷩{oro@>C]u6+S7;_3@fKa3Ѹ*1Pkhע]vvH?S?t:#nBi;K2C{ @M8)YZ&>qX}dCf ~iϤdfЬҴ=4H3vJ/|YAGQkQ|5>2Eqi"H3g5dN6dN'&0~Uc!Z% w"b4bOCHMi)o@:DM[|׽_w4QoQ~eФΤ}yAf%\y+Ќ[^̯P]@ҽ$B(MXf@AtggXG:]{P`]}HG bs@U8x[VvI~x|1#R"V!l MP F@xa̙3tsǥ{ 'vpd>ɗLiRt?f{_Vߌϴ._L1c[s\*X#AŨlGC3')Yu$T7"X@R;o{> wm((s=8a#?G?mmmXdqB3sςBټO2֭üy!vLbi׮]Axu2e&s֮6CXv-&O쑞֭yn32eyMr fNڎIm+NO?[ӦM-?g`$,)`>w ;sx䑕>h~Da;<CXgH|@ЮŽ}>vmʯ1]VQհ?t2i-.N,x6.@wWN{siѮE:!t7a}> HBj4{|!2zif &EԂnM871d5dGZͪt&|+ .wJ=SXW'vB2Mljs{Q Ȥ,)wxAyk=j}cP>[wG ߬3)֗4Y})Ks"IFhV֦!0̪V@Yz_6Xf:: R3O3$4RGnj^b(7.=ǤY\54S#XR݃*!;imu)O#\;3J=xRĺY[ i6'WȌ<2f*̻_V`;Wf̾ aIDrHGz>rGl(pBd][Bs K盁UQ:LehkkO.b:w?%K`ɒ%td~o۶ I IJXn~:<2̘6jSO=>E:J;i0jq/s ɗ΃&E4ڰUu]L|?o&YWWe\ve8c5y(]_qq1xהˮMv{챖'>/y/(cάXjkp5װ6̼aժUe]m/jO|8g̞3 ^k(Mvi-1=KRZve6 ?TםIkBDg*EO']ކQ;{'^7E~e5s?eM B0vM!.wwQkѮEouDm+a?&C( vv@Md4?^!NZ;}LvY aM~Vdz>${ 8%B)vG&4l40f$ó$53@)>\?.M\HlI (hd\;=ņ ^Ii{imT0 s`"1+@IE7Ze*)) =n^I}\vy 0Nd6dy܅.I0J L437\dvOa ˊ- ^tؔOt&l^sovc"2;"FjR>iyϰr}fME~S̙)~o|R3\-S޾gT|Mnrjy;Tw5 pƙgs`̘18q=X-J/ZG}4lق5kP(|)Hb_r% xbL>'/:?O,pB|XnvuW\uUFsR#2L<7?jN;ͻ: 8CG}4<̆f8=4(:Q'/ZT0T .Ė-[l!Gb <,8YϰFiy^O9_(x‰x饗.NXkW^οYf\|b|C}'xf&/#¶*ȚqčzP)Ϯa})Fvn'i;vG& 2l}6H>xP+?hל4+Wka31 ,P`x`$4EofZ2'o.43\X$ԔӠEy14nVR # -%`󿤖#C{CNˑHG X,5"B8ېeƫ_`³ζC rX85gḎ$Ng"nԌ"NŦƱ:EV$ڙ:PޣPhi6$A ]2$ڙ%|h3kvmhԕ-vpcDF&-O&|hyBij8HO^7)[]sH8+3mϭI1cǮ,E2s\]Ic9JwsQ#r6LgG2F2̴cCjjbsO)I)]f>/DV^e,]%KB(cr-)(^Z;h7Bhk6@…G`…VT IڑGu>hO#KL4~O&Yشm i+V`Ŋu>t|z%j*f~ e%Kb钥6o QG?dm:[fz'$yEEab1WvLXNgJ,"|f";KR ,^| /> JmFzN:K.%KߌL?VvB`8SL^3H}Q8$Lh_e f~M~DN0МvM \2N(U FU2;КcNYW䶫&Bm3S)C}%{I2:<\+tFDO4Yeafͼ]s_kѮEE yp) (Ien?̑6P9H;K2'p#3{ZչOpžZ;)aT SN|ڟۦ}EVZXm5ٚh..o53f_*z5}sjŒ:rdeE@IhHYI lj!5.}`ĎPZZxIkjm-6Q4I5K߽_-EiU5(G]F9/nxM""](uBɚ%2bc&JֹYe+6yoRsG I,(OzǑ{ij8=yf?S2i *xdDF,ptY\~{٪[;{_,2/77toޠo8G7~AR p1D7L$_ |G3;_=Ƈ!TFX2sV3gGQbFLc2NA)\c>HiD#\WtHr(`ce;I QrJ52KXI:da0v+Pv֠QʝMM#P+4=nW2/uڕZע]v-ڵybJOxa^5Fh q& (or~sR7dfOw}MoɗӮD28Gfnig 4E,2$Z2]E/Z8)ii L>⍆|jkiFi @+T2yJGfRZ hL!_dsB'VC^0Ax-EdIfL {?oҚVB@J* 5CzfֹѷHs˱GSHj̡<` 35gnG<Όv&`yng=v]w\J~$6Vs,kM_N@4siɶyc/}THTos6Upڣک…`ֳ۝5ƨfA:l%#m;ma 22ЁbFXR|0_7?@bL5=X{;g^M7h<*;PA ,_Y ;O&!bY`E+n(;lTš\IJ)=mWi:$'ԮѢ]v.uGnq3L0~H`jY"3loQM|g! _ -~4C;vA=HЕސG#ƛzfD᫇3ܔBy#oD%B=@,6 ѾSS>sLAJbgԌ>W5{ ~|!r_,cC_ᄽpcoB*ʠd GdVvU!v{hLfR@`5}@"3MsLԑ<ӮowY6YŽs1CRh"6}⌴KmӠ֗A V]Rt򙳐["ǐ2`܏&` ju)?k82,(`F4̢CFhxdCwX n+O-j* 21s@aAg/OcY@*Ŵ3aFWi? ̑JQ 0:F%z%36};gӰYyIR MD9-' G Xn/`O[-*3MtB=:X B}t5v<A Ȃmq3 M]4A*O42.ȩ[yϜ ^yEZkѮhע]]Y]wD 0H $C zCf摘=&B{bn>$ 7Qp%@Czspc7ZhUrh) F;ӋUSm4߷} 3R`}E/3~oP7t7}o"n>zڟbOsUnp;%)BG7ڹ0U_/6,OԎrC/2~PDbju@ik9T8hadfbm_;|)Gdf=(ϬӤΟN \B3?w4ppd`^o3 d"?CPxebл=ͼc2 bSc)zr%`]KILoIQ0nGf/#1`. 66|.G*TR? @`#.AJ1KvnM/4mdX/ck(_#\JYi&Ʀa;^ˈȊ?DJR 7(p v_'K\4l0kON(a[@UI9v(ڵhע]v-ڵhn R_444~bD,P)=5o9\u?xdJn `ףLSό"wdϤ`bӗ Z@"*N4D qyi<Hknv yi b53#_;d3INkh NdfxS.F/zZşfw3ḝC"1G `59Lr@|Lf#H#2#gՍL0T V;vq"F9'Hܖ0:tNHJ 6 Z$`us +I)=;WUIC²}R|`A6WIIƵcCa ke'"X & gLUJ:* Z%4 cq"; (:i{%e֜ѝ56$ l;@)s ʛiP޹I_ lΤ$*W/aJ U!Xym\ZkѮEZk"A$X (HqCH|b>@{Yw}732Z]VW3?dn~zo TE*,:1;z1[Q jZjf$HHkg L/2$^)x>Y>Fi19R# ڃus4̵4Ӝ䉙i%9| BpUQ. fyy7} : f}Z03O5yyK'I IDATR MZ" 5 3d Dz6z1Φvht 69M,)!/\. udzΧw43$ެ8ToϿ?̞ܜ|Nea~`ر̛"X*شܙ&$&\M&fLaw<<`^0$  (P@Cktz#L2XkiKHhsO& SutࠎnPeX>Xcxgc2/fy-d,##Kp|\LҴ@dIR}gyx{OvJ*`!.#(e"뺹q<9y>4;}^qG"īSH^"" @Z#|־`PgRsqm{;N=&5G4(jV(PL.#f7HMc8㾇0~|&k2ijzD&`lv#HKjB[PV"6&b J cNc³&rt Gr֍f[?R>V`|+0.F'S8߫Bߠ:'=QzBSQ (P@39'Ldext@Ad&/Aigk&yw؞bˬ6as>!ܞX(Nme!_L5 M B7検kMYbb5A@`WRT2}" Bq]$5vf_} kj#gkDf \}uɲb~ӷ&it !)DNJR&5\b$ < NX.AU*T2=S*M)jWJ^9M MmS6Fhkۢ4Jܧ0 ߔf40k_[(P@ =W@i,ZR_!TH}!2?9R7 LJ??J~")8)f1Ɨ @D!y9"G  bw@Mpp?i$ǤF5SF*#ךOY>GK8@M%Y~o8- -Rz}y{;s(3#^h. >t187Z'@!(hqmFbዣ;V纋ks~h" xi>%5틔@$b3L2Ï>iDI'2yp/k^`3d*\B(3.XB]lsStKl l`Y0~U6m:&}Ssܷ LN5 N2Ƿm-Ƽ< 2i=C_pל f (P@S Ѥ 8`2ܿ^TNnRj M{x H'71[ihdG޳f8UwwQ4d4 9)"8_! 5 uL}!iN)wlD\ |8=G5۪F) 0-L%}r @-v:I HKUޣ3o{ O}nΤ-VY F}]9̀M̋SrDe>7+'< }0q4*Ҥᑎr^$˅ᖽJe D#Iw>6Чr[R?Akdz.FR@$m"2O7#||A ۓ| (PElRXH|o)[fy 1LG':j -qkWc' HaFzJTqd{ҟhFbttYkkKpw5vkL͂ 54#h5s;/w:Fk4;@)SN#34˜*02;v-!z̼|% $+ܫlyV;b<.*ā̴w`)}~L{I}EC;+<ÒӣJz)@1 uGlwX8B/\r1~N^w]/3eּ>pLji9Ǐy㟮YЪI>De%`@oĜBŐƌzdL̅yd{fVCFBC@ (P`P'ԡ%5)pкeͼь:iR"S*D/0y;:̟(͑)ߨttxK_@Df3MM9?xB iYp>b32I7G#M,cjny;*e\0'̼Hʻsnn8k;BԑwR_HMKJ,K.:3E>rLɚ 5=2jg&26BSBк#6yHtY@ (0<LK-#_CfRrHcR,S{3/q'^$@k NFcR`X`V/oH<_v_nf-fH{?UŮU_4?uNfc!82.\<5\KS3l *7<""۠b/v+KuF‘ r 8U/'5^X5R{#Լ'ڙE3-X?}Z+S2NC3L[d2"6 MLH|D70R֜<5|`!l|=Llj8bW3jEBb.~Z̼(B9y 0i4ז>h`wDfv0^\n: +J)rP yHZO|lC2^9#,fZgiWRsT@BGrҞFrz"<}]DsNlh]ԓx=d4UHeNLLߙ9.F و Н"?FvEH$p-|Ն~9aLέ&cZ3'NpB3Z(Lb9&3sx, < /M "67k&ȔB&fުϧH \Dps.9z:yo?xh"O;?y)i*[X!9LF*J]20x0T.P@ W : CP `J)eZ*gs1)I$d1cD, @ @tJ<w>MDf|WG O|CrmK:)FA5 aC呏"g4$NKX ;gɃ:"sJ$Vq)*:NJT:Y43MeVP 55F ,#""3dxþI8vC~4&o|AyyeKA_Wa!Njr%aܢ㓄>!toЁT%tJb`Ay.j,21d&r7_&L(P@+Wĸ uV翈l LhhTV3Z peH D=8b LQGfru`ɃUOPo)jđ# )igz{S /VkUL<5 Rdaځ}慀>eH`߯b^`e)֟I>*OP֦9RG3HWFQ%bN)r&וXKSWvCڋ)p[sRG{yOg=ڙ\L{v46u&9\P~єefq@wD?W!` јy}34!0r|MOo.oܐriءB/3;yOW u5CI ƱЄ>aK]Y?W֌ѿښ}4!Yyת*;KA:NF'.l\uۈP (P@- `R1--%$0&m5-UgʉشDfGR!ɷc((%'><y&-}J7 6L _(tj>CAޑy Dd:A7/>Yk~q ?J vNДmKpf8$}FROfwq|}s Q a GO&xiT!  Bym52mؐSB™hMRXXU0[ȒWm1%Md]Zb RΨpR'Zw,?Ӂ37> Ed摘iD^6#˂s$RJm އ]X IDATS48o } cQnܵ¸:"xWΤY3 T+DGw{,P@O=~҆jPggF\1}L|Ǟo,)i $rROk LgSOJ)DB$H+XA@p~9Î @ ol`U;1ނa̙xCfrۅ8y{3X+L=W\k!AIyX'NĞ 09`%ATu3{4z=l8rgPcN%25*f3S1s"eI*k;}]5:3` ^::)–*[5eCxF%i m.7MOKnK7$v`㤱,;x;f9&jл `AAiH$~n{C.(J+OD{BG !'沟6g9;} Ðr<a]'LWԗΥTRJ}u?:` Zof.QA뭏p0a֬YHKjLaDi+M1@LBMKS싁ɑ7'ӊɚ|k::g= \]Xj.IZcšrִj{ +xw >~#~^ 2JT3f2`#% )sIu\yJ׌Xb ܹ+y i~݁گR֙ RM&,TY[ue}rH. yw=7zrfݗ%uansj Deӌ D@FfWIBMo!nhTUٙ܉:zALi\gc_jtJYTRޝ1_TNͦw}A.}}mxwT̜9sq7%O4 GpI|ԃ5`[L& ڝt! YϿ[%A :jaMj0;\vi-ZA-+ |Q=d#:n5ܓG+N$]NqM$P3&b v+֌H,P3s8Ψ{ lvz̀զTZfG1cL]W*!3Mbi0?-#]l֑ d&8s,La}0)ЌHyԼ{&Oq w-0(]K*UTR}ǞjiƚHQeyTSQ[4$S90ޢ#Pr4H2&,R Ń\PO>ʊ>e Ps$"еZj,ɪ}"L!82i b0ݮ:I#<զ lSc3k"Y5qۤgURt!7SPRY^*'ܱ9RM[D5..g-P}s8/Tܺ)w YAƁc,pBˌhhȗ8N]Bn9@!-;9$L"\Fy fLFX,Q hLžԺxj[6ϬE ׉Jڼ6[ʱG=}K rnA6` Tm]t `AFp$;cl;=;I9^Q=՗{V`,$L8H ^ їfiYTRron˩pZUjUTgLĈY{S .&5~R okgŀ^ RNEhjhj44@_eykMkʭ.Cv! LCB\N'`iOց랶MwtKO.}v?Om)sUp,mæX)r{ض,?'>$yFɱԋ &<`QLSѐ# =g%&K%VZ֙>O:'f^(ENYo*xB^%&-Wo1/J*UoiqS%iZUj:[X&g@s48:OI*[S I1t3b1,I >rZx p yK. 4@ęc}9Qn0hJBM&q! Ԥp6UBF9l_pehwp.n^6ӌ !%,Sz굄uܤN97ˌ`1%P03I IfIYFC; LCeqWEtQ/%̤ :w~[J.T֙ 5d5s; D⍊e+ ]⦭q._jZr=)y)cb,3=t3|WKB_, uxCo2r~1yȲ,0]FN[XP3#xr9J RJ*Uj/8C1/ZWO sai}5NdzCvÍ@]n;L]]}A^SxXCv +9i)w#s֙"!VuJ8ۢ?#ua7o^eW%U텲QILtT9ew@7Rc}ՎрMNlP JđqVuܰ駛ݘG9k+n,L5<@4$x9i4 |zQ@t7P4_s+Bw a[097z*3FuOTN@Me]G܂M7AP+q4 5֙ Cj$,i’_7EC7}s>fx qc}f$$|%0 ྉ1't̑r5:S yZ,HXjĽ]?fzSYTR}X˭*>`.Ƣb~Xm517o!Zo N4| Я_?/b}YUu*jSUz $qD15x00Y;)G5c;#,टE_Rp# wh\w 1eOuj7MD`z(nӺ/Z-41C78Ss .Ϭ7,h[pᐓŹ_q kmSP'_HqFaDW\{,d̔#`Qre-W|,*fRJ-azc<TO? ޸[:'kvbX}>ԷX",OW]} =N;eUm(*SLL&2.B9̀:8* Cw(f24]⃗GN>٣޿FEݦw T{8 ۀ1b,~ԅWi]`$fLaf<{pjtm bZY3U1PoW9YF!ti"\#&,LY([|͜ˆfDQ ,\vP]&+bY.x)BA*9jYୂ8Xsm({Oq+j4dq΅^M{d XfZjωRUPTWD$/o!l>2AҜ@;EҚ lQfrԊВIN%o ea_ |NGN}fe?G"!d]tC\\wr9 CpT3.30秏|/:cPi$ԤK#e )Npv2AtAU Ih=ڹ<`fj.&#Oս / vk=ci]V<4eEYq-+qˀ?B#>ܵh|N U8>u HÄmlfpNB 5rlaS%)#JJ$MhvÐq*N8$>OeylY\k\։";0N:;$)R]Pӳ5.hkCos.4O8,)GrY]Gwz:6o|e#x#:p-_b̙-/k/2z\Ծ[iU=onifϰJ .ºo69nJY0mVXqEqxW~HFXgq?}֠;k뾶zhcdlV`]cTT_ ^; {w^}ZpB'5d8;ȼ!C:o=hr =.pO hSl1Z-n-!\ڑv֥PIj$H[?fXav + \{s 1 Xe:5.39&C܁n{zY;[>j+kb~g7fs|>cf-[8|2V! HI-7iJTC3|?2^@%dNac3O)8~ɉXfI 7^f)?(ˇJ}˷=ks+άws_?)x5S!"&!$m[°tUha dy+1_aS0{"Q+3K>=Q& BҾQo ~H(.x R)!ADهN̦] }Oj _OL?G*/流֋ҟ$iXjR/7h|<3E[[&LCz0} 2j<5?j3' ggkG`z^<`igTƖ5?C\p|~vxc`Iz'sOO>9*û3f\E6ivMGi -CLMP}z Ib![& `ځ.=ť/)3mOq׽)q_;ſO)z8)WS:;itzEfm =Zg2; (B ! te]Xei`b TLc0:*ydtݶ3J3 xxax7^dEμo<#fcbd\ׁܳOt"i,J^hWD Gq+^ mW *!1feފČ!IDლ>ӜX^E*5xA8"/coXl6jH83Sྲ}fāQCږ.|IxXò`^Xߝ"s{a8a1x)h^yIdV'G~c mʸF>慗 yԄVn 9S`u,}9}˿d|_4)\r",]K*Uj ՈÄI.oqg{⪫q_Ə;go?;ƛV[oá|oKe.X|˭Ѿ࿯{/NbΉXi~#ƏJ "f5ױ^fepm*F<}s'k?}8tM7݂k<]R_>°9]ª|$+Ր0#FIp{20Vg?rm*C)%Q$)쓙"Mol7as6J 2.t k9pU5zGȸ\+M`ЄVm:ŤC^ QzR^ ť}ew.y9A iruǴ|~BK*fRJ-#C?'_~9lgxnkO;N%~xof\t8qDžrNq^PՖf\fNfrL5U13rjh\]x ޟɱ6E8i{g~@̅!44Am܀X1&b21Ǎg h PL5ZB 3* UBopNfBL p9qOϷFW@# 1 9$oOXe6Raɘ8weelCEBjvDY60 fXX@Mf☦4RQ\׭Rԭn+nC 8:F+XS, a c@"z- Põ,t`"bQb9(]/֊\1.d܊{^hG¾wԦ ce?)~Ui^ 8lW`Tu8 zf0`v+@pG3mVfPSˢpN ɗ7<"]έw^cۓbp'Vqx>~~KQ;ϸħzf&y<}2{2/8!ERW_R_;RJRy\1c ]yg.|0?пކ=v iwޅ\kLL܅G} zoVZiŖزܧ wrYfepԑ?O<;D|x_S=,r&l]|!пP7׼_ii=iqMaaUW˯|_\f4]v4n\~4$ a9'9>_pw1[ Jޭ. xCP #&c1 2 k.z$֙LLeed=qyUmf5`يv~ӂaB!چL )Ý]u,ư\?@9:q3sio U0) u2'/!h$ G=f&M|LSOTC KJ¯\LEEöh uB?=S$V.!"'8ĺc֨mNO'Z3'1{R]VsPpCC.(tCƀ7ey:=n6+m&V͎PnkIxIxI* wS! )bHfCf@k {b(D0gK HYfΏynJs۞>0}q7[ tV~{B[6:A5ol x@TvޏpL`zTOꒇ2/12 ZmÝ jVh*UokL1]#># k?;PIx7$ ^xE_C1&h~N>ut}.e1x8RcGÏ>߾\F@63??Xg9hVQV1uta}o }Ii>? ;O{o?)gXE.:]MVjUFkƣkKfօ{i{Lt>eϽ\:U_E@ |2pGv' TԒ{ؤeL:ͯvzSQk>r;=0UV:梄eߜQE V+ +lLO΀ˢ{=ti#&pB*7v&q֒LI 3SV.wO2m&!#n⁊iiIeUO}^ ]*3W~U~2ˀ(4|p@30\'U LUݫ\tTV 9%FnNjվ7>Av}P3716=<RCC;*$γ0#'?:d}auoa֬YVl0 k'??ma̜5 {}>ؒZ\gFz[o%?lӺ&31X+_??zo\gy}\91ig=88vtK[4"Ofĵ݀~\RKfl>_}Oҍ0~+f(2FƑfʡȊr%IU. Zi:%CM?&]pw>96@\n`@M+֥jtIS-1 H2.܇!q}:6@sa @! SeodSfvKoJ+ "Ƶ{^C@QKVƀ4c"m&Vp.i)23H qaӍsƈ V]%sT\z$)tv) /[G i~ D?hi .D  =U7EV`*+KjrΌ.IO9>>\jf]$11i;ʚW-DMFכza *iBh*U۷0iA`0bqm7hC|0J+hӉ#lj#-1jI +z*#sRx<|{>{>ZC;qJcO-3-J5Ϙ/g1pR$0Qy9W=!-da< G\@$BOM1c嘶M  fPL5}|3w81ֱn3$5]B$!Ls,@( jK.-3mHzf[f62~*Q'ǔU]@eW.e,唅Xf e <rUst79#~S@׭Uy psnL5#!d>#'sMl#RFaMjY8=\ U)5_OEz&^N$cf],g24'#rkI= @L+WsZg^)7P3k}# Q eŵ K 䜖Xe#*N"YZVRwr#.֙\UWjYbkg{^ൃ"@N *D_,whn,MՎ-Ivڸա:se٫`zڊםS)HY /uihҠPP1Cx ;8BT%=G>}pKCd>gs\&%/ܼ/0Xռ~Zݟ$iP@^XV֘>菂vϹ [kMh5a_O_PkЄߔq}?f%RNF'h 5Urw/zpp4|$-*fRJZ`Zaհ㥗 Hq4z*#ݝ: C:k\ke4VՋK6mrVp<n3"SA9-/&wi(}bxԪ2z wټXGѾ޲f Z&)G"BYlr or WD Y]sߧV>p^OZr]OȔy7u:Q"߁tce,BV}栦QcD_YmʵSPIf̻ 3pZ{CDAx0Td'-ԧEHszۏTZXq8ayNkL#WOBK~uwt#W ]%}B#=5Js_`9,Mp]Yɳ\HF/L&!uj :AXj4:63#KV_=8$oPI8NMR {*8cLK)k= {yD(S}@%,UTR L=~AaT/R8{*E@AOָV%1\FL6 X.`sZOwbꦽ'ԗQ.,N ( X执H32)m*z3qѺw@,Fn=֓S+VL 4q%$ #TMyDcׅO.R.sDe-̍ʲid@P}(sT9y@V۹MYO-THm7굃"Ӎ,pP$ͰxdR+M55\qYpz\E1c UHY/(BwʑrwHڅA&d6Q8غ9z?Y H`+ƾbz\ϑpqNޛBZ0/vG' E/JYTRXoz%ڋ*+#w%[Ot"`"r%1(]721lyZVWHaA]Oubfj2Si1j!omئNLv5r Sg4gT t신,ܶHMn"װ*h(2w_A adR]T``0 "v!0*^W8@@XA-VA)]BE~(,;Z EuU.7֭E*#ҟey̌{Wpӯ^el] b@e5Zu2gK&WPSUC%oĭǬK/l4UeA Ӆꅛ&!ɀ$H`5z^)@gW@ɝW~w0MSmdAg'QZrYDmz֙ fJKMjD-h U6E-KB8kL 8:;r:Puni&i-W~j,,S16APeڱqez^֎W0S朋SmL'l(Xm |1>+kcP-X2iqMhSrlj\}?%f7X 7?$|::^t2 I&?Jy!z \+Hn}wꩩ{c)'[$AKV#Н`Y `U&^y9?ptAj>uJ[n1vj{V2 60);S1y YH 5}?'>gW#RJ*gʪ_wkw*V%@砮V ת9B߸\/OCBtJj b-%G__jRI2`;5 A"5 X<̔4QbyL3QS772Ycb'?j pEZg1w_`݃ ]FQn!(k#p+?c9#c L֕>E453rPfLϯcKDݮvR!2 2SPL>k_iXF@q 7_[RהV,A*( )߼ȶ$4!!Ǹ⼆suasw5ᚂYLUn96 _4DFϺp|:Y!:_( S-Q0npJF~*\lբe0GaJ,E{b}LVTù {l]6 n{Mt9h00yz)Ĕl>B)̀4\=&3WCQu e@oD%^ȣTRJ [5X\Jo:V ;߯.R$ L$RQ 9b-YX[Fȇ[bm=cq+!L\KLƲ }36_

-J;T{S拨l ^Uz,G8؍ݟIXieZ `d*n'yY at+Wlei%[@‰vdxe*PưQ P@ϒc*>ؑ;/] q@a뫊`4ˡ}Yr'jX׃Az u@ϋfv37HD Uu :y ìo3u_P 0!3=fwauK IDAT/`ֿD=?޳D\!gV{d xE5uoV8cls4_Ec{ JpˑbnMS^H/@R)/>!`&ʆ.2(4nXURJ*gƚkaw\tIJͳ(+o+V޾T\<"L6 reUB[I13`3j |l|.@&``f6*/<LH Oj4Y~RЍϫ ? !WٻGVmYt]f!\X ;ЖhzwXD"܃0aq⌺@1<}{swٕ hLŔT03|=2˭҂Qe$Xq3{X`[WU+?, :<(Ɂ#6ub۽{ze)ծű40kK[)`sv¥9Gw wPS%L90L3+d?dwT9mZ*_ȝ-,|I \uX:ž xN6l`E;x%m'䧢$ ˔)g`;*ua%.pd/)h;2'o`e C#mM,'7Zi~ewr+4D5Uu&fLO;g pV 4>C@=́:K7MD\+vNYm?Iµk}ER$C2y{"h%0F ][ɢOPSD-#V05M3i KL0e'T#Dw 2}JeQn'0 f=ߊ̞V*]ANpnUA?1V8g^mI[-Ye]"$}_rK3Nw$S>4r9 .+֙snYխ hK*UTRJ͒ceb ,b[%?1a~&10 t#YQ,Xa:S-N6 {r ˵3Џk0"0vt?]鲮v30n3Y.5km] \]lFha8Xgґ0kTE|Md7VٷS.3 < G% P\%394ViDzJ?TKS"ou[T樤RSF*$ǐoeIJ9*U7[/Kx 3g2Ƈ?)(â /:8'*jl'A뺫W ^Ȧ,6i5̞&Q. l8r\HhY.qv=\'-~964%@w3=bu憃HM^έLZ+/7֙xyvK/ܥ/tsN/p~{ANI%,UTRJ*DkERJŀN<'4ROW@KejwO D0V^KeI@qߔœmП3IRӺF玷۴.+bTC7Ӎ Wi#4ԥ=(T%0s|UdMm\ȶJfrWL`ڀ-ɀ#, @@OK+#NcE0`m 2>h6*:ԋ HiAM\ 2a͇I9ЎYnLs42 Ų>Ƒd Q&(S͚^SD[mFֱHaOXX&ڽ\AvK o:,3k騴D>9f* }U61wpkmX0}S"\a;ϑeH>3]_T|^`_[~}6όka2.<$؂k &q [XlG#r9Ho%>Lq).&F o6lد@"MV)4 ~`|Fzx1 xWa&PRJ*UT/ [Y ǃ K![lc&ez ( 4 п(BPox:+ ׆0`ur-V@2R) Hc5`{]x6?.p_֣: "muk,*hV`o+fC$…eAM#<7 [fzx~RjfJ\C ⨀70ww #'y?jgmk'Lhill>RF9uhHuZ6 Zyuu*Ns#lz}hC {OeyX_6混e0ZD?%@K(޴PةGTVV.Tt"+t ]}or'x>tqTRJ*UK#5xP0,w< Xh"RP!yf(ˢ!Sr.5N|A,*ua r>=ƁJ T"--fh9bOfs .CK7wi9kL0eE/+ѹh!UCnU{rS&`<g[OB7bz3QK+8R &< zkUSq1R2*E+~}C8tT`7kU؁6)nkZPI _o=; d9r<_E 3:.x|ևJ az ښomNyF0hwdƀc+8}rQ'>D#Pg>'ƲJTJUCX 9?U\Vq%CdYV$ߪ"|.̝ٙ[gY { hۗi켹 6sVP:[Ŕ|#MI xseLK$vڦz1^:3"/RoQO47t, J*UTR_:iL9 TjPs)'d&GB J )+M Tai{ER+ծS;] 9t`f@ДSLZ`Oej/f `w`U R% BrUB'- RFb)T'#Qhn++,f  3.ˠ$U`X1{?S7|[_0m6T0$[-ZR.*%;'Vh`8*M[V>[s ZeOg-&3 .9֯7=g vEv0]pup;S.RSX%46>.='ZRBj9x|=wEK-u VTX.]-[>J8́͝nuG~ALH^xcv`RDY"[J8֙7@ M+ZyRJ*UT/f3q3ƹbNZria,4pσ)l/]ьxpNj1|q?mAKmmqxL_훬(TH_0i.gPy`2 odk :+wfjh64yPBJb'< ,m/ (xhCEkb@WWU7[x+u{&4&Y !(ȴ3eJU8]qnWUgP_l`InSx?[Ne qڤvIYsŪ7n.VM%Ra,w>Vd懚\I}5h #Vκ oP O.=bE/9yK{=T,UTRJ5$~n7&'D;@at*q[ȍ/XT`Ɂ[D(SL[\Z(:d[J(;.y X&`Ss@%`H9G€#_ǭkɅErё `? % <06`=q` s7s-s-d^ $)ӜX0e~qH}/lCvKjL&dV,ET:Q3rp3>n,ݦ!,[L$Q&T SO?RTs{Wv] k >SLoA]^3 > )zLbZV17cgc=|ݹ;0w^tt:~'ӄ 8cgk/PתЕ,krYWyr!jB$}q&;G$fi&3N~FOԷvLZ @D 1grR@ AԤ io M č-(%d ]2#PMMafL!7/7NY26S;յnHz&b?S[.Kb9'g4)'K+Y8TT$S3ܩ蝂"A< <<#0#(*HR0ayGշ[O3yz:wWW?o]K,lؗ2/Ti 1&fTTTTTTTTҝ&xilbv:֝>Qŝ1Sit<:5HkE;x5'QAu3 .,K ',<'J" qڋԲB]msa]b߬AeuRs{Ni\;r]?ԐAJ=HfӝRǾv-SVfshRٹ5#_V?س? 5&U4ұs^'p˞mׂR,T%\?y?dT/XOY+[6W q@m@[ Wr{m`4[Z̬=]M'}GZf<'Qg`\5E 3ro0L+{g3C;:1%߯ƭnIkTǣtc邨Π󀿞\c#-ϵ6,E6n0eHwHE[e,3EQ $wiL@Chi󯶔Jܷ].,~ߩ+r*RiC%(+w$ښ6YmW?``&mw t9T d>>~9P'Sg㮙u 8k?[e`&ۀ},pX#[jjP^:Z3H!!z4$K@9p'а,WF2嶞vY\:m_[erxq^c*3/Ϲ\M!m)?, ]c";[bukiIJgoKm`nE @MAzEQQ I})sg yVg6nqDhFEEEEEEEq\ĭ$ƥܗñ rgʒRj'TqҨCԫ^v_%lS`~M`wV݋jf/bmguw@&^ffP^\zH*J&5`SK %\@uA @h8l1C69.֙):f4t\/0C2Pitϔ:woZ-D-`oqo ̲{d 43$j"95vl+%GA[f0rC` 짣dj~ jαԓŜ[ffvd&CS-CYX0&3Z1J`)u&7c Tifq%gstcPjDD8 krB{0 ϑw{nzQ&km 2w XXW1k)ШdwZRrFƽ{O2@^!LɌ@3********jt'hn w~|3A&uvo՗_xnR\4_nMU0kY!AFEuԁ%'%ns6+,/ϜZe;/ .h,pPhb7 (YםmWoI]ZS.e^`f2Fg f֋йptL]7Fq&uؒº#ڵ(.uɦUsluN~rhƻ'DPs"031gef7\i+@:b .$P80ӷvF!P[΀K@XJ>N$(X,!o:>lҕ+}0]s'ζv B bkSz3Ym;lj7/ 0 2[t)ZiIGוXk$yaśE5%IDAI}pafًqϲcYX^Hnz@{LhK%a!nŽC*D dR&ԬkG[$ع?k`&T^v.3MCM)f@-?]G?YCm?4tܧnMc[:\u;sws:n3{q+fNp:T6 fN65UɎ&P,6oxHx|;fm(%֏/%paܭ4P@;D&[.b fpU0:u١^dYhvʔ>Ȕ*SW$ΖmWV Hp$Y/f R l$i- 6i:/+[E4mȢt❤?ɳsxIVoMvbH M֡ 3~sgUl [17IlnnjIh̻6H8O̺Tx!@vjXw&%1g,.uٜfhFEEEEEEEamzlܽ[zGΌ0bgꡥceU?9$Ţ@ܳ}BZk0Ph!8!`RD%B@$i:R/_/s;G޿ƱuLQpwΗph)k:޼m||oб*vbm Ia4zǁ0f?y;bⰪ*l%rZ'vS!4VC9,;`D˴xdž0A+TN2OERs:mj׫g΄bd 70@i3$'ʡ0rj5c2J3(>4LPR"QGj+(8?6YOՖ+w1OG3`Lg/RænY'QKU&NC kr.yދ`n c~q9!(ͨ9,S nr N|EL*5 .)U,4,3?xj7nZB@2Ht r_8v+¿VnM@0 49:ꌩl!iߩS5V%L πc{Lꝣcve UY:E ,7;;LcJ4ݼؙ~̞Jvg8ښ*I"9.484 r`&p@5r O/뷆umI[=qN u'Oyf|:49J弛8 ?~]1mC ZxḰNtÒ 'TgC:KuX-m`sKbdoXPWI PH3v}.,Zc14 NP!E5廈sk̂Y.\kMLap;& z\ Y [f.tbbq/JhPgpЩj˖aSSH$85RV"tNɜ%(R|ϔb{r2C=Na] 3񥚩J:g149[gݜ~eanO 5M`=p(d9vӹ&1^'̞Ie.+^=ojTAMCC7%es)R. gíׅ4%p+b8,-Lқy1WuPg>Աk׸ n& 7{;dnfrj/zvTuqoT.qڨb{BZ f:Ǔyb;L"τ5fJ֙'ؙlh>,|7ߧfNqnZg6: |OBͩrc51LWb6<&C6kI'-lD`s 3LV4 fV7Li fdz^/ MFE$)^ 컣60j&e@'/v>Q{?F:^02 m3w+?'܁/8D5\IJGPпB W4 -i9{x.FTTTTTT$XTJȄ}ywi(L5\Tδ餱ud4IFրtp^vcmǤ19],h 8AМ'ͦ/Txt1Rka _%f0+{&oםrY75^on:vic14rAMEH03d|{ߪ>&q[iNous:;lyJΧJ[:3XIJ nyWhr_T JJC1':OG`7 M2iYBt`n hZ)e9 0/7;Wwjrx =fr},TpsQCںK--U|آX|[_Ju?"/88r4*~sV[CtmI gf|衇 ?+ ֯;^|ԋvJ5AaL3p\,+6@\JG0uR u@ǣ܇>Ԅ7o:48LKzәf̵ָOo&),Fs}{]Ӆxe.]g=dT|Ș*W]l jrp,Z[91]kR {e ӛnn*ƺagڇKܜ'fE:q*_{Ȗ;>to,3'n>c`C hrK4x~| gIr)% 6,`~] = qbKR:1@)I).'Q@B Uw ,]xljU\LgsKbR'̻R7֔A~Cua[jphC"4w_gsE h[/;z=?e#M7> 4Ư_s-.4 DKŮRJlڴ g}6~XtV,qTTTTT̑`'U`roݲz!9 x6j~66%f2B. ”]VvS `#$!u] Q$cC"OfRg"" @o\,tqCA~JJ\.z<bEL;Rxh0$JY4|#xqo駞bmb%/K_b,2:җ񊗽,?z.oOy'?Xn=}h-^np衇S;#X+n!=_ܿ=73,Z~,2qV湫p׿vwΞ~UWsq²eKq7єvFXhy^h>fTTTTTVB /; 1fPG!diLuDK'eԘyv3LәaP3C 'j?a5??|uV iZjN i f&B#9w@"x{˭?EYp9HLd8e2Ay3F KYjcp.&k8C3(ɭ$s/_ҾD"'ȥD%7ͱx36=k=!PMI䜟bFf9꼣j_u~"zm+;oGйmg{xWk_f\sx78ǻO{oz {u<x"/\r\|ͫhv}L\ȅwõ?XvmeI'{r.n9z L_@sr9S&q{KK։Z[Zdga&u9O$CL3)"` TU4T%lF]m+f J,_:n&[F kUqWj-rh253,,]Cx0WnpoJbg 96}9$~ d,y~;|贮L柧u0Nؤ[C/g5Fۺ 0JނC[L=-/g٧Ks:{, 3 P? (?g]tAa!1閇 ~i]6^jzbKJ"PMc zg©'nd|V暄ri.Ye#`vt!`_ aպsV~Cf >!,^pN~̬elbv03h4pgًee2~i6YjnML_D4Jr^C`m'M3"e8Ᏽ~Li 4,:!&JPeʭ'x3#f M77&]=v\N{Z [fc۸`;ͶFaİk\Ьo=~x/_fqWiҺu+_L@ke˖97^n6m 㫗Խ78W{bŊ]]nzn|8C_ e/}I_ fF̨ dpp_깜T1r`&lgwV'm4R3WYN_09vD]&]S!eo%juU d,<`tjt3i`v)c<ՑJ1g*e.}udYf4us;d皛}C֙sU7;]dy$@ș2iwF՜=Gq/+-` %,4HUBA\_Oġ+fN̜U=jVy8zeN ͐.]+.>xNs8#``=/Ǽ gˉ^sY>מ}~鋐RʫƻO9&%@3*****?%Z$ ᧮ VvUx10/7V'4-uɋL4T'U6%в*(fUM[4B7+-M[.j  Tr 5EfB3T~w[u{@-Mg;m{  ECPl&$$Div~h6I :wofmȸOd霓3yo?f#̞>F$h~wz@0AMvfj*Fs`0} ~9 =7w'43gt]YG;+3m c ۦIv39hAQ5'꺒DCb[_~`.#U'!M9s-Yc0% &:)13aaj5z/ՙ}~>B{}hظq#OvNw|e4u {}89n!ǻ't#x!|Ig>12O̳v:<8sz>N8j!D,`עE5>qE;J@V%)tJ;2ܒoR6~&YgejBs` R9d:i($2.ޢth?G"H+*+{"P2e2mQLG"n(o7{YDž=S؅]'b#SjNO `y_15D}8|bsNGv9Lx$U4&BjۨMmmá%)+p?Ͽ/;Uذa.\tN}EWZ_ {/q=g<_a8_ގ˗wou8ظqqyN|8W&\P}9Ï{=藿o~܋ Xn3#Ќ Kp)Ut,E oZ]YvNGB$ OA` svܷy-~ေfNp\6/l LO-Wג[h&ڙZ.Ms^u|i_^~}78%֙3;Ygo1s}I֙]۽Sуufs[ -@C^3ɻN,?UK3',߽3tC )I.2P Սcj\IfF;W>jG3])ݏl;:W(_hڙ5uwjj79PcNlvq7w,8W&d?PXg6օ!m*̯1KAS.@(!Lz^J4[F nFҮ,H>@( AMBLk yA:+ L;id+!@&*Tu!oME5t g,:n)8fږƂV`@#s+I<&m':|! CC0<:&M+ڙLPҜQmL+)Ip!ۻ2iY[~!զ*AP&VˀV[]or`fxy;/L[%pQsV2 I &ffjFs PD@>}& O+Mv5 Aˁ" gj)PO.K+sʰ\ w컲͜J̉ 3MӀ4=-8EDfrƋs5gm9=ΝLz;~@u-R+ƛ5?Jw:qn#s;O姲 Tk~Db , 4* hr Lxաbs$R3M›$ͨ<?}?q2Xt,*****j[d #qk ( 44;PMG)VneIy,3k{!yt)L$TjL';$m"{Ss>tDɲ2qQ5;̐Yc5COϷʜcr]{qv:)/۴|\ǚd{Μ.mz*P0u 89Q Y><_~r9*4."I4lE6JTh.dq.Cp-~= T`L |#|bT<4dx_Tg4lt7S>[Ư jv `-A̺NGSaC<(>P)3p_uf sE5+tR,]tk#*****jV*e4䬃rhbh25%QHhPfɳz;耲,Ŗ4 bMFR,H-$Ih\6ӡ"q׳Twͽy$9IT&#.Lzcژq&5)664RsPoPs { Q̜J5Ƕf]_qXg4dž\l`7z|g;7#afW٬4V, i:(&t2 rpk(H14A:މPӀJ) `ӗcQI*DMZ&CDAG2h/mWؒrERD`3$ƴy-4E [ټ!@5zcWǔ'/i~w2!nn:{/{v cgP8nn9@:8aֲ\U}ĎHE(#QL$ nR(@;~uR |Y_?ir;$]sYʬX4D/`a,T mXݤa- t\ >=]moLQ=@@DilŔo}oM;I2.8GҜ {GxhDbA]ȬiK̔LvY̶4nw%vizɧOp;4mB_I$*IˬtMlBsy5 m*̫T*dVu Å}NQp?UQwPqznze*鸚<#ώSgi:($6.bdudij ћӐNpa-sc[6[r|5 bGjg㆟ @[$yBrV~i}7wB&dkFaf$?΁OJ, ,l$1z z'g 5"Ќ"{*jƓc TXbGXfێ=*&! ri,4RCTKd=IkSl\ߩGtJ:Ol(ĀvOg#Ȕf$K񸕏W4[ރ[z%ff ɷ ncr~aDfnCNS|C1wgs\K.)A<گc%?YMJҧ:h ΅M 09M[?d9I?|dsRVKrU>hvuLG$XxQ)ꚂQh$q)'{b'3CQQQQQQQQQsDk%޼u)!k\Kԝ&l:ԡ 5xR8TDL,2MIQ~Y*PRS긞 M+Ir^(FN7;4&InZV0)5؉=|]|5Qu/еDUf9]'bI3nV Tl?*!&MsH=Z d]]wTm³ :.T%UMq.84EZY \CjASLsRN8͂h؅`&0mX[랞1A< dD+ jyLL@ŒRڬl1瀗7]'%{oq/?!qf*T MºJ5X*@]z 5θ|U ADUpl4,QQQQQQQQQZBDYDJ$TaLõJ"!;qi:Gf2k {K?웘P9ӝrZ:LtgFHBš:Q:tLSPBS޴5s @HɖXg.RkL&$lSc:@=@_ a0<$uDq^;7qc\ -S (n3UyUd*co)F›.,`J uj#c._-ݰ'Ǻ+Xxߥ$G\L 4 %;`L2Ѥ㳛 ydfxd N{*3//^>LjBqzZu'O'rju|BQ7[JOI,P5UX0S 0gҤ! PRd)ͨmDXe^ aU /YZoe8)ia&Pu@Ug8r NKi\QX4sr]g&[}oだj2Sjb❑)$ƼQVދcټ* /~֋3ǵoPr7Z|̩PkB[Y@WMx pRx֙ҝsb]=TVR^~ F3vY9)ux&ʒχ.$n1KM$/zL'&O` zU[ݓef*H%bOS9s}Nj9 XjMsKKgm#IʁA|8iԉEv5w֏c-lVWY|fTTTTTTT6$zlRH ]w9CM7Ǽ"kbB! \#R奭 $ju`,DUKd"l'ԻH4Ф$֌ Q j&d+jW s4^KMMb _fcAdXgn 5/U|[~ͷkzUhTu52 as$`=}`tqhɏA+lfn^YI^n 26pn67:3! 6i'R f&e')t!KM pLnȅL2ha)*Or IDATL uOԜMTqʅHm~"I6O(|'oڏ9% 4Yρ}C6(o2+ʥά1!xz*'+fOLR{\SQQQQQQQQېF_LJ 4$lg@ux8JEyȔB' 28TV5 fLYJ{|/=|jh24fA1}Vsd2͙B)9RLGd9رo~@`To{52`A X$-1m`S Ԓ^ı4KR4`31~ɎS4MDG;>)i_[%qai1VIC۲y+Ѐb@U\Mc)Lo.%S]>c)^3UaObGtjĘMMaVKzg\TӬ;-cŘt늊Zˬ4/hg08{q腙w) R!Jt9*&JSKJlP3s7LD-S@dPS8u/.^-5zR~=^EkmE+7}MUTU$!TҜnWa32WӢ  0S8,fȤgt_޺}Љl$Ӡk݈ĘN(4Q{Y,#Q[TQ\keY* xa8ç\QQQQQQ]kXܺ : T~Yǟe3ҽD*+Κ-g.") u$hmje@-SYE&ox so: s ϕ|5Q|xRG,47j`/Wa``&66;Z ϊ0"D?wː cGrc &F`M H\ġyJY u@] |˛mgΣ /K+jĔ_O^bg^Q?֔6%Lz_TDwXa&OSKp3LY/vש8*;MMM'?9Γp폯ʥ5 .@рd=$?D"sH)i&}aҥ[QQQQQQGo2(ZtΨNdCUMr3MH Ku'½  2f -J(4BY,Y2m34 m1nyqgӖ7-5Ms,!.Ɂ V`g4c̮'^eApA&RM;6x"`(Iʤ>$ S{@x)DʮٜGͰYW(by7\:3\p1t< uM'9_d8 =<-^VUI;ftRrsV .> Ͳ{`{c._xx~N/\g\,yWG;~c֏]'w>홸9(N9 >u}pg`tt9>E<9]v ;F|kb;,[]We^Og`Sێ'FFF UvFY!syvV1attlz>vTTTTTԶ[YV,>N%uy%ԋeq-;{N2HI2`-1Ғcye4½puY0!gNz&DDD5Z>R1S\v{:0F fVRVמּMv;܅K03gtUZO<.0p;vuW7 7p=>6?Z{=^Wox#*Ϸ{y?=Fru~"zm+;oGй܁▙5AATTTTTTTz+T\YN8e!Pw"{J KS5, ) w멊q x|Ħ6,7e,>JafT-y`ANo?ȏGbF}GCj*]ˠqko>6B d^앿9})P.u`AL=+RjSM-%PMB (V"w)JIxP31;}p, ;/M'o,&ӵ Id8x`f!ь?eAT.4f!Y6i6/4A{oZ5MP/:`MYfVƩgw`w2W=Ǚww9 v5m@sN˱xm}uah`…83_G>˗a޼y8]'0obwĒv‡ָP淿l /.쌁022 [nx[]ץ_ >|jr b蜕f`& QQQQQQQ_c hۡK6AMpL'8ЬVjei]飥t\a;DnQ`sԔ9 3ϴ( x ;AK,^qV)ZcF4Mg^}Wuf)K m߁M6/^dnC=vۮξ?0vm7gop~C9C֭[Pg_oQ7-3&{{޾ZY IwudxQK%R;XP^V v&Ur  G$ $ 83$BQsk'xaiqЫH $̂$?Q!e+gfqi015/q8nxLB=*s<0;UAʍ\kFs]F%ˠ`"́sVoPB4.Qi#8ԤdulZY 'Q 14&a9WM.TۧH'i p>m7ᒼkEp{x`H[Bp]9eXԜ7Q +s.wu>b͊㈚f: 2ԹmhcO}Ge8appo} XunGy,XgЗ, wci'w=އwq.lVn׵t\q|I+%@3*****jjWb;Vc@2QZO8oɁ7l3WIjWm' *gn] ۹J *6@!LاVWqc{m/VPXCQBE k!!sSMco^ rz]g2KbHN_i1^fJ|uWcACg2X$ coIe04c{. EG +5}˦` r&k>L,܄<:_=*^Pm*e Z_jB?7<v1g@!4OٗeXCdBV2ӏ#W)NI(-.,\\<vy9^R[lA^G݇SĪǾ+?ĆG6̕8=8s9xx7U݀Lv=6#pǦL*o{ewu?)0آ?N̛6IDx%213$P0! w5wUVA;`cA0͋Y_r̫jȯ!&)WoQlճU\T{K.\ae=Ǽs:3 m}9z<Kv >8/epYku?:y=w~ fF52PSw8MK;5@oς FZkU"ʁ\LK=e ܒҖآfe4OV_WWչT u^†yzNeCg!_7e p^k\io>3 uAfT[f uf'9Rُ5k*<1-멍wIp#xL`2e{P,w!эAINrNR<͜Mm5_Ɂepm={YR "\? Lvn)ùLeZKPk٨ $> L]>dviʤ~~iڸNwV0 U/o+_[#s̲˟ eMy q/WYq^S~>eyIfhO|=e9Fru$IpکiruR7 MZ5y+oVc_5\ ;Q"4C;&=&fJڲ-24kK=֚4qtnc`Aci7P3+Fq2TZ@ s`G%گ<Wt+). rM~)f p>۷L0*Lr-7$rn†$R,Qn},+W*#ڈ]^YM[!u?P# rN4_)I͗^3ǢԵpRFM_B*`žRƘC_ W]C:!;T󼽻 n%~- \ }?'LӇTݴW{Wl!9Mͨ١JM6hp)t<1224 Į6@9.pI-iGW-qZsLr=y|$ek҂PE""( eBVv z+pYDʢo١XB6d&3Ӵ$-ddt<^}NUOo#)u3mLW`*/̫j_]̕s d `YAL@,٩KV5)wue_|CH*ORX2ZEo` FPl䘨4=?1:MS`b#2%o/u% (}uT,s NV4uraU~WjJAmRmGahL[mWԡSUȃՀX+ ~jO 0kDjؤR0S]j>~LcYhYH:x۔; h>ӧO^o{_VEەȌDDDd}@ LqIgm{xV}$m:$>:cPZ YMBO49ta+*5?ۖZ`3q,4žq`?"zZ &NPSRAL?!if2fTR~:ʌ׋F0eC<Q Y`Ԙ&(QF4?˯&Ec檭wRJj`;E2)u||ghfe`L禕w|LE lU ӽȦ͌L^hyY`??][iy[^Ə =P3@W7 *KAfڊ;ﹲyee:=04)"#ߙe4H}S CE l[S} Z@x@ PTt7WL hVfV]ibJ}Gq[Ԉ@hX+ @+"P+`~@At'Ȗ\faƇSRɇJ:)' "?2YW~>ZF0L(:FHս\` fJ爠L7G&av!;Y))gj:bTWn@֮1 xyQ) ARN&.i{DPwGm7 ;'ӥ@ 3ֈQ=I@`{Uxƀ&qq!8*_te9`q+iV MQmTrm` ^0E7aa!9$M$hLkT){#[̕ڦ$?]m,+U+)3[>:&^>UUQX`e^tPܖe8c:Wαm+Zܰ `Z6fh'O[9yB{[)ĖU5-:;3+Oėt00&@Tn,$"""Ru9x*`q=Zxnc/T'P  <"FVސ/zR6&4BS2jjՃ|!+#[~ <;_Tc&Qya4bl|pH$wza !bQ3-˪ $QinX|ZqBU{-?Ucbjll ZʀlUscՓ(ˊj@fiv7hg9,AL(Sp࢈ʁ.11́L:D}-M?p{S~М6k ]n0IDDDDw̑/z _h)JEO(R5 t!QO0(sD [X\9۬< 嘙4{h xh Wpt䈨 d>\7ȴmU"@$PQhLٙ=h}RcXl35mM fX,gu f -JGz j{3M0-mu o-ƴ iM  B˃(' w䔤ہLW(?n,z{FvO1IDDDD^73k*f/pWt1O$f7uE׋z1`i1%M2`E֎ƼH H m R4,MԬ/`yx"4gH)?,?%S۬LQ2 0+O2Uf㮊`]iXܔT)7ϓ#+ c+RY[-_lsU+7WN󰦕+Abt̀j@? <Д'sr+rj@,;$"""7i ?`u[UY5-@DeLo7f|edd\z[*(8r's5l=3ķ x}>}\SsUr%""""*#дwd[X`Kמ6e#r9~t|9@ڧc=u+CDDDDt7(S]ΫGᡶ!nl(evU"Àѩ#V;}Iolݺ;vDPPUYYY2 ȋ=999]URR%?q:ws8qℼ}h߾=QZ5:~wt*T@5{xC16y]~T-Z@,Q)(SM woSۼ;{Et'͸0qDdgg#==*U³>*#URJJ Fe^WZ0bgкukddd ##-[D~K,q㐙gϢI&x'N@1rHdeea߾}KD9 nk[-n1IDDDDD4_3˖T[b%ƾjsP3"kĠ3?i >3U>'MμVh*agkѢeTv:UXN[^?(?rRo+@ܽM].^~%oz=f͝ CT::EͷAfZ=*((ĉ]7a(((PJx*Q~[1ז@Q=6?>k?8*Tիcػw[uCbbroƊ+0n8?vMʕ+rHJJ±c;v@Ϟ=QreTXǏǡC3gDJJ z`Ԯ]*CQI2  qOz*|\b8y(NAz4# u.>t-6|eIˍ_aἹ6s 8{8O{۶mW_~sSObIn=ǽ?o7cDW?Ӿw!+;,-[?];# Dl1=p v؆+Yli+3/f uBWr5Qocl-/4ӦL…'ؿݺk۶mhժ[L8gF``r|~aԨQu놅  'Y7믣cǎ;v 33 A߾}qm?y2ڕ4I4 ^= ˖O>\e_Fy@$Oawn8|(6l onWe-AժUFxmBպ \&O{]uHt:nݺ% \dWZm8w|_0y[DDul-- W=sd/X;~|E?l߁ǎ?<h]ǏW_}-Z#GZ'Uw `Jg|7$%%re8q"RSSuM6* ^z~"* \`&D j~[/t a{X""""sd@ƍqcݞ3w͛9j ֛h!tZ :mt>W׸Vo= %N_iCҌXz)xw/yېbX8.jլ^ǪrztǴd\n=kcI/T)< 1 '$N:Ez*Qnw;OKK믿~Xه?[͛7#88mڴq{FaD(o0y*F ֭<֥34&NV"-]7]x:ߩVj/n06UVS'ƽ2Z OzѵbȗUi[!VWXK~ɘ/C.˟x 05b"e\Ū[i„ 8<5jAE9ϟɓ';/hݻw#::ػw/>~!((͚5Cnn.֮]+o2dj֬8ԬY7nowk>fdw;vwiEs0)e z= Ӣ7(n! mz>X6nvfW]6h/m]: 0K[._<o&eNÊeih~3@aŲ4t:U9rNyǮr۷/m""""M"""rJѪzmoU-2>Q!"N89M"""""9 hRR2AZfs;_k}p z Go1|pTT *Uˆ#/olR""""6|Vv3H.E꘥ e/)) gφ`͞=cǎɔΝ;w^\z={ĈͧOK.?ĉ'py̘1M"˗2 ""+hpkx,"jzeVvv6ѩS'@.]PB9K?w}1c87D5'СCO?˖-C˗O?uy,k֭[4hBBBEζzL6 իWGpp0ׯAҥKQV-heLDDDi޶ NC/vsdRt'<G:uvxz~[&eiz`vX_ժU(*2\|u֕׭[/_vy,ktƌpY9r?jg͛|20eU_~TeoyDdVV =(Y|ܔi.괈F[[UXvW޽;f̘iӦa߾}XfG3gΠ^zӧOzO?;w۱|r<#Xx1>ݻHKK\a IDATæMm_j;Ԭi^`5k7|S.&ODDDDM"GQ""FQmo7\IIIׯ}]*WǏA.3`ܸqxcǎE~Jp5~lljg322аaC:I|""""C$! #ZǠAT'N-Z //aRjj*^~e9C駟ܹsKp5sAϳgZh{TTۇ5jޓ """R14D|t%b֬YԿI'%%NS ªUp5\v VBPP)k4++ YYYVYÄ ?^/"FSNGzV*M""""g0'O3Ccﺼ]`ڴi6$WJDDDD%M"RXX"o7c:NGa,11((( УGQǀ&ÅsO{^&ހ|juZDDDmkب[FwX!??ݻwٳNDDDDeD>$9=vZ1hn*TYS_A꒕.̩?qZ!&N)ډgfKh޼9r3/Bf.7o'x;cǎ-v""""*$!{w@`Ko7Ȃk]:-5h>M1x؋.k/w׎o&""""*$!ٙ!"ADd@`Zb4ƉkW`Ws2a0 ߑ}|Jx Lۿv#ʭ;΀&fNDFD377cƎÊחZjmZ"}yw_aC""""*äƷoaPSsDDDDeh[0pw. <7oݲ*-.n7Fs1Iw܅JxDD }^zzg] vލ?GΝ;j*o72-e˹?L /Tu ?DDDeT_SZ؊VEڱxذv}M*w,Z/bŊX"/_y*Q?l߁V ztm4|zC!V "l֭T9}"::HMMŚ5kܮ3b18q,Bg]?sV\Eu֮&}JDE׬Vb?Tڵ}Z߷OoܵW}x16e.=_oҖ-Ʈg"e\u{?@-<%"rt-J2uԩSv=ǧח|LK؏{k<{ ìևʕ+.˙5k`m~ ֯ ƌ˔$$-pXgqyyyP|bŊ~yj\.c]J%]ܠ7H}|R`&LѣGs""""^AIxm|TRe&;UTAvvTZz>X ;vBBh!l{y_e_4j, *TQbRy,""{ n@=\^ nZ[RףAG&M믿z=`׮]snAtR#44Æ s;,kڴ)-Z/z\~|'/{L|o|!++ T3럗 444hn0Ap3 :vPEX1/..Ǐ㈋+qv|?wv~9{ ੧BPP&Om"88+Vp99a#^=?bKoQ4i.뾰|Ѿ][o~?>}<-HmKNƍcqƥXDDs]^ ,u9߰av܉W_~5jm޼yؿ?8˗/rʘkҥ8y$ѡC=S9G7ߠe˖^UY{C18z'O9sOF^^NFBff&]e˖>pyG֭vmϮ]Э[iqv|?wv~m6,^gۑ1"""Gc+p~cOzL1IΔIc~:|VoL8zO(B_T$o@?gΞEQQ/=C(oT)}:^x!" xIY^{5DEE!$$'N.o{woFX"Ν 6UEjժaѢEOJ);wK0eݻ{/zgۙ"oxg{9l߾]ΨϻUÆ XhU0,Y*{jZoؿ?\֭[㫯rڧ hO>.wV4]i#qv|?><6mڠe˖h.?#3RfaU؉٩K~4ܩ_lrݼ  |-6_zu'/ AH=om+cЪT].| O<}СSb0-9m۶EƍѸqckC^""wN;j9u숪.퀀)~|z;v?Ç#!!Dlo_g珧+~~~ۅ.?#8g:N'%R?'rqFb_-'豼߫g^AWln8:}LWEaѢEnKDTb{6^o@_u5c"3nͼB(ߖXVF 9r: vE.\Ri8 Nn߾֭Æ ШQ#???4h֭Cf "֭[ +crU$"""pqrUcJxuGƭ\ʘ+Me˹#Æ È#pyb߾}޽UMb͚56#:u*rssqL:M [.8;wbn3] AAAHNNF>}l-[ c(N2W\Ann.&O={D;wƖ-[ }ݺuCrr2cƌWw۟DDD0IDDDNi4Zբ}[!<&Z>87ʐg^}U4n  /ls +V`tVx!&&AAAHMMCÇcʔ)nåav:udsy0tPh4C .VELL bcc T ",, 裏cYv튌 zBFFvZbwW_>""]Ή)Ac_@<nq=:Fӧct nNYOD&M¤I`@ȇhZ ]E(m/*V,M* ocn A<Y4k{,4|Hxd._@5""Q4Uⅳgoxz)T!"SNCu=a7X h6-PR(boQ" HNcdOۓНǸ-""cȇԨvDFM@x)DD)*nC hH"]R)KeV7^~~+me5'"xDDDD^P_^[Q)Ǐ?KT0IDDDDv)3>S4jhܸ1o~[VA F\\Fg*>O_Y?_Zϯrv$"M""""*/k׮ŭ[rJ 0M*q(իؼy3ׯvnQ仜?߶r+eWڜwϕgO\\V?8K,Aڵ%K|Gu8qS?OAPÆ C~~U{9%֯_ M4j<= ੧BPP&Om"88+VN@D>ΝƯ?ANv]`=ZQhۮ6*喕m'OFAAΜ9Q1rHL:U}!== `ԨQHJJBZZ]Eռy~8p0a&Oz b ^5kK.aΜ92dUݎ ;|0wnb[.]k">>7s=>}rŮ'8?-[oALL V\C]'ٳ'/_M6A_ŋѻwop>툫_q_ig?OݺuݻѠA]v[nnտ{nٳӧ&NھgL4 9jժ+)ξ_<"""seߖvu]I(/f}?wߟΎ#;vի_~t裏cȐ!xG\_\x5j԰z AqF3Gz~%Kqlm۶Ue;:>2^A@AA*T`{>A۷퐐ܾ}?̞<:u뱌lrobDfhw}BDd BNz OyF b)VeԪU ٪2۳\ҥKWj2{mcǎy-|>΂~RYOZ*י'O]jꎭ[bɒ%;v,N8\}-9:?]9Jwy?~?.](LqXz5:o&FrtlLJ+/fsY+???4h֭Cfp}aݺuhذ~ɖ-[_cVW9{Xg޾}N²e0{l̚5 +wnݺʕ+#00gϞ/\ٴiSYjΝ;c˖-CAArnڴ)pMdffZ'qvWyy9dB-gq?Gudnj33K~ B:uf_/u_~Ů읟~~;ߝ̌> hS7oCߝ0pܼu˪ 9pBhZ 66XpL-XTPsqW_}7FBBBBB/^+>|8`i-Zg޼y:t(4M09|0LV.A{ ǎSMJ5k`„  AǎѵkWǶז+V`t2Xp!>6lp;ktv~g}J*}իvgss9ҵkWdddW^ի222Tm~:`Ĉ AW>_^ 8&>>qqqAPPRSS]gg읟~~;Qi@D>d98QQQn lu^#mΏ>UyZ3YN TR h!DD?_+WĤIo>n'"*@$@p̼L f۶!iF234`ƍv3J|yǯZjx fQY祧C9/VĬhtgY/-;&O{RJ3g rGqlLs0?NAf<1RpYƻ!СCns$ģ IDATvsͻ#N8ݻcȑ¾}?zYDtqws5K4hVV݈t?&v7'*$`~E 4+VDŊ1x~E,\\JxVMDhסnU£[qxT 8{}~jCdy?srҿn8ơv8?V뮙3g"%%zBpp0j׮{z<#c!"""""*y hO۵kmoعkjݏ{wnٓ퉮7~ú8];J%@b8y(NAz4#kv3;oāŋH_v؁LDGG#$$}g $"Slw"""""14ɧ^0arjݒE PJeѣN3aժq|;00ӧi]n_n7_Gx 槢{ޘ=3Y.S17srrpi=z0~x5 }uyb\.c]J%DDDDDt7c@|Z*UHTZUN f@PPYsqQܼyyrWdgg#6&FS9.oOHH/^*Ux"; tׯzGDDDDDd Ok.Xo~Ѿ]}aC~d]'2sϞ;0Rw5mj;V" uy4ɧM4+7V!_ׯcaJ@;ORmT)qFb'ؚl<=1<1պÆʷ'$ńıv ĊӰ4f¬Y/QPd\LYYau:v$""""R M"""rJytX, oh~3XN*GDDDDDT$"""4j wFv X*CDDDDDT圈4ֿW{5DDDDDt7c@ȇhZ zo7Ȋ(nAc&MG{&:!"KKB8Z9&""""r]Ή|HZ1hȣdgeBgs" sSTN"22]vCLlRnݍ$!:?4j5}M!"HQmv3b@ȇ0@DDDDDDD$""""""""2M"""""""""*3$"""A hc&af>-ulڴ UT)7Ǒ|ex /T퟿T#40Qr 99_~%_(||M""";LeQ QYjs.IHHHSNa?5kkzY u@ Ԣ򃟿ΏA>}0c >&M3S8::^^^ׯ6k؂cܹD=z4كǏc޽=zZ˖-SCZj ǎӨEV\իWcӦMDll,Ν;'U}?QE1ЮmᙳiNϐWϗ(yiDDDDl{w}#lwWT|_Pb;vlݸAJ.ΔdY}O*<],e-i322Bbb"-]Y&rssEwqq/wWWW8::Z5-xvP?ioCkF3נ|_~}}<|sԯ_0` <Æ U1rrrPzu:KUQvmaO%͟~)0a^/^ķ~+[gϞ-s|KY_KOL~]߿ʞX?Vɓ{n 4H&%;M `*7221ضm_C?#Saa!߿6m .....r)njwwwL<+Vo&,Qo&мys_UHY#G.(,+;yR}834*?TqGÇ1uT4nuݻuֶ۽ѬС{|@y=zƍ >Qv׮]C~~>N<Ǐ׮]yO۶mѨQ#L0OWL+))I>e*Shwzz:.\p+kԨSfsss 矸~:N3?^ ~T 41yd-((G@@AAZ%>>ov_UET$"""ܰyf\zXz5&N{h׿@rL,^Ri>fAdqvvFFFb411[oݻwEh֬vލMD8ϑ;vFm ˍ%vvvjs`OZK`Ɔ ??٥JΝ]fA0n8|Xرcg!>>8Zoݻ70|p > P>}:6oތM6a_8  ٳ̚5  PίoȐ!i"^?RRR [0p@ʞ7oe!//KؠF>&M$_{we>hf̘vRtTQu} 2D&}r@VV_ʤjb?md(߿ey&mۆP@DDV\{鬎:v{{{DEE[`͚52e< ɽKS0zh/Ãd*U,_Tܾwn;n[7_{/ܽsߟ[-=M""""-ӦMâE`gg:u`ؿ˾]g?=llЩfxz:avpBZjj777t4iF%:^Cx{{>D^'bhժZn ___ΰReѢE^:ׯ @"͐ 4hz ^^^rHR ĩM4A PfM,X@q!##ݺuS͛РAXXXOxЖ-[0c XXXk׮2 \_55 ;w 6j* GӦMe^Fk֬kkktIKڧ*?Uo7~ki{{{E3g̘VOYe1c/^۫-wOWfַ&/6e7~)SHWu~H~7Rԇ :9N'8::vv]lPfsu)QU}v5 111jڹs'{I7} Um!&V|)+WbҥufQէmŋZ~5йsggkQǀ&.XC DDDDUDb-ηo_Lr=4m 5j,DQnT6yN B DVm1mx䜈5 uw?Hx5 }&Mjk]D{_P$ DDDDz(PI諙eZw;wRyH :hf/oR~gVvM""""=(9I_ ffE+ DDDDdX M"""JH"1ps󀅅ݽ%G~g9VȤK<#aoɓO@* +Sg5F:zf""D/??AA!pqqu 拌2V6>%KYT?3F ΰuƘ1ŋ,}9990a lm&V\VbگDb oarĜ9Aܹ 2rpwi KKt/iǎ>gggn݆HN~"*_Dm3 #d~J nBʮmPtOl|`H8953ƍ/_.M"""J**G?~<&MwtF*. DFvúu!,##֭ !!⧟!55;v>ÊaaKpU\;Ɯ9dQ6>Ri0xL\e̙ܺu7o^CffZ/u?!>Mō8\pImۯԩqp,Y@=eV GCtn<}={gMFa-CukO88؋?p`-|޻7 W?M(^_~5g_eQ5~(p][#33AA j$"""CQnXXcɸvw}7I!1ƽ+\*XrIIYcӦore`iYCtce ,llmkؿ?Ft;v_k…ժ_ڵk֭={=ҷlajj …BڰaqT0#sǎ>|L{{ط/t?U\ޯӧ\jTQ6>vvؽ{NODDUDDDDmjj<=FlmkKL, ժe Sₕ|8M',KW1\OJCDDT&4RS GGsEAgrd邓S]|02O s/9E5lXF SO}zIj5KDDDUUA:GN=OW $XZ:2V$"""YIDDDDT1c| U\jNDD4*X z䜈 DDDDDDDDDd0$"""""""""& 4`0IDDDDDDDDDM"""""""""2 h`@ DDDDDDDDDd0$"""""""""& 4`0IDDDDDDDDDM"""""""""2 h0w^7nVLLV7gh`@ H`틖[~틀DQnQ%DDDD4]㽽A*M/`&&$"""EBu8q/._ x+K |`nRq"J+.M$"""zp9HBvE 9szW}Yqr e`"""""u1IDDDT I$ؿ?nn~YCۢ\,a\,-޵NޏW,K/~vghJ$0 VV+Pjuꭅ DD= +hz;_=^*'`o {HL|Ri6yVV+dQ]>S):g%I$++G̙Ν{ں"# ˗Gɩlm1~ddgg ۴cN QnC$'?݇5k~ZX[ćݻτ+WG{`k 5k.G;}[tbΏM"""J**G?~<&M++:Iӕ.>x.~iRSc <胬&?$֭ aaWno 9.;;3<~<l*M:Gaɒѣ1Xl~%\vn]GFF_(ƍ[χE֞pp]OpHDGGllM;% 'q7RS'!2vᆬVTe#""DDDDTxx(֭ sL>׮^nu6f;%vV+_y.o^n;))KooWx{N~ ^+-0-,,L0nܻk<vڠukO@^pǣGmm-Ν?iÆ ƩSŒ;vc!jտzS;/\x$v]$wT}Z:?GDDD74*)GGayyy:#7?O;ZХϵj#OL̒K/ -fk[݅VXZ@KϞI-[z11w0bA4h ֯VTe#""DDDDii.xcGө<{VȬUTh.^4##rn'&&]ÇfL&$DDDD@Mƍ=?lvKt%*6^Fo*}ذ.8HTݰl*deDbbfϞvHIIEjj1xLzV03CO ؽ/cpJMѾ}ђtsscQղe2uR>DDDDzP2xgtRHB#g9 Вo/SOeKGu{aܸw1sf,f͊Ÿq"8KCBɩ&6kԾZw]=t U wpskƍ`ffyrBFstY-낺u-Ъv&ȥg`o]#lv?"""23RH{䢕O#9QHU/Qw$k̜/*+PС,W6){cx鷋+==#2̛iC[`*/[j_Pf3bƌJQv-tԛ;thS T\={j\L-DDDT9ݺs-[YJ2?;R 1HU hUa˩b`khy],-Qs""""*FF!"""z͔s4HE-̞JqAH$ hnqv0a+﷜s9Q31wMy/9g@t&3#(Zr^ .9'""""""""")% h-9W䜈tKΉ`p9 .9'"""""""""%DDDDDDDDDd0䜈 s"""""""""1IDDDDDDDDDM"""""""""2 h`@ DDDDDDDDDd0"""Mnn@DDDD+DDDDDDDDDd0$"""$k'00Xt}e7$IM7FWhS 77\xY """%DDDD4]㽽A*M`6f:wGI:-S@.tZ!ڵ3N.)DDDD$"""҃+jdIg<ȨCpZaΚ͘wgVh;uNյZj 4^A8z7mZw 60mڴ/cN)DDDD4@*MfMܮ(sO^"n'H5?<|uBۡZ:Q/ssq-)෤'C.1}׮=zn + hUB5,,_tVO`Xdi jdiĽx۩@۶r|}˥K2"ak cf~榺XB£>|\ g/\\#|⋩53ҦMGY٨[!|E3cqϞ="""ghURQQ?񃰲Š1iҴryaAa!>..3ٱ$Y! s sX7lff1 $X @*BX( ]|[bq@ ̈́K˚rW@V# 'N#.ZmPo6n܂?,CGѺ'uR~aaKB8++K :H$"""C>}2,JuHB_j|˶6N}:D.}04Lw8k cEEjTN5k 33/$BB[яJ """䜈*f)t^4p:D?_::IKԪeZjȥ'&f#QJ@RRNб~=kIOOzLWhyFs۴i QhSmb۶HK{gϡOuZ̟  P^wEM"""\5##4nq?R)fZZ\9 %eJ#'gNP\~٤ЋyyPr;wLdd<^ Kcǎ¦M[wozss3?o|ܹ<&>h&{n""""m0IDDDhx^f#cXrV9cǢatmw[.O,^|yw/GQm@s}ـС\ޤd̜ VcH̜=ڼ4U+M˟3'2PiM""""=(GPhFVp:E+m0V }THaa2~I~dpp;̘ [[H ^ MlkNM HQ\kגIѣyL_lV<0rpL"JTH,?Qx.]:˥iS%-.]x9Qe遪(J,5fBC>lT6_EcOUi5A\H֭J:{yiSǗfdd+o\ڮ]d>/\8_={zؾ}]vff͵)_츝8q7Ӻ""""]b@ 4ݏ*4=k?''or)_?RneiM""""rpI[Z:Se>R򉈈 DDDDDg)Ɨ`@ DDDDDP:SMh_W]*ڜי{}y}08Qf? DUDDDDDJj_4]ͯ+ TUUbOCgweGT1IDDDD7fh.Ư"Tb_7oU+߃5K!kiC"KhSu杖8ŶX;wZb޻g*dUlQn[CXM{j m&tP"ܺ ENsQZNK[杖ڧ^bh3k\\NOF^vZJq!bV4z6up!bZK`D|?m1s)}?U嫺?B%= qrNvp:Nt~uǙT1IDDDDNgK4wF ANE:y\{3?*sϠ?S) pIm)yͨ񃘞wȤi:$s!?'_ܺ/n^43EH?. r9r Cwcxgl낲KxdIWr:\YGbf#UK2u9r QL>zL%ff"6hQEGUŴ_+~韪mNQ8d9:bVW|(UE hk|呮ʭCp1I^v;YXVΠƵekn[/SREkT~W~4jvXBPX֭9NkΫ5lmkCefpv*wL-ߠkcs8֢; |noX:9Բ&:͟DݸG,`ш,Hg}?]涵5lA{FF ղ?t'i{6k;(+_Q]8B]wd>z,:yO}"""" VXP;<@>p6l1 `TM@i: -/b JIYZvp.DMw`ba/n[MGayy?SXs猬'OED.I/^9AHZKquEgF5ccXn*bz7Rnނ#m*VS&eXZ!4;vaО2e+{K*=W-şb]=l MU. C`T:V5vCk3TH2&fftm@}иgwk__(0PV~ OBS9n][:~B3`s|mSG~#D͏#cտ/͏^Q{kZbUc7Sȫ_kZ"ҵ$5k4UOOmUT~MimbuUFڵ-L9Hڮ˜1GE\^M?8m̘#Yg5ع}1ps󀅅ݽLprj[[g?٢ME˖P=7n-[ i/0I IDATjgu3ƌ/^d .šG>uF͚h۶)zj ^_ Nu ^;cuܯX+evk,^P;'GS1jgrjQ_ƷM8v9;;u6Drz89Ł?k|c}·E3XY¸Z58YZ"k'/KUbW SvVduM""""zٙ & 9kŝvؾO$KemźwoÇɓ5+Vr~}0i4 .ڵ˸u:22202JknHK{'KB9󐓓[kD``>h?AJJ, öm;eHHxVdt(~gT222Zj2`?~ ?"*G8q+WAmW:֭=`/S&0W*M z97:/곪ϯ/U勩_Y˛U, hk-0-,,L0nܻ¾+ ٯ_co ؀ѦM]@RR\2ᡨ[,,1}d\LzXֶ6`Dbjlڴ011o`ݺBzt-mm"<BRRS<+1}lܾ}X|1 ޽x[ڢVg砖Y !YvM%ػw̱uAxx\mڴBÆ `dd֭=֓fj||--kضmƌٳuz87-6~(W7FPPt}/c᏿5?\k?U緬/Us~"(B)~+MPXPBR (AZ$"""ךXIrirǩRPP4_+Ç턄^=g2lʷ>ذa5._O&`L"$˫ ͖pdAZ8.)V؝;wLdd<^QZ|{n[ɥi||ǎMb(frp|_oh;o|ܹnуVA0NeWt~m5~5%-c84mZ m i7,z1PXXG̚>ڋWtEqwo7JyN9LMM1zxܾ}7_H_0&MCn޽{a!}ʔXx cn={d -pe1T mi`nꊧY/1bA+3>}>'}  Mn&AB m6Hhp$4 /W7i&wY݌6Hh`C~ر6~&c`ϽeiߌOÔ(W7!G3'S vߡC;"2efɉuur47sY_} p K*)s.6NuR{YyT|9M0θmԨ:wVZP;vZ9s1#J~ V;;EzH\v>Et7ᑊSe4~'K#,}t䘢ֹ*O;WܕE MHIz ]{ix,w9Q:txU+WTtA}9psgNڵ)/h޼:xy5KJJR۶UbՁ3ioyɛG1wjʿmЩ]/84}+U OW[vX-w57sѿْ_6lV Օ'OVÇ8{+(ժ3YhhM޽+66NzעEsX0CHD0:t$iQ8/p촌7Qɚ2eBՑ`ȯ+, _wC5zt6l i⥒XX …C~EE-Pɒ) wܿ_}T``aԼyEݫTTQ|ʕKaif9sFG~Ԭ T# VH6Ԓ?T.=N4d57sѿ@B ڸqvڦs5 8ĩw>nԸz7Z^R/MVN=|`?~BÇ?Px ~Қ5af\\6:䏭~cǾשSu^ 5g|EFՎʼnڵ:yG?~X~g1ƾ}ڳgNU;v4nMwdtm:u\?ՠxڏcbQX/-\\z<.;Hf.ӆ&@65s=L!ɓ[Cc~vZ?Q;W[*0_XKLYӢEsin"1,Ѽy4b͛7K>>>N:t֭[2X?O@k_n-B IRuTzU]$iժ5k`:uGX*P @;vl5kk , ͜9ŮKIl7 ۹Gs64nO{wxQxʳ_HkhdS!>>>zb VE/sΈӌs4m$V^7ovMu-sϕXgj(R똘{{{NHH$]rEESJ]Wjaaavՙ"&Y3CBbٯ5'~NLYz|Z} }P|eSIҭ`SyvAf.ӌOo^ФfezeSP˖5l UZEf˲]{kj׮;cʹ5/^2pᢂ;44TΝ7L!!!fW貴Fq3v]aO_P`ʳ_H MPdR#IS~'֤Iٳiɒ:sS*G_n?:ZcDqƌTNN yƍ<<:u1c"uM]~CFwjU?T?Q%ӫi.V8z5kT?(!1Q?yE#vջ5VE:>k_`9K#13!>|q`"5x{2d6lLx=|fJpu3mYqV )>>^:IAgOǏ֚5m>?ix~ʔ(#iMNkM%IFkha/Ny?:<[FW t>z/]26"3_7HhrG`C~ >XS=.7Kh6o^kmHѡknV\:H|W'm? a{Zz>>>y9e b[+$???}b}b-I6DN<ޖ}UVj3\.=^#12g~3m @FB hCv.O-^TgOS2~N׽{M8NAAA:uڴimp=m>487sտ'GB_uAjРbբEs}W7 288y>Gf.[Hh9LV^zz^gý`7sѿlAB y{ Hhp$4  Mn&AB m6Hhp$4  Mn&AB mxO8W7pf&AB 3Ǝ7m,C߫b.hӡB:t{W7l)OXСc]Li/+99Y?L/Mɱ7nAu෮n #4\ DW4L媄ԭ[/T}vj*o`.]Q+VƲ;wG ,z睿nvRғ Z%S@@!EE-0}͗zN 4yrv#I +yw!IRѢEBCC4m$_qի-;%J׀С#%ICUx1ceܸJNN֔)uڲ m[|֭[lK8^r ƍ[k6ĜSNi!N_tއ:W!s'k)ƷfРھ}̙ȱڱcYZr6m\׮Wշӱcԩs""&{eźyzX>zx=|PNsLw1{Rz/>>8 0uQķž}ڳgNU;v촸ORRΟQƩQ$IO۷uqw>hv܅ %IPhhjzIk6mZ >XǏc'>ifzmذY+W.Sb֭[[.\ŋ$NZ&$?)S0 9sBCC$ICɓ9-vw^~F3_18L[Mu$I.i+V>0aIh|K4kTb/XD֭2N1.V.]h,ߴieq8s5hL2%-/RXX$iǎ-fGu+WV|I{wԿqִh\;v w>>>7oڴyM[S8~;6@TMuvK[n+4sZTJ2LzyQԓF%jm5Loooy{{NHHC/P`/P)E6y}Uv=l4˯^f!5}~ķEJ23-zN:wtjVRݶ;66N3fѴi4fL?if;w^T^Li&Sg0^ roޮwV+NF dJ*_ZD_ki[ԣG7׬Y]?h'wnMnO}X}ظm&xxxh9ի756rPknV\f;Io}GI|=Z|iS2pСC T<jժ؃/^ٳY] _N!bHhrM|! m0B3$)YJV%%'?~:Y{tʏkx{nݑn̳e1q''/f`7iGBEZK0٠RKiw펑ѓ&Xi}$pɓ'/fR͌Ѳ#˴F*Nuo*(w:WeH΁IL9ÇdM)#u릀mٲE%JPllkjܸɮ Ǭ]V3gիUJܹվ}{[_yl)틌T޽h"ʕ+8$#/SoK+׺tVϟ̙3UreIRbbƎB )wԩC֭Srd0TR%}&)[EwQn/u]w5o=|P}BBB4|귥Pv#F~ʝ;.\hgժU*[|}}/̙3Ʋի뫯2c=UB$kgݿ_zeRv:tH7|||TF [ήOŷ?XoKyxxh*VɣٳgߓSKe˖rQ%ˬ]G9[lQTTJ.-///]vڹsOזsܹ yݿ:7[ڗ9,߿_d̙5k`0^М9sh"I[onݺo۶m:w}]o߯={XbR…5gڵ˸Oz/ʕ5sL]p>EDB&M-ղu\ؕcVd["l:>)3eީSe}ZܹQF|nv~w:p>ߚ!ChΝ5k&Mݻw$o߮[*66VZR^e}G}d|uVժUK!!!6kڵk֬믿n2*vƌ۷o_~$koտ]|Yqqq7oZYhSݻWӅ }vֹw-\PK,;wo5IGvѣg-tI>}ZwرcM>kGU L5h@? ;wjÆ Z~vڥ%KX#+**d4oz߼y6l(zK_k?w\V5je˖֭[ٓNjuk'@]ݛZh@B>umm*_0s4i"/oryz\[(b_kVZd;d۞od]I=\ĤDE<l)4U)4TccoY7ibWk)::Z-ZPN_T,/^\_J*%IQJtʕm˗*ȼy*!!iL v3<DӧO^ztRqSo+Rۧo3goTUGo%I:O<ש=x@ 4avm/^\BBBԾ}{uIoӗ_~u5R&%ɯ\8>0B퇷Mݎ||YRΝU=,LOO*XP+^}U,?uTK.tP]zdd$?TlW^UѢE-jVz._bŊoO-ooo) Ӄ꥗^R޼y!???`SS7oԾ}r|JCСCʓ'Y2331+w&k_~/jРA*] *?i[lKܹs*_|G? @SLu]]V/^TNj-婗ðZ+qI]J,RJ̼qㆦNj$z!Ch֭*[$?oH$3E" B*KߛlwR$+%5Zg8KZ~N<ڵkkڴi S~O-\L%%%eOPPZϟWPP񽗗h˗MOBtY3*3zէO]tI׷۷-[5k֨UVʝ;]wQk׮ڵkձcGCz]PԬ]=xlB Z|=X-YD D`-q4QEɓiKT.\h\c0-dyAdY;2l#y۷d޽{'}j*q"##o\rvߖW/GfͿ౥ӻׯ4m4թSG'Oӭ M[¿ 1?Q#r\__~ʡu J *b6VBԿfM+Gr@ӧ٣~A%KԐ!C$I{V߾}u9%$$j􄆆jv}9rnܸׯkĈ&OG\t=]|Yקk׮:tbbbtM3>X Μ9 /Of I[OYGsڵ&g#guYF2)OMߊ+h۬Y3m߾]wÇuo-q4QgϞ:r=zϛQk狫QFZn^D?^FRڵ%M-QtuݸqCFJs9 K/|~:6l>>|Xz\Cj㏍VvI]VvZ\R5jP6mm6oKw!CTdIڳg飀 MVW6nu;GoTzhϫZ~5X@wgj굩rMeWbkW_)*h~~]nɍ9UhQ9Rǎ-*TЋ/S'U*U[kֿݺuӭ[a<[n]k19K P ROCJ$qXQʕ>54}Zz6m]k6@y p$I1o&O`M<:ÇZtz6nh| & 6l+66VZ?e#jذ]kYʓݥZbk Ӑ2A޽ջwoW7#H\=pwӁp$4  Mn&AB m6Hhp$4  Mn&AB m6Hhp^n&I? Cr 7AB`9p{vruWjNv?c$)wA1m6Y&p{#"+)9IIIJNNRrR_:ecaK?i&>㫡Z;k'TNzF72+wCe ؗK}";ꏝWoNmrNNBʴ~Fkqx饈RỎXU7szyyO 6uoIBSSs1W` Mzz75#&Nk^mgW okl~zVW *ժ39g1xJzʴt +p?3 mm%{{W5?݊;񯝈Sd7Rno_U^^5xtKx`1Q+pܕ5/ªTQSȐՂbN)tkojӯhmy3^+wk3/iO9HhG9ʘq*VJ*)*9Ԑa5g4*9|Dm՝??|Ig\ N=B󆞩Qݮzr[Y,{vZܺ_uxf5 7qvIW -&ȑ $%%'9&^jmu7ڙikw=NW,[z[Ƹz"VXÀNNBGeJ:IIؚ#DV6'ciM9Rdwr]p^y+^dWdXF_YoM倫(}uiٵ]vw~-Cw~-C1BEFMovje%&=uS!԰I .j=v\貺g +ZXӾԵJLg:g.O Vp;T}3T`ɓl-THj7Ȍ&"0CʩFYRS ܆MS}n@w(&47nݻ7gE[-{|2M#47n2}P&AB m6}(' IjԨn]lSΫV*@F0 m6Hhp$4  Mn&AB}~ Yݏ&۷Myer;[.۴#4DiL9fΔsZiL95͜)3@4slfΔsق-̝6ܖ(X:hkK$)=U+y:d\znB-`zoH>a\CQB+f>0yKv~ףS}߽풆@jׯ\Tܭ4tv~CN98OxcTgUek.\MpV%ݫRg*%P&>L(^BF@g뛥Nh|Tzlj3 -vUЗIP;T`ONMw,ԫpa(-U HةtrQ93+!"B$!"B$!"B$!"B$!"B$!"B$!"B$!"B* |6֢VsɋiGŧ>'Ca?eNTџ$*7o}k@Qoycbbb 33@ܕRhZd+kq}Nx(*3ժrX$IUi#lN[BKB^t\Wh'ޣ-}$4}Vս8_;(*}HIF Xm]j:r3Zԟ[sO}իrZIRI%DI1xDI9A,}5IMaϺewNb!^SQzkNMMLy/I=ͭe%֜o( ?+\nJRrjQSL8qŒJ%JR$I&89۞>ي~?R1 20XWʶWZw8|oLxn \z6MnjP[/>A miP JAc5cbahsNA%] nz5V[T2iVCiBơ GKS:$=r?B_jp6ͩz!Kmҷ-ڴJN@ 8=YM5I;}0+.$)܄O>[íV#Rwg.aNNز;KlI4em;ɵJ˴i^.hm! YO'aS:>Cuk_\J'ؘJ >$7%*Ze jTf, f+lnGtv_#o8,0»?S=#dG|{E _:b/Z h\2uJ]FU}F2ei CR$ AwG1%8\H=c\,B9$!"B$!"B$!"B$!"B$!"B$!"Үy0Ic nfԋҗ@ɔ|UR>ܴ;֔'{Z2TƬc5n$FBa{̀YwG\wh&{)MHK93=??2Xe-Q BIQ <oUh?Lm4mte(vRjsbc!^F c[.꒪jbמ8#.-Vڶ(Fn%J$15x64<. eXb.+Pht)Ox{f#-xtxm0WKv<¦اM.X@RʜK)x JJ=#Pm!!N?N"wȤJbA0uRRZ WDlF9",Y*uN{2+w$*^lV=FpG=?XyW>RRqz>M1S8F9F7^Rk2q~ҨR{ZѾJi*8F>a۸GX9Sh&!pp;tB>VdА5U<w$ƒbb ,iv4dzrQaLu(ԭie@eA$%8GeKTޝ'Yq߼W4Y)6h袪>'2m 6ԯ(^/Ȱ5nЄ#UBB$!"B$!"B$!"B$!"B$!"Zci3y5K|]RPnV]N!)ܵ%#$eJvoKkRH^u#fjEԎ+:꥝Re o 0?Y*،?(81tD!1$rom*q[_ ^z,uetZYGajr^Z&Tgyش%IRc־u?r׽RܳlF܆аĻA-14WRVc˾!Wд ^F\ana|- >N|M:qy4XG3nMoꇞO?S #g7%%fgZqu(iTNR$bib +Zћl' 9í3Ql@N=;"Z/> )!yde?$@"-8`i*V,>㙎`F^!%CEXqTBq5TkGpx\FXۉQg͒syo)&\ Xl(~#T똌d[sH-,=KtS U+"6ٍ0"\RgWñ2B{buL-Se5%I' PIW=b|eztROVsy@uI+Ψ0E?ev$!"B$!"B$!"B$!"B*3Xz;5NJ=-)|]fJԛYp6a +u9].tSmU1njd?r㭸LYXA  zy4ę۳ίVvн몽u>Vuջ=Q qY6R-O\[_/jAP¯__kc[ؾZq'gxJ2'(2ʼ76V!cw~j=mW7C:zBBy)nHʉ8zGRqg>4.%fGoi)&deN!hX!CzŬDž͙r!ބV4z=&)֎r" 85W(IYV1CT)C$Տst+2͜<yLImۀoNv1ryFcRؾ([W%Tǝ'=.[QBA#-C_|-U߸} JŻUyJex|gW+HqZRQosz 8j!bl;"|woX uKuI+ʶΜN';Q6 u!E;X\Nr7 q:w(!7flNTlԜfĆsi0M `|?AHN9L Iuk/ +Cee%\P -FrƖ(erwQlPTRƘUaNl>j9vs'bHFh-s[_El0#QJQmw ؏O%t2#b=TQ$8{g&ѥu]{rSjmꅼeKU 7 ̡{f!t*J[ v6L }Dē{΋WQ ;B9KHBD!HBD!HBEL\i*[ڑ-kޑ:{[o Z%B)/Mө5*~N ;E}=WWT;͆o];VV-]jq 6҅Br~Y)e[dv%a]mZs?QGTGgLy~Lܓ+NˌdT3 Gz~ZZW̓Ү<=:R䓮)qֈIPmWN-#ZH-)+tVܸ(K`N^m9! 9;r_NfLnc`. A@⼎%"c98~5\5zܕ 'zӕjRms3.:TZ-D)DI܏?LE2Nɗl8 lCVRI̪~*oZ֎iRWn'kZӨ/RH~fiL%I8 B.y2D=t?`YYH;:Lu[BYSgB7$$/q'tԩQ$(IqrөC@%+H8O=rbmˑ)6S'ǘw=)#< ={W1#ǝ0 ň kG9Ӳ'jφ$Y|*BJځd(r{0U窮!G$!"w1QX쭫F&N[H]ۆ<]{DfUrW## !\׃OSڜv}8mPear#o_ELt)T7})?Ex1uF2Ui$n rB$9v:gtuڰ3#T3?vͭ mCk^ZT]PV"JR! 0F\>JRZ;~k־6spIi- n[5 ݡD@{uQPԛndk+S/8q|/| Tgn, nL\e&~*,DC rW*WrylNGx96v&%#?; }x XH:% H"41D)ӿRhzvڟv:KJW˜?RShݝ?W)UWAI⤨7oI^9Xle~]z6<$^/hV7W@X=LHF2@ _2=z]eVY:TVk3f%$*FܟIӐc{s RB[B%iqƊ@3M}ju!I0I 'mTdKE{Qʒ]o{EdX XB$!">s@`O,gjcj*wuGd$ޘq$嬭%I Qð*u-%a=]M^KJsu*yVR;Ϊ|iaВ?j:Zϔ{ Bۊ#K[JBƏT!Rup~ݧ)@JiyGJKŕm_go,zKkOcDDa_F?zꫫ#1KӨ.ַRY#!HJvv(dO>''wΛIѥ8McF[OT=JQ\ɿa萄#uy0Ʀql9ϴ|္}}7zZAl,K l`'$~t`D,xh~Ys]fΜzvvgjaO7Pp%!#P E:~#wKKjy@vG~G^ְk1:RP92Dgp03)Rx$>'e!h@ Z<3XgUu nmp$9brlB2V hI\֘#O̸h%I˽t'j/[)$ bv >q?b:qԙ47c!V4S,E,q'L-iYsrVK; Rb6ۡ43ilknVД7SGh}yd]sc_mAu"QN$u\`)>$v?Ǹ[GKD=RK1hFV]"+-0&Fc%)v{bjݡ}6$DO#0N ;?8=@ ǹ,߃$ RI@A?c3Ȏ8ÍR)*7!qG[֥ijG Ϭ" :()bS wdzLpx8$x[w|*%$yRO#$opqB9Nw.ޣOQtę]FiRҝm Jq(H$(q)Y%3׳ ,(8|>cqAϴqt_/4-|m5*K%) 5wlU tT2e| õ1jU}{Y9)*tdҍ0 ( Jy'=cs/M5ĢFFlTyM|߁@=Vr&C^ÁdѰ!G o$!"B'}Gh;BA !YGzjr~D 5j` Kgm7Q4fIىz%*K-m))OҎA*8JǺh'P\b%*?ٜJzQt+k-/ ?ff.WXޛ!:oy+RdgnzjY iUK' CA0Kb#rVjfJe9yu !@Ac8W ŕCGOˉl#gh~}D+;FeAP P&ơP "^:O5'vjk^j^!(JQsQ髨K;}뎞Tei5&Q//Ve 12쳁A#ex?A؟ְAG5O` 1ql@.8f?b~E_tm71~=Dte-֔YR}K)dp6Q,?Zl[ZH^TS/ kv.&U*WzsxΦX%Lq]ϩh[i/) rˁ+R)qQ핫3&r-s280*&*@ktp,Fa9kZZNNmS25iDOSN h8qnDKhsM… %|$d_ri &*,'L ve,܌820g<,;vIZ)ĺi*q8 ?\4ioj^ s\NQuS5YGrf|߳|3ţ&`$!nNxcv dϤcf&.#Į,#r[TFv΍$(ϯ1@HqChD G8a"d0mOHTTd}G2A1ߝ:򪍆U:eoA{v_hGC[tAj'g =Tk8n8'Nm>aZFPM*B">BƺEbAEN>ퟕWs>1rw=mJӚpmn`$YU<{b dAS,ǚʜ@ @+P89ϰ}9aD{7Y!Onqaq{jmlS}U΅6OWw5wZ*Nʯ5d%[Aء yΈ ߣZrbO539~dfh@ q\q ϴhvc f9Vŭu5{Z˷*eiEL480ldO5Xk\Mn-û=> Iӥz/ҁIi;gnIF̥)J$O$Št7L$KB3T.Ja.ɤO(Pϕ?2C#",ܻ(i #h~*c n NH6$bNYuep5_ Í?P3@ >-*{$0=-Wԝ3bU,eA!($1.Bѹ $iJ{I  aă_Z`\eۢ.LOؓ*4.&́RԤ>E$p=WT(1) _|Pnj>>NB*،E݈L?8B9N9px>'7^$ ׋@5AR̢^lk3< : k[mU^7#FsNu™)UP S&m[jRpl:ՔA41~''%XÇ4DmٳW佛+mO*J }vgej5a͗L6QW3r?xM'i _Sjl4)y?16& 2#BիfkȔxcycrs@ 9=K1du2B6*}^I.mC̯p#ן#jc BHB4mUϠVѡɄ#rci־FYmV:1AWiE/q/3"nSS+в褘-N/oX.w.0ﲑ(i}?11P?꺟Ǜ4_?u쐄#}_iQЄvs5$խjsJi\8$)9#?./CzSf$ʗĩ>S JOI(Pܞ@xm*tY=pG>Jb4F拃"]JޘuѠ]B$ZƩ@ZjRvьSdy-?Oq~}]o_u}GJjbRݑS+ K}Oc0;@>JňWy 81ܥ`>Wy\Kc*u_HBmJΡPAҠKiTˡ#>ZHަҴӤ^4u2{@LuTRm PQl,k)F@J %[~߷hR۶hdKIIa$% %)H$ $1c)yOwf ~ /pO hxBncwi#aZ;wT{ cDYiB !"сϴxq]FqӪUCJʤ~J2K y%JT{,؍8 ѫoa5mD42Ȃ,WQ~vͳE i52&eBx/J&_ilnXQ2'zyڵKX|5M󝮴XJ>ae={:iRIu7J̅akG^m9+e8VlCWAr'8,ݾڕEq0f?D@Kma=j^iޱXu ~79ori`V)FП9'$݃{<ԥm%p?H\!UV' 51Xmmseפ ww&m5iM,\T|ie%u%Ġ69嬕B`q+VIŷX4&Ӊ J)x >%ܵ / I qJHY)Н *Cb Y< >;z,,ic!\oͨq;HcڒTS;JJK>\ԌiK%+ :.ck5|$8AC>J_iHT0iGlđ"(:8n#S6!%htހ/)9Bqv!L7)&yՄ2i*R֣$=|GNjV2lۏ giRƱKSiDZQ(_y KJTw0~W&dm1Ii‡gkO႑GPSrJݦGede'ʖe-I HdOԘZ498{DFUqQ4|y{m*C:4&jצ5$*]A22DEG; F8PD'qڞ[OTLBRsit4e1ocW.!A!A!A"SvnW.,)X y-TCIL1j)>l!RJJN :֞''/j~&@JPur GfJlg9i->ROuP?_58 d3,#nm|dtlGN勻WmG)!e'iTϿXxN$[EQwU-Ab(bx}BJ X"@v18hGnMMCz]JK)H#?1Fp#~p8#zA.;uq.L켜>x:MjV+ mU8K D@hMN2i5:%UI@S|Ry  #{j٠4I{zڦ3)%,Yd`9$y$rLskfZK|:oޝ|֠="|.!A!A!A!A!{B>umOe[(Ų2Aܔ5)@) ޼۶JT&1xb zFJ*yavDpkưRjkV̺nBPy2(!D sbsD6p_v UmJϕɉ`#nh%)XYFҬ3 iXW1q']CcOMrzƗ?w5V=ʕZBklQZPӲl)ڍw +Ǻg53S}HcG kHLBȬw ӎ'Z09$dǙVُH&n㞱?NgӪRkfnFan BҤ I b;ii3.Tv)Vq٪,IBcFLM| K`-p=-!HBDvAA$~;[2fWβ# Vc BrRFDuZ N+I H"\Ha`&$}so𝼴>[T\ 5'T)~Ѝ,<J{)'1-hsMQ6)B> w(}}\/GO浽9zg6̴At.pK-̟eGJf^IA2ۘIV#8а<ԣ4h7qѩ>^S'*q)v\V_K3:]v]ɗ%喆@yT@8HSHRք$)9>kwmi'fS-s2-82t? m*Z^4ɍNd 3.LZYkqɉ1qJqJSjQB0%"CO)0mI+`}Fkro0t0/Qj@GQB)4L b B$!"B$!"B$!"B$!"B$!"B$!"B*rDT{Ac#lXGwMJT[M%l Z%K.3iˊVVoJ祤2oܧ@xϥjiI,x}Џ2&q ä^gaY1 ~g9\P][3'0WiCt3i+tO ĺ8nwW#r9FݶKuCmgeܷkǶzCkFK5+ca|- $cyj|qt[kVGԕݥ{n==uoɣ3bFxi}zkۧ}Δp3:$h 1qh%6?ջ{)8z++N? s}*eUj[`WO; ;~?/BS]-ձyԕHUlw^gī{aT7%LPZxۤHj#s4E$K~'~ٯzXh[.K!lOrz<glc-zj9\NQ߾VGX+Y-ѹǙX;IR+6 A4->8]r]Uu>mFI7: %pZJJD5=ZAװE""""!B""""!B""""!B8R?Ux'$tWM^˭ -L{d!8Ӓ[#~`H+v\&ZZƎd!FWT9¶ݭ;|k J:X]-MUL8⍠=$Nx׈<iK# uk5V@~Zӈ% d㺗P%\rڲyK,⾩2#"g8 Z9ZTʹX( 1g}d󀽥|spDTC|Q29cf1=̆FGrΠ:} m66ʙ&}t&D2PIO6 8Ӵ \,ش~̇2Ьo${$fK@ D.;&jjݭk1p8=m/9R][/Q7LhM!s&*we -A~:A[f5ܔ|#p3s븠x4ֵ?.oB?lޖU%K0\Csiub&ς _ue]imU_ƻh0ğZ{:ҒE66I0KЂs5=;{#- ~')gqPdQay[QH1 VILDDY!LEָrE0Pe{<İtZ>C1}^:-PywQt1Bu􆩄R+*iݖ89ܬGܛ e4ԓb}7߷E0j[#k7J=iԔ/ݨ#./4^>]#&kv3P.v*ǚRqGD5!G+FuM15K`m_D 'u[~@sNA^wdy6[N>lj3 –菴R9-Ұpsz{>]g@p:Ӻͩb&R9r1u]mѶf9"v "'%""""!B""""!BNGg|.#&K ~bϧ%3>oGpiޭZs5d!gRJpнqPZ-]niiitGmsv/>qs#憨:]_LRhZ8|?]l9x犼r/+fMMf1ˋCa99cp\B[lŀYTN4+K7Gw?prs[ 7D/#?7-c Upfq\adm `n-Kn kơTj {d,aYQZqoE rʸ˦xaM?8CgFQ0\#~?ef1sƟ\DmᢇۑHeǐ]X,tT]̒ep8ٟpݠ~rrz?m ugNPiS(F08=IpQ9|9M舊D(szOXޯ]5jj;-;笭ELΑq kZIq8v^rGᏆTt}ʫZ]"ddZuԍ09N!'yv[wAM=CI)y"߬'6Y/k Jjx,26 4 $0iOb= _Mú V$՜<:7P-s\ ach.U\o7<&-fl.wUSzf%qWw[_QJO7h?uD4q#^Hkdr֭bU|W艞K*'&1ܹtVh۲R9~IJ.>xUUnzJ?/@j_'VT4ffx0rIQC|dcI-PYm=71#(Nǩu3#'$M@6WPGӦ 5/f!or.MXӁ I4خWʉv{* ?@#oс.>EIB0c|;t|Cr\7}3r\N>kTnlev1;cAH=߬6Fi-nd-ɫm w!pCQ9]%aNwv e[gh*F0HTԬLA%-r\Va2ɪ[s$|.+ū3pyɹw`Y\u6BEQfܽxHECRްUN+hmgogg+%?N3m}!~`$4\_I$5!38.#pO~wZ;M8kg̍Яiͦgsm q[6ݮ88hg̵l*U Zze6AӐ舱Y:k}ƲR+(%,x뎄zeHa*U2BAbp.ԗD2˨h4KMP-sNZ敾 a !IXCjX]=Bm Zg2pk6_TZl0fHǫ۲QtfDDBDD!Cp6?_/Į*7~:GqՆAvRbH A`h9|t!~;l&v?<-M4jYUKXP[ſ?x++_4a#mER2Gd(w3i-:|UURI'{dq'rw+?mἸ\vrtm;th-!ZlcCyv'+7Em ú4X!U3i5Q3}OG!z]Jkl*0/H~tlj6 6II}?e|0qP#D:.gבkA'`⥛9ڵEA7$w>@7IJ>,œNZ3zXk[nZi?3rMO3$4s9hܸ )ijd~ ac|L{Ki\I}5и z=VCiC*|?x. iIu;m L |TLSJ[c`sCZJW[~68s-{"5K!cGÛSx}i&.{H{Drwwbhipզ$]/҇T;&*xC[c~"JPZֆl.jR`cuTqˏG{[%'ɷÄBM.kX(ArG%зu5r_!r^OI⹝z-#@<2D Mo9. 7$mgMB9DZo'bA0=;Ge<O4/J™HaEu C:Us '[қ_uc`eq#.6;-Dj-ya#g[Vd`V4R9㛏F(pU&O*f00{ܕ|k#i$+3jUu%>S\GD5nZj,jPB_gXjY$l0D9k7V FvoFi8O_#l} /z9-pjSÊm}ͬYPcT '"9{xờ:Y ;v"v?ci{KLY:Xϗ6K>e"|r7>3IMWKr9S""֕NhgV kT[aZyDA0Vtw)RZ7q{Yo%UECjf,>tm+a҇4` Y꾂l'lc֏^u[;$c?%tgDDBX_Kڥj t81=cZ2\I_SQ4ѽI@0Ky=+2;8h^Yz)ËxК u Ko.c̱F850=fIJvyq`(c4@8 A u!np1BDYyNRG gStP>?²~BzC .Zgv潎@l&z躦nH U4+ޡ2ÚG- S@K%ܣӛ W}+9v+XG}%T4 g+LW7͂1/+Rخ#~ Ҏ rpPAsp;#F ԗ.-4@V߭-[ecI"rmtsr?P$u.^MrzwvrX 5ŲGJ?1U8 e̚-<_O~ P_(Lp;rb!hV>}֗NſsZWmm[s*_[R⚚2K5 \c]4,Fi:S21a{pAvjj61m kz +I{t>з=1Nu34 mTΰ٭5հC6<; CaR#RI.zYIQ #/p =eqgUY[L[XpF;`TkI8Zxฏ[PZf0 )-i>@!h;EcKH !K9f@\ >Ï?$6Uo-#/eU4-k=}" .ct?Pz%z[nzfH{M{*laTl@ q %F2u3ZN )9pjnr9ZIı#wThs;^ ۰WQ9J.nL~関40~zXCFWǀ 0x*n5vY\ظDt?z8U`}:x@!_AL9oU)YFyk܍:FcLr2S?u=U4*8* 讠)UUnUQI\V8DEDDB~{+Zۥ%|MكwXZGYR tg;eraZh6JH T眲sw@u^tΓamDcpOf.4C57=I-5 iW=4:{o}9{.Ouw`5ZyCw'=9H%WR | T|?h #Ú8{x^[䣡+UoeD璆 w%Bvh$sqܬ:ƿx~ ?C$>?}vs\Q'+]+vHkc`x_b_i(%10pXޣ#619S=SGy!`sou0[sgˈĺ-&{i)FK!MN<\Bi+ءhan19-jE$I%qgOE?~X(~Zs][M%,49';麱=:#~E3#sEU2Ꮲ1}Ei&7&Pdq%Ou6UL7Hlz'T4du1S4*:]яEZ*vd* Q,ll"ѪPgl+;-ʡ;]A Uh\G $_SŰT`%{:iknފ1x%#y R+ZW>jƎ_$XY1GPSS5;u2FRsġxu(s 7$mѿ?i-ն=;Gw; -n\% `|J#, V07F>Y]S['-uJ i_Nw?ͿJtDQp"!B"")Iw/_xˊ3t\KV-C[QvG5r``^=gu-S|WJd ]rj95 oB((Pm kl:K'p9*iڥ4;;vOKխ(hc~˲kX-t-18=[Ŗl ޸}|:BLn,#?FOBx kIZ?o s}=8ݡ{Ҧa?< ;L{!ςGC,ncW5kEJ3YYlG[$y}6Ua pԆU|ŅWI| rD"M *Y.ٽL*l 22w.#^.c\n2!j%k{y81\7nI٫V햹O]XEAhlsZN}ʘkt= #WMh?aw ǿY#`-;8}?q5nx̓G'-?ૻ-񭡌:^:E^kKsecveb v- =i[_A['3E SAn?ѬW + vR3} EJ:m*=kkhe-x6s}]3K^'+&vsSveJ)c3M kGr{kyHy5uWTqZGcg-Ig 5#אv`?<;*_mbѤZR%i+Zyt{X( y@꣰_6v9e=d@KƦ5W x 8DD=6Bz^wa|tWQ=3h8^]nqz[ o:Q;Į> Tq+>DDBDD!x]CugB%s,)K&g9%F `r1`n|}:n=ޮc 8Ts*DW/S;5WdCUNfDvuSd8UkCT-Nz\2w!Q5S({݀ 3ULءis@ |Ze8c2H4 xU֝m׶iahϟ31wƳY}20PttOn7M$}WF8YGps)LNzu\{O,GڴMgoZKLאyϿʮHvT*m.i؏O~x|Fy(..${tp{nWqsh 0p ;aP:+ć'˾A**PK׸QvqNQDD/QDD!Pe $s∽܌/$A':zk)m4Ӳ6d%=rn㎑efTܛpKOwi>AI#,Y:ih(Fzh `6sZ?2> tDQ%ȈB""""! x!Et0aѷ~5֎ޛSON&~Yq?j;YV =mv%\ToVL=DqEDOJDDBBꤞjbtױ-s܂P}Y8c-"tD$}L굘.k BzB -C;㍣>S?DIT?BI:+U!Ѕs nBEFU kޑQetMY[K | 0v!V6MQf\#C+K\9?x\"ydGeuEu˅ 23>Y s'eԓ8y=]S|sڈ BM\K@QI^<ҽm:h!!Q%ox#cSD0e0h璭2 e ﺕ'o,~Ԗ1@~F .{%Up#$5$UV7U\p*ݺ@ҥFwA׷ ]Vϊ'&|RmܛMYkk[N ib=Os`,O?}g2{h0bowwwNe3햲c1o;翪"Ñ\ vTQ{R/1ePX#D4z%8a-r\ĎUEܑԌ}IizRk;i.5c>)?EX?TR>)r>elnfpũӖ=3ꕎ!2V;yݿ=-n50zGKg[r;yi#88n3LY|6ifF⪢Fr7Ln^iE8iK^tL䙭A ]߈ψ+)=/l{#J1tPC+weC^ʬ&tpOeeCiď+ɜq -{.մ:4rDfJ߆S W8#VI)-tKO8cJ:Qi7JۜQPұoQ$0.8 or窧y7yG~dsV''?/|~2oFU-V\,甀|<7 /aL?(pCVڦDMR9ws[#^b́[8%Fuf<t4Ι[۶um+-ˡ;vADDBh"^״p#N ƬNVy&G;-0eT>75͂Ӽo;'+w|sOOȫ61UXP@™8䨃t[w v!d!w?m>W*\ UvfNpo2uc'uB1\=ͧ T;U]T pLZZ2R7|r52HC@.{p x{ϰY[R>Qy<-L 2DD!DDBM/GMĽҕF~ḁ{m%la1ZhMeӝd[-͚i[8 騯Gq}73ݳ:1=՟E+d9b}SA0H ~k3ٮpcw{Nacu.@chvd)llS:T9;^<;UF6poc+ޡV>+ssʠzuuvw='wTfzoFܺ,չSҺ)-|}Grry\RsrS0l()rvS9Lv^p J󓲁8ܨJ%C@+4 vR9r9ZOV'd yPS<'\};گ73Uih 2*iA{|wܫ*F}+UUIr9W0MUUXKY\0NwX[ͬ/Id W6u_b&;\ (/>f0_Wjj][JYDIC(?~Buvi;cu\z>Niʫ@dmS&Uj|PGG#z4wRkKi=I_k1MHXH% =+WYԒwSk+ު٤-ִ:uЖM%C=I]"CƘ2lkUJrIx `Mۢ˥u]U~yp7ss1W+Z@wUWHYnZ[9痞RNy/JU-~" ,W[?39C5ו}íiƍyoᶁ.0BB卭v $}UAx[4TjC$_& 3w?r;{mh5~zX7 h'kݪ+悝[Tĵk@2 ][&ɶ'_K _cvHG>8_//vKof䱜:=T)Y3x=3:Cg`-1nwǪjI6N{?Ԁgmi-E/2q>xOOzrgn#upPY2:=^kV=t$}8d.:  T8T&3c U%pUeGm.sNhN00NN\FIgҴykٞ 8 $ $`7),;9S[4ml|C$VS->`<5ii]Uupv1̞]EJ~Fjlz9 e]5@dKWT{meg`WUMeMyA [i-tq>j5uibk0zX %:n-ƷsVgK%j lSܮJ&gI 58ֵs>ZBk$;* $@k@skZ+鯃OOa嫮t^Mi-?0I9 c,j VN[OxUM`sO^ } j+VoX6? ai8s8 1ܻ ~ofHQ{mn0?>1={5DK(B""""! X@Jn4[k-5`i:8zo,.1_菗ϛq :n6]O'ܝ-J'*pˇTu-LncpG| C+K^Â?" opVs,䁙`ov6Z>%ASz ;sdQ;.= Njr;6C۳r+9?G|%A' ˑO̩'2C#21s^0A>Rt'e&*#l9q.N};yTe+ NT1'8 "X@6RsW#k6 /;$oke2H;d ʡ,U9JYq}f~B1B޸;[+c6c8/lȝ(&$ 9-]40[v9wՅNg)g:pDVgUEUjVUn ;D!:S\z-PsXJ%굊E3aItDJ +i!uEO[jOH:7ME jq$ F|SXӲ :*H],kF^87$? /8hG뎆Im`Uy)yI9@AQig25IxOq =s:$PtSGPj [(V7O;]58 m JHhxWi{M{&sT֙9"2X>Ktlj%nWKzZ.& idM' k u.jK^պwU9ysNsls6v%ZOݙ\ͭOt^"CF ω갔vN2cSőܒCZ$J4N NvXlW$TJdĸ$$ʷZD +zIX\[aa+yA$;SWn}=/omж9w[U 8;rw$\ֵq\,_yk+n5-2=ܰM+荹䖴ekO t 9Pˎ ߤgL1w0w%4n3xHjj6Ҟ0ܵ}/W܇~V $H8 1ۺatP7EӖ}-cG0GovLDDb""!B""""! EBWHol21;0E;b-{u߄ёj M k~vw\Ŷū!}ڶ>|Ͳ`w.s$ ֦nsu-VK^ V3lJ(祝4A KAXQlèh'`͢ep g9Ŭ?@#1ϓgm=5~6誩A~,tumè)tJ9I 9,v= \U/5L*Z:n>rN9do(J;3k qmv'\JEv϶_-0|p8\;wWJ[-k3< _4eNLYW ŧUgG쬟^? .d?J+)c< Z +9k ˕& Ye+5\>"`!$~dnq;, ώ-3CPFÐen=rN}\ޢ%QDx@஦ߪBwiUv Ǯv;[f3^pjp\@(`ۑQD3#)E]^x{{vZ}M_w?U]v>|8bɥH)TR?#c J z[߅UGu[[XBhyyK|^ùČ~}Va>,# _2k./quuD4ȥsË|靈kdp~ Q:+YidŦg7ʉ쐷< ;pBŧZbMaӶjJ 8 % (#` kƀW@QEW7QWdn :8w?pk5d%uD5 +n4i |u<etgRKF;7#yG8?K=j,'mæp Q[6?uW,ڳX]QU#y5F3d7$%PCڽ7RмKTxsg=HW Q@0>&^*ڝajC -֍ϩ%Jk*97^U#=Umh ;BZT<$y5uuHukrV۬-¸ ;oTO*7уl.yOltk` }SOA$CݱdFM.GGáxq`A&I K#y  k@4>jo.mU`,b[g?6xf]+)=U[ķSG+.#`ƂC6h$=lo!v]IIMCN)֌+^rTp=+^""!B""""!B""! 舄-g^*]WHg-1){8KGCuV>N襉{1o!<lT& `C9;y赓s`#dSŶSߢMnn(d0 Ui4z~ByR4eh;~]s#a&q\55%N]w&k'r<p9T>)NA^Zݫ]h\2@lF? ZOZQvRDA F z8`沾i YjyI|O1=X駨k 5CqۜmϪh㤯CX_߸P˭CЌsmH5:+SO75|ͯ xnp׶,FK(L9^kyM ]6;#UZlJּøO$qUdsP*TܚZa53m[-RIQ]ʪjH5HÆ2OE1pW H[-Eg7<ϖIRk1{-iJYZY9C$గe7pP]o]oZڙq$~.q$>@,5UVscul@O@> zyMl/YOF$.sKNI>y@WZ3ru?%U\Sp{"`@oot ß@ έ>ѺQs#fI=$ַ{֌@OTRH#xkIXq }W'#GxKYjy4vM{:Jvt; 9\;⧼g3CN?.GP$lO*x*K:9<8ߨܢUIC_K$3FY"iۨ;\15w{s=tU,8+*mG@ScgB|W^iJjy}=Cp<Um-@K[H6-k+a5 $˚}o- 5̀]pl7 ?3TZMUy?1EG9azCV*lZyAUW6'r!΢rAe.vSc|Z Zs]gRm4sd~a(LFqd@cj$}dd:0KP|n=r SX=(W}cS5<>UjjAz 3S\A?Xꫀh8UjZ 9Uu˾ʍmés ]u d1=쫊˃[Kk=QK>6ZƱŴtQ$\H 54^? EE&4uՑKj@Xy*89Dyek'_E^5A_ OU$#[qӛ62j b-y;8!=}|3dpT澾V%MS0 ߀0pր Nll{E%%$- ፣k[ZW#+4i7/dQW$%6%DDBDD!DDBDD!DDBDD!DDB0=/( t)W.YD5٣ ߪ@=K=HSuoQ!$n3Y2G$C[%{`7 shX0I/fr`;ZFܓ \߉^F|X6ME$`n\Ǭ`Ui')va^\Buuq/PؒqH4I{qܒG(UggvlsN] #>E<$CLW7܂dg5T!=U ܁b.mW @ւomS7x%=bu+|0&lIvvEK{aIrN8?_]~i Œi}> b]S>/N G>)01 sC?]~4y;I!D\|R706nˠtǢ{#^*.e#'<o8%{˔̪s@HFw#<O+@+wXL3;>[藍CN@ 9%G0:+X"!B""""!B""""!B""""!B""LD"sN vZG<~eFPF#F90mo;3>&Y5aJ޾=nt5 !Â>"#p3rgĶ}\R]lS q ]nNoe (G`;կ/R\Z0xn?-3WNx GGqTjip--nD,9@ =I+KpF~a$lcOQ4}w - ik"xaEäo1avdokAʴu$A^>Cz&"rX"!B""""!B""""!B""""!B""""!B""&`z"/%TDE&s xQDD!DDBDD!DDBDD!_mayavi-4.5.0/docs/source/mayavi/generated_images/enthought_mayavi_mlab_contour_surf.jpg0000644000076500000240000010620012747716313032305 0ustar prabhustaff00000000000000JFIFHHC     C  "" Z!1"AQaq#2 B$3Rb4Cr%&578DEFSdsvA!1AQaq"2#BR$3br45S ?! R)HB!B! R)HB!B! R)HB!B89>Vq|Sݷqƽ起[ 0$@#wCf} |#$;{|mϯ1+'dҚ JGI#j534ěj}-'*RՀx+n=KKkPc#9RdR ۃ91 l -շt4=RK!"vaYه6VS%\߃5[Pq)' s$q[[6^\F>q)}Sa9b^8ڬA CH9jhj̈́ @{B'AMc!JB)B!R!JB)B!R!JB)B!R!JB)B!R!JB)B!R7U-a.UNJ{d2}#_jY/6ܡr~Q:q:=A2hVˠsmM5S6+/o $̓8^Cd->s]Э #"9>F?1}^Ժ;n/knTVy ?t%ճ[XD@MFsolq$w$R64^"@KVU$m$FyǴc^ gWR#8)W7(YSjRpoO)k^:l;7MWNLJZjBB0@P*HNpϤvҾ.]u69Pj U׵ s&&FRTJFʱp0ټvJeB2I^3敃O8{8OEN_i*Js|Axn6l⯓;WՉdHJQ)l!EHA=JTLoGmC\֔ü)qPi'0cd!-'RԑYY*0cUjSԺR$;8< ;F&5--iQ)'LqN*9ĄgλB*HB!B! R)HB!B! R)HB!B! W|t[Br~y$1+4kkHq{k].eKILp '}Nҡ=+t K-s@؃ƶihII[CHʈ6#GayL)yPxKrBG'<sʻBڅ`IM<Ԋs祶Vx%]~X>8>3AȈ]5N0Z5t9 T$H=Ym /qLFsK|i0ծq Y'瑌VwMNJȯ;_,Gl\e- Kk#8ӷFpXB7)GӚK}P7ϡTtѕZ^?@cWRZVʕ0!{+T=p=")z1i鋓jnFBM@;:6H8K%d #}*Vլ$3Qa>)ivi@-9q8R{6_{K=0R奁R(#zGLܣ3=^ݳs"_525›@PZ1=1@Q~4%8\*zs/oqvII}L <<djgUu5%90D(sa>Ӏ2FOxr=wojsIvz}9+XR36i)pZ"(.3;s8IHFGi56ȯO<åAVYv=GJtZ²0ߒ;(g~{C]+i @|TX1ޅIM[4YUGKNGZmH# #jm3LcfˊJ|4 QiW6M&ZH KJw%+)%JH9#$]oN&Ц$-p[~c[\*PVn>m[hRXJ;T"y?xޛ[RkPE 3bz/̧tijLpk$BF}hUں'(RAK\sFzy뤅--T%8H"vYdScW co~P-!`LzU+Simܲi׀S#@3E| MfgOzsE'j󌅎Kd0{vP--:YM'-. -:i 4Ԕ& 6V 2cqMun}G ZfmHrЏ*T{a.4/[wJFPI$p~G޷vr[ 'tp7Ͽ,/7Н`(;uRGꮃty:nR$S4”s=vߴ)[tq)5"Xu A^c~ivk6ӓ2E5mN0`R0Hɶ#6ƟMQ#+bX4Q*GUrI'T׷BPcJm +cgߨ3]|$p+1ڵA 5x ?$H9Pgj%aD| ͠19MI0)Ctnʯͤxͨ5'~1z-g~?JܑaA-=3WEIw6\$@1(%CiiJr %G>(ځ;HYjkj|8Q"L\n3&`u}L++O=S7g+52rSq 3h R 8=OgC S i[$)* pD׭|aԵ; uNR~5`K&rJa.6Z}rtA<_voӖBa(! 8jlr^奲L%$""gJpI<(rRM456+p<h}9C$#$D?϶,VT}$ Ɩх5M:B)B!R!JB)B!R}zHU#J,l7.|Oef5I| ن<59x}aX?Unvmx&"ֻ`{@a]RҔHԺ < 8G/Rh:SiL^J&~ϔR~-Ye:ZBvT֞?cRd^)jTz]襡P3Zk&C̑SRqn:+uIS-DRO"KO=`-u)|IZ($wIjϋ{$ݛk <{=E|ui]@ә9H0. #',YS%9,%SH*3sSU-QP@$?N91d]E}Sɼ~*Eku5=:4ZQLqTq)eII?M|OCC[z)̢fݽo3FU)IG# {鞅uK(D՟HR+C30ڕ(@8Q mrTS_U'fZY:ά%(BA%Ddh=ORfۤBծ9+N$4ނO 0@$b]Zi%?̥I>[{}~!)JTDNԐ@H$q!<֠W XZvJØ#IQ2n5)H߂y.aB6 5)uq2$h*YܤsɈ1!a?~\Am<-K5EBuń a !Gb%n48Mrhl d%1Y/ڻf.iJ+C @5 m,bo8}P4K٤+/&icany5'Vύjhݱ<yNxFչil^ߴ,Mb>m˃b/Zst^߶Ō° zd%Y7 qCBޢtʹrZVmc84^l&cOHWhҮ n;ċ-VWmU^RiaI8;T¼nTss{ѵc#q~ݮAꉏ{ TtY5ʵia> I 8 WE~ΎT]0oG@?Gehۊ^7[\R˷ls~#db-kxiLz/GwRm=>ZH="nnyõ'%SK@ Wơ;JTTEmT&eR ī]JNŨ+QYZ 5(#Z\ W[ N=HMgMlNi#k&ѫ yt-#k}2e̓)Lˁj=cs>i>"b u$wYuOSe{hlJq܂N9ϴn8)L3-'R-8111WUϩsɭ_ݞ%uCf/<'Ջϻpjm[ '5BV!$}6;G9 g9O(}YUy VjG.-GTV  @yAŴNGEzK6&XcSdXKJlL$מ+8Z.R& ؃c(|pDf[) zx#R rɯɤ"x̥Lg־Tpv'8bSc 3J ck^*)ua#'ֶM+ T$8NrܣO 'N F;zEٛ+d[!(OֵIRI]F)B!R15P&^7xqO34\RCgiŃ^1p\b\DR?=IcP8%A(z(bK2@\\폜xJ˦Z] jPJ@IRxL{c#giN)V `\!Rz{wrTc ~Glڳ,\enWw6rP<ԠEV&PH>vZCV MNJ ()%;rA~ MӤ'|5ku1+~U9pA$3u}>ޚ[wO?U )\7,\*$8eDq#1,YIs*K%R2 '9[˕ 9ڄL\ܣ9湣Z˕$DZޘ sT ?w59xߴ=<Εr6{OXviF9KZPA)q>ldsaOXZV)K:i,ocR$%k'ld׈8oX>'C2`t}gޗ,7fB̙08)R`WJ?Uj\R{Щ~Nvi2JuEIi` rpF@42j[kR76[O!(ĢVYД5#̐NR|}n궙]MIp\m?4k&QJ ``85%3 y.OȒ`57MjZls_\CҢu{TJ(pBF>oCTO=aF~J 75`ZjFe(Iv]ӳ<{vj,BIޣOXbsy+7'$lmĀ;G5ݗvjZsZUg-5:EYSJBoJ\OV@$c n߷2ҷ& f=12mYmؒ+I\WwZjiCh.2֋| I :ө>kJ-d^qM1Ww+ C'i$,$bgGu/ZiDݺk%E6 a'v^&@6-U@*?6{}9DeWPn\ae)>e< RħyɶZ;Lw%[֢>`ҭJݘڒV^MyT5196F Վ2NOs]](hWrP?yB9$ NIb)ߴ*~>K9ZISoN6J R~db0Q7Was!+O.Uo':%ER ==jw9tǻ8ʉ#7ޤ}0IJ%s]/V@Bk!e98=@*%h~U7p)m@w bԭ~j$z~yEc3V2InBm{Rr E#-ETϔLi"P H_i77{ԹH3B;)AH%ŦaDʔȎBˡ9ǛjȫԚp)" ?LD:PiUk]c}R>ܺ#IJ_m%@9s-:ٚ4m@bBꔕB}yEĝ>8fb6+J^j\pN㷭ꬎKvx7dFRUձhӭX1XE߳C a$ ;Ɂ^6~Ϻ]eՊTlX.ͮhT熲p01lP祫n"l --XBH JB;Gz_J:RF[N-~֬2)9QI&2'N)P}1sgq? ղ}@rO~xQe%-1']OH_6ZM"據ai&ұp]whi-lQWU)Qxq 4<ۻZR~Je6ڟ}7e)*\J'0=ҍ TZɫi%}^QBԙS\VR MY1JBm=P@$}xjVm yJ H3DBNq;mÁYMJ2BJWa`˧sP[*E"8$+w=jQWF+5)?^^‚AFyJQef6[JJH{ղ/<@āI80SZjZ|ŽereKII;0"4}QtͶAةKӮ;ҩp0yO# Ўmi[i Jqa|y--A8 W[:ȱ6Ӯ ].T"%eϨHDw؟rKMv'`JP#X*'T;2l̶6@Q1+`Dt5ue *[N.+ MX\hRA}$&RgZzJcvZYSJ!D- ӷlQkI\:oO%'eKFLKaGkM6V\%>b\NSq4}4_R RI :߻Ǣ2,ݭ&y$jԪ3ўe5&{N:n]R=G7%R:ө:pI"y|ruV5iB32Z3jb6a-IB00>Dޯiu╹ijՇ ABOi8?QM=Jv۫3 $q=*k?y !Q<I R\8ws[^_\pn{x Ķ?HMaP9Z~ۑ ۗwaZ摨RaR6|S״IdFׂ?{BAY[qr>}a+u*$p>9<Ч 37= em)yVB[l8ChR}=&u2ii*k #Z#rIjlZ\?Cl)w?9p )(W6րj㎋E=R$x~μLS. cPBBIRgz#ʼéBgϏ5M3. ;OvJP-{$Im'?6\:֯|$)ԣ 8tPo._XpXi*HEFK]r=>f@ZfirKc!9AWoxϵ}mI\wܗ MKBeJJeBPqW>VW%4iaQq*8b}cI]2=9KJ}J[T `V>kN\^leǀ) &һ\P)}TΏAvnNݢ?La μJKRcqMee,M2Ge e\v*Dާ.##Afn]ҫMNhO ٟ6Ϧq>g4%¥lr) FM-II[? ߷ͷ89XKn[\OcˎZJz TOIQ&MQw_EX&~󔗥KI {>֮(ip2-Om!*앸“Y鍛UUFߕz)WJYY$l (;w- .-2pQ*.[L}S N1dGԷ9xIAR)ң qXK\{@Ε%Ea281UOխ:}R<)MT)d21#"Ji?&TχY56=h처sεE˩I"]CO_/PE5 .=:Op&u:IЫgQ5=raJ +JH 9'1ozK4]oso4 y+ %S:C,\ؠIx1,I3LԯjjNU.VrIRsݸ \ӭ?&li)YT{ɀs8pnrW^+4R?zAxǽnT\[Kk [ڤ:R)9jlKS_dԕ -R2MOvrO'k:uJ&h~YM q}SZ]5&|4ǟ[YӺ\)eU9O :j;T8>D-V(mmNW*Lag%%'f>d-#ӀOxUC+[D9f=<DZ7\Q4Izľ|iWw>} -L3gpDwkNco[OISK"R$fAgQ D+rA+Hʆ:Es͉4\rKӥA}~gUv!#h;k#UVI%U Z} <\P܏7p2A³JTPz_F5˹GKv(RA?zrN\شJu3«Q\iڤdr3SdØǵtE5ŻY՞*52~ϥc` 199xps.)!: $3rO[^4ƶI)L52J 887@mͨKj@O=m9%[m/R9=Oڮyj-0Sk’H?:MDn4ބFk7 ?Y]ИmI,s̶I”)slshiĚ*vN.])cuݥTXOr# UˡJ[iRH+UuY:q"dPݖY$|۸8aK^F}2Yƒ7ڤՃ|'=|{mڌNMNKѦdm ̳zF8OF 9!pol$D$&T`S)d JJ5E{t.y9䶑RXlVZ_ONjJfTÒӬ``,βmR-Nl EF?8XPXRʰ%I,(!~{^zVrMn0nqg\@Z dUܞAțT0 GTBq0eCyddfX>wP {VvuPQn3Se?ەLzυ+*8䘛Znty̻)%2je 7$aO%]3]gwRVv6ԬJ̀(% l@ X-KY[äASu)>(bnyrҘҬX3Oڏnքq TcJ딪1Ir^fUжBRpA fwN3#GPiQty9IfܴA JG pL[lts'ү߰otJ9;FJ]3@r33ɰf&RK8<5$I^DUcA?~әrMu%O`Ooz;p {SVn%j`?iSBҥR,gqJA)-YRAMVaձ66qa5.Х%D(Ȉ屙<yi{L „9\f$ʚH.tNרd&\ّo Q%qbjH4ҋ.y*,5Z69wX,_p*r]O!'2ZVPpr>wYo]:A~26p[n!`cӀ hP!d>l韇Wqm q 3<^g􅅨f1(AB|O&zLǝ]P=?8itd)wISKfY3Rs=,)*G;LRMWa_3"uNlZ&+;O2Y qݻnG+olnIWP'A=_'FV޶_)V`?cMd静sK̭QrQ̢(no*~JIW~YHB[q\*Sj @4NϪ-(_ĺA3ۆH<`+9ttML Zպ|QLHGe%;1ۈ>8zg5icGZWnJRX׹{@> P$o#+IXQ-A*Fƪ7ZUx޶Z3ɏURW_ږr-&KkwgP0"ηP;bLIQ֘ >^>~yhIDRS̯tg ItFv4wGt+[hVeݍxH*>iR."Fbi[\Ii:t f\\(rړg$R{ㄞ93t»p/љi?vdKG%*iN)`q޻u$Qul?w+[iGw&4ɷQ*n 3GD~/8þz5)ھ raeJOeJ=~Qnuf3kl*S2rI|D$DFƽXfT7TfvR#+.I*9/-m$m<T5*6v/0KHHKWkm~"ٞBO}Qʏ#)T/}Hn,  qnl\ H@>ͣGW2_Fr`O9ܗRNy1pHȷ*}NlVZo|!0lG#oOtǩT'?|+{]O_Ivyy^"6s+޸RӃzr齹(n/kNU"m9j9/sCLJBpO瑶}v8Rә>@Tni\Prʂ@J[Gd!>j< .4Iѫ^ko3C38?zǫcƄOB]:N?0T}qBWКJz䫯Ԟ QO`13.gKf|[&t'Me̊aFPA):)y[^}1.BgC\mJnV@|{yUzw%y 86mRRrnc7S5B[aۺ%&ہ*$p$dG|Z"3bvjHr0$R2.VT&TڔJ8#?[\@;v>XJM%Ɲo pÜA) rۈNmiI(BA )<Jz15VԸ\ۥ@4Wȉ G<UuA۔ࢯz? ޅIQ))Fr7eN!:e$Bj5z)oqqrI;Kuk nBBB:}ŕ=oCrU$䛋PIqxC'h0zc#Ėr2[>W&2it먩5Fj}Ǝ退7yg5;-rSn7Hm <nk0G~5ޞ:^v])u8Re=('%)!֖U/ NF6:C+t,-mU[8Tf #r0sFC?ڢ1XT>*C[A?Rx _R)=LQNXI osI9Wlze5ݭKʂ̫q$ALǭRt÷~%{ I8Z'vTVaj?tmMT[ J}{vֺK$A2aŖ'o9ƩaD%Ky$n ޟ>µD2Z.*QR p%*>ƒ]Ev\U)7&jSYt$ oluIl ֢ɒ -\vؕjUEo SKBZL%~#" )YZT-stIJJC^Ih q!Wpo6GJMXrjl6&2è)n~E H dZ-+dWb\W/LUk$$K=T7*lRzI(ɱZee2sh?#-%h%v*$uڴ(2'YYE5]Q!i$=qL׀q~3MMCvZZ⒙z%̌^Qs* KeĒBIP䒞3#8f>;zxz+i5Ҭ.2 ke&~jޡ4؄ؑ##y {TmH¸)I#hB=׺ Hqk%qOPF.%qT&\8BF7yˆ~F nԅ4L z|QjMmN1^}>!/ %KÎ|RlnMT%J#S޳gP_mF3.mBOzfu,;tm8qrT/kscsN0˳prF{`Ge+8JӸ)Y$wЉRП J$EQ_:Kd-*)Kvw0߄ȃY:ymR Vd5!) rZ\%p0 ĢLIȊWOkMm)*j9Ƨ mJ{bViw*ZE57)6u+CPT$F"و\ fziA0@]<5Umd6lAIALH`Y99Q⧍a8i5Be-=3KiS&P@qڋ$dZnrFկ]'1VK,'[r]/)[TI#'oJG t6]D_:%q}=a‚[p!XGnO>_#UK\)m K'IhފtNEu3!'JfVUBT $pDCHKꞖyg?e< >?h?gzU׷kziۥYc ͓ōROֹ?qӮl !`A[5&]!˵{5iB&0QO.S/ Fs=`8oҷfdܹAB9w%'ygNi4v*r~Q8y68r bN/JV"2YO \H <~ mpζX1+/6fa'T2#9l-("&xH ^uW6a5C [v]9 1@jQoPo^m(?) (( XiFѹ9%ERy+~ӫz8+o +R KJ ݷKuWf%4 tj4UQ6+O٦IHOG:;˔U!8 R "$IlWh͍ eeEe%[ZQ8>@K&1gG)4>[ܒx3קO̡zv2GLs3ɮry2Iҽ0~-P GU)౷%uDJARmշDJ^' <e_uOv߷&ЭRh4%}|[7 qYDCOr_U{}5xOݭ| 62AQ9te\TBw#vmIImNm|vb1sKȱpVҨV-3񍕌>!CcBV e)30*b]VīIB0p"MlXulM2ゥ_x$R@^>DlI2 LPu4Nt17OȝfV j\ >ݝr?R֛uwy*򛚥Vdfi Snޣ&Ճk䴴@II@CWI1vͽh#pHD`Qy _TƥV}O(Fi]R$`|iOBix V?E,(^hD뵋yPnq XNLc#Rĥsj#^('H-Mo^&YfEyb]n͉ݰ8"Ӫ7MZ3;19֘\jw&,{r)RTP*J_ @ ˉR?2BGSOZ!6k_8R#T|M}bսWjs()gSi)X(Q;4 de.mЕ܂xYJQ;GԋfSyɤJ R8l+=L-Lz7vA*j^ӮPTV]:n1aʔoO2jEyLBLIWA`ٽit~bNT52)92S1hβiZv7%Q̩⛂Y~+[gA+yYV Y' O1;W쎠嘢hNh/_(\Nկy;". i$ e;[~}60^t(φ4€I! DԹU8QTH?u +X^7KޖA-Se*0 j5Pќ4:i6˧)Xܑ<-kf6o̩?q;٬}b蘱tVb5$B8LS8H#w[YrL[ne$%-GԍOֺRIiڡժK@ÿ7kh_=pWҚK$!tZO'JsHޙIp*O:|T:\i8%c׉yŴw&VjZw䢃6-uPx4&77%$)%7 #A@{g8 zǯ:U7/1kbvI҇ESn03;N_R u"*TzBѹ-;'˥-.M) ɓ0wpOn TbԮQBUh iJ v\*'@\{"DTNyV bv3$xGz:ϭI{J6mes2B[TH#/ifdLa(BBR&wqL]r2ҿQʳRqG XIze~+U;\{>Y%$|ؐKO*R1H#( c¥N=|ܠR{r8W=Z$MaG_z,矔nE(ÔMx2 u*dž)SMEp@֦ ]YTLYql mchH:];~"^^M+x13S$R j"=Nqf;U2!30ϻW+D]d.Wߟ}I8ZTB8ӗwڈG)%]c51YBI"`~ϵw.U^_. Ç3YJ[I@M6ՙӠR:ell3A^.˴{fNVY. B>Qe,?EݻlVhC *4޷rˉVP Z}&oToIWKW`JU f1^FO81:z[jd|ջq(^@gx򛑔G7,SՌƯ-HSi?QJY-#i룦[o.RPM*%#ĪC95ژXfʏTxtض]h)2ڐ22 }b7dӺv蒑5" . 34"[yxFIFn#/kq$%{&yGx2Xug\ҝ=LUr: ԹyPl&)O@ $N a8=ӡU[3kT&OJOeot Q)[BÞ bKJV+rI8=:碃=R*'#SeNrRR28ԏA;?U'8JOQ̥Jcskj#e$z㨐cםo.~iFhSqAXZԔlP'sNme׫xje[Vwg eʅ=reZz]KH ??H顚Lj)tVN@9_Ip( h)x;PlQ)ǚ0zY7Tf@L R>"w$hs{^CElqd7)\TLUbf-\2PdyZk>å NpKj&AUOY|DŽy/ v&gM;38T"j7tlD)@B+~OR|-͡ ۠(d%-N"o;47ZΡzEwkV؀Q(Զmܥ* ,U\fR vinuJNK||Ƙ? '%ˡ?͋Q'YܓӚmGJOIQ<=I'5fiPZ=>V.S&iN& I*iXZG#{ĪVP)sEYIV!N-ڮkVVNQa*uÆ앹3GM6H)# qRݥήZnVe۬H#&4c-fdiGq)j݃wQ] ARy)$̉~u_Z k*)/И )+N;!!Ky$# ]>8螩UwR+r[2/>炭Eç=*h68kO$L."~qF K-99>aKK6aHEk!殔o0a JOM\4[E4 ;)Z3K m{ꢚ24 5sJ;IhWQnyJΠSy-zb*?s~|z2[/UAB !E^fXu6A@p»(r":t˗ Y_NoN|7ŐIA'gI,>I@Oh[ܿjͪ I尘|Z{u{AB<{CAK[DM"Qk znY#qǯ#Zj2P'd[Ut\9pTڍ~d̺ PR@ō)HH@b$p?X~[Q&&'ǃbm=$'ܚ;qB0ԭ!B! S8ڑktyW2.LM:$rHF*^ɋz갧iNտ/Gҷ)ei۹')9H?ym[X>LwLEEfn=f߈OI9G:+hk@4VqI)Wɸڿ S@H88zdY,jN }J1Y^m~.VX@22X 3Nx2Za25K8" Ryb^ SCI1G'tN[ U! d{BRInWcu7LӁHJM^ .eDH!<qD% sE:Kn[7īIgd˪۝INHAY#at!VtUG ٬7jgm*+^ (=r2, q7qܼRJG?*\(jV%7]$(GI_%|uI~¾hi^S%ԝ87$N#|ZԦ!2KȂBJF0q_5  6>gHqԑE hNMK)q]&0%KNބ0I83TeQ;(J18&/l< y%@G ЊA"+^C]ME D*iꨘPYˎ)IBr0 #LM!0e39JwbSp k#DL)T=[65MC̼G$#(u=Ӓ_j|樓/;NFqΰIY'2鞍S:0Ty( On?H=NQvMݯ%EM~)BR'1EЎˮZ jGnlQ $`>Rp $8#|#yZgj\KiZy!΃&Y軋mL6 !*@j[dt$SFesKkuJܯ̘JX֌e۠JA8,zo\ĕ.,-颷J}3m_yȧI>}&4lv~N2ʺJ(;hm'lu#Vi-c?Fb-~iJ C?ZSj V)rΠT]CSVP<Cv}EK)-RMO-i KsRH׷Ho]CkH |` {\^.غ|FJׅLsӱJr~`IOLSvV IJ~%a8eRl% p9:^9[$&vdbTWRRxC=WRiHʕpɝRt+$8D¼c) bۙm/07qQ䦘SLMμU_^QSk)*~esqY+td!SiN'B}yTu-V-d!Sh@Z8O21 /elRBm'c.>1N֖a1)gQrT)U+]WM(*=e:֫o{ҍ@NH6|Gj䂴~r'q" 0\IOhHvӹ]ž'qxKFMNhX7 \}E{'<1="*ͭ!UfT&%[\<>~TI#=#"ՏƹbZ{,GjĹQ=PTz|Cj!RǬ! SB!R!JB+1`|\ W!TfX3*RF'h# NFpy$Ki!8\Y߸ =BB؞5dpg1X\RQ+>$W?GuE"z"yan g8H<}~q?)noAI[j16E&>=ϲ 'YSYw+|jOGi-#3.)()# Y=I?h>afwkّQ?.8ŢҶ%7[Yb4;p8*ǧh]EYPU^4oJcs55>C #bgrzxѐG*)j`~]$p*_gjvVMT,k~ϨHl)ՂҒ{[}N_RnEη6'Ӄ޼R:Yjk]V\?#m4r-\eu$. ;my9koKWf]t#R&Ui~㮯(O>BUwfոO H%2HH H ԹKeſTY1DڵUfGܤ55 J 8 icXfmjvhT xdr>%Vs6T4I7QUTYQVZickm03L]l >IԽ }I3_;w>˯{ #Q[ LǮRUѵf h|Ggy}ynh o,[3/6f8{沣t!7gHkQRiHϓ#)n\*iזxX46>ᗜ>Ff,j|Cmdjw? r_mO)D:mPt!ԣDq8N6ees-)F2L?OzޓOh^o'TdOeo)f*JT;>ټ+(im}B>I>KkӥʖuYЪA*a٫$)LB qXPP=1Xu|V?N!#"HZ:ek`iZ8L(O0xY'䊪ʽ5Uԉefֵ(ӈJҲ9NZiIk'6Itfy}LdM*7fAG$#6X-Ә;XAǓT{NrcyiuKIԓ&̜A^̝1%E)ܸrx@cuz48۸vnHАI$]zUͷstFw@p@8>FiWmnۮɥ)gecZJT>'EVjU)WpY#gxۺ;,7.P>BtױA\l#ˈ]=_ƌ'AVt=Ee>ѽDtFB[ݲJmF%|xH:zם,&g-3./l(NDOu6]7nR}MCIGNDOzQq?wh2RA*i˓ ;v6c1xVWG#EVW@x@yyWJaLdn8ښӫNv(2 [enQ;RJt+R&*clۅ\xT $2r.ZHқl()K!3JAs,ۮ\H- }*>c\SRo.Zf/%!OqYP-a)H*JT2MF¨ٴN&+k %#:?Eir!YE&C{!ړU_@os*V2Ni7oͺ~/PeVT.yHA^wmVedLO=>N&^bN)ycnZC~ +zra':MiE-RGֹ"*XP%1Х'k3HmWz?v\/93.1NI e[H ,IH6Cc)(p{n'8ƒpю] m`y2+,-,s$I*=Tԙ]%5LTʤin!\[ u q"ihtu6A4 ΟZAҔ[wf^xO}I'HoD?4И>Zij-N!KOb)n}闦[VҫM_.Ե]yM6aT? ڐIȾmPR‘B5]gQ-O)$(7=k?t0x:*5;l;~}|E*`c#c7l0~^)u簓Mu:%K RIN`y8_ qj.ںTE-PӐV1'mZ;Ǖ=c=rwYh?U؜~FdU2)QmiP##b^Rr?Ncd|y}}͞Tc^J]epG^" ET iS_e,IV Kh*'G]aRf4k2}$_} =sP"J/7ZZNW mT{ρ }a,y׺GS[<^<ѡZ}Vf~Oó즔q 8<߽M_k\凧 >C-(.aPsT,wJUoĎGӒ>@"RW-*;'9 ɰm=;"hQad4ܣJQ>7cTIJfmEFU)(uxjvBPh$Jd&BW`g8)!R!JB)B!R!JB)B!JB)Bqʝh֘T^ܓi IB=Ŷe$j׸FJǒ#F/I>.$jOɺ+Z{ md<N2 HdJ}@gT[>s)g-9Cyү@H$bb}]I&Po 2jƞ.ܠIJR6|MQmS0?5Ʀ6t)iBQG/Y[Ts}]rqiϿ^{GF I.㖧# )ฬ! % F?4)%EkY[њJɏ<󻊪XF /RmɐwL1Z7BG8iLǷc' kEM:Jd5b|$x*l8+ \DudmzK ]TSgKZw/q’HO:ai4lK%K,n-G)KROh!_o[OQ;< o!٭kHQ {x$=z`c!HzǧV.NHK\떙ZdJv+3-sITA?Av8m16ĕ|6,ܣiw0@RT9 F:*crQU_)BS1"&t:.ՙT[B%B19(AT1z6ɫ޾ˉ \*ҀAQ]#B4! R)HB!B! R)HB!B! R)HB!B! S8ht _FV5E~տ_VhjpT3RsnT+$%@wZ%$rop ǡ}akUe&=:A&28LnS(TwA TI{SS{JQ%͹o$i ^tT6Գ߾’O/c?s9YLZ8y aySOOZގRҔt[yc(mjĨ=?hLRƠx`esSb.E.qYiϚ `Mٶ9oIWYBS=[ ʊz7m(h/ WBzhrd\VX̭O+(>8{g]Dt]J 7͔XAܷp3 rЛEuԌ237sO?v\dlw F>s½˴u %_uD} ?SLֲӴig-AJ eاDCAIixj5&st@*-g\y)WK$A"6s$,8@CxY}@*_W$cZB|@^rt|vJ!=Sh`JR@2P& V;tcS?܋iw 2!%OD!0=Bq hB!R!JB)B!R!JB)B!R!JB)B!R!JB) hBB֍dl2b-MPhヹ6#ܐ ~Ƈkͦڳ7oI)n| =0;AڤD[B[VNk4kV \Zv)<-  ;CuiđK#&mmr5 Ae 8N].Bo)VB}";?̚͢I\`jJbHY3>iR+O) im2x2fv:c9лPgB1_1WTRW*q*=N.k"Ӟ'%^} U+PH'HEQjXyUj ~ߛlxn->g9ݻuAiҤ`oq`VNިM9ATs<'$s\۲+bEFQW?\Nl\0w0V[ܩÅymWr[rIRuK{avrY/8~^UjXI5ihK'n=G%lۏ\3U0UzQ )@ n@9=Y8e(Oҧqբ-!pT1޹Chm!@ hJHB! R)HB!B! R)HB!B! R)HB!B! R)HB!B! P;`{Bt;"=_"nbznIU#z[$$xnmRnoZ L $tW-2- JF#S5 B}|C)=!B! R)HB!B! R)HB!B! R)HB!B! R)HB!B! R)HB!BǯBtԫM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DTUcomi29*x!PcZz^d 6"˝]3  a|gQ]²H aگ,PUGi$7_^le쎶K~S[T_-AV:w& {K34dу/p*u\~!K)| _ks|t sKM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4D]i+kyqe }rzUR\)|J%7![_Nnn ?khѵec{%u]U%,uU҇rc}"D֡/tM/馚k5"i"i"i"i"i"i"i"i"i"i"i"i"i"i"rnι? UIQ:[ 5RtJJ4߾E*UՐ]Q uiee>W\ij%<5$13#(8Q5jZzD? 0P;dx},JY3hbV{\-rNhAX⌒!~〇~>- 9ߺm?Hy]x; $WWش쓳1KNv'˫BDU/]>` >lk^Ơpƹeq lm,M5-i"i"i"i"i"i"i"i"i"i"i"iI`Iho=>@<5nV߫qT۪ږefPAV<0Y+Cd"yR+#UTa@G??5Ut 7 "ǃk/@ ?qr͝E%-)k.w ^K/5R=A/ov+)G#'f. $E-yJaHhÏ֨c`yuz r:WfȷimVM|3cֱJ~byG`unW`+/*Gg.OiAG1,kD\I 'B55 m%T,c1wq쑌WlO[Raa[a,s^\7'jcj_iH[a?dcYvk4S\iēDc$YC7'px-涍+꧐.ME~` EEmSjޒR gWxq:Q[4is2&mVχ퍶vɫSFCUS"U^ۺ1/jV$ܺ=Gr8N~>_[En9*Xk*k-/CB+$BBDk{<6mo8fC$E}-L @*]FL?eӥۨ#pX5U>oG]mA,3C~*aYgJyAyLC+1L7*cu$3"0K< "ZXff{>_E;-*$WCAW+.z%]U$mdv3)f?SYY+HaRDC}œغVF٘QZ2ݎh/(֌[dgX +$~qݿO=}X?SY*m)R\jG<(09T'rB8k+s &'KYY5++VD֠,yૃ؎I{`wfE=·.-eu:GurJl75y\SK0gsMW0ӘXx瘪Fӈb奒O~bQAOVD) R~2huGqk)lWzfPUCJBMlŁ'P[y>X9+E;=@*aEl Ca~ FIkkcsa˱B~g5PRSo=XBݱW[4q-2a[{'^/f~ cC{M6ku^+S[$uDH@f"P{vjy,-o_~:=Iꨢ$jڞY#`,@n`v^%Z*flj1ۢPIH_UdD_l*mYQ4ڗyL:@٣=XTa+inw I ~])X~C?%I*NUAn<'񶂢/\Usm$յP#/~24\]@C q6òMSK6u?k)+#T$V(&Fiudq$o/]Ccqn ꪬ{Yl{]9uJ]y:`'+?j,v~^V 5P|ۉ{߭ڥc>D(>O%GnB#HY5O}qGWsQ@RUQˡU+"1f EVj\k H_.T2Rڢ{C?@vc XcȜ s3152֩ǣy#EagLJ%A b#};vyiHg[U U O~9<|'ZGY-mUUqMWQ $R Q^@b@#UAz* pV J"sk;]˝4[k g?]ؾ6o:eEE*}&t8=[݀^[xTkYKdim5E㧎i^MGguA)gs, EMI-2%YM"Iװ9֜xÐfcª)*3"!ڢyׂ 2HIxp>6VչZzEOf2Y}ǎ"HcDzs|fуdԛRXoH0٪?XK)S<7&!#DfIyh MVPH{#Ez"<_"Xf2,CS[U $l%hni9I$U7i:yilgwBnFWEsniLrT5EUl$IDs+gH O+텣 8j+S7EfcCGґ:%W"^&N%nt6ZʊjKuydZSWZCʈ$9x$s7n_&9ed]*k`QӬrW'JY,H^;&y{EcVڦ[$6ODB!5D$p K(8G͝ 'e:;E"#J.#V˖vbgoLs°%-33DgZF>ʶwdw>[v=Eu'Hd&z!^*dtGs{ᇐmcoJ) 4AFn܆c,Pl7&Q./[uzov5({:*BGU ޫ;ׄ[S<7-°K e)gH"zn{,Jy*eqÿcQK;}%S3F܍ewv,'r,7C],-piJb JT'N֯=>}ufwܠZUZNRܩge%A(,9(AqWqe ͢X2:W:TT&icg2AzUtzB\cVy-hܟwVݞ-KPLan$޴ycn\clt~]snO{JwI鑶uAZowiaxw}S^ O,LOYIiOr`XvH/HKEU,TA<5rp>o[EmP̥Rc;ז١$)Js4l4)t^yB^R?nJk:$C$, K2 _*,Oo7:VW5h:[AON%s?ۯ*j-vI< ^ t=s T/ ^ء:%z̯,)S%|1eq+Fh<fhh)%KMK-=[(^D`p⢻Ϸ)- > 7+E<ձGHϺ(5hb*ju sP@+d^{E#n?En7ū{xkRT%=5LݕD5B΍ <~{J08^[- 0UI!~GFD.9b!E 1n2hEu殂;u]?G{9;jHUYiK zXfe;/մۿ<:LIvg[IEX/$8LIS"?vr*ݨUDifK+c ChXReJwI@쓇7AERNg*U;21Gs8_M*s!Ԟۛi}/)x?K{Z,=7[q)#?Ka1RUC?\᩠(FY"č)pcXǗJ={8=2F+aR合!vY^0fvJ&dJYf4㶺4EoW{j- i礊K66:8p\E r:_XכQp -Le|9 ${o^=m &s${lyUܚXā#TD;#:RcU+v yݷp,R\mUTMPizW9"919EYw^2 ֶ3r[c&'sneD]V:3KDH^bB؏Wk Jz;E$UqfyW y f{Ljdc4n]CumתX´su> A]֥pZm+7mLs`K]} 4).}҆%%HN~ ~nuŰqjC{襂gA&`?ݚ=yWb7Z[ U[ULH{4XUg@B#\Hhi熶 (&*qYX<ᣕ}G$+؟)srxv`[rGyUzbDNNćrX`efYla.I`,:WnA";r#B?邡;BpOys|y|[AWN닁p;|yؽQpgS# *V9 Ad@]%GҨ1[WYkyD:J`Vhjz+7A,=E:gxu R_>nSC\[=qKŕcZ^zݥIc}QN/ѶF5Rj3,2!]YD-y}z֗boM\Haȷ#Qec#!qx=eu ^NW1;qxN5-;#DP=>L+̺م7ϼ#M`îSYc H SZx?LK^M~bwKTW:| JW äRdL&7?jx]^I:5']+#H:DZG:! 4@?GRͱ8$"AZM]LfP$ fEecnvaq8,:h-[F(5@-)*$;b7}k]XcZr 3tCRRU7'lv7^@R\/JHx}MYWG](gwTI%à#ETٝm2/7phj=i. ihJ%($^ѝF'`/}c\ae3rud#5mB?~O\^Qz{EvtYkjcZ:u/ ;Sp=ۖ "rKʯn#AhQRGK:_:ªL /^x.ݢFĤl]ؑj :*px7CcOZqMXieZ{3'LAj,Hmpp J{7\~_ retpS=+o*qI&OYV-3 $!䪄O\e=LwvUmgEc7kbƐ?K4fo<ǎ oOL[,N{?(na꾝[shk3 -Dީ QHA$Yz{@ eJ*X7fڮ3Ʌܿ\n$s^trc0Dp/,xQۯ-[>-= [uI-SJ螢{NA`efl%YņۯT֬<$sOR*Tk=Mo$1ftm->]bqr{mھF 8^#ACxXՉHYQnCRg>ِSc’4Ѳb(f (rۢ{%mSxY% -- ,eVf/i ̯H75|vU]ݺO;\R^CYcrYNY Q}yk󝷽 6!K,&,k۩ 8'٪w3 55D!(h$(~wr$.zpGa_sin?۳L9v+.v@µaxE d.$TuNu9MYA-\BSG2<>|%Kdy?g}vuk,jʺlCOQ@ҳ$$J0p@b>->gGzoJә/Gop7,.lj.4sEkWK EE-=(ebџb j{mm;IQ렋(TTCUNdIau $B[{ V/m+>2hV/aMT$q1O6fٶ]/-KoTE>*70JYJ)Heq{iF)m??U#_KGMníPQ糧:@$SGj'/ͭ0Y?Q7W=-jҪU {K_ vOKC)A&O00$H=ʽTzC"Zb5D.TkfPR"X.c Gs PK S0tf36^V 2)I_K.l[C$3,)$7RĨ}I=UuGi`ʰtں_yE&hiq5U"8JxWwuG`Lvp&$*ӻH5#vԴG 1pBH0lfMμ2Ie *]JA,S;!Qj֬T wTǸ pKjOnTx,{#kG^8S]ϱϺL5b4*X4j31kXR**ULb-~S^cyGފ)zHBiJZUi!WZgH5XwOo' &#UX?)%ie 'o\aT_R%Jҷ r)ɸl(MժObJakF#B!PV/Z7-7z?-aRB:!?Y0r Cs?Z|ttS3z,#vf^Mwcn7.|=lc(4b=%Ghh{^׎%bTl[s9;GO5c2DR=_Q–' ɺpWd/`̷: a{K&^גVZs=U1Z%t) ,eq%!jL=I;4WCFye؍K|S6?}ivKtn4)-|\rkr 'Nuvb܏MuE_a{ۧׯZRNc jWdi<^o[e`iΥRڪYCsmbeҪDJ)*^ =y.=un&φm=U ʒ(($SP$J)by qFgX Ƿ*!7unͶ*3 :)&ņAS(iTBf|04nY{j0ry _|xrcZee:J w(U@_lsXx:y/;;{n#wGڡ,(\)*:VFG隝ї/Y$|^I_l6)XV;u]thmӆxD3zdw@GB5;0K,"G`FNi[{nϔ\+:wWW3ݚ:e@do8ηnd%:XnwyޮHbmԮBJ @UDQPy s5 z;IfZŧJx-ֺnÕnX]IɫrwȰ^Vlt%ZCR}Kx,u'7HX׿\@.5ŋ9)ս}]DSšg.NHs3_ij_$ybZZvߦtN~ mVl_"-uu[ckL5t "e䲀d<)A:¯;oصrRVVH(X+8_:9m"p w[>kvgjNɔKF'>I`_*I㷃RDә*;( qKreamm<&x*ziG9-pHY8!jnP 3hK F'L]{TQA%jѾc :WZzp$ns|<%˰\bʬSJwxȉ#%wDm+]ݳVXZ|BU%FBe1ܼG+A3BU*9rQ%qsi˥U-RӒK+yNdaYb|Kp#zkAWq)9cILrC#EUAQvbXL2knN;27Y8[[T34afut 3=͹\=m6z%6ĕS*H"D ̒~{--7keٌ8)]! ^RCw%mϻoϭ*\O.cY RQC4J t0o`^%dsՙmr<>=n .w"@QyDA_ߨwNq\\}[J˷[_`;Umnjf,~6!d=},FT)ՍD}d$iJa/mW_{kl+o-DZBϼuFۢgڷuk8eIihB+FPRȡ%$lݘ^Fj{=OO '%9NYD~ Jx#ZSX% hJ#K%ٛsWcpcp g]P9r ^ F왩]W#| ?:=ǢŌm4Ҋ띒[eoYU""/2C+UϫᛗAXEW~ZےSMTHISԃѫF_q$U0WSCA 2Xb~7]ٞqYKEmJm%YJ9U.Ž|x+*Oᗝ,9֎_ b Q&e}?j%CFAG3ZV+'z%VX14m/=ximveMXC s5Excd%FyK55iw"M%<,$G/۪F,LLG,ʬk] -0d )yoL7 JIrXjK s\*6%#o覞#y'6F!zuWZI'صR<RK_֧ڭf6ZoȰۍE됏tlќ!{fI_魭⊢GD BSċfƭƥ4[ CVI=HV 0S12湭 )h(HwߚC{<<ܝlּB2;]$"Dy!(tUװ umnd6ʉ=;_MC]53*"[# 6*eެz[f{-d̥21hdfwahV<sI3srR kkUC_U dRېMFeDFZMGCt,,OQRZT@RSVw2?L4[ml䴩rRc=UyGWWn÷*ַ.ڪ{tط*_*v *ՇpIsF!_X [a|O69yM[5h 7WRGw#ΆH`ӭ8j#lZay[ێgx[]'=6M-Q蝪b"貖br-#*[Ej6z*zy*h*(^73Eyg#ẏ M Y/zWp%B`ǀCw|2ӔR}FU= }M@H`YG`ƀ/˓ZȞ7b†[L;{mpfgv0RU"gVWe!Kߒ; Sno쒗oSt/ׁhjɧV%a$RE9Hؿf5Ýg;VA?[ZHˀ1( X1:o'c Ϋ6;oZ Ke Ѹe ;1&_[:XGApX? õ1ۅdU")/$H_OXي$1ܦӎy{g9MTV$hX{nf`J> ё+1-Z+DUS]jXӳB=Dq!@unu òI+ 95p\dTiiݖh[#uyGS V<6$fn j^$Ar>B"IJc 2b߲Ʈ`4h%&D@S9b*YYXsoSn) aU N ْ1J$eugك[^ݔD+Mdó?̒< @&TJe}~[+\rMԎSUTHJIdUTOI+ޒxl2CcFEJ#paV[ C(6[qgcmqGɈ'P;wư[U|/7jώ ~1g0GX. wc% Z `Re$,ְ䭛|١cqٽy &H)%+)d1xfB=|PVv!w^+!|H@u=N~T3/4&T[lrhެGqb/e2?#%H'_fwk{u T}*y5O©jG?9֭7@ߓA- sh6ױ}["ZhlqLd̒M(T2F,Hq;?9usg@Qb2723ݝd[n-A}j:X7ҷB}Ja'55N[+nuŚlvƴpv։`U;})2$zVbé'_7g'hq Uֺ䣃Lvy/8V8~W.v; 4uF09P={˶Wkv .?ojvynjsFС,4nr tRgLב꽆ڎ}܋Keͬ6zy#b1K4"W :2|/Ű,EnRԵPACK@*,u/v= u,xMG_9FC|eh4Iwh}߻I |תqZzh[|욢.T@!"YPZo^omGգ/׬+pMx3:z 'bTUQWe׫gUUG - zHah%/ ۪xw [n%%ʩP T('彂#?jհt{^ލ9EJ)KG4s,$ Ўsv8یAk6IAd+'A}c9a..~O61=%F[mZ[(czXCS!?;LTہ"koo5.F+Φ4tˊYP3#ܫ MR%|o3~8/̶Kcgս(h\Š@,Sp@Qn@eY T,0P;27ј--%bIePmut'{ts~c 'o[[UM=Zh:5Y T2ur"'P;y]:(|FbA9?5ȲO􂲚U55LL5#(Xqԛr%筻Yl7+ŜIJ`wt}e@(FC@u$:ϳ,iJ?nnspzW-Um,1:]]yav!h@̨%I~qjɈd܍/wݬ=?SGQ5AeijUTB)(5L4emﮇב"Simnv<m~Tg` ΰ­$5<3zwq*Epy#dչ1kmֆ*EDZxE-ת)ɕ{3[P5ZYTgZb</!R#+}WmCrO 2K@*SC46yަY>* |>~5s5K۹ڬjioi^*wq'_}nGF}#n6uJA:oRV:/N5X{#zS=-] AHcND*Oq!Ho{sࡿmh[&55Ub!KIdEb[C' qǤl\9?\l۠QeQ*aGnH.Mՙv-Pw"BQr8~#/<~yi02A4~XV>X#7.Vsٸ7hEd_Wȫ"\$R]pu÷7 ;;ڋL43_sSE*90SǏZ~ٌzsaKШ[dm73T*x5s%RŊS[*khd4- YbI |g߻OYBry~{)MWd eۡxh"g@$pW[䕌UK`7&?b/jdCE(V o4&%X!q+xgjkE]A27P)91?{'XMMjA-h,Y,&??G?Wmc5;lֻ5 X[4 p]LM:xnW sjUS;+ۨ+=|Ctk4]G?S䨬1T\.ҭ}1G#IJ9dtde?Z○B)/VPS5Y~#Gr&=4jTp [_ţ>;巖SyM&avr[tkY3*d$zjy aD#"x{DzY Ᏽ.n[ N֜s ,u7_R ,k< 1*kc#V&d`Rz2o+s˦^[ Kϔi+)nuM,E!_/M9C+%*}^1ĉpj"5sy _!~p 66g]wfեH/tA|ߍ#EG#i)$C[$HV#P!g1B4rvQ@s|~ˎ~ufV -ZWI*yA?jUM4DM4DM4DM4DM4DM4D\<"p?ƹDXܻsj ͞I%%tJj$RE,N Ȍ+$/۬#:;mu<QI,f) e(H=9$,,WmG[l?=˩ϊ+#Nsq%qmM[_+-NYp,%LKM%<<>QgZ)^J7pX#%w%n(ųPzM¸ԑԭli(fzӨz{ąq-@ W2췴?j.IdH\ O"ou 3n}TA]u:3r+&L U;HR6x|ǐl>m7Z9LiG#B}#c+B;Iq\k8?;sòi<[OC$%udza`~Y ʹ/[^Dt;R֮}JuDU7m_*̶>,zzc]OcUH*GRO"ـ?FSG?ڿd 53; ?f?佾MM]Wo$(A.eXczdvֺf-[]M& ":5dn̲8,Fen#W5+)=wkdsKi:܁7S 9M>VPsߚ +53?&YGebHE8#Sv`MmqEfA_jCO5Π(Q5CơpIqγ>A*@5`rui.sq$ |xh?h~yM4DM4DM4DM4DM4DM4DM4DM4DM4DM4E~Mp?M4^ilt^׃"Tr5ΚiWM4׈<iҚi6M4Ei"i"i"i"mayavi-4.5.0/docs/source/mayavi/generated_images/enthought_mayavi_mlab_flow.jpg0000644000076500000240000010163612747716313030534 0ustar prabhustaff00000000000000JFIFHHC     C  R"  S  !1"AQ a#2q3R$Bb%&Cr'8Gw)49FHVcgG  !1Qaq"A2Rb#BrS3C%Dcs ?ii ii ii ii ii ii +y:r9?}pO~5 5UO+ #T*<8-^}xIQτGoXe 9d6}==AqK%I_/a@pxX|mis$ %Lq],Jy~SK嗓O{i aE}yܣ+Jf &V z@k"r*NH@S<{?mDQf_ufwud RG[smOI @=ݲ6 kn˾OS2wTޒz)JP9fx0!dGH% Q%:稟uJ4}@K,/& ~)KY*QXOŐwy]Whc]܂ mTs]@%#' ?,èVp9.z.stЖw&O5MქTȋ UtnߕYOtT}Z8}'ƿtz2ThԿC-yo~5i'Y8R]8>~>?.P˵](B *ctzh.mrǥHֳFN1ܧ* YdO|FrKR^.ZgT .hSee0]r[Pd%)PO9P'ޘx2FUAQj (Wb4 A>zoE#am{R&9B*\!ϊt*RxZp/7Un ~a+LI>OoNu㍐mUs`ZR$WWUP|6Q+*l#R!"u%V ,@n9=oʛT>GI<:Xk,o6M>+j46U<K#)'<)7Lz>.k%8>ۢl;"MRDeJ-k HI'k~Cil׭J(2өI$(x@TXWNOw7 9= 9J8ݶJ۶hi"4  m>BG-guN+$(&+(ˡ}]";\>m5]iϞ8:Z{xkm6>$OX&Uܖ ‘]%U54mJ CŎ'؟#7CJmXwU6 , bE\Hf](z"{Gj)Ix`ΉblӐRD^Ipnrk۾"'Gst\7euHbY_l2mxW(n|;u:J. CL4ٹFӈ"|ֶBf8_B'M)&ni樹c[xܬ .( W>SmӢ`f[a܀0r(Kj \p݀@ʽ\@2E)vK9?w&^[zhqJ8 T3H*[Fe`dW&+W)% r*2[CͣmgR DR2}91JVyHm^veF#~r=H=djCL+NGhH߄hN.٪] BFn)K;F0oo dÞ&W$5~Pd*\l>A)ZRіJP6.꽻lNI7x;[Sm36;42ry.ÿay-ޛ{TcWn+F}Ta;"SJAXiI<!^M#(*AP}\mA)><@*N2ED&\ѲؤL(E'q@ݝq>C_KQB=4T2BRl̟h"hȹ/(_އ~A'γ.:N5$X:Z2iq2ڂvsÔrS8%Dm:ǹe'DMmg[ "Kgy8<:N7)2TWâ-5 u̙mHWcSJ<ɭ! (B@H\GSΫ^'TwLhdJ=r8AitvPmU kRAQJ*W'Q]?{rUM4kHHNd|ĪCRUˈlr'(Z=ύa \:vJ`҄)J EWq l~('I)L₷i)_jUܮLIN99$+4KAsn_`;O$pg}5܄>i{U¸>PKVdkP+[ϦMQԞR|v2AHR'W3W ۏ֫ӟʛRR&JROΠ těu _œU:=T%T-ﯪI=ܣ/H sA\hahi!hiUϝGJhV}uסTn˩T2xA[:Km)*RxHZN߿[n=f_ȱ9lTU`;^BWsDw+ ivR\DY=L ӃЌ߳R_baa"k{-*W+ˬPy==e/i `-ZpwulRۤtks3LE8TOR~2MKxq KA|~dJD}r*n}DSVkkVf-Lܻ VںTW2uaUŝw)TjӀyFl>U)#5!Ie,z}uowwUDOA1G49P-2VG:f"ོ= eԫIM%LG%~RHv,g+ېAOE\euĥ c-vsIA 'GTS&aic;"K+_}:DmX3fFYC&EΕ2ZSU\fmxH `D57XbdDv`Y֎;1PC%*meZ}ϔ%PR`Mip k(>̦v/Ӫ|JsDZy\Lia R,mOcvk;/uWm+z B%1ʼW FJ-F RJ*ZiԽ`%=V^.uC,*Q!bN1wŲIWsIgސU<-H$ԝu0(O{Ȗ랫/wzgޫϑ";J \~ZM~DbcA G K4Vx[;cfwLd<~g[jg?TN WRm6Vڕ:hU*hҕT::V Ai+(c$RhB|%u[Z q+{9mk_}7w fT֑YpዊLk9*s! :-;-vIq!hiũՙT<\A>G][YF7_S9ΦըL9T$NZBA%*J3^3^I̺n3rq}idEݽc]/|cq;R;JePLun=lv]2Qִ:m7#ËϡjsmKDJqb:i(jmn_xOV\؊0JEOC'ͫ&t!*nVVҒ͸i JBRBr'/ku_6VJ [ރ_rEcCA $yTZi.W0Lu05u;v*tei!!JIJڰ3^U ¢]LD+6K/zuH %MIJSgJP(ItrR1ߨ֖ixUDE:Kn♛)H<.B RmuG*tܳ1n"nnr-/ZgxaARKL nx!e␓93,XμnyiBu)73^JʒUEuxP{ުnQ!&nv';ϩHV^,ϛcFkaWU#$iT P$rt-n*<03JYS]$ơmv)=Vva_a]&c3LjL8q %R~#μoTKjd\Or>+AIb9 N8ǿkNX%fnʃ"&PmJH*ޓZ5^5uqTT*y)/UWMnc4QwŴ?ٺX5DG۽4-+JJIώm^5,mrJom5sJ[lK-QQNcmGBV,z cTn[7>BKO#μ+;.4qç$o=FaN|S1 5N5H)y_Aj;S|e:+W5rUQ@5  6VJYdI+#E^}҉r 6%ކ”y\n;\&^6IȰ]Q閽5֘CW-הPT  Bu޳:]Vn)Dٸ+IH"O%J=x1;1կgS>+%E.g(%GIM{<M묌2SKM2j6% ܢcN؞̓]˚̆e<7ǒDrNK?+;lڶ=:"2#VYI$β`<8?<$YByeo$ǦPz>нl th#'s)Jq#9?#g|G^Ai#t籱 \͵`BSuyNu|;¿tzMBeb[!?EPijx}Ssh}cWb'_.[LmNJPyZU >ډN6]q ˙ MZR2/.wp JSY%c(UqI\]y**w¢IROağbL=-a WΑSy=R>7ЛĈ%o^eץ sޅ35W#~]Mp$HIuo;-LnVB2͢EⳐ?F2^Xx]T ]mBD|qI>Ԏ⒕$p%X8җ5hSqRq}=2HGxuv=x\Jni8' Y>/46NYĿsrGhRzj_@< 4DM4A 4DM4A SntM}dudO- $lrOqyJn6k}On,H2ܻ",y 4_ ) V:wl$uݘ51r_*W )-B{cH ۜ3T$%jߎ:p8["Sܡl7;:U#8jR^㚋=iCFtܠK,EУ:>nҾ-b܃Vg&R&zSS*ťMB8uH7mZAEaڑͥ@dBfiR$x Ω6m g,WvSҴ[S?2eT=R)<Ө,X.6zovb="9XO N9 ڒ6õ*5PhK ,'g,iY&oeWTzNa&J_Rt:|B]w:Y&RՋ?.{U)$24w! >f-U%p]vN:ۘL.sVt˯ nҤjYX_ jMJZ&l RB{:}3*ߩ cWS՜S%ZEk'[n2؀)Fm\c%Wʧ6ψJmJ#p#7MnK-)ʆRA>sπ9/J' M<⻒CύGfq0R=s>qJ42axu\R `w^/ܽbr C,'А}Z&څM+_TK w/xO'^y&4)d]" <8\>$:j,ai i'IDG^ο@yO'D$yT4MG5匭``kpfa3tW?t?(ߗ=t;.k`q*.m !S*yƌ* \!J F"ʛoCJ][)ӥR,ȏ^H[%>tCޖI[|I;yR l˘¾v:a.%1RB$涙5[Ufڿ*he{GCe/8K#9(~vJ/wIK':rͨWeN&끶ܗ.[/4IJA%22SG}VU%3r$ԮXM\hp6.Σajdl:X%)i*mILޥv2KS៼ nNi)UO/JF:͊FۢB@ *@.qQ:veX۞ݕ7+]~-O" :y&C2 J8AIꞪ *mɍbv?Y$}% r ZĬ0U)}9fcT=%,[>͑b.[&ڦ^bff5JcUt:ą*G5%>NIR$\p XŸآ^A 0@T$3؀ki9چobd~. +}FR~`xCanbshG1mKMlTHhs#:hVjIvbZ'EL(w14|k~Эu=Vzf(QfS?}IBKmJGm#3^H Q -Y=a@r><=HM6_~;6O~[^R2UkLtP)啺Uκ+P[0. T|@v:#G+1qqA} yPwaKJJBEVRG„'%jB>:BHU( N[!)ZM6(gSbPY7GR'eOoS8j6'MwBՊ>~(T)} R *6MJUrTƬ[`Iw-Kl%m"QVmř ܶ &Xjŵx!!M-%Zu)!$) ZcynFܹ0kڽke;"\pLVi+}lÊ$H y]鹼bYȴŗCy  m(qR]Yt]Je׭R꫻Sw٬R6Ek#⡼z̅<`-e*E <}#cI *p[֍ă {bECi%"S~7mHHj#c[Ɨm%<$pJ q]K (oj]-\ąXAO* %A$>>󅃃q>05M! ?dyO$|jf4zQįd%'\)}AͽmļjåuH[iKi“센 wLrp=>(ULsMܓIJ֎I =n9>X@~xvZqXQo+U%U\pfK%$m$ xF3-ʠشDaOWjZk&9kx@ ?R&2TTJ6HJ@G!#?]s\dpO?*Nq'ATD$G<+uy>]G[rW^)rBs#AT@u[9+;]}jYU"[e]o+)G/3%WM.16`]bΡlo*"%̓0]"eHZJO'#yr5;E&;Vԇ*| +BF mq1ZR)?SyERu$(8?1HQH<@6H|ip\zgMZ$_1XL<m3mBNR)%ZTGܕOt9?M4H50ZJE-5#[5fl#l..Ni.O7Prbn[StYMedV SNhnI7X1ZSh/;;שb*(T֢6TBTۋs=n` ly)mєo*DIT8D\ ,wڻYI(ZghKȶ2CQkT'Zğ%Ƥ2N:Ф+I)RT$ؖ܁ n|(RU5G\rvV3)ЩDE&]9f^{SQ;ӣU^BܡcZ*Mk%fB$Fut]Qv{nB՛fVHclδJ4S<E^ʬ;Cȗ3;AuvqC&OHzu6IiL6na)lԇ g-+N}:-QChQK㸟O9:a)ݏVc]U)H?Wm&JXo_ GOJ;~">=ƨĹC=;Dtb.业̤--De=ğ#jcU*N'd_`%3/)q3nM@g|ߺ3UoK_z1%)2 "UoQRZ)ݍF/o'έت*nX̚06id u{JZuqɚh7/tl?][z^305 X~_΁VJT o땯(2>E4sq nElnbj%UJ]"XGhZK ¸5:][EőO(TJW PSq%%%U.[]BPw,{-3A?k,M T~Cc+#ҾqgVOT! *`.pq Ę7+D j5AS/jm)k $ =['xb=Ao;z;U̘ H\Tkߴl]I۩Ms^ľ@-78ޝȍYu3߹Nq5ˉkky uOBڕ-%%ψj/j]t[+yb0i@jXo2Z/?2a dÎ+xIױݱQu9Zr*^v,ț -,J=2I6Sƭ3G~U m긾TJ5 *t$Ϸ:[fmĶѭXV\.4_Z`RKo.^DT T13@ۏ&F+Xۗ,'#q2>)68PUIZeg {6$v療k {˔66+'fI)XFd6]FڸİEE@l=.x$xֻ*mnɈ͎]MŸwCHOJt5Թ: m|;*zo6ڮaÜTڸRCS* ԞABfHui %--X--t"8Fެ.]_׽Aׅ&)ʅbjS>ryu]Kir/.~i^Z Ź9_ye:VQinq)H\_~̺"aotjdUqm%PQoO$yO>B}lUIgTx8 Q+YW"sa5`>}5iNńkZe@pivyNM4A k:*)M*EB[l6=Q廜h% yU}XD?= 9JTI:Z[Z)u%7C|p{IǐqZI\Q6!rI 䗗Im$WWRq$wGғodC$gWҐS԰$$ĺSޑj5TfqcRD}ix_JU zc1D\B>aIܠ/#ƺGc۲bҖH%oڸHaH M-$w:ܵpTx灯~pQmNTv!eO=%Є! yQ'םwX-&$TU<.ZdrN5Gl{=Y9iYX?q$8;_'RϏԊ؆hOj(~CL#eT.̺z"}(m'\Ip8<u?3VZY{0ʩnBX‡' JIGye.?rUS[2/#V˶:r<%LceOV.**KtzFL (xq6*[Z3>"SRWl(҅rCaqjňOw:R&Sr qz1@:#$l9VՊtaTfxL4 bBSrN%5(o-G W5: e/289 I ~i#@? N۾?wfk`[vۿ_ FGwj4}h8=McO&Wy'WJ* Sq eoxki RIYp'u,Ӆ:Q&)9J.Uw*EyKpAPY'VTRz&na(?";%2(oCL"5JCRQKf,% IbB˽oU-CL>94,mϼ]u-SUR;)sc %Ai@K0hQ\ Nv0MlDڑO{Ͷ^gq;Pγ:mʤw)b뎰5Nyqk}(~!*a2[*  يQ-)Ȓ)N7'Z,"̈bŘ ]U \-26'LQB^Sni%G?5Y%l`ѷyzmtU &;jj ~+(EBQ(ʎT-\(kRyZ.Qdkh!M(uե'N()„'(wτg]B[gX,|_^>:Zm_@Y8z‡8ۍ m4BΥikdF_cm@ ^J9'β8v.vU}¶apF =f`>ڂ >G:6_E*KL7KL2P> ɨo˳s>Ό\Lql8v49!xogG><}|j:l5 UsNTR"*qK!' *Z}<,sƿjٲMi@k-%!\p<{}ӎIˋwF )4ٗAo 𹏪#֙=[JD 1Ͽ+JO}<5Ϲ7CZq;tGp}yﶾn5aMnSuKԮ ,wpܔ,qC<5 WnUn"F-ЩxU2ӬCԊihpSw8G'ܰM*ʗ'y^U,omFIJ0)$.3t{r! InW*ࣕ,!I#P#ƥHfWLx OܔziOw.$]#=Ϗؿ6sf/۫!hiTJS%>{S HY#Vp<[}LZ")y~eOA8;|X?EzRn8 Zms.#~qcw!UZ]u7\~RY~S,H*$Zw=a5(|I2b+ܝ 1@#jKj 0Q=$(Vԧp[xT!aacGHP Am @J@{ s$,^Emإ /~o:h=Ըii +)glk~@/]YŢ a ))!wʈy(@˘J ;kvRmn &JPyjK8[QNjCKIJ|Ai+i;7=2Hv@O½ ™u(uĩ̀ C{VI*,\pA`v؋ JbU81pUeUQFWL-ȡ@}_ ̔[y}D66?-;^S3?.X[JM <[Be%ҝD}%aM{fU8]6jяRujM-m*;vX.깳(ʮ*&mJpP.+]A+Wr8#wTB-0NG8wJ4^qyB@,ZV@ WULfS-a4ݏ\>й'TXiǩ!ǝyWcM4kpxE[gO[w(BTXADb/!WMuSUly%ȥ)HD=}k[~SJ}4{ܗOsGtݠuڃS=E<.cǞj3rr_2C?nbaugE;&/vu6iAÅTȚPPhU$AMns3kwik͙::fЍEEe⠶,d'i !\BYTc2^6MkJmɷ]&"kJ8|̲9<yT~w7t-4uUiBXß'Ԉ+JwpB +/;y1G*cA>6lzO?ӍQӒ3ͯާ=5wФK,xW)x^\YNQ9 5T.+ͮ>3>_QYޡ$mGlu\]2UAmz!ж'TxG|O O*$hMޗgU@ߎ`yƅ~I-.%I͸m+Jl7=:yWt۫roP]2@ >xV>[eMĂˉs ƴ/NfNqx,1Vg⦳,}6Y. Qq>esRfHN4g?ѺW\ym'gn&U;u-Z41غvɩ:IRKi*qL- \Oh#U4F p U .W9l_&'֟`vl?hZQJh= η*R#0-cМ ;iW6+zA .F+2kRsf![p3G9)i”~HּǷƿ:s`&FĖu9DMO MRBCn,"Cq:}RUMNaJR ۜFҭ%LbN2[f*"6&δV=N]u8ԖE iכi),ʅ9."'X,Vdmj9ť RrsM+A>95\w~wXwk#_GQyh8O:KKq 3=մƙN%te%_>"U˛xy(pĊ BZd+!)i>~e$)\'P03\vc̦H?Ŀ)JOκ`Ŭ{޵-iHlHJˁĨ{)ƧR8IQf?uO;\T *ARӴ{ O`l~q(` Gv癌r5}:Vo 4DM4A}Κ gygOiqiTWD-^ 61p6DBNﶙ6sˮ_ow>'-"m!OśAV;{+,;f$zu8͸IٗR-w,yˎp)2]aHSPԶq]!+I ):ꍸP?,3Y' V|j֣"+Я:u^5c )&(u:Imifc>O 8o6Pu\؛!WEHCJp*"" (_qOL܊n$VnEp!jLV눅J ᷽FyI5v#zXF3;Ҭ7]ƙYhԶ=FsiJB=F-^nX-zm{o buKS58T\U;A\ima0RA#|3?oL&\n߱$7fwEi˝,:=)i~tZrm,#jU>K<H>@#o^7Ѯ:e VnDJ@u VObS[W*T W o&PY~Ϲ率:]jc$()7e&׾AV70}R9-4h[L4ZֽM #Arj#ŋ7%ўTGO$- Go܍ڿH#Ծ}_׊%sF\ Q]lM> #/dOyoGU$ʡ)Ũ%$:[ PO Ti#Qr<ƔJiu{.̞،A“%qI[Ya p63}ûZ÷jTvBRVZm68!ҵ)5,˿oo~jA5Mm[CWE% B7HmduqkYR"ٞdaLN%j"tʹzt>ܟiPnS-XWYGޱ=.)r4‚Aj^ AԿdw&tIx2ef}Vny"KKQM)%M[!qd2oS)'^O-E?8Ҭ **iPNOIZޔ-M:ee {v.ZE{{i)OO]O!V Rm_+t ƛdk 3"T/r ڔBB1$0-Uh}1PZ qŐN=Oz!w1JCl+Bj]}jʶl%Q ~[LbVR]'宝;K)WsdڽML:t̞!FHKqe Da[e`qHfҬ7~[}lS{ka;n([L4eQa4ˡxr^Ì8W nFV?}Gx6VGp8:PJ TnQlf{H5YwLx,G\APsՄ&*RJ[M:N;5cLiN5KL;wm<|r99j\$X^+e5"ľ>m8n8YQ+jqi%N%Є#ܒ|Y6df.*@)Wnԩ+$x $8CZƫ]P]Yzpy:|K6ػʷS+49U:?0HľIkuP+2aK2wTt_nkH\JH Gp:SfO'\EJJ'=II!HUo}y\p@O<yԖ\iXJ?uwʫ ^?!.C%c%H<FQ |^\dxب6P>i|ޓܕ=N0}ư$/e\Zc?KB(킅R0̑u+x' OqHVEge*) Síʾ=י)]F<(r2T<-$V?mt*hfLkr`VpO$d}Gڢ{ObH:*ְ5>">VGuA4ȕ 4D<{~>},v18"**Q}B qB\p%FLA̽'(YhSkWG'QmJElVO&Eb 8?N$kwclūbJ=mϬ5[o/|:i A 3R--bOJ<׷+j֔ C Wnc!4C.Tvh#Y _-~ ,}lȾ-oe\eJUUkN65Feڂ G?MV{F:,AôzA}W&nn= %T$RRF<׾?`XGkf[f ;:Ih)˲SX|86di_to{k;U#v<)tҪBؕNG[) I> ui%0w [.+yK^Z{Zo+άuL;Bb́={vFcŇ/eD(pnNEn4c#2Bm H kO)_oxBx YpV&MYΐ6apcXxFC u $~7`ׇYuJ9ώj ֺm 9ɶĖ( KˬJh$}cHlJ(AMsG͵ {z.tX*>5S6YuEqD|[կ3)(o v&'Ki(BU{uHY(?17 ^I)NBpX(W??/.Ⱖpwp{RζMfQZA!)BP֤ 68֔!*R:遻+e.),V4[Pn}k xi!h't8ii ]W贙K.Hrk)&qq "Uty7Qk+x4In&\YQ`։QHCt!NLm"3o0qa͋%Lh LVڸSmr1n28ݩq5pAlG*t6~omu i;:Je1n8#VM3t @677W\)J-qq * ή}7k3\ E\Vm.m7bPshj,$!bDMM4-ʒ ݃Y;T2h[G?(8q|$Ԥ#qA+(m;i/w ĶfSh]Ժ\ۆL.*<"+[JR}E:k}Veq\ˊ֭ܶ騔sqiq)RBԥI%^1sTTK ~FtBʙu+ӱVX^]DF@MjmS$!N ʦ=)+TyBy pzq47&^ Q~Jqur-ߦ.5¼BGĹ)khd'БWU;Ԕ%I ! )˟Oi9I60VnZ\tJRV(JIOAjisyZ[)61c) e%]Rؿ,l=iif6MYuDqrJNmTgV借MBְ(&j:8Q}nwySռ=.ڷ<)r2\8\Usmo{k;5z޳+S-z|г%STK|2At8>!8Ň~][Ynz_R|Qꭔ!(i$ame) m)H-M^]mz C>ejV o̓8 F);i MZ6efbH3́oSHHuVݪ:.C vj&So2-r9[)#:S'A]}yN܆BYQ<;MH &C=մ.y syO[%M;w-%) ƿte߯ ĢEtŨ{IOЯq>>mK4KFٶ5ߠE)i%@k_?Z=B_Fkh4%Ж䣉^B!f\w)+>!" Xp=ON6q>ƸgbjoE#$v:DwT q<iE1lߍd^*&֎x m4i`NM4A 4DM4A 4DM4A 4DM4A 4DӁMGj M}ovk]ۈF.*-]8㨎F*!]_B qDޱ;_z3E@-̊0ަ[*-hIq DRRU`[3}}`"z7,Rmv.|\GGV6{U"-M.@qCC!Γ;wJ;ZΙqi(.z\TBv *cqd(Юi,1m}{o)[h@{Lh̯ՏKe P:PjO4b%Wf/n a;n;yӶfS|v·z{N=GKe==Œ$d3R%zD ~ڻ9Ti<=:@=H~vX b*vn~A67IR6> *K hm;[0ьI}^ߨox>&qGޖ C+ $$ w=VX7GYy 55Nv照؏#^/eر3ت_uz"3..HGB~@Ʀ.\v{{xXNJZ]CY.+{R<ɶhLVҧӘJ(iG:iLAؐ}siӁ 8i!hi!hi!hi!hi!hi!hi!k<}Nk\}iB{寔}tAviF86C\cI:p>i 4DM4A 4DM4A 4DM4A 4DM4A 4DM4Amayavi-4.5.0/docs/source/mayavi/generated_images/enthought_mayavi_mlab_imshow.jpg0000644000076500000240000004346112747716313031074 0ustar prabhustaff00000000000000JFIFHHC     C  "  E!1"A #Qa2q$B3R 4br%C5Ss5!1AQ"aq#2Rb3 ?:7ǘ+u]7Q7 V[^_\.ˈkA{. ܒpއu W>^phͥ8ۖjz˝Q)Nt1Tek\+ߨK8ۆت9]4Ba73|w~&ƾ4娶o]U^:% Ǣxk{m1ƿ,~:X9#O7Ear􈈈'UIB䴎PMOcrQoF[p w*jp1 K7)܍w(v]xHdbXas΀'Jvg%Gtvif5yzL .oBָ4omrTiXiX O3)] .k|s@$4Ѫs7;uu qr kkNUmfިG8sq z'%ù -3wnojv[ uV8s0ZЌ୼ot{ӜShg6?Ězo>-^ '@6;N%d:}dT9Tw0)kerO@Rpv_ ŕqu~˂]5X $pu2z a{GӖr00X&/{rK-Vq9Ъ}^hۭTUIMhqvW6e1#8`-Cڹ[ڭ74~1#"F-?3eaj&.5WƢwYWU+y\=q%.$I$WP|:}a_!}?%={_.N1Cv*|haiϊK\ C|PTjm+JUrV>bֆ4I sֵ'h]bR*W 9=>skWeeďoA)O hNtݚ'9UfFUn pr),y.me!)Y۫N2eeJ~f:7kKX힢e0raXv?T|ydUڷd,1MP-}B p#2>ྱ[UzHCi [mBu^lZ7R\US@Y$d9t= kpo?NZkLN̷ G+C#sJU]to6aԺ!Ø?BcmYſOOx^pGS[Vn=mk)ZK +G'1+]#Xdhte+C xv Ξ}M } K*(htSS2F=9k!-WEkl{a8T{, p=+BCv'o+u?|<^\zY|U·s/vݬXI_Kz=22Z#X#8WFIjg6~|Ȉ6{'?yA;o}8폎%,8굽ԕ9\I~*:75D.zni2ְ:=6jYOc˻ls@X=e.* E~EN^Vo ? tF4NG#Z9Opչ_3f<Ұddr3PI9ԶeVep> RK+kb)N֡6$Lu펉do:"{al]Fd$1EQx# ýmE7%1cdzVß Y֪jan]|{ Ꚃ˔l+t{\a39_}u*=1K]8ap>UP-PrZ~|fx>Gt;K phO!#YNgAT)//Rs9r=ܝc#b.8jn}~^j(U48:ҥKN uf"(q-kޡ~]M^7X$WTm#&TRh=mUepiQXN]}9 ذT6ZojXѐc>3n˱BnRR%y#`$|V2ιbfMPvج^AՓpgRgSY mmE1. mZ<*)K@33pe#?TT>u̇WbS;&ŭבI$-IcgWR;UjZI$p=z.AyV/`1l5ljH WX)7Pִ?^r=su 7 )n8#sg2{տhCkk?A8sL^f ǫVl֣|SM3GRU[x=֣rfCn% D54ku!yL'*[#)mw#mL@8 &v#J&?Uh9w?E6!%4a#*[G$ފZѵqR ; n0 me26Ku y> yDafi29'ԱA3?oEq1ӟ\ѮUͥqk 2p?g?ׅ0:m?KHf:6 .S]us_:(=L k@=m`[#Y]eU %RO \<Vlyc˹5Good>VPpџBIvm,Pڊi$ohss=Hʦ<7 1Smv8\vb˞\].= ;}?%[Uw ?%'Ii ]ݷޤsX*gŶ ț\H1![sk[o6.kT16ZjyC7Z 9[YwUnջ8]DE )$";uZZ\-!h_nqRSD\I+\zWjٷm?XVg磵0?wUR џԥk\8;t2q R괙Wk^MQ}TjA\j4e|!h$ψom~ꊭ!åt_%Ljf%W+Æ5/>&n"}5-T#. s KJgl"z]3u![%ov5t?Kg/Y9y oB#- ZWACrnO(U7.,`z-׀c'n]ivO٢vuٶ5!1Ǖc{k;c?[[jVFtj#W #Ӡ f:1 C8f9 Zv4 Y 'r={iǸ\1{*ָǐɎQoT*rP|˳譴:~hۡ*qs*WgRѶ04}|5ҰtT~;9DV\fAݻ+H]֨`հE#qUIe4u+?K]7.y⹌|o}4w ؝U13\% 1XP-Ҏxng624qgRT5BC]H얨߀BŢa"Q-y*Y`)kH*lgAWznLN*qv'}iO_ky?Lvtl2:ὸ=zetx߰byYq2'=rp]E3xdiǰωqE]PXcy9ZԓkFQE!vdԵb&4n' aV?Էﭺ̶әOPw-휴ƟRxd^ FW=tZMq̩cݺ P9*/RoMAk?Vy'-~j.HsTĽFLԝչj;R #d?Zz,Ύy>V캚>}]Di9 T }bۢFT<$UBp[ n%e-$U'APK_h.  խ0zt³,F!vpCa?6v#-HZ:+~}-[KhcSkܿ5?3FutuŤ5 ;M4^5.kc#% w_΅f|x[?nOI#(9Z=4JZ;Z摕&y[5[5zeb =B1xThL]jjmdnw84j%T]Q @ sn^]mY-g6dS]s {r2Ç7=@+Z Tݩ[Xdj]woU&UoM7.܍]Eg;VM#\HW|=qs醯__A!l1GK裵l̑q[9T28\I+Whv޺R&wi ۩]VzY<)¸Q$P[حznTɨݎ_<ۋcx\krmQvS+~wd5Iu~ߞC߾TZf*)bᒮAvU+#^4znge'}IR93b{n߆eC[y `N}קLZBXy#)ŋn>SC)8kzv\3OW(mNLX~38JE-=%+y!`WJ1 c!=Z qXJ`>QLz,T#B`kBf_Z+ :zˣTִQ:'m_cQx~OEԀ橹ibzeu*55SGWqÒݯu^\W,#dԠy jW{Ҡ:TXRCWplA?/EU\]VGs=uSU' :=tôqi}ϒRѻ *1Iݻײ2[؍xlck)J/B mEW`}UTryz K&qaqplWZ $bQi\!co"\oiz T{u? 4+v+RZvhZ孴<{\CυA\2r>U6אMWpګdekD7AJ섃ר 4)'3=1oF\1T6m|qR8X+ 5Μ|Gl+Rg3$s`DU(xa=d _{)rz4;{?]FUbOuVvkj[4{|#yyʮö91AΝˎvZx{Uni~g:>J-ég?ڭ[.Z;gth sn$,|27 Mj8`*s4\R[ML״Q~5mX vT8USe!0/Xl<Jm}z8lm׻m1tkOk,eKXvhȉaMK;骩HkA#IkZIvbp9Ҍ4S>Mk0G~xY:qCG8~ߎ?#]>Jj3WF͟Pݹq?UnRGtk)+/_EޤiԔ|Qkq]fm\eqXb'9-+FVͯPrb!.;fE ?-5,bJz%-g|^/ >l*KA|:JW2[-mX+$=bVo]5yc<ꤩ`r=ʬdǰ;)Ue>a]۟Pc1u׏SIPHN~j`쁛!Ṯ;Sݢ򸃟B[^42rmY";0qE|>#rGUҪ=pե9|M !FvanQ^u4*~!AYQ Ļt)Ʃ1hOEUkzچ59.=`c'O()u Ԛ{d2ti|@;ˬ\ S #@{/'϶ČtZwNځ{tm,s};Gl=Wz;ńI3GAА[vccpn=rWInuITOU5D01+ޣ`3&HWoʶ"_4/o$浺t}6>yY[~糘}+nZmf1%m p[fǨ!g0ӹNnX{MG+]Yw5O";Vٸ/L2бa떨ӆ Π'jtf A{.]5*Zּӹf-)GW[ح^+7eҘ<B?m[qE8񠍯i ֝kǸE`-.ozTFꝲ4?W.f};Z?ik=/4rnW[QQc@ /G_1~GGK 3ㅘ~R>euiJKB@Uc]!ecWf47 !WZ$1EԟUK՜{i&cUma/pWB11ӻBͅ\j9,C5ɐf=C֋ g/ SRFs#gi;ܘ|pY1NKzU?1U|謚7-`V.O f2*Ҿ)r(!elX_'bnj*V+'A͊->G誝saemF{EUn*&dTq5tnB׀J N!aR:Mj^X#z. z\>]/$Ѡ,sx`oo?_0cR#u<jnSߨX۬ry-gFr};m? gbny"qhR OǹAdKTj]={.tյp?0Vx!p RKxxoJ!;* w+xqISݥ,qEMS0y!|i)-p=TNo\|- Pzq}SH]C kOn ~vFUWXEX-}w+ծ8VևV 3/sm$i7Hxu,㫲0p`:A`]OypB7+3,N\U|wܴi$"~EF<~;h1݂ӛ/ǹ[Q֏_j-ƃRxr-Oq.˧4'M3CzQG.12|: a>[CzP=1]+!ˁ{5ܞ$v#Bm&F;]4u7 5CۖN2#ls7~.mf+VFQKKCIz=`ΆZV'ٚF% Z{}8EaLL c5tRVShadJ潤`B^}qzQuTà yxE' 6iC#}%&t'Zi/kn7>?۩VqoI\Z;SL=ۜ֗U'n8Rێ993DzHd oz+na+4%}/MFZJK\Ι_#;`FrY";$=[f,g"{.5!>yǩX+xk\Vz~; 5Ecg`segШFz?5\k `|U[5M $3,>UrNVŻ)ms ~ \=A+9`Z!8|:)쏑 NtU ܏}w}F'ScJnGW]964cmdIq&@>+6ό>)yF'P7Vq;QlWͿW=vհޏՊmG!_!T&6 !ffN`FmC_ hw9z|Wvy*?v!iғM;e' ;E4I1X1ׯ2vT?{|UX!]z7N rm {[ZoM0ԫS-an"jsH**zV7' eI/{ZsIZ$|6'!nwUNo 1p~kJt^^&dU.e\?QN3ιnUk+}@uŖ9Az, PNcr2||vFNҗQvwzxa*c]iޯ-Ք{pOW͓ͯma>/5>A4?Zֵs c8б#O`@^{j&ӭA0e3]ݾ\^Gwݢآcbjp  JS+ {L~Lzcgiv-6ADAYf;F2teŀ~VU~R'#=l emZF g57'.I$sWW:G9ĜhSȈL""o;u?ھ"7zL68䜱9 G]juMjPѴZfޱIy^1@!:OR]mUӉ#H=`hߓxHc-i^Rp~պ[GbUj^kq3֪!2щ<ej@O0kSx, e=985V/Xj9U^/tPe'R#5|i}p: XVksUUrqƜu"ͯ˞ ƒo:Sŷ%g9 }t `XRȡ#UDE'Lƀ~aR6 җ',}wZL@@qq0`DEpi@Z[8lܽݣI5Ek`s(o/v\䐼4;yy7Ma,-w;_;Cqw?حsU,,)jH{:F=FGcivf_6Z57v5Ѳ9?qUx q;-a#] /3s/ ߴ-\5FIʈ y-v@Zvcg'xUtqQUm.[x})n:q_I==e­KM+48͐67D2'Zw+l Ȏ0Xh".'ip {Bt#,)Ov,-.o:"[#y -PײOh_tp!е9>IkcY;]8:~Il\|rrǿu`ƁڴYktLeF?]5%Xzu|e6q)P4~qhs<4{%LA}](UH#pV6d,hty\-x&1VOM_?Q cr281#.vϬnG+wh ǥcɨԵIJw[Ӱ?! g+z}>iؙ <6 ˄isI!H9\ j]Ғ{c#fAj0TsO@;B]G춍ׅq%2\uOiwMs6-)=9ƎԵь{y@啘 yWZ_bYN݈!VE.aR;"h\ީ[60$QY ,i{V-vWj1+)[|,S9c*껬U2^!X[8XmH2}Q9F뵛'oY~tJT*͇HZOX*H2}uNI; [>@ƍ+ i-w1MX<|`{=GĢ8\|PnWk=us2ZJh]$J58$~8H\Lݮ,fš)wpDfGKR2o+!i~KX .ӷHV׉6}%/ww}WeX-tK%CKIK8c` kր") AzDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD""(Vlq'U{WZF ͑O0l9ts\}ʽයqv暿Ymdsl"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" vD_'W\4 "^Ј^"""""""""""""""""""""""""""""/mayavi-4.5.0/docs/source/mayavi/generated_images/enthought_mayavi_mlab_mesh.jpg0000644000076500000240000004330412747716313030516 0ustar prabhustaff00000000000000JFIFHHC     C  " H !1A "Qa#2q B3R$CbrsDSc.!1A"Qa#2BRbq ?M4 4@4MM4M5 6яv=mMu:,t.)m<Q'Q Mcm755rc^~bj;ҙ@i#4ϒECik?U$ =z6"ٱˈԔ 2;g$,$Vgȕ2ceɓ%HSHug[%JZJ$st7t8eQa%%X~+2_%RMd 㾿0H֥tOs߻zӓ5&8Ite-%Iadm$\P>j'*RUQ)Ip}tka5<]:}bU\LƒbHTyB;_@%*R{`M4M4 4@4MM4M4 4@4MM4M4 4@4ZoSߺirYTOƒC BiQyujZʎR3 q#r5;Gm%%EhY͕cQ%?j3ͺ,`y|}֌eiwRi~9uͿCUB1G }9!S,ċ61(šjOLVJTPwSkɞ6ܽD/De1XVHpwSB[%-vSR*ahJYxx Ŷ4=գQI.<ӏ.՛2эRY#]P#RRqOWŽU骣jF">N>g_=V6t")ߗT+YKm-qBx%aYU&&E%ɲh1k94@4MM4M4 4@4MM4M4 4@4P#:^ż:;#q.ZJ2 BM1)R`JRTfg8ך~Ѻbvï(ל zHRu x%!P y"dMz4ڜvîCL <%i@dj p{Ov o`ҞM3Ƽ0 i!@ $J' ^޸F@.5Rp|.JđZkam)i3hiihiiihy ~`%AZo J)~1y23t8],v: *o.+CiwnImTY QSiCgKo%撒8ޝ@uz +,r&1ECmr;/\RxH%Zկ)-`_1.~\fTė,8# qF\&t-'p2R|b+?WkOSkqCwg^Km.\%a]e+#[=L5Sre}᩸nC&;_mUL@xVVU:Ѫ{ +'[1G)P;鷯't6!IcVEzΓjWjEVC"N2 A %, ˇy86y$u<ןz}T\t>Yk 4@4MM4M4 4@4MM47Gbv{i2NUy(̘^S8x8R ँ:ۉ&-Ҝ*ڸGorLyTF '3|#7Q2ᾣsY{Y{Sd`i`J5s]zjп4~9{ˮ-?N3?gl6!{6c,=cz25&R%%+mƵU zI%Wb3ףn1Oc~muXB -M=-K ԓi =5~T* еZJ;|u]jjLg=2N%7l`4KJKtLR'XJ 6_sn[sde >\{VzRy?C vTvKkZ ǯ ǒzu8YHK Y 3r#X=DxSՔ,OQ5s *s*A3JI+;j2kԲUݘJ) PXk2$mIJ93cn`OgN." "7\V1Oy7+QI"M巷29˨ඟQ;nJΫRP%LjnD+/:ShNqXpP⧐!Yq'9הnȰDnRubRO ݃x#Հ;c^wե.s辟Ziiihiii_$_qεQ;-T(5%j1sbU]R wW")K\d]K,8 ܥJ:P)WŐ.c8g_=WM=^V?Me[JM%THR{%L mTT tw7,9& Bqfn^/B.'\QY)FqGq?Z{SUgImH²8UiX"%yRN m_YL*rQX"(ȥWe/EvOvE4Z$.!gNې{[jJҡ]oF̸_ )OlPЦ*ľ }ΦY?7M:ƨl|߬ q(e(q +U5+iMP$8]I?XOؒ6[q_fNZ;V(kD?U(g@O"ԧipI@p+VGk+톜8O/rz *YȁNlarHԤ }Б'd)$6QDh:H۝P{. *@?hHP?w7 ePYVZ\UV;j3UurzHߊeǼɵ+TFVݢ1֒*2C)JGG5G7CajnbBMf ه]v2%R8wJ[gՂ lۣy/i-CnGUKC-(qC¤E;|mTcl*Dx!>dE` Ap9UݝwRnV_J[ds^ S`@ BBRJR=W%21%\FCN]k ioI+ZCk촡$4U]{,S*pBF@JU 7QJ RJV*wZ ,mMq%SJE@qR6e]pZEЭdPaXⲖ qup;vROdkszlI&۶# y(a,ERwpx( AWjEN)h/LK!n*+W0%X!8¸MSg?(O|G$$CTS(,.]P,Ơμ7uYq/@-H23H.Zb:m,z)9el)vtz e6R?IbZF9$C$))*1=7* J@yGtPx %h=|)2Au*mYM$riw#gU4ݵSTq/ڕPR?G5o$ \9<"G }>:Q(Xb+ X@ Mvw-;kgZZ}Im` `EWϿxeH;k tHn[*ZT25'2<śHuQm"Z,` |=3~S[O~5?݃{s]lrքbR%݇pu϶g)?1<|@yy[_Nu# ?)aNww?'KQby_cZԎhJWqp=:LQǘh©]아SQŊq촡,Pik=ܕ2ʼnvI(8F3܁>zSF,-98l>^}}KnmTeW<DwyN.ݵO/Կ?'c2ojMH{,'=>J{ZQ೏O>-Wg.XS^eD7#$R u=*Qo|ii#ۣOkiqR6HЦ3nU=L1Z%(AI>Uǵ7NZתRo&'8뵩פIZʗ }8<W0}I:mڮY{Ƿˆ6F0Rh(.2s69졫}uZoG䝻{x)/E HcVH 豮ǵzCܾ,^?I[ԭT^$R K h[rXwueL%^BH(q@k֪xhr7ti?kGN ]Mf(|:;5W++7BUJ$Z?5Ӭ>,XϞ@֣uv&gkƠxR56T5:ds25lJtOƩtZ[R?m\y( l7_ϡ'%şMs$XyRnyƹ]} d߿]xe![='amxMB'mnZ qadH{ܬqq.TJGA]p% Ҵ+vaQ=0Y ?3ukm}\֓m+ҝHΰSwZ/4C;IgV0=":1PWhIbۊͷ܊-k5Kk$=^PR]"J.uh($?ww_GH±j7NmB0ڒ;% (=D*;~}|2p Z~k&`mUnKMFRL\Y=;wrU?Sd@@gsG'8@媺eZESOakS&ynzJfVPt!ؓԣWʺw ʔ8AQ$tc=Hxn[cq SrC BG==@+y/.Ō;Qi^aNڶzAT2&%32{|GYǟ5$[ڻV=nZYJRX qĒZn=jrNFPJU]dn47qZ;k]nK"nHq )Go{zElpZOe ?:v~o!x1*I±GV9-ɃM2r@ Gt©ʕ!u_Qqk lM=Ҋ}IRx?t}j[f2w?.ֲx.ěas= VN~m"\M 뛳S vj7U5ƊU>xRo"m J𔳏[]inNuA44gqS._4ITtR **ek1&ix'p~ @㏔v̋m ~~= DJ2w#'HS6jb;tUyG,;)$$uڏI^K!@i8 ջL{lv MX}ԶVssujṓǑrK$]ҫm} t(,T @[OR-$0A ;]bkRJq̕J(RUaCuѺjq];R,BBIYH'9;~']QcdیfѶ(Eɉ"c!&:Rs2qTY.DJ$cZnUUr-'9KI?dخ >䲹*<|Rr}N}OenцԬ}5K]6ʣX,rAq)=C ӯpӴww&2d͇W5hiԸBq 8rGq_[w붒bT3.7*@Zr=25[[c~z2zmkwwbD-M%(a j' J ֥%) R2Bp3%J*Vm%IPkoՊK f< LOM,3OMkcTlmKHCFIJ+mE!2SdZ-FϗQE ~VS 5kj('L´JW}w% i~T_|jR25yv)I?QUwB|#Q[}5Ǿ K2ΠU/K}08Lb!BERAqYWJ!Ck@ |(G?2T:# mvO2/ ~=t-y %Kl|Pron< ku," )䅌! QVWߓ=&NYT*}bYRVFM* i >H$GW"^IX'S.WkŠ~Q;Q3:Ҙe4>T*}{.Vm|@Bc?Ev!)c'zjZi!۬8 ^=Q H ] Yn%IR)y+8 fP*[m H?tp}?nN`P7==q5ywTA>9G!%^PхA`Wh[*l&ːVg,'% n%q2S ؗ*(zÀ _G쟯ܫR(UJߋ}ތ;>e?Y%(Z+RvEDNTmgAdW9q|JADP\[=M6J~:Μ nyEi$dq#yC#bv~CmɐR@@季-o\:i|c؃ kեSilNEN- 6K k`v8W#iwJeQkH젓i$c}2׵o`5Kjƛ y4A#2UQuBe䤌8J'c{h.FWO׏EBW(;|hP푐447KP=4̪TfuF-x[2F3Lk;5Fɸ[GMvM-"3I 9$\v"fumrZIDr-NS0JVӭ$RA5^Y蚧/z5su!/ԖsRI%[|}ƙAVy2ĞnԖTwNPs4rգNB(+Q핸8⾎Hn:1/Tk\z&Fㅺ5*Kr89_|:/cbmw[<,vy)Q_%',?5֚+Z0BaI' 79,R!De>"Jλ]-a5Ӧmzߴ %"^?@-Lwy%ƁgRqA-8 I4|[N”O-TZHm'u̩TIGA =C-bG=YGxUN5%Isj[<%UH䟩kWQIWu! dž/3JQ~XfD6 k)"ވ;&ΩmǾƭ*rv8 q iByl*J=G-[^õEn@Q(Gҡ"Rօ$RA#b)*MZ䷟ : 1P3+ 6oSanW/-Ղ_c¨[RT{M,ږVpC''+py% >__>^]2Yf5HaPCSmG4k~GUt*@I-iϠySxԠi֓ꆹ3ᖍfa~ѫu*5GanCPzWn UҎ|}u`̶\Dxo6pvtgyO A-LiX ? Քݻ(:H Y6enhʌ`?G5'۽[n%TTd~ѱ?5xe/1,L5&¤|T)%}ǟd/ZȤ]k\Bee%e% #$d=~j=ס\P:Ol{=5n%,R{zZ ORF9'u,2@BeJR;$w?$mUSRUa.7 s HH'ćVb<%aehqD H|ՎœDl*p?5 QZB{]qƮ"\4K*8qĜyݣ5r$Ɏd$?NoTuD72:HjRG"zîj1C$4,=>-CmDev:N=/>ݪٞԆTjxsio(ЩqWJBJLY'e.l{gHz)W!U QïFqŒh)% d J֫uڞn~UvSy1&} u42q8q$))PڒlC]3}1a 4YKi>tH9!N;˿٣dZT'RuQcO2yCSU$~_ "Ft]ĩ79j:$&(I K 䂅ҵӄpa=wtQt~U2Mp ߬a)z$ ?3ÚrV9G]זkSz=ؑ).)M3 K..)%‚s.Q)mZ0bV.:LJXK6qAk[W+e}j n٣nk+_ Kh)Gd뾼GXJ٩Do Z;F1J%aT%6l! AlRwFۭGFmr,hRo8鱔b뮭Zٷ@_~>z) {|8U[,zۋ{ΚRzR[q* x#o/=P]i$u" j2!9 S9s29ppKتJވ+@:kNyը.2x)8 '~92t+$ԧgeE[Yu>!(T@0u;첩ȩS5::Tesy"AU ts^YϟVKeTMB!M82~j?L]B= ^7U-i UAZH+'d eqjУ%5jhOKILzsn! msQ턤Ɨ[p*8ʀl( >Ȑ=q={vPϟ{{x>uN=O {YۛRZV-GQ9PVVbW_!|-ڽܺ=OǛ5ë7!npkÖÅ)g%(qim/lMèTl`E..;n$DJVL~'{yҒ($|׏tTTݾ떌$T^e.3iBR ԃ@4ׅƚiiihiiih8מޯeZFRstS|Xܴqp8B [璔E$^'(IIi5㶍Qij@K`?_̽&PK2SY^hkоmVݣ_nNp$ZJ{)C:ml6&ۮEKCfԲ cg'!HT(`RVڵ%.'#9SK=CqTU Ƒw H(4ZvIf%AIZ ?~zl£6M^4ؘu?EcT&bJLyVy] ;eI/%͐׆I_PǑH탢;uJmq*KFA9_'kjX $HRvIh$BF7*?j.E# t 0\RqB/%iJtkJ~s@j4 iS[^H[V>yWݬl]&=i*%h"4P> .>Y%)D*ueJia+mEgNqG׼>ι:@m/ζ̹wBܧ (*(Eq3(!%O6a*yn?],tut֠]SnFXyD6i$)!A/Pq n?J>пgepwOb/K][Q`y/$6T"q8`2 A6ӷ?$wFˢkt_;c-LD׍B X'.8' Jp<}mD9]&kyom U;ˬC2]-ֆ >6-EM+[kŶ,Iv4Uiihiiihii4B i%i#$..V,*uY^-r M!j3cEA`p+ ZMZI@jTILQ4ͨ J IbS,&|Y[ŧ~5嶵T^ϫQڭq. Z9tHB\Bg> a^@2cN7U8ҏ oS*9ܵ4)H} f|W1yH*Vi:W_ '01%npIAǁ-@yW3:Gx rKZJ2NÌ+pvJl+?PjOc%-@a |@'R+Q}5 :2v}b`ur2RD i@$s$cZ%R;&\VL܊uV9-ۈRH)RTwkOL~:3{=5 Ύe%׼0 xq|y7j:uȲ+UյpUe $P'JC 5.)L:N{kz/f rԈ`V[9!^ y\!)JVBxbڻL&Yiiihiiihiiih/k'lT=տRJ4˝KQR+I,*Q_*+9KW$ף+5(NutXOGsflQsU.*zMGl<-eJBҖIJ;@)MBFy-X_TFӷWǩ=]es-1Vb-I).y$;$`km}W\t5~ю8hEH RJ[i܎Ёa(pY R>TWpO)`>!-{\m>̘ۚG*i[fۚ̅!} sڒ'yg"CW3u]uU&ֆrV4o˫ *`EG>ukO4M(ԩqGWee/0&Sm0RCP:gDz־oYsh3*`n:>ݶ4B2XʖRy'G}Sot)Ͷ}< 7%be* zeE0$$!}5 RRԄ- J-mו~s~ ~H핫Yl݇(V Feۉ0TwYm 'ziDiimayavi-4.5.0/docs/source/mayavi/generated_images/enthought_mayavi_mlab_mesh_sphere.jpg0000644000076500000240000003117112747716313032063 0ustar prabhustaff00000000000000JFIFHHC     C  "  C!1"A 2Q #aqBRb3C$5SDr ? !1AaQ"2BqRb3r#$c ?BBB^dTdT=%srAUq:L3A۝{&m@X$xsiTM1 sZrKM<-: ۄ*h+p3jIKRWϧ4kO#AUyVƜ>&ޯ37xd2:hI` 1 v>9ͬ4W ,U#f7GAe,$ ÉL͘;%a{,Հ6?}[qK/W-1žpxk|Kbtui/\ZAkCKFuVz>gs@[EAo>$mIHR?)f9M%1qP9<26Tzv n wV~wîy$ wyfֲnDk5u2R7ˈ>] 'raQ:9*u7a[#>&T7faj>tFéB;F0==;.F\-˸Sژd|T/}9ۺ;%"Bv +f N~YZJFT3 mR_%Z)ӓxiN~>ެF$;'p2+v.,ۜNpAM%pS~ 4l%tti%Ღ~u-18USR}B_KK%6[FʪJlc ڂwVi) N4cd*yvOqlۡ#<& cw>T;+VJcnV75:&TiډIYLm-s 9ex]xA8 ]#p!Oޙ.c>UVgFr]umvVKWsܪ=EeD/idy.G9$I%%ߑ9z ډ÷S/XnVg$OElв8 +QDX:UNOVZۖt-be@!=2= u)_Bz5eߑ54d:Oyw&X \(@@>=W eo'}[Ei#ʽ^u$ng)e%aJbgsNTUEde]ñJbQTK[ŧ#d-?Rج_Jbg}Ǫ=\ADb>622z+kYⳛm(6W1%p؜NR,o+UVKTfO<֊?~vOrHT]>Dl{'+}蟭NOd\wI,\Rdy=.f=MJյU*Ӷ~5OE4]4;& 5b#şYHYkw ]Ӻ/XwY;7W޺oaFHnpf9=[y?:RwH5=ˆğ.$jϽ$>\ȕB. o=잇mЁ dk 9o4t*q>0$]@|mM$Ͱyھ|B^yfe7`9.t]]qYA\]OĦ->ɊgbR)}@8dt<ӐUrj;ʴ]oV(wNtE~0GStVn{*F}p\tV?(NTwMq[zd V N}==ִxN7LZ2FgOdOi$7 lђowCeۥH`d\'}wTMs6=c,R8,Ǖ-{-9+Q]6⢱ߡ_{{)\v=C%Xs-W\:UſɷS؉ǓI \#U )nTn3%>y= %>CuBuLL'uhg#O!zYsqHBRI,ҋ=a8J*uӶ"\ :V` =o/3@oO4 _wU閝ԣBںecv ?ngY{*A !yFICĺR-?Yn\sp{kޒF9߰pJn`hdFx>*XL*a'P/՜*i.5qK,όE*HB=דud1ͷ\ZIcLQdlwꑣr6=8|]=8۲u,' 32:/GO+K%˺lq=WdwJha#zR }0S[/=i%ncOjUKopU511meJZEq9oqdEk%톡SVcpkAt%֍YꞩmG5!r5RGtnu=$y=5'_Mdf~D>JOv*?Of.`cHim?bn|Ew*5 mJ!+٩\B}/OE A`qvpX[ĺžK5DnK[, ]f| z,Rj0Gwsid~)~f9j|d=nGbF~6Q ews xwlvWjjyQF_-\p:Jp;ddR TD@kj-ə?Jeljں' 핤uTSɖ;]JZ]ᇷuM<Rzhvrd%({QႜnlPS>h<5)i UP;El$5Wo(m#REVMn6`Ntp =#ʃOYKu4Kgih!ʖS%;}S%!3VFf0/q잩,=rJ5wTJ;9:k$y},@R k ƒӰhB#0t&B[Ob}߲SXԺ !\z)nTj`8eGMb:-n:[T*{U4wbuy#R*=;,N:wgB74YGeE0X7]njZba-95'hGN\ӗ[2'uTq 7d̼[l pU ;K{v4৾\`k{wIBțtNGlw@PȜCk%CDrݙి79۸>S5CKNz̥Ap"d`2ќaU)nvV 7NTl'h}R0p ro꒫m'dMy)}ψ6R[-5fI N$!d;E7t r֪R6ʓZ/}2MVdmLGxS6u2%*7 }S#8 ڎHˇu2/nSfF̦;'iTt !x~S8*hPlrGzN'Z3jGYL?%;u$o/1Ժ?E]TyMշ)']v?nǚu7%M.;tc:anG.jJj4uz~FǺuoLdTGQj|ڬ2:J84tcs@ N>Хҷ-⩯Icگ6׼_qbFlӔ㪾fK\K /k{xguM걯)w8dm_gZ|254;ÍJt=4P7eҺ?᧓ۑBd,EkHzZ~\>MY49}M%-I4.hxp7&Gz+O^u69_FF%9 OpW~-Mg kK Z8duLADR@hl1zHnqw^^EE*)1`H~kdsa;SuV̐ Rr CF Uwm@yIF@߲s# (f)ڒ\ӤgdKGu!+gH)^b*G`Jq88\d۹6+phv-E"J-`um}acD$Du~%FVн/ڎ33c֝h…IW_T៝,wMwψ6K`YuKEk}8 w]ml _e_HgO~ qSjVePVgM6ğELj4563'Y0$L-Q~9f-KUwR?y]Z|SV1ٗꡗlּ?UjX`I ӺccG*6qv~`55 3iR{i|8}NӉ$ǁ:8Yk.].Ph'u4t{=R7= 4gad6be50).N:Y]#߀\rUd:@G|N ][BѿI6@Zk!E!E$ﲌq8ZrbRz*lFAkv, {ǵih"Nv߾Wn{0}W9xsv#pzR9-9!|s O xI.~ ijCu h٨/B %5kZG8kIT|) :N}q.7A Ni憓5# kZ5=NAސ)ks?.KQǠꦿ nBmV0^5 kPqد{h۠STѸ9! A؂zCz6)}_MRWn=&R#  m;]?hjkøcUyZa#<`J-’P~↚+|B/ 6xZ]DE{D9%* oU@?4 tBXpZ#.ɌniiK,t7R;q q&D⟨8mOԖΜYi??R Nƴ@$ T-^YAPYt^Eʺ> l}nBFy?vKW,ߕ{2U}K=`w(|o׸$:p+,zLV+3`dSemޚ0K\5Sn!DOH>-rSۦ j/{>%c?50>UnCtvGki=MeD Q3.GkXK HSsn*灂sN5GֻWyqǙ^|8Ӡ.xYxl2R٫jHO 6HvGv&sWS,FFP\Z&ZKxU@B%og8> rz/5e?HaWy޹sĒozk $}V}+GvL[Qp?E _:nH>MI/m:NTOZS %1{CMs!2ݠ;?Q̪zUKIOCa֎*ia[HBBBB#(BQBU<0 ڮP\Cxl 7 $ 2KӺ6_f7Lܪ5#\r~x4^jΕduTSȋGT94`j;ՆNţo Y-WxQu޾bɑ-CU٠+K)/&Ď=-mG&2,Ugee[O_}dKs,G#>i嬮*ZFrUEnT֖3Kd 2-K_kC.tߩUӲUQ.wΡ;;??huÉe-_sp{f 2.dq/8 7ʶeE.֊j *fSQQ@ء dlc@kր@I.hX}!'&ק-v0^dzz/Gd%u00BBBBBBB=0>B*ZNުsQFS#)D`}BX/сT^`wkB!QD!QD!QD!QEmayavi-4.5.0/docs/source/mayavi/generated_images/enthought_mayavi_mlab_molecule.jpg0000644000076500000240000004127512747716313031374 0ustar prabhustaff00000000000000JFIFHHC     C   "  I  ! 1A"Qa2q B#$3Rbr4%'6  > !1AQaq"#2RrB b$ ?4h 4h %c+ӻw-t s-IV$+1aGߖd F7~=E;I<(ͅR7 9,nr 2V]]['Y_Y3M5DrHv'$N"hZ-MiQ"lCvJC"(ZU J1E//E3q>,PpUoZZW]uR 1O1o]>uteŸ${abM wz} k>$T7:Xw/K d40 jerBpqmƽ~.KXIwWhϖ $e!+'<-#{-ƕ{L (I)VPD/uc&j2K/O{{Cqq IJֱrǧPx}+c_2>spVt$&58 hc pOlz=WoUʊxl ,3: v1S!!cb@ՑY՛tC2 SPYG^$-$\UN~ڊ!)mleĺ m{z%_U|1AJdhr:YɉX#3$6!'v6Kvڗ*°%U]D,-HGYj Rje[wNܷjW%Upy+*$rM,KI#3fbI$rtZ&D؅ }AWy2`)/sOcuߌ\Oq׏wu{KTLT  qTTGh"( B#w/iݮQYl!(m)uISyN:y܈QFof Q5ڣ#a #>]/_q/X`tE{g@q/ o&0Helb/%Դt;Ӭ,e;>0 3&iՅ̺FtF~-~}gI:#8zezu[w}%Z-ξĨj'x8F QSÓ .w.xOw^ ZM #lyMRCNu3Q,2ȩpײ2p̧Ҫ4R5#Ԡ7+bfӑժ`)s g1UU|ERpHЀTNDE\W3dޫɿ)0C^*߻H~TI ,0ej#"ViLQZ$@l!YF4r!:mv< Zu,,F /!ZiYa?-=qw7ٖޚ]nRow2!!pX䇌3| O* UGU]I;il܂^q.!\$v:H B;l]K]TR0݂>p>2;g:G+;M{eUTi NP2I?1P~=uKlT_F@eOTKt6E?KmJ8ӕhLUAʒtjtz +L(+ng^TTT=ee\PDYwbU@$9VsqyMbeo1,"I\FHer+JjyLU$IOH~Le~ ŃkA\5 |8ҧe[8BBR88Ay_Ȝ*P]򸎂nv˥A q]qIGS2?\YZɏ]koJјm$mb;ZǺo~)@53ڻiLbsqY[}ݪknfAsz$坝I-[$J`xSTQ%E4#WVR;mMMpJ@xjc[zGWXY!&PR,k@ XxBillvW#?[y jІE%jT+j:[MMde`Tڐe GYǷ6bu^Yn9 ^Бrxu>I8Y>_lfzU3Dc r'kTt4KҦ&T2yϠEr13Æ]}sn$mڈ(k^:=D=2HJLEB`*t~W#[q3R"Za$j#$FaH8OSN7'65:%GD }5]0T~"=s~MGm4k y zux5+'Ͽ%?v%E|JnQHa#+Gwiڅ^i2m"Ԅ&6Ml=THU1cEd.2E,r)*:oLWqOu&ǝ+EM\%h٧cGrTt€$h0Hff2>8Am?^Rs-ljiD)w6&zXYUPq Zo{؛,`^!N͛pQѵ]m\qCi\*Ğ zU狎NΞuOh@&3:y_Z>;PPp-2XS,bT I *s3 d[YJ@RbY7_!gJԤw ov;kkڷ44tcJ$-49 #[î6; Eh!\GD aO<@ s,tJzWƗZ%Jj%R ^a`I7&ƫe)RY 44<ě I'٦Rm$5%v+#;+*sazꧩLv1O&ch^vvM 'OjmVѽ= -#NįNA9g5x5!06]ړ J"ae'ƴ.:H0{[GKS7xfǩ8Ԇ_KjY凥)[ݼ }08kÍb4{lC*ѤA􁓧2i/ [ 4*Lo>?(Àhji) Cp$@cqq+Jt샒DUmʇ" ~l{lQnajih ={7\k_u^{xy6B@H$d) sKU4@۟X< K:ycc+G w$M$5W#Z,CG`݉sǁܕl=bnZy$W(TA"/BGg҃|5mrAEHz~~v(BM7ϜH% Jɴ[&PHC~[Z]3rOiؐߗzpcͧAaRHc@OUi۔4LyH='m6=!t t>Wjˆqۓ{ҳWyJYyWF#!*5P'Y` Pz+~UlﺈU5mƓO $BEea_8qF9C/GxI&t%ԔۍA m@7)ly +N<.;i.6Мn +W2{t'PS=#$0=5N#E-9Dw9u>5(9f1FA|.> { fRbҝMϰu>H@a!`u_ZKd}T& 7fה>d6m=W F%E jIg=J]RWR/|V൉0Þ[sMZ$$tٛcZǒl95Pg}CՔ8'*{*6a@j8!zF׻ʰ8K*dcGA~~5/sj`]=^g_OO~^>rB[-s1z6a;Jm’ް ~oʘGսs׈6?oƑc]x .5H[ Xױ>}5xWDUQn FxAQ# qxn mi4TJS3?UN}u@e\̉QM-K:ޡxl'eRIQ *n#-^{kk mW'8QG=mq0 ! N_E.D1NKH,*âv+e0 iR@%B(b4!q1'>3íIt>VX2X26æz@g#UG+鵌;QrTalٲC.FarH(Zv!@=l ;L umNەVI_LΠ G\ zc9\e 7!͔̾=Bz=>ջbDi+$eϨ4m,#rJ8+р38@Oڕ^`^s?y 929O8qv7M/lvPi8|G}SZeazm^m /P[-6s5md+ðfeU GxsۈdkX3&:@ (^_%n4Զ~&7%0'%sGMJd텼Ԑw Iۆ8Ʒx]K\_*za VRv*W}aITZ O5:@:(mMݿڼ/IbE5.=7:[r&&# N~uj2ձ"'iJǂsID 0 ZrQѥL𭕹ɡ0B\J֛Wġ{R_sb#QzI'Im3E)AQܬBT>*BKH'I$]r#Mâ}ʒ%uc/zʶI|.p(fM6isOSѲz_:˜B8+r6H: «&_S7}p\"A kCm]##%oC{||)I /TB9ٗel~jJ͋yܗntGmWGoXf0-GbVH2!cG({yy G@qAO,X;N "TEud20.V]Mci訩 ::HV8*FUPk#Dj?m;GymIk<Ko~ GUeu_hlyKxq^?VXJkK (鴹p];Ё=dv24˯ߛ W`ˎѦ{{>vŚmH@P$J2i{*}pNdNZ7+f]W jl*xgֳ֨̕2g܂?#OӲD!Xjq Ҿk8:Չ$D8By$U.a«ߜo,Rt1M21hͷ*{igHAQqS+KA4a[h-<3ŏI8Ϊ3Z)$z E%J`ͅC`oȶG$ۖ.U4wښ;] UeD$zZg {N18$䟮f\)T䴻JJJFkP<4O9ږ]BJ\!{z@M[ u ӂua#g^œ[RR!qfNHL{ksU,B*@5jLH íaA^(hU]K&< H ;2kMlC wS Z7>E5y -2D̥~`x]w?"wh D,d"0Pp}5!enY2f"Y2S %.c=IU+Р_}/)o={Ү8)i ijgbEf' O|&|q=']]P@W+$9i>4k$n'2GѲܡ`#J$ >4a*6t6L [m]Em}788UB_wY:-4!N@-)i()AV*V j[OXG쌼I҆Ҕ gJb(P:RI-}pT.GRMζLlkg${k`#]pusاh싗?6{ⲮU y(r! @ze u+~τvpgQZTTM}ST,/O[bj!G>EnQ*.H0wwN0Gp5teʩ.&q~3)r+6n˧V}+Pmv\cF8PѣF =5Ba|x+Lj< [dVмު":K3 H%x je02KjSØZya&*?7~k1n[)?.rѰ ءVGŃD3۾|8aպl[:HZKq*t\/c묾'Ut7kZ$ԵhLsFY (HC)ePJn;_WMKQ`#BB=0‚ ؑzXтAZ^mʤ{w&e(X?_],e^Я\BD" 1;OMc[?C%K+V9)nۛ|ҳޓ0:iԮ=~o4AbS{j|t8ydIW P|*.uc{MnW3+]n:OFd+A_(G58GNOstsu9ƕ>Snvb2NkCfq5يM 0ÐIw>mS63xyË;t%" ARBR|mܿt-EZ@Sk/QQ ^)/Kd8#jҚFbuuc>HlRaͶ8(YĬ']mA@IýEmshz D?MO])|UӴIUpm~$qƵԃX+>npd[*MM=S=_KEa;1SzƲ=fF=:-mn|Yvs,IsՖEŽ;ڷk3O.%g|8a-=TS矶-檏wmKͻ3$;|YA=3Rߘt4mj#+4;s/Kj(9ݖ<% Dy4ݷk ٫m7WJfgx\a?pASS4d2O54w-7E`@idPF5gIT?"oѺ=9drJMC I>QcK B}+We "ZNiJS~^ni2h\H1|kk,|@O"ԭ;pV--nZNOl@ت3:󛤺)Lf>QO 4jA$4h'ĝ^xYlTV\j$h3Ҫ;ªY؅t+N&M$61]C֪|8y1N݇J,h'OtY4lAJdsn}ˎ6zޢ1ސ zʅښk},(o"Tw$ zFqu|/Ԧ.0ij2au=ԆV?(ENpU z_'iI؎}fZ-:;"9滔bxܪ FXA,^&eKAkPjyxG1kj%iR(l 4AW8Q4Ϋkߣ1!zI3;  }[Vќ4N '𫗱R: mgdC(}uebUįEJt)!w)b?δgU]+zuo>+6:m>㫕ɖYE[NoHH?L$sCe@[1&u/I 4-smդ6T >R[mEQU&+K\/;׈ HYKJ )܎vϡZI1H|ed4L%,8<@rkm㺉`Js~ZDDBSͿꟕt j+$«^acdX`ziece$i5*{{zwi;vwQxZ*’S$Ku.v:ůWM:$m@?Q=v:ؚ|<ҊT7}DFef&RpH#Cc= ~XۙjaI+ ab"ʮW` VIlcNC:씐…IV#3&&B6Դ.ߊׁ ?kf y{M󦶋J#EȝrU 5_rpХMUG~_k3ssG,T\wD_xqKc(I\n+Tltdvq€rFo9ic]q(x}êaZg;r2?~t_5e3,2IUAz.L`=A6uզvU2|rGZcxC" p|g?8gˆ`nv`kgcZUnG4sc&JF Q*K%NW}+Fa5˨8aY`Xa>]{ МgQ’" (]|/ Q;G)Bԫ1=$:I`cΑ}G>drFԚsO#im\PK8  "A&OGr]\ okkNVJIe1eQqo0=qF1?:FssDhѣD`QFAFAFAFBp!HiJ:iK1|hp ; ;ᝦf1i:lzg]p1ExCջobwm\3Tɨ\řqmC"s]d6硂$AYPx>={{t=A5 OOlk+.:ΕiOo@+ekf%R{mh'|E*jr@ aP$@ONheTo.m-E$]LU`X#=JF Ϳzw뀽Ȕ+,xR)-+]m"*rYCm#Ui {uK $`CN: ܔoQZX6چjO;B ,QQjjt2OxC/fFj;c2ÆU@Y|{HS K %#>Nˆ%@r{ @@Sӗ`'8=5\|7iޒcN.\8F18}5ێK|Q%"2NiǗ77"Ÿ[utPTz$ C*{1RmMB{۶k|8#]yvˢP GZrYE#">{(o՛ZNֺ)kit?pigbc u,uĚRd)eޡOO`/}#-zVPF>E+Ԇy Qf(2Q7R=HcMq45{Nƨ'=TW5pVɇ2v$(X:Z=Ik*TLq,c 뗤!:w`~^!-%<Ѣ-!-6`8hѣ_AFAFAFAFAFAFAƍ 4h \hѣD`QK͢Xt1UQVIOYM:Iu* {MEss mzҬo2`SAP0 ( zD0]fZM=W=X6hԇF #Mv7٧2娓FWIITh"|_vݽc\Vm[cY*fP)lH~e>V lgjV/wb4n{ztQXw tݜ ؃۫ +$ T]=(A9@ ѩ58ʬ!ǛWf3MunY*"w|]o:֭*y꧑vIμ忖[^ fô.Jzm^9bD9)?Ş%.VKRb< }Vn3ZwoDTmd<)=;M.<\{(!8wKB` f8¢*8۳^EnѬޭ?o\E1QE t1T0 tpRqE=< HB,kR*R>ʛ)ጋBaNxx]i FW΁\RR\3/L+#R`j6p;rQ2FݿomSVMs:A) Jlb])1d"TKJ6שjZ*zx5xCGצּ|_fn!n8*i估jJJҡalg,q߃F F F F F F F F F F F F F#ƹ>FB7 v ZZU̔5tTQJT2'*q͹̬QnZ0,%'Jj9-"JD`8 L " ̬pLzPݎ%''J[pTJG:LXuU.z]dSJG8hѣDhѣDhѣDhѣDhѣDhѣDhѣDmayavi-4.5.0/docs/source/mayavi/generated_images/enthought_mayavi_mlab_plot3d.jpg0000644000076500000240000007576612747716313031010 0ustar prabhustaff00000000000000JFIFHHC     C  2"  I! 1"A #2QaqB$3CRb%r&4SvA!1AQ"aq2#BRr3b$%4DSc ?4BM4ЄM4!4MM4BM4ЄM4!4M\}3,KSAfPB\=4cB2x֎}SoWC_+B-N?k~X{1^\X]'i?*B$?$QUC,[< v}??CU=]e}qP*zJ]!׏YIvn])$Ŏ-?sǒ5b9Y ɰLzU zk* H2:8 ת9?S5T|nx隸_u4MM4BM4ЄM4!4MM4BM4ЄM4!4MM4BM4ЄM4!4M]O$Ƶvu_MY7ש ;El]r#KH]M'w*E6S݉ڢMdW,lK5MP- BgLơA$Mw>6^YY';;TS=U t,YrZ]3S#FN٧^Zaw7혶m{0&wH8hydRҚ;#OjY}:7JOLV!MQ%F#{RpT|Os4S=cwÿ^k̿OWNAev#jkqpijϕA۸3ig^wa0wWD%Z뒢 ? !*A/Q[KdL!0kDjmrR"kbG$#zz~o~(r\M[)XTNRI~}|ûboEnNIUf|6]bi4ڶG$0ZIV<2%0Wo=: .uUBIԖ_vGY%-x'HDF41b);I^<5uvvl mujHE]'XJC`OjlOm-B7& <*;S)znӿ|^n{\u8e7Uŋ&3ǓPxԳrK`ʲ%mrX` I,9 Uus4|+GKї(()1G/iZm%x,`> NUmڤ%[֌y `NOB/l˥xz ͺ  LAч!֒S,"{}oGaׁ +[Pek(;i^3xVUKIu۸:ɕ ?NE2gS9%ZpTybP?^}wUœZeAw=7$y19<|jf.9薾m`qtu/n-6䯱b0?L#y֞k<]$ovh>4ii&i hBii.<:㸓x$ƺ|ƅ]wv>uTٶ.9ݭ.meнj~SʫHY$œص_ŷ ܽ&rhq]RhaQ/TK@pBSl^TQUTUǺ $X#Je[{ `C9.-pT9:]~Ur2@/u8_<$z?S/Clʉ+Aa?A559.*z`/ڝ 퓁w#P RGL˨7*./Ce>@<*)]]%RWr6Spq$w|rǐNA]WHaRv$LnPp7`F/OΡnvꨐEphiLQVB?X*#enLGX#Zp]:J۫f-MV }e)#c‰+,DWUCNɐp< ]7}m* | aKNF*+wUŧmۺZ֌*)BAzjS"OLLFXq1N=fv. ˩26I*Tri9ҟJI$ѾKiKSi-wD$Jձ}-!CȆ)4 5:= Mp.Ua+}B92u1o}G$ʍ%dUOoi4x|\6V:e2qF}z)i_QC/S?umj8^]M9ZxyDwI#BGK^˧-5ܙhTIW^m9"1ew[|q sq_*Z)g;ơëHЏ%ݮ {@UL#r@HNǷxHQfg4 uci*eR;u~V_kI٥k,]bՕ5{pn(ѰiђN=L'KK yZg^מr䂢8v9B"DP;:Kknߙ]GGmҠG~>Xxʷ=kNMiLEWWۄʼJӹ- SĞO_ }Slf[#xF\p ?PBT } xXvlfo5gV])XGUA)> ?{xvSUST9`C#)2H 8wQe`?I19K_)ImxW,:ae@ʰ?*QYVH󫍔o4,T5+lE#xZs*Dy:vۤ_;c$qk)-K?>BW$Έ_\ur m/GxW_kxDi>7O4d~gg eQ_>{ە69r_ۮ&:ih剀VF*G:K)C a]M]?bC8lդ"9'hʪ^g_Zͬ^6z/V0{8-C5\;3~,T#gx.lc`LMjS`w*'tgt,9Uj kXʟNt=Dm2Oej!G) }F?OJg[Vkc8uޣʘ)hEqQ 2L"Dyv7Kv`u a}$pNG=V#KhG/uK=}\i.jzkM 1M4㖙QaӸAuT)z~gy=}j<@1Nj[Rԭ}q(PS|pzlM翷O;eEP̩nA_vKzž*[DM Z*8P_ ( "4՜hmMTVG":>fm+]X/KkZwzd꧴GVmQh{VHu=u*-- .UP#"$i^~cloSSJ]PVD!8IRIyܪݹEGFuYX5D}=Utƪxzy$:G P*Uny8뽭ƨϷܨ. EQsռu(P 2H(<+}KUIсYLɆN<~A5Oy(q+rQ/[4"ǀyArH N|xh ;g0J7k>aA,jY s\&.W5Sq%i䒄DN}<Ät 7pEhbu`QOِLW㕳*s-,{;; =%tTZ9"/j‡h~ޑoaX\m ;6]e7%( ֛毫h$e!*Ȉ9v4CwY w;KgifE;!2;`G<^^)Ghal&<ѧ9:P'U,q_hWVRx#?{?lc=oP>EӸ6 SaWH'JH j}0,LMҽ,UWt}t?GW YZ;D `+$ݫui6 Kdk8"KEbT*<_}]z3tg=M^]CFRIUSv*KI'sȳPePcmގPh|y+)L ݸ $?W& #)]nVݹj9\5+6Cy,}A.oآgZ.UKOQRS((ɒy hUw\/ǩG;oO|NX(,vfK\ ĂX"M#Xv'2<}$iN}lsoʜf_[61:R;Ϲn' 7TYM3yI$\&wyJAڕL(1Āe!@Im=S =$` 2w楴L*]~:neH %ج?UdYed[n:4*<^Ij䓷+ڒ~UOU;NVb6y]~m%M=% iۊe7rW5yv~CX*(^H#³Tt'Q+㷂tۯv= ]%T-M5LBH捁 e#AXu[AbP`b;[<2ú7UuʍetȦ@Fj n}-r.a< nS51Vznx&>G*z5>aMKH!C{JKR/TNǯceVEN(_ٲ8hQTJ("03j ht<+)q/=r#Ti.}YT`vsPA75<$<\}IΫ=~ޭ5QKU O4mʺuvpvá:mdL(Uj>-wAWsI,{h}esңS\vq`j< hj$rT@ݾ;NO$(9)%<`]VEKZ3ށ=z)<5Ϗs4MM4B ԇOkN=?h*ZTȎ"8%@`ʚ^|ɹ5onDzjh멁ce,}r[ x7G>>~x1ƨPSַBug ;CATaC.tی+Xl`᪣:y9 ?MPnO&ZǶY0-g{R9㏹6G DSֻѿK[5yuur{7(QW#3QYyw/Tz8e=;So9sOXg g,V ެKR)#?qA.LzOe޶ktxj鑇oh'ǓYK9c6ҹ8USEs(OdQ[ 0j*aZtSR/2^ԲgY5-!7;n稿@|p$"~pu>⮙?b6iw]QKzHƻUT޸X^t]f:FCatW iJ{5ZqH20R XMO/SJjURT)kA:JYiZ =v5+#;N?-}P|wP: SqXp9# AIO_%?Zԏ@Zme h.# kBRlޠ=Jܳ,c梹A u<2 CHQX%Kw2zyE!v>UjrE YdX{bai!xIc7U`vT1](sk5Lg05(-~$)!%n:o˻}|.MlXưKSA,~=m]na9r6vggp,'K^GwSJalo{Ӳ%65IǂnSRSGen,YSe)lING79R)TRcV͈-xܟM|f[C%Zjh&tS I>V I qnK[FlduR=DI1S@vy*m-DiF89LVɬd{:d{khmf2F`Ub m_*Vl{ .aZ-T2]nw*$/$,q)ff $u_[):2dz;v]m=f{u<ڢ I ) @ν^tWvsAl`7趨rI@V\ӕ*^vWT` %av _%#.s78eP7B߲^+׼5U'ʆON<ݓLz7;CguނW\|A[uK0r2&& jF1l_G?WbONwt*ޫ$EkI/h<ڨ8`{9SniiZ(P=mqI3#A= =DDK@k- 297w([ݷ5 &RWݩ%|2DI/O#ݎ:~Lغni`v-2 Le 5<>C "/+S^=XtA1lmVԕ;o.䡷CM؋S$`FVd'fWb`Px-vIڒvDdd G@C RIYd ? <v'Ӿ۶0F%V{aU9$3v#_ ى?k3?s1J<)vtʺZۧ]` N0ݜu+q191(G}Aq$ai_;wiyP_,먼_O( ʆzisZ+īk5ZwQiOwͨ AawcABX)DҖaP1+؞Ypl23[yEQrVj{]@T~`1eS=`gf{m*2eZ{]GQYjj5uLr4rMP4J= 8ޅRIZs|qZ҅?8VOZs-ͭl*Ku[fjvDıUwly>pOhGWQ#G7b)WsIs\)h|NF8dg+v'uո?Kh&7`#E˚׌8d/狦zQ׋e7r ) -/pP_qeݍEr߭a#*ÞQFVRjw7u o9ʟlj,=ʛ|N9)4n [keE ~I>4O]h}W@DUeXw!D{9ct'hnpxIk'ǟ} ܕO#j0z;Z!ͯ!\{i]}(`z O?:j# -Eun-\-<}ZN|y*-&GU ^*~u2Knٜ"l:HJu*i={%ZB$<ʾ֯SٕbnM00j R$OѼ2 }Lǩ&Ÿ]`XY=M4ki4MM8M4!pM o~3Rϝ4h〿nx\9֭ %2umfGQUhm%9ǹe\0THǑ gRq4cJb5ԤG0O;6Vfy^c.%9FTIJϷF5*8y>(URXr=4M܌Y̦^ bfƫnGsw#XGuk;ݟ`}KErڨ?K#*a3TmDԓ!, upq{GbDwwF=tg:;;u^tsQ\*7cxSP֪Z9.[h1=-I/jƵ4L)87*[kt~QYdy~on''g @ OƲm1;edumȌɋniT{IߐrX^ y=HҲR@+?c6<+(3UĞdbЕ$2> k-tn^̏\.>¨;w?V釡^zA ;[GGrzSOUVsSqFX}5rO1Cޡwsm])/Ȗ>nFEu!qk=o} 5%=2{o5Ed@X0J=B"UOr0SAt> ML?5rg?GljgkW"V()GΠ#ퟫswꏾX 6{445_H)jYIqO2 O q΀{Gu\1>U[SЭL,c_KqDig4IL=?h# 0go ?ݝķRώ۫U&*sQ%."ET  ' JIxd8N\x.M| .ƇǬT7}>2V%#=6+OK ԫ %`(Ya~+ӅOU{xWYOQC^蒲 e Z fXvS,:HN_vP۳a{EZw6Yr~)4u 2Oyǧf7U.%UM--.k@0ӤU x$ Ν5˻{|6g}tN\~ ^g <#|(-f]aSh'w"_d nǡünGkUSqèhTJJcV#ӻU7ٚRovGm5tmy"F9=6:N[?ЎCmzQrWP 5 8l]#$rݟ:p?ƚ\Qf{ºS\ʣ$${+44t,ܑ_xyy~Qny-evKE\Mt6JA q/Ƭ2|d9mT!ǐ튦'@QǑZ:-Ǥx,m[I5 f]I} ? W+k27"̰k>a^]4Dק/5ZJtVL{1q#vzpu|R Z6SFfUA _MvZiWwYf:*"H#y/}N-st$T?6:m5t 䦥0gVzCv`x܏7PrYO-4I1L0^?G!x/VR8PuO|Q"q*%E?<-cc9nc+64JɥeslQbdYQH/U-DizrGik΋/ҿ=KuG.EdIKYT:I/-$sp|{n$TfdvkeҴ|DOOzZqg|pNԌgJWT۬ ,0B?h? Zs֯l߯P˅y^Bu68TMc <0oIE&6Y>Yxd#M<}~y:LjBOq9_?Yͫn)\s܎I)$H]qv̤{q }|;Ž8DazzW9:%%N8+dyg 8-8CU'XHnqcVئ@Æأ紟wR"ͅXkzB(Ujj,%ŭ6dh`QKv}1,[mf$3]U.8֍R E$*?<S}vSl7 |cFq6C<7C%D쑷d0E,{NQmFoy'C[ʴB)%w4 c]*MG Mܺn}@7.duD|Ev$Dzz gjCl'쑯2vL`4IJʓZ*=S'uYYFlUVYphҢS\Ѣ/Ϛo~Q]hU5 }M$*Y; {rqI'35ʯ'&K8B!#;Wsp8'mn8L"ZA, T!  Qo|KmUU0J'BC:}#@ 5$4w60F:r_(} dMӮlQyEu4Mq]H Ff")*Y>Gm];%&J[u;BQ5A vl Vm}BM; h۲Tu0?D$LN؝]KohO$Q-Eϵ[A~{{r6 -Ә~p#'pOdNImnqkNLi£K#aU2y#x$z_ޤoau*j\+ R3rn{T#9DμJ$*ua}BN6X*L/WJ882A'L0Ha,)fM|V}`zgfۙ"UDp0:ثfhbiֹd/ܬ%IU${Eoywޤ#t#8}}2#cٜ=)!z-,}MWP@i[!|G"[ uǵїGlq ⇹ 1id(;׆<ފ<Ѝ+RI&UirOlWaSF ʡevFˇiPIq:yG!`kY]LY/P'ꨪef "/{n:{PWlQU}5+ ڪR=(h~HnU뮻ӓϫxҪJ 0ڪ)*$teN4w: ^ LcxަxϻtWJ?oq]k>)]m*&mKX#UJ}DPn9 ]*.7LVې,k>aeػΟ*^zaI4.>_$:e!WroW,vZn}Je9Y|- y4ٯTXk%M)-GwP2]UHj>w v"q2XtnDQv*E{y3J]Kh@@R \`~)gvpvv8{IՌ< E%:Tmd*#6a%43QA:5/Wn(HR[h"=̶**aM)&@H)C#O]OnV.5#9UUDRU$VyYAojJ3o`j. I0PU gBzZx4QfY4h|emxq9F0r袲Q7W{ƮS-DxW.3+4$UZCDl6gVx5vL3SOфFx8?-K,{bv[Rۭ8m4 4F(TEPPQ7\Ωkflr WL8Viy>k#i,qR9K~*'ߧe@ɭ hj ^<֬y nZ%+19U@yIKg6+74 RZjʡr;ir)?sBsۙU)WXD b #VYDUn1#uz|Hc9w+~{WdCSSwyٽEݜғ(52+`4vHPΫ.]`g v3ybꠒYTEPK hXqAn ]f3O^#z1wWDT+?`1PӵtjelH}9qsQyۯn*nU@ 3ьQ0,NC$ds-zWA-aZTd;6=hy?{we~!#%N=67ݘ a6O[Zvqe(*f{@77 m+MچZ;$5TI"OVVe }Un? bUݯE+YorVylrz<3p+;o77Q+ %*> [aے urn!w@OObV[ DV+wtՏKOM2A3,PȒ.7B.xjSd;cNf+ B!bkiST &Q(JgԻdƺ&Wb]!1ɽX!&H&^AZuXc᫝1ZF3.$/s)~ȞHt}vǵ(n9_fYiVulb9%=EQ3{fDiqmmI`57GAAENVԬP)fوI$'Uے~OzĻYZ52N+zd`X10J;o Ξi25R3Ypy,59SA-ReeYבa*\v#0;E)ԟaJ vouPmE-(s#,w T}̸/L9&=?DъPKC4$^e#|`1e4yMrjZjܚM-%B $4}挪pWRA@P(MQ샹HQ r][7~K󑢥R8ז,x eu]$ZP;g];4PIL|ӱΦ77U=t9sڜzyf4ŢZUȿΤƴ2 c +tcIpϮ5'sʬֺPSB+UȬ& [Vi`:YVm7ç{G+L!tIbDJbZxdnbR36e1v?0K!Z#?4dX8cPZ. _In(zn:M1r̖SWhke҉cG#,)H0)0vMNh] `z wIWi2'ntSIXXEBT? |Ħڋ6ҭ-ZخOIOCMR5\ Yi{sp9NEm-l77Z:z).jeT oo깪F aǬX,u,t6uxQBqk ւlEq'̤כQVH] ֎hH?k|yMvǼ9 ?w $MEθ;S_u-h$)*<$}2K,eJz8% h.?5zެ]}ҷo悢fr8h?wR7G$)M ^tݱn 6[UI_ަ!Z!"b̐Rv4gi[MEmjt&P &n{IڊBlj]닫z)P"Tem93"R P:٪d0ģ;m&&jO qzfK~?}-c('AjDyVxԅNVXqnZ}Yg-W?KW wټ::NIkɂh;y:^=Z߶q}*olRZںzJv$ mOl?UQU_[1gRI6{mF}$g{c,miL3, ~Q~cdVEZ˥TSFY4EffbjeU.QO(+g˨>J8k}}=M <{pȜYWJHfU%;##o}uyv4#mU[o]zIx7{T eE734(e:͢韥ĺZ?oKK$w,4ĿnTD]&T} }zۗY[hر ɩvPW$MZl22+-]XH,GSqPi(!U"tfZtn'%dU1XOt211Tp$I=4$#j Oވ}N)svޖ:zrczhZG K2,+G'}37:۝6M㥱'6jZyoؔKI;,G0X䪕a K]ugVRLh掛F<*HDqVS#NGh+Գ/i[E/)e$W2JG qx]5]>ޱ-%vvמ_!TGOmdR1+$Odᕚ6(핵660x.wٜdehM,ֿߏmַjˆԤS)l𹒾HLi%ARQdDOFg_ެc~)t=QifV8aWCi`BU*j֘ng#MY]V;Q~ۮP#M77(* D)R"TuAj+mL6ouޗ),}EoB[LSە=T8Y"[K6s<9 66sYI* ^x.kIM nΩ(n RkgȋKrV\ W%\ O$iY|,<\q|ARd,BYiK$rȈe1Vy[Hpl'LpVAoDn-%=eiGup椐U%$ExH 7 Wa2KtcoWPdD{i$"3S{GokG7)ij={r!gr| 馃5WM4ЄM4!5ϏtЅ[}E7H]MAtnK.]tImJ棨y%h;X VNP[rK_?W-;#ڜHL u,Ȝ:pyjǀ<O=4Z_ 4ke&@7HW4ީ=\f 1*%L煒WRp2U Y9 L |:Akj&AWQk%vz{N=ConWˬSE$cYx{I*xF ヵHb]5o0_m%%ʒkm’96x&@"08Z灥K4.ލŧ0Ueja]o4$ԾMAIwӷªBvx~F(?M@>i'lOid/Z_.6[swVWԤ=Jm@TBKXo;C͉@p-*O9}ֽ-!NI]B'Ouy(Ud(TŭrFo]㷘q{]FOs2Rjhה?WۀF$'NᾛyΒOdT1[Qg,G*X8Vf6icѴQٱ EK;;1gyė;mdzgL0tUhb}EaxF8&fCiPGKML+QI<<:?GWߨO7p.gVeΚǹ{rJM4+M4!4MM4BNMM4B?_؛ Ů+m.xj 4*̋ rIJ<)ǟR憊E $pk0āQ<^W+;}}[etxvu~%xX9J9A^`Aa׸'aOvW·kv h]x3]GEm4M?Pwvpw7k]#l''O#j_Nޗ5_OPK vy>|!$QK׫ۧ{Tܱ)=%cH;bwjn- g#;ȯ `ׁRの{ķG~6cdqݷwtX3_HzXtP?~=-5jdnDjdenc1Fă΃-7zWH=z:Z3 =5I$T8Tʅ¨_݁f[-MUUa6iVcXM}1aߵw*{5И2Wu+'ta,P;! $2 EP?y* CVVQU|QytQtz/Z[3 Wnp=tQ&6 W𥉉aH؁gעFKuir!x,w!b"9jֆ鳩:;^8Btb](ؐʨyb e܌'v~mIKw] WRr? XUeee`#L'nUP+\_;O^ s ֲ,힓ǭ444OEEG <(R4EQU@@UH:/:SnaWW]^e3WEW;~NiwHL4w~Dz*TH"^ _Wn:/hilF,b(n̨R5D)^ 9jrᆯ2n1Yi.Vۍ$ u}2T)I"7]IVVH?:yM}5LrwxTFt?}ƢzwZy$o pG-*}C!{ ; ZR]}nMٷ=S`W+dL.3aw2^r֗ӯ}/T[QS]*&mo b4e5?k1H~n`:RΩPUvj'C% >LkrUJn}qgGԶ-wLo^?2USAt̶A1l_.#C *YJF lS>=J]:K=VeYX(Q)fe,1(vf}D(wS+ꭗxgE" ":]IvG>?:>>5ƾ},)CWkM4!4MM4BM4ЄM4!4M^Em7eS+jWyGe`XpU0 u_YX"Cpz*9ָ\5) ’sur#G!F tV]Vj\BhjIxUPUT >Gƾ}ow]Ӎf{?ƞ(RƥXpA#^Uӹ]1噭Ou (cLH L}VG?l'?)JUKQ # !#Q3us>:c9EA(-+QM BTN`\fҊ 5iXx@#Ԯ|ďʥ-j}0twӬEmuy+u x&A(g Od_rsoMٻ%Е[eE[(s[tDE볅:=46ɭTKfgK(X@9tgrAT k} ,rq[&+6e"u |$q ?k=>5WP;+s=ӱ OQ 529_z}ȪÂq7p复ѹax-IE䰳IJ5@:L8 }T:?>øٹڵ{d_Q85$ΰhd>L̥IbG$m 몿ðgTzzΏp=lTuzkT2fEUaa[V3gR'e0غk΢l.b P[eS]6PK@uWiRs{׏ӯ_Amw{]6 [sh8XɒQF^00qd_TS}&g}O da[=5 )+d2p|5ܖdPVZZ&֪ofVXTn """&4J|ѝyVu1ϱ{]T#0 *M*]l" Hbr"J4zMZ3 'PB!gZ`UXʽ 쯮R^۲՞ULjܕeHcqfVT@JY߀Y<-u3PlX3fX5nI(0䧍Nr9su#%EOUQxbdy+l1q[N?fwi唪/,@$uEz/X,[+Cur!=-)#tI_2deg)%4u > PAR2J\=آeniϐ^b4b')G Td7y /~vNZxk.{|1{U PO{U71J),Tz1fSI,x)u\6f:\Mj+tpNwK"7 S50:>[/f_P{bEegWTgFD[0|v± EL])aQh*kK&4^.4\&4B4MtM4!4MM4BM4ЄM4!4MM4BM4Ѕmayavi-4.5.0/docs/source/mayavi/generated_images/enthought_mayavi_mlab_points3d.jpg0000644000076500000240000005235312747716313031331 0ustar prabhustaff00000000000000JFIFHHC     C  BA"  B!1 "AQ a#2q$BRb3%4S5!1AQ"aq2#3Rr ?)JJRR()JOjWusw)1!ydª(I'ϟjŞ>-/?|*opYqӻUC(wRȡћ &l9.>IlcRoXI#H9ya׺ i0+FU,O̽|nᗚՙGyg0 MC n5vO>>a}noȋ#'I3 dTOhrx )41V+>a(8Rx$*g5jWl^+^t6qktMz/476~RT!ᢑyp!EH $+N)zd7qvP]]AqZArk;tNLeQm_a7H֚JL슙+'s\s>pG\/ck1~͋?x_+BZ}U>2uJRXR()JJRR()JJRR()JJRR(\t[hFGr7CXcLK-X`N@!@f`$X1?Aw9qК[pu|q*4|^[9?0_O ϹB$=f?tnYdR+5t/͖ m$pauYiTc|$y's⿠X5+&NKC:72:K'#s'{."#`Ґ''S.7C*fїX].֘\wI=5ȮqˤqrG=ڻ.Wt*c+ei=~Wp5g(U"|.as$P~}j_NusսMiw}$AiG }I^;WS8 eTtl1ر~ګ5\F v98JwgMQ翑;g]U>7}oσ'lQ_eF+tHWƥ {dB˅$0e?W 2)ɩYT4R21ŵt\d)J<)JJRR()JJRR()JJR{x{κ:n+lt׉dp{U;/k#(جhdC#Ƨ9Jy:~~#ӹһEnn8v}sv:/ F+W.mc}u)˹E/w6~{'(cM!Uke\!,j65UP*!4DOV)u[7):6=TAFćc URxuڦ]mfi埋lWnQ Q MV8Ʊry~ +']Q|+}?cm}ѲxMaoq,,3.qէyۭWg6[S[nc߂ ݭܳG ߿EF󣾣[u$i;U,d`L ^& 27aN:QۿGI7m[EgՆF7du$4r&d}*Q=3&9vzy\rNJtA _[Th-Q% >;1'auGdb OK]oh uNG${...eFyEQ{**ij۫tӢ#'#ϲ[WMTQ<̵fiCoWӶ\Ƥ Z6V_{_%}ؖcXd3,7)dZsw'"BՀ<%' THG!RU&"[Gc jRcUF`S]?U;"5w,k<뷳͟nUꔷ=-qJ뛬X 2Ͱ%>bxIH $=)/̫p{ǟ<_z<ޱg߃Ddf$B]i}Mq9T{// ,\έ\3$M/ph"n^^Dn bWr.Ф9^-Xx55eeZW.ol0F[3s ~#yw;obv.u=-]3ekdIEvp9I !3:?o>| =,_-[l5vp,V$.UAb;`ۜ8RYq3}<}&uqюmoszvge؛#a٦"U襼crQf3Q7GI ?z]i";-oEǷ5vIPk=seu]ՊI¯i+ʜ9lRGUSfw їܬW2*gy~-oqcEb㾲eIpQ 9~ČZ}W~SjY3ko9=[')@)JP R)@)JP R)@q7STW_m#JzI,V obDfVބܔn<2v ҪX{~ⰔUq}rRty }ps[UvlN9më5NREBU YXpA _"ygC8o)w [%x{x-]ڿi=4t 3:j:\;n7rzWS[B/<+C~zy*AzV}r}+t\|{"K05`M Dk oⅻ ~ZC&9K7#, ?eמ`k~}ݤ2S /]kݭ_3[LthSI%AhBx%Xr?FN5jn[4u[4|еΟ(ueշ.IK[*yJ5G])tGXsq$ӭ>oNUx.,] eg~Udh^&SXZ|3zC1\gQH@HA'w "+ʍC}"n]|UՓ~,lEɸeI4XV@Znr2QQkSr-' _DK&692}'|>}vWdw^%,]3[?s)^")@)JP R)@)JP R~w0?ګϥ}ç7mK{ SqJ>eKQy@b)p{۝ ӱj|e4bif^VH]eu#jFHQD=ύ5{JV@p>jh()JJRR8jR苦n1Xj+#|NNuH"~Z6X<}= XKxZMe5$Ū̷|ڶrmϳ$p}Cgǧti S'zRèO㰸إXkqv{#35PIcH{OmN__fM] Cy,KyV5b4&RDG\z#2) |Be}#^/ox_MDPS/w.g@G跫[EW=֡׍wo4K JfK[>-dhvOIh=,"gnZG۹>=WӶ OuD&2ow ݨeRJHLK},9^zni9 &]ƓR|~k߹앞Z6;kH'@"02A|_WG ~еmwdUף#U.Ҳ6vwr|W$4<֨KY-dpZ[d֭ӹZ mInXn&e![s蔕c#O2-UΞ$]t_߼vgR.4!Zbbi~Z2Zp,zqr@.9=TfDnՙkl_ǧؖAry_+K8#ǹݏ%qN#k[]XYKS['ڔLtVBUE[F46p_P5][xɆHo V6~2,92*WS<_3s%l[-/踞8nWCovTYh]9 Q=DTȥ{顈F?.v!l+LܾHMվD!.Kx仲JToG-W7+_g7G^$ OgƊw2UK*xխb({O4SV&S!l^t[/bi0\ôwR$x)ܷYC9/}5D#쾄]a2~µNJЅ`8uL-ԉzt|>駢Lxi57 K&KFg(2qc &X6xQd {}&w]՗xI ,T WFx7 G#{ /oVX\HYY5E-2w)rҀet^ 'm|&^w?*lWU5۽-L.*vֶp 奖Y h@S]hru rW]];G>ъIDOTZjvD-cu:}Rdө{ ElmձR*%rV),3zDm(Xǟ~kӐ,j(50 *e{ه]PI"OZ~i2w5eɲ`rrے H$x#5oƯyY&~Qt.z\_GuT8"9c&_Y}=DceuF2#֭\~N 4=xHkA5^Re[i}wv+j;nUn#후E]yeAp(eUiJW)@)JP RTgGL_D.HJˍV1Gw_W AEI&qܤ.Cz#qF_E\:?OZyʌI=6)Fd+fJi\sSjMyJ {bK$K;333I$&nbm+ؘwRkj>lZlcZHt"Ϸ֭5d!Q[ddR~vhPK}'t”e"ˎ8~ԳT:<0Wwa=-;cd` VPmmiYT(oTܙ@!°)HirI5}tPn éӋkst?Uj?fKSxN:D/kڌ_>Gz]:GmslUӒ.ES4 fPJ^`szZofwSquϑeQ.gP*,ąP+.[z.{)i]!w`v3*d_^7"U,@idZ#*|Ir]]Lq0R}diH*p@t!T'֧nHR;]v+⥘Ix *;Lj|qRLk@r⡯{&5<'uͲVyRmFj ,gPP9UYBx}[Y6vз?;Kz-Qr@#_tˌcד$WìC=] Gb B>jޙKI_AWE}Q^t&Xdǟ> WH y='f@Jj]9M7+k<Y؄I'HxQ=[YXl=Uzq^~/jhu­j={ 虉> ?,8*Mz4k'..:i:xǟUIUJ>; {*r*ɃM#]ɳΖ퓂 L1y!<,>v9&K~UVQk{|;~9EX}I?Z/+K6i$5&l<nL|?9} //<i~%WZ`;v8ER({KOv$@]@I=}Շ[1e;:ݕ)RjR)@)JP1ڰ㹳wz C?9lby2 n@ »{矖H{y5[d尾%hI*G}Jʧ=[}&KE-'Iei `f֬GԎCJblts#%$ f=劁wlO-UxVQ\6BW5 X6d| 2[zC>jc֒In֬>e$#yT.%%a@ \vz ;ko5;@5IwVZ sRao8VZ19>F5~idoMklioбY .{LfbM#L+5әPMWX{ŒS ␤5 |w'haaeXq crgTG'?ޢKl.e`q5OXDŽ宬$vMk ȮM*kW"G?nYQĔ ;65K_Ub/;X%L3B1| "i\ɨqsM$%j-KpiP"quIy78K!7~d1c٘T*ϲ*"ax WGRy|>*өm?v rI2pGӏym#gFL|ݧd%Cpvtv_RO7{mO7lnp5AreW#ǐ|r+8>?tہy:NAnj\^Z\ $3+#@>A+BM uk[KxXcz3{ΰ1vqqq#J$h9Y7=1}T|Lv,p1=˅y,>^H/̒@rm vkgiěl>ekR2?iWG{Ii}5>_xn~oe;"-챃 (..ןq /i]Ŏv`Gi(V9ynX~U,mvTVdBGMVg&v[6O#q<4&.td~}ϪAe~Zi{~_Q'%FMtnKnb a&Nk˽OU{eJzKlAcUu>{ .i1Maۍӗ8\ K,*>muocG8#AY_STif0Gr0x |y|}r`$턵F`UUZm,W(9cr-C9pWT{ofkg ϰOhnw a_Flnɮ^v3Q4-3!t#F˹ bgXSa|ǐz[\ZٗZmQR{pql8޾ i?'{hB$=i7icSk +MI$,h ; B"i7ji[i 3i07Y G`s$>v~x\pI۵?Wtsk? 'sr^MYyYՅq?hv4uGqr_Zv|]⣆ybm+y$sܡ¸ NJ潩~?Q囒[cf3S#D bH*w3ֻs&ʒy)n_x?X;8STtP|Eml&Ƒ7xE${o!=y鹓 XWh-y;wnP"/ˬH/|k= jh}U g3N-dO@x }2doQxJRWt)JP)”()JJRR()JJRR'ɠ1Wש7YED8F唙oLRr-(%yӷ9,Jlg!=5$Y݉,ĒIIw]dg5 74+vcM]dBNukOaQI6]>X)K>_Z.׀ՙ#*ȱ>cioOsᥲ%Kp;xX&(Booʂ*W<t,4G,?jEeO8#D.lu W>%= ݽ>t SbQ#c5&rәYysDZ?z57;6tF@'2sc,{>Z( v` ժ/~ܮt6tnagiQ+,g,Ӹ[H2, KUHMS8a9B[eS+{I_+h,޽~7 5i^n9mMH1v1+?*3Y#I&HGxEMw]~'FZzolzYiLךz] &102Fn$8~䌮t>ձ}OJ)JV)JP R>" |:t6?^ugr,çZMw([{he^cVMNa&ȼ)Zwֿs]O7+/ VKt-J]Ec{y|԰ܼCc>f&!~S%’JWV۞Rc<_#uy R)@)JP R~}˫?oMyʬs!!eJFI{ZI8`ޔR֪4yu6=~@;p@u,~5dKvGm`1x@"y%Ir?QJ\O%(;t'Nޘʐjy5%C0) PLbٳ.3} JQ}>'ru^bX698»{lؒ2Olݲ]i)ѹ wyCH€I7\u;se&bihfe/.n lsN/X:q;nV|gG1fdO{#/cbm|]N(/zR{Fc%+K=~1ܝYe|J!I#K&)m-gTU '=չnJ/aSy͵K-ͼR W2% Gp=}J)@)JP RK/V^5V1'%VWCvXl샤r԰@$(U V5.u_}_S?KKehq*YBX6jvwFyeG߇o{S-ŵo<xw^nr*v޴d6q(]P ]u _t7qš)= ~[6'%О?3ƌWyo4u@yDŴjBf%MoVl]Im՟ܰZFA.:Ðkd z|Hhpxűνj_8Lep2L[DHqxx?7 XvO*Ö,ce8[J{:-0ziߚV$}IQ' ow)m9"X,o޿쿸u*$2`OƼ/A\q3&2JG_RjQzR[b,e.n%uHP}3_8Lj5i\GiJTy,I?}AׇăRh6FAw!wu,#ߞ٥I Q'gur, 5~>|Y5Nԗ6y;DdIc$weF'K݇s$y"rx,ݛAAEFꟇ[Ƅ&wo. (;{&­n$@DpƋ.@jCS_nuגAîLRkDfd0V7ZƝ27JRMJRR( ;C/N7'+Viu{s$Pe+Ĭ$pő]x=W֞Ԛ+Qaeq7Y1y+G&)$24n) {vֳ~+?a>$;zڽc8lir9%7 hEyB1,unKu[- @k|+cR~-;kh 7b}Vd2kj+߁~571զ༁.h5{YDžq I+リ(y0KC? YŇx)Mg}6M#)hU#8X-;SK6sʞj-[;=>m^dcF+1cx{ ޝw1,|Hٙ)UdFc}LRCJRR8k];I2z Iw(9f?OO=զ?_W\ni;c5b?èJO`pIܪ $p($wlK՛nv2q>=&)Ojhcհ`InK[vSuwy-v佼aXI=bR}Նqثm-p< )+j)ԮPJpu'MNuWӱ?;&oV.ݙc^-) Vyފ@uBmAvd4W>8qUOS|8'U k:VwIK˫4(;(֌W\'p/47VmBŵs!223ۊ[ik^W׶fO'*9%K {ra11ȁdA<Ūm#Xrb0> {)t~ܚVsOjFnl擽8""U|^Y,:ZۭCdMwNlnHByTx~ ~`9o+=ݧ:'$A?(scZ\uN8˺0*F]nk٠ v6pvd5}7ɥsgR/ѵ^uۍq4]ӴYo'5%Ha/y6 < ݥ]m/vfe=0CF~ilA F* rG9[O.+7Wm[Mq=I;[2S?r+[Z#l[I#b֦੖cY G.U@,< @W?BQJ,JqsNiV)JPA"}.fq;na+o9ec./.R Y-nGuDJ{,j p>*#8(Cz^=YtVmC7/8llc2]JHo.a$ UIe*=NSVt%֌;gV4n(Cq{;5Ēqut21EQQUVէxcJn})JR()JNڔ}J>┥)@)JP\wr}8nyFkv4.mov;QE o2w{$h9Tywc¢YٕT@8IŹ>II%fl>!y^ϧ7$->#hBH28"*8q_QCj=BjL7,[س~JEmm܈p$Q#5%6J6 g.cxoN[{OojhK Bެ?b G#Tfi{|+0R$ =o G0 R\dOT-ɓ tĖAkO].sw +NKcJ}xĶ[x߽OܥqHV_ҫ8TiRH,Q#oҾ)2] 3b2{}:Jv{'6/pǟώX>8o=׏.GVZmy)QG9Lvc㶛"cDD7ȱj%Hl {0llB+=}5 ĮYU՛حl{\b;i_Gh$\NiցpbޭRXd *ʒƙA_O)@)JP R)@)JP R)@|\~mRz-pw<ـ_7 m%DHA4rRHH^2sDCLjhO[@˕?,K[YGdW A{'-7>5MměǩGo.Ia_fDc*mn_K;c6p!#Iw^9# #ѹV 3pM['Du?376152ݯpDRxtynG|H}#.:mޜOR=;h.pX,uj;+ H& JIrEcggV{+<В<>ǵs'Sx3ѳcLZIHޜ?oG3Q`-un>}%0з+H̋I> )#gRd난Ė4R 0x⏀W7-kԳGc}yڼ_SxY#[u 'iIUk_fpP,^۝Ҹs|jΪ"F V} #ܨ;rc絔Aq #+>S9xju:>" Yc +<+{TvF >+_N 2ӗ@jҹUIՅ2_5[؟ĵn]z_5ŰZZfycU4ww>som؏T| Tbeio@$zMD,W.qSܵ7 \bNcO5t&ꋍ P4btjA>LU?^k쥞tYG>@~$^x}i|-[ZYB[BHDQ1yu:wW}N65̂mEv$ROz{{ 2N8ec0K܍1v@&Nʅnx>ՄߐIɤk N\GD9 "BN;@Hۑ7n*gp[ť%(L~M`kfƮ-a 8][2eTVDևEbN;3ەfU_VTs].q<\Pp%{3󅐌٭rܧc bsE^'h?z4V~4EU][Ӌf9cVzIe{fdA*?W38=!oJ3?@]3'#d9:H5j,^m;82ay5r+y yQާ{i[IQ=\I p=;s#15]d qV2H7jW[G7O>}Cmdr MQz͹6 tcW2_N9x2?|@^GG k,jU] EcWfH-'{bS'շzy a\,kw^.# 3Uܞ|}"M-amC?ԗ)KnV%"1Bk?h27=yfbl|aU:ݼӝWsvә R)@)JP R)@)JP R)@)JP RޓlQ:O %2˖6uwllzvʼqtiim}]Y;#i%a㸆E( I+EQ{}Ck{;.2?=r} $|P$IySX.,.%(W+控Jn[Ց*V@zqp LnHdX<\"|ɍBjUk 5TiA}b'?TɊnE`̸-~Ks/>95حlNa*-@XM|NC3/!f!y  *` Z\4:4/ݿVյ Y#)Sdh)@)JP R)@)JP R)@)JP R)@)JPב*맣=&I :ZKf;r(UWe~dQWip=c^VMNuXѡ6췣gso,XJwE/C|X מV$qà#EQ[vz |ИiRq,X;>Nox2Ը5s} ~y[klֳr~ swʴE62p{V`xTO$po7z.I">;I[b99E·qT} >S:[r`;Pޙ-?Om{Mgu,%$("Gҷ#_ ^vK[=ej)d3?giwfh>*p*gNi <wI^:{mq 0$*I<'e_"+Ž\S57㥞R5)KaVErdE sgOB!W:Uf X2z ̰ 412?{DH B96.Gw^f}+ڔ8R()JJRR()JJRR()JJRR()JNڔW p>ԥ|c}8)YJR|)J)C)@)JP R)@)JP R)@mayavi-4.5.0/docs/source/mayavi/generated_images/enthought_mayavi_mlab_quiver3d.jpg0000644000076500000240000010100712747716313031317 0ustar prabhustaff00000000000000JFIFHHC     C  bR" W !1"AQaq 2#B$3Rb %CDSTUr467IYdsC!1A"Qaq2B#Rbr$S3U ?! R)HB!B! R)HB!Bi}0G0'#ìWhZV^NYo; IlI&v{7cǖe:zǍ*\r sl2Jq8:yF^BɊZLwF݋WNseqWz )ROp+w ^;Wy\!HZ@e$qR~Ebn! R)HB!B! R)HB!B! R)HB!B! U*8~qjURC2])˯ĘVs* %$n#*RPVTvK-%DW=ndMʮXIܓ~qŔ z7+):\ 3< ;b#>V{k\_e]MH#=Tî_W~|?ЧMG16J*/229ꔜbbpAȈ+}/.7l$IsT t:w Q'ϬktoI왅OYqD7O6ҕ% g?ƙitJZY7Jq)kh MO0z>7yG * %J! YX]V&BjSn9ski>0_1zHSzZMjgZ20?2D[ ;Ep3@p!p-OE D}}:S3_Q}{դxG¡<:I6 q<>S2MgKZp(d({Gߕ|s6' KƫOe|K?4RGu 8 zGcI']i˧%Z۪eoɽO|V))@!G RH@!!)N^@U SrFt'h+>GO'+KSr>ƹe%><@z\DNh0Ezvyɉ6u)>]U @PHBT! R)HB!B! R)HB!Bjn8Ǭ|&Yeɧ Jxw&97; WŁY5 ztї~q. !8 C8HXA#;rի0L ܁v]`9Qtw^Q,nkVTzݼǘ #Cj[YqN) JIBbJΊtWMY9\n $ n<ŎNqϨGjѤeGxzW8clNd/JRWXDBO { ee% ʰ 0JP?!9qmxZ| ⓦ˕KHҮ#IBXJDX}V(%#H|ɭ8fqu%ڵ|l[}%YĺPAY H# >N8=es $8XE3$u_Q_>瘥r徵M\L7a@?t,oZ%H!G>T&Zf^T(IO@#&vU3?_Hw8\ &&h@BՄ5˦3_ki֫>z2)u(D!d@x1n 5 QeA)B^;w?imVk,Q;?/)JHIW;{@bu]goˆ OP$Lhe0v9z/ eY:{di%4;.۔K6pQʏ'ɫ^uJP(*K`2, Z OpFTž8U۷+A[=JužۀJڼbŤ#` |k&M gnQNAJOHGR%j/MReTAu+io)ϴI}Қ<i^Lmڰ,f؞jԧf%y'O%.z26 W>5Ʋ%!?ֱힾm K~&ҥ|3$!$B x߀gD.1lX~ɶsiH TGQ5$5QۈB^<۶\yeIQIc3{g|-Vq\T/-+iIJR0ܟ"?bCCr!A&=AVX.#@T$c!iwRT$ZF&ςU?F꿺OZ%wm=O=ҽ[Rs)[ܦ"l8 z^O\ec?КRs^bԃ΍n3ү{bZ`3qVw9ǤH`>_~Sbfi(Pe*޷}C>5\ K #!'Gz=L;5ꂕW7,@a)qmF Bxǥ@ %'Ţ,4ҩNo-zܴmd,)!ACnݪ;jUƩ?W)HBZIQ OsꝸJdR*o°9#UyPmyGR dgg*: {vH%*A) &&]Z-Rcb9Z"+ޟZ䀕h@!'EY/I٣iOud A\`d%J'G $||T}й72F,ZvT4Ǽn,p@:vP'8E*XN\->Pby+R<ITQ?#iu&s.KWx*H^2FFqGGtzc[]2B%J퀢HR11r3뷷ۊrĦPaWPyjJP#zjMbIʴږe-4' JR0Ɋ';F}m )Nqڟ+_i )V0`=cUv^6M]b嫵*r\W+8'jGu+4gV.pP"@[0OOG.)˄)n|LzRZ*G޺,'Πx<ѧ| ZyL'OzRKÖXTįx @Qy;J@<=1' ze:Vasr-6!8&,ַMۡS%BUuN7xO_H '$zjv^E372Hʖ9:˻4]Oz5nm'8q>Ҧ]̳-T[.؅`,FUHKJU=d?i#iyKHP*#Uݲ*};W=/YTjm 奒 g9m >+zjY#; YGBShPO1FiʖK׀_tI2v6^r0*'mO|#ֽPw㰁`?(LM(BFI*8:hbe]PKaV2N9)Cd5QyrԢ RA$;֡ڷ߼|@dzf/H8ƹtnr}PaO̸L{NaF,sV"J&::Ds'' S؞&#a{G8z\Á}WE[BDs߼f{d5\qO:Ĥ7upoIZeAShWe$˹-DQ}tz}] JȎ")jN4hco%x" JG97YܩBKTT1+)מ1~6N⍧1*GvoI4zs~1Ktވ+W+NIt'zHJs@8˷jF-Ĵ{x- =w4@?i'QM풯j\JduPFW~Ox gcMx zeY7x8[8`91ƻqlyĉ`N$A1[m:y;7$ӊm@KH;O018$]ݔH3J'$}xǼt+ݸ?E[Sdai3\7p,ZG,:?;+)3^eEhHߒ?:ۂ ,B–F/@^RXBvN;&Ơr'qD\djA!# g*K)}JӔ]1n)}n٪E>I :CI@aPrf[I{j%oJL7,]*IOD)<޹zWX>%և6#L*>ROQ/D(E5@m{$ p7J66:wNvlH[y)jRuq8L_bTKbۢ2R#̵3R9$>XhmmazE"\~AGR6;AJ/q\Oaiߟ3B{[T.r*O/§{$d}rȵZBmLnO*Nܼ݅ɮq'q򋳓D7mU!RS)P[x¶0<'0H#=ݧXl0Q+v;x JcW*PVT,PQ @$~ڣH^zu)yNrjv\ԆRԎJVNô8ymbg-+Y2TLI|Eiܓ}u>N[}G%|%èZ'O};g>oX:qR xJd% .iHJ; L>㩲Z7l@wO,`ʖ; ֜W qlЕ'TCe"?,ݚKH4;2N^>ؘZKO?'6ReOʈݜ{`zͩQ< @+rNJu^Iu6B\Yܟ~Qc5Q}IR@l%)XWZOKmX d`gЎW-F睺ͽQvi6;RV@D$&>hխ]vi(ajHʥN;9pbRӉft5 ) Ohv3tXg].VP#'i=5]asvm4o&R ĈvRдuvS*Z}wY} ݒ6$'1Ghu˛6]7taq ⺔$ܘ۵PC BqXdO)MLOڍ0[̲Ǚy#>=̵ǪN(K':PWE}Sԍ@ɦZDJJUОA +BKJ5IYfh!HGG?BJ EbBNHc3^Pǿ:vCz61z-R6((ؤȚM֭CZ*Zd8}pq h}aU`nIZu2[RmiZ *An@ɎY`'񊾨8-]UE}RRGb dmմZ\YuMABq*rrĮŠJ$g1u5NvpUdnvfiЄ {rR:+xނu Br!6-@s$q֟]ed% GJ3Z*.Cn,RT}+ $!n0I);U_ڍvi-QS-Y6ԳJI8p79!Hywp9jSO֞@[N!@`#[3mZ>dA‡Oc8TqQM8B~WnpU7=U2 'nU>1Jc9B$c*N*"Fɐ)Y?sZ]6hm3I&{$vhFH)HB!Bj vA]c^K+M̄BY,֫mP t4Nq]տTRmD經~:eq͸{iF>.* ⋳U\/()I%`+Ve^d3fݹ>`N c0K\l>PG$]PTu2y0-5%!2eTB9ggt"̝*N>[!*R8>7=kͱ)gٴvd)M1.{O*Q9%DI$I1#~cwݕ}HǸ9QDEfs]d9ntw'nIiL2sR?dYCr,`! 20sX8E4-vm6#&xO;22r91/*8 2}@#;O wTTi*BpRA<rAb.t{ fnRTߘX>rO,v6.ϔ ϽT;8qsR@t&}kwQ7C饀M:f%rp3yZZJ]]BUvppG8 L쩗NɬX0)8=4J- !=oYҮ<\}N)n;Qㄤ`q7.QK z"*N]xl7ml^֥v6UӬn|D}RѻO3nj$.~)dO>\ĀqqQZ |K"ֻZZ>k4ez^bfA(Hy,%I!@AQ5>ꖛk" 7+X+ *=Ns;3Tڰ@ZP ZA N?ǾcT =BUR:TdxI)? FqL'ŗy+I 2Jl(cq>cC }}[^Un'֓Er^jtK7+ViDL+;w9$wVnЯ\vLu7CИƞٓBlɥ(^B[d$zw#g-,QҞ&73 Fv=|Nxy|`y{,ݮ7Wh=ay{y[!}ڳA$ucY,=]OՏ*S>sbKЮBk]y>T)HHO|(seZi-2R8HoǴڴ/̡=CTWfreëٴ*=&n*Q+rz^e9k!{!V?GIy%a2;{`rf)90n)ϤPyiP2XNx5vq!bx#ۯ]$T>IFy1~cYj[V+oӊ2޵(|?hكx~0ص):L{L}ezEI9CGtYZG Tvr.7e!WJHVȴ˯@'X.nl>HvֻQs Gڤ!R!Jqڟh!JX:OlV]j IH s;>3rs<FrRr"P2;K $+'{VзRPDQOXz;T]=(JМ&`_9p$x?]6QwH@4?$=fC)yoxsn$' z-ei$jn9ޱVhs[Vq:A) ځ=;ۮZ4gUWHCCʑ zG+vBS{Q/ Pf,&U{AQ'ĻuMi?tXw$rObcsVlbXu$lnйJ%ɵ3(EmV'YMl-O#KIBv8.P N~|\#sNZxVT}MG_\*@ Ty¡w.=+u tRP[q89+9q:{[;U]%WkNxxYBTV|VySiK}#굯w9'WVK[IfALԠdadW˩*5DpA|K]Lnt_ MBdHi" pohm-os RO>U,vȮbÍM#d~@V;G=`WmUB1JW@O縌JQ6EĻZ> ΦQ*kPRc $w4cX}`{CCG $T~孥Kiܒ@{R#hqۚwKQh= n'$d\TfY}BPI<9&:>w'rd@mo-/8Md-e 9W/h&o';/#>]!Gˆ;=suQ*OZ:i_J^R1(q)!*$6vJENj̽EAReKT9'd(qQVEɺ"zT{Yc0lʑG7):^m\Pjrm*rbmO #[ʱ P^Y=%4CԽ>`-5 HPl?X,Kܽnaq|G締`FRߜ}i[+iC-PoF̚Oe ƖqP`(<@ $_OǏ?TW?jKoG{C_?lZяWzU_k%ۿ_TxcZƏ2c\=;*^+̭=!/DJTAP*J %JR,A#V]1:L<댷nXm#d0}1~NtKJO{YZm)?S7MҦZ}.9(fҙbajOI8c׽7Ъ\WPnmԨnUJHZN8!ȫL;H]0 YR`w ]i0 J*Wr>S̥ApO@CM&wK`B1޽1 {,Zѩ9 r[<Zlڐ?k^3CzVy=7;0f6jeI#9$9ۯ+zߝԫ-,S1T|%O,`_92l {{!##vkWɴ1x;.Dgm3vP.Vng[TJ -('$TN#)Z\IP }ݩe޷i]3IU%C9^yօaDݞtTVDBݍO+ZLI0B)X$%NVpj/w܁poK,EwHSW'v.Z?uhOA9P5HEJoanQgeZt]qnIړoIKW ~sҘjS( u.!đ I8 _?P\%˜${-X>0$wbRNHЋ0⡨!JC翴qΖkA/ sљ;^64{|w$wH22unv?qZvV+A'pd0>QXF:!B! S|FK.̡+_J&vn!*1Y<{CErza^딻uݴYKU%>*w"p{Oh,\ŪIz}ƃ)>#J“DD#kM͓#PuNkm+$r3f?ue"M&ap?)JPD./B.36*R@O{Huw ڧ 96%+#9/\~udZB(^R;oRdt_AΰW͕uMbHtkrZ}UOvCeԖA'*Y$!D%g=6䓘eIwJԙ0}u{/S\u3W4ΉjSws-P b\W_G֦X=66RuZLE&BPM3a[iK:ڜQ b<_/+V_$ }(iYs3]%!@b1\\"eKPd#s3>q|UGCv̺PJ#;5?HW*uu[RiX#r9JH#t3Sݝu$Op-ouĽCR> 1=1~׺AiD7kOS+ WsumB Ȩ74h[vuO&̌/F⅏F> :%VS9o:kqyuA+Qp#b=qLTfL$F岇7lr(TT>)L_X[%Bw(2}^xemDz3 DtoDWmZ"[;3*B*ύ6̸NY{ KI;OJdڔ%%$'j>LN4ެd F=QNI:ڗ۱$8BVܕ(Jm ;b*FB~8v Cj qhi 4뎗r7 Y hxYĺ*pm$H><QU-p-ʋmTQܟs]5a mPA> [T6ԟ@=b> R.ڗ^srP= =/Xk_NEZKiKW` q'a86;D‚ "GqXԇA桭fyW5&-yJ88fJQUii'8HͰמ]ح!LD;  Z^aǵ~t}+vGԪ+RdP%S;>FGd˟9ϩK}N*'b%qsOƪWKtDmۖ-!Q$=8%uTRBK*'$q&"NefVSUpOn7*XɟËWpV<3cbul5ֽ9`4!$mz`q5)׽o7TdEaXch$tq_IS*y)p# #F]VRZL6eŖVsC[{Qꈫ*>ܰeIO$Ѥm!Ӭ'|I.zܥPB@)HMl ]nW«.SnۈԭB@IHFK7[dLCO -@GEUn(BEyE^F-P*#tg.ӳ* Tϐldvq=?0wؖCa#WҙTc{Ե՞ET&wOh}HK(AZ3ߴg<hɗ)w$J̤pG#ۃGzqI-)l (9TtEiU:ia72ڕRHN3=w> )Y2=W1I`*=gx#Դ/O?#r gW,G2/^LЩpFG0 Jyoʀ+QQϿ3~08->N\4i8;y`{Dt;]i˅I,$gv9FGcIi Ik_J>?GV<-G(JڇQ\Ӻ8s7 7.Nr|^j@7VڱԞP+[\]C*[jB}ϴtVWK蔷|F.T|9-ьe+no6^pN1GM/ZZ}^\ YBZ%IRI?7soư`* ej}wRu$RJV JH#50uWTbj\e5K[%e@ xnID4YzskV7EvKՇ|ͼ1JoKYI]PѤtz\hb]-J#$'5sg@Q}Q@FP_m~ _B ;(Ny3+} Fq붉jڻRޗoB2F8w4}fLJ^"Ø $d109z>tݽO a%r;qI%ɝG. 2=uKսrQ\{Wd#gK!ݙcRr2Hb۳aـ9**\}yhgTU, Χ5PIҠ25%(+j!R!JE6XBs+@PJu4Y;šS1HCI vt*DZXP}~qZ-"j2HD mD1Ƿx4㗰nj"t'ik*)m, S9RYV1n=6J Kmd 䊔w  w zPIA2Et˔Ш͉ULj<ATNFN1Nԛ^}.T;l w wb}1FʹvM-mԻAeGG xLH<ɱl{d:wG\Sm!▥ChfQejV2ʉ'ch#+#FU29Gfi !LI ,G#9xfB|N ; v ?V[pADwJv}]OT<ICR_#fNpHRVJ6uS[B-WyH;9$1iƻ5EMbk?@㎤$p~a{2jlK >qҡ@H۞X1Ԅ8LiΣ#RzZir3T4WE\rv,Qn2FF@5 +6e$) ?r8 zӗ3S.S*IyVJBSqTR3܈7]f6'tGm,2̵)+rӄgfԂ{=mE)|o-@ǣdā ҰC-]IjMJ-${kxīiIUNIqxaIuݩzڬ7(ҟvI)J[W [K9Ghi{W% n%N:9Euۡ:{)r:m+Ǡ[˷r\[-7᎗'$cWWNet ZS"١$ByʵvVVnRA嶋x X<+9H%%%e-&m (@La>nҵ77 n7z'S&A=(*$+@jm8bƻmN!sMVNrڸ̰:")u$Hy`@V3$ؘIU)nR/JFRA[[HWB<)$+] t]{NItڤeKJFYBLj9R(Ɋzm)RGa3mc;|ؽl+BZf~+SjSjSN=3;[gW:}K2F_eɄ)Vs(QJB|W¢GkXuir - pg {v#L[p$RI#@[.˃%dqP$!|'X9;4Km jW`|umjY3< |q-%D!JI-??h~ $ՔߘtQ}Pog92~];㝕&5j"usJ`8<<{f7]1(ML@&#B:G^]*4S%'.eD% S 4 P{Sx1ôWdAEFgډ<%Qd[ur,[*Y;*o^(sG (/;#!2 )HVTHܘiN0ԼˢQe j. 8x;:nz+Q5P'G(w&yJ[j32ZRF[VvcNWU &/\tz"pygK/c*NPC8 O6\\$@+O DFjZ]#_j!2Y@<1Zn*#o[%wP$r8Q8G] ?*.xNU|r);p0spq;kNaw(WOJTrND$xuZ޻M{9I UgB%Qs]rHeFVNȹ*)#)P8<Ivڡ\ )~Ʋ,'6=$cnEy}A\Ie*eIPsz=~&h֡}Mx;4y ܘ춃,eK>SQ/19VN2p)B%*CUOHhF:!R!Jg"UDcK;M*ޠezRJfX$mN)( 3܈ku $۲\0IsI*89>Stt~tST6Fva器~"k-~JnJֶ:ojE 2\iiwjl`fRDcw8 Nk.l:Z-[Cm`n9<5WUS.M̋) C-6ǙIaOTåV1z]U.gܧ@'H17(? ;'EEi*ZSVIODњ |6P%p{AVƝy7nKR)-[j V9dyr!\4ɓS-M&2C#$q'2@ ;<Pqn}#B~Lb ',1ދȋwO9:R`H1sHTTYU%vg:IAySͿ ;Nd3W4Ү *um;'w=b7SxmwÛڙKJg^lEoB ?ַҕ9DOJ:rqCM΍\:!43H)떘RVʎ l(%(hI^=N_r3?n>켥nP#-4^˓ _3B^`^a 8!\W Nfe],6nңTBwb_W]{t:usT+ZJzMS&ۦФIAnmKM#†R2lHJ7%.0H HG'$+oԘwhɆaCOYOJ%x9vJ6ųa @',P$ mA83ҥյYgs3- nB' msh©Wԙeu6%ܘQK Ipq6rq &gm|/ :f{W*Eb!ɯ)Jm˗ m~VуORdJ1 K֊jAI&^: drԥt8Ȝm 3O2^\l1 nq[9+Y xIiyf[g\[ f+J8,$ Pd~`u(/9o_7h@g>תB)B#GS4*2^rJq7)4qP)R 1 E|RRH5 VǢ3mY܍&.TX![ܢmB*$I'68Є}R(5iX5ԕHO6d>QnکG^XknIł2; g_ͫP~]%{>Cm99zũ6S=p%M8nY&k[ 6%PpI}7$ձ=aG>}D Z~b4.Ml8P e 8/kS*n5Ziʿ/.l[hq)+< b?if4S*w! XA7Mu=1Su/2! vx J?? m]eٴ w(;o=w_<= %bYm6=Nu(>ǹ5Siy}tLJ Dʜ)*Ck*h+涕De'xP_aSOjOL]R466:'j 9U x!(ݺe*@ q$EfpSX*NJL6/3,qRy*O}8f-,#JHOޡUݶk[Tma w&:/׮r~ L&ɁezQu3&?HN=qyIp} эɘ+B?VL8~r_Bp~ L T1k~{_z~u ˟'.bRn@R3I}PV-[N'<YVtUBkݳ)NT4ǙR$TF@;GOԅL%;PlOWR֧e~m-:F%{v7;N\#~(:s_S׍-~!ZkTDH tZ_ٚ}!#Ǩ~Y!@/!'#C(daGE@*혅> $ @|}oT}I&9=?b [Va*ahj]Kҕ|cDS.*#7vu BJCcYis VF"/*i_iPܩ {agR5F{}۪ا!AS*udj  {<ǫWfuWlJRϡI\U#r0;fɭ%qfʮ@K&OOB#m皵i|CWv+`dD'*pǯXVnJҖJ Q_K (+hhv[e jjYn#pJiJCN4Œӊ#ruSKN_ YR=d4e[ J8"/z|o0\u HRvSϭW56Wv(n#xM@uU[ ;@-|Dܸ niڽ! Ow6rrהSdqIeVa ʲ9~"lD5 K=$$ؖ)2 28:Jy '$cj#jJdokN]hAIA)< ܶzJl8t@QI2"ì_fv\+\vi|1{+i撣#&xw)keDq@&HHZ+Ft.]%)RuWBv&@="Zt٠:Ӥ~%;kUGftf_}IFнkJ[ Ho x v(ڽ{ r&6 ˞aQL^eQ${o*ۘ@vjԥ!B! R)HBZFrI\m/PmQSjIK|OHÊhs:Nlq#M/bG,]lìJ-($ ~Eo'R}lL١E+B) |~%iiyQ5,\mą!+!C>4ռR*!My]GaI89(&#_fqr aĉRB;7cx{ӱxP>b׶.ZإV)SSdaF$e DԴ_8zN2*4f֗Y}%M J(#M0,ʣOqjjo!AɊAYzd8 c=Ǹ$ZF1c'#q/ %MKcǎsJkծfNccr`)C!<L:}`6bjLqOk+6Zp=h$PqGb"#=L8{+}% _53elmK&m䅨t)$ev&l*%lIZVfFYmK*(BG*$=dѪLjY%ip (3e;u=2Bݚp4TPI(M..E Q$NH9H?(m"ږ0Wv)T$b)DZ%J 1WI3=Rmc 앆5=t[BDw޾*Q&Qh1E~ܫ̴ۈ#(# Fت4eJP6D6 ڀO9sFޠ (ja pr=qsȏ$L8vY;u>ɏv nlcҩ[(MT"a[ z.p7B}=tםn2TK(2TH#%D$'[ ŷmӛW̋7KRz=\V߷(o_̶f\-V,UcnFIF983tʅgQZyYaIKHŪO$MiM%mx\̫{ ;oViI;o_*:VzSjbZa6 ) #>zkӑI(2-(m $p02I?Rc481_I[i;PI8s3nҮ$O1M>)Ok5ت^sv$]JIa XB|3Iz]MԤ:VALjQ%>ΥOd19֋>B~)Q@srbyw˷*nRޣg)S+)'dp#?VfSTLq.5rcsVOޤeeI="zju'qZҴeԋδRB$l};fkz)m7tsoefI +* RF0 =2u9M yc @u/+١[VP_~F]nJPP'AygωnկOEiQR<$HpHAl1>*TjA׹,["ل2PR+6q[` ūBTNG";~kj<ԣ*uԶ 8"]bna }U +XJyYJRNqwBUk+BLw~_Fq2&y*e2,!`y|8CYsN59( Gi`^%o"jh _ɯ7Vk-qGkO[/RR-HTtvMDrBϓ E' FtS{?*TuPPn0Jx F#=:r;.E M0[KMp1Fչ<~4 %"0:U޷-Xg~&BG}SV/Z2\|8T] Q8H8$c;cC}BUiʡ\s?FO'~~2ϵ&roI:S2JǨ!FbO|WvGߏ7%'M"Q6Ԡ[|ޱ%dc$r#<7и(6xIOQME;cQ EЄ^VZvNb 4U;uקĊ$ 8?)yVV˨Ch s􌉽vuG j'l2+;קZJDq*OIc_a9+{esSniwkRe׈S9O˜~l##ovX[j*=A0jDfI,mMH%n8o;ݡ s'2n4FCvM{垘J²RO)9@o-4˸}ٶ[JY'0ڴ2]Z/ڹ Hi6JnM[l-ˠ(mZTS v s ds/g'ulP̼Jh NGop@rF>-5cl6Nܤm?*pvEw᫤( z>zcrOkRi~&Û1?X߲O2IH'26vZ\L!H2>J\[r!C 9cDg!R!JB*Np?8=WlJ5d욥KR2AݍǯBR; r 5/dE=i"G"DH S1#JK9x3r2+R r`䃵HHޣђ<@(q. -6F1(|J2OV28@TUɝ8q &()\5 /O)NӔԳ1-E3L@ }N&@$bDVRJTBzT"# #EGhFޥooT폓,KaǝTq4T8Lj']ͫKSB@?j޲p;AMR1A+kMJߌ$.V~yWVZS<܌1O]2?eH75W2U$r ߸EzLwoܠ4a<yT{v ?!!B{wOQqOjyƛJ@R81sY3S.ao0VNv=)PO]~ZL_mNњ[ dS'; MP'd?GK8oߞ=V| <򪶭nBݜ57MA8<סN\ʚq(#Q؈Gßo(^Jɵ)օ9睗ɷ,ˏV! 3NXbmwj ڪPm4N6$_#x|*)RTY=iJa=foJ~,;λZ҆j4%QǠ۞cfs4j\((S'1irS~w&{>O$ c/X0xy?lBV*\ps5$o*w>ھ4d*MtD2Bp# ;#[۱hYe!(HBIՠ$1sS^m2yc+.g[f$Ӝ\ĢKm6 FNҠAx )HzJռ[8S԰H1D:=bkukݫ"d&R¤jm$%R *Jܕ{8Dq::;:D)OͺZ; VN*<)>m`qJ2~q1_ƛmP%J9*)g8ݡw!R!JB)B0=RssB!R}Iש]2ʡH@%õ{$*@]<gTm9[Ϛq|Te^z]mv)PGTk'!-49SN#)܎AJITv;Zk; 3(}TSK[$c)u7  I<kEdYW)ze!Ƞ^S/4Е$nr6p0O:K}V)bj̍MK>F 8 Ll$rOseNֹ&e<%MI*cmUqr; Kx7/Y v3iX[2^VV685OxĨ* mh)* x?YVS7K=:JZ^5xb `YwշZ'"\:[R5$ da@F cHSuBABܔ\RT*IakqcoA-Ud V7+v hBA sb՞ޢT&[/ͧʅ[TG#u^u9+OK6ʋҲ@x89uㆋk<=ŸL*RGsufEa{~O-(AZ1_]Kծ g ?4 zw*һWBzi)JLnmޖtŠbjy>kRxp~ DDz'k0pG %.8dչDn}ښilC}Fsm!GP3qagznJw@>F: Rx4Jhsa$@i%''|P{ysNrvnaƔd_PBr3Ha#3}QjD}YyT'6@PKu-%Djr^iN:Wo2g w^Irb-m;[ Ftޘ!;B!JB)B!R!JB)B!R?6B*: `rvEh[#h,K'iKcn%KT[Oi'UB@\hDZB!R!JB)B!R!JB)B!R!JB)B!RjsH9LӲd-  G">eHr.|0W9I3=On>=7 %0 Bt62A?C>5Ag#kmBp&Ӵړ(D.m*m**ȉ:SR&hʹ䨯IZGޥIF-VI9STؔk#!98$w|ݫ8~?Lڧ5o%_ՊRN}Nmy@e(R2@byVn->Xu;I-S mOpQr蚤եZq9C%@ FIȏ1=-ftn36 mLԢHHGKx&)1VJDp9Zˋg&gWr!OaR! R)HB!B! R)HB!B! R)HB!B! R)HB!B! R)Th! i;B\S03CU#┄!iHB!B! R)HB!B! Wmayavi-4.5.0/docs/source/mayavi/generated_images/enthought_mayavi_mlab_quiver3d_2d_data.jpg0000644000076500000240000013122612747716313032703 0ustar prabhustaff00000000000000JFIFHHC     C  "  ?! "#1AQ2$3 Baq4R%&5CD<!1AQ"aq2#BRbr3S ?M4M4M4M4M4M4M4M4M4M4M4n8?θ$Nus?lyd**!i2{,wp[2_("sʪ"*Ƶt\|/:S؍Ϋq:k}AwTj}bΟnB*88"jb& +N}hC7Q7E;JTT@I'ib"mmVg.ь>i q^*+Wj8*6+(1ۍ‚D^df6ё Ҷ מ8"EY~SUU)Ԣǂ7\馚xiiiiiiiiiiiiiiiiiiiQ9D\'|'|lZ4Gs뭬Ҿ&I<v4U#Q@QE$R\ҫY$I^y$;&'-{yX:aM:$:J,2&pj-*n~wMM޻ # W)z2! W[W핷}%&/7g|ǹxc,xڪQ\@QBNf^B_|\uǣɳ B|/>ª5odtE~iE^I&"+(.! bgêcԜ䅾$oGbɈđ<[q\lr_EhQG*V]3{5`ر#}e%w,gm*9ǪīfgQbliQdUTWW!TTEBEDTTOO?N1P݉=v1-G$uDET^/E(2gM9l ULe8qUQ@U@W_gZ沐yڍ6q݊+4gz' \WQW<"rO֊~!M54M4M4M4M4M4M4M4M4M4M4M4M4M4M4Mp_NU>SSU-EZa^lܚkH-Xŀn3YS$}m#W0E*TԯPS%JsuL>ͪ%D)1m&:s˂ʗu_' 𺦞TYm'~(,[u JCmBoƐ̧x\mQֽȃ;Y1 `$ Y9#2k 豦'չ1J:O0hJ*NH1:[;B7GgY3텬Yn@sЦf@PHFGPܮrW|+ t6˷ 7 ?`0ȴ>4a̚b~IZG  jg^UI{f1SZoW}@ъ:ˢ'Z?dJ$%81޵~$6@lU1 <*bNr:8Y4GaOmPQt(e`&onT9DXL6L<1pM@E@N.v#!d0[߷Ki1rd3eg]oW=@-ߌ%A Hک2n4\۪ȨB+ /Rq6=ZW6X@Kyl,Hͪ"퐪AMw4}5{>88Fx^W9n#0vTp))ۑR*oWfbN z_W~xɮؕVڇ ȟϹS-\UuAEϗ\D灙Jcgyn=0+ gq *$/!><"&;ں'sGqڇ*+G;iQe_*"fHTi $ "6w.`rNRFMןdeUA%ÏJ")P˲$\xȳd:6wvQQm{GmRBp!$CZVeJk{q\վ{ )2AqmGUSp"6tWqSs'_z(F^n˹2A*c?*TEu? PI:* ZX̻6J$ oܚ# 'ʨfë4o)q7U?YGa/ݾv+dnǣq[zZŨf~v=HwU H<`]G- 49 㢩2kXӾf?"qa7B_L 6u=ԥoL~:((ط d栎c)lg=9lyY yҁMׂkfg .)y웣dR1uξKȜ.qy01yYN?ՍLY8`Fn2m'$ńތIɴ gPFgq녴R<{i'!J.uk/h!(QU&Qfys|UyDfg#Y݌M 'n} - ]fxf;v 8ClHNCpT2 "bl)`LYS })\}yi=(I,+;:urԏ-uazĭk/[r)ɦی s %b%TNMW W&6v,s.e55n1|U|_k!!P,fs ΣcVւ ӌ^CE aHSC#Axvms;/J5ߒTwPUIqo-XD9A%>?G),IKr))!~MbM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4D\|**MqDMAIm!0eUgԦ>qaEuJBDBkI$R`|JsNk/_ՏF|}B%!OJJyMjBB|>aճ !%Οyc8ilg&v"f_WcY"z9T'HIR;#v<]39JɲɹNIr+1d%Wmᠺ hy|Ѿ]&D@s:>kCt+ҏ >Xkxp 9ȱH\kdlNrDI `hr6o8c s(ȭ3] N?:X'"tc?p#  ߍ2 Ơf,^FpX*BMvL"UvB򢜇#%W3kOQm}MpLaZ8U?&6Gop[?Z7쩹@$:;^;93R[aoI4z±[ϟ&G[x)#,N +ɀ3qMzkM.-g)tW86m\@|T#qW`c/r 2NV}|n+8M*hh1͖mn!*&f"`>I6sRV]n56"K݌˰rܬEn\kѨ hx` &Ýg3m)Fkr21Yc^wEϽ~+"2@b-X-SmkO}El t9MSj:4ыɓWPLǪv1yx䔹4s1#זJ6 H4ܖRCլ(hm2WrIC%@{KF tH%,ւ&Ev$WQiޜPp9u9qd2yEfI,G5g%:mWELLsmQ#%vՇxR6.IN4=볠z/vVֱJ1 w $;)/H}c !܍ݬcgmm[4أs2\μ),X\&?64FY@qaמi2kézX99.m?y5*Ο[Vni{U3CyM߈0 u~d>T1 jnzv.]dv S Vm!Z9&: ۀwL 1wmf.,ݕa=&1hX&2 'wyK<Vq<`tN&Sy/ҼǧW5H-fiA7v,ov7=p<E 23eAm+2swsJcH5ɿfA o-(ʜEWA.iƢ6@2> B#cu;u?m9oll^T #B|f\KyKbnq]]3dU9#Dr)}#B\ zl7SiY%]D5V7-:Zjn0MX"gtw3MVڝuo_+K?(Mb*HZ$EԤu@6D<̉+.U탹m18Ve\8ħDP))%򿒗;!Z- )l 1qDPAO㏏Q%KohOɗ%Lq@]UW #FHF*k X-"% 7[jMHjI dHװS^LlN0n+jɭ#mߒ :},nv?k7LkUB:֫Iou|\"SGrv+v%/$"2DTBֆUsIG9)4Ej%Vvse !. ŰQ!$E!0 #E^%;5w`y<K¶P˨$\BBV޵ yg䲙Ym4Z4M4M4M4M4M4M4Mq^tUTO][{J:ى+&2@mEUW9'ӯ;`i1 &4=qn E!H`DdB$]LFjezKm*k`) Jf8{guc\C) ކ_wuvmHQF8$ Ip#:`2-v]aeyPrSvt81.A3!cI %iAeBlomx% :`AĈDum>Q^d>a^br juIǦ +Y7N_cǘlLAaV4h8Ӽ,Ve۬"=Vǫa,p,z ]\HK xq^dN=)VP⍵֓-ma1PS}H2ln|3-Wq_"Ȇa>d '4WqC^}v_ayeyIgﺦ/V* L2 ՙG?tR3Yֲ#I nLMi&j l f] 2^ͧNlF'fg{l_Ⲟ$#uHV8KZ>alw c2|ab{mS&jWbÎ֞ (P8:p\!prEf>55 S]5Ns0PtQD2lpOu阫PNꪡMOW `!Ihp#6 ~$U2EUET9Y0zl&3bКp_f("6_92T7W}р3&'6$m<-*n{pcμHd ,r^JSVpO͠=hn]laŷB?^I\w^?:F N;.[\Q-8`"(ᒉiؔ%gv]  \'dv<',\802,h0d6'9טV۸V{%r(HN#InGH삸`Bە^9On.dS-_pNTgdb+r>Np^[zl#<‘ᲽZ [eѪxs9HbB,6 @ߚDnyGW{q^SDZиMϯaŎ㨌nM^w&|ŏL rmAGz;s2ݧPA7$WU_GmaW|V` Iph&q1VZlXpxEB!qKA5ͣ WtL1Róy~Uy ǟ5VcKpZt*x4 (A%qTϏ%L8o.aWqF;b"a_`@Gӻ/qBi=/?#TQ\On^QȔι%`HUs^+(E˅5)O{mu|[opvVp#uθ*؃dBB]_ GD8Q7X:ݘ-8y(Nqf(o.RmR&+:0ʁU+J;%mwX,okr:o|J۩C{q1 zp'qa6smbz9Emg%0٤Pn0"SY ۽|uʶWMc&šI19M%DR']2 l /mUOP]ŝDop;̬E]1*&axa9.1}9%- h,#B] DM?ssfża__GYi_t Q[e=`μm[|^YMq0M*:/Qq7QO Г ![{gosv,Hg~%tT bc9ղI&DyuX|TʍݼRcl?"7V|F[U] )|e?1O^Og|w_Xǰ=÷.Fd ݈L GeiuF˯QK4OܝLoQ%|U>;vB j?߯C'a&U[MVa|1+O6"-Hؠ*vng}C 'H˟m+\> 졬?g{3aLjC o#a &82f_䗧`c_n FgY` arNd,$VIk\{~>V5@GRr^&CJVUJ-'G\yU5ϼ&_n m1[ں&]EXH/+M%q.#hRiAHi[XWuϪiǃЮ]&dKd*pTUhSFֆ39t5}3 HSʔ !ɑ- {yRw`#ײT?>2 ٹ]^2/LXYY<-(zEIq&(^;ݾ~Y9Sݫ H )80*?:L;20| u D4mfCh6(7%K90V;pd|_HI[OĐOWKwfgJb;bD61G*!()3fo(yڍ.vbƉu@HqZl Eh#b^ 9N6ULvFDxZ~;!GqS. 8_Y]Ql[}.;O-GFY&ιG;T5Ee-1N"CB*!.&K'n eڻBח@QYiyO "e5Qbl+HW*J' qE } 5@dhH {Zp!z{FC QD*/dMU8 OMFρlaGw D_vEc+*v˴Ǫ'=d0M?Q>Qgq҂&Sij^aH@`jIai[(ښu+,*Q.:jmؼ6_raj@Ǝ{|:|, r7&0fq]xaU%|I#C u[9 }=Q>9E8)Ƹ ;:*> :iSM4M4M4 '? GG.h9^ƩwU>Um\2+\';S zWRapp AF-ȴ)PlrVMc`+OSq;|G߀~6SW8fdxVX= a&,8JۢmzHTD;woϕeۇ] 6O fiaٳJrs%FEtIdF ,rEl|L$e1. 0p*_Z;8<^p5; mz>?P'e~Uer'=i݋ayD\#m˪!)7u^Ä/[(MR㲨*"<ْV^IV۴oGiieQ' Dހte:q.,ӷWɸ&Rզ^^_uy2Nz +[:Zmݰ-7!t2PÏ]QXTd{ Ȉ9TAf)UڛlNCalŧvLVuF8beZ6Hȡ:Kf?]%@Y Kf54J ¸ۅ*NkAڿ* >+ 3IIx{-tR%CCq{ kN>[X7dMS"2fӤbKR^A8V,9؅[ɠm+lQ(T{&ehw;Hӑ% !v-@%  P8QJjLmeWaV%9q"0/,X"9)U2OTRDTy!T9x.!QVƍj6q71ײ+:`m "m6* 6%exɇ3Se,~nj{(ȼE./]TM<646aẄP`EF^H*" "CX=%ɜ7PȸmvtU5Fѧ\uMHWW{)~Tr$HHҺ5@G]^Di *U ꉘ5:)A5@XD6Ƚґ)ԻgXutnˌ0%6I8l B+g۩)]~;6p$Ӑȓe"L0QNUy{<}o p&@$A.-4TR("r\'β408TƑ!RvQtճ$WirqN}0 SONe*J#, HOeQyɲ[qPMOTEG9t,l1[/"7z*4 t8+ܺ"AUQYiovRnla15PBEu %GX6[qE@O`m;l*T~ɧ<0NH:H68iALvM_\UD^ ʪ"" ~WMPKTGzsB&۝~j QUT^I8D'.C-l6W~EXlƞ[/(k u^Vac>Kú;Wd[Y)ei]j+X,iM3~Yp8E'[ZYuJmWJŇ>ԖdBب*Dhzwf"y`lg{SRת _8 ڐpZl 3mA$F7?90],u"_=r_I1_[A2I~TK|x.hq@cs%*#U<,p n]Wvpf-[:L'9)=υ/C؄$)sxprc 7^t_VMqtEAq"q;ӱ}j{0:T # ,לmАД\D䠦6ml[(Jrt2C 17:{D#$KӲ "ε= 'XW]hʌ ÈƊH]%Yqkݝ$CApDl[z3˺a"S(B::ڙ8$4$ n;H$c )'R x*p\DDO%md"읚&;Qeת<#-V[Whh`!`+V+'dGY#rwaT.M0˪,+"8ؑhg@2LD'`fKX)`6te#n4'0EQi<.m ̻-_"D~ڗQ^xEu)mħTxdKzW$յp} RD"` Q9X\ͧq@4pQ,s>P2J1We |7yca6R{6m I ,ne5Ԑ'#Q'!߭lEzpQW ͳ1W鳹Ud8{eױ1EIuTCSmcAUsWS!juuP%WeqYVe[};~35/n!LFmmmE?ե8F54.I;F|M: ڨ'~!Ŭ64"-VkgWOART)*{`gˡ 7f6Tyl # {^PySPo?V2>+1$JtMW/V6+Ʊ9$e(cW72X4R/s_~淚yߊY9c\qnC6 "4˄@~T"ndט>_a HC:% [~^%WzN4]3Omcmb33qg2%j!(ᥱtqmUψ7vnӆ[6 mMv?0{_Kx7cbU*ְOHGOlTABZP^Xy~L6g\K1N[QAuG\jW>^_wR28XGοra[X2(7 ]a*|Xr̖LZc-Ye "7i"WgBiZi]=+c*o{3ٽާ>ds\38W6N;' h.+o8@D"#f75oaw;bmܨҬבw$ɏ%ivBƌt"2~۩ʶ>(؍Wc`ʼ2m&2%.͵I۔:bYFCr7lrBQso1iK1BKoiQk黵3?0fҼ{ǘg?kŴ8$2 C9ƸX#m!dzeEu"乎fllUB'u)>mF+`wEWТ*ջE1sƨz`ĥȣ<ꪪ ]UGNQܓUQxkG.?2'Z$>_@#Dʒ|J?Z;Z)cG,Ǭg^Tagm N suAϷ'm"18%i1~N;Dq0dQ%Z4j1mb/d5YX qYNjm&0[Tl 2ĥ:! .g ܞ1 ɼN0ΡƦmJ5rkX{R;5^QZacq4hxU^i{?H6WyǴt&QDzDK?'\zf^<癭ԇnqb7&{LT 4^QH"k}5<0*).>^,yvmDLU9UR^>HU-bָA'r=w-Ë="U"sx[Zğ4_0IlmaiYQA ,t_av;1/[Kɭ̳掷&?V6=\60]ɨ"$QE/2y9ů9L7"'ܺp6"9l#z<ǭ0v75cnfrJa cÍN?y 4D7U:f tKF׈"bev׼p+q,-DrM3Bp+\psUMüo1gu'o.ʶEUB#DikJNļr1~3Kk>m('J-LƜo1?&=]9j ΋W/SlTMMs'`1<uoY?y%UoxJ=ƿXi~a),(*HQ&AP]q6 vxQX'돱#I<(",2 '="bb SU >/? s[:q "'XU<2jE ?b3`xDYsaQ/0NzL4x]Tt-li/cIp]|LM l3 Ho۽?/MHf؅㠪v~VO&0(q(6}L j+tLT,kͰlޫ8jrFc-$o/ww,br/o :4^_|GZqumCW]5Zǿ$2<~P?PjJ)1_oJb"TШ{P @#![+&jfN꠿v#4[=wfSN|RldY4vlWuDAblZ2eUǸl&c r]G}oW$y:~d?N"m_|ɱKF1km*:"-!591mu lTX3㇔yd9>xaY)qf*S:2ĉP_hVY@N7zZ~}Û$xaJm6sp.0ð݅E}bMbТEdUFG.NwD_A(ߋco^8up +W.,}1Z$ l-tl׎zj{EE:@0zc=q:ª4[f8-io+Q2g9i5Cd2şQ)2*ұB8,neGNRR52>%yQqs" 6M:\ISfW[idSŌ"8^眯AF*ڌ鶠Dd[B(׭﹋.%gSVeJaD%\6#;pmUjykw$odo LH8ng٭^16ky__Ҋ^vFzi3aiCJ۷6$j&>Yyc~x>\ALq1mz-suʿ']ion8bH~ ְj% CvqF@R9V.4n+OxYD!G"CqŖVBAm iOpHݖZuA9: eAIVss o bpq{صm+OnGi P5!tWɧw*COq'9ٮ5"m&X[ $Fum@G=~uaGΪM<]Crhf{#>–F]IqcVTFR!ڬrTzq.8͓ڼt;: V@2iÜUγ5ipxT'lqBh#p>[ij#AZYWyVO6vLMWO6VNM`q\G vv&l5Ѩڼ% cBe<`:/6~uE6˞yAPC?4]oVX,l뙝'GFZp߂n2;ȬtN!*(YcѳcGaV$o5^ exiQEyiD`8NcP֑sGPUu;+֏ݶl3U灷G5$z(nr=E5Z'/=^qetzLI:oBOTUQ f/<**ݨ/-nV%~oύm0 YW\ !$m |½܎W/QȨioB>͇ pRCDQ5T%{@8&M61Nߤ 88TΟ}5n6y`?(%VFv%9X'y$qdwk\"'=uV(#+y㗘ۏESY~y΍?}lkc`k`ȪuUpg*)w_c鿪l왵-ɒ<ЉzJ]NFضKCwǽ-VlY&ĈtT^`'*haX;Mn-$34xUF/HBHmu@TT}M:y~ėG%ؙ{۱Rm[iLOMvP0 =C>ЀTEQQ5^IY*v#‡a-ua!Ћr( I*ku:u)iCm#+?_;7dGLR+\G*ª+]5Cq0eGT84=bV}>vD=Ov_/*I:շ7f(3w\Xnenc\-t[(ie"8m~ʓTevQ՗*. Jj"*(*ƪ8[Mc]'U"Ţmǹ/r)u"d+>F;O9yEV#fuL*^JsqKvE5 Xr>fvA:!f-DA[_Ŵw+aZ]QKpiձN*~^6pm}vws<_e:yX7XZų'q5h/yG+Fw5 Y 5[R$&:ԩ-Dشv$' v Mf:G{ E=O% rNN=:aE~ڍQݱ[͜H5!y%(/q1l>}w;{'l|pdV&DUF#>G>H3>8nxgCuV{kco8͋ }})"ꬷ>G{/̞f+[;Vba,=d9,?`p[LX Hp`"P-fmL!܋.LZ SC $ZgcnE7&\Qm[**L:@335G`{츤~]w',x 2x}d[$476xݼ 8R}\q]%hk6k~\%D=rYd\-)Kp9ʰ]?tn'ϰ @s&,&N.jAvh}l9B)45hlHDC㴀SNt\+=vgl`fmb4bW͵y}ӣlQC$P#\'4|sb`ՏxFgԜL4y [=c)ٳ.Q>~?|ꊥjQ9?ufp<nnWeaDm'b}ZDoMD E^Hd˻{mr@~V@u(MC^u%Ctt:7mV~[?qtB﵃OTWV;rHەﰤ$j4Y'tt+Um-ML',ZNA8ݭ^HÒ?QdFql:N;eiىV9ocnz1nY* r܆^G]a$+U~i3L6ÍO8FD"hؿq s }Dg7?HCFnq@bd К_[S$3~V zÁ35k{-<}1O'cm[$RAre}_@~]E:RD%>ܞ"AH]#Rh[3v=UW.&^?:#i[duN-IbՖqQ5[&#`<"FnGV.yOq1=񧰆aФݍa)H$$QUx'a4cxn3:*10|+S5>=@tNO0=7"'6oX3<'ovoiEʹJ*d{$յɮwpН0W ;*"h?Ɯ'\#SQiM8O"lRCxDRZmT P£J*%b]U 'V5 m1H+f"vV˪qƫG_N'X&1Jb', Dh tBiDӲ<-zcT7ϨXe}<)s_tu:c9%{\%B4%@QlDE%"MlvKywaC% aB~4@ۯ&o})+͟EU{lYYHպPi818nrظ!+6cf>f{]C`zD pIjܦd 3THCU]⻬HHncR6lhL5Y]ķ{qmj!9"5S1dm$x՗T=TTϩ{Vyձ؋?G,WlK*{~'^{r&8?fzfJqlCbmK-M,,qfpzNfO EUp?cLěE. B"6<>ӱTzs}IoMS1{µh6>33<5D&c;W4hZqu~]gW-fb]iWKb'䶯E'Hj(ʝŭ'PPi0}1# 'r#X)-PfC|p'śh>vFD3d{dz Fdm2U)wq 1&zޱfm0Q*tAp敏rcqko]e'Mʢy_{g5eGeE.DS'YGk*wUt>nOwuݭh~)Yb 8*/ H(3}pa76yJff,OŊ0FR;&;'oYUH~0gSugxJm>g}ʶz%hvWWL3glŬH5!:"oЏk8v-w69&)EVh$hO B 7VCYm[~7j XL;g ?%0sB+R7ۚփL۸U _Nx[̞C+tUP MZ05)$Ѧ!Br؉XRquCʬ)sGf^f_daoQB%?\׶aYGXa=".%ħKN!!]4I9eQvR i.q5yuҪHi'%1÷:΁_k6[%%p^m*f /P*xXPmYX[ %fX}'-b1- 7IS㮼d!9Pf $ pt1-<6qѭ˩%f}MC` eۼO+KM/I섨@ b2&WX?$"=@չ~4x<ۇ+1 y Zt>/aFSimbt@lf[$!lcV'$eGe;{[ NCpRʸf[{k_vȬ_|\n>;ETrm2*=^ñ9t98n^|/Z`@+ D]JMQɯDmS@.'ķ:_ -|bc%TjiXnjjV̝ҹW_6:|DF[#?pHH--Tl |,-ƳoܒŖ]@n5==,ws>H^}:&w*h݉ϔ6R)#*IL1?SHN***(Mεu-jc: 4*ᚙ'ȉWU%U]}xAx&L1<ɍE[:iu4M4M4M5QOk4E Fy%E][a_>zLqqS*n6m:ړNn~@w> ٭_Un5Jb1 R &FGY>I<s?!MZ3uÎg;,5P=x~>د8̛"7^I+*mZmqOu/ b #*]INup&.+i&^Mn~G[l++ CRShͿ\.czJC8Gk:vG캸Y1Nh=$ET2(()~]^10#-D[AQy* E̩d\Um`S&$6$h *'Gm@Ͷ9d);fu .{f#o E3ERM>9ccKxFn#$D+"/I)#m5szY!nⒸFJ/^]UU.Cuv=pZsO/AxWnQ?`p,1:ڢ2m(B"kwѼo{JHpu%v<4W]zKd =Q,JIemˎAxNW^?F;Gg&y`ԃX=UUeDD5uf)^R~;c6@0m1rij㮯`C!A'T3i '$oE| $IiI2ψ+G/o@Y2~UQ"ỏwyb !F>EITFĔI;/ED%|V̉\6 fÄWsٖj-nj;,UBB{~WuE-=:p#hsޝfI=UcZUaSQ '+}Džd6$=GUE y ,)v+jV3R1"\7Ŷ`NzB8E7I>OT7w8Q[o#]}K&,a*? 9ۿ$=i{ܮ7)Z7b %#t2j62E2'ʷP[wH$g鞋ʶ +a6X~YebP/aTe|k!lV*Dr"CF TA] 9[`T;, 'a}r3 d.u$QjN"VlC8$ܝLo}O4̗}dMBKx2Y^%2 :?t蚪+$4̷1$lkF Y+I5mH|j/=0`'p4&-!q߿i]-=&2#"Ye&T ^U Cg6nAޯh6KHVLKo(QR#*|\h9U+=l?k0ُ`⹆/Q+"IcaYuZ7csiEAΕ5U^j}K]Z=t)jM4 ._~p` il]aU\"er(x=D_5kwϰLvHÍ+ [l.͋@+TN;w '{HN!}oFB\3;=ū̽rmcm{5sdƗv8o*`hMDq _BiÉӪŊ!*1 H\e?[N8>=6JV*3k?EO"'GKx~CH}U/S~y- sklikhh 7r6n#zOU]';C&^ֶHa?8÷pJK)# @5X)_Ux_2iXV(GB U2k1\j,JɑnIgEs̺gpZF2fEE Y̳aV[YmL&C2<),bRm|KY{ѰQǶn(f-Eaa2KFWT 5q[/u?a)Zv.0=|}U.'+){T{ͼ cavUJ!&z ]ρtBmr vRܭi.qaWTS>r}_P3Ԋ-( n_.dFKhܚ1y[}fdLL>a[L?-Yl֥)f ~^X6J][g^dZ;Ǟю> #i[VI[buwytpx0u[r#4?r$T3yUA Mg!v0{ChYoaWwI8m֜;#J` uV#iz ݍé۝l ,@fiKl]&D) 8Bו^=YlC #lBl Wmقok"-zTqwPw`A?8ReNWx3$mwGo6&(qr*]kh-GȲ 4)'hꛖe06sV}L_ 1mm衘ۖf6-dϨMî#NBM*?^ʹZ OUF/(` ۛF>j; c.yƐ b ƞQ&vď|"ؾ>UyD+ V*ҼЙtQTSEO Bg 5ԎIOtI~۶.sUȾ_hh" c|mjk2jrGB $d HQQQSc2prȚu#A?˔RTEJ"ܿ*Ws,%v!_aZSO)ª*/mzxo,i[qsod ))4(V{@n Y*mpy*A% U蚯y'mA`Z1[X 2۝@:8HB oӠ^GE[* \pUQh6jHۓYiOJvͪeX6<ےJۓ\ Ln9mAu }ͥz $F3`ya`庈%F̼?x%"9Wl[ۙ L&hHuE]u_mߩX- =F8E*AF[DCYkN>;FcQb/e*LbDv,s=ANhM"D5lHP4P! +E.c}*'m?\r$ZJDj,E& n/&rƟvdYGqך䩌;kmM +riȍ$&֖\N.~v1։sQ'R+Y] [:du[BJj "w[Bh3$ˇ gn1hш8| *bӨ~yD^bŇ5fƻo*P C+Q@.PVK b#mBA^Эfʟ8tZNSA{d%-3gfliUb_q3,FQ[)~3(ZSnZ2=bF #h"_{ܓjo&]I^Et)P_+TR,Ca@ҊD[{ɼX!n )A_kqچ]V KmmǍ"jUfO" u2  J3+ }o2V%0QPH:\R!^K*2B\j u(UE1.z^ƨ +_DPD5-Yj*NyV򍼹KfMmq$iRCD.WQ;Lo-fV2aY̔G*4F*P5 }. [׻OgÜ{ўx+pؐ3ی"|܉϶l%dQޯhTCpTPZ+E`-f5}Gq#5[7UVcQCoԊfŤRB^}Mv'vh99 [-,?49QP*j\;qk%64FݍtT v#í'E=B):uJ8f v6"Rx<5cXn!5pu\Fi>3}Cz$ۨ1}29V$4%HF! 2.lTk[}异ANS啱Je'[%O;W6`Yo!qMK&)z3z4ے }q DBomXTSv=7uݜO,ױ&p=zr*:?M[C%SYMϝA6_PŬ{\`}ƮKn+JiU%Q'E;6,_n҇~cy1dPG7oٺ)W7%CU 3@hvڎk|]1Qȹ9$qHWoETDhQBU'{sTral&8n tV\82o+YFeZ" ɐ pQޠ#^0-YHd8|r6x&þ97ԡu\TjʈSq#mgDEu 2Hl=Y7sd9F9ܸSjd%UKL6.RtG=䬪,R._4|xˬDG͔Ulʮobփ7:<9 =#4L+ *Mg8_1ʸp2G@Lr1wS o7k)q$^fA31 'AוZ4֬cjp9T)8bМRt"51>8^HNvup]0nfʛ}гb^K<! PI tHae;)~lnj*lNª7cg3>"OiF;-$2ܜ'X굆h- [l*rS>sG^KWyܛnE8,0D7Cݎ8]cmi[Ɲ ۯu45!Y2a9O>&8eRM.GgԊܽ=1g';Ū+yI~#3YWX&7 N Sb"= HmeyUiϽEG>Y=Uk[l6J{eA u2~\1{mdY.j/ofn4NWdXÁ '"ԌGڵH v}eH-VŴigr ˻3XSOg|Γy-xXQuŘdltDfYnW^Cn7=l&,\"䞏$BL9bҘԜFzvTi8ͤX+ 3id+ĉ./ ߭=qD Ulٽw7ks.m7Y[^1A2eu_>YMikѳQu>X=f uA8#:ruMeۛPXWFN4δT5h`(+$)&!4;`pAV(0wZ~vul {N+ţQ"(Hσ H[vke.f4Vh~Z+'HΪJiYl[mlx}BNGwxk?>e9-vR5&q8ȸ&j* ںai4Ә>|׭{><÷ vb2 jeӫċnFHQ WR싯Uo6[)JU{W*]i3YqUEBsu$QU^S{;9dz~ uDƄ\ 7"8M()aBD$BBG[iaFG/52ŠYuLV}VE5ȑOg^ߑ궥*uG=֬UO{N cܲ0x!602B^)^@D)])b' ֛mwE8'> yNSXJ{&oY6/$ *矏xbS^McH]qU2"I~'(ZWUbqsUR&6{lȜy,KP\ǩG?PK p6e`׷jBwi;x˧KC'o懑6C_..0Sezg5- `8PPS6Z8?}yUS]#uD}bFZmH}XSV!l8S5؍ĴWvksu˷/{N`,}R(NF~5n$ *VoSjc]DE슊|̟P=ܝWcIs©aލCSсGzɝM7(αMkRj֮$?~ yqzªVO:_xNZ˺loc#/3̀aw}Hf^Ot2uTgჵ D)E֔lUM # t-?i>Cr4kFKȬz)oz:jNwv{m7oȏQ/Ymlr0 Ҩs#aq+@8^PS.K|}g-r-ȨhnfK:~ԇ&Ɲ}TP0=EmTvsΙ-.N^N4o"3e7?R kԶaf0maڹ示o2F0%zU΄mmvdmҿjav#%[/#"ˣfӇe%0}~VA%Ze%z<Ӫ}brDfmTBU@C̭ =z_96BHЈgh.{D{{wVq:H~;1лlF56p}i{|ɏl[<&=&+_pŹf"";s¶:rOjweըTء,s4N(dW"rۚ/N/&v\n^cdX\F#=W%qD&QW8j\.i̜ɼ4Y='bŔ}gAZrDgEe{rEW5wG rkkrFº'LX$}=47UӉ LXT&aY"%\EuG=2`hѯ"+mElwt^o}.bq1˶v1~_u9|}(5лamyf$'s.q 7w:Di1vSmn@Bmf"Cf'k;w?&dT5.}`ND]zEEegQ7䏈n`cdYUضCc /֝emKhWHKz$F"6-9Lj00{}Xl׏q(6qRs!b'n}d<)Sȭvm|ܬ+2ȫ]|hդ)K:Ӯ䈄n8ū ]{1|y`BmYn׬x᪼}WA.nj/v7nΗ'ߺLq|DiYI!vh^yV$!v/)Vj۸4ƠLGIR :%yUGw;fd3>b;}#wn4|N;!*N#3EL@삄l6\LM=FbwĎg|yOv ̽$๹?YePSs9E , ^dtIA6;"퍄S(Hxױ{+O*8_wi?/sʯȽs<SV`fc4gymT5NQƣ7so/Y7kZwXCiN.wl UI5ݦz#8P6d.Ϯ*|Ek$ݹV;"dy4fΡT+3,ly7F)d/WM~Ȯx̹gʸsaOl)^SÑ]nȇ)z8tQۋ``M8Vƿv-oh$TWW^$5TI<|8O 4QM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4DM4Dӄi/pQLˍڽ+7q̥+/ԓ AG6u!qE ()8/6W65ut~&ycwӚvFo YbۑylfIVۓWH/o"&8Hv"qZG~Q5Ø)Rc\Hni,")9 /!+}ezVF3Oh&W H&2:rU[O}cZ˄;~RU[M O" UY Esޒ6 5vU5EP6Fh|[Ǥ?Q~xz?w? [[ trl~ \!bKyJ6˃"uL<֟R{zJ5ʮ3bLjc$E1&IZF%!x99A]8.3s~K+?Ty/?ME4qGh9nsMlx'ұ J} -!ڂ }utɚLٗk+M/FmyY/Jb7r$KߚSu^ߓ뒦$G5cUv-_YP"l2D#%y8`gұq};r}e;֠Ə-(荃}uPVnԒ8Y'l{1F@ >nM,1)Q?Tw uq(Hp:g$Snbavږ٪CE "3**B9cwl(p\%ΙsQN]u6SlsUQԤRq claF@Ԭ1''_Z3ihfA澇4\4M4M4M4M4M4M4M4M4M4M4M4M4M4Bp2t&,,޴^3ȝ>$;zUF<#2ko"Ő Y }0 _]շ;ۻ$۶eu ~f]YKw( G=goJx/Y hOO3Kv(̞:c*,kzyHgl!q'u(VoVZkZgbn)G @k^3i0>ZK7U1֒yxSXbH`d4vP2dA\_^ӝQShY#,$U/PL>W[.Q4kce$UWH*hO+0*K'V,r$S|`kV/A:϶(mHՉM-JONB1brU@kƳz{..ՎiY!pwf'8iV$1Cye@I$wXK4qF]QSa'J6t[ קCDC kJ6$)=]9~M&ArOyf-Տ[CvƏCE)$* &<;y(; ^ƫBcԯgB:45"~^1, Sex"]wzSiZ,4jOĞ}UVR+ L5nGmȶnwJ,+۳*##6pH'7PZ$2uN?THG) m^%Vjꫛy>p0j n}C+掚 HٹT,AĺF`@x>8|A#0puUl%O;ӢKBZiʜ:(-k,y|zOBB:G6lC{8VҖRT}T;׺{W X)W:Sv cZ;>A}GmOty䨷0s{Lvۈ"6lCif$4ؗw:b)iw$+r@6O$u:4G܅CeA'$w#Ywik2UK,J.{|{:^:QD/GQ(l]SקEÊيy.|<P[3vJhmWV1'$!{ƂoUoF~he5AId&:u,X¢(kowNÿvִ{Wka^k~ ÒQkM_{ hXfT7"c G%sUm^v#pt ;X Y2<⩆$9ЮwA$:;kb+~6G\*8A:;M ɉ <8׹,wkmǹ&y2|$CG$;sm#ΔSK{VbG/?˱F6# JbY\Opvf!R iխ>JcͲ@+TTMQ_ &Tь^~ڽ=k,mM|\()jJYeuee AlV*ꕜ[b_Ӆ#yg~cܖ!T|wׯt;Fwq,q3P5 n YA=yrb `macVip4RM ~uwo!Ā< ; 3|ʽNQ{muq$W,̘/#+>y)XhdF chi&d㷐@9֮vŪ"TUL-ǤY4 |? j,eWcيL%ЀZ@K9]u&x.}:4MY&i&i&ƚhY!dC D:>qëdQY)% hj#3URI=dd  i q$?igu4}})uySXzkv[LϘ:i/ 2%TG6vn=67[ d+-%e ,3# GRC;gX}nUs)-YYiGn#j-4YUi/ufiVﮠJkUފUraTD6wvTT\,lzSYRFu@I!+H@OnݻSE=HSEzxrϲj/JTA?1101?JwPN`Tos8~3 0C 8G@=f)d nOwW,wq*ԙ LҜl߿oFl|^l˳ۻܔQiMG,efXtR`.y/58 I(4]o` §v0?;jNwX,YolHo)XE%u9V34r+#':ō԰Rֿ~K|/zNsgHӾ<7+:[hsOG7wT\{=7NܶݍI>hj.*7'`򮻶|R.#Hπ>g_HҢ%ť9? LJtˆ`Xx[6v'i|Y++t68)gnfg\CUwU`SM"A09Y[ VG]u4شVfN3/ocw%M[$S1c``.2B"Od )ߪjA%P ;mVOk\s Aহj(Zr ؓīWVe8cR`My\7nڱm׮0\xʼ!vǎgY*h.4SV˞2"u8ARƱ>)DjMmQ(169H3NT[=L߾ELݰZLOvfH"[,scoUi ǟWNm&e}cAn,;ziUKU^ ›قRԒ($< H[ lUDG'`1# `g/V:kI_u:Y $d@'Ia|xXۮtbz QSǔ\*z*y8خryכ5tKxM$Gh92qA1!wisǟԿ/OFe(mJxZ#qNUn~R,S4;9eݛT.5NjwTwӫ}R57{aI TUP**PG.aEn~5H;; qX%8@k5UaI;r$xVGpGWN㋏ezBx6b>(_XQ.puވOZ3))!s!b$%[o6#|,+1?Ylc4^, i"i"i"|miGlMWzt}՜+nsJByGɤagT;?CFw>M[ٵY%J.U#چHPVCZ 5lvjx`%ݲbR wyÀR~%z|QV/{`#?p8l~/mkgjIqF݀ d2T+c>jlݼdF>5Oc2%a#< *,Bxo4]uTȁl|'yԬ ?TG^ǰas{_) ɟ['i>bm^P|Or<G:eӟBOZ̐LSOQ-UO駦ťڝZzG$7N߻OEA4PM4A#i!@xa< %'OUDG:x`g!HJ4C`><-tkq_7 ޻~˃Uwy2I! v~t1MzsMj.*8/rMt <qVjoNF{}Nr/%p\|WF}4!Z[ :_xO[g@ӖYca*Ϊ]ze8_OujgNeFۉV 0.nm=(n?P$ǹQ.>6 ,pISv+8k؍?^5mrMx):a9tx-5Gd%$IPªQH5SmkR]U4B|w{Cr~<Nve(UKĻw+gnIZcqT|:ƭ=xwGJnRiQT`q2 2Tnf'o8z; <o.n.HcB}xVw0`ZW1ލr~N;wtIs<İ *J4 CWt??[>7hJx F VF3"raY=}}Ek㫸WDW٠1,%I&b9A ub5Ê8GmmB0'Ҧlfp&sw>^%X} }ȹu̎gel.ӡVFp55{"ɲt[ E֢p+6vHl>"[ll;5MmIUA^*y2p|`Ĥ F 5 ~}wh K7~0Km z\,Bmڰ')ח[eꤵRH&d 6cS$#' p;FBZ({s7h. ic'#g"U '%4*?P#l~dOJ2n}m8k+̌7QuМXlVR-԰ j;_a{P 2ՙIkn߷U_WqpFZW ;rnp;&I5ٷ%ncv nlԫ۟Zj%Qr:V8a1ʪC)rB$^o =YtRO5"#'5[,Z֭y;B=q (Ky$ (*b^L ׁҍTwdTȐy}i_[}o~ZO7]]m(coΗ/<*緣E#rG P81??n G]_1:;4X˶df}GuI>IВ>^4!Cb]%۱f@ӵ=>=ʉ  䑑2u LG).H h$U`ur۾֍HkqǝΠr!@9u['k4qƱQJnG}՚TU]ʣ!qsf+*&OEQԻlQ*4 ̡מFű1v<=HpRucO0tE Wnmo)Co{>ĶRZ>5D;!Y2wqđ+T5[ b:tC"g''iץ+ 1*8j;wkFn꨸5צsHu1ӹn޽е=e Lp9X)9 ?Q*{K1=,cBpFpGU\V*-lA`G0xXoG:.:%a-pՑbtD[ 8TMm{pTn##LB?d ǎYտ.rY68gc(dxd^%MRlOA۱jKq"66gj/.bN5Zh؅aV)FA$ Y/iDQ#l Olf?ƭaEaGQnBdƋ+mG Ha}LV=@3^n۫)xՍ`;,j][j.XpEU㡽T$v+[WʡI `*y6LE @W~4ؐrXp =r1;9?-mZ/Q4VqᒳmT{k{e3(T(BKLcZ{_Me==)Z)#eVG *616{1q `#1I D&$>Ap\=GC7??ajۧp64Sxi8`?$UXjҮҧ:/n|*Æ?K(@hoKIUJRH9딡dX#ZUz-K{w/éJ;%SQoˋC~Gm]w5u#VJȨ$*$(ªU$gm#kl0P8Hv?x ;j4՟hQ J>գvϲU0#Q]kl-Ww:+e՛ 18UUUoCjoLSl;pnHX L[?; 9 ÊdS3*ZQ;k%JeRGb`iH*T4NI<S^! [lgu[dVt~#[.ek慽Pߚ ĩ 2S[:;JQPh %%N@y ȼ:TϠN nEQ_m+B. ѯ7=3w|{4ZEMBKq 2{Y?vjW1|2Qemt521g8Ic۰ӲIU#VJJzDxp멽l57ۥ@om#^Lp2[~^u&g_fmd֕uPah}}3SآS쩗9|ycR:Y?5f^yI䁀xWf?'X: S%hJؑͨ ,,c[ZfgX!r  ,`$'#Ud 6,ƝOƻ;ds㳈8ck Qʘ=sw7RMضjZjUT apY]V9?;Vj)n!ujT&dUE_嬉;%1juv`x?R1f$'Lۯ VÇ&␂)G=Ðsă8Cm;ӎg+.Uf%ߨ' fc 5.n*j3( U⽏q~"6deO(?0MPN0, آݫZ?+n#y94|տt:j)W~O>ȂήO|ASK4ߚ F??v.ܮT$ut2HXQ5T`,2$J08 9μYH8N-v̶M|3Ƈt d GٽF m Z 2Ӻ%#O>@aaγoN]iv8),v[3~ds. 3RTV.qIPHsG;_]nEFpț  _%* A]׭hr)->C5]IeZ1<hn#v ɾqIW{xc*M):zΠԻ=;?lV@=d?6HixYSh??㡶{e!!vE\`(Z^1h 9ˆ4-KGs ̑3a"p۷'$l9/ A"'9qmU`^ż/= *XĀ~e =FqO2u4Yw]XKӠ~=>|;e]DʺZ[Ŷz*I0WXBW![8b;k:鯣6ji$2w1ar ǐmz=ܥR!e9T)RjnZԐrMJrde2A+Ǽw}AUJ.zfma\4fz}꠸ "P9S;=K3,61wcǵCc{ϟڭێ6}1R<ؑ~sItcۿFx}Vb4,n~܊(VêcąUU4#\Gf(p܇VkMƋK23VַƇj-20WnWoRޕ|_}Dq"8rPW~vYmuf6|͟big(Qߐ=ítPI%x-;5J<,xD%Tro`LR;A=AWmF4Qc{8 LX#o;AT!7i{Ysw@ʹ ʥpW`78hO>zVݳN,QG  01yu7ܛB#D"V%v*=cd*M u]΍eCg?T Q8`SkfZ7τJf,po!^(dOq>b^Uͺ8FG8 L+cZNG0AUzl #juo!r:i:hMAo-=}-Q0)P cҀ+6 ylݙ]l8s(Dd{lGŁ*KD,l/LJeN..<~ lcz=T o˛uiGLܚ*or ތ0 UnJ{R^$C)Ԑx$}~i =ChG"î}I|G[cNјۊE^+r.~&V$ˌ}u>@??FnINy#kB1Qfxz,ezIlCX<$`s{Whcj7r{를:j%5r Bbe|#|dim%+4@o~ژ`zajn(Ȭa#+|tʶ:zhpX= 9$LIIMlLLm`qdXr'Z)C2 t]` ="mSE"O䧎55ܱc]mo2Hj-`0}f\@-sOOS+Lo'4A\``nӘp=bFKӍ_=K:ꇚ~N|8ժN0\ j^i3Rۚ羦DjAWDyԸܕS1 ѠivH~Gz˻?ѥ鑢V,IRVCx,,Nd,N$x'=8h~}xj.!ǸG>Ckwҋ۷y 0Qï)U~v1``J&vEu 0eBH8[@ ҿR -GQ5L'Lc?.J2 F Jb< 2 AQ=Dٶ=ghjW:~vN"G Ȯ_7 }TJdbYX3}aFtBu"scEJ, VML½Y;^7-RMU{B0@G KS% bV\v_/L !jxCK OcJkZ\l5%[dEŸob}zHP%e A,calM:m-fږh "(PbKܒOO6/H6{gHRi$i%leIYUG`,~?1drve\K-y{掃WO9Rvk AFW]{zG t%}?ic=QZnu2#PZ[ut7$ax6OC ~(Лx׎v\<,n|i+y6q𽏰,|oDXyVsL|AP~Qpj#ɎD-5O{>5劢k-2C]u Iq+7[x~٘>Ȫ+\p䏚?~q5@{JZR3䜜gݭr$ wUbi̿,)bxQg_B}V߄Zk`9Ιt;7VϾ*cTL+`.;svJb8 #蘗un}u]k+\ %1ݞqȯJHv8#89Qd='}ǫR_![%zUT;{8;ELqt[Xli1@ xelO@ޗnͬ/na}iX y{l!f:ؤU*W e:s,H5.!cMgTΪtMwx:nn%^ xsӝј)V7w Y:oH7zK0OOZ/fr|5а Bw/C|UG^ڋvXiiixLBN8Tw!WV?z۞tOh&/{ݬ_~:îs,Oj%5yAc9"VBt]w蟨[fg+E58$Kر8$4z}TDd| 0Z(`.3Wܾh-CxPOM:ú2E3KaKA a ~Xں%֦VE`=~xς|[8vi!2xիQ(6k-/5]UD#%ُ`$5uoۆp@K1y#,{.|Bv\/o Q;~$5dtm4%T h-d{?HX"_Lr7 C]?h"@ǃeT&ֺ%W>zb(褒1;=ey"P$}u%nʬ U=pb Z 1b^`xŐoU7MYkbM-ZzgPH0e|t^j稚6Wb3F6덺[MjiT tHVS،|nΓCMŘdu0܃KWJ6RjX(XSutKLnBqg.{īFƾ\o zPMOPP3HT;aa񲁞(fhFS1&gc^5iw2UVwE}K[m uTď/"ʬѓM؝.6u>^3m /# bJ ้i#,˓ =s96YA0!`bĈ+6>UD:inuW9G(DqF,؝o砽$sqJ]hΰ1"&e;v9d%mfޛb1ή)d(??0 ,ܜVylo3CM`/ͭsiM45T7Ӧk)EeJrB𰗂ߓ)|j3xR lA\1B1EA9,UrFجsGiʮdFv\΢ۂ$d2w=iY,"0;-Ryʖb'čܑRq^a],1~xz\}E+Ș4)aui*wutj [فԸFQ#*+@eN22|rTjqׯ4I @)L&?ƣ?T,zY1À7C!@qMTɸmVfǨjܫ{GW F? 6rT`-i5"Fw8{?SαSddD-mC`KTÈp@s^C˯Ӭ]bCcʧILi,йV ȣ%?Qq*q{ DJ"3\g@uwWd$*:Pz'c q;(5m쭡idqp~]](V^͟”K7?qTbZ2GPxT?-{I%554 43 pQnkL*4 5G*)E!$UwֳbṼxO<,twN~j! 52Iv'UԼTTsc)| v$ݦF& :7׸Kܻ~DtRCWO G"1FSuІVEEsay/5qyx~ṹobwI[(AV/!~@j\I 7f{rXW9WqB pap4V3y3=7Pssq' *WRwDjdH"~Ēa;T>G.Jl~t~6{[Tl~Ɏ@~JF;I}65Ѵ @xznzskwm܉ GM3N~$ 5_fmv\ . 9G|g_0m #?wEMth\9?]]d߲\n4-{Q#,Jy/9*u9B98_dҳPX2pyhkV)U1r[.[ͲbYۧhk\T13) Q puakaBk@iX1H|ކXV~ѺIf?[GX6<w_j}6HڬsFb*<[Zq;=j BrBTue$v'ZR? MSWI&U(bzy$`̨V9C޴tE`,/YdYhԡ3FitFKNdתtS;Jr|u?ϩΦCtͯ\Ɖ*rcE;}cz~jWr'1-OQs0F#hȠ$;fٻCntiZδomh`'=8Hh估0*7q|κ;jvzE Ttue udfD`nHz #b r5f拇ezcmVv+Aːcӭ[aǮv[Ez6ePrx0نK-? Asr9#4E{ZG" *~]E$4v"Z`̤1+/>y(Cչ;vz;M+k@Z?9@NcȪ2nᄜ|E8~4ZC_v~J1TχY޸flAOtzqڌ-UPm*rb2 ׿o'=Z^Lfqڞ͜.я稯@ެZZGX,)EۙC8bzA™qdX?p;ۡtRCJĔHi*6Ѽm[^6)k(1; 2AAŘ?NruSiQ6M( "T˃Ex!0TP٩'!V ~{c=&k5(6bݏ^]OvaUv0}5]/NmyU/KΣaN{rlBձSL{T|=''& ;v\BU˿ܒ~zީY)`Gkl1A2e_<o#֍yi(5 v?eI;4+rD#N͝+o7+,H;qƮ}֞5'1[H`fSn@=n;%-j:YaKuK!V ";rI<fl冖sSU2fqL~#1=^jb,BOEVDIh)#R>1_: ڧiSzےRnaaF0Օx_q arrTa1L?s8m{]|!CVSON{JYME5VոKڮBNX)ec$P?^yd*T2JʉF2IשVPjVȐDqyekzPadV:s 7tvkuJƮo5b>8s*]ޚlnŒ$t%GMG6ѽb.UR4BraS9S{z <ƫ`ˏPj%ȳM 2pNM FpC:-2(Z[vK>ܵUn \tVWa?@5|6 NUnCC~\u`^ r{Uw~,PYl\y4Z|Rgz|u޽h6ڦ*IhՖ1+dߩpyۢ[}t,{'Z:!ޯ s򚢑28y~0>C]h;EI‰,w[4,]3E?@k:KVtE_n+\0;I9 <dxlm]E{k8tvi8Q ,lčj[ qtvo4rԜrF|Wwe14)K _{#yŷ(dd-Gw-˱n+33)U dg^OFw=EzC B pF{=ơFT}ζ |2/RsH;S EI q~ܶH4Lcn'jXV tX͈',Ze:=Pu6ǡojMR2W*2M#` vdܶ^Cv׵5u%BєGf^ *0ȣU܄/\XI=p_0/eWӾ魵s)mOep]5ܔvzBBenb|Y[$U`~WcI{ܘU{ēQ&+3˚ WJum:AGwӕ#T 92G8 P| kpWRm8(#je2U{[ rk,)>?Ý$N{,i>kLƚ)0hhhhhЁi-g~*>it5@ָD(xЁD99@gqAT`~-FRӹ/]uN$k]*j }JDp٘S U[f9 8^aj۴i!y׵2fّ?9BilA$u0 7kߣ"gR>qzn̚(uO h);XvmWZH*jahEʺ:H j$>V#jǎ_%BsNfm@Ң+Nr?:QkVhyd`%XeXdeOm]?]#Q/5;sa(&ZU-j#+r S݆AzǷ^~Vܪ`gǹIVUYƈp.X" C=.b]b[إ3i2 B6sF@V7޽DUoK %MDn S1SӃM)nvj;#b# !NU.[;9^HYS7.O(r1l-OL}FMѫTDI1s z"!=R!Ż2'(35k}4!O>tFAa/4V+G\IIv6:(f*Y-Ž.ydOտ;c4m ^J݀Y}v:m4mS#L[Xڦ3VŬ=` ۚ} ZAy7q~J;LNPv<ٲբPq;3=_R@Ż}%D^iЩEHCU {5JVlRr2r@lZt{ |jڞHUPr*u3]Hhlg7ULKt,+#UhţKÓb:+MM8'85.RVZiH'υ81>]0'%O՗cj(VH,:7#jD71!U͍aݖIܨj{W e8e8` ԟFct52sq*HT3VT݇Z-׹㕌|2:kT> Rh+:~[j$Z;F}AGb~A3rŶsݡkpf(PĎ#}`S:*7]ኗ~4BO⋟~Dp3D$X=hU)| M޿Ժh4B2b9eU1ӥ ZUBȜIrq=M*q'鮰H$l@#Mwe^čz/)Պ3]PnN6ׯV&\gn\ǂפ-OR[kJPVi\D)ądSۄ#{ eW' Ѓ~́飤ܴFjLIPG8Yb@1fJ~Cޭ"Zl3ʮbuw1/!>o6KVX/+()ZC4lYYH!A["R 'M^f EmMHͶV6D$H$gV.E=x}<=tPR1(*,eLo%C]yZXv:)`BTI! Xѩ#öS,MjTF$&DFn4 wPl!*噋kUyFQWE?0|~ӷmdO)vto4Y,0K/u%@͏#=P%JdMČ8+^a307XP7\馚魑4M4M4M4M4M4C㶈UMnT=:5QMO=TA9CLWJI0rk{}cW#4TFpGp{_qP˓~&_^￉GVI [ܺLGo]$rSeNn"T44z&&xPGO r]=l{NE͞nRMCCE4(R4E*]Ҫ|r0G5u#5cCZ,=_vOZak),TEncNU{ù%fVU5Q SRvb2?v#ttU]:V+Jûii)Js%aO$/qa>D&vl\É(݊5Q8gGPܾ웤UIP!, H~{q}u{Unk=}I:ld637KuFx^37TiNd :u^/Lv=kȪ%,$:vg}Aw7Z5]uCw{FII"RIFq7T7=+;c^<:l 1F9T*|I'.!')e#:KZ"7 fޖm-lW;t/ 6#9 A Gd6uRȮ`Fr5_Gߺ7KC6o-!E{`;FQqaĚNnXZY2Ѯ$q?8>G8:ӔIMOmJF~| [E2` N^cCJUEy)K~Z %fHy=$qt*^*ZT/r;k0< pno3Ĩn R͌~wC7.t[j)ci$V!5g Ǐ )*icwUTRXؿ Dz霝fEzmﻩTOEpfPcH8K*HOb-: [{BR˰t1lD;:!AȯO^:/:%FmrSE4ʢJ?TI!y'8v=׿\{ZӜ\U VaBk@h[s_}L˥Ftm\N=ț,pĬ눞? nԭqzVm\[U )>'p: 2H%*V+Q;w?y:7^Kզa~t?Qo6+M5-4M4M4M4M4M4M4M0> Tdx:Mi|4}M4DL}vQ6uanRVoVntn̫5ثm[G}"\{0LcxAg Hmu^A{`*3$JC!׍* !:f˺ u`mKi sSqWnfUy]zIm?:^n4ґr$gLB)8w-[J j@* g`m˄̈pIzX^ 'nhMjb|[|ղg)! wP>չU0Æoy>B| (Rmߩx*0GtmL}5lo!b)x/%AÚ{_79θ`GjZNSoyp"V\=ÚFz\r!<妖J<4M:'V!, t[`|[G@gW<_[yV:pd2bFxg .FU䠳I+T;+WuFObY,UI 4ТĪce ƧzCߺ3iӒ{ տF~9<k2(R~A3u[v)kU)` y!WpGOcl%=hAIH頍B$jvUUk8N%VlvCxBh͓hkua1, , '[677}ɷg USU$~#9NcGjp/مd0io~zX۰U)oGshg0E wQ03mfn`b%hͻ^V5n$1?(ՆǘxTčCI6gs2oݖXly|n?9SSjX%{t@쭒RO|b5X;sQ[}o j S |,'>PGa*8p\%&aBeX[.ҥҗ̂j$+cq(@-fI:n^GL25oKvԭSqGH!38TR&]ֶylq\6T0h4gLg4_6i8*p1 l9*N?NN %U1CUNT cC$;~}E^7u{ڭ稪櫙v9,qV@hj~S[&1$[OPF>0T0ENytRT)7qxhz:zWNP.9ά@]A-'2 D<, m’mQGYUnHy%Q3şqvc؋#AEJw&୮(σ-/ͬ\d;h>ש)4S ;.p1k#t"4xM0Κhhhhhhhhhhhhhhh|\D_x#,LqISa8r{RbF?:5j;}Qzi}Ti3(ɏ܍\ i:\-gR08Zl|f-BnX;lR +?Fw2@JI ygMa#1ŻƆ+|H1Ig/^WKhn!8un˄i S˷=?\ףƚ!+05\6mn)rVjvwx =Q*:W鳪~6&t:=5KAZXG#+TjP1em'v}?kkMkzxUъs◿#OQH$Y}gQ6ٌQ !r_qO{ǹ66XIvjn:m3P\uSWQ.$T%Y[|Izq[>60m0XOb}lCE׭?\zgmKIGM oThI<ݸJKf?VD3fͤ)Q5pyXn$W\{D5\lCY=H[0)U0Fn"mC%U hYU8d1T}{k|=]%4.{5=,CECLO?Je54^_Պвt5 qLnP(|Ē'5 ~$[gEHIPecZ]}J7k'jqkmЅ 垛1>[圯@W'ᡱGSjSGO=&ݦVP?_j&QehXg~CR?UUz뷗[fWye}ꊤ%x"26BFeO۲[oX- {EWAIN_ˀMNybZ$mbPb8va9rmT솻Jڔ)iCԾfRQ5M5]U4M4M4M4M4M4M4M4M4M4M4M4M4M4M4M4M4M4M4MaѻT= Mv=Οp-=,ZxQ ֟L{׿{wFvCc)YoTҪm\ Y՗ߐKɗH_Mc;Mq\idYaE*Ȍ 2 AUFޞl:ޛx"mW4RTO47YK;h4 NIb>S۽λ];qԕW}#^İQt Rٱ}* U+eċqUT >Q_{V|141~*8(djm=Q@o%e-p- c,/^! д Ūkpj%:6:h}'Jyᕲ ׵p@ 6b|;Y38;4aMbYjd3#ss˽ӹuɤt0?h{!28Ah`程n5&e!qpܯ2waY71Qb}H& >E -w+H6 ]1ƴ".g4EcY1m>|B7*(B!B!B!B!B!B!B!B!B!I{|G)%13$ kƂIq=\#,tw {a\^6BRߖF\ mCdHZ70?i|)(p̩K>|}ސ1Ҽv6txL9+5D͘; 1 [r\.Hd"?3s=L|1H?#:r\Y% AoAT1 UdĚѩ?f3(R~RŘSγAO!27|O{*#d!\cM>$ŀGP݉褑hH̀~msW: jxeF\tTK^P{Y\tS"`@bߍČ<1Yl \u++̹bfI[I;V{lnbj44uh . ONYK9 6ln;\Ef6kđDS5Ovv 5 F曄|] M-L- ,n{\ݜ km9`!B!B!B!B!B!B!Bq7$(%Wrh?hF;P;EBcF Oi+iXۘi/uƗ^j[ä|4-v{t-t.<>XS([N޵릯q C[u̘c_᳝Dfs[mkCZѲkGH*+VpQf==b㺮&PM&O3R[9@P\6 Gw]mY ItٙiNߊw{ߩV2J? *&sd.wA^=,!lp:wH{VHk J֒nHw!RZj/yUԵI gIF7|.dm~^kg $>oql6[s5^G6@*vVL糠XCvEq{"(g5$s6l=KL:Ǻ P=&^2/֗}U5877 ߈E&M[-,*ic6hD/f2(rCRp,(bOE/ҿsK)sh,qoLpE8ʯGr So[=d{Kqc^Rړ}E, vXm9Q3VX8+΍p%k!t̶_i q2'ox?]{1Ӷ 6\"zi|{aWQ-fFE.rt̃ dk啮 b"vE+$`{\;~˲l]THr*_pV$ܨfYyaL/mЁ<$(B!B!B!B!BHz1 W Q˂Ts¤$fbwoHl4rPiO hkf]O5O]5.`t]ky ElHC\Dq!  ◴sۃ[Kt!Dڊi)|v OcoG"V"qA$'x׎/u}LלUVTGD_B,Yf-{\q̐jL*'m]OEquɲ:䝾':{n霙¬bؼnf 2. ;Gnn+ő4LJWsTEIS>iu-X)419|mmƴY%=,4ж01`5@Xy)JUKA%v9@$k@n7Jyxh6Drfexv#[Y[2>1r9}n l;xsR]E$?}oonƵk!4g)LMhKvY+ H;+1G=%=?CWb=0dG 9;$<Eaz'+$SK"'9N鱺gMy~&[`wجU%<?Ni h/߹bAdn`7ޘq% tÊbPy<ؕ _N]ut.`.wڮL!w6GߺkH\gXR]T~Fyca{@.cKS{䎞3$ 8Ӻ kàxxosQᔑPa͆[l4}.aaXe(|_wR3$O4FGR5dgrorUr-Фk>`VʌU8igpuʸ:\X[,m0#/'qek8q$Dٞ,ZI/zcTWId#Cꁨ{_XED (^䲞F|+4-ppbf8W>CL؛HdXޛ`DѵI m)NGP؇qZII`'{/r-b{X~^{Y{H^Ñ [jv jiwZrڧ\ki\Ѿg{N^K ,c:Fn~htYh7~XTJA;gcʫm\r=cd{Qu7iFz?Y+\4-06fBF?CPwd7Bo@:'ٽ?3t>jP,,!B!B! #Qtsb5Q#ZƀIs>K5Wq_ŞzaP܍D:AHsG8ˍ]; Zl&EgX pkjXU!J^/+{s6d7c/:FbM|xl ߺG\xmك`Hw86q;uQ+ph%ǂAlm.qɡI'1Xp s3ܟܬp|*& ſۙ=l>]EOfN:רWyl;]}GcUYw= KzFOc-J_R5UU#YOk/'5Ok7Qz8'xxk-/p7f<χ-ygV{[~POoTZK^8G_%09g\9с~;y5}Aҹ c@4l,"(;>!q$sKvE!$Q@Hhv;+GcnX+IOu+K]kuW6UeWI#%bR6;ao{!dJ l'{ *v=%Ea#2b0% $>k6}ʇ月RokM+dZݪZ>CJN[\t[_ⶳ{R*! uմbӱ&~(Gcb0QzG7-'pVse,MI꣪쑦A粝U+%'6B;accq_t#pBb~/NQf,81: ɿ,o{fs8qv"KeA|G]F?jP[+_KPװG\'P,,!B߲B\-Aq&/#h6fhtKCrf)QO 6]';y s+!?@ >qCLǫ|^'ge{Z ֶ)8$6&RÕn}%|uS?㺛Sfi:1CMT[p2G. o{ M6r 8UY!B􄄁ԅo!q@̋_go {7_07F5'J ,}Vߨ]&cK@/G׉9f˹y+Q|!Pj&a3{SJc.*[aDdN ZɪOM Ww9]gҭ0(S~TřIzpG#:\M-l̹$H4܎6Xmb,;WZqۼS7#Y;7 Z˩Ej5WR1k/HmQj8O F[VkGqrrpOФk;V~FQ<*R>F}vs8~u01cZZy-ho/X(6i%u{~gX*cֲF~}ٻ gAK`tV!u!$QQ^iK{b(BQIO"X;G q[`=ǰV"ې( Qܤr|OFfX !e( xۺo#-E:([#"'H؈Z Ԧ a'fC~HG^p a) =fDe#"ZԢP4x]&#NZZ7^\dFB/esҥt1ɼ5jM-,z_jhp:>XZ?PAعn#vwKyqݘ|Hj MÁ돇~CZrHI_Qv&x gvnG)?h|SS_G"$G螄]_=OGTqIq1VU(e`x-q9s&xdYϡxY+߭lR3-~eZ2Q>!5ky_K]C :m # {GU.i#mTψ?"6Dg^c:;#Y>Z{ʑ[d2Bxa>gTE$)ͽ9'-W'M FU#[7J_gQ<)v=T淰 hh?;3W&%;iuMS)~63;~Y( h6]J0zG%E?Cm<gڮ?>y{;;j9,q+G`(X#~: xb8v "Y;vIO#:1D6$$ UW>S߲i"ݕbIOX/J$`ZP094WpR+|{FC-l nl$R2;$eI !e#a=vR.R YzA( R2Rd=(BMռ; kcðgK4 67r>V }|wYGt`c1bfG%7FA{Od;3mC2 D ҿ[=β+])GA޾ 6,D}n܋m%n뭒m֘mECZAԞjYg!̔BAk_+5el:p Ƅw=嵽=+R5Cum5+[oRk@>Be#YJy 1W"|#[-cJZڸ熃Y}/ q=txt=F9?Q `S~ sl=4ttE af cM.Yd.q'R 3X7 q$qV"|G=(mIdG$r{,Q+G舢pEg=(±~$qV"ݒg=(ONWsDQDJ'x2ȫo}ʙ2Ð6R#GTL)E#"ZKԦM 줎~VC~}싓fc#25;oPZї+ZRT3,FI@k_gGū[HjgޝH=;Yuklѵ[0`k[6;u_`6S{fpvp ΕA.U* Ӑ`:aBXy!Bi'z;]f2DBbH).TΧ`{:.qޱp:L*ḕ$-%tmw+<5is@sI a߹{KIYNFE,!ZG <04OHUgQ.b2U91MNAcjc~Q3l9"248Tê)tzͿPlޢSC5s|zmf{ZV!T\Og=kv]Fj>SB_\#4K Agի/;z-- =3-E?H9,o[ڌc ~ַvw1DoX>Ȋ0+D,%.+Gs$q@V#Ot%11$ X.&{< b+GHIO"u}HQ%s< b{X {"(K+FIO}#|9ȯ>]<(b}:&b߶#Ԫ^iHȀ=.lvl;\]lOVHƌR4" fu ;vn^)K~7_L2@˴Nqon6|7u{kVہt 8ã3wG7/GAtH1!B!B!@tBXy&34a#pGT,Ȭd W%nGFAžvXxN U JrA+|Mx ".I~Zs-ybV9ab1SWm[$ Jߍ U5+XMK9E[b, I545hC\k;>mkΌ^g)re9|R(7+ [#M\@-svs\ 2)Z ^2H%ܕ8j"e|0PtZȠp-ࡡ1Dk@j pڷE;J{n+{ӲX]w#hџ=ΉbV#`&1۲嶞Gn۫G~"\+1E~&{<Y;l(+D=E=RD+G~+ܞKWE`E I3ޟ)K vV"EVby$r{Ga(V!θ%لGÕCq{}-v8\㣾C{|?#"e9sN Z+r/}Nr:vGCXƋ%sqe?D~p{ǯ| :Lִ4od)W(,B!B!B!BXy"B;M!k+9i.lq8P=/@6X8u\Â]W#4x8NAR8?;w_74L*2+46C(ǂӸq*Ջ/pxu axP?~Zsh14I$tXݣsVx0['=? O,SjLk#G:όh.;Qp|aQWuEPմűp58*%F@6z~~f̴C]Y)}mxMXK:2~-H|zYӃ:Aj<GZ n{l0\L7$dc܈)Z˟WaݴS/1×ħx0<3Ԋlf`|y?p;7ʾځ^;jsmcZ𵶷K%i) Gx]kki+ 4zrhCSy]/ŷKa9jTiC"  3>xo~>t .ܳ+exE@%wO_lfqb@}ڞ$r[[tFG *Yטi~Zoy;>AjԯK:_*P3[VYpLM*}rzF̨%ɯxn]Iyf-e06DE ȇ|Sȯ24_~XOjF޾J[A }ݸ,'̻{*:-dtD mUqme!]u׬V=}`Wz6u#%BjJe Xդ;ʝ~9:;vtOT'z;,6l틦Σ}3`~{M-%D{<-\1} ΗaGzbw{`,X#;7;nscH'=֯uFj|~#SlZ߃|o~h3@:wa\4[_̾(3]F<_clmS딻[$OBcV>]\밶==撌 (;Ղ%6v(uXrOT,]ig }d[yu/uhߨv\buKHom]Kʪ6x.WH\gۏP CU_>UR\i|y$5c LZДeٶ)2lc]rSEdѩūs͔>?+l7郙yaRضؔ,?jlT_֬jnQzg_5ל̴o:53wKrmwZf~duf.w9TU:+J}͹b2tl,h_t^^ܶmKT-5]ݡK@n/*p|p=" 0[N~D_~}\GscV4_}u` c;SRs<ux9/# rrrgM7禎bM$ysvx-00ζU֑MtW[ID 6vIT]zLcA r>;'yoO>֝k]+w qýuȶ'Qp8o3\/(}&}g]fyýc5 Q]|G?cVDq;wIட/;ϖcƖՕH 0=ZZ;ډVƜhG4yz?M3[b1|'e5XvY\_~cgŵ.Rc'urAcXd?IMۡsXQq,O"|j[-К [:$Am:2r FNԓ|r|'4)s Ӳ!RFJ*1҈J#!ۈ\įIq")Ųqr KN^ښ+Kh$a8OMM#Dl'vYDa s#k',b9F?CJ q5E;P}IO18>NP&/b9 Q*ynXN@""\͂CcDM~?AmN{Sѧx[(UX[}7Ik,q0nY(TW^4S G &_rr:g1qN9y~ $%ΝɳdL;! +U|巘ӥme< ?Yv'yeTɜm(3RJ-zumi˽1܍@{M{5\Oma5 ⨃iSۻ 牻JL+`ھsGT+HN82ȯRe(=묒TYf)_TeG"Ij$z0zcJN-PCH A\ؤXcYj&KҒ\?)MV%),0b$ŶuUZy&D KaΘFHRPka N)r)VKHlIadكʴ)we. lS WcW'֬yL}jX/R!q|00 LxMt>50}@RB"lY7TM`Dye^ c6lUz#9ёicбQ"u[{2$ /On%8%~VC $GHHQZESlNz)myzo12l"]IwHjN?^™8YvVQ|Y}CRĥyS `0QQL&+Y^+eИѭ;|WӠI?F `?[!FBĕNqL}z15rmLvd*y(((9-H\ XZ!hFg 񣈈 +ӌ3k~ITnD [ '$(<~`H~.g0T2Pեպ .1єH -,sf;>Ws$ zTDZ_F eSmYVl`9.#1] di^Np)?7,e@3i[$Iq<|Mo ǰF|#bRqܖ&m敫~Z0ɍ!>jTrreAV9ι%U&®|H7$Z{qB½T9<_* 5%'c"L,dķQiAC#y%N <+ Dΐni8f-oJuJ RFf;R};dB}%u'l6fY0rM囡O #']@MV6 `Fk0P) xաykVfVF ~JkgJbXr(1%T&Nb+[Mra>Qu(9LӃ @+6 W*$Rw[0ن6Xz$W!SRV53[PvÉzx'ק:cRd-X~;]E3& W;gd8Hmvӱ<}AA4l2Bʨy?5S$-:(BTӟ-i`Wl8g>wU윶Ԇ[Na3Y bBw *Y:p!2!:?kXGk`v 1;Xl$ JQ0qﳻu?;X'\,WRl*nCA) /6e#Í2d W+Yթ$Vlk&q[}>Huw|^__c~U}[7%R1[mBA_/PYbVܞᅦ=3373iߦȢ۷̵qÐbX8b(v$` oirKIK@+)6O~ d5icE(mnUHƈ-* HrSzkَfm}E̜n8W8&A(mV]cs>ٜo O=KTq  r;{R'fXSx -K~VeRUVgM:&La/P)o`d~?㍙YOH[uו@ 1!AQ "2aqRr#$0b3@BP?"8Do &pBRI}C̀~%fyL MkdsyW9}=PF`80u m?9uC= r/ڧ[I"2z7WMebĶM G1^Sڊj48{$5%-NWn"CQ5fIrCEgd?Xq LxU2ZĒFtAoM;OZqm ;>&(l<`bCF1}$R{=1H[Lr6 $Rk4R5Y3↜=/4b&4OAkĪ3bj F"sj0f T3tGRwSt@.?&E8ⲤҾW*'\rd*u&qrpe5aDi1>*uF&MB9~pA4O(vcP=$&߫PvQ!Ѩn&p")bm)3sP^ ptMnF\fUANB.x8NL'pd̡ s53UJ"%0m CJڱLAzs汾 _j2s)\FKZH@B 7LM>J@uD_ yu,ӋOv"qƥ~\-u\ܦ oKHDf_}j$X8-(d'hXDDd%!3DR{2WøꊻMU@2~i{ډLt{TNzCqzw4dR?7&f Կ߰C0 l+T0%j Q8dHn4'씷p|DO&D[RءGP^Dn@ ;9W] *M깘~k҆x;a:x nF39;.2F _lb!(( (x:ktl<$t>4Vi"fYv )G(q# p n#;5v1)LvGrJr^@>ֿT0ud״:AΈA~wqC_TZo2'=! cNh~f!rYUN >ƎۋZlXܚ4.6~HK )\O%Tۓ ԗ ? d^m*k-@?L4\"{$ @kHu0+mlL!utOF~;M5r`Mpk.Q(\OƦGV#k}cph7FvTbz>zܥ~|"]?+pj<:7Hׅ x4a3ܛkq:(K$>--H G3ݺPHTuVXn:SP-m-ͮϺ'rUMiDʇjAD'̄ܡTT~ mجJ9PTl<5 2_M0odW29)Ė0/Ό^Ӑ 30)l3axbʁa<."R饗=M[GH2ڣ#O4 ZPOjBYO9Envn2\t *4}P9 i[%*bZJ?bU7bWS9.y*x* ZgSHU_??MFy)≕L?NbV^V=1U 5Bt1@u9'V茙OiD2"1S9F*ʘl*K"JO\&\cO!J;Ʈ%;82B1z#ۺC)) !&!dZ)w(;Ka7%bU(>O'5C͉4ƵR0زhQ[ E^:F4xlPa)dyxC#)~Jx\Z1"MԖ҂@VΞ¹ZҟKu4iJn•N#L=#qȅ6-!",W9JUdMM12桪&0܍nMm9nI?6Gb״XYm89+~0VrDܡ0uzKR;/jN:Ƹ"5 &!hmA uPґc:?oc!U=5j:JgyԐlZa&1z.OMn+rGPMVULz#{坑)N=yjd5}75qx/|VK*9m"o'nb({F"SqETsy%':!92 mLjig`SJuRjNiA8췰EkSÝg `̠"ʉRs8 E94Kӯ%RQS)"ֈp?~e'TV ØesZE䮄bgO9vjRe@6 ѕJd+̤}*}iy5&&2~wGW 70%+V銜(t*57J<V0ĝX9ùWr,崭l.l3RY\3|a:'OO5) ]k< q!TbR *2S3 ZXU?c3L30^ JcMD:˹(sHڜ/Td 鵯{\M6wBJ'Q:wú2ja&mͳdN͘sܼ0-fOGDQ$g%Rzz{"}!R.dI@񲚗N8h |LCEcRs~Э) EĤw FI}L=YuSRUPJ(3(,6cs@"*X^NtWVtU=} hQ TzҰxG%hsQP*lĦsz=&Y66!*R mTmm2”W  !1"2 #0AQa3BRq@b$Setu5CDEdpr%4PT`cs?AyhgQ~ȩLWs2E=d.Iſ6ХW a&;iaɩ +GBϐM5w7Fmje RwKzԄ%N*7B/W gkgYș}N($2jBiLA,bAJYu ʞiH7 '/40{#,qo wZNbpi8{=r)ROvna;f$>uipP4#k䉛Fa;3 N.&RhF"ϱyy3y6}.vʑ'#fv;Y;6ez B9x LseԃRnXHOP{@Ej.HǦ95gHɡ1+f%O`MOiY]POBQZVהwSЁ=quT'+@y%Kɨ;"ƶe&ݙfїTZ.;maLkToˋIeܔL˩!aKiqՋ\S(w7$kV}BMF+uXu8BbA"+9XE.bao&;>9IWJoSy= !o38loB1朴1abciQܓ@RRTI#A<\늓T ڋ1C3` M.~u?RRV ũ oF]fuĎF]u&)بh) Uu]`chcbג)nQO7^cO>̄'2i 8F|L@012o%uS** XesF681[wX0̼ 5bUpϯ(X^o hJ(h3I$F L*ʙkQ6֡CCM<真}_sVsn\)Tlge.$A%:GJ#=P1e 9mmlJP|-Zsj=dnDH'/w=J9yūqPUf'Ƈ8Zq?) XFAav ݮn;RiNPFk<[h)v2k;^Nv[UnsLRim"-=)0ݱdy')?H"jU҇PR ú.M6<k jYOl\UTROOZjyI:sov7+YVX6,섬ԁv%]bR44! ƴxYݓBfRx]6.K"(:b*웧jRVəj>c-5P-ȹ8SRRb^h0_ # aBѿ>h*5usɽn_Ҩ9}·W]";*OMs{l4@_ ,e<tJvF11u ŠK#iO=m|(s֑e yM^F'u^ȼL2ТuHG#6&'GHWrZ|T 9¨z4Ecfay=l|h&sJz"z׌pq-uSFv1'Clz?-MV7N5۵USju.zWf Re\ORir쏎uĴd փ}If'puH.6Snnn[_'Jʈ9ʹ W(@Nb*nBp )4ߓz>bf^˷+jJ(̍[>#C:NMpaHzOM:qx2L-y M;MUSR2xh˛*~әC-'5*) W}^+qd& TU%%'sfCao݉3ObWR$+[#Olـ Hpiwj/JOV<9/4ew2Ó*s3V M ф\dNN7xyD.eQ(MTasG9|h?p s힣ךZ-N"ymc0ie*IT: -C^غ{z2Ի}qr.fOod.nuTLeiDNl{./s8ܞ7I5o[tK mcf}NN =#OT"vQʥC٦ ȈgHa͔  uʕRLnP\r5Љf‡˼ro[QNU2_o̫I:S5.AL78 MwLg 몠|xZ#8G$}[Uxxh9**¨F [)P6z7z38  J,Ƶu#69~oC)RrRL-}jgZ hvig8-ͥ'Į'9:x8.8wL\ܻMi{d3D\# ,N*TŚg-)?$ i(R&logZP({Nv\~LI-^ .$V4@šLkLYM)YeYJE&6&<-k_dvHrN?%g/p[Ag&)!e(Sݺ 8Nd͞J%ReQUE(U!I Pڞu0dSeN\Qv(2M)L)ןp5+Q5$e<9Ie4ck#c zbؿL^u£,!1AQaq0 @pP`?!  Zs"~3M+o̲I˅pjUD;mq-'MUz=͡%]D~^[8+r>ac L&;Q:h^ na -27MLlF&٤befVJPwt@9W5.KkQVRU9itn1.-z% ˆ .)dԬHh1A6̾N¹L{d95W/0 J)&,q2=eyPgA{qJ|ܶU7~( .߼F!,$319,WV_CXLb qq,R bcɘA<|L-H G lXwk{L7s^v5}fRvcb QXGZYUa @8mľ $]a`YSXtaZ!FF$?Tv~YYvyJ:CM8 =y@3v*bF"u*a:%W R!?~͘JpŚ'^\/onЕb+!(Zd\Kx8%4}`eؙU"֩z|^vA[b=Ofydټ{]z1 e\НjW_b-juauRt+w x#XEQc 'ƙ)zC}oBJLpu4 WgJB^~zi3V dےi~4C> .b**k4 :fV_$ҙXhLz@ Xȋ}YyQ KF8U4m B' ZPbr=’[R)10'E,<3ѸBмbMMzLIo41+p0*ƬE5KCa b=!khVrE'r,W,` iS,d CJ^Ĵ9eדָf5W2֠hC6vӁ? 5"H)/ky4X^x>Tf3s$#_F&:̵D2LFRɟ.T8ȇqF;Ci@Зb=潼ݺn߉5-&]gXyalepF0<*mXw,K5  i+\ msaGxMa`.:Qs0.%HJSqX0XW0|UMR'Z:EJb?Xd해/!Gw+~ Tr JS̵̒xa56]VIJhES5pxA6GW0U0˓ +CL$G M3*AVMTg!Eމ?'i sD>wRI>KklKutM+&,ܺdфSQ^/HkSkj]WKL:Y"n\/TJrŧ x;M4Zq tRW+`vOf;Bj cOG31.d`xOYy؂ɫ.#Qm]5O/Q^h{y~J6E:~O#`#i@$/YH#5b@vjeBшҳ51:3MR,N" 4EkH5h `=74ޛɵ'=gAf˵zF7h:YDai3=uJ@ h\@m 5l8VY^`HJ(>bD\`I ;=y`hitU8vN N]НpbL^&,:Hv t`z:7ͼ#003?u]CG~!!H~ʖ`M[g^1 zo_cyM"5hb B@*!1AQ aq0@P?Ht9ш|# 25:ޛѠrAkDx@H uЁ=K?&v}5f#k`E֕0G.kE՞QRL[N9\Ѡ1΅ M+j ޣ$+E@bZ4#.sp|Sꮚ |)` I]'Cj֖%i}\ 7:9W!!,.->MϤ\Z[IާdClѹ@NC!*1BmZ;;7 DrQI, wނN8 ijrIQPEA'faLs?EY Df\XgP;z2Hr?b-i`!Q J9Y77R8uT hgH[u)7ubu3s_opk0k9DnP@F0/Q YUL:!#QHc:CS;=ٺh_' ,&&7D"K$mWQ iþlzTb?۔RY3zO5]*B%!ciթ:#2ՉGKIZZ"-ПNi #fʆnN $b /.'ޜEEvcG. WpYDJ*^HfllU SwO7n3VqsE^lu~Vp7P\{ OyRg2r_\ݕW}`T V+n:=8/s1;&I'뫁w5nF*\v7 43SHE+B7f ɣzPS ]L[j/_{)@ cRzs c* v1[R!ɴmM^HZ>L CKh s0I."Y* 0*I6>茉dL#X'M'5a `06QVPΞYrSؓQQwxcFJݩ)!1AQ aq0@P?Ćba&'[0IܩVqhn ]Vv] bӡ>_Eh70#_-Za jn/b" dIlϊ\2iPS˫B;s4wj;Ti8B\TՌOv(HN$/>(.7 /ioc `rhPWA%)4H6Ta^h=ʒ\;%y!,~bІMѕ6?4~%>eEGPga&!):dzlpoW4`µ' Wiqu=*2vl+x im+ݚke1V0Vե@) DJr< ѹz+rM?L &:(I`N gMR%ˊ"aj"iAf9]W2ڑtsDB@j+6n!ǹjp,0z]~)h$>FiK ,@9 Ҹ&"n=+(͂6L8ܻ_7b8hNv} ԡl>_{Ϭ; y+ X]jĉz6JR^Ǐ<^f>Sc?ib^? [Ys-rs8gpǚWAwS%߫*GS=AYfyw+P 6qױQ+{#ak{#- T c1`L Q.v9u;ψNl$"V:q=O6{ʙz.H&CT9VxrRoHۥm79"Vˋd+T:);'gFZePCEi8"tMn{ӎ='-Zd1 <&F*Uܽd:8K2${O/+ [A4xV~ C^XLhJu{UMv-1JV/0y&aœJ/C-W?k7$`X0 06*t2`tM4S 2"K3% HF =#wBmkW5+$'hW{ `&3?h`ePbF 2- #tp r#"Ϩ j^FoMZm@b qO&Tm86 ")MV SF1mM~SgmG/Iu a}pJ]Hat˙H}^!̲+9 D(59kJβzˉEV1r/0it:X}ѨF/AP)L_0j(|q]QY1G\D玃Y=J$V&? PER3\ϔ,"+C %{5.x;p@>; \Zu) S(*+H%><x]N0bqneS9 >dA"bAJ/[+ο&rzy s6B`G˦vb @"uIQa1վ_!'Ho5arB٫kYQJ gy<Џa*لKR{ײRg"?D ӳa/oL>"s(pEAҺ GC5 c0A#,4bȔT)VeX$TY@ɚvTŀ׭JtF޷סX !A@tc4GP%Re0BjeDxn$Űɫ~_ _\DMGR϶!K 6Ob20[ #p$-Vm]职ԹOjqX,ۗ=3 =f8>OIn?z;{4(]tDi P"CVE7iAƺ&TqqQ芡#hw=߿q3V~'%}LLB,ve )Ḁ K( 9z9\; .U > lT8F^;]*y!MCh>H` bO7f1C*ïScm TPޏvTR?yp+ʶ\GXr"蹭%O*r?1 ծ1و\Md6H ŸKNf59%zY {CB0X_ $,cQxSS.ĪrtAg?P"F' ˡb%F_aC WAhDmhV9=lgvh;OpÏ?X@na7 ]E B: tvr濴񥠔~Ej'|S1tRbH8x=L*GN h` 8pElqXZ\k,kyOAJ{W7J?I® ZlJG<{w7+W(e_Uֲ,ūGPp(0჌-2OAsX l{D(RMuS:oVf5ҧZRZڰe*pQ,Ŕ#yI eU\QVJ5G ,LG5v~YD2E_Tk+mayavi-4.5.0/docs/source/mayavi/generated_images/example_boy.jpg0000644000076500000240000004032012747716313025433 0ustar prabhustaff00000000000000JFIFC     C  >"  9 =Q\PN;&u>Nu+YYl q;O^&[2v\tu͵W rY@TmN[h7FT%<:Oh347 nʣfL|2fn.tU&Z?<{,%ei h;1|{iXsFsk~VCѠ!C5^p|)O`n?5>m㯠? mI_tyeE{c&S4D֬rLk63p[?J_GwC:;7km _6aed?rIo&'0Dcןa!ycwC~得S;jn>Wwgy'7],ɰZsivsʵݵ[?nt_*2۷0s\ou^2hZㄚʻ랫f>&ܺVHJLw}#c6k[/x,is2Zo^r8ƲKϿ9{1y">OM>ݘM դk7,t g:;.6,1h׉z[BOZ9u}_,/6!Orfi:Id[ca{)Ͷk=lSij+:~lݯwfE;~7lO :-c/c9Hi+Wjh-Ӈu("߀ '~rC~kݍv֕?`1|΃j)ym3H_#owUt\ߥ>2KSk*;Kkg:װvAv cNu?&C~ IOOiP$%c_bZPk#C?_ǧ Ե^3AIJC \=?,[-~#Q[=K\O?)ȠmrqD~ldOxcXVq6\F<3&'!͇2"~;$"d_jՒ6vQG-Kqsό_>uZVcdE`G]oqmj™X0GL:wu)bMlL#}C*)mL1섿~ɪV5BB3AIlk@hC- v6k~ #$4@`5 4NK^4? {',ҵ)"#1|'\H J)}9 FPe| ;85TX47y$$@ P\5"/G{$[r3$64JK+C%TJ/o >]~1V{}Q}$ l$ki)SOғ !m.pkHn {KL٨I"TM x)Af =ڏl=6 ZU13@䖂Ć`iԬFE^!5kE r=!O8.Hg>2̦Y*wGTIyg(&>R6SƄ;NE%b,<t*Tg5:vZ2!DȜ>SYr7B5N`#́ʚW;v:7&0Una.dE.O6*Sr:%sj#PDT<;.wP*~Jا #O#=㋔'FϬ5Fr' Nx:ݿtѪB;IuMAH.XdXv) x{S\QST1LSvqGuNj"Rt $φQ$f,fG >˲s6F9éb ԰ G3$Ӻ-,!A^Y>ZVbʪO*R%eQc4x>y$ʝ%9tbIQOOwLQ926UtP`Μ 1mGG,ڤKSdTQ5VovOO9TQT=q'j2a['wXkPɺe1v#^H:d5`;l2@wYl.71'PJA#s'T""u.g!; WM[3q%\&8XxQ?*'/3'P[̥-;2prMXez(q ldWPC&+Lq:hCH*CFLfl}6ڧ7te&_'U] 16mmrXY(* lYvXզY6\VGVDٷ#S [m&&d'\GXr}U@ʧ, N)&֪sr D%kW<ɔlmeHށᝳe|9k 9*es6Pdb{nb袅YZi;(̤'Xo&Fy(Uqn:E8-31 _/:Wi%&gPB죅tlR*rz?On7?E ffYÕbN=ivAuT"iwoU.׶:% z,:͗ 2V(2SDpJVjV+2ࠀ!b}ehզH+7ҳZ@drT3lŴ̫bu *m F8Jߛ U!]N ԑv**2ȡ [CvJ|Uߺ)s~,75É-rLX?'H*HEk†ø8lI xC-FN{M  !1A "02PQRaq#Bb$3@SrCDcd6`?Ȣ7/ښ:[F~.XBo(g\4,T䪍<JOu3;cB6F2RfYAYa>̓e=erĖ֥", M5yjiNiU,M܈ bXaF\}HO|vn(%ri@hM冑S⣴lsߞ""zsFJ]++]9f۴]bU8ᮠ"fٜ5vnao9~)ߴIuq |y WkRVDrIXɤPSꃯYI#d'WiB#DޟI7}~iuc| g<ٞѴ/Z.̲ԩ)PPn{M'L 쬞1L'Wפu"Zm8F<%ѣ4~f qXTo hF@z!Qeks*^ހc-)8ur}vPsjfa[l ٧_^k#SoB#D'toT wIr~秴H\j 8amO932Ϊ[^'ar::`) 8Sx|\&eWTyA?Vv۷奙MVr]zβH)pV}`)mS"U1JIP2Ĺ-L̛q I07*?}Q*.Z)?TV|kWGG)r?4mgcd|O*i+K@[RW8mRyD$y6)NfwI/ӒwE;.O7?"$a3r ~J5j'ZXzO9oe-9p@jMR]n+ U]ժ(GzZaTӀڿH j_dp~64PA~Nɭ;dOKeRrԦ]:W8 I71vrZܱUR'C/Bf}ew,z\;lۓMM>jΪjbW*gCvU ܴIP|O)0sT0 ^c\)UJn䀙yr+/c(F1p} }!iT5)MmL#2o 'RԚ[J:MIL -D=PV1taFaFXe+BJ*jsA_`;#ɭ UcjFƵ51C].r8qŽc9n+櫛۾R68t^ÔnmOLs/1aFaf1}a*k#en;Q¬nzUbȡ\bp#p1cI* q|71]g۽e=W2;<N{)9H[NE=if(ۻr?߲֏0ncE"<)lffdM8\A[~ hs\z.1c9mnߙX<~p!Rhr%MȧzNN">a^`ʕH4S˹abmUg LE4&Vi1xkzc7,GO8) 1s6PA[ Ѯ"`fF+LF1lVL7!=fͺ8/؅͏@i"JEޏ7.㆞}9&S%Q4Ӈqu/:IJoJ/p1,{=:O̸"Y h Mz7m ׃lq*LOeL!So%F Obh7c"";HT&ˠ1.P%ѷzRk=\L䂊|.Xybғ"jXtlc3gv)E;BMi;;q,L8Dtxmr}JޡڔvQQ$eYS1>D<>nk(Hq Kvjs͸+ f0oؑPCh]}}UxU!fn^q$M/E3-.P{l[nP&p#r0,9 #7FhKɦ0~Us›UG.ʰБD N%2K<֊GQ2o)hnYkBVcqx1حޑ 6 QgsR^#NrnvgS)0gdT oMC*o+!1AQaqP0@ `?!(ߗ ["jwCO_up'pׅ6'Өs#V@+ Ej(2M+7v>?!e/T[ot~Eat*ޢ'8%,/ep=YṈd Bv gPp4C)m*< YV_KQ|O$iS?31("-#``xzeeƥK&4v<$%j{vw#U50d8٩ǏOl I7c5*+f%E' E./NYm)Q{ ͟dxHf&ڔ W1r5ҼT`vs0%FPFx ??G LB-n"c1P;A<ĶqQmrȘI/ C+N (#ZՉ^ fNfƦccLI^'>sp׭ӈM8V `5RFZY9>cS3zYWR-`ӘQ,@6"b,"J{U'iKLgD:$: ^a,DS/1祊drr?E c[47Ln܄ѱi}SWFP-ege$T9kgx q@#,A @]HVTXdv02ÿ?@VP3 sF 3N9u|q)XK*]:Kg-1 '`<wฦ>}q]3^ #xw١1[fPLX81\<_x$CD>YEǢ`ӿ@\0y(1tJw{`"XvPܩ>8c K!@(d8MyHPLXz^E!k!Kl>8#Z}Te+*W, Lu ҽjQ{ dK*MzNė;3SXr4m8xٟ[`& #u)-se|ʥ,%kw; +?Y)Ў)6{?լ=2~LD@1[-q99JGqߡT;(! e;-oӼedb-¶B>eu4K!^5a*fa$+ `,Ef P(pOՏ+SX%%̢:P{bfFk>CĪⵦ/p$DtaHb .MV+wn8/0c0w+qR Nz| cgTz0 ʐH]PV!L&jʶVKHEJv4Ro@Ø=)q3JQĥ6@^ tt ϼnԏu)y˚~j&Ho2Τe: nX\ž{2A[A["ZJ$]=g)=>7<9P\áS〙3 _؀F/+W^}W88z@oLP>I ԤOl])3AKK@vDCS $񸛁by1m7R sSyrRNpzZ)Za1g~m{†u~[U.Mݘ0 )BljX$w3.wOM3$*3 sC-1;_ǣUh} >X,8@T`Rvqd@AT z}_',V8@0gîSґ*oYٜ-3y\+i+.s,0YQ5QCDܩ@/:y> 6CR=l`@)!1AQaq@ 0P? v߫< {Pӻ=˿jcRqM3׺{zĥW͟uwo2*'?叾0]rY;lU4xJsT fYP`vM]ISܪE[/&PYD +ƳCχk/ve`F5ijV~t \qo7T$ 46.MGSΟR**9\qfP]`¡7"qq/1;sYAZ>-co[;ϗD ˸bj?|vt%A ϛ~< dĻ8m1p?0a0S|xBlm&h3z/aRˣXl:!L2D]ajhGgl:\ʴ9JAH ıA)<_IrJn.:0I.6 %8Ss,Oe]CM 2jN>5ɖW @uG1{")SBk_/.9Xeu:5|ݚfWW3*Dr;*!1QAaq@ 0P?[0u, r78gS>/솑ڑn3ϡ/(&5p:} ~ ;xTQ:²ωɑj&Xסci͢vk3;ķ7/Њ9i9bX"1PzO֏-`ˇ8x$Lʼn[#GoܗWetۡߓ~˄aG!7 G!ղqNs{Ό q>YVQ2\ Dmj@vJA0JWN/jV;a8lZoJ%SB%zĐ:ut:kPX"Cї{?/L@ژy(EJKؖԱ?cRT#ڻ`qHhGnySʒ0 ͝>!coΑr#B.T j&OdRFUu38@`k)N'X"p~7h} \ ^'GR c.^;<K!KOΧ/ѫU2؅:R̰fq-Xߏx0|DfL:bH'/G)ח *Yzi/RcӴ(lF@}'+/b`.ZhW}\RQB#xNۼGN@-FkEvʛAE%~ωxh"3rlΡr]@}Uk_H%"%\gT'%@Nw{%?K=yh$C 'Ue.]% B  H:Pf|!XSZ~[핥#cfz T an\I-]| _quŖ}D>lʕat yEɗy;mh^)גw7WQBUl.%2Sz۳}}QNh2 D.*@uqPդtF j8*xV(Z v;Dmrv{ڍheW]  CY!Jڎ@MARYoc3;-7U%CxkALt:<(GpG?O@`Ġ'ᅦMg (M׼\ʚ^=zMP,Hގ+@jM@xH_*/XZh7­E Q慄B%i 1[bZ݄]d;!jJ ‡KyC ͤhQyQCc]-4 ~Ԣ(h .8+\>j LUPXA,$wI4=O's9oh`I< ݣaW dWu%L_TrP!]Ws]R$REדu/D|uvTjRlq_OF–Xb(_ӿZzr/LT#4IKZLмj櫖GA@DCu8*Jdi@G%xq1`J1<#؂Våq8Dk5bR3*%J"ʬ&' ]%{fp"w9: E^K'1iuWaW/l@I9F*kgh ,A?3+l?7ss0iE;"qG3D~`S [UB4@方 P Yj08e‰quFU,E1U 9B)J۷6a׿ECVrR8,pcNp% ת\T<*m#[e0T 4'eKjWWJFU!Į;-T)$9iV0FVĩ4 a"8%EUU *KWF~+ G YbG:Ab/:ƶ s(J/XD&'orH#-ZF@L-CGDQ;A &|7s<Hrҁ!4*o jmp80 h _ "ơқQI*_,J#_u:K`AЍM4琊*l+N&6EDik)m!fg# V b#N.f* ao t_"u5ZUX8"GҕGJA'/cӄ %|1žUT< 73ugY^!Z0J1٥E[3vZґ" s 8wc/+BtVׁŧi"mea ;Z  Noh 9wuH* z5ѧK-+#.F1%^ܻġio(C7 YU_ҖaZtVvR紵mssJLmFPKA HԩEV1+&ȥG|ϜaQ,^1y<x_.VBlDkAә'g#dhZB7 RZZUaF ºvą x#w(=[ z~ J(Z"*` (j!+ؿ$@ |ropU[)᠊&uҘ_N#Pߜ W| WbV@hgPq҆>J]7mJ -CՌCPxv兰 PcV# * ,&t-B/bUa0`|Z~gqM ȷ[0 p|`}hUQVaZA @:͂ {G)N!5zO81@HV5%z ~ꆒpŖOziq<" A8 6݈i7a |EE.8Ag[WzmЉUuSh,EyW'"*;V8۳mDJޞ&<Fmayavi-4.5.0/docs/source/mayavi/generated_images/example_canyon.jpg0000644000076500000240000006704512747716313026146 0ustar prabhustaff00000000000000JFIFC     C   "  g/;TǍ 7Yt'VCXim,i"^xOvk3* Ҍw~n|x$V~q@[|\;}ţjg'5Q7údiXW*sug[ɪ,1#+&P~Ioʷ(#W+~|/34*C%)p"s od)+ؐ+mS]V@</eaf?_jXj|ajǝ2_(ʉuM0Z.\;]*yU&ȶMl?f]윢ЧuѮاE\s6WˬhXk֚$Wn 9DحY^yK^,s_z{cMf0kdgjgz{q_Pgv|l8B\ >RYd"6[:ܦޑMUS.Zys/zg:u[Nȵ{]Fн;Yr^ɪ0El(IQoK׻o?ZUMrڴ$+VNhb@ҭ'wMͭc!,^׵6-47 l|r[&Xl=mVoʧ1qD4.׃>rs تg1WzpoEӯfkW;-h̛$B-cCXbٹSˋik$fl {cF *^W M2|$3YLcBFĊSQqϟڴʵ"k^N޲KOmbKWnuFirVIGKU6ƍQ$ӛ%y[gOK]# ovj (qxr6y+5ÞbھnzhTt;tTcHɥbWŜt˽ÒɯVUz5(KWЙdҙ,cOM{*W_i,h 8 8_L1KOora [oi>?9ԖqaRVMUQZ;9浊Rگ*ʶuH7g{Jz1NrӎgY Ϯ-u3EC΁EѐYC;B|.%HUz]zșm"fƙfB,&FZ}) qBsZFb$=Tczi\kE*KZdk»}dV[v>oڰܰdsO/!"#12$3P %4@}B7B*"SHt}6} v_ԚfIZY.=2S V"]Q"LqI(孜č@Ӑa#Qhwp4֡- [mx1i:}>05oE%ST(A }8-kBG`9QզIq1B0J}|߾b2Fu "YBӮU\qbuִQ>Қ'9Ĵqjc2j둖IܥmX1~CRYixG(vߨlO`޻qFZ/TEsNG"Yiߦ94h}{u"$};Zo~˯>K," ܽk" \& V󝰱znʼ:Ӆwg6ƮG% CJCn_BkGM9Q^2nSiwd]i ;R@ŦbX+jm4P}UGn{Mj6_pF@X@k`k`*r Ͷɹ" IB ( Ëec"V3n!44~jwu2#6Mh)ONʵCVHAw_,&}bY;PԱ㥭s2AA)|{GG{:GY{д%ȟY9"~ SUp5 c ͱR1-1]7Sm~VqGnkal^&?q]g- 2v|ܦ9 :$#_8C>f$w9vN Yg# 9#ͅΔȒ<{l2 ,|qV㕃`L92+ybp+*]97m R3E 5OK6teD'ZRɧSgl0o,)c+ˈ{~ITĐ\CIcsKE`Mٯn $D=+sq?Jh8tɒbeI(b̶aeq7wbLz)ILۆi?M[T}a,p|* 6Ắt0ubΚbg:Pi\Uɗ1 "J d3$ w6b,lG;FՃ2[њGЃe#NY;1dlܓW-Tznً ɇ ǂmӬۍCXCbAkEskm@ 弽O?*f&_a7rukspcKsmIIJmv%\srN22+';0ZUyope\҉!v5G:Ii PjWƝ9˧ $yN:M+d36S`-E+9I*띶Z8aozP =֠0bF3|"y0W􃛷<xgP-6\e9rg!݊lKuT,4w˥,MD$\|ic.6lx܎\/Y lG0X0Ds8wce]9B.K=!/[ Ȋf1/I3Saa8GBRɩDG=Ӄ\U *:ԡɌ98]!!z`oZ^RZ8_r!tr@/u.j=aHl[&W,ARK!ߑ"2:~`y X1kyBW\-}dݻED:*<ûg,XF'.rmݭ0ѯlRk' +}ѵ㚪#)@\xّ3<rr2"{d@nYz-δ7Z"^!<FPڦ.E6.xYh_/!]$-K|᎗/E-qx+Ӆ#E,xMRGkZ} [7}&/'* zb/[c>Lȉ\59`|d'Ⱥ%Qx7B-B&@v yZdysɒ]nEfQ Hm[$ze9Zq /V24jfY-ȗ zqshXtÝci(KealKK_uN:<(m+lWp]]Z9i3!8-F*" CcN}\+rx+aqݱ9)4nFQh.c{fFclA풍IYwrդ\\urRFbIHbx|[b\R/e/T>x.0XѢIۘ78[e ~%[pWLEqWJX?)# 0!"1A2Q@a Bq#3?6~UϹGvl}ie_8k/ {~G~ĺnnmzhB''z.%=V_%$OSi I?s}Q=SG"z pfo(TUje%s[K.̊~L;~m+=MKT}^GD-{S3$wo#n5VxE};NUTU+i DT j*h8J:Z~ؖh4v,8״E_ΕʒDm~ t0%Nŗz[0[̼HNf RGsj Q)#,>H9726g̜wfO U | tͲb\YEY)R7qJFx_.2;a$sw!MBl^78FDWe W7t}4|}圔?~I}{BiWZ(5pwNo2 [l%"&O!'P[=ȧK(/z|yeK5y7VJMy)igѭx>L`Ed.Lק~cZDcگ#dO6ǻ"s7gp=Gȱ\rVWڗ,2sɫyZJ֨PFx)pJDgNLgi'c५#Q亽 ƿ2SdO> C]dNnj/!"1A#2Qq @Ba$?$u]< #%BzM6lVf+4J7V#p^dzƵKvU-O2gUiISaڛ*4Xo6r?[Z)+RGe؛O9GbQ=?麆R.!oQm/j'X/շk,Ņp$sJG f-)*%(%zg ep楟!E R_s~y+&BJo ܶT_%. c{M=-'%>ᥥfOgYBdS">F9^GlBTvm?2}!),G|("NPƸ(?"#="pYFėM#) н7GnC炿xpҷ p'?i:*5^ x,#[<,,+Df1<.Hũd("\ԗ:=8-Yep䴢8MlHh$I rIpGxL6#P a*_%de,;Kd%U66'B%UuB(MqͼM 04A﯑GJha)5* fkw+%/"ks;ydVȦ&YhDh?F"1*6+,Y4NСK6嚫D15ّV*F3!!Q($G1Ep):kvZu,pr7)!i{lx. l<08"沪*UYE8$J2o19DžבT8av>(hQ69LJ#P4J kQbsmJ]>k46dd64MT3t_}_*SR+W?2S6랱1ܩp|UFhZɘ_{o].p^1cZ{v{,hWB1X{Ex6y)hB1b·Uns:(^zI/yEYsΪ-~WtBd֧0ַ#Sç4+ #mC_B$!U65'$?`wі0SIˆn}.ʰ2[tr}b|OP]Cڒ6OLoV]?Fj5D-qT/X>(h}ַz8 C͆9,P8g>le拒Lz5V>=UuhﻝcP>Gãto!ѾKmjI~|`|+"4Ukd3_A9{ipc|uhlo}9WVk&>|SMYw<#RE i_KLn.n(D3wxn,Ԃ ZS6=v'54`5AHٛ\0`1of#1:٘]2_d.UѫoSЭԍw%pT]dg+Jms´^dSS D='~ZIjLj4*FuJŃO%,S-b|h*,<Ҽ89{5'g-rXߑ j%ah5֔5ְ&&ꫮ1액8:ieVܚ7'7z1u@hf D S捕8fmgdkv3%>܄UQ: u 5q٭<j̳rV[B]vukf& \6wK`q#ECDݢW\39 /?Q25 ;95p1Ί74(E 䄯voc!`}Ѕ<͊.UFBx#˜+Q2GNl1^em p7:'Zn2gn._݊iYn5{8k$L:kF`sv3M vPљƗ|/0GV5B]ӫozEbҞdjokn1:Ԩ/Nuwdwp(m1}Y B{2+n$M+v}g~8+U` lԻBhaF@iǽ&.c p|{ _J5$ܩy:{**mշO MT~lUhr\[Ly%^4 o PY*4vgk0 [&XUy8fޫ)҈%4fFtꭒwIN dXQ֑S_ ^rΉ.}I/:몸T*ZUhfN~9۟;#X?KUo~P!TK\t2·\) z<+V~β}{j > pQBݰ;]*> "N݁WostXއ%P8:`P? VwC滆@.lYٗUgxQ5Ы7!q:+sNDQ%qj\(RI:VfHM) loȸ}ꄳ4¬'Pn פNk5I lj+Frk\"^!K]$ 2uL*U7Dkrc,bLs( ^F`T1'LB&߾5S4q07t@\Q:c-L D*f u{ ɽd+6IW]ڊf$]: |8S{x)-:iF\9E]@/+EVJ|uWWKV3Tx쯏9vJh΂`N_t\֮zTLoi($iiYz`V?^h!gyW!ni[wXU[(nYY&鴣\H[rt:h'FAM$f {uNuT1E(y/5$*5%`5s.Uܗ2ܺѳP}5Aür87|}1 9[A.^ 0p Ssٯ7WUNwfʛ:jU66%UTUyL]}QХ2<%T5 |d,EXrL7rT!F&[pweW@=tC!U"k:-B)BqР3T:~\SeVxU^o^jU8EEzPT йU!0v淃m c6JSen]荢ˮn$ Ą6sFEr6aU^+vPa\̱]nB+ Li'0w{[!cIGT|v(S4m{#0ܯwmW2SQU@Q;>ʏ0ᰍVG m`|JQD )һf'`AlF#gV?_N TS~òcgS>2FMUsnFM6n`Z+T{sy"i33;줩%so|xb6 O3Bzc}Ll8зq̫W Y23d}{&eUv\wAQ ^Ѳ*ppWC+0 _@QM v^xiEL bEx!*~XQ[x4f6@qEAYI>3H8 FKu00@ \Q* {e܁}c0*pfܥ}kv/[34_8R#QfDʡ|_[DցQKжhgC^j媨TےrBibQVZQl160|@2vt{%hrPx6إO5ZFk!qE+@^j7Tw>-%&s < 3ynj?XtKɜӈMv=VPehMѠf>QFRgҗWE @%m0ٽmmlD MR3I:Y+rh- 7M_O1x|"`V *ipLn^ Cfhm+>{so2jv¶_T|ܸAUCh;*wT\{FoptD8Sh7 G@^RC&;.mn` Z1+n ~`(WZnu YmXj G1>36+=^;Ju?Z[S|V0Jd5MmRڼ3LZK6qiA\VV Zu.Cƥ+ %Ru.ٸqhILbŝq sR:`nT6Rݾoas7|+z怳[<ܘGOʏ?)(Fnn:3>0]YzW[cPrwacE sPwԺ0lJؽxpu.^&(V8z1\TB*Jie)B4-st1&Ya_0+em0I3fgD>5,ҷT]L*mYS/0nݱ,FWbEAZ}%Bk [("Mym G1)1b`Q=,Y0Py>G ^fnMA0;TE![ɥ~xwS˯\l":|QoԕZ,!0nT|tWp ~I ѢVd*jn!\ae5\&U[.FUG#,Z~!6s 39wplC#J/ɂ`m|]`qS-C\x,;²y`]ƪEa݀ QXrUIaec7@ l_bZ^e(dp8g;GcbNѭ{ &GJJvC}P&k5Z3Flya[qm 9Oo8iѮ 0xY511e{n\_3(xG1j2b/K>e4/#qsT4<}snG*>S.D% I{`n?9bUYk! 5>KmjiQtZJm{6"8‹Mu2!V~c!˻Vf^Kp\άyOD%2g3Ɨ"W UnlsFl1s}` D)[o}+'^̤T;3j#%[Q=0ۦU>mt;t$&ĩUޔӒ_Uʰ\#Ovs0ϡy/>K)JdlႴj=QM(q;őaqxR["4FZ}b:ge^fdX~faW{C FrjZk `d %crUD-X+j4>.,bKbP)7)zfr6d2؅g.a`fn)-JS~~w/ 0pl0DH&T"5ߒ= ADyXQ/S9yJ\~A{ǕSraMuD3:1e&i /牗qXCL;D(V6>zjfbb^X#ƺ71rzYݡDhatFyTiq-9εXpj.ku8nn,R*+k]/3gi;ɌiKI9!'{ 2;&\˴ظj1Ƶ,YJL㥒bW 6yknTfw PcV&}'!0-M-\/Ɉ-w|l@KE. qP^f %K32 ̽Ʉf-/T5yě;Х`s%10V0#l:xMfD ysc*fpIh^!QWs)5Lǣ$hhr,6wx}'kK2qT!x4UxcWJ͹ ix}¸oB7TyygpFt ^E*kD͛1o3k\y9a0 c:fۍ(^*; XG1n^cRLWKQTwߩ ,m-`^pRTe2 z GW&L.`"`Ӽ A+ XEQi cU-MگBZ9MDͫ̚OePk_{b K̑>(B,U?wK{_Eޘeȿ*堏i<_WgElˬTHDJIo7PKzp)VuνfwV>D_Mm `juձ:/(!1AQaq@ ?EL3J0ܹm 8>m /q+%%Bί2%MQs>6AVn0(c2Vk3hÝumQa6Jl7q| y!Fn/@c:#.kF|%,%7E~CѓǠ2!  q*%@D%°'qCHHR2Y0]@ij6`_q;SBJib0ㄩ.peSbb`%Hku5uCDu."nGg,#)CT=%SL}]N`uȭ;2L2~eb=^35Vbwx>шǚ'y K!;]de#eKa0Y C B^GuYDn01Ke ،KW3y h =%11.!vt#iU"؄e„-._3dJcn՟PEIۘLҶ3}gYC;EU)qdzJtͩ`t4aAp VTKoBV)!1AQaqP @?8x6鿈 6T,ЮSۇ * .*/!ɒ٪ʷDh w`K Ne !eLF>p#rpfYK<-?ߌ8Y<6,lրu4jjOpCYl@G(OJuYDsKG~VS}URJ TW}kg$Ո9h) ;X4)bn/^? c5@$1rQq0)=Z.G}$qdݟ)n,R2:z,AN!nO`K8VRjᡎ4oɆΙ@A =F )R ;H?e _4Ƿ/\PY1'cK:ċ]qJBr+=y;#H cEX{B*8/iK-sO@)rlI !Fἤ:)oRɀEPVTBZ촰%:jm蠎Ȳ*11OMPliUA ^kO|'-C { p_Vz`E0z,Ϻ/FNhBCAӷ646'pĻDIy\xTi1 $VⲲjPvhZR^$@^'`0j-- = $o`,efæY2f23*x& SFE.SXЊR 0a/m Q#"YژdtRk 5!/\B6^% @Wp8%dL֞ㆱ)bc2( DW| #{ CE߂}chZ[wn4#~&*e mOX"lA BLNiPӄ6(8A6-E ":0Ou C"aJҠ RxXC'"ĉ.EH@Д+=&yp'b,.\^) `"'18 W{xVϋ"]shEiVr&&t ">+dz goyyN/=vSAPd~R&lȈ[y2;|C9 V\Txpr-2D6PuĂ5'QiɔPmY;(DK6eRL6/<->OȈYtGo;=Sn? z桚0!T́ޏ1SM AxNׅm7lFCA516;!T7)#\ȑyaeȀUд^9x]L*l:$I كMF0":6Uʂ`@.3]'#,D&^MjUН(@6n $!qPG)PF`Q"kL%{9Lx@D_FI12O ] 86kRa[c᧼AQ$Y@+4X O! )A '9 te9‚ M׳bFҰHFO"H%=Y8r׋OL!Fpd%6:\%ij:'ĪjpugTx<@L\Si9i R4l-и uM3-4f.du\ԄZz`O7MOm'CʑU;@Eŧ㼬ք1 j2Ȃge2TYPrقS\һUW{`^xxwS!3Uwc@C)$&b<=:GT"X/!T Wj6DwEoz=̮>{L|im!}RS# ıl6tli^it@71 UW¾f0sLo ,\@ Cm-xŸwJuhKSn$u$gxfsͅ_?:uOueX.y DAN}beIJbvT,Ox i߹1*N`h# Y(b|q8UDrx޻Hm51JNƿ>HhޜA]zMn 2jTJUy[pIt6"z ׭ظ(Ms+`2|!+Ł)xZ]+FkR"&2 kt9-BǘPH tUZPͷ GFG'[4wq\'Dm3-vݘِq4kefh[TS@0%6YU*S{cZc868:cCH3PlRbcqIANC6 4__ȱ"kwmh: le^dAGC-42kD˝SonyXsHlʼh`kO(Bp>?9 "hL!]/Wy|8/W`gT&Z㒇n 'Xj =wO^/Y"qz9ڀAz8eh䉯S579qq8I (3cF H<&F8AP2;ug'\ <=@6ӧ^h1@#2@4~ao@HWf@.!2:?qBC S_| Bhnl6иR.,cx4yn(ӅOISEJw9޻Cau#L'sTUCu=?L5Qv,/^h/^NL7I,8SdE1>a8ث2MNo67mv0YO1#,mPِEtw[ i<įMCzsp\\' $#8q;smy2 5*m. .F'ih|1Xp=\0S>+~wx=…r 3Xڶ]n!ptW;*Ti#n'NruHm fXp#`Ă PxEO~:H0&yy fgtp # E+5G2A k|8R\BJ is:`4fӀ7S?`'N&<OOεVUSlyoH&FPChynIJ6ݜ?`f݌!KNLxL<iQw_?J\sSCǖh/YY,^,\zaxl}b*@zr3 r57FLFG)c AȲcY.CYè Uy} ٦j e5XL7:wͷ\OÜ{oxS& wvBvPq[\aTͦ[qsEO)z8[:1ȓـ$ alY[/60 lQ8 [@.[% >p>LYYt~x47!q @y18 ^} ͭ5gWM|9R̤^0|18=e4^؎iP=fxXĊIìۊy[yGx' /8ظqB·Kb O6Jmv`f@ޣo&; (pHfښ&(3K<ὕ0]6֌ 1W|#w|;>~0ko׍X9"GЦ@!Kɛ]w9#B# pߪG$WoCعJ?ZuIOHGZHMq:ْ- h\OՕ We 9wj@-nZ?b>q$UW4(d\YXJ>׌1h 6k?LAXo;IsG`6nb8 tu}/_9ya'mF)T4ϼ^:Þ9YurKj `Y?; aoE/\AZ p@6/gdCke}$݉e14▾FttʤB+ƾ q3Kt/HYv>DSe ؘu;L{׌1HE+|LU5D.WSؙoI<_Uږ{]"IX1Wg!]R&r˂2ϵ?q,]+u P+5'Buc,Ht W jӻZs*,_VhDشj*}Ez̦t#53[?ݾfe`Vވ GmS r]ac#?d+殢 ׳uf¥-T6YT*bbMF^9 C#ڷ' GG0TE&%k# ,N5IV= UiìѓyDl+rԱ_h1-o8ºZ2Li@eY]JY(}i"rƄ+m-C{ bY֫-Mc!X:țT({^Xgg aPdF>glY4N96rӫz7IhJ !0:ܢO>2>5Tj 4Z^\1- 1BL51S!E>̅$61YbRdQ9 >\y[``k'o٧f A AhY!KZ1f}-|w]K*xi5ՠ 'Qmjh('C3!57Xp$XV!K0ա۴~:Q: @I:ƣEet6Diif}={0O UyDdL.Q@3XrfoE3ɞ,>ٺIn4s +]MA]a弉pcEғ8*L %Sfs-uMPJ͉^}۠ ,ؘS\Au9Yڵ< Gϛ5D ㎇PѹIpHYJ:٨49}.\;Nӵw'M_,B6FRľ0b貊s`D)3R'\E~7njtk8}k5m~n!-hhG+a|-vճ";UP@jg?AG.~pI`MC- szB&/kɞ=`oY{)2"u<ZifTI;@ lluK.p,C:C\^)4ɷzqxb3E؋"?Ύ_jw{11Ԁg k1,:˭Z.ȿ:i ϶ V"0˰pyC)d=\502C::Ϸ(s#֬Ak79b"2J,E3AZ0H:3KL|ik0hv<_hyuV~Ei^ MLS u;=׃-ܪӌv2SРf7Pm5\k\T7ϥqv_ 7.ƭk}s-{!Y$O9LэDҤ˳Vré[N:OXs1/PIHY'A酪on?4b3qE{rGx:z]s-'nJ;xU@I"E5I[cZ[I!{윴ҏv22MWə9~:RLdB}7BW4iAf#_nƌQzT"drtVtz/[=Qk畦{l&DSvI؇< ˍg1*.j*nBzc[饲`Vn ߟ|I &B 7gռSk5!jid4|wFWڢBU%!"LO%2Әbn+"Yzͫ'QG{Aj ju5V[X mk}U tU?1|&pAXp.jshY¸A(*}oකQQ:kݵ$-G=:c_;@q0"ۼR&/'4k`K>َq%^]lr֛6o2=U2V ~?t+[&,l"|{}FA!hrj* t7 yk\j4aD>,ʢ^ˌ,y 4\v`5%eD5.ou/- \+ U~|'fS֞1A.pfJۣc9EtIDSt"1ytf#>^ 3Fjáƌu6 7g@PW"pqdyhvhXTm!s442[fV>84Qɵ;d&+dcg[%j #Fa79~h\{SKuxϗuJ bA5,=gЯQwB53SEu.ISjGh Ǭ!{ZO!^u72$V)Ox&kԅ#ʚg'[/9+呿Yh D"Kǯɻ^˝D:6Z&H#~(xLx- RYvH~a{n}w 6d>+zl{Coo~n-wzs<:U63g{ƊZ{Uy{KScYH#vd:k$1#~2ՊɆRivȽ WÅrG!I1nbkMLcεQMfXCiai9n̝a,I@'D8θ &t[Wk >mH: JB7}Wᡨo0Gt щ0}7vO:d>fW_35yUQT_ m2b)5}{Z6}(j* 5hȓZ\FF[g?C㴠<Û捃휆ē~ oEV8F EfA/]5$w:W:ىR;. -@Q)}#Wj.ҩP HԄ.Z+O@ {^%l١Zs;u.dz)ҞUZWՓ*'S=Ճ:3֩ ձM* T[(se!޷iҶ/`0U܂]Uš.۪ynw]S\bti4t$Oyt=/28ovp\^*H錋lxcC)6#t!h;_PȯCz7 ŻחQWW` ƹ~(*~p2=/ɝ5D|F~Ko9j:КCSYUC0~ڗŬ)Y}{ 5)$(`_SLj)V*@~lܘ1rIt3CYתSyn)c4WN/ #Fc谋 G/EdzKTֈEנ)El3ŞH kj]Z1zaٱeZIԈ=F$^B +@W!i 8zeGڽZT4I+F)^bgCojId  q@V:M] :e693jݱ^YlY:%oiGje:QhA@x&irk*VZW2-tf֔sѯĺMްW*Ⱥ\/n'mv/g޽~+̯yg2̦ RH)&+)"(K=)x}.B;R7[ƳËVZm\4;sZSrvùO.es)!{0SF\'Brt@?3m؁jEndo\D)S'K"0sXc5Wa5#I\ћ:i""&})g?c ^ic,P`mzaLzM'^AIq{dfa77{C{mTIYY +EKߊ2*kctlyٚ @8.ur#8.uYNaZ<^(CImQr8mV>&MX Jm "aj_#8VQV RSW7Z&g5#C}e8pA6{t-d%Θ،B0#b?t;G@ "0YN;4삭>٧ 8o 1emRB @ޖpj'?`1P]#l4a=I;W6=R6>I:x GX-0X#Uދ RGFnuH桮.HKj ]z.Ef%~>s$`W!a%yMY]N b[=XmJXn lVK2ڞᜧr Ԗl=3=jж4VߠH"HmC眦KXM]5lZm7J2մAKj✆+tRStQ, 0P!D Gԟ;_-'G=G,1_X{&3'H\rӅ3hF͌׫@e!@"޳Wp5> ŵlw5Ĉ 6אG,cuVTE+fj*W%Qsn>lvnccvϫKϫynJn)y@hg2ܽz)R]|Qf ÖKК!)7u G@Ŵ$O/?̴V~"vW6Z`/jR3WDL;gZ թ.emW_DtiJJP*@xaL2bN\%1 Rk=B'f1tbUu(ab(y{ĥ=KK҈GYZOf=C5Э}fQK-CiĭJYrQȷ"#@0s庥bǷe讇FU"FUn`W>8-=Tvը@94-a-fcBB|ugił.wa3,i e`G<9e>,NXVzmTthеl-J)ql,[\ah@Z聴dƫH]ˋ :γ2e뙻/6-w.[Sf+Uvvdȟ#:o=&:uw<ҳ]`Cnp%uZ2\%fh:e -tz&nš@\4ru7h?h}!~2*_5b*{Z[kˈ|™1Y\ȈNN5~ЮRxB7|ںekwy^Hj/O޿$5?ܳa;W1vHl2g<,NωDf~"_Mt&֙xM! ~T&SelĻ^H])\COCÎX2=Pl۹WKqtdCG ^UmkzتQ]aYJUpfV=2bBmʶ(K'Ӛ9 O[Ybs;=Bڡ56h AWLi3OBUUy:+,,LL4ࢧ8]W̓J(+V?"6] H~7dvrK'}ӾC K6k*5iaaHᤴH&nչFB zta(=r]Y2,So%"պWt\bti7[ ؐ$#Bk$*36,(׵^d{A[ql"RZ9YnTSltFYuEvmyKΐBv!ܘl|قX#"zcCu^#:Rn z)MZO+z)w& 7t*4 N(j0Hp, p.Dj~_<6.uGxJ˲6xc'=;% VZMre g;UJR3֘%6taɌ6ٿgا02 4a-,`ʣEzT64FbN7[fr#3;Qh;s+BթLkIZڦL^?lԐ fIRkicSWͮoHzx}Z!dػ )I6q2@g<3pOhVQ`$ʉ>zy*/@A0w;x`c^$JNw*ݛHV]]:& ؛j !m>~~~RLl2I/ `co@k +r:#ЀШyv6%vU n;Y6Htn:Z|tdy>ѣfZe˅V9ZhM][79?6a}[6jnj? xUʡʪuH({S\~`,jh߬)+Gз73NC/XV/ڵ5~a48uj 6&]b_!.,gߺ3:U2lPa+H aAS o`F$ݒ֠jhn}hcHxD$7X-Yur/tJXǰtYj%[.T$Y`icY\Z1PEaԐ/@J楖kIj9O ]*FrC4kT5aXgJ_[AR4d`_u*PYLx#mߨ!l*;͏852wBKNδ %!Akg3x @Ci iF?uߚ+JEULKn k *+TzMll85gI~yX7 er^&XBK]֡w.ֳ]ҷBu6XRŲi˛3P4puCWBh'hY"\%S\^>Z5x~rnj!vȁ"d"[ZbLbsK/_V4 Q@j%G-vwb(Vz}}IM! M qv&:n4927# 죭ZinL,6PBKwFKC)TJ`Rk!+kh@7|E f>mSU>i@/n:\릐_bWuEMgt޷R q^^8Z hw~FAJ[L5V}3S8(yGiʋ}wHEG7gP1atwt

ب4Š "0b{KZ3}Dy9 %уC:'4WaiFڃ {oN;hw{I6֬m,닗]:Kovs9 EKbՊHtO^RTd2D~In/+1vUXw qs1jӏ\`|+=M*:i4@fA-.r*yaY+aY8~wRu%dj2"4BG]+:JB2m[Gi Ăyg3 | \E7rE/{:i(7ekkKs)V:;θo^ :ԈտL"[2IKڵYQUeӆ]ZוJ_T;9mʤ ~o[u=C>sCbpN Ă Z_C^`z6;ψ5Fg6`ًYmcTiv \uXwꓱ떝;vnOaDS]!c־_Rt$[00oyY,iKƌ̙ ޘ׭@&]q˧lY[6X$->ыhM}%)e-BӪ8Rc$!-sm\M 1g;+Fb?:)UV 7]5@\MJG1|CCxC N# >֫(\] bȖp,xyDQVhʑ֮Ie>%jBAkce VA0 X,%k0" _!=\LU9u))2FJuu>A!АCwD~Bo QV;t׳QE;@g0R:.7/[(NBƪ$n戙VkdHR`ㄩYXz;^F8*nKAmKYWmee] c&YmqieD=j0AɁ#MWU"#t|* H$JeʮBn_BURM9 Wf1fuWt#k0 UYGIj{}[dG:zo>ԕG f:1;" );;^(|y:(`hNkdC/.O38#2E&$j@P+Pc0:Mos}f:n{7;coR[,amޱAS JhѮ@>{l[MD2D{Bt-5vgܯ*eL]E\ fKpC\U\6rYXs:#W['hcgB ] ׷(&uԯoTUj1L^'VY>hcj}IFY*R^OeŲFɯPܙxC $cן*geg"^h inDUQ^FL&ڕϳ>xK= ]PDVu;} VՎJiQx Ynsct-G g4WXajˮ:tbgYJ҆L7+唓HeUnoTm-TbsZ]~OS{P;bֽ⼑M`!i%<&l1h42zjpL^s 9幏Ujݷ6|YEʥ׹Zy=cM&nmyo:7)S91vNl}cHw[ VA 0}3?.g]֭W"L>ϭ g?z^Yϯ})1hćlӹk[gm-3Xu U^to_6Is9OhG rC@hxgRbƊZ߀q5 R6؀G+\s̔L1d񭜦mtFfKʘQYz5twGv_UŅDEv.v,Q%Mlg}X^οcn~X)v@ܯ+A{lIO:WLh 'k{@Ϩ v7(Ofr&HP2؎z|]y/-Y$+ 4uYz] +.;/QT"\ OxV‘ ͺopG>΢@uk"J"wdHomɕ[0jCs1I>]vSǢRgO:Ϡ+[{> r8-Y$[zGLK)ۣN a3q-IĤ;RЂB2Ɏ"Q3Hyq]}d%yyYe%̲LjGfJ! tQ"O钨v57_p Ps}gHխ+( z'4L^/vufGnާo!m0>6E==_}:5=┳(㯜d'D>ImBb#f.maBP@(e֌b-qL<$Sg"7X גtXE2lT kI}TEY&qlR1uה15f{[AAZ Yt2N1:: ͊RHoa)*W{!X鐉iK{ĵдׯ{kZ\Q|ӏtA=*IYO&GXUe:ֽoRV೮s&)*T~'Bcm{Dy>,pաs]]긯ΐ(^z[Q vhXq@_K]P#7]OVd}|ddي*8Rݍ⃠' 3muȭu~-̽Ǡ1?P"sG. ӷMď,-#iY9=WC*E;`lBvh6]ORG"lٳ[>>a3,9 07đ ksuo"|fİ`t7AdžJ̼=Y[,oyMe[ &҇Ǐ4Ҷųў9k3Eo7mio,g:S2Lu{pSVgI">nku)yhe4`4d֍;..6 h꜌14gi6#6.(f?2Z06|m3kKhD_.-gP$hS51c`me5/bА;N鯉̴/i˱4YH Є<+gyCͦ[pTy8Rꠊ WOt|KLzM,ܦθIt|; ?qIfJ'8R_=yz:AQC@Ew( $Wz >QsM `돈oqS*McDZqGJ/NJvZdVUr> !1AQ"2aq# BR$3bDc?AW%4A߁ui#w!0K`Upj$ SͨDRd O؞z,;{Ufku ]?ԢU:F-usBu<95جE64eR kFP9F{!#m+Xqo^,p@WE# b R6cKm9χñB3\n{Sޗo>vC)sZl5Y@jhlWEe<("YPHrn(D2pOsv?n{]O|Wahh?P+{4O㔕BVRUhSGSmhd{xJ#d1e's_.B[f%yq~_RiwJ\_Igxf:1Eq)Q(:ܩ׷_Zmj^ <^'k3C[}_rZ|F+og;[J#iֽG|O;D[("hwa;Sq3}s=*Э\=%0 JЋz5Q'Ӥw62NCDH:pY$J%=QyܪOOĽ{ 0͟vVX2Su>w+ COz,>(}hK~; V&tC ڕw7Xf ţCx犊Y"4Q$m~?ZB`MDzBkrfVU.DW,By)>?*yCq$4>Efvݭ?IgMt/?!@t%v[;bk`O>iޓh8(t&H]Ekx,,o*!65战$CM =p*HZ T2#Q~ j"*#<֠s͔n'p \+s+ LK)sw(4jֈb;wdm׉?s؝n6Mg907ANfG[+6[s؟ ȧR:\=O-ahvS$'"Dzؚ`jOe+&#e' -a4BTJf|-P]76[&ӟ$ZZ*%5@j"-3"FW2L/j vX)<Jy$k_e؁ 36# w@A_KvЦץnx(\噬_̄eT:F5b^-~.6b1f}+co=>Gy3ᄴf߽؍_Cz2vҵ;79V{!x*kN'qE7ƣQc2}O/q&_nlc 盧u $r=LpN;6UYOq-nf`"ڎ\(tk߹ƊF,/f=ސQ%WSʛ.$ǹwP}IC~r`6A⌭VF6m}ƚ^hu]>ZLkliQO_Wy,A%ɱoQ4UXf!8.tZtRg2O5~kZ:i;Bbm߅bڃ\ߐ~Funԏ59tR.)AtXP {&e.R(uF0ߔ7>o,≖6͓6Yh{tN|EvCt+:G3e5 i jZ/<8}=VChOep8xv,4h}ƾGzYֺi9XB.J5Ǩ"kf2\T4+9n4AE돴Zqޝ;wʏc 9t;^;F8{=~CPdxL;S}|F>j8O XlS㕹 >fϤwF$8E]CW_ ڤ;C7|Н8)Z׊ E-迪:M@kH~+z9vPlèc(J{?045TRԽe!,aܔ#n|V(ݣ,w;c,Mx'2{X."1zqnm-N-*1X\n*Gds;h6Re\;nocp֚XzpV'4/ԁkS^%f\AݙD;7KU l=LҥQKXFF܁O.$cÊsS4ms?@,5P ƿhh 3[맘'ܸ׎ '܏_t%~s[Na**О_Nx8/~}VPV9{NTt_%jfRRJ(QpjP-ޅOv4vД0DƹuT6eL# zFK+ qHCBt}LJW}<37a\2f5LBPhT2ܣzi[N+ L҂6;snP﵇kH$8F.'S:V> A!1"AQaq2#BRSbr$3CT?!w!N@&GyMX7h=rkH}Xէsokssv{Ua'lujMԁ}uTJuֺzZh+=lmKץ1mg֛!{OX$,$A3NVǁʓxQ'E;(]*i / >cH*c:E6.{NZCBr=Vai3$Rd9=M5cma۝ 6[}(Zk}b뉙tL1~ßvX$-6tՍ_K\3ǮdQkM}zG_:vMP6K vhFhu%fۍXyS0 ,/<vڴoC#]Nʳ|!MvPݣsX>+Ÿu@xSYl7!3g*uvou߈!D GGth%G.(aJD7׌S0yz8t3VkSU^n]Γ/.c'%74V)T5UH'I"W&hPAKm$e:YYLq叝\)Gpim$o\rdSݣ)G!p<"kdu-hRGᎶ}hUr4l eР jDwR_24\Še!3M.hE3Wh"m>3zso(P 4@V*6s)2H8ZTyվiPcy!WxՉ'TBJ1\Q3M;im+02v;|E%2Sp"MXm !Cmbm3pSG)əB kQmyaH0($.R:= nJE &FӅ)4.nEҫf.׍vV݋_xI1 )1e'^--$(ӝD\hP*0HN6/ ޞ I9PC8vNZZua٘8e)]i) L "cQ)qq4&, NZPu;<=|)[g_R]lARʠ v 4 T#AxB$6T2M#|m-ilQMp\q}E&jmZ[]y;by ,jD#_f?Ҝa*'?8ACig+U& p*ЄLypUٸ탞<ΫC Dxi$P&Nv÷X@ ^i_ӌkeƏ?_iźRPI itn=aKXMGx>U=gq>"(fJ-hYgt<,cޟMih"@IWӬaV7)˟~U T5㗥Z!;SV-hOX s5֏u<;neeZXFե.BF8O:)BNxǍ>G<<6eB}w$U!ИzRԿ"|i =q:I9?IXԸ4¢\9hu6ۧPf_6?F\cހ h# i\pFt. HYd C(VYSh U yǨ>^;˾uqi*}$Nb;6@V"$n˗,M4ˎ&o?ڿ}!jSLPIwv.l}伬 -ZVM6o ÝH6 B3#dwjq&\2G|k)y9=9RÈS]ЮiBo*j{u}᠌k!3P&}ȼ'-`zW͎qۮe]Y~'/9e1r{UihILF ^zLNp;mI"1 îI7o?_V)31l}80^ S{sY_ۡC)#|ee8[e`߁r維N%$8 DsƬEQ#{S l S OF៭5)Sdd$#*H!aZ&LS-ۇ.cM`{th%I:V4)^*q&2۬uv^ ǝ;L`6}8r{^̫n:N9֫HtmL{wNq9JXaܘ9+ú{83yWÛR׏ˮT:>uRiChVyA]G0c Ml7U9叾uYH>++/O&%;^4S.wgsGLA;ը!RDAV(M(=q 'VFBCP?)q˚MUJB ?AA8ޔT]lSi) b$^P PKh%wBe=ԕ2Sk_ X+RvzKgA#J vw^{).=c;iA>CʈRѡ8wZ^=e1KH^b5 <ⓎUW|lO_ٗWWscyHӠ ޛ{m;$Vȴ%E8+ 2ef ̤{;h*:drS NsB*haM# 7"ithG`N]Evgrc]$_*OE]_f3\)۩&A'* 8-'V<q=HlRMEЖgQƒA?4'`gk60;G#)ZCO^pQRp㨣wH'pH {UЙ_*[T`μ xi 6k"(cܥ0$F$^~luF83i`ZlmStZY6+ET\q4zU문U'\ag SmaWpn.6 [(Yרx-uʜ’ژUc)!ni$(sJoXjG#*FsGtT(nVq!;7[eZ'womAP8 F)U)HCף${~3Jn[ҖwίvY#Ɠ%gX~:iL%ILl&@A"0.;MVʍ'Gxu㪂x6#ʾظ1p' sNQoS- 5"^SPf]u4UE~Ү) `^n4Oq庬T3@:N^hQJT5bwR6;R_@;~ ٙpLH0>-[T8J1vaT!ǩ)i$E֖@pjY^pIzy3Rq%G<0)\!쬧U% S47S/Nn)V*qv@=@J`:Y%&=S"w X y9uY3c@m%F;M81ίR\Zʳ4F֪H3uIM=E\> BRZ]ЩuЫ9R} O9K8_<a>fybu1fa+x:4DO1O2 > RS__m װkF-._ M^}WNt չj >~#mT !1"2AQa#Bq3R$CbrS %4c5DTs&6u?y/%ORO XN-M2,{A?DZd<:'ٴ\ZXN?Jʒqx/K-^'|.Tϕ}?(q(fjU2Ϫ?ܑ@U@)'߇gÓ[S&A/7!D);^G (tA%EJJH9sэb>_[ [%rXrFhƣ,Ԁmo "NUzmm!a.iPAڐ5‘x6VSxkjt)Mj~^[%R .ӦH}ʐ.9XXeĺSLĔzΡu,qmn[U: ۙ[uΥ$Uh)PW$S4۞ۣ:˾kR}d#%3)s$.urO0,v4qO]>JKKJ@Blo劻:sDFǀRR8 MmMsP=8&dbJ߆LllG lD̔w\ =)X0$$C׿ o${:߁ ~o`l,{)])Adߞ*>Se7!*YXRlj6[o6ِ5#=HZ!.Kle49 +enrEͱ1qZ!a1ah{}7En%MDXF n|Bvu|}[~:8kZ.?T%["POTi{3Lkj(WĥkX!}* K .ܑ*Pӫ.5b<~A:SU6\?]5\#%pR.춰xo|R,6V%Z.kokf[+A]JSa齍C^ ^ӑdFeuK|}u5%Ϫy]1|FEHLJ4!c~ޢ/plwiJyMK*[;C~ +(' >2qln<2ۥ=i*rLfu13쒵ZUcUoP-qL V)Whv +F?-;s)Xp< uR 1!vI U<.thɶimʵ݋aU#P'#S;q*y4Ssk ;I,~mT)@-SEok*+ ZCoYy4onlUm^ X)YDR{s0çʤb9$Nܕo<#SLlUg'֗*cEcb ^TFT|"9q:ӜakSv|O]֟Z XCh*J5W*']JU& ҚMjUkGMe\/Je)擮;Hp:2#Bݎ4JbVDMj Y e7샥 >Mϔ̏RtwJ_gWY#} O&z%:"C*@9nY^]-U]-:%Ό-{b/8ԩnU;[vSEaJ[ 9%”`l7)BB8S"X)9l~e."T eVWUIZ@_OmQ+ei㩈HhB8sYDi!B)%M,ߨ)%k)c㇩2ٖKF4 He*oV{{`:5+W PJBv@-T+!uN7I@Hr3CmFښV@ijƘϼZx|R~{|&hzr~"8k·s'o?7VaiUm}m>8}MZeZN孔6kd0 S'>r% J{+'RGv Ҕ<8IB /Eۢol54Sd}+B)6匓$L)T#F.o3H2笫U6F#!(Q}W'S[֟ʉ-t-+KD{yⓜWz>b%&#OP6Kf^2)X-w*; {x"aS۳Pcf'R!C^_õܙN4yJyZJB5(vl muL۔_eÉjtu :<wHPO!");4X1GuxRѠq?*OsЍ\FMt+mQuaQ!mal:D)h\3~x~`u /(tw鉚~P@ܱ&]P,jPiG)71˻kroTyƨBr~(lWoYͥ͜3hIMtl6 Tbs6g5Mq$iWhyZtM jڸ.;|tQgdINpLxo~dZǺǿ j$\!!#I sSJC{)9ILr*+'LɊüEJR_,f6QE)^ ܸy^Sg]_ؒ]~I'CNm<.R/88]~exF;V!C&<|}i:Q?,f_HblsƨಐM'{@WĜd O">) WN2aS\J$֝B|^ X}#%GWf u9aO=J2T*gP ?#{ˣƙ얇,ƬPd2ٲY {7Mƒ4\b$&v$G,G'1Y@{W35~կiӃ1KMX]E@ ˫)_,HT̓#ZQLoG|z$QtK+JQW.X="< %JI*|O,HR""s\r@^"a.%Z7y -? 2k.ܓ =tEJ9UjʐơRBZU? )^G#[T*s܍sM q9gSehH.{؋x'LUscm.dmrZA6&nZ$ބCA7Q:tj>vb4@rkV߿v *9\wu! u_X+RMP\CRV,9%^82ĎM kBuᴀ\w}Z__mUeWo#d1ْXqN'K<9r"̫Ū]Bᱱy[=>7)8d-1֞v7Bi_悕ji]:#KW#[gt܀4OuĖ7e-Jrb4R%A .<4AAν6qRUD %m\ 3Hevd!O6WP C2YNuo#&Ok#Oi}^߭ߌO}BӲ\C-Hihv\`$,'>8e̲.rKF_d2a)6M3'f$= 6vM8?XDX\v8J*~kIJqoZVmJE:L9+.HGR<:ŕ;KeJ)i"a{iLut0Mt+:Ǿ־àp@+N^Ow+2V%+Rea3&c6q\P<΄;3f<^1 [,ʺ{*>G 35NqԸah[=Pw+vT<2X%rKą)SUޝ:ݕ%]pFp4q+sGDىU6' CHGu/koҽ? D.-z8iyoT9ZxZV+G<ǩq(הAD/6Ui֧W*ȋcphlwMobSZ'S T,oղ5>a+ScW [bL:!r|Д5 wۘ#ai,d7\Q@]Z2-leN# ƔRХ8+mne3NjN܉HߐfkHaG]8]([~d- eK_YP.C(+IOFyDvVh"D* sX 4hXC__{k%r%f݉[8Ҹ'Xq* 4QxV lc0%PQWᾷfq1S{zGm?B}i؂|VZ-7{Ul'Fw2O_D˖3!iyV$wyb4}Z\X\et' NR9JOWnom4UH1l{m lCC8ЈZ5[l.U(ہ`cjq^F>Q -ӦB" mQ4ڕ}PW2IP qJ+5`I:~O T(=^`0(AZ{G|=LRa;Nt{*! q+Cb>ar<ƺ$:P])uXTȅEAlrd(~; bBr1'S Ğ$GkX'܍"juV'6|mgÛ&ԛKqάې-:J#.A -Ԛq *HMtum}Fܷ1PH-zbh$4.|N'G‹<4DjQ-^+:9Z؏2ŧ,3:MJ.,Rjl5Nk[40Ty_3Sj*I^vjwjDuiuqZP,x[m\x|'#L&-W-a.{ZPys1Ҷ)Rbڂ9Q|ꍦMEi]<-1ץFHӫ*;MBIGr*:J+al Bwޖe_f *E9 `x(>X͹aJм8Q()KB{*o=-EɺNrqI \JiN}FZIib4%4=WelUGQ7O[ 4dӟd?ƨLzO=sĜє`ͨqҋF\Tl/p6'l>ap`Q@SꂦRRu {vMڥW4SU꘳Kn:SJR@6n/ٺjjdj]X"#{-NK)Џ;¾UB:Unn~8- cշS}azDH(_9:9_ XeH6B|lj qQRQ)M)] \nJh8CIDR#=r )ySmKm.-ix Ue_:7i.?1i!bvČ&LuSkb,6`m,M?J r O1Ƭ(mE-P%:8A $|I\{Vxhe5$ mCƩmidj7'HNS\#vWQYJVwv Χ4˄BSDUxM<,mu|l~XuuXXb*(˗LIj{A{Ky[8UO7)ܧ>`oKdn~py.^gRL ZOY!d114y8~jThCxm.\/VN;QW4XpׄDodsskJJ1VmKW>ت2=rL~M)t7R+< YeU-ĆcV5unY)mӖ'/N7*9)۶Fooh^K(E;mߨ|p\XCSXFOgnDP:3ZDtiA q5hRǺo{yUbCi^ܒTn>@ IKJRG%Vu |<32QN~1dJII_7Fxl)*qh>%Cm=tBrR |O#0"25n NZr4mkc(d\^?T/dUEGH%"Hjۨ}B(jN7 )UrfbZj1Jcj3!,9ey)ae?,f G@iШ;5\0:؎ZIV*|)4iA !WtvT*K}]Su[%V߳d5<:m*ߞO Jra{W,tU,@*DՐ:=|p3^Gε,K mKI^ja=S 'ZqJq2!<#ҁHRRv!u訔o&\|vocrPT@ 𘈔2a! .okc]ҹ o!_sM5[,pn4ojbj/;P:|}44¥HIWuJN^疛6қV4qn=G6*:ιѡ(GGjZ :_r&xr{ƃ (dۗv粈p Zm1"R/Gykd/tcytŮEpie[}G;~ޒ嶿d0 e8|6-Jճc 3i {⇁dص11~]^cȴJF©vH i+m# =+vMxPS2J:ֈۓHO.xI]"*=gsmWaSM2W~ tD7zCe_jr6ȴ#bkUlqaU֨Ԩ dz$Jnûm*# w# GzC Gw}[+;/M *ÎO,"fZ֧MOTFT.JG`q~$#:JYgT翎#ĈRlGJTbU܋ ER߉D/fѢ+ Fdk p_W2nO4;u=B)t,uS0|pQ/ 1e-7M6:5>C)Kek5b#{m RɊ߳y[_t`\)_[a?l$Uj̰:P%™v*B8t] 7]uuչu{+vu6ʆ:Qr!S=k>*QK?Āsb+ Ft!"LҒ9Q8mԺ8'ۡ~#fr⟌,-=׷ۅfLߔ虡JE.PV2|G:e'du()2Mb/ K%$$B9e+w/6Ĵ6E%s tLK}%Ȕ;rNrzFAХxܞXS?]PY筷QotDRk)!_i)T׷!:lU89֚vzx vEt '|jRhSxSdD&^,U CvᦸZS_ۊhm0X>P;JKu!Ku J b\dNRjRR&bIBz͸*r|4V\1T$HAVYÐ&d18#!-'q;[pbtn\1x$)MG{\aY;q3* *Tl-|7"PTX$S]NӬ\Xadm>4ΉFڬUnUkYlSEnJ{ySi!Z RZVK%m{̧W,Mh!..{n{} +~LWy= \&/M. Ae]+ EXH1>zqtbwe'BOⳛL]9%{:R G/;c/Wsʡb6V~SkHw[T^( >j;M?R3Voʎ` [+}SrJR0<:N enyWٿ NTM96IwL#L8yX­ێ ҩKO˲%9(ң":\C J5JG!n^zp7Ҝ˴yfVW na5ՔHHvġ<=ꋎ[vs.U Ngղ}Ğ{ty-;ξo(4O,4+*ԉۤw7ĉ_@8]t =eƪYnCŘϻ&CS΢opG-lP3 e;Zi$ sM*y j|H_IK/swcROe8rũ00ҝIqp$%րCJ6nIcOiԭ҆mjN&l`\pb6+U( OLK)t6\4k)]]g^HL#m*2Իئԩ9n,NɉbY:/pc;%jM U3z11}TOi$r8KYN%I`$%V377KN[L)t㎽|a)zUNRVWR&Jl2dx'jU:jP[R2BRz?4c)ἦwc3 vM+պ,8RR*qNkˑ$}'N;}{2qql*v\唍t f!` Ha72n~z@͏MKq֚t\eLGah!IC*, .Ui{ puUg6 PkIǦ$Gnu'v);QrdR6q8A6*XFYHu/Y(F--l3~KHLוL&Rn(kxoRS/W[rUARe E /r/ŗ3zt9izQ8Md`Aǣ]-jՠ}}!rS,6=Ƨ&7/6BQD#noE|%q'&K,إÿyJo [i,*jN)n{Y_f .:ZDt ?OyyRS䵻d!>d_ʕ-fjTeqkP'o,:0:=)WUl[FB]*ؔ*#94Y jCR߄[tOvwT=Ku3%gvJ{VeЛoO-\o,&;02*Š"+t)\co;YLJ6L5S#>\I4/C͵IFev`tZkJ#=jRRy5=u GWwre%Ĕߪv)?<އ'QBV<忞:ChxBT;6u8|m?5u܎[9MU𙥸ٽi6燨%.5}$X]Z4'Sݍ!G(E%#Z iw >i9jJ8)F3~UӃni-{{T+SZq K4[ PWA̭TW!O.f:f\Ʉ]F{1xdA M匩^ VVd0(#Kj덲qFI2kmZ3Vgel +,W6ˌdPZYj~W B7)!a!`01#5LjYBqIҫ_Fy@MLv5v <|6}A 6^d}%S\9n=1 iΣ`o!? ? jP.']TnD\UvjA;] 9\_P[]a,ӻA R{yjՄf$X"dHB5)mplDEѥEBAlSꊊA`P7zt"C+71fD:<-=9*%5DYpcM38v.7#v1:' N+-MNꎲHn\b.B-IT8{˱*TN_ul7Sҧ9'TUE>q"DX{˲5.<–./im?>J/= ʇᆜf$ql"md_zc SCN;ajs䔴tMq9ܨvf]ҩ2?LeˁΟJmzt@"+h71гebuB3̩3J4-lM_'ac?*O<>#Fi?" S8d.CZcy:ޟN#wOp30SRëmI4A <$SA!,-+(Y8=O!QXj/Z_Z*Ԥbm\b)MR榪kbM݊mBv#(C/1p#X)R52cR$]=.?)txu%]!$hu!D%#ITncRߎu_ԋ| Q ~5"섺uὬcWbvTy@R%W 2wtS K=aޗoC+SˑDBux~eJJHb_ 5S[>AGG[`MD3DyS~ =UAiq 8Iz %#Ħ|"a" ecGmIzPIU@-6"ܸ+xMr y4NiRMo#r @w\ǃPF֓78jtȓ鬿AD~w$hUJKS|q(8ƫZ}U2%S/0dQ,r8U]OCAHOjˀ߼b-{.zlts>`j3嘺J*#_pqMөn*]}*BPUJ!]mdGњѪ: &)WR5[G$KnM2Bv#Ei$w:tc"1P_PXnH닒B˝2e|ͨҸ "!y2uJ) fSQ܍\%-[ZܰF*Mqp%2GVa $r>';K˩MhuIUVb<c<Ԟ"-cuF(ޝq[I5.)I#.VTU-:Ut(0.iuiMֶ &Jz#ւ ֆ]Xz%`k81\ɯiig_<꽻RVRQ4#7$e٤|t]zHKi\IquG1p 4nyXg}:CQHlbu70:aiy̛vѳNR^Jhvۄ)>:6tL")ABR۟>,5P\Lhx cPm* {q8reR^,J[IR!,0ztRm+i_UCT[iCN l}~\yΈVRF{b?U%1!_񩤯~*ѸLOp+Vpk mbW0&†{դ?/< QiHAIoH(Aȵ&WT,;Iw:{h">7H g^7%Kx!&w"UӴԙEaFBgJRηi+U*BZ*ӤE`BkmanX^|֤ǨDkmHIHWIpL:kpyoo,J_IQ-TˌN?Wۇ=JVc*]m9ϙ,Sinv[K1Kb裉WMdHǙW>iϴ R{K8O m>ctfN7^JT_ b=RX \[zy`UiO;Z{2a8PG4˚Gl8m-0˵jj<2MY\IX6}U̜HDtԻ%Mۻ镢C4Թ]m ^XⓒQnl-ԭƒU˿UO kTfѪ| S` Kq.7I߉gdZZ!,  tyP!~}IQZ4m*M!ڍL)u΋:3 waÈibͮ:i74Ka]*e:ģ.<76PMӅ܅&<ԕDbL94^_e$ 侨P_ JfrTxx.DmY:Iv#kuFVX)R>.ѻ)KX'N}:xm(M[OWUtuVne#R,̔[,VVI^ɷߊQpN[}:xtY X̤7+h5QV0l|vگvN(]^ ;lSk0-![;tJVˋ;⩓CJ n:5zMro4b,\=T.r\G!ZU^ N~S6"rU5iq h"} )jZ7irgO -]xU, ]7e|-YIso!7,w]2;Η5Sv4 Elɵ. Hv7_#xQX*֫٩#TkhJUDYut#& lIFZ?10 <֦|>J3cjLe*>eJ܏)Fqd\! 8F]0MIV SaN' ت}]lpZ}-n !:f7drGCiJe]<+ +3 TLxިl4@;eoL\z jv" ՒYZRBF:th#WY󎯘aWZZk w vUuv+YJ魰椥IvFWcC͙q [yBVHJuVM’]:AP`#U*GRyy+J4F%+@ ٝ'S8Yaj3jЯUU=5`bR٩톓: ) k$5Q qxny]#qNڌ8g`juJǰgU%J3JC6$b#R*˺ DQ *˞*ޏdf˭ iCҠXr'A,2꿺uFߓ Z3a gMjJ֛o˻U+т03"Đq^匜At%ccr Laf\\C{} F%beG)mB@$*uro4zJ\wPeVRSF%u7U^ J: Tؘl[|EN{bM*1R\JQ׸s-)m*Jq:Ua050K/HY-i+dxmU2&PzB֝$mғU<*LG Ǽ^1<*_^54Q̭)-{lf\鸎u5~+WS&'*KLJƍ@&_PrI6/\,n13ўy}rfӓZq+i~o>' e= eKOHw[<%OBtݷ+8s"ɮp8CN l8U~RsV5ԉau~JS(uFz!j;ն ~'Sk[\BEO.3JTRUrXJI+êy_ )7\F)( PkDRpu!_NUF=y31FF]n<')7%G ڛSUl ;4Pa8O-NpRo:P3hԲ%&=k/*e! ]A [ V݁ÝCg&,[assnF/LZw[K L(kBj8Ca}co,:)%G|T!ekE5IvPf*_ZNHÚ;BuSc0cB|U:l<)>_AI Cڤiߙ*>-lJi=0:\ CɃ:#jPhxG̹31i$)Թ(ZO[aQCNDuWn`h(7$b[7cIfR<ʀ*I:\J?BBҝ) x &=JL+M)A!W&_'X˹)c=W^۶يbƸ( vwRqiIrPyJS0QƔe6z#m-q?݉9HL)o_a'zl4U~GϮ?\q&RmWm**8DBO5BUS8EJqVV-ghOu) *"6$wE;4Bʡ):4- aqQeU[n~ F!UXNJ@VISsRGMRu?U!EƻU \i)6u0#\.\lBd/t\m֞;r#u& /&m)H7zElyKeI7UπyI %ޠ>݆3xڂ\te[CYjzd#i m@GGRULs"ː};n~vĈ)fKi5a|36# !HқV 2%j" e5 }ުL]]Cᆽ!U=!*r怗,}Px~r?TJrcNtkNʁlS[ɓff7^aEM yqB8-WYҮyvpyxcs+R?EކuGG,R5B#Uht6YojbOb ZӚGk)qzxLXQi&:8T}vgWlW,1I@|p}<5z*)Jʸ[9z>Uyer2 4(0'P_M_QXq6eX؇s&[Y5֞.T{xduz'C)qSuݑA fCUa/)N!-(a9.ΊZgd9v6sᩙ#T/ 0'W&].,UN|IneT?x# *$/38M=*iJ#5,?\9OlDŽnv;ۏu ?b.䄲,KRkopf34=ZU&w ;kbNmU-JD{DOrFLǜLiD$mȾڼ"*= j#rTgŀOyK_H817Osۏ$!cTjz?[)tWe'ƚ~AeY)p: V nN[޷<sJZ?+sJ=L-uIe_DZmr/*p>xyp!U (l>G_.!Y?l)2ZRgj|CxY\8~!y->*PJ͹rOI M3(9'Rl7:z }j+"8 /ïCˌRzo?+9fURu.%_TcI'a׀KJqs6[K#@rDiFm@}^b\ p#Ҡ+VP*9&wG7.4%%H?,'/T:;&c/x%P|[*MJ:-պlQ qqԅZWmN&%CK_+F]ڍ̘I q%8ut"\8 ^(W6r%h8LxHX_*l Xa3fL*ot݆8m? JZZC/hԣ)ԫy( 9vG.qHi5Q$GB"u;HU) >x1ʨoL6EPR~8vIen>z9OT6~bm1겡v&]iI);8uIM7hbx[mf}*,]ssJD'/Mۖ`gڪQNj2@^${xLhyUw?I*JCrBNTPV^>Q=ohʭoHS#gֱOFe_UjcbrjD]+sVZѷv̞ PdKlوs5b74RˠL_J˅l-@A7^f>ka֜# tpո߭"v hUH:., p;H* i ~Z{@|liq#A78,$bSit*m;.LFZQ4oW !gSTC:FvW!OTَZ t٪Ҕ6*t'hrt]vKϩm)gY=PXXCm5+7'pUǢ÷rUiw/?jq>OR)ޖsaZVcScRe- h>[^R,HYPzMoUlJIUPБYТBE-',NTJr_C=JHQ*R$lFqLJs""tD[*m\ʏgJI%vGUuƛČI Z[RO9Yw󶶷RKn낝۽m?9%g~R`ݩtpKB%VHBfEB.<+R]>^!ĎJn&-!P4mѬuTYUmJ']Vg.mi!*_C?3V+ "p❙+XuƟIa^}+1Ǝ☤Y\؏EҠQv݋aSD(Q_b$OSl0ԓR5'7/b t08Z:yI E)_"XGY<-m{Lіܘk~\a./]o.KB6i>@[Y)3,#"LT'CH&=ߩcojE) 8ZXwǪ+y])4$4_G'&*]^T!=zǞy" *9mzܿ' ? YO_5QV:y X Mr;a.UҷȶKbӪi,Ł)jDr%˞)(ޗcU5d4;*r,7Q]SҴ)4eͅa|[%I )AIqu>^XW5 !2=)F2e5*NmLjوR$=2T)HTޒWH$k:G~U0NrrdP#8t5!IV^ lJd?HqJcDTOd$%/=G%өJW&0E}J&Kg}' {,Q_f n)'T0ʳLgeHKb)7mda*#q5A* 9'>g[V贆F'W4El Ga0ihnwWng݅b8}$7>O%a\VV*M%5ǖ=վ=}IM Z aR;%xTZ}EOV5OP6M7`*GH*OT'Z(8Lj9z=mJyjtF>X]kY-֒o4.ܕZwM/;]tb9^ȐO}݌ QS1\}R=Vgv-*֏lVl߅QIR>'I?}G}m9aO7*:YRR(o/=ΐU~>C$NEnaZvqBi;5CtLy;E6y*֫bECj$x]!@+zO̚T٨&m|qt":B*lm)5LBf} yNG$lk,aJA,)M˵u(FSgNĂ~,CJbT4Ғb6]OvؙF0Q jt'mp8]M(:۱FV>Xe KŨMU'e:פ:sét+BZFбNlCBj~(T(Ƥ-?N+՘/Hp#[]JT{9FYw1u{Zړؙ7+dX]!(aX (!ҢYWZ`,rrRedG|Tj]:ml(CS"ux8ÛjŒN؟3LSWrY;*Xd 5!ӥnq) ؕiOFRft]M8f BNevOhFk)?˅!hp)  O%P3Dv܊THCd"aN:JQlEIM,[sb$Z;ǵ2?0 i.QHqܝ_%СG>8dza9ŧm7EVJF~1J-mKc ݆ougVʿ(kh'oecQ]fĤ-]ae3e9J2o[J︹ 5y8U Y.e' $^p1˜awl U}JS)>#b q,w+cn}D}OMV{FծP=,e|V"6ञXnO&SV3?)%@Y@HXˮԞs˷.ھZ'(T4aK#X^Q6 nHd)7 JZR~cd ]2J4|Šo,S}*դC{tӌSL)$uPKzM6LC,Pm}̸iy)8gh%m>eIid? lU(z+~\C:Q'X ;u);M>Jyޏ:xGI I:ш~r\3Q RcYv`4S)Gۗk{Χ8Z5%\Y+M])IK.׿:d9iR It0WLu\ce]=_2%AĄ.(X|{򢏛/ ޅ% >^Qu#ܨOuTS5 M폪q;ѥG'Q1O+FqڀU9Z%7?D%*}LšVNu'd_n3f lRs)CsW ߊweQ~D'_z9eJ_Gn ㌲P5:%MBԃwpB㟧:̮ v^*̄%ՙJJ:T+P歊o<OZ*t<ҌrRқ*AW']w<+ud.Juq$A;cck}gܢui$'P7qX[Zd7K)aH" 4F.2~ 7;O|r=5a'J,X-kag&El~;Y_?f{ޤ_`D7wW)UZЄIw|qYByV_fڴ摊>`e&̤iEy~0>#Q^mȒPPtCM=C1R#>{ ^-j%ꍋ_UI#XGnU`xָFWv"e<%˽QP%,*I1lKps@Zk\9ܓ}djl@کpMbu?eۘ³5G'QC6# GQLfB67Om 偝j k:"W%ZYjnL,L.׌}^qI$qsDaڢQTPNR2!4'JLy p_}O ̟H*N3 )E"Ki?"zzÕt6f8Cv#Q H%"SB GuvwEeCGG)]ǘa|.%8+J˲I!eHqXW#SӠb$cHUxm`UyTKQHt'iq4Jٿ{jN9n%NwPFʇR VW"9 =>1g";}e + VS&tY}^ XnpgFVo> '"CWj vF4VJ4ړ{vRPq Z]Q]] el<'"ɩ~Hmgi#nqNm#j[ )FT U =aGplSEXc3! iքҀ*N*ӣMXxJ|MT8vd!RT}\~C9wFC{mkq(AOübmk"cU] 6z Z;:;wZYkRL]1ŶT5[n[5 uDtjJPd\uTl?`Z?֛^8gG>ᡦd\7HIIym|I*>qSt\33o0\tbͅ>eL ӥ|Acl$٭CJW!]` 9w1P՘ECR8H[5l6$8zx {8׾ +B>OE8SĴRNǨfnLFpn}>kYcSMе\?5Dnr)*P}'HRj1*oI-f6۞**/*aNLDSCt1H݆ggm+%ĘT*VemYda PVzo=W2>DNL\r2[R.u-V~5{1UMm:QH{Q!"Ô])dRRϞ=a͓AML9w)(vV{&r)Ib-},ŔsB*,9^ JR卵qtpMA Jȱ)7Fr>zwU{ړ*ƫ27L׳nQ){ef LşǸ'݊=6[z  O>*E;n6o*d_2Lֺ]%ք]I7aLD\Dҩsv4`wv~+LjR*0"ZYpqt+c߿*%ΫrB'n' WOĄNTjs&l#N:HW>_nimKd}V$8sAKPq-QX*]ӎ-( h^׵;Rg>[CF=N1pYH=[N~ (2VљM8Xl1Dt2| =[^|Q3"~EZm?M" P+]l~L.R5;d~86+ISZIKV u~JM˧߸cp˽iDo3b ) Z,S=#F/AT vl#:hjњ&[jY%yO-[܏xO-&1 udjWov`sԲ?Cnn~}mF Sr]}zuֵUˌT,̥[Zi=Mx%`DhXa+Tj礛)C˘3D*EMiBNqIH~<ܻH9VPAG͹*)Ui3c) pR\#p\g{yZqѭ4t#7CF|%xmAwbE{9U^mu'ĨMFܨdooKfAɐ")8r2 SJҭbLnd SGB'a}DFi7&U9&BڕvlyY=+{/P?S!7-! hp'cGJ@~=wP0đXRKN㊍#7ԦIUFЎIZ0̚]t=U,;#Lթ[a$=C]>8GZnZzVVS%**cq|Lelc=Uȫqw~;Nv:6p8]T/X"WrT6=߇̺\ /|uIԒT.xNB6_SYwS/~9RmY4q?wϻJN$Qq x|ղַVwʷTN!upKim# "ebJN:d;dcQC!2W <\-3ԗ@Gm֑a\ sW'Lu+r pS`M[mQ#/6Kb3֨&Чlv3UB:TҞ[7Uz1}ƿ [Ҫ+5-^imߢSWrը?9R%N~'I# U]Y A;>8|)R):|~TYˌ#m8qʒҲoe% jm2U KECuH cQ!VZqvVm/Nk :Qt2tۼmJM#mƉ t Jܰҽji3bIQtot\P.Ou!N_ CP+U/]\>vmlp?o/URӦz T.)y9.PF( |mե^X9(R,wӜ]HJE\؂99G)M+M*A)܃ o(d xG%B RS{,R+,H39 lUC8S%jutjtm#tmlLSS{):j8)׸bqu)O´Oېi8Z22ƙš%iGQZ;8>靑)E#A]RtX;5JރS9h6:V[Rn/~|ԿKMk"jNyrT|Sb-W(RJu|"NGW;beỏ}0x,q L9I=)MG Ue6] qO4lz6|McA|6mL/Skoz:N,DM tT\+J$\)؍jI-0írn+Aq-]jld Q:<}r[.;(ڝG 2'ufv76y`G̐LUw>Jct D}J1_AfJ>#auLo;#hXWJc02Ȣk\BAI函(S <:dBrq4s7Fp͓M7 \u[q+J:V AnD|@ҩi֍pG~#ɟJ̴8=;uw\kgb,hR»EK*t8FA<%uĝ0K5"V2SݵiVV9FJCM28<7nn;ϣ >jEL%pB=mѥzQ\en>@'G O}~XRJ($),CʔI45ն)> 6왪I&*y*`WToV2Q->z*䔍Xj*'My⽓jloGky- n%g d9~#Zt,G}k҅9m5f37˗2k*RiY-萚J֎ꔫ}l;u^n[S"ԿQFc|~|sUYTT Ҿ+t߳4@֧W.gB !/EShq[kU}{㎙VqB AXOBY|tNƥo^[ 9$lq7턇W]%R=u8bǚ&?ڢ6{JB~a,-';}.՛) w8-N t6Q? ΍N^LA;]NLPJ@6:|;UPlISkMpRVƣ3[6S;am}}oyVϒ%$(Zw2<ż܉,I=fc};`}I ;q-c~oE[Sr(U#<7ԯ1;ew y)q"HY>~c^ꀏ0`0fea!4Gt;BO5&E:R>ۅܡ[%1n8>݊HI*tQ]EDyi؃0{ͧiV4a=.ؔ shWT&F*[wl 5ns//4ñU(~!-<*Y5zJMB]Gm:5W>ڭT*MSoSG୰؞ &2Er:orG1/HdTH|9t^3I>Ӿ#Wri4HRʇ^<ôefP)2`߳Rz.>U2|B1ez[犾ArRͮKӌ(7x WA)ԶХTb/K~s.%j.G E=a+1e#tp'dcns{ߞ=ޞ:bK嵁'qW45ǝq2i=fBujlUF%& T\qZqVtOh@ι++Ӑ>oBz:tޝL*;;?""zi(\t4ҥ ͕e fG ?g6&]Ꭼۻ iɥXq^vba*QJÌH* C}g P:DD\Ad6:݌W|G# 4z{8cU[e mpq)#XJHc%V+QC䶽<"D(ƛcU:4Ra꜈;KjhᎥ6<UA3 lEh&ZhMӰwBQhPvXb݇e:wJӪ+WaU܋<o$xn1N:c !DyX߆:L!G'Ic"l^AYNp#S Nc*d) G]fTeKi2,:ZqňqU!)ͩE ~Uka#Ey:ѱUi/ยӿ,q=j\v"C _[jM>ER|Je[JЄ¼uI1rxTYLzO% b5=43 Ŵk' ':[iMa-BT⤪߇ JdHr>QsLMr[ڐ=SsQ%Y"J PT{7,Y&n{X%jB!IR;q۪iZTXJǘƪdG/>pU~i? [*RM9_#?.uL_Q@jĦI\h%Kώ*isu&# a Eb۬e>[G2ˆpVC:k"lOYqՙ *UrZ>!cYL'VjF^z\um$,;SG]#92nK=ҵ%B#b;ReG6\ J=hTi:7q;gK8.c @ I#2?#T=]_(-Y;$H*3ۉ%ncry'G*LNmОے  f7b+l.p\wI響7ly!7@lC圎Q8t!eirt[|p[jVG;'OOl]AEҡcI룰~!,p~<~L)Ŏf) P'J4΃my݇} Rr\$Ayr\=)U~pT#QZ x2l)ַ,{N#(VE + 2JOrlF:da& = Sⰵ)4( Af|mb=&S`}*\u~1|?vH}.rͼ.X6Ĝ˗R L7AWÕ8]2?#E=m$%Pw`,Y>}ʱTRU#JKS ꏎ>Q*6R]RR}`Kmɱv.B󱿞YS {7@yo\itX;AE{2}#gstOȽIUs&2%#S%n#s'9B%AO1<T[̇ltZBO0GV} (ΛHR hVas /QαBUT9_163j5n K-)?W)ٮe}xYGԔ7htMKzǀVP}aqԺԩJ%E&5|ar*Ӝn;!oJ68BJLVS3PL\nB?GyJ$'T/lz?C %R>pDw|&%<<:4(kD{:?X֑>eUSZ~'bN]J5{iP #I* ǯct8gVT|k?LmS"o+A9@?qL+ij'u!C]&Čtz7S5VI iv nSM6H nTW4;$oQR&+2KAᯘJSNkE8Omq)_ؒ-=g"O2yN9} hU=o ƫgdjN`B; }lDB2=Jqօ'X\xbGRf1T[ +XnbǞ)9,` Fx`vҕ+{i(5+_[nG7J6WWDRn{Sh{|Eε޴.k :ՒYқS-udtߔn qN,0b9-${Bδjj#ʼn.<n#Zo>N=94Lys=[|aElgԓpyt>PJ x IIԜ=RKyDȦ5]G <6iه";1z,t~MHOƤqȗuHZMҴ(Q~ti\*4 PSKkN%I$~5dlvo W6-iշ!f{DϤV)/{w-#%EbA5wj;4_e\|˅fƄoaGY|4OdjJVSm2Q \&ݲQ$oRv6 Zq0!Jj$pjdxuV \0w~I*˪anhJ65owt]lIBLJBq"W|'bSro˒!%«x(|G)I3OHgzM~ITa@le*3~{b)ޑKNzh cȑk<>K?tϜsU*C2Y!PH/8 /˻}\uІFw#_W :-mZV$cIJ?IqLn{l@yFU.;QX,3*R VX[kc[~N=dTHp_@tA`}7! ԰,o izZ,Sa~Je^ẔG~hwx~T!GJجe.ҵ7Ĉq"C ֏0vjW 898vW)fIUF?dbIM8LY(H8K%d o w1&d}亊Mjd*N{-/i6%iMx"(W'-,[vhJB5ӫ"$2"^Y|Nc$mx011&f͘ԘCoǃRƮWy_PhRd53s$yGgP &j#-c.V]]YjfJuuR{]*U=f$\"GdTM~xeW% SUHSbmѧ"әЗ"io'D[N.kuT'Bzīqr>VHL)ȑ8f{STCDY)AS}dS~{퇦TD8ؖ|NyvqѨ}d i,tu8\kVm+~8w-Ur!Zu%4a-v$vH6( 9eh%'֊¤>%" MxuV*TKԎbeR .s}l~IWԂA 8Ry.գ j,Mp䖽]w4v,~F[QPWa7U#|{j}gr9*\g9kWff*=ܷ—]ΑI\ui6 dʽJIaI) Mm'WPRV5B)B.a|K4K _hY7BqWy2PPfg[=m" #ܴL/2G0?X_qnnW}NR"B@[RbM=hr>—H[ B C{8&DGL}va3e5Ƅu@mY^YY;ҁ`zM$w\/o=ZY9Y\NQ$5JΝ|;B)KMJr <-lʠk% T}\R4"8HoM9ѲPw.(?KRQ$7fX8NwT5n}&5MgJr~NI:u+`&JGUC~ߐbc4e$`R^j_gMTt™te1=1ImA%J"wb\C)Bm[,C{.ר05gBSJ|>T将 hQ:XEl쫓#{⏙<.mSw*7WaUmG1h1t]?F}zT[N#fd&)se=o7>թi^t;Էu5d*;8+p &7:QMەaSTjN |qL93t,Do.'DŐS{E-T7p܂H:\mؒ +uܝo/OQ]8'DcSkdGRqѣq$_]߈9婱 Ԛ|_hdX6\=)8J7JSs̲ۼ]-]z\g|GDC'Y P7"jOqO"đ>F(eCG8 fo>`(Q K;棉O]#؟bU0ߣJA1ݫ8j[C~VZgp@`d&χRGWWQO(pԵ|Tm ԠJTFܻUy4<UvDGHsLn_*;3Ca M={+%*IN'xzduT;/'*>W:Mr. X⶚\LJ!)#NYSAjJX UrO1) K=&AFu⥓3c̆EBLp9{{qQ=#R8ғPOC*<g+9*M+-{cbZpg diQJݏmTqtJiËd/-<CV>:= d#Ӂ^vV⭗sSӂ%7QۃagV-RO*jzp-[mqk`Gsr˪aKdi;y}לf],,?C̤G[aKJ;\ߊ-R UB$kBU팹qRK.kk@= qB5Pz4V*E?[[,[W,QV_"ԩ*KmlbO$t-zctg-B|ta7-ɠkm,tJ'\ikl[jJ|F.zeN`UX^^L*_Ci1b%[@a7>CJ*Clh\HlA_,NX3 RF [GHCF' uCiRQRh+ՄF~BYJ_ѐ;'מs[촗dޓ)u& t#ԫuk|ò)C~<[^2DHJLva!@ 1cvejf=JY.I?Y 'l?$OpsTڄҩ -"}~w.\\舓fJGY;|أȥLlǗL=8N~sNSmm RyK)ɔ1R{%!v~U"Ҳ\ wM7svmr=)^cBWRʁWr4 QF,-$$$6#87,Zt~8ETVu ulp8"!WMΏ[ꐥ/ 3SJ\p\m B(ELkN<ڵn<1#$h5~<=KM)7bND]m̗OE\ Hv2S P}.bI_AIP<i_mȓI$ I(=ܹ*}j"٫T .|*j SqڲzQ~r,R[ۜzC)i+n\tf*V*.4RJi{d}u7_ʥN^dCW_sހ|:? W!ecTJt[{Ma:LR]p7S`dY4&r6&3DQk8wLT# h3)W|.wClԛ_oQ{8Ï8Pmħ%DŽtY *J6DSǼZcktI)vG4o Zi W+882^( M:,'!1AQaq ?!dcɾdn)JO&򞄮`]rU7 aҵh Bd;z.NuՀ}PY6a\qF,{/>M:`HPVIāA;a>$ݿx7Ò휨k\Ň@3O5$ YO ߱8)6d;Y#ZnnZ 9ل8m6x"Im̷@¿,ME7" ! .X%Arzaτz*~ ;ptxnh]w(U>]#63rPC m'@O3qxxGQ4~m=eփa,I]xrX>iA:1ew`*5SqQ~&j8|Wڀvyq̸%[ɴp}UjhR o\-)IP&.@v6W->9oЊkc15>g#X Pc44J 鰽u+xb3<.iңĉ,+Iۙ,GeA܀҂Tr8em#zWd|zy.g'ajL".R@Ѧ%Hx.W3ZL%i":ca A 0u^if.qƞ)4^0yI5 66'yxMp$k6lgi& gn蝯-LfMrC6O= E@:f4IąDh|1;9}PF8kN>HLՄaHsrݦ 33t 'Q!313D:o@:%xM 9A" _j p26깦PC]*bE *>iU;Rf5tOi4H*A;qB Wg.k}vmY,7ZHZ=$ldL*d0b BW\{Jyۜ8~2n$,IW}ŵapD=3Tߺ 7B9aGŭӄ4N]]e[S+Qy@NB{iPlFaxb;y @1xF#wAnaZJHv20|)UؽsP(QrCw! Dʪ)J (tv8gED^SCa Ѧ|԰B SCV+7Wȶ^Pa:+mXk9cCƽ],K-B_R 18 i7`> _w#M7C\䯑Eax??A{4&'㤞pS T5%z"`|: kBt*BCs@!tA7xtM:RߥO~EnTa)IIpNXE۳xz.u{P+Në{Z(AJ k?Ao3V5L6H6]1E Q"匕}Kbȃ\Mf!Hh1n6"-2ǜ v cyy8v')ӑeCǝ5 @Ҿy[$P ;TiєIgɬyVR3E X2ӐzTkT hwyt@OErH-Lpf^G]aĈLaSroS-Dv3(eR ]'8ZGr{iv̏Bw\=k|po~ Eoc\x?XeeTA?J{=o,oKV87V -Љ(řԏ ^KF^Mb@~$A,g8m(`vbb'9bu51+.KӜ>|.WY+7(FFܯ xڶCQ[ ]/5HGH+.JyE3lvƃn].d}SIRP*$6:aav'"]nE٬q !QiPA( <ג\h ҏMe&k_`6D+2% 8R|2ۡ&rLT^h۔fW嵺aI҃YgQ΢tA)Ғ aF!~()PdObGmV7M5l~Z"{5D?$\a:<VGAhAw#Fߟo BnC^ hyl<jT:sa!/&X-ё$l)n-R9ߜQRAf$ #C{ǟ=َ%9;r9M(ʸŎ(yݓs}On{X^+t'|t"7\PϿَ`Nt\E6p`~ 0V]ۈ9/7NG3t>1.".H7g*rwBH= ܉wBkdqiZ8]Tqg=XZy 6#<1jq 1}Zƭ6 C#7˰w ]3^\F]P/p}ixB>gSD!b&E.PE1a8(b^ 3iH׼f@ւ7U^+ϋc' B I920!Lո^:=^ p@reY*bVhENRz섣0? bF81:]BzsRogs 'lA YÓQ^XrF@ vwoy"S %5۪y2tt/̗//$+GM10k|j Œy GC.hso\mVÔdaTp)j6>KdT1Fx_8p#}ޱpnǎ;-`j=F6nsER*͹4%tl;۟rxpF soZ4k J kjmo#|2%W 'BR(43CЈ 76ŵQbKA By.gmv9Vu)ئWcz0S>![KǬ2c7.:fgJl1Ux"_zt-ߛPv)^:jns*]2ei-VAEF,gyB+L!6Usƶ.D!T>Veލ#й,~TKS4Te~1, 4'3MqZNɋ"EӋG2[8 v#yp%t56N֍7LM ٓ{b@%@\Vzݾ!=p[?p, Fpg!>]~R4;"MmgDPҡZ  hg47˨c6D4]8U*TC%jq!XVcpGO1\ {;^7Ȱk-_m9$;:޷F+G[( \6q^3ŧ/lb"ê/ٚ&}35ӍhydsMi|4tE$O% yh^09npE7ǝ8reRC|q&mmU|*7gF3X۞߸p}r7u!@_^c{3͡AB(]Cx%FjU{/eT) T|*r 3N175ia lVESc+ QX@#g)FD:kɱS 3΢`УfrqKo{pD;\>$uJǟ@fp&wh^q1I$@֕o Q1u=N1C>[xYcՍU~i7+?vaSl]6^,'nzMupB&:yN.G5ȀO C4C @d8!ٰ/"UWy6ot_GZ] {EJ&T 1'# #kʲ, >dLUy Z͜7h*Ӯ j" uV}Úsfiy̴6n ޕ= 4Y-$07LV"rH2!4`Sl_DZZD|!!T&L.1_B .O f7JciѢl;q[xc֩غ48Y)oXph1|sfŽsWVIJE[,EE r`Gqt 36jӶd48 PɿzZm'ۄG0"z 9#y<1BDt㮘AJcd9iHFϦ 9]Z1g84(b mXkQݔ8"0&ΑeDLIC`HQOg Ƌ2 LOpX*F - QN1*˳TG"NOR5Vi鱻 ivZ9ăe> y(HNEVzQHnn^uX;VFvTl/,1;M9#%M S[29^G #BpK!X$KZ쒌}KT/Q8 ^qMHLܹ씡b긾&l-|%:ΞZFe5p1ߑɃ0y[߭_͉fMiFRw%'Og6 X9GOI׼VuGῘ{lNT 9˃]jM e<M { <] K}MwvU`.,m|vÄ& n4+۝Z& Z*^M 9zPlm7ţ>E1[Մ^9ɼ ɪ Mˈ4`Yf+m%뀑-ΖC_\_ٜDl &n$YV_~ `;/5vX\L1@/ <9gկ~p*u^3B0v=ucP@zU6:(ڻIlAt㍮a:1jf)(nav٬bPnp2#κ(\r@y~̳ԣ55L  5퓂;77#35op@NfzȈrCԮYh=;#;1Mu;@u^a#eP{y2|=Ϭ="P7Dp#5K %+QP{Tiw"3I%;ݦ \B";B;񋐅`9q?-Omt6u!BPImiM毀5}Kcoba>ծTN4,2,E:D&xe(iESu?8-ybhӺ/f)8M@+cVTMt0C侹3N5!~##d{cgoɇXSZx֬6@ҁ,|S<z<U%5V ."Hv^!ڹ@"n6VV y[HI૮& Iߑ&i.WKi1Rq봐2Y {'*s+.fBl OqJ)c)p)( 4Ӆo#M:n; [Q8?f Si3onS^d扦cGYDHWAS< Tu)" PO@xG~F.}"1p$ZFf=.K7O@Nyf?{l\d,S1oSŮj3ybFSjvbd-xe]FCϧƶÖzE]>λqD[]ءhށWqLMocP+Nrw\g)#$D4R0vbJO=I ~hT!'삉W BtR)9Vy X+Avs ۸ =tN-`XMμ #Yƥ =4-]k##Br`,x +4@a'OЋ6j%|5 {.bY|wo]?|!=I]Aᷖr6\gDFB4`A`p9^&̋[ x."_Έ ~LEqNcnQUi8T Ac4t.TE.$YQ?tZأ\#z[m:ZD_`zUʥQV %Srb Mp'^76@8<Mc@MhA㣜jW&:L{hɩ17O"0.Q'B Z=n"6@qBErej oQ۸ n9]_BixpH }1(܆pgK}p0 rQDM*6I,.ҵ)m9dAjDϤ(Pe;R$b5JDA.Ev˯lY]*و; %tqʅL?Cb13Y,Q aN%w@WLd8\N5<K7ne~rGR1)bp/)wYt9X>!<XIc_`xae'b+  pPH/ϟdnddx1Hϗ+j(Bjya #qdYd_{J*y]&'`;|zFoi]Љ2|.9}9u` yƓ˜T&͔MCx1+^q[_g-hkI;xj196Z6[\Q>3u8r:xQ=EzD1.\Sū;){,4tp7ƞnn1szz^EsV"!Pfu~‘';8Mᒢ GhsӮF͛Ċ$w(q$d=-PU#͍ba}DL,Z`7*i;]h4&etLxx }Q=`A6fMAhyPu!84l, Ie$VtuUX/` ϖ }V`'qDS[>uH6n/ƽ=;>21ămh!oٮ=XknG1]Nh.o_GԧLp_hS Wjޏw @;a}E֊8^h:BtxlJ5`9tC ƹ` Ph(i٬=ulB8scհE|4̡!wHp)cKi79;5@P~u7Lu؜iLf%˃☎.$8uS;6[F|F\(\;`7a.thuƪC]']w|-탢!.לJ`-IqT1H a<eoAE68<#QTXuY<͔¨S `V8([#T$qd;x#`Fahg[*j2]8xf,dxB(oh+)% K'8%X-:84K:u-j\'FyiJt9Qڶ-wgDkK"Th8H:X:uh-Kn.Ma Kw'1 d12_Z[4š!f)ʦ#xµ/ڒCCnϙ[m)%K +vo7> <2dWg&yՇ;0-L㭤:liQ_CqV%Zʯ=j%U=tP0a v,qo: ӹ:NX-ǎg#z͸|tY2;S>83|>+!1jͰ}[F*{>2$֓۰`#q7-ptkNQɉui#:K4*/桽~Q}t xA ^XU}`jyf%kz 3v OǸu6N@5{81]jcvP5s-ӊ\[IPN &P 6"%=`ez3Sh*ڏY]j@T{MǬEm"`MX>LD@f[]%L!x791p*]S3 Cs[Gyn1PY|1}8cqyc,G&qY>mBf]»4v'Mǰ𦦽k4n Ơ>?͛j*^"87LUpO+rLӛ915 obsG<`p$!b0Ʒn(ԥ^ |`jC{JxѮ]7IUX8u#鯾pIƐa4R,e< @fjPr1al=d£[N* qq5jBzp󌫟"ֿ2i=䅖^ȪS-I&+U&؟0ND{^jo0O+x #o<.jpҋ8j>\`;REe[)RO/gw w* }tk iPu8ShZr͙ƴ !|rD.ذ]/K'!$"~0N7bRoe=N^0G6*u[ 3N@\3Lρx/7GFr9dOX.Lm `Dt*TPm|'0\An%~'I#B|8_1eO+h4!y_#BSf"žUy,7LLx>X̟JKf2i~ل{ ]aC _C1B0<%O d^KaӦsXE%`Mi„3W9aۑku&8`C]4{]ʅ=eto+ ]eD 6j>³dm`4Ƥ40"J(Qr* 7M%#ܵfM(Zd]`*ڎˑ^r?FG#jy'e{=8k{(| sH`՛Og9lv+{^.fXt}Lؿ!cӐ@%uZL"H5ƝtSm'Nu B*Sβ%}b'bu4H!exAbrty3M17"/`M6I3YϏy:Mo+J`ڻq47}4#͢5B(9.Y'xE ǬThkHQ!$Z9^`6=H%yƌ厓h70_wqeg3y*BY}j y5@tfx!ọh Xfy VT:yn5f27[>!3o(6GOߧr6k 8n鸆7dqk>,V VtLG#awsg(P=-f /P. QQ&^8s g3gQL䢂UfH nU^z> ypAQ_xQkASz,Cd FfAu۳T~EkE-yūg V2C/f_x3yٖDZnNAgYc9+"LULS? \By?-k#0&2d^X^ByfBw|bq4 Nاֵ+Qt]zƊm݃YJs,I+ 'py .Z(pj!$JBx(j"=zsDbѫ`]#$xYf,l®]@7*?qe }au䃏Ȩ!cӇN~, LJTHȱu@My`O\ gu->(=\i4`sr@/mNMT[@;]/@YlڌsC07'Mp_"lr(VqL!5SpXgZёڂ g o4) F8ɁG zCh{1ܞߐmܯ-w ǯ_AS_x]]s4" p;8?|1<'Y˜s`.bl$kIס°MxU!ŋ b u@B5e |a+ٵ7GD` #!:Z9}.[ A < G##ոh勗<\(n"Da354]識ML C/@ nL 77x|qS2|){epm@.K_y}Rvc>0յk{Y*y*-%u Y9Sb[Y9v:S:܌4kiG-b{;q\)Zty]\e퟼pNu9m⧶`a{0N]b>a9͔@^&- Nt,:Jpνa 6UrXS}ZYt䞽(q,? Dm{[̃_:<8,xTzaxl7JMx܍ 5Thp^\RPxN5uP ^$/3 l H\:Q__oe >/ D)2AQͲ:l_D*FO0:ea[wXMR_ko`\ss:PcVwEÕ0(m=.}p%?%ٜ^pem7> sGItw@J '4I7@Dk dg ;1.xFb,SF~c+UT|8 vOQ( U*lT ;qN>BvOCtA/aysCƈG:=9qa.Y'c9n.< Dg3zŎ[%=eȡv {QC"p=9w '~P. [O4 ӭ?F;qCG0o÷"$X˛tuu&^NHC]{C^r]'qIqDt$p= ~aziK^Xp,q S NNc(w ˏQ.$ qO/%cuxShS%zma;588Eފ&@ XK| T`!Ϝ;Hku xJ2DXoR{//xt$9%X:xz"0% o$|M }\~0[isuً 7^rнL'l2ՑVvf ݛ /s ,r5r<償b!XQIL}+e+VO)Eaަ6J\ݻ5?\f?T #:q9j}Ss)NA@Vo'}J.{)ce ؜K|JѯdHxВ(LQ'Zqs2iW޻^H郒-hGgaM-mAO&a'z^:59FvGX2v+nt`]ub373-֒ p~գ,2&\C-57oeжp ]P+ٝ}Eŧq]$ {?ېM~RjGnj=瑪ZK 0@1yӋ-[JBCg~p18旉0UCN6SZfI+7:L=!MhH~hMU`O{ >00<mv\Fxo~~"mKsҦ΅KtP}ym;9Ǽs.umW pK8᧒w.JM'>!7SU5G\`ʪ^ʦN.fpܿ'5»s.Df.i%aS~X :9 ;klݸ7 h<CTu#U>=>F'>2ݡ[A!4Rӯ9(`7q/~x9!Gχ:K!{s8[q} F[REU~?e1%&Vy)AoUPxN P~@^@ 9N~rf >x58_ ҠٰxGp6,q:`;8pg;ĝwrpb؞Kxaz0E'7Yz1 )Y'@!^}PXDWe S_;vQإs9FQYð'"l5g~Qݑ ۇ @V&7(!j槠F) [t֑Nb ҸU`eYY{= 5BUĮ5 泟Xz4ࠔf)^&yiS||`hvυ<|*|c̓Pjhqə{H#y/zN &;xk ԤN/Ű-oy7"Y{ȤyVeE|tevUXݥ\\&ڱ:c V>B r )7KuH'>-hn0yq&([XPtEy`[Ekcq$Mmvʟcf>?"]Dp%7\8pnmr8n1jeS@I3J躎 wI{͌1/}c\wӎ=ܗhxyo8J vwI3} W3r :#/khq ރ)C/_$rۺы#p۾TDU=vD> 0!Ig.M%aA'v])?W4h54Wg6Tkzo5Az1CHwx=М{ͭnʗOg*V0 դ˼9:pAuu{H7 Xe(5 y>2Yʧjv:r7TEM ]}^U9KH1*Iu{9>@vm mpnZ>o-(5k\\kX]KMDGkn eft>&?eAl95Vh81D,:`Hܿ3 `Vȃt WWg?7BӬuκ$ፔgkx)aNzqA{½r-A:e: ^⛧}OX(lYn1CwxyhZxZ1"Ѝm Ɋ:_hkn=<j0TW'"F Bg&dBc|˼:롓]I6e@s#5Pjbs@ =i$$K@@io7@;A#*LӐG#D.:uJevxRt9¤)I؇=(qVu{bmkz>0n߂R?$ i0&nOPϕޯ*& I)Ym8VV8N !#M*7,56P~=>?pu[ì8g+Kb}.zD*8M'H\99 XRxRYꛬ{|?t+xqie zzOGְg~]ԁߗ zUr[`@6Z'A6/IJc-Y9}.PuRXjcKXHLfϓ E|jU]ezP Q7j[Ms\^&<1Ivx s uS܀Sȯp3}=NFtzW}q ^7P[CBxq}?f:ߝ䔏Y>=-ZXO{q \*fg^.tn ZA|% &˾r9I B6L[v}R]p<ΪIL;4uPRWc_zyO55'IE "5DmB4 p<r,r>Toѩ7e-z_LpNvNP{宝#L0 78(XfE8.I_10D NQtv~DKDf!.ЂGr*J#T6Fw퍱o{(^NX?_tvENssxX{3G3er K8- R 嫫1I*=b7cƁwnDaJٿp78CE 9]D4  Uߩi$f2$4[l7đ" Ro_ejaZ Y |Ab '?Uz>?r}5tNIqj%2rB̢Pa9Ii }Ҹh>EFdmj2cEɱ"TXc#^Δr?b{4Yca-c_y@F 51I5aprTw{`!?1a8^@Ƀ-% cy$BoW8;F>v<ĸʷ6nx_ɜF;?݁*GOIt|(B:^$b[|k/ο?xVՃ_NÁ)028)9V?o_#>^"YR q?n\FV]^@rO*m2s1f5Dչf;;X@`7o\W B Z|t փ/DgI޷8 ,6Œ084(qr80ufAì@-4ATsy/ku"Z oESV mAv9-Ij<' +G+x$be@BIB 1 MdOs]bœOoϞrL&^0ާXTDxl42 D܈X+E^0W8Éy˲$]s%}9O ;xDW#*yqU4Dct$ ,FlBQ07buriˈBW=RE6DsDNW93\2fl+4"m'):8DDٳi:8L$jFk#~Ċ1ЛтPH<ofk?xXGsZst^MĻqGHf Wuhq'g'!C>&[(R:ѴD2D59` :1P qMR+ ,P eFDgTs LZ(lK<1z``DRʆ 'iHu驶gR8;67\HC~'Ov9kÝJ_1 ~?1vſ󉫑HS8 kPcy8hT&~5^GmDp~^2{Nєs8@eF(JJ#'r]|"HfAl ٴtbj4+pCM㖂Hp WhޔϪF+j@$ul6:Ld._?'Vv q0Oq*kb*a_ci?v!;d܆r ^ @ #UA=c"Ȯ0!MdJM`RRPV;w۰,:QM,F8 e!H[TٴVW  L@wN)"8U-Y"G~9b~68mO8y`\ɠ߿$&BK؀~%s#u }*B@XG$M`ؤ !T&5AS3K|KIJNA"&' <`] ;&Xjz5'<*4%Ƹ_mL9yiߜY)Rw?,o++1k__9Q氢l"==1D>N?Cp\guPc2;ޫAIˤ |Aiz!ԕ;؏?S BPY')T.77XnJ!Ӎ0H$"p܋ k/mkZM1tL[GgLbWׅ qxA\~臧_w]{BOq&An/ҸȉyB+sL`M@@]C*F\dH&`F|@q`j:]LD@Tlbd+p$h"$"@lERۜ<y7S1P<}1)NjyQ]K_{_pʚԱ81fM {ȧF A1GKcd(Jbe+XXiJ`YlqL|`DYvΌ&VpPUu w>#@K#]0tx]l7e#ا WtLāKxN|8^x(/zb:Jh]DP"tr$͙џaC?P f4E\α24Ej`%\`B݋b& qJI(hUIZU-6s۬鮄m0BԕME7 h%Ji౪"g LHG߼Qؓ)G~$r?G=19dOO0'E =!h}8yșᛱ )e-DL!I`]oP1W8KsI#˟#?m”v&pvʼnw u8g]{ Ox@"@Hv )S5 3s\T?b)…r;LxUU9k&ZgHtjA>}aqJ$~/k,?dM}a) d>4g %˓Hɓ;Aڼ9y!s ʊKL5 -k3!3~ᇄ~R <(6.U̔DAHXӬ Mՙ;QTV90TJ@FlfY4=t~2g*zj(32Ԛv6A!#Yϼ5 35?`p>Q Ӣ2@q 6StqH-ѣ Fxspx :Lr#\;vZOD萘_-> 4DLtn.yrA(xB0᎐?Ĕ3M>}IȈ=bYTv#\aw BZDG({9:N=ҽ"I-RjeK!. D܌N#& >mGCz@1 43ц xIi挎NU_TIF"jar?xRv²!YAÒ*v2'T]% $!๚/0Z/HrEL$^ ]fx )eR,#?ׂQ#Ȃa;s]E}GeKIhMd1ekP!~?%dQsbT2" 233vsL,NSK@}fLg~{NƩeQP),{qe'H.M|bNifǓq QR蠟\f'fQJ($\$y;eUs5{br u!ߠ`[#YhUe 38;D~g B4zTMGԂ^Pfw?b E @TwA`b3QRLk 0THؔ-܃pYX90YeqeJoE2&Hd:C(˳1Iƚxg92eϬ߮,j":s~P>?}pzs|Z|̋qz $`ů frXAd3}؇8RfQ\%Z2\O닋JҨC+d28k*1 #[C,3RLK"Fdr:`VyapRޮ;_Nb`U|\}5b; 2p+pxM'V_|gM287O4qkAj$W${#ɿ:x r\(7ޗn9$A!f< O|uyvhId;o .r=ּѯIKxs nAKex+)t YLkUKu_ >yp6nwvk"9;W3X$83,2>>(PTNc3㝆 ijMv1@篍ʣ5~[<$8@FFp"b;S!GW-\AWIqbuϋ珛]8WϋƋ[3^ E:^ĠE<O=p0@l9: !B8608膰 iQ 33TcDŽġ0κ9Ws~$yO܇r Gy?wN-#~!qO 9\2q1¯{ = MVH.%Rk;R 5dfIH.6E9ov;(Rz1N]_?1Ȉv^ F0D{еvݬq-2eָB v3puF炞(QY0E<,#(,Ȣ@E#/[!ZYҒo|lxC[xH6A}(ſnuv}8b\0NXi+N6 vr d($FЉؓyz9Ewr;Xzg$Wp#`N/rtElPbԤbZabl:DZ~BC*(#yLM-|cy+5NrU+a1W.` ^I:c\Mtf1F1S }aɏ|/}#JXC)"`}xq4 =(}B|~nO\**_NL>"I8D6uM(q}?/_M%6LiPZSntTvӠ"ᅣ Z%'!U~8ch s 6 "nl;KiO* 97X+xvY0MHK..$@ގITׂe 7'H5`B.Oyԃ i~DKB? ʨ108uDyIs<)tzփ@Ezѧc[͎ec? ; >K3y?dGA'`Oɟ~# Vgr9y=XfQP,q뮳969xZے=+0buQ˜Ĥf\$n-X8ڝ`aUn)97(S.DU9P1!8(@I?: Yz`G'^H5pN3gvB36b>!ڍ@`H+8 zH9fUi#G™GgH7!6*Ot?X<8vu_0L7{+@ę"g۽<\/B A&'Ô$kس>E)uụ'&aNūj=`FE9WF(Z .H=sMW82 Xx>x 03.Ӗi~/?=.$:R"`Q_V_X!H;ޣMdzYu Yđڼg|X Tw|l'qhqs'}))z 0aw<ٞT}IJ9pFJ늆{hDiƂ}0&ɰEWx`i)[Ѐ.R![Ƅ5|GЇ*$4dKc T-~$DF% ΐouSF 0&vq, LB e/<Ȑ܃ dFOuQ\QOo kz1;`ڢr^Ue?><_8:7lx) ~exW;r|g[D@CA_E{w &s倦Y1 {IC6:xXu6LF t0&)JYvɫL2֘LwQs"ro) Gp栉Pn[q?\!O H`&C{D]s%e="&1Ml\8}~|EW~@d>^|yӯz?:!.~>|Yz&M%F Xi.D 2EMY 90Ӿ($7> ɎL> |yB Q,UY jdo5X=)E`]8x8ޏ;?p: )¦i3FL:π֞3S*oTD~c8xJ"^JƩ\OL8Q4>'&/?by }7?'߶0/K p\0B)"V~/s $*ᒧ]u" :+~'3OTcx l8 +JI#ѿ㉜;<@(G{q*cV11*cPZ] uq,%(8e[64ʀazFOrZi 8#@Q|š\1rI 2QZ"@" s^~JϕϢ?b+Wryᄌ3~rLk BMpbn2)UMˊhHv3Xj-)]^ɳ,Y# $P }Mw/ <" I>F"v #/xwXͭ39ĥ8_<>|8)C -Z0Fgx }g1&U.0S R3'ir9<~2; c\>*:!$fċ8*~xV,+7E3%? N3aঅ]AND)gcqLM̾B e`;'*Żt)g chEv  *s RD] >㨘G-+. PMQ̞PTPԾpx36w ~#&r6|  $ JNPǚ& R3NҊHǖ>o+!\\D, $*6guUtrb"I8ۢ҄Q`&d]lTcO$IisKqe%^tD32(MԄKsUd"!J<.IP €e7*H܂7\""b?A*R@?<퓆B Ti{pk] 9KޝpDU8YY :*Z_%P&Se?CA(iN&zsYd~nτ+7B6RB `"BrL9N qL?x1&KzA1坴D{ǫ\WB#8N<8/#1 j ʔxmnL06ɨOiXC߀ݰF@ *WK6H?^|gJk! wQp1Mg( *2 Ѯe09l~NLЏ%r8 B|hT}ܒȂVؓpYHF#BS+48=7[bxcY4:R:YXYx[{ N*;y 2Ɗe pA*0 T(A5Զ2{7#K5ĪHLf!E,pƉǃ"* K@ځ9 T1 8D Xqdt0ނT&/BjY%JQA BW1w]֢ċhd#5̈́ƚ2I"*$|#'$(H´sXJs{U$prn(WO" LK"Q%%A-"rAyq"3$ *h@+<4Wt0KNמJ0GҐ  |_|S Z7ehU!H'7<)L !K4%T_8hvx4{U\s ` pC6Phzˇ;GbeU$ ~R)K> ΂B1EAݼ 0EKu,PD-#C{Ca*g!:H j !0 /78 0uXЋxf17) ! 05n z&YCd6ӡ)zY(>2S䤵zi>N)UUUzk](G1*1 |ϙe!=0GhrUqu *)hj рSMA Ɗ~*NG (o=/+ W_7në%ToA)|GX TGI4pBk@ջ,(DMe~mA6Z{Z sbn*h/,YVsń#J]IEG\zkH,pؕ%cJ&JHN*K@3JhSEE0/@eJ]7HŲ0yݶSZE)Wǭ4T7 '"I^Nr &Oc%ljJ(zޱa.'F%[A ln+eWZ:( UlzI,m` oc,X8``><|_"֔S4逧Y`rB $ {G $L"ԹĴr(aj0/xF@(,OxxWڂrf$A,V;Ә(Vh Q]EQ!Ĩ[VVTWC:@+9~ -/;"k#I/vRW,Q(BE6&Yˍ DD-WC0J>! xO OIFFdVV!9!0C7#ԱkY DX T' .=z`*%cǛ KFHypyYcS,l'S[(&M_e'x=2^,,(5&QZsd+@LDD9+T*;2ߍh7-a4kg|Sh؂?ԱWjkיwCI lbz ~4}~; oD[ >?8$Ev:`Z/Ep 4>AɛFR68b.[Q9cHU7ӊ%qa874:p 4L fR: e/C7D 5ɷ҃ &# G缅Ɏ`Vx{J(*.:7 biY r4Y!,#0nlYq0BV䠟9ӳ`f2xAaPj퀾 ,qҕYusdޛ^Іp䲤`b`ņM7iѲP;xC$]dDxpV s'VV.@7lizU Dv.vj4ˆ( ?_cf )seaa|:?)C1 !-M9NdmsR":`)8m)Hp <|y3peC$g(l9TV>AK$/H#}yGsЁLgُ _5oى@K 6IR3]`VA%S=D@ 0j VV-b-0J?G'$X.`p}gx5se N󙓫vZ)o""JN#fMel] ѥ$y3/V8>CIX1+DP2nc-gجy{ !Q$$2`@wJha F+(1+JKUOw|Q&< UfG2dRi.jLXZ9 5SvA1{A+7,.>j:꫄QXhP4TiFHRj'4kd6O-u ^$gQ(K/`uLcEs]\X/7@q,i)o$.ݍC fJ,h@d 3$Ù2 {[UJ$?AȤG<)pq Oq"Y) oZ DKL@y% { UδiJ :GJK&-\?8zm nh4m V dIq9,# 񭊒UDꂈ9b4F<'q4T \əlB)j}y40N%ЉO:񔑀5-EvC Hh v'_(q`Pa{<] ~HbBBTq:1HmPi"Q<,`ʹ(p!:h!Y3J(  Nׁw%LHCs1r%59xaճ|ccf>9؎6T* Zg@t6b?MJ@;`?!(Pz>%4?C}wpT4-ub7xa#XY)%-!U@ Q,DB%[9qrRzU}o S@ 6I$){iBQ:%ssk8l_KF4 `#0%#儊!PQ5P[a! ,QQ4"`h` D , iCgbAe X$bYVi-ӄ|Db[ѱ}sp ^sĞUD CŠ 'b(Łx@|$:TXe4\#~D)J]]CCAC1eF* DQb,Pt Li8%3KqS ]g!WDĺה05(u2bnO S&pZ +i⁄}jb,H 5Nt1\ A6ʜZ!Qg㟦\fЂN`r*T*,?3睍MsR0px=! <82NtAT@w|A 9yQ=,!J*һ2v2IP>y56qՐE@!Ex>=,2Y\0h,(#W366{ۯL33q7/qI5>^ (iJ>V͔F`- wʁ 7 z k ꧌81X/ ǥ`qd&@-&5TO40DG)b+}HT)x& /=$eT*}ukgEbyQpv]9P*MbP䠈~ 2J"b&~ !N&dAH|}^$c`ؘה.m$F9gX1Pp MՈ o3y5r C"@ ]U8s;[Yղ≎ No& ]kY\mL:b=Ax)EN/AyDO@xL(53C$DRRh G7fJԽ-u菴@CT*O (20Y aFf e`ɺbZ@⦙)D\_KRSeU!q n3db2$ҟŲ&AQQ dž UscS̢|~XG? r 881N-T0I|p IQ`1b`@|B&U X p6Ltl'`E)Rz@'7@Q$5x85,WČR _Epm%.Z1V=qE04Oe @hHC ԗ΄(&l6f@ 9Ƕ$I첸U֊$ƠH_kT!Ő/= K i 82Q?2\!0I#ŤUP{)8'Fh&;@)sW&XI>΃( 3{+gO{ͅM4)?oӰ~^H+4qMg5ꂂ&|2ðv9f?f^jEDֈR6yqV@彮G Ǡr4MJڧ6NR+4:QRA S4]G"X$lCդ ;pX H1+ϐ x 802+;@ ?zjFVR)+Bk :LXјCҘDj VџV M2&tB"zoxbo<'Ncڨ̠]rz*NpJ`Ddܡ$Pӡc渘057-4 0eL$U|ƒbڭGLeFQ"J ڂD*rR7 Q<ɪS2ꂥ1Ds 6sANaО<0 Z/SEOC4ZUb kу^@̓\N"Z`2OO/;y|]dtb1Iأ׎a "'(|Ɯ@ eWr{S:WWB heH  .QIN/hJ+BS:) EDbZ h? p=70 T1""L'2HMRǵY;Ł~{[5ΣfJ{T)f&ŠNʵр*`Z;"6B1!3A1WMoyX[1=g"Ծ M,H=ZmـӁZZaY%lt^JNHNdp3TFc( A7L#)n¬iR#-EpApMh?$ (vVraO#Њ*T6>dTT"*8c<X}@))Tÿsm)P@xQ=WgDq(e .o/v'CK~kPj<5@6k32rJ.`/G._ ^S72oZz^OvSauѧeh(꤆QxG?!&F\`Zq 9FDB.'F4# ߡ ⢻bYHP -Ac+j_Ng5#PD5ڲSrUl\zXp.D NGuZ6r@Q$/mO70%%S%y$*#U5t&57 _xЭGyEFZR<8oV?t_: iet9d# !Ajh&H%ӟ6SE,gZ# >R$ASr9N X.لk*$'"%#ZM8cڐ 02=7V8esƭc#E@}Jwb6'ohm8ڪHMڕ@ w>Gb'ꞇb[KP[ _#ς PBVMxr< wz1 T1K>;0 d,0_xwwoAh ?4 yP)Q͓aբ H.^7"eD8ˈQ!_Ic^~X8" RXl?5Zބ_`NG "MpIs5nr:hd0subE)8GqQIGAOGFTC09}8\8-~4(d;˾7@%W8=@np@ѓ4 MDR30a*~((,BhoGd~wyN@ j*́p^.eqd02EڡGIVV.F_s6SQ R6 w|  葍΁YncuqEc;3 4]D Ƴ.ɂiÊS;AF|~q= B6}Ǭ+T~KP>5oZPTQBI&"F߮ xE!y(%yy r/FmNaz'dm,-D\2Tㄅx~1CjWMUPK@}D,SPKRsR6 ݛTGOV, h7 |P"e&%%NK)dQ!ւWdGd +!XTQŬj%Gf@G^Yq' "*K-G \R>, GJA|GID eҦ@7mvo1vAf@ٛכ I"-U(Ld.&X갲(=wCQ3Da:EwP',O`1u x5q(<ǨT b.ӏ郚)zRe{t ֵg\8۶EUxt_LyV1Ȣ΄<"A[ BE8!j9*Ӽ &P/P3w4cA4҈%~lg/?NvBP!cŊ1i>@yHN 1(ZF~Mu[GQJmKQNm}F@$Oܔp0tbs߂e7hNv&4"7_3$Ζ WdΏVKZÜ( pPksShM$яLdă^2=۸GFTHB/M}I/O {-,|"gWB 1*P?\}^T7"F@w^B=f# #=pC2/5?@{{ 9=d9HTQlΆiF} dИ)9ov2hMxmHu-Ax6*ݚ'iFW-EEPD F 'tӒ" jE(Q$$a(5tf* a *= xFF҄컝_ zaGi>Aiv'8?\U!85e7dje >> \wdamȇ|Cx 7v"yv@oҬp<& 8 y1ؐ"sH .&v k0HFt@.a(9 GpnR*la "('A3V"6bG 0$ШN$Z4xBINK ̀{^Q\N xb=]@ %!u8#zx[aOyD=p,v, i,ʤ^49~ YyXHAJOò,4) |}MGe!;ItQCf}ؚAuei""%#DJJCA^qH"A/2U@: yU 444c|xUDD8* 84[t47}"G=\j$2o/;ARy2,^CRm 4B[HE>\T|J)qBG4~ڠh'IJo K:Z9$4WZ.Uñ[\@&pӮp`1oI Ԅ&S߮7V\ Pg C|"@wz>_ 18&+6(R*Z q1ðp$rE'܈?AnNx`ֈh0#H8 f,k*)R*l\6(%0ZoP?Xy?SDb?#j!R2&S!q8(S2}rZ&-D(zkj3\FV=fd}?eAU nWj/0M(kƮht*yn.ٓIUMg9)HhSU-ׅtjY-芗QׂԳ(ƶOE" "ЧCXc3I7?f"* BK4SќhQ&wd.P/JQ<.Ow).C:Fah<)`X) ڂÃƂY*r5( xM = 4?|z8h(> 88Z(A_DQDM3܋B9ׯ!Igڟ)C aCJUsmc ffm2ԋ@p J!xc(? \{ Qr 4Ϝ+HT& }u9 h ں,kr\R0|oq˔f-XK)Nm!J_Y8RsA}_~9r?oʼ?z6, W6dDPf'UQM~4{Dʱa @z(R^pW ,O/PW_C7犆$0 Kc!0]8/vD$y45oe(F-#҇r5M~+(_zRw`3AqUS|[l A) RbNc#êH%~saJk4_@~$ 8Y: +cI"hԣS'F t(rϹ,qT!)eiEatEX H')$+Q@) R{+6(x=y- $F龟E$B NeCqmF{9?br8҄GAxI-q&Nt)zK:C$`eqhkEQ!R1}!.3Vk"rhN' -2E. 2L-K" 45UܢR V @PiQ(ǽ e)@k*!.J4i'JGZu>5YNwU0N8ZCH.?}8:Ă[:y.񲛺%KDtT#0}"v TG *տp&qr@]cѲD Bk3[wx"{Va 2H rt @Aɫ ;w^ѣ -z2S9lw|z{G|Ԁ#|Ax$q 0m}v!MUS­ CF hƹJ`{l+fĎ*q_ϕu{ü,eOe:5Õ` =z*vv ZN2s;GJ.P)z>n pﯵ/CBߝ΄ ASW͊Qu(C8*儦 ŮUI!Q~y` K13PRC=GQP󮸶BjL"zs-`?s\)$Cm /if j,-D^J,_Lz8}^ _(nM Wx1l` 8'z4#='eSa9Þ//yk`*9WEGk MqԆenr lf 6Qu'8JxDO;iIKR8CKؿvz4v-zwnb2LQxJM/G͂ rJ"( 5[$ZT<BC/=@";Q˘hĂ\NxRxnTw'i[R$P$#c(}B`2 +N;j@$HAP 81/Uâ{3 9?GOP7 8q,:P4SKC jt%hKʘo3PA-(VbmB4/I,@2 _տ":#͜ei]IKE%P)Dc3=`EƳMmh꟨/<o~< x~ϼ9t9< Eɍ}bs5I xpo%pg$ATV*^ITmDhcB'v\ ~y)%JX`G anHgU j)u$(q)ؼ(٠ED6E ;%´~xi= |҇8V_n= N8$q|6p*"t6E(D,UO ٍmFM;'ld/wP|=ޠTd^Q~-B? y:LDRҙFmDPJE(-6@uɿot|p9cMuOc5TpEcƴ5Lram¡"bz@-8_ 3 ۇUGYϽెֿyO?LM}c7Gl>}?;"AB$K^1 -bo@3/;Q4ʲ49|_?| \w<ʢ&l|19$۩5-КFiޚG/"z=бgV^.pi(I#-[20Ĕ"p"\Dz6ePF6h+'SE}dnK}e95 2q+'J=8=Bs >)ê<8?A)z V 'kֽ +ymhRj_KzO֊+5=iV lLjJË b.dabӠ> O}wYSO/:?^rPHI\#@?6Pt='JPB,3~vK7aRs!F J^}azFJc)?|w hV , ڷ`"5?'rU_GY&]|I4?cq&֯@3"l>KEP^,9VMqV`[i231ߗ㗈:n=L4_,}fG.&MNɺ;;c kWIWߏHw TּٍfbÈ:Ab^va~,|ޥ4`#\AeWؓ+4.p'];>R!A;dHS?xבfҾE6z B%^t;W ޻jlfr{}ۄjA$#@( ҍ'z1:ȗok0g10LA%Jd!u-" cb%L8cG4Y83: lj7bR|dX~.u[Ze ^W7- m`ӈ6/_\YGmTډj#]~0^R$T;HeZ%[iZޗx2klj𖴩|&͌K%H2.Cq} :PCk'io'mb+y[0LjE~9ӣ+^`q'"J;8ͩEQOX@?xA )t"!oQ*9)5`_@75S` FI-d "Q_BxW.4Dz1XV(͸V0 dT3MQ(f܊El(Ch5PԥOH'jfYzVF# !~3I;Ju9tM`t 0лW38uFeNb>zt'o1]a '?x^&NB7O2$;$4kW):Bc]^$y`QANHB8]hgԀ:~ 0IQdp> >f/'#^H@8ϓU t!բ2u;sŃO0d'5of4[?4y 2<{7 ҕ|j1  *!`c{ =^0чX]cd~30vش^3 BwQ~׊EN" ,cgW:&PP?uI #RQ3S=w }_CG87l,7!/&5hi;I eA%p%v eb {24WJj25 D/n.NԾfG:&_pL\taN;/(5HfVIN$ibӢt,*P9a ʯ pȄgD?)OPJxi OKaN,uKКLUBOxJsN_U 6N&>#@d5eA3,'Hs4rbVmb. <4.AՀSEH2{)Xj+%` PT%zjLJ:[$S<5Ɣ<0>in<@Ep QE+Э~Ȃj!p̰|e3Gy/QsUS?׃U0K'_aB=^|/1-kT4~DGzK?U?0'ģ1zs0סZ{6#J8>&0PKl%{)&y͉z%Y. hUQgõ(š(H3"/%N4Iu`4'כ5/-$(hDEBGY2$#`v'Hp%K ^ogK*$0FeSB# ibn WCX N1F4 [\l6r;anƲF;TB^3'^B_cX93yPp<.V57EY JHn^z՚ yb!Q "0s<77«mayavi-4.5.0/docs/source/mayavi/generated_images/example_chemistry.jpg0000644000076500000240000002540012747716313026653 0ustar prabhustaff00000000000000JFIFC     C  >^"  zc/ '~ d{oZ!6۝15I|<N-+R2UL~$gǼ?D4v+u3x&614NV]^o6QvXf@SeNi ~?pF~yad}s/T3Y8g:7^ 1'/9o.=oŲ/g=sR=åpۜƞ-:6$(>2$~eAZBɒm8tUE#=DwE*`Yq@_%ou-VY1/tֱTթ?g[}Fmc7.ƩܛtcUT/Z s- aè[rkxxWTm&^`/DLI ˧ruX;s}VBdym* wX&\vv67-܈rajE4^BP=\s}w:Msg2fbדϰd?,!@"1#23P0Bp8\{N5uFSQOIRZhq+*T 9x0ԟ1 W-jJ*B4"? Qw_9k1:{+VQJdŒG:8&Jh5298V= "FqTjzk8d*Hס1I^ȘE #`C[HuQL7nJ-/F0b*VK3-ۖRytfR2oD1ER~/Ud۶򴟩N ۫3S4,\<0qƂwR;R^^L%}>S&_lzwb&fHG5O0Ե]wQvūv?$/=Yeۦ$y q996LQ!z)Zv=,v-`Dz]U0U>6f%wk}sb''a9>+%~Qoȵ:^hq{_H7毊NE,kT55c#8ᔑe]%A$vӀҥRdir-ɫ:5*AqyHq4dR= Z$sƅj \WQc˸-Q.P,V*&7cbSdls<cdmk9k2]LlG]$c.C颖_ŗ)q/S,VQ~&8뱬 )55!km i6E75^"(A+do, mݫ؋Z\UslEͨ$!7oeږ9ڌavЋC>^d2(]+ Y.% dl#/!I%k[QHKe7GbDrŽ.dcc|h6hD9Ae="YBݖ,lI|t!Ei'*\Zm? YŰ-o.lb$W/hm!CR<܂ }K&ȓ]WZ&MccUNCd#-(K?9G]Q-&K>rT:;\bp}KdTt" *?)Oʋ3W*0!0"1A@Q#3a2BPRq?rj?fFK% V#U @ aʮ$7)l*WsJLiciܪty 8@GǵeqA 9z:bޤ_(ۭ첑G%@ݕw^k?XU-g"~w`b.H # i~LG ,h) )= Dv4ų$,E7 RNZ?/ȮɃӴǥj6Պ";Wq0L,E "cXQhz[CGJW6JT^cJ#ɞ 9'UNLFhϲjwgL9af- TC}!$Ej w VUo BCɿ*śe|[FḙF?YzG},uh5^ҿ'ʮ9Ρ| L,s@U kSq ;GŽM0^+AmLG*>+  RֵOpn'+66SZfTrZ~'sJ,RK;)b%9<aQYs;juEɑ>SWjJc|P~e> Dɬ'Iw tbh*ݥVxEl.n snLDԥv'*t/94VRw͉uD޷nX` ^;-G2k"+W3CQfrE=,cYsY0;nasgrH?& KVP31! @"2P0AQqRBab#C`p?*i0 7eb0 tvFm t#v&O&y^yENdJخZYJy3!AEjEؼLEɇX<g )T?ϑ&t%Ts… ՁMdhXDU3Ĭb"**$1t%r#Nr->M۰," Oq*b/YWmJbqF^LfDjquE$A(1IX\NO/%T" 6էǍ&j'H8.lJq?Ԥ,Z) L[拗L |GQ,x|eO!*8tܥԼl-4' $ ɉRx|$TEL1T J{+*hQvhPi~|]Dq}8q}8C88qqq88\qӟ)!1A@QaqP0p?!MZHNƞ 3t]"cUtkl^8{z`a t#F 4"G $8AFЫp#Z3-wyI˧9EiIdxA ! )%s~|6KLePW:DRÔ @C02zB&3 E0~p(a i`'H<4IѠX#YywB.*fR$-LLbdH 吀D)9ic5C7}0 L,1A߼S+գL D n4`IBϱ t+"U H>ƀؿxjF Z؅^MH.}+AӓTYƚCtl1(gP'҃41QJU6iX؀A2,Ra̡~@zbhr1x ! PLS+at&%%K cDH Gh!hMau]ѣ!\Te0aa19>o(D;xƏ.&AsX[@x6)&fZ7p KBSЄ*rN>3#9TyZBk>*gWF;s 1Z| zR(˂ %.fփ_Ɗ&dNCeuχDp> K8_/L`߲Xm )@(Q DJ4 0 #> .Qƨo c#7߀5*SR>đXQ3aTlj)jv%NPl5h1%ˑMGYYba9,Hn K&MRAmx`CP$#<ʜ UgID D2*˶a"s3sd)=;ZFJWZ?E]\7S2}’x4.ʧk3Wqc p0Uk7 03Zt_Z|5ND䋌J0ojPaʳY)p,f?|AF#Azh!ț>ЖӃxNr~/sU ۀ%?䊻o(e~ |oMAv=ϳL16EvX/o^Eĕ=kZT(Q֒e&&Y`fcdENf0A@odNҐ_?#!10AQ@qaP?!̗,?dX*0ˆD1&W HLdㄒ|@#v?&ٽ @$/NU5}ZzLQ#_}jy7 zw:jsSÁ܏;ݼD%XퟂՔ3)=can2Mt8X(7u>?31ۓq#Z+a=c+3'b䋾:Bsٞ~^%rg$ wub`ʲIo!Nfozl0 #ܹfPxPsaE"nqSb`%^hgřźޯH$Z-XvY(^3qՃC){zU9h^ jcSi b\=pKۓk0 }Dۿ&BEΤӁ۳}ЊM,ׁikD7Xʁ]c`AvajGM=Ρ6-V~xвP.I:17`GY-&ƧPeRjpWxTFH_Cѕ?e/0hE73 F"jk5q\!07 iID= al8h.!X8 IR>!謈nb Y%A֪tڭX``\/2ɮ^&Еjz4 _17pV/2n3Jdh-hAe~WA\=ZNb$R6`(^Q:La!j@`kf=\;IIr3wȚ(1% ~v Hbv`(ys&oaqPjw5kY+VvUcL%o5k*L)*eA'7)f{Ce]*@\4jGbáhB3osX Tq.D aȚPBaEnQ:(ՁO LVsȫ?d녓 * A֠ĘKJzJ0\ͥסZt W<缦~/A nQ̅M؂$ _Y+x3ec%L7;ˉ̸ؙ$}/MuBА? qL*iH&[Q c퉉6C+/i[ryUnxlO;ѕcXh킁-\,\KM; a~|l,hØ_q}mo0PT{D Ypvԇ$0V`[KM=`f{ cV0y|!Cg's ~CdvUqvg ScwlY!! b{A=cu^e#و5 yw^7M$Q`%ͯ}i{^tB8.bFB %hmqm^EQU7ҝrMOYsbꊭkMo/amayavi-4.5.0/docs/source/mayavi/generated_images/example_custom_colormap.jpg0000644000076500000240000003731012747716313030055 0ustar prabhustaff00000000000000JFIFC     C  >"  |yKn+~~UR6Vx_;agé;/aX|SV|TXWOձN5>Q+ߍy /ǕS&|~lgy%/(?ӱ1Ӗ~747e(WU ;rt]Ueinƚ4C_gjr9J_~gg ˿BѬӯͤWw`jHQD[Hک('typ5Ȯ|>ߗ9"7~N=Y ֻE]ka<5zl4in<̰˜EN1yX̪_DݲO9^ߘ ` [uu*jjoKSj\GSouUrsNVZG1Qv\@n3r,V4r70; __u?|O~RQunJ|t7e<ٞuawC_O 2 #g;=Vy sJ6;]{ IQCIUFIYvJB>68 (%,xZ`Ue{,C +|1k#a({/ ݃"|G2r>v|O[ky>gXǑflg/a?61:w%IYMO>7U~Qy"y!+|聍|S*]jv^gWOT?AɧWQ}>mʊ>9UVy}Mg?OɴڔӶ=:[FVa:a*Tݗ5'~yLRHh>MVTy4/dգ[U #hb?YUWtU .RGvqoyITkz\U_y4i\3o@F|W}_5_C_F.na~ú6ƻs7>ϖX}VMk3>?~+ [p*oa;U&%:Sw?Bwƻrɼ6,bbXV ¦vXxE~6,XO]*3>n"ı0Cm'>nS|Xbŋ,1JIERV6z00001(ʯc Ω,Xb;n`$a4dVZ+Ei={>`g{ Ϊ8,Xbŋ)tFHɣ$סkާa#=xEgČtdtDrGq/GqGb ?5}<.*G5ZQ*pw;4VƖj 5=Oj(Tuu0UpoH8eSqF݇t`tdD坨$;6U^iE2~MY150xxb7jH(VJ6#Q幪`84{j \ _wYP|sg9vzv.#k;U!W 6FP%;%Z3CR5VSF7X$:) e-@k#kRjBV>]]5diNݓU<+_SSƒPi(cJ j -^Sr;Vt $HEE-K8ZDr-j Mf̩ԡY$|5"73;rk dzL-"SU%Dm"=ni U!鬦 qDMƵnPNmJTRa^xutgb t^))ӏ3cz1=)[%3%C_9AM1G2筂M*9"rY RCT;ii Asߥy47Ʋ,-C:F>ꬖW$X/RCsW6%#F]yrVG gNrSD>XGK;s=MbjtnA1EZqjWJ2Ț6ƍ -㨡EW5>",LIHF 4Ok'FtuYLs Ĉar8t:e:2GuŸjbv =!\iz$r6ՒFQit?>79)4snWȂ.ajUQ\"UaaXe)GE(+V*~ ۝D:}CJ X)o=.٨Pi]y (4ʵt\vj%;NȰ"Niӊ¢iE@t*oI#gs GcS@i14MBƥ7.I#TM8Z%;rm.HӺkl-SVJGFp9lTCM``yfQ+i6EYI)GRBD:uBSh\"D$h# '".BmRNmw4C|ĪpySU.ي7CKN-2(AhGOhؖoQa#1B߷bH+eѨf~(%; !120 "ABS#3CQaqDPRT`?(gZ 0"C 'oJ=DduP$_o=|~~j~l xWhvUX_giaŞ| YZ8jK} —Z; \D6;Oky"3y6DfͅN,,Ʊj;OWԄVmnŸ%nx{5GLkƩ?ȭxo 넖E5Lk/Ndv7fݛ8md5qf5MSTwW2hѻض7"7k6fjxK>Cr-3s\Ic\"3P䤖Zn S"7]=c{%[Ц6؇|w9yj獅w38BGQ_0LB:EQljnj#9<(!-db8-bp|KU6QZ"=Z9x1igw܎#sEh/.dx\~9IO(c4%`.t)n-GeU{9Drj  mLfhIjJ|6('$Qԙ̵ܼOA=^ބTeKhʾ0 Ġٻ6 XUGbHXJ L$Lإ{>Al+ͣJ/N^[? qi3C?AbnHCZ$Z-t8N^ 6^SN#^.=8  !1"#02AQS 3Cq4DPT`a?gm076gfɨ~[~-?t4~ 0E֙O7买'x<cvAhhS~-&\3_XjBeKݑW3_Bw4fffUONyqqqp5+L)qS72tH#///1dНÔU3$] vGzw(5Ic$&©*\\9ozPt(12sH6M d.S2gh\\=$&4^^q 6 4$c..bPtcj\T d$w)*9KQݥJTɚfq,͸lv`{EБy%;'8 CO4@%‹j){._q:WxGgv.iTX܉(Gw7a2 wMe SihKKMˑ5Uo~ªVATGT IYqb889B!hƛoxݲLHr (xTmdLؽpA3~$_A_UrsvQHM !12"Aq 0@Qar#36Bc$4CstPRbdT?^ eLE> n ]HwSVT=.{c+mPWuDdQ eMȼ0V~@/`LvN~o쥃<S KmH`4`ðhS sUD`P{ ,. +_찻+,. ZdY}в'5Q/ _ GԳpg5+ٟC>*'V$\@v -1>#R> O(ԑ]pw K N!GppZ=n 2ۀZ=n p8pjpnG;Rx5Oͮn })Lnó;l!S*aӬݦ{f`egVw3YKjٿ]{l>^[OyQ8_Fvh=KҳpBoY%s%hiXٙոN8GN͍Km㳫p "&h|Jt a{z s9V* gJZrTN>`ggV:&&&+{J2:}JֱX5Wt1e*ukM%r9PoVM5p&3DfNfXMFO3$OO*NU)0ZWUu]Vkfy ,s17MaF3V6LU &@*ʐp1c5S>30b|/͝Py1ryJ ycp8Y0?H*V%DCZ/xM^^wgήY%ɮ;xҀs!Q,U.8ywf16 7"뫼1D0)\h 2cCYQq.7#cاX".#MˆQb+CQ'V.WXp"=L8veK ~-,X7g+pBo ڻ P:p{wQ&F5Tm7/9ͲM`,ۼu5VYXsVoV{_BOϼHpU)l*,s/ "Ց8Ψ5LV~m*Uxᡝc,)Ćg4 $b:h`cs=,ӊ麗nA,o:#OX#6C"LR)2q9ʔG,Jj *&ί|)R_y+WBhH׶+d\ %ur)RhSs%]Vx/yWUppzUT9լ^g:JWUwab jd&ŅHg tAWzVQR ̊#&DB*AB!12V0,5o,sUAJMV^*ǙZ}UiRUwz RhAņDlQ/ nKᑤ!RfMnITfUPqBfY!`PmBN'\KD%X$qpWVXXY;VK | T$ LڤЬV+& 'jj% PaRRqYSЭ*jN2m @kV+H*.Da3YPĴ\d?*!1AQaq @0?!a|x1e#ҭX3l_t6)e!E~y A6x2^[D!s"16 ͼMPt 8444B Id,/Ȋ<18QZBъH*:- 440 OǃJ}xUKeh+ wB*v~2^4?ȇipSB/ӺQTOG7V_CSS"0Fz u@)b 5U~(÷bU{+3d@RsUj$if 09"'>K#!l6zYH(ۂ4Vz1zUGzN F3L} Gci>RCVL |߯ý^ @!fal6+;xav Ih#L'cV)PS-,_!aw+unS*XPi,=d #=Lmw mo׃#Qxb3HalhHIǤzGz Bx/"xF#Sg=$hX4 )4tXv!zGc[hcYNv6 \#QFƁht3DzGx`e6 ==%J? fǿـ**PXf L*'&g3Jb*/ h$E;4 {?j-$*E -NZܹi7d4qt=#/@ęBB|#{ Jn  :Y`Wrqr.pyF0 jD;#ιVĜ2`Y otjC1hT[~fDD,7̝x. - Ke\iԪ,x$HކI|r#,RyUS,8f]8)`QsRxFښ[ȭq8"qAm#LJ%H"t*06$n8xjP(jɧռ'Q@&`/M/XHlxR dU(ȴBBQ%!،U[h P0U+1 LJ#mS(VY}KV!+B 'lHqwXs "dRuR*e%BT$,տ'bZoEr%WOS1քjM@PFOTy|k]avysJ+9~!fdɎ94pjocyy1rc:A˾ej5TS@.~x uZ9R&s!L58r͂"VM"N.bްthAHAZildűrlWmb ؛_$KDžIe#2i6>BXHh΄!Ya.`<,Ĵr̆QICaq`JtXc76CUL+sd*ȒI^rA!T1"{?9֍4S/XW1rU,)].,W#DRɒ( (LT[M)]HfJ%2 ~IC$B cS,W[Rr+]2rF͉P:_KoEvÎR=8U9"MD AtDJj>T;eζtZVƉYAQay `UE…šɵ5)"lKD MY(zr:2{t_C>تuYLFݐ݀5cGSbŸ`h")*'A Wh ؍ʫH Dw>,}PҀrwnsbU5WQK,sA!8|,ր&v|\2L-|p3%dJ@1D #0T~K?#ӥK\XiS\!ަ͔p:tc$\?& Ia]fM=i *dQ{ {v: Є )!1AaQq0 P`?') Pvxh wv1xAˇ >~%+:k)0yx[+Pg:~Akؖ-ksx+r,zvMAYfXYv)̶nhȾ g:4']ّlRa3iӜzq)Ge#цUq%= 7FUv4QK^Ў&5;={? q} vH1bm,JAM7rjKYSY"Y3f{=JC!1l ]ZĶ59|xZ7s/tC&5&FժR԰Ǣz7Iezow _SYr_,*5&$آM#p!AKq9m pm@bŭD֯+!1AQaq@0 p?[cCF9% "'B 7.ʅ-P#T<EbzBkYN+6ߜx`\a6*wT0AhÜڵ9bجbMv}Cv!aA~SpfUiXTg+B @3ʖ+^)(5^H =l^9ዖXٽW_h1'*y:䄡0L3-ԗ^W= A j8M,/O~~12QX"ߤZa8xtS1PQe/e:NQF#.%=mE LLKp#@7Gd7Q:c 荊擴߃YWٽln4QcĻLc(b'$.NgF4ǂ3Ljv{̦9ayǷ555l0ŏЇ<8gfg Z[ kPf_e9He\\.R CDQ0%pGHq5d^iSyxBeԴg썯K%tRVSE!.-Qϸv1Lsgk Մ-r`S$gfIKG0lIu?qOO_RQT58Q};?F==ttQK!1,9\<%R Ȉ+8&/5f;}uIU ܈3?q2PrJ*ofm-<%e0£+s3@=XG|Yߥ)U>׬WB>cumCTpA-/Ex ~7V l0C(ބ;=cE'Wwo̡^Fs~*Q.k CQStzFj@?E{qgHk#阮jݙx& S ]*Y\=S6W.^+(xP1䰡Y-^K<ب@utU RV?@bWZs,\2r吀k YYC•nn[dj3, QvX-y5WL9ʢd!\CYR#JGAJc;mYo%;T|R\ӗŠZ OoX9A\53c*O740vFI&rWjU\ۛ!Bz|wCkyz`KSbЂ<{CLTBUw{zTd w(9 B͉O ª pCF66v:UD!U]%9HYh43oնkrQ1AWT;`D`"6[ff̄-5ə Na2K;ZR`K  [qU3@3!Z0/qhΎ+(.eɬOtcbM(W",NcR˥oݴϴjVVIl1PQ)΅k׼G\Ls -P6poX ebP(^JeqA`[ x SӖ|` 'Mc1g$Xxg姭Rzt]"tq̺s yU\G4pr^H1,oP(7pE3nn2-FK)T J\鄺~u/6IbSXc"Xvn8{0 1p5nXajdh)HV@]RYHs ڇh)C4("#GlUJoW,*,-o{̸nJ y:gLbYo HX!yɃof82b Kxbx [kB7Wf9UYѬ~ WM68GK+MkϘۆKNшrtj,uEF+`yR7m-)fXSaK&)4߼knՐw5 S݅\)j2 6՘9n6,rcYSp׀tvkFc9u4D ^UU0U-o]]W9MmF^31*86p Κ)xݬ.`~U~ t#رX_dZ9c?$+0,GЩڌruJyA-Y~lKkn-<)w .Z(|fP0xavhV 4ziqa| M# J}*tf{ՀjI6=DX9DVԠ%ѵ=_Ҫ(>0IwaJmayavi-4.5.0/docs/source/mayavi/generated_images/example_flight_graph.jpg0000644000076500000240000012533312747716313027310 0ustar prabhustaff00000000000000JFIFC     C  p"  f7z3k#k^ӧsYd ^N`=aD;m躵hիNDG8gn w휣@* m0M'̓$bA0Lσu|g[~{/"ds&um++ju3[tHH"DgO6\,yYŌjN/G6册sWA`;g5v7dt 2&qKwNt盕--Dk?&yZnZ j׊슉FGNmYYk(A"~vK &aN542 Pey9F}QzuC+6F7Iw̻k3_(ڤJNqsgߐ5nWRj tiˇȚJvF̓*:R]Rϳ{Ly(Rv/Ctm'6u3=PR)'Ջ]vc+>g^m_I/LDe/`;2^/M+>(Z&)5᠙S:Jt~?@3,w!NSKWO]h.S`l%m-iDr [[=-;٭7|j|ǧ_Peh{y83y^Yu]e:لwGͬy c?) Um$J7n1z7KdsUn(Hejy"礯]sߠ2ݑ _bepOt M}_LRFhׇtr`6 7;hqsz\zrUvc_B2qziS_nM‰):J>{c64{&,6Lee2{ί^|]G?0Z;hJUn2OVW?{iȫ\.Sy[%f]u83As$#zuZJ ;;GzJ^<1tte==]Xkq8|1 >ӱ{ '^G/V&`u+[C˜G蒐6SIQ Jx)cARnun].h㵚iw[=G===S@[MάZܓ|.R8|^ri<B=T)f{uY)*/WOOgj[vpVl6*- ^#[+p YDzˈ7&   ȱ:5+'r\rVmz|zh+y:YaFs}Œ1ޫجՙ-!ڬԐuN:F࿈y"b$N`۠Th^1^8U:Gn- {e 阦oDj+/ |P{>𞏆DfC[*SPؓ;SdJZgg|lPgÆz4S5ƿCgq{HPhI9 bzVpr_U0̈J%"]7djZ sK~''~jO.۪f;MCjfX1" V'G3WQgeA깽?p MC}24 8UeZ;jl?e"fU1RJR >Ojt~]"ksAoiз751+`hZD쩼d DxRT♑ -}:L"dYSj'`EF3n oWUe"j`6 ( HBCW/Lcћnbœ̮V-Fr #gciPF5([]gLқaicr8W-@*KckCg=ʶ;k_f߾d+.( 6w}T+ ,.3twI9K|1gn֩q&BgyoW[/1%im:kpEC}ZJ\3|HiS?UÛp^ZjiU8dzDr=ͥ\l>a6wEfΏMg0]xb E&:{F0yI2ԢI;\&Ygn`HBE݄ 4iajy!gu6R&z;jL-a]wji7%!$49XtsĈi33T6JU'YYG%=nÉ'd$GjK1j:ӌ9Rn&2M]qVfrH).eSPo-%ঝm%cj+ȰڞA6͈E(0nxVMSKjtqYdF刵6̘ˊcrFY92~+[Fa5;X91&i0u}54*2yيqg V9:Eke3Ԣi]T!MzYfR l)2h%#B -?JAx7*[CԜⲅ,b*O-,`7`ʒ+IS}eɎ#@أnh7+#UđfꛌM**tc l h4mR9tm DBOjĭג if; ]X3tw6UhAo\΢Xܑ܁ձW5YLWANwg'2-tKpVF6QEӣȅ TG!UWkv qo-kHHH\~^33_r.!M.J̹y8 Ȉ (n64<Y4HeLnjTC=QI,[FO$I2!)Hl!+QTGB Sfa. IHl4Lzrj,,/:a\1tOsNeO[  4sZl2 4,m?leQM}Nc-&L$#`u~7LExq߃Uey}b v/H W mkCFKNiHX"P.0F?1jbljP!cCC̠k3bjElw$؉4\$JfkP2&kgƴ32?5I5ĦDJ|]%הQJL$Va.^p}R!X,y;uGQuAkQ\[sUeWJtZI>O8gOH @f )դRYrYOe* P%P%P%P#;pGQuArȺa)Q:K).{}*ԴU 18)p $!E0C>A JP%P%Pøw;x5P5,)aK9J}b]Ի3>?a*;zݗP1|<{l7bԓ5ּD%@ @ @ Cw;p–[OM6`\nQW)f*VSԖ 0 ,FW!"+8IfPJ,(,w;xwX5p) kѹc!jmzʃ"b:Mt.C$12Azn֥4q\P%X%X%XwA;Nt:hͣ? ª[S>lK[}B:|.AĸNʹ6MW'aU{Z R[hTperPZKNx-gd2X[zXCl3,K'9(mLvCYãܼ=ˡOTX4Eҍ@ bLcGjV[m MI;_/! 102AQ"3@Ba#bq?WV9`GªTF~p͚Xģи1eL3bZN^phLDwJ;M%1Ү5 #4$ޡgjij1LG£\*ƀ]7sGhs|Al&rˁ8ڦ=~xj.K@۬wj.&16"J~sҴcs A”'lM99caVщu4i"f\sdE,A2I_M@m M'|j%I~xum۫x qdj_|ezR Rs&.+Ŕ*xˋ5͛0]lMl/| }r_4} ؘs'Kn []S%1"FW.\ri6C,MEm7UOibX.\r&ea7cq\q̙`;[-'cu-~#qL{+P!1AQ"2aq #3BR0b$@Cr4DS%&P5Tcdu?zBFZ#Wſ^Ae,W?˯1b?ɖGDtjrf'{ZMCl#RAN^6ŶeGݑl4֦'2Uτ%IfCL1Md IPԔg2ӫ\!I&**}m]w- j kf]Ad;;ke{ iQq 18˼tRqA/rAܑjO3yI*~crيC~TyZArWgeeO;2IF묷ѻ/.KA<ʳV,d /ё"yYu _t/}# JVm ewkVdWf2}e]vb41=u {zfXT_%%I 8vQju%fU!Ɯcbhm2Ga2uK3 R4P<)mWaHYB[̶fFl"'/C :%N"AhA.<ٗa08}7aWNu?-vvKx қI`)#?R%!zNIfG>=Ü*gYdb(.5 {VԆ曕[(T~#O!;5Ja+$V.$a +v0߸xb(nO$巖 ](7}QxƇKM61?wU㪐<n~s BzpbIPxanĤNhlS{(0?مb LO4mnHѻ:dQOQ{O4}G15=*3-/m,82(p]2+›r*&*Aq7';UůLT-֚+VKQQ*戴'hٹeΠ0n4<e$lI׿9}%7-;Ug% %sqlf>NIit-<dģ%›ā0Ӳ,Iz++dfcuy߭!Nrv]=*œݸ-"]d<ˮͬrwEZ.|6Ġτ?IqrO*UNس®]RvE*kZAGDeƝtYڍYi|R7=PGyEm"Tv^Hlj&6RDTB2_dRğF.tcZuRfMw*hb[8MJq8q%ر*$P:e\OT [ %) Z)9C.' {8 YSJ֝d;JW։l;erHJ}"nqZHʅͽvo%6GmTԗ8%9`k)6…%AT)<=p>0i{xe2B,rzf'Dn|KxGoZ5^]hҶym*o`;69MuJn,Aeں1 _a 8& \H#fnܑmC 6wc,|i(/zz\\ ?֞qf`}Dѻ.vBLꧦg.%`lFQSQ\Ffa-2M9(I29هhQ;x9OY%ЛM:ܑkӶ6E;5)6.4Ԅei% to[\-*1$ of9siʻ1*8q Wׂb3+≯bXf1.&4Ch}h RM‡91( huS*V HUZ~i(Bn\S/+)SZhrVNq[PGH-.x jVvaMI'퐁8ܬeKisx#QM3,Nz]׷kvrwT)Py R?;mjY9i;|jq6˴"=SOMjb1pP<@Xj kDx6* Rd\91OZbQ'8l-!QDtˎpMs|a &lme X9r) IJx{e2f}fTQ ۺ / I6 $gf<>p9=KK15QmUAv^ $<0Ӂ܃ /եN 7aBdk 54v3_!֬}|\ۖuhS15+x3+4=RMTjnLB6$eMtR@}R]? ^Z=,@zIih,F|b at4cWaTb.uN$K+-NJ$,J &h>"q 8Vr?MôS͹VFw*iy64&&5Ԙ3(KZ k -ӌyp+>f:BZZ| Չ (f;1ٌ tJn,GI+1-2Մ=mʴsE^foQ+*Zg;튥tdQ#ghs8Xr6M`B)x'zҢXRU]"Zveimͦnх$fakvJdmXW|X\mD2"lIk.tz/{5R΀jN48 *őD*fVRmR9L q82wpZj?8zbB =r˜?/j;Q"6ێɎь<[UθV=SC;.i4.aLŽ$a>hnn/P>6⤃rVNaqL}c8ZRVl0ܲ-*ޘNA(kyF&vY=2֮*QA鍚zQ;٥VN(ݠꨞ/wN, D$M) K8$wmM.zDLRYpTRB琴ZE!ub*'m ImKfؤ `qzRpCd%-' mX$GDͳτY}c%hf1( ;UNYӼUfY((ĕ;϶|bw<eSggj&mĔ Ј,l^ݽ-JAra(\`%%AI(}*ҷr艹Q)u_JZJmMjl=ÉR8X' ad]hQ?8- L*VvʖuF &|1tڻ b\)WyWﴎqyU.da:p3My1cҵ1sq.Sa-8{×Z񗩴me࡜-|i=dy--J> $e`x+(wj[Jݕq "a`lW\Ɨ-he^^I*z㲉#xͳO15-5z:k'HLr]|RȺeC )ؗF!n%0넋 = )e<@'S (pC3#tIG;uf}LtVj>\mq\V ϪuH.rTZe=,(.۸ji8/oY85_)s5)33>IT’0SnӨ -6>p=$ŽY*:WL"]%KIkݨ.=ӛd-#-!be)w^qk_1؉ʉN`}&aXϸr'zSXS5u-&\>7 ą#gEN6.r[Rճy*TIq[EnRq2! wN6sA#QBI_3tIsgejHV>047*˨-+ë,>Y`AnS&n0$_L?.uX|+A,Xb<}'Dm[o?]Wsؕ d jάTQr&&K"]kQ]LOKͼQ.&ŷcmZoxÏ;f2##h6NZ/vJ#$FSqkj=eɨ~ =\p-BYex@@f g'<V#"7Gl-i4@ .̤Ləg)!wj"17^STh+q čfī-M km5ҋ  e.c\M8R{Y7o;#Ny# ;,hcv|8lnˍ ڭrXNRĵkgh$*&éԥ 06ʗt!/S¦谍֌aoFy+AH7YL%O\yCX귇O.8w"*5Ys/_#YȼY<-ˉ<"R)J3ͽyW'CL@v<MF&ܽxTNq-?2k.38rï%.ypa8ªiB)\)tɑ2ek/䒒3۷T*#nnAqžnT[ML~K*Ka)&rTup)EDYYxU'wRZT)=b_.Vg37'\+Ż,&'v)& =2*]mx}ӬL]>ͯ0,a]lкsmӒ}gX65TYEʼ6 gAʱ\ Hȧ.>Kv8<<ːI=LPw/2eBu2xńHE>‡[ S4FV4ID6a)UE0{wR f"jYqqZk:l*]pdȳe"[dvG0bGbR2/.ZeԓwFI9$Z.O*Mc5ga_U;u#0/{,tjZ$<<*[MeF1Hi,V(<"m;juW*!+vb}6S̨MO1Y P4Ǣtv~>Ma=UHU f?Ek2d&?zwǘ9<ͦJvR R/^٦ us}/:^\}LQ'M}IVBK}3k/>B&e Bt)Jو(2hU\1,[.KGʙU~g8P_ǂ(~UivNq)v1(ܟ#B24 vU?c~Ď2Z-|>]uʅEnϿx/|S|"+$$n2!ZXWP3,}p%)xF-TbR3m=6 #`bj[Ni>fҭuL19$*R˩NB1Z~Nӂ ͠W#9RS-ZvPlRԑdLx|<`~^hR }uBiDJԥ0KG.B7.{CQra xofC ',stØ{<徔'0ܳumqHlfjj5`eۭі}3]T3Y"eUU3^ĿHya |FެiO&%. zDA! GM2yp<0X I#aҜYCiR@Ӧ(E%f t!9[t% [ӊ N.xJ]YCfPziؠp yol3 tQ ZvPni҈E{bZNq!8S`0>e}"Maʲ2AgyCK dtYw2mXj]@Zn8rniІA[VS}*%%6]|,k.ƭ ?$Йa{ cUk Kل@M6%_"FYۣ$̋ϧ5PBie$qbdL*IczȚ 5 ~- kl4ŲɽUX8ww1',[nθPl{xdnܗ|PG4HH9xw^4 KWm*;3rS qc(5zɔ'OLϖj [zGN楟sj=_6#Ո'vz;&;F+OeJNb23ansibwjfֿa|xB7kfhSx2^He`4H1W Oֲ,)m:YSeVY^$*lG'>huHH3I :%qNnӫ藦NNY-$)(q,Qq2m@֔VR͒d%f8KM&H@<}G?W{Z,|U\@Ra/\Fq)Ke Mt #ԙBjxM>1áZxC/(>C]""{&Va|(b@#L?6fs\\:=2;'@2SSR{Ğп+%7,S,Jsh!rR̥jq-/ C(el+D)-P%GxqX$#o}{Zw6f-a"RIKCIB@Q6`Zq7J"se7U2g ںoV'?TqH#_(=,< ."=#?u=26&{}jkxRǸ=!nVE^/-χ콛x/1}`TB'o(Cs_JgDR'BINZ(~qLPeKi鴔q8DԳJ^7p(BE%[r4qNmVOiye)fOBP ΀`?>QQ& {nPQ t 9o(n;MqIU4Y@Cm$7D>VSyRYM=5+0BmU8F#)eѓ1:pb;;&4ԻRr>Jt۶eE!9Kq(\VjOZn䫈}6uMͻ evl-,X rc,j!mHH/nV7VKxi!ÒW*f6U:wWkGj;QڎvXo~Yna{0)eNa LVX {&FhOal_<ɋzɤ ?+B,bbTzjK݅eh+i #8_HHz&rq q]W޾pVTڵ`nr?F;/nr_m+1,fE}d7O3}㫮ԫϟVh/:f[ŪZ5)nYѨBb;to8\(BfRo":K81`8~Ъl꫱x fm.RBjMFά޸HQGkQN&ݜf\Z݆:>E=NNn# ٷ%^m򕔜=}᭵0r_u%BP95K1FL4RcJLN{%b7:[_q2wʂ}F t $C-cs6Sd 7p'[m]&(5>†Q}ٖv(W^T* Ua{\|<:M[$(8||H[qG8_DK RtW/(Ҭo!'O*'5ģ|\W!Ęn#RËUU(WڅQ"EX&Y;G=7;XyRhmI'Jj!FRiJ 94󯡖=bU ,9)dˋxJ%Wꎂ;6͚oYKPgd{" 9I&IR@9; u%BPbW+4+;jJ٘Je*"ީpx@u%BI9J{S,Rl8K5O1AK[7냺00Rl#ϩ Lpאx1'ȼzWn^0إCT+_izgu$õbre췎R eC"#Y%d^:%kejH{@pܸMB}MmWc>u0Zp]*P>թ72VGBiJT7̸[sn׎[7{ qI#O.7>q,ґ}w\N_=51iV s2y=,Fq蘿{e&2ˍ|W uҕx1oTd⇈~1ߥJRoT0%%"JrT,իmJgݍke7a9`n֤GR] [&B9',ts%juB묟2#>eNw.52Fou1[w`a7Y$ e?&SM8~M*ruQ93Uŕg7k昳X%q|x+( =cQ~JG,SLM-߻~QdFJ1P'W? uO\H_*!1AQaq 0@P?!QF|IR74i!9I? ! y "6&RR [ۓpӚ*ԧZr)]kˢg>8TEsl|A(W D~Ux^)>YbTV|E꿅c]9!${|ĵ$RiuC$;ND7o}k4Ζ[^ʄ/hrl5_aMWI&Vw{,/z&ց,sa}ؤ*U ^ ĵOXGtݰojstU9T]ij ҭn_! r*Z+tK_*>TQN$WQ>(b /!]ng[7_x; ۅNNKL<\Ϡu&|Y@F~ۊ_RvL}K osM@0O/+k=`u0=mP*Qj3h"_hFb Z*[Cnܰ:V Z u]R>/ĪrUjV0PsVf/7齅 Y/h ]Nf>"B>Gp#lպ!XeUyH7clΝIgMp.)I( 3~,X a}BK,j*\b*]boWQ@5Erλ*S8-zZp˅*rXIMrJǽ9QMi$@4t$3əm_걶7 +1']v/#aM/ϡe\OVlY+qܲcG"EYJOZ{Jc Z2AVh"VC$,zZ-lkddmJx[IV3x6X^ %k*@X~oнTW)U r{M]KiVmA'ux, 8 {f QW_26LCHdGA+F7HÁ(_eՔpGv=4b҉l#P_+ u Fbmq@LK8YW,ăn؍xнFp?/ QF\LjIeQ]GI}>9hCYw I)(inI`?`o|9n 35 mX)õ̊@q;|J\NtqvTms1#_rَxq>a@5f2pӱ@>؂Wp 'qhvneW!- k7D/[8]@1Y KSc(RušcEnTo ~%$?bSx8Nyo"pH;1SfLYxDq}n!IvTTXbbPkŰu煄g;y;a}'RosX&>.*-D ̶bi :s!ǐL8b{ @h8 ahkism̹4 +`aVmۇw?rVes_;IcS . ?0Zwrñ_`.GK|2݇-{buʾtg:;Hi㚴ĥlcD]5_ E J\q5{MUb5^ FϿB;&ʌCk˨;k441r,YWRJls@O#pF·u/É_2V~ٶ*s6j=5ӠkS:x4m j|@D wxpMLq)y߃xPܤQPi,eb_a|F*F{6{DNb} )K?h]Y#V)TA{l4H㗢%d~K1pP6@a{ʦlmF ه@ٴRm^u)AxSA-wvq<%PB-2;SPq|11`cg(;-J&3cqxᱸ+ ?xud}g.x6w?KqfށvG.vp~VJ1zJ~J-,%u!.z$e|#X(-R [PyZj>= ]ʬ6ĺlB`r?J+)`(4| B`Yk̪:O԰U|Z{$rXk嫬bt U "L?_9KZ?b j` /f z5r9i^sf[NeT5|#~N°gso~ r Zӓq` RG2mkhgw&,d-XQٜ: V d"Pog(yͼax*ڕmt% Xx9ѢlKxMU8Y8JiK]"t6SW8 Rqh@8"q~q̶)gQyf. ^)haIkPAenpXҤÌ JX`,֣(6=P= )|K.Yn>ٮd{ :)[٬IŬ %P.k,J&m h%2Q5auĺm|%-@e9sj=L=[$'p%̵*ac{}Q+Uڿq@KXdEBjxݤz,bU7/Vq(Dܳ#rVE}+,b~.aaHuf6N;shBJBnAU]~aHy'XSY|r@& -K[xD/}}g.~;6>E:&; akEvq>澒B*L\j %C@WNб/ |$o.}fVNIG ]Cl`q-@ĸcd5I (]9ˌK " ^ ih : "WkX^ցv |ds*/H;dقY lcvG՗7^QN!I ũ6ST-[ Mtu8J-eink:С\)cOib@ir_ BUh}2ϧl= hm3^G<=z * `\lyyg_UI_ ^2ug8Skg}c2c2M*YGa>vjQ:8,.ZAَfPjc'xXEAPR.ȉdѴ(H[{r1`UOo65vTPT1?1N/lWA2:1g?E[|D7?6qhX˻eEQs7HNs7kȕ"-P2NՕ]\C*=łI28k],׻=len8 ISs@h/zS(Gbe"jrBFKWEսyINbl#L3$B/ ʰrdzQY^ &,6j"v=fBCE!"re hB0۷4m]hx$TO2b+P{%4xlY_Kvx"[hryŒ(*Z+Z#@,SegL ׄ4730C·SAw[W50 ̺# r.nٶM`1lv!E)OR =ý|#jg@dfYfvMHE#҆UyR(02_AD{#~ԧ'g`fS+dNyM;ek_k]rǞ2Ṳ(HiΓ\h x"C1W5A{eV}s Ev&9=u12p c,=!IOK!),,[*0 _k~t^Iu^mrX4I,@"il^}'D0;LBW0wRi0AD~Ӿ9;v+Kexp[Vlm`R)ǃy(ٰkd{e'~!-]7o)l@HzpǿK͝?z(ހ!RРs*|DODy'44bKVYYb#I&0+Pʨ(yj_u~`PXtQs<>6>A].@#J*_@yce${fciV76xhRw}[8ntWrk5FN{_,dj0轘Gp>Q;iYIE͆q/vG.ۡu/kaW.9k-J#fn`-# èxȧfo-p!i[1@Ծ+hd+ocuX1DsK{%@6U06{dȳq@Jywp) ̠ k%zi(.kyٖ'\x1 GQTQ7E 7l0E9~504%2 bZ 1GQT[^Wu]Ձ+/iS(r_b` _'&byHr ~TI[4"wq61<UJʬnq>ӄW>u?xRM)ŊRaF46"w򄫘|[ ,O$= s!ul]i׈9ЪϜSH;0| ̽ߴ^Nǟ!O+6[L;yH yW@ps=ކ8U:>QvVڻbͫ E2z|ǍxY@)W-غfc>k9k+%ޜn.̽b*Ly+ A5 5" {j^A@C"R4Ot?XR^*mUXXyYf7#:  A/,jfG!Lt2ؕgz01oT&@ЀQ D/@qE "=Zu1P5N@ \*L[K&j)pUط嗻$?d=~at ~ GXmW6b = x\$B>)"ي"8­jA$`ѡʭdt"l ' 랑VCڋ "9GzZ'"O ?)!1 AQaq0@? nkS5칩F@Yp\!ւJ%'ڨP6+,Y:JvL0,1$ D!ϡvbhOW:u㣻b=М pf`zjmK5?nm< S,dd|ڍNk*E! .uؠv]ݐֿ<4{3?@p ےE_Ͼ̶eQ([)'`p]gZic7v E%WGc_|%0)1+ ;((42|┱)#w7BŸ gl^C-^(V9n₭EmOL{pGeIVKoA< Ei V=0DjZeQ+u8??*|AI$Ż:DϷ&7Sn MGG|B ~?*Ξ{ 与5*-j[:.Z*<ҲbQxo/~ r॥^ve|&+~yMcA SQ,|~M1 W1pEQoH."4SL"x^LAb]*%;fjTRJan\k蠔Ax)3#S)*h"fui>)!1AQq a0@?G\M=~&Krʗˣ&I\ W/K> 8.slC+9(1X{ɒ3g̪(3˗_Ԛקws{-76)ޚ0Sx! c`Bck1U&Bs4X~ٜk#lZGB f&_߼>k_zDE6~7G%Wtk^mN&]26򙆿pT (j4ǰݽsgC ӥ}=G5HSG{^E-b-j;6뿦2lh|kL!bEu@"fyK94|v2s.a]>J:u 3Ⴠ41ILL0k h 060$孭iSDMGR*)ؠq5ND@& `0\g7 W=V4PPm/(K FK4Z1 wX Gp5Òfhp;h+F]30U;Mт{CAcp+k2=5{g%G buD8xm#a%ĉ] UwB- w9%bheH)%]"'u}k`/gt,ƿʂ\kA˺#3Nk>|S(@3MçNbxW{ʉoEw4HS,咭H&`l^ =&cW)wcVoe k՟SM0z?91i !A {BdL ?<ޝ e V˟zԢFw@ux,DVV(Dp[;n"P._nBP(^O[ jsZx[_^;[vY2-XQY5?Є(1t)%9T9^\n#[0:Y1,ax0_Vݏ54`m*!1AQaq 0@P?:h*Xk(B Ɲ6͚>?ӊy$'1ؓ!,lм9ܵ^VWˬy_H669wi`?)*^h8$MPfהոh^Dw zc|ImsIog>}9!1\kDd`vDb9|@iaT%KӔrÑX2aR$p3%Eٮ GQ ­ lAND b3Y2LcjPp}bYSw7َ " J [n*g64pU7{6G`Q6}ʠ`=`bD抐b.B&)VE ?b# o1S#BVt3@, VK#כ0O:! 1xZ*ވ*9@I#, Φ-%dR|Vm0HG ,ٍaiE^ZK_>SCTd}-(0ب_*\J Qƛfrv%f\$=5*uD %DjOaT7(gW+6RW:v]gAƲmV"`=\r45:s@" >b}a#eM\2K<Ip֡,HtXfOo,qV@VEv1 !&;{g|, x%Ȍ##I!pb kLŸm ]s!$=&RJTpwMz;%sS=R, d8 FufڵsEIl:q+VqK⊴Ͱ4UFDHb)MP%RKJK]HU jLR&Dg 2@. U" Va FlkD.)!+ VU=Q^(B윋=$-D`[7- [0hjW@pd1Z1 ĀwT㸠Va&tAUܐȟV41VZdZD.CaBA)p2+i.!` ښ֚kxm%!E>r?#ЏGTE@0wi;*xMA!F D\ZPFd[%jeپv- [ $%0P @ &M%RwQ(fdNQ3Ua ^DYȤjϹ|:m d"G`TjCA;};,u4cYFqw  i T.e'Lt9"WAD/EA DgfMլ/(wU6hƱ:Q c?&׃#jQd a;+@&!j$>^$ IQmP+4mCnd!*Fu` TKwcY:KӃ Q_~f)z{ DOgȦ+(oHŝz&À_82?cc;-K8^=qV b?@?>Iˬul$f D5W GhS2@nfR ^GzKmubaf#haP  P*mD!\wAvC$VAH,5 iZd, g@!PI 7_Dq;X'nL4`v'2 ֱlFY )$ A(]vx|^9sqC` Zo'/j=4@0*"8@6WO(9*=jA<"qnHٶFgp"dZ4J_9K,հQ1ERʫj!Uu*݀onzf? ; 7yl*Y*$(T.0|[ #EtΤe=QF+D( Oo'!2=:x<6ZE.y`֮{+ҜW-co,blUҒ*]Ŷl_spH٬m*BD_&,spɚ4Ńrb#''Dö\a#$Zud|'CdCR/_:|&ʉ lFT{CVq]M *Gbq9aQ$56Fj#Kt[qIbizqX,_Wc;3QLEB8d/l`H2"BpWZ`TD Nw*(ܷpCd hFSVny̲R:g&@gAGmO*Ĉ듪v>L,  "G4B] w~/zF1 ЊkGp qtt[# ɐM;b LAPPTAq_Yb\|eVfOp΋qa9i/?9lBitJde 1^`k(j% % #Lv4,`spz _j*3װa"ޜ xA47P0nNE yzɊKIy8݇`hFL&-ȲQ>Fa<i\9қ~8he4L]>m&-׎Ov?~ϓ $LM=7cPF|GF#W #R1Jx-@?XuJ&X qJv 8CߜO~7{\F;r?ɝ(\.]LL =>%ssBΛ7 PV`#70+ Xg\3Kx6>80#Nf]C ~n4Ǫq Ⱦff쮵Cp6٦8~,J mTD{4?}ftY'  ~=q<2a[5"2Ld8""']@I(Ƀ3yg ͷqOFF^9kJykK 4 R` bh݁tZr^v57N+qgꚧɋN'iV#-c4M/0'AxÝ[?;Fos|G<.ty<pPtIhq MLldM3J@>p`i{_s(?guh8#y˔mri>RKR^G_J@-">QbH,K*16M]$Ŷ#\*Wck{o諾c⠤~d 2 uI K ИXGp FWa *Hp]d \?c^? L?ŅEU!pi^G&~,A>jT*نpi/ImS ۨrsZbٛ3ޜ]ZtWg68W؅0~̔*2i -#v 1Jg9z8(9sSY*8Ft0C)kSx>Y13}a5C]g_?XW5q $ , *QowB¤Sc%ՑJvƋJAYY@,PIq$ƪB E.X=ƂL5;.[zʚ E12^cc?Y _`j@rJz_^ C;!>Ad!-UZB'~A>U ɥ?& <r*L "U I/Ι1 b"йCZ3tסH]vHXUiHU])W򰡟8ᓄc#"a8*3KGC偭y8iIYJ7+#<(pe EZ51a219hz@(W߃zb\& lrj+'uDxL' ,MZ'~3dMa[(]_m󏓁AzDH$ 3qpn(05SѴ = ӑA=F U1gV*؛NLcJ p ۟M>$ TˋndS6٫ϴ2l$ t_IYbF.St9~.k.@үǀItHDEC@4HǍP _-Ǔےfs#Dۄ5@y @ЊB!q2l*zx><-0GSS[8Xm: \*@@R'  qڍOҟ _@1 QWsfOѐP"R0R2m/#:gLLe\OcظR[8HބwjxW䄱99tpg^#%Z̏<`l37x11~uc:ַaJ SZJfleĮƈa4ΖMyUv@B7! %mGbq¨ۓЁI@e Q ]Q{6+,z R_$ou>WP6K ঄Mxl17;U1cY&b(ჸ  N {H%v}8V¨d pYg@vI$D5\4v^Sj1Yꅒi) \cr2Gڀfsos_?EoG/EmQt&Rh5N^c\RҢ.P% i`==H2Ni TUo4!(AqF9C:v&)HŠz EiezƢx}?㒯/1f /"8m׀{E$?Id@ɂH4 R?7 Yep`7+*ϑy8u"cEsa U^êr `8 zFv=ز 2Uֱ$LDuiTNrP*P;PS,UH+[9G(:H"&[ "\ӃPiN@OeOڌ۩\/xITT.`D)2ԃA zQ[&5z?"(GR4|`[O/dRꎟ?Y1\VR򡙱M{CZ'.W7xVfj83]|r` LbseSGNqfyjixF98uO RnqTG `vg(! 69K*=`4aQd0aA+R0E'Y7h@K rQ D˵4<_M3XYt}xw]kV$!4s! ١h4*0TeӡZL.BA6[P XCciK̷h88.t>9^+1984΅ȭ3.u0(`=ߣ3tƏ%O{!4L!>y([4-fmMMk!h)٤tr"0"j!Wu[;S'U IDř({Q6^? E z"D-HYF5D eZr)Ck^ĥe Y[`i~R"#G_\a7IO[J$,.#Ifo+ˊ2y_f G<`8'@f{2zNp+'q2??9 T`bH2\(RPCFُ4!mkQh wvt74ˋɋMWk6ˍh8]7wekj>f2V.ll]RsQAK(".kMIVc'u$yu XE)Ɨ_bu~Y{ 6+t}~Orb,հ 9^g X7MSr:J3^w$#Y\/^ڵ`S6[Ɂ%谊h6L]*&GtIxPn#lcU7 pqMk+!n~G_2PhoɁ|-w n;FD5Pm*aQpAT* &$bxun8k  x?ox^!^\W*b5Ƿy#8X5\ZT G xqp(c`SeB0h aE^k_ EV/.#l AHNQհFnǬLsG l/bԘ/1|F.`> MbhQ#qo(s: 67 8Ĺ`r_ 78o ț~3zQn~ܞMOS?4X".arêv"4poFCA S3/uhc&)x=0lx>0Ws~]Z;K!Q%|''cG.CC<XibL˒S;=L'{Σw`88q&;UƷY<'JEڶQ"]ZvV.8[˗%C0{ztO8J'RR$Dj_nft0[G\0r̶JEyHIVБ:\&:rFDD}rAP]]{$lH"8qaskg4K q3RX @bCQS;vƐP3CH],/R@[#! |hBz|Np a~Ls L/j 21H|]hӫ-'N('}MA "FH$c1RHA -P9WЀIwk%8[x(JlCM Dn|E5 0  4QK+$:oeGx#%wK^ns˒ k}LdpuA1[ʑ,M@Dq'$[:loNmU XjΔn-lbIRDY@Gɕ2l՗5͡X!}91.`H*xĴF=a=70;vS@;\=܎?MFh|wMOO5U]_eKY?X9G}0 6qqu)|/GlO<kR$unA@"s7rex1p4W "2XF'~0PS "kDU_@ E2:}o˕9qnƼxξhQ5f"Pmv}fjo(4Ĝ^IY\ )T!XYl. h:.C˾9mayavi-4.5.0/docs/source/mayavi/generated_images/example_julia_set.jpg0000644000076500000240000014734612747716313026641 0ustar prabhustaff00000000000000JFIFC     C   "  ^E7'o ب?(w҄hRwG%uKVs=ZT֤m#2ҏ0J.E-|6P`ߵ&g3=j5Zҙ3MRJ,&(hA?c϶ =+YgdL:F!+v_¾ty]BY/ 2, ( Guh$oɏ gU..3.iq,VK9REQ~~ۢ"]M0X1y|:ʰ>9^ͨz$iC;G/dݽ}X Ԕ`B6]fyќJ4@kT]Lf2=#Do7!fTYndvOm)OFsf-fųzQJ,#(!l6Ssh?^^)j -M,!jy5X|Ll0{\u.,swQ%("HݶA9zՌF76J34H5nqZâ cl/2%PV-@1ie5ɨ0KADϭrJZP駚;EEaR;?b+0@QakaL ?ѿ;yeуX6C"3s&$*OАA2g:N}9lNC۶ϔt@Ѱ/(4ڭ=2kHBz mtyB6P\sEr՝AZxn8,l¹`lޞmףv{+s8\(0 B ‰foLD+v-`?k1➚Fy;,ذ+e0r37P>gie;/;1~`(?pF/E.3-?6v"xYr9i֐jVPk^S'Vo33Rk9՗Z5`Hzx>kotr0Wp1Y*9)yMΤEg; Rwfm_6mǞ/Og}f.!"#$ 231C%0B۵/PNl̾Y~eէo\YR)&iusθ@?XkG>G>GZnC\?ז?Xk_ wOū +@E%CLqɪ BflWd׀_qՍogh$!y=H?7n=F)AUPni/?x10>%7^ 1)NN 3zzݫk>Lw겞+2|r_H? ԥ g{蓵Xt9 AQaQT'ESɼDR>VߛqR8{ZvrV0BG~G{K̲i:]r؃-I_*J8N`Etm  't6?SmyOQ])5in\fd4@8tL?qYmmtZl /ޝBEnE(.b.M Ed:_3v8x*MSeחQ|uU`~VRR>+=m'i_¶`vu3Ѫ}*Y樂:XV7 X%Xu0J֊i +lnf5&;xAIZNr?8J_;Rhj ʚըOSR=WԶ3V韠JN*W1ڷ!J|B;S||GuYp3fg56φ޻^ٸ36͡o;ϯ|yq/jڃwRR^h2*Sj\f*3/$IPRE{R?q,U fG41`u "mn|;^ ㅔo4j+w$DROq]GT N!ypp͹v3Omr:(c-d"O~[~]fX³2^#ϬE۶/jf^#%ib>7vsJ/ȽmX=zE-q{O>@*]M[.T_I?2$9𳓶ˀ fWq"{!iR31_brԢ*6@Kqm$oX2iŨ54ʂ-C\5\+Zե1=T J&nYORogL(sϠ',on `ݚMՑЄ@KD Co߈9sR >/3KR:ڵb/,Ԟjm=bƪ !uk\LqC^NM3.pW(>fZ'=' rޛzA@*ԕܑM0[֥n)gSw1T p z3ow~4ܵ]rQXnQsQC>dd9  |{.׈\>>èf,: P]fKAcg;ȑ 3q[Kc,2 ne&-\P8Hzne8Cڭ-}*{ouP5 溶 *Dg-}ahfCE}bXrB:atq4tJ4\:I 4 AjnʘFC.Ĥkv$H'kX,iN <7-f(iIAǮ g-8@kU(}F怹}iI5)#zmy|^ڠl.I% ܫF:B\[LqMJƺtLgf`J1~i"cP6g$jkj !/CQ2,17eS:0G afA ž2lM C ֖ꠒnޓ@tn_!y;tKaZ:egK{]#u/3=:ϩňH- WWj/qGuv¬]g(J>B4|eWdgl~Wy%ީ!yī3 v` rhN}!' R񂍒nCvVZBLŐae@(  ϰt\ۨ -֌1*t:_Do:z'RLOhNp[='O)x^qnJ$2[ҸU>Q [ ؏oXq(RF|xg`/E-!N%D0U4ZbiYvCf. N"A%@!-E?$Pm(Yl(7:Qs?5ڪuczpLiQR+)zgz]Yl1 Ej,C]zU<//.4_>H-+48Z$=1&ˬ{ieǜTllHBJ ]8R|v4H@HH4M>Rڝ>]|Wn0hdXc*1(4e ݎ fdt'oX $lIcAYe.Vdo^ O;VCT2:U|קSt{`UXYKV&aIHihd>O$ %wLC>&_9*k,I.=%VoEQA,mz01>Xh}/%1Vo ɵkz*g9N TE,&&t̜Űũ>a m5[YgqU^n=ډ107ZL߲y:hէ2 X0JV?_s_@־Efۮi&T|_'(j!"Wot,0ێ @z/oYP5k3s܅tw=%)HZ}0γQ.s4I ހU]u, ]2g-\-M}@һQ,6ޢ ( oTt[6Q?MHo[OpM"b"r}8uU M韫;l ?jԖ%xg~)h6=DZ5To1^*K\mMJml!\F&PWCFTHjVIfCΚ&[Zx`cULyYBPrdGzma/g*' Lj/E֘-: RiL?Q\(ȳ{u8OᄗRT58%wm6sߋAzTE_`2a0Vv-PcvgǞjQC^f۽~fOQmT*ݴ̔f5J{cz=Z(Bt:|]nBlt퍳]sPg&MOS fQ*&H QrZZųվns'T/,-kaI[c5h?SXt%s(K֕"5 U=TxS/^ B%~ڳ>jvFIY`[HA1Q/B)϶Ua¯7뭪ΗR;|]yèz mH:Q/=7MEӺ迤ϩ=\Ч/ўJbӻkAö K3#C\q %DOsUHdž[:U Öak]Zс $/YfIm+RN3Q3V+TfqIӫ;ԏ㣚&TJ>3X\|Ou.8oufaoɉl}O3P]Zξ"^`Fƻ,$Eμk$3[wή[&Wa:s[bہ#7n3TI* M6X ǿUZ؂N.jW `1X݀XlϹeIf父a|M/at:_v!cX,6LmLw{n3FUY̦K_dwe9J?D+W2f-V]nT3;=e,w,x^62m2܌(*6]gl5/&/pu^aVYۀ1X9%Fș %"; Ò4um'F8_h4: MJOoedJU;LڇkKXg#.jE@p1Q'6 0_&j2];{枠[&"hGm45CD߃v&ְ[v<z}ZLF z2WN̠ĩVn[)R nPyxMKfjh{x(COkM妟P})jχ`+p<*5n6ᘽ0z`F); T6gDAOr54*Kbr#TO"vhϩM5nT@YbYMBۮ;N=F̥4eCn#pDO P@p'p08 Y͆-fW]k<ث\7m`-ǘB+9|K_PG%e5/'vgU&i0j+Tr)f[] d/xD5+Mmj֣xpgc&Q\w|ĔX) Me ie>#;r93,yZ2n^~fAWr! Q~%<5h,neLչGVc}'%y<|O"%ZJL{\eeB3`5/#"k80yPgb [H T RJzԴ4*U]H*" Moo4 !"1AQ2aq#B 3?hÿ=8N8M F6H}/i:pEo|At-9oqD<<7Ðlɜg+]fB'61-j, :3w`PO🆍C<~`دq3) 66#֤gzBp- N^cX|Ofiieۖ74&ا>t_9 >ce Acv""[yDLjCX% VˡKCv>Ԭmz1oOSkAЅ}jzw=)1kX{?u\Dr& xReu}GıB+Bs"UuC}A3ƵcIԹ=PO9/V&Kb}35mm<-zy6x l|OּfJ)KQ8Y,D5P3VLln hpT1 `e;G؂6cf>:_7ϣC?ZN%ZK5_>[7{p .26LúM1U4rpC>ѹmO֦&SSTD5}j,vcߏO7kL[ǬLʧsU*]kRxe*0NS Vӳ0ap"ZɦF8RO{εM3}x4b.'L=KP&MgX+nU^ CS>v'y7_@n-c{ s|L߉W79 ~q='iw_ ]eys+e P b, 9ca0qLR~ L0c9/Id@Բ9Ϧ}RBcB=npǩM+kϧgɿW zg,}-!'nw(懲`Kt:D2+3̠w2Ǎ ҄Յ 1h+4i"B{1^y3TKz+aisYZVPxiqxҷ^43ւOhF8ڼmѬ:^]F/#V9r_~do85R~dG`2)כ7S֙N5ZBwOJ):LB(X1(mqV-Yo]4áoe‡Z-eH^{7^=Z2S!WA^%SR mzcI K-sZz.[K8]W[fAY-o…׺AcΤ[[ )-ݫk?rZh"B79po{R N=|)QElxk'6ק¡ˡ qY!U˖SbG,f98[U֯_]j&e+.%ë]Ta1;e[P MඡDO [eːIy~_o+sor?(OsjHHטC51nv$Ӓ~uM*89niÌh*߻J4;͞O{~AYa+q7ìKcq">¸ >܊id{*),L59/iVg7>Ըl3H+:k ;Ph=y[z| 4]Kr[CF9iάϐj&S4bıkjlݬi2(ֶMN ^n X 4yZyzռN϶j)^l"HEoM4SEH -bol.d֧6qSmi#knQaM5lB+VW*t~&Ү}#O.~# Vo)aѸE[:݁Ӡ&;#֮qq|^i<IIq~ZJL1Q*v2ބld쎫ޮ[,;3Mn n?ZF@|FB>JdZ<5LKtQm+;3mIմJrNzfO]P!w#=snݭ 5y{faQ~sZDr7?zP?ڷOZ(oh z1(մ v{7BIYj/^kYG3~5ŒM²sBGj# 6V,ydյz^[AfnYku="nOYkkڵn3n>=_Z)vyç^RKydoVmrRs t"[^{*Iٿ!Yo@zΜ\ s:fЀiv->}/mXLssfs۫oú"8_.*@{ZvGǍ ED$ qW^Fge.=i n+hROzW]o8RGM›XsҔـ)ZLkK/"kos+ Rd u{'?S.~{5,oZBi1m[,t֊rXpQҫpJ0E66FNJn9b>$ޓv9Ǜ ޑM Q538[4($s{[Mr PVKPaޞYN]M.cЄ/{~RFPzއGk:+̸M7G0Q^c9wNaRxҎVЍCrF}C)y@AieYNJN.P!6v3^|kU;<-Rakm@?YfS +^q[M{b (lɔ̺R۩H8TsC-@[{MUߊr{Ǎ o<*,z>|~Sg%m&<*_Ql[Hn}N载m>T{Ѱ*swBtICHh51bH)kjǾ8RIс ؏q9IUivqIDoW?Cѿq/ּEzAoQ| E[Kw6Jl4͡9[ѓJbugf4d:_AMTohT+g٘hh̑7(kޙ rFLph6Pё[rۦ}Vܫk;; |f(6tҗ aRÙ)%rrioOÍ{0i£̙}ux0Q =[wnQbS@15h̡sZIoǡ)cC!ʝe+2S:u(&spM(޳syo˕.h7,=/CtMxnѲ}C[*ʚ @"_V(p*n򭐅̒R3K/1PkF4"ٽ:$sL2 e0]jbwl +i>:򗔎(by_ȽP{koK56xZExvYЭOǨ[&P!ecm[]*..,sIrl(E)a~)PK6-{L`攬NGwƆNnloaNz@ ɭliւ#17WGv= I,29wV@}m 63m5eGoӏ}g 實QES³fjn5M_i1OI L$P vrҼ%?R`8;V~ѭa~#SOl@uè$0dQΛ^Q,-ziq3E+dgW<ͻKı(yCʏ:"/ʝ?ZNV `{gP`W>-v08/?U x_QkFaq{XF_f! Uv]>t.}b})%T$cYC[Z(X#\qyf_oi!NF =#POe]xSgaboƘ).cX]l_ÍGTHE"ĜPŰ[4Lz޿c|JI%dl#t7ʀci)"/m`%-p<)(ЯiKP|M/lWfްҷZ6t=ߺ]icN9RuZ6wt]S,f)Ytn*hH{\ie_jg.v|?JhqJ,Th$%Ft] e;ZqυG m QM s.x)5FIX^?B͇Հ5; fljʢ /0Bfr?JYX)Cl螎NۣY&/eTھƲJY5|'|[uפLM.5iϓs+kcp_ 'Wk0*{})rr hӧ:5uI&S k~c)&N%n+[è uq:XDn^FkXە:FK{27Գ ek"E˛qՍ#xW1zTK ip꣇LT۩v}Rc牢IDβ(oOťqkӅb0r E~!OKڰˆ}qAoϝ l5X7 {oq~'c¥xFYҗn}EdrnaaoɄFu˗? 9fp5UU7*wKsiçuVge:u,uӟdqo}<2)̼i$b9QmkoU{z*}kͤl hڨ4a"d@S$$}:]tV%~UAw:Bʍw֟ %k~uYԅӇw޾bh4[Z9!P_y8i}g@A'גߍym@Ӻ5sN5U?=jU~;Cu[%khGJ].Eo|9UZ6qҬE u|ÿjN84ҷHe5~McY %ΣNscXw+p8lLS7P8 %Spʥ̃0+Z[Z1N>4V& ƿTqICgB)EѯOv;а9J ;V)J Wc M~=Ƣ2xwE]u793bt~aX9 羚|3-$ǜ՞T*c;eKk5))7elM9QTosʕ31kƿˍl A?@zK[k)5~ vGL?sa[fѿԯh\o=k*}*9d{[#k0rl# kkekdNa{ԐISb%r0˕os[R!EDRV 4  |Rl &ץlވ;)nXv)Z8myWk+H 7skG )67EOsbGK-j.5mũ_[[PU=oNQiVy3 Waw瓶^MٌHB'ȍ_JdAs^P®aN:7ʼ㲼ڰ! U3CaWc|5H&}yQ&ImlC  Ȓ+v9^JM {lӁ}=ֵ~))ݩDg&B>mxR/f+m*^2 :|2ÀSaWyfZ!ʧ=)pb3 O> _i5'zHnްAvry&MhTӱy q ;"Qٸjt/*M<˭ 'F}^Yb+eTܵ屢=pq~IŅr?yJ1֦NT4u7VsecQhBmV=׾PȊQE$b';Tgt[43vT5lBO3[8Ԗy"< a{ޔ1XbG6JE7S^p઎Xs4"eV);Wp4JSJێ#Fhؙ g 9h/ gٴʂKjT\O;ֿ}>ElU7$|*ʆ]~uF{*H..V(5şCm9k򜁀>'Ƥ9 pz<+4"2O^MmRM䉙 Om18Hڬ7zu2,ޮ51'/iW:Zޭ(ò~VFbdzW͕31W+ l~< ͺ>L4=MC/Ip7cVX/Y-4^LOz 1b$i^-I/<+e[6%E@>h'&O%ԀlފƠ t&&%~4\8PwЇUU~Fh&SOh6& !gys!OPp6!Pu5.F"h6A#ankt]oFH1,c{:(Okxv9B*_WcYmƧﭜϢxBa#ht>0&ƄkF*-^ ٯ5F\0GƉaӛ}>=>6EU6+Ra-R|>b?⁇˗ ok/'WCl^N|>/~l.-BV֒\V +;*w}fl;iflmЏxj~B0trSG_ڤ N?EpAW"[<&3\N ǹ$fՀҽ哋TjW5wd kK\ۆk^DQJѳFdrXy6<5H3֌5k4p}^?Zk^7ev9HRsYMsݖ"ZtjvjWQp)SٞstY`"w^3HSa׾ackko̮֙t·(vAz88`[xH[ qe/}$VXr֣X!OeƟ `"rYpȧ.tئ즈:Lč/.&!dsճg٠1Wi^VaummFI\*$Д-M4t هןOҗ"o~t` a֦G-8lۺTJX%[tZ)2l)sā 0DKE[w-v;@sް" );[~B^FpPlUp-P|hqBZKŽ]Ϭ+,NfI䇣7Jnc$g?Jª~֤y έbTʗ#{vfQW1Yu~vo[&k{:<*-|kkªmF#u_k{?UpIq1߯;fkko)=j9{eҶ2/}4Y^e)P1Սt{plm’%UA+^oXX@VbkL*FH̼trkW]55PGCZWRkQxT{9VfZ7C r əy\s(ʽll 6(Z8hQaeSaC f+הXBͳN;(o}'E.I\xj\l*np,+y9x.LQd(8`Fvlfo}E Y!F(!1AQaq 0?!@Pr_f@wHGhUgҸPzJж\ 6Lk HpyHy*юf3-`'$/CpXHW_Bg"M4M3wͥR`v`h&S)hWV"ncBVK5cСA԰b,ttfJ4q)ZfR9ٮ>v%D!eJ%4@Er$Zg$ÁJ@@.޶^sR'kHLLLP nҙ<4Yثk-znaTTE2wv6I+QޱBɪ&"t.Gc[)Hgj}?'ϩUȨfsVEq'.">㊘WbM$ 1 \ˆ*9qpL{5(ږb2>BӚZF-Q4]e'`{u⳱\ Ӯ-\) c40{oBTXcVp+M dB`0w[7K9 A+^SShB~ DE徼S4VK I{jhrXaPL*-Dd r}w6fֲ .چuoM<[x j7!ǟFs7r&XfḦS,^_;IqCQ"Vޮ#V_h𣨕'p0j ŕ2& t5̄HV,lɼʮ7/8ē13Ԧ^i|Йq$|D m@ +^:YSɨ U@aeIOkjɏ.Q_*3~Yحl~rCCX^-r͚1ÎDSͻ+\*@04 ɔT kO1auiciC&^\{$Ԥ2|pX̚i,⭥xCDwe/u>?yQK, 'vIpm+~* ON m1D+l2c+JZ&;ʄn4rR3Ҋ[qVQuVA φ|R@ž[]=4Pbw".a:2~M@>vRuX$5Xv~UӞP0wmE"YWjӪZ2ڏnǚS1#H8v7%w;)c"Jiȶ+6+A+bleMA~)R3/tOA(?Ԝ滓@5ON-QKS@_)ǯ̨GNTKB=ءDTIcBMXKԨŷhg н%SrX7j|cXe5VӬdUX#Mukf&XTTOuM+&l;$TE ݫGW’,,[5:'7xTi1 fX4(2Zݫ u7BYE|} PKL^Mː~(p>-aR_E( :R½\/iY~/@"|)=<#G=3PtvmGhhZ)&gU0X)i/ ";DߊM>mՐjGFK|T*؊Q6z uQ5 jZF 5xSe{VAܒBJ@vX$DՔx C♌yrE0PD{"Y=w ?ndܞ Ӧ=M_hhkIZ^,G48XgʖzU et8{:j4!(:mW6R\VP:sC0>QY)fĪ"Q,5 P)蔈ua{t2_MJWe95 nCy8mIz7֌]Ր\_SH*) +-u9 9WJ j؉3㚿,[|4;x4ROs!G4P=)pg]$ ѭtTAc~jnPB@LS//Mf詇h) 2zVR  zw;zrw9nϥ@1N8y1@F,,qF!R#s0~hr~(A˥=*XzZd1٘oK*di4 #Ӈ:B5^n$<GCGdYR'PR e%]=QRuwNOb튆qi7?Q 6fm/j#q&2 cU n^Ҵ3*6_7⋋ eԍ(go 7{guBג`( a;dO$0l  %ŕIIX<:κRr%@6ůI<ȀsȒ>jhВꌀA@$F oE"ՙ?OgyiJI@Xbߖ-\tYb^>[i2pfF?O H.3~%7 ';[I+)$}Bs¥X!iO< 3`aTBXw,V@cե&Bp͠wZ[6uҰ>7*bB%oTK [ZRPI&O~ qD]|ޅjۜ}h.:q H2)a`cͯQdZY4FDdWsWvR^)IrA@M t8ѢkG@UZɦޤ^i!7u=QN+G>R4A ƦT1J:fDIrcW \db:_w?C5SnS$'M{~id'Qh`K mGA5/4sX5˳`䨴=T(IMMv'Ee)֓#A&pȉҕ. 6b˪ p6BHogZEȻ ,̛A5~ER#-!6s>.h8:*%%hU)˧oDPKެGN3Oz%bhB7WboYNv$.kބT]%VbK̮p& qNH#>UYPI-T,N>\pʤm=THF:b<iT $iGU15/2T-f+<(oGK*Ƥ9|Ж'Od~TJ{Eh"1Ri-Uh:%H,P0BqqtJܿx[!ISDz@]G>$>k(;*g 8ZD#/v# _J'kB [8$ pVhWK@_2ς(T] ?lnO-×zƜp*M ߚ.@c`%ښFE`C$FQG}`YD&xC@Cvmn;hd\bK0ף@b:7ɫyhS9 ޲BI\OmeHivz8TŻ' {AP  KG !{WxNxRtlrV!,z^Hb&B]Df)M:+ ̜6@63A"F)~#T'/)IK>o2C'ׂR&,75af ޟ&:jqFflf{SQVѷ-S2}P"JVPjh22Ec柜d@TΞ+s$p#dvb4&cIڀ X S^Z)d\e=i$-0آ]'@qMns@gPŽ5ncQf_2E9*ot?B zK]355P`Z|Z{]@EjB'6cg$&}T-BjkRL7wwC (1D=<;%Dbg;R@vtҮBRQʦ U)٠qAqb$$yjMφP:uٔ[v"[` w4\q1V+%sꥍWbnBWѤ8A8'3#. q I"Q3&v*"[Dˈ˼c˛,ʳ1d\ 9K#yZ\KK D}S$a'jQp_h6z6-D^j7iMQ$:x체NNU;O;3-Dvx>h $ ӛqHLSSeО&*_ RwNr4%U8>R 6X: ]wZeh^Q@I4%l5bqPi2g=Ҏ%4v;*]0:-TVu 0c̷(UUaFs^mފn^ 3/h\ڔ!WNL[`:5 SE٬RI'jilQq^ <~EZyb b 8_Jl)4TuBS=NךlPBRTU `gO̗p.>ZVF_֔ivg=}UIr=ZlOJ:lLviއ*wڷ(nkH dK{-y&zԠe%t h!)ְ.mAC:Ss-t"|Q-dC.u V+pDKv6t| :iA4u T0{!^m@(&HcϒILR}35QZ=y;RƯ,h/[Pi2=8Vf-G,EdB^F+bt-x8h®oޕ~ u1ژcx@aNWn^1G9ڈзO/K 2?o]/zQp:ڢ9BdSJt-(ӻrKutQfypLXi,*r4vq -(VMBzh8UCO2h5{41'f摲%IRxhQЉ5pst7qj+~hŞ1qIiscOj W]?589(f<ߒAd7-m2 L3nE}|R(aj d&3jMXbroN&3ҡԵpcj|1AP)5xRw>~}pcSdHӥFV~)nRI/CSۮ@A"[7Z&dM$6}|Ҭ<&lRk 44۲XǴaIY hiXF ;UE@ZzQ~kiitGL-ޕIkY83gg@ cp7cѮH>&zeUdrsNXvM'/21Y}ԨSARttƆe0Ϫ(?oRB69*]z\}X:ۡGSo薗iq T뻚-K"47Ta^KԚV`C,v6L/g=Hnԭ" ;]QR !!숚k#tP6TilwI0?Z~SZT[gT,kӟ8N-%0{0+:P\?Z@vRi}UKu|Wv4 mAJ))Uܱz;!P #t54qїxQ4r $/CH 'fBn!?9b"ئ4j1meޮiM2@9]Q ٺ4L0.#@8WNaoM y,So0鴶uҦ`ҘltN-۞s2u(!BiYjC]*qWgz+T؏4*k#b2]~Y@WP֒>=o5j>q9֐;`}q9A·-85Tv.vDJ,Pa/Mu`(T\8`/\{奎!bO}Zy%vdL[Ws摱v*uxS"C"?;9i|/+`Ӥ4x9ʍ_InaP'A [ 鞝h mG;@Ѻb_D k02R:ErOu/fF;6'>WfUP>B(}@y,)>MڟLڀ;8Lui 4iR+KCe:> ޳iޔא(X {cXsn;].jf#À*Qamm^Rwrw c&T95,E/ b6y41'+Y;bqC~Fhf;Zv)Pp%,7^RDU#GƳ6p|2ȪEAS9S$-bD/ df=mU#O &!1AQaq?%^:ģ1i!f￈d} w2pJ_4Jb` l*5_ >t*voTqه O}`~5Xp\| N:oO ˥kWyoN):|Vш 5]D/}T]q*Ҵçʾ@︌V_>=j-GЪc]4RG8tIǷ:5q){1K_Z|tF8x,#fFn=0>S:|EC?m<{S]l73Iפ lcHo5ڕWg.a{^Ç=oBL,+M\T92h<˚*7uUN &5fEp Ѕ$.>0fw4}8~"Tmh7BuvUt`1lO~!Pgdnl,[?^#ݰ!F7~?ن5l,u_ـKm,.\Os\qs{f]4w iqⶊ]cBPf *"Ev Q180z0J_[{ x*[:c~f.q4VO/2ΠxB۝3LPpe(#^2.mXNN\^sR-+GBx;ˡe>:~B{z@5:Ax*ye4u8 SŔrU!W^.5e~m+1_}mʿ֯Yk>Q-wmEm5Ӧoi8+A0OrYhvg+hM˪`_Fvc9a/2z҆D@ct|d-fsϼЭab!Hʥn|8Gx64 X *nJ(>D~@ BT*1fɈ |Rty| So$UZ rƖ(@yQB9AƉ8BżB.4n&y9%1!HSæ_:43:us=cՏ=w/~k21M'IuS0J(ס=P{zK>T^!_)/JwO. ]rjT5*T&ک\~x z5@nj .("Æhٴ&O<9ٮ8ߡ,˱?&80%q/._= cr% D4|+&C3%**W,X]qCͣU;y7Qk]#!9dX-bc X8Cwh25XS\=IAB(XBY @M>?bY(%9"-5|\#VtzaLnQ8{r?a+ M+H5]>UR$ȤO"p2eJB]fҒ@C+Cki ]{{AwէrR:ƞ?(!1AQaq 0?Qw92|ɋGݠ}8*4UtZhmJoIJuL.&6^oy]Dc d84-+çy`h*b#Xb ;Plsĺ7Eoj(zPS2FB8ۥ28PKnW:7f~ūg;C0@Oc BdֽND0'Q|?!s ;ڒθ(Z&5 ]>ﳑeu?b}?' 4 V<`cTKaUQ w F4"W)k];@ꔊ9q9bC9>a_dW8zp?t 6O~0/':r_Z_fxxoo8 HN (uTJQ8o2_bH9`5igLy}Q8@ȷpR7?=Sg18],Īl`sQ9m`xp :W[~po\qY/C[|Nlyyv]Sp:&9҇BL9 "@lLK \Qdq+ğb(U8.Ttl$JTmh5؜8'`ۈ~Q'w( JUqfHbx31f@ gGc<Vz|8Ϭ87XJ_ 6].o>@<ۮ0|?&;-\ix߻, b kɏ-x4:/,wh\CW..=:ũ .Q ,(S@n.YhpQ c#UuĎ*wMpvG*-x@k$sB` "R@/1Ш=)0Mxbi 6!~L8'˃r} 7w!e."`@T^% `/*9q!Sj;QkF圻91$}d\*0 nMdU66 r Ƚo<=b[w|fDMNkfkp-~5;=lxUKChMhD8db^ǽJ@!z}:b qaH)xqfOkcjZ 0.Y9 Sf:N*EXU?%>XD{xJ#C`l10(4P Y2-݉g+<j"d]$"+YHN;m4at'4}ܠk6sR ]?5_w*hvhYMZz&"KNO_'7;"rh< Co^:+긧 Gygzۍtn#aE9*FJ19hE ɏz~䆎duB5_g% !+jN!''>(M`XF2uҧЉoW,O FN*O^<("6ްF)PY5 A 3k8h=_~=IH^?(;늷A=c( )R:c Ug6uCRN(4"8A @q "9,hEjg0"(9Н/?7 03fֱDYiV'jT`%?r,N`'8vVrC&BL4<)FLMyuH;V|95HFo`C5߫v!8\48dW9!g?,O(c=+D>.-f1P3*) 5;Ȳ1"KmZ/ ]Qڛs`P-8 PT'e:_ "rZƘAN1A gŀ8 Q&$5+t^(7w¹tTͮ90v-4U{RVU L%J}wCNtV2qR Àyo R8YȖ)\"h⍆L6( Џch bt~_@]mlFw =jz@i. v)DKh%P1ɍ؆=5o&R o&1Sr0X!VD "ˆ{"5kڲDDNIrP.o.6Lκ;*tgq.k ExYL*oCzTN`@@ ( x$*XxKY6),%d`  #/}gfl;[Wꇬl]IMlS ޽}h Hbo a0ZamAq:[oaG2@:B3H útpb.]Vz^x=T> <4zr5[,}&LD0~0?'<`RZ遹 \RwmgbtÜpBedA7~!@ j%ԡɔ -BLՌH-HĔDZúVYlYi Sk.FjB',YObΆ1;aՑ)7 TZ 0Y[[܂^>ɀN{9Moh6P Г7 S`Z^GJaM1ڛNz{0dq~Q%"_鉗P( MBcկճ|YzCr@5,p 15`TՊ2A1pZڴ S" |MFY:#Dt D~ъ*<IϠGA úfj,: @Mh6{, 167 RkI&K@v~fދ4.܅x&b̚"X+"TCl+'WM#`أB~?YR]E` ³ֆ6\ OSF0@=m~WS+dT'\>{#=0x&2nV]ɜm*l~ԕSOۄ.M =kcU^$\pY @UL4] \|> "Ky-&1[ o|bMC^/Sm2[|upE~?Qv}m$k/ͱF/i( l$"l@/0ox〻i}!AP ("|d xM4>$@DlN/XeDfgM47S 08(sw靝Ex)&Xhv5 ;anWAcY*/2I\]:E]3nkȽp8-4siP5 5T_e\{">I(5ˮ $F ׼݊.ѢH `_ I=qhLhmx"4kj<*g '厓wj`l)d)ݠӐB v{>*@1F  : H7D"̓@XQJ`_~$ i 7 QGHUmxbؔg]^f7BfV)ܧ(: t󊑁/ pqP}m2)Ri&LLJOT/W&U EB$|ܲŸ~ÉQFlr7QKO ߭!`UPڇ((m~F.9fpajH n4Vu_N+.Ƴq#d6 3kG 61HUhREri~ D<8 'dK`{.E` Kl ЇȵӼC`SnWA#Jÿ*1biP7 PуA0mpFsp*@P1l8* + (&rw1ҁUvk%.܌RqW(7o;n 5CYuyc` v=\*#oPE ֕;xɍ_D!ې5ۥ:c\,Rx7 sjЅ4T!#gZR^'Ȕ7GϤā Y V(ֱOYwZ?'W NoOzo?\k _g1c@ ДDp$<*I")ثr: BqEQ w*)Tlrm60!D9qAUeнd4 kg!F<yNUXP lJB<10lFXԫ8Q 38 P()t4$Kt;|:"ݳfAӁ.wB#Ch> Z(;4eS( CJ(ޫط[V&m4j`<">" O!&ͅ;`$nKi8 e u@%yO3.qR >4+M]tU% *,כ0k 'wq0r:_vٶƍEZOz@#gM]]ΰ k݀#U^sLU0XcYi{!`2(@(mf@!s. ?''8UXlym'j.Ӭ~{#&+jM-[myJ[Ks:* Q㶘2cA-YiM%X"ڶ uj .3A ŅP=T,5W @Aņat<>o59E;̘g3¾毡xGH.iaAlA[[ JVND!)x l(|qxh rz V*l<3If Go'ʖi|TEF":$lsEk*iNRݼҡ+9|?򿕧╚axys.ٸ"+̴QÎ;C0Ӕa耬OjO`ʩU1F~X]f!(1e9˒GmWiT[Dgrm#|xŬI89I|cY*KDQ$"ji*yTtc#L^ PQo 499^x6!yqez.@Wf'.A*ìrdYh QOTM_( PZ` RB 4 vB@h { ݎ^BC%vJ)Ӧ?NQtibatEV(t(u?!'{0S\aI;#}ʹ^``RANg+D4 {t"ʱћΣZ)/.6QZ^ }Ut٭'H`F၈:N8>2]@,r~3S~p{ ?j.: aLnQ}:GLvYh.ZB"*H!mpHl)Sە%#+yW`n%eM=&V M]\9BI]F)"la1 C8,eF0fISl &QU&ӊ΀Vؔ )̐ EAY_ AICcBpSa ʛр2":^Ea'e/_/Na{Xo9(Q6WzkV@*OM6 JQܡcVu hx:\̝®[`6hǞJU5aOoCOrU78pO3I00sh bF6Ǘ*YeM"V4u-xMWzmBXi M #Z"/q!SFpiyt$ s(Aȅ@ꨱq;& pBlr6b" DDJGa`菵rI+lDbS |vB@<> p)2Vxb8>k2˹]ahNXIG Y-:; #&t+0aX!^kTPF!*Fºf X;<_76Z x B'xIwCsD y y'Ph/\V^@z )h}ޠnH^j๾ueӧɼ@m%QU\]u(#9Q"ֹYI}:: VlݧTP]LQTYM@5wflsК4JMp+HCs7+ˣfMI7N+=/!*t"9/M>_V; ]>~3SSpX0pFtų 4 N*x@("=;%zhG6tlN晡 !ru"5ҥ!<KcNe(EA¦E7u6 iV!-zA SF0ȝ׽h:2۬-4 0lP!Rb.,g_%X%x%{NA fO|+h" 0[C";6< D XK+t* !xۂHb1;A'DTۏk*7VM0%i`hXBi NEMia).`rF5!Bۂ$tpiEֻIT}5#n/kzv> Jb"nխDDjU{H1U .4oll,`9H^醉a| \hËBSXWD=h]"  pE)֋u;:["; ҳ/aoiGЍ}:( p=ٌYuMy eD!F@c[AWT hNb&מqH"GSařz% SHڽ>H6eٍ>ޝ^ah)>çNɱ"t(1PbNT#x]rNdD]vLT_cTc^c08d;TH@$ ){(dAZ78$08Ni 0+Ƌ]$7(i @(`^ZGOŶ~VK($ƚ mHNdy5hMxt(SO)^ P z@'ponɽ5]BI6)#L5 ކ]]h{@Payq7̧lNK0E6F 2HB@Ûo`yp0"  үp]7dhB A΅f +, 1ĂTM|̪uij] ALdn6Ü #1$ȼqIQywʧbu+=bul S4+*F\] S y>_ڿcK5oSurJ:h>.=IZ7AiG8@! p Ϟi])Q/+ DqB_§/Ba"ݬ~p WOGhSA/J0ZMcTáȀgϳ5H9ٸ]CpdIPGJIyU{Apu)u5-yCJS^t/l`q"i$x7mۑxP}9?G[J:/BI8،?"@F^r. Bg!hU"I0R-ߺ)62yW] |DrfqtC EِGFPD#Cfq 2Gk%j< KאiGv"i06=+b_KX&x"He$~Djzs(+ xKî*]ბV? Cli`m1R 8d{'c; >zˆUj(c'=)rFֹ(AOXFP;>. ĀbRpZO8e@:y~ [V t|]p- !qʤ)ۃb8]%b6;o].^D#LhpyVZ( ɗDlUb۝ J2CݰxIdCPG0?Fċ"pHw`miD*@]qw"R 7BF4zל #:PLJR4K]PAWV`gOiUo=lo .ZdJl2B5+`M֦fR NMy&* Pu(PAJ*UnOW'gX n)p^yAk_z,{H6~*)|v%ups! M*2B;İBUS)$Q/ _ǼfT(Q>|c} I@MDk)aST\wCi{7 ˻՘c%/`zn=o Ynj75pw4EθVNf@yrL-A+"&D?&VٍyUiz Ϩ^#A[Uu*%am4fN @+Ameck vg@ʜikv-1i"c0yGăP<r [CA1/p5 FH=wJBx]\'P ]sC8Z>wX$"%?&!QI ֜MGIK](#DEŨQd^-XcWt LR6_%k\W]544]hɿNAhqGⷨxmdURbŏ#BQQj(5^KFU` `Aj3Qm[ɾqقH^stI(M< .E:WLdR,bBѯ^1*Tt:n=ѧY)Q>Y3ef f_NCJv/&*8S 󔃏҅<7a%  bIJC6Y4xby=qsU_٠2` Ak7aM+SI68DH<ѻhPzӒxiM2}N/(O$/Z-rBql.}Cn鐹,{`j^F[t)hAq>M|->_bxFi4ɖ]M8eم^ 6+3R? ڼo"ø0&;.(+^9Tc1UTFT A&u`7ׄZN~\|ƶx0jJ_ѠH`tn.< C5a- o\bHmT5[cb] $tXBeG5-<~w,Mp598H-8rAynKRq+Fy5UP+^~dbP3]8qN$Gwu=~ GLˣEzZD InGQwL[: DZR_naॵL'5voSįaްUjO3\QN U -Ǔ&!9v"PPLW$$AU^Lʁa{ .݈+%:G9Wڕ^w(bTk\ۆl-E|bB s*x<̖KKqjxc~х0aVF E[yc]"^p[H92Ggdts !ǼM0 <9s>UitXTbrägZt9&;[ k*5m2XPEx;nL*B5AD^eۺ.Ngr T!8[@BӨ9S#Z=:ħBvx,6:63U30@/ =`pZvQF,Vzn E^F'kqiTAEݞ-t(7;kcqJ@1CjT{i!6aŊmߞ "q#Lz#]hTOty@zn' (4K9-\Nm[vǩt08oUMMRk\zr] mQ9/zL5 :eo 0tM rj.!8((DfǎPRyWCMz֑IΥwY6X,1PqCh-w@YP5{PEqTY (T 0``49@A^FYQ{Ґ@T \2ЬjtwW QTpV0'sAbg8aRG{F_S}ÇJz7CC$w`5FDVB XE^Q/XAet)VVIЋu 5LߑAXm hpu$+Jn&d=*)tpHַWB8R': l;HZH%׎8Wj"u q}QsEnSDJg|[IU֋<(ϟl+p^;o@;tk >L>lú %%A-f ` JGYz' y"Ra dc(axbἭo λ-=>h>n] N#ev:$7 H\CJx=wt]fܐ`^#}p'HQ3MŠY jNgj#-О@pyH+3]z='MJHpKWXσx8~.4 ء.tcQC ;1tO&]Pگb̑J#9H,CCؔ4->u9+CWjnèEѠdŃ 9-8YpG`1b_"V/DCk{jk*ü%QV&P1"2 9x" lαL#E<ӏغc_1~*&&ۀ4ҷj)t0$(Ъxe AU)Hk5 ` J lPXo6 @rxax 2l c-VWoz'T²mA ch mQ = n$Ap27Y #Gx)+%vx#"!~qdşz8)z x*clP[ Kq1J]ѼPouB;pA!t&s? $8'ȾmMkIc!imfQ]9y?mayavi-4.5.0/docs/source/mayavi/generated_images/example_julia_set_decimation.jpg0000644000076500000240000022535612747716313031033 0ustar prabhustaff00000000000000JFIFC     C   "  ]_)K1 2T^eZ'誺wB fW3՟Aoi̕ dm(ۉKa]<sJMfVԮ `ݙ$prKtkЈ l`汚1l3Im(tj|v&eLeksD6ZRӶWc?I&sCB+~y}5珧H3 [5ZSNiE@xO5hٯޱ GCnxLJg_O۾ڻrJ&\ .yK뫤8uVa-w/2(9iȹ}Us؀[s!{6,It3{χͤow<]"M77n[ڱqT3Kl FLݡ5A@lQSǀ`ފ"g7ٰl^Qùa f#qRa[}nB78s9ˡhi7\ N*T/q˅(^U9y.Ft?7O/* w<DV4l18W͒%Agi 5EtGYuH)܈K)c.(9;bWjʯdzxɆj\;*t$>.ٷz,аMji<<ɣK/aަ8- siPHz]B|5WRE39?wc-S )fkO.ܭܙ)fbšxwpn~gr,:TGMj3k;9ͶSt\KL`X4`\RIwԺӖM?tnmζ#'y._$yзgɝq59@AZ)fO|a" m^镸_;=k%zF~y>be#чG)d 1*VѲK7l{-c>ȃTuƳat%t:t. }7L!m\kFƊ8A7aƐSMVիdۮ[cWl>5QFo tըǽ~C|.󥃝|U 琳ӰcҐ<7R简FD *3\( m-b}4ʭ3{FVܞkԤz7, kg3fyfoUkoma=7 Yȇ_3Vr]< *5~O:>s犒_,\YQMrƚ=[FikZ`J`|=v%]''+]KWZ,#|٩U{4Z eʪ." BjD\:*몼Ѷ~^^E8ȗ%aU0VK {rt[Ԕ>pp%s%.%gW0?S:61(3_!/S ':Oz%v>CB~D2D``\:4ZUE{nHoxMHf#C@6Qҡ}@e@%4`3:2H|5P|L?jV=;) N!Y>dr~rY ~\[[B)pgqf5VMTPư:WU;Vq u"_N,M.8MJP/iOMLc^d;YG}^~>]0l-Z2иq[\iJR+nȧV\N-Dwz ac]Vmd ͹yT* vQE319QݽwY،ֽN Ut_g-V_3Ijӥm1q߱;4Ct 2*Ͻr:c{xvڙ=IToKm1~bT02X8sHCe K#~-Ӡmctr,r&ahV灊o.#zX q%x }~} 6 RF!TV9d7-M0d<[%7<SRADT Ou#䱘z٨2ns>չc@0$#%"!345&16繝y|xm" F<LxX"W?ۗ]G8Z⚬|z˪W_o%ϸwk8e(JDx0G&2ke=1#%{mr=&sξ0Etǥ8CHq}V쭞btpDtOrq҉*:%yO w=w {g_^3{%AHd$ߢB8E`{}LMY-?` wk#'Y3c+V s1Ugz1 5pqrfo]VW$c}0>iքXo>9 #Amtq~3C Puyռ<) 2sVm}%?Ig*yUwn4.݄vڜ;,&tl=I* g\ջ@HII~|Kv1ϑ+*B .0!k"a5Ǹ3ȧm$gU&ܱPs-uOP-wN+!HaYRKO(a^y?oI}ųMzjk5{0<'|liIȱX)mSq񨣎IĭIT Օ0aWM˕BYEhEӭ~`yDn,lA(GNB Q]^9GsȞޣmG9axcMHu,!Q-De%NfKՖIlc%Zɜ~COah)Tq4d2a.]ص aӑɮxMuCX 4ƾML)٣KѺc>'&x Xyk ℈eB@##gL|=s µm2{Ϫf?FP%,H~BӞ5\h4ZUz[$!a ^AIl.m :.? :lVY]]DR "Ŧ~gYΥ_DU`#` hɌ/;d{+=Ŭp365g|=ċfJ!y<5RV[ RQw4Q4\TdM*G?盂4/<_αp路tpXA?b:=^n}Ǯ;VkqouXvLOöFo9JI)/n:Rn*c* [8ƻ l1KUJ b|$9'C)Sϡ{zGTSG5?,n#t)p Dߪ4Q [;ͬJ8y K?-*/8x\uY`f;|TԊǓA> F3WSMs~I.XPeZӮps}k# +Yv*  |}RizpY;f-= I6ιrHcs_qQfjYLGKH4NĈ=x8?(Gu)[8./>ߞ|"pݬ_XaY5 ;)ҠtKii,6 |rRc2G&ARnO񁰙i\*/8OIq|* :i A/tClxW};[qvGPF1IƛLvOl_&݅G>}|d9FδrDa*`孀u>qm췺},lTk׽D@k|Ӧzkaݫ,m7,u[rU甭m5[ ?s|AJɦ&#miנ&WIy~[C/' >~dz6U݄ dW@_EϴkΗ,5O"c`אX}^$vmC񔋙_.~۔+]%`vͥ:Gxu%b3 tvE^ |면ou!8iq~Nk!#1 O&u_bzo{R6&9PBD&gMpTleg[yίa.8$_ʵcAa~BȈ&RIA}cW_k`HD -&`K}t` Х}+U3_ Y;&խ_nE<_f&O8UBU Yz;13JQػq6gc>|,*̩2/la.Mkk뽉ʗ2;R!~`%\+9 r) 1W{ԼɅܖJ-]Rӆp%FƉ,Ͳme ^ihg鎠I[ܹy<kKcگ4iMr"4Q~_I~)U'Kja_%J>k۽\bItmKTzI zJnlw.1qKov&.zѲg}5~M߼w!o+cG;ƃ8{M .Ƴh&%?J{%sTl"+6cBcO!<c,3W8zRʣj7Ihku^:~-kwd U|-[)W6[*QbN\vڢP.Nދ(;\Ť=En/]w^NW',Ooח*TR6Q;Xc4{sυk19lZv# F⒆ c<{zq=/>*bTLN.:Gv\7k7P! % 3m[hMc/ 僤-0$uqitvB 5v=불j “>sogZ=-a|:U7v뗵heB4ڋaƷι4O-qȞnpu 9PuU#b'"C1nU#@2%> 38,2o,S/VBS|C1}4Kqm_ ^M1Ju._@5+pp "<2Mc,Լl-ʰ B?ޥ!y]*C)MN .fya $BL\*Ӱ@ӞuLu{̣t!iXl K2V EwTU^봩{knD嵽al ^ \@ZX颫$^"4VM`H]lbF<3y:ۮl@{{Uy3n<| S4ݠn96B-, Mf;pxbߍaj8нu7lrn6#0}onXujgu(X^=TsjtZAtkV=0czf۵Fum+"ǧTڂG˕7k4ÚC/G,ɩ#݉U ;[9V;(՚UܣTQ ;?[2n[0Qr =4dJ1;g)N'PF<ch<VbW8am*YԵ@TIɟh$GG8dG`-~g,CxU|nm@hUZ]h.$QU#l(":GeQɠ@'V%_~ΐd;Uv V6 \3fprUsퟭu9?9uXL<(xKL3f>#M`% ٳ۲TJ!Z[孷eh >ѺˢݚEDk޾g`=J\Vl"*_ cl<\*ݕ|tm_`,=hRG-J%al2RŕSSYI@oƷY[D73"NWp}<3p&H$% fiLall|Yj$eu8H]I[lP8",ս^[+U@^^UQt ]C #9#Iq*, vQEB;-b [e#[!MLEsY>8m$HcGlWм3lm čkkyu:xevieeJ{%ؐSZ3/0:eͻgzdoYdҡs6jZA13aaÄg>qRW^rS /V$ؖTYRjǬo\7\Zn[ѽ6%N?#8m:֠B}Rngl)X&oV} <0 i{f*94޾cpͱAkcsEj^MNX?snq'Βq&C cö=iZi_ƥMX~i*۬\e[ScȕX5kc 3lۂq{?PE8-tkSr֟:!1AQaq"2B#$4Rbr3?Gw( (UD%# G^BaUY}>)J(pܾ%UJWXF%E6ҝT\^7CҷpD{MhebpaôpPZ)_w~tMyDK)Y};iH8m W4s ibPw^ Ԕ( ΫQ'F2~7g.ګV KFߑBo#K2L'+l;cNߟ8CFf]M n= ?`F1/u%K&<$#PUZMW؜w %'뙅a'RJ)& 7~^2ZH8 .VԜ!L^q5GZKq H"QC4UZV K8̽iCMռW}Yju5 Sdj jj&$YӪD( np<2:crJ8\>n4S @RRUg֥WY)l#5^z{R ]|8@0+-.yZ5R=Aot:1Db!ru4Mfo="\eⳆqWoiM#T$P[U![Vf1Ui'˽y Ѻ {qRQVVfB[_ mW C!ƅme0f[$ߘ\0ղ%KIx60TtHL)8p ~xW_*6#TP8 +l8+ d@r>0j׮#{|Džb! UaDVTqbkvD`XT>T&1HCiiÀt)ɍ!5.}}KS{benʝ <Xl="_-0RTM~ fT DŽ %p\zWלU& > 10F11;2Pp=ٖjMW;fb`u| SؚP+AU]sftJHby+ ou0Š9C UFyDEhW- !VI N ,(Tz_FgK5(>À-Fz:Vi)΍}*FWU[H>ҁ  _>3f<07DBB%*Z~P _uy ͨTDߟSmvTH; SmHR)z9AyrȴSf<wkS*o _0)Abf˩$;C1RacM&l@LNj^;=C[ ξÓ:I)UDM!4Z6Лj볗Kn 8^xR򿇸O<-h + )e>~ξPM%Vr˘<4tA~:p%i9}! m^F\v^)LPv䣄薗p)MPIZm~B bY>P4nhOH"(L6B0gu#fi!HmRn*g\s]RyʛmIWW?&ms^r1x22XR ڎ[h[둉[pǿ8*UkXreHrxShQCw8.[QXqGѕSxӪMc?pҴnD*?zGECv}gvTo؛CH.c0Z[ k+rz&-!5M1ڐ~r0ú{D߁}c e(FqġE9~'/*g Niz~_SxcףvͼazS~<`4RĻ+}0|}TA:ǴwU ZUSi<*6&TM .&>g\ A;! /^"P.$R|aKқceIjh=+?8h)CC{K-e:Rr\u] P"[f{8ФŅ W¢–hXAK :YZ m8YRLCo#U~)M&n9)]$"#QB_Xye|LCj<8S+nV6~ :b!%-Óe7 }աhu&>:@il *>ߎUꢺuF\~`%\ 2Ͷ-_ƀypOSFnT]t6tNU/8aTڏSmFzO+:ÿX[yI6DM8ho^ȼrqƞR ]~[vWHLJӌJKkҼ|jsF^!M[fo?5!1"AQaq#2BRr?c !1H\sߞ(}v|+ttEccLE_`4Rf2;Bv/T%"@T \Z@܎EYȩ#t2;bvG-Pg0j{Dn~?+jp#FQSDYm{'$%MȌJ#-(guChў#f#:gMY<.Id>*~N^eg|T:oaY|qZPӿU h1~*  (Tr;pNr ZAWJ浢&d=N&ZoOJYmO7fvبj~gvMFuVIM)`EDѬU/=}F֍!'x&K8\mx mE1*Ulhdr &`+CC(j…ALhMG1ࠑM ( A!1=҅KT@Lo?R֐4' V[)9' y)a1> zǿ߼ҲџUe:X GT:N 4ƺ3 +W qnMe\m`n)Ri(;bsqkz]:10-[)ĽĕnWDy*:7q ăod& O~ƽ7Y` QgC3jY^0I^rV"Ѵ`?wJ mx){ˡ5efJ7!4wD0RB=Ndvbj@+M:7J+P1فXF>!d{) $ϟqs-M=̿RS8 <*w*i-ŤxTz=sF =Bilb+a&yb 'GO%CQ`@݅::f8|4=)ͧKeV[aAeρ*8%7Y#f4粈-ˇǚ F;K`GRQO?DT)bpPFXƚ+aQE,XGG>۴)OPӎ^4Lc$]hg/_~JH1= * h@&E,alܤ&]X}Ky/t$f.{֧% >J ),Top9F3ZZ߇a2[;(sh}r:{ǗUoJ i?ږ{ AaCk/g\xFY J!պqW[}L+QG6fPu5+e;:+5>i4SDߵVy 9ԭwx6e}D/> QpJfХc`MQM ޣm7K.Θq쌍V&јW_$MGx<E4 ceCQuf{h7v(m>^I1؅sVN7n{h-6j}6K5cP=W*v5J:H\Q ˎy.'fP4 af%W/. c1Qܞ;(5rߏ{T^)_%,2GQmܳ#>XiWJl< oV/#j2uA{G,{MpLkE3#l_PS{ I ׎=S-ZpTO|B"+\O3FCk}T0 {1xst/ E7~TV#mËwvhϋB?KeM62:+üPRJGFZ(PBYpsjn !$:6~ +5r_㲝]>mS#qpXed ~i9N4\Iz3OnZ<a .(Z  !1"2AQa#BqRb$3C4Sr %DcsT&5EUu҃dt?y4M!4Uœ惞ýr<MRMCe;kϖtWSGe*|>esqbywX`q >Գ|_7OI#y͔i,%\A ȇ X+o&XZ_!0R澭?;RAE՚*ٹQVUz62n~G.)=Sd0Y⸤M.6`g82?b+-5;KtN-xF6⍘B>f5cp# [~~3J~`,\cF?V:pGfD˧cZ*꿺,f} A=4?7fVf%+EO֝ퟫqxWkCIN"lW#c* zUDx \!x\TCEhwF;qƵ% ߈8P fĶm-K;TPi.W&zG{ "+ݵqM{C$ m{HsU ًԁ  $cq7GhԳ>_J{-h=v|fa}^:$Ձ~unQn=Ӭ{b4_YbȽc,G6yPW'W -| Stmc_ ه闢]VWO9ar[6Q7Mֱ}MQhRfE:wqH pʅYMOqT^_Z*@~:Tnv-m+NY&e#[t 6GJSVD=K7c"6%۪b$k2\Oi=c|x'U<_-b|Z)A4cEPt8I71=M;5$]U eז/<&o)0@FW;=ݷFjGWL:f۵-H:\kwgY6#}O HS{GlQdQ"]y^IE6?/}ǘo@3Yfh* sj左rME7ԕwS>x9Gޙaռnp/XKCP:Q ({D^*\S3xҜ.)E|3 %cn`Sv?t_ƒ1Wژ֐qiDdnΞXƺHeO^%ݣoT(Ƕ"-mWM+{ qVd ^؀>[/-FWz,ث(3*G>XwO#cVhW ۞w&Up-$*~= |;gz=^yce1T /oW p?ZtDLVqMGXHbh!Dn ':s_Ki)a9;<&Uxo40u J[EݭLji߆V9y9=Eu4rÑ^]CT:f`f9n#~orؤZ=*g?Ӆ;[Rr߭&YY]S nM,J[}+^+ep #6!-̕kõkXm*C6~C/* :Zq갲Kj]܌GRj^wʔao~[axj&FOpb0!ޣaId2WQI[Ye }q%)s2n,н0*w+ }٤{ I'J)e~> VGLhcJ@a}A#IrIE$:ǷJ:QJ,WRX_qpAuv[g:A ξE2Ĩ=cRW3@si㋋(ڞjp7v! &w^q\ȸ݉;E[Xo1X{S35d O!՘uomm$^A8*[2Xxf}KdSqv݇/[дt|JڦGܟ,ODRU@ODK?3#y3 1$H[MLU:PYݷvCk;3fk*$/g̟lJoG:hNK)sRU ֯vٖ,×xԐz"*{VۿCm?jVQKпiYNݷW o.^jE=2ըi <1Q:,,8c Nr[b;?6UtqJF82 _Wyb~H˪hYo{j*X4zf~ƔXyy-'v4N!m;Ȗq*ffVtu5Pİ&©-$,#Uű_o87bzS 7AW8)>w{Tgg \/ngM#K=xmጻ+m!]h~?'D֒Y5 "r9uX?E=i)i5:J8j?gz[[smF EU/蛩8=yBs@18*7k5 e?z#rIӱZ<ڇ6jX?Vl|Iӭ \;Tw;lUӊhrԦ8qg(t?3e `ye:e'y,[O|g=t%FXAiS}b4RH$ E^[aYMRjYh7(we]58J9k؂r!%.2nGt+:$&*35 |*z o,e]^E1Q_)~ˊż}\rJJ/qC7jJ]go0I/ՠAo2_mJXޡVN}gQ삒3vP?l,+zW{F`BU7mE]`I-< . vWTP4L:I$"_f~1ESPѣS2O5(&ol#p"IF1!@YXݐJx/WbvJ /!4iQ=ǼG2i~H馝k۱? -N; \Iq^eӘ䨈]JsvQX^J!vPnɡSϑ|w9=q?7aaIcq׎T p%J)ReY/_1M/&uJX:Pup[=9F{*.Jw6" WH#aqC/ߦ3Oz7Y?̝~XZKP!6~):up%yobF?˼t%Y@vo|V" K|!~@E!9qcobxTrVPyFLU5|Q߃3GWV3 (Kf=f(9㦑G)uտ59$!UcGOB\"$ :%IS崠,XWg#d 7Xǵ~VѰ|?oJcpɨ]Υ QR $i$’.@'miQ;h*#x_OqHRPi5[|UtT_Oz; c彻էmR߹WskEHT|IanN- 7 0^u|^gGo-F}f`v5%oc}O"!M_Ս_?y=d,-ʯ#|9i9U.y6,OԏeCNX?Վ_~ѵsf2'|E/r%KrWձKE Zbte[u߼@$s Ꟊ[8d_} Q<7f_Ǒг fm* NclX|qFoЦ+1&SiӭVJtKan}be{ \v=K% 'k03!i2˙fdM#![YiОQa?kl%%֒O9]o2@;jcEU/`;dELz ـ#Bloms^)h{I7}U~8?B "|-o8<.* 'x?̇7Mz\wĹVo%HYfQ^38oxe `y񊅧pb+)NuE%|8W̖PZ>f9j/HārHu4aYqg /DjMf(?+cD?&L R_)vĬn_-6bDH~(^ ^ܘM!tJgNDûN"N*!H]TyOvhMu{MCMPpTrՊx6JdT?տZy^uičg`AW*}sܿ3aڥY")$;EL3/䨢31D*m 8 3qR?? THXnw&ʊ./^CDZ*r`,M]6?@eE_F6=JYʁuAtncO O停eeZpExff9|X'MqH;A^ھnv;wق7Sp~c),Z&U,{3Ck4͍Q"$gStlMFY74 Cӽn6NI'b6`,WnD 77AN$\5߫45=~OE4|jt)`H2ibY b=_94:Jh :G+z494?ewIC+GߍLnO3…:>}pc{P%XгoEƠz$3TGԵMa_DF&&ՙϿE:P ]p6׻\w%euId\+m,GTwl+9e)QBtC {s{Qf2rs)o+˛ ӅdcUs.f֋I: 䊾1ʅYMHU9g\}^j{~(sCXsmpu7t:c5u]GsGO$gvUbt4샳Ql2ܧ5m7T;NPIxbj𧳦߹⢰TE%-@h8DWHcvyLT/v6Y n =;lSד/|h:M\Rk[shHqM8 f+khku>X騞x4ŕ /tntYV^I/+RĵH.zmΉ6K_Wdì(b_Ik&noiP'Bs`6ęCGi)7F`40TJBOɶjf¬s~vqlF?5(/&lEA k`CY&0=7Y4Fwi3 |ž:(-ʨTz]S7l$4r{Dfk$`mݹ:N(s+V9V7# ݵG?Yn5GїV4@|/を eafSȏ mLhǺ|]BvxdJ?~r#WȣxAfDz#p[k&o <.UѮ;2:tT٫ w'c6aE!؃݊lE(aoV7~]-̦2Zi- d@yn뵷#|$پ]uoM?6CER9f jI _TRգq\CY=أrɌltUXuMt8A*j(bC1yw5e[$&I۪<-o牧Np:usujmgTljV3;ZfdE[Bf2|4XPjiΔ@*8Lꮛ+˨Hk0:wnEk20V g SZmEX/.~/9n[RY5{4mW*?.tF:C&T6xw`n܆vӊ*h)%1[ԈYivm]{Pk{ƪ.(,ݽ7]xʲ,4YXKiDfbO\kQ^8hLb"QM݆xx1~ o m$ ek۞g{[K922SQ04ǥ)bLZ_Yɩjj7':$o,OZZdl=TKSLzye@U_m{'!q Wڍeǘ~FBFk2>c}1 eyl8~#F]ZdSz9ݗ;Cr8J:P6*z'/L>zmD*ϳ4T?ierph ߓpF|㉳!~b燥h*7ZSt/V)j}FA/Jݴ~y^=Dџ<{]&ϚM5yq-~ӯtmAOZe#H,p*A7+K$*!t-{1ݷ{2x*3(Y־uHkvzVR#t`E bL!̦Uy90;mz+􇗵T^)筊Ffi K7kv}fԲ\~B:,驺Cft,7EK&{ol *hތSX-7ܾ!󘎧-qv˿?jkSG$7Xv߈iؘDW.bMIk^cˤkrl&UT"{FǕsY():/z#(SXJDx5D`f_#Uq1={OJmIV&ZI)9@m8gzOv?W J_PO%{a~c$RG,f3IG_zB֊@_E!kitԺJ6ߖZfh׹F.5LʲBGC/凩Qyrks];3H쟬z hj塿il8\P#a(FO[ZnWڷe :I-'N8XW&di$| >atk[P0b0\uk)tuMDqA}\Yu8OF2xbYufyT*Է;tI=I3(Xpoǟ~Wf@{+5Rnt~Hc2hgjXΐe_>~i38D!MRf/!i6woz3$,*PF9 xմkh5pΑS=Q\XrPmtuST練9{g ORSqoYcP&߬F*s.t~^Rn[h$U@V|m[7PX T'{h /v{4mqsߊJ(MM$A,]U\_c7OZ6._ Mt-N!hxS~[sQnrQh `Y,҆bkc+EEHE`1eZ_~XβEHn!* ]f1u'ӸY )Ye{<g}Wc5(7۸UP!W 4W#GP"XYx~k.WTGd/j:;pr̪5W ޮu[Cxv':W5^YvMA\u=sR^Mc<#w%oC\$i 7j#U53QK܃e읎UaS26"[ّk{M_EtVDX".~8t.(K,H՛E@9?҅f/->qp[r#`f] M,{yN7Σqk(ɉ/Uɸ= Gє4*4Q 9^_l-ۻ, c: {m)Ҍ6Xy%-ga;+XR IHW3"G[u"˲k \*eoʞ:K#R1v={!"eUw1m([X3Ǖ l/~&/h%SO8Xv A6l`c9JqOǍ[0=y;5m̋nu 5>ͺ1b"P#YyTb2m9wFg)ק֘EܵmJG\@{הuJ5ny[%{#t/:I/s2Wxf.Tf$P:WWQʚT/:3ߥjx[ą5Akwk&L&yDbXMD62mjokr7HaM c(cwD)Ii6.Wf=-uM;Y4C!WܮAcziEe3R,H])?SS!4Y"'@VJn' =5Dz7j~ yLu9S M_ K'h"djm=MUj#afP0)rߤnIR!&G!^ؐv ãi{qw0[_Hz ܻ> zO{r_aWk"Rua[M]ʓj>OyF49ԭլ]5PjUEqHma.E<:;xǿ|34,a=LT%۽ҿ*OM:,k6a[0qDc<?#=WzW~3JyӵuaYx< 1+QZ-scM=@lQKB`'{1& W?\{u5シu17 gh$2ǔa (xsG |RԳƑ^4v2Xq2 ڊJ9{2-xLzc6`gSYK?bX-,,ڿI!\1ɾyX+arO5 h!>/a`Qt5cSOTu覆,>A8L9MZjYEOt~^4ѻO :Yc$jq.aYМ&[+e]^^yeE9֞fYd{(X([A㎓ =%{u?,EQtiIƠ^ ϻknxjEh?mXsObfE\~尰POxUwEFJ; r1(#D܄{\af44O}79TX"\ }]Sn!+3hmƼZy3݊ZzQh1ʧ+mT!7/hrRBfюV"}҉hsXx.V`ݖy_u=d+{s?>~$i8_NvNN 42-uu/;0VU_|mtkc-?;[=R{# X@kFcF=Hpz:ELXz,Focmku,8lqmd/r& oQ-3h?wߌl5`:l<LShŀʺ|H''gD-ԍk4 ZY$oZX3uF+-5W-K/u++UExbyyva<JP9iSZB3_{U,ٍf9 ?.'9#JFJ"=p!l&Y_HŬaMkUߩm귎()+GI|z-VOHWaJ+~Ls||q6^̦9:Г?E5BN՚z2Efmri's{Qt08ѳ??:;LZ'gj%iغs/{#GԤ]Xra}/:x಼yR_?"5YMųWC}+ײYMW5vȀZuVo-,͞7 #q6?EAO\Ta'"񧷨 vG݃>SQ%[⼰QOںB:b* -ٓ~S6gNٯv8+SIm+h8-yYtI$?n ,EE(׷3,È ĩ`~#GQT}v[HH$H1,/.^*'{PRe)xP7"':Ͷ=cMmZ0>KF*" NHxbs[lS?1Npm=k AҜ0dCUFuvnl6(` ?T';}V[|Wͦ2 v{ X+P9² e"̧xb8QnӔLmi6bq{?V:yjzHCn{n.̺?FنX,wt%k^]BUE@ 8M>dlFc ~SM^*(rqW17$ˏ:Itnok[P}#8RF)/msun41K.GsXee#Qf98zj<25E_Nz=***/_+ &dGA} 95?t|UK&P-mz[W Bzlƚ))e=<7ş"H޲/LNdtUu׎Vxa^~dtM 4l>'G<_K]-̭YVebbkhҚY{;S}09qW8+Kx2dl";Z{ݛ[f2%q3/㉆G>S{ Jy;z7\d]&.b }NÙ²?5ntت"(}UL ?]Xn{ U=g?]At En:-XA܎S4l?IW #tQ8O,|8^+EfXwGv C */2k [U!lZj}J?'Bʳ.,Jy)Y=w6v'M2O8G#~RtC?MYM4egTC$DH <5RFAm噴ZJ:~`Tt9(Rqbt`WCopp4J𪛅ojm㽼f=ZcZ8oQ~-oe:=^7[q;~Tڑ!{+dY[I I%:H.@տئc-$* [P@+Y{U,ⶲ,FVxi爾_QH@{\ͧ.X˗S B'tٍ[}/ϳc5?wՍ2C:yb,9~$ԨѨ^_ 5VU4qƥ v[ʞST4Cmǐ$_kGE ,A+2FI xBSAHmmX(9|U(篅fnVbL2L踆[=>gWm$o}~L9^c'E3|x,3V4TEVܰW&ˌ`Ly ?.o~\Sd%I3Ft%.^ck-دX*:eX({F>&N*]PNgq_S]>00G;43 dqfVCS~=%k^N^17d;'tHtEk%/<Zf|~>i4׉'ar-reT^0:bV4R#iFG"1t.=_ D϶9.݀HX]X;.cSW!'CBF?Vo[PpM@{νfն3:#Im\.c`w<%[_2T5S "xd=zLԐq*4CE)yTz:hM M[scaXpl TB25#-E̓يMOp ~Bs릷4gODzUTu _8G %^ž!5A"(m-8mgOoO[e͡V(4K*›I;6p|&]R.חXfq2:)D$3j6etK"̲30SGC!Vv(ʡ9l6eHѨT@籷~7(W%~hYq)JfU$U$ܮīm8((&iPe`~rΎǗ4Q,TI#jo}UB U%mk邚ZoO-`.W QaOT;qI%at?{gdr(yK(dRg[l"q%efz&g)'7M]p1=%Hr<A#ee Qxo1ݦ7Q*tT1c< [cf UK&]Qwage2sIM'l>U\μ~{HJ;Q7kjv:ok2ٔHThڂO,)v(:̾@~/o&kX\DM>kN>fTyKL SU/Be706=ROkSEUQ5_&Oh*hU7^Nὄ&e}[yV"dY6\LUfm)) o+c.[eu7hz?}j .ߨ=masGi6XQJ}fib2,ʏ4p#X+0fr'mK'oG%D~ƠMM*KŶ 6ZyGِ?v_QRcኼÌ&=p(DEr?v8S^:Xfe9Tr!هz5)E҈JyBcg?2?_o2ڟ*wkOѾ?mRM=`WԗiO/ӺE^]gP:aJ2c5.B䳼rejt[\IA^6.|@TSQ`wb4'@ܤQf)iX+Oj-NGoLDq$*`j#m i7l{Q[T M>uۑU6 #5eTɿ6keTg4*B7)GڽjzW<\Ml>VW@?ܑ=MJhl-ĝ+zUKS穙$ۭ"6T'^D>&F2\RtH魁GXtĹRNY+!ng;ۻR$٦`a3r5qِOuŰ:5DD*!q GٸH>G%%C4-X 0gJr>j@/.Ëd_|<̹TI*t}5-`DQvc_4_^3Ge5v]:opnTX@`#U$XK<:t[w~uN@4=,Qѣ,L4c>#5eQ:w)3 ΑDdvg?QWՙz>k}k=a<$)v8ɳCœQJj`6aqs KC_Z*Firtܵ3 x$)xG JqK0XM*TF%ah 3k 1SU1\rl~#B:6sVaح'px|6]Sx۲O|l9;[#9MP{k[ӃUh?x >~,MC\qM46q~Uȣ=bQQx[ܺ WG!h\j[0R;;॓ٴT\MAur%M:/IUuEfONP2tyj88iXCHeϛ\%)ct)ٸGm_ .A~Y_ԙ4܋KϻMp*Teh̒d!E6Ħ9Kc*ƅIÞΤ{H$:.I_I2ɵ1nC4]kSYBJÍ [dL%eBcu%|0DT[(ҺdZ #c޷C)ڍ/P6Ԍnx"L%6TRjieW>S;y'⼰)˩bY-7Fg饨EIO/')Q4d銦 QTm-߿izY妸J/do~ OUh6xdu\s֋[`;~):ތpdJu#تnF,Rt ::-ԑ9#}ߓ-b|AGR{c\;P{';܄G[CjiZ1h.piĕX)<?яb(qF,cɹwlSZ5IxuJfoRч>sn_,R䳕HشtD!ؖYJǹp3MCZw Z{+o6]eSϰW^^x"=?D4Yz=$^q",Iӯv d]k5U̯IĴmzNuߗ+2WT~W_ĝ-˫%Y-O$mb9z҆R-{Eoh!uF#/9OQۉE8;N,nyq7CaS*MnP#)%-$m'^H_uah31qqd")vw(:Q?F3E*-BrT ߳8=+M앴bjzfmGn,w7==T:v߻ؾWqUST{IaM",`NM謮at}Y<<gz⼰rYD#J}Wx`CAPAndy!yBi?9qgT?BlΌrwLsET,DApioA#SVEG3DW}ęN]ӺM3먋0*8 wⓤ 5+!n+r$cn8e>KkB;oEZ 1Nk*5{zAUd D߼|rJP=Uxvymcn]xЙ5)7ͦb찺猟)e' 3H'*bܷ>-;a̞4d3XE˻Z"BLP/.Xzj5IdbgXb8ّEu>~q> vFumA+ f]3S]AG9/*scvX HH$5#Nܶ=e&i9S#~\ Yi PԛT1'd>嵼;Cʪ)7,-v-e1$trYr|`{t^:Rd5ʡ5'mLq&M Q͖f1kw^gaoVRR(hCQ20ٽpgjdvpfzL6x? U$?O5( >cQ92FV_7^‡Eڒg]v?>ʴU0TЕt;H>>V#%YE%Drj՟TcZ%a*qǨ0Dt!g?$L9̚%|,54WJ4SyJxIsdYB#~ #Wљ#d7xm,WUF/nv:o>ۖ$9Ic4Fiz#,y؅7\RZJK37YiVdg'NraV )Ti Ʀc~nZ$_idzXjV&FIm؂֩SOlxR[|:ŞV/V~!bto1*4iIKW56Q~CP$}7Ob]e辶's͕OtqvSnE6N?֧]cQN8/IT+cMYjԆMAʻeM>5)Sf%TA4 xc^@ ] ٲIק_NǭǬͩCpFFe;F`ƚE-4qVQ!fceUAF[R׊P}VS/ QUGΨb˭%Dg>èo;G3t -5}Z.vaڜ]j=β ΜSKXؕ|9lUd^j~a:MH6VCPORke~O.xzQFRIb>ST GIo],ԣ~Wt{#RRZ  F ,1r呈szy8ԶVu{@–֠|S Wq)3UC5m`߲v6g̲)o.Osxq=l^>x,fL2$G=g~ck-VWPrsQ}2kF ˼Ht0<^kX\c0ʵ3*@V E6Wǁ;Q58Z4+,{WO1JtK5= "71HZčlWI#{g%Jf[ u_ÿťYdn Fm"xkKKf)ۭWTvanEgQ-c uw.{ZuEI"7݃OWq)ZJ^5\?Fs: ݍa㵬ن^t$j6˟ܺ{uJW'=CPϳ'sn@;mbI 2lmlk3 )ر_IWxxO%*nu_M]rs)kxw-/7RVh+ZϧחTwbSGJ;WDhf?mͷ3 2\i Py*pp,Y5AMc UI+1@{Α'CZ_V7?V6kЙV)8> ѹ~PEb!<9Sw 4Hֹ˫ 7vkTzNff߉OZ:mrl1_K&M \/'~W2xw5TޭXWeYÈ;1hKI'#b:?8D))TCz JzC2^euRZsw{^|6" y#uX37,˨*aU-Q" ?(cMqYK$aTƌ7?2gx%i݇3HOO ;מ: Y,2Sɔ$xS\F3:m$Iu6 uB_i,NtH߿>KCQqixfr(z=_Mzȥi G׿U^ rdxAW$҂$McgSgm*Ε6R_mK<rQ$j$lw?poפw,py;tf(IQEK]|E|uUI10I iGX.Cf}Nz(cK—%yK e7 4eQv>2Jgm-%pl8sX rpyos3gy4JgGY@.J(`7W>:`^.TQ>|ު&GkG G{犜#5= ]A[ֹ^v+|92+õM4񔚜YO/hJ7aM.Ujwm d*5bΗ^ZLΘR1OeQVzێ<6_kFVZzAj> {tk?lns{KR e;L?8 XLHlm\ r?ҜU-SCƩs,bj }tG)ȋi mˑ1i˚W4ln+W$b0^ԥ-PS"n`xb.WҪl!pzאܧH-4rF>CQ/M?>J1$2ꗢeRbMW _eVVkTI_P>x+C ?,)XuK, YX-gJĴֿU}<91V2jZ au|wfTrA4}M,>X'$w rmYykj}RBYJӨ'RHI!'pB`dITȷGԭMq#zjs=د3RpWJn4q+[pj2ގS?凡%( +Eaa*Q5K;Q)<`5C⧚1TڅyTj?),mPRʹ&$L-2~$U?d,V>8]Q8eHZ=sUV&rꅎ<8$diJ.|3D.d8)h)֒ 87кjMiZ3CKq2ۂ/ҁË)2 |"A$a%fn rum-Nd 8aݱvScfK=cbxKb\B+ZM yr藾 F, U!S? +eE An*ZPK02?qHh3|U6}W~XVr!DPthw{b|@Yb~ql끒gzXijQpGJwH驽z3{|$̘=O]>p2@ݸ X~g.WT_TnO;/+Ɯ[r5S9I7lRB9eL RWTRߩ:uJm%S1)Qݨn>tZz窂x`<6 [E}KbvV[J]u2 'KP命c?Xc:uNP"H$VVQ&* a_'$]-Ww6 @rtdHLC;8)?gګ(7_[HfW^ *F Q"9Yc!MB# bx{s$ ;m+uѴ*À& x?!8ãKŠym&:gq~wt*4"T`ѡ [~k멡6E%U 1 MSYhQ1WPI`͎>_xP4vT8ʵ eN6]p+h\#,/ LtD!=^",%s#ۛa/=S: rqqz8~gx4<x/nhAwG wvo%=#'s2%pINË ]6po蒞2P1:a",@ubvfƑyа)佚q?Xdm5t8-~u[w$QcxLMh=_9W!A=\E;Ao"U GFQBrc-xlSlsX 96(:'MD'/m). د a1NsSs4pN#krMgQ˔/t6)8xѐu!*7шX6(lzP'Z|qe| o}]6x Jj843 oQ@qN͔XtsF֙B 7'ؾn%[P$6ws,zbGQ~ ʀnr>ՏAx` _DH5ߙ$SAp^{%BdY:5k2ŠJB4[9O6nDԆ«inydUa!\bxmذHF^"M=" P`Rk?#߷E'qQ!XP ;/N #Xy#%pL{uSJG5]7&8 p?}gZ`PE~#FN͘ eXJZTȵHH,}`9>ƇeI|q|缦K a z,لN3/P +oTGxY m߃a0\74H{ =N=.v{nAFF#<;9jEaX e$v4aszM{bDg{i<3~x>ui>)5ڟY ηX09tŰsϰۻQ+a*aCVCgu_8U -}0aG2\V) ظѝ`xFSܽ;|g AdngJh(Mh09V2Xh@1yh~SQRN!w1q2s gp[{$ .[y|%>ۢϤx>>]RPQ(G e XޣEѱ`1T#eVX:Gr'!(H ra(']n߷źcra`硣g q5 IN$rZyI(taFȏIn6-5=uBjNX;w1(jT׸h,XM/?粉0O@@w<.Xv#L8'UMDLv ¿d]5^D<-Оg<%'A 5H)c KB;*4ݔ1:VbG}dFa5gMp&_HV /ͺP K&(Q!A #7!Kg<(\*JG0sizgQ񆬧[Chzhﯛ*P$4a@:P! 7)O2kFHpUivB dkwEd9 /Ƣ;S"B)!X cT8~\bJd.9Fs:yb: uQ:L ʃj~5+'_ pho ̀ rc2Ekh,'/!,]B=M㳢K"#|t*qU^4ܧб> Â_˨!UTg ڸr5#܋YWO_B` 3u2vdmyME@Cm6&5,7+;s7DJcf'GEm4Ch\Laxql)J+* K&GʐhS-p1]PDdgۇjѐx1$d..]>WPt TA )T*ED{؋m}2:6 2yXED.m5qw(nPe+5ESoׄ~LAKr_IWR* .*T&sO;M\$ dk*a-,?,LG#zEj/S+}[N,&T]C8pн "kS|ZaV~MDGX ە}D%?xT@@ͱ7z& #U&DV3Ƅ.|ʰTeϜa\DFc:$hdWA[*lY"@Ě9jz!]t<œ*U|!=).  iyY" n Ƙ؆҅) =a*idJ)/P h՝X0⏇`4`r] ㎝"'T` U4s7y¦۸2g_%ؕqL#SƑk-Vm)r{B8pY&+M (۬+ ie N}'srxqbXf.Οck~$JT6˵ +Fռ|%ͼ"{[c K$[ .GBL֍`{A(T@-ޅSBɴ(~f|{g\}Aw .]9r0ywaOezeir#wxFmm 8nTyP\; Gc|"OpI !ӬQ4)v ߯h=3eypPBԍ)-piLwX,)*ZeK t ޛB[wpܘAlpSl{p6ӷyX갏9s&? hfĴhxAɖTQ*q l5#t=X՚}wPAw9鿄ѽ|>Ov* ְ Z"Krdvm%(&oB\*yhj*7:t*;`fҫ:Uwm(ӊt'Aϭ|V)w˗)w_$#qIB9 >8Zzzqd1%ޗK." m "8c : v8F?5G~pm|20h~ۮNU82>7ɒJ,(b1Tmc rp4EEnyǍg$u~,>KWx eWz*'q:F\!*Ur,Nv@urf鄁8 )Ż@ հsɡjp``;o-)[~X O%#R(FQV~MUy}2 S@= WNjݯ6)I ]KN$SMZA4ywmn[t\ڹZɳBh9#XtĖ# 396@]Bqzpg v]!] $:FDwɃOIwfOXΙUsFYfQ fwm[~y9D Ș'd.i7@E&MitPDE9ǞSWdXD+6 `ړEeMc0JZfx]{͡p#ȭJaJ&qphkv+^tD"z7N_\u@@,Nl?!5DG[6'#;sШ&,zuh7~W4\䢂,*%-rCkIjMj=dR>w@d_I,SpKAFp;.FE=똠WU{~a^Rj GtR t5:kcu u Mщ{x[80 ia# )EA% 7|0iVYϼEtKGRDzh(ڏ}`b['~܋1t҄N~1ͯƾn$9_ke9 gQ>~Õm!ɑ]BcMb)}hQԿG[5ƝaH:]-y,xA(tex^.#Ǖ) n@ރ\^Ԑ_eB=qΛ}cքX[HuqxGvo><+./{P8NQ۵^ VG{g}W)bH(_ƫ]=7FBn5R0gȌP"aEC!@Fa˚f wfT';$b؃˵D? 4xgC>3^#:$r4BM/0/4DiBTOݠ%p?v^5y_WCuoDxaAH}}3[(l; "{n +1Ҡ+T77r =cr )2mO7 lnJ!6A!%Գe.cnNF|4ZMHYeFt0V#j;r Y,Yj( -vrVHr/^7=#?;O1j_*fK,Y @r01|Ճ4 Ţ}'R0RQ2UeD#Iah 6 ~Ț6eCi xVyOPi.Vcه:uvtv&YCi sQOIn&DHHP)4pr#| Rd |&(cX*P@#u3zUDጵȓ1(D&(h!. y|CK#:s%/۷pBhs'q8G5*U t j]Ԋ7T>Q/lHX$ms\ 2b!CY`QBt'kRhk!/Fc;*(SiS|7_WAr8׃8ݨ⳦hGnON]q׽g51b`)G+]~hx厙eEOΟ9d}~tD A4 |ɼB5:pN@hc6ǹE4paj TkbAW(@m`%A ĜEqy ;, _ 2?E ?b"$[mޒ3,C&> l0ի TNo[k/HOǡCI=;rj1p^ZQmx=;v:#O0e:e11t ֛}#7HXvd. KF[^Ih-e9<p!LYd@I:%R߬x.įg,h-wx1 a {G`T "5=HUk oJ:J0@#RunSZaY@3Ou$ w pW#`"\9F&vC-Vfݜ7N=Sл'w]RC  s:PY NzK:X |(tݵMjAr|`1h0py(f æǜe9q DDI5^i V0DwOE74ʥ"Z09`oȔ\Xv"#muCt_oUèzY"8w?&?~7) ө<<6aaBd*+skA/bx!*lj|klZ /D_dt1?xGڱXtE!`i&@(X4aQr"TKB԰wu\&FO8'ehK#ˏ@\?'`Kq~9PT(}dEy =/w9U|cqbA7}ukiJ۵UB0c?;^yY-ż()t-ACnW% @2'bsn'}]r6<&9 κ|u؈8 =Eb:\Y_ABtem[rQ۸gcL\㨗o2}T,O?78ElœlA& t}P+30W^w94ڷx]M~5C+ ^Zr%TD%Fjؕ+: )c8 8Or[DXA'<m\_N [Zx5̣zws}>Rn6 [eRRv='^-2GOy2pbtV!QŊ޽@)$@>\[x V@t!D%گo眲$? &ev[[SJ|Ǜ%g*]뺪$Z/S>&->Ms KjUde [XEQEe#|$%Ɗ7$Mcf4ؽ5W}_ ˪{JF!p&ˡ.).lhP꼗0: #yJqUc,JWHW>hIW8 %kkL8 4[uiiP(]Kf̭=i;z+@rȃD$v<"g9IL2J# 8A 1K-8#ՠ4DwA/c`4Il9,`HJ\G12&I tϸL b3+C&!1AQaq?Ys8!9č'QxYOZC/3`;'/Li @6T⧩| ?Y6?\k!C$u0`m@O`= }Asg̓3>KOl>?9g*fH<//wnW^Z~r}4)ǬKGô0 dA. $ETW V X_#%Gݎ3eƩcpmMKU!uCuT=~z:l;_1Z9?6TtEӓOe[B:2PɊh#?xoD'd{||J}e D%Li t] > Wq;s=6 GVoqtpy,bS/۴먛< jҋVh[.Xr<~1IXqoRw\l0yZACԅ;f~0/Ad|)=}gH,|6x8vYd#\⫗y0TaG0M hDÿOj[4r OIr#U'"|&q?%~?0 *'$}A*'OX$ J>1d @cʣ3VJ&#61:</pY >1b0+r"D&a #O/{d|+߼ HLĮF IH̹T#**K.bVbvX }gc|3C>eF=`2ՕpJ"ˆhH SdDUr@0"KSŸmn_]q, YEa u$.7pC1|=UL<j|NBh{Ӳd_K2zGзprIDZٖ]*D:#|$JI8׋ K0Pd"`m;?P&e_цD"j4ڰX+-FxbETh`(ioTE6hFQtܭO:FY #z%a6)aԾZUC 5ʑ :_df@ХL)#Dcۨ6w/|8b I:?N'>08o`;a8`bیb6ZUSi?}Y- ZN,(d Xz1z#q9lt6$7Q@hTA Qd-0$sh5d,8V#ۢM7DH|:` pB$b%jۇ0HRPє _zd˝N<=`av8bm4N9>ӟ&w;Dx'x8K~Q3!+CX,b' ҋAUHP,HBJv R2T Z( ӫ%R̃/'"]Fyono!HiEֺm3J(FB +mO=BM RDI8B$E:W#Jw A8)ѓ4TPz G2[L:$ndA.zϊ>3qM D\AD".bt7')Q«ҎpX$Hm$޳]A l11W=pʇP*d]li9 PA25$^'T HHd( (T mz[q`Vl|Cfx,ȔU"0y/Mxl|r="|rs|` *Vq2HI䆤!rs G)zFK-oRYY`[u%މ$=mYX(@0 ^()"9 z84p JIJr6BE丰"K#b]+ن"ePOW:tc&II:2Cy@<ۻ݌I \=DT:ëDEzG L%T?M'чCf8q+CăG#sz3 ׄh<I-*Thd ]jl.CL#$+DtA'F 5*/a)#R{1"@AI yfsP40yg@BL9M&$ H:0LpK(!i 6%~zaV,+x r͍"%K6\1LO' *h쯌0Xi{.ntIVQ2UQJ 1t ,7p!74\-L -=I"7iz'Lu*Z-FDeea!F `7; OasOu\$b vY)!=1Z!5 DʾarB۩BDu`X u/E>^zI726L{wrt1Jl3f:+#A?s#y1*f;OhIaȈ|JV+:~t,Â6M*bt)P^ S&2J<˓&m )o3r `(Y҈K%yqH9!wfN7ggLy:VX)=82ӒjZ!4&!1AQaq?ITGgȅIe9[g\pd%a(y ɂ%Ru[?]q2A=iq`^fO |Fw YگND' >Dp"_Ym㌛\&kxÝHC C?1' X#S#e~7xO>Blkpϧ9ct@OJ'a1 r|r>8Z3(ki;N #49xPcҳN haILv/~_:m?8l-_o=z`y^x~_1{ǀfw?z@yQ|$6=Nk(_ |߶zh=OvMSRdjBWrNB:&y~nXOX|?HxiB s3>Pb$FvxӜ!sê\p7"X&8-Ed"auxfؖ~qxWG-'dK)31H{_RqKw߇(w'O dc1I2'Q~$]\R'6;lGat D0 O(m&u]#Eр)\DCS0D$>(`$TyX?'l_ 9txƙ_R=3şÐw 1Lp\k'cayO7S)֦mqʦh]>|e%a$ȝj/% ta։a&" G=On\$WPJgcsz(ADDa.>nB7 0r07uw/&B>[5yvtO'{&FN}rt9\d' 7J!( ?%,LpbO5!Mo$x1N:W!c$-|"TAQݞ̬AO4m`uz҆ ;X&X_b`$Bn[bhtb-< Ԁ2/[x|{ .=6}g9ݎΦE;\Liel1bVSNMaUz _XЗb[8+mQu>g% {7 yafuWk`D֣A}LPX CpL,q|&oIC'" \ >&Ok.=>rIO4c ch*A]"gGkTA1 G Ȅ "h^FUID@I$d0 +v;a眩IYueuwaK&'| SJ7 ç!-!\I7ޟ1 $`X:H/xtjgzR> [265A$|;"J[[r3),OZa]RR=],[!-v;8 ܛjXE0؊kb#T Au,E`gYQ:W8 0T2`#gRVvDJueHQQ*  `Q#3\vpt0%<yN˦!P'/XySW`6V#\K  )%<*Eqc"Q;P*̾~Fa#o0( D}5CyD}dR^e#/xcpXhLux pJorqS"V lpڎ"bBm“W$W]URc#)Fuxpl ߄CTFY'!1AQaq ? QVaZul:kFS;2@z!ސ U}8H@1rVaOvݹ-C^$]=AyTJ|8aH@Âw~qt% $jn"gϳ@|>mBr3+gG@ I'o]loǒEvH˪_p*mLPBѧWJb\E9ւyLH.c@':i9uH%῰My<$!gP* 8_ueuh' 5/J>rx-HB$kV+Mp1`ZX7S|U:d#1EJh4'TFKIu =yU'=˘Nu)ǿC{CZ&c D ,}w%lÅP?R?f*42*ֱs\>YD~ q(oNSڀ9A()I]UFsZu9O4"(YwTx@bm2R7(qnY@9Eb/WaOZxm0$`(QWVH̅~ ZY@=S$TU`3 h*S*YXBP$\l&G{ j8 ". rN#Ry&_SKDZ'yqXEDPo1 NNbnCp;뷧rCr7^UMjtI-D (%P#]u>OW8I@#~Ƀ[-(֚wԏ|ҵG8(dє,psL>QȕQf ]1~]=0P -hTǠ|Rc$e!́I1)\i(d0h׾!Y٫rrf:˪ERz]zsO@q>ujGbb8~ѕ -Zn XdA|p2;UnNj6e6,{@(;'((_nO Tzޫ,~ U UU]y~YxvxrZ.%IdbHtA{-\+1c JxuHj# az_Z'6ڪ;EL29ߠ KxI*Tʙ4%Tw?pU GdP5J Z0K6s!Uk2,=9(>V5@A73Rb6,3M_FG!iܱ喐c;1} dQݹc#Km~hE5YTU@PgȯbPt^o4TvtRvǹ͑ȅ !KX#}"olУ-uhz)c*EU8BǤHAc*Tapuq@/ ޠ3qX# ht+ۄ'FӗMCӼy2031P{034l:ng5a^OLa#5WNWPOx>된UjItTyޚP">:%*Jllh *FhYS Gc * %2oRv,fW>*G: `,2 9;Gs<hf v#9>81y`zJܤ*8w >gASb#:P1bKHǃ*@V0C XʘGyh*\l\)5LZϼ Ep:w\*.pR,IXm¬AD=<:)r$< #ib[b%?peԬWawSۀGmM@=Q&),e;,cGN>bJ84Oͱ % "J߈C؞Jg\WQ^JPU$3qlP,mJF<\uCA+"𒶵) sHa*xp=Ny^@1BR.I9Q[DBQ9T@YVkJHL*=EUL"_@H>N  NVM[>U W 8uIkq?ZKV((YR03{Kp;&0D-.B"wR""dx+iv'b-Xru !R cV F7 #Yz0AV҄eH0EȆ" d iFx*&рUy Ws9qrjEe (A)C$q!z(<.LQ>@t>rKu_r ŏ Lt5 ! @dN0)msyGIrRi?'#!Rtb?FL &*JpJ w/1"@mi$TZ/:9\''$ jjTLGnMOzH ^< l ]2Bkr**55Fb_30JR;ԑ:hg!b*(Oz@?*$PePЦL؝f/D ;{YZ.|14%^PWߜ+SLeoμdo%? =6}k Lr` h^%!Ŵ?>,x=Di WxxBsK(cmÁLT~!7,2 Aڇx8WRV0AjСTQ6!6( {ȊJMz8`"\^67!#ՠ(D+y;>S^ڮuMǑS+ bjvX| TPӫ@yOw}hiP.rx7,ȼ UZ4ISQ.n1**-|3i`=:ZA 0SC&m=@#3|HLt{qݸIX*i|_:S+oQPa3ȫjTJ,EoScZ`` H H"S ͞pĘܪ(9,HG,5e؁i[VqTw韽!P>%Y*w&6O9sHhehc\Q!+eÕNiC~w5+_VB"וMk lrʺ?Pc=i7Z8EPҶ0`=qtJ㷥Tm3Lwb~rq!;0[Z&]`CPp/R=jigze|E1_7<^ X - D"!">#:VCI|D91T0 FSF 63:: w$mo>_$%s*A3c[pT !ZOD\lUYYܠnzx "}tD"L%e4QwOb2a/` sJJh݈@tK\ Bɵz+F/-^ )(k) p5[;7gժtAȋgfUPH#00SdmB@m}?X  jFĔ 'A% W]PqޱX;"ŕ8x:@^j(t$%) ,TBVjvE +M6:ʫ3mk_O]s( AiDT(/<.凨o^xHK|xjLgsOTg|D;:\BD()%("N(O䰺xU0$I{7*8Z8L)1:ІJ25#945Gǎoxa4AO@/C& @ 3 $Ц1eEpd4"{AŃ!=i㫃bnIhJ5(0RzH_W`p96:Uƿ\ŞpyN%rŅgq)]CtM咫 Oacz ģV{u A DN~FVzf)/,u^hĻHF".߂e*VE}MpLqPy x?XjJ 1y)q+܈S>fm;& 913 txɀ| |x(gQ>#뙓hg$%漱SjPgrEHOh/%Ѱ.~r1+F*4DDtb^0[W^_yV$$(LQ6#zQ&/B:΋D͸&nꄂ¡{׀k;Psx: ,Ѐ갍9I" Ѥͳl:fCHL"hx_*T CU/5&ȣWI1K%a/IA[/,Ty[T=iCebH4bXzAك}n'"Ӊ TB^؂<ԬJPtJ^Y2Ag=o-@J8ՑeǕ}y:RyЈ\Q%B Qzm7(%G#x3gPz[MK~& oA@igҊ |")-Fo ȁrf<$?{-nEiDy? Y~D^ @…>6 >1}zK(=J6`b䎶PBp.ۯC8GYiYƅoZq-QX/lB?jK%DWk0ph8OdH xx BP-99u+%'jn27`7׉ѨpŎ{hʦ/8‹ rZॗ˩sMz>B{Xs,I X?Ǽ$4dot&2kQԧ#EE֋$'JpF-i'ᾊԃ,ђz`DjN"E c!|'mo081Eafyjѿ?HY`(E^҇h@VI4$LJUܼ~!J:f ha(gW@vRvn)F^,\:հ?D|d\tN̘"(@ N j*C^0;NOȎ@#Ő1:uo|~ΟeoqԬ+AVKI E:CcJN)‡| wJ 6R&?NP]UOaU)Iܴ;MAc 0]ށEˣN=Ȯ9aPABzr+~sڝz&X~6}Z&g9 <$'uI^FIJ#yJGMzEF]|=8%#]Ib5;ڷ HbJ{Ix KL  .'N),hP I}( GHN-P#$8'ARϴq)!R:DWxX2 >: Ă(qWWT 7ő)@IXxn@Ñ72OjgC#/n8:KWɆSWʀ`<"@NK{l 1td(!@ @GAk&U#@RD oXFFpLBz6@8pAزqQK4=Lc&EpdŃЄ~p .$͒})ȡ}`|Ab C,W69#"Ȑ9!%EsjBoX>ԻYb@}LJ9).&:+Z e%.# 7.~F"\[fm O*mھi[7\DÙAaOLQZ 4]5詺>@8fUE2u QB,#6pqLUNBCHh,zCQO!؃BEp*ȴ,PW[ڕPNWP}2xSY"u`1XO?7UbKR&j/Y Ij5-̾EPeQGхWҘBypp*T28 B OC`- n,vZ֒XĐ~7 cQ~|ILO4׷l, ,j=V@PJ%'@4v(!(st cO0ʐ. $A8 t#d;^Sf7TEuZGbR<-1 ` r\nW H~B85:>*g@Xw +ZYva.=bEa.Dh<0];.u`e_z!-5pGYbV{5sz8< J )B!0X\(ІGJ0vWEi/^?`?'N'}/ \~dWzG[悉{36x*X;460#ya±B}E(ЎJywQðVh'x,Yg=m*\/D);(wyGO%)sl5τ*@ة_@d-!`E D{" ]!;TdFy" \]Ӓ*a,8 PmAOm[  Xyե[D7Ub1K '׹ea, (0*A 2_:ڂU\*BD.oXӊA߼̒B(:a.x^Z!g,4KîT_K`dH[ >m & N12)+q~7ڝ"d_DGpJ-xyF2,* 48Bk3@DU@!A11Vˎ%)Fec@dEU pD$)u|vCF z`A>=MW %!Qԟ[dZ9J)*ҝA~8Q DQG Z` @#:uVKr~W4N]vtKSSC7zsIm2:8b;5p!`vDSa=I95P(ekX4!8\TH{o]J̈́hQa _׏BRR,3BWB> @.O[^Q Mg3[^!UKQP@҇Y?C11-"Vj ֓1[@ZߩԵ7'O<ܟ1 -QɤuauZUU-Oo>y+b$߃hH5p}*:r~ CWiZ:caX/4 |`S ->@U.@F/%*$v҈";R/u9v|F?%q*EjF6)@eG/\ +V+ݣ )* 0PiZ]'JvŤF|-D@BC!&٧Q,2ރaHyÆ-BW$fͣOY GJ %"ͿcM(Ga4\F | T0Upqل)dpy΀MVZ&S(c׆pgHҫҟrpVfdqM9 '0߆P k2qY/dpV%8 bqlE@V_^Lr[ė +n&;x^MЭ9bz)%: *166s39es1µTyvjWS,:t>rfK535ZW%C>ʩP ґ8׽cn} W3C=FSW~0o8 YW'+NPBP8yU-Ջ|PTU*rdH?y-& U4ƒѬNKBcL$ "c~%̥B}^X38)Fm!`f;SPPͩqXH 逢{!3CBT"V\ XRZX`ĺlK|I jW|߫B'9GHnE:ApQR{Ɍ_*4B ᦎR6IQΩ'OWXMW#ax:V Z@4m9ϙVP DӰu ԭ( H#JÌ.Vlp:9`DZ%sA(]QQ@oDT.4s`ArFq!jBox *Jm * h'"(IZb??Dz'@kOUH,~rt|&X8(G* ż#ѸbD0~7%BO#$=>H"a0vj\Mp,ZEpY$sjrq;ޔX@8_pHKyG$X B hUVALHH^uPp`]e&VJDg:im߱_K֜4)q#[T{ '5EfQ<'U9U l8X _.Kf-&Jzn2$PV'Ղ+H=ѲPBp3;_)UDOz-bDbEҷI%8/`Q*eU3N!#68aBx};n="V ۊ |B?AQ@ WmDevDwEqE$#J] yЖLub)ATDQA.4 i ԋK(sQt@ɯ81<'¸N"8!F[*qEb;“T֥eT0NCp䠠"PDGӯ.cŕDO-*Kk)3aVYȀ14 je D?T뀇#`;C{R5&C_ϼ(~9hQ@'I 8%/do ¨o 8/\#ԉ(^q6"y7D -~*2 |M0nJ]fZc nb< dB#҆%?"B2@v XJ9oqȘ ?1@BE3 OB3zI'ñ>AP%%؇gm9!Uɒ nV.?϶)A1h+1 &S'lS!ZllſHK^`a8󢘍 "4%C@]u&+ʙ@1^b^CN7}Q95 \}[3C9#L̢^%(ھJlWLj[ELy{Y kA%srR.߿PD*_9DDq>W u\ٰB@UN>pw;. ȆuIi:Ut@ǵ׾QbDM)j.N<;gB4DVݣAרdR#b1yHF1w 5l8oKKGɈ7F˖L ٲG9)i5/`UrqXb';~ۙ(8Qk*+lQm` -^cGeKR5b>AIcO?"]+ߏG H(@>:^BN3*T jgCr2[ H ZwVk9"}tpJN0!rv؇픒i(5@ָA˲#⽘8WТ)"N|6-JZ@JXK`^5:.{lQPWE"b=8'Q \QI'PD %em.St+ ZhCU_aA%\h!gP ͙9`(hk@H]0)7~n ΄5Id,4 fwϯc:0 TK#U`U3Aɜ7Fyt<7n~18L#C$b NttE6H$'IXdSdD¤ ͭt`6?jT Xi l$ hf&EȜemvS2DBd'<`!M~'8pf CQTJj SgVђ'3s>V-oQDy%fL7oqzy@;eiU{x UV:4bԦ~eŇb}E-,Amayavi-4.5.0/docs/source/mayavi/generated_images/example_lorenz.jpg0000644000076500000240000014030012747716313026152 0ustar prabhustaff00000000000000JFIFC     C   "  SyH'Gy'?Pqi~a76DL=w\Dk JvC|\v(Ɖ2zҠz!\R˚[1oQ|DFFu@ $[)5kCO='19Tgհ}ӖѪ  Qg l,>˃x_wOz) ~cJxνkg.j /< @ $ ZĆT"5Y3n>w[r%85+ǽS? Y}q fz4'8X-t H.Sϡes'Z̫FHo\\@ $s=\&LV}ƃq5zkVhSi쫗<&!/yN_un2 Vm~}cRv@ߍW}Vע䉟a- @ -hNj5lG5*qEim]\Ӗn܊MbFangԔ脈N:} KyDؾ}KJ1.]r2*w7iq-CwwcwuU#p Η {F&/2ݴbֶ$,J|}#|veҍjjXіsKZҗxZttׯk-Xk݋^bi$ 7jjy /ܱl )d4[,bCo 5˘Mf.؍bXU2ӎ,6vr?bNY89`PPO55L٪*?F:>2^]yO@e?a ٤\~]-כj heSxj}cje:}1&dRSfL ЫJg+6ggN>I0\lQnMQw^%L$̛u0ԧ768#.gg^7t}\>֣BNJlig4jm|llxOO1ڤx6!ȷYkA'N̶J׷l> 0 gnG'ݭEױ;XPe__b߫3ۋb}+{)}\=Ҟܰ+eJ6T]]g#}gj"\eowu Hu*51}9rzEy3IEDŽw`P %njRl SU޾l z5ɵiRo;ыXpEbJ'S\t,ʀH r#wj OGw~oayss;&rM;a;n֏aG=I"ד ތSBM3 Ҋ%wH֨<N_--@19\cpW)ռ?KE[E=[nj\{zu:8 "LL12OI<=@ >A}'GeZ8^:yfE_@ZNmKMG燖8+IskFI}m<"LO|@&5 ]4h3 0!"#$%&26@'15CsV+59F5E K[#ؒ7J HCN}>Ǯ>e؜$NAR@7:x4ie` XbyTӌ a\LrXO׉tlwn}DWYV 4[0)D/- VҡLƉHJ U3fM!H$ /VQm`&# A$dqV}o|oJ(A2~TUhٍ,X{\)).gYPu a0=]p= ĺ»뺶JU~IEKv UO f{M 1q@s !Z pvys]J^F[p53kp6 [H)U˧Fץd,\*c:S<3&5gez@bNluMc9Vv v pM.Ka\L0j hޥZjDzFմu[4^B:υjփҒ,wE5UBTn `O1NѰ$DjN;)3>?]@c- tXDǥBb,MnƯQvBə`.e`WE !Rmiy6 X Й DwD %8b/-UH_A=EuOL4v%$Ahl|8ϳHuULAV&nW1rZsvPUO}ybg;"H#]4ФZJf4ך W;ɦK|X:ˈ#~Hr龎IY l,e=Ae4l9Lɥ2Y-Z:ՇsFۗz-pq̦gSŔ.dƩPW䲸Y {ieQ!fFaxb5MZCZeݎoK:8-H\zzV{n*TwUY#\w*\6g<#(]<,Y>&0:tqR[?OuڜGjRqGƌlZ ]Vc =$- ڞ'*VWgɆ^fJm8U3D욱AIaLl]Yl Rr'M<}_~Fr<.5^z f~gdYg~~%R,B2c32+1hLݤB@mj/\VT=a&{,f@,ghI875%լ::͵ÅMfm4iz ;"K@5\ZV?>E]4 + M5c=aڙv?\ n[pW$ieHJ 0_oyIp ղKHA/U>@01a>z XX7z<م L {h=,FaTO]UGqu>nkXћ 8xiqV-7u/`a&f6d8$ ^fWi͓SOv}\o- l -yuEV .ȴ7qn%73Llvb9 ًwZWyTc2O5|gqθdWU<=wr~x ki0 CL#)ιx{LosxC>]N&k6Gtݽc0+}.J5.gvfp3dȣ$N%>([&u Qv#g`lZ1ʹҍ5[Z}U1`yMv|[f@,7g:`l"<wRsF5ׂbL>E<V)r%_=DБ U´FƾLV4/vjUhۗZrj:d֥b+b.k\G٘;x.͋oԴC,Kd7KJҪH|ɭib ?.xJXi>pBLJ\ϤBykz1i|=;$ggO\aonE,JTQ[$o!fO [O1cn$ 7>;s%=癀C{Hka{rvHfd˪/O#I\M!ۈ,L~ Ly''XkƘg5f2=@ !1"A2Qaq R#3B$0r4b?wN^Hc(E$ƀsOq{nHsB-L)bq;^0wuu)~g T؆z$ܡ^t(W7&+`iSF{ ;L9\g%3zTI LdJy \#߽%pFI&C4U;jѢtzXF53+Xfb* ܋Yl񷟶莏R_,G0Ϫ{C);u&|aЈ"0#nSngG/b>glY뒿2>5Zf,LP>N&aIM(}3+>!v󊊆7X PN#V&\~.~kJr[a:V{ЦuӱlË NNCbFhW{T͍m2()c$4\ֶ mlOiLhFVRH,Q/)DcV|$#?iGvA*՗8,m\dysՕ0Nۅ0GOon Ҍ;8X.Hg۫_;~x𓦊1k2\,[#^`{OS|p$>QH8X^U5qNL|# OVTe2t]yK, x33rXFrmUS(v)h+a@-%ԓv՗Ꝏ mJz<*q (-R N9fMwABWr;W խ\~H4OqV7N_4AqFSCȲ~ɸMb}$ KhpMfY$8ò!@݌u>E_z˔O⫞ SO7WsԤ8݀w\ߡr::h}?rڇkz\o֚X |fh(/ 20WUuN93#bHYkU"BG9*y ^̾J|ɹ)O{fxf!=eI'M 3ojr(>{6L< >2V_ V894IÉ%rDxKNFE~nN=*Z1lކ W~)%9iDMZKS%Kff+icQ4&mokN_?m@خk>$Gc;}3 s ]ښS&pT $#ذMP5ԍm%,D~ $ >jgSL.ßcR@:Pn ⢐(xણpsjիo k;5GPfգe@j:;{Wy^*?V)GOTU\zQ`uDdG(ܪM^Y7'2ٍ=+eC/>Қ>=5oXg NLv ǚGDcZC5背.-'S5fh8{X(6q[䜆RZZm$v 0p_B !1AQaq"2B R#3r$b04CS? ܢ䃺qۈuh7JJAZ^PUA; PQP !)Kuc:wZ(щPCEH\N2UP&V[Kñ^{@umײc&)zk2rH68iF7|-AX&ԹQ>=[H+P*zj^~Y Tw\LjBIH\v“y;. A5ۤ '7N90JZE-' FpY1?Ng*J\ܾy~i5rF<#!ɗ2%Ï[D1i?v; t(=&im)kjV2:sY]wKWSR.Dsj&%0:Pg&0]~,yCm^bmʩ ?0ڬ*.pf@Gℚrv]@g :D("IpCRuP!dqq-}qrwŒ 7{,0 xRTYTdUׁs*5$L8қ y\$0WUݘkB[NO#:qlpy=CN̏#eH)BEIwp-}P۩{ZKbİ\[ Kɰ`&+,[@׷(i[ Nƛ̞ߖah 4@ /߾CZv'ĹOt:>e+#w,Ф;5h(R}w&~I2\8WB6z.J604AJ8wlTZ)l$áaI=zG39 O.]j^ PYJ}iWyyIu e6 diޚ.>G<ԡߥC8\CN@E9YàGQco7b]л*I˒-/&,!ڗNq~JegCBښC^m8lw =AL! BlGx>LwGT6ߪ-<_iM1&ꝗ1M~oMj%:tdZ=bqOʭ6 SM4"YKom1E6%UEt턚~S}}MU]ȹ:!Ki~E6B]%UU_~PE&H~QMҡ 26 RILgz*LfP君mM7ŽPPqJ*7A$8+ "`0y9;9vҗT+ W+2+tV%F V   !1"AQ#2aqBR $03CbrS%4@TsDc&5t? h0Ρÿ9kHPW2)Yص-rcrgXa-j4J*LKZ_*H&h ?9GjeE[ Nʶ<[-%Cd4? -F,%TqO,ZJ'UO4pzByJ҄f]p6P8d;i͚0!,# g20aLӷējf(W\AR@FƞEpla{~i™'*F  / I4RHC#i<w%ˑd-T͗I}Kg]|tSG\8ڟ[.^e봏L*kVUJV~5f\)RMRD I%E"{𞿩Tl0d)9 գ i_S5UaN[mGr2ӺiiO8,W-ids.8k}\ .y㳓HCve,_uTBL>0Pҕ30j%1J:TҳN^Q)Vy'*Bxzs?)*uj,[o ihL J&!ٟK#XmeHBW1S"zI 5JBGd/He& C2VEw }B9{'> Jԭ#v )WTȥohӜ98soKvQܦ %%ګ١* TFP]n|=G2S53jx.Md`lex}9}D*^bZg7 z=#e ^߄!C-G\.vzasSO^qŚ:#&k'VefRFu-nTW$ӟbfN^u 4Լ3ut'b_DlQiL*_l8Zt&wJtA\M6A ErĽ&|GeG1f2AV67P`khEzqN!tQ֏ wXlb]. U6Yi)\P7/8Vfe`Y>&w90^ET½PH#0GԮe3-җ&_^q T=TMMIU?tUXˣ&8-JaBKM#.RB)!)YU.OOع$@C,7W8{J'S,(>R5.ʞwe J1KI8- :bԴgK-:j{S1Gt+}+fA}:R?~+G췧&86k<;b^_K~S0ײʿ7 Y_%&wq W ӟDnLݼO/:rޕRB&f O`rzs<,0W_ЯFw+xfZYW#R&SOR[vsAO %7hS.0PbK}y'-j >sqOL̲' e0|jN-7RI* -"Zqi4{rO[s+eXG% *BХIZhw|"ф7߾'lI8(`D PJ@4ZI[޸NZ%ZIj6E(ߌ?O7yu|cم,yUM,b___V56YnI X*CDi,O)kqÄMզb HN;6)u+}͇y8qD%kiVj*=+zR`DagY(gckJ+F>n^ZGFgQD*]%mA`!OwEm@įNF7}=/d7jrm"p))Dz7k$Q:лE>2T>jf啈q!ݖa@pڕSG1I (SM F+ˢ^R@SXR%;/LP'[)>GW;fzزeqi7bkKgQVF޳,:zla&sqz$c<~&i=;LAQÎ>-/2-`n0JS !~LJ^ RMyR}n+z ѹ$MZS5D34 "aZhN)o 0ksJCM/d?Jg4bҴZ\ J]EI'OcQ3vŖ ?R*%M>s} ѭZvn&TK5r&u[(smȥήo [l,N<Qgo #9Rs/ ťɏU,1I (SLصݥI٫PI5Om˳nHn*N}*hWVhݐNٺh"OͱYR(&;\ankm >RG;TZƍ t$쉝!\[-K ]@O72ǐA;dlyyK9:O5!$eZgʻ\TaϔkUVlÅLH'DO$w|lA}}e[gf,ŸrOY24mLLۉo'T^vزP|s|bk0dVF,tTs+FYI)ɦ'h7zT XMe(U*7=ljdw z<*xjX^QC#1)O4_*Y5*<0vo_άqBiVZhnu!^W92e%7"="cF4LvTIYUֱm*Z]زWIL(;e*SuՎqZilp<6o6;M% jrm$kǛIZV klQJ}6bAP5x @ӅxeL솵FCWQ\t> 螚ZhIR$ -rVR ZvGj/uu`eTEeS{ )jVni;KͧӞ9JV#s3cy$tXOZYZAwQOB6XZZ}W)8Y0+N)LíK ]Rꐪ^3cK)44Ә e VfܻQ±zvY̿=q^[.a=Q1cO[vI!HVkI ,͍wxi'i5ODam88 u~fa>im6㍞N%wBgmJ }K5 AR@6rp ~}vpƶaw*)lU-CQxrҝ5jP&*~vh#3h_5/M|Zj&+|()߁Ä7)[gNS>j1/#[ZLdL"╝nJ 9J'eХ^%i"5-vbQ Tzg7r6oM:%.pr {avZ%ff˭{ESNșt5nd?_ғe@Ew-d#dHE!StW:cO͏l>v'lH uFFG()n=&&Qmݑhm(䔌Oiak] -JܧW @~ux6Lim6\a#e@&"_9LԠTh8v]TornIo5 Zi%Z w_ZS"SKfOkqB+p_NNuV#gK!,Zh\|Ԩcx6DZT&MB3W>6|l(\fmh8m amYTCku~[i57A=ԲF?m HZ mK)p(E_J-[@6uZ·i&zaùU荮;.Us:qND:Sz%ƫP_VSWm^yΊB)¦$ӪN*J^ʩ R./5q5jI ǣ/h[HFZ zSgiKXh6vIRS1x䃿|g+Wپ6aZI2u!KˏN6LpH4y9BHbmŅ)d*\kpP>mmLյ/8+WB&%z?c[̻x aW_É.e_M4?{OJoޞ3fps%#@P8WFX۬k&׵/* T‘tg-/5 b+'Z2<ڤVRpnjՍpt! pl66JG$l9E֔吀2Hk Nx L&qɑ.h6椛m8Q$) ÍRX{7fZvq5]i jJvvCr*_&jU)f 8e6֊9aV&Zlfpm ӉCIʋ'-7q <6<} ALHk@}i3hG9BpeG Q6}.hu8&%rUv]PD*M2*F0m*-f[pCd5%Io{O5(>S3NB}:zjamSa%l!e;U'8gvT֟Dnʒn+{ࠀV0tQBtMb^Ru40pkMǮ)RE`J~[ʠߜeN17nk*W4kM6@ &'0"9)ʼnu-q.W%q0^U:S|]يnNRiꆿ,g4^ \!.-!\qH!SJiukG!v{)J!IP UH0baO+ ^WC9Sdi>i>I L(N=4M& vP1nmEapYwUQi;)>'eem%z&8U##Sh$_P2 ǝl+;`ZHvyHC.RErmȕ{Ov}߼U@7vaO< ߄)fE 4yZ:xX^~E%PVRMIY.]s 52 ]Zy+JbӉqw@m~*=D֯ L/x(gMOa&6GdW.mIv\Y/e/i !.ȀNie֪㉬Oͫ6mg]Nʦf1CD橳>dQ;yy6z+\:Ia&gJ,WECHS^,,wLI34ڋGGҒfe4 M'GDG.>i m~lσ%ˏv>/#$'fRɺ_A(sau.ސN!I>`)T,]ۊOh5PeKL4Wo t\mscV_w{ ̸65CW\45c#  T[q4,gb8ř"/ʗ"Be*aUR.* w$•.fnβB SlEcYS/K,H9ӽ#gROݜ;>M09WRΔ.iErH=bizԸ$RuM>1iZ_h"9˦UO,%G$l$%RqSCi{cVm"<N.PHL,g%fuJu9d֤wf<ǫF0us_bCN@ڤN_avmG*DՕ_Eם).r˞g|"&o;tz'eeoT] giu%tVqdޛ%(IO)ZBgM IB&zHos(^qZ .tQ9,ee{$}Hm֊HPMe%*vwþ4ƀ`"jm(U{ba$JL;6la0SꀤhPD:P7Jf5ܑ,^?]|`JIVeR|.WWM^T_{[重i}z*X97k5hGTvvYݪR7=$4FM[- )}FixݛSgɌaB5YN> Zysr$_lrPY.Tݼsѫ}Љ&iaz8Ml.O&~~/l&~wS:ٻ𞨹7j%9/[?g0b.877:Z9(by)z9SOTo٩$Po$L;yPlZHP#t&Bu:Z׈XOEXqiM)tU՞L4%au z^ZL%ƕMZ8(,?b|!6l;aq'tI7!"ࣽ~ߔ{m%-%h;'4 *ՕdCua=Y&, v*釚ls.󌫈?PC$iW5On/9|zqHSfYoK[lu )ܫ9~,;}4F}Q9{̑F^" Mɨ8"hIt˩w"*wt=huuZ9{. =KiN DFjXV{3?5 -a0e\9!i_kO\&ٲ&9DaEjvO-Tv1w \H#UhGh)(4un/4Wo\r̗YH4d ݬέ+$o{J2m`h{2Mi̫q4ޑZƦHN}J*jZJt*.}OHu9(zڵ sr*mV˛)! _8Fycy߀GQd|'Oϳ-c7,o޿ДÃ/G<\˺.K/ Fh~M]6W䏍tG>6>~٧{55j/T$N%`+n]LԞ;!M P< &sH~R\(UCk 0v– q^ c?eh&)H pFwfTXM2F#89 nT-LUx" j/%;iRiN)eNJ)yjM} BgɢOd]f (cPL:Rhlٖ1ALO{5퍄z2O4$A#ĺ2jX`aG)uК5988~j`&UJ!r UTj7MrY&q1}q̾N; 䦗feM!ii5y+g3U(14yF姿Ԅӌ2[j;,ꝅz^Uf-Ls_N~u|bS*Wo7$;F C:AyN8ԣ=ҷ qKgT&ΑkH32K(dF۝n#)QHe:wWuhURF t1::nq\y|B_Mڨ\2I;Rk9;#jEӹ^o*Vih\AMb jWU2w_}'fJ^`SIP?;ҦՋӶiX紜+kh)ή ]Tu?v{A z+9/>*oz }R RZU&NG=?1d^wAiĔ8ڨGfMD&7~nRҡB>Kĝͱ$򮲺U6 Y4/b?]Rbahhls O:ȿlhNO>>҆=bj똘QLŵlf)]}\< MYqcR};i%\)ZMRڒ͏ˏ4 :TT'^x18 }Jlu8RXFkU*Y Nw~hsCgV:ЎPϯфsΪ\?yLQ}9cW`Q퇹v&L`^iC, g$(q"Re3}䧣{ _lqj%ܒKEe7}K ?_+e]p%ik aX$P BpΑM,~o)!1AQaq 0@?!'*}׻dHt/~ȤBX} JSh#a! !lPFX bNc2mLiMHD5fvh0 }*|Hc@0-كZW`MA;$h+:f58RM5tu0+>ZOz`Ǡz><;Tgr[w+$6N%wRa}#@lHM-}CLXՂEb{Ӂ֭[H$oɤRwQ*wXYʰn=jY\ \KJl_1^]ЁI}E[OAS &CU%.Zs[ ?K}9Ή0@ E=QIuao%>=ZX7KV'8j:TA`y]j{a9La֮A$FJ,_ZBU~h@ƧP1Sݒʾ~MMՏثZ=p 1^Z8.|g0y/j˳Tv}0]:kw-YC@𬫼{4/ad }2,ib?94#i2][Oi4s|&yntlȴ*qMQ8ܛ<#9wH~j0VLk C51m`) l]Js$ZڵZvwf&=P5[P@gGP')+dI˗ w4$W9T 1c/wͺQ6A2kW"{xG8C%oVqb҃CHQ=C6L6N^ .`aQDpd*uyu8`hT8F/Gz u{}$[#5_$l B;91*)1җnJ/tСu!c%ryB9o=^A 4MS}&.@JI[#;TG2mEeKo@㊜|?PC {\oGtA:X6Iuۉ@lF % >IC-eVMj-lf:-5a{G0Mph͊ ';$kN;^7N}@{a81SuvWr4"xஜ[ޔ2."nHժNK@-v5e:eɎDyRrr {X#Z{xcZs~9#ӹGD!q5뉲XhqT)]IR_W'cR񒡚9v((vKȦ0[s! ֤RcP)v%Ԙ1pcPu=x*JLa`\fwPYl=s̪ż.pDKb qmT DieKawm2Pp@ nF;:QݽD%"*2d#諨Ywb VbsMR8Tgw18u7$a'$jθ2b tu$"ȍZ܈0{"p5nLhg X{ (j gJ ?QXD`9)uZ&ր?hښr nڎb-> lsIsF! xA{'ݯV7/"K{܄gmjZfNe3)mH(&3zEZHus2ؖ\Q.ݿ 9nsIцx*H&F4%NYqDA[K8@t tcT: R@$v4' Ld31EL2iSn%p* M5)\X0ar &ޯ:Xq{¡KԆ| 2sn}!y0*9f'%]?(,3SS9'nHAXS!U2A:΃Pۈ ZџWfq꒷*+{a*p@g ci U*LpblD(@ N6ւyƔuh䤩1sZq:5:Si6K^<ԫ!}j[;Q>("^%DIZDD&&J_X"v8JDGk8*oEn\wk60t 4;@P}8M& ];F#wuE?IvjqCV-Ci2{(ȴ`JRcTɶe+*oFʻ1!lԅa.@PwfvF$d--H24aVR(L 1 "|, \UQ.VP#,?=/Y'3eY(9 CM24\PZ囶d7Z,{iy6@oWЧ'Uz*)Bދ7'LqvRTҬ<<;2V'P@ѦtHyV=끳wZ$NO&)@Rp|T=aI6x֗ŜꂭbԢBfκAj_9hY/eYehKϷӈ{7ˣPǼ B.ZQ\(k~ ͓'"qQ.hTUhUlX#UsG64ӱ,^f~)]䁚C܆1JE*`=w4)@!3z:jbfqWaU*G'^˳ C53xen)0"Xu)@HE!* ;4M|)|Sl YdnI yBKPWV*cP+&=e(F;ˣ!C+K@~:Vq$0;JҹݤPJ)eeėo>j0?]֕YiNM2l J^.Ce!H jR{pT^h*UteoB/ (\yLTH(%~B9mhGp;PD 2srm٧ [BI:Tò[~|P֤]" UP6T%c@ԅҚjG۶nFhbJIһ'X{+~-eƱ4=%>@Z@WW=XE8%DƎv^.Km-Վ"CȆ.(DjC|Ssjkh)%ғ^e`mH"ך(2Qyy/jBδe-ܴ{3!׫M 'L &2PY5T@J GѥsI?J9~a7M%MhDoz6ЇI*z\zullTEb1K @>N(q(ҕK) hwYߩT"H䨐 Շ~HceB4dU& jBgw֚r.*d%<]3n 4;L(s`Ol .@rǯXN0,4_YڃQwɍO"*l|VuwX=K4Q-/YAVO{Q | D({i %'!LJօCViT ~kh IYڒR+/$R},'Gt)jZ?Ί.@/w49`! (aVýNjB_j>C̱61Gx%J<=Џ,|T^Ry zPFA"45bTu@I:Q^7INrԕvA? Bq0R]lZf`GKl˧JsAI,"^* 1ƿF} ZT<[FD`ֲTI'E%A1榻Kޛ3\§r~0cߊxs=C͚5jl0#~h/DL?)ϝm|),̿4eMɺQ6HHW+Gw\](-pw4IDor[sMYۻ3e'026ڵeGSJjf)NS+cXS.>:- Ѣ4nb]X$Ac3we$X8|tlldS @ DNTh/8qZC·W8M)ɖO*7hT/RH&;֡GΒ'j10΢YbNRB*Ulum×aE\EyP Ǧ;?C8.r4%h~9)QtnnA2V[~컅I2ַ}^3%c ZUŝr(.9'=Af[WErLΟjmH" ᗄ☕™^QG#լD>䀱5jЬ 0"ڊ]헋痚t-FHb.(b'҈DtVf 慂,[REDE1BKYV0Il,3iVbJ OZ:0IևL9Ї"T$t9&!2civ&b9&M:!BɷC|%B\lEM.Fol[;FRF;43\67bC!iȽ'E Y .zXP1)5j.q֝mc@eI?'5m5MڧsR^̭I45ۿm D֏=g 'r/2~8vr1JI{\QYG5PcG 1h2 &$b~{{HMN1 QuRuYF$.*-pg <3:Q*ȟx^犑]!).ajcX'Vb+7^?;4I .Y zPYdhSY]:aTVyO7E]<$O•H~ & $^UP3Q"1H.Xg!1Mqf1:JBv_HXz8ĕ˿LGy{5)Zuhv7yBfv[1<ѓ;zsHԆ[ibs} {俛MG907RŎ /IQ¹SAQKi)A"q Oj b(<3r?QP5 CP/q9r^GX@72㭼tUdA VpQF>GYN=‹q2+Z(5~) YtB=0(Զ_z 9+~{R%zNImis ыS_nRWj@sPq;aQlJ|JKOf {K҂RyWo@4ɗEGT ZόL7}ޘbUb#=t8bvc>3`i>O6銳2 .?Q_~$csJ (RTz'⟊0'12-= @Aj7ҬF di8YZB0AN@<•0Ν;Ay>] ԟKC&iNJ8J E_ƤbCE:+NFRlmڄ 5 c8Ly BS>}]p "ATj:mFna0 P@5HG{VI6܄rVE;U:02!p F. (8Hh+kK "T RE0(!1AQaq 0?YkG5:KLCZp,TMݏJ3jӬoD`2ס qwyW{#~ĴOox&4\NWņ/S^4Et=Q|׶osA^{tQ=SWqK"N Y~ E.v{SS?p6GC/N{QB7!FBV9䤗|POj͉q\lrY٤: ^Oߍ2uA n ]VT4NDPJX躹͹BAiwޚ $|D eS6<'}QD/ӴƣmW]-6T1NmO&Nz_+v҄/-߫#IENґ҄RǽygOEoͻExmC^y9N}Tuu}g|QmH #(;EŷH'*c塴I2pXh,|O?Kڒ - aqB%9((Sj Yާe"HMmKK:% څbH8) kSL [iKАoHJ(Τo_jSZ څN0[iAm=UCiR`XKDZ,3_Q2NWDX`P F#lѡ\)ϸGtO*$J7o/Nvjg1P]x&Z@K:B9/Ԩ_ ?MP:3j(<6[h6bԒ0.8EIʎDZ$Bn2;7jTeE/%N{!N`K3kGX: kG,#،RObJ K6ɶ.&pa)]|ޖ3pk> d/) A,pkLyD %@2K1VƒRۍ59sd! u [@o2;PI0YT-4Ls|MChBH$g.)܋y {TxWϡj7=j#ꙆjT n~&1&KucXpuK?@-+ڂB1U,u-z WUoί{4I4ծB1F7pG63A Jg14XCK&4v֧L6|]\P^&I1 D"S' &]s͍FJhgf!CQ)iчx;G_~Z`M پKKF8?sy=Y}5c~ZlrjA^|Xƣdӛ o #A;MOPLQµL" 6"tY. PLŃ)kQqnkHp~wAs$xvF.ȣR8T={ƄS|{Iq"vֈEa D$KicFBщd$eepV5(2XFv@3NR:KEq*i-Dx[RQ@-D,Ya2 .vIrJft_bSSF^5rtd#u.!^_n,?Г4@剰m%&hJbV2Y=z9:նDE+i)bxVIbɜPUڜmn Z/W(FTͨMai(!1AQaq 0?[vW9=p0 !R;k4݀#tAtA?nQ5[ƪBUvK7pd0uˑ^ }56o PF"0f.z|=2iN6 z֟x,j:-I 3Jh[/+#mV ;]P cZL9=kHDDywox0XAA4gSkDꏏ^}O x9/#J8.*{A#$`],)## )4gыցд`/; bM~t%{8` <ֺ Hbp% XI*(%Xbz.4u4ᗱI8̃(."9 2Mf.SyYPwEl [ 7 nynѾjE`'I4){ݚݧP ]ԕOu~{Q{Qa֊XfdEd/lwttDx4S}PM$tTǥ\Y4 k ^]`^ ڥ'Wj@`OPˠ2;_ &Im[ٵ0}]ZK6&[K—)GK<1 YE.rR;.ad"h]Df0~Z BTN 7_3M4#v(SqUr[SC;Vʀs⍀]~INjͤ gTN0@N\%R`jc+wz Ősz>m)g0j;K.Qv[)FI_@T4P[vxk~fK(=B >?uC8ǚ H8ׁS@B:6Ě`z&)8$3nzFVTgf<΋IQ[HLV; EkR~)Ӱ l=4D{4vpJ4veiHlg:~ZT GzSFbu;c&ҁ$[;:ƴi\O&{MJJ֜/G>_-@%Nj-K{ͽa>4NF_(HSVb3/{TEitЋ80K:ߚ%jG'[Kw$S>eEؾ?ZzloLD:Ş2Re]!qK{YAi:O_z:ސH$&fӎwz- m2U}Y;p)(;Pn!^n5mpa( עc2ƃ h'^-PqIdz6z @Yq5¹ fEC$ȘN݇VLA0@!E` ,nE/y:|BoR 0=(.T2+7iMt6uv66~4XJS'#sM/x>Ri_.A 1SGCGs 8Otuhuvs|Qft3C Y3hffja br7/`4r R^igevpЈSX)^ԃ@ަu M>+_'(EtB1S0`rG1a%wWBA&:,tNXֈNpޒbHRD;bg=TbuB{sRCGU6+6PE^_G'5sُylgXj3^W+ g 75 ♰Mx{/q|buw{VG?> tBNDrGW(2mh\i ȏ%&æJ`pNKqN;'C`L1!5E= 8Hm4=Vf!EIcGX@( 6 o]%iT7Mྛd.-`;+zVP{|3\+=B:[P 7Jk|%os48x /_8+Nq0GT (sJ- 4+b;W c`ZS,^3j*H^2k@<$}*QeB aٵjn647: 6&i+~7H X5MIЕM1bQp4؁8\9pVբAN){3db׽Gnm܇Ǖ VLmDqjv;S;K􂠌,5d4`Vgp&8!liRPO1x%ȥB@L*VL8GSD` @v0 J'#S*/4b\ ɿJ̬g'a yh)Ӫ{.NW/~6ћ A(p݇,b^6N@dvlB0G'lu<"\o=B9eTәfaPc8] JkQXa`d (+"bC@$hH u|"dW\L@փmoL,<1u $Zn(ZLoť% C\zhH J= É߶&j `p#N>Npu$l`XmP-xOe-D/GӨHEn`A"F8 BމP# $'bo_+D .ؖ-bzImѠ;8']1%N-+ +|P P"tusL !4֍L:"G#D҆g v:7Nz_9$O{17Aj֗og ;@JT֤ns(2H* AHh,+ x8#;>I]` )'@{AHh8)u^qm?l4گQ-'fߨ mp%MMDyM@UI"`I "g'6A*)A1,JMJ%`O D'f,-I4yv3j*6 UQֱtFϙ/8 \(`[ƙ:3 EG?l " <9F[Qq0;+_YX9#M~pc|KTRi҈T EVܬҕ]" +wW6hz)p!C` Si(U 1dw&+PI^VҢAZ Xn4C@xfG R^R^#EȢk%9Zb:βO-0a}8q̨# ~Df h%;"0*()2?HBR9ym * C^Pؑؒ_[RN,iPuzE( JӲbP" /`9{B2:Ử"<%vӗ8/dl7Eׯ9 ,4 h6]"@jO4bȧ˕y ]3!4QvSVhu0Ï҂֢J<""ڴy&0O} HFwʝ2B MT@.lN@#uv‰@wJqH %^*7(@t@ 4`{ I FkuDT5S'kF*Em,& kI *(,`%b k˚AM1^ϪU3woR,*w j;yȸ/O)5fx O** 9!t4BfD7AѺ@ү,j]!^#pD)Uxz:8rVѤ.\ôQIW싃th,Af$fN05P+썤AFt0`rvzt ,ǷnX.Aޠ;ټ kV6ci) @b~ K }JBx\M2 G r]Nu#BTz*%c>aB(6cf0`ªj djMP)Elm A2I% IH 3p-"D&]BVf'8ƩL7K9_czؓnXS%@¶"]p4 @ CoDiB DkeZWLJh|8 ,P*`wjhʼ:ԅ.2cH\'{}=:ͫ8t4vmt(x5Rdl`{2dS`kUJӟT<0QMI`@Κ#|h0 %Qn>. w%i՛YX*Gb=A4 ,!`&tr-胿16SIvpR= әpEk[B^k;J׎4dc (H*[48[^~QE:AosLVwHԸx=>z6Opj=́(!5*+8Z0nuf:5`F@꺛g"p46Իgan $eodGm4:oPVÂ1taݪql\v)t٨k. #(Ykʖ j˷A%^[gYF>@ `URO;DJ(]o@H~Y3MIѰ2HI`7JL99W*?]֚0eu*`E 91MY8Q#iM\ύ|a\FaeºgLeC VKʇpgPI _("7RF=M3r:)!sD!7Z$OGlZ"=c<((,6pNP* W:v~錁 װqf 9i*BT]#[[q(Z7nqsJZE5")e %T\*Q^OC ~4%e;wYSBcZ@ )їBWj6"1ooe"K5 {&Xi\*ذ[^6Ij"#1%8@8Tl)^ˉ1/CA@ l7$ ^{ h8 `v?c@/{%M<`AuYZ8^Ho\zqgOʹF k;} mE \p=, Q9vtxi dW`n΅$ff=ϫ!w|"! *p UA{4`X!d@"UTAsDM7тa9K7 Kn' ~rBPKT5.]r*MѺM}b]|}8h7 Ehe!?Á2dZo%5F+#O9#󪲽|9k~msr2pF߼h_.1Nr]qOM)0ډBa-Q6k,eD$u ?[^DB5u|WW(TUyw 1JR0d-Q\V )U{U -Z/XӍ()9 zRJ_Ҹ Gɋ/x]0$J7ޭ<=miD_gc2憇12W#H ڿ<03 8t>M( :GέأTRpxtW|gT =2̾튼+RjQARlwy}b5E z[p#DEw'\AƏė'iT5KQ ?d<N;ᛅflM|^(0(T̒grR}([ɲ Y4QdN_Ew$Zh\C PVI;X[C/ٯJ.h D jXBQt G!Gth5UVxpTM|9NB;:q\״~rlӼqA@է<&sduͦh$PzD;Ndnh3|?BP0:v¤f*`Ȯ^t_aqHbM^%tzٞIka}]K ylwN;!Vpevz%!`8hԜ= %j.$f^wb i(> <A96RhQȭ46e3IXBڅ5d'!} ,'oꗂ_ℎz=9pZyh5~ܲWl$Z* оFK}26EdӲ'voBVd$Dh"GB&-#枂J T}9լsi*e5ʣD4r1Pj\>|A:Mhl<{8w"0Am jA!mJ@M$njA 06BBfߥ"L ­oEbv bQi8TBAO1*&e2B! ڜ]h MjvodߺgXEIpVrkP/.Ǯ6* "E!8 DEoqH;DH&;a߹ӈ>`&=k\csG6D-äX2BۼܴȺ#n; .-u`UUQ5&B8tGFCƢAfgjռՌEuBq{Vy^'?Ck#x=h퓅4J!OZ[ h2s RP֢iinx4TY`hJtn ˺W@l4Bf6r 5tqr yi!J,ƾM8e<ԋbRYhh:XtHy90cټP`]107l m]jy.>wAII T(rzYx.`lDF] [cFT:n&7E,z@]B(u!w$ht1.Aykq\7O Woa&l@mAO{=PX!7\#b*Py@.B8ʽ+j](1& BԊ ˇ6H6 /m]PP!BrFV(?];|IGK8Bqirf6.# 6ymSdIE8jNvb :d3taZP#h~=a"P@6eHp@HpU9\xC p \-Lӈ.*\;m{"IQ1NWH!ѝS,R!H%QSf (z{'B8J](Dw]aMw{dy(La>;_Ld&^|p.]p\9fz/AFàD Rd62,bۆ^C b:885DUP/aqy([ zI)Kf`E؅Ɏ WDҝOo>וu+@,>^UX~XPC9kJR4F1B$A%\ $,G*xst4x壆VTvRTǛ h/T׌CGm-a =HfjEvAPBAfmcò0r %a8\L+:ĵtspK|x#b]8gnx~LghI_EbȈEӮ(1g V c jܦf \2B0vS+MT[6$;Û;وIj@޴7. tUpwa3I zU̖M Q|xHF DnYlv?(٫'1KE0 Lb.z(WjXC M#>E3{u#d.Trs5 DdrjN",јJ ;13ixVbK+aU05!EPaPIK}!T Zm VeU%]; 1cgb b^)åz8nEs05cw# |cmSEQ9d ۱3zԆ4s%*;DtbK.N(Au HD 6|fDN9C#,P;Qḟ!%Cs [a@!0r D"{tAPQ=@LtW(Z$*UDأ1~lEI,9` UAΞuZۦ&B5C9,V>#Cvjj4\-J% AtۭY;FUx4AC߇ 6vSohb4D:F"S ZjN( Nq9ZAOig p<9xAĴ4b—f G;@V0]?J #p#@yw6^hG+~p s=T`IH> \$ ͤ9S҂0E*4L+]#V-iB `FӜ6=mуStVfSLp 7Vf F+GoݬϠI|&'H@ "6,p@nK |JҠURtՇ tjB+D8Qī xF= Vuu,^5Mbpt]8Z&NG$WUHC$UKW9R9sut#?4Ђ;X"$<؎U APuw]&G(؉Ô{SY1k"mf4g^?winq@Q(c4xdGwM=z(ݗvF}@®ifPDr WC5XPL3|G : R/% ۱YJNam<=O87mb4yD=@@C HRvpkQe}z%ySGLƉ(ŕ Z/wY *y߼l! g5ܲ/5@ؐ[g0Ԃt@hcKd/$Cqq>I؜:1g yu8upi4DZ+Ƿ7o%5.g ߡ]$.$g{B1Bb1Qr# =E ЪH_ؑHVmhoS88ِVǑx Ga&gqQ 3x k>ͭms5&~SS>CEH_"u;nkn{g!GϪ\?adrɛ񎢄FxGA 1 f]8b_h8 <=?5юǑtWnQL\Pj0Cd<d9=MyӅ`?-ivoFDWX mӴnCN.ALlb"bl~GcGlP!$}bG HD,oz(:w͢>\dD6xxEGfu2RC~A͍E}2l^W|DA9?b ʹ1'3+4O*":*(q7ݸ;3: x=:wt jWQߪw8B(9[Z]*Y]`nf紗?Сà?ǹ8k>jP Ҧ ʕZ` ³AOC\.0b"^|b9Tիmayavi-4.5.0/docs/source/mayavi/generated_images/example_magnetic_field_lines.jpg0000644000076500000240000016324412747716313031001 0ustar prabhustaff00000000000000JFIFC     C  p" ȕK\zЕ,;Mysv\AP(~vҀ2]N Hu\'{ ^#h:l(sI{AԹubT"I\ά`|vP{'Y瀳Xu!yHbZKB+'⠾͜ѕeY1#B ,hH~btM}8nGǝΕ;ˊuفѬ9,RmO  e‘[245rWJqш֜diK\%NSU+*!JYW!=3#SZK˼w2RBّ#M_`w4N ^xDDђy]Z::(5W(_㌅U٤7X~%>k1R_:)':{ҞǢ/=<ϴ OhTRK"JpqWU6xUAgܕkC1{RϤRhG1df/x&X9_Nצi(*pyP}KeAW9@>RTPe^TF m͑Yw[(cZg= b~4,coZI~Ĩ>?l |bvZXp)AwPTۃKUw:әԳt&s&OgZ4& /`!EtBsu(>>݁^NMdN"0+˨Ѐ4^XvKf܅^g0NTDB4-^.DX1em)4}f+:<&3`;C_?Fsmy9/P!~ p[/P(-֝tNenI(5`:88y~aOk櫣~r=r[beap(y1ܫ~xL&Uه-x iA%}sf~aӎ6fncٮƙ9lkYyg$@-G_Ь:jTT_Wˢ)*E Z2]8`ZW=RUox:f~_Bm+5?>5:| kC3k("~u9~oΕh[1H{ʫi/shNuq_QVBz*]?.4u֜R ArDEj Sf}̄qraIԓk˴,tWC(gYXgЂʫ?7)=L_t͵Pʊ`4Q%Qz IW*RUi熥/8BJhF\Bd@7r-!Z;Xj7-*o=Idr33<#hTH ox}IW*R^ʹС!`6vFf}4xyUψ&WTZ(A׽999J]};2ƍ(\к*. IU-XLpP=Z]RT p V_484\\זS*rnURS\[Ҟo8~RDr]2& ^(h\|h ~R(`z)8 @%z J:ӣ:&gew hA}NH{k+(EyJ/,[~geJT Z)Z7_CSNJ{>+wa˝5 5WZ+7i! LUlF"ܧYOiLBASʺ%0 1gVFI*,+jf(u((! wӪkBV\hJ 34Q6 )ta7cԧeVV]W62ӕ%M4I iXq[wެEg ֖7rYK Sb|bhT=#Tۑ.EVMS:(}ʏQVp IX؛dFd1 "#$%&!06157'4k)n+C;3;3101PAYqǣ)oW)ٖ_0їaE ʪ+D9P9o? Gk&9b6. [jLP%͌HA@DF*YSDqN# l4%^<#e LDLD]$N.<>."!²Gfo*iM#36S #oհS~zWݐ~B}_'?ab0bxjƐyy_<鈘׺!*M\2iK~pC{` 4;JB;N}#yI-b} τ6ĝ2D-t+Ð͇xہ#0R b/DͶM_WiGLߔrqN8Թ(2bvbgf&! eDy|#ZpC#"YBU npZcytRvŅ{4Gs6'xu ށ56@i[H X D gr,<".lly,M䲙lokmKDkƎvvaW@6ID3y$^% oHd"F͝,< Tqvv'Ga}1t-Wit .-@S_8VC ,YIşM̏Ϧ lR1z*"i|ؘ;11>LL/Rkd{pa֤42T ͈J'Q{p.G4vgoSL;®H={<9yVpps# 92F5g,8ى:&'G-iC:2㧛0LQV`ҡ : 9ỷ#x xw7]i(cr yeќfK& RsMkIW"Ǽ}A`*߉yru:'D_f3s3.M9v&'%Ag!5&jǑSxD\LyxrF1ҐzcS!;1?}&vԌmfJz?bl%xH`1RO]G^/bT/񖮒KǷz"2ҹG :N"#iYo 茺˭> Rn<qOk"ai5G*`fNa9Ͳ>mL?V\:k +Sqc6e#v8oiю2r˃8 ;ʏҥjjǪ3Aƒ޺Dꘟ 1N 2/4 hd|Hk;3ݝ ^glovlĔ]7W6Vk1m 4Ԇl:oBud5+}+!yASR0S"dq*yXskH7z D)ȣ' pMɐ/3RZF6WwoVFѽNXƲ#o@<`lO7J9]5LN/BAwUmɉs;ҽ9֙0^P9Rm׿7eˌwWh/s7wЗ܆JuvBC`q 8"9ѕB \e+?~LLNB䡁gy5B^! 9|fs?DND3- AfKxgn)ZgxfTyf#W]yea`㽁C9ҵaҭ< k0F8Ӫa;-Ji[E+KmKfn"E|Q45w};ˣ:#Imh!}vG!pIxfbXT}w߷arݓ9Ws'Xf< M]rrhnֲuu5QT{v 9'~)lRۖ8rJD ]ee6&Y M$(@Ʀ'BDᇃ^0ΓC (wKt]t-zV܍M Ж#XWv+"vb&&f۫kBn_Tm{21\oRվ_9>sO䌹%02` 113moAw05L*<(Zn&h 00r4X:JzLX&؜̒{Y;s]q5 &!Kч6{.#0r+K8 #DlmʧߞGHn ㎶uvܴNy,cGb \ei1ݽoTMRJYrB ;>X !827f"#~z&jp-esހ2Nq;:k+"MKJimUja^]KyҚ Mռ+z o P˛;LLL>n-t=,c12{JZL 0XIڢB\kdTY[|QѵqwKT)0Ӛbs`dqise!;tUTJ Io6LMڬX%TF?2W nזEcaBS ~xN~ʺώ~ȪRH*]sTMZ.,I6X3\9v\۾ܢj઎j* ?vBCdv\mARb濗kvFѭ112|F@hOh:$q|t55%^!WLl|2C+ Y-[jYiX1<]ZL>?]Nڝ[c.֑umv~wl x*hsssi*Ik؈h7eC1;Q#ζ]9- kM13Tѭ2ɜ%ibh<}K8Vƅvm=.:X([iMw~܊\ ůi)Glɿ*(ɓ2h xFC>.&@{K!}[v蘘I110rrt|-&rxYqqzVIth%M{f4;\/I]mi56qi1|f!M#j^V K.bHL:C`CXe> 8mmo}֙uzR>ω~OLL g)63ee{%YC2n$_y"f&٫&&b"Ho*AmBV+mH˓%jӗ]Fpc8X ~p?R1122.WSHk:4pg-xw76O]f;qw3u%c,rg)82V٨KO,C`dgdb /o10O$kEs 7.?I=0iON)j>5jy< I xS\W\/g}\mw fj3vIa+>Qi/.<"6O-k 9)12ժ-@fa؛$B1&rdTW"H5r;:<{ KgP!5hd*w]ݺ&'4@B#"#j qIY0harC\}[ՍwVLLaʭ a~ȝ;?ߤHQm [㑆M'wmny<hϫkVvqܮ4Mۚ"Mb3i^2N;ݦo"XVets}]vlt B0ȿr~&&*&Rk&SGID{&ZU8V/[ed6\ut#]qɃ-wE۸܈TIo:/7ii_lMWV2k<9G"%+rT 0i7RX6fyLsw7ډ/"A\^]|11112DH4tIQTx*ձ$I 2j @oWoOVe[!xkRI:{a̰Vg]x׉FWPid'վPkmZߟCjbE\R`)!("r1U]nZk2&ˋqqmtYπqƁMqqa$l]~tFnJ}*Mno!n;~v`r6,&QI?/ 0X:VOZ6q5DZqq@ߍqv)F^9]`T7 L<;RrHYOwѽ'(6d kBWףa"B2eNU6K :Nw5PzkV[n^+6ƓӴOhq^z9#oh. "Јc0yt^, 8; ӁW#{+v%V$5-ë_&IIfob%x-<W\rNغ2Dg'ۖσRf] uܲ*B}1{"t0_9 VaKXrKb1Jj< M2<Ⱦ%/&Fg­TަdJ)%4J7HX*MQűbQ/! 1A0aQ"Bq2R3?b5dzϦEOInx%U5sPbŊr{ٮZ^}{R,[BTXJ=K"(tsla΍(x\7b )R!P$˗3Qh!greJiQ-2Ņ$I֌).^ (uw4̌h*}%k!]0ЃRyXqpaOGA(R۰eA+ WTDQ4|x0at;HkCЇ&=*1 =oUO*ڒԇQ~aMw.$:31q_&b$~{nz3KSf(ʦPiw5BLewPT97#YZI+~W,Xw:eY4,S2[vscyl?s^99iE{767f5]  !1AQa"2BRq #Sbr$3CDc%04Ts@&5Et7u6d?e~=pF+3ol5(ւQ39HaSO(P!1F;n 91LArqfKPo":vn.f}J~*)vua cT&`٥ߵOY\v"MEC!G 'Hz1^dόnW%([|"_AQ`h]jyQ<=3S^XaM-=ta =x&Es@GlmeNoH}n2ЁLU(`8"AJ#7RP&#ϐ `:_7W8nFOmVX޲!*dk& 3w+*uO@9 f7PŌ?*E&-KZW>-hqBA!w=/B㤣Bɩ٪@A]~an ԛ$ﶣgeea–"+Cw@h*VD̩]e?47+caFH6Xۣ>vn0*}E-=|k,ս-)9E9L(l&֚|\ɜG8ML/k'%86d=Vo F#+fZ&,7+L/wQ+o H`@y% o*bQja(bA ۹26a`ݡɬ\`S#C48_RU3MCHn0u3̙pD&sm ّptN2FӸGr)Q~1J a3! ʜ\ nilYsƧ.aVދݘ<}!yxYp^[[U: Ks$D"h:v8fW.Դ(F)9NU/e!yًjkǼ ڳ=D;aTY>T 7\^nq/NJ UK`C} rD8-]\PCH f$dN3yu#RzZ`A N?mL%hY> ì"If(f@Km:x)S`?,V{H<Úma̛ipp<9d(O9]r)HA24~%Fa)ZZ8 $7\Ku˧7VGڸXaN JvE;LlNhaյD5JoA+p4)yB1,4~$B)wJm01/@16|_/`dDLOA4?Φۂmc`R@QgGAC`}YjTIKPFj\FҪtx=(lz ftM5t:ݒa4DtRޏSi-=S4(Lڔ -$>qŲr`iU Xd|Ze&'lK+<ι^66_{o{WE :YGHA4vlC]e!p]qK7$q2_-,tZdĽ`ɉY/>ayT⛬ 7GϓG݉48(f$s}NBI^hTPԬ d5"N7zJ$2-; a$ė0i165p`(;XJPNÜrQͲnQ| ײɱzM!9D\yTiuTL0 ?ZHS:ḃ-TL:7hQ N3墄%q`0ڄ,P.l,m 4Z( CyVP|%Q^\[H!4\[0 Q::B s/M L{@x4k<C|+dZW){O)ZWV|Yi1AQԚ>0Me 8Ç, n2GQrőM P%(T#ꚅ8>PǞn=p%\ Rcy}iL1]ogMhs1`,J(U]t V+\ZqR iR}Gl TSHL %謏)&MVzg?g0!pM|ه,S(-`e/f1fY7HF'~L> =fYܯ F`Db*Sji&d>u9ʳw 0D80LM􈎎tP(W(]B^0ApM.$d9D>rAUAD.BTc94,Y͓1,:~%pB)XGL9L~=&5D3$L:{9 w6a (52c _ ʰl_K=)H!‡! !0ymjTD4=zA\$jCNdґ~~IJG>@(pJeq ˆ^6!eҵe? t:񂬂9 )5"q&jg2J'OXz= TU-Hr鋮Ra)9.UD(I0fmJ|! bZ*H0%|H\zjTAIj٤e8LEIuݵD:ZbAj"kDb|,sYg"mBzt/lTMnHR\p6Rg8tQr[|WEDUTusILTd  ~R ӊ=P$4*POGBb>!Hi/|N^Keu>$j*"ajJ 1}/ј){u:=!#3Kލ|ìӸPJQL5 =1f\4t%0ARp iaM,X()h_@;aԸGWCf7CwCj$e ìlj|22le.hDn`ָx*$ Vp] 2Mo~ЭD:Ɓ e#XJ&ܳ  eS  2̇ͱ?pDMGNh-uجkp?#W u @)C(EX> 7| ̒LskHxrZ?)k`x91QԊd~P7XnHU' ì?1pH]&9de`1CRcٛ >ŦK)?cS;M"1fa 0SHaRSFuPf3U3bSUvg,LԾ hH MېFX֞@`tVFm%P񨂭(I+0BE% 9hl@&>^]⤠g"{0^q3}bG1ո&Ro20>s*9/2!! ; L:g=3#p"\歀A|aeG6_qJ/ Sy!\B"~r@զ .ɕ,"QeJ}snFiiEYL _ۤ!2^ȳ}*K"CE@7vaS(EtƇHVU8W ep(^J;݅ɿLQ[Uӣt %n $]aPG$2}kL6{F筥0%h )3&0Rd͑o%}-AjD TEhUXEe&п%=0 2Xa|S7AT!1F03"ߤ7sӨ`) K64Wۦ 'T';Pw``_30Rqw|Lr-~L!r9|K'.WG}brԡ,'aX"e\_Tu4M$L4ؠ3l//d!HsZrNiw : ZĽ&ʃ3,G]ѓfu@HlӒhRRX/Y4|F=#f.@CVh 2kW/v#]mv)LS%,GLT7DQK!ՌtOh( !ʶ1WHu G5*wf j nϊx@c媧E=p2wzkW.B.(CbC0/r2bf'L&{Mm7 7H(S }д|ځrd*z / P6넧/:\!|Le#7bϏCjTN;6&bN£ZRd A{xCY 6`a7KzԽC$gIZ^u^Q%9 SM\JGଛSzGw iO ]6etDŽ_?W7Mo\ s=X2_$߾s4zM7+k*aE+mxBuYHSOjkl W8̓t &^Z JzM H ^e ?_|#8*/0BiJBGD_-3Cip,Ӑo#0j?BmMo3:A,fǤ~wY Y5vKO1ԑowna? bBRRk 5럔=eDHEo+xNݩiCH#6NniMJqO: T0|o(qphpĪph*9&q&2ꏤ['E۳_ LPReiG0!@lV`F%`3ye xJSjgʢ]ϔ8b*AĊ$jK7fa7 Q  ($6%0-XPvܜHqEptk񺫹!^дnJovε'/&nh&$BPu4ŹJe>]_\ܞ(`D ^nZ0 L 4l|kXLDq#&L,)˝YUjMũn^p;(*-&iSn3eN3GYpŹ@ jt5PIDfۓ˷XB<(6T7k&BMU3Uya#p-Lpyk  l[HtPU /i\-OUL}^>6æ-gn_0ÃOj]@xd#L&/\greJ?F":MX4L7n֖NW?%=mv*A,@(bl3:lo% ~Y=V!تj m o"8c"ًy>t5XPYM-+ ZPk07_gm@4C6 <7[Uq[(*<9ĦnwɅhxF!%I9E@Ker/ VЈ] zu*^I!-5[k'HiU`aPEٺC:^Ȱ3Ǹ#yJ$STokL_0ZOH -(]Q8 0 x=kydYrCP ))dE(`! tpB`PS7"r^wCYDiX^)]&tJ= P4bFC07P4+;nQ>? {"D %] gD)Kɬ\S"F2~_2}F  \`dS P#ii/":~qwW*I&ZC,άR?Zw>0cyZ2IXJa.Ɖ%ʌPKؚ>I$n[Ch6OH! Q"dp ]mY0q?*. %1Ŧb-ch0L1|#8R|8T PKzhʷ.rFZa¤U|>Ly%}k.M!Uvp ]NmRM. h m`AM@pۿ,TA⤫T^p脥l{GHLf I +r+*f5zT\E"6$(:lHkLe֥ۨ"BA>\$jsnQL8* c/ \Ԉ\h2\d/>FpM({MpD#`z#tq q¾5 F4Dc8sɏͫKTU.p.:Isg!d&!C׎Q+I'f`LM\lǥ6 7bYJjn\{I5Er_/ĨU({w@QO:liUO\G瞹6q  RDDpQ8S<}+i ]SptƵ/Dgڠimtؔk/b7[U5Ѹy.M92H${/Onr100bAlg Ӎc6I C-}INc|\Q9xG9DT܀ l}5rk} Ͷt@ qCIT ,(T DLk̹L7݅e PIhjztB !kTt@ʍae?}c3pLYJ GKUGrs=g@-TL)v(Jƭy,2f+Ǵw St-_sT(M*OL$(,A%MtTJi!B g:` Mp4&N0TQ%)C@n 4jPJ9WNҗO(P 1jb@Ha9tM$…(ByzI{cz1cy0&"a?LH/ S{$(g_.2(L|րV"& 5(֊v 4&2W vȅߎLI(8 c@ڡ1c(&(APRf*ToydFAR:IKS,jY P"=9Gܸ^FR*i[$!BypQ%6=˟zoHy=Av!%.#t**(7,qY⵭e2t\oC~LäGl)2q\m1.ɒ!PPq5Y*jf 2M1}>Ěی$D&,wra[d !ICRt2g.#,LTqⴑAZA&ìٺ+RT8QmUcm\Z;-e HCldj t%-Dh+ aa6)OD.FM] N"5=-#qN{aFFi"nPLv%Ojj[(S<C.53"s90}x88كhRet2dKv iwZ XTR*cyZ0?:-aGOe4&9BHZhzS2wg%Ħx9% !DpvI P͠?@`g//q4\Δh,m<o.B֍}7BO6ܥ5 '5MzA5Z6텟2xa%SWCw(s2kSiY+ڔhg.pBxi4m9h;ku!7c&ۨD5m|n^|X85MAQA25쀙LV5(<1(BhL._ P.pNzt6m8qi[:'rrAT"h*( R(hO#ۏ2>r}&tY?s8q E6'(ݐFLR.쐅cZ5xDLl @ Y4ȑ˭ `L(R7$Y;Vz.)qWE9ݨD:DbE" \.I@)ԻazU9ͮ/NT/d:2aMQ5-!i`&XօMI 64|fQ'Y k2Z f `'k^e<:&JR {@( H|`%Ȫ)VPn:WXDF?䄎VmDFL:GչqT`˾P|m_m]A N!I"FpZR?1f {bkFm܅4ȰzW "Ae, :z\uem1Ť >yʙAt*+ʸSZ7-eh(BTKM,0(3*ٲ|eM: ʣA@uӥ@*c xzb2@^pCnqưq qS Na_>$؆Vr dyAjCXGp}jp &d+yhwʹk<' @`:_U#Jr TQ,!1mFG3#89x$ն05v4 \E0_D- ,_v; GIEģ"fx D Re0FVDˆ@n US\*kJ);m8hmP:1M&NB98qC@pˮ !9" Ȉ^ͳPnۥ,&jc X&IP$:|u[ CoĔM !׺_ SjP6xJ'KN)nYPӪ#P 3i(!p'4Q1)(7܂.efU>dǨ63"WDԚGt~Ʃ "i͟7NO?S`nS!x!h'9# /C1X\.nIz_>CGa QCJP#g)/(7o ;ta`uSv"p'x{K& "\)1Gt"UPNC@B7Vy'p^65+cLq7Mj0DìRϻYB@Z2ql?d}Biɓ3ɣUST޲6@;bۚ -Nź$:K@$RTE"^} JșP!t[iA) cwKцd 裨Uֆ*٬\`$Qdp{pąEvo…#):~Iha%x5> 0;+Ʀ~=qDk8H4)řHM[qFW!hzEH·R ؤ%d] L\Ix@-zɠcn&"ezpjT+jn˕ TY1*DchCz](N'iԭbow7!3l5MtXx:+ .ڛ8~0f`mkpk(`fR6+RŮb,b Ǽg9P[R'W]b.0m3 &E-S.sf.8k.KpAaONޘo>p@>jl/JS71^4["ޢ`@̨S 7nZ6Tk-jp0bu8'~h~q¡T2UerP(O2GTjzc%%& T2GA |-som_II8 U`F"q !Ch,eW<ơ/| e`jZhzÉ2o%.hR5=M&Rک頎`B@ԔYIRS^rVhZ\8=0#\ط0xkIġS};%hRHMhc&G jtSc8UNM v қ r|f6rm3#Kgj ?A#5rMF7C FȨ:FS 7:~ =:RWK3~30WmGVC8w@-Y|F1"l+BZ-rxݚ?0R&庀5  cXvP͝E0P9j%*L} ?Zj)EOҪeWhQd |eJe(iܐi;AYӓD:cxű{9d <(79 ٔrMokEҴ"[ 4r5NH_<ӓ`[+#: =DG ģ853 1:"7H`0c$(Ľ\2kg*.dYŽ zgY:~Om:n[M!@xzB!0 ^<S_N!+,T׎,:7(1WRV~ѹGuCRx-i!: &uúpF>8h31D(Er4xv3Q=$ǔ1Nlу -\4TH=qBLX:Wђ!DeNT:]X(\@КaR'G+&lJ%0*k<`>ʺ=R6 }uD85ۉ,Ys 1˩诪BʸJXԅT'L |&iY?XWl茎\1N2N\V)ip {1ydA V.#0p[N?nN-}< D>Ԛ:45W29P#8K2o[џ@`~cEe6',' $9ÌN_do٩}5 cU}͏S?Ջr@_\ \>>.1`UBz>cf{M30@I>C2nwngX g5 J(Kf,X,vYroUeabW jO/Mi=#< iZqIKi宮5Ar`M5Î>xၛ(?%lX1S4C!22ҎohH&9Fӱ. LOf)J'ٔe /Tݔq^jDC[ѶPbt?ȁ"t F2=bJJz zR8Iq&PWh wL֋6cWeH CT2mFpL6qY8zps|clCZ*!Z˵ʚd 5#1-X`Rp(0LeT5&1ubI=RLnPOPiTTVGVD4d^H\&%ٖq6#XBvRfOMnk@=/=jkVߙB;PGnDm`),L [FLJZQЎUq92i$H.͡Q6rGIdݶ%8E}~49~PVI|E!1VK ]YEkpNÇ(9;d@lv/\oH{?7Qd3^)6=sX,.^Дj0**r y4 n>c=a4X rlkC)UAUWp>\-9.yn H=c Mk4R+..?xj/ <b%&cUDz3$."8 1T,l(a@ 댬tn0bu+Lx.Aj2}泸HjK%76.Jf[ ! әR◞/gt$&*bT W;opoI56PCnqG@nfv! HX:c~J_&z8tͧ΀`2Fq#)_ 01C&M 9b_6 8L="B,Kf6T(>>~k2Ei@G.m{C[YlOh$\i1rTL*c tjqjCPঙsh!CH¹K?'˜DPl`^TJ`ßT`p')K{Y*csFbk˜7"66z18SJ k* !&ZPe'y={*snXa38Dlg,JMPGPހTKW-LW ׺ͽ 1aahŒݤIR T O%J+zo.釿wMFO?\blz< 'Isg Vy37l53XJިǖt}cE'k)%:wKhc`^u@67uFǯR9*d\˗xހ.@}bĝstGf~f' _Lj'TV{ :K* 1T *B`TSoљ!zFIX:`CU&}3m&IU6&UN$ɬ?7>G%|ʇ2ekM:UTp0VEg* ͣmUL(㉔r|m2u @u=Ke3<(ݍK_aA+ YD9giQnM X84+4X ~H0lj蔠ataR}3юܹ{bgF;6SsX|Z} ՙ.͐ys F(0dR.Qr`jr_P`s\G2T_eC82me&:H `܇D-3WRyve>?M$h8 f9z.fpARd-R/S fj`uLԘl4oa)0W] BBQeIauqO0 H L YJSΩqCv8$C:.δo5 j͖x~ЮfnJST8Fb㶢qݚC5nnk[BLRHH\><5`l~>1-ʢQ9znVkeF_M a1Fjt@$TeSQI?|5+&ahւ/6ؖRA}VQ*i(B(zre8 y1ɒqizˬ-Nc L|c%(qztjnJF _O P"=yrs00!uCPMl~m\=:Sn TtP=*ԛΌ"\ iɆy|0GMVU8S7E;iEiĸu)Ff^`_Ks&Xh @58{i9vpQtQ-²ͫT1L0t (f_>iuAa;WHD-C@Bo埫(zY}ϰrS^TPR*"# NGA2[6\^z PĈxu4f訤LLaNrf1O+uF-[%*_ P"-u+3D'ź|Fr9y:#ZM y+zr1j Œ%f ѩ5=+dF3JʅhO.2f ,af)ID^~CDN<$ htD\'8^aK_7 Ztu=EpN0ue;\6/Q^!)D%7wULև>rZ.W"Խxuc.3 ݸ[8F%8^]f퐦9^JwNc=Yybc-YDe}wi H&"P7Jw5:ʍRE 9^Rbц)1nHG _:/04 ceY,P 0Ժؕ>0ŴrOJ|mۃ (lge bT|Ir{9޹/dbd })hWf蘜Z{L ]T,LR.,%r?LL6񄏡1O^ԬŮ}+{ᓥ Uڵx#^2 pӯo8m] 5+[#:ÿK43Ty~C\.rΧ7hG̥PoH W((VI yɉ}&ɲAQםtRGY*箝WG6m4 6Kx'!1AQaq ?!$(QdwE  uu@flg% LU~xIB{kݼZE =ѿfqƝ0Gz;a7- -ކ=y7V0M޳N[$QV&=BJB,޴"7OŅ⵸HOXt~f\P1f(55̔]v)geۊ_uݧ9[E9Aq7c?%DRTc틫v'qD&-AY,@B0&BFΖwx&0Tc\E&  j$y>hhS#,9vٔ.[a&*OBDp~ (aFgqwLz/r6w{e@EN LHZM\X8mXV]*='c<+ݮC&(t;X$/?yM?YQAKQ-߅NjB\Cj:bm%C`0-|_}X^N*ll@Y7VJ >dK^=Y.;SZpEmx,>%6H4P=քmI`YO_^]kR/g B-29& x&7R*7mh08ErzFxZ@A32/-:=-/VP *P(& xg>ff hbcЭ=V "#9-Jr&1.w*1%N ǏJj8sI7OHV`fohtE53doO+x, &ܲv[K4[P:% ()|2gW+н18 Q&hww$OLQ@NNw}<$9>^#g19Xy[qGn'#S 6vO0TK%`ȟC7DNh&^! A  )0(M =ڎXH ̮-h9svqSϋ87ཱི;H R ZøG) 5?05ھ*.;<eIQP'~tJ 4d?4r3IlUdiʹEL_l>".j#ZvfdGJxEX<0z9D6-Dt1Pyx}҉fUΙpʘM}س Gxpn22Z#@jB/H.qALY\BY,UysD҅^rf;ܟ?7Xzr ؒShr 3@Q"9K|QP12?-,|Ck(h qu`?|H.>P4DA#~J}aW0O:J4>(ZiH DA䡺ke/ rh:ȗRV/-PP#j]y9 12K}HLbͱP0*Ldx07e=Egh~,ga=}y#!1lԗk !?<":E+ $迷A=0|DBZ2D$!4v+|TC96T̓[5Ks6jus%Q#i=>e/Wm |UJC0i$` Zf4; +ʋ謽+Y(xy1j&W^A|X>/R7R-D4q2U.җ&ZCA|_$ H<6ffFWPP $ I%[`4 XYnz;#J\׾,An{Z٨e.tkޭVh27_OrV.|.}-Db| -S]z8rpސ Oc+6!;5m37h;UUft ſ SoJ!ݢD z{ )wmL)RL4y0ԋ8NJBXӼ I  ٦>_MY~NK&bs,=)xU(C (U5 9dln>@f\`0l8e5g{P & 2d'!?8euRW6͈^I4(1⠟Զ,~3JlV.Ԡ-I-”:m;#-I +bv627+*";%)X kCI6h@H-Ю3l$)oهu#2``w84Ѷbm]j,N{ t=C%C͓=:8T3@\"6!I{aɝ_;pr&k5?嚶 2 HY>mޭ{B< / "Pr y'ʿ${c=QJ_v\W;vؤВw3jZB#"W&Lfj1`0oڸJ,N(Ԥ]SA5e &)9$J:2h`LGIyvP~7nl8#Q]֊#qE( [·BNKpre{uӕrj͠j#(0.J3efm-s&خ7\ؚ D pmoE 3ai$8 H 7nd["XMLS /ޞ_oF2Iꋏ/NӖm{OG%I?eHYFe*G_̈́5f-y$xuGOz)%פyxG@'`Ӧ;Wad˦n-aJW<諰Gj햴~Er2S0Dyn.!T [ 4$tcU YBi(:D3I[S@DK-*J&T0fO5g *A^1 T } 4`ٟ#z{7 q'D&_oXzMi8tt_;k^WlTUh}jD pyN4a.(LxhPr +z2.sۃM 狟%$XsIPXT1_d'٢F`)NfK  FQǘQk)Cy~An,iCp@=U,g> K"9lJ -%qI q;@!sO~axX:i! '_O].z8PPD:9Kb++||@'/u\FnE 12J%.qxOvLEL4 r'E۲~hh7( vHPS/?Jcc[>疅ďϼ^F_ylӄ;mVŽҳ/l ,dZNiO|nd|!NEd]PXGBj/"Cܗjߓ4 Mx: 4D66-tXkqR{jJRɗ),TM܏cQI 7LlQ%20+Q0hx.Eي=:L*Jث/2&{tDH13%^q.*:P.v*Zj}L#9ʽ]d_w[RI@\/m'}%£6 ]J0@ Sy4xjUeMeڴ?zl^9\6O Nj=ZYZpE{-, "E$AFg:ՀL>h& 4xCo4yt IP@&Ù7%,m;,-^OϢH 0-i&ᕀHl GUӡ8U|ޚxWEQD6u|?:)n|پYRܦP~Fîdz'U7yMA͡J[_<^a S9La ] ul `)q<ʚV>I-6(wh6Y2_bӄ"73L"ۨŅK}r P6[f6t~9sW!dIzX~1pv<&?=݀.Yӂww# RO{xcdXd|E$qޥBcfl`^?6g(LA{%{,X;G%)Et2 0 cJ,LJ~9ԔuJbA~)G.ūoK_Wk\;tv?4zZ ^7RA{{T/˃\do8Vu\Eq^w =RuaQf j rJI `{0,OZdK,]ňx,OQ&.rIaF.a0^.^*bP::Uԩϑ(YLJe =NKrB&H,ƝDt"Kh42OW_#RP^%*} GIS4,x(MpK #M>pc%,d=scSSPf#B߿U1[ؑaM * ȶ($њɨJ U: 4l P^.b1#A<$핦t֎b/ix ;ʇ E3EccJT0 -Yt3> "耜 iW?,P;#M:#]Z6 E(R/S"M*$sttBD\cM:dE8ôs%1)qJI`S $a%"NGB^8r·c3Ly(2~**6M%&T/YR lس'7EwV_TLߖWS\UE19VGQRM C|jn+ 3aw.g>M-`^"dzdJ~L50|"! !r to@B5E34=<I8Wg\ ?+Ej8HD jAC>D mjȋAQMˤH67{@I /ן  zS%V(foY4Oڬlr)l.`_O5ž"2~yiN`8Q* m!Jt~ꂬR]r։YAbȊ~nF,$صihȾVӴ?=Z ؎[M(-fR:SV'c7|_siGh(, ?t}P%E bjɒ*H@)Aj_a7fK[q |ꡰkg~5G=fTݍ)]lYIjjOE^J:_DC ^*2]jxJ2w˙mw3MO ]![-MPsh9V Mtv@?]蠣Xk ^CƄ=g?R'&TRL?&rRڠ@<3nԢ] PcB+LH?0&\p'lyӈKg) ɏUz_2pqˁ;J68mjdA.RTaC೤_(Bc;xy oEQ@  3ְ *)䟾",QN) Spy>*~ca偳0U_U')x|\xYhGtT 33NlbLb}CLoYÃX}G'ՍʅI+wp^y]!~r]jJ}Cmt2f z>Ie*há?~){ct(m1&(듲vC{ o qDG囲e,d!@='qHBK;ӲŊBu.<|K$xxhTچl]f`2=4 Ɏ!bQL˱~+4ݔ&T"=YGMןIT96s3 ,S;U MW2n/OIx SrLf vIr\\huPpV__#h(0 ny-(tQ܆j\FЂSoVƞ-,E6)0Pc)a%O\*.Rka)NUǃX/ޔrYlKsNhESP{ʬqh#=\SXw1/6?4R8"J10 ^m~KI.9; ,@9t[A\0]>ȵfMyg9QN۸V*i4ɂWbrq΅j X ji o:94z:Gi"[jXv6*}>@ߌ@ .5/ 8$NKI?z'-" XiW 2f@BCۛշY,_[nB}{cV'3 5D!3csĴ&j$N"fъ!.;4y2aF7hz`dQ…bu\36r%Yyn)u)si󌹣~[M'E *YV⦎ERYHMs u2I3QrCș(X}jM$yځ181w38Uf;Gm%W7`2DtZx2ǚVQς(h8lwՓݻ5'#$Ej@3# B;=pR0LQl2TvJMF,qMv {\Eס >/5?]BܾFC1{f϶qb|L1cʌhcu[<5q3LQ9 45Zwː}k q~X.-/Ƶ4 &C-QhTkh=hji|DoSA[ѿ8 SF']x]B9U|ڇi#y1-"E@ŵ]HQygs΅Lv._ki(byu^~fcc0P1kz0[f: Ky;#}P qIM4Xm"0ΧM8(1@[!S`s\rhA[e',jIRrRQ,(cp}& cޮ\T%Pb7g{,$Ar>l6@KD J ^je"( S4M15:F`ϢSKVg!^G6Zm y |\e#3IKC]vbO+tu5=:`ISKCr>8vkW6W+lzQ0Y=b%r1ve?x 6|f h~%xK㚉3qIy>rl 55!BEdw٢7M `(v^I‹je.Ҏ@r_T,&R3P@U 1Qok&@괴`d矊:ȐF,3<4Ϳ4p8nw;LW+ШVFDg O7m3avs_)Ap{]݌=M.>^M6fބ+#ast>dԬXCPh5=" *a~ 7\bSeڿECuÐ~h); jXk(*l5f($Z">6}hk O)bdqYPpSJ5b4Ps-ivJ?)_V"|8q<7yvqp&x&9U]ly<46-`M@IuO k t%J=c,h_ܳ.XX y,^U3Qr-'Nxm'FoEg xO@J|~+I^_L[­Et໅ht8!854SR!T?Ӣ({. {Kj(J]9hiY f6:I1Ay*цJ n wUk6Sw92*<8_wMMmdQ&?_Pm*ņ%PŦyRW<~ nD"`$仌 fCq$R1\6z4r54rU&U+S//?ܚuQPO9WC赳W R8T0YVaZjq6Zu@nmݖ `V-/V&o p ڙ5/lg6=Wb^D"/}꒶1my"-Aɝʡ-}آ`,EJHeiJ1*+ i=ai(J74)cd2 %AڶLl?!9 )liPۂhDv K`1-0AӍ[WQ9{m^HO$+vNg\`~M'j#Դ3{"ѥSJJAuVcջJ%_M$J͘I$K^yWADFoUM퐯ԸJc0eESZe~$iPmr@LP-C4}_csӶ3#*M'ۚ\r4&fRK_ \|Z˸Ɯ4Sڕ4gD3@HI&h`ggl؟r:.gCJ*Ty 1HT:=>TCk: ?#P?H[/V^D787V<#C eߎ ^R2ڸZg V_&h^&`}r Nu^p@҅{tj,4)v`DzpaZɭ@M?ML35J>r8 ۞j^taO8LqPF~a"Tv<545Fgv;>5`d5w>iuؽih̻ 'T'= Җp{fj@BF$l 4p\. $,V%/޵rih(`<>޲6ec\pSNu s9ˋ`X1Ȩ Ov ,(Qzc;bFwȧ1rE$M)D={_i[mWPEN U# iR=2[D1 ɴTR=(n1Ђ4 S,z ,5b$rƧy<ÀP*Kʤx=4$% "!  Ӣ,iC(୨DmtWi14*28b <ϗu ̔3N&b=s+r&o);`eqVvǑ-m2⚰.=C;kiC ~cS:yGawnnD* Z0q,NO;`YIY0:zy@ w=4:潞H[yupS9d,T0P[x-:&oQgk}uu 6<;6J50jzohbM 5XLµ(5[e+R#zv_iO s'~78bU~n9󖡚F3T)ŀĸ5t.ؕC4܌A^ |U9 `4U: 4 vS*i_h] P82pmmC-+/ c%0ХF [S4 q(DߘrQ.޳**Z\.EOvXM] TWxi1%D̩ 8ç fbA֓jl+?R8Y8:&qǘ`^ϟ8fՆl<⏷r:nԺ#$`S2aZN o6:<|b 4|ۤV[V-ʭb b6cGYgT ;nv fPc e> ^dYmIG^,A# Ns+Ou=~6 ycSxckThG,a,G N_G^,&sh:o5A.>ye==|I-eT2~ :mD#:*Bnz{A͌ 3{4If<lz|5xc&ZGr.8ĵPlaJ:Wwi%]m|U@ EF4#E2Rlss?,vG'G[ʿhZO?!$ M(L.^%EMOVU\2B0v>Ʀ?n_,UIjdX=:{WnC.aH>ԣBz]7n @(cvkVh7vP*g1|D ĸli(ڄ6~u( S}Z{8@wQqЄcEGFG/PpEU\azLALtC5 d~%e qP/4|H 7\QpAaqWpE. qݴ5Ol?Y=OUNlF"DA k(s<9 th7vg=>3' @ PAZȼ Y!-pX&JІqA!g*F u|-.Az$245jD*{0\ `TK5Ҭ5\K Ɔ[q)/B tQ6 ѓEm|aܞ8ಝ]R`)=MG7 @3ԷaKJ 4-LIst 5E+b6hSom*quA ݜ<CT@qas1W?}.y9PY̯ ɳ" k^Q2V+HM0z\(>Q?Y\_bwt\s,*v9w=RChvKB~&DBUDIąTNT T;.38_|⭤Yka"`k'#n:Kq'жtpZ윚:@Dh3kbG[:6vq 4[Ҝj:ꢭdeNpPAqLBn]*ܖ-pS( b: @3;݆?UJ Jp# L]2-pf_jgdxfǎhŸ=f1 t`|xuzjJ 25aaҎOy[ᨆ+GLmrLhwȠE2x;q[(C됁4d}C3xJ Ҥ.-tWI 3@EVh<O?ĝE -2.U>/Q) RHx K@݁:75R'ĮJ!N~!_a / /t^n$ϓwwP؊L"Y5mMU h LsEh=yܓg@BGL5M(F2ȪBOӆ؀>:wfJN|_\/`Hר5Kr R74.H1*êі8)kGc:WnSj͂F9zB#bͱn܁Y\,1xC>ւD:_""*(D0Q`L}i!hwnRO% L=aS%b|bQwSs.kKi:. J/o@1WL_d} TВ(/_DDP(D2:AoA j$]t XsOUvˉPR-r8"`u=ʸ@vc狑4ZyiFSb6'lu$_󊊕I1D5q#Z.;X tEX0>%E5l':VB 45īzDNr?`O!_@i ['1W")0/r,0s5DE$2A98fLqukH6snTjcI{W_:Ph7dD2;A9P\|JJ$OknJQl9ցP4pB7}*~Lگz< bI$8PRl!8)4;q 7х͍M %TJqÍ@PnŒWb-OaVȃSO %8[wQ@ϙH_ l@ W=Y,O+u3;q62?pd La9r8Lh. "P ;.7W?Ab`,?w;ZwBKyg0}!_Y-c7`7 G.aKSB#tDp>&v@4՞# !(4φqF⢻lh7S E97gfi lPfmԨC} LW!+}f^)PEQScwK =/3V&IL7>IT)6>sTT;_Y f [N jEYX?ow#2l/t$ -DC6ZsU)M@t~l +^_qae+2KM[4U0PV*)M1RPi6@+ e ϳ+y9 Z~^6 *u#pP \']`bc, *$aAC=j'M(%+|XҸCV-.-- V6H0NNʻXhH ԭM8ЊZc7F8L?-ǡ]GqTӷKY m0@[vQivW/*J\t3 @Fȴ}"?QQ*Dd'N1; \{<9,txƗL@&vL^9#gŦ LVrt\VqB9LIvܾQF:`483nso3NVhߘ-ƆGMH 7¨D9~~b| f;*.@)T(7X6y>ZFbR >}2`@Қ L*oX!]zBxST ݡ6d>^(o@a)kZ05ĉ7M`ܧjƂbyŕ͆ƪ^@[V;45vTA"U ^(oG .pŐTA)QƿWQ0)hsPJ 7q`5X ٔw? @ Da _?8LWXZo6!t+Aԋr SPSme!|ŬZ{ǹӏs{(.UtkF ǥ &VJZoxbnX^Lr]xiV4[BlyMA6X"&}Y*CZH]Y6Cs%' UO^ͨ&Mp[Zt|!mںuYWx~c,^_.p tppI%Y j1d~"f<ߚ}  AA@8mT o.a"{6̟^Kqng h9[/K0mDQMޖTq]o;n2` 2Kc4ai DV&=uIkuVȦˣC7yNxkbԊsdap~"@%%s^AՊU;7EXOZՌ0_#]ɬIىغ"|>@Z(ܹ 9w{ fT(12HvP.D!)0N$d_%M`f" V뒲B>?d-MZl("" b Q6 Ui+M~=ĀG?'05?&?|q/H83YƣKnڂhL#KVlUm ?F  e{vojxHh+.%XC:Aq뀁yG9ݱfHYUf; 0}$I"Ұ@T2DwqݙNo'V)>*|>!ӁZ0o:Xbm]2~aH؇:i-`Z=)nFU-g9?jN/m0m8Q7;`$(ΌL{h}@Z7T[c/ PM9l֡<>?n/22sLow gjycfxb1?UK 9 #6ڷeUe* &F|vx5eʂ%+樣t6kHhYC |,45%a($JVEz_'+Sɸ.5aTgܒh7M$s@O6 $l`쾲]h%HjilSp~pؾs>2?o`:yqyxmܱ֮2 3R %q+QAm~UVŹK5}n5>^n҇Qqqǹ mځ hc00%- S@fqlEoŸ;rv Djo1:1qF؇ܷc*]Wwxȡ3u4;ܛfKIڸ#f,:>;b,i+Uh/M?4vMpٳq uw8V]KG05&v!~YvbKlyaᆾEK?چvyP5dج˚Dg dOKul"F,@0Abjo=*z+C6()FsPmAzu"T/X8dmxU@ vljD$:V`hB=agϊoIXѸ4Eq6{EC9#Sį=޲HLw?g#&?'åo )\pa7[4;}1µvs+`J:&Eh6Szkn"G. U^CM;)#C %؃"N@mcbPMO9] OztՄ f@\l-р|hUtLsDCX :QT18҂ e2nn*6ۍ^7 Xɖl}E1En~mbe#a}z!@OB@~+"MMEN/ݰ:0p8~EUU,Uй5] .yzi.JH@:"85 :$ɫ[(n'ؙ Le{LIL|@,4DNp:* `U SUGŚ ›h>0.X)M- xr'@ڀ4\R7g+Eǹr65IպQF@h7\S R%قx\Vڠm)@(@ T@4[Vnu#\zCl?xԎ'p۞)3tQAz )"Z!;zqZgҼINXٚaaD&E1Η{~'aG5^??<izRMrSx".JO:UB Dټ]- mV} p-Jž_('c):c $^vx˂I(=tXu{++p+kN*`5VnIcN7VFNhXjCA41\0k E͸8$Tlt,YMqc`$js7A0%-͵"E,[$v +֡Q7X(ۻ MjkaV`+jJ4$UK ;~'9Az'W4bCaRu: -d5) p h8PT} tu=>W{2ߣ]DLU U T9O͕kpz^5_th)xDZQlޓfQXtGwB*FR4v6Y]gF ft0iCJO E-ʏbnRgxH+5\iZT.G K7Yl[X&!u@dy8a.[x"- 've6e#u0E &˽S|x~`W5 jk)c&ԪLS% 3-I)Q{]#4tV4T45pբ^ N+|8$?i$diA'־2 ~0|}ےvПShF- 02%IjXk{H++P0v1NW{(DZ iFf6to ̒XuBb}XLVaK VJ!1F\W  (,Rj3!+TN. w(Z8SQ&2:60]*Uw7 d;&4:.=e:}Ty (Ÿߞoēw>,$$9D4yfK 1hN"v@Qt=6b阾n֚4Й :alP ̀xh8"lS%)!?ET:^em&j Whvs h/apF8~9V=RX!rFUYQ¬&?=Sgt돦"L¤vhƞdTـ*(ฮ:hV.c@Qښ8KFm߭ A.W4eTz7h0$*J%OL= r @<n߼tC}h8R.܅*L :4UbHkE$"ɨ;/"@tjnVS\.{ WBQ3 !7uR&P|Z>$#@G]Qaw$% b;LF'up]Wǯ*b0N!80 "o>V.=ߜ?3FNu$E " 0i"#eݣ+WǗ̜"Nq>O>NbW1wS n/h]ki4jD}?!&9uKO7 ('8’2хxge nTlN[A'EQˬbV"a 6bʊ^?ʛxB 4YFWn,dOt牿AQ~2n AfsܰsOlKX?Gc.Yzn^LV85c؟^ iQ+W.P|"Sӄ!WvB1`( [/ *K >le\a@h|(>-\9ݧ=qٿr¸ |t|A¯8DLL#_O2as4O۷yn@6ԘDYIu0 q"ӷR+ mQ[w`|kM* "p${'SRW Df;I UUT1-4 (n-Ta0>\z2Se65~!?,*_;DBiЕ\;5' lB>RBqx= Lz­;lA1t&pv(Lٺ\le!’_qf3xwuu,`wz`ꯡc7+tPֽ A3oR:=8 ǟuP' 'w~$(]#SghZ%-=24K:B\;!K%J+(s pjnvAlv v>t$gI;dtb 1XLQUa@b 3 㜍@KUPC?k krqS} okF7żZ'Vt DG>~o*PP:&WzL@!%kr>wI#JbI! D)Dqt\HL|ܢZSiEEtM`qpf Aʹ 6 ]mp'kB]:ԩ: USbGXK|U3hE0|iߧ B7_F K<`-s=4L)dbQd0ςȤ)W=iG`{h ĮFc,5sNxb8C>4 v~(jJWT*eg,CΖ M P` '¥HEf8?Xh:B&A+KqDgX"!YqеST`!R +uri@Q6IZAa҆JSH5Qp ^y hI_ Ao+v Q=1Vόqv*(=[<P;ȕ >@! #"٘": |}h++y0dvh #ؘ{eEՁzbq;DR85i2/۹t08N}Iko?o;^.X_;N`Ut{8JQК((( iHRNIRh E1UE(-@>qm n@S~QTQUo|\ELn*5u5VN<>-ML\$4M:HPWHE Xs4_/"S4z>!=Lc:CHM w Yh) '}3`c[(*Ll?ӡ̍.4~1,N{=RءY(j lM?$DEq&8%͍1hg_O Yc;=nuBwtx%"<.O:i*g nL }X/'I 2@tB2 Y,UߠېЁ>qh8?_EЛ"æΊX??A[$(%ҍJk;e`Q&X]:d*BVm5#!xp>@Z#d <cj@?! vmC`o9ZP)aVӨ@DHYxyi[4ZEi+Io0gd¢;Pu Z,a/D%%?wphF2 WW!PAheTvY3˒"0k|M|J%ᦙNIvJQ`C_8[cʄpf>p~ᎸȬiP< `sbsQł)4-Hт_6D@6rINo5T: E`ue-8p=l2+j@@ d H٣ÀWAr#5,ʺ!*;HlMWߓwG4nݻjZC6>q IHۖrO+`1P6S% ݪ@k@VfÿjLRǯ:.:#\JM|cxL 43!S>YXdi}FR]D} p )q]/#6o`l(uÆp~ іЩ eD2mU+K81g^k@"LWh&( pnjC`UB7֟bP4 @baR?d.Q >qd z7`mtاuFĂ#d*$GRb CZD,E[xCOh+S5-PRf8M-?߬lqK_k[C:f &$S Fȋz2ʼnj ޝ{t#AğcBڑ̥I2\*fpڏ:>pc?1~9g=~&U7Ge*(JvĘ:ŏůwoWl4(JjdKD"c3v 3ڹcC5W$ᡠUJ%kp"+ Ei&ܚ)@ $P@6eꏘVf%Ģ!A#E_n#;0߈uA@VLjo6~ˎtw%odE4_ZFmEH-`jx B.>a[,F,:fs"Uь>bl AICHl *pSx! PK erzqo)cE)L,QmF@) iTٍ*g.|>7De =?ܛ0, Q ܔX)ދ$-4Hf ,j&I<~BEXЇ@A ֵ(fpswR 4, &AE K.UPvut zab+Y@QiM14ɀ]wr`"aʠ6n<TO52}ৱ= v6 Su&z7ݽCӣg`{D = A*Mj Azf> v"40j$$Q4:D7HYLOB /U~sxܑwYR"^M2Ek,`T "n4^agakb[Jt57*M ÿkM7q( Hl&zchwB,7REP`v}xq^)@5 uNœ,kMnNqD/ L ďQV P6vŶ-T4G ! :똯諸Qwk6CY_ 7$pz{uBb%yt?lQ.|s7H5NGQ(9כz"m}LEz;H:g&tܻ1E0`Nh2A{7_7EA+Ro.<-;L6\L]ߒ`z= CHXd > U o@4BC,N)lrH c`K8iZiXqM#X6 CHF£h,Ne/?/c< g gZ*G~~\EQX:" SuPJgd,KO3piiDu@3i LP' ,d?Fx=$*.ss#^.+hdm(AԇՓ kgۖMkBDE2ImY3|fT p-g?X\Z[ 3‚0nA3bZP=Tlꪽq*dGx  4.&Ɯn4`V.K6/wʯ'ՃQjۤb~= @fF9J2zU&- D S-FIr}IucmiQ:Ssd`z^AuxC;d:;3o/f@\/iHػ6yRMkH] ,z1')#< o.C a~o `~,(E?b=hs=4n> ,Yl𺔊xww[b7}u ڍSG1{۾Ơ;ƥk}yHh`2G{}oMa #TڭF .`  YO$FcY0RiB?ɾjPdiؽZbz_p^qNvNEbBJyW'gRII8ACIT45CbvQQG)oZyG$ún5_/ytvmbZ!K|o?t91Hh!lɴ@Oe^*M60H{*h($ FU($X"3 xoF N:Os^~a t~>c1kN8a]Sq&%&Kp@.kzU%=yvQͅ@>_Rk>kve{u;ȁ6Tcw4&T&b -!m#<]&(0DZSad`Cd:i >&1z?ͬjqC>NG!d\]vGjٱGkF9"Ue54\䵋'ü _0?\qyE4"A.`1 F47Q)!>`Qo+d11@q]w1'E* ؛=Z0t@qE45t&|AN>`'`ܡ֤ڐ٫RQU,"GَyyIaU˜B!>浀":b<֠[nQ܉wl.SbjTBДnŁaCUPPĊ`Jp!yGn.e)_\Sn2d,).veqŮG6f ȆEq č Mi4 2(,"lEfSh F/-%bӛ)|5@ڠm ץqOy P1{vT%)/Xo0](HBI-l)&j0Y (c@H=+R%~L4Ϳ]cV*:>>})}=։Ge !`͉Uhm1uO>6cN Jl dVuf:|/qrsE>3L: HF9`NOlup"-|:ԑHY}6Jl @q;,2(laCIPUo[ɧYXmF4]zN)L1IWa]!&d*J*õuySw BTʟo &gP9f:ʌ\!<37PA{"(٧Hv!(v9R:h9\zpm h :2l3`]`1cS7)\TuYa.'BZ :f{ 2u ؉>( p1`0 (ѭ?|B};Q¿|e",~0>6ȗ;s o>5v I@VK>mayavi-4.5.0/docs/source/mayavi/generated_images/example_mri.jpg0000644000076500000240000013756212747716313025450 0ustar prabhustaff00000000000000JFIFC     C  p"  z%ZWx.zGmxv~h~k?yY&.1Ҵ3#nN:zcּԛV@{Kscɫ*{d۵.Š>7rYޒZsZ@~~hc@@wa]z.خ%ƃ`DzZGu*-8-=\%֧͢YgLuοnu3h~βQ݌׻@7\o^C|]u&mQՕs3wwڪ 08= QYfkV8VVmr ּy u^G]n:nkI-lkKuޘ_=|*\F9f  0#/xѳ]Wxfrqw`}۵›=U׸xfޖaІ-r,*2atG)}zY̚c'ioT+҉BӠ/[bn>Zq}b8W]V}Mj ϩ'zU N8ʩARnU'Fŝ]EQsm_K=\NiWyى ͸TgZUg=[3U60:Y{jnOPBuph=uWo*5X1MOV}-gcBqIĹ+mʆnS^~F(vFJd|x:]tzeoZů?ѱ#okY D2iKZ82 =_8,0K!7.Tl[|0iC?'On/`̛>ξ/R*Dz~ TVQy!nZU8vɘOSlcosvs.}7dceK~!ߜѧBְ9r=[3ч>ٺ2֧7yDH<5v<]# MuI>D\{Tjxh4vkUVmg~qf{[KUU(YhsԼ, 1V|{\ЬU?ɹi 1huutcr"?.5K4Cnݷ VNPuܵAvx+(Km RV׶KUMEmaBV;͌STnAS6*ה㨎nP]:hk:LQkTi]*}%ٽك?iub,SMXXv;~{/,Xr]N]35BAh>3+Wg_մwif BwMqqV\*rEC^̎ V?2T?*/ʔ~NU5j+j+),ٍ4[kb\ c]{6'SM? Mb;=~CYAܯ?c4rءbxPJ (^*F1[! rb̿,Z2X`Ì3`5b`-q2H+ dr+ELr~eG/Gl"ݵfcأC3jz2oXO_mk7j Tv zJ J֥n(ڒbm-:ϗ]TNUjB,*5;K{kkm:lПR24bهfY{NGBOϗ1*H"xkBi KC̔ՔuءchOB󳵙m{WI*7찄Kq$}5<')%%={05@nJ&+@InRdF")Yli9 J5]i)Fh / ()( cP N[0 OT҂i:pr+/ג#2sM1ʤ@8M ddNP.A9Nk0~*7 S PDԥ5#y'&Y cSB$EVxR) ҟ0!>3c ۺMI_׋F券En.~]F|%f%&>[<[[,Bbڔ¤YldZx RaXlKng3W]!-\4[v:ߣhGtg&99yd)TahYWJ6ۧa|鹋vǍ`9{Dy@؜fʷ sLң8y̲8N<޸aE +{5k}Xc M``4p2Jx~\+YS)n<bKQ)J;++͊/ $q0SK.9پP3t4`, s]2bY!12&66LQiuc81s,͊m8 ;$ P d٩Z/h3 ȩNb~ʌj*NvjkZ#VT#R|N ͇r61+u"**ƥ2PxWLCN\aw&/b魳Afc5%.l/ӓBw_@[Y5sߡvPگk1Oa6Xau;{mMkc5Z{k^P\A=9CYP;8vK*!<J9F\,9< (%aӎw%t)+֯׷FDV>m%}&]^[Ufٵg{v5]V&DbHolPsg#lEWRt4 l*͌0Y; 21RWxS{6E5eɱrKbfr\2ǁ/~I ⛒&|X1v@v5C\mw_[a{iz[C[g>?=;WA^٪OҿH|>,}_V׆-] 4 gEi]a1AX c%N40@Rq|f-ȅS/ " @ŨC..Qo87#Atzj(+]nv.⎝ u5ʾa+=x_۟EB5NwبeR1T]eʢPRf_2HL R;ye]&ḿqvmZ޾X*PoBg3P@j,5% <%iV-bGSU }@ԯConKx"1kmÎ:ʗh?L[A+\4\eKz?ugu}QqOb ԦZOeebʠ`c&#=JU)o'0F`.jf3fKe''߉yݭg.4(o*o\齽§om:y57UE*V%vٶG' ôљZXyg'UL?_SB)~f;t]c7w;Ebܵ H\=٠ TDZHҭU\nVF S ,M++|j޺hFH,xӒj8YU-M bU7W,vMr,k4@]Ө+/hι&ftQP[ Pܰ(PF{5u/iQYWڀ@i'$>` g~XDKAmgMsgTQɤtBS#<^UWg6@L^+iU@6r9ǔA{.l Z]DUk?HֽٻUDj9mA3jWyLz*ncY,v- ׋'LQkCîŪC 2dHj0G,M u|G1,Qj81:շT{ ,0E JV^G\<=ԅĖ-m}pׂ7!&A}ZzS<{Y 3W9VUM2ZҴ2שvS5NM^XV /7ڎwSvuj _eڄh@i ijK.V/% ;%{ǭۍܷDxHbUyF83?9 c0njf\ylZք3.1U`)aַJsw.=/:Z>u fRK.QSVk rlcњ埂Hė#30&;:ltE455c3Keq6=q%H7=m8jv]/ȹ_ݭ1vCr׍EzcD &M?E7;JWHD]c<Xa&hf< s1?'4?٨>bt6DI"-Y}\F2 Ery^BXc|3(K%z ~,8Yux^qmQuiib L\>|b8ӓ)&\akzH1b=Wg,wNNƹ۳tͩ3cګ#[ Y]%z{xǞ<>a9BgLG2rUyr!GFcG\? >9FUw֜j1<&;j[I^ܽM L/6&NALbzWԼy/oYG8xCAKTG>zK8f99y2'Q)ct,qJ %pxyӆ v\.[3vU ksk"``0xPK%Q% J9e8c8 >8%Ĺ%Xˎ`yˌpc1L~L]OvȔ{p>4}waMk)[ 2qdfYĹ,ω99 y (nGr J9Ñ2K,;UG{9IJ%1ˇV{Nq6!1 "0AQ#@Ba2RCqr?UB OIM&mHjOVzç:SLj-_Ӂ_?;>c:,*ȈÞջK4ަk%,f%lL.3#d'p}XU RmlexVfjBx<?YsxWdJ.Xυ>f eKb+5=L4ivI3925DpɈ"l[WTʊsxb퀐xmfpq (8ٽJ{]fTǒkb%xoVfzK5 ={ 6/o]_Ĥؚ߯QD跕>үV6 BN1) %wq4hBfk#ٹ@8ϼcĮ)(=I%*z^kG(lA[KRw/iNLu\@J%'Mwak+ooӟ5Z 47?iWQIz;Vy;K-Н}m቎I~e0fXϳƫTdk}GeQX͞>G?d\n;޶ܧvvuvS^־38meӸˑͧ)h>ƯBiiSj{^ZǻI_p?,j_Oon1 3.‚jkvsXy̿e;syL=FLPycJY]}Lx/O4fVp'`b}M9}e~Hb0%U ,mS^~f~?Qfَs "uPUm)^huA_ 1GH0" A[Jr3y1]wcԩݙxȊ G dFUq+*9X*9ݘ}b\}b{a!Lj !9n4Z{UeȬr"jGA}dM~f垖MU񙾄6DwwA19d 0u ;M2|f&xq0#$ek)D;L>Q~D6}ra=! (XhV>MFz7.0q12g0 z@`3֖uҼbw&!,i`<J !1"AQ2aq#B $3R0b@CS%Prs4`?H(, c|Sl,kyLaOq5;9Ma|p 䦫fT)# Z2nζh8,+zJݑ"M)6l&H\wގr[G=.P;2fҝMSapI_uK&m5͂?}!dv"_0K}i#[Uٜђ{$pRfbh '8m.G蝶6ԬkCO{xSP8[q7F.,81k{ruڵD,ptDFڬtۀ ?{c}ٞ۫nځi~Lew;1Җhq8ud}ۥqGd~221.!*asr2uToc/ _kdiqQ3ykq_ò4 Rcsa7}Jm6n$wrFN} -vV:[o'ٲ[E+Bh8ØGiЗ6ֽ8(}m?K?@\A< 5SIa}FQ_)vl#%lfQݔGB8sHepwՅ䄬zt~'9>:_W,h|| k\8IOq招),tB.Qf@ivm* jx:}dcWZ㯿SnĪwrbokzv~U Wfj0Nw75FHe-pg))dYB IEH7s ܉tW\aG,Pm`{K=@O[,# G5,|]GY =;X @K,u=Oߪ}|̒g7hN,9{"%F͑?m))m~=Pd QEN@K3>k{KR }}Bo'x12x6+g#r4pt lѵb^v : u=/H)* 0}U7z~:*YjYoshcPZH7FPc~!<h 7$:NYѹ 1qw,Hg[o& c>=)qa}i(v ==E5Tg. V3_eԁ8 V-sM#O7eI'' mHY,ǗE.q%۪fLXÈ孵91zWaK$\4q'oӪ lM=v#Z~Y8 ﳐ3,lxG,Q9c4q5x]n+.5?!6η)ռGN-Ie-&M -+a|kw6l6ɐ_6*bk;llNEP܀sx4ca>*GnGK6䛷h7kÄǺ,)5Hïb2NWz$kC$=eY + ` MS.x|lBeÉWHrc&XM:78}X/Eg}槲B$s"4кز6@.dV꫽s]Yoz,}1 `x3=t uK\k7?}gbY'/U,t/n_4VnXpYdЬ b&܊P봦D̤{d?fX['͹2@<S+uXFm6r0QS6JxcZKF+roP1;Cae{ ^kZkC5b|?miۼ o"sM07g]nE9܈Wp4*`I W9\(_B'+E{ȑ ͩGl8U J~O?n9q?HTT_$))c6̰ jlF(#DĽ5y_Sl9هTQHLO|6 mSb;xnω.v6X]K7X$MJV' #ᾪ{Ot`fe4{ʒ 1?VG=\gumEK Ϯi>\etrϐ b M>ncycuvX߼b'xiBh͒wXd<42qTјo2vw03/x|ofe~t͘tm4׶zNu`܅?Q*vX4fU=tui6c?V[{Y軶F| Um,P`wi,.'\|>iì֜O6{ЉYr376X@:@z Vb,֨UPș}N.{Y:m9-c&3.ͳ(P#3M;})[we39 Hj1=ZOIb$enǨmЀXah[xo³跑ǨOP>kL[A`N5MHauQ p{#5k{w/$4T5cNYU_\GC%~CoGhsցhX/S'Xaiu?qCےr2<B^ +maܒa^Y+#4jINV=qd׆+}13cBem %%ǐ TϊU.nⷐGof G $u^bԮ7]I3eW,m "-dpBs[-i *#27G9˵*>@o<-7R [ksȄݙvid]}|h]4Q]a·3,nb-*÷ge|#Nai#k[ .t.h N2p ۡV/-֕3Y4Jii{n"л%~=!hP,ڴq6f3U`ir5tɛ~oruu\%^]Œ+FxcnWwZܲ /( ⌘p\4@APuvEZsV?{%7o$nVnNWa)6 9J DQ[o/5I c{-V)X2\,M{BA~i9"C{dr%6?*u7j+8wcanXZ>Be}К8t™|'ܲj䵖MXzz&3#+4h#p;&3| V q48_t\B\!oE귙S tUzWcd4m݆Zpjyݹ Nڴ8E÷~#hSᲷ3kwV vt M\>vi?>'MP0 |FT -^WWrUZ%',K`Oeת\0_uDh椇槆-ƾJ24XNX16G ֶK)e}$%**H}mk&I dZv`GXQ ~٩ţew\G Ko?qR,ydX.o5bY]!d1;PD=u"-X6@2[5i(Pvȷuش[O\MˠF(AM{bpBW%@'ya2ݦ)ssɺM2HI'N)BrILMiCꌮ r([G8҃ehw7 ŪӞR1ÏdVnce4X<AO-C[<%n4sX-a½ZZYa\1ybUV755w_.L-r8en3]%\u{+I.+]Oo;aWcvhU]&x8|qdQO[IjLW:1-%<JsԠ|BY޸_r l.Kab+5f7Wsu>8BTNvkZn^=}v̩oY흱䬐cu*y([3'R#l|_~ITGҮlPCPs >(6{ r}s?mӦtk0T >:(w,`dn:nv1S] fvep??6M eq} {F3,> d- NMX#vⷿ4O.탼54185R>q&ʹxߑX7qޠ8.z{u,E[ X;E&U5ENl8pHNy.ؕ֙lΜSC[9dU;N>cCˢ>je41ms)vGoּ{/ʓm?E^j&e<8_k6'?O.̣ANXO'3d얹vmS{+x#$vk$C .X wex܉ĚH/Y;)]aB Ntm &&-W[=-W>+|asV|Wc쭾^Īkٽ:gӭUFvR3p}gNs ^p[{(m-j(] N֎k^.gޡuDO|3ɗf?>ʨ ,iP^[.fooIcSP Qisyk"67#5O& ]4x2A:)=> QK8[vW?A36>u;T~3aÊxHLx4U@)5g2_EU?L+/$[h :vN*@szܠǎQkWBϾ4 en2YN,5(ϻu+|#QS+ExZGQ&h w 9,ʲG4]-㐁`Q"q~kh#_Um3O-7)[N*q֬ QwUTqոz0wm/kkt8>.K{_8N,S%KW+YϮ`6il`ɣF]TU0)lsz}sAɃmRI'~:S$1f6eem)X7iЬʤ]g?9⥓?-s#. P9M6ս!5H䃜WWBx)vn0c?o5Mg:yN=C{`}[2*as~+ҝ;̯vο '\%`ÚuEQf6JnȁQd!,|FqHCg=ڒQ 4jVFo%o$@Y:ZyD~+Jh{L:LpԿ $\lD:ދ+ۇQͼ{i!woGfm{xsijj uc` ]Y hH͜=#Ԯ۵/( ټ춏4"9jK"{ŨݳYI=%kaLd{q 59|W^0͒+|;.kh!?fWCPR:,P-԰K"Ჳ Iv)ZԳ'ȏ*zXz4'1eN;K h` ;u4vgI\^ ݷYdWhuWlƲ?Q٬nt?>so m9ZyͨlOtDCB531[> qa<АN䌕um])$k`25lRZ,0 GɎyE|nw_5lv=ے;64:퍣+V"/gUlN_<׷H[$w9,-B;Eēr璫c6 6CtlYo&!E4.1`+~rΙ-e4c _ihlVFi64;2e%{'Ee'f.u;0jb`hURu8e&/Q0e -4L rz}ӑJ/M-u 8O]cc;4 O>r^۳xO4RE/R#CGma2UHϺ"wi !2*ݒZllU͏ dzdiWnkw^*=}jev2XikቮQ=BO/Cэ+!sϢ$Yod! pܓmꯅ&k%o n)b~az,qcV1Ġ##ĕԡU++tZ/rrM0S]l28`k&y<- ѴpyI2퉭"Ѻɴ:0=Q8 t[{@ݪmWQBhk[,Ln VXeo حN\6 Ghms&sOҶΧq c,QjG.C_d/j.e<[_^MmlG&k2AXh[?$ډxu+}-`{bt٨sc^V|8lB %qպ#ٶI.쾳X7Чᅧ24HSQF+)u7갭2D4Pw09JǼihY'l-9jОz-CG y* h.ՋX*ZZWprZT:sXdijV/l۟%ݽá 鲿 vOjxe؍Vng4Sc@+=m6o!rjGJFȘs.?j_YG}5? K-zItMpcyWu=C=^Nj:-)Hmx5452fuD:#JnZktڶmXY/><3~OpFM [Q: p}pH\Xuֿ&~ܹW`˪[K6nng;>3`mhӱټ՚tDuX]V>R2xwOU-vu(i8>k-e\h?1 )_O}SkH+Cd<E0XrcjϐFyH{9FsYA_k Z<չn%!v{ORYetRb`7gՖAN{Q jm"<4,8Ȳmloo*&a<Eı[8^<-/!F/摠G-kED.p6 q}%@iaesYfJdjWyYZN gݾ^( Gy}Tc;T~l g[oMTm"f&d6ٞfK/j>䛶`{_fqy_GgW͗+}v)Ҋ#NN8{V綞+eiZAj.-Ug%9pu+ A\X|\!G"ZJ]=}@كm]v>M̒jfUl`x>c?ĖM?h;T@ ĀpNq88xXPpef?[Gf9'I<$k~9avDZ%ˀk惯u+էɒ[_yx*xIIoOݑ0|< Ow.WZvlsk;>7/z7nbg6I 0yIsNކ7@T׃Uy"k3n&JV?GV-&[2{]X˕`Ǣʶwe{2kX1bcwW}2⌕콍ianv436T[O+!1AQaq 0@P`?!GjKr(kCWb X5)Tm F.=c sղHݣl&(qK SaYiѣv8E)>;Ymt:R;qoM⾳hWiY wnX7V(MJI:G;#@rӣJ=R؁Wg\j̓7\%)lݥLmmQ gx܇VN%fR$-!LoV~ 9-xhZUf6 [؉R?6:̓\7kſD%H5:tmm`K,jҳqBU=⥜)bb!rݯ,MFspS-uZ/tTU2pjY/aFNNv"յ]FH?< -P(<ƀ9eNj2bL ߃&cÑ&V^+~N:xۇcf۫)ሢ0Z&ec#y#c ˵E9K)M_~SW_k:-oa#<( }C}ۗ+xl L`}Jrkj~&f\Տ8/XUC:ΑTXi%{Q=@] ;4r(¶FHrMA0Ȝ :!7vCc阋r3(hɐVcfphªaaJqf7 x#U3U'\^P[/sTd_ty ~혡a<ϥW[ W(%]~  ΖN s9(kx*D]Yf㋙:yK}Lx 0Sʐr"y+ï1/17Ϙȡ21 Og PfT+lTᇵ<-te3N:{+|% %A* iͯYtb\BrQYxzf* 0jXlJ]|<'Nr:H2.&2R؏ uC\3n]&E"y9fE*0r2Y..%3n샚<:ye0䘩ABF{8$P#@iݘh?c.F8ҋw{i]q.U\46>=^wҿ=;Nc@qs:W13xAai( CZqQՋ6ѡ.R֋k* 66kcyg?0 ef+JiVQGĹ]YtG> FU;ܱ ߫{Qy=Ɩ j0c tKib.i޹*8nmG/HPZb`~A-'\4 8]nmg;跉]g^KtzdwJn)3jm9t%i7B+xc<¥ɀt .PAg?X3Ą--ae&hTLp]]lٝ_"a&Ư>Mx}:LX!y+k0nsO#ʾuAiYo:%h[Qr2m︻i!25éJ [޶B{TZmj]&"SFM-n@@)!('S m 9NئNB3k)ľy|9_X]6qUq8Sq:-x.˲mvv|VTyOԻ"ƆoMVI'ˆ\(-ƚ~ ~ulosC T1nͫ f.R8K!`x8Z6)ƼLTEoC*K4=rχu2᫧p]CIp)峎; }CBN` E*N,[ g{>6Zw1={"K]ۤ;K_~ag+Sf Df CsD\r~Pe(P09P4 ؾr, j-zQ QܫZa7K"IL:'phQ"饂kP՝%.!m]˶rE2Y}Y@UXlje~h Z&Lqqb[~W2r۠WAvz&R=xOD*lIνIԋp*Xz/J+Mxi~btw!UbmuEԪ׍"K#)G *t|R502oև|})z;uXy{4xV~凛n&IDcz¯gjg#=JJʷDC?K[[_@>PM[ ^#[sol@ID%P πg2:4A JI4_0Ofa7k,Můxn[_ıQz1m9p5$ )H`Sb!F+T•va.>s=fVΥo80v=\M6h "Sae\a:PmQ5 ,8l~s:%mo9bbωPq#0Kqs E_O zK?Co0vZtvN.`614pfQhWye݃ɦWܨcJ9(.6>S8 #%e_[_3n ,ΡcqP[X^HkxQ(PXo'G0=^r"jbʼnZ70)|j xۚ D%mtpj{[5F8evnR)bw)@.,ٙ`QM9dzlyEeEmNj_23*d_ln]#Qe(oQJƤbd1-",Zyƥ%\ݺP!6 ?:eG7/vZk(=;͂6[m~(4Gn>KSb'1=$\Jc5&2#WN.hiGV'jͶJ -ۜ3P0y H1mH%% q٩]8u.6Un^:˵r>uaP@/BԡGIJ"d1(1>#& B=4(i\L"*_;+:n.}CڗΧu" 6I`yYcLVRzrE(P!wkqš"65AVCN!=O#_Bn:tPxT.,p{q||@ʆuj oέbD9gݴ̠a}gQ&嗠pIe6S7蟻~hXk6@˕|2a&{e/5q )Eo.bU?r$ >7%52^7+meRQЀ9!))q: ǁ! |Gԧ5y&r;ĸΛ(c}[6p,,yc*\G³LxVq0'EMQ0GC"0^@W3\xU|q1igF2ZZI ,[Qcl[ª" SS+/]fC@8 qay6%FͶ+#,?/fv-wbocIp _*?CGOtoS7n̝C-N828 ozemRN:!]efE$_Ǩ㨸%my @n_ѡZ1*K)j61g NwHbGp&uZ|}`B8}6;y(~u+2qř`sѢm kOoJʄlJZ"h}&X=:l]15~AX@J7!>8ٕ˶{;bQ 3dFeYʠIHR> C(e]+ ~W5w]T' rY"GF^v>w9V0ڬ6l \39ڎn1]|P9qUGte"vb5.*B)뚴y`# !~!ApZ|eKoK!+7լP?N ++319V|_ROlY-\v:dqfAAF K%WJz捼_guUKG*c U`ĥ)^K[n^xpEisg%f eXۆ+ch@*:mmsk}P&. T/HLԽ&\Ӟ`ķW hČij*=m˜S_n}=JB+o6 {sDX[laAjJI9 *f 8ߙ\fs)RcrZBs4=KV p;1_w]uгĨ|1&֡.z mGWq?wM;91q ".19sn@s\D+OX; @e嵄PyÝEt-2%6#WpR>_˕4ii>jΌ_ 'q"~C(p)xzw^tN"]H6VjY.u-vq?f6:4P47Q :?[ ˿ܿƵ*Nyx=g6!%Q.z6ۀ~-|z^0uٍԽ/8_/5˞ޠNo͗+xso/'5Zu|12%bq]iΕ@,Jxi]ӳ-Pu!| _~.9]8tq#3%?DTz" BY?Nf5.e7 < RX@ݓO1F]WUPeoXY@MB5hyBCdZN^i(lJhL{D]kr@oAxWFBHUgX2jL7m,FRkgTfuMҟ]y#$s:4nlJ:kTa_`%B b>:svҭlQ?<j} "8vSdu8-%WSUw((!uN\z/QSEt='"Y>ޗ㉰i]AYjˬZmao #GE9^c{?0<}1oӾ<'W\4ޒtW&0tj?e/Sk"Gjd/K}kg^Ux32.T;6b B`vCU Szh5B !dpp0((Gq+Ik6*i)Q !U KKC[38`J`NE6H8L!0D'^YB˶afėe4l]xƎ -ATr:2:W0r8D5<q<7-x.d®VWpSaP྿tAiT%S(XfSL p͗e.)tedb۫@Nb &Q/Fٻ)lyE^Yz4rgmwqle/oM'RwJ'f {mBS0?+J棹0V''m;V2Kgl9WU`!˭B6 0bLܡYL0*Akȫ Ũ:s7G_/.>$2_at%FmįSq[P!\qFL͕Uj*U4z}ҍׇ)i(^6qV} i  AȞ";է>Y{1ERbA/'pS@ätk .?q+peQ:ǘm4>5,BLS(dka#:" D#о#C,b}D UBAf M ~3r`FdzË, @?) M09wM .+o$ T˛.'bhA+ykdԧ2&]nd& + 9o;Y ?z'\w[ 1I .0W$7593}cfG, c%T4.M%C:==sZrY1xxJD4 <\SjmU,q0,)uucSpxu3+g,^^FL7g6rWjR[qE6An,ȴĈ'ݹ O:{14ü?Hbq˾<&i,½nfL~I+UH+XrlAi0<@20DC2?S1`1J4Oƍ(cQ&i@9l,9M{UzU]xD4c~g"o8|V㽚ŏ )GgvY(5a ELDF-xw BWmf\H]93dBaHi/̶hU8 6[튷:xR.˙4m {0Z"@@ xU׿иc9_6g PeO <*CnxA _v^F8Oh2'q`7֘F.̖@0,)d LA~PØ&aA\88~H}\1O  z C "c  O8P @B088c"@,qL(PD !1a8c<Å,QO$}'яY*H⸵a[`:j;ߗ%*T I#Xo駑Psʍ5z W@ e&+L^5!ߓŪ^eT)&8hXZ'W?)!1AQ aq0@?:=O4&V8$@4B\t>Kf cot,Ye KALG cAGb%"xOT)dfMJ)^a33r:ˤ1R|B'`Ϭ1(<#p<%w9QeL:nP78L(2xA(.Ālу[J& 8 Pq!. Tjplz5 g5gO]U7 *'d%DiZ5 6!:R`hcϘ8uNƠmM+pЀٕFV4..d9B1Ei+' p&a PDhoo2*Z0eu-Hr:_ϏҾZkNb`Sf1V[}rj¨jR*b֡hG!ƥ.^efL3)Lq3#J+2Q34FS-0'KZ(!cSrcЌ *6,CPu)R|a.;nR0ه$;L_{sYĻZLGlaMC&s)!1AQaq 0@?;e/Zy•aQGVdãƠAYRq!<bc5LQ14%bhD;Fo"xks\p5Ӝ,- cJ'8?QtD~xELGw &c酱nNG!W 0-f9#lf"arm=}- yMxzWPRw-Ft,UD&$PAm;ZZ|>j.ۂ9~ː2_= Ogo_,'G4JPxV̼Au3yHB.ևmzme.5n b#L%5}>9bQr#ޑ]ٿ6íqÜ="ou78Q; fthbJ1h(Eyzrr{K\%V,ǜ(*_"Y `7Xk</&م9?>\74bo摓Q8=AlkӔJv߰0*w }ʞ"D2-"sZ+46bLl5O.QT4Z]#WSz7}(%=N9JۆS뜠5Zc 5[.`Y5%1^;DE"S?TT6d='+ h76:-*.B~YƵ8 ]#OEW G(1KV$;Lf(]'0QgR䂪!KxOc147êbak!d!:Wew#H+&f0#~zY6 jw OץHH 'xFT8 ۗQvu*^EP52-Uj h/(ǃhE*e)+Uԃr5c0lD4\5H% oZ1`6,;s0+TB%+4o]顨aӿ,@GO'8YTS8;ݻ6:_PO ?*Bb[H !Zqe%"li6]9M(9@+5<Dyu5z#xJ' gނ*% ֓X]K#& 7 غk2 &%PkKҢtIngS* xOі& K tӨ;LŃ"7 . Q h\_!FCtXj# V(W,cJU\g9tS|aZa,GY^xPz &D#-^@,` @aiK=fxyX$)`ݤm*˓:IzŮ>Wa~fv7x\V,\ c`y.74H㢧k➬tV7맒b6(V0KgO!1DZt9 hW<`ڇ*Tp"q'!qD A@(HпzqH8pB3(UAQRְģ 'k Q% ;X`(;h:)4K;7ȫ?MCxha씦tBx̚r"EYPؽ)q̋nTȾE-9cJN Cr`(Hs߬;IPT,!*BB($2п`SnT&jKߣD(Q/7cA`4+c!^`) c8uO-Lb17#xdƦZ\zJ9;i]Yt-:2:}pDi@/>ALS8cַzgߓ:@SrGM2MaƂ EB +P $!NJuv1S#6'<GF` v0ـutJ*.0l1IS gck"$#hHHbJIH q&WYLcQ: > ع\]M%:vxUjA^˄4?'9f|pu|[lGK5bҟSq.l6۔Sj_92B <C@A9iKP!҄Tu&}pp'J PA rM4@UAn)Muʫ'dmذV$ U(a2O gIU XW.! F" g1Qr Xȕl-µ) ; [ނۤw:S"M(D+<2Eޑ$prF'+RwCok}cRCh&5 ):= h=LkS>p hbm;x+<&yz1Rf\=P/;DqMm9>N*}kjxG;qWfluZ }+g]@5NWGAB^%BGfMɇ&0ÒԐ{HMe,9^ yhvgN^f5CxE:Wpp;sm(I| n/yNan3Q|:6F Y.VǨGD6"";uwaf fȉtSP̣~;s @YW-31@V+@Ѯ b0C-יT|O!8FC]% 3i9$8Xlj >eCۓ & 08>֯xT ]cgh9'H uָLj{:Z(;hj F">l&#FbS}D9:6%6l28Yrx]1ar4t =-Wi{܎7h hmPI4"ZK$i1Xx #& 7Ý?s-YkyICbʨ>4TZMu刻/~jHUQy#;y&;`͊%>ؾm/BqO9CaBH4Skhqư9i,wA QZ Mc7 3O:T:˒B&Qt\~Pj6}OѰt8PX>#gMq`"v/-A Jʰ)!©ZAS Ab>s0 <4M Gv@k򷟎0AM~ ƫ~KQz&,>8lo7YxRs"@_D[5< Sk=W`:XC%QK*Zp~ <=p.ec wz:BYc$ hPǬxh zjP|y&X@_8@J(%Yũh!~SS7G"!p(bk(oKb N pzC7" h ^N#[elK]<~yɜZ*^;YͮJa>9 [I yb4"P-uv-:BwwcFi8%")@ ࣀ4D#v~]~2ݖcyBjCyh٬eA Fط*/p D |O'alv ҁ@P57LdaUEJE]~.i&) 68 }%?=v7<prvZ΅G drIN=R{IIt .5x 6y, 񊒲tw~2%OQȒ n1n4B,'ta̩bPVrꯞznm_FưYvcTk&62 0PZ<()F*s0uxk - X xoK04  XV)|*jEQYbη tCWFbGr(< \p*^\/w(ކ2 T ]ba_$' w?lGºGX ZHP]];EJ/QoNg271e,{qj$(1El#F3H^ JlSP o&6w ťR9eXХF2qlq`Cк / naZwiT`dCu-]ڮ*:<V|o꒐h2Z #cmoJ,6:ft} .ȅڎ7zUjZizU_3f pԯi7=wBV$ɫrw/lMr=%t׮ *5óJ﹇Hzi[:WD]b.${ctvsA'AJ #&ނQbENbrGP4J(7E{H2(]BF1C^|B P@bΜp_v90DB JqPFwZAYBVLQB*;RXDB^TKk$m)p *)ƭRIj&)ۄBf"K \U\ Ynmu?mz{qBCGqR}UGo.* @ @8Tz-u~r8y{BZ!sE)0'*/x,̼v|Y<85TxX]oj*#aVBvFc`V9%g'8iM9{ICWDI5mzZ%JIdf+򫀘㠁8El'DaւbB ʓ‚'1)V_g [0e%5_I¯UXF % TyǬOxhPcG 1DzōbL^$X7<|9e 7ljp99Ƃ5Zg'F')/ 7o\[ʼn|/˽#KX$ږA*JibH,@"PuU(F))Mg2 &\eA{>nn;]x1 nyWc;;0*+PieW۔:m\N K2 Ƒ'A󭿌  1иUnj_]yp$? p0'9Cю4]}XuS/nYknȡ&ʶΊ?Lw_ '_NiWp.o PM!7BR-|DdFPū4x@<>s5k5AUYNhg)a5pJM'kb7' a `HK\CNO'yև1? فW#kt~r+7pJ p!$ `=k5?Kv=B<\2s+-K.)6i?n?1 9d.SSP &U MW~Ԫ#C,t9G?6HBpҨ1Ѩ jAЃf:\;ə%ʃOrG"0G_N0 ?oPNE!?~pcRe6!oYт]p >swrwpd@760+O?E®|,zk:>?wxxYȜ&%?|>#8YRw#?(%@;\'Ai!E*s`! !_/쇶R9`V}+1X&W(N_9 5p/pB۷(9;MLVOoXo4ceяzr!ׅ)6!9ëM?e0 yʤ $,h }`;kgd4(jVNpXITd 4Ԉ"4]K HMXX49`@@(=.3Ǔ)1;ldB~wJk3i]TFip>1#C̡WEa럃Çٿ-a|_9_R$I MrdP/я6۟^m13Wjjbo]!v`r*IuvʹCXaaƔȎjWyVd&%<:"1] &%j<`ѐ@ڞ~rB@dmJ^ qnՁ25ىC HR șh#Šh&#n^AS@aE/H,s~3-v1+L(rqo16ݟ#&Ic⯭DyCN=bmrCh}` u`]n7cUu'`~Õeʾю=uZcFVb!眻D[1$]N1] L36m7MZJdh>/n 8@V\(#JPPHBp ) & =tV2djT4;@KZF! 0p@:ZY91}]>؄[ VPF a kf(} /ybǑa~?#T#iK<Ăh&k3RN< cӆ SoʪP1#*|,zvwtkk%LU p=&yyr Z?>1jqINƱ0=8ːt.8U9`Ԓd(aXk64t2a:&չ0C < O:@.ּ\׌v;GyEM6@R4_y`vu1LpDDirV.Z/% HEJED@}lQo +%xvВ.e'"bЌ#Y7QZ9t'>cahC 7pd(O7sQ@<+x>[`CSw*ُy>3`8ǨNsFF?"4-tBw@<&HO84v\|mʰ}Vk43k56Vg D0++ q tdS~[f@qALnѳ9F!MZQŽ disr_\w]ҕ Y{f6kQ6S@FfXyF . :޷*AcIN2kWj9lk0QPUH|c^lihNG78X N_GuvU#q4ō+FiADY@"Wt[C@Fw@I%KUa6laS'o8}_vf<'Dlyt!9#]$(p] ߨpxJdCы]_X4Ɉ24]13e1f='ۍhʴV],2ӓ>UpiwQ&p[KxК*e aB%(:҄VMk ; w$PU{蒆!6<x ^ܼ#C爻4AEQt5TrdYñ;%(K]~#&COR146 9+7.Y̋A1Q"Qtq;k<$WNa4DBsCcǜd8fM ,$hh@7sNr*k~s4,K8Էr.h<>ve Uӫ?;͹.D  ǜ:foAY(8 ބ Casmľ(.,Itد[ìt">1ybc\2P&XESN߳n#7 Ix#r*OJ+7eYy.N5_@DGe;GĈVM% Ds]BW 3plJxrH;LgS%qmSf)V 8"jÛT?X56^#ΚIuX訲Yzs^Bbpu0iX+ xB Fy5fqAבC&0q)@AǁWy^ @hXq3@jL;!Xʈj;I+> l;E "tܓdc-kB R6ŮmA"J U&(F i糫I4G7&HSWXiwk4EyyKZɀxlhDXqh$2ƒǾ&VlkXT6=H'ͧ^(ATd0̥L`67$Mm,&$ڤn1kƪu(A[DE `jiJrftnGW꿈Y7Ȑ-AǤTv֠5[˹; 9` *fnP@ bBiB^Taqs'JWћR:4mMG2STL[ 2@jCMab0H@Z''%x{hH!z&x8gi6TrB`dY5@OPy|sŸ$D8c$@&Bi4:1ubR0*i)ګU!n4FEd Zm babٯ.f77"| c,,[vHOԁy2j_A4o˗""Oa-+U_էk}kIgw.`aO75.oa$Nwaf^IG=cU_Уtb5&Љ)o HJ F<yk3͓M4pyPVc>0ZZ%U_4S)P ,NϚVX(:Г#%)`S9RexWYߍx¶;KP\>sqJry )2^%|xI'MLQy%~Hm )B(A(.($AYm`wɭ`lo YDd83Tl&9ۄ@ f͓@MF lFeU'ҋ k 0C\䀿<{v7WCoZ#xsHXTYRG":4<)o(m[@.?"f"xNmfji qV_5ju &۴lm<ֽYp=/^ nd%\z9!12vkMg~pcxjR##6*Mb'рxP!5kA7]9<%m mlI3uG=P"(EDWHLEF 2%Ip1aZ.j"εFOln3qyrΡbbe@F(af4!QZ&]`C8CUIϥʒ֏XHS 6yBJ+waN+CQ Yl* $e 9sm@%1 U a@ ^JH4?l͗rT]rTRcϬ 7R֯f0o7 Dsaʃ 4tR*~tNˆZU,{h^\+|P6[)[~19P (@VHKЕ4N lSs"u"_W{ swu S {et(9@)-&P,#4v{SjǙ008xqsGCÏH. PL<Y6?&"Ww]mn vyY5R !uW. %]tlA+#cCwx a עyM'Iӏ}r]O@GMF1BXTd兰sh^+` joRlwh=w-+zMeG3N|ko 7b%J6cA))=8Js '/CY 0th sx>ܴ/\SV F6H )s0eP7+e½[$xG =ƈh"kQBd gZli(vX ]T@nL6 *ZqȕlEv=c r4p_t%F`` 6Zpͧ;G:8pIJ YB\pDAG-hNC/B9qvvHAgcᩧe ۀ:& bq`a4|AQJ&@@lծQg .1b'օDMe4tY j…8~Zw%&f L6(CB0Ýh9v.E Ky2G`1CG qS dƜz @BovJ,޸qA8OG[Oxv p7`,\U/\J?[vdkL)ٺOd繅^ڜ B`ey)iԄUÞS((b D*:#CiRM'\7%'@Tޣ%vY8r T#hϞiz+8V% [g*dxzLHoxaHM p^eg2xX?H&ě 8LFx\ tV?90M?mayavi-4.5.0/docs/source/mayavi/generated_images/example_plotting_many_lines.jpg0000644000076500000240000017417312747716313030736 0ustar prabhustaff00000000000000JFIFC     C  p"   tHS!>BNeOsy'ElVVqaR*zzZj4 {e҈ +K/=onu!B?2(\fh^PM[z[>+mҧew`2䓵}DŽG횈9s9K'yz>"0 w1tʮhé,6P A`ZecXKȳW8j'~{IuExzGJ9du+OBGY6èu!&62KիEC-WXYywsTVK^{;O@sn綞\V9i1f#T|C<_;&d3MesFϯ (-ʣhQ͢1Pпt{)[5t 6V'/Z5f]6/~J{t§\;{5 W9 ?Ciٶv8YQWd=\&^qΑͱX-2| MAN%ffs.je-} 5֑W>W/vf,}zl^}(u,ݒ;kSy.; /p~}t9^)zhѶH]h6 rRf2@nM,&?=n[HgO^$Lj8uYMnϴlǞva_7ltOPɬ3Io{{~˔s^Ü $~txVR^*_ļG!4<{6]MjYȮojd-L(p?H)^겳Aff_3Y?ϳgZK?ųr84]eČ+·MQ\jyfB*hht̐r}΅:keIU.Z)Y89!bqw}[SzGggT{4m >FtKFq^c=ڵʱT*MBĜѴRZ/>vb)Gڴ9C!~}CKOu5!+a7gPc7_nyW慸ǻsE La6G9ÜaϖR?c~'ʱnER5W#ZJݎggϺFzZEeaefGEz|ꭉەX9Wuz;u7#xELIGl9WkYV?YZO쮫1!,D@s o4]_ "mVm~h5S3k|`mSy&}wZ%D\ͦn|*3qQvξ`nT܃s1CC6gR퐎و2Ÿa߹;óN,ۜ[]T~."f dtߗH[ӑj{ɹl22@"رuj1q4}\-Aq|qnF {`f"Ȯt'\|yU\=\/+Zaɬ)Vh5\yxfәыlQμ2Z%iV|򪿶~ڊaS:l:R,HNj1v״sĤ4|7s(ڨy"tWRc@@_3V8tWY.hTW[Q VMDW*8!"#$4@ %0125P&3C6ABET{=WęVZ%O{]VxS 2%[t3MʞL63)C4( 1Kݨ |j+Zd1bus5wr-U 6Lj*TiLHJVeD4jUI2CeO%r݈99TH´O7"SCȱ֛m{p dĦnwLhxZnW#r+ Q$*:.YXp)W2›eKN؅ Q$Uvc9@[/C B0z-qJ wC<Q[NPq9<\mC>t畧N*,uq8*NkѕGF8Ya;FjjߵbM~t## \Ƈ#Mcd8 T)&DGHZk#!Kd쌈3ojbTvFW,2'TCUHfiFC{ > ZMVH%Q|@ֹ&bVSXz9ڡ=X텪ì.@tٲ\[$Hb?^5IGz5*@b,hgwz!%ġmѧUE*:;Zo ^ vP W?> c;P4{ԝOG3 T!Ww:R+tr .0h* kӴD_9.&W9;N@H;l~ҿtDh$zdi?Ē')H $mDleUJF1~!Dxzh<\2EDDc/n`0rɋOI_;ʦkg#X9vL3@J\Aw;[#7k)=1sL0dcC8x4kq}U]ELâVNǎ2G$dݼs 1;eyKlr8 5b>a啗 1^WnEMwbU(weՕ7Sq1UnzOf <%sh(1z޿ϭ4' dMd\C. }̋5S;Uԯwu0=:rd5ק=#77*P{j xHbdPԀcH!E焹MUY[R|n#"_{?]]q S}#S:B }g_.yR6# ]u?ɧS:nb&M ֦swfR"b`k[^!+HXMQs\|eQHYC^a fZ왩 W[.:Y욮"N?̩{%QB9ogbvFFCDu׷$R$Iy+w]""1cudG/p6 fn;Uy"} e5.thȪEhTjYHH% ңG{v}^v@'A.5$9.2eXJcxuk]GمVe쎔]o6] ;60EIw2ollJ8qcw_StvMV9!QtQ صk2b˕E1njgP΁*ζ-}\ʡn:˯$=ȃ8zEܜSw~pR\T/ڊ]e sTt}&M>/je׆IoԼ:2Nz+t"%ۂ?AO57gƾXG5XҥQWRDOt˶Hy뎈 ^ek:/Ţ?P9O+'l'O..f5ӽ5(;Uo|$_ :E#TrJ;\xQrQJNv۶(MdFF OIO)Sx&׵x_NHr>pK =#0DnjcJ_ۈ%5 UnY4#l7hfqI!ap WދQރ*ž V[#t:v'?9z7UHS 9&Śqڞf K"ɇv=C޶CO;tv}sx{Q犽~$Ϳ`yA]YbsRivHf}Q!"ͯFO|:op7, ]S1;,N唽z3YUc\vXfwn:}ȊQ6#qGtqv{MpiІ<6r \ kD@YY-VvLOb Rv Ňji^^OVUfLŗъL^]E{Čz%? &. {ȲJ$y /v3kFrvF*ݵأ\ܰ6vGl*hԩU  fc?uwYGodfB^lQWi i2T"sPk-y2sCS#H)&ETsEDxHi܈GZ?8^T Lb`1aDr"H^ "@r䢬UU_`)27Ä3֩RZ{kwҢ#$FcyG1D+.`djBc`Ml 6خv ^rqTDvvQUofrW֐Xob\tWiȧGu]벨L*(́lب3Sv$r"7u Nf($|2iC\'p̋_n5 YA Wh Ufꤎ$l!m ZK7C/G׮Mo)$F8OBs!h@Gu}b~u~ 5ҡϋB0\fOf~'h>g p;i{+vj,nɢkHA]#4$T.fv9\@*T\ti]@`;lJz"5 dO^,^3]8RKBhנBݠ.N/msey/^6@88t 槟1 ܑ!]6B#]?kf{XR9͇Y/XUW6:5|c7gsA%'KHc޾Wa+Mr8_5X>3wJk^zp4̦!1Q "2Aaq0B#R3@DSb?ĆNn:B,ml&-YULc6"dbVXn4$#ZB}e ȅPGG@I4/&90ꍥ2ܔOi6`gGr;I \2[A)ʂ1A8a/nU>Î.A>ozu- N16ǀܧٴM9g~)i勴9*v3~b !V;?h)?[&}< cRJ盹H5QRHGT{= p\lͦq˜//)ݙ*6F3jA;|aeS=`ZmEF\ww[i;y' !?em'չU.rz2y!uV[:Kԓq|s H]bŕEPMbsrvj9"q #Zך2`-okS@W`<Jjv˘ޜX&Uk?:@-?uW?z3މZםO74S^᚞B'#Y"ߒd{;9*XNV%%C*[+{tm8˳O˹ATnU[x$". ]ֿ$˅ Ty?MG]00#]-aµ{JCd SN)XX"v+g׈MU[ ~$!UEn*(̼ѠS5$Y9e߿Io>M[/o,ds\\N7Q Jbǎ] yM0q3qN6(' bYY\R__UXsOOO]K[PkeWRGgwx# 3#ј>^m캟l-@*8ʈ饗lSg%ܱNk-oNf;ӏMPy[Sqz@*9d*QAk.Ǎ7TՏ.̕j{k^p6*I+; ΂LMDFnKJCBs0rLQWׇ ebB3RH]si0:\+E oU+\nM/ϿudD1.H"'QUU<21,:ӷ#C@6P 31a^R/XMw2)i$-}JRÅRS;mt-&sZyu%dv'4=iff)IalN.r4]Tae}+5??z٬\?UwXi!as =!g5J6wժţS~3f~yrcNѺLٺ)d&CuT躖6*@ZD?m[@S™UM#s[rkkHodV)0Ln8ͪ\rW*N{}=upkt< 7̀dd Ql$,X}z |eQ 5U+E9chY=IS\t9 A7?e|^#t҆ɮhKOZItB!<*d%L.T֑ 91\t9PZdҁMug` \|Vkv줈'wgDny،@q`7bhCU~MQ=P6џ5au* lyNJUeOb'9R6@.ee1bGkDXa]LRH;gQc(WATf!'5CP *]hrT&FcbhsF|@\ ,1OE]' Ԩo"ܺ\A%R&Xn1sy'RU>ghЩSFlA:HՕ JĪnTwutWժ9ٛeJN("ۣw'㊕B!ea^Q+pA|GK._vD,S$SY9Z#Q&yOd~*WQY@YeVV@ GN#^D٣P]LzOWMqiLąYVD#*Bvi3{Tۃb@TmVj3#dډnY-盞XD6(3l!!9۬+>ԿD],e*[T  !1A"Qaq2B#Rbr3C $04@DSPc%s5TUd?legZԙ4c=vys_EՍ /)'Y*#Fµ'5$uBUN;0{Ld cX[w$Hv# 0mϨc~ѫMAJF硫6nX)aVٗQeV%%B u Yt%)d&jVRw9$ϤC[Υ8l iHJQrAE]p Gey_??|%$B>qRS"]!P tɑ>_>i(hKBEN8iVt08u,)isdٴE7<&~5%n8KbJHp[g+ɮlR%欏7M4.M]&`QZLL/Nt HFJ#,g~9iQ䖡%{4GaG-["v+ֻ'% LT {~[m#=|wey޹p\"RB#@ỬB"eq$mG\(^z/|R?(YM.lخ8.?-Ț]gJi7 C)疛 M͇Ҵ~Vޑ(VAI=!ͱyC v@tR35 ΕTWF$n:G2v=yrߞly䎒vd"hJr꣜}]? co8 *ْ@>DQ 8l2п6L6rbOuhzU.a۴m'UǏU;`Ze4􏛢_ꉆ7WH$JJDޯ,8GدM*>h:t8k*;zIT+\&o.LJY+S;1x'8;[MfGgܺ'4:t!gT(k+9i"_z#⧔ɜ5ҰřC"sMǑ, VHKjG.:~U1gNB+% sVO*y=;008wJRkb7RzaI&j8*:V6ލNԈuA̮k4, 8 C6[kmIO6-jhoJT=-EbNgRΉUx%tVxiϯ=ح'6HS p )->$:oir+~cr\P}f4Icw'(WwBW%[]pxkn("pIn+JN]!NzSPj=dav[B.I@BI' ;ny2=W󋼗`pfGlkqҕL&|S;ɍV5 =VĻfI-D’=Qot(0pwl:oTgatVSN{\_lN[B\A{! BQOIJ6+Zp uI5yaG(6$vĂ5WW/]L7mڇ5w fxSUhV5bZ\ȁϓS|0~m ЮuE 27:IljE%)WTrU%|7EexIjb:I!1,bLzgaJX_Y*<+b+UP޳99[ݖtH̫Tp ڙ7y՟q5}R%^\ѯ; *Qy!Ydh oYI'|[;x0z : kYMG{şw ~֑aO!*g)S^I3 QSX-)/)\8-Nz<ȋCٺ)Es.u?IV !KKa"W',[t]a5M䝳O͞T$Md8La:/Uˮ'a_(ڧT˻fa N*)w,%.&zSwZJ4&4A^ȳ:epy]NJC7;G )IUIHqL ߻#/EXv8uCYvՌħE7ҊVWWNmZgw'@z}oMR%}/u#Ke{<`,*FVdt`Z'Do(7oq8F,^J.';޴S B*%I)6)04Ie{J\7Ö7%e1T4JxlvY8=I1wjFuCh@RB8ꏄ&߼TbDM@[ջ Bu8E#%O2!yR짼¥=g-)vTZPA 0( ɂ?xEVK0Xp+Jު-WCFo:5Lnb։D..J55bP҂&D[[HEא/ܖ:&Їl(J~q4Ibg B ҄6Txb錐yC ostU+W9fN+'6`AR a6T=rta&6k#i?@Ρ{()/nӆvElL~Raev"K~{P)&D!zjLY9^f.1fu%gJ WMқM(-w5 HXy JlȔqX4udNM#*z "mQ\ ubjLpf7m)-(*g1X:.*kP C z*񁷵4V dkSbySm)%)US:2;S#RSKA!8H'jipRѩ3q|Ria?x|JjXFyE#Ԝ=StwBJP%HZhS$­+GH,_MoHp |+F3P'ʤˁ}2M!GO!ޝvg9x%ȑ$_߲k9 7_\8$fN!<ȌyY<֯v[)8TpsUG/r{*ZNTyڴJۜLMX"Fcn1]:/=5+'[Ug_>Py2 `& Eke)"%xz? 7zrzD-r3<>=|-Л:ݲZۄHx[Tey֗42q=qIųeuN3pqMMLO-'*C|hwҫxMKj=x#ś0:'=TXgT,Vsg%AJ1phKQJBJxM.ljI>ZnHvj] %[gg_' <-4hiue->ZWlPq+YnDŽZ ^;!q Z1~H*sSǶ-EA  !X. D/z+-!bzfWI\+Lo)ta05WjUi~궧a wG7+sZw5h BRXڷa#ZQ+YBUFXd| Z~Np#?m7 Zy<`#˻:P?*:w8Fu(5^:myo )/6j8ۻ|";QS! 8Bm6Ud!3«Yvxĥ=2~P@٫߇tjQzM[J% i994Cݶ v$T2T8h2ҥ) i`Z/z@M1d%,no^*Dk~* iJhCaw8*f|9~$ %gfRI^Lr9F%EW|"^dD-H|:D"6x-PëF M:?_jP e9^F<^ DzC$8 *4uJʽS+/|Y޳* :M]x;OmJL64ۢUQ1 Uj f/x8 N=](1Z6XSIZg),xJ9ɏ׏l7cqtLbi&zK 5Ӝ+mht)J9X-8Ϝ/ +OhV@Á2I-@--J/;mD8,žӣ H,k'hڟhLn$mEj2cѭ:2:3khS|J%qGe(ݖ5O4*b}c._al SO8P 7=A-Z4JT!>ڀ+څ yJZ.Whp:]phԌDpT\VJ6}ey?CKtu}f;n%+͗Hߴ&"0R <|{ǸFcW1x] JZ>tz!#pޞ!$?.Wx $]~QgR ⪧ Q4X$%*Ay.0W8#*G N_Jϝz$"DI:kJW`ot `DT Bű6"j8bDңR.Ei)*PT) Pe1-:,GEO5y3v=hM>2+dSL|+JuZTnC9&L3a -,&%0;SR%TҼH)%yp]njpP-@I-6pzctZ҂-1\$|UOaB)a夋]\AꇛqR6Ͱ?()涑FyytY )Ou䷣6KPO4E& T^MHu 0'?S_}9'Ԡ;ƒ1tR W!&%mOfdqar ϝTQ0onU{LS=-*FQE|QY+RV{/6ݡan?X7g.8;||#I9kI^ڧ%I^P#|MgGg>R2ɮwqճ}+y̵+ U+X:(PϿW0^N[]XvENs]mԐe !\˲KtR[š7|!I5ȶ'Ҟv D.^Pnkp8(AIÝ_̉SjazFBzAKxJ)ey;?{I- +/hLXBx. 1AE%D\)2;7vm̫#ۇh:.5Q'X>;P0blRgǥbBIx琉|R%,OPpNQWDCi!kw^Zj^o;A,y[B]AYu{=io42]"lG[rEG5}д:QJpANF󂣲-\wrD9ώ>=2(*{ߗW6ìKzk kw*]\/K.`ZLC jui[2h:só4ζPi2[և , $'s`eOnbGoL^M$,e%SQ`j_@wAp5${q:ɝD*M1p=Q+ xVE6%IW9: Z9󒣏|C .E6^ň?nu?ũI{'7ɺ#d, Ja=8 $i<'x| T:jjV&N$¥STYI)4r8P҃9*rjK:INW+ j54Z@sU%}{O'J-*KNd+j'Tn=0@ nJ1%t,Ob`>̏ 9*Av!8_|7uXΞ8bg N39u0얦Uy'mϞp|n=aP|fPT" _v4i!@!ʉXřwVڤ((e (0T  !+2ZuC~_aE\W%? Sbwڎzm7^ި7(G*/IS>b֏H~ Y-_AQ3i$GH fCnc ˳kD_~sZEYBvm=x{U_EXl+,巿#Һa&U K6%+)v@F@NSح"]9VHzs; {mHl)ǝA(콲STPwM*w!KY9 o30gOUI.1<}X& pj7i@E;llIv Hb8ůg|wEH>9aEs) dۚq{n+3 .AS\=e֡Bڠt)nAS0K6Z9R!ħDf=hԵ諒Wˮ?fIY:rQ*)|J4{qX"K{1|EJq9kX ZֻBz̫!8j/B6Z[%w>QZvag&)(s[1ɶy艹r'q{aPIéVNw >.W<먚ـR]7UQA/fuaՔ( CALvBg8guYT7ڵ޳"c1O{8x ^_\^MoJPGg..+d! W=/wz2[m I͂j=%3] A&{gGQR+ƿ OT8ܒBT^lK!L34Ҭi*Ҙ1cYK}jc O>05 )Tg#OV\Y .{v:cH(N\bN=xpt/O%j.!Z7EۚSDԐ<#vb. Q%jmx@=-" >=k C&鯐 vN}~PK )[j4͉.~uEYdsXn3T MSxٲRS] X3?Z(3=vrX#op*-O2pbeNzVxm3^L3!ڟfYG%rNjIJg\{2e4NZ pYݼ$Ȥ"j$&g"T;IړXPgR5$s(+%)N]˜sj{BtF~y~ &zD"{Ϫ)v{YV,(0 1h>5hy”|u8DF{; HT'1Q7o Q8$%]9J}='P$u~Pfȗ%(7fS\$s[8q# SH@)p'sL!4Ү&i## r\.6,c| E%[eƎ(8NUt$$Xx1/M <7xl:i8x> ]-^ƯvY|tA!55}vUn\;,d i֩Trxb"$aZ;Gj30&ɻ-Eag>AEFEV  ;$"BJQ%͘g ) jc`!80A,eS.#fwuEV@D⮬ԖH:q7;ՆKQ)7Ӏ<;1llUqRe{Twʼn`I*BL-4qc+87]E'd7$pu5S7ӍnTX^iBS/d uN,2qZzPk%a USC!$.VAҳBugP}ԅG'[ĠڧS"2 Q9ʿWvmוֽS!nv5-*9c !6 M9;G4CoJNGD [uhaWJUSába&s>B:N%N1cQV1mL$R29E4$BΠ1Ӌ&y*W_[7fKڜk) EqQEhCVS)H&,$!_#Eh-E joE7})tRTE۫!7mՊB=lIVaNZ-&S=/ij|I)B|ݙ {b6u͛5)Z:L7бy<uHrtR &h*o )IQҩkVXd6OU*g.84)7 ]3O~鍊$I&̤O4$S?(G٦H” oUal;hVt\|Fh>@oʭ'G؏}n'H#!gPBh5x0de4 (?(fgdVGtXe>t{$iӨo$s98hN70T 8QMW4(o4vebzStՌLv_DvSAZ* ; |-h`U5J })2+fbp$D`QqY|I#҉ze'=u8|{j9/UkG=}!^JD,0e;"NUKum9RWgY(K*7pUXJ*ڦz3<)]Tӂ#24P>m6W$[!زR΃VzEWy0SGT|6}z{1gxŵJ)^a5~IPOHן;DSk)cQ^w[I rNY Yc;8ql )_uSCB|ݸ0ՖNA: +Gw(W(r@uO6hC T20Re 8W||wx Iv0t ByS;iKI&^UnpI}L.wtV _aI$=н8#B){|]6pu*t:CMURO|&Qks| C*ZI `S Nqg]F{բW4e;ჹE{bÇLF8Ž&41fLtDCm+-zۄZݨZxsnJ(zҖ] C2ӸE!,o蚥&L)艔㌲> ⮁UzYZ>lzGNAS+_FZl ib0#lNr37n謫+PLɬ-=_TXqe:s| oYíEh oy/7%1-V8m$,'JS@YMz!-dd*m˗mJ4Q%rqco}O{Mz@þO\0otH?tW5 Cɒ5Ev-RbC njZgz,{QhsǼqDj&%=b:giiORurֵp Zue'B,QA#u!q4m;{ae^0rW'A'vp K?~[8))<>"hzR\_Xw(c D-*yXvm`ꉶ5~(.J&e+,b:onSuN1}]>6pQ84!%E%JXvrU-"xr_Xhʳ_Y ~:?"?/cb^qxt[= p#tͷFZe !3(VJ8Bj5,Ԧ8mue ueGf84V3Ut#ᇸ~NCN}@~m'U@<aj Iݶ5$wAe\ m,œRtV5ΤKno"Qs9ce䄭a2]AdVp_4kneFn q$;e$V>g*{jاw&gs΋X5rRIWPy_ zZR\bF(m!dPQ !\!ydž?v<6%ԥ;:Fk+>&Kf|5(W! gM47K8RC#m->c"W*2:IZRf/ܽuW7NS@F ӓ p{Y9IQ悮2Trڥ;@F`JQ!k=Qo0SK n\>_Ʊ+ۺ,nVħam+ʘxH-K(*R"gCx^W;q/jgeC-TG0Nm0Vm3YE}8¯J^3-ҕB)nSTtri+3֒v3 C}v|?yMjKFwT[,]Z yU]q3>o ؤޒNAX衣U# !&-7}QMG-]ȇ Mud^-ax)i/d!#'>t|Q F<, R#r|~ iJ9N۶u 7@㭖3! @7Qdez=i%RPuQr!L+wE噥8NŤ---ЖO=tCJC)H%B!Lm- ;vҌ5a)teqe>&vjT i6VѦ!:8oѬO0…r=NG1!Zs:9/['_asBg>R%-(.F6=Ծ?é^brRZ*:jJ/()UŞ.c~Ա;yRԧVv7lΔ-'UB4k6(2_ U!*17=_S':guw N|imL偋"`lQRuB㤻7lJL4)"me#7lC+өFSUB}sT˯;L/![FH'v.˭?-<=?܎TѤbDjnF]XpT9CM}R)aC q@Al53rFEKtyw*rVdJDXy"r m7FRLiJڷ}Dgku(O-vTSi8A<~ 7;&ivi:"Aiz{5pY#b^Qd{I;b̐u4a:QʹWG|z%KMjNS3t(-:ȸeRn8:5mˢA=%W0|ՙ%ҸjgBcmK M`XLe&m3Z~YKT RocuX Qh/&imhjg$! 4 dz! KCx_)!1AQaq @0P?!$]30}< "E:ߓZ>!Č$t8Y sT}7t`,@ѫgYΜr\A4R %dg5"t0*BR=YCЕ5[$ZQ 5D^NcunGd*d|&y!~F UсC11Lx# &XLa5i 3)k~D˥6BB~r@8 *F0.[(:<"mP Z޲Ks%%Q#N踷ҁEDu/M a5E.4d2Kȁ]e/k'`E )T%%h2hb) 'rb9Ck&Yq=]R+g)]CVR%%g4P# aȈmPe“> QLqBG;7L17Twtiśax_IZt4NiH 9PDi (NiolPJV[2D0K"H\!tra1ix!{>:tIzadj|I@ٺ2_NcFȆxL.FU)aRrb lpQ-Z7Ř<ᬩk} Y(5={ AیP;ܞ^hL ϡSJ$dv1'KI>|`ʭ ڳ]t \Ny ȴh.Āp5d\I4򌶁'WuWy3\FbȎ\eLXA467\b >9v 7~@ GCyVHW>Twm"nm"e˚P|.;i?vʸ`tX㯐г z'(-pD% y[xlM>_\Y!tb]}& cZ`cjz6DS7^#i^=6G |hJVzQX"P_©I o(}BTAq$P56Z\%uye8HEGT[ZF4p| l 7̘]sp8Eʫ64+ :3FU̇o8Q6My7s }) g eSɀ>FGOf (9_'R;|ᓊE?3RGpla*k )Glh=ᾋKp}r >+ x3.bg$ ;}L5\yʙ4B D}SZ!fMO4Pr940f&`cqc^>{VzXAS!25q|jwVbD$AWyY jJU 2wG(W#:=I$UnVL‡-l+:hqHGz; bJ}cOQv0vGPsP7U3tA|ȱ1߂k Zl@i*uϥq;¼6BNWxbm`q#,|$ɳqk%\"(n4_9IH MY9k8eqV-^,gP ~;{4Oc|,QxDL;lto-}~Hv7MEZlB}U.1 | E P1Qڤ^f#%:F{;xhX "W+8aHqPO3uߜ57/GWA7c 5$n4? k|VJ;˽BB@0v15rCZ/$A_ ƣo$?*v@N܆a]ۛz 3`zB @ ssXjh6٥ gqU}~$ DuىNE"<8Rj~]dqO1.b Gc;[`9s[<yb?gx=zW-gGd?T?Iħ Hx<Ϡ0\~!P>M?A{ ax}x0H$b TZ;PdxcCd>$XEبv@Oczfeh[N_|]{Nu֗)!d-b4w>,Kw>+f@uȶR0%5`b,a.c %FFdLYNJ|ȕ"[UJ¥۩M_웠[ I>Gt*ঐAbѿ3Sc~7vڟY'*|C_%G?."}SXV+exBcC>0g= |+#&Lvϋ V>̬nn速8#Ѩ1,0UZ;xТdQ4am/, $o" \D#Y A>I6 18ÍLJԆs燖_|trW;㹞7:Cr?M: }"Nasg"C:POU!ȩ7?Wtog~u>H=ietZ#O0u~`q9Q|9%(φ8Gm k j>dUz76XE<72oY|i!5ׂ29EI>ߑl˨GG_'%ځe?Bʏ3Jz͏S;ҔF" ?9̨-} *}#GVO5&ڠ.!ȍOHC B>e^e m,BRGaҩ5T~ZO/f$0Nج ڣnG))]/71+&a|_x|Aߏ8]~0dw"Y5a>Kx ڪlu?LCUڙ+c9@p7d <[%& < c6z1Nq-I~0E .3iyLS`|U<&˂eM]S[9)Rb@@/`+5cd }2;%(|o(K?_?2;ϾZ'kfvK#_ Œv}aM p:>ڰR*btN=tkVx3T)-#%pxrWdNDȕǜX6(6nypS.}dF>(8߶3N }A|VP&7d}"٬wk wD;P ZȄ94 >MW@W) FCi6.MpuW,XJYϯc6"5@$xc\K/y)U'Ka>~idji! g:Gt $}>a&w]E,n /{'EN`=&6rDlq|rmvY} }$^`sʺ@|HmZnS6I0Ab_I@h4d @_̡zNCz o7L#o` ;Dj_DiSN'(ǒ !'ʋ}2PUb'zkf:l⅄hS'A:m+AN~a2R&R:Bb_mM!xDNq/#1&/՞ iS #> L񠸁3̌{fF<겾D+HP1 7{ĦkR%x_/@y]6 OQ#>ڠ\kz_Yl*iC~:-.7~֡y@ OT"Mxjqd1rża5F崜zQw!WjhIBh%<{}S%̦etT V**!φy]֚ W}u6l pr٭.=np#dځA.PNƶN)? ׎`ubT2C|Qc\5xw"x;!BCgn $aCz^8 9blŊ Fac_!5f{>rw4`bW4q!r9aN/&&Dž$aV>'ؖ~ 'p>[\]` $8J$)V- N} _b) _8NXuj$E)Lo[L0MV+f0H@7$yJVc &9n,D͡Cf8reQHBAt-3[,ϟ$\,LO"+~ETEjG P(c4Wzn>ɶ}P*$$Npғ,odzL!&#eݳ*p5S 4CUX`Cc,Bt >\¥Q2Lx>6,cD32M'F>"Y'1a HKj_#>kB5LD/"GiE8G'sĖx{r_Ӌvʮd&!:ypHSĆAjm4v_Ff#5yKl[^ !$13ᐒGI؜8տldV+MnF5'9oDq0F vXLxe)s+?OR"g>VBxJj)WhA#6 -ɮn F2fW}u}p~rnfABg~ O~q;7P1|B>:K%P3Z]5!*V xGR'kCr#+!=(l 14d-2}8I>+ه' I: hMмwo!UXO? pei$i`]7eZ 䡎A/w4Z85!o#Wx}2,AϋkDNw~(Zq>Cn'uf'P}׈FP/]l779l!mpgcXTgO,7rF_ߜEŜ Q;$iȫ4=9`&̞6A|dLf bs@DG M}hT]4 H¢"1Z,ɁIs2b0IIVtݶ)g4Lqb&nr"!6+s/bXOTuWȷm,z|b韙2fiǞ.K}?H)8CZ0]Vxap0($G,T$qZ.Ɏ620$f! k7Zё=FT|qxQI)"]4ĝWˑ6wc}xn,ST벁tRّ/ @}_̍ )V,7&De`vÑj%I-J5%~hl3y[2XA$=8AZDЩ~ P]UbLNyb핪ǯ -Jǰق{>B݋CdԒ}dPr]CadN\2@?aS>̋ [exUxytP: *e9,#J8"}Ilhʧ"s&fLC{n;k$V0>9h{RԄ5{Zdw0&IJp2ZۧRiʏ<9Zϛ@uA⪪Y&÷ADYHc|kb8&5"]hzK,Hcš=l YCGrی.F|q Aی)k7 JyܖY`#./ׁ:$ }(e( "7Ԭ-/M%CEٌ)Dߚ<`R3CjdXG;Z&&qdyFtĕiZ@hGր&h}2C+x=+u$k!|ˉUX(]v1lnK%#lCUw(hVנüp{;컕6QP PY reDM ֗a̩*2{kd:9~F~aG~~ ~#t*>Ț"DAaV3B80 =+|5ޏi#"` )"IEOC(ah!r+덎S DBZ$ $}`SB#ϬD_rSt|c$^/>)|BB 4b6ܥ#`}Ha-h8D=U.4H$ @ӫ98£B?>' 0  k"|1nd&uVs*xMǃb-:k} 'rV%`i}g ۥc{ǔIP}$-?=CPXeֶyKX\$DPr$ uJ1$(}s仌?/ XJqĝ0 f ܾހCֵՆdd4呤;Ir)16ñ I]KI@zDh5O&G0o,Ec}O[: J7Bfb>'PvgGws}' vq.Lr] %&,;WbdUflc}J5}o8@S|XETob{}wX:2z E}ݹZM\LvhbyY7'Ops H_3 zɢlas<9-;t_cIbu@Y_lJ^?З׊nH4ֱ!CzDn k /RH$S+n< ",E, |g_y#?6F(!_oJ1]D /Ȏ2¤ڞ% L{۶qqm5".0FHZF~[O;12N$6N)7> 8Iף `ܧe׎ nFǃ{乊q-VsRmM!</mTh dwa%3'aX)HAQ(GT{sETEob8g E|oʂvxX,K suO>?& -r_ ʳ;H|8Čz\1V,)$$"X/aAZDVœ c mn^涺:f2pUq{@2SѮd4'MKNXY±~czUB_ŏt@,{xϓxw,q|h+^:\Vߘ{F&'Ԓ߾''LM6I ^A*$T qDFreAߦ0Kp-ędnY Q?X\,F5gǴ}'RL>OL~2ݣ]~_3HK 5;e$~S' m=#TuL<"Qsq#%;V2BA"an-/ in2iho+pvW#%"DͲUz,pn<Խ?%e<Q{I̼SK#lje't(ǃd<g4"'~ `? 酀0 *+{IN$#,jZynGX9T=aX_$/.Ο2Đpؠ`P <:E 1(y!^5.%f_ +XTvDXdJ5a%!Q}e]Hz=ْfƋ!tLc d'p:(K顽ecTS?L_:K+q(^?g)ޟɠpHu-O0=}*Ý /,pCoS 4&@y0P 2nDYZIM!epXQߘbBc#j){` DN-X9MbHbA *N '!s?9(d}'L$vxP"Y Kp' @C z鐎uAPL~LE M~ 2\2۳69ˍ(uww,L0c\D@lky%Ci z>0'iy"V. 7TE-Ln|keMy;.z@X7B%AW1t|/-ܳG\@"iơ x(|xX~8#gǜ`b^^4"i@F'i/'Hs{ie&Ô`uEl HtZy1}O`P)hn#%Sy9?NV)R`O1D 0|iJlBgezcb@hkbd7*a4xJ_yZ6GY|@N)G2V+;zYH_q}BF _51<ڽ+ͯ/k8|UxpND=W͑X*W<(+J/ϿɊA(Ũ"`D V!#^{[ݞ` BWeorZޱz\Pgqa*PH_3|\,3 ~j\l#36I6<qN:-TbݱP f.@"CS8 g 00I_ ?)!1AQaq0 @?cAYۓG6ID1ݗ[qOCU&߯U# bpnD/RcYPa((T54FTo{¢CR?`HPjo `° YWޓ'{ovx.ToNG7 pn/HV@tx*@PV*.-l*;Qrj-2pHqm@Q['*0`(K.a 5o'{wm=~pwy`oyo"DaQHQ  T-)JY3V0L7&eA!&+{6K3ύ6-w%oऀ[;l|g7"fZ6mt@jF69!2֦_|s ov9T)YF}Vez>oXȞ>) juc|PR# #<<%HiD8oՃ᳋~06Ym8FE? ܆,LHK#'9Ab2éU\af|CEXFT/\ ŇKc *yqqWcś-k& uaV:x2O&Ȱ$q-!!il$'s$xân_GKh䥦{p!tAoz:NBtr.͎l#Y)nb@X/@ĴMĸEdrLQIFGҵÎ3EPcZ:8O-AC%80fow櫝'_ im}xLS+yjZᬊd}R b' Ǚj`I:uv(_{jKoO& Νѿ[%eKW2D.9# K 2#.f]uQHmgqi݂'(gBA0<ա&6́haTMS%2L0d{ 7۝W 7JK_N\i\o6QS"铙r[ 4BaHL?\b-98 ZhZbnͳU%mKO&qH]އ0wO}w3 f r}s0xcy3ӽ?nozpK;9J)S+qODl3҅a$MߵAs29w׭|r1 wS?(RMy Χ(r\ΠpM}QT+,0@.ixgNzr3#X!ݢMueZM0B dqp2tk㞔.F#aj8T5ӫ>=*֗;I72JDw) hT2KUnr*Wr %nQ.֯rʄ/{ 9ޙiJ?XwƇjB!*_󽮱>N>%MӢ)JOhVK y!N?켪IA]L6_M ZY:{ѦO$a -9)!1AQaq0 @?`j3(27'Vàϖ.DEQĔKMLIWl|hh`a>LÀQrch#N |N!BeR%>l`XߙO`K@d*_LD2k.[ kCvh:lqV=z9#1(Ac*d冷̷:>a8[/Yjy)Z;ק0_/O*ʃąxe]lߙ{7Vk> q?ꐺWy]0DJLVP }51Q;8f1b7l]is#J8 Sä߆)*;}V?s= 7eGT~JǹG@[>z-(80si^>ltc RĢŹk{J(x_9`xṬg|m0̨w,jZt0" Z&6\R-{h_%Fs^Xzki'3 &'֥74wh^V-)TVb\8׳j4x2͸% *V ZƇ+1SSk5V[t!'ȅ Q W7B Sփ8PRs.y%&WCzAUdJ[.%MZ4=1*U8NI%Kƈo0eQa^ဩɹ%5QSm?rJ9p,8GZ~<ʰ :<Y̧{Z2m\LKL H2[/ C U f۬*yL3a }|@Q] VG-,I5{ʉ `2c % cz5)z4c2 Z%[x‡zg NY6adžUo@(Aǐ: N1`|Bp Ydr =q 7a(ec%4&UiÔ4+ڇ̧Yػ9@ )cBl|< qWrq8R9o8oxDu `U~%pdWT8`R)b|U6#>u}e~%#l}8?lwVr (4F*:ԣ$8ʮ.*pǘ[+m;uӇ.XCZv"nnL'cv[ /%6eì\8MǶ4c8CvUBƖFR[W e۬i8Q*2s"U]trMN=C R ataƔĂh ]kʨC=/Zk&ka((jr)%qЦ^f<$_>" @!Vw~c@MC(hI.Ch;?y: ޭf'/pC5K㽴 `lE0 %;qc$Rkn9T5Q#Fdt.U'"--|[&( Efy )jG␵KԧeAtU{At~pRU82]y7.n)9""&?ȏkq~*UĩPA(E 5^ˀ yfFt7@[BT.BD{ƆJ$@XRY5A ֹ VM.GYSeDі+X,#LREhd ʺ_vѻQ3nJ@čYVBZ zc!jZ SX*$ /ߩv 9y[Q.d]%Uf?W.0{vePu Z>=RWb^Bhc-g#ª'8&sn8rk0jV= "U΅mv F01qX3OD]d#M +L5GKL'!YfaLz y1k̘ A/:)h^%@3G0j)g ph(&p"'ʟJȇM[5+a"TCAi ЀH]A [WX=qƎjIm!Ԕ=XA\n:5-NJP{fnUu&k%w(8AKU.\cb4ZR]p|L! c']Oն͙d` J>ED^W;˯+P.5xEH 4גIMeID2ED( \cIUb#e.Bۊ[VGP@HCpvBXi'VJ"V< ^ư"eQ@6( .G%0@#iu=RxTbX( _EЀ1$*et;sK YP> rY@C :QsS dڭ 8 +;tl<ɠDҗp|#Kk*8>[p:a2Dׁ+2aȺUjf#* "+S+?A .ëgL P/X{x+-S :Uc=5d}TQFw!p;C1WEHi '?ЈD92$|Wɫ^^ QA{,UEr"I7JU ɨ鎩2UcPXtlH.O0F[{'`eI² 8PUa<JOS@zNO 볒c!€b *) juiTC,]sCa}3]dxQAJ+S?ClA'Q pL$ZB/.ox(58ܛ p*I1Jp&vTY =`U΢0aQ?X!F<}A;+Zmp->Bvz- bBDŸFq-Nw2?bԱц{nN.:,P H,@U{|<)ʶ:}p:p]LBJg(RX?}}]BH!( A}-Xׄ/<(0*5bucx?wӗ)aQ^JO}wd2q.*@ivC^NqIT @0 yL2 Ě# -Nq a%Axn & d1n )E"$+R@iz%u(VftgaW@7\햙jCF"'7*2U7N@41o~؁  pX |P  rEbÌc_:t{g:ˤ YoV>=־~ UϥiĶW&E)^!`rWpZ9$`ġ7fh 7gB p(1* acI:&BUm5;c  P@yJQE J(H}:9`( gX; Wh/X. EMx"^CthMsA\tr%c٪j.l!#\._öIP/A\)vV2"nc-=WK]h+jC0{U +CK(gU41LOш%@efVԮ-qp5x:NҌ<FnJ$5?/=jB0p%eMlQz V8DmP;' I~?7 1O9d 16`jeY@`H &_S9l.%r4%aAԓUb`ZD~ V`0#ΙVP+lut\2'`J8TLE\ >@!O硅W!yST}GyҎ=fp QΕйbDV.gB8 i#pCBXD> EH =Iqz?H-!jj뀃q(b[JHGQ@IŨIzv[J`7urfUu t݄Cc .%7@5_ \ &8jU1HX @0u~GIZ0VZa|\OɐolYq O03-s≞*g`(GPrm8M9WVgjLDDrzzh,T6 AGDBƠdTAL __b\y7*/̈"`e0{{\˝ɍ31-H#B:ʜpʐp:ߗG&SW,.bYQ5␁RZ J!?3O.C;J0:y*أ!89|68#~oi/ehA T! $wIoh@lQuĚ&>*M l,@ gZua 0"*胖Ѱ JR!,Sڼ# $1ny@xHk@\CjQRdr a331l# sGzxk !cZ> ŨWaŋ\D1]7`m h>ӄ@U\v]?C0&h#"ҿ)d$toӯ Hk@ӽHgrg# fFWEA1)T0 //Phg KUH?J݊g%֚B@9X+wE 6c֒~%#x><ӋLA=8><"$o"β~xpw Ip "O|%,_ #E!PttNDip~N)# AuŬB ?b!14Rs{ 1=Җ"q6 7pSb{R^HS;Yx 2E9azpR@ Ql҅T<un[= 5ÉRAiji̮k)AŊq5Q ^FV& Ղgl V-%<^%S\w\5IF'U P2p'Fɏ#ੌdzJvttzSp1 & )O[]fYQk`L D6oYKɘALEtNHu@. Ƞ=4+K^905}lvqMF >??C(9({ Ktϩ(!ZpDRNYOloi[.1Y` <5 qJ|^ " u 03elN/\oِש>rC(E* Lq fDR \-A㡖,!Q2Y kBP)93])awZZm, axkɴUcY\kAG@hO2*d_26U PW0ӪDs}` @3幄A_\DF{ d,?A(H~ KO%*r \uׯ}mk  J0Óu{Q/7EUmw-B2kd@Dd Q9a|bA9(K^"_U.BRo)P/vBT~'zCd(zzz7,D"u<jJLB9xMMÆHHM~ܩ4̧d#mI"jR-bGfDa9YB^Pk!V DrbH/ !7Y  ;ycY@Ie[ D&I3O<;F$ *p\Tb}(C ' !a VVIr|t]:\ eX:;.dNlPl'q7u/_ݚAvSO>N>OP(Cvp +FNxh'3Ac8F}#4W )!_. {8s"N@0^,ƻoН"lǗK [1뒉ߪp2>D/Y_Hj4]w#H( qR2~b qr ^VET1ӵ^Рpmx$BJ=!P;+*&*"/u)4/<IFw΀lB(LD 8Kԙ &  %jD ZObɍ؞P kMɟ,HK YH "nّfG;L&ɭ~g3k3].pb6eGQXQ6.….j7%D.Ҙ& v!9Ao?8'҄}dPt SI#z 0*Q]A㓺 3D!;jCpHj́5y*TpР>F( B9غV4<0cUGT< .IWYY)o `;;͔C"sq DkɽĜp\n-SᾬZBШA=CIvø!`(-#Xoi pڋ6<^M!ozo Tp"F0|ޞZhB}*;7Re.(YS:0@DKAJI*@bբtZHbW8r[1:#UXVAVjRq=cD䅮r{/ mu9dj푥KFnp< b<[P+>w&U*컢z*4u@`_KeNƌS=0[RG_4y2,NE ةRr@3jRZMW1kKZLN 0QAaA,%w!#(1 ixvCwtpK!pW@m)VTd5@tڄh٨*-ƵM_0뎁G@fi #1d &"D&W DP$u$p댫v]x/jLJ *a|@#UxIaw voAؐE{%%ڐ\] JR̡_´Z -_k 7 #Ntn׻V&:HxW؝@ X(YPw9jRGyV" ;99G"H]M  S"^FXC"t5ޟq(;J) W*,DL&z-z<vB~:Gdž3+% j#J5;8*ȅĪ^ zu:G+=:($E Bd拐M 螂 )Q[Gr#7QcIo" m w B}g $f1FV\x"Ф8[*хz+-m®ʬ&D3qvqN4ˇ74 )[+RSO uw KJkcEo"fBe,4ߜOr1ګ}9>tV/tҬHۡ]E֡0Q>"n;f y% MYf@v,t*xb`}o0I۳1Achw6P `uYJm):Vf杛0ǚsbX kXP9Z-[kn 3{3: 5qh&ծo~kÄzO (#yK?D'!L6܆5~?m" 3D{n@BBR"{ЉlGk!@s )!Gm9|ڄ މe]8 ʉ*;ipe3\ۘL;cV[u]1ʱ0. ]vʷ7-3NF #8+?_P6HX%**H`É0ؠr9}D5wP=A,g~5?՗9F}kҵifR#>'-VwkMॐh֜U}^W"@ ZhG75D+qʒGFta!ylUmx̣ET8AqQC9#0-Z(8t2ְ5ldlQSj/7ލuÇ̌1W-$~_B>+C}a8RŶQίpDŽA]K% .:F)_(bJDޔ\D)0Ί&,UE@yy 7; A u . BLtu1NEƚCxB,` "?\tGT;|JS0 >3ZvPH>oKq(:'~BfdJ;ӏܼf.,PL*SU诜TU5).5tI*Kx.AUrGtǿzwńEBc(P& 0:x40_b F-,`p 8T(cVJxRN>M` $F (]+I]8PĚA9_YtiIE9 .ЖU^.Ʈ"\%fQj*9iJft?~n@J_(vS2TG ,$Q (B3|HעJr/MrKG;-4jQ$%HoPti{( T&TiĪ"E!q3 TO8@G^%`%tacxb3 'c$ <`BC51xrψ /ĭ@qP%@ Aʇ.}ʇ&Ǹ A6Er9?p/( T9bD AIt8U1Xp*v@$I~`bC`vHK"ԲX{ \AS$@ڕ)st ;Sy]4u9l֒=q]$A ne"+zWe?G:!X?W=Sq/W?²:IBH$ZtHEº[$RFtm*qDq*I tTCғV{Z$7p#`^DM)oT4A'{3W!dΈ-E{f2]-*t r?'YM{qk0I?KDHAy?#Mfk˼ `IQs~B[G z0GGqJaAvpH4FL MAl " #wDKE>Q CVLLmk:?+ӚeTaECFF7J9 hKn/@ C޺ $Vh4a__PGtZMx,說bՈfׇBlG+&^HBH%M`o%D\@UIY+`GnTwu QZ(ߕ!ÔY *l?BfDA`^ 1 &[ĐYvb4<#&0/+MBF6l Qm XjM8V=d@jQ 1 pfш5XBV c2d3%tty(_md`RÌ<-yb)dA1=j28!׌|o;:Cim"VX#*u yw.dP#sW7A܅¢EWùWwV; #Ҷױp$*(29O|ҨRFL%/4*۾#dp4(+|8j$@18tEA4OQHi:/4M0f2&3 t &1%foDZ]]6~ LXۄsG`tNVQ6ƃcQ@(5ݫ(LJw9EEWUlJI+#Q^=8sϔǠB% F .|^ ۹=+Gh /K*Dl<6xUUxm]~Z"z>Z =[=NAxe 5YʣQB .O  U 0*$E #I=`Te ++@KȘoQuB}# vj%VvF$<(%*qJԕ, س" 3FSjU FRnAQ+ XqpjN$x!L^tkt;v7>=T4m(emuN.y|9@L<>u@&Bz*PpuPEŖ;~d!((2q@b0aj`r*,"1в CjP*-DTD00]=[`Qut/ k# =̹SD&:g 7p5 %(h^kA &ax) pH MDQ[ID$nV4- &g)Eiӯe-Ә)"q&)F{ pjGĴ< ^< N ]L,өndHP1QZ+UޞD(`E2N;)FZΖhpɔH,ƾ:Y!ŜBM @Qj0cNFRU'cƄ8E@PR⹘0 DR1L\ =3%BƏR{tΥ*U`Q }鞝#js3O,eB -lYl+ͤBABt)8hj"j0. 1DUJB/ nE5/K%XB@[ QdC;Ox:""<.| !RBLy k d٢oFKE)aA'm{BF 2 ȶD|84AEp,0Jq*!iI=N 88V  txIcwAzh:MPZơR)p+v2!I8DaLU0]@{>t#}Lgֳ OJ7@攌WDD@TU^o}Z4#sЃC;#ʠ#{>$*mfT2eC-CCIQ iEH^QI !5FՒQ$&*S*WJRM'LkX쁈p24 if)ԂSzKMsu (M[^`4 qQVҔj_+*5u+ܚiƝ? aTQ8TaB'߼*0J sYoPl+^N$BU8$Q}O2; D%"d.T_vO8)1K^`Gr CޓñX%("zRYF~q.$ Sl|8TujҠ) zi / ̜TᆫUAo3bxKU 85PGcxbԤy Ϧp2BP-:CT){GJ4AHf9 @KDPuP@뫍f.d+lZ$)KoE8^\>jGBpKi+P~1SvΡk)7:}bB )zPwQĢ0 w6 ]RdSJ3?7/H7~>~=etK+:P@l4JH?8ƓK()(M\m\v<̊Cu 8DŽ^A/X"CB:])K*#P c;!\eHdiW5x8ae)wȓֺR@-9 dzy_ʴt=Fm(J KPtEFa"%ANt3Ʉbv VHҖTˣs̰9H-ݠ DABW2vU]8+ Wt!5Yz:iOtU)vAAxICE `teҴoYQ|8E@ xmRkFڈPE!=DZ7}פ}\׮B2'Okw9pC=oKu'~Lqfٚiw$-ѯ#UӡT0GO6@uLh0*ӀUF5=tih-H2tv|WK_|0*#^-O s C`H.xD༁ Y%BXB  JOdPAh$(R"(ιTQۋk0+$}I? u abP5p | \_0z'*/6`52Bk\B_MN)>7swPJ' rѨ*tzV H{j"2^k: ET?;5R"q$R U« x MӔ(RT>@m `YٰCY`8U#R9,'zF+J; Bq\ ($J:8=MF.f;0SX~p܆ H޵eJeO9VHFJ10p3՟vΟ&N)]ټdK H:DR3,R)8\aWH4B8PJ ˠ4AA<"XjYYG(Z @n5D-w5]p8)JyϳxTJO6dfzmӨ=V(5:(8(Uh PSAOFH0#tfP~C{=OX1׆tBg@ t:G ITQjcMWlK/SźVqi{2ge%Tk$\k3ٱj4 +`HA4vg`Ÿb(S_òj5&Tuj b,P97UR\BSǍjȤ@!*US08IG7Ig** 0B4UGiY)J|F @|B5V XS: Dз!R&Zc`H$(,E9#ݴZR4%&-k4ھmFhr˂zdhTXUqt$ Pcl;5H={4Wo$UBf.hbqL!؜Tu@'%F;W#QH"B1kE [ނ6Q? !) k?YtVEٶy(Oa҆R@VJdM)IOtѡ.IZsWDVv` Nz!8Jwu1E @Gec7}1u WM5K"jt3.!MUJXXAAxDIz)HEFD&ҏb9֊E7_A0⯇@.>9.#0`x_QP-,gdxa1LtyPPrlD02|7-Yy@o+Cb!piԂ@^@' K% lK4כܜ*>c9aAn`X(rLap*aV<8UY:O#DQN&XrpW]TRץFk7fɸpJ؀TmdH\bݺ`;}Æt( 7zZ4x'(''aGo|8^$5p[zn{Ev6*aZ#}` b{?=`!j#0ҶT2Q0f*b)'|@ҟ:LE FƔI *XIL|BU.>:Pb?xUL VBk\qz""*P't* &m8v q &fmКP b???ÔeP?tjwe^ ,ssܲO}DSP9!:&I l :&r"HBT({ 3MUi{%N@<Մ#H\?=8//M(::&VêzO%,dTQ͂OPIr7(Wr28cB_rQVt ԹTa>ЏCP28*A] =T/c&gEX2&WTb(h(Z!NvXM G)@ʙ"/ukUC Y1$,5oqGb%yz޾!iH ŀ^ r]s7E5Œd<@ MARx'/X|WJ@Bd8{>yIr . GTb8qhs/c9H.&j;\*@mah?"fq mayavi-4.5.0/docs/source/mayavi/generated_images/example_protein.jpg0000644000076500000240000010673312747716313026335 0ustar prabhustaff00000000000000JFIFC     C  >"  vgwvgwvgwu=wK.,9KiV oȖ ͰN>d˙TijVs@ÌB5/&ҥ }{,,+~:}C{C{C;Y_y5lBliK` s@mD Hݬ7eA :dW}~h{*Ӫ`fY.D5 =ef uǺWvOяoq(bUŊC񿄎R :bLZͺpe3 BU2^pVW_Zcy*( 4CquT2yEQ:a=f;#V J y?4iD4AaN 81,Ntr+luaO*z,fkplصk^(|8Jle-q+iL2UzkTeΖBՊq  M xK؏Iŝ +6W0oUz?Ut-P2^L{MLa"xR&W fM(Vw e::^u~X"O 9Fٮ*'\9f"Hx-3C稆Nad<o 3l ڃiZ7tDrZĨh}Ts!p۪F4>_# dSqd5q5 W.j>gICnj. }1K c%&hu Nl+$56*Qalt;}f t҄MHfM"E ]D'&| VFe5e0_溻kѨ9}fH۫d1D&( ~4~f`eY!tp7UB˜%Sۄ`{!ٌ7vˣh.IO^68 f/FK<`h4j`ǩBr+TŖ\:JUFϵ)lYJ U[fw;ՈYZtAx,),ksDU`N)Y)sW;gg}5 |mTIyޠ?oEATY%Vx/&7E `-7t+t2\ݶ풏ru^pJ&'Bxv їD`שdEbL*(m۝]31 $+O?\g佟#3Vrk(tZ:R&}-BSK!n+GW>3K3z1l˔Z@oH +mo@bKHַt>&,=FɄ8=f{SI))=w;/#KF_oxwIQhMXs^Mik#; qѷvMRjACV'dz|忛ܧЌHiZ܎zLE(k U8ɮ/fa1:ZM{p5Qt@"2K#'E[2 R`t.O5,'e_M҂y q]5ы\U@&&S#s:sh1X!uvECUF#k㞡X:+ڍ>5Q>7k!r8>pQ99sf$ '; FY@E0Ӽ Cr-NdX&~ V-'6.=ZFsO^%e[ K::m\GYUUۙ4k9&MuM@@RJш|˺-։&AU!&:ijYx]E.PlCb\F/h4E~ %%T1C0r6SA=O۽59>QM3z$Fd.4N ))6uLC?ZfItYߢQANkXPVj_nZSl˽j=}onDZi@T 8p]yԺXD#[BZ!)څLdW 5v apTbӶthyݰCM|a>dz8p8 aY9}lhzl_$jd6ث*8$hC/!"1 #02@A$%B4>QcA81RpXk\j8cFBUAb("B%s0s;nQFpGxƌ:PT0,b(bF(f5yjRؐ pnjxeBRuN3P# Z("&z,RRW̃n=c1Q1K_* xJ A .-qjTZ1USKx8O5Ŗsi:_0^bQ;9w< ǃFɣ jܜT~"~bxBՕ [?AU/<гK?z'Ze1p r".E]tU^CPjufesA &XoCaf^A?$3'&fvgk֕d׬qn5u4c1p- /2`iC?762ӟ7]e&GN4?82&kj"ͪƒϭ;4ns病{CqyCTҺY e̅8]W~ZP2XC\burU(~}C) XA+bw_=BY_! A?j'h +=\MtCZAZµ¯p%z]} cSh+1{vJTYefr.=a㮥tUg+WC:lYJ՚SS -K8/iџM4.W *6,ɋVɕLQUͷw\fլ9=+XT4xM)PCi#5VŲYY`Tua/v?#ϓX@ O44@XP\ˠh3q`v"񮺗 i]5\PJV5+-sҴ")|Ch, kmz56W&|foiyYPnbXU:u/Ekn^ƪYM1"U=F/mz89i)ѻ7muut6YChbtҏM?dr,tg ǼCkMFF A (+)7p3~a[aCQFߋwi_eʃ~7k.fqX)G2gRu<`@ǠE&Wne5bQߊ܆}tpp7o';*Ew}E^a|k1V]j,,gn".Y!!#PoA~г ļ6=OeV# J7pyh jūw,ﲭJT%]RȄIJ;N[ZS7r YAߩF:LCvi^h}}yŵiN6fIEBGA9XJ3,i5 eN"}㒳3)1!w|NԞ q u59i[E5KU:*^P~$b'_0=i24FaIf0*$u;1\[myWx}C&›ƕY`9{1sȈɇiG|nǧ؊M{Zy'nΧBf}N-{_翎aZä, ͘*?;~һ)=kphaIq/t* ܣ^ #>(ēޑv[5ќx[lV];Rn4zx{ xQ[0Pu}uq_3\lQiм3/ۥEl? F0Û%-c8K<+GU k ew`ϚZNTw/WOkT3WD6f67ͪ]K?VwsU:۴*Ma'(e+ѩ+62jFa ]OmvςʜmbS1k*~-|cՃYGB,w|& V\w%qe~Sn񼺵WuSUzsJ~)09xK3-oR46˺w:.ϩ`|r35_@mf82KY4.΄`i:d:Фő<ӳ9WT|I3Fr-AK,{ڕb .|UySVCTZCvUuT0~*x ݍuN ?sO^&d5 X% ySq Wh#3ƦܻܨW.'ʩyƸn?yidQӹaxW ^Ub7V왯Ñ :&ZJW_e:!1"AQ2aq# $3BR0r?!)RM"M):|U TQ?")$SHz]v5={ww*g(o2 EʺRΦIv#7K>nY2Ic ̒/괊9 p%I-qoZ9>v8ZMJ;xS ʴ 9"ܲ-rܷp$iql#:e^ z*Ym{Wtmo/e v)aCk MuQu. Y)ޚ܌THXdp;5Yiі`KQ}w%9 iCݹ9lOrUkj).ʛ"m6Bl,=-lQ7Rc8|+Boo-OxZֵ 'lq;p=fF_[##8N*+N)ۗ쥽-pz{-izR|EIei[B;-[[1WuJlӣsZO85l1gl'[І0oh_.^TRm0`=rG>uc& rҗlAsiԙgk~29k~;=mGU=}JFlVt N M㐙43M]T qxM]\ױZu1_߁Vt}2cyzє$cH@]L.{[FK]†qg` ,}~߅Ŝ}Gɐu6d8-Gdg:ZoV LeG0㕱;O|}gu52֟/NvШw c ViPdegGrw: O7ӲarrdO,O v :ΙRfnO9E=[Sj9sU&Pl1*ƜUBXC=xP9>GDwJ@$d_>CTԣ}B cy#Mq)WN@8a;tNTUlveצͶʕ)syiRK#>*nh?7 5 H!j$#~vk2CgG 术 ^'6t l ͧ8FŮ#U4Ӿ翷Oׯ#'¨;L#*}cGn\9cb̈́r;Uc)Ïl*qDRfhN66pҴɮ6 v{g~]ϔFΗ{jڥ~NjOeD6})fB%;}I }~Z-{ˇh N{NW5K M1Z셣ٹV-8 یJ4ѤWws r:tO!x2=ax oo*7"45Ggt5l*mxpYuhk6ď W-b ?c\ p(.m;iLӐ{Ô5j!~{JχC 滳S~##F6R8|}?#1 >ZIoZu vХiō.;ԵMs\'|+,~ׇPz%M9V-9^Z1}dtuQS+:vBjWwj n68v~ӹLZR,~o_m}Hg'2WYw&Hٹ M2KjLI'ga =VRk]6|PxÇܭi;Ns!teMEG*älԧۘ(@$= H镩aqհ`gtɜ9T#ӝ[!V+uEO$%V{0p>/J'|ߪ-A0}Tզ ögI ZWh?2赭ʔaaib%ꑺ_OnKE<(k2^g1$=;qGT4 -.yK!b#DwnOkp7$v=ۂ=P}g;}=Iͨ[SxP4˻_:!1Q"2Aaq#BR$3r?p&15Ntމ}Cz|Kvs;zp UNڗsMꚒ\Z*72>c[ k#tHƌi'ċtkJ,(?(wT7-U.:ޕxձ[UcRQIBNl\-ZL==SrsʲF=imk(Ej/ ԑ'}O{qe5Җ7%}D#6V%%; 9"{N4lo%u<\E:VnӲ+-,ԶXu􌵙V:6L|=>^ȕwSU0 ws/PT>gmXD'SkJdm-bF2LI;kT0A翸VJf1ݿljHWkDSVQ55H (4@0ÝL|c+$x?UdZ(P{]R|pWTwЪѥyt-7誠0ո [UEt6b #؅SIjq <{d@X',~ {̪TaTqVñ+MMn.wxff'yoVکQpriQ0Lƹɐ4^-_xITP# SAaУkeWr`qn}pVz!mcGN%KEni!ê}8ƗZT`ӧLzZfLxGu tVUƐ}U {ʎcҜyeʪ;BZ\4r} mB5;%da$=}WSd TB;Rܤ4F q'vQRԺ}i$OR:FUo f~HBy7ᏃWӯD !V1BZoOQ8J!J& POcR>top4hٮ]T4Z9W{T]-R /9*\ټK[SedOR#ejWYi NänPɶ?elӝgGPN43፻gCq\uӜcm&\HoF‡,;[|Hїc?UEQ nۺlQ5U)w\Gm*I~~|G+.ʢ*i~E[hi(C^˥դ=5DU#wTu uPԪ#pݩBկH12RdtnEszUpeC+*" -Y]Q$7*k?nQ u+g#lSj9ph\QLQ'̂=q 57d@W(*f9iT_ႮZ4eT\!P\q/}U1>0F7U-/GAd` b|:MU4ty {~p`g5oۺS600NnE4 Bu4pU|_byedK9kpբ\?OχmSyg=IL0#$;K(+EN d1F:zrtm;0UkjV+lC)*NkVy9un~HPخ"j}[Cd D!4-**ur©Z|b?YiwgcC m6:ְdntuIZ#tUw+E v i\72cZ~j %,P^G渳[XֳucEbvuI Ϫ)e}-9C*iq*N%e.ʂzOt=ʣtʠM/Lne TXI:1rǕQ ]]oR.cƿOF|CwwT(8Mt2n~M  *S#_n8O_LDž/}d۪\hB[;1+eI]M02aG3RavT[azC lӢ(5 +\ ţ( !Jc!A .|Zu\;Y5OWЌ(X?Estt<P }XZgQN 4y*e J+BoRx9g@m2 \iLUpnȔNZ-?uY<]PH X,?7`*.1,^Wy]F7T? 8Z? OVNZ-?9X#rkFFZ ҭ1pϳܢW5Ӕ\pz~=:z4)\~eTW8[HT42( 3ۑ*Nc{ʒ@Gc!:;*9ƲR8m&[wdcʃ@tX͵+E˓nBuhѪ[%*:g+^Ed,q' IJӗr?ȖhVužQ 1 GXp(ٙ(qAw \DB_TNdrkZW c_s\OFWcr5][f~pmMƨ68QB \t.ה.td&j;Z(4k 4aoWJ_ep_-/xr.{TļH9uQǬ.еR d) :Qosa< 0Յc7]Z>ҥZQ᪷Ί/bjo OQi8dsm~8}U! Nͨޗ/TõJ܍x_i*0Hkm<i\U:@]8+s~u@jy9giNѢ52'ڬ9^ie>VE66*^m~ܥ D2r̂4WxRFP s.'ODSWA+ yH*ǵPdrһ]dM yFھBN˸,r{T1S5 l.;,WOoytURɟd]&a|~0xYP5(FT VDcIC@~!óWY#+L vvюM)3rE8V]#&? y6G\ѫ7RzmJf\5TsGۗo,l{VP\ӼQo鲳W^GpMN-UQAZrݟI+JzBi:eNɼ-#U8OCM3,9i($-9gF%SAWSoo+04WM=HP roi䱧ͨp7܇rC ֣RrB1uA>FD(hP+58zl㕬i?DJ8\e44&-*ϝ|kV5o/Nj?C⨈:Z+(~enr [2{9 w تwzQIWa絺 6 vϼ.~պgd/ͥN'ѧ쪷x4|ˈ1LG \UpKC og[Y=1Wj|ecNyw vZu%5Ekeukbʅa ɽߥ:3*Kia@ۜԨykEME>F[xqt:.6]0^ ŅcQ3ursҺ6 T)R..8Sv`:cߢ ²NGsuPpTr*ʿ50ZkPv.g吡Y@.څo\rN!XrUI(w+_]ދT -Vuyoodi]. |@e4p8RT_VҤ.?]'}*;mBpWiKko JGXY,a\uסEcXE+UָhU> =_i:pUWoaz9hrA1RKF;vtHYc*qֿXaxW?qE6:[Q NC2f4ةژy.zzĮ#Ew +:'(U"wqT/$CGPѴHOi5S~l_@٠j5OF/FGEav!5T׌QRԔDz/-D )SB@7VM _FHDtK1w0=ܐB JG):_ufq1$i5&%tLZNFYh$ȧtYLU ZF舂6Ȕc[pB0rߢ5:|,аU'BuR6!JH#4!/Qb%1!pZ!$G`K21Qh4|4ٖ`T󳮝0=, >GLRe^'$&1]A?ksk*ICA( BᐄZ"Q7,ܜ@C('= '`O#<*>Ƭ"C7h`% b|0[ Hm"zMYj8D,Ԣ(mp&3H0ϲFsJh1 \> AݡQ Nw{eYhOn&S\)I" h,J1%)X B8ŏe!k4Fh*%(R,ĹBr12D>䄸5*o JeuرLKJW9rF`jA:l<*]suv^#(87HRE.$G(HGIRn*[N03Ȍ0aE(M(\5Qexr%=01ܴA!GpJ)Ur~!h>''g}3e8LvN]s< /Ad><݂9VQ4),-ث2Eoz݈#7)0UpU^rE ѐdYK8J2p3% :'i#{0ğKP6 #sI!u 9c4oڕp:  ?d8PJR|hc dZb beE8gYS@ߥ Z+M*, S@ jJ2%E hx;v8\nZ*g({iYJ{$#>GB\4u>a8Qiɟ*UW+ 2U!&@lU3nPj"*`:H )p58S{*PвS&-2!PK b`u KY.xT{hHu:L;+#}UG ui셶J-Vł9L2JF?A09)"" '!7Q0D9x H&hqIТȢYе,&tGeUC/ zdpC;+IJ~6\*/hH0JchjN}jU&8Ei8 A A*,lX1 d*LbU<$80$UG9bB ` BR]x#8+'M| 6b&bG{ɝoI@HnWٳ$x6<2X1d "<]=Tp*4(8E-6]Y/B!.ikcDaIQg|\R_g{.3(V?[u(.Lu$vD?x0wѹadZf䥯[FՉEH~QyM.O LJ8HQ!{ję9BFOW{J9'Ӓr Ar[|}Wc-I-Iqa.qFƷ%{dTձ3}/d.FQq:"B̻H [xL8Bx (##Ua7%Td MLLPd5(9aS̹eY+"Xt_UI~1aeHlEf ?3EO!S&K6:xbqeؙ9f[B4d^Cq锑lco#34fJNT\Uh(BOAE9X?RB["'&K$g%w4]bi\M.ܥ AΑC~;u xc!O"2M-4~ˇ1@)$lSçrWGk,á컭ةIYBtP:sU t=؂ye2#>qk*i'$B2pDvBbNKbtCPdr>$?A"d inDnYg@2q{ 9&w-|Աшi0$zmɒ=`q`ܤL顓UXدFdƄlv W$lљQ?IYCb$^auP|b0R$Kߨ Ԛ'V3EZRE.aG $i|1qtJV9b&IC6 HVXM MB0S"'h; `XA. S:(1%9 + 8w80> U`L%^{ ՗CS FRsGFA!\'Q в,*~:c썓J(u*: .Ul:&r VP!GBRYB 0v&] ЁF"!$^/V9ZzBp`MdQۙ(k؜[B 4"ZB 9*U5Ay5;Bb@+jX !")[] Psvdc 2Tu Ò*ja"ru<1*L >_ YE R JBP| !_݉eo'7YM?It*]D(Tr[SCI%l#MVq$s%쐄-|A9d4V :䌆?lP󏄍i#(q4 a ہ3԰ﱑ[M=+K}ē bÄzD| e+ ZD"`Ї"U137GSuC| N̕ t_b҅O~pL%FIw+[HfآN^y'4 qc6LJ!Y2 J*XoŸR3$rSApDO;{zI'TTiܾX)SqE- 2/%j$ȅLO~W`F8D8\rU{+*:gЉι죿~$1Eǡ(+OOEVA n2˕_niYm#M,K4/D ӨuǬ>Gtxephr+bAjCx^:m/zm)QRUE=AպY֧!Ͼ"F؀ᧉheA؋dv@d,'!1AQaq0?[Rbűjd",U[ڮP%QqB2CM۔Ln)[WlTXL$Gd$SB";g:7}@.>^фT,BB RR?*Ope<u{#yCf"7Ms @~fs0 3 1$J *KǭMń9.ZsKƣ@ ?^#b 7翙ݘٚs ++d:W;@6r]؈&q jڃZljҢaԥK21ՙxfn7+˝ioy' p,fl"̩J%VV}rU@Uwzw ȁ>zze8a\|%<ʍݿǡzTj)V~_7k։{͹[ʐ&AއwRA6oe\<&jM^ՊPĠس?Ti(Yϲx$x ye472$-*ѯLF*%vy-Ew=qiqQFB ȵ5όX-@60_b?Kq//&l .0^58;,u͹|m$WiYĢ TЄ+G=@=N]!Z.%UJT#(^K#OL%k|%cpn?O0v)J鷇(;I 1MTh#,&kYkGd+Bi}R;`b `ilʼn\⠳^o ijؼw ŔQ;LE\@WEB170EV^7r|A' +#߸iL`a-Shpz~;U\Z)phcLG5FFG58GW@L7cm ըԪ2>lE)(3JJi*v>80l1ǝB4r?0۳Y7[Jyr~҅qn7 fpj\hTx܂8 ںy'LEu)]y{Py > YɻS*f E^`Op͐ų#WkbnU]'*t1:Wϟf&l^Nt<__?Ϫ5*L~@ ΢.EK_I965}cO 8u~ sxrA)Jj^Du?jC7!/!M(r.)M3W߸S Fohjy6uen". };%gD{b5ӱ[Y# xxUM- ٯh5cԭ9GimXnsQ^ϸgrLZˎHȭhL[uFWuX+8RL*kYZmV[^'jbu{0 یkjϟ C_0 y2y5"V<*+c`Z.6. X~%%m?feܷphir(.'CW Fn_ԡܖhyqnogcD+ W0pD0}@6PZo1C ·/[jE`"TAIgx̖o6[o9/ EZ6ive5nD?] AjL\ikھW+$K.mvuR`Ea?ysF0W~Pf7PB(]2J%gGr1"EZ)^Հv2)ajר/oU <,ܶ޳0v?,ƃm>λ.W7:բYo~}홑%q?BBYר3qKXhxZhi>D_>&SOOҎM*F٧Jej=LD ,\,ǸZ ]Łe.Q\D܂Z-ywG|DƁ{`YeEcT lw3VZ`\ę!0n ) H h2t}̦?(VR 麘v[UG$j7{@դ8[NFnqP#DқǜO'!1AQaq ?ax(窎7YǀiI(?Ėtv3XHѱODv]`dJ%:-x<1:q*U[_.!K_FP\vnhkH81 Z'jjS$)fpScVqO¹8;eF8ǎNjQ%Q.ZxDeE1A:+wW-_4B8 AMAo>d4\;oD=dQ&η8(Z^ bƼ?F_]b.x@`[8qPès8g&#Rvd~~0 朠Xt {D)I\MB `| hQg5d;.!a`F&,dV6jf oA:o2gmM5E&w)&3Иcdچ!톃1e🢆V=ws abD%˨=^Phz?Ðen<9'gd%A Qpw%tRt᯼ ucvq'647OnaxnUz|ߙFʧw :v?)KJ3mZ>1i2|T iw,(י T :8G??F,baѪjp+N! 7|"XkO /[;z-o' 1&h_i|^=DѰ(Ѝ>03NsQ86iݏ#4&0 WV)>qc9 .-ɳHcW(BWv98CJ8KlxJ{,_V^!ҽqSP*Kc l ]_Tj(Qk3g拍 QA_/Xr:v}s[ھcKVtzaP,寧\ J{EMuAXfm@.Le^uMp6o0:v`d:>hG, 0Ҷu1wC!u.(lL%0mcjh#  &q2'.s%TK.Uq[kɺ7 _͝875hݷN8|Al9/ĸ׀W;'!7U8>xg/}+Pjޘ7+Y 42i m|n9^D!-CMuX$R-ip MOfqw;sz*Bvt/]^fd!5qTW &U KqR&izn7F9--I0Ғ܇!cte E6]Wg]O0:#\^/x5%3K{yؙi+)a}cl_ LhǸw/(ºǴ7) kWAM>/~Ď77_>!(ŭmĬ^{g(c̤WyςPCKLWt5]s+aHpE 0Ӿl0EVq~atl֦B?` &2yUvp{`*]q9۪)u1t/ zZ~#!~a{RaXi=d|Ix3;Χ&O8;!˟%u{w2My /+~iȢ"J6hм '6VmWj!` Wz7WVg0Ri-"R5(+͑?m}w|uoNr{Àq57pc`+ݵ>}F 5mkpmcƟ=V 6`^C-{XC>N?`DPC\+vEBmF"&#pFENSz-G7]u]EbZY,03%,f(WQRF%xW5qFqJo}S> Yʛ_b]Q4r B7fZ)H|,ԍdzk~j$F׉W"Ȟ>>$ 81FEQ`?X=G?Y{.S'([\1 Z[O(5eŅ/%_Lq𚈶45~ 6kUƫ5Lϸ Qb)oD9Jʄ%krU@B~vʿ ^E5m .R;` 4XI%ETaEَFNnRKL1pS${:*UU茠[c HQo/4t>Ҁڝ\$(Q.YRd\ռ/ ZDH'좼cȒLH&LRu^WAj5si7- aUc*[ ̜D%n̳rotC+S\PBRJ谉W (.}^goV͎yu4b1V߬kX:K/R.OCӏãj*_Y2}KUBL(df̲YMyTstvT=I6,#: oExzGHiQ^\Ql7Vhpc!D%&ūD{6f^w+]-sr <^"i>HZW6jcPV~CEKޏI tlO۠V=RϤZ"h跲qkX=S+/%zxm E9g1V%@F$A)HoJ& Vf+FTʃh,"ԌAQ1DЧ sFTܵNDh8ZbP-0-pvNDm_Z$4STn7{_Qt0F`\ݱ%-X3>7oǀx&?@*ctd䄄`R+^bMH ?>' ƽUWHt>4\Iiq~1H/TRcTFNRd XVo8v4OFp+9 Rw`uWl_x=X[5SW=B!+ KR'$ԐXd'{+Z?PЫꣃ;]Dݒۂ qq?aƻf1޿ׅX`Af&KN v;1rPLA2ES@sW04ym-ԹYr>U( _1aMIE A d2prz@'Fxb\޳-^hQ:y4/ѮW42yxb[.&U״ϧ=J?2Gi$.#aokvV?1jzZ-x WFȦP_Q݆fRjpހ;2ڱ;lN]e ;5 l[uBfe}FWE`q(4{BAj mo1sFzx֦QQ0^QbXDB5xm NNJz?o,RFHmK3%+Qᐬ¸CcƩωG,ϔzC7U=/dm[Uף,\wqՐЬ@KiGaPRˠ87qeu+1O"@ofp{{@EILlB1pRNƣ*:&,j`pl%8N.]VF,ID<.#&Eۺi-"'pWa^?!{>b)?39#x@M5ڤ!|W"ĥ}.%L(u\^Q$ɡR(oXeZ[B1Nu%N6S1mjX^yq4bܧ"Epf, 5)1+4TdU2 ᆭ p̧,+udw) h$-璥 ]% >$VP2! 3x#:B,iAYK8st>ԅoBšde`O㌸4/gpf Z 5@5wncnzT9`fmǷ(29!|LZyhIs@ţU֭0{hc^ Kr:bb!S)e?mz[{2饥0!ᯑX4A}Z \ e]b&84*t/(,s r54˱6D^ytڊ 9 4DvV-K.{Q5?3w4jzBTAs˟ NK-w[ۗ~мH3/-'cؗz&`wSS@%]@Rժ:sk_w(`Հ1 RQ ÌʜNOCECX5-*8]w votcp q@(Kx 1.j{-@l)q{ B-EE?԰\%0௉dGnb>- dD+je98/}di60/V;(uw(ߗ~̴UIt"k -@"y0>I˂t}׀[YʖLLtX'sԥƌ*V6.=ڜ1mdXȂA34In4H?' y(F&WlzvIHE'EP,sw]Baf :/tٳ˯_aAYY-U}hrLob|jfפפRŊ9a\a&2,:2YqhD*1 |q (QSs$O(ID_.vmd.\ j ZgZA6jS%hb.]#ww<ЪQ[a88 uyGZ@Gx/[+SϬ3-&BlUM*NJ~e?~g.ȱ%lݞZ@]-iCH}C-M_ɳ riw_6>&kU]Jh]f~Z@rY򎦊PfCqma{a{T);Қ:H \q)P,ac2-=uYc 72y5 1"C#jcxa)ƻ՗+00@ȠvBH+`bF0cAӈ+2oj FǙqu~(3To %K >W5 ZG13j UIw J^ab'>`^ߵWl+Xm̜RˋIHU$2N $$N88R-A"v*bͰG* 0_qi#EEGvD:+dY@hf`uAMo*@ JFv&%`PlST`XboEc1 r$À7g1̒vHw 4*KBh kTOIMX#=b=<Խ*c/dK .23j*Q2nͶELp%l MZץ4FU@WنPonTzvenoobkPsLPic_jZ !Yx\dgɯ+e݆ AG * \ңja ;W_;vb犋lT[ |d9Q"$smq %F`zrq:)lAXps ]@,C kM1Y+ϟWU\bln%yunUwp!ھ& Lleb뫎'dѺyWn/u]82ґDTX.w*`sxa=-(}c!$V ^Q)l`2Wgmayavi-4.5.0/docs/source/mayavi/generated_images/example_simple_structured_grid.jpg0000644000076500000240000004142512747716313031433 0ustar prabhustaff00000000000000JFIFC     C  >"  -k @̸ڶ/ 5`kyC_538T`I;\oxUsB–&oav~1]'4*/B _CJ:[|v]Ưwi쫵;Kh՟d9Bǵ:UM|9u+&H|kO^c>Cy3\cVlj~#+0UhCOi9I뭖Dy:SOFJsv?`c>tY7篖׼w2/]֣'Te텱'16:JYapnQhDֶHr/o599zw6i|}WMtY jAk뾨Eti*')L-Qo/d?"R&|m_i9C4>~I&0`}q2'/Yı>?O =d[C&uX8]}x49"7>K241ag,nhH1\rqIUk18H GYBU6\G9o3'7#ݑ80:Y(聹U#4*TDq;Vә'7'c{3T +GUz0jwY3yh m|爰%B[7A̚V6r%NK y ˂ZĊƞ*ojU dk8 M>qbK[ rJ^ìm O\H>GC,6h*'9,V( v*Өu/h~^A*TK'79ddlJec<ĖAi^SNJê-i #OhÎ{9LN!M<']X,]'ȋ"Ifln=X p|]{ph,h5oI&^֢h03])4,iq%f ҶtkˡA:Dl[L#ϟEMh.ֹ/Q@h CF/"+x} 4Vl+'QC覸[-q]UE5awhA\M$'ntp<µ <;(*5j"5?_?!1AQa"2@qB#brR$3Pp?b]u(|-թ';T%K-S *@}C/^eup!)8[Hy«:w/nggP m\k360fg^J&rb `aJFM!djYqBQ!9JHfFnYY))F"|LS'eJrPˀQk4ݘ󹠌 NK#R2=r9rS&@*ўC,e6m~G=9=CmrKU7JnNzs1zq6 Z V˸,ScDk(&fYn]#N"rvJn4i-:-mL:˥ 9ĭtݗ(NeLƫ='$nU+sj 8뀌D59]aTs0R#`VWT;H'JΟ514Wec4I$N}Oںr]*I{)1FJy)ܧLI<8I,1 ~ 9p<* hW6 ZQfl N2a:;F)MKh;DiakxME5ٗt:EمLIf_ HZAF맩+KuUdb19F~Ӳ8e* 줔qV J}R uV-&akhdurTqnæB< N+VTv&erY mzZk<p0cgHjKSrݕRJU:MqKZVb]JN? C~2Mը9q L+ JrqVBiu)҈l\죉̺Tf )RHܡ?Iju|R`u;8V6m{`^Il\}b2Ahb{~.#jU#^=b[m6E C3Jt]UPJ~ ^M"('FgC2mzӝQZpgI NUO)Xˠn:6C}yQWc '?(b]sN3&|5"us>I eԦ'A{ەSWQu'1ᩩUҭW[E ͑ȁ5,Wp$562'٥8Jˈ@./e|t9#{p@XSvyN8Tޜ=DO;NI9>_Ks̘uZ׷函~Vi2owR[Ԭo{&y\d`<2A[#0/??A !1AQ"aq2@B#R3Sr4Pbp?B++h" )qEn2>!x>zGշ4tD>0f9ܔ{3ҒZRmSԵ 6B8DgXQڊࢣ> =G+a*h;~ "F(*g=::a}c=ǘԞbT>"O{!$RIĝ{H Cjlwqvզme[P`Q"S=Fvl]4檪81 ;SUZȨ׈FpKSU1zh3#Nf.x [mi18Q fm>|׋~i'=3>j 6Dqcm2OK:EjP8~iW^VoTnE;I~VG\i{!pi!))Dzm[w_QbH746vU+LG称tצZTIH?Y]zҿDT`"x8 ̦0F*X9Rj3Fz$Z.k|NS&R,&+!HuTztFGQ\/jGO(!GB4WD 11mY6*F&ԡ@Cړkۊxa[iԧpT:bL 5,}%Q1ϭ:akд-*lwZeI?>$ʚJ7qP q:Z9^Zyl/5J+B@mXT[YP S %^] rd)Xa-(GSٍJ-u6J+y+yXz`c֦-BBcPH?-AOP< I Q1dYefo¤D '#Ĺļ)_ڧd1|lpQUaBT=D57m+&y06?[ mIՔ[K BfKj8 ߔ:6Zwmk>_?a.״[S N?gd/ivLN sr=x#FM+[?>$gg.o;H V8=0Gx-jz8I'${p\-T1ԏQ9fjOIT$'31hNCS]-B=Eu#-5^W2?D$Ke)VQRАO@pA[iM)UF0b6V@A.s|l[iъ|?u$9]M@~6L`o;_ \̀Y9o$9ٰ>UM{.6;%P >Sk߇n e-^ Lv;پqm%RLwS#HT啸oK]0F'u, d:Z뻸EM"˨~GhpB3j.U)0|ŗ[yTSe'c P^$Ghז2k(/*nu?lC?[A Cė:r@y{=q ν'cK,%ѓ pmg+ٯ-g)ni/L  !1"AQ2Paq#B $Rb3Sr%4Cd05`c?n=Ẉn:VܣwfЈ3It}WF~Ir:2&h kF3QaJxSl=6WJ1dJ8MkS,T Ӭfҏu+nU$ a8d"-otu+JR A[.EDjIיUӍpkZ[;A JD ٗ PSfœ 7J +UV[+r 57( LD̿)J Y.,],U=1,y]K͊ob ?"˸jvx\Cɦym CJ[̓VZ7ǝN(֟[;hڈ.c- @8y?Зc]BȎ鍨zVEwcrUu,j^ROXD؋-@8HZ/욚uКXM|!2VCG`ǻޣF)V#JCURaۊq7$nKL 8uDb\S*u/ĦmFYU\C6 ֳG7W+u@\⣰m5AȘCeP̄É[ͻ[Y^ң7/lߣRUz:F:ZKO](u$SҦvm*ev+,P|\@O͜%6]5 %e"!:ԱmEVX0'0h2n$a`ZmpX`&bXAmV]E^K>D:8Wa6eKTk!ʨ]Xy@8U]<ܙ|콬_qJjZ+UZEZch3RMB֒8jq4's.w6ܭ>MRK4UU&+@Ihz23EjJE'DV+:aIR-iI=#Ja^i1U|4qe% T򍓡HKgl=k.A]Ǧ]8T{֌发dқN[G32֫zF Ӓaj@:_ZRZӰ-*]2GPRI ʗR bJmY.4!@K&bn$~1e\'ziƉ! |s>ff*wri6W@LYM`}nn}2^r- F+K\Bso=uΡ@RMGͯ6NjN/K,-K0ΩVnҳXyҷWXiCPڪSJHpDk; I6Co)d-+9WFtM3ʳvuVB;W- !-<@O=/JJHy (p9k 2m_=vhSa*\,?dW6CZ)W})QTUc@;tV7ѵ]PJa }KMl,BljR9W6uw0}{'_ys/ϩ Q5uoʥBt唤6RNa4;H[ }+K!y#ylƱ`(D[y#%A ,fA *75S'iX!T}7sNw8]k&ךet5W!'xazd8~1ɇgfԚD쏷xԻ([r 2n$x9 OaQ| xlfY&ҮjZ%tW727o7!4Yh7`)njAf ƚ ϵ XzۨW ޘKpa-TBo{2~reC׆y|PL53c]s3s%5 eÌJM2[M鷺Eh am?Yc9&Щ+CrvuLjK Z]Jcm__]ئε%wCBq%* C4Nߞ26"~Q-=u )GrIJ]<Ƣ:W4'9Gm.ijSJ”n]Y@_d_zZiIMfZn{*)-! T*Óe!T&YA9*Q[2EeXuIQq6/PxV7(al^GꡲJ26ғrPUV_] 򷕲Rmir2>e`\3rr?pICRӿS}2lIzw%KY ,L87 ҃T¦پ*ڊV* ;ރht Ih+'!Zf!52tfڳ#3DW< 2HLmemú!˯M.ҫ-0ɗzФh%\jCzY{Jf~P͙)d9eŲ.O@n_&H}XŒYB$],FY/2X(&u]C+ZB:R(?)!1AQaPq`?!k@w d @=IOK&eLJ8}& ~x?_ښ׳kTAnd8=6U6G0&?\M R?LJ"udSqצSuF7r L3IxOz\K4` P+ґ6Q^0l!?O5z~W]En;3Ho"셦A\y_} 0},w7Nd-m%g`t}t2_CJ󛬺}I% D]#ٰsp!O2A 8j{UB|S*I-X@>œ:eDN[.+(?%.zԆ8Y0wE~Y &v~1Æv>Q.սL5%`ϡj+/lAtJ''H6Mל̬i [{FISH$IFJz"p8 j͔ic;C!LI Ń#mD%T-J]yc 6~쥤#(+ Dq1`1ijd#?NG _y p  ?8ijyL IdQp8suQL:OA8O{/bB]B0'a4<7 XXO/88m0䕧-A9vӆ }$ H2W ${A4. DL}Y*PqIys9[x9XF8=n2TUy ܏eI$F(WJi}t2Jgbr'1I䅌Z:?ˀ>1 kmz?BAfSWڟ.Q|lN@%p_9 9*Wxrbi[K+PXA#S- X Dؓ$ACg$3q)txY,*"\sT3\{ǎ`N.W2xY0GXC3:Q-Bĭʂ$Z' E? *'?D~$Ɉ@s`PkˁR4]Tr˟$ErGaX+a Lيż,!8T=e#28K"{b9m2kPGy@$"lr,0~IЎ<`nǡbCOLt8.ID4D^"[K+yesZlڨT dĀļ$RC9.n \&+c'ه'1XÆ:#5i;K ajm0"kcmfN \aY]@:c/UNN:2pp0c2 QW'hr Ϻ<94vBK|OD$Ok%N{X4S  n?s/ raC57Jx2& *@%bj" Q0*Q=00zYEJ0Be|z &?&!1AQq@aPp?Pi]1w>0L,(4qx0hLph3b a<_ &$rK xPɰT @Wdah{#Fu"Nd97 X|(YGsTKTF`5fN8 AA(`ڄT4*JqS ‡$VFHPD.GU/Dw"P"(y4wAaj~1`Ƣqɋx*` Gd/ zY h6X̭{2C@2L)خja[KB@p9AzXHD$-]_'윭9W~&}Ls )+@yZHmErtj[E#Av\LP -g" Va鵥dPX>GV"c4tp!|̀HȤ4tD~QEƳ`)96owv8""eKʓEL1b54I H)ӳ MftTj2FDU,tts^j`$:ZGH9cEg_mg3IN^?a^ςh<՘m>X VcXjP?7# {.?$.^$ 6t0uaCz 4 kxbm`Ds.t 8tS,A`*Ȓ dszWtuxԑ@utш0X`Nw;PѲ$^ 2J׊S&DH4JM6H$Ww&{b B&PQB$)Ո4hC,Ӆ] G P_8)x{^1eh,Vc'bK4i QM Mo ڡ˜"ӢQu$uSB٤ӄ%@@Ewv2)5H eݰڤE (;J]SicdQ'#RF !=U:i7drDEOc) xe@ui(B5 )TWb 7K0RhHM*BCQU;"]aٗ.6uSH#UbS\U=n I`}BP@Ġ_YhJ}b$pg>i]CiXs"qTLaUХiLPS%`h %iQŽA B<@}4Dn 5n Ƃԏ)W*L8-荑vy!@.8ˍ$s࢏е#D0   ޛF1\`-kB" Rw4ak0u0J Q7fW#֞ZH~ ?񇢶֌cL/0ِȊ <8L&xA8G+I ,/4 )ch*ATE!V@b*D/D h&̴upGE7qrdu':~p(-Ň@p4:0 wN>ũ#jtAB i&l4PR)%l}Us~ѻh.GZX\,FrL(n':b$QoǨ3Μ54?+FWE6XɣO/5DCvo&0_ &pWH'v?Ngi54T^a@ aܠ#nٖGCyЍo;/u>Re-r:PD%#}2L𼞲P +YV\$L| 0 7(]il25_o] iJmXX5ioSv2 C }%` |%IXtSDb1ŏn &X2oi4Hyr6b@C#kF5'`T>D{zkveׂ1UN¬ {ҲÊ}2<61"0A#'!J-si#b]lg sƪA(UV8+IWaQ,rۘ@G`8V@kXWAkj4Ӆ^lX A{;3'[JɘN0>0Ja~F}&uuqPȲv Z0QD?ILq|s /*}Q|0CU_*\EyCOB0:kvT (P)#F>Iag)R'À`??36å3iufCgP GNQh@R ^ݺ)!}^I ݩrA^t,鍒Za!5'@/$K:F[`tRS, h/N"j{72f tV]Km/I ><EM(Dj$oRbiʯ])XgXQC (ɑDC0FBcMsVF@(MVJ ,|ಘTj 8O$z}À#*d HajJ8LK0a stQI;d(QF2+!8M^? )Àki\2#A-"[~O!R˻DEB @}T~" =AOoUE:&Tb? $%,>ZVeV@t42> O4j4"ȶ4ʕ&1Gܡ|4o@}@"6 ǥGI `Amayavi-4.5.0/docs/source/mayavi/generated_images/example_spherical_harmonics.jpg0000644000076500000240000007227212747716313030672 0ustar prabhustaff00000000000000JFIFC     C   "  jM7'gֱCִD8yl+ǼV$TM,,;q?`Re来LK0G o`(5́g~ZrvF b/zTK0x=3AV^5m &g5rdvwR%zŊ3|gZog55ԗcW|juIQ3z2xth:e|\0޾y=v8uvȖpC%В:Lja7^}%Tl\,/`1xؒmc aT y}!LKzhvA>pnlG v({(Ҕa&a᫱.JL|f>}Dߝ6z+ 9/x309Ρ>}f[)c|}>>m=_#UiTNm ZEbe;̍rF%xocǻaxiς8ފd(Թ7X#C~=X+Fծ'4%ĄuD[Z +* j?: =X!g2U+Qs1n?rq$G4n\sgaN9q#v.l6(Omnin$};ݙ3v>MoHpɣ$ tثmJRWԈ|MۗKMcqyEyYz{?~f5umԪ;d87jg7Ez$gapsM. j>tzz7R:ֶZU'8+ zݚz0??Y`le&J^5Jgpd W,۵)w,M@3Ty_dm8 c:tt~%sҕrj|{jB7/Kz9Ey鷝0zgWۅz&C>oVa@v} `-Fƺeo;WO^F UY=%{ ]|GMEM:䑵_UCya((7`՞2PVU_xHk/t03I]NpvQ\h۫3vtzTC_^y47E2w4-l)wE~]IٲhrGNrغs`X;Ohy>w#+ʘQ i5C_1qXzVco=1T,Q;?*r goLc ;`@u:@ɀoW41njT@зjöF/{d Gak_^]4F_q*7:MJ_pt5͍ =)T*]9)OqZ* 0@P!"1jVWKD pGP $u3Q?em)j7,xp71ۋ-v}{kV:Q|zF E,kMS-^L^Hjog]iw8Gj.5,ֵfudƣɝͻ$_ƒ@8ZǢj1tv]ʹLJ.7H!Jٲ0\ } :Ո l㒲wVh yf:݁uy Hj61X9w*Pj~~`R-9&|Ő_-smkanm aQ+^,ڶ+Va6(oP%tu\*[ۏt,MB'1ݮS: '6 _LgbQ Y}`Uk!N"8>ųh,2f&oSA3jh5ز%8zr[q퍺/XĬ$J퍛HXm:ȐφH E{ /a$^"g[C$6͛cliAь?|JRPˊO2yb1 4}Ō;a'()͓+p4u<6ׇ*[3[Ddc<rb+SjJ(m?[؄KX]nx,JRD؉\6U"$/vk5ub@Ṋ֧UUی^Ŋ˾BD#K-nm7mΑfޔ)5I~PwK Gp|cяG:+d(;2YL:>)OQ[6E|rƁfV0XKdQ:Jj{hC{ĉ_݁',Ѵa{(K'&֑3J->{aMR}qO DHVKfxUt{()N\kPͼw ,GnπnV-csT522|Ԝ XUdpExN&8b-'5z; .l1[qLHbJ^[zUPBT;({ z}䀨|d1=b⇴iCkA”q9-kY1Us'0fe/mz_ l Ti1>'*[ Y PPΎ⒕"EDkVLF @n8+8cfi,3E܈C%Ś:1"qfqgci ߨYτӵv4z[Umݩm;9mhI4Ap%j[jl!%T.=y%֊OSÜX^.ޝG~e_DJDykAr 1ʎ}k~!)s"Ҕc=|Nؙ#21G\%nDQϭ1 T @lBBkQm~UE[^f ʁ~,L% +w5vr9CvN'Xa]22q!Gz3g 9R)pnچ)Ŀ;c:gMKc\q`uK]ZؤX]"ՂΝY1]w\ ]q?aASYfhQB:S)ظ;~WJEU ]qjPM̌Tg (qijo6舃+4D z[iRΨMW]vj}H=o*Ң9^59x;9ȁhtP'WkIx3{J9?h R'雒1[3u>O_61L:<~GO>!1AQaq"2 #0R3@B%bC?5%RI"[2.RSdvYl[+'aCͅ*H6\`)*؍(2 O-O+ŭ)<{rZ9#pX8BUr"nqXGSߵ{;+b{̽NV\3#u \Dq:|*$^àޡ]m =YM lCa<RdU`s}5,;&ԙ>& =m}!P{|0a4Y*q&qǫ$/6~{۷LTc(5RLQ̥ǐ6DIY=㇙CҬeҥՑOG=G;=4*N؎wS,1ש:-iP HBl; yUUFRU"e'%Iz<\-K!jQ{rqTlF31MqC7IQ@<uX6XBF+},QDHq2[eѽCq^Շ{:FVtF2w,m_()IoSUr6@/3J)T^<,DNItQRjZ[rV%^|)S-Do}6\]w/Gfޡ:I~d6+Ut齇(JrE +IQ pwC/$bs- S[Bs_)~rTڗ@Zځʱ9c.85䩶=_ K&+%u G8f!ʩ4^3ytgVP)R- ^;eglU3 na2WOzdc*OK<[πÎ3]-Joֶ\ff˩ qrS]Aԫ*Joϲ}R򟥰miYޓO wmiq*5x D-.-J7 Tv0 M *ilv+-AUik(߇PH<?QwCuo ~Bb`C[^أkhMnx)ꈖnc(KfT8)a>#)0 sp&_ጥea]&H*bRRF;;)4ISZoC]dOxn'W:\o94ɺVz> ʥS]$m8T[*{ h'u&\߮ qV:Л'3GjR|m:-dϣK[ZTo3RZ.7#J5/c~w(Bv"Sh{)(#*ӷ3gRǣjɐ7lt>\&KԮv(Ro6O,Q RsfVU*rҡ`m6nړz߲lFG,z)x:?fY9y=$ g><;Q 6,֩81'GW}G=^& !- ڐ iI_e"MW:7uP:U_/NaԎ.*CG\31lqUm[]P-vΞXbŰ+5=m3{*=Oe*[3S3Ht|AÊn3 FJW[Ju~S&f2FDz#$x}j) Dc 2WS2>i_? !1AQa"2 Bq#0R@b4r?K]a.2Fkm ek'Qo\)}yJBJ8h-[wPel8PYEl`I=)zkoȩP K"R *+ tlRfC"mzЌ1Q+h ri䭰ny,miw*WEuwert[sx@u"Ύi7AIU:^eꓐvp頏z"y3%z(D:3![ ̣er~U.%\em꺛9S{BRzqm+2v&Q&Tvs)&TɆhMFYL i^{ aďŜpEW`WM~#q,t:܏)Q yG'jT-+,Vjz7KNM'LvjMS*uii*ٗ.e,ߧRDe %mdgwF1e?7g%RBx᳄6l8puX6Rf)6p gE$N}3 R֖TT)O;:F7m>qDUnQwHܮ x_M&ZIwmmNmOEC mPA-noqֽ^µjL=S]'3Q>[S1k*3&ҒׄL/0:cמ@J(:?Պ353N=N;'t\ S. W̑z̥q @ Rv DT^v^Ex_FSz-d.|{Rx%8ڑbFkn'M!*CBe /W\wAeA=)Ęu*`.eZTR6nts$&%RiM76Et\omN9##<ۓ~ /#yG+K< Ik:/(~#Cb*u'֥``* M/1THljNӯKTirSTT8>MkH`JvO*'ߗyK+i#~RHO<7NXyUƞ9hI'vmk|= "n@+-a֪DD{&waO*K؎ݘsKU"4C: J`t`&bVVKS?ҡjmY$jD:M.k7W?T'e9?O !1AQ"2aq #BR03@Cb$PrS%45csD?t9Eg3RTvI\~\?uVx14}'vUB¶ړsX-?i,9|2V^ɶIEgY“MWwn>9y姝 O0@+%̔ݽgc4y>NZNAh@^QVG3%'k mqlIYS+]8cVfV([.*>窲.%Us^>g,Yj>H ՖkKKyrMj!p$*ŷu1 \HI7'anRjailPT 8vaέ%jY#IQ1+RR$*l[6)]JD d9vJ\'54z!qeKQ”'i1#Mwģh_hH'71WvUrZF HU:,N%l䚊!Y^2-;S"N,md!./j6 KNjPVxBl!3y?jE{He-[m l4U{96;PS2%8RCԊUVeLC#r V\V>]& R|v *О ACQx[Թ%թ)yX3396X<]:E%nJh=EX+:VMVtmS4m2+P'ys(&1|.3h#FcRʔeL;NlAmjtkgf(ĬJ*mR«ՇXRؔ_0[q!IPmOf[{!|!6RL!2JF9۔gR@US6)]Aٰqo[Wiv2IC|ܻMI.@-tDLQTTۭcP-$:l$ bbJw-q񰟺 5 N:OIx4 IhNl>ʸ<"fF o$T0<)tu1}*вy@mgdD.Ctϯ)M|L2N!]ʄд}Pg?Z6qgj5sH=-2{Q?bw I;HUg_ *I>0'DcR=T{F9d꥙=ZV_ávhKOIr d8%nIk>OQ yZn!+8}L dXgXSi]8L2!s711~l(IRW7ƒikUzMV4;pחQg&[H_ j̅pVPCP;0Q&hGE!yj 5LŔ,IiB|!:76zg_ṛ5Ay~8 ymidN["jJ 󲭺L\_ ,m/&րdI*PW{*Vy9]B}ݷEo[bVmXP K[UN:RmkQ\9#)MwQY)9;N\[- էRV!c4Ayg+H &Y:mU:ܾĴX}0Z!%)bNl^U#I)JCj/lmJn jFhCj|RV^7E @=Rd9K yS|a.`:ɺ<*h17E2ns[P} S|J:Z q`mH2Z(glvB|A=ذz2r*&Z}^gLTzI:fU!fmWGwPz9Ӊ Rأ= >Rprm N?i|tQQ׾۾:؄2vj3y7ōO+&cjj,h.WhW#pcI4K)ReR5BAP-sw[q!IPmHJK'H JER2RZKZfZ7ZõJ$Z qkB[zAה%тt8eA36)m\qfx䬼_Wnj ,cS:毬dH#%$ą)Mm٤.5`^xsAJ LѦS.FieKv#hJpzW1=Q}pn:՟| 82ȻchCzS^B$JX#|Ɋrq2ynrS'/nz`*hY*k=r0t]mo4%'6zYNEMʒ2Ր=]&i0\xEaKqY6r35yٻ*`_#?Vb@nUuY'g{XյD1,;5Ìk\U1)0YvU]ۢOqݶ0X ̖znPluptu+/]}RdsM iRNŭI?KERiĵ{sEǰ;z Ufq#>FOA z' JK%}**_I=@6> T]"_Vr6Nc|| QxOYGj,{N,M @s 0E q9E׊֠4I*j}LȤ̦i.;bxF~b%eXS8(B<"R+sϑw 'gHB= պe|#X Tmc[օT~AKKSݷP}*HL+\iA.?yV;D[DRZl%9oJ4+/S| 1юt#4T(Mtۺr(D-m0`ҹwщ$i;9r%(GN.cS.Jd9aU3otYpmA"rfPG6< ].K^ۄP9V )y3_RG/ԯD"cH~G-1 a ؉+05Ԡ~I܆ Kf-'ap H%1}ڔT 5 D['҄C0\|4g0[.W ?1Jj xZ.EdFz}ϺPGdl2qGz=GupbO#2BN鍎S|ӅrȻ$p>Х9oT;Hy9/.qJV&yxu`6<2|0lx[_~Ur[V '̍DX ^xd I{F:EMdyߡ )Ce qT~)қS׀1.m&Ed.uf"ߍvNCZUn7.$=2**:lbufx;|^gz4KȳNσXMT%X,M4αN^#ʵ zDN`AH+cw%Xࡢ1€HUN2Hf&=l*Y|~0U$k<87pY' B2%J#$`Q?ZYZ>23N NY&1ǔA }SjЂVĈDa5b}R"MQ! 'm Qb1+M[i9PӗNTʻdh.?%$8{8z<4ݜ]y`;b'jQ|Ӝē"\v툉5Dp&GfZeK.).m8ׇd'5w;~Hp("zIÒܥYܹ(X~ mKGg{_"ďi3x \[`Dh9&9S>S)Ů~2/GJ#Y4.5Y V67CjE@NKK:Vrs#%ψC匞 €pH?T@R^  Š0ow2V)$*iEݟ(0]7O.IT YJlAƋk# a<{ sv4bRW1x>CrY"Qm@|~ex*{}I\7i9mrz/D"aDd O_A=0Q7s2& {Pшј`'ٸl㳜t NRtC,1ÔR0:FcZ0]ο3զ&\SyJ*;`#VH~+l4 Oi+xWS'An\b_ e /pi1/D~!y2Ә-.x?C"zRttp)o+9K2N@H=}GIPل,#&V.zV&ahiYhbb‚S㬛0 N)1!l C(}myB@Jt!4velS̒gd%sd*lLBAd;pTT cN1ZTȃ=Xw`' Ldh8FHul>`cB i;6gWxEm3$F7._y4Dhω~pi] S2Uqd Ў&$`2 P0SQlU&J aE`5i{! mVMcVT2g-$XŻb^=̟pv<Ȭԅzfx'=?@jqN=P 1+_|p׬JTfQ3E#5}q\aȩF}"ي$`< " |di87¤GfEzM%-&*ӊ 4.ߪ#_r`570y}2h[f'Vk c, + p:6Dm)}bFrP{2}P1&Dx\%XхW--؊A.3N96{:99LP}MC$g0F(sE@\bl|؄dh}CƲ(>'-0(1T؞"xI rFcD$!nT6"c/J y3 ß۳44F#ELMh%ț>p81qse䌉`ʏe#B}:ZZo!/iKb%ޙwX$oh{Go=5#"yaSyx1fN6sk(Wy%7nbhGn"5^g=\d OoXMz:f ) tx!>@ds}XOu o,R-5B,I? &th !?KN| r~޹–+g .)G YoG 6XqEѭb%8 ?xI^^ȇc{$eGLN@)TJ ZӬqwh)2,&WH+"dn)=i 1)?n!洌3Y$=B<xYvp W-$8zp8O"XBk E&uVZ;h^]_FL#!818W UhyiC(8IIفC/d>:vh#ڗ4{d1X1?!2T*1L .A nS 5$' I513>1O| neJL_q?d頧 6:/1 /@K?#@Ha^3_|8Bto֩_ L,Tr2K,Ap0 CBG@i`wqs(X0;$HZP 4@pR+ɐ -ELZWYόcN, Pdr ]4 .W j]9_ >W 7,l)!1AQaq 0@?Jn=]y"QHoǾ( S6 1S(\PECm)z%6rs,} ݕ c'nf5}](1D:ڗsÏEi9,n+Ĥw1) nEP0$1:zHq@IRR8=Hv BI+TG/%ّw"N"sg(` ($!+îφ dۯl~_p=y<}R,G~0pT޾P>:z*ԓ2yuP`U6=an<5X  G GNp8L79)́?d D<$=EmX({/^q/8H&F?VBɕxfQ k0K3*qְX Ru8]N88d\jȴ";!A&ѤY H)B6 8_=A#5Ak&K n@c$nyCЉF ZYh) !UnØ%ÃXf`^e@vd6W8,B$yE  - ; $ňK$&+Z/2m$S짗!M0 d(Y#Km!Pek67`( Z`N'<`.%C bݒkP>2RzE#`DZe=Q׃3d:E@|'t蘢 X6 rb;Ay 1H^'9v,ɀ,@6"fGk:J9!o"#!=CFU-  Tʀ / 9cTt@da`<7qxj\ZNVꎔ!"na؎Ff} GKx(l.pp3Fź<ƅQ8e]nU q",qc=I d2+$= SJY:Ż:eT S Bx(Y${Q4( G@[2eBDTHnQ-:OM& %O=cw${K8o/UUW_ԸjpxoyvN X͆Y-b|[C)pCÀ'׷(!1AQaq 0@?C =%/` >XbJa%k׾1>@KU}+UίW7g`Bjbq̏$!:MN>VU&A` I\ teKkHtd vH;$Kɹ` XhMIB7<Ġ [O{a6ŔujM'X2`<WJA$#Xo9WnX!XzL0/ILM}Xf߄QU{<3dĄJeN yGT6uz?O*^J3Iٿ׶Qb.rہ3 ' 5Rf?mP΁I!X{x"$ҏF&$.P2^&>ijbD<+ȿ@FX0/P%Q ϣKHA$q@pCUȃЁ:A2@@5HH1gR@`M1j huBɵN ϡ|4.HW\B(>⥤RH.4h^@lxh0)$x `(@ǕҋkR;AƇɁ5&DO-}08$?lAd IxB*8qI(,u1c+k> &fi9obM|>Ԋq91"CZ(ARdJT=cRٶg8rM?DX'aOfΈ;lh|x6+J?YK֏X`c`FHi&Ey~qIw- ui'Mg2,& I6r@HBYrNʋD3GI4 tLy4 ÀP`c~'!GEd]wAd b YOOc̙<75@G'( ^ȰPШR0@NGm t4[ZO..@j/(QȎP@Bi#FJM+`E*|G('(7|"vA*=y`ʓ~O‡|ߞraC eP/CV@Px7Fm3V.R f-gX<mLՇ)J #4!3)aWs{) Dq B@P; s<. '6hnP@R,CBL&L4z_B29mhiURAYQ:"#DBڨQWxRzN`}<(Ąkj&iDt1ާQRܹ'M  44CF:]8ur T呝 Gv5+ CYC`Y`~.K!LcoeM3P#`<*#NŔjb#5U (X"iᴡce/# WHh{eZ6A>W}I gጠ)՚иlSyt(ďI]iu)/ø`ƮjI޲lTI HzbfurF-m AzWoKT$0_lJhV6&O{ɦdi.OW/E.|HPOq%ȢU(=|w> j j|yħLFR.́{7X=Z DNxq{숒)+CHCY9J0a0Ch]McT*VGY5@E\>@48l= 8# dLu7$0ShF/4- QZ+"ZA"GqD69aaעk/πjIRM Wz>>ytv%DZ6[uL)ƼeȀ<փU_@S.@Hn&#ӉJ0_0"R]04<(\VRlQ(pDiɣwzūܿ]{?Y^5dViL?$QHMO"#%: x#v'@ uu1Q*iF$Ϡ69VF GY.>%n(:~Kl5 \)V-Ik޺HaCNPZsAɐ^0,Ƞ-([x&h8H:>6žPjÔ T%+iC? ôm\Ѩ wuXPv8 Dpȟ m>4ReP =sANY|0%EyHXK`?1Q#3c_RE@{x{΁Gx:N7(U`F TCn 6P%b@ w[YD4]a3 @6S8-4XxAL`ZYqMR`` ϡ '\I-w$4dP+&1vP~Vj8D6tH?N@B84$0TEØxj!E9NO DN@e p7hWQ E`S'Ujt˚RP ʁw_ VuI4<%"8d4C"Gp" 4V;"TN!61vlÑ E"QQ%odir%da@ʠ+!o4]WuH31Qi [N-_X 濰 l\`teL0BY6_[. ="- MiKz^f+Ke$B I9+`Tl\C'd .7QPV'F΍߂,+ rq%{T9u8,1Ta:J9-YwviSl{ɊD]qԍ*u% n (]"ݔ6*N8N`*h[Fp0۾@b ? {>SZޘ&-u0xucm|ٮT`4c_NLMux32^2%V4 vW]*'fd-f%ƅnoڻ'Qoy蛒5;'B IDW& P5Np:?L"tqD^7"ltI˞KMi|(7RqQ%Ϥ{ !z0[LsQ7KuBݫ.J_L*  S+f"_moe= &9Skz vYOm ☏شA;H .:P)qrfyj1S_~jh?¬nhv˶]ۖaY?)7{S kF$1M@!8e`^CljBBV0$JF / { ">_?!yEMÏtnD103aAW C`5r66>J|hefz"֌ $p<0/A˴d@AԪeoF׫8ȯ'G:xQK%&f(a47틺3sG:D9*h;wf[\4\2+9EбFxųyU{mayavi-4.5.0/docs/source/mayavi/generated_images/example_surface_from_irregular_data.jpg0000644000076500000240000007745312747716313032403 0ustar prabhustaff00000000000000JFIFC     C  >"  ]i[h/Q7TXΫj<}ѝv緮}+qu~AH̭WB@S:mc\nXmJ~]G{ؽwz:ˋf˶om~Z7ft/K^~ (+j[~'+*UmJ?3^·|}GCb6yjCB+G윢Xh﮾e= ^Tr?-]~GrKt`~5WזQĶMOamSaqܼyͥ]'iⓚc^df>892pz፟YTxXe(rޥ/RwN?$^nYwSbtΣ`iVKGM-y iӮUw<}oC6V6s??&R [V1-gUmU {e>ZP=\1}@v-_Yb сͭGWܒ5]f#׹5VBԷ(XK\^(V;]NOD!}YnYNQ}^qhOal>dz[̵LepCHqymu#^W"1z|u.P-)+ni.&rE>y6:]n phTx18qg$f++>->^!rHGaDc[$dh.sx`VCI봦/LKead@5e$>e">w`e1$"-1y67F&g3?C*94tr ["scsC|fj€gj;\ÓӭuyY\z6jɃ%-iݚR<6_W /YXo+r!EW'_L6/iqcؐ̿9&ۃ'/>ܛU&>{!vJ޲=gpM=ՍͱS9 5PrOt:SrJճ̈?%Txp~NEp~إa8v3qn*9Yء*%s%rA_OϘPx ?8#."^{C'3WvL4hsXW:Uwk?-_Юm7bqxa h6$#%fDFHDnȉύ3Aß% ۿ9Z >A-SZ{xyb1]ֿza]޼0L6 =TǢ^#%}\);0!@"#0P %$2pnԪ+}c{u/w7_v4KJ݅4iCvP > onvB{OX{GR uuUޣ-{Tht}++l; j0i^QjT_WIޭcMSq[g:6ge_vѷY+:KMt+*W~@\53nP]'3>vOU ƭיwQVcCweUnt_;Nԋݮ, V5`4^U"E뙴6x(&\Mi} }x3MMxXw(]ylGCd3SF]`,2æB6}r,g غ0EYg6sMb:A]q&R shЦM9+i@,]Pe ŬMk5Zέ'PضՃUcꦔ6Qvj{nц@9`eގu$( )g_n~:*=kP\LHP@-W[WmX.eo%R.o k-^ 54H`l$2x :gW5 3Fݺ_]Orm_6T[;k&mF:Jh7 i\+Zg_}_J|zZk/2>!@Lr#]Epb^u݉Gԯ1dj)-NUy82 ƿވmO}Rؿsm&տ< L A(㟊c -r^|'6"U[uu{I\1% ܀uW(e1L8X0쪶Rs{%MܡB`= jx.z Y#_+u O/PF }weM~:dThetlT@aƫxRhO^VcuUYZڸ..e+#@)&s]l;D@%%+<-Z, G / JDM;n-}[=JvݩG7ڻaqDF_x֌#Cڗ";/XIcsJ"_4CWOl+Rn^Džd%ɑҫkE5. BɬlsgP6VH3%c&i\2-ANyI^x|ybWt#+F$ ݒu@x0>矒+VCO o$>n`)l eۋ,ņ1 f s N|kg A&'KN0ðUUWATnxЍp"pJYn `=] )3N*x7⮲-9f)#V8dEhX3V@kA~JeUu띂V!G eBY%?R?2,au~8GA~ۜE] 1 g$q;h sJby[EیtG`S_ԵT6{Bv 9a{<<^If867^Tsd oeώC:DlNhz U!@v; Bغα+,cYs{4qFKY~ǿ:ӶgTU*W+izuo`c9}cwws}Ӹhښn9$'=8ϰ5/H\zS7:n;ä}8l[?= !1A"Qa#2Bq $0@PR`?--(M1I(P6/qMBNugjɎ XJHu7V0%?.U5'ab뇖l oʓr8o\wiퟏ&bq : KINHm=9(ZBqz+dz־X3Mh2tڰ:ҤAriH# $O].pZ? *Ơ_j/_{ґuO|+ Ę"a`'Nn Y/SR O^ߗuM2ؒ3Q0/*yt{mgšיF{nj9}j9)Kr:Gs5DC%VVkYq :G#u`} ΰ|VDep+rc̚[pQ }d/yR/Rqw<ğ X!aN8k~PWByMӃ Imv^[]yX` bńKGFgXBcҞYH}̐ G4ְPJeNAumSNO*$mt. "BN-νHZMI[|-F2Js]B2ìsD{rlrsoFnut!ҁkOư>BȠv˸ =!^]ihkʠ](&(jZ"oEI)+M>}%<'4+6ʚ=mXa*xpKr\eQ5%\[դ:ۛ\FX> ޖ;)v$\P_: jnLgIJ9ReIZOT>U6vl&v:d=Xtm*<Ԯ_܎0Ub8܅>?J~[k7deVX+08[#7):MS#4u'(v\e&MyTJJSN-7]M)V޼ۏLV&ʩg F΃zpqNEINVSiiڗ]Z]XV:|Gj^ѧ-j9o ,>HE^@iz*8|+{ud]ML M77 kx7 ú KKir{j j-dZSN " y6!`ZaU jz0/f#Z{)tkiz`kGmN^:*zҘe+ԧ_R Tk{=t{)J,*|mQWR**c(̳pE_Qi4!1"ڸ:dQ% YG)*Ie˳391|ڔ$r?^PeNqPDǚ+_Rild ״mU\Rw'+PHHwCxoV10í<d]d¦C?p>#X] !i˸ϩ;.t:FCc-6[)7?Dy{'?rI&:Qt6_xgrq9Ӕ~zUkJQK3 E+o>ˏq&nY-Bo H3Q3eZyfRPj0O="O ˠ2w% {@D ܺ+CԠQW5Eʫ؋r1\0JKk 3\UpjD%:^i+4J=FŪi A-Ou8o)Җy^?Lqaoabnș9`R"jT]IHnxBֳaFqd Sr8/~qN2&NP?he9v1.ҭuhu,=|2¤^DyD̪.lI&M=gۄ;ǐSNྵ%;o+$}NK[jTO#Xcxi"lS:ߧi.;ÉeٍbE`킹Crf?.mD.&Q&=-#2lDH 3K6DK6#a UͶ2ax 9=eoJ2U?tf۞<[6Ru'򄗝8nS"MhzPQ3}tE'XyVB8RO8Y RlDLK'&Q$i !wPş&A ^Y T1*rX`< b^gHKib( )s(tlϸ A&'}6yً[:׆q|&;)C!N3-z(k 2pm',4ۥdiK(!PMflv0*Nd0e%"wa-Gνa)Jc Ij Wtz{rOtS!Z_ɂI?C#$!,-[]e6 B?Nkp'I S|Zӻ4䔲b^W|xGW+tiZm5B@F`m[_o]&yt3wdӷ4̦"ɺڬBړrF jQzRu$ů4S Ji`´m! 0!E!ݦ_ev'g/8T#,PWm',[N}ڡ o/ m"SOʞgn;:"!@|5a ;72Rm\Rzݱy^VF|UU Ѷ[껁zvdm_w)Kva Q7)j'5fٴSgAi,r9ijؒ7" JD~ [&HLzA`Kݮ 3;ISC0qj0r @RK\-Uh#? 6ZTGv`˭W\h -!!vy& "#1]c8V9*%8GUE3HUB+tHzsS.:T5Uykdk<0Á 5A,Vo[~`L*C+[j iU0[ZHU:]ka'Kekq7. g K7mY7gFbZZުBag[|և@gZHTʐaɹeӔ Ƃ~Y._ nDC0x reuRJPsW3'v^M ] Z2h([s MhSg1 I@wʇCchü Oz(L_~Ӛp,ÎM1קU5z +֔Hrr]Mp@r+w_r#;QPSsal`+%dsUCNp di)jQq`2kPZˊ%6i}ea̔I|SVQmzle\dKN?)&`XT iæPasO9m:Ryhr~qRMp&ByrRA⣢<஺hRi ]9_ cv`e$id0vL{W|O.}s\vRNqf@8#j⬹ZxīMD8Ι~P96m_Kt(qs .Jcge\f4KW "tiBLle7GmL F[Ey-dpZVUG9K5|=`&BI\>XͶ[(b%׽mB\!*RML)Q6~Ўp#= B ˬP*q()h֜O=0N᪔$»)ڬb٩|ܙU/j(L!ڪ?PzЪ}=xJʢ]!vڑ*x.'^}Mk o'8^"SyPtjyvȯAWV&@B2bm5W$ߜ2W}*s&tL2S-yht0X^AS H$*k ŤWE6_wU7WAIaskS,# EAqcd>̫/;5U DӅ'!z6xl6+Xܸ~Fiڥ9 gBZP!4m٩Nn%iÜWطp jz5qYViB50wX[[E\ER?i)% ҤBXKm6 DJؓULu¥ۮW.Q/URtTznVJs/i Po cN(GB *|Et~2TE{ԲJ_ğ +!%*;&vϕ!1.Ḩ̂kZ-= \>'blݥEjOz bRlRwRM(i9qbq//T6KWRphuvvy4(۫rfu.KFڎ06iglB٨VFQ-(SPJNq2⽧yUƽcQ&@\~Jk JtP6GpCu"bm!.|ʴJB^jew'y1I@ˆ۾=T4y]()Q7A1Ke3OX.|#]c RKĞJVwcMtXŻ̤œjYub_.WzIqJ-!.);k( eCNUŨ:˄mUjA-Bث˭4g(|&6P%2`nSBR zÓrHtRO\)mwRcl>Ffy8] mg6iYH* !UUi U6XCPrژqnT(yl nBugQ{)6o̬P%[vL.ac5s)~Suh(ipY@*O@Um>X٩HP xfZ'6KIAJXy;<5m3^qH/!Y{FYZu8&Y`q*涉l~FU`a)U%XAq6I㾊mRQ%*@*M@W(P8+"X4 ,2Rȫ6*83;j5OV}6tC{BkαoO6C201;T`z35.m|" }fHi(\ˢIRHrlV: 0elAq%ԨZW^ `:r-rfܶ R $/.qrB}S% 6tAB^X="w=0۽ܴmE:B{5Hf V/=l];*pi^}i e8U+A1#h~JNt *k pVqDDg0xg2zkwh APה [u9wINPUPn}6Hg9br0JƝM L*iXiĤqt@jΜO{V +9 <3v Ù^ 6QmV|Xx١FJ 8ҪUEuA=d6+!B YH*bEM`=EM<0 r)I!N8 xEH#*$I_ m+XCWcem% -Cv߶$Sd>ww?nNU@ChNH\ZD$GH\ %4 x VH#jJ]7-I-V@un] L.,lrgm@fj v%OJr 8RQjaXSipqop%} KsMS7_%HݴV \cbW6ƻ ` S}Z>F&\SS}К J4HmHNJLy>6&';1/8$ް62zзUۧ(A2&4 y^z,r ML^S tnO{N˾;)&"@iZaוֹB$*BZOJˤ9q\DXQN_8fȢs~aCK^#6&8K/%bgJZC@iL_ wqIRRTnaVH%xu1fV-l~0 Th4PҪB5%h\W>69!aw݀ %IȮ1p ) %YC!^q9rQ49 sTϥ/<氌'.8 f̞'gUfS4˅ ږ݊ryNvX|R3e](0 \51'!Hӟ9NtMcDdS2U8Pm@)C/8aTUsY\ѱz]mޔ_(U'ʆ%{5"ڎ~`}~~lL&~:8 aS.\ ,!GBe}Ǥ.xԟ-m[A%V7@KtG*_ ݍ̪;S;k@$4ӌ&Kh@Cw*:S]e*:j}J7&rKΟ]8&EٶuV|}at F{iDgFNUc3 XCx*UԺO!0W&ԔI)$󦐜s vU D(2v:ETZ۫o>2qjT)\Mќ9`km03OV  Lr3 I/}1µz%i=,\i*MAP5qZry_bJέ_h254kI9P^iouI`eASI#$}axge0͂])K*S>dg4eZ)$PyI# hNUIK@i(쬘x)Eܭ*@ |,!1AQaq@P0 p?!iDjAeՌ{@çit 74NDK!6~nqMbP@8$r7wyo_2: F4y酋;(>w >,h*q,s4reJj*fD(2 ,_Ƨi)M&3NQu@5݀CxpkҺ|1V&˱ڵdd `6_T}1C[^nVTur6ש4 ~|\4`rxԑWŸYPw]f?F ~NJn#يF^φ]*>`D%dz{7|@j#"XϹPE]@3Erh[Q)dߴ]A1t%\p(l/xQ`#V,{FqT`tbRr [d9$jLrz[8k/5n1.B1̰  `sjꬾlsB.Os0W&ج@rMF>nYCZ_ˍ.t"MpP[ݾt÷{qt `)û~-,/\ķJ]Vl0^lO^eCueZ=~ghm.]7r ][K?|[c%IA]X!d&ʪ͟\։R,8G܉K@_MPVWxlMyo--\@nZ%E6ZWϪ0䜿&#{P5-o{};M+Z΅jc`펜*`[TӪM>s]RIj_cZ*'^Í5!u>Z{sN&*0]*\停B`XU0.FψU0r+ZI aVq,9:XSmXe8#Ǩ/e X?"i_[rȳYA7ZX x? 6)baftf y<d Vg22Gµea p c{0G:b:T"2lïUYKpFI7,&VL6t܆n{<^]J77-9/8AGexѡz5N_X1믌c,%QlF;P QUIb\SuU.Z4Z~%B"^3ĨP{|DyFV ʶa 캫ɿז5}n[\"w<O8t18 IkⳞ!\Fw }ʡoJ b{j`ӟ ,UAΪǻPGCk]Ye1i [FnjEXf BOO gfhԓ72(MZl`ڗ/`*l櫽" a]WD:aSeJƵ2HUy^V~BGZ }.xA V+Vi|F90S7q3p~6,).IV߉Q^[01ET/=%$a7WB!b-K"RO0 /Y!I-aZcH.Wizfwq[j<ѿ-;#zմ#{"gjsH+#Ӂb XRXꞝ4U>o:iho]S1# '$(aXy랣1@S*Esy+/qvS!ErU6"ʾ!BP#/CP~t`T w _db3 J#~D ^~(9Xt;zh: iG"D^3~__6R׌kR)9 u*zne]$t'_[`ޚMAvN8p.Ѿ|ƚJ{Kp OK{fLE@6꩹=ג2ڨ}!$$H^c3 S!(|]3 ansLYBbn[;ž-藝c'd_!(N(E\m'JC\F @_ ^] lOLCSڬazI][sP"fxGO.f*)ۿo ?0BǑ2/DphR漜3J േfew9[BZ1D1fش גx"V0%:t[ @jLf|S+̲By̽ <;54<\,dnƿ+/g` UdO1Fd<,hYas%3.c՛,m9 @PxjC/v9Q=lu3 |KrʟF%z6$9eߕ aKP4AIJ:#";kэ2Er\@(1-Ѱr7 =Y=Pbk5qp<_3+N2p6ʿ\E7m="E "y0)uI pa@"Ebh茈ST!Pde4@ "TRLC8gb]?A4P{Yד pj̞g Ϝ KI8{'M S F(*5(Yمv ނXcv!){y+6G1%.L OÃDMk$hPR^br3GąqaYf Dj!°$C--'hQxYBAx^}2.82)EWNoT?7B "'n##=䦈PjI u5^rG\ Yd$+& CR{@4&Mtˁr҇'Bn{\J)wLL9dzIG8uH~L`K}=_8nӅ Q޲ \>:8W(@v:$uRT.?Ȉ=8mb[k6C#(/&pĐ"Л/&m>"Lu1\4Z~Z׬DbAK<|>NkE‹}_/30ݳ|&Uws &[o{F.֍̣Ziv):0 /+!1AQaq0 @P`? 'SCX/UMX!`U`Ҫ>gyҿ轠= "CBJ%E`L(n 8BOV^3rVQu{B ˝!C*,*x&@o~+51%u\ /U8)M#^Ag mpڱߚǚQ^  րWKÿQG=yo(WKOi=m}!r TJ{9>2M7'^0ҵTrSf9Iʁ r#U lW'SVxz~X6cxY*@;&%(_]sh%Wps}ʵ# 0|ZV,ʧjWi Pz+= n}j' ,G[]+:P] 6m]rHS[ussͨ5({SI|KcO䮛.J!ȉ;3ZHO$' G+-ڀS Q)*jpN؜uUR.%1Y"ljZݞ+ Clj){ǟyE48vthr߯v>:ËPN10趁4[|I R׷נWƏ7OXwIo6 I_#׏ `Wp?8~ dChRB# Et!FS.p l 4t)C:#B^U~f;i:S/S>[8T~t|r~/b_~h|x]xB;fȳp.v0uSO~p=ҴaE-S߶Dd8 A.uM6}YdL$#vb@]XoguP`y;z5c)Aʷ\m|OxYCMϫ j凘~B!8y (;x>:Z&7/g :hJ| N9CП pn[Eu 5V̡bO w` 8%4s $TI9k3B{;Y~x(Tm}s@~r'$O$I~-`99U|`+g&%a{17/Ǎk6mN#w7YKxO=iJj!ĥ+é8EӼs| JJDwNS8c py`D>nK8D3@q?[q&Eq ׌u#vN;쇟ٞ3g?X97AH]n*(_fCx.kֱºgbpDcuA4favǢx;Ń" Imm~>jW8Q9־*֬Pje^>LCc ,ڏx @C)os̩%]y_{4%1 Ƨʯkw~ FoSQ[ai+#Z}lSyXceB>mB( GM9ycF74Qy dZmW[CS@')@c'; g4GG袐3%5ӥKS,!1AQaq@0P p?/ :!\m̈OD{cT MKx *X%n*֜v M#S9IgUUVJ!S@y@8GsbH"> 09TGB- #:UO9YӚDt.J2P~ . wP!D#tsX*T\4Ƀ-joٽ=AOW|AC noi5󯅢p^ؖiz{ƗVn6Ђw umm6`CAVsY~ 0=u6NE)ueJ& Z찵Z)Du\Ff($n(i4bx&EtR$a cwJos]Q_*B7&P!UmS{ŴH mF/b{yۨU:59)^ʳC 4ТtlFA{2&;$vN,O*~?>m hs\ Nap9qk]DY44҈Ns=DUdPB) ZHlp6 ż L%M&=0 uecvT[7Nfu޲vѱ/ShCG8SqP (εϬ b4@:y$Jp3Kz6]g+ۂH.pk7iNVaZ$rY-`shΘT w!@pbQ;QEc%Q_9d8o.DCxcZg&̤-H,>Lr! 2ZAzTEx @G- t(c!)z o|LeWp1aZ#х&TXxH#"զp_$Xyz%9BGҌ^[oN,\U3}|50q޶8l+]G_wsYr$aRlkhf Xrz&"g¼Er<1p)QCnpXGz'r~2H`(R #=a{ P rSP)Pu OgOH&P45lLe07(^%l Ltl.%|3u960КvTEx9ޱGibY*Dv6{=H oxL:\33gw;M:h͝U6y+1a$/c^kfBvu^pzVK> / 2-yT~فB;/8#yG[<_\у)%WC=c„J ZW'cuG/+`PpAU ID<+e\vAxc :io. 1cىI\SC"Fy!$=;/OgFlD mI-ᑇሒc_-!t2G}]6#|tq O%s=i j 728Xill{rmY oS+ Nx=&X3+川o5N@­1*PM'>4ܺDIWn%bF0LW,6U;çxaHr~#D>4r|qչ?&%LAC PAP2pd$Zt jMW fuJ (~;ƅ5LUk4j zslt׼A1-JdPPZ*4N<(lGSn? H"jg* :uj< okQF`WoE5,yq8=cSlTNr{rs;֞| 7*ixDqW:&;dIxY?xT4=.X,vɃ}oy?_wjhm2Amis@BXIoiJ% 00{Zv\Uගx ?wϠjؠPf4#$;~pytğ7w׼;"GX"~>2(=8ͺXOz8صK ت!j\o=S<bF3lO'2##-Z p&FݪƦV/,Jkce_\ya*!kF]qu;s9f͟zF7S%S8}h-ҧ F(z`P;LX4?cYP‹#Db[/vYYً&R'ppßlt˧}i D{&z$5GDth5Tit8Gn@|&n>7B@v9ѕ0E6/*x!;Gw+_LsLA 09gO֜'xڼ.4ܫ38_kNE۸-B\DK"L- .1O6F+1|X -͓ u׻Ǽڠ4Y.y52r f+䃤yѿt"ښz+{tl AC~J ND_^{3r >0X{~p潢 ;-מ ϐS"2lyGDr~Z Ɖ%/9LJ]}̫X#IZ; ` *rF_Bd1͔Nzق;y[E%j`f /Ԑp.V4:OY%]e{3U-5v>$t hFԓ f\Rމu*mT:N_U?$O-h|~av>3Ap;vCs[V]`گw6X<*Q:s*Tp̢< 0' ;w7~7'bB+i$AGD@UkA. PAJ:?~DOhCBRNLkCC ׈PbUj w>XI/󈈣pM ? ;}gm X@@OXdIq/?!2maBg}'4 Li#~Oq0Il8d`0ƀ)F+ O꒢zZq..*LB SnPYZ%ߜ0Ya ] Q8Ȼ:9o aNXلƈh{޽3 jʹ HDC xP>>_XJD5'5ήlHA[Z'ԮO$p | D3j N= `W_'$i@Zf4ːœN 2DMWUdːsxT8>2pu4d,DM J8?YvCA$͹iCưa Go`)퇃6FK-Oe*PRu]a9֫G8sH#Jl W,Y+f@5߯> W W#88މRA*V>xpPk,S8S{87$咿<"KgL mEchnJ ݥtC92i,xKۄ7>N1c c˜Nׯg!C+t8p|L?& ` d.ӈ.`j +|\ cADHsFPfJ1[o˄恢:{8!AFu2(z9і /8OrQyx1ظB=DJ[F(L!/9A7  %? 2䕨B#1vZU7d@ (#=&iGs)#qGoA4}E4"Ҁ@lA@0`)pn1똥m&Uՠ-mayavi-4.5.0/docs/source/mayavi/generated_images/example_tvtk_in_mayavi.jpg0000644000076500000240000002120112747716313027663 0ustar prabhustaff00000000000000JFIFC     C  >"  0Ʋc-S,CKG^t"zԍ*[jZTGvη=<^MulAO~6BZ+taKz1v5:9p纗3lVy7; = ArѦ]=X.rSl}Sv巢YQ7{g:YS  Q^6'd%|x\.yOA\Hrw~SW&fgH\Fڣ*df-Dnꔔr/OC7]N盹LMܽ'{5byZ"UOKIYl;\gfbPr\10tS+.y; $3me\ldwdPQzU"nσwm*0@P 67^z|}gqFY` :@>diD f6Ճ=!ٶ_K.;"E(Q]kdSpltg/4E4k4g5mSDsbWJvzz[~Erj ֯X\d䝜vqjľ \)LLwMSKVFUu3n>*ǪogOCO^"YA/gG\M{*}鋻$[ڴ7Wj$!*j:bhHsdvpՇq`ՐUGe2GhAu Tw`D`+!C@̸TS5 )#r"h׏ C?ژ-~5;mqǪKg"6޶awyRPg+Nú츺2HTk0Wؚٮg'hB{ e_XC*Pp<W$+eE$uV4;Xj=k[@J)MĪ:,Mbq>YdlزFZz >Z0D |3gn&4l6 [`z8/+&<2y ^ !7h]4 !1AQ "0ap23@bqё?C ;124ڳG1&Ae JE=pXZ$$efMHCxUMy 8(N3i& Vա6ҕ 'M[Ɋ[Ȓ§?uoc܂?OƤ tKS%Ix}5umjoRf >u[0(mB֛ Fh_@ }\>uyD#>H  S/jD-)38qxauxUOROop->(7jݹ hc27e.4"+(!cΪPԒ*/BIk DI2GtKպqJrMILk'(rel˪pgz1S=!NaH4 (H.!ٌ yaժ*("S.tb ʸ%,6Yq51]1p[c)["bQH!"1AQq2Ba#0@PRSbrt $%3CD?dgSa{bTwtfʞX7W}JVp- ,[;έd꒫y}zģ|0QAYڴW+Ӕ]L=%ґ+KRU/MBDcbF4= E*$]u`]VY/uj6 Z"C#cʥ"GFw?#Sa5|ipZIc PRT.<(0 K8VwZ1W;-Woz ]"UCa.ITNrnY?,V7'͑q~q@a2s*Uұql-ւdJ! ׺S>Kpk: P f2WWCi]jKᖕ>gMˇ h~ɔ8qnҫ:k=2{bBl8C ) ROX:#䈭,Dz|.F'){#U xz}S+H{kUNl1$I'9W4Eښ|fAiTO 2F`BU}{3 3,:z&ԎwLyhI M/8S !HuknDr[m2 񎌅Q_ CoDV:o~KB5(Kd(:W O/ CRlH8k7~AhճѥwP~9=W/Y=~"^׬dgO8OT֭犔}8j9(O[׻ʹ)]0#AޑSexJS[8CM>}b7~ՃCGnFDmR:adCiM$-3r",?&LB>Ɔ Or32S:dfYmpڃފ\PfҼ\@z2ʡF=T|w:E[Գa[ajo9^lJ6zc[zeBs>u% Mz<6sNDsG)2Zwe ^QŀR]٪B>ˎ̖J'Uuܨӭ.]ӕji ^F&2`$+Oq\U+j>d<1RISܶHJ>$ĸwMFR),i!6;hgU,\8QNlFG\4r&*XM&iI $俽GOm؊dsU$ƒYPG1)" =P:z#TB͓U6z16Wej'f\Em^|0lkQaT%h*KI=û,1/p==*="*}H7ItXçgvƮ'[{-XH%+|VOah)l"i%nFa uY3+gU){ Kq;ter,KqszYAVf2ߖS1 ֜ 25lӻt!!o-t[ؐ+2AyO+뎏L7{e儻\D!R%͈%5DJ_uv͇ Bq!FJO0oa<_YeDV i&Tz##qk,5YUܩll(r$\*ʫ 83 vu8YXMBs!L`,|Pԑ)!1AQaq0P@?!,AsI^H[%Tp!=z 5^ҖA0/goUKyPd{Ug7T.BCK2= D_J$2nUtd"I ^Nׯ8R|`Kp:(\ԷE,vI%'4"y/b4rhGD` WJ$Bl]ҟ5K:Tʊ-Eq} s99WæXP S _WOU3YBƱCFXğ{4# uAҎK璃܋{)Xr√м\_m)E;0_E#Ȃa_FqT[D{ A]K >rudYB[z3`Emax]R&L vj` ܳ GXߚ=i,:T1Za9SKOqDdM]멉ie t٣fu# uĒ_ !Ðiޘ#&RR*,b#d 2>\/ه\/"2B|zK,VkA<6,܄!@˗"́G+Fn$L@} LUa^A5h^}@[KHw{TBȄ\ȸL^0X @e!MFז(ְNt1 {z*Dv7-HB<Ȕ:) ,lqX .5.?ZyXNp]6bě ڱEs@H.RPh(Nrfx hkIȔ#fjAܻjGBRvZ] R9^%ē ^-bؘw ]/HQ!A<^!]tlK bIq`Ri4fNxLҎew/ l/,&h ,N $LWOAn(EXZ%a ) B0@)!1AQaq 0@p? d~\%OsV0Z^'KĆ*wZ`k̖A=LDi+seOi%{7x#x﷨OiM(#?Pw$Rпy"R ~rVXݍ0ch5}'H3;趾\*Z2%/^I7]T{ Jfx~شL%ƏB6>͞h4 bKJ!8+=K5!$O9Jy#vL"t hɩ)iqqH4֑K ֈx+kl1$AVINՐl-K yJ=:`>ضYZm-c՗'!1A Qa0@pq?77!U0{Q[X ]\k!I]Z%O0 4EJ#uq1}9g>[X7^ѶI`__ +oS= \eTT]P%^".~ GQ+0 ļ%`%W.)J1&!1AQq0a@P ?@!b¸^ںc˩YAEఀP@7k拰ol*2 $tBH2 z>n "ee=pNDWH?Ky 4MZ Vz_$7@WB;b:쨊xaq""&#{Jfd2ĸv 5;PRfI5@Fs-v#/YG4AGlTܠ j"E`ƚ>8t(B+|#o (aƋaCGB Hv^! WZ?=J<BwqwX %n QX7_Pc2Џv9OJ P$q1RyfЖ!32,UVR/hI P8 8`Q=L ;MD!;hti€7ȯ*|3rmml$kjP$7: O3RdLe3Q-2@ĵ3 Ugޫܗgu ^>t"po&rR @כ=*;chi+ n`:f*N AuUE24%fQK'j@#S=_/ruDŽKݢ }W ׀/pmLB F|tGPIG0 5FO|waޱ3/V0W16B*m" h(*ƅbiFRHʾU56:xhz 5O"q ]34}uM(jrѨ` Q P/8@)(p ԍ[ٵ6:.Ro\0LUyCgaU|qA 9,yBZzV 2#L<Bi$*!E9;J; B8VF^! !n Y+z:^mMв[4Qu~ ڊd.gC]5Ĥޅ GCj^ũd|^G8"AK؀뚙u+<8cF5 A1n2B$,`|\(D&#[cob'ټ!mSߵ"++4)#KC%01*QC2@WvD|Z.a2H /yxD/V'u#B 5(ǻqhB0~FK"q3p/G8^b<E_~4gMRh]<ct fmayavi-4.5.0/docs/source/mayavi/generated_images/example_wigner.jpg0000644000076500000240000005525512747716313026152 0ustar prabhustaff00000000000000JFIFC     C  " otKC_=T*~zYsah P+=͍۫9}ҍu?7A }\s혨[t3'XP<@+3bXfezTRd9v=io&Ō%tOn?+, P:!AkQk/5Pm6Pԡ^\v\Z=cʚ'ސ:Mj:'p-{n|,ՐՊ婎ǹ~O7 oZa@ ۛ:̤k9JX0hɈbcI+Su&n}hr62 3cπ6zͦ[WF7x_ |Rܮzm93a͘!a9{CYŔ{1Ԭю~-#/rމ٣S0ĬqZͫyD½0[_9|.W^;=>m d,>R`ɌYJ3rB\9q|䪙UGVy۳N#v,}+]4i/QnHj:6Yޣ8Vu"FQXsK LC1CL{Oŏ~Q=QLҿJ>S$Jŏ$J.dnq~gY uOӿrO[Q>{D~)C ١~%#CeŬ6U;X%oۮC[g,ym$m~xi<{ 5iU֙{σ`E,zVzGgC 7UkNF]^IsIDl:-_6W`ۀ , $4^Iny$C|L0=ɑ2c?5 !3@P$%1467"#0'25`︢s*ZPU  DpV^G_lv(Oʤ"'lf(a OQ z"͊T \-7^ (Y* pyV? >%1{ڷ.7ǹ8u͍cHKN*H&'(|1LnnT2cellLiF&0pxZqsu'4`!a6s6/ C)d")6MsT#>)W4V"ֽ,ƒ$IL9(M}rq2Ƒu^ĭ9uc_3W>["))[R'M&6kRSTݖY쥢5N T͵mz>ӳ8fUNbpI Ee =Hg@OcڛUDZAP UyP։(y'b9WT `CZ`/AFN]γaBc~+͢K !8 UvҹvȺ+W,6Vŵ :TVƇc֤G-+r`W3hQQsW*Ee =Hg@OepI4$ vHƃ/u  3';D<ӟ<,@EBHg_NY3ضE<1oD:ʼK-M(dNFbA1zmߚ>Je 8>04lOXnbAD[Bw`*5M7N$t -/ڳgi׎?KRWF,f-a F êf>S5֝extrm;Cy՟ps;>twHRQclx LkXPX|>qe\;Kefv%IxrG|E!RC-6Nh^]Fح@e9 ϸ#;Ko{$T{ykŖvQna\PlޢX ۸5!>i?BO1W2X&cqM#w7PK%KRmm軐Rϭ$JCKj6)衣VUkR#Y O-{Hg;9얬qZk/1W2XǮa/ [$X #bxja/cpd=V-i$حe2&=( }RtX!Ut= CZy-X.2RÀL5s[ސ364k N)Jc#D|K+U'߭^sH)"PB\o/실Z5qGSj&LBNGu(ӻ6^{(7VTui+$Zw%lQL%Ri\y`<]R@v_tp~NJv5]Kieqۏ8Ou,8Q.whX֖i%_iC0[iu]Z+J4e 4䅖`Ե-Ym;.bW5V6jCmAzztĿU4TeYLkZD fd, g,ٻſՄ9h>VEWP>CITǿF/?Svȯjza fd&(>KGF%::޲zWM7XJ9cf noKzJ3v*%m|GQCeT(6 rrlgdHj뤾iU65)Ǻm[ӝ=.)4EF$.,%o-y/lk\z:f,8³jT{IDD7>ʭQlW3A˨6žq>D, gox=X⵼c V9?^%zt6_R3jڷ@סl>yHgׄ.#%.r+e<޶>[m/!/2BJX#"u/sѣ޺w;qqX𒚖HROCl)}-7t}4: }26-2xW)Iqv_ BV]ڈ|vep[ ;bMb79y#b|˯c$.β^Z>f]%i H[ eL8gdCm/NLؗ M5zCn0˹{j$pn_eJ$%:-rk ԟT"NI8놈Bf4G'ɺә];k0yo<)<^8[-%,.ᳲ8lUZE' a/.ZA9?ʘhgF'"_*Y;k&rJg:nVb%"R_[0m\9%%W3)B$Sh fcA1MLDrxi; 9p(qYRnp/ ݴs_WKkNd.wIK˥ff,CXv$իCx)QJQlT ֑-ԓ}r[gG%D_KH2A&9:ZPJfbVF]ϫv}_t3+.쫍WG85P+JxRL5]e\i)2X2EU)/8G'-+IuS:N,U2+>xmDU b3SmK* لlq+̄yCHFKM3M^h)œY|O~;c8ҪʗZiqQm8\JbBNc:Ō_ q4DS몽*qCT՚~؞v-үwӘru.m'^laN|Q*Ɛ,ZXNY8)_y!I>ȞƸ >0NH=tJe\݋t0ɒG8D9r%ƍIHޣz6E5'i1&h[RzF%1ޔT2m"7'"Y&QຂדNcgéZ}F&HYV|_gs ֽ$odaoN=,J}S%DsD˚6QԔ DաyiՖ.JDafR I:N3zѤ֝{IR㊹kVg/S;/2($Iښe͉POi}ÉFNw?(@z8W6[RBQ Y=>8k/=_)v"foRpWsL\]iI=w8CJ!Č 6ʮD>v-үwӘru.m'^laN|Q*Ɛ,ZX8C:ω^Eہ6@$ a ˭3Ja6rx3)k Ęi. J]i{A#bJshqkҤa\!2&"e!5%Dsٜ~|f-BۚŴ[}17LM8Ш[ KN6&&%* \θ_-ZY2˫SewOni%.-LJa*(ba XFxM>[mJV[92iM51 rD=*)&LܢU.k=NMW6w;ct:R@鯬qaL1 <RSnOO0YZ֛ZAM!anQ \`(4$DD;AV4Y[90&pM aƢ"US ލ8ĹEe1-pBn*&$T%WB˰%JPIwˏ[JXj[4R_B6$R?(ҐBQ. F0Km*2P"ԿǗ1IkIE2:sk uIvځZ',ymgDhU5a`ZFZҌ@I#bX.!*qQk¤lT^rYJ6y.Ի@3Rk>$oFb\ m15!2BBkp\ R9V4zN^a Tgp+NH2k$?ZӼl aVQJ師x#mgDhU5Su TMD(]m'm;;#{OԯZmhv+5]wu_YTn'K5&;3MJ])+aд쨇ҐvT0YOA4Ot|&gF&ʸ{cY)OSrqל'گ~1#_pu#e?دְH*(}ܡYIx&WbTe=vЕ;1>*'(cC4PZ]!z%ЦCɖ@lE^_t> 9*YUa(s5C]lPWyãe\bC]Ϗ>.,Qmz]hO}b+_5Yhw1b=b ZK>EԩtXPzlg0҄{")=A?ԑO! OEQG&VFe= 4>}be]Cu'~˗RYGLU8jB}&fe dIG%jgLNz 9b-m:MdIC6Ek[wHASMӽhmHPڕ q9*5XOGR{sdo9u9֔ܫbjfu\a]d7/Ss~j,ջlLaSD2JVv$J%iX(}!L}_m;vT^ʒ+imQi^a#> Ó̸yHZy6e y+ҋlMjk|X@R@(FQIlBk+CMu噄7P߄Z9|D}9[{Fqrqh'rܨLj3Nvv@p|˒zm$x'̣I{zU֎$$u @"no9y'sf]$5QC!5/=#0jR\2rA}9L'ᶊ4q> Œe̊%j\G׫ -aVgF E sHOWѝiv_Z_r<Y-Faews?5Mj+/4®O6Jj=Puz$yEy X&lRw49G5,?+R۫}?A}'@V{cI6J^j ̫gj1*g섯i_AƑᦑs*;ɋPOdUER9ɢkΏUzEž0(=*ڻ@-̺۝iI<)xe֓4S ;?Xв:jz$ADŦN?zG(}I<晷L؎]YEGR9DġyÓMyV0ڎLˠ$*e7\ SQQZ&BU/J2d[9H[4ܶ4ƴ|!SurzUvo2qmB̺۞1G[R{ Da(Ium;) + Juݶ 4 _)ɩ@ɪ:j]1I⪌h$K]@ e W,-)! [حbKRV`% Wɹd8>kJ-lըJ_Og?mR]B< ;aj[J_Q*g:umB̭z*8u TT&FxZK.ݿ*ğ:9߾*mM,!+Ihqi. Il XH.gu;晱9tuث6O/pأ:Zkj(AC9Fп|QZEJ淭ΫEN'hR+Q%I*$l4/ZB) 'b"6gA>rS)߻{`ڀC}?UokHZ|jaƱ$.*--WipGZl˺-6մ ʇ>a*q5ΏT%CN ݑ8>፼KYw)ʹ7G.u}Lczڝ0,KV7Ev/- ܑHLz,P +BuGr<#g1Vv킹TНUu+˜}IPqڄwKwif.ue]Z³Olҵ56 =pvajHؕ+ditlUsZ+Ұ@Yg (XAڐdyDjqWdd6mE9FV6s8,,]" {Q^kzL>COBeʂZvrMdgGګW틦<'?$;)G=J\ν2MpVSLtaM;Ejm{Lz @p[:\Ybқ4V!.E ܁`*܃B6HMDb*sIؤ?5LBe)7+!ꊢHy،WhSFE| oZ2cJLiOZMGDZˋdK V `Ȣ'۟+hX1bNGlbcG%+JFB- MvGҧ(<ƲK7$P\0E4›Vr_9; sGF1G#bAG!^iPR&s<&,Ԥ{h[ b@lfگ%)Dh_n*V%Teg'_505;#! m{!6͐^YBنY@dWn.4f,Im̲r`^3t̰M#w/P?toWh$cM zGEw=lu6w킉S0dx5& idIW\P|.S4l,RWb6 2hlΐ6NݹN '9V\д+W@y;>jZX+ Xy%dq554 i))W"ILr}L*b irTܡ3 Ͳq%jݰʌØCx3dK]_][)^c^=ISL|ZA &{_)JXV.2m:"-[y!kH*=>0S`TfeP}8X 47Ұ^S]m;<"[h;m|tM|A5 "L16T74|HWDgU]sӗ:_}!k/ܔtM2,%kZ$;{mRx=C jcF@&SQR|baR_}tPФP(*|Dn%7e:]{vĦ7~n)N}0E9Ȁշ+ޣi޿jw>e֧NCJh=4o֘Fj攸}6m з棍 RplRu[[Fؤaѷ.QܢI!]lqd~eФ'BG)}&?-W'or6YEevlWZCŤU?dTh~#?ԴB)0+NҰZN“ G_9-K{Z ˎmܽ0GD3*oNm{"O/R7-OKQ@]r6AjHhFytҳ4`(ٚ7z7UW}αAoߗ)Aʦ0ϴΰJt̞\!‚ג)E!iUN$[I&&[$Kt6JwfA66(;8kEuo7(4Ma97lBjc::\5r [!O8 (r ! e;9CoTUC:2ΈC+) XiHÐB+hI.6&W.5~2}fWu:+!1AQaq @0P`?!G998K:)qYI% jnqMsu5&I6Xux!H&2%"L y 0v?&Wipg$1&&z1!J~=o`&Xi.H-αn~֌vgz+":-G"R^>։‡_[-ߩ]bq{颇( ӮѹzPaڨYy]dl8T^]C 5o!SR{NF IzA&*5&KK( I>x3:RtC8cYl–N:A2b`2:I1ʚ+)Ed&:VAPo&z"ti|魯1c3cC _T%4iA .ߵJ4a8< \$m@8#ћ ؏Q+-PG96 yаgyPWGWA,GM$]z#dӑ'\(]iT GNdFv5XHVU NJleWEtĺnNhK3%w.I w o"4%1 LIш+kDmEIL;@]^3_2[`4 NItqS=™bu_D ؏Q+-PG96 yw-E^mH&RPw$!(+%@0( VM&DŜc) Q1gF aonNP ,\-w84zbP/`&.jx)m-6jjm=~+Cn!i8Hf,oa]LR/2k(NArxgsͥ/m-(L%yexL#>t,Ϻn\&bLA>T) t,eδP9`/c0$="=:y)̖ <+$$8i N֦E(>Д! *t6xz .fnkBoÁe4k֙X]DOjEiP]ybejw!%N}d6d kCn!i8Hf,J`I\?Hkh"b8<ЛM9Z nmj$bIX[NwR- Y9i^x:>BS'Koxŋ|~޾$\#Za~'>LKJY8mHQ]CBPQxmeu`@Bڮ@A" C srZmzpyuHsS`O1ib-lSQ)i҇AH_|#Saޯܼ^ފ[S>b g*Pа/AADp'H#^y8O,'{'XR$)B;)ħۓ^lPq4O!{JZN.1+;R6 _9 K4"x>"VLs&0r>Vן(wս[J'AnM(Q]wQrA}01^ZOr=ƈ^jLN9샼h յ<.݅p] UÕoR Bp)^A#JZqDdPiBUqH W~a) `۔rڧ` (& j*QWsڼi%xhr?U!f>v}8tn&)kA9Ѯi# _:`K Бzf|I6n1ǧ dyCG 3ڡk@]ģBRIk˥Xfms;j%"A8c07ÝO12R=Κ/x7'o棕@ߴ`_3G.hM5c X; mLgZg/ )R 4XHbQN֑1Y9E"]"5mRHJJHxѓW+b5kj? q[ -֒(M*}bS=k\?Kؒ ~ 7-j7ub4/GvPٵNm&V[z[zQbMLD? Ns!7k-dpކ+*zM wF?j 3dz,F d2[bW0^-B0`9޳JWoҵùv |Nǽ"tԧa>vB׋ s3qզiLtV-zNk ~ێo`vcINN;"Ir@!_:-Q DaIgG~:`^! ysGw"tKH)R2‚=*W&Q>1Rh?"(Fr&F<6)R twUÍ)ʄPV/> ! yg0_޾[Kw \*lhw6pHk OE4?PHd'Ʈ#.X8TJԆLݣCI%tC{oYL6_M"7iǚ9y_-qqy >Z<u p3%l*V;zM=H7?P a1,sfF%KwqWa8PD HhT˾?* 2W?Uk@ʀa,H&,_DՕmJkLP* \jl9xYO҄9;6.[+\eq  HmlO J#G7F&5VT"A3 XhۼA4o:,k<M⤉i4hA,Q!8p"RM⚆jjt2[{kP XL0F*[_#O\2]  aI0R0 8 C# 1ӊGx,c pjEx L4I ',@C 0"4UzV/H <(@@-Q 4BpL ҀER  (!1A@Qa qP`?C ߿nMZhƮUw9rE  vFPkoH;5J`aǝ:w_Ccԃ9.9VjT^ h,'at %D>|Yc3 ~Ǽ'R6?8+ QPuMú2iO] nj3 7*1/ˏ,f K Tl\eh*taK2BHI)!1AaQq@P`?P?ؗ mBƄZ`\QK{UxJV \flԘ4:u~R䳅g=A>}:|aL=æ8X2~K^%c9wT죀^;ZP8+?03pSy_4qg׊pt KY aH#xxޡDD 7hAGtbod68llvjД$fZz&Z5̟̖{E,VBw}UkTEPkv=SG?JoA'4~5qnUw/a'@ʓ# qƥÕަ5 )Bkj߶IB8^MK 0LS$m*Kk=tI#o<<{q djty8SlL2 NS=SlWzA?4mR֡P>o+!1AQaq @P0`?CwEW*`Xh*HhBB }\10T 16\f &3Kr`*5q{0 :R0"8nGFba$IW P[/lIc 1 D|" @"MlbKOzWK΁e1Ua"#׵厢 0(_#LCqB3 !ZΛ`:1UaE"w%z0 VVKHqfku/#7XuJj|TVʼn @V4؈" Tb0 2HsY!8cB\]1<4(J'$ L[LƹjgP]Ra4 ~' Y3YnzBimGM S *Ҙ-t2̌ (WG)(,pPB9%UBx!#'s%""{tG LEHWwR0L!It -q,uXIBx /٤JDEV*\tske9u!LPA0a7 ׺|QjB @IQiӅ]m 6?,%6Qܕ3\j̧,l!ȭҝ#K 9qxA*/I2!kyÌIN%\;,~5,S[1i TL `X1>0ƿ""X9 jNFLpWhkP1 G++\p2/i}&*67r`$*Ӣ/"0 fsa穅}.(֤*kr7,dRLXC o87 LDU v<3%'h*NT!~5d;#wK´ϴ&aw|qъ1H3 ms#Ѧɠэ]'"%6 \aV&kߵ0h104 #3Y=l-ڰ6$ ,C,(2.s< aQ,XƖeBXp)Mƍb1/͚F^!a&orm%,x(#՘l, a`#PNp [QCp2{Hd}'MAVQUx@` "I(Gx drB7ltmrWG0DmemUIh2$BEJX;JX;B*ɗi+,LWOp0"#{P:pL^ꅒ5qy&$N}+8 W qH2OX ]Qޔ w!lvGY_.ibW>8ߧPl=E)PĿ<%Y>+ 2@>OZeIY %BNQ8w\_r@-h\XrxEzcZvAw ;YD&Ȓ-Q>&5 'Q'*v.q8p~#5=H8>%($B.nz^?v)uz2{}6lNo򇷱zVU Ub;$ }.?ˏ"V1e䃧(ى7%{)<|i"4lE5# tb20Re5hfyL9ξ꾹3 |,@ CZLԋ~F!aR%Ha^8&,t0(bPҫi(#:$BwS O>"gHǾ|#B=y;}'8@~"l Ĩ@nM0+D#RBP q"D%Ep$UE3VXa6I>5`X1Lّ!1 !:l&ȘQX?jܔF 0FYR>~3 ;&*ғ6<3aA\DafXw"K|zNʈAÈ@sd. `3GZ:~#|h䷢~Q`DOӍ8M;ޗmtK;$/GAѦ,%Keėۖ!b+Z`Y=2I }塈 W4i #A$F@6dє;gpSm?MŠ̱&l"%Ԕ' @ڇ,mI#0Oj)ED9F(@bC MhWN8TQc7K!'_F&E2IUPD'`|ݵ,J={:q|`(WS&ÞypFc"/|S/Kȟ!P(>/U(q.=M9mjY䏏ȇ)`B_޳Ųo~Ͼ9>tgURp+h=zNFəH@DŽT- Ɋ,d:ٕxjžl @R3ƢbūE4) [,IW(gy\bVP&0&b%#69]qB{b'*ʭҔ=>e:T>K;$r3Qn;͐:v= =hn(,`" A"a żNu 3m_P,ʨM&lvWf0]`GKWA|c-. Vҳ0 9Fd6aUTxvвAz dӧTڈ* #8h "<}jn0qϩJ[r}Th#{$5}b7)>*ΰSA"Rw~˿ CƅBATRF2 ?\Ľ#OK/p K`DdN0ƐdN#ĄKcOX3`%E8#>^YDLc:0)ѣ *Z-t3>> ůtDBK:`ͩú_cD(VZ@0.Ha$'jY,&$ I@fנ@п&T <C95'eO+;\!UO0L~PU:e~@՛ニٚUb'/щY6GV.q1 2&EgM$C<$)@pkM)ŒD05#Y}߸]# is]0>(y!N!+4П) E8xVU t<$thYd>U% tv;$l\cj?3⬅Os񝾇 4S^Lؘ&rzX1@8q A%&\A78eDk@X4# EUTQ:h6aŕXԈf%ZP/yZ @>r (yh"fF4cX,@!. l e^m'  d Six!nv=3^@?tfCxF$7ʙ{i:;}.;JxJ~W8Ix;cG P)`RZ#Z) _ \PJtKF*DA#l@90t4i:)4: y}4f x;>3Z1 ELG([_L0rSBX"4Y`|FW0G", . ) J[2"n*0"XX‡2%aL?. &Pɵc"Ntnc.ݓ(2(`Fw1|dHtU-o դ/;$I1*?Hi gDVÎzEzRc42/<'O^ x(b  cBq.imQ)-%mk%RǠܦ )"n7X9alGyfaܠH cQ*da4iO*= pi6q|a'|cjj$uu+%Smb>'cW4Mc=dj,oI !젞 WMgX{JW\(LX| ;.q֬QP]W=SRiCt_k*ņh:gbI5SHY'߉"XΓ,ZPRsʅQ1_1)6q*,sJ#pRNj??#bZ.n"iwVA = ?߉  jUk4 n [MN @o%B @!&V^b(3xGDc8zWmayavi-4.5.0/docs/source/mayavi/image_data.jpg0000644000076500000240000005122412747716313021724 0ustar prabhustaff00000000000000JFIFHHC  !"$"$C@"Y !1A"2Qa#BR$3bq%48Ccv&'(7Sru6DTst5EU#!1A"2Qqa ?.VOcؽG{Z"oAْTu~ÓASj&d~B룹z;BFNYP@sY`b“;:kr/q2%cmЎ[1%)[G{mk':MF&͝Qߎmlq/P ;x?hXZ΂^=JZ5zRt8( UYW׆ϫڕRp`#&Z䤳6"*jiP{Fz`7䐢JP!d4WϡֹPGԼzx,5qS+Q`6͒@hJJ5WdwmjǗpn ~Ҝ6@?pj2HOoYhOoòy[V gL%*|5@n? ",/Z:ok_7O¥illkGeW>;1|% | hpUVvڴ򺐄 BJΫ2P?}ZZ(oi_C+uh꣉dC93<ўxntƝqsPoo϶6 0HD+fMSU9?_$WOK>*ܙm]!!Hulm`-w669%SM1 bYbixǔ҈Ĕð5Q::fVYcG;mHi>x)KkIsqwR^[fT^qkK mZ ZOąR66+wZ,RRRRRRRRRRRRRRR$Uguϧk[J/Dms1O@∶Of־{X *}AOKHD 3hŭ\{\.Ga<4y>ѬE˸fwtR)AsoϯLιzpx >*μ]2sdzV ˊDt%@h?}mmhUwX:˺~vaS17o`¶Eqj3!OٚskZVwXn>;ߕt鼥rP yҰ?wե?'[%6};'5>7Xcu>:p;Nů/Q]>IҀR$n+Ԇ斷1\!y1 SNtMOMjrvɔٝ6.O;G)PI i6ۦ6ynmꝝbm/^bj29NS;,esǮl`xqz >*=XGH,~9qAס-Wy-F=7szX*};۲J'C~NsUYu}ܑ%e-x/!_9uD;| hnHnSCP[v4N#ϨV7~pv́Z%fkU'n s?8¬]vAԒ1^OxAVR{Fm,er5'Vg4Zw%=*w][VkЧb\WPۉ>Bx#je<%<Ԇ}PN$-$lGGs%:aowH21dBV&x*% Z`qjԫ3ӦU5o|s,iSwW;ձJHRBAlYlRRRRRRRW__rޭɭrveH[ڞih%:APcY%2T6c#HcxP+:LsT >a*vPWQ}ҐFOovWH7n_G$kO{*, #E@ 'r+w{ {IA^(Z|cci:#uogٚscU>+*ҧ;W=VpUiPeKi*r+_@`%?mjAz_X$-Gwn6BҴ%hPRT6;}k;6` %Ede|ZIΪ~'$ҲE`6eӋurKױ|aN¹SΆsQ,EkU&B  ︍T[]ӱXof%g=k?I,#{Ay]j;ZEvߐ7l1#hJ'}RA@$w}EV} ïNmۭٝ" tm9ڕGZ Uӭr&6x;˞Oc1"CV~_eE%EzQHg+/pL벽PAM6_Zt6!?SLǕrSj?ߺڛam T4}9QWP- BJXRqtYK3Z\ $4}G[@HLne/dk_?v'΁ьJ>4Gi0FpmV+t>^3YJqKy[/vm|[7FbCA+xUdTq[|73il+8b):(V)aYr|/(snLyIVtBBuRM֯*lyU>Ckr*el;|CgJ5?Z5OiTT[Qq);}C$xLYGeZ.m S)~RcB4$h!%@ۢ@K)J5)JP)JP)JP)JP)JP*0rC= z9{U@UTG+ɛgRܶ>TV~YUPL [ƥOஉ: $:lx@qh92ʊ#5pIX/0F$ÍGuRTG:­BXr}{x WvSjT tFnp,=D|wWT*ς =zSUU*fEcUUUW T_Q/dd-nYf%+DWr=*3VO΍>]$^ +&*Q;%Ie!_ KEn1m[.<{\sNvR3,Imޮń>;kcҭ,/3;$<,R퓧Vӕ=q ҍU{BR?$k$qc{ǒGxJAY=}*[-֋{VTb44,6m,71rL}W!a5_Ŏ/:R/H)@)@)@)@)@EȷL+Z]JDR6$v56Q.Q,aZB5w9{'=%K {D9jz˔Y\ 4}9JΔ#Ҕ+X.} T(I`2T>=@bΌ25&3ͼè m8 w]/8!\IC!IRH#ҫgwr@]Zqįbv!;*, Fo'OU*֜F,ҦdMlFSN4#D(>VO/3փ]? j)6T4α<=ί'n> vhq:浅Bw;(yLa>F|GtʶZ÷-q )l`4*[W8ً.-n7;ݺlRSFSo‘G쫞jB!!)Hh:MKf1&bnOpS6db %ksK}uGU3ߜЯ6+Ej?搐fI))q" [ Ȗlwh~s!!2n#vl*IxV a;e kUmJ| TUodq:cbѨn|[T}L]jUV{.W-;Uk꪿eߪ㣥CzjV=%Xꛧ78cuVZGRЕHZB#TQCjmCQ-JDe-'# қl)=cUi՜!ΜN%%? ~.)jH|׫NChbdGB{y$A< xl>Ø[S 8|YM!Ɯ RxDPt# \oZ_|!<tb%ѭ%qjJ=x^ΰKlNݤwq\i >H!@%5Z7^.Ð S \3>87ޔmVPb gUsc KM'N/J}O'SkysM8?ljAu/ B\~sm{*?j?sͧ/+c} ~@D))M07}_Q }3V)J)@)@)@)@)@)AB{;#\\XjSe$$p(Z,q?:jžwhAacn\qnsUR^FE)vD'ݧŁ'TL(c#J`_ ON 9r yWxb\k&|jC@ kCH ;.ur$K]mQ쉎+ RBoԪ@ۨYK q: -Ky:!sTջt+6#a%_Mou8eoQʣרq85J?66 Yȍ[_7oȍvZ<#`Y&R0gڲdZ/e-5#3"<Oʶ5p`dY|/7FwߕD_}S jeDeW/{ptZpr*VNjGj; n${_Oi}veoV+jcUU/ziReQ[dʘd7}]]Kꋣ7YU_ߘu592𶑯VIq"kiEq5ΫE" CG?W?Cϝj4z}NŚK,󤨿:;{}@ v/|j޳5Ft:uR$"VBvj1Uxj[%$sٺˍw޶f[vU 5Μ^䃠޶ V6*zVGLX.|Nl!GFqJ)^Ƈ;څZhGV:|`Iɡ%%~]#zJ~N{Xm,pn®/#Դφ _>|sӾ7m 6lwd9p`#,k}0ܪ×uǮ-MPݥm,yB~$+@>4~ ؒ %$s&1~K 46jV8RҞ[OPW*fiF,8s򕹦j>u8N1# \o}{jG;n# WU%g^(_18R)JP)JP)JP)JP)JP)JPR]NOik}CkIw,wTڱ?YQJǖB~I0V7%7|t/IyG i;W'Hdr+No,rUZ|'DZhvCxmcDzSG@LuK7,^gK?}?^zQn59 ]//o] ht+(ͩgyEֿTTΎҥi'Z"v_7v3{|W1Y>2-;jV }WHG,z\4;XtVKIȷ/\w&C=NSu*ǬM6AnfTӀ}4RA}jtsq\J gHDā'ߎ7;,fC0HuPkHRT4A#җ=OU"l{IeȊrA-@U_6ޘ{C I[v~c d8c!C5@k` r{{Ւb%||+$pRyJȪ_G .P͈u %7)*UrNmMptpo.N x,($V`zF2K$kՊ{3IOsO4x?PA$x) x U{ ]Nc=B᷸:]MmLL1dB-C߰FZH։Pu? xު:^NƿֿVUkzoWWQW+9%G΀oCAV7sGĞj _xm6y[x=0}۩rIHW{6fCB?i~u⬘31iHCi JG**t'6﹭V]{A mɀ&4eoP7vk["Noۻ :ң4Xٴ{w)/zkH ZU-c?uާ#_uzq x9.9r=? (>}<7;Jyi}淧)Sk(l(HjTeZں.pf cӝ=,;t"9 *yks(󡾞Xq UƳ~v 2z|1PW6>ܺdZuj5 +ʵ>S"m[ep.yItjKT>fzK?NQV|?iw  W#THgE4+,}s]pwovWO'8R)J)J)J)J)J)J ڊ/=.$pmI )*O_Hv Ccr˴byih SUmltF6obejRJRvh)e*QlփeLyZdc(!C>RxP׏)fu#\C/6ۼUvGh{yT{/W7ir{J_$sV}B mrѼRи=濤wڥɪjJֱκf$vC,DܖOy ҔFoD]P?Vo6c,?TUwVua1%a8ۉ JFH<GZ_fLvyumڂGjJA)HQ:}j.:]-Z˒q}J%C`^|7CorKehHie%a?II N;궯$=>eKAtkPs'AGCCn:.9JЄ*f >i sOJҦ''*B^>gE^`dOo|1'^t:'_UFv~ȡmdK:\k/4YyS,6GmBZ9By nXEzįQqso$g.K ?=$pTֶFO)'κj7oV `oifCƱ5 ] kTލ΁aU OjOY9Tˤ&%k%R|E+<ReI [H#GJiQjrNJΩJ!)a JD)OxJ;Bm<|\W~679w;yN&OHuڝp9ht~镁_x?HHdY昝܋Ƚ)JW)@)@)@)@)@)@)@OIjyևhUWeS~'K@uFNyPGWsw59+|ǟ׎lޭ2mWXL)̺i?|"͸tSV7]^Q[u̕9'HxH_*yˊYL4w[uP# mRB#`=?+x0rیr!i:~9+% z_O^WsY JohͮiQm;5]ѹ2ݶ7szqv$m!ķBzllDJym#R}V3t}=32!FFGx*k`%$okJ8; /:Qos`}UH5b$uN7tCE*bAGJNSo}=W+e˜Ɣ#j6(&{/,pmOJ}>48ʼnHKm4 @VfF2#GjLgSO24'$|q2ZKi !>ڻU%IdE\Oñ;T=l'’v'Dl%@ٖv.Lˉ!^eaHZOY+=ʿˏ:jX{5Uv\X-&Nkk[iUYkz[jStV>vGddvw|{/'`ǪT=4AjnIҿ)BGyyUN ڴUz'Cظ[3.$y!i>#ȭyYL+UwºAs̈ݸ Rvl!ޙ;3eۭ6kP[@~ eGՇ^mc0c%q%Mo;JY@~5W/yzp|ZK w6a$|MQ '_Gtڿde\J7XL ,M;jb.xιI~b.)`Hh~MgV)>/6;wi7}{֔$'+MV,y]lz=M[^(ZO(Pm*+~[,6{yi)գPߨv|rr,Zz?!|OGįfG1VW>% tƼ8}@Xp+g|1{2Ty*qʏ@*\In(\T9G^X*hvi!-=]žZ1zl^ӹ5aC*S2dՐ<}쨏6,2X!?GZ!%oڿ-)JdRRRRRRRT}clDq!8]N`zStjqXqq mĥhP!IP  WQ{5urmq}ĹB*KUg|>+yJ[u(EMr=8X⶙?TlnkPgF'c^+NWD$($J/]U"H(&rd@ו=>3B yN;fRو?8 \Ue[,֋|Xm 8rU~]r۸V.J`3nw{P+:j+/+͹۲m]/vl! Hm#I%({kUW~OSɻc4x٭*ʼn~YեmʐF“ֶY\mwn~dq.n.DY;S%L$:T ,[͖s3C  A 5Ʋ*8Y[\p$%ʶ>Bw~<6o8RS(R5,aqksn$򅍍>GRͧ#e-y!d3xll<{Jkٲnw="ٮ}$c> =6ug4Uoo?__ޫJdkk[՝R-g H7cMG$1θ<5K%[5]^'ܝǺs}Ի^mG fCd^Į$ȐtvAm9XKMljg&Fb;aO.Sغj&X:q95d6*=>7ڕH[lJz\dQN%$ݸWuk"r{ xu5<ڋ&BDWkKJPε3^Ԗ?ٱgdO# o3o\,1d@3`)O΁Nߐ*V1fOɣޯ h2[|8:Rߘ>R5 HK=vRkwjyHW*}C{ֺqoKWUU)ˑSǻ a C[^ԭ n|gc6vdkt6ƒ(QvkǜaڈwS+Dr!4 :qTJ곪#O5k"t6Vp:'{VSKC֖`)*I ӭc:VuUhw {ځo}J ~Wf1t'$-VJXOӷ ytE̿ωi:vB]1 aH}Hu,jt)]j((((((((>^07]Zڲl DjMHc{AYIRRjUnjc,b؋f?jml6~>T~Rܚhl3,W ϶l";Xr @5Tڦݺs ON_2 RI|+:y~DʱQ4q5Vuo՞_U7Vq{S;ZUF-\EJB iiUA`aYR_X!"YxLĞsҷ-f1~H,JV OT)P<A[1UOwO|˭^TxjF(Rl+(as-8dƐnDGy8&BJ 1\IRtOU%^[\ BAS |(ly/Z?BR<1z9c'գ-RYߤCА>D}V\cζ+ymkZ$YAe3^ 7R‘ {F<}N3#DmaA~)~]PHw* X!3  ǎm(H\*#tdTFۗhGMh2nr@J n}3VWq{^֑}Ok;ZEpYk*U/wbpIzZKʆve#Q'a?c xNoD1%>6jV!GUj#hj\+i*ZJ%(>Uf0’LL_m.P?5QDAx[ҽv7;լҷ5q[7a+j>B҉= NˉG|;IuMVL #)喕LÅDGO#[UTPP-WXCҖS[cD#I)EeWIa[Ò-9tpzK^=$xu`9u~3Cq컬KT${I^y:j5vQG*BTb)=ϒΐ}'[5r`=%Das.>)Y*pFڣ=$"ŏd,֭{|hm!?zS]F?eY/ )ܒ9JΔ#ЊV*ѕV0+N%dΥȸ83eN8J!>_]+erϏ#n< O?T'8˓- /Z~IT4D 5ZFXֻtUli^F>Bʌ[JS;:x1lqA:>ݒY>nx. `ys z/*.I$goFV.tyvؑ ҶaAMpRGk^erqrtܤ2+s&e v]}>vo}O#:]Y*{cn3iJoUѨ)Le(9M+\6MgrKB Ȭ5vVAi8҄ )J: &[׌1S8Cxe2J'R@د3A zTD(3+\F= ry;O8Ki7 s<=4֧w5OeuȧI_Tӳ!LeДņBUvFYwLD*By+fWVi}Gu'huPA`w1[Ǒ:u )vGc7I'i;?bmV'CEl3JϚ/-+K_ q'A q+N iN[nMǾG[F;INA_I+SЌe\i@P¬}rwe7g4z~ԯ91D7|$$q \ y ͫ夔}K5o7[%m/_y;bl UxOklܟRy'ZL?Ⱥp=wIM2ς|mk:瘂Oƾ&є[S ܕO벯:>eՊ:c8k &rm9E-nP7jG;"*u^)Il{KHU+1Dxϳ5M޲ 9<-x[jV8::"L<ݻ ,q<kIX/)V\$n+(HQ:̜+w WmcS'ʴkut윓$'(K?eIֹֹiXbݏb :yW`W*QVgp/>A\b@= #YV һjq_95=1j T)P<ydUᓭ^b_=(,- 9(t%A[ $_WzFp<їÐ%3qHOdN-'6tu$Vh}*CrU2d#|:(}}ee$vJo j,KSߧ»JrA-8-<ޜL㯲D)_8 v CJ1;gTI:{"i̼7a{c`8fBTsnLbeQvuG29^\%N@;F*Q|.ߚCEpHܣ?C`VOpr# #+uAВ>PO>P qy|^gƜRj)JV٬4ǭUؗ-rcZ5VNv"Xijk++YUlbb0y!l "\ُ!?$x`v\cǕJG(ɯo|\;"NMǚRt5Jd6I BxRjºTwg,=%G,4EʿX+?jf[WC ՛_N\pp~ _ [?eqx}0L48y$$Ml\ݜLBB)J)J)J)J)J)J)J)J)J)J)J)J)J)JEz,.oV_XH/AZmRΊgJIIJ؍[2sarXBfc;eQQ@̾z̭\nc?gG@S^#GÍ,W´tBT ̸ϛe0%Sd4N.2+a o{?=+5JbYWXb7=FWS6,7V:`kbYuڱgc[C2. DȐBG#~VҴH6s!ÎyaBG'UKcE0?*=d2ReLG '_ʬzEmqޙr|/3(4a*%)?I<BB[m)BJR4/#ckɊۋRޒq՞V?B4b)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP*i&*ё^N܊i`v‡&oO練gM)ݰ~W['icȩ_x:1v9hĨn=J;+AO!jU vؠ㬎+8PW>\L&M&=֔!x0R㸉Neɪ cɬVpqIB ֠mD>rnL̲%b;KseIC7lkLޣ,X=bўILy$ΏA*ǯ%{-ɳ^`Ee̢sEPRN|\:oӻԇ]3F}罙(/\$z$hE+]=6ex訶şRjRRRRRRRRRRRRRRRRRRRT+2,vcVԅ |外lR9[+'NiOYߕY`ykY+"JjtGڟP.tG mcCMb!M#rfTY7e8mYRdC+aGͫFpU"YU{]?lĽB2 q*Q:PR>+<?B۵;cLN6GW#Mjߝhך1֝y˦=g] O\mG-dh II$|[#ޗ\UdSW]Lli?f0|'MXTY$)D((((((((((?mayavi-4.5.0/docs/source/mayavi/images/0000755000076500000240000000000012747722127020410 5ustar prabhustaff00000000000000mayavi-4.5.0/docs/source/mayavi/images/core-class.xmi0000644000076500000240000010172012747716313023163 0ustar prabhustaff00000000000000 umbrello uml modeller http://uml.sf.net 1.5.8 UnicodeUTF8 mayavi-4.5.0/docs/source/mayavi/images/dataset_diagram.jpg0000644000076500000240000007667612747716313024251 0ustar prabhustaff00000000000000JFIFC  !"$"$CX"Z  !1"AQ2aq#BR3br$%Cst 457S6VcuvEU1!1AQa2q"bB#R ?R R R R R R R R R R R u_Z{zY:Sb 0fEPQdq5-u+QvbΚ--ڵM);Š9ڥ2LzrMO(10ng $N+{;o7P߈z\0_\#Ÿ0mjQr=r*;ꄞt)oEr2ۧV.'H--j}Wg* >iC46 w~3SJ<4 w*M.I|⓵.͒R */u"YgIm%Kb4pU;*I.Dx])enPOh=)P:G Q4vљ'vjyd0C̸8%@ ~C,}ٞPUqhmQA%fvmT$K$@ɠϥs@:Q[o)~DxQJ?|gnzԨ.e@=8ʶg!)Q $$S֜m֐KK!IRNBAT(((((Fv XLILNGIˏ,J}FOakS#zb<"9-&6 ǎ^Gq}ո\|˒"G~};7ҡkK߂hkW1Qgw~K˔,7`M6[5q~3cDb7-)J؂/6^F|O#Dii+HB# Ƹ'jήn@/pDM(R+]ћtMoR!yIo9y+O\*=3"c]JRO)JP)JP)JP)JP)JP)JP)J^z57;3m$)iNrR9V98cւMJ参.#Co*n2ʹ#WǑ +rJ3Ͻu=k=Fa_B h-ж$MsJ!z9enx`Y!ǒQm0<6Aqu+s GNh]f\,ͼң p )%9g iOj.]a6r% C琠]Γ&kWfəry.ȓzq e$$%)sȑdà6ΜA1T?@HP3р=s\o5ukX9%"S%m[ظ Wlb7 I߉3EfEthUPnv0qEivi{F0Afҋ[.&OwHU$Oo?}7wV-dȕMt-EK@)a9JwOƝMT"* d!Գ=:%>pصŔ&'vl$}h _!gjf*id I(~W}餭.ﻨdćl\KO%Tø'z o%|R"FxݵZ#Dg)F\p5WI#~h5vuI:Z۪wd bQkbսƚ<%$Y9h|pE13̺Gꋱdҕ*tFfi&.K7ݝulShe T +$+#g<}/K\d@"6|O|E(){PSZ+U|![dKjcIfngA#OH[ߌ]LtFţ4ښ-SO#i18ؒ{z|@O Yӫ3:-ˁjv4 %j A<TX^Ҟ ɈΠ֔wr[sA?):i$qzˁnA8Iv*y=Ծ\Nu%O^^<( )CҤZO⛥7 >ܝGywN]NPS8RS(dzt6Y^v[lyf⺋ozG"jeΟWcDud>ACfuY)[4RRRRRRRQeEj+Ej)S[ylRrڶ- BP *!#$ξJ)J)J)J)J)J)Jc`A{(\NGc1ȥ'fZ᭜8a0ʹ+ڔ ^tMDΚ\60i=EniAMOFyVEأXNG^{9͋%g~&}?k5SÈ[6='%d65JGϵh4p4ztŹ亢Y$m !#չ(j )vsY*<{qapvTR[O'bGoV ^U+1h>wMN7ڻڌ\5U[ai#-}j?7=\:pi $Om.f<OAx=:[V :9=ؚ؜n<䮦33;Χkcǎ|LBA* ܚòˍ>dGCVFAyjčS +#ߐqw'tqD&$T?ӑ)=Q|NLqczۻy[ < b3(C?Cvz{@#VjIEIuyUGн-{k}}߇u\ .7dHUYxi3h33]_b\Vi}pRNJRJRJRJRJRZWk]Kݬz ,2\ANE }lA˟ _ϥGj=C{9 <|$,) p;oާNdW}0bc uը(@$I>I=]`J^Ա&(JYBҤ)*J) ؚR4dMWHR[ZZNHׂF>(N^R60[|rnZԣ)J<``*E@k=>WK:kl7< A#'2ԡ]gͰ됞›cGw0w LҔRRRRRRRRRRRRRRRRL!/T@(djFC1662EcJ%]٘3B<`*mi9Xq[zw*qfg_;{G~;L4fbڟ֣S˲ܼ[!f+d:L39$)GzgLj9W<ۙ/6KJVl+I}HOβPB |Z| Y'B&#o019cwVN&c!rÅpp8=+==tP}5WקS?ŭɶ])J)JP)JP)JP)JPs,pOkMq2JCw |MT}":) Z8Lj959RRRuim:Rd(QPt*񤴴kdH(q뎨$Rqp8§5A|^uS zn ZJuN̞10vrOpriQ^jyӦZ{U\-* d睊T;ԪJRJRJRJRJRJRUPuNԍ-ѳ29]p/`%(qC ꦛ:2o1m-ϺiDGڕ:m݃D$gfZlY=R3yXlƯ.% m!+B|U|i|@2Lr=.}Eq ǭxm r`ß-i(8\KiP9H+Dv5Khm&|>{uq̨˾Ԩ`@Wr9rHKrˎArc⚷a$eG )ϥ@J6zUR#-hJ^?$ulB# Z羫dM&v6#%$˷Nh:`m+ꗟTR@ \fԸ~E#-Ǘ={y+2mﶖٜPB׌/'b7(c˅L%ZuW-+6}kJ#C*%a%Jw!9%[Bp >q}-ݬr^amu1( !N$IG~R#l&lK+Pm!@[߻%H$pH :|_Y^\ I[ˮ6HP>y&d^@׳ iյkW)v{/F*l8 KqiqiI'iۻ*d}Tt?'N: z궝KC jCb=i=S~CUK 4y[KHBUܕr4ex>gGnLgSm!IWVeGkK@]tg)J *C@)@)@)@)A:bˮ6P0l_ۑ9Eܒ?.Bg'pfdڽhY\ 엗&8[q ~8Pg 0r{֔%+HROpFA'QJʏY<[q^Vεe|QV`k>-k*26sYk(o?jYXAKPF}_|mP֯ 3g9TyV Eb\,XqN0BՏO튖d(ާ{:"D;LYm''yڵZ/s)a?~3X[BR>Il-'ܐ01Q,x{x6O܅z SLN>b'/3e-iaqΆt츓?%ڏ8 Q fgD҇er*G8Lj0h~.2֙ǺOc[hmx4}RJ`=p=g2Ӗ1v=rbkHŽ7͓1 tgouW"rwFU)aTڼy*¯>vV :M&511NL~:)])@)@)A|[vywʞ m $cP=L:F~ 8JBqvRX?cSt}_;C2>fԕcܥiJx8᳠*%:CeH ެNJJRJRJ6"&gL3Ӧ8 V)l;@ngԟexF-Mu t֥JJGTJrx<EXW= BZܢ̸yiU@CYii ) ھJ)J)J)J)J)J)J)J)J)Jr/C&um{V鏾ʣa&Ĩ)x;Jp@ ]uZ:kNAIicg3 H{]sA)@)@)@)@)@)@v~N\d3*WĄ:I)A# g[PD4^zM,Eةҁ9 K?t)+OѷstEىgpa]YSdwPM(N^"@h V]p;2lAZ_7R6`=:«VV^I@8iŶZp{/Iacǝ-d'{''ɭ\Uc!i7 r6SiQ*]F>G"éI5gtc>E# i A †%J=/rz ~#2٥ u%QNB~8!lwݝ  RN0Tg|՚jmi B 7{}6T XsxB+% `yA`+}VXLfu>{_&fs,{lQ8~@JWC#}==6K݁FZ8m!MU7Fu4ºܐ%4w2WUڼ'̉o;jup!Б(kOVn->v)43!`)9HY[;ϙׁh4^:4:fɨ) +hP#pA+J ”f/鞫D)>G d{Εӷ^&fp%ԥIm80 BUֻ?F6RnnZs-K c'wåit:KEaFҢZT288?Soil6b+;/-`H <21bi?a d1㷜!#y$I$I$ )Zz F4锟 C4Gڬ!ay>3 PW G%[- (v$4òHI<)$^ʿ3Jm5 \`*9?[+)'i&/U ՌüY'~ .Nv(e쯲s?bTj-7?j:7RՒl+ qh(((((((d1í$?՘-̮W̠TrlJlDch1Aؔ ؖt Ɖ<+jm JQIJ::tr\x5%SN#vJTR"kJRJRJRJRJRJRJR^r_b,w$yi%n8RI$Zu^j/K{|a%a?9j#t7s廋 Pq1mR0G#?\9V$PHtwSmTkҖ mmj {8'U ,hQ;12iBG`½h(((aޮQ6̓6oud(Np ہAYԑӥ^ Y6V@8e> >D9.-6Fe:R)ˢcH 9iY666 +朶^-N.Bwh 2Rr1%;Iޒ;.9N.Dvɒq+FRgR*X覝7{ݽZ_j 𐃽*ڀT'bҔZRRUW Zjiחb{ }Z tOoS.˽ڤ\ETM PGh 0qPU9W9_OIv&!n\Ԥ -j! rN*a~k{$5 ʼjW-IAC@d/b$+v,h-+u4ϖKjn;ӈ!HP$.ҏi/$oϷ9봅jNП a$ qM SZ,Zȉێ[Dvn/Ԇ< uvRkcqNvUL&l!SrrѸG 51=#MaLn2~[ȓ%q(d)w8n+>mdخ-ZgxHO矵cZө4W8ZM˺*,H> 8Rn%ĩ/R8WO:6SuOcvd% 5)֋/ )A9+یm:R.;Dvxm:ҰFpֳNtLeE;-X ,~q NUMU-FōzB͡."(yv;rR d+ Nr 'R]M\;|wa a띇JMojaik͡hOBc@oM tuֶ$8vu$pU]Ҭ;)Q^^CiSc\F$'ic؎jU@)@)@)@)@*Ľz>.WߖO%`sނaQ/VH7x'FnK )J +p\.Er,#sn$C#A5wEHLtMCڀvlBR*Q퓞IœJ)JkkMc$ Ar\F@7g~vҕW1.Գi%#9Cyo`y8FJRJRJRJ;NZ߮q-vDBOϥV}ԯޭ5WµE1OD}ߊ P,fU~~rIj)(T+;'QOv)1FUtZkFz$ݵ{_П8E-7,<[d423([RJRJRJRJWQE\o NumzCL\o7Ja~ZXSB 6VR8UUq֤#S[ \&xAÅRCWqZ|Qi-clzܛjTWSgk)S*к*lm.=eόLOm$-c$!8#9{(J:k(Ժd¾ĴjR yqqa>:bFC+i1&;'>G d7$ANyZCnw.Ϧ&%/{sQsk̈́piJ$JH'9du2XLWtZnӾwGii;RڰA'5VtջH m^ e)G (GVƨކ̹Jԟ9sBz9L!}hB$$㜤;HaCBAG{_ <ӻ'Pjڡc^Q؏63Σ%HmԩI&E)J)J)J)J)J)J)J)J)J é2P'];Ch1 -Vo@Gnz9vmwZYF3*+7uҴ ԎZ%M4IJXHHRQ'ڃ2^t;]F3id+m/6%+H8#%C#bʥ(BbFPx@P Ν:nj\"#/6#8=M@)@)@)A\Eu1](ڥRrU%6(})*ԔZe]ڊ]qg QSjRR$qĂ>U{/W|[ i-%)PV .g{9h6rNuz$%c1)lH ݄oo'%'"mmbi(xm>#A]iΒ&ƦUi;L-xH#:(V})@)@)@)@)@W~ͳz^mۋ󥈱 %X**[{"/ÛuvyDER[!-Œہ'k[e%9xQ#smhn]3z Ar%(Fsm'ШvXFNbut\nK mrR5J'psd׋9E5(-ӧnZ~w 4ԧu;0:PVx)W}0zc~ &&2؄8]?VFP5,C3i/,zz(EIV(@qP47i&Dha($ڭMhz?,?b(7((B/Q@LTE+gszmҕʟz.'KK-=iXlwl  9)J)J)JW|NnLUop@Qan{`Ï\h8.3Pۅ$Dr\$[JҐ2IV@ޗkg7nim22[FG9P8qLfю^ݴ6iLKdrYI%*Js[[>ҳ+H/[9l۟2B6+wnQ g1Q=c:w rT7$Coi#ȕQ9’㜁:jg:`NeeI !K t P@8_ZI뫄!nXy1Dm 8Waʼ'#8eϥs7ͭ5㉓)71I!Kd( ڈ =[iydiɫUB'-.% ĭjJ`;Azeޓu:t] dTNuO%)h jZ]@' MӍ`L_,0z%\dkjJV$H fNɉ^mrh~*\VJڡ%YA-N5. 2[gRNHx1^f-9n)<$+]tfGD9,J_K+'aWP3H&,<f|pHa!@xx9< էmrxZQ,^{r7a! c@rMq'N%jll)ic%%F,FdR+ .֔ҝu->+C+OX[ ի\>,;'ɋP'KQ^JѢw&ZxCMխm:Yi_{jTo }U TAEh-绒A/xo,gjPVV^qj\u鳹one^`M=ͥ((5KŻ\I]b x/)Rr;9U#V&Q ?4VGі-]FÏ[m+ױ)* JB *CJWGaWܱvwƑ"So>`vSZRJRJRWK؟_vm.[R-a )#[J>#?m/M2oZZZ9": Gub`yħ؅oVK)!(ھ4ѩ϶l8AA[*=ks`;KMp4q4֛>8P2kө,P9ϷLl;R؃ ȭת 5Yx6M3y>!e'w I ?qXoK:2Pӎ!wW-+N}\Kp⭒(n)m4d=Y\UV²jկa䅲̸=-}~O_Hm}Nj6BnmNLe).6R>ڵӗa_!|[T onԁTԕVgY5=;~{ ՜1a-,*qh랺fnCZߜ %AAlOֳϴu-ʆ N3}kkjbTlSڶRI=GisΔFY*9ܬ\}GshiRboujuȆcq*/mykHAjZySG[4%4`!.$%O8IR@EGVPj,9j5ST[ϪSLe]ʃ+QH$qGeam${0+=jzaJRJRJV{cf^|7:҄Q@ɠ_Ov((OdGv3.ȷy*rA~{y%)>WNq)n# å_u"t\0(oIp/=ՀHU֭sMSOc!V`NO;Z{/ Q)R\g*trA%^ڵ͉/jQJ*m;eFG覩:kh[u!d-!p#Џ\ֆݦ"3Kպ; )~]Ew|[ueLڣK@ˑ=ǢqKt첐?t~$fF2#岇ڛuhPIul7[#a ӰY=I]K5_˔ܘQ؈SlW$ByA٭ cv_Dx% Υ((((*UD ?rCէUfQ9gv?eZt R R R R R R R R R Rf|Etԟ2mp7]]ZuVi-;o>NJRԖkH5!5ӕFQO@dvӷ^D'3:1y +)ZOAϪcP.}K:BӴTK9T%lDz#.zV lb^lәovQ;\&Ap9u\(%DtɎT(P*)RU܊k@ҲK% un 0%d()@dd* j_BtMueRin5wRp=HEouQ}tΊTY0aeoy )IlRIL(((8_6kvhT^Wi0tߌ ۀ@WtUp\'H”rRHJ@O$ɭR֜qٱ1.D !*XϠa_[-%ܚ\cjr['!p7}HV G' ރE!ߛ첒m'd =!50$57/F:20=Hp xCILVX*8r;OcAcV%yJ^eEL<eXR}8dA",۹m%eH'%IKvSJKc!(R`U@Ԑ(4{ȎfP$(P1JC$!*I;1=%i)AYvbGC;VvӏmK<5";g4~YRvc*5ELj}y]?z\X[َ̈́b@Ia `ӥGequn1wl֊6U$};zTJRJRJRVKy#6xMYڤ,!NU(((((((((xΒ(O̐ڝq^H?PV]_zWʧj6j#MOuiezeN$Iydz?Y R Rr^Ґf_Xr?TȩWv;gxft mce[Ob fU-{\z+yt7 VTR2*G?W.V%oZbݭ3[Aﲭq((2u;4xZI\s'̇S ҥ4cR;"gYj5ZuS1 6Kaۜ rcwջءSqa wK pjͥڥzC\۟~ĽGv:2?),ޗu"`#z[m:"vk|*+(-aJ޲H؀]Yv""Z^(uqGqR R R RN^{:eKC%%K#jGu vGzSuYxˁiV$g$Hrҗrqh6m{V$)*JT2^4GAaD*lǒ^o(ؔhyCV|&R@R9*Q}IbMJ)8[VxSj7%C Ջ/5#sgӁOѓZJQ- by %[<PCo Np <j7vRQri Q)'ڤM7tO Iv-r Z&;M}ml6h1ŤE zlt >RF1.NF7mvAB9KA'OZB3FTyOM㬴CHNSv;:Ri^Y42wAJ* |!<"CN1k?H{Yb)8VSp#ܒO7ga\X~ts;! @y&4 R R R R[kWA5,Kr1$4Vs.!Pj B=AQNT HۊMnK] ]cdnC>Dw u>1ܱSʫ>%t]Ө5Ul<_K$O4U6d$uiGҔ R R  A )AJ-^$M;;zga%KG*#O\^-q̃)) +%@)%*0AVC5+:o1JdqG*#<cZn+lfB]aVGpEd)JƺJd +wleKڒv(2i\=sozf$rq4xyJQ #nn:JRJRJRJRJRJRJT'YxV>`2hR%l RIdG8RhKsiCs*J"Y0NrRx/ϔ/(/1HDW|t}Kp}1b^tņ(Lles 2%XNyqZ J췵eQ RR6'~!O5 Mm;!jm:ߊJT9$ATEzרb5dJQsv_<Մz S⣨w٠ZyRrb6 %{Zrzyl(eJV:R'G<?V RRGMf3EeuV6RyW`9 0*o>??ü zZ~+(B3Omw-`rRfD+)Sؕ'iP$.ņXkNJVv+ZRD bwZMe' 2ARˏ@I*ʀ6-\J$\z]:Gg.2QBrRTALJ8M>6ԶV&nbxmKS>+k;Pp2`(3+U]ϾSwLꍷPcU0%(f 8ߔCaNF;5"m^(!}'n8$2)<3l2͉%`J@Hi粲9}!n_З]=nf nmhye)E>OӅ(Vk3 ^z)8P$|n#N|ˈ `E?$P\t6Сh)~ ~fݮÌ$ԭL7lzsij7$\D'P%$ Ҽ`ˋ:#S fTg̬- IB~U@)@)@)@)@)@)@)@>TztѵǑm*ЃHRS]].[c2d8fO`*'UEqPq6JT<-'$hJ@>Pp FmNdHGtmr=JT؈.-g s_o78IJ'jYJRxRRRV֖ą-o;Ic;Gʎ22@\BŘ!\,#)H2pYٖd!*qISd0mHH 6m;M] ٗ?*yrE4T-5EIdPRX%@`}1]{uC[$ܮ2[+Jup!#$Z ~CoGK 8nF#ֵqeX-sX }\:r]-edln;}Ϗo '?{ydTXu^~MΎ.%%O-i*iZS>dys$NjuJt%)JE)J)J)J)J)J)J)J)J)J`jKj/:zh^]JӸ )>Vn" 6I$G6pLJ1Y_I=@{9 F t[?Uc@ɣ/Ia!MFB 8V(&It<-"% }B=}&[r٤6ڒ 쎜rIfӝjoKl5Oib H[H,$] da:J R0c7,2[m {{'pDuMҵrgYL}lpH$`+ %9P494lDB[ҟCiTp lQBI&s?Z/iv˨1%<(!j% 䶠܀@^+m,DǹJT`?uhubȑoSm%>)s*3s¥]3*WE8um?'j;‰+H }jSΜ4i+uӐ<22{ jOMpa|gЌۙtT’T;oɰŵmR^\ :A?Z*$b#řl`HHv>(R DJs.]W'-ͬ.INе-8@8H+ })@)@)@)@)@)@)@UR1z-H ,5*RNĨXY7 D%LC Jj88JA'_MwMF+,8RI bw%9ʻ J)kFLΡԪĔRKqZpYdrF3{R Ouy|p#nqj3ED&0-mI9/a oO~zTtvL vz#%ql-Bp{ gnkD,9-.^2(PBAFM4ՋűM%2˃B#،A1*5v;j1ph 8xŠPmvgbꎨi_-6ZV' ؃_UkJRJR=HE\]BgJ<8X H(`c9–'7ky>H ̴¿/$zM5Z:s7v1RCJ)*܅$mG>i\`\-!R|D9R9nY9Y-Kcvծ䥠 x+Y!(@QyRxHjҝ#~8dFyFI95j=qTGBT7,-д} ޔg+۸(̆wC3H[Ҥ' YDc8#~8r/t)v X[V'# Qq?af? .0{ П2GHHP-Q eJPӥ!FNP;@FA$S6I6NDUp7%eŚKINs@'k=O\Nl}ҠGW cRom7xṊ,!嬐{HUryHULz4V횸}DNŋ1I  vm*'O*Sɒߍn7*Kv[҃r2 MW]yגOהwU ?"[ڢnmPRTq_w(_jfb')P>u&/UyVF;lRr;Vq)9GO+R R R R R R R R R h)n50.ourTAڶ>-k޾[zqr.MJnErZCk2mI$z)C7bД!!)HR¿o,6Su q7  IH#VէS\giJy_TDr>n9:Hˎ%ŭT2Z@Vъ>&rs˓jqQ|B~ =r2L_TCz[.;ў %,@p)>|`(: Өovxiǣ&#E(-NA8$}W@RpjJҤ,(%Gh8>hWIgʉwq.eвox-*):i?JK1. teCJA^.#NH&|ip#.^+} e̶Tk$Vv己 nP䌃{JٺͤnQ`҇#[J׸_B ;T˸\ToiQ"wKJٶ{J[e^uZ * />ThBN )@)@)@)@)@*N@->]oZCBZټ{TsD< ~WT.-Κ:PVFv:r:` {K@/GjIT$H.d NSNoBH! s[>꿄&j/:Y pyHU(FDHajrDO$2sNح6|c-Lsddk~W`x y7>ewiOi)lD0*A!NHΧNOGg#YZ5ۅn6Jiza J `20YSJe\T?RҜIkJР TAA7"[kX-d[w6Di*;[X?Cq[<)<  `A"O*˯[-m$N96kC߉:OmyhEH.T\HslA*`gn<+[Ւ Zόܖ R)9pGYDk^j 3wB8X2$c) )m,,%.1QO; dk+ \ ck$j$(H¶ߦTϋs %@I|8j^]B[ˈ L(Obܟ"Iϡ<(1/ng(c.ODDij Rl)qRl$ʔ+ *!Ҿh^jα ʴNdv-.9!;ӎ?Pt5)J)J)J)J)JCML{n|q\.qQ;TA baJ ;G5NAc*"n66X9KPQ<|1@2@Cj VÐ7,>\ X:{Ү][v~<6IH!+ܟ)Dƶ[_p+-Y+p\sa#)F8hql=vIuQ,Gp)8PoBJP$%) +l([Kr4Rw'zA)>Ft sa.~i[*V#Mgh>~1I(GlVS8O7FPE3Q ` 5%\;y{t"Ԁ Fpg!G?ԡ8G6D ;SW)C)eD}+@Sw}CYFrvVX,]KnCؑD'reh*۷Ìq(#ϮΤ?J^L0,\iXhtGWVݞح@qgBHYx):oMBtٓ%Ao`:lq}F޶ٶ)Sd)JP)Jjs {cO´u n6qrS⸷AP*P$Jn`,莌8Ėk*halIf&۝ - I zA C%IPN H#i8l\m^R=Qǯl`.Z .Hۧo!iAQvFy8hUl4VP^кbe|K {$s> Whn,XDE2*},8D?VyqMnު5hy/&1Hy%C :]tr:^\R]}+QHJFdd< 1)U)ZKzݮ_1-+ao/+ZP!3<[+r"[Q!u*[m8@@ܜLzRRRRRRRRRV5;5Ý/CvRH*†< d҃:JY=Pv%˶khC/lAHOt|yB F3'ԟRy5g\!ŸAz gPk)'ҫMVsfISJ'1q}v+aQhh7ێ,JLt\)d2N7+UiJФ-!IPdZ[p YL#VǖW8q~'hXRN0AU30ӭHZDD6 Nz2BY I^I8PV7,ąm`^r.@ 2^JPDe%)NSsLtR.ˤhc(J .#~8uJ%ueIZj٩,{ny-%Iu RkB 7C=Dm+Ti55\]At`-v$$F\dtԽK*۬U&Hmӌ\udDb8ym*:cl܇[p۔HV(''趁sv IӋ~B-b 3ܝZuQ]4Jo26[{-6}CiRǗu>y;:[9In:\}1g%.)^<vp4jk_\+sBR?d?5 :[C|LMyE#-RrNZVF= ]gnPc^ߖz(]$<+B|5$𒓌`I{wzVt5擵"$,Ș>I#  Wxˁ{.%E e׵_Q)# (((((((((((((((((!IMu;D$n.iy2ӳ*4L.6'R`d܄6gҔ=Xꆯ\|D-J1oK4ݍJRUy8┠4٣tpiݔQCo!!ќ㱯^Nh4 jV_C>"J+N QR }5q:wf[fڜ5C֌8s{RJ2njҵ1 x-w8J R R R R R R RW{Mv#Di-e/ (6gr줞A'Gػj ܲ?6 %b:\)HB JTbM)Atґ]p-,SPDrp88)@)@)@)@)@)@)@)@)@)@)@)Amayavi-4.5.0/docs/source/mayavi/images/design2a.jpg0000644000076500000240000014073712747716313022622 0ustar prabhustaff00000000000000JFIFW[C  !"$"$Cl" Z  !1V"AT2Qau#67q3B$5R%4Cbv&s'8DSUWrtwF !1AQRSaq23r"$4BTDc5Cb# ?X5*-&T@;gRJI{GF"HdZOi)\F<%-;9}.OĄΆEȲ<󦚄y"DU=`OTQ3I#Vԫ8.߼zv?s-߆3G־dbCKl*5U1*zeӡJҤQ)II,f)_xţW$RZSCn1Cn1<7m¸}94A|&^=P' e'i'ˑ:Vȸ=qlӧE)D#4/RrGN0*szZ^g`:-hؕˣ65Av_G ؓVnqۃCT(_۰<2:7Ae˻Yx!j٢]Mޫ]ʊn,ݖMVH3!",3i˿8YmWmޚ=*-;4j\J2Dc]˖O G-=n:^b%T̪S &dȖ##&Ϭ?`č Ěs>̋ "V%ԧtE?=2׼ t㻶^㼖^a㼖^c:;әwD_OL;nu2׼ %Xy%X`N.wmߎ_ݷ~:_6~6~ Iޜ>]2׼ t㻶^㼖^a㼖^a:;Ә/˦_ݷ~:|wv}||w ,h-Zd֨1h7຺fN)ue$GqpaYh4TEn?32sڐ~t㻶^/ۿ{o[{Ňo[{ŋ`Na/˦_ݷ~:|wv}||w ,<|w ,0}'GzstOTt㻶^/ۿ{o[{Ňo[{ņNb.|wv:ewxAmKw/xmKw/x]?S u(J:8}O6Ԅ˟i׍FI:*iҪ3JSL60$JY4Gݦ7pZcC1:ԪrNU4IАVM&ʜrzV3#)Mӂ,JWEfT"~ kOqUAҴ(G[kqVmn"3I 7h~^_7x1evw^OI9UթZ**"$*lz ށ]9$Ry4ԫiyIOF^ %g""^ĒNuO@n༿:oO)ݡy~t c?E7h7Ÿ ͉qVm 5bU^C1%Է ң"#g,} 9IWgN/g6GCtfSЫ)*n/q} ' A]w=sv?)*n/q} Z/(zAVSU^1Vq{0^P} b<0ah:+뛱X O1Vq{<[ x`tWw1yC7c b<0yۋ@bn`%<[ x`o A]\ݏ*Jyۋ@*n/qUoU^ -Ews=sv?)*n/q} Z/(zAVSU^1Vq{0^P} b<0ah:+뛱X O1Vq{|*4:&7PbiO<ǀd$|0-^Pc>FWK<Fm U*  R "3^izYJeFFFF.c=9>I^pߤv|1o4;NDMx޲m mriՄryf_b 6DjoIb~WG)*n/q} /f\ݏ*Jyۋ@*n/qUoU^ -Ews=sv?)*n/q} Z/(zAVSU^1Vq{0^P} b<0ah:+뛱X O1Vq{<[ x`tWw1yC7c b<0yۋ@bn`%<[ x`o A]\ݏ*Jyۋ@*n/qUoU^ -Ews=sv?)*n/q} Z/(zAVSU^1Vq{0^P} b<0ah:+뛱X O1Vq{e-]Fkd3>tc}!+ZZH3$%)'8"t5=rV-  b#\]NUP4KK?D'tikM(CŷN\_TLVWzwKJ"BG>fo-?PLՋYmsr{!!+"F5'FX Ԉv)/w Ɋ=Q7QLq}6! \~PJIU̇\.tGݵ52FjLΓ;*[э 2rK 9Lk}oMoU)xhFIޕ"2.2.BUH۲˺ݴQ))4ۘĔeOW굗|V]pTPLĘʌRsI [ȹcCտu_ڋ.v:[Q :#ā7J^xygRSTKb|7bҭdMU$% KhJe..B~JzjdV` YQQ,Tf^.jQo[hϨT oO<~-jfgDDDCgXhJ=T͠ BitrG5O j.P x<NpsM9qJt.Iea#i&I-X.əc}ڿ./q eVrQEN(бW!ܶ}I#ry2G<ҝOK 2~⪢0q2dѩKRHhIJMPNqr6mI+j Gt/k%>"mtq{:W xakJj_:Ku]8eG3rVqS*5>ᶢ]k^@గ)ÕWf>M8ВRRI)\$X TnO2oa'[_ძ~\^~ٛ I\(IK[mKikRR0҅ЬrQO݋UCP$N1ّ Bo dI3L9ѕ1|36:MFh2_JژTE&3 Zh&ܓ#3oW xae:፣V\ -Mif3ɛ%&ҕ(%(c CQw(nj\ Og8È% i^K922.}QQϐ'hE .zW x`_$pjSId(n՘ΚҢF([⛆sDJn-n#p.TW4vZ*]6\: ǟ}6KJ8"/ٺUwĤ(I2f /*dhѪBSpЅq]<乖#jᴵm+j%f[eJ*j\s BK|F6e-u\ͰΒMLHeN!SFnfj2".3ħbqUzq;S%NgC.<)HVI&~1_G(7\\*׬W鑛!Z;fjI'Fyɯ `\j66_)LF=|Wb]O9L+a:Ci*=Y4jRԒ/%dR0B+ф"mt_-6&ߧjEn[(ulQOZIhQiFHdd7p$YcgS .r KFK)QcrL C͚eQm&w2f#se׉Il8~ E-u =U)k%(ـDE0*l"P`Tk=p18D|EV"G<#Aq.+*M&6@&v\7j$ZKB[iˆ}X+\G=Y*It䥸&YI(Ҳ#332!1כ"mt_ძ~\^^qZi%5Ƅ)eIkrRfy#]k9+"oa$Wj ]<0W6.ZsG@Ћ3bEZl5eifKN̐ip=-ˮPPl;Lr*QkBӻ潝stbtq{:W xaiwn;#VT!SN%d-K$%(x6EL?Sj((6:P!Rd'*VVim-(ITZyEboGNHB&fgIW xa {_6͗UzrjK-l,ۂv~3%.+2j!.6I2vDZ3BT'ͷ}3kԌ%]{ƫhF6g u YZ3l3_ძ~\^Pvj|jUWDjJM-2"6X$܌Io!\ 机R2N^oNY:,ˍP$ #JHGzy !3l3]<0uvˋ@Ò5rM5x7REjM16{-%'v<$X 523Sj%V rl9UvclQDӈm %%$E)ErKaa'[_K$-jT[S#Q"NOD_qhYlrpAv5F42ڽӄJBVI%6ܑSs.eXơ>n&d~dB8%K_h@Σ)VNW3Z% l3$)Ia8._x᥯4OQTC?;;]kʣ5XQtжgAsceQdi>FFd%yX;x^wkw TGMO`RȖZEI, 26#CNG!kG*j`b|TAAJmsq/v䷓2O-qZӚF豯UiSS6;i;u)5'Ht`޹x#v׶h] r( zӓvcD(ՂI$EgPʞILTq62NqVo߻6cO9!T5w IUyGK^#^ nSuVr[CL~ *<$vHWtSEQɚą4hp$fFDY!@#fG7lќ*Q'[qKR1QHCj*7S'g{HH4vM*\>y*+N"T-}f g˒-֛dQE hdjZJpEG,\I*&t}^~Ϝz6[o\].ө.:mk] <&Ty\hԞd(FY2CwϜDEfWqܵuV$Jێ餒c=m$EgrddEC=8 NES q܉Y} 'V hYv 3iyXrtz˭UkF$QfYFg,`p^ .S.x xٿ߳=wO+Mޕ;ɼNۙXiUzHSI۩I T9 g}MHRNUmW.ѬPju$VIk-9B\Bq;m3Et}(GzTjדjHE>Kˀ’PKBl$$v&f5ʱp^ .S.x xٿ߳=ED&O Ȭnms5lS5hF)0lS8*Q)ęlg3DFt"v=Q3U{AjGmڕ٦NA)DlN\^X˞g"Z])8ԋ6MfS(4u7$Y#Cz?@.3uT.qRIUC%bG4%JY5FEOJ]=\}8&ҍrx'V>% r@jo?:]x&yJМsA=ޕ]&*l46FL[]3~\^^ETalQb9Cm RGeȏy:[|ey찗iMP#Ko~̲f \خL)Kouvˋ@ڿ./q Ma\m8Ԭ Ze48$'\E%sE-#\w$ȑ#yOCm"bVUyGZbKG`뮨R3QvfLu"Y^8P݅-'KJSdn9q?^LE-ҵƵidPm5ސMސ멎٩-(D]<0Z*7|E -1ܪʨă):4Ǝ,$)6dFJGJdd|ǫ~\^WCtEߒĦˑ)kJpCN~/uѲTM3l3_ძ~\^@)!E 'zW x`_3l3_ძ~\^@\ͰΒw~\^q{QH_s6:Iޮq{:W xaD!E 'zW x`_3l3_ძ~\^@\ͰΒw~\^q{QH_s6:Iޮq{:W xaD!E 'zW x`_3l3_ძ~\^@\ͰΒw~\^q{QH_s6:Iޮq{:W xaD!E 'zW x`_3l3_ძ~\^@\ͰΒw~\^q{QH_s6:Iޮq{:W xaD!E 'zW x`_3l3_ძ~\^@\ͰΒw~\^q{QH_s6:Iޮq{:W xaD!E 'zW x`_3l3_ძ~\^@\ͰΒw~\^q{QH_s6:Iޮq{:W xaD!E 'zW xaͤ\} EZ<${H<D7K߻?9 t%?C$ZCОD8Ii'P3 E"UӢpeU&L+B[%`>RXN 0tikM(CŵUvN⦎tZV*g4-\.!DzY,O {Ok=z^7܋Ijrc ^ZD\%t@I!#TZ(ҚnpvT#_Ү//i N+6]WWG?Ov9S5 O $4)&fj5\Ȉ6ߧL-:T.KB+NKHdd2E"Լ!ZU6IҹUi9M8(j?k"y՞ZIjőzXmrcdgE 2xop%(Dٞ{VG˘c_^S(QUL6􆢳)jqIBFf~Y3F`دUtʹ]}jZRsNm-$v52* vE6GFѡHSNmJȌDx4&J.FGlYxPo?7CK߻?9 t+߯Cg7M9z=R*uFtҹ%JI3ɗ"?9}n~]fYW#^a7IBh.2ɛH%rV{Oi'P3 E"UӢpeU&L+B[%`>RXN <'TTΟh2/*isѴR.ui#,n$Z[qI3I qܓQj,܋PZ )[dFyܓd|uo.QT(Ϻh[3\BI2(X4##2zNoBǥm'-f$K Hj>f9.gLT-rjM. ٱ6ĉJqj$jn,`Gөu{j r܉)$YK)-FJ֕DHSjBrvtUhyIK1G[^f&IՕJF%%VXuUȴԵ0C(%,HFXbDU.MDSڵURBMӓ 2kTSci,GquD^%aHRLZEV+{tKUۙW/>0٫4!n`[Dhf\7fA~ˇk_SmO}-ԭ,#JV :5Mf2X&*c򐨪O!(3q }=Zx**3D7E%M"S֕$_p#ӣ*ujSJe:BOױVeF:`Ջsq(b$ .~H]6ܑS^|?o= -/ZDP^ߪ5H!ӛJ;O)$xO&\Swf_Ǒ\ y% a4F&n Y< rd:}|;kSN@ImdDkqDFx"32/Yg#ںVkT-*DMBzҫan&ZYS[%%Y4iX W!3Β(O̒ 6]V %<3^oV) r#簉ؤomEjGdF8:۷FRipϧөNm7rW^tjdҙ2}eE/5K"ʈȈbXT̹jiY~[5 -FfX灵[H\UfSI:XSfFZGx#gqXtÀ@5U;L(3fp5< ֮1#8O?H>oT{R.v&ե[*9OLD\R2Ki%$#3!1Q7ƍDPS;VnD̛E uVܨ,O(d\Y*ꓢ)SE}{M[Px"3<"#1^vbN'ZٰwZ)w*IdE}Sօ3RzĊԪ Z]P4åi\5mSdd{yȓz̥ݴ@kFS$q7YI$ J2P&S$)juIA\G$x"YSu*r^1NM-R!I-L'Ւ<AUsJzO4[x0!U+s,2mHxL6j^L^qHRmfIQRLl.^UL^Ce[xq2/|&Ϭu#nVP .~H]6ܑS^|?o= -/ZDuHTtN ɜ"q(Kd'JK r -ɢExN\_TK25d̶dzm:ԆK6mĸ4rK)>ghwLzk&y]1OBcq iHY +yOj2,y+b$4r[zl_hT Χ=^,<5K24fi>gcTZ=:"HUdJ aJI7dCĎ]nlq L:"\tCa4IRd$J5 ?XĚG,ޕ9BȩKf^}|"3 Jty[lIڽELRt=.bK]Z-Wg)%kR%(Ղ#,`|?\:yZtFFڗKޞxg =k)z?pML{do?7CK߻?9 t+߯Cg7M9z=R*uFtҹ%JI3ɗ"?9}n~]fYW#^a7IBh.2ɛH%rV{Oi'P3 E"UӢpeU&L+B[%`>RXN <'TTΟh2/*JyCuGF ߒQpiL8mdFo6,($.eW{ ~Ӫ%T+~\kp*(FZb;(QԵ+j{rcjա=^qwzOWw'9ێڍc*ERon*K$K8ڌhQr DDw j;\ 机R2N^oNY:,ˍP$ #JHG=XfiwIRp`?K%1KeJK48kF̍{Ty$OÔK]j_(4)%ŒK2Vffj3<dvt>i=/mۿ{X/BEɳ9RRurzҮY7^w[lW )IԂ2VܑcZdXJ]+q]QLi[e(n jQ+ȻoN`VT Hq\Zd13:#MRPVm:c̸8魴S-||DҜ 5m,ATupS:ѽ5wN)\4s6ЅMY#IK"#< Pjn"q~}ZsI+&Z Dn!I &bWT鲪NA*\m o)Mm=ńM6y.cc2Z*ᡸOmK$ӍȖ,kU4$梲ԫcOS)z*+.BU;R(RY%nԏUcC|w+%Kr%[op̏Ղݰj EvLt'I,X1E J$35ϐ:.}vvSj!M.!M9RMGSy -&uh_rdk}!gڷ[4mm7gX+]Lu8]ZR[Y K߻?9 nMw$~sT@vW_%o(BsZ-nŌXWam4=(BHI"'DEȈөOjc( {lCy{N5K̚Eڮ/`Eڮ/aJzMFkiy]H{UH{U)@/X kiy]H{UH{U)@/X kiy]H{UH{U)@/X kiy]H{UH{U6uMV+7vV2Re8i-#33""ɐTpQ8}ynD}U2<+qQ`ёepCjn{Q㑹ʉVIEڮ/a%pö}& +7QvE[ēKțJUݜ6bTisդ|,u.$".I伷H,RHΕn\nh4M=DE-+Ң.J">GQX'>;Kzw%TDSEZS"\yj2b jmuKy%8A.-Em+%5!RGAĤ3\\VT[ERI"֥.|&_[~4.:L5iDgKqXNe ұ+$0{V֤FUFiW$W,kOjcOjc( ؆kiy]H{UH{U)@/X kiy]H{UH{U)@/X kiy]H{UH{U)@/X kiy]H{UH{U)@/X kiy]H{UH{U)@/X kiy]H{UH{U)@/X kiy5[Zڥ%Oa+bRdh(Ŭ4"5ujx_2ɰ/$j."_-M꺳՚lFV&HTGc!JۈS=RTc4Y4IT+QgҺti.%q ғAF,JI2σJwgnRqgu{ěRrEȨS*\jmzD9X:D9Xly5Yv e=.9)&:\ҥ23/HYl6Rw  IIg v½qQ<[S~ΐ7v,%o8ijzHņޯO#?tekU :W͈xoǺ'8fG%#!Ԋ'\_1*hZuINIq*RLD_Ȇ7TYcӥJsNyO;%qP\{$X#bcܽEbEQ~H:D9X:D9X|wE4ϙJKΑĦI=yϤe'OoSj,tCޢRYy Brx3I{K8R̋s"|xLw{Uo:D9X:D9XzML}E=pxuG.Ӟ/DsOmZrX2K$deúkS'USj*?H{UH{U)@d`h&43\K̚Eڮ/`Eڮ/aJzM03\K̚Eڮ/aҠiSqз"q庳R֥FFjRFh 8k65 qi͸LrUUIM`Ji%)4rQef۱)][*ID'X'VTIɖ\n53A21<⫉j7*C"*S(BHjQ"""əm_dB2K~$X 9*Y:ܪ%m8G[I^PIArN)"ۗM~{ ?z7o7b.tFݢԪRx}!g/#g۽pyI)拎αqt&U56ܵ` <vwj OKRIਈAQxʥScErFӐYYp'GFffffy3 tj5$H{Us`n༿:oO)ݡy~t c?E7h7Ÿ Mo҃CIsޥ:`УOa3$XuU= ]rS>jk/*|Yrm%yd&ft1,Ȓ4LIfFLhf$r+aB֒W,aFFD/<]1wJgBI3dL Npi'Nԙ+vTtc+QbA6M$r"",X0ƤŌZ&$O$Jv|1H& c)EQ)d4+uXUuJ9qIRNTt!-) aۿ{ HsOn=zIդʩU)P_Wvߏ=Wvߏ=0Kr'Fl*l[UIX5)A6emՒH$j#{[gW#R\&j&$([fFY("b\VE}㼂q[Y) III2ddy#!7+vǞA*ݝ"S OlӝYOFG(j"\#VO&JFdy#0P"=`/o:8g[?ΛOzg{n9<ᩏDz}*)A0yc9<=[c1ȋ\%|wn<|wndTm-ѳ:r;nyr;nyJy ;m/+vǞ+vǞ[ѳ:r;nyr;nyJy ;m/+vǞ+vǞ[ѳ:r;nyr;nyJy ;m/+vǞFUl:4zŝ ތ)TZʔII"3Ttr}Zr7(?}>/sFj9gQoP0X4Zj5Dt-enԵI!jQ"">њ&'r?4QްT١BljD8o",W:D[D:D[Dnp|ɱysu4w{-w{-7@V>dؼi: /]q|?]q|?6/1=ZNKz'_.O!z'_.O#tcM}A֓މ˓uމ˓_;5ҙ7 +/O\57~rꈻHT]fv!F$ϘU'u-D[D:D[Dpք4>uNݚQVnhSQ\#I3¹84Kj&iIb-sEɐqM9CiR9#dEK\DEE2'Bu7}w{-1zK]Aclxqy2.FiO,皋zϐes)]4o)O߻#>Tr1hBLcJq{F%[ؼ5$r*r]A[uUv"lN4[&jJt 94d)ܦ\SɕJm=$fFJ$O*da$Fd4OB q]GRN$ZL''Q$+.͵mv.j "I!Q5O Fky$|tTlu| SkfʷTU3:D[D:D[DbhԷ*Vr5V3KJBQ"RDՒ,A.JCVJysu4w{-w{-7@# ̛'An/'n/'±&>IizD[D:D[Dn0|ɱy:t^=r=r +2l^czɋmǚ$HQIgۉz?.5;Ӆ@Q#:4{iСsrV\rL P~uDRNYUimG!Q+$mIդY]q|?菍xr8̈%J?֋ ZknZ%jUމ˓uމ˓6/3i: /]q|?]q|?6/1=ZNKz'_.O!z'_.O#tcM}A֓މ˓uމ˓U[U({ʱom5RI,Ӹrǡ~T䳪T+IrIw0JIm8V jSJ.|739*β.Zsn/'n/'mX[2gP5ZɱKr:f2jRm 7RD#Q,[Pɶy^yB[ĥI.GbwhRZ%K̙дm: =r=r=nҪݱJ I: ҇ W 4k3(țoہ>T*Xp(UkpVÄkI2D:%j%Sh:t;Oe\Fܺi+,.$76㫫ӏz f3meaUѬ5kP땇XO*CBKL&XJ>g[Xa^թtkbbP W$[ӽ%<9.eJm)jԫ|aƢ1j1i%&t]sz'_.O!z'_.O"R:O;j]Nn N6O &GǬHyIw>,K-JImHᴝJ4gJs΋:'AֺD[D:D[Dp5ݪNuޔ-yX5DfM`Hق1ӯ lF]D6dN]wgKSiRP|˒DJEDDEu"h:tw{-w{-0A*JqBNI8 [JԼ$|k&.mpF ȥz+il85JGeGDŽi77W)/%LZǮOe\COe\D[tlRHjem‡M$DJ<: v%Q>KNIizD[D:D[DnW ̛'An/'n/'±&>IizD[D:D[Dn0|ɱy:tW37^aPn: "ɨ33"KT?GZ: \JBUK̭*ȐRjY.$l"g:&] jV?t/ɪ?ւ7:Q{ CTԿDx6wMhr:Ijj৒w^ci~*_/? MJʮӡ5ŕ*!QjmIIdE2|n'E^!=brW[);jߵdDj>et(ݫETU?D ν/iu<cېrs>n4g)95x{k),kNr,wrg!bNe:urcҩk1hVi?DG$勯tlP˔IR2' q̽D|W(Ϻt\I*dVVԍdEZ&+JtX;e̝S#"#ڬdeCyrv,n~hgƒ1F+ҁ M:Qh\/T{}Dɢj#ÑpՌٜsOaXkōPfӖ2ܕINhږk22ZH|ڰ`G1r/ +T^WR"-*q)IOb] g^%D4wOIe8ɉ Ix?DxCZOzO}F΢t), qj%q6j#S]6×I4 JLD -݇YʣX>/I)WE^Dy̅EIvb% RdeI1 ܛ>ewM4ru UQiq$͔FUQmOHzh=jƉQT:E*4YPjImFڔyo$1TjF^u}--:ƟnKUkXJ\<ȗ#/D>J::Ucϒ^yԳԍMmUҪ.d%& T2mdꈻI]!1!|j,5~XĺwY?,];f=o߅ǭ{@MjOi[TDkI'ŨmN,ȧgJ?0RوM(oNΑw˳uΑw˳WHfԽS"\q|?\q|? K:(NΑw˳uΑw˳] ԽS"\q|?\q|? K:(6\=6z}уvF'Њ6S xIA}#<㐧#/g#/gfDFk:uxƨZw[9^N[vyѵJurtfI=w$:e~J*۶X2ʋ]"P!چҶKi3BVGH;D:H;DmTTpe3T*y{VɹSO&ZTHW*gɦ1.OK6$J,b3y rw@"->@bЬ0I!Fg \q|?\q|?芭1g߿xS#:K*5GiNTi,!TL31{AZ x4S0R[Q)*/G]ylH;Dy B|5wiTK6ċ҈\q|?\q|?WHk`^WDwtc]Ctc]BeyC$ԣ"",OuΑw˳uΑw˳] ԽS#^OcWݽu]DUn iy錗m'khٱC%Z45I5q2&|}:G_.!:G_.#mi'\Kuyrp[}1u\l;r-'o `ۋJ̳4pâ]սkgAsj4shvs-$vd]j.״ΏH>JfFީk^ƈ+~ dYs:G_."15ԕ0m3T+%|1`XqoKؖ6%:(4^$+5Q25gg_b7mCpֳ(+r=Q:G_.!:G_."5ɔ`^T:؏>~ qZuuu(5:F՗p+-+OYI=$"<+Ytc]Ctc]E]LLVj0e/T+%e I\aT66+R::j.C[R{2.\F7/NN1ouNY[vݺ[IuKys#23'rgztc]Ctc]FK..U K:ʞZ~PQ#p SKqSW nm^6 q$|RW[2u]fPU-mI)%4n3dYVQx\q|?\q|?Jsnŗ7`fTFt8[ϙm[U ChSjJ ԥ 'XF1m9}:jkɥ2$͊un5,ɮGIJA%&6ȹdmdc]s{s{(FJ? eO"XQ)jk}nbZ㢈Eq2BQK53#Q}'zH;D:H;DcHH>DfYR\q|?\q|?HNey@'zH;D:H;D.`^WDwtc]Ctc]Bey P]Kh暍vRL$ܠmf҈4II}fD^gjjdh#UiYvHWV <(RMDR,,)-fy,iwmߎֱK~MQ#ڱB ue|ˮKZ% דE>Ca#|8!|v2 Vvg"=2׼ t㻶^>ܸh$%ηkV6 h}jABn2׼ t㻶^CXԏ7iũxyt^ =-ݏPÕ5Fc,9.l*LV Ea%y.DdA}BԷk|wv:ewxA WQ]t8TlI7QbbU12IMQ=q_J^̴pˤ6oH,)CIR[HDFYQdOpˑ-KQt㻶^/ۿ{oki5qod9Őҍ4vif:E9 7FDD:S$׍FJg`EcU!7-Kvwmߎ_ݷ~:ʼe]fW~ogLkۋz>Dk?Koa &IG*9pDtԴm"č)n%yQ *kWUx}Էk/ۿ{L;nu%nMC!]DIS4GDs)4Zn Fi%cֵmjtxTtyQ 6еq2V\D%)QY R2׼ t㻶^BI]&SޣކfO:iI HKԚkJl\xS5UnbzFZYx֤X3,dGp}BԷEGL;nu57mvPvUR?#V23#Da i4Y_r JiUUkSL8ԃGHU-'I7#n ޙ|wvQܪn2׼ t㻶^e/ZQ;/ۿ{L;nu(%/ZQ;/ۿ{4yT9UwP* G%eB C*K.i\jI([2p$?GiYMM*bȌ9&GOrl=J fzMb#E)n^ci OI WP]OfPT]C1g$lk%*ɫX2<%pvC{GJ>6RSD 2%#ca4OSn:I:l~BXH"4\%|C0Jr}n.o&lmq*n„nUr8} y$-%8E 534'}\v.@Q;"u2J9/& kIZFs攺"JM1oks%QYv K#.5$uitˊ'RmH d3QUI8eI &-"rY |D7V#ZIޤ\8MEydFÍ4ZR]GC+X45q;LtHnOEq xIVy`Gʴ5S6tBeM6{%Y3SNjQ[Qo"Oe*鶩~LrBoDRot5KVk$pNq̱9έ3b&z8*?[J:FN{co2,g>`jj ^ʬQ-ew=N6_#r\y9J,龮Z5kZC];ͼօ-$x3"3,kCڤ.mƒJijlTDNDdG!VQU3UBg{FiҨ. AS۔P|猷Is.dm˘[_O+j)}*K'C7˟D!y֩iVamđ! ۧmN,G&HR7c g6&#OǤK*Eb$rZK.n6)9w2,&gUZ*NK5r:ť-VE*]'ѺOEz9Av*Nv|hwF.Vl̂᢯FtД1&ۄ],yKP,v^T y26# I-rVSi23Ag"JU/rj/(931iŲyGb] Yx/$-ĺN^KMNP;]f>>~ƀƈxr}N{RZsPKeiIp DHh`?DJE!tJӑ)hQy%DK${K>:3Uҧ{,;o:$7'ӌ R <$/a-(^ԗ>b)utW--PEʋRTmkB<{Dڤ}N026 CoaHDdGC# 6h2"gdoWlf56)(E."=8)2-F\˟1.J5G:zYĄO6ɸLM[PF|dY 8\ӧ>ME$ ʩ b] hirD$h+)seD(W(P7M/qDF|d]HHǢ"}l%^$ӬB)1iZ[Q|E5Z7XQj*:MB}&{q-O H&ɻ)4zzp(BvDQJ'#cLdD]{kSl5w] 1~+d2\KN!+Z}YI3"2Jyks5}fm;o- )ZdK>G'J.ifNu"teT.Dh44"J4`9X Vx'\^$LmFNsjeŞKl>d*1O>7 "="ydt T'Q}iSuzаi܄oAWEt.s'1dMAa}r VafLlZOJy,"c$Eŷ2زQШߐ`?Q$FLoY]"ۣUh2uQ`#:UW)'* M`ܶҞGV6Ӆ:i5)w SXjrCF%IlLLRfe'̋dHʈ$/יG#Xky2EN.ޢT* ɡFێe^A)5HggX\3VbI=ǒIz(MS`ifGzZK>Ā r@t֒$8N) UQ6ڜYO` IqTI܏/+?xݙ+ ~=v=v@ *Jlv=:X5xG>,1bfJbINΑw˳uΑw˳&'A;:G_.!:G_."wDu'zH;D:H;DQV.\q|?~Uv׮}cPM!]X )ŚnR CW&%t=ZNVϩƪ~DV涄i2 iKJc1j%ĺNo;QZKc788R9oOw-a~w.u'>DVɠJ<}GEXϖut ?cMuMfѮM0GBci!׍m2>!s$C\pZ3b,[mڋo7CJ$,]ʇ[5:ɸOGxhyh&a+vH, )35Vum~T~̄߻6>T$F-Tg9ƸIu-E!(ҌQr>bR[X:ð+M>JDd2XQ21kS0;vr_mˆ-OTtSؕ34$O|w37iU94-MnO>Y!$ԌDe̹XnJPP^Zgv!%xf8kI%YY!r!sq 5N|*]:EF-6_}jQ""!/guvՊBTɾ/Ez:lV 'FHT ,@p;i כ?!dKMG 40J4ב/;Գ݊UeBK~MQ 90"Le.j]Bͳ%?W.+^յؑb"MzPMY% ԶQgn%L$J3gW"V͏@cܪ";M2 [fI <"=Q=E"]KRRm2W!M96 2FѾzm[zFI1Lj 0FjN D^s#R4zAkfV"2c-Y^}ȍ)##2+Rp/bk:ésڿ}kQb<vRfVf'(Ff-[2xC72FPԥ*#CEGi)vVTPYM%}BJMƢ-3.FEٜ,KP&#. W7a&fI*,+˰brC75Vڹ"JM%]TLJ*Ӎn^|9ͥ|?t7=:riRur}-(N6#~\WUZ4r(N\j* 2km7 qII" #f 6I,]dīSoV8l2LH_JMFjRI&~ad^Zw]T1 S0%q'ZZL(mfɑ'r{2Xl"Ѯq_R%J[FV" 䳌,EݛDzOJ]><.?gQnOnv383*Dg$xTJf;-vĬKb"DL5-+ݼxwdnS \x4}D ҂#5ys2呰VȪ@C+܉lS[&GKz#JokRӔ-|XWnK+-Z}kn=^2mCjT2XcR ݣ[sy:|[Xl*n/Ie5(-7+Rh)v; R.9ɓ9F褓^ə Uv;-rK*3rB1G覗T%Y-ːھmjfMrBI,mOBw}ȹ~:5DA#VmٷnUIJXnAM8d)&I`LiЬ TT*}%UaDnAyɷ$(9,\ӫ[ոTP Yy"eHN\4s=4fy n޷cftVILS dXmiZ=̉wyԹqݓfZ"&4xd%-$f^ {iIië@QR9ISo6i"o6?kw,1sTHHuqUkZDY3VH-u ™M$w A-92DȅR,y&;(TԒB]>ss\ᅥ'gV٤ie=uTLB\ąxԮJBTDGDv/]JSYjDH6F0I:Cv}DΑzN~_o*%3GbVP%ٱiW"CqY&MLNZɕ! mJBҤ%$|$|lzc?:c?eZ(#tN/ۿ{L;nu|nM|nML㸏M:L;nu2׼ u6Pu6PM3?7D2׼ t㻶^vAvA4;t㻶^/ۿ{_,~ۿg_,~ۿg8#tN]IrҥeƤTt!juͩA$"!**V!B[$,HA Ԧ2<z_?|߉<*ԪΡ@G¨Kmد׌f2  Qm{o(톫 rUT=)?x[ Ϻ)j]RN}Jl).!A(y9o4B[B]5NSsr#5m 5o$y$ig\%) .\D|!vs:qtgN75N2I lERf_v zA5bP!VI7K&%5{h!ss5DW3ZکahtQڝĈO9Idͣu 'g˟`ƩkS"ɸƦH\yjz*xQhlՄx1Ɨ_McXtZuEuWй,R2܊%&~FD,iK 6jv%2DQ0t67ҮkԶ1+zviM OYe$%)2[Hsvٗ|psdBa/oja*R[(VR~c&DFYᶜm6^ 8VqoKm:\73JT) e9qSZF͢j"&}^͒ɎBg`jޝ+lQ+/IfèbKAmr>IQ2J-:)5#NS\u0w_SMgG8iW GH\eg^u:=FCfM=TϣM!O5$]"rXuwysakD-Pi#ТQpOqKE~[<='ۚwuʵAܨiJTr\CxDFD*ٹ(]-F嚫"k+"K*Q*ߍ̌Gs$eZ3Q'Uqe=1 d\Dzj58Y]VRʔiJciyDDJb uүuƹl;zֹ\^T!DT]`mmCPi*ڷPiFoAr X2%' R:=:kwڞzm,,viKN]q%6!di۱՚ ̌K̍^"T\[vF؟rĪ%Tr&cim%!I%irCVUHk&R9yi%nK A##?GK8cR(zVҘ TIo$>r,C-c?Vv JY6)!2 :GY4 g(UJL[-VDA%! W[VN#I>VYy*Nΐڝ#$'5jR*j⟜jq6Pm#>I5Kq<֦i!4PM$!'y\!`1*.E34Sٽ뺉u4O6%7-n$K޳9+nn9JF*"Ƨ[2_ɨBKq㠝, ;1ڍuI(b$4V-P]KhvF7M? R۾<*-UfG&J1"54ڒG˰=y \q|?ձxr^'v29Lr197+ĝ#/g#/gDfA֓#/g#/gDXh:ts{4]6d6lϩR$%̸.1+F$`1wDu9uImI#-ZeS#2|nBtc]E 9v>INΑw˳uΑw˳ZA֓#/g#/gDXh:trM.nW}Q-Iן",8DJCi'14HyhZpVjW=z%.aړc#&m{[}fg1@^73]i: ޹=v=v@)Xh:ts{s{(+tMZNwtc]Ctc]EbINΑw˳uΑw˳]4i: ޹=v=v@&'A;:G_.!:G_."wDu'zH;D:H;DQV.?k'On8ů%ne!&kh#6E)JK32"$Cit~M/+-LXKDݵS?#<휐<}rtme 9.;j,AF$pDYBu7PT~5}X??b_&_& 㯗|/|/_&_&:|wߨ:|wߨ;o~;o~|/|/_&_&:|wߨ:|wߨ;o~;o~|/|/_&_&:|wߨ:|wߨ;o~;o~|/|/9W*3e]yۭ9QuHZLi25`ˑw{ϗ?^ ;?mayavi-4.5.0/docs/source/mayavi/images/design2b.png0000644000076500000240000017772012747716313022631 0ustar prabhustaff00000000000000PNG  IHDR*H< oFFs5yO pHYsW[զ vpAgliGIDATxy:OGcvٳϟ}>TTrʕ1_{Oz/z?޼ڏ… ۷弮;@]!~jǏ?~,....+ >qחuˬ:wܹC Ջ{nܸqCz."""ҡ\w/۷m۶m;v؅ ++++x #h|||u^?~ⅧgppYYY7o2dHĉ'O#!!!!"gy|z>lذaz6`; eh ͛7~~~~ԻΝ;wN>}:#|(^@mzzիw?-:tP99 EEZZZZ=|gk׮]EˋJK)SL;{VgϞ={;Z2| m^~ŋo:vzzzz^5mڴiz?=@=xy~~>|Xa--_PO P?i ?ڀ5\^nnnn۷WTTT|J[~˷oN:u{{WUUU}|ՙ3gddΝy ҥK'THHHɓT ۬}u9sEEEE??pmڴiѣGӧOfͻw}{1x}2|^ѣG׮&MܞVzzzz^^JQQQN^|[ bN8q%ɒ%K3cƌ֥ݹ#&&&ֹL׮t]JereA ƍ7~ PrtDa[n=zT]]]Ņ9Tаcǎi 30ԡCBB ~ քzzyŋ[_~9S]p%N +---=v#GYʺ?111ڵ뚚Pho߾}ׯ_^=zJ~~~~ttBBBy ߟ+-]Jƌ3FEZy(;9#%%%%&6jԨQS}q޼y&M.)Ig -Yl2G=:tӧO\r/#L2 keٳ7nU4nƍ˙!J!߶m۶mPJ\dj,aǍ[lٲ{iݻw>y2qĉ4LQK;w)E=y1333ҢmUUUU Q+)LF)p,9!ڷo߾ju+s9(_2ԩSiɏS+&&&&9k׮]t1666Ԥ3[--_۞?kԦM6mP ՋB VVp%_GZHxݻS(Zbbbb2r$;VVVV:ϟ?k)5((ӳgϞ'׾p E|rz־**"""":0ߑ֭[7QQfȭ`MO!*RȗWTP/Z;}zzT+~~~v(֖-[9;|Is8R4}}}éÇ/ Q/3 ~q2R~k(5Q(&h kr|aa/^M8999аAZbdddIϯ\r%7켨TOOOsf9rHWW2kB%իd]rf))))S{1bįݽ 45///czgϞ=efffb MMMMhbyyy ԧ(ϗϾ}w:tP99z~رc.X{7ᐔ'W1qe缮':55i-MM)UݻӜz+MBBB͛7o˩oTUUU{N:R(fN|g]Ì9rA4#!%h?~4p}ݻw>}^EҥKvPRRRݛKTTTؘm4T̙3gj Z+###ceEhBYsWWWmv޽;>ԧ`=v{(ؗk3̙sR*(P1fǏ?ݻwo))::::: \zj^mLϬ-3222vٓ[-ǧCYx]h ~kwN|Qi0%́ -quuu4Ç o̊+V̘y33EhnA 9yzzzNB(յk׮""FFnݺ Ӗ}/Xf$̞_}ӽ;3^;vhJOsVR޺uVX3E׮Zjccccǎnn_|[zN}ϞM>|IFFFFBn„7nسeeC/heڻwS6o%vv9ƀ_D1SQ? y]/hN&켮4'~@CyhAZ2dȐ!5];^W WVVV&'.мXZ#abTWPw||::|-_b!ТOo޼yS^429:::n zzzz]tbdݺ5Z;wmm y]WÆ &&&ֹl- P?HxBܼyf~~YYYKsaC8rȑU[flIA/h2333ߗ05=qĉ4^/h|I߾}VUyo߾]Tdaaar}PPPPl߿Z =zbW~@@@@L 基qƍi… EK4555͓27%::::.QQQQ+***Μ) '###cehѢE!!?kݻw>~tuuuݶޅ8f׬gϞʢZp~]ίo]Z0 믿n2444\XTTTS'KnݺuMJJJ\xPvm6mڴe˖-Raaaa6m⢢ҿ?sK Ϲm5jԨQ_x͛͛u+ KNNN޼1khfffbה)}+-M;v8v,5555''????:cǎBBBB2222bbbb:q }ߺk ~pϟ?tppp ׯӣG]6Φ[nzhttt vvvv&p^UUUUyyEEE޽i"s˯_~񱴴=SMhǏ?feee5fLCŋ/޼)g3Kc͛{u28.}'[c UAg4G5͍N6m?s-=R0 ?~ {{{{CCf؋g Kuѣc\[uiӦw/7NtҥcG :tŋgҠT 7777"zZz~@fa˗/5ؔccccMM^j׮]mk/ѣGJKAnK >>lO[XrڲSYYYYUզM6[éSN5444TW?}錌ϟ~=999իWܸqƘsΝ =zhNZZ =pO>}w甛ݖo߾}[^Nz[JzTVVV~ή7o8-%Sg7'O|ӧO_ 0`_^vݻ;`FDDD,]G:uԆ 4u˖-[x/o!UUUUFJKKK_frÆ ^u[nݺty(D\Kˏ;v%v5i۶mۚUUUUÇ$ֵskkkq9rkPPPPl,k5555m۶M[c VV,mڴi]vjf&(((O:Ǐ?}k3=&%%%efjjjjΛ׾}&SMο֭[ ,,,,V31WRRR߽{KСC*g׬)---}kO!!WIkмodHZ>z**OyBum' ڵkvݻwo))Zhl0jJV4+n```0bZ%%%P3I6oL^z;QEf؋m۶m6>G`P?,ggggSSwVV/^x sm^^^^d+W {/_|MPPPfǏ?~̭]PPXXXXR0q"3E蜤D%s~)/^3^jE!`n9} U#b-a̙3 ={ի+W\epADDDCI&Mi1~^w4}ŗ/_JJJJbcccSRh6^un0cN:oOinϝӧO_;wܹCĺٶRȆv ˿:SsG d JJP2mmm 6LN.+++իWng[8ai^&L0AM2رcÇPR3gw?/̙Д4 zaПv^c1ӧO|0`_{5D~I_驪O܂@ q͛eeee.7o޼I55y]'[0Zi݉'NF}~@+UUUU;e۷*<{٬,MMMywbٲew'OLO757NRRR߿*++++_߅ .ܵP9/nݺubJ1111==%%%%{ݻw|ڋ:t00rO>}͚ׯ„cRRRRf&sO ***jl 'P̟?TGm9{7m۶nIIIɯg'RO4=p gցCKJIYf =y2...%vmH>f̘1۷o/$ae%----.NY.]t^ڣիu\XN: 888ĉ 6l;ׯ_VV;vTgn3'gK]>Pw~pݻw..{hYf24TVVV55k֬9x_~SRRRn秵sΝkb߮ݞ={$$ܽ{'}+***Mkiii)+khhhԤ|ndi׮]m]vm޽{#GmmݡCBBMeeeeUU@@@ܹ .\8y2| P JJJJ5m­(ȑ|ѣUT>>sssQuNGGGgȐ8N R-) |嶶dbbbb.^\~9s)aGhoooohvl'UҥK##E4#Zz!LY?~ [[[[}}f(PnvEF^rʮ]̠ ˗okuo.v^z3Eڶm۶MÇ^0m)hkkk++/^x!Z"#FURRRӇ3Sgggg8888L {CYK~ȸwHSׯ?|`>ikӫu6ӧOȠ[?R.fΜ9ٳg^rʕ\ DDDD:t4iҤ㼝9?[ Z7777 /_| fƦЌr z1_E\k/ѣGjCnKf/$VԿ)+++BIgΜ9>n3'g,pKgݖ%L424<*1111 2|;w~ ]~]P[;CV\ΎsM{ϞےG'W====UU-i.٣G]ry .\y.yyy=G9r 345FCΟ˷oP$9ZFx^--^]MMMmׯPX5+V4PSSSSPʁ;GЙ|ӗ/{ݛZ<_Ǐ|9'''um۶mW^{ڙ[}wR:5rhZHHH..4o"a-fpܙz'uԩ3cK,Yg֠A>>>>vvϹ;w;v 4444\\ϟ?\\\\\D$....55%%%%;{ӦM\\XӱZ?888xSSSG1Ąֆ> ձ puuu57ӧOss)FWWWךuckkkv)Se˖-[ݻwSlOE##r7mڴiѧ֞1cƌٕI;s OtPPP w eC Ǝ;vK.]ھ}Ŋ+}|||k߾}{!!&ү|sϟ?iwHȺuEGZeee}gϦ˗/߾mbbb2r$mIi.ŤG(ySWWW8ڵkvۿoQQQQ+VPrn/Zs'Nq̙37ZjUd$'z8"xš'RffffH{{#vVZeoOg պԳ۷o?~_[9\߿^W5E (;thϞ={vƮ4ۙs;T|\hw }]qy#####!nK wܹ?x OG !9w4CCCŋYx 0`@^;@aVyyyyEE3֮cǎ)VP)==J'oiii;nܸqÆQ:Ç۷o.*hdP?h^jP a܁A &/h0߃u@˃@C Z$A !-4SP@k4 up0h&.@~![@K422A B]a \P@K@4W~@!:! _PGu+C B]XaC @ ~G x/V.h @P4o "O4e@A @.h@PT!!a~4)uB /B w!/FPw! /P@cB _\P@Ӂ@/z@ @ C ?!2 !?h h-V.@ %C Zv4~@VZA.h4W~@P4>A :B "@ Z '0^B B]0ƆpB]u@@c@ 8Ph(~oA !M~@--82/VMk r/V}ZMM@ P@A/. /f . C Y@ 8@F~4Au@CC Z x.-%C !Ma Р 0h "B + .h/:B a!]@S3 M_jo@@ x /h%h ƆHu4}@c@ Z; B]-aM~AP@k@p_к5&/4_M9B z~UW2OGu |?4w媣yA0+ {f 0 _b  +qEEӦM/###ce% '"""bd9oݻwϟ/w8ǧ|tppp d*WWWmX_5o޼y[j_޽{Gf}Ν;wӦx/___9aP)z~5{_n.^۷oUU̵UUUU߿gdddܻGN:ujbbbb@@۶m۶A7nxuyEEEׯ_zݻ?suÇ+(j_rrrr >vANNNG^;@C0 fe {uܹsK^~=gΜ9qѣGgϞ=pġAz^QQQ ۶mvׯ_VVvСs-o_nݺUP8y|z>lذa|| z.~5c/_|Ç Rӛ9sL\6444TW?uԩ۷o߾?...@sVZZZ/^yCK=>|bݻOg{EEz.,,,,(ԧWVVVۗٳg^{GKx5Z>vڵkۖ… nxf.;yyyy߿`XXXآEe1eBׯ_thܸq<=O>}:#]Ny®ݻ䉭uҖsCx}?~E4555h kr_WTtҥKǎJJJJ{!C ߟ5!翌zZQٹs'ZXXX\I ~ !!!!'O_W^ F4bq۷{w))))11Z˗/߾m۶m[\-qvvv65_OZkŭ_FZkhhhd ԉ'N>z/^~ak~7k0dhpEEEEXLRKsJNNNƆzK=}W%RtKBBBB+V|ۅ EEEE11****ѫ,YdϞ7o޼)/gƼ4ԩSzdnz]{x~[P} F%>nο29… 6ow;vq8ӧO_.TUKKKK++++;yȑ#GVb]bbbk>DEEEf/f/JoOh8yMU[ qӧO|1cƌ)խ[n!!TN```3ݾb\{_X6bbbb; !&`_^ܹs۷o֫W^.cbbb+V1ە+WҒj%aÆɵiӦͯwZUUUUyyZB3i Buq F6l0g=,,,;&&&fٳg64wڵ zG>"""bRqqqΝiɓ'Oѡg$;;;&I0 3e;:tAXPnlڴiôn |sMl/;야cǎnn~-Zښ5Ŭ~aYۍ"+ {l!莴;e4)...ҥUVK?MZAiĉB%T&=/((((.an3a^v~ǎ;]y͇B8999JKKKKH09}隻479cϞ={N\{k3@cMN=W-סC]ɓ'/_R0{3gΜ̤-7hz%e!XYYYY谖ӽ{{͚z[=df uP$rh*j/^844???s޿%Kh-][[[[R޽{۷o.*bŋosYYYYIITLww{ٳ[7zHXlЅ;e%uEbjjjZRzN=ਏX[իWj8Ѿ Ztuuukh8baВI&M֖sŊ+iСCڋ[ߩA Ӈ]n, ,@@SWDw);]p f_B00si߾}{AAzݻw> lt;<<|pJ M>z3f̘1~<4}}}9swww߱슓&MZ3c %4dA)-.N;=EXXuuu?ݻ)eW,`;wR^0K9`ijsLKw<= 0`ƌ#GtuhAI94f̘1**#F1p F0XMe8p@YYzNa,u7o޼[Zn2ۍR37ې# ૉ>WW2PWtdٲgϞʪ˫h`\\\5}($BC)k/ZRB\ZN-Z($=azLNNNyfY?~D=޿֭[I_`kMB\UUUuI45557on߾}>~g---iyZN}n?iɥK.ءԻ7NӾ W36~%...njJa)7777 ;vpwSΜ9sfFCCCCuu!5cƌڇ>ᐴ[;LOOOˋz l6K,ݻw##k~k8w56_Lj j* _u@cB0Ɔ_ HLLL Kcǎ:\@HBika/B[^vZp)4 cccc}}i'=3gΜi`@o߾}ѩڞ0% S~IK_vݔɅjKH׭[ёfdUHKKK۹]vdnݺK|bMNC90WVVVۗ=$===f6F)'''ףUe6~)ϟϞ={4$= 翰2y=z~@@:)@0=&&&&9j֭[Ԝ7),,,<~|~M>gΜ9AAyyyy7VL ,XkפI&X@ɜ^4[g23ڛ7og6<<<ߋIo a6 -Y~qNLLLsgIIII11^!ZZZZڝ;\|0QQQNM6m8Z^UUU{{{zzzliii9fLdddٳs?nҥKnf D@;vuѣGи?9rdժ>u]ѽӲmϞ8zճfL ,ˋطo߾ŋwڵٳg^z58m۶m۴3gΜM~O^kCaP+E- J^ ׯ_?i'Or.M|֭[7QQ^׽%@!-S=_`'NHK4ׯٳgn ՙk3222ݣ箮ڀ6666zzϞ={՝;wz9s16~˷o۷u3pJGׯ?|tҥv[MG=*-=uo Д -G=_4"}[UUu֭ +LLw޽;>:tʙ>}5kJKKK_f}UG={lVet޽{w e˖-ۻڇkϧݾ}8QQQQccz:|ڴiv̌KQQQqClhH#۷o?a\\\\\VNjZKp~ݻw?nFY9Ǎ273uH… EKU#G)SL;5%%%%U3 .:\\^z ~X}"\ "((((6`}m]03ܸqÇ̵u?W9rr QFRV 9y'[g7I|||+Ç>w.١lwIIt8ݻԩNsw2矔q~7#xɓKG{|kkkkkɯ'u 99FFYxlْN@bbbk=ue[Fk׮]۶Diiii mmmmeK'.k|N9?RN3 yk=sʔ]vΠ!i~~~~>~˗1cƌ8~~~~3gCx> c.'\6l0gL߃ӥJzxś7#F1p ] 3f{ .iiiiqqNtҥ{R/իYʱ[gƌ7ntrvڵw}}}}#"ݻwӜ𺷌:u)V{^^^^S۷4vر1lϏرcGae˖-taaaa6m⢢ҿ?x*TUYaĝ;w<~}ǎcǎtbh!C 4O6mڴiӆvv_u떡Ŕ_Ғ6Хŋv-V\˭ rʕ=| ={dlQ֬Yaz~v۶mww|ׯ4(·5k֬9xp޼ynUTTT{̘1cTTdsn}'7M߿3ZZZZ/F~Qׯ_𠠠 :_+@!cccKeeeehmhhhɓqqqq.5̭eqqqΝ7>_;wzj̘}I'!S)N>-fI3vڵݻ{[J::::9rk````lu: 6t: `܅ .hQ~z_mv޽{wq񌌌ݻ2Κ5kYʡKG].\k~ɍ7nCwhٳgOHaoooOw ܅ כIG=ZEɓ'O^ MH{'O̺]5I貃.\(?{6s\޼yÇiE EEUUUUyySG[jiii)+ZZB!zή LKKK۱ifE -'N,ϟ? D ]~==zѵ+mljJiif &Ln~Θ1cƺu:;;;oyz\L@[>|">>>~:3333--Z>bĈ9rHj۷o0] 4̙3g22(t­[ gxS;Bc(%%%eV~~Z;wܹ&&ٳgOor߾rkIܶo@LffffH?GpȐ!CX}[;.OPtVus >-s дG4-u ~1Gԓ+W\ͥ?WwZWwߞIƉ'=pݟO揽ԩSW۲"Vӧ32Ο?7W^:2rƍcbΝ;w.(:ץd:?,Z A(i%>СC|}:1))))+>M^`u9[MڷawryOryig&fr 9wkWOn3 qo|TaڃӍ]9|b9yN{ =ֿnh42Q?_j总K'U?霷?eN€x&???9(eLLLLrʕ+WQƬ-;ݖ LEEEׯҫ%ˆ փΝ;w(iӦG ɲe[lrH݃_=@I!(ǩBُBO>}w甛] tt\KJ_w 0'߆8߾}G~A#,[nݺtڲ%嬙DꎓoCEEEE%%Uyέo2zNs%$h:)(8w{ӧO|ٻwD:c-))))*:jԨQ'O|pJ ]6EJJJJLlS0fbοF{mbbb|3}.RQ8IWWWw0JϬqtLuQf#Qw|~{W9]kyέ4orNxԧ 0`laaaaqqpppp|<,Dڼ ^t#Fpvvrrr21:)kn.R}>}Nf.vkFFFFFB]9sƍ'$$$\JiH:vڵÃu#MM+%%%%ef>zcggddd!$$$$ pܹsׯh#tȑ#GһL5>|phcw ;~jjv9xۤ!s.\pɬ(lG ]vmT'Rffff+Vry~… 7n 6l< }Ac<;>)M4p7m YnݺhZܷ|۷aĉ54dժU"#,4K/^ʜkn.3}Nj[Is6摂j7JK dy#Gإɓ'/_۷i{5gΜ9:Jm LOa%-[l;wٿzZ9mW937,]t HHHHHOu?h CB]M@@)tnhhhx164,.666E S\\P]gggg3ׯaWݻw?R.ݻw^u@B kAv4ꂲ0yKKKK_qƍ6&?9|}"rXL]BES|ܹs4haaaaI %lA47= u,.=@3h6kta#oC nݺuzF .\k]F:uԆ ?Z#JͮwC]P&^M@}Fh7ѣG/^ПCs ѣy]_֨NUGk9:tܹsnD kߞr]x-G{Mݭ[nt(<3g"Vӿ mIӿh|-:ѣGSSN:ujCi҆Ǐ>ǏȤw}򄶡7".K`vϟϞ={vHϞ={vq _\/C[E!@:_KyhREƊYuw6pvvee4{w%&b.3ziiiiwHIIIx㼮wq;>NܟH5>q^d &Of {IIT?M_~ZY ~={٫W7nxG` 5222`}vB^zջwOGkeeee%%Y^_|cƌSӓСC|}srrr ;vҥO>}Lm޼yy&MZڽ{=y~I-VVVV}׮]vBڰaÆsi ŋ<=%S/>>>>:Iz~@;Uӿh|-:p=xg*...9+&˗CEEرcsvu-"M!E8Zү ɤpأG6+VP Aﮭ, _u 3////"^o޼y5YP)عs:˟?,)))ԉ^u̙34&i_:wܹ}{G[1bW^ r^ AXbEx8M|pN^ /$$$$ @!o߾}p(&U%K,ٳ͛7o˙]~%۶m6˗/q… 73>~nolsgϞ=o7nx$4443---mNJ~s/\pƍ_3z** ׻[Z/_|fmW5}kPKOOOOUر'9rd*>+++}ٓ5Yh"kkm,'))))0ׯ_/\h)a@=p}tNi0#] 6L^ԔӧO7[{M!??E(-UQ/"""bRqqqΝiɓ'Oё%ܭ =)(pr~@F3XfAA߁yYw3K.][7/hm~T(AYXRV)zޮ]vm:888LȺ%Kk >zDh kN([SN[6Æ &'G޽{c B#Yk[YYYY3d0[[{۷4TYl\nݺueJNNNFC5{sdc>zUMBܭ ʪ )(((I':D,6:+*^-XΒ Z'Jy\RXXXX3`ggg-[>|8%_~-TRzŋoiKJ .ψs֠b.afѣf ]у] G̼wDVVVVJ7^5jԯ{D!*f9!-СY]]]ݚmUϟ?u4Q7o޼O3.- 3?x@D4ի$QHsݾ}vQ3;9wܹףϟǧO>}Bi۷޽{߿Ah9u ?}PXbrw!M޽{KI1y3C3Pi%֡$"""")S-f!1bĀ%߿iEEEׯbn#!!!!"ɓ'/_R.222rR64K#߿f{n֭[ }Xˁa#@y'NF-=͸q-\aÆ eҥȠ@ b>9KRSI&M)---}19|Z̾TΝ;wh g%-a m۶-.Sά˗/ mdbBCn۷o^HHIIIOf =,k_*####MMzN9ŘiKJ%1`3f9r+w&yyyy1m۶m۶?~3 !ТE e\bwɓ'O{y')))innmmmϜխ[nXXXX\)&&&fb" do{|}.\p.Z9o9sKJ%S݄d.@Yk=>]l߾};M&mlLQQQQӬC۶ѣ;ՄfaSwgϞ=Ey"`]ίoݏ@K=uǫڵ teB?OfЇxzzzN"///߳'- 9y{-, 4-Zkoooo`p…'L'b5 Ͱ8PVz99i#G4(000ٙ{M+Rn2fo,vź^^^^S(+++K=LLLL-򶶅%%,i #H:㓷UG`kϜqppp 4oLF"###Ϟ{VmڴiS󣞞OcGڵkWGMMP ]$/[l-奢y6mڴEEEE*.} /t0))))3sŋCC)U|||ڵ̺J/J&t ŋoЅي4.h! رcDZc994Yuǎ; ץm eddd$$:u?xl44ӧ(dC7ݻwɓ?(o:]ڵkׂ׭[.::>>>VIC*'GXSӭG-@kإ.0_3WWWIzb))))13f?~Ŋ+lmY|G_k 0[̕4ȑMN:os'˱cǎ]TRRR5]IW̼cܭ irrr͛t[4 tNMue뚰!~?SQFrs;t!__kkk_/ O>}ս{8:kݳgϞ;wٿ#Fpv\KR"w|9ݻwSNNNN7Ӓ]ok3 u#L kM6ߟ˿|LIX^ԝ^PPPf9mIi~Ewa/BaÇnU삂Ǐ?~kTְ۷o~2c8qDumێC]HA=:SO1zlcmms~atM~4hzj/nnnn_|RYIKJJJJbcccSR55zb9cNVVVV11f^K` /hx?xvvvv~wH 4llNe vܾ}vQ.]tϟ?(+K363_EIج]IDDDD:t4ݹӧO_ə3gΜ0a… 'OfR[[[{’/_}5wٳYYT+{{{;ߺ$4۷o.*[gƌ7ntrvڵw}}}}#"ݻwӜp>B%m5jԨQ_x͛͛u+ KNNN޼M6mp{ʲe˖RM6mrqQQQQߟ1333[kʔ}Ў;v;ݱcǎuyw!!!! 111NíLIDATx}$뿿uiIh.~ȑ|ѣUT>Gr;;; hǏ?feee5f 5WUUUWTTTݛhiii)+khhh(*xś7sٳ%y͇=~L˻ R\\\C'[{Kz`#494xQFZx\KT۵k׮m[#X*)))ՄإBCڬkM6m8/v/7^vH=:tȳgi0)mcoooo`=mQP9999ޛGUMcP'1]jI.7777 ///SZWkj2#8Ν;wЁݿbˏ?~ɺM~IKةSNۋvTTTTTZ8*,,,,(hǏ?~}WS+/44Q]PIIII11^ׅSm6G qL[gKӚ5k88P%ztuuuI4nccc\K ~q>|uOUYYYYUզM6n?oA:uT]ݒ+Ə˷oW^:2rf̸|۷9oOjm Fuȑ#V=|aT}H!ilIhI߿}ӗ/ Ыs-]on****~_|RYI0#""".}GO:uj@e˖-G-믵/@y'NFч>TTDDDD$% }:#LSPȆ 6̙CIdCBBBN=9.\!6444ɸ8Ho߾}h̘1c)ae%----.NY.]t^az5]*-[l-e KL#****St}^^^^S۷4ݱcǎc1????:vu9^BBBB2222.TKK4}4 [|0իWn6nܸsRj Pfڵk跞n(`Ie-GJJJJ}̙3g6nݿ?!!!UFڵkѣG}i`IIIo߾}cZk6BQ{8[RDDDC5PꒄqQ5߹yʕ+4C2E;  2d!\h"kkZkmmmիyyϟ?<|3fOPo}F۷oihR~eeeY[n2dH[F)Ý;w/!!!Qs۷oˇ 2ёL*AZZZZB27o|wHǏYCCv۶m.\p׮k׮]۽4xś7Җty1KEgmq߾}NfjK`=/lh||::U}s  @LhƺtȈOG)EkM6ߟ\%S?^zd0ŋ/޼9k֬Y`믿u@UVVVփffffZZݻw>y/^3^nhdaaaaIĉ̰D͛7ik FFFF/G3333mmzUݳѽ_xСC/RٗTFD4@Ok_h04s -)))))+MI>M T)?sBfݻ ƍ7n0 ~C~_=zTZJRRRRݛu<}J8PV]  ԧrf*كâ:>P ӧ]^cC*'W???bv}8?3m?ϟ?ּN:uo{{Rtr?VoܸqcL̹sn/4M~[::::C5 [P?QFRVƍJIE./#Cݻw+֩ sbL{-%E)k^~1Qkט kO&"J>mڴi#mCe,[e˖-G4`Pk_y] r~[Ǐv̙3W^za 4D:>1scՎ"*(((u<4ZhosO>}e޽{YKw/nI'O<ԩS^eIyUUU9rkPPPPl,k46жm۶u4qZw@\]͹hg fo/ʓES>3fLzPĐOOŋ]\-,BCCCOD%P& LMMM/1bgg''''Z~tqqqqY}儆zzyy>>>vvT7___^l4T]]]}]v4o߾~:...ҥڷ^~(ޒto=1_4 |5>\-yCv[,[l޽wܹr߾htt w:w&Wz~ ւ_};m KJJJ dnSYYYYU{"le;4,$fd\w}qq:::: ܾ}vQڵk::LhttMpT;====O.]t12n(ƛ7oޔZ\@ Aiǘd\رc-,,,Fu}YRRRRL[eݹCo֯WT%$w}Yr}ܿӧ%???s /^xm̓?̙~ xTQQQw9'L0a"ZK̚5k!Pŋ똹˗/߾XǏYcnnn>jԽ{=y~M_]vڥˤI&ikoذaܹ4Y&}xxxxI_ʅrʕ'$$$++++{ի>2} gfnCY6o޼ἼǏ5444VC` /_~}Ϟ=zڕ^lju֭GFGGG_`ggg7aw=zVVVVc0Θ1cƺuڵk׶k׮MSZGGGGc#Gtu СC!!ggg͛7nܸgvٳ'N4hР>}CB\mp]ZGGGgȐ⸸;odUUUU{-Pl_c~l_DMMMmvB|P61*̙3g22TUUU?p}݄<9~ެo55555]fӧ/_N1hhXsQFrs4uJ_~;vաC]y,mUnnnnD3 ]P/^2^L>>>>3fPo/cDO8q:sW^{G( {m۶mÇrrrrÅ?32223222Ԥi^~棙6I 7Gm#_R&MbE<-]|3D 8PV]K'u]h"k %%%%~ tHӏ ,---=vIq^u~bbbkjH=h~rrr-EEEE115_Pw߿")sttt _40%dEEEׯ?}:a݆~۷i]]]݅ ) ٳgɓgΜ9sÆ}+k=zS'vBzw]Le J;ҰDvTPPPٓ] ~IJc:xs(룜 ml+NZ9jma#F1WqӝwRӀD555`vuć>TTڈK;wm&O}tF%rINNNysի##7nܸ1&ܹs炂F=ZEJ'{53Vڷacϟ?죣UORyAUo߾}[sgo̘1cTTVZj֬_UZZZ5=f2{waMuU'KtܹsMƮ79kx͛2LMޠ Ka8斺$ >q̿4G)BiwYܹsNQ ݻw$[g |)EZXXXMiy]wCg;ƣЍGB7lٲ UӧO enb.ҳ 6ls-] ooNhD j\rs$h\s''-pǽᴶm0Uc𨧧7|8X+.پϟ?zݻ5?4/ s{MK|̙3 j:]LMMMqgZ"mGBBBԔyZׯِ2smtttԟzܹsMLNew tv_m۶m;z{ Mל9sSTeDAAAAhjjj*)Xm۶]@J(ӆ 6'݀g"ݺu֥ eb3$رc.]>v޽8/OK+)))T7jK$$$$DD_F~#?~ev)m۶-.nɓN:uU[9|؇D~U=hUwKuOoݺuKu@%}?y˗RRft灾_Dg-XRo߾}[n*(Xf͚izf rCN4o޼y&&ɦnޗ.]tvEEEŗ/'#C?.\pdN::::| &O^vڃ.+ ݚ>}q6nܸ?39yӦM.,,,,),K,Y2}kjnNZC_zYXipwP}e```0baR7???s???Z_^^^s~IKS( :XYYY;v˴DSSSs>>>D0/rnav? '(\.^wdVVVVq1Dm^'l0`ztAz7kLe+VX|͛/MǏ_.(((h۶└'lhhh r3fAQQQQl,戈}sQ O=KV^z.\ QW)7o޶-<<<|޷o߾}wߵk׮˧M6‚- x1&%%%= [ ,@ʕ+WΜZ`={׍?ox \z;..Xݸc$_-LpEIx,"nzSb x2|1KݣQӧO33 @4Fџ?Ēm۶mCkx gzjpW#/^561k@M ::${ٳ#"p/+++KLd2p8pÇ+....c2caEFFFFX7f]|۷o߾w/3®]vyg<~f<޽{w`)#7o޼33qMrakBBBBfׯ߽p8(|G/^Ȭf8k֬Y󾾾b!F::D}1(rĘ8 ]QQQQA`&=E\Lj]q0`cf!{Pc3d1UB:#*5.` 6 4W^MI\LD}_k"f$1׶jժUc]xAcs-sASsh! f~P`y>[d/@sΝ˖zFEEE͟WA"?~a)AH&ݻwb?~ pa/Kl&x>c*s[3Pj>x dq^xWTTTD9?#wЀq<$Yeeeeu}1+$2ܹsgv6^̙c01ކ]]]]--aP чW.]tQV{oq~ܠR3] LH"bP7u ~9;;;[XDC[f>j6t RV s>(`F eF"cl,/_|%r1V$QرcJJN:u żQ\|ݺuΎvo/2LPs&H/Ẻf=zqqqqoؼLD1Ӑ  D=AsNJUUU?ŕ1@XFLTJA4 O>}{-x-b$#?ϿBtWxcكPfz޽{=zڵHōNMmؤxJ>7nܸQjh;wy*.p fyi⊄  / _A~a~3&"###WөSN:9U Փ&&&&GɕPСCBCG=΀|yy+C9996m߿?8Y\rsA2{O27 !Ȍ!hEAΟ?~m}߿{]vZ|ڴiꓭ1cƆ؁H;ݻwn]x (@$-[lٖ- ֭[n////{+W9{O?ĉ'.\z;w]\?~|ݺm233317I[8bccc.lh/$bN"3 @]vUU/~Abs{jذm۶-~;5-[6mڴ)=ٳiJϘ1cرμ-$<-4[8} 4O[%ZdKE7—e)/ *oIM, ̭ 'O<wDACmmmmj*--7%5ujbbbϜ9sL $AAAA..Ν;w2Sv^U 5)###3b/n;'yÇ>~]vƌvr3gΜHTi^o41Br۸*ȷ~mwܹoeB!&&&fG]VܱDsҥK?~ q"\y͛v;seee> xp…K,YqGEUm-s4@ߩ=KOƌ3;.իW޾73={l+޽{uOޖ>|ƍ7wWdEEEŭ[SYYYĹyb~k;wlc#///oa_SDDDľ}? xAA->|bL:kf̈́mڴi…]ϗpڴiӦu/^LL1k֬YǧGFFFr8v߿=XGG1`nTrrrQvqqq;,gϞ=[Q.4Re6 Pz۶m ]a.جYfYZbׯ߽+ܘ]{^OLEgH̓*~ 'O<ׯ_~ʫhAAAA3f߿vڵsQ|„ ||Ch` Fv޽;0K0R S81=zwo޼y{GZ8-Ӹ'ѿgϞ={xxyyy Qy()))u蠦֩ 9h .\hoaÆ zյҥK"o ]L`J\$,,,, :t~O?[B_lmmm#a\"]14e~Ƚvz{faŌ')EEEE<o{@\H}/@UE&kkk~rhw޽QBBBBf&8TPbooooj v޼y 9888hv##0RlyQQQQ`͟#F[9^=%H,(((|t" r ckٳ#"pE~>3O(gݻw>}gp >{O>=, ϟ?ys=zt邵nnnn&@ؿѱ}۶TUŶ/Ǹ$h1pK4c F_d$^$zzzzfdn/ڻw}0####,LܑA4O<===޽{^̺Ǐ߿̙ &L02۷ognO-k׮֭[.YzWWWp Z4hPސpW߽{ؖksΝx?h>x+"̾<ײxA5ʶ5y2cgϞzձcǎ mǎ;vLiX˗/{-z2{ݩSZ7NUe"p8В%~wsBGGGGK 1RWQ#+ `&SDh^^^^Es:cƌƥa̡֭QW!CLaݸqCf S(xHgn׮];99bfK0[/KӘ!8:탂0"rFci/hE QLA47VZjl«W!~9;;;[X qO2eʨQ{رc%%jGqd6[n޽ّB˗/ nnnnVVhD#$;vÇ[jՊ]5q-l\0aŌgR3}3"rKtj 4NUe" J97lF*QoCo ,+.?Hܱcǎ'-,,,Ν;wLpBeN:uЁ'9Vܢ(RӘ!8-Hh E s#+++ykkk뀀T_̻_ëp o^IÇ>}ٳg^fn+`k~AG%2 0UX{eRJ9ZNz߿?-m޽{Wpqqq3ѣG=HE~M_'xߐƜWeW;Df־}a'N=ħ rv1нsK>}tTרmss5vQUUU8Q\%B PM xъ;j BPрxFhݺu{f jk#Ut[ذaÆ`T(fe>} VMMMMI ܦ^X~СC?R`8SxX/ и 6%Š"W^'w^73WgSK^_Z ^ Ǭ:Q޽{}A  6푩֋y:ZZ8QP 9ȑ#G# i;vؑ I{ 066680"""aT@ _^#iӦM[G ۵KEEE<ԜZvڹsy}{d˫'####ݡ!7w "΁9~]t颬Z(эcc˘e.`0 rҨQF ]ȟ%6mڴp!F0q;MKKKea[K 6K sߊ^E41i,OA|Z\}&6- ׳Up85Y_&EK!wxmh 4%Z3dr#ȓ5̫jӸrrrrEwtlzĜq#69gD"fTE9.;.TILLLi$ ђ٫F^z[6#f0 L^H*H~K#KKKKmݻOϿrst)wk鋊bcf9ss8qĺuܕ5̒8͛'ȐG]vZΕm;Ҝ ǐևWOOEs-^鲊_LȲW^”0`:~2_ULW_ a&tи 6ΩYX1 ȋ  $2333?eyff~ QFd4H/Ѹydk;e32#HO QȦ 2o_nh\ lήjJFf\41":G]6.p+ײx95 +-Aќ@ )*d0Kpll`ÜȋڼyEee5[^"a3ѠO! uK ^G]6`ᲊDcǎ+)9uԩK಺nݺu{fgggGF"1 %jW_A] kY`\3_nȋ hN_niiio+^)f͚5nnnn@N@hhhxw/?D\8u^rJu5RMq9+>uu@\V!~r 0Nnݺu,xh D\(n +r\;wܩ71111 ;:C5@F oqGricUa9~i)W_a!ײ(<[Eb yAAH>4'%LxD\Duٻw*,S6Bt1iYMeB^AA" .? 󔍫] lZgk>fA-AA##H)\>SaW $6ocSs30ɓ'O23S pt M!l֦rG4---SE{ ̈g"\> ^?S(iEK /yAAH HA Pq. \ ;h ẅ\ŋoKG,|ͽϰaÆw֭.۽zw޽99XhѢE&M|c*xOA uKKK˥Kׂ?Njh~W___ SN:z4yA͉+W탂2333׬QQQQ_q eeeoUWWWWVw,-e˖-۲SNqAAAA..$K@#/_TTTTVIP1ŋ/wD㺺4ɏ Tv===YP(P޽{Ì0qGJH\}Ǎ7nP~lbo-^EKA4'.]tǏ_w,"555uJqGbF6C\\\ÐMa.\aɒ%KLMa+R#+ӧϴinݺUW'$iQ1f*s]̜zJAA˅ .ĉ>\P }wjjܟУG={,i%$~%hb}͛v;3Se qu寲_}  |OK?iW%&z[ a2ځMJϘ!'''gn޵k׮ۿⵗ'O,-5222?_^^^BCCC. ) GX9rGEEEeDYYYѣmmCC<`nxűXt֖ɪ{N:54sΝml'7"""b>B{gϼg E'N8q5c;uiD 'QČ`jjjٳ'O}߿G,1666aզM6[_xbbb```f͚5~|JJJddd$QX(i,?|)TCpc~w޽u:pڵkjj 6޴[TUZHiسo|}u?urӾ}mۖ*+++kkkjjj=^>}g|˗/_̠ڹslߪ?$EײxԲmEa EŠٳg^رccǎ;t{d2"r j˗/_'Zxe.ݻS[`*)))uСC۷o_n<̜9sqxen;!0N'wB^:i( Zbh\٫lbF AAUTTT=!^Vc̫g^b⎗ BRXjժٳK ^la< H^ %>|cVZ՗+a R%p ,ظFXݻwﮮiÇ;hРA{VVlްc?.7777+)SLsP:_(,?^V̘׺u֭&d=Fvڵߺu%K"#]]]]áG|#aGt $@*{CcF [qGbf:B6kggggj x^pq NI̫W^}ϔ)ׂþy7(3(444tX/F####oW613y1Kpg^ x1|::_~Ǿ5C07775wر#;+gU^4]Vvyypi;vXlB|||q-]jhhheg'////'pz(_ׯ_o߾]WY.xc{???DcccqLHHHF TϞ={jh]1i([1⾥ ޛ5QK#~'?cddd4`N֭[Vx-@w$s-/`$:(Tƍ$pep bh\a ¸ AV:9pgׯ_^{߶m۶'M4irxϘhq[3f̘1pYt-3/9AH&:$%%%lիWڵgϞ=99 ,X`km r5}A S0KXjQF#!u֭ǎASG1f NxG ¢egf ͛FꨣꊫޑP:gΜ94;w\kk&&&&DEo_q9 E293/A$!.d7&> ݗ_?~|ݺϷ\2wܹC)TQȈ#F3[`w%a$AX.,ZN8ȌWOO.s-^!U4e_"DMMMÇӦMfay!k׮m^XXX˔!Kxtq ŕ WllϢkYޙMKADSy2333?E߱) iӦM ⵡ-;%a$AXN*;!iQW4Ν;wӧO}Zn 0~f7~(---7T(y{aeSGҼə 9A|:t@2*"`:9 _F͛7/Zlnz^" Tv@eNvѹr,X`F޽{wuu.>|A]ZZZZY ;vfϢkyə h_niiitiZ@M^a͚5k۷/792555Sx$B*{K@TvBzk-ʾ7no{9'!{!-++++<[Ͽr#iγr% G )~o=kΝ;Vu &&&fqG7R\Tvy:s̙k׊8*;dc"^Z$C}ğ/_fWrgəWX3/AADsBF|6/ 22#FH#awY3+ɓ'⎨y"~o jkkkSSy9jiiiM g^AH'D4 D3iAAH3/r% 5$~A@)tTzjkeeeᅨ8~p;22y%g^ {edddFež/^xF@>Мz l{ɉiʴhѢE&M|\A!kiiitiZ0444ᇒxq 8뻹wԩSG&g^ B((((r>((333sdєlٲe[tԩ"<(((E[[[^srrr27wH$~5С****nK{_L-Lͽ1ŋ/wD3lذauuuuեI~L07koc w޽aFFFFX#%u9ș d.]tǏ_w,KãϱVYYYo.\aɒ%KLMa#t(O>}Mu֭:qG$|SWWWWWVw,-fc Ν;w2s-AAA4=.\o'>|pA#"a" }wjjܟ1*&'''K IįfBKPSSSSWy]K9l᯿qGMAAD>~'T\zٴnݺuspf%)s0ڵkשS?cy׮].:>۷o^N1I*ϛbH{Zoeeee˖-Kښ+%"ªUV܉AAD˗====7nLHHH1111ͽticb0Y!''''*UVZ4_C%޽{mڵḱiym۶m;~|ٳ#" 1px޾}'*+oݺukn0mlٲ%+kK̼ڶи 2^M^b>Z*.knnn>x0>17772dŊ+o޼y=4/ahj=~F,%%%%++Q|1ĉ'.\0vlN:MHPGL1AAA~~FehgϞHOOOg**%%%%7{{{{Odɒ% !jmmmmM3gΜ򲷟;w\kK1}Ν;\~ݻv߿=XG)p8NTT6mڴn}ŋӧϚ5k))))Nzzzz~~FFFFap{X{M5'@n7?(`AAAA3fE&L˗/C?~߳gϞ~ƍ-oc 8C  `jbbb鉵fkӗ [[[ùע.!a9kjjj>6m4 Tenڱ#D4^{vڵ ccdekt)///_ׯ߾ݻw+)))q?y˗Wcn-6%a',EEEE555NBBn"!ۛb9~BX;o޼yQQ$ntuuuqu}ի?;N@-m&11113::::ZZtaÆ 7^V5555UU^lYt- kkk~rSSSS=w}(!!!G ŠM%$rmiDA-OOOO;w޽߿?sS[)s3 HmΝ;?VJ~/ gϞ={cǎ۷d;vءO$g~ZOj=~]\Ǎ7nP P/u1 3-G]4e/G-ADK`ժUfF^ ^g-,k*\K|AB>|VZ/3”Bi.X`ƍFxqFFFFAJǎӧO>f̑#GϜ٘c?.7777+ӧO5_{IXYu֭[ 0%VXk|%Yt-o۷70v +f[ i i^bzb,Z;;;;SSwA>|wu/ilBD|ׯ_o RM>>ZƐ;vdg}-{W;zڵkjjtuuu`\wcǎ50V{{7nҥ^^^^vvrr G{ xTTTTl׮_~w} T :8FKL466680222=!!!:\U{SCUd2IK~/oDW-eeeeŋ/޼ffffzzԻ=B2-05N^+Z(j=w$P矃=zXWYt-KZbNR6u%شȣ .@JJJJE!իW޵kϞ={rr,X*A9sLy{LLyyyyUպu͛gϞ=D&9wܹq43333}իWg6@SNZ_ݻO>=, 6_?;;;;2[_l[u [x22220… nj3 )))Qwwwr////{{ m E{ kٷoeee5l 5@6'O>}A飥!C1"IKP[1єu%شϐG-A! 0xÝDW#Lw37777:gp^V{uڵk'/jmq're#;5KG=hiiiiyy&:ILLLio@_WZ1BuQW{IXG-AAggL,* QDk~RE眜}˦eSRRR/xyyyy7op&Nī(b9ꂖ+$ɣ  4ׂСCȈjIV0Kpll`xׯy͋1 4 ƁTw*-H2 Z'Z _\q-j*I͛5k֬qsws۷o߾\Iajjj|qG*ME-!G]Hc'Z B$e+*}4sΝ;m &&&fqG'E-.jZA:ݻwĺ9r dɒ%]t颬H~^k`@{IXΞ={IKpUӛ5+444t,''''sE-{݇3222šg["ͣADyܙAH+4PPPPp劽}PPfff5****;.ɢ){ ~v:uꤨX⢭w޽997$e   1LtҥǏ?~BܱH.MKw0$6oQVVVۅ .tpXdɒ;;;;SӶm۶wAAAE n.\o'>|pA; 0wߩYZZZrfΜ9s&L[Yrrrc⎚    'b>~ӧO>}?~dڰaÆw֭Ϡ̈/^x&s#F,\vvڵԩ1CNNNܼk׮]1C'>۷o^N|ؽ{@{{{{SS,wqqq;k͛7/**=== ټYCCCCEdf9ZWWWWKKWW^OZjΝښgΜ9#''''+sΝkm-+++ۦMbbbbfׯ߽5x}߿ΰaÆ՗rp86mڴiŋ5555UUv֬YƏ8p=}}}}3222 mmmmMLÒKlg]{====mm} $H   B6m4 TUUU;vk׮]}{aaaal,Sp޽{|ׯ_~Vw޽ ++++##ɓ'/_2_mlll]$>fo)****(u߅AAAA{ݻz1?޿3g&L0Ȩo߾}aiӦu6&3 0=ݹsN>}֍W P?爛۷o۶P#ӧO>|E0[nݪ;w+jkkkCX}+$={ի;vl^=vرcx?    !rkժUff.),,,z◳Q˗/_ׯ_PÇ?jժU}%,Z`7>ܽ{H>|p]A ݻ2$$$d{qYYM2eR(%a[nJ9sI   R_ s>|K<}ʿ̐L=ݻw=z͛wׯ~Z^zu7nܸQ[˿}H 2nܸqCfeees (W4zѣK?/^ؑju|nݺu,H{IX#ySysϞ={5s[a9AAAA@5DVqK'X~СCo˗/3%%% ὣx"(Rk׮]N=zѳgmQWuuuu=$ݻwoNpϥbnǏR ']]]]mmT+_}; 6lHK>zba}GKj( 33VAAA0kut~5/}k9r}HQܱcǎluuuN&;<===7nvڵ]]]]-첲˛>>{ܸq.5444tw򲳓KHHH8r Ao#EEEvׯ{۷o߮`rZ1⽟_b #FXֶgϞ=54^E_A&4IX߸R``` MLLLtu)+++443/^x&ޛ   2Ժ⳹7GbÖ-[de<]vp8'bNeeeeC ҷ/+%%%ٲe˶lsܹsZ[{{{{O̫?/_|kڶEE3====my͋غU___W/l[^^^^Uv\GGGGKa޽{;;Na 'N8q⬫KKC vchhhgϞ=[Qŋohhhhٙ\r̙­%-yXlǜ/uuuu[y͛8qÆ ,FFFF#iҥK21 AAA!Nɓ'⎈n\]]]O>}T$JTҚ:5111gΜ9s&Lw    oi5BwvFmffffQg231?eXqGMAAAw{$D́Q:tZR)wp85k֬ٽk?kۼyEee5AAAA4OH"xR\\\|ҥkJJJJ}4M͚5kָ뻹۷o_nԩSk⎔    3T f "   FHAdBAAADKe#=XAAAA =AAAA    f _AAAAD/    dP"±^IENDB`mayavi-4.5.0/docs/source/mayavi/images/design2c.jpg0000644000076500000240000004606712747716313022625 0ustar prabhustaff00000000000000JFIFW[C  !"$"$C-"M!"1AQV27aqu#35B$Rb4C%8DSetw> !1AQRSqrTa"34D$2#B ?4hF%^dINŕwPnI *Y>}(ͭzj}%v,jꔶ^F>}(ͣ[oi<ꥲ 4ﭷF~mXgMOG:l&-}bmQG/S/Ϊ[/pɣK~XgﭷF~m4Kpn32hߧ/z}bmQM5>ꥲ 4ﭷF~mXgMOG:l&-}bmQG/S/Ϊ[/pɣK~XgﭷF~m4Kpn32hߧ/z}bmQM5>ꥲ 4ﭷF~mXgMOG:l&-}bmQG/S/Ϊ[/pɣK~XgﭷF~m4Kpn32hߧ/z}bmQM5>ꥲ 4ﭷF~mXgMOG:l&-}bmQG/S/Ϊ[/pɣK~XgY KԨwi$rQe.ZRu`ښ=4hѬFr_#L:^9U?x-2F 4hFѣF4hѠ2)"Vas"9 תJMC}:[//$nۗ1۪/ߨ#oI.H3tLK/$꒠HT_%[tEJ%é\HRa3"{M@J֕(`.LENR:c>P$-$s cuHm4ĶRa@QJ@dzQBe}*Kͳu2?h:yi9:abҳ׫gtbyq%1TdzgjӦ#]5qzBSZ`ĶTX-[͕,w\w8<)i"*P{wbHl8\`Mi*뗿 !s݂7HEMdw:g:+;zfWTLe+`zt0f3"ZV>@,$\UGё5m[v63鳎+'U&E)e ݥN8Gd3MRt">Á=P#ԍ`~F؉CM2i.֖ĐH{6F6X\)4hѭd4Fhѣ@4hYcj (ΩYcj (ծIIv?z>4hѫ4hѠ3Fi'\XRTHn#3#)R;wl9U?W/ҭUbFn[(li)(Vm9(P9$ܝtS:s=<~&ͣ;wlb$I8TKծOz uyJTH ILB[K#ycnMG?v&uz4ʽFҧ4ӮgjO5"][fIU=6JAWr6CIKi|w?vzycnMV*PCV R;9$qUlժr)t>|lƚۮ $NL &-=<~&ͣ;wlړXj5EubSLySi3mJ &[ ^J'6Jo'nY:fi0} m/?6O,|߉jޓRU7P"T!2܈%)$*/aP"J^y(JB ʀL'B[K. .2x_g*3 ڲFFO]P7Gxmĸ/ZH)Rc5u;fs)Dyʅ蒅(%ڲ< 5H41崾A1מ[>aHq!NgqOu= A-2ne^uS=ۡA.8¬aEY$vʼn^n{EcsN V8 H A^xq )Hl2U9:m I'QdFЖ|X*;n%}rSjyU'%R7+&r*V]FdcTH^}rwI#F%&TsI<>;Q;(n5HˈUql8L}d?+V)؁ Ĝ7Zҷ˼g%Bs8mXJ 4C'q^CY;ī^ ժS9qHhTH5'w%rD]M9HZҁ>>6~C7۷ ko)G TM'?Ж ]ÊTR[N 6Fb4 JzycnMR^fkɷ޹h@LNhH$aۿ鯺m[UMqD\)hhY # >sf`_!;wl=<~&ͫz]RURbN*D%Ɣ I P7U_jGBk; $u!%B/?vzycnMQhDx]*GjTfZS\h$sIJ` MJ2a:_ 6~mXۿgFKi|淪?vzycnMLZ43 m/]?6O,|߉iF~- XۿgԞ}XڿJ5sn}XڿJ5k/aiQx9hޏO| 4hP4h VdhЦjut3) jaftT TRppF:'pUIo'yFww{1ѻmZd jW5U>c'4ۈTFA:?6rJ ~OORQ&#&Nw#5RӜID[Ri҂քH ffݺ8pƬK*VCGJV]uo n?6hx7DQK]9"#uyʓu4qg#ɸΪ[/qY#%q)4U}VHζ,TS87Ke9~\47j17Gi7-aYm8 ϷZzxCZdJ&& v`s-OAj<&UmUlQB|dE19yی|P#ʑ/p]*\/!|+o,%8vv/O3 !f I%kZmoiݸ\On{5 1Kv#7 Q$~Z]8[^nͪCJyjOꥲ Nu8WxRQo)id(RV:c4(:f;-?yϼ{7ڹ}9n:4@nGmt6qn܎ uR{u5_U-7r쟵mCs3s?SYh:W-WeJe}5}H)J@'o?vDꥲ Z46~mXۿgּ8;Keiw;wl=<~&ͦrꥲ Z46~mXۿg9R{-SpQޞXۿgԞ}XڿJ5ku%g[ZZX8QMrOdѣFʀѣFS9U?W/ҭUbFn[(li)(Vm9(P9骋Q2lhSWS:ҵ0:@K**)88#uҸƪTHiɷ쓇^@|;^דT'+}vyEwW/Vt I]r{(5-KD7rRGMn Fkŧ9Jr"E H$ 8լ͒ͻtpᙍXl)T* *R %+o`!}p33:Jqol{vnzD0.,\TRH  fz= B(YL)<iJH=V*ֽ ֪.ej&_eRuP-h _R"/XԹV2ĩ)D[f2aQV0]PNS9#sݭ_r.nw'zIn.}sRcSecY v8J5o&*]z=>!yN8#V;R|24+r.iT)$ zxꋇ@~'g!6̶TW. ͋kU:va{5Z-!H+}vT ]C:-~ޔq-εMsM+EFHhѣ@4h4Fhѣ@4h4Fhѣ@4hYcj (ΩYcj (ծIIv?z>4hѫ4hѠ_UOiK?/59%U԰H~> 8% ݍ% =5㤛-22uIE-:%EڍעSfrDH 4% ]$Z%j'sQjrIcTmNOխdeHI^2Ϧ4TN a 8,(npOT<<}z\w5iv,\RH  fzJ lWqp6BNj&wi}>$N2sV78Tz '|9˵D+FITSTȚS N[Q;T|p5w6J.~4zr2󓀦U#)^as ʬ5MynIt%x )jHg+V]Ԛrң4,(R'鼜no҂y&ô٪HIi A[2TzRN1,oNHhѣXѣF4hѠ 4hFѣF4hѠ 4hFѣF4hѠ SpQSpQ\:G>}&2hѣWphѣ@%ZIgգB̤6\ P)QI8묞'5W&W COMd:[wƶSaגU\yE_W/V.5s7J*J%ȊږM% @$Vk6K6Æf5b]>!P$J:V²$HκlAdRQm NQvFٮM:IH'SN\Ywmqrj\g*L H"s/nrGLnӷ=  Ge\o~^|sn۷Ǧ|=z@"qZjj?8E@}ֺw7GBq{5Amzm=)rSBA?xjeݟkM]M>uQiUzsEKөh$ee vxu:Ⅼn9biRd;h!xؠT`ChYr,+qw*۽)Ǒ_~[qjPU:eaq{5&-K(};C%#ԡ zo'6J 4kY!Fhѣ@4h4Fhѣ@4h4Fhѣ@gՍ,?W:gՍ,?V'%t}LdѣFѣFS9U?W/ҭUbFn[(li)(Vm9(P9骋Q2lhSWS:ҵ0:@K**)88#uҸƪTHiɷ쓇^@|;^דT'+}vyEwW/VtVɢR$L[ ןP;fCLGqMjܔ8)$g:VtFncTJvȞ9T$jw(Fk8۱5˖ܡHpRioJ;c2cl@Q_O{rpۢrO Κî Clq㺀I'χBQqA@m @ gF~/cxZK̨顪9R E݄+8:CR+(H58j$&D9 yG I#XV2>JZ)3mLxe.m+*qN|8rjˌ 5=[R;qrbn9U1UI~ -RGRNTFH4X>t@ÎS,!@I1ί&;-?yϼ{7ڹ}9n:UbޤX}jtaIl Ԩ'pA XSs*vHUB+TΆu\Ήuisp[@% 8sv' H3ۦ0yw|GQS.4{YUԣMi<SO7חͼgMf㮉O~6IuzLF!* 섥2_B =+Iku*r*W>*jۈ^Hymg% #\Dx\)HtiAo_p4%a 4Uz`iVf)5(ӖTwCB!Jr7`g8 ưSnN50El_K1$DOM}nb!Uz?ۅ5\w #1(0bXLmuUi2;J̥ y():ל_ m!lE;q.$ѕF)'^9>;]LE^k׮YmZ3uS >ovj%[cQH+d,%hVާwNZ!^OM~i۔W]3;J@^ HOzc[o-$EN)ێ,QxXxj7ݿعhѣ\fAn}XڿJ5sn}XڿJ5k]OޏM4j 4h>Saqj|NbI~m,*3rߏCcN)IBciBMx&LziJP%CFؖ\V[SRrҜ} RVs.>߿-󩱑SIlOmHqhmg< to\vÏ]]ApuH~1]1DQN#T $:ݻۜgUK^SbV ɕ* n:RI7! !:C`R65]dѭKEOIh '5y%i[n>+jRR䁌cYBI=Bk Bѩh[3bڰFuC]"E.#yl4,k9_UF\mZT-K4wR7@98$N:6 Aq GӬeFVl~q7NIa/%,89{wc#vpNuvbMy6$Q0xf=B (ϳ&3Rc<:mAIZHP#uα;mKY?p[JrSe#*){8k$;q-^M@rWDCw2[_ޕhM} LjYm$) .ƨ]p:U.i*l]i% #!J$W8NHƳ_0}&]oϹjA퉌6YqҗN)}OpJ?UV~ ڄT-T)_JFR@=u%}huR- @Mb뵨iՋN91Nm\A*P'׽nBjMR!@FBAVz]%̳S>jPsS2ʒNbڸ&෩~A=owTQod+p(j~.^*] |EK2^PQJBScr]52ϋd%S)ҩjJ~J)SE%cf5 k[U=G.:* hYiN0R@3ᫍ9CR锺j)t80Qdh%+ HdOND;mE)\(M}}3F-REu5ںRgJ<pwOUe*㼭s(tGPdF0%[z umѩSFYcj (ΩYcj (ծIIv?z>4hѫ4hѠF$ɳѡM\ NfRJ.uOJ+Q!&߇N{-zc[qj|0*Ir <ޗRFTē2Zd_b;mPViI#=x7S5w[:E5STDFJ' VùG+AB FA^bX[6a+JCtRTJ=>VTִqs/ DÈ)&!n^L\Λ9Yʹ(Á<<MG ݦO#ۺgQmrw UQs!hRTk՚%Sib"2.eHq$u$j䫵휎^;ݸMxn$@u*G}ebGz㩵(0PaǛB oGq|RAjUMR?iG#6M1^UgTjmq%u{%.s-IXJQ=uѱf4fFeXi BR@xRLUES@aN)5XH$I'Q irWb*K _}AN;@$:eMmFMz^(B>SiҧèJJI29;WDe;6 T 6C+.5 *:I%AJ9ğnBQI@*D&øRvh5rRVKPiVվxhy+mEZF撞ԥDHуJ̋_Pbe~N*) ٹd F:)eAqh[JH pG۝`wo;}#.ņE%'_|7=4n#$y>~9v}ߨۿmٷz頍\+UjUf o-s(4fj8q!?LDӠ˅2"t/+ )RG,czNk(a)\GypdxOdgf^qO<M(%%{!L2;Oh~{?vzR(FW׫㰹jsTavk} {''t,S1^Me)RQܑ RI}Djk]6^уNgt[FҊs|%!ݻ8h]n5>]>ԇF $#|\E:WiAC(Rٜi. bI`t+IGaOScE1RWkUW|uô O5Kf7= E<7<޻C`ßVI?ַ"JPnb%+U~?훅9\wHCvFb"8X%/m_a%DdEln`r;Rv=QKYԿ'>}&2hѣWExhѣ@)ƪ_UOjsK4maUX}qJJNJ0zkI7&ZeKՖKJV)* 4ı1!mRV錥.* J{(|LZvZ ӔH-]Q!39x尭v8JnWrJ9[d6-jJ~zDJv"9DF@eµ,`$ԒNV/+BV.9)ZhKhZ: 8iLdElmT%XIjq݋aEq?oWiuvV[oJ 6)q"5x[˓7ԙ+SN쫨#z5rW C=nGƸ1^ܴ!eϫu 0gM%Tr-qUI}]5rܣvaCa6f( pgYbWt *R.'-Kv͸B{AƔ cVb*@T)*njSSN,XMb#PS }T.څSͱ-OTgek_0pR10=ɝw\6ǪL\sx*c#)թTzz5z*|$tO|24y$bBi-5JBl4;T?V {'5EjH"آWA LiRG֗rەZCՊ]~:Rcn2HʊR0:Q^v|]t)9UVGv;5Ҷ)Cѝ$2#(’p{՝^C E=Kq2%-:ae@J߸h .o)v^WZJQA8?a׌֟[vJ&g4яcѹZz|w)05hrjBJP0N0 Q+Y3R4Z1ʓ* N<6I$~GW- ZP)GIzMJW3RϋPw3&3uq$2NKZbKܧV)0KJ^[zDZF)SHeF$D2Ki$;Du2!WBscU " Dʷ_6K/fӚ:SBw垥no%#9!=Le@QS*/DzN1OtHSjsڬ>G]i%@>(ݷ6k:k `?-͋ݳ9ŁiQ}C9HCPiҖ7 ()CCxj3gR)R*PO!;:VrVTpabRqZl6dŴR |]NQ.48/$3wݸE-jیFh%Ĝӥģe!*9 ܜpώXj /ɠtzS?l(-=}ℂ=;ZتUZT<)ԹqbVHq_Ua3yH`+$H l)+6jekzU.ڷeZKRQJPaJFdmz:kmCa"[ԈH"Ne!L,ΐJJN]dX~a? ?,Bk=F3 JԆm&oSNſ8Gvz>^$nNygccqb7p6#GLZ}֯nᇼ$XB->nĪ;(N!.wXAk|Ns?̯6%eY|[3OeNZyJc[(6c m]85g~/$=Sb[" %]vhvRbS_9čFpNT=cI{~8eR#zdx`j.X{9֦ķŢ돎L쥛]H4Ř|Ā@jܠ0`cRv81<d~9x=jx,z׭$p.8p0%NEy' uo*Wsé^qKC\zSVېU∫lmmM'լ=Sb[!ŝMX#vZ6K"6)oBO# >>F+1LKχ[2B4UTLAQpSVuMYUt⊊,R)_+qHQ'nqNqkkB,jfQ>9p38%m̯6%rm;nu}X c^aϛ|ϳ/v}?Cgwχۤ8Sn\Z TSAr)i5L'k1Ris-I.6'ܯ6%iTUU2Ȼ-;̗Yך\/[M>;9%#OD6USP+sDTA^G,* U“VN?7duQʚ% #KWZc4hBjȈK ~Xe<[pWj1լ-&') tYoJ}badtݱ9Jw{E+iewy_+oUw_#zYVH2q񑒖;/̯6%ǩhul@Md% vdΞb ,y\Q_k^W|߳gZ~7}ƿ/"XZBc:J3 MBYyVⴍ.7ϥEi˧6&Rc6q+uL jؑNI;g2ؖFn5a?cßf-jø}nQfW땋;&J؅)M.;)%HCi8R}zl7p-ZoS2_ӹ_jlKqunᇼ$yIOZ=Sb[Fw =!'={BOzgǜ{;֦ķ.Ycj (ҟ黆8Ycj (նHu%nc ^NrM)B򍳢{]+&5~Qmayavi-4.5.0/docs/source/mayavi/images/example_mlab_interactive_dialog.jpg0000644000076500000240000015737712747716313027500 0ustar prabhustaff00000000000000PNG  IHDR<W?6sBIT|dtEXtSoftwaregnome-screenshot> IDATxwUߧ6i )R)"QbI%1ٔMٴ&wM1$SA{QHGd(g;s{96:y>{?y.~D]\\\YM8=Y:Nd,+{UQ\\\\mēۧ-<V39񺸸4!*'}|wUugiOK0R-WJ[8tbm˜# 2@"cbZ6x5;s߯2e쐬iWܺ`X xUD@}(_^F&F&6*~s^H /G+c[}# ۲0M:;jvV|gY y8oPquL"87-CGkoXƨ2b b|М=љI:d9SFwn,}wIgKM9[82[8779]XV IJN9Ζ!~<>v@va;iuVgH~u 1Ruة$m7PRRTDH ()`]6p^cÏ/>ss庩>XIPrHji|oG;kyc;cn6dNӾg~D7|Q6<~~5/܈[Ɵ\H7Q|rbX ͛i['gxըc!_EvqқJdݞdz˶0zg;a>f,?^};PyG >w$WWI*)#I[KK xq맘:n v"̮jwXq1sk&{zhNvo\io}G &7*֛{->~wk볼^3wK9UORv /nk%4yޯ0`m?gg㟸`Gk]x#/o<,]>}۝|ؐBq{1FE{-dǏ1q˫_gy[t=Î=u /Vw`8CW$pzJ{H 8:'rٳջ\>9t^2mMt}c2|,%yq{P05` Xf!O̕L˥6\W @i OXc~GC5*9Ky*Ũb: 1nx*ʨ^q26͸2{1+Ga/+gSm%:2|$j4 _ [|heVdž Rd=g%i"hOYuwX9R 9'aU|ju#Kg41S^o.#%o4۴cm)4tՆ>o).NH6֓6,jWF"B:ڂ'? Hưh\#no^D0MAaoGO?<3_7οڼqهp㡬ŻG`BQis@w+zw+܂j!EpxMlQ=whQox>mο{Cp,)]w.oGh[[p@䑗˿z#|/xqq7i<dTO߸Yd̻W=zıӨyaů2wB) &֕K9$(<IO4l8ʩ!VT:ͣNo78VWs;=YpmPn[8VWfGKtmp#1Ep{+'ÚmL<x)||h}d("HqϦt o9wzmA9xD}.=fk~G[yՇw8^[~{ "m%<]4}T-;l-o H3/>|oO#\y2΅]Ϣ?3C[f{Aے|jq,=h$/Nb ?яÎ{:*.!YOC?ο,ʢEJ ' RG6R6BFưiش3(NnL8%IjOPفʺnOʹߙ7~Z @jC|?Qʠ|"}'M`òK;I< (P0$گ?#ʔx( V<͏]Eu(MJP$\~ A&UӘ)g_g{}ӸH) t8Ń#~ǝ%.>[MR4h4%u BOgsr< T ;|}dZCaHpqNJwt$?l'GwyjixpW{?JOH[<"ց#bU#Yթ,O)+c>#ض?\|y3SZ_h kg]tw;tUx! _mFhH11-۟ dgKpE^Hv+849i߾zAXxS‹-ZWҝُWXO{Kdww5<s\\\\sqq9gp 5<s\\\\sqq9gp 2$O@r.:Ҟ )}ܓx\\\w=bZ6ST4Vlpʆ 9=R@ $D$y2 ز *؂ op\^;/E¯Y4J5 "Qzs?{KS>|iZA7@4a<黨 EW5˞~x|"Ē`&a$X #{+<  _Yqq}O?dݿٹ"KsŖ40ΣbK `K 'ҟ@J!tfmD,hO€bX2L͸u'ϓe^pm+m<!+ ̙p; E*ciِ;aI /u\^Փi(/1`_xe(ȅq mP= ;UڣcL# VaXulbxfL(WV߯>>64Lη 5IrӤB~u!cT{;_ߴ|&W/µw<5zsfw]ɯzǟ|փ5E%^(=M|?6ׁ*!0qS %L_Zy24F&m;Kwiؤ2]/CQ!+R/|y9s/w#عb.j (Y1&ϧ nET}A_ooa~FAO]=F=ty̙}B0gHfMNqA_x˗Y//>CfqzX [ОxCx{ A6@2p}E-e$02 L=I:HY$ɴ PWy9?9f^|IAG§TZZ4l~{5#  z_u{ z%HE6oy?u)eE9g,BY)!QY 2)l OE]iw~&M.;2ftydV;olʜ0s@4/ӯ\ŷ~ z7F[Wv! ڹ^GlгlRiaqg@i>64:,_sN(CYc9iSL } ݔ䲥 PQ| rز8o^3u8^1Ӵ#̠~8z":g#Ͼgt]|ӽg*ɔCi(̓|/x0i( P\-ʇ(-{awM$-m1L=Ibs@SHf IL˖?p6>ٓpo /c OthǞ~xog;簹-a*™iý|_i0^oPr01X۴ -:<,n??F"< g+S"b?[DlOh9O.ԳmGj#_>ml/u3]OQ20 /5 k~ l~)>wZFG?mdtn;[OsхoE{K)%_Ej"Tl& +黸|({1V*LS嶬wwV`[&lKyMe]xI~w hwvqqq"Ṹ3r9kx... Ṹ3 'K_2ac~~\{tztqqqmgxn5<s\\\\sqq9gp 5<s\\\\sqq9gp 5<s\\\LέQmgR5 - ضm[ 5<.ٺc0*Qò-L#ed,14FeAD$ADg?,\YuSuSlQD%'UA3GmwSG=%]3\:ٴcCV|r=(ȐN7cd$² ,MlFDDDDQDQ$IT$IR% Q: 8x]Ʒ<$IAdc%4McC@s;Э)X0E@tO+ >G!GUXzX,H2D2"NG1c/dܔ:α>{6BA]dIsN֐% Y KA=H @ͶqQJ jT|QRELL 3a0m6:JcptD) :f)#Nz(Β!Ȍ ü ͛?/C&FSv:bF3b@QPGN|>|JaUn@uFTً,k(E1)^~Ȓ()8THa)t+ifƩf `ccD [%A, )(*"ʚc;S e O崻F\;y= _n>^o>v}DڪYyD`k1h:9>f +I!j'h&dbɕ:RR:0ܱy|:k$\ӐAT4Eld}t&,3ߙkxOЉ hNK7k&4ʰ5d.E}FHxT:B:epT(A@Byc6h\L {I/y5/QJXzp}\;X!c!r:-Á}u^FU>Rm{śB\~{E~4ik$%c6e5P1DΣiHcxCV +_j.5s5Jr03i*})׏qĂ,?ЯcspVlj?EuݻM ~K:x;1_N5![iw<>4FATy˩G# ӥr6, 2t  L%;-(Ɠ[g۵ez(gy t^oM# JB*^Y?nlbȰZ$HFзz%u0 twGM!z+\z%58$-A/$ IȤA dtlQ@A$$zΖL962`zЙ>p'OphAf\yU9d.@Sē!ZھtRiY,j+FSS堪~$Kj4dÀZ ቝHǏ##K|Dg{-^`?( 7SA9H*J&҆0L0: FDp6K@(IUߪv4;M3lͨ99EwM,koz]ij#eڪITVGAUƇ. IDATrQT?{LBQ} |{'"$v<:Q@mDѦp( (F0hBe, wʇSP_L"$:•k)k c@iǶ$@y3.)|^p$Ap,@? ;VS8bӹW!Hjie3vxSmZqLG046vחCbƧyЌ\3E)(oty"eNʊ_IrLNDAtLM, QMg\``us:D@D"0eudzlc̕K)VPD6m!.>5s  ʪ;)ٟG懘vǩ|U >TD4>7 Ѷ9b)DZiG!SߴK,rVGP<4o.bO F~*dAQdկ`+czeθa#``X3+ 8;'9z%YD$YEDDlYn6Q QOչkxes-#?uogEY̜Ыȁa_Wj٥1ꂛY<) 6֓c -Ja]_4<$SOafcv1I xʸ<!Dk!Icx䘟":Ȉؒ h:IP4Sje z5ЏS(o{ӗ!sshZL9lmw:;vK]TŇٹ7,쫘 8텃G2zݡK(JDUCP4,IѨcvz t4V&'CӰ̀!{wIȪ&#+"VFbR)u:\}M&|l<|;ze%}SE后÷2z 7UAS؂LՇD6ϵPR0 U `G@R=h>/ꌋqL]ObfL+[Ȩ30 TQ>d>dMq PsO(3%ci u@jW;[q (^/P3 9ؾ'~9G Ĉ2rxw(NgaEPk3ϝ Q>c6h6>5YSYK#qoET$IFȴ7c87;X,Ns{v>}si_v5f @r PC#GAV%MU ^P!o[=\xlt) |~[OdM !Pwt? Sk o& U >[4?K:q^آ ka"Dd;Tkx5 d$3n:f![1o&c65` 0Sy3 )`xTtEF CS0 K_q'eVm^ǘy *skt}+A|~mYKwЈ tnSSsh&Yy׷-\MCv`J{/WӯlI#*x+Dt25G2Rº4=i1;Y/i]qpU4aIl= f9 K%HûGEWdݣb$|# wղ,{PUUdԼ"$QPozEc \8J044o)x}I|LHM{bavf?h#H#mmSG6[8זdښI67֑hqip~<@-L-B5L9DHc Kx4\2*#K ]Y57٣ {42^+.jޤhӯO ؼCNG9gj =5 ͓' nC{p7+.:~X,%i m$n c{,E3OtDD gbLLs-Bfhm³lXQ5,#`#Z&e |H̾~z؎_z`..^c\H m T;T;;'Ӽ¬~ۦd O>!/Tnh\97x$H,RO,\O4\YYI^D&"o!Xˈ%XUuxmQmQ - 6!/(q}Gib:m D OT #c㽪(-z5?MY|P_`8ec:m5f|\ui1K/PGkkwSxQJ:҆m'@ /c,ohk Z&Hku#yW=̼ӱ2:E^ttYU+U-QVQ#'hj3i#h& Qmcv=x=x=dRaښ+lʵK{ϼlDXh[ C&/㉵}w3c(%i'XO! dѦ73('%% R*HΒ Tm(^/`v&Ø;{- @zÑzE=Ȋ f1xis #cW<>#Wmho'xPS~+f璌47kel1>|2( j-u]ڜ aQF=JFijdGL5^@O)t+u?YU:fm^**xtz>>^5OORc-u{vP9R<|"vsld鄸zN?FmDkh//  heg]mIF5\@se #kxL'X vc0EDY5< G )^$K(tr9g-ҜhxXx6};%:hoOW 941h3P-P5ًܷ,Aۀ$DJ"=49"=24@ol7Ŧ-'2|v08Xps; V60|Ngsj<;E4MEŖ,AE [İA@lyL[i =caF@OL8Jg>}6 Jz%)2cCnM,Яp@R\OTdr Ao4$ECVvg%cnx'ÓB7;ϧ(Ǔ@{[%mlHCRHb`[ΌƖX;mĎ-1>1liYDQ$TUxh׫e%yũJ2]~<ʆvp/lu.!%W;9 oȥ>)-%IH%3d:na6 `#8'* Ɉ ے4$IUZ<~هx XMjotd_/-v=}t"J-*cmRXeZ\zmA BFPʑp[~:{fwKpXR=~o^-x~Z1*z=e\TD Attׂ,1ҚzqS:_,"ʐJXPOS5)S5rr3Z&߸{' 6M5`Y`L6>uW3Ǝ)!# 5Lðu(6uM"+7m]HQU/3wxx{Lq߼lWdx^cAm%'_QvnVHP{u u)!Zw&_xܜ2ZT*F΢jk>Uk;^M7#,; 8uCM0Mq\zٛSdcrRJs oJ@&%GB1|>O#'ç{ˍֳ!uÔOV\߂eώlQ4O$ވn$6` lܦ^?+&DIBR$Y N8z7XNRYs x=+q!g4K}<.m$49by^N~?W^؆>tT`[&-u7V`myn)V&hfvaoMDۢ1L?l+K|,_9=JrH5` FZq ;l#Iٟ[ kF$ܳN,#,y575P<6d]F^ HvG˚-)r~bfHIETIE[4"#<}8vd$mc[n+[9kVAmn2 S71 {h=:(''0+N[l Ph(g2]ODo`bU;U$^dS%h+f:mؖ\4y"Ti4Ag jڬ5j.h=hCg`bcxXR^|:;Ϻ: 5#k9:eV&9rϦ}E1[?cpO+2 ;6۶L 0i ũlV.37toCeZ44Sڽ,1IB Qx$sZc+#n c3\TrH"\ݿ_` 7%O#2 ,Sg}fosyW Xe-AR4Y%o?E4v̞G"ʒAD %Km]–xm~=OGP4rKFP'ڨUK4tt^K,1Dq.TH5H/i y,N+IW|rf1z2FDs%/zf5cqYh^xZ4-,&MQULe]te6iRDۣ4gvns!00Mε7ewmMaD3IcV;z1q.D4f!6l _Ȝ dQVI&Z ٭>~4%K"B"rB/xpH #v?]SMn"K5C-=4K{MHwk aZ6e SYL&Νͷ:2٩)j5R> }9k B@C}vZd+o<= C|80aogMd"`!&b-U$#MF&料lkm'fXZAVD9+ŧ-HH$&\DթFj2^xCY댖QTlAF`Y??)pˬXFt[#JTg}gz8ݢj9rFr"Ioc'P|^k9ǘkx X?`(|n.Lo4' BF .9]>F* W̗F/)8&'3_a=V}׮;u,9Wb=L{ _tzdW~phu! gQQK-ӎ|pja=zAFϩ9uVk[*8X!t*<7N7 ad2v*v49뜥lSRѕ E烇ND7Jx^Z;w )qQjC9wKŁru/l)/1ԛm:䜝3wAxQ!`d$&jgK:sB7'PpUD|E(DUn;Hw\VVYu8vUbMߑt#c\~BlvufΘj/j2b@Ah\G{h?vB@prHgO쒱5@C@`_<*+pgU ȗ-GϝXt/`=0VBT N;1IEDjzm=Պ2V31 IDATJXe֭\idTk_<[BK&2cr^:(Wze7}E nani+PHޤ#Go|wbKgsaR)RcgNEǍJ"R^5\7sMZ͢Z) U % (04TJX\xou}n9k ~PQBo0gqP&@UǚI: MmI$I$׷ڎK`hHo<=}9hXe1;"?6R6Z­[,M}P*oB.׿NfDF!#%reʥ_T< ^8h5R(|v}8)#V,u&׽@T,3n ;Z|{ OMQL,N!L#4j{I:x˛MylzjxT'Ht-DQuՠ39'ls߱j9xp7*>B*eLha躆k躎ƽ/4MC! !|B|0$}?&@rך(2)Ak6qtkiSnw.MoO})[-tQͣ\H[Od a꘦*4}%+/acj3\ZD`;+j;20c??}. Ðѡ CeJ:_Js9:2&ǖ1e2IR)؋[_J`Y9dCwgMғ^we-E==<^!Lzͱg<*$ ҭi-iJOoݓP;>b*g?<% C'MޕɇӚTq1GzV;~ >4-Bhp qR_14Tbhc(SPUJ)VD"4לq5Ood5sԛ9L#%#04m!վ3ӁZhGUq >/}9B[G4:2b?O=WuЖG6Y(-q9:#!#Iǹq%/r~s8c7| Bڶ5b/zbppj HHRW1y]o(P;ãwCO,J |9EFTFxgLzO)D0zq{:H:y'ؾ0 u94-miZӔJ sZgn}S^-5^>6 u#Gc:RX(;Xg̻Z^yd:R nu ,28XEۣSqf7Sx&<ƾTjB s W0L+.5Z~/PFGd\EF(bY&=~e͓($J"EۼEJ L#Q@O9¹sͽS>/6TMKXU>𞽦| M$#A!r`߳ ٶ q/a=N5l] r\ t3yɣǂ;XoL@]Cz4JU=v0$"##%r%F ɏ_!=[7 )MFp|G.:2u7twc'd\O+ l zkJ"H_Ύ`Y"ٲjcZsζ%X;w4jY{)t-B.:a7g1#}YI5M5C558# 9d/~ȳVJ"`͉m<혆 U3PqbFo;mŪHRo .(|z!?ZXhFxx&<<|#UF uFGd_HaԎO43:Zjz2BU0j%ђ)d( M4H)by=56t#ܟUOL~ N4Dג4sӳ7AGI$ :洑nInM!O?ʶX DW)UKDDLCUU*#5G\v{ޤYԚ%0dxH\ߨ:bb\q7g o<4uljU%JDB!B B(!DK%RƏď$A$ "P⇒p}"Rw~xpm pm hmIKap/i5ww?N"02Rd-=>wx2&(B&Z2L#/HkI2cKs<ǻ?p0:̽șm?a^%۾fiI~.;sVSCڒ=C%A*p\.;}`/9 nZZ"t}Sp[O (Rw"QSw߇?qQik4+u|c_7#FF˴%ioKo߻BN1 5e )˒d3&A*J$83z/-~HJ(|B?HHjT"k]UcTU 7BCP_cdF0 GGnq1JguY. s6_~??[-3glZZ&j!%419kLrRT < ST>Oђqτe{.;w w\!t/G ?Y_It-%e.x@[\~1DW߼$t\NImwꪇ \F{{ )uR)[̝ ^6;$;SwH nc\lۡf8n^8^P(PB$cL"B BR)]Eב5PuPո)!4T 4Eu]0xr^@I[{O~8~w8?I\EtwJw=.nI3fMit [).g~Z(qJM?G;~S-|bެqU߀4DVuЗJd6E*b`0AMy$y '&c?^x ۹łJ( 义Ux 9"?vXa9%rBOmN_ cwe7^'5/M%hX06_(]] =,g\V p6~{S$ZHҨp38+dLLD&`O8#z=ՂnpE:'_y.>m  nZc;Ifa՚qߕ v~bZ:IԤR?pUi]=)+Gα]^rc{oyޙ8ImQ<㛒~Gk ruJ: R7g~@gBV!pld2f_J>_P(bY1ޑz;YI L%02Lmpn%ׯ~RNGQ5,ȇ?2qۀߗ3'V3i Qk c&[b8>sibfRT"_~~V@*'E%Wk-oMU-%ђ/0Ro=Uob-e'u}JBBFlJ\7I.'RJP#0:~m-mSKK7(u*8Yͻ\YGUT׭v5iq7Ѩ7 y@ԗu$^rr4ˣ#8;QDSMW&kfS $J6g?T COsΝ^IQ<В[7#/aSTu[xVqFq3\ßpkuF8V'&:`7l속8Ĭ̬|N5 -ZզV7Dzv=05:B|NWJW8U WQ)4T tmpgÊYgjydZ>(E|?va\q4TJYy2]ڗ{r_=7#f tuR.d&Na@HL#nfmC=L #nԪM?a|,4ܯ<#OGrz(]0qEdm3QAj/[?vmI?O`7,MM2 RAXX6T1EhmMN'bIP'W/6ɗdU8|S/2y='v4g ww뇫T jb_v${UO~JF!WX(; k5ױM Qdf/E;{=_= #[Z:9_$Tfj g&@ML=Uϡz\# niꂬJJAnsDf{izQ VN[MIO.d^P6E9Wy=.igzEz8OԤXjZ:X50 $;%J[Z=Z JJ$4CSTJד(z%8\/Vh>` ^~⢭KPdV@r2~UUiUU^D #@A($L|h%ByuŽHP#:wyL H F}sٗ[Wv*tޏoZ9UOвdj:;cQ%?z-5Cxz?7wo6&ҝ.-FkB˗ގM<#C{\z\_&4* ʕrY-iuq1ݟ[ 6hZ!$u%kcavM! M8"P"%{w^Z8#>Â$z!Y3wrY0* e* mmqϫ*Ebq<"W((b ْoZ[ !"ϋ I> 6Uj$ShzHU[1-7\(!hhIscksM.aѹn&.gR$ue,I<։E|9K?X'kJ " "ҚJѕ0VK>JöX6eMMS9&uZ:٢ޑ[oZ>ҟrIܠ+'EψC6xoJ< t@ӄ~@Da #\?qFqn UAB"x*+bEkvwo=nB/ t&*kbdM n# eړt_qϩ*Mh*`dVCi}Eznȉɐ0BF!P BJ{GAepT;Bӓ9glmN+ !ֱhl EhԇYqޖۊŤ߿B>cOtr;&y""^&VC2 5!"In,˼t2ċ'iX6|d=8wGPI6T.Q [fWM*U ߲,FӗR.9ԣ\r10Da"#F)# '"aVP%͇R &HɪœO)FpGux[{p↻#b*bwNLmk׫8%zq7م Hgq*5g 8 n[1(DHȕ_C6.E?S "q^hO9sO$C(%PU]0r{Ѷe=mU8v "?- IDAT?Eqt5;{z&ja.8lblML!QD"B/"lU!!GO?B$s˟G; =~gyې nb JʣhT~(<6~B׿qn# 'g}^wJ͢R0m)q I_LMGxoDbKŖ_!xi!?IϏ3`aK]*!AIDQĪ''7U=w>\7d!s71ҫUU**s֦:OM(FmwD[ 6B"ճNغ?W)z RsҦw`uJ\&M鱌!U H2Q>*::j*:MY϶6ǹ;?*o]ȥk1+o]+"B XڻlKLU!pt>;4))]6Pl\~u/і}`Bm A8D"l]|{SiT]fye>7y»;.՚Mfeup'0 Vޛވu!.ݏTD| ĕH0AH *1^$#`$Bc}9_ Bɪ)״=xC RDn#޿@G^旅WpB9_f |U4U' [~eZ,DO%q5hپKF3RhZ"~ԓGV3'h*BdDu/P J\U"PP!TTEC"7F91sω?D::$p-p[61ZPaTy1{DW[֤2ׅh 2s䔑?{) :FCGVi >u~<+?yv\wʄwՃ] Z>uǮ\W=/TU<#pIAz![7mޱub{0B3>#pAF'FkEOD ؿ= wDuPs} O['",Lqm5ZTJ5E2e+cwqҝm$;Z  Y~y:Dhظ- ӝyP!/Nzo^ =o~Y .n:s-w1NC;V^{/ fȘ0BJJ_|!ȩ 87'9ˣC72|:]GO:#G>L|6;jGaOSSc_UM/_OP趋xdoNR{'\%D{*)q]±e#AuLJJ8$~,ʤ u0wG,gsm4U./Yʥytu)YK_q{o4UAn%tdCNƲqA!ihz]O(eNY=QϙIL~#.<@nm5o*5fغ U*gX#KWG*xwύfЮ s:#T~S O)POԚ]"C>":}HR<궏cy}?~ |JPck84.mǂ.n{ JEXx//^ƋO%ө57Q}JO hx!јhɸ_¢l28cgWCUn<̞Jl([4ʵS-թ_DB'7˞zJTg+^WluOa@ABKZW͍޻?fEձ#(l>gfufQt4y"Aȭ#07k\^d AN0wP}V +w_(2 WNaQUkqFݡش2+/5Ldz;^-h4:Mt!Є(hB!O1/X Rp+O pO%.DH?"INs $+S Kѿ!m!r=ExCRͨB %ޔLtG L U 9 @}Y -_qU#1Ϗ d2&z^̚BCW0u Ӆ*b-(PϦfUhL`w5>xZL?lD|萉ϛӎj(J6'X(UD{_8&Xi D(Q6&M#$MۧiyxBriZ.b8Q2NI]xUlX-P֟.TLEPTtE!(H6qICy  f5wAAH&t@LSQߔjZ2:HP*e6Ch BW(VKhiȩOj11͸#ymħ;ϗx&0Vb|'h8Mmz\>z 79;c%ɏyl,'# TMo a;Ʒyv E嘮vVBT-6JцWk69s/;^c#qgL&u1?JJ2Qu-X/eg,UpJ*(DQ@p wq@Fhf |a TW[-;m]wPԘėT41)B"<ėen$_OtuI]0\_ąvRTMG7L"6 (@VFWؔ*Cоr:M?xgL"p~, )9«8lۃkpqR}歠5z-#Mķ8'PqÜӚ|(R`Y'Y(Fi0<.0E I^TIdtp. eM4M4tqꨧt>E{!j)֕Wͫ8B8n 5 Q-ۍXѹdaUB)Bߡ"uyLv顒1"|RdL߹-"|4%^"6AZ 4TZ^ɐ p=_G[̴IvvDzWhD*iЙ DR4f& xx!W,\7nGUe)S\*xn$mZλoNFo?*c lH 7t\ra9;>AJRlTRc* J/ya`,2׾w| U_szf!Zӎ컞eNO~и5^>]~7\jd -(7" D N0f'{պ%#AD~DoȦb*pU\[&foPh/qqo#Bm 6=W±@.^ŵ=\s5w=v6 &#@Rԛ6]RH*)۩Rr7¯'䞴* ZA޳zbm}(U?=nlaa9ڞ!:(BXvUAAȩ/GIS'0|7 "1 Bb*4$ F~gMvW#N>P ,ei|%7fY1Mvqlpl׉'*@bl6?7W>[})R--4NfUFQoWCN:h#V ^qˬ+ GMT=Ç_x:~1T! "_Oɵ?m|sNdҹ$WqqVVh((RAH:Xˎ!2I }{WQ[.5M 0QMߏ7D[jEx F*(j,E=BE#Mna[.b[.9xeuwBk`#݀i8$32)V] O 0蘨(RF gtgx6oEׂN'/x%D&ETlzm m~S3E1 qg! ;hł?amx%GvMhJpL߾y:fi`U:QMIUD U$jk%Q@cUS,9iбQC}x+# ! |NF@<&e{wץcrG8;]Rr^֚]oI$#\"uE3%-=iz,ݬ {Gz^vP(C>: 2F2&%M}-#=}(DЉ`ɩa[FoXKw81ŎL5rO\|w<2'~ }w'7! w,f4 q /$`y.m{𤭚Zx!`nbniQ__OyYUUTU'$QSCEeDM-Ga A$VmwFQE)hx֕2uE0?PG.)R-Ҹdp]{,$-]\2HzUvo%7M[RtLT,T,Z!tsE#P4R2^HXDNXxdƩbSF~HhSqb[]_y>#D S((ԷA}g3ɋEȍu{W~Ӈr,ib` L]Ú}ÑV D jkj)-2*+*) Qr踪Czk#Îk@FAP]%T?ț Dnoj[Rf'<#q"x Kz 儰{™Mjty?@e> F'NLBCJ?8_MDK|씲̩[kss6] 6jn9!GT30) rԱ}V#?ᛗ͹]o+H\f'0yQL4> O'TNVwXP+ D1(4TTTRV ʨxWWo4' ] v4r֔:)R /VAup )rH-l`,!FB1XQN1R-&,ںt)g=tpXzjRLfBL,oN> bAq h[Zuu;r՘(̉Rw85[ȦP),anA5[pCR:Y Ԛ,C3 1ų׏/洧V0IZ8L'2T6,4$ɐ DṼjQid-°IHO ;۴_NW7䮶"Tdʥ0 =oϜu(7Ɯky٧9ㄎ &e\<$V (%Ǟ%䄉E#q)|uVSZVIii9B,oU[n?.rIĈ4dP'{Xk)i|w8@?C3'^fH6ݓwk07lVx|)nk?Twu'#|+Tx3qҋb}vVK{n"5OqW ]˖)>&|~YTA>E[DN<ewAgm:C@ISU<zӋ~ =3[ʬ$#&>%4N PXFVގy)T6ؔ&vTkYifVRF-:wmSS1{ΪN#;,}B!xYGS4is;)=ya s#,4Vlc{i;w0r,謩EKoHAX U[6 Dl͖\SY+%t2mΎn֒K9В́=0 IrBClZӲ?ԇ㮤רPl*4\yilr$~5KQmGmOd'>9'zYmv+vu֗8JYM#j> ? >wsɋ(]- ۂ_c /Vb`T4EMu.pk9Q3LT(vO7 pm,w}PGlAŧ.eALTH2@ 5 \uoYMzZg2خ`]oHbՊX^(qګA,^ Yx~#ե3T(6)\=MڝPt_ ^9Y.VU~^lSBqN򱟚:CC/E43ƪnJyx^뾄 t&S$'Dv W E#4<쎶R+@ c+(%'0dЙ^c'oCU0TD;ԓ;FxyUPr()a)e[eCyk~g|`t>;P =kBu}^kRFJ ҕI;|KKwsօ:XX<@4,yXstg GlڼKW6[y!oxKeh)SG{ϭCF~P(o፹7#d&J@} Ej8B0"u"F*(GuqN!O4lLߝ&Ɏ7PTizݗP7BJ~iLa8\_ 4.KefPR +'~o9{?z]4t+g8?rbgg\n#߷;k7se'O  ٶu7yCBvW _A(!츬p4lbhIţA; $uIE>bssP4ZEy@u-P#5+ASWȁ/Dr͢G*/KJgTJ۷2Kcg8NJłDc6le\܃ #' Xf K]V"ds @vu/MڶW\Kg.s15|#rRH̽eOϾ6E2Y  WW] |qn:Un .!pBZ &B-@7=[vw-u{nbA3˘ămۂȊPP# s7r ύ `iŸqە)N"QQ2B + <z|y5Mby orA mM{ dp04ѤH4^͛zq듟 Zuc.$ Wlgd[^PB}t(ϕu7vkfil|ʺhѓ^ݠh.gֽ&' b4Rga!+yc_Aͯ_Ò* :ՅAcX4욏 @C%[@7*҅IǟP9I@xo<n^\1n$QUM50 Jޜk>)Xz*wL~0ad٪Swc'+ó tc;J!M6[&o^s5 v}K-M``(WȨxGkғX2k9x&%8~k]֕l E:hO1$h,Y7Rh]QcFd+7~Ku}qG9t+~q:Zj-MPi۟PfT!P7A;HQJ ®d '\ ugNnLKM Nb>mvTnZ[K]2CM!0BNA@D" R\db-H*ӍuqZ TP<ZU&Q%+Xh5:>>q1,EClq }FXԢe7W\%`V@]:CmS :׾n{IL~-[p̿ٵ]D Tb35!?_kI>"+"ۂ7%w{K1y g)3[C<$V"V!!ftN xw~$d^?A1@(0HS޽-[>ٱ5zh*AM%J): rV ޡ*PD =iOtO 6ٹ졾w[Fw|0CC , uuR.[Oontn޹D#{RR$wi[b|?o6؀DﻌI{'<ݻ3'`}#l?9FCy376S(p%׶pgS0Qdw-MJ /9x$ش|Һt 猀>:&JBB: s>%>q Cɒkbj> [Vbӯ+R`^Yɔ+:?9o@=39%THjeKQ3I&| .!Pߐ"QSGIi!M#y,MgG@q~nat"JRvmAl8%/4v2~CQ0PM>g,]``XQ,K6}|w΋h NMIԤӄUo`m^(4M*,yѳ$Dz[c+luoOC S*Ժ*M[scz^zf[BGs=p/C7g5dr[ 8[ѭ L0a Ci]B2}[c'7yyt-&;qWшI,bxf6+х,< vm4;zZC Pi\VS*)0]d喱SDP'4ij]Xks01v8g-J'iD4Mx%?G}_{A?=.aS#l؝AQWwoDN^bV\WdJRH -/L4d T'Y2X4.ꨖ$S.Au&IQi y # j!tJhd5;@-xԺid7Mmp[0WW֝`?647hDWQ¦F04)wBu7q#ɧdw%L}/Ν }b;xtHd$+TV@j2ij3ilxm_b0q"D{W8ಎjRE΄ons-Dͷ/ֱu8ij\Y)k퉾zF},;FX]$"FD׳dבY(/D҉XT]Uk2{?U7K,Xn>hb61!޵M$h |v+ؕm !FuVxҠb.Dq̬UWF#kbz{˭WkQy86ҦMS|5ޛz~zZ<|]ikvyNӽ7lv:z=΃A,4tUAW9lb6J}s 7MMQ|o槝V=B#B@xEԦPP¥wS| \wH>71 nDuKU#p{-J҈Y:aS91ʯ_Ǝs }DL!mLPPZi|+ogel WLݿÚ=@FVPZYE WSM ijZ^\Lӑsu(=Iwۊ߹n'חXNlt\e1gAK''`)ACx7kr%t:^/>^Fjav0a/nik%mf6C+yfN-&)Vvp&'d5aլ  oX|ҳI?;۵qTfRT9)t_,kWzz>ZШvSƬ]"]'|b9!y}uR^|;VfNΥ8NN '`xz{u:YKV禱]u"\"92mʇ6=JZU%103綞YŅT kqI8654~ANd $Fd.`;ung}!M'K˖Nvm]u.$oE_=1H1PePi65wbgsq yac} ;qvz/y!}Z:*3ÇfBX{)%p^+?517a_|T;E8d2sv֯i*"6A$4ՙ4+8"D`хI`jSM΄}K0:ljI"utlgrh$FI*UvZYzAF\_V W.}~ u4GAn^0Fak O䛾O G1BA~,M:LY?Hx7]q..$)1YT5{9CGL5Lm!t-<Sl~~No"_ l6PzYM .㹶V^'k>[-KHn**խ+N~O2X&7qsw3/QQ#.Gs2g5 M'C/#4n%y!KS15eG er$\'\ÌY`_qy/J>``QP6p[}T B*4v_xmp>+c ͺM5Jh` 6PMq݊ZԒ1;=kۄmcǰ;T#ev# ;E"kW3᳖%4qq@ $omXGL}Lo_}!懙>c9s7LMc)*PLHМe|zEt!yʇ; G_&X℻)j`L2dga \|J߬u7k&6GCU|Z)ۺ[`@B_(Sg$HȄ Rmf0>H/Aֶ ;^f.j;mMכ?q'"tL EJU[ҍp}8ˏlVl 3rwgT1 tA°IaUM59:.>}n1QV//d<~՟p 2H4S|-SQ1U!ڢ#OH -: xd'pU wm/O͎d#ۓ')jl;6bŽקּ=N75 Ba~wl\ƀjnzv&??̖oZ]?PhV֝~vpBr& ?|IQsg-MeEn:.WK,23DFit%s^_9p‡}ʦ79rBpWV2|=SQa;'MAz0$,l I9IOČjRt#ȶ/kƐzMR2C  T2R0 .<b2Pb W|Xg'pxh5xjujB@" bXn`C,4),,œt77Ԯ=w@v uXGLJ@uFp#FEپ7.e.!O;ڗp$1Yl;i9|uN:'CԉWrQDXY-j;Ɪ)0,%l5/V@Ģ6e뙿p^aͫ (*%۱U< "nQ1WvTGs "ZFk oKɮqի?(P$5ygFd}]]i]wI/Q35z&A"$lD#[E+ 873P4a5V0hrXϹGz6sًKQ<ޱ$U9gZ۠bnv<' A^^H. me}>4Vb"tEa-mOV;1{Ɖ AnxQ^рGv옒ƿ "fއXQ2r=P`+gn͆r:3iTB {nlɢKB4%jpLOnI,5NZYyHnpKĺ/[N1 魅OyC; 4,D,ڱC ɍTEh= 0,=cZUX_Melǁ=FD5Xܰp'h~ΈvD1?n^bbFз^6љ^nl.= ;Jjp ;إ%t  wȵu IDAT^ ^/FzsuTɰS&I _\"WJS2޻>Ƴst? _{ ;M~S"hqGvn#KrRAMRz/Tb)B&轿ەKZª^sa31 P tA!MChŨfh覆 v6mbv"vOqrn=LEUEěf~4("Te-]e:iSK{Qp5n&a!lm?_U*;Z=ézK>yd&Sx?gwQ5US=N\ڵj-{5L{O>ͩT*z<5q|!xȠ"dZo9OAšJXSi ;7щJ^9cp!QK'2ذwPUtxY ){`> nz쫆B̐IR8Tl=Tnm>o]ͮJ@J;|_N5ěKɩay"V+z'V ;"T\̉κ{r1ꈢ,es>k"u qR񝅯Lft54Ʈ:IaDv,{6s䅭%,{ej~[p# 48FJdT6ծ z{~t)*hd#3;t>ʼnz!=pV. 4v T0}}0뷿o LO+H@հΊ:"zoO219!)}Gv{!!zF,ºg]NWN(UbJ&`m FwQ "!ƴLm] O^WQa43C 2HlD62{EG?:KvHnm rjl#II1CrVH%⽦eW!T֫N/!hq֩8kX7r} [:~wcC8"7DDWGT@H:wG raSﭧֽ{ ciurW^9T8 g"B]5,P # :X`ByUyg&k)?2uXz QQvꑞiݶ 񻯠MeB&9Bˡc3t))Z!Ԙ2L%w^ٱ7p1׿eP(`ԷZ^8qX@^ 7lUvaY~ƃDDEm*'aa d*c;օk/ɐ!K'hx~[kFȷ0,^ߦ'ӔA)R& uw{1:w0'S妨vmiC˩ɮ$岑Z>NCOpZ@%FhVf*ɹz/مTlicom^1م? aΏT"FDWծ~h;k+{o?wu]i-^ #祵Eq_ (t ARf6nJBw]F_@ ykYuءu]w]Ja=>E47T1Huv^IR:|TNǬ'`fp؝ִ,g-J~ /hАY)9&=Gɷt"JDW oIgZ.K7u4W".%kJjwE=Π_μMpROLCH@RT ƉpI 6.i钒;8HiDOs'xh32ES;/WAz B5ѩ=ɿ4ͷDs"'N%.;w9)dh(F@U *AEcfn.GHIUN%1$#JFE:+ܳ#jqQّAOv$M_ | c[%Y»䵯FʗqX[xҁ!CK[?ݫ3q\Qe9,e@W"|KNHOX*.4Ȍᒑ.;.Go^I1ծM6Qa@y J+%GJ[?Sɽ݋oNbz)lIPh4J5N=no~x AEY5KɏN,dz)EqN*e.kw['a&<;#i%:.tvt  =Ѕ@ f tqGzEm'N&?;wĄA&z;Q˞@pqp+B(9t D 6.;<քLKjqp3tGh Sd@@^@C |U)9$W]Zm +cA90l5=8.X좆qO8Dw98 oflq) )IW%yI2T2KrғyDi5uX&#$)=칬a q$G@vq B(BXfN _S@tA4Je#d6q}t6; >4_ TTNj~<`H9.M[х- ,^֡ΰ>#\лӺxDmJPÚ><|Ou"I"])D-O\EKxEƕN6"rWJ$DJ/e-IFH4O;ͤ(P͵Wr\ҎK:shg=P5iQ[:y>޷Ґ"¬$YF7^mĸqD0NH:!EcM}5z=Jap8ASGY<5\лuNLYQQ˪&<ӊsXqQ>II)>y xnfJ:ͅrKP&D6 Px# "T-2ig ^W'芝 )`26d\ˡϓ6E|pP]: :#OWCc 'I2m%hnRbI;ߴ􏤬NUi!T%sNTilN5^!ƞIQn ?Ӷ[ ۉڊ'L&\dz&v[,X*2&'d)% ݊S.a%gV=rPǝ!xt OʰˢCCNKÆQ^]]}OWz~/Ay=T$-F6E#ڊDOd/[BBI e;6N&e*s zЫElsm2%.)~2 ^l>7Дv6y0u[}td;pKȂdeM 6J cƫi?q,>{GeOHs!M~xG zu^McM$Ni{֦S ^Q,^m;)#9}Ւ13 WИjzjfgMrm?7k| .u-AzBB`2Үb~wHFY'3<*`E,x i $AMPOM1)}K9:] jq~CT$-֔V)竃7>}$tc6S]2.:s[GJ͑x2H61"iĬR*1=Cm 0ч,bAc` WI9PKDnrۃxi Є``hdsSJo=yQO?OsTFo f3!æx%~GmE% 6W3ןpʀp΍^ZƊRz.a^K'+=b$ItSBCA1'9; kb,c# Gʁ J'-j;+AJg]@&?B -$eVeb9N)@g2LM] MPi `]~A?}GePA +<~~|u_<(g̣_ F[tbNߩ%x lx0r'_viG¶6 ^&ܐ~)&_sM_$zFu~ 2bXl&5l'rDߓtN @)8./=^pDN"?9']Snt @|ḫk`]s^2Pa vcMiQY!YWG*ͷO=Ιz{toʦ:_NcQ@=C"l a JIS[b,%n- snT9/O[HЧ]5eKExe%$3\Z}{:q9{᫮tgçxt M>OvĬF'4!LF{+v'3P.a$|+˛,~!;&gGHGv,߰-bJL@wܑi;I̲Y& "цx;)P"xx%z,$)mF>Ąt> $d90xR\xJs 4Gx4{ul). %l"-zHHbIt -:/9f=5^|+ybU^_~'P6n䔮;f3J5vʫk MQ"fTj[:k;.)8}4r70S槢7asvPFB%{ME5Y{BRTQ-JSl:YPoš#t[I^ּ%]oZggqD, +I2ݤ4aIx?z(&)ezP?f9UO065YV=8!Cx2n߲2>(ܦĮ*k κUil K!rj$uÇwIIDATKLt !t ?^40 ^m9SJ 89vx]Xc/bōoyapl>4d lԲOK5'Q3XqT]MHƃGjGo`Nu"ű($A%&$K ML׷7fk|M1{jYrrh7 au%J]SCxكsk:)tu?TFբv]%x2&ᬺ8Y-_uZ[,"M:oZ윇DL*I2 |zw3DDj-{DaRǪ:XV~O5ɗbV'v0t|2{pZb~MmMDdٝ3kK5iR% -"-rUS>g!a|}MVc.,X׭db "CB!IJL另NH$M)q$>XM)C&uحNr͉)^n'!YQ miՄNw";Sf&X[^J%P\=hK?k.}h[rz`06hUU:ZXH 4nTg]XI%IXD1=vsp" $Fzq,M6YGyUHi'小c). tQ֙d^:e|-gX0zsKRiUg|WYGؚ=kĶ5JIi:ߺckuu_;B0wpqMւE8eR%Rct@">z7V݈ $I F{~wу#Ll`)6df8ߏgH8r6~MJ9xn$7@wG ^#9 u#@Kd>*emZ化 ގnr5e `1$%""%z: I  lz7S!07$P"2I76JMߜ0zs8әHp#;ЩI6'+`VǍNO2C~ kם+ɆDb3A%t-FﳎfBt/o֢kfǬ C:ev{}m7b,F c!AMMwMYngLکuJ  BˉcC&Ƚ^lwxObU٪$sأyƟ_Ƨqx4 &NaQkDR3NM_[%xM'P3 n86/:+OxGC^!MThBuk^]`>> !6+F%+a-Dقx5Y[i:ܗmQj%M-3[݊]QD|c-ovpXJBd^ݮn/g<.V$q"$&r9pXHpW Τ&*6OKB G^͋@~ʼnJSb]q+YfFYp'4Ji٬Ȏ18#N?UMy!IiSa&$qqm+5KN/P4dz+.{#\9S;/˰7H2e.͂c>Fz/ mnkSȫ6QE4l ?]4i^-e{X)XH#x v{yzpR]X";FOObf9-69&!-ERem5WFh1I6/#*%{cH'~3aKKkIILV9J^N0/=c ]m*>c1P%Җt-jB BCs8 Rf;T|)dFOAiю0@ BNP!T$~b㔨ufk&nWܳvr,Y5`3hnv0=K V8#p)q&%{ YjfLr6I R' i/صS"Jg.PFg:K I@ؔQۢ$<`{7\b(kLjʍޖ"cv5-5Xeްt}&\ķNF4SX:+P|~eiA JWy񈪒V&62ITD1ɹ\xE~%}p!M+q,eR鉏/RJA:ނP|42N2Ls|C͉3pV8T1,b"sUDׅQ 6YlI`vJ <,$;L_%'G#tJY}e0P sCn̞/仩ϒ""MGdU;: V]Fɴe$TvEpMt5f]zfn=M(%xݜane>K&*nb˖EYKۥ J=ܔgL Qs%x gK'y:,:vzDÙ8\(],wY,%=nWJ;XW wITT҂'R9,lw5.l*x!ڡGTbӠSIHq|_Qnڶe%xZ臘,&鸌Ig;Th릶Sh3e*7#X;<[SR{ dHN)vKnۛ ^tKFYؘҙEIlWGT9ڕlSj1q%rO`Wi*,X.jFj]YMu*˞Mt)Dme޷,Ej D 8)Z%x# E['?B(S(%x ۠OPt)ni՗J ewȮ:7k<;75R:B/_/,vRJf͞O~z̚3ϼl߾}<+$6aI;m+ju%}}.b'|H&n-Lo{ޕhGv6>gxngg??W_q sǕhHii:&f]GuݞD ¨6۸ǹrȟO<^{=K+{kM'|BFFr cƌi7ցh{LNթw11Ad1{l޲C2]|̛/7l`c},͘_HSu2̟C8N_s)αcYLO^&++|nx1]]3GD"`Ƭ9Lt zAά^?5kj=䜃3:nzNy!#iR;|(O<4Gqx1w\nFN=Tϼy}@^u}ԑ̸kNϹ{G `UWRQQٳj<>g2kt#sG^yeykN:VxafL/ W/z2iumђk;c:,q̜fח`0ȵ{sQ~233ɟ8wy׫o`09 TbYIhluE؇}<ǟxϷ=_b| >;PCNL.+?g3;j}4f7oÏ";7<@\X"y<=qlQQQg['r(Fvn e{qqW`ʪ_H$B(@n=]Ӵaտ>ᒋ/&o{^\\ywO vm-Fx~>.rz}y'4>}z#/i9F{nz<67k׭WoqdZdN>u3uڌ_ߤygŜ̙w.!NZ۹3}QΤ3FW}{\!(ܳF5>_uD} Ii+//ů{urϽ3lٲÇq74 o军pkƍͿU뱓&珷!:gyoox7ྻ3ad.˵Ʋe >g~=|oIE80j6!4,t'./B`&BhjKW'5ȚᆪGV{4S5p/`ƍ ((( ??ydN<Ėy q#+>tۖnoۻ{1!6,mQXX1ǝ-TEyzIn*%Ŝ9sx'Fp ̞=;~L0~ngʵiOmZTZLngZֿ?UN`X?| ^zpߏґW˙R_:Mu5벮eMEt-*.lYhQk;Y:M1rek}5 WY]˚r;=Z֝hIdB5-yW-NG93gL̳ϭ!xs6ǹvXfϝ޷x,Ŵ+y7Ҽx ,[Rվ;q#<~wm]*2Oxu^#5Y]TWqF#vpJI?yGUkNN`E 0 -;W3®eME5v-NJZJSɚˆӢ~ÆF0 hƸGu-k*lkYwN\'s3.&MجLVÇ}vXJKw0~¤4լ>:kYSQng\˺xXw:\Oywj=qO&s?0{|rõװWv~C\ꣳ5s;Y[u'kk="ݔnOIkQXT1*Ʋ;ײMշ=֮eO疛o"3!2ns;v'^EܚKAA,_MR:ʵ W^W^P(:]rssu,kBZO6(2%x EB) E7A B6(S( S%e EGÕN!l( E}\{ӭ|ʪE cQ(B2;D#0BhIo\-4'p9eNjov* E[b; ^ i+E IIENDB`mayavi-4.5.0/docs/source/mayavi/images/example_mlab_visual.jpg0000644000076500000240000005141512747716313025131 0ustar prabhustaff00000000000000JFIFHHC   %# , #&')*)-0-(0%()(C   (((((((((((((((((((((((((((((((((((((((((((((((((((a>" ]   !1"AQTUu247SVaq36R#Bs5Cbt$rEecd4!1Aaq"Q2#BRb ?/})BCZyq-BtJXTSaI_Ĩ;(6\~sͧD2rYeO+H(`d|fYUexz]>Jt,?~}i+m7k'h %!-HSdqÍv MN82ꈽ ߮ZJ%:]>JikXD^O% ߮ZJ%J||EX~tW)аT\dV#VM3+pt.$аSaI_ĮˮM #gmR l:$sp*﷛]&,ViwI p\մJN*f^fmJ-軄!q;[BRx`Nps@tO% ߮ZJ%W;%e^QA;ݶۛj!A9;cA6-B˥1U:Z@儀J~.<@:B֒NO%gvsu降mljV @F #9'k n9%Ǖgfĕ(އꡕ() GIBX~tW)аW>&uSq )RYK I! ejn\ۦ+Fæ+l0Y@ :q99dаSaI_ĬԖbChuRPn$)+I ;D@Gm 2Bm!)B@@;,?~}i+X~tW*V堢/B֒NO%o>Zo>Z ",?~}i+ mK=!ԭo2BP Bsm-kwE AD~ fг}_ UKm ӺK8[e5d|▽]p7uk>4g8Βq(պqeLD:Re:Ǐ*г}_ UG;þm󮽳jaRD[u \G 4:o+%j{SDж/JA)Ug<5[`wg6gki6z1>yu'Vtd}S,K?`60'DfTh81+(64h\eo&vMkqޔ**\Ԟx;XW?}~: !IZֲR2I'܆QEͳ9m}ťē#SniRI ,ݥ&o)u*3)ZN2SbHDR﷧ֻ%kh(<Ju( U6kc.mɓgIT\.HXqM򲋊JG~UߴUe2>͊5"3id|i!̽5 <%I" 'G>5hF+Tn#_ʭ2-F}S#iR t:jqjڒUjSſIE~t=TWl,J!MnRFy9ւzfp8 O!JP0pH"͊5"3id;6[;jW+GMV/b5ϷwݥTP{i.":A,`PWii#:-veM3_.Z=4$64i%DYW3V+`&)%ZhM>͊5"3idr\jw^,%@)JD":G#WV/b5OtnLgj!ۂ#%<n@$cjI5F7N-M͑Tݳm%@)+@ srp>ؘɌš%=̆,:QJFR'qV*Ýeª ݔݯrSQ-&CJJHR=TVwʼjG=é,g*𫜋[]/C Ki_CE;D K`ĻH_{WO+!T21$xב2sLX}%kI\vRFOmMgL2 q)9x(HٵjR1Z? RrADgikqHCRq8䜸fN)Sk]o3vi\e*KM,jBtV:j= ذ\z%('sAR 64hո;>64h\q^Ǵyqr*Zz]b }U5bT(q`C(VzѐS" Hq8ѐS&4b }T#S1dT1~>td)R *wF@BU:2LY; x_Ob }T,JѐSAN#SF@BU) ҧtd)S x_OŐiS2ѐtd)R *wF@BU:2LYɐv}ӑC'q&td)S x_OŢ ~0p>3? x_O:f͵jnJڊuČ꫈ਪ%&fRq[cqRI$Փ x_Ob }UxG*4t+c f46TeKi*Tѐ" *wF@BU:2L ֝toejtd)UetoejU0g؟i+_UUv'nRbI)@)JP R)@)JP R)@)JP R{w&RuT:Kݒe$c9j_(vwnj2K.<ηchk5+oYvӳ>1l_B8EY/+؞.%ռ+qTII=7)[P+InrOG8/y7rv}GCZXwx"kd-F1wm tҐBR0qoAK{Kfim)(N GW3<.x#n!(L59qj5oW?톤YfmgPP`#E|FrSaYmzU r[G3_CoMYqwmhhum\Rȥ)YPs>64hqs>64h(ϱ>wWVOժ1JRJRR()JJRR(+Ws-Jc/RZ% 52ja[)5^ZqZZײG3 ɒJW<GUX!#'Ƴ֬ɝ:Q^ɦݎu7*{2u(A<8bR ޶v0$-lI]ZH+ϝ]+`(]fOt)JsSI_FSI_F|F}rUWb}?}~TAR$ R)@)JP R^V}KwRּc8FqUGov˶M&80ݝA@-u\FGP#X94}gg.n)Ro0_ŶA*H jVsIs6aǒ;Iy~/F{3 WɢChqK*sx#^HAimN~XM٫]vw9bCqWmo; I Cd(`*m˴V=y7u4b<9JP!BPF6+,\n2mS!6q9^8! g2;2e ݮ9YnQV2Px #&toT2Ba۔>*R $@:$̽A{LseKݳV9" rpCeڎ{$Hr5NFv1Ġ2XtiQFx[ [H{% roZ$-[QZ ̀AN0d86m+W&c3&KJJo HVޭ%Et=|;#d!MIR*xOQ($yM%:rdPKuF\KII{laJE8gވSÉV8I ISmw>=]T'GɘF򕅥: _OUy%.>hc*Z@~:ʷ".؛ ؒ\59x;e1Xb@5m[#tIzzxc gM\.y[73pn `$|!CTsvf܊#7yJ#rs2Iҡik_1vCjnqFUӖ$ntSE &7 uݝMȶ'BRHqɭDٛc#n-V#s zF 9m%e@ t+]_k2[88QχSkkBWCI dǹqpnRqF֓$qٶٻ{}ˌMFKI`{cB5(IN*=țfGˋy{ӛVG9P+om,0*,mZGTV?Yx_uuKsaGwOQxPU퀈-+uNn8@'V%M.61JR)@)JP R|/UƩ|/T>d>M9\~Z>wWV )J)JJRR()J\hn2_ZvpiܥM;c˞8Jɏ$?=P6ݝ8ҷ7{0{cmXfNLe#&.BYUӐT56tW EqOʻQc3$K($2O!_|brq$jk}Sڣ>)h9dqWr8̍eCwUrtdh8o kaheB*E{6)SҀN Qd9Q~k1M)l)2lOM48i# NX࠸ϑW.]Mc]emS.A̅=e)Z$sNNkcW%t}܏]iX[diTegp@$V;+s0;!J e3i CeXRRJ5+ C}G^u Bw[-~E O=ފݩ=8T~{}؎t q/^ނD ,%hPNuT{ڍvIf64hqs>64h(ϱ>wWVOժ1JRJm.ٶf }1 {J*V5 g&vzMOoOVxs:zu{/ݧ͋n䫄"o}'$փff6YfɕM-| ``$_!m.vX}?1 Nt &qv4}j)RAqsOݎǮ&=+)_;v643n ДTc.(0&ŸnUK0ZA‡<3+Е*ri;yk$NG, T_Bcy;@IƑpQBm}rly* ْ0=^<ŻHE\0ۭ!Kp+8>g{YdSx[$߭.E'TFJujH'$oi+6_؇$q tάP2xsV{NY=[j ê$=UɝUY0qXqַ\%z@ TH>FʴJ턷ImvS))N Wr|R_̈J1\0}_Ggvhn.ˋz&nMB-kIQ# ITXj+$rRd~˜=S,RQn3_k(Au]es04qj%xbMS1c4|>E[tjEu\ s!A,]N.)BiV)<9i.Rr=dfy0Zr{p2ǡNeyuBRZR%KH)mLd1[ᚍMKc!Dz}ҠF ^BФ.HPIGgVP%Bс. PSV~$2zRKP*G k-KͭI) INGW浟ZYc5uǺAid`*ri~"0A"QZuZ2HWn;ui755ucju0mkRpj9*6I>W浟ZV DqU~DK6 ғRQҕ)S#KR A;5xB=dz7ع)ZVI9 Mdۭ?"6r%m2֜=%fhɭF9SܶlOժ7|qj9LWW6]l*@f4c)$EN$(1 <{{T+ժ &vܨ2Q֗CALド.9zReW-a882N3 Ȕ\H. Y1;F HPFk%QOG[6`/h5YvK|)07}VNPHS">UGjFHlkE_`:=T_`:=U+Xɛޗ\jD:E.-j!-'I9q$ ftEɰ}tEɰ}Xwo[\b;,6PÉoJJpeEJ_(@UjD6c47m&PZZR!='Ԃ&tz&tz/mlݶ[#AK2n*RYE*rݠF촹Dx>%D ~ h DZDZ-n皕h,˱m"Hy@S05%C{a+jd06ǛUz&Pi !\APN !FtEɰ}tEɰ};DFzrvy[[9l Lq$B4zAʁ<;k"<{,ЉS+i-)YuiF kՔ P6N6\gd)\E۔[U$SO 88Q!HP(!ZH'1ιv*s0`(̵-!]8.` -~MS-~MUVfͷĞdtGa EbfD(R\RVM9\~Z>wWV*)J rjLwXaԔ8ۉ JF |ٗ. %kzq[|ԤA2WV2;Q cg7"f;=ըjvmc4gO xl+$! fT[RFëu' '9cetMN{ɳwb?qQ. vɗ51B֔Bil4KT2zTH\x(VX[CJ@ V@@}"fӤ^l:X^?ۓ͔WkZF#:'5fWwD"Lvc-$!-)$/+<{×7"fMTZ{ɳw/y6og7Z;g&mF.9.0ZCIJpTsol|/Ta'nU]rUV)JT)JP R)@)JP R6~blߛ"}jTmٿ6DdJ?KK˓:--C1@UDfrkӫWx|:0?4I z3gg ثM5!N=6:qz׌gá8?( rkӫWx|:06ZN^\-;d9k&A?J aC39 קקV4/[t'aZNCzzmzucJχBq~Q9k[Ώ-- SҤ)ĤCc ׅ()"[vs0oz q [0y'f'!N=6:qz׌gá8?( rkӫWx|:0? _ݎݪb20uR #mz64h #A[mLV\3Oժ7|qj"R R()JJRR()JTmٿ6D!~l)ȔliJ{g[Csrm!@8zxcg'FnŽnb[m=d6%g< ϏF/vf DM(TXiG¤ D$9%J]/kDIqW:J-,) R)ȥRmro2l\.EۄUh$8m{`(csn-G'j U9ߴ][.ur @>%)ϴ]h 6}ISJw%Dz:}U_jFy.S JG_4[ܫv9tI\\<*bC7=l-ގU;"[>_v)nl[5u 3[!/ tV{+$v{M @VGEfJqN#PjԈܖyS-%{;b~嫷j-?s[Ri;"[>w%Dz:}U) 4l-ގU;"[>Ҕw6xȍk))a8Q kw~sZHw{LY6۶64h /Jfr~pur\ :FMX/`L͎p츍I @d֝r"8!c )RA=!gU) YhV)MD-CHDd9:`p;=Kt9kkXKxSU?,ת!gvU5Yl=~ѧl=~ѬT2vJ/l=~ѧl=~ѬT22ΣXfG_P 876ӧyM:|'穢,tO)N6zìOMg~zP<ӏ]:z'q?=5 BOD_N=tSkǮ:τ|' +=m}8ӧyM>YPRKy>dQI_F6)H"SpL|/Qs%Rr)@)JP R)@)JP R!~l)QCfSU(Ҕ()JPoYد*uAgb%n'Zx Gq_+5UX%o>y'ϥ=5ڽ!jmwxwj.6v_q-^)`CrmD, % T/rVN^lnn7swoᨺmUϺM25y ?O>64h+|)JAJRR()JJRR()JTmٿ6D M֛ݤ4 Yy-K;jIԕ8&%zV Ekz݆|"Z=uR╧e>Z-wa~]iOVKGl+_@n+;jgNdV Ekz݆|"Z=t&I*̉ghl\J7POVKGl+_@L틗F)/'T>6Sv)h;bQ$ vģzI Ekz݆|"Z=tعxoI?r(ޒCe>Z-wa~]3.^%Ol\J7POVKGl+_@l 2XPtxJ* |ϺM25@e>Z-gn;@?3QU"mM8kJRС Npx,eZJU R)@)JP R)@)JP R)@)JP R)@)JP R)@mayavi-4.5.0/docs/source/mayavi/images/heart.jpg0000644000076500000240000026224212747716313022225 0ustar prabhustaff00000000000000PNG  IHDR*u6fQsBIT|dtEXtSoftwaregnome-screenshot> IDATxwxUlOoj@@^bAE_TTAPEA_EEOP鄎ucɒ^7x̜s3>s(~m– !B!}f!Ӳ*?v~>&z'B!hl;k;= g~m@Wv5WvZuW!BqP ftF3:K0)g2'ވ+; k\٩c!B!.rvRs]K/NF2!ux|{t5@݅Kհe&I"B!D-\sCo}F^mp2Fk|qcґew`qU37bLƞN~LQjB!TiJIٷګi~?*.뒌rxᦺ$;4KUN:z@TUΏ{x!vJ!ŧՄ_?5D!j6t^mryھe;?mGUUi| fo Ή^B\L^rrp82<i>s{>ḑx@[ĿA{h {IRNTW !%JSUNw8]h˥gjsxd*{OVNZ7 u\*vj"v`w\i.zDRV BQ<{oVGqx1CKNÂvևG< C3.\gб#ַ+B\TrF .yrҽŶE-mǒޝ;ƠsR5BUzD[ fr.WbMBB';; c/WĆEɦ}}#~^Yތ5GSMz/;z_,_:0 {ch7DvoG3amWoӧvZBb 4wߜ']DG*m !DM~]9~(&NN音uEU8ØtC1V&ЄۇY/6dۜgΑ^;ٸ8?ːMPT;Q! +B(V]!ĥfб  o.u @"l̚ه9`ٷ+DP֜HGޜ8_nM=_jOodml':qENF6#+V>H-Z8 [`ӆ5!*VtW 罵8Vŭ+km_V\qFTtPi: h.+O=~7m,VopBݳOQGsABΞ:Ɓkhٹ?˾\DnW\1P5=m݅(8]IpjgD]ى7IґmX`_=%6k5R+؝0}b}X+o}Z-zwtΘN4gYX/BqRۚ= ,-_ZEZ\SuefO9^`Gk3_Tے? >VI* VPt$'e_P ~S?(krLЊ !y^6ON$>A#f}7PEq>uL*q}YPz| pmkܘs*0NWr6|4AӑM~E3>y}{j臿EG%E0noNj?"^RߛP亊ɟ. 9 OVǁ2&*ig3cDˌg^ۗ nG]@rѕB׵!6͂ ٷt}睏xC/ʳ^>~ϨY42%9 \6TNlv7My 05B} 4ׯg]iFBBJSG:JS\R8^E<]8/Q) b2?b1G]W/!nB2<*^:Z+EI;'_t+;OZɲk,-Gyڱ^CvFW_}A`>F_GsʽIm3~&:y5uxG6*)X%)ъG[:5!8/Y~EoJCa<:.:N\j*N2mOr!(mɴi@nb Ϗ4+hpm+v2:d׋LK~4Q0Vm5W<*rHݯƍ-Bqn@ۢ(uG:1NBX>8RP jH=YHaHX@{\"ԯ &L*{YI+0Et'6u Q!Kj#G`ΟUlˇBh[K%?KW_& pz҅e)_BQ7VbU iCT0Z!NQ9v+v=粍K-\8KnH[6zRn+rf`VF476KŹӄBQS?j3JTB!kTJsIɲ_NTϸc'*B!BQU*}>+ͦYIB!BQ KWhB!0E2{R.siEjR!B!Iu;l~tRBB!Bje(t!B!J!h)4Q4E!BQU {W#*!B!Q~Uq/B!""N^Ҵe[Z{u/bB!7TʈJVm9?4BSoIt1BjkT. !BTPFT.]ڿ+O)J^}Yf5&t>\@*SNYJR+ǡ*vUlcVEu)!BRC}*n|Ǻc-/#^`W_UVݲF~m52:k,.NYP~/B!U>j /B˸\N^]zMNL|| eWИ|bTՕga/Q# m~0lׁ> dElCe'OGꮴjF}B;wfWFj)?Ç=eCo ^wan1h߹;wcm^^sqJ}--X ]{mLlmI&dI&d MT4tSQes/=ٷ.l637KVhР>w[%*߇[)|zu=?ׯWB!Ww*w^3_V-~r+CcFǟҥS'~1_۶ii6nϱio zX,RRR?i SL^=#33]{ݹxlzy"##iP~}~, ۚu4hǫݯPNƞQ8KhHhn׀7\ܺs޶S B!nr1}Gq;|'Ot:9xZx%O}L|{ҬW_'))$^Cn\ [&dI&d**ǢjnjPw;{F<eWg33 }~Yk'8q$Qڬ<^ g{~Dxx8cG~ͳe֫s7Ik3B;]ٹk7S:oퟒӫ{w7 0p s^Kݽ<1^xy6 4RVqou*nv;Y ؟ >\9[!)w6lBJB5$(J˶WuwC!«_||q<:#*-;oǮ>U}Y},J7o{.} BQ{!(ߧB!. E%_B!GFTB!5!B!jB#wUu?B!6W(DVѕ!VwBQ骻BKOdf!B\$QBx^!Bxc!Qn{ ĥgk/"AܿJ]žJ쐨*˪ B!.KTȞܕ-QʐvI\N&ɊB +ԯK>u֭[ǦMHNNfذa;LFuJcfV9B\^ݻj6m!%gav#sPEQ4 ??0h nVƌY_,<*;wfĉ1Cqr|}}9rIfX~= 6,o.v;7$s+6>u1eOϲh>c:w\b}EQ0 |7&%%9srJ9Bxx8Æ c̙# 4`͚5&JQQQ^-ZOv8s挧? GB̿U}MJ^jv b= ɫrО%G!<${e۶m|Wڵ#G(yfzꅿ?GBBg}Ψb̙L2œWe˖nsTuٲetޝ zsP#)^ڵkXz5aaa|ᇌ3 6X688YfgXz5 >S&..&MZԩSlsq{:u<kr$)t~EuSN$%i$9 AwB!*W9r$&Ll6(3|p{1N:97tPL&ӦMc˖-<;qD͛yx'yBR*,I)5m4^}= 믗TQFh"nfVXQzвeK͛'ɉѣ։$666E)NEP)&b?US.\H^8)A5C^+BL:Q䗄l, cǎ9ӧO^cƌLR0`iii̟?ڷoBCdf>V!C˒%K8w *sC~`ԨQ|EӧK.%>>ɓ':u*]v{7n0i$ϺzcrN'w;,u?+Z4:G5}υ9"tWc !U.\ɓo߾ѣ@^Of͸{\wĉL0LwBTHR}㩧bԨQիIa}YkZjl{dfftRO3gҪU+ڵkG&M:uTzI~eĈ 6},Oύ)͝:G;viss9T!Enb9KQFNB!DI"t!|JJ™ UbBqi)QB!B8!B!jITB!5$*B!BG!B!D#B!ƑD lD@HBRu/D*sTʣӝolrNzz lUV ѥzRy؄`F=TL3)S$~Jm_L&EҸBQ''gvPJZuwPA7RO Wx={tQHNgel;[ņuu/7!jJMTxf͚rC.Յ$j'3FrabVjI2m[FF( qq߻j`2c6P/)(YQP5uh^xݿB{ZAo0F E:m4hWtEHu$T۶EQAWUI\Quz>% h&Й@otAgB3Q&lqēx/G?V{("Z2v(9?N%536yS^}',brYټJÏ1;w{+mQ JRUvw5J~^Vu~æ^˧aú$'pM޾UiJpm^4NV !$BA\b&knwLAӈwn&˳%^SV|xQ yw4MA(hNnuTܡy'thh <'NaԃQ^ǖv9˪-t~?L,z# Bڵ$yg M:FШs8\Sm*} e/2p@*/م;ojIbT533^8ߤϬר`1* {~ēx^x ZCON% \04:,x{k̝ #\..SAtٶxnݺ5u˗Xri>x :/F&@~`rG˞ݞtpqxݎ8\*Vr:EErij~|+:!66ݯQ|so3f)*CoD^O"Y8;7X\vlgz6 )Ydd[iԢ-Mw*۹{wHMuO\ۡ'F$SLztif4סq\HHpϻT4\NzM0t8 P*%^swXڍLVFhduz̡= 337tcnjztbcc$?.}\ov!כes7(MoE/$^Nj3ݍO@V6({d[сBJ6ԫ 6A=0Vd{;kP] \E(vKx?s=>1(ax{S Ij_ci8NTM%3ێj/(M'NBa?|={v⪫e$$$3hP7L&=]GT|L3BJIT4jo@0NUǞ(}0݁f%imLD7`XLjׯPOuduA||֭NmK╕&h*(A`aSnBQj©ǀOzp {>ĉ+CP0v$+W W 3Y$3!ȑx1Qm{C22kyܟ7^hh-Ooזhzj@_ ́-yֿI\WSa}|HٷF =qB@-\ڙas8W >c%WfXAmY={:) ԖK˗jNT4Ujs`=R( ÁQDo7Rn:l6''N$ɤV #4}|hhJDX~>fBwX7zt^:Se @wnP;ԟzTf?_#]{Ef/c ]8EQ:|p8ج^kW\c*oK$G!=-'((C0Mn.0~ < `Pر-? oy[*Dy=QQ]N;:PP].MSs}sE/!6>\9|; ;Q)QrF*w&̉c;,ܬd&9thhyNeCͽ>33tNž)?cO4^|>ޤ#dۭܷ2;;:PxfR4y=Fʧmo7[c0 6քxz-k 9vkIǶQL8}7ċ,IuB -23XI >& &}C 3+yefU_иISZl8#i*LW3~Nbȕi]ױ1_^pU=tTUC`nw_*.}ѽd6T6))$%%c90t&{]seرݺ㪫bܸɼ>{j6T zbfb@q9_Hʹ{Opp88(O] GC4 8WHw䗴nUY ȁ]h9M,sleƫנ0qu|זJ4 vM|o9oX,i`ǎ+w~ V~Cw1(πa9i!YV;̇_o`ҽY+ࢌgAdH΄Lt{zu nETsT>z4hЀ;+ijJXMeeZ$įjwa^]Dt/zf mPp^ՏofU,\кi$r/\hcr?Uᒈj>V~][0G:uDw{V}:Dr'O (w ݻ9v)ILփV?k00+6wgҸ=S&y_0\:Xŷl~w8}?\%#*pPQ]ԍfw&矙B``R+,لD-ǝ9siӞ  =Pݻ'N'#|(V{T%yN { Woȁ]x jS*;ޟOn wc,&YNQF(BzZgw=uD͕au!7?W0G+zuh}7uf[.կRnoq&`~DnmwmSIu|Zq$[ocVHJ1ת|L$Gy~>x/sEУxK<=s{␹yϹ^=l'7nCU>ˇmΈ\rq8( H:D>>|r_5)̜#͓{6&Ѯ gS|j2!x9W_=-u뉣Eo}x.9cS֨\\>':BúAR& $,} |?ʽUQZm,xJ˅hsGƎP9OWd.T&;\{bDO=wjDNLxatN'V[6zM0L$;KRR"&ehWNÆζsQMvcoTt3Ja oQۃ16Y{{z%IDڑ4}B0\y-J͕e .'>}Â6 g0GC%!#W.͛ouwET#;/SZ˓x,m (󸫭Ožoa8_H:}SXs9*GP4Ձݡbsh6޻?W9b˜OTΞvd|||PL8^NCuںi8NhZN~,~}\t wܭ[7Bh"bm6 K/Th0j(+V̙3l۶n^{B!BF^L߳gO>S>6nܘgƍO˖>B@ D@{y`!LE)8RI&jv>qƕkr=rmY?矧QFzjժŰaXj`4mڔ(ϟYrxi֬= -ZDtt4ݛݻwB!Vw*,YH 0DP9-A| !0L-炖Rj׮QQQX"˗ӱcG6mZvVXqXt)})l.]0a۶mjZfİavӧ=ΝΝ;Y~=b0s<7nի9~87x#'N,S}!B!ZnO;Y={v: e M 0XbԾ7i$y<ϟτ Jѣ5kڵ+%KhРǏ'**m2m4RRR&LmnԹZZZ2e ;wd̘1z뭁؝P2o+6 o(AD)A}>,GE` a llFP +$,Zl// GFF pcB G&$0B`0 ~Dra`0 e#yBϽLҶAI[ضs(S&`Lt`0 eqC ^BQ#"OO&'I,K Y-~JB`C`0QkڐۿՎ-^y{1k0aCw8J4$U_Yݦʔ-%xv?Ϲkhkkc޽꺔Ê+x7y' ^9JƏOCCC`02@~hp"*۶us.'x Es3_~v =z#^TVVH$8@AwRH$["<͂ x9쳁‰vZ^zUN}\x\wuDbw`0"=  ds /u<+&g!DכeA(1*[n/\c„ yc!СCR[֮nʟg&OoM$rO>aҤIw޽{wL:oo5o3Ps=ǙgqWKOW׏338^xSvxŔ R`ԃoۚԧBxO_\ -T6s]k*AYAן 22e!T&Ls=yK֭[y饗0`WW^y%= ^֭[G,c̛7|0o͛ -)ԭ kCyQVB25\?\p//fϞMcccPYz5+W W_ͣ>Uٰa#G' ۶=Cヤ9s&˖- |^{-U72|N>-Z)Aw q֭[OӬ=,_zꩁg0EG9IQz`𧐹!#|Dr~Fʊ*+_|qV藏?;a,b˖-L8W^yzN;5k _bKg o2>;vpfMUUx<=^uy9xg\lp xlܸSqFƏG5kS|y`(G7y$60}1_~=jG@t++7|3---L8174h=.n<]&Æ cӦM1"P]JO1}t.\yGMM c ܾwXd SNeڵ.OS.bM7ݔq70.l1o56rd;buuK+e1bP.Pz,Rz . ݻw/96.B_o|,X+G}1cfbҥ5wy˗#>O?e]V{FD"l߾ lsON(WsO=\͛C=DuuuF8#G?)\r Dٳg=3{C141OWKA~WCw)tVZ۶VEٱ#8-UBOB 7n3dƍL6ݻww?hiiaʔ)ܹ1cp뭷ֿK;_x-\Xj㪫bĈ̜9'Yۜ9s&s:wfϞ͏>/xp걺oYgpQUU_]wO<1yd&OQv> --ܒW]uW]uUkϟ_oV7t~9$0PB!+}}e_M/T:m\P5R *F|HC)RpRX9*3(R_J#^ #ze rG3W7tTd߻J#T aq? }\ѐIOݐRsAټJ_!I  F C)NPR!h|?G.@9~_{#:z#T Cgn0qygr;!Y4l]YG% *`0tܗ nH:G &#FJ#T CSGb+I/X BpLPRW9*FF 7S:H;*|B!+ƿz8p1rxa`8(P1|il]Y!Y8" )R7$b0X1 R{(vǠbR)˸##T !!T?Wa_SkļN& c)in\I(hw@A$=w8Q9*bȆ*b!AiEPQ2]Qն4v#\E2yJӢ.?ղ#wP)\$a/T&Ls=y M[bCp pc=)F+Rb@rhii?X{g2 rxl8/Hw|%<]qhT8ʭx~sꕊʆqG !T[DW ͛ 66Q׎3gguׄx۱݀X̿͟,\0}.\Hkk+o&ms׳h"n}7ټy3cŊq ^֭[G,c̛7|0Ug֭K 0իW+=ݻy뭷R ʊ+x뭷ؼy3̙3F/_EOy9sf^GͰRrC ^}n{ezG^G)=%Hh_H'+t(r] i4?I ٷ)̀ We0#F@Xkxᇻ-R3lXG1nIT!ځUvw0ʧ={0hР}ꩧxSŒ%KK:wuu?3gdٲes?3׳aF @cc#'NL 6 /mѢE⋁iyC9\s)l~wg{AŞw'tg뼟HqMTLPQD׫}sj>W|},j;n~y%zYD I>aZC.(ir8ŝ?Ls<=~Wӯ&ʞC?GCl{~G"裏6lo6F:=z4mmmݮ;|,[%KP[[ŋ <ill/TUUg=۵k{lF3{ڵQҒc=h0 AE:*d&^fҕW|.W˕.^Q] U+}RH$s7gO,q+d{zkxz?Fʅ#N#V>W6 >[BжCYy |dC?7`8t't7ݔv]wqmqꩧp饗rwzO]ɓ7ɻ˘1cx|ZyqUW1bfΜO~@ xhhh`ܸqp7iӦ@644”)Sعs'cƌ[oI'DMM ]w]*>={>`) ɒA}'{ecܔң\sz#T ( `?zЯ,ud[V(Y)$T<W* =IZ Z[1+ IDATٔe,ZmF{YܑQ_^n'8JrbrDDŽ} #T ԅz_Us*QizZ RmuDnECrUdZ&KȜMˣYO ,b]Cǔ루[?e2y+//~L %*Pu `ܟB /6.Nr4ZQ""ԑJЅOm}T.V)Jn )յPQ ,bdt7ҝD /aW뇇ᔵnCuzb0 @C Fz.Lwn!.rGY6rg&Vc+L)7ut a\b_N /t+-'5*A5P*b0 ݠr'*I=9b$7^}+EWmW -RƖaa[={)Vzr2z]y lqO)я9-P1a_rC ػwoa0 BL4ܧxμj˰/u'TQݭQ`9Ez1ExukS,%R(lΩ!mr[{}jT1Bk;(FUO$ݶݍ'z*YfbDHX@O KYqE9 )R~eOQσ}SʹEqBTBkZ1U~#k/'\囻տ|%bCaJ99apt!N1Nu<@ՠG9嫟'o1s_3W.!bDPz*S.]<x;&.u z}]]+VgΝx≬YqH$Xp!?8gҤIP]] 3s"})ܯnG9\}|SN~cb}lYKE)[rN]g Ijש $IVoԺo◗!E 3EkD/["*rThڵ)N79*r"'AMM%/Q(dzƝ>_^" xk|ۼy3]9I|»nK/ĀXz5 +Xz͛7S[[˜9shlld7z{bTsDE\$Vޅ3j.H(]Oc/!G6vM#X.rS#مxrq d G^ڳ¿H1 FQI!bTWWξXBaHj"5մ.G}Đ!C2={#p}3glٲԹ׳aF @cc#'N4BpRNݡ^[:T6ut"z8#NA:^G*D t![VR⻤8nej8Vty] ꦨրt$2]G%뜟qVFf#T e*E$RQ!fpYC* FI Q?{ϣƈ#2ڨ"x<:nmme(WCC!L|^Dlv!BBM ꦸ3}V! `ɦ]xuI>^i8e y-~Hmݧl}p{T1BXD5 ۆmOdqQ I*kkowYgYfeG?K_R8s!zm6l6m" rE I>RyB :?A~J&ly}xu->m#y] #RD >""W*^rԭ׫oWzQ`(eP)"7m蠂#@q8f``h6a(ؐL&\eΜ9L4ZM Xz5?RN:$VZ̙3㏙;7s?N88c f͚ҥK5j˗/Gqr A&Ttg2&gkh$ udOϾU þtq$kC'Ӣk&}y, N.=g$% y_?al_~t#R *E68YL/>!DeNQAmO?]_xw '3ȝw 8<ӌ3&U%K2bxgSgΜ9ÁzfJCC---L2;w2fni8)gne γ0W+SmU9U1Pv"3)X"!+Mڤ|ð ϵVQ {rKMdU`GC`J_ " ;f9vXzꩬuN>d6oޜQ6cƌ--ܒq^,~^ee1{lfϞO+p J\H_=Wwijjc!H9*A_ Tru4~U/GJt׊ތϢIѢ?Nϸ|m%:׵_^*„j`(6F CnXS_!g" uw;y !ꦨjC)Ie_OKE!!Qhѻ-UtHOQ,ŊЧ-V)AC3ErSzm^/ U1 F C/rhAyl:L=Fz=QCrR\ua=VI)^L֚QQHIjhur/Gm?PQ/MlrTk8bD0B`0zHܽ7:A~&jNOCkѬ:TxQ ԕCtXT([;} ,-bE%MNW1POPPr"~"֮KPb0 ݤܓɻ(g7T/CNfT7\H@%(P$=jO"(alH$JRD1X] ΌlV~^ 7SM$[N ^B+Kh_}K *$)wP*nO=Yg/.5GERŊ>+PIrA^M ӁPRmqDN=!aXPCdw -:n&ylO RzzVPצWY/aD\0B`0ʜrgFԶ %!3\h/(X'RWQG6L#D *6 RQQRnjvW+x{=z"~M6+K_{\S/ P1 2sF$DU)h555rTZׇs7뗍HW&La+n J))QҢD*~VNp]cYJ[/Bm׬]+TtKx ",W>ӳަ~NS6 Hk0:F C3RzIwb?K!]Ct _BEpٿy()q Aa:mM !d^ q͐+:8C)f\O*1?..M @>|4/|z]+rkjyO^;^Pb0 }Ч&ַhɶ9 R$hѪ娨SbD(*Җ8JwatSdNؘ#CO鶠| ,t~لUŋkHw1"P.b0 =/\^dȗd{7:ljjyeރ{9JE_0qB 66Tk *0"%LΐAː0QQEs"E,eԮHy%!\B/,[ڶ׾ޖڱArW?Obl Nŧ~ŋyرc|_kK_RqyÑN@39DwBku+)r"rJuS*q$Ùsu' N'$Td3ʼn-A|w]X 9(DB9Vt!zԚھz-6%ZC`Jyrً9sd|:`W?ː0Qر_3f`lܸ>{e-[#AEEE^tg_вvf_9WBE:vD:K)#SU"%TbWm R"8* :DD(K(l!R[MX$h4ʇ~G}Gʕ+Sz)sd.䒔PY~=w馛xw2d]tsahѢHҡlhs'g}#Gp=έ_ 65662qD#T E\f#Hx)=K)vҶęKK 5&k0Un>=#5$6ZXa_G +$m[Ik&DOIPQ.R5텐*B Ie1Ox{:E.h&ÿ=PjRD"U];b`l5C@EU%>i!g`y4g?XlK,ŋsѣSuGM[[[x466؈mf|[JaYϿ466osA~OVƏQ&m00@E9;,H6 3Iݯ'0"-Vu6UM$-Rd&*!Mq:B^%/7a>DŽҲ|] tTpZ:*B+RP0fsM,|d7/EMרXKGPRDWG G,b"gmö_g'2(?㇅A؉$5|}ꩧOb6/27x#2d۷ou>p ,Y$C4a:DUU{O… 9󨩩as1Æ c̘1]6l6mbĈy`8(^af|iSSSUK='CT8 ¾"Uض.e=kRJEiǦtC I$vJn& 9"EۆެCT◻"?HQ]G-,0J#T%M6:`9;i\u0 XZM 6$IrWs|۶I$M:szj.,u.ꫯ4h;wdʕ~:'tVb̙|̝{dv(H۷`Af׿u̙êUR9*2kƌ̚5K2j(y/_#vmo&gۓ'O&.cƌH뮻8SK;Sovz!nfǰa8sYn]NKK 3gdٲe1}ټժƯ7#F0sL~򓟤ϙ33alnKkhh)SsNƌíޚ rk.z &Na, BTpTbI,WT ½uTlbt҉ NZt'AR.$$I TܭHBBqSN"3B 2q6dɇ GQ1F yhco-uFS2uT֢QVZŪU<ϟuYuYY{t'y挲3fxůlL<9kMWTTxb/^ܥ-˲={6gOag_@M~5G)Gjb=dXpnP$as]ĉ:WP/9 IqT*Dt¦$]−8 :P0)T:餓0IbX$Fݯ )*IRI\T%i ʫ d) ']Su%({nM ``(yz{*BOepUj}nPw)tK% IDAT.Td|@gJ]]+R+Tv9 ێIb%&(U8VJIâ3%L:]%+RN6l" "$"iE]"#n}Q|rCԶ\u߫,(Xb(P1 ^õ b{ؓ}8Ɲ" A1F"$uuD-8*ruUlwyFwK<"r٬mAԆኔ"T7rp)Bt`" "A*Ql"tvJQ&B`EG. )p3&NuUQEGBPPb0 Г0|r$^MMM-cyh:PU"%$aHpú8;a}Ya9feAI tCwCT'N ܐ)&I%$D*A~8d,OiX8B9|=Jz/^ΆWb+G/La,j^7&PNb0 *~T$!¢ Mq> Y2tN+H09ɤH#TM5zWQ *>K/)`rT *,( I9]o^Я i^$KKΊ>,z 9QmMJ;]JE nI$d93 -2R&.CYBS" J'NfM$@9  Tw*2WW'D_׻u-VJoXW0n\0B`0 Dw=sJYd+MhC&\#15HVS2\JBCT5S<>k|lgPB%Ol%L$EmhbKW2$1:pB,9wY<-TJ1;-8 9瀮u!lS{ᑞTHL2}Q _8*F C/+ԩ6/PKI!J$!%IB"ϦԜ n_ҼuNTb(P1 SN)u ܞ}jjj и'Fs}E i1:#"(PI`HQbTzZt+XNlqWlE,e,;I*r"JP9H%a:HrlQ億tTIQtYt7%}*$k?'Do^`rT P/P1 SJ}(oAR>T(ź}get+?kn *P6O 7)@WB n½8*tQl:RQS%$5_E'&Us^EKŸ)rC ػwo DOÿbƻ;Wwu jHWVvIRKwy M˩EZ$=W*>79:AU ^$cxpDtT,l B)Geq,BXYZ2JjdH,wȐ&\KG_^*~3qBE'zljA_H0BPRDĵ{#' s`_n~R=xwqa(J%G /+wa[AE^BNQ/_zD/ +B]"$C(SY0)Pcg:;[Kd PDWA"iSX'ttIp?R3dtOpDJ G9D(3eupjH4y9Gl9u+LBz|1.X|N t,x{_ݼcd87^g0*FN9gO$Qю}T zSyB887Pv{eӦMҿN;4o||DJ]]zZ=\-[a0Q,h3 HTv_%o&sKNQc k~U0h&RiA'P,el`'40^0tqH$"#cJHfL*6d]BqKHPqB9)R O~9FDGʔbE po[]`^y(~REEu__r? t ؔRD{}bNx=:d<;΃qĀ'2DDT=v쵬rpWs1bǯ~+xB%_ikk;d٬_` Jw=#c3f.opjߺ#oSQ~lQpiڷ7 kr?[UpPgI8[Ci!)q"mel;!TEcv߫2;ȣ*PBbE. O8$#_"l%{=ݽoGX"F\]'% JZTro $rq1Gy.?j7m0BPRD"BN/ҏ=w TG,u9hop=ql{韸Se:-ZĚ5khmmeϞ=_|

D#~uR}AusH%rKUm΢Se!XI(ڱt,PuS\.s PT.G_^" xk|۴ij{l޼3\{aݼ[ض_-pWpn:b/f޼y<:[n套^b^^yVX[o͛eΜ9466|@i0Rif* [/ued7O?jRʷ~r‚'%^/=/A]/n~8&9 MҎDt>,$C>ڥ)tJW1Q" 3ýh&[~* 3UqE%aE ĉ$Ĉ#!sBH*SRqSD_^]tlpGT#^abzy7)psCbJq"Fuue}_ %&RSM{¬}G)B擨y(-)?jkɒ%quw9=ϿZ:\-2|N>:w_3gdٲesׯgÆ 9F&Nh)qpgg?7 TF]v M21Pvt75 fu1 %x; n>NqNJhz/;aA2#*5'ĉ jtKݔ Gd~ ɜiFmS;ł'_ JyX!lbtbI !B`Ʀµ,\K%UqR.E+,H1 FHUWGN9g PQUId@5OZ{l6F*D,Ç׮]8cSǣGRGWSS9믿Ncc#o6:0jߪ_2~Ꮩ+7*B^Eח>_P+#cg/H/<(jH_R)ӧѭAe?O$`(7M\695XzIMUdhf;"!|D "^DKG@"b"y*:\O|@ >ɱQ\k%T"NBrܔP+)Tİ9D;6q$I8"A'5T_VU!_?9ۑM-W?P0uQ(21BXD5 ۆmOdqQ I*kko/'|2#G; :۷sq}.u6}t.\yGMM c ܗaÆiӦ e0LQ\{P(3lKQE*ݐ*xg;|t[~.JƱ{ u_oG)+L!s1`^~N҉IGؙk! B`e6Iv[5#O;J@ve2 Oˇq*=ТmPd5VΝWU:;;+8ꨣ ´iӘ7oV¶m 65DQ"۷ogy]?c f͚ҥK5j˗/Gv r$W(9L)H ږQvTgm_!aY0IR {~S+1Pu%/UMIޣПBlW+UBAJ]BG(P9:tsPItAb>pEjHJU 6xF;w?UROP*[<#mpx7#-ζ}}/o~3O{Ӹٶmg}6g6t^Wqs377ǥ^_gkxի^_Ge]6R[.rjgpwp)pW-AA3 -jz)mq}U_$ֲY}WZ^[jfKD#}m;,.0Dnܓxxg_grg@\iaNBƣOo~GoKkMXC҄|deth!FDM٥ #Eᰘ!e?wø)QqNXsv@FAA*,aTqyqq5=ek6\{\{}ׅ^ȅA} _8t[(++[gPVӸG~̸ |ٰbCZi2ҹ*Xu2fGJVE~YF|˭p];!rHj0-2cz|~< <0G<ׁ3mQ@d!B|Ii`iq6- TVtt)TCLؗT-,R)8 eo^s|fjz)JPPP:k3'#|_/6d+VߘlYǗ_!W'^`A?B*g$1aSBϳgLW{) A!B{6Hb3_9 QځYn\#(CI&mߥD*J*d0Q_rGb;W~sԴP"8@X)mb@0rRLE`ˢ'p6x>; T*!R.8 |훡7^ SD*>BJqNz`:nHt.GSԺ'>u@X8ݕm(xNG|pb/wd2i\|l9- b*UK H2D.~A.VSǫwurB5xKT<[iPGOû0P$u Q 8H AW_X/=VS00z\:,^ਬ'VTśپ޺_,zYWwJB*Upu.}`n8'I'(8bѴ-gd-b+:F=C2om7zO=V>Yw߉ǚ68Q`fzed:+ TN9>?ZCG<+u~>QK_o~/ KV tS&!"Eu}dᦘdz6p1h$0[zp*lx~腔 )W^yepUV*AAAA[\_'/ ېw; ɱ$S" I-0l:-f Sʭk~3:@<{jvi`}=ƹhgQgEfwN3b1t>~zWH\,؎5NC;Uz_XdKT:zM}m(Nt8 $FzG6TخזH)._&Z;Q?*F6\1@V-A úLWv/{Tޞ!a;|.qJk8*͹/ā6UiZd ~[=@X #.DrWd~w"RxKjJ4&8Dx؃aHr8ѥH %m[eSTc/n}L(5LǪcJ +tIɐddE]Y2"?_lHI1~mhYЯ?|R|pTuZ6"`'b?Ï5\z dubT7:dI=;% &`;G P@qt d̕'2 ~ZhcNsuJ{kv%Ž:Šv z:xcAr+vȗbGϾ^Z]ͳ55q\X/b[Hj$Iд3dn-2Ŵʟy>A/'e ݟ fGqXlh׾6lim,w_uC[AAU甌;kOϾ~-КRzTET.JJC\,:Ts>w^zJg*ꫪuCno*8bE)q])vMhzBwvUbʥ $HHdz"4bFrAs s <׺XV!߃QQd^FUMx1٪xn[w7apzxOlUmPQ'KkD^@v РL ly9Gqo^Rx'sm!uDۥk/ זXl ~~fDGZj`0|uW;* %I[_xl;fTXyPG2=R'do B{'bT6JJ`".FO-[2kݾ-L| e tPD5ceL7w6Z3stwߗy yfvg{8?ss4IҔ -{+z $'}"ᰝ3=u :']Ş_ ӯq߽w|??{f~G?7qO*wqO*z8l >s~;oxGwa>wS M3z?O+.8?ͬy.(#`5NP[@2#RxD;/4(C/ܧqϺ/s{ #N,j5צqy7:ll-T ; qaXr7쨨DTٖg#sƪdֵaUy)}bv<dPк(&9]C2:k`Zq'߸YN@x :G򟘳yx'i'I_߾L5?"O%^S?G7Iy,zZwo~|}!X/}{ObFq?J{^9X/~=>Lϯm-'+I|o}v>37\9xzkj/`yQMڤ@|2nJ&L]mPATjU*_Tl](n2EFmSfvTlHqA'R.JФ+&J9*)mavq)"3MfiͲ)f;KHsu~_\77rc=\~lm->gs)^Ȳ{51s//?tk^t>;5}_f\tO6sWy'oxS1 /z WOi/0oxK>aPh\Cc$.Ag׽sPg '> nX<{T!ì)h wk}Wkj5*.րb EJ )]RQ; R PI,˩5 /v[m1#$u 쨤N4X-_X_uXyY}@ PD5z>/[-rzoo@sɡ=rLi{)ݷzC;** 97]U{\3ߞjH7;>^w!p_/BfF68G J~ޜu Y\W0*^'Xm7;nʁ}0KBJBB.)?H, thWlMC>|>i_t>BQ))]4PQT$ 42{]/*fDGtx#%pکrI-n'Y_ލL3w%C[)'b%OxW3z>N:ng5/~_ygtKN]F?q ?'TS#]*<.~7:o5uĮ_f&聭q$O҈`Um-D*^PpSP-4u=^_Qcqh{xzw92g@%e%ؠXsK@]Ǻ7-Qb*Y:ńJD(w. EQMFdTZSUd;YڱX>(U@enMӎy*Eמ: vL;"z !2SV:.~lO̳8̏3c׶)~t"Gz k,oL5x~׾|V zLq}Q1Krr.hc.|Ønwq}yɇ?g~w{?W׶&7z'2굆v~4{7z/Wyϫ~A릭:W_, #w *(Tl2 s>P9ˀ"mb2b$)6u,…P Y,Q3+g%o)z]\:!iXeIJ)5RtEDn`C;`°⮻2h9fS'J$+&.|E &!ͻňF-is7} Tt_|~g8初<y/)sS_H)yٯ{˟%G_wis|>֋xu_M.8^ ˻u,/soȏڳ/#;z+m{ɳ'玻r x/>nʚW H= Z"[qh0{o9 TJU.8eK ~*'ѦK F"IRTUݺm"N .5peF3nJQ+tӥINؼa86mPdg8xik}q**R"ǞsS=t%Uk!N>OK~g/{9\sJTev">.}9Ui#(2mk3K9oPuTFv/"˹* BQi )UMFi8lY4|uQK$ ̰LF!%&F N~Qݔ1JP$+ bS2>|o%t=k짪FYrKV BӅh rM># P#IGy%4d,!rPI)&4MK)\ql\cĨ/+g&T eE'+P1ZC[F5b dzy@ʘftP٢6HcFׅv9 :_[ZPYQúF9UWt3pFb^e )x@6ET2,Аb_O"sWl}]YՈqX뫅 >=ϾH:%(hR@eK.!nv36Ig?z4S3'DUR<{f6krl3\oYcX(!^@yn$E!Cƅ0+()Tb ńEɆ+I+dD9t*[\%$ d29q@ʸCJVQ-'&(&xB/D)Y? ,?vcpEymꨬSb{zj} ^6+KR2:4&@BSO 6-bA>J,,AmvZ"i2 C:"԰uHUbBhRE1x4 IMŃ۱PiwaŬ3r9 eohIh{*s-ʫZxj;^Qx5$.2SHHh#eP052b7 äORuȨ\%5 vRv`_Q|awٳYT>M)?juį?=[WΘ 8hՄt։=$j\_6n ƫz0~:Gq۷o)_|I. *uvV/bUuM̗5IE )ZH^H_..m8ю2(h]@ei46JE]žNJjGӉ\j»,F ݙt6 iiydl۶m۶|~tW.5bb=_"b`E6>:1]RŰ ,f~DA5Ή;?`?tkԘȂET6HWQuT0rU6 R娘CZF~|?rꩧm6fgglj/pF 11%2DOIᬤ<@ӶH#PHsO{4/RKiUQ@FQ|R蒗}p"k藽 TP :YC{O5'D(?62bkdzUav?}uDhZZ-FEhDH!cYR4$,̍L+HcIh)~%iDLS&4J)D j~PI)]G*줸N0(V-I}{킿 0룄](߯ck۠0=QzSާ=~*_gs;(jQz_w|QjH)`DyT|9R?c] @6 4j|D2 *|#~u]N̺D$$kHZ'e5y'a[#aP% ոC9HӔnKj5,#2("A?:KuP۠bQν5R$yȗqT$)0&#lPN;#efm!_6 eL^+9*I$(JPPPjMK%h +rW &~j$`yYeXZ$)@Ť?DX>gZ^LE-bkt\fTi:Y6HT`h4(XɐH9"ufei3:gB,PɐA(9*C9)P2z]R5rTm&-Y}ݤz{ 0 ,aÿFadžŭ` ̨(Rfz^^(/RJ 2L/ dz_A@Kގbۮ{ OnKeeeFAǴZ-/CĻ~*u]jHjti̕DOԘB쾽&v _)uMPE )[ц,b4^2#Y*AAAACJFְ_8 `NAqOk 2`2NP?TO=yw)>XI2k ؠbjT`>8wtXZZbii|/$uT7IVRR2R *]Ԭ(E]YqQҹAqO*;,(h@%(((h#pmTy5vlA姴ގ0ǖLIX"f~T+.uΩZ~C{XyJn(Bnٿ?vet:_uЮJBIA%eYY_ TSnV)Tܒe1XْcŝovOwgNջ4 tiݒWqQ`2Jm=ĭc jc*^vTw3,uKVlp=J٤lRiPR ) TtHX|[*_*+Q1K -.`@ )"A X$9B8ZXvR_'4.Bh!ukdW~/1K8~_G;+J$+JPPPiQ(_0\EUnz 1$'_T=*TTn׿YTj:W_IMI-P钰g4/!yUa_&*J̪Ԩ1\}F&kӤ@%(((h5iP2lW>w=dv4n(T%U{?CVC%׭%ORO~9 0M)ir}֞Jb$ а KL$Հ/() ]:HRD |b;)R.fS藽 TP m)]_MUǨ[= .{'T:w? ؆fdTvؽ6m (;޻QXreE=,Q1pʱ-wb_BbRL5 dP `nɠz߰WU̍r,VS8ePxo߱~;wݥ7 C ߡ)9h,RC][dE]j HP0_SLURI.F? %r/$(&38渁Rkg,,備W fQQ{jPq5f~qh׭q˥C l?C;(E3't{"iz`dW'i+YRM*G1 -Mo;[݋:U$szf}b{*TBQu; ;\i;~󯌨+A*AAAAkQYMָϭ]:gNbޤv/+V׾:o:-ōҌO-ް/_,Z(`N^JYP /? O,H%H1` RAo6Űcc_A*AAAA =j8uՄzzj[(^xORrTJC]Yk;?}#:).e |Ê (tKΆ99S\!(r}#Sl kR;*|3NI6XKmP 2a\sqQ”8J=>&~g:G}' nA )MRI&a5NJ~_ؕYff+ #8Ì%]lHJp/mBWJT9m6sB 3eC3%A՘~Q٣sbo 탽{ƽ~sAKuŵ )vi ̟{e֤,}!2 Vt@:bBIY/,H}m^ TP :T喬7 4a7V骬&dZЮur]1No}?PqS7 ʐRR`2M)}YYUffр6@%h@%(((hg{ze3\jXfAsJ眬P|rq|b꨸+^Y/_SrQpmݔfCM5KO>U-X MOQMoǗX?,.`%h@%((Twuo]{lAm:bUΊnk׷Jk f_!])DBͬ"+L8)ڤiH1=ad59] !. YIWAJ҅V,mGŁGU*hX.#Pp@ITlγ4ӐQe8Vu  !_.;o] _c"@%(((hsV6]y啼mox*U"ÄIgsQ%i/xA4=BAI&uXL1I PuP̺]A2|䐒E TRT,H)`K)CSLx] 3Hcaӽ6ST!\q 3(ߞeJݥA_GuT"U؝cZm($8I.ws *Nl8P&$K '冸b~@IϺ*++p͔ WR$jEE'KXUy1S%1EpT&]TFqL sQlH8xP~QAes_}ѣ Qcs%%H)}n藩'P XbźoX9', Xik@o?x'p*PIP%E IdR?).>oجQ2JI IZ 8lFNUW]U {Aspא=s<W PpTKMq: RthA'9h8`B&{bJan\SP!eC(2UN;p~)/u )U +ş9½lGↃ]BWVP f'ېPfgg{QV k/7>d,հJ+rOPAI祺o--)P8$"'5NG6L[f\ @A@R4,.r@ R(U$EWjI(X37'uTpS&]Timlm6vW؀⻟j9~ V|a^.؝Ƭab %K G;zȤXyP%Z~]'qNwFHLDXGhG$+3dպ3ˣ@I32XnE)d&GHa%E"trHq?0Q/lYLQ!+h+(JPPP&k .IW &K^jA  }rUr |psO/ 2u B" *mDλ{jءXI- ;îm0=E!vR̺,(J?JA7perSf;WhDRLؗ(AYI1 f4 ZO8pT .ApRuU?׳Ĭ!x x:w^mp_>Kսs]ws8R&f=*﷏e6 7fiZ07 gڮfsߵ ZC (z 9l'(I5*ņUf[N[@G.I0;*JՇ'C>gSUU*)A*AAAA) 7ܐ#Ŧq*:C_ ng2 T_u?V\7 Xjxٷ|VEV3->ӭLcL&Z@윔rRR:s% 7eqEɾp(m3_A@q MH^W }o[md&ITƙrWzĆ<ܽP?b;q稬G Ut9,wܧDC=%ST I1slא2P,sĆ\yQJa]YyKSG3S R1ܳ_<n:KLe ufUcxu;kb 4 5`ү/}KtI#o?/[|(1[՝rTFUU\`veݪ:HOO|jiPil9Un @䠸91IZ ):!R"˰(;(R,1THj@LR|O8_Nʘ%8*A*AAA_6r=iOY L>Gu>\PԁȰᨬU6|Ut[_G)߻|Wp'U{9nj7;4lW2= Q\"=AɬuJ,0(RҴѧ-.k[s H'x4xU"fقQGuSn WƨMM6LFSN+^O~y%F>x;tB|n{Or5Z;n[V azI_~끄.0}rP쐯(`FCJ\PrL< R$,vpCl@qeLRx)j(Rm;$B\Ei^ kB/~nJ+h@%(((hEFìZ޽{ٻwo})Zɯz[_-:N{ zMNj92a|kI^֯80=dU)-mpRu0/S:~*&U`9i .F:$ {z;Qy+fxfiޝon7 R\nXW",#}nLrL _A*AAAA*'c\apZ[9$"mk-^z|7(ܬ9z,h*HE(¿x9?c0}FមM>Pޠ4 o.XJP⬧EnJ|vWouJfծH;{D塇VY" iD+QiӢRLW\&>.,f/,0go4FP :QGnD<"uPq^`]a0-wj@`冘FlHy#^ƹ?zS05)H 񪀐~& LLt[Qauz TJ jrEIpQ}YN 2b;(RD,,hM]l`@0qTU纠bÊy{B!kUyHP z@hGma,09m{qUt7 T*IԽ@t|`'v΅˸k>o*k۬*ɏ*Ik Z-V^tx䢸pb)6tDrlLJ[H #%qLg?.̓Pi s@iPYGob仮 VTU4 4:$PP,SLR,S*='Uݿb_lwD'=Rax}ygr:fUN/5R44"8$mα$'+"!n'0DB!L83#f٠#l'vTz!E4Q2.J'gC5 ͳCo-~mP mQϪhz6Ke˜'ŀ}|Y }4#pqT d)|p9 TSBe`,Ϫ uP\xL|nZ7wU bfRNWA BR<5oR,壨e)dVI0ۃ4Q|M TP whf&'kJo>_V;&o"GEKWU&iFPg*3Š^9iL+Ǻ]?Urr[;?H&ż+fQ%\$v=rۄI٣eE "ex#{NJuipPCK8%XK;$Ѭ< T[<pyP)JPPPЄhLU Yk=o^P[(=V+=V%뎴YakuV2g/@$Au7)`׵rQdyA2aj ,e w;T aEybD~=e0B`;7Ҍ[˸pR|ʰzpey*(h@%(((f c5z%Aשb]%+X0T1r?פX R*K 3S0WW@C*´\NR@J[A1tu\R}E2 yru:KD 2s'\L)-u;K]ѨrK>urpR9AA*AAAA[TJ}.pQY}+iOAwup IDAT ALI_Dt'4L^ tMoa^؀ri*gnPRdHQ JC]H p<|W(6}FNPФ)JPPF[}CL{Xgv9!NG9؀2"a[Qg#ě0_;ʖyIZM AzLO>JGvt,8\6䐶bB]6t⸔ =n)$wT'/E@8C(9)-ʀ@JjAI* ņw}8*G%=^oiп[0 4 4Zl0w8h8l'b*"ӝ@z8Ņ;,>SeO= R©*ܒ. s;/5 3 dܞdTJϥ;ىvQcb'ɛ}IBiz?cS})+ΘkGޗK`Eh8*娸t *"O.-ziSdV>JfM&[C5A:]RD[#A˞=ȅ)A*AAAAvMaZsZQrNYn[+u]?+8e'-X`c=C(#b{|>|o)R{"Ԝ3n>n9@٠\rOڽy&޵MYѠbUSbgtSR@ł%` 祸!_SEWei (U_Qd{ a%J$+JPPPi#ù ) A8p :h8bWюkU&Q^uiuՎb 0&>qqM.Mɯݼ +ī/8sBTe$i9uSb@Ÿ)fį 4ny~Q 7% 1KBqT$@/d5 T"a.Y喸(`\2 a!L4 tj¹i pXEeT6RJ?U9ϣ>פυQ1{]wYQ>Eۮ8'䢴;_akR㌝h"a,/続QɄʠb hAz&'e1ِIպX@_-iZP$)JPPP!g8wSRj5ր"3|"&UOrrW LtZy(0bdn[QEP}v)#ճśQV\'e<=n'2MB.<L Y=JJ97 )M1!6SSSŸ+]P1/X.T{-РIP#iѮ8o_XAǐCʑD1EJhŪ#.Z¿H)N1ZGvߍ73qn-!=H'Om9PhףNJ;/J,`iw(ZYi-tY&cJdL!s*&ЦpU @rS- @;'G"V@=r"㎃-|s{}os|~vCoe>P  }Kq1zdHߵ{\ktl pa$03ÆvC:JQg移4  & PtT:IMj@Xr@Q[}>K4, I=V^^-"%sܑ]HX $4)ܔQMh,I+K"ء[f{5NA*FZKYP8@%(((hBU~TN}0t,ޡկđSK;uQLVG :5s:f郐 e\7ܻ^+tn{'[$\ie?@17JR,g2Ȑ,#X&IJS%25LDJSK *J\P$a.3L#s7I'BR|s`^89!|~#P\& 4aZFÉY-pIp.6kAIdeu.K=%}_l?WrELHzFeC]_*@ɤ z!Cp]n{z.7vh~e,Ә,ܔ\L"EFD01 1]$j'CiLLJOnJTT%.`+}4#_hk}A{BhXF+JPPPЄi=WhWm[;împNL8;*@'p;}99|ueuIZ޶G"sn %͊2= g!*%",Pq]n%e1䰹Wj%xٯ;K1WBY̓-*<Uj$tIJJNJTRb{e*@J{ʌRs (Tnq#((((hZjkx5|mf%!_D/z;f/ v>^rŸU? 'fB|n /l7'I9qݓ 21]U9#fuQxVPuOlHY;d,yk(p{tXe4IW"sGFJIB'Ǖ"^H1y(bfE rAmU)q~[c_( %h=%oEmd8j-C6DNX5W z%=G:KN*@*M0yP{)Tz°|^e.HL1Wh]:q QSS)TbTHoV24IrTHHt-XIb;*{bD~פ ZԷXm-9g49%h3@%(((h jqǝ^Xz1 6,ne 'icOX r\h^53mH|ēŠ=qQvs{|sO\).w*@1o2j5 jPH7l+ H,RILn)5Vc9)zb_qù Pu< 'P5 X%h 4Ald8׸xVe03BL_@$0Tv'}Y*`TvA*ˀY^0&'Ů8$>0q]Jf=+OSdzRxqzНsCPN9VWTh?N) $H!Ĭ0 Ӭ0CjFDܔLOu{/ lH1_v#3)%>@Kj52G;mT8נ_FzzI"23bbY0*>P17R&nGKH/ ;0/yRzl0IvΉNvvh/嬘db\HV\QLplS2Yu-b( <\LZH*ޙGQe[tV aK$]GEg\\F8+B4{P"qDDGDuTD7#J!dA,]U^N;}ϧ[O=TBz+1T A틢9EQRHT$IJ w6D W@%A!5Cc6u#2vw$ERQ`Y08b(-*S6EtΝC ϗק|ڹá".L腍!/).YiSŢ(L+*<3잩pXMa$$)Q /,LT\pqTo:g2$+dXԂp!V [!H'-bC#`&)fa IxmdA֭HI lHT `}QfI)͚5Qӌ0\ʪX|0M7%*&ֵJmNNXEpvO QXLHDIacGd@+)e6ڔW܃o BK(,+"Yn,))N8TXT%sIPVT@XUV$XP$rr^٢>$OaFb"FT̢x%]b Qթ_ i!_~ͲAD-$ҩ/y秭v4LQ\DzIB~{'%j[lcKIaRVk;6rP!v}Q_Qa&'l/U8]{& uܢ"NbNXt1O? PK6٢nSNE=Ң>iap xR JPH1qP")LR$@d_d Ov&f\ D)HZSTt~Y}! @(&F݂$UYaD ƢLƪHP|BSx6Rm0Mz<$?$MyI $$&^Zϰ[&',!F^·YrKO;I7Bڍb9DQ_KJ w;hK,<\,re"[9I*( UbGMx9}<:. kSfOujd4p*0K@?,h)#j}NX_K.. wTa7uFP xM^m~ɊxoEj@R搨A)51U"!11XэXl[$R/nR]6XgB"ߋ w /;h Ǖ>F28# \dDG\^x,ȉKzN`vi p%!`¶ȃ C@`/ԋR1,KIn%EV%j$E;I K")fb&-0y- !FScj@Rj{/HZ 0&8kYv%J"LZ8KD>0A$q^R (SI8gy R|T& V63:7/P^^Nk^\x9ay,l~H]+*l,Vd:g]4na^Z( YXXAԈy6OM%+Q $DW;b$' }b,b#o Hp Q!51jVTo"8nґp*+C9]\F?UENLqƺ, >E[}OIҧ}prMPzqr _R˥Q/y \f_E9^;6Yť$&h!vB"|RKasxI,T>&ٴ/^BxckXRUTxHZ Ýښ.fvEp9!D(buGGX+ #*NUP**<n@t#(|]6#'~J "uuAZ~:֊7q]z}Jr)Eb%dzl6煅v^9,l.qKCV%%?vq\d_;vNQDE>k$,fh?BʢҬU{ۛ 3\?_{FU[Ak!&mSR'8+hUP'%*S,UT*vER/\}a'tSF~u. PJh3a..]BeZ@_[EIPwzĩo@Ī'E Ȗ y17y-?E=kŝOaLTXTuQlyd^,'bɳc(A1HDDT0oHZ"*( Zz.c|~4߲0y JNJ PFMp"=QI 8+P%qqc$RV9cn"%<|=̒EYvX@@C78bc"FRd-3leSĊ6zD3s]XCT>iLVԋ"&?_0 M&.QapL5#FB,*fQ  sZZmIuU8tU (sqQU@R"$.ɊXeYT:d4^ P#7p뉘ɉ}ԨJJ;**EЊOӼE"b⿘-fK1X=7:< |^/&{% Yԛ"$EIoAߌşQJ6ȈQsފ늬U$ Q5BBa?S&:ʸ1>Ny%E$Y EN'+M}4JQ{X=_^%b]nyPƷoIzD og;_׮I4硰q:ghd@YFd#V' 2)aK T.6W 0ĄEwX"<4IQCiRdÏ}0}1(8~j(꒤D6~& I A9b/ۜ<|%<Ƣ SA*8+P_X5r" {}{ UNw)SDU%Eq,J"#dEMt+}/rNg4" 7$ FdJ3퍔_ȱP Hlia+=Q[A¬u`I Kᗨﯬ?4 ˯n "#}0⎱ӽ\,IR`R!ˊO܂¦| [T`?'&/tN}>C'&b厀hӷ '$DT7#ٍhPWa;Y>AH n_*[F`0I~sx^Yx}Ƭ-={m&Iף&Ց~ʉCfpf2; x{/J AabUɉ$ bpWY"11D X`|FW,z1#7LP scFVHJ(RID[frbFT52$uڗ̖慅f0a` iZL8g)O91F#ʊx~*(EKRlQԆ,o"U1"PiaQ!`jCN|kq($)4/UPeyAa1Z/-W +[g&)x%` ARp7'{tsOxDL|aJ~ʗV_N aqׂ@fQ66XM436HT~Z  1(o+"l%F8.f!3ѽq8. Q!Sc:* ݘ%j$!NXwJdEX ZE; Ąk{lH`L8&|m'F5W("FLX>8?r+הE&KY#O#@^>Ł:? 130TxeGTN1H 7A$“@z%i HT œښUӼ5AIRVEYUDPyRbeؤ IDATUȥ&ӋӷwDpTBb0K,F¦rI1ɏA*Hv$CXbL c3I`S l'^:`,= `_Ef\_|''T'%A95a0A& \@e^NbLRB".?d$bb$)w!1r_p#FQ '¨7\J~pݎ> "Q5і;f!2 xQY8^#qE. I  ^}Dկ{$#*$+Li!|㿨X  u" X%j:"3{](ϞcbT'*H0Ya5DY݃|IRJ$G)K&8b¿;R7Wx&{hDNd@r^@JT!idYtY&,Et#`q$BW#Orrm}E/̢*b6i1b AESUih?QY7ͺpW‰uIV"TYM%1AK `Q#'V+=1.ǔ[1h 5پZŸضRQrH84XKZO:WϻplHPR]v412>­&|6V0:"FȊHTx1ᧀ 6s}EJ\"voAD#-$([THRi-d j`DM|%[? HUMZS01I*3\ɉ d×Iȥrng5`.&|l2^IKl n-Iz9=)08Hݎ Ep v;R|JaFXb^XIhs[Uvq /,N7ӿd5/)bΊYX??h|4h;/kèOs5o5<(?%xucTj/Db| u'SI[S"'qVw շ`ո,cU쯽ʌw}L`\.i\~L돘Ȳ $G|4J/EXRb#PK6',LDH"{Y]5L',(SVdlʖU1eŸE.uv,*f]#H P2HY\2D4G9j{J>9v;rB-aQ$ {nHZ,㪫?qM?Xm׆D퓴p_+/ĜkN2o8YA *-^~N {mK.+q. [^dezĵ'Q4lPlii)J/hԨi GڵkYYYXd cϟ /xȄĴiӐϣ_~xP~}@ee%&M+Wp`ڴix駵H{6뫯裏bڵ_>~iY_^H b…8v\j9 Ry,b͚rӨmLN%NJYPVnSi(+*Ѩ^G^U3Ĉ Mv8^9h v; 4E#AXh x,f$HJDya*X#qLRx9k0|ߦh_"H6IZ&*sN[K.شiJJJ0pPd߾} /`͚5f[oaԩ7n E?}ƌ3f RRRХK{Xl&Mkٲe:tN^6m?Ce >xc6oތ]vchkΜ9ؾ};v؁|8rrrj*x=ٺu+&M;w… K:u*&M,l6<3HJJ+W]u֯_,;ҥ Zl߅hӦM6(,,Ӻuk'Ou1\qm8qBw@ɓ'u} \܋$zCMNJۆGAPsLb!}`*]kɽ-; *mWpϞrb1_@wK(FhJ Ujũ /fϋ <! D_0 QR̎ VDfvHX>JPE%>>O=x̚5Kh:N/ijRݎM @XTV sr\P񙔈/̋ {pSERi(^QFaɒ%hժ~g̞=WDF|-GMJMM޽{N}ݧUe;ִ-s/"uᗻH#<6:Y)pGT*(ٟLdXy^Pj\3SlP,,v$#LjMby-ZQ$śc4 7I%1K7QX@4'GQפ >c{мysL0k֬cvرxGݧٳg'Ԣ ¬Ytt W_}5Ο?AaƌmM<ݻ7?;bڴi~͆'SNeھ &M}?sL<#hժׯ &࣏>2l| Ÿ*;?pwG4JsMd,fH W,DWjUTJPV ㅅE%*NT\Hv|v޹&(Fi Z߿_Ѻ+WnGl{|vȑ9rd@}LLLD~~113DⴢPw (9 /iji` UH@XXH5 [mW[tS̪ڋb&&උ1b4QC6^Ap_ũ 1)2„ݎTh$EXeuGSC~0q X,^Ѵ/h> HK];{EBQ겜Q sPjܢ` UHp$IqŕDY#/1pe1% Ň3,"E~F D _f4f#Q,k5V ?(%DEM15,؊͑&+65zHTc_ D ӥsPwP 1>O͆v;h5Xh$`1? Q-],Z8bV DD;TD)*;kD㩑 D ~2ppC|EV| }HDX/>鞯GY|Ɋy+%;]ڦ/AD "<4J ,'aaILXX4LX)aDrc1_c"J]pu~A_C/"NqR nanGch$ ˌF*\iҽ+Ik#c}8uMPʉCkAeeQZ\ ;/I4iW^q%2;zH6e Du1rMj P^La>W|G$bJL횤3Dg.dO)t8w(ˀϻ~=IT^TDrBƬ9(5X5XBY40\o&,bҽ w4E\0#,C4khg$*E>;N$ .S, , YvAec'gwN_RrSbNX.wțv E#AXUXŅo_I$ ݛeْb\vy+.9_Bf+B5"䄾jH3k\` uH3¢I [) e", b00pT5@R4"ؿ;sӍ"e8/hՎd%93 5X\",7h+${m(,"%bzqDCܪCڔg?IrdSRRpmᥗ^BӦMQ2Ua&hQY^8tu8{i .HVQ a` uH@XHn11q:Iq mAQdWwQ"* N:~<}V"Mˆau J/i,`` uHpx$[ 5!dD;ߪDTh]uFVI/M6W_oo:t耸8\{صk3Gzz:ܴ}Fee%ƏMaÆX`q3Y4O?5GBBԩSs+Ԯ~;NL2iiiHJJ!Cp9_+ 4n;TM{!==feeeHKKCQQQp;[jEFп|A?}Cŝwމ>9~w 4F}fصk PXXӧ}߳gzD`Μ9їKyHNNƄ sNm_~~c޼y՚bI&"*7x.RVV~)))HIIQPVV2BӦM$,Z-ZŢX~ǸL,_eĈx7[n֭[moFWL쫯ߗ_~\n111hڴ)M6ixcJRv|@SrQ(PjieJ-,GiRHTOaa MbϼTwsT7nNJJ2pkݺɓ'}ĉhӦM 4ފW_}[bҤIعs'.\,QFk;+ЯTU IDAT9yL6 Ǐ!2l(Ӧ/.\{bb"N8"lٲZՊرcebĉ\VVV+٣Ü9s鵯;^Kw}xo!--  fCÆ >|@OpTbC? ȀG}qL)>ܸA<  '"K rJKl',j +)5V$@R%Ep X3jӚ֧~UǣH5tP>|8FGǸq KMM޽{ܷK.!!! (((ȯţ>QF~]0dȐ*q> uѦ6mڠPw(PUEFF駟kA۶mԞȈ#b TTTӸ馛PZZrX#FDnfԫW$!99YbW{/55sݻqE|'p- O9 PQv eQ^vϟgp\8;.Ξ~S SB1+Pµ_Q]l6h5XAIn_d:KReM6KT՘QWp_Q֭jdffqƘ1cl6\yԩڴi-[7a\wuUn#99={D׮]ɓѭ[7III:tjTлwo[1(((8p@T_mŋm^ذa /,"\s %oxx۷ZXx1JJJPZZM:ΝO_:tG- LvBVV{#''òe˴h{W;&++K[ԩS3fL@Q(6;u/^ıc裏<}݇~ egTg}=z999Z4z[GXv- t:qL<;w, H#T9~?ѕ(+BPFEM41ᅥ)O4""BO7ڶm 'Iٳvڡ]vY>QW!%%]vE^|+dL40q}:V^+ҥ .\kjxҧF9+AF K,Gv; 7a.uGM=|wETt7oنߋ/]p헸'k}O|f;hTdy>=4,Ǡ[ϣsˋ0QQ~I,kIe{Y x1wge.{zY(9m+ݱq.>L} v}u:kkpA!MM@#0Ig̴7R Xr>x/_Nۑ+VfuՇ8G[1bTG'ƅ_0#M_R&.ؒLXB",=vA *a0sf#e09aYUEu ž BR } 6_v/AB$YV~`5X5XJY4Z 8\?m6nȩ_$(uK;@Qz_?A@͆X1[U$a$M(Bo6Q!2O2 O %ZF S% Q!}NID4c,]vFz##*$z!Q!ž /"9)) !Yўх),K7K%E Qddvqq~h":@FɺCГI } ڮl@mV5X[42dWABݫyO*)BACde,CVDkx܃pQw3/ig j @FVpEB۫ t01GB- j$= L 5XNCƄZ[ aJ RbnNa|֟xnO-)_ )ɞ\jfC2`Xݎ$FPDSw 0'#ͶťPXXcp:|gmߢҁ7uF\4iXkc+^Dž;;ێ8s9N>֬Åq[^x>w6%'***0ǨG~аE45Cz"QihWBBIDdQi]IW+ʠDXf#;*l6_܎~+&N#xص[}ڶmsunw|b_gx%/wƧ ?n߆Ą̞()-w|{lz&vņo6X«A +}  sZhf@S8v{PYSByOȄ"*aQ 7ˎc^m#uBBLԵ5cT-2cT;L<㜫ּU+_Gf<}臹r]̜i6~Q+ڥ'Y!ߣ51pQehWh/kD8Q`#.i|{pZE#k:BLR 11S{;0ksؽ'\x IPDs[<' O^mj٢~ba;{W'46dWe&~+P jO\Ҙ`aE#HAjDD%+D8iS㖛Q^=p#G"3ѣhҤa[iMӰ񽵸tM6ѵuȑj=-5qb<[,r'O86k.JJKQRZ 9׾m=0q49V?Z[%%>cGf-ޭ6;&DZYб j? B н jHϕ(pfC `)p+`DT"J/ E̹h{e';dnxݟֻpCמhcpah{Ęw3OEjJ\ߥzv7n|c!.}C|8' .A}{A9zuf``ar @Ow!,`]D@SB;n;na>>۷X,###o|-m{>k@Ptd//wQ/z7~/"u> DXҘŠFVkx+YQ=$*DHzȋۮDA\7dOTh)V3bV4UWVDu5u"!YqCIDD Z\ ފF#)~oڇD " !YC K;Y%JlZD D Q!Shp!,υ1.v;85$*Aa @W&,M _E% 0z(>zSl 5X$)tpD " YCI Jp)pEepD #н*#{A~o%ڇ*AAvAAv/ ‚k AAQ!"yK@ADA   x(BAADA$#nΞ 3@O  pDIM6}l[깉t PHLQ=ߌXI1>  {Dܟ4SSSƛ u7"O@\|"$$kz)HHn CU  Y9 ܭ ڵmcxLyy9fr@fdO' q`/22;`r8Y63;{ ’^#GѡC{,Y#>c6nt3I^!#E,|gT!k=ڶkۅy{뫯6c\8Pt8HE++󗆺 ~ӬU{ۛ C=/ =YG  5лw?'* 4@=n6XK}~ OaWAe? ,Fcv>_hܨoݵDT mH^m{f4|Z,tbTTVEK3s.^\k8~pޟ~3fLC#~w߉ ?wÚW[_i;{nEXNTCL4oi,8v@ ;j% Y9qh?uoYYhz%AAFt3_)< 귴,{6ono~V')Yh01﹅7ˮF¨'ðop`/Y^_j;%,rs/ 4o жM*K=n^[7\ؘzb 6_H[qO=֙ 2Nn?%U%Фx?4 ˯Y  jxp0?|nҽI E̹h\F= ?Azw .j@=%ۆ?7\O/:)v,RE߾C 9qh?>ӥ̎! "nY޼e~/>mtz_ AQe( G.K <5:-" j    ">!IHMMQTTp;AA/$*AD$,Ce۷xGB%   AMZZ駟wիW9|0222h +D\\Zھ2}~;իEUߏO>GҥKѼys$''c„ عsoժUXx1Ґ%K`ժU~&td\ve?N|w:2e Ґ!Cܹs~Ih"h }A]jBXr와!¦okϟǫcQ ͆gyIII^kԨ:)) C{_XX6mh۴iB?_dgg̙38x vڅoFy_̙۷cǎ(,,Dbb"&M;Î;t+ TIFf?/mnlvSxlL2۶moQsڵ8piiijZ 6md =`ؼy36m Xp!>O>_7o:uꄥKj,\PY1!"IN!C`刋b޽رeeeaرxcƌ!C@9y$Zj}cǎ+mQAO"nWjj xAaNLL ڷoÇO0]w]@+j͞=h׮ڵk ̚5+]aQt:tH{A{߬Y3=zT[x@eEA*'*f+oL)//DŽS?)P^^eo;jV6: _݅o;ּ. W;p (_u 2;\DqIk`+ty,3`Pmǎǵ7tY.՟NjÚuuǯ^&O _lڌ݅V۫^A~i_+Wn#6V8:u*Ν;=~[bb"qY={HLL5:u N 2O?4Q\\>k>QF~]BE"   w 7&ɪ/Ba)l3|S;v,c±ڶيw_ k_mH|WX k;<3ev IDATжmk̜TUoƘ'¼u\F}8ԯq̙5ņ6lky3<5~"&{ '~&. ~Wdee;Ն-?Q3g^zhٲ%*tV'OFnлwo$%%aС0`@]8AD@7ML6W f$''iQشk<8bjZ<}sr`Nxui)L 8u%%hu#%`Μ9?Ӯ;ʓ+Wŋ(,,x[,L2DEEvڥAD~O0_}v}%hٲe(..bOÆk/ns8n߁C?tBFfJO5oUq:xn<ú 6m_~#6ibW^ĦA;D 2 p 7+!gܸq8}4N<~h?AAՊ% ci8n_&qQ#Gиqaca78V{w_m}z#.Ί`vq_}_j;%,c6KJP\RY qH#G1q4RiР~;Ph%I˜'Wcuŋ0zVβcctU},p8yBLOØ1cPTTs'ի~ %-*a8U5y84i]A}I E̹h{e';dn~QᎾtbuL g`:%ۆ?7\;?\RL =n,mwl=23悩hNYii}5pe # 3#8=n뾮<uݷtGzv }$BNf8G:DEk7lSvc*=@#:ԣѭ<=9Lpk FTv'N5k+U=rǧͳGEv*PFJIܛoUk얕oV+9Wi6gIRMK%KinpMJWZ{a |Dy8cғX ٲ+cVGLI$*mm5٥($*+͌DG*!Pfymؑڱ-^eZ>䥪CvITi;Tvs_y+'3 CY2$#2d5;OmAdIN}Œ-9K2ˉK9y 5n8FGe.if՟m^N?$R^OZnVêrbva*W abxW]7_WN<\$ǟW;oXn|sۺeN3zZb DkH 3z鷑;URyuפDI?MN&,$şWHSup3ZZjA&-]PMU֕ 8im iVevO8}'JSBG%Ɵ/omXV͞f͙~E8jR`4e_4bR}@?mv;]ry\g^n&VUg]zG7] C /o9U)xlTQ$IZVVE+:m%*|藳d@J)2]OJ ׉IO=pcwvP5hQ48;^i`X 2/_ٶ9Ub9~uŘa_cHTPH~2gDFO[Pmty/tNfH(IzjH [3Jr*6U5QIڕ =ĹW?O%)>M5Z97 Wаpݱ~6=K[Ei|c۾?I,_ i-ߵ]?|P۶z e5ێizv2]nNGE"P;#5 aR} cH[ cPP``OV*9a xo}||4zkj׾d(mϺ_ -sX+T5[]}Bqd2bU(_$QP͜69q泘3o=o ÐwujF%sc qsR3wܠ9|֬۠-p,99Ekײm׮UKTVl $g6[l[bOA W&-t&5HW۷FO͕_J+*֐`C|YۭgGhP7^m򊙋yUe1w(U?D5[5PDB ;1z/\w,88H lGTļW ~)?i7i^OV6>w~z.읍;vvHWb=-"۵$u|zc': UI&Ofp5_0jݰEwRBeV!*Xa&̸f[J=9ж}~IO=Qf@sU%WqSVуGm-g[,xu*%qo}W[V*]<φ߻|{]zڶ]GV;} V:үS7DQp!QqHTxD!QqHTxD!QqHTx( a:qxø!JkM;sn-HnD%x!#vRvH FODe}6EtG6zs?դquu]- ;"2mG3}t}uzmݼ^YO>⮰x%*3fUg‾9[а+WC߅_]NӠ<]vێ[,=mTzW~5뽺аp[jm$I:r4A}TXx3O%8k龇UASkI_~ݘεu% 5kFZi1tq^]*%*oT ٣֭PÖN6kw_kX=x=vl܏#.N˗S;mju^IR~/h@36F;b7~?iq ڮYmtv]MNNԆ5+~r?~R̜py=pD+rz{Rnr&5ULkwjUsAismǾZըQ]ƨ@7MTƾ@}||4zkj׾qx(11I))gT34T3Mۮ#\KPpP$)zXzƾ1ҡ8%y@%I C!,埆ϝѲK\jmJʕի۟*ur/%WfŶ})u|M&mTV5ح:]qtbz>{ՌYs﯉Thבv%99Ekײm׮UK _֥LFN"d]γȰ^W;nuW;\i._222l۩gK,!U5fmxԉl÷CշOomݼ^޸9ԲEs}6#mݬ 4bi'88H lGtwܖ}8o>k+-=]_|H[׆l+״I}8o222ti|s\zCs>2-ڽg^|B;vff+[Gi(u 2Lla2[.STyX&NVrJSR4v|zt}ةXLD~Zg~ڵڵ/.ע^0[SԨy+u{)WϠ@GAծm=Lo\;S4~oBvmZ;uV~M:]̚R;E;j0+cgEujժjaN SHcM:|ʶ3Bm}c*=@#:&9LpkQĩfzNwAuͳGEaC: Uk얕 ~ɇwu)9*ah%;]GV;} 'ӣwFmsT0$*<C/[`_=n.y80 ǡGKXu$Avܻ7p(ɡ_$*@bXlA2_$!,Yٞ4+I~ꦈ@YE1&IY2ra꿄R@w <CxL!QǻpCimذQiii+&w7ED;B'^VN&Q߷l7ؒt5!Z۷92P1GnEu<[%5zڂQ4t˚5{{]m۴lMk qe"Q9,M'ORJ~lVﭻʬG{>VՐ}n`Deٳ%KNzŁ2L6e"Qyq S[|jsacޛ3Dŭ_'fzVM1=^^^5iHww@_v>٤ʾzކNԅ{:-/2J2qUҮMk=F[)33n}bO}JM2g۟N-C٨dTu&,MX2W ebJ@@ _/CO%II]nU銋ߥ3$\s)u| +hʕol8[ZY$bIJJWWa/G\6^߮9/訕O*PNn%Ú}]uþ@oߪMJ>VvlU`P 2e2Ԡ~=MzkGZ5DGTnXscFA~~JpA[ՐZbU^͡x-Jl VGt1KHHp\^eoU,?&k>e*9CPZDT\|vUa-䥐U" }._]^3 PQ2$#? ;r;Q t6ʜ WT1f{rmޝߩ3gl: RtL&/EDKy~uElQMIܛoUk얕 ~ϳWg:·mc5`0{Tvޥzz[ y+yz{ʬK5ksw@ֳ}]sHa^YvlW\|ZnS vX,y.w!|yW]\s{\ ⅟ԞӉJJr{gγl<5u ECqm&u)M#Zm[J0"P&$jyj\3ar:QVyyГ+x(~9=T\h_0dXڷsNr\v 7YeXxOu<! ê}[u\|:,ϊ\w#gG4Ӂ4kYS%>|l&'K.%*3-wXMR8|+;n(lZziIٳY(F)'uʹٜ;ٔbߥX|NcGT:*_0;9b1{d1N+Ttwp>K+]jҸt)P›֞h{*U QjJo T~zTӫU5| #S=*eRZZb6.v;%d2qDTԩcGk4q EqW %1I۠إ;Q6*_BRhy7݉9(՟t5!Z͚6K/̹}x6)PL&5o- ./N%*2VIDATأgϨJPH?ܝ tCan!a]Yzj%d2jd\ՙq\JTk$u4\W^O_Q?KwVw6瘝)P8L^X9='yй"̡(N|L&L9(L&Y-砘LZ-rqΊӉJPpǪAx#yy9vq!M~͕IPg#VE;mQHժ%UQj<¡?Z-@s:QiڤwjNOYt͕iǏtwP|L&/)"E Fnv-Z5S܎ڱwYE2)jZvs:Q kLaweR:Y'↵ǠuDqhwt8g@^E&*Q1fՍM٤p5zT";tn"|g=b C[F68לLx2fKl)NJOu]Am1=/ݱ(RNאGjm9;۝1(ò/e+ךSigSq!-(RN)?bZ$rOGCNxS+T;P y}$ْD%WH[1@^yjIIENDB`mayavi-4.5.0/docs/source/mayavi/images/m2_big_picture.png0000644000076500000240000001627412747716313024022 0ustar prabhustaff00000000000000PNG  IHDRV pHYs M MέNtEXtSoftwareESP Ghostscript 815.03qIDATxmr:Q {%Y2 !#xϩipڮkm/m4k?3;/SJ<}IFZ \'Dc@,0mێn\[8Z8Ֆ`?uXzjm۶m'H{V2#@@Mulպ;E`Cl+B8 BV|LFL~kٕGe/pcfH1gƳRxV ̜*2쿤Zz"CIM:ݦ]Y:te!0[/5]LYJ˪M{N ÿ4+|m"s.]f$ݜcޚ_Bt,b>?pW@oghs2[:XWN}.$L, ?kuW3-xIYnsӣZ^.8/v[ƙ>x+@K#2'ο> {,l>65^.#?wϫ\ |ѶC+߸pm+v]|oj]|.P8P“kW&P8\y h UxT&M4s[~|ϳ߾d:N {%{|zF6s y!{׿$pծII`I]fY≠{ϣԿѨOIPQ7YʱkOv^kCٻxSї]HQF:w뺶m׭aWxf\"FUef!`837jL=0P@JJJJJJJJJJJJJJJJJun.%^uTB{ލ{wMkMN) :3  (  (  (  (  (  (  (  (  (  (  (  (  P6k5(G%5#%yá\vp4ۻ;O=ws1 \2Ԭ[\FqfM=bwwMLQJ{K;? l@誴1ӹtgc9 NX[%.8ZNxEg]~1?^>f%%EYZr|GTm 5eiS.Y\:ًҳPJק7~]2$pIyWV\@>sǭ`3JJJJJJJJJJJJJJJJJԦzSuW1 L%nZڦQ>hûʫQ8?d?0ζTD>D+#%MӘD$5@@@@@@@@"6zo'l\ P ܨרmL# G8z (\D 'MHL\^[~=݇3#(`x߯W|1wrcZmxY?w3o $ rn B|sR/uthXGs.òp뺶mk13= òGw~}"ԫ9 43 ܨKg,  (  (  (  (  (  (  (  (  (  (  (  (  )d[{T%Z_m_*Mt ??Ύ]aSA @SAv@@S@F$x>cK:[3t3p%xwa޻G(_zCoc3R:l>4*L9wiu= :/K{Yrxm[è5*@wCXb3v.$P9 3qکXsi$$pƥ /f6iFw??ؐҶ R ܣw0 R7?mޢDJ3x >?"K4;s"+.2t3z 9;^Aa63oʕ_Jض9t?]>늆0@hMnC?yV]l@0L%C䓎?p.fW 7e\ZϒipuAM5C=j\X"QZw%6>w,gf -^%}у.@<ἉS 5QH`޹ҮdRḁ,3?]O:V?We/͌W, f.1:vNJTWyABU[X  ؛,QXZ^D K/upg uiuLdZmFCLhrs^~>2d.K_%k:͚iG?e0DfG2dAs$Lﭳ[f=cpCl}+x/BJJJJJJJJJJJJJJJJJJJJJJJJJJJj۫G?$p;? %t]4&W6\MRAJnXQpKq۶*H~~ńP@@@@@@@!ZUFQg(  HO~~$?TI'N>ZaB J`oZ??9 H AI AI AI AI AI AI AI AI AI AI AI  l_J$$ &~gkH`B_}$R3_@= пHQ8 @P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@P@PUk n@ _Ajo׸k*p;uNn5MuҿQAث^n| !%%%%%%%%%%%<ͫlX8J8Y A]AgOL^@k.O0JM4Mu]۶w8I۶(YGSM$$$$$$$Xcog,k~?Dcׇ75C? 4_<-E?V[IENDB`PNG  IHDRV pHYs M MέNtEXtSoftwareESP Ghostscript 815.03q IDATx1 0!cGzg@@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eDY Q@eD}3|C?IENDB`mayavi-4.5.0/docs/source/mayavi/images/mayavi2-48x48.png0000644000076500000240000000540112747716313023263 0ustar prabhustaff00000000000000PNG  IHDR00WsBIT|d pHYsTKtEXtSoftwarewww.inkscape.org< ~IDATh՘ypU?s}K^g6P UPAj8m̨ljiU0).[-E@NZF+ 0@*[ jJBv?}Khv!i39wsν3877{qBOL =jyuc&QoVS쓚H&k@L2Y)uE_6<)1 MUO`Н16O8pD6͚d&S~P>>!>&5ؖͻeA2=IXB<ظp3.{=V>GD ۛ).P Kqt3r?=_MrV@f 8uf1 4ոxfz7vѴ/5*NrqKEYR at?enG3嶁>J ]ަXE-řgX.@TDda%ټ8n qS7,-ẙՠ>h-r3w $tlxkÒB6葁8wR#N6GXΚ2%+ ZwbqKJY>G:>t=}q#/9y䰉nӄW@Ȥq w[)|_{3/8}zsT>6Z[={1 "!Yቘp у͌a_uK-olZ)T ^0aF}xMabCDpT0p( V,jO SMٵ!xE ).Y>˞k}N9 R 1" U V8Nzp} x߳ ע ɓA=:O{"Qÿ/fUaJ ^Qo<~rKn7׾s W1c. `;DSQ2(z\UD_)Xq+>jwi>lݘ{)X1zC|:gF|x%t@P"(}hX[֝f*We̎6 /m,^)eoQk)bv(Yx?z/e0&h.xwwgzGWƍ=/ط\vd.OY-^v{f!01|`iBXkˌ1v`4.Zn;6P(lߞa WXJ'0 Tuu.5N;hIz}s Y<*̟4he"ʊ,zj O/ZGm:b8ຂĈFQF4h/@`*:˦9S}12'zܲ_mklHݭ9ߟAX: ?]SMIbQW-]>~wZ~ a3'޶gU͏>NAQ_g5ӽ- jN+jk=cN{u8O,W38"⪢Kc,=`!J CV4(AM*O&M|M c,!I^2mzHX.ŲNL<tt:Nm:1jj*ż_l]O`-Lt왺YT'谡{<1|h-!M@4W_{x""ExN{#O{8oka0avI'R]:b&Qc ;[S7aڅ -NBDŽM,KQia5f?cG q]m@0N䔑 t wڢk7e ~aGs.tuA)YC@|$oȀjlq1+MPrݴ4oSV>3Б3f>SFZ)*溚E>7k"/|z756Q1mP/z1D/RG宧O ^^X ٟ n# {cÿKϓcVW{TW{d :ꁀ6uW,~hI@C65a`wwn?z_vOb}>\w tLFM4<0w#3a \IENDB`mayavi-4.5.0/docs/source/mayavi/images/mayavi_ui_first.jpg0000644000076500000240000014605012747716313024312 0ustar prabhustaff00000000000000JFIFHHC    #%$""!&+7/&)4)!"0A149;>>>%.DIC;C  ;("(;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9"\  !1AQRSTs"456Uat2qr#3CcBE$7b%&dDV:!1AQRab"q2B4#3rC ?0<.8%uH\2#/l_j.qLK[ƶ9ÜjRbf'שmw-^6ˊ APN!4{x UZ3Z:iCټg^ɸMFu*{l}5b+*zEI2܊IIli3PͯZwu] u1Cͥ֨5dJJ=c#e2o4E:DdzvHԬ"ZɯY5J8yXZEqB3!ߏE>ӄfZ \B^ΞϫԌã̧bZ"XTlb5i4\B6!S%MDD61 dDfxtzHf5+<#6V j񪔔Tj:GwI$̌I숴&[0c[l!H"lC[ǛW_p)XQO(FK͈㬾QmhfXҾi XS mA 6$H `j\] [EiN/i0:^ S\ovxbFj",ϕ7#-4 r;~zJTM$tk t<ߩ4xD4nhDXEEb)ewF+u NJexԄ03<'୧F`ppی\yNӵ{hEW͢j3|S'ʃYv6jlA8KRLң-}~Oe|!)Ѫ2A7Dq[34_#1mEޓMi+my4ʼnFDw;.+R45c=jƟlG<r`X9SaU4J^:\Q 8[2TjėZCұ]Ji%3z _\Ɯ3ӏrʲžUZEbPrMI(ɤzR(:+i--o(!5؊Ť'^c]q]:kDIsD8DEE===11Y،ӆqܲS`تnJjt&ҾB1 U EF+3LTNIIF&Z5̴mG:H88Krֳ5؊ġG7RxvJ74Ng5'"f?+ q B4PbJRFvЭsӠ[pn\k'Piv5ȿЏ}ND6EKQn-{%sQv;yo ZmIW.Z4צb#ݜF8b'?T.SGTcFPbŶ.6ž֑^75(YTZ#%mfFݖ'V5GEIGVR3.sχ,miM&-w"\&s|p|vIGK=,{+_))K $Q$q}c$cMȯ;19/ m~ťbڋ㨴!lxtpv%2d2*q$Β1bf'0Ŷii%AR$ZD=2%3H(4DtiiAͧ2ҘqQ-rpV j- Z^Bm6BVIQ\GFC i3-lGb+)f;-oIIl"Ne-pAkpiF)Tc˛JOD$:om\BҴ0 73!:uIA;ΑRP{Nt'=s|W37yCzTӼ!%t:GHs7yC=s|W>!:uIA;ΑRP{Nt'=s|W37yCzTӼ!%t:GHs7yC=s|W>!:uIA;ΑRP{Nt'=s|W37yCzTӼ!%t:GHs7yC=s|W>!:uIA;ΑRP{Nt'=s|W37yCzTӼ!%t:GHs7yC=s|W>!:uIA;ΑRP{Nt'=s|W37yCzTӼ!%t:GHs7yC=s|W>!:uIA;ΑRP{Nt'=s|W37yCzTӼ!%t:GHs7yC=s|W>!:uIA;ΑRP{NtEe5(bRrzv/}=GԷMHebYuc;^g ux:(=y:CJ~toz(=-u/Sꒃߺw#:HNz(go='R;n(=y:CJ~tƜ)ͶO%kؔfdDzC$-fiq8Z\%%EFGc1%fqv]RP{NtTӼ#\ ^Qz[^m%t:GHuIA;Α8^P\zNvRP{NtTӼ#\ ^P^m%t:GHuIA;Α8^P\zNvRP{NtTӼ#\ ^P^m%t:GHuIA;Α8^P\zNvRP{NtTӼ#\ ^P^m%t:GHuIA;Α8^P\zNvRP{NtTӼ#\ ^P^m%t:GHuIA;Α8^P\zNvRP{NtTӼ#\ ^P^m%t:GHuIA;Α8^P\zNvRP{Nt-j1`}c!W䶄IAh2+&(37yEZpBw!)ESn޴Ww6k3;$8xc&TLFmVISkFRP{Nt*nGf6z(޶k4^ln(=y:CJ~toz(KR;n(=y:CJ~toz(|Cu/Sꒃߺw#:HNz(go='R;n(=y:CJ~toz(|Cu/Sꒃߺw#:HNz(go='R;n(=y:CJ~to1պD'd$TߙNňꒃߺw#:HNSߛo 7߸/^{'S{n(=y:CJ~tK4۔m8:dv4hKdqH?X>#'#zLfV&)4׉HqRqJe{h? Ȫl{065 VmiBzMecֽ;u>\X/N~ZMvZSF^:VIQ2HN[!zi)̼3y\s63%9-FŋA=qI)MD5dD_)Ǜe$\Ki5HԫEPF3$N1k $v2$ n'EfJl]1$ZNbRAy/2PK$$%Ң##"2?\|ڋR($ԝqKܦ8i#'z:mxEnt,(1,ҥFPxFkؖK;cq/ʑ(wGfX${X"N—QSܘmK{ 2:V1\Y!G]Y%V%GM*li(͡U!p]Er-gXj"+U~ }Ꙥ2GQrRd̖-Ǜe$\Ki5Hv+|fD^\GCnn^A{^;| .<)%:[IFXgb/ȁ(uJJ"Z *"=2##rtVdʥSEJH%/dr9T1ʚrÉ}12֔+DXe=>p⟨V[1tߗ*33.DCɧI)(Z; T։-։f}kw,GF#٘ {Skk88ć% 2ֽJCyhYGLK%V;2n8Z Y<*\)k䵱r]v=v>VFO2ʫ7Z-l\]m}\aO4)yLZnԃ.Hd+E9g63z׆Eۀq \.; q3\ap \.; q3\ap \.;3{wB>qon^4t 4ʞt|FOGC)ZA5t|FOG71TJUլDFW+{n[fp*N!O.ZV\{%DR&'m!dWӯ,| Q | Q |rkɪͧA[BR"Y0cAe<ֵv7D3)ĦӣAfA)̡F$^:Q | Q | Q | Q | Q | Q | Q | Q | Q | Q | QMDf[ZMHGCKNec7 Xߛ, ZV*7;+!Ysnϴy=,o37Dr(9c~oB@̣,o37D$o| Q >r(9c~oB@7!_)N*%1Eﱍ!T~ y-JS Vs)/Z4TJ;h1l$LXߛEb,o37D$o| Q >r(9c~oB@7 Xߛ#,o37D$o| Q >r(9c~oB@7 Xߛ#,o37D$o| Q >r(fJLrc/tOfN}br@teO?X>#'#vC32~87nQ9 N@24vir%iY4GyġvI j"J9M)'4*+,[8N{C~^.+'s,UVӶbKўyetdeB}jZvG+ jqbد&mBZmdږ*y=a[g[6 ݚyh=R) 2Le'93Q|[*;I m.́*&2nQII%Xb׶)4$1j*-0􊛋ri .!_ID:3FMBb*cvȋւq>+Ti+ͪWPPڋ* nqtPxSgwtdқJZS$]yD4QScc\Qz@b!"1>~ JwbֱZl־"(Wy}DQXE$f‰)5[:B,se8;G!KH5-3yթ^"-b-:Ү\1vt,)g_fO4]םTZgOgDIJȓ!')g_f!lIz37̱ThR/_ZN'BGKqqv(Ԣs+ ʡ8ͨ*l"iSyR)%%6/`$ő*98E㲬c,S{IW"=r!lIz37̱ThR/_ZNأnl0YpRܥ8f mj34j33f:-"MI3r4G{(ӌD3#ȢSe315yRQ"Bli}}#|1B8r7Y2"2R f5Eg>zgvVi:^pݍJBc#2+\6ɵZ"Q(r\YDFT2dFDg-`e\u%$(Ѳ'Z1rKbBI mb3"؊[( %M$5"#L> w,[49]7=$fZS 0FjAȈg\fJWqM$ZȀA\[3YSDiS]uFKG\ؔDvD⥲32Zj4ƵNʼꓲ̘ٚR$KkIuŭͬ"Im(SÈLKFnm$wIKbxQ^Ōخz5<3&Yʱfs+!dXR;^$U'!|LmqCD AՏa؈zO6vv<Զc7GZ)K+Ԛf)Ċjfq LGqͦ@@>|/m?Fخc'S=8\{ȕ+i/`2 мiϻ'3{wB>yVT2~8d\5Hd^'s@^J JElhN#Lș%65A^fd[Z/}$vQQA͛;XU,r23#{3&&8IIY66"ΨF}\|\|6-򽭦cuc+ĖMP ̎vGrGB>gp>xd1uy&V寊;m38;?ϯ-$ID{EII\Iɐs38;?ϯ5Z.ߜ5 ID2#=18HR3_SX4der<qmgp>xjX"33Yi3ɫGo `c?ϯ }~ͮ(a#R %qFec"4^3ogp>xd1gp>xd5d;)([_gp>x38; gp>x38; gp>x38; gp>x38; gp>x38; gp>x38; gp>x38; gp>x38; gp>x38; gp>x38; gp>x38; gp>x38; gp>xEaK#Z $Fo,^#A'O< V;]u^501)ƒfiTW"3=q?y`-Vfbf8Q30OQ ~BJ~g^hHyXZv"+c8Ssm(3m(Q'i(HO{DjYO-IȌ̱^Qijrr2J;w*h%Îh32-)#1"-iBqrr T!,?aV3nZ#+[W$ZSsm(3m(B}GrCmv3\NӗNQB+krmX+J JQqe>L' &'[w"2#2"yD&-^ +9F҃9F҅D2J;w*h%Îh32-)#1kvJe tX3zG 2+i)Hq&|G>xbaV3nZ#+>q!b k;؈zg5Û,G>x3X[Z!/✣!=qe>L' &'[w"2#2"yFNk3G>x3X[2 ʚ x ̋JHf+6D,GG>x3X[5K;%2&rXm۩%V,ZYf29 VTen(ITº{dc2xbx]ԔSkHVjH6FC+ž'Mands5ϯbVbtHs56nNe|U'vO?X>#'#{l%i\`6Ex= 5l+UIq OY]n2'qApWJLq)IBFK"3+[d=[6)k-ln;#:-UJm%)KAOG E<[5Vd7J4$F5wmz[^Jͻ\Γa 6}-#k%[dpZ֦Q9+- 2=$e8cڬio䓕]}?[G|}-KZ&IM +S^89s??P77iji?# .ֶv#ZCPS)eBv:LI33y6VdW1X|-Rֽc36LU֌fqߐY#v֮bj;l2Ӷ6[$v+iy%_y`َl)Q^"3Q bzF>iJL6R4`dG`JJ lf]iۖJض>'{XJ|(6#c"QmkشvԴ[18;=+VfR?*|X䅺,.)5ec.R% 7yl!l񗰢2ص&ޒƇІi-8!w2#QRV+4Z'.ū<<2\4a1;˒&VM52ڕ lu 1Cr5E5)l4>+Цӥb>euƛOO:lgPߏmHƵr T)R*L~:u㵈a]kcMѾdԦ*LF҆MU2g2*C+ɶ%-2hƓG#f]+MBZTlIC^ˆmUV<Mq#6f>&U#׵װ;9'@"0$H$#0Y[-άYIbظjD4ٚT (̈R[$ZzZ[F+y4hfB$iI+\{k5; }/䕒ᤱ~Q) .}%Omx23;O\zlz:r\Rľ.5Jo-%N,EWJ-G̶4h%qmI$ gb"kjM;4׌3(]/E16R⑔' =iY{Erob+ :r&I]m%GUDvX=GL8dfV$vZvgRi6$S.Lxz+#3JJR^']dDIJZA=՘8q,|ja[lII(3EvPLIuR:#4*%$ztEK\s05IJ lfDn/a^j4̜jjZ^$ԟLgliK65Y㌶m%^1jdqBBoX܌F͋[셴 w_?Hon^4W{*fN};QЀ)Kdq/mĹ k,ȽO紁yw | PP$kkļ[9$\-wrH2-oha2˿@e[ZZ ȵA*|]pE [9$2˿@e[ZZ ȵA*|]pE [9$2˿@e[ZZ ȵA*|]pE [9$2˿@e[ZZ ȵA*|]pE [9$2˿@e[ZZ ȵA*|]pE [9$2˿@e[ZZ ȵA*|]pE [9$2˿@e[ZZ ȵA*|]pE [9$2˿@e[ZZ ȵA*|]pE [9$2˿@e[ZZ ȵA*|]pE [9$2˿@e[ZZ ȵA*|]pE [9$2˿@e[ZZ ȵA*| *KRvI$NUğuɕ62I s~r};O/GCocQz0NM:PɺK\)z]b7Gv][Fn:@\v][Fn:@0eum 7wCeմn(h Q4]VѸp7yD8 v][Fn:@0eum 7wCeմn(h Q4]VѸp7yD8 v][Fn:@0eum 7wC5VS۳p6`zX\w$-RL #˿ V)@0U -3 um 7wCeմn(h Q4]VѸp7yD8 v][Fn:@0eum 7wCeմn(h Q4]VѸp7yD8 v][Fn:@0eum 7wCeմn(h Q4]VѸp7yD8 }II #I;e g7t/sH Iۺ9wFt 6y?ild.{HKdq/mĹ fyE?G7mǣ8O;I]A$ԃ"QCE?G& p~GL[9YV[i F⠿GsIt߯Ɨ3*tSiF1""㔕% 5Ɠɨbazcg\L\qDf퍣cH+'oIz#6iFW.7ҋfS6S/ʚr!m%32Mk=mdj>P#Gјo%$`pwGLмiϻ#?8;#ԁ&on^4t 6y?ild.{HKdq/mĹ fyE?G&t},r$P_sI:#Üj/ Zv4) O[ms*~:WHu.yI!8XfkM5]z`RxӟwtFpwGLмiϻ1@m2~8\5Hd^'s@T>L?0XH"̈IH*A#9ZI|LM=v\m>6-I==#M:WvzuԌY]IGr $"[k_\of vf QG{Is=(ۈBf Q'mɊЦI:qV,r%9[c: R+:TY7RB]N2R%_A PƪCTIiZR6RTJIddd= O|0Ӌ|Ӊ8I%-FdZ Exrb3U%HqIf4!&JJ2dX5JM=0neZ")ZňkVIi=LZTL*Co7ls*,ּRN1IzgfuQ8uLFw36I `[/sgr#<\r'V9wN:+1Qz=UܙkQRCk2R#2-c2X-vmRKxdJ4ℕ,|ƈDGR}$Vb3"؊BCҢS259le(ȯbYخz5p?Pw;''H{| zs~r}ocQz=;O/GC ]b7wcy$*L?0XH0{| zs~r}p?Pw;''H̬=;O/GCocQz0u*s鏟W{q>~:WHLzDx: B& $F4m"־*%$##F@=HKmOG,9ov'Xsr'w#>nsmHO#R=HfN}) 3{wB>/cSHd^'s@?X>#'#{l%i3R)?0CDc 9O)].ß4B쟜i#2q?y`-iG P¡{q>~>]b7^I 0 JB۳3!J,LGc$X.821ףS\spUدTv Gi廖'lbQ|oˍ<Iw= 1h#eo!嘄KWoV $:aE`*ݭj/^) 3{wB>`RxӟwtcЀ)Kdq/mĹ k,ȽO紁}!~"`Ȑ@`.dI~Ϛ~ORvOOX{Mv8<0_ZchaPU?@1VL|t$@*"W=c+/\ekMabTFF*ngk~QwH Iۺ9wDgxz$ ƜܽO?X>#'#{l%i\`6Ex= 5HDOD*Z qm5ME[bLFeR״VxbKPkkBȔ&DzG-S9q1ViĔMGW1mSeҌ0o8+ju9Pfak)G]E]%v#3mad$LLiڵO)Ng.^28Z(=$)^Øiⴕ$F#Vrk^-[Z3\`0>mFFǿdEBlFzN5.nNZWҜ^1 WV] ӱo31&b' N#sZ*Cp%b j?R&L?0XH9;:w_$tþG=_vKװʿ!7gP.6v]*HG}$c/>ܜb-63-%qSCRv DVBd\\EkfI-HA)ȏj|]vȍcNc>.7*xITHS QRhfgB+5ke1\t/'sbs[~C@2e3 Krv:m+obFE:Z57ZT2,*~)!Isڴ}8"5 w f;GL8=aujɹK^SLvzY԰q6_f̵k/!V&k_3~kxݟoq(}5OGEEAnH20LXMҞȩP6"UrQ#2gŒ'*# -Y? OmKjG4Kh8ۻ3FM]]YD.dlzSr^DމRIٲIkA)Ÿ 9 4-Gͷ5"z r)$T8o1[54kw9+c;nNR40ㅖlҕ\`Em]Z<6Β_}+|I%~=G  L*b-LȌ-}:O(k9RStAi#;{w<ҮE:^snf'+,$Ijkg);$kAܶ3 qK8-v1I6)О#6w=% !FyO֚US?/;Hp?Pw;''H{| zs~r}ocQz=;O/GC ]b7wcy$*;xz$ Ɯ3R=HfN}я^Bh,ȽO紁t|FOG"i=K?9>E߸s柨SԻ$fV{'?ţ֡7(|Z=jT:sn9+U?+$P޿8;#ԁ&on^4@7t/sr:E<`6Ex= s2~8\3<"O:>L9 ß4B쟜i"9O)]3+iG Pq?y`- *wc*s鏟_@7t/sH Iۺ9wF?{ t|FOG"sGC*3\ⱏ*J>AwYڃX 5?S7Kg{n4vn4hD%gu>EwYڃX!N6vȍi/>]qylIN"OU.zz^~Sؑvgjcv+[1Zܯ]џ76Ȱ;P|Zܯ]| 9gjav7b_(Es";A,nkrQt+[34u>EwYڃX݊| V+@gi;P| ȱEnW.Ϙӝvgjcv+[1Zܯ]1;A,3"V+@b_(>cNwYڃXgu>EحnW.krQt|ƜȰ;P|Zܯ]| 9gjav7b_(Es";A,nkrQt+[34u>EwYڃX݊| V+@gi;P| ȱEnW.Ϙӝvgjcv+[1Zܯ]1;A,3"V+@b_(>cNwYڃXgu>EحnW.krQt|ƜȰ;P|Zܯ]| 9gjav7b_(Es";A,nkrQt+[34u>EwYڃX݊| V+@gi;P| ȱEnW.Ϙ%1q^7+ٽxӟwtNkrQt VnpuZ}J;xc,s(Kdq/mĹ k,ȽO紁}!~"`Ȑ@`.dI~Ϛ~ORvOOX{Mv81>sGC*ocQsR=jV$0ѥ\jkz\º1]T8yr+$@WN*+axɥj"3$)${}a澖3_N]}8N}Ÿ)N9&ֱ2[kXk7w6et j1th2I9%e^THesBImƯTER%=P:QHB5eiy+M ͕1jKXĩ))LiCfQ2ژe]zқ$j^lW6bGR18$Q}c!wvO=V+dVA25IyLU1)v2̢҇-HdԔII(kS4jK 22AhL"Nx}&= fq3\ 7kBdSV]uƒmaF 6,8G]iy,dGc+fq3\ 7kBR72Ժw̧7L38Ag5!gtO@j];FSUn 3Ժw̧R -ZȲJVeOG %3fq3\Eipfn 3fq3\7kArns8Ag5!ipfn 3fq3\7kArns8Ag5!ipfn 3fq3\7kArns8Ag5!ipfn 3fq3\7kArns8A rX%$DE%dD[B4|iwt t 6ʞt|FOG"B:MuV 4~}^:$y2U+K01.Hc)6]W1i1δn&-t I˜ƦqO2צ4w4~}^௧ѓK}@hq$S]pҒIN1*+Mζm`.M.Z3y1wL\E=u龍'mJ*-q89E1Fz.UOZjRVUόDi;:}4~$H595 )-$ y?>p4dTs+qRb#RJ;pCJ3ZF˸dm\[h^;c{ OF?YZz(s#xL$ƐhLĕG/_]6-B+rnCjy2Dt%%0Q¯Jң8ۑ{i-bar<L1fs0`Ok%)Mmr&գNȕJ֕~DE$ 2)*5MW5bst_EKcTg-k{bL!m.,HI)FDdE֞"eD ϔ z"I(F,^.X+¶*b%Cl6,Է7 (Jn}i):ni-}TTa%,Lc+#_gXFuglr[Oۄͼe(Dk"#ee[c*'r\n+QXykl~ j+qgV2+sUhԥ>uT Ni"/⟄15"ы)*Pۙ Cr#WC&$̰*Yc[Tu!{e-cFTH莫IP/Ofs^1rr-r-r9䙯Jmnc:2BIαi3)jR3iBUfI*-ֽRFҜC%F"6\ K)D˙\\Lr* Rء-Ff%&f{'d ;sAѢqFЁgnh>4'h@m<`6Ex= s2~8\3<"O:>L9 ß4B쟜i"9O)]3+iF'qHeMv81>sGC*J֕~D-+Iyb m,[D-b- @1hhŴC @ŴAb! yb mq{) t^Fmh!~A|iwtaU_ gnh>47ڎSHd^'s@?X>#'#{l%i3R)?0CDc 9O)].ß4B쟜i#2q?b}ZTc8z2i\wH Rqߑ"xrITVWpzADDJL)#`|V0QT+vu='umnpߧT؈~Y ӯq1 6 1. Fc% IK=s;l(4ΑHg'|R0gh_E vK Ţs;sAѾt 6ʞt|FOG")OT)MJ2۱5y$/WWk,(δS/&kfmk[cڶ9yIiM):V1]N2'iK$vGcRkJ\3,HIA08< e#,TGe}o _x1YI$ZokOj-irCGOg6p q|$T [2*l+4)& MZ?Ijm8 ^YBռtFc.NMb9@}Y2t!J5llWKb5ҝMQ,2XYw3<_ KXNiPb'#6T'ts͢'2WeL.XԡRΒz-sGH:l\"!#"*˕M*dQ[I\fAWhl*CR^Lf[umr-퉴g;ՈGi*?"Q٤xmZ>4qSlS 32R)ieڴ+X1?aFjez4xdd!-ɫ~RjHvĭ%q{)3ʹzŢs;sAхW~B9j:eO?X>#'#{l%i\`0uRZOEc)&Nd{ T2n65l7jcs Ȱϫ^EU?T?_5C_ XgՍ/")PW`W3aV70 OW PWa>naycs ȰɄPW`W3aV70 OW PWa>naycs ȰɄPW`W3aV70 OW PWa>naycs ȰɄPW`W3aV70 OW PWa>naycs ȰɄPW`W3aV70 OW PWa>naycs ȰɄPW`W3aV70 OW PWa>naycs ȰɄPW`W3aV70 OW PWa>naycs ȰɄPW`W3aV70 OW PWa>naycs ȰɄPW`W3aV70 OW PWa>naycs ȰɄPW`W3aV70 OW PWa>naycs ȰɄPW`W3aV70 M\t)9;\*s~r}}X,hRlUw4$.4_A*Mv81>sGCdMڭt7v$k>sGB i\wH Rqߑ"xrITEE\LȍIoj#RLQ(akhv9:M3 ֠GUm5nص>SO wX[t8e/3iD1sŢE*!+n>e[#ڶEآWrqE?[WN9M]WRYg"3>nV B[ 5%2SWڶ@x>-/I6#3AJѱay+#H}Q'k[lJ4M 1BQj3{fciNwGm9#lF=quudѧc\QVbVJlNS䵶L I2"#ӰXL6+A#+ٚH{&5ҰbIm%,osvD#t6~͢&#w*<,e+eB91MɔSm-@@v8ji嘉‡ (RH4p2+T[{d/L{m:*~(0e1\mQmk3""+/-XbWCZNp.ZB#YJ=Rah`ZLzkv \Dw7ֵzKg梬`jMU钓q ֜d8=9!U1R5v֥-$zK־ؼ܌_r+hDB nW6\mNHA{aOf)ϩ*ZZ\Y\ԫ w6Xҍ(9?Qq3Sj3,R-LMH-kCԝKr"HC2໔h+OҒSjzT}upiPw##Ս$xE :q33]R#/)rhFRT"'&n2e޶.EĬJK%ַ6̬iIlm#N1=jm'#\m? É6qie4جw(m *.JU~V3N"rddӴWQҭqޯ m]fqݞWM'|R08=W~B9«h!~A|iwto ,ǦWY<,m;$ֵla-V38hvf+N2 _m_'lo7Y%2Q-ʹtS:"/KMfTW8jjZ^&SY!Jzŧ~` DQLg ɀn6kQ뚣1wet jSNZ~Υ/iIEnW.U 7x/6W@4q t:Z⵹_(E*]x:O -qZܯ]|YZn^lwetXǼ}nW.krQt 7x/6W@eiyixS>\V+@b_(VV+2]4qCe+[1Zܯ]+M ͕Zn^l^8ϲEnW.U &sG@&ҵqߑ"xJ֕~Dq$P{:G/e#ΑHqm~-/3ۚ/*ƗwFQЀ*y?imЗEò@OH(ݹG紁䍄h;LnB$I9dMkqnkRٝ_lc2>SӚ|_*1vZ4[/dkZjNLۉ)O<&í؊tZpIcLY!^2P2-d `gO˽n>CzlڜBRj4z1!FY󋎖 ixjH5^I+Zd9ظ=WS*ә\qR]>u9k(j#2-bnRz JlfK)(왙HפBDZnus)rx';)DQWM̋ɐQLQ꛱*1F:d3=wLQJrzq\JD,SgF$hIkIkԪU*r1B|cZ^p1o[uPzKLm7H,VqԥR-JLi4yAQE3Yهh4㒱ҍȵ10A6s2JCh|̐XLȌ˭Yv2-h͉ UN*ZDL[4 ic޷zɪ&aAr*$I1Z֣EڋϮ-dZF=VN4-3_N*f*39+t3wf 5%&fDfE23i^D)u)y~6EԤ,E &fFeb+tZ~7ޕQzJUJlh-PqDEY%]I^!5W$砅@ltoeWj>sGC*ocQsR=jMkJ"D+H)t^F9=#Fc s~r}q?b}ZTc8z J֕~D+ZW'$@QMhV1hRȏӟDL,3)Sl/@*sk*ʡdw#"ɝ7h?1> ;sA{GBlKdq/mĹ k,ȽO紁`" s~r}.dI7(9) F'qHA6+ V;$OI ]+LχNgYמ%&Dv2=k&奞'X^r{d8X!ն#ǿ0 p݁9.(^-qv8 ^au:16NZ/ul~T(sU>DLKhH}V(9 gIBw$]F->BV%Ii i?3=?/Kg/9#A UC]Q5H6k %&DfiQ?Fiu lj̰lqN* )==:hN;p|:""v)5t4N%grVK[InW=%%>NÏSʢԔ:jql[|}]qϰgP|$3מldљ54EVF9,mDs&$[NzL+#cŭm؉EVF>B\[MbdFhR&b[DCĒȔW+G+TǛ)܋k1%/MZ+[äLB 6~Ԝd+7rE,dkbX!7nvm:];"1ʘaٳR1rIDZZrX/"TƑ.BDF?w:ŭC, K5(zT'qF):rSR8G~Wh-{F>Xb;#u`9* u/L>'hu)>(Swsᯯ#݌~s?tx1>c;cigx ^KnփJ̒=o & 0c )o§I&rKfʚQҍ:mm( nN\hC:3^<Ï3<'CVu e#Lh NɻzP:\&31YQ`u/Rn;jMx|/_@zJϓXU>rS433#v?!} NnGc6ƭn;<'&-S)⥳"V\G_R5-s 8+쩼y}.kɮʛǗ٠b湌PشR7h?1> ;sA;GBlKdq/mĹ k,ȽO紁`"5H#dev%8I\+ZmN8BFjRD[&c^jCDլ(Gg@+ZmN8BFjRD[&`ԉQ܍TF[EԆCYhQ(!2[G8lYaRvOO¥쟜i =;Og9#֡7(9)&ҵqߑ"xJ֕~Dq$PG/ i ˞zD6rj5z|'^5|}\uLqռ;]xzьW8*m,ImfCFnE)M7¨,9de-b^[i{#e"Je%IZH]sx@솾i\|b*;&+s+.;5/};RkgpqJdŕ:OM`6Ej萚's&gg~(I;ڑIorBUJ3_#4'h@m<`6Ex= s2~8\3<լPFLE> imyDS.FLm3V!*Ŵ#?A f+3=+}jVܦc>]SR:\J0sru kBY%Y6= JlKg4!aod}iJfFGZƞs}m=}[9yGo4\9q/`gPwB!I=4(XH˜1flq!66*pG { -+&C̍dqmnczo8ofҋ7qd~^"R;kl T'`ÐS:B\=){7`@|TGɉY36;mGFqlvdhſ"\bxh,o02ZB2bN6c/Q~7FPI& Rq}:m3Ҫ4jeYNgPDsUUk\L-DG8=<&.4veMq (cu Rc10edi[*3V# CIƔ:ֳp^2/EksYdƢmjoeCKi(|{뫦au)-F5j3-Rr.p47\nyu,1&WPIxHZuA~Ï?EQΏN2&NQ&&#!*9;io XaeˣcOl!CK)2+hjִ͢;}--:^37X}2J28ʹ E.,08fv"23h?XR۞-#ֱGեw/<`ub0:IwY5ՅF!1N!erec PNaMmǴ1Q}|KI+X?[KFxD}mNC'X1oy6 Rn ܥOchUa xSDq)U_5F 1$D5l^ nb&/ݚZ켧UQSDi,dN﷉G{y3/y5G *]3T$c8z2;Og9#֡V;$O)ZҸȑW76aaOSS)?rMh<[ouRŚ5.3RGIu#۱6m-cGncKv8mËE7lRIk%rq$,x1nX\BJNȿjY;ؙK l$?,m֕kII;i-'EcjvZsJo#z: r{%.WbG#4DeH#EXuXcmHJ$)+Hnų ]/ txI.DotR5b}ۊ_okhc2*-'ԁgnh>44MZO||iwtNЀ*y?ild.{HKdq/mĹ fyX\z(]N E =al"ϐi$I :=bmF}W_jE2ؘױZ-FuEf0U!#2N䕯ogN95\"XTT#FനYiM\̏fcV 00N3/ RTZjWb}& MM*lrxپ%ekǧX! -JVJHDBE>lc i33iϼ}FLF6h3&\ aH~[֥cܶXzD)嫴/13*bHqMM(tLEz, 90޾:"-VkHr56]HŧϾ36Z"[ Q^XֱX1}ko_#dM3SQebK\ҶRq:E uܻF٫N8FkY*.=^ƐFE|d:=r".,Z4&$զ궾f̳iWv8<ʸlUH1Ӎq-ؾM4ˠXģ3==`~iռLLj*}u1MdTfW6 CTaLr ,U- %G.NsML~8@( Q1ȱRH//Q.Ao%|o \a'k֛Mc> *]3T$c8z2;Og9#֡V;$O)ZҸȑ44MZO||iwtNЀ*y?ild.{HKdq/mĹ fyX¥쟜i#1K?9>@{Mv81>sGC*ocQsR=jMkJ"D+H*sM4ڍ2%vɣlk\zO<ΧLif۳H5>]juh)2<2Z+ شR;?1> ;sA;GBlKdq/mĹ k,/S%%ZQ^ixcfU#4q zHB_y_y74q zHB_y_ysG Ǥ,7 774q zHB_y_ysG Ǥ,7 774q zHB_y_ysG Ǥ,7 774q zHB_y_ysG Ǥ,7 774q zHB_y_ysG Ǥ,7 774q zHB_y_ysG Ǥ,7 774q zHB_y_ysG Ǥ,7 774q zHB_y_ysG Ǥ,7 774q zHB_y_ysG Ǥ,7 774q zHB_y_ysG Ǥ,7 774q zHB_y_ysG Ǥ,7 774q!)YXԑ1.Sy۳%=r0齎F'qHf)m)$vo>>o>0Aᘿ >o>>o>0Aᘿ >o>>o>0Aᘿ >o>>o>0Aᘿ >o>>o>0Aᘿ >o>>o>0Aᘿ >o>>o>0Aᘿ >o>>o>0Aᘿ >o>>o>0Aᘿ >o>>o>0Aᘿ >o>>o>0y2 Y-*mH֥6;nFrMsV!f/f/eZ9QY]NeC9,n;"Kڱs0Z9SHZ1"Yecr?i7x~i=x~i=@tO@jtO@#tO@jtO@#tO@jtO@#tO@jtO@#tO@jtO@#tO@jtO@#tO@jtO@#tO@jtO@#tO@jtO@#tO@jtO@#tO@jtO@#tO@jtO@#tO@jtO@#tO@jtO@#tO@jtO@#tO@jtO@#tO@jtO@#tO@jtO@#tO@jtO@#tO@jtO@#tO@jtO@#tO@jtO@#tO@jtO@#tO@jtO@#tO@jtO@#tO@jtO@#tO@jtO@#tO@jtO@#tO@jtO@#tO@jtO@#tO@jtO@#tO@jtO@#tO@jtO@#tO@jtO@#tO@jtO@#tO@jtO@#tO@jtO@#tO@jtO@#tO@jtO@#tO@jtO@#tO@jtO@#tO@jtO@#tO@jtO@#tO@jtO@#tO@jtO@#tO@jtO@#tO@jtO@#tO@jtO@53B*##&Ȍ$PmϰtY4GI}%_+gvn}OPpա*!QL ;m$`mNą4ɑfjs7 HROv[j%$m WfM֣vvعF{fDE!%SKvO@b>RrT5.ߘ?W+D[zi:_u_KvO@b>RrT5.ߘ?W+Cv)n Rݧ ]0~Wꆥ~`N-}=[zKPԺ~`\ إO1KvO@u__;i)nu.ߘ?W+CRrT0'b>-}=~j]0~WRݧOAԺ~`\ KP[zi:_u_KvO@b>RrT5.ߘ?W+Cv)n Rݧ ]0~Wꆥ~`N-}=[zKPԺ~`\ إO1KvO@u__;i)nu.ߘ?W+CRrT0'b>-}=~j]0~WRݧOAԺ~`\ KP[zi:_u_KvO@b>RrT5.ߘ?W+Cv)n Rݧ ]0~Wꆥ~`N-}=[zKPԺ~`\ إO1KvO@u__;i)nu.ߘ?W+CRrT0'b>-}=~j]0~WRݧOAԺ~`\ KP[zi:_u_KvO@b>RrT5.ߘ?W+Cv)n Rݧ ]0~Wꆥ~`N-}=[zKPԺ~`\ إO1KvO@u__;i)nu.ߘ?W+CRrT0'b>-}=~j]0~WRݧOAԺ~`\ KP[zi:_u_KvO@b>RrT5.ߘ?W+Cv)n Rݧ ]0~Wꆥ~`N-}=[zKPԺ~`\ إO1KvO@u__;i)nu.ߘ?W+CRrT0'b>-}=~j]0~WRݧOAԺ~`\ KP[zi:_u_KvO@b>RrT5.ߘ?W+Cv)n Rݧ ]0~Wꆥ~`N-}=[zKPԺ~`\ إO1KvO@u__;i)nu.ߘ?W+CRrT0'b>-}=~j]0~WRݧFDi3?:_u_ДIKZqMդZ$*ods;mayavi-4.5.0/docs/source/mayavi/images/mayavi_ui_second.jpg0000644000076500000240000022053312747716313024435 0ustar prabhustaff00000000000000PNG  IHDR*$X~sBIT|dtEXtSoftwaregnome-screenshot> IDATxw|lM' A(݂ ^ "`ņ" *^"ދJ mydIBxٙs93lg< ZkB!Bx۷)9=nWy5:!B!5ESYI?$,Zk<җ\dTk".KrEW!Bq P ftF3:`/d3&ށ˒5".KRŶX!Bܧ,ݨIM Os|~bHpxIRB!(O1`=m?|j9cz5rq5H0t;%`OVTΨ M ĨzQB!BTUҪq]r[5O媒q\.M\C3TK9Ԍ\ gL=PZjB\}Z< !D4.6ë5\eW8F=2zTR,vTUaKUюƒ]Ն !ĵh.'Gޏ#53XFѻoʸn ica~#e?TMsaO8K߈s9*|ABQEi{Ӆ\jqvHڵ~8ā3Iy.+ -WejpTR,vjj:i.4pS][VX!D\>%O@C܏,]A-m[=ybyL쾟eo?(` eq|] !ĵAU˦rg߽8N?P^2ߺET' C[2S]V6qMB2tyNr摨\Ĺn~,o oO! Náfqqr!5AC?3FsFh߯S{=Jv~wJ^ASq'tl>J˱_:l7.Xz?9Xw+QF}0GPO@s970m&ga̟6S-5(LB*ÀChұ^q݃Q$YB\TMY=*N˽8Ng=-I?p-[wKV5 `fθ:Dլlhg4HUzMB7B\˾ DϻG֏gw,KnpEob#NUժ'읹ѺQ!MB}Fw f>H1{~ []]i AQtYs>Άl={j$FPo11hgÃU.Qɲ^PفM\[@1΀j&}M{%37*R5c]t>5>0lhK :.UY#$@kJ@ŏ!.XMsB! ?u-wsׯ$ v[FL̅\e.g6/a mI8x&z0~t_LV=8>^u#e_Y9!~t`s湌'¾#@v/=ѝ keKS=M+XJA'i* LF8"*BWfP!*+5clNQ@2Nچg_ܳEpSYEo[jtP!]:w#Ӽc/YDXnl䟫\c[6jz~ݹEQp4/N]>|xf=~z=:>A/#Ao Ճ ү߬.ߠ\?E7ʅyqt:D>hVBTUJYz3[ W{38qsMtiw]r!˸ !I8xkEGB|*O]b'4,hWOWS5VZ!Lv"11s*hYCz2| ;80 IM̺(Dt—zl3 gu:bαmo4e&7{#Ptz|/\LYhQjxqC !UDQ y[oݬہ|6N$e\H:~4z睬LT/SD͌n"t AG WBQ #nKt.]3i+.sEkmΡQ|ɻ(" 3ۿ]xLzP? rk9W?mKMj 뼢ϯnΞy3##ӺgE9/ Sr_ډ:uEB>}!(/k=:2\ɷL!9k%ݮhVhRvf[z,(#K~C`FSM)2wã.b9F5jeoԡzvGP6B\t{+Y`tx+Cjyk'gu5g$*`jrRHHpq7!DkDMYG#a$[A[[;3šu7 .&-90DqBі3tezdd]Y;ˏ)c^_Q8k0ǢbX}QCBˇt6'u(BQBAa_9˄Bȼ긧 sĜçGjFFȐ+-#S`2N]6w@!rz HY,[cU%4׼.ㆨ(JoY)O!\Vvz8mD/B!!>jE.<˸\Nޞ.7uIҊ/ѱcŨ+t,#sm6p׷iG~|!gisc'Zp#=F\\\띵^r uԞ^o㞲+gWڝmL%vLێ1sv.7\м߳,N{Һ]GN1Ǻ 2 2\Cny&*V!YghB<-1ͼ-W.[kk~VD6՞gNg;fgouڸ3j֍زF #y퍷 G /"ܣnӭKvM cRS4}nwv >115q5/\dE_7\мsv5Yu?˻m- 2 2PC4m&ۀ'#r/[Z5Ieb+xxdh.2۴3v̿l'S;&Ξgj%ol"0'gϽ;vvԞ:݀ƪk0π{.^kwvgO{Weƴ)"/{m9)v뽔naa!L,m- 2 2PCn~SW5ҥKlE)Vԡ=Ա[n'$mZ̳=~>O}[{c]5;r,K>'yⳏn;Z'^u} ={L;gWuu+*=P:?nM[xW֩y]NbbB!Xy<:=sz|d15K0ç}M:Ō}_u|4y66 b@bbb&Ma곓޽+ӾS<;x\\4s^EDDD2m___֭ˏ?LJwg uFիW۝]a>O8s6А"ϺlsAubؽ0s6gΞtr1&=; nٝ11z t9߶Mzv*'Nti,7o֔js)_Vja60DY/Y?qvmېm֞:0;WLo Wuۀǫsy~QlsA ^koŝw (- 2 2PCnc~ecG?(/]&2?pBAaܘ1텙켗1ϭ=yr39{ xk+y/|3g'θ1~mys.'=Kxx <4~^zg߳w{cYG TSX{w¼?~@㍷ҽk9g&OxٯN0o&.7\м"got/ii ׇxlB!DRwm޶؋6kz6Isx !B2ycO3I%Qi>NT~fPۭՆʫ͕)!P~޻;9v+8vnsjc~dsul!B_ !Dڻ[>B!&s !B!*!B!*QB!BT:y&*'-v!B!QnkZu-ʼ1BcU+ B!Ţ!J'AnB!I"ngwIVBQ<,\ͨ`Q:;i 9V*aDy1\^MB!De\M8 dE\S?ג dE!DT_UB%$*вeK4M6]4J$lUي,q#y X<%&&U`go>j׮;3r8q" 6h4wKe-:ĕtaӎarǛd%) HMgʺvyYo,ɊB!f͚l~BQ+y.n)q}M+ׁ(Ldd$&m~i9OGT k`=}o{s14Gzm޲U{ HIIdE!ʀ!Cp%oƍc;8q".]"&&f͚1ydOٳ}Ϟ=zjժ[744{ d`FAHHVSJvѨQ#V~ҥKر#M6-rVX1cݻwevʸqرc%2/௿ԩSDGG{kƍٶm 4qר.\)1W^ŢleKJFشi3KO$55MN1B/Swm޶؋+G |+SEQ4 ??п رc=󒞞NddWcǎL8#Fp1nV9_u>L~8qI&Mشi/ }{(p="..4I1^IYt>77ndʔ)iQQQ|gtر`0rKbb"oWĉ3h fΜ9Q^=֯_gڵki֬111iӆ/zGhh(^VH R@_M}MJ^%Ʒb=5S@uyg `B#J/--a1ٳ={KB^W3}OL]FŮ]Xt){eȑl߾ݻ(뙟٫r9s&SL$)m޼9-[]|9]t~\E!*IɪgϞz6lڵk ˕O>aرl޼в̙3ڵkIKKcС2.\QFy?w͛7\^V-ρLI s:Ū_AT'I_ &{NeEr46mڰvZ{3Y4YBojb60a#G䩧l6*3tP|IΝ;$%%eR8p &iӦcy"ם8q"`޼y<3\=!*žN_ZӦM7ݽovO=z4-fժUE( ͛7g޼yْN]$rEªI , D {-(Ih;vȏ?[|IKOdE!Q:u*#ł>>>:u*۹>}:o3fd2n߾}INNfжm[o^D&>;3h+._L?0zh|ٓ\.gϞeԩtSfԨQ?h4igޣ>ʸq8qN}1|"¿C4<g\CO!r<*ݺuc\V^KzE!(r… >f^! Qӗ|?~aÆUtsjWO-7%g {ħ_d֝lvYB0TtDFFwߡUJJK!ʟD{NG6mb|ՇkP~rҫTߚrI$ErٓrmƨQx=t:f \.SxkS!(&˗2d0IIu];ٳga޽~s+%W q[O' !ֹsE4i{gdb ,_M'00__9Y!J@9 6N!h߮5~1$''3qD8ž=L!I_twn&@-7b iU9HT&7l&\V͚4}V$'%`0W6gDEfٲ[  !D _hR'UX*A+!*-܉7k3}-cXO~; 6$88Z1h 6o̡Cy8ABBB*BQdlܰdEzTBgEe24iK.,Y_~aÆѽ{w7E!JC!dKDEDGIf޽{ӥK1D!2$^,v!^bgZL_ғm!lJo#wB!BT:!B!*ITB!$*B!BJG!B!D#B!ґDF`HnB Kמryc&((ٌ"-%D_^jIir#08TҬVjuޛK{Jb?h۶-_Ӯ =M3AgB3Q&lqēxe/SǾVc j6g\r4f(7Xl.ĥa)v'A4?Na,4 o=H_y%Nq=F=* :T4):4) :G)QScNTUEJf\èz-vz#)TB4'aaIqs֩vmb0HOOϏ~_>*R#nb]-0uz:W 073*&$^ǻ8ԟf{ҫssqp. Fm&P$]+: .$qP8vvm?]f[lIڵ裒%yqܻMLAghĆVp-4?U>gvTURZm) ( . MSK;С1r {p1 21$QិٳB$>sB2l[:Z4h֚F=sr{|нӥ $%nm׎3#Fdq┄_i:iG:0u(*hV8.t&]*h.шjt:NNlv (PB1ĭM?_dV˞511v#V_/]w{qCMtt$)|`7(p}\oWoBQ#^I2]u&w1V:Pw/UD ԩAVpd-]ϡ?x=KW\Hf /oLNNW7F_~\6/@G@oMŞﮫ=VdDT,vlV{EEl2p8q: ֭7p͛7$66;(`2&wWKדcc*UU$*4/0cTy<jոA&dׁhL>TQT1?oӞɽ{CLL׮:w׎R+ _L&TPӃ >=,_ޚp) S97[Z9KSt`rbW|]HO* GN# z8r3=\ }.ג}5xGa~P%+*y#Ԯ껧OAТ!a_4Oq(ST3th{, ZނLN+b0aGgX=PFL>h.u"1epriXvl^(Z 11t|_:<+0dHox8|tb Qy[;Iޠd$\.C#l&x+m6|CRۣq> E*{OHCkD %U!A>t "OxqHf/^Ldl*@ɾ$Mf3u`rcl/4̲ ſ4Mg 0/lLXE\C].~$<@=Μ$˪z^?#rj|Θ*{&̚p'-IJݟ߾|Uǃ12]UϬ`Ogs`C:Na|:;nu7V+U쒈K[T7rbkX* ٢x_w )z/d|ㇸs&oI<޽}L__,K^N#eꗆ;QT͖́O( 8\'*Kmv횄ٜ9@BB*&S'P)ꡡaL"sߜVBTU^0bw$=Ru\LVq>IswɅ4~rtt; )tFB5" >HNQero"`yzؚm`cph,wg7.kulցAŦ17qEz抗ra;un/v]TRQ8lvVtŦ(m3d ,}{W5Gpn-GBٯY;2ND~|f|DI\4!GϒWsѣiT 4EUSr(hPp88%;CV-NԬç?.?38O+WK"D>-a0q:8vt6=:MS 7ƚD_Nɹ+crj%˛"}MJQjm6Jn^_rj"kO|gh\؆ŴURKGT6>yxVWGիرa63ҩ{M9Cぜ\u|{;N~?6kyAf^x6&=_IϞgyu:2 MWe[h@OI2ۣ%8ssڷ2ï{ؽ ~f>},IB iiRǬB|I & &}0zmM=狿a4$%1Լ|_]g&*,983u^~s%W9\L禣z?? #vzUUq\U&9~I$&`a6[75}?l}ft܆nx'SKBT1^OT4v(So@3iZ74;w Î|!? rF 9%Tr.eZzOy1I׉ȚM=Iђbse:^&nl։(x8Icߡ}#S3<i`N*qk]#tlʗف`o{.6F%霫tӇnk̪P>v3FJD2A ! @giVkP-`S]Kˉ^z ~qbGʴ<%_/JqaOT>uX8zx VUNwr8ܿ ~<:vmp\(h?~8+V毿p/ ˰eI(JMvNrutjl^Ye!'*l6+r9 (:A//cc۰8vώj+!/pF))`2A~w4p8HSU> i+xvr:h(JS2Xq<ШQ#$/VG [Y\:|n[i߲-GP3Wm<~B _a U"iXmNzujF-x&# ˳f& ;y +x?۷SN=5.YyzBM1i|ɞ)yJc71a%F0ߚۚcY߿Y0 èccң _E툚< .\a S DUU`24p9% fVRZ (ѕ3cINNv8*ї|9Ç7%U~{!NS N:EQ8O:tV+ 9a=_8,sUEZݽ*9d4sjxǯO_vg#u%KKUl~uߟ@D|ad;w 4@QRR\LpwsJOZG G_][н]## og?kg*!jZxcs{yu1K&_ULzjTV% >FCpa!$l)9*N"668>33oax}+ 38{$]t!66^yf#ލp2 ԛj`f">>ݎrqPՅKz:v ^+yRz8=TjF0ԩfLZZ: ۯBLnz &`Dvtjs>OyFZSp$S|95"(\ZIJכg{}^7\uiУx0ݣy{␹_;'Yǽ9Ӫr'p9q8(Tbcc-= f&kR$-9pD_JQ0id$z=ftccrN._%!! hfsbR^IH(ڣIrv~+~ЖjMraq|5" D昗rLR*N8wRVg-P"ѣp?ْQv,+GWP@e\(]*2Cm#U)'zQ `c^o:Hm>F5bg;$}='K%UQr0MѥZfUki 5=NVtX[ӼZ'*"!!ӅՒ?gNtbYthd"%0h<|7bsI=LVmPU#6O)j QeMn~:9>;͆'8x2ƓcOH+IJg$"Ԉ&.s/_%Eb1적DUݧリ0PMMYƬmnrͰ; ŬU'Rqx&Qߎ5Z,.E='%U:QATv͡՘Q3|.3Wڷ ,sMs:>QtEuZ8q"zNqMp:T 4i*km8{OG'c3x^#DUTO[::fwwm -TפfUsgʵYٝ=^-;/^L%)NCM)sWIJ/KV֨$OWX2UsTrz1^]ӥiY;2O`S<=♂FuB~w[+Sq'Ʒ O$Aᱰpng̵+)^>פH!Dzuy 稔WVn7B!(k%ٷ)vr]bBT^WMB!DWDENB!BT:!B!*ITB!NQ)AoCkڅUtB!*QB!BT:!B!*ITB!$*B!BJG!B!D#B!)+gO<( ((h eNS2Jjhj4 W_~E5]!5kA+u^sqj_Ga̙l!DJ|ʂMV4/3 Pœ((S^\QB!9g 031zIJ֤%_@M-g"HҁqU+De֭yE.zjuV㓑++WQwҢ((EQ\ 7Vxx8{lΝ$%%qmq|'$$BBBg$O>d:̙3~@.]7n7|se݆YU!ĵM <ɉ%I9MǕy&=l0s,R $-B\u-Q֭W桇/3 ٺuk_U|L + IDATť(* N(t\˺c3x衇o=ztz-od۶mi׮]<s=y=z4Zu뒐-[x뭷*m%}B!f;19ntP$%x5qɖhf{b ;qyYmIZ*ݺu/ࡇb֭8I}W>M > 0({T 2i$>TU6n駟2~"/kÆ <|'&)[la֬Y4h^O4hk֬q8L>ƍ=\.f͢I&DDD0fRSS=CBBXhQQQӣGWB!mMg͢ˬY45, l@? s諃A x19d-Wgr_! ZP) Uy ?-!*&J(VxDxhT>xx!*x i !ɹg̚f5$z̚5k֞}r|kD`RR2Af ,;>Y>{>"hh~`e8<? :83[w?3:&b¸n&fn' 3nL(ZQGnF7qa-}N:¶wK.{勵fvzmӛ3xG0iN&f-̜ Qc<O<_L<7MmqUWtRL 'Pv„ \+WEO>$^{-/榛bz7o͛7sf73z>E"Ht`*TFNxPotBI T=WX4eRtlUUkie:= ظq#===ڷ﷬{Q>=J;}scK{xꁵ񌹬ߺy33_|cꫯOk̈́J~L2|\wuzm]b^:&3f`г3fp3k֬AqD"S(c4 3_dk'/22o=^e6֟eK!;6m=mƟٟ SO=o|#vnEqM7e `ƍZc9&msg|r6mΝ;sg}6K.eݺuu~a,Y8{H$FvU*R*ø.1Jw-F);Ji,Ci($yE硌K*湱-xb 8 8GHt@,;">b<|O1]%vUk}u*W2(Xlk.f̘)_Y|9\r , ">-[W_ͻ.{9;01z3Lz*"HQN??IQ)rQ}sǦsʱ5iq)b1ĮXJʋV}Rhʕ?' HQ*)^ExuW|;V> z#Gc…,\>r//y\p\pCcS$D/ORӇr9hhsRl mr\2\c䝋ġ`ʘLUXPyZϜ%D"(C+ƒHKIR|Hl81 `!]PQdWlT`uLTVDTD"H$9 %I/1iNLR|xƱgِjkEmhJt=4`V]""K D"H ѴJq4r[I rK;!_ȱˢ!F )d|)RaL_,3 D"HtkؐR*\- XB8Va`i]yN禘aEN2x`H$TD"H$:@evRƐH8@%J;Rh*:L *uRNZg|ݪWXqUD}!H$0y!#]=(/$˧,y@ XT20+݋D}"H$ uy(&dx *XJaȗ ^Z奸}B̤VRuuH$+zŃJ8xXAJRx63PbװEn7 /D">WJ7Blפ|‹ )6 k|^R hy-va%HTqrvU|qUDW>gƌ=dQ%ߏ#yhҤI./pꩧ1D"Ѿҳ LS1tPR}Gd;*s榸mbWLwW1'j+DP;g]k׮eҤImkӧOciӓ!ŋٶmP?~ѤIj.K\tEuQL6WU|`͚5&x[%OH$zR8`AIV/]Il`t}facmLKl}ך#yl_2f):g-Z^g $(S* D9`nVL­ /T ,CNu}\_ugSո[x{90~(#4JH$zy*T8x:|LLIń Fҩse &.HP+)}b]d!`&uD65*@bX8묳krYgq 7 Rlʖ-[ٳ7ͫkWӦMcW`y̙33gr駳ukI&quqG0y䶯7f̘=÷m9O… yk R0|f͚Œ%Kؽ{wڟޚΊklZƊ+8Ø7o^{mzRp!>SN//V]lXLD"h*U*ŀt1hH)쾟S&J[@:nVuSXL@Q֔>nPH4j@ܰ2#e9x'yǙ?>+VȴYf ;vh;'_3838oo 6wKJ|A֬YOL_ַō7ٳXr%'x"W\qEf.7|se]ߗ%>яn:MƢEX|9'CgjCy&"H4 *^M (c.e$'%?YDZ| y q|^VV}n}^RNMC7-s`r;&O#'vEc:q$@LxhD5@riXNüW!KƍO檫෿-+W䡇7Fe;9sf渝k4tww;zzyf=Lv.c33o< &rJV\IE<\{,^n}۹?~VEc3DTRa" HJ4%|NJhW XQPLPiR왾lhU6t'XՄQ=ZH4(JPV6nHOOϰu8ז-[>}Zͫۼ¿͆uYg~7ݻw3w1V1c~;fV?vׯ+lb^: R\eYqo<H$jW;*f )~ 'bIL{iWb&DfU䔴Sg H Ŗ}ބ!)LH+$ҠͩY FJ*Gp!e.:;;ٰa˖-+״gҥKYnz~%K'LO<1> szVEclLD"hoi=n^rKr5 י8+A1T 0,X΁++/ὕJ]Lc6{4Td/hhTH("شi36m^gyu]](5w5װb : N;4;rM+-[?w]̞=s9w?O>T/_΂ x9ss^x!?91co{O\}'?aܹog…\U[=H$T\13z#bL\'Md\$ )¾\뜴5H1` Nַǯ!ECKDmHx›; /n{.Xb?5˿K7o}!(wJ>aD!a!a* yK%Gn?сW7~ o>Yg2uwzMmGw9g^jՐ-)ULrRJguZ0әtCČ𮌛K&=6uE!\.EA4O9#".s?4nMnXD 椓MHv= FoHi4D"HUTKPHx~a䢔\+Sы6{P tWdgWq)fSh䬄e&tËqCH$j+TD"H$ת; K'X3}) +N< Rsae(R5t '7Œmx:'\k^tRx.%"D"> )EIL77ܕh7R>xVV-sSoG#覘Ş栢LX aE@JJ H4PD"hZ0ca,nJꨔb JtQZsZYlL)f>LEy/05UBhK$D}>c!nbDno)MJ-&tr1xւvaePa_&Vo5dCN' !1Sh->_脕GVAD"QF⨈D"HRaV.QX8$)IZ(wo/P0Vn¾v)x8u 8P6SL`1"TD"H$K}!L(MQ/{4ԫ7%㸔m5H9*MnP ŵ ^+S7A+&z$m8*"шH@E$DHE좔sJf.Xq۹*I];`ℕV)f1C ,ڽ&*Äߺ3A *䩈D#$H$FXm@JAiJwApZр\; "zkNkQ&`8w3uE8Hmf`1_5iIAEfFD*"H$TGrRlPsP ų%Sr5'ya`~rΕn'p-X%/˵ yNOq1ϸ~vH$TD"H$![*`:qN R"0]+>)Q{%# )"`1 z7Hh 3B}&N$ [2=iӸ@5?%sx'c4i>R_>>Hw5J3h60=b0hR/+Q>`Hv.rYiS ir兂bYk?2EH4\2s_'Nd|/ϝ5 JA;_?P[#D"HkKbH$EI (m@aQ%broR¦bHQ: .WŜDF0 ۀxR=E"Ѱt;*k׮eҤImk׶(]¢saa)ozp|n ^~S> =Dy*OxO<ͫ_jf̘)7?YbEڵkX~=-bٲe.m۶r]wqw~vSW^y%> k֬حu IDAT'+W/R^z%z!nA]?ܱ9Dѧ d!%#9^)+ee:3v]R4y(En+(_e,0.; vRLp1J6tTV;XB}*MI K$^1YXYz _F?6$Ƿ`^w֟1J)O槯uEx>w)S /iӦ1}tV^~!K:ujz?ۙ3gNq=pB?~<\r 3m/2k,zzz8y衇s4vo}}s̞=cDzrJ~oM: Z]?ܱ9Dѥ+ -`\ N4|@WgBZ j0e/wބ<7hu^4d,D*Ѐ}sÂOFE K˯(?zڢy!oध~%ɓپ}{}nʼyye­v̙o~WOo|#?sSO=:I&1{VY϶l!_ڼy3{l:k^g۲e |pz!*"H*ƍ)."n~qx[w<ϣ ~m&oˇ ʹiذaCz~#2ԶZG}4wx'?ҥKs۞uY-<;v駟&?ӧggҌ3x3#5?3<?Ӄ~csDGE>/vVJY1],8q֙7nT,er v( fk^&P1]}KTD"Ѱg3YnE^6<j-$z`|[|ફn^```￟Iۼ=ᢋ.b֭lݺO|u7ZK,VEA&KtuuɆ 29OgŊl۶[rE}gҥKYnz~%KO~۷}ܙVwy"htHR\)qStbGdƠN!c ]Z .B|`,WVgg^27wN~ 7!{/F ӮtsRVYbŠH$]4^G)lޕ xqS\a_3喸AIJlՂmPqiņqs@*eB>!~eN\"J)R£}xɵ5$1+"Ѱ%":5w\99SD"(D^zy8.3w@ "fѷ˛K9e&Ʒ)ߵ1RjAJ*%||"JDc:*^%E("=5DC(ŋH$0^aR2I˾gI8(@qdf2!C;5/E`sdsfrbJQNnJ ->[n%* (S""3~즏EH/*"Ѱ%2%H$~W0xb"Luya_ˢ $[I -֌^eЉZy9+9YrS\ZD8];)tPF~JMBcEx8G%H]tE= P#vRj@DÓʨ־!CѺ%^D(y SCW͆{ Ĉ^Pُ:CLv NG|(7{78mo﹜̵/&z3u pkټ%tw=DzyC#S;l׋D"UT*!R}Ҵ^#qv84(Ngd_ZpQl wJb{{MH<RKK> $y-W@2@@nQ%"N]Q~J xrTZ"j"kH E1z%/?'`Wa|7z01WE~']|,㝄_|Zo5rgڡ0f=o*7rI|p񼸫|`W.!sZ䩦D"h GrT N2 9J7]  EBrsKZ= |7qW0yW5߾Ͽqc:۹쫿e#D!J9q:WNirSTj"75W.}9\p3T$.`G 3þ\_$OE%KHQURd*d*7KoGvF5GRRTCE516H~נ'x쬃_?R獩0 >]E%;*ر]I89c7jcŋYJٙH߇@M1KGhDRbce_v%VE0LCTTNjjՉF5@1Xx8uɜ'flOݽU01}޼Wϙtc5dԱH$JVie6x) h2mq|sMۺ2W;3(Sz $y*})54'ӗ̀ծaEocpQF>+yu|WϒEz(3 s9}R" bGZDqQH~腋&W\ MD{K>ţ;oU0Wf0w⨙ L- ggoͱ'/̸ˏx;v6my_kW/}Uۺx0oA_Ng٧Ueڜ?k~/~>ϿJ}`Q,l"zc=E"hXbT)dF,Wę$]KvRԢ %ކCJ)R:32@*Ԍ@,9&o!q⛆KP.vt; ]񶣋zG'Nr'aS.e-No_6 3弿<8d>S|;;O)c3;K\'pW7(bNH}r~˙m͡s'ѿzs=E"hd͔@pŠ•1CrClw<6ypc9nu*I;J^WUJ9wґ~lA:Hl~,GDD'BB<)HyoQyUdL%o[Co{I a8) Bb(jrmB{H"clj}*#ΊhJ@e?+u;/]`\|qq GɹQC>9EO?k׮{ ʹY7mJb'ܓ)#?9>H$[2R[~vC BV\y)M!^mgȩσSm). V(fq9*Я89*JDty*RG>m@m^hGD xJᡨPDxR( UX<)$C"E00v>+0 \eA{֠qŢP_}[)./"{PŊąD{czs%U()$Ӈ9C" AA!{`+9?9+|X S$%jV+PAFLÑ xPj]@EJ XXѷ [>) *y *acx5h''ûl@!xh[/ *|fhH@eC""DH)%ZI+}I/lؗ8CZ"゘Vr+I]nؗ+ aqJy*fJ=uSP&jƇ.w4}Mÿd*ϰ TO(Ma_I [Fad7HQ h'%4\Y'CO((QQJ5j?yVV*SVD#/QŋS0D"eW*# )Ea6%b,ҔVH~99m( !e(n+?ܚ_tZU#OE 2Aq\NIl|Jd[+8+&GkQ Ex*Nqx&sW\RҐ/0eO{(4fK0?0hZ7|E$FFzz[|:#P/'XΉ3 kk8gULQ;E86/ݮv Q)'b*ٰ().`) vQ%+52>zUuU DJ +239Rbto#Ra&.2]^~Kz4 DÔh=TD"hd:bQ䨤Jx$ɻőRo޷2ڂVr\)Y\/VjZX$,KɱNf813l4r& )ճmi@`fWZz? (1!|HIs`ĥUX$k_tuBE IDAT=3!FivQ sR̢΄ PRHqJ;JKqtbTPe(CsR譆ƌ_ `1T-&>u d`}/7vmj[58>̄~*@EePQHqk\TԲKɆ X|hGE;,0uPx\Q*qHԖTF,|A$^z8Ud5и0Qi (28Fv8WapJ^ؗ+7TqR$WRDߜ!Ŝ^XqxE(㓥9+3^  S'F<}aizctdkMg|LϺ b@@J=n%bUWXMA$TD"Ht@7d ,&N8-p-vΊ5H煋`~ +(eM)}ٹ*b*nRLl7%,|!NBc/F@<RT1v4M7%hw#P~ @fJЀ: H4HIH$8=Vw9)irRY aJ&+3u( "x VZ鋨m*+DEqG+傔2<?)v^J6%kJ7ЊL@))>ȧG *Zx&4/kع)R@Uc T0ᦔTRlgڡī<IA稄aݕDQD"Nls9/NZ'$ NjY\k먴vUcRϻ@E XB+hQ F 'Bپ̰ZI5 Ґg tB(4,h&B$QD"#=٬EG9QL`1iz/IǮA9+M jd!]2s@g`Ŝtd˖䐸½2ŚEA儁_xnJH"nJ-z5n8/%(#FJ Y *h]{" C⨈D"QQc.=@H.`uY\@Rtȸ촡/8]]ѐ ʺ*@? }yn =2= 146! zTCT"0t픀Fn.*Uþj5h\,gݔYXeK؀ S+I)]<HH$z:'>-\lXiэ\dseoA+:.[ܔVJTčjj妘\ KM6)zO5>Oxš`DQF( LG\Z!E&|=ڈEQ.ߧvT>JOHZ⨈D"耐=Wsb7AZZިH1$`P2)aRV. VM o8*¾\bC}DƳL/!4 eJOem(㪢("xGRpSH :J 8)F~JIŎIXb)).NJ*]D!K@E$D^$n3\`С_VW ʽA p$c?UdEEel9*K`AJI/9@%ƕ) 5|U>d +Jtd? %o"H"V$jo.#Ã?ޖ=(ƧS&vQZo %^P/! Y%DQ/TYh֎Ҏ»"bЋڮIM-U&.7%/U)psTLg%rJ!`m~pyg8FyO)qUCB TDA&҇I JهR\:H)}sQG?j.Pz)J+d\x&H$z^fVW!_~q iIaEmR1%@c_6\jW%7rT_Y(pKb}YA\` PvIOyG=RMH#z?x*vRz:`qRhIC#7Q ¿%_!JBD"H4ew0NJ;GSGyuqUl̈!]z_9=umD/0R;nK7/؜b)B+ΥAB~@*ci8¾! BvS&0*T 1 C0R:d(R )^xb<HhPD"ѨsF~J;EuS̺VjN;!f2(כ1Ą +9UWn)3|Ȟ< !^간0Re=J*҅q~L@h}HJE)Jz(K@ūƳ}zbH-'o4@!vWZ@J;.ND!IBD"H4zϷrZںIN]wÜ(?[}Ю00]a0cl8)zi72/"h/$L'#G]%/ @b~iH'D T$>Bu1tw4;)YbeJ޿?z,FO"QV⨈D"hTMq|9Upa(eXDMf\as[NIvL`vT".X⪘TA)²(ng橤`.؏"GEJP`bO )~'>tjPQFW ()B )z?<)9qTDCH$FZm(p4%/+,L&4%6VM ",XE 0z˭~vWvQB[Po6M"4[s/cd 0þJaWj1!elg *uԳ}8)i '8JDYJcv}A$"DQJ!mɦV8BLEk)dE1GL`oQd76w|VV}+~9;VL| ,$ʛt1a&99*z-r\CJUivT\F1?(${ce*O!TaX61 (]e:*T:Q> MIQne v4m1D9c1\0>]w<;* EcQ)1d}Y#pj<4m-F3z/VCM/̜ (~(d!%3@Gdzsk<$nhH@E$DN+JCsNJE6o7/Xfr}ƱCiL6fD&X1O;Ί]m7EW3NJmXgs MI=PL`F$"?0sjntz\3 -H):y)WE4:nD#!H$:@ōD(^tM1ڹ+P1S&EzF\́ "wplh)dogi)쫝<{$ T7wm9@RuX>oBٱEfNf' ̒b;)uL?b%u)}-H$:ٓ:ޣ3j'LHx\@14Ӯ:^>y7V&bi2h$Rfj0bw2a-4}ٹ*5OQX?~@&cFފ妼u̚lծ)ʄ2n9 8ô2rJ:eTFi)˒:(WC\ iI+@_:0ţ')xtS ,Sv|C6婤 J24QITfOP/PQ2qR(.inQ `V^yhS4X@@E$DLS`BP\MCҗ]љ"f}d&퀋縟 g D~V4K7u @ѰM`J(!\2,<-s^BRHo.OjhH)~h9)dW7sNL$&VNRh2THƷ# F*"H$USzpVl#qSmriv\zM8?1Vˢ@RT1J==\VwksC.AqpTTt( r6 7 ‘妃8ǹ3P1@ $+JVuzտz}ꕵzy]]]X~oa 4m`ᘷ0O7aR\J NS97B$'F7ŚBPj"I8+Ye%': 3-0LRVT@Q!UDֲozC`2) 8ǛgFH LoIN)k>+Hove(UEA4IC1I1Jg(Lç* HUJ%wc״!1ѽL''vKV` JVBanGʤ)7%,j@~9ucԠFBLI?<"ĵ"zFSGH0Q!U䕙IUrbU̾xk>+ Hv%ˤ*H?2})vy$edseʽF]YɓZ$Q@FSPBcGyu-91/,ӓU7p I"{R"wW-+^eR%_tL !aTep]$Ԯm45ӻsYy(!Jَx?G_eay ^W|f/wHVla*Uُ&L =$-1/˿dm 'J%r/ipUyySeIJEȊ$_V0o'be`B EBH`.LY#KU%)ry8):2A"#0%0zG|~Z 9?Yquݔ~ X>_ҵYO,$X;Q1#J~߱t?Jo:CRQbbJBrm2Q!ӅB!k5ً#{\?II.Эda.S( gGX2iHhݙ%$u* T'ŚxDze`h8RTnb7] p&*3s|WQqwy+#$FTlqqHM=yΒty92(*BWM|.O$$$r9)].I1&T!,.S/RԣbI&B%,ʜ (!+Ң &^d??`/ы1cT**|ү8pcT5|9RV+0'u?%^.I?_[B\RbS]1OBH*7e)HV\]C+YI -lX’+j=5\w%G!ўR?c<'Űk2 }zfyưXQ,,(Id)˿JM_&*?`6b^E}^`ݫ 0S<8]R"KB!) =I%)yIe^iWIQ!Ӂ !̅Rue$%#'2E1IOT\#~>&u0DE,e3oR֓MPV3EbnG&Ѓqb?Qlh'* #: ma {IRВB).Wz";$!+s)MiL !w%\_PFRRBcv鰷ؘ.;aJk '9bh!IW} [/vy T(eE.YEe*XTإ_>z%ueeW1,O=@_|I D!=YUqI@Rb'hoƞ BNy/QiGRL/51()Ғ)t"%o$03BU Igu&+@:QVǼ|ԯ5"S\=˾#E„WYb8 "ӔC&* !Z"wP>Ԃ2У!)wiԣ$+fy5Z$0o%! !!IQB9KIw$DTJbɆH`*3Im3r XR+S ՜v_@ıS!%H}%YIKlMS]%* IDATHʔپcQ•B!(^?JJd]pWr(d%Tr0>"w 7yS&.3x]̼$6Jt%OVjH'*&b `lKʸ~#t$1@Sls4^XNk@O%Ҳ ;HIdb+śR7 [r/,y:mxvDHB!]C`=J$6@k^xqq%(&{GyA\%Ή;]鉝$|KPu/}\ҕ*u^-Il5ُax{1*; U}$yV VXP- c}(U8Eݟ,bb%(dpq_셐|(*B/&I.ţܖ+6"A-);o$+{W[ȌKFzy^ l%Lz"Nb " -s[I<`UZ4XRMv `uư8I2&ĔTC}2ի'#$rDNLJrޔ~9q(К({]WyUw!>& B!]+[ F B1qF(4EGG}=H$ML2>AQ"IT: 5(8>=r;s:YEfEBH*rmܕk3})rYʊ5WE$)+䐑TכeӺ"d<:4KRR:c͊z# TZ0~1 iDkQ\HY>2D^$KB\FHDLvRf)iNgzےi&,B!]#{lc_ڥ_ʊ乎dFH%+T{Mb5')h'bN)*BPQ$$,*hɊh+@d^>X|U'1=E%R@X^Jh%*SHG% W}(&!IF^"3^%/v)gr␖%) urt%} SϞcBJBQ!5ʾEnWyl)+F̼H!Ѳb}+DIE5ph Dbb$d:'b>՜*2*v9}?L}D@+ZT**ԟ$`3LRV쑿<'=A,(f$5H|U/'%[QZPKR)5IHJ$LS.vbBBQ!5.R餠)y.I1)زR2A7*'&Ivr6ٗNx c=N.{}- X4`3F2SOE7@_ߤ-OK%)f#-12WOH<ɊIQם;JPR EӔ,"3B!+I.f?I$+ʖ;=d%TQ>A=*2)1aq]:H]6'RdDb7J Zᚷ5_}U3Dw~a<PYXRHKeU2RRTIy%SdmbOE"++WҮ`Ww'3 !uKR23fZZ^90WBT J>uQk98N FP򒔯IQy&% =)3r /T?{yМB=5h/?%ytȈ1qʊ|D(Ig @ɯUUTU_+Q14K>G!BQ!ҕ$xFR"R$+[SRe%OhQ K9?RD-*Rd6.0 RN۹֛m(r"$E%bA5$DQM@556"9A[Pq~ Sa)(E3'$>I#OW (*BfޡLiļ^~o*ڞȊIM˽e),NY6%4f& }IO]Rb%+r[r6BZ/ȹޜߨ%FV"!+IUB jTQ5)D.#'' IU"[%(JZDWg̤ҒR~.12LoBZ$)_]gԨ`\- 1fQH;ϝ$f$Œg"$E;'FhxQ$HQxRHkTs]rR&UY{5ђq(*B ŕp^nѤZ/`Urc}*̠uEdD%*Rj%%E.'߃LK\IJWb"9Ize)2rI$[KQEGxƔuXQMvbCX'%ew/B!]MYI)CrQXD|%^47t)'zTTDJFZ20آ":NxKNBk]RUb܄ޤ*1>^&R>zWI""!Ҳ(Jn蒔L!Lp\.De-Ipu+ i !NTةŌSʟJQR/#.BjLzFN2}*.AI.:)()*>FQ^JJNo x40#$(qe)3/Y)*%(f @C/v:[:|IHC{S& OH;PT!t:aCI]dq>,bL[LHP2")WR"!+F.ڕ&DqyX ShKJ6yK|<ZP)MۖA^vIYo$e4u)sPT!t)M.:w4ŕ$Wֲ\"Sd-9)--&IAIIyK V-QIFd"#)R2TKPe%#(.#')!˺ļwhAIRQ{~bq*"Q> S`Bf !]I^qKuHq +l9)fY%JHiH]UFZLi<&&5H,KZTt"Sѯ1I<2!EnG J:WʔXn#UfGɓ!K1)fi 0B!]GEPNX5{+Y @U'UT7y9Hu2.IInD W`6h_rpOHO"1뼤GL"I%!0W)]Qjw)2/UNR|d|)Q+J2 NJBHW2үvPH$Bģz aI唁+njDq `E KSA -#:.H0"EG%Bq:!-XdWbˊ-%&lӔd^lt@R|b|hI,eB:O)Bb.1RwByRږ%*Rl5k2U$"%.z{1Sq%%^zieeE>։V% SyfQz?v/J*=IN SJ`Bk_%%pɊD&)h5op<DBH+*JWF4 ͼ+=}oFeÔH߱:́zΉ*ɇq$*I(V)ʱlGS#(4<_HGQQɉ-*f^ d/ؖ}fyt ELgIOyqxb)dBJu24伐3N⸆dśDH7[ B[L2Zk]F0L*ӆdقbs =ʗKI :ɼKNיj. -&;?4.B!]zKE.ԦIEdEE&):A4"/=IɊpBO%y #--Yʊ乒j/(P Bj$YMQ\ $Ց ^\R$'s]Qf $e q))dBY Bb@QR&Y<% tWlD*Pz?%sDYՎ.*DJ'MKʾ+)RT2#{$4{RT_HPLTP.1qMЇ܄_RF (*BŘĖvSZ'$^YIDrA/Q H/Qm91^Ē2rr`BjX>4-#HD%BVqJ@*zTsI"'E(4e%`h=$a +aQh=۽8LoϤ*>Ae%LF;yJ)jnKN%e{/%rࠨBz\22TU6eo3eJ{)$w/Uf޻MI/g0vKXŒT*z]ɇHד(R˾/+%eJ>bYIQB!dAaFs]+#,>)=\)3%`FRHI`UQ լ(Ǻ}T%rbQyWQ#)q>ysjKP$(f.[\Wxy[R))d@Q!U%l_SVX|)L*E OZ2%yY flIST#ݯM)|blb/nhR!"mJr.A1IqZ.yɯ H{/Q1InĂk49B !ކx,`LҔ-%7 FrRX f''v"ŲG&-RB,!}Q"KcG-۔ӐW5xDPByEBȂNU /_HV]HU(H$%HHNWQ’NSI ZaXOYIS$%O1W1qRb')M )E#{-<lbM ¢zx2BYױD "ڑ^7GJK%)Iⓑj6ײL/JZOL; iw cFVLYX8%y4%_%Fr-ɉj')k K))d~AQ!)SVT"OXJq$k:0ɉCR2Үe\qmG+z_zn^OPL2͑}z|;MQge%@e%?(*B4;E"Iea`,[z>TyWDQfKKѲJL޹MdIq>S-˹bKk]Gɉ\E}4QhIY SRB!d3e)%,RP$><X< %EI2o'+m)RQi#MMTq/kweXRX敗E;Rty[P\r"#+)kPJ PT! dE^0*1?R̐ŬKR"RJJhQK))A+QAk>^Le]ILRvʼLʤ(>91C*'#}F_}B7B! >Yf.,j)/QQGzPR%_OtʽҔŶr̛20ORJN2#>sJހwKP%w| 'e? WEBA^˼t0w|) մvIz"WWȄ%yN^)X' $,)~KXrF|by v%aT^Lü+Eُkt-0x>%tB!{u*>abTTe7;Sk* Q’1BT*!3(Q:)I8D$*K}X`fI)٘=)VYg+2{^ ,3J (*B:vAR.z_ZJV*H9/G?!1r[ ƾ/JSB+e%)!,>iKNSVRk%#u6sy@pUK)B!%;#*E]K'@:R_znbklG)A1lAq(=V2ϕ҆C;-)~/{#6$e T`B !sel䕍R9P c;(lH^b]HNBYWNhKnI=B!ƌfH%_>\m/8/B 1lUsz_ 8W&E'HDRJ \Nڗ\!%ؒ2`/9%t7B!=â H <@X%+^WֺLDG!@`>Amqʉ2rb2bRVRFr ,%ž~hI?CI!EBAg(FZ$LMaW-IqK",,R&j$\*yk:WW=eiGRTzstj IDAT؏Md2OSR€B!hv8th(u_vH^bO7ɊH Qb/e1e_ b9'H%Lq"NJ*-iJ4=9"%(RP$t:32ߠB!]+K _l/%aFPĥl"RWI$ŜB_IQ|ƽP|tRRJz[P\b|II3E!  !`ؕƬWxzX)r"/S_\!1ۄG'3Uy"-+03[8ۑ;5KQךur/Ie @%,P(*B.((SVL,X+*F`{HRNSRb^cYʕⲷ<ʔM'=).aq GIJP#[?B9xY%ڼzW1O) )jQPM@G\DQ<)9̶P3Eyܷs87ߎ^k0e{ 1I1Z`Q0E!LT!Fu,B Π!kM㼝|]'/2S"qp tof/KK|u+#)Ue'{a_2_cP7sB!%]c-p$lyOJ*rv^C%WJLWY))QՎ$ĵn:Sb,LqĂ2PT!˵.|!eߊ/!d^&+>z%R8DP>+钇Z7Q . +(˖4EQrBQ!BdD_8\銫L+E6b^&/.Q5rҶuVi3a)c`3D` o'=18HʊKR1rCQ!Bzb0{7{ylNZӶalwɋlƢ"MWfILl:))2߁OP%^Sq/B!dF\JW?H)p}{^DT;Ik]\9l)})y0AI!$B!t:4ݭf{ֵ-'SXN=qi׷ jULAzXTT3AB!(QG4PѕDvTaEdJ.e_7SAq'';Iw`BIy2 z&*&TA A @a 4ʜ B !2yVoe k`(^̆ؔL~ONʤJ@,' Z,&FPu-jQ^(AQ!@(h" Ћ  hSU%!EB=qzv4J[쒧٢Lcķ6;Aimɔn~Tˎމ=B-R QB4ޠIE@Q!Bߜ?w oPW_kL)wYA=ז0_ISTT%I-'M]uA?&U)E!h*ZXR" BDPPE(DDIDɇB!,~sVZ\zGa fG*n֕]|lļ b!chV$&ׇhJ?7j!D5"¤ja5TQT7PT0Kb!3B!,@{%.?=@XX*R^̼#|'%"b2z'J`r*$01P*~^`!B jT j!*D- УH>NT DD#%>!EB9xzf˾5]ia0C;$#u8D$rHo@ 4@<mUTT.!T**PBM)t j<:NTzU7~:lBB!)[ w=VIZ9ۦObDdj a5~1P!cu)[5U#݀t!W|a@'*%/jZtQDD@^(01@IB!$œ?BuP*@@ IɱMK:*{)PW XjЌ0P'>: $"@3TUZbWT@A!D U %&E%B4 2#(*Be:h(<*@28 _[iZV)*@P$D"Fؤ5FR$"KZ*>0 D"Po[ LWT@o Bf EB!?J:*=w]~>K'RL)DF)FVLLDRDZuz-*PJWlOD@b ~zJOL?B!9pq@MjJ<6 Mk) |ԈњK`5'")+RXt)WMn(Ԃ̲SDeF|qwMB8B!fu;ede"L$E)!RZJOR"+%(IR@4d>bPK_ңEWߑ~00JBHB!-FXVLeSDXDc ),T%҉dUM LҖ*&P5A7<BTsWF| !3B!y[,+@ t ˿D %&#!TKL&}RJT zWpbS >GүO%i ]ЫQT1B!L}:YD\6l"=+V "]&S/!*8 O$* JEGt:!])( 2m(*B6#oX,,2YAS<^KT$tz2e } =DFlWKXF{ď Q !)?Pɺ}_qLR !BfD2toȊ,!D&*ˈ]%S7{47NO\NFTLةJe_t !Bf;@[ldT*RtHIo) 5WzވITfhbd%RTB!t]ﬣMYARI^({p%)G%6/ H_A>%,H'-D%$EOB:EB!c׻hn FVL$үQD"!*L7+P/SV8SKZj*iqb-fBH砨B!:jjD"S(KE&|XiLT2e_A6URdRӗDBQ!BH.-+gEn 3pd^;1OIJ`I rn)+`5ӫdLOHgB!dV>u$+bbӧ$+FV;˧J(f^ERٟSTy]dʿ ǴԔ#QA_ B!:;YG P5dT$S/O<S#~!JD7d !B!Ž?#.NdIV"+aAiIRfٟ*2R"a2yIdGzXPQ@)t !B;QG;cYIɊ?%ѣ=DLiY6wbc#QQ=VP $dACQ!BeuD{Ȟ1lϊb'vW)i tzb5b"ӓ(`zcSeLϊ)[#t !B8o2tϊISš;Ĥe$,%U ;ZJLScQTB! oCIY12d*QaI kĤRz;Qϫ&z#)n_t !BTHfVߌӕ@)dF=*HK,Jw"}i(*BSQjTȊ4[IE.v-I ;}Zt#CB!9^HDEMi9iYI el*FHTJFV.;}2=,1&&PT!2/:=FVL9|L"N/]"dWM&,rd-'?CY(*B7lGn@!1}*)e1"E"rjW@._UݟDBQ!BȼbuD#G$XeH7G֣E g41JgꓩFZ!B!yǺ0?&:51[$+aT_犕f{/{ԯ&&PT!2zh%+ 銑V\CCGv0Ѿ k5LLT!B!yh> LˊXn[`\eab0YD44`B!d޲u4  l[JrcHYeKIhIt"F ,~鞘>. w!  !B5>^GZTbY $e`rc@ KJPdK\ J8Mc !B!yϮOlJL.`vgJ0(~I BB!`%u4~ D`iYw ,2apH,ѻb4bAQ @M?YB!au41BVGJ\`Q$*h ':,l(*B*v#|*++j { b{T0(衈S$7Bf !BnC!XO.z+iDy3M1²/Bf !B7;؏#)[1C7Z}+HYQ03QS=(*BZv^YGs8{ɕHTTtJ48˾-(*BjvD;h`^+rD0ž}3lq5LqR57Bf\!BL1 `C,KI~*$wGź " 42D`}20Q!BȂa98Y `/L$CdL& MSr24'w싐لB!ውI1+ "HroFAnr, &w#䠁B!%ZVGÄ]iTJD@0LǢ2M!dB!dA3u4 ^+`^7C?V(뛓ļ=!6B!d8XWC0 RTqYj4)Q4DAB!,xQ ګo9`*WپM E19'3Q,"@DB!;uC*ˁ(@Mŋ 0'㓿GI!@DB!×ց@4 qgz@oM{09lr@aB!qCV@L@@vFMI!@CQ!BAo6Pj1&u3{9o>Mع!B!dv/%9;7fH !B!%*E\ӕJ !B!DRZT++B!BMv9~&B!,|Jg6k֎_x_B!BnxB!BȼB!BwPT! eQ!B!^(*rɔB!wxdAoBX{ҏNr{e2ߋoX6ˇB [~/'hGVBbQ9Q"axB2r{`._#GoC 'r?=Bwvr0{`~/?[nB%l/As}3ۏry>/sl!K \g`"BHwsЈlM"MJ!B^:"*ANR*^)W>q·2sfz{%dZl>`xxB98X288~uwhѢN!YgN:TJA)M6BYtLT>O_bjE\veuO=N;4,Yx;߉۷7⮻J=ga={x_k.\###ڵ WH_&&&pyaҥXt)?|LLL/} WƢE|60 qcժUYg{&6l؀+Wb򗿜ڇ룏ONN0-Z5kK^EpGR9h* Y̆HVZn }ïXnz{{q'?iﯼO?2;tJ3>ܹ}o`z*֯_۷c۶m8ag?Y\s5(y5\.K.C>z뭩[qgc~W^͛i&<쳸+SϹca˖-ضm*羮Z<駟?!vJ IDAT?VW !/_w/&+B_f ­ފwg;/bll ֭KRqgcx[ނ'|}'Ql6qG?eOŋ-Z;v$_0D^ǧ?DR^{N {׽Gydqo۶ G}t|Gc۶me/K1yq'% k֬I$ nݚzv)/:v̹߫(BHwp c}WWɶ>dqodL{lP\yسg~i|LgϞ_N;4/ǿ/^~ztMn ԧJիe˖dªURϑ۟~i^ڹkKJR֮]zqMgk֬I/CsAY$eQv=={{I}?;7x#VZիWoƝwޙl뮻pcʕXr%닶~W?K,|N=ǼBwC3AE0>>~c˖- ~]w ~6_*/^O<1yIqEᬳJ=gÆ 0.b}}}矏_h6xR:sqݻq'ۖ-['|2X~09۷c}ޯ̹ ,Luc2mﯢ_QG,[.E);ҽanvlذ-)׿TU{8s~qEK/-}Lzjs18cpa//RyހWUXnVXkƹ|3xހgO?=^WykpGJ>Oᵯ}m2E>˗㨣«_jo~e!dq%}_|U^mkoQG_? \f9;2z3L7_ gy\N)}QYfB\%)>Sz%'8>ŋ# 'N: ===$j֭÷_z| _ +Ib``~;nvAq;O<n+ .r\~m!w敨t/T5̑~qUWarr\r B*g,B!Yn^cŲe2m' EBR}朹>ࢋ.0݋ŋN!  !qB!yգB>ù>Bw77guÎBH)K!IJ20B! !B!{T>y6Bfbr|صc">?*xʗǿ{8,~1'K!dvUs?t#oہ(*TjJ׽f3=!36>rݧRoBlKJPP &~O񋍿3Q!y?#<oy{R>A)aP(l◿}BY;_A( )D|WwTW5x|#S B!Ǯ#xۻ^@SM!7ijrBԚ(oc/SgDvd7 {ҥ(RB PTJ-O˫>YJ_Xl?F! HEVkRWJZMߧ7,n[~/erP[q-Y;_xWGgQiYU^Wن_DGBHgPR}ò/荙uf!dQJabZs}0}Z\އ1.WbVg=x 89bx(VҽB!E~7 ܿP3Dž'fX>x? niͷݞ0燐F)͏۞{{veǼrևGpf֏/voGW?&Nx{#*eپqkOt͔[RF!#Qᦛƍ=c2zitgM!dQJaG1s~م-z?joVM{Bk߯ ,Ydb կtd.*7o)??ĦM0::~뮻fA,V=#]`swPbQq{⹻qkRe_2x_Ha8g]Tj\ve>$*JT&&&pyaҥXt)?|LLL$ۃ ׿u[8ӟ4fi}uAnGJ%>MW Xnn3\wujz\_fN0_ Yȼj?8vEe=Xy{e_$BY83ssW^͛i&<쳸+SϹ`dd~:?|QsvYO~<#ICЇ>! a޽C?Qk_n|_Xҁ@}ԵL985=qilsvmއCֶ)*ÏxW~u24OcG #2̺ܹ+W'y睸j*^7|3sn/ŢEO} >Y_:lݺ8#;|{q`ŊF 6`ʕX|9/YdE& C\~XjqYga޽}coc3M'R9ǹ瞋Ea͚5җ4i9)}WzؾY:r\»&t3\4,Z dXrX{&; ^Xfι  !$ɉ' 5 XbvZsmۆ>:Y>裱m۶s=d~ppf3}쳈;,|sj,]7x#N=Զ[n'?I?q_%8~WcƍxGxb Ӌ 2LR8sqWLZT$k?GyK.Ņ^. r nۻ(T@E@L?nIҜ9s l󫯾҆ l;o<.Q-ZHgy̙С>#U^]|.޽[K.֭[UZs裏l رc5m4[_7?(l $C990d%C2rPꕋZj .c/C@ɴlXa:uĉb\&Ϝ9S .ŋ;v'n|`OK/%$$hԨQ4hב#Gf4k,+66VÇ/8O>>>pϟog;Tgzn-*mjժmWÆ `+ 5sL1BAAA%>faTP\||7nl[/q<@Iee^UVff(j2+=5YWrEi)|Yiɗ\*{TZh~I'N㕞:W^ՙ>}^x[GEEE9}cǪSNJMM *͏?XCմiԨQ#?{_=?-[/p:FG^ŋɓv_O<Ν;kԩVppN8- ֭[ըQ#{է~N#GTm:R ӧm !`㡶Pɔ [nN.]rأE)99YZh||nLt4_!'*%%n[amЮ]SN)22nG4h>lEGG/F;w&MSNZt$iȐ!9rΞ=˗/kѶM*Çװatqf߿CZZ%Kh?|ϩ8=`E1h JLLTbbƌSh%Qc~ye%IoZn:iӦ ջޛ UӧOWPP7o͛+$$H=TW_w߭Ozꩧ4`I9 9rw.Iׯ#F{NVX:u[nٳg;m4ժUKaaa[եKϙ@/_ͷ_~+UVMsܹsԛ8q&NhzoҢE]V8ݮ&L &䩷x,pEDDEԩS]@/QFiԨQGG|tC(&Omٶ^g>t@i+QҨ⨔^|vCP}:C퐨p;:G%l@E C퐨p;$* ÝXgy "|@ǧ,2J!ʊ_=*P0 PTD%$A^M(66N̞]i:w]3mfZzbO$8fƎ~QeKs"&HT~63j6 " U􁃶 kvjքqcMvOQzjԨ.5t&ƽz:oDPŋJxQoL{K簭??Mx]NlѡG5=ؗF_.W{ȑ:S+1)IIIfWtIm٦uk_H?'zȑu22 Cfٮ(On6G 3CoNf;AugvWwv롺7fö^;褁O QV4b=@|ݤI3ytO-n&NWǍV``v葉{)(ƏE {N ks(w͏jٮy|uRqKC:BZꃹ(m{v16nުˉi)-? ǝ>T+E3}m:W{}^Y9CY C Q)0 ^RDŷKږv8[()~x?;+}T-~Mߙ'ԭ;|Y۶SznhLʣ{]*zGPZb F퐨p;$* C퐨p;$* ÝMU-Ð$#gaȫZuɐ4z+Cԑ|G"Q74\šy3' \9* C퐨p;$* C퐨p;$* "$'m6i3ԶcgjI >VNT˶ղmG233lW[5nFٝKHxy9fAKHx.n5i)IZazn=p7n8cއ /:ZkVо[3޵3{.^MWj󖂇)͞3OGkǦu=kΟOjӆ5;ev> IDATkڷS[&.FCڜi0v՚+{$14v:vp/[=*QpsCaZ/M2Y UfMXkl}N Դ7_/e߭9ileWk+j$-_nQS԰a|}}9l,xδY)^S@zuJHjoO0;J1G%|y6d[p!QBC l/!Buv,,4Tvuؖ}||d6[ <3m&(' >М}YsɯvmMF %]Ĥ$M:֤Sd1-[YjJLJRbR&Gu:V????qn[amiZ.RFFkɅ'rh=f Ðb+g2=YHT^;褁O QV4b=@[+/$:~aեsyiZhܧFme@uK]RPP;X# % 9kfGlQ<>Hݺ~_пP5}`,c\tO.[u9ƕ2Rl[f[;}̩2T|iE3o2VE/ }Kږv鑧~pJJ8bm֕kSXӢ>9qBz?f[wSm܈5YvU E\RQPp;$* C퐨p;$* C퐨p;$* Jjqu$\WFzuSSTj/ÈPU@wnV0T%n|O4ٚziߐ;u"+9wϑ[')++#@evsTV>KM>_VCB>s7աqDe݆S`խ?bWgr]/33Sc_m;eێ7uefm6i3ԶcgjI >B#ْtgjܼz?_*Q|克FMZڞ}q6[}BǢ?{J^^X.QY=3iIҐ~^RuQUoϚڴabc3{<9zLkW)..Hmmٺ]+Zԃָ j|ڽWkVP#nj/=ZlvS rYW.%-a2L6V31ڳw}aIңj:sD._JS'OT`@*j$-_*˾[S'+84ekEjkf5l$__EK5>GLzMֽkx+!႒.QHf=ݮ~Q\LLr1篚 JT>K%]&-)$Hݺ#rP=oU^7Zڽv怒?vtyiZhܧF͊_a}zi_GY>]}0w1:[j/ߚ%I>5M2*+3CYW3y5]Wӕ+JOJKK%:鞮]r+[eؖl[4̶wSe2ӊ|gzߚeP5?FaM_o.-w#O-pnۆ?;+}T-ΟCWVf #zIV՜\VիVwst)=7b {j֪C@D|;Wq9*p C퐨p;$* C퐨p;$* C퐨p;$* C퐨p;^p9۬쫲XeDbVZj(5%Ya:$pu *̫p6TۺdruH@9WWˑBZJrYߩjժ:1&ӣ0 *DabYgyXM")$VR4zeee,z{u좦k /)5- C]twffƾ:Q-vT˶5n̴?$'5pAII($DߞnW,X-fyxR%Rԟ'cTOG/.QcG_6kǯ;ݺ7~p/ZՅ luOmã:tĤ$SbbBmaJLLt.(,4a3mױ-;:ҎW|mez=~HsY^e~\[&*ժUӼѸ $//Oedd/]\*nj9k[>{m 7Юm؆G;u4!^ ;ƙ8u&&L.NwC;-dwmWԔ7aRbtoJI[je+d2Q}ROjM֚p222^'N.5CI/*E1-=ֿO?q^שgd6[tQ "ᾚ]}0w1dm&ν,I߶o[ɿn&LtblܼUo\E*#-Ŷez=aǜ*JSjJح.< *[(i=sBw?҅]zܸ쇱nXúR|@9f+K8+SvnI)))]ö _0 CJKKUjUZ5ujV/ C2 jPޅSSKeg<==JH (C={k YJTs`BD 5b0 {E۶ܽ!9}>hΟ?;knmaQoj?Q\y5mOӧ5:sV-4wպUD;~QۼY٬3տlK#瞑$effjSêHޜ5jz!7AѻL&C{H9+wr[x5oN~u҅8*.:uSz"/ilIJjq5=M*r,j*%|jv8VβZ $'K&IٲZ-9 *k5MҵV۶y*[O^:hs?(t}$, 9*JK>h<< >͙QS԰a|}}9l̷3,=ifm{/R%msw+4}d7L~V|*M7Ślچ6E־d8Sf2y~rPU᭜׾|U OCW.8{v16nުˉi7ez=aSG+:z.]TɜT*.rt,ia2y^@=uhjx{[ؖ]жܵKum۰gueɧٖ۟{ɧ ?{Jύ]C*YlAN'iz8|GjV@q)=L b1upEl eb|7ZgJNa6ݸ*iOC,gWD%)1Q}~,V&l^ ee^-! zF$eef8]M۴woe%dI~Q#;mׯJjjPENTa,Ӎk\U/sHEtjN UA1'cvn@}_~@y7oю~Ө/s^7\Wvð]JrQ>n*Ͻ7_..t?e.]5yX-nZsβf6gRbB_D0rƢ]XV9[Wղ}'ԬmWnp},}~[Q>nzMԮUK3OhdR(U@Ѹyku =*:8y;ߡΝ)s^L&Y,朏S뙊!q33T$䐊g2d5e2!L&s;LZ-(g[޳S#Zsò2R$IWJRehŢ}{~S 0"^ۣ;5Ţ;U/nWDM6>_G,0իVp@{愫C =dPuhߡ #:ݿj-|Ā7P?Z9Q oV-`PU(eWx vHT~}taY<B]zh˶ 5PQڥGY(gyoP^퐨p;~Ԭ]q =*N@3u91aYW8p`aC퐨p;$* C퐨p;$* rfծXh=UqMʥDѣL/n!p/~p {1 7܋_\&^ 2 brp/~(W *_ *.w̲#^u5au91DA@QyeʷcP%ȗ-!%IDATL9*lW μj!Ikm4 |1\NRFZKP5%U$֮h$S {v7$i攉V]5jx"NUȗK-InJTkbPe[?ڶIENDB`mayavi-4.5.0/docs/source/mayavi/images/mlab_surf_example.jpg0000644000076500000240000012110412747716313024576 0ustar prabhustaff00000000000000JFIFHHC     C  "  I!1A"Qa2q B#3Rb $r%4CS£ =!1A"Qaq2B#Rb3$4r ?!A!A!A!dy!eHR&ؙa/+|.xN2ac\$!"B3HBD!HBD!HBD!HBD!HBD!HBD!HBD!HBD!HBD!HBD!HC1yj Q$3tOIiznodFT/h WNkNL% 8[BRFG ;,C532~y5ʻȚs*WCWˊ9'*$9ޫ{ՖpO:-dWШ-v|GK Q ,ؚt[t몞n\+z;Gr6jMdgg;\mMjT_ y;p%dTF/Itta}v[Ցp^Di^3^˥,ԚM˕ڛ+ 3 6^ Tҝ%\MۯT>Wmk᛫ڳJK32So.%4I8Q*NHP帏q?%Ǒ2]hmuAl<=*ÓR׶v~Zwηs-imwon ZURJ(}ju*֔+beEI{zrGQ`6 w`܌i_ ~yM?-gd,#,D!B$!"B$!"B$!"B$!"B$!"B$!"B$!"B$!"B/”N?%^ F26-Ue)gjn$H+Z2HJRIl&R隵6\ts/K nADrpx|\P[,*ߌ?<+.[;GwpxRTF~1zƻQFo)TzI?plq8h) ;۵ORH!FKc:7>]^41\j~Yk Shi9 tǗ3LI28HBUnMșm5P"5BiJfA V˜y xzۙ۟ԕ~o+BvS܃E"d6ÿ A}[;O@\}CD* mf]oe[X'v˃`J9-)mS@~1-45EFܞLz㔪̴ҷmzOQRzu%qQ82?Z{Xt8xN&8˪.vDe8GhB ԟ-6C)[xRNAJw~3T:GݸXF^ -k"Vܚ[.0g,SmҩmEJ+ G;3?ꍞC˨lv^Q ZC.E--+#8#p@A5%$##U[=)N;`-{wإ[h!9{0iTKuQWILP:I8ųRTYDsP: 7i [4߹.ʻV+KUgT)g#< o'fWf;$-%4kmi1GiVGJ~Tw$Fi/aN_^p47 x lF> iKb9c gTյ#0% #xDey{cvwZk`Ѽp"tr]iB B B B B B B B B:RrSY) -צ4ºmJ_=@9 Hsty-kYRRwJJ sQ<]`lBUIjHPHq uG"ݷSBU9M*Vl4xqxUe'x edi?q4AFI`G~Z2w*u*J[[P)@EhSP9r :2!=I۔ #h2sȪ]EK;Oԋ[*ۦvj'6tLK˶B%^9UlT8O |H24ٚI~e)k)32ՉwZ8=>yVܺCo6cws[9^Hz9r2G$~A'{ _ZHBڸHBD!HBD!HBD!HBD!HBD!HBD!HBD!\k!`׍#J4{WbMSx +(B*YI8H8&JH.zǐoRgY>(0&pL0RSV<(%&+:5%\Mp>kN"ݣ-<\/M,~}ZzIP!<+ 8.p|'3>TP 25z^e0  cO?l&랭iݝx̉RrwI$q5_sw,fЭxqz,svBNLxT$o%%3g /1`,>޴ɉTK%3,Q㙧B 1{Ol ѩ32a Hn8< %"k\/}ԴPzCO߭72X`7rZ>M/C;Bf4pwI|"_eU$x`O">8!|?Hx+A|ez.r fZhxI"M3m%FTk>ghq$@ǔYm*!CS^ N^T{Pwyyl%*AOHnU(Q}yDe4uKmW.k g ^@JwH3 ne)F2``!Cc>I[|;9Z07MVʾj{%Y vB7KɎ'bK@SbUԗ0, Xt`v+ęG4۷dSG1SÒ89r Zzc1^}Fa¬:4.k] umTOoҒ鏺q܅nIWԓJI|zaI$bknm'L&ِqHJeE+A$xAJ0F717㡾H2<+ :w?-P2gxVy7Ib_N70Rp9,89g1!ُhv^j4AZ(n!00cl|!!A!A!A!A!A!A~#"4Ch#\(TPjeb1 Z9#’2,Xj @{*atfy%fe.!hZH9J ]mһrAǿElCz^]=jK.aJeJܧ㗨H-:L2B2Rb5SPZpiΞ~첔'r  @g`m'A}Li8AR~?=5ΞA==,z[oCK3Jp2zyy]I¹ruBT"նgQ6Ddc4 TQɷEp8zLV*T ǗU{f<@d\ mЈ1F,{N{)  #թ$cN |؅RS mICHoؓuյ1EaMnM,zJZQ@ VwD(exF!1aټ.ȤNvz>03ʐVєeO߬ҩ)-<}O:w/("?rR<7QRy#xQEķ nQx[jlW0F6й[RXɘi?$_O;s+`!FHh/Ԡ$$cUdJFNG*)(4yc?Hc/nS88ld%I>!@Iɡdј&eeRGxg%. ePFc_7* ={¹ocG>ǶBB$!"B$!"B$!"B$!"B$!"B$!"B E R>f:U&FSb]f8hH*RI<Ɔ}u.hiCu&љ _[^:(yHP*Cim%H̴TҐ0?8 Wc0QH%G2y>{+~EL!!"*ar^}| nI{} Pnyu /HuqA^|ce z󍇰.J[\) @/H+ZKZfJ(OC1&9CBpXb;*BAq KH\I8G;g#r8 TMRA$/ߔHZ"X9{=0Ym;$-(.l߬O'%P,%0>kThMH!` wQrvd7Tʔ τe$m13)/%u(;F;\ISALqRwJ#p`qg_|@G Xqy6c=s:B).d iHan{M#& e2`3L`)3~pTJ ։vv!$QXCﲏe K)(9nyStaUp8LF+9@$|5eA ,7& @_?l-_k}Bp99Ï^UR:o\j-[T5rqIa0xZc D=S8HsgbG?FFq/U08O_;t?FKk'wyetwf}ȏ8Ux)B B B B B B T~]Z1bnZRbʌB;|rPFV4E5hd ds܃>z{N]ק#Q+a\Ӵf+fjkim%J -C zc,y|bE)]JV3RDbT#R` Snec.\˩/%[,+iK#e+ h)'9Ncfs~G@N}s) &8dE!aTՆׂ8IZkxO ~(LԥŲZ3)#wꨔvqP(g1[4fV@vg/:JgѽV)4L!p++Jb2CR̩dJID4noUn'?,-R)H_I| ÿ[tх8a qG ~gr9OHY#rM΃-3QkUz.2Te0zEU~+TjmCZ$9c-&O;)ds'ϟ8ݾƴ᝞jR&d $O{xљj4tʠVI;#YIJT +Jl! %) 77W 43U;"Z۝Uď})pB$!"B$!"B$!"B$!"B$!"B$!"(y> >zQ(}¥Uf/LH))ٴe*nE ڕ (!Tgҕ$o[l+'5CDLwF{ࠪ6~LCV_H}]f{=ԻnIm;.PPN2)8q'rO{0#}k]YBJ VwTS22FBrþ{@*n/=Hq4% r+|h{EvWv>.p9=jF滨#^|iz\'!]JNbb$3v9O쓥tHTZ(J`#v"%y4mf Wh9nys,?]XjX/6s@5cjn{}e*]fЙGO<}ݢ73Mqģp$$ܿ(Lը ʜi*Owd1_l㌌,p{6w%TJY9H8{5Z2 ؎„6BPA~j嫏B㲝8y"~>¦$ y> :iYKH#n=EE8EZ9'W*! H߇9ř+VLTű61,y=J$<▯Ѫ-O(RR`:矘;-(L!hZP)WD5 6geAFNjh&Q??Naͷ+S<$)*NuSZꀐluKj<;O.l˧Ȃs=]S[E_vKZ5nJ2=,&' ^ u` jcT[+w\T%˩ca9'f|3+PU2e#'W|+8}>% Ss?:,Ԕӝ&3GT"3.}O۲glL/ J2𶍹nw+lBL~a)ٕsy圭~pTnB©TE/KauׇOD{AQpHRr6Jw l2Y]i˝HIzUco\o|-6˗c;VTnB&܅ O׃ ;:%ڝ@}sk#nLhH0G717j뢐1<ٴLZJBP Vyc, 8!7S̸@eY瀞qtOzuoUR)>ڷ$M˭!I 2="%4~fw\6riVsH^F7H1\]mjvFY(pn_v0>҆:GźچʣVQ8:'dS7T/~u}.R8%AG#w'dژAKJzKlWIR'O/`^;5Ta9T݃>IZe*.+ĕ+8 GԘh\(Kfedgel~)KTVd|=2A#[EtawxʎG bN{=:wGkx*ri^6}>&e*B%+NK>/*-'OLZȣUCnJ؏4L\E%B(}S:8x~ǔLRMM{;?P5RPmЫ4xAN.(up|Qg=v׆+6Td)\q(<# tҺl)Q&Dz⤷Sjp|M 32ә'Fi{іCQs.#'9#GU=N.:9X#T+Lm̓ .)Na($;xR(8ʣN=\y|^uDm>qF -iܻK!`<)?1Wٓ:zUBKTj6 I'mJ)JI+ ]1EY<RT3 DK]:qyJЬ3](!E! UضM^C.}}TTbz32RU}'Vj;c F0qPU,l҃oJ:v'%d0Oa5hm(hQ-;,?S߄%$G 'VwJJ2۪sI8'uhHprNAr[jqKc 9c* [:mO^hWZ]*@-> $C|zSlI6#Qc>c@"'J 6zA)ʊ gktNJ8ӡi8qi㝧؄1:.qa0['Cͨqkdy;p#HC#aHBD!HBD!HBD!s8$_sD{Q;bbξh |JGJx@ GzY/:e"[ڄ ## uEjQP=3TRN_ A Rsf6R9H϶9x+W`vevWgiӫ+O{*f]xA)Xe-RKPqA[U֎ڕxZ)T[mTYIuЕ)J JQïmOᐬ$D~yΈPm/ም} }H-}NAj#1DSpSpIj<'9$\c;VRJQO埜EV#PI#s)\pb?3ЭZ[^,syrׯN(iVJh+ƍM"uWQD%n; :Ë"&B۪a<%sVd&eP-\vSe(}cC{Ԟ*&$[RSOgo [V=$#BdW!#&* >ya#sLhzeW[mmP8b%+չA {40TN!:BZ~qVU-MHI\L)c% # ( 1z+X9zMYmi#D KK84RwڶvSՄ($``Eu+:˽pWgBJߕGÀ瞝yQXmWYUyeńrA"DX.ԇ.;zV6h.i[wO8ϩ2FwcJk_UL6 PBe$mLEi y.90xF GWOnW=QKWW|GvPcm=c|@]_b.8]j[.j ){O#&Zu:VFb#yv;bFx*79-*P[4HAdONQҿ)Gv2j]`\CBqJ"(}pfYUt!X2u9 qe?`uij? kDvW?:gL-MxzwlpRZc3Нm5E@a[c0K2O KJ\ %JJN_cL1PH;R3Ą֦%x PpVpR^6nzjהQ>vje!Q9R̞~.O0O>~x} FǦq4ji[U5]p;SfJBG>RJ8d6+F}RW[ U¤#| nUӧWA Lsrl9r1el҇ aUrI#v0[hhKQnԯ&U $N6IW^ >d*NSfݦN2y+BIpAqvO˩/SSN !+$uFۚZ:<.w  #w*&ByP& 7D(X+(Rj¼%[XvVȓ:'d|k_RpRYp91M1d*M|)NJxyϪmQ.y?󳂝3IxR <2a ,ͶFHCZ۷x2RS5A"z8\ ˍc6 [J%C!)9; O4mԸ'uU+*F^Jo+R $1#K6񭴜rH1Vgio0I^R2G#=?XKm䭱2- e\'kO]}#qp+1#*m@֝Uf;>WG C,vBZgV'Z m1h~c*ȎcIRxpc9mAXF\QGTW!wb[wyjnQjh蘕-ANEl} z`JTG ,Diښ@rOIϚvh0c'H ЋO\UGgn@P%$I1cwJ2@3) 80g8fG|~U!AKY#FjY$o\dXi蝻 It.\G!$sY׫:7l3_[V7D9Ża7}3byMI6җ#cq|&Gw[xRwh+D`EgtQ[Kr5Iͨ'm`䁓C;24V b7}S3Ob3Q24'\9H @`]IB9D!HBE0x FvCo=C&,N˵dhҎͰ§TRc}ϓ%d=N(%I)$c7*5DT;k4-0B=(ǗI l+]UZpĬHEUMzT*^eərND tњM=)re@q~q{LYΠ5lj O8uJ2[UF﷖c_Pꪹ#uk >#'Ѥi%2$``dcB9R6bϞ΋s~4Nwг:Z^JDtԖdP<񎺫Jͣ* dU!uqabifԲ;^ŨȤy'7]I>1ƺ`{XQ#*>uK\9NSIl/gNx1"v?Qo67v}ŽYX*=op0$ 2#1KW;mUeO Ϟ"j ]q0;=AZU4S VxA9yduV&29|+6)춠:=L^A32Onz@}ETj ?QRov. Z_mM:v3,' k>mڝT aA81z&KJ.#$. 89Dիƃ–bv_>iWe4 e8G"&8k0J<CJ JiW-6|Ϡ$F T!3.4+1Rd–wER8|wxd LNJ޴ϴ8~>\.Һ,JVܛyi ##ԇ$?c㨋ĕ+nmJgN#Iu麁5$όꚖA]VikZi,ץ̐TTF2b^פ[RyS- (zb`#hFcZeFS/tz阶f\YZ]hɒ\*VT*O;F/e:37Ki95z3|$@ xȌZy$rFЛͪS,10HxǤfQW)6@ #Td> ]I}#ʔAؓ1{2Iwۈ@IeBT9PZ><%-ȗX\x}p_<5N389PT' 1ә-Gv QzOGtE] #ŻiRT)mrLf^PTYеevyY;'rлJ.QdAjwn7*R?"^ݼԤ]d,ĕՎ o:i0챒u:.=C[AJ\Z2?(I AOՖf %S:,plJHPsb3+[55jK7ٛs M:8GD:6^^ڴff`0J IBڃJjz;@g詗Mg[^`ѣw|ԻѤ증0y56^^]9Ԭctׯeu)Z[WڔmeKu( D#>J]^SFAKUw %V85g8R&UOK:SERQ1Ńχ I'{wg.q;uI\*j7$zǠPZ'<^]~e#8A+uxB{xB@*;d^hf\6ӈ 89y1oYܴwM6ʹiG^W8J$#|YJu^ԣǟ^|8+Ym?0ǟwbVG\%}[kM*IR3i~śrfM3i#@%#|{PhI.̩>&@RT<;cajjZxQQ[-?vBC|kY$~] :KԪ܄#OPnJLKM0x\O,;o%2*̰ﱒs۟NX.oMAݼ0ʫ/vs ($8:}&'#luEѧOaJ^PǒKR )9QJ8'[.x'{Nꯤܷ]geN"FlRO.JbwKҪdi&PZps: u,mR4PXI^Hu`|㖳ɻ3  JRpq8Ժ #E-ܶr4\8eg]Tm7cB7s I|GK O F=?8hN @OYPL'I“D4=2In)e ꔐ8fZ$ૌYN׌;b08\u<.(E}%WCd8'-|5Q;1\Lʸ!^Qj-p4v؎DdFBg􎅅si#_x`'":ifi e'RHcS=eƓ䐕Ob-)]p}O Uw]RK5#q8n`m#m6|RV`g@ZuV:KXbe*%o'dch}]mu:Rwfݡ]=vA=m^Эl'sϑ#:s~S/ZQzYYC ؉)%Qhi!h\nW jK*Jkl-TRFJ֤R(Au4ΞVݜz*PK ,@9s`>^+9S>U54TS+ZJdI91{S3i i~|\:VVϦhZ!|VLkMuYo:[ws9Ut(2J@[$mbȲZLZH8܏;fe[HfiI+:@3̀|k֩Δy+w-aUU!|%MedQGhNˏ@{y#ysk$')[E@Ynf} QkH]YȏSUnMA V[Q%Kn.RG N,95 8h[]:W )v9XL7!*T"5~Ah(` źM&Ulo*C&]VɢEUV׎VLjn.ze.e-n5U)ÍmX :O .) պ{hJ4&"+hY2tdVKI*8>L=pL)`2V]2,71@٭޻nR_+_Z%\'GU̬sL/Jy7^T%K@jJE(dd nܷ4N42B搞'&NTOFެ]P]ڌ8JW?!m-4zav\QL_I۟f?mTN]aj3MT;“;0)R1F޹(7JBxE!‚JQhp ^&䯳TFihj*8jmN1ː"0%NZSEI<xX<9^0nG"-y`{v_\yA@] -ʵ.N x#z^ߖAOM2J{)Oۈd#;PIWS-ݡPI°҅m ϐ few{)QC'-0FAغjkflhߚnH躇* Clf:wujV. 6P PK)342G(uj]Wrp!ӄP䡑i[&dܞ][ͮ ӒuFi5RR`4bq 2A^wS=J(pL̩r5Ll]qlW2OHZF^3kW.Jb Ƹb@_V[ d7)H +< cnqZv-.8> T;k4ciVPZs\SPZ"kI RR;9m="Io^asK0O∯.9I@>[I |Ҵ6`]s"IRFJ}޾c6 fq-.+͠v7{ Qz ةnm)d.x[;C|:5GD-hS4gfK,Ž2Tv@TŞۈ2Y^U;weg <1e'G.Q-GĠmhQ J>{Tm|$M{ַh%[Y&]rVpG)j=#RA}Ɖ`rU~֒yrWgjyanNNU#󍭗PS)W2R9FrI:fq8xG~ɥMG TjI1Ägq`Pԙ }Ank_4֦mZ&frLԒ X +H#k0CrCt=D}Um@`==?O[}4:pwlNȻ"FNA{p3V7iGNmʅrOLRrMOT,*[q6$%%EJ)J@>^'=4^JtxYaLN{v:T%J7v훮ݿ._i=(JH_f'$L?{R"㋥Vvq7spW{AiJs$pƻU/y ؕ5ܸPg DrM8$'Ru3B[ g1btj.Jqy%X'g~be仦L[$-zEy 8j$\ ፕu(rs`ԥKݩT'ׇVj5m5w¦ 9*'fZ[KKl[2ip3B6o~8 mW|;РEBk!>(̸ ;7'V^ݦT)g_$b~_>$]J8 h>$,M/z-<*FZVJK!pos-ey8d􌅋ٶ\}􋊉jZ6%4%h6Q:0u.lfw®t3=+P1.f7ʄ' Jˁģ˗>ľWORz7M4brzwyjYu{?,KQR[yy :mK[Ȼ,^rByOCQ̷dLʇ C."?|jt)\N<,'Ot--#I헪iҁviՎB&l dr9r#U=.($.8xR֣%((TfZb\+}Dw juU@QC~qT×]-.|Y;z d {))C_Щ=qJ)! :@זGoƅ\Hi. ^-BRbNl Qu4v-lUgvVMOddc\2SD䫪KWn6A#oU=(JBrz~?X&Z37,T8IZzx|Mt8'BiNedk95*4=jWdr^}Ҝd}3%TIAJ|mH斕g*rx W}>to %7OR5S{#o-NFܜbPwna'`r|@"ӎtz}ԏep,!3 8B1fTe)~eCyIO޲&"'Rl,lBNVvnQ!TrGSII=A#űwʂk'')]I%YJ6Z͠+A=LLZCU]{s LJKE 8bZqɉthA >|ǩGM1ZjmX%¡@ѻh'!nJzj\ÐVhRp# #؞7jH/R*JZm*}Q4^?ÞgϞ7'RmX*[4PWv$˙6߳kJU lmUi8h(v?1hszI~":C굮jV9\RZ.>Qٔ\Tue lq Rºf~6Xݐ|{Na)&ܕm;gPL!^PǜvަSܶit0NA8X6o:c)uUmVwd$ H6|?F\Tմ%%50p5cr격}ۊIngÜpw px~}9hyFICc#KM7aU+&W,[*sm3ɦmSbԚ019 ssn%=XH>p r\VvF9nb*X G+-G/ϲ[`lB=yS9;bV.M0x @ *'rlfRM4xJ@v\v隞y+[c 3:`dg *̧ǰUZDNN`5\̳Q q/b m@;-qWTNJ5Nr#L-uR2-ə%%Gx  ͣvJF47B rpp22N6IL6sk0OBr1Jhڙ'$=%#xA܏#dR^иtj5pתLIH-ɹCm2TJRI8y8pzu㵾\Z٦KFjiӤpJg`D}4eI"{ ];V]]uH9)iS[65a`Il%┸px--@ /""0M _WYEA[}8nxIFt )5Gq7>*B9ֺ%Sda+`+RlL۵C{t|zoDrīq&QC߇W5junܜ{Ν6Pj-aOU-ښPStɓ%8ϲdmo?-e]m(e)!@g"'[ޛ2˕a$^E#Phzzi<.?p×5>MHiP!)'|]jKڧ6SeX$tn<LNt?{S+'@)Hp ܠq"5{n'W&KzYa68')NI9qG,p+##:CnZ/W%(JM#+dwwդ]RkWg6{jbczOݹ[:itXڇ)ZݛAjjYTꖥ)yՕ$b\RZscsRm$q-@HJQ'vXM7I*]$nm3;v}2`:ølNp]%9lA(N>pY/M  A>`,Ez϶n\]%>&Ұ3# xЊtIM$}KϢ.''$#'$o$Fzrvu9yv-D\YQf[[ͼklۍ2B-'7ARQYC谵 YyuRH1)jFEBvuS$HҩpJruG[jR_@(NrT ( n55 R3T趴ZPSʚL3ʼnHG1\w.L :z%>NyXd)67'C(_9au)Ai9O!vVlKW^JFj[%woP?|cm@2- 2e'L`b)]V}6#:T-?4-5MM*eܜg;똺jBߧFvF Kie6J#TBgڗֵ綅GSdO:EBZp6;j baR$@#p Mv7Ӽ'r~jgU6Vht{U YȂRӏ} GP_ I\,ғ\/6xy>UmTI( "Z|/K#T.iS8伳Y7^9g~^ϻ8GLpuBMv2VCL"-WQyM!Xϧ%v'qS;q:ǟu[a->XnJQ]-% ?pQofk2Wi#85fUe7I;H[s-JOL$\8i @Z[;{9v#iM.1uMV J)JƦ{9 I[NyųBIVeR\ KVzU¦@m4y{GϪQ>'p!sꙒW#.:(܄Ҽ*zvәVUfR9 QM*Va8!m=z3W U-.1zY2ܪ4CsHqܭ酿wĝJA+Hsȃ" {KηIܽ-=zYq;ԝgn}^h Zia;TICO'<ǩ9=f=H\+y[=K5z闞JRFyr#" W\HypHtV5Bi}tʄk9}qsdm;O&tWm8k3 bkwԯ>,t2>U]SlSq(lh-:[iKD 2cq+Z\C*ZHN0Vw#5I*\I8r亁mƜF= D"C{햊CM"v<|Ɩ~)d|꺺(eGpW]Dȴm.F;>x<^M6ʧ^O$ lyNX8ggeĆ –/A+a@L[cݦ.L}W5inQɩq6idwmm֬ӀJ2NB6bY>xJs?BT'dc|.w8aSݿSZ%m0w*FZF␚{A;-O+@_(1IZ weTvkj́>?fcR\l-(`[d dl3>eeijMPn]'$TӀ)$$ @;6ddG3h9?8X&6?ݿ`|eCfi$zuweL/[4)N Ne0Byl6[` q1?g̝ORM7ؔRgJ@ʳ%e8Z~v3^xHv?UJ 0D#7 !.WiT,R;b [F*)[S fZWeI>3}HQVGX)F%m7 W2ׂ^:CvXRJץvh6[dwkìT6%gjkqmk P%Gxĝ|jjсZYh*B᏶~ϴO'{uA+Idu R%ǬW*3Qq?O/::ݬMJ֢rTc2eRpl7%X~B%j o͊h]_Tٗ@m@~() ՝1n?īڗNviKT:kT}PŠR ``GZeBQ~YÍZuiiHP;@;Fzr'O/BN^4S[V9+ ߬nX]1W&mx0\Y9%;lCVP?ǘ^T\T䬩+J=9ǘʫ-Kx<*^u09eޱoNayOSK>mvU32)ZyLkeB?m~\*5τy?f{rߛ+l0'ҝvpt8+c%)V;!I١ 4嬲wQm.5pָgz^r7{c4 ~ϩ x)T6.Ⱦ yg#GLrur+RT;+ |ӭs4a%,9<<jbñJh{:uV_0G L%%m;o7`jS'i#e$XDĜo4ӁIWXu=ۭ%`o c@N̚pgHu1HqIf$Zr!=X<ٮΒ}9(o?F ^\c>Qz9 j{G*>}cBeuS0ˊJB NsF>=j7CNFYy(qLu#\lySw zn{KZxWO&?h#۟^ֵkYzBIK6-)',i#BRFYF7E`0ȚNKFa01.!H1AB2ӟge\r)i=͆Q)@XP[bb;i*Vn B*rRG<#hەp=# gu) U+jQL< m"%p[TI$LyU}nuN=짮mֹe֨N&$f.! P+iaT}`OxG:HCClFM[gLg' s_]3l^K-/"k_FVvRJxsƤC-|8/9:PbH]bJ Rߋ%ݩ%#w璷}#WWy|3syퟎr~4n3p;q`EF4V).ԋZ LR'RTOAoƼYb7ua]h}io%jPj)k-*6%Ra?l}md%3)lի i*+R4$,)+H֭ؓ uuK}a+)-c¢:|}bNo Yg. wzEh2UyTۉP <4-: ~jvH|nQ%P!Ժ d =f)ꛉf`<)QW Avu"dw);1640; V!E ٨hd5ƦP^Bv9*`8qqKyM*S̠)C ߟ/;Z\m&b:\.Z"r2<Ջc9jj 5dͬd)'n|DgM4ꦪ-0Tv]q:c~~qcU!kYK'n-$}3qUs@%<1?GTPJT`ۨӡJdS_X&&xr0sr ܮT9G>GЪeTY;?enR\&}OL#㍢UrɨRZa`pˁI9H8=m\4`^-|! r z!&^kP T\,6Yj% ) EȀO%QҴj:g^vM)Ltidp'@6E|^Wd͚+WN'_(!E tHy'L{D׻lԟM:|줭_Qϋy7Cji}4Pg*"B}{k'o@~^QUBp^ǥu- a=r>Eff.%/< &i*H>:G$DD?{|U~Q v'K)BTV{TBr BJo9fIPcǨ/LY/T1C1F6_I-NcN l1!Ar B B!HBD!HBD!HBD!HBD!";}v;;eMKNjaj- SCN#lx ~gK#vҝ'aM\@-)QJ z$4S:Q&Vi\h-e*n] ʺ-#>6czvUG};E)QV~`?~b/%A.:njmH);8yzGRmHR'##ނ7Sw"dda3 4F Gr纪RZuO>Pz(4 Dv*/ ?eU |[FzLKeq1'اpDkJ)d%a*mu9S?ZCfh;m+GYNI8=wǼGEI_-חuT`<:*H|]RJc.4=}#B@Zp Vq%V?RZƺRMpUzD*ś$k)en8yR¡NRހGR[-:ZGP|¼&%^utIճ0жRb1::DͽX~:HTM T̈́ϡ `%= pQBw5dv|kZԹ)i0i[Nc. '7'`zvmȸ]4IdȾǒ翈d(g${,xAٍW>{RU ^AB2䥙Ј]j+n)f# oC `5S'qu J-L)bR&J@\dN歔hC:b맭*+4j] 8 MtRjK]IH B4u9!$lqb KH߮W}u(YN0J1rwMަꭃW?OMa)JOTv 0N^SzԡJ}p Ac3̤c=~,xC'vw<?eȂJFc|N8vҧ!A!A!A!A!A!A!AX(u}S0qG3Y؁XHI u@l٨- zlS].ݴ|]Gޛn6ʸ WR/S^/K7^=iY7iu(uSĕ$A9~qeي^i5Y7~U-vW$0@OUMuk}L\[;ZB՘@+I9D~M;F0e@AOoC {rRlŃi24%`+Q ݂:fWU@VG]5/wy}bܶo9\B8LCؐe{Vlа84n0[rYIT”u1SvhQu<wO9Y B$UNCSxP{y3J!YDw[ u6ZSFv&4}M(\[,NZgX8mIX8ԝAOw\s4T䟦c+Q~i ' ؔN`7{sXfw$419e @Ws)Vp @oiweį,? ' m%j'3$B̀RAۮR qQ@>kK}SSj:-\i wmRAHkE%elϥlgq!Gc/-fHrPwc~jZjv)nM{9r{fnKj٫3瓁ir.:n|$g7QI-8S~:V]7l٪488ˇ #"9*fZ?5bKrV hZu#(Vr1|<7MvNaABYJ8jR胼L8{{^xޫ|zZughmd1ޫ9I0s~:WkV,.N~]Mey%I (lqלl/ٵ^oD5fVݭO,Q._l‡ OPHoSիLWh>yT̜HT<@z($FeUt7gv]}aqg2:{g%d]U.0԰yo`R3\b]L1w%}Ih3Vؙ}hWIKz)'8"B{[[R<>qW{.k`qedϚG1p9?-c+j$!"B$!"B$!"B$!"B$!"B$!"B$!"B$!"B/ 0ץm߶wQڌh)Ph˨*9XGrMj6H)wK'$4rt83!tj>q7\L{SRs%@R0RGߔy}7.=]3UKraN.CGԵxs8%* $07frQqV[o<{z-@֎%ݸ=Ds5%3僶"v^e#SBNpA=y1-w!HvQ4N QϮbpe!yd]y+Jc+)e|BS?~qX- V979=Qom|o-(H5Ņ*I{/ZUPhft-k6'Z@N)e'l|YGU%WeN2efPR]OBG0F;$O@< ݱ-weHFi JQ mX P 2ᙧ;.6Ne^+ժUI,y="&9j{%m:2M( ysj.Z޴n=3oT%.ZZJO *9G[eiJ-2Vji$IRHW<[g;^7VlH5áW HÁ7K/%izm5m!ɠ#%8!@ui?`80J[9.6"<5ګ5zr*a7Wf̽xO*͔ܰWaǝY٤ ʏ~gl]K J maP6<-ƣduE**78]_˗/9p :G?iZk6tҒʹe> V߳IkhITU!FϏ('Hu<4JM d?SyCr]g+5>SE[8#;~ء#(uJzfN83n)O p VRPZÝ]%9uV\}(,eADpY>y2 DQcT%-9Vf^]!#@Nz],5&Nz )+\w bz4rHB\!"B$!"B$!"B$!"B$!"B$!"B$!"B$!"B$!"B$!"1BAQ*D8^a.6%Ymt/#"voW+W6mMi*DI)~ҲR xwVth@.3W=Q#<{;~Q𰜄'JbU٘Zj;`Rxzg&>Io752UxSͮ05J0@b,~ʿgjM`0͑5nRWTTA;)#I-[Jw!"9aBHc1ڒA `E?M=I3Dp<֘bg+wB^Cs*Zp V2!01l^v]юT'hzMf3OmZҒ (%3ž%p X8$r}(WU7G>pٴFS5cǶW7o z?ql*۲B$!"B$!"B$!"B$!"B$!"B$!"B$!"B$!"B$!"B$!"B$!"B!.S!Gp9$##$rHBD!HBD!_mayavi-4.5.0/docs/source/mayavi/images/param.jpg0000644000076500000240000034556512747716313022234 0ustar prabhustaff00000000000000PNG  IHDR*u6fQsBIT|dtEXtSoftwaregnome-screenshot> IDATxw|lOo$j@z ҋ TPDQ \P `WAlzԋAxNK}ǒ%n |?̇9lvsfFwm\!B!{ 95iWy퉛1茕:!B!UESdd4_~IX<3wmp-RQɸRB!Bb03YI>Y_=\YXJ !Bqc176'R'{WXW1d]T [F$)B!B45o Wdt߆W\g9|L:2. ݯm7IsU.IՏ}1^mB!W*MUiݸ.yu"\.fZ4fp*YgP/Ȗ*1m9F !W-Bͥi8].lvWkv<۾iأeGUU|h|n aJ6L!F'@s99^uƀpZwߔqUN@pk1&žt䃿J4U *;.4URbmsx劳T O6DzApTҲ-9tQ u^@纶B4x35}@Z#<]E-oy:=©?E߾P\tQ8 gʐ&}M{%;j(zq,:/> sVt\_FJh4YąJ8Gc5m !ӧ-{k"e_{._YKEFL7gE,V v/;ڪ?._s`#X a_an[ʨ.~W/!WmeHKI%$7OFT}c&#Jrc(Օzu QD2NEZ_< U8Øts#.V&܈EZ/o6dٜer3HNT}`l9ߟfFhhɎŨ{v,+i.bJc _]~A{ 5[Ӥ̙ هTALr}nj5-;T'SOӽY/N߷Ӻ/׶='ml+ZwpMF6!߈kv9Dgvt;o`͗guzZD`SB\ltJ|ӫ 罵8VE+m̻:yds S0bGsYyzja"˖"'4eP!]8swy~l ⹮_rmGPWg1K`ۈ/hТ#B`w3'-=Kf9wlΜA4i!@?_J? X_5 v{kQq jOi֕&}|D?QK87ZQ$I῿$[Aёοb#4,5i_Oo5fV^!i̘2TuC@=|Z bOZPzbgOpCAoؐ8~a-LA+~7w~H=ͿЬPm֟OG?/EGp%E4n'?ƨB^\_ɛ1 ? NVƁR&*Dg:K@  B!gp:Ղ9b&}_Z~?'ԾoM[Fl(0 Q%ۆ߾xEi׈s.?oF<\7Pc";=9ו~autțq1~mjx^]8'Q) "2_b1]S''^BRu{mgNUP -zw>~OYɴkZmǬc=T?:&|P'H)6w~#,aFfL skl9\MS^%|K!.S:]ѽ*~Quu:<ݫCkjzk/g55}K._LT7qԬĥ$}N$GB2: LFHQ70aw^,Sk@V}TZ6a⍷Ŷ\KˣB {DZv/k\>,WOOA)zo7oOGi\ӷ9 pBR23q4%О"ס!DmŽ- ^ajA5=6 Q!F\ꕿlˇBض.8w藮_Y& u[prʅﶿ H!_BQzk/K#٪hS?‡`1BT6s -8v&eWZ4Kn@[9&(rf`Nz44IYY\y!6HP5Q`Wa! +duEɴ_NTVͼ'*B!BQY2*O|jS$I!B! 7E!BQ}"bƜiZᷚB!BoRrN, ~{|RBB!B*e(p!B!*Kh)0Q4E!BQY zW=*!B!P!C*B!BC!C4nކ#1{պߗwsW!*Gq69U5׶UArZ.5Y"[{B!ʩ\=*MZD[vܓk)Lמ}ش~&)ߺԴ4|lIU80WkەMZD΢NB!*K{TeY꿌{xuFGXgwjy|դetZyYYYTҴ^B!*C!|J8\I˸\N^&{uL|r*WȘ|RTՕkagШڶ-4d(-۶XrU!٩Sxq Qc%!!YI|Su=>E9|䈧3+.x6f<:u]̜]1v)rr.8/oFF xyޫCw{{>ǧ֍;@Xf4L4 ~߱ݻyoCl~~-?~3%^_׀7\Ժ~y_K;voVwc-L2$L2TSJ4m6ׄ'#kԪOMOח"^cFx'-^1,=8Yf*\A˾_5];wl6ǓDZmϿ߶m/W0չ՞=5k1|;gn^kwvfLBXX5j2sT~Cח5P6wR\k){B1} k~c-L2$L2TS~~RW˷… \E)UtEQtԑ_FHpm۴*=:yo>̘6z*`_ȷ]y79po ٗ=s/՞;K$kp1ʮݻ,;oWzu됐P9Uk|}5mՎ/׭Ss:uOZ!j|ׯR|)l5j`gKQxydh>c:w⏗2m?6[ނ4[ϱu zX,s?i*ӦLgI.= <1IK8y4!%^s[E֕s>羝>s0k!BV!^~i~]w̬ٜsg9踉}AڷkK޶WS\{zW^g bKs ئ7KiP^ $$$ҜW%^_׀7\Ժ_Ks^yDyyޫ ePodI&dIʜ+ +3@w! <>=*ͣ;nEǮ6Vm^m,LɎ7m.c BQ[!({vߧB! BB!B#=*B!BjGzTB!Nу{*B!BT[V`rM ofQ B!tU!ĕ'AnB!.s!o{OIVBQ.<_^ͨbw~]-ʳ']~?K\ž l,+ B!%KTܔs%Y""Y/~[z$+B!ʭ_WxJ1*`$)W;&܊Q*x"㻌T-ΪnWbzVˑ \65cl>fڷ{+B!L%FE!c{O[!J!+RzՖk@`gi>Z&jpKQnB\6}Kکj4>:CDsN%s*jBWEQhժZi-[IB޶ !*ת+s]EQ "##ZKNN&::i޽Ԯ]_0qD6lh$44nחy+Z}.+,)_T=aw}D-x>S #|"Wp& !JyGחkZBԪ[>eigs=XdI}:w\dmF~xx' ]w݅_~j3b^x2cE+l b=͑nGciڟ[^!p3b= ͑ nBS2o޼\͛O?kٱc2dX, ą ի_|E'OvڤZ711prMLLf͚$%%U^!FMR3}tϟv}]LRmO~,_#FZnÆ ̛7  glܸSp0yd ;r>}:rwv:EQxd2Ѯ];vULY/O:7nd֭$%%1tPƎ[^p^1#eXB!DJn][޳0+ҙ~m(hƢEo8p Æ c̘1$**ӫҩS'&NȈ#8|07p7E֍a=zI&lڴ?\̝zB<7$sħ>72uT~wϲh>C:uTl}EQ0 |N$99yf=JDDCe֬Y#c&JQQQ[f͚K۶m9=  GB?}MJp/5+KSAuywHb#BuA'$gǎ|ٳ#G+oѳgOQ???={U\.fbԩ$͛7UV+W[nԯ_ߛ((Iɩwz6lu ˗e…3͛7[6889so>233Yn >Sܹs4jԨgΜy枋kժ9Y-;I5NTܠ+u$)+%id00N.+BT&*f3rH&LlWf<9sUUIIIuvoȐ!L&OζmxK\wĉ[[}:xJ=jԨQ,YnիW(4oޜz+Wɱc ӧs]ԟ~q 5s"S;H^;5)Od1h쵸B!DN^ʴip8~Ib`X8~xqП1c*3gd2nIMMeӮ];o "4q? <ӧOl28p`1d[F\h޽{b bccq\:uiӦѥKO￟qqi4ig#<رc9z(N{rw_~ ':lYxu|1B*/fѧOw^I&;qD&LP;!*Ne$)>O3jԨrٓ_~s¤ >,_|-Zl6ӭ[7222Xb̬YhѢm۶QFN6=zзo_|}}1bC-qR?scJr'D>r%}v8>o%'/$IBQr1z}s=S.&)"?̗bzqyBFA=ŋ9rwuWU7GQՓ"B+SJTz=QQQ|t>*M%!URܽ IRBQNm!B!v$QBxݪ?\!4$QBxݰJ"BrVרT߶o&qY) zU`Xe"Q IDATlܰ " py1ՙ!*VR~@f3N4Ғg+#|~ԒFc4qdX=\ej~OVjnv5jx[W! fB.j]ί_&]?Y^jIj׿nG.4,ag{ؼGoB&DuSJoҤIcs0:ڜdZddbN;B̺9^;EiCHEslڿjo@ӺRb6P\,)(YQP57oZxݾL5``ntwP_\ӵ'!7tRSY :O?_,_X)qEg3)zЛ@gj `Fћ@gDS k$īx:> !ٜGonʡ\Rb?!,~+;*}&*drgm a4{6U`Tŏy Eq*v{N:?/3ͿS~c_6II ׷/DyUXy;л'DбEMZD`!\BvnwLӉwIZ~r}|WC Ob6QQСw@t(:V'=TLqlNN\w( NF=ulkO㹬zzގM}7H'msvШCMt˴Ou۰Q,_P;OFMⅳ_T53w^Ũkgg4ߤϬר`1* }~ēx^D@M^O$ \0$:LxN'|J AsdeDzswGt:HEB,P8vvvbjՊڵk{eK, t44o >|8W^#enBs:8K8\3"n*j+NQ@Qp\hZ_Nǎ9}:^ݮAv[/3gSG;T!ʵwF޽ Atusl{_mp3IϲҠYDZ+wrGn}{NIgK,|}1MhN;:@ՁACQA3(-ZwiF#ap:(z;)1 CUz~gbi M;TV511 VW\<'Kƾ}X|!|H+bNP 3z . MoDQhz#(z'*Q1ĮY\L* Fe*0bS ɹfȔUbϜjJwvϗe.$^I'5eЬ{$8v| -B)p$!WWrÁr@{N6TVVZނlN+b0bCgeMyݫgrM(z#&?}HvoLEs:\YV;6[щ^pqq-KItNRR&ׯ^L6F3x{9QXBx"" &5 t'r)f3~&%ZlnZ=`/Q;BBɇq,B- Ȍof %ygG`ҥDǦ d6slC`x5Ul _f.~14Xz"eڿD{>"LO+_ p|~cvD_}ٱ Ϗ{m,|Yǃ1s2[2ᲊgC$S к01~q`˛ AĪA] )6v+j8]Nlv ]E{>\ tM{&Gd `M ؆;SW]=۰|ҽt]W_DESU66[=%`1p8eOT>j k$""^$1Ԩ@:a͇1yezc ^4Y|;T3| :Χ\H8е\BzLL;IiY茖b^tXI(xkn7kC/Ȳfe?t*Ix٬Mc1gXyz7䋗v7\8 -ky'\g>W/|a ]>y\NV.x_3=;߽kDx?:Sl,/&[c/xFC0՟ ۏ@b oNܧ+JbR:3=# AU%ӦePi׾>E}z`bM:{%?%)-/R;.ڼl"߽x==Q!f**#,Z|0/}]2zT4 ÁQѡjJ   lCyZnA>]Y3M,X0:k$IՂ" F3NӎΦG@ӣi*Q&\Wq<1#qTUUq\ZHp_RnQ2E*k[*8tpĥ'x&˅mXJ;%qMeυtiy?L>zTf?_#]zM04I^Wܫq s?M:#pj׶+.: 3WMzvǜ)ch.x5x` ouH^Y'rCM&⾆֑ikPtY<~٣yo`⫁^T'@ fUe]APk.~6ٺW5}k8^, |JvJV!,\LFOVV:|bSQ<['i=v(iEƸ(AAA8*gh"&oy'&Pv(Bmxy}޿˱BᰣB4175EQ^/NǦr:ݓ+lcTUp'*%㚑QHeΤ8y|71CVs7|;:"p -p7_[d3\.]<MĮ80*;^a:tW\@åM*ES.ge'|02 FyOTO*-a.|6>j+_9р qɰ׶:߫?m;NЌе9D]1?f羓@/x&= ,>bq'1.+' U-`(ڦwTz̏~JFi$12|/.CO:@wy.gz_?_ #vzUUq\U&9wINN 11 ́l6Qnߞ,Jڵ-^&M浹 QѼح6PhNE׬iR2386;Nǧ:@ZEWMT.V-jL~Gu)9 Q5z-=gxu#"&&L\׬ _Be{iR^|AV~6R'lwrE>7Ȳ:X⾋QGY: ])qdZ<6+($~I@d2A )23@giVkf0),b%ԫWヌ Ԉ_GCeezDOjsa^ٔHt/:f X*몤~9ϏGOh. z{=ª׮=8v}){a̘I(J$YY66mĺ}[oCs'V,N:]daY4ˉ^g@) #++݆n{v:iA9NG&v*M UAPgXE 'b+U|J4lV濽ɓG(J'LlA}{mW>WoeЪGP/!/x(P7҅ց>&\x1gڜҌ[\LF . 'gU!C3@d wo2+xݻǏȡ$=57<9DrM&{LWgd_德xz_ lMMݯ|],ZoG+GE; >ڑ5y陜;L%00UUlBtΜZnGP? (՝gIMMv8*O_ ..|inp$x=Q痹uB4tQCdrϳkHLjpذۭ ݹq>RUݫZa~~9 }ܱTU5>7"{5bogy{ sEW}p;ʠ-پډE+wgk*!jc/xKQ}=񺌘&_VLzjTfV% #2!8}$hJ^gY؆XN*SXz ga\¡OIred!nRhT'mh;>{!-')a+򪌗}}u#.Rˈ8 \}>qI\eﯝ8`4`3_ dy0g%y˪22yc. z>Q-obHNN.SdL?8z 6fe]t8P5 NVVdd'ݎfCѕ׫ORR 6р -- Jz )d{UHr׷k"0( 5dMѤfXyoTP+՚Fֹݜr},#DYJLRN}4wR*ᶘ'c_?|'ΞCݺ|۹qur\:C\ hss>"douQUOܡv}Loy;Dgcp };^GV;Oo~S/`8 Ο=V},xJ6˅huƎ*6.Z3P]) v1)WvzÊ=+z*>QQUII 8.Y1{ N'V[zM0L] 11шV>g/~de9rкu[TȦM?xM!n~j0̡} 6<ʁc$G?^IRq1Wx$pP8̏;s^R}%&crAˉt&9POOu*ѥ4Ǩߨ%'ꦈ*dwxwJYoyOƅG:t [.B$*B\Ԧ-.ORjvM@4MЀmr`nB!rrW0MSNG+01!B$B!ڑDEiĝ?%BQ I"UF4űr~IVBQ-]ӟ8uAP@AAS-{r`XUQUUhP~jJ4Ԅxjm@R9@5ͫiB!\JbʢMVYPEQ< :) :E[Ul!*HKIe Fjo{vϑ4dE!G%*[la%.fzQk\LL܉ʥޕK(;iQE(J텄+""={`6OpRRR馛8p@ !))ɳ~<<ꤦ2g{Ξ=?ݺucر\*WQBjPA#|pج &ĪnB!D.vJ=Xf aaaY|S%MRPߌ  >~,~}\t gܵkW>d"cʋ/X`0j(Wر;W_}ǨjG? hH`0^uB!(@^LߣG>cxlْkݖ-[xKg! g" <|i o&ߌQ)ʤIxwQϙ|7ڰa׿Xp!wqG~Wy4h^F :kz8f̘Aƍbu.&MѣIOO aɒ%DGGA^ػwo !Bm~ׯ$)L 0w=l CP>^Ld Q۶mbչZ:иqmgՌ7+Vлw"vܙ &cVkeΝKLL 7ofݜ={ֳn޽M6qa, fU˖-['Np-0qRB!›9s+I)#OO@]:o28يj'(@PĹ]},֧L&M;3kقΥ IDAT 0aB1zh̙C۶m-l2ի㉊M6L>dO/yQvmxs^ϬYrkDFF˸qسgOKSKyk !U]<I.UwŲ9RۏɵZBp!)=z@믿ҳgO֯_Ohh(:t(6x &L@XXݺu+lPPfb֬YhƑ#GX`> | DEEXܹst)ײCr^,U}Q}-nB!DU{3g-vY;Ǐ`N@tdfptZ֬ωDՊR;Ύ{֔MoPD|PD~bMQIh1{%!( E((ABI;s~9gfwϓaٹ>]v-bĉ|MJ|3 8O|SNiqBƎ… dС,_dСCyG>|xqO:f>;K`vݒ (xS-olp8{.~wE @S&x.7?>oqGp7l3[Ѓt8iψFVam]*'|2V{a|9N9~q%N?tx֮]K\Z:(yٳYj[laܹf۴iӘ1co&bL>׹;ijƆ:onmaǶغ[]6p8=bǺͼodf RUaKDE/P@Ey]*BfΜ_]c=|s9/>W]uz+]v۶mcСx,^3{lZ&L+l9s&-bɬY>+׸+ۡdzޕ+v8p!TM!@ 2 hA"f2_<_EU4mu=\=^7n8zI&1iҤ6?'Ͳ`,Xby̚5Yf5p8h/=Bv+g9p8C8p8G'Tp8>*p8c p8ñᄊp8pBe7)~g3v^2m~s8?$xi6_cVf'N0|{*q> ,Y𩮾 G'!~/v˷/X n*e4456DVCH)oSOOwϏs? k_MK*6ߙ]p{~'3}g9_xsTvŋdytg)s~p8c#|n1B)AH~+A Ѣ:O-#B0uT>J8z:K|/p8Wʁb1bA( |#yT=z\^2nn p8O*`O !f5oz̽%׻7]/`Ƃ_jVy{hIBB_VW_p8z^r9 G;v젪;ꨪ`a G9*j:a<~M}>Ƽ')s{/p RFDPWÐ%CtGW_p81B,[38?CL0C1d`֮]ǐ!ʹuWGnQ\NgTqQ2) _١kJ+@+RhKyXn+U9>L=h&9f_Yˉwp ͨqH uMJH7Hw;-ʄ x衇2e K,))B-[ɒb2jou?_Z8Sk{Ρp?!}ټ?Ew<Ʉ#66xb^k[L{wQ|љ|`4#c  eOKw8G[ʒ%KJ=!R֮]Da^k׮3L{OoTQ#Xj{?b1o>A5U:q>/}֬ۮcy ?iVƁ`),_zlhds@A7/_`G}7\~*Օe:q9/ĢԵ:q^ B)3>; >~ O ~X{6U9ǿ+\֥?_*qb_U[=8G)\0P %Q a[C45~_8DICD$P*'eq8G(-V_Qʹ̏M>.\{&ŀ<{nYw7˃<7)^zu5tTGG'2ys[,kߴ ^[G~4ߺIfYG1rFZ|Z\U[=L nK\ñP2:^d u r,%xPUiH $eNB~]9Э $~wIfԩ|I,wvb}ذ?Cy>ϕ&0?4|3ŝYo:~3nZ9ȝ ?Ё_/aޗOj3ؤ9W/!F 8 HA0rP`!6wŏp8^D*38cKK_xY'D?0>HJ wkhNGT XXn15}rr+Ah׬ S9Kk[i-y\ߪOdH)yMz_kg7guowvںܓ(qޥpPkIam_?H|a9$xj:rX {b½ 67?NѻB"rJ*+wsإ/zJļؕ%?<,7;m^3 W7aw}}Xj3bY4V[:ts>_\{c^-4νOnvb[Yx_#>=h0?_ohbͺm;s^u;'Hԫ۳WS8? 'P|Oy}"rGG**!Wl29𳑻yJhEܤJrXtB%>&?؉pt.QSH))(gժfok]EebGcrD;3}撟?u?|A Cz5cvOy󮼇5s|S2/8~]oG/o9g}n<;RJf|v63Dzǜo dQc5}nQs TE8|C?U[׸{=;pl "{^X ^䒌H$_D$ -CK($"S`Wp81qO=ky?qY^ ?v_^_& I CP!0> G6A!<7vO,~Wq]}[g(QJ-[ "䷿ySN==q.~=?2?tBX6}5O/M웫gjkkwgW(U$6d3Qؖony^2ĔBdj'v'i/ ^Ar=c:9gbmǟpϬ{|YQ<puo\c_&w%8Q )!bMKn 0%J SnF!6 -Hs"0LuU2^">x)*zP]/^m_B#z Ӯ5wEW_cpֻЧrتܒc¹ . %ּqV0 ӹ(V>+Fy꜡qe}r8cWqBe7rT&DbqMfEy%>ϳ*q8$iOS7'%2l/ĉ]rXNI{wv9ñ[8kCkŴkKvL CY.1ĉ DR5"DR(%F=Q.ϖ2)P$@ nV>p8. =k]}N{QIrL=EI:Tb|Ter] ̬(RAء^b.?,EK}}otCw9ñ sW3hঽavc 5RR8P@j hB&ղָ%xqLTjYX'f̓ {WMqBJҚ4/WB%߯{Wrt8Gϡח'v8z2<) oĈ.l;0IR4QK9(pɲq|`qS|)}45w޸N Ú, ~EwgЮy(iqXgDNJUV]j>NőtQ(&5zQJ#QDp8%Pq8°(+d2%rO차VII^(%P(v.T[]*qIFf;p8=*P2ޥHԲ$J9*&NoO bbSּ+R1')8GW!~&K;p8>*E FXbJȩd*7c)^#SjH ę$K[rVPFaM윗(|YG7BȪKMU B|.prPC,Vj=xfݽ~-555lڴiޢ}z3J["]ErFL_o)") fL(f) HD/΅%LpB;~#ݒ 4GvR#zbwptN~~O1/}2~gb>c38ND(XJRO -)bWN-Zlr~Η }JXi/:y^17]U(PA$FlEGXdPa0)焋Kxl28=CL0]@Ɲp T!lʉ C2mf9|&F w FVU+:]w˖-cǎ73f0yv#E:RJy O-d]W3N-RtB}ujצ!cC$iY. BZq|ݙBr(C=B1)R-dJ.F|.)vpaz&Lࡇbx%x.?po!hh .d̙L6PVVQGnilldƌ=ѣG3sLK[SS}ƍǀQc=Ʊː!C8ù;Z˗sy1j( 9úu_x1~8C aҤIˉ1bz(wڼ6AP(;v,Çgl߾lohhࢋ.2^h555>~w#ѱɿ+"g!Ѹ!%`d,dl{h!a󢑶T-LTB6I)F)iH3IA))"Q' *, sJ*qV(qZDJ 0Rބ#'(b .vpzPbewD D# aR^xns }?a!2l}XhjjO<guV;oVs+Nj`q8AKe H+#aS>LJ!ۿo!%}gܸq#ls^,X2d .{}ϟϠAryy9.6l`ԨQm< &M}r'7éK/套^2~_rw#FP]]M>7~}mРA-Ύk}ttu_/`b根Ƣr[y eR$`DKg4IüJ_ BǢU8W+eg?#TnHU:R;)9IQ.JɦK'9%NZ "J>m}i+N8]W ׿)HbN^YRJ6ï^ pw  u1fl߾ h!C$oŊ;9"fС< ^zo[ouݽGGאe!J:$Ćv2^^^)QJT2[KW303UK"<]ALiB97;P~yH!TKMmc/:4ٺ-ĵVuuĢ~tEm}\"s^%Pz]Pvp8GsT4{Jh/%+:V $s1oAv+_ ַXd 6mf:9sn:֭[W>Ⱦӧꫯ܌@ S)++cŊp9pW~z֭[ǜ9s}iӘ1co&bL>l ! IDAT?쳹kذa6lh;w;r]K~UyPWu蛋qe0K9,% %!^祵/Z IGE8% PNJ!Q-S;rQdYT^hE*Vk9+z[VGΊT9+}Z7X;w=m4ԅ!mȿ]8蠃xGѣꪫ _W2dGy$Gy$Çk)y9g?ȑ#?luߛo#Grgp1Ǵ\}ߟ;P(̙39c: [|䷄q50R%¿8%:K,]L 3()RF{`\tmyK{-RP^e8 KRfSA:V2UD"2(v>J"K Լ)Z1;Xq8;GL!SOy~G<ٟ8,^zC'_Kq(^u> /tt->;K45#U8TAM ѲՐ!RJ~9粿#3?C'ed۟_7W&ϼ')E%=/D7_'Ma3t9΋_]bltW'K t~M mث-΁_ ^Uhj,xqQ7ODc"dO%j-TMe/L= Ȅ~PKOeu!=J345g00`mǟpϬ{|YQ[l5'RΝ͛Yv-W_}u#).W\jPȠD50;$ᨤ*~{)wO*~-hG%H馬,ܔ8y>ݴҡVU)#Q˄}U\d:NT(l :N8z4G樣#_~̝;/ohȔXsUh1]iy^ { v'}vG Ut;˚$L5髩-NJTyb*1Zd8[E,V҂r`_~‰Q^Y{ 2ݜ: M0 U+&FLGzTPB/*d\T50*ݖu_+PQ~eUDUUKkЎԣĕT.*ڦ] J{qiXֶP_*z79ƅ9$N8G;oNaP8/$"tt/-P|f /N~27E];PHy{guRľ+9L)b=JhAXeh S*?"- 1#i R-5`^BoLWCt]H@1a\V%R:DXC -$Jwt;ʪ!W  A@h,Y'aTK%zRN|:V"o&[yj׹0Ñ ucWE VbR-@Ob\/,!mzy^'S-P8kn,PV{iq*w%Dj2k%էy-8tڗl<%C)&^RsTIʡv+#ƅ~9GGua2 K(lhy-sU\酈rSjiOQT ȿ*v7BY%xQWAk4z ~%4l~y$BL$6Ԉ&K_uN|;hhCRGZj._p8p8&~c/Qw&ޥd_qYRBHzD,ƫ_/(+ĊÈ13neɴX-%Fb5e~O!~Tu)!,q3N8._!=-SE=- -bn VU72X: nP^%TlA!,nj] G%4gM.9-XhxbĊZt.WnBM Gl?LB%d$ddtӃ=xP'a$xQzЯTK) -gagZsR85h97!P$\HhuFFy`!~#3R_ S"KVW(#_[%'ᄊc& j.R8x?<{uʪcӥ@"K@?u"O[-\t8T5OoSSNL2k9WQ|*$Q(VYDJreGJD\2. PUc+@ TE⩩O(P[NvDݤ*]8_q#1revlk7֛?ծt3_ڥyo|SN9Kg t/ HBҼt&:6{<m%Fm/,ˆ͂seGrGmĕJ_)!TCXݔHMkYbQ";i *CjQ͋WN<< =2Bڞ.0껦-KL4D">>E|i$Cv=ûugPB{066nH 6@xG\@P7gۺu+ ,fժUTWW3~x?|;]tI|o^GfH{bEUb%==0u0z;ǚ=bQxC6500ɂku+G[r%R,b)XIWP ?QIX!cFXgsں5WE/[N*PsUPxB~&z3Wf~?)dM#VDhF rB6=MƘ1cx5j6m'n F.pRE:L@}A'Z~J9$}c`)RS.Nпj9Rh.FɯZwo$J+y^HQFXB$IVWIWrQIz?akbit}U+g^(0LNDy^F_/z<P}$ViMbwbŘ)R=X+,0bţ Md#kڏu ƸJ2!el[PQ)TqԉnjL|Inv4hgy&gy٧E}իW#U qMM 6mb̙3'|bȄ [~:YeQ絣]-Vl#8XSe(M2a%\E5K"Gٜ+ޔpUшN^OYu d}AΓd<)'%+$!"(WY"ѮEJZvh>2hWE;+E|i Ke%JƎN2̄4H>9˨.+6f5шyc93f׿]KqF#`6md?OrE^{crW.\+Ol}G um^{_  01z J#ڹ1l]}ns><:E"!4K5 h΂CዟPϽLۤSPńLA!-Xep.o?.Zĉn=}:[Mٸ+=/sc],Iϫϻ#|27=Ed7ohhhhjhFD?UkMY"}"}E>Vk~5ӏfD40R v0 c+p0-d3~lb s풮 FDuuμ,mǟ?~ƣՔd;3o|_7d~̞=ϟϠAZ3qZyy9^{-'?׿5#FD.5w}f[>gĉx>c&bW%Ѳ0en Ph)RhI؎Js1?ĐrTԊs0vp>q.y/GK@HPivSԯ6P,3^ҫ˔~ 1bvXD0imǺ&(eiGE]z*EP/,eIRL7WaɸnW.e wI$&m`yj$J4{.l׿ )H:* Oi0i@"GYj0 !7V|#ϓR~L:x5lذ6?y^z%Ⴥ.cƌ)yի9cN~: TTEwtO -BȜց26T¼A"E7aa/P0҂x61p晑h}n޽ʚ(T+~S%**GDt-SS}NYSK+J,kQ [(atYF~͔$ 8ɉx-P_kp`?m4ִ^PA*{PBɔy4&R=qy,g8hhD!}زyj-`ر,\0!2 TTTq_)S7o't}a=l:t(˗/nqСCyG>|x?6d2DU՟/3m}2joJsvRTk!T:D.#\r<,  ;Sҡ^(0n/ٟ7ՉRoJo1~DIcA"S^-K>kX`.ZG7D(GB OKbDT󖫢IbI#鲤ŇF/'yL54ukn/.G D /{W6¸_:w( ? N1i44'i|~:<k׮%V\Imm-Gu}{7|3^.@yy9eeeX3g&wy̞=UVeΝkM63foR,?;| ǾL~]$t,#sR\JpoUIީqSԱE d$Ze[2Ρi:gMPu hml[Q8, _H_;}nKIVR25FDHGJ/;njCȌ+CZ">&3O}ΐQkpCTAy|( 5%y+ BDSJDUԶ*Z6jĶ*Z>@{zQBKB Zgl^#r4,}lݲksO;W]uz+]v۶mcСx,^h".Ro0|pfΜɯ]7W_>9Υ^oϞ=k & +4fΜɢEy^$X^~K AK{Kr'U Ĉz6DWrM}L7T3I%Tó4G|03T/ TV@ S) z IT2!U ^:3^,@|[`x8H9)꜡1xiRu_}utOIVrPe3'*h%ck)1;=mL!dzI So B:=TH]LX"%l00㥜DR*:wvWN#1fK "O0NEb)qQ=bW2iJ"QAg?2E0հP%>f9#EQԱK=ڷ;ZGXchW(u/stxʲqNEϓ':K|J"h_Ă$+Zu%*jݴȱ!1;*ñ7)Q=2-Rt~f'nu&ڋFS%PZiq1-R"E D(A1vUTۚvKt!IcrPG0թTO_H h'BQ9 D|n:q"E;8-N5*/a_7NqBeЯ.Kd+6P_"<&V*&A%)Xa]E%J&OT!45TJS~w[MiaѦTvUlBF9 (E;!E,Qz`yz Pӕ`B ĸ,[ݘR7IVPٔ ҡ_%>z8!zRǔ+Pe[{Tܣ>Pq8L_OASq42(Ybby| IDAT(TUDhvnlDZ9'H #crX1y+AgJw aX1QyкTkjMmBLwl7~SUF7X:%TT^YZdT0"v . sse*virTH'#Rֱ*5xֺG8p8A⼤!xa,\X#`jq87iblԠnjKT&AQ9(uJ46bMPs#Փwkh7%ӏdhci-kiW#Rh%Q}V+"ńPu=xK7*WMщb][ëٱoڗM/T(-T<"¿ :&T-PljCp8:%b`J/49'3ȅ:>!T#J,qr!V|%THWX( E7!~B`r8λUۃ5JP&:bs;RUQN a/<չS#ܔЋ]sLQ;,}~{ #_!2zR%K5fPԲHg%hbJS:!CEĴfgi-N'Tȗm< )uve -Pl2zPtQd8jh-88 J/j^Љ='[NEHRB;L~b.iW%-TBΞG07;K'y.g]!qPhBnsǾEU%¸p)+F.(Fَjh?a,pLU0N!${*RPiN8Gg*=T2C(%V_1/[R%kczxϰzLFnZL/Q英@@1 ~~z4VI(׺ThL=Mϫg8p;8҅1allH޿AlX _nN窩i ߴi.]_MM.p8ZT1 kaWҽ=V!^#%O ( '<0!Ih hS\$z mQ ;:Hm:^k~D{yL6,!A͵v}L= u,BJ sI~镦i =jdy/e6{- $bގja/"KE(Rÿ*Js 'To׎_u4va1ͯ\WD)G4~#!i\p؇ԡ_Z,W9' h rI>5$c (TԷڡ^aR4:oRBQ1Ή5-)z_ocM3Eft| b>-G>g~~"j>W֎T$z/m% Rg.녧ZJ%nb"ciG5ѱ3.JRV,dc**LGN?i]w7/^ N>Ǟ!o#mCůQ M³+Ǣߠ'3>T( m&L 0U^5MM)WQ!ב(:^Mza GE;6·&#h)(t/ӿ&T KdBv~/K ]̙} JNJsIQ_F(Kq0b -DҮ~$ӫj'c[~m%Kh'T 2D#}O 3ÎSDYjfF#_}M7ċ/ҥK۷/g&s7pBA|E"xId~:$ӂEc_kZ۠K3'>SĝR}nGf+a>JxyV$o?'։:K%VԲ ZEJGÿ_2t'TQ hMTW[ܶpg<ʪ([MYjNgyw}ŗy&Nȍ7H.c|套^=lvOG0+_WD5Ȩ--X O t6rh^嚴'(b$!F$^x^DiMM{^9d*N +ŚjaN;*xxxxH&։#BPLtXYc K؃U"H8GzsPMB|'x|;oc_‡vJБiTSϩ]f8$ĔboQD"E=:_@iMt ."M8alE~`@!LCnݟzj>:au '> n: qaGG( x/dQ]úѲĊAqK[cm$_DR&f^^2bJ)F}ɿt#RD2a>-Đqyb4GbBx24h,q.-*!Z":%gŒSrv>_ӎ |Sճ]؈%Vt`3/S͏K m yJ'sWDZ%V։VqB8҅TU)hM0r?7z4XΊ-p /  Br}e}СCyG>|x߹뮻;ꪫ8S9ďpH U@.VBe54fuLeBޗOu &X9'Z R(B)1^iJX/hCЬhƣ(<|I8H$>H=@H;*%Nj"+/?p'+~\z饜p ر%;zpUXpҙvT/!*!JJ̛-*^$CBTWjP0 ɤ{OK(1U&~uD!^TI$RGQzxhWE$QLΚ!CaܔH4'^4ky 0HZ{fTx՟Jý@ýԴ",9Eu"L6pasRt})35o?m8㐔Q0wNEy̚5Yf[niK_˹q}GϠ ~6. 5#HnK[)ZNJ6WZhd{X8,? B9EΉPIPTa_MDUbOǣH>H! G Q.J$R>YTBE!J )j345\JBB9%3b=sTh9(H*xU4^9 AD dD1dQqD&D ͫ14FC܂1Ob| . TP 0l^>}f_SU5էo\O"_% XvT6>*PTavN]I‰KJE`c ?9QeuB[Y)6,XPQ^THO:WH镹뙩`PuCa_wpR T*:#Jl "0:R9*n͂P0@A:n6d9*dr_] r窸K֗u E6;J)xe8kUJJ;AT3w2kF!,enU 0-.y\Ǭz.4MR١0= TYVKQ$h+Rh+CJDԈ|,e@ u45zh 0bTj>+KN ~B{@IT}Z *UrPjL$BD?mDRpQ| c*J(ޏmh .骔JiE0y[ϰ_^9χ*PTavxd \Ft`ȗܔ#B{&W;eKuWНuO`=._\$hb!^.GuYdyD'ԨP2GEIU )}JmC<3^K P6dl%2t"*a*~xu#H.}T,$hK]p%a[}q_B"L9 mD_X/kYi*PTavx?qwYO5wQ~1Ky%sbw {*sKJ!ŭBTf)., 3 Uڛ䤤$hz*]#+OhE/P˞ZH (QȄ!}JӀDPlDHO]4L$΃<79Pz/M|Ŧ8)#&qWD =J^5 TyR ,20lr}Y? wHͼ]')w9>Tb])-)!'>kCbYi_d_8:nO tDWkzZ>?% s ?|0XPe"L1lKAeoTKjjQ8'?Ȝ"ݔ%+g9xeUU).J.^ԩŴ@URRG!ݝ-$e{d<]fWT/[cWv!+nJ*7eK'yLV2ߟAk#KW9P/8JH4tX@HMvX,#aȶ2/!%$ CTM2@>f^M Q &K/d@l%ؔJ?ͅ~9(P\lq6{&3J*jGh'˳bw ݕpqZtxþȆKPl,?CgFۻmW RrGw,*./J(S#&IwiJ UBją/mhC%礼qPA.sI0Ίۃ"Hϑ@^aFDŽ XΕsP| \ &Tk @J@b#sw?) TFP**U:l [*;[j|7縐J꜖2X][K^y򻒟!?;;HyR;kg,tThi2(EWjYf,]гyJ5"j&K)bҿqxt5T+TL~j]&u*Hdōw0W\X1XTrp+̯CXP2r)Py\ؕ$|\# y8A,G~Fawa\tztSJD}BFXe¾j0"*{LJ﬘/QhR'gJ"!%"x#JH $8zW5WXS,QY}`}1I)Jf:.<-(I0)\Òľÿ*~ i$Ga*q q')I\"  `Y' UcWt5|{Dcba%BG ŹU 4pb&37y,KҥQށ&i9`q>_ q۰/H-KQB ZҶ!+1P5,tcXHQ& ,&!J|Q,^?Kt*P9x4 B~ʠuumQB X)uS,k+}{u zzxXf8rTl\eb (yuؕn&7COétl'bXIu欨ܘ b ;(ZYkPXu1NaVn)WUr_ m¼L>JH#j6+U!DdIX * 2ҐZ IbCz"쫇$ 2cddЄzyP~=UrphCjlh_ju@t 'eŠ|1տFEP)‹**X?Uda`M>=u؃J^'ILU ܹqdbbv~X$ QP\p~.*Zjڏ,ȗT0 ,XXQV4Za!dmX| \>/C$u*P9P圔ʺ)ؑB"R먘=jԨ3` &+a_^Hv!_8td@Elr*+KDP+%Fudqo/ T-ueʹ@C%󃠥 L떁 1n{Aiq[ IDATeyb?A)!ҏ5V:(@eÆ s9#uױnݺY}ƲeKشi3˖-A6n,\ϛ7E\uU,YdVǴ?5* )۶m7yᇙ3g~:oxx ^Ϊ*yV ?x-Z46ԧx9Ӹ'N9-[gwIvڵkYr%\p;vsS|~z;8>h>~n9ꨣÐ%KW5ˎss5JZ BJ +Ry(*'JHPf^.BS%Joo 9*r )S8ID9H}_lFBJJtIGG`qxXiSVP:ZY04b]ti2MBJ9Hv>497'\Q\2ML*ũ7@[Ӧ1z =M] :1itЀ ʞ0_˖-ebb<7l6R"@5y ]tw}7/Yv-ׯϭ뭷r 7㏏~opWW\|k_/9_|_0v7pwufVKp. ;6+_xvm}sK_Vj?}CCOؤ}k~sя~s=,]>w,X`g0wT:<:r e>P"_EM?OQ'Ӈ-3>óR;M|[9*J@y(C^VM_(А1TR]S' }}Lh8@}կD% QAJLO] U6䧸)U .,03@ [Q\Ծ_ &.h:@2X9sXN *y Z ](ܹs93G>cZ~;f7*+V^eq46n>,Sؤ}Q>ϟOբj8W20vzN*>jDm}MwZzYgUB,2P#D]1MbӻL:*} ]NQ=B""01lI*`@{Ȓu.4uH/ EGA%]Wl{LP؄zbw ̀ ivLX_w߬N,f47²Q4w$*,OØ"|p##GhuP Xy衇߭hr~ uy:sc֬Y3we|rzV\[){RkrW!"x|X4 uaK`cy q+*G݅i&FK.dl3?|.b8; .ϟ?kV|k_˻n~an{gW6mD$.x3Δ sv;h5%g%_}ltgnCnX{Ow;KrjKAhsTPnLl>ļ]\ȗ,.SZϼ{ߝJy,GU`<3a^ -u" / ?*)q}*DnA-HCB-(EPIdi ={f$aDӷz0MRTHS*%KB1 6Qg5Ɓy8>s?Pv1IJ 0p)SFŷ #0oZl2ٿV& !E<f`:Q9`vyxK2,]A_YQ򄆹aslb-[ľ\vvp]a**U[J4kAbp@R `go%PJ R4:.Le0gkDm _Nk}*%01PPu븕@ ,/x.|ݻ,)&_YSI>,tEWwdЋ뢅htTR4)=bL"+@<-oi;*RtF *fЯhdܱi !1LGYYH?{URRJ36 |'P:+r۞oEXQ DZqտl<73  CDsM[YйD>Z%  5LU3̓J4P]G~l ssN.`']C'0h mW 3xPI1Y4noO>?E$Q4p̭)sm)e"k90J`\pSf T*UTi7:?[/ 6:V 8u*s)؎g)T2"yf3ֽ/@Р0[w^v#{4-44 r.y>"E=CkǁsSDwQ \R"Jv{ZiR&!%U)=uMbLNsRd)x 2n+J=)A .\."Q2YUJJ* imól>2U!cZ{-m8)dk8K]bCmvh{_d=wc +"YH8 QpaB uS.2PAe]>OEeךwU (Uq*v% 2iݔB 8*8PQ@E@?nYF$/A.KVFi Jx;vr9V ƄphRzXH>t:R"jԉmxO-hJ4ٗ$.A3l3K bW RǜWV**U`2PQ̀GvX+9rSRm>ہJl_{XqnOU:64|Z{A_eTQQc+cskP/ (E)6J`v ;"CT WSq!ni*@X~swa_&DP%U؊_Q -h$ĄtHޒmx>U +}ȿe9)E H0!` `d&]Hk@RJZ'm+'E)E25x8q%5YWwLu+ަxtvW:.YӶiPWN4zbj+s8AEX)Q{bABڥBWH""+)XNv &ӆ!= qיe*~J0L}3AEy21cKmO?S˾6s5JTA)n3fG6f2NUq#M5"J*UړJRR;` `)ְm~3I~l62$ ; ɁpXHgNт%tsC85@A(QaeH8 >1y(|KmqYK}E%85#_/Q%#(VLX+lpe^]mk҆peojwAŰ}PFKqU^Oz6qU~.ˁ@eWUJJ*A8UsI!f  Q#ҧiB~H-SF5v`:koZ?F>K>^\Ⱥ'X@Q  ?^.>(L bxX v@ď"$"sS|s'9-Wڀ|V֗O0X*!=Lm<=sxoS|,{Z?%˜'\Q e6IQܔQB')W\Vn|O%URRJ{ZsUd.Hj;Tl"ԍF2#R ĩOq~\G; #|89+m,9 iqX>$K4xm4!^s@0qqQ!]Ra *%+1|A{W]M!4׍\*lBY-u!EtTPK1}ϥ('I!e 7}'TvO1+3m3׿ a/T=anʰzt& sPF]YH)@'#+Wf-roYi&3Ri]t)P?/:^pd>9 [vw;ЏҾQɒ۵ DwX=NuZb;ڴW7UپrgGmv>,50KۅLM$Lj>M{}a {\6㱱18@4J԰,<"e#ҋ58 f[U' ¸(`]S"^Szr}7JTޔiR#K/sS4iҥA:аݶmato+@2Upm8a5Ȼ)e0R$9?1eEeVcS ;¸*G8JU9*{@#9wV-XK&#e+73z+nD*RRC^i`Q΅Nm'w\ "2BbF~NXP:/JkI9M68dP3H[@ԵGtLMxm5Wy5A)eX(:*9dWȒ]ΩhNJD ,M,`4e&#^4ʋQ:*SRQ1ΉB= m^IkFX8\|qX>aW!L?J <3 E,sV>Ÿy.We 0lH7J*k: 6p‘ۆ F*_"ξB>8:/zsx_/gbۊ `)]VRwu1yы^׾=*UڇjR⪤}SaIb(C9(8P qbIֺ0mv߰7fƹo| ͅh>DsQq ,u@Zq]%E-xA -$3Qe͏#oȖwRJ1Ƽb\O5vӶnYq.TBV%WTln a Qe}*n6u>[U1ԯCT֭[u]ŋx'|ݺu#;NƷnOJu2wFjj+ԂN&_W}ټ/[n//򗿼RJZ΍pthI,HP|(BxRe;= yhfJLd4g[lO|U3_ֿnsVl?ƃ<ޜ]m`2n#;H)䨔J0 P$w X!AR]#k;.2kPkuSDvD|Wy2'SӶSf_OjR0,K \6Qv#gYLnJ_ALۗKGuSfU=jߌ[EMϸ]]g!*``ksL6ly5\3+Hc? O IDATLo~,}Ǭ _a0 +K.?Eh48Sg>t:\|ŬY5kp%L.\O|,Z|;vi,[O<~{嵯}-Gq+Vse͹ӟOdٲeq?[VZӞ4j9JvڵkYr%\p;vd.袋?rHf~w}6ҡS;s8YI5թxRľuAD>&̓cY@Us\3tֹmmX/jc{kyq Y|qsv+L x㍼{ظq#z+r > W\q.{뭷r 77K/xo~r-5y ]tw}7/Yv-ׯϭaosrgs%cqmoqw?m 7]wE٤%? mM77.]ʲe˸+^q,YĿn68Q7[WEY@ML5$\U @Ѯ{]6ϫ"9*.GŅ~iCJZNaJ`:ȷn7-w6o?T:nd baBaܚaa_39'e!_ 96)Z`nA {援o$߿sDkS_!_\h[l7o裏>\l]bEg?Y?N:x,?y_իYp!V;~n566FgU6mQG;QqFBO{rmӦMydV|͚5~w}6!."GQ! ߒegty Y5@e2X|XT$AL|wڴ޴tBOSI'w, ͫiZDXǴ0BA0NA NJPB%V2y90)EB>)稨/P/lN*YB,MrT\WJv$srLfeʂN&^ |C}5m X%sS9 3ΰ8)Ejȗʟ^i2~U]>uC1>>GyR5NV͏?ߖ_ޱ?m'Ͱ38~oҥK8c'"]]OXPW ffS/WLj`@,qT +ŻGg'JtjD89!_[N+|˚v28!k.EKh%go=G!n0( &#Tj P*Bݘ!!7|Z-WIa|`$xqnOGl6Ak,[X YbDo,1X)SS w uݿLRRbbr[:N&A H>g֋EM 6Υm{AۑgS(leT(nJYQuԬ&s7VŔ+v%'pϫsT8}BkK&t{)IyZu[$Fϟ|k'xNíu^Wr饗yf6o̟WtY .;롵&IǗOOOl6i4w}Qt~z{16o̥^:>_|1sqswp_W-[e˖ܙcythuL< \XDUP@& RR%B\.JO8*ݝЙ4{; ;hࠁ駷Y|,DsACRW&5PQUPVZA\+ .J%uTU.JN3bҼwP"bӢ|)_uN=lb7v@Ie3gŅ}`![Ӻm v5 ʤ·uRh3ֶ$!]VC0yF7,>$n1[ gPy r~R֊Ocw`rUFa *{C3=–ӁoGFDZ˵^w]N:$֬Yû\ٟl2N>dN>dV\{f]ucմZ-vW~zV^9é:tZ~= ,|&1PK.N;eZ /}OLLp 'pi>Z6{9)y+t"rFt*_Us`$(3\WX@Jbۺƹvn4h5m[ 5PQaDh@CcDh(E>Y+ry(n,b,|9)eMH(}|^妹/ ;+X/G P&Sؖ6ؚ6ؚٞ=cGڤ*J\ ֑MNk" WX g;wt4QuSfrTLܔQ ,-m^jI߂i;2JEOu}MΓ=Nx] /: :ҞIha[ nNl[liõx im9L_j:izġwL)2L&SԘΔѡIWѣI&ӪA&=5FOc 걕T|#W{Fni7uy{!U:\":qa% ])|ʊ_2+ɃJN\Wg^uv@gÃRym=Иg+eK$@TP&m%Q)RzY(W?k{9 \.H).1%?G4 rZXǕ"CbUv[E>S"M4`*ؑ6}v=v=ݤ*z5 ]-j SkQ PA0G<͛=tޥA 32HFe* *[>z J1 dVyxllj\TJCZozӛy{&&ZgmwX{KS'hosUQGJXʄҤjrȩ *ŠuR<;uaz;Lo~9o#f0&Ɒz僻~5Rt/`‰FaO 1}dHhɍ;Prʠć2ux;Ly*nQ EHErTڠ5p &Mcti?qtA hqR| j̃;<4:]yx(RD7Ih)sR)2 T%¹Z1W&LJX?ЯJ*UڗRƎ@eaKHwkhqV*s^~L$x9@刅;sRzۡi{Rʵm,2Ib8>N$(a^4ikywE¾\WXhA2X¾WrnXVa^$yypQY|/庙 [.>OSm- 2KCGD:"T]Rzh[8 ITJW槥3sRy}/"CUУhӹ>`u#я 4P.ei&ĭ?jȗyL6Lb ?;U2J*Uڧr z7NcћrJHt~v쪊RhJrąl?( %m{fˡ1aݰ;:?/2@fHE!)JhtjT`ݕ0@TP(5]AɲBSp'J:[ES%@DD[ ]pTDS]{4iu-~eROR4JEsҘ^j6_aqJ2[/nbZR˚wWlk>޵[9aGwgzQ]A3gAǰe5Mq$9~GE)F(و;IRRJRzK6e]GGoǹ1Tm7q D.OdWl睓2 m~\kme9L[e&.ၔ4py+]1}s Ac2EGbeVRzWJC!PIi`~a{ +?Уr~8@D]GDDtHB""ULbRe6 `Y4NMqZT6Se_)P0$eqWʒGqTk]X6\Qa0QUxOnSܶ \4'\0a_K1.f'vߪrT*UTiuNqptȾsPeS4>dCpS<\F 7e|H7g sQd_>ܗQ0 ;JJj):9 .ھ">D("\WA'$Z&t1s7u)ey*IQA6ZpAr;. @)O)~GeJtHCmQ:E4푤I$_'bܔnoIy+"^Mh6ڼɹ˫T J/;[HIEHC ,馔m+F#ge]rUU9**75Qn*;>? O窸qR_JGŅ^NB'E.+)[i>?-щ֦4. 5H 8wZTuP\3W*pPHEu07rpd(щq(6ET1)k*u7X NY\Ljah.n!%" 4W9/6? 5h0+^}@ӼVϜӄw/ʝ6 A*ڗL ?L Qb ZT2 k'S;Ø(*]L\LR~W**?|bBS# ٺDq`?ƴ[+ƬPI2FrT-(C2S0A VksQPǜšrU"^X7ۧhe{Ap+,(_X)R ],8 9RT})1."{[Yq]"SLZEeS$.┅-Xh TTwsU#*Jpaa00?~g3SQƎb΁ +.K$ A@1 ?Q2Ir"cH):-E7ũz:Gw!`0ry}X 9*PTS9kv텣zo\jٞ * ޑj$)[gY'7BVZy`BWY[H;dr]a pTUuPR}rR.E$HKPܔ"L TBם+‰]ߋAʦC5PFl"FHENv=K2hA\p!jeMħ٩FMquJ2Ejy&H)~  (u@"EN]/ ]Lng la\+`EQTR!MYy*n\*Qq)*sEu17ȣO'ipߟ,_DnPwe*mi/ f࢘|(R=)mRR *kuxG 28 R0bfg2S+^ZQH2ڷx %۶CȔ舮nMbĺIO7aT-_WB|e"sUdΊC"V1,u)4MZNK7~]LL@!+2}V4uX\6'VYŶVg5e@Ҍ馛8XTtPʁ"eAŽB =y,[V B:ΚtSz;aɒ:eMsV7eD#h*Qm  iDz$QJ骄NZ|kbSD'u CZ L)dNSd/|Y+?0:ߛ)ʺE@) b "NVցZZ\8"ͣ"iжL$1h<Vjy8 A*oB ȦRȟl`.dU~Uޠxǎ/K~2/ %W#4˸ꪫx'f^RJ))\6?XX)X\.7R IDAT5]ȗܔizoP-y6 %_nuNEUF!9*;,q tUJ2 *+"D zɼS)M0>@@4((7h<\"{ޥbw7=-BJM5zg`Rcׅŷ;t.hIS!*n |ُoMTN˰s?6g,p08Vzn~.ilwyl#Q*Q'sҷ~r7#',=vP_q>^kGy'{\uUuNZ[TR\,Xp>WEYp}%ŝ:PtW2}|=frh6m>JV~ OS" BEfzox@`n$HEHޑQجثa|˕( /#g-P2Ox$,,e_;Z  J6rhVtTGLxL4]Z}<Š" +6w%8.~tPk\x Pvsaf(`2R=^Xw{*Pُj7y|ael" jy%W}9wnn5Bby,K!!<8=x h#P⩨A„04ų L01Ͳ# ,![k7ky,s3oU/RUuOqtrys]O~ߙܰ34&֯aͱG;E}N=T4cx_6uy&rن g>gGmذ!Lo߾ /N:? .~:#2:N?tl­E [nNK/e޽}Zk0ewmJhV+UqՕAsWPk6sC"PUQ:m}i٠%qkCPRbkwdmR* ؐGXߒ2x zKv_q*:qO-<:P[*Z'=v]^I2`<(%s)YBCQ8%j+RQi兇.KQnz=\-UM9PE`m4=lXHVVUiAe?t4CXT>i:[gO݀QS;Qa>l swk׮{0w=?d֭\wu7x#<w{ٱcGXO}{w;3z`t[#ԦzVqTkUI2D/'T% QrԿ:a$t;.i^ny&ף& 2N5AKC*Jh AEщB&JEYxUMpw& 9.*:?Cc1;p`Kχ=F##޺?Ε3XUZ V`N6N@9X´Ccd9#ZPYFJ25c.kvw-vkM:cwmq'-[W}C}c=q]wŶm [믿|;ae>Oyf֯_?1uSSSLOOWZ;LHb_,JEUqK`Y\g^05i磨Q0xI%r}RB3hȝjBBDivrDaoy]`s~y\^Ea^&zp bFE\ qfvf^ٶfMԖ^ά&͛]8`):U_Jc(%Taż`֣ThM/f"Kl:JJ"h+r_ʆ.,W?lٲ;w䬳 d/}K+acvY(S!CHق_9l+!P ˰no9xNnuSR*jD'lbEת("+` P)JCXWRT9LH{N4(MRgg9i?NpyM9)AtݹHRD{y9hə(*GWZ>P(F*|Rb %RU nR`#_|aT)Mw {lSnU7?Pb$sA|b,rJ *hkt C5E'̖'x;geqڀ&ś:;6n-XAR[r70,t:ͅ]vq_tE)?vF0lڴ۷~vӦMw}!lt vؘS %=K;XQK'(.~~7ӯ_g\ᨵRd4:UJTs2"R*ÙRE)n GwIUQ]`TgDEu*J8VUsj;^X ԩ*~ԶeAG@>pjI4@J\h3%6'KHO[N` Q1QU4/2ޏҟX36mp9)WlnWI"FIy5YbIJu%U(Q)ZuЉ-@*?[ ᯿p+* ~P,%}Զ{&i}/} %$yqRШh};n)m;YŠ )ZuxvtIHF8M~{&$Z[EHފGPXjE:# X\Lz#4TՔx}{?pm1@թ)?= J *hw'_|ݻ^gO}O߾4=_Y?~3?f>rsgi&71;;>77 N97m۶>[n뮻O,<_*JS5<`=p|ƭm۶(xUK. u;tnFLjqe2*T=)u;m6GwE渄"X,)M0 %m|Lc(ouUVST DSM'qϨ׫ 3q} W/EE(#TU8{6)QV*e">fUn 1!5HѤTߣ!!#U+ťH8JSUE0ʨ:JRxJ~63F Қ 0}U/y:G%M`|4kgf rUKmZk6%F轺R2V%2}}Lv\g fU!b(A]QѲE Ň~IXUKCE!U JIIxKup"%9i )'*\wmJOY)G|Oj3!ig)BJD?R S ĹQ{ .5\[#ڀ>Cdt(Tt´bhgVq}y(WPW4VN隘+gvp6 4!i5}WryݵM+} ;xU%޿yY *Zkm1U(_Il"'ӣ?vMxr%SwϰU1)`U rdSipBBÀJITBJB&R"8qZY0! )Wv<(BM9x;}v tĺ0.`$=,tr8*|)(,ozoN!sdC2&NloSQ9`m@FAq[(*Ū" %(R blK x޴2xTi-N`(xMSVwyuM)Zi@Cn4]H`Ae58rUZPiZ[n3C,47݌yZix_q򩊲iby޺*jۼ楄qRD8Tl{ ,\é&0T*d-]wT"pPRIT%5hH:LX4TskۦHh98f3;Q-qz NpռE Ӛy`yEQ++} \f3IG`%fUd@pq+g_|R>WE)1~[w2g_d23Nzm:X: ^շ ޥ*o?vWdHr t_C mAeYe, 2 0+F_φSUFɐF[Cdzž#l,EIŞ;f ;/+>**Zk+)CB/ۏ Q/@O.i<ݴ :x(uy+@ I9|ߞΰ^jzDϿZkR,򜠒NޛT?j`%_|7vʚ}$8_nvvJ1LPrd\[ LJL)ZJ u%(-|RZb`Q r-BTƽtbI*Ǿ6OY`IBbE%@>EL )ER*j4_'WHn U~\q|:>Ku!1MB4--^V)KUU )_3Q['AEitCbL$pPZZkR,x3޻QH|6?e9R*:dT4UTUJ'RT`!^Ji&GTh"MaC>晽J[Pb!0VCºƅj)~*al~5\qfnQԛ90ffQ İu(֓(7o#a5LTBJt7)ZJa[:x#TVQHM[@W.>V9~1PJluJJOD5R>]aj K IDAT빋rRŭ.W|Yч>[s:>e>Zk1!#N_0J;r4|'xfYNg+aD:"aLפI:IRiy'UV!6쫃|ŭLRC\c BЍD띐t (At@%$8RC\ё2yyp3P&;d|CxX`N++CQD ^G1 +Ֆz`{c);X@00Qtjw%Ԭv{JbP"=Ir K /K4L%&H}Gԕ6SqrB XU73SXğZPYF{ū_ֳg.r Q_̳;0qgy~t׆ ޽oÆ Zk@́8K{_M%޽޴<+ ?9T/Ѥ1 %$[+*AU1tTA,A&2CT8Ҹ畏+XAq1pBu0-];J\) -)17.a&͏"C;`!B ,r&ə:&! t(01LgI(\N•l3T*FR_,~/2DOޮ5-UѨ Q bb{Q7GՁ Vuz`- Yj-,m/pϞ d9j9M/od~3o1û%Z[Bw׻"&ER_BY@U`Op1#ZGD(e8%%h*J@ņ (@y`"zfB((\ph/ZûRIc&3O^ $fh97;_F}~H_XkقUX|Ж-}V&/WR2TrIT;PPaKqM~&qI!e! 9+ f59k*2WeNt0yehH-gJ|^>_ *@)!H9{lf&ykR*$'Rþa=yE>h[[xe?-Wed Y`SS}$o9Wy9Sx_Tv79pȉIlIg'ԗBRz&ӻ&eYpm> 'u 81^u$a ,yMdFn՘TV2ŧ$y-FTn?{' @pMÊhf/i3KbL+Pń4$+Hr9Sg^il8DR\H,`r@e@u.LE7b)KxYłkL\ op5.lgGDHkCѬRLMBpoJI_7E÷wvm|+_aLOO׿n^>97;=ӲZkm[!)ُ>/C|sP )Y]`ABx5U^"%R_" UDž{u a^'@bʑ QF<sV|%/n>g!u{'/|<]@-uБvGtAp4%^r)6/  CV ۊ.|ȓö|{.k$e4JK^c*!avY` s4)(TQSɫn*à$b{!LcCa+N)LWM&9%BSUm BL?jJA\| &~^VuRP'W 8 La8rUZPYFOTP"%m#s@wG 8Z'/쒿cΝuYeJ$Nnܸ??G?ƍɵZkf B(W\ĨJPM1TtHw(ı_F8,,szX+eQ[?2.^!.  \O!wb%$PUBd==bkpW:FtiBTŸW I 鏡+ø,xB}V\xQ.1[_#M 1D;hW*1+ رoL9FeTyEEGB -Y ꀇ\3*J\ywY6'%RRBeڃ4 *u_bX NK>雬I9[֤E½/iXUepk^-; ZF[35O!/:dl> 9e/7 /a 0ql\_߱i&µ{nv? _vgx i({K:=rv Ì^`^kJXj)a)~yü0ASu .Y[!KF:f2 $j9^I= dd._%Pl(`k.D̸\\ XwƇyO~E2͗wd<sf FQ3*̯`XwCKU%*$e(X]FA5n mPB*^2bhH#np >@J҄M7KMf`@ _KJ,%j,ofp\7qzQ娄hkͱkcs]r%\q|O䦛noo~7^::_|17 _z[>OWZ5S%JW={]35}Գw pES1˾VrͨUq 7}o_s|})'Ʃ'ed.˾Ob]QU}h--JLv:Я)')+iQ+ƅGS*UuR]]ObUEJ(Rd'\X1깺3ց^ REa4QV2TN0de UiF@G'Ź,)qJ8eӱY'ֵXMj$ :\eԹ ^vy'.~y9?-;JnfOp|k/׽u-oGz+{8sٷo_PZk/enqRdYb@&Ɛb!M9"L|tb*JKH8綇`]Pp/ ݀%!+qAdnyƁJU ~(2[vZw;vXB8Ğ.Je@H^ qPw)XPf(TNfl*@B ,ȁ=Mv!4LmXʉZa݈ˢq,4# \?NÒuP2RUB.og"ma;Wm8= 33 *>͇*-,,E!`g,$IꪫꪫFe}{5\5\kM?dfWqR:9ꕎb,q{^C)DЈ}ת* 0Tν@r h0$l @Tԓ4dX7Xy!Fe.8 r;y=0B䰤 `|PXޔ <ҋ7LƖ96,*ɜL[+\pP* 􌡫bU5IHH@5^zPbiR[|WH[&v RBW4|ŰVgWȗ'ӋSUă}d;TZPiZ[iBgσZGSlƒ~ve݃2GU(d В&qWR"U@sTy,/1S\i0L Ip$!;(5ΝV3 Ӕ'+tZE'%WL*-XpF -#o.&Rؑ,iAg,9cՕJkflP7 +FL^a*֩)#B;H5!RJWKQqQ/?E(+ZykMשMRҔR%c19)?^i98\̗+VZlNZk0%/g!˃Ja]0vK | D)uzIU#Sq]O+04mI$I_ 77dGpڸ.lB{8U(L":Vd藄9]0 +svb0t"h-:7J*lXM(X `BٜeЯ:XjƷ rTʈbR󼪜2(~Z O}i#>5`SB%em1(n(s Ӈ6k΅2SW *Zk+6xbTdk/yM@I|F,XC׍1$ _^Cvٍ@0We2}(x\y)Yh4*Oktw'(,~^ٰpTԕл\DL% b`>>uR(MAUDe *dV9hU` v99)UNnrVb;:CBZy=_c/VI{&m/["!%AUrT_8OہҔRw-bud2N)(rIEɗG[p>sQ,jTZkV%ʾ!7~ *gGFw+*TĘṼJX"U%#͗1&'W]1IN*DؖX&F(*D%TW2+1%n5K9HbrYƫ->}qwlZP[xQ93ñ.=byR5.lPqJMߢ\̧XPyb+ u`G߇UU|uj"[kZ[vӮW\w{ڒenᴗ/a{"DFe|:hY`fmL"wfoDOvKA ̓0Ojl:fc>CdXcY0 {U6^vtӊ+mWylme?m^Q|(?nqnAϓ 3$7Cr2S&gkkM:SFD[+1+)_J-Kq 穢Դ|u/%+% Ɣ >G/vXW #17-X\M%uu-Y6Y_au**Zk+͔)*R {Gry0{{A,)^L*N7&ЛjXzx5 !UY$ SR:KMPaQ9]lKWƪ%PTz)2f>Ԅb'QtDeh)y&D{;U,(+U΀APWr+VU*WMpHPntz7WvSVε1<P&,U (f] (Ő,*>g S .KgTrSE|lMR'x-,!^ m[CLMTpY *Zk+͔qgr9!Y~!g@7J>a_Rk5@TK 5ZkfyH:BQ1UP >Ɔ+=a5"B䐯%dyq"I4=FU AbBJjXO-#Ԥ.GRI(ny'׷;XqJ! ,V*qŠs;HL$GYeE'MNa2zIF* -=+EX5%(+\:dL)&IFВ:k*V(©K\W(o((dUSV*P#W$nb'_M^}1fz1H uNa!ebdzZm/xmuaZZklz}D* Ÿ0~'~yӕ1BT߻(q1.&n"'`dZ*y((XF<1oT[ה9*}7C&ofِ1t=3O篘yzfe<fh[ܿpM} L%v+]ɆgPC1[Q)stSfIc =dhstt!{C, 5e2ָ5fUL~ ayԔRO&ԑrin)M`K. ׄYeA޽sV|\b8Eea_LV&rzԵ8遲*T,P ZC׾e3Eر ('+PJqo\ooKPT-]/3_ݳR)+>We"ÿdJBu㔓P˝"ȇ,8'WNNby4aLC!w{ z=H]] KGx&wK!DǂR^@AYI2HǢ $#w|>^e3`hT"W% t0%PN* J*`z>pW*!-SSTR{oL/SS>}ך1r8Y;>cڋ֯#TN;y3 \낼䅦( m$"M:IG؟dZk%P{ >G-VBU@Jf=}Nbx!oQ++ʁ )~'և0/FCBB6q)U`d@kud`LC.f-ӂ@E.a./eU[}Ft<Œ. B ,ZR&MNlK(ZU)& IHT 7c7V?헏k*HyRUIE<^XRTrX@c$7 }2}{{IzkRTX^-oj[,LdkRWebCYeZ}2TxPB%R/]LPǟXn~w㏳{>Z;t(Hj[E~i޳yPPX@EAJhQIGvy<% &gJ<$A:O*u*N^FarТr ݠ_Xh.ؽn}?tr@< IDATBˆZ8+rASGFaڧ;c`% 'ZʊRQe_W;`Hݸ(^: ^6=xț9˟f{(~~,&5E*90j3g˙w2tw̰AؤZ,¾qB4+'E _~]lTñFUkGOַuَ֞_qկ…5ŗ2 iFר)C٤G7e4%/Lb%EB@JԠ>߶!~< *EFb-(z /E2RfS@ҵ X(.&vB Թ;B]V$F1EՕ,2JIR:$2 ,neJaC9.zm8AxªΏTiaa8DB2',dF@RQ@!eüޗ8BoT3VUqٰaÒcXf7-gXN=T.by=e 6,iBo~>W;Eɟ wy&?x<Cr*WS|,jRy~Yo ̐&cLo0{7{Pfv~{ bhoTb܆~!vB0Whea&bX jRk` E1ӱ"C46lsT;jqU9׾59{&ןs9}~ꪫ.,y'{ '?yP]XX.ak:3e,Q_zZ5}<%+C5]%F\ ;|Ljc^BX@d D?0sf}c!e`v>TYxnUA-櫄i(΃N2 ?@g)2zyF`e,ȬZS,OBe`, |o1"xȗ)gE rTd~JEa)eH\ ![)J یչ~}ũE9QRƩ+r)A'G,`Ae}Y-*@,|碋.QLsE!婧橧f߾Jߴlvqq7o۷srI'qs6lg>8 >%泟,ykشi}k뮻җęgƍٶmw_LQ̰uVN8.R{\e]w~:[l[o 133éJ{챼_ze\Z;qפ^pSjʄzJ[n=;=mXF΢O"+v 124,vH~bčy*1tźPq*[XW + ^(^Mqf[Äy59֙ zu))VŠdX*/dPttΚ"cM1gt󼢮b<t * 1zzG̓eAE+Է,hj)Z\p{-`û$2G՛9TDZx)_Ձc#՞2/e#Wl Hy۪C)phCb+]zy{΃>֭[*?;d׮]K??o|۷ww|[_*=W\ԧ>Ž˝wC=`0`ڽy\^wlnFxrcǎ+{a~~~_bj1&~|G/aă BbE秌{9Zay9_s=7 s睺]RݠU/@Jml`er%L<#͇PU p,J -msCTk:&k, ^:kTU: ,VTY8ZBڐ0[ pK#mJx`Y :ȿE`"\&U%?4CIӺZy=Wyj ǭJ[uV.2o!gy믿7 u]a`0UzU38cR>O:y{G?M7TYv 7o6򕯰yfy_M74|c/~a+O<wq\{uQcs_Ŏ@J(/yO:!o c\o/~~`!>I2${+w4 r6= (%V*GS9}SM6@Ԏcm,Qt \Ӥҙ{_ߦ+GXZRO4_X*TfOYvPTjRR`Ԕ COlMѤ5CBr1?'y [m*A,פʌG( 05p)7>>ڱA܄(6?ujlJܒE^&(ͮ~G)P8)!g `aL S#4`]s9l0ITvgUN>sj EcDa\H ə, (Ҕ([9h)Fe+%q'1VQfU(S^P*MQZS:%k XvojΥm$?HK65G<ݤ,5^bþdfa3ʍX,,3 /BZvs=LJ?;੧( q>pgm^Wp-077Ν;VqkZk/e/l{+(面OT*k2ZT䫸"U#G26E/aDYItBbU`=U"Eä)4S&c3QzufȔΙhjr}.`Ѭ59um9:B@AFF;zggR I y eNhaCBJD1d2/- wHNyS&S.A<|EՍ*wy(Erˆ#J@[l,)q\.C2ܲp^l4-k:~2(=ʐ)'GeUʡ0c ;vdǎy^雖 &([nOmo{g}+䵯}-oټy3]vw^Xs=w\{%/s5y 'tRX~o>M67Y>υmnfop)7m۶y-vbpٳl޽utD,cdP /˼#"c[i="倥VZ]c &Z8ĆJB (se5H35` ma$bzR}tL04\;ѝ^ (A( ,jZ5ZyP( B`0KI H ;*J+RXJUY_1| 0QU<Hb޸|o(OFn|/^ fbOi1pi:v';qx@ jVmס=taL F۟LhIPIBA].q xy8_~g[$ W]uU.\s \s~r 7Tm۶mQxի^52%\ůոc\v~ėenGٻ?^gr^k9XMOLOyfcqQ>iީ):_*"&% .P$)@}u1rJU?M2yEq~x0&mǯ>R03whO?݂Nz9 GF&&MנQF(EbR$0srImII\ފBVUO8  `Df(G]½`s\(r"8kbjZBԂxjX4a*χ\8K**^Ui荝4_:<$Mb#8?ś‚6 ZxP;\Cḫx7%W\u {p=?⌗\~rZkub(=۠ЯUfQ!ܫWZ%%Ie~:Jja%Z =TU8OP2BJ!)JȅX3л;n&~ޭ,; pί~v>/Gczk1I`s 3RÐt1}Q h蚄}qp$њαMJhIIPF9uDUK̨IH1J yQXX -#p"Q6ΆD+&);u|f* -/RoWNc f-eoG<ڑdIp? %Z[AA%xwn>(*KUH3Ba߇z )jVH0⧕өŠNYcWҡ TVyDAcNZ8b(ՂJRPz.ߟ>^siҥ09p7cMX`I JjTpb) 5n$AQ*:NA,V))~t9EUM ? 'T*= & [^IM*aH_K<#q:>Wph)ăH]JSW:Xf0Y TEQBJ )Sk`K}_MZ;,Ixx^lJY #׿^QYvLOšKB$T +վGş"!`CUX#E$E.ᰄa+Laa!=+>XĂgZAD S"E*˃E[Vi;J1>Oc!ri7r|_ d40` [zJF#- ܡuC8K lѩޛ9.rOLyK@M- tjnXo6ʼ]AP0<܆Eԅۓ{m^X}(aE.л%^ c>]Hf0"*M$.ݣ¾̮0S`{MG}9D )s%Vt La@+yMEeq&R|NC”kB/O.Fkm hE-x99ٰudlp_U9GsY#D|QZ^+ھVl g3oAbtI+S;d)X(!X İ%ϯpK//}#_GRnql_eO `L Aba7qb\slezwD8<*QarG#de~?Y)MyGT`{M$J;yzQE9,- ݘDO]"D;Kw$PuQͅ0׽'j깨vL@o ADg9 cBzTL#+R̈́rČw5´6!/@QX|>]'b m]ϡJ'( wޟۃ•8/e|u w28Ѽ( `6\ԏ@Y=P[@N \PԽMp4`!Rvs]9q8W;!91]xh7,WA M9` ”q~攐y( `ۛrBtp BJo*&A0 8P_%#~?D `G$˘wyQ\7v-N!CX&VbwkZt:2tq RE".àčHČ0}8I Z ?ٷ~8Zbi*!5B.X{5L/%ZTY=Kr cճ*σXrD;/t4þ`=&dv(" hczTzwyt#N_) H>0nDz#;RݻQv\-4 zQimQʳ{Kt[0D - eqGwݪ bɴ/="K 3e yEy#S~ďJ)V, <+=V27d,)x-9*^bE؏*[W>%V>a9!kFO[hs%X"p 6-"e{*~0w {"_`fp^YD<  t&<*fCD!{Skb%K38ĉ1!>8U„$j(I6_& ;Y^]V1*y=(7h9#,J 8u wYti b%*L3:Ċ1Gf>DX+LJp @QJdyOBp]h|aHQ X9 `kURWUf-%9 4=*?j)1.  QO}&Pc~? Pr =K; 0 WKX!^ a*Z.RDlkG5bBDdxa楄ۤHi _7Ϙ|?pW<'`1?j_*Huak>03ps\s۹9V.VKB(O&RD Sא¤ RS#Mi"Rw+J_%)Fn_# BeJKB /VD_ 7Qq~q~?( "zSJe&3X^汮M8)ڗ/q9:=UZóߺ8گDJUNG+(8O?0,A,lJw(o+3|LU\֭gG/3E^JXy@h7aʼnE$MD `{KTw ѫٹ+u@cBa_nQ˓ ‹p0 hPjmpVB1J0 Ku4 !P<@ʵ-A }')zXi[]dHPx^yJWi,[TZҧdS1m3@Q!_vi8/*_n&U٫ p]i$RٷC C{ W%E@y$ þj]6P AD:# 03ާ^8J + 9|Yb6Wl\{R4"TOL8&H?bxO-Nta})U(Jm*4=(m'Li(1rd`0aptqlh(0HQE[vxK `z*u-P@Q0%`w<2hQٰט+EW+LHy@+IBB "ajdzn?( `T 2%H\ffĊ*=<,wKTn*8Q' ]Fr!_~JCTܴ S^+k1cACDX Eq gDM_8%CDB=3JNP/JrP1.Ϲn8XI d(TQ…Yܞ+'զ@SSPY|V1P` )T"FeI%g# a8VFxI_X$q7:^BOLW%TƊ޷/\XY/xt !Op0&,QԠ<,05/4BMssKE`f3=.Dz},{dya{MT/{ S0hhPoV@_sTbpaϙ4Qu eݓ]~GA>ăQ <؞fng1 wM>mGFC DǬpd}{SOyRt %Y(Ww  oMrT"v[l + d;D(kM-y9`糸=& iĈ&Nxs8 6MC"Q u"q\Ce@gc+Lj@Q2 ӴA&˫y]wh)~!CX (ѡ{Mnί~*i.}%k|C CAލG%чy*tUH!sDz%X`t2fjCW9)Q"r0DSs\FXzLNk7(V\ (vf]LɧYtH23 !0ZʁV!z+ 1UQbE 0lᢇk*DhsMх_m7),6b7EVeZդxʊ}Yv&KXc3AB%a(kmϭ,- r.H@w{,e;Xo! )UޢjˆZr8o}=Լ*j| UQQY?ꯎ9EOqsםŊY!kfBzSܹ))*x!Dw\Btw~XA&Bi^<'~Hu'8rVC364MMʊWy?,-7BbEyU9%(qs%V*GF+LoRC|GW5!պ R|F& ϠJ sTz;? z9: 30,3+ĵqR< /~VQ5$T^I.lWռt;D㰸+{ -Vtۓʖ@M)&PҗD4HA1Ln&gRqI]FiO-JAsAs f]z8k@H6FBbQش@lo[*A5ZJ'BD9Aj\VB-ǑQTe/} A=(^5חfq p&]8`d8w 9%UۑjG "a^U2 ҕvC Vt<{7=&â{S|sp2|Ʈ@ՐRؔHԟ-V̰/+Beג WqSE0%Tx@;FD/ߏvJ[ *˿$+DoX!q_{)7{ Cf7LuQݳQ`]@΄w=TKSsͽhIQt߁0 @dNJ)d"7ۛ2ڗs #lܸuuu(((pŋc۶mشijkkqAvHPѣUVy'y>6nxOA$t ѳ\_٦w;tI/U>7.BwqB|Z,vcB믿W_}W_}5n&qv/Z[[QSScyU?|,\sΝ;1c l߾?fݻH$cƈ#:СCf;c̘11ܹcƌ_p?7uuu2e wx뭷0nܸϱ#:;aðf;v^<СC2dH|wKqUv{\=;֬~]x[n=Z_xqI,u F CAK3?8:]"RXWQ ilO^#w^8Vbwbe1`@6%3@#䠍jt~pb8IQ9) ]^)%TZ4A++^ ]e@j;w|̛7~!^|E|'7q%1رcvU1 ~?-ѱ&LIb \tE1bDèQQFαȑ#J9t&L`TUUUY" >VWGq׊Yt&RH,ʣEDjh4}t>w]J+x}{j&=l @@@zN I\`Nj؉J`yU*E܌)%B%// ,7Mu]ˋ[n~:ts466:_ŢE__>v…xꩧO=޸]YYZk}Ϟ=po߻w/*++=5x` Yj29\`>"%gEyRˋU >$zE[[󑟟Z̟?߱1=x}̙3Ԅ_W(**´iٳܗzu]3gc{GѣGqwcܹwc݈D"زe\Ýwމɓm%%%ؾ}i>j .y.,YN% GߏfHcS `^匽Tƹ /ۋ$'8/(@_!\X @8d>bH/I!dWl )VJy"E_srŊ^|'/۴tRs=(,,_ӧG퓕cb޼y]>v…뮻o IDAToqFee%ƌ1c`Ȑ!x衇\|83QSS'?>\|Ÿ+Я_?̝;7x3)S0j(Ghڽދs=ê_?)JKKQ]]ɓ'.y.,Y7 AD8f.p|M\h;]X,no ߎhψk'prO)Z|`?>P ?0ɉ@!N2t?*RB@Q9#Rt A0gz=z9GNN *ꀒ6LX<{ _?GLu H]=!J0HC\么POlT?˷ym1^!gjY=F]GOʇv_9 d2z=K^!_,1 *IK.Ů]0{Tw'.6mڄTw ^ Q"A ~?JYKURH]ٮɫnoq5}݂=PJg}}6z&ٰ=+*Kg~륈O DJwI+K3,  &skR# ~?YPbC 0G"E0k]OnRWy>%s` uo*Kyta֙'Pl t==ADᆀmPA=)@El(R*^ ]E.TZ֥s 5w2P-TcY+.P Ja^x28WGD fB  |g 4ygEGEW*e=a:S{ň:Jp~.PTQ"澗XJE>$P_Eч 3G A@ߏVc:X?U|Ú@R^ގja(#O j>rWyOzQhqґH9<*AiQ!BD-@!'ݳ" 93%Q0ݦ{\,^U\)ѡ__URDy6^;!y魃9 "iou@$0 *3&{ʣ"8  z ~?gr|0X#ֻ\.L8q{N:Jyz#Dbۖ-5z#|,?B\ϪaDٖغm+ " h2"-} ~Xļ¸*Nݶ5]0p0p4kPA$S^8hõo%RBb X~ΎJ{7v硴8A%n#T-!Xnc{@q!/+ we/ "01"y0!$TMKLtX/+EϏqW%PN@2/T /p^5+A$ Yc{u1Ouo z=z)L0I*L@zH$VzBض MǏjX5ףvק=!]#42G A'>";?V('H>#TcA;mFsc&}s0d(ldcH >!L #Ihd$I*Ekd /QB" )8CG?AdgbstDFh0qTȣBA%zģB" ғáQQdgt`9ަP! wI^1_רAnn.M͛7[0?) G0ݥ .ȑ#2p x뭷NA^|BAAR&Ta͚5xwЀoϷ-^۶mæMP[[7B_x|عs'v؁eXj oߎs?i >Q! ="Twg}CEaa!^lڴ__ 6 %%%x'>/'|O?_|1kwիWcɒ%9r$P^^[nk֬9z'0|p|>aXh***Я_?̙3ͧ}D&SI / BNQ! iRVVf-HZ?|0Fխ95jvw>}:ϟ;SNEAAA>Gyc=u}lܸާ"}#࣏>ƍQ\\ G?}Ӿ_"=y_ DY*AD!e剳ڊ~?ޥ={`ܸq]vee%jkk1f={PQQt?Xd ޽QZZ @z{֬Yc駟ƌ3$T~_Z"ާz Æ iҥx7m?0e*H$o|{#0 !gN5o {M0!DB C,Geʔ)/~V:twtypw8y$nk[II oٳgc…G}}=.̙3/%%%xGuV7DKK nkx=1dzGާCa„ VX^UUt="joC(؆`+ڃh=ՄShmnDKI4DKSCJ@'& AѷHPoW^yŘ>}:f̘ѥ~?8 L2Fˆ#m{/=ܘ0?0*++1f3C C=tZUc0az)]jWۣ\x>y{|ݻDe˖.?>!Q! i]˖-g<\tEhii/lә;Ow.b\qׯΝo17Ni!=*$T Eʒ"3fTX(oҥK=+Ow]kOO>d6χEaѢEA)AG >yT  HAAHA9Lp|>A}*AilfP! $T G P2}YsBNu'࣑ >i D#Yo ) f/J' EPA!BqT >FBsTۙAP_eA}A9LyTA}*Ai>IA} " >WTuQ!BA.T8 J%t@=aNDBA!*T;r{ ADQ!BA!*T ߋꑣqsEfJ{QmcAчHr$H$#PW#C(G [$!GVVH8ٗ"0azSH@A}DDA_rT >GSXHG(+Q#SAї kADp.V{w'?AQ! =X/;c׌:+Ad ʣB C `]qߕ} 2pH'87R һ) _7O(" #P2pjooo?ĸ39__9q#Fq,Kǝkr}4D{"2P_a#]! #-~=ē8~֯[7^3Ynӊ0kLPO zYX #_c4O ,!^qp㙘Ad:VyyT CVͱc1lPk}aD #$oA}$TRŋaBhjj‰'p۷uuu4*AD`2}?̃Q]=pA8Xn'P d YYY(((@AAJKKQ]]mm;q6l؀ 6  AOaz ^}h1~8^n'T`*tQB&eee9s&/3vؑ.A-=Ձv{'t(**ķe^1Ndzп̝;o&}2.xAv543AVV_OO'G%jYt粢A <1>/jc1l塰eeeTWW㢋.رc_wuػw/N:.DFٳg~I,_A9z}R!.RG%Sᜣ8quׁ1fm×e)%AZ l2gDdzP9F n7\r}ԩ R9眃>;W^#GR#"]/U_L! 3̚ j<ʮQ!z֭ù瞋-''ƍÖ-[R3yFk&}ݺuضm[ zD=E gS0 ض uVwy#GP! -kvvl!ZH%Fդ D7GsssTBs=ӦMs !b ;v,E"ґ **PRR0տ&Spo@t&(֢,N$5jQQQ2#77H`'Oıcǰ~ٳݾo}D_")_ʽwI<}2|(ݩL_z5vؑLsT|> )-GWv~q`ܸqQʊ>|{m۶.ѣGQ^^neggcS1p H!*ys|Xn]zM~~>F#GZ>//BhnnѣGqAܹGMVCU "=*dt&JKKڼqW1bF/oFt !qF̚5>mڴ BL4f6mڔJ/,,tW^I 㸲ӧOĉm"!// g uuuyfD"ݯи`~:/ W\q&NAII JJJ0zh\ve8z(y|'i!IA9ᰀBzÇj;|χ/˸KFVVVsb˖-xO>W^ 2UUU l4mڴ(o֭[Ғkc _W/" gB̚5 guVWU\|O?[)++qnc80s̘+pO=>u*AiNK(}}<̞=FyBϰg9rBVWEEF'_~QO<UUUx_iiiuӦM_ݤ χs=7=eqyaԩ6!/_J2zhtM?]rK}"akZ2dϟ+V?OPNBʐq<A fLunJEv!Dc޼y|K_X~=֮]Ѐ|gXr%.(/%c 7t~zl>B̅kx'N<Ƶ\>'w;짳o׊:8499:oۡa؈]vaرO6 WV=G5߰aCG$?SLq_~MMM)ku ?o>7oËr`֭8pi?^N?"tĶm0aL<~PIx7Cc8s8087Be )p Wpnèp;tF °\p u=0kBѼc07n޷m\ݛwC=#O[ư<μ0Y=w37C݋uz Я^FKK n@TUU9 84hƏ^_SN[I&EUhڵkN8ѭ&j _G6555Q$'OL8. {$t*{lv CMX xIPadf@*IHTl0'nH0a0LЌ] \=)cO4L#e(Ʈm isv9v4U- 8anf c re$XCՆ4a j ej?n%Pf{%2)Tw$2B̟?W^y%|\նaÆǏD1;vʕ)..YJ3b%'V GW6\rIT믿2||Q 1QFO>؍7F &$˛aÆ]1뮻γLvVVz,[,S]kw}7i۷o a?n8$@}}}uȑ&pbp*Y~!??̊ƦF0,ULf2 Ʀ&sY~Mjjj> kQْ[0`f̘8 *wh WՠDŽ7 e SeR27oӪcB%F&ۅ2`ja@yHq@SS8!kOȚ\q?@Ag Ys=̄Y^{mjj!4JDU8\߫jc|3{P<MdDW{7*7+`WBd T8ʐsH$`0f[_9c;v,fΜA9Ka~5\Oyve1Srq۷,L2%nc1???*7x=\:+c?уrU:M69JNNTJw*G=LQQ 'p`Ɯs 0o@ %Tspn0a 7dބ 'awA20}7`n0 mfb90 yNP2@ωCX2Or3ᆼa67̉FO6N?ǯZ[1ݻOucWnp횪1ޫ|ZW=hNj%' aI""3a8t- ;vo~|Q/rqQtˣzj4vw=( iӦŝ`ƌ!C>Z[Mc#cq 1cǠ ~;,!UZ"IQVVR@iI)JKKp08JJJ#X`옱\Uo]zL!7q.DEEΚ<0El 1*m.d=SS|sxBS+!h`F|A8= Yfuh{S?oO?`VQQe@z1$toJߴiS1=Efee9zT$;t*ށ*K&sRt?cǎaG!p~`OqQTѣ%TD8P00w\{oWX~=֮[&;܉G}?=7l؀UoB z8|0>!?0{}gz[ >b|ؼyz- ;/^|Rf?2{E;Kz%=@*MQ@Ty ;!4ۋyz R#H"Z!@TBI$;3;ݐn6|?yMy晙MӂYV_;q1}>x+V`F ^6rsszj7] 2t3gT&-Z@DDw,+זAcIEEN8a6SXϞ=-lZn._\o-ITʃ/]۷qqq^^^xG^^J=zŵlצ[sN+^W6%/48(AAA&_n9M6bG,Y7ʸll(77&ӰXc޼y=A[9c׮]7cyskApuq'Ν]v)o`ժUm...:e*r Ncǎ+]Z-[xc޼yUQEX)ݣt] ~Q<7Sٰ(Xn.[PxyycѢEQ_DeZBBBq3pIs5DI&VK~Xx 6lؠj%J26mڄKXl)6mڤz,?xblܸAvZ,[?pO-mgorPv=ЕsڵX2CupssCvvвU+^hjƮ\*lZZ!.n ].y*=WU>c1 ܹsfz0U0`Ba  $]t6NIn:hZeAIdd$FYi0]ݰZ0?,\bf|!,,Lx붛|MjG94D7+V@%$%%aҥ cD4J]\ut}|}+Zr999fT.  6c(Gn^«|Sadg߬G9Uw }"a”aaA2#s;duaϯgYw_̯pObժUŋ[=!-s 43gΘ-Xy ^Sf{'''ۤ|,Ijm6+:wcǎY<"%%%joPTTeee|Aվ BVV1`Jw)Gg@E=C`EHRMj](((23.dfPwy%]nUdQ2P?)dY(J6m,XG %%ԩ.T_yL9fpxԩe҅)n)]TVJ`dff,*$(ׯ{>Ƽu3eZv+*]tEV!&…LDEFA ."00Pܦ.00(DTT/^)  Uuy2 Dt_PfRAU6sڪNZ Ͼkn 2vڅW^ =j2[| '6|4Uy U6麩Ms>Wu1䩐ÑFR%K]U nݺeV@MNN6PܫW*޽{[a;tmf|!DDDMO>U,T5QMjI^?ݪa:W] ǍCEXr%`… o~Y ޮWiRt> }6] ./@+*89#33S)$Wͬ%  $(`IUQz)ګXaazk֬kי6[MZE@?PmXr<={ƄH`-cÆ ؾ};6mڤfDY|Ie.t{ǏA(Adez ,o XpƍjAZhV\Apa.OYrO-F8k֬QklyR|㧞z-ZVay~̞= /yё`9L~'L6A2,ISVw6w$4":)_] KӉީ{HaaY?X_^bԩ3fxlFZ٦ ۔1+Z%cǎ&)Ec3jXazc 4*e4N/l8aqӻx og߯Pe:MfOSf2=^xmڴ ѢE ձB^+۷mG˖-N$zQs4gէObРAh޼9^z%e0}L+ 00C !C_~Yun]18P/*yMC>}C{*iM?Z>V-M]ʸ"yh ϟy4ՏdÂ`40!Cg\t kZy4:"2;)S1eT.--Mi)1wvq7coss Lz 0}tgPweI&{'1sfΜ;>HQ>oO8eEa20zh3 1}6_ &ʪO*)X0Ť+$;96YdXce0_pSm۶څ"حب.Ӽ&''Gݻ0A ߆ 8V 77۷o?Jի.^Xe5X􆇇sP`vUص^PȀT[o"&id}dS_3LkưPLvT_[S#Au% {EIn>JdW Kƒk:<Я׺?WrHB *,ٽyfgdd@EU_p۴˵A]VBAAja///kN`d@`aad_Ypرc77vXdgg#77{)]*i:t@fm<U'ŭ^JSwx'W VL W껯VP*~6P&TXK6uXݬWU\4.bb V7Kss%􍗥պukYv-Maܯ_?.gϞf']|NݰdYFrrي={TK)IIIV]'ߏ?VZ!44TIsrr|'fZKJJ*PDΝqIOSM\RRM63\ 6 T̨*R1z*5;PS4vo1`R0L~CU٤i{nrQJ*;LUEVż3w-tJjz|JBv^YС@GYN 2D}%6'BMe _N֟K,/ˆJե74Q.KeQV1򋒬/0\~zePpOdʖ $_Q%5ɕ5^dsuJK5J:uRY68{ŋUi͚5mrtLL <==UiEEE8qD,))1NAУGtl'O֭[u>5زeYzNɔME8p@#FX\QUTTV?Wcgfʠlɪ hDVϖ%H)m2g\[_95T(%cl|ʵ%CeyEQM+ɐe ٗlR1eIY-PeIko7VE]V6T8 gy CV+ek*I6}Z06%(|㹒5:~~~3fYŋ-RdJefog###1j(ݵkWݰvqozAM"""&LJJ24hKrrrc=fن`Pd IDATV;OSaXL*Nʤ"'ːEYT߈!7ʛu}$CEP!T+yd*|/Q*a]6ݴ++oumQySTe7WVΡ*|G]2-{Y6 Y_7Te%**yϕ[Tm3]ػwYz~k`Cf4Y5 ==l.]+WaٹsYˠalߍj`O0brvvƤIƝ]t ]Y}54ƾC Ǩ8>oook={Dxx}Μ9{nj mڴQ8HHH]u4  [lJ_{IpQ >5qE~-T7}Q|嗨ǵq/Y'ND˖-/i@<#hѢ*~-g#*ln&"&{ꈳ~5,{o4 OOO"((H5גW"!!V$ ׯɓ֡C̚5 CRRʪ_5TDGGcȑ}6+ժwrQ 6Cii"q(**† ?QñsNs1=߿?:tݻw#%%F' &t/k׮5k5jr%5#"+K=E:bJ2zh旗kixYY L4 m۶UmswwGll,g"-- 999~:ʠh@DFFs xb]999uƪܸqiiife7HNNɬLpddd`Ν9r*}СBjjUgU^^a„ ř3g\A͛7GVЮ];o,@tEz YǨ4N("11wFyyy)//_!C`ذaf39;;K.ҥKx"6lpDž(Frr@Ee$%%԰۷h׮*}ĉ?ׯ[|,cǎرc兾}Zء:X~}"5*DD~5.7nɓ'qau $ {QFY\En߾;w"))cL={%%%fϝ;g *5L,c͘>}:|}}twwwL4 }MZN8 .`ԨQܹ]jw^۷cR `c$ Zeee(--EQQ ,l\| C~СC),,Drr2lR)Y-` ׯdz>NղeK5 ۷oyoܸ#44DN\oݺG~-bBD8F~]:t.]gggDGG#""󃧧W^ťKz]Am۶h޼*V3˗dɒk`ӦMpqqA6mNNN$ %%%(,,ĕ+W zy""Y***p9;p'j q9sEi#Y[T3H_QQcǎ٩DDP0P!"r78l 'Oif"j\9"٨rrrBϞ=:dQC@f 5>s<<}sJb"&]IP^VIfESc@UիWaQC@5YtܼqrVڷwآBEzz:] "r TQ}6.^Ddtt͚5|]".HDDMLӮQ'I]B䴗r {1PFO%4k E!;kY!IDQDEEq-ׯ_ǵkא|TTUwiMDԔ0PAՐ h֬5kxzz⾒$!''HMMEVV$+)8"51 TI)mh4l-[QTTǏV[ 55 Tqq޽XGDDMj"doi4]v޽{o>XFDD4A-J9{GEVy̭Ym @h4899nnn7oյs999aĈܹ36n܈ZWuDD0Pi$321qSHܷb͛0IlZ̓)LjÂ7"<<}1k}-`޽xk.h}݇#F8BDDM Fk{?O9azvQf|8o# ˖ :dg`J[!6,?C+̚w_ yCL3|mڴo*_|/x98}6G}sػ 996سg>c\r~(Ϟ^ϝ;gkMDԔW#3X|% ox]3h qX4ÇƦᙧĦ- puuEwxq5*C遭mDŽ!##݋}/G#jhPݘQԢn|r -J2\]Yz(e+ 77!!Xh꜆7l܌/)^jF}ƍnݺY@AAPnE믿r:zDDM [Tv׽k-Wrrs0QJW}Up$Y*ik}-|Fc4p@ehUEO wwwe{xxϯQ'#OL˕G=Eێ]ѥG_\vMbDعk7V͛7#11vA0qDxyYn11(g5X T3㣏?S78(*]d匳OODF#apsuC}!j;*pqqq$(&?j{V%K.!00Fe1Yz7O3$UfyO?t_ݺ܃O>A1x"++م,qQ===1f̘z.Q@99ذi ^-ĈaCO?W_ Պ89zQ>b/]G&L|x.Xlq|3Ti `ά3ھpr\-,B,\&&eL/W>7FQJZYY\]]ꌬK0o"qs^y ii(V@ed1 o!;77nbՖZ~dYƶmtA:uB۶m-n#""j8FMK スΚ1 ~OLzMxqLeaCb?Nw1Xl9!P19<Ǝh4DGGG&ӯOoR<4ƪ]}zW)ǽ4ox漂 LyOؑ#p1"z29Ϟo?YiE7nČ3,wt#--Stә۷GDDWWWr  ֟F V*gN-{ONxs`@gK̚9foؼm73,wQ@ܱEi3t3rbF}Ǖxǔab֨lԸ\~ Fm-88۷ٳ58w\[>A@6m0p@nݺ\]] mC [pI$&&ǖuc`B6'In23/`XY2"Ԁ$%%o߾ 2ֿZ*ּys;qo߾HNN/R+#*dsa;"<>}h4HIg:th]|A\~پUQFO4E->,6/jPrssQTTdhfo*%%~!=Z㩆qYǏ]*Ԩi45cG I_ˁnȲLBCC0U8p6nX֝b]Ǐw)vF QHHǹg!˒dW[GٻTIvv6vjhҨ($I֭[mq^za߾}~]*Ԩ P4o h.eڻTIAAtz.Zqq1mf$I–-[0{l8;;i4?UEDDj4 q+A8<{TՊU%Q۳gn߾mRcX/=ܭK԰ [ ,+Iym&_%xٻ Cdd$ڵkvLj~IIITJ"""ЁJFF&}|2^-Y~#w/܋8+q h4prr3ooo!!!Ubɵkװa\|nODD9t{gL3O?Yܿ .w~{h4ƿWWW@VeWa-jE8{&>kω)9m >ϗG7nƤG&ΞKş=;T]vK\ 3нm]{oQRZc+ӳN2=xsrYs aJX],iz}-eOί=;n߾[mOw)ҷVZejוrl[ڬYwY;wKDDz}øcjEnnv˗r{~R8o's]x)Xd!< s0b~K<Æ˯//ǰۯp1e~))i8ܰl:_$=o匳B$ۉ?&`kRyVvD$lgNbm+W7qh.iTy}5d%$K? pw7f@QQ*S?2H!""T]9a/b79aM[lh ,Z0Wu_|澁/?'FM[ꊄL7/ؘ99r(Pu@u!! :TMP9ʚ7UwwwV+֪sXXΆSذ'_Dzq ۖ,UUލݜٳ`Ko8t8 tӦػhHMMEZZ**#"" 4۶K\RM!YYheM#OL/fNU<==m 1 ǻ~ށxxѽ+ǐe;wW^c@%8(6GhhUɒ@1YYY-Cm+X.]Ig [mУ2.Yh0glؚ :P6 _IDAT#G`f4isdY(@YYJKKQ\\7nF'YC*yq6&)bSg~Gc`exgx!IL7Quj"}G Q1{taCt9fML|x.X瞙l3f^xQeZQlOcIk ,U5Y2aX,\|,ce-Cm=,Zo;¥NLht #E nٓFfS>tH R]罹s7JDD>F%:: CG==1o"W_B`` 1 _g]6C7d$ZjaGHH06[ > 6?Nw ??- sӟGNݰUXʶY3޾}0gЦcW;p8,^2kOOO8 cGwpv{,z#ЧnLeI;h4oph4'a WJ8 asm#ixOSppZW|Z ptuCsukMofzu_0}|?lyvڣ]Rm3[·DDD#h1oνϿ]q-\&^<˱hrpVmWWW-L]UnQUo//,_'SR@uDDDԩ뗨ժ\F  3** 7 \E-ב}{9'g{X]ruqƽ}{cmԱ1\׻q'.5 u Tdy[B\bɁu+iSgzߪjoߥbL<ؑ#0|J-^m 1 ww1`J]Im;#i~" z@[:1oU}O56*.cᢥҹfMMn9q>b@DDD Hg4iTp n^/_@jXOT[US-9mrZƌiŜDDDDn]pDGVEGhaʿKE~}u,9QS@EVWqaTdQCs-~ABb6r(հCDDDiV@% 0)ǎmU,,gVIFamOGdYM%QĉcI aցJNr$~ݸoKlt{Nj${6,u:PQآ,DT]z"pp`D%""oO0r8:EDd[A <%6DygmQ4"""JD N /q.;[ZT6 "PubP"""r<*L"ܨ.H1`BDDըE"hNL1\l &""rlLOD BT """DDDDDXlQqr)آBDDDDD Ǩ_ADDDDDM̴/zAm4i DDDDDDt'EDDDDD """""jpQ@*DDDDD0P!"""" 58 TaBDDDDD&%i?ݏ ՛kADDDDD(VPآBDDDDD6e݋]A0Ů_DDDDD vb/"""""{MUݽ즪^EDDDDD&ݽUM{YWڔ8&[K-n4iU!jKAacQv52fW=pPPƨh+*Y&"""""j*n~;&=:EׯVI] FDDDDDM˸y*~ EWW7{ٯ  _2QA< iIENDB`mayavi-4.5.0/docs/source/mayavi/images/pipeline_and_scene.jpg0000644000076500000240000015100712747716313024722 0ustar prabhustaff00000000000000JFIFHHC  !"$"$C"c !1A"Q24Raq5STVsv#7BUu$3cCbt%6r&EFdef6!1AQa"2q#bRB34 ?ZExfj-B@6#}g"Y9 @}g|1O 9 CY?|1}g"Y9 @}g|1O 9 CY?|1}g"Y9 @}g|1O 9 CY?|1}g"Y9 @}g|1O 9 @Yv JɈMu򙎹 O0ҡt\Xmڃ2{?( zssđ@yd\ &䐔s`#:06E~|1}gUjےQJE5*m$ T`m㎑6׫Fޫφ!Ϭb?S~6XvS~6XXφ!Ϭb?S~6XvS~6XzǐO~|1}g?ò<~c>s>߼= V߼= V=S9 CY~!mz!mz!ꟘϬbφ#e79CkՉ|HXNNbڊ[SJ *ԄuDN-2gY9 G.L$(sjj2lyR (+g}@ WXS)pUKrNi}'l\BPo "|gį?h>>8dBJft%e\Ls>ĪS4a7leMmBd{x .j쫪lN"Q6ʎoUvH=2J CY~N4v}2Ol4a(b)cQRgm')Sew))(6C#>s>ÔI:ujM*@̡'KKaMj8? 973.H})!khc!xϱ>Ϭbφ#2:LP̆IYd`dtnAbX"[U$IKʾ 1C}?o>>5VMv%Z|łS446RXy>MCaMCaC?1ßY9 Gor׫or׫Xφ!Ϭb?S~6XvS~6XzǐO~|1}g?\l˸aH+" ؍ ى!ꟘϬbφ#2eə YhplmӏzǑ CY~[l)SKiRWGܲQ  آ!N!6P*QS?_3W>s>s[I=996y!$]JRI;4ܻ{>"یD<|WKNY)Zrs'I;sɾ\ftw:#~jʍCOԡu0nI] E A~G,w=^vbnT+ əW  M&/ ;A^@n!ghFɢo$^AQ;5 ic3c!s#27*尋&QEw 8FS~PJ4,E9v &8f^Fvu `kCz:3̾&K C$`=`\HrP/\'?i׫faz ^}mL6"癨?i׫faz ^}mL6y-zjGjaq4AkՇ3P0=V>S Ofaz ^9-z0ژ\b|5 #Za4AkՏ癨?i׫faz ^}mL6yA5f2}n(j-i ҧ* ׆jFvη.OEEUߏ sqo ;g/Ֆ׿;vx9I'awե6:U+*sԄu<蒣7SYslZuF$oBi\O*̴4%ik Y#&z"pկP KrtM q$fP wCMcm?Gi.^{s;^W_)_sjP_/XTYٙu/60ĩ&ą%\{)w\]7QOIʳg }$ XQ߭CÒaNvEĴg[B ^U-@]#x(8YUOSL&L%PJ'u57`ݦb|{KwHS7iR v|} w-ܷc?N4tTp⤋yQ6rܛ@H=֪];kQCTju¶l.@_]DPӃqBU83;r,freiV'.<ChJ*RtI't}+ b!-[ia.UK)[1D!x& l)ti)"HB ߩ`ULT%ǍLӕD]ƒiyk} 2`uQ}INGm}Q9ڦ- Sw֎1ymmYi+˜F@PP"#K܈@L-[:Jm{/ۮ{d*WoؽdGb{^:;_ }B0dL^CgV]J3d.ѦTTGDoQ~TbD]JRdmk WlTf c B0M]R(әT M/bxўQbz*t샪bMAu3?~ˏ$#G{'9HOZGdf$U$N 䕼/wVW_i{)`Gg{_;H_i4H6T} wx^>/fJ-RFD3o={f"D9$mE]7ƚ(ge'HϒK+Kw}x1=&ěl;3-C̑n5#xuaY{e>[/Z"ZZ{6L!혋NIr9/9,<Éq @؂/ > x}-sA#M1xjj]هۘio3jV .3 uw|^8+;<>T<<۔.8\[pIM+x^&p1xY蘀S3:\+_1qQ,Y'̬ܴpL24aY6G׌wp4*RmN}I&yt$DbLrp۬fC*iA,3*IQ̝ڋ[}0ubߣe$4 |e*?GQȕiӌu6Z./eq_ tF}xgX0 ŒU&]Hv%Q#CZCjJ iW+*]oժM!4dSbO3l-=%aW[PwkX&mx^ 6^BU.ikC332YBRHv(G qTU|.ALME%`9 Su(cQ}6ӼחSU $uW0g UB~FUǒBɶ…)v=xttќ)+3fx K!=SA~U"X~ ,7u$.$hr \t>ZFVipmt)a:$Si J$갠A7 9S3qTGV/W|cMPKZ̲Pݾ 'GRrJNqh/G(آ&32))W9XBR][XH* pVeߑq!R+3l(^"NHRY]_lᡫY㍾d/WMgzj,Fq.*vlP I* ^lsЧ rӨ*P*cIQXY˺ 7[u{ h/u6c\i‹I;M.Un6 eT%R斴333,%$oI"JM%uͷ+ .HLέII6$T=%&ڋMmMNT^Ѻxa<L6~bBU ] iUbyX/ :QV=x^:,2ο9Iq34!ܒj*d@I!*NL5JR;򹎢M+/ )2p-}Tղ.QHnw}!ek:mxS~JQ}"K lJ9_l)%`u֖0W~EV7e] U)V \qBHQu \k{BX3ʵ1ە4-$%O$FEi?$~ YتrLĔҤqRͷ0S72V(&-{cpBBU7,MR\SDLCRФ%Y-87&C:W(dGXm.6($wc>K["36+QIpDst;s$C{a2D[q$!V:(APD{/_!8҅AB_SUn%R] (qpGSn',M&jE\^-&PuMH^3^^BUI292 1/PiC&J EMJxXBYd^mr*G&bx۪~I=)<#ǒ^Hasl!DI"׉^Hl%C#:SIӦ&SkaGmіcʤ6%wZtE':@lw{Xq JOJVnk(VU-i9V*eZCJM0dM scikf6nzHjR4ZZRUKu )Bc:[_cT,M/$&)3Dj/4ssۺAYVD"ZO \@̥68Fԧ9SVodzIMQJk{8ީI5 Rv^RbSdlR:%AVRO~(܅^CKϰ̻-r`(6VH7QokGf>L~Ai$RL>өsf JGqh\-E<6SHmIobe!µn9+ukWE,lӟ>LJQVF13RԮg[^b^$eJ쇂Smc@Bld"Yk}IuD E<|%k?Rz90_q @[4 =ldHNC> Ue-gV&[~X^*7NIirҒ ˉSYJm"$^Kyj˲Oe6X!Z_.+.S7'z"zhkiTdҸ&仲2Rrnʛ˸(B6D7H Dmܜb'N Kï)֖JImնT/ ɚL#7,>U 90ZB% B)%@(")1 igPaŕJWkRT(JQ/`-v+#U}*tjR\%n%=&~=L}^:I#>''FbW&RLH)sJ *,(id(./%7Hm9:hJ\|- hUrTTTARdMN&yw}dSSn'0.!Jm E&.]9uRt8T*aN/Ip/B`.itݭZ3'hjyDr̩,$lH"p1)mP!!bUEY:WQ$nI$ #>''ΨW;ӲLf]T ʔ* mk"G3蒎M0cˡJ*zOpZ(&3nTrn|&C3ֆTSJi)*6 :Hy]z쭫ߛ!;9TJH RI6isTV"(mTlLsP)6RR"nJ K%)r $D+R[BBR3(lԒOҬid/5]IN{^ /gu8zjbH?N?ƦJS)6sbe|_jαgr?]R HJL2(ˊ9ZBZꢔ|9pKjaDKI6Ү7:^i'vS^W>l;}UX&9|2>즽;}M{w\oZe3HZfiFb RTJHnMf=}M{{\ЛHHF) :f ?DUR2[Pnwk3ފl;}5jʫ\Ji+Dv\Ḭ́ HR|"+8ʟWuR"';-6ɆeʤNklNek[.[kSf=}jUKEjх_x5;?VrvnMs2)N%J+RRʞ*'ͯe5)EskSފNNJ*穆)eظ BBqxlKpri9;eiԳms;%wu-ͣe5)Es6S^W>W6Ѓ]No*߰\ q١I RP3/Gc5EskSފӹIslw+4ꌳt]+,ڌ]bm6聗lnNaKq!4&L L))+tk-;ѲG)yN+tk:ҚI FH l=}HMY$Z#QY?-Za'sI dī,!/.\}, "ʸHt \o ׼gϺ8M{w\jԕWwƒOgomY8Ф)(y P"^fPV`!'7Oa;uY7ԍbٲG;)yOz+tZiR*;ȍ?PMmNqL:[ -A W6S^W>l;}ќcHdg8_.¨I5Ngf)]m쨲TOD U%#15C0[s5 /.]JRzHH ^kSފ ׼gϺ=?e*^Z 6"+0"gYdɴٶ-ͯkq$rxlT>|sG;xz+txrn[^3W~r(T&RCrJ &ĄkSފ ׼Ϻ:Z]QML;ӧ-c&[u8e @@$|{{\׼}Ϻ4zꪤSKB:xb=FU3Sh%YіACoQ^9TTRW'J RJ,[K7Y=V׼}Ϻ)yN+tqө:nm?cZQZjm>fn # fYr%c$ qG;xz+tQ+#?n(^;/R90RKl- IC$ @$&[NTf&5 bV0{!JCb\9`5e5)EskSފkU$Kc`wiq;Lm)(V)$ \ǹب|e5)EskSvt4.N3MJ˒U*dDmfJI M{w\E7'Zp)F;O)G5;&>Gk)yN+t6S^W>Jn\M{{\׼}Ϻ+79TmTEH}[6S^W>詰j$T…$/O+> vR;y!*!%SSm2EPJ)EQ-$Zy.o.*+vgejG/Q)1m˕M!HCĥOO!J/kBasr$-rnKNPQ&Qbͯb/ejG/Qh칯|72%Y 2qұ21 %ɨ6:6jx칟| ?8vK)%yu]QE} xθm\Z>-D;##ŵ ܫ'r$bnFm* ܫ8Bf'r_ʾ蓄,.Fm* ܫ8Bf'r_ʾ蓄,.Fm* ܫ8Bf'r_ʾ蓄,.Fm* ܫ8Bf'r_ʾ蓄,.Fm* ܫ8Bf'r_ʾ蓄,.Fm*;?*R8_raas>+R v6;ty1Iƫ=D5~5Q͏OӒwKDz!FB!!@B!!@B!!@B!!@B!!@B!!@uk5'uk5|W i<#ǒbOEC{C! .ſP~IZl2q *ZlwS'[m>ʝvŹt/FF(m5>BFrۘqsEf\@$nuYCv;49Trxǻ4Z6қTiSnn ^ەF":c9.+O[eCPP*#*_'NX.Q %&'q:2N5ga6QTZX*=f *fhw"2C6+3ǘl\߮ <@-R8$7 CtM+[6ysn[|QE.D aPg1^Dg"tXtK(X]JO~ s{n*YڍJ\E^YЦHq<-x{wj3߳6c2L*JVFЍē9u>K{7Zu^}zeojtQj'O$dnM25z/MLʶe(S \̬nƚaͳp*{y"1TOsV;[ÕAv̵z}NwF^и|ji9y#u#yR7mrn9=%lܽՓ3$ {z^Z*'2D mnqd%$; %:nlM!ލcXj)φe*R(B!!@B㮹>Ofd㮹>OfJᚭ#ǒwB,A^H`y=K$..V zKT9-t.6 'w2M{>sGw4B:V z rHJԳ&KiR8X MD`%ɦyk5*s`> N#1ƕk*ĚQNtl~Mxo㥢CĴx2/6$:%W]*R%Md.R8>kUYJ<R씧U-GrR8` *Y HYH6ļ;j5j$&XVI M2mKg.U-^VSmj-۬BhwD!J IJ@qmW/J))/WX~GLQʦYRL_"PnnmkZ}O$[t'~~c狌q(KaOQRSZKyөZEW0mX~nיin+A."W 8^ltxm=G+yp^jqń JQo$_ bc!XeKbZ Iy,JWd^VGVUki!@x홦 aw@ZwDc [ZftehW(n;EcrN3.RX}TfPV[MgQfH:l\G%3%DӚ$^:5bncD]9oxNRn^i9u+NutB' @!!@Bcs_?cs_?Q+jHB~'uy"}^H`k'dN Ó@Ý俍?PPIPEF#y/O"R&<%ĬU9URnu o[i6-z-H~".G)TI٢T’mJ#Qn17^k 8$iJ vRS?cihѢ iOJm+j7jOW5lz[bRe'?ZzVNb)ZB3tTZӤIlZ`l#;RNEF8JVWR0HbZRax}sOJ쩩YU>,) sA VHkENOb閫[ITJ;0L4m 'ldU01"1Fjp֙vbP[(qkV]'1Uu%+bz^oV V1+Nr-<% WȬG+N=H)R;"&gK,2hMAy6JFk>m}~f+#Cpbn<[QdK@m b"ʌf,Qa8ӔṬ++,m.zV":-f3O\|A/7-/V&=Vq--!Ilm{ǍXaUNt,f2$2y2HJӘ7_&9\,Hb {ZA,-]QR Ru:D IG,"FZMT_>a]ڒ3!uCk<>)ܓR8L"~mեQ,RTCm$ߺ+Xvڴ2bFg)ҒL=Cm.L6e&i"50"I !BBXd(?)_o)y1I &w B|- EN]ĕX[LKJ VT(M$Α'X RqIL` 0㨘޴*)g470g(l]x3:U{Y it}y*K*ZY N!'&){OnXmkq$JJ%c>nHkvY-ھ`nUa@3IҒ"llmvd\iIueA$ooOG/+2eP*ãAkǎ~2 )Z9uM:^֏B.fTۨ*REE>{$X(f&&r ZV~|_ׂ[[>2 *KSHS$X,;ņRa8֓=G]eRt$hu|VDm+M ^_l:{KtUKCQkL4MnlqI-3,|B$Bcs_?cs_?Q+jHB~'uy"}^H`k'dN Ó@Ý俍?PHÝ俍?PHV\r.zUjq(7a'Mmu^l"!. iJe$:X=7InIsܜԙ/(ߦ:֭@BQ8J cAl6$\xt,5Vz &^RԛsH%t* JRl^K=5-SCWlO!HU#rE|%KSsʒ`Zd[C9rԴQ=+Dݕzh Xl/ܧq<>c[b+] yJ}JZs+ Rz!"EJ0S⡴AI"Á2,/+dy(sRtBQ?1/^ObWJ]9Jw*"k\_mSO!.6* B#:xļF9*~TR0ȩrYm;?<}VfϷm.k[-ѥB5"?vL68y UiN4y'T @ [[JkV!S2SɔYJy-p FVbN~Fe U$\pu1jcmPZYɰ-:ZCgNSt$ {45Qpw!? MhBnHs nEe2mi BЫ )~M( s/( sm4PwvpʚeI/hRmB"H] =_sPƟ>٪2CѸsyẜZY9" fu$*۲]rQ"Y.Alu:GMUIv7XBS81V'\x u/fR[*)hکd}#I(^e൥\E*Πu J;RUJ 22 QI ݨ^ Ctk§:&%.̤2##L-d`.u:B81'WIU M|-&A" 4-Y QK9(Em=J~k5J=VF!Y,6z ^ 9 )_CERy[tR󸲪RYɻ[)^F׶i4z|e@TD?) )PRs0n'u%uS%S$%= J5[^$eFƴrԺB:qRTR vGqdL<]-'U} \S)T…tލu׉MM6=T;vУeְ̼6͡hn9WQ܀kkh CO噔p)$ PRU=o:tbp((8 P Du=Jv(4Z*778^:o*$X牴*xu+/ͩ PT+z7Ǫ ,fA<|bۏxT ,,Et)%"pWǍKu^im IHӅO$>xQ/LQRT#S{]P*,XVl~mcb2ze;CofZM;ƷTZiUiRJ`%toZՉXZUս_ Np˨R#{K!+#Ap{;?|TtOWiHJeGN$+y !L˨/#:xu N25*bP+#9rJE:im.bF*ĢjTd6 M+Wtt=cUsa)XL yFmج}u$Y;1"K1~:럣j6N1~:럣j*D;y! G{$"V zK'uy"}8/Mw4B%"/w4B%"cYr!ERMU)))Pa=Nd.Y)=ˋa[P @ #6F3ݷSjXre鄥b79ci6!)u@'I>s (\6\ĩ9r߬VjH-٤]#*{pN<#cv_܇W_=Rj HI%.@d:k`w~ޙK둗Ktͭ)]zo{[kxP#on{-aoݵ8fm.̲S3A!&ޜGXjqԚ)&  Z#Ma3OZkr'p~. LB\$Ot`21vp9";SI(6Ҭ{^ BZ%&\ W8xTLt58B`!@B!!@W}E+l_I^}ۦ~SҾR7 cF_韔CQ;F!BB*ػ KVJ=<dw8VE ]LS.ܔ:lmI:ƻd#*:R,yC*ĐAA3fvPո,&' izLN\Vx?_-ݺ3 )N3&TlV~uiD.MK}]FoL]ScJH>%uؼi+Qfz*LeO~$Fj A@xդޒMu%*:"<`GSzU/ԮeV5 t5{wSѹ17<!ӳJyrV 7!+m}JķEWZ.oȴom1inPJPwnc=e˚iW\j$-4RR2:+j`8wi`Ru9:yN|ZKv.DKI]ue *Z!67$r#ǔ}qO%^}҇BouROW@涑+#}fY-},ݜ 2ԩ>Yh(v%NËne&f35,YIAo i{CpH_e%{+֋-tO%^$/ٸ`)&oEǖRU{^9ᒯAH* I+/ M2m|mAI666#BQkcͯNey;E_VL|*Q6d6 [Q򸊨"X!-\Y}&BLbה/LNPMRMx$'}֛^ye! O_Q63T{ iG`رΡqۍKfET;ei-4!) p;"ѥYU.fnQ2C+eC8-4u;\HR/2VRr۸^1Dh̾S )TsH^^terNkh؞xJJYM 'AsE2-VJqmfSUd4u`Kɶ7Q =CթW2J[5V<lG$GbyPWpIrƒ:e%YK26iT6B$U%.X tO?5IGMv'6֗97g켑(iypFM;e'PM5urq3(ٚ- 2m>;k 8eDvD*J<0I4l!c 5:n^~M7R'2nC352bRIri5+JGqrHmTLٍ̒&ֺuo/\cjRQR$|#te:]iiZԃ:JϔvF75~Y8uk5QظfHq)<G~W)X+_g..V zKT94 9K9KeȄ! BrY:B%9'/M$& BnT>B\ABҕ%BIu7UwZ4g pԖf*gύ6L(8kPFQs&Jl6ą:U9Ytam#@h#+6i4jšJRRD H.c e=?sO4s%JZ{-tڭVTک3/MȔ N/dgPLFSqM]pyN9B]y驠fͼ^ShJYBRTa((amշeKi~GS591M37Qe، Ó/tzWF!L|R~3Hw"g|!Р!!@2(a \@PX9Aݡ Q)aQ2 / 6Z^qRytY}.JT7ZkKKN] Uu!"bAޖ{| S!BRn&kth)/ۥ7Vm~^#x3N..] 2VЛHQ&sn63>ҔJu !ZX'.r mT IV#{|֎JM371CǜGg7+G~P.Qe,l4F-@RECc,EMeiC/罷 NNhc ͔L!r˿EjMpVbz9d70x $^;9jWtǥ'/łbrO`Yf)2>Jr.$'hu B9Z%^ulֿدQUɓnZwrËMNlݑno'ܙ*z3;):rk"8G5ƀ؃tz4FTVPҪn)gVhʫ̖ΣSp %:n4eTӄ$ +!VuZ(|Hb iIb]`e&,:M)Iݡ \p40ԬR.ڙ2'8U5Q:_ I|?Bf IPOO#I)pJG~l1=[[zjPخE%GT]CV$oS^=bs l9RۗlM(smtb$4oy"*K)m\9ee  jM)vdٔaenM`.u:a*)JJ4f/q]JbI[[XM CA?(yJn4xbYAZԇHM3xCAB"~*YP%D*Ydu2G}Ϋ0P4傃r߄$ntAbA:r rd/!6pH#X\f#},"ZǓ};lf3P2%J]H)+M형q'r@2u,=JfOVַguj6,ܜYJd>l|+ZWuĜ',zqoI"Df! Cۥ% 9Ή:om\)ڣ$K\jQE*^ZN*SNЖ<:sN,k׿(ͣSRN԰ٵo NQ^(bZEВl@| 1ߨAT16LrRȹS&Hm}ј1(,PTyԠ尷t:Dq$_&Bb^u..<: i 4"*)%Io!)7%Kν[:i5Mc-䈾[ Nq%.iJ5'{8˩}"^W#%[@bm^b} geqWGd*TB=W1O'&)تAL*gˉ$IY 70:uԋkO[`=$oZR$E%hxiҹgQiZiAxصZHQSEDZE3+Ϡg"1>T-kbbU)6 Д([2@A:Vl=&f Ri%BRTsOtj$5?F].awhnr7HjV#SaICm<7]YPmɴgJakױzdNUiukN7ccUfdSmI:#UO\ʧ~ӄt˵3,Ө(ZnEEt>],-Km%D[wX&k?8Gum%_( RJst6#_!j8f]ĩJ~1H~H]"m2fl-Rޙ%\I O*vg*RHP|#))u%jz3Y#u?GlQ~:럣j8_( i<#ǒbOE+{_K=L%J^OS>qJ&;~;~1ହ"B#-b ]zoW0Q^Y-W$ Jr]-櫵|O]m>)&Oذڑ[:9S*MH0*˥H.xG[NەD?MT6J X$!aj*Q1)fLk6ۈ^O%JN@5@BI@EŲ< OF)FNNwDBoWuV[ٻ|qGٮrbbqItjmH[O>hSir2l˂ET1ޭScCdʩIy#2q6PM/kļF /WZU۸V LΤ'u[zDJ~N,fglh ͳ`7`tEj$lv.oX)E:N5x}d <N`;S*{{puw#KVgMK4?k:\$$fÌAQR6+Bs.ǤI o<# 1%?.ʛude ^6Dꛏ:TP7+U_k- `Q:IX:T}1.P4=LzMǮeT+QD}D*EWqT*[vTF[kgpe]pzD!J68hIdpFAyeVI7S}Ʒ_ڞHG@l*m6DJR,`JiT.ҝP@D$@#©}OMp_ysz`DS]&!G(*%+RT2)][*ܯJ,.f]F+ 6䶋v:kTԌatT IPPqMG&EoxW,ʸ&U:KqkZ^JP/{n R'#G yg"a iI:$/&mjYsyFCKJ/?6G\җ7({ocORNMJHHA1]s|F㮹>Of|\3UwBHE#?{}/3\OE+{_K=L%*p^%iJD^%iJDǂB!@B\XK \n|:}YS")m{ŽlITʿ^M\IN IɪB|4gfBi %!Jq@T ^Uq練Omw!q~bG6Ta 6T(7_'r}{Z&Ki\e-+l2 kfO Ӟh"heJmyTdFS`5E#XinI٩ʵOyy6aɄ%!7L"pJm;W;)xCe5֒%וY@ tT1<{da2hP N.Vm|kKBgKi59Zu:N(Z%A ҵ6%yBA() @#R^0gq ~sZgJJ.v[KfBTR<8Eд/YZ1Xd(2x\Cd5O.OHQx8ZH.$2 F&}8Ϋ E^]F9ڌ\ BqD3GpΦ%[m_ ;H:aeim! "GdufoWQ2.OViR-t2SkArM{~#ĵ_81)!Vu nX/H /vpȝ%i¤-* r\+*l/}0Dw{oo9UUqtXY!S*YBueU#]2/HBVdڊK-$[/צvFlԌWc: lj.mskE޲RM6BUI6pNpo1},{Z(~T$N]"eڲX.Io/}^M4uLlFt黬}_$Lv$6yR*ʉ%dMfj[8Z()*I)ɒJY#ѻfILj8iT̻ݶgKeQǬ͸}c)IjU˵l+-TpU9LJ.}7HVbie!82i9E~7"6-jWרZ06o0t m=UJUVVI)oUl, ȸ#_EWH"ZAA7I #UVvZJ*i{fU k*wDn#ЧM~/'*mNLL6Jm(%~4h?"f ma!zi>SazcIߧ(@Ʌ.<@H n;hF5duswgS Hi% !)BE@8rMxkR\[ c>$-I: Dmj-l-ʫ&:['WMf\Sͽy*uz-$b7DFel4,u(DK-IZ G:Rҟ04Ud&]?#w6-:$TJu3Y_1]s|F㮹>Of|pVR;y! $RWϲ\]q?{}/3xrhs)xs) ˑB,@!!@Bܟ$s qU%)FCR})]@TZ,L^,5ʍgBzr>?KrijqHJ PV*Pb :ܧ'bVy)Γ[&ʯ|m2 jl"A+CEn^$3*m2((7IUQ4WԣR7rVy:}jRMZ/rx~<*iT&S*XHCʤHt>;iarUR+c4dJam +vSr˫14]vVyWl;+Jl4"%K*ċ똗rVqC-{d,8J9QBĘ»)ylL=r^ae[ gBZJ3I Nn/{Gg 1ZkpIʺ돫Ѕ%)i7uEAƝBZ싴XT+f FnvU)SjFnmg[f AI c?K|=23ZLPr2aŒS(Ғù'qL9BI U(bHb]!Xh(4Qm/k<'B]|ҩXe TU94搌3ը3*ݮO 3JȠk\x͒O<[+2/4?,v&/'KCϥqW+)*Q &47{BAB (pGQ*j^3}Ģ]L*̢&͉z\F^Jd|1R2+.T&Fw/@n+K'1uN'ج)R[; pan7#e&n*%N(ktNh94 *`3ND:hu2㊱6H&]%OGژ'Y^dlGI(JT5 ˡ:S*i9ㄸ}) jb?0[fveywja1iWj5=0R/Ofd㮹>Of|pVR;y! $RWϲ\]q?{}/3xrhs)xs) ˑB,@!!@B!!@B!!@B!"]QxW}E'xrenOJyH$;ɏO}ۦ~SҾR7 cD@L! -#:=op*:؛À{#wD}RO6Lu*^$jmq{ /z(!e⬭ Auܒ"F%֬N>Q^[$؞7DG3&= zg2}%WӸ)5pxae28s)\ҔJœb/_D{k\E⍅%:94ے ҝ\T/,1eNRLSoAjٴ^ P:ŗ#dRURwgtf$VV6ydUm[6y ƵE,մAgyB-#(}WӒm%uUmPA:`O%Y;tэ"gїK٤垙y'*G ~ERZZ}WD{ efY8lº@[趶;yڝ7n生']E^G.R\hy1?9+$zi\Mɰ: bk95%!;E`t't۞W]MIFBͥ&̭Ȇ 㢞: )^%釈(@,3?6焢 m)|FptT{( KK;*Il)ĖQ 7x*^5c.Nm=F7.6Hڬ&hE u.FD kZ.ͮt|>x6FSq8BS@Uc8UE!`#yO]IZ-s 1.3n b#Hj2Jh>> iف F^1ctj*ɫ;FnNfq`nSqAGn{%W%oeL6ݤA$pi7 ]\P(\iW,Kt8yD\6Ym:2=\t i. LI֙Ml-6MIxEGS.yĶi*Z֫% jI'pq.559I;Гu:=T麒+9BedJIJY{Sl/n0qEK T̑ ޑFSR"Q2iԑ H@vfZmP(Km!(BE4G}MOʏHS^ҿ??9.̧2tm|z~VUYƦz ,85;B =UU N/*J26n t*KxI˳+.% dpy#I˓ztaM{(TESʠᗘ~s-bJOvlxeTHC0nEcs_?1]s|GGBᚭ#ǒwB,A^H`k'd~W)X+_g.)S0y/O"R"y/O"R&<"XBB !BB !BB !BEb,Xd(O3Hw0L}n'ꈀB4( ci坘yE(i%j `΃SYʒBԧe$RԬr=H{ZѤ)QGdI*A,Cs Lu XFݦ"+M7U~}(J]ue) #D\􍎱5I;u!IafHK  mVڥeZ ˴[M$:Rv;="k^)JRNL8m٩s7PqJ,6u XH yBNIS(Ca]Vmsk#6CJ[a)JJP?97iqQE"1X*fri RVڧ0Ś q/ܔ8ltx߰$ 7D} qv@Zۿ@nbJwB+g*y,FTN#wyЁ,ЋܬfX&]C`LUծXR!)'"PKԏZ,STˊ\ܰ( 6=w`'&nt-#:i[N+mi)RT.;DeLSi㤦KoHuLjїcVR]A >Yu;DI VyE;2fu [`t2+󭤡9SfސOfd㮹>Of;y! G{$"V zK'uy"}8/Mw4B%"/w4B%"cYr!E !BB !BB !BB V+?"O/L?)_o)y1ItzWF!L|R~ #B?CYH[bt,w^j&TZqIZ,hp~et7\rvIjX$aa労B(dM6Ur&RRg[w<KQQVC4V-k:(6RB” lXT)ʛ<*jnL'vfGGW ޱ{c.3XVe>qujKDخuԔʴܰ t~ӓsnaEʣ \'pZp,ffzʽGQ~pDwT%il46YQKNrnl u)VQ#'b&SB$-9\W=Eq]"ɇγ7aǁJXBSIa Y kSoL6%+mCui;5Te'5dGB!Oe%ڕd*issmGU-TRT MJBH,b{&' ۤɉb!DV%eNSf*eA?4KGÈJP%B\Ոj{M8TfMצa V,{3jrQ U*x'KٵAIPH7u>,eJWV}BK)HLtXU RZwK(}H!l$h5 (r-[e.P#6[g9(anGnv4Mԅ<( HMK*bnaM8R.l.NUfpan) SeCkkhJ,nmcsg͔2 %2&͓{)DJȍnWeJ1'1v-줃ѲE&:X }=9[}<_|ux${pۉJD95mlq<3Zy:6JZ&ԜIiT%<>ē:ŧV4V+N?)_o)y1I &w y:$4z&BTSGB"`T}+d!Q}U#hIK, $$&\$1ЕuiRZHJv2jR& xsMERrV&ddSX\ ("EbO4?z>E*c=UN9c%B@!TYy٬uG$0_bI\OxF(ҋ8(s3z..C#kj/1[YFiquK ۉ I\WTve!қt^Y#p6"bs.N'ibZ(nq.u"Fݦ Z6K+eTSb3 X uU:v0eiRmʆ6\hSRFW%Zwi:3#3$=Z!VSmʣKu)K&b;~b#tJF8̨ L-9BA܄:lmTjA6R+xpHe-{8?j 3Ou-S[BP򄷯[ ؘF?peJa= :OFx:M Z!嗒vICn@J Ft FRΨɭl*JZK-A!I M$,D!BDez%C.zye Wq'&:6TOM7,ज़f6&o&51k* R2,5aa'Z4GCv:1jji}(rJʷu\⣥|VH 9Brnw*)iFOmp:b>5hiuu߿c\L0rM.w6 "1YtEue)S1'!}'dŻi{\%1CxXK=0%$qSսZMaW:ۓ#g+]RuJ-z"4#FXmjU7l=g_%^VML/0Naȷ #]P $ N:JQ%79:-"z57;,ς $eK;)\[]mc7J'E^N0UJ.2BИX&Jm$uae [m B, ;cGRWdB@875~Y875~YfHq)<G~W)X+_g..V zKT94 9K9KeȄ! B !BB !BB !BBXd(?)_o)y1I &w B!AbGGdIKKt.@9Gȵ<L:!@y|ӋSJMEߘ^_xAM&Uuu])cߋkNTJTAŨKoml]جƲ: 8isu^Ś@S.]iuf7\$ch^9EtVTN!PR7*A6kEm.I8-/&)݊[u6-PHA}LxkxvjR6tNOk*[vfiZp'p(ZX^;6eaCt61r`-x\qàGҌ&}U- 4V ZA:,Fݹ29ﴆ6VR㠰ME]RMB@S*Wc,S.ӀD+\@ܓ}w"Nɵ%*ZaBSxZզF=Oʢ&n&ytKEMzJߥx:ɜMKJKwo%K2qfê&6I% pDD&T6'Te꧒V:42.${&PHv߯yV0%ɉZt%)ٷ^A])ЃW5Q6`I~*V{ 5FoI97;8r]uAmMR3xFђBؐŜ*)2ʝ]\OP YNleBYlp*pO͡ߺ*jvuS[eh tk/s|fQtVyJu6,}7V0[Ȟ[+~S^be%nق5 ,OkJ!YrЄ؋骁r闔j]_+m%"ix@`.qҷ4BP$,4: -9ޢOh+<Ԝ=u[$)vmi̛H'ˠ.4UȧӿKW@b|k{(:ik5STϗ*P[2ɶFmXDU<='(;H)u/{(M"AC۪N؆m69:5R6׀;%2FV"Ԕ eSNu$IC 7.e!6J@Vf!1]s|F1]s|E_(5ZG{$!HqX?J^OS>qu$RWϲ\Rɠa_ƟDE_ƟDLx+.D!!!@B!!@B!!@Bw'WDY]Qɗg=+#p&>)?TanOJyH$;ɏO3hPB !:(goK7p;_uqDU&)UGH]k183s_ɯ][{&֥6mPOmglZI+h";-?2mN7dQLd(tvHA7 q򚄢ê2ͭvI)\)H֊Zk.hI'U%)X{Eʖ' d1%@,YfJYه Vn Dh4Lm ϺFb7@Itxi99I6R˶U=vtٟRERe*RLTwi7E҉Bi9`"y}'WQ6׎>x”a.KX/Pm(r6Ar4:kIYub]ٙ me6fB_57& -ѽB37) 8YSK$ ̋nJI[vk䋥2!Soi!8 IPm`0ޓCJ:aR3BRt b6AMq ̧!lݔK(F}"c'dVRQWenf^R]SO)#3(%"鼁,M$Al0M,ep뽽z"y]"WVjٔzeʜ)vŐI f,OM)3U),%:_A CQ K*>#+4z]N[%rR gagbr]%!|M}VM}V.ؔE7ÙG}Xs7ÙG}Xd_bRgaga1}HD_?S|9DwՇ?S|9DwՆK%!|M}VM}V.ؔE7ÙG}Xs7ÙG}Xd_bRgaga1}HD_?S|9DwՇ?S|9DwՆK%!|M}VM}V.ؔE7ÙG}Xs7ÙG}Xd_bRgaga1}HD_?S|9DwՇ?S|9DwՆK%!|M}VM}V.ؔs'WDJs7™G}X˓eX1YŠfk_韔CQg=+#p&>)?T &w B!!@!. iJb#d(-!(d"WXk|Z֥& JV'.ヂ)~V-0=K=0Ig F=Ph2UiM\l-_9UɉH&(ЏәH*Y):J䫁3bDT'2c"5iҕ)u36X UHJ7ܬ뒽-2@%۬I:1$q{ 7@pkh*K`w;7Ћ}Wi#d-J(ru5d:~S&VPM@P*|2nkA!(ZÆ"RB,H\yMdQWS̆mܕ ):l7c}xJ>sֶRqBlGD.e([vU: ]*fE-̑ Zu[֩I+>a!Jp 6Rnz;T 2a>ķn[5Eb [4̠)RTeUZ X䎪nS"Ub\y pLÂw|/̴]IS{>%9JְݿyK3xH=T%([ohENeMH8[nU[jIm-C\\i?>+V^CjSs2傢v $\Ge%[[jwNoѰA\arI̧Hߠ4{h^R#iEZ(PLhvIImƔH"麲Dh5Y& =YJB]]ۣKk6.AJRZG@\!+켺Xn$.VW'1N1$"z:␉NeO8@l4hQ~"e{'!e'}.nenlUU(zW'ip9يHP -7{@I Do2闔aMBR.nl1߬5yNR9!!BB uk5'uk5|W i<#ǒbOE+{_K=L%J^OS>qJ$췶/SZڟ=,@DFШJ_XK1>u %m $V340Ԯ)) ڋVV1e@ J6! [DOaR' GR6_a0_a1*lzaԽKcׁmG`R' yY?LyTz[r%j^GG7' yYOLyTz[Kި=xԿz~aʹz~1zQlzTKc׀=?)_o)y1IXL! !BB !BBVRKNԂ69W$oxi=@ryh %Osxӡ 0Jo=]+5xħc'193%2mi+{lSג<3Խtn0zh1?Z=rܞa.89uݷ%I׎PGC"|i3^L3go.eMZ'7HI!dR r ;B(I5(Gu2lBP$X$ ;a!!@B!!@B!875~Y875~YfHq)<xq" W(x&iTeC{eHP#2T(RH#FQcjʭ)0\ )va+1$ѭBz*A'[%A7*9s(+5tZ.̳( } X㙫ᆾe4Eᆾ9k_3EDjaf{Q9k_Ùᆾ0c4^Nfja Eᆾ9k_3EDjaf{Q9k_Ùᆾ0c4^Nfja Eᆾ9k_3EDjaf{Q9k_Ùᆾ0c4^Nfja Eᆾ9k_3EDjaf{ܘ50пՎ o0пՆ fL}m'XiTPmڜi83t 7*G|ԳLj2^RÀc`e fI)$h}JK~ E\]'ºO5EEqeE\]'ºO5C$1eE\]'ºO5C$1eE\]'ºO5C$1eE\]'ºO5C$1eE\]'ºO5C$1eE\]'ºO5C$1eE\]'ºO5C$1eE\]'ºO5C$1eE\]'ºO5C$1eE\]'ºO5C$1eE\]'ºO5C$1eE\]'ºO5C$1eE\]'ºO5C$1eE\]'ºO5C$1eE\]'ºO5C$1eE\]'ºO5C$1eE\]'ºO5C$1eE\]'ºO5C$1eE\]'ºO5C$1eE\]'ºO5C$1eE\]'ºO5C$1eE\]'ºO5C$1eE\]'ºO5C$1enk\'Qg\pJTI:a*5}Z˥|l5 Ф>mNR{KA$ M5:G{$#AbwKͯxi܈ss^t 75ss^t 75ss^t 75ss^t 75ss^t 75ss^t 75ss^t 75ss^t 75ss^t 75ss^t 75ss^t 75ss^t 75ss^t 75ss^t 75ss^t 75sk>t 3.SJ]Ny'|/CҥyT4;J! iR<*_܇/(]KCrhv/CҥyT4;J! iR<*_܇/(]KCrhv/CҥyT4;J! iR<*_܇/(]KCrhv/CҥyT4;J! iR<*_܇/(]KCrhv/CҥyT4;J! iR<*_܇/(]K@`phNǚ;hhB׀<]yڻ^Cv拔 ojx.P*,ahH&#n>Pmayavi-4.5.0/docs/source/mayavi/images/pipeline_and_scene2.jpg0000644000076500000240000017133212747716313025007 0ustar prabhustaff00000000000000JFIFHHC  !"$"$C"a !"1A#245QRTaqBSUVsuv37$bc6Ct%&E8Dr; !1AQ"a2q#bR3B4C ?W2kMŶ( +B xh^M1v01Ť-mpw$##Q۾Dz?WB]JaITB$5jJ$#I{-饵q^6D])yY 7N\)\;ѲŶҐ)nI^ UԥcI8^y۲Y3CC^sp%,4T$?!G}4]&K`\Hʇ KkG61kѯi4\X5 ZikG4Ӛiqc61kѧ?mbף_\NiŏX<ůF&!y^}sM9>|MaChx-z54\X5 ZikG4Ӛiqc61kѧ?mbף_\NiŏX<ůF&!y^}sM9>|MaChx-z54\X5 ZikG4Ӛiqc61kѧ?mbף_\NiŏX<ůF&!y^}sM9"-ƻF{OBDncIN3ߜtﯛFЗMYpӑ0Z}v8AXWB|wm-xq3Q=:q޶q% Ao79عΧKTĉJ^$(OC*TߏokeZ_s-+y-^Ď5N1ςXm1:c =AU13p~viO[DiՔaq%di[TkuOKv\KIZ֏_^] pť,&ܸg?5zr3l=8| Xǰtog=]@W/*sO܄{RrSj>\q>ѩa)躞+1:JRXZV6tUbjy--õZleCsc8We t\s櫧iS6\סlj3ep mm*=0/ZZCQ ЪIٯ6t>]/ ୕",Vm`$yHy{qTO}a[h1-[!S֖_+;x>k59|ռ$5 zտK-Ne\s-[!S֖_)os4|>js\yKVHj?/$5 [f\5Ϛ>jzտK=ij G%B3Gs5Ϛo䆣OZZCQ Хe\s[;gSˎ) Xʔ$5 :GV5_*nR&}z[dQ&4@[2q7wv1w֞h$jMWi9홨߇E+2$(>7ONHND C}fj}}e g8;iNZmY)_^"zj>,?22a:D0ĩ'%^_mZM_o)[vZlhr3ŌڒR,(.,O<ՉjYO^R%4Nb8g֎XK*VQ[nw|{/65٨8Qx,Z7nXiRT)0WIuJoc|7BB Х9hOvqUjtfI N,RB{ȴ?vۍجo|FW.q.\[Փs΄mcjzI$U.v96kCXpڸ0w6d4ח3Ԑ:y*FHZrT~h|Vpy#XҤTX"hpvt>>TN> XHTXpI7rSnE&Se*_hd$wUHtv(tn)jzտK=ij G%B2h|V֖_)KVHj?/̹>k59|ռ$5 zտK-3.fNk5o=ij G%Bo䆣Kx ˙W\W-[!W;V:VԀ-%'\"x֪jO'3[B^3hԐ+mt[__=rTK]%J;7cvנ+1^unqj*Zh=碱_>5o%4Jeȥ%Un9#ƾ苃P͒hOά! *dJQOu~Jj!-̽ Y2UPiMa^B[ ]f─  A$VeVY.M˺4} 2++%#$@}B ѵV֦W⴦--%{whwy*^GCC2BmLi4|f8<{ #4x!89Gkz|=54|f>L׊]mK[iZJэsݟ@}景4+vVE~3Zۭi- P! o3g+>&[GyA}"׶]^^i3PIf3Lyk̬ d$}$k4iy5*;܆;y`#p٦3_°1ޠy=3Z};zynZ L^>Ldu=;kfkGk54;YβX=MBoYh5/`>bˍ(8cHeSiZ¶-=8#+5N&sZ[uS(m}ɕ'-yӔKtp~R-INuIX %$nOwQ|郭%.2SsŁ7kiV>`@VF W,5VYthL6d[y{sh D+ GNgfƒQkוdۍ7=sL֋XcެJZ̙19 OUuq1-:fUKPm M%`; S( BwJbR$nqfN1mI+% %[Sm Sӻos\աM.q9N RVgi5ޒW뜘_{Xo*Ir;zkFi,[9jJ-oSI"HUxSں\tSR5/ S4yfbURֆdɌ%$oȠRh"䔝6ѽ3TOڢ%[ f4^ ga Jػ'Q=Uai8ΛIe%!q!R+sl(g=ON߉SO6{ [8|d.K|GfPߧޯq\I-IQ[8T@v ҅Y圭ӈ*Pruf?!QYg>0n9P wVk\^y(])Jm4h=ī\ ɓ (JIߑ@EWHҷSijdun,)pRR{ *Tҁ6a!bA[٦j7Zv![ Eul-sH,U'@k# .;4g)JJ!ܑ!2H+q$ IZ]-FVsMy.%+RN8R:S=2%Oc8Ե9Na)NZ{"Ri CsCv)(t_cCR.W߮GSj]:9~cEGyqvv=tɖshNT$ ݤtW5gcZ{景,y?2vghCRCp 6H$8eRT874b3T>{4Be^SڶPcTR }85pQT<^?W Yֆgk5֗Qq ^iamGk%9wd9hP^y)ӡ 63Z5%)p2B95V6Vgkcn).0дRaR05*)4ROu}gKOliOsVL+l ΀p̮F*'⌓ck۬:tmCsnor:_ZÎHNq:ձ,Яg%+em9i+jaCWvYC~̃drw>Rm-rӆ=zO xd}_'V͞җWSwS<- iSn%~R\8Xhdk>sl3a_Mkt͑yM76\ʑu%e[v!>JM \7ЁJmA yN+Zs*))MkcGV}= YcđpR;%AXR[ܑ2cq=c2p˒jd1^"i_{p[i :9hYlj;{Q &˼<ʾǏÑcGmIo!º;W%|V1c#ώ7 ,RcbjȘ8Z#PVk\dBu%{'B#Ym\!2SX8ܠII150)26vnH5̖0+opA* lG1Y)Suk;*nV73sX7UEd}֯Np2S+l;m=>_Y}X}f3Y\Ta.bjڄ* +(90FF|aK68wm)q׃8)BVISARTAQJ.vȺZnI>R)ӍG RH8ǎQT*C|_%O_B`/Z+7koqVƩ'=-%2TVR8J$ e8{L}zbՋO@2,Ea-ģo1`vFOU+*9$NI=k`O3ҎJJ@$tQMf݈ZA]hmO4a> ’ײF/^vEJ!<5攐p J3'WuV(mVl-n oKB Sl%(QdPRIAJpbZm-p-D#,$%#r'|X̝;DžWRU'\:L=}&'gu̢ØILe~Wڷ+cCcn֫| DTGd嫨 E)9sH>jOm+*2Ӻܙ!} 5s쪤ԛD`m~ }rewS/3ϲifHoc&l-2iG' RTJHpF/3ϲ!}zu9fHΥ8Vd6a{mv˳r ;Gip6•m1iɗjNLW>ʵjҬKr)R%hW.CaZ%!Jq;A"ZQEȋ9CpcCm;م ݳ.LW>rewU'GEjЅ_hf\w&ˆs1RKi8:V9=TO'ӓ/3ϲ!}k#tk7Qh.4= !O!G Ijftes% 1+y1#&OɗjNLW>bf<q+?\f!- HRY!} 5siݤՍre]Jͺ'73{6id wrc-C&yJɈ(RUP 5s&_gyemS:Qkc(P% ֚lvCk3RcO $BVgwe`|ZewS/3ϲQӖdT̈i&{N1CEDVYfx:$aY vN_rewS/3ϲZ<܊TIZ&m3 rXw$)ICR@{ȭ È jXlCnaLedewS/3ϲG:>"Uwp8HԮb-c8HuҷZA38V4 5s&_gyee99;1QVEslw. S\\gJ$%)NomF{'h(ŃQ_*ťa(umɾ8a;zBA9<!} 5svFgpOt',ϯɫViKEAf';fg-rqg8kd9*r>_\!} 5sAY {=2,\$*@mELH 8$%X?MX\!} 5s쮼.X:vV2QU7Gh;tq#Lq[V 2H4 5s&_gyeiHOUU㇆Tc\blEGSh%[ѷ AC;QΚCKeɡ6dLY)VRT\ޡLW>rewW:֥(TV񩬳۝ɗ # f3LK'wd MlNLW>rewUl 2Q|wT[Bc$)W z̐RKl- IC$ @$'o&%kMLާi\qvaȳ VB ڜn )I2C;\)ɗj]N)$V9 }~Kco!M%hX’BACY>Ow#5ɗjNLW>z /N%۸KD+\rKcl;.<ҒBrus92C;\)ɗjVv"QR4&k86m:rM>٧&_gye92C;\))n#f!} 5sXfL[W?P>MKy2C;\*$#W0$Zd(`dJcU(\r:Nr:3bͯcU?ާcz+/hfJ>]<gc՟j֖ۣv ]d]\5߷#&ksrR1W{ŶCfE*Ou}ij_ί#?RR{'#?U /p\j2Jv޴~Zde.[XXBApFr HIf~diÎ옻w +bTt8 V(0m +jQqߊ5l]d}u-Ww߮7 TY7C:eJ)Im) Wg g ַuS)3&;s a0m`!@VW I[`mnј, pUXn=նkKio,ݖITlH$9s喙ed߯Ul!2n42(p:RAN䎇g5@Sxpn+-)()EXu'5tƳYx'ZaiˎFd.15g5$fPP'9ZLtr0WQR^,h׃hR*{ZU5S)3$sCJ`6ˈV0F VI.`37_Ӗv$ra6$z\>.3&EJRXR()JJRR()JJRR(~/ښSR6 \$ `?[Us 'U9D.T7f|5{?bOwE*;)[ R)@)JP RKn-$>fy|c8댏BRoDeҵ~_T 'ŗC^u pWhʥ)B^qY[8m%KZ:IV[:l FqG+(tIn*n3Ҵ*iu7IC# XJNqPC *'h/mKĝ2% ;P%qCE%+g&_Rs u[[=N5}NV#vuԇ q}: H3ߛ]f!lLEk;%Bw;VpWzdK;9m8|5(qӆSC  <䴝߸&1{R4At'2mn":(*$=~s_hCk{%/i{E{Vv)G =㺶uFK5i(t# vRӎjRҬAuj+޼;"rYJQ̕ai QNAH=:%YD NRu+oި}na%i`f\HJ%#F(MmtN*k"k_b]2&2Sn6-Sݺ)*Lh%Hi)ń~ 2$ )w-g8* 9%}XhQCa tTp2=5+UOmW ]V•F#`/-,#ڼՊ*{\e`q_ ?vmk`u}NAANOS{QkWE?fEJpǖcj%:Y@Her$% =,{>:;ќ (u%M )8X%'= i39#mJR()JP R)@)JP R]|?W%Sr[*Dj}>RaRAWPOmֲG)u5WP}zKTؼ7%hڛ+ohJ#?¿Ο+U Vɾy|T}֣:Bs[J8ND`%ɦaW짉%~~⮑nr1OM\#Tc yj_kmpIm.aliBRO@5=#;5$Fy)I_gT3ǒ7% a-bymuRuj1,fHn1Y!+\гaG{Qր Ad)*:Gq5.oShZʌͶ0;[ *=:WV냳U a,1ߔ4_!.eóJPZ64j}XyLq BB~ul.vw b3"IjJYQB!Y}&;%{\m2Z$sIZr;CZU ?g7WRSIm6F*JQR:RZU֣_ĥzu(2!ZU֣_ĥzu(2!ZU֣_ĥzu(2!ZU־mgV|8 X*qQOg5dZ.쫯@Dl3aFdE'd>_)ci?ʨLھ%^0=IU0"g)JР)@)JP R+_d=N\_-!j;TCPRP9׭@4FNsQyehBP넧"+I:.229 o6Q.Ku" KʥrtU+!q[h ^+u6Na4ݽ;wnIܢ\:^i]konn1%+|m%=*8j*SWjVs&/j)Ty'pMsc`)Ty''\ȸ9)EPAFB+BTm Z9[E8|?iޖ[".Y4#)ف]ǐHV9qJy!4|ҚysWӉÓ澧00Qqt` 6ZTh8tR4Ֆ--"l~"b. gbP2rqc'TjNZ<`Nr!Kn #-iV Vwn^I&JUJӯṚ|Gӂ/kZ^*)@ kN)JFjǫ-L\sS&;qS?x#w˭e[C=P?%/j]3dP W]JRJ QYXIΎYkšJT(;5V9jˌHe3$婈,SvP69RR:O3.c "V'*>yrBpX- eErһ3&CqÒĒRFP;3$9UׄZ5Ɋi=91ݩySDR 6%$%9~}]b|JAg+6rsj?pxEvL}9t(J{Čj.J"^Wm9 I链:B9J %Y'dg`6Urѕ$ wyq&j8 IP WV&gZ fD)6g)KP䜃G0OmW^$9)cTiҌnXVgEz0^A\u D2&IQ YX*+lg"u-7qحer{EICnICdgTՖ)m$U}*U5*[>u5WP}zKTؼ7,7t![%.!HZR(aI# ַM?VΦ;-%c]Zm۬:fE"3ww=$gҕboǫ˻ Hf;jQlvDZqkK8$mҔv)돤cҴXL9#aM(2[dسc76Y pU !^ <&&RbJRAVwK;L<$J$+Zk놳)^Z3b[`K)$}iG N-aCt:VTxjnue&+6-a#%J'i{wNWZ%3]Cq$ɅiCom) /GYN|ܣ|5N=kiumZyH Í[,&ޑi p ެddeL]PQ-L>V++^ܩJQ쐃OAӦ+Xxmɳdڙk;u7֞FDTn٘aXXSr h'9SZ)Rf) iԒ2m?_s]kϧOKgӨۻ]kM╯֞FR-f] em8W!bJFJRTpv٬; $ LLV>q ݔs[Z@ pUXs]kϧOKgөr"d]o9i{R%+JҝEJ+NO !DT;l~cС*m66BV G>+O5ֿLt_Ŀ}:w ǟZyY:T- !7 )(9=ճZ4$ o3%iZS Ka=߹KgӧZ%3ersF]nxpO}r[QۧZt\+m2`(RHP%vG)JUR)@*1~T|ERWg*O:?WpDjRAJRRTZ^q7})4#0Kd SLʃxN(mH|_Tjӥƒ%6h++p $4i\pީ@5E镫i.Ϳ1|\NP-GNmg "^h҅G|80RUBW,﮵ee2mą!h9J#T3HG}}R<\bJuϪl:miJfI%ŗ6a79[̭TRI|+=J1wX%m)J) BYO(:N00@jQ`Oï*<ǸqcNX8# zQkN'Nrn2JR&: QPK'qܠTBZ}P>΍:Ґu펀;T⤣>MUMjtUSQ w5CZCTUn3!2C9RR(`2Ur㤦hSE=DhNp뚆z4p4+v\9&RePڢp1n#Rp7L^sheQԅ()GUjЫ>;WĺiTfOMV9iK^(!('@ ȳ}6|98?:j)lyz.46yҟC(G8Xl]n:i]I $@^Y\]? C6&V_pYI%~mIJhdSW3u':y+r\Q0rO7[-y3$vgU\<ΠJy졶z Q*^H݊ti-ŵb8J6Ka @I'˓ַ5Hry;eU- ho?N_lRl;cOÒjPspFVB< x=mTQ -5melxyHF WWm~))RJTF#iЌjm!ڪg܆h:d<Gx=n՜>2Іnt>\(f 䔡lR()F=%URt5˅pocwToBM:Gq E:<4bP^v&5TXH~Lvˎ/Bwq)8\TJgw}qUmKؙ8+R'f-X%JOeT]z4#'Y8|NOPˤ{1 mϪcC5qχW;hnKBR:vBOQk93#HʷBqGN; TẍrPGprˠNӐJUpRi|<|F7-7dcGaIՇXei2ܷJ9K/c UbSA|)=^k-eli !@w V3US5 vfj-6l<& )k'2PX 5rmrGtNjD9$7F{~R{@jE[&œOaJRJRU7/~n_|eU^蕳-[OJZ}>U5*[>u5WP}zKTؼ7,7t![:ip b%cz2[*JXIpP2=$u%) JT )$dRq6U;s luo]@BQ0tʉ jA*BTP2RqtV5uzJu{KPېq{XeC80ԥ)P eI+T`@5)MWV䑏/Ƞ?mkSwʒ0@-2W*z3 )EEyVelZ}i |%x}{}x\K Z] }J}JZw+` R{!#8*ChܦxsRH*ұ5rx{vL"N|].;=gQۚQDOձ0b..;qnnʃn[*]J(# Hq^n dhOQ8JR<ҖP%Gh>z=7xa\ kIF)b$%Vu? @\=Զ4n tv}DuP$䤎*$7AѿXw=}2VcVhZm*CAC)lA )=t[ ƽ]"1&vb@Qe `@MCZ"l6{AӷhDIS\\KwZ9YUl-[\u^Z.C*3N߄Yk_ovK@pnKo[^wKx#L_cH( +np~ KI9%G4ƋHu#èTͧc)6Y޶ܶUB 悮@c'pNHbovZ:U'O.\#J Jjڬw ҉,Mw^>:ZT* ()JJRR(F/?b(Tؼ7*Lھ%^0=IUG_g*O򨀙JR()JP R ~ˁJp/4!KJ)BprqGj0m׈n4L%[F6;*O^m[NZJV Ђ_[K?>ԫa~)bP9B(HZNNHW1W+K MXm#.$ikWWaKuJRI^p*zvoŸTneԄxtf˜B=[BTJrַX1v%'s/]## \րN_GUGmwlwc):m CgGTjFu|dz ޘixUJT^ҬtEX \C8- TPA]y{ȴPɛcpR۸jGQ+QBm Sd(H^s١Ы\>·_B=UskobSSVi.!XdXʈnZP]N[_oq=)N+n%۔گlPR:#Btpԥ*$W,qC i0.i3sM07%H)$03W]-WYOVH;I* !Ju"?RKx %ͮ8m5t#zOҧ*܋$vbDf,tle%Ӓp0OSW)RpnjuN{b{@PRSt4}K2MGo(@ڲxgoN.Z CJ’j:+qI_݃xeJ㮶b;δ3oe.;Gj8RrK$ 8 X#Ѷ2HTzgʢ|5oq&諀_iJBPz$$׆R;\ܴ_ABZH1He$#8Vp ~SwĽxѽ[tևK+B)RNA_y°nwX6aKIw㧐-AxVE&e@^!6d`ENlHA*lΦ񖸹6|P̂wZpg)HZJU5wQSglv ƈ+%#͒Z@Rsݤc>)CMӍƏi*HPd 4X5lLsi $%qVRRrI쁞[slh-Vݾ=Qmtb%( ;6iJ…Z8Cbbd}?oiKR!0A :AĽC:MIESӆ$܆=T=~pA ^cZ鶧B-;VաcT:  E;E'7MYO|/ڿKۄ7wV\' RTzMN]9QLSˤ jm #<$y{c\i9_tJz;Yt\Wtp9R MR()+ts.㮯MsDp&L̆Z[y%)# Aۊ4tΌQ nUС@m$($@T.[pRW Nr5w$daYH|4D}uER  < o77q^q`"NzrU!kJgoqujtwE}N*CҔԫ\Mk&-ET[i.:u-Uw"n壵n֖V^(m R,z~cq%7ۃ7- FLF;8ސ:ŹӘKn $G~τSUCTG}T R!H={=A꓂:!]sMMݥj}L-Ê)} OU۽/ .fۮ9R5):p+UѨCx!"j \W7vB${Sii[&-PqbLt1kĶ=zPAcu.z~%,ם%v]̅V`6#OS=>j~ p멯Z֥49l6B#b-Xh=v޲V_Q/ߥX_ф8POc&^(Qĭ6Ko.9NU\6EpBq3GkHdPI$TTxSiU͸ӼU5=O/6s^z(9݇-%]V@0Bkne^ͣB[.å[hYˋSCG\{8mfjâ9 U R0#nG2o^[m6)7%3VpjT+BN~7lvNRBtqLiJücZmfYbrI>H^pys$HSq)ڐVk^{F+[FLDvh' gǏz%؍ ms?4 yw(kHE{lHӚ(l-㼔a lC]pGߺtKR |ԓ̕2CiH' o% 欺RC̬-C_u9XyʐVas,%#'$UkKF v_'ڄ2;jB 'v:IIGrتyVzQ\m"`7'0VJ|kZcۚq(j!jrSJ`rW Mz7-Oe-.)h4'p+rqIQSZ5]Ybme_J>9A;"!֜K!HZNB Eq~E^,Quq1ne, A2W8e[3b TǹJێ!d˃ GxjC5Nr.-SB1Ο}،2&*ܜSJdgO@wU~1i=mI%R=)Ryp:`稩)"b:im82C85HzGkN_=A}C`/t R+GtT6F0-,t_͞u AȮZ+ѡVTа*h-hd)ROE'zu8PRړdJm=&Z-eˎ*lH V5%JbݼV08fH8+!I/ؗh 5# ZѫuJJz{Jjɞ)h Q×a(q+=-ZE)7kWq5E=C͡đ*HRV{ǒQ=""GIR!RH ZHg8+huAEzP3p#ڴfE:ClPƏ`jUN+HWkCJФ I9|"j*u?GUrU7/~tJٖ->E*Ou} ~WTsVl*l^ :k4߸WlcR%) JT )$dz^ O[)Np HJ@H+sJP-\,^zDDxiܧQPpgʥ,# ᶆcޠԗF+*m`{V\s*W, MNT*sg(#H՜b➏s [Lq7A o~;;z~:WpԺtḯ,8 {*}`_(rgRiOi}Vn>},[dpC䭦#i Eƞ["g")%%tr3We*MOETRE5Νq.G5;:-b <,*QVW[F7tvW5$ޚ|r[Vǒ62+h2▀V;*ۄuiU[[o"[e_@O YƛѺiP^e m=TF2HyjХ*o/nR$R()JJRR{*OQOgSbܫ3jx 'U{Wīci?ʢgSި. kӶsqi JiB{U$ *'"Mh52+[ a`դZJq%szuS.2Ԧޗ36t9錓[;XHEQJIjZ[`$vzu{aHqռ6IV0 wSv6!(e"6Fs4g봞aj=(p+o25;)xE^)! IqxIUw|(71h֓ZH=~qZNk6bF[vKˎ!M8|C/M]beJUr[H99AcvO_4\6:52K{4b!!EG=:TyTry,9{xy=op< kGae2Nr >)R_8Dk|օ.(F V*ܣ~N&4CR^v’Ӽ^vCzk̄wi(yő%-m)NT}WW4w.D8:i7`|8Ui%/ؚuWKUU0íF,Ɋ;^SN ecڨvOc)I#U n?q>ȧԼ<ۗ!* EQ@۽UZR:gU.rIuc!6:#ftQY."v34~hk5wʓ挱PWF!;#E^VNՔSN%nζ<Ԥķh^KMiJ@JOgG[4*j9B➻ጟB)*ulIP/oPjpMbqqnL]Ң^K-;RN Z7MQfz}o(%;cJH5<4v8MDr(ؖT;RR![ RTF<1c[T$TI %)N|y5 SpnC7AVYw%̒SnmU$<+;VڂpppGWևjs3Ҡ\f1y-Uq}1ZlQ! # $d*[nYnMqAA%Ş3~'Ap+q o) LB೸R+t v6FJ246ݕoؗp/CIաW{ '`q (CIH$5 J*vH7k2ۈZ0RA褑Ф#4m-4)JF@|V4tQ*r~:.s]BlYq-;QDZTS!)/}r$Nsm)nwd09wuMٯ:2|KFSx(Z IA'?zprxW v{\*W8^;-$g)x8'*Q7, Uܖj-K~UMIM>s1{ (*֘+)9N틏ڷݞ5`i;oV@i JR90R@$+ʚGXEa,FaNvd)J!k~St*̉-[Ţw`1rԄjT0CqTgjM':|+HDeJSF2'$UˁPAi ]IA3xMśޕCyDcR.2`ZWh$*##Oo%N-=|Ua[u=D-< K>Ҿ{Bq fJ8C× c@2pU m(*4w*'sﶾ%B%8 R":t IZ($Ԋm|. R1c:ّZqg~rXeH[{ A H%%Cj1dz{H^ R-ͪ nأM"zvHLm-))WC0r?er.ܬw 6,VgXsI$(yj ,ڕQztu>6)Yy'-: ڣb(sifYƪѭҖg12X;]AH'nGqJYǼ k|07| HTI#kǻ‘^p3]ӈuҴ,%I9 Vu!ضxY]wU\Ml-[OJZ}>U5*[>u5WP}zKTؼ7,7t![:ip b%)V*)JP y IzaI:\K݄qaTQМ&š.!HZR(aI# kޯq:b릡nne-NS 2 }dd=;l [1$tam#JR:>Ylv|l! *Zy2T@@@ɪs\O֚U@Ӛv?,2d v%/>hKd$Towۧ11\Oxm<V^Y c(6; 9e\x Hdۯ˓LK帑c.9O0 IA* 8»7sθh}SIZ쎽gqY8a6ܸw^,ꖤʑ* 0m``zIoo&ᶯȼCH(}! qmVSZB1GARZmjsj7rrzrDR~"A")@)JP R'QRz_?J_{Wīci?ʨLھ%^0=IU=JV)JJR<Iaz B.a*>D-IOtF[Tِ In:J ;A) {[ ӎܬO*tyF2[;Ӵ#W=+'dR.~$6=^;~}ZNJRzyMicUi 8wgoܕymA@a-e u5xiҜ+@8r^59*xrX_3tǔ XʀVw, p"0ᡵܤA)W)UU[+H])nq*1#))QN[)ʟ 7ߊׯ.:#s{]F($;23_PGr>o9zA aqRե.p]r*V8v+h sWը}%],mn夯v {iԍD&qê2vW:S]f]NGopGQGS2q9a7[-\x=>pB qb 6tˋ6 kͧ[H'hR\Sm㎽\ZIHO[Bj1̈8zf=iHJBB;:֛Gy:5 Ƒ)T⼉H T{ՙRILU[A;#ܡ'_]8՛eæTۖ쐮mAx9J)õ ݊wlIl>ʘ{U(p;Cv^+erN2z*ni-)"BiBQ ('Ɂ`c`npX|mB)]N6H@iom\;嵇CTPR{A B3T<Su^Hʉ*~b}]HRX n]UčHJJ0vB8*R j1>l <ulqۋy($id(% i*nkBU-kyj[3W6<ӭڛZMX.6@*0%TD[=;fj!- NJGDH}5H\x{b4lN|s0)8s*@˨}̳|\b!.}c qhJrH.$ != &_صJ[]=7yrLfGZ;pw݀ C]M\)=G} ](T[t9 qGф*7`۩,Ky;9dJPd2JT@2_ MmyLyI¶Aݴ5njK[#l@zPVH ;+0,!J<GjF o\}S53TKXdnu@11&±GWdCbZ׊fzSO^.ؕՖBP-yhOTvI;+4d-J#h. *^2rz]4ڦZͪ%)Z(;dO7nSJ<֐Tt ]-WۄjBаj(tRH#~pNNӱ5%ȯ6 BTӮd>pn͑;IT7jeI;@N!j{]J_2N}S.Wcc-8iDt^ӌ,u)9~))ZJT"+=jv?am7:ۭ3+;êci~;j(TBTKu)!#r@u\^>+SZ.El}Q7VҒPc`V` HI5ҕ׶4Ĩ*S$JJZA$e?O,jS&q/64ܰTZWޜ(=PSh(D-e|*NǑ'UA}O?ZRiWʈ*(SH#|SVqm(d[.M\Ե|}ও tW ;n^U)v3Ө(ZrFRFW"-(ccwϚɪ&i86I:'^N +|*3FG;H9w|5,RRRv:%IH=c;G|"D-mUЅ6V?h4\|Pq%+y$dGuvTqAvu̿*u?GUrU7/~-[OJZ}>U5*[>u5WP}zKTؼ7,7t![:ip b%)V*)JP RTX u?TmkFqK`U9I%Zuo׍O|cy}$6Z~P%ԍzUu;S` W/UjE^[ێ\fz( Jϱ,-EY 94xi0˦"{lMqsz 'W*”i9;;p\ߗ Gꎼ]L}oJzterk;k]/gZ d:naᵂMs]Jr<Wdd<CNnZ*@#=3_@v揟z;|~2ƥRJ#&B[ۚqis6IR;AտW+V,Ѥ%1,kJZ*J Zo$۷=J׭]Ӱ-O۬q#ʍqrT`d9#]۞NYg_W' ߊ)c!9Sgv.MlUQ$tl֦ve4Mer0Im\u(x ս-*[{Cg »5[_k;ZOT]M=ֶ$ZT+r ue J[CRU뙫%"o2ʥT:É>۴) -\&sŴ[K[cҐW`GY{p,i˦Cx2_XVB\H * [7̵ĶT늚w+6 Z_j>PC[cҐW`붻{XLijElL,N .0ylHmCRԽoXַJNZckbJ%I"VP%:e*A[5>βX`Df".P$ҶTdqR0e={JWv}o#2kgj|EI1~Vu65_{Wīci?ʨLھ%^0=IU=JV)JJRR(+|VCGҕ-BUq{Zj2z+h$BO~j*-*(a{'>q뎄=uV.J21{Tu`ȳ*9鹉mVRpA9zgV7T^'%,NIyj9uUjO~1 i!@Ss eE%'=Yԕ:qzqdUW0ݕf*Rm؃tygbA#Y9$b4^UnDgg.6˱Hp)g 8q'j:ӒrcrKJ(RNUGRq[e^k[K ="??c;G@wJΜ]O4\AjU2嶄 .v2 Iꐸ^M+qH/eK jīh0 99Z)$2$e zc$ ixھTqxV|C֣.@N"^9K`l)(N_'g l/ڶ5/f;J¶+pH*$<e͒ڴHҤ(O1{j PWhrs h%@d}ac1l ~vG^;Tg6R}J<6S1YyzmKrC=~j(Kn][yT( It5\qBȤ"^T'.ʴݒ2yQ=Ozz-HݾԛTE/1է8WհH$er#9=ltY 7) DT ,t{m}\lF)Jh'qWy~X+)/$nS.' 8GN23ң"ut*iwdĸEZ2:N'V LWVL-htg SKŚĔ&F$@u JY=$xusEk4`rn68BARY6)XWqgp8]d|4]Ll)+(hL=:F*Z,9 x μtI) Ux?fZ$ "O-J o3Rs)))g,W޵b4 $GDvc-?@c?1M5^mR1qa[6Qp$@IS*[u'Pp$=† w݁W׿UߪA^(PBH͑! إgh3$Ӭ'b%1vMB\W`˹XQ. (co6JU8qfР>e:i :b FAU|YGUKͩQ9QzK\=QRkL!$\zN[imX JF& n LR: gҹSAϪNmTP:xB'mr; 'YRPRISTN@nEد2m88Tr0Oq8TaT~תCfFݼҽ23ƞ")Jؓo% x$Y?i!̊2Hʲw*FE{Q5M9(DmT=AH" N Sg*R5OT<{Kǩ_o$WM~3=Cڮw0JW 퀠 ‡U_zNxIa˷V rIq>iiy)@pv R^6>"\ fCv[CAXܜdoRq]{yU5*[>u5WP}zKTؼ7,7t![:ip b%)V*)JP R()J#V-[촦iR(Arv;^2I h͔ - tB; XRTinZ&>Kmazˢ^K}twrXA$V|926Sj[%6ҹГAi[aАUӿ6jlA~]ޯYA.hacmkiBRpēih\2vvJvB9e $)sSzPlGdߤB>פVÉIh6g@_yMŊ2{Kap[[eE(JZm+Qܒzֽ&.̷v dB:vyu#E8߉V)ak&ӗWCIi96BA'h=s-O5TjHbfcJYg׮zҢY6d E%w""ܣyPCaEMI^АJ B@P#Hu{~%6)!bRTށuo)V*VBK̽[5&zP'AԩA׵A8Nm8AP~-h{Mߦ 411nZ䄬%!9[-&ӹ{Qw ^ؤIa k%hJԗ^mnFӀ:DZkSjHbi$%,rSnOJw~$Gkp WZ.q.Pm% j*mJJPR+& "v/uO3[%%<,yȱL PJC1ZtBr@2GxtTuo=ۭ{SX3B+Y?#N*9(J9)Rp:kmJD:W5yS#ZY!'bI3qVU*=;C,cnnd#z7f64ZQrOSFCLB^ۊrH ;I=隴`;XX*!e V ЎT=-lm)vq+1? [YW`KHFַQf_ik,侦Bä{5n+!M y\FՒj;*vfuxC`+5;RH|*Bjy7VHd*B:yp9g箕mmR$`i+Jh 0S `$= U\sz/JY醣LT`sB;``+LtOMnF#[t67;d0zsԕoVNO(g9 E!8NȻvCn^C%CA;:\9pnQ[_CH KsQNVJBPTI( zAJ4H+7 d''nSLZ>}RI+v+  %[r!~8ڊSVؔ4H I:*] 86"Nu=\dPSj8!J Qx\ s@Ok)^dU֒O6Jaým#: $.LfSkl 1T{zRzk9 JЕAIPTA WXIZcjq0PJ*#`u+8Jт=?8CM\f|EEFHNr zfQWPHٝ¶\;^ G%@}aYʒz/Bjoe(nRrBӹ 4#8yq]n5y}ᣭю`oʘ.IQ=0qr)i(-TB:PV$nk(W)zgOD]bz:L(ncJ#۝K{p֫ 4d1KY%JP Nmi$`$]7=58O22|%GUwwLRJW$]ә=FYwʃO :OJԃ,T֑jmM  mԐD ({mgܔ$BTW23k8;Ok+mmlgGGTddu|9-97ŷQh<[!;t  A;p@kqӈwF+"T$Ql8Ut܅(%Ckm8;{]}Xf$*82搕o)p*g4JZjĆ6`;p+~nFRVd75 [$ʯ=-[OJZ}>U5*[>u5WP}zKTؼ7,7t![:ip b%)V*)JP R)@)JPwh0wd7rAӁ9jP cjN1 uMJ۽t|)[)Aqᒒ}J(MV57"Nm8HJ6UkJ@V{zR=1*m%ӂPPr+:}`uhUZߛpRMZ2-#sw -6EnRfJv*R0%ch OM74=mBV `vcp9ZJũ˳]9 +V`t:V֏E=ȬA}r#c>ZXpw˚:_ĵ]rR٣jw-K_#}-DgBZJ7I OvH9N+I:^ ]}u\+ړ #RRTT<&Ҷ7`jʀ#aT G;Ǔ'G6˥h\[2b9>(P(I$`F m lM_ᯚhUHR&zn"  JLEԞ<k"|"r| $GHi 2Tyx'*ý~(2E1qTOI\#vuj$ {G􈱿fv*T7C2d8)8[e>MSiuÁLjw̄EDL)jl  1NӶ9J yc5.-XJRzڥ)JE)JJRTb(=F/?Mr=U,ȶ2̆u4ZBzj=U14Q=76gvnENŅdJMd/Vm*cȮfbm0^bVOZJTԮ> iymS$AH.3)8Vޝz_BQH)\{M ]h1e )cn'pPHܑw8NIR\Tl^vfU.]ePqđ=1FmC- "-IXޕ /<| j:é/i#;*= au䔽[*u!gFp[9͛F <K]vam g8` +E)i0)V sVlS_EB_g.Sbܰt߸WlY¿Ο+gS┥X)@)J[6RaϿAChm&5XwrN\(=z WVX~[!oA+[iPR;).Р#]iM+:,+OII mjKi* qIIKH$zSW^ʱ+R=⒔bB JTmJ$r5k%'EZ2k3a$9:IP)#c"uS)1XQoe+KjR +Np _5Lc(TsJ_g[z*XʤnޙSWGU(DI>Ju^v RٮRIͼ1Ӵj1}n[y ΍Vwx=^zlUI;LB2ZR,:2@7+''|y"ڊ_d:-*5TX痴j Q8WLNخs#m.*|D^S YmPühی˂f\U,!r'qWn_ t_J洿\߯VbsƚV|R{#9+mym:-RɻLͷ'P.| BѽIJ<i ]m6'-UI鲦ZGiGS=j S+ i jZv{[^Ac7{;t}춵 m[A }/`3m`Xx ݁V*5-*re.%~/}+3mcs{UF>7`+TjaJV%9nwBqS7LKqBs#(CWV J!cM߮m`N#^[J@#N2HIȭG#+Q^^>l*I)/%(@Q'9P +vaGpIC:i1a7 E)׹-#=Tz(zViVe_dEfTs^`lrX/`d6*s!>\2@ghSv9MyWަ9!G{˭|oƖm=gxͻ:dX,徆[Upy8\o|>eݡ-!fLuky%d%ħ*FA?{u汓]?-q GVx}) F!fRiaҲÃ-{22mR^GQHWKv4u|2t'=ޒ'!`YZ'T *9 eF@wz/Z!Qn(&8T[q-@k=“yj'$[`Uj&3p9z5' (tke1WPu$eGN2zV]+ڝ(b֌V&t%De7 HRr+FFCZ:JfS~ = pE*I ʀVU]qV\[NABqF\ݫcƠ)]Ѷܦ!D䄨U9Jjkc)XyܭMlm%?]w 3V]PM5t*A[\!j^0HID$P?lү ;ʃFE4J|";˛GmYPRN[AqӢ\k=CP+$4I.EQ)* _ṽV 8ov.;P2syRsϔ$cjԗi|ʯ9̵m>E)i0)V sVlS_EB_g.Sbܰt߸WlY¿Ο+gS┥X)@)JP R5%¹B6+%lHi.62|i#gXֈy/2!JP:V8+yJ+ܮHfRJT`=Ik$ǦY՚%CD+prO5ϊڹxuBuƤv@)=FGNup[7X%ڟ NiL,Brl7{ommVԺmҺ^֭n ĀsJFLixzpf<Pu,`6uNi`&ZFSq{T!KQ1:#m.RsdCz3VCJBq[G^d&f5 ,9ɸRF&2)VWJ)YnR&Ueɟ)f;PIIڤJV A$@=FtWr%>xc Z,Rz2lӢt]DYm-촖XI*ݐ܌rr:2m^ƕ %NHZ=넟 RQ1''fw xYVG)›%Ӹe+{%');FMnd4u$eGN2zR6i)JVW1C$sYuF; uqV@Y.).1u{w%JY% GBv /TY,(OHcTR-GcfsjxKbBAIP _S,ߊ/8q%'#lXCx!#6 yqڶ  F-'&T'gr'8ٔ/]NaP2kSJW8PZjYi Xi 3Go@ bpsYV,S,%ԭkJ!=»GRIB7 :R'+>]mZ[N.6* Bq_3b\ 9pe RK2soȄ, ]T %sa*8U,2[NۯrA'|;kD栮$;7#H%驰n,T! FHwi8))J5}xd"߰6s#RGE=p5p9uJ Dmm㲄UWAXP \6$N0OeD$){VqST0{Wtņ mD m=)]Tz|`+>m}"9",ġ(yeNmܝh$`aBkERU=Q}u*Ry6i*ZpԒOp>Q]M+SnN#'j!3Z5u'm825+QJ>H6 b3ɴ(FrY\⵫HB #˲m!ys VGC' ǂzĮ#sa۪Qq)l+/-dlI+],#rni-QrR3hKa{,) ܕ-kQ#muouKhDRe)e0zUrN3z㇧ܤ`k2xhiR +7P5zwLolRc>܅Pg5bk{o)h2J3x##2 9>r.!jھMn[UW"Kط!8% + K4=IK<@z@wy%pZ2Svs$ Ǻie2im$%HH*6֜kUȌǂ2V]B(w rS4Y+!Tܿ>ʫ]|?\tYlVaRsb ~:h{Ϫ]Mu?T+Ek^}R6/ M?Vεo+Bu1؉n)JUR)@)JP(P.[nPZy (m|-PsM9`Þ3iDz޸v4r廄ਣn@Qtz&} qo~IY|wo[ bntM*~!-ix+aB qPu]}c}?rMQqɢ79!)R]R ݂;렩RϚ!uK"\۬5tZK?m\X8:_t$6u[Kw!+\R$R()JQOg{*6/ ʾ?WpQ~g}|J`{? &{R 'WϳbZ,!k:9JR(`(n)N+} nZ㾄ԯ l1_S%NN4]=XCRw-c$`b2XR)R$l̶=[ =qjmY-J!ùXˌe-Pbܥ?!8`CzuCɺcf chZ@84Jqn 'rIa:jmDRHVHʀﭥh~C35 ^vH!ĠBS);T:s]JdA8|@ j%9:R} H' |suuQ+ 7'QQhSvVsz~Uw`1f+EjQ)H |{iade9R*yQmKaԷyQ-:Xz]N&$L,$IJi &>pɧ4yK};7:TR@d`m`pgO~}oyݺL5{#qbK !~]ku$rUpܻ4bn*$dg+$X''N̥++KIM5ƍ)`QI b6?fUTOmݧ kj%=)J؁ZMukx`KiOGq%mI)X$`ʕA+w_JV!i J2* ]X=My.i%X./Yd=iy@mK$60 -H yjܪ~y,>#(Hu()F6=Lun;ү-.!+B>TJ)JŻ@t=PW)уX GS[(׷EAR"ttJTph ݌#z39ZD0OiFO$˭&ōrt:\^B.SFh *Oߥ=/Mʧz[7ѓuN5$G#1ZQS=T ޼m랉Pӕf,6fm+*qҐz?pduZ\Vm\RqG)R~p5~[ s#)>ak:Qɶ[&.H,Ϟʲ!,h}Oڔ*Nok@ KK!=`CKWBNOPծOEݷR0l4 #aX-8BcO%VJ]RTz۞gMiVˎC-0Ga$NNzFEvT ""]ilo2a G OYTySr[*J]wUU[2մ}X_ίZ/_S]Ou} ~WTMr~_Of :Lv"[Rb)@)JP R)@)JP R)@)JP R'QRz_?J_{Wīci?ʨLھ%^0=IU=JV|emhܠ$$ )'r A8)H>G? P:C1⧭AU-è,_ I栐3U77tE+;aVHZ1FAujJC9C8a#-Yjt66Ala@qnx+HTJC[q_,b?6@[fKm֟w+VC[b$o,@gp9*bUfԈ{ iY$mPWBR kZΘcRΑlR')G(XB6p 9(WTm#ʴq^p Ȕ鞧냊_-P6 osjBI+UˢZ +t\'0eK.uߔp6=:޹Lj\XnS>Zs}c FUEbîE9*JT1sI@IQRYΘɭ$t*=e7S -!ե%a^im'|5!gfh)JTJRVm\m=N+Ȕ)?i8 "35)jpy8ҹ׊jpwb<է9[: $IݍW55:^T-KBw<;1I\O{Gv7 [ZFjBR!P;v0ŽI=9 w'A6e̎ᑼH;S_yG'_kӸ \IҶ/zܜ(8IU$ZԖn6!"eP^!q2rJ4䲡mFI#oBjռh[4d% SN>-RO1xtZNEl{=Gy8HyJK1PSqsIJV:Fb9RaRAWP}zK:h{Ϫ]R`p ֳM?VΦ;-)JQJRR()JJRR()JJRR()JJRTb(=F/?Mr=U14TuߦY__* ԥ+B)@)JPתKym9opBpx /Ni/[U$ySBBwmSl#)H8Rwzml\Sy2]q @o6ss | *]_ T%*qs OuaOcJR RHk?ꏰ\(-aXf01UTǪ}[:! %<7B\[A6 I!^7B.zVWXp+HؼqYwW}j|Z,R C!6V4 \f\l) m}v Z"`~f KIP= $+jrUZW BwMF}A>vo./G ;NReFK*6.7g$KBs)) (WCkc -$$KI*BBxMFkVɝ9F+t))b4JTR`@ Asz.mE`-)Y %x@#9ZX)IM-vmbX&RORz׽+)Is҅8h)JUKk.Qg@`)<+%@6Bu]*c't!zżT&Du %a l$u릅8ɢ1.uwm[=Ɛ7)΅Cn7nwSb1%6бi+s?U:&NQdyC0Pu@h4L۵7tK7&|9*O^3Ԥsu@' $&1;Pɾi2zÀ)?XwZ^"lgcr`pPGK4Me#qL$ .dA~ 8Nٕ.DBT -ƛi첝{@  `{U]jбBfƧ+'17@Fqv'hP%~9J%j KCN%Q- ImH5mIRR5^,!7euS )eY q7?iL(rg,h%$]9=\n6\="<]nS)NBIW(,wf/.1CVVJ!N*%G c*ǒo*d{YRn 'ҕ;%GnюដU5*[>u5WP}zKTؼ7,7t![:ip b%)V*)JP R)@)JP R)@)JP R)@)JP _?''QTxnU~g}|J`{?=U14Q3ڔhPR()J ϵ=sqQg?=P|=fqG.*[HZ%K[TwmЖUTI,0RcGk#T;:0z5`z n. 紏'qV(JUhr|55=:) kg(RjKGʶa}{i*A=wȹtwޡ |s{}|? U-A.6ǔ6wqM,6i9f_[q^y&V}3g >gZN*za[~qDd gj$ԕʪ%,tcQ 3Z6{e6PB2AtQq"i䓏iI"K; ܮ䁂_ٞbz{]zu 5caX1CK;>@6 :1o3z Y| 164{*H *€!K1ݴ1UfF}뎯]vn}qhC \hF$[J+lPyҧ&.>APv*p+Qm7CM HH)OQqwbS$Hmf: @'=O F-D}TWQ)ݽn۸]iV;xJpq}ʾp03䭝*nm Qnjرr,. - Ŏ-3tmd nQy2}$$cp{IJJi%m%*JByELeJq'QTO%X9Ws Nz)=;@ Ӣ7.#yS Oq䪿jQ"#Jj\wrۥ^ފai sTP8s9iE|s$ㆦ'#6".uX ܔHX*:ΕTkS%ڠLC+mXZgA݂GeskoĔJ { GttFe2JU RۉZOuѝqLc4NJ$;]'$c գ'dCTTO)XJFNI@og٢47^dK+a)R9a 9O8&oęIoJxՄsALx Zӿ Z$羧)K\./>^)2;) tFi; Z{E%]7Qy[q+6tG.Kptxw( :RfaNrp$% FI٤[l6Q I{ROkGwךrޢ$s@NBHt$8NZF*;^mvf9GJ=T*Fp:fMYꉎ Chz|ձdh\ʁR{`J|q|Pw33ba+&QrB-ic=SH-rGj Xi2';ʐ8J@KQ+n\E/Q_J+roTVw rz'bWkpӁV{d[ݩ .}GaW5״Rw%vmkFd`Bq ޣ: jDk6a9+0a[Rv t'q'q :+Rrw`RJRRMl*u?GUW%lVaRsb ~:h{Ϫ]Mu?T+Ek^}R6/ M?Vδ(Q̇+* CJYdG}FJۉEҵ>y>hO[~<4wѩ̹:Vߏ'ioǓ4̹k<}m|F>y>hL˘:Vߏ'ioǓ4̹k<}m|F>y>hL˘:Vߏ'ioǓ4̹k<}m|F>y>hL˘:Vߏ'ioǓ4̹k<}m|F>y>hL˘:Vߏ'ioǓ4̹k<}m|F>y>hL˘:Vߏ'ioǓ4̹k<}m|F>y>hL˘:Vߏ'ioǓ4̹'Q[O[~<4wѭ5C29":aX#ͦ/+KLھ%^0=IUG_g*OJR()JP R)@~- q Bҕ!C I|tBܷ@*Oqb4抴(;-BR?0sWgѩE*2G\FF)usH#V{ #,-) UkeJ"TRa^`*+RzBޫq{6+]e] .攭VR 5uùSJJF|>NC+8_TCuīw(Β0dcNЬ+ʅ T< rZr^=TW!YUzZ7~Ȃ#+gґ՟ LUqvԪIqJ_Jcˍ%]ÐiT GR:8=jkUiNں2 c*MUH&敯7 [m~՘4MmJ)J`d~Sbٗ3>mـr=P“wwumŶIBIKN(d|'|)p+)Bڲ~?~(Kw-Jܦ$6vԒܒ?}qwJבqZ] G%ҕJV<6㾌NˌA[ɘnm m%JQ 櫋mhwR1nR[POQMrϲjN\Tĸ5,v'ٟTVf$E# H( WR,~`@zqc_OT5oB?Tկ؂ 3g)D 2@ZK^+R^TTN8av#ԢyQR2vFۨt|CWMENk) Byc '9T:dAo$u(>6/?oШ-QՔ%X [C($fAщ$b :9ϗo8zh5hҚԴjA>ip{lh,꒐ !T~+>.ӑ㥆TCsJ?n/{(5ȅ[5.m3m ʑvoS]v\Yscj9Id8qA(󎞥Q]D 4)a1PKj;b3%Gw`Gby4x# GeH H;5JSe)JU@)@)JP Rn_|eUTܿ>ʪ+fZs}k?T+Ek^}RkίZ/_Txnoc{kͤGH Q1b{}4` 2mB_2RhFk 3(6!`J|SVCkg9.쉰\!Ci))R{JKW#)nkX_ɡq4_ɡq5W/#_&G _ɡq5_aq5/E|vǧB42<_k,?&|]k,O&TykQlztO%Ŷ 5?ȹvǧ@dHMI4?&Ty97? [>I4ŖDks*pVH?rQ=U14TuߦY__*S=JV)JJRR()JJRR(j~u*\G5jG~01Ҕ!e9O2p`)Żg}[aJTz֡=OWmګW7'ؙ{ e$Lu5ҴNNYSaH{9J?b;x{{XRb x-)|֗gSnDh.oS{?#z_||S xqĶpid=)JՖXx>h{: IwCG9 ݸ+(1-7Mڤ}axu$TGMHi%А!# wE*:L+}6cC{eHP#rT)$ .,s[#Y]bH.Y(c,Hz::'z* Q۹EUYvdU9:k/k4_k,:'t'_է_զF3wJx 5Zx 5Zdc:'t'_է_զF3wJx 5Zx 5Zdc:'t'_է_զF3wJx 5Zx 5Zdc:'t'_է_զF3wJx 5Zx 5Zdc:'t'_է_զF3wJx 5Zx 5Zdc:'t'_է_զF3wJx 5Zx 5Zdc:'t'_է_զF3wJx 5Zx 5Zdc:'ujj k4_kٯMVΏ Lھ%^=IU:׬ҭ%#mm6u +=2{w2tCQZft(@Jv `(C9JI%ŁJ8uWiƽ*}8uWiƽ*dFVNP_*>xץO*>xץLedpzTpzT̆VNP_*>xץO*>xץLedpzTpzT̆VNP_*>xץO*>xץLedpzTpzT̆VNP_*>xץO*>xץLedpzTpzT̆VNP_*>xץO*>xץLedpzTpzT̆VNP_*>xץO*>xץLedpzTpzT̆VNP_*>xץO*>xץLedpzTpzT̆VNP_*>xץO*>xץLedpzTpzT̆VNP_*>xץO*>xץLedpzTpzT̆VNP_*>xץO*>xץLedpzTpzT̆VNP_*>xץO*>xץLedpzTpzT̆VNP_*>xץO*>xץLed꩹]|?RyZ>C8|BJT_M1qk֨~:Xm6)SԟjIs g `($){-;OJc RT r3k< }.kx)J(.kx)J(.kx)J(.kx)J(.kx)J(.kx)J(.kx)J(.kx)JURA@%O,~R:*?~zʏ!J*?~zʏ!J*?~zʏ!J*?~zʏ!J*?~zʏ!J*?~zʏ!J*?~zʏ!J*?~zʏ!J*?~zʏ!J*?~ (V l~YV?u)@=kv ԥRֻ_~zkJPib 6HJqJRmayavi-4.5.0/docs/source/mayavi/images/streamline.jpg0000644000076500000240000030704612747716313023267 0ustar prabhustaff00000000000000PNG  IHDR*u6fQsBIT|dtEXtSoftwaregnome-screenshot> IDATxw|lOo$!ԈT HD ltb,( E(z)pޛJBz>dI<a2syL6̙P;ՊZ.B!Je?Nq6L(:cN!BqIT'Vo۽ wξmOh5ՖۚQB!B\ьJڙ#wt$ 7f`K:ۚ^=B!/GQ5dVxFWXS18ܸU {v$)B!BT҂G46ڷlv,}/Ngґp`~e3I7NőYJQiB!XiJ H۳ʧi~?*nvyz$g:5[UD=W WpB!O;%jۯ{"[pNkvm_qzȱQɴ:PU=PfKMa<9٧BKQI.,gVw1(#>E{nʸkNciF}& q m$5.!!Hi/NMUqR,xLmިRqvHg"CF!nRj[%\Ln+@ 5pn^{˴B!J`W 9!zv~3^ %0u~;߮P̡<8 Ypm~] !ĥAUfv{Iq\n7/,]b{Ok]lݲ~4aKmϷiqtyOrD$Onr8*V7=o_xTF!DV/7;?.C#-]-LnOTa4;4gN7)Ύy7vxދ1be–Om(cA-8<#:}lynlx ȼrzFDQb3hȭ4=Ě l8ɜ"|LGUqz!:ZtlB8zN`!ĥGUKT|w/)NnĐfE%'e3HҌW{iϛ|U2P͗8Ob4μ15߬=N%f 0?ɧif٦B?mXͷŴa(Ӆʺn_}V70'euؙx4jufȭwox?٢ 7'?f>[m<%10xE@D|"69Xbh~$4M7fc2‰T7q1*ۇBQ[_Wͩ_yF:J[vs}|~;ѻS\ohp}bEfN1;1,i) QAthʆ xi:X &l8 uXmd}Bo?cL}u:^0DYǘ9FSr<۩g _щ9O8~x6=z>1E}ݻ[u"8~~G]Ύ?7s7*|nqgGηƉ f|y:ׯU&=!ETɲ$e|nMT%ɲ /i]ylಒ`uQAuL:pcw`;SqmA2ӏ+ia" :]md\OS4NGrI6ǘS\t}h*Nϒw_2+\(@V%E9?n/J?b^ZݝT).8>NV Ɓr&*Y|(q1髉'(D?|`Z|e!% 0u-ϰvCe,NxyŤ% 𼏟?L_D\DZ -[ *v7M15 4.Яf)?Tku>B BᑂRG:JSRR8]Ku]8P Q) 2c3]_?!NBrZU<2^: ZG)Ŗ8p+Oqh,MGlڱZ5+`?~ ?#QFxÅ:Y$LInp~M֑ Ki7Wng !J+y~%/N{msy7N&x__8p~\Rr` % Nj[ E!*d@`Po2 F=\ʄuN!EOY"32. S0Vm5 ><6 rHۯEaƍ-Bq(sG:j0Nh"X>:RP qjX=ZHiHZ`G\"Է &ZL-gYlj1Dpd;uC aKk#WPΝUlˇBh[W%+#$(zLעr"kq_kgumgIqӇZ{B!sqom:,zY1Pxى'xѱ !99[qںJO߁7p!oowCxO]t8L{YwJ]>9{m׀/\Һ_K|Liۡ3S=S`dI&dI&.ĩ"M+T\ټο7_b6eWtEV4l؀|W~#qqmm[?2q=lEm-я{ֲ54,gZ>8{wzgsMZJOnزO4 NIf[ҳ{7}8ͷIHHV+8u s+|֕{/ZڲOV~5?HRRoOL2$L2$SuOeNT(GӼu|ތH+4ղox'E@8W.GF`[`"F|X&&%%5z1Ѽ"N&x|X6}&>r)s^UkOI٣+l h,_?hOz~׊d'NpO,*Nʶz-n[DDӦ>?x_$L2$L2UTXx` -KLLd7+(JNQAΝmЮm"y dڔ'w"B޶W^={cZٖ>³/'O@uԟWw慗ݓ3 |b%))޵ؾM|b ri<lќ f%!1Ͽnl6a6?ϽPvdF?ڷ`k)?={te+3dK3h~]??/zdyi+p2/k}.i]FJJ )))w?W0vDEE2{UEnw;v}NL]_@?gn}]n04af:ݻ5ii82VI_ueJnz;9 Џ=R5[!)=uoDZB-$(N˶ٷϚB!O-czlbGTZu,r%83VRCyeCGFOBq ]ZUT~+9vscqʶbsa!B(_ !DݱU>BqI(/*$B!92"B!udDE!BQ޻!B!D{eE&*!.m&? BZLWB\|b7.!'6dE!R-U؍v75!.>{7NsUnbB@n!GhwIV HVng.%&ɊBJ+ԯ(z_ZG!_"'|\ӽ`#?j̷\g"TC=Bq)d(JMwA!.]ߑr2:@ϷՒٹz'RDEQZnikW\Q+}BTeuE)vfY/--綟Ν;Wz3a.2F#|ͬ^X nsIH_2cn|śLr+xUw]!%g#*\2߲_B\/uSy?у Yꫯ.~A6m_~kS^l5k0{l.2z= 6kz8N&MDdd$aaaFgn7SN%** N23_( >L&ڷo϶m\\)<3ԕ K ɿH4gNB!,Q[ILL`ڵ$''s-o;x`&L@bb" hтI&0m4|_8yƏOHHHuùۘ?~Xgᄅj3PI @hҤ ˖^?s4o޼L,[#GsuוX{=M6aZ,ϲ{no=J||w/̟_EBB~~~]7СC=ztƝp$4jb !y(=uoDZBk#s_q|PEQ4w1p@nVF]_bcc*;wf„ >rײ~Ko> Ç1 \.5kƺuhԨQ}xޯW)(#JMRL~H||C3[^v-'O?.㣏>sΥW_~YJQҘ={6+VDEE1tPf̘=0ҰaCV^]d˪UhѢ k׎3gxLxx8y t~IJ{/s1k^<פZӰ4ہH]9Tw}Ao}(?B!^O?ƨ&_w[l?gǎ{eٓ@E! $Q͌3M&MIZl齸nݺރ5r\rU2̍Na'o#.= AB!O̸q{?~Vŋ9{,,wC cĈ|'Ŗݻ7K.%!!͉'2e ]t;v,񤥥1qDﺇ~ѣGsa\.;w;,s?+[,:O5c=\=+ q:ӘB!D^ 0i$ӧݻw/TFӬY3rם0aǏ/ם~U:x'1bD{ɯ=`Rgy/VZa6֭,][fƌjՊvѤI|N2=zзo_>|8C-s+Rscr'ĀNyak=_H"bz_馛;뮻-\L/LRN|읯  !(.7` QU p!㎚k$E!Zzbcc/4!H"BʪUJiB\ $IB!D%ɰB!֑DEs)r!BDEs1Z!BTJFyMMwA JQOջ5,[6^\=))1 IDAT5j B!j})q}J :S3(e_<ɽ/K}R"B!=bu%&+rJs&BrDEQ$YB!Dy3U!D-ZnŒ!R2"B!u$QB!B:!B!jITB!$*B!BZG!B!D#J9ں:5 !ϥ&_UTD; 88ٌ&;34v_6J~uGlFEQpݨn7쐯_=_[d]\j+Ei;{:VWkKJx h]N7ѣ{7r[VAt_T}D7i֬)w>V.rlv=GoLƝت-ڶQL 4v]|Pz?u~^#*?seu:EQS^~pQ yw4MA(hNasރ+Rܡyrjh <7NaԃQ^Ǧw;jihYQݬ^}DPP iiڦں/ڷo` ''V3z1WsM0uX F=fg,Fmx] HzIt`wdp`ącDZqD>N9 ocE:dYv&9 ߏUY֭[S^={bEQ\nW&3c4`fG+޷p;8V4?]=g;TUVŖ) ;[AJrf:ujC||]N^8nOSGT:T%ʕF޽ C\(unly HrȲhܢ-Mzڷ+۹[7HOL\ۡLJKESLztif4סqH̻U4.'zM0t\N P*^nbBRrsCٞBBMf~W]W5GɕDדI||<\t[A1x͞#z3&4E1鍠%īxug1 9aqȱxF*Y~$ lۄftZuVmAu;O.jGsEv/+>{SFb /Tnq\'mY8R롽/S4^C9WOwnD`0x -OjbV#7Q {n w]5kzQ;|O╕^qEBFRI3@x0 r3Ná=$i.N'ہewT4PVVUhA.1133x:Vx p.B7L_7b=׉T5Ӊۭa9KNTzӁkYB,RSs ШQT\^GJJ6 IIe*{[X"c Ū` z1c% g-"M vboH&[t`}e^[5_$Uz޳Ly>7|Js8^u}Thrh^5j@i{v'Iů w~m^T>׳S37=.tAǃ12Z8gChdŽ$Ц10%~ g3a7BHPC*"64Mq]6F;r}p1>/21隣M/0-sOG9۲XtwZ~ixMUٝŏ(dtvVO_G<{t$%;;)=Zf0[8G^y'.^A  ྡ]rEֹ}=!yھ ,"\Hrx.ėsGp.ۻ_p:l_6͇ %tN4z7jbw8ɱUv Emǭ eoYחMM/?b;Iʹ˯T}ӷ//^CEOl,JMe`%/ Ec!ܹ|; 'Q)Q F'7d'9iYtW} gNvxruo˛w}vĸsQ5tzV">oC#ϵ+.:.TF갱}bFDhpE; |ȗo`4F&Mi>QG3T?4bKWDŐ3H\~:@.?'| F=UUqݞU7&9wIKK&%%݉l6ѠAߚ ˾Hǎ-ڵW^&cNYS*BT-ͥ7t4oDz>itr9|bGOdfz>Yt 4l"U\%nU}n˷.!={t!6g[R8ׇU0(BPP))4,buru^~9;x=ڝ{\ѠOMXmNVxbcQZsrlsE/>!X%NϠ 9٠3A4hN5 3Tʨ|ѰaC.^Ԗ)<-Ďj*pa^YB\?fl Htq$uW]N@vqqn4z:|e߬m;pK~Sqw?̨QQV;͛7a 9XKpM7yjAF'd('*Lvv (:`ϛCgZs;8NjygOs,2L0Wi8d*EUuVeBQ%TE)|WUKKIlg#w%7Q(-K=M4\D6(xnvG?73mJ,Һi NrGO;x( ~&\.x1fwѷK vouA3n(58iϦB?=Xg:)aAW)ٹs'G%-5zPǷ6טbi3x=&3erQ8zc@ l=rۘ FETˈ84T7b9}&瞞LppR'" لB9siӞ@ =Nzu$222xGW/S%>>gطo_~V +>OTuny1tzE?9 Rsl8v#0~Z*U)iS^>;~|U|.d}cԯ׮MkׯGLBbb2QQ=-:xȰ@9l^2邊g[ǭ-\nϵ*Af;AX AS灃UsT=JRRLk>7qf0'Э[7xY<;TW#n>AQ Lo1]BtQ#.>aԩ>jn"%%Ávq@Ō5'ÎAGUTc~>z|?_(6ωwHAz}R'yFroO6'9׫&6WիyHrﺾtPY$%%B?| ƓkR.^ٹGȁ'. >1&#ޮ1S}p~> Ml{ŏd뽮~]Q7+>l-݀zj2ΩtGϞfDd 3R<[IJM46>_J5Omܐg%)bu?Bbs.49ڹkr9+~רiP۾b y;>I_uM6Io/`8-}9uXQ5\nє_Q6s.ڲVm鴿 11_iaFsxN=wiUd\.76k6ڴiY|ze7SX&>18 sx#y5[H7Iq$ƙO\oKD!3NsΞYER0BU=ytX&)4Fh$eeԢySVpxYoyOGb!|fQހ7&E=SQU9瞣rnES8*vJ^#ﻛyQ^-ߟ-D%%1 CuY0azNuMp\4>8qcbdo1k3|Gʪ'yRs.5MTT՞]kRJ39NvZ\w]wuGn_V>]Y%׊TU̻B!BE]ңGVXADD+V 55Дw}Y4oo/Ђ%Ђ_K@?- O9.ۧ?wڕ>n,\mٲC/19s [lnW_->fmB!eQуO>￟ 6[a~>%)xN d!0BPg 0Yh>?Y4hFQ dĉ;o?dرenk͚5s=|vmŖxhܸ1z:u0tPV\-t:6mM6%66yy׹n{95kFLL #G$++˻>,, GTTzbΝe/B!U]JV*(:2d&4}aO8JH ?B#\"`@˽ڵkGll,˗/Ϸ|ٲetؑM˗3vX.]J޽K,{W3~xlقf+̬Yطoׯg:uʻnΜ9l߾uqA, 3fWÆ Zcǎq72a„rB!—jyYfU*I)#4@Oh`]o 1pڈjO"$@Hmcѓ,ҧB&Nooټy?~|9r$3gΤ]v]x1 6dܸqҶm[NJZZ_|ٳW!!! dƌFc^{5bbbgرر\B!Wn2x_RejrOVf;O&9,?|1Q\ٺ5aHP#*}toٓիWNǎo㉈[n% aƌ̘1M8t@| IDATo !!">}Ν;[V𔷼rU_!B_у'O_vllq6݇AQT$ "Aӑm"%n͔zJT&Mܹsٳ'wTYs=DDDpw2hР2Sf͚1k֬|Itt4ǎ+Գh~gbbbG_B!jMRT{F"3_,!nvK:4npk;g+D '*ԩS|$%%ѷor1h ,Y˜1cXdInF[qݜ|8Çu?aaa̟?3L̜93g6um_:B!vTYB!B3GQB!BTB!m!B!D#AE!BHPB!B9TB!m!B!D#AE!B洋>6Ūw?¥.BTEEU-SP(L{y4\!Bv^SEpp8.NNKEL&لd"٤P^qu/B!D;჊ͬ=.Ť`r{AA1)9xh}z+EEEe xbn+fvH72d[UB!Q tT\.q:JJʨ**++)?Qdn7؜9sxvYꭨgaΜ9R_[\1y/_NeeeA!5u⑔HRR"QQP˂ٵk}*cǎq%PVVnuo[v-k۹袋P=eTU /4\D7~`СMA{w̤W^R_[\1۷z.JKKIOO,`y޽^}$%%1`^~8;vxk;v`!ύA_zB!pyѳgO֭[gXvZ.9~8O>$7,7nGelܸRFg('M/f۶m撟f#'''dÇӥK[n%77ΝKaa![ne˖-̛7[~)׿ػw/&MbҤI|ᇼ;۷u9θqXraU8qcڴi̚5~zlQF^oϹB]vB!h$3gSO-[,ӣѣG^|E^z%zĝwUYd 3fdj?իWpBRSS&''{/dyUU)7o k֬a$&&Ă XfM׃vvJDDӧOE}uyq88VX6ÇS\\Lnx'yecx7nB!F R5tPL&6l?&.. .PkYv-?_}w( 2CQQ!o]t r"z޳gOCu C""".dddзo_o׺u2dݺu (/aÆqs7x˗{,}W >[6X,#B^u⹫V~Yt)z(uY`׷ӧsM3f ڵ+999 !R]|_Pvwᩓ'v} Rzd|+[g[b1r8U.¥.mllƥ0`6XPUu1t`:q<lٲ%sdDtM <|Fl##mIlx˰NF[!mvuĈ`6xy/1f4̙3[ 톄=!Btt>!p=GF!B. *]0"BqfB!m!B!D#AE!BHPB!B9TB!m!B!DoOݏp*(*A*=Eі)(`rGAQ&u.B!D;JD"p8\8\NN Ӊӥ&lb2i lR(8պB!AfVbRPEQ@Q0߽t3nVhۛŋuV^y:x 2nB!DsTq:.Kr'eeǩ2)..JOc1[jΜ9<`ۛފ y̙:=#,_nB!D9#ƍ~mܸHJJ$))H{eڵ>}PUUtcǸKjm;^o߾}lٲ:3g;wEz&ݸʅ^h_C?СCߛw%33^zZ[cWzz:f-"!B*Cw%>>w}Ҁ~tJOO'33;\ߊ+4h@wsz?ΦMXvwٚ5kؼy3?wYdd$|aըcbiу>cǎ=-:SM0AB!ڵ3"VV\ɓzL6nɓYreCʑ#E9RɓPB9s&˗/rWWW /0cƌzO>w='N Z&""UVO~~>> Vfyu],Yİ%Kʪw{?=BN'?00uTC70xznOӯ_?`jYee%ӧO'55>}tҠ۔NYYY޽{W}0h zB!ę *<4GHpyѳgO֭[gXvZ.՞u1c ^uFQkٌ Νɓbڵ%$$0o޼eO΋/pb ?5K[B!ګ3./,\BJ~):t(& 6\P<dee^_}UTU7x#hnk?p׻=MQXXȐ!CCCQQs]tA4f qwlFF}[!CЭ[&,BўA0p&ϝ5K ]wҥK7ϼ~˹馛]kٝ;w2gV\Ɋ+x衇(gZ6meZԦJNNf톡[!ZlٲSbpa%&&rZygxgꜧTlkG!LvdV]qGre5ѣGꫯrwꫯ-s)&O?NϞ=9묳Xp!'OlNLBVV{p}vNW\[ouZwSOq) n|5R\\Lqq1gC?}ԨQ8q^xh ]*?oѣuEQ;䮻jt233Yns' X=pe1fq1l0F3]+;;LƏOjj*zƍǗ_~O?ttRo~nX?{l8sdZӹzSf̘ȑ# 縮޽͛7Y!=Q]|_Pvwᩓ'v}hV϶~bTq.\.˅KUQ].ٌKuaBl2f(*b|O<-[B>-gҤI|e7tn^__罟/hd)=2(>ӰOr e#\ug5B!h{#F)ƻ{펙t' @F[4snBx^={v{kÙބB!63IKKcРATVV2zhxjB!@p`ʛoS!B!ʕ+}x'k=zN~ RRR:u*L>[ҥK sHھmoyB!F"@ҔZp\˷^Y8+Nrx_zfmV(@uu:?3&LP~ΝKaa![ne˖-̛7enJnn.%%%L6Yfq֯_ϖ-[Bgڵ<222={ƍػw/cǎ%;;ۻ;Ge۶mlذ>c[x1۶m#77|l6999|w|lڴA7 9B!¨0 4)8?;'_FLD$( c#XVopΒk5k?>$%%`֬Y#!!fqa֭[6mbl6:wC='|b(㏓Bdd$3f{7W_Wf…MNNwڵkǖھmoyB!F*/,\I!AUʳ@OvfoQUSBMՐuQ\\\~ٳ{Ϟ= íZK./26l>~ȶl޼ѣGӵkWv;ȑ#о*,,dȐ!!plG{iii ھmoyB!F.V<ؤ7_UY |; EQ(*9̎7<=\? Ro]kDw^CHcz 8^{]v裏ɓ)))ajǨdhs]پ}kߠG!Ba! @dddYqt9ٹ^<\Rغu+e&LY(**￟k&h} )1uTvIMM t?&Jl6V}pĉ={6GYf{)SŞ={p8l߾Sz_s5<S\\0wG!BaaJK8Q>x_~ZBe Q|rUgͺu9IKK{5L_JRRd!e=ƌ{vJNN=\ȲO=gϦk׮\uU\x:NٳgKK˕Mff&Ǐ'55[o1cꎊs%33VG!Ba "Ͽ!S'Ox?w'\s hV:ЛAݐMnL4orF|Fl##; >$P6NK$"k,."T(eb5aG1hT/Up0,Xw-]v-pq.\s=1,Dng<:t}|rdܹ+K&B!0@TZ5҂jqQM: fĞqԅϿ.MgKJeC֗?keĈj'4dxƍaٲedggxbmFnn.;w#''Eջ~!B43h$"GIRMtt8S?+F\ń5ʊs4NTVb'&&RRR?큙1c=wիYv-0l0 *B!DH:joVdQQfb0rxp1(@˄7䥠QTTDJJayQQqqq-v~/,,dȐ!' !EJ+aV9kwTv5~}ү}d ߦģ:]wı[B7|p^u _u.Rw©Shޖd>À$B7<7WMuwe"A;0'9n&=cM M\. Ԑw}\ytܙ'vZ-[ƿoos=z3fPVVƬY[ĐOFFFqʔ)deepBwN^^-_lrB!DK~ڱcv}sjo-TZIߡT7` `2SV`F QQc'8z| ~mrrrx9*orK.%III!;;wyǻ~ƌ9'O6),]s!ܤ:BƐ>5W Cϕ#Bn\ .M#A!1@7x_%ǚ5kj-3`rss ˦L|=p=KL&fΜ̙3kmB>ڗ :=m1 EB! Gk %Xo np9z[$!Hh$t4P-vK[ -TBQo<ڇ:G[ .mEBI8I8s]4T@Uwv0 *B!D;#%}ɻLP *glvU:5LLBI83IFkλw( Bt/c09|Ғ-TBLǙGB7:0 E^(` +H@Q}{ZB6* wP- *B!DI8Hwm@&aaأnUCPw ۨЅ<˟cy6PTB $|Z2t/)xӁ EB.xB]FQ"p*&;p*ý>ku{OQDv]^ ym)4!OBh~?7@ "]c? |ø| z@TcٽT8UKV\.8~3DD(/*5U>v]Ǡ->|2 *B!H<ھ [޹\&T -BohU9!~="^ϊɗQTO@Qt_hsT(rC92Z *.GLM76лi[!IPmn!h%<6 9!`b깕/@8+ʸNERLX+3b(ݣ( \պGk*X15n ւVܮ~]If*>=GQ_~RVn'EAG$C4so$ lxCB7HPiE{x&4I^j*(10׽I<; [L*JE՛joʔ)ٓuѭ[7JKKٰa=7!EBh ΝH0 MOHpU$Ջ'x~ŋ~˳>9p,ŋy'8t}eζ ёHh;+tpzU}XV )'lM&cYﱺaW~+d *iANa.{P>kl4-i(w^HVV߿?6Ͱ4Я[KBB/f۶mҹsg>rrrXh_=>(+V3{lޗ?S3<äIyw˲ &&e˖\ qZ#]PjװI@ޭ3jjIñDm}Bw0U|.:Tah`q)N[pn|W+hϑD⼇RWI1n߻f L2(wܴV8R܄#be9kh*GZիYd wu{!11cr}[O]k׮%55 ߴ7 fC1`CK,!..ӧ3g-ZdX6z)xǽ=A3fw[hk$xpr9ųxYcoppE&Wk€K}olX^HPiE&E"~dI[&rɤ(F@XECF]$t '=vXN%\B||<'dРA2111瓑QkۦLBVV .{h"^|E*++lXVǜ9Һ*Hh :? 1-'? %{*<\ o.` CP!rzR\rZ ar_ Eu!3!Aww{HPiE'}2Rހ (0~?LY%FFgGǏcpk^^xnN8Arr2FbŊ23f`ȑ|8Ç{{ǰ,X`1L̜93gg̘13ưoκseuUa$Ctg<b &:w&/c?/Np_z.˞!zS2$N3k:bT+=B,yiG-sAQKp1&9ַEK0 (&9- xW`з=h6u36-[Wi섔ou$.\>&z FB$t-O_g1AB4uΝ11Ȼv _~1W8| 9CYp`;A ᄀbT՟!h#$tZkc`q3ux<8h!%ĺCJ 16/8F߰.[8tDWHp\'_=tTSLEkV͍ AE!Z!N1y/ 5= !qtʗ[:_]_=lvTsA}0Tt3>~W=Zq~oxnHŻ܍wj!G1i5mx?{ڮ|$ עh#zPtdZ8 k7}{<ޏ-=So xhz=sM?2L=\8%!DKjL!DktQ+A5놻t%)Eq:֞9"#|!dpz'ݯUᅦ@1k#Ezj{Ro`h!,ܪ͝CE׋R{ )6ߙ/ )doC^R\wS.;w#0C R3,ؤv/xxxֻAZH&I3 $!D=郌%\JkE]cM#~)F20x9 ɉgՆ~%DC ެm$u=33 =.$BD{Y *&s`@p !E7@_>Gſ7I70n<Ќ=!h%9дDFYeڵ!<҂3R"(JߙIAJ\PVG%6RV )QQZ{#T)8Y )"|jՂ7}sMNheµav^~5|w6} k[DF jAar*ҾWUiA2xPѿT#]7~Y[OY=;HPB61daS 6~51]8v톕g'wU/f(,h7%.\{%/BJ|:V-h\pR )Ni!YkwT,a_h':J aaZX .- ޔ}{ދ.| :{O>"|!jU]*ܡP<߫* þ&[a []$?##D@#o[M~A͊oEծ9& tN.V*Q*f|D rZ(Nߝ=* 5R=*C='R"ݽ$aaڅ'TVj/)N`V]@XtAea-,DECLm%L #U-,U\9N+)'`V8xbZIPh_8٠,S'cKa IDAT]X )}!IJ+RnWEvjpD{va/jVnix衇x=ztk7EvWԊ:\X&2j63TىEET0`rzדޭ ݾG:l۪{αRWKQ3ӗr(b= s! ]* }[)w‰'xzjOZS;v~Cˈ}b+Ožݐ 7Ӌth/sZoЩ {^v5iN$k1HPiEw6CPRU'J,l N|̑qV̪>,=Ǐg_⋹۹wҩ/or8¿g>8ϸ@x]q_K{^}MR*uLڝ{ܓc+]Y U39`b#8֫B5Ɋ *&"Ngbmp1yv*DTx˙ep{I9D1|1~'{T:!%=?E~MwKxmNJX{"yV'K!2R5\!~֣.ޔo) 'aaPYo V_iQڱVbtBrV*OѷK"T, *h<2b>ėr8+AM%7g'aIE ziiה)Sٳ'֭[na{&*~}9'(+wS.OվqLhwP'Gvk)f}QAB6)5,Af{ule ګ9ᰠ**݁+fLx*TFjdKzS <*i?vN|6Υ(^iQFнaZOJ\.݂XQ`H+iOւJT6=Lº2W["zPJah%v+r/RFVkivޯF"IIEjeb5ibШ^DDGxGIRR _"++4Φʻ~Æ <LBBW_}5x_fyׯqqquvy޽p t֍.]0qDu0{lٳ'˖-s:j,ڤeGy,.*(>(AԗRۯ{w80+8P±DQ ̂~)U.t`Jas^oHp`rib,)0xo32O~IIj(.'?{ʖҩiፎˆgU{)]8F]m 5pP{ys 6Y[V18ZG_8T@SL )B *iAN‰mlK8ꂵ kl4QﺧMƬY8pׯg˖-usΥ[e~g͛]W_}Eeeeo֭RRRVZZ|3}tvE^^̞=ۻ رc}۶mnl۶\l4B49+%'zY#!<lWK/| jaS"ׅ~IYe|!EV<_5P%g~6;XQSE e/L Ψr74izp@xKbø=72ۨ$I\'HrwMDwEMq'BJE{\mq7%6jwG>]Hq/-t*!_ ]S7īX /q_Z E)}Rvmb(> %G( )oVC~"GIRMttb=0[LXX;GcMeu'l6>Lqq1ݺu'[f ƍ#<իYd wu{!11cr}[#!!!M|Cl6= .yRSS]zj֮]]ðaXhQ'DsHN}9b]ݯnZPPHBtayBu8G*C,0ĂrB햦_6 nfp a&;p Ú;?S4f'8OP{B 6oe(a8La(8UTJsw(ÉW0U8wzXT|zBC1Y,_qJr<5'E!IPiEc (N3S9}2ư;8S{! p[ PXLOh12T -M^7!#' sH82Uݽ /(d:rZzA^"$<cuY|_GJɆ x{#<@__O<K.TL·+VO: QT(Ɵs/g˖-,_|k<:Q4lfR31pH)hjU59Dqtv!TC8 pgO(A τޣNC  )?yM^&M: R0rbd:0.9+>״M%bpD Dݔn .X搲 MF~K) R;`FXuA5Ib6i~Y*̫U!eUmLX\J.ǴbIl^ճ_Q=ٴ濊o,W8=/];/y,ӱ#h4RAe]Ƈ?aÞ={Ї>׼5|[bASO='?I9xN;뮻JŽ;ꪫWU"B'x}7~۷366G>+??bdd>+_Mt$o}2@Ul35fyzNchԑ55DWqUzCDj,셢bjUa+nD~z\tjU}i5j*D\P0U uh 'П\BB]yAet@ }{MIb8N! EK$)feBIv| jmx3Z ~`4j4!eѥ@W%?V];sT>SՏrRF/pmFQ9 .(a{vq`i~c=nqc_z饼-oadd˗s}ꫯ欳=O/\uU^2>9|A|>u]G?Qַ288{^n~|GJW_?}sucΝ,_|VVGJs p!em܉weS\5ר+$44s١L;.s =h$x֯r$n>zr!<(堘ckn/AXG$_K.ޢׅ Ҫ:L!bcV4߄,]Ż0KӐ5wtґ ȸ)|r% V\7qS@ɸ)7HH eb_eL*@=RjTIRGy;5窄+k2Mn̽ճET-sYGV͸..k~b뮻뮻k׮eڵիO~vW4=]z\z饩mW^yekkqz6j.2qdPJ&YHIԄ Ɍ#0g$ ? h&d:)j9aP@.PmB֙)Qq'BxūG?Kn.>}.VJh)tY1e55whcuTAS EV~x|o`HCJggs7XRy ?RnJWW)LߠJG'ym½;aٰ ADR*OmeeAP2w/@x VBBeh һq Lc-}C 2JGKyTU5ENJtN1:|"ɸ=&W#ЋM1b}URnJ z^C1sS;BS R>aП';/)9<9' 7,X=dAijʇ%D,Ӏ2RGH& e2PK'7:Ee|$,^ù|,FmI/~DK֡rk+Ý; <,J y5hX)kPL1sH[/> n}H}9 &'ԡt/ʤ s!%WВD9:%r̼VbzFqXxr7¾/,Βrp7i7qT:K;*Cp+n8bڿb%o|5]:l8ivQ&ajBImBsUTNGPV3y= )ƣ%T}=AYThJBW/(z  jFh@Rthq(a]ү Tt ;j[`Tt>NK Qdb@J5w\8X1EF- LH)ujnk0qPB1\hBrScoQ4trS cM)$?nu!ז$βU |*CuN?W+dj2>\9)V]YP::GEdiU-MdƷV LS:O2%A(b;ݭh'!tx[q|j?~))rW\s#sj& PppKQ;]* ^g/R7]*%9W^/4(b4HD2 Pd:2԰)їvS}?|؁ T#ڧrSJ6@ʦM_%KlMya.7`bP`jK[=eAhi.KDF!`V5?ʑQTTFz Kze)ÊpR}C|\dD@y*FKat/Jr; yX`y\JË=R$sZEA8J & zMM(#s=6m>Wle.M8N˗+H a_QWv*쫬0W2R$R|{.C|*1j* (LM2,\}|w5{_K+% *VVVVOWn IST~+D Gflj' V\zRV,勃&,Fh$5!E]7/6/$ط.,WRR!_zy$ *VVVVGYjY(Mnl?[.:4PoQ0$;ńQw5;O*G`&C{Cxv33>|p|zR9)f7`#W|YO;^M 0<65dOTVe^oDI6\rrS&')N=qSJR.p <Lsr.Ew7<k/Q!_ Li`ÕZYYPz;4&cFPMeV qpy)r8M)Ui2+U?2-sw2>1LW%e_WG0g:Pqh1]9&'z桥*`aLԠ v2CxW\*sf^Jޕ rVTJ䤘Iߔ&,\|u曠kWҠ{Mٱ]|)HY:V*T||/q+++L(*gBK't%Ut(Xg\PLpz>J3 ȬM Gi #I=8#8_Lf8lWJ*q.8y]O;/>6x;(30sw]4Uz~jIG;*"܀DIDT~GRa_rS޴)Ol믇+߯PM oy l~ Wg TT_l2!h>۔I婅g1m5lԛQcyE Li1DX@W ApUĿQNwtW])e a>-I. yu 쯹PHdWHFe39(]8s+|&ۙ~.: Rp$ sV@eɰrj}Z UNc?H֑)?Xo|(ybRD) Ue+++#i N$39s / I܉i$|i83!`r;7ʯ{Z*/$! #C QPh| |"yRd(AJ¡1˙ D&[ ENbnAMoSVR.zM MOoO'ϗu9⭻HIvD!_۶w>8eqRR!_VV6(Ԥ8%_Aw!& -5<9BiP*l aO3`2qϙ^+'h#qNar2Ti@} mmFMkǨL@|x 95ME{BIl~0iDxF̰Nt*P*ޡ:ՆRK)yERM~:dk=XD%пIWUWҠ2LUʳCa9D* -23"]/?|!.VwP5RѺC bC A= &_)*?ݼWg)z hq+<{4a$9&e5nM)ERɨVx~_VV6YPzz|rVt~E]h=t$#``O>GU}UZxrzU݉**pe#qp]#aEAJ8Z>${>>kDUBGa w 8kٚcM H@#r畎>$8sOcƈAĉrtؚQos`i'ݿi yBs<9h8ѐsu .M _zl{+qӯxzJ_]4ů')~VewFLX!_[6*_*,^)5#ܫj}YYYdA Ou3$ T8K/:w1VUrwE7n hHW..N2|EO<Tfw -Pb8]$=#861GMNr-)~kz$$>^5= }B$"te,E۷kq2W{KɃ;ʜ683eipCjzN9D 1" jYO20ӊvOrrTښpXʙqnݷQȗ +IimwR|mߪܔM1SUlUVTS $7g ʖ&Ԩ5eYoDAiҞ@KkG`9/p`$s;!B>zJXqfL0#̰"ALOO pR}ZF˳QQPn=̪Ѥ\ #8 h!,JdQC¢C0vTDhn87vݤG^0< Sf-h!_% +M)_7#;$iz)*U됯5p/VTRQZPپO]7ML- gtWwjLCXrp-zֲ>&$f1 8u"+r>e7͸ߖepH(!Bw? .>UJ(Xc8):BLPu3x󻦗#Ctϔ_ߧܔ}>/}]Ԫ&دŶzʂQ +\ÁH{'p;N<^QAYe 'Z(w`H]i+MO3NiNԒ` r@N @:v,I]oz]O~F8Y, V+o w1@[ng0Ջ @nqQYKb :T\؀#PUɁW )-6GO&'j)0(Dr=5Yzyv}.uY6i掎_Y(AE{ ' TW5@þ|@ Rn =`O КW\sw&9TDў#(2Y>3%\vmco!9[Ѻnػ] fKJ}RMI`WT , W(P9v!hRRRPkVVVeA(kdr&s ;>$'r'rtJ nN5n yd9GdWz T)1wiL@ E"PF]k,"oᚄ.&@]N^hx9i ,8 &{|!.e.]ٳ>^6;Ԧ.WH8Fŷ"' eO9*x97_[oqpip*성09e|U8`)%WaYRn5FL)zdrS:zp:`exjQVV-YP:R<^_3սSü"C<`E[Qq23kGL:!b(Д̊[j*q.H<f7{qҒyqPWD&EњP@wQ׭KWyFBN:= (?^/Y"؉X 92—ܖ/}l>U`/>M%ѷ,R*gݔFCA?C7EV)HپE)aR(u²@h襕Ӓ+++c6tۃ,7Ϻa/?Q4inē/)J m>(ʀR^v@ UK@%$P$Q0XF∨QU9zrCTi9ë,Mzzг'[?[ e qS֜$ЗJpa`Q(e=nJY84ܔ_־'7ABn̿?ޗꄕ+++coR(kXX_ >g[tm΀0"D $RAYL!K)s]$)1d! )„L?ߠ^-9/W*7% (p겴Ҁ ?~ ~M,;[`鉋b)9Wꄖ+++c *~*= )>28Ә @P&uDXHDTb~+ *z=$  "nJ RL81NX@ p?.Hr$i;6yM)=S"Xh8a_*S8 XtP-#pŗA{bC,XYYYݻtt8.mJ 뮟:ާT_tG IsqJ $#x$4]cpDQc 3zM! &~qSXňm^{,<-m:{97p0  8 0Q){XJDwT/ !vz:Nɼ䨿~AC4u'j-dݔxx6%ŠC\c=b{=0X߿>5<|vh)h(b+`{v`{^vڋ\z:M&]妄9'>ae6mzᩊ$WVctUzRCD*b2>0:{H)@ k΅;6yMnJ[7l~Q=~MMiÊ<Ӻ)VVGBT*P&(uW3vDB0"b<)4}4sL-rT-W^3^׽+px$e'^Ј #%.!,@M$!>* ^)*R/>F.G+2;hӋOK쮿&VAJGN\ O@bKtoAG|/}_3ܔLEg'7j!WTJvrĶ+˂QT:TpسΘkן] 2D+sd:dd&7ֹ%`^̛}X7BټRE>PA8Ru:}3tW {joH¿JBOPf @|j"kV=ڴv>e8Uk"8h@J䦜&tj@CwK`݇IMR~^ ۶¯~/=\4wl$վM:Rbeeeu% -œc<E$D"PA3=shPj4 |C %Rh]z cL|d+\>to}BkE]_"!J'@UzxxjzTFH0`v|/sLT.}??#?Dҋҹ!)"Y&m!nIv:5?T+?L %H<@s_<ƹ@@+!n`0 Gwnʡ&./}H~= |iӫ_5t*j)QL^5*#rS} NR}(Iςʼaapٰo ~u#п o:F<׺)VVGRT*M #ō{ )H¿" YWjpukD3+Y1eubcJȹSC+!qZ BNi'GO;Gpex@; kצ"P*o+ӬF *V¾Vuϔd{rRySW_4ܔޤҗ 0|46XP*ã-@az^*uAU:Ⲡbeeeuޏ?;DQbedԳ^ ~,|<\Tdr/%@) TTJ ׂ/}$ 5[uѮWUi=?ܔT6M*u /J}/`:7e L)H?^u[WM'nl uKÉ +}m'5g=(7]@yǎz˂qoO*rS+uz"43R_ÈPՃcS;ˁ7_G}drP\uG%K?{W.4,eg3R4\|rR<>)]rĽ{a㍰]o:nIn5 x (ev8m:Rw)VVG]TRZ<ҰֻA1\G&n@J%A:L.ugƚ 81HCX bVA}Y7E7T[`|t'墵+@/ 7*p׍K0AI UMإ eh٬ݔU}䦄2M9ZY=odAKRc_R"XQܯrHyh>䡐׀ݥ7':<'::+9KG%o~/WB+υts"GnaERn p?g@O?UW1T'O~ +}IsǛC%.˟~:tP)*7]=|+yyDbsS_^++++c/)p/\<ЯRZJТbb*o|h:! nʗIFz}gMy%>czNxeG} Zz,^nj1 RJr9)7%{o;\yPhѣtW) J)7eؾ/)I4Fzy{ŵz:*VVVVVA:AW%R̲|SÉvT}M4.aM_n_,kPDKW*"EKտá4I+dQALkZE $W2f-WVX>Y$C*իw-R>$:`:Ĭ5yCE-*5ūE{&Lp$H]{&s*yo CBJi]3%W._Ar0h᫤NyOZDAX("A%!)[o\wȢAŕ@9rH\E)RHy Pɺ( 0Q[UwrA@ѐ +G܇P])-.edPjzAy(PI}KQbGJ>֙>=OOZy'= 8J\hl=V,UzPA*~B?%l9bAjBg 5 ,2iI6NƥU(H1oxy$JR zTfJE\ d7u )PhQ Ei(H"EPӠ(}AuJH tv!-X ,cwwe.;VJKA/>>T]ʒl <0 ӟcG`+I/cBy4̲C>BY D)ҦT*"ESSoK P5Ғd0 VVTt:j?}ȭa@XBe}~ 99R^[R^yN {2yD)9p2jθ PX< ܵe"c=Jy,rҳl@K@JjRlA[g:)QB (=FYRCJߚ%JzCyXJk#x%T/B2&JC! ;,U%xW[ @%RMT"E) Æ>[Q6ٺK0;NVu^ 趞xu z#`X.>b2^>TUK@iYz.?2@, KBD6BJȢd:Q}y?0ܽ?pqy!4U5 ",FwR(KaM=ڿW)CIZ}0 .I/אo2P XU,7N«$P_E)H"E?* !0pLv #N4899ȑ0gvPtkGej%~ XĂká'TAޚKgڽ &ܰ~;> $%Ta ߦ TN[?gmdA*~mz}U{ )SgTJKJ eMQۮ%56+=-KI0ELz7^TlaXSP._*]@/D*"mbE)RHVRn%χ DYTjX7lbh!utvXj``e[s>VZ *=Uqᙧ7qϐ!ms,d0_A%YX5Y6|ƬqYp(z%dQJ @kY P d<f:@BJJ].YCJ[P\4*K0)5`%(c&'xH/4V'&)H(**"mBE)RH[ꟘF@AV oCEߞ͋<|H5;÷.4@S.=j[߂^)}$Tǿ&|4^+ߩb_<>N^+ +rʝf8 Ժ^ަ*F-*\I>~o&hlQ?>]Ҡ e9o@1ސ0-*+cpRHM=?ldӴ1eQ$D;QEtsSHJѯ-RHt$!E[S֮ c2 IDAT,:~@p.ވxgw0S8f`_=zB}0`k)|6|>8q8rM>W=&LS5C5Ϥ^ YEcT{]C@p P%+kKއˠQCnDkiMIR>Nw %HvLҢbhhXAVӉEUܡ)RM)RH[_Z!cS*X # E0oZR9qd\*<l8'x Xc|յ5eiIxnp+O4nSu|Q0@VuzCŠ/C'('a+ +abpb%aBH98rJ>ҚQW80 )ic뗆KHF[ TEK- "~՗Tk)R-TO~@"\l Rz,)ښR̢FP3p u$}\v9Z[TVE9~d3ͭǪa+s`ȷ~yKA߰Q,+VD;ݮVY   ղnkW/3^EI۸_WK0ѐr>Mzҳ*BAJoQYM }URvԣ -9(Ctr~ѲXT"EAeɧl)RHZCEO9{g2x!d@qR(@Oh)L v#"|iU+!yNYJۮ O[ߖ% b~ a-\mHLg_)We򋢇߲oMI*/,x8N|TRS,~pڡ(m3wtbQq{>)GgFM"E\E%RHTiA,QVLB1)CJ9naT + N6* G*f;B*K5\e] r뚆- ['p" 8UESovJv^{ǘYSja~tmWAJ!6T}9Y6}o#u]\_+>;xϥ+QTܓ}ѻ)R.JH"m;df#=9a5E (-}~W,WSPj mI0ג趋?drHxmuE!%'&޾oAz۳}ay*5`TrRL֔о >xe^ .j!p푰P[i.Kgv/ȴBހ+\G={Di݊@%RHd ױ(f { xbm!/=߻}5KF$+aPAP3P @ A@19N[7A#4Dݾϛ kJo?҇dDEQHSx8%\ H^s?9q!TD^77W=UJ W7E ~49ۄ7+R-C *2#RH"mb԰EbSgՄYdnyCb(ps*n8*JPtq)aJl۝K+dP,~EeEֳ(=hPIX*roIQ~%X(UWWˆӎDo9=^XأZ͑bӜ|?jz +a-,:w={~'2"E EH"EUvTv uvP?{8TD^J}0>ůC,>҇(PPZ^1]Bp聪.3<ᶅ,ijVO++k}It9+L `#4:~^:a~ 8tLeDYCسnӞړ7'ƶmv=ksѝq>9@fÚaMJwV37į8CsDiJHx7y _el2BJ|ru  (:;&ݲ?nh_ݯCe-TÎ26&c"y@tR9P^၉?iKo⃏T܉v @8Kd'XTpdU~Ǡ{/>YاOؠbێ_˛O`3ضͷjE>1Ĥ Ý0Aav2ΐZ=& w>~ +R-D˾H"E TvBH1)m8)Av]D ==Hzw䀿ʪ$>cX1rXzQidqz@vBYeuEܼ뛎a}ǦIc^ N>+[8V 2jiKn5e2ig0:fk4s_IJ,;` z^1i.$v TMO71z qÀKjEeh2nL}Mq-"EKTlqK )3k$ע~zQfAӛ`9@&7>55RVsTfX Lg[vX˂xX[-_gnVzJsJ1C(^Ĵ\o)HsV5;EMz5ya-TD\Kr1hoD" eEy|]5ik0Fn6(!V `-cIM Hɤ6pl| : |M8ѱFAGඳX4}eOL _5ߪaŮQ`% P Kj܃_iV*"E V)"(B V mP%]B2 *v\ l5:d߮U%Rx ,$ŎtລypBTPc+xkn3~{WHTYwDҘdޤ`yZTATZZoh^ @ 1t@ކYHkgE=gŽr7 S`mqnf:iG)$L]l *Ki/]E)T"ELHQa|keÿBI rpBK$[f׈P" ʀ1s}ˍ;&!%2h^ ߅>laQRC-0`$9G 87s^/z(:3}~8OVzt\צ+ٯ~? |.ywuQzn/ (Yg< |'tp;TiWA7K>:5k1bR?W"n"( +AlymBǵb@KI.GD5X9pIO 5{isR*"E Sy+nBnϡ Z|3kclАW 3mAq4w/݈A"|n} nẂf-<a˗4g+ry7w^ C`Y/:+`ZcG p[aඓX6qȍygX %^2%]sٶ-&<\UEKPټDpsmaŀHq\^u>XU]L`]sWv6Kݦ"E(H"EIT N3 Ee}'l?rYȶʷ&ȬM\|863ty$Bb@of27F8[;nR3 *yٺHI;_ܑE9NjKZ+^!ń5͐,TKc8\B0Yi,#k% w%C|HµksxAM7)Ft XȪu57G^s ,a+ )t% CF{ f]=)}zY"E #F--)^fb ]@ ܠ,)\p& UŽe &hPѐe 0  EWAJa4=HTR\ǷRD/f|g$WR[BqNBL`gH+ӊA^Y,&Ujr>|{׀EU(뵏;'w?DAKvMƠ]X-u},EHmEJ@g0O?tV_ߐˊ)R-N&)KWLHO?*f`ْd'(eF·_ > Y* ]E̚ERL~Ѓ6oPoغDpe4XT Iqc@v._mp_++!-*\)y[aq[kv+!Ы2\ikˇ#qV뗶xʂ"\fk^Vg+@pn7+kK)a0Zn 56;7K *YI(hH)RHVe#A WXu~w)^Qwqysygy8?L d[`O$Q-#R4xTTZ! 8EW"'ԐrӎЫ'+i}no(Oq!} kWXyK 2! ~v?R{O!Q߱A8z(pV( .(`N[l N\\Ƿ ZLXm"#DXj֥Dj@e]\ +D)RתS] ot"#KoPde@\.\[%O&@Mz[.,'&~/67ȷn/j0 ^oAal -a aRh\ KzEdΧaฤr~F~S%UJ%+X) 8B>B9H>$V$,8 ~`%v!. n|mIvʭP|R G]Bz?P.ϩ@rܚ[@T%%A⒞v"r.6GuToAJH"U;֩1"zk2/W+Ѓ'աwُz>yOFLׯ˗269c6|THZ,G 7ٮJYuz :kS <ɵ} ՌduV@s;ӝo1&d0"o7XV7̎[LU}؉J+a!*$ `cbRw@z7@C]j7qs.eȧsSf[[+J),2E1oT 1XЈ0~H**Bb9pC az}ScXtH_*]XyS+;RHie1$Oao"A|+KxGˆW]*tRR`-B1kԠeW;~.jFTCC φ9D H:% (&hXqmێ=vG/~}԰r T\HUʚZ6M7})'F ;MƈwRrIs.'zW ػ -t*Vpܓrŭ`Uts)8/X_ ] *˶\/4o}jl)A%~^oWgD)Җ@HH๙AK80xXZ*PAN2ubo렗@^4uZm5t!gA΁ *|%ŃzAEҴBmcsƒGCFI.''48;_OW|Gq=)@Cz(d6_ćxVV[E; T*^WWǎ'sWpѢV gL~w- E NIКA\^N4v&#TLIfTuBl-X% @?}>Xއb }bνa0rp/Ohm9O>8L%ŀ2R{e@$kٷTecRˎ0 H=l0bdŷs)DVؘ0zP0goKZ'Khʐ'}/]/xǦqHSD)W%'*#5+@ A 5D/HɃhsM`%`*< XWKhե:3'N?morPJh'r<6ׂUPB~v\}!2fJ/@vt̄Y7,@,3Q.;_=}]ϥSr~3!p Po~Se R>>]HO=3=NH6D* IDATD)&T =Tc,®.ņ; F+@{n9]c/\ 0TВKZP: N #ՇU*, 4tyׂUг?UdtCEOI8&T_Ǽl-9nr{qӏ%Y2,yH&~b1a+S0 G3Ho:l՝Hۙ ́+r j} JVy.^vX[0S4T~C4 ~=2nܫzB>sa޿s8Q3)!`ߎv '@@遅iD)^M_uR.5OD>$<ɽm؎iHGB}sԓ ֧"ucG/R"}S䱣"XIZ!S[jDw)~KBveX Jr?C*b'eZXKvúyu@?HR1H|;x!c21 r9= =DHaT"HWM+"@TUf|JWExuo{}-(\TUfJ|sJ}{$Ojx7G%y)HPH PXrk U*h)0ê"ƒ MBpWxcce|\7 \R(~]*G@@dfk+!eŌnØH S >塶V='Vd#kGB q,umdz_@4!NGB\B.=ʎYƎ˴ir~.H+ү/2 gX4"ϸ~uVd}ih91LTx cP{zR"mZ'8+a|C>Š܄в'2z 1jgf-f1EXdHkH4h1 v3fԇZrC`¤[EuBXtxKBՀ XоV̓ƹb/7;"5d w6ؿ#Jy{ h,+cuz]v=Ԟܶ0s^JA1f/+x,dlvt(zWM蹭9KskB;̬Yp?kvp+8 "փ{ҙEj]ZJX8?0j]btg.r>Vw*ץPlgRt[6 !~3gN ş뺌5{+X}o 0%RRjWX%X Sn1 gx;!Ą ;sAFLXK!V;4eU˹&zdCb]zF*UR.9BHa%- 'i) -Vi5 P R,d# *+|Hi]NjTx0ɽw[/UtiQq3nuHzk*{`oi$ fslߞ 3UxLgWy(=[, *喪}E& ɱ{sAWITQpOSc,_ 8k(-j7dΊHXbin. u;t~ wzj>׎l#=r{MfQ)++㩧M.۝ FmNGð:z(΃<ZfC˻64̈́晰MX4-ih:CAUp7CvdA"h[iX3AthuX4v+B搉$ng g'뺤|L6K:˄0]Ĥ9{?KҹGnSo;rkdm1(=A@T.?, ++8;?y*坻0Sj=Ը $mc*a.IXuZi6J*krNU%K<Ů-9 Kc;-WGڸh>+S2n8LBCCG(G!p5pCqWrpqy믿?jƍs {o^N:$zzf߫ŋ.Ǐꫯ _}UfϞ i~0曙1c3gΤ;K/7\{̝;YfQQQu]rZWW_}5+V`~tv܋7x3gR[[F﫷:›iEq{#a ?unm.H6r<í|( 8~:`1jwaȊ,,m  ϿKk+F9ϘWVf+ˀ} ߸ v햧[Y]j>Mb Y[4Wy95#NP7U8Nt:dN%IoJ8aE%Ωs&,c٬~yo]q=Ej|_0M>or/M9rdc>Yvt`L$uPU/5fRϑtb[_!(ޫ:s s>mVYpMk|N3etqݕKcCjo7[Ƹ6+z+Z7=*uzb={y駙m?<ʿ/v[-[Ǝ;ҥ4_|#GvzҺj2ew>nׯybνXh :}}'7Wa)/¸1{ˉR'/Z`sno܃Jmr/: 5~n#}Pq3|QJ٫,\^@R|QBٿM_ ]2n BEڪï; 5 ׁu7;,[pP}V<`zQOי1&Tgyo~1K_L.ׯbvq|Quc2_swuy]#Du~]_j'&?^`[e ? lܬ_Ǐko.'O.gԩ\z̚5IͦѕW^ɥ^5\%\AJWǦR)F?wƍY-[ýÇlٲ>Æ 5h"RT`,Y8j]/]4p{܋uAJH[ NE`;fʆ.rՂJXo֙dp*Ŭ)1`XO~!eѱ7Rwov'0++R@QXr> J>N*-MAp7z_ih}. Zpk5кBfS@HrI.uqL]t|\{%68 vĉ\{u];ԺԷo_,XY!>c 3'۷h_gڴi 8qQJw Wݹ"E Kco{JkaSwu:{eG_@s2N IQH1U T\X=ػ&oc͑pbtjYɿVHlA$gon6^!Ŵ`6RSe3LK-ETBFBۢ`!Ɛ~ԎӺZHy/вV{oIc~(H@^*;!q[Yr0ܢ^zt(!X8 XBL0'3*w ,{Vu޵3^T*%)KTb'H H% ;ԁu~o1q‹. M/u4{JեEos݅~C⸮נd7ahϣreqeuJJJX`W\qE`+N8D"c<@.B***y睻u<'N>' b  8~?я8͐!Cx馛$ǏsbTNjjj?ֵ!x޵ĉ;s/"E%Ԭf&,awP6NX#V?)7#^ `V_6@ (Az$b]tSj=׉]v9uc rߙkMR4dy.ޘ [?i']>6 *#MMCzN'//aK3\+h-k]˫8yH.-H@,7Ƴ $5w>օEנU[D;nV_eGP#뀔\0Lq5}')%; M6 y,b %/)&v1x AҍMP^27P?TAoc#oX銜3`qm'7}6 ~.Bs= m#F0~>vĉ\|ݾn}6۰60`n>{;CW^\EkwCYY'tGn;vqGpM袋mݺoz!C=z4_};_wEHon^[sPԴ2s])u/EM@l`HU]C' LDcxsR߉7s θp? u& WšZgv>#g/壡z/豿,56v Zנa<.V%SL_N_*%)oMrtuU!䴃9`FfpVӠJ#$ qrrZ5o;}[ZAm&N}ϪGB8okYt$WA[!Rt4#БɏlVY냒n3DUб:"n]ۥ#*50uA >p켍: 1Q> B$bɐ"\8#0 t=b.y+|tAudNODU:_ǿ f 7Y.H@7*QQ:O 3QRwWJXF`27lq{Rz{c( (W0xGvLO&[~򫍡Bq)U[ I2i)&:6yovi͎ZߧOX=!m/1DT*zj/3 x\ys Ap z{rm :V/o솽&3Rx:X.B]ux]jy@HR:ZƤί@i?YfCĢK$) Iq)/`\3² vFZ3xo?Gk7dL5\8⮍\6QhFu50R,ҽW Pu5Pq?Ēx=1ۑVAuIJYHPRb#y9ouauJ_;ӌHKS>3u- An< 0 jZ27~H*h4#G^R([•0+a&y2Wj܌XrcWy¼fcGAxz2~ W#P^t-Vމ6zY*’w DངnOӄV^ 犊2#F?d xt7\*`K4M*7m".S;SOGNz:8fٖ @Sm,S82{h,KG&Y%)RT|`/M,h{a};ì}bqݏ]ÿJ"D;c%HCjnXz}z{>GW\Vr$8 a?^{߱V0F4ԃP{jyf=k+z3Ə?Ell(;yG"4$P0{zf8]x/ 1y6*G<G9Fq*.j]Yg/F;TW^bc)xj+t;U[vğ_<_v L^W( kB$eBtA:EufpӮ*ˍDA $Q:[VO@QJ1-7.z YidPP7׶xX.f:}o*G^YiEb|Hdv}aRe= @R ޮ F^[[zlZH ɓ{/G?"q)q 9TK+@Mk""0SD==ϠN1ݮHuHKJ4vD.53@(SQZXh>wĖC'cJ1b#vi!bhtJ=z,ʁPYk t.I^`b&G3RZpCS?>ܼf[P_`J}Gf2=;"i௶]0x@{ \r1.72P%*  OX0./ѯhi{-SAuK-(;fAb`VS۠d)-Qs9R'ڂҪLU S؈tN2抙#UV1_geGSi;I|\̽P_:WjI4ormIQ }yCO{;Ay:r~]=_n:ѩ'*4U@prrl횦,~cD}/.E) qF' {=onҡ*]5k~~#kXK\o򗤣*V0J)zV EE\@7W=bAiV+Ck^pΚ}FdtoJPoHLN{"ݭs@)o7[p;`Gu 8@\9TJEIl$◕þjϢIˎ,xiAq# Q4r}L/GiF8_6+\A3u\'/R@7Xhf-JCQ_P,1v7>QQBGϾ SlZR n/k9DiFfS-?߽szoBSQY'.Q?{"+R N7u!|0S=.8:c,"e&PY jfQ+zf|/DFz@r,Y1=.)k_{tZӠլJ-ݻ tӠ[`18LM+e(pvQoa(9  JשܒZ*ˉ%)A9YTґF4 GCZ]xxDZ6m%aW' EH UӍ/\(S_XF)6.FaY@YG JK,a$I#5ԽiY1o+) )G|ȗ(/Q>WJ|B2͓78这K<6<"w{{{+@)oX2wӡs5uv2YnoDl _@ͫpV5(O2ؿKTR4 M,&a邒u}I$ B疊"4PBj@`"+t[#Gmn{,6i u{wFaYPXVԾFCnխǐ('4p  J_WC?TEiC;(mW `ҲB$S=&D.6x} ZX(#,ZZT'Z+FBg[4Q1L{⛷, j])qDȮϋ{ȟ v{0̢ޗΙ*g9sN1xכLD\yH i:}y“9}p$C"* @V}P_ТR]7.KvЍyѣxO@% \\zZ~ha)lޗ:Q#)6B'MyOey5RpKFP$/ )wIIa| .y;3ܬTmz]-uW@!iQ#+QU6zJ#GfdFHaDS>o@e eE%bO8Bb=/#dKǣvi:ϗVa?Z^2KVZrD5LsE޿cm,Zl\[JI><+ϺxzrwXj4,h55y<ýOGuT;0wP|=@DEaC,`74By%TviaA1#,FZ˵P5E87l%~ ^]ǘ]:wRSnz #GVj=H]@cT!lz쒨@wCeWd>-*vA}شO1rB8@¿܀K` <I^gMO!J:sJF ]!^vĦE3xJhIKJaG)+%Gשb98o77~t\0մ|{{ncD"{X\ %'6ٽI&#)A[((gř"0ה-cbO 1sRkpIo-*4I}nOdċ[U" *ZtQAMˠʫto\]T7 1 OK{7׼UC)Q)d&ҁː(˦O>9zAz0Ƥ7եJ yX!I)B}nR߮k;Ģ =y#cPSPO@}S׹& زjKu%`7a-(([#z Ǡ uGrO(]Pr0#(y\'sEq;仲GYNOdd-PtigV ctdO;McƛcJWXOӢVe"1ɟ'ͪdͷ̇{x}} 1PB+=Utv&BᱱB|SZ6"* OPAQ]TW0F2h<8y>UD=5WxXU t5u< =㮠XT.:HS}t,[>VQYm#ʦ&,9_:~c(dGȮl&z$q`t/$nXM{朰FܱI?[ݍDDM_vpO ?9s7B) CkIGZT%+'$>ors$8$(1گ̿qQE]7+{ټ+ExDy2x1N_d;_yr÷͙+pEkfHI]> #2[5'g""0TQ3tTTϿV괾J˨] |CT5tU)lK~.b]a JwCX6PH kNf`W2iXa ~%xӰe]G&@I,+&X9w LjX /Á0-*!;Sɼ72FM*_S*u;_,KV=Pe3Do`ުEM{L%ϑj@pynG駃+*˟qu9wCp0q$%cW y2?t}ZThK'`'Uڝ-*Vf#ʖF2 41y*-oolAVPrUʕk+49L^c43WDk5neeV*qugLATԳmy5dmZlnDTAfݰ~,LT1lLE=XHJF#߃&iTozY {w㿀(-GA*Na4XT/]T/1ݻ6liS8Si ⷄzu4Y0N3Lm֢RU^( lL7A&R^:pv > DzlI\ȉaM}(xz0ôRqB5^axE]?*ԍk惗5x[])ʂ3{(/N9?s .Z㠘( 'Ң"Q1S"i1nAhoSU֓]M\I u]loՊM7,{to5[xvɻܛ̧z 3gf"ms#ܩ^(/>+4fBIh< r> 6vSh;,ʡpNR~..3pDR+TkYa]TWGTjԩ^q4ޛ>ϡzzƏK}o=Dq}pYiQiGc֒GRR:t5G{Zw+|gޔ}M*czr{׊$Yo wyfVj&#M%Ӷ&ʳa$m8~Ep4hd IDAT`142뢿w/}JIЀ,Po JT=LuԦ)hlm ޢTE#WVee lI%w²3nkAQuШ{V(50+}h,@qa@DQ<Rdt?|LPuoy'qJU`TJߧ/}b_n'1t\ctU;l\HRUHKG#s-= D`ߝG~] x>=k)}3syu5ef:i}zoz3tJSߞ>D1*e[:J7oM߳͞.(ԟJMGm08M @DEa/1~˖ԣM:VǢB8I/ҽoնpΡze lzɷ`kHRT/_yϽꆟZrL LSi ՝mI^y Pb7%繠GAѺ_Vv!8#pօv7}nYZQޢii hr|t|JVa娉Lκ}S˽ ]q8L>j<; >}NFӇ8w)pvʧ8J9G>3Ow.yzy `&FZu+SӽwZ0OͅEUr!xrRTضE?*u{9É`D&ʼܶ49^Sڐ E/Qsj?uyҥDp[sn ;]DTA"ozNEV:c1P҂Ҙ2WT/Pv~'=~ZP:{u"ɧQF<^BӓWP5 ^~9C_6*Wj,bY0?7}WMn!0(gTSJ^ρpB'꺇Jhh{챬x.s>VS@ %a1d 8R&ܱDRC@G'8}|apz7%qZ&ݍNs.d:{*y%>[\Nb aeBUEeZ|n,HEt#qmmRP`RN+xmTqX U4fپ?h$ (߶pQA \ꆇB++*QoKJ\\#/Wh:X83.J7:F()\DP0׷wY\9,{qԒBNy^sq m}[X{Le`V?fmFڢfZ x<ӔGLiސ7ks+7>zvLcBա\sQ )z4̶rzO87>37?;m{b~]s_|c>VA~9 ّDE44AGuwȤGR~es FT^-qTŢh6+ Mrb^43أs`ӌ "0TIKV:ҲBì넩=K:jl=σ[`Gt(W; $} #*CtX=-,LE$]OeԷwOt.>lgC?$tUL~0t*VM N. P0@8A'K}MUa-& #%FR:AP޸+xy'7m@Gtv#:"U7RJ8-cm#*GR#SԌӻg'7ÿ)+En"]'/bVs+S;D⊌onqŒTh]9=Xd"Ղ4pߧ^➬|bmR$"#o}=Q>,gsσ%*mSK`qv h݊ W J҃&PձF.-+h.ShuA-OA[ Sz&>kub(B: @w)SP꺱|cPe ;͑HH `]U؋łb竢 }_7=|fQ>gW/{d7*짓T-2a'߻*P?<>3~C6DW3ZMp;]4 ^WѠh0\c}^2bi$Nw(Hed~ d%ŭM]TM~[{MS8]/Ljefб*Qwn[ykYg8S6Kocp$?IhQ h]f4^)(M^lls dȩ?A^lxdWsޛo̒L0x;?rkQAcoz!0s-8tA;ǡTg$Ŏɫ2fqÂ<0F[0]UTT6:y4"a1[yʤntM6| RSS<GeʎaI8yd''O ;FwcEiw0+xyOt}+g".P%Q!>u?ud,ۺMã&%a%%(8O=`~߀Zu.- osH\^{Y~ªS)л. Wyr$ɵ/s}IE`|U\Y)yG/QxB # iX PBjVß.~snibf͇&wkwmwV:nڢLE_wهAXK")ԇttp=֊Ѕvz 0o L׫ʴ 5QGʇ@savJPM(/r=e~ϣ~1Lձx'vy77bFS&W K`RQu(u^Ls3r}`h E߮tuXVԽۄɶc?Iu KW+Oyz P~#-SWa䫬Zy GJ%_~'_Oۯfr7BLc/=wmrt8 YHJfيV)4SrnPHOzxհ>p9n/bqbd3ya֩N=}w$:njGTh՟2wQA' \% Xe1?GB{y;Mp Y,Gٙ(Eޖ^&; 0RÈs-|}tA*\ )*!$(:5IJ]I%ʊBSX3#iz5_9T$4 +͡5ݷ_G#VICee.[>Bᔸq'&uOSw7C<:tu)F}2*pۿ)uLU65gNnM9 F)A*G5OuH& lhy_ijX3yvKNVD(M ٕg+/wL\s5O|h* Tk":(%'4U%7E]y}3 4m[ *GQa¼ -j[HJhz Myӊ1 V&ƠVA4nIH6GE4iSX cU^ZՋiySXڛuN~ #AKG$=ZXWk Bh'q#xdu3UF +(>Y)V*HUm~U$YݿO$oHĬ*d*9JI %ۺ/0n![%,/bMSm<6Xv><M87;Fhu\,,1lQT$C-]%6#߀?%qɋޣ$Q F}:ő(bɍ$Q3MER.l}c֤z)olTals>9a@e,mt~y<=ǿ)T+{tD`v0v{fKL){j|y$oL7WxΣĝx$&Ƀ-5y+f z9-6=V5ӈeYjIlc?[8 "0`z !%RZj -Aѧ `qZ./O yq{Ҋ•UX!Qudo}S8Qa]lD;6<=H=oD&&, @]3#eHJ,o Ynlɬ]=Rq!&%1f{}sv_iysj|gR2D zON#$F6]-- =uH瞓l GV2vyIiUf D#Փ&Leg}X3/mLZI-%Uܔz̛>"*  S8/ҍ釿KKӌbMDPLD[rDž+uC= )A$Z76lYF:5O U|sM{QY-D|mJs)'sNFL2X!hƓ+3iH[г v_A/dnzIFD#Sۍ[ۯ|=JՋ7߶őɼU-3^!-xM㡼ʒR~6߿??6cgQA l+Ke:² 5Ս.zXт(JS CP((tDƝwݡ*Cc{yqgh>|D\IiRMp>DEYCC.LnW=%tѳhGNYq%$U't8GZ۬t{i:-q fؖ.%l& oJAcG46 v[eL"CZ8o'-9mboG,LڃX㥐U̗-e|'9VHpr7#GAf ۩^z0ڬ `ztth00('[pֵ4Aκy17\w1;[h&*`, h%}^4lX UaǓzBd-y%ƿV(T})J 444z2hu &Db}7U#/X$/GHHʚ'M n s^뙋kΓ 'BrE ZIϙW8{0l^zs=ѳmD&8@ U"@k3}svȍ/,gM")NmA8a$<D?J "* (KWWW'zuƒ^ޮR`T4PZY祭W}f?mEnU}om+"qQjȍZ^" ODzٞ1nRrҏ~ or3շdԟ4:;GDo]uWn⿵DTA?*Wo?Kz_JuX’N$Sf9μ0s[%mV>N[?9aM$$[DR=J=K ~B[cthM4'ELNA^nl'IɊ7d53قdC-C>Lf(i|D#Ea-)6ƍq{D.GQA-4R$uzN>$ѕHX:ͧ$2cK[ nۅvJ+%HJ䦵(HD+3SAΕ_ȸ/$d#>LȠuE5<-.BP t@{^_X=o*n׷T<*ӿ{-J őj4紐&\]so4O0kܷ$ړf h,I`Rb79d#~+Z9+Dl3WRI|,KN^feξBT -c&,ja-aLQ`sHCkO=YY3L`mgū6?,#"0M泄g7%\ W7uYP0"̮bVۚn5W|<|c## G܂t@hs9MV#"˒Uf%yDTtϞǎcFYqb-8J;s3JP+2P{֤#yUD[1 4vpvw&x@VZ=O3ǝiQAphGf51Yk?Vk7Fk"*t5S{r:-("nGdn(> 8qCn^W<#"[l}Cˑhޑx]9Y+Zy =7'g} /PjQ϶c䬋f R.X@sE\as<7'=O2'~y[@DEa"3 Zmvӟ}cR:tQЈXZ&Rns{=}!_앝(8}^NyPo+ovmˑʡDVlYɑw:vheOY+1rZF"3H&@yMk ̌^>^$6&ak's<KPo)/KEDEa.g\gafh E+bOT{"ُ,sW)Nyσ5>N@=}TKQ'?- 6{c;R/rp%)ԗq/$}M+"^ɹCxE%SXR$6u[:9C+_Q~,:ؾu"*  !3 a Geiw$#*DVW;́f||N!tIJ:j;| 0Ңs<*fˍtn>SYHΉdSD=c_}MW~XiTPt>zVNPdVHZ Oo3[<~sDTAڭjXTl"a%o%0?_|p{x_Pxj螖Qy9c{j5FRcKK^k{߻=y54WVHL**MZHb{K`벧sԔ>DeE ukbA^cq&Z+6?E+2."* ~񼯫j&X}e܂Yt}TjZ>O|7eQ,tOP^qA:C{Wε#1n5"YqvDfE`V):{g!%+ $EYiUP,j lj>=(}ɓ.ZjT&LYv;3q[:{[кǪ GuzJUk\SP}J?(=rg 7 Lهw}V` #m)vBXrbd%U4WB)BE_^U[[rJZGZb߷fFeZ)TϥD̦t4Y=ruz˾_{8N\S{ʣ *}|2 "3Yڕ茐O$]0l]>2|P҄hQ  ^ ;!eKi.,uyDd<{Qk/LF5f%^oDy,l!Q$ "2Yf ιq\g!G`믾0(vV .QDR#+1k۞ʽn-1IZMk*2._{&#3{EhZd"F%sk]߻ ʴ"0yUd%o>JB<t@ 'RQajz򋽩O?w8s ~L1OUHG=_ۛ]ȦDHe% KznIMjhC<ۚw6Ʋe}’sZɌ-"|])?4=5Hd g/i X=#+J@~Wˑdq;ױ\v~__<]QAسLVBι1؝ws} ui"2kiiQ- K'b:owͫI"3D#m|=5>7e%* ]/ؘklbcLFil||z҂ݷQAf֘vFHn]iEb-0Vw+w2㓒&tHU7s%?#_ޓv6rY}V;#upGϺg}AhDTAyi٬j&2nm~k6J2f4 M23 a݆U,g{0!nwǠMkdv3E{(\X֭4WZEDEA'L{͎W;֭}tlZM{BP%sy7ܞլU>tI9^  2RLnC-fKK1K\ٖ&+4z7ä;SGa|JHz0k7Yks#1 DTA"31U@f_fZJwͦ#LQ$LhX!4͢3QJO--ط|PyZ6ϡ-9QAi/>X]h|RZe+^mvn#+L#N:P<#3?NB^DDEAD2c6eDhu֭tlz&>QӖ{Uiq {^,+0z̵VF8kg S써I"* 0 LV5<]X]23yWhZmC=W1Q"DTAa>{;:#2n`it lez*f!" i/3}+3 љRk6=t&sYWDEAsDf'4.B㓘5ma.&)"*  ڥUff֭TfdEDEA23DgPk6QAaF12Wt  { cODgzl-'6"*  +Dffj1ϥ؈ !efjξy]IAA;$*3HUetAAG&!" '2NtF&{   efQ f湎-'6"*  Def؝wN7$r2  1"3l̷O:)hyo?ʉ  >jUqDjYdQAAO2O'1qQAAx Q}؈  1"3sIAA-DffbDTAAG9iAAatʈLAAa^/ˌɞ#"  1yDTAAj/#r2  Okډʈ=DTAA Ȍ0sAAAAAA"*   ;DTAAAw  0QAAa!"  ¼CDEAAy   AAA"*   ;DTAAAw  0QAAa!"  ¼CDEAAy   AAA΀  OO8s馛8G '$" œrxGÜ0QAaNXjz-[qnAo W ?J%֯_OL  {KRT27o<a"" ^etto}[ 7]0W 7/AA*###޽;^뮻x0G G$" ^n:9a"" ^砃`hh9΍ AA:HĂ !" ^T*l2@}  {%KP*ApeOL&dBB%B@%(0ILU[:u뎭jwʫڲ SΪڂ ?\C(Q%". $@2GI2x2 WU*g硟|X۷oWWW$vDwy v]3g4\cǎСCUUU%mKzpB 6La(//O .쑦M$>}z@if.\1cH{l馛@ >Nh,XcZny3zͺۥKtūy 3+mWVb-%:|>=5dI=ܣy% W%)~_ެ\GTD pmX~_V5}ti„ ڸqJJJTPPԨM擱w}W4gy<V}}z) 87++u:Uѣ1L} :r䈤nz0TRR"IڴiΟ?`0CIJRffdjmm5˗/'<AzWtqy^IR{{fСә3g4YIcB͜9olly1'J;$*UQQ@ UV)??_mmmڵk̺%VY+YvRDk;6lPkkB`J4zLuJNU@ {7ߘnIɓ'lI=֌1B9 Md[^^'*@@MMMҒ%K}OR1"rÓe˖^7nT[[4vC=SNԩS*..3$*"r m&177W? P8c=f1̹8[lqĜ+,Qە{X)cJ~~<ZZZzF9ah8 ^'SYXөĉ:v.]$I5c IҞ={z<뮻dƌ I'|"Ijii1XsQ0ۓYFÜ)u4hn TYYi9xbkժUDx!bJ2z<UWW7iiiz9r-Z$0쳢B>Oǎ3j=KvūvZD畑#GJR5j$xd7בTC $pwjrڶme4l0͝;Ws1/gϞG}$׫~X>OenƏoMQFmذAwrssUYY_~YG}F]voє)S4w\7NVggg4vMzZdoŋffmРAɑ?&qʔ)U{{z-oSII5|peee7n&O@ ͛7;bnػj{X)Ox^* = TzOxiqb]GzKTS =*ּypBB![r[oQPH`P٩$W\7ڹs${\?^2'eFtuuiǎ'O* ,aZhFkתQYYY| 1D\g%MX-I$I۶mT[[c?n̩z (IDAT[ ,>D vūvRF+X=*a8&PH}'u$jN5@ R~~Ν;>Oki̘1Zt֬Yc+5߼y^3f̰YYY(IZfLIRss|>wy|SMf5Hv$Jo\ вeK/{ Z\I={.IjkkԹT:wݛr$b.FYmJ2Z9D^s}\ &ϧ.ndIdD(UѣtMz'G7ވ{Q2d/^l&رc}r-rTyy$Òyޤ:B!=|psl TXXfC7z~`4PȖrFxCNGGGEzKeظ\.xz%I|9kȐ!`7o㉮do}R]+ޮrZ-cDȋ"ǒm KI c0tkiI_G\ݻ|y:oǘkٺzui8p@vӦMPQQ gڿ9J;-2#zXE2fQ/K>OMMM:xjkkc}w~nsv1Q=ζv{i-Y9lݺU]]]0a233ڪ:޽Rf籴R'+V:bzs`L-- 4 ڝ|' ' pƛkWa.̈v#7#c[yfECD_ۣ#ft7uruO~'sT8 !P8L?^X.I Kʺ')rIF,],G؞8Qˑݽ{.슓ea{/J늳=z}i-+2?*gx ZH˱,Ci1GZYy?jCR1/Jj$ Wd!2lIte9]=FwtD"뢛B&_Dz7X-GҺlOD⭏.޲*'\d]b-k @uK&$j"¯M3jKW/H{q~=*@pCqT8 !P8*@pCqT8 !P8*@pCqT8 *as (KXC@*$5ReRQ{w˷VRXOHm+*oYvQ|(t *@ o]{vR=.tp<RX0T8VQQvlݮwHo~ ]gy#̮+?~_/Gv+--MڶiΝvjĉJKKa1`HJc!7q_t;3Q AWE~_^v.s8 ),JDyyV^{OGU  X8*`0@ '?|Mm۶Mǎ#X8*HoJ^Iʕ+e?~18pkoo׋/hN\./4^|Y[n;Cby<g"RX'A{ҥKO_O?\.+##C`@#p& ={VjmmՃ>'|Rx4sL|>4]"ZT8o؝ tttJN:ŋkt2Zb~_g+^l 7db*gve3۝ eUWW+(͛3CpVX6=:I}yУVV{%IR{RʛվڃzWkҤjԩ{rl1D@ r\ZoϨbƍlIϞg{ni6b#P yiO(=kA)2Y_ڵ{+SI2l-EL..  t}{ܯI$224l'H} oaӽJOڐ#Gg=*#Ǎ>F/vO]{Qg]x`a HA$Uj@JW#k qz)~};mH6K=*kWq)ߦg\{*%3x `@ÍDAJ R 7ۜ3F%ygo _Ӈ"<`dzG%#3+=*9*555O_s[y? 8*@pCqT8 !P4}WYC%LG ixR:U.oWUp/~p^ ý6{1 m b/IeeC$^Я4EVcHR̍jijeʵg_`\g۝ױӧϗiϾZÜ3Oc]=vI/҅f]n`K\OR[KdD'9-,Iy>Ȏ| div.bodywrapper h1 { text-align: center; font-size: 200% ; } .. include:: inline-css.rst Mayavi: 3D scientific data visualization and plotting in Python ================================================================= .. raw:: html
Mayavi banner
Welcome, this is the user guide for Mayavi, a application and library for **interactive scientific data visualization** and **3D plotting in Python**. .. topic:: Getting started * You want to use an interactive application to visualize your data in 3D? Read the :ref:`Mayavi application section `. * You know Python and want to use Mayavi as a Matlab or pylab replacement for 3D plotting and data visualization with `numpy`? Get started with the :ref:`mlab section `. * Sources of inspiration may be found in the :ref:`example_gallery`, with example Python code. .. use raw html to avoid creating a TOC in the sidebar for this page. .. raw:: html

User guide: full table of contents

.. toctree:: :maxdepth: 3 overview.rst installation.rst application.rst mlab.rst advanced_use.rst building_applications.rst tips.rst misc.rst auto/examples.rst auto/mlab_reference.rst api/index.rst bugs.rst changes.rst .. raw:: html

Index and search

* :ref:`genindex` * :ref:`search` .. FIXME: I need the down link to make sure the banner gets copied to the target directory. .. raw:: html
:download:`m2_about.jpg` .. raw:: html
mayavi-4.5.0/docs/source/mayavi/inline-css.rst0000644000076500000240000000054512747716313021745 0ustar prabhustaff00000000000000 .. raw:: html mayavi-4.5.0/docs/source/mayavi/installation.rst0000644000076500000240000003340512747716313022403 0ustar prabhustaff00000000000000.. _installation: Installation ============ .. topic:: Section summary This section details the various ways of installing and compiling Mayavi. If you already have Mayavi up and running, you can skip this section. .. Up-to-date install instructions for the latest version of Mayavi are always available from links at the Mayavi_ wiki page. The following will give you a good idea of the general installation procedure and a start on where to look for more information. Installing ready-made distributions ------------------------------------ :Windows: Under Windows the best way to install Mayavi is to install a full Python distribution, such as `Enthought Canopy`_, Pythonxy_, or Anaconda_. Note that for Pythonxy, you need to check in 'ETS' in the installer, when selecting components. If you want to reduce the disk space used by Pythonxy, you can uncheck other components. :MacOSX: The full Python distribution `Enthought Canopy`_ (that includes Mayavi) is also available for MacOSX. Unless you really enjoy the intricacies of compilation; this is the best solution to install Mayavi. :Ubuntu or Debian: Mayavi is packaged in Debian and Ubuntu. In addition, more up to date packages of Mayavi releases for old versions of Ubuntu are available at https://launchpad.net/~gael-varoquaux/+archive . Experimental Debian packages are also available at http://people.debian.org/~varun/ . :RedHat EL3 and EL4: The full Python distribution `Enthought Canopy`_ (that includes Mayavi) is also available for RHEL3 and 4. Doing it yourself ------------------ .. _requirements-for-install: Requirements for manual installs ................................ If you are not using a full, ready-made, scientific Python distribution, you need to satisfy Mayavi's requirements. However, depending on your installation procedure, these requirements may be automatically done for you (see the following sections). Mayavi requires at the very minimum the following packages: * VTK_ >= 5.0 with Python wrapper * numpy_ >= 1.1.1 * setuptools_ (for installation and egg builds) * Traits_ >= 3.0 (`Traits`, `TraitsUI` and `TraitsBackendWX` or `TraitsBackendQt`, `EnthoughtBase`, `AppTools`) .. note:: As new versions of VTK_ become available, Mayavi is continuously updated to support the latest releases. If your VTK version is newer than 6.2.0, please check the Changelog_ for the current status of Mayavi. .. _Changelog: auto/changes.html The following requirements are really optional but strongly recommended, especially if you are new to Mayavi: * PySide_ or PyQt4_ or wxPython_ (2.8.x) * configobj_ * Envisage_ == 3.x (`EnvisageCore` and `EnvisagePlugins`) **Note** These last requirements can be automatically installed, see below. One can install the requirements in several ways. * Windows and MacOSX: even if you want to build from source, a good way to install the requirements is to install one of the distributions indicated above. Note that under Windows, `Enthought Canopy`_ comes with a compiler (mingw) and facilitates building Mayavi. * Linux: In addition to using `Enthought Canopy`_, most Linux distributions will have installable binaries available for the some of the above. For example, under Debian_ or Ubuntu_ you would need ``python-vtk``, ``python-qt4``, ``python-qt4-gl``, ``python-setuptools``, ``python-numpy``, ``python-configobj``. There are several ways to install TVTK_, Traits_ and Mayavi. These are described in the following. .. _Mayavi: http://docs.enthought.com/mayavi/mayavi .. _TVTK: http://docs.enthought.com/mayavi/tvtk .. _VTK: http://www.vtk.org .. _envisage: http://docs.enthought.com/envisage .. _Traits: http://docs.enthought.com/traits .. _PyQt4: http://pyqt.sourceforge.net/Docs/PyQt4/ .. _PySide: https://pypi.python.org/pypi/PySide/1.2.4 .. _PyQt4: http://pyqt.sourceforge.net/Docs/PyQt4/ .. _wxPython: http://www.wxpython.org .. _setuptools: http://peak.telecommunity.com/DevCenter/setuptools .. _enstaller: https://pypi.python.org/pypi/enstaller .. _Debian: http://www.debian.org .. _Ubuntu: http://www.ubuntu.com .. _numpy: http://numpy.scipy.org .. _Enthought Canopy: https://www.enthought.com/products/canopy/ .. _Pythonxy: https://python-xy.github.io/ .. _Anaconda: https://store.continuum.io/cshop/anaconda/ .. _configobj: http://pypi.python.org/pypi/ConfigObj/ .. _install-with-pip: Installing with `pip` ..................... pip_ is the PyPA_ recommended tool for installing Python packages from PyPI_. The latest version of Mayavi available on PyPI can be found `here `_. Required python packages can be automatically fetched and installed by `pip`. However, VTK Python wrapper is not available from PyPI. Therefore you will need to install it separately before proceeding; e.g. it is available from `Enthought Canopy`_ or Linux installable binaries. After installing VTK Python, you can install mayavi using `pip`:: $ pip install mayavi .. _pip: https://pip.pypa.io/en/stable/ .. _PyPA: https://packaging.python.org/en/latest/current/ .. _PyPI: https://pypi.python.org/pypi .. _install-with-easy-install: Installing with `easy_install` ............................... First make sure you have the prerequisites for Mayavi installed, as indicated in :ref:`requirements-for-install`. Mayavi_ is part of the Enthought Tool Suite (ETS_). As such, it is distributed as part of ETS and therefore binary packages and source packages of ETS will contain Mayavi. Mayavi releases are almost always made along with an ETS release. You may choose to install all of ETS or just Mayavi alone from a release. ETS has been organized into several different Python packages. These packages are distributed as Python Eggs_. Python eggs are fairly sophisticated and carry information on dependencies with other eggs. As such they are rapidly becoming the standard for distributing Python packages. The easiest way to install Mayavi with eggs is to use pre-built eggs built for your particular platform and downloaded by `easy_install`. Alternatively `easy_install` can build the eggs from the source tarballs. This is also fairly easy to do if you have a proper build environment. To install eggs, first make sure the essential requirements are installed, and then build and install the eggs like so:: $ easy_install "Mayavi[app]" This one command will download, build and install all the required ETS related modules that Mayavi needs for the latest ETS release, this means that the `Traits` dependencies and the `Envisage` dependencies will be installed automatically. If you are running a unix system (such as Linux) we advice you not to install the files in the system directories (`/usr`). An easy way to avoid this is to run:: $ easy_install --prefix "Mayavi[app]" .. warning:: **Known issues** * One common sources of problems during an install, is the presence of older versions of packages such as Traits, Mayavi, Envisage or TVTK. Make sure that you clean your ``site-packages`` before installing a new version of Mayavi. * Another problem often encountered is running into what is probably a bug of the build system that appears as a "sandbox violation". In this case, it can be useful to try the download and install command a few times. .. note:: Automatic downloading of required eggs If you wish to download all the eggs fetched by `easy_install`, for instance to propagate to an offline PC, you can use virtualenv to create an empty site-packages, and install to it:: virtualenv --no-site-packages temp cd temp source bin/activate mkdir temp_subdir easy_install -zmaxd temp_subdir "Mayavi[app,nonets]" .. _step-by-step-window-installation: Step-by-step instructions to install with eggs under Windows ............................................................... If you do not wish to install a ready-made distribution under Windows, these instructions (provided by Guillaume Duclaux) will guide you through the necessary steps to configure a Windows environment in which Mayavi will run. 1. Install Python 2.5. Add 'C:\\Python25;` to the PATH environment variables. 2. Install Mingw32, from the Download section of http://www.mingw.org/ , use the MinGW5.1.4 installer. Add 'C:\\MinGW\\bin;' to the PATH environment variables. 3. Create a 'c:\\documents and settings\\USERNAME\\pydistutils.cfg' file(where USERNAME is the login) with the following contents:: [build] compiler=mingw32 4. Create the new environment variable HOME and set it to the value: 'c:\\docume~1\\USERNAME' (where USERNAME is the login name) 5. Install Setuptools (0.6c9 binary) from its webpage, and 'C:\Python25\Scripts;' to the PATH environment variables 6. Install VTK 5.2 (using Dr Charl P. Botha Windows binary http://cpbotha.net/2008/09/23/python-25-enabled-vtk-52-windows-binaries/ ) * Unzip the folder content in 'C:\\Program Files\\VTK5.2_cpbotha' * add 'C:\\Program Files\\VTK5.2_cpbotha\\bin;' to the PATH environment variables * create a new environment variable PYTHONPATH and set it to the value 'C:\\Program Files\\VTK5.2_cpbotha\\lib\\site-packages;' * If you are running an old version of windows (older than XP) download msvcr80.dll and msvcp80.dll from the www.dll-files.com website and copy them into C:\\winnt\\system32. 7. Install Numpy (binary from http://numpy.scipy.org/ ) 8. Installing wxPython (2.8 binary from http://www.wxpython.org/ ) 9. Run in cmd.exe:: easy_install Sphinx EnvisageCore EnvisagePlugins configobj 10. Finally, run in cmd.exe:: easy_install Mayavi[app] .. _Eggs: http://peak.telecommunity.com/DevCenter/PythonEggs .. _ETS: http://code.enthought.com/ Downloading tarballs ..................... Relase tarballs for Mayavi can be found on the PyPI page, under 'download URL': http://pypi.python.org/pypi/mayavi/ .. _install-in-mac-snow-leopard: Under Mac OSX Snow Leopard .......................... Under Mac OSX Snow Leopard, you may need to build VTK yourself. Here are instructions specific to Snow Leopard (thanks to Darren Dale for providing the instructions): #. Download the VTK tarball, unzip it, and make a build directory (vtkbuild) next to the resulting VTK directory #. Then cd into vtkbuild and run "cmake ../VTK". Next, edit CMakeCache.txt (in vtkbuild) and set:: //Build Verdict with shared libraries. BUILD_SHARED_LIBS:BOOL=ON //Build architectures for OSX CMAKE_OSX_ARCHITECTURES:STRING=x86_64 //Minimum OS X version to target for deployment (at runtime); newer // APIs weak linked. Set to empty string for default value. CMAKE_OSX_DEPLOYMENT_TARGET:STRING=10.6 //Wrap VTK classes into the Python language. VTK_WRAP_PYTHON:BOOL=ON //Arguments passed to "python setup.py install ..." during installation. VTK_PYTHON_SETUP_ARGS:STRING= #. Run "cmake ../VTK" again. #. Run "make -j 2" for a single cpu system. "make -j 9" will compile faster on an 8-core system. #. Run "sudo make install" #. Edit your ~/.profile and add the following line:: export DYLD_LIBRARY_PATH=${DYLD_LIBRARY_PATH}:/usr/local/lib/vtk-5.4 #. Run "source ~/.profile" or open a new terminal so the DYLD_LIBRARY_PATH environment variable is available. #. After that, install Mayavi in the usual way. .. _installing_git: The bleeding edge: Git ---------------------- If you want to get the latest development version of Mayavi (e.g. for developing Mayavi or contributing to the documentation), we recommend that you check it out from github: Mayavi is hosted on github with its own repository: https://github.com/enthought/mayavi as part of the Enthought open source packages (ETS): https://github.com/enthought/ets Mayavi depends on several packages that are part of ETS. It is highly likely that the in-development mayavi version may depend on some feature of an unreleased component. It is very convenient to get all the relevant ETS projects that Mayavi recursively depends on with a single checkout. The ETS repository provides an `ets` module, which allows pulling all other ETS projects from github, and other useful features. To install ETS, please follow the instruction `here `_. .. note:: The `ets` utility downloads the entire ETS, which is more than you need to build Mayavi. As the extra packages have additional dependencies, they may render the build harder. You can remove safely the following directories:: blockcanvas chaco codetools enable graphcanvas scimath Testing your installation ------------------------- The easiest way to test if your installation is OK is to run the mayavi2 application like so:: mayavi2 To get more help on the command try this:: mayavi2 -h ``mayavi2`` is the mayavi application. On some platforms like win32 you will need to double click on the ``mayavi2.exe`` program found in your ``Python2X\Scripts`` folder. Make sure this directory is in your path. .. note:: Mayavi can be used in a variety of other ways but the ``mayavi2`` application is the easiest to start with. If you have the source tarball of mayavi or have checked out the sources from the github repository, you can run the examples in ``mayavi*/examples``. There are plenty of example scripts illustrating various features. Tests are available in the ``mayavi*/tests`` sub-directory. Troubleshooting ---------------- If you are having trouble with the installation you may want to check the :ref:`getting-help` page for more details on how you can search for information or email the mailing list. .. Local Variables: mode: rst indent-tabs-mode: nil sentence-end-double-space: t fill-column: 70 End: mayavi-4.5.0/docs/source/mayavi/m2_about.jpg0000644000076500000240000032271612747716313021370 0ustar prabhustaff00000000000000JFIFyyExifMM*CC"   !1AQ aq" #2RSTU$34568BWrstu%CVx'9DEYbw&(cdg)7FfvyG b !1A"Qa2q#BRb$3Ce%567FSTfrs 'EGWcu&UVdt4Dv ?ƍ4`P~Cg'rGXX1=!AG#˂iD"ŻZ,_r2oMVv$?G .*{s\i{jS9"qONv~#xEo*d] &rBmڽ^ә}@*'Dqe0㉶!T~[q7oߞ$'FV 4hF0`ѣF4hѣ #Bx9)iӉa%ݬF*W#S=ls$evuJdnHBᥟ^cM>&Z=< >٫TtjKUs!OLn7 IqZ@͹̵4)R_S6q6ilm{~y?*/KK'$zt3x.lnl0Y,JsA)W:q(lz-wM(]їq)N2*˜tp8*eEUk`ʀ?I>{r^=eH]"r)0X"O\&+"=bAGW*+qS*v2 ZS8bH"]hѪ4`ll${ycY:t((9:m2h܊tunYeB)ncn$3#bΖ3Ƽ*bTEy2 <7j>dvdL;>)-?]5RK$dr&[aH+j&du"SP\ˊLⴡޒPErieʛ*L%2i%Ҥzp{7*[t4hѯ>0`ѣF4hѣ 4hF0`ѣF4hѣ 4hF0`ѣF4hѣ 4hF0`ѣF4hѣ 4hFq,hʪr&uQCiNsФ!@Ls@(@: Ѩ#ӝCe3#N^[ Tr UF6~* JP23]Ut̩LbamK  s4E^PmȷXf7jpTw0,UZ䫩lщn6C|MKYL*#xbm喸ժƒv ZeFxse\\̬Gʹ[=ҷr2Ryruʘ8W+;,d$ ;WcYEUKp_w\=bhK*tIըΓ|-0/pKWn$흳ɘQ/ bvRYKC;tYQ!AaiZa% SANEТᥰk|)5)]hKRS HaV] ܐgZC(S%OLqwұ4D-ϛZt.'F5b`ת/庱^,,,X Z^30-z8|oqeec$r  O/N3j: u!6Keݵ~_?x{ȕ,GīE"9??#YYN&gnJ{&JFZ\6fܲ.k qճ ],/%AX]q/Rm'ie5\ݾ2Ͷ#o;15G óTV)/&RUI"ҝH%AHUV\R- 'ڈ#@6P!Qפ'?ݿk1《.+]~(lk5+V/P|{n^6]MBu_iM8.ԏlߺ7P*phѣZ 4hF0`jT$񳦋)FfxnPQk!/!U)vXlP#rEd5uDHN^8:FU0tr(8špE9SzIR3lM-JkiJ|5zRj-ӗ{hip^[6M^q|XSɿ\t9k>B*QLg:5lthѯEs~Xg<\TBSeSQHQeO@$]؏,[XPӼ3O:|I;<0.ҖVXHwk\(P-Rwv}|SDSbQUWvHcEA; H  UhQfS%%o-:ҮBZ Í5L4g]BV/k4;ƾƱpejtߙ%}1LQ_8\.9AF,R8ڼWf8p#ҷYZuiHUb)@T$B9R( ?~UY7K>xFE ެw,Lu\.P1cpB͟0KXRq=*HK5N{EIfXtEHi] \"-oqΛZӵ,?0sf! a) 4E`1o!J&0@DVoßO)l~?aZyjvw%zLpiצ+Mtxb*ĭRQ{T!!/hѯ qkphѣpF 5LP1C!1 phѣF>ѣF4hѣ 4hF0`ѣF4hѸx ;PpˏFF0`ѣF4hѣ 4hMËvVYzdaD ^L.+pI &)G>f) 6N|Ӧƚt3rzV M@ ֤qqi6R8R51{qmoo|h'*2>՛UޤiIý+tt@rnJd! %e,ž ̒A(@|4s ]@JbfZQg+Xk6^9e_5: nCמ@ש%'3sZ(haAҩ)U~$ݥhǭ%zZL`J̼1͵# Ԫ9L!jZqo)q-:vRp& lC=(]7g4gQ v[nJ]l{ krĎN^EXSI3Hw%\ԝ&'3]S7|qjX403ms&;؛3gZ-"WXH-g粴/J\i)7p2 C*-'&hCAF)(RmUBӢ<=1rRJ&+dZ}\ld#p@18̪{ɕRJ(M%ZɄ,hҜpUTYB9'AQGl0GrH!S2QC}dsB(n6ÑPjԕr84hѭكF0`})߈薸>JL#8ճo[O\tn("0/l2srkNGjH%O䊘ItUD=/["ͩ3ؑ14{츶,d2/.q2 GcOkpd!DZ "M2B Jg&+j=5](r-T+T #Jb5Qz-hܸTWݎѩa/M-SQگwPH1grZ(U,hv.g뉪 9E'!1 tUkv"`Z+׉V'ZSw/ ͔"^6Ed!(m/ld Ke6tэ3m j8|W.2MȪ(e9g‘BcDLإt$% W)}ƥMBN٥d? E]*/FcUBv˅ѣ]QL]II8n=W^vjͣT.WPA4[LJD)8J#H%)JT)A)JET`sKda3>94w7 )n*9% &Z61uب)qud8/)eK, -vꀐ#鐄N4;'j)Hxq2몡pG<mIL QhDOKHTaW]KQ 5ۑ%i8v`鷴]wc}PWÄZZ5[sXrGbǮfH58/NtUr&n|V6b9nkìv 8xˤE0\1-ie]U\8UE]C(eVYe &UuPDꬡu0qs9_2>iGq]:nn)m ۶U6$|ʧIL[c]ʺeʢW.2q"3*PnU[7f&!e/IiuJL$W"%n(Ul]aKqЖ !E:RS(P:9YW;]ueW]w+D,eUC21100Üaq1Zƙɪ(jɧtM+'IAFl"d]$*Gٸݲv-,E ;jhU61rg-&Ak?D/2J1"ۋǮ²nLgvs9EHG7 gNv/G-̧+4dC+>)ςL@%8m pqtoŌB3:7)lޔN#qNTeI+"эMzAAwoZg?q85y_x{b,xoCŎSN;Ǔq6S,tg;HK1_UzrƠ̶\|0-)+9"ji8XK2dWfMw-!ET!r rج3v$fgX&T{-96ii7jt~Μ!eN$!%!ZToEN)Y%A:ej5UezU<R !+Ai)#Ci&<|K5&\2N<}i㩍n`);V$e21r1ۄ@D=X1R"E 移czGa8Otz-݈,qS;^$ $n<]P0(m xpw˔ ` %8!N`߿nzfY糇뙣+ŭVZu{eHFBXfKL#\HBTldo=J.ˉahmEN-NJq <,efqoO^-9_oC]tΘa71rDJnbuOvh$HH+{]R`#[30yCxL`((JB %) "%!ǥk[7orIvP-!\k JFsW.U)C7IAH37s[DR ݙd*[l"Mj4hRe*VRqռ!ә!Kl/Z-{)\8[n (Ns c_͎8b}qllVǓv-U~*]ؠ9"+9'tjEmo'+"D[Lg9Gi_]aǩVdUԀ H*5~ݹ$f "epE]9QVÇɨ̑QE5|טڄ[([eE*-+MMlJRNj+PmwTf kHPQ!$r6D ӹ9'xAkgN. QQUNe%(@1~R|yr\hO|8B$DIV"面$gγ/YE'U2(e}\JYБ i.TT4/k-of M• [( xb0Y%>>,0Uq*dH$%d8v5i,\ȷH a83MSkݱz?i+2NPRSԪ1J2tE! ٰnP i˹ ^> %|F]fқ\XuNXOo^igsCH7R2Q|6E[{DIU9aeIQq_sxi,vʷiN؟D8|o٪ҥ*PnhǪ!zk6$dQtw2OỖ8a%"pQXo;H58D!ȡJb.w+>CN64o1{'"eSI!QOHg8#4NQ *!P$ʆNTMԖ$Udp^[Jm23iCTqiJq0Zөi_M*ei2%^vs13H5L8XMeU(NAԺEt$h7%[ϓGX"_aK$h{I4Y;bXIM^4pvTAAKN?EMDn+S\>j'ݺk6&&PC""6T⭃yN8vC( ˌ] $1Ϸ\8$;nMyz!vk8j~U6Nj)%#Ydm\j[ZS%rIME:{z3u !9O;ٞI.\0ycOC!3L]-qU $WbWղ2$Bp{2^ㄒcKU(zaůqѪZ{/TBnop.+^/ sj~$!ITG2K;Gl\CuQ^]3IԞWi\Zʿ4g$j*^)x͡7uiEnVah9e4n8ņ/b.M^̄h)(7mM,IPKz*.R@!d8=ඁ_R(rp[mH5-@2_eeӤP m֜V-.)%8jJ,IiHFaUF[hP8c{`N?n=]ZT"3 5JX(2V85Z6 Y0ɘ86ֶi{čv5olN꤮C[|K7 @DJѪX!,EHVeE觶PG~EENBvQsV a@E`,'fj|\6(hoG+'-%2w.Ĵa`p3hw4Mm1 SPeP< $Ĩ \ļ"/HqN-A[hpB {$aaFjJ3E4;(jɹb加*7A\IرbTkٹo\[ZCqHb݋_',l iW"bw+lR܍ j)D(EƭJlDgq/enUͥehii՟,ʳN{j&]M0t-.תVH]+zd gUƚ̪AU>cֻ)%kKUw) wW2Smt㬔JzuĔVr6'0kYK$\VjhʪX>I("R3 y4u EMRpA52+vi7wRS;k'"fNAN%zCMXf S/nA($ >*lڷcSdS#+\A:]-΂2q“'뱪lY[4ʡ.VKZ5xRخSl}Q~cޱcpGd7=**1,)W mwȦɵ]Fv۪r$[ȧ)nGL3r鬃"0cG C$T%IRRBX4hѣK?Lx{A隤|ٵ;o FΡTՎ9JR&,^Tͺn][B֮*$]MPl熎#v"yw9LTXpes©F;E _vB.þd6\yF2tcH*&ab9AVQ r1UDH)9YNퟱr0i$Qn2*t זҥ ! 6_yYJ=72礖ܿ[zN)0w 6(8 RXxXi&ɦ,jڲE=QYșnRX\koڠblR)sOX!'00G,\CmT '/Cy "wt)dp 2R;M"( oRaS~*$氺@c1o4Nُ"#0DSBPS:L]ivzjS2% &c%Xyu#"=Vq^&bLn9|zZ8UBS4s<0$ M׳|'-Vw8n[;&Rn[Lx>i;Lb&H9'۪nTyLnXױDDFŃO4LR)$11.Ѻ&Q4RE) =j4q=+;8ڞ2^2ݔMVe\E=2Hb,lK3Y>Tfk>R j)h=÷\'OdF`/+u2 d~3GicP<`y -kF0^l1: b:^7+J-'l@1ڱV x"T=vBqR#*L>vPrqI=,tsEuћFE;W*tL-,H9&PHPƒqr~xpn.ҋWvˣ8 ;k,9(4!P3д].6D6Rd;s-&$w%>e4BXZ}&ؐ""d Xe=t& HeѰIw,Z7ILAǼ8+MQM K*zxyqKU޲f)/0Pq!-\vhYWӨ1T.KnieηM"tud<*"\D-,CJۼ4nHJI%V'Vƍ4h%ġkx(-Mf8%AdEJؠJ8E(䣈Ww"wWC|+gvj{܏X)VAR(SE]Y㢐r8bRGSIsa;Tp6yI/31MBgRr :gۘijYjiXʼn*]l6FLq;1ZRcz8{@˯G:C8[!Gkl0}b͕.ֱmr*AbJjPHEd]N&nP$(Pb#5HtL"PL0B(QHS6!@)(=_G~᷋alU/SmX\~\.eIY]yT?&fnsΝ'fMޒViZ(Ǟi@l˒^I|mqN+p6J}T71{Ed!THQ3MBC0t1 Q)"Su.=6 |iyIJ!öyY0PY0TUJ2r*@HdJ` yj ?ݵFjT4,B8}?yq3S.,[NppdԴhۦ6)Lg)j:v$'Jd-oC^JlPB=ҪUf+p~hyѠZ߆|K?[\㜉ëJ2y$ݳ:brGhMfs*鬙1 bB}in20btaou`1[hM{NQ!>t6j&"c"໦a 7);V/Lgse^q.p8=ŜZt m֤챾C-)rt[RN?n*PQX[Qt e26 T첓>s:RuRn1j@$eH\3 *Q^HB.l*1q{e)UJ鮾I dZYM&"^  6p4rL"룺2jVza1' ?dEʑqA}a)[f{˥`$(ws֢A_$4zL (V0)er2-n`{²qI*:&ǒ/g#&s`FH98Lߖ,Wl˄ bVζ(bm ҹ4؛oGMo rqfK;19IR BE]hA7P776ӨB")KTK3_߮D%7WHZ8R*Q̓k T<옳cbͭa ~p<10 8҂EU@zq2>;1W`ˎ*t%s…TE5ĕH>rF̤YYsl KTkfr{fRFv&fGqsmEhɔYf+]xlV؂mA͌Ri)^!"n!q#lE'QfAnSԇB.h\㜻fBzFO[nWX L$-![Je#*[iϨRU$ My=Uki5^p/zN%LJviܣX8rV#]-V `Unm?徢"z!cY2z5VVT`fm*XA)X' H#`LAz%RwӗCZk̷.=95q"TvRPw$1ҡwHMKҲ쉪6h,RPP栥)iEH0sI.]1V YK?+jLSpR=+$ W:mZ2vNLqoJ SdW+uBps} C!]96﫷m}3Ni^--ft`0h=$it;7 b03+4H+e\"5 &9D sv@H*|7zTs Py+n25' E\1q \10T>TP!%"m{)/p}|w) 沋ú02q* 5z^=)3]9o ;tBdPEo0ʪf*JI[~CL ֞n4uڙi% (iԬ<OS^LXm \`7R@mqc\9%G4xnEsGQT*˷|1e7P+O(jm*T3¶#VbʹEl+brT^n.~ɓID"}jvݒN5r eCpݐyG cv2tw E[\9CX w].SkӦS>"DrQl"zR L8P^ fRd0jK1첕ړZQCM4%[XXI,mqGdjk7.֫O0ڮMtVD1ȲJSQ1/1NSa1DjxڥřbC9kaە$ "" dXn'T !˲M+?frF1vM=,!o0'q,O6bvHp6qJO9dt *|uffS$@*wfZV7) 2Xs5KpV _TO?R?Ugqx,Lq$ur,2Z<g.a 2dTndݵK彏1!Tp2X?|:rJYcllٱT4TQU*1&Ū˴y˱cJ^Yᨷ\(ZJC47PcQ%e A tL[si`1͊dq a&8l)<{20vDܻ Sqsu8-z.A욥fSs^SEluTD;PWBW0 K#Qf c+.UMBt]i(1bAySIRWfݚv{J6JR9Q\PK@N7b8%@ -5kpF֪[ܽ-q,8lH7%c{Ēw_4¥Wg+`d"HOQbIT˷PQ1Q)iƙ{"`_,NF10vRE)H+)'NQ2S6DzZYZݙi<9OFREqi㋂B\6eV!D:34-˄6S$]_u$jIF{&jV6mpK;3ՊWGM\ꘈSLP.g(C5Zp'K.! xZ%EnXB%:Z_RXrȴ2MЖ)CM[YJ@v|q/5d K-FiA!m*qnl!$q[m qťBJd7,v-:0V٨ùModW;nS2M%T܉0{3%)f"SX#9 dT )C=yvPJgCd!sCtYTM)W@ DYAٱoɉA9\|Qk_Q=h0fBVa!zK->\[)[RZmADggt5)֡24 ҧT,J@-ڍobmYŌ%etc(\sSL9.a~ޏ:n+^l `0D֋x"m"*lP ҪZ5fbfq/.!\iSeppW.($y1:T"EV{RV\"FsU`f wg|0_ lwBG!)V [&8zB3R%H,pgkD*J.JmZB_ KhI;i^*(;LRCr!Zr&ԧ]R\jU{PQ)VdVf>.+rT}`:RLAS% hm$ Yui+ޛs 7G1BCYqr8ʉ_] ? 8k4cpVyH :E[fVQ՚"dQhNz(VV,TU>|g%Y#:E؂qv*ò7+ROR3બnQf*GJ$ot$EU[(Pnw-ApWucjm+ j[9+",2 ݞ0WP\6d&AD]JvNʌHO227'2/L8fdV\+u\}at*?6K:y<ڶ(O4yW9븲ۛ% B^B[F(I(ߡVdp~nVfi%Q9beI_DLZ+OHͨ}Md I$7܈l?{_tp㪥%[8f*hnsҧa+;In e^Y(7ǷTU#ڣORA8PV-t3.R̴NAiޢXMhcÒupL 6{e&2* ݹXqˬlZTɴ3y2/вN[e gfbof"٤&ABvX ^DkXa1HUFG˫ J,ϮQn_fey~&Zm6Tٽ25MB rq2vJk0X.DZwNΉlGGHݚA]sLyNJ23L722o&$*w1U`wZbS:T *!γ]!ogn UQr*6QPSZ V(uHʃPI!_mHRmaA#b/| r4KRiA-'Jbm¹E2yDfYiID0nUEDH?n岠U9AV>#AVs-O*Nu-܏r+u$mu"@ab҈#PxyNDkB&(m6$ iTYBWЁFRnI6p!rX>˙&ľmȮvn=ۗeE}(3X!8Vixd A-1f@ȝȰA=5[S&aȗfz{rH^b.2>mF1I=Q,d9ܲ*%F͐rb3|QM9'֚" -HT ba`էD%^tIsY0V m_x=EzuL~m߮=5k^5`wA@P7 ^c]2׳}>M5i%kI)+k" ;& $)U<* pH өT:9IΑACtX !1A(D#Ǥhg<"ž: QE)q: !J$ܝ6M"M9u8ڢ KCZ$J'HV}j(XFGeJ"5ň*[)+Src"*ʘ .ݎZ(ͭt$ <-ٻ 2䍓z so"v@t7H}J*PO'S.9%xיiHyJ-m !<+ W2?1AyP͕tƍ{PvBJ=Hۉ^jI0t($m/!*EE BT?%TeWP(( 2ޏ5boF$^'BNHHB:2)%סAv )#*EIˤ0Nsۻ_8[F9ofΜd! ?u; "ܱ@YQFW:ҕtI̆ݐ-4>:ܕ ɺ8so_NHXS7`,e +ndՔnbv3r; 3(Cyِ)Tj~eL!IZ"=!ҖᲅJ*rm8:s $)סmmn)&. O];Aͥ{ j%R:NQ1 c).إLL"9 N)L=DzjKmƲ dV*%}^Hs9+N59W2n{Q^̩K_+7'-"QuyHI7h#?3ۮeUU. eWLۇb3d*R"]B_~LGmV-zHZ hc376릸.2%Otߞ6;mBDȲC.M3ItSxDE&j&徽ȥU'*p+ Pjd9MҴŵdYƔղ' 1ږñNmM*۝NUXpV8Fg# Ivʗ])bl8n9L:Rc~H~Zn$gz̚.%RchHp!Swt1"F2QlEA2"2Wc*Y wNԦ̢"SYI4@ i4oUn t#;Om'&m38=[HO6n)Ũ9˼4V4\\'Sn2ӵ Ë#JPGwS@͙c7}*5b5§3vq1Hcdi+?X&grԛ'@QQED%P^p!DR&>5?Mѩ(eHObǦ &cӰ"&***DJ'2o{z#e.s+vP^HQe:Oc#lqG8&eQ\@_'Յ|:yBB^-o{(iS.>PAzT6>I\J.hhlBZb+iܨVId݆lOI,Eԡ%ffݘ̢.=I#鸜M|RuuسIQ ?GN?hT:uv6TdV-#[ PpÞS8ve].u ˝Ay_z(8uko!ZUGi.ܰKo.2[Q5sfK4ճaY225RD*Ca9z|BSW+Y6}:5<@nEJB˂j}%7:Rn*'nI ij?Bg)BsM2ؒ)iL9ᄞ&K>Fzu{q-VB:v&y;I8i"q EF(%0byR[a܆^,ݼ@Fɹ+b4qi 6+Q59'Rh1d *)>1ba/dÃ%M٦g<YyziLk?X!Ԅ_Y(fW @e6h^ ,\ƥ-4<$+ۭH\\*g񐿣kBѤ-ń.mUC6ɝQM s H9LHECAciJ?<&&%NH+`]Ҁf-]>tb EURjM$O*1"z\(!ƒlHZpmnDVI[6ANhljRHas+H8.8蹗n9{ΒRMaܠVQf%Y%Q]E-Z6E&E4nDEHd"i"e! RM!8`WLGJL̚hٝ J8( 2t 6&X)pnNq2*^9~)Io"Ugg!&{ sl2[ &e"hX "pGRU̶6R4߸@c9jSkZ8w,4ʳ|ٜ⡚Xf#[!&?9)i!Jdk E)# dQȨCm?*B:DT+lҎF6h7hR)9.c9p :ʜn%pT{n1d-BޢII2FqU:2YGgAjU:Q􆖕4g gP7Y+JVӉ?*eDI +#}Id\ҮnI֫&}_70CPx؏"0<3XgőNK%`Y@]aۮ=t;ϹNCOUq.o`Md_zD\uڽt!LT! `)Jq( $2'{ˋJIE;g+_rzft`)U eC ؋3c7oi&ӯX1RIlQBnY͚8\ꂍ*AUM#S{UkpIWrN%9jMAt[ԥm,).%ѤնP(Y5V#ʃ)D{")MDGsN(CmRi1WL[l$&RMrk9fDI\8`h{xL.AMaFaDYTIR\eS}gzj)y5]^B҂.! 2kP;*ŦPu 3=>-Ez.~D#''7KJ˕IGlb+8.ȼ3P`g.rRL{q F"=䌬\T^ӯb~p:a͋5];\Ը[^ŸE{)v9+$#"n͹+Pa%gr%QjS]ڬXt\UUa\DHB]J 87֠) zE\"؁+""4% uVU-J㔗[QUa$d9;.Ækgoűc+ ~S,qudY4`)zV.s곖FWgW&wDT6jfVCdkiJrEN),e{NvTz<-r!c2l&DV2_i'9&=>8=q/ liqT#z#\QkocqNƬSUư9'6pA|^nL2rQM/pnSCBHYU=3Z SGq%+=o$ *yH*[:ԐvrNʰfy!)et4}%jD l HXC-)MԷy|Ɗ,l'G0HYX(H)xƊ3uX]~,ެ(&ۉ0p_U07XDw+)ۤg(v l{3$eHQtWMQk5?#'Rb"ul$/%E8Z13.[ٻxjsrMpes0gP1 c+2E]itʁMP<r,PK석V!$|uBWcHp }XR]Iuo`ŜICV3,|H^Eg@P8ljZc 2$4lU%ܻEVJk6Yb7GHPxB)"M4Uc7_s TTT;+4ت.C(&R4rYE2,+?n6m6N<*Us؍[AD]u 5rwl%Dż;#AnKEg.3 -A;i Uck n,[sgekSpNȱ`IǸ#/9DUMtL:jCK?C-V;+Ig,V3D7U2(M6"xf`"fw <)ؓ(cP;zS&t3Cs*"U$#u:_$$"#.{QǜXӲŖs%Cf: P'2٦SdJR] 'p(3.ݱF{LN? cK$!%r7N\icF|icH*ФiC㖀u}oÞ[5XamPzܓ *>nf1O#eZ:ED8fȹlf2jC Dszd *BT )*O0AbcFF4F0hѣF 4hу4hу4`}F h3ʹfBWeOzpxzj,̹L,Jڣ˹9m?82Frr`'A <\<$K.=^N6ԁȨE!'`Y&(5Vn0fՠ9tt2)9zܵr~=LXשL9UˤrD\ b`'e1DHXǼwO@^Ss& r gӡf%,IFm4jǺfB>$81IKjaHX5\㙫(]>[%(HZJBu"[V;X8TG!?z(=>0>h£tc601U' fv P^kxw/%:}ގOQ_:fkX弴E~1E\UfhJz‹V'#hd|̨.|vX- rΩ_z%٤MuΒVTJ'&ȴ2"eV1{w-VG3)dg>Ko44Ĉ8ӛ&[wLxeN`>9nbUhH4!hq@S6 l#VZ]WAxzH󨉗ڡ)-VfA^6f!㛪ᷬ?4x*ź2Uڤ48Tƣ4tPpp6Xa6l!'(Ż&&j$u$!v +E!`}tj;}%J*Ɯch ̽t3d=dsW1/;f sG%jeHTpsQ8xw)|:MoY:K7fUX`PS} *w8!ST3VylxCJB&>u>x箱OB1djwGQxbBe@DW6dq.EsSsX&w`tvII;Tu)J[)aj_[JQvPHs:o-2N]"kj1H*4S`%wDžEѕn{F+Nrj_qa&PUk5MwN^d"+`nie Iv@di4 {KEJLMQ' "Ɔgm wz6^(\E9IY `gGQ5mlA,CCx(bKud*Yxy+MAT%G8p*I*m n2X%m4HJkbMS%ǃNo;Ԏ;JRMWesknr]\ErE=k,[m}0#C}YZGhe_-qpU2qj5|;?,᫉.kA_ȶDlGmsl}N\?^.cMOY6ɗ^x{36*d%J?C+-SժW {n1,Ǚ{E4ȕyy╶ݰff;4Z*O關ɋ,a{loXiHJ0xo֥d!R!..ܴx_|MV3(O9h*tF+WRVUG(I7^Sm[fFc8㞮p).u@5r RJIJ7Df[〄iXykЅt,+ fC[e $fiJ\N!'Cݜخ6uEb-^. um$y~2.°WQq"ƶDຓR|em!Y+ٻ7cYm3SS*Tcdd[XG::m/xno Ⱥ2友a1TAϙLVOn[KNq y,a<,Ck/9b^Iv˪*2DD@D`6$1Cm#xjeT Ɛ%>)q ]sk cb?]DvMG:q±HO$ eC [8 ݢe0SSc(@@"pml4 c$a0tN`f)#HIC9 'dX7Q2n`7"KDST™C2cJW(YV)<7|N@@_pƿ l'1`gq+GeM%z䨽ܠ٠wJ; @ PP9bb ?!אæ`*c5Mm vo53i)r!wqyDp 'ʺhEBlqP05{ZR1k(Ld=E>z9tRLQ)D(̬t5HY; >ΌZ-tMH\8G49zА_hs _IlONFVC؄yAI }!;{ۻ3Y BF.;^a@ԀtGz#ilLUQ;.|y;a PIm]mח\HN1|n6c=ww6@ l)bm AM\:Csm^۞߫ i`&Mi{ېUlݱ}Xy䢆Omto!ۦBME>|Ra~/lmu>/ՇeMF3snVQ]"=`"'iM6H6ZNw+*]Y#Ģ1/U~f8Ԥ-?T?gy ;L]:wþ mGo boI-հ>1~ 5}oVWԆ?mǍ nU/h},1$PV9@LB"Pmf&pۯc6Gk;|c@Yӯv&{Q<MMA:__?+o HF\ɟ`xuDniק]69o0؛.zr"3Gp˿iqݼ9wgۄdz.\P6Ze_gx6%Fx:,/W > O@$&&b q@ra~~]wN`ܔ~;ۗ;ۖ8.\o=yv_[yucy?Xx ^B ePf!`r=;%W"ZrT6 iǝRH %K iX[mamH>z6 5 oI < Q)yCњ=YPqB;)QTaR7ՒF8ZWn MS8ai,ۺ]ђ 8`9eErӵp b|WM #ue-CN7azOЋP1K#|>"MzZ9L+#(1C&WT9 gl\U6lodUA3cWHE]TM@/.7h~oa":vz5bfkϗlF"V|141o\^4<۷M2"#e3#6!a&rCi\u){1D2L.}s %c5Hm"TJPа- l#o&vQݑ f+7Y$`+hCSu<0 1qH70ñaڔñJ#@ Pq%CZȥXcI(Ǐl7x9T?inS$P1L`ҋDBN@ҩ+qZE3ITX>Rna0b)=*3;|pjZ3b$lyve/5%2via*@Do&H_UQƾ36Љʋ|'J8MUd$T"oK0#|j*zcQ7M9Ԍbw۔00bHh4,}QVJ`1uY̢A3ItrRO9Sgސn2&LD;!=: `g VĴswglvKJ8z5ThgoJp85Ċ&ȊYb|j̈^]ͯj o"Lf6`(NI n-{q8*cU"`w ma)(͢J$f0s@9%Hb |MQ*<9|QQNt5eV%[&ټQVlWg.rM8.[&SDTH 0KpӈB%BI.0fB"i&nVG8*J4>/1[p|Ca+*+Vm$[un<$T,uW|cUN\2וa]tᑔt5fi $,BIr#tAc<(,D p\IGLlČ&"Q#9@&hJ,u=?svG9tf9trTE$r,cN'8aG!M"bU`TձJP۬J4vl2 sJ{EsS]((6͔;sAaNMZ6Z2MD<ʁt 0#rI޹)TJgNtk*GPirG5>%EJWȈJӮ8f6x,G!UզmLTjd᪉f`VQcӷڪux5RZ( сJRFQ<57ƨFGFyܼ:.,@G)+ؚz PQxQq693z>)^H@F#*${[2S嘗-)W68RѭB;੠B-*6-ؓ}ĤXC6:d>NuVI>m}8dz {Ze֙p|kUT^$,"YY򡎸kACø* yhk3<-mRf)5½[y >q =]Y3NN +cEgQ&--ع#Q1}ǹkDWNJi4Mwmd?J1]GK!&% 0W'[ 9MAVr7s~Fmr?ɔ+=ΣxSSRa.d$jܖ:wzY>d{j_ťimo K/2:;ݹPr8uRQ9!6i|pi1Rk\He[rjd 4*g+fy%X ^lLݎxZR6tʼn1nGr5:LZ0v4tTSB)|.>FuyMa.wk.8᠜:`s1u逵*B8@k|# 8U.dl-h˹O0@ƌVOF+;ݞ2eGh)ͪyhlpWˉ)ՓȬg~նW`|V6ݐ>\RWmX4F B<̧K.VJ42BQ(mR D߿ͰZKza(JuCZ[x$[xzHV)334I  YҌټ?[2nuk;xHW۫sn"@ c a7D<6=XC{_} lnn4+ 6@ansy>A9vr(%Ha]Vqι2"v8}~aLC~J6?qʯ}?V.QB>D)ID]9k~X*Uypo=]-\ (ٰwn;GCW˜0WH!b8 gcb[cJx4WE>~Sl$X)!uW`Oa6/6@6v[}ܪ\ɱdF[2wZHSo4 A"l42~y9ey-2#=pW_=zp~n/1;{;:yorC;y@vo yzl;^[N CV$ny\۞xj6@- mZ w{|Ln%omzk{~?o]A>oȐAv૆6Qr}:XVU(?q*(( BpOf~0x4vg ;˻ǾEĦUIe(qvY7 ScP;r/~0`e@~gdJ#}:E6ðuzyt!qUFͽ;5^HSۢI;XUٰ|zoiõ?S$NJ;ox|į^j "(zw<߿!p} \&&~^cHʄy%(M|?: DG=|yㄹ]%rۨ}î;3SdïO/=ʠ{}_ŮNolrjJoa4YQ"ޗ<% v?C>=6ۿwLf1mͻp w:t=|{<{k21)S߿o~ӮR({=-S^ˮ$87Ks%10;matMcyy7xq7Ob}l>unG J"r߬@@<~ݩF\R]ې@;w=[,'ѷ]"y}K1S߱C6iMB'‰;ǧۆ {rNM7N~KtZu;۝(ҥ&ַßMEN>X_kv; 5a$cQLP )S9yZSc%^Qh!B>؃++s0 m|9vDLQuE$^poӧ[|ԶZ &܀#t 1=JS)BẢ]13r4#ltd].BPL`lX;($^P4T9C "$TG嫸ʋQ슬/QF:#$R*S*qm{;p~9Bf?XGČ c?)Hǣqmo}6BI@׻}|gez_Iu=ƌ8{~; ԗդJ8mڙJM@T$E# !.co$袰4Oq83GJTآЛhb%pY%%^*9ҧwki覭d" Haǽ rX2 J6*̈RۂL%)QXOIkJCR-AOIbKZSF9X'h!侒_>3=/ל 5q7(Wڧ8]IYTJ YZ`Qk6)-081ni~f[C5FЙ:R/"K7hLr1*_TYD0pUW}!>#d˅%e9f]yRyn@)*N)*W~5R0e֕[o-4U[sB}>3=/_kjg2q3 qK_0;} r%z&62!5Nl݂hĕk$ λng:(z~i~@tfʤAv)̆%KKz Lr<mi; $\hDϦ2jBRa53! z:ũf4wϧv_uZ_(>%i6@BEV~&&L˥ف3yv뿙o#Zeqt-?_Y)?*]?ƞfaCaS~E֏OK"^c?iQGд_GY)?*yspt-7v_u;/ט#Zeq 9B;?{QK̏=&?Gm7r +5js(ESEC9ÔD2G1@LDw]OK/38VI?ҴuYٛ?7y/agW/|gez_Iu1I?ҴuGOlw %Xl%
b6PQp2#|W5Lv fP*_vesƵ.;.<&ʏC*"ޱ^Bqn8.WzT94yHuM8򜑙Zm65-D܄k7Gv_Z(mlnl9# ӫ^]+q|s]JK 6NB©P`ě1ʵhŝ9Q 3E?}5gOrAKCI";m5@]wq$de* FE5E(Ybv}k?U"4:`F@"<89yT2̎D\"  H^-B@˽URGdlJQ9is*n$% rNIM+o[3tZ!.H{7xjnQXK$@T2V= Z36z(4JhAb굲E]dS3eC짅.ˋݡeI]إ03NJ(y7N*)C2kQ2N9#6M̴IY& ujKVTEUVSsi nBtpԕ7e G9^(9މKT$`fJibLͨJZN ?u&[.P←I p4GpɲXDL J=>;30ѣF 6-4`P$ؖsqs?HaY2+̀FU&@I6CQtJ#%~[S9s >a#,,J6f?wf-7t>0[l, %kK!ZӆkRҎYt13+4D R>Yz ^w@T)sgk ͲzEKUpl 2n܁Z~hdforLVn\>#Lutl WCm\@M90믥LnKii+񥲖ChZrK:PY4 8Ѿʬ W_u4ưY_.яVp:.eSfѹd0Fyʟg:I$31qHܽx1ԼK/jX1XӔtطVrl<85*~sWYӸޕ%ӚY᭵|Sh $fߵ)kXt9 X 吶I˨JYJ.\pM-0,TC2M7i|)3$Վ^))Un]VDNeˇ;F2ar$RRbML#lqx=\%DZ'*P˒豴㶗Zr\IaJfQ rM`2ky& CUoߣ.4Lg/$F5Kǩj[ǯwRYgҍnrk_೻V[^|H; Mp=-3dR.7yrYNr!IB.\JB kB|۝m”Q`% JOC+ɬ1%\m% xæ>y9g9 cepCVɘX^u#v`J:t Yyę=/kUkm2N,0< ./^c[cfonBΪAHvAp邤[SS*Y|?Ĺpq#>۱hC׉C&gxk8pN60d 4j앆R*:MsO &gƶZojC1EY(vlC8X(.ox ZOXe9xe:|WVI̸eVHky%֟eA-li Al8-n؄~z㭲cEʈXMPL<2*RP#,55J&TCbohoׯvt U b=%:JRl (Cc bJ'.4 !8=oKclڷz\²s 1HTS!C=09@M5Dc Ko2[|6wJ"Crԛצ(?@w_{9mۧqYނ* Gʶ.2Jg}hPPL6(́/U'R1Lw˷;!>akWdV'PHi(=j%Q9DyNQ oA 8wmn :mQanq@Vx&"'DIG ȧ)Ԋuw(շΚ%9+),ԂJ C [6 Vb+03DDqA3Pl-|zHJmͥ ^&.uow^f P߻~}zl S!밆;奆"P>OmT1M,;#I{mT{Þ](Sx?/p/t ǿo`=DG}ZZ*|=G{Zayuk0ũFm!R/{;wO*cxO53 >p{teHWg%+U?"Q=w](D<75!yxa+woۿxxtקVjSH!AVAO$k߯Ls97~=k2rz=t'>zTTM^ܮH班;~Ǐ}xàJ :}rtfM./қi6k]-~^xQ(_laGO>w]}(^z<<59@~~LqGnvۻǿYF)1c6~{"`u{t(1 v?{o|[$ ߸o@=]aH3uGpExp۫V!`@mϖ́ۿ{NRÿ}/#Hq߯?=߿cXz7(w{H뤟\i -?R/ $@xC*1M"[Co"mGG!㤊mw8swsum׻2QϢ?f"Zuq7Sh7Nd^=:[T́DD9ۯI6Scx}mJTtwPVܭ7{n{5C|w_PvY'7߯A/~H|h2o=~#SѽONV #RU-퀟dGmvH |FFR|AaSU_lnjZv܌C3l`X;Ph8Hd v7&A/xl#&އ#-pHf o "v CʤEX r"0yUH5Lˤݤp;PMWMS72&@5xjIRcNZ:M2LBym>W\8nu#.Gy]>Bd-H. QIpM۪`5Zn( !DN<͸PxLc d*\t!ݠčSrXD+OQDi1ī ^bfg6|[75kX'B2~Nj~rW(<P-2)/R>UEENFrqa \Ě)FDKC5BHvh&CWA6+B( N8icz4&~3j1l.Si(IGsȢ )/&gqLȋ3B퍺RX C3NSپHn Yr2Yb79Ci1`Ƈ:Kl8im 1vS}}L$͖sNdTЇ iuV[;B֯z2sٚ\Uǖ(k"jq,&d6@(;LtleW(\g; F1nMJ7u=VIђYIc#@-1? *De59, FEosBIU$W)"564dee K4}k2>olX68biZͪQvfNRdO:,iF]g{*ٙoR*\Oq}dYɔd~sRPZNhcdaJq濣 .`3@+W K8VTDnqLLK)p?lv'R=fbQY IEҏ*ddRJ*]z:53.C<i˨>K)5N)O,/qVkp_e\VSe(d-bVkRW\I% 8RZHoKmY8A9c8U6Ih*dLujôWdn^gz 򭍜d<928F96k4QFʑ7+rvU%Nu8{Faҭ>Iov$Oc$WWbȚ8^᳐<20^3x4;+'rI;;(H9k>lEL۵Ew0zv$֠f̿7l":v FBҴ0tea+$4ׅ?ї'+h j3JȖTED!襤Uk)j'>lӐ-dmv,U+H-L3f!$ѡVA(*dnWh a9{ͽ&Cौ)$`JAv"nZivްʤP9~=XW)rQ E>I^G\, ZCi%3yC6LTQ0*g"ETp"EUߠ&t@~wqlcK֤nQfFGa`ꪦfcc9z}zP0(D9*nT2PU!֩Rj ȧ)3& n!Y~_ cRޅ$+IAnVL3g qVQÔ^\h]\ !%kn|];OWRtUR+Ktڼٖ+0Rq3rՍ]&~{5w2Mם(@c ;f9·vʎؑa&Nh{/SV)MFa~;Mmtd:SX %Dfԟsԅ4m2 X[eQY.b_X=ZqRkK#kJ"NG㥑%Aii )JBx$)hS`)$n sR"B]mn0[GJ4Kڲ\kƠk=qeLQ,R &y{O)Vњ8ZSM>""BnV.u8xZd.-F`Y<{+E{56 '7*vziEcX<:nV='sFIy+4g<4iys {\\[-q`F/)d긁mbbbXS%E%}>J`ǶZt] 9m+J'L@bb?] 6~mzw5p0nut6u:Mp!\Pk%k |.g݇|' huxr9sjsǸ{X~]=]f|<~71zxSU>^SͶB7>V-/<&Hk[~t; Q}[#{cwC}|5}G.e>Hkr _o~=k4ie_3KJbboo;Z+Z|;Gn"eP;s7w.}(ol 'o-pnV #7ۻ4jrBl.Sl||W<\Znݺ{$!Ul =O_xmgLpmϒm>`?F5Q2ܪn"&(}^SZaa, >``ݷsNEA oH`e7>קwnZNY p66鷏KOs*w]-M(z5_k^v=qۛs;ut։#):~s(@;if<l~Ht$myr;=Aq[yI&7Xrp8wL;_Ş~bnw|w}Ynx'*^f7O1b?% ,߱MDR}#}kQ4٨_~]<`4jҌ |R??Vr' eY8r<$4ۘ#=MDIR(N_$[eMx%/7|H "CnĻDJ;: XjVj|צkrfhr'#Ƽ3UEH7rTPs&p/!XflN$i)dU{:|)$$.dtQWQM^d*vaTuE{$n V .٤LL5R09RPAJ;z=:s8 iؿ*FC? :B6vt^jҬ"$܋;rlHWLPb6%1D:!A nKё!lC~5@y76R3n!St}W\Ip^o0`̀{0`Ya_ ?9TXR`Bz>_BOѨ ؘ4hF0`4VW TR`jdCw*C(YZGEX!1Lui/-$pEPSq*"v0UEC":2fE~*<ڒ<668aٷ}%7"[uߘ,I4Or%s5H/HE 4]ۮ]- 6BV1"Gti7ȐʥR1 0Jz,Vj" u>ҙ]u߰$^Sy".kUxBCx[37pϐA1zM#%ۤdZLJwE19dPĖ_urƳy1y 4d1̶mHИ!5Quw,ЮB p'5ҷxDw5wREONC݄&%e Yaj#!QzƼ4G.LN} &N^g3Ķ` 67sAV6["F7E2IUch̓C`y{(q+[̚V3(ǔ$cڭ'Gq=I-ֵng/1 WJV G"0}q<9N۫-Qy ^ ;_^j2gy8Snҥ?ſ 7dT ]L2oD&]#ۓ/񍗅8+⫕9K%^>y+Zߴȧ5Py+,KLh%4Q삣GKm(m )NVRB|F8nmnnpU `@6r 0вYO_)[=c72 ݴt׳URҺ8fnr|Kfe\HLafױpm0q2l"=G٫"!VD֬%:ÿXiS3BehYFLy-- ՕJ*ejv]*f-b]-tjI遀YWDP `jv첤5&*R 7}BSiڊ%I)Ze8NdisS >[8P)%7xw֠`cr{w5I`܂y{~SRVx\/62KHw<>W~of+|`_7wI{7.!=?v. PjN Bu*Zp#,'sEZٙ3KMS[Z#P7vZYhg#o n Λj1۝}H ,Rs7Qf[f۬zF٩Ϋ_Ei5&U73uNWMT1*7z#ӖZZ+lLjѺ{-ellzo\;H)Z&-jʐ.-8=emᨤܧR %r8}nvzuZHmo#=\^`";lH^bQ( ;ep8q샶G-!h_b/ץVp>mw^r9Tv@o:N1m9oӇd*;wӿq}uægN[ۑ.RRVF7ۧ/o4XTQ0{;=yKlX۠z{붣&zrpKe ӂ\W9"@~N(Gv뿇P|Br>ڈR}c.^V=Aۘ_\eHJ\x } >ޞ;<E^d{vߤ.a:v0xyuZW/zroN~a~3M\؃o,>$#ag66~9mncӿ` c=vkzGyu\?GѾ5IE ԛW^xi6<gϩ?r w^߿߰|hRL1#Qa_\6k#P86~xl=zyo{ U.v@<gצ0-IS|C{@:AouhAzg@+n =D~Q֟x*8HW"Tǟ^iwTEqDyV6;t}MFpᵱwZI7Ԃw1ڮ'TVWn}ÿYns]7 uþK1ta]-|BwyKJMv;[`w !I䕛unNnCI+8uv^>WӝڅA7@7:}K42ӥvk{;m8j*2҄-J{ۙ=os|+/Dm߭Me@w=~L\D(v7.:Ӣ (C6$@KfǞn71A#HSe@ZO<ۮm˷pn;yZRy|Fc6uOŇOS(uPn:=zxjߟc8a7Xae3iZdyWZQ&mQIU;:HѺlILgTmhѣ^bןץ ~dqݩ[[dS"Ԭڬ#GtKc=%3eH`֎Us#()U ,,(iYmzr$ F[5,],E u FމNtJVŊDT\C4:i>a*bEMbwRi{:лnN \V{g&T8@dl U Cbs "Xw|%ysz}#5 >qNE>U*h1~` >(WɸA_^ CEy2H _FG|²x+T)TIT*T!b1 Qn4_e.X5F)M_BOѨ ؘ4hF0`ѣF?Jz<_l!Z]JR)`vULrr rjX?YP dX#Eȿt robj\Nu:ۖ945᢯[sbڻj/{n$1Yo>WE]YEbDPY`0gK@`(ӏ%c9c\XW](nYDlH+W, VЌܰUy#YÐȱMu#uS!uRM)mn3VjBiWFܮu+P6-kF}+j%XQQIgTЉ)rE ׎iyJXfXC,$_+=KY<q<3e:#F]N+N߲[cW-NH¯~e6+d-ڪ՛:.CBAH9V#ܳ -XiP왿c;{e]eȹƣ4hg Akw"89imWw#Uȳ7:+bp6r*cܱO61gp!I,%ĒSoq7 ZVE %A 8HJvl@6Vg+Bn[p>2!\)..p=n35Vue նHa,LKk%m-iORŸ&^s$>vyb?$d'T{ݾH =w J^J\퓵qFۄ2E2Y8WIJ\ث 9w"TQoxHR~TGjTEY# ^>hY.mG2tCo,Xv}ZG{Cpp\DZT7ۧSclp>ԦJօ(]ZCN\jW4 Zm#n[Ow5 ɒMZe:ǏSpe1]8[ڲS |[q'M 4ladr4+ўAY%zq(7)pl~7P_\6"c6-hd\tA*5lf*t; |i7biZPOUm cz20ujؤ-ViDs+b\&2ϜH;T;rΒn~ [QtP|F(pT_H5+(q40BTʉ^Mb@y`!ui~=_^þw Z*{߇[,k}`?2]Ǘ r~W?7R#VV0 sة)CI}VH7ۘhuyy{;߿v$%~22vЊz.Eɐ &c},JQ"_DCwo:; SyQTޗ\l9.LHeiSmRG X=2Y>5m͆ؕϸN6SpZ祰j=}DULT[CC`(Pz4qcC٬.9Բ;bk #suۛpêzv)'rw]vdS{ R"rT޺`J@Av#G7.qR!C~7\^]5Bl&>{oҳťT )Q709M_(xP쌙F/JJfhC&US2ՉL PɳFuCEfQ0 DݷP12u(wҫ!pjSO[F (P!;=%jv.֧5`x]CVywgQB=(=<;9-({! 1ĂA!-qn$H -$0( 钸~̫ʲfni;dr ۬*$U38'<29jBut~Q,> @YHK$\m۷5=/4Q+LRAK >wJPgF*m1$r P!÷~ ߻E.@T7/h>ۿٷxD\2/a@Dvo1 j8r~l\>~wۧ^h%Z\u()W-i;7?5ᖑ'jQvp cmm禳jIZ662~xe>W8uco[t뿴@79 g[o7۸|D;:Y/)qM(3F p|S*-s#P)OWz={xq67߯0>CۿvOYcmAݷw?@yWst]a߶}&mhJy!H#˟[ܨ|.8 :CnNgFP[76|mA[~yO 7XU0;twۻ_V:]haMi\:s{97dWҡI Jv㚯kg BNmCǻ}ߧo|-IqߜC>}zJPxw뼗,m =@M=7?Ф+Oёo#n?cR }Rrz;XO0*7~/܎%}YD~7l> B;÷vAOWt (7~]A:XDQ}"u\s a~Ӹ}÷/T7C?n7-EX)B{mwﶮ116Ox8.* b ?l;l!mQg}=cYןE4)-4):n #ر5v. 1H߸Ft".;QEJs%6 'l+E:P2eQ7ãX8ڽ5^im+ZJNc2\cX>ARw(Pʭ 'f<9Tp2H@Xy[6Q övͪbq~v*oJ17jb=NRK1A 0;^uT]QAO3BA&(t!P]EiR%QDx{MRC\\iIW;|qǞiR96rK2$@!=UPH*n\#ND ;@ ϊٞW!xϐZth ;,Ю rcE?m4GTZ<P5U?^əRf;MU6ZA\zq -$ZVʔ4e6HN+V|6DP:!-1hQqqh- c%]e(#;^` {@OSm>}?ê?H3W?NO3lb J%6(\qo5 EL@9ma7(r6w^[fx _1ŖmHFRIH#則lHIRC)K7c)J6W1L٨@t=ӿHA.jB%!&1 ";wpYj6<ې* ^Q0wde)USH )opkF\qXE[`$_B\EB acVa.>䆛S6J'{\XW6a㡚.DqADzn==j=,2JKէ2#!(Ɉ:` Q0|c3w1n<1X:xs]dE }Q8uaw;wɲN\HËBѡu$CpAmo.3܇SRP9! u%"/6}!֓}(}=-͡0RVx;Y4C3)*e{)S%&5pmǼBc<1YLPBB6A˲J d6Q7 -x'Q"J& ~`n!onwdVX/+\l>ޅsnWO`#_X.:Auʹ$bI1Mbe~"0UpUDCN!&4RЏWi/iRyG2?>A~ǘQNVKvqwI+!c\JF~U<^3/Hmbİÿ^|~Yua_Mz Dq%̽^|^GR 埦Xfq?ړaBz>_BOѨ 4hF0`ѣF{uYH%o-Xlx; Ǩej3~1U4Į?mۦ@fM1N=9 h_ ӌwfS*xe$|e w#N:lf>M_rʒS ^7􄛏67vئFk.̴ʥ U$xUT1tԂӄ^Xqˈ ddb^vFl0HlX=]CpbVx"70;Ռ3S:^FjE7$onԦ>j 1JHہ-!uV:arOHȱi`44ME솉8cJ8+ c{-RȐ5_v¹cqLLo(FX%8ha- >cɶS5@M͈6qKSj J2H+ dNHVuVTQw<7u7o(1AY bqWcV8;@a%tswUi5Rq\V;9W2PsT-HbʩEavnӦ4훪9v)+~8Ƣ ad+%g{SuTL1 G ORj(W!.1]VdXf>-nb#rvÕ8>F^G`&|Nlu̍dv ^]"HP[Sa>j6>Pd{{m)#.bqݖ꘮TYnt.@,M$ZC`sѧ`Z*!ȫm e۫"e,cI0zDv6ӻo|f,&rMr@VRM87E["moќkR"m$D@)H]1y?{vX0i\}wk]4-d|-pS;EҐM#]#ӯwA;[R=Cq/=jmg/Hj]+b<߆߭i@~<b=G־A!n(/n:ͧGsn{a]ZZ}`a߷28勣VFJXy %Yd\ڐLfE` 'XIXu"J.mk_RmrE6]e)ԄNw-s=[\dyNcyp1zti) kU>6EZ?$*)O\٢<&(u8\Yh׶9%n樳N`nssν^&HEEDF7Q0_G|BWfDrD*!HufVT',\yc(jgK t?*MJME&:IY sENp),.WmqS ~=f0|u=ø8*jvb8E]mAdLRbWL ʪV &xqP+TO;^-!aq-Š:mۤ묲EUSCKEYs_YgzI<ӧ T2Qf8:bz܁mbl&*e K@ʪ9p<`svѣF?hѣF A|nu| %@p^dP-YnxK@MdPN"ZVngHzQuɽx7n:=9~UM+*HR1R},ar7[HbbPM5Tfi&IP1`@*DbKZ.3#Zj*FZRɍP@Z2y)-'GD)9$3iSsY͔ζO>-dJ8)W7 #kp ̭EZ"dJV}W>C-=NX$$[֭StYCydPWi-a*mWʬV~`tsnf4Ï $QGpo \^|^ҏWGBGzzDGpĸ{1s|ibF9g_aK?qu/!_cE+l}ѣF4hѣ 4hXxQ/*9`#(GEb2g0v dk]*JGUmClP2pj5`FWb'”ԛ(6p]6̈CpDZ*>z*!p4d8DcQSF'+OXzewX|kRsu5 T4M!XQfݠ;"Vq!lW) T)A/ ͵nO \+L"1A!)T̛wXh ;39ZA&$WRygOd;xBId$*pN9XU˗.Ue*c**EIjB.PkőkR[ZA? nQ ]Z:]ٮ嬃bswO?Oޞ<$_{ew;uH@k??hߦ>kO'R^$/]P/(9w1>}8wQk.;[{d|`bn孿??SPL6ߠu=>.ɧ(>קI)$J]m#, ;{;=Wc1m}ōX[{ߠ11ha̜'s }eR=,G>=t s%8#ާw׿C]BPyl9n6%>׵Z9t/ox}ȥ6uܦot~0aԽ6}^?"*o#;؜=нm7x>iUK8Ím??/Ӷ7:  GmݦҥWm`߿H/r;cmvXͦĨ(؝of)+WԷ/-BuD7^u/rsvzNj[lASqvDvCmҫ?*N6ZEcxiMMZ%(ȚdF6g r" a8uHeB7pm x)Ē(@$'yue2;ϼzk]yH m~t7_R?ÿVxro =;4ǍXp\ %{t UU0  %~QYN: ;aHXsDs\mĝv:Bz*'LH0u-&ŘxHrBǕ7be5EcoymZ:\4UcD@(cJRq1~ICqJ!,'=%mCplQ_g[QEQ+ "M䬈(gN@ C0?/ GqdǑV]I|Ʃo[q];eihʔBS7dܜsJR)J(lwڂ3F`6[7i7 ؏-:y_ ÒTΕ?jFnJdctfCY*eT":@ ˣՙlH)\UY9L\M.x|v/b )4Y6)"*ii9wBR̛kzAW̓<|Pug13vR~@* K:G@Ki)H*za(ѭi()OSoa ?hѣHƁx0sG1sog#ΤuiFC{˸~8ԓ?iԬ6kr*Xp>`p}}m6 4h5 ?&g V?ĔnI?Atn0f ;bq0.۲@g |fGٷeBřr 9/EvrW+,(Ƴ]B. py;]\_ 챸I ZQqmx)&dtqf[X.MܝcGvJŒU\3A'U*)pwC_{٫/MȐoIfw7݈S/X&x c?'l=s^I弑 %-W3U y*eI[Ld3#IRl#nᥘQ)aHqfH}mוˊJ}-/KdZK Om5t$yJAW/sQcICW"o7Q)9Uȉf"`07 ǯ_Aq7nRU# kIAT7ؠ^||AjS  ^P{Cg{@9βbTǧij4tjM]]y帧RĦQ\#EַN)]ۓl;sE`D4PA&;`PQjʎ33q%E*Ce'.OT!8 G *,TCM^^`x꠼a1T*,"τrD}Z)eٱT6+7֍eb 5*$R/'$dL^ʯ?Tw vUa]2MBߎN6 d䧠th4T6X)@{(U>}-`4lAkJcov 4k 4hу4`0]IDu79įkϋ[\?B_&g?LT!7qH_hЅޟ폣E{j=&3F0`ѣF4hѣ 4hCzMZ[D^啍/D,)C}D6eQY'+#Qg2vjkSLXz60K(EH$@G^4@}2e6\*/B.h0xD8YuF*;1)4 W6'ѫ$%Ө5F0*rn&ɐ^mFH*a2)~VL8ΖI;eT`7u9`ثd Dm5uٻwƘ:I"qh/)@;M2wx/5wmli4֩q#Fa:Za*)ߩ,pyWV,r?f%專y^ʠNMm>^c,:_w ?O{jl_ZpVW ߟMA۔}r v_?=e/H -o9 eY:>{:þwpm vW99y\40o E ߸toi"&1W"LWD(wLpGNz 9PRQmAّФ= Dž]3 ' ~|-ςU #ݶ|:.ui!O KD80wwWD8yu(uH qh}0myr_z;xx8(:ۭ7Ow^5"0o_$_v/wev_8 Ƀ큰 Uda2]0ݎzӕY›þ;tm_UhS>?vQyko񵾯RYw?k$)Ϡ:~l=`1Dpg g=GoQ~mѾ>(?tm~Gź w?m]#,EEܯys}C !-+Q^ֶkkmA&ۛ~w|ԧKF/Z~ayy3)bydKf0k^QQ!ZQb$&@8 t+̋۶<ɶ-=` CP[y˧",7ӿm:[sE`%XIe?\b&.CWVAE9rCsIvH(9PgsrwnD[L̽>W\J.F?X5r"֤#b@!!I6X}+ $vUNćVXcfPGL9La7(KS1FJD}k498u֚") & 747,W7f!sǥZP!VVR2{q_GA'VlWKU M+֦+rRůOKE֘u]fy!m~"b:-}, n$숪gTxRULې뎦J mKMa|QKg(8cg;원+Q 6H)D:! d9e}ej/" Gu]tSK>Q ]7H)(S`ȪQ)GaC˘+!@DD60y>?sqf:JG2T,qU mh/! i`2pY/a I!JPIFhB #V/ݢ ̙01:`>f6K?4(թ$z?4(թ$z]mgJ~doщX1\%Ƭ`"gW.XnjĎSM$"N+ t"j!D=ڒ=7llVSbehѨ|4hуj_d뛞JR.c$MTAI|>'|N 4[KhJ x9΃\srA> !:!gM|^?7NӑW|VXnܩ]-Pk夗 {SEE?m" y]'ʧU9 D Ϻ!ߡݍ(B֤RʔjQRG; c +;)Un2XpI2;#*a!œUеd 8NwG Ty!%'o=pddV)F*^LAAq TN*,`3lT̺(Sd%)J.dT7fS&#FI[cS옇:}}CT_=vWӤJ3/-q(K^lt-kUŝiÉ„w#tsZ;(Rn=$)h&R$iK@9zoH[v5n|=Op᭭h {wo_GQQY67**êoc~CЃaorHҤNR!{yw^;kcmUrm|m.k/gA߬q% m>~?f_sk;Q}>^{DJ˥[焜l%̥xB'NtP/GhwͥUH FA!OnM+*sVn2nPPg=m}:H"$xtߦ6)M_o=VdR!!uQL]mS}RmpͶ-kFѢ>;o79 8m6hw_l|0j:WquxYB-xUbb }in6䳖]TW|.*.=#:|Edś6ɀӧJt(4 ky5&5RBHbլĔ).cQ/L8BM ϓ;,GoױHoХR+?/&XQ$4C!,g Wlu5!Yf;RJaj!ԓ:B5[rn.TrPʋJR !VP:7Z굚ci 1Am%aYlZJw :)LTt,IahO?ǭJrHnAGiG{{|-tƶ/BlA^Q䅒$%^n'\Yw:vÀ9W œXI!%coIW,$@؁zӰ4ͨ9fHl̛UܖXb[s͋nQ3MN)W\nԏy)_kbi}o>x0qyANDlxWcQ%6IԪq,U1$ô6\(AoXԲ^ΙN??h:| cJU~WZ׃Y_L蹿Qe׿XԲ^S@Ch=XRՏ?e+1K%$K%$)Տ?e+=XRу }7|LBHw\m)s_r3P96Jrr/Eܦpwxm3;p0*s&11s++cӿ?8lVSbdhѨ|4hуa~o|>B3ɊдL5g(VW燳c̫zKSreuQpnX,eHDϰUV$(v:+ rCnf:&=d{Dc ɛdCqlh!Ku&Ca4rQeASm!. (J@}V9.MYӋy1aMYu̗q{] AF6X89l , ]E?ƱnP"RAŁ=6(6W$l6/gQ̙/uOpRA6KF tvEe!(mk gy 4h֌(`ѣF4hѣ 4hF0azD_q/eV4׿cG^~(\Kks|1wgR ;?ixAG#{YBz>~CޟѨ ؘ4hF0`ѣF5x{W/^.VYӧ.*(7l3,*q&)ꪡd1 R볨""~7RѵPHcTۨ`@.-}&bp4g}:avlISCI {m;n8BWO<=2kHfu\$8y5Π\iExHy&(sTR%"J{buLyCn07"(qCqy밒"& =;6oOR驇v[ XlN)r|!h˔5`C`s7ͪ,LђT y7oonvbheZT"Vs+yK$w%ФE"upJRRZNW-HVGy[&r9[a/sAm>Pk쫂]H?'n]`rB۔?|3n ˷^RcF}8jˆٱ6 8^'hmlRE=$sm|G|r#P<<+`dygiΐ}o~㿇mj×n!w_]m//M;}<IHU9L^{6cU|/U׹Ia ?f5I T2)@6>>ZnB [r}vxۭk*EWo0 G}~x%b{+sFgd :{ X@SV|H@>Q`TH+47R"ֵ{9|i)R*[ahy$ FtWb2?9J$%/v-b b*5{H(PlQ#vqё&mPL ٺi !uM:*# jq,>ڎby oX ݿ:qGoD>nWSpgo>ZPef*9x49"pz<#^թlylZUO.@z{ջ٭qa`Āf *(#"< 0v=v CsCD K1DGIX 6#ii*ʾMIxʶpUe5E]K$DvI'z řo5}$Ez&+i6*k[(a)%Q1Hb B1L8+l(*W`!7 &.Ԁo}%).ᕲud D>Z'AǷTȳMeK9űnͅl,tyFMLVm/[wt@@1ƪ7(X"!jm'CpԱ_r-Pi E~F a®Db_our6],D "nM}5;<Lˤ~ӡL@ aA?TnqzyӔ2 -EC+42ѪZF},`9su=T PC9%stWJw;0ITW HL&̭BP$tG##&qLƩw8y^02srstb*o?OLuc sw=76HsrQ]=X+$WJ6MdY4UL\#خa\s&o-:ΎbNjw2kp1'zTlVzTmUZ=tRBz}KO"{[^kUͳ//SYLc**$TiQG}&c<#:l)-U"! CkN c,֛8fC~<6Y@Kkb5L{ZNGt2C]X9_OghV?OZ/ՏzO3n]1+B8=p+XDmGwþI\%jUNVͷ5vм]-Y%kpͫiQ84;jU,a NAb<`^n(=:`M]cVnpu2%AqDSdEu< .Fum6؋oz濲&4WO$ٴ"PB̛!TyOy9ʞxϲˁE0nb˻N (_ނؙyDC;r 28G^Ԩݖ<^үXI̍y}xOӇ0X1N?%SlL)JNrni+ r{}t󱗠[K!\_7\[kSΑrw7 uK ;,|8( cW1&U=NvRa:ާdf9́GNkri}V?ӕ//!9;GOP9ؤ?ITA}_Z@BSHkgqoDTk\nr.0hG`͙$:'oƥ\& Y+qDƦI-=fbG ݿp-__5MI4̒Dv{JMob2+~]lQ*S\3<'i9=ؤIT1CLxb%S@W  7Te2B'X9ԊdY8F2#nn:Ȩt9C;2#9R=ldlN+֔,]crHE8BK7#sVaL)JG~S4_^CN3G=d?_OUz?{Ǐ|)RU? Pb,SMLQ3rzJ 2>ZJA|s~)&TlfnԫBTJ}ҥZ5y|B5Jmax Se`SELȼIrSMbJOO=ߣ{ |c|zϕ//!?X9!撫sߦC%WWBz Cgx8ԲT5}eWwV>=ZYJxoY V# pqঈ:RHn=:z@' jVI6#yG|1Y~*my5~_M?]6|2i*=cǾ{)*(t^]>?6_/ d3\[Uvo/{(Uoa?IUU}Ϧ<ñO^*ӻ%r_\?O&G^?UſY'kF(Uo}}+߰ǍJUۛ3Nn/3ڽl,\/$舻nrAa".ZJ!K7SdJ!8(Kpmt+~ɹIa7F8QѣF4hѣ 4h^ce-Xs*҆{xFcREP;jskVFK䁻xrQ]~`o'R`\ïE*3[3gW5JIj+mDc~Q&P)rd" x񓮏dK}jX26;lٷcȾry~Z"{5mFEEhBh6'bR<_V 6Z JVxƚTPۿ2ɦḔzӿqwm4E|e#W:!K nFfzSk_y42:yӿV8oG8\8pEy8bf D4m5"D"%p}JLZg)#[ٴ@v*Ŷxn܎m[@fbMDHDB1#YWLB=ǃ,xOd6Ul}[k$ͬycL &7m3epbDs9V6J UvCt&\mȮpʺ%: ?d3m] q**hui[MC"ĸHQ6 ;'qb0$ۼ]S`2}:r~ݰvݦ.EG"Sn=?? ѶCQmPi b!o.# ;5WW#lYJ67'[ >ոPQq.7ܶ<^ߦ8w;uۇOgxJje/vt{};￘`-sYS}ۨw{7 z`˗` >?7ӁHaB{r:>wp- ;rXώ/ ~k;oçy4Dw{||5ƴC{Bw>gx3^GRy{:4_k[,nneD;>Ξu o||<OoMk/& ?l};٭"Rx9L<;wȖ <~/3R ۿ˻}#{U~7лm:y0LG|~˿g]N"JE0&IE8I$"u1TS ~P:QL ﵉ko;R:t>^]:x3 b VqF4ubܥShA,ki۶~cӷ"(s Z똲)Hjf@.OQL%uEDqir:*=\Ý\˔#)6Q-Ҥ~΢,9k5&I !JBe>lAE.8}Sة(RVڈF>@W`ѣFxߏŸpov}0ڛNAO7MAvM0I<οh1G^4k3tr.$n"nl1 - ((u1[$.Tg" CY#X'[tΥ*2ݳď&wڦ"l;%?"l~'ݨk[ϟuYQdU|y lQ3Kl}GǿD1Z`Vדf$$k짻ms&m6Xf\Ӧf_AB9\c8XvNܺpx`(u!EL!]~,ǖ(c::L5+xv͂":1Itùɓ:Ew;NjWY㈢WtʴW,d%PwR(%>F+4'U*}|r2ܫ;2o1?d4=%.wc`=T"[WdKĸIda\k4-cje\ˬr(r5YRbʼ1LWt}f\ "k]Ƌv[1V'b+{S풵#''1 fs(D(2v !3OW 9!]DNpU4$x{-̢Dd! 졥eq#'<\nW%[U]O[YCEzhу/ú5.3{wF|=wW> ~4~@ wthQ`!ޏ[YCwhy"Q/7QG{֟/G|"cF2) !=*{=th M4`FdR< q$ S*ٱRaFdP~ DD}J*qd\1hC mהwwP;2}Mb]~Q(* z0bɔ xThpv'7nCoٚ" ihN[u>۸M`a^u=Јo+$LLv᳕P,7|t␰tv?J{{|DǻZN֞ݿrY:MI>$|xXېǸa6+Ca^sۖUFh-QF[y]Y[;,\FF*ɦ.SU le=*VsM"^,sG+:ԝv0%F̴JfR"L-Ub`*pNe Pm h̞D)27Kz>|N&(l9wn0BIZ8)Ack"r+K gmTY]>-R:r(D5Zn{+dǫHtz?=ݺtO??,h>~dΜ&mOXzb1K.pQD jJЕa]C 퉞X2AݤuiES6_g#"֬D*,I5XUQrO%S!h9QVi&(j4( ="[$<"IuH^VG~ x!Lj]GTi{=^"zN:7ftAIWs3I!9u)Us[w =SD(>b=n=OU @X|~.>6j߸^.ӧń[o\ZCktvx FcCC75ޝo!."w|:x_/ ;׿['z܉ܡa_/!>`YC&< vt7>o*(2-S] mLn<<|4r;ph P2 mZ5ѣ 4hF0`ѣFjq60ìSb-6bU9V_b1O اzTk$tMRb C ={m}`e1ĢhG=+ 7jV*]Mw7bV:NI- )`0)nB6{tY(ʋ 'MrX޻vLUN!Ƶ^ܒ%>[n|.q~j5Har4p<(!!lI.\{r]| }}&6U3n0l ٿN_]7ɌDܛm;~6nD:oQm{ 7MWo|X:a.4+mc.G+vU}P`t ~7oyopH\.l"=NZˡ:Pe>{o˦DvSmH>|/xQeoGܬp7}wi04(oڔ~okpvw>aӧ}>8o|>p~oק^@/o^?v8]JX >n72.-`$tI眐L@b#TL_{!uzZICTpz14KTFEEǠVزhJ-D!R@&H<%:m$nM[㲔ӓe< YBIbwP-ZX?pmF<0F1S oF_ݣSiȟ ݿ:0a:[7H_" |/0 X+!%5۩[b.$;e#$%# 䲇%.feN3ԂE.&ȗG-e݊)alx+""vLaXx;վ2rw]-L<¯.ɛi#t9&Kv.Z<`l]Zz2s\8oE&2J-24ݠfnXQWV1HIWq"YZwEÆGJ/t]Ҿ&A#qȨ}٦|M5{ jrBFIV0ՕTZHMvKuW&kL1 *QFFv%c,z8w`4F ;ä(LQҢ-b]v[+z\,)HYIM H63xrj r:ȃ;.KOTU.LdEm F.` ZdϨ Ӗ7L!M:i__|JzcQ^rԡ$ge|+]ARzܓhL:NUUF*A΋?,ۚ=E6pڶ eTK&K3wHjm^r-͒n9H6.5op ٢WV#9]"+ju:E7P5l͘{};D4/4Y0+c1)vc>&سMɀ4V:*8i+E,N2 K08uzTQ" װ%mF6mhJǥ$sYپQvzً$"ͪJ_?Ql3O-i}p} OTǩr#e*uZ@qpp>&RH})?o_ǎ#]'zGǎ#]'zIôI#?|Li8t 8t 0>&RH})?o_ǎ#GE-A>A3V1y #@ܻD"(l}ĎEQRqCb*H&G[նTkUΐ}+ыԡ\7d]89䒣Q 'N=HP3'`B qLH!*mQ怜͋^ARDG T?eNґpqJ̝\Eۧg,hi n·Lal[Jds-֟Ƿ9*1ʧn]0n^صjnH `)P=F CgO!dF!p4^=$P~=DWQу8q-]޷ʇ?2Z>Y=٭jw[M~*w(rYJ^Ȼ :r2GHlS7]kwmٮ0J,T5 w$:czǁ1hh(˹4@h!➼tꕋD$Yf3O1sÿvƆEO"-]BG r4aEbW.eܝH-Gc ` @Ohl& ZىDZeʳE$@ȧG=W+~6$IƬYIӊF[i=)hqJK;`JVqr>,*9.ŝIpVFTHade]h' Hhl$|K0~6&QsZI eI >C)D)̬NH8;Y(ɉ36 [1Q蠛XtUlu̡d&~Dʺ " T$-DU@'_+Rg4ćuB٥2nI\4ߒU Xgh$5& ʎ%R/m;kߜVn8h\ =0qI?2cq?l1.*ca?OmkG{c##޿qH{oIкQ?j~0F0hѣF 4hу4`F0k)) ^Yh踶.䤤,FG@nF25 ɒh nq-kc8{)IQyWUq1B2dlE.jP# tQ `4017|wQ%^S&'}~ݶ?4iȑL!=u=uy- :f# tKMs梳u8*B;NmR \f&&#w)?1z~|:DNl@8w_~ç Hq0mpw5SsiU،oq67幎;E~M3k䶜2 Hk{Xo 5@T@.m6 9`Tq 1<7jJ {:Ҩ6Q*{ o~|wn;*ܯ݊ y:nmwmvR8(v=D<7ݮp,:;Ͱ=o ݇lltۧӯ،!oݰOQ鰏v%-}`:yǮ,="~|Cw#Ѵ('P.0 l vpi8|v=wmlĚ6#~RE_opo5`^~ߡ{&l@(tJ B?|~jR&S!=6ukõܭә?`;߷t;l*iEP~g8i'b7IfiK!DO A$eEy@G2"$*mJ fykp7VYӷU~ϳ4&DH([YǎEƵ{(5/ׂ|=HZdc%/5Kޭn$tª o (ֿ Sx(ZE(/̠[C29UkE=}+غokmH agc-? 8dE5$eOM9L̂HpH7"(ѥ^?hKiJ!)JE`ml4hьhѣF ~Oxtnфp~877[aF pDB=oqml[?N׿yߒj5?>AWۤH+CJ;IE55v&49AgnΜP1@MTMV|gb?ԂMRZWnHdF.ÕQFIQF)'Jmԭ>lI?v 8̯|ab%V,DüA%QI}MrȢq_If.l|kVekw0hPUNucW;`QDg6,JxvJv %ü0Tl Tg>4RC62IUP-;8Ja E5^릒k<[XVrDz/ȒB)2 Z/6VkV-#@_ȸB9YtyصffOA^z,&\SVe*n֮x`i%M)yktmdVzC֎Ѫq{ mVBHlu!9" ΚO_2OW2¸Qk0WV)ɲ~KVdk,j)>Z 5Qݞ.r:˱fLyRPf-􀇞תȻ4+Y@c~4u!.RֆVQF _ZtzN29'q~=Hg`(c99L(v,b#<ո$ C*6gYaWLB;C)P7[rCtn??ApyyINۜ ܭ间B۔if^nnPR7iG틤-N!FU )e7 󁹇n]G?sq..ӵ_t/mާ/i݇?{O^rOⰪaPp@QLb&A.˸tn??A1DSOA$uF)70?h`ܼÿ:j%P:g*?ybt@w 7qD:?V:VjMdΒt(@o!f#Ѹt`XzH}Y']$u]DOQу8/u=Pp'_G'{5No~>J~Gѣ[q娖Ⳉ۾>dxOi|S)I$v ߶z@6t_LyVg)B]寍ͧ=-JZOKc B9 4sXRa!ԩ$ iZmjORD[2vQ~$GZ6_{9Rva*1\ Je׬=˶Jv&s]FRCIrfoGP)sM6"|-KU(g7%"qMw$Ƌf3ufe]FUد*c/*ᴂqҡ_З<{?|&<{ǔ7Go pk_= W-o×Yf.PYؚ8]Dors2"Fr16ܥ|fbǬ]& h\wH8G?êuq>qOIwqU mT}kB?{܏aF06OچF06Oچߌ0hѣF 4hу4`F0hѣF cf6GU'! syۈZlR=˺=NJCbm1E昘U1Q#ZTD0x' xwޮcZ <="@0DCw@' #JJ"? `;lypmns刾Dp<{qЂi ! xo}{7G}&*@ll;%נ=e6w `(DN||~=j@$߼6۠t'_xoߦK+O,ED,|ȱGj3\ P(4[rL]oYɏ(|/?? "'{Ci,FKD㷖~㯋Le7<xIXz~9a]3&ַO|/<(o,%)DQnsEb,M[{pbqͱIH80hK::m#X& 4}g2N|ՌE272 ldJ6&1(NM⨵f2ތFJ!&È{CbdK/nnOFTȫ:DH^1R{f|9 Mcz;0EW{Msp}a啨s@S4 6&ŦM{ cws= bŢtט.}2 ($fjlƣ˄b*l*QdXwi)JRTug$F j,f !$rbz 4ktѣF4hѣ?'Cb?Xmv8 >zq}m_ jm0U>O@z~TC |[O#yߧ̍X[5>I ѬM,K'fjr#7v]$Uyؔt@DڥjAԜV{;I {S+4DSC3$:o.a9UnIM6-cg=0INJ#`g$~A@l&ߞ sŜ pd+KgP@a E$VU$>%p'I-dyI2#6&;Qhߍf.$ksU%oLQ)Th,?,GRJI>^w|U$!1FYhYnalB(+ &kw6̣/ )Ҥ$N%gRVUQ - qQQ JIV'k OՃ<~TBt;V~穮UD"۫82Kn՜QJvF?՜~͉DfcW4"dZIxÄu~5,s !gx\TQpK¹|ɬbӫkX rUeZ.G)dKGW7RPkq _fayaLo2- j+تӉyؕ{YH3#TTI2%q ABzZmhU͹#?iJHu ƍ;l޽CE{J9_ddS@E;w:Z@\MMKc;v-ڞ),Eo~$9]L<ϼ;t?JSE @yJmo cs?w+OǣN<ح?ΞC~Z$9]?w+Oǭ3!t?$9]?w+Oǭ3!t?$9]5P~ wpUlԫ$IDHKBb%at? pF EgO';YD_C/m~H>j\}$sMDgO@=)v;hx*Ow?.]hu? P֏?.oZVfW0hѣ[q 4hF0`ѣFaޒT>\4qkl:Oؘ;XO?+/*ccSZ_,w`Q>d5wԟ 4hу4`F0hѣF 4hу~U䏤A*~f|0U0)2EUؘPf)J"%B;^*6gI.AA;M)<1znI]+Α5t:!5_ ⛥:SZ7o6*-J;uw@V)Q0s}=|r@M?Bwϭ9\ =GM}}.eP;C&P*R_H@b ?ۦu^s\O{;tګ*>@:A0@=yijz$)@b;ow *;[oͩTz=|n97_ Y@<}ṳsmCwpZ(}ק}Ӫp"㿼L~@sD27˧_ua ۠wټ~f&۟~=J ?lx{Gtkaq7.l$HA6;/3PX~o/cLFL?Y{n[\c0G& (ZQȃF**dSp|Pm|[pkDF8:gHS((HQjK<c5vkňS^LY'l,݉}\HZx Qkg&uYd)H1E`6Iw62FJɕ%=ĉGI׹](U/Fߣ+I4Rퟭq(yATLR$J-&nHP$)LGJ@p{4rxw}5Lg]q]V:řR5 )b3) \ZQԵ( X 4hּvѣF4hѣ 4hŸpov}0ڛNAO7MAvM 7Ɉ ÈLXDa Dv-lpۻa7~]=5Tw5?ZMAw1q3T?YYDʳo뭄vb7 $.اUӵ@H9I/n?vwGLV:NFa7q"W:b"V^!0=icgLVQbYd5U霩0ܒ%|Yo-HoɛBhLS2ږnT8 Qp%il_$[PH>Ҷob $}*$[pF)ɵ=ww!?^)Z^%`L.u"'d#E>9#IQb* -ᦫ-],V("IHGa2-ƩI"lQ#:nړm6vƍZ "E3(fn,8Lp^t8bq]JpcnZ"0 w-.TvEc&񟭋PISdOQY7R~.D(謹` F`#$=L!UӞ:]V}j>l3g)'NՔ̚u9:fh%E""gr|9"В 3lɴi|5j,!h4q~ϻvQ;wMHNeJ\./܏ u1|ګ\]QJUnVHwLB~Q$=#XdqvR!^,qWEZML"%dUj)-2fĻY,;Q:+s0CBpyy2sU4hԠ# gB9I;i$IE˸bL=qHSג& -~HE6Mob7 (;KvA?z|LaSsoM~F v.?H'/G1OͿ4|LaSsoM1\ `  8"y:?1LmSLSM|NF3#^>Tp5阪 `+b: `׼@kY>3OR"kYQu`泥-Pp7'CZ>[=ӹo2~5˷;֧y7Uߨ~ѣF 4hу4`F0}%=_Y5Sl1j,A6?e5GQϰz"'B#tOh]du`ѣF4hѣ 4hF0`ѣF5C.cS)KozjUNr^]dPSv#  qP.c cU# _%C vvEtż$b02 .r#Hjgg&YƉ!he>ɶ5<(۸mAܓDoCٿ3~oyt Z.rw9b;3~]|އh`A(]}ϭCpkJhܻ{ǻ[SOCiYNAEEM)'}D o7Fk(/]/pdHRnt_N@%鰆~# 2TuW,֫LJ\T۳d؇T`* *8Y$Hc4 Zt)IQV>xF -BqjCMSR[ۖ8MHM@=^V^+ 7{xxc"ٲܼ0c!qk$k,Ɋn%'t;GGW@f:28EJyQMz*c%'0Tf{WDW"ABŴAdLS&A6MSIfȦ"H!C`(uŤ뛥jI(nw~˾i&Q"_ li IupexjaJNNxW|!bI +5vFr& Ղ4r˰) +7fѹAkVq6 (kY̓ ;Yn1\?Y?hpfHτ^_zhEǯ?WjDZ>1\?Y?h3W>{Q#֏WjDZ0aLEǯ渖tYUT'0 u9ya) "_ߦ+5{G޴`wzH?@}?гj"At{kTGԼJ[:e;_fWE^&oh5#wOd@";!Ψ/mj8hmӻbo֍eg`'oɑö_X4C͘Aèv;8uas%90 ,w6ff$&\E.:5-\;9l"{ASN=؆+8yyy?>G]ѪQ}O8b?_>{ |/S|o|1uyS!<s)ǿ_#//384~߰b5J/WϩCGyS!G^^gpiO珑aś=%AWZ85SlHn??鿘~=nK}~%R[7 Ҹ-&o*#3TeB2%¶:`P(2g&,.7~ d# A -U{j'kZqwkǧN<5 L>]w5`ѣF4hѣ 4hF0`ѣF5V`5ڝ*>vgؠZ6fmұr UM'\.eR]ʤp{FA F#pw#yzWy;l?bW<*Zw;4^ʶ\E:bDa#"lq鶑py_!aS~fc^V* Ng景3?bZ=A7Ld$pG(]n $U3D97WRfxlI?WXvG$&uUOm[M7[hfc% 4EFmk ,\:)`S]CqJpB Zn@pIl[ǚ* pp.Q( DTq>yK(dc+u[L(fdncu('踤j=;f69 wH5 ܝR$7Ra߳qD}LMVXG(u۝"#pD{,%Y$M%{UTb*sp?Ʈd#d5 Qɑ8luTǭ]ļhź͕^8q : 4Tz+&S/ܸnOT8Qw"t .ʦHCmF-QٗH 癱-Ī(0t$.j]$T"WMnFEH6Hmr B8k^|E/K0Ôd`NAGJtoPP`LoQ$0#r>gnmʑԫN-{VUUT[c,B(;$4u~!rT72NH ,RTkK JWLuJ*P ^S-f:]HC M+3A.*]44pv?f(WI&xk7Py꽞>ق'p.P$̑Hv]Pu$2(e𑆚,qTLYm0bq1Ҫ+$̨dc$(D~3&߬Hgv(PP"PjSns1lXZ2rƾwoj]`VGz%YXԲ,oeDnxG$c&39'YIJ%X>%&Ld "gEBj q[7 h8 <;Scc,p22#oC1xIÍo) \]TkXEBȴh.!f60bGi % q"s&3ȴUbP9ZB-2JPh˝bf"s2b<"ͯ,ջvPod$--izwyԌ;#PrYU#wI #1v8G5t|U=d=U3q3\{z LpS_">4&7K?j5}&]Nk(ݳxePEEQESQ$%!D1PQiyuI) 𱵼z~>8(g4Dj].$Zz9FJB(8U2ZT=ՏR (8}M^+,KU1egudbŻ4|C%%MR8]Dݏ`1Z ID0]RAU0ZE"B &;rcA3E_U#(v3PF7n2zeƷg!Sf 4I""BX.qȷHc/Ž(YqP#0ƆFT\#U@"ڎp I b}J k [rv-52O"N1~z$d%Rul䍒tT+.Ig8` UejQ̣dfwbhJ\~c%^N0\HRhS,۴VUdqƪ)&7PpιL]$BO=Isr1#lCv 6nRd+pELKkSSGa0rⲝ)&-v9Z2i O,f")|Z1YT-îR{9WušQ;UT]]\$\`#=H "Homzo[mۦwmqQ.5o pFn(,xլ,D@pQ*Jr$FvVBcI=Θ@""?s#-G)FO=@}}~m6#xh̭o*7@b`:D0 ^^mw0~?LKnQně/yknx1.8uS[0"ta>o2=>d_净0` o2o2=>eWGE0` o2o2=>eWGE0` o2o2=>eWGE0` %i,J !op~|7pZAAJ!ȑ۔a- d"5)~p}@!JB6 ~hу4`F0hѣF 4hу4`F0hѣ_߃6 5`ۯ4`F0hѣF 4hу4`F0hѣF 4hу R%}ȤrbvӻF10tDx)a 0ll''A[euedWѷoG]!?q6P8RҢGz1Iݢl#pA [e`;F.x LCCv.1!y* AMA $K\Xr &0fa4:Q8gweG=`'oI>$PBs._B0;8@&_E~ۜ\3#GL'Fu\KQOH5vy7]p7a0-#f\˔*vqfMzF#X.Y7eCzM{uЍC6g(HΆ*& R{: JSS4,1v"6.<HO >Rcco{[ъnj ,0JKj<^XX(C;޹g\>rb يص大 gEP)Gt}4/I{ 8y{|nA .}MX4 =$gqwnpúo҂RG6ӞaiQC6 P"@)%phÊ; iH2ݜ(+=? Ws~BpJxyN/mӒ_Gz9K JԊr }9lS1xx.lq!bhMu}_ UKw ўI p^{5}p{g >ȴJdvod̼m1c $}fHc6EńqFgo򇟚uаdgl^9)r! qO>w]ئ]SXtl@ 膏éz*$7wxt8y!EF<0.W,0*,{7QB0n:Z{{v`r[ʟ{ܾej5J’5;ucЊؕ[|y{\lD'EqwITX `gUz&Fw 3pOL@T}I1ίg W9yz wyv5wdgNSu2=urd'{t֣~eQBH=ԓț:~em>_ZwV%/*~g=1^:8WN:PP4gÚBL=,"22V+Hdm([x[*-=n{۟%;m̕R"ߠd}-]3FPC ZOڷӸFu^췬,W$ J0Q< +&屡 Ik4gkW30#xJ!Λml\vИ nq9:Z00pR"Y[i+~ޗepLyO֬|w^[yMGNZ"<ݗ]feD0$ڇ Z3rL7'@5cN]n5 xBX(A lxt5Ƅs3^ Le2Ad M UW#261fYVQM1x/50 J:ջ~hT0㶁=]pS,m. 3;vLm$;rP~Uh7kOvm<3 wk )iN6g"(P\T$Lަ^/ qW|uyc+).x/ T:.E;"D,0d,㩫mXTS?2pXCF&uMkŵ#q&7 vҧ_0n=Z;FJNV]GL'6 tmo5}_m>*cťȵnGD99iyM>+_8w+pjrnih_Z8PnFk=iJz4~n]-Y3L,L]yPp29$ p7()sR@%QFdPV{v _aokd@r㻇OHXu8&8U2Y~40? M"w _uC#;m/ʩ5U8뭪eSCV.=둧'}uz.3s;IڌOƮzw:%A!@˽x<ό0)a##tNag:mPIZDo,`ǪrG 8^ˀDb(=z-jϊiӎ’Dh˺EJ8S"LElՒP B&NJ^9qք#Zy=[=Gm]T1KjYGŕV3cYz} FwI檽oKL]PAVx<Z:6pUx|ҚlumkQ"5DPAD)>ib!.eb ,jყٓ{#=[1Na!K ܵ5VDEK JΖ3>D-?ݯ2&:9ǷV龈3gL`DF\#VyӡC9gٷe`pׅ֙-@MYɀ㈵/sc3xLB <"z$Ҷ5QA1}L#JJJTd:@pC^y~<̖>v̫ܨ6Oi[<mܢ6zTGW.>;}Q٥o{}e-7zX D)K~KԽ?5?L2?=j#M0]> `0`p @Ze(C!i1g*=7DiO,z'G,qV G}9g5 Da~h+2\K(N9a 2Ғ*1""tIrpc$)pCʩ3`ds&y"qs%bDx8Iڡdzk1t~\f*UU@ׯw{<ޅZ Kt'$1& HiDyO>(/c2b/w"Ӱ$2(mj[2/ZS 4o^~Am;ػoqB :c-}PKZoeJUh;>8M2*=h[ ?4a|BĤH۠ai}Z9g (=` t_MQ ,aÍXj^ØL*+,>>Ic< <&H> Ͱ>z"7a⾋YZMiG7@?zѷz>zǂWg?~g3>|7dcH#ߑmIKxOHW]$?~WcsG~2xlã#'CeF0G$&XcV&J7(PVv#\ )r * R8u:tMt}3|?oY?4€j ck%%5=|_bLյ*<,M8 I)\_]2ۈ) Tr6Iy TB ߣODK#Ė 庯s>?P}[uJ:PYR'rFO1c"#&&U ,HaAu9Px8>JpPUkWRk+Kjܼh2 g 0Ǎ*?ʚRPBqHsQ9W9fdMC)ٲwՋb_8spXm60ሹ1\$ˈ LZ6"(pE=gz R޳*wwaOX}ب^.<|RʹvpQ&3G~v,ttAZ.(Yj @@kih՚7tL׋o7U N=myq5h{MuP"sO0z[j]G JFPӕ9ϼ)ЙyltB|6'@ⳖFIF{ND83cBi~ ^QDRA`|@ ע@ "A(0&(2&"y[(D*|r1J!RƉ2J)D"`bUesjk}euU'QhTR K jKs4FǀFs@8_6gטy6c'oH]h}aj~Ḽ0n3Zݧ%REy; <fgy nJ| uW_URX.c Q *hw=ғxw 5?ݾ,R8`҄9^`S-{9ɵ6iaf!2ouXy\ANῊ/%dx)5#R5SX< t"-U"F GYk|PÍ 30( dr"UMUiFT@)R#<6p,tۙ BcIfc 7<]Sw0hg4䛍Tb3uFjW^@ >Np:@X@)nJZ7 o~bS"hFD}d)ZR I=!(_[Y@IDg'}m-)*;s{ [B!] RwM^~GkM3vXhFϵwh,^:ͺ3k]R1pLt Cc6)pM<dCy@UqXY'iKk9s0=fjph67G9$2HD #Q X$St:N 1=5VJ1@Z2)`3 '[JHOwJ$}P}@t:o4KgL˷cB*2__aWLw tݴ(@$Z  sR Xgf|Mv3JaseU$0 sQx cRvg6xD\Mmw5$׷4g >-( 8$&c'@ED$cEɑ#{*h7jG{҅6@xg)\/,!h)qaf;U\X, /a-g}jLS80aB<ʒ{oDmA5']N@́osr~pW9YlW?ӝ[teHMdE"-T^Di&Q$ZPÈפ^Եg( DF=~Jr+mMigev˗ fuGo~.V&50/Gse+^c eLJ&ϒ`=V2>8vWаaj$|!,VaCS?*'n [6@1MQrĉmE̊ uJlg~OˆLșL:I-`,ad'g!zֳ?}_IᗶzQ0-T \p/jłȂAf!f86 LIJkx)EW|MV~dJJ zne3bէ֍KLG8Yb1QˆhI#`4lPYP^E&~hB0^, l1lw^X s*X&$Z/p]>h;AhvM8gf=]ʌ,ೊn542!SߠYIEYIU@tK&Uch^P"/gNWcυfKM·#V3X2^ :kLrD43 ^(:Z& 蟀}A@mj"JCA8> bAo^igEdN i`0^Pa DjZch >s: 05ECaa)2JمI>=-9:3g4&B}$C<*> (`ln9̗|-X7ie Ʀ"gLҡ6[h}7ZP,8@k*Lc@̭ |M01eChb+y{g1̬ama|`^!=(m=[O#`6 iL2oCa6 t.'m-De5ve" Eh1mt& *˚]. X i 5"L@.t/1@~`#$^6lX2|i}Bx㚠(P(Y|K@]YGY#(W5_K%԰>۳& ߯1-Ě{piʹv<0 tcZ0?Čf}YyEKEg?ZJiH0F 0uDMt{6F̘VJ%fxCE3,S=QMÐԖֳWߝr/|vŲIS;  -*DaasLʏfaqם_b-MJZ&Dn x̲rS Xzf4ËR<| tg? L5Ez3 ] ]Ru eO֟7ͯXDKee1S4YkG윈O?ƝxEifiƘp:/_|t}ܵaW.%vnoh>spdu*jשVqƿ&{nk%a:9u;w6`^PIe ˈ"I-+V 0 Uo8srC ,4Kv5~A$Ui]Sa_A_pgiF索u^S"ӵz1T}G-oö.8c&A9)pu iͩ6i_ngp8Y]nwܮMpK=({ ےIs~YG)0 FџiMfC^m0`@{tOklr1`\w~b8fu^_Ď !ebHwo\f'qY9o*rmm k3P_3Ͱ71BF)&ptϞ1WX߇pyWuΜGU^.̔KN[&*Y`71MxŚfsHJ!6GPWcglq@\vDDd w=(U! p&@qqbfAYz1~ 92Ā͓bNDG*ܸ>mG03 j]W.?B6LXh}A#I@ /6oDd$y1SwV-Z}_}}7f52!k"9դ,OZjQ$&"&6 PWw d3Kd@ؐGW\\}xD#7031|$09v:PDE;DE٥(;"숊!*ʎo*׆ygyf'x1?bC7i^)O8? Nz3`ٲ$%kf4X}cO?&` ]A@5gJ׳`i)Ѿ~[A9l7тGkf~_={O,Lc3Ǟ«fll. fd(mkW.y;X-m]#)W!wGl0OiV&ѩQͬ]`uLlń^Aj!㖛cAӰ#W g|XdY30-%?mnNHi#6i@pqY˜r0b&(TG?>X-z=Zx45~?"`H?B8M45Nh,rnNBTT`S߿M[.=:=)1 ;&Pف/"4 <D~ğzeA +ପoo\`l(p%  TbȰPtq@'%"ǻ~+ZȚ/1PY3Wo>X-]{|"1y>d^3-|qQp jgRT9:-^#:Z>[%uRQI2l~<jg9:Ts駵R7e Uo*XWIX\q cqKLt ~$D"!UW@U=t9@m[J֍W Vd7"l&wdL5ZN *YaSރ2U1`R]~\Tt+ة&R| .CvT\(XAcU҅^ VU>w(Y\6_ KQ |A@T[>`>ϫXס7O@{(BSݺY}?0`]`A%W.]`5^ mkc3rsg"b> Zl0*$>X?:'UxvoS B&3D11HYP D􁈺ܻZ,p  VU @gqV$RpI Rjd f9cuG\joUw3 fbaH(S'Ol1ZE!NINܿ~qMj P D pRU~Q}? >j5e8{څ9w,@9Tl9؝.f6BZt +e͹+X]Acr'#B8BQSda]R$6{aA}@;. zAxk[?Շ{<"؋-Q0l<$@IA T1Z#bh|?_rK`hY{tTyjp~|?iR|ː_Yk<\tsl 6`QRdl12A (1QEʰC™Dzl **=>`ىޓMބY>$QMgL3@X%Aܬ" _y:A)9_MP]'a*K7J!B/W˶ ^haSGtA>@m c~>æG+nqlVCU\5{[ҡWTeJMҁ2`w,+߹z~fSE'!q/dlC~M,4|H @"gOmڑ.' K @GgȸS =?^@uQU OlʉiIENDB`mayavi-4.5.0/docs/source/mayavi/mayavi_objects.rst0000644000076500000240000003026012747716313022675 0ustar prabhustaff00000000000000 Objects populating the Mayavi pipeline ======================================== .. currentmodule:: mayavi.core.api Here we give a brief description of the key objects in the Mayavi pipeline. .. image:: images/pipeline_and_scene.jpg :align: center .. note:: Given a Mayavi object, a simple way to see what important attribute is, display it to call it's ``print_traits()``. Note that, for certain objects, when used in IPython, this can cause a segfault, due to threading problems in IPython. Scene ------ ====================== ======================================================== Key attributes ====================== ======================================================== ``scene`` a ``TVTKScene`` (``tvtk.pyface.tvtk_scene``) object which is where all the rendering occurs. ``children`` a list of ``Source`` objects. ====================== ======================================================== The ``Scene`` class is defined in the ``mayavi.core.scene`` module. .. seealso:: API reference for the :class:`Scene` class. Source -------- All the data sources, file readers, Parametric surface etc. are subclasses of the ``Source`` class. ====================== ======================================================== Key attributes ====================== ======================================================== ``children`` a list of either ``Modules`` or ``Filters`` ``outputs`` ``List`` of outputs produced by the source. These are TVTK datasets, that are explained in the section :ref:`data-structures-used-by-mayavi`. ====================== ======================================================== The ``Source`` class is defined in the ``mayavi.core.source`` module. .. seealso:: API reference for the :class:`Source` class. Filter -------- All the ``Filters`` described in the :ref:`filters` section are subclasses of this class. ====================== ======================================================== Key attributes ====================== ======================================================== ``children`` a list of either ``Modules`` or other ``Filters``. ``inputs`` a ``List`` of input TVTK dataset objects that feed into the filter. ``outputs`` a list of outputs produced by the filter. These are TVTK datasets, that are explained in the section :ref:`data-structures-used-by-mayavi`. ====================== ======================================================== ====================== ======================================================== Key methods ====================== ======================================================== ``setup_pipeline()`` used to create the underlying TVTK pipeline objects if needed. ``update_pipeline()`` called when the upstream pipeline has been changed, i.e. an upstream object fires a ``pipeline_changed`` event. ``update_data()`` called when the upstream pipeline has **not** been changed but the data in the pipeline has been changed. This happens when the upstream object fires a ``data_changed`` event. ====================== ======================================================== The filter class is defined in the ``mayavi.core.filter`` module. .. seealso:: API reference for the :class:`Filter` class. ModuleManager: Colors and legends node --------------------------------------- This object is the one called *Colors and legends* in the tree view on the UI. The main purpose of this object is to control how data is turned in colors in the ``Modules`` it manages. All modules typically will use a lookup table (LUT) in order to produce a meaningful visualization. This lookup table is managed by the module manager. ====================== ======================================================== Key attributes ====================== ======================================================== ``source`` the ``Source`` or ``Filter`` object that is the input of this object. ``children`` a list of the ``Modules`` it manages. ``scalar_lut_manager`` an instance of a ``LUTManager`` which basically manages the color mapping from scalar values to colors on the visualizations. This is basically a mapping from scalars to colors. ``vector_lut_manager`` an instance of a ``LUTManager`` which manages the color mapping from vector values to colors on the visualizations. ``lut_data_mode`` 'auto', 'point data' and 'cell data'. Specifies the data type to use for the LUTs. This can be changed inbetween . Changing this setting will change the data range and name of the lookup table/legend bar. If set to 'auto' (the default), it automatically looks for cell and point data with point data being preferred over cell data and chooses the one available. If set to 'point data' it uses the input point data for the LUT and if set to 'cell data' it uses the input cell data. ====================== ======================================================== This class is defined in the ``mayavi.core.module_manager`` module. .. seealso:: API reference for the :class:`ModuleManager` class. Module ------- These objects are the ones that typically produce a visualization on the scene. All the modules defined in the :ref:`modules` section are subclasses of this. A module is typically returned by the mlab :ref:`3D plotting functions `. ====================== ======================================================== Key attributes ====================== ======================================================== ``module_manager`` The ``ModuleManager`` instance that controls the colormaps and the legends of this ``Module`` ``actor`` The TVTK actor of the modules, in other words the object displayed in the scene. This is where you will have the properties such as scaling, or GL material properties. ``components`` a list of various reusable components that are used by the module. These usually are never used directly by the user. However, they are extremely useful when creating new modules. A ``Component`` is basically a reusable piece of code that is used by various other objects. For example, almost every ``Module`` uses a TVTK actor, mapper and property. These are all "componentized" into a reusable `Actor` component that the modules use. Thus, components are a means to promote reuse between mayavi pipeline objects. ====================== ======================================================== ====================== ======================================================== Key methods ====================== ======================================================== ``setup_pipeline()`` used to create the underlying TVTK pipeline objects if needed. ``update_pipeline()`` called when the upstream pipeline has been changed, i.e. an upstream object fires a ``pipeline_changed`` event. ``update_data()`` called when the upstream pipeline has **not** been changed but the data in the pipeline has been changed. This happens when the upstream object fires a ``data_changed`` event. ====================== ======================================================== Defined in the ``mayavi.core.module`` module. .. seealso:: API reference for the :class:`Module` class. Engine -------- The Mayavi engine is the central object dealing with life-cycle of visualization objects and scene, as well as connecting and updating the pipeline. It is at the root of the pipeline and is not displayed in the pipeline view. For contextual operation, the engine has the notion of a 'current object' and a 'current scene' and features several methods that let one add a ``Filter/Source/Module`` instance to it. The contextual operations are important in a menu-driven graphical user interface. It allows one to create new scenes and delete them. Also has methods to load and save the entire visualization. .. currentmodule:: mayavi When using mlab, the engine used by mlab can be retrieved using :func:`mlab.get_engine`. .. currentmodule:: mayavi.core.api ====================== ======================================================== Key attributes ====================== ======================================================== ``scenes`` a list of ``Scene`` objects. ``current_object`` the object on which contextual operations, such as ``add_module`` will apply. ``current_scene`` the scene in which data sources will be added by default. ``current_selection`` The object selected in the pipeline view. ====================== ======================================================== ====================== ======================================================== Key methods ====================== ======================================================== ``new_scene()`` this is the method called to create a new scene. Subclasses override this method. ====================== ======================================================== ====================== ======================================================== Important sub-classes ====================== ======================================================== ``EnvisageEngine`` defined in the ``mayavi.plugins.envisage_engine`` module. It is the subclass of used in the ``mayavi2`` application. ``OffScreenEngine`` defined in the ``mayavi.core.off_screen_engine`` module. It creates scenes that are not displayed on screen by default. ``NullEngine`` defined in the ``mayavi.core.null_engine`` module. With this engine, visualization objects are not added to a scene, and thus cannot be rendered. This engine is useful for testing and pure-data handling use of Mayavi's data structures. ====================== ======================================================== .. image:: images/design2c.jpg :alt: The ``Engine`` object. :align: center The `Engine` base class is defined in the ``mayavi.engine`` module. .. seealso:: API reference for the :class:`Engine` class. Base class: PipelineBase -------------------------- The ``PipelineBase`` is the base class for all objects in the mayavi pipeline except the ``Scene`` and ``Engine`` (which really isn't *in* the pipeline but contains the pipeline). Defined in the ``mayavi.core.pipeline_base`` module. Derives from ``Base`` which merely abstracts out common functionality. ====================== ======================================================== Key attributes ====================== ======================================================== ``pipeline_changed`` This is an ``Event`` Trait: it can only be assigned to and determines when the pipeline has been changed. Therefore, if one does:: object.pipeline_changed = True then the ``pipeline_changed`` event is fired. Objects downstream of ``object`` in the pipeline are automatically setup to listen to events from an upstream object and will call their ``update_pipeline`` method. ``data_changed`` Similarly, if the ``data_changed`` event is fired then downstream objects will automatically call their ``update_data`` methods. ``outputs`` a list of outputs produced by the object. ``scene`` the scene to which the object is attached. ``visible`` a boolean that toggle the Hide/Show status of the object and its downstream pipeline. ====================== ======================================================== ====================== ======================================================== Key methods ====================== ======================================================== ``remove()`` can be used to remove the object (if added) from the mayavi pipeline. ====================== ======================================================== .. seealso:: API reference for the :class:`PipelineBase` class. Class hierarchy --------------------- The following figures show the class hierarchy of the various objects involved. .. image:: images/design2a.jpg :alt: Basic object hierarchy :align: center *This hierarchy depicts the ``Base`` object, the ``Scene``, ``PipelineBase`` and the ``ModuleManager``.* .. image:: images/design2b.png :alt: More object hierarchy :align: center *This hierarchy depicts the ``PipelineBase`` object, the ``Source``, ``Filter``, ``Module`` and the ``Component``.* mayavi-4.5.0/docs/source/mayavi/misc.rst0000644000076500000240000001233212747716313020631 0ustar prabhustaff00000000000000Miscellaneous ============= Citing Mayavi --------------- The core developers of Mayavi are academics. Therefore they justify time and resources spent developing Mayavi by the number of citations of the software. If you publish scientific articles using Mayavi, please cite the following article (bibtex entry :download:`citation.bib`): Ramachandran, P. and Varoquaux, G., *`Mayavi: 3D Visualization of Scientific Data`* IEEE Computing in Science & Engineering, **13** (2), pp. 40-51 (2011) .. _getting-help: Getting help ------------ Bug reports should be submitted to the `issue tracker`_. Please make sure to provide enough information so that the issue can be reproduced. For other requests, if this manual, the Mayavi web page, the wiki page, stack overflow and google are of no help, feel free to ask on the `issue tracker`_. Tests for Mayavi ----------------- You can easily run the Mayavi test suite using `mayavi2 -t` from the command line. Running tests is useful to find out if Mayavi works well on your particular system. Indeed, the systems can vary from one to another: in addition to the variety of existing operating systems, different versions of the libraries can be installed. The Mayavi developers do their best to support many different configuration, but you can help them by running the test suite and reporting any errors. You can use `nose`_ to run the unit tests of both packages by doing the following from the root of the Mayavi source directory:: $ nosetests ---------------------------------------------------------------------- Ran 317 tests in 29.934s OK (SKIP=5) From the mayavi source directory, to run tests only for mayavi package you can do:: $ nosetests mayavi/tests ---------------------------------------------------------------------- Ran 231 tests in 14.066s OK (SKIP=4) From the mayavi source directory, to run tests only for tvtk package you can do:: $ nosetests tvtk/tests ---------------------------------------------------------------------- Ran 87 tests in 9.080s OK (SKIP=1) If you get an "ERROR" regarding the unavailability of coverage you may safely ignore it. If for some reason nose is having difficulty running the tests, the tests may be found inside ``tvtk/tests`` and ``mayavi/tests``. You can run each of the ``test_*.py`` files in these directories manually, or change your current directory to these directories and run ``nosetests`` there. In addition to these unit tests mayavi also has several integration tests. These are in the ``integrationtests/mayavi`` directory of the source distribution. You may run the tests there like so:: $ ./run.py These tests are intrusive and will create several mayavi windows and also take a while to complete. Some of them may fail on your machine for various reasons. Helping out ----------- We are always on the lookout for people to help this project grow. If you need a functionality added to Mayavi, open an new feature request issue in `issue tracker`_. To submit bug fixes or new functionality, this is the recommended workflow: 1. Fork the Repo on github. 2. If you are adding functionality or fixing a bug, please add a test! 3. Push to your fork and submit a **pull request to the master branch**. The **master** branch is a 100% stable (should be). The pull request is merged only after it is certain that things are working out, which means that `Travis`_ and `Appveyor`_ tests pass. Please note that we aim to improve the overall testing of the Mayavi codebase, so tests are also important. Development quick start ~~~~~~~~~~~~~~~~~~~~~~~~ To help improve Mayavi, you first need to install the development version, see :ref:`installing_git`. You can then modify your local installation of Mayavi to add the functionality you are interested in (make sure the tests still run after your modifications). Once you are done, you can generate a github `pull request`_ to get your changes into the next stable release. Improving the documentation ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Documentation of a project is incredibly important. It also takes a lot of time to write and improve. You can easily help us with documentation. You will find the documentation sources in ``docs/sources/mayavi``. The documentation is written in `sphinx`_. It is easy to edit the `.rst` files to modify or extend the text. Once you have done your modifications, you can build the documentation using by running:: python setup.py build_docs in the base directory of your checkout. You will need `sphinx`_ installed for that. The documentation is then built as an HTML documentation that you can find in the sub directory ``build/docs/html/mayavi``. Once you are comfortable with the modifications, just generate a github pull request to integrate your changes into the next stable release. .. _nose: https://nose.readthedocs.org .. _github: https://github.com/enthought/mayavi .. _issue tracker: https://github.com/enthought/mayavi/issues .. _pull request: https://help.github.com/articles/using-pull-requests .. _sphinx: http://sphinx.pocoo.org .. _Travis: http://travis-ci.org/enthought/mayavi .. _Appveyor: https://ci.appveyor.com/project/itziakos/mayavi .. Local Variables: mode: rst indent-tabs-mode: nil sentence-end-double-space: t fill-column: 70 End: mayavi-4.5.0/docs/source/mayavi/mlab.rst0000644000076500000240000000664512747716313020623 0ustar prabhustaff00000000000000.. _simple-scripting-with-mlab: ``mlab``: Python scripting for 3D plotting ============================================ .. topic:: Section summary This section describes the `mlab` API, for use of Mayavi as a simple plotting in scripts or interactive sessions. This is the main entry point for people interested in doing 3D plotting à la Matlab or IDL in Python. If you are interested in a list of all the functions exposed in mlab, see the :ref:`mlab-reference`. .. currentmodule:: mayavi.mlab The :mod:`mayavi.mlab` module, that we call mlab, provides an easy way to visualize data in a script or from an interactive prompt with one-liners as done in the matplotlib_ ``pylab`` interface but with an emphasis on 3D visualization using Mayavi2. This allows users to perform quick 3D visualization while being able to use Mayavi's powerful features. Mayavi's mlab is designed to be used in a manner well-suited to scripting and does not present a fully object-oriented API. It is can be used interactively with IPython_. .. warning:: When using IPython with mlab, as in the following examples, IPython must be invoked with the ``--gui=qt`` command line option like this:: $ ipython --gui=qt On recent versions of IPython, this can be turned on from within IPython itself by:: In []: %gui qt If the following exception is raised:: ValueError: API 'QString' has already been set to version 1 This is the result of incompatible setups between PyQt and PySide. The solution is to run ``QT_API=pyqt ETS_TOOLKIT=qt4 ipython``. More details can be found at the `ipython documentation page`_. If for some reason Mayavi fails with the Qt backend, you can also try using the wxPython backend by doing:: $ ETS_TOOLKIT=wx $ ipython --gui=wx For more details on using mlab and running scripts, read the section :ref:`running-mlab-scripts` .. _matplotlib: http://matplotlib.sf.net .. _IPython: http://ipython.scipy.org .. _ipython documentation page: http://ipython.readthedocs.io/en/stable/interactive/reference.html#pyqt-and-pyside In this section, we first introduce simple plotting functions, to create 3D objects as representations of `numpy` arrays. Then we explain how properties such as color or glyph size can be modified or used to represent data, we show how the visualization created through `mlab` can be modified interactively with dialogs, we show how scripts and animations can be ran. Finally, we expose a more advanced use of `mlab` in which full visualization pipeline are built in scripts, and we give some detailed examples of applying these tools to visualizing volumetric scalar and vector data. .. contents:: Section contents :depth: 1 :local: .. .. topic:: **Section contents** .. toctree:: mlab_demo mlab_3d_plotting_functions mlab_changing_object_looks mlab_figures_decorations mlab_running_scripts mlab_animating mlab_pipeline mlab_case_studies .. include:: mlab_demo.rst .. include:: mlab_3d_plotting_functions.rst .. include:: mlab_changing_object_looks.rst .. include:: mlab_figures_decorations.rst .. include:: mlab_running_scripts.rst .. include:: mlab_animating.rst .. include:: mlab_pipeline.rst .. include:: mlab_case_studies.rst .. Local Variables: mode: rst indent-tabs-mode: nil sentence-end-double-space: t fill-column: 70 End: mayavi-4.5.0/docs/source/mayavi/mlab_3d_plotting_functions.rst0000644000076500000240000001647712747716313025225 0ustar prabhustaff00000000000000.. _mlab_plotting_functions: 3D Plotting functions for numpy arrays --------------------------------------- Visualization can be created in `mlab` by a set of functions operating on numpy arrays. The mlab plotting functions take numpy arrays as input, describing the ``x``, ``y``, and ``z`` coordinates of the data. They build full-blown visualizations: they create the data source, filters if necessary, and add the visualization modules. Their behavior, and thus the visualization created, can be fine-tuned through keyword arguments, similarly to pylab. In addition, they all return the visualization module created, thus visualization can also be modified by changing the attributes of this module. .. note:: In this section, we only list the different functions. Each function is described in detail in the :ref:`mlab-reference`, at the end of the user guide, with figures and examples. Please follow the links. 0D and 1D data ~~~~~~~~~~~~~~~ .. A temporary hack to avoid a sphinx bug .. |hack| raw:: html
================= ========================================================= ================= ========================================================= |points3d| :func:`points3d` |hack| Plots glyphs (like points) at the position of the supplied data, described by ``x``, ``y``, ``z`` numpy arrays of the same shape. |plot3d| :func:`plot3d` |hack| Plots line between the supplied data, described by ``x``, ``y``, ``z`` 1D numpy arrays of the same length. ================= ========================================================= .. |plot3d| image:: generated_images/enthought_mayavi_mlab_plot3d.jpg :scale: 50 .. |points3d| image:: generated_images/enthought_mayavi_mlab_points3d.jpg :scale: 50 2D data ~~~~~~~~ ================= ========================================================= ================= ========================================================= |imshow| :func:`imshow` |hack| View a 2D array as an image. |surf| :func:`surf` |hack| View a 2D array as a carpet plot, with the z axis representation through elevation the value of the array points. |contour_surf| :func:`contour_surf` |hack| View a 2D array as line contours, elevated according to the value of the array points. |mesh| :func:`mesh` |hack| Plot a surface described by three 2D arrays, ``x``, ``y``, ``z`` giving the coordinates of the data points as a grid. |hack| Unlike :func:`surf`, the surface is defined by its ``x``, ``y`` and ``z`` coordinates with no privileged direction. More complex surfaces can be created. |barchart| :func:`barchart` |hack| Plot an array ``s``, or a set of points with explicit coordinates arrays, ``x``, ``y`` and ``z``, as a bar chart, eg for histograms. |hack| This function is very versatile and will accept 2D or 3D arrays, but also clouds of points, to position the bars. |triangular_mesh| :func:`triangular_mesh` |hack| Plot a triangular mesh, fully specified by ``x``, ``y`` and ``z`` coordinates of its vertices, and the (n, 3) array of the indices of the triangles. ================= ========================================================= .. topic:: Vertical scale of :func:`surf` and :func:`contour_surf` :func:`surf` and :func:`contour_surf` can be used as 3D representation of 2D data. By default the z-axis is supposed to be in the same units as the x and y axis, but it can be auto-scaled to give a 2/3 aspect ratio. This behavior can be controlled by specifying the "warp_scale='auto'". .. topic:: From data points to surfaces. Knowing the positions of data points is not enough to define a surface, connectivity information is also required. With the functions :func:`surf` and :func:`mesh`, this connectivity information is implicitly extracted from the shape of the input arrays: neighboring data points in the 2D input arrays are connected, and the data lies on a grid. With the function :func:`triangular_mesh`, connectivity is explicitly specified. Quite often, the connectivity is not regular, but is not known in advance either. The data points lie on a surface, and we want to plot the surface implicitly defined. The `delaunay2d` filter does the required nearest-neighbor matching, and interpolation, as shown in the (:ref:`example_surface_from_irregular_data`). .. |imshow| image:: generated_images/enthought_mayavi_mlab_imshow.jpg :scale: 50 .. |contour_surf| image:: generated_images/enthought_mayavi_mlab_contour_surf.jpg :scale: 50 .. |triangular_mesh| image:: generated_images/enthought_mayavi_mlab_triangular_mesh.jpg :scale: 50 .. |surf| image:: generated_images/enthought_mayavi_mlab_surf.jpg :scale: 50 .. |mesh| image:: generated_images/enthought_mayavi_mlab_mesh.jpg :scale: 50 .. |barchart| image:: generated_images/enthought_mayavi_mlab_barchart.jpg :scale: 50 3D data ~~~~~~~~ ================= ========================================================= ================= ========================================================= |contour3d| :func:`contour3d` |hack| Plot iso-surfaces of volumetric data defined as a 3D array. |quiver3d| :func:`quiver3d` |hack| Plot arrows to represent vectors at data points. The ``x``, ``y``, ``z`` position are specified by numpy arrays, as well as the ``u``, ``v``, ``w`` components of the vectors. |flow| :func:`flow` |hack| Plot a trajectory of particles along a vector field described by three 3D arrays giving the ``u``, ``v``, ``w`` components on a grid. ================= ========================================================= .. topic:: Structured or unstructured data :func:`contour3d` and :func:`flow` require ordered data (to be able to interpolate between the points), whereas :func:`quiver3d` works with any set of points. The required structure is detailed in the functions' documentation. .. |contour3d| image:: generated_images/enthought_mayavi_mlab_contour3d.jpg :scale: 50 .. |quiver3d| image:: generated_images/enthought_mayavi_mlab_quiver3d.jpg :scale: 50 .. |flow| image:: generated_images/enthought_mayavi_mlab_flow.jpg :scale: 50 .. note:: Many richer visualizations can be created by assembling data sources filters and modules. See the :ref:`controlling-the-pipeline-with-mlab-scripts` and the :ref:`mlab-case-studies` sections. .. Local Variables: mode: rst indent-tabs-mode: nil sentence-end-double-space: t fill-column: 70 End: mayavi-4.5.0/docs/source/mayavi/mlab_animating.rst0000644000076500000240000001011612747716313022636 0ustar prabhustaff00000000000000 .. _mlab-animating-data: Animating the data ------------------ Often it isn't sufficient to just plot the data. You may also want to change the data of the plot and update the plot without having to recreate the entire visualization, for instance to do animations, or in an interactive application. Indeed, recreating the entire visualization is very inefficient and leads to very jerky looking animations. To do this, mlab provides a very convenient way to change the data of an existing mlab visualization. Consider a very simple example. The `mlab.test_simple_surf_anim` function has this code:: import numpy as np from mayavi import mlab x, y = np.mgrid[0:3:1,0:3:1] s = mlab.surf(x, y, np.asarray(x*0.1, 'd')) for i in range(10): s.mlab_source.scalars = np.asarray(x*0.1*(i+1), 'd') The first two lines define a simple plane and view that. The next three lines animate that data by changing the scalars producing a plane that rotates about the origin. The key here is that the `s` object above has a special attribute called `mlab_source`. This sub-object allows us to manipulate the points and scalars. If we wanted to change the `x` values we could set that too by:: s.mlab_source.x = new_x The only thing to keep in mind here is that the shape of `x` should not be changed. If multiple values have to be changed, you can use the `set` method of the `mlab_source` to set them as shown in the more complicated example below:: # Produce some nice data. n_mer, n_long = 6, 11 pi = np.pi dphi = pi/1000.0 phi = np.arange(0.0, 2*pi + 0.5*dphi, dphi, 'd') mu = phi*n_mer x = np.cos(mu)*(1+np.cos(n_long*mu/n_mer)*0.5) y = np.sin(mu)*(1+np.cos(n_long*mu/n_mer)*0.5) z = np.sin(n_long*mu/n_mer)*0.5 # View it. l = plot3d(x, y, z, np.sin(mu), tube_radius=0.025, colormap='Spectral') # Now animate the data. ms = l.mlab_source for i in range(10): x = np.cos(mu)*(1+np.cos(n_long*mu/n_mer + np.pi*(i+1)/5.)*0.5) scalars = np.sin(mu + np.pi*(i+1)/5) ms.set(x=x, scalars=scalars) Notice the use of the `set` method above. With this method, the visualization is recomputed only once. In this case, the shape of the new arrays has not changed, only their values have. If the shape of the array changes then one should use the `reset` method as shown below:: x, y = np.mgrid[0:3:1,0:3:1] s = mlab.surf(x, y, np.asarray(x*0.1, 'd'), representation='wireframe') # Animate the data. fig = mlab.gcf() ms = s.mlab_source for i in range(5): x, y = np.mgrid[0:3:1.0/(i+2),0:3:1.0/(i+2)] sc = np.asarray(x*x*0.05*(i+1), 'd') ms.reset(x=x, y=y, scalars=sc) fig.scene.reset_zoom() Many standard examples for animating data are provided with mlab. Try the examples with the name `mlab.test__anim`, i.e. where the name ends with an `_anim` to see how these work and run. .. note:: It is important to remember distinction between `set` and `reset`. Use `set` or directly set the attributes (`x`, `y`, `scalars` etc.) when you are not changing the shape of the data but only the values. Use `reset` when the arrays are changing shape and size. Reset usually regenerates all the data and can be inefficient when compared to `set` or directly setting the traits. .. warning:: When creating a Mayavi pipeline, as explained in the following subsection, instead of using ready-made plotting function, the `mlab_source` attribute is created only on sources created via `mlab`. Pipeline created entirely using `mlab` will present this attribute. .. note:: If you are animating several plot objects, each time you modify the data with there `mlab_source` attribute, Mayavi will trigger a refresh of the scene. This operation might take time, and thus slow your animation. In this case, the tip :ref:`acceleration_mayavi_scripts` may come in handy. .. Local Variables: mode: rst indent-tabs-mode: nil sentence-end-double-space: t fill-column: 70 End: mayavi-4.5.0/docs/source/mayavi/mlab_case_studies.rst0000644000076500000240000002551712747716313023355 0ustar prabhustaff00000000000000.. _mlab-case-studies: Case studies of some visualizations ------------------------------------- Visualizing volumetric scalar data ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. currentmodule:: mayavi.mlab There are three main ways of visualizing a 3D scalar field. Given the following field:: import numpy as np x, y, z = np.ogrid[-10:10:20j, -10:10:20j, -10:10:20j] s = np.sin(x*y*z)/(x*y*z) :Iso-Surfaces: To display iso surfaces of the field, the simplest solution is simply to use the `mlab` :func:`contour3d` function:: mlab.contour3d(s) |volumetric_contour3d| The problem with this method is that the outer iso-surfaces tend to hide inner ones. As a result, quite often only one iso-surface can be visible. .. currentmodule:: mayavi.tools.pipeline :Volume rendering: Volume rendering is an advanced technique in which each voxel is given a partly transparent color. This can be achieved with `mlab.pipeline` using the :func:`scalar_field` source, and the `volume` module:: mlab.pipeline.volume(mlab.pipeline.scalar_field(s)) |volumetric_volume| For such a visualization, tweaking the opacity transfer function is critical to achieve a good effect. Typically, it can be useful to limit the lower and upper values to the 20 and 80 percentiles of the data, in order to have a reasonable fraction of the volume transparent:: mlab.pipeline.volume(mlab.pipeline.scalar_field(s), vmin=0, vmax=0.8) |volumetric_volume_tweaked| It is useful to open the module's dialog (eg through the pipeline interface, or using it's `edit_traits()` method) and tweak the color transfer function to render the transparent low-intensity regions of the image. **For this module, the LUT as defined in the `Colors and legends` node are not used** The limitations of volume rendering is that, while it is often very pretty, it can be difficult to analyze the details of the field with it. :Cut planes: While less impressive, cut planes are a very informative way of visualizing the details of a scalar field:: mlab.pipeline.image_plane_widget(mlab.pipeline.scalar_field(s), plane_orientation='x_axes', slice_index=10, ) mlab.pipeline.image_plane_widget(mlab.pipeline.scalar_field(s), plane_orientation='y_axes', slice_index=10, ) mlab.outline() |volumetric_cut_plane| The image plane widget can only be used on regular-spaced data, as created by `mlab.pipeline.scalar_field`, but it is very fast. It should thus be prefered to the scalar cut plane, when possible. Clicking and dragging the cut plane is an excellent way of exploring the field. :A combination of techniques: Finally, it can be interesting to combine cut planes with iso-surfaces and thresholding to give a view of the peak areas using the iso-surfaces, visualize the details of the field with the cut plane, and the global mass with a large iso-surface:: src = mlab.pipeline.scalar_field(s) mlab.pipeline.iso_surface(src, contours=[s.min()+0.1*s.ptp(), ], opacity=0.1) mlab.pipeline.iso_surface(src, contours=[s.max()-0.1*s.ptp(), ],) mlab.pipeline.image_plane_widget(src, plane_orientation='z_axes', slice_index=10, ) |volumetric_combination| In some cases, though not in our example, it might be usable to insert a threshold filter before the cut plane, eg:to remove area with values below 's.min()+0.1*s.ptp()'. In this case, the cut plane needs to be implemented with `mlab.pipeline.scalar_cut_plane` as the data looses its structure after thresholding. .. |volumetric_contour3d| image:: volumetric_contour3d.jpg .. |volumetric_volume| image:: volumetric_volume.jpg .. |volumetric_volume_tweaked| image:: volumetric_volume_tweaked.jpg .. |volumetric_cut_plane| image:: volumetric_cut_plane.jpg .. |volumetric_combination| image:: volumetric_combination.jpg Visualizing a vector field ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. Parameters used for the images: mlab.figure(1, fgcolor=(0., 0., 0.), bgcolor=(1, 1, 1), size=(349, 349)) mlab.view(60, 90, 45.8, (9.5, 11.1, 10.4)) .. currentmodule:: mayavi.mlab A vector field, i.e., vectors continuously defined in a volume, can be difficult to visualize, as it contains a lot of information. Let us explore different visualizations for the velocity field of a multi-axis convection cell [1]_, in hydrodynamics, as defined by its components sampled on a grid, `u`, `v`, `w`:: import numpy as np x, y, z = np.mgrid[0:1:20j, 0:1:20j, 0:1:20j] u = np.sin(np.pi*x) * np.cos(np.pi*z) v = -2*np.sin(np.pi*y) * np.cos(2*np.pi*z) w = np.cos(np.pi*x)*np.sin(np.pi*z) + np.cos(np.pi*y)*np.sin(2*np.pi*z) :Quiver: The simplest visualization of a set of vectors, is using the `mlab` function `quiver3d`:: mlab.quiver3d(u, v, w) mlab.outline() .. image:: vector_field_quiver.jpg The main limitation of this visualization is that it positions an arrow for each sampling point on the grid. As a result the visualization is very busy. :Masking vectors: We can use the fact that we are visualizing a vector field, and not just a bunch of vectors, to reduce the amount of arrows displayed. For this we need to build a `vector_field` source, and apply to it the `vectors` module, with some masking parameters (here we keep only one point out of 20):: src = mlab.pipeline.vector_field(u, v, w) mlab.pipeline.vectors(src, mask_points=20, scale_factor=3.) .. image:: vector_field_vectors.jpg :A cut plane: If we are interested in displaying the vectors along a cut, we can use a cut plane. In particular, we can inspect interactively the vector field by moving the cut plane along: clicking on it and dragging it can give a very clear understanding of the vector field:: mlab.pipeline.vector_cut_plane(src, mask_points=2, scale_factor=3) .. image:: vector_field_cut_plane.jpg :Iso-Surfaces of the magnitude: An important parameter of the vector field is its magnitude. It can be interesting to display iso-surfaces of the normal of the vectors. For this we can create a scalar field from the vector field using the ExtractVectorNorm filter, and use the Iso-Surface module on it. When working interactively, a good understanding of the magnitude of the field can be gained by changing the values of the contours in the object's property dialog. :: magnitude = mlab.pipeline.extract_vector_norm(src) mlab.pipeline.iso_surface(magnitude, contours=[1.9, 0.5]) .. image:: vector_field_isosurface.jpg :The Flow, or the field lines: For certain vector fields, the line of flow along the field can have an interesting meaning. For instance this can be interpreted as a trajectory in hydrodynamics, or field lines in electro-magnetism. We can display the flow lines originating for a certain seed surface using the `streamline` module, or the mlab :func:`flow` function, which relies on `streamline` internally:: flow = mlab.flow(u, v, w, seed_scale=1, seed_resolution=5, integration_direction='both') .. image:: vector_field_flow.jpg :A combination of techniques: Giving a meaningful visualization of a vector field is a hard task, and one must use all the tools at hand to illustrate his purposes. It is important to choose the message conveyed. No one visualization will tell all about a vector field. Here is an example of a visualization made by combining the different tools above:: mlab.figure(fgcolor=(0., 0., 0.), bgcolor=(1, 1, 1)) src = mlab.pipeline.vector_field(u, v, w) magnitude = mlab.pipeline.extract_vector_norm(src) # We apply the following modules on the magnitude object, in order to # be able to display the norm of the vectors, eg as the color. iso = mlab.pipeline.iso_surface(magnitude, contours=[1.9, ], opacity=0.3) vec = mlab.pipeline.vectors(magnitude, mask_points=40, line_width=1, color=(.8, .8, .8), scale_factor=4.) flow = mlab.pipeline.streamline(magnitude, seedtype='plane', seed_visible=False, seed_scale=0.5, seed_resolution=1, linetype='ribbon',) vcp = mlab.pipeline.vector_cut_plane(magnitude, mask_points=2, scale_factor=4, colormap='jet', plane_orientation='x_axes') .. image:: vector_field_combination.jpg .. note:: Although most of this section has been centered on snippets of code to create visualization objects, it is important to remember that Mayavi is an interactive program, and that the properties of these objects can be modified interactively, as described in :ref:`mlab-changing-objects-interactively`. It is often impossible to choose the best parameters for a visualization before hand. Colors, contour values, colormap, view angle, etc... should be chosen interactively. If reproducibiles are required, the chosen values can be added in the original script. Moreover, the `mlab` functions expose only a small fraction of the possibilities of the visualization objects. The dialogs expose more of these functionalities, that are entirely controlled by the attributes of the objects returned by the mlab functions. These objects are very rich, as they are built from VTK objects. It can be hard to find the right attribute to modify when exploring them, or in the VTK documentation, thus the easiest way is to modify them interactively using the pipeline view dialog and use the :ref:`record feature ` to find out the corresponding lines of code. See :ref:`organisation_mayavi_visualisations` to understand better the link between the lines of code generated by the record feature and `mlab`. . ____ .. [1] Toussaint, V.; Carriere, P. & Raynal, F. A numerical Eulerian approach to mixing by chaotic advection Phys. Fluids, 1995, 7, 2587 .. Local Variables: mode: rst indent-tabs-mode: nil sentence-end-double-space: t fill-column: 70 End: mayavi-4.5.0/docs/source/mayavi/mlab_changing_object_looks.rst0000644000076500000240000001675312747716313025217 0ustar prabhustaff00000000000000Changing the looks of the visual objects created ------------------------------------------------- Adding color or size variations ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :Color: The color of the objects created by a plotting function can be specified explicitly using the 'color' keyword argument of the function. This color is then applied uniformly to all the objects created. If you want to vary the color across your visualization, you need to specify scalar information for each data point. Some functions try to guess this information: these scalars default to the norm of the vectors, for functions with vectors, or to the z elevation for functions where it is meaningful, such as :func:`surf` or :func:`barchart`. This scalar information is converted into colors using the colormap, or also called LUT, for Look Up Table. The list of possible colormaps is:: accent flag hot pubu set2 autumn gist_earth hsv pubugn set3 black-white gist_gray jet puor spectral blue-red gist_heat oranges purd spring blues gist_ncar orrd purples summer bone gist_rainbow paired rdbu winter brbg gist_stern pastel1 rdgy ylgnbu bugn gist_yarg pastel2 rdpu ylgn bupu gnbu pink rdylbu ylorbr cool gray piyg rdylgn ylorrd copper greens prgn reds dark2 greys prism set1 The easiest way to choose the colormap, most adapted to your visualization is to use the GUI (as described in the next paragraph). The dialog to set the colormap can be found in the `Colors and legends` node. To use a custom-defined colormap, for the time being, you need to write specific code, as show in :ref:`example_custom_colormap`. :Size of the glyph: The scalar information can also be displayed in many different ways. For instance it can be used to adjust the size of glyphs positioned at the data points. **A caveat: Clamping: relative or absolute scaling** Given six points positionned on a line with interpoint spacing 1:: x = [1, 2, 3, 4, 5, 6] y = [0, 0, 0, 0, 0, 0] z = y If we represent a scalar varying from 0.5 to 1 on this dataset:: s = [.5, .6, .7, .8, .9, 1] We represent the dataset as spheres, using :func:`points3d`, and the scalar is mapped to diameter of the spheres:: from mayavi import mlab pts = mlab.points3d(x, y, z, s) By default the diameter of the spheres is not 'clamped', in other words, the smallest value of the scalar data is represented as a null diameter, and the largest is proportional to inter-point distance. The scaling is only relative, as can be seen on the resulting figure: .. image:: clamping_on.jpg This behavior gives visible points for all datasets, but may not be desired if the scalar represents the size of the glyphs in the same unit as the positions specified. In this case, you shoud turn auto-scaling off by specifying the desired scale factor:: pts = mlab.points3d(x, y, z, s, scale_factor=1) .. image:: clamping_off.jpg .. warning:: In earlier versions of Mayavi (up to 3.1.0 included), the glyphs are not auto-scaled, and as a result the visualization can seem empty due to the glyphs being very small. In addition the minimum diameter of the glyphs is clamped to zero, and thus the glyph are not scaled absolutely, unless you specify:: pts.glyph.glyph.clamping = False :More representations of the attached scalars or vectors: There are many more ways to represent the scalar or vector information attached to the data. For instance, scalar data can be 'warped' into a displacement, e.g. using a `WarpScalar` filter, or the norm of scalar data can be extracted to a scalar component that can be visualized using iso-surfaces with the `ExtractVectorNorm` filter. :Displaying more than one quantity: You may want to display color related to one scalar quantity while using a second for the iso-contours, or the elevation. This is possible but requires a bit of work: see :ref:`example_atomic_orbital`. If you simply want to display points with a size given by one quantity, and a color by a second, you can use a simple trick: add the size information using the norm of vectors, add the color information using scalars, create a :func:`quiver3d` plot choosing the glyphs to symmetric glyphs, and use scalars to represent the color:: x, y, z, s, c = np.random.random((5, 10)) pts = mlab.quiver3d(x, y, z, s, s, s, scalars=c, mode='sphere') pts.glyph.color_mode = 'color_by_scalar' # Finally, center the glyphs on the data point pts.glyph.glyph_source.glyph_source.center = [0, 0, 0] Changing the scale and position of objects ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Each mlab function takes an `extent` keyword argument, that allows to set its (x, y, z) extents. This give both control on the scaling in the different directions and the displacement of the center. Beware that when you are using this functionality, it can be useful to pass the same extents to other modules visualizing the same data. If you don't, they will not share the same displacement and scale. The :func:`surf`, :func:`contour_surf`, and :func:`barchart` functions, which display 2D arrays by converting the values in height, also take a `warp_scale` parameter, to control the vertical scaling. .. _mlab-changing-objects-interactively: Changing object properties interactively ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Mayavi, and thus mlab, allows you to interactively modify your visualization. The Mayavi pipeline tree can be displayed by clicking on the mayavi icon in the figure's toolbar, or by using :func:`show_pipeline` mlab command. One can now change the visualization using this dialog by double-clicking on each object to edit its properties, as described in other parts of this manual, or add new modules or filters by using this icons on the pipeline, or through the right-click menus on the objects in the pipeline. .. image:: images/pipeline_and_scene.jpg :align: center .. _record_feature: .. topic:: The record feature A **very useful feature** of this dialog can be found by pressing the red round button of the toolbar of the pipeline view. This opens up a recorder that tracks the changes made interactively to the visualization via the dialogs, and generates valid lines of Python code. To find out about navigating through a program in the pipeline, see :ref:`organisation_mayavi_visualisations`. In addition, for every object returned by a mlab function, ``this_object.edit_traits()`` brings up a dialog that can be used to interactively edit the object's properties. If the dialog doesn't show up when you enter this command, please see :ref:`running-mlab-scripts`. .. topic:: Using ``mlab`` with the full Envisage UI Sometimes it is convenient to write an mlab script but still use the full envisage application so you can click on the menus and use other modules etc. To do this you may do the following before you create an mlab figure:: from mayavi import mlab mlab.options.backend = 'envisage' f = mlab.figure() # ... This will give you the full-fledged UI instead of the default simple window. .. Local Variables: mode: rst indent-tabs-mode: nil sentence-end-double-space: t fill-column: 70 End: mayavi-4.5.0/docs/source/mayavi/mlab_demo.rst0000644000076500000240000000241312747716313021614 0ustar prabhustaff00000000000000.. _mlab_demo: A demo ------- To get you started, here is a pretty example showing a spherical harmonic as a surface:: # Create the data. from numpy import pi, sin, cos, mgrid dphi, dtheta = pi/250.0, pi/250.0 [phi,theta] = mgrid[0:pi+dphi*1.5:dphi,0:2*pi+dtheta*1.5:dtheta] m0 = 4; m1 = 3; m2 = 2; m3 = 3; m4 = 6; m5 = 2; m6 = 6; m7 = 4; r = sin(m0*phi)**m1 + cos(m2*phi)**m3 + sin(m4*theta)**m5 + cos(m6*theta)**m7 x = r*sin(phi)*cos(theta) y = r*cos(phi) z = r*sin(phi)*sin(theta) # View it. from mayavi import mlab s = mlab.mesh(x, y, z) mlab.show() Bulk of the code in the above example is to create the data. One line suffices to visualize it. This produces the following visualization: .. image:: images/mlab_surf_example.jpg :align: center The visualization is created by the single function :func:`mesh` in the above. Several examples of this kind are provided with mlab (see `test_contour3d`, `test_points3d`, `test_plot3d_anim` etc.). The above demo is available as `test_mesh`. Under IPython these may be found by tab completing on `mlab.test`. You can also inspect the source in IPython via the handy `mlab.test_contour3d??`. .. Local Variables: mode: rst indent-tabs-mode: nil sentence-end-double-space: t fill-column: 70 End: mayavi-4.5.0/docs/source/mayavi/mlab_figures_decorations.rst0000644000076500000240000000731712747716313024736 0ustar prabhustaff00000000000000 Figures, legends, camera and decorations ----------------------------------------- Handling several figures ~~~~~~~~~~~~~~~~~~~~~~~~~ All mlab functions operate on the current scene, that we also call :func:`figure`, for compatibility with matlab and pylab. The different figures are indexed by key that can be an integer or a string. A call to the :func:`figure` function giving a key will either return the corresponding figure, if it exists, or create a new one. The current figure can be retrieved with the :func:`gcf` function. It can be refreshed using the :func:`draw` function, saved to a picture file using :func:`savefig` and cleared using :func:`clf`. Figure decorations ~~~~~~~~~~~~~~~~~~~~ Axes can be added around a visualization object with the :func:`axes` function, and the labels can be set using the :func:`xlabel`, :func:`ylabel` and :func:`zlabel` functions. Similarly, :func:`outline` creates an outline around an object. :func:`title` adds a title to the figure. Color bars can be used to reflect the color maps used to display values (LUT, or lookup tables, in VTK parlance). :func:`colorbar` creates a color bar for the last object created, trying to guess whether to use the vector data or the scalar data color maps. The :func:`scalarbar` and :func:`vectorbar` function scan be used to create color bars specifically for scalar or vector data. A small *xyz* triad can be added to the figure using :func:`orientation_axes`. .. warning:: The :func:`orientation_axes` was named `orientationaxes` before release 3.2. Moving the camera ~~~~~~~~~~~~~~~~~~~~ The position and direction of the camera can be set using the :func:`view` function. They are described in terms of Euler angles and distance to a focal point. The :func:`view` function tries to guess the right roll angle of the camera for a pleasing view, but it sometimes fails. The :func:`roll` explicitly sets the roll angle of the camera (this can be achieve interactively in the scene by pressing down the control key, while dragging the mouse, see :ref:`interaction-with-the-scene`). The :func:`view` and :func:`roll` functions return the current values of the different angles and distances they take as arguments. As a result, the view point obtained interactively can be stored and reset using:: # Store the information view = mlab.view() roll = mlab.roll() # Reposition the camera mlab.view(*view) mlab.roll(roll) .. topic:: Rotating the camera around itself You can also rotate the camera around itself using the `roll`, `yaw` and `pitch` methods of the camera object. This moves the focal point:: f = mlab.gcf() camera = f.scene.camera camera.yaw(45) Unlike the :func:`view` and :func:`roll` function, the angles are incremental, and not absolute. .. topic:: Modifying zoom and view angle The camera is entirely defined by its position, its focal point, and its view angle (attributes 'position', 'focal_point', 'view_angle'). The camera method 'zoom' changes the view angle incrementally by the specify ratio, where as the method 'dolly' translates the camera along its axis while keeping the focal point constant. The :func:`move` function can also be useful in these regards. .. note:: Camera parallel scale In addition to the information returned and set by mlab.view and mlab.roll, a last parameter is needed to fully define the view point: the parallel scale of the camera, that control its view angle. It can be read (or set) with the following code:: f = mlab.gcf() camera = f.scene.camera cam.parallel_scale = 9 .. Local Variables: mode: rst indent-tabs-mode: nil sentence-end-double-space: t fill-column: 70 End: mayavi-4.5.0/docs/source/mayavi/mlab_pipeline.rst0000644000076500000240000001316412747716313022502 0ustar prabhustaff00000000000000.. _controlling-the-pipeline-with-mlab-scripts: Assembling pipelines with `mlab` --------------------------------------------- The plotting functions reviewed above explore only a small fraction of the visualization possibilities of Mayavi. The full power of Mayavi can only be unleashed through the control of the pipeline itself. As described in the :ref:`an-overview-of-mayavi` section, a visualization in Mayavi is created by loading the data in Mayavi with `data source` object, optionally transforming the data through :ref:`filters`, and visualizing it with :ref:`modules`. The mlab functions build complex pipelines for you in one function, making the right choice of sources, filters, and modules, but they cannot explore all the possible combinations. Mlab provides a sub-module `pipeline` which contains functions to populate the pipeline easily from scripts. This module is accessible in `mlab`: `mlab.pipeline`, or can be imported from `mayavi.tools.pipeline`. When using an `mlab` plotting function, a pipeline is created: first a source is created from `numpy` arrays, then modules, and possibly filters, are added. The resulting pipeline can be seen for instance with the `mlab.show_pipeline` command. This information can be used to create the very same pipeline directly using the `pipeline` scripting module, as the names of the functions required to create each step of the pipeline are directly linked to the default names of the objects created by `mlab` on the pipeline. As an example, let us create a visualization using :func:`surf`:: import numpy as np a = np.random.random((4, 4)) from mayavi import mlab mlab.surf(a) mlab.show_pipeline() The following pipeline is created:: Array2DSource \__ WarpScalar \__ PolyDataNormals \__ Colors and legends \__ Surface The same pipeline can be created using the following code:: src = mlab.pipeline.array2d_source(a) warp = mlab.pipeline.warp_scalar(src) normals = mlab.pipeline.poly_data_normals(warp) surf = mlab.pipeline.surface(normals) .. _mlab_data_source: Data sources ~~~~~~~~~~~~~ .. currentmodule:: mayavi.tools.pipeline The `mlab.pipeline` module contains functions for creating various data sources from arrays. They are fully documented in details in the :ref:`mlab-pipeline-reference`. We give a small summary of the possibilities here. Mayavi distinguishes sources with **scalar data**, and sources with **vector data**, but more important, it has different functions to create sets of **unconnected points**, with data attached to them, or **connected data points** describing continuously varying quantities that can be interpolated between data points, often called `fields` in physics or engineering. :Unconnected sources: .. hlist:: * :func:`scalar_scatter` (creates a :ref:`poly_data`) .. image:: generated_images/enthought_mayavi_mlab_points3d.jpg :scale: 38 * :func:`vector_scatter` (creates an :ref:`poly_data`) .. image:: generated_images/enthought_mayavi_mlab_quiver3d.jpg :scale: 40 :implicitly-connected sources: .. hlist:: * :func:`scalar_field` (creates an :ref:`image_data`) .. image:: generated_images/enthought_mayavi_mlab_contour3d.jpg :scale: 38 * :func:`vector_field` (creates an :ref:`image_data`) .. image:: generated_images/enthought_mayavi_mlab_flow.jpg :scale: 50 * :func:`array2d_source` (creates an :ref:`image_data`) .. image:: generated_images/enthought_mayavi_mlab_imshow.jpg :scale: 45 :Explicitly-connected sources: .. hlist:: * :func:`line_source` (creates an :ref:`poly_data`) .. image:: generated_images/enthought_mayavi_mlab_plot3d.jpg :scale: 50 * :func:`triangular_mesh_source` (creates an :ref:`poly_data`) .. image:: poly_data.jpg :scale: 38 All the `mlab.pipline` source factories are functions that take numpy arrays and return the Mayavi source object that was added to the pipeline. However, the implicitly-connected sources require well-shaped arrays as arguments: the data is supposed to lie on a regular, orthogonal, grid of the same shape as the shape of the input array, in other words, the array describes an image, possibly 3 dimensional. .. note:: More complicated data structures can be created, such as irregular grids or non-orthogonal grid. See :ref:`the section on data structures `. Modules and filters ~~~~~~~~~~~~~~~~~~~~ For each Mayavi module or filter (see :ref:`modules` and :ref:`filters`), there is a corresponding `mlab.pipeline` function. The name of this function is created by replacing the alternating capitals in the module or filter name by underscores. Thus `ScalarCutPlane` corresponds to `scalar_cut_plane`. In general, the `mlab.pipeline` module and filter factory functions simply create and connect the corresponding object. However they can also contain addition logic, exposed as keyword arguments. For instance they allow to set up easily a colormap, or to specify the color of the module, when relevant. In accordance with the goal of the `mlab` interface to make frequent operations simple, they use the keyword arguments to choose the properties of the created object to suit the requirements. It can be thus easier to use the keyword arguments, when available, than to set the attributes of the objects created. For more information, please check out the docstrings. Full, detailed, usage examples are given in the next subsection. .. Local Variables: mode: rst indent-tabs-mode: nil sentence-end-double-space: t fill-column: 70 End: mayavi-4.5.0/docs/source/mayavi/mlab_pipeline_modules.rst0000644000076500000240000000202012747716313024217 0ustar prabhustaff00000000000000 Modules and Filters -------------------- For each Mayavi module or filter, there is a corresponding `mlab.pipeline` factory function that takes as an input argument, the source on which the new module or filter will be added, and returns the created module object. The name of the function corresponds to the name of the module, but with words separated by underscores `_`, rather than alternating capitals. The input object, if it is a data source (Mayavi data source or VTK dataset), does not need to be already present in the figure, it will be automatically added if necessary. Factory functions take keyword arguments controlling some properties of the object added to the pipeline. For instance, the `ScalarCutPlane` module can be added with the following function: .. autofunction:: mayavi.tools.modules.scalar_cut_plane As the list is long, we shall not enumerate here all the factory function for adding modules or filters. You are invited to refer to their docstring for information on the keyword arguments they accept. mayavi-4.5.0/docs/source/mayavi/mlab_pipeline_reference.rst0000644000076500000240000000113612747716313024514 0ustar prabhustaff00000000000000.. _mlab-pipeline-reference: Mlab pipeline-control reference -------------------------------- .. module:: mayavi.tools.pipeline Reference list of all the main functions of ``pipeline`` sub module of ``mlab``. You can access these functions using:: mlab.pipeline.function(...) These functions can be used for finer control of the Mayavi pipeline than the main mlab interface. For usage examples, see :ref:`controlling-the-pipeline-with-mlab-scripts`. .. toctree:: auto/mlab_pipeline_sources.rst auto/mlab_pipeline_tools.rst auto/mlab_pipeline_data.rst mlab_pipeline_modules.rst mayavi-4.5.0/docs/source/mayavi/mlab_running_scripts.rst0000644000076500000240000001014412747716313024117 0ustar prabhustaff00000000000000.. _running-mlab-scripts: Running mlab scripts --------------------- Mlab, like the rest of Mayavi, is an interactive application. If you are not already in an interactive environment (see next paragraph), to interact with the figures or the rest of the drawing elements, you need to use the :func:`show` function. For instance, if you are writing a script, you need to call :func:`show` each time you want to display one or more figures and allow the user to interact with them. Using mlab interactively ~~~~~~~~~~~~~~~~~~~~~~~~~ Using IPython_, mlab instructions can be run interactively, or in scripts using IPython_'s ``%run`` command:: In [1]: %run my_script You need to start IPython_ with the `--gui=qt` option. In this environment, the plotting commands are interactive: they have an immediate effect on the figure, alleviating the need to use the :func:`show` function. .. _EPD: http://www.enthought.com/products/epd.php Mlab can also be used interactively in the Python shell of the mayavi2 application, or in any interactive Python shell of wxPython-based application (such as other Envisage-based applications, or SPE, Stani's Python Editor). Using together with Matplotlib ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ If you want to use Matplotlib's interactive plotting with Mayavi's mlab in IPython you should: * start IPython with:: $ ipython --matplotlib=qt * alternatively, start IPython with the `--gui=qt` option:: $ ipython --gui=qt and **before** importing any matplotlib modules, enter the following Python commands:: >>> import matplotlib >>> matplotlib.use('Qt4Agg') >>> matplotlib.interactive(True) * one could also use the ``--pylab`` option to IPython as follows:: $ ipython --pylab=qt If you want matplotlib and mlab to work together by default in IPython, you can change you default matplotlib backend, by editing the `~/.matplotlib/matplotlibrc` to add the following line:: backend : Qt4Agg If for some reason, the Qt backend does not work, you can use the wx backend. To do this you may do:: $ ETS_TOOLKIT=wx $ ipython --gui=wx Note that as far as Mayavi is concerned, it chooses the appropriate toolkit using the ``ETS_TOOLKIT`` environment variable. If this is not set, the supported toolkits are tried in a version-dependent order until one succeeds. With recent releases of traitsui_, the default is Qt. The possible options for ``ETS_TOOLKIT`` are: - `qt4`: to use the Qt backend (either PySide or PyQt4), - `wx`: to use wxPython, - `null`: to use no UI toolkit. .. _traitsui: http://github.com/enthought/traitsui .. topic:: Capturing mlab plots to integrate in pylab Starting from Mayavi version 3.4.0, the mlab :func:`screenshot` can be used to take a screenshot of the current figure, to integrate in a matplotlib plot. In scripts ~~~~~~~~~~~~~~~~~ Mlab commands can be written to a file, to form a script. This script can be loaded in the Mayavi application using the *File->Open file* menu entry, and executed using the *File->Refresh code* menu entry or by pressing ``Control-r``. It can also be executed during the start of the Mayavi application using the ``-x`` command line switch. As mentioned above, when running outside of an interactive environment, for instance with `python myscript.py`, you need to call the :func:`show` function (as shown in the demo_ above) to pause your script and have the user interact with the figure. .. _demo: :ref:`mlab-demo` You can also use :func:`show` to decorate a function, and have it run in the event-loop, which gives you more flexibility:: from mayavi import mlab from numpy import random @mlab.show def image(): mlab.imshow(random.random((10, 10))) With this decorator, each time the `image` function is called, `mlab` makes sure an interactive environment is running before executing the `image` function. If an interactive environment is not running, `mlab` will start one and the image function will not return until it is closed. .. Local Variables: mode: rst indent-tabs-mode: nil sentence-end-double-space: t fill-column: 70 End: mayavi-4.5.0/docs/source/mayavi/modules.rst0000644000076500000240000000734112747716313021352 0ustar prabhustaff00000000000000.. _modules: Modules ~~~~~~~ Modules are the objects that perform the visualization itself: they use data to create the visual elements on the scene. Here is a list of the Mayavi modules along with a brief description. :Axes: Draws simple axes. :ContourGridPlane: A contour grid plane module. This module lets one take a slice of input grid data and view contours of the data. :CustomGridPlane: A custom grid plane with a lot more flexibility than GridPlane module. :Glyph: Displays different types of glyphs oriented and colored as per scalar or vector data at the input points. :GridPlane: A simple grid plane module. :HyperStreamline: A module that integrates through a tensor field to generate a hyperstreamline. The integration is along the maximum eigenvector and the cross section of the hyperstreamline is defined by the two other eigenvectors. Thus the shape of the hyperstreamline is "tube-like", with the cross section being elliptical. Hyperstreamlines are used to visualize tensor fields. :ImageActor: A simple module to view image data efficiently. :ImagePlaneWidget: A simple module to view image data along a cut. :IsoSurface: A module that allows the user to make contours of input volumetric data. :Labels: Allows a user to label the current dataset or the current actor of the active module. :OrientationAxes: Creates small axes on the side that indicates the position of the co-ordinate axes and thereby marks the orientation of the scene. Requires VTK-4.5 and above. :Outline: A module that draws an outline for the given data. :ScalarCutPlane: Takes a cut plane of any input data set along an implicit plane and plots the data with optional contouring and scalar warping. :SliceUnstructuredGrid: This module takes a slice of the unstructured grid data and shows the cells that intersect or touch the slice. :Streamline: Allows the user to draw streamlines for given vector data. This supports various types of seed objects (line, sphere, plane and point seeds). It also allows the user to draw ribbons or tubes and further supports different types of interactive modes of calculating the streamlines. :StructuredGridOutline: Draws a grid-conforming outline for structured grids. :Surface: Draws a surface for any input dataset with optional contouring. :TensorGlyph: Displays tensor glyphs oriented and colored as per scalar or vector data at the input points. :Text: This module allows the user to place text on the screen. :VectorCutPlane: Takes an arbitrary slice of the input data along an implicit cut plane and places glyphs according to the vector field data. The glyphs may be colored using either the vector magnitude or the scalar attributes. :Vectors: Displays different types of glyphs oriented and colored as per vector data at the input points. This is merely a convenience module that is entirely based on the Glyph module. :Volume: The Volume module visualizes scalar fields using volumetric visualization techniques. :WarpVectorCutPlane: Takes an arbitrary slice of the input data using an implicit cut plane and warps it according to the vector field data. The scalars are displayed on the warped surface as colors. mayavi-4.5.0/docs/source/mayavi/overview.rst0000644000076500000240000002043212747716313021544 0ustar prabhustaff00000000000000.. _an-overview-of-mayavi: An overview of Mayavi ===================== .. topic:: Section summary This section gives a quick summary of what is Mayavi, and should help you understand where, in this manual, find relevant information to your use case. Introduction ------------- Mayavi2 seeks to provide easy and interactive visualization of 3D data, or 3D plotting. It does this by the following: * an (optional) rich user interface with dialogs to interact with all data and objects in the visualization. * a simple and clean scripting interface in Python_, including ready to use 3D visualization functionality similar to matlab or `matplotlib`_ (using :ref:`mlab `), or an object-oriented programming interface. * harnesses the power of VTK_ without forcing you to learn it. Additionally, Mayavi2 strives to be a reusable tool that can be embedded in your libraries and applications in different ways or be combined with the Envisage_ application-building framework to assemble domain-specific tools. .. _Python: http://www.python.org .. _VTK: http://www.vtk.org .. _Envisage: http://docs.enthought.com/envisage .. _matplotlib: http://matplotlib.sf.net What is Mayavi2? .................. Mayavi2 is a general purpose, cross-platform tool for 3-D scientific data visualization. Its features include: * Visualization of scalar, vector and tensor data in 2 and 3 dimensions. * Easy scriptability using Python. * Easy extendibility via custom sources, modules, and data filters. * Reading several file formats: VTK_ (legacy and XML), PLOT3D, etc. * Saving of visualizations. * Saving rendered visualization in a variety of image formats. * Convenient functionality for rapid scientific plotting via mlab (see :ref:`simple-scripting-with-mlab`). Unlike its predecessor Mayavi1_, Mayavi2 has been designed with scriptability and extensibility in mind from the ground up. Mayavi2 provides a ``mayavi2`` application which is usable by itself. However, Mayavi2 may also be used as a plotting engine, in scripts, like with matplotlib or gnuplot, as well as a library for interactive visualizations in any other application. It may also be used as an `Envisage`_ plug-in which allows it to be embedded in other `Envisage`_ based applications natively. .. _Mayavi1: http://mayavi.sourceforge.net Technical details ................... Mayavi2 provides a general purpose visualization engine based on pipeline architecture similar to that used in VTK. Mayavi2 also provides an `Envisage`_ plug-in for 2D/3D scientific data visualization. Mayavi2 uses the Enthought Tool Suite (ETS_) in the form of Traits_, TVTK_ and Envisage_. Here are some of its features: * Pythonic API which takes full advantage of Traits_. * Mayavi can work natively and transparently with numpy_ arrays (this is thanks to its use of TVTK_). * Easier to script than Mayavi-1 due to a much cleaner MVC_ design. * Easy to extend with added sources, components, modules and data filters. * Provides an `Envisage`_ plug-in. This implies that it is: - easy to use other Envisage plugins in Mayavi. For example, Mayavi provides an embedded Python shell. This is an Envisage plug-in and requires one line of code to include in Mayavi. - easy to use Mayavi inside Envisage based applications. Thus, any envisage based application can readily use the mayavi plug-in and script it to visualize data. * wxPython/Qt4 based GUI (thanks entirely to Traits, PyFace and Envisage). It is important to note that there is no wxPython or Qt4 code used directly in the Mayavi source. * A non-intrusive reusable design. It is possible to use Mayavi without a wxPython or Qt4 based UI. .. _ETS: http://code.enthought.com/projects/tool-suite.php .. _Traits: https://docs.enthought.com/traits .. _TVTK: https://docs.enthought.com/mayavi/tvtk .. _MVC: http://en.wikipedia.org/wiki/Model-view-controller .. _numpy: http://numpy.scipy.org .. note:: All the following sections assume you have a working Mayavi, for information on downloading and installing Mayavi, see the next section, :ref:`installation`. Using Mayavi as an application, or a library? ----------------------------------------------- As a user there are three primary ways to use Mayavi: 1. Use the ``mayavi2`` application completely graphically. More information on this is in the :ref:`using-the-mayavi-application` section. 2. Use Mayavi as a plotting engine from simple Python scripts, for example from Ipython, in combination with numpy. The ``mlab`` scripting API provides a simple way of using Mayavi in batch-processing scripts, see :ref:`simple-scripting-with-mlab` for more information on this. 3. Script the Mayavi application from Python. The Mayavi application itself features a powerful and general purpose scripting API that can be used to adapt it to your needs. a. You can script Mayavi while using the ``mayavi2`` application in order to automate tasks and extend Mayavi's behavior. b. You can script Mayavi from your own Python based application. c. You can embed Mayavi into your application in a variety of ways either using Envisage_ or otherwise. More details on this are available in the :ref:`advanced-scripting-with-mayavi` chapter. .. _pipeline_model: Scenes, data sources, and visualization modules: the pipeline model -------------------------------------------------------------------- Mayavi uses pipeline architecture like VTK_. As far as a user is concerned this basically boils down to a simple hierarchy. * Data is loaded into Mayavi and stored in a **data source** (either using a file or created from a script). Any number of data files or data objects may be opened. Data sources are rich objects that describe the data, but not how to visualize it. * This data is optionally processed using :ref:`filters` that operate on the data and visualized using visualization :ref:`modules`. The filters and **modules** are accessible in the application via the `Visualize` menu on the UI or context menus on the pipeline. They may also be instantiated as Python objects when scripting Mayavi. The reasons for separation between `data source`, the data container, and the visualizations tools used to look at it, the `modules`, is that there are many different ways of looking at the same data. For instance the following images are all made by applying different `modules` to the same data source: |volumetric_cut_plane| |volumetric_contour3d| |volumetric_volume_tweaked| * All objects belong to a `Scene` -- this is an area where the 3D visualization is performed. In the interactive application, new scenes may be created by using the `File->New->VTK Scene` menu. .. |volumetric_contour3d| image:: volumetric_contour3d.jpg .. |volumetric_volume_tweaked| image:: volumetric_volume_tweaked.jpg .. |volumetric_cut_plane| image:: volumetric_cut_plane.jpg Loading data into Mayavi ------------------------- Mayavi is a scientific data visualizer. There are two primary ways to make your data available to it: 1. Store your data in a supported file format like VTK legacy or VTK XML files etc. See `VTK file formats`_ for more information on the VTK formats. These files can be loaded in the interactive application using the menus. 2. Generate a TVTK dataset via numpy_ arrays or any other sequence. This is easiest done by using the scripting APIs, for instance `mlab` (see the paragraph on :ref:`creating data sources with mlab `, or simply the 3D plotting functions: :ref:`mlab_plotting_functions`). Alternatively, if you wish to gain a deeper understanding by creating VTK data structures or files, more information on datasets in general is available in the :ref:`data-structures-used-by-mayavi` section. .. _VTK file formats: http://www.vtk.org/VTK/img/file-formats.pdf .. _numpy: http://numpy.scipy.org .. _VTK: http://www.vtk.org .. Local Variables: mode: rst indent-tabs-mode: nil sentence-end-double-space: t fill-column: 70 End: mayavi-4.5.0/docs/source/mayavi/pipeline.rst0000644000076500000240000001210312747716313021477 0ustar prabhustaff00000000000000 .. _organisation_mayavi_visualisations: Organisation of Mayavi visualizations: the pipeline ==================================================== .. topic:: Mayavi and VTK pipelines Mayavi uses `VTK `_ for all its visualization needs. A pipeline concept underlies all the visualization in VTK. However, it is important to note that the pipeline used by Mayavi does not correspond to the VTK pipeline creating the visualization: the layout is different, the objects are not the same, and there are more nodes in a VTK pipeline. The two pipelines share some similarities, but in this section, we are only concerned by the Mayavi pipeline. Anatomy of a Mayavi pipeline ------------------------------ Layout of a pipeline ..................... * The top node of a Mayavi pipeline is called the `Engine`. It is responsible of the creation and destruction of the scenes. It is not displayed in the pipeline view. * Below the `Engine`, you find `Scenes`. * Each `Scene` has a set of data `Sources`: they expose the data to visualize to Mayavi. * `Filters` can be applied to the `Sources` to transform the data they wrap. * A `Module Manager` controls the colors used to represent the scalar or vector data. It is represented in the pipeline view as the node called `Colors and legends`. * Visualization `Modules` finally display a reprensation of the data in the Scene, such as a surface, or lines. Navigating in the pipeline ............................ Each object in the pipeline has a `parent` attribute that points to its parent in the pipeline, as well as a `children` attribute, giving the list of its children. The `name` attribute of the objects gives the name of the node as it appears in the pipeline view. The edition dialog to modify graphicaly the properties of an object can be displayed by calling the `edit_traits()` method of this object. In addition, Mayavi pipeline objects can only be in one scene, and their `.scene` attribute point to this scene (see the :ref:`example_volume_slicer` for an example of how the data can be shared between scenes). The link between different Mayavi entry points ------------------------------------------------ Every visualization created in Mayavi is constructed with a pipeline, although the construction of the pipeline may be hidden from the user: * The easiest way to make a Mayavi visualization is to create a pipeline via the user interface, as, for instance, exposed in the :ref:`Parametric surfaces examples `. * The :ref:`mlab 3d plotting functions `, create full piplelines, comprising sources, modules, and possibly filters, to visualize numpy arrays. Displaying the :ref:`pipeline view ` is the easiest way to understand what pipeline was built. * Pipelines can also be built node-by-node with mlab, using the :ref:`mlab.pipeline functions`. The name of the functions to call can simply be deduced from the names of the pipeline nodes as they appear in the pipeline view. * The objects composing a pipeline can be instantiated and added to the pipeline manually, as exposed :ref:`further below `. A pipeline example examined ------------------------------------------------ Let us study the pipeline created by the `mlab.plot3d` function to represent lines:: import numpy as np phi = np.linspace(0., 2*np.pi, 1000) x = np.cos(6*phi)*(1 + .5*np.cos(11*phi)) y = np.sin(6*phi)*(1 + .5*np.cos(11*phi)) z = .5*np.sin(11*phi) from mayavi import mlab surface = mlab.plot3d(x, y, z, np.sin(6*phi), tube_radius=0.025, colormap='Spectral', opacity=.5) .. figure:: images/pipeline_and_scene.jpg :align: center The `mlab.plot3d` function first creates a source made of points connected by lines. Then it applies the `Stripper` filter, which transforms this succession of lines in a 'strip'. Second, a `Stripper` filter is applied: from the 'strip' it creates tubes with a given radius. Finally, the `Surface` module is applied to display the surface of the tubes. The `surface` object returned by the `mlab.plot3d` function is that final `Surface` module. Let us have a look at the data in the pipeline before the tube filter was applied. First we retrive the `Stripper` filter:: stripper = surface.parent.parent.parent Then we apply on it a `Surface` module to represent the `strip`:: lines = mlab.pipeline.surface(stripper, color=(0, 0, 0)) .. figure:: images/pipeline_and_scene2.jpg :align: center All the properties of the different steps can be adjusted in the pipeline view. In addition, they correspond to attributes on the various objects:: >>> tubes = surface.parent.parent >>> tubes.filter.radius 0.025000000000000001 The names in the dialogs of the various properties gives hints to which attributes in the objects they correspond to. However, it can be fairly challenging to find this correspondance. We suggest to use the :ref:`record feature ` for this purpose. mayavi-4.5.0/docs/source/mayavi/poly_data.jpg0000644000076500000240000003424312747716313021627 0ustar prabhustaff00000000000000JFIFHHC  !"$"$C@"T  !"1A2Q#a3BRq$VWT&46CDSbds%5EUc !1QABa ?5#ECVdx/s A%c;Az+Φx)i8 I#ZƁOz"lf[D6Ym6+u9 V;#elÿaMQxQim-Xdu a8ҵH챯$Ȕe}li1{뙎LZ-V8CKO(h?nnکKb[X-4;LfeZ/d׉P45>jG7ڗv;醁iѮa~dwH@T+:YZкPi;3#-iW;N'gk: (^ʊ+MXjo ۭOoLii.&A̹)F:nTxףv{v eBAؼzSAtŊClgFOk>i^7Ν!{}/jn[#{^&ݓLY,O>!rٽbyK+[cȡyǽCƴ@jx: NU]Mm k^ciFKw[i?^5 Ӱ{G7>~Ivǚ_\;f!iCuњzb5 7mS%pl­eW+M k$ӥ l64Z ?$߯6 [El^%M\68U;|zkFM2Lq4~cCNྛ'F,u[7=٭)Qv4w"u'Xك'Gq _1V}pXh:މZ;V](xYqB{ B\v5WPˇMdqq]Q,KAB9 q\WW.1nبmK;6=K'nhsF; գ ej|BۋD6OMCZuGcK9ik*o )`mu{1-F4 =RS>?Ӭʥ?߯ƣV]Zy;("Fyg+-ꛍ}DtԔy\]]f;uޞH{iѷIlcm>zsfռҽW/Fsߌ뙚c=9<>?Þfɡx4?v /K5RcQq@_?3v5?i\Q=49!|2Fp/6.bȊkݳOR])`swn;I.J"ήtUJ1p٩b@æT@ӎ+|bMYgwdMR{2oG[ LĿOzrO]4ښ9b;֤syz%J=/ų*Ȯ1UZ S^Sjx7Ӂ'F[[fT ϱ|WE8LRG@7vH$z3&QGlk%#cv}0w v'uk2 dlOs[|8;ZHAa(Pzdx[iw;ao=h8ϧ?Pu?L}im -tc^ڕ`=30-'\3*[;>gb6@ oKYE~P孝5ҾNڋ]C"BIkgGpz/qdTڡv+;uZ=i;^Ut)뫪a4Hleq9$}XpS+o3wEAL]"!K8llʁ9PauJ&!>IL+8~>ϖY .4uUA[shḣ;7GycvJh"E ~# @s'\ hЕ5.+ƢxM#"6p k@$@O]Da\o [Uǣ|ݦO;Ei,3ՊSZCb6ɦnsM\Ѩx:=QF!zq6qFqANzeASu9>P<7Fxq0DXָr{Y("A.1ywXktacK swQ2(IM 1X ed:с1{N,b@RE@w}`ZCvZfXV+cìة<̳S+)ey>hf֜Lu~SIN.hu4~;ˋ\N&rb<쪱<ߡ7|`_rP]p&y#q*4z3:]L-Nۄ(Ncf{[zuz롾r xq63f?@%@KX"Y(hkƀִ zs>غD{{ lM^*5=uWZF;G=xnx+ 21iTsy}%ά/ipKG;o;+1ж]=[Ē7RIW9xhaE>[i4ii4AUmӧ7lR[I)osJvb\pd#mnƶM&!8Rmy|-F=R}j_IB]4{=5-kCG gWӿªHe~Dt-.8Sg${a(.VBaYl5N6zokOO(78+k~5l֬Wc]n<A4A d^uuZ.8,,OM[[7ޜJZxVU֎S+{PBo^⊫ݫW_*CiϷ>鴵Nod;ثM9 6XXpik }auQV=CGv#ޫHCp5oiܕuz+0LInh[XQ&OkڲZR}l#br; lm'[>g`6OUdVs&gkKCچ g{w }ũn2*\;~ý(O햀6UϷ+UT=_窙%:D,tskx13HR_=G*ѣ*zxXQ05h^Y ~`Y@jd,@-=3[ݒ O(gC1˹qs@{w8˱*Gpe7x1' qyt"œ>+wLDΦg=I)MCq+e5739pcc=iR^eb]-ܨ]7ICL|8A4KxرhD;Q)$[|/w%eH[i4Q_-M ij4F>tW]ק7\V6Aj-rZzlwkG0HG%kk"בacE+G֭d.ޓGA l)>=Xq}};*9= 8Ȑ6Dz5ʜfI Nhɪ[HceZV;kh`|S {?-`Qܨ')429i iEW[Jmwzp:t7_%:l`$g5JjZ)k⩥3H4ZAX^4#aU4u!uj +c{iᒟq X4#b|3ca94A[,.ة!!skGe%׌]j)^LbR\CȪn5&gݒs#:4=V[VْZ%(n4̨P7~N`b[z;dDGQU}vno~!V2L5Pmz<[8'RN֩~:ܤ '>(Z+,7sV;^5Pl`II䮘 uz  .v>˗V6 c:Lg$F<[6;ꯖ jH˭3$w9 tJ6]ԋ2%# -VBA~{Zx!Yaw틤{1*m$8S!,O$C!ΓJ2Ζt,k,k4 FEm/{ցI>.wJsqı6~GriF|*Fl|25mcjU?Ѳ/6YPF$MZ ϰHijT]"IetZFM-W9- F>갽t':U] gk,ӂmм?+KKZ}L_nT9TM&KM~?ᙞ)*5axkkg> Aa3/K ˛WMowVF8TcDtHYeNڨ))&*itsE+#4湧$U_ I+s##s$Rgf> mXXՐZ)K=‚OØty#خ[#oë{[󨙿?v͸pF׆t KyfkrvWc{)acCˉl>2bTҺaw=AOwwUNmh=Ѽy٣vJ`L5KlضZk4 yfgNSp{4~L-Vjw|r3`s}BC^1k4>J|[TU`5k4W4ri񏃗7mҿɾ)s3}eoKV?ydVh.jk<.cGCWK_Cu DU4$hFÁGUUm-wI+g)&rlq۪i9u>_/hsUl۩6jclOÙ#p#.snﳞ\0i| ŻշF~GW:e8+cw٪#%epD臍G6Ϣ.+FW@:p"2[$dl߾Gþ$" ""mf#3: HV&.-9ݏXkz }ED1drO<V^r\n}Xɩ#cYnۭm;?~,:.pǓ~2kV۱+:6o8%l8]lkiYE:Z0)*;m%Ucc@%v;PI +ԋMr-W*"C7kdHRfE{]+)`Զ{drL~oGvuKQ6sNj:OK,/q DwvI%ttDe,dZedcIKұ/yXeClVT2@@ҹ+,QX [u$R@. iwh߹ևB}vAv^2jo-TWLoUH`ܪ/48_~I$G7{3`h}#E>GSJ}{]SCyUm"PU??ՍC}Ԃטb7]~Klu: pOm)]&7 x޶ӵM-},-Z4ԨƖ4ijTkKW౥kkYd4*2\oVnh?F3GA*i^2wbk[ixwQ噜;; sVQbSUbu2:k͎\GURrҘg8v?Z?&d Vjw|r3`sqҿEN_GaglCަ1Fy\6TTұ]=-[ m\bX'k}G<Yb7I>6@.H+ryYhRe׳sUVZ@cݾ \Gl'|Ef|5zEGYOV8: 1KN}Թi@՚Vb,oFFy4q48ݴ-%ÏOSy44'\Aݭ!m[(Lp<Lt-mSt9gJNsֽ@@_=ʺorI@h.qQr>':CcKJoAohbԓWZ--N˅}AwOy6lvWGArW$Nǹd!o=1c@`$ ,y +{0΂詬d͑>5\88Ome*O5E'o}h f@1dEc.8UuI]qc5Έ3CRlY-4P7zhlރZ}YxŽk-\tt0D駖8bh۞~Uqu˧6ʡAo˒o@#&4u&[x3 M[׸>v[:<-K2?^qw*z}yz{̚rm>]hU$[Eˏ6JʗENǤw0Sjkl/?oGEXq\oHtSOJ֍GU 64u#Ƨ;X҆;ķXmSRkG6u.E%b3 3%g?u&g\ѴrOTuݭ'^P/4z~Sa?.wB>t~Gizߛ{WۧHOu:%Ճ!wOnSqQz߉4 Z:?t:E~;ڟ]'m@7 ':~KE3e*9cgx  cBtA?ҿG˅$벪-~=Ԃ}/k @Ƈy\cC+Hka0fLDhZpoG uU_M'sI Em,76ov֐u=S$C'WI9 6_V$?r4.q~/t6{kw|8py ~XдKiMoQ&iO#5 륷}.q|?[Pu ߺrb<70 G @]\A?hO[bA}]_ϧ~N?C"^i{@]7{?e=?Q|BS7_l|k%M*\/s7q%|?ځ[s k47xBWˏV[dy4d=7I%WT]}ܭ>i6MA<[cK>`L>jOwV6Զ QS#-;c`p  ؟Qlv9Y+*mBەsٕ9{I AWL#K] 6t|*x7q[.0R駞g( sI?%Pt7+:~&i1z9Z+nI9 ŧKn\.ۥ{l-1n{r.t;!Z0CcdQF1hg1Qg*Y-]t8쁿AoOeĠdpUS7oM[77[p`5MgdEڢ>q5D0l:e7`%|3a.u?_napʆ~PA%}8$hiM v]*ê  !ĭB;[3t{[mRt„4M^*_Ӈyh QR$_ *ZZ8hᦦ8h5^,eKj|UCx˭a 45A|'yAGzp+ n/FO:bx9.OT|lՕLwUa7Y┢jdܻk^ԝ-u['p.Պ$>s=z=~kRuu=rLPϬPјh@.y^Eyy ^rn={=F[r*Zة-T4477@^ OR/^\OoU4z#sz)c)Y2R e`6KŏҚ[ jGGLZ8c_H 8Wzgջ*dJ,r~P{$qWR#SF6MxAmE5C;>PZӽ ߿v&3b 1ng4Tq\wZ<Ϻ"7ad,{ZPF /4?aatnik ctAgPvzD1rVɏ^7:3lb 7+YQ+?~{l. `|g&G` "G` ^]x*zwZ)οDzm_O'5?CҞ=Rlt-~YaTS4AwGPzmlh}7a ~ti;ӬqZtM`/?ΐ'XwOyb-+_>']eV}5#ּ2°g :׋YmToI$7Y.-ʖCfOll;s:S ,68ArI>~uvm*z֊LZ%^5-F٪LnĬc{Y/i{>;)[3[=SL`ևMhߺzֻUvn#ӟ5{c+(YNcS.ŜBD {d)%xi^XJI>o ^YB뽮4T[V[XCI~>4 =oK_= S?:lZG: }TVO۞{A C"61h k@@%+cF,W P<,9 |}W/}=Phn,ݫQJd@i&]tۭTOWR㚦f{@ ۱+hpT/|%PZpZˠ#X}D1#5UgX)%f!Ě,N;OK=Xx^nXhĬxE+>QІ.ZT?|u{ uSkԻ~}Z͘]]I i~)Ӽ؍h~!9$ˤ?3-LczK\ Y_IeDm84wR}"d?%5+c8sҋ}Ckk1S%cwy,?Z{M{] ¥lM>{_j"(?38z 5]nc>hCˢ4.ԌMTtz]cµ bi6C5x'W{߮Η^9Uos웨VVWM|s! 8y6[~UӆR7{$n$p~DYGH|j,Q>Xy%ۘD4J:Zj*fRMcL&5^b" """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ """ mayavi-4.5.0/docs/source/mayavi/rectilinear_grid.jpg0000644000076500000240000005152012747716313023156 0ustar prabhustaff00000000000000JFIFHHC  !"$"$C@"O !1A"2Q#a$3BRqC%b57Dcrstv46F(8ST"1!"ABQa ?.Xx魚X/'8mǙ3xAH-T$KIqGZ][:wfwuHt(?LqM+ZJp*ƵMy3vH}̗<-[ Hd 쯐3fK9^U}nRq!B:4R:֪džSzkYnsav닻GGz/x{@/gͼ^NgM8,5qcv&EW;K+F#c dJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJRJfY+rgeHZԄov 6GIlutzy[`mU `ۥ%$A)[g D+LRut37rSEzH$IVU^ )e_U3` u'e; VN@>*W<3ۛN $DsB0Fԗu,5޿]X,X5C٭Wrۇ %J$ ȫuT3'Gwna{Y +_V47i^loU_}#)ND?G~cN~b]&WkGcDkS6'NN{e|7lTÅ$Jߏ5<1ܺCB_#~R"RM! ;Ǔ> ISO7wZzvŤk* -xH_L(G@\ܺΗ-+b.du=ͺбpEvmR R R R R R R R R R R R R R R ^.v5 e܇G%e:A P;H' |Z|*ժ?fNĆ3)Iyij$κg$tKm~͟`g6lk~&or[:joGI}XV$'GZZQؗҘiIC8' GT[EĸȊOC)*PGjX\ܺa)A'bsDVR_VO:$Tϭ9A?*[V-˷I.ȵ+F?8l@tul#Phz6ǛYXT"]2Ұfy],2:+߀ =M3eV{=~?A;s?]gZRUR R R R R R R R R R R R Rr",R=T[$ o2HR ~dTxQ+a!1. JlڱSVClf`٤Ib|WbS%CTَâ8ېE6rTK~e{¦5gbTу0|2S˪) 芳 Z ZO|7a͎ԘΧƝ@RT>5ZNI2r LIJ)©0|[Q޼ۮ?RZG&善]l322$!^RO)#[&V+(G z%A$VZ[Ở"'AG;:-+:ҲxTg9;IFu!QEt&:Cy<|T]-)^7 rnd6 E[cҔڒdx#OS'PE+@ lJgQ+ElNv s- jJ[pi =2JaDso#s'mWx>9ָ͢STͩpR&չ*1Xdv;qb\sC~U'[<7<,O.Q9*yO(#o63tj|`;AJ^(ZT7":mn^v uJؾWtgtr~a|ZKяKKznի2ۍOllݞ=f< W7[l{[3!@qXR<6}ugSS)PJRJRJRJRJRJRJRJRJRJRJRTy;cYɭlZad- ם Gu~wڇHSs[n-78iN(h3Yu+4(Y>|.,9LYr!Gg:PڼXN|"/ɚHR] ǨÃ{Z eCF*[*+%v?icq{8WҘUx>O$F:*_J۰K!()%N1Gj)/+4t:bV%Fv;PPhaWuo[j %ԏJ~ó*cH> .>j5q[[j6JkkK`!cI`TYM&FeC 6=OfB)e%tOfdg|H>P 5@~ɰ{21{&CC|J'k3ABc+"M;]G­>uS6z-SΫڗ5JVj\1JcUڗ6̭CciP<A*ӻ3q~ҫ걹O,&.&,R?Vy8Vmk9d{zfڴllzҏwrU7اY XQ-6$+ =*<|VևRVRՋw.rM8ضK].:\tގOغ^)~L&~`? })'H;H׏NyEҠ]='LUɲ dz]Zx$$JNzRRRRRRRRRRU!dOڗ|ZPp? }S0rtAp{6)_ӰqƪټӸ+`C*G]RǗҘiIC8' G_<{oe9ɡJnJ$)J[ݣk身ͬtV=dRd7^-V$ GxRW>LUS[㤌6x[wZO/=ZT}ۏ-Vl-*&ӬjJN5ȬО-S#`D4ElkIU_צ؛b6(!m~ q*(uBX*ALbN%MO5ScYed&髉ؘ! ^l0S%T~[22- 3jLWi5C`IPP>ANtҗcd tX׈DH\P6T BGowsꪫIJ\=J"]'WQ1q:ܶ2葲SAo8K_ R?xHI7V Y3Dͩ%ۈjRJvVat=[W> jDyѷ2>'+G5c‹ 6aŒh 6,! # f?Ҭ&[*><`[lca't@8IqRK+tnVxGxYHTgb:;9GCGFx>scqvɎ$ۦ'Ӓ:<OQ<d7;]?1nHnK'|_ҭ68F2<[BJyGFG_ѥyL:3a>܈ -VҤUY:һz-yښci^5U^D~c9mɍN,4MڣңڧЮ.6[Sn!+BJ|>Vj=.=5vsv.+AUa'd'jFmPqYwg̿SԶ?T?R;Wkw]l~wt'XD͵%ԕ@'`+5Efꭋ)*>4s$hVrQ8?QVg_?)WT)@)@)@)@)@)@)A@`/jt)쟌xVGY:K1wmiZvk?Uћ򼓛ST+ I) F>U:EY*~&eeQIӤ)R@RT$Ttiʄxgwo>?*]@pI/Lw4RJBݠHzE;#]]:䲰j/ha?zsq[~Aag[^aOn$YSnud$۱nTJoG͠L:2&\RT>I S5:]7x JߖArx|˘BIvުlAa~ԋ8͢!daR7'J#}BK8 XʵcApCw;1iwV ׻gM"}D=Y~WY)R U}!v,wk\uo4EAkgINߨY͢KH[ֿ*~Jt WvAՎBBRGK"I#ta;>HO;UknbmȒ̬- IyOE(kk4>.d)o]}١K@a0l}%;>?MȠG'mN-Hel>ichZB +)%2Yv^?){(!,>o02K͋&}g !P|8G)s5,td7vDy5zrc+prTi*!f?JYqАKCt5V澟nGSLmm d:V6_Gp߱b4Get:$&ךD v5R{%0/=Mb)ZsJ.F⫮^n8g~>^bE+T\JRNdv;6% |DqPRIUx`)CmE=-rL?xyG-~郑nPlm? ⷙoVݴߢR=fN΍?SZ{9ٮEWlKi;ۅvvQy,L5"vBg[&'Du{?8:>-`lƸ-cp.З"9#+`Egͯ͌sï+Ad`jQ@S#Wۿ節3Uo IB@ZNHZ>i#bSU=ikUT=CHfRPyurGZ]^=b83>W:ExѸ3%͘pp=:5:ecU_!H$i증V9NO7Z|6o[ޟ{)*P f]-a#.ØI[:mJ`VlnَW][{l0 *Z)K>H'@Lқ4~r jfsiI@ QI$鵺wNI~rr?J\t}|;Ca* 'ܡUViN6X̒7Y<(60?RF30s rqT{pK;R'Cg@*@+5Q~F(+Y6APt4B}G$5iUi#W_xSNHe y ;;uoF"mm mH)H{ )^)@)@)@)@)@)@)AFmز^R[o‘%_ڔJO^^׊`Y4] ]piHᵀ6Z6Bs +lrJy:x'z@Uܘ_>yM-;hWvʙuUՇ&wxئxyCrjgb99unmѱ>OzJԝoGu N㽎gPLKr Vۉ ByJA[J<=짧NF=-!5٬HzUk%06L߬* .?M% ڐ~P _8Idʬ]lSڙ~{xSg+I*i(LM|ρ!hIP:2ޟùFqFBҝƸDǞG4 :"EB5@8N d 5>ZlKаz=Cڈ?+uLBWn\}o\;#1:-{RknKj5:A\ʱp*쩋KiJRI@ 1x=mN<#I%(ڴ!Gޝk#mu2o/2AHL} i_xu0eRG.,PV푖 >d#Ug̓"ՎZbaP4VܵV;I:P̥D~G[u[yQq'ECH[z+Gi)*wnJ|+ch0Pi1lx@J@{Er+"2*"?M}:GCdU\+6HrI73<}\ t;*}RRzx?%\t+JRJRJRJRJRJRJRzv͵bdw#5i)?j-zoC1;~"Z.*qgLl+64̫IS)GXy37~pv/%eTԅ,=>%(l8"YP-S"ۋHXfMAx*i$ۮz҆ճ_7*2vp\W!J.=d$\}AYqd*:$ypw!#R;j?b{y1Ÿ~nK6<r oɥA{ev#'Zjcy5{$6Px>SXUȬob|Ɯe{={T5I-[2b%a A:CR$p=oů5 ge)hCL!I icZ9JPͭZV'`Y^>su'9 γ"~u])q'Ϋv]mP.!HRyUYʺ+{iq) %A@q׬ޘt9]Jz R|- fœ,hL!i;)[KiZ9J5݋95Œkr8R|^P'[=QiJ/YMDL(%GD@xJ& 'Hbb\tIoC)*PGO-C-%+BӴ Wo}=קm~g{%'QE >4MZi>Zldk~"kʑ]>/|~j椖fԟI,8FBQԽuC|x$yTVϕ3oV=6(,vRi;Bq({*As f}=vKW0Ŭ90ђSe4ף9. Gӝ*A͖ dN݊2ԀH#Z0rncLn[tMv?;C ɝUo%ItU9yXZF- 6Ȟʿc"vՠ4ízsVg΋^),jSRfxZ%^ Bӭ꽧+t*ՔO%noM[[ܯ$Vp ( zzٳ5s?-rˆw}>5"+yWKwKq#>RSu/>+&e>?,O2@6~U!JYP>i5VgNt : PFZE\b'\ߓ3$JI%D[cIylVɮY)hl+]_opvH!#]NxSYMmBV%Ca@Uc*pd.6e\pt[ivySCODYM2\`]vmK%/4i>50ppt:o|%h(SL^iɬ^,[ ’yJҡ* N5uzTXYmAC$hqJ}ߥn*u38V-I}Hh7";}tO>mÁiW=Ǒ^ڮ=t+JC돂fhqf/ߐ BexpqD[?VRaqnGm\B@@>uut&t 0/鐝%0c|!58YJdEr+"Tv4|Tn܇W@AO{8(Wo%UjoMbY&mW"iGwMy,( l^uT";+o^-qnyN2 rB$ʛPI4 ظՍc3I0^۔Վ ||\ElSȋ6KS\f.FڊqRVzW=$ikj6=uҖUjm\Z{; IioOʋ8MtFo֜5qR*R*GN=u^[yn3A)vmJi<+#GdTQZwEZW e]n!Z o`>5WRG鞸u?(?1c|-6VFHee22%^i}Fy<9C4Iq҄^jߨMlizy*WdxRJCi $NA^r_ҔHRRRRRRRRRW"ڲ+% 3-ãiZ: @ +J n[lc/vK.DA<&,|,kzVĭnZ%Z.ٛ[eu=ZOG=w<֭.[ <;ݶt!)pvx9SYY9v9͓C%JRt\%hJРlv#+37NدCd0~g`z<Ծ(Ӂmx-87?H<(?:a]Yvm;i~qlq0AxuTԞ R ;VU!TEYE d3.<CieJQ=/YUUٕ)Byv=ĝ֖9ByتV3ԩyus4=[O>)SJkԼ"֨}+&GZbճ>Ow 4v l'Ţ"\̂?pht$8(6(%{F΁eTbu:Eç¾HԟP~$nr"WΕjw6 RҋV;im(ZryZQ$A>Ìμ`N#oI{v(rXrrƪ˷̋p2uw%i< YyeҿGU{.]|b?ON^˺~c½/Q8CſR^2=,䨠85g U Yynx%Q. !yI6 CL5'W]{?ҷٮp<Ǭ3`\@צ5Ə#CGzm~i]`ֹ)Zd>t;ӥ!A@Uo⛼JW)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP)JP+tH= lvF}Zu!HZH 0S:=5ΞIp"5<ȯDR#6N)!CE*$j GwDbU˧/Kؖ{?ʚǭgZrO./hWCJ(z;ÈP([xRNԸ!$-v]̹Cw5y7]Cn>Ԧz((s*ʇ{O1Um^_ma,pԴZc)'W~'mNq=Z~X-W`6DI>ɕ›(m+Jү!@o۞t̛D倔{!³€ב͔ J!!)HhHTȫ @ Vwӟ`r<=*rTy%'T5˱:'_gPǎյ$h7Poκ_~.pmM~2~!?d iڴ\BV@:G7_f ȑ8ʚ%!/Jp$%6tA7鰓yrLQP|+'wj%VwN&}.ͶtVP۶:ĸ};;[5&3;^YGCЮpn}J{_T=҇\U[3+RDZ>6Wer{aD- J\e`.6?ٱP>JqV[.A{̖9cPLD< k^ 8>EX5ƯvfPBJv<+aIO#玤bGB0 E1o~"<%(iS)*'z;lߒöS2-@Hd`#5i̚Slc/)_VuFozcw@sߔ$qո$u &1gv\[4 S[ ڑJ % Xx>Ejt=VمPXVwZ䠂Or{xVķʺ=!loFvDV)Umg'Ǫg-M>Wt(՚Q)V c\6;\\w+,`ڢ#Xahi-ѣR $O6Md{uMZ8Y[ί[BA*? E~0$G蝺9ɷrNy-Gܖg{V,r{~-RЂo4m.6  ʔ;޽˸`(r6 ڏHdyS>G%:*T6%Q$6eFy({!:]pb; }?u2](DD--m$O?5j}t<_qR*Ǽ-\]3!IAm]OrVGKu멝"Zf6V)+8yq(ʸe{s^- +=U#U؍Fqd^Ha,7ݶ%%oSۍfwPdǭ',3 Tt%wH_h;Q$y>|+gsXB&[ED|(6T7+vt»{rn8'qR!%;;R~e2>mrSywcpd 7a 5td5&34j JyHgxibb,D DK2i_C _Xȴ*zdh|FKeu['.%( igIA~7WqBc;TGpHZO<H>jYf˳PCS\PE)'o Ac]ut@2\.jH˺|q.Vuvĺhrnp{|cmXD"}P~2{CR]M׷CԹqC"Ґ΃RxS +Gj;'GfCFC-ho8ZR;{z??S rN=>n\|Mm)8*=h rp;~I]oϋhZczuI\?lۤ|)I<>_3=ċ|KvSs8~%,[4(,d'.N{,yy|CG{`kT"*SG P k8}y5]#FP~W -%>U6*lXUa* -DOvNu}|i!$Qeۺ{ /&rEHS)Aҵ}IVOn{JR R R R R R R R R R R R R R R:uãmu ߷r[%ԡN'טe_۳'& 1"!IJp2R\W8[j۪5Ns\HW~8{Ȏ<&HS5O7AIVȬU݆j&B{a+H C$[B+N2VW5ߧS,*n2˷1yS~Tߍ?y ]m2ەz# ElMWY7w.dh|v+glֻUS!߷}#UL\T.?ҭЛׂR+?/V,ZE_{霖yTlMK}X۰Nܽy{j֍YZV()*>ϲ\wFkb@,7 ]i>myqJ@kGgCfw,5KگtRKORď%N6 +,%{H#djVdLzuYIGt8 t kBqO[^R/Zww˔JK%(NLb{r>~ZJ$@]#gd.2-0WQǒy> UGZƓzbGcZYl>&A•n( )geLB&](a>Βh|N,I lzτdFM9iR\= NMw;Pޓ#L!nڜw2piWL?uFC1[0ޔJ+QQ ,*蟌gK<8ĈQ㰄M % #A)+Baa=Fq4'?y+ni'_$8F8fOj-e ,i(Z|?sS:\ۻЀ&Bq^{CM.s؝+o/gw$fa9M,R2☛B;$C}?;.TFᬦ\a\b]ט/~ ŔG6?_\=`},⢥NuJ{$DpyB8 RJ8|,jb-Y$a>QtIַiYRW+9[*>t l~I~+s9B(kRNHB7WB͝fv;5wll۝&t4ӚmVq(FfflY6-CM'(I&5k KEK\r$ݥ'Azq (y= MMdYܻOˆMF\PfD]nPnly_g‡6m+kߚ\ 69J[u::-}T̸P_'}7Luy&C:h"D6[ Y+?RjlWDo}xHirǧ}{V(lQnRѶ|ŧre;;$A _8\0P7kGGZS6-W;=nbmߦ $TvJ%DI$6ȍtӦ5_eWnWɀz Ci;M#JA)W R R R R R R R R R R R R R R R R R R R R R~`"r>Anϗ[R~p(AQˌ\)?y$> \gַj*qq4/5|֎XzeܛmMǸB Cc{I?]7<ygLn49Wu)k}eK'Z ^BTy"؇M.7{<ӪOGޣ9l[m:*JO #Ī1={ڄf'8+i  $sISZOߥ)Jrmayavi-4.5.0/docs/source/mayavi/sphinxext/0000755000076500000240000000000012747722127021175 5ustar prabhustaff00000000000000mayavi-4.5.0/docs/source/mayavi/sphinxext/LICENSE.txt0000644000076500000240000000262712747716313023027 0ustar prabhustaff00000000000000The files docscrape.py, docscrape_sphinx.py and numpydoc.py come from the numpy Reference Guide project and have the following license. Copyright (C) 2008 Stefan van der Walt , Pauli Virtanen Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. mayavi-4.5.0/docs/source/mayavi/sphinxext/linkcode.py0000644000076500000240000000471312645465010023334 0ustar prabhustaff00000000000000# -*- coding: utf-8 -*- """ linkcode ~~~~~~~~ Add external links to module code in Python object descriptions. :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. :license: BSD, see LICENSE for details. """ from __future__ import division, absolute_import, print_function import warnings import collections warnings.warn("This extension has been accepted to Sphinx upstream. " "Use the version from there (Sphinx >= 1.2) " "https://bitbucket.org/birkenfeld/sphinx/pull-request/47/sphinxextlinkcode", FutureWarning, stacklevel=1) from docutils import nodes from sphinx import addnodes from sphinx.locale import _ from sphinx.errors import SphinxError class LinkcodeError(SphinxError): category = "linkcode error" def doctree_read(app, doctree): env = app.builder.env resolve_target = getattr(env.config, 'linkcode_resolve', None) if not isinstance(env.config.linkcode_resolve, collections.Callable): raise LinkcodeError( "Function `linkcode_resolve` is not given in conf.py") domain_keys = dict( py=['module', 'fullname'], c=['names'], cpp=['names'], js=['object', 'fullname'], ) for objnode in doctree.traverse(addnodes.desc): domain = objnode.get('domain') uris = set() for signode in objnode: if not isinstance(signode, addnodes.desc_signature): continue # Convert signode to a specified format info = {} for key in domain_keys.get(domain, []): value = signode.get(key) if not value: value = '' info[key] = value if not info: continue # Call user code to resolve the link uri = resolve_target(domain, info) if not uri: # no source continue if uri in uris or not uri: # only one link per name, please continue uris.add(uri) onlynode = addnodes.only(expr='html') onlynode += nodes.reference('', '', internal=False, refuri=uri) onlynode[0] += nodes.inline('', _('[source]'), classes=['viewcode-link']) signode += onlynode def setup(app): app.connect('doctree-read', doctree_read) app.add_config_value('linkcode_resolve', None, '') mayavi-4.5.0/docs/source/mayavi/sphinxext/phantom_import.py0000644000076500000240000001333612645465011024606 0ustar prabhustaff00000000000000""" ============== phantom_import ============== Sphinx extension to make directives from ``sphinx.ext.autodoc`` and similar extensions to use docstrings loaded from an XML file. This extension loads an XML file in the Pydocweb format [1] and creates a dummy module that contains the specified docstrings. This can be used to get the current docstrings from a Pydocweb instance without needing to rebuild the documented module. .. [1] http://code.google.com/p/pydocweb """ from __future__ import division, absolute_import, print_function import imp, sys, compiler, types, os, inspect, re def setup(app): app.connect('builder-inited', initialize) app.add_config_value('phantom_import_file', None, True) def initialize(app): fn = app.config.phantom_import_file if (fn and os.path.isfile(fn)): print("[numpydoc] Phantom importing modules from", fn, "...") import_phantom_module(fn) #------------------------------------------------------------------------------ # Creating 'phantom' modules from an XML description #------------------------------------------------------------------------------ def import_phantom_module(xml_file): """ Insert a fake Python module to sys.modules, based on a XML file. The XML file is expected to conform to Pydocweb DTD. The fake module will contain dummy objects, which guarantee the following: - Docstrings are correct. - Class inheritance relationships are correct (if present in XML). - Function argspec is *NOT* correct (even if present in XML). Instead, the function signature is prepended to the function docstring. - Class attributes are *NOT* correct; instead, they are dummy objects. Parameters ---------- xml_file : str Name of an XML file to read """ import lxml.etree as etree object_cache = {} tree = etree.parse(xml_file) root = tree.getroot() # Sort items so that # - Base classes come before classes inherited from them # - Modules come before their contents all_nodes = dict([(n.attrib['id'], n) for n in root]) def _get_bases(node, recurse=False): bases = [x.attrib['ref'] for x in node.findall('base')] if recurse: j = 0 while True: try: b = bases[j] except IndexError: break if b in all_nodes: bases.extend(_get_bases(all_nodes[b])) j += 1 return bases type_index = ['module', 'class', 'callable', 'object'] def base_cmp(a, b): x = cmp(type_index.index(a.tag), type_index.index(b.tag)) if x != 0: return x if a.tag == 'class' and b.tag == 'class': a_bases = _get_bases(a, recurse=True) b_bases = _get_bases(b, recurse=True) x = cmp(len(a_bases), len(b_bases)) if x != 0: return x if a.attrib['id'] in b_bases: return -1 if b.attrib['id'] in a_bases: return 1 return cmp(a.attrib['id'].count('.'), b.attrib['id'].count('.')) nodes = root.getchildren() nodes.sort(base_cmp) # Create phantom items for node in nodes: name = node.attrib['id'] doc = (node.text or '').decode('string-escape') + "\n" if doc == "\n": doc = "" # create parent, if missing parent = name while True: parent = '.'.join(parent.split('.')[:-1]) if not parent: break if parent in object_cache: break obj = imp.new_module(parent) object_cache[parent] = obj sys.modules[parent] = obj # create object if node.tag == 'module': obj = imp.new_module(name) obj.__doc__ = doc sys.modules[name] = obj elif node.tag == 'class': bases = [object_cache[b] for b in _get_bases(node) if b in object_cache] bases.append(object) init = lambda self: None init.__doc__ = doc obj = type(name, tuple(bases), {'__doc__': doc, '__init__': init}) obj.__name__ = name.split('.')[-1] elif node.tag == 'callable': funcname = node.attrib['id'].split('.')[-1] argspec = node.attrib.get('argspec') if argspec: argspec = re.sub('^[^(]*', '', argspec) doc = "%s%s\n\n%s" % (funcname, argspec, doc) obj = lambda: 0 obj.__argspec_is_invalid_ = True if sys.version_info[0] >= 3: obj.__name__ = funcname else: obj.func_name = funcname obj.__name__ = name obj.__doc__ = doc if inspect.isclass(object_cache[parent]): obj.__objclass__ = object_cache[parent] else: class Dummy(object): pass obj = Dummy() obj.__name__ = name obj.__doc__ = doc if inspect.isclass(object_cache[parent]): obj.__get__ = lambda: None object_cache[name] = obj if parent: if inspect.ismodule(object_cache[parent]): obj.__module__ = parent setattr(object_cache[parent], name.split('.')[-1], obj) # Populate items for node in root: obj = object_cache.get(node.attrib['id']) if obj is None: continue for ref in node.findall('ref'): if node.tag == 'class': if ref.attrib['ref'].startswith(node.attrib['id'] + '.'): setattr(obj, ref.attrib['name'], object_cache.get(ref.attrib['ref'])) else: setattr(obj, ref.attrib['name'], object_cache.get(ref.attrib['ref'])) mayavi-4.5.0/docs/source/mayavi/sphinxext/plot_directive.py0000644000076500000240000005006212645465011024557 0ustar prabhustaff00000000000000""" A special directive for generating a matplotlib plot. .. warning:: This is a hacked version of plot_directive.py from Matplotlib. It's very much subject to change! Usage ----- Can be used like this:: .. plot:: examples/example.py .. plot:: import matplotlib.pyplot as plt plt.plot([1,2,3], [4,5,6]) .. plot:: A plotting example: >>> import matplotlib.pyplot as plt >>> plt.plot([1,2,3], [4,5,6]) The content is interpreted as doctest formatted if it has a line starting with ``>>>``. The ``plot`` directive supports the options format : {'python', 'doctest'} Specify the format of the input include-source : bool Whether to display the source code. Default can be changed in conf.py and the ``image`` directive options ``alt``, ``height``, ``width``, ``scale``, ``align``, ``class``. Configuration options --------------------- The plot directive has the following configuration options: plot_include_source Default value for the include-source option plot_pre_code Code that should be executed before each plot. plot_basedir Base directory, to which plot:: file names are relative to. (If None or empty, file names are relative to the directoly where the file containing the directive is.) plot_formats File formats to generate. List of tuples or strings:: [(suffix, dpi), suffix, ...] that determine the file format and the DPI. For entries whose DPI was omitted, sensible defaults are chosen. plot_html_show_formats Whether to show links to the files in HTML. TODO ---- * Refactor Latex output; now it's plain images, but it would be nice to make them appear side-by-side, or in floats. """ from __future__ import division, absolute_import, print_function import sys, os, glob, shutil, imp, warnings, re, textwrap, traceback import sphinx if sys.version_info[0] >= 3: from io import StringIO else: from io import StringIO import warnings warnings.warn("A plot_directive module is also available under " "matplotlib.sphinxext; expect this numpydoc.plot_directive " "module to be deprecated after relevant features have been " "integrated there.", FutureWarning, stacklevel=2) #------------------------------------------------------------------------------ # Registration hook #------------------------------------------------------------------------------ def setup(app): setup.app = app setup.config = app.config setup.confdir = app.confdir app.add_config_value('plot_pre_code', '', True) app.add_config_value('plot_include_source', False, True) app.add_config_value('plot_formats', ['png', 'hires.png', 'pdf'], True) app.add_config_value('plot_basedir', None, True) app.add_config_value('plot_html_show_formats', True, True) app.add_directive('plot', plot_directive, True, (0, 1, False), **plot_directive_options) #------------------------------------------------------------------------------ # plot:: directive #------------------------------------------------------------------------------ from docutils.parsers.rst import directives from docutils import nodes def plot_directive(name, arguments, options, content, lineno, content_offset, block_text, state, state_machine): return run(arguments, content, options, state_machine, state, lineno) plot_directive.__doc__ = __doc__ def _option_boolean(arg): if not arg or not arg.strip(): # no argument given, assume used as a flag return True elif arg.strip().lower() in ('no', '0', 'false'): return False elif arg.strip().lower() in ('yes', '1', 'true'): return True else: raise ValueError('"%s" unknown boolean' % arg) def _option_format(arg): return directives.choice(arg, ('python', 'lisp')) def _option_align(arg): return directives.choice(arg, ("top", "middle", "bottom", "left", "center", "right")) plot_directive_options = {'alt': directives.unchanged, 'height': directives.length_or_unitless, 'width': directives.length_or_percentage_or_unitless, 'scale': directives.nonnegative_int, 'align': _option_align, 'class': directives.class_option, 'include-source': _option_boolean, 'format': _option_format, } #------------------------------------------------------------------------------ # Generating output #------------------------------------------------------------------------------ from docutils import nodes, utils try: # Sphinx depends on either Jinja or Jinja2 import jinja2 def format_template(template, **kw): return jinja2.Template(template).render(**kw) except ImportError: import jinja def format_template(template, **kw): return jinja.from_string(template, **kw) TEMPLATE = """ {{ source_code }} {{ only_html }} {% if source_link or (html_show_formats and not multi_image) %} ( {%- if source_link -%} `Source code <{{ source_link }}>`__ {%- endif -%} {%- if html_show_formats and not multi_image -%} {%- for img in images -%} {%- for fmt in img.formats -%} {%- if source_link or not loop.first -%}, {% endif -%} `{{ fmt }} <{{ dest_dir }}/{{ img.basename }}.{{ fmt }}>`__ {%- endfor -%} {%- endfor -%} {%- endif -%} ) {% endif %} {% for img in images %} .. figure:: {{ build_dir }}/{{ img.basename }}.png {%- for option in options %} {{ option }} {% endfor %} {% if html_show_formats and multi_image -%} ( {%- for fmt in img.formats -%} {%- if not loop.first -%}, {% endif -%} `{{ fmt }} <{{ dest_dir }}/{{ img.basename }}.{{ fmt }}>`__ {%- endfor -%} ) {%- endif -%} {% endfor %} {{ only_latex }} {% for img in images %} .. image:: {{ build_dir }}/{{ img.basename }}.pdf {% endfor %} """ class ImageFile(object): def __init__(self, basename, dirname): self.basename = basename self.dirname = dirname self.formats = [] def filename(self, format): return os.path.join(self.dirname, "%s.%s" % (self.basename, format)) def filenames(self): return [self.filename(fmt) for fmt in self.formats] def run(arguments, content, options, state_machine, state, lineno): if arguments and content: raise RuntimeError("plot:: directive can't have both args and content") document = state_machine.document config = document.settings.env.config options.setdefault('include-source', config.plot_include_source) # determine input rst_file = document.attributes['source'] rst_dir = os.path.dirname(rst_file) if arguments: if not config.plot_basedir: source_file_name = os.path.join(rst_dir, directives.uri(arguments[0])) else: source_file_name = os.path.join(setup.confdir, config.plot_basedir, directives.uri(arguments[0])) code = open(source_file_name, 'r').read() output_base = os.path.basename(source_file_name) else: source_file_name = rst_file code = textwrap.dedent("\n".join(map(str, content))) counter = document.attributes.get('_plot_counter', 0) + 1 document.attributes['_plot_counter'] = counter base, ext = os.path.splitext(os.path.basename(source_file_name)) output_base = '%s-%d.py' % (base, counter) base, source_ext = os.path.splitext(output_base) if source_ext in ('.py', '.rst', '.txt'): output_base = base else: source_ext = '' # ensure that LaTeX includegraphics doesn't choke in foo.bar.pdf filenames output_base = output_base.replace('.', '-') # is it in doctest format? is_doctest = contains_doctest(code) if 'format' in options: if options['format'] == 'python': is_doctest = False else: is_doctest = True # determine output directory name fragment source_rel_name = relpath(source_file_name, setup.confdir) source_rel_dir = os.path.dirname(source_rel_name) while source_rel_dir.startswith(os.path.sep): source_rel_dir = source_rel_dir[1:] # build_dir: where to place output files (temporarily) build_dir = os.path.join(os.path.dirname(setup.app.doctreedir), 'plot_directive', source_rel_dir) if not os.path.exists(build_dir): os.makedirs(build_dir) # output_dir: final location in the builder's directory dest_dir = os.path.abspath(os.path.join(setup.app.builder.outdir, source_rel_dir)) # how to link to files from the RST file dest_dir_link = os.path.join(relpath(setup.confdir, rst_dir), source_rel_dir).replace(os.path.sep, '/') build_dir_link = relpath(build_dir, rst_dir).replace(os.path.sep, '/') source_link = dest_dir_link + '/' + output_base + source_ext # make figures try: results = makefig(code, source_file_name, build_dir, output_base, config) errors = [] except PlotError as err: reporter = state.memo.reporter sm = reporter.system_message( 2, "Exception occurred in plotting %s: %s" % (output_base, err), line=lineno) results = [(code, [])] errors = [sm] # generate output restructuredtext total_lines = [] for j, (code_piece, images) in enumerate(results): if options['include-source']: if is_doctest: lines = [''] lines += [row.rstrip() for row in code_piece.split('\n')] else: lines = ['.. code-block:: python', ''] lines += [' %s' % row.rstrip() for row in code_piece.split('\n')] source_code = "\n".join(lines) else: source_code = "" opts = [':%s: %s' % (key, val) for key, val in list(options.items()) if key in ('alt', 'height', 'width', 'scale', 'align', 'class')] only_html = ".. only:: html" only_latex = ".. only:: latex" if j == 0: src_link = source_link else: src_link = None result = format_template( TEMPLATE, dest_dir=dest_dir_link, build_dir=build_dir_link, source_link=src_link, multi_image=len(images) > 1, only_html=only_html, only_latex=only_latex, options=opts, images=images, source_code=source_code, html_show_formats=config.plot_html_show_formats) total_lines.extend(result.split("\n")) total_lines.extend("\n") if total_lines: state_machine.insert_input(total_lines, source=source_file_name) # copy image files to builder's output directory if not os.path.exists(dest_dir): os.makedirs(dest_dir) for code_piece, images in results: for img in images: for fn in img.filenames(): shutil.copyfile(fn, os.path.join(dest_dir, os.path.basename(fn))) # copy script (if necessary) if source_file_name == rst_file: target_name = os.path.join(dest_dir, output_base + source_ext) f = open(target_name, 'w') f.write(unescape_doctest(code)) f.close() return errors #------------------------------------------------------------------------------ # Run code and capture figures #------------------------------------------------------------------------------ import matplotlib matplotlib.use('Agg') import matplotlib.pyplot as plt import matplotlib.image as image from matplotlib import _pylab_helpers import exceptions def contains_doctest(text): try: # check if it's valid Python as-is compile(text, '', 'exec') return False except SyntaxError: pass r = re.compile(r'^\s*>>>', re.M) m = r.search(text) return bool(m) def unescape_doctest(text): """ Extract code from a piece of text, which contains either Python code or doctests. """ if not contains_doctest(text): return text code = "" for line in text.split("\n"): m = re.match(r'^\s*(>>>|\.\.\.) (.*)$', line) if m: code += m.group(2) + "\n" elif line.strip(): code += "# " + line.strip() + "\n" else: code += "\n" return code def split_code_at_show(text): """ Split code at plt.show() """ parts = [] is_doctest = contains_doctest(text) part = [] for line in text.split("\n"): if (not is_doctest and line.strip() == 'plt.show()') or \ (is_doctest and line.strip() == '>>> plt.show()'): part.append(line) parts.append("\n".join(part)) part = [] else: part.append(line) if "\n".join(part).strip(): parts.append("\n".join(part)) return parts class PlotError(RuntimeError): pass def run_code(code, code_path, ns=None): # Change the working directory to the directory of the example, so # it can get at its data files, if any. pwd = os.getcwd() old_sys_path = list(sys.path) if code_path is not None: dirname = os.path.abspath(os.path.dirname(code_path)) os.chdir(dirname) sys.path.insert(0, dirname) # Redirect stdout stdout = sys.stdout sys.stdout = StringIO() # Reset sys.argv old_sys_argv = sys.argv sys.argv = [code_path] try: try: code = unescape_doctest(code) if ns is None: ns = {} if not ns: exec(setup.config.plot_pre_code, ns) exec(code, ns) except (Exception, SystemExit) as err: raise PlotError(traceback.format_exc()) finally: os.chdir(pwd) sys.argv = old_sys_argv sys.path[:] = old_sys_path sys.stdout = stdout return ns #------------------------------------------------------------------------------ # Generating figures #------------------------------------------------------------------------------ def out_of_date(original, derived): """ Returns True if derivative is out-of-date wrt original, both of which are full file paths. """ return (not os.path.exists(derived) or os.stat(derived).st_mtime < os.stat(original).st_mtime) def makefig(code, code_path, output_dir, output_base, config): """ Run a pyplot script *code* and save the images under *output_dir* with file names derived from *output_base* """ # -- Parse format list default_dpi = {'png': 80, 'hires.png': 200, 'pdf': 50} formats = [] for fmt in config.plot_formats: if isinstance(fmt, str): formats.append((fmt, default_dpi.get(fmt, 80))) elif type(fmt) in (tuple, list) and len(fmt)==2: formats.append((str(fmt[0]), int(fmt[1]))) else: raise PlotError('invalid image format "%r" in plot_formats' % fmt) # -- Try to determine if all images already exist code_pieces = split_code_at_show(code) # Look for single-figure output files first all_exists = True img = ImageFile(output_base, output_dir) for format, dpi in formats: if out_of_date(code_path, img.filename(format)): all_exists = False break img.formats.append(format) if all_exists: return [(code, [img])] # Then look for multi-figure output files results = [] all_exists = True for i, code_piece in enumerate(code_pieces): images = [] for j in range(1000): img = ImageFile('%s_%02d_%02d' % (output_base, i, j), output_dir) for format, dpi in formats: if out_of_date(code_path, img.filename(format)): all_exists = False break img.formats.append(format) # assume that if we have one, we have them all if not all_exists: all_exists = (j > 0) break images.append(img) if not all_exists: break results.append((code_piece, images)) if all_exists: return results # -- We didn't find the files, so build them results = [] ns = {} for i, code_piece in enumerate(code_pieces): # Clear between runs plt.close('all') # Run code run_code(code_piece, code_path, ns) # Collect images images = [] fig_managers = _pylab_helpers.Gcf.get_all_fig_managers() for j, figman in enumerate(fig_managers): if len(fig_managers) == 1 and len(code_pieces) == 1: img = ImageFile(output_base, output_dir) else: img = ImageFile("%s_%02d_%02d" % (output_base, i, j), output_dir) images.append(img) for format, dpi in formats: try: figman.canvas.figure.savefig(img.filename(format), dpi=dpi) except exceptions.BaseException as err: raise PlotError(traceback.format_exc()) img.formats.append(format) # Results results.append((code_piece, images)) return results #------------------------------------------------------------------------------ # Relative pathnames #------------------------------------------------------------------------------ try: from os.path import relpath except ImportError: # Copied from Python 2.7 if 'posix' in sys.builtin_module_names: def relpath(path, start=os.path.curdir): """Return a relative version of a path""" from os.path import sep, curdir, join, abspath, commonprefix, \ pardir if not path: raise ValueError("no path specified") start_list = abspath(start).split(sep) path_list = abspath(path).split(sep) # Work out how much of the filepath is shared by start and path. i = len(commonprefix([start_list, path_list])) rel_list = [pardir] * (len(start_list)-i) + path_list[i:] if not rel_list: return curdir return join(*rel_list) elif 'nt' in sys.builtin_module_names: def relpath(path, start=os.path.curdir): """Return a relative version of a path""" from os.path import sep, curdir, join, abspath, commonprefix, \ pardir, splitunc if not path: raise ValueError("no path specified") start_list = abspath(start).split(sep) path_list = abspath(path).split(sep) if start_list[0].lower() != path_list[0].lower(): unc_path, rest = splitunc(path) unc_start, rest = splitunc(start) if bool(unc_path) ^ bool(unc_start): raise ValueError("Cannot mix UNC and non-UNC paths (%s and %s)" % (path, start)) else: raise ValueError("path is on drive %s, start on drive %s" % (path_list[0], start_list[0])) # Work out how much of the filepath is shared by start and path. for i in range(min(len(start_list), len(path_list))): if start_list[i].lower() != path_list[i].lower(): break else: i += 1 rel_list = [pardir] * (len(start_list)-i) + path_list[i:] if not rel_list: return curdir return join(*rel_list) else: raise RuntimeError("Unsupported platform (no relpath available!)") mayavi-4.5.0/docs/source/mayavi/sphinxext/sphinxext/0000755000076500000240000000000012747722127023227 5ustar prabhustaff00000000000000mayavi-4.5.0/docs/source/mayavi/sphinxext/sphinxext/__init__.py0000644000076500000240000000000012747716313025326 0ustar prabhustaff00000000000000mayavi-4.5.0/docs/source/mayavi/sphinxext/sphinxext/__init__.pyc0000644000076500000240000000025212664320604025472 0ustar prabhustaff00000000000000 "Vc@sdS(N((((sS/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/__init__.pytsmayavi-4.5.0/docs/source/mayavi/sphinxext/sphinxext/comment_eater.py0000644000076500000240000001277412747716313026436 0ustar prabhustaff00000000000000from __future__ import division, absolute_import, print_function import sys from io import StringIO import ast import inspect import textwrap import tokenize from .compiler_unparse import unparse if sys.version_info[0] >= 3: sixu = lambda s: s else: sixu = lambda s: unicode(s, 'unicode_escape') class Comment(object): """ A comment block. """ is_comment = True def __init__(self, start_lineno, end_lineno, text): # int : The first line number in the block. 1-indexed. self.start_lineno = start_lineno # int : The last line number. Inclusive! self.end_lineno = end_lineno # str : The text block including '#' character but not any leading spaces. self.text = text def add(self, string, start, end, line): """ Add a new comment line. """ self.start_lineno = min(self.start_lineno, start[0]) self.end_lineno = max(self.end_lineno, end[0]) self.text += string def __repr__(self): return '%s(%r, %r, %r)' % (self.__class__.__name__, self.start_lineno, self.end_lineno, self.text) class NonComment(object): """ A non-comment block of code. """ is_comment = False def __init__(self, start_lineno, end_lineno): self.start_lineno = start_lineno self.end_lineno = end_lineno def add(self, string, start, end, line): """ Add lines to the block. """ if string.strip(): # Only add if not entirely whitespace. self.start_lineno = min(self.start_lineno, start[0]) self.end_lineno = max(self.end_lineno, end[0]) def __repr__(self): return '%s(%r, %r)' % (self.__class__.__name__, self.start_lineno, self.end_lineno) class CommentBlocker(object): """ Pull out contiguous comment blocks. """ def __init__(self): # Start with a dummy. self.current_block = NonComment(0, 0) # All of the blocks seen so far. self.blocks = [] # The index mapping lines of code to their associated comment blocks. self.index = {} def process_file(self, file): """ Process a file object. """ if sys.version_info[0] >= 3: nxt = file.__next__ else: nxt = file.next for token in tokenize.generate_tokens(nxt): self.process_token(*token) self.make_index() def process_token(self, kind, string, start, end, line): """ Process a single token. """ if self.current_block.is_comment: if kind == tokenize.COMMENT: self.current_block.add(string, start, end, line) else: self.new_noncomment(start[0], end[0]) else: if kind == tokenize.COMMENT: self.new_comment(string, start, end, line) else: self.current_block.add(string, start, end, line) def new_noncomment(self, start_lineno, end_lineno): """ We are transitioning from a noncomment to a comment. """ block = NonComment(start_lineno, end_lineno) self.blocks.append(block) self.current_block = block def new_comment(self, string, start, end, line): """ Possibly add a new comment. Only adds a new comment if this comment is the only thing on the line. Otherwise, it extends the noncomment block. """ prefix = line[:start[1]] if prefix.strip(): # Oops! Trailing comment, not a comment block. self.current_block.add(string, start, end, line) else: # A comment block. block = Comment(start[0], end[0], string) self.blocks.append(block) self.current_block = block def make_index(self): """ Make the index mapping lines of actual code to their associated prefix comments. """ for prev, block in zip(self.blocks[:-1], self.blocks[1:]): if not block.is_comment: self.index[block.start_lineno] = prev def search_for_comment(self, lineno, default=None): """ Find the comment block just before the given line number. Returns None (or the specified default) if there is no such block. """ if not self.index: self.make_index() block = self.index.get(lineno, None) text = getattr(block, 'text', default) return text def strip_comment_marker(text): """ Strip # markers at the front of a block of comment text. """ lines = [] for line in text.splitlines(): lines.append(line.lstrip('#')) text = textwrap.dedent('\n'.join(lines)) return text def get_class_traits(klass): """ Yield all of the documentation for trait definitions on a class object. """ # FIXME: gracefully handle errors here or in the caller? source = inspect.getsource(klass) # This collects all the comments block cb = CommentBlocker() cb.process_file(StringIO(sixu(source))) # AST tree for the module mod_ast = ast.parse(source) # AST tree for the class class_ast = mod_ast.body[0] # All assignement nodes assign_nodes = (node for node in class_ast.body if isinstance(node, ast.Assign)) for node in assign_nodes: # Left-hand side name = node.targets[0].id # Right-hand side rhs = unparse(node.value) # Comment doc = strip_comment_marker(cb.search_for_comment(node.lineno, default='')) yield name, rhs, doc mayavi-4.5.0/docs/source/mayavi/sphinxext/sphinxext/comment_eater.pyc0000644000076500000240000001752612730052416026566 0ustar prabhustaff00000000000000 4Wc@`sddlmZmZmZddlZddlmZddlZddlZddl Z ddl Z ddl m Z ej ddkrdZn dZd efd YZd efd YZd efdYZdZdZdS(i(tdivisiontabsolute_importtprint_functionN(tStringIOi(tunparseicC`s|S(N((ts((sX/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/comment_eater.pytscC`s t|dS(Ntunicode_escape(tunicode(R((sX/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/comment_eater.pyRstCommentcB`s/eZdZeZdZdZdZRS(s A comment block. cC`s||_||_||_dS(N(t start_linenot end_linenottext(tselfR R R ((sX/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/comment_eater.pyt__init__s  cC`sEt|j|d|_t|j|d|_|j|7_dS(s! Add a new comment line. iN(tminR tmaxR R (R tstringtstarttendtline((sX/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/comment_eater.pytaddscC`s#d|jj|j|j|jfS(Ns%s(%r, %r, %r)(t __class__t__name__R R R (R ((sX/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/comment_eater.pyt__repr__&s(Rt __module__t__doc__tTruet is_commentRRR(((sX/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/comment_eater.pyR s   t NonCommentcB`s/eZdZeZdZdZdZRS(s" A non-comment block of code. cC`s||_||_dS(N(R R (R R R ((sX/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/comment_eater.pyR/s cC`sE|jrAt|j|d|_t|j|d|_ndS(s! Add lines to the block. iN(tstripRR RR (R RRRR((sX/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/comment_eater.pyR3s cC`sd|jj|j|jfS(Ns %s(%r, %r)(RRR R (R ((sX/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/comment_eater.pyR;s(RRRtFalseRRRR(((sX/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/comment_eater.pyR+s   tCommentBlockercB`sPeZdZdZdZdZdZdZdZddZ RS( s) Pull out contiguous comment blocks. cC`s(tdd|_g|_i|_dS(Ni(Rt current_blocktblockstindex(R ((sX/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/comment_eater.pyRCs cC`s]tjddkr|j}n |j}x$tj|D]}|j|q8W|jdS(s Process a file object. iiN(tsyst version_infot__next__tnextttokenizetgenerate_tokenst process_tokent make_index(R tfiletnxtttoken((sX/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/comment_eater.pyt process_fileMs   cC`s|jjrR|tjkr7|jj||||q|j|d|dnA|tjkrz|j||||n|jj||||dS(s! Process a single token. iN(R!RR(tCOMMENTRtnew_noncommentt new_comment(R tkindRRRR((sX/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/comment_eater.pyR*Xs cC`s,t||}|jj|||_dS(s> We are transitioning from a noncomment to a comment. N(RR"tappendR!(R R R tblock((sX/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/comment_eater.pyR1fscC`sm||d }|jr6|jj||||n3t|d|d|}|jj|||_dS(s Possibly add a new comment. Only adds a new comment if this comment is the only thing on the line. Otherwise, it extends the noncomment block. iiN(RR!RR R"R4(R RRRRtprefixR5((sX/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/comment_eater.pyR2ms  cC`sNxGt|jd |jdD](\}}|js||j|j(((sX/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/comment_eater.pyR @s    cC`sOg}x*|jD]}|j|jdqWtjdj|}|S(s> Strip # markers at the front of a block of comment text. t#s (t splitlinesR4tlstripttextwraptdedenttjoin(R tlinesR((sX/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/comment_eater.pytstrip_comment_markers c c`stj|}t}|jtt|tj|}|jd}d|jD}xY|D]Q}|j dj }t |j }t |j|jdd} ||| fVqgWdS(sM Yield all of the documentation for trait definitions on a class object. ics`s'|]}t|tjr|VqdS(N(t isinstancetasttAssign(t.0tnode((sX/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/comment_eater.pys sR=tN(tinspectt getsourceR R/RtsixuRHtparsetbodyttargetstidRtvalueRFR>R<( tklasstsourcetcbtmod_astt class_astt assign_nodesRKtnametrhstdoc((sX/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/comment_eater.pytget_class_traitss   (t __future__RRRR$tioRRHRMRBR(tcompiler_unparseRR%ROtobjectR RR RFR^(((sX/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/comment_eater.pyts       Q mayavi-4.5.0/docs/source/mayavi/sphinxext/sphinxext/compiler_unparse.py0000644000076500000240000006045212747716313027157 0ustar prabhustaff00000000000000""" Turn ast structures back into executable python code. The unparse method takes a compiler.ast tree and transforms it back into valid python code. It is incomplete and currently only works for import statements, function calls, function definitions, assignments, and basic expressions. Inspired by python-2.5-svn/Demo/parser/unparse.py fixme: The API of ast has changed. Many parts of this module are broken. Only attempted fixing unparsing for _ast.Assign and _ast.Call """ from __future__ import division, absolute_import, print_function import sys from ast import Num, Name, Tuple, Div, Mult, Sub, Add if sys.version_info[0] >= 3: from io import StringIO else: from StringIO import StringIO def unparse(ast, single_line_functions=False): s = StringIO() UnparseCompilerAst(ast, s, single_line_functions) return s.getvalue().lstrip() op_precedence = { 'ast.Power':3, 'ast.Mult':2, 'ast.Div':2, 'ast.Add':1, 'ast.Sub':1 } class UnparseCompilerAst: """ Methods in this class recursively traverse an AST and output source code for the abstract syntax; original formatting is disregarged. """ ######################################################################### # object interface. ######################################################################### def __init__(self, tree, file = sys.stdout, single_line_functions=False): """ Unparser(tree, file=sys.stdout) -> None. Print the source for tree to file. """ self.f = file self._single_func = single_line_functions self._do_indent = True self._indent = 0 self._dispatch(tree) self._write("\n") self.f.flush() ######################################################################### # Unparser private interface. ######################################################################### ### format, output, and dispatch methods ################################ def _fill(self, text = ""): "Indent a piece of text, according to the current indentation level" if self._do_indent: self._write("\n"+" "*self._indent + text) else: self._write(text) def _write(self, text): "Append a piece of text to the current line." self.f.write(text) def _enter(self): "Print ':', and increase the indentation." self._write(": ") self._indent += 1 def _leave(self): "Decrease the indentation level." self._indent -= 1 def _dispatch(self, tree): "_dispatcher function, _dispatching tree type T to method _T." if isinstance(tree, list): for t in tree: self._dispatch(t) return meth = getattr(self, "_"+tree.__class__.__name__) if tree.__class__.__name__ == 'NoneType' and not self._do_indent: return meth(tree) ######################################################################### # compiler.ast unparsing methods. # # There should be one method per concrete grammar type. They are # organized in alphabetical order. ######################################################################### def _Add(self, t): self.__binary_op(t, '+') def _And(self, t): self._write(" (") for i, node in enumerate(t.nodes): self._dispatch(node) if i != len(t.nodes)-1: self._write(") and (") self._write(")") def _AssAttr(self, t): """ Handle assigning an attribute of an object """ self._dispatch(t.expr) self._write('.'+t.attrname) def _Assign(self, t): """ Expression Assignment such as "a = 1". This only handles assignment in expressions. Keyword assignment is handled separately. """ self._fill() for target in t.targets: self._dispatch(target) self._write(" = ") self._dispatch(t.value) if not self._do_indent: self._write('; ') def _AssName(self, t): """ Name on left hand side of expression. Treat just like a name on the right side of an expression. """ self._Name(t) def _AssTuple(self, t): """ Tuple on left hand side of an expression. """ # _write each elements, separated by a comma. for element in t.nodes[:-1]: self._dispatch(element) self._write(", ") # Handle the last one without writing comma last_element = t.nodes[-1] self._dispatch(last_element) def _AugAssign(self, t): """ +=,-=,*=,/=,**=, etc. operations """ self._fill() self._dispatch(t.node) self._write(' '+t.op+' ') self._dispatch(t.expr) if not self._do_indent: self._write(';') def _Bitand(self, t): """ Bit and operation. """ for i, node in enumerate(t.nodes): self._write("(") self._dispatch(node) self._write(")") if i != len(t.nodes)-1: self._write(" & ") def _Bitor(self, t): """ Bit or operation """ for i, node in enumerate(t.nodes): self._write("(") self._dispatch(node) self._write(")") if i != len(t.nodes)-1: self._write(" | ") def _Call(self, t): """ Function call. """ self._dispatch(t.func) self._write("(") comma = False for e in t.args: if comma: self._write(", ") else: comma = True self._dispatch(e) if t.starargs: if comma: self._write(", ") else: comma = True self._write("*") self._dispatch(t.starargs) if t.kwargs: if comma: self._write(", ") else: comma = True self._write("**") self._dispatch(t.kwargs) self._write(")") def _Compare(self, t): self._dispatch(t.expr) for op, expr in t.ops: self._write(" " + op + " ") self._dispatch(expr) def _Num(self, t): """ A constant value such as an integer value, 3 """ self._dispatch(t.n) def _NameConstant(self, t): """ NameConstant such as False """ self._dispatch(repr(t.value)) def _Str(self, t): """ A string value such as "hello". """ self._dispatch(t.s) def _Decorators(self, t): """ Handle function decorators (eg. @has_units) """ for node in t.nodes: self._dispatch(node) def _Dict(self, t): self._write("{") for i, (k, v) in enumerate(t.items): self._dispatch(k) self._write(": ") self._dispatch(v) if i < len(t.items)-1: self._write(", ") self._write("}") def _Discard(self, t): """ Node for when return value is ignored such as in "foo(a)". """ self._fill() self._dispatch(t.expr) def _Div(self, t): self.__binary_op(t, '/') def _Ellipsis(self, t): self._write("...") def _From(self, t): """ Handle "from xyz import foo, bar as baz". """ # fixme: Are From and ImportFrom handled differently? self._fill("from ") self._write(t.modname) self._write(" import ") for i, (name,asname) in enumerate(t.names): if i != 0: self._write(", ") self._write(name) if asname is not None: self._write(" as "+asname) def _FunctionDef(self, t): """ Handle function definitions """ for decorator in t.decorator_list: self._fill("@") self._dispatch(decorator) self._fill("def "+t.name + "(") defaults = [None] * (len(t.argnames) - len(t.defaults)) + list(t.defaults) for i, arg in enumerate(zip(t.argnames, defaults)): self._write(arg[0]) if arg[1] is not None: self._write('=') self._dispatch(arg[1]) if i < len(t.argnames)-1: self._write(', ') self._write(")") if self._single_func: self._do_indent = False self._enter() self._dispatch(t.code) self._leave() self._do_indent = True def _Getattr(self, t): """ Handle getting an attribute of an object """ if isinstance(t.expr, (Div, Mult, Sub, Add)): self._write('(') self._dispatch(t.expr) self._write(')') else: self._dispatch(t.expr) self._write('.'+t.attrname) def _If(self, t): self._fill() for i, (compare,code) in enumerate(t.tests): if i == 0: self._write("if ") else: self._write("elif ") self._dispatch(compare) self._enter() self._fill() self._dispatch(code) self._leave() self._write("\n") if t.else_ is not None: self._write("else") self._enter() self._fill() self._dispatch(t.else_) self._leave() self._write("\n") def _IfExp(self, t): self._dispatch(t.then) self._write(" if ") self._dispatch(t.test) if t.else_ is not None: self._write(" else (") self._dispatch(t.else_) self._write(")") def _Import(self, t): """ Handle "import xyz.foo". """ self._fill("import ") for i, (name,asname) in enumerate(t.names): if i != 0: self._write(", ") self._write(name) if asname is not None: self._write(" as "+asname) def _Keyword(self, t): """ Keyword value assignment within function calls and definitions. """ self._write(t.name) self._write("=") self._dispatch(t.expr) def _List(self, t): self._write("[") for i,node in enumerate(t.elts): self._dispatch(node) if i < len(t.elts)-1: self._write(", ") self._write("]") def _Module(self, t): if t.doc is not None: self._dispatch(t.doc) self._dispatch(t.node) def _Mult(self, t): self.__binary_op(t, '*') def _Name(self, t): self._write(t.id) def _NoneType(self, t): self._write("None") def _Not(self, t): self._write('not (') self._dispatch(t.expr) self._write(')') def _Or(self, t): self._write(" (") for i, node in enumerate(t.nodes): self._dispatch(node) if i != len(t.nodes)-1: self._write(") or (") self._write(")") def _Pass(self, t): self._write("pass\n") def _Printnl(self, t): self._fill("print ") if t.dest: self._write(">> ") self._dispatch(t.dest) self._write(", ") comma = False for node in t.nodes: if comma: self._write(', ') else: comma = True self._dispatch(node) def _Power(self, t): self.__binary_op(t, '**') def _Return(self, t): self._fill("return ") if t.value: if isinstance(t.value, Tuple): text = ', '.join([ name.name for name in t.value.asList() ]) self._write(text) else: self._dispatch(t.value) if not self._do_indent: self._write('; ') def _Slice(self, t): self._dispatch(t.expr) self._write("[") if t.lower: self._dispatch(t.lower) self._write(":") if t.upper: self._dispatch(t.upper) #if t.step: # self._write(":") # self._dispatch(t.step) self._write("]") def _Sliceobj(self, t): for i, node in enumerate(t.nodes): if i != 0: self._write(":") if not (isinstance(node, Num) and node.value is None): self._dispatch(node) def _Stmt(self, tree): for node in tree.nodes: self._dispatch(node) def _Sub(self, t): self.__binary_op(t, '-') def _Subscript(self, t): self._dispatch(t.expr) self._write("[") for i, value in enumerate(t.subs): if i != 0: self._write(",") self._dispatch(value) self._write("]") def _TryExcept(self, t): self._fill("try") self._enter() self._dispatch(t.body) self._leave() for handler in t.handlers: self._fill('except ') self._dispatch(handler[0]) if handler[1] is not None: self._write(', ') self._dispatch(handler[1]) self._enter() self._dispatch(handler[2]) self._leave() if t.else_: self._fill("else") self._enter() self._dispatch(t.else_) self._leave() def _Tuple(self, t): if not t.nodes: # Empty tuple. self._write("()") else: self._write("(") # _write each elements, separated by a comma. for element in t.nodes[:-1]: self._dispatch(element) self._write(", ") # Handle the last one without writing comma last_element = t.nodes[-1] self._dispatch(last_element) self._write(")") def _UnaryAdd(self, t): self._write("+") self._dispatch(t.expr) def _UnarySub(self, t): self._write("-") self._dispatch(t.expr) def _With(self, t): self._fill('with ') self._dispatch(t.expr) if t.vars: self._write(' as ') self._dispatch(t.vars.name) self._enter() self._dispatch(t.body) self._leave() self._write('\n') def _int(self, t): self._write(repr(t)) def __binary_op(self, t, symbol): # Check if parenthesis are needed on left side and then dispatch has_paren = False left_class = str(t.left.__class__) if (left_class in op_precedence.keys() and op_precedence[left_class] < op_precedence[str(t.__class__)]): has_paren = True if has_paren: self._write('(') self._dispatch(t.left) if has_paren: self._write(')') # Write the appropriate symbol for operator self._write(symbol) # Check if parenthesis are needed on the right side and then dispatch has_paren = False right_class = str(t.right.__class__) if (right_class in op_precedence.keys() and op_precedence[right_class] < op_precedence[str(t.__class__)]): has_paren = True if has_paren: self._write('(') self._dispatch(t.right) if has_paren: self._write(')') def _float(self, t): # if t is 0.1, str(t)->'0.1' while repr(t)->'0.1000000000001' # We prefer str here. self._write(str(t)) def _str(self, t): self._write(repr(t)) def _tuple(self, t): self._write(str(t)) ######################################################################### # These are the methods from the _ast modules unparse. # # As our needs to handle more advanced code increase, we may want to # modify some of the methods below so that they work for compiler.ast. ######################################################################### # # stmt # def _Expr(self, tree): # self._fill() # self._dispatch(tree.value) # # def _Import(self, t): # self._fill("import ") # first = True # for a in t.names: # if first: # first = False # else: # self._write(", ") # self._write(a.name) # if a.asname: # self._write(" as "+a.asname) # ## def _ImportFrom(self, t): ## self._fill("from ") ## self._write(t.module) ## self._write(" import ") ## for i, a in enumerate(t.names): ## if i == 0: ## self._write(", ") ## self._write(a.name) ## if a.asname: ## self._write(" as "+a.asname) ## # XXX(jpe) what is level for? ## # # def _Break(self, t): # self._fill("break") # # def _Continue(self, t): # self._fill("continue") # # def _Delete(self, t): # self._fill("del ") # self._dispatch(t.targets) # # def _Assert(self, t): # self._fill("assert ") # self._dispatch(t.test) # if t.msg: # self._write(", ") # self._dispatch(t.msg) # # def _Exec(self, t): # self._fill("exec ") # self._dispatch(t.body) # if t.globals: # self._write(" in ") # self._dispatch(t.globals) # if t.locals: # self._write(", ") # self._dispatch(t.locals) # # def _Print(self, t): # self._fill("print ") # do_comma = False # if t.dest: # self._write(">>") # self._dispatch(t.dest) # do_comma = True # for e in t.values: # if do_comma:self._write(", ") # else:do_comma=True # self._dispatch(e) # if not t.nl: # self._write(",") # # def _Global(self, t): # self._fill("global") # for i, n in enumerate(t.names): # if i != 0: # self._write(",") # self._write(" " + n) # # def _Yield(self, t): # self._fill("yield") # if t.value: # self._write(" (") # self._dispatch(t.value) # self._write(")") # # def _Raise(self, t): # self._fill('raise ') # if t.type: # self._dispatch(t.type) # if t.inst: # self._write(", ") # self._dispatch(t.inst) # if t.tback: # self._write(", ") # self._dispatch(t.tback) # # # def _TryFinally(self, t): # self._fill("try") # self._enter() # self._dispatch(t.body) # self._leave() # # self._fill("finally") # self._enter() # self._dispatch(t.finalbody) # self._leave() # # def _excepthandler(self, t): # self._fill("except ") # if t.type: # self._dispatch(t.type) # if t.name: # self._write(", ") # self._dispatch(t.name) # self._enter() # self._dispatch(t.body) # self._leave() # # def _ClassDef(self, t): # self._write("\n") # self._fill("class "+t.name) # if t.bases: # self._write("(") # for a in t.bases: # self._dispatch(a) # self._write(", ") # self._write(")") # self._enter() # self._dispatch(t.body) # self._leave() # # def _FunctionDef(self, t): # self._write("\n") # for deco in t.decorators: # self._fill("@") # self._dispatch(deco) # self._fill("def "+t.name + "(") # self._dispatch(t.args) # self._write(")") # self._enter() # self._dispatch(t.body) # self._leave() # # def _For(self, t): # self._fill("for ") # self._dispatch(t.target) # self._write(" in ") # self._dispatch(t.iter) # self._enter() # self._dispatch(t.body) # self._leave() # if t.orelse: # self._fill("else") # self._enter() # self._dispatch(t.orelse) # self._leave # # def _While(self, t): # self._fill("while ") # self._dispatch(t.test) # self._enter() # self._dispatch(t.body) # self._leave() # if t.orelse: # self._fill("else") # self._enter() # self._dispatch(t.orelse) # self._leave # # # expr # def _Str(self, tree): # self._write(repr(tree.s)) ## # def _Repr(self, t): # self._write("`") # self._dispatch(t.value) # self._write("`") # # def _Num(self, t): # self._write(repr(t.n)) # # def _ListComp(self, t): # self._write("[") # self._dispatch(t.elt) # for gen in t.generators: # self._dispatch(gen) # self._write("]") # # def _GeneratorExp(self, t): # self._write("(") # self._dispatch(t.elt) # for gen in t.generators: # self._dispatch(gen) # self._write(")") # # def _comprehension(self, t): # self._write(" for ") # self._dispatch(t.target) # self._write(" in ") # self._dispatch(t.iter) # for if_clause in t.ifs: # self._write(" if ") # self._dispatch(if_clause) # # def _IfExp(self, t): # self._dispatch(t.body) # self._write(" if ") # self._dispatch(t.test) # if t.orelse: # self._write(" else ") # self._dispatch(t.orelse) # # unop = {"Invert":"~", "Not": "not", "UAdd":"+", "USub":"-"} # def _UnaryOp(self, t): # self._write(self.unop[t.op.__class__.__name__]) # self._write("(") # self._dispatch(t.operand) # self._write(")") # # binop = { "Add":"+", "Sub":"-", "Mult":"*", "Div":"/", "Mod":"%", # "LShift":">>", "RShift":"<<", "BitOr":"|", "BitXor":"^", "BitAnd":"&", # "FloorDiv":"//", "Pow": "**"} # def _BinOp(self, t): # self._write("(") # self._dispatch(t.left) # self._write(")" + self.binop[t.op.__class__.__name__] + "(") # self._dispatch(t.right) # self._write(")") # # boolops = {_ast.And: 'and', _ast.Or: 'or'} # def _BoolOp(self, t): # self._write("(") # self._dispatch(t.values[0]) # for v in t.values[1:]: # self._write(" %s " % self.boolops[t.op.__class__]) # self._dispatch(v) # self._write(")") # # def _Attribute(self,t): # self._dispatch(t.value) # self._write(".") # self._write(t.attr) # ## def _Call(self, t): ## self._dispatch(t.func) ## self._write("(") ## comma = False ## for e in t.args: ## if comma: self._write(", ") ## else: comma = True ## self._dispatch(e) ## for e in t.keywords: ## if comma: self._write(", ") ## else: comma = True ## self._dispatch(e) ## if t.starargs: ## if comma: self._write(", ") ## else: comma = True ## self._write("*") ## self._dispatch(t.starargs) ## if t.kwargs: ## if comma: self._write(", ") ## else: comma = True ## self._write("**") ## self._dispatch(t.kwargs) ## self._write(")") # # # slice # def _Index(self, t): # self._dispatch(t.value) # # def _ExtSlice(self, t): # for i, d in enumerate(t.dims): # if i != 0: # self._write(': ') # self._dispatch(d) # # # others # def _arguments(self, t): # first = True # nonDef = len(t.args)-len(t.defaults) # for a in t.args[0:nonDef]: # if first:first = False # else: self._write(", ") # self._dispatch(a) # for a,d in zip(t.args[nonDef:], t.defaults): # if first:first = False # else: self._write(", ") # self._dispatch(a), # self._write("=") # self._dispatch(d) # if t.vararg: # if first:first = False # else: self._write(", ") # self._write("*"+t.vararg) # if t.kwarg: # if first:first = False # else: self._write(", ") # self._write("**"+t.kwarg) # ## def _keyword(self, t): ## self._write(t.arg) ## self._write("=") ## self._dispatch(t.value) # # def _Lambda(self, t): # self._write("lambda ") # self._dispatch(t.args) # self._write(": ") # self._dispatch(t.body) mayavi-4.5.0/docs/source/mayavi/sphinxext/sphinxext/compiler_unparse.pyc0000644000076500000240000005451012730052416027305 0ustar prabhustaff00000000000000 4Wc@`sdZddlmZmZmZddlZddlmZmZm Z m Z m Z m Z m Z ejddkrddlmZnddlmZedZidd6d d 6d d 6d d 6d d6ZdddYZdS(s Turn ast structures back into executable python code. The unparse method takes a compiler.ast tree and transforms it back into valid python code. It is incomplete and currently only works for import statements, function calls, function definitions, assignments, and basic expressions. Inspired by python-2.5-svn/Demo/parser/unparse.py fixme: The API of ast has changed. Many parts of this module are broken. Only attempted fixing unparsing for _ast.Assign and _ast.Call i(tdivisiontabsolute_importtprint_functionN(tNumtNametTupletDivtMulttSubtAddi(tStringIOcC`s)t}t||||jjS(N(R tUnparseCompilerAsttgetvaluetlstrip(tasttsingle_line_functionsts((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/compiler_unparse.pytunparses s ast.Powerisast.Multsast.Divisast.Addsast.SubR cB`s$eZdZejedZddZdZdZ dZ dZ dZ d Z d Zd Zd Zd ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!dZ"dZ#d Z$d!Z%d"Z&d#Z'd$Z(d%Z)d&Z*d'Z+d(Z,d)Z-d*Z.d+Z/d,Z0d-Z1d.Z2d/Z3d0Z4d1Z5d2Z6d3Z7d4Z8d5Z9d6Z:d7Z;d8Z<d9Z=d:Z>d;Z?RS(<s Methods in this class recursively traverse an AST and output source code for the abstract syntax; original formatting is disregarged. cC`sO||_||_t|_d|_|j||jd|jjdS(sb Unparser(tree, file=sys.stdout) -> None. Print the source for tree to file. is N(tft _single_functTruet _do_indentt_indentt _dispatcht_writetflush(tselfttreetfileR((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/compiler_unparse.pyt__init__)s      tcC`s9|jr(|jdd|j|n |j|dS(sBIndent a piece of text, according to the current indentation levels s N(RRR(Rttext((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/compiler_unparse.pyt_fill<s cC`s|jj|dS(s+Append a piece of text to the current line.N(Rtwrite(RR((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/compiler_unparse.pyRCscC`s |jd|jd7_dS(s(Print ':', and increase the indentation.s: iN(RR(R((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/compiler_unparse.pyt_enterGs cC`s|jd8_dS(sDecrease the indentation level.iN(R(R((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/compiler_unparse.pyt_leaveLscC`sxt|tr1x|D]}|j|qWdSt|d|jj}|jjdkrj|j rjdS||dS(s<_dispatcher function, _dispatching tree type T to method _T.Nt_tNoneType(t isinstancetlistRtgetattrt __class__t__name__R(RRtttmeth((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/compiler_unparse.pyRPs cC`s|j|ddS(Nt+(t_UnparseCompilerAst__binary_op(RR+((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/compiler_unparse.pyt_AddcscC`st|jdxSt|jD]B\}}|j||t|jdkr|jdqqW|jddS(Ns (is) and (t)(Rt enumeratetnodesRtlen(RR+titnode((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/compiler_unparse.pyt_Andfs   cC`s(|j|j|jd|jdS(s4 Handle assigning an attribute of an object t.N(RtexprRtattrname(RR+((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/compiler_unparse.pyt_AssAttrnscC`se|jx+|jD] }|j||jdqW|j|j|jsa|jdndS(s Expression Assignment such as "a = 1". This only handles assignment in expressions. Keyword assignment is handled separately. s = s; N(R ttargetsRRtvalueR(RR+ttarget((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/compiler_unparse.pyt_Assignts   cC`s|j|dS(sw Name on left hand side of expression. Treat just like a name on the right side of an expression. N(t_Name(RR+((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/compiler_unparse.pyt_AssNamescC`sPx/|jd D] }|j||jdqW|jd}|j|dS(s3 Tuple on left hand side of an expression. is, N(R2RR(RR+telementt last_element((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/compiler_unparse.pyt _AssTuples   cC`s_|j|j|j|jd|jd|j|j|js[|jdndS(s* +=,-=,*=,/=,**=, etc. operations t t;N(R RR5RtopR8R(RR+((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/compiler_unparse.pyt _AugAssigns   cC`stxmt|jD]\\}}|jd|j||jd|t|jdkr|jdqqWdS(s Bit and operation. t(R0is & N(R1R2RRR3(RR+R4R5((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/compiler_unparse.pyt_Bitands    cC`stxmt|jD]\\}}|jd|j||jd|t|jdkr|jdqqWdS(s Bit or operation RHR0is | N(R1R2RRR3(RR+R4R5((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/compiler_unparse.pyt_Bitors    cC`s|j|j|jdt}x:|jD]/}|rI|jdnt}|j|q-W|jr|r|jdnt}|jd|j|jn|jr|r|jdnt}|jd|j|jn|jddS(s Function call. RHs, t*s**R0N(RtfuncRtFalsetargsRtstarargstkwargs(RR+tcommate((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/compiler_unparse.pyt_Calls*     cC`sP|j|jx9|jD].\}}|jd|d|j|qWdS(NRD(RR8topsR(RR+RFR8((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/compiler_unparse.pyt_ComparescC`s|j|jdS(s6 A constant value such as an integer value, 3 N(Rtn(RR+((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/compiler_unparse.pyt_NumscC`s|jt|jdS(s$ NameConstant such as False N(RtreprR<(RR+((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/compiler_unparse.pyt _NameConstantscC`s|j|jdS(s) A string value such as "hello". N(RR(RR+((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/compiler_unparse.pyt_StrscC`s%x|jD]}|j|q WdS(s5 Handle function decorators (eg. @has_units) N(R2R(RR+R5((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/compiler_unparse.pyt _DecoratorsscC`s|jdxst|jD]b\}\}}|j||jd|j||t|jdkr|jdqqW|jddS(Nt{s: is, t}(RR1titemsRR3(RR+R4tktv((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/compiler_unparse.pyt_Dicts "   cC`s|j|j|jdS(sD Node for when return value is ignored such as in "foo(a)". N(R RR8(RR+((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/compiler_unparse.pyt_Discards cC`s|j|ddS(Nt/(R.(RR+((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/compiler_unparse.pyt_DivscC`s|jddS(Ns...(R(RR+((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/compiler_unparse.pyt _EllipsisscC`s|jd|j|j|jdxlt|jD][\}\}}|dkrh|jdn|j||dk r:|jd|q:q:WdS(s3 Handle "from xyz import foo, bar as baz". sfrom s import is, s as N(R RtmodnameR1tnamestNone(RR+R4tnametasname((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/compiler_unparse.pyt_Froms  "   cC`s]x+|jD] }|jd|j|q W|jd|jdd gt|jt|jt|j}xt t |j|D]w\}}|j |d|dd k r|j d|j|dn|t|jdkr|j dqqW|j d|j r,t |_n|j|j|j|jt|_d S( s% Handle function definitions t@sdef RHiit=s, R0N(tdecorator_listR RRiRhR3targnamestdefaultsR'R1tzipRRRMRR"tcodeR#R(RR+t decoratorRpR4targ((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/compiler_unparse.pyt _FunctionDef s& 0%      cC`sst|jttttfrK|jd|j|j|jdn|j|j|jd|jdS(s2 Handle getting an attribute of an object RHR0R7N( R&R8RRRR RRR9(RR+((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/compiler_unparse.pyt_Getattr#s  cC`s|jxt|jD]\}\}}|dkrH|jdn |jd|j||j|j|j||j|jdqW|jdk r|jd|j|j|j|j|j|jdndS(Nisif selif s telse( R R1ttestsRRR"R#telse_Rh(RR+R4tcompareRr((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/compiler_unparse.pyt_If/s$ "           cC`sm|j|j|jd|j|j|jdk ri|jd|j|j|jdndS(Ns if s else (R0(RtthenRttestRyRh(RR+((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/compiler_unparse.pyt_IfExpFs  cC`s|jdxlt|jD][\}\}}|dkrK|jdn|j||dk r|jd|qqWdS(s" Handle "import xyz.foo". simport is, s as N(R R1RgRRh(RR+R4RiRj((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/compiler_unparse.pyt_ImportPs "   cC`s1|j|j|jd|j|jdS(sI Keyword value assignment within function calls and definitions. RmN(RRiRR8(RR+((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/compiler_unparse.pyt_Keyword\s cC`st|jdxSt|jD]B\}}|j||t|jdkr|jdqqW|jddS(Nt[is, t](RR1teltsRR3(RR+R4R5((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/compiler_unparse.pyt_Listcs   cC`s6|jdk r"|j|jn|j|jdS(N(tdocRhRR5(RR+((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/compiler_unparse.pyt_ModulekscC`s|j|ddS(NRK(R.(RR+((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/compiler_unparse.pyt_MultpscC`s|j|jdS(N(Rtid(RR+((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/compiler_unparse.pyR?sscC`s|jddS(NRh(R(RR+((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/compiler_unparse.pyt _NoneTypevscC`s.|jd|j|j|jddS(Nsnot (R0(RRR8(RR+((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/compiler_unparse.pyt_Notys cC`st|jdxSt|jD]B\}}|j||t|jdkr|jdqqW|jddS(Ns (is) or (R0(RR1R2RR3(RR+R4R5((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/compiler_unparse.pyt_Or~s   cC`s|jddS(Nspass (R(RR+((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/compiler_unparse.pyt_PassscC`s|jd|jrC|jd|j|j|jdnt}x:|jD]/}|ro|jdnt}|j|qSWdS(Nsprint s>> s, (R tdestRRRMR2R(RR+RQR5((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/compiler_unparse.pyt_Printnls   cC`s|j|ddS(Ns**(R.(RR+((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/compiler_unparse.pyt_PowerscC`s|jd|jrt|jtrfdjg|jjD]}|j^q>}|j|n|j|j|j s|jdqndS(Nsreturn s, s; ( R R<R&RtjointasListRiRRR(RR+RiR((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/compiler_unparse.pyt_Returns  . cC`ss|j|j|jd|jr9|j|jn|jd|jrb|j|jn|jddS(NRt:R(RR8Rtlowertupper(RR+((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/compiler_unparse.pyt_Slices    cC`snxgt|jD]V\}}|dkr8|jdnt|toS|jdks|j|qqWdS(NiR(R1R2RR&RR<RhR(RR+R4R5((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/compiler_unparse.pyt _Sliceobjs  cC`s%x|jD]}|j|q WdS(N(R2R(RRR5((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/compiler_unparse.pyt_StmtscC`s|j|ddS(Nt-(R.(RR+((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/compiler_unparse.pyt_SubscC`sw|j|j|jdxFt|jD]5\}}|dkrU|jdn|j|q-W|jddS(NRit,R(RR8RR1tsubs(RR+R4R<((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/compiler_unparse.pyt _Subscripts  cC`s|jd|j|j|j|jx|jD]z}|jd|j|d|ddk r|jd|j|dn|j|j|d|jq;W|jr|jd|j|j|j|jndS(Nttrysexcept iis, iRw( R R"RtbodyR#thandlersRhRRy(RR+thandler((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/compiler_unparse.pyt _TryExcepts$         cC`s|js|jdnf|jdx/|jd D] }|j||jdq4W|jd}|j||jddS(Ns()RHis, R0(R2RR(RR+RARB((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/compiler_unparse.pyt_Tuples     cC`s!|jd|j|jdS(NR-(RRR8(RR+((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/compiler_unparse.pyt _UnaryAdds cC`s!|jd|j|jdS(NR(RRR8(RR+((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/compiler_unparse.pyt _UnarySubs cC`s~|jd|j|j|jrI|jd|j|jjn|j|j|j|j|jddS(Nswith s as s ( R RR8tvarsRRiR"RR#(RR+((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/compiler_unparse.pyt_Withs     cC`s|jt|dS(N(RRX(RR+((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/compiler_unparse.pyt_intscC`s)t}t|jj}|tjkrPt|tt|jkrPt}n|rf|jdn|j|j|r|jdn|j|t}t|j j}|tjkrt|tt|jkrt}n|r|jdn|j|j |r%|jdndS(NRHR0( RMtstrtleftR)t op_precedencetkeysRRRtright(RR+tsymbolt has_parent left_classt right_class((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/compiler_unparse.pyt __binary_ops*   cC`s|jt|dS(N(RR(RR+((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/compiler_unparse.pyt_float scC`s|jt|dS(N(RRX(RR+((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/compiler_unparse.pyt_str%scC`s|jt|dS(N(RR(RR+((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/compiler_unparse.pyt_tuple(s(@R*t __module__t__doc__tsyststdoutRMRR RR"R#RR/R6R:R>R@RCRGRIRJRSRURWRYRZR[RaRbRdReRkRuRvR{R~RRRRRR?RRRRRRRRRRRRRRRRRRR.RRR(((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/compiler_unparse.pyR sv                                           ((Rt __future__RRRRRRRRRRRR t version_infotioR RMRRR (((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/compiler_unparse.pyt s 4 mayavi-4.5.0/docs/source/mayavi/sphinxext/sphinxext/docscrape.py0000644000076500000240000004323012747716313025546 0ustar prabhustaff00000000000000"""Extract reference documentation from the NumPy source tree. """ from __future__ import division, absolute_import, print_function import inspect import textwrap import re import pydoc from warnings import warn import collections import sys class Reader(object): """A line-based string reader. """ def __init__(self, data): """ Parameters ---------- data : str String with lines separated by '\n'. """ if isinstance(data, list): self._str = data else: self._str = data.split('\n') # store string as list of lines self.reset() def __getitem__(self, n): return self._str[n] def reset(self): self._l = 0 # current line nr def read(self): if not self.eof(): out = self[self._l] self._l += 1 return out else: return '' def seek_next_non_empty_line(self): for l in self[self._l:]: if l.strip(): break else: self._l += 1 def eof(self): return self._l >= len(self._str) def read_to_condition(self, condition_func): start = self._l for line in self[start:]: if condition_func(line): return self[start:self._l] self._l += 1 if self.eof(): return self[start:self._l+1] return [] def read_to_next_empty_line(self): self.seek_next_non_empty_line() def is_empty(line): return not line.strip() return self.read_to_condition(is_empty) def read_to_next_unindented_line(self): def is_unindented(line): return (line.strip() and (len(line.lstrip()) == len(line))) return self.read_to_condition(is_unindented) def peek(self, n=0): if self._l + n < len(self._str): return self[self._l + n] else: return '' def is_empty(self): return not ''.join(self._str).strip() class ParseError(Exception): def __str__(self): message = self.message if hasattr(self, 'docstring'): message = "%s in %r" % (message, self.docstring) return message class NumpyDocString(collections.Mapping): def __init__(self, docstring, config={}): orig_docstring = docstring docstring = textwrap.dedent(docstring).split('\n') self._doc = Reader(docstring) self._parsed_data = { 'Signature': '', 'Summary': [''], 'Extended Summary': [], 'Parameters': [], 'Returns': [], 'Yields': [], 'Raises': [], 'Warns': [], 'Other Parameters': [], 'Attributes': [], 'Methods': [], 'See Also': [], 'Notes': [], 'Warnings': [], 'References': '', 'Examples': '', 'index': {} } try: self._parse() except ParseError as e: e.docstring = orig_docstring raise def __getitem__(self, key): return self._parsed_data[key] def __setitem__(self, key, val): if key not in self._parsed_data: warn("Unknown section %s" % key) else: self._parsed_data[key] = val def __iter__(self): return iter(self._parsed_data) def __len__(self): return len(self._parsed_data) def _is_at_section(self): self._doc.seek_next_non_empty_line() if self._doc.eof(): return False l1 = self._doc.peek().strip() # e.g. Parameters if l1.startswith('.. index::'): return True l2 = self._doc.peek(1).strip() # ---------- or ========== return l2.startswith('-'*len(l1)) or l2.startswith('='*len(l1)) def _strip(self, doc): i = 0 j = 0 for i, line in enumerate(doc): if line.strip(): break for j, line in enumerate(doc[::-1]): if line.strip(): break return doc[i:len(doc)-j] def _read_to_next_section(self): section = self._doc.read_to_next_empty_line() while not self._is_at_section() and not self._doc.eof(): if not self._doc.peek(-1).strip(): # previous line was empty section += [''] section += self._doc.read_to_next_empty_line() return section def _read_sections(self): while not self._doc.eof(): data = self._read_to_next_section() name = data[0].strip() if name.startswith('..'): # index section yield name, data[1:] elif len(data) < 2: yield StopIteration else: yield name, self._strip(data[2:]) def _parse_param_list(self, content): r = Reader(content) params = [] while not r.eof(): header = r.read().strip() if ' : ' in header: arg_name, arg_type = header.split(' : ')[:2] else: arg_name, arg_type = header, '' desc = r.read_to_next_unindented_line() desc = dedent_lines(desc) params.append((arg_name, arg_type, desc)) return params _name_rgx = re.compile(r"^\s*(:(?P\w+):`(?P[a-zA-Z0-9_.-]+)`|" r" (?P[a-zA-Z0-9_.-]+))\s*", re.X) def _parse_see_also(self, content): """ func_name : Descriptive text continued text another_func_name : Descriptive text func_name1, func_name2, :meth:`func_name`, func_name3 """ items = [] def parse_item_name(text): """Match ':role:`name`' or 'name'""" m = self._name_rgx.match(text) if m: g = m.groups() if g[1] is None: return g[3], None else: return g[2], g[1] raise ParseError("%s is not a item name" % text) def push_item(name, rest): if not name: return name, role = parse_item_name(name) items.append((name, list(rest), role)) del rest[:] current_func = None rest = [] for line in content: if not line.strip(): continue m = self._name_rgx.match(line) if m and line[m.end():].strip().startswith(':'): push_item(current_func, rest) current_func, line = line[:m.end()], line[m.end():] rest = [line.split(':', 1)[1].strip()] if not rest[0]: rest = [] elif not line.startswith(' '): push_item(current_func, rest) current_func = None if ',' in line: for func in line.split(','): if func.strip(): push_item(func, []) elif line.strip(): current_func = line elif current_func is not None: rest.append(line.strip()) push_item(current_func, rest) return items def _parse_index(self, section, content): """ .. index: default :refguide: something, else, and more """ def strip_each_in(lst): return [s.strip() for s in lst] out = {} section = section.split('::') if len(section) > 1: out['default'] = strip_each_in(section[1].split(','))[0] for line in content: line = line.split(':') if len(line) > 2: out[line[1]] = strip_each_in(line[2].split(',')) return out def _parse_summary(self): """Grab signature (if given) and summary""" if self._is_at_section(): return # If several signatures present, take the last one while True: summary = self._doc.read_to_next_empty_line() summary_str = " ".join([s.strip() for s in summary]).strip() if re.compile('^([\w., ]+=)?\s*[\w\.]+\(.*\)$').match(summary_str): self['Signature'] = summary_str if not self._is_at_section(): continue break if summary is not None: self['Summary'] = summary if not self._is_at_section(): self['Extended Summary'] = self._read_to_next_section() def _parse(self): self._doc.reset() self._parse_summary() sections = list(self._read_sections()) section_names = set([section for section, content in sections]) has_returns = 'Returns' in section_names has_yields = 'Yields' in section_names # We could do more tests, but we are not. Arbitrarily. if has_returns and has_yields: msg = 'Docstring contains both a Returns and Yields section.' raise ValueError(msg) for (section, content) in sections: if not section.startswith('..'): section = (s.capitalize() for s in section.split(' ')) section = ' '.join(section) if section in ('Parameters', 'Returns', 'Yields', 'Raises', 'Warns', 'Other Parameters', 'Attributes', 'Methods'): self[section] = self._parse_param_list(content) elif section.startswith('.. index::'): self['index'] = self._parse_index(section, content) elif section == 'See Also': self['See Also'] = self._parse_see_also(content) else: self[section] = content # string conversion routines def _str_header(self, name, symbol='-'): return [name, len(name)*symbol] def _str_indent(self, doc, indent=4): out = [] for line in doc: out += [' '*indent + line] return out def _str_signature(self): if self['Signature']: return [self['Signature'].replace('*', '\*')] + [''] else: return [''] def _str_summary(self): if self['Summary']: return self['Summary'] + [''] else: return [] def _str_extended_summary(self): if self['Extended Summary']: return self['Extended Summary'] + [''] else: return [] def _str_param_list(self, name): out = [] if self[name]: out += self._str_header(name) for param, param_type, desc in self[name]: if param_type: out += ['%s : %s' % (param, param_type)] else: out += [param] out += self._str_indent(desc) out += [''] return out def _str_section(self, name): out = [] if self[name]: out += self._str_header(name) out += self[name] out += [''] return out def _str_see_also(self, func_role): if not self['See Also']: return [] out = [] out += self._str_header("See Also") last_had_desc = True for func, desc, role in self['See Also']: if role: link = ':%s:`%s`' % (role, func) elif func_role: link = ':%s:`%s`' % (func_role, func) else: link = "`%s`_" % func if desc or last_had_desc: out += [''] out += [link] else: out[-1] += ", %s" % link if desc: out += self._str_indent([' '.join(desc)]) last_had_desc = True else: last_had_desc = False out += [''] return out def _str_index(self): idx = self['index'] out = [] out += ['.. index:: %s' % idx.get('default', '')] for section, references in idx.items(): if section == 'default': continue out += [' :%s: %s' % (section, ', '.join(references))] return out def __str__(self, func_role=''): out = [] out += self._str_signature() out += self._str_summary() out += self._str_extended_summary() for param_list in ('Parameters', 'Returns', 'Yields', 'Other Parameters', 'Raises', 'Warns'): out += self._str_param_list(param_list) out += self._str_section('Warnings') out += self._str_see_also(func_role) for s in ('Notes', 'References', 'Examples'): out += self._str_section(s) for param_list in ('Attributes', 'Methods'): out += self._str_param_list(param_list) out += self._str_index() return '\n'.join(out) def indent(str, indent=4): indent_str = ' '*indent if str is None: return indent_str lines = str.split('\n') return '\n'.join(indent_str + l for l in lines) def dedent_lines(lines): """Deindent a list of lines maximally""" return textwrap.dedent("\n".join(lines)).split("\n") def header(text, style='-'): return text + '\n' + style*len(text) + '\n' class FunctionDoc(NumpyDocString): def __init__(self, func, role='func', doc=None, config={}): self._f = func self._role = role # e.g. "func" or "meth" if doc is None: if func is None: raise ValueError("No function or docstring given") doc = inspect.getdoc(func) or '' NumpyDocString.__init__(self, doc) if not self['Signature'] and func is not None: func, func_name = self.get_func() try: if hasattr(inspect, 'signature'): signature = str(inspect.signature(func)) else: # try to read signature, backward compat for older Python if sys.version_info[0] >= 3: argspec = inspect.getfullargspec(func) else: argspec = inspect.getargspec(func) signature = inspect.formatargspec(*argspec) signature = '%s%s' % (func_name, signature.replace('*', '\*')) except TypeError: signature = '%s()' % func_name self['Signature'] = signature def get_func(self): func_name = getattr(self._f, '__name__', self.__class__.__name__) if inspect.isclass(self._f): func = getattr(self._f, '__call__', self._f.__init__) else: func = self._f return func, func_name def __str__(self): out = '' func, func_name = self.get_func() signature = self['Signature'].replace('*', '\*') roles = {'func': 'function', 'meth': 'method'} if self._role: if self._role not in roles: print("Warning: invalid role %s" % self._role) out += '.. %s:: %s\n \n\n' % (roles.get(self._role, ''), func_name) out += super(FunctionDoc, self).__str__(func_role=self._role) return out class ClassDoc(NumpyDocString): extra_public_methods = ['__call__'] def __init__(self, cls, doc=None, modulename='', func_doc=FunctionDoc, config={}): if not inspect.isclass(cls) and cls is not None: raise ValueError("Expected a class or None, but got %r" % cls) self._cls = cls self.show_inherited_members = config.get( 'show_inherited_class_members', True) if modulename and not modulename.endswith('.'): modulename += '.' self._mod = modulename if doc is None: if cls is None: raise ValueError("No class or documentation string given") doc = pydoc.getdoc(cls) NumpyDocString.__init__(self, doc) if config.get('show_class_members', True): def splitlines_x(s): if not s: return [] else: return s.splitlines() for field, items in [('Methods', self.methods), ('Attributes', self.properties)]: if not self[field]: doc_list = [] for name in sorted(items): try: doc_item = pydoc.getdoc(getattr(self._cls, name)) doc_list.append((name, '', splitlines_x(doc_item))) except AttributeError: pass # method doesn't exist self[field] = doc_list @property def methods(self): if self._cls is None: return [] return [name for name, func in inspect.getmembers(self._cls) if ((not name.startswith('_') or name in self.extra_public_methods) and isinstance(func, collections.Callable) and self._is_show_member(name))] @property def properties(self): if self._cls is None: return [] return [name for name, func in inspect.getmembers(self._cls) if (not name.startswith('_') and (func is None or isinstance(func, property) or inspect.isgetsetdescriptor(func)) and self._is_show_member(name))] def _is_show_member(self, name): if self.show_inherited_members: return True # show all class members if name not in self._cls.__dict__: return False # class member is inherited, we do not show it return True mayavi-4.5.0/docs/source/mayavi/sphinxext/sphinxext/docscrape.pyc0000644000076500000240000005437712664320604025717 0ustar prabhustaff00000000000000 "Vc@`sdZddlmZmZmZddlZddlZddlZddlZddl m Z ddl Z ddl Z de fdYZdefdYZd e jfd YZd d Zd ZddZdefdYZdefdYZdS(s=Extract reference documentation from the NumPy source tree. i(tdivisiontabsolute_importtprint_functionN(twarntReadercB`steZdZdZdZdZdZdZdZdZ dZ d Z d d Z d Z RS( s!A line-based string reader. cC`s;t|tr||_n|jd|_|jdS(sr Parameters ---------- data : str String with lines separated by ' '. s N(t isinstancetlistt_strtsplittreset(tselftdata((sT/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/docscrape.pyt__init__s cC`s |j|S(N(R(R tn((sT/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/docscrape.pyt __getitem__"scC`s d|_dS(Ni(t_l(R ((sT/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/docscrape.pyR %scC`s4|js,||j}|jd7_|SdSdS(Nit(teofR(R tout((sT/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/docscrape.pytread(s   cC`s;x4||jD]%}|jr$Pq|jd7_qWdS(Ni(Rtstrip(R tl((sT/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/docscrape.pytseek_next_non_empty_line0s cC`s|jt|jkS(N(RtlenR(R ((sT/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/docscrape.pyR7scC`si|j}xY||D]M}||r4|||j!S|jd7_|jr|||jd!SqWgS(Ni(RR(R tcondition_functstarttline((sT/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/docscrape.pytread_to_condition:s   cC`s |jd}|j|S(NcS`s |j S(N(R(R((sT/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/docscrape.pytis_emptyGs(RR(R R((sT/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/docscrape.pytread_to_next_empty_lineDs  cC`sd}|j|S(NcS`s(|jo't|jt|kS(N(RRtlstrip(R((sT/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/docscrape.pyt is_unindentedMs(R(R R((sT/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/docscrape.pytread_to_next_unindented_lineLs icC`s3|j|t|jkr+||j|SdSdS(NR(RRR(R R ((sT/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/docscrape.pytpeekQscC`sdj|jj S(NR(tjoinRR(R ((sT/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/docscrape.pyRWs(t__name__t __module__t__doc__R RR RRRRRR R!R(((sT/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/docscrape.pyRs         t ParseErrorcB`seZdZRS(cC`s2|j}t|dr.d||jf}n|S(Nt docstrings%s in %r(tmessagethasattrR'(R R(((sT/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/docscrape.pyt__str__\s (R#R$R*(((sT/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/docscrape.pyR&[stNumpyDocStringcB`seZidZdZdZdZdZdZdZdZ dZ d Z e j d e jZd Zd Zd ZdZddZddZdZdZdZdZdZdZdZddZRS(cC`s|}tj|jd}t||_idd6dgd6gd6gd6gd6gd6gd 6gd 6gd 6gd 6gd 6gd6gd6gd6dd6dd6id6|_y|jWntk r}||_nXdS(Ns Rt SignaturetSummarysExtended Summaryt ParameterstReturnstYieldstRaisestWarnssOther Parameterst AttributestMethodssSee AlsotNotestWarningst ReferencestExamplestindex( ttextwraptdedentRRt_doct _parsed_datat_parseR&R'(R R'tconfigtorig_docstringte((sT/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/docscrape.pyR ds4   cC`s |j|S(N(R=(R tkey((sT/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/docscrape.pyRscC`s1||jkr td|n ||j|\w+):`(?P[a-zA-Z0-9_.-]+)`| (?P[a-zA-Z0-9_.-]+))\s*c`sgfdfd}d}g}x[|D]S}|jsRq:njj|}|r||jjjdr|||||j ||j}}|jdddjg}|dsg}qq:|jdsk|||d}d|krSxK|jdD]"}|jr*||gq*q*Wq|jr|}qq:|dk r:|j|jq:q:W|||S( s func_name : Descriptive text continued text another_func_name : Descriptive text func_name1, func_name2, :meth:`func_name`, func_name3 c`skjj|}|rW|j}|ddkrB|ddfS|d|dfSntd|dS(sMatch ':role:`name`' or 'name'iiis%s is not a item nameN(t _name_rgxtmatchtgroupstNoneR&(ttexttmtg(R (sT/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/docscrape.pytparse_item_names c`s@|s dS|\}}j|t||f|2dS(N(R[R(RXtresttrole(titemsRk(sT/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/docscrape.pyt push_items t:iit t,N(RgRRdRetendRKRR[(R R\Rot current_funcRlRRitfunc((RnRkR sT/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/docscrape.pyt_parse_see_alsos8   % !         cC`sd}i}|jd}t|dkrT||djdd|dHsRqR.R1R2sOther ParametersR3R4s .. index::R9sSee Also(s ParameterssReturnssYieldssRaisessWarnssOther Parameterss AttributessMethods( R<R RRRYtsett ValueErrorRKRR"RcR{Rv(R tsectionsRUR\t section_namest has_returnst has_yieldstmsg((sT/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/docscrape.pyR>8s,  %     RHcC`s|t||gS(N(R(R RXtsymbol((sT/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/docscrape.pyt _str_headerWsicC`s0g}x#|D]}|d||g7}q W|S(NRq((R RQtindentRR((sT/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/docscrape.pyt _str_indentZs cC`s3|dr(|djddgdgSdgSdS(NR,t*s\*R(treplace(R ((sT/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/docscrape.pyt_str_signature`s cC`s!|dr|ddgSgSdS(NR-R((R ((sT/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/docscrape.pyt _str_summaryfs cC`s!|dr|ddgSgSdS(NsExtended SummaryR((R ((sT/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/docscrape.pyt_str_extended_summaryls cC`sg}||r||j|7}x[||D]O\}}}|r]|d||fg7}n ||g7}||j|7}q.W|dg7}n|S(Ns%s : %sR(RR(R RXRtparamt param_typeRb((sT/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/docscrape.pyt_str_param_listrs  cC`sEg}||rA||j|7}|||7}|dg7}n|S(NR(R(R RXR((sT/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/docscrape.pyt _str_sections  cC`s |dsgSg}||jd7}t}x|dD]\}}}|r`d||f}n#|ryd||f}n d|}|s|r|dg7}||g7}n|dcd|7<|r||jdj|g7}t}q8t}q8W|dg7}|S(NsSee Alsos:%s:`%s`s`%s`_Ris, %sRq(RRLRR"RJ(R t func_roleRt last_had_descRuRbRmtlink((sT/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/docscrape.pyt _str_see_alsos*       cC`s|d}g}|d|jddg7}xL|jD]>\}}|dkrXq:n|d|dj|fg7}q:W|S(NR9s .. index:: %sRzRs :%s: %ss, (tgetRnR"(R tidxRRUt references((sT/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/docscrape.pyt _str_indexs  $RcC`sg}||j7}||j7}||j7}x!dD]}||j|7}q=W||jd7}||j|7}x!dD]}||j|7}qWx!dD]}||j|7}qW||j7}d j|S(NR.R/R0sOther ParametersR1R2R6R5R7R8R3R4s (s ParameterssReturnssYieldssOther ParameterssRaisessWarns(sNotess ReferencessExamples(s AttributessMethods(RRRRRRRR"(R RRt param_listRx((sT/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/docscrape.pyR*s   (R#R$R RRDRFRGRORTRVRYRcR|R}tXRdRvR{RR>RRRRRRRRRR*(((sT/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/docscrape.pyR+cs4          8           ic`sFd||dkrS|jd}djfd|DS(NRqs c3`s|]}|VqdS(N((RR(t indent_str(sT/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/docscrape.pys s(RgRR"(tstrRtlines((RsT/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/docscrape.pyRs   cC`stjdj|jdS(s"Deindent a list of lines maximallys (R:R;R"R(R((sT/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/docscrape.pyRZsRHcC`s|d|t|dS(Ns (R(Rhtstyle((sT/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/docscrape.pyR_st FunctionDoccB`s,eZddidZdZdZRS(RucC`sC||_||_|dkrQ|dkr9tdntj|pKd}ntj|||d r?|dk r?|j\}}yt tdrt tj |}nCt j ddkrtj|}ntj|}tj|}d||jdd f}Wntk r1d |}nX||ds"      L[   7mayavi-4.5.0/docs/source/mayavi/sphinxext/sphinxext/docscrape_sphinx.py0000644000076500000240000002246712747716313027150 0ustar prabhustaff00000000000000from __future__ import division, absolute_import, print_function import sys import re import inspect import textwrap import pydoc import sphinx import collections from .docscrape import NumpyDocString, FunctionDoc, ClassDoc if sys.version_info[0] >= 3: sixu = lambda s: s else: sixu = lambda s: unicode(s, 'unicode_escape') class SphinxDocString(NumpyDocString): def __init__(self, docstring, config={}): NumpyDocString.__init__(self, docstring, config=config) self.load_config(config) def load_config(self, config): self.use_plots = config.get('use_plots', False) self.class_members_toctree = config.get('class_members_toctree', True) # string conversion routines def _str_header(self, name, symbol='`'): return ['.. rubric:: ' + name, ''] def _str_field_list(self, name): return [':' + name + ':'] def _str_indent(self, doc, indent=4): out = [] for line in doc: out += [' '*indent + line] return out def _str_signature(self): return [''] if self['Signature']: return ['``%s``' % self['Signature']] + [''] else: return [''] def _str_summary(self): return self['Summary'] + [''] def _str_extended_summary(self): return self['Extended Summary'] + [''] def _str_returns(self, name='Returns'): out = [] if self[name]: out += self._str_field_list(name) out += [''] for param, param_type, desc in self[name]: if param_type: out += self._str_indent(['**%s** : %s' % (param.strip(), param_type)]) else: out += self._str_indent([param.strip()]) if desc: out += [''] out += self._str_indent(desc, 8) out += [''] return out def _str_param_list(self, name): out = [] if self[name]: out += self._str_field_list(name) out += [''] for param, param_type, desc in self[name]: if param_type: out += self._str_indent(['**%s** : %s' % (param.strip(), param_type)]) else: out += self._str_indent(['**%s**' % param.strip()]) if desc: out += [''] out += self._str_indent(desc, 8) out += [''] return out @property def _obj(self): if hasattr(self, '_cls'): return self._cls elif hasattr(self, '_f'): return self._f return None def _str_member_list(self, name): """ Generate a member listing, autosummary:: table where possible, and a table where not. """ out = [] if self[name]: out += ['.. rubric:: %s' % name, ''] prefix = getattr(self, '_name', '') if prefix: prefix = '~%s.' % prefix autosum = [] others = [] for param, param_type, desc in self[name]: param = param.strip() # Check if the referenced member can have a docstring or not param_obj = getattr(self._obj, param, None) if not (callable(param_obj) or isinstance(param_obj, property) or inspect.isgetsetdescriptor(param_obj)): param_obj = None if param_obj and (pydoc.getdoc(param_obj) or not desc): # Referenced object has a docstring autosum += [" %s%s" % (prefix, param)] else: others.append((param, param_type, desc)) if autosum: out += ['.. autosummary::'] if self.class_members_toctree: out += [' :toctree:'] out += [''] + autosum if others: maxlen_0 = max(3, max([len(x[0]) for x in others])) hdr = sixu("=")*maxlen_0 + sixu(" ") + sixu("=")*10 fmt = sixu('%%%ds %%s ') % (maxlen_0,) out += ['', '', hdr] for param, param_type, desc in others: desc = sixu(" ").join(x.strip() for x in desc).strip() if param_type: desc = "(%s) %s" % (param_type, desc) out += [fmt % (param.strip(), desc)] out += [hdr] out += [''] return out def _str_section(self, name): out = [] if self[name]: out += self._str_header(name) out += [''] content = textwrap.dedent("\n".join(self[name])).split("\n") out += content out += [''] return out def _str_see_also(self, func_role): out = [] if self['See Also']: see_also = super(SphinxDocString, self)._str_see_also(func_role) out = ['.. seealso::', ''] out += self._str_indent(see_also[2:]) return out def _str_warnings(self): out = [] if self['Warnings']: out = ['.. warning::', ''] out += self._str_indent(self['Warnings']) return out def _str_index(self): idx = self['index'] out = [] if len(idx) == 0: return out out += ['.. index:: %s' % idx.get('default', '')] for section, references in idx.items(): if section == 'default': continue elif section == 'refguide': out += [' single: %s' % (', '.join(references))] else: out += [' %s: %s' % (section, ','.join(references))] return out def _str_references(self): out = [] if self['References']: out += self._str_header('References') if isinstance(self['References'], str): self['References'] = [self['References']] out.extend(self['References']) out += [''] # Latex collects all references to a separate bibliography, # so we need to insert links to it if sphinx.__version__ >= "0.6": out += ['.. only:: latex', ''] else: out += ['.. latexonly::', ''] items = [] for line in self['References']: m = re.match(r'.. \[([a-z0-9._-]+)\]', line, re.I) if m: items.append(m.group(1)) out += [' ' + ", ".join(["[%s]_" % item for item in items]), ''] return out def _str_examples(self): examples_str = "\n".join(self['Examples']) if (self.use_plots and 'import matplotlib' in examples_str and 'plot::' not in examples_str): out = [] out += self._str_header('Examples') out += ['.. plot::', ''] out += self._str_indent(self['Examples']) out += [''] return out else: return self._str_section('Examples') def __str__(self, indent=0, func_role="obj"): out = [] out += self._str_signature() out += self._str_index() + [''] out += self._str_summary() out += self._str_extended_summary() out += self._str_param_list('Parameters') out += self._str_returns('Returns') out += self._str_returns('Yields') for param_list in ('Other Parameters', 'Raises', 'Warns'): out += self._str_param_list(param_list) out += self._str_warnings() out += self._str_see_also(func_role) out += self._str_section('Notes') out += self._str_references() out += self._str_examples() for param_list in ('Attributes', 'Methods'): out += self._str_member_list(param_list) out = self._str_indent(out, indent) return '\n'.join(out) class SphinxFunctionDoc(SphinxDocString, FunctionDoc): def __init__(self, obj, doc=None, config={}): self.load_config(config) FunctionDoc.__init__(self, obj, doc=doc, config=config) class SphinxClassDoc(SphinxDocString, ClassDoc): def __init__(self, obj, doc=None, func_doc=None, config={}): self.load_config(config) ClassDoc.__init__(self, obj, doc=doc, func_doc=None, config=config) class SphinxObjDoc(SphinxDocString): def __init__(self, obj, doc=None, config={}): self._f = obj self.load_config(config) SphinxDocString.__init__(self, doc, config=config) def get_doc_object(obj, what=None, doc=None, config={}): if what is None: if inspect.isclass(obj): what = 'class' elif inspect.ismodule(obj): what = 'module' elif isinstance(obj, collections.Callable): what = 'function' else: what = 'object' if what == 'class': return SphinxClassDoc(obj, func_doc=SphinxFunctionDoc, doc=doc, config=config) elif what in ('function', 'method'): return SphinxFunctionDoc(obj, doc=doc, config=config) else: if doc is None: doc = pydoc.getdoc(obj) return SphinxObjDoc(obj, doc, config=config) mayavi-4.5.0/docs/source/mayavi/sphinxext/sphinxext/docscrape_sphinx.pyc0000644000076500000240000003017212664320604027273 0ustar prabhustaff00000000000000 "Vc@`s(ddlmZmZmZddlZddlZddlZddlZddlZddl Z ddl Z ddl m Z m Z mZejddkrdZn dZde fd YZd ee fd YZd eefd YZdefdYZddidZdS(i(tdivisiontabsolute_importtprint_functionNi(tNumpyDocStringt FunctionDoctClassDocicC`s|S(N((ts((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/docscrape_sphinx.pytscC`s t|dS(Ntunicode_escape(tunicode(R((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/docscrape_sphinx.pyRstSphinxDocStringcB`seZidZdZddZdZddZdZdZd Z d d Z d Z e d Z dZdZdZdZdZdZdZdddZRS(cC`s'tj||d||j|dS(Ntconfig(Rt__init__t load_config(tselft docstringR ((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/docscrape_sphinx.pyR scC`s.|jdt|_|jdt|_dS(Nt use_plotstclass_members_toctree(tgettFalseRtTrueR(RR ((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/docscrape_sphinx.pyR st`cC`sd|dgS(Ns .. rubric:: t((Rtnametsymbol((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/docscrape_sphinx.pyt _str_headerscC`sd|dgS(Nt:((RR((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/docscrape_sphinx.pyt_str_field_list sicC`s0g}x#|D]}|d||g7}q W|S(Nt ((Rtdoctindenttouttline((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/docscrape_sphinx.pyt _str_indent#s cC`s2dgS|dr'd|dgdgSdgSdS(NRt Signatures``%s``((R((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/docscrape_sphinx.pyt_str_signature)s cC`s|ddgS(NtSummaryR((R((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/docscrape_sphinx.pyt _str_summary0scC`s|ddgS(NsExtended SummaryR((R((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/docscrape_sphinx.pyt_str_extended_summary3stReturnscC`sg}||r||j|7}|dg7}x||D]\}}}|ry||jd|j|fg7}n||j|jg7}|r|dg7}||j|d7}n|dg7}q;Wn|S(NRs **%s** : %si(RR!tstrip(RRRtparamt param_typetdesc((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/docscrape_sphinx.pyt _str_returns6s   cC`sg}||r||j|7}|dg7}x||D]\}}}|ry||jd|j|fg7}n ||jd|jg7}|r|dg7}||j|d7}n|dg7}q;Wn|S(NRs **%s** : %ss**%s**i(RR!R((RRRR)R*R+((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/docscrape_sphinx.pyt_str_param_listGs    cC`s0t|dr|jSt|dr,|jSdS(Nt_clst_f(thasattrR.R/tNone(R((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/docscrape_sphinx.pyt_objXs cC`srg}||rn|d|dg7}t|dd}|rId|}ng}g}x||D]\}}}|j}t|j|d} t| pt| tptj| sd} n| rt j | s| r|d||fg7}q`|j |||fq`W|rS|dg7}|j r?|dg7}n|dg|7}n|r^t dt g|D]} t| d ^qi} td | td td d } td | f} |dd| g7}xr|D]j\}}}tdjd|Dj}|r-d||f}n|| |j|fg7}qW|| g7}n|dg7}n|S(sp Generate a member listing, autosummary:: table where possible, and a table where not. s.. rubric:: %sRt_names~%s.s %s%ss.. autosummary::s :toctree:iit=s i s %%%ds %%s Rcs`s|]}|jVqdS(N(R((t.0tx((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/docscrape_sphinx.pys ss(%s) %sN(tgetattrR(R2R1tcallablet isinstancetpropertytinspecttisgetsetdescriptortpydoctgetdoctappendRtmaxtlentsixutjoin(RRRtprefixtautosumtothersR)R*R+t param_objR6tmaxlen_0thdrtfmt((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/docscrape_sphinx.pyt_str_member_list`sH       2(%!cC`ssg}||ro||j|7}|dg7}tjdj||jd}||7}|dg7}n|S(NRs (RttextwraptdedentRCtsplit(RRRtcontent((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/docscrape_sphinx.pyt _str_sections  % cC`sRg}|drNtt|j|}ddg}||j|d7}n|S(NsSee Alsos .. seealso::Ri(tsuperR t _str_see_alsoR!(Rt func_roleRtsee_also((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/docscrape_sphinx.pyRRs   cC`s:g}|dr6ddg}||j|d7}n|S(NtWarningss .. warning::R(R!(RR((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/docscrape_sphinx.pyt _str_warningss   cC`s|d}g}t|dkr&|S|d|jddg7}xu|jD]g\}}|dkrnqPqP|dkr|ddj|g7}qP|d |d j|fg7}qPW|S( Ntindexis .. index:: %stdefaultRtrefguides single: %ss, s %s: %st,(RARtitemsRC(RtidxRtsectiont references((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/docscrape_sphinx.pyt _str_indexs   $cC`s'g}|dr#||jd7}t|dtrJ|dg|dR~(RotwhatRR ((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/docscrape_sphinx.pytget_doc_object s         (t __future__RRRtsysReR;RLR=RcRt docscrapeRRRt version_infoRBR R{R|R~R1R(((s[/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/docscrape_sphinx.pyts          mayavi-4.5.0/docs/source/mayavi/sphinxext/sphinxext/numpydoc.py0000644000076500000240000001504512747716313025444 0ustar prabhustaff00000000000000""" ======== numpydoc ======== Sphinx extension that handles docstrings in the Numpy standard format. [1] It will: - Convert Parameters etc. sections to field lists. - Convert See Also section to a See also entry. - Renumber references. - Extract the signature from the docstring, if it can't be determined otherwise. .. [1] https://github.com/numpy/numpy/blob/master/doc/HOWTO_DOCUMENT.rst.txt """ from __future__ import division, absolute_import, print_function import sys import re import pydoc import sphinx import inspect import collections if sphinx.__version__ < '1.0.1': raise RuntimeError("Sphinx 1.0.1 or newer is required") from .docscrape_sphinx import get_doc_object, SphinxDocString from sphinx.util.compat import Directive if sys.version_info[0] >= 3: sixu = lambda s: s else: sixu = lambda s: unicode(s, 'unicode_escape') def mangle_docstrings(app, what, name, obj, options, lines, reference_offset=[0]): cfg = {'use_plots': app.config.numpydoc_use_plots, 'show_class_members': app.config.numpydoc_show_class_members, 'show_inherited_class_members': app.config.numpydoc_show_inherited_class_members, 'class_members_toctree': app.config.numpydoc_class_members_toctree} u_NL = sixu('\n') if what == 'module': # Strip top title pattern = '^\\s*[#*=]{4,}\\n[a-z0-9 -]+\\n[#*=]{4,}\\s*' title_re = re.compile(sixu(pattern), re.I | re.S) lines[:] = title_re.sub(sixu(''), u_NL.join(lines)).split(u_NL) else: doc = get_doc_object(obj, what, u_NL.join(lines), config=cfg) if sys.version_info[0] >= 3: doc = str(doc) else: doc = unicode(doc) lines[:] = doc.split(u_NL) if (app.config.numpydoc_edit_link and hasattr(obj, '__name__') and obj.__name__): if hasattr(obj, '__module__'): v = dict(full_name=sixu("%s.%s") % (obj.__module__, obj.__name__)) else: v = dict(full_name=obj.__name__) lines += [sixu(''), sixu('.. htmlonly::'), sixu('')] lines += [sixu(' %s') % x for x in (app.config.numpydoc_edit_link % v).split("\n")] # replace reference numbers so that there are no duplicates references = [] for line in lines: line = line.strip() m = re.match(sixu('^.. \\[([a-z0-9_.-])\\]'), line, re.I) if m: references.append(m.group(1)) # start renaming from the longest string, to avoid overwriting parts references.sort(key=lambda x: -len(x)) if references: for i, line in enumerate(lines): for r in references: if re.match(sixu('^\\d+$'), r): new_r = sixu("R%d") % (reference_offset[0] + int(r)) else: new_r = sixu("%s%d") % (r, reference_offset[0]) lines[i] = lines[i].replace(sixu('[%s]_') % r, sixu('[%s]_') % new_r) lines[i] = lines[i].replace(sixu('.. [%s]') % r, sixu('.. [%s]') % new_r) reference_offset[0] += len(references) def mangle_signature(app, what, name, obj, options, sig, retann): # Do not try to inspect classes that don't define `__init__` if (inspect.isclass(obj) and (not hasattr(obj, '__init__') or 'initializes x; see ' in pydoc.getdoc(obj.__init__))): return '', '' if not (isinstance(obj, collections.Callable) or hasattr(obj, '__argspec_is_invalid_')): return if not hasattr(obj, '__doc__'): return doc = SphinxDocString(pydoc.getdoc(obj)) if doc['Signature']: sig = re.sub(sixu("^[^(]*"), sixu(""), doc['Signature']) return sig, sixu('') def setup(app, get_doc_object_=get_doc_object): if not hasattr(app, 'add_config_value'): return # probably called by nose, better bail out global get_doc_object get_doc_object = get_doc_object_ app.connect('autodoc-process-docstring', mangle_docstrings) app.connect('autodoc-process-signature', mangle_signature) app.add_config_value('numpydoc_edit_link', None, False) app.add_config_value('numpydoc_use_plots', None, False) app.add_config_value('numpydoc_show_class_members', True, True) app.add_config_value('numpydoc_show_inherited_class_members', True, True) app.add_config_value('numpydoc_class_members_toctree', True, True) # Extra mangling domains app.add_domain(NumpyPythonDomain) app.add_domain(NumpyCDomain) metadata = {'parallel_read_safe': True} return metadata # ------------------------------------------------------------------------------ # Docstring-mangling domains # ------------------------------------------------------------------------------ from docutils.statemachine import ViewList from sphinx.domains.c import CDomain from sphinx.domains.python import PythonDomain class ManglingDomainBase(object): directive_mangling_map = {} def __init__(self, *a, **kw): super(ManglingDomainBase, self).__init__(*a, **kw) self.wrap_mangling_directives() def wrap_mangling_directives(self): for name, objtype in list(self.directive_mangling_map.items()): self.directives[name] = wrap_mangling_directive( self.directives[name], objtype) class NumpyPythonDomain(ManglingDomainBase, PythonDomain): name = 'np' directive_mangling_map = { 'function': 'function', 'class': 'class', 'exception': 'class', 'method': 'function', 'classmethod': 'function', 'staticmethod': 'function', 'attribute': 'attribute', } indices = [] class NumpyCDomain(ManglingDomainBase, CDomain): name = 'np-c' directive_mangling_map = { 'function': 'function', 'member': 'attribute', 'macro': 'function', 'type': 'class', 'var': 'object', } def wrap_mangling_directive(base_directive, objtype): class directive(base_directive): def run(self): env = self.state.document.settings.env name = None if self.arguments: m = re.match(r'^(.*\s+)?(.*?)(\(.*)?', self.arguments[0]) name = m.group(2).strip() if not name: name = self.arguments[0] lines = list(self.content) mangle_docstrings(env.app, objtype, name, None, None, lines) self.content = ViewList(lines, self.content.parent) return base_directive.run(self) return directive mayavi-4.5.0/docs/source/mayavi/sphinxext/sphinxext/numpydoc.pyc0000644000076500000240000001747112730052416025601 0ustar prabhustaff00000000000000 4Wc@`sdZddlmZmZmZddlZddlZddlZddlZddl Z ddl Z ej dkre dnddl mamZddlmZejdd krd Zn d Zdgd Zd ZtdZddlmZddlmZddlmZdefdYZdeefdYZdeefdYZ dZ!dS(s ======== numpydoc ======== Sphinx extension that handles docstrings in the Numpy standard format. [1] It will: - Convert Parameters etc. sections to field lists. - Convert See Also section to a See also entry. - Renumber references. - Extract the signature from the docstring, if it can't be determined otherwise. .. [1] https://github.com/numpy/numpy/blob/master/doc/HOWTO_DOCUMENT.rst.txt i(tdivisiontabsolute_importtprint_functionNs1.0.1s!Sphinx 1.0.1 or newer is requiredi(tget_doc_objecttSphinxDocString(t DirectiveicC`s|S(N((ts((sS/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/numpydoc.pyt#scC`s t|dS(Ntunicode_escape(tunicode(R((sS/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/numpydoc.pyR%scC`sIi|jjd6|jjd6|jjd6|jjd6}td}|dkrd} tjt| tjtj B} | j td|j |j ||(n_t |||j |d |} tjd d krt| } n t| } | j ||(|jjrt|d r|jrt|d rbtdtd|j|jf} ntd|j} |tdtdtdg7}|g|jj| j dD]} td| ^q7}ng}xW|D]O}|j}tjtd|tj}|r|j|jdqqW|jdd|r/xt|D]\}}x|D]}tjtd|rtd|d t|}ntd||d f}||jtd|td|||<||jtd|td|||s0        9    mayavi-4.5.0/docs/source/mayavi/sphinxext/sphinxext/traitsdoc.py0000644000076500000240000001101012747716313025566 0ustar prabhustaff00000000000000""" ========= traitsdoc ========= Sphinx extension that handles docstrings in the Numpy standard format, [1] and support Traits [2]. This extension can be used as a replacement for ``numpydoc`` when support for Traits is required. .. [1] http://projects.scipy.org/numpy/wiki/CodingStyleGuidelines#docstring-standard .. [2] http://docs.enthought.com/traits/ """ from __future__ import division, absolute_import, print_function import inspect import os import pydoc import collections import textwrap from sphinxext import docscrape from sphinxext.docscrape_sphinx import (SphinxClassDoc, SphinxFunctionDoc, SphinxDocString, sixu) from sphinxext import numpydoc from sphinxext import comment_eater class SphinxTraitsDoc(SphinxClassDoc): def __init__(self, cls, modulename='', func_doc=SphinxFunctionDoc, doc=None, config={}): self.load_config(config) if not inspect.isclass(cls) and cls is not None: raise ValueError("Initialise using a class. Got %r" % cls) self._cls = cls self.show_inherited_members = config.get( 'show_inherited_class_members', True) if modulename and not modulename.endswith('.'): modulename += '.' self._mod = modulename self._func_doc = func_doc if doc is None: doc = pydoc.getdoc(cls) doc = textwrap.dedent(doc).split('\n') self._doc = docscrape.Reader(doc) self._parsed_data = { 'Signature': '', 'Summary': '', 'Description': [], 'Extended Summary': [], 'Parameters': [], 'Returns': [], 'Yields': [], 'Raises': [], 'Warns': [], 'Other Parameters': [], 'Traits': [], 'Methods': [], 'See Also': [], 'Notes': [], 'References': '', 'Example': '', 'Examples': '', 'index': {} } self._parse() def _str_summary(self): return self['Summary'] + [''] def _str_extended_summary(self): return self['Description'] + self['Extended Summary'] + [''] def __str__(self, indent=0, func_role="func"): out = [] out += self._str_signature() out += self._str_index() + [''] out += self._str_summary() out += self._str_extended_summary() for param_list in ('Parameters', 'Traits', 'Methods', 'Returns', 'Yields', 'Raises'): out += self._str_param_list(param_list) out += self._str_see_also("obj") out += self._str_section('Notes') out += self._str_references() out += self._str_section('Example') out += self._str_section('Examples') out = self._str_indent(out,indent) return '\n'.join(out) def looks_like_issubclass(obj, classname): """ Return True if the object has a class or superclass with the given class name. Ignores old-style classes. """ t = obj if t.__name__ == classname: return True for klass in t.__mro__: if klass.__name__ == classname: return True return False def get_doc_object(obj, what=None, doc=None, config={}): if what is None: if inspect.isclass(obj): what = 'class' elif inspect.ismodule(obj): what = 'module' elif isinstance(obj, collections.Callable): what = 'function' else: what = 'object' if what == 'class': # It is important that the `doc=doc` is passed because # this function may be run the second time with a # prepared docstring `doc` and `obj=None` # In that case the prepared `doc` is used newdoc = SphinxTraitsDoc(obj, "", func_doc=SphinxFunctionDoc, doc=doc, config=config) if obj and looks_like_issubclass(obj, "HasTraits"): for name, trait, comment in comment_eater.get_class_traits(obj): # Exclude private traits. if not name.startswith('_'): newdoc['Traits'].append((name, trait, comment.splitlines())) return newdoc elif what in ('function', 'method'): return SphinxFunctionDoc(obj, doc=doc, config=config) else: if doc is None and obj: doc = pydoc.getobj(obj) return SphinxDocString(pydoc.getdoc(obj), config=config) def setup(app): # init numpydoc numpydoc.setup(app, get_doc_object) mayavi-4.5.0/docs/source/mayavi/sphinxext/sphinxext/traitsdoc.pyc0000644000076500000240000001257312730052416025735 0ustar prabhustaff00000000000000 4Wc@`sdZddlmZmZmZddlZddlZddlZddlZddl Z ddl m Z ddl m Z mZmZmZddl mZddl mZde fd YZd Zddid Zd ZdS( sf ========= traitsdoc ========= Sphinx extension that handles docstrings in the Numpy standard format, [1] and support Traits [2]. This extension can be used as a replacement for ``numpydoc`` when support for Traits is required. .. [1] http://projects.scipy.org/numpy/wiki/CodingStyleGuidelines#docstring-standard .. [2] http://docs.enthought.com/traits/ i(tdivisiontabsolute_importtprint_functionN(t docscrape(tSphinxClassDoctSphinxFunctionDoctSphinxDocStringtsixu(tnumpydoc(t comment_eatertSphinxTraitsDoccB`s>eZdedidZdZdZdddZRS(tcC`sl|j|tj| r<|dk r<td|n||_|jdt|_|r}|j d r}|d7}n||_ ||_ |dkrt j |}ntj|jd}tj||_idd6dd6gd6gd 6gd 6gd 6gd 6gd 6gd6gd6gd6gd6gd6gd6dd6dd6dd6id6|_|jdS(Ns Initialise using a class. Got %rtshow_inherited_class_memberst.s R t SignaturetSummaryt DescriptionsExtended Summaryt ParameterstReturnstYieldstRaisestWarnssOther ParameterstTraitstMethodssSee AlsotNotest ReferencestExampletExamplestindex(t load_configtinspecttisclasstNonet ValueErrort_clstgettTruetshow_inherited_memberstendswitht_modt _func_doctpydoctgetdocttextwraptdedenttsplitRtReadert_doct _parsed_datat_parse(tselftclst modulenametfunc_doctdoctconfig((sT/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/traitsdoc.pyt__init__#sD       cC`s|ddgS(NRR ((R2((sT/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/traitsdoc.pyt _str_summarySscC`s|d|ddgS(NRsExtended SummaryR ((R2((sT/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/traitsdoc.pyt_str_extended_summaryVsitfunccC`sg}||j7}||jdg7}||j7}||j7}x!d D]}||j|7}qTW||jd7}||jd 7}||j7}||jd 7}||jd 7}|j||}d j |S(NR RRRRRRtobjRRRs (s ParameterssTraitssMethodssReturnssYieldssRaises( t_str_signaturet _str_indexR9R:t_str_param_listt _str_see_alsot _str_sectiont_str_referencest _str_indenttjoin(R2tindentt func_roletoutt param_list((sT/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/traitsdoc.pyt__str__Ys N(t__name__t __module__RR R8R9R:RI(((sT/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/traitsdoc.pyR !s0  cC`sD|}|j|krtSx$|jD]}|j|kr#tSq#WtS(sx Return True if the object has a class or superclass with the given class name. Ignores old-style classes. (RJR$t__mro__tFalse(R<t classnametttklass((sT/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/traitsdoc.pytlooks_like_issubclasslsc C`sa|dkr`tj|r$d}q`tj|r<d}q`t|tjrWd}q`d}n|dkrt|ddtd|d|}|rt |d rxUt j |D]A\}}}|j d s|d j |||jfqqWn|S|d kr t|d|d|S|dkrD|rDtj|}nttj|d|SdS(NtclasstmoduletfunctiontobjectR R5R6R7t HasTraitst_Rtmethod(sfunctionsmethod(R RRtismodulet isinstancet collectionstCallableR RRQR tget_class_traitst startswithtappendt splitlinesR)tgetobjRR*(R<twhatR6R7tnewdoctnamettraittcomment((sT/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/traitsdoc.pytget_doc_object{s*      * cC`stj|tdS(N(RtsetupRg(tapp((sT/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/traitsdoc.pyRhs(t__doc__t __future__RRRRtosR)R[R+t sphinxextRtsphinxext.docscrape_sphinxRRRRRR R RQR RgRh(((sT/Users/prabhu/src/git/ETS/mayavi/docs/source/mayavi/sphinxext/sphinxext/traitsdoc.pyts     "K !mayavi-4.5.0/docs/source/mayavi/structured_grid.jpg0000644000076500000240000005437112747716313023070 0ustar prabhustaff00000000000000JFIFHHC  !"$"$C@"T !1A"Qa#2BRq$3r%4b56CSc&EWsTU$!1AQ2"bq ?\!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!# !)*QOHZ˥5kiyW+ȴFE4 [sT\=9h;KSl*Q jij3c#"n?,~펞{]n:E3'#EBWUcK GTF}I|OLh6u=N vkaI_Jwpb~}E/:Px5"N?UoUJ NYr[+َf]Z3Ivݕyي{.E+%$IQ};P VԆto)**Kgn'>YJٷuU+5Q=:Gh)oFH)bu!)# (.ϗPߡ?WBt=ZuPL8qāXrE/X)ugnIdZޟuNWiI-kƼre{BȎZjBtpxq3{ô<){I-'V!¿E"+=X;%`nR§['Ơ;9z$mX+ӽDqK5K@+RG+1?.]H+E ES.Q3eD+]Futuq”ɻ8ϒ@n:>鄄jsVUOUva]TY(Rى&MI&FOʣt,Zm?rR'|WRk_䎋_M\Uҏ%)ĥ$s8P1]+_*6ڃT%'ˇ-c.B*ة*]ZV]qHB B~Kjȳ6lR)6/K!.&$1߶տldƤ 8ұg11̼V.[u/4'Bҹ+vu>չv>FȪToLw!}zGs̫f>y;Ώa0WS|s<1ٗ:>cLs΍j# C:3@GI|\R6S*Gi 9q\|ԢR" VS_*:njL[#ZZiF\S~-u5 zw<C wl?CLvL2WR9DwwI{iy*i )&h#' ="8͑NFu#ۘYy)F1i]>gXg ^doe('7TI9`ԘH Ie冏(0GQ-6y.@z+h☖jX!ǣg՝WEzҤVXZg䙙>ϔk20i1\9Ѷc9Fc C:32lM܎t`#;wlM,gfPRR9Ym*#8 `"h~ūn/sLPrRqc|DIGm+=I罦8窳'4p$$hSGrx/N>U== Sj3h>`) :-(#hEM#!\1b16[  rT-N7R(M!|m^ul5­kZ~S4mı@'>1u4&gpUQCf~WRdeC@kܺdL]%@[S(t p} pTAn=jɪJ\ Ԩo*FaNJo *)&;~U.xE̎YЮmMFɐhlrJ&[U:z>O^4Ǒ)c̩AԹZJF?s|k(G[nw9~!U_]G21A;(RkzkC.dˤ aRZ~t.]AP۞q;K>~ӤWRT3 + Vgf$QJiC~F)/. fjݩMJt+%I<犝^ڥS*F)I Ջx+u/Kgf>`l@&qj\b3K;A+mce!i;i;yG31-J2`W0Sᔪѽ뀬ǒbF t5MikKRw33 ~MͷDn#1kɌE jLdԘDqƤj zD5--M],H(͸V> p񬊙NɍI]Zj1[uj褥DcMZރl0yBи+#i#I2RCM q-kPJR<<@. hJ;ɗ])?4lSB}} gC5t׮$;Yo%))O'z@eLШ[kiC!G4.e[z[:uP|W+o hZTI8IrZu++n"Ś^r:̅6Š|:=eCqKjZk<q>)WTioeW ;wp>ˈ1KuMv8R*n^bZi&a.RWzU-iyD>-i[z)씋EIiJa-ppF=y&q4@(A6 z~ ڣ4?@_F%}Za$uJ=vԴ@h6ԭKOf J y&5cSq?DcH&*ѧ/CZH h'H8 #XF[ˆmYP+xZ FE[}wRׅV@==Mqq^{ijD&3@P%}g-ᑦpQ]{.x%\d b^N@k5ii0H“:i.1Hr[$, *;XYZf^+,+$721eĀGJ/zy}#[}8PBzEKSbO"6IJc^oqIGz9a`H#mQ7F}G|ʔkGӖ|!3 2y@bܬqhZ]jA =FR(qc$ʋ"11VvFwJũMf.Il̡噇ρc17Sd2'_}m5(fsNCM)뒦(tXr&Unp }io?pεXZ2Ҹ2rj Vq9F6,Km(BJR9#\v!VѭV^\o&+ 4h``odXC,6\QH?i%OTЊdnL(7¥7e}d'EADT?J? 1nWhјmZM+$̣dim DvՓBPvu+flfجIU B\Q>-nkn$ʞ$VH9H0rgL50Í:9)$d>gʫ1lͺU ɉGұIh}}\2"@ u砧Hܓ i2P$f+TX3TE!{5ێU))[2L26$e?*ag^Qg "peVQ;;drt~Y(VV?-fr:H"`!.2T },Խx[V^KRˤ'!ľpr3}ƱpU')rNOTeeqRhQEXfCNj(IeAQJuXdWi . ^*<V}s@dz#+Bjût^r#nQӼg1c}2L`Ԙ̳+*ÉiPZ% dvEE5Yٴ4nru H9+&'4*d%G2e 2)Wz,JUԗkKRX݊sJ!uⲲ>_i-R$ ߀Oy-LSV>/)%^\?~]LٖEFq M79QdpT&ߢI,%+K *,!yyitL&zn$Q[u:r̴Ty*g§k=m6A?t^`ㄨsPH8$r@ :gRW%FgprL-\gHR53vK,S/\gCTۿ"Hv,h)tęS9,0PO LTMru6ZVRTyc0HuPkHRT0AbJ [k> Pq7N^w <9?Y')~_jUhx: *;\"՝]Z~~Ϋ+hܶ>^6f#991Z?ZE61BNy O5x$rCg9ϤLԼ%zFӘuyp GoURijsII˧p!d"7"U];9Le&P^0rUGi|,3ڦ S*mWu"+;uc9#nr([JzʞiXR:S>JdJ].ʦf>CS,6U;%g]W7,i{#1#4fG4#|Zޢfh5|?+MgNQʉ$1Fc-111W[HuLeS*Z'иE֗􃴍q d ]T_xTys}G|9䋶C萄  d+­N_7:*<D9zk:Z%pix3#Dܵmp+.VRU )`r)vj b(Bo -+?9^tkvW*nZ8@ũj5\t:MG~\f~Eˣ###]QʔuNnۘXf[}Y[J9+;ŋj>FMAm]HRЃ+P$wub*iCfiP.=CJ5r\#xqC̸q!HZRw2F71EJfFF@vUUQ!=%uӦO Bԝcy]ٓ4wZFNӛc|eTI,OTdڨ73+1-,t‚r'$&)no-b3WCuyU@RVT@@RxTKGuR-|v1<DZG'fmZObkPUZZaf[ 6R?v)m}[._L^aΥGVZZ0LU<mI!+б M?p:JRuZU-2e@1=Z>b(I \Tn'JP1շpYn #1d.Lh%]-@ 팏.dsgmrUVFv\/FY# 0$'sГ[25.l0iB00cH'yU!/MM>%@c7ֺeGj!W:}u@s1i'iZyT|muԟ继-a#<-8LVu˩U#~=[sp17:2e۪L$-(j˞RC.Lh)g|f"net&ӓG 79;dzLoBt󶕺3SH=&&ء D\+GLXweuMn eeFz1rbmD0 u.fR+w +R5fh!ݸy9#@1|[J=JjCӤYl!9N9ԝXbGe!~5i5[Z]1iIE%/NPqGht(kmI2rU&!ݦЊH⫕)> x{% L}?p4j*2Efnw9apIrp"-ZYf*}_¿*hUo3 *[ [LlӼe^$)m:vЄ"1ډ]{ CYniG%fAi}w}rL46 ~TwBlVB9(& :kpLpڶ.M?WxT=(Cٍq}pԮvTmUuONfXA=y'u4#Rb1~ZL2nR嗩uFR ;- C|,+ͽp7K Jmfew[*?[ Q TMPM%QR7JR?BҴ%hPRT29yKX~ҫV16<֔'zڪL`+eJacZO2^m6JV@At<LT"HIq`;54:d"̈́grgʕRթRZl3R3 Y}e I똅:ǧY&!Sn-C|0@W-z>i1_{m"B5X4iUCm ۉB< ;҆}R pdgIRp_d~m|Fh:[h6>T^Jtͥ]r4 `.Z\3Mj;LjEjzJSۄz;'VUkRU+M"j\ZS0"6\Gbv]7+tvR:hJ~GH`aGf$V\ѧI%Xo*іeCJW22>RGFRJ_`+QCujR49kG 901ѴuUHڸؕR8)'ɦ9(^Il; %[zz5✫O9M+̬)ۗXf1f:rbJ>9t*r\6GH vnߡKH5҅V>贳塈e6e2H!EmԤe`@ɉFU;znNUȗpr L]J;G*vȝM.2{jNv#pv#1_mo2[ E EQ/ #ј]6i“1.a) J(TOQykm'Z/YSȶ܁tK0CRI* ,N﷿0BlBBÈCSn%+B JAH]6ϬY\vzv[j>/oAQtd}=zQ)\O$7wqӉJGX_o?8e#h啖U2MYzRlx UXePEׂ"V-nMЫhܒ Ty~vUxfE;8W@ O4:T,D%*ut¥j Nx p}vIF);owIStuMI$|=#b*ϥqomTrU^6Iҥ˳m}pDpkV$5-Q: -L5GW62vqܻ9Ǵé.d[ =2&"jsK'gԊdKin乿L۷6Z~ɦLRZhTM/7Q+P$׮/bnr:ϼ4|WܹQ&vn;lM֨ϱ[Re_.;\g;2vsrmZ&դ޵M.26&³OSX'Lo wUT%6%ҒRmwY g /n׶ݽARҔ8e%ڜ Ġ2ܝۨ596l-'4'^L%(\ N}ƞ߷ŽuB,|A!lYl,-<'tMz4R|k^:uv0>YJ\Ab<夊)&uR~d_ (?CӒZ~EMU` CluWMUiȖ̓V_IRGp$s: P&Tؖl..$+ҪJt2*8ʑ[y E )2?J;A3U8'}pcj33bVdԄj"fex[yKJAd#57U8a]uLMhdŷ8˦]eGvN$I1 #`JUSE7SupOQ,#EV+ٖ4dP+ yJ^nܨunlڣ.vVP‡(,{#zQpiZnWObI9Tg'[DH>"&2TAQS1zkfEbé5\el:2~6$n` &.mLcPsЛUID.#ԥJ=DZ{ Zb[mBw U*BF3 MUs䓕va[Tw;trpFQaԺCi9"< ۿ8]^+S)JbEeJJBM'A[ϼ!>d!Aޤ?pO^&pYFį=αYe}!O-y58w_³صWJҷm$ru{HLLm V۱1IDG/M<_VN:Qܜv$Q[rW$ԸZ%}](8Z|'f,ƛO]MW]jrJvw@V᎒ kX;m&ObPe *H'>Ľq8!A)MrGLZE`g[gj4[FjS4w%겉mK aԩE o;lؕ*Je=ƑSKU)q#b=2y+8X:\ĝSYIʝAoƜ>Lu~Y֒WB IRr~ǜo뎥ukJ-qU RM$H:\S.3?:YiO-^u`%aŽb_,`夬KY iQHۦLpvzҰ']LNV tIOzSY̷nZOZ -ԊE~>hrtij)chu'֟^ rrZMVIy%p mgq|'ya\Ŀh-#s2l Of%C(Sf]Yq7pI8mf1M*`V镒7nbIJTD gu =vVy{f-Hh޾|BI"y3*!!@!@!@!@S7"gJ}Yl5be~﫨O!ebq%7-=$LKL6Yy!(e*IA$@F=bљtr`I:GL#c_yV)&+~ҲhupD̂[eCˉY? iqhX Jr"Xrk6R gޖ9Z 6T$*rYc!Cc-?{5V9S Nxsͧi\O7MU=pS(EXpXwwU]Nj+<9g봮aC;ħ1-?{5V9S Nxsͧi\O77wMSjr븩 iVxG[?]Jb38}JI5-5dŇS)ݫ]KHIU6P&ewem(y0bգUN\)iF7dE/:*GT%3A%.!:--9wT2MuhS4''l$M_$zA?(JNCj.R-ݒOM/e׌o xs/cYhҨ {iq4~㕐rǔZq[ 6qVXkv̚ItʶhK|$gqDX8[8JT~++߬Q.>W̩IJw1WvYm_d  }xDrb0άgd.TfOmǚp/|fiDnQ[R4ߚՀ$gGGNjLUS-ZޔQ4ot 2r9.J^;rLU2UM.d*f%h35J:ۮ:!jW،dz#1Uij5lܘ0y en UoʺrRѿ.%<̥!c>ˢj(^rs6UtX9fq9O!TpkzMvuj'RYLM2@:/+BA#6/Z3ZWsFl#CMSE՞mm-X#%X,<ĎIרtjěSƋ3 :2b)[-7,{mٺ%AձYx>0$|;:ǣž}W; m0);KvbU67i{|((r4)L(qps8ܰb-}J.ZF Yxu9N#[QR^[%sM,HG»SpfQ4B*T$YCwYʥ!OJi%ZF]!n]c٫űckt3V ;@i$d o<㫧ؕ{e39ԟ V*▀FH¢Lzг-[J\3m)dw/bAGu[CJzԞ,J2D'@ r2 o՜IL%2Ӫֶҥmk}'8᜕+DA.դgjS)qɎ]^9SNծvcd89Ov֧4qxׁH]?EʡU R5!Au(9B*Y>HsL_@1΋mvulvPrU%ٓmqop߯։.^zjHȴv(>bI6Qݒ6'a"{e(ܙi͠us7[rmGKoGy,aH> âAC#ƦhmSRvV|xVBPhޗTQ0̳C8r(''$bU"Kmh]V4Z3 }V& HɈބ_ۨ%S%^T-J> n!–]wbU%FÅT~5-Ra=31Ezh,#9~Qp/ּەppe,KS' V&;Mꬽm= 치!V8R}##'e}"sf[I[s^,9^vnѤЩuFM/3 KS )ҕeaD2=coM2)&kwZOHre~KX6ߚՀ$g (NI䞞M1)*J}m#Rz.CqRz~Q?rΰxDG>vNZ9&ڂmENcȼ Y-Km!(BJR9<1nʠҮîL9ڌٹ];'I1cIM !)*QOH{4fr̫7 ~z~s d }.iW+ T5+!'D8z+IUIzjPtVJH)ZơFaF!p:f:Bʥ=+'Ki{C'S$O tW+@Ks8J,)ˎXoq^pq4fj+yjd5ۉdd[ϻ u{) gtoyI%w2hY쾙)K[VyS0m$cpGaZS!!!!!t׭F-zW$¶R7JpAC<׻)e>̴.0Z.tK^JʉYzӫ>T6ܹ x7S&YӖqY{ allRO I$ɸ*Ud$xBxY0=7glb=~?/iy>=@.*Fdѥ}dBwd, PtbőRJj©§]X_n#,$<7Ym 6BP# rEdpU@AƦ:pŠo}ӊ$N5PԜ{}c˽V`y4 c=#UG{8){bתfOHMs;$]f=CW9KjԟX$OMk[!NR^Q p?I>'C(,=䲦Xs|9~fq鍾֎c9s z*Vنst\ҭxznwQՏ@-!f}3knB"ҎtTҽڼ콚ݳEp&s&%ȗ?l o~Y:BӪPgr闖K% %G*IZ[w3jhԲ>S44P-cbԉu[wRl_YcFG\|"m0w<JSp U9@TS%!OĴ´$ GTd$*TFBbJZbbv蒕iNa**+#!8#:vt=-b~J^շրq0BH`v$-ziEFRK_TA9̄O ”`"mi ) ftXk^9)L\UTeu q$Jr형Vyګ*qYZPIC† tT/~>Wly/SXE1k^9)M\UTeu q$Jr형;_}ҵYCڔ5`dk-(e6#`"=TwMNb}$*qy]T+Bzy̕l'f?+mn}bɯnjqť@*Rp1\sܚ>KT̽1K2nUßq9V:@- CObf{uOG(2T)9y)9tؗl6H)H9`퀬GÇu1}q!`@(S-[BCi?Dޟ䭕)gR׺jWCVo*mĜ8#qh-Hvv~9ZNaS5Ec}a,#lgsHs=kDW hG:Ä}U9VhIܺ{ZB6K Ie>ҒBO+'db2}#/Hܵ+5: ӌX\flF^@O95%@8T 纕$zR"IYm*k ˕z#-㔣Q8zA^iWu+MEZ(nr6 Hޑ jpRڪQ*Rw|G":_w~݆a"lvg1W9j)ւnMp-ֻI_4t?c*sej bn(l0r46ӓ xhn#":[kqMjpxgf$S^'NTpyb%mVuV}@Dnq8F~->sۈٷ|/EӺ6wUІ)m-\aRŏ f q-HihHJ66Mq18!BBBBBBBBBBBBڪZɍE$[&0? s 1aN(6jUn}UNV}<u-+Jy'1*oQ};9( k  W8VJ#o8io`ӮgY+>a8%\CR  J1I'$mvTZGw]D997& #%jDmb±K:ȓkRܧR@Be:9[zLI!$O#  UZ5MMQN~܎'W(dq;RrjqTc:Y'-XmԉC>&w$"ee2mą!h9JG1:FErl-yI;b%buʦW"qf=ԆI֣)~O}vS^^W{ƭk9g] qTἜ$chiuNdDfi(㚚#HJ;[,qx-*bVbJFYo>PON""Wp$}g؊slSYI >5;{cLVZՕ˯P%S@ ՔO&-Elm ڥMK-(JQORc"Qw KTn^Npz)$n )$JIgkRS9>va!%gFmfO!@!@!@!@!@!@!@!@mayavi-4.5.0/docs/source/mayavi/tips.rst0000644000076500000240000010423012747716313020654 0ustar prabhustaff00000000000000Tips and Tricks =============== Below are a few tips and tricks that you may find useful when you use Mayavi2. .. _jupyter_notebook: Using Mayavi in Jupyter notebooks --------------------------------- Mayavi can display either images or X3D_ elements on the notebook. The images are static and one cannot interact with them. The X3D output produces a fully interactive 3D scene. For information on how to interact with the scene, see here: http://www.x3dom.org/documentation/interaction/ Mayavi ships with some javascript files that can be installed as:: $ jupyter nbextension install --py mayavi --user This will install the x3dom Javascript and CSS files locally. Note that you do not need to "enable" the extension or anything after you run the above. For more instructions and options see the `Installation of Jupyter Extensions`_. Doing this allows one to view X3D files without a network connection. .. _Installation of Jupyter Extensions: http://jupyter-notebook.readthedocs.io/en/latest/examples/Notebook/Distributing%20Jupyter%20Extensions%20as%20Python%20Packages.html#Installation-of-Jupyter-Extensions To view Mayavi visualizations on the notebook one should first do:: from mayavi import mlab mlab.init_notebook() Subequently, one may simply do:: s = mlab.test_plot3d() s When the ``init_notebook`` method is called it configures the Mayavi objects so they can be rendered on the Jupyter notebook. .. note:: One can call ``init_notebook`` multiple times if one wishes to change the backend between ``png`` and ``x3d`` for some reason. There are several optional arguments to ``init_notebook``, the first is the backend which defaults to ``'x3d'``, it can also be set to ``'png'``. One can set the width and height of the figure to create (as integers). The last keyword argument ``local`` defaults to ``True``. When ``local=True`` it uses javascript files that are distributed along with Mayavi otherwise will require an internet connection to use the x3dom files online. If for some reason the installation of the jupyter nbextension is not working, using ``local=False`` with an internet connection should work on a modern browser that supports WebGL. The X3D data is embedded in the notebook and can be shared but if the scenes have a lot of polygons, these files can be large. With the PNG backend, the PNG's are also embedded and these are smaller files. The PNG backend relies on offscreen rendering working correctly on your platform. .. _X3D: http://www.x3dom.org .. _offscreen_rendering: Off screen rendering -------------------- Avoiding the rendering window ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Often you write Mayavi scripts to render a whole batch of images to make an animation or so and find that each time you save an image, Mayavi "raises" the window to make it the active window thus disrupting your work. This is needed since VTK internally grabs the window to make a picture. Occluding the window will also produce either blank or incorrect images. If you already have a Python script, say ``script.py`` that sets up your visualization that you run likes so:: $ mayavi2 -x script.py Then it is very easy to have this script run offscreen. Simply run it like so:: $ mayavi2 -x script.py -o This will run the script in an offscreen, standalone window. On Linux, this works best with VTK-5.2 and above. For more details on the command line arguments supported by the ``mayavi2`` application, see the :ref:`command-line-arguments` section. When using ``mlab`` you will want to do this:: mlab.options.offscreen = True before you create a figure and it will use an offscreen window for the rendering. Another option for offscreen rendering would be to click on the scene and set the "Off screen rendering" option on. Or from a script:: mayavi.engine.current_scene.scene.off_screen_rendering = True This will stop raising the window. However, this may not be enough. Please see below on the situation on different platforms. Platform Summary ~~~~~~~~~~~~~~~~~ * **Windows**: If you are using win32 then off screen rendering should work well out of the box. All you will need to do is what is given above. * **Linux and the Mac**: there are several options to get this working correctly and some major issues to consider: If you have VTK-5.2 the offscreen rendering option should let you generate the pictures without worrying about occluding the window. However, you will need VTK-5.2 to get this working properly. There are also situations when this does not always work -- try it and if you get blank windows, you have a problem. For example:: from mayavi import mlab mlab.options.offscreen = True mlab.test_contour3d() mlab.savefig('example.png') If this produces a clean image (even if you switch desktops or cover any windows produced), you should be golden. If not you should consider either using a virtual framebuffer or building VTK with Mesa + OSMesa to give you a pure software rendering approach. Rendering using the virtual framebuffer ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ VTK uses openGL for all its rendering. Under any conventional Unix (including Linux), you need an Xserver running to open a GL context (especially if you want hardware acceleration). This might be a problem when rendering on a headless server. As mentioned in the above paragraph, on a desktop, using the default server may also be a problem as it interferes with your ongoing work. A good workaround is to use the virtual framebuffer X server for X11 like so: * Make sure you have the ``Xvfb`` package installed. For example under Debian and derivatives this is called the ``xvfb`` package. * Create the virtual framebuffer X server like so:: Xvfb :1 -screen 0 1280x1024x24 -auth localhost This creates the display ":1" and creates a screen of size 1280x1024 with 24 bpp (the 24bpp is important). For more options check your ``Xvfb`` man page. * Export display to :1 like so (on bash):: $ export DISPLAY=:1 * Now run your Mayavi script. It should run uninterrupted on this X server and produce your saved images. This probably will have to be fine tuned to suit your taste. Many Linux systems (including Ubuntu and Debian) ship with a helper script `xvfb-run` for running headless. The following command can run a Python script with Mayavi2 visualizations headless:: xvfb-run --server-args="-screen 0 1024x768x24" python my_script.py Beware that you shouldn't call `mlab.show` or start the mainloop in the script, elsewhere the script will run endlessly, waiting for interaction in a hidden window. .. note:: If you want to use Mayavi without the envisage UI or even a traits UI (i.e. with a pure TVTK window) and do off screen rendering with Python scripts you may be interested in the :ref:`examples_offscreen`. This simple example shows how you can use Mayavi without using Envisage or the Mayavi envisage application and still do off screen rendering. If you are using mlab, outside of the Mayavi2 application, simply set:: mlab.options.offscreen = True Using VTK with Mesa for pure software rendering ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Sometimes you might want to run Mayavi/VTK completely headless on a machine with no X server at all and are interested in pure offscreen rendering (for example for usage on the Sage_ notebook interface). In these cases one could use Mesa's OSMesa library to render offscreen. The downside is that you will not get any hardware acceleration in this case. Here are brief instructions on how to build VTK to do this. * Build a recent version of mesa. 7.0.4 (as of this time) should work as would 7.2. We assume you download MesaLib-7.0.4.tar.bz2. * Untar, and change directory to the new directory created. We call this directory ``$MESA`` henceforth. * Run ``make configs/linux-x86``, change file as per your configuration. Run ``make`` to see list of options. Note: 7.2 has a ``./configure`` script that you can run. * Get VTK-5.2 or later (CVS will also work).. * Run ``ccmake path/to/VTK``. * Now select advanced options 't'. * Set ``VTK_OPENGL_HAS_OSMESA ON`` * Configure: press 'c' * Set the ``OSMESA_INCLUDE_DIR`` to the ``$MESA/include dir`` * Set ``OSMESA_LIBRARY`` to ``$MESA/lib/libOSMesa.so`` * Similarly set the ``OPENGL_INCLUDE_DIR``, ``OPENGL_gl_LIBRARY=$MESA/lib/libGL.so``, ``OPENGL_glu_LIBRARY``, and ``OPENGL_xmesa_INCLUDE_DIR``. * Set ``VTK_USE_OFFSCREEN`` to ``ON`` if you want offscreen all the time, this will never produce an actual mapped VTK window since the default value of the render window's offscreen rendering ivar will be set to True in this case. * Any other settings like ``VTK_USE_GL2PS, USE_RPATH`` etc. * Configure again (press 'c') and then generate 'g'. * Note that if you do not want to use ``ccmake`` and would like to do this from the command line you may also do (for example):: cmake \ -DVTK_OPENGL_HAS_OSMESA=ON \ -DVTK_USE_OFFSCREEN=ON \ -DCMAKE_INSTALL_PREFIX=/path/to/vtk-offscreen \ -DVTK_WRAP_PYTHON=ON \ -DPYTHON_EXECUTABLE=/usr/bin/python2.5 \ -DPYTHON_LIBRARY=/usr/lib/libpython2.5.so \ -DBUILD_SHARED_LIBS=ON \ -DVTK_USE_GL2PS=ON \ -DOSMESA_INCLUDE_DIR=/path/to/Mesa-7.2/include/ \ -DOSMESA_LIBRARY=/home/path/to/Mesa-7.2/lib64/libOSMesa.so \ -DOPENGL_INCLUDE_DIR=/path/to/Mesa-7.2/include \ -DOPENGL_gl_LIBRARY=/path/to/Mesa-7.2/lib64/libGL.so \ -DOPENGL_glu_LIBRARY=/path/to/Mesa-7.2/lib64/libGLU.so \ path/to/VTK/ * Run ``make`` and wait till VTK has built. Let us say the build is in ``$VTK_BUILD``. * Now install VTK or set the ``PYTHONPATH`` and ``LD_LIBRARY_PATH`` suitably. Also ensure that ``LD_LIBRARY_PATH`` points to ``$MESA/lib`` (if the mesa libs are not installed on the system) this ensures that VTK links to the right GL libs. For example:: $ export PYTHONPATH=$VTK_BUILD/bin:$VTK_BUILD/Wrapping/Python`` $ export LD_LIBRARY_PATH=$VTK_BUILD/bin:$MESA/lib Now, you should be all set. Once this is done you should be able to run mlab examples offscreen. This will work without an X display even. With such a VTK built and running, one could simply build and install mayavi2. To use it in a Sage notebook for example you'd want to set ``ETS_TOOLKIT='null'`` and set ``mlab.options.offscreen = True``. Thats it. Everything should now work offscreen. Note that if you set ``VTK_USE_OFFSCREEN`` to ``ON`` then you'll by default only get offscreen contexts. If you do want a UI you will want to explicitly set the render window's ``off_screen_rendering`` ivar to ``False`` to force a mapped window. For this reason if you might need to popup a full UI, it might be better to *not set* ``VTK_USE_OFFSCREEN=ON``. .. _Sage: http://www.sagemath.org Extending Mayavi with customizations ------------------------------------- A developer may wish to customize Mayavi by adding new sources, filters or modules. These can be done by writing the respective filters and exposing them via a ``user_mayavi.py`` or a ``site_mayavi.py`` as described in `Customizing Mayavi2`_. A more flexible and reusable mechanism for doing this is to create a full fledged Mayavi contrib package in the following manner. 1. Create a Python package, let's call it ``mv_iitb`` (for IIT Bombay specific extensions/customizations). The directory structure of this package can be something like so:: mv_iitb/ __init__.py user_mayavi.py sources/ ... filters/ ... modules/ ... docs/ ... The two key points to note in the above are the fact that ``mv_iitb`` is a proper Python package (notice the ``__init__.py``) and the ``user_mayavi.py`` is the file that adds whatever new sources/filters/modules etc. to Mayavi. The other part of the structure is really up to the developer. At the moment these packages can add new sources, filters, modules and contribute any Envisage plugins that the ``mayavi2`` application will load. 2. This package should then be installed somewhere on ``sys.path``. Once this is done, users can find these packages and enable them from the Tools->Preferences (the UI will automatically detect the package). The ``user_mayavi.py`` of each selected package will then be imported next time Mayavi is started, note that this will be usable even from ``mlab``. Any number of such packages may be created and distributed. If they are installed, users can choose to enable them. Internally, the list of selected packages is stored as the ``mayavi.contrib_packages`` preference option. The following code shows how this may be accessed from a Python script:: >>> from mayavi.preferences.api import preference_manager >>> print preference_manager.root.contrib_packages [] >>> preference_manager.configure_traits() # Pop up a UI. For more details on how best to write ``user_mayavi.py`` files and what you can do in them, please refer to the `examples/mayavi/user_mayavi.py`_ example. Please pay particular attention to the warnings in that file. It is a very good idea to ensure that the ``user_mayavi.py`` does not implement any sources/modules/filters and only registers the metadata. This will avoid issues with circular imports. .. _`examples/mayavi/user_mayavi.py`: https://raw.githubusercontent.com/enthought/mayavi/4.4.4/examples/mayavi/user_mayavi.py Customizing Mayavi2 -------------------- There are three ways a user can customize Mayavi: 1. Via Mayavi contributions installed on the system. This may be done by enabling any found contributions from the Tools->Preferences menu on the Mayavi component, look for the "contribution settings". Any selected contributions will be imported the next time Mayavi starts. For more details see the `Extending Mayavi with customizations`_ section. 2. At a global, system wide level via a ``site_mayavi.py``. This file is to be placed anywhere on ``sys.path``. 3. At a local, user level. This is achieved by placing a ``user_mayavi.py`` in the users ``~/.mayavi2/`` directory. If a ``~/.mayavi2/user_mayavi.py`` is found, the directory is placed in ``sys.path``. The files are similar in their content. Two things may be done in this file: 1. Registering new sources, modules or filters in the Mayavi registry (``mayavi.core.registry.registry``). This is done by registering metadata for the new class in the registry. See ``examples/mayavi/user_mayavi.py`` to see an example. 2. Adding additional envisage plugins to the mayavi2 application. This is done by defining a function called ``get_plugins()`` that returns a list of plugins that you wish to add to the mayavi2 application. The ``examples/mayavi/user_mayavi.py`` example documents and shows how this can be done. To see it, copy the file to the ``~/.mayavi2`` directory. If you are unsure where ``~`` is on your platform, just run the example and it should print out the directory. .. warning:: In the ``user_mayavi.py`` or ``site_mayavi.py``, avoid Mayavi imports like ``from mayavi.modules.outline import Outline`` etc. This is because ``user_mayavi`` is imported at a time when many of the imports are not complete and this will cause hard-to-debug circular import problems. The ``registry`` is given only metadata mostly in the form of strings and this will cause no problem. Therefore to define new modules, we strongly recommend that the modules be defined in another module or be defined in a factory function as done in the example ``user_mayavi.py`` provided. Scripting Mayavi without using Envisage ---------------------------------------- The :ref:`example_standalone` demonstrates how one can use the core Mayavi API without using Envisage. This is useful when you want to minimize dependencies. :ref:`example_offscreen` demonstrates how to use Mayavi without the envisage UI or even a traits UI (i.e. with a pure TVTK window) and do off screen rendering. Computing in a thread ---------------------- :ref:`example_compute_in_thread` demonstrates how to visualize a 2D numpy array and visualize it as image data using a few modules. It also shows how one can do a computation in another thread and update the Mayavi pipeline once the computation is done. This allows a user to interact with the user interface when the computation is performed in another thread. Polling a file and auto-updating Mayavi ---------------------------------------- Sometimes you have a separate computational process that generates data suitable for visualization. You'd like Mayavi to visualize the data but automatically update the data when the data file is updated by the computation. This is easily achieved by polling the data file and checking if it has been modified. The :ref:`example_poll_file` demonstrates this. To see it in action will require that you edit the scalar data in the ``examples/data/heart.vtk`` data file. Serving Mayavi on the network ------------------------------- .. currentmodule:: mayavi.tools.server Say you have a little visualization script and you'd like to run some kind of server where you can script the running Mayavi UI from a TCP/UDP connection. It turns out there is a simple way to do this if you have Twisted_ installed. Here is a trivial example:: from mayavi import mlab from mayavi.tools import server mlab.test_plot3d() server.serve_tcp() There is no need to call ``mlab.show()`` in the above. The TCP server will listen on port 8007 by default in the above (this can be changed with suitable arguments to :func:`serve_tcp`). Any data sent to the server is simply exec'd, meaning you can do pretty much anything you want. The names ``engine``, ``scene``, ``camera`` and ``mlab`` are all available and can be scripted with Python code. For example after running the above you can do this:: $ telnet localhost 8007 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. scene.camera.azimuth(45) mlab.clf() mlab.test_contour3d() scene.camera.zoom(1.5) The nice thing about this is that you do not loose any interactivity of the application and can continue to use its UI as before, any network commands will be simply run on top of this. To serve on a UDP port use the :func:`serve_udp` function. For more details on the ``server`` module please look at the source code -- it is thoroughly documented. .. warning:: While this is very powerful it is also a huge security hole since the remote user can do pretty much anything they want once connected to the server. .. _Twisted: http://www.twistedmatrix.com TCP server: the `serve_tcp` function ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. autofunction:: serve_tcp .. _____ .. autoclass:: M2TCP :members: UDP server: the `serve_udp` function ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .. autofunction:: serve_udp .. _____ .. autoclass:: M2UDP :members: .. _animating_a_timeseries: Animating a timeseries ----------------------- If a file that mayavi can load has the form ``some_name[0-9]*.ext``, then it is treated as part of a timeseries. For example let us say you have the following files: .. code-block:: bash $ ls data_01.vti data_02.vti ... data_10.vti If one loads the file using Mayavi, a slider will show up on the file reader object which can be used to choose an appropriate timestep. There are also buttons to automatically change the timestep. To do this, select the play checkbox. This can also be done programmatically as follows:: from mayavi import mlab src = mlab.pipeline.open('data_01.vti') src.play = True Selecting the "loop" checkbox will loop over the files continuously. If you have multiple files that are part of a timeseries, you can choose the "sync timestep" option. This will sync all the timesteps of the other files that have the same number of timesteps as the current reader. The "Rescan files" button will rescan the files on the disc to find newer ones that are part of the timeseries. .. _animating_a_visualization: Animating a visualization -------------------------- .. currentmodule:: mayavi.mlab Often users like to animate visualization without affecting the interactive capabilities of the view. For example you may want to rotate the camera continuously, take a snapshot while continuing to interact with the Mayavi UI. To do this one can use the very convenient :func:`animate` decorator provided with Mayavi. Here is a simple example:: from mayavi import mlab @mlab.animate def anim(): f = mlab.gcf() while 1: f.scene.camera.azimuth(10) f.scene.render() yield a = anim() # Starts the animation. Notice the use of ``yield`` in the above, this is *very* crucial to this working. This example will continuously rotate the camera without affecting the UI's interactivity. It also pops up a little UI that lets you start and stop the animation and change the time interval between calls to your function. For more specialized use you can pass arguments to the decorator:: from mayavi import mlab @mlab.animate(delay=500, ui=False) def anim(): # ... a = anim() # Starts the animation without a UI. If you don't want to import all of ``mlab``, the animate decorator is available from:: from mayavi.tools.animator import animate Note that to start the event loop, *i.e.* to get the animation running, you will need to call :func:`show` if you do not already have a GUI environment running. For more details check the documentation of the :func:`animate` decorator available in the :ref:`mlab-reference`. For an example using it, alongside with the `visual` handy for object-movement animation, see :ref:`example_mlab_visual`. .. note:: If you want to change the data of an object in an animation, see :ref:`mlab-animating-data` Creating a movie from an animation ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ It is easy to create a movie from either an animation or by playing a timeseries. To do this on the UI, select the Mayavi Scene and navigate to the Movie tab and select the record checkbox. After this, if one animates a timestep via the "play" checkbox referred to in :ref:`animating_a_timeseries`, then a stack of images will be created in the directory specified in the movie UI. This will also happen if one runs an animation as discussed in :ref:`animating_a_visualization`. This can also be scripted with mlab for example as follows:: from mayavi import mlab f = mlab.figure() f.scene.movie_maker.record = True mlab.test_mesh_sphere_anim() This will create a set of images, one for each step of the animation. The ``movie_maker`` instance is available on each created scene. Animating a series of images ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Let's say you have a stack of PNG or JPEG files that are numbered serially that you want to animate on a Mayavi scene. Here is a simple script (called ``img_movie.py``):: # img_movie.py from pyface.timer.api import Timer def animate(src, N=10): for j in range(N): for i in range(len(src.file_list)): src.timestep = i yield if __name__ == '__main__': src = mayavi.engine.scenes[0].children[0] animator = animate(src) t = Timer(250, animator.next) The ``Timer`` class lets you call a function without blocking the running user interface. The first argument is the time after which the function is to be called again in milliseconds. The ``animate`` function is a generator and changes the timestep of the source. This script will animate the stack of images 10 times. The script animates the first data source by default. This may be changed easily. To use this script do this:: $ mayavi2 -d your_image000.png -m ImageActor -x img_movie.py Making movies from a stack of images ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This isn't really related to Mayavi but is a useful trick nonetheless. Let's say you generate a stack of images using Mayavi say of the form ``anim%03d.png`` (i.e. ``anim000.png``, ``anim001.png`` and so on), you can make this into a movie. If you have ``mencoder`` installed try this:: $ mencoder "mf://anim%03d.png" -mf fps=10 -o anim.avi \ -ovc lavc -lavcopts vcodec=msmpeg4v2:vbitrate=500 If you have ffmpeg installed you may try this:: $ ffmpeg -f image2 -r 10 -i anim%03d.png -sameq anim.mov -pass 2 .. _mencoder: http://www.mplayerhq.hu/ .. _ffmpeg: http://ffmpeg.mplayerhq.hu/ Scripting from the command line -------------------------------- The Mayavi application allows for very powerful :ref:`command-line-arguments` that lets you build a complex visualization from your shell. What follow is a bunch of simple examples illustrating these. The following example creates a ``ParametricSurface`` source and then visualizes glyphs on its surface colored red:: $ mayavi2 -d ParametricSurface -m Glyph \ -s"glyph.glyph.scale_factor=0.1" \ -s"glyph.color_mode='no_coloring'" \ -s"actor.property.color = (1,0,0)" Note that ``-s"string"`` applies the string on the last object (also available as ``last_obj``), which is the glyph. This example turns off coloring of the glyph and changes the glyph to display:: $ mayavi2 -d ParametricSurface -m Glyph\ -s"glyph.glyph.scale_factor=0.1" \ -s"glyph.color_mode='no_coloring'" \ -s"glyph.glyph_source.glyph_source = last_obj.glyph.glyph_source.glyph_list[-1]" Note the use of ``last_obj`` in the above. Texture mapping actors ----------------------- Here is a simple example showing how to texture map an iso-surface with the data that ships with the Mayavi sources (the data files are in the examples directory):: $ mayavi2 -d examples/tvtk/images/masonry.jpg \ -d examples/mayavi/data/heart.vti \ -m IsoSurface \ -s"actor.mapper.scalar_visibility=False" \ -s"actor.enable_texture=True"\ -s"actor.tcoord_generator_mode='cylinder'"\ -s"actor.texture_source_object=script.engine.current_scene.children[0]" It should be relatively straightforward to change this example to use a ``ParametricSurface`` instead and any other image of your choice. Notice how the texture image (``masonry.jpg``) is set in the last line of the above. The image reader is the first child of the current scene and we set it as the ``texture_source_object`` of the isosurface actor. Shifting data and plotting --------------------------- Sometimes you need to shift/transform your input data in space and visualize that in addition to the original data. This is useful when you'd like to do different things to the same data and see them on the same plot. This can be done with Mayavi using the ``TransformData`` filter for ``StructuredGrid``, ``PolyData`` and ``UnstructuredGrid`` datasets. Here is an example using the ``ParametricSurface`` data source:: $ mayavi2 -d ParametricSurface \ -m Outline -m Surface \ -f TransformData -s "transform.translate(1,1,1)" \ -s "widget.set_transform(last_obj.transform)" \ -m Outline -m Surface If you have an ``ImageData`` dataset then you can change the origin, spacing and extents alone by using the ``ImageChangeInformation`` filter. Here is a simple example with the standard Mayavi image data:: $ mayavi2 -d examples/mayavi/data/heart.vti -m Outline \ -m ImagePlaneWidget \ -f ImageChangeInformation \ -s "filter.origin_translation=(20,20,20)" \ -m Outline -m ImagePlaneWidget .. _using_userdefined_filter: Using the ``UserDefined`` filter --------------------------------- The ``UserDefined`` filter in Mayavi lets you wrap around existing VTK filters easily. Here are a few examples:: $ mayavi2 -d ParametricSurface -s "function='dini'" \ -f UserDefined:GeometryFilter \ -s "filter.extent_clipping=True" \ -s "filter.extent = [-1,1,-1,1,0,5]" \ -f UserDefined:CleanPolyData \ -m Surface \ -s "actor.property.representation = 'p'" \ -s "actor.property.point_size=2" This one uses a ``tvtk.GeometryFilter`` to perform extent based clipping of the parametric surface generated. Note the specification of the ``-f UserDefined:GeometryFilter``. This data is then cleaned using the ``tvtk.CleanPolyData`` filter. Under :ref:`mlab `, the `Userdefined` can be used to wrap eg a `GeometryFilter` VTK filter with:: filtered_obj = mlab.pipeline.user_defined(obj, filter='GeometryFilter') With :ref:`mlab `, the `user_defined` function can either take as a filter argument the name of the VTK filter to be used, or an already-instanciated instance of the filter. .. note:: With the `UserDefined` filter, as with most Mayavi filter, the raw TVTK object can be accessed as the `filter` attribute of the Mayavi filter object. The :ref:`example_image_cursor_filter` gives a full example of using the UserDefined filter. The :ref:`example_tvtk_segmentation` is a full example of building a complex VTK pipeline with a heavy use of the UserDefined filter. .. _sharing_data_between_scenes: Sharing the same data between scenes ------------------------------------- If you want to display different views of the same data on different, you will have to create different Mayavi data sources, as a data source can belong on to one scene. However, this does not mean that you need to copy the data, or recreate the source from scratch. The trick is to create a second Mayavi data source pointing to the same underlying VTK dataset, and attach it to another scene (see :ref:`data-structures-used-by-mayavi` for the difference between a Mayavi source and a VTK dataset). Using mlab ~~~~~~~~~~~~ Every visualization object returned by :ref:`mlab ` has a `mlab_source` attribute, which exposes the VTK dataset as `dataset`. In addition, the :ref:`mlab pipeline ` functions for adding modules know how to use raw VTK datasets. Thus exposing the dataset in a new figure can simply by done by feeding the `mlab_source.dataset` attribute of a visualization object created by mlab to an `mlab.pipeline` function:: from mayavi import mlab ctr = mlab.test_contour3d() mlab.figure() ipw = mlab.pipeline.image_plane_widget(ctr.mlab_source.dataset) mlab.show() The above example creates two figures displaying the same data, one with iso-surfaces, and the other with an image plane widget. Alternatively, it can be useful to be explicit about the figure that the new module is added onto, rather than using the `mlab` current figure. This is important to make the code easier to read in situations where the current figure is not clear, for instance in an interactive application, rather than a script:: new_fig = mlab.figure() ipw = mlab.pipeline.image_plane_widget(ctr.mlab_source.dataset, figure=new_fig) The :ref:`example_volume_slicer` shows a complex dialog exposing the same data through different views via `mlab.pipeline`. Using the core Mayavi API ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ You can also do this fully explicitly by creating the objects yourself through the Mayavi core api, and adding them to the pipeline, rather than using factories:: import numpy as np a = np.random.random((3, 3, 3)) from mayavi.sources.api import ArraySource, VTKDataSource src1 = ArraySource(scalar_data=a) engine.add_source(src1) engine.new_scene() scene2 = engine.current_scene # Now create a second data source viewing the same data: src2 = VTKDataSource(data=src1.image_data) scene2.add_child(src2) Changing the interaction with a scene -------------------------------------- The default 3D interaction with the scene (left click on the background rotates the scene, right click scales, middle click pans) is not suited for every visualization. For instance, in can be interesting to restrict the movement to 2D, e.g. when viewing an object in the 'x' direction. This is done by changing the `interactor_style` of a scene. Here is an example to use Mayavi as a 2D image viewer:: from mayavi import mlab mlab.test_imshow() mlab.view(0, 0) fig = mlab.gcf() from tvtk.api import tvtk fig.scene.interactor.interactor_style = tvtk.InteractorStyleImage() mlab.show() Another useful interactor is the 'terrain' interactor, handy to have natural movement in scenes where you want the 'up' vector to be always pointing in the 'z' direction:: from mayavi import mlab mlab.test_surf() fig = mlab.gcf() from tvtk.api import tvtk fig.scene.interactor.interactor_style = tvtk.InteractorStyleTerrain() mlab.show() VTK has many different interactors. An easy way to list them is to display the VTK class browser (via the help menu, in the `mayavi2` application) and to search for "Interactor". Another option is to tab complete on Ipython, on `tvtk.InteractorStyle`. .. _acceleration_mayavi_scripts: Accelerating a Mayavi script ------------------------------ You've just created a nice Mayavi/mlab script and now want to generate an animation or a series of images. You realize that it is way too slow rendering the images and takes ages to finish. There are two simple ways to speed up the rendering. Let's assume that ``obj`` is any Mayavi pipeline object that has a ``scene`` attribute:: obj.scene.disable_render = True # Do all your scripting that takes ages. # ... # Once done, do the following: obj.scene.disable_render = False This will speed things up for complex visualizations sometimes by an order of magnitude. While saving the visualization to an image you can speed up the image generation at the cost of loosing out on anti-aliasing by doing the following:: obj.scene.anti_aliasing_frames = 0 The default value is typically 8 and the rendered image will be nicely anti-aliased. Setting it to zero will not produce too much difference in the rendered image but any smooth lines will now appear slightly jagged. However, the rendering will be much faster. So if this is acceptable (try it) this is a mechanism to speed up the generation of images. .. Local Variables: mode: rst indent-tabs-mode: nil sentence-end-double-space: t fill-column: 70 End: mayavi-4.5.0/docs/source/mayavi/unstructured_grid.jpg0000644000076500000240000003243212747716313023425 0ustar prabhustaff00000000000000JFIFHHC  !"$"$C@"F!1A"2QBaq#3$CRS&r%4DEb5Tc#1!"a2QA ?DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDEβ>y/ig=\Bq̒$u;u_"d ?`W)GgsX޻ ff[QbRזrx σ<^sDuDED@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDD@D\,,̲}톞z,G @3φc^o2zxOW;drx$ 4Աkli-q f8χ</[Co|{;] @,a5KM?^r@I9Ų\Vb%ĆhoiWm5dIz?DwP{t4u:~f6ܚ5~/O?4W4^Ŝf⫦AOuP˯cw}t1[Xs:* >d؂i]凐85 u;^=ǻ\8p}t?jYŝpφc^o2zxOW;drx$ β>y/ig=\Bq@>%.38^v9[AdXkԗn1c׋@=/}eY w0|%[ k߿p++W 7wEj#vd#<+OVTSJC"nSع:wfǤ!4wU?>wHq#>XH-JAQڋT,x^6K3Z)ۢ-'ھm6ۍOY ~ݒK$FKHib ,-]1\|h_m;@q vv{< bY)hj=\}{A/SVٲuuQj ;,f?%,{asA /ǀ?2H ,̲}톞z,G Eǯ{_] @,a5KM f{2kcH,;|>w z@}4PQA+ YoR⎰;~*[wvKrimt 7颵5t߬:P?EM:m[QFj,LJ"*ؔ˦ܿ׿a{WL?/ӂ斸u8gp{tlWkmIxE[AYxx+ڱz\FH9}4Zw4xC${x*9Gקd;舋DYYg1/Wd =< '2X9|<?H ,Բz}톞z,G Eǯz]9[AdXkԗn,S^2gqs-v?Ԃpש/4o ߻y_J6XHRJ?HKMVn ;%OԞϷAʿ􌤧o:yHp<[ZHhxŢ-*-{},ty-cCA?*MQFjY|NxM|K{ \ }T!6zt䵇nuw ӸaxZBki%#x\B3agVHdh,R6H=a>},st1sZ.һf#-I'{]Vƽ<36pDEt_d0w Lv$ |3zOORz $ ?u;M<(XHM I\i-6˭t%kP?G{}P$n]2oU-m>{aN?H)[=<.MѝIZ>64vqitCMM5|EE UlHBmVş^|6ļ]UiSGWhi `7+&OT`z;?vvG~r'TYoTr71ÖA ]wX.Ȳwk 855 ٯ2Q{2_a;|lp<;`+)agDV@zskf}l7i;BF}][ q-[O_rڷQt7Ro,万4*>Umg/-6 *ij @N5ϒygevϨo$qCu/v 3UwV tS饢\$7)"5wK!v|rSb[Mڅ >B((NUxJ *ؑq)<(S[LV9mѻ槩),>WٍxnÔCOS+ ׈ Y6+K|V؏l{\9CG|-5l(QPW^+l6RV4ѦTQiu<~e{8"" /$eazm{pk.s֍6+Kꠂ#߉uDoknh}>|EEuk5ٟrܩ!5cf4vN>d\b鄟5e&*}O[V睫vm`-O*#>]H9cH: w:9T`TwIv4N<,7GU(26JɑpȪ!q>YcO.l*T*H &M>OL;xN <8Ha7rY.as*pNv>;C}˽ٱ~_G)䖛Sښ;wLNlF;En\^ft3X:e/Q8k|27$-q g|3<}A S/^Sҭ[RI DP|)j`S"4=?.r]a\}5no|VsÞǓa=Q|fᑸ4&ѷ :-&=1hFJ?xȺD%UwwUO?i{.tOpo/57dIoLHc6N?׬gQbԽNNP?Hw=Q zl;oĬ6c,Fuk˜vI}9_dTϦߣc($!oi&Ao~ !e߷/Bϱ?v̦oK} ;74~\-g0Q\x/:e,>/_cQ[㖼qvr'*⤣g|t?IrIroGyxi#b٤u =ԑhvw[\uR۰o0d1SVtPƁi73LAqwꈩ+4;ўȜ\]@)थ8h5p@Nq߆<^fglK Tf {$In{yUiȾ *# Y,24>9湤lGGQZ$xD@I(҅􊶬/[LN[ζ_-%h h6~zu.il HyMЖ[O尳܎\tؠ6Cf1ggU̷Ou~i$rآ1x)Ui!*bwP_U"(X>Jx~X;t۞d@6; pdc=Ý-ua&m-l-qQ[icl\u}%uDDD@DDD@DDD@DDD@DDD@XwT./P")]c_a++{;\#Ɲ`\nk*1 YceVOx6JBytISV}UK%Zʗfy;%v'Z:UvOO;#dϙr x-o`+фJ GݯKdv\i%w Nxz:&֥dVnی.{tгzO &\tdv?uD~Klywc ^|Ξ'jOخ[2Nz}7ϰKYї/)iW"" $c^ǂ5a/U, 091!?e4'M6qeZ }U+9Ɯ6# `VLW9]Ou%҅L.vҎ/=&qn/ S3GE}aO G6<5;yRtUM)^aU^/QRFei hR}@%Vgڱ,~{IE;G2(9sxH`֪6wo1h4B8|̒{hɉZYMP29hyK5S6ˉ#DV]iɪ|[S5+-vXX-l K-ۭK1\\Rd5 ?Gs˝oK5A}ARpX1uvяG.sZ""" """ """ """ """ /ʶzڈiitM369ǀ|/bnId'еe5>R !ٜrp٪s̮7XfX.3GPIGb1āJ!(!d0㍡c/xr%P/WlުKN;qefBxc{L+tHC/SWaĢM㺞1'@s1u(MU8|'7_$ؼmXKZFRS[jfK˜H/oH'L1@HGUhNH+dj<[fotp7vppy]% ,ɬVz'}*,^ٿWyxO}Y.i'oP>}om12iV. yyc"NFJQGR)"<: +{}ƖJf1>ArHμvL\4M$v9jV0Ø[嫲UG@M<1LoFZӃ*YOj٬5+w;?Vl}NZs {qY^-3g'QhU3CMM-MLL/I4 xvlSuK ȫb*7fL8\>"iH۾sW9՛tOsp;}@ucO|fv\dq(15hh gYTXVv54RZ]T;>A:V 3 uϋzL,G{uQB|Z;H-0.#Cpp[^Sog9={XJ/GD@DDD@DDD@DDD@DDD@DD>`UMӚ罔CMO;svC֕CsmuP`;yhZ\e7ՔEᨬ#8ޚIW׏7=D=ʶA5u}LT԰0YdwkXJn9ju1k qD,8:_X= (^$I!>T{>_~V%U<:ʏp|lSwg9;:kC*zxQ01h/OjZ4)$kdzvGޕm.)hk\C a K!{,dj如068hYhΠڳ]67;2'q֚9%S]/֔/ZҔQԣI)[R""Yf3vFI+habxp6P au+ .W&fwwg|lqK, Jf頝O) x#*OamoVN,<;^U];tu0ϖH],8x#X1=}.+q/`1Ձ23č3W_~{Csm%ݣ?qƫߣGT:t.i e9xdcuɲ֮q*hW錄x$r># 1*LxMY5LKg]s՝@>mζ|⸍Knɲڦ]/Ť@滒}!@)Rw%@ H,ɬgui;q<>I 8\F:DB,@)E!cKiNJ,KZ(*5{;!t2oy]++XtFWU7;X߫$`nxf;Wg/{L|: cKl32FJ+utiu"u/+ţ.0s$@s=ݦ{zNj۩ᤦusy[#Sk{<10|Oyk|XM}کw@4#fL ΁%$}=x&-E>K$53JyIfK{cv:+}~?FI 9$9*ٮAh䥭|v[Te;MD$KӬf eVcʮl {픱`8/#~:]Ѝ*P2lROG5p֛U;r6 _!Xݓ7-Xkp26 ZhdypC<?t#:֣<npR1HԧKvtݗHtUp3+CI:`yd >{mzLg"")D@DDD@DDD@DDD@DDDA s_{ s/K_P1\|ǩ%\4Q|TcN 坡s6H+E_꺀E50E[$wsG%֑te_%sՂK'ILk|C@nUJ7oA+S .m󍶮6ګH~x.MU4\~Mv~_ K{Hr%ek#Eҝ,.u?mj(6silaLKZrxƢ?/Z@ YP`5A=uE7t','ׁ-Ock#EROZ"KvPG;ju?.ck|Ouȼh5U)YͳE|ޕ 9OOˇLȡu<,h ekI*[]hxW}dZaw|ֲ4%hU|BZZ] G*Vs!r13jWecN rdx'tWޥ/cOm1c @<٦oUz⧦4 dlhۜxI+{SfAPwT,yC~"r KOeAooܾ'Ѹq^t;1M2,x 7o\%ag Jt=% ߭X?Y~U3$8@q:I -KMUY  ,fYk= X9AGSQh^elSF3WԷr?ñ;mVz:iozQlyjw$L{l-Az1X4OX$oikx p%M %n xL2RsJvB,'miחcET׀49^^.kGN2VC_#C?Z9 O/dW̊V%>9>IK Պn/םSDieַ?y\y={]Rbb{dkv_zXZҔRW&G0k|6 J,HKi?{mh踹5GA5aM{娨]G,ȭ8+呗(bJ/{?3 U.+v:N(mCR|K/ѿ+FXT1+u׬ώc8+:kd?„;8/8M8l- Tұ FT-&&28m ck@z:NFq:))e()aYexk#h.q<%~/kwMAdQSFCa[veȗ:v.KOT6E+ $Li8Ό;ok](h hk@ =[^<\?Ly<)W^he6[R<kWA pD,3[&GESCu]Z w} tFձT][P0vmM3\.۠y<ѷ3|qr^UaZ&t ^"xѽ 9~4VGʟ*W?&9sr˷y%KWCG[ƾ}*rvŐ[墊 Q _e/C3/4~7KCXZGF2 J8($$tb󡯧{:ˏSR+>7h=֝d}XcxUMՋ 4“,qJÛrp٭k#WMvEI]<͐ v*ik!0UCQV7^:?OE${vT4;%}W.z?ʙk3˩)ԴsՠJG1x0|,ڪvf CVDG_B#ea,EKN3Elݯ+*쩗>aIv ܲ/H\csx%(55=$ n_v}4a54vy}d7l͉у[{\4FC8o$Dy-\S& ʷ6~߾qhpʭԠ$>O Ozk!饬-+Ό {;W#]kpnIH鏃R!iZׅ%湾7ڼZS56A+Y%QPcAlPRRPCKIMac &4ikG hƬvnGbPCAmӂ O'I$I$I]j5Ȩ@DDD@DDD@DDD@DDD@DDD@DDD@DDD@XuC/Kys{D2?ёR 7m\zߗ\<Φji+ $cÚF#Bg3)SDps^6#_k2ne .+v&X㯱O؜?,-NU~T}9e@ 9j{piY'8vS!uHej,='ĩAmZOKÎ@iqm1$"50 ոtY-57[l44y7'@Tq-ZA :JxAdq1MkZ8h{g\/alx h%.|?3I H]F̺GӬWT]j/Pi#-w fΦ\bom1]Nyk{yVĊk?~]:.66.m.^0C#sca`7vGҷ7bX5MRSsytw=dI]Uק 6DED@DDD@DDD@DDD@DDD@DDD@DDD@DDD@DDleeN٩Y?4OF״ tujz}N~iOҌpك<O_[³^\+A\͸Ozv1c,01訢ۻ[ˤy^I+F:DEDD@DDD@DDD@DDD@DDD@DDD@DDDAmayavi-4.5.0/docs/source/mayavi/vector_field_combination.jpg0000644000076500000240000014241712747716313024705 0ustar prabhustaff00000000000000JFIFC     C  ?]"  s^_|z+'x)N5ƄV;{6#2cum~X_Zzv3`X؝ybl$7 !VKK}?o+Ҫmv2`d4[7%ʶㄋO{$>+:lqNhwER5:=!H %DgD¿ As*94L̀]!-C|ƬFÔe]òh-em͎ZPgvт˫yX\NSy;wo+.N↠膖@cą++9t] Ьfh*NA|T+ESuU%㕎m_G4_WzXOyn0< >$D z__;'PWå+@3Lqқ֭ .āKS-B!ޟyUƎJɻ7s?jGl9UMøyƨV=! ivvq˪%j1%wfH%B:vU9hk{S+i⏠3f(eoz9I,9ieX[cg#ߕ|H7N3KQ- lsB\a֪Jziv7z-htR+;JnLhװs=TK^ofeiQ\5n&Z ۶enlQes8ɏz-"%>_ھhLy[9q_ƺy(Ul8q7ydvՍ0\FwG-^j`FCγZ̡2]/m~p ighw׷W~3<2=k%e'$v؞k"|NiܪVqZM-!kW1^ϐC9t .UO$]kр , B68CK.\7ܿ v7麨kN$C8۫>qTzVB_+RvAƅ|_in"t>W:,Ak8++{6ۧ*r%TZ`3X8:9]Q,<1-4Ɯyjsc(M:[ MS5T-92x{ԎL /w*lal,>xǰ__jp8;}W{logп157m&٥a VW5PysS%}vcNt M72}|Ϊ!k<?jx|H7 ]Y_4U%<9\^^̋Iy^Tx5qndMuЩG Lw,3/U<[7܂ٞC^tƳ(R4/Zz5`m;KM)$y3kvB爄( $c ,_!iӯn^*$`/zTZsײs}.rkek$4Z/ :Jfs$[Yo${?@ݟ$+ ,Ѕ'(ͽ /B@X`Dƹ8=ΖW)^+5hQ/5A en0|@556 70!"#$4%'123&@m"\}xU*d6vP՟|H\J]:qZ\N';6\jeoUyd@wp8V?}Za[ ?٫} (|}W) U  F~P:sL;8>|`;^nbr &Z>xq q|%1-!i.[tO;N2՗~ԡxl~ʥiaNO\#3gè1Vxmqxq&͘8:ܨ{ _@˚_)_@`n|aϘ9#Po\p*#fTn: 19/}%c%t>% 8 fw*J{xY)e~W[6\~,baN[b[L$r8tNF]ĂYpcm!ݕP~y}u܎^7`d{eYO ͠V)0-Fycu_Yc@̲z~8TT;vu# 2HX&&nM n,|D.aGD{-sUeacwi'xѻO?>26 n'8+ֵo:3Q\c]ѣdN!khμHA "3pɶEHIfՌrXC\*W% N|Na#ˆͶ`:Z\/Φm6N3Ȉ/ "ZbCJANf42R:XJ[NJVC-̮UAl2o0SxƜD04r0gkjltgD'hdafYmb`FALG9n~CpȑAXJ[Nwߪ_?ܑg/ PX}#>ZUr_1\DxRrjdoH7-GgYbhd îֵp$Zq\ԮC5o>#%™ʎ/1#M\Xne–ʤ' ٓN_,<=":?QcT \&QSU$ ,38hx+-y! [WJWjbtVZmϱyV0%Է?85$4#/'|W" >d3Yh[l:rRMnA]Z…eKruuY>8?aOhU!xͭzRkV} c8V,Ρ(z>ݑW0^Ý TyCq#]ȧSV{U'Hlں *cwsF$wgR2rs#])^}Жq\c}lM[OKFE78m-,J_Yub]"wb\ݩ2((XVyR%2kIJti-uZBP ?J[Nl'Wj}1ne,qD8K+؟}.p]Aa&!C,U傘ݍi|+%ၦ#{-s_uրly,RXlJ?t1Ӝ;+ֵo::Cp1^_(o0륒?jdFdiL4AS2d&T\ߕu" _=n$g#M k#/eՕgş.SHFj4F>uJS8J[E#O<b?;XcWŋs\Sv+i@2X)SWjbtk!^Ƒ<^;5=odl Y|B k!+֡J+^dJNB"^EkɃ_e! >~-&>j}R7scJ[N8[:z_&=K O5TÔ Y=TF#p11vH@"XF\$'ZK6MR#+ cb"STQ}3Et^#^}=#r 5"_o ĎFw3K4+$6n A\ cNb31ZY[춊»9:ڽJeЗ8gWŤ@ҽkV8vs}+I 炋/,Af "!\|'PNT5̏5+gVС*QR; YaѐqzgWҽkVl-2>ϳf(sв2vHeoeq0h"]&WM<wk=XF`v`~(Cm-#LjWkEw5?JC"]DFZS7M?ub#)杮ǔ >@+XR3 GEÊ3yK hj6!\6䭦iui^GYB鵐k%* 䉬6ũg|',cz$I73lY-)0PʥoF!.DG07"tiJG9JdG@i*~M[ v5q,OdQF N%Z}TY%B6A|tlPqqҒUf٩UCɑ9 1ҟiKiu3(J[NKSW'S,u"ҲM2HWB0ȼ&>3qd HE [Cj=&4QAr "H+*~fLA4殞qeq|“Zվ3ɝ#]aa5ɬkUs7)aya mFpmEڶˮڳM*5p9+gc 0+8f2Ttalv^\ogWCm,QҽkV%F'R̈́p <,Z!ˮ%Waݍpͷ "-"yK F.yUmv_RaR.:l`Q6oCRqQVᡢK_4毰`Iu+ֵo:F,-Hj1]@V؃:׭&b]&و\q|f bĭy:-IG*ibX;(<~8!IdW7;4jeߩ'3Dh,K±4Z J(RW<6s*&ӿ=dserFl. &r[VX [+L3RͲ%p_F3S[0v;W sJdok/}o2>+ܓ]I-"ʵeN-?fR:~'QvYGa;o-p8N*JOEkjQ:HޡZ?Ej.Vl*.jِ+$@OƶKL ˑk<@Lc6—;djvQBWّy pXҽkWpMIJ92Gq/B5",DZ6T竱H/U`" rky0zOiMC+A =CyǕ0-ǾJ";3yykCi.DŽg|x&x,s[MnƎRkyf c0wyq?Js52@]7t]JGtq!9$Ep = enaՠ!ҭ3(iݟ[vjJk_ȶBy@ NVc\N#Py9sg} 2~unVLBe Y}(䨛H©60M3?Sjs \|vg?O#]~#4 ~Íj=\+~5廞CK)EL]\n//l|˿ Ϟ9yI cSűd} VoݻC|2>Dp]k@Xdf_I  !1AQaq"#02Brs 5R3b$C%4@c?2zeѶPlk> 4(OZօfId x8IttBbtYvUzaȦY`CT]QA -0tc~|73!!fU2[ӮiYQcAV[ +:{"jIGkC,4.ۚhp= h}k6 c\;s&}^2cD QUN)W(Z\Z(Yufc6J 窔ĖB/!5sN8Ï1A{N"aTZ=;! s0 vU) 7qxC߲R,OF(hHi}DfF'PyY֕ѓ'Bݼ(8AS5$BN'xwfl<5VttOSm*j?8RW-Gwf6fdL 4RԯvZ;%56()PR}SjSvrm-3ꍥnR,v'Us:3r]"ַ$ٳPsAJpfTe8_^ !E:rm!R5ܧ4ͭ vpSRpHr:[&8sHjv%$ge/;GέЫBز y:)qj4M~Tr:.GqejL j5<^*URV7~4A|BF͚W=dcPFIR`pPSJ7*mxKjqjJTi8=Jh;EGtJ[2?8V)*U{\97;e_R[i{+pH zVZ]mMЩUk*WT j{afRsrJJ~5I"⤛#d?%:7ZI =tغom_8AXx,(lEϴM!ǰ虠3m @N,[m>B)PE+PqLYmI#2 4\@$'*5(eXqCe ]A J9eHql2ʤlW-z,t,g[_]PPhլtUś:'AZZԵ,V-KeZմ'2mAOV}!72!C] INi*SHRM<vҼ0­d_ESìMiT36ˈo~NaVRzd,BPz5 6UwRGWv8$۰Ci)D'tHYDY jTUDac{*?$,J _D͵=C}]mK8ݚE52Rdto_N=q GU\9dK1Bogvf5jU.ۚ)ւrɥ6PS7aJZ"a RVGʃ,fvy/uuE"f^ze-~p?lٙ*?ąyp(Dꎉj{%Bδ0քʔ$*%7)Bhwfj*g6qg1Rȥi]lIMED"&TT@<\Fdґ!,[K#N8xaSY%:~|1d<%GV2M%!qJ5,\I "K:4V2iv\ͦ[Ĩ# +bUցI u9qCy'SUU<9` >v)ݮA8֦Y3I̟;uJ㳿m22Qg:?Ox_K iaS(xZ6D1(([]>q|Q5߬r>ҖoJ8G 'lnM"b (Yr \·WRFUGm '٢0i\57vٕB j &ed*c2>h6kryψhQ)-e[̵,nö%+J[ BtYVknh.n^*#a@x鄻92&"qI3-"_s3fM*0&WY;`2AU &Ғ%ÍF|a6xP)ҊB 4U rd4~X+g(K۷B#q ZNgZ|,@!]v yn6 oEf *̐t)r\Z6o)wFyWHdžd1>-ke l$Ҧyw9'M Nm0mUbBH>Sw}Er0Kb-Jq6c1UMEqIƱ0gB17O2P@%]":H8 'Nq$R@pB\%_A'3WEKztO4|W#v:‡`l;afEyAh/EI(gSlLrmYN8:)7:*㦦iq0[([l҉"vu dqd`;ōddKНOf>zޛxlON&Vי2׮?8yzyv+qȕ2RU2>j8'\P4IT.D*ߌ)ң\ry:jipj 83eޱMT9FU2!5ŤH^Lsr|b֖hM&t)A;4+fsne{6vݞ .:.D-+(8_ ؐI&_;:C6K=#{u9o>Tw5a  QFݴ[ =iNLdiQӀ[K;!< 4B9BcR48$^bto#6͸*>sM92l^CdgxͱƢƉϭJj$l4-AeLXpB-ԧmKP1O:oZSkVmӳ%ʙfei =:T=&]3 B](DOjmܹ9QjL&/:p ARN0@YqהR\? ;XmZ.\V},b>閰rr{"ck଺ot"B}K9=(/Gϝ;j7$ehJ0Jz/*QJQ*7@ !H! E@mPRZHVtmIrbZ-ޗz:w% Q]3o0;-^Vmĺ[&rNM-$b'ΚC-s,T˴e%eZ0I `Z^qPs"eSJzig6E&ҐJ{ "C@nQ4QB唛c@w<aMl ~y  kClB'i6Ԭ7'ܘ7]uJZ_mj7{  >S36˜ڱQ$ۉNL`sh?:!S{Z+3]{!M!D18I$E_NZ5Ki|;7h>мuA_]Ge?Cɔb$ 8C7>'m$!TU6֢vN~42zƅGn蕳I5eyi X.++i$֪YMpKlp$'GJ!) *5Z2h$*`w N,0QxYyNp;&$g1勡) kR{m$y&vlixZPʥCQHq53%%*]\G wC^>v%ˍ9+d͠kvJڻ}C,rBֲ4 ., Y)idZR+E(iEvʓW" g^\AH9/za3+ǝ\Hhr47Cߍ?)Ʉ4V㊠O\"Y7-)ێ<S2I"䌱Ҁl- t 8z亵P$Tfؗ4)Ctl黻商 ,Kˡ-K'8͑uبXkKu\@ ߳eFUuMY˚[(DR?%dKRIA!]Hc9^&%٥% .6_pBm&l]A' Uҥ*>pRԷUv^]y\HA챓Z%-X˾C1sȻw֠ .aN&mݣhy쬳dV&+,he̝vhz"?\]:[.ik?cGa384{Ndw{&RtvL Ԣ YkY}+0Y%aZbi,T 1(k0OV&0L 0f^ GeM"07>%ւăYH2sj82zu˂ʛߪy,8quDҙeIkUY4< 1  *^RPܩղ-Nyg&K8SQ[ ]WbLf]$d]ϸpѴm8g_1aY?Rg,xK;@7P|b7Y>r? ̨>+>S֫[ԓHv*eJ)9!l\q ~ONm!}P9)\qI@B=Qy [2H# sؒ޹UefrO*t[R"yXߴҐOKAX\*p2rkէ4!^L<Fv`:OzY$Z ("Ք~Kn:"njβPs8> ~u4¸UXn\FE0VFzVAŭl6 Z)GG("˹ua)1&ihMHjIH_PδY0@؝Nv7vUUD"bd r {KͬcuոkHʏr#=jVu#(`8Щ٢l7h_">S֪,z!O]X-Gt@TGQR,vbb^IeAiic^F"zNGRu4B4 P#D }Qyj}#e#['.f(?/1) XU.fPTۊO y#͓n+ a}D^]b#^fv UiX3yuɥTI<%UQ=P)gxg!I?8ɫt* +;AƨCs6@p뉛)5¶t^pр٪FQJhmpTI4%Sw4^jY5uJ)qI=]wZeG9X]BA 4hJ:?QZGr A䄡IQc9/84t"Qe&Bu ml֦REP @:*̝uIg'DsDfbHMڒ0?dime)_H%/ܸSR))SzyWT([M޸^*mJn,דK\ԢL+pR9Ty(95Ҳ\: ˞-`nʴ! jHTJ|y4D+Ǧ$ZEsq1x_uWqh]խkHT|c)U.R zk~bN] [~c,z (JPR悉Fa 6h1mQRv6Z ҡ z!em:lزMK!+N-qU6;!O8$aXutĵ 3c8n),Hש< ʧ˲Kl0"!rit)ThU^rڏ5Z)%O?Z(_Iꄶ@u3. )hv -Nz>˭! WG9X[~Bq٣GEVVaI]d3*ژD{_pďݘd,e8luӭ/vnkjNǫrGzEV)uZyxm~F2 7,8ᤧ4ExK$ENl0,S"s.Uz vF'XZ_d9 eai)~ @Ѐ.HM8Ǟ*`l p)phLWDcVtku嶻s'QHagrd/~]Z XT@ѧ|vBg'HPY93.if,^R7V^M+jL%jPʏr#=jExѭ5:)8'v5ՌI2ӟTY?HnnjhQ脺:IUimibG&u@m+dA)'%0ef/spďS&P1xmR*i;􃻽X% 曼>DtmM9B.ꡖRJCܠP^uEĦ ɸiu+:38 (? oYbIm)Tq>HIIfN)ġ|n}wWle3J5Õ#|%lɉيhfyըzaBie"Fb^ʹ%N(+lv¤grϖeGvuS!6FK9bVEB|j-FR{)L62ƭ7\Zh֔E>P5 哞 Q->#}1"OqE+D!TyM(w*ON+1ʏr#=jVτ!nFM48eX$|TY*mdnS?r3N =-y(以}VU<9 h]+,BtJO4C-RڕRN)PA6 ; J&?&:ôO ZjQ*D;udrR2(IH2m+DZ<3˭ÚWl{b]GAWF*k577iLUm2/A¬ɖVJN+0 \Nfd͑7bX EHpޥN^NxilH=nt*nrm3Mvำ@&7Š#E>3έ(;Q}V$|V*VĈZS/P8I˨Hr+u}1IuAJ4S>maKn#=jZGr\Іsiۜ,7HQfyL)*֘K̭ۃXBh)&QJn/!]z gYn:`셠W.] kn\I?tؘsyIBb|T"$3J._n92n_4 B$Զ%}~NJ[NQז Ib- Y2Vz`K\]VuosF+5_4>2?\NOw*>pď[j57DPɧ/S%33N#Ybu8Z RoUfӗFl QOL;..%/'a%L[Y; Zu2hJa ZAI4Cݐ?0JW3i/jM BnȤ]-' ɣC˫A\$KN JMv}hLl*MRKêi*XVLH'YͪiÄKJ+))g(F $x񊉰9c?1<ËCŌ&\5aanMW|$hK5F4(71R(9T|c)U raPUCj(wН$*7QYl=PiKi!0J݋fnl(+HT`zf{q̊.,gky Rv‘'VSȷ`M>}JTk5 ҂(]̭:-T8C6X$&-,[zziN((tQOIp'ʏr/b{r޾j3w{{>{Z=Z=Z## Ol\Hn^J_Q,%ڹ5_t;wa%$)M9tXNB[n*(oEΔ/θ(~-Jn B ~^k8BI欩%j(5tS~*6iDĻ9הChy@1Z.:-ɻRh/*W]T%HnQW ZY{j':ܨ怴#q.I7֗QQ)ݳ'/\2UQyRzc8H4PF+0UӮ4ZsRiSعa!VndyYM(VSEf1@Nfm)âwB̤o,/V4;bjQ˭ Iđj4ljЧnpW4`WoPl g]ͲyV{ԌL1kH^6Z.n['jkuI:&؞[2ѯ)G9X[;OBJ#\R$IƏT"Ji˴u:qYð0mb\r3{M_脾EJia\]5MG )VhWMXARfM1ă)ג=91'@ܛΤv8Cb*Z5Jp=0m< JJM6ܶ~U5w.\g牦ET|c)UgGr:jo"^d* p2ίA1.r ÿTYփE*Lj&,B!č֛9/K :#fvZTt/6h@&@!7uxϡ(s*Zrs[?n^ԝuqp5Kc|fV sXya-[-p( 81tHDŹhgZ*+C*°'BV Vgg๫z&8G=G.ϯYQ}V$|WsU5((<(3Y F,7.U6RtK)58 8JjrҦ.. +v%6ؼ jL;5,IEp(gƛKPo7{Q$P9&gʩ2dPU))RqS^zŜ ŵP"&;YS"[VW^а¨'-w+f9Beiv{%nup-(iĩCMԳ%A B5Fw WƯ'=w2HOZaqLJG EO ]iLOI>/8WQ$죡Ɲ@[kNu5ߛuZ%kTHgQZg(vQg)&T>@p%G 'yTy1jNx.q:.kIžI1lK:QJnz4U3q9QXD߆-ƒ@K;i2Q͡i,! *ړKG3|ˎnS'B0XuG|T-k0哞Q}V%ZQ.-IW[1N+%׬1/iH&Mkp&beW$m%“IFy#{BRAhq51 9WVef [aEA?d&eFeۏuҽPiСCAi+utjcz>-'_6 bmIg_$nzDw{&DV.LLަų2-+YEkNxv'@5zbNu3,DTS.$c4HR+q }`Vrr??ʏrL:󈘛My[n^q҅L=PG,87$-A3,j?qWS^@# ?D*w֪%oY.5EJ 1vBV3 NW[|S*W{Z(V%t'c4=qy+O1\+dfbR]e]SN cw)҂i`S+4eCY)+:&-{u.Bit+#lJsI 6P8R[p-eXl2aL\Jڰt,Td>fy6R 8yLՕrQ qωɎP%i4.P zkneG9Xi*TOZ"q›ꔖB(kGZz!.SrFhC\LjzqQZ69oRkf@P犥y0Ǘo\J,+Cm#V93[2(H]R"C04HTͼT9#;/6,oISzRynC|8Rh144mT;jQ"fZ N5{dTr[6헢ߘ2\*Rkv]M`\ќI4H.КN5'`9-Nz u1Eʭ#=ʏr#=j&[H M"Pj3+dQ_x[XPr[^-#"c5DH3qUE'TYVHC[XB, u b(Q!jLAxǹy[-2تBUfa#.~Y%fM-rjWUrg>"&JY"ZTjHXQ ! LM,脏-i$vDP6 Xu-'vAԄ,ޤ '=v "hF1GV_u8bGznf@xR[yPz"I~"3*! _HR3vD'_iц[YHQf}_HgfhtΪ$dlJ)R^]M|9+n1uT-ei[Hjb~SjA 3NeA||w6T朕O+LkeeT2fiIƀ7+ym>RfSy*TVK ?4?LSzdӞZEq-~7dTʡmin%֝qY,IW<¤g,,ʨS!=0TK^1G$KNK0]8:ӮQ7qd/c{JZ [7Pxܭv$fMiˌI_*ZCFY] MbęHmf*0}S3~YC8 b]ցm?PcJR%I]#M͵P狅i+4NRy20!i3,zjjb3Nnh+|]R0=]P^ʘoU,Ҟ MOdo ;eqw]OJT|c ",kC>rjΟhN2TL82nbEnjLIc*M0F ]P:gBfӸ+Nvѓj<9kBV|IGgJSvm X olýUDh_\wڛvm j~U'fu+ٖ7U1&Ma?L.іE(۽0'ld9Y/k6[SBJu6A׳8Iv:&Ƙ0fbMDM;\+3W<8N0]A]qMuFfY֢4@nU ':cA EuMkQN+[61\KbrJ|[i 紬]&Iqīylɍo+{"ͅrSN#fa%hNeG9] ܖ`RZє!/5 EAQ P=Gjal AѲ KҔ1WI5s]?eGYOm9ԑV7g JވRw ~'d^}{ƅH1|%Y91m kua# k+fBdϸ%`8ujѧ]7ۢj-j;b+hY b3?D0i̕ TzJbzд7êmHlp-7XDҖ#5v⪩<$ҍlKKg UړQS@REA\b#lq|gwG\{ЏzOdqflyuԣcb--a`u7^dm1z5q5xŗk&VjN盩KZEVuEkfɗ#h-9&^Ԑ#=0⥘:G]&3R̄m哞sTYҘ3G?hr*Ͳ}]~fݗa=ƍ`ȃJzd~KO2?%qz?+58~5#؍Ft|;ҩqϮK 6! @'KN)*RT0" G(;-Zc9^)ą,50)u|dvwxS4z¦ed=? .P,VB5"rxlE`HiE3fT"-u S,S,9K+^ufQҖbNG=T9~{VJ<̥O.PX)ږ,WR@jBbܛeiI(4wFFf6OSPؙ=#'=(0ݗk'q|STDOezS(E|[A$Xsf쏔ZcG+V?%(_ZqW&D=V;ISŰj*e\ H[= +qs$%TɱG.MoNl:`#|##5>\p}%eKh@[,ߝ)!1AQaq 0@?!Y:)|}V?a.ٓ^H^߉Da K@Z<`B&MeFӚy&)٬^gIbʊFwqA|fwq`@nDD:.:a^Mx}7)Cбf="SE36fT:8c^ A3L yU#s[߉aaw8oW6=$=+ݚ |:yOUk\E$ävע.IxMX00OWK_O1h_ Y"!I:bƅ4{|qK&. :^6$`1u;g@~qG,IB#"HLh9Eڏ^0D@I$u--(}9 nN .8Oa#NNܤ}ڷgo* +;ԏ?u lsy)">Cж.V;F雞͇{''Br90C;%Q+XjNd~=H>y# RbAZb|8[ۏS\MF!l]LPX=F)U& H-#< $ӫ_w/zy+r &f=q\&i"RsͰ~ rY$N`*߫"D.*ki#V z ;u5z ' ?'D%Ɯ&7雛0&yg~lJS߶3N.#1(Ü r 4L@ݸHlYAi7ӝs>+hq0<8buwޱq` @W>SB` +-"]ѿ^3O[蚟?*v9䶔{%abM`(C*_'BPH8Ylg1&#c) Nݲr 󅩧x'Az^JÄXJI; tȀQ<;Z8Iu+!},Ld#a>rn :Tѓm:/!D/Ry:gQ(@?GGԾ0NI:Y(oiQV 2&5U{]Jj% z3ƫ6d[p uw=Oh jNrN}'qe$kR='ĵL%tG|I0(I1F$5@RF jHFˋ՞Y9>c"Bx^h:. |ʼnG|#M€X1?߹B-IQ+++cԧK8uZh"Wij2q1X|fF*a,JlߜHc!&LkthQ}#k,`m smgr T|.@}ڤ65fՊE܇:+od܃MRT#>ZYDu%$;1w,e; 9@= _}wfZ΢aR`\q >>R%sP~42bx&8g#^VcxV˦=XXt%N7<;L`dw2g#q:j%6 h0'@⑄Web·DD:IoYOb  `U B:%в '}4H;Ma7fz|O3!eqPz}))ϸ=CySN*0siuq3RdZe4xɉ~@\l 3wD=3!G]2VȆz;Vqsc3374/+?\nh(&P@۩l?koi-Јo~p%up䚺qRyy8S(mq"9}$Z_tzy}E=dMd|hj9k[ru2Hd)$B8zFZEq:wK ;9 P|'ŸEt@p6B`{SpE>D1dپfVM>{ (RS/x=}Aa2|*]`Ä;9ـ_8$)dي9Sk3bbtSP.y=72i.,DH`y#3+wPI!@p b(o:Ƃ4/U^\R+pXOC[4<烤*;gz+F(jqs'll$Ŋ5Dà??h( ;z!4%A'/hZD.呛cў= `j hgOp:a5Pn0$h\5<a<*\Ml\Eűb;| f j4q)h6x}iOd/"e<`>>t4(B}%0VM^r։ᝉ!hO]&~1k0lp$xD4X]H6"Hꐔ>RiqBT## toJK7bu80;VFy@v4/J^z$TNXm)Ih %e:q<C]oۿ~6N _TT 7W~{v~l>L0q,8vː;"){HkQP6z}Iy1$]CX+ D3BY V"97q;b_TT*v಻?@E'9jܙ836ݒG2uo|-U=q /0ɡM-YI=2<0?87 ;q>>ؽ >/u5AU8M~#獯ϗqWb29.>` LK0>N=VRR˃PL&X#0QV rCʾ@Jmְ5=EPRD?up.,J\n]8!% A8%S Cc@tɫbf@;~p`+S,r4@B@$h(ag^I %:(L8~LOL(׷b"GdDW QMl%d= g VOlnnCN`p !XWG$xֆœJ؍a.,UH2+ gGf~NGyf 8WNU=Lމ\&'C}06ep.t bviwj/Yp9TY2gꮎn_o ,_$^ |}~0anjFځ[30š/)?k4d63=tn,B5zq\0X]B}>TjH;?9Vt8E2OC?ٛMɱ*-=E5RmH@kH_w:5ӌ\JIPDpTxɐI[?9#co3˟ |(~Ȁ=჏/?@DaZ|?TG#ɎY~Luc^_'eߚbAL2  1 %:$7ih =)7]3r1\tu9;[嫅V {(fe>עS@c8 b-ַx/L}liL;@xlxyϛ^qsO}z7ئ_|Pﳾ|Ca+v_s-/>@|f@T9E]Q9|n401ÑR.pNЊ=Q1 A"iq[T!m04 < 9:b^:R|qkz 6R&@<7qL(D$2NihXv䄔rͦtG_i|+3HFAOSܳ &QށCȻe4ۆ)6R{= =҉XOm2|A{(TwlDVE@cZa:.-n6,ר nG `D%+Q&5 RbJ{ 2 }[6⊫0_? O/b' wxЕ#.v#30}Abj:Rν2 *nàQ"#Ȯch{ ~NK^7q28 x(LP'tz wuS_ ߊQ>C( O|$s^ꃜE`8& ׳zrYtN(c| ,u韵z0L*=LάR%'NtEЯ!$E oѣ[@3mU?A-T# p:2t\\ M0a(A-QOڹm: Mgo ӄFX}e!/ $L͛#($1|;S^ yY(ί9ޞ 54!#FM}ClW'>lS:H"#۶XhHL"E*3Ry̆al:AWq;BBXHp:) , !\*ve$8f^o ٧ Z=|q͡ɛ ˤ7YLE=q8\F.[qW`c0(Ņ" CiF8EF!H 9l|552`ׇ%!,B IZιg>˯C@ zRAA~׫ 10zw@ F9bz5o3@0 3hlp@LK e-?]8 `B@0M-@  !2oHjhX !!􍕐@M [:Ѝ`T>pzxd])E/qdy\WuuQF¢`(!1AQaq0 @?(_1UoUM/XŧFxXy !P jԐP>p wC?|8ge8(x 9מ{A(>9^(Ps:[99f` ~ :s1*c}g,Rmj.xY`vw!V+1 !_ %F 4,H& Q|wCKdžIB!2VQt> . ;U{ m 1f 9*aE?ה(![psH=!=;i@rd\5`IDː#ܐMT* U@H+ *n-s5ƏE >E<c0Ei Њ ЃaA l3/NB ̴AP\ !*s1Ӵ.W>nvn-KgE@mftA$m$!E~ݢ(T"? Maf%L$3vP4(<8  +BT rrDX~,FF]G)dY@|N.c S;b=Vv}3\ 'wjB˂?A^h2%V=͆qb{.e|?dEM'N/BB_\=8GcXv_)!1AQaq 0@? Q=}:Jy~\N$)ux;ۥqvxeO|2x!~ܘOb}TRA!HKك d1 b5yS>w]Y6fyፅ#`lY`ǎ0QRS @)JCv 2s j| OW\(βhp wT:  500dpU]/uJcSOi%zjUG A]l H(G\|%** S+G[|aZ -d IF COqG^4w*O%) Fl^=/F̈́@} mS!H4i)Մg@0a_/ݞxCVP`;U:b#M(Oۇś'߿ >3l}sxώ2v #+a<Ӂ5 YaL#j5 NonvmOp]F.ã'6R)$ A OXdy5G}(z)͒6 w8(g"AXkTR[|y9.!u8vS/x>kT!U,^,e@g\  RD: W;OPN^#LA&oI ly3uh-H03#.U\W8y2Νib@GL Ҩp Bp\M;$9^/~^#%{@C"h7JC ϿΛZ}lN#xHhfA)D`@{!pBY/Ngh6mq)U_=rN#q%8xE"xD@r+`e80 0Krg@EȚ\}>8U@N/Xz n]Jbw&eM* í^@0yY>q|>YL-⋂Ӫ9Dq n |Oe;v-;zZO#M],j+WejfQ>+_l}9Nߙ9{_/GךN y4V\x;ȘX 2TQrư{C8 `jIR mv ~"}`_hn}O4={'Jp'/)!1AQaq 0@?G-WX@[b`.ЂR*W4. aLZ&z4;+I c F: wRqȸ9vNLCnL$dzEBk* %فFX6 Eʧc0 n*UfMAZ̈́cyTQ(e"0x(# (XOAe@Co>ή| mPF^ *sB3VhRfc/؝AEThU  Yc/ٝdLEWtp 1jcUA4Bhl#=4, j?/m1Ϊe/3N|܋;= uM-s5v G}k>\W  ]rn}H[YL/7o& B4c}:fm`[ 꺫1'ê X0johqet0j!Y*kSf|P굞޲\s_hEv/Ӯ]G @ԍ(+$4ՠ6"@$^. t?: DT QNx!# lB*F`Lׁ4U&?b% P?._dCdZ^I"GjTÖkY!U"挵:i.ŕ9A* sCYm*OWETnH0"$A(wY='㸃T#dP)gEi|# jMIҋezo(UmGwk!X$>զ ԗߎ0Nx[)$>p_ȴl(?;"(Px*`TB4B?Qp(h$7au*Wx@`4L] T_`_u."+g݀ ЗآKK@&(JyPϚyIB.:j"Cpd"PEz`ExQ#w5ioC?* .h4䔱`P N :+NAy#ihD D:KmD0\6K4 !;u J>uE`#Z:x@+D(4MI8ew%Vmq<}I#(H7xavu5~ W~q{c|/e2#zu+-]aIw01c?ю3,5p۸>`PCSE+XDcЌg ڈ+hwBD!BpЈ2~$ NG;PLvXZ( \U\$pnx J%T{D5e}΀@._ZN8p8:Zԟb~O@)8$??Qxm'\DO"`( P(Ͷb}M渠\M] #E4R@X(#y OWUSbu@r(*-A^]{e0ED l#:ncP"Ј8(hpVoٱ']ЇKƞ a@%CtLޡxJ@׽f,Q( TDyGS:I~pfVV |*z#$+ @K62d!}u6* jkqztjmP{=>G@vUCXPQ)|cR}xq;)8k{؏*կqѡR^Y(詷Bg$ '5:s$d5Cg)|+FЖ4R6#@`b\R)MrUDup  -!B\cQlD/C.h;I!@+ g 3{]$~/`OЬ)29 ^ŧZ#nTLHrGat 5Aop` SxGM66 L1]Q O D)-*(8lK&B7XrrP:AұOfJvG0T|l40nU\BDM>oϸZBvE$ 8(-&7/[)Yc8YW LH U}6#:R vNK@ #(,<<&KAtBSq(S@/\SK*a %|l_"W@W~IWSCVYXjp:H~r1Ts,wT!F({s'T@}UXW5,܅'w˲!fÕ[U $2& #iO<%<44,wlPH0NyWJ!"LVȆV'-66m3MGp( j<h.vKҔ`|Uu]P'z.54k˩9A?rז4. 8"†{N>0܉v}G?O,R|4_>s{鿩WڊTwU~~2X@EN Rg/0?5v_;a^''^RQF"#B*oi4@ cR,aLP717WE&@kYFDyLhҔv&dr+\j FAkVh0ʗi5@~Oܬu)'aVQ5 ;E6tYM"aXFjϝV 롼?uT0 t]z<^l)z_2SijQnH  F4e J:  My+Y~ H$, %=]H8cT i5?On%f:1A|;T"; 3GD+|A=XaT-BpL! :]"CB$xDŽc2^#F1fUŀ,+pdU\'D a^hk ]>axj\ɬ'4sߒj!P/t )kXG,%BA>Ő#;g~% ̓ 0" (%Cg#d1_1Ku5fBn8J6A+y'(`!H!m9^kW(2˶^{ZhSثyg̾puTSPzݦDxuqKd2`_M_3}?CˬX/iu-uՉMb9 aUid Ch\3DKk E@ɯԩ#1p TŰ1Őn6mם[ȽfOo C&E [q9+0[tOr}ֱJ44/H@/K4xB6ȹ"xoHDn137aiXOW::4 -1n*&v ݡih Z'Tb&(TEUm|L.  'e I0AOaH KS"X T YU _p;\*I*T<Qj B8~ǒN{ADx4bd g$l@[4 <Q͗@LA쎮 bѾŞ _WbK5҆۸1E:)X# vCK3,R JOT[4m_Q㠲JXUQ2Ai=P]+ hœltT\,<4J7btqZ$U>Rii|DJyO.Aކ.H;̏@NP;xD-`Rv< %yЧEP904=M9 N)}1:v +8 CNt)fBw]A| /d T@"KfUZoѶFzO._;?9W gANǍa9䋀qpea(a#GR򵋥h6_nkoJ)U"P iV4jܵiUO#L ;Q~aZ* r@I@DK`+hu.Њ?L$acEUhb-[)2 !@>8A.r>#o˸JDSFS\l#dLETHZ'!HUP_:#='l61ڹ0*eC|r+S 65%l%w(BhQ)@&и,U!Q:䣴j 4E|nQDS(uVIpKpu\Mj<!ʗiX3 dFcz&hE|V 8Nh4B}@y+x.kDϛ/p) WA |EǺzDdHx^{^E+шUdF%Ufm >3+["&|Cic>n,1]*_FuSL6,]حvYE:oVQժ-y-t)7(X@d>Q?`$eu_#ɀPdn}x[@ cd.N8^]5& tW(#*=sP`??Q u0 ?A@a&ccMF4IAN0+!A= ˕/dkG(PD%>>ƯKzv &Jx: i:QMڝbyvDg tŠC J%M89S6w1FndUJq¯{:D}GQ}O)HZ(3z_e%-3i{,꺝>>r?c9+P#_B Ō#Dw4VLT94z҇-Ml'h)N7"(ICzW x}8k]ia`ICB%1ŞFqt>8{B77",f oEPjHpX5X1,f `I.^FSLp$1R~dҵnpϿV|+gz'^"p.z)_~sD` 8?E1c@*6"P&j;҂n!&4WI#pm U,V> a' {a‰W]΄ns6bQ<|s)PLTBBU:,bO9 g3'*܄dSAJ#%o> R{4vJ}]@WbXa7|e&!LYHjKKAdgSRƌQ@PO@ ZvW9k)0j E]}ɉMV$UM#JЈ v*>_:ƣ]}oF&>+Co/Q Rv_4<9g0=݊ RJٌTh=U Ojz"PXDUqP] 0v*l/ćc?w;@[H6Ӏ2 Yɿ0H[O__ô9@;qaV gEBVkp(IM@@h:rz Fi%ws@`Hlrp(QkEwW؉2§ˀyGog L0/OaV'_Sa,mWLBIrNU G>L $Ѱeװgn(4KImc:hi/4FAGdǑ؝ho2[$d  +xA>~1@Ķ+ue c@g: @Ag* b!ܩ^4]:K_tF ѹuTwG;@v* !ʈEz=͠(Yu@bE 5@D @ GHdN-H &*,*@ :TB "'uƟߑ{b.ATL  W)߰N&JZ)Q# d3Qc"@Ȕlަ0TEΞö́! &(P)3,A R^!ѵ|A(]|>?[v]ٹa,Mq^ͩD` COxE9I9k*%3@*phK=~{)jn7up؇̄dDDF`JCTƫU]`p;b\?==9iUZ:@<8vjHl]ek WPL!H t n} ,*ߦye5d^|0j+-j |WwxM2^!qZr7pvSz;?*V϶H8i (n49ڠ]&o!X : ~"\u0T_ n ,_%+֡ !@+Y욀A(vm6ͮ~Ѝ3Կ$~ĽxB.Ļj}B?"U!MaD)A ws)D(EOCOC>W.i)K .A@>Oi4T7ʇTu`pS Pө3^~WTE Su"L=Ъ2 ՀhИh _%+֡My Np@mayavi-4.5.0/docs/source/mayavi/vector_field_cut_plane.jpg0000644000076500000240000011067312747716313024354 0ustar prabhustaff00000000000000JFIFC     C  ?]" bMd TF9տI得{U `yq DW~;wqG`+`+`5{@I_`9xs65;ն"cvi{d}E`gtDeߝS"SۃCH=\| :,~,~,&W~hlc˜f?[6WMEv?Ͼ,f>%v9öߎ_}~o _*j+`.2`޶ υy?>o*/ >~3Q\~!cq_`WwМАć޿ oEvE>WaqPm$E#>5 )zqGkE\Yb_`WwМАqJ5r7>v>;.ݾ*~۾m>tc?712$vʀ+` EgUb7c0ZSJq㝽:Dn129ͼjmkS* X++ x?{ni$1_zqx{5ƳG"]GYv(~(k,P+`W x)4Ct.~.GE􌽶L 2!_=TvTŖ(_@eD+j;-BUrYt:[Soč*Bοn#1h{\kkD+U`WwМ}Bdkx?6jƓayRonяi ǬmKDϾ(~(v|C&_+W~W{eV괒.q6efxeXI^ua{DM179LL?+` Ȭҷ}1v9Kq5{#ϟX̫ ",O"Ba[mOj(~(Wk,P+`W 5݋%ºlo|0%$}gdrH\5D&[∿YqeW~, _աYۙ-^Gq}y궱Qli1=6vuTxt;qGkDO+` ע}jpX_EwgEBIr)N\QQ{ Xq?WWWAEXL1M슺A0zXZk;Nas=c;/pSP G7|}_C9zzٶ\k [V6)5>wAdW^Yb+\lUܔ~X@g;"K yN{i~6={wRW>7^q=FfEi=7_?y\QQ 轮bJX X8-qL-̓Fo vtų]5\UE"\/8k3e(.056 74!$%@KZ|b[М cP^IuU.0c bE[Ak^,mz~MHZӹ(8 $ VTmGCX. zu jiqY4oLᏪJR^Ken ƽ]'o 9][ B!uF֢fgMZ *'Ž I#=^0bgN}2ޫx+w.iq{-CO{f,6kp:u֘k֦mŽ yx{D0h>jT!MŽ#bByв`{(|8bfIײd$5 MWs$|Xބw_gd"ab CNߌNɗ&(0"I8PDM>6<[oئ8/8ؠ?qi[-{^'q(uCJIB^S^ѯx6XuJ֣`[Н#R$[8ìqj!V$ʒ}|$iU1 d|8=zsg)-z>A:moJX>R11S^(mc t%=G)6\܋ Odv*"Y,ֱڳV!+Z͔C-m6i2h,eI2/N#&\ҹ-N-N?ǭs59gV1qD̍T-٘È.BlL*U)pؘVcY?q\' 'hԤ(DT䈃JB@"3H/hVE!1 h0atuzzs&Aξa9$b- Z&5; nmc쨟JX$ epqoBv2Gl vxpC>C0{kkm{}ݳF#d[$}D)9ZRR*?q\"@ *83 ӈChŽX!:d4ߦE$t:r*@|p}fnl[ΕΨҴ!pqoBv=/u~8N{g6JiR @X',E[KUBbǶC0xjLa:SDΕαoBpoBv4 Ǯ{4bH|ٹWVߐ'ЄKHJX8X3Ď̅\ òa.at/,Ƒ {=ۺH2xt2wXtB8YSi}%#αoBpoBgWK!YJNχ dRM7xv-K3n}a1O*CEI[ ?q\' &g2,A 'j?MiG/H?W.$y5d!#bJX8X3>1 9 f,< 7Ӯ%jH'dfx5bfC@ݶ;|:W:Ž Ž cvGc0c@2cIR@cnEx_ 2a Bs!g$>#ܡu~ҹ-N-LN0o,D}s3 lT8Tr@DjF驿y~#αoBpoBv3`ٗ8l%iK{ Em&:L7>%2,vёȒvJX8X3꒑NB/L~&8 4ՙMb9n}jSRdik!KF\%~_G1(OvJX8X3BD'u n2~5a(@+bބbބ-iжwio`wmm'fᏃLµ|)X ^Oås[М*=\fCQ'cj2z9ksoKݼWFgJx;o-"\-OlÆ}p8mY2fb9.u~ҹ=Ǜ|ZfUnVl^ Phֵ~Ɗfo/_t*OJ BXnC|aQRC7EI㛋AyIkDmb&l-euZDgΈpspVXٽ8;C:ojH8*BFG[؇sO#Tk ki1cwQCW'=~G kBk2,V?:`ߍ+jr>pJ4%iބU1ጅ7@ucu{;a{bƔ&KkxW>#f i_ #V"&t/d{V;PjRz2A٣Ž - <g/J5͓qL1D.10ޗQS_feѢ,̭?XG?͚\O Sb/uGVNW" jq[bބ<$sI9Nu%o6v-[3<:8ÆvJJNC "5+Ѻrz}~juBAw'낱^ϘkTӕ9G8)1{m5hR׽&לkв PKy0;9^4d[М Ⱥ#̔ ;R]&$dW*T#E !1"AQaq025BRs#3br6 %4@S?a(?&OP[Kٽ2{mzG*B`22Lg\}u**Lr9Dn_(JT➰Riw֥*Q.E2q ƫ<+땾Ճ|+vSDLD[GTx%DNwdm\6J1hcwF6=2Uv௔αQ@@;߳S]3t^VLs첔͂JWux+ )8{3##C*h7Td0 QN)oW 3a')- gLS -#Fp27`Si.kͶĀg![x&]<]!ȝ4YMvY;Q`G) 8X0d=˽.0\6bL7pYb;_Q vO':lko6XmzeTv`Ges[ $4Hf"oBgјwM:#?BLZiL8+h#C1ЬDbʰ8ߑ9(TY$'dO/,B] @XyHWtd0# $-n)^FģBg,GH>R@kT\WUJsQ,f% I0rq%AaU*,wm ,pD`iSei<'}vQ-q-cY.6XJ֑ܙ,; *5m7Y)HHn?0P%u4klS2!G$J{d;柍xȏ#6=StgX7/>D1 RrqޥTF;:y]nL:YwkpCȡZQ9 1{e6&kJsZBw։Jݚ+t%#hhQX?0elT&UPB8bqE㩼b4ʸu1.QqX'Ay-74s%o# UM,5$rsԝ9d0DOvxV|wź[-N<6BI)'*l7c9"_RjV7qI9TGئbJL!K: W\eƐ*aozƚeΧL˪iSDVKft$"ݡgXyV,.]}}h 0 oFu4-w=U ahkL!eOïM\XaԺt~D6gbi7l8ݻ.%Be?8SFJI`FhQ@o#9nXBY =~A.-RsGP 1Z ,PM{RN4IQ5a$aY[mxcqf^Y!CKrt'v<],T8T ;{cV}Uh+UU Xg -[})%wЀ~Ғ#98!6ȠP%m%J^5R5;*^nZ;n5_os3U]8u$Rj|6B\R[(nNjf'W&tz3PBkuaU씊WP ԭ.Cl6 \FJ.2=şGKg<,6%֊=6|gxww=۱Yw0aU- pLp*n؛EA^n20ݔNC~0mUEc H]KS.R&Vv?jTݏJ-5"a}9HcEsP9H  kR嚇9gЪk&6ťw=> ꅸ Q9a)~̞RW|ɽSwեbPN*DN[\bLmJW8ìRu5~ݻ.mSi+BӘ_Ђ1!}{d*:ÂӏݚL|b fH. ɪ@tQP}ƧhQ'j+DnNjvy.B EpRT5I1bRm)TSO##F&eUE'\{J RhܢCR8yFq.►Z/!պ򽑇'v<]-՜҄HWR. j~ƚj⛽ME yU/g(3m7Q"o} AȌp=\bR'&29h<<%LN}P}Tg&D>Ekݻ.I T*R(*J+@PP+K-L:WhGԷm )"Ri* L4!$Nǥ[li]ꔏA9ysWqTz[[)?ac^DOS4{)Ѹl f8OU86 [*;{yvx}"V޳ 0kW|̖B|tʺ+1 Z.%Wi-MbޢU!s8c<>)[߲l-S)U?v!wRYIծ{cѿƖ:)Yi7qUdxSkFY2Gi>ҟ|?0Na4TDI9G);J;TO);O:{5Dž?Ytߥsр79ҦnqOA$T㚴6h7`! JCNQIʻ_)[ј6V{[;nah;YqqʹGk-ZLa"$4UV(=,8w?LY eVgzW;lHGu8\ר섢Lvm k7#q>FrmAݨ1xK;GWfY! $5}#~Pr8>sW\MUO&=gиg)Y#lk76k]g|kt(t\{lW Hke'tهX.D {"Qܘ #g-i*L'v;\xjָ=1WCgPz^eَއoo~"=FյZR`{ܶƲ%L~¿{u:?T?//JD\>Ze] /:z2as=uO"DW[kb;=< }!7ZlƯDbA;N;P˺v)l{W='Aj BTmBoͷIk2Pi;FܽUEKՋMpLd~O*1b\]vbSnPZʡ: !Jד VAl}]8Jib݄O,ev q^\*M Gaygd5]K8ҏqp/!~ƅna7]jEgiIJ1HcٯWMc`εX4aLl3No2[NCU,Y YF-od[D1oBoϳr,d}Mą:SXYzIuվ.-Jܑ[n5X  G@o|908>2Ȕ%ljy05RrbD -ߍTFqFY'L}fW57lQ94yJ~jNw+u%C%EHoOJw*5"bzAZ|EKKlݹ*TxOҏqp,Of<\4%nZNg#YG"oaɌTϧ«#~]/ՌUI ^L@qezW˖M>jJigyZO~߬:zWkҋsDiS7|^UhvC z<}jқfĸ)qcˑ&IEa33"\tgVzǦ Ѡ%N7K3cTc5~r%rKn4Rd#`J>p9֫٘zlyMb܆B|ͫ3o3Ki*A&a(-FI!>$J7BojOJm}8"۬*cO6;bjJ~QU%^DzCqsg?GO<&+1*,QXW/ם4wˋr~s6Ty1o6)m4XgoarF^>"ږٌփFx| NgiB[)*[k#g mr*ܻF 7QJ$8bK|jWn)M }kIӘ*ݗ%(/s<,P4B> P KA[Q9A=Q SQ' &o .40U^S'攳S _hXCM4줶iR'tҏqqup|ZP>[GO3jN Յ-AVT)4ƚ`=LiV /  qY[E""#ÉF3Q4H rz>W6 %|a u,䓾4f 3 SCW~>~h1S9EBR.I`pp(T 9hJG*ܡŁﰧmZP^z!\dZKRFG0-llwR\e9 ܐ:0xRU˽k1$motҏqqup|ZP>[G%6Bѵ6[g"+؎lme Hmd8Z9mJ<[lҖ )kZ6˛ܶ-*eo<%my^V2PA U,{=O*UN%+ ##fSn,v;<L{|c>sWs:b?vp2x9&0y<1ԒҞdhE›U_bZq;nyN;2`Q>ff&-́fV,v .#TxQoĉ@FW|z1q{$(v%r㱞RTTxk?M(>|Zu *in*I%hDwMrVR:pU C2teZa.Le YЫd :gO2G&fCl܀cH[Ij"OjVF>vjM<^$ZA!<[dȎUyx6Zn\V {V~13Q}. ε]UhŠW<͋aaVy1Te#,UG>pA߂̖R72˒Jpk[Q0o q|%rasjGS͠OG>W-։@K|Ǯ]L)ugwvBHZ6fA8v-\C$X-6sM\\*LᶎN^#j-ъĄ'WL}YVVlp8Dal&6JF5B''kE~Sl__Z¤pE.'' g:8UεX|8HǁxwPsV(-Nv+<$^H×˅˜d,X7CzWܻlmՔޞqG "S ) 7sleRRq"I2z |#1jx&+2Bۦ>)<($}X vH& %)Rv .->VM*M<G+yw<Âotҏqqup|ZP>[GUi(5!BqWlJQ36IGHVPy`nJO,)+Xm#BZ;q orӀܖr#- lÃHHAQ`& -9Ό56ed-I؋trԗ!@lׇ˜J78eE[g:8UεX|82 #1v =IRW23nX.J$}_oH5N-F[\f;JZsnu¦~Af/sZ=#RFl]:ˋ=Su^< ǹpZLt؋[CH &#b0PhG?M(>|Z& ZO9֫' \IJʋ~ǔlɳמ>QDžU2 f훰ђ*Z,4-xYa0/1X'qT?ݫu:׳r4,S%5lU"Ka=OuIZx v | gMqXաxCpaεGbg[4\G8m,T 7^w(>sV) QTKI6*vmWGi*P<k>Kv*EaO;+ BSWpT6N[1r>6C,k9[ďqT0UL޺B#2 gJ'a?JI&OEVmaO<6`lO|c"\pUg,ءˆjTd*Q(>sV(-O[5_ K\}kVe~a˚\۱w*aSsQoA;~5$ k1Emх$+D5R&9CҠ^5|c>sWs:b?1&[Ӊ9c͈TxtB~.Eqy&9A]uF]Ndsf3@q+#ꕈGՀfBiܽqm .um"pV~13Q}. ε]U [A'פ4'#T>݈topֹDw6FIzƜKn*<~%jWz޻` <=qY1SվVVQ&ܦ>!zmd{>WVÙIꕆeESqKw-ɄLq7IÓVǣ(mbg[4\Aj9֫oIc?Mxr OW݊. \̈J6}۲֒LwQN;FL펼VWU ,2 .yuc ;M/rc_: );5q0OcݹEr̡e$ Xt}X2nralCT!#xuR2aYηiG8:w8>sV)IB֡ڎD(omyI F#c^J hپv#W(B ybLQ}(kPO I?^ sqbm|sV)45-1hyŧ.eV~gj;+Z|Vd+vr9d+ejQɗY FϛNrETB<НZ'I""Zv4j§Nd*E>5)ujqE#PSkd|yqaYηiG8:w8>sV(n|e$[;uU{[x{.?'%BGI>&#G):NER{#8P;JLjW])"bTq\1AFvņ!ҿ@WN+#ꕈJa. b Ӕ 6; M[rQ*?7$6EoL{|c>sWs:bj<*Yu'e\9c+m2|τϧH@Oz0jf?#ߊஜ R ;_kºNƪ<:;V)9M)f8 ?-OzP~*'$TmRnog'V#|]VQq?oJx#P|Sbg[4\Aj9֫'E(q-p[xdRRzYN|c${pwirەCˆ/- oH> 1|(|2ik-\ Jw!{ rq\OTF<qe RVc>7Ⱦ0rL^d&8k?M(>|ZuhZll Lku+O:NTe|iWb[ml+V5o8N2;~L%[ BEؕKI38B)$ѿ ּoQU;|ǔZ%[R,8k?M(>|Zu L<]H% S[ CvQuQγ )Q.3*DRDZ!$}X`Ҧ~InI@ܒCFG+|fZy8絵}+bY>2SFr6[mbb*y~A ÊlltI{ry96Hڞn &uJ>p9֫jJriءbwsm]lq|X.$kyvҶ"^|sZύ,zؿg`Ƣ"U!Db: 8ďTZ"'rj?FHVuͲdҢ4JĪ6BrTemXOU`EfEXR!ڢL]Iqʖ{6Ne.&uJ>p9֫N5>:vd5UGOX/WTCTgo)\aN;aRO vo]{ܦ[NCG!*)H&l;9nen}xSh'\k5D$_VA3Vg7v,IoajS$W! k2B<ԩ +Ƈ\)>]^<K$LzTFXk*Q~0“(^^&m ~[s\"gaX)Hi~JJS9Nop>=RKZBhmZ d/"R{TAF~^<߭٦k܂~d%~KV~13Q}.!KOf3CYw_t!>ؾSTxgV/i r&MyĤ4AM jk6O [y~6hmˤ?Gu3[!c1cjKMu!ɈBtEm$XB6Դ|^Fd+pPύKDLDd+})SYKA <@5jYw(>L"*ю‰[~27O 5wH<ֹlP'jOs8pc$j,Sͦ-tRuIq犟 vKΥY'T)o.s)ՋqϋQ2ei#~wQe+y"d6qUElw$4nvO@y1m ?@ڹihVzں/鞾,5&CV|iG8wK43Fi=J*"2yRUn ۜ\6r4vM:RB^gf❆I)66&UϺ!5-F U F!o`:@Ӏ},Pt;5&U'(E"=I0gۄ9d ƥTоP#U-$Yx,Xx! ޥb9u#V~13rSԆNWX},sw6v]-LxZiQH7'Tm;u5hzѮbO'MSn&c#W C5_tѻiG8 ZVbLaYʅ}cr(51WEBE { :Z"^uZGHM)6qas}G4*R {m3? GWNM_RVƶ-tNUbcf;@^ǘL ]![> Uaԍ1%)>y%kk>UrkZ?(vJyVO\] ;`Q}3цޮH칙S hsObg[M̎L|ٌ5:FP'(2nWm=U gk2= ]G @>5ۏCINg!kro4x (>Z Z:d_P(;xV|9v4|y򑸧}RllO:punĶ p.JJu<ҷqswlLV [dՠﹸ6ƳF<\eq]F;ywSq &cj8͋{nt8վmUiƹ!BʯcTIBFXpt8s~V m[n~ &u+!+3%'IN~j?i,`C9QE͙\cDKwVG O_tU hVĸΒ;- Dz9dxSä3'L5P/m2p-Z`c CwHܭ4!o*??kN`u%BRN=9֫خ4n$hZn!Ǯ:6fKjǸR.?4) Ǎi#f%]:YB.vwU=Ʊ`q[l\>cQ%W>J#s o$~8 Ea-nJaYηkP y0c8-mCT}Gњ<Ez?I Sz4ϣv5h?~e_XTʹ~HZGŪ G+5*ԩ n8QaK*8-wP !s?Nۦ\"e7N`ca!I%=>U*]'̀uj'w~fʯE (i>|xLEdYq%Mf7F߄NjC %^"=:Gatd586"hB?7WuEe>2X~dnCjnR|mR=-1UԧNVWz<#8TGwF> Adԙw2#0Бd $&reYIa‡YW:T67beGXVa!':[$یG 9֫Xa'j}X]>Jz9خ]C 㽫or:0kԨOê̎ ma04tI*7IrI@5}U+bJM#F SXE fY%p¿/N] _Gbg[)!1AQaq 0@?!MȞHj)(1DE)e0C]a%r M1`Jt k:AQ*֓:o) 鸣RBvp˭4vskem9 x)y 6d:2!8 _qӄڑ2W\DR`X`scFEGFmմ(" EsJ-1ִ*uC>lݞޢA-{ G욧4f2R9db|Ujg,4fF&Sj/] 3- Xc#J~J(pG4ܠb%"hSOVk@JO#i9TI:tw-ns6ŧs0. x@X )DBn3XaOc+8 &֑Օl6su"S&YAoOEw>MAO,aJ m41.U *ڧ와bh g"/‡qXK wZeXLJ7MO AXD0Vs")dm).t 3(g0$af޽o"efH@TYrcb 7uTLnj:75bye3w4';&7!!%#"'%n ZѭG~CY0$&їS"gaf>@PojՁyj+6 i8H6F Y ~r>:f˄iD٦)GzC'lEJ{t@sXXр%gJ"y>xx;NKS@0!QvB1PC!IʱQP+7~T#MS)oKވ>58PFj =xhep& "\i  +e22ՠT-]آ"dqNL%$9nEd=P歪LL7x0!+~Z(Ar첽a0%rWOp5Lb3|dSSX' B&dAY zlUݢu+9:3CH.0`qRF} 7ahG4H=hE~3wB4 րDzA!hDX2LI;TxRyՒa?wdZ'"GFm0=!ڙNLցBP#=^(<;FC oq8FVlLĪt =B>3wB4+U F&{C}iɲhrG&dp[5!-ԶAQ$9#X.;CNؕD-QZ VXD<ҕduw[Jo2>2$" D̤G^j-U=¤|f*BYpMToz<5d@e=1KO U~g-HQ*5FmW\.~)( 0KZj`zJ% fsfY#CS) { X"IO\(C*J[7vN[h!:.h(Q8_B6Z+Dw'(oT &w@eXrFV%#06rmQ+>uq V56#C^{ڦN^V)!3t!%z0([aD7}EX۶h,lُ& Lཬ#6Ε)tep[0}}cʝ-+*k@AE]O7u=?n{Zwr65s4 ~(n*$@Ju;MRW}+qpҽƛc-5 >v*stY 73Eso ",O,Vi@Hѩn цɋy$kXKVM-7u8 R W)BkC? ,]&9$fړhAVVQ|*t2N訜ڂyXY %~.ROl'@U|ʎ샧nF20"RDm_~SQ+h-1{C39X e7/zTv )Uߕ~LҐ/OO n:zQ%\ 3`1DB: M!艣|fɄi_ R (,Q֜N0 rIM-cJZ{"j ɞނF b5-?0ȵ6,1zmOx 6]JnFc ׅ'J2FډI7ބL 6)L5tt. !1 Ƒn**-EIn"@z|fɄiܰ7#:0.P)]-1鲿gfcGUNYJx'r&풴[\= IwsXDw QӄcbGTlE&'/T O04>hKu1CJVׅ:p\'\_֯"E2NCV6=\`1l`sAk_j7$7PU2/<~Br1O05`D!.Ӂ 7`TanZ栝: "pRoѬIYwq[ҤQČ0ӣ["`[ꦮAҏQX#,t6 &~3w4&ԗ2$>b{urV[GQk!OzH0ǸSÏpP_ LPVMΎOh鐁fpeLD]«U=h~[m<ߓAeɱ5N|Ե Q&Uל]mB xn m_#^W[5zS4KdzmhPڥtU w{%nڭ1~ ~' nMuߓD^*M%d/D[dε i}jZKLV_p+\>"UIY>JpD@S`h੝7a4FRiD4CɿGzņt-1Qe7~L#M9_;@!jIYnQ~"Fa3Rf_vaj|&= IָT|#=CVTk{\agzHjL" 5-zXM"BG#О8h3βgm?zuߑ3ML(D#P{DD$cb+bf=e$7 ?~Y.CZ6͠otZmU\ʷդEg |1LiF{WG`+QRD ݗJ=U9z-QE Ps7}LrRPۯb F2}Kx{XW[Лn~jdk~Kj5=>\(v. C 0!uo%tN"OST Ţ+l Sȋt/RqЂe Zn7B JP ݜ3wF 8k8cҸًVeK[CwӉĿN޸ Q 3![be!0K$HӜfEr ϲkN*H 񆅤E`s"Xa})d)^ , 7:C,,˵VddkWy3BA5Py@cO5HMش3ef@P$1}Kf1g*" mR!ҏ3jO 4~Ń Tk?hԱBL074rRG U k?B&U5p4`@뿎{gޣz3qYh#Lih0{^ ޔg<1ȝalһAI +5S0}$S8#d^)oˉܥtCLwpoD \D>18T Joˤ-" 1I0I[#uGśibid?A桻gHRqH 4R/x:f~^O<@aLsa6kc^O7]`<|/O5)_YJ?O㻳d(X!.`$!ʹ,Cen BT,S`Muc >%H8@Nw >f/o"dk?wI^ V ^vkOI@rQjF@+*е0 [{(~`K:Ha?l؃m/}QqS,ˆԾ X 0cS`ʳ^[%-4-\ZtY+A!"ދd[:ǘ5sD<ܗ+a,܌@0(c$PX G+B&UjP|Ts4 05(RcLxS&|q$(GрeL"2(QL A8 74+WPby~g1,E ][HQ~f_Jvt5@m/ >|ڪ% Ng?'ib$oO&(끲`d֡4 QW`UZ|WЄ{SYI@ۢjh1c c:U(#cGEd_R Bs_XeH;K3zR^HuBtCRX9 2/(DE"&GB D:,YK^AW ve[&$LTA!$:142E^CHZfH|[0N`j[Xv*3lAAA(0ED&uS3ځUcYLqa(5iZ$xJU"YWqZ`t*_0U Fxs ijnD"RWJWwg@t״/7?}5Fcƫ&$$AK"3gdJh+iZDA}f)FAs-xt!1gƣi<5KaMB A;HCdE+|;wn )!k׶uKo|qWudH MȘᨒ;WK\ا;2@]B>QbcP8|ZCJX"w(IKҢSѹx&?qR(*L)GI91=;,͵NI_BZ)Ar auN J$H`3"$Y +9] w8e}qpl_FGHą"ZylbF%(1Ȃi/z215DL&2 Ti*9"p" BիfTZ W՗ܧI/h82+ʉGOxM:AoNUPzA潗`(͎ECrՊKzi0r~ AK> (dJDHG"8G{'!1AQa0q @?r7ۣ!KWT,I R xD"U=Ux+yc|Dbr)$*TDzq<`!"B6Q)Ը#~+Pvu@%0rd鑴Ӯ9(g@%YQҌ d) -^ P5Щ&3a ^d I#*/C FV28Hձv?N2t ݝ|RB$rP, rdNJл%x ZRu#!VT Q 3 lE<]=P;zz0_!eCSP:6ވSX>&@W`(T ԴHԁ5YXDD`4bT>iŁ]9_tCylM q(60œą[Z $a8f!D0߇bU̘ HiJs⼎MTU"=Sj:(a(=  dͺ3bIUt؀.;5WLӤNr($_* ʨZS"*rsXW۟+7*63p7Wvgʚ' P2[>H !x7H1Y3,sal[p82!1pT$׬3=/x}RG\hu .Bdd"+F\reF `/0}=cKt;'sޢwL:_`oW߉ɳ[WrbwrDCHĦKHdD#7F?*k2JP=UE4/>4`o@ mT|b{Tp36`dD2S2c0mx-@!aDƸՇQTcAԓXL+ S1r\hFq,yx}Rj݊!!I AU:&I= @4r]  x4'Uq4HMYϙ\"E!x.Qtp璚:}:G =||2yfڬLs;rNm\1 <ҠA`2w]u6ö c<(B8Fa}WfxZ2 ]0S4[g6U,) /_% [w-$Pejd q@)R"TQ:&HX3eP9I 9DC剃Zb)1IDA4!d%w"Pq2Q$IlY_Vv xI1e (b8bXpB`?m.̵A =9 :D=V;Ru z1I`xlklzW+g3k DU+jvcL&9XnIeoO-EjkXSf zRR`ÐN]yq&{u|HO< *:ȏ ()!1AQa@q 0?CagFζDauZډ4 e"TN=C &0 tsϱ eP9wQWx(ZYN,IlJ^1 :.SYxɚB$' @?/5?`qRE$&DՆ'HcbyMqF=PA ܫXB2;/I5gEh5KL*Q `ģCI7A@W23_$dѧ|bQQXtӡY?2L3)yv^z2E(9&U }ˠEPUQ"g/frgKg2fWk6cY°a<Ci3(/pF!hP3c ?(V"w8!_4PKD~FIl B1, I 'dyXU I#EB :%D(đҪ{ '#WizIBuCSv8z)1M͓ 4)Ľr}@"6̕5k-}(;@'揨#@ @!#fEE,7HAS+!ֽCǪŀ+TX%PYD -Q*ck"`$p @RKH"ÒA(# 4*6_]0QLUЮpBYf"1pu-qN:UQnA;LQx. W8[L{_NxSmjǿO7\^l8P/Ż`%}]tDGajB-wЀhԈ=%`HV] C5e$A5r{ןt!;;Z$LnB( \" U,.( (2OU$r꤫'=q_P"#u]@jÄ}(X㽅n@Pv{΀z9{@RcxX{BcTFyaXE!'KLHv;oء3Liغ(EzXX<@){Q 1'}@s_(AQŒ9dd< x{v( F cG)0QR8^Sg5hJ@:DmـQ?n'R1wi[ .-X\kok|-Į.1ZX&hQnن0:EVb|gt!ؙ/|6KY =2g1@ C(zb;>RODRT\̷ 4XBP;"#ཅ&G89% <`BK)yq%8u x},I@:%@vP1`{ , EzC} `#*>nN"@.WK+oHU&n|bI: @ ` VRa3^#YUWZ@ITdUYPx@d5(rrR'`唀P :LPHs=d S9^M\CHՒc~6Yx)-&t=.A<$"=tQ)U|p -IWU!З3:7]]A*bMuZ)Їb;מ;L- ?D%p :Yg$Hk gR 2@c(n3óE^f0@U/$ HI!U (7UY1l.=I8(,/}8*4 @/~,a\!أށ+*}d;DEb&ߠ҉YGv4 v{AV{ol:J7c訏LhNR({>T~rU%Bj/=աTY4l3\1Q'Nآ@:/;ႚ"RF2J(@{WGaPF 9~,F tz'gנYҊ_%!`:USJ^]UY( (zF4E@;7 JR,G5˽[|FH(Í@rKx*y;@}0w8Z` uNp^ > <7`r`u`2̦f$lUB^l(npngYĥ  qXHz41T|@$GWU BQkyC=w#fFötw<4PÂpv` OP($$F,y@`0XKh 㼀{Q-\:8"0T Pjuq.UY ?!Gb=8W W9ډC"cMljMDvJ~̷uJB85 )6x`6 w D+y+ -P WHň8\Z 6} <}bqI#r!ф2g u@QA}j;A`AN' h_c1RSוf7]E 7;K41diK6OF€Urb#z*(-!5*'Kۯ:3|^WgbZ  dՖ ,18^D<(JQMlމCdw`Y.6Qj*N`}D/qE$JkUhxR]J(W:ܵ::YឈˤN- ʕ+]r(H3  x:\v%^D4KU\F׀ *o'7\Ƽ,6#}J KY.n 釠T;P_;kSF(-ϥ|i")Żk р+W-ۺo ^ΒHҵ+ON-6,kn\"8Z >;#'>%Gȟ C@0/؃"LjQZ7A)ҵ\*䰠Xڬ>!Fce9h ` 5_<˄*@|@y9)DCN3-ZB!^˘`j9?w[b،\gEEm_L-sD{q+ < Hv3v|b&#-U1,oUV-qpe\Im;v)E &B1xOHO vS%gUM*QpR`O- 蘘fM9+-Ptp&.态 A= 90UWAf< zp0Edg%Y#PZRB@&QPp>DVBp>+6"Y={6ԟ6NBEyD ҕ>YvZ@u[p= ? 1HI,l::b<"=rm!˼Cy7 ۠ K‘x%QuG(aR/ ':%UO;kzɰRP@"@y }7A@ʼni;^sn}߄9}#LytDwBi-V(ѓtU[r|,*Å)~J ʈvԅ  ]t F"N'/dAc£I(aTA9 HDMV`n kySFz@de{@TPU [(@ wA*+egQD7p&*3qD/Kܸ'_/"'b;ABS( 54UM'XR?blMF`TDZ%n*T04!t x?eI$r8TF%$){||@h"($60a>U*/}=L*V=ȏ33p"HQ h6aeu!|#`e:%#ȝݺPMD6!M 4 bl ZgƊw"RDJKVK!dR+BbTRTcFY`1uBCNt#Xހ7/N,S>vNQ31:}`7G G{^e8:t,ytvѪdr  vB*WW:2:J s8ap"US6Sؘ<-ܞۍeiNֿ@1U!D7SXjFLcH6DڏT}_ `4ߋl!\^~yм<<8It9',*DUƋ_&Ћ^CKQ./TOg:%:o%0@s ;Zjɉ$<\T$ ([CF{_/ k璾U c= C˞A 8OtO4HLNWhj:j܍"ni<̀Aؑrd yaŊ*gxD,tDc{TS)S,ga*{0h'PeCz~XS{Ўf, T2kfT Q@('}'v'G1,lH,eNu,cMG fO@C)˱UVRkh2^`bkj'pzy`9|FT*8P;V=ty,PNkl$oem2a`|!p @ZBƎ,>4s,Yk lΗN[_=j9I* ۯ;lT> 4 D+!a(Y =$I~!U} RPb$yz1J [PaicF*3QQT?Js>7!$1ԫrd+ U zG@Zƺa~(C}`%f->~RR|O.hM[\v+I桇q~R>jW45cDI|>y15`=X]>+hh e؍:&5I08׌#99p7{Qp*C'z8>Šۜ`:z @ N\"ԪUq 15* l*tEU@5@^ 1 rÒ1WFBDP&`H/)|0\TΖIyR+).mhkS2fF [*B%v |(OU5OC wCJ,PMR 0@1jZ']r #.D: P+oy{x?UKx|gD9T>yUdNV˄o\؏ 8DGDSc0(Q*8 <2i@ r"3lzޓp59 @ R\ P4Rx;%[ NHb)pII7 )>zaVʏnc哵̢*+{p˼{_?p"G * TϖֆTf N/x5W~H_ 22H&zaέi8nTB=EXoo,j,"ÅaUZMXTOݒÛq!m6 B_F(/cAT } ؕq_ME;FX|@[Jx50 UnJJi%@ ¾ZB%H4RB^O6 peI pii٪Ty#v47Td׼umayavi-4.5.0/docs/source/mayavi/vector_field_flow.jpg0000644000076500000240000013103112747716313023340 0ustar prabhustaff00000000000000JFIFC     C  ?]"  cB ޣ/)& p5%Y6?A8cd?1kOnyy|UMXV5[mxAY\mN8j<'XÞo*k՛靹~?Íj6T+'Я By+`WJjan}7F˵rSrվ7zre+e{J_?+˴L+yҺ[cm +.t R1ebc3fjy-qqci>III4.+|6dmE+`W L%MEޣXk:TlLEe%jX X 9o@^Fyʁ3_̬ lZذE3d ` ` j2057 @#$%&"1'61`.Iqe(Hvf*iZgҲ[^}Iۍ\ȃu TGqasy;QZ @汤e}%s >wePdI Za*|EȐZe#DfجMfu[&F! ?"THW<~vpWiWfovmtEYfG&n$5ri !ȩfVuzfm1 A*\XLeV$g6^w< TBJ1pn}Ǟm7/9*Sqb95Ǎ!Gqy)$|,0fjkBߗ"/RS޺msOac M+εHdxxm3 Jش*tQ,u ♯LJJ{c!6\O/x6)N'[_THq 1ҼSY"S1H&`]#TX^GI/jSDZS&mU-~$d Q:8:J1ƝixlR63;HJjh8)yN^u, :)Hzخ9Lj`Un2zpe_2n˝?/=Lq]\_*yi󻗘J7;Ch3xZwo˓(`4:l#0f>` :tu:nL1EðO$ 3 TNg? zj4Np͒ht=B))8@Z϶ݯZ(魅bzKv+ M޲4XDSkUTe1=<mOYpIC d5sǗ*z3jRF6߁JOgaĐ)Y ACEU[_(C fcRpKlp0߾@ I'LVV.?ZWJOgq9J[LXk{/4-A% JB,bL6TL"bVыo2AkR›JUb1c'9XJOg6 B1NvFGSXfTj FN"exTZe}b2 d )>JߕM~7}Z,eŠZiNA@v۴D[6;t`mwk;wC8(f MWȓLcx4:}SXy2)Rk6'Lؼ%}daGc `u|% 'VETu پ糵SZtݢtfNdeG}H[HxT:xk'eyF\wٵft 5Du\uWze@e%seZl[Օw`"C%"[lGa^u,%}k.PN+3A'u?a$l=`#CaA-ͱg)v܉ KM)j֖ JOg%Y/7ca<5 a;>_콠v;coGfLĝ _;RSYV5BR6!> 2b}cʌӟaklg Ӝ9T\B.c 2Pv9qRSYjZ$EPoso,#}=ǵȻ9NڛҲnZQzLW8״'ΆO|Dԯ:xZc jWZjrj%_,a&9چr Xqi?+1 }aЅ8Lx:xZnvXl:S>Ȭfug}͇> :xZ΍O6UXXp3Fh,ue dI3Ρ2\a4TI%~+εkGÍ0SYѽړT$f4E{Tl[^/wj&ONgteBV$oj6O d'5>,P :+bxf /ț+t_AS6ؙ6qƋqV~ m8k66[̷Bu.ƦD-Afѭcŷ7gc2$rS1fe# G]+ΧdQ,G}$v`}΋jcQ}mE؋6Mv8}WVͩ\; ey8mfO`Br9YLM\ȪD9eFhy Z)Zv^us^E4hq$f!&W֕iu?q"s/>> $PW[[rM|1T;̕1Q@=jjkڷNcu-BM0/UΏ2+0p, OJ|Y4W`mn}Im bbL jK2'3mO} ݕKB$35$ ȑ#b$ǀ&AOaS =JJtș"^wR1LDHdc[\cҼSYSbpUF0:IJg;=<iaRP:0qheV!tv*XJ'f(cg9iP|J"&ȤIѣjHv%w:f8txfUȉͮSVB..%l< &;fQ\xaJOd;"lkRV$Krdej-vx7򸫸,͊n5IxYU)%)By(]q6Dl?7@H83 #jfkIu,c9YkˌJw=I[8e@ъL@ QI:XEpV,Υsyt[2X@\m#$93SYŭ bTT)C,xؗT_%0f(cQNgS,‘2Rbó8H$:pXrU~IYW~pM<|'ZbD eA`t:pp9qՂKl9e@-upM}G %n..g+q|M fC˚ڡztH_60spN8XɟڊOJzp!(V6>$ԿMu5§#av 'S ֵ1iDq#5tÈ#Ld))P /\=Ab}v֮,!|lr\7Wi trH)[DX "-,q"9Q v"O?0H9~ rŏCe UyJfK/JW\oi܅&Ցaa9f\Y8}ǫ3a(11 m Vwof:Pu]AQdd 쿊K ,{PU1ʣjDU O% %zWԪUO=Fg;pϧdrRc}dHqSYK2 ~\l/Rdv4vfəM 74@u&]g(F J nع؉Ju4D`iL !1"AQa2qBR #03@br$sSc4CT?ԕ]Ϥ^bY2% 3STh %|9ݰ~ />᪩AꆥK+Zp;#2/)n^B(.YΦrzmYr2?HRZC2SV삽`ҫӞ{a*r G[ŻNǐ%fJטCکaꖿe3At"=p[.6_mxi\V}#&T >Q7n+ښI9F! |!Nr ѕN`u.:ʑ.>UX0+m(!RPx?M1Jo{:ae_p-;iՕzFTUZv z.ni&ހL-ՠUo-N;GlZ|oI\2Zr5T>k&RMf*+bvj)^Z9 zrYd EJR N(EiZT9v ;MՖ.:sxr|_ |YB] '2uqd8࢔G wLְis !7P|&JK΁T"(zv~DMRjB2Q$o*⫨)d*鼓SMCLB5/c+r8(oa!j@P>R{P"-4z̬(vG6 ir:K2NJs'B;fJ樎-!a%of_ qs[aA ,9 :š8+wţ}ota\b JTNvG:-KhkwM-H۴*E~>08gr`:tV*g(Jb)TB+u=d,[rϷt0#jNC=:ĥjkӇ QfM1.?M0 +4'4be^8c0ښvejS jdx  /mqI >mJ+}M-GE=:cNL%vgTCwFZV}!k֝|ʑha CQv]|?jqBz"2ĽI2 6M)C4:G~kӴVt0ѭ∘rbBZ} iM@%{}!O4m+6N+>L0gU$#rS@BWtk>@UXNꋣq>hXie !ZB` @z֌ w~ܼ ׷&9 00e]ٌ,&UcYkԓӒZHO GV,^H78IZm$ʾa|* c˶<) HmO”9;{%^ؚ L "{8u0TCS-;Vjƶ*A+9;AښL{͸GHʸDӲE_mr#bfzd}Anq#ӨZ~q4B_oąTGWhxq?h~S0y'~ccG|OX-*e[_xCvm*Yk>ː<7! HX_%98HJ&})60H5A\MuRX!#K>"^tMKS 5{p[1HXZdxP:U.-i6a\d]9([GBOBU"ө(4 \rOu95$R8I .߻tT|^-! k%]%::"jM>ldt4aOnNQTxXERa21 <.2vlebGLZ?CU|҃ V\$Tj8uZu Ppȁ+@A 8'r?'yJ?,IPVⅢ\gjU:*` Bd,\ݮ8D<\g-_՜ uUNI%6ddDU05eGJkluG~mq`%)$YLTd ^↶(Yf.96(NkRJ%j5,|Pn@*l@%,x V- 5H*`OT9^34?,eIB1}]_l+ONxR9.=MkgHv$FPȂn JFCԄ),Gb|҂;~*R4JȇrPiL+r+-hZ]mKFZ ҬhU*6zi<#*sQQOXMSHяL&@Yq|ĥu29ZȨZMg g1ԩΑ&\4 J鵃] D}3 W5ܒ|TG}tc!\&P{fLWL4jS2;4(0ηq5~rTb12_x$}+XnQ@.nZO$; M>_W[њ i =t/Y. uͣknU*H:5q#rv*RgEֵ\䰙öACmZĈF%y68#xIBm!q7ƕLp`;%Ky}TlQaxGo#He.>pjZq< 7(h"lsF`BVD;y ǭ9)Gc^u|3"R0pmA5e7y'珀|F%ܶu}5TwlOCR ;wHo)yg7QVVm%JTg>)4dd?*r2_z LUVO/FQ-8{%l$/q&C|jz qWN-x6o ed 4qzn}β&Hبa0;*b1H2RH Eb J[|'i>!١^@(8]& IHSĠ4ZYr5D%T>t#\GVb"[ #<7Hj,V=$pH`OVc2ؽQbZ2R i-M X,@BF\*jJR[H)LJqHWP:V>Yn Jfo+ l D7Btl-X̸ԩ'Ẍeڕ!ƷPB^f@'. hoQ놝8̒5v̤w Ty׫dOtlgضOþ5Qi`ďeWW_D;q]T}u3Ikm(],fթZRwo~Xg!7"bm'!.h9(n;hPpb.K B \a0"q,&SJN$3\-꿿.u*lE7;\@F%m蒙XerehHG]Ĵ Y8RBn&l%NYlVBiZ5W GdF`Ӱ qL鑣΢ (W )ՇqRJCM7ҰEi 2%ԑdw`T!E2Zs4bQc RSp I!:5Y 5fk-j%*#Y\:PVQa2N&e% jP{jcYM̧q&fSkH‡ a@KQ֍vC+9&sLP:T6񣎭0]}+/7iHd{(@hI՘? YUCǨ>>8H6APIJ(iY>q6ŵ%~>j'.޹&^3ewR6 uZ4"x2!~R&[tܒT}TgwF7lՌXl**p-W$;+'iȈg$gs*"SJ]W!, ʭq5x&9Pj4aÂN}4̯ʠW4qJPoH$&Tk胐v!'DwHn^կ >++c[b->4iD OcG" Teg-hݟiZ]KQ mSTs>rj+ 0Iq+dm\&6JWz LI?TRR1ŕ{)3SGalh߇hz*.!N]êq2&/3GoP:H d&euAgһJ̇Y)FTdƥ* މPY2CԎ[^.Gi_(XG@,܍xu$j\<'Fu#b׊n;T[ ]QjKqg]EծOSlC ymdI`<}jSPpTDƲqL‘Ȕ=dG%^4g:R\"KP0t+*&\P\cxGWL0Oqe$y˯mh8*_'*5.a)VjJDѷR`=sK$$ hC)P4wb#7=YV"YB)GWPnQ)NJvm_R . c^Sk!稹h+?ψp72d1> <~@Dэh@Zw1FmbIH_  !1A"2Qaq#BRbv$03Sr %@Cc4s&57DTt6EFu?oq(J˶%8z biGŜ KV;qAJC6m{O_3J=@4"ӏ腒VP޵M.;P&Wq$)?.rze غqV 5.vθYСǔ|J ujޢNs9[L$Af]yQ=,"*RS=KlhXJ̈́,%v\oEdL[iI>M;=rd,g<חMއR*F*h>9ʷꍃoU,FNiS¾4fW;Pq9WԄJP4nefdrbubPxsJ9b+Y84fssmZ)5,U*|ЖpSmPy7&GF8(1eA J]7$mQ Zny9To6e63cK3,y4zKve>Mtlh<`RJKJGFk ҧ2U%!ΠyO3 )×iᬫ:sF쩵!v)J#QuՄ"R#G8qA4Q7!@ߺN.(}NVmFFwO')6y;7fֶ]e .356nGu\T`MԬV8*?89BfZer¥[=Yx~n&lq#y˲%F{Rīv9d'KԚv4OkP wAfɄ햦/ɕmh8vL֦RHCyԠpevFKvrzFXSTa27PTc_R!ԞO{ePʥ+Gp7?PI}ת?(bi*bρp~O )$mv]VS7Ot ]E&SjQ6hpij/pfV";e^k)+! M<2_@B T4HhfVL%[.nie09G钲f)wI m_8MΫ$6x4r ƂR|GWj#x$7[;a#Up>E>ρp~OʭPisj6Kݐa l6N`6mb܃BU0ZV.9Rc$f&v/s&7JT%[{IUE2ڍ:7 z@-AbA H#%[lƹJ5iģjsHQa743:u{ڣTO)HuR.U~ z{S3SH=o ΰj|a9M!|dW4Ut(KiP(5>{;at6cԡ}BHOsLR6Ni$x9Cq({['E?MoJ=2 QwD.Aʠ|V 0O ѥ6ԤDJkY|(}NV0כ@]v%LnNd( 3+O+j3{ʚ%/{M{0 !͔Enk>^p(ӟy>'FeΏ^4̤XZjۚ|IJuӮiX9X^o?0lJHΠ##vɳ9hqڅs+YMnJ/{*ێ[꿮4y8F+*VR)P#~T.RJAVW4nvMc yzfY]D6W7\'ژVR~ mwj|7{/WNhn"c_t/M#M)6e`"0wleZU*;\̤hvp /r4w"eUttLҘʅ)U}$?(PZb]N[FkT~ֳdpZ'pgeD[qz$&|]WhLĻZ. cnUm u[.`:3: y>+k?G%~ yO22 Jo8Gg-<޶&ARd<iq׻,T< 4+Xzt>jji3<ȾDVJUIT(/a/Ną6϶S#\e=i]S ƴTǴ(CYڸzBbZ=^uVRAJ@⻬7;+i:WU'6O8\'gμh N0"!B^y#i ϲ<')OKKU*ew$ JlMUYt8K*Ol[)11S,*`A5v"B ;IROo4&iWS$jla6֣0ʕ˻G}&46r)zذ,Qa7K|vttKءxR㧄arP2/Xe0Zr(vd%ʅ]ƕ-@̡ΘKzeR>ڥex biҴX-:f֒PW9 =o7&sWJۃN=hxSqOڏ3wQ}eVSÆgXzN5ZiL-QIC.|(2U R?Ɇ̭Vqɶ̜պЪKi ,30W:;Em HʫF{7m1OKh5#UI V]!UV+3.ߓ.w1V&5ҝk0_bv7j}o9egO8c y'';T*j?&Fa]fG'"RԽX:Oe;1 W0o-+8TeT%|+&)X*~Q HO[<'ʣ޳/+੄R>r7 y[}!8!)˨U-6_`E)7Bmr)eL- [wyGۅZjz ,XT­\;<껪XiYmC=J2ӤUmWƑ{Q ,7"<S5#C|cf:ңHФO:t=6wAʪRx;)H*) Pq}Y Oi*@lHwd1W;m*֗XNm(o7$ύm~hxx5̞հ%rIR{9?G/T m>oRk9 W0 5FaVVQE״R6r`afSȟLQa7gB/k?D9\wdOF(݉%C2FlVYF86'$nZC-mۣ񱬩mL FŮS5M5?/@Ԇ=L)=ݎ)ޤejaܼLƦ!B/5y?x_?w8c y'+m'(Rej,_B]x!yg8l%hrlf֒[>T ,ʝ}"!Q&Dfi:$(J9*G{ MWLs֯TZZ}ǂ/N}1kBaF]2ER\^CnQ[6҆ur$mfne\%|}кCMY֋n0SRH*݊jɜ/;Z~\ݔFeŐJYw2j <S5#T.?&'a,K1CpU8ѹ~?+D%nwn vzRڒu:V'ĬYB~HW\_;bUBظ r.?~bC)8Lw=i'eNd̠bzⵅ&msPMRme% *ϰ*Ja\RT5NJsRUa:-7)aL]3HP̵gٮ?0rg2_͡_xUVNv$:bC@HFkm'qx|Qa7ߓD"r^i2gBDyɗM)[{ZH(&WRgxm:SRE7">ZՔ?VsJOw#Ka|.?EcN;Zv]e CKDzuĮSEaBr@Ϡ\4 \FK߽.|'+2Z22jۥx]Jl9(}NV0כ@^o;TCI{8|8 (7loTʸ_cv.V@667)04&{eq:,ӚVRL\T[-/ '+Iza'6f冲%kHI"TIZTs >̗uJ ,8ynމDDn<ú~{QKi.^wci6YH*uC9L$\v4 m9oȑ(}NV0כ@^o;SkL-ĦK/lSQ%$ʅ ^zRGTQi/НC%\W)(95!EW$c^n˨:ֿs$hV̪@i9cYU1\~~s@}-–8+ue*$^qGrߓ|~O]ϺTl!#C P*2Vѯ*NDnrUж@[kN$?BSWLc[1SV>R^@!/(_Ӊ:6Jӱ6i&'iifI;8;y+kS3HdÌH:TYōpc|- kqvUuE[c!*Rmu`N%*Ȱ37pVEH²x Sd s.28!&!.@TYj`؋щq=:f2u{4ěumxqxY"SݳZ4)H:4Q} fum備IW^y2_$ў)OȒ%*[װ֔#7]nO|8˩nEj&NeL>Yb1GrJol4z%?dVePyki^L2YҟFb^Ewphhߓvۣ2{|TQC8e uG(D8,͵WԹ5h^ױĭ;Aٮ??uKΎa:+R,@Z4N٨|ְa խkPړbWM &[V 733h9 ?pO']SYӭS+7^e CBm 2A!愛q68JPDw}2U%f- ~6~Oڹ1d|d39?*b> pR!nhyGT+e-om aVSePh[Vmb~ĵanU͗T˷UeZzaFryO sVPaa*2GMvT)2ΈCL:O=z"0JXMͽ0Eɝ:ҧZS7~YX>2~2[GtKfSHhӦrNTtK6sA{G'T:Mr[Scv\_U@D_&_(G+GJ7,ad6OCd،Q`ɚ: bY{` l^f[g"d1|eģN/d=?j\Kt(ki|P%CX:3\o{Sўgwz+>^o"6QEE-}+U1˺ѻN${yaTe6xQM.!%\ ?ao*=q)JԞQ TM vڗ SHL=2Nr_},S52S̡Dg)#nfZufqGʸzeq|H V;dZ]l9QHayWBfB3LhR',-MKK*(rn] 486O\~ vY}ߎ[(e*$&FMQڳGľIS896}Mw(ה,ubni?W9Rm~*%p~OzZD[q%2Y'e{GQ0s#1JH~6$fdnwFM𱿔v1Nh\>#rZ:+8h'GU1$s KNه]&Û0''d#8(v5Nl˵J[#BtƂ(vE-|Q,;]OgL8wK0pA?)c0SJ \&Js7.G:aO9(ΈK;:rEj=&\ṁ ZQςѺ)?5Q _N-(k_I9"ʉKB?tz0s30 IԎ\2B$)- 2MմpI_Rt,<%7nI)}1X婭b8c y'0ѳ:Iu#:Ѽڲ>RpxC KI_Mo~n{̌ɺAސwr@cQ(=̱j]J^yjLB8G,6Rc, ƣk?Gh&>-> \hЭ"F^fFƅ65 SU8k^ Ϋ"EMpSCa"gmO`Ss0򎼣i0U=[1zv;ΧrZsM~`[Tԉgzf!rGnhc(͗#~ARFB&.9ޱjs7mLGz,~9f.G"8t&UA>єAFgIj-ToUhԟɰfeZ~ _A||T{cZjiCwuR;g&y_o1GrߓvԤ"dqxCqL-48j=\䳭! d8W|ݯ#AUvXVu7I4R Uf*k}wzS;܎_a=U{Pe MXh˲2%gzYm?v?0ˍd(Z2lC4w7zYeFYNǕ蟕oӣqqua#w% b) q; L) }5TXCȮb6h 'ɷBjl!(ayI5<ΟDy{zUJXחJ=D+.bHJW%i]L{o-*!'F=ȋԵ TLZ3OIL(oڇ/ܬ'ēYGc{nMD+suV?'RS$0tݹt|Zvf̙יZ^469Xԓ-0(NK8_K(z=fӂo\2 б[rK3'*[I1#^?SU6Ru5#WblVʇ`A']ƽևe(%h.j۔)#_΍3ΞүE*;Ֆv *b|L21KJJ}Qi*f\} Q ʭ}Fe/DW{k~xELw;#dѲlL Kg&Eܾ2Q% 'Eyk錍 $sv?˨i+rs&/ ͹AKOʯT{ NhI|Dfn½qTrLZ^]K(o'!3ws O-Grg `L^ydܛجvc"M.5].ۃ{ɱoѱB2U}Lғ baX :geeMjdղ/+UC#JCHE]e#>ÊrqJ_:1-*Y\6-7OF^Кv7mJ+WJ ;MRsN"+0U8y.߾u>'Gh*fp;Gggo3͓P# 5s@яLjGEM &?H09O) 7$W)&A8.ȾՊoh͞Ylk#*tq.ӭtiHtEYv)iT!Gky>+\)qR-7 q.7"xY,?P+Q@Kθ|fPPgWZ;GrU2'RjhP&nr[-["fY'Pk*H^WA5#tNMi#:P!)g KIK ޡQaW댒؅nLK'6 UJ&]H䳎u|zs-mbqSROwL(m'Dvv6=?r&T%@|'W^E;!T-Xe/Q:&/.R yZ@jQNï:oH؛ANkfqf]Ħ;UcqcC7>'Od!$H_kP wFJ(mGc}Ғ@*ǒ>~\v8zu )Dz#)n veI6:QjdiŦ21zN>Y~ SB{U(,\YH| YKiP;i*;'+;>b:в+ȋO uIhh&qqabc-r`wuZd'SPǬ1zV>wwMQR G \J$~c*!1AQaq0@ P?!Mv/jL1:x@u8(mk^7՚aw{fDL1_!j$ZŝDlS؞ |"S{IF%aj۫}vFE^>(Hn)%Ōf(|2IxP#s(ע-Fe6  nE_6,G5FPv~z)FfMp,ostRduS_Jwɼm`Eڏ ɥ΍,"ٰѡ Xᵍށ bo_ͿK΁6q-můS"V) ]U]e ON@E| &9އRP  Xqc5V^߄f/k-#7i%YR782uMD=;^qznN/E&e3r^#F oI*]sr KAer`5[uCrj`o*?cYT+COW9x'ȁ+5a*~G3Sx-YޯJ"1a( tQ=ё//曊$1a=&^xᭅw=ޕKyߖ/LE0^ԇs52+P(Ygv%ckWǣ#"tS`oUHܳf`YBOӅQn"6}/6u!hgD4}1z+G;t^*'պpotT& `U5u7ޣ3[OUgL D֝]3/;:D-u?MJWPaJ Kԟ(dښ M1B1Qpڣ^>Z$)zՁ{3ݽI E)'C\3јC5.DuL yVG*bCh/,xzkş,Ve^*D/#[2[4 ncK9r\ٰV1D9)_bFīS={RxVAII4nF*!ԓF HQ-Ncxʚ/`$g7thWDtOCI=B˝1Rlr9%Ӿq;"2FٷR4HW 3 bPh[Ӂ/5JF3e͒]@̦w^Y%R鍡E2𹦊uHptz,#5ia5)P@  ˫ݽgYIqop<:yh轠CL E#Y(9?lN 5@& ^X[,hee4=H.±Le \z -(D q`(CTv1+Ι`f_lhP8L[4((3q %B"Il 3`d)@Zf}H6+L=9W0mJ)kd~ՔO,*TAӐw#4V7j6⣱]*nAN'{N$X1Y28π-tr(oX$Ǻ>֊s0&eė,mpPhF#ej,l Rahy'.c91nbj P`m:Q'+\Z|-`ϓaT36>*`uRj,>׏hA##W']ZJ'P`:\q4 (ĐJjFlZkCUG[)ޣ: mpt$|SUA[ޜ3 dR Ta0]iAINڒum|sQo矵SH[Vr3LZ kiNIh&uP3 Y:6Kg >+L%9kw{dtLqt10Щ+#@3?\ACJIXz ҖUB@T S5j IF_F]oNĽ}t;s9wj[ՠR}+Cl;lT@dHDwH5ggjThf6zĒ`}5t^jI*k!FUta*7S#EvOm(ҴhJj0dIl26@$ȣc?f ҸmDQhqB0ȌBP<4~@}*$JdZ,. UE\ "1W:DF&+ j)7@+E! 50*͡x&Vȑ/zLteΎ(b+xfX, RI1Qh%~j U*cƪ2)'XL2;bZ J rm~bWhÿ#|Cx{V8oA~>6"VVvlЭqBf&>J ͩĢ@m됚+dLɽ]64`Ȓ%9%uXN^-d\rINz!SH*)mATDg*!14˫|؀o?N!{Z>5h# ڦ\TN)RJrwT>8зiC}T~) #= 殆x`HJՁ ՆRk?HHY ,K01 (HӀ^ռ8 V5WL~$kbMo.,#P $S9бJlL3jt]ՙu (!uUVbfcCS(#P{HCBs0c yĔLAP`L P?Rm̉`v]p8) Ŭs~{~o"_wmPɀsdJ(),. ^ e ̽YXݫkGS8N cg#= wD$\IpPX'Sާmc5'dMQNKJ4[QE5- ehIwvu#,z2 ORҔ eĵ"l $ZQ ]gI0v#Z9.Tle$YGrmYIA+7Lً ) @PmDdu`ݤ.Q (vdsDWE\S!5i CPi"E1J#AŚF^_Ժm#-?M+ †Qϗb0ԨxiF2N3t "JOQ@ejߥ$mųP8p3NFfݵ S%!tqzL!@@(ځVZD.0@ .E @rچ dq sR!uDRBd,hZ!gй;tv?u ػvx1)]CdD94:.eD09WԐV*m7+IRDC Bw΃{A.F,1yBf'IiK E ؘvojE2\N:ڸuZ!3++/MrKBZc$PR:Fc&m\*B뚪&F*E0G n9KedTOpp&T y)>M ?ǢWEXyGF"a$C.Ǩí}OzD`|"KhnNurO'@Y7l fHX\SG;- ⇹l>T:hJ^PLV! 剗d#t3;\@陮CB% `-"lնz1nr)i3 zܴePȱËSvg4䄖W<៕k oj ̈buzS/t.` 2TR7+ ۣE]\ahuEdi<VIJW/~t1*h18J\E:RD);=Rxf O4Q9P+[ZymYT}s~Ǧ}4!TD|DǫY,Ert^d[\+,Ek8fN%Q6 \)*#3A1Ok(N&̫ c\@TN$I.Ͷ@% 2$,$bk֊ 92HHn`"oj\fky-RrD0z\@5t$#Et ,: Bx<4ݬիfP;ʞc4?$:-i;!g>+*0=)]/@{&2^~Wdc5dxlҋgDRpNM>Jڒߪ?:0zŠQ@ *a84";⿿\LKHiJhm@GS.UaZuXW@ұ=椆`dVc6֣bU˟Ą6r 0+\dp*1 S FAԉ/z &+NY \҂΀BT, - @Qd|fZzo怊9(dUN޼iEIXP6?$r-<;je~SL'z{+d8YK 5bJr7ANeK&@F a*lh4`0xc &) *^i}QYW-7zߐKe9HO#c@uhwwyWm{YS?$1}յc f,ئMLF&j݇':clBDYdۦy+aܞ,7tZc2َȐ&O$c+r¦mwR쟰~^A ҈3 2{a+ 1o-ܴńci+IQArv0VuX>p¡Ȗl`276ls4!,kE>Z 7MwZ ֣;;{d4J16ُ0 vmM>*Didn 0`I N~M6 Bᵾ> O6poQk7iWP~P-ɩ_L 4 f! UB4̏B 0 mH@ ?@>4$LGA G2XpK|)hF >^EFuM h@N|!X"1$9YJ&~f2}]H8ʐ*~kUl*9pQ[O8b@ }ED0T(!1AQaq 0@?p\_WgL[ '+p >up ~o31p r`7Sv4 TeqCTȞ#pҐFdlٟ2rƃӹS@ye/qZ(='*>88ؠ{]q `=O/@0l v,2c68(W ήg|`5ϛX~ 2bJhU@ Uv4HHO1?j+@ތ_cUZP V ,4tc4Ru?А9[sc`L6v?v,D2lT \!6E~fׂ@v);c 2"faaQƁn$14]/XBPɬN<ri)=1_ttCP Z|4R[)ð"1ީh@We1˫="*A#DMHA'KjS8boFRteVj @2AMZwbM#6&ت P7AdPO `n vHҎ09qEj<NհݏdzVUMmwv-uqM8ԕȁpwXMr0 6lEYp=lw-_M4)4)O@]-qűǏ{v+フ<-]Hm͌v<%B,mPP!'NX"xMw=tlu>KnSAĪΓ{~WCpmQu'anMl?IdvUUlFppɄ԰}Kj}{Dh0vAAQ4a 4bAF=R)1=v~M!Gq|%8J{3q%Poyy"(jO*wKȊI%!3sXkਫ`ZH,`a4UE K cYS3W"PUmG)N n5$ح atlIɓ ~h[2/םfkT>!VlZ]r$P+8.||8M nnɕF8pu \Q0#Wd  SABċCT ![cڱ"`δJUB"4"0u Uʄ]Оe$ SJm8 zlMp @HFf7<ݲf~?Q{H Ai,dsJ4] +$4:iiA65WA0GALCNIv#ꐘh0T@n8S[ꒊxqOfxhCBt/G t C &b р|INa(G>>@;F^!Cl#ѓ2]?4u@9E`:}ѷ47n^:l+*9\:tJv拜@(vnEFKN ?*=1_ѩxϱS UK Is Q(;D%ZqXrQ xA_rNJܶ c"GYk9AXUC`PёDG1 ! }!pXm Qf>m|47ۇWh2Ca}6<. HOqFWz|O;|M/nsU.OO9Zc]ɃԌ&zZlcp@@0VoH٩FܒBP fGto52Ði9K1@:K{#CrḦoıl@8 (@J}3ȧKaXtKUN[eA$M `:~^]S0ڐ9hᑗ2IKNSxsi?D .Fvl4l:?Dt:)!1AQaq 0@?bETlT'@*P(`bzN 0Sb2G]6I/ed!ř^eU(XhA(t ?/ش\x&dyu@߀1̢e0j8pkbB0 :<'qb%,t(zq=JD\  Y ޕ{Rz\gHŬ !aRa]3/_90P3,U-@qP U_|2:i庬 EE4܄^6=DA0jA1x[є*" -;6*F~9V{* cDUI[R; a p@Ϻ(~xI7v x |>Ns@B:@_@ sΥ3LC*(BBzȂ\vYHvXM?QMK(* }pCVTfj\f.C"yc @t``,0qla S<`a!(!hʄtǃX=E!$Ba$*2i[eꥰ1 EX_', v%#'dH@Neе&?8i` (BnbsgA;?TQ]Cen^3.e#qWn8`̧X) DAySEP|! tǯ܈Ύ*xJ$rS"zHX'q5iP.Ӈm*'jh|Q> \K1 =:nUvIh2"hIh1 B9(fU@SV}|p.x| W1DiJC8*P!M!@Ά^V8al?zڧ[k/=U(6(Nc^;0T6=8?*Ćƾ/O$>K;Q"AD# a9hC[(`HvxUd#mpUc؛j#i[{}e@?ˇMz MڪAldP_ּbu{Pr *o Xf^N]$9C-39)𗣁?J[Ņd2ɞ8@ހ9 ЦEE<+ H* `/9мKk"xS2poUY2\S@z2 6isDp=oWuz]!o-T _/_Ekh|}dPA4*l8 Ӵ)Ԝm (2I'\K"H%n|9cՀql7Lدbi}G"Ch@9ȈS3rp 5*ICğ@{GPDĘўv%ϑsFN:sG3$2[sSY4}X'ߋЦ~55«/>LuoUOk!IM;6 82.YcŎFQ AxU_(LTNqbF $sLL#OS&&Qr/qvm ~MGxkgWn/ :EQ&9^<6$|ojH G(k$0`MpY\C;P nh4)cGSQb[tǯ?9"D0ރ hxs\ڮU*=H/,"QQyJ/$P=NjaFH% b0Y(v <!uI@j#rbU.IDR7 1 ,ҋ gt@zav$ޕp0̓:2rb BgGNWCׅC.2cbcyJUB`}2Z(0_M4PwrJ>pF JIAER@"\(H Up<`Ӑ$qUOB( `,IXfƢ ;D4(,!?XFA dhwDD`3 (A2T1a;M8 Mo^V? f}ID ŇdTPg`&t腁!r<s?b_ QU^"H < ,ĵ.wP'v4b򘚋b}+x C`#414eFUHòzg: ANYspP1 A184@2mFZNɞ3_`^P,\|*1#4B$RI=/Dp/ZWKaPBQ2_ (-Jn1DjӂL'@N^•d bnC ER Pp`/l/T@SQ;Q0'#XHۡ5ixf L0C[s-#?` K2 /?=03P%q^ ZlypGhxJILǐ.TLA\ѦBwS0U"s%^,WEKyFh #ܹ+nmAd<ʉ?`"yr{Z "!L bˍY8eEpր` Dy&G.Eefm , X+֐wrsFOb5$ HF2 ۨ̊P061"9j|e'XcD4Ds I=~;p҅(oAg6l*lT( @i.<< 1ë!ġC @ S $!>;H0+*3½db4 0C T;~?fCDQTk4i c\DCj*[ 2``j{dP:gwt/PRn;/xdB$dy6ͅn &I-X2&eF Pbd Ln<9 `Ǿ2mTpf(z41" 4:c b؝q9B; 3SL9sEjue&ǞdI#8ӇHB@hld%*"\q8B||ppZa7qP~ѩ/q?5Bf6!dY"0S]PpE< Qka4gԩ"QB #Z="mDXe DRpxy[ D-X`* sƄ.PWggP+G׀05GMpt񲜑Eɇ R(Axw[=!gZ{.2a\ܤ C!j!]ry*jd|D3l/EfDaڢpnqC!I#u;-P6" %"#z ` ,tDIn%Ag'LbbU(0P,S+= lL!},x <; -Sh C ̺)q)EE# ,ಌ1t`rBS!WKJoݞ*u$\Z4x7k3L 2?n)ΎN6a+3,@rZ LGRQW(8!a۠8\ӑ< d"ENxi7EYU$2Q旁I^a_j_V}%T8~ /?<7IʃIW|bx,Ʉb968 R )͑ZdMP5c\G lCy9 &gFV,I c0}ai[h>\KR+}Vg 3W3ECHGL_zg" kW (PS'ᢕ; 4q$DU, 2Gd((8Dʀ."IpO("Wr 3b M"'iE"e7/TbWK"K@:)M%h!*FY !ke H:o'dU2WR@4ҵϦQ10%*"-2z  !.QIځ;`[Z"u8fz3}U9"TZc㌻c$LYQ[AP^~@@},*>B@/ C5<%Q zCu"HU%1)ZK/@ʎIR,24Gb2'9w ?B d7t whpO g0s\M*2y hNaff}?2ыey Ā%45Tk"ɣۏb!(" ^P1JKr 0C6,( G&,@?b2??u1(*y Lb 21fczp4 d8:f/$H f^O`;P3hd!8ǵ8)q"Jp{LVKblu぀˺ _#:!R\ *b`R4HmqH>gz@xdGؒ ԃ0Ci wvD@"AE% `ts=[:cAF(ٚ\HxoF/]B_xJrx`=u*L,hVB>$4+8;b(p៙H6KHfp%Zt7V8 V'NPJBc]92l(30(%{rV.y>bXJgi*VC*X@Z^AB낍[% DUCNP034YPq[C48pA]*eŽL;b 5!YlGgz'B 5ʙ6(aSvk R+:``a%Cb_ Uf>ӂ88Ba88 d.& &A 7j#̱)i 8A#|5,x/ ^(UHrZ捻oRf S1T_HhKG< ]eĭ6y^P֛aʚ srbA`'3{=cE qCxҮnDyq.aDp6xkSb ْ UJ0*-.F y=9`@hR]C!iAAW!D "*A cx4`/<ҔhR-Dc+LH=[vJ8N&(h~#A0CQt"\ I tvGE9\R!T}3'Lwl~^t s05cN\u< #1&e`+@xEǠA,SW,{ӗC_}00K3DAnZ(Ł GV%' }N0he'LJu:޲!O +Uj^;)نFP kL̝%=dHF@eׄY03,IW*Q2.T xᚣ ;Lu͞a.dYorɲwƻ@ }LMǪ㐳%W# TBU_lT. $89(l*bϗ+<2oɻ_P!zqMoJK{HOjZ>ˣ L-0)MI\T[ȋ[D238=i.oi-Y\.}P#[ M] xYwJ8m?*惗9CPv @x=o`&)|&AG\ cS -t*XV+ bh;T,l8dh9Vs)~8;1 6X=]' > Dŕ;g"XapH% @3ă ::iY#+ pۏ& ߐz rAiu:&7G1Glf  t޾htcɐtp +!3y6Vr0 Ys HJ@ oQO7U8Z݈JV'(&!a)ũB# GH@4 !PC$^ԁ4 ea:aymګ Rpk/DޔKȁ! RW#)w >h} oZJZ 3 oQxvRNP' ZH $|k &L OH#BXloFJMéxB0%w8Pj8i2C@4t I-H~(0@%{\ 橱!.f9Y8War f{VЈLӨY4I! mayavi-4.5.0/docs/source/mayavi/vector_field_isosurface.jpg0000644000076500000240000010000512747716313024531 0ustar prabhustaff00000000000000JFIFC     C  ?]"  $%װf,t[5UFo! u`5'?LR/ =dB ~_4@ a f Z7Vd͜XlLrЭJA{7Bf4 x:cl^|_KHr[I: d9"N FDJ&r΀w 'RՆ }\c/eRs3e+\7>ёs6 'k:,l9(>TGHnܑx'UpKuQZ޸?u ERn68C`/T X_ͫw{#ވˑ+7+X,.4zm%e}i^h:!KjiJ[m5qoW߰#!<sMصSwՃrBcUՊ:=H` @`/`/dO}skHܒ4S/zxsSlU)g~$0%!mv 2Wccg`~__^0'{$ "rޑG|DjU{#JbTa)]*NxدGKjf(/Vj[EJw<#yn{MVnƒ8b/|lz[}_0ΝO6o3QĮD82/Q)xV*Ro"{O킿$%Xš.?^.#o$tt往yь\2{$2+KO^|ŧMS}Eq6 Uz$B:kĥ6l?k5'ԓV[,H^otBD 5鼉wi~zj̬NTȀ>_ATzJHAPZk&yK?8,@W5 KmծeRhUB#m2rSHjĂGI FJĘ%!TGM[zd / nl\#toRE^_nRɑ8[s>}os5dߦުM_J;ŎC{]<ǃٕYYb)/`)4  zEjCJZɡ)i؍qSṅU,^}s`U=\[ir}n,xC7N Vo6`W_i5-sZR[4{= b%HhU۝bS"g̏Z{;{-םh_} 9 jҟ#;7U7Ԓ ZOReQ}}@d_NCl~R YWZ.Ѫk'_j\IMbggdΗ`Ak8$>5S\p'sPoI@16uzqC%r!s*먶uZa\%n}:{X3y;i*؉NX#!DLCao$8$J\vO\AM2 nMi1Q"7",[Qhsed{G_BMg4Nj2ٲ}Rgr 2"R !0鎕r`zw`$:6u{720g x)A»sv?mH[Oøl.:CiſTŕeq8sXLmmm[yW ?ⳗ2)5qԙj<*y~jz֥%$GTuzzQ{)p'#^A\֕f-edxDc.%KTHVUp +% HZQR^4qsXUrJdWԢrqq7CO ҖϏcWixX%–AI@962GqLc0A9\*rx꿏rgxEĜvF' XB>7./^e^> ZtOCBNXNqz2B$U9}ga,p-q3.7@d\3ʙ)Olh#r"̘g_$<Ϩ$D hUukE&dK\%Zy8TCUgWH(R^$eA,*8gvBe3!v (fSK&gb$^&+li-#b,ZW@뜉[)9M=-c{+J= H@v# [e yH&CA2Fȃ8D=Cq9K 3./쭵bK`5mn &3m-OWüElZTS%RT~y=D\_CwI/c`(;n@mŽr`ċ>7(EaY;ASvΞkʗ./*,yyٽ1;\4r<]>-OW7Bs1NNFmd X4FT'ˏ9}gC{+Ҷ5{i"-gIʳ+IR-OW Ֆ-q퇳BWM1;TQ_c{+ap,ȂL͌=E_-OW2 +4|+RmU[Ǩqe/5!oqqelUX]Rl0C ׋{.U>l5;oC_Pp>CW6再Fm/?n-OuVa]糓RvU-roNǻķl>6-IZ}6n荒[mK3XXf(lHE_hd Z|UVz$= gسg+ %seaJ'鷓PUa5ZUo$ʢ:==}dRY91ko8Sv1n Zx5D /!{~S>>ʻXk1kqqW-e{UxJCuABa &(` ( C#!n[ߧ=Z*,Qh<1?s56pm*>f0icLڟ83Ћ.[NsT$ckIYW"&((Lp1&1@ L莈nA2C)q7BKar=XTs?fZV`B9Y~-r*Jɼc"ιX+A0Bab&GDt4 [l%IIfLE6Wm%8@Lf[kI?&ɖvjxn !0)'Br=+O^x%6LTkRB@.2,`?*=ôyU JLJDK)rsj]bSh{< .R&tpIw]*-Y9Y&FHc a91J51Ne4h,uCR)rbe k0 thLVVcl},Auu%>f\% 6W:k5&%*S 50?V1QHͼgV!wUQԡm+Lb dA:T" T43{H\KO9qZ01TѩZ!n bCmU^B4_5'ݾjݡkp* *jbZ>B՚(z')t:<6DVRUQm:y"KY*NDaR6: s ) s2KҠA $s8qəE'-'6rvšT,AʄuKQUhK?^(lZYⓆT~SHtuzd&9Z TxT勄V: S2D&Ztؚ/'qR~"14JCg'(Rָe܍< 8^%* $+i+)P"RH\{OXb%#Ys!i=`"0pˡ7mwa0nHpx#Q&gKy V _PEsl^-n)Zٲ=`.+PB:k8?_v%u+1ZqhT1Q Qk*4șt[5c pM^8=;mw[!WIqRt\b DR_':Z&8*/ HD*yxv(5«l[gX01VxᲩYN#2xlP;-Srp9@}ia.DsLQ1UnQtIռXWTɠ88v;:ZvNuL86x])h9M+QK#B?!*j*w'CQ$~NxX|Sxbz'LYް<bVWq!sJO@ ͯڅ)K7QA"30 =NBx1Ĵ\i{kIOobn8qoi:׿L13F\:JڼX69iPp+RYԝ]}> eNg?v=7SΥE$CSiVS`0$6lʶ^O'ߊ)k.P:I|w/}W).;sø}7f01rJ)GZ~cwCNa<̳%M4cZRdK$@6~ S0 r0! %zT0{8NA9DI,Vf"vUN#V,;W7a|wxQ*OSܥLLW]ɮᆔO-Bnj]㪲Fb’XZW9Ta~*3J-Bt[$DIIJc1L0w)tD5[3<އu' fm./xIsiFAԑʱI/Q.j4vhj߶I2!LBD#eHOV =!ȩqj:%E#Js#>Ê^'WR̥ĤMGNXbG;2mӐ 9N#P7@O8 Se8ЌAXT,C4WfwSipxyxac Oe~8 }Z0qM*Y^O1sS7Z8$焚Hͽʻ:nK,ͼѝѸAqPiz7Ӷj0eza3GGgO#Tґ| ຏS?(QswR΁׿iKak&3Ltq~ :DOh&_փؕ\ Q di i6%YRSAIlTI9y mrBڳlbUTʴrL 8{-&hHk3:Σ ˸B6`h4-M);DIN"y(ptشXClLNMMVؘ]b(rr}}pqnYv'@&'aypOpTH #$2-uDYd]6ukF\*fND~Ra8le*M."~\o{3D2R*Bv)uD++\~/YX[R#착iqvak1T65}G <bBX,򑸑1=kdzVT1.`8Jc ezZ3ɝ%IX ) › ]2h=b1fEt27s+zd)$+esoOia)}c(xnnTYl4ssW_d XTSLsGpaF$pN.bG'Uo0O'>>>OmZBᰭ Uѽ=;jn:t.el;cФ jQzzeVa\kuDami֍-Æsf vo"rӓ&bnqW.@2nvgrHt?670M%ԡlI}_y?iS@^iHPi4ldԤnGgDIU6"PmYns]KSDSLp%T/>YUN-L& O<9=,)q7VSgW_LA|m 'H=^`9H)Ϳ%$o e; [`w֣ JlxP8z\Ɣgl1~6 *7>d3Skgjr]B*2v4C&JLV%|t+X J1c];fWa,VZzyp݌B@~UEM scKSR[o>گ{ R*nz??Nʬtd}Vo\*qF0aOSHl"G bz=dX|Ua~I1$͌ӈhoWjh䊋/m{;D ’bȔA_'̝dKI@ }0Om@b1; 5)޲G`WGL'$xI!<Fi~:{S!ҕjK|%+l4{Wi !ivtgF 6ނJ( Q򏰥9xB))S\ !1 "#2AQaq0BRrtv%3bs$5@CScuT&46dUe? Dܳ k G,jhjhBOrL& A+)^ d50ҁm0/K@vEf^.D䊏F,βV~5Η 2\EI_zT)1FxE" UCY) edn;˗!~Q@-Ƃ$ӆ ˜0cLaDo8:'~|six!?Gn3gȪf&jlfS L>PGJɣL;Ub dI(o9(pڏ2NP'')C@Y@O7<͔PQ'.p"HrHpU@YSFy1Xb"Ɏw ͲdݪFZ8^Z TN`&xCpsZ(wi90}'&邼|Svᷟ鎔7`TS Ѫ2EkʑRNʀtS8-$Sr;D5 R31E)(pSYg:Tb, A2p;Yذsy ^Ⱥ1JX7ԃL tȥfH5S2Rano#1gk&KlZpڍ*Eg Xk͹ 5UjJu Rq[cS 1cNC1cg'B5k(a]:p5~F_X".!T vʵSnlUk99C F&S2uP"rP\7’wM}1ХaW1cG_1c19)v$R . 4a仚 W,G%/-܃~}Y3YU Cu!8 S܏ mIĉq b>S.BHčb+rR&'۴T̔3c $9j KTHAFo"*`R$iY~g ejY6nbard۲5@ [Gncڤ:"9JV1sV4(Q)V7qA$ aML UJ5rc;2gؙ,v$^x)Q{7!"XY6X^F @NlT@3c`gR `Tڨ[Vc~W1\6F1y,K-ke%\B"]$ ˓N| sdl&eLh({8A eY[{u( k%rܜF ǚ I(L,ep_}ۂQ mj,(c^T q\6M<"B}ñ`0Yb׾(*aM|Ht~ccc1c1cEBxu8J]IGڲ^ÞM8(T0֋>w:Vy+bBk۔%b*'JQѮC HG>5X<&?|#/ "E 7Bu4??3TCn@!6ryNyħBa6C䬥PR;^{/A%i@Ȳ^ÞM-DaV h61 4!SB* HrQjQu ,d)`NQhf 璮q@_Ƅ^b`#÷Vy@sש2&A )-8Htaޣc($[RÞ(+Gf;yhVo]TC;.1C^ɵtc(2xyݲ'!D,8BEq.gY~g a^Ɂ;G+\25Dn>:Eclbʕ/7Ơ}0 ~wK,l|h ەĻF0qV(QFH`dO%S'm({8oz;E#'Dۚ Lc0.0"F:͟opcVM lB.1Ls! oWbƨlqޞەP'pv݆wh`\'d5 MxFtaFa QhpWS{ހ' o72!ܩPp]۲^ÞN(PPǴVa*Y–ѩhdȿr{h +8xHW-.~8]E4hb5 \m%t00ߘ#Ho!B 鍭k5@pдsŕM?)C$tOlxpr^ÞM0TXƯaQRɲ406]LڭRf8C +a3.J@[U]WPh]xԭU8ԛFFaM0 1ac= ńӝ0ĊTOP'phlc8Ra|?LL#cS8<4pEQ8`q;aG0 [Î-1Xt-#uWAOP'phP`wWH:i+ PF6QlUPh"F#/PPH`Ϳ~h [ꎡ݄d+r96i:Fi^ÞH |ROY .K킕ЧpR#1e8lA>1"^XD0Tse3P 3V"sV{"j0Y95G5n?=U=*? ?,Z6O$ ^Q7MP4(RPkq"$ B]1!۠A:\,CH3w·wnu04{2PD pTrW]~HSwq0 NQ+ Iai3 ~D5瀪z@0W,L1hCRӂjf~lc+y482:. ir^ÞM3DOnqP"#v; {xlDS/5 +b/v^tR8wEuzCo'FZL$F&`b$TGh5iCK{1 CZ;.hfrۘp* H'3Uu..nL?W0Rc0G5۔uJٺ0~”1M1s8y Ng#ض’h:+lf,UcQm/f 4~7m~sx:;ID&`r)6lbnǚ NNȨV]ȀxAXɖoQN`w!H+68cI^]&Vy@sש _eo$檍upw<v?I֛3QRhpI+WC8-K[\a)Gx@0Km LQyiLfl 70!@B ?W0R\󶽜zv?I֛ ٣ZjKxn6i\xCʒC)GhG*&,& a<x a 6Gk({8oz! A"E7(i?co9c;Z#&XIǀK%fL9Sa[T9qe~hyr u^MLvѬ-gCYmEF>dB{:xn*l#P"x0`^8@` w)k,xn4?dT? RMB: mA\  1Ź, a (޺|?({8A÷H]N %orTA@9 vІ:9Cw-a6,rZRiw(L=蒕!ϝo,P K ^27)U3SZTuS(+<$YDgfYi jlmv#g8p&JMY$4.0#0#040#05[7|if&b<Մ5N*`n?Wr%NN9b,aVaAxpc8].ek$Y 1n(h#HqYMnX͠HP-÷H=#^#si]jr DmGRjgcw43+QHT+q!ސaha0# &71"Oc_tsxHf}~MI6-|bN ijpJfPT+#"MJ7Rq5P7Te4',= nBwRo&L@oz#P'z NG;d7H`l Fg-l6IB_8#!@B!^QEP@l*Pe JWVc_XaFǷY)j;1BU9 `4 {)l*L!me{(#dM15X@7(9:H4f)Lar(ٮ࡫jUq*H gQ88q>dC ܕ0+-bJh>s$M>jb9/&hU *byDx-ʼn]nMTŸYe/ي2~rŧx"M5'e>z֍k.d (TL PtS#V6`8 BJrY7n pqH;|]H߰4H*bQk#K^(ݤz li-†.H$Z5&EA%& +F Cp`YWʉ}7"1g;3'ߪehz1il̢;"2f2qZHf3 ە7 fR@䔵 FHCp~E)!1AQaq 0@?!WQbҹBP} mn݂E*p=\K+^읃6p=XwUѱZXVSOw ȉwр ;Q2YސUV cXA Yg\~-.aw^Ͷ{GS֤ c͙)iu~giKC:R)ڜg`Fig0 kv 4~d)7ÎqxNߘ 8+mf{1SR:ZBl?ݯ3A`9t^28\V{*g|&yU3iuZ-PZAH!0Rg݋T>fo0R[@?RqN#W8 }; !@x(#Ǜ<+dm+~QM{g +򎸮nZ^XOR T.V\H2(ǚ=@efmEm]߂wM5˯B+ jh5 @/#*'Dw,"  `GlD,N >`k9^H}lKkgq\-aս,Ӕzټ8`BvafYP,Nz^6||}+{ T"eҔx'qd(Kj"гŽ1ϢE!9x/TyWR Yby"]^kڥ .wz-_%ՄtwvOא$;|'^ C ܀¹(tN/{/WtuYpK73@h'0NV/SuvQ3k+ūڐ⼝{ L흈pP(-R ԡ x4gbSdžAǛV<ђ a 'f` %46a9$6o$]tcwH54lr,iJE^=t{tI+}P:_<,}7M%f2 +ʊ:A~K=[݃X)+w#wy𓒾U)U6✊wH/@%f<&8W > WX4aLVO%9$G4+/TCKGDfH)Q@=zbtP.)!aU!9$@ǷJ!֋!*_uO+ g1iig tN*=R XC:JWF)s3jbhtl#1 tr'g<9>|/ .%Gy6۞IM W(SNsIa=ϦgVZ+/=Fg$$vf/ [/Nf^;-z'4|-ߪcbQfV9-rH q _7z'$ SG7`x3 aBNLVHBV&ɟq/!eXCN?92I]2бCn f3Ӓ:ǖxoPs))w!a@@M@'c^#FJrE;q^ <w;,-fHnɉZZKڃe3 9&)rkοhɔD``! 럃B<',ڀ<=?3ՑJYml5Φ&uO5'o*l.3,q}_`'orZ,NȶC酆+;LFY𔗐@b=- e1U\1"l=Bo87'\Xh0W~t]:m >:^0C*Ϛ³?&Ö` '$Rx<0cԇd4YxDOszay!~H~ԆNEW>+csaEi??-x=ud%|NH5,PPvΒ LAM:䆺 ()h;=aSk'H"6KJbC:)?VĚ#}ri\ϽǩT)x B9 ҥ݁(KfqJ@GF>:L1d@/З`L>w)At9Rkve9.pQv[̐mY sP-)$Pw RnDeuqy(p6<2~)JvVd(OK;:0C`μRP#1(b^&~gUk,yuNHr :Fʛ{AÇX̏> \8&Ɯ&!)TQꢾ?Iϟr\τ sn##I B_5fWg:Y:xò'$BJ7n~U&ۨ Y ^mx'O֒6Eۺ_ȿKK. ă | 6'5 (4RrWdyG̈I( YeN(j&'Oا?,iv֛ twZF=-oH$`ILe-Rϥx?|_S|rc`2>Sn*,ko-6A8Ȣ~|7':~ߖ^t~nTß9@;'^9QyA_J8/g'$f J.jǫ~%hz(ñJ{ b'Oэnvv74ɹk];uB|Ja[dzϸRcS?e9 @DX83a+S vҹ˸<@: ?I|A;lwU;5= D/{dy2kKc'ԜvAr|iNjReSZ/I[{d8`?fzq##(r?pg.|2E]4tcNHc'>"Y>LOW餢!#=\jQh'f 8~V~D䙚os,X9'_9!F%OIEHzh 9oY<јѣJ:<ߤƀq w+kˁCߞ%B)4[Kv%fWeT^P41ؗd^z ?fO>J"u_r'4؟< bJ 亳΅6i>A7W!V[*Bo@MjPpvJ1rII,Xy2TWeVQ 4sˈiB4Ŏ;C룭zmdB˺*>5ti%I~ I΃ǰ8Hvò]Z>pn~!&Za,vҼL]qr=ɾi7z] =m:|lL,9.lqv-u#lrW)}"<“hE1r=vCvNxxjBh2UT5~ʵf͟`sf(bP [CYPiQPF'zae)$9Wn%*;aV1u<LvxNŅ%2}U+8E裦Ry)ѿ"kX0WݩE/w@:Gbx>c,2$jy BEgX‚{F}*lVy $PnczʊVaHm&-r~R(uEoϚo_ÎJz? v?5M1[iӮ7>7]q/{Ni)q~DVs *6`xf06LȐIW%Q;y]e='p@ǭ&Jr/J͇7t8L y[דՁSg)XCi6(p6`ZlUlnMvC:'0bOVwwnmhSo]g}/w#β? gzSsE0{ 6kB"YJ-2ʬ3 =( +UB : 3"Y:Cc`5h v!ܐ$K0GZ(_AV/A|_J~C짡|h 6j3Y]XE;4 *!3o֐w. U^mqgu. P`r4cs㠮wT'oC;I|Ԡ.?0:wG+2-T_-wP )20J$!!T2BE QwRXuP:KDvZdzkQ/`˘/C` V@?d^/" t--a\Q&2Gd =FIwLOꠁu̻4QH$H0BJAv/҂B$;KAL.=&oSRQ$ H&Y5%b4AJ@YX֬6b$;3ܝ(ZXc *]v>zI$) hJ{G>݃O5"Y$SY@j bXzuЂz10@G@bF9R ٙ́&"#gܓ*WӠ+ VjHc̿3ApF9 Fe?³IǶT d><ܦnG W/á@DH$)`rv$q1FЈB i_/ﯻzӣ)la2շĞo}Gl9J[`CyCul8R<2v!@. vMVXPkU"vS#~nD{"cAF%9PIur&w)!1AQaq 0@?oBPTT\[u%R.*Q A{42yug-A дWC^$q4${4l%_L=f8bx~A(#u8" G0$# Jr|OG2MX036)j-GjV"K u{R_% @ x{z&Wl (՗M7ހ>4S'$Z'RJHPF'[>z+%4}ڐFU ͢"~J #rl 1]o3]Uh*A/R|*hҧT&$1Չ` U< nIL+ǕJOUMfG{<Sx* `dh H1t]ꎳ:/P,Txh[nb98:曹 -æXxzE/BJu h:଼#N|ĩpZ7v7i,cPhptcc*Sؖ_1mQ,jhA"mۑg7G k4-~@5L#8LP)2ܵ +͏<3OWWKyy#F|1X!vٯoԼў ZF2v<**$10HNۿKNfRD 4aII0.bGTQ6,KNp<}rЎgEa9}4fZ{%8? W,?j`ĥ,¥P+P{ d-# ^6v-Nypâtb8]R`9c3Q2m/ZA3[-U' (ElEd%iSF5DK"37N59O_Xu|m;~k |͖M,-aP"(]oz~dڴ7a)!1AQaq@ 0?DL(CH܂wMj%&iKG1"D@M8C'i$zӤ]@#E\r-rcݪҁM#huD0ډɊ ]54HDM#}IZ c2ƒEB<g\)UB7GcxÃfbi- κE@x@g )+EnoI*0n h ZsxHߚ8e;Sh QcQ(1'<ژR]q<*BmH!kq&&]e5a%i>2 Ԇ@`~ a91q¦jPVPȁhUFlj%]?t8@({ 8UbwZTXqDoIآ(Dii«pY[ ,>c 6(Ց`T /`(*J&qF9B…ސ2H kX~@"1O-H=hQ?HoYdnR(wzw|9,b8fK0)5~?mGvJOMr@&@ TqE%/Ҋ]H3_^N~p@.1(wa|(Uft`tˁ!߰4$Ez^5ghfY󂁦FKBW=4S0:;q֪4j`PC V2{mӜB;%=ʤ!Oq= Z78E62Ϣ%}x* +#끅.9 &#^S!W{Cg՞D<񭷇8O Rl"@^|g(GLz=0liƔpcRcw(w,8ET d>EԴz&8~-A Mf)U%D\c=@dVLΏ2\Ωݘr:1Ahr8c. 0r^V/ `rdUȆcnšت\O8; H1WX/?NJ=*d1ӄڅ5%"R̊K f]=);@Ky>ٵ:?;/$T(|N5H\n0!&W˅&9riB{;#Aa4 kb<$(w8}c|3ـg+暇yT??4w9&D"pܲ%v+OwppFV.g9`3ʀU@¦ *(LJ=" Kph䡧#Nk ۃ?N+OS`ጄ~,vXLxрL,LԮO.>TPJP - h@o%…yHur*kLJ!rJ͙튣(Xt-"y] En-3C %y Oj zpP `fyL}X#|(-ޙ.6>xčj b(ϒ!A (DE@\iJu)I7GD`HϠXnVq2+QwODh»XBR#82^!' V>׽QEE&ChFBcD?x.&];felNsDD6!DMK-( fy=T:1,Ct(5x B(71SKh/lvc已KEP3З붝4nE`j(c]|@%(qTGpN+mn' D.ItDHE=(CjM;i]k>HVvYHBDMcGk~ 3c{(DpgWCZQ?j"ڨutIL"4+9+` z`tsX hl W)[-˘9׺ ?ʷĞU:i3vNg`-$)e)im%._{FDPu8 =dÇでciq 'z$~\w<\xN i>Azbg1hisqǁIU*. dŞ'u ؓ)5KV2]hyzcEli+CmLE,#LD] DWEȀBk"w1$pkXT$? p?<,áIJSpp/gHČD{`ip/^_ɾ pxa cJ4tI c%1Oiv_:!I ^0T9 /GQ "4LjaGvRc˪cTUU;^0zȇ9ӟqMbf&gL'QуTc*v'h5@ O=- s*V2ʾhTB,f3 4(Ű!d$UOh8 )st$5$3n6n~8 O 4/5& mֳC\&U@jo 3=1Chodf+Z80Q |{p h{IS z HhD;͸h9ʟ7E7 PJNU 65RA &>j٪o' 3)"E:^E^w,)8ns?rҸD\ejuFC3J>LwNG8séovq[r>LA4"5J3vzgu@/"VWup"<(ѵoEe7YM7Uhv.Eд5sӮL&ĻPk4 _qJ-n"z0" 47nG] `D*~Γ$ rz!jP1Pv*($FzfR""@*? ;J0F_@L|#U0CIa K^H䧹 Z e:Oߟp&2eMred/X 0  62 cm=oP,LEbE=mayavi-4.5.0/docs/source/mayavi/vector_field_quiver.jpg0000644000076500000240000024400212747716313023707 0ustar prabhustaff00000000000000JFIFC     C  ?]" 3$̓32L33$G#m󮃜܏g@fdeZ{fdffI&fdffI&fdffI&fdffI%޺ONq!_2[+ 2l5c{|컌Awa8uܳkaO9+ Joo9yffI&fdf`K[s<Ś.+dz)1*ѺbYtt(fS[+ Mt7Rũ VJ {I=xz+g){ЙЕ~F 8!_cW2[ŒSWYʯ4Q& =y#=sNS~՗ ʷudIAw6ՕTKU:Nu˲Ȁ>=Q:;sͬ^xW zEΰ#W4EzTf6l{+ֽsWܟ 7CbҾkU.J G 12%z@uR^H@ǚ0o5y2J{9Pӓs+lUլ4\ y궊cU]hV7/7d^L"64fH>jгxƼM {J%WMS;8\2Illؖ˺sN`efFfk]t1^FccءۺǡVc^)co0,=EoO* ke(+,\V+dYNڒdm ,KB{/HgSs~9/ !O 5~cA"0W^0_+Z]!:f9YB5VF,N {XF0z|~{u565)gg 2U=)j Jo9"_ Ozg]#ḧ́aNKClj5J=wƊ&Q,WyP%֎ӯwm=-p8\êK Ŷ\ߧҞXu"{D/d[>фEF@˷CFp0dF!IvHWk ɉS g>6TGi4 mJWJTlrc=p~QZ0nkc"MdD*k(ot_Ͳ8$:g&P ܏=^h6ɿ@,2mzMlK<6AW4 4x[о} 3'`>򌜙_kyVUcc+xtNԍvERlGs*!=bo/cDY}ԇ$4RJ%FV []5ۤgy'iyffd0!"#$% 067&@P4g8,ٔkmomr\L#5%g3y`:\R͒ 09H6ƙ_gc: ݳ,~&gs٪Ÿ* ^K轏[Rݶ4Z<3(+_yS[ 7:Fɺŏ˽2}qM0Rb]^{9oӢN%*^<}ꆿ.qƖů\^Tdܷ2[Ϲ'͹-~aqQ3 @+'az,\)1[EWbNp*6zE@I"aB0P-۸UƢOOV`kr[!&O1cpwTKB1Q_㶅2]H5_ U-W<(ųVCzؠfFQx+i^w1SD8נּq.v'KZr8ܳc|P\XJ<-)^ehoE!bw_:W[и'f\z832Lԙk[[&"cK\~QSK?)rw W^0wJ Qtۉ~BY9 g9ZR4cfJdޗb;:P8`´̮Bqg| /Hryƿ!D֯(ɑCDw%͡nUnBw'vPF8 OaM6w!p0ѐϛґ,VC!jvXyƵ(M@so+'H#[E`$B cN_WDʳ+Kr# gOF\30$--midh)͏''s>K& &sّ:3Yj]X&f}WsrD MR M0ABxYFp us\~ܒ!:ľplF \_a@,b\[X24j㦰&798_Ǔ'~J^(AuB5 ďj >Ղ*r9V2}P5[`+@tHd< H֔Ld"Idtߓ̆R3eWwMe`vIZmU/G` 'G<)a%?Q  5I^TXM3rHc]EgP 5[ޙ*9%t SD \f 1(k#A(FzsPFP%2҄ kU}LS*DO+s1,"39 ӌ{I`6elCA:WֶkY{.kHؓ҆!ݵ)-\k؎y 6I}tpK^f&o)Ŗ.r +6zm.!k*v4je\AZCr1|lܤDĝ('\5W42caXcMo[F_IXJJ3Wiju$uLz@ Uu)?QK!9#˳m| ҭoN~?[3_^bn˼NM A]`Ij`βVEZӶaOkbvfƟtq*d]hXli2:\r*zD>xXlQTk[ ꕽմFAk Z=YPHwKF\ sͼbe BV@z>W{ns,v}dGݺAIlf[lڬKq~[lM+m4 Y+Uj*;TIPXU:3ub]2͌=m?F3_w8.Ǘa%ް\EZ-n,8?U9( XlQag+8cČ%UiUf_5ua>Pmj%gQv{%\+iUI*'W _ck,6q8:;:uIӫ4hΤj|d: zJ˧߹ɱM(#^6z žI`62F=JYKFbe9NDQZ1I&]RA\i$0A@!0cŠNS ۈ '(~R8aRٮ$+K<1qSG#7k2zgnά Z֒븧27N,Y'5ki\L&+ fgd%W8ZZB-c-:ߋ1>S!bC 80``u!YErrL+p쫞dy7 /On1ف0rU;inɏYKE3iSbtZ 0WM - |r_wأI1i]d.W& 4۩:ǠS~bdB>yIL$&i&xU>f9(l+*v]} IJ k.Kl^w,V?uߛicz, +Q%jH/`7;zoMK?\5Ql *gNLXm V2[ LxahULDB#ၱȠկ``g2~?MOHH+Hm3UTb$aFl^BkU/%~6)˂"%7IkH#1]b<.X0QmȁKR=^dH2,D$1?$& 3p8=1&9| ڪTN[!%lh|RߢűDФ5MmFsJ t-C>bw4ŕeD-Y5Q;'|'m c0hF=/nléHQ>ʹ5;D9ÂW* jz^&GY-hbuV)i}i1YYlJ)'BO[ɮOHU?J1ȣ(ɫ§mj@氰5uwae]E\1gT#HWUX>X]g:dRDcU|yH9 't %+?~9`*^ F}c`Q"*ubh6C Xӄ+ *V2تz$ (^V IzCg"1J^NPLDMx `?q(}g IW *+[;n !QA#VjY,ag@p\Rɘc/^EgmQqѧ|Z]M˞LK.%iyjX>x]d \Vfe]32JN h6$\h(T1='v,`kA m5Y2I: *ul>nW[&;&~ i%Tlŏb3m++ *gOe`&ͨqd(ȅ b^Qך8\f5X8lJ"b1 i#s9Zg<̉Tcȷ=%V">݄ud`wm)vM4>7 5yra)Y3 \ Iqj-yŲ%m~ ĊP<Ѧ@hTw^ۑ~Ku1Y7̃!kX?Vo'n !j ߓ>գZ޲WzL׆JhD^ h#Uu3,]m7Q+f2CZvRGFH8Lxd 5yV+xq LΟfl!B\meS偝s"mpq HҢS S,jG?!L hP-s~ZuT MG-K%*[KTx:xNj0戾Œ d'N*ҭV|70"7'/]W &4Lߴ%LBb$[sI<;9@HfzdpS:0lR@ũ905".Qk-x^oOfx%T ql8ut)he-Iw )v3ep̧֪Ұ95LZ;0 ۺP<2c׍@{N6/UwҬUi [3UBO|:mNJɟw,1DTY6H#la }y|7М5;$L$'dh8b a劍f@: PvVgAV?֗?gyʺ㵦U_'•20;^lOdRzm& u8(eWj~?=*?p9wdڒTɎaOӣ[QܸEwtlтu c-ԋ\5C韴4A [c-PT5B@twcI c23dE4fv @xoAW2_GONpʣތjc) ;-{Ξc oub5*3T΢5G8ъGZoC׭P1#?m78jĽ~xEhFmיzL_\v)%ざ> v4*m LUN+dT.cocUmu3a0;3?ff ƍ*u4`mPu#T0D2^tTB&S"稄%\Fm&1W!\ EOt[Spy88JtUM4A`l=8L:ݡ`j0FA҉W9jnjyjq>ڱ#0IoLʶ$G:C 7'c Iۍ_d $Zqj+^gaqyQݭ^}*A3Yzճ_t;+i%1JylfޱsB$۵i܈5c/ꔑNcod`. _VWU Thp<:/ns(~R^NseVZkei&ċB7(eiL^t0rb@ͻ5wFkx M5ibA+yӡzfz~'Q_Ċԉo;}(6 Vo-qgpN/T6Dy\ k5}EĬ@pg\itSMo@JQU: lgiůle.[#:g[ǺN)PO,\ $r2Qċ/H 75<~SR0j#fJVq *A&#R!Je:zuB=;7R GV0#d6"?G"rv藧jMԠtD/iyǝŜSW ]쾴ӊroT?1&`3ٞQ%:Ok s#MIi >|^q5 tТ;犜\ LJóT^9n5z>xVGk].$wAޏQrAU:i߼Bv(r-'W7@rLJ[im}oD2:ei144ȉE7>"mu$@p~!};^\GGhӺyM]<%Ic5' l+OF2YVxzY]Ӌ Đ6e,b9 MUe) Zv&z8Og= as~~85ʎ\'wuҽ;*I=9tT)iV14yrzq.s4T݋N>lTL7!IUCsu3=Y<':#oّhPF]DCbQZj0P$IܺΒ7]F-$nGCI'ӫ[jVӧ$SavA>+CYf$7;KR) CҨҹa7),n;r~ٯc`J?}1)8%L{8U=A>1 bY"Ea+o(reл4G.3y(wj= Hx 4O } -]fr| mX j 7FYѤ8:h ~OĕH;ZeO6 Wbp}4}zmb@۝zyDs<EFԴ :UTG(6&c#rYtֈc+'hyjTA~Vtz m H lTvf+NgiH=-iA jyʦtdZ̰63vVe鼲r߁SXk9X,罷Q,@U+eՕ4Ydk" i,oH:S@Um6PplLRndX1:L*sΣ5<3o={̮2GꁛJi@ _qaw,-Uhҩ{iM= b CT1c1NnIQ~ն/FD,O:`Nei>t1C/e<ޤu\i<٩@H:`99h^߅Z\[ AJF@`R _.+%TH) o [FDFp.*-:Xu5 fHt0/}FVWlV 5{G+yEmsOk`:N}cנQn^[EiQu[ Tl;vUE 2JY-4И܆>Cf>V"LURrMME+,VY}Im$+;m*T1il"G{OUTR R~“3Q-gq]W..]f5~Jڍ&d.wp'r$;ԘiQ˷FthTznKxB3YNqiQU3isaK1UV|ciӾm%PRyKR9k,5#{1JRahץY,ʐ;ͱekK[+4'd" ځb<46JyS!k;H)/Z=:Z=`}G̛s5+d6^N˜'mq:fh;EV/?g/jĸ$\-7]q)3gRVNN5²$,i[c o@MѩU9j>Ӹ>f/iLScx1hvrtԧP^yT J=O\RsuG1z[\ohu%qNwF,II|"7 ufrKVSgԀ -u:P7;:Z*ؕX0afd ec/lANNf*t 6ˀ(^tkwOCjZj@1|.L~P7'hM=nO1Z{V!{:LO =i~O+i<9O8xn[_b; :[r~{_xnHS Mu׏;  j4)STGHw8lOcL;G[{O63d*[?>e#UhH ~Zk{RAnPwxRQ(fsNMEKƐlNӽPR H3E&bw"nqTQƮX؞7B&~V?_(ԤntE\]R5ȿfW̞#&>}O0a)o`C|/̀5RGH"XI^ښ / ]m^ث M ;6$@]Q =pJ4j&EG4E|S]oǴ*KDE'区v:)Pݻusr<,*)؊je;I>N+eZ W=;թяG4`"j'3Ȣm,eTjG(,u7wGS1lna2UA. SpK)ߧLе5ԎPJK끚"zJ@8Yh<@-'lSJj[OSi]S ZQ?Xˊ-/@}datk<.m>*q jk^uRĀ* mnfb39 RT$*5/n Z&۬A9r멹BG7A'}8}MFm4 tL%Vu eHTaVԥFTFj49m ǜ]! K3QrݣwuCS!i$UA7c5jH~DZt$U*MY;V/W^#.ӚUnm̰JԜʜj6,j i=Yt1:qW99E<UܐiR=j8Zw'iTkl ^1Mx|T2OCMMq2v8UqLh,y$T*MFi=6gSs~ ziwxLVpÏxZ~8=<-@?hoc;صJ=V9g-8R q8L篛B^teP[e0#5B c} b.{ג`ҳ- VOtsXkl1➡WfI޹\TgPRfG'm"D o|A+Vo);m~-^pKtYtǐFf)'tK  o yEz8QkjhVl:m\0R͡NZh *mF-V'!݇PXH"XGZ<:`S}J !1"AQ2Baq#Rb3rCSc $%40@s?f)Pb㍴rp֣Pe22s|l=psW`WzF9RDܦ'iJTLoc ~F>Z J, @R[qW3Hߠm8qQDmU=p_@E}?]ZjtEDW)wQ@P|aAzaYߔG*d"׃L^ aa9ITH; BQ+ 11Fe8ESw<9_1q94|)G"ՍRwqS IB&hK>+ZjaZ W98UJ ;7VQ) m7_PTUʩ[R5sH႒Uz&,9hns$RG> pa*[cg]ϤojU$E Cxob>[M q :TqG p[ReԬ&/yo4s.վ,--)8{-޳ @4V Mx3\5k6,&f,e^@b`8^m@ mEI^E6)HޣJH<j[S̒@ f+ 2||_.c1JK7!4D XJ2<ʝIO3^9ܶ b sI"a]SPL)FQ7˺w5@O`RQ>"(p3:YiH% `'SӒ̫JG 7R=zM9mi8R?x\JT,  5& W\z!v>Dߝxd f}A}8iB:UeESF2Z 4A Nङ$⪌hi{D]@1`dɆZ$71@ye.34]EjQ"Ʊo,{=u&(NoMȱeyppn+d+B-$RaRql }ya%&š˧6䬠RaF)m>-ޥB9VQJdYu-^L[J77}Mq4Hy"R6!yyq!b_*L(Jl@q>4V0▤@C) y󌆽 YY`,do'=fr-Uv12eK !U+c2C~ERmq*Z٬\xoP'0KJT7> ( P1l{aSKBBeI*(RL â By T*pؔr,3JPAQa)Ts*"\᫹ay2#Te\ E Q2je^Y- @R)CnG#`nj)FcBVd3% $7Z2RCbH ˲4"L<8&GwR͌@jAЪyw5 fOmyyxjJUu[9'•jWB)Bv (TF39Lar2DF @m _v3i&5G)* !CuLJ&&$ \Ғÿ4 )3LUREI) ie>i)zh'X?#=mz&/0h{UAO'S.Jyc!։RF4f\5e(!qG2#'4"!K= m2:Rycg^Hj*I%)TH)mS"qӟ.,JPMZJVkRtc]S%X{@D W[RAo%N5AA7x#t=6L\\8KNҿ& 2Z~X i]D[¤*gDCq*TLZEGq HoJ`$|"{Ip曓ZTߥqɴM@ƮaTA! 7|kOz~?s?DêսRca=@};ǘf|d#K|x5LVwyllJD^A%@ϯ/ËTvx6w\Kj)MhVLfo6UGEu6Ûw18raZ\L۷ُ:]qQR;Xu_O%3glؑk\D >tm'g0V`Bc*MeKk ʌt4A?n3̹)coO^ߨu)w'Ӟʷ ;Y6%C~wO??[=W}A}dY'/K~aQc0?h-R9ZmoJK }R2&'uG.S=kY椄pT'nHîpf54R,݆!ʑ쑔c2Enm{>m A;z |삜RՐyszfybt,&/z"w@f* [azkmmXasx8( "=s^freT)`1`5;P88upُ47ٵpsT@*3{+ivYmfI#$VZ50T@ƷdY^g1yґjbADL9].S򠞠=iz@ K QOO2OoBS3ݯ3TjdXj ⻇Zr azjCm@ gR>2~\x$mY={쇜epD~lIP 463LiCv_Ӯ3W@J7ldT>jJ_?Gjǻi$c4O+PIRyL˴`$;8*DxI ȵ. ޡi 2@!KOHMɹ j^>0g^˩IMI$ۢR۠(VoORL(v# ~Y]=RjO2Ȁ*} @^Ԑ77o@)Y̤QMBp6i3$JwARj !V Me[[ RpU8`%&$Y ^[-jRlT߈|L%n*B~_W-M?5LjPnƲLR[V}ŀ]$$smP ~q*Xo%@ aj\'|%Eo߯OQi%Y‚zstm7ƣnO$mQotHDTN@ɦ?5 U(O(OԘ k^Ysp+ȕ$}t:ug.AR`LӮ&PTfΔAy ÁG2RnXj;(y Q><җ9j9G`\ A68[f 6iP,R3e…(S xQ-I =%YE>IZze2-UH$%3'2:FBQH?ffSm3S& OIol_zmJGof믦 hԛL).s2 tצYxp|6 Kٌ;rAlTʅ0)rm$X]K9TT)8ڨ۠)ً1΀TZqoM(akHҖJ"}yᬦMu ѩJl &6Oފ|5ŚDc[Z2bRnTM}Zw2H.X6L" ZH|.-6-P)wυQE(4$Q,%dO%*2A07"]ҥ\pU[c&❿[*G#mK}-  8-@el?ᅧ+[PH8AJU$Nno|]j*ʸ ϡĬrk)dZZJzkqXB&S/3dj%Rn8t 1*yDTb咾@lTH<׽> zbt֦QYRlOXAkSS[Z&}B=D%@TW?xaEmܚqI۔:}E>qB$EuADyA3՗XA"MnK\+$Q!}|Hʔ&.C>$cOr(ij m >)^?3qIگ{̑6^RF?9PjM?u ^]E}/-N.׳ -"OT?˵ogqWp./c{c5_JT(*᧭ o4}Բ۵45&M &SjZTYBf]$wSBv][z#!2"LFN sԍ̛Gc?>ʖK7 |E7H}0MOQP$I?2μVnUO཭1Ž""|2\0Ky ÐLJxk3qeA؟^HM3"e$̨12lr' tƖA̫iu8jyۧe<`'|$k rJw/((0e,9JtCzc3-P9Qn#kV3ؒBUKm`•,4lsjl*RO"D qGI;ȵv$Y̭Yt 'm7vy`wOZl:7#zzR tSt"$c/4l)x%DQ:rIᏍͬ7L{D>u4J2;rMŬGhTBi1$ld4JK';O?X;eK2Lĩ[@HBz;4at B; MMo2s68dHK i93++uL-nGGK_ ,Wfr'x#b7ccYȾ$Zzq۰Qɬ*TzR@hkʏI)TP `%->Vp 9lnfR愪\W6)u-!IQQ"iZjVë W2I'a8f^v9gW mɚ =zՏ[܂\T6Bq+WH4Ĝm` .-uȺ)BBSƕVYݒ[qI3QC ]PqA JUPĪRpfi$%\H"C;stPyR>}[q} 勗 j\F2b}75@&LG3D_f w@PrOeRNVcAOzKi*V*vQ% 3ii%*ߒO-"‘8N@f\KO;U׬^E6eYD[LJMO`yZv]y!G=A4ĥ`-@Zw7IVfԥK49S ^6gc0)Gt*J` JoⓗZiJDBqTo'itۅSVQJ} VU9UDu }X*Da46(ҝSơņ4hz[J 0ATN*WT !1"2AQaq#BR$3bCr%4S 5cev0@PEds?'  @K^۽x(>n]W_+Uejx㖕SB72nw՗hlvOey?#49W{JT c*Ö/W[X?dUDT{ Ӽ.%@cb~fU72bU4y #IetugsՏcq}$2BR)ic"`9 d9j2Ѭǡ Em&  t=ȷhXGu xc4D#jpGOQ,diyc/"I$)\2|@)ӷq78_B}^#&8Ud[Z":cUgu$d3[pOiI.O1P|.F:,>eK\G-HB}ZlS[ @߇2fZfu7PnG;4#/nAޯ7տv?݇M p+Nltdv۸am?M;G_*("̸J+(,ɕwOʜ@|q tO|a ˘֥[\p):!Kq߳[Xk@+N'xIj^z̟) #XQjh6!uYnbddԯ"ۉ 6tafkcu,C>H#q 4895 +_#)h? $hSE*qTSj+2 $[xY13ɤ߉E2gx>}fGP>Dr:x~_,-R.>' S9%M UAI厅R]/te"46i=N,.Va.g\#>ÿ=6PIC7Ҽ1hh8].AOLE=;ashոd%Hy,SyEYQٷ6e"1p6rqU{%6bţ:~xY="K #m'dwN³o{[F Q}o+|qKIL )[m(mđ˚A跎7:/h=MՕJAij[a` qjbYTagpK7{ `Pzܜt :3 rT+5uu]Sq_ d[*hӅ1 ϐݿ $ZQ{P*c61٤-ʣ&|HWI'om1۾ؖ&2ܠMn'Ht*mmۿ߈3QJ|[}Lsn̒\銘dKSom UN#}mT° .w>{f40=:We3 zAc~Hٌͽoo<0c'6$ MO|y4 y_a4FK6f54`Hc2XGs11;i&z;cͪe^]4j`,]41'V JةHz@GX[.Xf):|\:> "DpiE*1D䱛*Sl 꽡ȧM-:hے%m=[S. x+/N_,,&,77cOM=8;ޝ%z'wa)aEd]BK+|vpt<9j8t6_]S $A[EWc.Z^-l* c>ęKMaǸ  CQS]DtYd6X;>_i뢤 +SSzxn鈪+hnEz'=.t_xzmxM%o d1A4騻̞XzJ2]<"*X]1D ?[xGI$ͭ]c~Z(gM0KOectc3=ֽ|{ l)N;-.JǗw+ABnv*<|68 +mXLQHIqmkGԕ}A0FD'+kbx(ݟ\_X$m b5L?Yb7JIvo%iXQҴ14o~XiϼY8zį]WÌ"`g4ˬ6zYݣ&6S`_}ؑ=ݣIo>}}Pm+x+*iKdYj*$Q_w$|i+4:Pc{)sl7^%2$=Vi!MSpCOVEG3ϩ 5JR:6 I-;+E]QEv5IYKÍ祕iꩱ_Iqw֚:Q:v9\)O`?fyxhWG{?%&e^OWwԬ2AGx_o0@ b4Xx%JhǟldUqLЉ:KHn?U*éNßaggky7H剤iw}>5xQD) mnc7F6F߳;f qS[#ZYlfT1'6*Ow1((2Iv ޥk>XiKt~Ӻwi=VZ8[)O Pe?gw;o|5>bΐg8jo3<=| EJmGN>Gby˦4U؁n&QY[w%W˖8h@tPp&7R{yUS߳P)mcBDX#o&'Wo,(Cia[\,5Luq/L1s/{XX{0ĜT}P!HHeU ?^^[V;E6Ӆ%miN/_8*M3j<}[4l\cc2b%>4~<~x*-0]MUSӺ!U!b @ZT.ᨹmRXxbW3NiZYg.j}[B"5/>䚛44-- lVi=$taĊM:Կ67=`<ũ+}? }\( , A5_Kw MְcU?;C'WIpT_n#3_ ;PmVdk[lT'dZ |[FsA?NEr2o.5ܕ7?jGT1_'Oٯkw^?~'dAMMV<)2'+!arݾ}}e3"fۨ_pS=OHg SSHx[b:J 0cvMZ69:?/46,&ayiؿL ĚͶ_ Tn7ZYn>\PXD̀Il/<,@6-^I#|tovQb{4fm%8F'melK$wrO.G{sWc8(6=,O߁=7]і6M!l! Nͤn| \_Gy_ J|ĔDXKv?>XN$,TUpa)'f>e6k|qU>7u[\aLǜ_L1k['pkbP9mM}Vh)@ 2Ƹ)^;HČiZ?g}; ^8U fY %B\^bhJЎǧ'd4;oe45 הu})*MTj# DX+_8V@G8`<ĩ);i_/)NHeo.5핾8yPI!8<{^7:=0ZfqijSp[tھ.Z[L+.ox菛]g8a;Rs *M9/L1a~ȣfYC_05(kp/Cf6MNmJkrWUyx^ - /TsI7yXI_\du҈7m+% Ȁ?(Oe{ ?uwm"%<1%yb$15tQb:r]2ԃ_a$zbe /%~ҫHcgQdz(:t؆3I7FCI~c-CR?,eLQ+NH"O֋_<NL4M/\խa!;ƫ#{酥geNiUֵ%x5w:Rnk k_8[ /KH$94KW­#%#Gݢ4dŠm]zNCQnźE9^O3olp."mm{$X}朕jQof,gBr+6` q&fĕ1T"MnN˪5~%)ƜQo'=ʙHA}&-|l+Qoa%Z-yjb-e9G@tf8amGK]$c|V_)CGF' 9~WkJf-8-E2L# R/yc0gm;' f*s+Ɵ R56QX}8zny|"í|RtÂE,ӑK3&Y~jiȓ+7lN}>Єɿ[߄;}!wホ6qZ*5|ysjF~R';RieH:c@۩ak+$Hת3}o#syiQ1 RO (znVAƙRɽhvQvߞBld 㝵1ƞVS;yT 0y+3b[F"GM_CsJž&}i@={GZl#wuL7oCr1^uv:?XOqxnB!x5UBļ9\f O㧑)࿿q[bJj)\S{\_JmY[˞el]3 rj=SGSjiu!wmK}mS³;d/75Rz P߬4zxFC>]'\}|[n@h^RfMxYfBWKa7Ej DFI6qMG%_/}<1cG)-H7*D~fp%'W@Z]Lj'6]Jn"['.Gkr>$7ybLjWZn1JTRrZ_=\x͒ r #[ՈeFݴ!P{Q'X}<7XV,>G]XX}1q4h**k1EtĞXJzI>ͿA F~Mv6!y3m" 3,'gAÙߟeyiAl67/˳ݥ'-,e3:MK5LnC0٭ag%[ E3D7S]:1/p/+ݘc㊚ܖ`Xb3bH̭_kƟ)APEvM] x$/9iy!y$g.N:ND=? Ew >NK/9rBVFis{c4`^2T.x!OKJİkgAc ",> FHvP<.:gldGהWeW]-[DL˩XD^-WQh:YD)Mr ծvO=,8JUT42MA[j t1ng1v\VF#pݘpP'JF]oaS8:]HȂWlkiYcZ 1s0}5^xӯ#w06;SѣI>pj szʭIR6ę@?warME=\O玁꯮~o ~WҪ6JxG[E\j~ʞ!<>gFS}tA̶(4l v}9bm_9QMelr)NGҪcf1{jc5 x mNӘnz7ErڇX%yakj' %]D鏁T/'U;0!24sBa2RN-4Xݤ#{d:3`c+ ـ #R2A2SL;LJ8QSu*Gr# ZMuӋI #1u#2MsѶ#cŀ) O5i8uP^ܶ1N!ʬȏ*)ubV>OVE&#Ti|wFu<5620UAဂ_n tt*;U_& j~Ii)gKok{Mڙ5˵13=-8ҨZTLBlN:ҏs݈e0'ӭ+ua뷮2<]*Ex?OQɽDMT}@_?t[Hߟ,:mA~cdINKk`liE1hB}qcJs}<0 /vsE:[q=؞Yn9 1G^Zm->v؀|-8g3QMob>ufM)u4_SC&k*_607.-ętjáD#e7LAw`ln >x!R\ gMTp_^GY?Ula%v2^_^RGQ#bFfX w+"n+>9#CG IJJ,0y-7'faޗ: Aq*? OQR4И4q/X_?9mJ &̩xb#g&뒶/D\!fW \13L|T77~*$eWTjٮ}0/]Wm?݌amz2Jl҈Ē+ŻH+9_#9TT_wQK"soO'(x"PF Nׅo}aztHg^ T\|TSn8Gmz4QP ,q}{zt#jxxl A\p4EZ$E;6&ĔkGWY_/m->ODӝPtm6=%^)2꟭(ZO#QD\n^MOQygoms)'LU= ncWDm=b[A[W=>Vu]U4ذ&܈;xx@ǻ,.WG)Y/f=[[~XHhU680pkz nccakpS#*gDV/ H WCZMCƚj ЧwO 2{=M3K),I RR8ETO}@>8)3)Y5c2}6ޗEM ӇZ@o>SJTH) eo0rb`TJJ,F s? bhQ;㌦6d-5[2. =[,tuSȖTwAXpFpTw> FĿJԷ;_ǿ )ZQX[lGT(/nkn_yƅ$p~8x42ɠO{,ٞ+m~wa oX 8ӤG >GW$ll,bS556%!Qc|1&`#GYt[U%FEB2I<\j+~)ow%{<ږ۪񰿻j`RS2n~c~Imr}fm#ɜ54UM"9Av$ߎ6v  ,y/|:6qmmb-Gqj_}Oበpecb{'\fO?m|UJELUlm$jmv44oܯZB~|(XՈo㌶dtk8{zDBFyv'3}Mfr9a rCI@7pJR5DownCyb!7!X  0{ I.ZXIw *)ISz<6X{۝ IT*BmsZ ? 8]dEPzaK(q-?, vY" L hdϖ%γ(䙸FUD[>BTw oYr JmeIh"m28RtcMs.%Z֪#ma$-;熮c܎d,#NGdҸ-6ᆚF;'b мISQФ.~X^/ ('[FaOro5%i1bZ*+OydɳT`CJFh( fP BEߙ̲40Kd'؎[9hsI@d*";rF2٢Oyn[qPѤ꒢#bTc:|`e}|e{|7aՆOb\LJ{)',#4gb^2C]IJz2 q}5:o*w BʁE;@58qЫ' *ŸYym^)M^8y$<Vd*dڶ:4NV?G6(1/%?\>iO\Nut,IƦ-CoEJG<[Im $ј!V݈Q#)9S5.p?:Mj%"R%mn0_:j`- [NJGBq~71f|0)2X[Q}ʅe4Pn3Dv,EyLƐ; GTR/Kb:OE)UqEۄ-EyeDz%}xi것{ z^=6 53auL$k՗ˆIK(9 CvP4 \6~[`):aq.۶ FEM8a‚NBZUt6Rrث;᧞^ ͓F˩mN> .Grᕌ[a5R)QP#'挒Uv!PVUQOExsH^l;>x(G!)򔞙$rSJf^8i US5K3Ba餏M}cz(Oy8פGqn }1mz~S>H_ywqcFHP;PL+/8f~Uiy}'jex]YpAФ_x 2X?,`ivP1 GfRRj4ͳKyrđPWmBA,,-6G[iS޺z`gcpz˫=HvNrKLyF7q&5q<8ʉV?A}8I$wUpG%Te-,GHV&ܭFT;-a֢Pƹ@k -ߎ EG!IӳK,10u':n`h@0^hP„X 8>qN>v P_~|q%iKST){KϑjPr,O~x#jyfu ]=d\=\4eFg~$r3_-JCVYk߂i~2k5JeE>za"K3ݞ:Ǫձ֤S+HSq--7ma$4+ٟ) +v}qOx2B2ϡUWѥ~}~&\҄xK_ =FAVG+tPSKQ8 {T}q_kbXg!xmkӦ~jߨ#|1[DxmU;,EK5y/zzյ@ZBCx{QbLC91E{ X"uu3 n[Qai OF5oXa㠘9 opըSm g _N,Jق5x(|Zq>T\ՔZ-B;iԎ˭NEegm-nž%pMʛ7T9-b uQ\P5,Ub`FJwLMUeuR o\$zx-@+,Vkrۖ:ds90p!% Xkwm #ɖ%X^cE#q| Mߩ$K~VƜXU؆ޝ'Ы14qd_ kJn~( 4pe AnḾ,K #FIl3smEPoR1.GO -d_(E$$ܟ,EMrvC}6Jq7Ϙa -T ϕ8R)';~4QU")A28:1]uMe yNx|9? N/LuLg^.YTZŏ~d'[r>? QU (KiATeA5mUutaAfm?&?IJt*4T`lN׾^XiJTmFdfoEDR4l+2DhR F>7]'Xz TH{ᆒ\"C/YoNXA#'9L6_Y IŹzz$5K&UK_k+ &݂i?)%p%VVO;b=0ncR~^1?NPxu牲…gzZv'Ne >mNΖA'$wlsMDjoCq=Ud8it5o1򒣁5IH}z/cVe編ttySn#|t[洹T>Mu#)3*I^F/ }Dq.v%yx\qвCʖO8|re6W4JLO\!bæ@~yai(hQyopdEGp*7{~6C0%L*I[Mǀi<v՗Xf%9i>XyEaC*df7^6aO/WBΞ=d=P|pϲk:te*aSn}SqᏣ2h ^~xJu7S$w)\*/?䕯fZljaYH[}nv^{sF7T5as`Y=O+u`{ANDw3^>|8C&@c1OPY%&6FS+E*V!aCE,*>U^J=_ef9K%4/{ &%kbӭ"i [r/厎) r&D YٍvRաChgy$b,iu)$噛QLvd9uG,Nf<>[wuy|W@_c/ͣgK׈'ot ʱL~a{Gw4nv+px~\7 As6˽}Z/<rz_XH$7}Cczt#&ikcՒy)/5EC:j9j#ͿܔX#ONmKU_e4C=kb.AEI*Ƿ&}H˳=Oڽo;m7Ql86 ֻ]:;-*lzʋ0|d_K3Fc]Ͻba=]f9MY_o9s^8jͪ&PۯlS=6Eo2 ?G/vĉhYK^6<ǵϏ0u~ϴȻi>;v6e3ǣn ds5DK grH3"ăǤ!FxB5c)zki$a2,W/8j7wup@)LYْi'XA] cO3}ϱ<&wq8ةi=`-0hΪ+_# 7zis9RdX|GxJF]I.I?/$$@}:"A̘ $W%s H^(vrזGup¾qJx{ x) &[o ȧ@g)"(GRC$ScnE8Vjeu5ˆ68$"B2kkJwl $e+*jzV<֫ N>T 9OxK#'gK]<>7^".Z` _j4#r @-͔D`Ȏʜb R#!* ] Fėy<'V˱F&nAɟ,o*I!m~ca%6[8Υb]#凯q5EN788iIOP'`oYA&3t;8$F^+XByȚ0zR8*ToX[;08D؋Ig8IX|{*b#f&'#Rf$K(N Nrva`%y L \*m@rbTmzD@aTXz¼S9B ܓ/8)$>O%דe>g.LIZ dDiњ8Ç`>cc"G)Kihj,d&Bmn-IdVA 9]15o;UX: POfC "HIIw"`x&^EYA2 -ޯ{DX ٭/ǜHmfK8AӊUPzƉ9Kg(WBvIc_PE% |Fd)k9t/S9(İ!$1tИmҠy$JL"ˊrL9HD׺Ldv*7 ]JJ^ QG3W'LolYMG\ oP=/Qu"'!G4Rqoo!|f9o ̘ sƴ0;N|F[. }#\HcfTk$ ˌ-!$>pKal Cy@sw lnH/2PRbpLEY#"JF&ha"Hj2( :f.O{?£E097Rt@k@boWסIK"`NDqiL&B cɭ݈#?)qI"˾tZyLL8)oQzzd Y)&H% WX'k C`7|9Eq( U]9%1|O%60y1 HQ4 Id0+J[@:Tͺ@ T7}\$+76ZPH;tѻlz/YPnMsϹ,P,BJwN+)aCYcC0j( =,WRؤb]JS?F8\"> ;YDizĩHͤي@|b* sC+ IQ{c 9 >=w@:VU="XeP (pm7R6Ũ@qDډB8e[ Lc8Ls9Etdlr. `$EY3GZ94PJbSE9#K N򜵔D#ɂ ]ms0ȣN2RE$  >E t٭{ÜA2e]P0X2-mI,"bLH!L| 0e׳ЬP(0t RPQl*G0%w+M:ȓLtH?Gf9r)!l IaH`NQ~QC!az~I8)?e&A1]@DCOԫp. zhdhmB8ɥ h-F܌: .#Km%g 'ؒ18SW7d!#PXBhFa H +@җ8c:4G ]<5 iTɨ ۈf$GI$H_@q~z2K -ل BEQW#g`BSh3 0ǀaC@613%G k%cY2]6d̓dȤm\;C8Pڊ2vHF9>D,A!#rMB= &ຣf*~T/F_ j3ݎ?q}zu0E3bu:[//n֏R0MS Y/z[?F҃ 70LwA2B Xn]ԞFYrs7Y7A q:'Nzσ`Ϙ UFtlwi|B(a*R.P<6R$Y2"W0RwB (ML\h u!1bFX <E׆W b]Lr\Pt5 "id<Gǜ*,;>/bUL<}'~Fvj5e644#F6=RI~SqbE] ]vG2u ˣ$`5e<$N,H<6Ʌ*&qxd) _!dL4de6B7N)ie4dɏ>CӪ23\'+(Iuـ,d~)Ldr{JI*AO ٫3p%M 쐑^`R_H0A(1drl|T84!Y<㉣aex}I )QcS ?(fbjpEk^aH]m[΁Yw.BPOr -UTȣ,y k{')y]^']_#hUWF  y5Dx!_2d:Q/Ձ< Ip1CH)g0 M;YxVkV31I+ByI/<ߓ^eo`1N4>plElN` Wa^-T;0&z/N84̀5?;X/Lp;&bc[uKL^i[gqjz%h#WDGbLD dO͆#<@ LN3RQ9r.q_PPZmGZ#}G`Zcq\oYwӃ)\DbBvGhp=xa@/ya6n,}Ӑq x/ ϲŨb!ZMkFQ+R%^_8 MnC=3(|K~*=@DC'"CfԞ8>⧜N[]jrDk!5P̥<|ڨsc͇Z 5?8"dZ o6#?"'[ga:ڤ>qߧt# ?#5?DRtIԏ90j$y^j`2 iXK`J~@Pv&O bQSl|d|$;,~YF̜Fv毌R"iZFMjw`!ȇXZ1_~~TNB8SٗX>Jx,&NX"xv7'Ih(MDbD#BJ";[v^1p8b&>p"e8f 1IEZZQ "г8PSu[AMgrӣJ>H2_lRIhx 4ڔ 0x!ĕQ7Hh O,T$1 蠅# &pŧ>jt6і.7 Jǹv|O䯯R~?WJ<L&]0oP?% <6¨٥FE0s *tg!!p1h6euvtᬓQ"G*'mt'26IP=r0 iy X%vTɞ8HH2Bfz|WO{. 5R+ZF a^D;#s`n~X @0aWV,RM ԹV{$,,@p!9e2HsyYz9;Ł E>r9HH/E`* Ľ3V_nDl>>AHiE!O{x ^G`A[I`<ډԶ?F:q TS8KQ>`'z$HR4Fkj'p‡daDP$7a9 Gq Yڸ7H:j_lN>{Er9қxƛbyH`ַH!Ɨ/EF K>=fQCd0XBd0Tc5=J `X'dw#s(8Djse n#D@IxOp Ɯ=B˴ːjzȜ d.&1c䛁(<énc eB#}]lq~w}?m)dnpWj$ |lm P=b; 䳿 $noiO5C)vy ? Ki#g| 49`t dex0/z7_ @4CJ,UZNhArnpԠMșE@نwC;L]O; =`"b)qJL4ۀ{;^u!Bpfh ÁSn' *w1+WZc")4nE/;!J UIj4蚀fj`7*q ipu بfIR)qCߎ%y&vs!_"%!쎽cۈKG?8Ya?#76vp0997@k <<&"}$`fC9/Acd#CA:s9p ,GŎi^04BO"5xQ@A#djN3L0,5'DE|E+# 1r}GDb -SJ. NɒG4m&%.!zT<_,4 ĆHLy}c'W{(FH= VV(70&y6rAV@-Ron&N2k~o&ݣocDTL)} #2mA [a4i4YHab63V:AL#(QDpMx# nƠsu3.&9$k%]Gbe-`CIy[66|A*cwP^EtI~3HWY"Ůԑ3NM|ٳ x¥&   lP;0Ē KvZ!͎>]cJIq9AH$s8‘`GUIjX%T+)+9<59RKSX(/#ɫR9kaAa2;981 _9F!,[5E]T1AV:55p`t!Km=f'x `cUmdb :Cs@() \Lm^irrAa~ DZJczxdlbN5jkdK?`wm!G"y$XPՒTP]iB %!67S tSa=s9TO0aCA hCYxRM8 sVf {/37h˘4Y2Rs7U7vQ1A PR3Z;at"$[pdkM%r3eň"C(p2l,և1O7C x$@s_K$i/R(vwYtD *8J,ҘD(u4G.:ƽq\k+܂+^F龩a0CuAhE׹ R#skE![0E0 i\h9UYr%nør(`LG'йY9kprp6$;¢%7Qsx`\`mrdt Y΂ mʡԇhsk-BzOݒE_=Ȍ Z1 I)Lɝ,-cx$; ,3 EԻm6MI&yǚ]|Heiz{Kly!`v/Hx$G\jqj4Ԟ &d ©W!)ɼMF"K:Rq2LJgn[Ћx`3k4o@Hlm923SN:yѷh,o#<Tq AFɑ8dR4n.u,vǏzoV)+3O/;˛:#$,nXL$[w5h/~0;1ENIܵ6s~IjOVbwⱲ7|I8ִV=d?&Z*X;)`0lixlcyEO49Õs ?WI|'(O|`s!RF ;ђ'חZoqɁS11賟|$XX%MsKw~\0sP~kbh5XLBmO;0sů?87=]̸y*)LReן1[[?`|C0D| 7MݏF$q9 g+V 7=J́Ơ蜕F$h=eim+Tx$0DJ& аLQpg{t|iY4{mۼ'J$e1U ^Z1I`/`[`Vlpj~Ag {x2459/v}#iˎ;3Pn" qX@LB(@?c@> Wl7GxJ0Sp.Y89f)Ο8F-qǺ٠#gyi)@/26sC@A  H y$>sՐ>eE=|NNL׌?g4s2`|#bX^Y {:W @y!)J~P@az^gu}xI'eo/h)BzqK)޿9:1b>2s"b/(8IT^|Į >JjodA>O8+&uJ6Fh14xMH,|-"YPI*;Xe+qlsf, /_[_N\\@m|3}# pWq_:b$5pLBsѝa>hs 5୪MӢ-u+k%2KRt#BA.(Dv$_bܪPK>'3SseYXdl5_j(v6J!OP #(N|GXGfDF+FȚ.8UiUd Lu %.[ QH+qR@lnCˉa'5q!Ce6fpLL5$L'3嗃;qw|d\@DW2pH=!y~3lB ?'UG<׼$"mGU%!Yh|@WGxQGBuH>^_19lhKTj= f=Õ$BgDFF -f)c((|"qE@ԸP|$E [-drLQo`vN3N0 JJ#;7夝F t0_"sH+_8v;mЉ+")P@FB)RVE≠n`@>ΌaBnsĆ4WKb b""y..)X铔KR|!~Q%g.3K,}"2IӺu?ӮkV:c3:E1)E'N hV g@"0A5ŘJ`3p^xIӎLFKiuWK1rΞN"L}0LQpE& Gt+Kj9%Ny|g'ф^?a0,Na $a HYc+N{Ƴ$vc~9ROSބ\ĥT͢.&뜛yWA8"b^BJL& dY#Mt(#|b5:$´"6l%d(%Y얦0퇙R i1)8" qv?i8-Dh"w_IB@ŚsN K"+*W_胆P| Գ'(;RDթBy7z5-hRG0$RJJĻa. @I4l LKB4Py!`9(2w d-L`f ,JJDAV#HaJuwgz|nD9Oȼr5ampK@@k-6SPJuHT&z@bHCZHAm$.[RظIB[q {(L zT)Ct4I  tng p%֐B$ C6 U-~yFR~C}O=8K># _O߹? R,u!˺ `>qϹ w&+̞!n+ǝKL* !p,ߠ; 4=0bsw2EL,dd1pF+=a @U%\ED=ad`cTDDrvEC]a: ,R/:DwOmgO^t3|O_|~ky XwwӋ%ԈÍQjt!jQiwm H2D[i A#]j _ p _beƨҀPLHAIJ=v3.*( F *hkӐt O158ܜpE‰nzn$Z!g54CD rLN Ӑ*,2u3R"?j!?Oq3/3vC>kܜ@ {Gv_pUʏ,X|Ib;"3aNu ䷋gjJ`FUB=%„xڀ-AitYJ6 |QPм: S)MۦKE+hE 3/:B rER x`,Ё1Q~ZA~~\C>!T*P^ G(3ᱚ>";tUXQZd ZTô~z tH G dD[9ҁFAiξPN"bHCH(3o"$Rxzȉ7 {tH⢊ GRO0f$BBYi @0`E# .âU#3t '=;wh6CA][BqFA.PJj$ڢ^pETcyP4k?,TA> UB!y?6iHl)gD=ԡ$8 l cHT%_P aADl$})RFXZMl^ P784;Hd/|݀QSXbG :!*}uZօL҉NB8HOEN/Xҁƴ!rK"*VfT5(S*P=‚\V(+LjMPwՙuvy82 D=Pp"{ P,Z!⥥F"0pAŪ"a"HaGD2儢@Z'&XGB'v$9BAP1Ĭ46gl:l4j(`GSB MD3r\EKx\C)j^^" >&Q4`=UO/Vb{bT`4El| &Dt-9Up8č-wHjFlaHL+P+I " Q h$OV 8HR; 'K![t!AS#vXR*p%WXz]h]od7zP=:BZ A~5/Rpv B<.)$:B$Pt @vq}SNp@4E@JqJ@4_BB-4f&;9twA(]cQ B0/%:HG$d$ @KjT  B B,.CQRG05^ʐ@i pޭ2$LOS=+ AҌ^KZq HY!٨R~tZm)y,m•@ MSTvd!R(rgT4)2ES1hBʪ8#%m)Th(72(a3 gx`)@KOKTHk%Bw mV] >J1PӃz8˽8DKSjZ1&ꐨ0xAE!TJz LnN%P" XsyrT^pEO#m-M-?hH=CDZ8eURIhZ4ADغ螠NnhBw,EWhFU~f!R a%k¯+^[qTI(4VAj!o9F(W]pQ~A)5%`B,[:j I!4%E TBAS F$XD3C0Mj, ƾQzbIHX9.:DhI5VM욡P8 t ,"0$N$B FҕVpFL 2l: G 1&@*^b1m4*@1!*BD^VYV>u)n! vvNߢB_ moQd ސI]BW^o !SbXUTBh&Ҡ`@MIDnV`ae[ᅨšWcgo,=VQ,R0\,I戅&fɡIBZOyf<B4t.9G8Tqb!Ej `q'alE В*Xd Αŷ&2H3Æ@+$,JG G\!bWnxA$N)G?/>K`IJ!U-6h(, ?D44DY5S$PN3PK]I%IeS_oN.E*#j@Fu5=yT@&Q(x.:4Nc,guU# mJ+S 'CG e'ɻ`W'!1AQaq 0@?ȼ@/~\VјgP_?NK@5+RH@pSbRPCRySqӰu$Y=P<|ұXW9t:l}>p6n=1}p% UZAN$ [:f @Q AdPHZAdQp%27<1J̮Q 0 HU tIp Ņ@=jJ RE!сxw"g+[f!#҃D2}__' ӫY?e[4H! AI9QwT4.;tKU଒k+p 6hysJ)TBv`}WD yEkeS@+ĞމGED%!R!)6RR*+LF8a8[጑J[Q:0 մ8 mtIԗZwf96E)1 h8h)1KCW9^9 *<8T,,UBRI1/Z{V-iahp-Xh2q72Bp NSYY8 RwlMz$IzV1sZ1v`2l!",u* #Fd,:FXi ~Ka@@bUtN89Ty{uҎB UEbEkIkZF}e<@iI <@Q!jC G5cڻ^~Bȱ I @Dx:zXP(FQ:4z$t /\OlMMKP |rODn+D%9" qXCU%\,)! 2^(4 -S2,A CmKh"jD{^S  xZ قH@N%5`:lSB9Sȅj'`|͗A*U8,A2WuV1R7ؐ>Ic]jB5i]m" Ux';B*g"q bY4$lb90l ,. a !@w`%$OJ$P>4¦gG-v>C)-YAA~/;tO|qвԈLI'\\H S&y %'K†@Qbj␖8=2`C_u4c`O,7X59”u =Vt{/a'*PeE [!C4UDAFK?mct&!<"Fa ꮖQLf#!ӂ1r@wAE U#)MfA}P)RK+b3!V1`0T.9d\E" DDB+!vudY @[UT%Jh]9|`7X_ neJ/Q5gU,xFq~Xtb1VB0)AHh r@Ym]B:BvDwX?E!l.hXQK%DVKtRRQ Hc7B)BK%lKZd/A j\KɰRsKoRJPW;2/@ (|e*_D?;犨LMh\G@:DtOZvp1C0jZ ʼn& En@R \eeM04qA`!Wm_2 )EX7Q$= $TEAGADPP˫@Re?":X\x Ҹ4rXȤ_*OQ^G ZPQ GgH[!WFƍ>Q#eZb ÌVEwT A/p"*C0ks\CBBXƽXhIČٖCr1ӛg%!p(Q@"X4L`P1/6%`u3hXNsR8 E ) dFE"6C bq>:z.Epk pPj ÷)d^k}Lv~\j(J 7}e#׈g z Y) IDi1o#?]$$:^bi" ؄] 7F$^(h_Wa,902SdpFEsH$) 0 *btfN{t!֥#OtX A#h va@tF^LbpeH* P> b L*+ؤ%DB020 F/T)@58f")D5Pz\A R|)hذ OA AI=p,; ÀLaL8]?Cgq=u(!1AQaq 0@P?]5U}:npޭ ؏zقC4 _ ^ 9Г{j`կlA|=0A"ui4bg c,2^FF-/ű^  p*(~4$E*tWD4jHC U!Ye FR'@M.ꝙʚ=SoMi L[TBUp$89/}/%?Q (yU{"3K':5uD8/p"ӗŁ(6T;22 i|1 (c ?`D KE!NwD>94KG.#iz$ oq>B 6xգ i8~<<}᫤-3[8 UPI$$l&֎0e4VEEQ@dl|v/ _HeBM51t,IE vILF|ʴIl$\Hݷ@BW9Z ^|Q@i2KR40`6 nب]}qe_'D`"0|0eIhZt@K@v &PQ!vABLO!d 2 !ZH!;8{&"+g ]i -] ^M"Z qU 'UhBI4v0oG 7 C=#VExU 0cg'-jc$!:{P#I0? IZ܅i(R+` z`@G @ @ 6р)HIDmhzs%ThB7SJ$!7NX>(PYdE oW2(#eyHƼDWO`!a^ T *| Ն0&8@4$dnmA~!k„60Q/rjta%rZ qC88eʈ.9~#l͔oKY+BGy@Zdr/-W!' m,-X ƼިPC  h%#qP5jD= dH}āj*CAdP>xOo@SUOy:Y`":閠Х;&hK$}" D8v=Dи ڎ̍PH(9d"Rh""H F X_N OYRv 9<كUبs)J#<^#F5Q[唨*~q>M'W {n+~) ql^b0Ե7# MYf@ ThiԔ,HpәVS/$RM[)DIVDR&(_#j?q;P*.AH" 5>B ˌPK )-EwPr/!TAgIaM/B"H^P4ݛF"TW(`+{+ J2G5a;M'>."8hT e))<B`d |!bJjҬH^ƅ#A)n 5殳~"/Gݱ\)M] m_ǣ,׀AJ J=%Zx8&lkgO66H%4lP2;rFmƎ/]xgfft~}u%:gM'<+DB~g (4fŀ赪I@`J/ԁ D[@'DnG[ E/V5oGސc1JĪ3!|uDtqD A?I4VŏlsSb$p-j>MʲbaD[8gS}YG2h <2v Qs.%=l"(ؒ0ꔨt b)#`Tp@ G/ӽvBfCKA/ e ib@΍uthK|ISDD̟<8Z# LDec! p5msьDlѻCjV C]$!,i w"/+Pi1et)N4<~o>qJ Ŕp3[DåzJ Y`P8GńDi Cy^*q yQ)OECӏ`[+ZB&҉Ѐ {VW8(&&grWJHo"|_'. ʹzP̯A;#V`@VGEZW:YejFL $ٙUPJO'<(=< 1\(_ُJP:j~ NsVT̆co@KB&+čG*-(WN[l(9 oxH(QdԬE ˁWYD 'O8Z0[΄g(-P~G+᚜Ctr 8LGY+CXg^a Cρlc5Liu P*mpr.a {QA"]&Y& kxGA*>*U0~qOoHEWi1GCBVa:kP/0JnBhat#/z( |&9pǜiե1̈ r_0rb&<4%=J0jIG-) axsr *WWoDCcѦ< hD,D )L pT@͵4 HG'k0"QA(.Cx@~!;hH Z\oG,u<OU#Ҁ$'q`ҐEk⠐u'f({l@T w6&:{RFiHj~7$=/$H$"JQ%F_B`ICTidTP#W ~ 9UtdZoQ_# |Kt~OrF̹JzqqS.X O~#}MDF$ފk*)S _6I a9M #QzV(!; 1i߰JcYPhm+#Jj@ 6W(dhP(`'=(ȣ,22M]4*DO%Eb++?f[¸dC )}0qYM42@j}% 8Q5DOɄBf$A QG"6JDr"b_qnߥJ2F*z& J@ u@ydANrA7C>l8۵h6'=7p~ B{$r`s6jDVc aZ{p5WrJ|G8L^c6GE??γSSkPkg5la?q c\6<9lB<W[ c'97$'FngbQUixx 9F8a@aW)'ZecMG̀#}y t *>h]IN%H-*1q/HX=DK|{SDNMw (E"}$E$9#ȃ}( K,iM!;GP6ڰ! Tz$>*"TPzВgcB] Uldv[˭glU CXABFQ*UF_(`G=Ha uCH~_$+޶4  Hq\/.@T%K3D#]2!Vf'.Ʉ,e\XY"+U1 Lz^0S;)Aȅ[-QT@8O=脤 q * P> 4PJ$Gz0~-&S䏷 bɤ%`=1sǕ̲̆:Køg>w^0 ЭGdQj̀;^QeU1W(x%)RrddPSʺ%j4)۳~PZ@zʪ#yJhD J0 ZDCO?1GD;/^L]IWӜYD X唦䂅! A )4/'h0S$οU/>eW"zxb@o lTbAJ?v,jB1L6rD\8TJzOڥ-H0Q->¶H$ D &Px ~L4 C(0BQ mVG/zt?ʤͿޥ&F"s؄ N?KmNu 2 AOlh OS}w2 @Rz#Ɛ5B1 ?Vv1`,lvm5G[|-l?4H`}nP #A(RF .Vǻ\>+Sv%I{~([Z}*o "8GpGNӥ֍ bِ& j@֨!E-Axh@SC$ck@2r N(T';&AZcE,[0N>`#Rk jN!HrI{C:Dz#"0c!{ **QaQM-@1RftoixxC 2!ARZ.wD.@ȲW(=@^E^/)HV'rS2 *ZهI!PόIdng@JO8cZޏ\Y qae A} N&`Tݢ(TW|­՟s4Q bxRIUSG~ldXHO0!T\E-?Il%Ca9iz׆lb28JߩGH://jM_7iD *T*C$& i% +nDKR{I(Uy.F9P  .r#~gxq )!~C s8]67c!:(:'g2etDh: )|3D(rlP~YK.+{e`F-S\@9Im~,#w]u nۻc7VMΐ`JMH(P aHh>E|lIpFP W\@SB2}f8#梈4 IA=fj^i@Тh_ݗrc+ҚnԄ4-X]_M9 T-F$. n$&"?Gi`Ό x `<]"P\冊@'X մ6})APHPue$(-Bbڠ!UY' XcZH;E8 0&u'&X%q|  C!C+@E3U!JAM ur1֚ujG6tx(Gͷ6 4il / $S;@+jצ5= b$3Pp:BFRnAծVʼnE^ZRčԶi@ڿ avT0 !B8(- #/B%# vq)Vh$AU Q~Z'ǀ5ѥp/Ӏ 塤]%N5b9pQaC`UQvlHPZx"FrAkoU5U>W&%4^_ 5%=;8|6&@ҝ f.􀄻a*L(h+2Pi!QR=`iby>CbPH43RELT\|[QBEDѤj BLCTRDS%04\'];Y!ON: ֈ2@#S@&(L*>᯵jxT:)4 >#,B/(rj'(PY $"U! _ a5>ZB C~"4YnTv h /Х.H œ[8f=4L8ExއyqQB/ _1sE iߢ; spfh/55)t.W`JwKC׬v  7U42W6~ K%DOGΑ(_^yZ>aБb<(˚> 6Hj,PqL>0xx&R}S mW H]b+Sg@`:ejI<9a@r6ǐ&# sXt.%]r*ڭZ>* >R$ޠ kJb91D8fni8a!$S #(c/HGN-2do $fqBJ!H *,p$K1UH|@dZb[̃f:54/Mckl*| (3N4:#H٢* *nC,4LKVߴ6AFh<kJ!pC [|xaхbNnG 9MAl`}ؠ"75t!.yUF ="f#AÚ*ΒgBoBH$?F`M$ 1UkiҘ* ˑ4R>VPIr#Ph CÏHՁJ!Q`@v|`?6*00VRP'3 =p (VۡȹEXCD?,=&*]&LKRq 5RH4Yu; |dAp-Vv!@^''QZzxX,bD #Y )U~ 2JD5 BãVK0YХmt6uz)=$-1c10=+⢾'&r|,XA8D0u@yK*zRMlcңNXIA1Rxq0}A~0 ڠ~%)6&GJWnm)2`U:`W~ ͜[E+Pbp-Xڪd&Y(qpABxAbY ,$xeSn-% կjU JJ)Th^mV9۔, P9{&Ag[-0caZIT@1(E@Rq.MF!q gF4=: W^–Pz "XaQ=xTuRtB4ZzQ""hDWzC{KGt "p@\xtSb!V2#W j2X!o2 ')#[]O1<`DQc?lo%RZ'@Bz mGR(h08> h Y UuYgkU&ehI>FΪZmS!|mjN(Bx4@NcZL5?P6]V6/( AEia3AQJB<ٞ@6U 2Ho)M]T0:XIGi i^six^wD_i~Ԯ `inF ?,x."LVUU}N}*3HCLv@÷k촅aay&-ey+ʙ +%LX$+KMˮ1ÝR饃?ߞ">}]y8#V >.&3jr=L;O?@-CCnS}{,-Ot5Hԭ^Zp5HAuR؛&W,"H$ r}NrŔ8=R!dK{*_t=t*`O= B^72 ()TpqAgVyDiO9 (x,Ih/P'g]Lƍ~CZ*ZcT='N#ppK( L5_dh@C! ,_ّABs7Y)BޅiBj~45M`~$FC"k~ x00ϜKfMgIn9 F1Bչx G$ pua *8@?l@m1pp6Pe}X2A!&2N\}a0F>r qBnaV_!#`]ii!PU?ZAb qhݜV>zق(\ S4heŸe2649qw025,5S<:9 _zz)(5"6?K~32EDUg`%V0y\zFKTWD7:@iSثdE( +/E3[bȠ)blCCX:)feU-ZWD} ae ĝӠISb$%2. }z}yIU6AWqD$ikq+,%RЬ/)x% zKuf_~)3bJokA.`Op&6qDS ֪1 &FLp5F3ť dL[(Cy`%SJΌt_J!0P ܶq ʽ_`J.>5,T4`P7d'ԧE R&B%B:*nv;C$r4mS4/'V0 &SOW^'4o"|UniϜVT/@/c@ !V<$LA$V!^A&Rurk薥%P's蚭ؠ(p ֚6@wiV%o4.}IaPV`ehm ʿΧ! p!rPtq Y`1EY %Jt"h.밉Ĩ#`B$mA8+Lhtk׬f@MNQ 2 +Jɀ1Ӟ1CuKʢvABWSr"GHӔu DlKvJM84 xZ9y{qiM%H$_|DhrPaE32 "\mU@+\6!H&_*=VPf@SzҨUf?:lSA_Qm6(2XI pÍ 5OVt ՑtN})1)$Dq/=ϣr c_!:[DfF.H@HtQ|1[ơ9Lpdn8@ 0SOEJxsߜ1nZ0Tx-+3R 2{4R."0>Mq߬ - K^ )j뜴)H*S,(k]4QbǏ}"6pϊ/#ꕈ}"vp6B2$q܊ҕ#CC}mJaz8X`Q"כP"pg w%?isol}`  M"Jɞ6G)\ID$M#X}*/R)% l>G 31Wj r`9:lD0tqHV "QEVcr ]:$< S-9ހf%/g#(Jdx?vD)H T0q/Q#6+YQ;czP*i&8 i.آ8 sN-HJ@z@T1UAqR$1x LX^ <`hGǡaXZT `1P1~M?UJJWW IX3X[8NTE@FU)59p9HҬ0mTAp5W[ΰxEV>^}DZ-ENODeѼ) p ]f?Kmayavi-4.5.0/docs/source/mayavi/vector_field_vectors.jpg0000644000076500000240000015036612747716313024072 0ustar prabhustaff00000000000000JFIFC     C  ?]" F>OـpogǠ`=r KRУI+fawamٟ6 ?#qS 7;[A4東sGnbh5k0cf#VPhZsjJzjF?m>zSrۘ=[Rߐ~=ܠad{g1+ Nƞ44G% b|sJE*@xզ7']<|υ%rTV1\bCpثؗ n3 T:,s2Ѵ3 -5?^ڸf+E}̩CaXM2 ) Hc Sii4c1zހM|rN~ctUϭOV-C"sZ$R<Ȥ8/k\zRI݋̽:x^/ćѾ_P"qJ- ZzxxBO&s<-h2+`.1ݟF&,~h>1{N%OS/&̿ɘTvoyƝM5fT$9ZxW6g-#.n⽂)>HiyzfUi JX惞ٖKw,GOtf_Gg&7+CȾ[MJu ʖ }[ˀ^#: ~3%g}:!K\+i˪ h 1Af LZvu \7]<S7iW6yv5b ?=j~ avj巻[ iy]&t:nSH`3?3^aXGP7Wnt-g(Awnݲ3/'Vlb? #J>\g`7u~vl?>t[~Oz3?- ,՝rʬ8ιh/XHg6QO6ʢ zʕܫ>M l,=ʴ*}OQ&istLqSK#xFŃ?3gz/|{>}㵌yXN§t fV δUII5zsu5Er\D'U3[ҩ٤7+#oƫh^BgΙu¶u PKhpB޽+56eXU^L*de[Ū-u_X5J}Kuj c:ʘV\;y5/U8X˨{d ??gQ,f|ϰE3)#I:Λ8qQD6|),:XΑTy%X5Uh{?(h~VX/4V \?34 @S wJLi>l{b5RIN+E*+/.7,ٕo+rG(x<=?3l-P]܁c#Ѿ_7=Jg,ƀݶ醓e]*zQ\Hg2ju̵)Y(|m͡n' @gUЭq]JS mUnյ&'-Z+WT}گ3,ViZA U̔F$@ϛKL(+&x^MqvZGM^Ib3)&~\@@}~vHܯfpc"?̚Dm` ~l ΄}KGМQ:P]CsqzM5z=8Zf4y߂v Džs+p":B&0T~jrۓ? rω}A ZoȞl@!5F}}-'%(9k\ECX>fqחHhryꇬ- ێA֑E3!n936h G4V.i"7R)תb7';)^D=Vco0O2zpmy`A8U"=No䃰Jl)6. $6X% %DLyCo4eB:Ɂ€TJ*Uw~E߂w,Z-Š˴H~<4#5V yӕu"RoR~?#VԎ2TI},\%Pm^"Xe}vwkG ,Rھ7L@h_8܋v.T$qdz*? :| 0Mb%H 6wM䟕k+z?QZeE- (5-S_3(fr vOg/Mwɾ])2jj\6) 4Imp  ؁p6ՕB \i5:6.{`<:=i"o;Eʳ'6{ 32w驹ks^>Fau[~n d ܼJh3=x9|`u\Exqu& ^~_}cR#Gv4k*7]-'s#6C?BSΐVQ5k+1^B\PױV5խY`p_lR?4F:?>MJ %1tߑt Ӷ^&\K==kbF1LUWh!+7-SW-:F1u(StLumv*\v}7]./%(%m8X$+8_g6MN5g]/!.Yv* 鸱meƻ\1,2JJ7MS[*)=@-mZ\MI[Ad0묢E,ZܮV .mbRqG.ixXrP[e8>ѫN/wg!0V\!<S +`x?%{c5UwN<{V^Wl9ݜSbfk ~6ܓ~w 7~E߂p%UYS!]P"JBY6n)L Gx5_@•n+`FFt+Q9:" BOO3qXDq"h(p76U[FB&/XpuZRUMt㶛.2GвwuQ ttОϟ(\,pgXڌjKbµˆ\/kf5Ԥ͎ƭ#,w qG w6m^${(Q!v~E߂vLD`F/C}m BY.Z HF3Q){W2a``g Sc(B|~Z$.MK~ ڀר*65\b)f'f&H5i ox1Ƿ̪>%SJVԒ,$ .4`_Bui/nMFi#؅yMK~ ݀"d doY4[onJ0ۢ| =\ج|Z+2&,a%8&uyV="믣 ;&7W}7]-&#)a07ѶNoϨNH|Np :L:hjrZ֫h4=fL ic.#JW[P=' bkMbQVyGEF0`{ LF9, '٦y~HvYz-jZVm,)T>D+)t۪>=[qm]j]pXa'ubempk-ŒaD?gML2*p|!MpRa`,Q+?‡]|Y͵% Ú&H1-Z~Օ5bxE$GkZD˦ͣ8Yv.-eWT?f" Ff/$ս1j@K4Yx`U%9..T샊8*|wXi.0썡l,@Keuuy-i"oC0RJY f_0/< 5PH#9Aªk]?d8fyG8pJU .:?.T2gOt8BB_hl9-r'"o8$3H՗yC-h?dJYΊ Vš)lVxKU .۱dW\鴔D(k7]-'2 $JEG~ǙZA`*8KSe@ ы[+[]du2sQ8ҵ$R"2:u?nbk^qIg-@X' S\F2oȺ[Og 0`H][X a~Ѡ+j,[ݠrJ3i W1\ 6!Q#_Ρ|&NE`lFX)L jl<6:f\{EJ57]-'ZlcW]'Q֊l&#kg EME .hmaBImj(a䫅)&VUUesP5k\1_^+1{tߑtY(EŮ??kG H }c DjDdXWZhƵ^T<1zpyTff0ܧe~.)e4v6ʚ-!zxgQ]dY](jt[7YL1-;=E. ꓎~/Mgu]]`u`sBd8$∮اm:Qki" ԞOꆗg?P⳶ Lz]k=iTUB c2~bǽ%Oam;-ޤ]VM;Bceq]|iRt6T6`rh.f <3pz%l~F'l+cRE4ߑ iSMi3P,xj% "7`¥]sLz(&mL5Ե 8[VR/C պ]Y7CQy%_>y`UKAbӡ٣ZԪoZ hRr[EeDݦ5y(3{y@SkWK3k*X[J6Q0L~ 1,Y4:CAbc, RlW !ѸRR-q,`0+[Gl\CMY#agA|8qvyZ-nH@wmnU8VpwPE(rt{>k!jU~S.G9=;'&ckbBzTKx墭h4{kKr/k28TyK>K)Fa= UߨuL~)dqv'e2krGEiS߂rL?b:zTKyɤԺg='s;Hz_fKլSOf_n.=8兰qŘ0Ιmzo? BYGC!1A"Qaq2BR b#r03$4CS?6qL,HOL NVi TN2|-D!UI r3Ȟ/wIV sG}yp6P}|,'R@I\wiL!E35pxg#o%; MEA Ȕ??[E};t%*Ggq-F#CD וj/hSuo%EX$a'\w Zgجy0 I-UyYL5IRհiXK,J[zC}MH[. b<{eڢ jڅS6KG3; 6Ya T9$rj~Fښat10H4wt7hY JR o#r52jrN&,-vxmjSe{p=TE[@Ԡ"=}xz~vfX+ sOO>r#lꪩ-1jRTmI3$5NYt4%x=tI)if妽*P܌>t_y$c 'Ry # gjjkxcZF,{PSx{:TTt+<gZ`DtMMRZBF9$nl[O2Vڥ9-ZƱ%PVAmYGeRNS(HPAghXK GQu=GmMP±#{_.5#3#fojaud]AXD/n5[T'rHARH|L *# gykdcD+[d%# )O'I7KaZP] 0lE+~Θ)t]$zAXtRl#o(UO ?<(Qh6S}j_wqQX0EʊKcĔp~Ss+V.1ӧ)uE-IPZ%hX#e▘#[7{U \+>5I37}Rj.ǂTHbg1 &4 $=%mSs,Tƙ0"(JDTq%@0iT v5Db⧇D*>׽'cdK%tob Nv}Z R 1+_/T?y)Ɠ*A-k]=-B_N \YTE\Im[k1YcUmnGԔ%-$v~ QI;&@gn),/ZI* 9uagڄz'8{V>Q&sIy+QR5AJ>}zEHΗ\;8g #6פ\.6Ke*\$f'L)nޥ8s4gm*/*o;FeL@c!#pzuф)%=H-Dr&m״`,sG#1m_^]jY!*G)0OP]%'}XSBB&,T⤜$oGs{-U*+ۉ<*K mSV]?+$ĕ6uhfiXak[b z%JQ6ht5JTXۖ!kkUN@嘃Zix P';Vv.[vJV ^oGXel>pR3 H ^ke)s>i[]4kiTd O8}k>ԺƵ(fLiͶWj^E^ݕʔ#IPCT$wr: {L=xN YZJgg)ۨ 7j)jbkBO0Q:ZkRTS<8FʔqN)yhRGŔ+ڊD(j3db(PبTJq D̂LynlJI9N!ғl)E2^"a3Q‘'XjY4c=:O=j$q$_Fb&mWV :xSПf{ƙfvi)1; DSC8gq±+l-j2phI9-v7n82gt)T:#pB3}`P uTx<" ІX's̝lﲕnD(1}bln}oQ> Lh 5Z4Iq%)(tgPNvi)HT?Z(<3^ PҗBy65gAdA$zjƫVa >گXA<‡G<+S(7Vf:3Il$[S)YhB[le-j*+ŏe¤ M }ed\8Y@2O(jm JV$P",<dU/>-iHݳ\p&~íTB"q&5 # cYw9XVmC" APxQ6#.6F$f;VjugG'h^̭+ve|Uz7)yz/WG8o|ZGRR~#;-:>|ZD; ),ϲ))Kʤ`='IZ%&GuMq *I)"d4H2'٫LijZ70WCLq)`B$ ak^ =i.9'9ڽʮ-6~2 ~c꩟afM&4ƣU`WN?,Uu5aM̤ROwڦrpggpHF<͚qtuYǟ$ =O0AIpN)O#2}U5M<gWx)ujZy?S;D~ וsUSS4x_%J4%fuQS{ڕRpvVE!1"AQaq#2BRbr 30s$5C?Fm2X4W+VZ@Z گI,E;z]u,AJFj@þ')N$YU"M#L:]2yO`UI H`jQH9zvGsv2w@rokʲ29G6xtXP3qf?I1&nT :d?WSËaXL5Kw `! '!*ӡ"yYT,]zN$F/#m, Ġ F"$n9ٛgC8YޑTH&cwQk*Swm@_C~존1y g,V']2@)Gs?E[4' ! $3SVU!*V"gO#u*'ǀIxO,֧_Ȫ %֊6; *3ٻjr3Pe_ue鴔$*&< e:yYhwJq({` #Lj { GxSªX)93D7j{T* ÊLA?VpO+lCz ZBT$RrȈhTI=L@JܱpO욪eԪ(cH0t?+VR~zXKVG 1|4Y"cˡ1vl\İTzjOq*GJs=5WʿDYD{1__i$7L7l_l Kh +/3RxR0GSQORx>тNR݀}wm>|mv]8P}b?*fAZXӴ8Y HӞv6u =u6ZfI$(}%`t9/įEc5-!|z` CcA4qױ z},JBr/[V՚fv1/sfT[AyxW"gC(8>';_WEL^t1FjNDt$:'2YٱH3fG-Ycrr)R4ĜXg>ˑ9y^@pxd~d&K> D~lB5[(@3kz}]3pŤG Vn[i;r#כH8”CL1ƂyLex 85RdBLJ*^.ǜ* V|twuĵZ 'b2RzPyjOA?tmEN |S$Q8\V%u8B$)tKRڇJIh ;mpq_FB56i Um+7"\hDFTiQfםve J2pcI9j@ڊ'zy+ BP}8OPBn[%/:+$"aVي}&pz3sxp*I(TBOt\܇*[QBc(ImuYr^2 7t43~YW XWST[gq>g5.mziP#$G 8y"pKQ|ocXJ S")x4V?wok( sH <#juKé!1̔e5:NVz;댶={A9Crt} q08ky{ICzp'6ٵzG$쏞I?Jjuʛ2ȐR~Dkh01x9h)G=,^a2 :gJLh}qBO{Lj["ƝHZ0)DDL p{S$2*Vk<Ɍ ם;a7Ֆ`#Ne7uEt&L2~f N-HJNOϴ?캯ignBIReic#Ut^Tqs*HʂS0K^O<8%jTuw]MPTxOv)a|40B.$Gٳ'Q\EUb#R$3kԻH+1D}OQVߤRHoAJmƻeZڢ{GC(8Yu7Sގv `3ԭM#SS(P%řDpd(vdRՉt7$AP39kf6fj[ƊG2p? J|qTL󋩦e]d-J&'gZU 'ttZ⭼({Z;NjiX@ǹƠFfLζvݵ*ƢH†dj3jMrN-l S׳)G)+24G_͹hԲh@?7-rAJ6;SN=5 >:ѪIJRcWg{ލ)Cd %Q&T _4ږDz!i0.2fN3j^F=V)36kͼh9?r9PR %8+Ԃ^4%}ɣrd-PwJbJPOLGQkfnT.<}t!.7޴\O_h!hje 8rN\btZJZ:CptBBS2dk:i0-AW'2•z0je?PK4|Lӕp0I*I:n{x$`JIvjb2*N<& O[wwʍdqN';]ǡl?T$gkT0) 'OkC)ZצK!?taLYKh $db+ EEHm! '%2`GOf mūD~v%IBL\ !1"AQa #2q3BRv$%0Cbr4Scs@deuTt5DEU?ES4&97XҭlGk7ɦ N$m~NϗO,!=z~8 #e{|(2{e|V6௺.sJǫ׫ IQyca&<VQQ+v{3UFp_xj(ZY8F ucWi K#h-l~-kzCZ4r@w z08'v1cOkS]7eͱRuڧJl~ RNrG [+(n$\m2F2{8e>IAcX/ng9ҮϤATAl ־UG<  \˥#dc$&kɤ mܢ8/ʼG&pRBv [\f̪̭E?_2-&SQM~:qr19e[QmRG}jۃK[⭄J*n'bZaw A9Y?CZ#S77͍4||$Ve_R:=A!|{e9t%b[q `E \lǀ .ߊLV]JRjotz^rg>f1ܶ[Ï<:z͗Bh2kԻG߁=;TSGo8<5v mUD^ckie{ =5 .5|ΞҎ>h=U] ${eE[[Mx}ҫd<,qD[KEy+' /Mu -F{,lHa^A iF͘GYwoÚ*LkWW#>@[ucy[|کISxJ7cimR6-48sǛ~&̋(1zd{p,Eǭ/qF'=m: 062e9V/>?&]B}H΂'F)(mQO_l.{M0&=(4mf[bJ-Q8~1ڼ!;}IdYfTqམI2/xQKt#Fqrq>k$Za1qFTk;~KE D}qf!vm%=ë  ,9 n-߁mG}wE}r^R:**l&Ezxc#>?*K2>qĔ%F08/YD6Ƚ:Wu>&\dHߖcŠ8$m.č, 5kF~1ukvgG]P3n;f3fɎ)Q[ʫ #/b?<* E[<s,;1T&eT{$Zvc[ؗM2MZhN<:5 k}Ż;X"lʲ]R-ȷ 4 j$*oՁwOf9Y?CZ%7>;)fq2~qEQ=GA)j[5(ؖyH۬{xDhFqT ;ƕI5'fuY4^Jz|#P8=S.auiтĞ=eXUKD~QC07c5vt3 !+4d-fJ#t-df_'%-08JJ!zѦaOcn#ʇu..c;ID#'Axϭo\0$-N)-xVF\[Vơ[Ē5k08 .[?g|m4kKP%[@ݘbUv^yw@螬H{G}2G ÃN t՛QFXP]cqpEttqm]I;0&sdW #i7`ÙY%1O/89|ܨx+SϧzUmݠUfUYM{LV -ۺEP+>?Z}E4>|o̕r,,}*xV5~APRt9Teª14\#JK.>s\qa sc 'F~/+zEzg^(rg'{;Db2id ԵGb*gF_[ UC^X҉7f!ͩ3h֦6]ǽ#)ǂS[Ѵj!$cckxMKSǧU}f +jN|OV khK.0b6tenvm=Њ0"5τG)0qUE]>kaEs<)q\Eb# e}y,[L}{({\.cüYsANʰ>wb&}~z?'241Y~tp.1*DQ'?G~1,/O@U6P4NiQ`0S5ELN뼞߇[o[["E4Ȼ[>s|Vr ]$m,QM[ć,1@yY?CZD1a~8QE-*ڢ%7JYU5E{A_%@f^,wo7U܅?7%,1У`ZmrD dʄV#z6}X2Säc]MmF[{۟#>?$NEW] cy{]݉U1<6uИZAxIr2Of'y+ i~݇Ĉx`KX֟$o^VhAy+$hFW1QKJmqLJ" }k2IV&>ߤ='L꘥-ٞ;G6{l7qfn^3 JĈOC,NPB @߈Cy݉gr'qyz0^8X< ̫|\ P{ؿN yQ }H2\HWm&#·-ωτGGlU-U[p$Us{U5UZ)j(ۢsA4MNe\$t7Q=iLoiZ#ݤoZu&^zqUSW0X^M+Յ2C ._{[̀cq^ء oW41TY.5R*$B!K;T\Of)ĺZ5-v/z]utY7FE9E5Oڛ]߫M"S枫cPKQb=Xo) =("啗.v[\S=<{1L򬩨[ KSM￯ Q,YWj'X t=݇䲹e=z 3]ɴqɈڋx.5&wI-u4Kj_g)~ۯ\T Vl8s5:ˣW ptLMwOyt8Nkws0V'{q=d+#>m,1mQ{Hװ¨-%Mqك,F/8Θ;["lplz / 5cIXTvyF[WFt7n1Xi!c/ 5Lf+X{|00)kG& /mKGSQvIeEXw[Ѱh~3xH l|+‘ =B(R+g-6FMy=X2JTq,yU:`O''hc5#ew`Kb1azcS-O){kaUHϧ0Eہ8!iU8 ߆)˼*}+#|J} `Um)foZhUf8ib݊,~3bϒT+=MYn ب<8VvaTPK%*ܭK'}G#>?rMVu;g0KZbj <"5馑OoGn$UXXydz _8D.@S>au+ׅJV=c X%-b8Q3[Fѓ65 (Jm4!z_;8{$u|VRq4YMIJ^ T2E>/eq_ok+%͈hޝǺ4P[,wad(v Ӎqpu@ʝYX'IKqZi^ɂīEd~ܜTrdf7Kݮ$QWg_Gvm*>[#[-h~cی(5:>SPZ|$F"FM>&*)'cPn Vx`Sʮ)?gϣ}ks B[}0R:x2ϗMJZ9;G;VK#[(Yxy_l=.ْDfTkGy<&,Y_Y= 򎒙F{3_z!R rћ:at,tҷC$F)4-DŽ*)i_C{[lN&|p}CΤW*em:6?G I[fl/-ӏ~/W@;ʇz3{ mB6EETN4ՁYŀ|x/,Q UQeQ0]8n?τGl<ƪakŎ fG$5?H7I3Oa)AR>Q#$21n'ΤyC$0qa\Lal3;)܃R H^6a:ܳ(1sLUt#S4UѥL~*{F-D^໨q6@@`-lyk<Sb/Vwb,{\~VJRLuV?cek@n I\=ǷMJ?8ݸڭI3ڶREunk鿙QI-^fg f=C j1N<#>?lSa4gxz|',aV4#.a,O,8h(4ov2ѓotS&'(Oy'E\izITeO1tN SN`>t30#ׁE[JbӻL|%VO,:2n;<TUgrNJwbƭC {o l55'ηoٽ}Gnub|By(E/oh[Dvc)8gϣ}kx&QSw,YY,QQm([Ǒ[ye; dC'T&e0%X3ML}x 4)uzxmn!Ԍ6[AZN̑JɌ/ ]]V]<0CUš 8f}6[$zm nē" ʖ `blRu4_WMV{D65%lJ9H=xOӾVKԵ8iD:9ilIePgk @N6F"}NvGmʮ6/-T&"dž`jci<`_g'Hv W/28jٜ!MW55ܲꑱl>{ ,^-ܫ:S5]Pf2 j3&lmy"#hp<#2xV0m-9AKtW;o2.`q4,^gEP(h 7Ύm5Nݍ]#qG;i> M@,=LqnP2V+S*Ig&%O+>G}'&T=C;Lrimݽ`ㆠ)ZoˤG$wgeԆcU*kя&fg`ݼ9r:.у/Lx٢1ݸ5K7F$Œǔ 3 ,Tqp8T.|&3ZқC~skl3|o)Tt_4nrcXtQ1o㈲#8yw j( TPcHuftߒf{3ۨ`SeWW~3(@t_򉿷 <0žtUJḯv_i9=IMKWU-LXۘ_`s,t@5&_sܻ6p24L]q~Sr2QTЁY~W< ST@Q굏gϣI L?ɫG0)yez{,3G.񧖿5z;- 1VNj) 9mRFzK3(Ira|bV*I[~鹒蒧"6+K7Y4MhiE*X}i6liֱ%1LJf(_RN7R+"K10eT\x>QVTiG,j {=I,Ъn^gm&ze;=I&fG=) 8iy9ʺSnm&z?ŘeY K֤nR/5Ξ!Wcw}inPR0Q_Jy9Y?:=4͢7qL?(c$~qw .^,h JF T5(,\4vm_uTut6暠FƍEݹGž[Y[f&c, qj&-a|~ φeݓSZWo&eMf] A{.=B"dQ UV# JВ~+MSfuª)LQE 5D7RjhaM]~`Sr״Y:?y/}0E|8e?w{M-OZ)uJ: ' +^^5ս7();h~0Sfٔ'-3~=wO[߻ViJS[EO ~HyqZz'<Q\'o/)AF,AAc{M3h@GpIJS:I~ppah\ ?}mչOf(~3[r]28(n7ͩT P[׏'֟MVߏsD? 8K<[H=)E~Gߜ˩Q_kye`}:=XoˮPVMF~O%w&u7Y3fj_Al.?yOA$ T X6SYhe\fsd@CZنd)7~>\+4 FO4|73gGzz7mS̳*x&ر ˽ 5gt̶WF_3[uO cm?,: ~_)!1AQaq 0@?!\%I "^l0OSҍ>ԓfچݒ~;Ⴚ%-# %l(B[KtpNc"FRDHI24?LEravo`)B2Z+ZTsV#)LwSSBg9BZOnLiQ 1[;LLFn&c7y& N'=эAlP8>'6dM&þTPҒ\#fDA֋q2IQypt}< dwSl?:ך1CYAƘ& ٞgAYρdh𙫰=ZۓYB` \T &.cQp` Ux MÛW{b QI,$$hC'D_zW&,BU`r/a,g\ c 'jĵx`bο J RPX7{y5<-}2D41eVEtl&N3 /Nbչ$gk D2uK' "dG8ijzKj_P]t>=be+?&q+O -wb >&Lai0d:< e1AzgNm &B}9n_X ΚS2&fRMClY#` Vhjw?jd% }wL a3oA> ' )kb2e8 C-XPes"w/F(|W,x:ҙA(Z^,yuQs`|!጖Wug;c/<:'l: nkrrӫ`,sWAͳ1sn sjl+{/}nsO5ԁ#,oyi.N͗MpSml?@vR"][pdzN# W؟sYs[<)Ib+@! óFPw({?QcUdo| lZ6G!%Qy 4^7( [k%pΌ{GKX|v$-cF#їǡq5O'5lLX\VL¥ZƑKH]^`6tl^쮄+Ұ3/BAӤqΩƷHZ_i/5.iD vw}XĜ#\BLT?F s\ ~`Wx4bb)U'/ g' jKǁ#\Y7M]@qL`CO wT>>_26sD Z%Oh-V/^"07&ɠ~ "GPdxHh֩%kt#qYH7d ~f_L}{T{~ |_~?$>L3Kd? y~[f(Dr3kGe8đvN JG8d|D8Қ]gvˏHW{oN+ 퓐DztO @Nu@wK[M?q{NW픉9+6qĦDc؏? Xvm/~?$!~9sA.cL;:=as'^=5p0yNҔb0|dh =6cY>t萭7@GO-HgUgoFT!ěB"L LAaN+9Nnn:0))#NrR~?*񊔚g(4e6-,1LݞXO.{-7{u8)mzoIU'6% +@IWu!Gv˅hs`ij6/ Lw9#9 |'ֈ'9hl/.c^Ct!t~LW+Rxt8odscdqH= eM~H\1ɹdNUB{4y!_$ℽgk4%a1] &ڒgwyAaWĂ=ϝ%:`@[mam+;Vpo$ /%Rk$o"z5E UHQ b9>zo- L_ReQT|vG)= Ayk+˖.`R|ߨ͙ =?݊ :Ɍu>GIbr 3rQ9 huw[oÑ4 4Ʊ0kKGxq ]+JS-08M[?>d 3F1?w7N$U V3ǯAH:?vmJgɽEW%z+ϯ5.9(lCj1x`אY (,>1a+ 2;!w&,A`֢f~G IU*$<2cz~0A];@ @@%(@d~ePF0OZ +[_Ni#"pQc=Ce/ǣ vNβfNTwLqYycs φ GoipF-(K>HGb`tIKsC޶nc!/>mJ$@l: 24puC-,.Gd,caG$zS<|vJ% 0<'^` r_GnVaF:qLf |e2ϡXtx=SB.XU/.*HP$\< \?\}`\ĤxiyDž;ur<] <<:gq*71Z7 iu:@Zu1}~10| `j 5+ՠ.pAM{D/$9Fƈx=rbT;h?СF%?էOxJrBW9Μ%O`5愎|Hɛ< ;m*\~hM I'[ * yE$0Ny;vz)c\|5-EA7) EeP޽ (.?d:FP6ɭ=. 9f$]1"mɷ.bi v.j8VޝQu?V1J5$rJ;}`"94z0GD )<`!'!t&2NBf6>X I(eFDOA#k2Pnۤoʼ0K’ڽ\|`p@"!G읕JbZ1=#Pdm}Gܨi!h"9Ud0E>˼TM 敉`PKq-oNu9h&4jբeDF1G՛4)$ 8tɳGc8䜘"mF|'rOr~Aҁ!A\8y**T!7NS-`C+ʎ-A4~ 3˧gm1s :^p^Gҹ6A7؄ t|}a'\ >H.9*tɌnUz ̫lk `Bl̕B~{h8ݟ9xT(SKp,_MmNp4^x1_(f baua0@9i+lղ8k=VE,ґ քiM„{eŎh24[6 Pf>Ð@1" z%0Ldc35=V fUȦ7)`|YɅ߸,w}أ|c*N?BxLʯ^?Uڏf%_L!Y_ g,2'WRDy,L'Xy\2vqS#~?#z8>|MBqRܶ B_s` HSXaϾ!>8Ca?DO'Bvf+w?lXBeᙅia<1{{ ̖1A'AzgY1KXƔɡ2Tp>:0H2ϢP(9"ʜПv} ٧h"`"َ Ī';qfl3# |7cV7µZ psL8C~;sg?pAã{i0 ;4\(@׻Z3B0o9-7~u2sda6n05M QlF->@âe9 xMzÏ<~ .sbҨ~0I,grex%TZr]R#2%ay8T2pLJnT6(,MoG gJ?f[T1֚=O d ;D;LFx~2I%=!Ȁ( < (0Q"9]Hv |>͍K5(&A=|x#G9{PUqR=,ԅCoL2 rx8@Գ£h&mucuj}'Z3(-|-5uW=2s,EYquݴ825_ ejN o.`b)yo~t `M#LqpP4l] QA;cрWU9yGXhJ>3hb,.cdH Ɲ2#&dۉ. a-+g|>~sc'F8]qKBJ@.-F{Ė%8 EI" )?zdD<ײ8AN62ԯ9?f&Asi\SL>^G)j O|,z#Hr~ߎk l?gX$ ]?28TmIٶYWpuNN?n\mFM(0Xe Yd&C$l΃XGұ꼨o] BC~NoV;{~>q ?@#  ]6 ߋ hOUA6"|v%C0xsH"{O% dO|=#Uw@лE1i03~ë7O;6&"=d~`({oh@f9Bcbms˶8sʪ!'La˪ uKuA4N0d]x)k2?NŜ9GK9T''mr<932*n\}zh࿝`F1\Dr¬6_bg+yBlͽI8};G1:~G5)B SeT~B{>qQutC2rZF?ͻƝUtL0NkD~ }f1@X'InwIFob;N6S{K@ Z= r~)߳t147'Lyo*ĜK@Ǔ;1~ƕJ\"ZLǀnM&iUL|#zܾZwD(g>uIhɰPJ8C`q:LJ0fdj{UYw@EA@$~6lw c#, OU/vz )8Mk(L_{B#y;rg"n,D:8zϭhWv۠x۰Ͻ& J9O9ؙpP#< o<zcyV$\t!㌼~"3~XgġSb6AbY3,~!>9tjv*bnEL`]LpO.65G] k$ډ-zx4C@[IU܃O,y2HIVJߩG~m]˟+F +X/I#s?OG`3c#v$EVgjgy j-0|`uL_2s ( jBPqHŰlNڍ@ Z ͢@ 701 (  ᇃT`4⚵9B32k qDL d6>qV@@;r4C:  |#-R^D싉}  ]C@ H"Gz)DB^]:x8P@ Wg}@@yK4IHHKmA\@y9}DI`;/c3"H00(!1AQaq 0?M0 P H&~e"J7M A'+&ə'܂$s8 @=C|aQ*D2CоЖU_T\6؞Z3/S>j/`ͅPx>X`^8]XW %BgA7/V QBŁ5"wV8MKI# X0UO!xo(}XQt_G,sGt5d8~Gry@.WU(B! Mk 8 G0#} , a'Y.XR2UXeZg&qxS2 , QSI(G֍<[ ˓*=ydx)&M9Ƨ`c>~_?vfYB>پ@!5Lk3 ]l.^2o&D* e,З2U`7CXF*H[#4҉"DK@(3ʆdULaYUиUPs"4Cff|JuQM$.ipeᐫG}6҇[ $'aENA& '-E >qƕ!W2< O M3?&Ȅċ\~ž `}0W4i~?м=a%Y:%Ʌ<^E_tMohg A6ĝ)oAx5iFytMp*ATw5PyMWŔvx #ێʠI0m(@H*8/g ~#v~D>/r ;q!t"pi** ?nխ ,%aAH;L Sm71X",ETP8@N )Xz(b^ "^P7a4#CCf0AZ:3 @r}`S&",&GO(a!P. gGnXY{=V2`V&@gA2hL9*^ SuLw&A&4Wl.d B"Txb%B"mH( J! b Ƣ%ACU,(pbE h ےs>'犯I;wġP,*`CBG(T+@܇m>})Rwg ZНQ6j#8N(mlCYgrW%1%1F PMյ}2:d.Q/x 44Cai"QduoQd ?<'#Ż#bДhR2*ʱdYL?'!1AQaq 0?#OҲ@WU}pDhpDmoTi$x¾(R$UP@#r`ٽpS^U%er) H8VT?"=_T?;!%j Pz ;_%ߓH&%E/ɝ4@-e @ "䤒bk̖<;"!ʝ N-+-PnpX֋,62|B$)BETZKF0uHA}gL5VMMEX'R }C[~zgq*Uan;{NJ|=b[(X*p@Ip s A҉D=sFU^ h$)"\"8!nAzEz K9(5D=* *0q4Z(  Jkht{>(T_ fe" 5pimP>nX(* N3 A% 2J3D2 x$ks욁 Y &N81@Z%Z;qbB0F5) #%aV/L3rDEez?T(A&P3?KdJ*\ i N)}rB*" EC#*heXC<2<a*H7*_ G+ӊ ǭv"3 I'r.Tp4tqt"%* Tpv l*xVFmT@ K$tyb-W^fBU8yIE=y$HnӞf] 5TVpD#I{,-m$o1F~96~} ^?lm FC`RUtIx@|Z= Rm3= ʃ6]!S0 *QtOzAxPV((O-!&H>l\kV!:w6& hψ>}I G\aNR$lGIGzRstuR|TG Ka4U.i\xd;"ɢ` LOdC ,idg,^&* Ou=T B/ax5?A g4>@Mu*JE$T  񵢍s4@nh):ס㍝b~C)]9%!t]DӺQ8H!TNj_` PJW;i֮[ٺ_`Ebԯ4$"#ulKtxh !/ ɽ&P%eU*S%()3 ;J@ sQpL\YⲼP)káj(ñOT c,)[ȝ'gP ?O(w21 1a:40j# JPRDB64`4pBmQ;x)lx Zxu@p!`2I G%}Dfbѝ[  %Rb>82~ZׁhUu)dp dfнbYräS)Jy&F=r@;F"5= */J\kb6̪/5S>`ǤvA8h8VCʿYPS N9jc Bj.U F6,@̩!zSq |qHh\ ʃSbjF5j :a,f'HsD1 | </'q(G`}b(n|"3S}oMaD~jX^K! Zؑ_qS+,IUaJh +`3ͯ! zaG "9AF{мFUBBJ.rۖIģrPMV ͌햠U q ]g<= >TCBh9)A-;s",=L:3C'9(E;UWc0,Akic!V6ܐ'C,2ҰVS{ 0C?y|e X'P<Ut2\(D e? x. )>B-FƎ"0r<. &&0"L2DVW,_DȂ"]l Ps a_X'h%Ê\KH 0fMUUUUUUW;i0QK Ñ .XPX,dKX8ϴ!ۄW)q ` IAeu!BpfV`Ag3,`{NFYWFL?D`%hIr Xk^׍gO"L--fj@F4:jxڡh#`RpRCz:ʺ𨲗:91z"Madeཛྷ*P !bv/3s"v|LZL)r\$\3A2(5 h "vb%Pej! @f!:UeLISa] “+!5H ֎S3!3U: Ϩ+u@ MgEBdc|>;%NXԼ$ 5 1x8E e%+ ȣD9Mt MF_oB%ᛁϋ :Yx/ڃ@`(^Ibv* xI8fc.h<)Jx9UCOGUl^G9{NڂI v@)aҜTw)+{PQ6E ДZb~ǶewP)kM.fi#r'$dϲq,leB 3,jMC!B2%L'2 [tu94>P, ȺJ]Axu{%9,;\x53cSʦ(8󝀖Wў s/IUέ\-3[iؗTFakxFE&*v )ԮF!aN8 0+,ajcrf!', 3ls㣲Ï'+}=89 Mپ2iEh=|dզ0 O0:QGD >;|鏋h|qا Qa2{pꂤtvO<==$JxHe]?\D*0"A `\'VjXn!5I)a@pv=|9PJJb*m-lmԣ` !B5( Ӹ2 Ik90X̰k|0 ULA'cbٝ/S@(Y1r4a,D);T?띲3:_J,vU+>IaUyfeƂ")-VbXtx Uq$- /bgؿHZg\tLt< ç@b9/퓞բ70!Sv3=ӓhNi0K՘y25ãe+,$̺>~ )ӐQm{#/7WV`~eV)'S^HX`4M-J聘ޱTpr (9D $12ʨuMZ/-r  M V(=?̏Ȓվa#14S ~|G+Q*.Fp6>}t}^"4cɎl\r73̪m&2iO?yFD[ bu'#*U6A=/(vFVlL U3E#_"hPCYNti8)FD z޸@ge2' Ҭ|̯2:fo~ĥ.x{ȝ8A|fڢ vY, MFs.\B -^X <T[Y6ZRB *!Y {mAZSTHPe^~w{6]D I9GaO8 WP`6l`O&FxiLQV1CX\u i\qvG}ڊ&P &xKk1|‑($M|!pD8~Srv d1n1Qf%ydF+)֭*Moz Q/aaIvɱp8x°v0LTPLM)`%|p_0jP4qvC&ǡp/+N')•s,=K|ʮg  ~the(V1U"DG|œO  en{m;~iU|OMd9uZr+<$%w/hl} ݊ЕjX@Mek}蘛G{%OZq8Lg,KiAHW? ,M  qi+6Fp!-0ԩqƜ&^m| t C0 !+Z"Z6ܡ3Aؤtji*# S40$ "y}./uI/v¥{b|'q-ERglr o)r2%pi RW-A=(!Ř*‚`#A1]=4be" f|#W9=!-̠qYu`1BUsjJ?+Pm"m# if/#|5a]y>YVk30J(*<lǠ c"kx.rg16+Er=|\W7xSɎ=;!|?8ACfkFF'3A0 Fe/%Qm^3(D"@M[S}pXxOU! 8/[ x+z <&څEdͦ) P0(1\w-rG:akP 2YK f(!kl*6e{=VkpI]8p P%\`;u#LW//rop!Qìp,";a6,ؠg V|l*gk>.!PXGdl<' zV*ьP3.r2ecR=֪>c@"k > IF!Pg'H LA*tD~(Tn6p'*:\ S- IQ@JVf96@:a*W. [M}[b\|RDh6a\e}#Sksh-?25bDa G iagswhOc9۽!k84Pkp)xo/A3ҳYpw/XH`U~ߕBe)MZ Ʉ Xrőق?M`t# ylPa F0 P 8piE+ ;$)G[DqEX(J<Fhmq@{Qj/.%5/'zTP8 Y-9ΆdV@ض Zn8*O$u0b6=ڴTd|=s+m2 F~ƉYxyAJ'@ ]G ( 8\dM=@28`Q'DW$Sx?IBu.<ꔾ 'ժg\3 rB1yj{ c+e(Px:Xv~ml5mwQL8 3CI2d4rU 7Q^ȱPuÝ 1is*1 2qRSUwu.߉%GC҈DD) UUs,*,LV[4-mYKhEx*FPe)JiQQ.R'`bNU:S\8v sseDG@R'f181'-îM'KP"\ak-- c0)B0:hڎ/ƍ#qA B@@t$J;<ђ Vk}̼P'\_"JYv' W:7qG*T/s)k8B"/UMBCy(OGh`q22(2K+TJ{15f쟮"̙J2ÝIK7X2%@Ed[m.xvgH觇Rp5w[7dW324 Qch0"LJE m8" ?gso4$C,rLuUr.S$F/ @Ja IN(|pk`\C .ĻRQ6D+&1mWD&oVv*!kT?ٿ h.S۲cIP2pf4V@Č:Cuڱ##JbH/1SI֦1Xv c\)##5 Е:3Elb/nlXtuFp9JU=s쑽Vw0bl v#ȎiCXT$tƀ^VKΏ\˜UնeO(w͂q A="OH+2ovY3p )jZ`:8F" 3qήh5ʐQ@K R%W1p8$!"۫^{(2#gJB" 8(ڿ> ܓ%vG%X 1Aq[S,xrGb&$ ٗڄ@zcs*@U4cu`аdɋHx $L#<"8UPu3:o0!Z410p/KgZ.lL'?LED"`AqW&‘i {v e8rﯕfU$AMHWT$f:7_9I^%{_޿h?*AXjD>rVIpʩbhB+Ibj0Eh4QJ0Cc Ej'f &wZ(zǓu4'547<J?IyLj (yN:&A&'-"hC;)Lhg?:z`oCX% %b9{J\U0)`y8.C/f lFca8I0H<͙OVg* Z;"Y< 2FR^Ro$k%u^^{LPb܍kr%VpE0S I:x pA Vij8]|?8ZH-ڬK2ơ"*H\]$tݶxp Z 91~ƯgT8D\%FT6 z?ا+I⢱H+캔^GFY&d28B0p&Tp>\ܻJՑ\@HpqxS·<-3Cg\laLD1" ) xxtQp냵(qPN4aQvJ G VG9P'!:@d,4z!嚽aCW?#[S C#hDm1"qB-t&̵0Y p8 >tÜkz垎Ck*(T!@Cs踴} H;rz2N2Ѣ-҄0nHJǪe/`}7ℿ,{4Hlzyk!j yΖ}ҩ<}ߓf) ޸`ESUr& kbyCK R`'q8uPz.Axȃ4n7˻é2jbXqӷ E@GC").0l:8e6X }sR髑n +) dF$ Ebk#hgepet.^AރD` R  H0 $Er` 'bYʕ,xiSh{TDh.hD y2ix  q: tgp0sg&pX=b]CCDZWNzh J29y)5 WBt`0 9(8 TJrכ HCZs+/[0+0n0Īp:q% A me! b0"p4Dmq,10F3r\XhOD* )5D|E-LSA&|Oɓ p6G'.%C đp*Gǩe r| > )! {8zR2$A^L4@JZLo'1y]H HzH_ĔQQ1{IT#40h weN*2&W`مqW$G袡@-HDK@ { A#1jk\-/5'!VOD>$aqqZ:&ʶ".tpt0a{y=.hTS*Ϟ@ KLg"7 {8)ŁPmURP6=svSጟ;}ysUxOw|!8& \80Ge-<>1B?.`eGlYFb X{mayavi-4.5.0/docs/source/mayavi/volumetric_combination.jpg0000644000076500000240000001704512747716313024427 0ustar prabhustaff00000000000000JFIFC     C  "  /F&3A@iqW eĜEsVn]ّqR1q-bFIw@m7T/omjuO2\X4~rW4]r'Fg1񜿗ϭZ{٨x[xa/~_5WAuYK5ۣ۟nZ7j윜i~-曇oԛ©zs{O|ۖU.`(>{ Xכ'H}{d6Q{+^JE|.|Dlc>˶,u-#:wm/a>ˠ۹O\kvSl6Nk~xq7oX}G^מ@(@! $0p"Zyu 50 ,}kf$:G=S..WUGn~ s\{$.#WbsgˎHI j^YcoKrCŒcvPqV_Vygkҵs@{%Xon ikKi"+y; 12ANf evf#l-1dO nFuwecrr/GJu-4vˊbpƵ9~{5rNp-ax*) k4Y<}ʢrG|Zt*Ic; Z3GBu X]Iz S0$3@wC"|/.^lvs:zh!";RfHBS;éwFNO ˸~ld;`uHѬYW.z( *ie`K=qX'c$@W]֩;إ4p_[bxҥ)9WVP16h1-°FӒV3bVdV9O]X%fO[ɺdhdm_Q*Nq8y܍H2Z.ڛJ oqlֿfӵ#WeBȕtdN5bx,WuL,nEr>F[]GzwRJ5bcק@  !1AQ"q#0BRa Pb$24r?(\Frs3LĿVSI2Ô$I;G߬Ne:^LCǕxzzIwH?q1PĔWS I{s*Y1Q:,TfbG$\~XeSxwO,>A dT\C JHg 5f@uj}F,#nK]K*AMz&7lE=:j#}"K J$n_oE7+ZUQOj 2(iAC7 +$M8rQ1^u8zcFNݣ(^;`^ΤjK &gÏ@+H,: K]#W⟅⭃%rf6+YMpr6cNJ7-3Nr7X~e/P$KYVޣr{ѯ b ƴnI1\N#䏗@_L6H+C4jMLjf9]}լo Jb:' {VG_CȲ=Oyy3Qô-:Ys̓8Lre[y6*zm V+ѢSlO䪝+eW>ԟr2 XyzB^}ג_fF= !1"0QaqA #$2P3BRbs? m~&}Xڄ(T΍w=K}efÒ +)>"E j]FoMt|!<殬'>όU 4f@6\SCuΉUyx1|QD칤_-ZFf㋘m+IQtD<|bSi8n(JaIy@_%? ˼?(ÕimƕbR +T1|e9Uq=8v7c?a7X.FZ=,2\wuT=5{eUk^8A4YZ S&e c'$LMͫ3c-SUh/6xK#3Kڝ>@}rOITSÓ3\f\Uu\No?D !1A"2@QRaq$34Bb #0CrSp%cs?0oT7T6z/_tF (35QcCx{_8khRnW`ǶWIaʏ>x(\.< JC]pVYTeSw-FrKz$m_EQ4lF:m/ƙKz̪4^` {U9.qO`;#aUznA|)'Y Em^SQ1⊰Orbc4ٸݞpNM)yiW]KOqʐۉ)4MJwG-ª?Up ,'~cIQId1,6]MGZ8:" U#f"X0n7 Xv˳ Q 'D0 gXǜq&T)/z$qlPucٶ2=ъm:.ǾG'RrU_zYDE.gJ?&BQm鉐zhnѧE)_+ |.e3}\jOմQ)t6£JŽg}iʽ1D$M<":ERa2$ä})#~B+A©YOP*BsF諲'Y~cFRQFYvB:F#JcO !nW5g3g.W =fBp) ?.pwqmUfJD{{f\Vg$E~u>P%decD6} _\mλb\ }ŠAV\mEVa1u!#S0L\~LF4KJ aۖ2gSt! ovrU*1{5q;,"Kf.9QT&D7/ˊ Ro5glefkHQc14 IuML퇄?v3_RRaT woq \ZAa pwiko f؎V)XR2p[ "Bf{@nHsRY[ (GV&ie)䆅 yK`4"ӯod{11UkD)Ji躡Q*!1AQaq@0p ?!CTI_g_e~QHCt"L!r.;c4K!҈n]%xY.mm”ӽ{WW`qsɩm--0 {oW`>[?0^C^Je @f[|@^ c`0s&@mLLZDI+-mQ'f&~)yx1C/x93j┪$!{4gjmp]Q-Ǖ+r0! :\ IۿX%E!-pvZ]b4##p+yB(v8f]r*k.heKbaظňՆ!C(5J//EygvKj91kXavMz6O=9u(g)^3mK0i:$ui8KQxX<@cAE%=4="&3aݩZ'Ck-zG(ȷzs3Ne%DZyq  ?19 gF/y䷅"aH- (.;!C"{X!n"^pW;05q" L뗌\:;#12Guӧ-(:T6xD)%}`V\NԩϢ`z߈އ@=5^'Ti};2Pʜ^ݦ&g4uLU9FJh5v5Nh'Nӫb~u'pBymH{EUx(i}RL|4a/вNws֐uR؁U@zJ$ =S,rW-; #9U3h(>ዕi<⥯ Jʸnk;wz5o*O3c{9Wao aA).>F 0 0D|nȯ+(G/'h 6|(H%F4%!1AQaq0 P?0LI]*+ǫ/cYqEunlMhѺl3"|u\~M }f`R!)aRR2֋&) L Re", $-d")7m%L_A:qɞRegbQEЗq7ZL[hB %,x .!i.ˋ>E(a6XbN.o->Q0`'w.:WzQ@ ,?&!1AQq0a P?2(*жSR1(Lz 4pX,q4$dP| vG )t!R=jAOK<A%IlB5j@",‘W T 5+q bj蛑M[XRYfKPeG%P|'4 qQJ Qoxi3EodQԛ^v 2, -ar/(p= ]ŪS{9h X)a^Q=1 l|Ct8`"hĶY KsH"!XEYM fr-ll`ptG$b;7S' Ci19\/zT> Hz+DQ9(Re?)!1AQaq@0p ?aEH\2YhIBԍfrraxO҉(mpfH)Sz? ql3 BRx~]!% l>?BҌ&a"5Dn67Xxv $ƛly}?!$ $B䣠f'tTLnD4* c,cJ\E1N~#bG'v*}cHM 'KM;V0H_daU-''sw# LFRⷛD2X<=c͆[y2*33K]h1+U:Ϗ4y(:ciH`m[W[EӡiIwjYx exʢΊ>5Xoz0Nh/zy44;7 BJFh7XoWr)lIJWIGc>|fyuz (V:HTe сM^F8 QqYP.F*%!eŐǸh0”1uqbnr,M4d:؜g\ؐ*Mc ^na'STmUq0ED H\Y?֤:l nZ͢[Ӽv)K fMt`ZMl.]]h0|q2'cN2׿uՋL|70bOjNhww|3$pV/Bs%&n)*w79qM]r&f.>¬z+=őgf5"%+ɃFc߸\L.3P`%I9JzvB?Lڷmql.݅i:=n&Έݖ³}yub9uKrvs|?1"2Wk|~k4n;Ra㽓g9piG>>Ϝ&䯙gVԊbB龋Ù$ZuȷM})/˯1.,ZkYoJ ٠5{C9)WKonV,9̈́ d^<om;QH1}]W/->`,@0! 3"$P`\QlFg;+\XQ򹮱G{v/lp ^^T,!iϗ&;S#H鱞◗y!b ?̿EL+a5 ,=1(@1WMl.hQƴJua< eR:CMtv8 }@Yl"6BME遟_&1i6ZyZhlwLA5 B .Uڅiy8:#6N0^Ls 痖Bّem kCvOEأX 2! rDqxaU=>CIzK.fx22#[ϱF 524Wϵ{JܭsCbZӌBCyޔn_%GoJ|dN(SU[ۖZ2[! eљZGDZ-jY"QLrr[G 0 5j {T؝Wq;ہM)mT8IJzs* |L{8+N>]9SPɇܗkpe ]= !1AQ"0aq 2BRbr#3@?XN"뫬iZ@ˇ6O͍u,befl#!Tf"@c^K;1" :b{,Bܥ}Lrs(WB6lB/_XmI6'6ψ]zR.J\Smv\DRril:A}/i̳9KIVl&&xm Jnҧ7RH"DW6V6ae*⛏QCQug}Ҡ7~5PmÈKЃpb1-ĮMb]F^d;L-/_QTQϬ!si?P%+=&0,ԝ/y|[S)T{n5T&THjf]uM6zEH8Օa ړ8K +G@PQ)%Pytw<hͥڀᰞ׺i[薕ޒ_ sjRLR9Bv}M" &ۢIF0 伪2 IO6keԶ*#`;zÔ$֥Kn3asoae*d'ā,tB',Kl8ԙɇ-nYFb]7<DZ>%+NU aԺ7cLPr!:) 6G\iy6ZA\UAOSM:C/p|N}?5 !"01Aa 2#Q3@Bq?}J =S$5b;vv[ ;9l%. 5Gf.SR ) R%SV;GoO0u:_DqFa-2PM,ib;[eDjlT44PZvb_C7UUSn(0N8涼?tl9~d(Ni!s~J\:{U8c`l#DHSU3df54JF9)*ܟULeZ 4XptXu!;\ \[s;K9͘W+-vMh4ϴNz: XAt庅9֐am?{K~  R0,cO) 0 I  !1A"2Qaq#@BR03 Cb$4rPS`cst?geRJ<#Jo?ge䒕[JS7#ո(m"뉦X *UKx[st5kI7?Kcx)6JemN$:aH*e6uo,2𕷘FSO/ߜkCݶR=fNN i{ (4AxJQ7J{bcSW0~9bВp}McRq&ؐlD8l6s\kR/C,uLoD>86bF_S{w%af՜,f>-V 6eWyO#*@e2{7 ?)S%-eʥůA$^juX Wm*+'\AoaqLYҮYi`S[tJVN(Tr3NM14([#mRx٤%uK JҤ$S$F;赞hꐱ =k\?O3'ɩ$Qg'1dloҜĖs1 'Q<(kR'ӝk۷X̌4ґr~FǠݲ,T{%̌v[6V+qmSRai{s:sEm n]=ЩfŘf+0hY. #\P -cP/k|ͥ 4c*q-jԮj'iR(_uky1:.a2ϲGƜ|"MiiɔY oM91$%i`U9bѲ!Ѭm8SȎa6=b?l+xsrM\,pvܤ¹T%'i͖Bthɘyk%鼰e*C`8Z !GZ\KP%P6?X\rU X[ + bl5!߿򁘥/9h>K^:Qӎb*Nyeop>T2&Ne+-oy{C~2eر mAIP L7fV+Mm\U{iqC7F 'a TN`cDQ)o&mOȶH(I 4TX11r# 5)$()z/q- uXl-F1b 7 Z;"r?7&.Mي\=l21K[cզg9y#S6Gؾ ^uFlvNWYM$\ .dNew,rHFu0Nm 4a$tX)=iQ#)%z~<KR$<#MOyWv5ll: e Y@P wrF}NԜۃ9#X\&Oߣ {!eRGlV$(u_S3+.ʶBnh4cJus~@4^sCxLA@O[ymTGq|eBɗS{pA~NV^rP{^U+Dk }|2q7UBo>aZ~6Rt6.|7r\+>pKk|[+^ LGjM ^Ϛ}?I^$Lk3+J^}/'lT[G5v?SReT >n)l # C3@Tŧlq&֓CE_DeyG%}ġoz.@k o%+ J]@U\Xew#>ˏ'O/t̼ZrеX%"U@ /,&=)2YF^={cIYfTR.aRf].MsxUv𫁆gIJ^i+HVW Op} ]0 ^%T[姶OQ9}g*؅'3H}3vwu?F0I^Ĕ,'*!1AQaq@0 P`?![:} {NFR%99`,C)+4ܴWl9ȩ?x8* >Vf:Qa,)}^œ1XBfq2J=6d_3h;rҀHK9c^^a6F+ȱb0BLӭ+" ǨLTNHpOxP5"Y[[,enlTJ$1a,,%Yg.19,uy.B"* 푱 .qsYFt&J/31w8}/d $$K!սb IkdɊ96T\gbaLϕ29fc c ƒ%6s|兜9|z(E Кє1NDl=@m  [aZd0ކZKҎljai~Gz'v8yۯ7ߔt*Չ$_pNYncPl;/ũyH<`2q!U&!1AQa 0q@?L8pF|ͽm1>ӚuуKdw'Z?KW~~'l@n /{YEGY XlL3u簷>l!(Ŗ #q 7l04],3xhc _:rܵ~V$A8pdVNK!i'H*uۖEDDf`B Pw!8GkHY&9DZ"`%8Dc _bI%C&a;yi-ĔOSӣvN)s ~{9V ˤ{GMavܕT!̇w H-y^uNhK"Cݩ }ng%8!644 g6Ә,{b84'j!4O`=YFO6$Jd!=2vb=8ڡ ;lOjT@@% eq3بK$Jc={cS$݆bHKROD1}1LK ۑ?$aኚLk'NFhp^w'ua;)!1AQa@q0 P`?rpH"y++Gg֧#,tC*{=G7`) E]6DmiCD,4meyWBe* }}a!nB"oFbOrQ{a؈ϜME$ֺ P|H 41]8Fd5 5af?9SG&$[j >ۄnH-]eJ:v @b O:ñi&oc!B 4\*TLc@'*E ! T(YEhY te{c(0xY@lO8gWB)UQ`>wM Bqpآ=^SM G7iG n&PqUBQM<\tv!0.ag[&k+>A8CB0/@bl TEą"!-I)qEnUVp80e224Н@ZM N,A.1y2"5K}.0M+*V ja#;NC! xdӀ- *GliмH`&hw2`+5K fE**E!lV#i[@oʬ&mMVZ# O-Uzo*:MGpk +شN¯עf'"6)6ɪS(SٱX*PBTy;Jfq)6; D^YS(B@+\+<1nf\H3iR_n0"؏O^@7߾j5HH! a(+fAJNi˨>ƇV^~:vNl\a$hڭ,x">Ƕo]zPـ"8gD a!F,W&HO@D s!pho>sUQ(Bk;I^m8S01Bͫ& tSP&4&D=`Ay eITnc+yȿoyA4tkf5= qE^J$\];B϶ F:6Ӗ4jppmVO(: ˅SP`'=BkPcbQQ_ q;cr)p@}EnH)WLovpSV@H -1Zg-@ٻA@((JvfPw7)~ uz&Ju< ^pA S?@ǵ0UL|B&7--" d+4^-?thіVhkmRW *QQ)uD>bd,G#U Zz*p$$Zh{ko(48%gu5) !8@4"YCd*!6]IԶ )J)$1$lbcD^0τ*$D@j \٩Bj"DnX6'Ep0X"$U ȇ0do63|l~pujG;![sb_ohSˆ@ҦG*7xeueLOϲd~ztsMJk9_׿H! ۼmkW9~G#GF^B( R*%:B|d-3Ʋ$7,洁PYƩeEM"slRT=O2y4T:"o>X4X~Gomayavi-4.5.0/docs/source/mayavi/volumetric_cut_plane.jpg0000644000076500000240000003256512747716313024103 0ustar prabhustaff00000000000000JFIFC     C  " Ƕ!JHRI4nQI3 O`=mR>mޯyfp "ĂR舰)I'b&塼m]s|Mb[/ 5rU|gu e:Oy+,\mTC_Gx8$z_AÞT,ڍgي @h׮|>\xv)6ghƺ>}7|:e1a,+}UmHh?OG|}|5W`C{οO)|cW?{SQ+,+ P]g:ʾ}rIcb&_3d%Yۜi ;_XI.Rť=ۊY/'P{W`5duQIGܲv]'HuF&c3UU/%B8qSFZkF6A4A\* SgYnHTr~u F&+"z뚘</ #!"0@124$5`M[u~^1 fiKکǩ6F/]Et̰NDjh9uBȡΖܮڱL:ڼ\I72_hd-dOw~΂!4i 5t;AE Tqhck'+6.ꑏ @&K)6MSE?ϲPɫ' [6z}T>ڢ`[M)WKD~}KR#OPԍyے qe;Sf+~f TEADI„5VkڶfC9 %ZZfu{6ލO( rJL孝,[Ya.&_p6u j>Udp,kD-xK:kM'? sNugT5( 0KlmQ^]ʜ)1Bioz'{څ/ԞwT[⾦}Qޥ7^$;T! ѢHN tWb/0+&},նGZMW! cb|VNP9t:k)>fdpat\8,$.5fӓU=h{+{S]w^KOc*"h"P<J $k-^r珅D˗4 s Nru'nA3UDR q7>46̇ U98})E=׊$>?ٱNZ +\7y6~"d͗͒bbK> rM)$!-UdaD1v:v9y Ґއj}ؤ.\SC58cph ncϢ`lnIFnzr%niu}18aqeqo Tsҧ&4DLo\)x}P9t.#IFe5LCQL/ iO@8uC+ə̅DEyPQ&bppN\:AR_&g"y[=#cc|uX٥⚬fK6: 4  , OipdwXԵ>RoW*//輳ZΞcM498~RSK= ׫ųאuؚ_7VZ::ݗY͍Qw>_B !1Q"02AarBRbq#@%34cs?g &\dG!4:M9͡-Da>#Sfr%}UD) b?m m`(W֮NW zwM,=TdֆLd$yC]JltVFs(}Ӽjg׃kRFuv;͙L]DǞPKMVLc*x]4]R;FJiq ZE*9ގ@# 7ཀWѐ u8j?IXX=iǎwGS&x@l:V4i {xʦIØh8 خH} :&RfvZxI5X|9> !01a"2AQq#3@br$%4BC?w ZXvVf_PS-K}J?#Ъr`7j׾42Eev'9.JTeu)2~=yirBEͺ9#3"&9I \w-UQǘeZH~/,[@}/_&]Bx/##*XGm;#=:K}ٻNύ(bJէGWVF~1s0Ca2F10XMӚJɴ>.%=yoVZ K)rVfW[a YXLG3I0S+DEn=n~uMN*UiEz);>UܦeV^ 3E^ܠBM):>cA$5o4ꑈݢo#Vk*}Vۡqd-gbLq+ ~uڒ!ha^ TUaJXO΋JjJ.lSg٥f8|y6}}ȹ8˓,LϮڱXc>|xSH ^gU2lz *0y;~o0u4Ɔ4ƈ¤zu{eJg֑dvEH-MUZfQ6ˉOvݱ]e˂Y>* =ꗒh2[XAש2r~nnMEa Sq|*8u?-(wň H8[ܒZR zKiV[!+ǯrbPBuN_XibvMm%֪)pMT0ʪ2skf"=m:e 3hLuj-}k)PAz|ʼ,JcMm/z6zMtGs _s&`E*zRepv:|혾Qe=ny--BL)9;28{U 4J[ %b>yQUU ̧c=?Ja9SCVk+ aGBW)b¥<>alrj}m xy%]љ]+ 'H }儥:Jmh%69S(,Z6̠C!*bG HN)N0)id4Vl`8!# Cy|/*EqL Tv#Vg(mF 9Ġ9HRG?FRD)i=?1KDˉ9:KOarFm3grfG\+Wb%f ^m`RF-+ILL\ˌg#DZ/ "7ǶS'>UKwgGc{'l.WqdC+٪3qeE&WW _}x Td}('^1FR3қ-ʙcSƆ, DiDI֦9H:)DVPKM~ WE`0$iY/\*P 84ƍmDʫ,2*u =Z3Nݺ1',hLL3>0up4^ eQF{'kn3?÷V}Nr`1^ Fu&2Qpe:`+|`ݢFq[fpe333ه$noiw@<)<ۘc0-Lg*M N 'T~QWf7G m9CXe( xJ~v\ufo_Iy^˜ƱS٢3Ū/oZ%eFq0*."X~N ot//nq7ˊ )ѳϯE_45v0x%:K8=i<ыdf`^%:Ow!,?OTJ[qyu8z Gry{TntDu-m(lU8#4f"'ͱպШ䓏S&o0•yΞZhVq^`qq=J伯ˎu&Nc)> .N ##3\rOHY(tbn<ԩr=PCQM&qW[DN#.$SSi\an6ڵU^k(%3MDGr#[?ziߡ,&(',;]RVRъYXRE*~`-&RIriCNJ[/JM!%JHqJzp:UjU49`Ѧ2G? E.c\&|ʬ4k "0(h46& Nٳ6v#XNX PHd˲nRciGP mNU0㶱^r>㚚鞦^{P:panҧҰ2+/(=Gqõz74ńt'ɶNs_FÇٵa,gȽG4Z.7%Qe;s~fh+Rd)b%FRZqE#A8ӥ06& 484PgNzCrR|E3Yg,_R6V7ֽ(rQaĭɡHZ †;p5t'HMIGbϷ׶ ͷ;S͹"?;A%|ePw~H/qtV-f&rza]FlvJ 7:~ș)96j8Yҵ)Bɵ*&MaS5cbl2*O@ѹL9U}8);$jd'rYgL`'{4vH JE}}VI^8-<~ 0#c+:nҧҰ2+/(=Gw'ѷ(i\TZau BNŦP3Ȳm e32-gJnh 㲓' 2cfBS ze*P̢ege6ƒx͈[9@w%̖~rq.ī)Ѭ 2V&JJ%7}*ul{xo*!1AQa q0@`?!㵆 ^ uRmh[<P ¥j{ϪZ^WqBSI%d>d!ڽT5? TlM3ga ֯P[:.H#[V/#F!hV^6/a ƺ^;Χ$[(HaR=EolA;IyD9d~; I49p?I@:*YSw榱l'X}Tn|jJ &Pm{` sӭa ֯Q`m-Z4EUU~B3Tl ֗v|[?1)X2pYgBؗyc[dڡ8S;˧ZX[ꭻĺfV #i@G8ZQ:B)Ŷ Y55 ,ZPrHA=NPc:!ot]G]>)f+j::xD*atT*Ou(cHc&)|6*N4b5 Ȉ6GO==/;6 ypn\N`|O|$j YThqsAhgg5\#bAZ&f7[ݪfR@M/Ht_pOj3]:W1 %ՊOmYcVCǐIK sMv+rX\.gHٚ R1/<3J~z+įRq :sйPU^.+ M^=g:]#Ǫ!(NcodԻ)hOhJU^ 2IJ]^)zy\`# ?Hpw/d`C.J.Bwt@21,׷۟5;_[ m 7`q=dH7-H$` ՓB}4$Y z ȂRM:S44FC c>;_VCGi6ʪIOYYGӬ|n]ZXJHSJ)saZIZU]UW/hxQZ t:э^`D$sutZMSDW.yM=3|6EEQ0=-i,0t )H f)0K"E geM9V tB.a4EL]R`zaf29F;#m:OKU#T菎'OxNNΪh "򲕰[@sfwL/;9M{YE֌eȴQaVY_Y 0@1?J,vo)@ikri`W7<( Qu#QVeA%{YX'(!1AQq0a@?l XeP#؇ x`(fn֞Ňx"vm. [ aVb]!C{=hж/ JWU>ALct4 !LJ7nRmMflqM$t$D*EĬQE;^I Q$w H$cwT,7>+_0y<6RNuaRXFh'^oҔ>ңwTBUiRF.j)B1]/ /_JШa?f(i9嵵 uߢdOiW`4_{8ڗ(:~@C`֣*SS:Eߢ*1*֠:k8EOl)SY&$ԭS>GGR5[E8x?Jr4DD]֮j" !UOa˖0 DA2 P1 KdyC!X@]RX(+^n øda%{$w*DlRfp?'!1AQa0q@?H1ar1B{PxҚl{$t5lf-Lu𞀘nP]M /*J0%X"nopS e3'!D$$sSL|ԃH. d,ՠxn34bv TUCTZ<Ֆ1_HArWPSttB_ mǸ-@//*LDvM QN$#.kJnAEeljh4 ` NvݽAW*"_^Up)GM[EmI+dzHus8DKx*O?ZTz/040w/ v)j9',,7_<V[ `AdL91F6K''P/kQ j#M"e-r_(!1AQa q0@`?㦈xKש'ΨB^";?m CDY:θdIrWm;1YP$|:$^b"Q Ā['91d;T$vvog[l׈Ljn<-h2 %l@Bc*hH0TG/qPXR)@L XAxX P0`P9HrrZJĠ2 H"[s[=&J*\ #nVU799*;V0HwHcF&?rGqRF(Mn.qZOn HYg Oh/?p"T 8DH.I6*`ED3-*nd"rR}h a4M$JrPb© ^@Yb\tKX<R$"8tErs`a' F n&K O4$!-N4eb׉m瞚"sgC3^5HsFБι)^31:c8GN(\;"&ONʶ6c31D)5&%N.#&" dAr# >7!iioQ(o'u*1s0im}~TI/GJ-_¹` _Lz0$%?x²rDV7*fH uxa1X ?'Q E ^?DvRz]Mxlcqq9YFԛ0rjWxD, rsw#V-Q>+[2UaeJ~ޛ妭ǧ?'M&Kiץ&d3C4rp-e4, "ؘTbcG8%D(cyOZN?3C|&ު~gdӓoT}K||x쬄䀧P7E#pT_nn(u'iqtQST@(c"Z32;7I0}" -(L݌Ƙx,x j'NA\G;1;D ruVml‹AMO2BR7DZK:DM alSbTƋ`9f)S\Ihܥ -r`,QL6!>%Ad N * fM7('TH!a 9@&IAP}`T* لI$T$bi~ <x TThh O+m-?N'KUK2 Zji.EjH4e"e'Hrt!N[_E>:8qm mayavi-4.5.0/docs/source/mayavi/volumetric_volume.jpg0000644000076500000240000001546712747716313023442 0ustar prabhustaff00000000000000JFIFC     C  " r.ϐC'ھ?ϴ}&e~VKM~}~t~翍mt}W2H߆מ1Zsf6zYh0q&>?=wwMitUQeRE6Sh3+JgPN̙(J٪jjS&㶐#z7nkT}62MITӧVu)5't1y($Gum2bͫڑ6+7[ ,LBthΥ& "J>2}*ЛU rM9{HZ\n2>v{h˽QR /Ϊ7iM.Jhű Az\ieY>]YLU_:?5;|8Ifm_r>*WGG)!NMUfՏ_@+ĉٓ1'ّ!*-LY?'~~ӱ y8ULlҥ2F-@2֑fLϳ"jQ*bTthGxV9ƏArf( +=ܶhfoE;'3jQ/Q>j9=Y}@#G{GKmE?aǏz\Ue^1P2Z^hd¶M"+S7q#(eFxl䁳meupNR)ǙH-a n]yMl؝ !1A 0@Qaq?I}Tu96׈OF=L1{ qa˝?Ȳ@jE!IJLE[Ox]/ zX|/ȱp?'[BV%`{.*L'itmG!$Jxģ{SsŏWr<ZF<z9 op/('Qv0$o?D ' ^1 K`ʆHH9ߖ X܄r"p!5 ?Hg2]|ky?a !1 A0Q@a? Ԇ ۿ V#ӯie4, i v`.OE̋7KY#,e`7><<=;]'+,fX]{;tPw}H0ȗd|pplrp@8DF\~<b8?Դ pSOmY#^lww;ww9 t[H 6s=KŒϏX2;䓷O _&!1AQaq 0@P?qݏMgj }*cbh1[s[ /ٛDc0'we@ee۽:DBʕ ]`m }Ŀ%畿ntqaaKZYI{-,p ^mi z<~AQDK! ^EjIedqv},.v480aAv*l(,,'18g+6oJAfoe{ :X-U\0!*%='Q,=)iS`2'6"TϰvXX<>AO"Sy.*,㩌63GGɜFlq)5vʔOu؜xJ|? >7:-Y8}j~-aj^2\B 6%pPv7@縷X-)ߘUt3(Qǐ4/dbNởbSӑ] ?Y!ĈؕyR;*X wʒ̗%-O9boIqP'obAcl8˓  /lT̹ڌ hǨT׋bY*%WiZu=3jB.$;l%t*|dZ QgFl6vSGw#SC"[y/Yզlm"-?HE+ ѓT\G#役r7¦>v}K,W5;v-M9:FgEys B:l:M;M3 xQpLǨkf=^&ԟg1p&-H|,",oy=Q 7MxՊi(x r*gOZVX:C([*`l >0/RmQZy+y\lL>ԖeT/+?%q~". ƁC2Y:&( C ˆ!G~pNˈAv*7lߊv\&7vlBw.Ct;bK@'``d _26W. o|0R'B p0=XJ\^~yyNKn4v%C eXXSPb+U YM)EV;9$TxH"o«bKK VT7"@scnCeq`tV "'鮾|yfV,顜pi_}kW+uT"T5Atn+eí<<^v? 75kދnKuv}.N#Wt"2.2adh,G%;U'eg+ᾃGN+k}'O]>b$Ejǂ1!XR[ATYҫE^S\FWg[o{l=;Zg^>eZw{t][)+Y{\PA@eϯbn,vײJwނ[ F~~}y*[zЫ7,1:gu:2Ќ JZzފH[-ɘ_WF a as2`#?e* ]7GI,LWh zDq+FV29.Zr ["(" 1QI k4ȠPp& !0"1@2ALk'=Y@N=ez*hvSRFJalw)]?~7;E2I(s~75 6KQG>";|_7a&?b'$s,Y|w=HoQ0 dWx7_Spթi)f>⟳p{iQ-Ayi+$"s7t-!Yj"YjR}MT*`;58 2IW*+s?w+r9Ԝ6hJ ~Q܇B4T`$}gMQ-,3./!f4~RNoVWs M<+1 Z#5f٥XQVkq՗/ jUFb0)Dxr{ȖuĪu&WH.inYHZ*}eDe\Xirll]UaQ.H:|ԒX#Wt3cz6iF`{6+> NtPb˵aOIP&uxג<k(?_ũt:MMM{߿& !10A"@?v7%-f/x>,Ioc=71*."wX FZNXObgs9Hu)>b[Z[bkRkgv7G0R^̊3'ٍ.u~E6=/oP-ߓh᳈/C>|cO-J9=_-Ȣ#jr-!=2#eb:%x-x'&X*鉇 urD!>ٗmucI1JoFO.B~TinZHsUEKkz*HRQb/ #jɜc#]}5R&!`Tkܗdg~ZGK4Bƻ=B;Mn5#9L}TG}f'=[6lrٿm(!1@"0A 2QP`pq?dɟ#'%2It&鱒Lfx#$&F$7}bI-& HDUY1;HTԧI-#ѹ2} ~OOqhK77rOIN+UP:G_6ռ j udjFMOΝHlE('^67!8!{b{QjŖ0cl^{c鸎cc?#!1A Q0aq?!a^HjZc,Wc\$dv7kŒHm"xPDtSB/Wz8Ie45 8H.{c'KޓM+eHFߣ1[ P %LNщDQsKɎ8xT"M:g PDٞ¶6~"s ect1Ʈad ڏcDU^iC ܍*yE#5dMvb V1%p蒣T(<BbxyQ ۅE "S; 92 hf bm#YA܉{+-F$oeEZKtm&;~&8%fصL (ٖipvUf)lE$1BwAi$;ObzeZƃ-K ASDg:#6"EHgZ։.īF$dF8-cG7Q `(0 &[b+C%QTDMk|pB1D)#0, 9s)i I OZM0{)Ĺ5N ؊geF߿F9h1v6(T0r^$&&eXƐ r f=ı1mWДBS/yCa "V?61{\'B} NAv z 0OdaBx`4t*0 8S`³*#ALh(,3:4t!/6:z*$2~GB\tH[-t 4 7\4fSt @E Ė6ĨI"|oE-][XB5*,Hȑ")xeR}N x>6_ x\> h\W +aYH jq:0 + "Cώ@SǬQ:J,0(|&v(-1|:Ϭ8nZh Htx0 uKNl EL6 "!1 A0Qaq?R:Ds)6BC\< \wpt[`w-=D`bo'W D-axۿ׫fE5nF^ ; yrg0H,>1q~@;g#&r'_VLs}34fnȺܹDo~ 7k/h ^7Gz׭$螑r:Gr5Y0݅#ShLybeuga]O,WBfɻ1'ߑGK{Z:`(,w9jre`PHȷ Iկ~>"&!1AQqa 0?PuuqD%RW&%m' <-ԕZ7&32ڼʷXTY =PKh ]}A1eBYm׫NRH+qz$仦ޙ3ZJkEk0l̰֌)o, #(7qfDPxt4*֐1N Pd_~8`GࡶWV#qyG٩5J?>crw5-"^̠T6צ׭A2lB)ͰC53;ᖝ% ̬5ED[3m2S{"Pen;G2crb4D͌:RȽƩ~㢚&G@3&8e2s*)P ]e\>oo_jsDP 32kbTq$MŢm+NS1j\9KfC̡` #?JX7Yx)TYZNeW`u};_X.P3>./d0+ cA2$]ù,tW M1k.;5lxGe fp2Sa丏0c:-Beb [L5hÜ&1* wpLj>` 9bp~TђRYnV8d3FF YUjR9l=dtNL!*Ne.0K[zܴd' I @ ]k.;bX+WPD-ljs `*vq V`}@sMGsטGi`BYY5BM@g+  [[6o1^Jޢd``%|Gn)eAVqtN#P2} %抻Qyr#vNHHVp,\o\{`/[&C̍פ]eYF̠dIb FƭT1k3P_?re4AEM\%5(5CLO  0mayavi-4.5.0/docs/source/render_examples.py0000644000076500000240000004212412747716313021407 0ustar prabhustaff00000000000000""" Render the examples to images and adds them to the documentation. """ # Standard library imports import glob import os import shutil import token, tokenize import textwrap import itertools # Enthought imports from mayavi import mlab # A global counter, for subsitutions. global_counter = itertools.count() EXAMPLE_DIR = '../../examples/mayavi' def is_mlab_example(filename): tokens = tokenize.generate_tokens(open(filename).readline) code_only = ''.join([tok_content for tok_type, tok_content, _, _, _ in tokens if not token.tok_name[tok_type] in ('COMMENT', 'STRING')]) return ('mlab.show()' in code_only) def run_mlab_file(filename, image_file): ## XXX: Monkey-patch mlab.show, so that we keep control of the ## the mainloop old_show = mlab.show def my_show(func=None): pass mlab.show = my_show mlab.clf() e = mlab.get_engine() e.close_scene(mlab.gcf()) exec( compile(open(filename).read(), filename, 'exec'), {'__name__': '__main__'} ) mlab.savefig(image_file) size = mlab.gcf().scene.get_size() for scene in e.scenes: e.close_scene(scene) mlab.show = old_show def extract_docstring(filename): # Extract a module-level docstring, if any lines = open(filename).readlines() start_row = 0 if lines[0].startswith('#!'): lines.pop(0) start_row = 1 docstring = '' first_par = '' li = lines.__iter__() li_next = li.__next__ if hasattr(li, '__next__') else li.next tokens = tokenize.generate_tokens(li_next) for tok_type, tok_content, _, (erow, _), _ in tokens: tok_type = token.tok_name[tok_type] if tok_type in ('NEWLINE', 'COMMENT', 'NL', 'INDENT', 'DEDENT'): continue elif tok_type == 'STRING': docstring = eval(tok_content) # If the docstring is formatted with several paragraphs, extract # the first one: paragraphs = '\n'.join(line.rstrip() for line in docstring.split('\n')).split('\n\n') if len(paragraphs) > 0: first_par = paragraphs[0] break return docstring, first_par, erow+1+start_row ################################################################################ # class `ExampleLister` ################################################################################ class ExampleLister(object): """ Builds a rst-formatted list of examples from a list of files. """ # Header template, for the example gallery. header_tpl = """ %(title)s -------------------------------------------------- %(intro)s .. toctree:: :hidden: %(toctree)s .. A comment to split paragraphs """ # Template used to create the example rst file example_rst_file_tpl = """ .. _example_%(short_file_name)s: %(title)s example -------------------------------------------- %(docstring)s **Python source code:** :download:`%(short_file_name)s.py` .. literalinclude:: %(short_file_name)s.py :lines: %(end_row)s- """ # The title of the corresponding section in the example gallery. title = '' # The introductory text of the subsection intro ='' def __init__(self, **kwargs): # Cheap unique hash for substitutions self._unique_hash = next(global_counter) for name, value in kwargs.items(): setattr(self, name, value) def render_all(self, stream, file_list): """ Render the example list to the given stream (file-like object). """ self._stream = stream files_details = self.render_header(file_list) for index, file_details in enumerate(files_details): filename, short_file_name, short_desc, title, docstring, \ end_row = file_details self.render_example_page(open(os.path.join(self.out_dir, 'example_%s.rst') % short_file_name, 'w'), index, file_details) self.gallery_entry(index, file_details) del self._stream def render_header(self, filenames): files_details = list() toctree = list() for filename in filenames: docstring, short_desc, end_row = extract_docstring(filename) short_file_name = os.path.basename(filename)[:-3] title = short_file_name.replace('_', ' ') title = title[0].upper() + title[1:] shutil.copy(filename, os.path.join(self.out_dir, os.path.basename(filename))) toctree.append(""" example_%s.rst""" % short_file_name) files_details.append((filename, short_file_name, short_desc, title, docstring, end_row)) toctree = '\n'.join(toctree) title = self.title intro = self.intro self._stream.write(self.header_tpl % locals()) return files_details def render_example_page(self, stream, index, file_details): """ Render an individual example page. """ filename, short_file_name, short_desc, title, docstring, end_row \ = file_details stream.write(self.example_rst_file_tpl % locals()) def gallery_entry(self, index, file_details): """ Write the entry in the main example gallery file corresponding to the given file details. """ filename, short_file_name, short_desc, title, docstring, \ end_row = file_details self._stream.write( "\n* :ref:`example_%(short_file_name)s`\n" % locals() ) short_desc = short_desc.lstrip().rstrip() for line in short_desc.split('\n'): self._stream.write(4*" " + line.lstrip() + "\n") ################################################################################ # class `ImagesExampleLister` ################################################################################ class ImagesExampleLister(ExampleLister): """ ExampleLister that looks for thumbnails. """ # Relative directory to images images_dir = 'mayavi/images/' def render_all(self, stream, file_list): self._stream = stream files_details = self.render_header(file_list) unique_hash = self._unique_hash for index, (filename, short_file_name, _, _, _, _) in \ enumerate(files_details): image_file = os.path.join(self.images_dir, 'example_%(short_file_name)s.jpg' % locals()) if os.path.exists(image_file): short_image_file = os.path.join(*( image_file.split(os.sep)[1:])) self._stream.write(""" .. |%(unique_hash)02i%(index)02i| image:: ../%(short_image_file)s :width: 150 """ % locals()) else: self._stream.write(""" .. |%(unique_hash)02i%(index)02i| raw:: html
""" % locals()) self._stream.write(2*('\n' + 7*"=" + " " + 45*"=")) for index, file_details in enumerate(files_details): filename, short_file_name, short_desc, title, docstring, end_row = \ file_details self.render_example_page(open(os.path.join(self.out_dir, 'example_%s.rst') % short_file_name, 'w'), index, file_details) self.gallery_entry(index, file_details) self._stream.write("\n"+7*"=" + " " + 45*"=" + '\n') del self._stream def render_example_page(self, stream, index, file_details): """ Hijack this method to, optionally, render images. """ # Jump one step up, and do not call ImagesExampleLister filename, short_file_name, short_desc, title, docstring, end_row = \ file_details image_file = os.path.join(self.images_dir, 'example_%(short_file_name)s.jpg' % locals()) if os.path.exists(image_file): docstring += """ .. image:: ../%s :align: center """ % os.path.join(*(image_file.split(os.sep)[1:])) file_details = \ filename, short_file_name, short_desc, title, docstring, end_row stream.write(self.example_rst_file_tpl % locals()) def gallery_entry(self, index, file_details): filename, short_file_name, short_desc, title, docstring, end_row = \ file_details short_desc = textwrap.wrap(short_desc, width=40) unique_hash = self._unique_hash self._stream.write( ("\n|%(unique_hash)02i%(index)02i|" % locals()).ljust(9) + ":ref:`example_%(short_file_name)s`\n" % locals() ) for line in short_desc: self._stream.write(9*" " + line.lstrip() + "\n") ################################################################################ # class `MlabExampleLister` ################################################################################ class MlabExampleLister(ImagesExampleLister): header_tpl = """ Mlab functions gallery ---------------------- These are the examples of the mlab plotting functions. They are copied out here for convenience. Please refer to the corresponding section of the user guide for more information ( :ref:`mlab_plotting_functions`). .. currentmodule:: mayavi.mlab +------------------+-------------------------+---------------------+ | :func:`plot3d` | :func:`points3d` | :func:`imshow` | | | | | | |plot3d.jpg| | |points3d.jpg| | |imshow.jpg| | +------------------+-------------------------+---------------------+ | :func:`surf` | :func:`contour_surf` | :func:`mesh` | | | | | | |surf.jpg| | |contour_surf.jpg| | |mesh.jpg| | +------------------+-------------------------+---------------------+ | :func:`barchart` | :func:`triangular_mesh` | :func:`contour3d` | | | | | | |barchart.jpg| | |triangular_mesh.jpg| | |contour3d.jpg| | +------------------+-------------------------+---------------------+ | :func:`quiver3d` | :func:`flow` | | | | | | | |quiver3d.jpg| | |flow.jpg| | | +------------------+-------------------------+---------------------+ .. |plot3d.jpg| image:: ../generated_images/enthought_mayavi_mlab_plot3d.jpg :width: 150 .. |points3d.jpg| image:: ../generated_images/enthought_mayavi_mlab_points3d.jpg :width: 150 .. |imshow.jpg| image:: ../generated_images/enthought_mayavi_mlab_imshow.jpg :width: 150 .. |contour_surf.jpg| image:: ../generated_images/enthought_mayavi_mlab_contour_surf.jpg :width: 150 .. |triangular_mesh.jpg| image:: ../generated_images/enthought_mayavi_mlab_triangular_mesh.jpg :width: 150 .. |surf.jpg| image:: ../generated_images/enthought_mayavi_mlab_surf.jpg :width: 150 .. |mesh.jpg| image:: ../generated_images/enthought_mayavi_mlab_mesh.jpg :width: 150 .. |barchart.jpg| image:: ../generated_images/enthought_mayavi_mlab_barchart.jpg :width: 150 .. |contour3d.jpg| image:: ../generated_images/enthought_mayavi_mlab_contour3d.jpg :width: 150 .. |quiver3d.jpg| image:: ../generated_images/enthought_mayavi_mlab_quiver3d.jpg :width: 150 .. |flow.jpg| image:: ../generated_images/enthought_mayavi_mlab_flow.jpg :width: 150 Advanced mlab examples ----------------------- .. toctree:: :hidden: %(toctree)s """ example_rst_file_tpl = """ .. _example_%(short_file_name)s: %(title)s example -------------------------------------------------------------------- %(docstring)s **Python source code:** :download:`%(short_file_name)s.py` .. literalinclude:: %(short_file_name)s.py :lines: %(end_row)s- """ render_images = False images_dir = 'mayavi/generated_images' def render_example_page(self, stream, index, file_details): """ Hijack this method to, optionally, render images. """ filename, short_file_name, short_desc, title, docstring, end_row = \ file_details if self.render_images: print("Generating images for %s" % filename) image_file = os.path.join(self.images_dir, 'example_%s.jpg' \ % short_file_name) run_mlab_file(filename, image_file=image_file) ImagesExampleLister.render_example_page(self, stream, index, file_details) ################################################################################ # Main entry point def render_examples(render_images=False, out_dir='mayavi/auto'): if not os.path.exists(out_dir): os.makedirs(out_dir) example_gallery_file = open(os.path.join(out_dir, 'examples.rst'), 'w') example_gallery_file.write(""" .. _example_gallery: Example gallery ================= """) ########################################################################## # Mlab examples example_files = [ filename for filename in glob.glob(os.path.join(EXAMPLE_DIR, 'mlab', '*.py')) if is_mlab_example(filename)] # Sort by file length (gives a measure of the complexity of the # example) example_files.sort(key=lambda name: len(open(name, 'r').readlines())) mlab_example_lister = MlabExampleLister(render_images=render_images, out_dir=out_dir, images_dir='mayavi/generated_images') if render_images: pass # XXX: Add logics to deal with rerendering examples cleverly mlab_example_lister.render_all(example_gallery_file, example_files) ########################################################################## # Interactive application examples example_files = [ filename for filename in glob.glob(os.path.join(EXAMPLE_DIR, 'interactive', '*.py'))] # Sort by file length (gives a measure of the complexity of the # example) example_files.sort(key=lambda name: len(open(name, 'r').readlines())) example_lister = ImagesExampleLister( title="Interactive examples", out_dir=out_dir, intro=""" Examples showing how to use the interactive features of Mayavi, either via the mayavi2 application, or via specially-crafted dialogs and applications. """) example_lister.render_all(example_gallery_file, example_files) ########################################################################## # Advanced visualization examples example_files = [ filename for filename in glob.glob(os.path.join(EXAMPLE_DIR, 'advanced_visualization', '*.py'))] # Sort by file length (gives a measure of the complexity of the # example) example_files.sort(key=lambda name: len(open(name, 'r').readlines())) example_lister = ExampleLister( title="Advanced visualization examples", out_dir=out_dir, intro=""" Data visualization using the core Mayavi API, object-oriented, and with more fine control than mlab. """) example_lister.render_all(example_gallery_file, example_files) ########################################################################## # Data interaction examples example_files = [ filename for filename in glob.glob(os.path.join(EXAMPLE_DIR, 'data_interaction', '*.py'))] # Sort by file length (gives a measure of the complexity of the # example) example_files.sort(key=lambda name: len(open(name, 'r').readlines())) example_lister = ExampleLister( title="Data interaction examples", out_dir=out_dir, intro=""" Examples showing how you can query and interact with the data. """) example_lister.render_all(example_gallery_file, example_files) ########################################################################## # The remaining files example_files = [ filename for filename in glob.glob(os.path.join(EXAMPLE_DIR, '*.py'))] # Sort by file length (gives a measure of the complexity of the # example) example_files.sort(key=lambda name: len(open(name, 'r').readlines())) example_lister = ExampleLister(title="Misc examples", out_dir=out_dir) example_lister.render_all(example_gallery_file, example_files) if __name__ == '__main__': render_examples() import shutil shutil.copyfile('../CHANGES.txt', './mayavi/auto/changes.rst') mayavi-4.5.0/docs/source/render_images.py0000644000076500000240000000403212747716313021032 0ustar prabhustaff00000000000000""" Script to render the images for the Mayavi user guide. This scipts requires image magic to be installed. """ # Author: Gael Varoquaux # Copyright (c) 2007, Enthought, Inc. # License: BSD Style. import os from mayavi import mlab from mayavi.scripts import mayavi2 from inspect import getmembers IMAGE_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'mayavi', 'generated_images') ############################################################################# def capture_image(func, filename): """ Runs a function doing some mayavi drawing and save the resulting scene to a file. """ mlab.clf() func() if not filename[-4:] in ('.jpg', '.png'): filename = '%s.jpg' % filename mlab.savefig(filename , size=(400, 400) ) os.system('convert %s -trim %s' % (filename, filename)) def illustrate_module(module, directory=IMAGE_DIR): """ Uses the test functions of the modules (discovery ala nose) to create images for each function tested. """ for name, func in getmembers(module): if not callable(func) or not name.lower().startswith('test'): continue if name.lower().endswith('anim'): continue # LaTeX doesn't like '.' in filename (sucks), so we replace them. filename = directory + os.sep + module.__name__.replace('.', '_') \ + '_' + name[5:] capture_image(func, filename=filename) ############################################################################# # Entry point @mlab.show def main(): mlab.figure(bgcolor=(1, 1, 1), fgcolor=(0, 0, 0), size=(400, 400)) print("Generating the mlab images...") illustrate_module(mlab) mayavi2.close() print("Done generating the mlab images") print("Generating the example pages") from render_examples import render_examples render_examples(render_images=True) print("Done generating the example pages") if __name__ == '__main__': main() mayavi-4.5.0/docs/source/tvtk/0000755000076500000240000000000012747722127016645 5ustar prabhustaff00000000000000mayavi-4.5.0/docs/source/tvtk/conf.py0000644000076500000240000001307012747716313020145 0ustar prabhustaff00000000000000# -*- coding: utf-8 -*- # # tvtk documentation build configuration file, created by # sphinx-quickstart on Wed Jul 23 12:38:58 2008. # # This file is execfile()d with the current directory set to its containing dir. # # The contents of this file are pickled, so don't put values in the namespace # that aren't pickleable (module imports are okay, they're removed automatically). # # All configuration values have a default value; values that are commented out # serve to show the default value. import sys, os # If your extensions are in another directory, add it here. If the directory # is relative to the documentation root, use os.path.abspath to make it # absolute, like shown here. #sys.path.append(os.path.abspath('some/directory')) # General configuration # --------------------- # Add any Sphinx extension module names here, as strings. They can be extensions # coming with Sphinx (named 'sphinx.ext.*') or your custom ones. extensions = [] # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] # The suffix of source filenames. source_suffix = '.txt' # The master toctree document. master_doc = 'index' # General substitutions. project = 'tvtk' copyright = '2008-2016, Enthought Inc.' # The default replacements for |version| and |release|, also used in various # other places throughout the built documents. d = {} fname = os.path.join('..', '..', '..', 'mayavi', '__init__.py') exec(compile(open(fname).read(), fname, 'exec'), d) version = release = d['__version__'] # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: #today = '' # Else, today_fmt is used as the format for a strftime call. today_fmt = '%B %d, %Y' # List of documents that shouldn't be included in the build. #unused_docs = [] # List of directories, relative to source directories, that shouldn't be searched # for source files. #exclude_dirs = [] # The reST default role (used for this markup: `text`) to use for all documents. #default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. #add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). #add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. #show_authors = False # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' # Options for HTML output # ----------------------- # The style sheet to use for HTML and HTML Help pages. A file of that name # must exist either in Sphinx' static/ path, or in one of the custom paths # given in html_static_path. html_theme = 'classic' # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". #html_title = None # A shorter title for the navigation bar. Default is the same as html_title. #html_short_title = None # The name of an image file (within the static path) to place at the top of # the sidebar. #html_logo = None # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. #html_favicon = None # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ['_static'] # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. html_last_updated_fmt = '%b %d, %Y' # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. #html_use_smartypants = True # Custom sidebar templates, maps document names to template names. #html_sidebars = {} # Additional templates that should be rendered to pages, maps page names to # template names. #html_additional_pages = {} # If false, no module index is generated. #html_use_modindex = True # If false, no index is generated. #html_use_index = True # If true, the index is split into individual pages for each letter. #html_split_index = False # If true, the reST sources are included in the HTML build as _sources/. #html_copy_source = True # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. #html_use_opensearch = '' # If nonempty, this is the file name suffix for HTML files (e.g. ".xhtml"). #html_file_suffix = '' # Output file base name for HTML help builder. htmlhelp_basename = 'tvtkdoc' # Options for LaTeX output # ------------------------ # The paper size ('letter' or 'a4'). #latex_paper_size = 'letter' # The font size ('10pt', '11pt' or '12pt'). #latex_font_size = '10pt' # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, author, document class [howto/manual]). latex_documents = [ ('index', 'tvtk.tex', 'tvtk Documentation', 'tvtk', 'manual'), ] # The name of an image file (relative to this directory) to place at the top of # the title page. #latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. #latex_use_parts = False # Additional stuff for the LaTeX preamble. #latex_preamble = '' # Documents to append as an appendix to all manuals. #latex_appendices = [] # If false, no module index is generated. #latex_use_modindex = True mayavi-4.5.0/docs/source/tvtk/devel.txt0000644000076500000240000003317612747716313020517 0ustar prabhustaff00000000000000=========================== Development guide for TVTK =========================== :Author: Prabhu Ramachandran :Contact: prabhu_r@users.sourceforge.net :Copyright: 2004-2011, Enthought, Inc. .. contents:: Introduction ============ This document provides some details on how TVTK works and how it is implemented. Basic documentation on the installation, features and usage of tvtk is provided in the README.txt file that should be in the same directory as this file. How tvtk works ============== All tvtk classes derive from `TVTKBase`. This is defined in `tvtk_base.py`. `TVTKBase` provides basic functionality common to all tvtk classes. Most importantly it provides for the following: * Allows one to wrap an existing VTK object or create a new one. `TVTKBase.__init__` accepts an optional VTK object, that can be used to wrap an existing VTK object. Read the method docstring for more details. * Sets up the event handlers that allow us to listen to any changes made to the underlying VTK object. * Basic support for pickling the object. * The `update_traits` automatically updates the traits of the tvtk class such that they reflect the state of the underlying VTK object. * Common code to change the underlying VTK object when the trait is changed. As mentioned above, tvtk classes can either wrap an existing VTK object or create a new one and manage the new object. Automatic trait updation ------------------------ One very important feature of tvtk objects is that any VTK related traits of object are dynamically updated if the underlying VTK object is changed. This is achieved by adding an observer to the VTK object that effectively calls TVTKBase.update_traits when the 'ModifiedEvent' is invoked. Here is an example of a VTK observer callback:: >>> import vtk >>> p = vtk.vtkProperty() >>> def cb(obj, evt): ... print obj.__class__.__name__, evt ... >>> p.AddObserver("ModifiedEvent", cb) 1 >>> p.SetRepresentationToWireframe() vtkOpenGLProperty ModifiedEvent As can be seen, when the property is modified, the callback is called. The trouble with this approach is that `p` now holds a reference to `cb`. Thus if `cb` were the `update_traits` method of the tvtk class that manages the VTK object, we run into a non-garbage-collectable reference cycle issue and a huge memory leak. To get around this we use the functionality provided by `messenger.py`. Effectively, `TVTKBase.__init__` tells messenger to call `self.update_traits` when it is called back from the VTK object. Messenger itself uses `weakrefs` so the reference cycle problem does not exist. The VTK object basically calls `messenger.send` and `messenger` takes care of the rest. This allows the tvtk class to be safely used and also allows for automatic trait updation. Each tvtk class has an attribute called `_updateable_traits_`. This is a tuple of tuples. Each tuple contains a pair of strings like so:: >>> p = tvtk.Property() >>> p._updateable_traits_[:4] (('opacity', 'GetOpacity'), ('frontface_culling', 'GetFrontfaceCulling'), ('point_size', 'GetPointSize'), ('specular_color', 'GetSpecularColor')) The first string is the name of the trait and the second the name of the function used to obtain the value of the trait from the VTK object. `TVTKBase.update_traits` uses this tuple and for each trait it calls the relevant VTK 'get' function and updates the value of the trait. While this whole process seems to be inefficient, it actually works quite well in practice and does not appear to be slow at all. Messaging --------- The messaging functionality is defined in `tvtk/messenger.py`. Unit tests are in the 'tests/' directory. As described in the previous section, tvtk objects use the messenger functionality to ensure that the traits are always up to date. `messenger.py` is well documented and tested. So please read the docstrings for more details. Here is some basic information from the documentation. `messenger.py` implements a simple, robust, safe, `Messenger` class that allows one to register callbacks for a signal/slot (or event/handler) kind of messaging system. One can basically register a callback function/method to be called when an object sends a particular event. The Messenger class is Borg. So it is easy to instantiate and use. This module is also reload-safe, so if the module is reloaded the callback information is not lost. Method callbacks do not have a reference counting problem since weak references are used. The main functionality is provided by three functions, `connect`, `disconnect` and `send`. `connect` basically allows one to connect an object, `obj`, that emits an event, `event` to a callback function, `callback`. When an object calls `send`, it passes itself, the event it wishes to emit along with any optional arguments and keyword arguments to send. All registered `callback` for the particular event are called with the the object that called it (`obj`), the event (`event`) and the optional arguments. `disconnect` allows one to disconnect either a particular callback, or all callbacks for a particular event or the entire object. The messenger class thus provides a simple observer pattern implementation that makes it easy to do inter-object communication. For further details please read the code and docstrings. Also look at the test suite in `tests/test_messenger.py`. Pickling -------- `TVTKBase` provides the basic functionality for pickling. Essentially, the dictionary (`self.__dict__`) of the tvtk object is pickled. The `_vtk_obj` attribute is not pickled since VTK objects are not picklable. Other irrelevant attributes are also removed. `__setstate__` works even on a live object by checking to see if `self._vtk_obj` exists. Some of the tvtk classes override these methods to implement them better. For example look at the code for the `Matrix4x4` class. Array handling -------------- TVTK lets the user pass Numeric arrays/Python lists in place of the `DataArray`, `CellArray`, `Points` etc. classes. This is done by finding the call signature of the wrapped VTK method, checking to see if it has an array and then intelligently generating the appropriate VTK array data using the signature information. This generated VTK data array is then passed to the wrapped function under the covers. This functionality also works if the method has multiple call signatures (overloaded VTK method) and one of them involves arrays. The main functions to do this conversion magic are in the `array_handler.py` module. The `wrapper_gen.py` module generates the appropriate wrapper code depending on the call signature. So if a method has no VTK objects in its signature, no wrapping is necessary. If it only has non-array VTK objects, then array handling is unnecessary but one must dereference the VTK object from the passed tvtk wrapper object. If the call signature involves VTK array objects, then any Numeric arrays or Python lists are converted to the correct VTK data array and passed to the wrapped VTK object. For the efficient conversion to `CellArray` objects, an extension module is required. The sources for this extension module are in `src/array_ext.*`. The Cython_ file can be used to generate the `src/array_ext.c` file like so:: $ cd src $ cython array_ext.pyx The sources ship with the generated source file so that folks without Cython can build it. `special_gen.py` defines all the additional methods for the `DataArray` and other classes that allow these objects to support iteration, `__repr__`, `__getitem__` etc. .. _Cython: http://cython.org/ The magical `tvtk` instance --------------------------- When one does the following:: >>> from tvtk.api import tvtk The imported `tvtk` is really an instance of a class and not a module! This is so because, the tvtk classes are almost 800 in number and they wrap around the *entire* VTK API. VTK itself allows one to import all the defined classes in one go. That is, if one does `import vtk`, one can instantiate all VTK related classes. This is very useful functionality. However, importing 800 wrapper classes in one go is *extremely* slow. Thus, `tvtk` provides a convenient solution to get around the problem. While `tvtk` is a class instance, it behaves just like you'd expect of a module. * It supports tab-completion on class names. * Allows one to access all the tvtk classes. * Imports extremely fast. Any slowness in the import is really because tvtk needs to import VTK. Thus importing tvtk should not be much slower than importing vtk itself. * Imports the tvtk classes *only* on demand. All the tvtk related code is generated and saved into the `tvtk_classes.zip` file. The `tvtk` instance is basically an instance of the TVTK class. This is defined in `tvtk_helper.py`. This file is inside the ZIP file. For each wrapped VTK class, TVTK defines a property having the name of the wrapper tvtk class. The `get` method of the property basically returns the class after importing it dynamically from the ZIP file. This is done in the `get_class` function. Each class thus imported is cached (in `_cache`) and if a cached copy exists the class is not re-imported. Note that in the implementation, the class and its parent classes need to be imported. These parent classes are also cached. `enthought/tvtk/__init__.py` adds the `tvtk_classes.zip` file into `sys.path` and instantiates the TVTK class to provide the `tvtk` instance. Note that any files inside the `tvtk_classes.zip` are automatically generated. Miscellaneous details --------------------- `tvtk_base.py` defines some important and frequently used traits that are used in tvtk. It is used by all the tvtk classes. It provides a couple of useful functions (`get_tvtk_name` and `camel2enthought`) to perform name mangling so one can change the VTK method name to an enthought style name. The module also provides the function `deref_vtk`, that lets one obtain the underlying VTK object from the tvtk object. Code Generation =============== All the tvtk classes are dynamically generated. `code_gen.py` is the main driver module that is responsible for this. Code generation works involves the following steps. * Listing and sorting all the VTK classes into a class hierarchy. This is done by `class_tree.py`. `ClassTree` basically organizes all the VTK classes into a tree structure. The tree is organized into "levels". The classes with no bases are at the lowest level (the root) and the higher levels represent classes that have one or more bases. Each class in the tree is represented as a `Node`. Each node has references to its children and parents. Thus one can walk the entire class hierarchy given a single node. This is fairly generic code and will work with any class hierarchy. Its main function is to allow us to generate the classes in the right order and also allows us to easily find the parents and children of a class in a class hierarchy. More details are in the file `class_tree.py`. UTSL. * Parsing the methods of each VTK class and categorizing them. This step also involves finding the default values of the state of the VTK objects, the valid range of values etc. This entire functionality is provided by `vtk_parser.py`. VTK parser module is completely self documenting and the public interface is fairly simple. The `VTKMethodParser` by default uses an instance of the `ClassTree` class to do some of its work (the use of the `ClassTree` can be turned off though). * Formatting the output code correctly (indentation). This is handled by the `indenter.Indent` class. The `Indent` class lets us format a code-string suitably so that the code is formatted at the current indentation level. * Massaging VTK documentation suitably. This is done by `indenter.VTKDocMassager`. * Generating the tvtk code. Done mainly by `code_gen.py`. * Generating a ZIP file of the code, also done by `code_gen.py`. The `code_gen` module defines a `TVTKGenerator` class that drives the code generation. The module uses the `wrapper_gen` module to generate the wrapper classes. The `wrapper_gen` defines a `WrapperGenerator` class. An instance of this class creates an instance of the `VTKMethodParser` (and uses its internal `ClassTree` instance). `TVTKGenerator` uses this class tree. For each class in the VTK hierarchy (starting from classes at the root of the tree), the class is parsed, and a suitable tvtk wrapper class (with the name of the class and file name of the module suitably modified) is generated using the functionality provided by `WrapperGenerator`. A separate `tvtk_helper` module (described in the `The magical tvtk instance`_ section) is also simultaneously updated with the class for which the wrapper is generated. All of these classes are dumped into a temporary directory. These classes are then put into a ZIP file. The `tvtk_helper.py` code is generated by the `HelperGenerator` class. The other tvtk classes are generated by the `WrapperGenerator` class. 'WrapperGenerator` also makes use of the `SpecialGenerator` to write special code for some of the VTK classes. `TVTKGenerator` uses the other code generators and drives the entire code generation process, builds a ZIP file and optionally cleans up the temporary directory where the wrapper code was written. Please run the following:: $ python code_gen.py -h To see a list of options to the code generator. Some of the options are extremely useful during development. For example do this to generate the code for a few classes alone:: $ python code_gen.py -n -z -o /tmp/tvtk_tmp vtkCollection \ vtkProperty vtkConeSource The `-n` option ensures that '/tmp/tvtk_tmp' is not removed. `-z` inhibits ZIP file generation. mayavi-4.5.0/docs/source/tvtk/index.txt0000644000076500000240000000056112747716313020517 0ustar prabhustaff00000000000000.. tvtk documentation master file, created by sphinx-quickstart on Wed Jul 23 12:38:58 2008. You can adapt this file completely to your liking, but it should at least contain the root `toctree` directive. Welcome to tvtk's documentation! ================================ Contents: .. toctree:: :maxdepth: 2 README.txt devel.txt * :ref:`search` mayavi-4.5.0/docs/source/tvtk/README.txt0000644000076500000240000007731412747716313020357 0ustar prabhustaff00000000000000===================================== An Introduction to Traited VTK (tvtk) ===================================== :Author: Prabhu Ramachandran :Contact: prabhu@enthought.com :Copyright: 2004-2012, Enthought, Inc. .. contents:: Introduction ============ The tvtk module (also called TVTK) provides a traits_ enabled version of VTK_. TVTK objects wrap around VTK objects but additionally support traits_, and provide a convenient Pythonic API. TVTK is implemented mostly in pure Python (except for a small extension module). Here is a list of current features. * All VTK classes are wrapped. * Classes are generated at install time on the installed platform. * Support for traits_. * Elementary pickle support. * Pythonic feel. * Handles numpy arrays/Python lists transparently. * Support for a pipeline browser, `ivtk` and a high-level `mlab` like module. * Envisage plugins for a tvtk scene and the pipeline browser. * tvtk is free software with a BSD style license. .. _traits: http://docs.enthought.com/traits .. _VTK: http://www.vtk.org Requirements ============ The following is a list of requirements for you to be able to run tvtk. * Python-2.3 or greater. * Python should be built with zlib support and must support ZIP file imports. * VTK-5.x, VTK-4.4 or VTK-4.2. It is unlikely to work with VTK-3.x. * Traits. * numpy -- Any recent version should be fine. * To use `ivtk.py`, `mlab` you need to have `pyface` installed. * To use the plugins you need Envisage installed. Installation ============ TVTK is meant to be installed as part of the `mayavi` package. Please visit the installation guide on the Mayavi documentation: http://docs.enthought.com/mayavi/mayavi/installation.html This document only covers building and using TVTK from inside a checkout of the the mayavi_ repository. The tvtk module lives inside `tvtk`. To build the tvtk module and use them from inside the `mayavi` sources do the following from the base of the mayavi source tree (we assume here that this is in `/home/user/src/lib/mayavi`):: $ pwd /home/user/src/lib/mayavi $ python setup.py build The code generation will take a bit of time. On a PentiumIII machine at 450Mhz, generating the code takes about a minute. If the code generation was successful you should see a ZIP file called `tvtk_classes.zip` in the tvtk directory along with an extension module. This completes the installation. The build can be tested by running the tests in the `tests/` directory. This tests the built code:: $ pwd /home/user/src/lib/mayavi $ python -m nose.core -v tvtk/tests [...] If the tests run fine, the build is good. There are other tests in the `tests` directory that can also be run. Documentation is available in the 'docs/' directory. The 'examples/' directory contains a few simple examples demonstrating tvtk in action. Basic Usage =========== An example of how tvtk can be used follows:: >>> from tvtk.api import tvtk >>> cs = tvtk.ConeSource() >>> cs.resolution = 36 >>> m = tvtk.PolyDataMapper() >>> m.input = cs.output >>> a = tvtk.Actor() >>> a.mapper = m >>> p = a.property >>> p.representation = 'w' >>> print p.representation 'wireframe' Or equivalently:: >>> from tvtk.api import tvtk >>> cs = tvtk.ConeSource(resolution=36) >>> m = tvtk.PolyDataMapper(input=cs.output) >>> p = tvtk.Property(representation='w') >>> a = tvtk.Actor(mapper=m, property=p) Note that the properties of the object can be set during the instantiation. To import tvtk please use:: from tvtk.api import tvtk While this is perhaps a little inconvenient, note that tvtk provides access to all the VTK classes. This is the same way that the `vtk` package also behaves. If you are familiar with VTK-Python it is clear from the above example that tvtk "feels" like VTK but is more Pythonic. The most important differences are. 1. tvtk class names are essentially similar to VTK classes except there is no annoying 'vtk' at the front. The only difficulty is with classes that start with a digit. For example 'vtk3DSImporter' becomes '3DSImporter'. This is illegal in Python and therefore the class name used is 'ThreeDSImporter'. So, if the first character is a digit, it is replaced by an equivalent non-digit string. There are very few classes like this so this is not a big deal. 2. tvtk method names are `enthought` style names and not CamelCase. That is, if a VTK method is called `AddItem`, the equivalent tvtk name is `add_item`. This is done for the sake of consistency with names used in the `enthought` package. 3. Many VTK methods are replaced by handy properties. In the above example, we used `m.input = cs.output` and `p.representation = 'w'` instead of what would have been `m.SetInput(cs.GetOutput())` and `p.SetRepresentationToWireframe()` etc. Some of these properties are really traits_. 4. Unlike VTK objects, one can set the properties of a tvtk object when the object is initialized by passing the properties (traits) of the object as keyword arguments at the time of class instantiation. For example `cs = tvtk.ConeSource(radius=0.1, height=0.5)`. If you are used to VTK, this might take a little getting used to. However, these changes are consistent across all of tvtk. If they aren't, its a bug. Please let me know if you see inconsistencies. If the underlying VTK object returns another VTK object, this is suitably wrapped as a tvtk object. Similarly, all relevant parameters for a tvtk method should be tvtk objects, these are transparently converted to VTK objects. Advanced Usage ============== There are several important new features that tvtk provides in addition to the above. A tvtk object basically wraps around a VTK-Python object and provides a trait enabled API for the VTK object. Before we discuss these new features it is important to understand the notion of what we mean by the "basic state" or "state" of a tvtk object. This is defined and subsequently the new features are discussed in some detail. .. _state: Definition of the "basic state" of a tvtk object ------------------------------------------------ In tvtk the set of all properties of the VTK object that are represented as traits and have for their value a simple Python type (int/float/string) or a special value (like a tuple specifying color) define the state. In terms of the implementation of tvtk, any property of a VTK object that can be set by using methods having the form `On` or `Off`, `SetTo` and `Set/Get` (where the return type is an int/float/string/tuple) are represented as traits. These properties are said to represent the "basic state" of the tvtk object. Note that the complete state of the underlying C++ object is impossible to represent in the Python world since this usually involves various pointers to other C++ objects. It is also important to consider that the identity of objects is preserved according to the VTK behavior. For example, in the following code, the default object created by the VTK implementation of `GetLines()` is the same for any vtkPolyData:: >>> data1 = vtk.vtkPolyData() >>> data2 = vtk.vtkPolyData() >>> data1.GetLines() (vtkCellArray)0x103b52e30 >>> data2.GetLines() (vtkCellArray)0x103b52e30 The equivalent tvtk code behaves in the same way:: >>> data1 = tvtk.PolyData() >>> data2 = tvtk.PolyData() >>> data1.lines >>> data2.lines The wrapped VTK object ----------------------- The user should not ordinarily know this (or rely on this!) but it sometimes helps to know how to access the underlying VTK object that the tvtk object has wrapped. The recommended way to do this is by using the `to_vtk` function. For example:: >>> pd = tvtk.PolyData() >>> pd_vtk = tvtk.to_vtk(pd) The inverse process of creating a tvtk object from a VTK object is to use the `to_tvtk` function like so:: >>> pd1 = tvtk.to_tvtk(pd_vtk) >>> print pd1 == pd True Notice that `pd1 == pd`. TVTK maintains an internal cache of existing tvtk objects and when the `to_tvtk` method is given a VTK object it returns the cached object for the particular VTK object. This is particularly useful in situations like this:: >>> cs = tvtk.ConeSource() >>> o = cs.output >>> m = tvtk.PolyDataMapper() >>> m.input = o >>> # ... >>> print m.input == o True It must be noted that if a tvtk object's goes out of scope in Python, it is garbage collected. However, its underlying VTK object may still exist inside the VTK pipeline. When one accesses this object, a new tvtk wrapper object is created. The following illustrates this:: >>> cs = tvtk.ConeSource() >>> o = cs.output >>> m = tvtk.PolyDataMapper() >>> m.input = o >>> print hash(o) 1109012188 >>> print hash(m.input) 1109012188 >>> del o >>> print hash(m.input) 1119694156 Thus, after `o` is garbage collected `m.input` no longer refers to the original tvtk object and a new one is created. This is very similar to VTK's behaviour. Changing this behaviour is tricky and there are no plans currently to change this. tvtk and traits --------------- All tvtk objects are derived from `traits.HasStrictTraits`. As discussed above, all the basic state related methods are represented as traits in tvtk. This is why we are able to do:: >>> p = a.property >>> p.representation = 'w' >>> print p.representation 'wireframe' >>> # OR do this: >>> p = tvtk.Property(opacity=0.5, color=(1,0,0), representation='w') Also note that it is possible to set many properties of a tvtk object in one go using the `set` method. For example:: >>> p = tvtk.Property() >>> p.set(opacity=0.5, color=(1,0,0), representation='w') Any tvtk object will automatically provide the basic functionality of a traited class. Thus, one can also pop up a standard GUI editor for any tvtk object trivially. For example if one is using `pycrust` or is using `gui_thread` (this module should be available if SciPy_ is installed) or `ipython -wthread` one could easily do this:: >>> p = tvtk.Property() >>> p.edit_traits() >>> # OR >>> p.configure_traits() # This should work even without gui_thread A GUI editor should pop-up at this point. Note, that changes made to the trait will automagically be propagated to the underlying VTK object. Most importantly, the reverse is also true. That is, if some other object changes the basic state of the wrapped VTK object, then the trait will be automagically updated. For example:: >>> p = tvtk.Property() >>> print p.representation 'surface' >>> p_vtk = tvtk.to_tvtk(p) >>> p_vtk.SetRepresentationToWireframe() >>> print p.representation 'wireframe' This also means that if you change properties of the object on the interpreter and at the same time are using a GUI editor, if the object changes, the GUI editor will update automatically. It is important to note that tvtk objects have strict traits. It is therefore an error to set an attribute that is not already defined in the class. This is illustrated in the following example:: >>> cs = tvtk.ConeSource() >>> cs.foo = 1 Traceback (most recent call last): File "", line 1, in ? TraitError: Cannot set the undefined 'foo' attribute of a 'ConeSource' object. .. _SciPy: http://www.scipy.org Sub-classing tvtk classes ------------------------- You may subclass tvtk classes but please keep in mind the following: 1. All tvtk classes derive from `HasStrictTraits`. 2. You must make sure to call the super class's __init__ correctly. 3. If you have to override the __del__ method, you *must* make sure you call the super class's __del__ method. Pickling tvtk objects --------------------- tvtk objects support a simple form of pickling. The state_ of the tvtk object maybe pickled. The references to other VTK objects held by the object are *NOT* picklable. For example:: >>> import cPickle >>> p = tvtk.Property() >>> p.representation = 'w' >>> s = cPickle.dumps(p) >>> del p >>> p = cPickle.load(s) >>> print p.representation 'wireframe' Once again, only the state_ of the object is pickled. Internal references are not. So the construction of the VTK pipeline will not be pickled. For example if we pickled the actor from the example given in the `Basic Usage`_ section, then the `ConeSource`, `PolyDataMapper` etc. will not be pickled. Some of the tvtk classes like `Matrix4x4` also have special code that enables better pickling. It is also possible to set the state of a live object. Normally, `pickle.load` will create a new object. However, by using `__setstate__` directly it is possible to just update the state_ of the object. For example:: >>> p = tvtk.Property() >>> p.interpolation = 'flat' >>> d = p.__getstate__() >>> del p >>> p = Prop() >>> p.__setstate__(d) Here, after `__setstate__` is called, the object's state alone will be updated. No new object is created. Docstrings ---------- All tvtk methods and traits are documented using the VTK docstrings. The class names and method names are changed suitably as mentioned in the `Basic Usage`_ section. These docstrings are generated automatically and there might be small mistakes in them. All methods of a tvtk object also provide method signature information in the docstring. User defined code ----------------- All the tvtk wrapper classes are generated automatically. Sometimes one would like to customize a particular class and use that instead of the default. The easiest way to do this would be to copy out the relevant class from the `tvtk_classes.zip` file, modify it suitably (without changing the name of the file or class name of course) and then add this file into the `tvtk/custom` directory. Any file here will override the default inside the ZIP file. Collections ----------- Any object derived from `Collection` (i.e. `vtkCollection`) will behave like a proper Python sequence. Here is an example:: >>> ac = tvtk.ActorCollection() >>> print len(ac) 0 >>> ac.append(tvtk.Actor()) >>> print len(ac) 1 >>> for i in ac: ... print i ... [...] >>> ac[-1] = tvtk.Actor() >>> del ac[0] >>> print len(ac) 0 Currently, only subclasses of `Collection` behave this way. Array handling -------------- All the `DataArray` subclasses behave like Pythonic arrays and support the iteration protocol in addition to `__getitem__`, `__setitem__`, `__repr__`, `append`, `extend` etc. Further, it is possible to set the value of the array using either a numpy array or a Python list (using the `from_array` method). One can also get the data stored in the array into a numpy array (using the `to_array` method). Similarly, the `Points` and `IdList` classes also support these features. The `CellArray` class only provides the `from_array` and `to_array` methods and does not provide a sequence like protocol. This is because of the peculiarity of the wrapped `vtkCellArray` class. One extremely useful feature is that almost any tvtk method/property that accepts a `DataArray`, `Points`, `IdList` or `CellArray` instance, will transparently accept a numpy array or a Python list. Here is a simple example demonstrating these:: >>> ######################################## >>> from tvtk.api import tvtk >>> import numpy >>> data = numpy.array([[0,0,0,10], [1,0,0,20], ... [0,1,0,20], [0,0,1,30]], 'f') >>> triangles = numpy.array([[0,1,3], [0,3,2], ... [1,2,3], [0,2,1]]) >>> points = data[:,:3] >>> temperature = data[:,-1] >>> mesh = tvtk.PolyData() >>> mesh.points = points >>> mesh.polys = triangles >>> mesh.point_data.scalars = temperature >>> ######################################## >>> # Array's are Pythonic. >>> import operator >>> reduce(operator.add, mesh.point_data.scalars, 0.0) 80.0 >>> print mesh.point_data.scalars [10.0, 20.0, 20.0, 30.0] >>> print mesh.points [(0.0, 0.0, 0.0), (1.0, 0.0, 0.0), (0.0, 1.0, 0.0), (0.0, 0.0, 1.0)] >>> ######################################## >>> # Demo of from_array/to_array >>> pts = tvtk.Points() >>> pts.from_array(points) >>> print pts.to_array() [[ 0. 0. 0.] [ 1. 0. 0.] [ 0. 1. 0.] [ 0. 0. 1.]] As can be seen, no `DataArray`, `Points` or `CellArray` instances need to be created. Note that Python tuples are *not* converted implicitly. The conversion from the passed arrays to the VTK arrays is handled transparently and very efficiently. The only exception to this is the `IdList` class where the conversion is inefficient. However, the `IdList` class is not used commonly. The `CellArray` is used to specify the connectivity list for polygonal data and has some peculiarities. The `CellArray` needs to be initialized using the cell connectivity list. This can be specified in one of several ways. 1. A Python list of 1D lists. Each 1D list can contain one cell connectivity list. This is very slow and is to be used only when efficiency is of no consequence. 2. A 2D numpy array with the cell connectivity list. 3. A Python list of 2D numpy arrays. Each numpy array can have a different shape. This makes it easy to generate a cell array having cells of different kinds. This conversion is most efficient if the passed numpy arrays have a typecode of `tvtk.array_handler.ID_TYPE_CODE`. Otherwise a typecast is necessary and this involves an extra copy. The input data is *always copied* during the conversion. Here is an example illustrating these different approaches:: >>> a = [[0], [1, 2], [3, 4, 5], [6, 7, 8, 9]] >>> cells = tvtk.CellArray() >>> cells.from_array(a) >>> a = numpy.array([[0,1,2], [3,4,5], [6,7,8]], int) >>> cells.from_array(a) >>> l_a = [a[:,:1], a[:2,:2], a] >>> cells.from_array(a) An alternative way to use an arbitrary connectivity list having different numbers of points per cell is to use the following approach:: >>> ids = numpy.array([3, 0,1,3, ... 3, 0,3,2, ... 3, 1,2,3, ... 3, 0,2,1]) >>> # The list is of form [npts,p0,p1,...p(npts-1), ...] >>> n_cell = 4 >>> cells = tvtk.CellArray() >>> cells.set_cells(n_cell, ids) >>> print cells.data [3.0, ..., 1.0], length = 16 This is done very efficiently and does not copy the input data. More details on this are provided in the next sub-section. Also note that `DataArray` objects can still be passed to these methods as before. For example we could have just as easily done this:: >>> points = tvtk.Points() >>> points.from_array(data[:,:3]) >>> temperature = tvtk.FloatArray() >>> temperature.from_array(data[:,-1]) >>> cells = tvtk.CellArray() >>> cells.set_cells(n_cell, ids) >>> mesh = tvtk.PolyData() >>> mesh.points = points >>> mesh.polys = cells >>> mesh.point_data.scalars = temperature Important considerations ~~~~~~~~~~~~~~~~~~~~~~~~ To clarify the ensuing discussion we make a distinction between two different forms of array handling. a. Explicit conversion -- These happen when the user is creating a tvtk array object and initializes this from a numpy array or Python list. Like so:: >>> f = tvtk.FloatArray() >>> a = numpy.array([1,2,3], int) >>> f.from_array(a) b. Implicit conversion -- These happen when the user passes an array or list to a tvtk method that expects a `DataArray`, `Points`, `IdList` or `CellArray` instance. There are a few issues to keep in mind when using tvtk's array handling features. When possible, tvtk uses a view of the passed numpy array and does not make a copy of the data stored in it. This means that changes to the VTK data array or to the numpy array are visible in the other. For example:: >>> f = tvtk.FloatArray() >>> a = numpy.array([1,2,3], 'f') >>> f.from_array(a) >>> a[0] = 10.0 >>> print f [10.0, 2.0, 3.0] >>> f[0] = -1.0 >>> print a [-1. 2. 3.] It is important to note that it is perfectly safe to delete the reference to the numpy array since this array is actually cached safely to eliminate nasty problems. This memory is freed when the VTK array is garbage collected. Saving a reference to the numpy array also ensures that the numpy array cannot be resized (this could have disastrous effects). However, there are exceptions to this behaviour of using "views" of the numpy array. The `DataArray` class and its subclasses and the `Points` class only make copies of the given data in the following situations. 1. A Python list is given as the data. 2. A non-contiguous numpy array is given. 3. The method requiring the conversion of the array to a VTK array expects a `vtkBitArray` instance. 4. The types of the expected VTK array and the passed numpy array are not equivalent to each other. For example if the array passed has typecode 'i' but the tvtk method expects a `FloatArray`. The cases 3 and 4 occur very rarely in implicit conversions because most methods accept `DataArray` instances rather than specific subclasses. However, these cases are likely to occur in explicit conversions. `CellArray` *always* makes a copy of the data on assignment. For example:: >>> ca = tvtk.CellArray() >>> triangles = numpy.array([[0,1,3], [0,3,2], ... [1,2,3], [0,2,1]]) >>> ca.from_array(triangles) This always makes a copy. However, if one uses the `set_cells` method a copy is made in the same circumstances as specified above for `DataArray` and `Points` classes. If no copy is made, the cell data is a "view" of the numpy array. Thus, the following example does not make a copy:: >>> ids = numpy.array([3, 0,1,3, ... 3, 0,3,2, ... 3, 1,2,3, ... 3, 0,2,1], int) >>> ca.set_cells(4, ids) Changing the values of the ids or changing the number of cells is *not* recommended and will lead to undefined behaviour. It should also be noted that it is best to pass cell connectivity data in arrays having typecode `tvtk.array_handler.ID_TYPE_CODE` (this is actually computed dynamically depending on your VTK build and platform). The `IdList` also *always* makes a copy of the data passed to it. Another issue to keep in mind is that VTK's data arrays always re-allocate memory if they are resized. This is illustrated in the following example:: >>> d = tvtk.DoubleArray() >>> a = numpy.array([1,2,3], 'd') >>> d.from_array(a) >>> a[0] = 10 >>> d.append(4.0) >>> a[0] = 1 >>> print a [ 1. 2. 3.] >>> print d [10.0, 2.0, 3.0, 4.0] >>> # Notice that d[0] == 10.0 In this case, `a` is not resized but `d` is. Here, `d` actually makes a copy of `a` and any further changes to `d` or `a` will not be reflected in the other. This case also illustrates a small problem. `d` will hold a reference to `a` internally even though it uses none of `a`'s memory. Fortunately, when `d` is garbage collected the memory occupied by `a` will be freed. Thus the problem is not serious but probably worth keeping in mind. Summary of issues ~~~~~~~~~~~~~~~~~ To summarize the considerations of the previous sub-section, the following are to be noted. 1. Most often `DataArray` and `Points` objects do not make copies of the numpy data. The exceptions are listed above. This means changes to either the tvtk object or the array are reflected in the other. 2. It is safe to delete references to the array object converted. You cannot resize the numpy array though. 3. `CellArray` always copies data on assignment. However, when using `set_cells`, the behaviour is similar to what happens for `DataArray` objects. Note that it is not advisable to change the connectivity ids and number of cells when this is done. Also note that for the `CellArray` it is best to pass data in the form of numpy arrays having a typecode of `tvtk.array_handler.ID_TYPE_CODE`). Otherwise one incurs an extra copy due to a typecast. 4. `IdList` always makes a copy of the data. This class is very rarely used. 5. tvtk array objects *always* copy the data when resized. This could lead to increased memory usage in some circumstances. However, this is *not* a memory leak. The upshot of these features is that array conversion can be extremely efficient in terms of speed and memory considerations. Other utility modules ===================== The `tvtk` package ships with several other utility modules. These are briefly described in the following sections. Miscellaneous -------------- If you need to write out VTK data files given a TVTK dataset. The ``tvtk.api.write_data`` function should be useful. For example:: >>> from tvtk.api import tvtk, write_data >>> pd = tvtk.PolyData() >>> # ... >>> write_data(pd, 'file_name') This will write out an XML file with basename ``file_name``. If one specifies a ``.vtk`` extension, like say:: >>> write_data(pd, 'file_name.vtk') It will write out an old-style ASCII file. See the docstring for more details. VTK-Python defines several handy colors and these are made available in TVTK. For example:: >>> from tvtk.api import colors >>> colors.alice_blue (0.9412, 0.9725, 1.0) This allows you to refer to color by name easily. `pipeline.browser` ------------------ The `PipelineBrowser` class presents the view of the VTK pipeline as a tree. Double-clicking any node will let you edit the properties of the object with a trait sheet editor. The `TreeEditor` from the traits package is used to represent the view. This pipeline browser is similar to but more sophisticated than MayaVi_'s (1.x) pipeline browser. The browser will most often automatically update itself as you change the VTK pipeline. When it does not you can right click on any node and click refresh. The algorithm to generate the objects in the tree can be changed. The user may subclass `TreeGenerator` and use that instead. Please read the code and docstrings for more details on the implementation. .. _MayaVi: http://mayavi.sf.net `tools.ivtk` ------------ A utility module that makes VTK/TVTK easier to use from the Python interpreter. The module uses the `tvtk.scene` module to provide a wxPython widget. ivtk basically provides this scene along with an optional Python interpreter (via PyCrust) and an optional pipeline browser view. For a stand-alone application one may simply run the module. To use this under IPython_ (with -wthread) use the `viewer()` helper function. For example:: >>> from tvtk.tools import ivtk >>> from tvtk.api import tvtk >>> # Create your actor ... >>> a = tvtk.Actor() >>> # Now create the viewer. >>> v = ivtk.viewer() >>> v.scene.add_actors(a) # or v.scene.add_actor(a) ivtk provides several useful classes that you may use from either PyFace or wxPython -- `IVTK`, `IVTKWithCrust`, `IVTKWithBrowser` and `IVTKWithCrustAndBrowser`. Again read the code and docstrings to learn more. An example using ivtk is also available in `examples/ivtk_example.py`. .. _IPython: http://ipython.scipy.org `tools.mlab` ------------ A module that provides Matlab-like 3d visualization functionality. The general idea is shamelessly stolen from the `high-level API`_ provided by Octaviz_. Some of the test cases and demos are also translated from there! .. _Octaviz: http://octaviz.sourceforge.net/ .. _high-level API: http://octaviz.sourceforge.net/index.php?page=manpagesq The implementation provided here is object oriented and each visualization capability is implemented as a class that has traits. So each of these may be configured. Each visualization class derives (ultimately) from MLabBase which is responsible for adding/removing its actors into the render window. The classes all require that the RenderWindow be a `tvtk.scene.Scene` instance (this constraint can be relaxed if necessary later on). This module offers the following broad class of functionality: `Figure` This basically manages all of the objects rendered. Just like figure in any Matlab like environment. A convenience function called `figure` may be used to create a nice Figure instance. `Glyphs` This and its subclasses let one place glyphs at points specified as inputs. The subclasses are: `Arrows`, `Cones`, `Cubes`, `Cylinders`, `Spheres`, and `Points`. `Line3` Draws lines between the points specified at initialization time. `Outline` Draws an outline for the contained objects. `Title` Draws a title for the entire figure. `LUTBase` Manages a lookup table and a scalar bar (legend) for it. This is subclassed by all classes that need a LUT. `SurfRegular` MayaVi1's `imv.surf` like functionality that plots surfaces given x (1D), y(1D) and z (or a callable) arrays. `SurfRegularC` Also plots contour lines. `TriMesh` Given triangle connectivity and points, plots a mesh of them. `FancyTriMesh` Plots the mesh using tubes and spheres so its fancier. `Mesh` Given x, y generated from `numpy.mgrid`, and a z to go with it. Along with optional scalars. This class builds the triangle connectivity (assuming that x, y are from `numpy.mgrid`) and builds a mesh and shows it. `FancyMesh` Like mesh but shows the mesh using tubes and spheres. `Surf` This generates a surface mesh just like Mesh but renders the mesh as a surface. `Contour3` Shows contour for a mesh. `ImShow` Allows one to view large numpy arrays as image data using an image actor. This is just like MayaVi1's `mayavi.tools.imv.viewi`. To see nice examples of all of these look at the `test_*` functions at the end of the mlab.py file. Here is a quick example that uses some of these test functions:: >>> from tvtk.tools import mlab >>> f = mlab.figure() >>> mlab.test_surf(f) # Create a spherical harmonic. >>> f.pop() # Remove it. >>> mlab.test_molecule(f) # Show a caffeine molecule. >>> f.renwin.reset_zoom() # Scale the view. >>> f.pop() # Remove this. >>> mlab.test_lines(f) # Show pretty lines. >>> f.clear() # Remove all the stuff on screen. Here is the `test_surf` function just to show you how easy it is to use `mlab`:: >>> # Create the spherical harmonic. >>> from numpy import pi, cos, sin, mgrid >>> dphi, dtheta = pi/250.0, pi/250.0 >>> [phi,theta] = mgrid[0:pi+dphi*1.5:dphi,0:2*pi+dtheta*1.5:dtheta] >>> m0, m1, m2, m3, m4, m5, m6, m7 = 4, 3, 2, 3, 6, 2, 6, 4 >>> r = sin(m0*phi)**m1 + cos(m2*phi)**m3 + sin(m4*theta)**m5 + cos(m6*theta)**m7 >>> x = r*sin(phi)*cos(theta) >>> y = r*cos(phi) >>> z = r*sin(phi)*sin(theta) >>> # Now show the surface. >>> from tvtk.tools import mlab >>> fig = mlab.figure() >>> s = Surf(x, y, z, z) >>> fig.add(s) As you may notice, this example has also been translated from the Octaviz_ site. `plugins` --------- TVTK ships with two Envisage plugins. One for a TVTK scene and another for the pipeline browser. The `scene` plugin allows one to create a new TVTK scene on the work area. Any number of these may be created. It provides useful menu's to set the view of the scene (like the ivtk menus). It also allows the user to save the view to an image. The plugin also provides a few preferences to set the background color of the window etc. The `browser` plugin places a pipeline browser on the left of the Envisage window. This browser is hooked up to listen to scene additions to the work area. Each time a scene is added it will show up as a top-level node in the browser. These plugins may be used from any Envisage plugin. To see a fully functional example of this please look at the `examples/plugin/` directory. The example demonstrates how to use the plugins in Envisage and make an application. mayavi-4.5.0/docs/THANKS.txt0000644000076500000240000000116012747716313016104 0ustar prabhustaff00000000000000Developers: Prabhu Ramachandran (2001-) Gal Varoquaux (2007-) Deepak Surti (2013-) We gratefully acknowledge patches and other contributions from the following. Please let us know if we missed anyone, thanks! Patches: - Fredric Petit - Extensive testing, wiki and cookbook pages. Patch for NaN support. - Varun Hiremath - Debian package maintainer, ExtractVectorComponents filter. - K. K. Rai and R. A. Ambareesha - Parametric source, image readers and image filters. Chandrashekhar P. Kaushik - Hide/show, image reader, texture support. mayavi-4.5.0/docs/TODO.txt0000644000076500000240000000200412747716313015657 0ustar prabhustaff00000000000000MayaVi2: - Core: - Better and correct persistence. (p) - Double-clicking on objects in the scene to open there properties. - Sources: - Multiblock data support. - Modules/Filters: - UI: - Option to make slicing and other operations less interactive (like the streamline module) for larger data. - Transfer editor for images. (g) - Improve the recorder UI: * Integrate the dialog in Envisage, when using Envisage. * Remove the 'save dialog' that pops up when the recording mode is turned off. * Stop recording when the recording dialog is closed. - Misc: - Support for animation. - Support for multiple renderers in a single scene. - Support for saving the default values of a TVTK object and persist them. - Documentation: - Mlab: - add texture support to Mlab - find a good way to make graphs with color/scalar on the edges. mayavi-4.5.0/examples/0000755000076500000240000000000012747722127015243 5ustar prabhustaff00000000000000mayavi-4.5.0/examples/mayavi/0000755000076500000240000000000012747722127016531 5ustar prabhustaff00000000000000mayavi-4.5.0/examples/mayavi/advanced_visualization/0000755000076500000240000000000012747722127023257 5ustar prabhustaff00000000000000mayavi-4.5.0/examples/mayavi/advanced_visualization/contour.py0000644000076500000240000000450712747716313025330 0ustar prabhustaff00000000000000#!/usr/bin/env python """ This script demonstrates how one can script Mayavi and use its contour related modules. """ # Author: Prabhu Ramachandran # Copyright (c) 2005-2008, Enthought, Inc. # License: BSD Style. # Standard library imports from os.path import join, abspath, dirname # Enthought library imports from mayavi.scripts import mayavi2 from mayavi.sources.vtk_file_reader import VTKFileReader from mayavi.modules.outline import Outline from mayavi.modules.grid_plane import GridPlane from mayavi.modules.contour_grid_plane import ContourGridPlane from mayavi.modules.iso_surface import IsoSurface from mayavi.modules.scalar_cut_plane import ScalarCutPlane @mayavi2.standalone def contour(): """The script itself. We needn't have defined a function but having a function makes this more reusable. """ # 'mayavi' is always defined on the interpreter. # Create a new scene. mayavi.new_scene() # Read a VTK (old style) data file. r = VTKFileReader() filename = join(mayavi2.get_data_dir(dirname(abspath(__file__))), 'heart.vtk') r.initialize(filename) mayavi.add_source(r) # Create an outline for the data. o = Outline() mayavi.add_module(o) # Create three simple grid plane modules. # First normal to 'x' axis. gp = GridPlane() mayavi.add_module(gp) # Second normal to 'y' axis. gp = GridPlane() mayavi.add_module(gp) gp.grid_plane.axis = 'y' # Third normal to 'z' axis. gp = GridPlane() mayavi.add_module(gp) gp.grid_plane.axis = 'z' # Create one ContourGridPlane normal to the 'x' axis. cgp = ContourGridPlane() mayavi.add_module(cgp) # Set the position to the middle of the data. cgp.grid_plane.position = 15 # Another with filled contours normal to 'y' axis. cgp = ContourGridPlane() mayavi.add_module(cgp) # Set the axis and position to the middle of the data. cgp.grid_plane.axis = 'y' cgp.grid_plane.position = 15 cgp.contour.filled_contours = True # An isosurface module. iso = IsoSurface(compute_normals=True) mayavi.add_module(iso) iso.contour.contours = [220.0] # An interactive scalar cut plane. cp = ScalarCutPlane() mayavi.add_module(cp) cp.implicit_plane.normal = 0,0,1 if __name__ == '__main__': contour() mayavi-4.5.0/examples/mayavi/advanced_visualization/contour_contour.py0000644000076500000240000000344112747716313027075 0ustar prabhustaff00000000000000#!/usr/bin/env python """This example shows how you can produce contours on an IsoSurface. """ # Author: Prabhu Ramachandran # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. # Standard library imports from os.path import join, abspath, dirname # Mayavi imports. from mayavi.scripts import mayavi2 from mayavi.sources.api import VTKXMLFileReader from mayavi.filters.contour import Contour from mayavi.filters.api import PolyDataNormals from mayavi.filters.set_active_attribute import SetActiveAttribute from mayavi.modules.api import Surface, Outline @mayavi2.standalone def main(): mayavi.new_scene() # Read the example data: fire_ug.vtu. r = VTKXMLFileReader() filename = join(mayavi2.get_data_dir(dirname(abspath(__file__))), 'fire_ug.vtu') r.initialize(filename) mayavi.add_source(r) # Set the active point scalars to 'u'. r.point_scalars_name = 'u' # Simple outline for the data. o = Outline() mayavi.add_module(o) # Branch the pipeline with a contour -- the outline above is # directly attached to the source whereas the contour below is a # filter and will branch the flow of data. An isosurface in the # 'u' data attribute is generated and normals generated for it. c = Contour() mayavi.add_filter(c) n = PolyDataNormals() mayavi.add_filter(n) # Now we want to show the temperature 't' on the surface of the 'u' # iso-contour. This is easily done by using the SetActiveAttribute # filter below. aa = SetActiveAttribute() mayavi.add_filter(aa) aa.point_scalars_name = 't' # Now view the iso-contours of 't' with a Surface filter. s = Surface(enable_contours=True) mayavi.add_module(s) if __name__ == "__main__": main() mayavi-4.5.0/examples/mayavi/advanced_visualization/datasets.py0000644000076500000240000001227712747716313025452 0ustar prabhustaff00000000000000""" A Mayavi example to show the different data sets. See :ref:`data-structures-used-by-mayavi` for a discussion. The following images are created: .. hlist:: * **ImageData** .. image:: ../image_data.jpg :scale: 50 * **RectilinearGrid** .. image:: ../rectilinear_grid.jpg :scale: 50 * **StructuredGrid** .. image:: ../structured_grid.jpg :scale: 50 * **UnstructuredGrid** .. image:: ../unstructured_grid.jpg :scale: 50 """ # Author: Gael Varoquaux # Copyright (c) 2008, Enthought, Inc. # License: BSD style. from numpy import array, random, linspace, pi, ravel, cos, sin, empty from tvtk.api import tvtk from mayavi.sources.vtk_data_source import VTKDataSource from mayavi import mlab def image_data(): data = random.random((3, 3, 3)) i = tvtk.ImageData(spacing=(1, 1, 1), origin=(0, 0, 0)) i.point_data.scalars = data.ravel() i.point_data.scalars.name = 'scalars' i.dimensions = data.shape return i def rectilinear_grid(): data = random.random((3, 3, 3)) r = tvtk.RectilinearGrid() r.point_data.scalars = data.ravel() r.point_data.scalars.name = 'scalars' r.dimensions = data.shape r.x_coordinates = array((0, 0.7, 1.4)) r.y_coordinates = array((0, 1, 3)) r.z_coordinates = array((0, .5, 2)) return r def generate_annulus(r, theta, z): """ Generate points for structured grid for a cylindrical annular volume. This method is useful for generating a unstructured cylindrical mesh for VTK (and perhaps other tools). """ # Find the x values and y values for each plane. x_plane = (cos(theta)*r[:,None]).ravel() y_plane = (sin(theta)*r[:,None]).ravel() # Allocate an array for all the points. We'll have len(x_plane) # points on each plane, and we have a plane for each z value, so # we need len(x_plane)*len(z) points. points = empty([len(x_plane)*len(z),3]) # Loop through the points for each plane and fill them with the # correct x,y,z values. start = 0 for z_plane in z: end = start+len(x_plane) # slice out a plane of the output points and fill it # with the x,y, and z values for this plane. The x,y # values are the same for every plane. The z value # is set to the current z plane_points = points[start:end] plane_points[:,0] = x_plane plane_points[:,1] = y_plane plane_points[:,2] = z_plane start = end return points def structured_grid(): # Make the data. dims = (3, 4, 3) r = linspace(5, 15, dims[0]) theta = linspace(0, 0.5*pi, dims[1]) z = linspace(0, 10, dims[2]) pts = generate_annulus(r, theta, z) sgrid = tvtk.StructuredGrid(dimensions=(dims[1], dims[0], dims[2])) sgrid.points = pts s = random.random((dims[0]*dims[1]*dims[2])) sgrid.point_data.scalars = ravel(s.copy()) sgrid.point_data.scalars.name = 'scalars' return sgrid def unstructured_grid(): points = array([[0,1.2,0.6], [1,0,0], [0,1,0], [1,1,1], # tetra [1,0,-0.5], [2,0,0], [2,1.5,0], [0,1,0], [1,0,0], [1.5,-0.2,1], [1.6,1,1.5], [1,1,1], # Hex ], 'f') # The cells cells = array([4, 0, 1, 2, 3, # tetra 8, 4, 5, 6, 7, 8, 9, 10, 11 # hex ]) # The offsets for the cells, i.e. the indices where the cells # start. offset = array([0, 5]) tetra_type = tvtk.Tetra().cell_type # VTK_TETRA == 10 hex_type = tvtk.Hexahedron().cell_type # VTK_HEXAHEDRON == 12 cell_types = array([tetra_type, hex_type]) # Create the array of cells unambiguously. cell_array = tvtk.CellArray() cell_array.set_cells(2, cells) # Now create the UG. ug = tvtk.UnstructuredGrid(points=points) # Now just set the cell types and reuse the ug locations and cells. ug.set_cells(cell_types, offset, cell_array) scalars = random.random(points.shape[0]) ug.point_data.scalars = scalars ug.point_data.scalars.name = 'scalars' return ug def polydata(): # The numpy array data. points = array([[0,-0.5,0], [1.5,0,0], [0,1,0], [0,0,0.5], [-1,-1.5,0.1], [0,-1, 0.5], [-1, -0.5, 0], [1,0.8,0]], 'f') triangles = array([[0,1,3], [1,2,3], [1,0,5], [2,3,4], [3,0,4], [0,5,4], [2, 4, 6], [2, 1, 7]]) scalars = random.random(points.shape) # The TVTK dataset. mesh = tvtk.PolyData(points=points, polys=triangles) mesh.point_data.scalars = scalars mesh.point_data.scalars.name = 'scalars' return mesh def view(dataset): """ Open up a mayavi scene and display the dataset in it. """ fig = mlab.figure(bgcolor=(1, 1, 1), fgcolor=(0, 0, 0), figure=dataset.class_name[3:]) surf = mlab.pipeline.surface(dataset, opacity=0.1) mlab.pipeline.surface(mlab.pipeline.extract_edges(surf), color=(0, 0, 0), ) @mlab.show def main(): view(image_data()) view(rectilinear_grid()) view(structured_grid()) view(unstructured_grid()) view(polydata()) if __name__ == '__main__': main() mayavi-4.5.0/examples/mayavi/advanced_visualization/delaunay_graph.py0000644000076500000240000002020712747716313026615 0ustar prabhustaff00000000000000""" An example illustrating graph manipulation and display with Mayavi and NetworkX. This example shows how to use Mayavi in a purely algorithmic way, to compute a Delaunay from data points, extract it and pass it to networkx. It also shows how to plot a graph using quiver. Starting from points positioned regularly on a sphere, we first use VTK to create the Delaunay graph, and also to plot it. We then create a matching NetworkX graph, calling it's minimum spanning tree function. We display it using Mayavi. The visualization clearly shows that the minimum spanning tree of the points, considering all possible connections, is included in the Delaunay graph. _____ The function `compute_delaunay_edges` uses VTK to retrieve the Delaunay graph of a set of points. First a structure of unconnected points is created using `mlab.points3d`. The Delaunay filter applied to it builds an unstructured grid (see :ref:`data-structures-used-by-mayavi`). We apply an ExtractEdges filter to it, which returns a structure of points connected by edges: the :ref:`PolyData structure `. The dataset structure can be retrieved as the first item of the `outputs` list of the ExtractEdges filter object, returned by the `mlab.pipeline.extract_edges` factory function. Once we have this object, we extract the points and edge list from it. This graph-plotting technique differs from the technique used in the examples :ref:`example_protein` and :ref:`example_flight_graph` where points are created and connected by lines. Unlike these techniques, it enables storing scalar data on each line. _____ To visualize the graph (function `graph_plot`), we build a list of vectors giving the edges, and use `mlab.quiver3d` to display them. To display an unoriented graph, it is best to use the `2ddash` mode of `quiver3d`. """ # Author: Gary Ruben # Gael Varoquaux # Copyright (c) 2009, Enthought, Inc. # License: BSD style. from mayavi import mlab import numpy as np import networkx as nx def compute_delaunay_edges(x, y, z, visualize=False): """ Given 3-D points, returns the edges of their Delaunay triangulation. Parameters ----------- x: ndarray x coordinates of the points y: ndarray y coordinates of the points z: ndarray z coordinates of the points Returns --------- new_x: ndarray new x coordinates of the points (same coords but different assignment of points) new_y: ndarray new y coordinates of the points (same coords but different assignment of points) new_z: ndarray new z coordinates of the points (same coords but different assignment of points) edges: 2D ndarray. The indices of the edges of the Delaunay triangulation as a (N, 2) array [[pair1_index1, pair1_index2], [pair2_index1, pair2_index2], ... ] """ if visualize: vtk_source = mlab.points3d(x, y, z, opacity=0.3, mode='2dvertex') vtk_source.actor.property.point_size = 3 else: vtk_source = mlab.pipeline.scalar_scatter(x, y, z, figure=False) delaunay = mlab.pipeline.delaunay3d(vtk_source) delaunay.filter.offset = 999 # seems more reliable than the default edges = mlab.pipeline.extract_edges(delaunay) if visualize: mlab.pipeline.surface(edges, opacity=0.3, line_width=3) # We extract the output array. the 'points' attribute itself # is a TVTK array, that we convert to a numpy array using # its 'to_array' method. new_x, new_y, new_z = edges.outputs[0].points.to_array().T lines = edges.outputs[0].lines.to_array() return new_x, new_y, new_z, np.array([lines[1::3], lines[2::3]]).T def graph_plot(x, y, z, start_idx, end_idx, edge_scalars=None, **kwargs): """ Show the graph edges using Mayavi Parameters ----------- x: ndarray x coordinates of the points y: ndarray y coordinates of the points z: ndarray z coordinates of the points edge_scalars: ndarray, optional optional data to give the color of the edges. kwargs: extra keyword arguments are passed to quiver3d. """ vec = mlab.quiver3d(x[start_idx], y[start_idx], z[start_idx], x[end_idx] - x[start_idx], y[end_idx] - y[start_idx], z[end_idx] - z[start_idx], scalars=edge_scalars, mode='2ddash', scale_factor=1, **kwargs) if edge_scalars is not None: vec.glyph.color_mode = 'color_by_scalar' return vec def build_geometric_graph(x, y, z, edges): """ Build a NetworkX graph with xyz node coordinates and the node indices of the end nodes. Parameters ----------- x: ndarray x coordinates of the points y: ndarray y coordinates of the points z: ndarray z coordinates of the points edges: the (2, N) array returned by compute_delaunay_edges() containing node indices of the end nodes. Weights are applied to the edges based on their euclidean length for use by the MST algorithm. Returns --------- g: A NetworkX undirected graph Notes ------ We don't bother putting the coordinates into the NX graph. Instead the graph node is an index to the column. """ xyz = np.array((x, y, z)) def euclidean_dist(i, j): d = xyz[:,i] - xyz[:,j] return np.sqrt(np.dot(d, d)) g = nx.Graph() for i, j in edges: if nx.__version__.split('.')[0] > '0': g.add_edge(i, j, weight=euclidean_dist(i, j)) else: g.add_edge(i, j, euclidean_dist(i, j)) return g def points_on_sphere(N): """ Generate N evenly distributed points on the unit sphere centered at the origin. Uses the 'Golden Spiral'. Code by Chris Colbert from the numpy-discussion list. """ phi = (1 + np.sqrt(5)) / 2 # the golden ratio long_incr = 2*np.pi / phi # how much to increment the longitude dz = 2.0 / float(N) # a unit sphere has diameter 2 bands = np.arange(N) # each band will have one point placed on it z = bands * dz - 1 + (dz/2) # the height z of each band/point r = np.sqrt(1 - z*z) # project onto xy-plane az = bands * long_incr # azimuthal angle of point modulo 2 pi x = r * np.cos(az) y = r * np.sin(az) return x, y, z ################################################################################ if __name__ == '__main__': # generate some points x, y, z = points_on_sphere(50) # Avoid triangulation problems on the sphere z *= 1.01 mlab.figure(1, bgcolor=(0,0,0)) mlab.clf() # Now get the Delaunay Triangulation from vtk via mayavi mlab. Vtk stores # its points in a different order so overwrite ours to match the edges new_x, new_y, new_z, edges = compute_delaunay_edges(x, y, z, visualize=True) assert(x.shape == new_x.shape) # check triangulation got everything x, y, z = new_x, new_y, new_z if nx.__version__ < '0.99': raise ImportError('The version of NetworkX must be at least ' '0.99 to run this example') # Make a NetworkX graph out of our point and edge data g = build_geometric_graph(x, y, z, edges) # Compute minimum spanning tree using networkx # nx.mst returns an edge generator edges = nx.minimum_spanning_tree(g).edges(data=True) start_idx, end_idx, _ = np.array(list(edges)).T start_idx = start_idx.astype(np.int) end_idx = end_idx.astype(np.int) # Plot this with Mayavi graph_plot(x, y, z, start_idx, end_idx, edge_scalars=z[start_idx], opacity=0.8, colormap='summer', line_width=4, ) mlab.view(60, 46, 4) mlab.show() mayavi-4.5.0/examples/mayavi/advanced_visualization/glyph.py0000644000076500000240000000351412747716313024757 0ustar prabhustaff00000000000000#!/usr/bin/env python """ This script demonstrates using the Mayavi core API to add a VectorCutPlane, split the pipeline using a MaskPoints filter and then view the filtered data with the Glyph module. """ # Author: Prabhu Ramachandran # Copyright (c) 2005-2008, Enthought, Inc. # License: BSD Style. # Standard library imports from os.path import join, abspath, dirname # Enthought library imports from mayavi.scripts import mayavi2 from mayavi.sources.vtk_xml_file_reader import VTKXMLFileReader from mayavi.modules.outline import Outline from mayavi.modules.glyph import Glyph from mayavi.modules.vector_cut_plane import VectorCutPlane from mayavi.filters.mask_points import MaskPoints @mayavi2.standalone def glyph(): """The script itself. We needn't have defined a function but having a function makes this more reusable. """ # 'mayavi' is always defined on the interpreter. # Create a new VTK scene. mayavi.new_scene() # Read a VTK (old style) data file. r = VTKXMLFileReader() r.initialize(join(mayavi2.get_data_dir(dirname(abspath(__file__))), 'fire_ug.vtu')) mayavi.add_source(r) # Create an outline and a vector cut plane. mayavi.add_module(Outline()) v = VectorCutPlane() mayavi.add_module(v) v.glyph.color_mode = 'color_by_scalar' # Now mask the points and show glyphs (we could also use # Vectors but glyphs are a bit more generic) m = MaskPoints() m.filter.set(on_ratio=10, random_mode=True) mayavi.add_filter(m) g = Glyph() mayavi.add_module(g) # Note that this adds the module to the filtered output. g.glyph.scale_mode = 'scale_by_vector' # Use arrows to view the scalars. gs = g.glyph.glyph_source gs.glyph_source = gs.glyph_dict['arrow_source'] if __name__ == '__main__': glyph() mayavi-4.5.0/examples/mayavi/advanced_visualization/image_cursor_filter.py0000644000076500000240000000627612747716313027670 0ustar prabhustaff00000000000000""" Excample using the UserDefined filter to paint a cross-shaped cursor on data, in order to point out a special position. We use the UserDefined filter `ImageCursor3D` to create the cursor. A Gaussian data field is painted with the cursor, and then visualized using the ImagePlaneWIdget module. ImageCursor3D is one example among many of the use of the UserDefined, which allows to use TVTK filters that are not. See :ref:`using_userdefined_filter` for more details. Also, other examples using the UserDefined filter are provided in :ref:`example_mri` and :ref:`example_tvtk_segmentation`. Selecting the UserDefined filter in the Mayavi pipeline is a convenient way to look for additional filters. This pops up a dialog called `TVTK class chooser`, with a `Search` field that allows to search for desired actions or properties. For example, searching for `cursor` returns several filters, among which Cursor3D and ImageCursor3D. As a rule of thumb, the name of TVTK filters acting on TVTK ImageData dataset starts with `Image` (ImageData is the type of VTK data set created by e.g. mlab.pipeline.scalar_field. See :ref:`data-structures-used-by-mayavi` for more details about VTK datasets). In the dialog used to interactively add the UserDefined filet, we can therefore select `ImageCursor3D`. The documentation of the filter is displayed when selecting its name within the `Class name` field of the dialog. """ # Authors: Emmanuelle Gouillart # and Gael Varoquaux # Copyright (c) 2009, Enthought, Inc. # License: BSD Style. from mayavi import mlab import numpy as np # Define Gaussian data field x, y, z = np.ogrid[0:1:40j, 0:1:40j, 0:1:40j] sig = 0.5 center = 0.5 g = np.exp(-((x-center)**2 + (y-center)**2 + (z-center)**2)/(2*sig**2)) ################################################################################ mlab.figure(fgcolor=(0, 0, 0), bgcolor=(1, 1, 1)) # Define the cursor s = mlab.pipeline.scalar_field(g) cursor = mlab.pipeline.user_defined(s, filter='ImageCursor3D') # The TVTK filter used by Mayavi is accessible as the '.filter' # attribute of the Mayavi filtered returned by user_defined. # We can set the graphical properties of the cross via attributes of # cursor.filter, and not of cursor itself. Here cursor is a Mayavi filter, # that is an object that inserts in the Mayavi pipeline, whereas # cursor.filter is the TVTK filter that actually does the work. # Put the cursor at the center of the field volume (default is (0, 0, 0)) cursor.filter.cursor_position = np.array([20, 20, 20]) # Define the value of the cursor (default is 255) so that there is # enough contrast between the cursor and the data values in the neighbourhood # of the cursor. The cursor value is within the data value range so that # the contrast of the data is not altered. cursor.filter.cursor_value = 0 # Define the radius of the cross (the extent of the cross is 2xcursor_radius) cursor.filter.cursor_radius = 10 # Display data and cursor using an image_plane_widget that intersects the # cursor. ipw = mlab.pipeline.image_plane_widget(cursor, plane_orientation='x_axes', slice_index=20) # View mlab.colorbar() mlab.view(15, 70, 100, [20, 20, 20]) mlab.show() mayavi-4.5.0/examples/mayavi/advanced_visualization/magnetic_field.py0000644000076500000240000001713612747716313026573 0ustar prabhustaff00000000000000""" An example mixing numerical caculation and 3D visualization of the magnetic field created by an arbitrary number of current loops. The goal of this example is to show how Mayavi can be used with scipy to debug and understand physics and electromagnetics computation. The field is caculated for an arbitrary number of current loops using the corresponding exact formula. The coils are plotted in 3D with a synthetic view of the magnetic_field. A VectorCutPlane is used as it enables good inspection of the magnetic field. This example originated from a real-life case of coil design in Python ( Atomic sources for long-time-of-flight interferometric inertial sensors, G. Varoquaux, http://tel.archives-ouvertes.fr/tel-00265714/, page 148). For another visualization of magnetic field, see the :ref:`example_magnetic_field_lines`. """ # Author: Gael Varoquaux # Copyright (c) 2009, Enthought, Inc. # License: BSD Style. import numpy as np from scipy import special from mayavi import mlab ############################################################################## # Function to caculate the Magnetic field generated by a current loop def base_vectors(n): """ Returns 3 orthognal base vectors, the first one colinear to n. Parameters ----------- n: ndarray, shape (3, ) A vector giving direction of the basis Returns ----------- n: ndarray, shape (3, ) The first vector of the basis l: ndarray, shape (3, ) The second vector of the basis m: ndarray, shape (3, ) The first vector of the basis """ # normalize n n = n / (n**2).sum(axis=-1) # choose two vectors perpendicular to n # choice is arbitrary since the coil is symetric about n if np.abs(n[0])==1 : l = np.r_[n[2], 0, -n[0]] else: l = np.r_[0, n[2], -n[1]] l = l / (l**2).sum(axis=-1) m = np.cross(n, l) return n, l, m def magnetic_field(r, n, r0, R): """ Returns the magnetic field from an arbitrary current loop calculated from eqns (1) and (2) in Phys Rev A Vol. 35, N 4, pp. 1535-1546; 1987. Arguments ---------- n: ndarray, shape (3, ) The normal vector to the plane of the loop at the center, current is oriented by the right-hand-rule. r: ndarray, shape (m, 3) A position vector where the magnetic field is evaluated: [x1 y2 z3 ; x2 y2 z2 ; ... ] r is in units of d r0: ndarray, shape (3, ) The location of the center of the loop in units of d: [x y z] R: float The radius of the current loop Returns -------- B: ndarray, shape (m, 3) a vector for the B field at each position specified in r in inverse units of (mu I) / (2 pi d) for I in amps and d in meters and mu = 4 pi * 10^-7 we get Tesla """ ### Translate the coordinates in the coil's frame n, l, m = base_vectors(n) # transformation matrix coil frame to lab frame trans = np.vstack((l, m, n)) # transformation matrix to lab frame to coil frame inv_trans = np.linalg.inv(trans) # point location from center of coil r = r - r0 # transform vector to coil frame r = np.dot(r, inv_trans) #### calculate field # express the coordinates in polar form x = r[:, 0] y = r[:, 1] z = r[:, 2] rho = np.sqrt(x**2 + y**2) theta = np.arctan(x/y) theta[y==0] = 0 E = special.ellipe((4 * R * rho)/( (R + rho)**2 + z**2)) K = special.ellipk((4 * R * rho)/( (R + rho)**2 + z**2)) Bz = 1/np.sqrt((R + rho)**2 + z**2) * ( K + E * (R**2 - rho**2 - z**2)/((R - rho)**2 + z**2) ) Brho = z/(rho*np.sqrt((R + rho)**2 + z**2)) * ( -K + E * (R**2 + rho**2 + z**2)/((R - rho)**2 + z**2) ) # On the axis of the coil we get a divided by zero here. This returns a # NaN, where the field is actually zero : Brho[np.isnan(Brho)] = 0 Brho[np.isinf(Brho)] = 0 Bz[np.isnan(Bz)] = 0 Bz[np.isinf(Bz)] = 0 B = np.c_[np.cos(theta)*Brho, np.sin(theta)*Brho, Bz ] # Rotate the field back in the lab's frame B = np.dot(B, trans) return B def display_coil(n, r0, R, half=False): """ Display a coils in the 3D view. If half is True, display only one half of the coil. """ n, l, m = base_vectors(n) theta = np.linspace(0, (2-half)*np.pi, 30) theta = theta[..., np.newaxis] coil = np.atleast_1d(R)*(np.sin(theta)*l + np.cos(theta)*m) coil += r0 coil_x = coil[:, 0] coil_y = coil[:, 1] coil_z = coil[:, 2] mlab.plot3d(coil_x, coil_y, coil_z, tube_radius=0.01, name='Coil %i' % display_coil.num, color=(0, 0, 0)) display_coil.num += 1 return coil_x, coil_y, coil_z display_coil.num = 0 ############################################################################## # The grid of points on which we want to evaluate the field X, Y, Z = np.mgrid[-0.15:0.15:31j, -0.15:0.15:31j, -0.15:0.15:31j] # Avoid rounding issues : f = 1e4 # this gives the precision we are interested by : X = np.round(X * f) / f Y = np.round(Y * f) / f Z = np.round(Z * f) / f r = np.c_[X.ravel(), Y.ravel(), Z.ravel()] ############################################################################## # The coil positions # The center of the coil r0 = np.r_[0, 0, 0.1] # The normal to the coils n = np.r_[0, 0, 1] # The radius R = 0.1 # Add the mirror image of this coils relatively to the xy plane : r0 = np.vstack((r0, -r0 )) R = np.r_[R, R] n = np.vstack((n, n)) # Helmoltz like configuration ############################################################################## # Calculate field # First initialize a container matrix for the field vector : B = np.empty_like(r) # Then loop through the different coils and sum the fields : for this_n, this_r0, this_R in zip(n, r0, R): this_n = np.array(this_n) this_r0 = np.array(this_r0) this_R = np.array(this_R) B += magnetic_field(r, this_n, this_r0, this_R) Bx = B[:, 0] By = B[:, 1] Bz = B[:, 2] Bx.shape = X.shape By.shape = Y.shape Bz.shape = Z.shape Bnorm = np.sqrt(Bx**2 + By**2 + Bz**2) ############################################################################## # Visualization # We threshold the data ourselves, as the threshold filter produce a # data structure inefficient with IsoSurface Bmax = 100 Bx[Bnorm > Bmax] = 0 By[Bnorm > Bmax] = 0 Bz[Bnorm > Bmax] = 0 Bnorm[Bnorm > Bmax] = Bmax mlab.figure(1, bgcolor=(1, 1, 1), fgcolor=(0.5, 0.5, 0.5), size=(480, 480)) mlab.clf() for this_n, this_r0, this_R in zip(n, r0, R): display_coil(this_n, this_r0, this_R) field = mlab.pipeline.vector_field(X, Y, Z, Bx, By, Bz, scalars=Bnorm, name='B field') vectors = mlab.pipeline.vectors(field, scale_factor=(X[1, 0, 0] - X[0, 0, 0]), ) # Mask random points, to have a lighter visualization. vectors.glyph.mask_input_points = True vectors.glyph.mask_points.on_ratio = 6 vcp = mlab.pipeline.vector_cut_plane(field) vcp.glyph.glyph.scale_factor=5*(X[1, 0, 0] - X[0, 0, 0]) # For prettier picture: #vcp.implicit_plane.widget.enabled = False iso = mlab.pipeline.iso_surface(field, contours=[0.1*Bmax, 0.4*Bmax], opacity=0.6, colormap='YlOrRd') # A trick to make transparency look better: cull the front face iso.actor.property.frontface_culling = True mlab.view(39, 74, 0.59, [.008, .0007, -.005]) mlab.show() mayavi-4.5.0/examples/mayavi/advanced_visualization/mlab_3D_to_2D.py0000644000076500000240000002552012747716313026125 0ustar prabhustaff00000000000000""" A script to calculate the projection of 3D world coordinates to 2D display coordinates (pixel coordinates) for a given scene. The 2D pixel locations of objects in the image plane are related to their 3D world coordinates by a series of linear transformations. The specific transformations fall under the group known as projective transformations. This set includes pure projectivities, affine transformations, perspective transformations, and euclidean transformations. In the case of mlab (and most other computer visualization software), we deal with only the perspective and euclidean cases. An overview of Projective space can be found here: http://en.wikipedia.org/wiki/Projective_space and a thorough treatment of projective geometry can be had in the book "Multiple View Geometry in Computer Vision" by Richard Hartley. The essential thing to know for this example is that points in 3-space are related to points in 2-space through a series of multiplications of 4x4 matrices which are the perspective and euclidean transformations. The 4x4 matrices predicate the use of length 4 vectors to represent points. This representation is known as homogeneous coordinates, and while they appear foriegn at first, they truly simplify all the mathematics involved. In short, homogeneous coordinates are your friend, and you should read about them here: http://en.wikipedia.org/wiki/Homogeneous_coordinates In the normal pinhole camera model (the ideal real world model), 3D world points are related to 2D image points by the matrix termed the 'essential' matrix which is a combination of a perspective transformation and a euclidean transformation. The perspective transformation is defined by the camera intrinsics (focal length, imaging sensor offset, etc...) and the euclidean transformation is defined by the cameras position and orientation. In computer graphics, things are not so simple. This is because computer graphics have the benefit of being able to do things which are not possible in the real world: adding clipping planes, offset projection centers, arbitrary distortions, etc... Thus, a slightly different model is used. What follows is the camera/view model for OpenGL and thus, VTK. I can not guarantee that other packages follow this model. There are 4 different transformations that are applied 3D world coordinates to map them to 2D pixel coordinates. They are: the model transform, the view transform, the perspective transform, and the viewport or display transform. In OpenGL the first two transformations are concatenated to yield the modelview transform (called simply the view transform in VTK). The modelview transformation applies arbitrary scaling and distortions to the model (if they are specified) and transforms them so that the orientation is the equivalent of looking down the negative Z axis. Imagine its as if you relocate your camera to look down the negative Z axis, and then move everything in the world so that you see it now as you did before you moved the camera. The resulting coordinates are termed "eye" coordinates in OpenGL (I don't know that they have a name in VTK). The perspective transformation applies the camera perspective to the eye coordinates. This transform is what makes objects in the foreground look bigger than equivalent objects in the background. In the pinhole camera model, this transform is determined uniquely by the focal length of the camera and its position in 3-space. In Vtk/OpenGL it is determined by the frustum. A frustum is simply a pyramid with the top lopped off. The top of the pyramid (a point) is the camera location, the base of the pyramid is a plane (the far clipping plane) defined as normal to principle camera ray at distance termed the far clipping distance, the top of the frustum (where it's lopped off) is the near clipping plane, with a definition similar to that of the far clipping plane. The sides of the frustum are determined by the aspect ratio of the camera (width/height) and its field-of-view. Any points not lying within the frustum are not mapped to the screen (as they would lie outside the viewable area). The perpspective transformation has the effect of scaling everything within the frustum to fit within a cube defined in the range (-1,1)(-1,1)(-1,1) as represented by homogeneous coordinates. The last phrase there is important, the first 3 coordinates will not, in general, be within the unity range until we divide through by the last coordinate (See the wikipedia on homogeneous coordinates if this is confusing). The resulting coordinates are termed (appropriately enough) normalized view coordinates. The last transformation (the viewport transformation) takes us from normalized view coordinates to display coordinates. At this point, you may be asking yourself 'why not just go directly to display coordinates, why need normalized view coordinates at all?', the answer is that we may want to embed more than one view in a particular window, there will therefore be different transformations to take each view to an appropriate position an size in the window. The normalized view coordinates provide a nice common ground so-to-speak. At any rate, the viewport transformation simply scales and translates the X and Y coordinates of the normalized view coordinates to the appropriate pixel coordinates. We don't use the Z value in our example because we don't care about it. It is used for other various things however. That's all there is to it, pretty simple right? Right. Here is an overview: Given a set of 3D world coordinates: - Apply the modelview transformation (view transform in VTK) to get eye coordinates - Apply the perspective transformation to get normalized view coordinates - Apply the viewport transformation to get display coordinates VTK provides a nice method to retrieve a 4x4 matrix that combines the first two operations. As far as I can tell, VTK does not export a method to retrieve the 4x4 matrix representing the viewport transformation, so we are on our there to create one (no worries though, its not hard, as you will see). Now that the prelimenaries are out of the way, lets get started. """ # Author: S. Chris Colbert # Copyright (c) 2009, S. Chris Colbert # License: BSD Style from __future__ import print_function # this import is here because we need to ensure that matplotlib uses the # wx backend and having regular code outside the main block is PyTaboo. # It needs to be imported first, so that matplotlib can impose the # version of Wx it requires. import matplotlib matplotlib.use('WXAgg') import pylab as pl import numpy as np from mayavi import mlab from mayavi.core.ui.mayavi_scene import MayaviScene def get_world_to_view_matrix(mlab_scene): """returns the 4x4 matrix that is a concatenation of the modelview transform and perspective transform. Takes as input an mlab scene object.""" if not isinstance(mlab_scene, MayaviScene): raise TypeError('argument must be an instance of MayaviScene') # The VTK method needs the aspect ratio and near and far clipping planes # in order to return the proper transform. So we query the current scene # object to get the parameters we need. scene_size = tuple(mlab_scene.get_size()) clip_range = mlab_scene.camera.clipping_range aspect_ratio = float(scene_size[0])/float(scene_size[1]) # this actually just gets a vtk matrix object, we can't really do anything with it yet vtk_comb_trans_mat = mlab_scene.camera.get_composite_projection_transform_matrix( aspect_ratio, clip_range[0], clip_range[1]) # get the vtk mat as a numpy array np_comb_trans_mat = vtk_comb_trans_mat.to_array() return np_comb_trans_mat def get_view_to_display_matrix(mlab_scene): """ this function returns a 4x4 matrix that will convert normalized view coordinates to display coordinates. It's assumed that the view should take up the entire window and that the origin of the window is in the upper left corner""" if not (isinstance(mlab_scene, MayaviScene)): raise TypeError('argument must be an instance of MayaviScene') # this gets the client size of the window x, y = tuple(mlab_scene.get_size()) # normalized view coordinates have the origin in the middle of the space # so we need to scale by width and height of the display window and shift # by half width and half height. The matrix accomplishes that. view_to_disp_mat = np.array([[x/2.0, 0., 0., x/2.0], [ 0., -y/2.0, 0., y/2.0], [ 0., 0., 1., 0.], [ 0., 0., 0., 1.]]) return view_to_disp_mat def apply_transform_to_points(points, trans_mat): """a function that applies a 4x4 transformation matrix to an of homogeneous points. The array of points should have shape Nx4""" if not trans_mat.shape == (4, 4): raise ValueError('transform matrix must be 4x4') if not points.shape[1] == 4: raise ValueError('point array must have shape Nx4') return np.dot(trans_mat, points.T).T if __name__ == '__main__': f = mlab.figure() N = 4 # create a few points in 3-space X = np.random.random_integers(-3, 3, N) Y = np.random.random_integers(-3, 3, N) Z = np.random.random_integers(-3, 3, N) # plot the points with mlab pts = mlab.points3d(X, Y, Z) # now were going to create a single N x 4 array of our points # adding a fourth column of ones expresses the world points in # homogenous coordinates W = np.ones(X.shape) hmgns_world_coords = np.column_stack((X, Y, Z, W)) # applying the first transform will give us 'unnormalized' view # coordinates we also have to get the transform matrix for the # current scene view comb_trans_mat = get_world_to_view_matrix(f.scene) view_coords = \ apply_transform_to_points(hmgns_world_coords, comb_trans_mat) # to get normalized view coordinates, we divide through by the fourth # element norm_view_coords = view_coords / (view_coords[:, 3].reshape(-1, 1)) # the last step is to transform from normalized view coordinates to # display coordinates. view_to_disp_mat = get_view_to_display_matrix(f.scene) disp_coords = apply_transform_to_points(norm_view_coords, view_to_disp_mat) # at this point disp_coords is an Nx4 array of homogenous coordinates # where X and Y are the pixel coordinates of the X and Y 3D world # coordinates, so lets take a screenshot of mlab view and open it # with matplotlib so we can check the accuracy img = mlab.screenshot() pl.imshow(img) for i in range(N): print('Point %d: (x, y) ' % i, disp_coords[:, 0:2][i]) pl.plot([disp_coords[:, 0][i]], [disp_coords[:, 1][i]], 'ro') pl.show() # you should check that the printed coordinates correspond to the # proper points on the screen mlab.show() #EOF mayavi-4.5.0/examples/mayavi/advanced_visualization/numeric_source.py0000644000076500000240000000410512747716313026653 0ustar prabhustaff00000000000000#!/usr/bin/env python """This script demonstrates how to create a numpy array data and visualize it as image data using a few modules. """ # Author: Prabhu Ramachandran # Copyright (c) 2005-2008, Enthought, Inc. # License: BSD Style. # Standard library imports import numpy # Enthought library imports from mayavi.scripts import mayavi2 from mayavi.sources.array_source import ArraySource from mayavi.modules.outline import Outline from mayavi.modules.image_plane_widget import ImagePlaneWidget def make_data(dims=(128, 128, 128)): """Creates some simple array data of the given dimensions to test with.""" np = dims[0]*dims[1]*dims[2] # Create some scalars to render. x, y, z = numpy.ogrid[-5:5:dims[0]*1j,-5:5:dims[1]*1j,-5:5:dims[2]*1j] x = x.astype('f') y = y.astype('f') z = z.astype('f') scalars = (numpy.sin(x*y*z)/(x*y*z)) # The copy makes the data contiguous and the transpose makes it # suitable for display via tvtk. Please note that we assume here # that the ArraySource is configured to not transpose the data. s = numpy.transpose(scalars).copy() # Reshaping the array is needed since the transpose messes up the # dimensions of the data. The scalars themselves are ravel'd and # used internally by VTK so the dimension does not matter for the # scalars. s.shape = s.shape[::-1] return s @mayavi2.standalone def view_numpy(): """Example showing how to view a 3D numpy array in mayavi2. """ # 'mayavi' is always defined on the interpreter. mayavi.new_scene() # Make the data and add it to the pipeline. data = make_data() src = ArraySource(transpose_input_array=False) src.scalar_data = data mayavi.add_source(src) # Visualize the data. o = Outline() mayavi.add_module(o) ipw = ImagePlaneWidget() mayavi.add_module(ipw) ipw.module_manager.scalar_lut_manager.show_scalar_bar = True ipw_y = ImagePlaneWidget() mayavi.add_module(ipw_y) ipw_y.ipw.plane_orientation = 'y_axes' if __name__ == '__main__': view_numpy() mayavi-4.5.0/examples/mayavi/advanced_visualization/offscreen.py0000644000076500000240000000320612747716313025604 0ustar prabhustaff00000000000000#!/usr/bin/env python """A simple example of how you can use Mayavi without using Envisage or the Mayavi Envisage application and do off screen rendering. On Linux/Mac, with VTK < 5.2, you should see a small black window popup and disappear, see the section :ref:`offscreen_rendering` to avoid this. On Win32 you will not see any windows popping up at all. In the end you should have an offscreen.png image in the same directory with the rendered visualization. It can be run as:: $ python offscreen.py """ # Author: Prabhu Ramachandran # Copyright (c) 2007, Enthought, Inc. # License: BSD Style. from os.path import join, abspath, dirname # The offscreen Engine. from mayavi.api import OffScreenEngine # Usual MayaVi imports from mayavi.scripts.util import get_data_dir from mayavi.sources.api import VTKXMLFileReader from mayavi.modules.api import Outline, ScalarCutPlane, Streamline def main(): # Create the MayaVi offscreen engine and start it. e = OffScreenEngine() # Starting the engine registers the engine with the registry and # notifies others that the engine is ready. e.start() # Create a new scene. win = e.new_scene() # Now setup a normal MayaVi pipeline. src = VTKXMLFileReader() src.initialize(join(get_data_dir(dirname(abspath(__file__))), 'fire_ug.vtu')) e.add_source(src) e.add_module(Outline()) e.add_module(ScalarCutPlane()) e.add_module(Streamline()) win.scene.isometric_view() # Change the size argument to anything you want. win.scene.save('offscreen.png', size=(800, 800)) if __name__ == '__main__': main() mayavi-4.5.0/examples/mayavi/advanced_visualization/polydata.py0000644000076500000240000000250212747716313025445 0ustar prabhustaff00000000000000""" An example of how to generate a polydata dataset using numpy arrays. The example is similar to tvtk/examples/tiny_mesh.py. Also shown is a way to visualize this data with mayavi2. The script can be run like so:: $ mayavi2 -x polydata.py It can be alternatively run as:: $ python polydata.py """ # Author: Prabhu Ramachandran # Copyright (c) 2007, Enthought, Inc. # License: BSD style. from numpy import array from tvtk.api import tvtk from mayavi.scripts import mayavi2 # The numpy array data. points = array([[0,0,0], [1,0,0], [0,1,0], [0,0,1]], 'f') triangles = array([[0,1,3], [0,3,2], [1,2,3], [0,2,1]]) temperature = array([10., 20., 30., 40.]) # The TVTK dataset. mesh = tvtk.PolyData(points=points, polys=triangles) mesh.point_data.scalars = temperature mesh.point_data.scalars.name = 'Temperature' # Uncomment the next two lines to save the dataset to a VTK XML file. #w = tvtk.XMLPolyDataWriter(input=mesh, file_name='polydata.vtp') #w.write() # Now view the data. @mayavi2.standalone def view(): from mayavi.sources.vtk_data_source import VTKDataSource from mayavi.modules.surface import Surface mayavi.new_scene() src = VTKDataSource(data = mesh) mayavi.add_source(src) s = Surface() mayavi.add_module(s) if __name__ == '__main__': view() mayavi-4.5.0/examples/mayavi/advanced_visualization/probe_filter.py0000644000076500000240000000662412747716313026315 0ustar prabhustaff00000000000000""" Using the probe filter to visualize a scalar field along an arbitrary surface. This example shows how a data set can be 'projected' (or interpolated) on another given source using the probe filter. It is also an example of a complex VTK pipeline and shows how to inspect it with the PipelineBrowser. In this example, a function is sampled on a regular grid and can be visualized using an ImagePlaneWidget. The function we are interested is independent of the distance to the origin and a function only of the angle. This is why it may be interesting to visualize its value sampled on a sphere center at the origin, but we have the data sampled throughout the volume on a regular grid. We create a sphere with the BuiltinSurface source and use the VTK ProbeFilter to sample the data on this surface. The ProbeFilter takes one input, which is the data structure to project the data on, and a 'source', which is where the data values come from. We need to use the UserDefined filter to insert this VTK filter in the Mayavi pipeline (see :ref:`using_userdefined_filter` as well as :ref:`example_image_cursor_filter` and :ref:`example_tvtk_segmentation`). Specifying its input is done automatical when it is inserted on the pipeline, be its source needs to be specified explicitely. As it is a VTK filter, the source is the VTK dataset output by the Mayavi object: we can find it in `.outputs[0]`. Note that this filter violates slightly the simple pipeline model that Mayavi tries to expose to the users: it has two entries. As a result, the Mayavi pipeline is not longer really a tree. However, if you open up the Mayavi :ref:`pipeline view `, you can see that the ProbeFilter has only one parent in the view. To inspect the actually VTK pipeline underlying this visualization, we use the TVTK PipelineBrowser at the end of the example. You can see that the VTK pipeline is much more complex that the pipeline represented in Mayavi: actors, data mappers, and other elements of the VTK pipeline are collapsed in the Mayavi filters and modules. Note that, as we know the expression of the function, it would be simpler and more efficient to directly sample it on the sphere. """ import numpy as np from mayavi import mlab from tvtk.api import tvtk from tvtk.common import configure_source_data, configure_input # The angular par of the spherical harmonic (3, 2) x, y, z = np.mgrid[-.5:.5:100j, -.5:.5:100j, -.5:.5:100j] Phi = np.angle((x+y*1j)**2*z) field = mlab.pipeline.scalar_field(x, y, z, Phi) ipw = mlab.pipeline.image_plane_widget(field) mlab.outline(field) surface = mlab.pipeline.builtin_surface() surface.source = 'sphere' surface.data_source.radius = .4 surface.data_source.phi_resolution = 200 surface.data_source.theta_resolution = 200 probe_filter = tvtk.ProbeFilter() configure_input(probe_filter, surface.data_source) configure_source_data(probe_filter, field.outputs[0]) probe = mlab.pipeline.user_defined(surface, filter=probe_filter) surf = mlab.pipeline.surface(probe) fig = mlab.gcf() ################################################################################ # Finally, to inspect the VTK Pipeline (and not the Mayavi one, we # use the TVTK pipeline browser) # Note that for Mayavi version < 3.4.1, there is a bug in the # PipelineBrowser preventing a good display of this pipeline. from tvtk.pipeline.browser import PipelineBrowser browser = PipelineBrowser(fig.scene) browser.show() mlab.show() mayavi-4.5.0/examples/mayavi/advanced_visualization/scatter_plot.py0000644000076500000240000000346112747716313026340 0ustar prabhustaff00000000000000""" An example of plotting scatter points with Mayavi's core API. This script creates a bunch of random points with random scalar data and then shows these as a "scatter" plot of points. The script illustrates how to 1. create a dataset easily using tvtk and numpy, 2. use a created dataset in Mayavi and visualize it. This example achieve the same functionnality as mlab's points3d function ( :func:`mayavi.mlab.points3d`), but explicitely creating the objects and adding them to the pipeline engine via the Mayavi core API. Compared to using mlab, this method has the advantage of giving more control on which objects are created, and there life cycle. Run this script like so:: $ mayavi2 -x scatter_plot.py Alternatively it can be run as:: $ python scatter_plot.py """ # Author: Prabhu Ramachandran # Copyright (c) 2007 Prabhu Ramachandran. # License: BSD Style. import numpy as np from tvtk.api import tvtk from mayavi.scripts import mayavi2 @mayavi2.standalone def main(): # Create some random points to view. pd = tvtk.PolyData() pd.points = np.random.random((1000, 3)) verts = np.arange(0, 1000, 1) verts.shape = (1000, 1) pd.verts = verts pd.point_data.scalars = np.random.random(1000) pd.point_data.scalars.name = 'scalars' # Now visualize it using mayavi2. from mayavi.sources.vtk_data_source import VTKDataSource from mayavi.modules.outline import Outline from mayavi.modules.surface import Surface mayavi.new_scene() d = VTKDataSource() d.data = pd mayavi.add_source(d) mayavi.add_module(Outline()) s = Surface() mayavi.add_module(s) s.actor.property.set(representation='p', point_size=2) # You could also use glyphs to render the points via the Glyph module. if __name__ == '__main__': main() mayavi-4.5.0/examples/mayavi/advanced_visualization/streamline.py0000644000076500000240000000360612747716313026001 0ustar prabhustaff00000000000000#!/usr/bin/env mayavi2 """This script demonstrates how one can script Mayavi's core API to display streamlines and an iso surface. """ # Author: Prabhu Ramachandran # Copyright (c) 2005-2007, Enthought, Inc. # License: BSD Style. # Standard library imports from os.path import join, abspath, dirname # Enthought library imports from mayavi.scripts import mayavi2 from mayavi.sources.vtk_xml_file_reader import VTKXMLFileReader from mayavi.sources.vrml_importer import VRMLImporter from mayavi.modules.outline import Outline from mayavi.modules.streamline import Streamline from mayavi.modules.iso_surface import IsoSurface def setup_data(fname): """Given a VTK XML file name `fname`, this creates a mayavi2 reader for it and adds it to the pipeline. It returns the reader created. """ r = VTKXMLFileReader() r.initialize(fname) mayavi.add_source(r) return r def show_vrml(fname): """Given a VRML file name it imports it into the scene. """ r = VRMLImporter() r.initialize(fname) mayavi.add_source(r) return r def streamline(): """Sets up the mayavi pipeline for the visualization. """ # Create an outline for the data. o = Outline() mayavi.add_module(o) s = Streamline(streamline_type='tube') mayavi.add_module(s) s.stream_tracer.integration_direction = 'both' s.seed.widget.center = 3.5, 0.625, 1.25 s.module_manager.scalar_lut_manager.show_scalar_bar = True i = IsoSurface() mayavi.add_module(i) i.contour.contours[0] = 550 i.actor.property.opacity = 0.5 @mayavi2.standalone def main(): mayavi.new_scene() data_dir = mayavi2.get_data_dir(dirname(abspath(__file__))) vrml_fname = join(data_dir, 'room_vis.wrl') r = show_vrml(vrml_fname) fname = join(data_dir, 'fire_ug.vtu') r = setup_data(fname) streamline() if __name__ == '__main__': main() mayavi-4.5.0/examples/mayavi/advanced_visualization/structured_grid.py0000644000076500000240000000767312747716313027057 0ustar prabhustaff00000000000000"""An example of how to generate a structured grid dataset using numpy arrays. Also shown is a way to visualize this data with the mayavi2 application. The script can be run like so:: $ mayavi2 -x structured_grid.py Alternatively, it can be run as:: $ python structured_grid.py """ # Authors: Eric Jones # Prabhu Ramachandran # Copyright (c) 2007, Enthought, Inc. # License: BSD style. import numpy as np from numpy import cos, sin, pi from tvtk.api import tvtk from mayavi.scripts import mayavi2 def generate_annulus(r=None, theta=None, z=None): """ Generate points for structured grid for a cylindrical annular volume. This method is useful for generating a structured cylindrical mesh for VTK (and perhaps other tools). Parameters ---------- r : array : The radial values of the grid points. It defaults to linspace(1.0, 2.0, 11). theta : array : The angular values of the x axis for the grid points. It defaults to linspace(0,2*pi,11). z: array : The values along the z axis of the grid points. It defaults to linspace(0,0,1.0, 11). Return ------ points : array Nx3 array of points that make up the volume of the annulus. They are organized in planes starting with the first value of z and with the inside "ring" of the plane as the first set of points. The default point array will be 1331x3. """ # Default values for the annular grid. if r is None: r = np.linspace(1.0, 2.0, 11) if theta is None: theta = np.linspace(0, 2*pi, 11) if z is None: z = np.linspace(0.0, 1.0, 11) # Find the x values and y values for each plane. x_plane = (cos(theta)*r[:,None]).ravel() y_plane = (sin(theta)*r[:,None]).ravel() # Allocate an array for all the points. We'll have len(x_plane) # points on each plane, and we have a plane for each z value, so # we need len(x_plane)*len(z) points. points = np.empty([len(x_plane)*len(z),3]) # Loop through the points for each plane and fill them with the # correct x,y,z values. start = 0 for z_plane in z: end = start + len(x_plane) # slice out a plane of the output points and fill it # with the x,y, and z values for this plane. The x,y # values are the same for every plane. The z value # is set to the current z plane_points = points[start:end] plane_points[:,0] = x_plane plane_points[:,1] = y_plane plane_points[:,2] = z_plane start = end return points # Make the data. dims = (51, 25, 25) # Note here that the 'x' axis corresponds to 'theta' theta = np.linspace(0, 2*np.pi, dims[0]) # 'y' corresponds to varying 'r' r = np.linspace(1, 10, dims[1]) z = np.linspace(0, 5, dims[2]) pts = generate_annulus(r, theta, z) # Uncomment the following if you want to add some noise to the data. #pts += np.random.randn(dims[0]*dims[1]*dims[2], 3)*0.04 sgrid = tvtk.StructuredGrid(dimensions=dims) sgrid.points = pts s = np.sqrt(pts[:,0]**2 + pts[:,1]**2 + pts[:,2]**2) sgrid.point_data.scalars = np.ravel(s.copy()) sgrid.point_data.scalars.name = 'scalars' # Uncomment the next two lines to save the dataset to a VTK XML file. #w = tvtk.XMLStructuredGridWriter(input=sgrid, file_name='sgrid.vts') #w.write() # View the data. @mayavi2.standalone def view(): from mayavi.sources.vtk_data_source import VTKDataSource from mayavi.modules.api import Outline, GridPlane mayavi.new_scene() src = VTKDataSource(data=sgrid) mayavi.add_source(src) mayavi.add_module(Outline()) g = GridPlane() g.grid_plane.axis = 'x' mayavi.add_module(g) g = GridPlane() g.grid_plane.axis = 'y' mayavi.add_module(g) g = GridPlane() g.grid_plane.axis = 'z' mayavi.add_module(g) if __name__ == '__main__': view() mayavi-4.5.0/examples/mayavi/advanced_visualization/structured_points2d.py0000644000076500000240000000355612747716313027670 0ustar prabhustaff00000000000000"""An example of how to generate a 2D structured points dataset using numpy arrays. Also shown is a way to visualize this data with the mayavi2 application. The script can be run like so:: $ mayavi2 -x structured_points2d.py Alternatively, it can be run as:: $ python structured_points2d.py """ # Author: Prabhu Ramachandran # Copyright (c) 2007, Enthought, Inc. # License: BSD style. from numpy import arange, sqrt, sin from tvtk.api import tvtk from mayavi.scripts import mayavi2 # Generate the scalar values. x = (arange(0.1, 50.0)-25)/2.0 y = (arange(0.1, 50.0)-25)/2.0 r = sqrt(x[:,None]**2+y**2) z = 5.0*sin(r)/r # # Make the tvtk dataset. # tvtk.ImageData is identical and could also be used here. spoints = tvtk.StructuredPoints(origin=(-12.5,-12.5,0), spacing=(0.5,0.5,1), dimensions=(50,50,1)) # Transpose the array data due to VTK's implicit ordering. VTK assumes # an implicit ordering of the points: X co-ordinate increases first, Y # next and Z last. We flatten it so the number of components is 1. spoints.point_data.scalars = z.T.flatten() spoints.point_data.scalars.name = 'scalar' # Uncomment the next two lines to save the dataset to a VTK XML file. #w = tvtk.XMLImageDataWriter(input=spoints, file_name='spoints2d.vti') #w.write() # Now view the data. @mayavi2.standalone def view(): from mayavi.sources.vtk_data_source import VTKDataSource from mayavi.filters.warp_scalar import WarpScalar from mayavi.filters.poly_data_normals import PolyDataNormals from mayavi.modules.surface import Surface mayavi.new_scene() src = VTKDataSource(data = spoints) mayavi.add_source(src) mayavi.add_filter(WarpScalar()) mayavi.add_filter(PolyDataNormals()) s = Surface() mayavi.add_module(s) if __name__ == '__main__': view() mayavi-4.5.0/examples/mayavi/advanced_visualization/structured_points3d.py0000644000076500000240000000434412747716313027665 0ustar prabhustaff00000000000000"""An example of how to generate a 3D structured points dataset using numpy arrays. Also shown is a way to visualize this data with the mayavi2 application. The script can be run like so:: $ mayavi2 -x structured_points3d.py Alternatively, it can be run as:: $ python structured_points3d.py """ # Author: Prabhu Ramachandran # Copyright (c) 2007, Enthought, Inc. # License: BSD style. from tvtk.api import tvtk from tvtk.array_handler import get_vtk_array_type from tvtk.common import is_old_pipeline from numpy import array, ogrid, sin, ravel from mayavi.scripts import mayavi2 # Make the data. dims = array((128, 128, 128)) vol = array((-5., 5, -5, 5, -5, 5)) origin = vol[::2] spacing = (vol[1::2] - origin)/(dims -1) xmin, xmax, ymin, ymax, zmin, zmax = vol x, y, z = ogrid[xmin:xmax:dims[0]*1j, ymin:ymax:dims[1]*1j, zmin:zmax:dims[2]*1j] x, y, z = [t.astype('f') for t in (x, y, z)] scalars = sin(x*y*z)/(x*y*z) # Make the tvtk dataset. spoints = tvtk.StructuredPoints(origin=origin, spacing=spacing, dimensions=dims) # The copy makes the data contiguous and the transpose makes it # suitable for display via tvtk. Note that it is not necessary to # make the data contiguous since in that case the array is copied # internally. s = scalars.transpose().copy() spoints.point_data.scalars = ravel(s) spoints.point_data.scalars.name = 'scalars' # This is needed in slightly older versions of VTK (like the 5.0.2 # release) to prevent a segfault. VTK does not detect the correct # data type. if is_old_pipeline(): spoints.scalar_type = get_vtk_array_type(s.dtype) # Uncomment the next two lines to save the dataset to a VTK XML file. #w = tvtk.XMLImageDataWriter(input=spoints, file_name='spoints3d.vti') #w.write() # Now view the data. @mayavi2.standalone def view(): from mayavi.sources.vtk_data_source import VTKDataSource from mayavi.modules.outline import Outline from mayavi.modules.image_plane_widget import ImagePlaneWidget mayavi.new_scene() src = VTKDataSource(data = spoints) mayavi.add_source(src) mayavi.add_module(Outline()) mayavi.add_module(ImagePlaneWidget()) if __name__ == '__main__': view() mayavi-4.5.0/examples/mayavi/advanced_visualization/surf_regular_mlab.py0000644000076500000240000000252612747716313027331 0ustar prabhustaff00000000000000#!/usr/bin/env python """Shows how to view data created by `tvtk.tools.mlab` with mayavi2. """ # Author: Prabhu Ramachandran # Copyright (c) 2006-2007, Enthought Inc. # License: BSD Style. import numpy from mayavi.scripts import mayavi2 from tvtk.tools import mlab from mayavi.sources.vtk_data_source import VTKDataSource from mayavi.filters.warp_scalar import WarpScalar from mayavi.modules.outline import Outline from mayavi.modules.surface import Surface def make_data(): """Make some test numpy data and create a TVTK data object from it that we will visualize. """ def f(x, y): """Some test function. """ return numpy.sin(x*y)/(x*y) x = numpy.arange(-7., 7.05, 0.1) y = numpy.arange(-5., 5.05, 0.05) s = mlab.SurfRegular(x, y, f) return s.data def add_data(tvtk_data): """Add a TVTK data object `tvtk_data` to the mayavi pipleine. """ d = VTKDataSource() d.data = tvtk_data mayavi.add_source(d) def surf_regular(): """Now visualize the data as done in mlab. """ w = WarpScalar() mayavi.add_filter(w) o = Outline() s = Surface() mayavi.add_module(o) mayavi.add_module(s) @mayavi2.standalone def main(): mayavi.new_scene() d = make_data() add_data(d) surf_regular() if __name__ == '__main__': main() mayavi-4.5.0/examples/mayavi/advanced_visualization/tvtk_segmentation.py0000644000076500000240000001176612747716313027411 0ustar prabhustaff00000000000000""" Using VTK to assemble a pipeline for segmenting MRI images. This example shows how to insert well-controled custom VTK filters in Mayavi. This example downloads an MRI scan, turns it into a 3D numpy array, applies a segmentation procedure made of VTK filters to extract the gray-matter/white-matter boundary. The segmentation algorithm used here is very naive and should, of course, not be used as an example of segmentation. """ ### Download the data, if not already on disk ################################## import os if not os.path.exists('MRbrain.tar.gz'): # Download the data try: from urllib import urlopen except ImportError: from urllib.request import urlopen print("Downloading data, Please Wait (7.8MB)") opener = urlopen( 'http://graphics.stanford.edu/data/voldata/MRbrain.tar.gz') open('MRbrain.tar.gz', 'wb').write(opener.read()) # Extract the data import tarfile tar_file = tarfile.open('MRbrain.tar.gz') try: os.mkdir('mri_data') except: pass tar_file.extractall('mri_data') tar_file.close() ### Read the data in a numpy 3D array ########################################## import numpy as np data = np.array([np.fromfile(os.path.join('mri_data', 'MRbrain.%i' % i), dtype='>u2') for i in range(1, 110)]) data.shape = (109, 256, 256) data = data.T ################################################################################ # Heuristic for finding the threshold for the brain # Exctract the percentile 20 and 80 (without using # scipy.stats.scoreatpercentile) sorted_data = np.sort(data.ravel()) l = len(sorted_data) lower_thr = sorted_data[0.2*l] upper_thr = sorted_data[0.8*l] # The white matter boundary: find the densest part of the upper half # of histogram, and take a value 10% higher, to cut _in_ the white matter hist, bins = np.histogram(data[data > np.mean(data)], bins=50) brain_thr_idx = np.argmax(hist) brain_thr = bins[brain_thr_idx + 4] del hist, bins, brain_thr_idx # Display the data ############################################################# from mayavi import mlab from tvtk.api import tvtk fig = mlab.figure(bgcolor=(0, 0, 0), size=(400, 500)) # to speed things up fig.scene.disable_render = True src = mlab.pipeline.scalar_field(data) # Our data is not equally spaced in all directions: src.spacing = [1, 1, 1.5] src.update_image_data = True #---------------------------------------------------------------------- # Brain extraction pipeline # In the following, we create a Mayavi pipeline that strongly # relies on VTK filters. For this, we make heavy use of the # mlab.pipeline.user_defined function, to include VTK filters in # the Mayavi pipeline. # Apply image-based filters to clean up noise thresh_filter = tvtk.ImageThreshold() thresh_filter.threshold_between(lower_thr, upper_thr) thresh = mlab.pipeline.user_defined(src, filter=thresh_filter) median_filter = tvtk.ImageMedian3D() median_filter.set_kernel_size(3, 3, 3) median = mlab.pipeline.user_defined(thresh, filter=median_filter) diffuse_filter = tvtk.ImageAnisotropicDiffusion3D( diffusion_factor=1.0, diffusion_threshold=100.0, number_of_iterations=5, ) diffuse = mlab.pipeline.user_defined(median, filter=diffuse_filter) # Extract brain surface contour = mlab.pipeline.contour(diffuse, ) contour.filter.contours = [brain_thr, ] # Apply mesh filter to clean up the mesh (decimation and smoothing) dec = mlab.pipeline.decimate_pro(contour) dec.filter.feature_angle = 60. dec.filter.target_reduction = 0.7 smooth_ = tvtk.SmoothPolyDataFilter( number_of_iterations=10, relaxation_factor=0.1, feature_angle=60, feature_edge_smoothing=False, boundary_smoothing=False, convergence=0., ) smooth = mlab.pipeline.user_defined(dec, filter=smooth_) # Get the largest connected region connect_ = tvtk.PolyDataConnectivityFilter(extraction_mode=4) connect = mlab.pipeline.user_defined(smooth, filter=connect_) # Compute normals for shading the surface compute_normals = mlab.pipeline.poly_data_normals(connect) compute_normals.filter.feature_angle = 80 surf = mlab.pipeline.surface(compute_normals, color=(0.9, 0.72, 0.62)) #---------------------------------------------------------------------- # Display a cut plane of the raw data ipw = mlab.pipeline.image_plane_widget(src, colormap='bone', plane_orientation='z_axes', slice_index=55) mlab.view(-165, 32, 350, [143, 133, 73]) mlab.roll(180) fig.scene.disable_render = False #---------------------------------------------------------------------- # To make the link between the Mayavi pipeline and the much more # complex VTK pipeline, we display both: mlab.show_pipeline(rich_view=False) from tvtk.pipeline.browser import PipelineBrowser browser = PipelineBrowser(fig.scene) browser.show() mlab.show() mayavi-4.5.0/examples/mayavi/advanced_visualization/unstructured_grid.py0000644000076500000240000000712612747716313027413 0ustar prabhustaff00000000000000"""A MayaVi example of how to generate an unstructured grid dataset using numpy arrays. Also shown is a way to visualize this data with mayavi2. The script can be run like so: $ mayavi2 -x unstructured_grid.py Alternatively, it can be run as: $ python unstructured_grid.py Author: Prabhu Ramachandran Copyright (c) 2007, Enthought, Inc. License: BSD style. """ from numpy import array, arange, random from tvtk.api import tvtk from mayavi.scripts import mayavi2 def single_type_ug(): """Simple example showing how to create an unstructured grid consisting of cells of a single type. """ points = array([[0,0,0], [1,0,0], [0,1,0], [0,0,1], # tets [1,0,0], [2,0,0], [1,1,0], [1,0,1], [2,0,0], [3,0,0], [2,1,0], [2,0,1], ], 'f') tets = array([[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]]) tet_type = tvtk.Tetra().cell_type ug = tvtk.UnstructuredGrid(points=points) ug.set_cells(tet_type, tets) return ug def mixed_type_ug(): """A slightly more complex example of how to generate an unstructured grid with different cell types. Returns a created unstructured grid. """ points = array([[0,0,0], [1,0,0], [0,1,0], [0,0,1], # tetra [2,0,0], [3,0,0], [3,1,0], [2,1,0], [2,0,1], [3,0,1], [3,1,1], [2,1,1], # Hex ], 'f') # shift the points so we can show both. points[:,1] += 2.0 # The cells cells = array([4, 0, 1, 2, 3, # tetra 8, 4, 5, 6, 7, 8, 9, 10, 11 # hex ]) # The offsets for the cells, i.e. the indices where the cells # start. offset = array([0, 5]) tetra_type = tvtk.Tetra().cell_type # VTK_TETRA == 10 hex_type = tvtk.Hexahedron().cell_type # VTK_HEXAHEDRON == 12 cell_types = array([tetra_type, hex_type]) # Create the array of cells unambiguously. cell_array = tvtk.CellArray() cell_array.set_cells(2, cells) # Now create the UG. ug = tvtk.UnstructuredGrid(points=points) # Now just set the cell types and reuse the ug locations and cells. ug.set_cells(cell_types, offset, cell_array) return ug def save_xml(ug, file_name): """Shows how you can save the unstructured grid dataset to a VTK XML file.""" w = tvtk.XMLUnstructuredGridWriter(input=ug, file_name=file_name) w.write() # ---------------------------------------------------------------------- # Create the unstructured grids and assign scalars and vectors. ug1 = single_type_ug() ug2 = mixed_type_ug() temperature = arange(0, 120, 10, 'd') velocity = random.randn(12, 3) for ug in ug1, ug2: ug.point_data.scalars = temperature ug.point_data.scalars.name = 'temperature' # Some vectors. ug.point_data.vectors = velocity ug.point_data.vectors.name = 'velocity' # Uncomment this to save the file to a VTK XML file. #save_xml(ug2, 'file.vtu') # Now view the data. @mayavi2.standalone def view(): from mayavi.sources.vtk_data_source import VTKDataSource from mayavi.modules.outline import Outline from mayavi.modules.surface import Surface from mayavi.modules.vectors import Vectors mayavi.new_scene() # The single type one src = VTKDataSource(data = ug1) mayavi.add_source(src) mayavi.add_module(Outline()) mayavi.add_module(Surface()) mayavi.add_module(Vectors()) # Mixed types. src = VTKDataSource(data = ug2) mayavi.add_source(src) mayavi.add_module(Outline()) mayavi.add_module(Surface()) mayavi.add_module(Vectors()) if __name__ == '__main__': view() mayavi-4.5.0/examples/mayavi/data/0000755000076500000240000000000012747722127017442 5ustar prabhustaff00000000000000mayavi-4.5.0/examples/mayavi/data/fire_ug.vtu0000644000076500000240000232174512747716313021640 0ustar prabhustaff00000000000000 _AgAAAACAAACMQAAAPUwAAL8mAAA=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AgAAAACAAACMQAAAMmQAAOMxAAA=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3C68LeXAuAX2TsrhZiF3Ce9ov29P3QDjztd7zJ5i3CW8M+XAuPP1fsqBcZfwrpQD487XBykHxl3Cu1MOjDtfH6YcGHcJ70k5MO58fZRyYNwlvDflwLjz9XHKgXGX8L6UA+PO1ycpB8ZdwvtTDow7X5+mHBh3CR9IOTDufH2WcmDcJXww5cC48/V5yoFxl/ChlAPjztcXKQfGXcKHUw6MO19fphwYdwkfSTkw7nx9lXJg3CV8NOXAuPP1dcqBcZfwsZQD487XNykHxl3Cx1MOjDtf36YcGHcJn0g5MO58fZdyYNwufDLlwLgF9n3K8V5xA4w7Xz8ye/b3Csadr59SjvcKxp2vn1OO9wrGna9fUo73Csadr19TjvcKxp2v31KO9wrGna/BKcd7BePO1+8px3sF487XHynHewXjztefKcd7BePO118px3sF487X3ynHewXjztc/Kcd7BePO178px3sF487XfynHewXjzheHa3G8VzDufA1V5XivYNz56lU53isYd75KleO9gnELLKoc7xU3wLjzVRvL2t8rGHe+uirHewXjztfQVY73Csadr2GqHO8VjDtfw1Y53isYd76Gq3K8VzDufA1f5XivYNz5GqHK8V7BuPM1YpXjvYJx52ukKsd7BePO18hVjvcKxp2vUaoc7xWMO1+jVjneKxh3vkarcrxXMO58jV7leK9g3Pkao8rxXsG48zVmleO9gnELbKwqx3vFDTDufI3D7LW/VzDufI1b5XivYNz5Gq/K8V7BuPM1fpXjvYJx52uCKsd7BePO14RVjvcKxp2viaoc7xWMO18TVzneKxh3viapcrxXMO58TVrleK9g3PmarMrxXsG48zV5leO9gnHna4oqx3sF487XlFWO9wrGna+pqhzvFYw7X1NXOd4rGHe+pqlyvFcw7nxNW+V4r2Dc+ZquyvFewbgFNn2V473iBhh3vmZk9trfKxh3vmaqcrxXMO58zVzleK9g3PmapcrxXsG48zVrleO9gnHna7Yqx3sF487X7FWO9wrGna85qhzvFYw7X3NWOd4rGHe+5qpyvFcw7nzNXeV4r2Dc+ZqnyvFewbjzNW+V472CcedrvirHewXjztf8VY73CsadrwWqHO8VjDtfC1Y53isYt8AWqnK8V9wA487XIsxe+3sF487XolWO9wrGna/FqhzvFYw7X4tXOd4rGHe+lqhyvFcw7nwtWeV4r2Dc+VqqyvFewbjztXSV472CcedrmSrHewXjzteyVY73Csadr+WqHO8VjDtfy1c53isYd75WqHK8VzDufK1Y5XivYNz5WqnK8V7BuPO1cpXjvYJx52uVKsd7BePO16pVjvcKxp2v1aoc7xWMW2CrVzneK26AcedrTWav/b2CcedrrSrHewXjztfaVY73Csadr3WqHO8VjDtf61Y53isYd77Wq3K8VzDufK1f5XivYNz52qDK8V7BuPO1YZXjvYJx52ujKsd7BePO18ZVjvcKxp2vTaoc7xWMO1+bVjneKxh3vjarcrxXMO58bV7leK9g3PnaosrxXsG487VlleO9gnELbKsqx3vFDTDufG3D7LW/VzDufG1b5XivYNz52q7K8V7BuPO1fZXjvYJx52uHKsd7BePO145VjvcKxp2vnaoc7xWMO187VzneKxh3vnapcrxXMO587VrleK9g3PnarcrxXsG487V7leO9gnHna48qx3sF487XnlWO9wrGna+9qhzvFYw7X3tXOd4rGHe+9qlyvFcw7nztW+V4r2Dc+dqvyvFewbgFtn+V473iBhh3vv7H7LW/VzDufB1Y5XivYNz5OqjK8V7BuPN1cJXjvYJx5+uQKsd7BePO16FVjvcKxp2vw6oc7xWMO1+HVzneKxh3vo6ocrxXMO58HVnleK9g3Pk6qsrxXsG483V0leO9gnHn65gqx3sF487XsVWO9wrGna/jqhzvFYw7X8dXOd4rGHe+TqhyvFcwboGdWOV4r7gBxp2vk5m99vcKxp2vU6oc7xWMO1+nVjneKxh3vk6rcrxXMO58nV7leK9g3Pk6o8rxXsG483VmleO9gnHn66wqx3sF487X2VWO9wrGna9zqhzvFYw7X+dWOd4rGHe+zqtyvFcw7nydX+V4r2Dc+bqgyvFewbjzdWGV472CcefroirHewXjztfFVY73Csadr0uqHO8VjDtfl1Y53isYt8Auq3K8V9wA487XFcxe+3sF487XlVWO9wrGna+rqhzvFYw7X1dXOd4rGHe+rqlyvFcw7nxdW+V4r2Dc+bquyvFewbjzdX2V472CcefrhirHewXjzteNVY73Csadr5uqHO8VjDtfN1c53isYd75uqXK8VzDufN1a5XivYNz5uq3K8V7BuPN1e5XjvYJx5+uOKsd7BeMW2J1V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9wrGna8pUo73CsadrylTjvcKxp2vqVKO9wrGLbCpU473ihtg3PmaltlzsFcw7nxNl3K8VzDufE2fcrxXMO58zZByvFcw7nzNmHK8VzDufM2UcrxXMO58zZxyvFcw7nzNknK8VzDufM2acrxXMO58zZZyvFcw7nzNnnK8VzDufM2RcrxXMO58zZlyvFcw7nzNlXK8VzDufM2dcrxXMO58zZNyvFcw7nzNm3K8VzDufM2XcrxXMO58zZ9yvFcwboEtkHK8V9wA487XQsyeg72CcefrbynHewXjztfCKcd7BePO1yIpx3sF487XoinHewXjztdiKcd7BePO1+Ipx3sF487XEinHewXjzteSKcd7BePO11Ipx3sF487X0inHewXjztcyKcd7BePO199TjvcKxp2vf6Qc7xWMO1/LphzvFYw7X8ulHO8VjDtfy6cc7xWMW2D/TDneK26AcedrBWbPwV7BuPO1YsrxXsG487VSyvFewbjztXLK8V7BuPO1SsrxXsG487VqyvFewbjztVrK8V7BuPO1esrxXsG487VGyvFewbjztWbK8V7BuPO1VsrxXsG48/XvlOO9gnHn6z8px3sF487X2inHewXjztc6Kcd7BePO17opx3sF487XeinHewXjztf6Kcd7BePO1wYpx3sF4xbYhinHe8UNMO58bczsOdgrGHe+Nkk53isYd742TTneKxh3vjZLOd4rGHe+Nk853isYd762SDneKxh3vrZMOd4rGHe+tko53isYd762TjneKxh3vrZJOd4rGHe+tk053isYd762SzneKxh3vrZPOd4rGHe+dkg53isYd752TDneKxh3vnZKOd4rGHe+dk453isYt8B2STneK26AcedrN2bPwV7BuPP135TjvYJx5+t/Kcd7BePO1+4px3sF487XHinHewXjzteeKcd7BePO114px3sF487X3inHewXjztc+Kcd7BePO174px3sF487XfinHewXjztf+Kcd7BePO1wEpx3sF487XgSnHewXjztdBKcd7BePO18Epx3sF487XISnHewXjztehKcd7BePO12Epx3sF4xbY4SnHe8UNMO58HcnsOdgrGHe+jko53isYd76OTjneKxh3vo5JOd4rGHe+jk053isYd76OSzneKxh3vo5POd4rGHe+Tkg53isYd75OTDneKxh3vk5KOd4rGHe+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2exk72DcuXuq2cnewbhz93Szk72DcefumWYnewfjzt2zzU72Dsadu/81O9k7GHfunmt2sncw7tw93+xk72DcuXuh2cnewbiF92Kzk73jBh537l7W+6U2sncw7ty90uxk72DcuXu12cnewbhz91qzk72Dcefu9WYnewfjzt0bzU72DsaduzebnewdjDt3bzU72TsYd+7ebnaydzDu3L3T7GTvYNy5e7fZyd7BuHP3XrOTvYNx5+79Zid7B+PO3QfNTvYOxp27D5ud7B2MO3cfNTvZOxh37j5udrJ3MO7cfdLsZO9g3Ln7tNnJ3sG4c/dZs5O9g3Hn7vNmJ3sH487dF81O9g7Gnbsvm53sHYw7d181O9k7GHfuvm52sncw7tx90+xk72Dcufu22cnewbhz912zk72DceduVLeTvYNx5+573U72Dsadu+93O9k7GHfuftDtZO9g3Ln7YbeTvYNx5+5H3U72Dsadux93O9k7GHfuftLtZO9g3Ln7abeTvYNx5+5n3U72Dsadu593O9k7GLfwftHtZO+4gcedu1+J/bKP7B2MO3e/7naydzDu3I3R7WTvYNy5G7Pbyd7BuHM3VreTvYNx527sbid7B+PO3W+6newdjDt3Q7eTvYNx5650O9k7GHfuareTvYNx5651O9k7GHfuereTvYNx5250t5O9g3Hn7rfdTvYOxp2733U72TsYd+5+3+1k72DcuftDt5O9g3Hn7v+6newdjDt3f+x2sncw7tz9qdvJ3sG4c/fnbid7B+PO3V+6newdjDt3f+12sncw7tz9rdvJ3sG4c/f3bid7B+PO3T+6newdjDt3/+x2sncw7tyN0+1k72DcuRu328newbhzN163k72Dcedu/G4newfjzt0E3U72Dsaduwm7newdjDt3E3U72TsYd+4m7naydzDu3E3S7WTvYNy5m7Tbyd7BuHM3WbeTvYNx527ybid7B+MW3hTdTvaOG3jcuZtK7yn7yN7BuHM3dbeTvYNx526abid7B+PO3bTdTvYOxp276bqd7B2MO3fTdzvZOxh37mbodrJ3MO7czdjtZO9g3LmbqdvJ3sG4czdzt5O9g3HnbpZuJ3sH487drN1O9g7GnbvZup3sHYw7d7N3O9k7GHfu5uh2sncw7tzN2e1k72DcuZur28newbhzN3e3k72Dcedunm4newfjzt283U72Dsadu/m6newdjDt383c72TsYd+4W6HaydzDu3C3Y7WTvYNy5W6jbyd7BuHO3cLeTvYNx526Rbid7B+PO3aLdTvYOxp27xbqd7B2MO3eLdzvZOxh37pbodrJ3MO7cLdntZO9g3LlbqtvJ3sG4c7d0t5O9g3HnbpluJ3sH487dst1O9g7Gnbvlup3sHYw7d8t3O9k7GHfuVuh2sncwbuGt2O1k77iBx527lfVeqY/sHYw7d6t0O9k7GHfuVu12sncw7tyt1u1k72DcuVu928newbhzt0a3k72DceduzW4newfjzt1a3U72Dsadu7W7newdjDt363Q72TsYd+7W7XaydzDu3K3X7WTvYNy5W7/byd7BuHO3QbeTvYNx527Dbid7B+PO3UbdTvYOxp27jbud7B2MO3ebdDvZOxh37jbtdrJ3MO7cbdbtZO9g3LnbvNvJ3sG4c7dFt5O9g3HnbstuJ3sH487dVt1O9g7Gnbutu53sHYw7d9t0O9k7GHfutu12sncw7txt1+1k72Dcudu+28newbhzt0O3k72Dcedux24newfjzt1O3U72Dsadu527newdjDt3u3Q72TsYd+527XaydzDu3O3W7WTvYNy5273byd7BuHO3R7eTvYNx527Pbid7B+MW3l7dTvaOG3jcudtH7737yN7BuHO3b7eTvYNx526/bid7B+PO3f7dTvYOxp27A7qd7B2MO3cHdjvZOxh37g7qdrJ3MO7cHdztZO9g3Lk7pNvJ3sG4c3dot5O9g3Hn7rBuJ3sH487d4d1O9g7Gnbsjup3sHYw7d0d2O9k7GHfujup2sncw7twd3e1k72DcuTum28newbhzd2y3k72DcefuuG4newfjzt3x3U72DsaduxO6newdjDt3J3Y72TsYd+5O6naydzDu3J3c7WTvYNy5O6Xbyd7BuHN3areTvYNx5+60bid7B+PO3b+6newdjDt3p3c72TsYd+7O6HaydzDu3J3Z7WTvYNy5+3e3k72DcefurG4newfjzt3Z3U72Dsadu3O6newdjDt353Y72TsYd+7O63aydzDu3J3f7WTvYNy5u6Dbyd7BuIV3YbeTveMGHnfuLtb7oj6ydzDu3F3S7WTvYNy5u7Tbyd7BuHN3WbeTvYNx5+7ybid7B+PO3RXdTvYOxp27K7ud7B2MO3dXdTvZOxh37q7udrJ3MO7c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NKLayd7BpqIR1U72DjY1jah2snewaWhEtZO9g01LI6qd7B1sOhpR7WTvYNPTiGonewebgUZUO9k72Iw0otrJ3sFmohHVTvYONrM2brWTvYPNQkOqnewdbFYaUu1k72Cz0ZBqJ3sHm52GVDvZO9gcNKTayd7B5qQh1U72bi6956YRYkMd3TvYPDSi2snewealEdVO9g42H42odrJ3sPlpRLWTvYMtQCOqnewdbEEaUe1k72AL0YhqJ3sHW5hGVDvZO9gi2kTVTvYOtqg2cbWTvYMtpk1S7WTvYItrk1Y72TvYEtpk1U72DrakNnm1k72DLaVNUe1k72BLa1NWO9k72DLaVNVO9g62rDZ1tZO9gy2nTVPtZO9gy2vTVjvZO9gK2nTVTvYOtqI2fbWTvYOtpM1Q7WTvYCtrM1Y72TvYKtpM1U72DraqNnO1k72DrabNUu1k72Cra7NWO9k72BrabNVO9g62pjZ7tZO9g62lzVHtZO9ga2tzVjvZO9g62lzVTvYOtq42d7WTvYOtp81T7WTvYOtr81Y72TvYBtp81U72DrahNn+1k72DbaQtUO1k7zbWexNtIb0XrKN7B9tUW7jayd7BNtMWqXayd7DNtUWrnewdbAttsWonewfbUlu82snewbbSlqh2snewrbUlq53sHWwbbalqJ3sH21ZbutrJ3sG205apdrJ3sO21Zaud7B1sB225aid7B9tRW77ayd7BdtJWqHayd7CdtRWrnewdbBdtpWonewfbVVu52snewXbTVql2snew3bVVq53sHWwPbbVqJ3sH21NbvdrJ3sH20taodrJ3sL21Naud7B1sH22taid7B9tXW7vayd7B9tPWqXayd7D9tXWrnewd7ABtvWonewc7UFu/2snewf6gbVDtZO9gB2kbVjvZO9jB2kbVTvYOdoi2cbWTvYMdqm1S7WTvYIdpm1Y72TvY4dpm1U72DnaEtnm1k72DHaltUe1k72BHaVtWO9m7o/U+Rtta763q6N7BjtW2qXayd7DjtG2rnewd7Hhtu2onewc7Qdu+2snewU7Udqh2snewk7Qdq53sHexkbadqJ3sHO0XbudrJ3sFO1XapdrJ3sNO0Xaud7B3sdG23aid7BztD273ayd7BztT2qHayd7CztD2rnewd7Gxtr2onewc7R9u72snewc7V9ql2snew87R9q53sHex8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xp28d5ud7BWMO3nvNTvZKxh38t5vdrJXMO7kfdDsZK9g3Mn7sNnJXsG4k/dRs5O9gnEn7+NmJ3sF407eJ81O9grGnbxPm53sFYw7eZ81O9krGHfy/tTsZK9g3Mn7c7OTvYJxJ+8vzU72CsadvM+bnewVjDt5XzQ72SsYt/T+2uxkr7ihx528v+v9tza6VzDu5P2j2clewbiT989mJ3sF407ev5qd7BWMO3lfNjvZKxh38r5qdrJXMO7k/bvZyV7BuJP3n2YnewXjTt5/m53sFYw7ef9rdrJXMO7kfd3sZK9g3Mkb0+1kr2DcyftGt5O9gnEn75vdTvYKxp28b3U72SsYd/K+3e1kr2DcyftOt5O9gnFL77vdTvaKG3rcyfu+2Pf66F7BuJP3g24newXjTt4Pu53sFYw7eT/qdrJXMO7k/bjbyV7BuJP3k24newXjTt5Y3U72CsadvJ92O9krGHfyxu52slcw7uT9rNvJXsG4k/fzbid7BeNO3jjdTvYKxp28X3Q72SsYd/J+2e1kr2DcyRu328lewbiTN163k72CcSdvpNvJXsG4k1e6newVjDt5tdvJXsG4pde6newVN/S4kzeI9T66VzDu5I3f7WSvYNzJm6DbyV7BuJP3q24newXjTt6vu53sFYw7eRN2O9krGHfyftPtZK9g3Mn7bbeTvYJxJ+933U72CsadvN93O9krGHfyJup2slcw7uRN3O1kr2DcyZuk28lewbiTN2m3k72CcSdvsm4newXjTt7k3U72CsadvCm6newVjFt6U3Y72StufnLXc2q9p+qjewXjruc03U72CsZdz2m7newVjLue03U72SsYdz2n73ayVzDues7Q7WSvYNz1nLHbyV7BuOs5U7eTvYJx13Pmbid7BeOu5yzdTvYKxl3PWbud7BWMu56zdTvZKxh3PWfvdrJXMO56ztHtZK9g3PWcs9vJXsG46zlXt5O9gnHXc+5uJ3sF467nPN1O9grGXc95u53sFYzbn/N1O9krbn5y13MBvefvo3sF467ngt1O9grGXc+Fup3sFYy7ngt3O9krGHc9F+l2slcw7nou2u1kr2Dc9Vys28lewbjruXi3k72CcddziW4newXjrueS3U72CsZdz6W6newVjLueS3c72SsYdz2X6XayVzDuei7b7WSvYNz1XK7byV7BuOu5fLeTvYJx13OF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Uexk72AT04hiJ3sHm4RGFDvZO9ikNKLYyd7BJtP+WOxk72CT05BiJ3sHm4KGFDvZO9iUNKTYyd7BpqIhxU72DjY1DSl2snewaWhIsZO9m1bv6WiE2GhlZO9g09OIYid7B5uBRhQ72TvYjDSi2MnewWaiEcVO9g42M40odrJ3sFloRLGTvYPNSiOKnewdbDYaUexk72Cz04hiJ3sHm4NGFDvZO9icNKLYyd7B5tLGKHayd7C5tTGLnewdbB5trGInewebVxu72MnewebTxil2snew+bVxi53sHWwBbbxiJ3sHW1Abv9jJ3sEW0iYodrJ3sIW1CYud7B1sEW2iYid7B1tUm7jYyd7BFtMmKXayd7DFtUmLnewdbAltsmInewdbUpu82MnewZbSpih2snewpbUpi53sHWwZbapiJ3sHW1abutjJ3sGW06YpdrJ3sOW1aYud7B1sBW26Yid7B1tRm77Yyd7BVtJmKHayd7CVtRmLnewdbBVtpmInewdbVZu52Mnerab36tqses9SRvYOtoY2W7GTvYOtqc1e7GTvYGtpcxQ72TvY2tqcxU72DraONlexk72DravNXexk72DrafMUO9k72PravMVO9g62gTZfsZO9g22ozV/sZO9gG2kLFDvZO9jG2oLFTvYOtom2ULGTvYNtqi1c7GTvYJtpixQ72TvY5tqixU72DraFtlixk72DbaktXuxk72BbaUsUO9k72NbaksVO9g62jbZUsZO9g22rLV3sZO9g22nLFDvZO9j22rLFTvYOtoO2XLGTvYPtqC1f7GTvYDtpKxQ72TvYztqKxU72DraLtlKxk72D7aqtXOxk72C7aasUO9k72O7aqsVO9g62h7ZasZO9g+2prV7sZO9ge2lrFDvZO9je2prFTvYOto+2VrGTvYPtq61d7GTvYPtp6xQ72bv99T5AW0/vdcvI3sEO1NYvdrJ3sIO0DYqd7B3sYG3DYid7BztE26jYyd7BDtU2Lnayd7DDtE2Knewd7HBt02Inewc7Qtus2MnewY7UNi92snewo7Qtip3sHexobctiJ3sHO0bbqtjJ3sGO1bYudrJ3sOO0bYqd7B3seG3bYid7BztB267Yyd7BTtS2L3ayd7CTtB2Knewd7GRtx2Inewc7Rdup2MnewU7Vdi52snew07Rdip3sHex0bddiJ3sHO0PbrdjJ3sHO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d76mTjneKxh3vqZJOd4rGHe+SsrxXsG481VTjvcKxp2vSDneKxh3vjLleK9g3PlqKcd7BePO17Qpx3sF487XdCnHewXjztf0Kcd7BePO1wwpx3sF4xbYjCnHe8UNMO58zczsOdgrGHe+Zkk53isYd75mTTneKxh3vmZLOd4rGHe+Zk853isYd77mSDneKxh3vv6RcrxXMO58zZlyvFcw7nzNlXK8VzDufM2dcrxXMO58zZNyvFcw7nzNm3K8VzDufM2XcrxXMO58zZ9yvFcw7nwtkHK8VzDufC2YcrxXMO58LZRyvFcwboEtnHK8V9wA487Xosyeg72CcedrsZTjvYJx52vxlOO9gnHn658px3sF487XEinHewXjzteSKcd7BePO11Ipx3sF487X0inHewXjztcyKcd7BePO17Ipx3sF487XcinHewXjzte/Uo73Csadr+VTjvcKxp2vFVKO9wrGna8VU473Csadr5VSjvcKxp2vlVOO9wrGna9VUo73Csadr1VTjvcKxi2w1VKO94obYNz5WoPZc7BXMO58rZlyvFcw7nytlXK8VzDufK2dcrxXMO58rZNyvFcw7nytm3K8VzDufK2XcrxXMO58rZ9yvFcw7nxtkHK8VzDufG2YcrxXMO58bZRyvFcw7nxtnHK8VzDufG2ScrxXMO58bZpyvFcw7nxtlnK8VzDufG2ecrxXMO58bZFyvFcwboFtmXK8V9wA487X1syeg72Ccedrm5TjvYJx52vblOO9gnHna7uU472Ccefr3ynHewXjztf2Kcd7BePO1w4px3sF487XjinHewXjztdOKcd7BePO184px3sF487XLinHewXjzteuKcd7BePO124px3sF487X7inHewXjztceKcd7BePO154px3sF487XXinHewXjztfeKcd7BePO1z4px3sF4xbYvinHe8UNMO587c/sOdgrGHe+Dkg53isYd74OTDneKxh3vg5KOd4rGHe+Dk453isYd74OSTneKxh3vg5NOd4rGHe+Dks53isYd74OTzneKxh3vo5IOd4rGHe+jkw53isYd76OSjneKxh3vo5OOd4rGHe+jkk53isYd76OTTneKxh3vo5LOd4rGHe+/pNyvFcwboEdn3K8V9wA487Xicyeg72CcefrpJTjvYJx5+vklOO9gnHn65SU472Ccefr1JTjvYJx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RY73Csadr/eKHO8VjDtf7xc53isYd74+KHK8VzDufH1Y5HivYNwC+6jI8V5xA4w7X58we+nvFYw7X58WOd4rGHe+PityvFcw7nx9XuR4r2Dc+fqiyPFewbjz9WWR472CcedrUJHjvYJx5+urIsd7BePO19dFjvcKxp2vb4oc7xWMO1/fFjneKxh3vr4rcrxXMO58fV/keK9g3Pn6ocjxXsG48/VjkeO9gnHn66cix3sF487Xz0WO9wrGLbBfihzvFTfAuPP1G7OX/l7BuPP1e5HjvYJx5+uPIsd7BePO1+Aix3sF487Xn0WO9wrGna+/ihzvFYw7X0OKHO8VjDtffxc53isYd77+KXK8VzDufP1b5HivYNz5+q/I8V7BuPM1tMjxXsG48zWgyvFewbjzNUyV472Ccedr2CrHewXjztfAKsd7BePO13BVjvcKxp2v4asc7xWMO18jVDneKxi3wEascrxX3ADjztfIjY1U+3sF487XKFWO9wrGna9RqxzvFYw7X6NVOd4rGHe+Rq9yvFcw7nyNUeV4r2Dc+RqzyvFewbjzNVaV472Ccedr7CrHewXjztc4VY73Csadr3GrHO8VjDtf41U53isYd77Gr3K8VzDufE1Q5XivYNz5mrDK8V7BuPM1UZXjvYJx52viKsd7BeMW2CRVjveKG2Dc+ZqM2Wt/r2Dc+Zq8yvFewbjzNUWV472CcedryirHewXjztdUVY73Csadr6mrHO8VjDtf01Q53isYd76mrXK8VzDufE1X5XivYNz5mr7K8V7BuPM1Q5XjvYJx52vGKsd7BePO10xVjvcKxp2vmasc7xWMO19dleO9gnHnK6oc7xWMO19Z5XivYNz5KlWO9wrGna9a5XivYNwC61U53itugHHna1Zmr/29gnHna7Yqx3sF487X7FWO9wrGna85qhzvFYw7X3NWOd4rGHe+5qpyvFcw7nzNXeV4r2Dc+ZqnyvFewbjzNW+V472CcedrvirHewXjztf8VY73CsadrwWqHO8VjDtfC1Y53isYd77+V+V4r2Dc+VqoyvFewbjztXCV472CcedrkSrHewXjFtiiVY73ihtg3PlanNlrf69g3PlaosrxXsG487VkleO9gnHna6kqx3sF487X0lWO9wrGna9lqhzvFYw7X8tWOd4rGHe+lqtyvFcw7nwtX+V4r2Dc+VqhyvFewbjztWKV472CcedrpSrHewXjztfKVY73Csadr1WqHO8VjDtfq1Y53isYd75Wq3K8VzDufK1e5XivYNz5WqPK8V7BuPO1ZpXjvYJxC2ytKsd7xQ0w7nytw+y1v1cw7nytW+V4r2Dc+VqvyvFewbjztX6V472CcedrgyrHewXjzteGVY73Csadr42qHO8VjDtfG1c53isYd742qXK8VzDufG1a5XivYNz52qzK8V7BuPO1eZXjvYJx52uLKsd7BePO15ZVjvcKxp2vraoc7xWMO19bVzneKxh3vrapcrxXMG6BbVvleK+4Acadr+2Zvfb3Csadrx2qHO8VjDtfO1Y53isYd752qnK8VzDufO1c5XivYNz52qXK8V7BuPO1a5XjvYJx52u3Ksd7BePO1+5VjvcKxp2vPaoc7xWMO197VjneKxh3vvaqcrxXMO587V3leK9g3Pnap8rxXsG487VvleO9gnHna78qx3sF487X/lWO9wrGna8DqhzvFYw7XwdWOd4rGLfADqpyvFfcAOPO1yHMXvt7BePO16FVjvcKxp2vw6oc7xWMO1+HVzneKxh3vo6ocrxXMO58HVnleK9g3Pk6qsrxXsG483V0leO9gnHn65gqx3sF487XsVWO9wrGna/jqhzvFYw7X8dXOd4rGHe+TqhyvFcw7nydWOV4r2Dc+TqpyvFewbjzdXKV472CcefrlCrHewXjFtipVY73ihtg3Pk6ndlrf69g3Pk6o8rxXsG483VmleO9gnHn66wqx3sF487X2VWO9wrGna9zqhzvFYw7X+dWOd4rGHe+zqtyvFcw7nydX+V4r2Dc+bqgyvFewbjzdWGV472CcefroirHewXjztfFVY73Csadr0uqHO8VjDtfl1Y53isYd74uq3K8VzDufF1e5XivYNz5uqLK8V7BuPN1ZZXjvYJxC+yqKsd7xQ0w7nxdw+y1v1cw7nxdW+V4r2Dc+bquyvFewbjzdX2V472CcefrhirHewXjzteNVY73Csadr5uqHO8VjDtfN1c53isYd75uqXK8VzDufN1a5XivYNz5uq3K8V7BuPN1e5XjvYJx5+uOKsd7BePO151VjvcKxp2vu6oc7xWMO193VzneKxh3vu6pcrxXMG6B3VvleK+4Acadr/uZvfb3CsadrweqHO8VjDtfD1Y53isYd74eqnK8VzDufD1c5Xiv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AgAAAACAAAB4IwAATiIAAIoJAAA=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AQAAAACAAADeKAAAIgAAAA==eJztwTEBAAAAwqAC65/XGh5AAQAAAAAAAAAAADwZLILqeA== mayavi-4.5.0/examples/mayavi/data/gen_tinyplot3d.f0000644000076500000240000000556412747716313022565 0ustar prabhustaff00000000000000c gen_tinyplot3d - generate little Plot3D files c c c Copyright (c) 2006 Francesco Poli c c Permission is hereby granted, free of charge, to any person obtaining c a copy of this software and associated documentation files (the c "Software"), to deal in the Software without restriction, including c without limitation the rights to use, copy, modify, merge, publish, c distribute, sublicense, and/or sell copies of the Software, and to c permit persons to whom the Software is furnished to do so, subject to c the following conditions: c c The above copyright notice and this permission notice shall be c included in all copies or substantial portions of the Software. c c THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, c EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF c MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. c IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY c CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, c TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE c SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. program main c constant definitions: integer imm,jmm,kmm,ngrid parameter (imm=2,jmm=2,kmm=2,ngrid=5) c variable declarations: character*32 filenm integer i,j,k,nx,igrid real x(imm,jmm,kmm),y(imm,jmm,kmm),z(imm,jmm,kmm) real ga,rgas,ro,wx,wy,wz,p,q(5) real fsmach,alpha,re,time c generate mesh and solution: do 10 k = 1, kmm do 10 j = 1, jmm do 10 i = 1, imm x(i,j,k) = real(i) y(i,j,k) = real(j) z(i,j,k) = real(k) 10 continue ga = 1.4 rgas = 1.0 ro = 0.9 wx = 1.3 wy = 1.2 wz = 1.1 p = 2.3 q(1) = ro q(2) = ro*wx q(3) = ro*wy q(4) = ro*wz q(5) = p/(ga - 1.0) + 0.5*ro*(wx**2 + wy**2 + wz**2) c write out 3D mesh Plot3D file: filenm = 'tiny.xyz' open (unit=1,file=filenm,form='unformatted') rewind 1 write(1) ngrid write(1) (imm,jmm,kmm, igrid=1,ngrid) do 80 igrid = 1, ngrid write(1) $ (((x(i,j,k) + (igrid - 1.0), $ i=1,imm), j=1,jmm), k=1,kmm), $ (((y(i,j,k), $ i=1,imm), j=1,jmm), k=1,kmm), $ (((z(i,j,k), $ i=1,imm), j=1,jmm), k=1,kmm) 80 continue close(unit=1) c write out 3D solution Plot3D file: filenm = 'tiny.q' fsmach = 0.5 alpha = 0.0 re = 1.0e5 time = 0.0 open (unit=1,file=filenm,form='unformatted') rewind 1 write(1) ngrid write(1) (imm,jmm,kmm, igrid=1,ngrid) do 90 igrid = 1, ngrid write(1) fsmach,alpha,re,time write(1) $ ((((q(nx), $ i=1,imm), j=1,jmm), k=1,kmm), nx=1,5) 90 continue close(unit=1) stop end mayavi-4.5.0/examples/mayavi/data/heart.vti0000644000076500000240000015316012747716313021277 0ustar prabhustaff00000000000000 16 15 16 18 14 10 12 17 17 14 11 11 8 8 12 14 12 13 20 24 23 20 16 16 15 16 17 22 24 24 26 30 18 13 15 16 14 6 10 18 18 14 10 6 6 9 13 13 10 10 17 20 19 18 20 21 19 20 24 26 24 24 27 31 15 10 11 13 10 7 8 14 16 11 6 3 6 11 15 15 12 9 12 13 16 14 20 27 27 27 27 26 20 20 26 31 12 13 12 10 7 8 11 13 11 7 6 6 6 8 8 10 13 13 11 12 14 18 23 29 33 32 30 29 24 19 19 23 9 10 9 9 10 9 10 7 4 4 4 4 5 5 3 5 9 14 14 13 16 24 32 37 38 35 33 31 23 15 15 20 7 6 7 7 11 12 7 3 3 6 7 6 4 3 3 5 8 11 13 13 18 25 32 36 39 41 37 28 19 12 10 14 5 4 6 7 9 7 6 5 5 7 9 8 8 7 5 4 6 11 15 22 24 29 33 34 38 39 34 27 21 16 14 18 7 6 6 8 9 7 7 12 12 8 6 11 12 7 3 5 14 15 19 24 29 31 34 32 32 32 30 26 21 18 18 23 15 10 2 2 6 7 6 8 11 10 11 13 11 5 5 13 20 22 23 28 29 22 21 24 24 29 30 23 16 20 28 35 12 10 7 8 11 10 9 9 12 15 15 13 8 6 11 19 27 28 31 27 21 19 22 19 18 22 23 19 17 23 29 26 10 8 9 10 10 11 12 14 19 23 22 16 9 11 20 28 30 28 28 28 26 23 19 15 15 17 17 13 14 20 22 22 12 8 9 7 6 10 14 17 21 26 26 20 15 19 29 37 36 33 32 31 29 23 17 15 17 19 17 13 17 22 26 27 13 9 6 5 10 13 13 15 21 29 36 35 30 32 37 44 43 41 40 34 27 22 22 25 27 26 22 22 28 31 36 35 14 8 5 9 12 12 7 11 27 42 49 55 52 46 47 56 66 62 51 39 30 25 25 29 32 31 29 27 30 35 35 32 13 10 6 7 11 13 11 14 33 52 63 70 71 67 71 79 89 78 60 45 32 31 31 32 31 33 31 29 32 35 32 27 11 13 13 5 7 14 14 17 26 44 58 71 73 72 72 76 83 68 49 38 35 36 34 32 30 33 38 39 36 31 22 20 11 6 4 7 6 11 25 29 37 54 76 99 115 112 105 102 96 87 78 57 43 41 41 39 38 38 28 27 29 33 22 13 10 4 5 13 14 14 22 33 47 64 80 92 103 107 106 99 95 91 80 61 46 41 38 36 30 24 17 19 26 30 23 14 7 4 6 10 13 16 21 29 48 62 73 90 103 107 99 93 90 83 71 54 41 36 31 26 24 27 23 20 20 21 18 11 6 5 7 8 12 17 23 28 41 51 63 86 103 103 89 85 83 76 63 46 36 34 32 28 29 36 27 20 20 16 11 9 7 6 8 12 15 21 24 25 31 39 50 65 78 82 75 73 66 55 49 43 37 34 31 31 31 34 29 24 21 19 21 24 6 7 12 15 20 25 27 24 30 41 48 47 53 60 60 54 49 45 49 49 43 31 28 35 43 34 24 15 12 26 39 33 7 5 10 16 22 25 31 31 33 39 46 45 47 54 56 48 41 40 45 49 50 42 35 39 48 39 26 18 20 29 35 28 21 14 9 8 16 24 31 33 33 37 38 38 43 41 42 39 34 36 46 57 55 49 49 51 51 40 27 30 36 34 31 28 20 16 13 12 17 23 34 38 36 40 35 37 43 40 41 43 41 41 48 55 52 51 55 54 47 39 35 41 44 37 32 29 20 18 17 19 19 22 33 37 33 35 36 40 44 43 42 47 47 40 41 46 46 49 56 53 44 39 47 47 43 39 37 33 21 25 28 30 29 34 43 41 31 34 39 43 44 45 44 49 52 51 51 49 51 52 52 49 38 29 34 42 47 38 33 27 25 29 34 34 34 38 45 42 32 35 42 46 46 47 46 50 52 50 50 46 52 53 51 44 38 27 34 43 47 37 33 27 42 43 40 38 35 32 34 35 32 35 44 55 57 54 47 48 51 46 37 35 43 45 44 45 42 38 44 47 49 44 40 33 44 45 39 34 36 37 31 29 34 39 42 49 54 48 38 40 42 46 49 51 45 35 36 45 54 51 45 44 40 39 36 28 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 12 12 13 11 8 7 6 5 6 8 10 9 9 6 7 6 12 18 19 14 11 11 17 22 23 27 35 34 31 26 23 11 11 11 12 10 4 3 8 11 6 5 6 7 4 3 5 7 12 15 11 11 16 18 21 24 24 29 28 29 29 31 31 12 9 9 7 6 2 6 8 10 6 3 4 7 6 4 6 8 11 9 7 10 18 24 25 27 28 29 26 26 30 34 36 14 8 7 6 4 3 7 9 7 6 3 3 6 7 6 6 7 6 5 7 11 21 31 33 34 33 32 24 22 31 40 38 10 6 5 5 5 4 7 7 3 5 2 3 7 6 4 4 4 5 9 11 13 22 31 36 36 36 30 22 21 33 40 36 5 4 5 7 10 9 7 6 1 1 4 5 5 2 2 6 7 9 14 19 18 25 33 34 37 36 28 22 15 20 25 25 5 3 3 5 11 11 8 4 3 4 8 5 2 3 3 6 9 14 21 23 24 27 31 33 36 34 28 21 16 17 18 23 6 4 4 5 9 7 7 8 5 4 8 10 9 9 7 7 14 26 32 34 27 24 26 28 28 28 25 20 18 19 23 29 9 7 3 5 10 11 11 12 12 11 17 23 17 15 22 27 28 34 37 33 27 23 22 20 26 25 18 9 12 17 19 25 12 13 8 9 11 12 11 10 12 17 30 35 32 31 41 46 45 47 40 26 15 14 15 16 24 25 16 7 13 21 20 18 10 7 5 11 16 16 11 13 26 36 45 48 51 57 69 75 71 62 43 26 22 21 15 10 13 17 15 12 15 20 21 25 15 10 10 16 16 14 16 27 45 58 69 73 75 82 94 98 92 81 66 47 32 21 20 16 10 10 8 8 12 18 24 31 13 10 12 13 14 20 26 37 55 78 90 94 99 109 118 121 112 98 85 66 45 30 20 18 17 15 13 14 18 22 23 22 10 8 10 11 17 22 28 40 64 92 108 116 119 131 140 141 132 115 98 80 57 40 31 26 21 20 20 22 28 30 27 19 11 9 4 8 17 25 41 65 89 109 126 138 141 151 163 166 161 149 124 96 72 53 39 31 28 24 27 31 35 25 19 16 11 8 5 6 13 24 42 68 93 112 129 143 147 151 157 159 159 152 131 105 78 57 42 34 35 29 28 28 29 22 16 15 12 9 8 8 10 21 41 63 88 107 129 148 151 146 140 145 149 150 132 103 77 61 46 39 36 32 26 26 24 17 12 9 12 11 13 15 17 27 47 74 97 116 138 149 152 141 135 146 157 163 145 111 84 65 50 38 27 23 22 27 23 17 10 4 6 6 11 19 23 32 43 63 86 108 124 140 148 145 141 145 149 144 119 86 63 51 40 30 19 19 19 24 25 22 14 4 4 3 8 13 24 31 37 52 75 93 106 126 141 141 137 133 130 119 93 64 46 36 31 29 27 24 16 16 21 20 13 9 5 9 18 27 38 46 52 64 83 102 124 139 147 147 152 150 140 119 90 62 49 45 40 32 26 24 20 24 19 13 15 22 11 12 15 23 37 48 50 54 68 96 115 120 124 129 131 127 111 92 78 62 48 48 44 36 34 36 35 35 31 25 22 19 10 12 25 40 50 53 53 59 75 91 93 90 95 104 105 99 87 77 68 55 43 42 50 49 42 33 32 30 33 35 30 23 11 11 24 43 49 48 54 63 69 70 66 62 66 72 67 59 61 62 58 53 49 49 55 54 44 29 26 30 36 36 31 28 26 21 21 30 49 57 56 51 54 55 51 46 45 43 46 51 56 62 66 64 61 52 45 45 49 42 40 38 27 24 23 21 27 28 27 29 43 55 61 55 53 53 48 47 48 49 46 50 52 54 62 64 62 53 48 47 47 46 43 38 28 26 23 20 35 33 24 28 45 57 56 44 40 46 47 47 50 51 51 52 49 44 50 53 58 60 56 45 40 40 40 33 31 33 32 23 44 40 32 35 47 55 49 38 37 44 50 54 56 55 53 53 52 48 47 49 57 57 51 38 35 38 40 35 32 33 29 24 47 45 42 37 36 41 47 42 38 43 53 61 63 57 50 51 52 45 44 47 51 49 40 33 32 34 40 42 37 30 26 23 43 40 33 32 33 38 42 42 42 42 43 50 53 51 47 47 41 38 43 48 44 37 36 39 38 35 32 33 31 24 18 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 6 5 6 7 6 5 5 7 7 2 6 10 8 3 3 4 8 15 17 16 15 18 20 20 23 29 30 27 26 27 29 7 8 7 8 8 5 3 5 8 7 2 4 7 8 5 4 6 10 11 11 10 9 17 23 27 25 27 31 33 34 36 37 5 7 8 7 7 6 4 4 5 2 2 5 5 3 5 6 11 11 9 10 15 18 15 22 30 28 27 29 33 35 37 38 8 7 6 5 3 5 4 4 4 3 4 6 7 4 3 7 8 7 8 10 16 22 21 26 31 29 27 29 36 40 38 32 10 6 3 2 4 4 7 7 5 4 5 7 8 6 5 7 4 6 13 13 14 25 31 33 33 27 21 23 35 41 34 26 9 6 5 3 5 7 9 8 4 2 5 7 7 6 10 8 7 13 19 17 16 27 33 36 32 24 16 20 29 32 26 19 10 6 4 3 5 10 12 9 5 3 8 10 11 14 15 15 20 25 27 24 20 27 31 33 30 26 17 14 15 17 18 19 14 7 4 5 8 10 12 11 12 14 23 27 33 34 36 42 45 46 42 35 25 21 23 25 28 27 18 12 11 14 20 25 14 7 4 5 8 10 14 15 16 22 32 39 43 47 52 57 58 55 48 38 26 22 22 24 27 24 16 11 11 15 21 27 12 9 10 7 7 11 19 22 25 37 54 60 62 69 80 86 80 71 60 43 30 24 17 19 22 16 6 9 15 18 20 25 10 12 15 14 16 24 31 41 62 83 99 108 110 115 124 132 131 122 98 74 56 42 32 22 16 7 6 8 14 11 11 20 11 6 9 17 26 33 35 51 83 108 121 126 130 138 149 150 151 148 133 108 80 51 32 22 17 14 11 11 15 23 29 39 11 14 24 29 31 37 51 79 103 125 140 141 138 139 144 159 170 173 159 133 107 75 45 20 8 8 10 13 19 22 22 23 15 12 17 24 34 52 68 90 118 135 136 131 135 140 140 149 161 168 173 161 135 92 58 37 30 23 15 13 15 17 16 18 13 12 14 27 41 51 68 96 124 136 126 118 122 133 145 154 161 171 186 179 137 94 60 47 39 31 27 21 19 16 10 7 16 15 17 31 45 60 81 113 136 139 121 105 107 121 130 141 159 181 195 191 150 106 71 50 40 34 36 24 15 9 7 4 20 17 22 36 50 62 85 115 138 139 122 111 111 112 116 132 161 189 199 181 143 102 68 47 37 31 31 24 20 16 11 3 16 27 40 49 51 61 86 113 129 137 136 131 122 112 115 141 172 190 183 170 136 93 57 34 28 26 27 23 19 13 7 1 16 27 44 53 56 67 88 110 124 137 143 141 132 124 132 153 176 187 177 159 127 87 50 31 26 26 26 22 18 12 4 1 12 22 40 50 58 71 83 98 116 135 154 165 162 162 169 176 181 176 152 124 90 63 41 26 25 25 23 23 20 12 9 11 15 27 45 60 69 79 88 101 119 141 164 174 179 183 192 187 181 168 143 109 80 58 40 30 28 24 24 24 23 18 19 23 11 20 38 52 62 68 76 91 111 134 154 159 167 178 185 172 154 137 113 87 69 56 43 33 31 30 29 27 24 24 27 26 15 20 31 46 60 67 69 77 94 116 129 129 135 146 155 143 123 105 91 71 56 49 46 40 40 38 35 30 27 22 20 19 25 26 45 65 77 82 81 86 93 101 101 101 107 115 117 107 87 78 71 59 51 52 50 38 30 26 30 33 34 31 29 30 22 31 50 66 68 67 71 77 76 76 83 87 87 80 73 73 75 66 59 63 64 55 39 31 27 27 29 28 28 26 26 27 26 32 48 57 62 60 62 70 73 72 70 67 66 66 66 69 72 68 55 46 42 38 38 39 34 32 27 23 19 25 25 21 38 39 42 52 71 69 57 56 62 62 58 60 65 60 46 44 54 64 62 53 47 41 42 41 39 35 28 22 22 24 22 18 52 41 35 45 65 63 49 44 51 58 63 65 66 65 50 44 51 61 63 59 56 46 36 34 36 32 21 19 29 29 26 26 51 37 36 41 49 48 42 42 51 54 59 66 61 55 47 46 49 54 57 59 55 45 34 31 35 31 24 20 26 25 24 27 46 38 37 39 44 46 42 46 53 57 58 62 55 47 43 45 49 50 49 47 43 36 33 31 29 28 26 24 22 19 16 19 39 36 34 37 46 46 45 50 56 58 56 57 53 48 46 46 49 49 40 33 28 34 38 35 27 21 19 16 16 11 9 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 4 5 3 7 6 7 6 7 5 1 7 10 6 1 3 7 13 18 17 16 20 18 15 15 21 28 31 30 30 29 23 5 2 2 1 4 7 5 5 9 11 4 5 10 10 4 3 6 11 14 13 15 18 17 16 19 24 28 30 30 29 28 22 3 5 8 8 6 4 3 6 7 7 7 7 6 7 5 5 7 5 5 7 12 18 24 24 24 24 31 35 37 37 30 21 4 5 6 5 6 3 3 4 4 8 9 6 6 7 6 6 11 11 8 9 13 17 22 27 29 28 31 33 32 30 27 19 7 7 7 7 5 4 5 4 5 7 10 11 11 10 11 11 14 14 16 18 20 23 26 28 29 27 32 35 29 21 20 19 10 8 7 7 6 8 9 9 9 9 10 12 18 21 25 27 23 22 27 26 29 36 32 28 21 24 30 32 26 14 9 9 10 10 9 8 7 11 14 14 15 16 16 23 34 42 46 46 43 40 38 33 31 36 34 29 22 20 21 19 15 10 8 12 9 6 10 13 13 19 24 26 29 33 41 55 74 80 77 81 82 71 61 48 40 36 36 31 22 18 12 9 9 12 18 24 11 7 10 17 20 22 28 36 47 57 69 87 107 119 115 115 114 105 91 70 54 46 38 32 23 17 11 9 9 14 20 25 12 12 11 17 21 22 33 50 69 89 102 113 126 140 142 142 142 135 120 96 75 59 44 29 21 15 10 11 12 14 19 21 16 17 21 24 29 40 59 83 106 129 134 131 134 143 150 157 162 165 163 146 113 82 52 29 17 14 9 9 9 12 21 32 18 18 24 29 37 51 74 99 124 143 141 135 132 141 149 156 169 180 183 172 137 101 64 33 20 15 10 10 11 16 25 35 15 12 19 33 41 57 83 107 127 137 132 125 120 129 139 150 171 189 189 174 145 115 79 41 21 14 12 15 20 26 32 36 21 30 45 54 61 80 109 132 139 125 104 94 96 96 106 130 156 174 184 192 188 161 115 62 29 20 15 9 7 12 20 26 25 33 47 59 77 100 116 132 144 130 102 86 90 93 93 109 134 162 193 212 205 169 126 85 53 31 18 14 16 16 15 12 38 47 55 68 84 106 129 141 133 117 91 72 74 84 96 113 134 165 196 209 197 175 141 100 58 38 29 20 13 13 11 7 41 46 58 75 91 109 129 145 141 121 97 78 70 78 94 112 135 167 201 214 201 173 133 92 56 29 18 13 13 13 7 3 43 52 63 83 100 108 124 141 140 127 109 96 93 97 108 126 147 172 197 206 192 156 109 66 37 24 20 18 12 7 3 1 44 58 72 88 101 112 130 143 144 142 135 124 118 121 132 145 161 183 202 207 182 143 98 59 38 25 22 16 11 5 3 2 45 58 72 83 97 110 127 137 149 165 173 165 158 158 170 182 192 201 204 186 145 105 73 51 40 31 24 21 15 7 6 9 45 53 65 77 91 105 114 127 143 168 189 197 196 201 210 213 205 190 169 139 102 70 46 37 34 33 33 29 19 11 18 20 46 55 68 79 89 99 111 122 136 160 186 200 206 209 213 213 197 174 146 118 88 61 42 33 32 34 37 29 20 16 23 24 44 50 67 78 83 91 102 112 123 139 158 174 187 186 183 177 158 132 104 80 64 52 43 33 26 25 33 32 31 27 27 29 52 53 64 75 82 90 98 105 114 124 135 154 163 161 151 144 126 103 79 61 53 49 45 36 26 23 31 35 38 35 33 30 45 49 62 71 77 84 88 87 95 98 101 110 119 122 111 99 85 75 61 55 49 43 35 30 28 23 27 33 36 34 32 28 33 45 63 76 76 74 77 85 84 84 91 93 86 77 75 75 73 63 58 57 53 37 29 26 30 28 25 24 24 26 28 31 41 50 59 65 58 57 69 83 80 71 71 73 72 69 71 67 55 43 37 40 49 45 34 28 29 31 24 18 17 22 23 22 40 37 47 63 67 56 58 62 56 50 55 62 64 51 46 53 58 56 50 47 45 43 39 33 26 17 15 15 16 18 18 19 40 35 32 46 50 45 48 54 60 56 56 58 54 57 59 64 63 58 47 31 29 31 35 31 23 14 18 20 18 12 12 16 40 32 31 40 44 40 38 46 53 54 58 63 60 58 57 50 49 50 47 41 39 36 32 25 17 9 9 14 13 8 11 20 44 35 33 35 40 36 37 40 45 48 49 55 55 54 53 53 48 38 29 29 33 35 35 27 13 6 6 8 7 3 6 15 44 42 36 35 40 42 43 45 40 43 55 66 57 50 47 44 42 36 29 27 29 33 34 24 12 2 2 3 2 1 4 13 1 2 4 4 4 6 6 5 5 7 9 8 8 7 6 9 9 14 12 11 10 11 11 10 14 23 26 24 26 22 19 16 3 1 1 1 2 4 7 5 9 11 11 7 6 6 7 10 9 13 13 11 10 12 15 12 15 21 22 21 25 23 19 15 4 4 4 2 2 3 6 9 10 9 10 8 8 9 6 6 6 8 8 9 15 22 21 18 21 24 27 28 27 18 14 14 3 5 9 7 4 4 7 9 9 11 10 10 10 9 7 10 10 9 6 11 19 28 28 26 26 31 29 26 24 19 14 12 7 7 11 10 6 6 9 13 16 16 13 14 20 21 19 18 20 20 20 21 27 31 34 35 35 29 18 10 13 12 12 14 12 13 11 12 9 9 16 17 20 20 21 29 37 40 43 46 46 43 39 36 35 36 40 40 36 29 19 13 11 11 9 12 15 19 19 12 11 15 18 22 27 34 42 55 71 79 81 81 75 68 62 57 50 48 47 44 37 28 18 11 7 7 7 12 16 21 27 26 24 27 31 38 48 63 79 97 114 124 123 118 110 104 100 89 74 65 56 43 32 22 11 5 5 12 16 20 13 15 27 36 38 41 51 66 83 101 120 134 142 151 150 146 148 150 147 134 110 81 59 42 29 19 9 8 11 23 25 24 20 25 37 43 46 49 63 86 106 123 137 143 146 154 154 154 159 170 173 166 140 105 73 49 32 17 9 9 12 19 24 25 28 40 46 48 55 65 84 107 124 136 136 133 133 136 139 146 160 173 185 188 176 141 98 60 33 18 9 13 16 20 20 22 36 49 54 58 69 85 107 128 134 136 126 115 114 118 121 131 150 171 194 204 198 168 118 76 45 24 13 17 22 25 27 27 44 51 56 67 79 96 118 135 134 127 113 97 96 105 112 116 136 163 186 199 198 178 134 91 59 30 20 18 26 30 31 24 54 58 67 80 87 99 122 138 135 118 95 77 75 82 92 106 122 143 167 190 204 198 161 109 61 34 22 23 27 29 27 16 61 67 77 86 92 103 124 140 138 115 84 68 64 68 80 96 112 129 159 189 206 204 178 125 75 40 22 24 28 29 24 13 46 61 77 83 96 118 138 150 140 116 83 67 66 69 80 96 116 136 165 193 200 194 169 128 84 47 26 19 20 18 9 4 66 74 81 88 100 125 150 155 138 113 87 64 56 66 83 102 114 137 163 187 201 198 171 129 84 50 26 20 21 18 8 0 74 83 86 90 106 130 152 163 154 137 111 81 63 75 91 108 135 163 184 197 207 196 161 106 55 28 23 22 16 5 3 3 75 84 85 93 111 130 146 158 160 158 148 127 118 122 128 140 161 183 201 210 206 186 137 86 49 33 26 16 5 3 5 5 73 83 87 91 103 120 143 159 170 178 178 168 155 153 159 176 194 212 220 209 188 163 117 71 40 29 27 18 7 5 6 9 67 72 76 85 93 105 124 149 176 196 209 208 198 192 199 211 215 217 206 182 151 120 88 59 36 27 23 16 11 11 17 18 67 70 77 84 86 93 102 120 151 186 216 227 228 227 223 221 204 181 158 130 98 76 60 56 50 38 23 12 19 28 33 26 68 72 79 81 85 94 104 113 131 160 195 213 215 212 210 203 183 156 129 103 79 62 53 50 45 39 30 23 27 32 31 24 64 70 77 79 86 95 106 110 116 129 149 169 175 172 164 151 128 104 83 63 51 44 38 31 31 35 43 38 35 33 33 28 63 72 79 80 86 94 103 108 113 116 126 142 149 142 130 115 95 80 69 56 43 35 29 26 28 34 44 40 33 30 33 29 56 67 77 83 84 87 95 100 103 96 94 99 103 94 88 83 71 61 56 56 46 34 26 25 24 25 29 27 24 25 27 28 56 63 66 61 56 69 80 83 79 73 70 69 67 65 64 62 50 42 43 48 43 30 25 27 32 30 21 15 13 18 21 19 56 61 63 57 50 63 74 77 73 69 65 65 64 61 61 57 45 38 42 47 41 29 24 26 31 27 19 13 10 16 18 16 45 40 52 63 58 51 57 66 62 59 57 55 53 50 51 56 55 49 44 42 41 33 25 20 15 13 13 10 7 8 10 12 43 45 52 56 52 48 51 58 58 51 49 58 65 62 52 50 48 43 40 33 31 25 15 10 10 15 12 6 3 4 6 14 37 30 30 39 40 38 47 58 58 54 59 65 62 55 50 44 38 34 28 26 33 33 19 6 3 6 9 5 3 7 14 14 49 43 33 35 42 41 36 40 46 50 52 51 46 44 44 44 45 38 29 22 23 23 17 5 0 0 2 2 5 13 18 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 3 2 3 6 7 9 14 17 18 14 9 8 12 13 12 8 13 17 13 12 14 15 14 14 15 16 20 20 15 7 8 11 5 2 3 7 9 12 15 16 18 12 11 11 12 12 12 9 15 18 14 18 21 22 16 15 17 19 19 17 12 8 10 12 10 6 5 9 13 14 16 16 14 14 14 16 19 17 17 17 23 27 23 23 27 30 28 24 20 20 15 11 10 12 15 14 15 15 13 18 20 20 20 20 18 19 22 29 34 34 32 34 39 43 34 29 32 40 40 32 19 14 13 12 12 14 15 15 18 23 22 21 22 22 24 29 29 35 46 52 59 58 62 65 64 60 54 47 45 46 40 28 12 8 9 10 8 9 13 16 23 28 23 19 25 31 34 38 47 65 82 86 88 92 101 102 96 90 84 71 62 53 43 27 13 10 10 13 7 9 14 24 38 47 45 43 50 57 59 68 90 119 134 134 140 148 154 156 159 156 141 119 95 69 44 22 7 6 11 15 12 16 22 30 44 54 57 59 63 72 86 103 124 141 147 149 154 159 161 171 185 185 173 153 124 90 58 30 12 8 14 24 25 23 25 45 56 66 66 68 78 96 119 141 153 151 140 136 140 144 155 173 188 197 201 186 155 116 79 44 23 19 27 30 29 21 18 55 65 70 70 72 88 113 134 148 151 142 127 118 119 123 134 156 183 205 214 200 172 136 96 58 33 28 30 31 30 25 19 64 69 72 73 80 103 131 152 156 139 124 111 101 97 101 109 134 161 193 212 215 198 166 125 87 58 41 34 30 31 30 26 71 72 72 78 89 110 138 156 150 130 112 100 93 87 91 96 114 137 166 193 208 201 182 151 116 79 50 36 32 30 23 16 75 76 76 82 101 124 143 155 151 128 103 83 75 70 75 79 91 116 151 181 199 206 201 180 137 89 52 36 34 29 17 5 81 73 72 76 89 113 141 154 147 120 86 64 62 65 69 78 91 110 131 155 183 202 198 167 114 73 52 45 41 27 13 4 74 71 71 78 90 116 147 158 145 117 87 67 62 67 74 83 94 110 128 153 180 200 197 169 119 77 53 41 38 23 10 4 71 70 76 81 95 122 156 170 152 123 93 74 66 72 87 100 115 130 147 166 185 198 190 162 121 77 45 30 24 13 4 1 76 73 78 79 92 123 163 188 179 145 108 83 74 79 96 114 133 149 161 177 191 195 186 156 118 78 47 28 16 6 0 1 80 86 87 86 100 127 159 188 194 174 137 107 96 102 118 142 169 176 180 198 211 195 164 118 83 54 38 17 7 4 3 3 86 91 89 91 101 120 145 171 185 187 172 152 139 139 150 171 191 198 206 217 213 180 138 91 67 49 34 14 9 8 7 2 77 81 79 73 75 94 131 163 189 206 215 210 197 195 208 224 224 221 225 223 201 162 112 72 53 45 32 17 9 9 9 7 73 75 74 67 58 71 99 141 180 211 228 232 226 222 225 226 222 211 199 181 153 122 83 55 37 32 28 23 24 25 20 14 75 73 75 72 66 71 89 122 162 192 210 220 218 215 212 207 195 177 157 137 113 91 70 52 35 26 27 34 40 33 24 16 76 78 79 83 90 93 97 110 139 163 181 189 186 178 170 160 143 125 112 98 79 59 46 41 36 31 32 37 39 33 26 21 73 80 84 95 113 116 110 106 116 133 150 149 133 121 113 104 91 82 73 60 45 31 27 32 43 41 37 31 31 32 31 30 70 81 88 100 117 118 111 108 112 120 127 121 104 90 86 84 76 68 57 45 32 25 25 30 36 33 33 29 29 29 27 27 62 78 87 93 96 95 95 93 96 92 89 85 73 58 58 64 61 52 42 39 29 19 18 19 15 16 19 22 26 27 26 28 64 74 78 82 85 87 82 81 86 89 82 74 62 49 51 52 47 40 36 34 25 22 20 15 12 11 13 17 21 22 21 24 63 64 67 69 71 74 71 70 76 81 76 70 59 53 51 45 36 36 34 31 28 26 20 10 9 7 6 7 11 13 14 19 44 46 55 59 54 53 62 66 66 58 57 58 52 49 48 46 39 38 36 30 25 18 16 16 16 12 5 7 12 15 12 12 41 39 47 53 50 53 65 67 61 54 58 58 46 43 45 44 35 32 34 28 23 17 16 21 20 14 6 9 17 19 12 10 42 28 31 44 49 48 56 64 61 62 65 63 50 42 42 38 29 24 27 33 29 16 3 4 6 8 9 12 14 19 18 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9 10 9 12 18 22 25 31 27 22 17 20 19 14 8 13 18 24 31 25 18 19 20 20 18 18 18 17 9 4 5 14 19 19 19 22 29 32 35 34 28 24 24 24 20 19 22 30 34 35 37 33 31 26 24 24 25 18 12 10 8 8 11 13 20 25 33 42 48 51 45 39 35 35 38 39 48 58 63 65 67 68 60 52 53 52 44 33 21 11 8 6 10 10 12 9 24 35 46 55 60 62 57 52 49 52 60 65 80 94 100 101 101 99 90 80 74 66 54 33 16 7 7 4 8 10 14 13 33 46 59 62 64 68 68 68 74 84 101 110 119 132 146 150 149 145 137 123 101 81 61 36 18 10 8 7 7 11 16 19 45 58 67 71 73 79 88 96 111 138 154 154 152 156 171 184 192 199 198 182 156 122 88 55 32 18 14 16 19 19 24 24 50 61 68 73 74 83 96 106 125 150 160 159 154 158 171 186 198 207 208 193 170 138 101 65 40 24 18 20 21 21 24 24 59 65 67 69 72 83 101 125 146 161 159 150 142 143 150 166 187 199 205 205 197 169 130 91 57 35 28 27 26 23 22 22 71 76 74 67 71 91 120 151 174 175 163 144 132 126 127 141 160 175 197 215 219 207 181 146 106 77 49 32 20 19 18 16 70 72 72 70 82 110 147 173 181 171 152 129 112 105 100 110 133 162 188 204 213 214 202 172 137 103 70 42 25 18 14 12 70 62 61 69 91 126 163 184 180 154 135 114 93 78 76 86 112 143 168 184 196 214 221 205 174 123 75 42 29 22 15 9 71 68 65 69 89 124 163 181 175 154 130 101 79 70 69 72 83 110 140 165 185 208 231 228 190 131 80 49 32 18 7 2 59 61 66 78 99 127 156 181 182 155 115 78 52 51 59 69 74 93 120 147 177 205 225 225 192 142 95 65 42 18 4 3 66 65 64 68 88 125 168 190 187 160 119 83 61 59 59 65 71 87 106 131 165 192 209 209 181 137 96 63 39 16 7 7 71 66 59 59 77 122 183 208 196 162 124 93 76 75 75 78 85 94 110 136 165 187 201 197 166 119 82 52 31 12 4 3 70 68 70 69 79 118 173 212 210 184 144 109 89 99 116 125 131 133 138 155 177 195 203 186 145 98 56 31 15 4 0 0 69 68 67 67 78 112 166 213 220 201 165 127 112 121 139 147 151 153 162 174 187 196 196 173 131 84 47 22 11 6 2 2 73 69 64 63 75 101 148 194 219 219 199 171 158 164 177 183 188 190 201 206 203 190 172 138 99 59 29 12 7 7 6 5 73 69 62 59 67 88 128 172 210 228 228 208 193 190 195 200 204 206 213 213 200 187 158 120 80 47 24 9 5 7 6 6 71 74 69 57 58 77 109 145 193 225 236 230 223 219 217 216 210 209 218 212 182 149 116 84 59 40 25 14 12 13 10 11 74 73 71 63 60 70 95 132 175 207 223 228 229 226 221 217 212 203 193 174 142 109 83 59 45 33 28 26 26 24 17 11 76 74 79 81 80 85 97 122 152 177 194 203 201 191 185 183 180 168 149 125 94 71 55 39 28 28 36 38 34 27 22 22 81 83 94 99 95 97 107 122 143 159 164 160 147 136 134 132 126 117 105 87 60 44 40 41 40 37 34 32 27 28 30 30 78 86 101 107 107 108 119 128 137 140 132 118 101 98 100 96 84 73 66 53 47 42 43 43 43 34 26 21 21 24 26 23 76 89 100 108 109 103 111 122 121 108 95 83 73 69 72 67 55 46 36 31 30 35 38 39 34 31 26 21 19 17 16 15 67 79 88 90 88 82 87 94 94 88 82 67 54 48 61 61 50 36 23 18 16 17 20 19 15 16 18 21 22 20 19 17 71 72 74 79 82 77 73 73 79 80 72 52 40 41 48 43 36 31 27 28 24 18 14 13 13 12 14 14 14 16 22 25 65 62 57 56 60 64 64 60 62 67 63 47 39 44 48 42 35 29 25 30 27 13 7 7 9 11 15 15 14 15 18 22 61 59 54 46 51 58 63 61 60 61 57 46 42 48 46 41 36 31 26 21 16 9 5 7 6 13 17 19 15 14 16 18 58 55 57 52 51 55 60 62 58 54 49 44 40 39 34 34 39 41 32 19 12 9 9 11 7 11 13 19 19 18 16 17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31 38 45 48 54 56 61 59 55 46 36 30 24 24 31 44 51 53 49 34 28 29 27 26 23 15 10 11 11 11 9 6 40 51 61 63 65 64 65 63 64 66 62 56 54 61 70 82 90 94 84 65 53 50 48 35 14 4 5 11 17 19 20 14 43 54 64 71 71 71 77 79 84 94 103 109 118 126 131 137 144 145 143 131 112 83 60 37 16 10 10 14 19 20 19 17 55 62 67 69 69 75 83 91 103 120 135 146 158 165 168 172 175 176 172 162 140 109 79 49 26 17 16 18 21 22 21 17 63 68 67 63 64 74 87 104 132 159 175 188 198 201 196 197 201 203 204 193 175 152 122 84 53 29 18 16 21 23 20 12 68 67 64 58 58 70 87 113 152 182 193 207 212 207 201 200 204 210 219 213 204 185 155 116 78 43 25 21 23 24 19 9 70 66 62 62 66 76 99 133 170 191 192 192 188 181 180 183 187 200 215 220 217 205 180 146 106 67 41 28 25 24 22 14 68 65 62 67 76 95 129 166 192 202 191 174 149 129 128 140 158 177 196 213 225 227 212 184 146 103 62 36 26 24 24 19 67 65 63 69 79 104 143 180 203 209 194 169 139 114 110 122 144 165 189 206 224 232 226 206 169 123 73 42 28 24 25 19 66 64 67 70 88 121 164 192 203 200 177 144 114 93 90 99 120 144 168 188 210 226 230 219 189 143 85 48 27 16 19 13 73 67 66 70 84 124 169 200 212 200 169 125 91 69 67 79 96 121 150 175 198 224 236 228 204 160 117 73 39 17 8 0 79 71 64 65 84 128 173 203 204 186 152 107 76 67 65 70 82 104 128 154 188 214 226 222 206 171 125 76 39 19 11 9 73 56 47 50 85 127 172 214 225 198 151 104 78 72 63 62 64 78 96 126 165 196 218 222 215 178 121 61 24 8 7 11 61 50 49 58 83 125 172 208 219 200 163 115 83 67 58 62 71 84 100 122 145 170 195 210 204 172 122 71 36 16 6 8 55 53 53 66 87 123 178 222 230 201 159 117 94 85 86 91 92 96 116 141 163 186 210 214 192 151 100 51 19 7 2 2 51 53 54 64 85 121 173 216 235 218 173 136 119 118 116 119 125 126 135 154 179 201 215 209 180 132 78 35 11 3 1 0 55 50 53 65 81 107 151 196 228 233 204 169 150 144 146 157 171 169 168 183 204 217 214 187 145 96 52 24 11 6 5 3 61 53 57 63 71 88 119 165 212 237 232 209 187 175 177 184 197 204 207 214 221 212 183 142 101 61 31 16 9 9 10 10 59 56 57 61 66 78 102 146 198 226 232 219 201 188 187 192 199 206 213 219 215 196 157 116 82 51 30 17 12 15 17 16 63 62 63 61 65 71 88 124 168 198 216 219 212 197 193 199 198 193 194 190 173 144 107 73 50 38 33 25 23 22 25 23 73 68 67 69 75 80 90 112 139 168 194 203 197 190 191 194 190 179 167 157 136 105 75 51 39 41 41 34 28 28 29 26 83 85 88 91 98 105 108 117 135 148 157 160 157 158 165 169 164 145 117 101 84 67 55 42 34 32 31 25 23 24 22 25 89 97 102 104 104 117 124 131 140 137 128 116 113 116 127 129 120 103 82 66 56 51 50 44 37 26 19 18 20 24 26 26 96 103 104 99 102 112 123 127 118 101 91 88 84 84 82 72 59 55 51 45 48 49 45 35 26 21 16 19 20 19 18 22 83 91 89 81 77 80 91 100 90 77 70 69 62 55 50 44 33 33 33 37 41 42 34 24 26 21 16 17 20 17 16 27 60 68 82 79 72 66 65 68 69 65 60 51 37 32 40 48 43 29 21 20 15 13 12 9 10 13 18 24 25 20 22 32 47 57 73 74 67 60 58 62 61 53 47 42 42 41 37 35 37 33 28 19 12 11 12 12 11 11 16 18 22 28 33 38 48 49 49 51 59 61 64 66 60 47 38 41 46 49 36 24 19 18 23 19 12 5 3 7 11 12 12 13 16 20 30 42 51 51 47 44 52 56 60 61 52 42 38 43 40 38 35 34 30 22 14 18 20 18 7 5 6 9 8 7 7 10 17 30 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 46 52 60 61 55 56 57 61 62 60 51 43 39 38 41 45 52 57 48 42 42 43 32 20 16 19 19 17 8 6 5 7 53 60 65 66 57 50 50 58 71 76 75 74 78 84 90 95 96 92 80 77 78 67 49 28 14 11 16 18 13 8 8 5 58 68 70 61 55 56 56 63 81 99 114 128 135 135 141 151 160 157 144 130 117 95 66 38 23 21 27 27 23 16 11 6 62 67 67 58 53 54 64 74 92 123 156 177 186 190 198 204 210 211 200 179 153 127 96 64 43 36 36 31 26 18 10 5 64 67 64 55 51 58 70 91 120 157 196 220 231 229 224 220 223 225 221 211 194 171 138 105 75 54 41 33 29 20 11 6 63 62 56 51 49 62 83 115 159 204 233 244 238 225 214 207 206 215 230 236 232 216 190 154 113 76 54 41 32 18 10 4 68 65 59 53 56 70 96 135 182 223 246 246 229 211 194 183 185 202 226 236 238 233 215 183 143 104 74 51 37 22 11 6 72 67 63 62 65 82 116 161 203 230 240 228 202 172 150 143 155 179 208 224 236 239 231 207 174 134 98 66 43 28 15 6 68 67 66 71 79 98 137 179 215 232 233 207 172 138 115 119 137 163 193 214 230 236 234 221 198 162 120 83 49 31 15 2 71 65 67 78 94 119 157 195 222 228 210 169 126 95 87 95 113 134 163 191 210 225 233 227 209 175 131 91 55 31 14 4 80 73 70 75 95 130 174 207 229 227 194 144 99 69 66 69 79 98 129 162 191 208 216 214 207 185 147 98 51 20 9 6 83 78 70 73 94 132 179 210 229 226 186 133 89 63 58 59 62 80 109 147 176 190 199 201 205 195 161 102 51 16 7 9 75 67 61 65 87 129 182 219 226 213 171 119 77 65 61 58 61 77 103 135 160 177 193 210 217 199 151 93 50 26 13 13 60 51 50 62 94 133 182 225 242 214 160 109 83 78 64 52 57 72 90 107 125 156 194 219 225 194 140 87 50 27 12 7 53 50 54 69 97 134 179 215 228 217 175 120 80 63 62 67 80 96 106 120 137 162 185 207 218 198 144 79 32 10 7 9 52 54 62 71 89 127 177 221 240 229 192 138 97 81 85 91 96 108 131 155 172 185 207 220 210 168 108 52 11 2 0 6 52 53 56 64 77 109 152 204 242 243 206 154 127 120 126 125 127 132 150 180 203 215 217 208 184 136 78 31 6 1 0 4 49 43 52 70 82 96 124 179 228 247 222 184 158 149 154 157 160 162 187 218 237 235 213 179 138 90 47 22 13 5 4 8 44 45 53 60 66 78 107 150 196 221 217 200 185 180 183 185 193 210 231 246 239 215 180 134 88 52 30 22 20 16 7 6 47 45 50 54 61 75 99 136 174 198 208 201 197 196 200 202 208 222 232 234 215 181 142 103 70 49 33 23 20 21 19 17 62 62 64 62 67 79 99 120 139 167 193 199 201 204 203 200 199 198 197 187 161 124 95 72 60 52 39 29 26 29 27 27 73 78 78 76 82 91 105 117 128 148 174 184 188 192 188 181 172 165 159 150 129 100 80 65 54 45 34 30 28 29 27 27 86 92 93 97 106 109 113 114 111 113 131 143 147 147 147 138 120 103 96 92 85 72 57 43 33 28 23 24 27 26 26 28 94 96 92 94 100 109 111 100 84 74 75 80 82 83 82 69 60 58 56 55 54 48 36 28 26 25 19 16 14 16 22 28 94 97 89 88 92 103 104 91 73 64 64 66 68 69 66 54 46 49 51 52 51 44 32 26 27 27 21 15 12 17 23 29 88 94 85 75 76 88 86 78 68 56 47 48 49 46 48 37 27 28 40 43 41 36 24 20 23 26 23 22 20 20 28 40 64 70 68 57 59 61 60 58 59 54 45 42 38 38 42 44 37 29 24 21 18 22 17 16 22 28 26 21 24 37 51 57 56 56 60 55 50 44 45 41 36 30 32 36 40 41 38 32 31 29 24 19 18 18 18 17 14 17 23 29 37 47 54 51 50 44 45 62 64 52 42 45 40 47 43 30 19 22 28 26 23 24 24 15 8 8 12 17 14 12 8 16 28 40 49 44 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 53 52 47 46 47 46 42 42 57 71 82 87 86 88 92 94 97 103 106 98 85 62 46 42 37 24 16 15 15 6 7 8 55 58 56 47 42 39 41 46 62 85 112 127 136 143 150 154 150 146 145 142 126 99 72 51 39 33 25 18 10 6 4 4 55 62 58 49 44 46 55 68 87 112 148 177 189 198 205 207 202 194 193 176 152 126 106 80 59 47 41 29 17 9 5 4 51 57 57 55 51 51 65 89 114 140 173 206 233 252 255 239 230 226 225 209 190 176 156 133 106 78 55 33 13 5 3 2 58 62 65 61 60 66 84 109 141 181 218 241 252 248 237 224 214 220 228 230 224 217 202 177 143 105 70 40 17 8 6 7 61 66 69 71 76 86 106 137 181 221 242 248 241 224 200 183 180 201 224 236 230 230 228 210 181 143 97 56 29 14 12 8 64 71 73 76 82 91 118 158 200 231 238 233 216 184 153 138 147 176 208 224 227 233 234 223 199 165 120 72 38 19 10 6 68 73 76 81 87 102 137 179 214 228 226 208 170 125 99 96 112 140 170 196 215 230 237 230 218 192 149 93 47 21 8 5 73 76 74 83 97 114 148 184 209 214 204 181 139 98 77 82 91 108 135 161 189 211 227 231 226 205 160 102 52 20 8 8 85 78 74 86 103 126 156 190 204 196 174 139 98 72 64 68 71 82 105 134 164 185 201 212 221 210 169 113 58 21 8 7 76 76 78 87 109 133 163 194 208 188 143 92 67 58 58 55 60 74 89 114 133 141 164 192 215 215 176 118 59 29 16 11 70 69 70 79 103 136 170 200 207 184 142 91 64 58 59 57 61 70 85 109 127 140 165 195 219 218 176 118 58 30 17 12 57 56 59 74 100 145 190 223 221 188 137 94 71 64 61 58 64 73 87 105 126 146 173 201 221 211 166 109 58 29 16 12 49 49 57 76 106 147 192 222 223 184 126 87 70 65 59 60 72 81 92 105 129 151 177 205 224 208 160 102 54 26 11 10 50 46 45 62 97 134 176 212 228 212 161 101 67 61 64 73 90 99 103 118 141 165 188 214 225 198 139 75 31 9 1 2 52 46 50 60 85 129 177 216 235 231 194 137 94 82 85 90 101 114 125 148 169 189 210 220 201 155 94 41 11 2 0 4 64 64 63 63 69 93 138 188 232 248 214 165 125 108 102 100 114 138 164 192 216 230 232 210 166 109 55 20 4 3 7 14 51 49 53 62 72 82 109 155 202 225 219 194 168 149 135 136 159 191 222 242 247 236 207 160 113 70 39 18 8 5 10 18 52 52 53 60 68 73 91 130 170 200 212 206 193 183 179 188 202 221 238 241 238 222 185 133 84 52 34 24 19 16 18 24 51 55 58 63 73 80 92 114 147 179 201 209 213 213 218 222 222 223 221 214 197 171 140 100 66 40 25 16 14 16 21 24 62 67 65 64 76 91 102 109 122 150 175 190 199 205 204 195 186 180 180 165 135 108 91 75 57 33 16 11 12 13 17 24 67 74 71 71 83 93 99 98 103 125 146 161 169 176 176 163 146 138 141 134 110 85 73 62 48 27 16 14 17 16 20 28 75 80 85 89 88 87 86 80 80 90 100 106 113 120 120 111 94 85 89 90 79 64 52 43 34 23 16 18 23 25 28 34 74 78 85 86 81 75 72 68 65 66 66 69 75 86 87 82 75 74 75 73 64 52 43 35 27 20 15 19 26 30 34 38 79 73 72 78 76 68 63 61 52 41 39 40 44 53 53 50 56 64 65 60 47 37 29 24 19 15 12 17 26 35 36 39 66 64 51 53 59 62 51 49 52 46 36 27 30 39 43 40 39 41 44 46 38 28 22 23 25 24 24 32 42 50 51 44 57 56 45 43 51 55 44 38 46 50 37 23 25 40 45 45 37 34 37 41 38 28 22 25 30 31 32 41 50 58 54 44 54 46 50 53 48 43 31 21 22 31 29 27 28 43 51 49 46 41 39 33 28 23 21 20 19 26 33 39 47 53 52 47 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 47 47 43 38 38 41 44 48 58 69 84 104 122 139 149 154 157 157 150 141 126 108 91 71 43 22 11 5 5 10 13 11 47 51 47 42 45 51 55 60 70 89 118 151 180 197 202 201 204 205 199 184 165 145 127 105 75 49 27 14 5 4 7 10 52 58 55 54 61 65 72 91 111 136 165 207 245 254 242 219 215 219 219 211 207 202 194 168 134 95 58 29 12 8 9 12 55 60 56 57 65 70 78 100 121 148 178 217 249 253 239 215 211 214 216 213 214 213 207 183 146 106 65 35 16 10 12 12 61 63 60 63 70 79 94 119 148 185 218 237 239 230 215 198 191 199 212 214 220 227 225 205 173 132 85 50 25 14 11 9 59 58 57 62 71 80 93 113 149 184 209 211 196 174 154 148 156 174 185 194 208 229 233 223 199 158 110 68 37 17 7 6 56 55 53 60 67 82 99 120 147 173 181 167 143 119 104 100 111 133 153 172 191 212 223 222 210 177 130 80 43 20 12 10 61 60 58 64 76 93 118 132 142 146 134 117 94 80 76 75 80 95 113 138 164 190 208 217 219 200 158 103 55 27 19 16 68 68 67 72 79 97 120 131 132 124 108 92 70 59 62 68 75 83 97 114 143 172 198 219 232 218 174 115 62 33 22 17 70 70 71 75 82 93 113 130 130 115 92 70 55 52 57 60 64 72 83 96 124 157 186 212 228 220 182 123 71 37 23 20 62 62 66 76 86 97 118 134 129 111 89 65 50 52 53 56 61 70 75 83 111 147 184 217 233 223 181 123 73 38 26 21 53 52 56 69 92 114 135 150 152 130 98 64 49 49 54 56 61 65 67 81 111 148 183 217 233 225 182 123 67 37 28 22 44 47 55 72 94 126 164 189 181 147 96 58 45 43 51 59 69 82 101 109 124 146 183 220 239 219 167 107 54 28 17 17 45 50 55 69 89 121 168 204 196 158 106 62 49 49 56 63 71 82 98 113 135 161 196 225 234 206 151 93 45 24 14 15 53 56 54 61 81 113 162 206 211 187 143 100 79 69 67 78 88 96 108 137 172 202 220 224 209 167 111 60 27 18 14 14 61 55 51 52 70 96 141 182 196 191 166 136 109 86 78 87 100 113 135 169 205 228 232 214 182 135 85 42 23 18 19 20 62 56 50 47 57 84 129 167 193 203 183 164 143 123 108 111 128 150 172 203 228 242 228 190 140 97 58 28 17 15 18 22 54 54 56 60 61 78 104 142 174 198 198 193 183 169 157 160 184 208 225 239 241 232 204 155 107 74 46 24 19 17 19 25 51 51 49 55 63 69 80 101 132 169 195 204 207 208 215 228 235 232 228 223 214 196 165 117 76 51 37 24 21 23 28 29 44 51 56 62 73 78 80 99 130 158 186 205 216 224 226 229 227 225 213 194 172 148 117 84 57 42 29 21 19 25 26 25 47 48 54 60 76 82 82 89 108 126 146 169 186 197 200 196 190 184 174 152 131 108 88 67 49 36 27 20 20 26 31 36 57 55 53 55 67 72 74 76 83 87 94 111 130 138 140 143 141 136 123 105 88 73 61 51 36 26 25 24 27 33 42 45 67 60 57 53 46 52 62 60 50 48 53 69 81 81 78 92 99 96 85 69 56 44 35 26 17 20 24 31 39 42 44 42 64 58 59 53 43 44 48 46 34 31 36 52 65 65 63 73 81 81 74 63 53 43 29 20 16 20 26 35 40 43 46 46 60 55 55 51 42 39 41 43 34 24 20 31 49 60 59 63 62 67 68 59 50 40 28 24 25 29 34 38 42 49 50 45 56 49 45 42 41 38 37 40 34 23 15 24 43 58 58 54 49 57 60 53 43 37 34 37 37 38 38 42 44 45 44 36 53 45 42 48 45 37 33 38 38 32 24 29 40 50 47 37 32 42 50 48 39 36 36 43 44 44 40 41 41 39 31 23 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 35 43 49 52 56 55 53 54 63 77 93 112 137 161 179 187 189 187 185 175 159 138 114 88 59 38 26 18 17 16 17 14 42 48 56 59 58 56 58 68 83 99 124 156 183 200 209 214 217 213 205 195 186 174 161 138 103 66 41 24 16 12 14 13 44 51 56 58 56 53 58 74 91 111 139 172 195 201 209 212 210 205 206 201 198 192 182 162 126 87 55 34 21 16 15 14 49 51 49 51 55 58 66 82 104 126 151 174 189 184 185 188 186 184 190 198 208 212 208 188 156 121 83 52 30 18 15 13 45 43 41 46 53 60 65 80 102 123 136 141 141 135 129 132 139 147 159 179 199 213 221 214 193 156 110 70 40 20 13 12 43 40 39 45 51 57 64 73 91 106 114 114 111 107 102 107 117 130 145 167 186 202 216 217 199 164 118 76 43 20 15 14 49 47 47 51 60 73 79 80 87 96 96 90 85 82 80 81 89 105 124 146 165 186 207 217 206 176 134 88 47 23 15 11 54 59 61 63 72 89 87 69 54 53 57 56 60 61 62 66 73 87 102 118 138 166 200 222 223 194 148 101 59 37 23 11 58 68 69 69 76 90 87 66 50 48 47 50 52 53 54 56 62 71 84 101 123 155 193 223 231 204 157 105 62 39 26 14 58 70 74 73 73 76 83 80 65 53 46 46 49 52 56 60 55 51 64 92 125 155 184 213 226 208 163 107 60 31 20 20 55 54 62 72 79 86 96 96 86 71 55 47 49 57 61 59 53 44 56 82 121 160 190 211 219 208 165 110 62 34 27 26 49 49 60 67 74 91 116 129 125 98 62 48 52 64 64 52 50 53 60 82 118 159 194 223 228 208 160 99 55 32 20 18 49 45 46 54 68 90 119 139 140 110 78 61 58 60 58 54 62 66 76 94 133 172 209 231 230 203 148 93 53 30 16 14 48 46 44 49 64 88 125 160 167 144 111 81 63 59 60 55 58 68 90 122 165 202 229 240 226 186 129 80 47 27 18 15 61 55 48 51 57 72 107 148 176 183 159 125 97 80 75 81 84 92 116 153 191 214 225 220 192 147 96 61 39 27 18 15 56 48 45 45 52 64 88 122 160 184 177 158 131 105 96 102 105 114 137 174 207 226 225 204 168 120 78 50 35 29 20 14 50 44 44 46 56 69 77 94 125 168 192 195 182 163 153 159 162 166 182 206 224 227 206 166 121 79 50 35 29 28 23 18 53 52 53 55 59 59 59 62 95 147 190 206 204 200 199 208 208 202 210 215 215 205 171 125 81 50 36 33 33 26 22 19 53 49 53 61 60 54 58 67 92 135 175 201 213 216 223 232 229 220 214 202 185 166 132 93 58 38 30 31 34 28 22 17 48 56 60 65 65 58 60 70 89 115 147 180 199 210 213 207 202 196 185 168 148 128 97 70 53 42 34 29 33 29 25 22 48 56 62 58 47 44 40 49 57 68 86 108 131 141 143 143 139 136 131 122 111 91 69 53 42 33 29 28 32 33 31 30 49 53 54 49 44 43 40 37 40 42 52 69 85 93 97 100 99 98 93 90 86 74 58 43 33 27 26 32 38 45 41 34 49 51 50 43 41 44 33 21 20 26 35 46 53 63 66 67 66 70 69 67 65 56 47 39 32 32 33 40 46 47 42 38 58 59 47 34 31 35 29 22 16 20 27 41 51 56 58 61 62 61 57 58 56 46 39 41 39 39 39 39 40 43 41 35 62 57 43 28 25 31 34 25 13 11 18 36 49 53 54 58 55 53 55 55 51 45 40 40 38 42 40 36 36 38 33 26 55 54 49 41 33 32 34 32 21 16 23 43 48 47 48 49 47 46 47 48 48 48 45 43 40 40 41 38 36 34 26 18 mayavi-4.5.0/examples/mayavi/data/heart.vtk0000644000076500000240000022125412747716313021301 0ustar prabhustaff00000000000000# vtk DataFile Version 2.0 CT scan data of human heart, courtesy by Henk Mastenbroek RuG ASCII DATASET STRUCTURED_POINTS DIMENSIONS 32 32 12 ORIGIN 0.000 0.000 0.000 SPACING 1.000 1.000 4.000 POINT_DATA 12288 SCALARS scalars float LOOKUP_TABLE default 16 15 16 18 14 10 12 17 17 14 11 11 8 8 12 14 12 13 20 24 23 20 16 16 15 16 17 22 24 24 26 30 18 13 15 16 14 6 10 18 18 14 10 6 6 9 13 13 10 10 17 20 19 18 20 21 19 20 24 26 24 24 27 31 15 10 11 13 10 7 8 14 16 11 6 3 6 11 15 15 12 9 12 13 16 14 20 27 27 27 27 26 20 20 26 31 12 13 12 10 7 8 11 13 11 7 6 6 6 8 8 10 13 13 11 12 14 18 23 29 33 32 30 29 24 19 19 23 9 10 9 9 10 9 10 7 4 4 4 4 5 5 3 5 9 14 14 13 16 24 32 37 38 35 33 31 23 15 15 20 7 6 7 7 11 12 7 3 3 6 7 6 4 3 3 5 8 11 13 13 18 25 32 36 39 41 37 28 19 12 10 14 5 4 6 7 9 7 6 5 5 7 9 8 8 7 5 4 6 11 15 22 24 29 33 34 38 39 34 27 21 16 14 18 7 6 6 8 9 7 7 12 12 8 6 11 12 7 3 5 14 15 19 24 29 31 34 32 32 32 30 26 21 18 18 23 15 10 2 2 6 7 6 8 11 10 11 13 11 5 5 13 20 22 23 28 29 22 21 24 24 29 30 23 16 20 28 35 12 10 7 8 11 10 9 9 12 15 15 13 8 6 11 19 27 28 31 27 21 19 22 19 18 22 23 19 17 23 29 26 10 8 9 10 10 11 12 14 19 23 22 16 9 11 20 28 30 28 28 28 26 23 19 15 15 17 17 13 14 20 22 22 12 8 9 7 6 10 14 17 21 26 26 20 15 19 29 37 36 33 32 31 29 23 17 15 17 19 17 13 17 22 26 27 13 9 6 5 10 13 13 15 21 29 36 35 30 32 37 44 43 41 40 34 27 22 22 25 27 26 22 22 28 31 36 35 14 8 5 9 12 12 7 11 27 42 49 55 52 46 47 56 66 62 51 39 30 25 25 29 32 31 29 27 30 35 35 32 13 10 6 7 11 13 11 14 33 52 63 70 71 67 71 79 89 78 60 45 32 31 31 32 31 33 31 29 32 35 32 27 11 13 13 5 7 14 14 17 26 44 58 71 73 72 72 76 83 68 49 38 35 36 34 32 30 33 38 39 36 31 22 20 11 6 4 7 6 11 25 29 37 54 76 99 115 112 105 102 96 87 78 57 43 41 41 39 38 38 28 27 29 33 22 13 10 4 5 13 14 14 22 33 47 64 80 92 103 107 106 99 95 91 80 61 46 41 38 36 30 24 17 19 26 30 23 14 7 4 6 10 13 16 21 29 48 62 73 90 103 107 99 93 90 83 71 54 41 36 31 26 24 27 23 20 20 21 18 11 6 5 7 8 12 17 23 28 41 51 63 86 103 103 89 85 83 76 63 46 36 34 32 28 29 36 27 20 20 16 11 9 7 6 8 12 15 21 24 25 31 39 50 65 78 82 75 73 66 55 49 43 37 34 31 31 31 34 29 24 21 19 21 24 6 7 12 15 20 25 27 24 30 41 48 47 53 60 60 54 49 45 49 49 43 31 28 35 43 34 24 15 12 26 39 33 7 5 10 16 22 25 31 31 33 39 46 45 47 54 56 48 41 40 45 49 50 42 35 39 48 39 26 18 20 29 35 28 21 14 9 8 16 24 31 33 33 37 38 38 43 41 42 39 34 36 46 57 55 49 49 51 51 40 27 30 36 34 31 28 20 16 13 12 17 23 34 38 36 40 35 37 43 40 41 43 41 41 48 55 52 51 55 54 47 39 35 41 44 37 32 29 20 18 17 19 19 22 33 37 33 35 36 40 44 43 42 47 47 40 41 46 46 49 56 53 44 39 47 47 43 39 37 33 21 25 28 30 29 34 43 41 31 34 39 43 44 45 44 49 52 51 51 49 51 52 52 49 38 29 34 42 47 38 33 27 25 29 34 34 34 38 45 42 32 35 42 46 46 47 46 50 52 50 50 46 52 53 51 44 38 27 34 43 47 37 33 27 42 43 40 38 35 32 34 35 32 35 44 55 57 54 47 48 51 46 37 35 43 45 44 45 42 38 44 47 49 44 40 33 44 45 39 34 36 37 31 29 34 39 42 49 54 48 38 40 42 46 49 51 45 35 36 45 54 51 45 44 40 39 36 28 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 10 12 12 13 11 8 7 6 5 6 8 10 9 9 6 7 6 12 18 19 14 11 11 17 22 23 27 35 34 31 26 23 11 11 11 12 10 4 3 8 11 6 5 6 7 4 3 5 7 12 15 11 11 16 18 21 24 24 29 28 29 29 31 31 12 9 9 7 6 2 6 8 10 6 3 4 7 6 4 6 8 11 9 7 10 18 24 25 27 28 29 26 26 30 34 36 14 8 7 6 4 3 7 9 7 6 3 3 6 7 6 6 7 6 5 7 11 21 31 33 34 33 32 24 22 31 40 38 10 6 5 5 5 4 7 7 3 5 2 3 7 6 4 4 4 5 9 11 13 22 31 36 36 36 30 22 21 33 40 36 5 4 5 7 10 9 7 6 1 1 4 5 5 2 2 6 7 9 14 19 18 25 33 34 37 36 28 22 15 20 25 25 5 3 3 5 11 11 8 4 3 4 8 5 2 3 3 6 9 14 21 23 24 27 31 33 36 34 28 21 16 17 18 23 6 4 4 5 9 7 7 8 5 4 8 10 9 9 7 7 14 26 32 34 27 24 26 28 28 28 25 20 18 19 23 29 9 7 3 5 10 11 11 12 12 11 17 23 17 15 22 27 28 34 37 33 27 23 22 20 26 25 18 9 12 17 19 25 12 13 8 9 11 12 11 10 12 17 30 35 32 31 41 46 45 47 40 26 15 14 15 16 24 25 16 7 13 21 20 18 10 7 5 11 16 16 11 13 26 36 45 48 51 57 69 75 71 62 43 26 22 21 15 10 13 17 15 12 15 20 21 25 15 10 10 16 16 14 16 27 45 58 69 73 75 82 94 98 92 81 66 47 32 21 20 16 10 10 8 8 12 18 24 31 13 10 12 13 14 20 26 37 55 78 90 94 99 109 118 121 112 98 85 66 45 30 20 18 17 15 13 14 18 22 23 22 10 8 10 11 17 22 28 40 64 92 108 116 119 131 140 141 132 115 98 80 57 40 31 26 21 20 20 22 28 30 27 19 11 9 4 8 17 25 41 65 89 109 126 138 141 151 163 166 161 149 124 96 72 53 39 31 28 24 27 31 35 25 19 16 11 8 5 6 13 24 42 68 93 112 129 143 147 151 157 159 159 152 131 105 78 57 42 34 35 29 28 28 29 22 16 15 12 9 8 8 10 21 41 63 88 107 129 148 151 146 140 145 149 150 132 103 77 61 46 39 36 32 26 26 24 17 12 9 12 11 13 15 17 27 47 74 97 116 138 149 152 141 135 146 157 163 145 111 84 65 50 38 27 23 22 27 23 17 10 4 6 6 11 19 23 32 43 63 86 108 124 140 148 145 141 145 149 144 119 86 63 51 40 30 19 19 19 24 25 22 14 4 4 3 8 13 24 31 37 52 75 93 106 126 141 141 137 133 130 119 93 64 46 36 31 29 27 24 16 16 21 20 13 9 5 9 18 27 38 46 52 64 83 102 124 139 147 147 152 150 140 119 90 62 49 45 40 32 26 24 20 24 19 13 15 22 11 12 15 23 37 48 50 54 68 96 115 120 124 129 131 127 111 92 78 62 48 48 44 36 34 36 35 35 31 25 22 19 10 12 25 40 50 53 53 59 75 91 93 90 95 104 105 99 87 77 68 55 43 42 50 49 42 33 32 30 33 35 30 23 11 11 24 43 49 48 54 63 69 70 66 62 66 72 67 59 61 62 58 53 49 49 55 54 44 29 26 30 36 36 31 28 26 21 21 30 49 57 56 51 54 55 51 46 45 43 46 51 56 62 66 64 61 52 45 45 49 42 40 38 27 24 23 21 27 28 27 29 43 55 61 55 53 53 48 47 48 49 46 50 52 54 62 64 62 53 48 47 47 46 43 38 28 26 23 20 35 33 24 28 45 57 56 44 40 46 47 47 50 51 51 52 49 44 50 53 58 60 56 45 40 40 40 33 31 33 32 23 44 40 32 35 47 55 49 38 37 44 50 54 56 55 53 53 52 48 47 49 57 57 51 38 35 38 40 35 32 33 29 24 47 45 42 37 36 41 47 42 38 43 53 61 63 57 50 51 52 45 44 47 51 49 40 33 32 34 40 42 37 30 26 23 43 40 33 32 33 38 42 42 42 42 43 50 53 51 47 47 41 38 43 48 44 37 36 39 38 35 32 33 31 24 18 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 3 6 5 6 7 6 5 5 7 7 2 6 10 8 3 3 4 8 15 17 16 15 18 20 20 23 29 30 27 26 27 29 7 8 7 8 8 5 3 5 8 7 2 4 7 8 5 4 6 10 11 11 10 9 17 23 27 25 27 31 33 34 36 37 5 7 8 7 7 6 4 4 5 2 2 5 5 3 5 6 11 11 9 10 15 18 15 22 30 28 27 29 33 35 37 38 8 7 6 5 3 5 4 4 4 3 4 6 7 4 3 7 8 7 8 10 16 22 21 26 31 29 27 29 36 40 38 32 10 6 3 2 4 4 7 7 5 4 5 7 8 6 5 7 4 6 13 13 14 25 31 33 33 27 21 23 35 41 34 26 9 6 5 3 5 7 9 8 4 2 5 7 7 6 10 8 7 13 19 17 16 27 33 36 32 24 16 20 29 32 26 19 10 6 4 3 5 10 12 9 5 3 8 10 11 14 15 15 20 25 27 24 20 27 31 33 30 26 17 14 15 17 18 19 14 7 4 5 8 10 12 11 12 14 23 27 33 34 36 42 45 46 42 35 25 21 23 25 28 27 18 12 11 14 20 25 14 7 4 5 8 10 14 15 16 22 32 39 43 47 52 57 58 55 48 38 26 22 22 24 27 24 16 11 11 15 21 27 12 9 10 7 7 11 19 22 25 37 54 60 62 69 80 86 80 71 60 43 30 24 17 19 22 16 6 9 15 18 20 25 10 12 15 14 16 24 31 41 62 83 99 108 110 115 124 132 131 122 98 74 56 42 32 22 16 7 6 8 14 11 11 20 11 6 9 17 26 33 35 51 83 108 121 126 130 138 149 150 151 148 133 108 80 51 32 22 17 14 11 11 15 23 29 39 11 14 24 29 31 37 51 79 103 125 140 141 138 139 144 159 170 173 159 133 107 75 45 20 8 8 10 13 19 22 22 23 15 12 17 24 34 52 68 90 118 135 136 131 135 140 140 149 161 168 173 161 135 92 58 37 30 23 15 13 15 17 16 18 13 12 14 27 41 51 68 96 124 136 126 118 122 133 145 154 161 171 186 179 137 94 60 47 39 31 27 21 19 16 10 7 16 15 17 31 45 60 81 113 136 139 121 105 107 121 130 141 159 181 195 191 150 106 71 50 40 34 36 24 15 9 7 4 20 17 22 36 50 62 85 115 138 139 122 111 111 112 116 132 161 189 199 181 143 102 68 47 37 31 31 24 20 16 11 3 16 27 40 49 51 61 86 113 129 137 136 131 122 112 115 141 172 190 183 170 136 93 57 34 28 26 27 23 19 13 7 1 16 27 44 53 56 67 88 110 124 137 143 141 132 124 132 153 176 187 177 159 127 87 50 31 26 26 26 22 18 12 4 1 12 22 40 50 58 71 83 98 116 135 154 165 162 162 169 176 181 176 152 124 90 63 41 26 25 25 23 23 20 12 9 11 15 27 45 60 69 79 88 101 119 141 164 174 179 183 192 187 181 168 143 109 80 58 40 30 28 24 24 24 23 18 19 23 11 20 38 52 62 68 76 91 111 134 154 159 167 178 185 172 154 137 113 87 69 56 43 33 31 30 29 27 24 24 27 26 15 20 31 46 60 67 69 77 94 116 129 129 135 146 155 143 123 105 91 71 56 49 46 40 40 38 35 30 27 22 20 19 25 26 45 65 77 82 81 86 93 101 101 101 107 115 117 107 87 78 71 59 51 52 50 38 30 26 30 33 34 31 29 30 22 31 50 66 68 67 71 77 76 76 83 87 87 80 73 73 75 66 59 63 64 55 39 31 27 27 29 28 28 26 26 27 26 32 48 57 62 60 62 70 73 72 70 67 66 66 66 69 72 68 55 46 42 38 38 39 34 32 27 23 19 25 25 21 38 39 42 52 71 69 57 56 62 62 58 60 65 60 46 44 54 64 62 53 47 41 42 41 39 35 28 22 22 24 22 18 52 41 35 45 65 63 49 44 51 58 63 65 66 65 50 44 51 61 63 59 56 46 36 34 36 32 21 19 29 29 26 26 51 37 36 41 49 48 42 42 51 54 59 66 61 55 47 46 49 54 57 59 55 45 34 31 35 31 24 20 26 25 24 27 46 38 37 39 44 46 42 46 53 57 58 62 55 47 43 45 49 50 49 47 43 36 33 31 29 28 26 24 22 19 16 19 39 36 34 37 46 46 45 50 56 58 56 57 53 48 46 46 49 49 40 33 28 34 38 35 27 21 19 16 16 11 9 14 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 4 5 3 7 6 7 6 7 5 1 7 10 6 1 3 7 13 18 17 16 20 18 15 15 21 28 31 30 30 29 23 5 2 2 1 4 7 5 5 9 11 4 5 10 10 4 3 6 11 14 13 15 18 17 16 19 24 28 30 30 29 28 22 3 5 8 8 6 4 3 6 7 7 7 7 6 7 5 5 7 5 5 7 12 18 24 24 24 24 31 35 37 37 30 21 4 5 6 5 6 3 3 4 4 8 9 6 6 7 6 6 11 11 8 9 13 17 22 27 29 28 31 33 32 30 27 19 7 7 7 7 5 4 5 4 5 7 10 11 11 10 11 11 14 14 16 18 20 23 26 28 29 27 32 35 29 21 20 19 10 8 7 7 6 8 9 9 9 9 10 12 18 21 25 27 23 22 27 26 29 36 32 28 21 24 30 32 26 14 9 9 10 10 9 8 7 11 14 14 15 16 16 23 34 42 46 46 43 40 38 33 31 36 34 29 22 20 21 19 15 10 8 12 9 6 10 13 13 19 24 26 29 33 41 55 74 80 77 81 82 71 61 48 40 36 36 31 22 18 12 9 9 12 18 24 11 7 10 17 20 22 28 36 47 57 69 87 107 119 115 115 114 105 91 70 54 46 38 32 23 17 11 9 9 14 20 25 12 12 11 17 21 22 33 50 69 89 102 113 126 140 142 142 142 135 120 96 75 59 44 29 21 15 10 11 12 14 19 21 16 17 21 24 29 40 59 83 106 129 134 131 134 143 150 157 162 165 163 146 113 82 52 29 17 14 9 9 9 12 21 32 18 18 24 29 37 51 74 99 124 143 141 135 132 141 149 156 169 180 183 172 137 101 64 33 20 15 10 10 11 16 25 35 15 12 19 33 41 57 83 107 127 137 132 125 120 129 139 150 171 189 189 174 145 115 79 41 21 14 12 15 20 26 32 36 21 30 45 54 61 80 109 132 139 125 104 94 96 96 106 130 156 174 184 192 188 161 115 62 29 20 15 9 7 12 20 26 25 33 47 59 77 100 116 132 144 130 102 86 90 93 93 109 134 162 193 212 205 169 126 85 53 31 18 14 16 16 15 12 38 47 55 68 84 106 129 141 133 117 91 72 74 84 96 113 134 165 196 209 197 175 141 100 58 38 29 20 13 13 11 7 41 46 58 75 91 109 129 145 141 121 97 78 70 78 94 112 135 167 201 214 201 173 133 92 56 29 18 13 13 13 7 3 43 52 63 83 100 108 124 141 140 127 109 96 93 97 108 126 147 172 197 206 192 156 109 66 37 24 20 18 12 7 3 1 44 58 72 88 101 112 130 143 144 142 135 124 118 121 132 145 161 183 202 207 182 143 98 59 38 25 22 16 11 5 3 2 45 58 72 83 97 110 127 137 149 165 173 165 158 158 170 182 192 201 204 186 145 105 73 51 40 31 24 21 15 7 6 9 45 53 65 77 91 105 114 127 143 168 189 197 196 201 210 213 205 190 169 139 102 70 46 37 34 33 33 29 19 11 18 20 46 55 68 79 89 99 111 122 136 160 186 200 206 209 213 213 197 174 146 118 88 61 42 33 32 34 37 29 20 16 23 24 44 50 67 78 83 91 102 112 123 139 158 174 187 186 183 177 158 132 104 80 64 52 43 33 26 25 33 32 31 27 27 29 52 53 64 75 82 90 98 105 114 124 135 154 163 161 151 144 126 103 79 61 53 49 45 36 26 23 31 35 38 35 33 30 45 49 62 71 77 84 88 87 95 98 101 110 119 122 111 99 85 75 61 55 49 43 35 30 28 23 27 33 36 34 32 28 33 45 63 76 76 74 77 85 84 84 91 93 86 77 75 75 73 63 58 57 53 37 29 26 30 28 25 24 24 26 28 31 41 50 59 65 58 57 69 83 80 71 71 73 72 69 71 67 55 43 37 40 49 45 34 28 29 31 24 18 17 22 23 22 40 37 47 63 67 56 58 62 56 50 55 62 64 51 46 53 58 56 50 47 45 43 39 33 26 17 15 15 16 18 18 19 40 35 32 46 50 45 48 54 60 56 56 58 54 57 59 64 63 58 47 31 29 31 35 31 23 14 18 20 18 12 12 16 40 32 31 40 44 40 38 46 53 54 58 63 60 58 57 50 49 50 47 41 39 36 32 25 17 9 9 14 13 8 11 20 44 35 33 35 40 36 37 40 45 48 49 55 55 54 53 53 48 38 29 29 33 35 35 27 13 6 6 8 7 3 6 15 44 42 36 35 40 42 43 45 40 43 55 66 57 50 47 44 42 36 29 27 29 33 34 24 12 2 2 3 2 1 4 13 1 2 4 4 4 6 6 5 5 7 9 8 8 7 6 9 9 14 12 11 10 11 11 10 14 23 26 24 26 22 19 16 3 1 1 1 2 4 7 5 9 11 11 7 6 6 7 10 9 13 13 11 10 12 15 12 15 21 22 21 25 23 19 15 4 4 4 2 2 3 6 9 10 9 10 8 8 9 6 6 6 8 8 9 15 22 21 18 21 24 27 28 27 18 14 14 3 5 9 7 4 4 7 9 9 11 10 10 10 9 7 10 10 9 6 11 19 28 28 26 26 31 29 26 24 19 14 12 7 7 11 10 6 6 9 13 16 16 13 14 20 21 19 18 20 20 20 21 27 31 34 35 35 29 18 10 13 12 12 14 12 13 11 12 9 9 16 17 20 20 21 29 37 40 43 46 46 43 39 36 35 36 40 40 36 29 19 13 11 11 9 12 15 19 19 12 11 15 18 22 27 34 42 55 71 79 81 81 75 68 62 57 50 48 47 44 37 28 18 11 7 7 7 12 16 21 27 26 24 27 31 38 48 63 79 97 114 124 123 118 110 104 100 89 74 65 56 43 32 22 11 5 5 12 16 20 13 15 27 36 38 41 51 66 83 101 120 134 142 151 150 146 148 150 147 134 110 81 59 42 29 19 9 8 11 23 25 24 20 25 37 43 46 49 63 86 106 123 137 143 146 154 154 154 159 170 173 166 140 105 73 49 32 17 9 9 12 19 24 25 28 40 46 48 55 65 84 107 124 136 136 133 133 136 139 146 160 173 185 188 176 141 98 60 33 18 9 13 16 20 20 22 36 49 54 58 69 85 107 128 134 136 126 115 114 118 121 131 150 171 194 204 198 168 118 76 45 24 13 17 22 25 27 27 44 51 56 67 79 96 118 135 134 127 113 97 96 105 112 116 136 163 186 199 198 178 134 91 59 30 20 18 26 30 31 24 54 58 67 80 87 99 122 138 135 118 95 77 75 82 92 106 122 143 167 190 204 198 161 109 61 34 22 23 27 29 27 16 61 67 77 86 92 103 124 140 138 115 84 68 64 68 80 96 112 129 159 189 206 204 178 125 75 40 22 24 28 29 24 13 46 61 77 83 96 118 138 150 140 116 83 67 66 69 80 96 116 136 165 193 200 194 169 128 84 47 26 19 20 18 9 4 66 74 81 88 100 125 150 155 138 113 87 64 56 66 83 102 114 137 163 187 201 198 171 129 84 50 26 20 21 18 8 0 74 83 86 90 106 130 152 163 154 137 111 81 63 75 91 108 135 163 184 197 207 196 161 106 55 28 23 22 16 5 3 3 75 84 85 93 111 130 146 158 160 158 148 127 118 122 128 140 161 183 201 210 206 186 137 86 49 33 26 16 5 3 5 5 73 83 87 91 103 120 143 159 170 178 178 168 155 153 159 176 194 212 220 209 188 163 117 71 40 29 27 18 7 5 6 9 67 72 76 85 93 105 124 149 176 196 209 208 198 192 199 211 215 217 206 182 151 120 88 59 36 27 23 16 11 11 17 18 67 70 77 84 86 93 102 120 151 186 216 227 228 227 223 221 204 181 158 130 98 76 60 56 50 38 23 12 19 28 33 26 68 72 79 81 85 94 104 113 131 160 195 213 215 212 210 203 183 156 129 103 79 62 53 50 45 39 30 23 27 32 31 24 64 70 77 79 86 95 106 110 116 129 149 169 175 172 164 151 128 104 83 63 51 44 38 31 31 35 43 38 35 33 33 28 63 72 79 80 86 94 103 108 113 116 126 142 149 142 130 115 95 80 69 56 43 35 29 26 28 34 44 40 33 30 33 29 56 67 77 83 84 87 95 100 103 96 94 99 103 94 88 83 71 61 56 56 46 34 26 25 24 25 29 27 24 25 27 28 56 63 66 61 56 69 80 83 79 73 70 69 67 65 64 62 50 42 43 48 43 30 25 27 32 30 21 15 13 18 21 19 56 61 63 57 50 63 74 77 73 69 65 65 64 61 61 57 45 38 42 47 41 29 24 26 31 27 19 13 10 16 18 16 45 40 52 63 58 51 57 66 62 59 57 55 53 50 51 56 55 49 44 42 41 33 25 20 15 13 13 10 7 8 10 12 43 45 52 56 52 48 51 58 58 51 49 58 65 62 52 50 48 43 40 33 31 25 15 10 10 15 12 6 3 4 6 14 37 30 30 39 40 38 47 58 58 54 59 65 62 55 50 44 38 34 28 26 33 33 19 6 3 6 9 5 3 7 14 14 49 43 33 35 42 41 36 40 46 50 52 51 46 44 44 44 45 38 29 22 23 23 17 5 0 0 2 2 5 13 18 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6 3 2 3 6 7 9 14 17 18 14 9 8 12 13 12 8 13 17 13 12 14 15 14 14 15 16 20 20 15 7 8 11 5 2 3 7 9 12 15 16 18 12 11 11 12 12 12 9 15 18 14 18 21 22 16 15 17 19 19 17 12 8 10 12 10 6 5 9 13 14 16 16 14 14 14 16 19 17 17 17 23 27 23 23 27 30 28 24 20 20 15 11 10 12 15 14 15 15 13 18 20 20 20 20 18 19 22 29 34 34 32 34 39 43 34 29 32 40 40 32 19 14 13 12 12 14 15 15 18 23 22 21 22 22 24 29 29 35 46 52 59 58 62 65 64 60 54 47 45 46 40 28 12 8 9 10 8 9 13 16 23 28 23 19 25 31 34 38 47 65 82 86 88 92 101 102 96 90 84 71 62 53 43 27 13 10 10 13 7 9 14 24 38 47 45 43 50 57 59 68 90 119 134 134 140 148 154 156 159 156 141 119 95 69 44 22 7 6 11 15 12 16 22 30 44 54 57 59 63 72 86 103 124 141 147 149 154 159 161 171 185 185 173 153 124 90 58 30 12 8 14 24 25 23 25 45 56 66 66 68 78 96 119 141 153 151 140 136 140 144 155 173 188 197 201 186 155 116 79 44 23 19 27 30 29 21 18 55 65 70 70 72 88 113 134 148 151 142 127 118 119 123 134 156 183 205 214 200 172 136 96 58 33 28 30 31 30 25 19 64 69 72 73 80 103 131 152 156 139 124 111 101 97 101 109 134 161 193 212 215 198 166 125 87 58 41 34 30 31 30 26 71 72 72 78 89 110 138 156 150 130 112 100 93 87 91 96 114 137 166 193 208 201 182 151 116 79 50 36 32 30 23 16 75 76 76 82 101 124 143 155 151 128 103 83 75 70 75 79 91 116 151 181 199 206 201 180 137 89 52 36 34 29 17 5 81 73 72 76 89 113 141 154 147 120 86 64 62 65 69 78 91 110 131 155 183 202 198 167 114 73 52 45 41 27 13 4 74 71 71 78 90 116 147 158 145 117 87 67 62 67 74 83 94 110 128 153 180 200 197 169 119 77 53 41 38 23 10 4 71 70 76 81 95 122 156 170 152 123 93 74 66 72 87 100 115 130 147 166 185 198 190 162 121 77 45 30 24 13 4 1 76 73 78 79 92 123 163 188 179 145 108 83 74 79 96 114 133 149 161 177 191 195 186 156 118 78 47 28 16 6 0 1 80 86 87 86 100 127 159 188 194 174 137 107 96 102 118 142 169 176 180 198 211 195 164 118 83 54 38 17 7 4 3 3 86 91 89 91 101 120 145 171 185 187 172 152 139 139 150 171 191 198 206 217 213 180 138 91 67 49 34 14 9 8 7 2 77 81 79 73 75 94 131 163 189 206 215 210 197 195 208 224 224 221 225 223 201 162 112 72 53 45 32 17 9 9 9 7 73 75 74 67 58 71 99 141 180 211 228 232 226 222 225 226 222 211 199 181 153 122 83 55 37 32 28 23 24 25 20 14 75 73 75 72 66 71 89 122 162 192 210 220 218 215 212 207 195 177 157 137 113 91 70 52 35 26 27 34 40 33 24 16 76 78 79 83 90 93 97 110 139 163 181 189 186 178 170 160 143 125 112 98 79 59 46 41 36 31 32 37 39 33 26 21 73 80 84 95 113 116 110 106 116 133 150 149 133 121 113 104 91 82 73 60 45 31 27 32 43 41 37 31 31 32 31 30 70 81 88 100 117 118 111 108 112 120 127 121 104 90 86 84 76 68 57 45 32 25 25 30 36 33 33 29 29 29 27 27 62 78 87 93 96 95 95 93 96 92 89 85 73 58 58 64 61 52 42 39 29 19 18 19 15 16 19 22 26 27 26 28 64 74 78 82 85 87 82 81 86 89 82 74 62 49 51 52 47 40 36 34 25 22 20 15 12 11 13 17 21 22 21 24 63 64 67 69 71 74 71 70 76 81 76 70 59 53 51 45 36 36 34 31 28 26 20 10 9 7 6 7 11 13 14 19 44 46 55 59 54 53 62 66 66 58 57 58 52 49 48 46 39 38 36 30 25 18 16 16 16 12 5 7 12 15 12 12 41 39 47 53 50 53 65 67 61 54 58 58 46 43 45 44 35 32 34 28 23 17 16 21 20 14 6 9 17 19 12 10 42 28 31 44 49 48 56 64 61 62 65 63 50 42 42 38 29 24 27 33 29 16 3 4 6 8 9 12 14 19 18 16 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 9 10 9 12 18 22 25 31 27 22 17 20 19 14 8 13 18 24 31 25 18 19 20 20 18 18 18 17 9 4 5 14 19 19 19 22 29 32 35 34 28 24 24 24 20 19 22 30 34 35 37 33 31 26 24 24 25 18 12 10 8 8 11 13 20 25 33 42 48 51 45 39 35 35 38 39 48 58 63 65 67 68 60 52 53 52 44 33 21 11 8 6 10 10 12 9 24 35 46 55 60 62 57 52 49 52 60 65 80 94 100 101 101 99 90 80 74 66 54 33 16 7 7 4 8 10 14 13 33 46 59 62 64 68 68 68 74 84 101 110 119 132 146 150 149 145 137 123 101 81 61 36 18 10 8 7 7 11 16 19 45 58 67 71 73 79 88 96 111 138 154 154 152 156 171 184 192 199 198 182 156 122 88 55 32 18 14 16 19 19 24 24 50 61 68 73 74 83 96 106 125 150 160 159 154 158 171 186 198 207 208 193 170 138 101 65 40 24 18 20 21 21 24 24 59 65 67 69 72 83 101 125 146 161 159 150 142 143 150 166 187 199 205 205 197 169 130 91 57 35 28 27 26 23 22 22 71 76 74 67 71 91 120 151 174 175 163 144 132 126 127 141 160 175 197 215 219 207 181 146 106 77 49 32 20 19 18 16 70 72 72 70 82 110 147 173 181 171 152 129 112 105 100 110 133 162 188 204 213 214 202 172 137 103 70 42 25 18 14 12 70 62 61 69 91 126 163 184 180 154 135 114 93 78 76 86 112 143 168 184 196 214 221 205 174 123 75 42 29 22 15 9 71 68 65 69 89 124 163 181 175 154 130 101 79 70 69 72 83 110 140 165 185 208 231 228 190 131 80 49 32 18 7 2 59 61 66 78 99 127 156 181 182 155 115 78 52 51 59 69 74 93 120 147 177 205 225 225 192 142 95 65 42 18 4 3 66 65 64 68 88 125 168 190 187 160 119 83 61 59 59 65 71 87 106 131 165 192 209 209 181 137 96 63 39 16 7 7 71 66 59 59 77 122 183 208 196 162 124 93 76 75 75 78 85 94 110 136 165 187 201 197 166 119 82 52 31 12 4 3 70 68 70 69 79 118 173 212 210 184 144 109 89 99 116 125 131 133 138 155 177 195 203 186 145 98 56 31 15 4 0 0 69 68 67 67 78 112 166 213 220 201 165 127 112 121 139 147 151 153 162 174 187 196 196 173 131 84 47 22 11 6 2 2 73 69 64 63 75 101 148 194 219 219 199 171 158 164 177 183 188 190 201 206 203 190 172 138 99 59 29 12 7 7 6 5 73 69 62 59 67 88 128 172 210 228 228 208 193 190 195 200 204 206 213 213 200 187 158 120 80 47 24 9 5 7 6 6 71 74 69 57 58 77 109 145 193 225 236 230 223 219 217 216 210 209 218 212 182 149 116 84 59 40 25 14 12 13 10 11 74 73 71 63 60 70 95 132 175 207 223 228 229 226 221 217 212 203 193 174 142 109 83 59 45 33 28 26 26 24 17 11 76 74 79 81 80 85 97 122 152 177 194 203 201 191 185 183 180 168 149 125 94 71 55 39 28 28 36 38 34 27 22 22 81 83 94 99 95 97 107 122 143 159 164 160 147 136 134 132 126 117 105 87 60 44 40 41 40 37 34 32 27 28 30 30 78 86 101 107 107 108 119 128 137 140 132 118 101 98 100 96 84 73 66 53 47 42 43 43 43 34 26 21 21 24 26 23 76 89 100 108 109 103 111 122 121 108 95 83 73 69 72 67 55 46 36 31 30 35 38 39 34 31 26 21 19 17 16 15 67 79 88 90 88 82 87 94 94 88 82 67 54 48 61 61 50 36 23 18 16 17 20 19 15 16 18 21 22 20 19 17 71 72 74 79 82 77 73 73 79 80 72 52 40 41 48 43 36 31 27 28 24 18 14 13 13 12 14 14 14 16 22 25 65 62 57 56 60 64 64 60 62 67 63 47 39 44 48 42 35 29 25 30 27 13 7 7 9 11 15 15 14 15 18 22 61 59 54 46 51 58 63 61 60 61 57 46 42 48 46 41 36 31 26 21 16 9 5 7 6 13 17 19 15 14 16 18 58 55 57 52 51 55 60 62 58 54 49 44 40 39 34 34 39 41 32 19 12 9 9 11 7 11 13 19 19 18 16 17 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 31 38 45 48 54 56 61 59 55 46 36 30 24 24 31 44 51 53 49 34 28 29 27 26 23 15 10 11 11 11 9 6 40 51 61 63 65 64 65 63 64 66 62 56 54 61 70 82 90 94 84 65 53 50 48 35 14 4 5 11 17 19 20 14 43 54 64 71 71 71 77 79 84 94 103 109 118 126 131 137 144 145 143 131 112 83 60 37 16 10 10 14 19 20 19 17 55 62 67 69 69 75 83 91 103 120 135 146 158 165 168 172 175 176 172 162 140 109 79 49 26 17 16 18 21 22 21 17 63 68 67 63 64 74 87 104 132 159 175 188 198 201 196 197 201 203 204 193 175 152 122 84 53 29 18 16 21 23 20 12 68 67 64 58 58 70 87 113 152 182 193 207 212 207 201 200 204 210 219 213 204 185 155 116 78 43 25 21 23 24 19 9 70 66 62 62 66 76 99 133 170 191 192 192 188 181 180 183 187 200 215 220 217 205 180 146 106 67 41 28 25 24 22 14 68 65 62 67 76 95 129 166 192 202 191 174 149 129 128 140 158 177 196 213 225 227 212 184 146 103 62 36 26 24 24 19 67 65 63 69 79 104 143 180 203 209 194 169 139 114 110 122 144 165 189 206 224 232 226 206 169 123 73 42 28 24 25 19 66 64 67 70 88 121 164 192 203 200 177 144 114 93 90 99 120 144 168 188 210 226 230 219 189 143 85 48 27 16 19 13 73 67 66 70 84 124 169 200 212 200 169 125 91 69 67 79 96 121 150 175 198 224 236 228 204 160 117 73 39 17 8 0 79 71 64 65 84 128 173 203 204 186 152 107 76 67 65 70 82 104 128 154 188 214 226 222 206 171 125 76 39 19 11 9 73 56 47 50 85 127 172 214 225 198 151 104 78 72 63 62 64 78 96 126 165 196 218 222 215 178 121 61 24 8 7 11 61 50 49 58 83 125 172 208 219 200 163 115 83 67 58 62 71 84 100 122 145 170 195 210 204 172 122 71 36 16 6 8 55 53 53 66 87 123 178 222 230 201 159 117 94 85 86 91 92 96 116 141 163 186 210 214 192 151 100 51 19 7 2 2 51 53 54 64 85 121 173 216 235 218 173 136 119 118 116 119 125 126 135 154 179 201 215 209 180 132 78 35 11 3 1 0 55 50 53 65 81 107 151 196 228 233 204 169 150 144 146 157 171 169 168 183 204 217 214 187 145 96 52 24 11 6 5 3 61 53 57 63 71 88 119 165 212 237 232 209 187 175 177 184 197 204 207 214 221 212 183 142 101 61 31 16 9 9 10 10 59 56 57 61 66 78 102 146 198 226 232 219 201 188 187 192 199 206 213 219 215 196 157 116 82 51 30 17 12 15 17 16 63 62 63 61 65 71 88 124 168 198 216 219 212 197 193 199 198 193 194 190 173 144 107 73 50 38 33 25 23 22 25 23 73 68 67 69 75 80 90 112 139 168 194 203 197 190 191 194 190 179 167 157 136 105 75 51 39 41 41 34 28 28 29 26 83 85 88 91 98 105 108 117 135 148 157 160 157 158 165 169 164 145 117 101 84 67 55 42 34 32 31 25 23 24 22 25 89 97 102 104 104 117 124 131 140 137 128 116 113 116 127 129 120 103 82 66 56 51 50 44 37 26 19 18 20 24 26 26 96 103 104 99 102 112 123 127 118 101 91 88 84 84 82 72 59 55 51 45 48 49 45 35 26 21 16 19 20 19 18 22 83 91 89 81 77 80 91 100 90 77 70 69 62 55 50 44 33 33 33 37 41 42 34 24 26 21 16 17 20 17 16 27 60 68 82 79 72 66 65 68 69 65 60 51 37 32 40 48 43 29 21 20 15 13 12 9 10 13 18 24 25 20 22 32 47 57 73 74 67 60 58 62 61 53 47 42 42 41 37 35 37 33 28 19 12 11 12 12 11 11 16 18 22 28 33 38 48 49 49 51 59 61 64 66 60 47 38 41 46 49 36 24 19 18 23 19 12 5 3 7 11 12 12 13 16 20 30 42 51 51 47 44 52 56 60 61 52 42 38 43 40 38 35 34 30 22 14 18 20 18 7 5 6 9 8 7 7 10 17 30 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 46 52 60 61 55 56 57 61 62 60 51 43 39 38 41 45 52 57 48 42 42 43 32 20 16 19 19 17 8 6 5 7 53 60 65 66 57 50 50 58 71 76 75 74 78 84 90 95 96 92 80 77 78 67 49 28 14 11 16 18 13 8 8 5 58 68 70 61 55 56 56 63 81 99 114 128 135 135 141 151 160 157 144 130 117 95 66 38 23 21 27 27 23 16 11 6 62 67 67 58 53 54 64 74 92 123 156 177 186 190 198 204 210 211 200 179 153 127 96 64 43 36 36 31 26 18 10 5 64 67 64 55 51 58 70 91 120 157 196 220 231 229 224 220 223 225 221 211 194 171 138 105 75 54 41 33 29 20 11 6 63 62 56 51 49 62 83 115 159 204 233 244 238 225 214 207 206 215 230 236 232 216 190 154 113 76 54 41 32 18 10 4 68 65 59 53 56 70 96 135 182 223 246 246 229 211 194 183 185 202 226 236 238 233 215 183 143 104 74 51 37 22 11 6 72 67 63 62 65 82 116 161 203 230 240 228 202 172 150 143 155 179 208 224 236 239 231 207 174 134 98 66 43 28 15 6 68 67 66 71 79 98 137 179 215 232 233 207 172 138 115 119 137 163 193 214 230 236 234 221 198 162 120 83 49 31 15 2 71 65 67 78 94 119 157 195 222 228 210 169 126 95 87 95 113 134 163 191 210 225 233 227 209 175 131 91 55 31 14 4 80 73 70 75 95 130 174 207 229 227 194 144 99 69 66 69 79 98 129 162 191 208 216 214 207 185 147 98 51 20 9 6 83 78 70 73 94 132 179 210 229 226 186 133 89 63 58 59 62 80 109 147 176 190 199 201 205 195 161 102 51 16 7 9 75 67 61 65 87 129 182 219 226 213 171 119 77 65 61 58 61 77 103 135 160 177 193 210 217 199 151 93 50 26 13 13 60 51 50 62 94 133 182 225 242 214 160 109 83 78 64 52 57 72 90 107 125 156 194 219 225 194 140 87 50 27 12 7 53 50 54 69 97 134 179 215 228 217 175 120 80 63 62 67 80 96 106 120 137 162 185 207 218 198 144 79 32 10 7 9 52 54 62 71 89 127 177 221 240 229 192 138 97 81 85 91 96 108 131 155 172 185 207 220 210 168 108 52 11 2 0 6 52 53 56 64 77 109 152 204 242 243 206 154 127 120 126 125 127 132 150 180 203 215 217 208 184 136 78 31 6 1 0 4 49 43 52 70 82 96 124 179 228 247 222 184 158 149 154 157 160 162 187 218 237 235 213 179 138 90 47 22 13 5 4 8 44 45 53 60 66 78 107 150 196 221 217 200 185 180 183 185 193 210 231 246 239 215 180 134 88 52 30 22 20 16 7 6 47 45 50 54 61 75 99 136 174 198 208 201 197 196 200 202 208 222 232 234 215 181 142 103 70 49 33 23 20 21 19 17 62 62 64 62 67 79 99 120 139 167 193 199 201 204 203 200 199 198 197 187 161 124 95 72 60 52 39 29 26 29 27 27 73 78 78 76 82 91 105 117 128 148 174 184 188 192 188 181 172 165 159 150 129 100 80 65 54 45 34 30 28 29 27 27 86 92 93 97 106 109 113 114 111 113 131 143 147 147 147 138 120 103 96 92 85 72 57 43 33 28 23 24 27 26 26 28 94 96 92 94 100 109 111 100 84 74 75 80 82 83 82 69 60 58 56 55 54 48 36 28 26 25 19 16 14 16 22 28 94 97 89 88 92 103 104 91 73 64 64 66 68 69 66 54 46 49 51 52 51 44 32 26 27 27 21 15 12 17 23 29 88 94 85 75 76 88 86 78 68 56 47 48 49 46 48 37 27 28 40 43 41 36 24 20 23 26 23 22 20 20 28 40 64 70 68 57 59 61 60 58 59 54 45 42 38 38 42 44 37 29 24 21 18 22 17 16 22 28 26 21 24 37 51 57 56 56 60 55 50 44 45 41 36 30 32 36 40 41 38 32 31 29 24 19 18 18 18 17 14 17 23 29 37 47 54 51 50 44 45 62 64 52 42 45 40 47 43 30 19 22 28 26 23 24 24 15 8 8 12 17 14 12 8 16 28 40 49 44 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 53 52 47 46 47 46 42 42 57 71 82 87 86 88 92 94 97 103 106 98 85 62 46 42 37 24 16 15 15 6 7 8 55 58 56 47 42 39 41 46 62 85 112 127 136 143 150 154 150 146 145 142 126 99 72 51 39 33 25 18 10 6 4 4 55 62 58 49 44 46 55 68 87 112 148 177 189 198 205 207 202 194 193 176 152 126 106 80 59 47 41 29 17 9 5 4 51 57 57 55 51 51 65 89 114 140 173 206 233 252 255 239 230 226 225 209 190 176 156 133 106 78 55 33 13 5 3 2 58 62 65 61 60 66 84 109 141 181 218 241 252 248 237 224 214 220 228 230 224 217 202 177 143 105 70 40 17 8 6 7 61 66 69 71 76 86 106 137 181 221 242 248 241 224 200 183 180 201 224 236 230 230 228 210 181 143 97 56 29 14 12 8 64 71 73 76 82 91 118 158 200 231 238 233 216 184 153 138 147 176 208 224 227 233 234 223 199 165 120 72 38 19 10 6 68 73 76 81 87 102 137 179 214 228 226 208 170 125 99 96 112 140 170 196 215 230 237 230 218 192 149 93 47 21 8 5 73 76 74 83 97 114 148 184 209 214 204 181 139 98 77 82 91 108 135 161 189 211 227 231 226 205 160 102 52 20 8 8 85 78 74 86 103 126 156 190 204 196 174 139 98 72 64 68 71 82 105 134 164 185 201 212 221 210 169 113 58 21 8 7 76 76 78 87 109 133 163 194 208 188 143 92 67 58 58 55 60 74 89 114 133 141 164 192 215 215 176 118 59 29 16 11 70 69 70 79 103 136 170 200 207 184 142 91 64 58 59 57 61 70 85 109 127 140 165 195 219 218 176 118 58 30 17 12 57 56 59 74 100 145 190 223 221 188 137 94 71 64 61 58 64 73 87 105 126 146 173 201 221 211 166 109 58 29 16 12 49 49 57 76 106 147 192 222 223 184 126 87 70 65 59 60 72 81 92 105 129 151 177 205 224 208 160 102 54 26 11 10 50 46 45 62 97 134 176 212 228 212 161 101 67 61 64 73 90 99 103 118 141 165 188 214 225 198 139 75 31 9 1 2 52 46 50 60 85 129 177 216 235 231 194 137 94 82 85 90 101 114 125 148 169 189 210 220 201 155 94 41 11 2 0 4 64 64 63 63 69 93 138 188 232 248 214 165 125 108 102 100 114 138 164 192 216 230 232 210 166 109 55 20 4 3 7 14 51 49 53 62 72 82 109 155 202 225 219 194 168 149 135 136 159 191 222 242 247 236 207 160 113 70 39 18 8 5 10 18 52 52 53 60 68 73 91 130 170 200 212 206 193 183 179 188 202 221 238 241 238 222 185 133 84 52 34 24 19 16 18 24 51 55 58 63 73 80 92 114 147 179 201 209 213 213 218 222 222 223 221 214 197 171 140 100 66 40 25 16 14 16 21 24 62 67 65 64 76 91 102 109 122 150 175 190 199 205 204 195 186 180 180 165 135 108 91 75 57 33 16 11 12 13 17 24 67 74 71 71 83 93 99 98 103 125 146 161 169 176 176 163 146 138 141 134 110 85 73 62 48 27 16 14 17 16 20 28 75 80 85 89 88 87 86 80 80 90 100 106 113 120 120 111 94 85 89 90 79 64 52 43 34 23 16 18 23 25 28 34 74 78 85 86 81 75 72 68 65 66 66 69 75 86 87 82 75 74 75 73 64 52 43 35 27 20 15 19 26 30 34 38 79 73 72 78 76 68 63 61 52 41 39 40 44 53 53 50 56 64 65 60 47 37 29 24 19 15 12 17 26 35 36 39 66 64 51 53 59 62 51 49 52 46 36 27 30 39 43 40 39 41 44 46 38 28 22 23 25 24 24 32 42 50 51 44 57 56 45 43 51 55 44 38 46 50 37 23 25 40 45 45 37 34 37 41 38 28 22 25 30 31 32 41 50 58 54 44 54 46 50 53 48 43 31 21 22 31 29 27 28 43 51 49 46 41 39 33 28 23 21 20 19 26 33 39 47 53 52 47 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 47 47 43 38 38 41 44 48 58 69 84 104 122 139 149 154 157 157 150 141 126 108 91 71 43 22 11 5 5 10 13 11 47 51 47 42 45 51 55 60 70 89 118 151 180 197 202 201 204 205 199 184 165 145 127 105 75 49 27 14 5 4 7 10 52 58 55 54 61 65 72 91 111 136 165 207 245 254 242 219 215 219 219 211 207 202 194 168 134 95 58 29 12 8 9 12 55 60 56 57 65 70 78 100 121 148 178 217 249 253 239 215 211 214 216 213 214 213 207 183 146 106 65 35 16 10 12 12 61 63 60 63 70 79 94 119 148 185 218 237 239 230 215 198 191 199 212 214 220 227 225 205 173 132 85 50 25 14 11 9 59 58 57 62 71 80 93 113 149 184 209 211 196 174 154 148 156 174 185 194 208 229 233 223 199 158 110 68 37 17 7 6 56 55 53 60 67 82 99 120 147 173 181 167 143 119 104 100 111 133 153 172 191 212 223 222 210 177 130 80 43 20 12 10 61 60 58 64 76 93 118 132 142 146 134 117 94 80 76 75 80 95 113 138 164 190 208 217 219 200 158 103 55 27 19 16 68 68 67 72 79 97 120 131 132 124 108 92 70 59 62 68 75 83 97 114 143 172 198 219 232 218 174 115 62 33 22 17 70 70 71 75 82 93 113 130 130 115 92 70 55 52 57 60 64 72 83 96 124 157 186 212 228 220 182 123 71 37 23 20 62 62 66 76 86 97 118 134 129 111 89 65 50 52 53 56 61 70 75 83 111 147 184 217 233 223 181 123 73 38 26 21 53 52 56 69 92 114 135 150 152 130 98 64 49 49 54 56 61 65 67 81 111 148 183 217 233 225 182 123 67 37 28 22 44 47 55 72 94 126 164 189 181 147 96 58 45 43 51 59 69 82 101 109 124 146 183 220 239 219 167 107 54 28 17 17 45 50 55 69 89 121 168 204 196 158 106 62 49 49 56 63 71 82 98 113 135 161 196 225 234 206 151 93 45 24 14 15 53 56 54 61 81 113 162 206 211 187 143 100 79 69 67 78 88 96 108 137 172 202 220 224 209 167 111 60 27 18 14 14 61 55 51 52 70 96 141 182 196 191 166 136 109 86 78 87 100 113 135 169 205 228 232 214 182 135 85 42 23 18 19 20 62 56 50 47 57 84 129 167 193 203 183 164 143 123 108 111 128 150 172 203 228 242 228 190 140 97 58 28 17 15 18 22 54 54 56 60 61 78 104 142 174 198 198 193 183 169 157 160 184 208 225 239 241 232 204 155 107 74 46 24 19 17 19 25 51 51 49 55 63 69 80 101 132 169 195 204 207 208 215 228 235 232 228 223 214 196 165 117 76 51 37 24 21 23 28 29 44 51 56 62 73 78 80 99 130 158 186 205 216 224 226 229 227 225 213 194 172 148 117 84 57 42 29 21 19 25 26 25 47 48 54 60 76 82 82 89 108 126 146 169 186 197 200 196 190 184 174 152 131 108 88 67 49 36 27 20 20 26 31 36 57 55 53 55 67 72 74 76 83 87 94 111 130 138 140 143 141 136 123 105 88 73 61 51 36 26 25 24 27 33 42 45 67 60 57 53 46 52 62 60 50 48 53 69 81 81 78 92 99 96 85 69 56 44 35 26 17 20 24 31 39 42 44 42 64 58 59 53 43 44 48 46 34 31 36 52 65 65 63 73 81 81 74 63 53 43 29 20 16 20 26 35 40 43 46 46 60 55 55 51 42 39 41 43 34 24 20 31 49 60 59 63 62 67 68 59 50 40 28 24 25 29 34 38 42 49 50 45 56 49 45 42 41 38 37 40 34 23 15 24 43 58 58 54 49 57 60 53 43 37 34 37 37 38 38 42 44 45 44 36 53 45 42 48 45 37 33 38 38 32 24 29 40 50 47 37 32 42 50 48 39 36 36 43 44 44 40 41 41 39 31 23 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 35 43 49 52 56 55 53 54 63 77 93 112 137 161 179 187 189 187 185 175 159 138 114 88 59 38 26 18 17 16 17 14 42 48 56 59 58 56 58 68 83 99 124 156 183 200 209 214 217 213 205 195 186 174 161 138 103 66 41 24 16 12 14 13 44 51 56 58 56 53 58 74 91 111 139 172 195 201 209 212 210 205 206 201 198 192 182 162 126 87 55 34 21 16 15 14 49 51 49 51 55 58 66 82 104 126 151 174 189 184 185 188 186 184 190 198 208 212 208 188 156 121 83 52 30 18 15 13 45 43 41 46 53 60 65 80 102 123 136 141 141 135 129 132 139 147 159 179 199 213 221 214 193 156 110 70 40 20 13 12 43 40 39 45 51 57 64 73 91 106 114 114 111 107 102 107 117 130 145 167 186 202 216 217 199 164 118 76 43 20 15 14 49 47 47 51 60 73 79 80 87 96 96 90 85 82 80 81 89 105 124 146 165 186 207 217 206 176 134 88 47 23 15 11 54 59 61 63 72 89 87 69 54 53 57 56 60 61 62 66 73 87 102 118 138 166 200 222 223 194 148 101 59 37 23 11 58 68 69 69 76 90 87 66 50 48 47 50 52 53 54 56 62 71 84 101 123 155 193 223 231 204 157 105 62 39 26 14 58 70 74 73 73 76 83 80 65 53 46 46 49 52 56 60 55 51 64 92 125 155 184 213 226 208 163 107 60 31 20 20 55 54 62 72 79 86 96 96 86 71 55 47 49 57 61 59 53 44 56 82 121 160 190 211 219 208 165 110 62 34 27 26 49 49 60 67 74 91 116 129 125 98 62 48 52 64 64 52 50 53 60 82 118 159 194 223 228 208 160 99 55 32 20 18 49 45 46 54 68 90 119 139 140 110 78 61 58 60 58 54 62 66 76 94 133 172 209 231 230 203 148 93 53 30 16 14 48 46 44 49 64 88 125 160 167 144 111 81 63 59 60 55 58 68 90 122 165 202 229 240 226 186 129 80 47 27 18 15 61 55 48 51 57 72 107 148 176 183 159 125 97 80 75 81 84 92 116 153 191 214 225 220 192 147 96 61 39 27 18 15 56 48 45 45 52 64 88 122 160 184 177 158 131 105 96 102 105 114 137 174 207 226 225 204 168 120 78 50 35 29 20 14 50 44 44 46 56 69 77 94 125 168 192 195 182 163 153 159 162 166 182 206 224 227 206 166 121 79 50 35 29 28 23 18 53 52 53 55 59 59 59 62 95 147 190 206 204 200 199 208 208 202 210 215 215 205 171 125 81 50 36 33 33 26 22 19 53 49 53 61 60 54 58 67 92 135 175 201 213 216 223 232 229 220 214 202 185 166 132 93 58 38 30 31 34 28 22 17 48 56 60 65 65 58 60 70 89 115 147 180 199 210 213 207 202 196 185 168 148 128 97 70 53 42 34 29 33 29 25 22 48 56 62 58 47 44 40 49 57 68 86 108 131 141 143 143 139 136 131 122 111 91 69 53 42 33 29 28 32 33 31 30 49 53 54 49 44 43 40 37 40 42 52 69 85 93 97 100 99 98 93 90 86 74 58 43 33 27 26 32 38 45 41 34 49 51 50 43 41 44 33 21 20 26 35 46 53 63 66 67 66 70 69 67 65 56 47 39 32 32 33 40 46 47 42 38 58 59 47 34 31 35 29 22 16 20 27 41 51 56 58 61 62 61 57 58 56 46 39 41 39 39 39 39 40 43 41 35 62 57 43 28 25 31 34 25 13 11 18 36 49 53 54 58 55 53 55 55 51 45 40 40 38 42 40 36 36 38 33 26 55 54 49 41 33 32 34 32 21 16 23 43 48 47 48 49 47 46 47 48 48 48 45 43 40 40 41 38 36 34 26 18 mayavi-4.5.0/examples/mayavi/data/room_vis.wrl0000644000076500000240000005026312747716313022033 0ustar prabhustaff00000000000000#VRML V2.0 utf8 Group { children [ # Light light Transform { translation 0.245131 0.396386 0.309058 children [ PointLight { on TRUE intensity 1 color 1 1 1 } ] } # Object "p:leftwall" # Object "e" # Object "i" # Object "e" # Object "o" # Object "e" # Object "e" # Object "p:rearwall" # Object "e" Shape { appearance Appearance { material Material { diffuseColor 0.270588 0.52549 0.454902 specularColor 0.5 0.5 0.5 emissiveColor 0 0 0 shininess 0.078125 transparency 0.000000 } } geometry IndexedFaceSet { solid FALSE creaseAngle 0.5 normalPerVertex TRUE coord Coordinate { point [ -0.1 0 1.19209e-007, -3.72529e-009 0 1.19209e-007, -3.72529e-009 0 2.4, -0.1 0 2.4] } coordIndex [ 0, 1, 2, 3, -1] normal Normal { vector [ 0 -1 0, 0 -1 0, 0 -1 0, 0 -1 0 ] } normalIndex [ 0, 1, 2, 3, -1] } } # Object "i" Shape { appearance Appearance { material Material { diffuseColor 0.270588 0.52549 0.454902 specularColor 0.5 0.5 0.5 emissiveColor 0 0 0 shininess 0.078125 transparency 0.000000 } } geometry IndexedFaceSet { solid FALSE creaseAngle 0.5 normalPerVertex TRUE coord Coordinate { point [ -1.00583e-007 0 1.19209e-007, -1.00583e-007 2.5 1.19209e-007, -1.00583e-007 2.5 2.4, -1.00583e-007 0 2.4] } coordIndex [ 0, 1, 2, 3, -1] normal Normal { vector [ 1 0 0, 1 0 0, 1 0 0, 1 0 0 ] } normalIndex [ 0, 1, 2, 3, -1] } } # Object "e" Shape { appearance Appearance { material Material { diffuseColor 0.270588 0.52549 0.454902 specularColor 0.5 0.5 0.5 emissiveColor 0 0 0 shininess 0.078125 transparency 0.000000 } } geometry IndexedFaceSet { solid FALSE creaseAngle 0.5 normalPerVertex TRUE coord Coordinate { point [ -0.1 2.5 2.4, -0.1 0 2.4, -3.72529e-009 0 2.4, -3.72529e-009 2.5 2.4] } coordIndex [ 0, 1, 2, 3, -1] normal Normal { vector [ 0 0 1, 0 0 1, 0 0 1, 0 0 1 ] } normalIndex [ 0, 1, 2, 3, -1] } } # Object "o" Shape { appearance Appearance { material Material { diffuseColor 0.270588 0.52549 0.454902 specularColor 0.5 0.5 0.5 emissiveColor 0 0 0 shininess 0.078125 transparency 0.000000 } } geometry IndexedFaceSet { solid FALSE creaseAngle 0.5 normalPerVertex TRUE coord Coordinate { point [ -0.1 0 2.4, -0.1 2.5 2.4, -0.1 2.5 1.19209e-007, -0.1 0 1.19209e-007] } coordIndex [ 0, 1, 2, 3, -1] normal Normal { vector [ -1 0 0, -1 0 0, -1 0 0, -1 0 0 ] } normalIndex [ 0, 1, 2, 3, -1] } } # Object "e" Shape { appearance Appearance { material Material { diffuseColor 0.270588 0.52549 0.454902 specularColor 0.5 0.5 0.5 emissiveColor 0 0 0 shininess 0.078125 transparency 0.000000 } } geometry IndexedFaceSet { solid FALSE creaseAngle 0.5 normalPerVertex TRUE coord Coordinate { point [ -0.1 0 0, -0.1 2.5 0, -3.72529e-009 2.5 0, -3.72529e-009 0 0] } coordIndex [ 0, 1, 2, 3, -1] normal Normal { vector [ 0 0 -1, 0 0 -1, 0 0 -1, 0 0 -1 ] } normalIndex [ 0, 1, 2, 3, -1] } } # Object "e" Shape { appearance Appearance { material Material { diffuseColor 0.270588 0.52549 0.454902 specularColor 0.5 0.5 0.5 emissiveColor 0 0 0 shininess 0.078125 transparency 0.000000 } } geometry IndexedFaceSet { solid FALSE creaseAngle 0.5 normalPerVertex TRUE coord Coordinate { point [ -3.72529e-009 2.5 1.19209e-007, -0.1 2.5 1.19209e-007, -0.1 2.5 2.4, -3.72529e-009 2.5 2.4] } coordIndex [ 0, 1, 2, 3, -1] normal Normal { vector [ 0 1 0, 0 1 0, 0 1 0, 0 1 0 ] } normalIndex [ 0, 1, 2, 3, -1] } } # Object "p:floor" # Object "e" Shape { appearance Appearance { material Material { diffuseColor 0.627451 0.25098 0.25098 specularColor 0.5 0.5 0.5 emissiveColor 0 0 0 shininess 0.078125 transparency 0.000000 } } geometry IndexedFaceSet { solid FALSE creaseAngle 0.5 normalPerVertex TRUE coord Coordinate { point [ -0.0999999 4.47035e-008 -0.1, -0.0999999 -0.1 -0.1, -0.0999999 -0.1 2.5, -0.0999999 4.47035e-008 2.5] } coordIndex [ 0, 1, 2, 3, -1] normal Normal { vector [ -1 0 0, -1 0 0, -1 0 0, -1 0 0 ] } normalIndex [ 0, 1, 2, 3, -1] } } # Object "o" Shape { appearance Appearance { material Material { diffuseColor 0.627451 0.25098 0.25098 specularColor 0.5 0.5 0.5 emissiveColor 0 0 0 shininess 0.078125 transparency 0.000000 } } geometry IndexedFaceSet { solid FALSE creaseAngle 0.5 normalPerVertex TRUE coord Coordinate { point [ -0.0999999 -0.1 -0.1, 6 -0.1 -0.1, 6 -0.1 2.5, -0.0999999 -0.1 2.5] } coordIndex [ 0, 1, 2, 3, -1] normal Normal { vector [ -1.46569e-008 -1 0, -1.46569e-008 -1 0, -1.46569e-008 -1 0, -1.46569e-008 -1 0 ] } normalIndex [ 0, 1, 2, 3, -1] } } # Object "e" Shape { appearance Appearance { material Material { diffuseColor 0.627451 0.25098 0.25098 specularColor 0.5 0.5 0.5 emissiveColor 0 0 0 shininess 0.078125 transparency 0.000000 } } geometry IndexedFaceSet { solid FALSE creaseAngle 0.5 normalPerVertex TRUE coord Coordinate { point [ 6 -1.00583e-007 2.5, -0.0999999 0 2.5, -0.0999999 -0.0999999 2.5, 6 -0.1 2.5] } coordIndex [ 0, 1, 2, 3, -1] normal Normal { vector [ 0 0 1, 0 0 1, 0 0 1, 0 0 1 ] } normalIndex [ 0, 1, 2, 3, -1] } } # Object "i" Shape { appearance Appearance { material Material { diffuseColor 0.627451 0.25098 0.25098 specularColor 0.5 0.5 0.5 emissiveColor 0 0 0 shininess 0.078125 transparency 0.000000 } } geometry IndexedFaceSet { solid FALSE creaseAngle 0.5 normalPerVertex TRUE coord Coordinate { point [ -0.0999999 4.84288e-008 2.5, 6 -4.84288e-008 2.5, 6 -4.84288e-008 -0.1, -0.0999999 4.84288e-008 -0.1] } coordIndex [ 0, 1, 2, 3, -1] normal Normal { vector [ 1.58783e-008 1 0, 1.58783e-008 1 0, 1.58783e-008 1 0, 1.58783e-008 1 0 ] } normalIndex [ 0, 1, 2, 3, -1] } } # Object "e" Shape { appearance Appearance { material Material { diffuseColor 0.627451 0.25098 0.25098 specularColor 0.5 0.5 0.5 emissiveColor 0 0 0 shininess 0.078125 transparency 0.000000 } } geometry IndexedFaceSet { solid FALSE creaseAngle 0.5 normalPerVertex TRUE coord Coordinate { point [ -0.0999999 0 -0.0999999, 6 -1.00583e-007 -0.0999999, 6 -0.1 -0.0999999, -0.0999999 -0.0999999 -0.0999999] } coordIndex [ 0, 1, 2, 3, -1] normal Normal { vector [ 0 0 -1, 0 0 -1, 0 0 -1, 0 0 -1 ] } normalIndex [ 0, 1, 2, 3, -1] } } # Object "e" Shape { appearance Appearance { material Material { diffuseColor 0.627451 0.25098 0.25098 specularColor 0.5 0.5 0.5 emissiveColor 0 0 0 shininess 0.078125 transparency 0.000000 } } geometry IndexedFaceSet { solid FALSE creaseAngle 0.5 normalPerVertex TRUE coord Coordinate { point [ 6 -0.1 -0.1, 6 -4.84288e-008 -0.1, 6 -4.84288e-008 2.5, 6 -0.1 2.5] } coordIndex [ 0, 1, 2, 3, -1] normal Normal { vector [ 1 0 0, 1 0 0, 1 0 0, 1 0 0 ] } normalIndex [ 0, 1, 2, 3, -1] } } # Object "p:ceiling" # Object "e" Shape { appearance Appearance { material Material { diffuseColor 0.270588 0.52549 0.454902 specularColor 0.5 0.5 0.5 emissiveColor 0 0 0 shininess 0.078125 transparency 0.000000 } } geometry IndexedFaceSet { solid FALSE creaseAngle 0.5 normalPerVertex TRUE coord Coordinate { point [ -0.0999999 2.6 -0.1, -0.0999999 2.5 -0.1, -0.0999999 2.5 2.5, -0.0999999 2.6 2.5] } coordIndex [ 0, 1, 2, 3, -1] normal Normal { vector [ -1 0 0, -1 0 0, -1 0 0, -1 0 0 ] } normalIndex [ 0, 1, 2, 3, -1] } } # Object "i" Shape { appearance Appearance { material Material { diffuseColor 0.270588 0.52549 0.454902 specularColor 0.5 0.5 0.5 emissiveColor 0 0 0 shininess 0.078125 transparency 0.000000 } } geometry IndexedFaceSet { solid FALSE creaseAngle 0.5 normalPerVertex TRUE coord Coordinate { point [ -0.0999999 2.5 -0.1, 6 2.5 -0.1, 6 2.5 2.5, -0.0999999 2.5 2.5] } coordIndex [ 0, 1, 2, 3, -1] normal Normal { vector [ 0 -1 0, 0 -1 0, 0 -1 0, 0 -1 0 ] } normalIndex [ 0, 1, 2, 3, -1] } } # Object "e" Shape { appearance Appearance { material Material { diffuseColor 0.270588 0.52549 0.454902 specularColor 0.5 0.5 0.5 emissiveColor 0 0 0 shininess 0.078125 transparency 0.000000 } } geometry IndexedFaceSet { solid FALSE creaseAngle 0.5 normalPerVertex TRUE coord Coordinate { point [ 6 2.6 2.5, -0.0999999 2.6 2.5, -0.0999999 2.5 2.5, 6 2.5 2.5] } coordIndex [ 0, 1, 2, 3, -1] normal Normal { vector [ 0 0 1, 0 0 1, 0 0 1, 0 0 1 ] } normalIndex [ 0, 1, 2, 3, -1] } } # Object "o" Shape { appearance Appearance { material Material { diffuseColor 0.270588 0.52549 0.454902 specularColor 0.5 0.5 0.5 emissiveColor 0 0 0 shininess 0.078125 transparency 0.000000 } } geometry IndexedFaceSet { solid FALSE creaseAngle 0.5 normalPerVertex TRUE coord Coordinate { point [ -0.0999999 2.6 2.5, 6 2.6 2.5, 6 2.6 -0.1, -0.0999999 2.6 -0.1] } coordIndex [ 0, 1, 2, 3, -1] normal Normal { vector [ 0 1 0, 0 1 0, 0 1 0, 0 1 0 ] } normalIndex [ 0, 1, 2, 3, -1] } } # Object "e" Shape { appearance Appearance { material Material { diffuseColor 0.270588 0.52549 0.454902 specularColor 0.5 0.5 0.5 emissiveColor 0 0 0 shininess 0.078125 transparency 0.000000 } } geometry IndexedFaceSet { solid FALSE creaseAngle 0.5 normalPerVertex TRUE coord Coordinate { point [ -0.0999999 2.6 -0.0999999, 6 2.6 -0.0999999, 6 2.5 -0.0999999, -0.0999999 2.5 -0.0999999] } coordIndex [ 0, 1, 2, 3, -1] normal Normal { vector [ 0 0 -1, 0 0 -1, 0 0 -1, 0 0 -1 ] } normalIndex [ 0, 1, 2, 3, -1] } } # Object "e" Shape { appearance Appearance { material Material { diffuseColor 0.270588 0.52549 0.454902 specularColor 0.5 0.5 0.5 emissiveColor 0 0 0 shininess 0.078125 transparency 0.000000 } } geometry IndexedFaceSet { solid FALSE creaseAngle 0.5 normalPerVertex TRUE coord Coordinate { point [ 6 2.5 -0.1, 6 2.6 -0.1, 6 2.6 2.5, 6 2.5 2.5] } coordIndex [ 0, 1, 2, 3, -1] normal Normal { vector [ 1 0 0, 1 0 0, 1 0 0, 1 0 0 ] } normalIndex [ 0, 1, 2, 3, -1] } } # Object "s:doorwall" Shape { appearance Appearance { material Material { diffuseColor 1 0.466667 0 specularColor 0.5 0.5 0.5 emissiveColor 0 0 0 shininess 0.078125 transparency 0.000000 } } geometry IndexedFaceSet { solid FALSE creaseAngle 0.5 normalPerVertex TRUE coord Coordinate { point [ 3 1.9 0, 3.1 1.9 0, 3.1 1.9 2.4, 3 1.9 2.4, 3.1 1.9 0, 3.1 2.5 0, 3.1 2.5 2.4, 3.1 1.9 2.4, 3 2.5 2.4, 3 1.9 2.4, 3.1 1.9 2.4, 3.1 2.5 2.4, 3 1.9 2.4, 3 2.5 2.4, 3 2.5 0, 3 1.9 0, 3 1.9 0, 3 2.5 0, 3.1 2.5 0, 3.1 1.9 0, 3.1 2.5 0, 3 2.5 0, 3 2.5 2.4, 3.1 2.5 2.4, 3 0 0, 3.1 0 0, 3.1 0 0.8, 3 0 0.8, 3.1 0 0, 3.1 1.9 0, 3.1 1.9 0.8, 3.1 0 0.8, 3 1.9 0.8, 3 0 0.8, 3.1 0 0.8, 3.1 1.9 0.8, 3 0 0.8, 3 1.9 0.8, 3 1.9 0, 3 0 0, 3 0 0, 3 1.9 0, 3.1 1.9 0, 3.1 0 0, 3.1 1.9 0, 3 1.9 0, 3 1.9 0.8, 3.1 1.9 0.8, 3 0 1.6, 3.1 0 1.6, 3.1 0 2.4, 3 0 2.4, 3.1 0 1.6, 3.1 1.9 1.6, 3.1 1.9 2.4, 3.1 0 2.4, 3 1.9 2.4, 3 0 2.4, 3.1 0 2.4, 3.1 1.9 2.4, 3 0 2.4, 3 1.9 2.4, 3 1.9 1.6, 3 0 1.6, 3 0 1.6, 3 1.9 1.6, 3.1 1.9 1.6, 3.1 0 1.6, 3.1 1.9 1.6, 3 1.9 1.6, 3 1.9 2.4, 3.1 1.9 2.4] } coordIndex [ 0, 1, 2, 3, -1, 4, 5, 6, 7, -1, 8, 9, 10, 11, -1, 12, 13, 14, 15, -1, 16, 17, 18, 19, -1, 20, 21, 22, 23, -1, 24, 25, 26, 27, -1, 28, 29, 30, 31, -1, 32, 33, 34, 35, -1, 36, 37, 38, 39, -1, 40, 41, 42, 43, -1, 44, 45, 46, 47, -1, 48, 49, 50, 51, -1, 52, 53, 54, 55, -1, 56, 57, 58, 59, -1, 60, 61, 62, 63, -1, 64, 65, 66, 67, -1, 68, 69, 70, 71, -1] normal Normal { vector [ 0 -1 0, 0 -1 0, 0 -1 0, 0 -1 0, 1 0 0, 1 0 0, 1 0 0, 1 0 0, 0 0 1, 0 0 1, 0 0 1, 0 0 1, -1 0 0, -1 0 0, -1 0 0, -1 0 0, 0 0 -1, 0 0 -1, 0 0 -1, 0 0 -1, 0 1 0, 0 1 0, 0 1 0, 0 1 0, 0 -1 0, 0 -1 0, 0 -1 0, 0 -1 0, 1 0 0, 1 0 0, 1 0 0, 1 0 0, 0 0 1, 0 0 1, 0 0 1, 0 0 1, -1 0 0, -1 0 0, -1 0 0, -1 0 0, 0 0 -1, 0 0 -1, 0 0 -1, 0 0 -1, 0 1 0, 0 1 0, 0 1 0, 0 1 0, 0 -1 0, 0 -1 0, 0 -1 0, 0 -1 0, 1 0 0, 1 0 0, 1 0 0, 1 0 0, 0 0 1, 0 0 1, 0 0 1, 0 0 1, -1 0 0, -1 0 0, -1 0 0, -1 0 0, 0 0 -1, 0 0 -1, 0 0 -1, 0 0 -1, 0 1 0, 0 1 0, 0 1 0, 0 1 0 ] } normalIndex [ 0, 1, 2, 3, -1, 4, 5, 6, 7, -1, 8, 9, 10, 11, -1, 12, 13, 14, 15, -1, 16, 17, 18, 19, -1, 20, 21, 22, 23, -1, 24, 25, 26, 27, -1, 28, 29, 30, 31, -1, 32, 33, 34, 35, -1, 36, 37, 38, 39, -1, 40, 41, 42, 43, -1, 44, 45, 46, 47, -1, 48, 49, 50, 51, -1, 52, 53, 54, 55, -1, 56, 57, 58, 59, -1, 60, 61, 62, 63, -1, 64, 65, 66, 67, -1, 68, 69, 70, 71, -1] } } # Object "f:pbound" # Object "p:firebox" # Object "e" Shape { appearance Appearance { material Material { diffuseColor 0.933333 0.501961 0.933333 specularColor 0.5 0.5 0.5 emissiveColor 0 0 0 shininess 0.078125 transparency 0.000000 } } geometry IndexedFaceSet { solid FALSE creaseAngle 0.5 normalPerVertex TRUE coord Coordinate { point [ 0.2 0 0.2, 0.2 0.1 0.2, 0.5 0.1 0.2, 0.5 0 0.2] } coordIndex [ 0, 1, 2, 3, -1] normal Normal { vector [ 0 0 -1, 0 0 -1, 0 0 -1, 0 0 -1 ] } normalIndex [ 0, 1, 2, 3, -1] } } # Object "e" Shape { appearance Appearance { material Material { diffuseColor 0.933333 0.501961 0.933333 specularColor 0.5 0.5 0.5 emissiveColor 0 0 0 shininess 0.078125 transparency 0.000000 } } geometry IndexedFaceSet { solid FALSE creaseAngle 0.5 normalPerVertex TRUE coord Coordinate { point [ 0.5 0.1 0.5, 0.5 0 0.5, 0.5 0 0.2, 0.5 0.1 0.2] } coordIndex [ 0, 1, 2, 3, -1] normal Normal { vector [ 1 0 0, 1 0 0, 1 0 0, 1 0 0 ] } normalIndex [ 0, 1, 2, 3, -1] } } # Object "e" Shape { appearance Appearance { material Material { diffuseColor 0.933333 0.501961 0.933333 specularColor 0.5 0.5 0.5 emissiveColor 0 0 0 shininess 0.078125 transparency 0.000000 } } geometry IndexedFaceSet { solid FALSE creaseAngle 0.5 normalPerVertex TRUE coord Coordinate { point [ 0.5 0 0.5, 0.5 0.1 0.5, 0.2 0.1 0.5, 0.2 0 0.5] } coordIndex [ 0, 1, 2, 3, -1] normal Normal { vector [ 0 0 1, 0 0 1, 0 0 1, 0 0 1 ] } normalIndex [ 0, 1, 2, 3, -1] } } # Object "e" Shape { appearance Appearance { material Material { diffuseColor 0.933333 0.501961 0.933333 specularColor 0.5 0.5 0.5 emissiveColor 0 0 0 shininess 0.078125 transparency 0.000000 } } geometry IndexedFaceSet { solid FALSE creaseAngle 0.5 normalPerVertex TRUE coord Coordinate { point [ 0.2 0 0.5, 0.2 0.1 0.5, 0.2 0.1 0.2, 0.2 0 0.2] } coordIndex [ 0, 1, 2, 3, -1] normal Normal { vector [ -1 0 0, -1 0 0, -1 0 0, -1 0 0 ] } normalIndex [ 0, 1, 2, 3, -1] } } # Object "firesrc" Shape { appearance Appearance { material Material { diffuseColor 0.933333 0.501961 0.933333 specularColor 0.5 0.5 0.5 emissiveColor 0 0 0 shininess 0.078125 transparency 0.000000 } } geometry IndexedFaceSet { solid FALSE creaseAngle 0.5 normalPerVertex TRUE coord Coordinate { point [ 0.2 0.1 0.2, 0.2 0.1 0.5, 0.5 0.1 0.5, 0.5 0.1 0.2] } coordIndex [ 0, 1, 2, 3, -1] normal Normal { vector [ 0 1 0, 0 1 0, 0 1 0, 0 1 0 ] } normalIndex [ 0, 1, 2, 3, -1] } } # Object "e" Shape { appearance Appearance { material Material { diffuseColor 0.933333 0.501961 0.933333 specularColor 0.5 0.5 0.5 emissiveColor 0 0 0 shininess 0.078125 transparency 0.000000 } } geometry IndexedFaceSet { solid FALSE creaseAngle 0.5 normalPerVertex TRUE coord Coordinate { point [ 0.2 0 0.5, 0.2 0 0.2, 0.5 0 0.2, 0.5 0 0.5] } coordIndex [ 0, 1, 2, 3, -1] normal Normal { vector [ 0 -1 0, 0 -1 0, 0 -1 0, 0 -1 0 ] } normalIndex [ 0, 1, 2, 3, -1] } } # Object "s:fireplume" Shape { appearance Appearance { material Material { diffuseColor 1 0 0 specularColor 0.5 0.5 0.5 emissiveColor 0 0 0 shininess 0.078125 transparency 0.000000 } } geometry IndexedFaceSet { solid FALSE creaseAngle 0.5 normalPerVertex TRUE coord Coordinate { point [ 0.2 0.1 0.2, 0.2 0.8 0.2, 0.5 0.8 0.2, 0.5 0.1 0.2, 0.2 0.1 0.5, 0.2 0.8 0.5, 0.5 0.8 0.5, 0.5 0.1 0.5] } coordIndex [ 0, 1, 2, 3, -1, 6, 7, 3, 2, -1, 7, 6, 5, 4, -1, 4, 5, 1, 0, -1, 1, 5, 6, 2, -1, 4, 0, 3, 7, -1] normal Normal { vector [ 0 0 -1, 0 0 -1, 0 0 -1, 0 0 -1, 1 0 0, 1 0 0, 1 0 0, 1 0 0, 0 0 1, 0 0 1, 0 0 1, 0 0 1, -1 0 0, -1 0 0, -1 0 0, -1 0 0, 0 1 0, 0 1 0, 0 1 0, 0 1 0, 0 -1 0, 0 -1 0, 0 -1 0, 0 -1 0 ] } normalIndex [ 0, 1, 2, 3, -1, 4, 5, 6, 7, -1, 8, 9, 10, 11, -1, 12, 13, 14, 15, -1, 16, 17, 18, 19, -1, 20, 21, 22, 23, -1] } } # Object "p:rightwall" # Object "e" Shape { appearance Appearance { material Material { diffuseColor 0.270588 0.52549 0.454902 specularColor 0.5 0.5 0.5 emissiveColor 0 0 0 shininess 0.078125 transparency 0.000000 } } geometry IndexedFaceSet { solid FALSE creaseAngle 0.5 normalPerVertex TRUE coord Coordinate { point [ -0.0935402 0 0, -0.0935402 0 -0.1, 6 0 -0.1, 6 0 0] } coordIndex [ 0, 1, 2, 3, -1] normal Normal { vector [ 0 -1 0, 0 -1 0, 0 -1 0, 0 -1 0 ] } normalIndex [ 0, 1, 2, 3, -1] } } # Object "o" Shape { appearance Appearance { material Material { diffuseColor 0.270588 0.52549 0.454902 specularColor 0.5 0.5 0.5 emissiveColor 0 0 0 shininess 0.078125 transparency 0.000000 } } geometry IndexedFaceSet { solid FALSE creaseAngle 0.5 normalPerVertex TRUE coord Coordinate { point [ -0.0935402 0 -0.1, -0.0935402 2.5 -0.1, 6 2.5 -0.1, 6 0 -0.1] } coordIndex [ 0, 1, 2, 3, -1] normal Normal { vector [ 0 0 -1, 0 0 -1, 0 0 -1, 0 0 -1 ] } normalIndex [ 0, 1, 2, 3, -1] } } # Object "e" Shape { appearance Appearance { material Material { diffuseColor 0.270588 0.52549 0.454902 specularColor 0.5 0.5 0.5 emissiveColor 0 0 0 shininess 0.078125 transparency 0.000000 } } geometry IndexedFaceSet { solid FALSE creaseAngle 0.5 normalPerVertex TRUE coord Coordinate { point [ 6 2.5 0, 6 0 0, 6 0 -0.1, 6 2.5 -0.1] } coordIndex [ 0, 1, 2, 3, -1] normal Normal { vector [ 1 0 0, 1 0 0, 1 0 0, 1 0 0 ] } normalIndex [ 0, 1, 2, 3, -1] } } # Object "i" Shape { appearance Appearance { material Material { diffuseColor 0.270588 0.52549 0.454902 specularColor 0.5 0.5 0.5 emissiveColor 0 0 0 shininess 0.078125 transparency 0.000000 } } geometry IndexedFaceSet { solid FALSE creaseAngle 0.5 normalPerVertex TRUE coord Coordinate { point [ 6 0 0, 6 2.5 0, -0.0935402 2.5 0, -0.0935402 0 0] } coordIndex [ 0, 1, 2, 3, -1] normal Normal { vector [ 0 0 1, 0 0 1, 0 0 1, 0 0 1 ] } normalIndex [ 0, 1, 2, 3, -1] } } # Object "e" Shape { appearance Appearance { material Material { diffuseColor 0.270588 0.52549 0.454902 specularColor 0.5 0.5 0.5 emissiveColor 0 0 0 shininess 0.078125 transparency 0.000000 } } geometry IndexedFaceSet { solid FALSE creaseAngle 0.5 normalPerVertex TRUE coord Coordinate { point [ -0.0935402 0 0, -0.0935402 2.5 0, -0.0935402 2.5 -0.1, -0.0935402 0 -0.1] } coordIndex [ 0, 1, 2, 3, -1] normal Normal { vector [ -1 0 0, -1 0 0, -1 0 0, -1 0 0 ] } normalIndex [ 0, 1, 2, 3, -1] } } # Object "e" Shape { appearance Appearance { material Material { diffuseColor 0.270588 0.52549 0.454902 specularColor 0.5 0.5 0.5 emissiveColor 0 0 0 shininess 0.078125 transparency 0.000000 } } geometry IndexedFaceSet { solid FALSE creaseAngle 0.5 normalPerVertex TRUE coord Coordinate { point [ -0.0935402 2.5 -0.1, -0.0935402 2.5 0, 6 2.5 0, 6 2.5 -0.1] } coordIndex [ 0, 1, 2, 3, -1] normal Normal { vector [ 0 1 0, 0 1 0, 0 1 0, 0 1 0 ] } normalIndex [ 0, 1, 2, 3, -1] } } ] } mayavi-4.5.0/examples/mayavi/data/tiny.q0000644000076500000240000000202012747716313020601 0ustar prabhustaff00000000000000<<?PGfff?fff?fff?fff?fff?fff?fff?fff?•?•?•?•?•?•?•?•?q=?q=?q=?q=?q=?q=?q=?q=?p}?p}?p}?p}?p}?p}?p}?p}?~@~@~@~@~@~@~@~@?PGfff?fff?fff?fff?fff?fff?fff?fff?•?•?•?•?•?•?•?•?q=?q=?q=?q=?q=?q=?q=?q=?p}?p}?p}?p}?p}?p}?p}?p}?~@~@~@~@~@~@~@~@?PGfff?fff?fff?fff?fff?fff?fff?fff?•?•?•?•?•?•?•?•?q=?q=?q=?q=?q=?q=?q=?q=?p}?p}?p}?p}?p}?p}?p}?p}?~@~@~@~@~@~@~@~@?PGfff?fff?fff?fff?fff?fff?fff?fff?•?•?•?•?•?•?•?•?q=?q=?q=?q=?q=?q=?q=?q=?p}?p}?p}?p}?p}?p}?p}?p}?~@~@~@~@~@~@~@~@?PGfff?fff?fff?fff?fff?fff?fff?fff?•?•?•?•?•?•?•?•?q=?q=?q=?q=?q=?q=?q=?q=?p}?p}?p}?p}?p}?p}?p}?p}?~@~@~@~@~@~@~@~@mayavi-4.5.0/examples/mayavi/data/tiny.xyz0000644000076500000240000000113012747716313021174 0ustar prabhustaff00000000000000<<`?@?@?@?@??@@??@@????@@@@``@@@@@@@@@@@@??@@??@@????@@@@``@@@@@@@@@@@@??@@??@@????@@@@``@@@@@@@@??@@??@@????@@@@``@@@@@@@@??@@??@@????@@@@`mayavi-4.5.0/examples/mayavi/data_interaction/0000755000076500000240000000000012747722127022041 5ustar prabhustaff00000000000000mayavi-4.5.0/examples/mayavi/data_interaction/pick_on_surface.py0000644000076500000240000000465512747716313025557 0ustar prabhustaff00000000000000""" Example showing how to pick data on a surface, going all the way back to the index in the numpy arrays. In this example, two views of the same data are shown. One with the data on a sphere, the other with the data flat. We use the 'on_mouse_pick' method of the scene to register a callback on clicking on the sphere. The callback is called with a picker object as andan argument. We use the point_id of the point that has been picked, andand go back to the 2D index on the data matrix to find its position. """ ################################################################################ # Create some data import numpy as np pi = np.pi cos = np.cos sin = np.sin phi, theta = np.mgrid[0:pi:180j,0:2*pi:180j] m0 = 4; m1 = 3; m2 = 2; m3 = 3; m4 = 1; m5 = 2; m6 = 2; m7 = 4; s = sin(m0*phi)**m1 + cos(m2*phi)**m3 + sin(m4*theta)**m5 + cos(m6*theta)**m7 x = sin(phi)*cos(theta) y = cos(phi) z = sin(phi)*sin(theta) ################################################################################ # Plot the data from mayavi import mlab # A first plot in 3D fig = mlab.figure(1) mlab.clf() mesh = mlab.mesh(x, y, z, scalars=s) cursor3d = mlab.points3d(0., 0., 0., mode='axes', color=(0, 0, 0), scale_factor=0.5) mlab.title('Click on the ball') # A second plot, flat fig2d = mlab.figure(2) mlab.clf() im = mlab.imshow(s) cursor = mlab.points3d(0, 0, 0, mode='2dthick_cross', color=(0, 0, 0), scale_factor=10) mlab.view(90, 0) ################################################################################ # Some logic to select 'mesh' and the data index when picking. def picker_callback(picker_obj): picked = picker_obj.actors if mesh.actor.actor._vtk_obj in [o._vtk_obj for o in picked]: # m.mlab_source.points is the points array underlying the vtk # dataset. GetPointId return the index in this array. x_, y_ = np.lib.index_tricks.unravel_index(picker_obj.point_id, s.shape) print("Data indices: %i, %i" % (x_, y_)) n_x, n_y = s.shape cursor.mlab_source.reset(x=x_ - n_x/2., y=y_ - n_y/2.) cursor3d.mlab_source.reset(x=x[x_, y_], y=y[x_, y_], z=z[x_, y_]) fig.on_mouse_pick(picker_callback) mlab.show() mayavi-4.5.0/examples/mayavi/data_interaction/select_red_balls.py0000644000076500000240000000636512747716313025713 0ustar prabhustaff00000000000000""" This example shows how to use a callback to select a red ball amongst white balls. The example uses the figure method 'on_mouse_pick', added in Mayavi 3.4, to register a callback when the left mouse is pressed. The callback is called with a picker, enabling to identify the object selected. Specificaly, actors are selected, each object is represented on the scene via actors. The selected actors can be found in 'picker.actors'. In this example, we have plotted red balls and white ball. We want to select the red balls, and thus test if any actor in picker.actors corresponds to an actor of red balls. To identify which ball has been selected, we use the point id. However, each ball is represented by several points. Thus we need to retrieve the number of points per ball, and divide the point id by this number. We use an outline to display which ball was selected by positioning it on the corresponding ball. """ # Author: Gael Varoquaux # Copyright (c) 2009, Enthought, Inc. # License: BSD style. import numpy as np from mayavi import mlab ################################################################################ # Disable the rendering, to get bring up the figure quicker: figure = mlab.gcf() mlab.clf() figure.scene.disable_render = True # Creates two set of points using mlab.points3d: red point and # white points x1, y1, z1 = np.random.random((3, 10)) red_glyphs = mlab.points3d(x1, y1, z1, color=(1, 0, 0), resolution=20) x2, y2, z2 = np.random.random((3, 10)) white_glyphs = mlab.points3d(x2, y2, z2, color=(0.9, 0.9, 0.9), resolution=20) # Add an outline to show the selected point and center it on the first # data point. outline = mlab.outline(line_width=3) outline.outline_mode = 'cornered' outline.bounds = (x1[0]-0.1, x1[0]+0.1, y1[0]-0.1, y1[0]+0.1, z1[0]-0.1, z1[0]+0.1) # Every object has been created, we can reenable the rendering. figure.scene.disable_render = False ################################################################################ # Here, we grab the points describing the individual glyph, to figure # out how many points are in an individual glyph. glyph_points = red_glyphs.glyph.glyph_source.glyph_source.output.points.to_array() def picker_callback(picker): """ Picker callback: this get called when on pick events. """ if picker.actor in red_glyphs.actor.actors: # Find which data point corresponds to the point picked: # we have to account for the fact that each data point is # represented by a glyph with several points point_id = picker.point_id/glyph_points.shape[0] # If the no points have been selected, we have '-1' if point_id != -1: # Retrieve the coordinnates coorresponding to that data # point x, y, z = x1[point_id], y1[point_id], z1[point_id] # Move the outline to the data point. outline.bounds = (x-0.1, x+0.1, y-0.1, y+0.1, z-0.1, z+0.1) picker = figure.on_mouse_pick(picker_callback) # Decrease the tolerance, so that we can more easily select a precise # point. picker.tolerance = 0.01 mlab.title('Click on red balls') mlab.show() mayavi-4.5.0/examples/mayavi/explorer/0000755000076500000240000000000012747722127020371 5ustar prabhustaff00000000000000mayavi-4.5.0/examples/mayavi/explorer/explorer3d.py0000644000076500000240000001001112747716313023023 0ustar prabhustaff00000000000000#!/usr/bin/env python """ The entry point for an Envisage application. """ # Standard library imports. import sys import os.path import logging # Enthought library imports. from mayavi.plugins.app import get_plugins, setup_logger from traits.api import List from envisage.api import Plugin, ServiceOffer from envisage.ui.workbench.api import WorkbenchApplication from pyface.workbench.api import Perspective, PerspectiveItem logger = logging.getLogger() ############################################################################### # `ExplorerPerspective` class. ############################################################################### class ExplorerPerspective(Perspective): """ An default perspective for the app. """ # The perspective's name. name = 'Explorer3D' # Should this perspective be enabled or not? enabled = True # Should the editor area be shown in this perspective? show_editor_area = True # View IDs. EXPLORER_VIEW = 'explorer3d.Explorer3D' # The contents of the perspective. contents = [ PerspectiveItem(id=EXPLORER_VIEW, position='left'), ] ############################################################################### # `ExplorerPlugin` class. ############################################################################### class ExplorerPlugin(Plugin): # Extension points we contribute to. PERSPECTIVES = 'envisage.ui.workbench.perspectives' VIEWS = 'envisage.ui.workbench.views' SERVICE_OFFERS = 'envisage.ui.workbench.service_offers' # The plugin's unique identifier. id = 'explorer3d.Explorer3D' # The plugin's name (suitable for displaying to the user). name = '3D function explorer' # Perspectives. perspectives = List(contributes_to=PERSPECTIVES) # Services we contribute. service_offers = List(contributes_to=SERVICE_OFFERS) # Views. views = List(contributes_to=VIEWS) ###################################################################### # Private methods. def _perspectives_default(self): """ Trait initializer. """ return [ExplorerPerspective] def _service_offers_default(self): """ Trait initializer. """ explorer_service_offer = ServiceOffer( protocol = 'explorer_app.Explorer3D', factory = 'explorer_app.Explorer3D' ) return [explorer_service_offer] def _views_default(self): """ Trait initializer. """ return [self._explorer_view_factory] def _explorer_view_factory(self, window, **traits): """ Factory method for explorer views. """ from pyface.workbench.traits_ui_view import \ TraitsUIView explorer = self._get_explorer(window) tui_engine_view = TraitsUIView(obj=explorer, id='explorer3d.Explorer3D', name='Explorer3D', window=window, position='left', **traits ) return tui_engine_view def _get_explorer(self, window): """Return the explorer service.""" return window.get_service('explorer_app.Explorer3D') ###################################################################### def main(): # Get the default mayavi plugins. plugins = get_plugins() # Inject our plugin up front so our perspective becomes the default. plugins.insert(0, ExplorerPlugin()) # Create an Envisage application. id = 'explorer3d.Explorer3D' application = WorkbenchApplication(id=id, plugins = plugins ) # This needs to be done here since the ETSConfig.application_home is # not set correctly up to this point. setup_logger(logger, 'explorer3d.log', mode=logging.ERROR) # Start the application. application.run() # Application entry point. if __name__ == '__main__': main() mayavi-4.5.0/examples/mayavi/explorer/explorer_app.py0000644000076500000240000002025012747716313023442 0ustar prabhustaff00000000000000# This code simulates something the user would like to do. In this # case the code allows a user to create a 3D cube of data (a numpy # array), specify an equation for the scalars and view it using the # mayavi plugin. The only "envisage bits" are the code that let one # grab the running mayavi instance and script it. The application # trait is set by Envisage and we use the application to get hold of # the mayavi engine. Then we show the data once the mayavi engine has # started. # Standard library imports. import numpy # Enthought library imports from traits.api import HasTraits, Button, Instance, \ Any, Str, Array from traitsui.api import Item, View, TextEditor ###################################################################### # `Explorer3D` class. ###################################################################### class Explorer3D(HasTraits): """This class basically allows you to create a 3D cube of data (a numpy array), specify an equation for the scalars and view it using the mayavi plugin. """ ######################################## # Traits. # Set by envisage when this is offered as a service offer. window = Instance('pyface.workbench.api.WorkbenchWindow') # The equation that generates the scalar field. equation = Str('sin(x*y*z)/(x*y*z)', desc='equation to evaluate (enter to set)', auto_set=False, enter_set=True) # Dimensions of the cube of data. dimensions = Array(value=(128, 128, 128), dtype=int, shape=(3,), cols=1, labels=['nx', 'ny', 'nz'], desc='the array dimensions') # The volume of interest (VOI). volume = Array(dtype=float, value=(-5,5,-5,5,-5,5), shape=(6,), cols=2, labels=['xmin','xmax','ymin','ymax','zmin','zmax'], desc='the volume of interest') # Clicking this button resets the data with the new dimensions and # VOI. update_data = Button('Update data') ######################################## # Private traits. # Our data source. _x = Array _y = Array _z = Array data = Array source = Any _ipw1 = Any _ipw2 = Any _ipw3 = Any ######################################## # Our UI view. view = View(Item('equation', editor=TextEditor(auto_set=False, enter_set=True)), Item('dimensions'), Item('volume'), Item('update_data', show_label=False), resizable=True, scrollable=True, ) ###################################################################### # `object` interface. ###################################################################### def __init__(self, **traits): super(Explorer3D, self).__init__(**traits) # Make some default data. if len(self.data) == 0: self._make_data() # Note: to show the visualization by default we must wait till # the mayavi engine has started. To do this we hook into the # mayavi engine's started event and setup our visualization. # Now, when this object is constructed (i.e. when this method # is invoked), the services are not running yet and our own # application instance has not been set. So we can't even # get hold of the mayavi instance. So, we do the hooking up # when our application instance is set by listening for # changes to our application trait. def get_mayavi(self): from mayavi.plugins.script import Script return self.window.get_service(Script) ###################################################################### # Non-public methods. ###################################################################### def _make_data(self): dims = self.dimensions.tolist() np = dims[0]*dims[1]*dims[2] xmin, xmax, ymin, ymax, zmin, zmax = self.volume x, y, z = numpy.ogrid[xmin:xmax:dims[0]*1j, ymin:ymax:dims[1]*1j, zmin:zmax:dims[2]*1j] self._x = x.astype('f') self._y = y.astype('f') self._z = z.astype('f') self._equation_changed('', self.equation) def _show_data(self): if self.source is not None: return mayavi = self.get_mayavi() if mayavi.engine.current_scene is None: mayavi.new_scene() from mayavi.sources.array_source import ArraySource vol = self.volume origin = vol[::2] spacing = (vol[1::2] - origin)/(self.dimensions -1) src = ArraySource(transpose_input_array=False, scalar_data=self.data, origin=origin, spacing=spacing) self.source = src mayavi.add_source(src) from mayavi.modules.outline import Outline from mayavi.modules.image_plane_widget import ImagePlaneWidget from mayavi.modules.axes import Axes # Visualize the data. o = Outline() mayavi.add_module(o) a = Axes() mayavi.add_module(a) self._ipw1 = ipw = ImagePlaneWidget() mayavi.add_module(ipw) ipw.module_manager.scalar_lut_manager.show_scalar_bar = True self._ipw2 = ipw_y = ImagePlaneWidget() mayavi.add_module(ipw_y) ipw_y.ipw.plane_orientation = 'y_axes' self._ipw3 = ipw_z = ImagePlaneWidget() mayavi.add_module(ipw_z) ipw_z.ipw.plane_orientation = 'z_axes' ###################################################################### # Traits static event handlers. ###################################################################### def _equation_changed(self, old, new): try: g = numpy.__dict__ s = eval(new, g, {'x':self._x, 'y':self._y, 'z':self._z}) # The copy makes the data contiguous and the transpose # makes it suitable for display via tvtk. s = s.transpose().copy() # Reshaping the array is needed since the transpose # messes up the dimensions of the data. The scalars # themselves are ravel'd and used internally by VTK so the # dimension does not matter for the scalars. s.shape = s.shape[::-1] self.data = s except: pass def _dimensions_changed(self): """This does nothing and only changes to update_data do anything. """ return def _volume_changed(self): return def _update_data_fired(self): self._make_data() src = self.source if src is not None: vol = self.volume origin = vol[::2] spacing = (vol[1::2] - origin)/(self.dimensions -1) # Set the source spacing and origin. src.set(spacing=spacing, origin=origin) # Update the sources data. src.update_image_data = True self._reset_ipw() def _reset_ipw(self): ipw1, ipw2, ipw3 = self._ipw1, self._ipw2, self._ipw3 if ipw1.running: ipw1.ipw.place_widget() if ipw2.running: ipw2.ipw.place_widget() ipw2.ipw.plane_orientation = 'y_axes' if ipw3.running: ipw3.ipw.place_widget() ipw3.ipw.plane_orientation = 'z_axes' self.source.render() def _data_changed(self, value): if self.source is None: return self.source.scalar_data = value def _window_changed(self): m = self.get_mayavi() if m.engine.running: if len(self.data) == 0: # Happens since the window may be set on __init__ at # which time the data is not created. self._make_data() self._show_data() else: # Show the data once the mayavi engine has started. m.engine.on_trait_change(self._show_data, 'started') mayavi-4.5.0/examples/mayavi/interactive/0000755000076500000240000000000012747722127021046 5ustar prabhustaff00000000000000mayavi-4.5.0/examples/mayavi/interactive/adjust_cropping_extents.py0000644000076500000240000000770612747716313026377 0ustar prabhustaff00000000000000""" A custom dialog to adjust the parameters of a GeometryFilter to crop data points. This example shows how to use a GeometryFilter to crop data points, but also how to build a custom dialog to easily set interactively parameters of a filter, or any other Mayavi object. The GeometryFilter crops all data within a bounding box specified by 'extents'. In this example, we want to be able to tweak these extents interactively. For this, we build a Traits object that has 'x_min', 'x_max', 'y_min', ... attributes. Traits enables us to represent this object as a dialog box. We use a callback called when these attributes are modified to propagate them to the filter. For more information on creating GUIs with Traits: http://docs.enthought.com/traitsui http://docs.enthought.com/traits https://support.enthought.com/hc/en-us/articles/204469620-Introductory-materials-for-Traits-and-Traits-UI """ # Author: Gael Varoquaux # Copyright (c) 2010, Enthought, Inc. # License: BSD Style. ################################################################################ # Create a set of points, with given density import numpy as np x, y, z, s = np.random.random((4, 500)) ################################################################################ # A dialog to edit a range interactively and propagate it to the filter from traits.api import HasTraits, Range, Float, Instance, \ on_trait_change from traitsui.api import View class ExtentDialog(HasTraits): """ A dialog to graphical adjust the extents of a filter. """ # Data extents data_x_min = Float data_x_max = Float data_y_min = Float data_y_max = Float data_z_min = Float data_z_max = Float x_min = Range('data_x_min', 'data_x_max', 'data_x_min') x_max = Range('data_x_min', 'data_x_max', 'data_x_max') y_min = Range('data_y_min', 'data_y_max', 'data_y_min') y_max = Range('data_y_min', 'data_y_max', 'data_y_max') z_min = Range('data_z_min', 'data_z_max', 'data_z_min') z_max = Range('data_z_min', 'data_z_max', 'data_z_max') filter = Instance(HasTraits, allow_none=False) @on_trait_change('x_min,x_max,y_min,y_max,z_min,z_max') def update_extent(self): if (self.filter is not None and self.x_min < self.x_max and self.y_min < self.y_max and self.z_min < self.z_max ): self.filter.extent = (self.x_min, self.x_max, self.y_min, self.y_max, self.z_min, self.z_max) view = View('x_min', 'x_max', 'y_min', 'y_max', 'z_min', 'z_max', title='Edit extent', resizable=True) ################################################################################ # Now build the visualization using mlab from mayavi import mlab fig = mlab.figure(1, bgcolor=(1, 1, 1)) # Create unconnected points pts = mlab.pipeline.scalar_scatter(x, y, z, s) mlab.outline(pts) # Use a geometry_filter to filter with a bounding box geometry_filter = mlab.pipeline.user_defined(pts, filter='GeometryFilter') geometry_filter.filter.extent_clipping = True # Connect our dialog to the filter extent_dialog = ExtentDialog( data_x_min=0, data_x_max=1, data_y_min=0, data_y_max=1, data_z_min=0, data_z_max=1, filter=geometry_filter.filter) # We need to use 'edit_traits' and not 'configure_traits()' as we do # not want to start the GUI event loop (the call to mlab.show()) # at the end of the script will do it. extent_dialog.edit_traits() # The geometry_filter leaves hanging points, we need to add a # CleanPolyData filter to get rid of these. clip = mlab.pipeline.user_defined(geometry_filter, filter='CleanPolyData') # Finally, visualize the remaining points with spheres using a glyph # module spheres = mlab.pipeline.glyph(clip, scale_factor=.1) mlab.show() mayavi-4.5.0/examples/mayavi/interactive/coil_design_application.py0000644000076500000240000002514312747716313026267 0ustar prabhustaff00000000000000""" An full-blown application demoing a domain-specific usecase with Mayavi: interactive design of coils. This is example of electromagnetic coils design, an application is built to enable a user to interactively position current loops while visualizing the resulting magnetic field. For this purpose, it is best to use object-oriented programming. Each current loop is written as an object (the `Loop` class), with position, radius and direction attributes, and that knows how to calculate the magnetic field it generates: its `Bnorm` is a property, that is recomputed when the loop characteristic changes. These loop objects are available to the main application class as a list. The total magnetic field created is the sum of each individual magnetic field. It can be visualized via a Mayavi scene embedded in the application class. As we use Traited objects for the current loops, a dialog enabling modification of their attributes can be generated by Traits and embedded in our application. The full power of Mayavi is available to the application. Via the pipeline tree view, the user can modify the visualization. Familiar interaction and movements are possible in the figure. So is saving the visualization, or loading data. In addition, as the visualization model, described by the pipeline, is separated from the data that is visualized, contained in the data source, any visualization module added by the user will update when coils are added or changed. Simpler examples of magnetic field visualization can be found on :ref:`example_magnetic_field_lines` and :ref:`example_magnetic_field`. The material required to understand this example is covered in section :ref:`builing_applications`. """ # Author: Gael Varoquaux # Copyright (c) 2009, Enthought, Inc. # License: BSD Style. # Major scientific library imports import numpy as np from scipy import linalg, special # Enthought library imports: from traits.api import HasTraits, Array, CFloat, List, \ Instance, on_trait_change, Property from traitsui.api import Item, View, ListEditor, \ HSplit, VSplit from mayavi.core.ui.api import EngineView, MlabSceneModel, \ SceneEditor ############################################################################## # Module-level variables # The grid of points on which we want to evaluate the field X, Y, Z = np.mgrid[-0.15:0.15:20j, -0.15:0.15:20j, -0.15:0.15:20j] # Avoid rounding issues : f = 1e4 # this gives the precision we are interested by : X = np.round(X * f) / f Y = np.round(Y * f) / f Z = np.round(Z * f) / f ############################################################################## # A current loop class class Loop(HasTraits): """ A current loop class. """ #------------------------------------------------------------------------- # Public traits #------------------------------------------------------------------------- direction = Array(float, value=(0, 0, 1), cols=3, shape=(3,), desc='directing vector of the loop', enter_set=True, auto_set=False) radius = CFloat(0.1, desc='radius of the loop', enter_set=True, auto_set=False) position = Array(float, value=(0, 0, 0), cols=3, shape=(3,), desc='position of the center of the loop', enter_set=True, auto_set=False) _plot = None Bnorm = Property(depends_on='direction,position,radius') view = View('position', 'direction', 'radius', '_') #------------------------------------------------------------------------- # Loop interface #------------------------------------------------------------------------- def base_vectors(self): """ Returns 3 orthognal base vectors, the first one colinear to the axis of the loop. """ # normalize n n = self.direction / (self.direction**2).sum(axis=-1) # choose two vectors perpendicular to n # choice is arbitrary since the coil is symetric about n if np.abs(n[0])==1 : l = np.r_[n[2], 0, -n[0]] else: l = np.r_[0, n[2], -n[1]] l /= (l**2).sum(axis=-1) m = np.cross(n, l) return n, l, m @on_trait_change('Bnorm') def redraw(self): if hasattr(self, 'app') and self.app.scene._renderer is not None: self.display() self.app.visualize_field() def display(self): """ Display the coil in the 3D view. """ n, l, m = self.base_vectors() theta = np.linspace(0, 2*np.pi, 30)[..., np.newaxis] coil = self.radius*(np.sin(theta)*l + np.cos(theta)*m) coil += self.position coil_x, coil_y, coil_z = coil.T if self._plot is None: self._plot = self.app.scene.mlab.plot3d(coil_x, coil_y, coil_z, tube_radius=0.007, color=(0, 0, 1), name='Coil') else: self._plot.mlab_source.set(x=coil_x, y=coil_y, z=coil_z) def _get_Bnorm(self): """ returns the magnetic field for the current loop calculated from eqns (1) and (2) in Phys Rev A Vol. 35, N 4, pp. 1535-1546; 1987. """ ### Translate the coordinates in the coil's frame n, l, m = self.base_vectors() R = self.radius r0 = self.position r = np.c_[np.ravel(X), np.ravel(Y), np.ravel(Z)] # transformation matrix coil frame to lab frame trans = np.vstack((l, m, n)) r -= r0 #point location from center of coil r = np.dot(r, linalg.inv(trans) ) #transform vector to coil frame #### calculate field # express the coordinates in polar form x = r[:, 0] y = r[:, 1] z = r[:, 2] rho = np.sqrt(x**2 + y**2) theta = np.arctan2(x, y) E = special.ellipe((4 * R * rho)/( (R + rho)**2 + z**2)) K = special.ellipk((4 * R * rho)/( (R + rho)**2 + z**2)) Bz = 1/np.sqrt((R + rho)**2 + z**2) * ( K + E * (R**2 - rho**2 - z**2)/((R - rho)**2 + z**2) ) Brho = z/(rho*np.sqrt((R + rho)**2 + z**2)) * ( -K + E * (R**2 + rho**2 + z**2)/((R - rho)**2 + z**2) ) # On the axis of the coil we get a divided by zero here. This returns a # NaN, where the field is actually zero : Brho[np.isnan(Brho)] = 0 B = np.c_[np.cos(theta)*Brho, np.sin(theta)*Brho, Bz ] # Rotate the field back in the lab's frame B = np.dot(B, trans) Bx, By, Bz = B.T Bx = np.reshape(Bx, X.shape) By = np.reshape(By, X.shape) Bz = np.reshape(Bz, X.shape) Bnorm = np.sqrt(Bx**2 + By**2 + Bz**2) # We need to threshold ourselves, rather than with VTK, to be able # to use an ImageData Bmax = 10 * np.median(Bnorm) Bx[Bnorm > Bmax] = np.NAN By[Bnorm > Bmax] = np.NAN Bz[Bnorm > Bmax] = np.NAN Bnorm[Bnorm > Bmax] = np.NAN self.Bx = Bx self.By = By self.Bz = Bz return Bnorm ############################################################################## # The application object class Application(HasTraits): scene = Instance(MlabSceneModel, (), editor=SceneEditor()) # The mayavi engine view. engine_view = Instance(EngineView) coils = List(Instance(Loop, (), allow_none=False), editor=ListEditor(style='custom'), value=[ Loop(position=(0, 0, -0.05), ), Loop(position=(0, 0, 0.05), ), ]) Bx = Array(value=np.zeros_like(X)) By = Array(value=np.zeros_like(X)) Bz = Array(value=np.zeros_like(X)) Bnorm = Array(value=np.zeros_like(X)) vector_field = None def __init__(self, **traits): HasTraits.__init__(self, **traits) self.engine_view = EngineView(engine=self.scene.engine) @on_trait_change('scene.activated,coils') def init_view(self): if self.scene._renderer is not None: self.scene.scene_editor.background = (0, 0, 0) for coil in self.coils: coil.app = self coil.display() self.visualize_field() def visualize_field(self): self.Bx = np.zeros_like(X) self.By = np.zeros_like(X) self.Bz = np.zeros_like(X) self.Bnorm = np.zeros_like(X) self.scene.scene.disable_render = True for coil in self.coils: self.Bx += coil.Bx self.By += coil.By self.Bz += coil.Bz self.Bnorm = np.sqrt(self.Bx**2 + self.By**2 + self.Bz**2) if self.vector_field is None: self.vector_field = self.scene.mlab.pipeline.vector_field( X, Y, Z, self.Bx, self.By, self.Bz, scalars=self.Bnorm, name='B field') vectors = self.scene.mlab.pipeline.vectors(self.vector_field, mode='arrow', resolution=10, mask_points=6, colormap='YlOrRd', scale_factor=2*np.abs(X[0,0,0] -X[1,1,1]) ) vectors.module_manager.vector_lut_manager.reverse_lut = True vectors.glyph.mask_points.random_mode = False self.scene.mlab.axes() self.scp = self.scene.mlab.pipeline.scalar_cut_plane( self.vector_field, colormap='hot') else: # Modify in place the data source. The visualization will # update automaticaly self.vector_field.mlab_source.set(u=self.Bx, v=self.By, w=self.Bz, scalars=self.Bnorm) self.scene.scene.disable_render = False view = View(HSplit( VSplit(Item(name='engine_view', style='custom', resizable=True), Item('coils', springy=True), show_labels=False), 'scene', show_labels=False), resizable=True, title='Coils...', height=0.8, width=0.8, ) ############################################################################## if __name__ == '__main__': app = Application() app.configure_traits() mayavi-4.5.0/examples/mayavi/interactive/compute_in_thread.py0000644000076500000240000000615412747716313025117 0ustar prabhustaff00000000000000#!/usr/bin/env python """ This script demonstrates how one can do a computation in another thread and update the mayavi pipeline. It also shows how to create a numpy array data and visualize it as image data using a few modules. """ # Author: Prabhu Ramachandran # Copyright (c) 2007-2015, Enthought, Inc. # License: BSD Style. from __future__ import print_function # Standard library imports import numpy from threading import Thread from time import sleep # Enthought library imports from mayavi.scripts import mayavi2 from traits.api import HasTraits, Button, Instance from traitsui.api import View, Item from mayavi.sources.array_source import ArraySource from mayavi.modules.outline import Outline from mayavi.modules.image_plane_widget import ImagePlaneWidget from pyface.api import GUI def make_data(dims=(128, 128, 128)): """Creates some simple array data of the given dimensions to test with.""" np = dims[0]*dims[1]*dims[2] # Create some scalars to render. x, y, z = numpy.ogrid[-5:5:dims[0]*1j,-5:5:dims[1]*1j,-5:5:dims[2]*1j] x = x.astype('f') y = y.astype('f') z = z.astype('f') scalars = (numpy.sin(x*y*z)/(x*y*z)) # The copy makes the data contiguous and the transpose makes it # suitable for display via tvtk. Please note that we assume here # that the ArraySource is configured to not transpose the data. s = numpy.transpose(scalars).copy() # Reshaping the array is needed since the transpose messes up the # dimensions of the data. The scalars themselves are ravel'd and # used internally by VTK so the dimension does not matter for the # scalars. s.shape = s.shape[::-1] return s class ThreadedAction(Thread): def __init__(self, data, **kwargs): Thread.__init__(self, **kwargs) self.data = data def run(self): print("Performing expensive calculation in %s..."%self.getName(), end=' ') sleep(3) sd = self.data.scalar_data sd += numpy.sin(numpy.random.rand(*sd.shape)*2.0*numpy.pi) GUI.invoke_later(self.data.update) print('done.') class Controller(HasTraits): run_calculation = Button('Run calculation') data = Instance(ArraySource) view = View(Item(name='run_calculation')) def _run_calculation_changed(self, value): action = ThreadedAction(self.data) action.start() @mayavi2.standalone def view_numpy(): """Example showing how to view a 3D numpy array in mayavi2. """ # 'mayavi' is always defined on the interpreter. mayavi.new_scene() # Make the data and add it to the pipeline. data = make_data() src = ArraySource(transpose_input_array=False) src.scalar_data = data mayavi.add_source(src) # Visualize the data. o = Outline() mayavi.add_module(o) ipw = ImagePlaneWidget() mayavi.add_module(ipw) ipw.module_manager.scalar_lut_manager.show_scalar_bar = True ipw_y = ImagePlaneWidget() mayavi.add_module(ipw_y) ipw_y.ipw.plane_orientation = 'y_axes' computation = Controller(data=src) computation.edit_traits() if __name__ == '__main__': view_numpy() mayavi-4.5.0/examples/mayavi/interactive/lorenz_ui.py0000644000076500000240000001212712747716313023431 0ustar prabhustaff00000000000000""" This example displays the trajectories for the Lorenz system of equations using mlab along with the z-nullcline. It provides a simple UI where a user can change the parameters and the system of equations on the fly. This primarily demonstrates how one can build powerful tools with a UI using Traits and Mayavi. For explanations and more examples of interactive application building with Mayavi, please refer to section :ref:`builing_applications`. """ # Author: Prabhu Ramachandran # Copyright (c) 2008-2009, Enthought, Inc. # License: BSD Style. import numpy as np import scipy from traits.api import HasTraits, Range, Instance, \ on_trait_change, Array, Tuple, Str from traitsui.api import View, Item, HSplit, Group from mayavi import mlab from mayavi.core.ui.api import MayaviScene, MlabSceneModel, \ SceneEditor ################################################################################ # `Lorenz` class. ################################################################################ class Lorenz(HasTraits): # The parameters for the Lorenz system, defaults to the standard ones. s = Range(0.0, 20.0, 10.0, desc='the parameter s', enter_set=True, auto_set=False) r = Range(0.0, 50.0, 28.0, desc='the parameter r', enter_set=True, auto_set=False) b = Range(0.0, 10.0, 8./3., desc='the parameter b', enter_set=True, auto_set=False) # These expressions are evaluated to compute the right hand sides of # the ODE. Defaults to the Lorenz system. u = Str('s*(y-x)', desc='the x component of the velocity', auto_set=False, enter_set=True) v = Str('r*x - y - x*z', desc='the y component of the velocity', auto_set=False, enter_set=True) w = Str('x*y - b*z', desc='the z component of the velocity', auto_set=False, enter_set=True) # Tuple of x, y, z arrays where the field is sampled. points = Tuple(Array, Array, Array) # The mayavi(mlab) scene. scene = Instance(MlabSceneModel, args=()) # The "flow" which is a Mayavi streamline module. flow = Instance(HasTraits) ######################################## # The UI view to show the user. view = View(HSplit( Group( Item('scene', editor=SceneEditor(scene_class=MayaviScene), height=500, width=500, show_label=False)), Group( Item('s'), Item('r'), Item('b'), Item('u'), Item('v'), Item('w')), ), resizable=True ) ###################################################################### # Trait handlers. ###################################################################### # Note that in the `on_trait_change` call below we listen for the # `scene.activated` trait. This conveniently ensures that the flow # is generated as soon as the mlab `scene` is activated (which # happens when the configure/edit_traits method is called). This # eliminates the need to manually call the `update_flow` method etc. @on_trait_change('s, r, b, scene.activated') def update_flow(self): x, y, z = self.points u, v, w = self.get_uvw() self.flow.mlab_source.set(u=u, v=v, w=w) @on_trait_change('u') def update_u(self): self.flow.mlab_source.set(u=self.get_vel('u')) @on_trait_change('v') def update_v(self): self.flow.mlab_source.set(v=self.get_vel('v')) @on_trait_change('w') def update_w(self): self.flow.mlab_source.set(w=self.get_vel('w')) def get_uvw(self): return self.get_vel('u'), self.get_vel('v'), self.get_vel('w') def get_vel(self, comp): """This function basically evaluates the user specified system of equations using scipy. """ func_str = getattr(self, comp) try: g = scipy.__dict__ x, y, z = self.points s, r, b = self.s, self.r, self.b val = eval(func_str, g, {'x': x, 'y': y, 'z': z, 's':s, 'r':r, 'b': b}) except: # Mistake, so return the original value. val = getattr(self.flow.mlab_source, comp) return val ###################################################################### # Private interface. ###################################################################### def _points_default(self): x, y, z = np.mgrid[-50:50:100j,-50:50:100j,-10:60:70j] return x, y, z def _flow_default(self): x, y, z = self.points u, v, w = self.get_uvw() f = self.scene.mlab.flow(x, y, z, u, v, w) f.stream_tracer.integration_direction = 'both' f.stream_tracer.maximum_propagation = 200 src = f.mlab_source.m_data o = mlab.outline() mlab.view(120, 60, 150) return f if __name__ == '__main__': # Instantiate the class and configure its traits. lor = Lorenz() lor.configure_traits() mayavi-4.5.0/examples/mayavi/interactive/mayavi_traits_ui.py0000644000076500000240000000667112747716313025003 0ustar prabhustaff00000000000000#!/usr/bin/env python """ An example of how to create a UI similar to the complete Mayavi application inside a Traits UI view. This does not use Envisage and provides a similar UI as seen in the full Mayavi application. This example uses `traitsUI `_ to create a dialog mimicking the mayavi2 application: a scene on the right, and on the left a pipeline tree view, and below it a panel to edit the currently-selected object. """ # Authors: Prabhu Ramachandran # Copyright (c) 2007, Enthought, Inc. # License: BSD Style. # Standard imports. from numpy import sqrt, sin, mgrid # Enthought imports. from traits.api import HasTraits, Instance, Property, Enum from traitsui.api import View, Item, HSplit, VSplit, InstanceEditor from tvtk.pyface.scene_editor import SceneEditor from mayavi.core.ui.engine_view import EngineView from mayavi.tools.mlab_scene_model import MlabSceneModel ###################################################################### class Mayavi(HasTraits): # The scene model. scene = Instance(MlabSceneModel, ()) # The mayavi engine view. engine_view = Instance(EngineView) # The current selection in the engine tree view. current_selection = Property ###################### view = View(HSplit(VSplit(Item(name='engine_view', style='custom', resizable=True, show_label=False ), Item(name='current_selection', editor=InstanceEditor(), enabled_when='current_selection is not None', style='custom', springy=True, show_label=False), ), Item(name='scene', editor=SceneEditor(), show_label=False, resizable=True, height=500, width=500), ), resizable=True, scrollable=True ) def __init__(self, **traits): HasTraits.__init__(self, **traits) self.engine_view = EngineView(engine=self.scene.engine) # Hook up the current_selection to change when the one in the engine # changes. This is probably unnecessary in Traits3 since you can show # the UI of a sub-object in T3. self.scene.engine.on_trait_change(self._selection_change, 'current_selection') self.generate_data_mayavi() def generate_data_mayavi(self): """Shows how you can generate data using mayavi instead of mlab.""" from mayavi.sources.api import ParametricSurface from mayavi.modules.api import Outline, Surface e = self.scene.engine s = ParametricSurface() e.add_source(s) e.add_module(Outline()) e.add_module(Surface()) def _selection_change(self, old, new): self.trait_property_changed('current_selection', old, new) def _get_current_selection(self): return self.scene.engine.current_selection if __name__ == '__main__': m = Mayavi() m.configure_traits() mayavi-4.5.0/examples/mayavi/interactive/mlab_interactive_dialog.py0000644000076500000240000000522512747716313026253 0ustar prabhustaff00000000000000#!/usr/bin/env python """ An example of how to modify the data visualized via an interactive dialog. A dialog is created via `TraitsUI `_ from an object (MyModel). Some attributes of the objects are represented on the dialog: first a Mayavi scene, that will host our visualization, and two parameters that control the data plotted. A curve is plotted in the embedded scene using the associated mlab.points3d function. The visualization object created is stored as an attribute on the main MyModel object, to modify it inplace later. When the `n_meridional` and `n_longitudinal` attributes are modified, eg via the slide bars on the dialog, the curve is recomputed, and the visualization is updated by modifying inplace the stored plot object (see :ref:`mlab-animating-data`). This example is discussed in details in the section :ref:`embedding_mayavi_traits`. """ # Author: Gael Varoquaux # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. from numpy import arange, pi, cos, sin from traits.api import HasTraits, Range, Instance, \ on_trait_change from traitsui.api import View, Item, Group from mayavi.core.api import PipelineBase from mayavi.core.ui.api import MayaviScene, SceneEditor, \ MlabSceneModel dphi = pi/1000. phi = arange(0.0, 2*pi + 0.5*dphi, dphi, 'd') def curve(n_mer, n_long): mu = phi*n_mer x = cos(mu) * (1 + cos(n_long * mu/n_mer)*0.5) y = sin(mu) * (1 + cos(n_long * mu/n_mer)*0.5) z = 0.5 * sin(n_long*mu/n_mer) t = sin(mu) return x, y, z, t class MyModel(HasTraits): n_meridional = Range(0, 30, 6, )#mode='spinner') n_longitudinal = Range(0, 30, 11, )#mode='spinner') scene = Instance(MlabSceneModel, ()) plot = Instance(PipelineBase) # When the scene is activated, or when the parameters are changed, we # update the plot. @on_trait_change('n_meridional,n_longitudinal,scene.activated') def update_plot(self): x, y, z, t = curve(self.n_meridional, self.n_longitudinal) if self.plot is None: self.plot = self.scene.mlab.plot3d(x, y, z, t, tube_radius=0.025, colormap='Spectral') else: self.plot.mlab_source.set(x=x, y=y, z=z, scalars=t) # The layout of the dialog created view = View(Item('scene', editor=SceneEditor(scene_class=MayaviScene), height=250, width=300, show_label=False), Group( '_', 'n_meridional', 'n_longitudinal', ), resizable=True, ) my_model = MyModel() my_model.configure_traits() mayavi-4.5.0/examples/mayavi/interactive/mlab_traits_ui.py0000644000076500000240000000330112747716313024413 0ustar prabhustaff00000000000000#!/usr/bin/env python """A simple example of how to use mayavi.mlab inside a traits UI dialog. This example uses traitsUI ( `traitsUI `_ ) to create a the simplest possible dialog: a single Mayavi scene in a window. """ # Authors: Prabhu Ramachandran # Gael Varoquaux # Copyright (c) 2007, Enthought, Inc. # License: BSD Style. # Standard imports. from numpy import sqrt, sin, mgrid # Enthought imports. from traits.api import HasTraits, Instance from traitsui.api import View, Item from tvtk.pyface.scene_editor import SceneEditor from mayavi.tools.mlab_scene_model import MlabSceneModel from mayavi.core.ui.mayavi_scene import MayaviScene ###################################################################### class ActorViewer(HasTraits): # The scene model. scene = Instance(MlabSceneModel, ()) ###################### # Using 'scene_class=MayaviScene' adds a Mayavi icon to the toolbar, # to pop up a dialog editing the pipeline. view = View(Item(name='scene', editor=SceneEditor(scene_class=MayaviScene), show_label=False, resizable=True, height=500, width=500), resizable=True ) def __init__(self, **traits): HasTraits.__init__(self, **traits) self.generate_data() def generate_data(self): # Create some data X, Y = mgrid[-2:2:100j, -2:2:100j] R = 10*sqrt(X**2 + Y**2) Z = sin(R)/R self.scene.mlab.surf(X, Y, Z, colormap='gist_earth') if __name__ == '__main__': a = ActorViewer() a.configure_traits() mayavi-4.5.0/examples/mayavi/interactive/mlab_visual.py0000644000076500000240000000251712747716313023723 0ustar prabhustaff00000000000000#!/usr/bin/env python """ A very simple example to show how you can use TVTK's visual module with mlab and create simple animations. In the example, the grey box bounces back and forth between the two red ones. The `tvtk.tools.visual` module exposes an API similar to `VPython `_ and is useful to create animation based on rigid object movement. The `@animate` decorator ( :func:`mayavi.mlab.animate` ) is detailed on section :ref:`animating_a_visualization`. If you want to modify the data plotted by the mlab (as in the `mlab.test_plot3d()` call) to create an animation, please see section :ref:`mlab-animating-data`. """ # Author: Prabhu Ramachandran # Copyright (c) 2009, Enthought, Inc. # License: BSD Style. from mayavi import mlab from tvtk.tools import visual # Create a figure f = mlab.figure(size=(500,500)) # Tell visual to use this as the viewer. visual.set_viewer(f) # A silly visualization. mlab.test_plot3d() # Even sillier animation. b1 = visual.box() b2 = visual.box(x=4., color=visual.color.red) b3 = visual.box(x=-4, color=visual.color.red) b1.v = 5.0 @mlab.show @mlab.animate(delay=250) def anim(): """Animate the b1 box.""" while 1: b1.x = b1.x + b1.v*0.1 if b1.x > 2.5 or b1.x < -2.5: b1.v = -b1.v yield # Run the animation. anim() mayavi-4.5.0/examples/mayavi/interactive/multiple_engines.py0000644000076500000240000000434612747716313024772 0ustar prabhustaff00000000000000""" An example to show how you can have multiple engines in one application. Mutliple engines can be useful for more separation, eg to script each engine separately, or to avoid side effects between scenes. This example shows how to explicitely set the engine for an embedded scene. To define default arguments, it makes use of the Traits initialization style, rather than overridding the __init__. """ # Author: Gael Varoquaux # Copyright (c) 2009, Enthought, Inc. # License: BSD Style. from traits.api import HasTraits, Instance, on_trait_change from traitsui.api import View, Group, Item from mayavi.core.api import Engine from mayavi.core.ui.api import MayaviScene, MlabSceneModel, \ SceneEditor ################################################################################ class MyApp(HasTraits): # The first engine. As default arguments (an empty tuple) are given, # traits initializes it. engine1 = Instance(Engine, args=()) scene1 = Instance(MlabSceneModel) def _scene1_default(self): " The default initializer for 'scene1' " self.engine1.start() scene1 = MlabSceneModel(engine=self.engine1) return scene1 engine2 = Instance(Engine, ()) scene2 = Instance(MlabSceneModel) def _scene2_default(self): " The default initializer for 'scene2' " self.engine2.start() scene2 = MlabSceneModel(engine=self.engine2) return scene2 # We populate the scenes only when it is activated, to avoid problems # with VTK objects that expect an active scene @on_trait_change('scene1.activated') def populate_scene1(self): self.scene1.mlab.test_surf() @on_trait_change('scene2.activated') def populate_scene2(self): self.scene2.mlab.test_mesh() # The layout of the view view = View(Group(Item('scene1', editor=SceneEditor(scene_class=MayaviScene), width=480, height=480)), Group(Item('scene2', editor=SceneEditor(scene_class=MayaviScene), width=480, height=480)), resizable=True) if __name__ == '__main__': MyApp().configure_traits() mayavi-4.5.0/examples/mayavi/interactive/multiple_mlab_scene_models.py0000644000076500000240000000440712747716313026773 0ustar prabhustaff00000000000000""" Example showing a dialog with multiple embedded scenes. When using several embedded scenes with mlab, you should be very careful always to pass the scene you want to use for plotting to the mlab function used, elsewhere it uses the current scene. In this example, failing to do so would result in only one scene being used, the last one created. The trick is to use the 'mayavi_scene' attribute of the MlabSceneModel, and pass it as a keyword argument to the mlab functions. For more examples on embedding mlab scenes in dialog, see also: the examples :ref:`example_mlab_interactive_dialog`, and :ref:`example_lorenz_ui`, as well as the section of the user manual :ref:`embedding_mayavi_traits`. """ import numpy as np from traits.api import HasTraits, Instance, Button, \ on_trait_change from traitsui.api import View, Item, HSplit, Group from mayavi import mlab from mayavi.core.ui.api import MlabSceneModel, SceneEditor class MyDialog(HasTraits): scene1 = Instance(MlabSceneModel, ()) scene2 = Instance(MlabSceneModel, ()) button1 = Button('Redraw') button2 = Button('Redraw') @on_trait_change('button1') def redraw_scene1(self): self.redraw_scene(self.scene1) @on_trait_change('button2') def redraw_scene2(self): self.redraw_scene(self.scene2) def redraw_scene(self, scene): # Notice how each mlab call points explicitely to the figure it # applies to. mlab.clf(figure=scene.mayavi_scene) x, y, z, s = np.random.random((4, 100)) mlab.points3d(x, y, z, s, figure=scene.mayavi_scene) # The layout of the dialog created view = View(HSplit( Group( Item('scene1', editor=SceneEditor(), height=250, width=300), 'button1', show_labels=False, ), Group( Item('scene2', editor=SceneEditor(), height=250, width=300, show_label=False), 'button2', show_labels=False, ), ), resizable=True, ) m = MyDialog() m.configure_traits() mayavi-4.5.0/examples/mayavi/interactive/poll_file.py0000644000076500000240000000625612747716313023376 0ustar prabhustaff00000000000000#!/usr/bin/env python """A simple script that polls a data file for changes and then updates the mayavi pipeline automatically. This script is to be run like so:: $ mayavi2 -x poll_file.py Or:: $ python poll_file.py The script currently defaults to using the example data in examples/data/heart.vtk. You can try editing that data file or change this script to point to other data which you can edit. """ # Author: Prabhu Ramachandran # Copyright (c) 2006-2015, Enthought Inc. # License: BSD Style. # Standard imports. import os from os.path import join, abspath, dirname # Enthought library imports from mayavi.scripts import mayavi2 from mayavi.sources.vtk_file_reader import VTKFileReader from mayavi.modules.outline import Outline from mayavi.modules.contour_grid_plane import ContourGridPlane from pyface.timer.api import Timer ###################################################################### # `Pollster` class. class Pollster(object): """Given a file name and a mayavi2 data reader object, this class polls the file for any changes and automatically updates the mayavi pipeline. """ def __init__(self, fname, data): """Initialize the object. Parameters: ----------- fname -- filename to poll. data -- the MayaVi source object to update. """ self.fname = fname self.data = data self.last_stat = os.stat(fname) def poll_file(self): # Check the file's time stamp. s = os.stat(self.fname) if s[-2] == self.last_stat[-2]: return else: self.last_stat = s self.update_pipeline() def update_pipeline(self): """Override this to do something else if needed. """ print("file changed") # Force the reader to re-read the file. d = self.data d.reader.modified() d.update() # Propagate the changes in the pipeline. d.data_changed = True def setup_data(fname): """Given a VTK file name `fname`, this creates a mayavi2 reader for it and adds it to the pipeline. It returns the reader created. """ # 'mayavi' is always defined on the interpreter. mayavi.new_scene() d = VTKFileReader() d.initialize(fname) mayavi.add_source(d) return d def view_data(): """Sets up the mayavi pipeline for the visualization. """ # 'mayavi' is always defined on the interpreter. o = Outline() mayavi.add_module(o) c = ContourGridPlane() mayavi.add_module(c) c.grid_plane.position = 16 c.module_manager.scalar_lut_manager.show_scalar_bar = True @mayavi2.standalone def main(): # Change this to suit your needs. Edit the file after running this # script and the pipeline should be updated automatically. fname = join(mayavi2.get_data_dir(abspath(dirname(__file__))), 'heart.vtk') data = setup_data(fname) view_data() # Poll the file. p = Pollster(fname, data) timer = Timer(1000, p.poll_file) # Keep a reference on the timer mayavi2.savedtimerbug = timer # To stop polling the file do: #timer.Stop() if __name__ == '__main__': main() mayavi-4.5.0/examples/mayavi/interactive/qt_embedding.py0000644000076500000240000000753612747716313024055 0ustar prabhustaff00000000000000""" This example demonstrates using Mayavi as a component of a large Qt application. For this use, Mayavi is embedded in a QWidget. To understand this example, please read section :ref:`builing-applications`. """ # First, and before importing any Enthought packages, set the ETS_TOOLKIT # environment variable to qt4, to tell Traits that we will use Qt. import os os.environ['ETS_TOOLKIT'] = 'qt4' # By default, the PySide binding will be used. If you want the PyQt bindings # to be used, you need to set the QT_API environment variable to 'pyqt' #os.environ['QT_API'] = 'pyqt' # To be able to use PySide or PyQt4 and not run in conflicts with traits, # we need to import QtGui and QtCore from pyface.qt from pyface.qt import QtGui, QtCore # Alternatively, you can bypass this line, but you need to make sure that # the following lines are executed before the import of PyQT: # import sip # sip.setapi('QString', 2) from traits.api import HasTraits, Instance, on_trait_change from traitsui.api import View, Item from mayavi.core.ui.api import MayaviScene, MlabSceneModel, \ SceneEditor ################################################################################ #The actual visualization class Visualization(HasTraits): scene = Instance(MlabSceneModel, ()) @on_trait_change('scene.activated') def update_plot(self): # This function is called when the view is opened. We don't # populate the scene when the view is not yet open, as some # VTK features require a GLContext. # We can do normal mlab calls on the embedded scene. self.scene.mlab.test_points3d() # the layout of the dialog screated view = View(Item('scene', editor=SceneEditor(scene_class=MayaviScene), height=250, width=300, show_label=False), resizable=True # We need this to resize with the parent widget ) ################################################################################ # The QWidget containing the visualization, this is pure PyQt4 code. class MayaviQWidget(QtGui.QWidget): def __init__(self, parent=None): QtGui.QWidget.__init__(self, parent) layout = QtGui.QVBoxLayout(self) layout.setContentsMargins(0,0,0,0) layout.setSpacing(0) self.visualization = Visualization() # If you want to debug, beware that you need to remove the Qt # input hook. #QtCore.pyqtRemoveInputHook() #import pdb ; pdb.set_trace() #QtCore.pyqtRestoreInputHook() # The edit_traits call will generate the widget to embed. self.ui = self.visualization.edit_traits(parent=self, kind='subpanel').control layout.addWidget(self.ui) self.ui.setParent(self) if __name__ == "__main__": # Don't create a new QApplication, it would unhook the Events # set by Traits on the existing QApplication. Simply use the # '.instance()' method to retrieve the existing one. app = QtGui.QApplication.instance() container = QtGui.QWidget() container.setWindowTitle("Embedding Mayavi in a PyQt4 Application") # define a "complex" layout to test the behaviour layout = QtGui.QGridLayout(container) # put some stuff around mayavi label_list = [] for i in range(3): for j in range(3): if (i==1) and (j==1):continue label = QtGui.QLabel(container) label.setText("Your QWidget at (%d, %d)" % (i,j)) label.setAlignment(QtCore.Qt.AlignHCenter|QtCore.Qt.AlignVCenter) layout.addWidget(label, i, j) label_list.append(label) mayavi_widget = MayaviQWidget(container) layout.addWidget(mayavi_widget, 1, 1) container.show() window = QtGui.QMainWindow() window.setCentralWidget(container) window.show() # Start the main event loop. app.exec_() mayavi-4.5.0/examples/mayavi/interactive/subclassing_mayavi_application.py0000644000076500000240000000540212747716313027667 0ustar prabhustaff00000000000000#!/usr/bin/env python """ This script demonstrates how one can script the Mayavi application by subclassing the application, create a new scene and create a few simple modules. This should be run as:: $ python test.py """ # Author: Prabhu Ramachandran # Copyright (c) 2005-2007, Enthought, Inc. # License: BSD Style. # Standard library imports from os.path import join, abspath, dirname # Enthought library imports from mayavi.plugins.app import Mayavi from mayavi.scripts.util import get_data_dir class MyApp(Mayavi): def run(self): """This is executed once the application GUI has started. *Make sure all other MayaVi specific imports are made here!* """ # Various imports to do different things. from mayavi.sources.vtk_file_reader import VTKFileReader from mayavi.modules.outline import Outline from mayavi.modules.axes import Axes from mayavi.modules.grid_plane import GridPlane from mayavi.modules.image_plane_widget import ImagePlaneWidget from mayavi.modules.text import Text script = self.script # Create a new scene. script.new_scene() # Read a VTK (old style) data file. r = VTKFileReader() r.initialize(join(get_data_dir(dirname(abspath(__file__))), 'heart.vtk')) script.add_source(r) # Put up some text. t = Text(text='MayaVi rules!', x_position=0.2, y_position=0.9, width=0.8) t.property.color = 1, 1, 0 # Bright yellow, yeah! script.add_module(t) # Create an outline for the data. o = Outline() script.add_module(o) # Create an axes for the data. a = Axes() script.add_module(a) # Create an orientation axes for the scene. This only works with # VTK-4.5 and above which is why we have the try block. try: from mayavi.modules.orientation_axes import OrientationAxes except ImportError: pass else: a = OrientationAxes() a.marker.set_viewport(0.0, 0.8, 0.2, 1.0) script.add_module(a) # Create three simple grid plane modules. # First normal to 'x' axis. gp = GridPlane() script.add_module(gp) # Second normal to 'y' axis. gp = GridPlane() gp.grid_plane.axis = 'y' script.add_module(gp) # Third normal to 'z' axis. gp = GridPlane() script.add_module(gp) gp.grid_plane.axis = 'z' # Create one ImagePlaneWidget. ipw = ImagePlaneWidget() script.add_module(ipw) # Set the position to the middle of the data. ipw.ipw.slice_position = 16 if __name__ == '__main__': a = MyApp() a.main() mayavi-4.5.0/examples/mayavi/interactive/superquad_with_gui.py0000644000076500000240000000500712747716313025332 0ustar prabhustaff00000000000000""" This example uses MayaVi to show the evolution of a superquadric (http://en.wikipedia.org/wiki/Superquadrics), which are ellipsoidal surfaces parametrised by two parameters,\alpha and \beta. The equations that are used to determine the superquadric are (in spherical-polar coordinates): \(x = A(\sin^{\alpha}(\phi)*\cos^{\beta}(\theta))\) \(y = B(\sin^{\alpha}(\phi)*\sin^{\beta}(\theta))\) \(z = C(\cos^{\alpha}(\phi))\) Note that when we set A=B=C=r, and \alpha = \beta = 1, we get the equation for a sphere in spherical polar coordinate. Use the controls at the bottom of the plot to adjust \alpha and \beta, and watch as the figure transforms accordingly! """ # Author: Pratik Mallya # Copyright (c) 2008-2013, Enthought, Inc. # License: BSD Style. import numpy as np from enthought.traits.api import HasTraits, Range, Instance, \ on_trait_change from enthought.traits.ui.api import View, Item, HGroup from enthought.tvtk.pyface.scene_editor import SceneEditor from enthought.mayavi.tools.mlab_scene_model import \ MlabSceneModel from enthought.mayavi.core.ui.mayavi_scene import MayaviScene def fexp(x,p): """a different kind of exponentiation""" return (np.sign(x) * (np.abs(x)**p)) def tens_fld(A,B,C,P,Q): """this module plots superquadratic surfaces with the given parameters""" phi, theta = np.mgrid[0:np.pi:80j, 0:2*np.pi:80j] x = A * (fexp(np.sin(phi),P)) * (fexp(np.cos(theta),Q)) y = B * (fexp(np.sin(phi),P)) * (fexp(np.sin(theta),Q)) z = C * (fexp(np.cos(phi),P)) return x , y , z class Visualization(HasTraits): alpha = Range(0.0, 4.0, 1.0/4) beta = Range(0.0, 4.0, 1.0/4) scene = Instance(MlabSceneModel, ()) def __init__(self): # Do not forget to call the parent's __init__ HasTraits.__init__(self) x, y, z, = tens_fld(1, 1, 1, self.beta, self.alpha) self.plot = self.scene.mlab.mesh(x, y, z, colormap='copper', representation='surface') @on_trait_change('beta,alpha') def update_plot(self): x, y, z, = tens_fld(1, 1, 1, self.beta, self.alpha) self.plot.mlab_source.set(x = x, y = y, z = z) # the layout of the dialog created view = View(Item('scene', editor = SceneEditor(scene_class=MayaviScene), height = 750, width=750, show_label=False), HGroup( '_', 'beta', 'alpha', ), ) visualization = Visualization() visualization.configure_traits() mayavi-4.5.0/examples/mayavi/interactive/volume_slicer.py0000644000076500000240000002073512747716313024277 0ustar prabhustaff00000000000000""" Example of an elaborate dialog showing a multiple views on the same data, with 3 cuts synchronized. This example shows how to have multiple views on the same data, how to embedded multiple scenes in a dialog, and the caveat in populating them with data, as well as how to add some interaction logic on an ImagePlaneWidget. The order in which things happen in this example is important, and it is easy to get it wrong. First of all, many properties of the visualization objects cannot be changed if there is not a scene created to view them. This is why we put a lot of the visualization logic in the callback of scene.activated, which is called after creation of the scene. Second, default values created via the '_xxx_default' callback are created lazyly, that is, when the attributes are accessed. As the establishement of the VTK pipeline can depend on the order in which it is built, we trigger these access by explicitely calling the attributes. In particular, properties like scene background color, or interaction properties cannot be set before the scene is activated. The same data is exposed in the different scenes by sharing the VTK dataset between different Mayavi data sources. See the :ref:`sharing_data_between_scenes` tip for more details. In this example, the interaction with the scene and the various elements on it is strongly simplified by turning off interaction, and choosing specific scene interactor styles. Indeed, non-technical users can be confused with too rich interaction. """ # Author: Gael Varoquaux # Copyright (c) 2009, Enthought, Inc. # License: BSD Style. import numpy as np from traits.api import HasTraits, Instance, Array, \ on_trait_change from traitsui.api import View, Item, HGroup, Group from tvtk.api import tvtk from tvtk.pyface.scene import Scene from mayavi import mlab from mayavi.core.api import PipelineBase, Source from mayavi.core.ui.api import SceneEditor, MayaviScene, \ MlabSceneModel ################################################################################ # Create some data x, y, z = np.ogrid[-5:5:64j, -5:5:64j, -5:5:64j] data = np.sin(3*x)/x + 0.05*z**2 + np.cos(3*y) ################################################################################ # The object implementing the dialog class VolumeSlicer(HasTraits): # The data to plot data = Array() # The 4 views displayed scene3d = Instance(MlabSceneModel, ()) scene_x = Instance(MlabSceneModel, ()) scene_y = Instance(MlabSceneModel, ()) scene_z = Instance(MlabSceneModel, ()) # The data source data_src3d = Instance(Source) # The image plane widgets of the 3D scene ipw_3d_x = Instance(PipelineBase) ipw_3d_y = Instance(PipelineBase) ipw_3d_z = Instance(PipelineBase) _axis_names = dict(x=0, y=1, z=2) #--------------------------------------------------------------------------- def __init__(self, **traits): super(VolumeSlicer, self).__init__(**traits) # Force the creation of the image_plane_widgets: self.ipw_3d_x self.ipw_3d_y self.ipw_3d_z #--------------------------------------------------------------------------- # Default values #--------------------------------------------------------------------------- def _data_src3d_default(self): return mlab.pipeline.scalar_field(self.data, figure=self.scene3d.mayavi_scene) def make_ipw_3d(self, axis_name): ipw = mlab.pipeline.image_plane_widget(self.data_src3d, figure=self.scene3d.mayavi_scene, plane_orientation='%s_axes' % axis_name) return ipw def _ipw_3d_x_default(self): return self.make_ipw_3d('x') def _ipw_3d_y_default(self): return self.make_ipw_3d('y') def _ipw_3d_z_default(self): return self.make_ipw_3d('z') #--------------------------------------------------------------------------- # Scene activation callbaks #--------------------------------------------------------------------------- @on_trait_change('scene3d.activated') def display_scene3d(self): outline = mlab.pipeline.outline(self.data_src3d, figure=self.scene3d.mayavi_scene, ) self.scene3d.mlab.view(40, 50) # Interaction properties can only be changed after the scene # has been created, and thus the interactor exists for ipw in (self.ipw_3d_x, self.ipw_3d_y, self.ipw_3d_z): # Turn the interaction off ipw.ipw.interaction = 0 self.scene3d.scene.background = (0, 0, 0) # Keep the view always pointing up self.scene3d.scene.interactor.interactor_style = \ tvtk.InteractorStyleTerrain() def make_side_view(self, axis_name): scene = getattr(self, 'scene_%s' % axis_name) # To avoid copying the data, we take a reference to the # raw VTK dataset, and pass it on to mlab. Mlab will create # a Mayavi source from the VTK without copying it. # We have to specify the figure so that the data gets # added on the figure we are interested in. outline = mlab.pipeline.outline( self.data_src3d.mlab_source.dataset, figure=scene.mayavi_scene, ) ipw = mlab.pipeline.image_plane_widget( outline, plane_orientation='%s_axes' % axis_name) setattr(self, 'ipw_%s' % axis_name, ipw) # Synchronize positions between the corresponding image plane # widgets on different views. ipw.ipw.sync_trait('slice_position', getattr(self, 'ipw_3d_%s'% axis_name).ipw) # Make left-clicking create a crosshair ipw.ipw.left_button_action = 0 # Add a callback on the image plane widget interaction to # move the others def move_view(obj, evt): position = obj.GetCurrentCursorPosition() for other_axis, axis_number in self._axis_names.items(): if other_axis == axis_name: continue ipw3d = getattr(self, 'ipw_3d_%s' % other_axis) ipw3d.ipw.slice_position = position[axis_number] ipw.ipw.add_observer('InteractionEvent', move_view) ipw.ipw.add_observer('StartInteractionEvent', move_view) # Center the image plane widget ipw.ipw.slice_position = 0.5*self.data.shape[ self._axis_names[axis_name]] # Position the view for the scene views = dict(x=( 0, 90), y=(90, 90), z=( 0, 0), ) scene.mlab.view(*views[axis_name]) # 2D interaction: only pan and zoom scene.scene.interactor.interactor_style = \ tvtk.InteractorStyleImage() scene.scene.background = (0, 0, 0) @on_trait_change('scene_x.activated') def display_scene_x(self): return self.make_side_view('x') @on_trait_change('scene_y.activated') def display_scene_y(self): return self.make_side_view('y') @on_trait_change('scene_z.activated') def display_scene_z(self): return self.make_side_view('z') #--------------------------------------------------------------------------- # The layout of the dialog created #--------------------------------------------------------------------------- view = View(HGroup( Group( Item('scene_y', editor=SceneEditor(scene_class=Scene), height=250, width=300), Item('scene_z', editor=SceneEditor(scene_class=Scene), height=250, width=300), show_labels=False, ), Group( Item('scene_x', editor=SceneEditor(scene_class=Scene), height=250, width=300), Item('scene3d', editor=SceneEditor(scene_class=MayaviScene), height=250, width=300), show_labels=False, ), ), resizable=True, title='Volume Slicer', ) m = VolumeSlicer(data=data) m.configure_traits() mayavi-4.5.0/examples/mayavi/interactive/volume_slicer_advanced.py0000644000076500000240000002643412747716313026126 0ustar prabhustaff00000000000000""" An efficient implementation of the triple-plane view showing 3 cut planes on volumetric data, and side views showing each cut, with a cursor to move the other cuts. This is an example of complex callback interaction. It builds on the :ref:`example_volume_slicer` but has more complex logic. You should try to understand the :ref:`example_volume_slicer` first. In this example, the VolumeSlicer object displays a position attribute giving the position of the cut in data coordinates. Traits callbacks are used to move the cut planes when this position attribute is modifed. In the 3D window, the 3D cuts are displayed using ImagePlaneWidgets cutting the 3D volumetric data. The data extracted by the ImagePlaneWidgets for plotting is captured using the TVTK ImagePlaneWidget's `_get_reslice_output` method. The resulting dataset is plotted in each side view using another ImagePlaneWidget. As a result the data is not copied (at the VTK level, there is only one pipeline), and modifications of the data plotted on the planes in the 3D view (for instance when these planes are moved) are propagated to the 2D side views by the VTK pipeline. A cursor is displayed in each side view using a glyph. The cursor indicates the position of the cut. In the side view, when the mouse button is pressed on the planes, it creates a VTK `InteractionEvent`. When this happens, VTK calls an callback (observer, it VTK terms), that we use to move the position of the cut. The Traits callbacks do the rest for the updating. """ import numpy as np from traits.api import HasTraits, Instance, Array, \ Bool, Dict, on_trait_change from traitsui.api import View, Item, HGroup, Group from tvtk.api import tvtk from tvtk.pyface.scene import Scene from mayavi import mlab from mayavi.core.api import PipelineBase, Source from mayavi.core.ui.api import SceneEditor, MlabSceneModel ################################################################################ # The object implementing the dialog class VolumeSlicer(HasTraits): # The data to plot data = Array # The position of the view position = Array(shape=(3,)) # The 4 views displayed scene3d = Instance(MlabSceneModel, ()) scene_x = Instance(MlabSceneModel, ()) scene_y = Instance(MlabSceneModel, ()) scene_z = Instance(MlabSceneModel, ()) # The data source data_src = Instance(Source) # The image plane widgets of the 3D scene ipw_3d_x = Instance(PipelineBase) ipw_3d_y = Instance(PipelineBase) ipw_3d_z = Instance(PipelineBase) # The cursors on each view: cursors = Dict() disable_render = Bool _axis_names = dict(x=0, y=1, z=2) #--------------------------------------------------------------------------- # Object interface #--------------------------------------------------------------------------- def __init__(self, **traits): super(VolumeSlicer, self).__init__(**traits) # Force the creation of the image_plane_widgets: self.ipw_3d_x self.ipw_3d_y self.ipw_3d_z #--------------------------------------------------------------------------- # Default values #--------------------------------------------------------------------------- def _position_default(self): return 0.5*np.array(self.data.shape) def _data_src_default(self): return mlab.pipeline.scalar_field(self.data, figure=self.scene3d.mayavi_scene, name='Data',) def make_ipw_3d(self, axis_name): ipw = mlab.pipeline.image_plane_widget(self.data_src, figure=self.scene3d.mayavi_scene, plane_orientation='%s_axes' % axis_name, name='Cut %s' % axis_name) return ipw def _ipw_3d_x_default(self): return self.make_ipw_3d('x') def _ipw_3d_y_default(self): return self.make_ipw_3d('y') def _ipw_3d_z_default(self): return self.make_ipw_3d('z') #--------------------------------------------------------------------------- # Scene activation callbacks #--------------------------------------------------------------------------- @on_trait_change('scene3d.activated') def display_scene3d(self): outline = mlab.pipeline.outline(self.data_src, figure=self.scene3d.mayavi_scene, ) self.scene3d.mlab.view(40, 50) # Interaction properties can only be changed after the scene # has been created, and thus the interactor exists for ipw in (self.ipw_3d_x, self.ipw_3d_y, self.ipw_3d_z): ipw.ipw.interaction = 0 self.scene3d.scene.background = (0, 0, 0) # Keep the view always pointing up self.scene3d.scene.interactor.interactor_style = \ tvtk.InteractorStyleTerrain() self.update_position() def make_side_view(self, axis_name): scene = getattr(self, 'scene_%s' % axis_name) scene.scene.parallel_projection = True ipw_3d = getattr(self, 'ipw_3d_%s' % axis_name) # We create the image_plane_widgets in the side view using a # VTK dataset pointing to the data on the corresponding # image_plane_widget in the 3D view (it is returned by # ipw_3d._get_reslice_output()) side_src = ipw_3d.ipw._get_reslice_output() ipw = mlab.pipeline.image_plane_widget( side_src, plane_orientation='z_axes', vmin=self.data.min(), vmax=self.data.max(), figure=scene.mayavi_scene, name='Cut view %s' % axis_name, ) setattr(self, 'ipw_%s' % axis_name, ipw) # Extract the spacing of the side_src to convert coordinates # into indices spacing = side_src.spacing # Make left-clicking create a crosshair ipw.ipw.left_button_action = 0 x, y, z = self.position cursor = mlab.points3d(x, y, z, mode='axes', color=(0, 0, 0), scale_factor=2*max(self.data.shape), figure=scene.mayavi_scene, name='Cursor view %s' % axis_name, ) self.cursors[axis_name] = cursor # Add a callback on the image plane widget interaction to # move the others this_axis_number = self._axis_names[axis_name] def move_view(obj, evt): # Disable rendering on all scene position = list(obj.GetCurrentCursorPosition()*spacing)[:2] position.insert(this_axis_number, self.position[this_axis_number]) # We need to special case y, as the view has been rotated. if axis_name is 'y': position = position[::-1] self.position = position ipw.ipw.add_observer('InteractionEvent', move_view) ipw.ipw.add_observer('StartInteractionEvent', move_view) # Center the image plane widget ipw.ipw.slice_position = 0.5*self.data.shape[ self._axis_names[axis_name]] # 2D interaction: only pan and zoom scene.scene.interactor.interactor_style = \ tvtk.InteractorStyleImage() scene.scene.background = (0, 0, 0) # Some text: mlab.text(0.01, 0.8, axis_name, width=0.08) # Choose a view that makes sens views = dict(x=(0, 0), y=(90, 180), z=(0, 0)) mlab.view(views[axis_name][0], views[axis_name][1], focalpoint=0.5*np.array(self.data.shape), figure=scene.mayavi_scene) scene.scene.camera.parallel_scale = 0.52*np.mean(self.data.shape) @on_trait_change('scene_x.activated') def display_scene_x(self): return self.make_side_view('x') @on_trait_change('scene_y.activated') def display_scene_y(self): return self.make_side_view('y') @on_trait_change('scene_z.activated') def display_scene_z(self): return self.make_side_view('z') #--------------------------------------------------------------------------- # Traits callback #--------------------------------------------------------------------------- @on_trait_change('position') def update_position(self): """ Update the position of the cursors on each side view, as well as the image_plane_widgets in the 3D view. """ # First disable rendering in all scenes to avoid unecessary # renderings self.disable_render = True # For each axis, move image_plane_widget and the cursor in the # side view for axis_name, axis_number in self._axis_names.items(): ipw3d = getattr(self, 'ipw_3d_%s' % axis_name) ipw3d.ipw.slice_position = self.position[axis_number] # Go from the 3D position, to the 2D coordinates in the # side view position2d = list(self.position) position2d.pop(axis_number) if axis_name is 'y': position2d = position2d[::-1] # Move the cursor # For the following to work, you need Mayavi 3.4.0, if you # have a less recent version, use 'x=[position2d[0]]' self.cursors[axis_name].mlab_source.set( x=position2d[0], y=position2d[1], z=0) # Finally re-enable rendering self.disable_render = False @on_trait_change('disable_render') def _render_enable(self): for scene in (self.scene3d, self.scene_x, self.scene_y, self.scene_z): scene.scene.disable_render = self.disable_render #--------------------------------------------------------------------------- # The layout of the dialog created #--------------------------------------------------------------------------- view = View(HGroup( Group( Item('scene_y', editor=SceneEditor(scene_class=Scene), height=250, width=300), Item('scene_z', editor=SceneEditor(scene_class=Scene), height=250, width=300), show_labels=False, ), Group( Item('scene_x', editor=SceneEditor(scene_class=Scene), height=250, width=300), Item('scene3d', editor=SceneEditor(scene_class=Scene), height=250, width=300), show_labels=False, ), ), resizable=True, title='Volume Slicer', ) ################################################################################ if __name__ == '__main__': # Create some data x, y, z = np.ogrid[-5:5:100j, -5:5:100j, -5:5:100j] data = np.sin(3*x)/x + 0.05*z**2 + np.cos(3*y) m = VolumeSlicer(data=data) m.configure_traits() mayavi-4.5.0/examples/mayavi/interactive/wx_embedding.py0000644000076500000240000000407712747716313024064 0ustar prabhustaff00000000000000""" This example shows to embed a Mayavi view in a wx frame. The trick is to create a `HasTraits` object, as in the mlab_traits_ui.py, mayavi_traits_ui.py, or the modifying_mlab_source.py examples (:ref:`example_mlab_traits_ui`, :ref:`example_mayavi_traits_ui`, :ref:`example_mlab_interactive_dialog`). Calling the `edit_traits` method returns a `ui` object whose `control` attribute is the wx widget. It can thus be embedded in a standard wx application. In this example, the wx part is very simple. See :ref:`example_wx_mayavi_embed_in_notebook` for an example of more complex embedding of Mayavi scenes in Wx applications. """ from numpy import ogrid, sin from traits.api import HasTraits, Instance from traitsui.api import View, Item from mayavi.sources.api import ArraySource from mayavi.modules.api import IsoSurface from mayavi.core.ui.api import SceneEditor, MlabSceneModel class MayaviView(HasTraits): scene = Instance(MlabSceneModel, ()) # The layout of the panel created by Traits view = View(Item('scene', editor=SceneEditor(), resizable=True, show_label=False), resizable=True) def __init__(self): HasTraits.__init__(self) # Create some data, and plot it using the embedded scene's engine x, y, z = ogrid[-10:10:100j, -10:10:100j, -10:10:100j] scalars = sin(x*y*z)/(x*y*z) src = ArraySource(scalar_data=scalars) self.scene.engine.add_source(src) src.add_module(IsoSurface()) #----------------------------------------------------------------------------- # Wx Code import wx class MainWindow(wx.Frame): def __init__(self, parent, id): wx.Frame.__init__(self, parent, id, 'Mayavi in Wx') self.mayavi_view = MayaviView() # Use traits to create a panel, and use it as the content of this # wx frame. self.control = self.mayavi_view.edit_traits( parent=self, kind='subpanel').control self.Show(True) app = wx.PySimpleApp() frame = MainWindow(None, wx.ID_ANY) app.MainLoop() mayavi-4.5.0/examples/mayavi/interactive/wx_mayavi_embed_in_notebook.py0000644000076500000240000000531112747716313027146 0ustar prabhustaff00000000000000""" This example show how to embedded Mayavi in a wx notebook. This is a slightly more complex example than the `wx_embedding` example ( :ref:`example_wx_embedding`), and can be used to see how a large wx application can use different Mayavi views. In this example, we embed one single Mayavi scene in a Wx notebook, with 2 tabs, each one of them hosting a different view of the scene. """ # First thing, we need to make sure that we are importing a # recent-enough version of wx import wxversion wxversion.ensureMinimal('2.8') from numpy import ogrid, sin from traits.api import HasTraits, Instance from traitsui.api import View, Item from mayavi.sources.api import ArraySource from mayavi.modules.api import IsoSurface from mayavi.core.ui.api import MlabSceneModel, SceneEditor #------------------------------------------------------------------------------- class MayaviView(HasTraits): scene = Instance(MlabSceneModel, ()) # The layout of the panel created by traits. view = View(Item('scene', editor=SceneEditor(), resizable=True, show_label=False), resizable=True) def __init__(self): HasTraits.__init__(self) x, y, z = ogrid[-10:10:100j, -10:10:100j, -10:10:100j] scalars = sin(x*y*z)/(x*y*z) src = ArraySource(scalar_data=scalars) self.scene.mayavi_scene.add_child(src) src.add_module(IsoSurface()) #------------------------------------------------------------------------------- # Wx Code import wx class MainWindow(wx.Frame): def __init__(self, parent, id): wx.Frame.__init__(self, parent, id, 'Mayavi in a Wx notebook') self.notebook = wx.aui.AuiNotebook(self, id=-1, style=wx.aui.AUI_NB_TAB_SPLIT | wx.aui.AUI_NB_CLOSE_ON_ALL_TABS | wx.aui.AUI_NB_LEFT) self.mayavi_view = MayaviView() # The edit_traits method opens a first view of our 'MayaviView' # object self.control = self.mayavi_view.edit_traits( parent=self, kind='subpanel').control self.notebook.AddPage(page=self.control, caption='Display 1') self.mayavi_view2 = MayaviView() # The second call to edit_traits opens a second view self.control2 = self.mayavi_view2.edit_traits( parent=self, kind='subpanel').control self.notebook.AddPage(page=self.control2, caption='Display 2') sizer = wx.BoxSizer() sizer.Add(self.notebook,1, wx.EXPAND) self.SetSizer(sizer) self.Show(True) if __name__ == '__main__': app = wx.PySimpleApp() frame = MainWindow(None, wx.ID_ANY) app.MainLoop() mayavi-4.5.0/examples/mayavi/mayavi_jupyter.ipynb0000644000076500000240000373465712747716313022675 0ustar prabhustaff00000000000000{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "### Mayavi on Jupyter\n", "\n", "Works with either `'x3d'` or `'png'` modes. The PNG mode embeds images in the notebook and relies on off-screen-rendering working correctly.\n", "\n", "For [X3D](http://www.x3dom.org) output to be rendered one either needs to [install the nbextensions](http://jupyter-notebook.readthedocs.io/en/latest/examples/Notebook/Distributing%20Jupyter%20Extensions%20as%20Python%20Packages.html#Installation-of-Jupyter-Extensions) for mayavi as\n", "\n", "```\n", " $ jupyter nbextension install --py mayavi --user\n", "```\n", "or requires an internet connection. \n", "\n", "In this notebook we demonstrate the X3D output while requiring an internet connection." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Notebook initialized with x3d backend.\n" ] } ], "source": [ "# Always start with this.\n", "from mayavi import mlab\n", "mlab.init_notebook(backend='x3d', local=False) \n", "# local=True is the default but requires the nbextension to be installed. \n", "# local=False pulls the content from the internet." ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "\n", " \n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n", "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "s = mlab.test_points3d()\n", "s" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To see how to interact with the scene, please see: http://www.x3dom.org/documentation/interaction/\n", "\n", "- Left click and drag to rotate the camera.\n", "- Press 'r' or 'a' to reset the zoom.\n", "\n", "Most [modern browsers](http://www.x3dom.org/contact/) should be supported." ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "\n", " \n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "\n", "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "mlab.clf()\n", "mlab.test_contour_surf()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### More examples\n", "\n", "Try the following examples too!\n", "\n", "Note that one can call `init_notebook` multiple times if needed." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "mlab.clf()\n", "s = mlab.test_mesh_sphere()\n", "s.actor.property.representation = 'wireframe'\n", "s" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "mlab.init_notebook('png') # This may not work well if off screen rendering is not working." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "mlab.clf()\n", "mlab.test_contour3d()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "mlab.init_notebook('x3d')\n", "mlab.clf()\n", "mlab.test_barchart()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": true }, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.11" } }, "nbformat": 4, "nbformat_minor": 0 } mayavi-4.5.0/examples/mayavi/mlab/0000755000076500000240000000000012747722127017444 5ustar prabhustaff00000000000000mayavi-4.5.0/examples/mayavi/mlab/atomic_orbital.py0000644000076500000240000000543412747716313023014 0ustar prabhustaff00000000000000""" An example showing the norm and phase of an atomic orbital: isosurfaces of the norm, with colors displaying the phase. This example shows how you can apply a filter on one data set, and dislay a second data set on the output of the filter. Here we use the contour filter to extract isosurfaces of the norm of a complex field, and we display the phase of the field with the colormap. The field we choose to plot is a simplified version of the 3P_y atomic orbital for hydrogen-like atoms. The first step is to create a data source with two scalar datasets. The second step is to apply filters and modules, using the 'set_active_attribute' filter to select on which data these apply. Creating a data source with two scalar datasets is actually slighlty tricky, as it requires some understanding of the layout of the datasets in TVTK. The reader is referred to :ref:`data-structures-used-by-mayavi` for more details. """ # Author: Gael Varoquaux # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. # Create the data ############################################################ import numpy as np x, y, z = np.ogrid[- .5:.5:200j, - .5:.5:200j, - .5:.5:200j] r = np.sqrt(x ** 2 + y ** 2 + z ** 2) # Generalized Laguerre polynomial (3, 2) L = - r ** 3 / 6 + 5. / 2 * r ** 2 - 10 * r + 6 # Spherical harmonic (3, 2) Y = (x + y * 1j) ** 2 * z / r ** 3 Phi = L * Y * np.exp(- r) * r ** 2 # Plot it #################################################################### from mayavi import mlab mlab.figure(1, fgcolor=(1, 1, 1), bgcolor=(0, 0, 0)) # We create a scalar field with the module of Phi as the scalar src = mlab.pipeline.scalar_field(np.abs(Phi)) # And we add the phase of Phi as an additional array # This is a tricky part: the layout of the new array needs to be the same # as the existing dataset, and no checks are performed. The shape needs # to be the same, and so should the data. Failure to do so can result in # segfaults. src.image_data.point_data.add_array(np.angle(Phi).T.ravel()) # We need to give a name to our new dataset. src.image_data.point_data.get_array(1).name = 'angle' # Make sure that the dataset is up to date with the different arrays: src.update() # We select the 'scalar' attribute, ie the norm of Phi src2 = mlab.pipeline.set_active_attribute(src, point_scalars='scalar') # Cut isosurfaces of the norm contour = mlab.pipeline.contour(src2) # Now we select the 'angle' attribute, ie the phase of Phi contour2 = mlab.pipeline.set_active_attribute(contour, point_scalars='angle') # And we display the surface. The colormap is the current attribute: the phase. mlab.pipeline.surface(contour2, colormap='hsv') mlab.colorbar(title='Phase', orientation='vertical', nb_labels=3) mlab.show() mayavi-4.5.0/examples/mayavi/mlab/boy.py0000644000076500000240000000206312747716313020610 0ustar prabhustaff00000000000000""" A script to generate the Mayavi logo: a Boy surface. The boy surface is a mathematical parametric surface, see http://en.wikipedia.org/wiki/Boy%27s_surface . We display it by sampling the two parameters of the surface on a grid and using the mlab's mesh function: :func:`mayavi.mlab.mesh`. """ # Author: Gael Varoquaux # Copyright (c) 2007, Enthought, Inc. # License: BSD Style. from numpy import sin, cos, mgrid, pi, sqrt from mayavi import mlab mlab.figure(fgcolor=(0, 0, 0), bgcolor=(1, 1, 1)) u, v = mgrid[- 0.035:pi:0.01, - 0.035:pi:0.01] X = 2 / 3. * (cos(u) * cos(2 * v) + sqrt(2) * sin(u) * cos(v)) * cos(u) / (sqrt(2) - sin(2 * u) * sin(3 * v)) Y = 2 / 3. * (cos(u) * sin(2 * v) - sqrt(2) * sin(u) * sin(v)) * cos(u) / (sqrt(2) - sin(2 * u) * sin(3 * v)) Z = -sqrt(2) * cos(u) * cos(u) / (sqrt(2) - sin(2 * u) * sin(3 * v)) S = sin(u) mlab.mesh(X, Y, Z, scalars=S, colormap='YlGnBu', ) # Nice view from the front mlab.view(.0, - 5.0, 4) mlab.show() mayavi-4.5.0/examples/mayavi/mlab/bunny.py0000644000076500000240000000214512747716313021153 0ustar prabhustaff00000000000000""" Viewing Stanford 3D Scanning Repository bunny model """ # Copyright (c) 2014-2015, Enthought, Inc. # Standard library imports import os from os.path import join # Enthought library imports from mayavi import mlab ### Download the bunny data, if not already on disk ############################ if not os.path.exists('bunny.tar.gz'): # Download the data try: from urllib import urlopen except ImportError: from urllib.request import urlopen print("Downloading bunny model, Please Wait (3MB)") opener = urlopen( 'http://graphics.stanford.edu/pub/3Dscanrep/bunny.tar.gz') open('bunny.tar.gz', 'wb').write(opener.read()) # Extract the data import tarfile bunny_tar_file = tarfile.open('bunny.tar.gz') try: os.mkdir('bunny_data') except: pass bunny_tar_file.extractall('bunny_data') bunny_tar_file.close() # Path to the bunny ply file bunny_ply_file = join('bunny_data', 'bunny', 'reconstruction', 'bun_zipper.ply') # Render the bunny ply file mlab.pipeline.surface(mlab.pipeline.open(bunny_ply_file)) mlab.show() import shutil shutil.rmtree('bunny_data') mayavi-4.5.0/examples/mayavi/mlab/canyon.py0000644000076500000240000000350512747716313021310 0ustar prabhustaff00000000000000""" Retrieve radar data from the NASA and plot a view of the Grand Canyon landscape. We cannot display the whole data, as it would be too big. To display more, see the canyon decimation example. This example is interesting as it shows how numpy can be used to load and crop data completly foreign to Mayavi. """ # Author: Gael Varoquaux # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. # Retrieve the grand Canyon topological data ################################## import os # Original file: #'ftp://e0srp01u.ecs.nasa.gov/srtm/version2/SRTM1/Region_04/N36W113.hgt.zip' if not os.path.exists('N36W113.hgt.zip'): # Download the data try: from urllib import urlopen except ImportError: from urllib.request import urlopen print('Downloading data, please wait (10M)') opener = urlopen( 'https://s3.amazonaws.com/storage.enthought.com/www/sample_data/N36W113.hgt.zip' ) open('N36W113.hgt.zip', 'wb').write(opener.read()) # Load the data (signed 2 byte integers, big endian) ########################## import zipfile import numpy as np data = np.fromstring(zipfile.ZipFile('N36W113.hgt.zip').read('N36W113.hgt'), '>i2') data.shape = (3601, 3601) data = data.astype(np.float32) # Plot an interesting section ################################################# from mayavi import mlab data = data[:1000, 900:1900] # Convert missing values into something more sensible. data[data == -32768] = data[data > 0].min() mlab.figure(size=(400, 320), bgcolor=(0.16, 0.28, 0.46)) mlab.surf(data, colormap='gist_earth', warp_scale=0.2, vmin=1200, vmax=1610) # The data takes a lot of memory, and the surf command has created a # copy. We free the inital memory. del data # A view of the canyon mlab.view(-5.9, 83, 570, [5.3, 20, 238]) mlab.show() mayavi-4.5.0/examples/mayavi/mlab/canyon_decimation.py0000644000076500000240000000647112747716313023511 0ustar prabhustaff00000000000000""" Use the greedy-terrain-decimator to display a decimated terrain view. This example illustrates decimating a terrain. We use the greedy-terrain-decimator to create a reduced mesh with an optimized grid that approximates the initial regular grid. The initial grid is displayed in white, and the optimized grid is displayed in black, with the surface it creates. The initial grid can be seen disappearing as it goes under the surface of the approximated grid: although the decimated mesh follows closely the orginal, it is not exactly the same. One can see that the reduction in number of polygons is huge: the white grid is much finer than the black grid. It is interesting to note that the decimated mesh follows closely the original mesh, including in number of polygons, in spots where the terrain changes most quickly. This example uses the Grand Canyon topological radar data, from NASA. The greedy-terrain-decimator is only useful to decimate a surface warped from 2D data. To decimated more general meshes, you can use the less-efficient decimate-pro filter (see :ref:`example_julia_set_decimation`). """ # Author: Gael Varoquaux # Copyright (c) 2008-2015, Enthought, Inc. # License: BSD Style. # Retrieve the grand Canyon topological data ################################### # Original file: #'ftp://e0srp01u.ecs.nasa.gov/srtm/version2/SRTM1/Region_04/N36W113.hgt.zip' import os if not os.path.exists('N36W113.hgt.zip'): # Download the data try: from urllib import urlopen except ImportError: from urllib.request import urlopen print('Downloading data, please wait (10M)') opener = urlopen( 'https://s3.amazonaws.com/storage.enthought.com/www/sample_data/N36W113.hgt.zip' ) open('N36W113.hgt.zip', 'wb').write(opener.read()) # Load the data (signed 2 byte integers, big endian) ########################### import zipfile import numpy as np data = np.fromstring(zipfile.ZipFile('N36W113.hgt.zip').read('N36W113.hgt'), '>i2') data.shape = (3601, 3601) data = data[200:400, 1200:1400] data = data.astype(np.float32) # Plot an interecting section ################################################## from mayavi import mlab mlab.figure(1, size=(450, 390)) mlab.clf() data = mlab.pipeline.array2d_source(data) # Use a greedy_terrain_decimation to created a decimated mesh terrain = mlab.pipeline.greedy_terrain_decimation(data) terrain.filter.error_measure = 'number_of_triangles' terrain.filter.number_of_triangles = 5000 terrain.filter.compute_normals = True # Plot it black the lines of the mesh lines = mlab.pipeline.surface(terrain, color=(0, 0, 0), representation='wireframe') # The terrain decimator has done the warping. We control the warping # scale via the actor's scale. lines.actor.actor.scale = [1, 1, 0.2] # Display the surface itself. surf = mlab.pipeline.surface(terrain, colormap='gist_earth', vmin=1450, vmax=1650) surf.actor.actor.scale = [1, 1, 0.2] # Display the original regular grid. This time we have to use a # warp_scalar filter. warp = mlab.pipeline.warp_scalar(data, warp_scale=0.2) grid = mlab.pipeline.surface(warp, color=(1, 1, 1), representation='wireframe') mlab.view(-17, 46, 143, [1.46, 8.46, 269.4]) mlab.show() mayavi-4.5.0/examples/mayavi/mlab/chemistry.py0000644000076500000240000000541712747716313022034 0ustar prabhustaff00000000000000""" In this example, we display the H2O molecule, and use volume rendering to display the electron localization function. The atoms and the bounds are displayed using mlab.points3d and mlab.plot3d, with scalar information to control the color. The electron localization function is displayed using volume rendering. Good use of the `vmin` and `vmax` argument to `mlab.pipeline.volume` is critical to achieve a good visualization: the `vmin` threshold should placed high-enough for features to stand out. The original is an electron localization function from Axel Kohlmeyer. """ # Author: Gael Varoquaux # Copyright (c) 2008-2015, Enthought, Inc. # License: BSD Style. # Retrieve the electron localization data for H2O ############################# import os if not os.path.exists('h2o-elf.cube'): # Download the data try: from urllib import urlopen except ImportError: from urllib.request import urlopen print('Downloading data, please wait') opener = urlopen( 'http://code.enthought.com/projects/mayavi/data/h2o-elf.cube' ) open('h2o-elf.cube', 'wb').write(opener.read()) # Plot the atoms and the bonds ################################################ import numpy as np from mayavi import mlab mlab.figure(1, bgcolor=(0, 0, 0), size=(350, 350)) mlab.clf() # The position of the atoms atoms_x = np.array([2.9, 2.9, 3.8]) * 40 / 5.5 atoms_y = np.array([3.0, 3.0, 3.0]) * 40 / 5.5 atoms_z = np.array([3.8, 2.9, 2.7]) * 40 / 5.5 O = mlab.points3d(atoms_x[1:-1], atoms_y[1:-1], atoms_z[1:-1], scale_factor=3, resolution=20, color=(1, 0, 0), scale_mode='none') H1 = mlab.points3d(atoms_x[:1], atoms_y[:1], atoms_z[:1], scale_factor=2, resolution=20, color=(1, 1, 1), scale_mode='none') H2 = mlab.points3d(atoms_x[-1:], atoms_y[-1:], atoms_z[-1:], scale_factor=2, resolution=20, color=(1, 1, 1), scale_mode='none') # The bounds between the atoms, we use the scalar information to give # color mlab.plot3d(atoms_x, atoms_y, atoms_z, [1, 2, 1], tube_radius=0.4, colormap='Reds') # Display the electron localization function ################################## # Load the data, we need to remove the first 8 lines and the '\n' str = ' '.join(file('h2o-elf.cube').readlines()[9:]) data = np.fromstring(str, sep=' ') data.shape = (40, 40, 40) source = mlab.pipeline.scalar_field(data) min = data.min() max = data.max() vol = mlab.pipeline.volume(source, vmin=min + 0.65 * (max - min), vmax=min + 0.9 * (max - min)) mlab.view(132, 54, 45, [21, 20, 21.5]) mlab.show() mayavi-4.5.0/examples/mayavi/mlab/custom_colormap.py0000644000076500000240000000327212747716313023230 0ustar prabhustaff00000000000000""" An example showing how a custom colormap (or look up table) can be used for a given object. Although the end user specifies colormaps by giving the name of a set of predefined colormaps, Mayavi (and VTK) deal with color internally using 'Look Up Tables' (LUT): a table that associate a scalar value to a color defined by its RGBA components. In this example, we show how the LUT of an object can be retrieved and modified. Specificaly, we start by giving a surf object the 'cool' colormap, but we modify add to add a transparency effect. Notice in the resulting image how the surface becomes more transparent for its lower points. Note that if you want to use a different number of colors, you can change the 'number_of_colors' attribute of the lut object and assign a new array of the right shape to its 'table' attribute. """ # Create some data import numpy as np x, y = np.mgrid[-10:10:200j, -10:10:200j] z = 100 * np.sin(x * y) / (x * y) # Visualize it with mlab.surf from mayavi import mlab mlab.figure(bgcolor=(1, 1, 1)) surf = mlab.surf(z, colormap='cool') # Retrieve the LUT of the surf object. lut = surf.module_manager.scalar_lut_manager.lut.table.to_array() # The lut is a 255x4 array, with the columns representing RGBA # (red, green, blue, alpha) coded with integers going from 0 to 255. # We modify the alpha channel to add a transparency gradient lut[:, -1] = np.linspace(0, 255, 256) # and finally we put this LUT back in the surface object. We could have # added any 255*4 array rather than modifying an existing LUT. surf.module_manager.scalar_lut_manager.lut.table = lut # We need to force update of the figure now that we have changed the LUT. mlab.draw() mlab.view(40, 85) mlab.show() mayavi-4.5.0/examples/mayavi/mlab/dragon.py0000644000076500000240000000216712747716313021276 0ustar prabhustaff00000000000000""" Viewing Stanford 3D Scanning Repository dragon model """ # Copyright (c) 2014-2015, Enthought, Inc. # Standard library imports import os from os.path import join # Enthought library imports from mayavi import mlab ### Download the dragon data, if not already on disk ############################ if not os.path.exists('dragon.tar.gz'): # Download the data try: from urllib import urlopen except ImportError: from urllib.request import urlopen print("Downloading dragon model, Please Wait (11MB)") opener = urlopen( 'http://graphics.stanford.edu/pub/3Dscanrep/dragon/dragon_recon.tar.gz') open('dragon.tar.gz', 'wb').write(opener.read()) # Extract the data import tarfile dragon_tar_file = tarfile.open('dragon.tar.gz') try: os.mkdir('dragon_data') except: pass dragon_tar_file.extractall('dragon_data') dragon_tar_file.close() # Path to the dragon ply file dragon_ply_file = join('dragon_data', 'dragon_recon', 'dragon_vrip.ply') # Render the dragon ply file mlab.pipeline.surface(mlab.pipeline.open(dragon_ply_file)) mlab.show() import shutil shutil.rmtree('dragon_data') mayavi-4.5.0/examples/mayavi/mlab/flight_graph.py0000644000076500000240000001450112747716313022455 0ustar prabhustaff00000000000000""" An example showing a graph display between cities positionned on the Earth surface. This graph displays the longest fligh routes operated by Boing 777. The two main interests of this example are that it shows how to build a graph of arbitrary connectivity, and that it shows how to position data on the surface of the Earth. The graph is created by first building a scalar scatter dataset with the mlab.points3d command, and adding line information to it. One of the difficulties is that the lines are specified using the indexing number of the points, so we must 'massage' our data when loading it. A similar technique to plot the graph is done in the :ref:`example_protein`. Another example of graph plotting, showing a different technique to plot the graph, can be seen on :ref:`example_delaunay_graph`. To simplify things we do not plot the connection on the surface of the Earth, but as straight lines going throught the Earth. As a result must use transparency to show the connection. Data source: http://www.777fleetpage.com/777fleetpage3.htm """ ############################################################################### # The data. This could be loaded from a file, or scraped from a website routes_data = """ Bombay,Atlanta Johannesburg,Atlanta Dubai,Los Angeles Dubai,Houston Dubai,San Francisco New York,Hong Kong Newark,Hong Kong Doha,Houston Toronto,Hong Kong Bombay,Newark Bombay,New York Vancouver,Hong Kong Dubai,Sao Paulo Los Angeles,Sydney Chicago,Delhi """ cities_data = """ Toronto,-79.38,43.65 Chicago,-87.68,41.84 Houston,-95.39,29.77 New York,-73.94,40.67 Vancouver,-123.13,49.28 Los Angeles,-118.41,34.11 San Francisco,-122.45,37.77 Atlanta,-84.42,33.76 Dubai,55.33,25.27 Sydney,151.21,-33.87 Hong Kong,114.19,22.38 Bombay,72.82,18.96 Delhi,77.21,28.67 Newark,-82.43,40.04 Johannesburg,28.04,-26.19 Doha,51.53,25.29 Sao Paulo,-46.63,-23.53 """ ############################################################################### # Load the data, and put it in data structures we can use import csv routes_table = [i for i in csv.reader(routes_data.split('\n')[1:-1])] # Build a dictionnary returning GPS coordinates for each city cities_coord = dict() for line in list(csv.reader(cities_data.split('\n')))[1:-1]: name, long_, lat = line cities_coord[name] = (float(long_), float(lat)) # Store all the coordinates of connected cities in a list also keep # track of which city corresponds to a given index in the list. The # connectivity information is specified as connecting the i-th point # with the j-th. cities = dict() coords = list() connections = list() for city1, city2 in routes_table[1:-1]: if not city1 in cities: cities[city1] = len(coords) coords.append(cities_coord[city1]) if not city2 in cities: cities[city2] = len(coords) coords.append(cities_coord[city2]) connections.append((cities[city1], cities[city2])) ############################################################################### from mayavi import mlab mlab.figure(1, bgcolor=(0.48, 0.48, 0.48), fgcolor=(0, 0, 0), size=(400, 400)) mlab.clf() ############################################################################### # Display points at city positions import numpy as np coords = np.array(coords) # First we have to convert latitude/longitude information to 3D # positioning. lat, long = coords.T * np.pi / 180 x = np.cos(long) * np.cos(lat) y = np.cos(long) * np.sin(lat) z = np.sin(long) points = mlab.points3d(x, y, z, scale_mode='none', scale_factor=0.03, color=(0, 0, 1)) ############################################################################### # Display connections between cities connections = np.array(connections) # We add lines between the points that we have previously created by # directly modifying the VTK dataset. points.mlab_source.dataset.lines = connections points.mlab_source.reset() # To represent the lines, we use the surface module. Using a wireframe # representation allows to control the line-width. mlab.pipeline.surface(points, color=(1, 1, 1), representation='wireframe', line_width=4, name='Connections') ############################################################################### # Display city names for city, index in cities.items(): label = mlab.text(x[index], y[index], city, z=z[index], width=0.016 * len(city), name=city) label.property.shadow = True ############################################################################### # Display continents outline, using the VTK Builtin surface 'Earth' from mayavi.sources.builtin_surface import BuiltinSurface continents_src = BuiltinSurface(source='earth', name='Continents') # The on_ratio of the Earth source controls the level of detail of the # continents outline. continents_src.data_source.on_ratio = 2 continents = mlab.pipeline.surface(continents_src, color=(0, 0, 0)) ############################################################################### # Display a semi-transparent sphere, for the surface of the Earth # We use a sphere Glyph, throught the points3d mlab function, rather than # building the mesh ourselves, because it gives a better transparent # rendering. sphere = mlab.points3d(0, 0, 0, scale_mode='none', scale_factor=2, color=(0.67, 0.77, 0.93), resolution=50, opacity=0.7, name='Earth') # These parameters, as well as the color, where tweaked through the GUI, # with the record mode to produce lines of code usable in a script. sphere.actor.property.specular = 0.45 sphere.actor.property.specular_power = 5 # Backface culling is necessary for more a beautiful transparent # rendering. sphere.actor.property.backface_culling = True ############################################################################### # Plot the equator and the tropiques theta = np.linspace(0, 2 * np.pi, 100) for angle in (- np.pi / 6, 0, np.pi / 6): x = np.cos(theta) * np.cos(angle) y = np.sin(theta) * np.cos(angle) z = np.ones_like(theta) * np.sin(angle) mlab.plot3d(x, y, z, color=(1, 1, 1), opacity=0.2, tube_radius=None) mlab.view(63.4, 73.8, 4, [-0.05, 0, 0]) mlab.show() mayavi-4.5.0/examples/mayavi/mlab/julia_set.py0000644000076500000240000000150012747716313021771 0ustar prabhustaff00000000000000""" An example showing the Julia set displayed as a z-warped surface. The Julia set is a fractal (see http://en.wikipedia.org/wiki/Julia_set ). We display it here in a canyon-like view using mlab's surf function: :func:`mayavi.mlab.surf`. """ # Author: Gael Varoquaux # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. from mayavi import mlab import numpy as np # Calculate the Julia set on a grid x, y = np.ogrid[-1.5:0.5:500j, -1:1:500j] z = x + 1j * y julia = np.zeros(z.shape) for i in range(50): z = z ** 2 - 0.70176 - 0.3842j julia += 1 / float(2 + i) * (z * np.conj(z) > 4) # Display it mlab.figure(size=(400, 300)) mlab.surf(julia, colormap='gist_earth', warp_scale='auto', vmax=1.5) # A view into the "Canyon" mlab.view(65, 27, 322, [30., -13.7, 136]) mlab.show() mayavi-4.5.0/examples/mayavi/mlab/julia_set_decimation.py0000644000076500000240000000446012747716313024175 0ustar prabhustaff00000000000000""" The Julia set, but with a decimated mesh: unecessary triangles due to the initial grid and not matching the geometry of the Julia set are removed. We first build the mesh, applying a warp_scalar filter to a array2d_source, to warp the Julia set along the z direction. Then when have to convert the rectangles in the mesh to triangles, in order to apply the decimate_pro filter. This filter does the decimation, and we can represent the result using surface modules. The triangle-generation filter generates warnings: some polygons are degenerate, as the grid has subdivided flat parts of the Julia set. We have shown in white the decimated mesh, and in black the non-decimated one. The view is zoom to the center of the Julia set. If you turn of the wireframes and zoom out, you can appreciate the quality of the decimation. In the specific case of decimating a surface warped from 2D data, it is more efficient to use the greedy-terrain-decimator, see the :ref:`example_canyon_decimation`. """ # Author: Gael Varoquaux # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. from mayavi import mlab import numpy as np # Calculate the Julia set on a grid x, y = np.ogrid[-1.5:0.5:500j, -1:1:500j] z = x + 1j * y julia = np.zeros(z.shape) for i in range(50): z = z ** 2 - 0.70176 - 0.3842j julia += 1 / float(2 + i) * (z * np.conj(z) > 4) mlab.figure(size=(400, 300)) # Create the mesh mesh = mlab.pipeline.warp_scalar(mlab.pipeline.array2d_source(julia), warp_scale=100) # The decimate_pro filter works only on triangles. We need to apply the # triangle_filter before applying decimate_pro. dec = mlab.pipeline.decimate_pro(mlab.pipeline.triangle_filter(mesh)) # Set a very low feature_angle, so that the decimate_pro detects dec.filter.feature_angle = 1 dec.filter.target_reduction = 0.5 # We display the lines of decimated mesh in white mlab.pipeline.surface(dec, representation='wireframe', line_width=3, color=(1, 1, 1)) # The decimated mesh itself. mlab.pipeline.surface(dec, colormap='gist_earth', vmin=-0.1, vmax=0.4) # The lines of the non-decimated mesh, in black, for comparisation. mlab.pipeline.surface(mesh, representation='wireframe', color=(0, 0, 0)) mlab.view(-66, 25, 9.7, [-5.8, -54.5, 18.4]) mlab.show() mayavi-4.5.0/examples/mayavi/mlab/lorenz.py0000644000076500000240000000342712747716313021335 0ustar prabhustaff00000000000000""" An example displaying the trajectories for the Lorenz system of equations along with the z-nullcline. The vector field of the Lorenz system flow is integrated to display trajectories using mlab's flow function: :func:`mayavi.mlab.flow`. The z-nullcline is plotted by extracting the z component of the vector field data source with the ExtractVectorComponent filter, and applying an IsoSurface module on this scalar component. """ # Author: Prabhu Ramachandran # Copyright (c) 2008-2009, Enthought, Inc. # License: BSD Style. import numpy from mayavi import mlab def lorenz(x, y, z, s=10., r=28., b=8. / 3.): """The Lorenz system.""" u = s * (y - x) v = r * x - y - x * z w = x * y - b * z return u, v, w # Sample the space in an interesting region. x, y, z = numpy.mgrid[-50:50:100j, -50:50:100j, -10:60:70j] u, v, w = lorenz(x, y, z) fig = mlab.figure(size=(400, 300), bgcolor=(0, 0, 0)) # Plot the flow of trajectories with suitable parameters. f = mlab.flow(x, y, z, u, v, w, line_width=3, colormap='Paired') f.module_manager.scalar_lut_manager.reverse_lut = True f.stream_tracer.integration_direction = 'both' f.stream_tracer.maximum_propagation = 200 # Uncomment the following line if you want to hide the seed: #f.seed.widget.enabled = False # Extract the z-velocity from the vectors and plot the 0 level set # hence producing the z-nullcline. src = f.mlab_source.m_data e = mlab.pipeline.extract_vector_components(src) e.component = 'z-component' zc = mlab.pipeline.iso_surface(e, opacity=0.5, contours=[0, ], color=(0.6, 1, 0.2)) # When using transparency, hiding 'backface' triangles often gives better # results zc.actor.property.backface_culling = True # A nice view of the plot. mlab.view(140, 120, 113, [0.65, 1.5, 27]) mlab.show() mayavi-4.5.0/examples/mayavi/mlab/lucy.py0000644000076500000240000000206112747716313020771 0ustar prabhustaff00000000000000""" Viewing Stanford 3D Scanning Repository lucy model """ # Copyright (c) 2014-2015, Enthought, Inc. # Standard library imports import os from os.path import join # Enthought library imports from mayavi import mlab ### Download the lucy data, if not already on disk ############################ if not os.path.exists('lucy.tar.gz'): # Download the data try: from urllib import urlopen except ImportError: from urllib.request import urlopen print("Downloading lucy model, Please Wait (307MB)") opener = urlopen( 'http://graphics.stanford.edu/data/3Dscanrep/lucy.tar.gz') open('lucy.tar.gz', 'wb').write(opener.read()) # Extract the data import tarfile lucy_tar_file = tarfile.open('lucy.tar.gz') try: os.mkdir('lucy_data') except: pass lucy_tar_file.extractall('lucy_data') lucy_tar_file.close() # Path to the lucy ply file lucy_ply_file = join('lucy_data', 'lucy.ply') # Render the lucy ply file mlab.pipeline.surface(mlab.pipeline.open(lucy_ply_file)) mlab.show() import shutil shutil.rmtree('lucy_data') mayavi-4.5.0/examples/mayavi/mlab/magnetic_field_lines.py0000644000076500000240000000610312747716313024142 0ustar prabhustaff00000000000000""" This example uses the streamline module to display field lines of a magnetic dipole (a current loop). This example requires scipy. The magnetic field from an arbitrary current loop is calculated from eqns (1) and (2) in Phys Rev A Vol. 35, N 4, pp. 1535-1546; 1987. To get a prettier result, we use a fairly large grid to sample the field. As a consequence, we need to clear temporary arrays as soon as possible. For a more thorough example of magnetic field calculation and visualization with Mayavi and scipy, see :ref:`example_magnetic_field`. """ # Author: Gael Varoquaux # Copyright (c) 2007, Enthought, Inc. # License: BSD Style. import numpy as np from scipy import special #### Calculate the field #################################################### radius = 1 # Radius of the coils x, y, z = [e.astype(np.float32) for e in np.ogrid[-10:10:150j, -10:10:150j, -10:10:150j]] # express the coordinates in polar form rho = np.sqrt(x ** 2 + y ** 2) x_proj = x / rho y_proj = y / rho # Free memory early del x, y E = special.ellipe((4 * radius * rho) / ((radius + rho) ** 2 + z ** 2)) K = special.ellipk((4 * radius * rho) / ((radius + rho) ** 2 + z ** 2)) Bz = 1 / np.sqrt((radius + rho) ** 2 + z ** 2) * ( K + E * (radius ** 2 - rho ** 2 - z ** 2) / ((radius - rho) ** 2 + z ** 2) ) Brho = z / (rho * np.sqrt((radius + rho) ** 2 + z ** 2)) * ( - K + E * (radius ** 2 + rho ** 2 + z ** 2) / ((radius - rho) ** 2 + z ** 2) ) del E, K, z, rho # On the axis of the coil we get a divided by zero. This returns a # NaN, where the field is actually zero : Brho[np.isnan(Brho)] = 0 Bx, By = x_proj * Brho, y_proj * Brho del x_proj, y_proj, Brho #### Visualize the field #################################################### from mayavi import mlab fig = mlab.figure(1, size=(400, 400), bgcolor=(1, 1, 1), fgcolor=(0, 0, 0)) field = mlab.pipeline.vector_field(Bx, By, Bz) # Unfortunately, the above call makes a copy of the arrays, so we delete # this copy to free memory. del Bx, By, Bz magnitude = mlab.pipeline.extract_vector_norm(field) contours = mlab.pipeline.iso_surface(magnitude, contours=[0.01, 0.8, 3.8, ], transparent=True, opacity=0.4, colormap='YlGnBu', vmin=0, vmax=2) field_lines = mlab.pipeline.streamline(magnitude, seedtype='line', integration_direction='both', colormap='bone', vmin=0, vmax=1) # Tweak a bit the streamline. field_lines.stream_tracer.maximum_propagation = 100. field_lines.seed.widget.point1 = [69, 75.5, 75.5] field_lines.seed.widget.point2 = [82, 75.5, 75.5] field_lines.seed.widget.resolution = 50 field_lines.seed.widget.enabled = False mlab.view(42, 73, 104, [79, 75, 76]) mlab.show() mayavi-4.5.0/examples/mayavi/mlab/mri.py0000644000076500000240000000724712747716313020617 0ustar prabhustaff00000000000000""" Viewing MRI data with cut plane and iso surface. This example downloads an MRI scan, turns it into a 3D numpy array and visualizes it. First we extract some internal structures of the brain by defining a volume of interest around them, and using iso surfaces. Then we display two cut planes to show the raw MRI data itself. Finally we display the outer surface, but we restrict it to volume of interest to leave a cut for the cut planes. For an example of feature extraction from MRI data using Mayavi and vtk, see :ref:`example_tvtk_segmentation`. """ ### Download the data, if not already on disk ################################# import os if not os.path.exists('MRbrain.tar.gz'): # Download the data try: from urllib import urlopen except ImportError: from urllib.request import urlopen print("Downloading data, Please Wait (7.8MB)") opener = urlopen( 'http://graphics.stanford.edu/data/voldata/MRbrain.tar.gz') open('MRbrain.tar.gz', 'wb').write(opener.read()) # Extract the data import tarfile tar_file = tarfile.open('MRbrain.tar.gz') try: os.mkdir('mri_data') except: pass tar_file.extractall('mri_data') tar_file.close() ### Read the data in a numpy 3D array ######################################### import numpy as np data = np.array([np.fromfile(os.path.join('mri_data', 'MRbrain.%i' % i), dtype='>u2') for i in range(1, 110)]) data.shape = (109, 256, 256) data = data.T # Display the data ############################################################ from mayavi import mlab mlab.figure(bgcolor=(0, 0, 0), size=(400, 400)) src = mlab.pipeline.scalar_field(data) # Our data is not equally spaced in all directions: src.spacing = [1, 1, 1.5] src.update_image_data = True # Extract some inner structures: the ventricles and the inter-hemisphere # fibers. We define a volume of interest (VOI) that restricts the # iso-surfaces to the inner of the brain. We do this with the ExtractGrid # filter. blur = mlab.pipeline.user_defined(src, filter='ImageGaussianSmooth') voi = mlab.pipeline.extract_grid(blur) voi.set(x_min=125, x_max=193, y_min=92, y_max=125, z_min=34, z_max=75) mlab.pipeline.iso_surface(voi, contours=[1610, 2480], colormap='Spectral') # Add two cut planes to show the raw MRI data. We use a threshold filter # to remove cut the planes outside the brain. thr = mlab.pipeline.threshold(src, low=1120) cut_plane = mlab.pipeline.scalar_cut_plane(thr, plane_orientation='y_axes', colormap='black-white', vmin=1400, vmax=2600) cut_plane.implicit_plane.origin = (136, 111.5, 82) cut_plane.implicit_plane.widget.enabled = False cut_plane2 = mlab.pipeline.scalar_cut_plane(thr, plane_orientation='z_axes', colormap='black-white', vmin=1400, vmax=2600) cut_plane2.implicit_plane.origin = (136, 111.5, 82) cut_plane2.implicit_plane.widget.enabled = False # Extract two views of the outside surface. We need to define VOIs in # order to leave out a cut in the head. voi2 = mlab.pipeline.extract_grid(src) voi2.set(y_min=112) outer = mlab.pipeline.iso_surface(voi2, contours=[1776, ], color=(0.8, 0.7, 0.6)) voi3 = mlab.pipeline.extract_grid(src) voi3.set(y_max=112, z_max=53) outer3 = mlab.pipeline.iso_surface(voi3, contours=[1776, ], color=(0.8, 0.7, 0.6)) mlab.view(-125, 54, 326, (145.5, 138, 66.5)) mlab.roll(-175) mlab.show() import shutil shutil.rmtree('mri_data') mayavi-4.5.0/examples/mayavi/mlab/plotting_many_lines.py0000644000076500000240000000533112747716313024076 0ustar prabhustaff00000000000000""" This examples shows how many lines can be grouped together in a single object, for convenience and efficiency. We want to plot a large number of lines. We could use mlab.plot3d for this, but it will create an object for each line, this will be inefficient. This example shows how to create one object comprised of many lines. The underlying idea is the same as that used to plot graphes (see for instance :ref:`example_flight_graph`): create a set of points, and specify explicitely the connectivity between them. First we create the set of unconnected point (the underlying data structure is a :ref:`poly_data`) using `mlab.pipeline.scalar_scatter`. To add the connections, we need to keep track of which point is connected to which. As we only have lines, this is fairly easy: in a line, each point is connected to the following one. """ # Author: Gael Varoquaux # Copyright (c) 2010, Enthought # License: BSD style import numpy as np # The number of points per line N = 300 # The scalar parameter for each line t = np.linspace(-2 * np.pi, 2 * np.pi, N) from mayavi import mlab mlab.figure(1, size=(400, 400), bgcolor=(0, 0, 0)) mlab.clf() # We create a list of positions and connections, each describing a line. # We will collapse them in one array before plotting. x = list() y = list() z = list() s = list() connections = list() # The index of the current point in the total amount of points index = 0 # Create each line one after the other in a loop for i in range(50): x.append(np.sin(t)) y.append(np.cos((2 + .02 * i) * t)) z.append(np.cos((3 + .02 * i) * t)) s.append(t) # This is the tricky part: in a line, each point is connected # to the one following it. We have to express this with the indices # of the final set of points once all lines have been combined # together, this is why we need to keep track of the total number of # points already created (index) connections.append(np.vstack( [np.arange(index, index + N - 1.5), np.arange(index + 1, index + N - .5)] ).T) index += N # Now collapse all positions, scalars and connections in big arrays x = np.hstack(x) y = np.hstack(y) z = np.hstack(z) s = np.hstack(s) connections = np.vstack(connections) # Create the points src = mlab.pipeline.scalar_scatter(x, y, z, s) # Connect them src.mlab_source.dataset.lines = connections src.update() # The stripper filter cleans up connected lines lines = mlab.pipeline.stripper(src) # Finally, display the set of lines mlab.pipeline.surface(lines, colormap='Accent', line_width=1, opacity=.4) # And choose a nice view mlab.view(33.6, 106, 5.5, [0, 0, .05]) mlab.roll(125) mlab.show() mayavi-4.5.0/examples/mayavi/mlab/protein.py0000644000076500000240000001144012747716313021476 0ustar prabhustaff00000000000000""" Visualize a protein graph structure downloaded from the protein database in standard pdb format. We parse the pdb file, but extract only a very small amount of information: the type of atoms, their positions, and the links between them. Most of the complexity of this example comes from the code turning the PDB information into a list of 3D positions, with associated scalar and connection information. We assign a scalar value for the atoms to differenciate the different types of atoms, but it does not correspond to the atomic mass. The size and the color of the atom on the visualization is therefore not chemicaly-significant. The atoms are plotted using mlab.points3d, and connections between atoms are added to the dataset, and visualized using a surface module. The graph is created by adding connection information to points. For this, each point is designated by its number (in the order of the array passed to mlab.points3d), and the connection array, made of pairs of these numbers, is constructed. There is some slightly tedious data manipulation to go from the named-node graph representation as stored in the pdb file, to the index-based connection pairs. A similar technique to plot the graph is done in the :ref:`example_flight_graph`. Another example of graph plotting, showing a different technique to plot the graph, can be seen on :ref:`example_delaunay_graph`. To visualize the local atomic density, we use a gaussian splatter filter that builds a kernel density estimation of the continuous density field: each point is convoluted by a Gaussian kernel, and the sum of these Gaussians form the resulting density field. We visualize this field using volume rendering. Reference for the pdb file standard: http://mmcif.pdb.org/dictionaries/pdb-correspondence/pdb2mmcif.html """ # Author: Gael Varoquaux # Copyright (c) 2008-2015, Enthought, Inc. # License: BSD Style. # The pdb code for the protein. protein_code = '2q09' # Retrieve the file from the protein database ################################# import os if not os.path.exists('pdb%s.ent.gz' % protein_code): # Download the data try: from urllib import urlopen except ImportError: from urllib.request import urlopen print('Downloading protein data, please wait') opener = urlopen( 'ftp://ftp.wwpdb.org/pub/pdb/data/structures/divided/pdb/q0/pdb%s.ent.gz' % protein_code) open('pdb%s.ent.gz' % protein_code, 'wb').write(opener.read()) # Parse the pdb file ########################################################## import gzip infile = gzip.GzipFile('pdb%s.ent.gz' % protein_code, 'rb') # A graph represented by a dictionary associating nodes with keys # (numbers), and edges (pairs of node keys). nodes = dict() edges = list() atoms = set() # Build the graph from the PDB information last_atom_label = None last_chain_label = None for line in infile: line = line.split() if line[0] in ('ATOM', 'HETATM'): nodes[line[1]] = (line[2], line[6], line[7], line[8]) atoms.add(line[2]) chain_label = line[5] if chain_label == last_chain_label: edges.append((line[1], last_atom_label)) last_atom_label = line[1] last_chain_label = chain_label elif line[0] == 'CONECT': for start, stop in zip(line[1:-1], line[2:]): edges.append((start, stop)) atoms = list(atoms) atoms.sort() atoms = dict(zip(atoms, range(len(atoms)))) # Turn the graph into 3D positions, and a connection list. labels = dict() x = list() y = list() z = list() scalars = list() for index, label in enumerate(nodes): labels[label] = index this_scalar, this_x, this_y, this_z = nodes[label] scalars.append(atoms[this_scalar]) x.append(float(this_x)) y.append(float(this_y)) z.append(float(this_z)) connections = list() for start, stop in edges: connections.append((labels[start], labels[stop])) import numpy as np x = np.array(x) y = np.array(y) z = np.array(z) scalars = np.array(scalars) # Visualize the data ########################################################## from mayavi import mlab mlab.figure(1, bgcolor=(0, 0, 0)) mlab.clf() pts = mlab.points3d(x, y, z, 1.5 * scalars.max() - scalars, scale_factor=0.015, resolution=10) pts.mlab_source.dataset.lines = np.array(connections) # Update the pipeline since the connectivity has changed. pts.mlab_source.update() # Use a tube fiter to plot tubes on the link, varying the radius with the # scalar value tube = mlab.pipeline.tube(pts, tube_radius=0.15) tube.filter.radius_factor = 1. tube.filter.vary_radius = 'vary_radius_by_scalar' mlab.pipeline.surface(tube, color=(0.8, 0.8, 0)) # Visualize the local atomic density mlab.pipeline.volume(mlab.pipeline.gaussian_splatter(pts)) mlab.view(49, 31.5, 52.8, (4.2, 37.3, 20.6)) mlab.show() mayavi-4.5.0/examples/mayavi/mlab/simple_structured_grid.py0000644000076500000240000000426012747716313024602 0ustar prabhustaff00000000000000""" An example creating a structured grid data set from numpy arrays using TVTK and visualizing it using mlab. In this example, we create a structured-grid data set: we describe data, both scalar and vector, lying on a structured-grid, ie a grid where each vertex has 6 neighboors. For this we directly create a StructuredGrid tvtk object, rather than using the mlab.pipeline source functions, as it gives us more control. To visualize the resulting dataset, we apply several modules, using the mlab.pipeline interface (see :ref:`controlling-the-pipeline-with-mlab-scripts`) """ # Author: Prabhu Ramachandran # Copyright (c) 2008, Prabhu Ramachandran. # License: BSD Style. from numpy import mgrid, empty, sin, pi from tvtk.api import tvtk from mayavi import mlab # Generate some points. x, y, z = mgrid[1:6:11j, 0:4:13j, 0:3:6j] base = x[..., 0] + y[..., 0] # Some interesting z values. for i in range(z.shape[2]): z[..., i] = base * 0.25 * i # The actual points. pts = empty(z.shape + (3,), dtype=float) pts[..., 0] = x pts[..., 1] = y pts[..., 2] = z # Simple scalars. scalars = x * x + y * y + z * z # Some vectors vectors = empty(z.shape + (3,), dtype=float) vectors[..., 0] = (4 - y * 2) vectors[..., 1] = (x * 3 - 12) vectors[..., 2] = sin(z * pi) # We reorder the points, scalars and vectors so this is as per VTK's # requirement of x first, y next and z last. pts = pts.transpose(2, 1, 0, 3).copy() pts.shape = pts.size / 3, 3 scalars = scalars.T.copy() vectors = vectors.transpose(2, 1, 0, 3).copy() vectors.shape = vectors.size / 3, 3 # Create the dataset. sg = tvtk.StructuredGrid(dimensions=x.shape, points=pts) sg.point_data.scalars = scalars.ravel() sg.point_data.scalars.name = 'temperature' sg.point_data.vectors = vectors sg.point_data.vectors.name = 'velocity' # Thats it! # Now visualize the data. d = mlab.pipeline.add_dataset(sg) gx = mlab.pipeline.grid_plane(d) gy = mlab.pipeline.grid_plane(d) gy.grid_plane.axis = 'y' gz = mlab.pipeline.grid_plane(d) gz.grid_plane.axis = 'z' iso = mlab.pipeline.iso_surface(d) iso.contour.maximum_contour = 75.0 vec = mlab.pipeline.vectors(d) vec.glyph.mask_input_points = True vec.glyph.glyph.scale_factor = 1.5 mlab.show() mayavi-4.5.0/examples/mayavi/mlab/spherical_harmonics.py0000644000076500000240000000253512747716313024040 0ustar prabhustaff00000000000000""" Plot spherical harmonics on the surface of the sphere, as well as a 3D polar plot. This example requires scipy. In this example we use the mlab's mesh function: :func:`mayavi.mlab.mesh`. For plotting surfaces this is a very versatile function. The surfaces can be defined as functions of a 2D grid. For each spherical harmonic, we plot its value on the surface of a sphere, and then in polar. The polar plot is simply obtained by varying the radius of the previous sphere. """ # Author: Gael Varoquaux # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. from mayavi import mlab import numpy as np from scipy.special import sph_harm # Create a sphere r = 0.3 pi = np.pi cos = np.cos sin = np.sin phi, theta = np.mgrid[0:pi:101j, 0:2 * pi:101j] x = r * sin(phi) * cos(theta) y = r * sin(phi) * sin(theta) z = r * cos(phi) mlab.figure(1, bgcolor=(1, 1, 1), fgcolor=(0, 0, 0), size=(400, 300)) mlab.clf() # Represent spherical harmonics on the surface of the sphere for n in range(1, 6): for m in range(n): s = sph_harm(m, n, theta, phi).real mlab.mesh(x - m, y - n, z, scalars=s, colormap='jet') s[s < 0] *= 0.97 s /= s.max() mlab.mesh(s * x - m, s * y - n, s * z + 1.3, scalars=s, colormap='Spectral') mlab.view(90, 70, 6.2, (-1.3, -2.9, 0.25)) mlab.show() mayavi-4.5.0/examples/mayavi/mlab/surface_from_irregular_data.py0000644000076500000240000000332712747716313025543 0ustar prabhustaff00000000000000""" An example which shows how to plot a surface from data acquired irregularly. Data giving the variation of a parameter 'z' as a function of two others ('x' and 'y') is often plotted as a `carpet plot`, using a surface to visualize the underlying function. when the data has been acquired on a regular grid for parameters 'x' and 'y', it can simply be view with the mlab.surf function. However, when there are some missing points, or the data has been acquired at random, the surf function cannot be used. The difficulty stems from the fact that points positionned in 3D do not define a surface if no connectivity information is given. With the surf function, this information is implicite from the shape of the input arrays. In this example, randomly-positionned points in the (x, y) plane are embedded in a surface in the z axis. We first visualize the points using mlab.points3d. We then use the delaunay2d filter to extract the mesh by nearest-neighboor matching, and visualize it using the surface module. """ # Author: Gael Varoquaux # Copyright (c) 2009, Enthought, Inc. # License: BSD Style. import numpy as np # Create data with x and y random in the [-2, 2] segment, and z a # Gaussian function of x and y. np.random.seed(12345) x = 4 * (np.random.random(500) - 0.5) y = 4 * (np.random.random(500) - 0.5) def f(x, y): return np.exp(-(x ** 2 + y ** 2)) z = f(x, y) from mayavi import mlab mlab.figure(1, fgcolor=(0, 0, 0), bgcolor=(1, 1, 1)) # Visualize the points pts = mlab.points3d(x, y, z, z, scale_mode='none', scale_factor=0.2) # Create and visualize the mesh mesh = mlab.pipeline.delaunay2d(pts) surf = mlab.pipeline.surface(mesh) mlab.view(47, 57, 8.2, (0.1, 0.15, 0.14)) mlab.show() mayavi-4.5.0/examples/mayavi/mlab/tvtk_in_mayavi.py0000644000076500000240000000540312747716313023044 0ustar prabhustaff00000000000000""" An example of pure TVTK programming to build TVTK objects, which are then added to a Mayavi scene. This example show how pure TVTK objects can be added to a Mayavi scene. This programming style does not allow to benefit from the data-management facilities of Mayavi (the pipeline, the data-oriented mlab functions), but it allows to easily reuse VTK code together with Mayavi or mlab code. If you want to use arbritrary VTK filters with Mayavi, it is best to use the UserDefined Mayavi filter, which enables the user to insert any VTK filter in the Mayavi pipeline. See, for instance, the :ref:`example_mri` for example of the UserDefined filter. For a full-blown example of a complex VTK pipeline built with Mayavi, see :ref:`example_tvtk_segmentation`. """ # Author: Gael Varoquaux # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. from mayavi import mlab # To access any VTK object, we use 'tvtk', which is a Python wrapping of # VTK replacing C++ setters and getters by Python properties and # converting numpy arrays to VTK arrays when setting data. from tvtk.api import tvtk from tvtk.common import configure_input_data v = mlab.figure() # Create a first sphere # The source generates data points sphere = tvtk.SphereSource(center=(0, 0, 0), radius=0.5) # The mapper converts them into position in, 3D with optionally color (if # scalar information is available). sphere_mapper = tvtk.PolyDataMapper() configure_input_data(sphere_mapper, sphere.output) sphere.update() # The Property will give the parameters of the material. p = tvtk.Property(opacity=0.2, color=(1, 0, 0)) # The actor is the actually object in the scene. sphere_actor = tvtk.Actor(mapper=sphere_mapper, property=p) v.scene.add_actor(sphere_actor) # Create a second sphere sphere2 = tvtk.SphereSource(center=(7, 0, 1), radius=0.2) sphere_mapper2 = tvtk.PolyDataMapper() configure_input_data(sphere_mapper2, sphere2.output) sphere2.update() p = tvtk.Property(opacity=0.3, color=(1, 0, 0)) sphere_actor2 = tvtk.Actor(mapper=sphere_mapper2, property=p) v.scene.add_actor(sphere_actor2) # Create a line between the two spheres line = tvtk.LineSource(point1=(0, 0, 0), point2=(7, 0, 1)) line_mapper = tvtk.PolyDataMapper() configure_input_data(line_mapper, line.output) line.update() line_actor = tvtk.Actor(mapper=line_mapper) v.scene.add_actor(line_actor) # And display text vtext = tvtk.VectorText() vtext.text = 'Mayavi' text_mapper = tvtk.PolyDataMapper() configure_input_data(text_mapper, vtext.get_output()) vtext.update() p2 = tvtk.Property(color=(0, 0.3, 0.3)) text_actor = tvtk.Follower(mapper=text_mapper, property=p2) text_actor.position = (0, 0, 0) v.scene.add_actor(text_actor) # Choose a view angle, and display the figure mlab.view(85, -17, 15, [3.5, -0.3, -0.8]) mlab.show() mayavi-4.5.0/examples/mayavi/mlab/wigner.py0000644000076500000240000000546212747716313021320 0ustar prabhustaff00000000000000""" An example in which 3 functions of x and y are displayed with a surf plot, while the z scaling is kept constant, to allow comparison between them. The important aspect of this example is that the 3 functions should not be displayed on top of each other, but side by side. For this we use the extent keyword argument. In addition, the relative scale between the different plots is important. This is why we also use the `warp_scale` keyword argument, to have the same scale on all plots. Finally, we have to adjust the data bounds: as we want the "horizon" of the wigner function in the middle of our extents, we put this to zero. We add a set of axes and outlines to the plot. We have to play we extents and ranges in order to make them fit with the data. """ # Author: Gael Varoquaux # Copyright (c) 2007, Enthought, Inc. # License: BSD Style. import numpy from mayavi import mlab def cat(x, y, alpha, eta=1, purity=1): """ Multiphoton shrodinger cat. eta is the fidelity, alpha the number of photons""" cos = numpy.cos exp = numpy.exp return (1 + eta * (exp(-x ** 2 - (y - alpha) ** 2) + exp(-x ** 2 - (y + alpha) ** 2) + 2 * purity * exp(-x ** 2 - y ** 2) * cos(2 * \ alpha * x)) / (2 * (1 + exp(- alpha ** 2)))) / 2 x, y = numpy.mgrid[-4:4.15:0.1, -4:4.15:0.1] mlab.figure(1, size=(500, 250), fgcolor=(1, 1, 1), bgcolor=(0.5, 0.5, 0.5)) mlab.clf() cat1 = cat(x, y, 1) cat2 = cat(x, y, 2) cat3 = cat(x, y, 3) # The cats lie in a [0, 1] interval, with .5 being the assymptotique # value. We want to reposition this value to 0, so as to put it in the # center of our extents. cat1 -= 0.5 cat2 -= 0.5 cat3 -= 0.5 cat1_extent = (-14, -6, -4, 4, 0, 5) surf_cat1 = mlab.surf(x - 10, y, cat1, colormap='Spectral', warp_scale=5, extent=cat1_extent, vmin=-0.5, vmax=0.5) mlab.outline(surf_cat1, color=(.7, .7, .7), extent=cat1_extent) mlab.axes(surf_cat1, color=(.7, .7, .7), extent=cat1_extent, ranges=(0, 1, 0, 1, 0, 1), xlabel='', ylabel='', zlabel='Probability', x_axis_visibility=False, z_axis_visibility=False) mlab.text(-18, -4, '1 photon', z=-4, width=0.13) cat2_extent = (-4, 4, -4, 4, 0, 5) surf_cat2 = mlab.surf(x, y, cat2, colormap='Spectral', warp_scale=5, extent=cat2_extent, vmin=-0.5, vmax=0.5) mlab.outline(surf_cat2, color=(0.7, .7, .7), extent=cat2_extent) mlab.text(-4, -3, '2 photons', z=-4, width=0.14) cat3_extent = (6, 14, -4, 4, 0, 5) surf_cat3 = mlab.surf(x + 10, y, cat3, colormap='Spectral', warp_scale=5, extent=cat3_extent, vmin=-0.5, vmax=0.5) mlab.outline(surf_cat3, color=(.7, .7, .7), extent=cat3_extent) mlab.text(6, -2.5, '3 photons', z=-4, width=0.14) mlab.title('Multi-photons cats Wigner function') mlab.view(142, -72, 32) mlab.show() mayavi-4.5.0/examples/mayavi/nongui.py0000644000076500000240000000642512747716313020411 0ustar prabhustaff00000000000000#!/usr/bin/env python """ This script demonstrates how one can use the Mayavi application framework without displaying Mayavi's UI. Note: look at the end of this file to see how the non gui plugin is chosen instead of the default gui mayavi plugin. This should be run as:: $ python nongui.py Or:: $ mayavi2 script.py """ # Author: Prabhu Ramachandran # Copyright (c) 2005, Enthought, Inc. # License: BSD Style. # Standard library imports from os.path import join, abspath # Enthought library imports from mayavi.scripts.util import get_data_dir from mayavi.plugins.app import Mayavi, get_non_gui_plugins class MyApp(Mayavi): def run(self): """This is executed once the application GUI has started. *Make sure all other MayaVi specific imports are made here!* """ # Various imports to do different things. from mayavi.sources.vtk_file_reader import VTKFileReader from mayavi.modules.outline import Outline from mayavi.modules.axes import Axes from mayavi.modules.grid_plane import GridPlane from mayavi.modules.image_plane_widget import ImagePlaneWidget from mayavi.modules.text import Text from mayavi.modules.contour_grid_plane import ContourGridPlane from mayavi.modules.iso_surface import IsoSurface script = self.script # Create a new scene. script.new_scene() # Read a VTK (old style) data file. r = VTKFileReader() r.initialize(join(get_data_dir(abspath(__file__)), 'heart.vtk')) script.add_source(r) # Put up some text. t = Text(text='MayaVi rules!', x_position=0.2, y_position=0.9, width=0.8) t.property.color = 1, 1, 0 # Bright yellow, yeah! script.add_module(t) # Create an outline for the data. o = Outline() script.add_module(o) # Create an axes for the data. a = Axes() script.add_module(a) # Create three simple grid plane modules. # First normal to 'x' axis. gp = GridPlane() script.add_module(gp) # Second normal to 'y' axis. gp = GridPlane() gp.grid_plane.axis = 'y' script.add_module(gp) # Third normal to 'z' axis. gp = GridPlane() script.add_module(gp) gp.grid_plane.axis = 'z' # Create one ImagePlaneWidget. ipw = ImagePlaneWidget() script.add_module(ipw) # Set the position to the middle of the data. ipw.ipw.slice_position = 16 # Create one ContourGridPlane normal to the 'x' axis. cgp = ContourGridPlane() script.add_module(cgp) # Set the position to the middle of the data. cgp.grid_plane.axis = 'y' cgp.grid_plane.position = 15 # An isosurface module. iso = IsoSurface(compute_normals=True) script.add_module(iso) iso.contour.contours = [200.0] # Set the view. s = script.engine.current_scene cam = s.scene.camera cam.azimuth(45) cam.elevation(15) s.render() if __name__ == '__main__': m = MyApp() # Get the default non GUI plugins. plugins = get_non_gui_plugins() # Start the app with these plugins. m.main(plugins=plugins) mayavi-4.5.0/examples/mayavi/README.txt0000644000076500000240000000306712747716313020235 0ustar prabhustaff00000000000000This directory contains several mayavi2 examples. There are two ways to script mayavi2. 1. The recommended way is to just write a script (script.py say) the way you'd write it out on the embedded interpreter. Then you can execute this script by doing the following:: $ mayavi2 -x script.py or $ mayavi2 script.py The advantages with this approach are: A. You can actually edit this script from inside mayavi2 (via File->Open Text File...) and then run it (by pressing Ctrl-r on the editor window). B. You can experiment on the embedded interpreter and cut/paste that code to make a script. C. The '-x' command line option is very powerful and can be invoked as many times as you want. This lets you run multiple simulations. D. You get to use all the cool command line options of mayavi2. E. If you add the line:: #!/usr/bin/env mayavi2 to the start of the script, it even becomes standalone! Apart from the nongui.py and test.py scripts all the scripts in this directory use this approach. 2. Subclass the `mayavi.plugins.app.Mayavi` application and override the `run` method. While this is obviously very flexible it does involve quite a bit more work. The only major benefit of this is that you can choose to use the non-GUI mayavi plugin as the nongui.py example demonstrates. The explorer/ directory contains a simple 3D function explorer. To run it, change to the directory and then run python explorer3d.py. mayavi-4.5.0/examples/mayavi/standalone.py0000644000076500000240000000322312747716313021233 0ustar prabhustaff00000000000000#!/usr/bin/env python """A simple example of how you can use Mayavi without using Envisage or the Mayavi Envisage application. """ # Author: Prabhu Ramachandran # Copyright (c) 2007-2016, Enthought, Inc. # License: BSD Style. from os.path import join, abspath from pyface.api import GUI # The core Engine. from mayavi.core.api import Engine from mayavi.core.ui.engine_view import EngineView # Usual MayaVi imports from mayavi.scripts.util import get_data_dir from mayavi.sources.api import VTKXMLFileReader from mayavi.modules.api import Outline, ScalarCutPlane, Streamline def main(): # Create the MayaVi engine and start it. e = Engine() # Starting the engine registers the engine with the registry and # notifies others that the engine is ready. e.start() # Do this if you need to see the MayaVi tree view UI. ev = EngineView(engine=e) ui = ev.edit_traits() # Create a new scene. scene = e.new_scene() # Now create a new scene just for kicks. scene1 = e.new_scene() # Now setup a normal MayaVi pipeline. src = VTKXMLFileReader() src.initialize(join(get_data_dir(abspath(__file__)), 'fire_ug.vtu')) e.add_source(src) e.add_module(Outline()) e.add_module(ScalarCutPlane()) e.add_module(Streamline()) return e, ui if __name__ == '__main__': # When main returns the ui to go out of scope and be gc'd causing the view # to disappear with qt4. e, ui = main() # Create a GUI instance and start the event loop. We do this here so that # main can be run from IPython --gui=qt if needed. gui = GUI() gui.start_event_loop() mayavi-4.5.0/examples/mayavi/user_mayavi.py0000644000076500000240000002312712747716313021434 0ustar prabhustaff00000000000000""" Sample Mayavi customization file. This code is not to be executed as `mayavi2 -x user_mayavi.py` or `python user_mayavi.py`. Put this file in ~/.mayavi2/user_mayavi.py and rerun mayavi2 to see what it does -- the worker view may not show up by default so you will have to go to View->Other and in the Show View dialog, activate the "Custom Mayavi2 View". The added modules should show up in the menus (Look for UserOutline in the Modules) ____ This module demonstrates how to extend Mayavi. It extends the modules provided by mayavi by adding these to the Mayavi registry. Note that the registry imports customize which in turn imports this file. It also defines an Envisage plugin that is added to the default list of plugins to extend the running mayavi application. This plugin is returned by the `get_plugins()` function. This file must be placed inside the `~/.mayavi2` directory and called `user_mayavi.py`. Please note that `~/.mayavi2` is placed in `sys.path` (if the directory exists) so make sure that you choose your module names carefully (so as not to override any common module names). The file may also be placed anywhere on sys.path and called `site_mayavi.py` for global system level customizations. """ # Author: Prabhu Ramachandran # Copyright (c) 2006-2008, Enthought, Inc. # License: BSD Style. from mayavi.core.registry import registry from mayavi.core.pipeline_info import PipelineInfo from mayavi.core.metadata import ModuleMetadata # Metadata for the new module we want to add -- notice that we use a # factory function here for convenience, we could also use a class but # the reasons for doing this are documented below. user_outline = ModuleMetadata( id = "UserOutlineModule", menu_name = "&UserOutline", factory = 'user_mayavi.user_outline', desc = "Draw a cornered outline for given input", tooltip = "Draw a cornered outline for given input", help = "Draw a cornered outline for given input", input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']) ) # Register the module with the mayavi registry. registry.modules.append(user_outline) ####### # The all important function that returns the plugin we wish to add to # the default mayavi application. def get_plugins(): # We simply return a list containing the WorkerPlugin defined below. return [WorkerPlugin()] ###################################################################### # Thats it, basically. The rest of the code should really be in another # module but is in the same module for convenience here. There are # problems with doing any significant non-core module imports in this # module as documented below. ###################################################################### ###################################################################### # THE CODE BELOW SHOULD REALLY BE IN SEPARATE MODULES. # # The following can very well be in a separate module but I've kept it # here to make this a compact demo of how to customize things. ###################################################################### ###################################################################### # A new module to expose to mayavi. # # WARNING: Do not do other mayavi imports right here like for example: # 'from mayavi.modules.outline import Outline' etc. This is # because the user_mayavi is imported at a time when many of the imports # are not complete and this will cause hard-to-debug circular import # problems. The registry is given only metadata mostly in the form of # strings and this will cause no problem. Therefore to define new # modules, we strongly recommend that the modules be defined in another # module or be defined in a factory function as done below. def user_outline(): """A Factory function that creates a new module to add to the pipeline. Note that the method safely does any mayavi imports inside avoiding any circular imports. """ print("User Outline") from mayavi.modules.outline import Outline o = Outline(outline_mode='cornered', name='UserOutline') return o ###################################################################### # This code simulates something the user would like to do. In this case # we just want to create some data, view it with mayavi and modify the # data. We want to add this as a view to the standard mayavi. The code # below is simply traits code with a few extra things to be able to grab # the running mayavi instance and script it. The object we create we # offer as an envisage service offer -- this instantiates the worker. # The WorkerPlugin exposes the service offer and shows the view of this # worker. import numpy from traits.api import HasTraits, Range, Button, Instance, List from traitsui.api import Item, View ###################################################################### # `Worker` class ###################################################################### class Worker(HasTraits): """This class basically allows you to create a data set, view it and modify the dataset. This is a rather crude example but demonstrates how things can be done. """ # Set by envisage when this is contributed as a ServiceOffer. window = Instance('pyface.workbench.api.WorkbenchWindow') create_data = Button('Create data') reset_data = Button('Reset data') view_data = Button('View data') scale = Range(0.0, 1.0) source = Instance('mayavi.core.source.Source') # Our UI view. view = View(Item('create_data', show_label=False), Item('view_data', show_label=False), Item('reset_data', show_label=False), Item('scale'), resizable=True ) def get_mayavi(self): from mayavi.plugins.script import Script return self.window.get_service(Script) def _make_data(self): dims = [64, 64, 64] np = dims[0]*dims[1]*dims[2] x, y, z = numpy.ogrid[-5:5:dims[0]*1j,-5:5:dims[1]*1j,-5:5:dims[2]*1j] x = x.astype('f') y = y.astype('f') z = z.astype('f') s = (numpy.sin(x*y*z)/(x*y*z)) s = s.transpose().copy() # This makes the data contiguous. return s def _create_data_fired(self): mayavi = self.get_mayavi() from mayavi.sources.array_source import ArraySource s = self._make_data() src = ArraySource(transpose_input_array=False, scalar_data=s) self.source = src mayavi.add_source(src) def _reset_data_fired(self): self.source.scalar_data = self._make_data() def _view_data_fired(self): mayavi = self.get_mayavi() from mayavi.modules.outline import Outline from mayavi.modules.image_plane_widget import ImagePlaneWidget # Visualize the data. o = Outline() mayavi.add_module(o) ipw = ImagePlaneWidget() mayavi.add_module(ipw) ipw.module_manager.scalar_lut_manager.show_scalar_bar = True ipw_y = ImagePlaneWidget() mayavi.add_module(ipw_y) ipw_y.ipw.plane_orientation = 'y_axes' def _scale_changed(self, value): src = self.source data = src.scalar_data data += value*0.01 numpy.mod(data, 1.0, data) src.update() ###################################################################### # The following code is the small amount of envisage code that brings # the users code (above) and Envisage/Mayavi UI together. from envisage.api import Plugin, ServiceOffer ###################################################################### # `WorkerPlugin` class ###################################################################### class WorkerPlugin(Plugin): # Extension point Ids. SERVICE_OFFERS = 'envisage.ui.workbench.service_offers' VIEWS = 'envisage.ui.workbench.views' # Services we contribute. service_offers = List(contributes_to=SERVICE_OFFERS) # Views. views = List(contributes_to=VIEWS) ###################################################################### # Private methods. def _service_offers_default(self): """ Trait initializer. """ worker_service_offer = ServiceOffer( protocol = 'user_mayavi.Worker', factory = 'user_mayavi.Worker' ) return [worker_service_offer] def _views_default(self): """ Trait initializer. """ return [self._worker_view_factory] def _worker_view_factory(self, window, **traits): """ Factory method for the current selection of the engine. """ from pyface.workbench.traits_ui_view import \ TraitsUIView worker = window.get_service(Worker) tui_worker_view = TraitsUIView(obj=worker, view='view', id='user_mayavi.Worker.view', name='Custom Mayavi2 View', window=window, position='left', **traits ) return tui_worker_view # END OF CODE THAT SHOULD REALLY BE IN SEPARATE MODULES. ###################################################################### if __name__ == '__main__': import sys print("*"*80) print("ERROR: This script isn't supposed to be executed.") print(__doc__) print("*"*80) from traits.util.home_directory import get_home_directory print("Your .mayavi2 directory should be in %s"%get_home_directory()) print("*"*80) sys.exit(1) mayavi-4.5.0/examples/mayavi/zzz_reader.py0000644000076500000240000000336512747716313021271 0ustar prabhustaff00000000000000"""This is a simple example that shows how to create a reader factory and register that reader with mayavi. To use this: - put this in ~/.mayavi2/ - then import this module in your ~/.mayavi2/user_mayavi.py. that's it. What you should get: - Options to open .zzz files from the file->open menu. - Open .zzz files via right click. - Open .zzz files from the engine or mlab (via open) - do mayavi2 -d foo.zzz. """ from mayavi.core.api import registry, SourceMetadata, PipelineInfo def zzz_reader(fname, engine): """Reader for .zzz files. Parameters: ----------- fname -- Filename to be read. engine -- The engine the source will be associated with. """ from tvtk.api import tvtk from mayavi.sources.vtk_data_source import VTKDataSource # Do your own reader stuff here, I'm just reading a VTK file with a # different extension here. r = tvtk.StructuredPointsReader(file_name=fname) r.update() src = VTKDataSource(data=r.output) return src zzz_reader_info = SourceMetadata( id = "ZZZReader", factory = 'zzz_reader.zzz_reader', tooltip = "Load a ZZZ file", desc = "Load a ZZZ file", help = "Load a ZZZ file", menu_name = "&ZZZ file", extensions = ['zzz'], wildcard = 'ZZZ files (*.zzz)|*.zzz', output_info = PipelineInfo(datasets=['unstructured_grid'], attribute_types=['any'], attributes=['any']) ) # Inject this information in the mayavi registry registry.sources.append(zzz_reader_info) if __name__ == '__main__': import sys print("*"*80) print("ERROR: This script isn't supposed to be executed.") print(__doc__) print("*"*80) sys.exit(1) mayavi-4.5.0/examples/tvtk/0000755000076500000240000000000012747722127016233 5ustar prabhustaff00000000000000mayavi-4.5.0/examples/tvtk/actor_editor.py0000644000076500000240000000372712747716313021274 0ustar prabhustaff00000000000000from traits.api import HasTraits, Instance, Enum, Dict from traitsui.api import View, Item from tvtk.pyface.actor_model import ITVTKActorModel from tvtk.pyface.actor_editor import ActorEditor from tvtk.pyface import actors from tvtk.api import tvtk ###################################################################### class ActorModel(ITVTKActorModel): # A simple trait to change the actors/widgets. actor_type = Enum('cone', 'sphere', 'plane_widget', 'box_widget') ######################### # ITVTKView Model traits. # This maintains a dictionary mapping objects (by identity) to lists (or # single items) of TVTK Actors or 3D Widgets that represent them in the # scene. Adding and removing objects from this dictionary adds and removes # them from the scene. This is the trait that will be edited by a # ActorEditor. actor_map = Dict() ###################### view = View(Item(name='actor_type'), Item(name='actor_map', editor=ActorEditor(scene_kwds={'background':(0.2,0.2,0.2)}), show_label=False, resizable=True, height=500, width=500) ) def __init__(self, **traits): super(ActorModel, self).__init__(**traits) self._actor_type_changed(self.actor_type) #################################### # Private traits. def _actor_type_changed(self, value): if value == 'cone': a = actors.cone_actor() self.actor_map = {'cone': a} elif value == 'sphere': a = actors.sphere_actor() self.actor_map = {'sphere': a} elif value == 'plane_widget': w = tvtk.PlaneWidget() self.actor_map = {'plane_widget': w} elif value == 'box_widget': w = tvtk.BoxWidget() self.actor_map = {'box_widget': w} if __name__ == '__main__': a = ActorModel() a.configure_traits() mayavi-4.5.0/examples/tvtk/animated_texture.py0000644000076500000240000001042312747716313022147 0ustar prabhustaff00000000000000#!/usr/bin/env python """ Illustrates texturing on a glyph and also illustrates how easy it is to change that texture when you treat it as a numpy array. You can change the numpy array in-place and have TVTK re-render the scene. TVTK sees a view of this array without doing any data transfers. """ # Authors: Prabhu Ramachandran, Eric Jones # Copyright (c) 2006-2015, Enthought, Inc. # License: BSD Style. from __future__ import print_function from numpy import arange, zeros, uint8, exp, sqrt, pi from tvtk.api import tvtk from tvtk.common import configure_input_data, configure_source_data, \ is_old_pipeline # Source for glyph. Note that you need to pick a source that has # texture co-ords already set. If not you'll have to generate them. # This is easily done -- its just a 2d array of (u,v) coords each # between [0, 1] that you can set via something like # point_data.t_coords = . # # In this case CubeSource already defines texture coords for us (as of # VTK-4.4). cs = tvtk.CubeSource(x_length=2, y_length=1.0, z_length=0.5) # Create input for the glyph -- the sources are placed at these input # points. pts = [[1,1,1],[0,0,0], [-1,-1,-1]] pd = tvtk.PolyData(points=pts, polys=[[0],[1],[2]]) # Orientation/scaling is as per the vector attribute. vecs = [[1,0,0], [0,1,0], [0,0,1]] pd.point_data.vectors = vecs # Create the glyph3d and set up the pipeline. g = tvtk.Glyph3D(scale_mode='data_scaling_off', vector_mode = 'use_vector') configure_input_data(g, pd) # Note that VTK's vtkGlyph.SetSource is special because it has two # call signatures: SetSource(src) and SetSource(int N, src) (which # sets the N'th source). In tvtk it is represented as both a property # and as a method. Using the `source` property will work fine if all # you want is the first `source`. OTOH if you want the N'th `source` # use get_source(N). # g.source = cs.output configure_source_data(g, cs.output) cs.update() g.update() m = tvtk.PolyDataMapper() configure_input_data(m, g.output) a = tvtk.Actor(mapper=m) # Read the texture from image and set the texture on the actor. If # you don't like this image, replace with your favorite -- any image # will do (you must use a suitable reader though). def image_from_array(ary): """ Create a VTK image object that references the data in ary. The array is either 2D or 3D with. The last dimension is always the number of channels. It is only tested with 3 (RGB) or 4 (RGBA) channel images. Note: This works no matter what the ary type is (accept probably complex...). uint8 gives results that make since to me. Int32 and Float types give colors that I am not so sure about. Need to look into this... """ sz = ary.shape dims = len(sz) # create the vtk image data img = tvtk.ImageData() if dims == 2: # 1D array of pixels. img.whole_extent = (0, sz[0]-1, 0, 0, 0, 0) img.dimensions = sz[0], 1, 1 img.point_data.scalars = ary elif dims == 3: # 2D array of pixels. if is_old_pipeline(): img.whole_extent = (0, sz[0]-1, 0, sz[1]-1, 0, 0) else: img.extent = (0, sz[0]-1, 0, sz[1]-1, 0, 0) img.dimensions = sz[0], sz[1], 1 # create a 2d view of the array ary_2d = ary[:] ary_2d.shape = sz[0]*sz[1],sz[2] img.point_data.scalars = ary_2d else: raise ValueError("ary must be 3 dimensional.") return img sz = (256, 256, 3) array_3d = zeros(sz, uint8) img = image_from_array(array_3d) t = tvtk.Texture(interpolate = 1) configure_input_data(t, img) a.texture = t # Renderwindow stuff and add actor. rw = tvtk.RenderWindow(size=(600, 600)) ren = tvtk.Renderer(background=(0.1, 0.2, 0.4)) rw.add_renderer(ren) rwi = tvtk.RenderWindowInteractor(render_window=rw) ren.add_actor(a) rwi.initialize() # create a little wave to slide across the image. wave = 1/sqrt(2*pi)*exp(-arange(-2, 2, .05)**2/2)*255 # have to use += here because = doesn't respect broadcasting correctly. array_3d[:len(wave)] += wave.astype(uint8)[:,None,None] import time t1 = time.time() N = 256 for i in range(N): array_3d[1:] = array_3d[:-1] img.modified() rwi.render() #print i t2 = time.time() print('texture size:', array_3d.shape) print('fps:', N/(t2-t1)) rwi.start() mayavi-4.5.0/examples/tvtk/array_animation.py0000644000076500000240000000632612747716313021771 0ustar prabhustaff00000000000000#!/usr/bin/env python """A simple example showing an animation. The example illustrates a few things. 1. You can pass a numpy array of scalars and use it directly with tvtk. 2. The tvtk arrays are views of numpy arrays. Thus changing the array in-place will also change the underlying VTK data. 3. When changing the numpy data you must call `modified` on a relevant tvtk object. The example is a little contrived since there are better ways of achieving the same effect but the present form nicely illustrates item 2 mentioned above. """ # Author: Prabhu Ramachandran # Copyright (c) 2004-2007, Enthought, Inc. # License: BSD Style. from tvtk.api import tvtk from tvtk.common import configure_input import numpy import time # First create a structured points data set. sp = tvtk.StructuredPoints(origin=(-10., -10., 0.0), dimensions=(80, 80, 1), spacing=(0.25, 0.25, 0.0)) # Create some nice data at these points. x = numpy.arange(-10., 10., 0.25) y = x r = numpy.sqrt(x[:,None]**2+y**2) # We need the transpose so the data is as per VTK's expected format # where X coords vary fastest, Y next and then Z. try: import scipy.special z = numpy.reshape(numpy.transpose(5.0*scipy.special.j0(r)), (-1,) ) except ImportError: z = numpy.reshape(numpy.transpose(5.0*numpy.sin(r)/r), (-1,) ) # Now set the scalar data for the StructuredPoints object. The # scalars of the structured points object will be a view into our # Numeric array. Thus, if we change `z` in-place, the changes will # automatically affect the VTK arrays. sp.point_data.scalars = z # Convert this to a PolyData object. geom_filter = tvtk.ImageDataGeometryFilter() configure_input(geom_filter, sp) # Now warp this using the scalar value to generate a carpet plot. warp = tvtk.WarpScalar() configure_input(warp, geom_filter) # Smooth the resulting data so it looks good. normals = tvtk.PolyDataNormals() configure_input(normals, warp) # The rest of the VTK pipeline. m = tvtk.PolyDataMapper(scalar_range=(min(z), max(z))) configure_input(m, normals) a = tvtk.Actor(mapper=m) ren = tvtk.Renderer(background=(0.5, 0.5, 0.5)) ren.add_actor(a) # Get a nice view. cam = ren.active_camera cam.azimuth(-60) cam.roll(90) # Create a RenderWindow, add the renderer and set its size. rw = tvtk.RenderWindow(size=(600, 600)) rw.add_renderer(ren) # Create the RenderWindowInteractor rwi = tvtk.RenderWindowInteractor(render_window=rw) rwi.initialize() ren.reset_camera() rwi.render() # The following is a crude approach but illustrates the point. scale = old_scale = 1.0 pi = numpy.pi for i in numpy.arange(pi*0.5, 2.5*pi, 0.2): if abs(i) < 1.0e-10: continue scale = numpy.sin(i) # We change 'z' in-place z *= scale/old_scale # Reset the scalar range. m.scalar_range = min(z), max(z) # Now explicitly notify `sp` that its data has changed. If this # is not done, VTK has no way of knowing the data changed in order # to flush the pipeline. sp.modified() # Re-render the scene to actually flush the VTK pipeline. rwi.render() old_scale = scale time.sleep(0.1) # Just in case your hardware is really fast. # Start the VTK event loop. rwi.start() mayavi-4.5.0/examples/tvtk/dscene.py0000644000076500000240000001561512747716313020056 0ustar prabhustaff00000000000000#------------------------------------------------------------------------------ # Copyright (c) 2005, Enthought, Inc. # All rights reserved. # # This software is provided without warranty under the terms of the BSD # license included in enthought/LICENSE.txt and may be redistributed only # under the conditions described in the aforementioned license. The license # is also available online at http://www.enthought.com/licenses/BSD.txt # Thanks for using Enthought open source! # # Author: Enthought, Inc. # Description: #------------------------------------------------------------------------------ """ An example of using a TVTK scene. """ # Standard library imports. import random # Enthought library imports. from pyface.api import FileDialog from pyface.api import GUI from pyface.api import OK from pyface.api import PythonShell from pyface.api import SplitApplicationWindow from tvtk.pyface.api import DecoratedScene from tvtk.pyface.actors import sphere_actor, cylinder_actor, \ arrow_actor, axes_actor, cone_actor, \ cube_actor, earth_actor from pyface.action.api import Action, Group, MenuBarManager, \ MenuManager, Separator from traits.api import Float, Str, Instance class ExitAction(Action): """ Exits the application. """ def __init__(self, window): """ Creates a new action. """ self._window = window self.name = "E&xit" def perform(self): """ Performs the action. """ self._window.close() class SaveImageAction(Action): """Saves the rendered scene to an image.""" def __init__(self, window): self._window = window self.name = "S&ave Scene" def perform(self): """Pops up a dialog used to save the scene to an image.""" extns = ['*.png', '*.jpg', '*.jpeg', '*.tiff', '*.bmp', '*.ps', '*.eps', '*.tex', '*.rib', '*.wrl', '*.oogl', '*.pdf', '*.vrml', '*.obj', '*.iv'] dlg = FileDialog(parent=self._window.control, action='save as', wildcard='|'.join(extns), title="Save scene to image") if dlg.open() == OK: self._window.scene.save(dlg.path) class SaveToClipboardAction(Action): """ Saves rendered scene to the Clipboard. """ def __init__(self, window): """ Creates a new action. """ self._window = window self.name = "&Copy" def perform(self): """ Performs the action. """ self._window.scene.save_to_clipboard() class SpecialViewAction(Action): """Sets the scene to a particular view.""" def __init__(self, window, name, view): """ Creates a new action. """ self._window = window self.name = name self.view = view def perform(self): """ Performs the action. """ # Hack! Works tho. try: meth = getattr(self._window.scene, self.view) meth() except AttributeError: pass class ExampleWindow(SplitApplicationWindow): """ An example application window. """ # The actors we can create. ACTORS = [ arrow_actor, axes_actor, cone_actor, cube_actor, cylinder_actor, earth_actor, sphere_actor ] # The ratio of the size of the left/top pane to the right/bottom pane. ratio = Float(0.75) # The direction in which the panel is split. direction = Str('horizontal') # The `Scene` instance into which VTK renders. scene = Instance(DecoratedScene) # The `PythonShell` instance. python_shell = Instance(PythonShell) ########################################################################### # 'object' interface. ########################################################################### def __init__(self, **traits): """ Creates a new window. """ # Base class constructor. super(ExampleWindow, self).__init__(**traits) # Create the window's menu bar. self._create_my_menu_bar() ########################################################################### # Protected 'SplitApplicationWindow' interface. ########################################################################### def _create_lhs(self, parent): """ Creates the left hand side or top depending on the style. """ self.scene = DecoratedScene(parent) self.scene.renderer.background = 0.1, 0.2, 0.4 # Add some actors. for i in range(10): func = random.choice(ExampleWindow.ACTORS) actor = func() # Place the actor randomly. x = random.uniform(-3, 3) y = random.uniform(-3, 3) z = random.uniform(-3, 3) actor.position = x, y, z # Add the actor to the scene. self.scene.add_actors(actor) # Render it all! self.scene.render() # Reset the zoom nicely. self.scene.reset_zoom() return self.scene.control def _create_rhs(self, parent): """ Creates the right hand side or bottom depending on the style. """ self.python_shell = PythonShell(parent) self.python_shell.bind('scene', self.scene) self.python_shell.bind('s', self.scene) return self.python_shell.control ########################################################################### # Private interface. ########################################################################### def _create_my_menu_bar(self): """ Creates the window's menu bar. """ self.menu_bar_manager = MenuBarManager( MenuManager( SaveImageAction(self), Separator(), ExitAction(self), name = '&File', ), MenuManager( SaveToClipboardAction(self), name = '&Edit', ), MenuManager( SpecialViewAction(self, "&Reset Zoom", 'reset_zoom'), Separator(), SpecialViewAction(self, "&Isometric", 'isometric_view'), SpecialViewAction(self, "&X positive", 'x_plus_view'), SpecialViewAction(self, "X negative", 'x_minus_view'), SpecialViewAction(self, "&Y positive", 'y_plus_view'), SpecialViewAction(self, "Y negative", 'y_minus_view'), SpecialViewAction(self, "&Z positive", 'z_plus_view'), SpecialViewAction(self, "Z negative", 'z_minus_view'), name = '&View', ) ) # Application entry point. if __name__ == '__main__': # Create the GUI. gui = GUI() # Create and open an application window. window = ExampleWindow(size=(600,600)) window.open() # Start the GUI event loop! gui.start_event_loop() ##### EOF ##################################################################### mayavi-4.5.0/examples/tvtk/images/0000755000076500000240000000000012747722127017500 5ustar prabhustaff00000000000000mayavi-4.5.0/examples/tvtk/images/image_LICENSE.txt0000644000076500000240000000064312747716313022470 0ustar prabhustaff00000000000000 masonry.jpg: The image masonry.jpg is part of the VTK data (used for regression testing and is openly available), it is actually distributed as masonry.bmp, which Prabhu converted to masonry.jpg to save some disk space. No license is advertised for this image in particular, however VTK code is under a BSD like license. We therefore consider this image to have a BSD like license as well. mayavi-4.5.0/examples/tvtk/images/masonry.jpg0000644000076500000240000003577012747716313021706 0ustar prabhustaff00000000000000JFIFC    $.' ",#(7),01444'9=82<.342C  2!!22222222222222222222222222222222222222222222222222"=!1AQ"2aq#BRr$34bS"!1AQa"q2 ?)K"quЭ:̂zsOPqpŊOMߡbڐ~M8UԞzL4k2Y=2Di!KS~ugMrPگ68܎?%󣦺 Dy?qFRo֘JY$<#4Xf4cfH*qi]^H팁Jw68KPi֑2qw>Y!|کuij B"]&;I& .?N&5Y_+Gߓr Xcp|WU2 Qs?kkv2,i'=l q"¿P12hR&yf׬5>rW7 [7H[ d'M:jer?g GSdJ0{JT(RTo?2EipoGϞiV7Id\V,i!W ލv `FG5Tk:mK'~tRL`[L=¢}V;8\)iS ' -Zrf$hs %m5kxEI*!cHQ=+C]CKdͥD۹X{O|R+Lil1e/g9)n^l܄HAVn2UI2d4-G6;Q;~dP콂3N}hEa(5Ik**囃V2Ek*^jQoXTaO qn†Mp*ϳN2ait%ŨZB6Y;fI ˉ<֗0HncP/Lt<|\J6XDU&Y'ܥݼqs)A(&*~|}<rLM\2H;K;e$M~f:um֝D.l#ve x56/lw1ajSݐ4&$1Ej"O,j7\.fvBtIVב$Vڇ{tַDA? 0uiP~w@v=ݿ)sc"#5ō^M<)Yj5jCsRN_g&=U4^hg٭KnDQٜ?JA_M"-?"fC1$ԭ ;H?JH{ePV€û|Bo&Q:˿;Uiף.XUDdn-6sۊ'cچ?Ĺ#q.С6TĮ.Ew:빗H9t \>eڧO[ܰfT/͡{X#kiwQz*\d!D[G5I i\`q?Tbo>&*o xUϛ׷I}.X-YkJ nvOL}{HKX^cNhGW4).ecŠ\,p]'$qZ]Ey=ϥPFNd#,?h}ԅ&x8e} 9ۍʧ4:8`~&Bpkn)*5՚|;e!-fI@[sXɨx7\CYt=MR>M@ZG*1"L:1"&nTY]C<qɨ˾.>Fm;b͵l-d6_CB4.O~u2y*"Ѭqx.eH5@-kpYO lhYDt3߯-RW_6GJE%;Pg2@V=Fiֺ䪲3 ZWbH%]e7dsc9o"#]bbk9y"Fr|KNKcnY\e5w*1Nr 䙬.0'<6Yg3Hmh%lHVnY('xo:צQ\)MԕEksMvS\X.յQ4ɿR\BO9E}C9@ùRm&K\+Dȡik)AVʝǠTMڡtfW$<щXd[w>^T5}wǍwmBT}O&Bq 84b{9-[Ls"dӶ,g+\:[ ?cϮ-\a}j[}V8?pEDю7#z O|4@⚗cbPFݕx98CVc'sNhPKܦ|hj 8^N@I[v|8Η+NGԺr1lysŭG;@Wtg=}~~Yt{t84MzCD#ln=WBLꗖ,x->4u"p|G"_J1i&\<> 6fYbc!՗"|3[ ~#_/J6NnRACw2:N./$Cv.hz[x&Um9Cid?ڤʬo1o VU.!JC--*3{`?4ik63(fG|tfP̡Yy>u^el-a,5^\8 .p1T0 }F_ &,wcȮ~ΐ-5#YŶj啬`60yf&ķi$G#ݤ-p9x\ad/osTCw\Dg{>4p(] lw'U7RxlUb5yk۶GVYP>Yj iiHfP)$~TzKn1Ja LIR?4J+٣s,+KM@]'l7Dx$` z+* qEVE;*'b/ի nNH Fڲs#2ʧ\IgF+H6qKy_;vÜg< 9Q[tin*iZMAUnXLp<`I6q3PPE2@ALHS HۜJ;{񫢅 )fV[q+eU 1mFKoqw .U'ۧ$7s^ky!m6GoJm> OadCzt^ :I MqS[4V<Y~4I9aXn*f.K[B9PᾔVK[xEGҭXƲӕ=rѯglcpPBvP5\HpQs/tQI wu5jk ̒~&˩6O18QWMZtP2|T1y&wJ) y{u!1A9$5'c.6Xogqp>tK;ặ+yYd:+,Ѵez~ :*[ot} ޖ̈1F%ǎ3AqfH3ⴙZ*O}.q+ C| G!ot[VI7ڛ aHndX7ߥXn-m\.wj{~!Vc)=膏Ԗم8)8=hiXjwvri"djjYe7Қdxq5kO5aXC] l^cp_QV'@Z|1 &sStR1y$xГwj]V{ B3Vy[R62;PG#e9>VЛEjO8= ;Y Xa WIQTK&̹:CPݺKY6kn,9} IjHi,Դ\+kP+d8aϝ@fk'w'%[~Sۏ QcekњӚVdPGsLNݡO5=|%n=;h{t3-'<+Iu;rsd ;Rj6H_.pjqlR;Ҹ IZe3 jcU#έIݽ+py)H$h۰fYN3*<@D!BL7OWtA[85Z,̪ˡkvWX#z;cQ:wZHգHRq)BW;=PKvfZ %ӓ;H8>_J =>UkR-*x[˶BI2Fx~cGg=*VZݹVC.eҴQq-ך1FC0RЋ[N< rjaI+sCsMVxIB sLGV.e7#xeIpʌerÌo޳Rci;h9$EhaU9>]9p%d*.?CuAtʬ#4HLezىkfMpJ!TeQ!$i-ё<*ZQ(ν<}CGޯf?wÛiœ=#Dϼ0jh:c$q۪|*A%z3CLF+t9'HdT SPTW+n8L[nRA~͵C'%v\g).iWᲛ[12?j}j̏z_' %-^#e#' }j &O1 WZU_Ͼ[\1EX{PmsqCjL%?<Zt6<ob܌1Q`aJ 7Yֽa)X Z5B_^DQo@<Z >εU#֥FSCʹI<X;Ze`UкS,h8mHI[QϚTu<#qA+b*4V=jWt#j'Kfk x#_HuHpŮi $tT^NGzŚ'sؑ^2gCef,7r?LǕ {{Ƞv6WE>]$R6Zl·6~z{e\Z+Z]ڙlk-4B RK|*$60(l^^$M .<-XN\kH(ql%0i}q+xكڔw"[Xnbe?S^jzFv3)^dֶ|DŽF+O|хvi6~Zgp#Ǡ死jUfpOZெYˁUY+`pI*P&سIn1g2G_i#Ґ5$7/ql+1iRL(ԓPnT>\Բ_@Kk" рheQnFU+jRLUɡ&l.jYpaGjʏWjAe9g3 M*NOU+˽T˕j:Tmt -*?JG(33 ;Mo&l0IE\Hp)b A76U>⩴L,V{Vs~" ypEqT?x?AZK$eJ܎+#[v~ihtc)v9徵Α-\0ǃW5ϼ2G?XO xͪY*gP6hO[5@xrMѭ*4ȝ2 :( G 0\UZВ?q9'_-ľb7Llp|C4iT-ՙA:١L wU[ԜL,Et )Ssƞ+rpXeandrĮs`뾤`s6q1i*^FL=v <2H|49^`|X&(GQʳ Ka8 EmNV.8 [,Qa :<=e݊.:"*7[ dd֖0>b$w>FZ]5=7O{)8;35MvȈ4.[R%mVq*fnqUuXĖ'G=rLhhyb)!*8;9#& Up::#]ҥ.Pb9wV\˹v/sWTk;v^NO 4.ɏjAwUU8TРkfb$bϮ(&֗oܒn@%}9ͨh⛻:i0iQ{$v)bk}l ЛfYZ\8 FVsXrU=%?ZHnwm/V䅸 ޏ Dc81p>Ms,N7qѨy.A  McBnwCܸP۸o.3ov#JMV}A-oB8iA&hM#ݍ431E w0Lbf-30ֵ˻v{x\2)·缝#3zctYm9#5ZtءwOcV_)F7r%4f|3+9="F{~}OЯ-8Ͻ_LTjʍ Jfǝ\iOV+X$ ie !HʁMB֗w?+u3Ka[qAg{iJ?71 <(B5hGv ܐx槎Ȳ$a9qY%XU_v"qg3@ZV9 MCb$IY ʉIx\T-ڧMݐIdvV]x"@&ɤ0A{0Gy6H>,e&)dǗH4uiu47Q&cv \_{ Բhւ"X[ؖQ?fta`Gj3rGhP&Mڨ=G( sL MJsOg\+YS5ٖnZO L˚bJzٝy>U.|~˺yp8fT]=z 7Lnf ,]_ٷNI_#[xA<W!HlAF}IYYHq5}o\Dְlm^9+yutiF݉A;1 .ف9c]\1$s뺫wAcꋢ[xszRIewnf8aS#[iQ-2X!]ҧaJ`U&Cv#y { .sG儀&].s++{$m>+`}A[[Br }ܛeH{Qc喟QHP3E"u劕'}?8*c+FaCPFq*fw2=D^dž;q\ {PKMK'0v矨DFkUac ^'2tN*H ͭ2O0*Ȩ?*ۖˌw8)+A:*R"#kHލ_ŭFG^ɉ_i:P2u7hlqۑREjѰSުuVmk*XJn/g` w4IDlkKfV8 U&}q'%#=K, N˅qwnP.U!5BWh$a*x9GR&8dMz{"bT4+Zds\irG$N3 VumNQqxzy3/Q4=7 &Ӵj?{>MwSV[HFW=7OIH9gvo3Gx߈VtoA/Rb>ʀ#4k@$.<Y\+tuHՔ618=i4avw_ʂ]klP+6 *Zol+Q̺-/#U*}(}֬&Է`2M];FX)y$2m$5QP_Jv"ڤ.w$ϝbM1"[hBlnqK16cxUݨ`NjŔpKrR&#Ņ'ҊK6rlۤvJvc][-^&P\k2K9jV<SyKf >6Z3EmnaG6G[.P?n4{obw#?:!mfKyϏw'ʡƣ,v'~ͬldip#MwW173Hylta5b j2j:n`6͖s{qorvyfWֲʌ ~~^ Zޕ4qyr7}*1oɠ l%(Ηm!RA#cR<ip6r=gG1Ɯ7q(C]J}ΦVpΗ"QEtIC8ivH!Pt0l~!QtD!8yTr8˩ue œeBlu " o6 !x_J=sۃU[2.WO$s׉SGU{Xډ&u8:³1rAGȲ9 ^A2Y܃)?μ8#U7L~T/4w·ۖs$EcXxvlY޺X1 QQkncC>ε6ɷԉ*Э#Ox'YYYX0%S5E,$ /\o.mmSH܀9]ݯ}<Ŵ3-ڱ&L BI#U|e`~tm3|#ZWhxU Qa &HA攚w %oITWGSHY4gq_MY5 =S<VE0ٝjGQN})]G@O `~cy` A3vRiM:0ݤ'͘N*hOȜZڣң'a@W~ ;ZޕzK&bGA>̟(O KD{ m g|;ǧA.t-f>i"7$J iwm$@#ӾڝԸQ=|:'AE<}J efQg:m V_{q_;-"蔔8$9LMWi@[*UŠ7al䷑N7#|BꉲbI{JѥhW:ټCk7Uʹч ?gCXQaF?zzT,A7ʥ$9&"H2 AB--(|QB4T7UNe6d*5F]B Rҁ[#t,U|Ry2;p*ޯ  ;~x}:YKc fݗB~:;}rqS0mayavi-4.5.0/examples/tvtk/ivtk_example.py0000644000076500000240000000471512747716313021304 0ustar prabhustaff00000000000000#!/usr/bin/env python """A simple demonstration of how one can use the ivtk module with PyFace to create a standalone VTK window with an embedded TVTK pipeline browser and a Python shell! """ # Author: Prabhu Ramachandran # Copyright (c) 2005-2006, Enthought, Inc. # License: BSD Style. # We use this just for the demo. import random # The GUI class lets us start a PyFace GUI. from pyface.api import GUI from traits.api import HasTraits, Tuple # The IVTK module. from tvtk.tools import ivtk # The actors module has a few helper functions that allow one to # create simple shapes easily. These functions return TVTK Actor # instances. We use it here for convenience. from tvtk.pyface import actors # Create a GUI instance. gui = GUI() # Create and open an IVTK application window that has an embedded TVTK # pipeline browser and an interactive Python interpreter shell via # PyCrust. If you don't want all these you can choose between the # following classes in ivtk -- IVTK, IVTKWithCrust, IVTKWithBrowser # and IVTKWithCrustAndBrowser. window = ivtk.IVTKWithCrustAndBrowser(size=(800,600)) # Size is optional. # Open the window. window.open() class EarthActor(HasTraits): position = Tuple def __init__(self): earth = actors.earth_actor() earth.property.color = actors.colors.green sphere = actors.sphere_actor(color=actors.colors.blue, opacity=0.65) self.earth, self.sphere = earth, sphere def _position_changed(self, val): for actor in (self.earth, self.sphere): actor.position = val # Now create your TVTK actors. Here we simply use the actors module # and generate actors randomly. # Get all the functions in the actors module that end with '_actors'. ACTORS = [getattr(actors, x) for x in dir(actors) if x.endswith('_actor') and not x.startswith('earth')] ACTORS.append(EarthActor) # Now create the actors with these functions. for i in range(len(ACTORS)): # Create the actor. func = random.choice(ACTORS) actor = func() # Set its position randomly. x = random.uniform(-3, 3) y = random.uniform(-3, 3) z = random.uniform(-3, 3) actor.position = x, y, z # Add the actor to the scene. if isinstance(actor, EarthActor): window.scene.add_actors((actor.earth, actor.sphere)) else: window.scene.add_actor(actor) # Now reset the view so all the actors. window.scene.reset_zoom() # Start the GUI event loop! gui.start_event_loop() mayavi-4.5.0/examples/tvtk/off_screen.py0000644000076500000240000000336512747716313020725 0ustar prabhustaff00000000000000#!/usr/bin/env python """ A simple example demonstrating TVTK for rendering to an off screen buffer. This is useful when you are rendering images to files and do not wish to display a graphics window at all. Note: Tested to work on win32, Mac OS X and Linux. Mac OS X and Linux require a VTK version released after Oct. 2005 (and ideally after March 2006). """ # Author: Eric Jones, Prabhu Ramachandran # Copyright (c) 2004-2006, Enthought, Inc. # License: BSD Style. from tvtk.api import tvtk from tvtk.common import configure_input_data # Create a cone source and configure it. cs = tvtk.ConeSource(height=3.0, radius=1.0, resolution=36) # Print the traits of the cone. #cs.print_traits() # Setup the rest of the pipeline. m = tvtk.PolyDataMapper() # Note that VTK's GetOutput method is special because it has two call # signatures: GetOutput() and GetOutput(int N) (which gets the N'th # output). In tvtk it is represented as both a property and as a # method. Using the output property will work fine if all you want is # the default output. OTOH if you want the N'th output use # get_output(N). # m.input = cs.output # or m.input = cs.get_output() configure_input_data(m, cs.output) # Create the actor and set its mapper. a = tvtk.Actor(mapper=m) cs.update() # Create a Renderer, add the actor and set its background color. ren = tvtk.Renderer(background=(0.1, 0.2, 0.4)) ren.add_actor(a) ren.reset_camera() # Create a RenderWindow, add the renderer and set its size. rw = tvtk.RenderWindow(size=(300,300)) rw.off_screen_rendering=1 rw.add_renderer(ren) w2if = tvtk.WindowToImageFilter() w2if.magnification = 2 w2if.input = rw ex = tvtk.PNGWriter() ex.file_name = "example.png" configure_input_data(ex, w2if.output) w2if.update() ex.write() mayavi-4.5.0/examples/tvtk/plugins/0000755000076500000240000000000012747722127017714 5ustar prabhustaff00000000000000mayavi-4.5.0/examples/tvtk/plugins/test.py0000644000076500000240000001133412747716313021247 0ustar prabhustaff00000000000000#!/usr/bin/env python """ This is a simple test envisage3 application to demonstrate how one can use TVTK's scene and browser plugins to create a simple application. """ # Author: Prabhu Ramachandran # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. # Standard library imports. import os.path import logging # Enthought library imports. from apptools.logger.api import LogFileHandler, FORMATTER from traits.etsconfig.api import ETSConfig from traits.api import List from envisage.api import Plugin from envisage.ui.workbench.api import WorkbenchApplication from envisage.core_plugin import CorePlugin from envisage.ui.workbench.workbench_plugin import WorkbenchPlugin from envisage.plugins.python_shell.python_shell_plugin import PythonShellPlugin from tvtk.plugins.scene.scene_plugin import ScenePlugin from tvtk.plugins.scene.ui.scene_ui_plugin import SceneUIPlugin from tvtk.plugins.browser.browser_plugin import BrowserPlugin from pyface.workbench.api import Perspective, PerspectiveItem logger = logging.getLogger() ############################################################################### # `TestPerspective` class. ############################################################################### class TestPerspective(Perspective): """ An default perspective for the app. """ # The perspective's name. name = 'Test' # Should this perspective be enabled or not? enabled = True # Should the editor area be shown in this perspective? show_editor_area = True # View IDs. BROWSER_VIEW = 'tvtk.plugins.browser.browser_view.BrowserView' SHELL_VIEW = 'envisage.plugins.python_shell.view.python_shell_view.PythonShellView' # The contents of the perspective. contents = [ PerspectiveItem(id=BROWSER_VIEW, position='left'), PerspectiveItem(id=SHELL_VIEW, position='bottom') ] ############################################################################### # `MyPlugin` class. ############################################################################### class MyPlugin(Plugin): # Extension points we contribute to. PERSPECTIVES = 'envisage.ui.workbench.perspectives' # The plugin's unique identifier. id = 'tvtk_example_plugin' # The plugin's name (suitable for displaying to the user). name = 'TVTK example plugin' # Perspectives. perspectives = List(contributes_to=PERSPECTIVES) def _perspectives_default(self): """ Trait initializer. """ return [TestPerspective] ############################################################################### # Useful functions. ############################################################################### def setup_logger(logger, fname, stream=True, mode=logging.ERROR): """Setup a log file and the logger in `ETSConfig.application_home`. Parameters: ----------- fname -- file name the logger should use. stream -- Add a stream handler. mode -- the logging mode. """ path = os.path.join(ETSConfig.application_home, fname) handler = LogFileHandler(path) logger.addHandler(handler) if stream: s = logging.StreamHandler() s.setFormatter(FORMATTER) s.setLevel(mode) logger.addHandler(s) logger.info("*"*80) logger.info("logfile is: '%s'", os.path.abspath(path)) logger.info("*"*80) def bind_object(value, app): """Binds the scene manager service to the Python shell.""" if not value: # value is False when the GUI is stopped. return id = 'envisage.plugins.python_shell.view.python_shell_view.PythonShellView' py = app.workbench.active_window.get_view_by_id(id) id = 'tvtk.plugins.scene.i_scene_manager.ISceneManager' sm = app.workbench.active_window.get_service(id) if py is not None: py.bind('scene_manager', sm) def main(): """The main application is created and launched here.""" # Setup the logger. plugins = [CorePlugin(), WorkbenchPlugin(), MyPlugin(), ScenePlugin(), SceneUIPlugin(), BrowserPlugin(), PythonShellPlugin(), ] # Create an Envisage application. id = 'tvtk.examples.plugins.test' application = WorkbenchApplication(id=id, plugins = plugins ) # This needs to be done here since the ETSConfig.application_home is # not set correctly up to this point. setup_logger(logger, 'test.log', mode=logging.DEBUG) application.gui.on_trait_change(lambda value: bind_object(value, application), 'started') # Start the application. application.run() if __name__ == '__main__': main() mayavi-4.5.0/examples/tvtk/scene.py0000644000076500000240000001556212747716313017713 0ustar prabhustaff00000000000000#------------------------------------------------------------------------------ # Copyright (c) 2005, Enthought, Inc. # All rights reserved. # # This software is provided without warranty under the terms of the BSD # license included in enthought/LICENSE.txt and may be redistributed only # under the conditions described in the aforementioned license. The license # is also available online at http://www.enthought.com/licenses/BSD.txt # Thanks for using Enthought open source! # # Author: Enthought, Inc. # Description: #------------------------------------------------------------------------------ """ An example of using a TVTK scene. """ # Standard library imports. import random # Enthought library imports. from pyface.api import FileDialog from pyface.api import GUI from pyface.api import OK from pyface.api import PythonShell from pyface.api import SplitApplicationWindow from tvtk.pyface.api import Scene from tvtk.pyface.actors import arrow_actor, axes_actor, cone_actor, \ cube_actor, cylinder_actor, \ earth_actor, sphere_actor from pyface.action.api import Action, Group, MenuBarManager, \ MenuManager, Separator from traits.api import Float, Str, Instance class ExitAction(Action): """ Exits the application. """ def __init__(self, window): """ Creates a new action. """ self._window = window self.name = "E&xit" def perform(self): """ Performs the action. """ self._window.close() class SaveImageAction(Action): """Saves the rendered scene to an image.""" def __init__(self, window): self._window = window self.name = "S&ave Scene" def perform(self): """Pops up a dialog used to save the scene to an image.""" extns = ['*.png', '*.jpg', '*.jpeg', '*.tiff', '*.bmp', '*.ps', '*.eps', '*.tex', '*.rib', '*.wrl', '*.oogl', '*.pdf', '*.vrml', '*.obj', '*.iv'] dlg = FileDialog(parent=self._window.control, action='save as', wildcard='|'.join(extns), title="Save scene to image") if dlg.open() == OK: self._window.scene.save(dlg.path) class SaveToClipboardAction(Action): """ Saves rendered scene to the Clipboard. """ def __init__(self, window): """ Creates a new action. """ self._window = window self.name = "&Copy" def perform(self): """ Performs the action. """ self._window.scene.save_to_clipboard() class SpecialViewAction(Action): """Sets the scene to a particular view.""" def __init__(self, window, name, view): """ Creates a new action. """ self._window = window self.name = name self.view = view def perform(self): """ Performs the action. """ # Hack! Works tho. try: meth = getattr(self._window.scene, self.view) meth() except AttributeError: pass class ExampleWindow(SplitApplicationWindow): """ An example application window. """ # The actors we can create. ACTORS = [ arrow_actor, axes_actor, cone_actor, cube_actor, cylinder_actor, earth_actor, sphere_actor ] # The ratio of the size of the left/top pane to the right/bottom pane. ratio = Float(0.75) # The direction in which the panel is split. direction = Str('horizontal') # The `Scene` instance into which VTK renders. scene = Instance(Scene) # The `PythonShell` instance. python_shell = Instance(PythonShell) ########################################################################### # 'object' interface. ########################################################################### def __init__(self, **traits): """ Creates a new window. """ # Base class constructor. super(ExampleWindow, self).__init__(**traits) # Create the window's menu bar. self._create_my_menu_bar() ########################################################################### # Protected 'SplitApplicationWindow' interface. ########################################################################### def _create_lhs(self, parent): """ Creates the left hand side or top depending on the style. """ self.scene = Scene(parent) self.scene.renderer.background = 0.1, 0.2, 0.4 # Add some actors. for i in range(10): func = random.choice(ExampleWindow.ACTORS) actor = func() # Place the actor randomly. x = random.uniform(-3, 3) y = random.uniform(-3, 3) z = random.uniform(-3, 3) actor.position = x, y, z # Add the actor to the scene. self.scene.add_actors(actor) # Render it all! self.scene.render() # Reset the zoom nicely. self.scene.reset_zoom() return self.scene.control def _create_rhs(self, parent): """ Creates the right hand side or bottom depending on the style. """ self.python_shell = PythonShell(parent) self.python_shell.bind('scene', self.scene) self.python_shell.bind('s', self.scene) return self.python_shell.control ########################################################################### # Private interface. ########################################################################### def _create_my_menu_bar(self): """ Creates the window's menu bar. """ self.menu_bar_manager = MenuBarManager( MenuManager( SaveImageAction(self), Separator(), ExitAction(self), name = '&File', ), MenuManager( SaveToClipboardAction(self), name = '&Edit', ), MenuManager( SpecialViewAction(self, "&Reset Zoom", 'reset_zoom'), Separator(), SpecialViewAction(self, "&Isometric", 'isometric_view'), SpecialViewAction(self, "&X positive", 'x_plus_view'), SpecialViewAction(self, "X negative", 'x_minus_view'), SpecialViewAction(self, "&Y positive", 'y_plus_view'), SpecialViewAction(self, "Y negative", 'y_minus_view'), SpecialViewAction(self, "&Z positive", 'z_plus_view'), SpecialViewAction(self, "Z negative", 'z_minus_view'), name = '&View', ) ) # Application entry point. if __name__ == '__main__': # Create the GUI. gui = GUI() # Create and open an application window. window = ExampleWindow(size=(600,600)) window.open() # Start the GUI event loop! gui.start_event_loop() ##### EOF ##################################################################### mayavi-4.5.0/examples/tvtk/scene_editor.py0000644000076500000240000000365412747716313021260 0ustar prabhustaff00000000000000"""A very silly example of using a scene editor. More complex examples are available in mayavi. """ # Author: Prabhu Ramachandran # Copyright (c) 2007, Enthought, Inc. # License: BSD Style. from traits.api import HasTraits, Enum, Instance, Any from traitsui.api import View, Item from tvtk.pyface.scene_model import SceneModel from tvtk.pyface.scene_editor import SceneEditor from tvtk.pyface import actors from tvtk.api import tvtk ###################################################################### class ActorViewer(HasTraits): # A simple trait to change the actors/widgets. actor_type = Enum('cone', 'sphere', 'plane_widget', 'box_widget') # The scene model. scene = Instance(SceneModel, ()) _current_actor = Any ###################### view = View(Item(name='actor_type'), Item(name='scene', editor=SceneEditor(), show_label=False, resizable=True, height=500, width=500) ) def __init__(self, **traits): super(ActorViewer, self).__init__(**traits) self._actor_type_changed(self.actor_type) #################################### # Private traits. def _actor_type_changed(self, value): scene = self.scene if self._current_actor is not None: scene.remove_actors(self._current_actor) if value == 'cone': a = actors.cone_actor() scene.add_actors(a) elif value == 'sphere': a = actors.sphere_actor() scene.add_actors(a) elif value == 'plane_widget': a = tvtk.PlaneWidget() scene.add_actors(a) elif value == 'box_widget': a = tvtk.BoxWidget() scene.add_actors(a) self._current_actor = a if __name__ == '__main__': a = ActorViewer() a.configure_traits() mayavi-4.5.0/examples/tvtk/simple.py0000644000076500000240000000377212747716313020107 0ustar prabhustaff00000000000000#!/usr/bin/env python """A simple example demonstrating TVTK. This example is basically a translation of the VTK tutorial demo available in VTK/Examples/Tutorial/Step6/Python/Cone6.py. """ # Author: Prabhu Ramachandran # Copyright (c) 2004-2006, Enthought, Inc. # License: BSD Style. from tvtk.api import tvtk from tvtk.common import configure_input_data # Create a cone source and configure it. cs = tvtk.ConeSource(height=3.0, radius=1.0, resolution=36) # Print the traits of the cone. #cs.print_traits() # Setup the rest of the pipeline. m = tvtk.PolyDataMapper() # Note that VTK's GetOutput method is special because it has two call # signatures: GetOutput() and GetOutput(int N) (which gets the N'th # output). In tvtk it is represented as both a property and as a # method. Using the output property will work fine if all you want is # the default output. OTOH if you want the N'th output use # get_output(N). # m.input = cs.output # or m.input = cs.get_output() configure_input_data(m, cs.output) cs.update() # Create the actor and set its mapper. a = tvtk.Actor(mapper=m) # Create a Renderer, add the actor and set its background color. ren = tvtk.Renderer(background=(0.1, 0.2, 0.4)) ren.add_actor(a) # Create a RenderWindow, add the renderer and set its size. rw = tvtk.RenderWindow(size=(300,300)) rw.add_renderer(ren) # Create the RenderWindowInteractor rwi = tvtk.RenderWindowInteractor(render_window=rw) # Setup a box widget. bw = tvtk.BoxWidget(interactor=rwi, place_factor=1.25, prop3d=a) bw.place_widget() def callback(widget, event): """This callback sets the transformation of the cone using that setup by the the box.""" t = tvtk.Transform() bw.get_transform(t) bw.prop3d.user_transform = t # Add an observer bw.add_observer("InteractionEvent", callback) # Turn on the box interaction. The default is off and can be toggled # by pressing 'i' on the RenderWindowInteractor. bw.on() # Start the VTK event loop. rwi.initialize() rwi.start() mayavi-4.5.0/examples/tvtk/texture_glyph.py0000644000076500000240000000465012747716313021515 0ustar prabhustaff00000000000000#!/usr/bin/env python """ Illustrates the Glyph3D class and some basic texturing of the glyph. Notice how easy it is to create a simple PolyData object as the input of the Glyph using Python lists. """ # Author: Prabhu Ramachandran # Copyright (c) 2004-2006, Enthought, Inc. # License: BSD Style. from tvtk.api import tvtk from tvtk.common import is_old_pipeline, configure_input_data, configure_source_data # Source for glyph. Note that you need to pick a source that has # texture co-ords already set. If not you'll have to generate them. # This is easily done -- its just a 2d array of (u,v) coords each # between [0, 1] that you can set via something like # point_data.t_coords = . # # In this case CubeSource already defines texture coords for us (as of # VTK-4.4). cs = tvtk.CubeSource(x_length=2, y_length=1.0, z_length=0.5) # Create input for the glyph -- the sources are placed at these input # points. pts = [[1,1,1],[0,0,0], [-1,-1,-1]] pd = tvtk.PolyData(points=pts, polys=[[0],[1],[2]]) # Orientation/scaling is as per the vector attribute. vecs = [[1,0,0], [0,1,0], [0,0,1]] pd.point_data.vectors = vecs # Create the glyph3d and set up the pipeline. g = tvtk.Glyph3D(scale_mode='data_scaling_off', vector_mode = 'use_vector') configure_input_data(g, pd) # Note that VTK's vtkGlyph.SetSource is special because it has two # call signatures: SetSource(src) and SetSource(int N, src) (which # sets the N'th source). In tvtk it is represented as both a property # and as a method. Using the `source` property will work fine if all # you want is the first `source`. OTOH if you want the N'th `source` # use get_source(N). # g.source = cs.output configure_source_data(g, cs.output) cs.update() g.update() m = tvtk.PolyDataMapper() configure_input_data(m, g.output) a = tvtk.Actor(mapper=m) # Read the texture from image and set the texture on the actor. If # you don't like this image, replace with your favorite -- any image # will do (you must use a suitable reader though). img = tvtk.JPEGReader(file_name='images/masonry.jpg') t = tvtk.Texture(interpolate = 1) if is_old_pipeline(): t.input = img.output else: t.input_connection = img.output_port a.texture = t # Renderwindow stuff and add actor. rw = tvtk.RenderWindow(size=(600, 600)) ren = tvtk.Renderer(background=(0.5, 0.5, 0.5)) rw.add_renderer(ren) rwi = tvtk.RenderWindowInteractor(render_window=rw) ren.add_actor(a) rwi.initialize() rwi.start() mayavi-4.5.0/examples/tvtk/tiny_mesh.py0000644000076500000240000000424412747716313020610 0ustar prabhustaff00000000000000#!/usr/bin/env python """A simple example demonstrating how one can use numpy arrays transparently with TVTK. """ # Author: Prabhu Ramachandran and Eric Jones # Copyright (c) 2004-2007, Enthought, Inc. # License: BSD Style. from tvtk.api import tvtk from tvtk.common import configure_input_data from numpy import array ### DATA data = array([[0,0,0,10], [1,0,0,20], [0,1,0,20], [0,0,1,30]], 'f') triangles = array([[0,1,3], [0,3,2], [1,2,3], [0,2,1]]) points = data[:,:3] temperature = data[:,-1] ### TVTK PIPELINE # create a renderer renderer = tvtk.Renderer() # create a render window and hand it the renderer render_window = tvtk.RenderWindow(size=(400,400)) render_window.add_renderer(renderer) # create interactor and hand it the render window # This handles mouse interaction with window. interactor = tvtk.RenderWindowInteractor(render_window=render_window) # Create a mesh from the data created above. mesh = tvtk.PolyData(points=points, polys=triangles) mesh.point_data.scalars = temperature # Set the mapper to scale temperature range # across the entire range of colors mapper = tvtk.PolyDataMapper() configure_input_data(mapper, mesh) mapper.scalar_range = min(temperature), max(temperature) # Create mesh actor for display actor = tvtk.Actor(mapper=mapper) # Create a scalar bar scalar_bar = tvtk.ScalarBarActor(title="Temperature", orientation='horizontal', width=0.8, height=0.17, lookup_table = mapper.lookup_table) scalar_bar.position_coordinate.coordinate_system = 'normalized_viewport' scalar_bar.position_coordinate.value = 0.1, 0.01, 0.0 # Use the ScalarBarWidget so we can drag the scalar bar around. sc_bar_widget = tvtk.ScalarBarWidget(interactor=interactor, scalar_bar_actor=scalar_bar) # Now add the actors to the renderer and start the interaction. renderer.add_actor(actor) interactor.initialize() # Enable the widget so the scalar bar can be seen. Press 'i' to # disable the widget. sc_bar_widget.enabled = True interactor.start() mayavi-4.5.0/examples/tvtk/visual/0000755000076500000240000000000012747722127017536 5ustar prabhustaff00000000000000mayavi-4.5.0/examples/tvtk/visual/bounce.py0000644000076500000240000000305312747716313021364 0ustar prabhustaff00000000000000#!/usr/bin/env python """A simple example demonstrating the creation of actors and animating the in a scene using visual modeule.""" # Author: Raashid Baig # License: BSD Style. from tvtk.tools.visual import box, sphere, vector, iterate, show def main(): # Creating parameters for box size side = 4.0 thk = 0.3 s2 = 2*side - thk s3 = 2*side + thk # Creating the 6 walls wallR = box( pos = (side, 0, 0), size = (thk, s3, s2), color = (1, 0, 0)) wallL = box( pos = (-side, 0, 0), size = (thk, s3, s2), color = (1, 0, 0)) wallB = box( pos = (0, -side, 0), size = (s3, thk, s3), color = (0, 0, 1)) wallT = box( pos = (0, side, 0), size = (s3, thk, s3), color = (0, 0, 1)) wallBK = box( pos = (0, 0, -side), size = (s2, s2, thk), color = (0.7,0.7,0.7)) # Creating the ball ball = sphere(radius = 0.4, color = (0, 1, 0)) ball.vector = vector(-0.15, -0.23, 0.27) side = side -thk*0.5 - ball.radius ball.t = 0.0 ball.dt = 0.5 def anim(): #Creating the animation function which will be called at #uniform timeperiod through the iterate function ball.t = ball.t + ball.dt ball.pos = ball.pos + ball.vector*ball.dt if not (side > ball.x > -side): ball.vector.x = -ball.vector.x if not (side > ball.y > -side): ball.vector.y = -ball.vector.y if not (side > ball.z > -side): ball.vector.z = -ball.vector.z a = iterate(20, anim) show() return a if __name__ == '__main__': main() mayavi-4.5.0/examples/tvtk/visual/doublependulum.py0000644000076500000240000000561512747716313023143 0ustar prabhustaff00000000000000#!/usr/bin/env python """A simple example demonstrating the creation of actors and animating the in a scene using visual modeule.""" # Author: Raashid Baig # License: BSD Style. # Double pendulum #The analysis is in terms of Lagrangian mechanics. The Lagrangian #variables are angle of upper bar, angle of lower bar,measured from #the vertical. from tvtk.tools.visual import box, vector, frame, iterate, show from math import pi, sin g = 9.8 M1 = 2.0 M2 = 1.0 d = 0.05 # thickness of each bar gap = 2.*d # distance between two parts of upper, U-shaped assembly L1 = 0.5 # physical length of upper assembly; distance between axles L1display = L1+d # show upper assembly a bit longer than physical, to overlap axle L2 = 1.0 # physical length of lower bar L2display = L2+d/2. # show lower bar a bit longer than physical, to overlap axle # Coefficients used in Lagrangian calculation A = (1./4.)*M1*L1**2+(1./12.)*M1*L1**2+M2*L1**2 B = (1./2.)*M2*L1*L2 C = g*L1*(M1/2.+M2) D = M2*L1*L2/2. E = (1./12.)*M2*L2**2+(1./4.)*M2*L2**2 F = g*L2*M2/2. hpedestal = 1.3*(L1+L2) # height of pedestal wpedestal = 0.1 # width of pedestal tbase = 0.05 # thickness of base wbase = 8.*gap # width of base offset = 2.*gap # from center of pedestal to center of U-shaped upper assembly top = vector(0,0,0) # top of inner bar of U-shaped upper assembly theta1 = 1.3*pi/2. # initial upper angle (from vertical) theta1dot = 0 # initial rate of change of theta1 theta2 = 0 # initial lower angle (from vertical) theta2dot = 0 # initial rate of change of theta2 pedestal = box(pos = (top - vector(0, hpedestal/2.0, offset)),size = (wpedestal, 1.1*hpedestal, wpedestal), color = (0.4,0.4,0.5)) base = box(pos = (top - vector(0,hpedestal + tbase/2.0, offset)),size=(wbase, tbase, wbase),color = (0.4,0.4,0.5)) bar1 = box(pos=(L1display/2.0 - d/2.0, 0, -(gap+d)/2.0), size=(L1display, d, d), color=(1,0,0)) bar1b = box(pos=(L1display/2.0 - d/2.0, 0, (gap+d)/2.0), size=(L1display, d, d), color=(1,0,0)) frame1 = frame(bar1, bar1b) frame1.pos = (0.0, 0.0, 0.0) frame1.axis = (0.0, -1.0, 0.0) frame1.rotate(axis=(0,0,1), angle = 180.0*theta1/pi) bar2 = box(pos = (L2display/2.0 - d/2.0, 0, 0), size = (L2display, d, d), color = (0,1,0)) frame2 = frame(bar2) frame2.pos = (0.0, -1.0*L1, 0.0) frame2.axis = (0.0, -1.0, 0.0) frame2.rotate(axis = (0,0,1), angle = 180.0*theta2/pi) dt = 0.001 def anim(): global theta1, theta2, theta1dot, theta2dot atheta1 = ((E*C/B)*sin(theta1)-F*sin(theta2))/(D-E*A/B) atheta2 = -(A*atheta1+C*sin(theta1))/B theta1dot = theta1dot + atheta1*dt theta2dot = theta2dot + atheta2*dt dtheta1 = theta1dot*dt dtheta2 = theta2dot*dt theta1 = theta1 + dtheta1 theta2 = theta2 + dtheta2 frame1.rotate(axis = (0,0,1), angle = 180.0*dtheta1/pi) frame2.pos = top + frame1.axis*L1 frame2.rotate(axis = (0,0,1), angle = 180*dtheta2/pi) a = iterate(20, anim) a.edit_traits() show() mayavi-4.5.0/examples/tvtk/visual/gyro.py0000644000076500000240000000717212747716313021077 0ustar prabhustaff00000000000000#!/usr/bin/env python # Author: Raashid Baig # License: BSD Style. # Gyroscope hanging from a spring from math import atan, cos, sin, pi from tvtk.tools.visual import vector, MVector, Box, Helix, Frame, \ Cylinder, curve, color, iterate, show top = vector(0,1.,0) # where top of spring is held ks = 100. # spring stiffness Lspring = 1. # unstretched length of spring Rspring = 0.03 # radius of spring Dspring = 0.03 # thickness of spring wire Lshaft = 1. # length of gyroscope shaft Rshaft = 0.03 # radius of gyroscope shaft M = 1. # mass of gyroscope (massless shaft) Rrotor = 0.4 # radius of gyroscope rotor Drotor = 0.1 # thickness of gyroscope rotor Dsquare = 1.4*Drotor # thickness of square that turns with rotor I = 0.5*M*Rrotor**2. # moment of inertia of gyroscope omega = 40.0 # angular velocity of rotor along axis g = 9.8 Fgrav = MVector(0,-M*g,0) precession = M*g*(Lshaft/2.)/(I*abs(omega)) # exact precession angular velocity phi = atan(precession**2*(Lshaft/2.)/g) # approximate angle of spring to vertical s = M*g/(ks*cos(phi)) # approximate stretch of spring # Refine estimate of angle of spring to vertical: phi = 1./(((I*abs(omega))/(M*Lshaft/2.))**2/(g*Lshaft/2.)-(Lspring+s)/(Lshaft/2.)) # Refine again: s = M*g/(ks*cos(phi)) phi = 1./( ((I*abs(omega))/(M*Lshaft/2.))**2/(g*Lshaft/2.)-(Lspring+s)/(Lshaft/2.) ) # Momentum required for completely smooth precession: pprecess = vector(0,0,M*precession*(Lshaft/2.+(Lspring+s)*sin(phi))) if omega < 0: pprecess = -pprecess support = Box(pos = top+MVector(0,0.01,0), size = (0.2,0.02,0.2), color = (0,1,0)) spring = Helix(pos = top, axis = vector(-0.161579, -0.98686, 0), radius = Rspring, color = (1,0.7,0.2)) gyro1 = Frame(pos = top+spring.axis) # gyro.pos at end of spring gyro1.axis = MVector(1,0,0) shaft = Cylinder(pos = gyro1.pos, axis = Lshaft*gyro1.axis, radius = Rshaft, color = (0.85,0.85,0.85), length = 1.0) rotor = Cylinder(pos = 0.5*gyro1.axis*(Lshaft-Drotor), axis = gyro1.axis*Drotor, radius = Rrotor, color = (0.5,0.5,0.5), length = 0.1) stripe1 = curve(color = color.green, points = [rotor.pos+1.03*rotor.axis+vector(0,Rrotor,0), rotor.pos+1.03*rotor.axis-vector(0,Rrotor,0)]) stripe2 = curve(color = color.green, points = [rotor.pos-0.03*rotor.axis+vector(0,Rrotor,0), rotor.pos-0.03*rotor.axis-vector(0,Rrotor,0)]) gyro = Frame(stripe1, stripe2) # gyro.pos at end of spring gyro.pos = top+spring.axis # gyro.pos at end of spring gyro.axis = vector(1,0,0) gyro.rotate(axis=(0,1,0), angle = 180.0, origin = gyro.pos) cm = gyro.pos+0.5*Lshaft*gyro.axis # center of mass of shaft Lrot = I*omega*gyro.axis p = pprecess dt = 0.01 t = 0. c = 0 def anim(): global Lrot, p, cm, t Fspring = -ks*vector.norm(spring.axis)*(vector.mag(spring.axis)-Lspring) # Calculate torque about center of mass: torque = vector.cross(-0.5*Lshaft*gyro.axis,Fspring) Lrot = Lrot+torque*dt p = p+(Fgrav+Fspring)*dt cm = cm+(p/M)*dt # Update positions of shaft, rotor, spring, stripes if omega > 0: gyro.axis = vector.norm(Lrot) else: gyro.axis = -vector.norm(Lrot) gyro.pos = cm-0.5*Lshaft*gyro.axis # shaft rotated, adjust connection to spring spring.axis = gyro.pos - top spring.length = vector.mag(spring.axis) gyro.rotate(180*omega*dt/(4.0*pi), gyro.axis, gyro.pos) # spin easier to see if slower than actual omega shaft.pos = gyro.pos shaft.axis = Lshaft*gyro.axis rotor.pos = gyro.pos + 0.5*gyro.axis*(Lshaft-Drotor) rotor.axis = gyro.axis*Drotor t = t+dt a = iterate(40, anim) a.edit_traits() show() mayavi-4.5.0/examples/tvtk/visual/gyro2.py0000644000076500000240000000655012747716313021160 0ustar prabhustaff00000000000000#!/usr/bin/env python """A simple example demonstrating the creation of actors and animating the in a scene using visual modeule.""" # Author: Raashid Baig # License: BSD Style. from math import pi, cos, sin from tvtk.tools.visual import vector, box, cylinder, frame, curve, \ iterate, show # Gyroscope sitting on a pedestal # The analysis is in terms of Lagrangian mechanics. # The Lagrangian variables are polar angle theta, # azimuthal angle phi, and spin angle alpha. Lshaft = 1. # length of gyroscope shaft Rshaft = 0.03 # radius of gyroscope shaft M = 1. # mass of gyroscope (massless shaft) Rrotor = 0.4 # radius of gyroscope rotor Drotor = 0.1 # thickness of gyroscope rotor Dsquare = 1.4*Drotor # thickness of square that turns with rotor I = 0.5*M*Rrotor**2. # moment of inertia of gyroscope hpedestal = Lshaft # height of pedestal wpedestal = 0.1 # width of pedestal tbase = 0.05 # thickness of base wbase = 3.*wpedestal # width of base g = 9.8 Fgrav = vector(0,-M*g,0) top = vector(0,0,0) # top of pedestal theta = pi/3. # initial polar angle of shaft (from vertical) thetadot = 0 # initial rate of change of polar angle alpha = 0 # initial spin angle alphadot = 15 # initial rate of change of spin angle (spin ang. velocity) phi = -pi/2. # initial azimuthal angle phidot = 0 # initial rate of change of azimuthal angle # Comment in following line to get pure precession ##phidot = (-alphadot+sqrt(alphadot**2+2*M*g*r*cos(theta)/I))/cos(theta) pedestal = box(pos=top-vector(0,hpedestal/2.,0), height=hpedestal, length=wpedestal, width=wpedestal, color=(0.4,0.4,0.5)) base = box(pos=top-vector(0,hpedestal+tbase/2.,0), height=tbase, length=wbase, width=wbase, color=pedestal.color) shaft = cylinder(axis=(Lshaft,0,0), length = Lshaft, radius=Rshaft, color=(0,1,0)) rotor = cylinder(pos=(Lshaft/2 - Drotor/2, 0, 0), axis=(Drotor, 0, 0), length = Drotor, radius=Rrotor, color=(1,0,0)) gyro = frame(shaft, rotor) gyro.axis = (sin(theta)*sin(phi),cos(theta),sin(theta)*cos(phi)) trail = curve(radius=Rshaft/8., color=(1,1,0)) r = Lshaft/2. dt = 0.0001 t = 0. Nsteps = 20 # number of calculational steps between graphics updates def anim(): global theta, phidot, alphadot, M, g, r, thetadot, phi, alpha, t for step in range(Nsteps): # multiple calculation steps for accuracy # Calculate accelerations of the Lagrangian coordinates: atheta = (phidot**2*sin(theta)*cos(theta) -2.*(alphadot+phidot*cos(theta))*phidot*sin(theta) +2.*M*g*r*sin(theta)/I) aphi = 2.*thetadot*(alphadot-phidot*cos(theta))/sin(theta) aalpha = phidot*thetadot*sin(theta)-aphi*cos(theta) # Update velocities of the Lagrangian coordinates: thetadot = thetadot+atheta*dt phidot = phidot+aphi*dt alphadot = alphadot+aalpha*dt # Update Lagrangian coordinates: theta = theta+thetadot*dt phi = phi+phidot*dt alpha = alpha+alphadot*dt gyro.axis = vector(sin(theta)*sin(phi),cos(theta),sin(theta)*cos(phi)) # Display approximate rotation of rotor and shaft: gyro.rotate(axis = gyro.axis, angle=alphadot*dt*Nsteps, origin = gyro.pos) trail.append(gyro.pos + gyro.axis * Lshaft) t = t+dt*Nsteps a = iterate(40, anim) a.edit_traits() show() mayavi-4.5.0/examples/tvtk/visual/lorenz.py0000644000076500000240000000165612747716313021431 0ustar prabhustaff00000000000000#!/usr/bin/env python # Author: Raashid Baig # License: BSD Style. from tvtk.tools.visual import curve, box, vector, show lorenz = curve( color = (1,1,1), radius=0.3 ) # Draw grid for x in range(0,51,10): curve(points = [[x,0,-25],[x,0,25]], color = (0,0.5,0), radius = 0.3 ) box(pos=(x,0,0), axis=(0,0,50), height=0.4, width=0.4, length = 50) for z in range(-25,26,10): curve(points = [[0,0,z], [50,0,z]] , color = (0,0.5,0), radius = 0.3 ) box(pos=(25,0,z), axis=(50,0,0), height=0.4, width=0.4, length = 50) dt = 0.01 y = vector(35.0, -10.0, -7.0) pts = [] for i in range(2000): # Integrate a funny differential equation dydt = vector( -8.0/3*y[0] + y[1]*y[2], - 10*y[1] + 10*y[2], - y[1]*y[0] + 28*y[1] - y[2]) y = y + dydt * dt pts.append(y) if len(pts) > 20: lorenz.extend(pts) pts[:] = [] show() mayavi-4.5.0/examples/tvtk/visual/orbit.py0000644000076500000240000000251312747716313021230 0ustar prabhustaff00000000000000#!/usr/bin/env python """A simple example demonstrating the creation of actors and animating the in a scene using visual modeule.""" # Author: Raashid Baig # License: BSD Style. from math import sqrt from tvtk.tools.visual import sphere, iterate, show, vector, curve #Creating the actors for the scene giant = sphere(pos=(-1.0e11, 0, 0), radius=2e10, color=(1, 0, 0), mass=2e30) dwarf = sphere(pos=(1.5e11, 0, 0), radius=1e10, color=(1, 1, 0), mass=1e30) giant.p = vector(0, 0, -1e4) * giant.mass dwarf.p = -1*giant.p # creating the curve which will trace the paths of actors for a in [giant, dwarf]: a.orbit = curve(radius=2e9, color=a.color) dt = 86400 def anim(): #Creating the animation function which will be called at #uniform timeperiod through the iterate function dist = dwarf.pos - giant.pos force = 6.7e-11 * giant.mass * dwarf.mass * \ dist/(sqrt(dist[0]**2 + dist[1]**2 + dist[2]**2))**3 giant.p = giant.p + force*dt dwarf.p = dwarf.p - force*dt for a in [giant, dwarf]: a.pos = a.pos + (a.p/a.mass)*dt a.orbit.append(a.pos) p = a.orbit.points if len(p) > 1000: a.orbit.points = p[200:] a = iterate(50, anim) a.edit_traits() show() mayavi-4.5.0/examples/tvtk/visual/randombox.py0000644000076500000240000000267012747716313022106 0ustar prabhustaff00000000000000#!/usr/bin/env python # Author: Raashid Baig # License: BSD Style. from random import random, randrange from numpy import arange from math import pi, cos, sin from tvtk.tools.visual import curve, box, arrow, \ sphere, cylinder, show def random_box(): xx = randrange(-55,54) yy = randrange(-55,54) zz = randrange(-55,54) x = randrange(0,21) y = randrange(0,21) z = randrange(0,21) red = random() green = random() blue = random() box (pos = (xx,yy,zz), length=x, height=y, width=z, color=(red,green,blue)) def wirecube(s): c = curve(color = (1,1,1), radius=1) pts = [(-s, -s, -s),(-s, -s, s), (-s, s, s), (-s, s, -s), (-s, -s, -s), (s, -s, -s), (s, s, -s), (-s, s, -s), (s, s, -s), (s, s, s), (-s, s, s), (s, s, s), (s, -s, s), (-s, -s, s), (s, -s, s),(s, -s, -s)] for pt in pts: c.append(pt) side = 150.0 cube = box(size = (side,side,side), representation = 'w' ) i = 0 while i < 100: random_box() i = i + 1 arrow(axis=(0,12,0), radius_shaft=3.5, color = (1,0,0)) ball = sphere(pos=(-side/2.,-side/2.,-side/2.),color=(1,1,0),radius=3) disk = cylinder(pos=(side/2.,side/2.,-side/2.),color=(.3,.3,1),axis=(1,1,0),radius=5) xx = arange(0,4*pi,pi/10.) spring=curve(color=(1,.7,.1), radius=0.4) for y in xx: spring.append([20+cos(2*y), y/2.-30, -20+sin(2*y)+30]) show() mayavi-4.5.0/examples/tvtk/visual/wave.py0000644000076500000240000000564412747716313021063 0ustar prabhustaff00000000000000#!/usr/bin/env python # Author: Raashid Baig # License: BSD Style. from math import sin, pi from numpy import zeros, float, arange from tvtk.tools.visual import show, Curve, iterate, MVector def main(): dt = 0.1 x = arange(-50,50) wpoints1 = zeros((100,3), float) wpoints2 = zeros((100,3), float) wpoints3 = zeros((100,3), float) wpoints4 = zeros((100,3), float) for i in range (0,100,1): wpoints1[i] = [x[i], -30, 0] wpoints2[i] = [x[i], -15, 0] wpoints3[i] = [x[i], 0, 0] wpoints4[i] = [x[i], 15, 0] band1 = Curve(points = wpoints1, k = 6.0, color = (1,0,0), mass = 2.0, radius = 0.5, momentum = zeros((100, 3), float)) band2 = Curve(points = wpoints2, k = 6.0, color = (1,1,0), mass = 2.0, radius = 0.5, momentum = zeros((100, 3), float)) band3 = Curve(points = wpoints3, k = 6.0, color = (0,1,0), mass = 2.0, radius = 0.5, momentum = zeros((100, 3), float)) band4 = Curve(points = wpoints4, k = 6.0, color = (0,0,1), mass = 2.0, radius = 0.5, momentum = zeros((100, 3), float)) for i in range(0,25,1): band1.momentum[i,1] = sin(x[i]*pi/25.0)*3 # half-wave pulse for i in range(0,25,1): band2.momentum[i,1] = sin(x[i]*2*pi/25.0)*5 # full-wave pulse for i in range(0,25,1): band3.momentum[i,0] = sin(x[i]*pi/25.0)*5 # compresion pulse for i in range(0,100,1): band4.momentum[i,1] = sin(x[i]*4*pi/100.0)*2 # standing wave def anim(): band1.momentum[0] = band1.momentum[-1] = MVector(0,0,0) band2.momentum[0] = band2.momentum[-1] = MVector(0,0,0) band3.momentum[0] = band3.momentum[-1] = MVector(0,0,0) band4.momentum[0] = band4.momentum[-1] = MVector(0,0,0) band1.points = band1.points + (band1.momentum/band1.mass*dt) band2.points = band2.points + (band2.momentum/band2.mass*dt) band3.points = band3.points + (band3.momentum/band3.mass*dt) band4.points = band4.points + (band4.momentum/band4.mass*dt) force1 = band1.k * (band1.points[1:] - band1.points[:-1]) force2 = band2.k * (band2.points[1:] - band2.points[:-1]) force3 = band3.k * (band3.points[1:] - band3.points[:-1]) force4 = band4.k * (band4.points[1:] - band4.points[:-1]) band1.momentum[:-1] = band1.momentum[:-1] + force1 * dt band2.momentum[:-1] = band2.momentum[:-1] + force2 * dt band3.momentum[:-1] = band3.momentum[:-1] + force3 * dt band4.momentum[:-1] = band4.momentum[:-1] + force4 * dt band1.momentum[1:] = band1.momentum[1:] - force1 * dt band2.momentum[1:] = band2.momentum[1:] - force2 * dt band3.momentum[1:] = band3.momentum[1:] - force3 * dt band4.momentum[1:] = band4.momentum[1:] - force4 * dt a = iterate(20, anim) show() return a if __name__ == '__main__': main() mayavi-4.5.0/image_LICENSE.txt0000644000076500000240000000546112747716313016420 0ustar prabhustaff00000000000000The icons are mostly derived work from other icons. As such they are licensed accordingly to the original license: Eclipse: Eclipse Public Licence see icon_LICENSE_Eclipse.txt Nuvola: LGPL license as described in icon_LICENSE_Nuvola.txt Crystal: LGPL license as described in icon_LICENSE_CP.txt OOo: LGPL license as described in icon_LICENSE_OOo.txt GV: Gael Varoquaux: BSD-licensed Unless stated in this file, icons are work of enthought, and are released under a 3 clause BSD-like license. Files and original authors: ---------------------------------------------------------------- mayavi/core/images/: add.ico | GV add_module.png | Crystal add_scene.png | Crystal add_source.png | Crystal file.png | GV filter.ico | Nuvola module.ico | Crystal modulemanager.ico | Crystal scene.ico | Crystal source.ico | Crystal mayavi/core/ui/images/: add_filter.png | Nuvola add_module.png | Crystal add_scene.png | Crystal add_source.png | Crystal add.ico | GV help_action.png | GV m2.png | GV mv2.ico | GV mayavi/images/: m2.png | GV m2_about.jpg | GV tvtk/pipeline/images/: actor.png | Nuvola camera.png | GV coordinate.png | Crystal filter.png | Nuvola lookuptable.png | OOo mapper.png | Crystal polydata.png | Nuvola property.png | Eclipse reader.png | Crystal renderer.png | Crystal rendererwindowinteractor.png | Nuvola rendererwindow.png | Crystal source.png | OOo texture.png | Eclipse window.png | Eclipse writer.png | GV tvtk/pyface/images/16x16/: configure.png | Nuvola fullscreen.png | GV isometric.png | Nuvola origin_glyph.png | Enthought parallel.png | GV save.png | Crystal x-axis.png | Eclipse y-axis.png | Eclipse z-axis.png | Eclipse tvtk/tools/images/: scene.ico | Crystal examples/tvtk/images/: masonry.jpg | BSD-like license mayavi-4.5.0/image_LICENSE_CP.txt0000644000076500000240000004671612747716313017012 0ustar prabhustaff00000000000000License The Crystal Project are released under LGPL. GNU General Public License. 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: a. The modified work must itself be a software library. b. You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. c. You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. d. If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: a. Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) . b. Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. c. Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. d. If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. e. Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: a. Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. b. Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), 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 distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser 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 Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. No Warranty 15. Because the library is licensed free of charge, there is no warranty for the library, to the extent permitted by applicable law. Except when otherwise stated in writing the copyright holders and/or other parties provide the library "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 library is with you. Should the library prove defective, you assume the cost of all necessary servicing, repair or correction. 16. In no event unless required by applicable law or agreed to in writing will any copyright holder, or any other party who may modify and/or redistribute the library 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 library (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 library to operate with any other software), even if such holder or other party has been advised of the possibility of such damages. mayavi-4.5.0/image_LICENSE_Eclipse.txt0000644000076500000240000002604312747716313020063 0ustar prabhustaff00000000000000Eclipse Public License - v 1.0 THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENTS ACCEPTANCE OF THIS AGREEMENT. 1. DEFINITIONS "Contribution" means: a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and b) in the case of each subsequent Contributor: i)changes to the Program, and ii)additions to the Program; where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributors behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program. "Contributor" means any person or entity that distributes the Program. "Licensed Patents " mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program. "Program" means the Contributions distributed in accordance with this Agreement. "Recipient" means anyone who receives the Program under this Agreement, including all Contributors. 2. GRANT OF RIGHTS a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form. b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder. c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipients responsibility to acquire that license before distributing the Program. d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement. 3. REQUIREMENTS A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that: a) it complies with the terms and conditions of this Agreement; and b) its license agreement: i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose; ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits; iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange. When the Program is made available in source code form: a) it must be made available under this Agreement; and b) a copy of this Agreement must be included with each copy of the Program. Contributors may not remove or alter any copyright notices contained within the Program. Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution. 4. COMMERCIAL DISTRIBUTION Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense. For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributors responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages. 5. NO WARRANTY EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement , including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations. 6. DISCLAIMER OF LIABILITY EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), 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 OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 7. GENERAL If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable. If Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipients patent(s), then such Recipients rights granted under Section 2(b) shall terminate as of the date such litigation is filed. All Recipients rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipients rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipients obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive. Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. The Eclipse Foundation is the initial Agreement Steward. The Eclipse Foundation may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved. This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation. mayavi-4.5.0/image_LICENSE_Nuvola.txt0000644000076500000240000005664512747716313017756 0ustar prabhustaff00000000000000GNU LESSER GENERAL PUBLIC LICENSE Version 2.1, February 1999 Copyright (C) 1991, 1999 Free Software Foundation, Inc. 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. [This is the first released version of the Lesser GPL. It also counts as the successor of the GNU Library Public License, version 2, hence the version number 2.1.] Preamble The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public Licenses are intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This license, the Lesser General Public License, applies to some specially designated software packages--typically libraries--of the Free Software Foundation and other authors who decide to use it. You can use it too, but we suggest you first think carefully about whether this license or the ordinary General Public License is the better strategy to use in any particular case, based on the explanations below. When we speak of free software, we are referring to freedom of use, 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 this service if you wish); that you receive source code or can get it if you want it; that you can change the software and use pieces of it in new free programs; and that you are informed that you can do these things. To protect your rights, we need to make restrictions that forbid distributors to deny you these rights or to ask you to surrender these rights. These restrictions translate to certain responsibilities for you if you distribute copies of the library or if you modify it. For example, if you distribute copies of the library, whether gratis or for a fee, you must give the recipients all the rights that we gave you. You must make sure that they, too, receive or can get the source code. If you link other code with the library, you must provide complete object files to the recipients, so that they can relink them with the library after making changes to the library and recompiling it. And you must show them these terms so they know their rights. We protect your rights with a two-step method: (1) we copyright the library, and (2) we offer you this license, which gives you legal permission to copy, distribute and/or modify the library. To protect each distributor, we want to make it very clear that there is no warranty for the free library. Also, if the library is modified by someone else and passed on, the recipients should know that what they have is not the original version, so that the original author's reputation will not be affected by problems that might be introduced by others. Finally, software patents pose a constant threat to the existence of any free program. We wish to make sure that a company cannot effectively restrict the users of a free program by obtaining a restrictive license from a patent holder. Therefore, we insist that any patent license obtained for a version of the library must be consistent with the full freedom of use specified in this license. Most GNU software, including some libraries, is covered by the ordinary GNU General Public License. This license, the GNU Lesser General Public License, applies to certain designated libraries, and is quite different from the ordinary General Public License. We use this license for certain libraries in order to permit linking those libraries into non-free programs. When a program is linked with a library, whether statically or using a shared library, the combination of the two is legally speaking a combined work, a derivative of the original library. The ordinary General Public License therefore permits such linking only if the entire combination fits its criteria of freedom. The Lesser General Public License permits more lax criteria for linking other code with the library. We call this license the "Lesser" General Public License because it does Less to protect the user's freedom than the ordinary General Public License. It also provides other free software developers Less of an advantage over competing non-free programs. These disadvantages are the reason we use the ordinary General Public License for many libraries. However, the Lesser license provides advantages in certain special circumstances. For example, on rare occasions, there may be a special need to encourage the widest possible use of a certain library, so that it becomes a de-facto standard. To achieve this, non-free programs must be allowed to use the library. A more frequent case is that a free library does the same job as widely used non-free libraries. In this case, there is little to gain by limiting the free library to free software only, so we use the Lesser General Public License. In other cases, permission to use a particular library in non-free programs enables a greater number of people to use a large body of free software. For example, permission to use the GNU C Library in non-free programs enables many more people to use the whole GNU operating system, as well as its variant, the GNU/Linux operating system. Although the Lesser General Public License is Less protective of the users' freedom, it does ensure that the user of a program that is linked with the Library has the freedom and the wherewithal to run that program using a modified version of the Library. The precise terms and conditions for copying, distribution and modification follow. Pay close attention to the difference between a "work based on the library" and a "work that uses the library". The former contains code derived from the library, whereas the latter must be combined with the library in order to run. TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION 0. This License Agreement applies to any software library or other program which contains a notice placed by the copyright holder or other authorized party saying it may be distributed under the terms of this Lesser General Public License (also called "this License"). Each licensee is addressed as "you". A "library" means a collection of software functions and/or data prepared so as to be conveniently linked with application programs (which use some of those functions and data) to form executables. The "Library", below, refers to any such software library or work which has been distributed under these terms. A "work based on the Library" means either the Library or any derivative work under copyright law: that is to say, a work containing the Library or a portion of it, either verbatim or with modifications and/or translated straightforwardly into another language. (Hereinafter, translation is included without limitation in the term "modification".) "Source code" for a work means the preferred form of the work for making modifications to it. For a library, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the library. Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running a program using the Library is not restricted, and output from such a program is covered only if its contents constitute a work based on the Library (independent of the use of the Library in a tool for writing it). Whether that is true depends on what the Library does and what the program that uses the Library does. 1. You may copy and distribute verbatim copies of the Library's complete source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and distribute a copy of this License along with the Library. You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee. 2. You may modify your copy or copies of the Library or any portion of it, thus forming a work based on the Library, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions: * a) The modified work must itself be a software library. * b) You must cause the files modified to carry prominent notices stating that you changed the files and the date of any change. * c) You must cause the whole of the work to be licensed at no charge to all third parties under the terms of this License. * d) If a facility in the modified Library refers to a function or a table of data to be supplied by an application program that uses the facility, other than as an argument passed when the facility is invoked, then you must make a good faith effort to ensure that, in the event an application does not supply such function or table, the facility still operates, and performs whatever part of its purpose remains meaningful. (For example, a function in a library to compute square roots has a purpose that is entirely well-defined independent of the application. Therefore, Subsection 2d requires that any application-supplied function or table used by this function must be optional: if the application does not supply it, the square root function must still compute square roots.) These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Library, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Library, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it. Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Library. In addition, mere aggregation of another work not based on the Library with the Library (or with a work based on the Library) on a volume of a storage or distribution medium does not bring the other work under the scope of this License. 3. You may opt to apply the terms of the ordinary GNU General Public License instead of this License to a given copy of the Library. To do this, you must alter all the notices that refer to this License, so that they refer to the ordinary GNU General Public License, version 2, instead of to this License. (If a newer version than version 2 of the ordinary GNU General Public License has appeared, then you can specify that version instead if you wish.) Do not make any other change in these notices. Once this change is made in a given copy, it is irreversible for that copy, so the ordinary GNU General Public License applies to all subsequent copies and derivative works made from that copy. This option is useful when you wish to copy part of the code of the Library into a program that is not a library. 4. You may copy and distribute the Library (or a portion or derivative of it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange. If distribution of object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place satisfies the requirement to distribute the source code, even though third parties are not compelled to copy the source along with the object code. 5. A program that contains no derivative of any portion of the Library, but is designed to work with the Library by being compiled or linked with it, is called a "work that uses the Library". Such a work, in isolation, is not a derivative work of the Library, and therefore falls outside the scope of this License. However, linking a "work that uses the Library" with the Library creates an executable that is a derivative of the Library (because it contains portions of the Library), rather than a "work that uses the library". The executable is therefore covered by this License. Section 6 states terms for distribution of such executables. When a "work that uses the Library" uses material from a header file that is part of the Library, the object code for the work may be a derivative work of the Library even though the source code is not. Whether this is true is especially significant if the work can be linked without the Library, or if the work is itself a library. The threshold for this to be true is not precisely defined by law. If such an object file uses only numerical parameters, data structure layouts and accessors, and small macros and small inline functions (ten lines or less in length), then the use of the object file is unrestricted, regardless of whether it is legally a derivative work. (Executables containing this object code plus portions of the Library will still fall under Section 6.) Otherwise, if the work is a derivative of the Library, you may distribute the object code for the work under the terms of Section 6. Any executables containing that work also fall under Section 6, whether or not they are linked directly with the Library itself. 6. As an exception to the Sections above, you may also combine or link a "work that uses the Library" with the Library to produce a work containing portions of the Library, and distribute that work under terms of your choice, provided that the terms permit modification of the work for the customer's own use and reverse engineering for debugging such modifications. You must give prominent notice with each copy of the work that the Library is used in it and that the Library and its use are covered by this License. You must supply a copy of this License. If the work during execution displays copyright notices, you must include the copyright notice for the Library among them, as well as a reference directing the user to the copy of this License. Also, you must do one of these things: * a) Accompany the work with the complete corresponding machine-readable source code for the Library including whatever changes were used in the work (which must be distributed under Sections 1 and 2 above); and, if the work is an executable linked with the Library, with the complete machine-readable "work that uses the Library", as object code and/or source code, so that the user can modify the Library and then relink to produce a modified executable containing the modified Library. (It is understood that the user who changes the contents of definitions files in the Library will not necessarily be able to recompile the application to use the modified definitions.) * b) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (1) uses at run time a copy of the library already present on the user's computer system, rather than copying library functions into the executable, and (2) will operate properly with a modified version of the library, if the user installs one, as long as the modified version is interface-compatible with the version that the work was made with. * c) Accompany the work with a written offer, valid for at least three years, to give the same user the materials specified in Subsection 6a, above, for a charge no more than the cost of performing this distribution. * d) If distribution of the work is made by offering access to copy from a designated place, offer equivalent access to copy the above specified materials from the same place. * e) Verify that the user has already received a copy of these materials or that you have already sent this user a copy. For an executable, the required form of the "work that uses the Library" must include any data and utility programs needed for reproducing the executable from it. However, as a special exception, the materials to be distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable. It may happen that this requirement contradicts the license restrictions of other proprietary libraries that do not normally accompany the operating system. Such a contradiction means you cannot use both them and the Library together in an executable that you distribute. 7. You may place library facilities that are a work based on the Library side-by-side in a single library together with other library facilities not covered by this License, and distribute such a combined library, provided that the separate distribution of the work based on the Library and of the other library facilities is otherwise permitted, and provided that you do these two things: * a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities. This must be distributed under the terms of the Sections above. * b) Give prominent notice with the combined library of the fact that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 8. You may not copy, modify, sublicense, link with, or distribute the Library except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense, link with, or distribute the Library is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance. 9. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Library or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Library (or any work based on the Library), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Library or works based on it. 10. Each time you redistribute the Library (or any work based on the Library), the recipient automatically receives a license from the original licensor to copy, distribute, link with or modify the Library subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties with this License. 11. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), 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 distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Library at all. For example, if a patent license would not permit royalty-free redistribution of the Library by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Library. If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply, and the section as a whole is intended to apply in other circumstances. It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice. This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License. 12. If the distribution and/or use of the Library is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Library under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License. 13. The Free Software Foundation may publish revised and/or new versions of the Lesser 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 Library specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Library does not specify a license version number, you may choose any version ever published by the Free Software Foundation. 14. If you wish to incorporate parts of the Library into other free programs whose distribution conditions are incompatible with these, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally. NO WARRANTY 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "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 LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE LIBRARY 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 LIBRARY (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 LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. mayavi-4.5.0/image_LICENSE_OOo.txt0000644000076500000240000001641112747716313017171 0ustar prabhustaff00000000000000GNU LESSER 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. This version of the GNU Lesser General Public License incorporates the terms and conditions of version 3 of the GNU General Public License, supplemented by the additional permissions listed below. 0. Additional Definitions. As used herein, this License refers to version 3 of the GNU Lesser General Public License, and the GNU GPL refers to version 3 of the GNU General Public License. The Library refers to a covered work governed by this License, other than an Application or a Combined Work as defined below. An Application is any work that makes use of an interface provided by the Library, but which is not otherwise based on the Library. Defining a subclass of a class defined by the Library is deemed a mode of using an interface provided by the Library. A Combined Work is a work produced by combining or linking an Application with the Library. The particular version of the Library with which the Combined Work was made is also called the Linked Version. The Minimal Corresponding Source for a Combined Work means the Corresponding Source for the Combined Work, excluding any source code for portions of the Combined Work that, considered in isolation, are based on the Application, and not on the Linked Version. The Corresponding Application Code for a Combined Work means the object code and/or source code for the Application, including any data and utility programs needed for reproducing the Combined Work from the Application, but excluding the System Libraries of the Combined Work. 1. Exception to Section 3 of the GNU GPL. You may convey a covered work under sections 3 and 4 of this License without being bound by section 3 of the GNU GPL. 2. Conveying Modified Versions. If you modify a copy of the Library, and, in your modifications, a facility refers to a function or data to be supplied by an Application that uses the facility (other than as an argument passed when the facility is invoked), then you may convey a copy of the modified version: * a) under this License, provided that you make a good faith effort to ensure that, in the event an Application does not supply the function or data, the facility still operates, and performs whatever part of its purpose remains meaningful, or * b) under the GNU GPL, with none of the additional permissions of this License applicable to that copy. 3. Object Code Incorporating Material from Library Header Files. The object code form of an Application may incorporate material from a header file that is part of the Library. You may convey such object code under terms of your choice, provided that, if the incorporated material is not limited to numerical parameters, data structure layouts and accessors, or small macros, inline functions and templates (ten or fewer lines in length), you do both of the following: * a) Give prominent notice with each copy of the object code that the Library is used in it and that the Library and its use are covered by this License. * b) Accompany the object code with a copy of the GNU GPL and this license document. 4. Combined Works. You may convey a Combined Work under terms of your choice that, taken together, effectively do not restrict modification of the portions of the Library contained in the Combined Work and reverse engineering for debugging such modifications, if you also do each of the following: * a) Give prominent notice with each copy of the Combined Work that the Library is used in it and that the Library and its use are covered by this License. * b) Accompany the Combined Work with a copy of the GNU GPL and this license document. * c) For a Combined Work that displays copyright notices during execution, include the copyright notice for the Library among these notices, as well as a reference directing the user to the copies of the GNU GPL and this license document. * d) Do one of the following: o 0) Convey the Minimal Corresponding Source under the terms of this License, and the Corresponding Application Code in a form suitable for, and under terms that permit, the user to recombine or relink the Application with a modified version of the Linked Version to produce a modified Combined Work, in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source. o 1) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (a) uses at run time a copy of the Library already present on the user's computer system, and (b) will operate properly with a modified version of the Library that is interface-compatible with the Linked Version. * e) Provide Installation Information, but only if you would otherwise be required to provide such information under section 6 of the GNU GPL, and only to the extent that such information is necessary to install and execute a modified version of the Combined Work produced by recombining or relinking the Application with a modified version of the Linked Version. (If you use option 4d0, the Installation Information must accompany the Minimal Corresponding Source and Corresponding Application Code. If you use option 4d1, you must provide the Installation Information in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source.) 5. Combined Libraries. You may place library facilities that are a work based on the Library side by side in a single library together with other library facilities that are not Applications and are not covered by this License, and convey such a combined library under terms of your choice, if you do both of the following: * a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities, conveyed under the terms of this License. * b) Give prominent notice with the combined library that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. 6. Revised Versions of the GNU Lesser General Public License. The Free Software Foundation may publish revised and/or new versions of the GNU Lesser 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 Library as you received it specifies that a certain numbered version of the GNU Lesser General Public License or any later version applies to it, you have the option of following the terms and conditions either of that published version or of any later version published by the Free Software Foundation. If the Library as you received it does not specify a version number of the GNU Lesser General Public License, you may choose any version of the GNU Lesser General Public License ever published by the Free Software Foundation. If the Library as you received it specifies that a proxy can decide whether future versions of the GNU Lesser General Public License shall apply, that proxy's public statement of acceptance of any version is permanent authorization for you to choose that version for the Library. mayavi-4.5.0/integrationtests/0000755000076500000240000000000012747722127017033 5ustar prabhustaff00000000000000mayavi-4.5.0/integrationtests/mayavi/0000755000076500000240000000000012747722127020321 5ustar prabhustaff00000000000000mayavi-4.5.0/integrationtests/mayavi/common.py0000644000076500000240000006227212747716313022174 0ustar prabhustaff00000000000000"""MayaVi test related utilities. """ # Author: Prabhu Ramachandran # Copyright (c) 2005-2015, Enthought, Inc. # License: BSD Style. from __future__ import print_function # Standard library imports import gc import os import os.path import sys import logging import traceback from optparse import OptionParser # Enthought library imports from traits.etsconfig.api import ETSConfig from traits.api import Any, Bool, Instance from pyface.api import GUI from tvtk.api import tvtk from tvtk.common import configure_input from mayavi.plugins.app import Mayavi, setup_logger # The TVTK window. from tvtk.pyface.tvtk_scene import TVTKWindow # Global variables. VERBOSE = False logger = logging.getLogger() def off_screen_viewer(): """A factory that creates an offscreen viewer.""" win = TVTKWindow(off_screen_rendering=True) # Need to set some non-zero size for the off screen window. If # not we get VTK errors on Linux. win.scene.set_size((300,300)) return win class MayaviTestError(Exception): pass ########################################################################### # `MemoryAssistant` class. ########################################################################### class MemoryAssistant(object): """ Assistant methods to assert memory usage and memory leaks. """ def assertMemoryUsage(self, process, usage, slack=0, msg=None): """ Assert that the memory usage does not exceed the provided limit. Parameters ---------- process : psutil.Process The process to check. usage : float The target memory usage. This is used as a soft-limit. msg : str The message to show on AssertionError. slack : float The percentage (relative to `usage`) that we allow the process memory usage to exceed the soft limit. The default is 0.0 Raises ------ AssertionError : if the current memory usage of the process is higher than :math:`usage * (1 + slack)`. """ current_usage = self._memory_usage(process) hard_limit = usage * (1 + slack) if hard_limit < current_usage: if msg is None: difference = (current_usage - usage) / usage msg = "Memory leak of {:.2%}".format(difference) raise AssertionError(msg) def assertReturnsMemory(self, function, args=None, iterations=100, slack=0.0, msg=None): """ Assert that the function does not retain memory over a number of runs. Parameters ---------- func : callable The function to check. The function should take no arguments. args : tuple The tuple of arguments to pass to the callable. iterations : int The number of times to run the function. Default is 100. msg : str The message to show on AssertionError. slack : float The percentage (relative to the first run) that we allow the process memory usage to exceed the expected. The default is 0.0 Note ---- The function is executed in-process thus any memory leaks will be there to cause problems to other tests that are part of the currently running test suite. """ try: import psutil except ImportError: msg = "Please install psutil to check memory usage" raise ImportError(msg) process = psutil.Process(os.getpid()) def test_function(): if args is None: function() else: function(*args) gc.collect() baseline = self._memory_usage(process) samples_msg = "Samples : {}" mem_usage_msg = "Memory growth (MB): {:5.1f} to {:5.1f}" mem_leak_msg = "Memory leak (%) : {:5.1f}" try: print('Profiling', end=' ') sys.stdout.flush() for index in range(iterations): test_function() print('.', end=' ') sys.stdout.flush() gc.collect() self.assertMemoryUsage(process, baseline, slack=slack) ########################################## # If we have come this far, we are golden! ########################################## final = self._memory_usage(process) leak = (final - baseline) / baseline print() print(samples_msg.format(index + 1)) print(mem_usage_msg.format(baseline, final)) print(mem_leak_msg.format(leak * 100.0, index + 1)) except AssertionError: final = self._memory_usage(process) leak = (final - baseline) / baseline if msg is None: msg = 'Memory Leak!!!\n' msg += samples_msg.format(index + 1) msg += '\n' msg += mem_usage_msg.format(baseline, final) msg += '\n' msg += mem_leak_msg.format(leak * 100.0, index + 1) raise AssertionError(msg) else: raise AssertionError(msg) def _memory_usage(self, process): return float(process.get_memory_info().rss) / (1024 ** 2) ###################################################################### # Image comparison utility functions. ###################################################################### # Much of this code is translated from `vtk.test.Testing`. def _print_image_error(img_err, err_index, img_base): """Prints out image related error information.""" msg = """Failed image test with error: %(img_err)f Baseline image, error index: %(img_base)s, %(err_index)s Test image: %(img_base)s.test.small.jpg Difference image: %(img_base)s.diff.small.jpg Valid image: %(img_base)s.small.jpg"""%locals() logger.error(msg) if VERBOSE: print(msg) def _print_image_success(img_err, err_index): "Prints XML data for Dart when image test succeeded." msg = "Image Error, image_index: %s, %s"%(img_err, err_index) logger.debug(msg) if VERBOSE: print(msg) def _handle_failed_image(idiff, src_img, pngr, img_fname): """Writes all the necessary images when an image comparison failed.""" f_base, f_ext = os.path.splitext(img_fname) # write out the difference file in full. pngw = tvtk.PNGWriter(file_name=f_base + ".diff.png") configure_input(pngw, idiff) pngw.write() # write the difference image scaled and gamma adjusted for the # dashboard. sz = pngr.output.dimensions if sz[1] <= 250.0: mag = 1.0 else: mag = 250.0/sz[1] shrink = tvtk.ImageResample(interpolate=1) configure_input(shrink, idiff.output) shrink.set_axis_magnification_factor(0, mag) shrink.set_axis_magnification_factor(1, mag) gamma = tvtk.ImageShiftScale(shift=0, scale=10) configure_input(gamma, shrink) jpegw = tvtk.JPEGWriter(file_name=f_base + ".diff.small.jpg", quality=85) configure_input(jpegw, gamma) jpegw.write() # write out the image that was generated. pngw.set(file_name=f_base + ".test.png") configure_input(pngw, src_img) pngw.write() # write out a smaller version of the image that was generated. configure_input(shrink, idiff.input) jpegw.set(file_name=f_base + ".test.small.jpg") configure_input(jpegw, shrink) jpegw.write() # write out the valid image that matched. configure_input(shrink, idiff.image) jpegw.set(file_name=f_base + ".small.jpg") configure_input(jpegw, shrink) jpegw.write() def _set_scale(r1, r2): """Given two instances of tvtk.ImageResample, this sets the scale of the two such that their outputs are of the same. The final size is chosen as the minumum of the height and width of each image. """ img1, img2 = r1.input, r2.input if hasattr(img1, 'whole_extent'): ex1 = img1.whole_extent else: ex1 = img1.extent w1, h1 = ex1[1] + 1, ex1[3] + 1 if hasattr(img2, 'whole_extent'): ex2 = img2.whole_extent else: ex2 = img2.extent w2, h2 = ex2[1] + 1, ex2[3] + 1 w = min(w1, w2) h = min(h1, h2) r1.set_axis_magnification_factor(0, float(w)/w1) r1.set_axis_magnification_factor(1, float(h)/h1) r1.update() r2.set_axis_magnification_factor(0, float(w)/w2) r2.set_axis_magnification_factor(1, float(h)/h2) r2.update() def compare_image_with_saved_image(src_img, img_fname, threshold=10, allow_resize=True): """Compares a source image (src_img, which is a tvtk.ImageData) with the saved image file whose name is given in the second argument. If the image file does not exist the image is generated and stored. If not the source image is compared to that of the figure. This function also handles multiple images and finds the best matching image. If `allow_resize` is True then the images are rescaled if they are not of the same size. """ f_base, f_ext = os.path.splitext(os.path.abspath(img_fname)) if not os.path.isfile(img_fname): # generate the image pngw = tvtk.PNGWriter(file_name=img_fname, input=src_img) pngw.write() if VERBOSE: print("Creating baseline image '%s'."%img_fname) return pngr = tvtk.PNGReader(file_name=img_fname) pngr.update() if allow_resize: src_resample = tvtk.ImageResample(interpolate=1, interpolation_mode='cubic') configure_input(src_resample, src_img) img_resample = tvtk.ImageResample(interpolate=1, interpolation_mode='cubic') configure_input(img_resample, pngr) _set_scale(src_resample, img_resample) idiff = tvtk.ImageDifference() configure_input(idiff, src_resample.output) if hasattr(idiff, 'set_image_data'): idiff.set_image_data(img_resample.output) else: idiff.image = img_resample.output else: idiff = tvtk.ImageDifference() configure_input(idiff, src_img) if hasattr(idiff, 'set_image_data'): idiff.set_image_data(pngr.output) else: idiff.image = pngr.output idiff.update() min_err = idiff.thresholded_error img_err = min_err best_img = img_fname err_index = 0 count = 0 if min_err > threshold: count = 1 test_failed = 1 err_index = -1 while 1: # keep trying images till we get the best match. new_fname = f_base + "_%d.png"%count if not os.path.exists(new_fname): # no other image exists. break # since file exists check if it matches. pngr.file_name = new_fname pngr.update() if allow_resize: _set_scale(src_resample, img_resample) idiff.update() alt_err = idiff.thresholded_error if alt_err < threshold: # matched, err_index = count test_failed = 0 min_err = alt_err img_err = alt_err best_img = new_fname break else: if alt_err < min_err: # image is a better match. err_index = count min_err = alt_err img_err = alt_err best_img = new_fname count = count + 1 # closes while loop. if test_failed: _handle_failed_image(idiff, src_img, pngr, best_img) _print_image_error(img_err, err_index, f_base) msg = "Failed image test: %f\n"%idiff.thresholded_error raise AssertionError(msg) # output the image error even if a test passed _print_image_success(img_err, err_index) def compare_image_raw(renwin, img_fname, threshold=10, allow_resize=True): """Compares renwin's (a tvtk.RenderWindow) contents with the image file whose name is given in the second argument. If the image file does not exist the image is generated and stored. If not the image in the render window is compared to that of the figure. This function also handles multiple images and finds the best matching image. If `allow_resize` is True then the images are rescaled if they are not of the same size. """ # If this is not done the window may not be parented correctly. GUI.process_events() w2if = tvtk.WindowToImageFilter(read_front_buffer=False, input=renwin) w2if.update() return compare_image_with_saved_image(w2if.output, img_fname, threshold, allow_resize) def compare_image_offscreen(scene, img_path): """Given a MayaVi scene and a path to a valid image, this compares the image rendered on the scene to that saved as the image. This functionality relies on the off screen rendering capabilities of VTK. Under Linux and Mac OS X this only works with VTK from CVS (i.e. VTK-5.1.x). It definitely works with a CVS checkout later than March 2006. """ abs_img_path = img_path if not os.path.isabs(img_path): abs_img_path = fixpath(img_path) s = scene.scene saved = s.off_screen_rendering s.off_screen_rendering = True s.render_window.size = (300, 300) s.reset_zoom() s.render() try: compare_image_raw(s.render_window, abs_img_path) finally: s.off_screen_rendering = saved s.render() def compare_image(scene, img_path): """Given a MayaVi scene and a path to a valid image, this compares the image rendered on the scene to that saved as the image. This will pop up a new tvtk render window and use that to perform the image comparison. """ abs_img_path = img_path if not os.path.isabs(img_path): abs_img_path = fixpath(img_path) s = scene.scene s.disable_render = True ren = s.renderer s.render_window.remove_renderer(ren) rw = tvtk.RenderWindow(size=(300,300)) rw.add_renderer(ren) ren.reset_camera() rw.render() try: compare_image_raw(rw, abs_img_path) finally: rw.remove_renderer(ren) s.render_window.add_renderer(ren) s.disable_render = False ren.reset_camera() s.render() def is_running_with_nose(): """Returns True if we are being run via nosetests. This tests if `nosetests` is used or if we are invoked via `python -m nose.core`. """ argv0 = sys.argv[0] nose_core = os.path.join('nose', 'core.py') if argv0.endswith('nosetests') or argv0.endswith(nose_core): return True return False ########################################################################### # `TestCase` class. ########################################################################### class TestCase(Mayavi): """ This class is to be subclassed when you write a test. """ # Interact with the user after test is done? Normally tests just # exit after completion, this prevents that. interact = Bool(False) # Always use offscreen rendering to generate images -- even if # `self.compare_image` was called in the test.. offscreen = Bool(False) # Profile for memory usage. profile = Bool(False) # Use the standalone mode. This mode does not use the envisage Mayavi # application. standalone = Bool(True) app_window = Instance('pyface.api.ApplicationWindow') gui = Instance('pyface.gui.GUI') # An exception info if an exception was raised by a test. exception_info = Any ###################################################################### # `Mayavi` interface. ###################################################################### def main(self, argv=None, plugins=None): """Overridden main method that sets the argv to sys.argv[1:] by default. Call this to run the test. """ if argv is None: argv = sys.argv[1:] if not is_running_with_nose(): self.parse_command_line(argv) if self.standalone: self.run_standalone() else: # Call the superclass main method. super(TestCase, self).main(argv, plugins) def setup_logger(self): """Overridden logger setup.""" if self.standalone: path = os.path.join(ETSConfig.application_data, 'mayavi_e3', 'mayavi-test.log') path = os.path.abspath(path) log_path = os.path.dirname(path) if not os.path.exists(log_path): os.makedirs(log_path) else: path = 'mayavi-test.log' setup_logger(logger, path, mode=self.log_mode) def run_standalone(self): from mayavi.core.engine import Engine from mayavi.plugins.script import Script from pyface.api import ApplicationWindow, GUI self.setup_logger() if self.offscreen: engine = Engine(scene_factory=off_screen_viewer) else: engine = Engine() engine.start() self.exception_info = None self.script = Script(engine=engine) self.gui = g = GUI() self.app_window = a = ApplicationWindow() a.open() a.show(False) g.invoke_later(self.run) g.start_event_loop() if self.exception_info is not None: type, value, tb = self.exception_info if sys.version_info[0] > 2: raise type(value).with_traceback(tb) else: raise type(value) def run(self): """This starts everything up and runs the test. Call main to run the test.""" # Calls the users test code. try: if self.profile: memory_assistant = MemoryAssistant() memory_assistant.assertReturnsMemory(self.do_profile, slack = 1.0) else: self.do() except Exception as e: type, value, tb = sys.exc_info() if is_running_with_nose(): self.exception_info = type, value, tb else: # To mimic behavior of unittest. sys.stderr.write('\nfailures=1\n') info = traceback.extract_tb(tb) filename, lineno, function, text = info[-1] # last line only exc_msg = "%s\nIn %s:%d\n%s: %s (in %s)" %\ ('Exception', filename, lineno, type.__name__, str(value), function) sys.stderr.write(exc_msg + '\n') # Log the message. logger.exception(exc_msg) if not self.interact: sys.exit(1) finally: if not self.interact: if self.standalone: # Close all existing viewers. e = self.script.engine for scene in e.scenes: viewer = e.get_viewer(scene) if viewer is not None: if self.offscreen: viewer.scene.close() else: viewer.close() GUI.process_events() # Shut down the app and the event loop. self.app_window.close() self.gui.stop_event_loop() else: self.application.gui.invoke_later(self.application.exit) def parse_command_line(self, argv): """Parse command line options.""" usage = "usage: %prog [options]" parser = OptionParser(usage) parser.add_option("-v", "--verbose", action="store_true", dest="verbose", help="Print verbose output") parser.add_option("-i", "--interact", action="store_true", dest="interact", default=False, help="Allow interaction after test (default: False)") parser.add_option("-p", "--profile", action="store_true", dest="profile", default=False, help="Profile for memory usage and leaks "\ "(default:False). [Long Running] ") parser.add_option("-s", "--nostandalone", action="store_true", dest="standalone", default=False, help="Run test using envisage without standalone "\ "(default: False)") parser.add_option("-o", "--offscreen", action="store_true", dest="offscreen", default=False, help="Always use offscreen rendering when "\ "generating images (default: False)") (options, args) = parser.parse_args(argv) global VERBOSE if options.verbose: VERBOSE = True self.log_mode = logging.DEBUG self.offscreen = options.offscreen self.interact = options.interact self.profile = options.profile self.standalone = not options.standalone ###################################################################### # `TestCase` interface. ###################################################################### def do(self): """Override this to do whatever you want to do as your test code. *Make sure all other MayaVi specific imports are made here!* If you import MayaVi related code earlier you will run into difficulties. """ raise NotImplementedError def do_profile(self): """Override this to profile for memory usage. *Make sure all other MayaVi specific imports are made here!* If you import MayaVi related code earlier you will run into difficulties. """ raise NotImplementedError def new_scene(self): """Creates a new TVTK scene, sets its size to that prescribed and returns the scene. """ script = self.script # Create a new VTK scene. script.new_scene() # Set its background. if self.standalone: GUI.process_events() s = script.engine.current_scene s.scene.background = (0.5, 0.5, 0.5) return s def compare_image_offscreen(self, scene, img_path): """Given a MayaVi scene and a path to a valid image, this compares the image rendered on the scene to that saved as the image. This functionality relies on the off screen rendering capabilities of VTK. Under Linux and Mac OS X this only works with VTK from CVS (i.e. VTK-5.1.x). It definitely works with a CVS checkout later than March 2006. """ return compare_image_offscreen(scene, img_path) def compare_image(self, scene, img_path): """Given a MayaVi scene and a path to a valid image, this compares the image rendered on the scene to that saved as the image. This will pop up a new tvtk render window and use that to perform the image comparison. """ if self.offscreen: return self.compare_image_offscreen(scene, img_path) else: return compare_image(scene, img_path) def failUnlessRaises(self, excClass, callableObj, *args, **kwargs): """Fail unless an exception of class excClass is thrown by callableObj when invoked with arguments args and keyword arguments kwargs. If a different type of exception is thrown, it will not be caught, and the test case will be deemed to have suffered an error, exactly as for an unexpected exception. """ try: callableObj(*args, **kwargs) except excClass: return else: if hasattr(excClass,'__name__'): excName = excClass.__name__ else: excName = str(excClass) raise MayaviTestError(excName) assertRaises = failUnlessRaises def fixpath(filename): """Given a relative file path it sets the path relative to this directory. This allows us to run the tests from other directories as well. """ return os.path.join(os.path.dirname(__file__), filename) def get_example_data(fname): """Given a relative path to data inside the examples directory, obtains the full path to the file. """ p = os.path.join(os.pardir, os.pardir, 'examples', 'mayavi', 'data', fname) return os.path.abspath(fixpath(p)) def test(function): """A decorator to make a simple mayavi2 script function into a test case. Note that this will not work with nosetests. """ class MyTest(TestCase): def do(self): g = sys.modules['__main__'].__dict__ if 'mayavi' not in g: g['mayavi'] = self.script if 'application' not in g: g['application'] = self.application # Call the test. function() def __call__(self): self.main() test = MyTest() return test mayavi-4.5.0/integrationtests/mayavi/images/0000755000076500000240000000000012747722127021566 5ustar prabhustaff00000000000000mayavi-4.5.0/integrationtests/mayavi/images/test_streamline.png0000644000076500000240000004722612747716313025511 0ustar prabhustaff00000000000000PNG  IHDR,," IDATxyսߪ:`Ј/ QTq}I,_4F%8=신(aE [pL=KOᙧ?S AJJ*wRs:$RR9PJ*ǒJIXB)KB(%cIr, T%!ʱ$RR9PJ*ǒJIXB)KB(%cIr, T%!ʱ$RR9PJ*ǒJIXB)KB(%cIr, T%!ʱ$RR9PJ*ǒJIXB)KB(%cIr, T%!ʱ$RR9PJ*ǒJIXB)KB(%cIr, T%!ʱX_TU,9y%- +u"rX,8ߕT=_aAJBةPqx8@k23w%v)D ~ʔ:y-41h_Ym;Z9ÞƔG߅ƍ_b %!,4eCV:cfgshB|*L /QT2{eKs>}L!!lAظctq祺sZo<޺7tJ?/ 2YW'7qt(yʚ0ZJʰ15XPaxk!^FdpL}/oA> cԺ L}=BlY&tOg[ﰞWE]ᴈ//%sBڏVՆW| :&ӗGeXx4BLm xYqf/.wc_|:*ρv10gxmSʷFbg`os#]r7SN[rŻF-ivҭ V#o*GI%: %hGUc75s4f" D _y 0n3tOdBd2)b'p|- K]r |U$6`\F~\[CZl!{4erj6y !}~(4fҘ|zdT͐? <8~~44uv:LGTO/jU2M{!L_Xq݋x n ᨴW\$U$ęs6[gaT2vS9 O^5Vs{*ь'דٔ2b0/!4Ed9's 1+ U﵃LbdOÇᡉ8VN;}Nk!"r>̍_7]C~lf}<74N`L\| S*rgjL{ƌP& i 'äF,JrͦK=NݏzRעxh]kzeGF1/! XL`̸%n -^Ih]jq{xph?ЙQT0Ђԉ}:<)ƙj8S3\3U}[W韟:&yF,,x)+0]ɍt̄@OB)ↆ&<4c9޳m:fЬ+7BS0y7kpQрL 3͍0܄k$?u\!8^ˡ e҄"cl BSƙ^HjbcqtR:#EYMYAfw0B{ !@ U-vɋ =͸s+Ք`8G&c/`wkG|z蟩k_vLbhN Dj2<}fh(fjq8)^[%SQ (n4\ÿ =@(UL{'0(TTH<@Sd+nFG05?5s꙾݊'1(U \>C+ۦ/b@h*EQx3mqx2һ 7(oPěyR;?_s0a<}!ã kkAg 9{gΛ|#]Jqfm{H#:ELj*Od;׬#0)#qR3պF)0*Mж;oΡa+?ůc*q5}{c،JęmZcs;# uסOp++z }}^תQ9YOiܢF!iʟ@y$i` &np$t??E.y/AK~ y7~5tզg2ݩ|zi^`]{++a޳vE9CL96!)ӳVP̿L3)ϏF17I3Nz+Dn}Cai!_ew%݉; , f)zub+ G]QFW*kM.\Cs1a3hX4? kf*'?ʉjϡ6Gm*HY;IC(u?_D;xh`xM\<oH7ߘŻ~ݙ`, r|.y2WstNRCmS' H>ԭ7X1.7 !ֽb/`^ @w4h ʉP{@@:C;Tu~[z@?ύL|ݎ35oNVVi  TRu`q^ssn2-iR tFvx^E569;2xPSfv KMƲ3N*!Ƈo< K9kbE(RTeHc =orL]N<}.Ŭ\Uk%o t)gwkQI.CL%W.w8N[g!gy僷ެg@mU:&xj4OcV9nBa?V0+S^2OWԙ)6NhTn;WNԝgqbf립nOG3-Oos.:u3MF =S8μƢNq[ׁCg}xtJ2GƆu O]o\6] m%<їФ.讓eXK.}_k%{8TX\)6 Z641n F}Uv5pkBfa 5}'sM/_}GiUFOLQUϸយ3gm+:_peJ0487$ "ݎ:/$X\QH>F Y}'ʶ;n: /V5]'Ŝ;ulUGkwnť[ZCEѦni^F*@Co{ZƔ,ѷ *Mo(Ojܶ^QDқ#HEf|g@g}^ojg'{JTSFtr=/Vkq,!Ge/Jp3ZB 9AW!z8DKIh4 8<y9WC4ߢs?:=Zw;x֭{dʫ -3Qq Gg~:}/MOc[Q9Ju<,'3G]<^Oг&-<ڤ-oIi= M W抅M1y)!L+O'fl~ǝ}S>3ҔLEQIm8x.i[s>ҏHwkJ7<愚7[s`<ݞW8g&{\ A >`*5\h2y *"~۬9{`켭7v1OϳtZ0T MCb7؝ Qު黛WR]ج;k*ŏ 9S1b 3Ro!Ҽz۸叛1740>/b.)i ۟U&6S\n,҃m ;ەnISXgnQmd봀%/NZYgXnY3޲1th:}r ,*"ͥ9{ZsqcXFgz: .x^Cca(_!tUgq* F6`acSưKeESbfkrLU^n @Yq5Р{I է_ޮtR<0vxv]4ZZs37v+wWǞ [yac1F,<:1y"0TCюŧōDg؊ BM <o$xPj҃'}UYQUT{LOӌKYMlݙ]8 8\}qɣ6H"P36O'Kk_ Q*cuS_4n yg3ʋUi>MYQcIh` _4PS[Pb*Lt+ԴMsage~NG!_/uq㹵}O!8Z0nyfKМdW1>*]1KAzK`QXȟM7_Ӄ7riBH )ͤA[tqT2c B~k2Vo]tG{s2p|UMZ銙Ɣ+7/{Vyn0[yO L{bRݹ,o}8 X/XbA~R^B(2q=BQV'mKǬ:O?hΜh 8-=t1PNg SF<-s_P4%!DŽIO[s9G}"8YwϿ,[z܏k%yb,/ͩ-.p(BeE,uj:G!=^ nI歗6gVbwPuu:\a6% 7 gO2i4X5>m*"oOjx+.m:weL1%) $M3 EλN6X@E8:Wy_X$&uLs6AǡX>~4] !\[&MқœMoܢ 93~R [+\ǖ߻(8(BX46Ðzs)qlH3=]5;^6"4]6SWX0*LiMM uBT1U/Y7q<Т~0Byo!.eW6sg\+c;\'RE.`Nj_qͩnO-<.`μ'X5gpئ{aN#tTZvwn,wXܰxַ!tjLĂWX @`o(ׅu m7=w݅&LK"6&@Ȅ&0gn/RUbQs`_j`LO ŦWIi7!g3 BK&'ԄcPy<7)ssNfݥM&N|ʽJ}1q~o}{;0~Z6czުIwLw{i=f*_KPmg+{FQ%,Db;17Bs@ωY}/Y_eƨ%[ë],xc:>Kxy)j%83yrpN^sJ,Nd`_4=R 3jx~=$i'TVkCw`BMgI jN= ¯j( ~oq9iXW{bΏ<,)T#Gyr51K,E/fJ`f_!<(0`Hk{BdBpʕ[l1&X ?i\̱o%&zus1PQ=wqsT? wLP[P}Cn#YȄm-N:A% =ToThr⏙Q5g~=:m;ƅw F>Уsp~ 'Yau,4%km46Z lUYPC(*0NL0b+βvWxnk7 IOfHUaNXlOq\BUAHJ= =`zn3=5xXqδWWY;w% Hmj}Wb*Sظa25(aXhAd`\ۼm:?%ή"ep8wlR@_i$0 U(Z*tZnMhX,t54}xUEb~BI<_cX~:w3=z 06г.4vopfFM$1n{Sue e„+,NGGv3f m;qsvCoN_I@ K9{BUkXxb )ozN7?ћ~5KYC !e.?!hΓ5|-sC8/{JO$v =IϵAw\ 1{*K̟N) BX,_/T]Lcjbǽ6Zbd5|$ldvYktdLO짋cnη,9'lje6hF* BD^ Q\;ipOmP (yXQYe4E`̎bR|AM"M3Ok԰ǀTGCۓ99 1ĂN*KK|þgHt3P'qpFs"Kcٯ("B0b)L#N3O9mu,tV8-\Pv2;;:_v?M7!j03wgt]C,<>[' 0;u:Gr&N3{K,1LJȥ^ϴ^VYZp-N;75NZXE}oF<rm17Ifu:Me?L% n;^酜sOZ4oV8}^>XOiu"\=Gɡ TF"Jzc CX==1eZbZ^҂.axf-LzMٳŔ70 9>k+=0:/H2+z}`gzf3=Phqy7 C왭b3'Ob @F<0#Y7<eN !|>3=%"~Rބ9kAG 1c}!U%D={fFY V!l)%쵦:;biz5jӫ$.=eX^e [E-Ŕ5 %^3HZCBABsOqq,h%gӹסؓz ^;Ue+GaO$-`z!^kJBMpv-^4YfLBF_ vdg {ɞ=G W fr=Ch.doR59qpnLLZ\ =ȶDT  7HmzzY84|):14Mv 8t|2bʪ=ČH?o82Jn_M%f?=#-؋lzHɞ{p &{Ca2ujފ_AdjI,o*^n7| ˎ̒=8ÖxD1N 6}~|*+4Ngs}m`OP{孞%?G='ET6ly!ѣ֭[6aӦM.rv{|Gf~myqfǜ ?i)I!,++[~}yybŊ]vuM<&wq۶me1e 1Ӄ^*KnNDLBٻ@pA#%{!|^}A͛7>ٳs×JKKM'4}oN{~n0rVDT92v^ף3B?۷gгg-[ڵkF W_-Y}wq2bH|[ՀpHrY, ,..ޱcǬY<# (wŸf_Ϟfĩ^ Nr~ h+xCڛ=ȄginTju.tsN}Mșl~c,&;SZjzypeI B1t%U8-rpZ934A}jƧ*v-//ߵk Y-~Imq Ɖ/dO=^s&gϧ$<*ӪZQ{ݳgO,}͘ݷ=O[j}yl#NDAF{sHu_ ŵZ¦cn߾{|};n.8=MMM>|8:>#2]L4t $˖PJ";;fUUg̘qW{Ŋ/isMMMpx8qkqŽ\nEIDAT_}UIMoi`Y1غE`ʞ}d~9?aְFH $1hnǏ5p뭷>Cݻw/**ڵkWҰȰ9 v|`ϧxڽ{3Lgݿ_WNzoTl>& ~4a');wT4Cٷoo{~ 0o*i/[SOuγm۶-[ΟU%=yg8,HL8ܹsXh'/655zoGmj۶mZh3(1#͟џ:>{ɬ>F B.]Ը$oرwܦM:ʏ>h׮]m^$(n~aBh`9蠃ꫮ]=.񷒽=Q7rp-ߖ1t ?nݺ9^S4-X-{؛fۯ'/u#)11 BuDsX쉊aH;2!CL{8Z/D;&aFfC̞={BK51-S@ %Ͳrʞ(+DIt|2`i$B$P4:{JKn)_t]F6z!8~4ˢĔvxmƻ}ƻ "ה (:{9t"ڃ=:-{p3hG:>8l?2;㱇v˽WI雗M;&JLnKKϞxU DXPI+){!Zc$MZe"g+Ȟ[FB60{E6{ɲH4F:&^:/>cζd|gϧ,BӺfB 5+fN a󇎙qX`쉊'k& hi7vRGKPyHE:*j[X펉_)ٟաO ڇN턦'T@΢}O [R{ mPSDR}PBB 0 /VTaϧx4!-(jW=S͉̎ZvįU{HB*%1aC:R2<{s9TBQ09d=Jyi}m٬M/ _v=QmtQ54jʈ9L&Oe>\?L V}ݨ?/NS*aAyK' W[)SԊgJ:a*e1-BK=t3 ~=G4jS^dr)i}=G2@i:r /~ %=$!LБ49T:jNP r؞sXOXQ7Mˡe}_jD9vdˋKDI#)4:J[2sETc"dV ;o瓄09ܨ -9OR1-Tg>$YⰏC0Ԟ/C>W\"JB‹4I8AFįi}$!XI BZv@' a6 )1h/JY_W\"JBa!}Q:$!l=t2LIW#"Y)r*.%!lZ}aǯN# tSZA-6lTcl0QcrY2R>agdI[Gqh_DJu̾bp(/#p69M5&,9Jx)i}I:a)P) B應{廤nڡ$֝v(+.& a;Ev$aZd$LC=GV0%/$!lW%POy&Փm,%{# aǫ;/ٳg]Mܧ-D+ an$ܧOnݺUTTF8~ @œᰶoٽ{]4MSEt^ }0r8d}ǚqi}@Ab"$p^~^Iv 92Ș0 MI:$B"2l9aįsJ:aįsJ JIXB)KB(%cIr, T%!ʱ$RR9PJ*ǒJIXB)KB(%cIr, T%!ʱ$RR9PJ*ǒJIXB)KB(%cIr, T%!ʱ$RR9PJ*ǒJIXB)KB(%cIr#5kIENDB`mayavi-4.5.0/integrationtests/mayavi/images/test_streamline_1.png0000644000076500000240000004076512747716313025732 0ustar prabhustaff00000000000000PNG  IHDR,," IDATxyLw *$.q("(]G%FZ͛qyh eQP@E0w\+bP?jtO0CL3OMMUu139so5#"H$+ H$ŎP")0RBH %#%H P")0RBH %#%H P")0RBH %#%H P")0RBH %#%H P")0RBH %#%H P")0RBH %#%H P")0RBH %#%H P")0RBH %#%H P")0RBH %#%H P")0RBH %#%H P")0RBH %#%H P")0RBH %#%H P")0RBH %#%H P")0RBH %#%DcFoXP }B:0RTAn/YZǰkGAP5:K`DT{"['B_&]rC^ʩaNh!#aG/um4CN7rRRFJ'xn7;Asg8`]I[{s1t6H:L^*uK/Z?TtH.5I2UnlCM?Q=3/=;˫R)1̈́igOzsY NJ)a $Sq t0oͣgi- M94 syزsI;,Vmf&n/mi7/OK4}TY gsh\cí7Lf#DŽm 3$ӻRr45,U|5yj6 Z{l^ԁDK2낕 cH?p@A]Xϭj1E{H5[<?RI@s粙czy]"%HCI_3"9/O>[ ^l65h>Ĉ_q&_MK8 is.ﶫ_tŃWc1p<h>y]C"DŽL2I*ZDNѰS%]|}fo%=4-XP%Tir07 fI0ʹ}HO@]`[h%Vss%t3'  ddSN}txU^wBk5B wB_+.k~Ǖ fnpl'|z~grPb4وAS2(a$3t/B~K nɈ2M{T{g` %8*mbmR?BYboʹۋ>7y5 bET~S.waDM >>3f*kIf:ڹh`nbE񜏳b{49d ?;+tSM19/II gIt걄r<Б\S$Wx Ѵ[]Gj*xbs :quOO|_\mptMy][58` EcL7')˶S:~$ @Nz^L-N=-7)@-K|ǠhP_kɖMG执}ױNc,b֐]܄ J ֩/ì0ڭ:*%*.+UuMNRmMń:]40'P6Iubz)e]f:dXs6|q;"^QMw#G`$ *NJ9T#@bM"^0}/N}?7zV95[iyI` U$Q>؍רyMwv6t튆s-*|۪>Q| D"^E3o:=X7`4ȼ.EU7Ou/Vv[#<~5'zc9_SO7"%4І&;8wEbN"ΩT0R4r0$""[ʢAl=..vf %kƽ/@*|XIh^ޙoxu5s=%Y$6z+^9ĴSx3p,;\%Kx活5D̸Hg7g>]ߩkw9dfZiTxү2xEeJxK/Nk?q*p {b)vLK87\IY.bGKh!DkRVs\y ]p}EPbaPxb[XI';C/& kZ`-?89/kTN@Oc1K/ecɽ WfWpVQBBS6rildǴPΩiP5u]50+TMneN-ӏ<9̔\ wOا+&p:] I[9| GP+áZbegx*Vgf͋^ZWEtYѢpΟamڌ㮤n r' a7oxkMB8x5^4r_!/\x;q'Js.ZOjrZ4PQd{i[5aœ3589::<Vk/n %Mo_YY8;ME,<[ǖG<Ǻ:s 'ktgԌ۵E*!2LfC9GNwh\#Py5*& .;50|ݛY=4/Ԡy"k(YjQi8GX`rE2{>˨A(Pc6Ӄ*<)^p++Z 0Y:Z. akU?ܬ:jΈ.TތiM4yp +˼BLn1ɿўvjPdn[[y^T,t]5A|ڧyIW|O]9b?f0/r-Fwim-Tݮh J)F?ģZ'hĸ.BcMm5sċNk?ѽuDx8}C&#vMzU $1/\KJ< ŰKz?Vk{PYݳ65TvZ!uNqEM+K$r:\m{xv] .$ƻ7Ơ2h/л\BB؟VcV6Oߏŀ7 {Rh$Y{XNUJS\duz?Ojv:aڊGc⁋GBUH羈rϱa\0yR.9(Ơ1 -;KoqTd'7>Ϟ}>8d: uVui$h[l4(e۾6?KȺHx]0u{M<:V֔xan]P8|UH5+@agErV*2 j s^1/ }\|S*t| -rJ5Dj آs3V\=T_gz3fRl!Ą7Z\xY91f:'<ӊxJYhPt3Jp~˽:JBr/QٔxTtҊ/_g1R}-Ti{?,$3cd]B휰Gw*M|1-x*GWMW}rf㞆z4ffYg} #]IIU 1IHύc7J=, zD=4 }6+S(;a7"7ziۡ.!ftGd9v")^ i=d ~ 2$\{~}ѫܹs>^xBj]Щ+4>x>|K+"{ߙfp dLoCS5y9/Ye>6V95~~iqҎx13oaTpMCdMR\j+**-5>q1Է95kָoq(:YB ''E K'f#ӠpĝI뾹5v}/ yBл=ߧAժm%FetP~Td j6X$O@;[ ^).,} OAO"Ju;M`0մ#DS zw'X 'OLH250_ߋFиn-N.%"go|@w&n!p y`CBskʧXiOAS a /abPz_t=}TW7#n}<:׆RM{3kLO -w{8V7q: U욍S<~驶x:?pYیAe9l]bUoo]toG`ovr?`VpL1-I`5IxrήecI1g&S8bd]kjHsd +{b}EsMƕӻֳtRlӮyϮ_v;;cg`9q4^Æ9}x}_0v8q߁Ӵ[Z@kY?xlқ'>X-cZc3jfH*BK0ܩa^ye傱yJ̗mx٦DJcw,/JL`>LzLB [3W㧯Y;yǠ5f ;s;g{ů21۬v'([gS?_A+x=T:?n`w[,!wC '&LÝmlih?Rwt6.f>y){h*2ý-`` cfO)m OpOS^x w"S_[٦Te%p=0Oeh*ĜK^ kls^R8b:GIͻH% K}c Ecրkl_ͫng3F8y^X 3ޕk1mi/K:4 \džѨ@+erp[٦sԞ8%%0/rҦK'mRu'7w~n5)nq:9jɟq{%?մ'*?]npk쟓A3̫3K+Zոƴ#a'Al, b ;TS6ǖ[1Oqg& /ty -V]wqh,|Jpa(ΩgZx̜8:;Y{bw=EG IDAT*!0Z Sͫ@4p:ZD) q'q8y9?ϼ6r(b 7ڼh"KeEflӊ7RŠǡ8u{ qF<"4azK+֌ljK)l~`^ Yń_xvFqRDzQaMMZy|${ٽuO3Rüb G{x;oCdž(ͫà)lqky.Va=7fqg@8{0yp]\Ql-9h4 lM`g=Wt/ܩNiT vnGVs-ݛsB&C.9lٸ.QG< N^0/E'.('|엦wIgo}}ԅPkn %~ۺ@}śju=is3u2ݜ2]u í] _z"4θǛ-27wLu)1o5bg O6N Քo/9cX0ҋq`oxLIh9a"' 3|3LǑ0 ^ÂHyZx <Rި#]_^}9^z<{q0 ,q̿0fWě RǂMׅ+B_aLN()h&3 GYLK %>4Z4}#i`v/^>>ҨirMycR=gF@B_C NP8+*cFST3ټ 3^b1 .v"4'bxxwz9`ͱ/̩ǂ>X4uJx1+Pͪ@[4V*4Lݻ_s5u~QߤPYʔQu7=*) =6B#7ٳٿ]4Xt*玉Xz^xY%۬.q[Y%v'}A_tr ls4.X)zx߹fhv& \ )z{ְǙbP@Y5~PYfX<m֖Xf'Ȫ.o9#J-gs{:+=L:fˠ=JزxϹxƚM+@wJs8_|Z .s[޶pZOΘ謎Q)<f-AWX6m9޿Ze6;gxbE'WhnX+i|")3 SI{h٦T27SM!<4Nm&#M1ivc>x@3z= '\{ \^jHOq?J,H>|vRPճv;1Q M)=@j+a0?p'z'*nkf emZP5_e?g"GGzG`@"s=!!'pg$sO'}~y)e4ո9sxu|dxem֔Zפv7$18 sX~Xt!;{ W ^`gGA+4"pҥK.55W}&eIhP~#@uyΙa3!L5$ Qeh,2.78M+%q:[^f zDu˗vHB&Ofi/i4\6kķ9OrOQ- l@ a/Xξ8808i-<ߓ#^~XeӹpʛGɠs!)2'ם&-fŽ>"7Wa (rT](+.Vy#ަsyQ`_!Zr~m @s^-y=@阳m8 m ^(F !L&<{wJ; J0'=yB ,|}JtɦA4nW := +=3{46M`oj3&P_TB Ӥv``[.0l+bجtK-uVi{*|4Ֆ9I65exGЅp@I8y-L,c,3fzA`;m5hpk/sg ?W۫|٦)4Jpͱf$)1{ow] b:1pHP.W46ٛ7 :b`iπKZM*f:dԻҟs&ڌ/L A/O8j{V g[vZA6{OtCژ&g~JAK1lйxeX?j阽t-d(R qZLAk4*I3){G7U:H Rh*ylœRWh 'Fz,8$WHv*~[ NY3&f眨'km6gFwU-{p>{%JϬ:)ZTWp޼6n=Nڔ!9K8)XUq- zEJ-W_%8b~iBA^-+10B<9*% t\ w/60Uŷ7OjTiN!%vșBϼ<ЫBA/Wd+6L{[ܫN/[Z*\VHDJ} Ua2~8Е@3ީ{N zᑞnG:QMqPN#X`-iSi{0H Ѓ瘒>kg!SЫϜr֧ ݑ;؛ߠܣ (d.)a$4-,fXVZy{q-)>;8W11[O}J8N&-0lMD=bsOɠ,ճzz>뜍0}tShRcs wao_6c`{AJCS? tvG!cR9h"V-yA-cv#ݻ7OJZ"0$3G z <6 ]f')" _~יMФdZ VOOupVQ8n UY"^ >MEHx~ȽJZ )aӤR)ӸoveiH97)UY\a`17@LA/O\|,N0e}A!)9aOA xLAoR|o" U8#ݣQ%~=IK!%vL`wvFOМ܊RW8^r[ …)@?;+^w[R RP dEJ R}eCv̛8Ʈp@&T8;(ǦRܝK8[=` ~JBJR)ľEߑ̕sa0{ٝDԟz9"ѝ5^x B{#یm S>v[l |I[*onc/[#z0D -;>Jeq;m^FЭ[5kTTT|J;F^4pLl# OnK 'rp~KR잋58(yA/^|1XΝ;wĈ}/~&W_ظdɒw}>+2 W8"NX'р6/G?題~?ýC;}]w7ocǎuuu➇~#;=#Ž(蔨E&.X}H6Puυ16x)SeEO<__=nIcmuqa^ )QBn;s]KBXXZOгgKϟ>}飏>:b;vsε5442@@z9 'Z=~p PPe~>`k{'tMa;v{l{k(|{ ^ 2'(]ao~衇~K,ٴiӭ޺hѢnlrKgW?!z5b )nRݙ 2'"=̎ݻ}lSO}~ UqNg놪z}zbpZwV悇pVvO${7ߢSۛӔ鰎fÆ 4xrSCw BK-Azw6ýp r [<ڍ{"n^`gXNW_wPՉ45UUzi"QYyH騧bnj^qR+Ũ/pɆ*_xUIeZ~:ݧOUVe~^eQ:깿;ǮwE{S]| lGТP,{ {&!>믿0sN;M·~ 6^kBnE(: E6mڴy[n-| tmv?#<W9[,~Gfxx*Z{.( ?=z}Bߥmܸ@IIIz}~kekS{-_r/2YΣ͋bׯ_di@@~֯_ߧO>nhZ&,%;LvTBv_xFɡ-591ݻ@V#RB ǥ{ ;{wOO"%Uk\,X~Wz/R 'KH':v7_JAM=~9N;Ð}XPJ;a~Dk!{"Ϊi/H kF[=JFºseV};˦cyĮGJfxHurRVs/渇(Dۗ{{F`g[PJ=͙K#[=w[4-_vO$´eMC [XDnOG/_GewY!%̅]V+oưKkL7}d({ (_?mg!%̏T*e`f/{;ҹ/> .hH s"4&^xi}3KE:H s%CJ9WdY#0ЮAC8ErO$0M8ҿ{gL{h , ׾rQH G z(,vl~aТ 줇 gXVu:r#C_"DŽZbJv Rf3KeweWQ\m=3RӤ,_+=a|:# }Yc%bpXϐ!vΖc{tHdzL[=kea|:#Ey!%lBV0 xh 9.7̟dkR–'!z%H [SzU=_ڙ )aɅ~R–sB)aahɥi ]pdb'ig;EJKi2lH w5-L;; R3{ij{ )a0:O"ߘT@)aKoU;4j 5RBٴ˰H1 ?p۷{w'xQ"ֆt!IDAT#aanݺvڽ{we~I8V .|)a/nY܃ԯ#6լY,Yry{[(H:29^}U0/_0P)a"Х#6GC^GF6Gkx5bIBJ()DR`IJ$FJ()DR`IJ$FJ()DR`IJ$FJ()DR`IJ$FJ()DR`IJ$FJ()DR`IJ$FJ()DR`IJ$FJ()DR`IJ$FJ()DR`IJ$FJ()DR`IJ$FJ()DR`IJ$FJ()DR`IJ$FJ(o`NLIENDB`mayavi-4.5.0/integrationtests/mayavi/images/test_streamline_2.png0000644000076500000240000006630712747716313025733 0ustar prabhustaff00000000000000PNG  IHDR,," IDATxy|}DIH,ɇ$xIӸI&nJ&v&6mN_tn8a1v&oI3#ǖluD J$!  ER) 8H^3B$AAp T;] *hUX *hUX *hUX *hUX *hUX *hUX *hUX *hUX *hUX *hUX *hUX *hUX *hUX *hUX *hUX *hUX *hUX *hUX *hUX *hU& QJ\ tũ#4c0 ] XgwJD"  Z`RI4! `F(znƤ7Ȃr-?bv-c):W ^d,SF,Ӟv $M|78u4p Ƨ؁FtIiA?߶bEg.O*T+HYK9z]uYVv \Db(D}~3d%D rdkw[z/YY9yM`=+gIZp'u ??U=;]8a۝Q_!K&D|Rdp ϞYU5&nM]17gMEp(+]7˘Kw"ިח E$]/uv69u5 2Xgy;iK'sH|ֺ:/Fm ^\Leh grGݴuFS&u@3?="OwѕXNz̝zE9Af4%< 5^8`w<˖ |{'XG59Ey)Yhew zf7=+32 $bȊQTlRmwOQŞbsJLHLH$-+T$9KVիf(v'gzDڱy.j   &JDA- Τ} 5^LfXA;̎3%2B=env}QP1"[%iAoݮ,F^HpueN9V Ihoa-])Sկs r뙊I_/=0]%3+eW}E0GWl]:0NJ>CI Q"BAbS濤w=emUkfEwXuV5E̗eϬHle-ۑ}fj'%ns dvOwNԹ*Mtec~?3}/xiw uLmqq!\Ώ1F [傧@ƚ9YP3tѦYkQŶ75fyd b8v|$+Rhw^3=AU$fPd}ȵЋݑ=ѕ#l2 \fMMM(:AkPS&QQ1:<{*clsr ]v[p*#9v7\l y,.2HcrQ\|ώ@"Zݦ Q7,2QƄ(%w^7sIuyvfA'ieGVv'x~ о&wfIvw1]4]Rx9=FI ѦC/RRZWW BpxjjjO{J;?p!rWehEѶoSͽNp΅ *CC5uީ4A4x FPg q|,LeT8G7cW;Z]]?ۢȫO3Q#Gع/WY[i\ ->c>H]4;P/w[4/]/5LAfF=f Ak*f;!DD ?Wӑ^Ѳ^t}B.gg*ta=Gfg[kSE !.ơ^w.Z]{"LS3Ϊd Q`B$-O/A͚_[͚ʰA;e%]Nj#u/k>@̮ gz3 [^erU-/W aCCC]]xAsaw]qyv5 +(,e(2x$ )dvxٹٝE]+p2γ+} BCJlk .wmfq(giN:8S j!lt壸X![SlKh4ݯN[VADsf) 2@USI@o; fBUv̄$"uk:2B;*xbVežEޘ{#r(@$qkut? ^>ʸQ\ȩ6Ȳvϻ҂Pfs@IiL՗{LQJɍ3%wkADb0!+HO8l[Nsa6 ĩ OVY\͍*3NHȥ3#D" /*+ ] Οɡѡ i#R_}1yt8u SuUM`x;X&;N_xiٝ`ٝb~ ]ҎuLxśX!*E*v'ssgm.g%s:lt6+;KCjGˡ{|s&^1O.+i$|ۋUb /iN040<`ןGv:Ǵ-^K,9wYUE@O~2oggdw901n3eH ڻJV#aŶ(qȽ{t9\pĜĎ@ƕׯƐ?ʛ"״mY~4["0|j>Sꃟ>%2GsԬ|ǰ/Mdtiش /=BeF30+gTyzfnG2q],g ^Id >7fdziE("̳%} [6xh%\(ּonf!p86 3j0YZOCVDN?&d9pS^3ٓ$^-Xs$y{i65qvM\_n}筚8uL<& ֭ _DB7RܨTƺ߲ZR__KVǾk_|Mv%xWwBT9l>01cCRPj;޵cI↑t; 8^(?r$?$u[fZ@ܮhw)^~bwIl.T!]G \~_jÑ_h';Y{^'&pXWvZ@ >K`U?C;+MB83*;ão;1O4 x5 V&!n'Z'-^Nhr][/qXOv1C+o (-E[ɤK{WOb^b|On>U U/׶[+؞C%kCm?}7iOzp]&UՈ͡i3y,g9UVd ~H&hBwlퟛxX xj%}VPӛ͓ ^ ʀQ<C'' ooT! X~{;6c $735 9ڎg0}7'x tم#qSׄ\4:'hexsNqv'tF!p8'\q3tǙvY|w q&WZ-3sf^ Q:5AĂъ%c'2*N(JТN8<AP Dj?AP8S9v&'][[Xmf+J: Hc*K,Ef)_̦{l]|gݵ-15Gk@3#! L`i9߬J0M lx PQmUP.Q0&d C2)I = :죝=?w ONv Kiޱ/f+$1^O)*2o]=:u9XWwG5'BKW3c?}귎֞ҲLM/؞g(װfV恛 x %!HGGK T'!ro-~k IDATD,8eNjY3+.,#q͡ q CeLAaw~4QD%ϻ)4tv>;#3ʏ>Z4%4ouA뺳o:W>ޑNE(ŦT%ɫؒj??(7 N(MFª$xP{2MgޜtXUITHɶ-Bͬ. QxiM?h+ Xm H #3@"X(0=1׉L:򀧋> NȨX7'Z4&zNDWw}HLf/:E !_ R7ԛ۵y/~ĮFW\WY9z ||=kg7Ӣ;fӺ*+qHsrIӞ"ˋ,Q ڱg!쪦s23g:/6=xUY! ހ l'dWf^PI O*U%ٌU-U_Zy6~iޜ(!02.E 9e<=*B?ƞݏ=؝6OhmcZ>mL+jֵ[{GglqǙRjCEdG|x,z VFQxkGwx]Ҥuui ,2o#Ě=ņ1U$yNkV9cN4o=UVφE`#ZG?8 5͛cY-0W-bDdw% aR6Ո=8'XWrhWw!p›Hǵ[j>,<1ί?f"NJpvPyNjJׇ-x S!ɘxOsOdM^B콱a׌72R@V )mHXf@`Qu5ם883,mlXz`Ö6-y+إc.ފI% Q?;B/MFtJ0 {^q.t]a4:$%|W?)6zJklj(R-}D[zv~sn,*2#D^; q-u-PIR5 <dzxS$LKxy+yjG )B"+TCʘFH0 5=.I G}6r3K4FЗo4WUSzKiW x }+JW%_NW2R+A]Im$ `[=t<w Hy#7j ~}W j]_y64g)<Y؍YxD̎63K$'hڝdA9H+cBмBj҃ɲQrWYwm$ю6 ]YA`AZړk\|CQEtJn>ӆ;`Ҷm絿ڐ;w jo,MCYf{p/rdlw~߿_փj,,zb+ =Yq ^yBM`y;QYv 55=҃Dq,+k4/oG9pŋR퇿X!eG6nSLО?~xe9N:/iȯjРwSk S|-X`bre~eк;yHtda~hidC {|sΎ@mui0 EL u#}B'aze ag J2iODP6 8+AR6v|[Tu:#UXӏ;}WbVe,Og5[vTVWWC)W mړO?^Wרh6񓺑> !t8)YWr y"L! |6gdBM4oL&eڞ?}zf%I,Ѡ*M@T0BNh[~\D55tuBhuuuZ9gKr2&AEDõ5xB;9Wܛ?O>Ƨrm?O{ؚյE 9_& jJVY6GM5O S&gIE}%gwGv?}"A z(|)V4ړYw3MqYu D|2Xn|TC[e$R=w%̒)@Z\O@dMXWj(Ϟ⋁d>7rǍ׫?j]{7?_:JA#YM`E; 6kzLDU̮4LS_ɛMW_q^[h3FC /kQd.kVVѓi.U"NHPG7N}W+BPó>ӿ8>Ȏ٩oVۉrsQb:)Ҏݱo2Be[[{(x db/pGܨ7"f++j;Hd݇V:(ttG'^}HwxcV}EEuz5=O/l@L,1ͻ[~oڦb~PоzCJ+gM:XK靴pZx<ƴ ڴ+h^#M]841DR;vap0,Ӓ,<㳚8GqEjڃܠ׵6u6@^<ےנ.X4*l6]r|Ck9]_TD{UӼ79Hǚ y A6bC|_ҲOAj%m$?~5^^-zwWنe¿*+]!!xÆ%܆@tɟqjEj uiޒK-rW܎gG=6!>'$xcm%_0s5%{7$wwByQ-J\~̮)ad[ۛښRj١8r)]#ckHD2hЇR%h٣}J5>uv}nv絵3fgCkyRpK`'GZdp<ε ȍAd{[4w'Z<૑եvRg';!d-gO6F+̾LeEV$ȑS<-9?\y[/y/fXyȪVR3ڜQ(^k/Qi>5V ް >K7VԨRi-doam"yZ̀ QƦaQȀ'>L8x7)9d2/FC /x5ւ%GK%b)kGѾJrK ʰLfj?yo`tEC8xv,ιvL֮mRJՏ (&W*rFX;sLAb (g[X`QGp2aic+V<>Z_W=ms_|LJ2̮8'h'Vjs.E;\b.ZiIahjPȦ=f鏊bDv+.8-2O?hP$6]oў8/,Ύ3mӳ-Ύ3E\'ڝnc+S{Z{ZUᵆW@`e1TIpUg3M3͓gn+_z/ؾe9۲|VBzlVqWe;\?d_eު IiyMfw E1?*jO Wb!fes,Y捊Z$;|oE+™ >KFJ%푻6KL1@Tm BЙ &,gez*p.eV9: $`Me'ˆ f*o!^&F-#_̯dsxE2sm7orv'5ph,czmv.KH4צps-3Z3n2I]q8gH Bne/KwNp2@%J6k? "k* 2$Qx^zee˳a3һkMH̾"PiכCe5xn$mlLϮ96Dv_fj%QQs5!zozr-$k窱ּ( g}xjW 1']LV^Ciy6|-LlryZiO2(Cp؝!G[ Q ,/a_m&x%N%S<8񬬏(5N63ӊezhW֬Sv%4=mz2HvyD='xƧ4L3zI o.-2׳]" 3W6Yi6Kh;#^Wl}@͵{S -_֬qlDY9w,j4y ̌q?Y:̾A@MkXo -wpfmsfG`C#O+X;4x4IKo޻C,ӫsDEdzc"xZ|zo(1W3)SA&mQ67B.YSW ~kbP1uń_<>ȖU|DP6Ѻ n3߲u݉u ]7On6KAWὀ ɘM8Z,YiMwg5xJ,/g 71AL/rGP$ ?Snɔ7ezNLo>f(Ik5@Z$-kbalUZ~y֒]Mtd: KGce'i7KY`)#bBֲzbғX}~CW瓛2cЩNL9 @$"*y xHE*k M'~YK[&$ 2=W3=AK:BQ<-`[y0nzE  6BfVz-`[篭 3=a?$z$ _%{I͡JنTDYo#{|˽ңZsJ/rho~t 8v&{1zH(2b)JXs^h$> + vY{¡XfBr)X|qw9L)ӳ٦Ph|eCnz (rGiWGvjqCh+>DŜ;S|.DأLPJO5XMYOV~3uuu7Q* $AWeNОZ IDAT &l>scH@ thS xr<9 Bvʯongs7x% Zґ<#Qo~"9M.6fĜk y 1m_MO vx(fl'Դ0Xsu5@XZ, oYtQh+10Յmf'_2Bhbv&ܭS[rѦd *9& &;0qV'Ip,q7 -6XG O^52ӵ8x+%qezԠUb79Ln hI͞*bt[ es&v[$Ua,oW>i o'a~T CJ/ѳ$L)Ed.d_ BiGX "ʊҢ(HRtlhsjGՎڦ{˛X LG\}y6I#&Yq(QeX*~qWYaY{Eb7hU\qЋ+k~4!JQi )5pghEMoL4jsV8Q!bI |[-۩z9/!ܫD ަSĖ7Qd_EвAa^&̚bqGK,p- +y!( 'MSbFH?m6%i@S֒bl#KxNS \ $Xx9c˘ BU 4F3,\JA0v{&N^Ypsvh9gAע7}69)4F^s]8tfvGKKJ/L c gC({`eKӂ pu_W_!pf8Y,ӛgMb݊1zuNC '4{[zKuBmn62;ˊ)(ʪ3,6!8Sx5 2 Cqy YIPz$Pٙ j1=9^7* &켲?gT ZN' }3;1,lzm0K$~$qp|AM F awvL63vm$@+K$)B̘Mkzt91=k(`:{^{r1$8MS:Mh`S-U ![mƈǶŵ{>ĖWCzhЍjݰMol%},kB&2Ko$T8槹uf^L1Df~.NqvƄp_%U4vFuM ]v]\׬m@2x-r2{zrO`}S,iUYLӳN̦t6hڸ,EIB88Cܣ3>Vĉf+ _t=fXS,6IZI,%x\v#TezB!RUfbޔAh^@#acGQg[07T_Y¨'I4=˿8lTV^W ï47yp./) 5EMM(@xyysp+# msMD[ u/Lv<19l11*QIK(k ^YP*̚'M n ]RR mt.KҎiL7 2*lLg2=cP)r]O/bzpZ9JF (B}`ѱH&zɈ Xic'gOqS šnBCÏi‡i?>/[bmz|?{f>eǎ,M3=~^4+ӳ * Q Y{dvxN}CFnۘ94 yA™YYnwltigLOqV53Lq-,2^ &Yr<95f 8<]=|==QMՔ}na6,zgA@u^aS 5=9Lo5D6m&4A^`[_LC@t,1{*HqI?0 ) p)>!E[dI#Kq":IgAE ^Xit ?np-K8[, lꦻnmKNklڑm=#Kw۲Fr CjHC|>(Ry4C^>yQt -^Pep` Y{B|tbޜ zi#= Rhh-xҪ,X碆tP޽[O$!NF*F0 R{cYR2JxJ$dR#&ɠ2ܸUۀܹ?FO/Ǡg=0Ԡ,bQ*T:5DAzȚBg)I@-Q;H`hEb{ #sŔ@XŖ{SCv$XR09e܃^ Pݒ:%ZVY(@ $P Vx^mDm'%/bd|t$cvT2JӁ_&WB%DCn_wSzFyHx3Zk=ٶ&**˔Sim=(dXݺx^9u=%{ u8ت`{Er%ԇhmԳM2u ~> ze z\UN:բ¬N zy|,$Vw jH8u:j!`k{V!cp-!sgp8XIzz eЛStւa4c[BѵEdb t$=B@-Qے 's9EB^4ʗ$ o#_<8$DyH6>rB&DnzNPxi.KwA =\s]5@jŔpΉL '#NcSƈis6/F{t!3sX!a' g=::8,T%zzBUY`UU$ ]X_J™익z/B$?+V 6BŷR!DT @ wOI|6lYMzj:+=܊̮%*)^CHzw%ͩ'VۼJ"]䅿U 5>ŷmb;.48iT̽[֏ x:ps dY6v 5(StqxMZ[z(O #Ȯ]b7/=qDۅ yuuvNM%~5O8611!BWWױc>9pb-?4M,{֝۝@jYm%j+ Ԭl"s*/ol67{FRB&w2<{OR;NyJO?ݻw/^zΝsh4pĉ˗/bCogv!yf7b6i.@h%sOiX Ksψ =Rw')[ 655=zѣǎ;}tcc?f;vz/ƱwolYG}{ソ\o|<88H)$)Gѝ;wԐ )'_&?M?l_`O#V2JuL'S}MELqOC-Y^TH]U.־XGQ,$IlOF/k O>\xXRj LW.Capb,ezI~N;Ey9Lbسgfffaa!9sFU^x}QuuÇ].r)qODޢtJ=ec{juf/e%!d}'EQXa/ \tm۶mh4:;;{i׻{G=x`aa۟=#)9<伿씾{FLjɸ-~Tr"ې3sCC6tjjv}>qt;܌BK{r0VnɩR"=>0>G-}dScU{>Ŏ{XX2:F=uSB$!>fcLM5M[ZZb_lJ{.rP|ߒC [|3m}𵒞V4P($Yꪱ֒SEpO't˽ԩwEY75P{c jIDAT*v ;?׷s4z4 %^ÂdIzdw B UUS1tH)KL{h^:ڟCI2 M9GBH>6KEYV9Qd}O1='D t@,,o{:XC.~WO;w TyiK" !Ghj;*rl-q`IQX$L57!H<wC,Hd҉/^[{oX+]{b;J{` TH-0 !.p-{T11/<仸$"^oݍQ"4ܕQ4p(y"!2̤ vy'vJZ& zƜG6/M QnwPwE<P[';/vAn$!4r]};00{vp=@AEh++krw0Jh6;T*uj]=-qrBP}=#&d2\(KIhY@{J=8<䳙 DH+uŢSq"HcsFp@zQP]Ils=|^xm-ʞ:(!R49h$ӟǻ ._H0}'ݳe=gSjaA$wt iE-)DU˰sѽt9qCTruψک;کAWcVH-YvP8AߊwkWBrw+DU`=|N;3-i.opNS'вHiaҽ_Zc'mI뺧9 3˕P(>ۧ)>mv㧎.iAÃBO:-!liTQ입眂][ŝrC\¾d5ͅ2, FB%D"@ӭO0Cg{S Ra_qC-,#D+rKd֝ED[}N_f$,ȅ1Hz/5dzpom*)t9^|"X;3%L6g~nW{w$"dCI |Uv=!oZn C .amݡds⛖{L<"|F|P|BH w< ~oյ+\5 .RkY^g?R0w/!iv"cݷ_?PJ70VaE}C=ߎR)J8^)D"h"YÚH;)DMX+ \B3EN|!@iK=+\=BXZ^d--~@scpzE}o p7Yz(Er" mh}%%^ i$BF#dY+5\Bk,4y/wm{b"lm 8ie%+ЧƃLp 3b*찔K{M@vvC6zeYf)R:0"M}{hΏO9/ci顓i'rؐϘv$v[/) bm#Ը~)B◞WEӴB=Cxi }KaJ TXv!̲]iybnhxڹ"eF$bɈsv>vp ma]`a: y*.eLp s4+80~ kw5ܐW\5x!?9>:+8y6zJȗ_i P607E9jLQg4|yٛ 9z %S@oWigWfig&`,6=_*!l.aXi6mS~C>'N>!F)fC~p ĺHasN`DVy04y-;E*v;/)B)P꡹0SŅ>\ "A_bkQ6g9is)@׶d[g|nn6KQLE;ِ-OT+ѷ^$Ut!?He١^N/t)F2Gf" %2Ide)g83{/C6Rq\T ff_(iggF" ea^q~37d㋋!d(ۣ LNOc Rrp@Ac+)<n&E 0ZpXܤ3 p,lk.;6NYC ٰ)p 7 EyGWptd0Bxд l\'}&ﯯÿt.gh Mi'xp q& lhSoJUcNgw.a0iXvX }%, "MnzŅlp.aYw&ɣǛ %[bC93??,+W\rEfB;Y>s)$ `1 o``_)HXpr-d"N%t,E;oVPp Tїf F+鞽\x᱃KD1) >wJqKOQkD2q͆.4| ܩEdfc_OX ,]do)Xĺ#:/{4u;őP}\X%N,U\"`*,}\4pL6AlHK%Iĉ9u͆2KX4"~dp=fC%,&]~9|KXd. lEF/GxK[a g?g#aI(  Wp K>ͥbq8JK.!SdNr8EK.!SdNr8EK.!SdNr8EK.!SdNr8EK.!SdNr8EK.!SdNr8EK.!SdN3ᱞh7IENDB`mayavi-4.5.0/integrationtests/mayavi/images/test_streamline_3.png0000644000076500000240000004664412747716313025736 0ustar prabhustaff00000000000000PNG  IHDR,," IDATxw?gf-*k4FQ#bŊe >&!gfXcRl(A  kAAAD@޻e~)gʭ,{=uܹ3s˛Ϸ3C4MP$e]B!,K@($e ,P% ʲBBYPH( eYB!,K@($e ,P% ʲBBYPH( eYB!,K@($e ,P% ʲBBYPH( eYB!,K@($e ,P% ʲBBYPH( eYB!,K@($e ,P% ʲBBYPH( eYB!,K u=麞P %W( ̂ҧ*Y?Sȳ:1 J(c^s6ذ> <  D36uT[0p!6j8/a1'by#ccŠ(ڌM~(E5\z/XШ~r 5=]ynx!&?PM *Pdbkax/ c h 2 I{Z/&ߗ_ⱇ!0v*@(E/{k}`?0CeBݷ0X ޶M?oLn *zZSPHV^'0jPPTRf/(qV?="'LURx k/ad,823*.ݽ XqinKmY w>];V$ +PS+IZoGxأ=[,B~(% ]eH8\,]tO(reG܌jz{ 0|C6ڌ5T"Jcl-Qk3=\'kCO.u|DꊴT xJtdn  d ڜ$i7C[Ax)D"‚QWyOx6_o #=65'c2 z}?1<ͨonb7C)++իWYYYIIIaaaaauk/~ b0-O{!:_ַy3<'0~z8kƤhtBn\8o(zv龩nboQ,[.+++,...,,TU4M4IjHsĭXOZUUUUUUQQ ,**"7&}1Yj%X1$ {Y]. asss޽cꪪ޽{hp/ߔ~3C6$# Iyk- a9MW ,)2Ƽ[v}q^8so`3k2xw>38DSv 0 lUVVٓRZXX(֭[{6l_axLʘNjbnJ(_~Ohٻ3Zaxg S؊Iwhj8?~x P\v^mIWN/QB({-5Vs. aaa!={իWAAimmmiF"hKknj籸i֫(w䯩{NE,[2Y;%U-x]~ĿZnFF9߯<4o{pFM>38QnQJ)UUUQ;vPJ)? lkk+))F}*4[k31 w]:Q/lEBoǸ)\12 FYkwpĚW^[cb.֎)Cts:o|ϒ UQp0 32m@k(vaPJۣѨ(dYF,Bjjj6lذ}e˖(IKjw'aܓO:~j#ֶ،ɠ䎧(x b2TkwuoX\)h$.rwG^?,W2FPHW?;1zp`sΗ׼Wg-5pN"D"Y[ZZ$ID"$mڴ鬳pb^?4<BFi6 ʨqw!7}\Iaz{ #P$| CZ:6ug> qZyrŮ !=zH%X,?|wG@y1f{ f/ħ2j[-SxT1 WaﴫŌc Jh6Ɩl ^kN?!P]]ݣG={hkkcm6mw,|gl y ?Oi{VgvPIcKg%u;2G=h]t=;h"p#~mnjk4//3JJjwzE2E5oJښ e .:oڒJiKK˶m~;v;'_YoBYum]ܲ^xa<{?Ēu@;K@zSt 9gf8}cU0όK ?\0#j@eP 4*aM0e+WN|"0ڨi'oo7opVhǥ7ݨ}cNk U6"vtd ]0Xx/ը{j~0nͬy F3QNthU1B^j6.N;ik)hT/bV з@z3>Gh }ӛ@l4UwQFB|]'XdIp}޶a-$|37ԙ_ˡm8oX1v69Wd%xxciVY&6 mmwo͠ E@idFI[F/]i_e7LA1 CdC.rydڂ뵟v78,[jq 4q9CXRwijv#[FbX7c@ecuJ:*Z367(WN42Ǎ@>~݀vvF"/oD9w=L6ը/|h|Vsq71._ASg/t+.=M23p:rz3. |ڞXHQDqq,s'2 {&*>-ɽa[SϷՍɏRC+-N ױױڠ@0Әn?Ot.`2G7Y?KJ(=h*EaM];,xog}ffCthtmQrT7 UV?n7MҺ{3 8IchWdsʷ_=~5|+8 Tusn-mmBcޭq||'/CP_]ڼV4COZ<^8G9*TJA;e㵋vۜ\Rӷ@>x(Y*}kt ڶ I*Á"/l.~ /~p93'cvmF#\T ? HrEB7(x3 @ |6TC1Xqm!dJs157`^ Yp=y'l~Q{x7C!ɐ$Te(8yL3ͤGƕc Ss=ꤢb J(ʒfa[[!]Qc%Me*Yď3y8nb&{q')~5nJH_-‘_j*َgQ'˨tr0ӛM>ZVk3 @/ IdR@&h8:/M:[X{J^2}y)mi$ʲ̼ꥒ$~7_Z7d1Jeŗ/%{׸ŕ#?Ǭ9ލnm6xs {oG5ZZ&h !N} 5:^NyiCФi0V/Âmܸ$Iiر4Mhoy9D_ *gN&npOE&!OjP 5^brUx9P)T;Psb=D5=hϫP)܏Y^6a{mqbR9=nn!R[RdrwmK]'3@>e<h^pn[n|4S NQ/RFm~<ɋ5X?T&-uԘ|?wsBpy'I ms "zMF5XՕܱcbs+M!lMe5/ IDATN]7ʝ`,R SB0B0>xc<wbwr4+'t5$ &{F>ܔBjZ^i=B2k.|dGoCXV JѼS{Þ[8H`{6>rUnp+ᡖ2%W~s)aB+EOPO-dj0JHu?9X4+lB\nqSeBz_|evIAjk L@[VvO::QiDR0U% Hc1xJi@V 68Asexk9ac KJ6_z2*o^(/+*_ 3wqdIoМUu\:9kanvqԵ7*+D$熚/^`^HW.#S_E$5;K =ML"N<[Ym'3<9l(rFK#yUYG?E񝛃cPqj)kfJ"`y22Hs&IݽLQPU-LQ(/[`ZT9i,6CH`ǒ_7vK A'R'LAGUH;H^z- ϟI'= 㦮 L(sdr(^Yx8<>yi+a5{GFdIGsC>^(3>O+c&A4OM_S#+| Vq']gaCƌjgn@|+%qR.@*[M\ڏ\>}Gn6<*W=pc<} >mj.w7aVMŤӧO`0+#5c?u3lV+Y y7OZz^.'ԴҼ7ԤAF~f5.` \Ў61Q[ā!J+O&6czԱUBBǃ-oAځcMx,=x!b(#7/`NܴJI ٮM˹S];Vﲫ|Ygn/č6\:Ha6X qMcv !+czSL}&,v|?Tw9O y5୬39摛ơ̛`>v0hyiYYfz'ڭIɤad%,rSt]7yZfW< sM/ͳ $z2)π*d Pjx pL0|>m /Oݩ>꠪YsL/kQl(j~? L3Ɉԙ@y֚axYγdܕ,̓@O_XQ뭩Pn+lr4<\CY͏ٗOd?~Q<> '6C.oTM DTkW!Z~3j>5BW^(|&OL(TXP{Y?@^OPd*h +j 䄚^US84V_Qpj0]m5HI]sGxŊpѕILonbДބWTWpSbg=ttuLn}ZA&fBy+h/n@ܢM(a;s[y=.xTJO`,ΝG^br Səs̹[~X̏_ n֋mF8BP)+̩3$rlpx5bgw;svj3"La*?… {??d YP3_1$@~d/{aUMOj2> ƍ}Gd\#? ڻ3d=Kg=\BrxleA@/=3d pI3C2K~ g fmq< cHws2bnԬxS8mvƋH 1bD$;v,ÞMrZ!r E_|1t9s攕y;v{B}_)ZyrAS{-pTp1l0/x$ ӧZQEOU|'` x(ڌP0kV!QAF4FN1=v^kAAMl UBV:S{QVV֫W‚v_R_Bu2 *ʊč5=a)yzyUw -2=Sb!sx^cSۤ씯L`1r}{+#R `W---ͱXMh4ZPPiQ֣-:t]7]K~ɅPU8b(@G/oH_lBQ楎R|si^Q9wth*>qk fUjX@j/6CLϊ9ͽzWe89GxTݧ:>r+@Ji,cwFHEevK3vO|(a9|6~VCJ^:u\$~_kkn)|OJT۬+NX_AS;~g6]30l} H( aWN@hW,..$IUUf۷oJbEQ%$Ee}?\2O)ƾwXc͐PomɁ733tzR;ÂUu -Q6=Wes8W7nܸ{ؾ}{EEEAA(Xlǎ vBHKK J)=ٚO(UC_.]E~ZZc\>=7<l+8%fzM6l%lӣ`+5CJ=A&b6܁Cdfkkkss,˅;v$iv}]jU4=)n<$z5O.j3@Fm \0s!Ԟ_CN:v1sADZfz>U*WNTRoǹߠdn!uᆲQ?)I4{\s5\ö4 TS*A)yq9A1qN9}J=A3k`f!Q঄ji'  ǞCm|hڭ XELeu*K6 jժ˲ 4q˖-~sg3y 7+[^ B Sy6=xJ,\mH}&`Xbzۀ2=.h3Iೝǘ1 Nw I1}͘t !ԧO={Fѭ[nذ=e ;koOuvb-}y84<yF `fA(^8|ӳL6M=qF߼+&j 0J]d/[LD U믿a릮ٟBQ7[kOo?ͺRǜZk^1$Y-9G4h ϹKћ Ni3`oZpRDM 㾽н!L !$-7FuZKr!QbG책LOI_w=o_U&ځ(hO'ڧPR)Hu2nS<fx֐(^y$hz{e}[(bLX|ӫZ vvG8/fnR)(/:Il^?Fp%xl4QbMeğEtKbzUct*&@{Z7@kI 94jJs('7\h57+uDھ\m!xQ.3|:Rvy5B^|fWYT47&eW_uly!W醗|YYJG̃N0r8$1<}8wd\SeBMBmp(Bݷ7mOmR$vi,dWѱ?A|ج\[Z_Mx򸅖Dǚyc n`O<ZsJGӪ VeYQ1;oBH@Jƙ8d@CޑfzgEx^Xg;IcdYk!NG(DMu}8@u,*ʠRmT6wyWU9Ǎly'1xUIKrHz~fgw1Ѐ~OM5TYm7+x:m.$o% (Q[\:Nj3sxAWY nktXe7'ƀPȹ2T%EKXGTPꠞ4ۯ|^ZxbI=ၻna{XX'M7e!}^Сr@;qwkK~xuc3nhg~\V7 !X^_YC7r Sy gzfzI,VySGMv /{α+t]'7]o׾k\¸^k WLΤ^tHמ ߳f&9VLVo4y4~nꁻODr9,/dzpF؟ {UNx驲P{R/sE=cnO`g>6o=% L"bEA d\[_5s3C]c`oQS֗=I-K@\\Pꫯ:#dY޸q)Sxp!tzYu~p;)֯_?xಲ•+Wٳw7 v.FFm (bNo[9^qݻ% !w.8X$2+暟gO=z(..;^)RXX 8Cb!촏pbK/Dz92эe0{y.aqv)%grɑH(2 !|G9bU8u~!-^3=aNMoM@{!Iңxl7b:m@)D"HDUUJiqqqAAsφ=|vfvt>R6=Y UNhj_5MIJ@W{{{Ϟ=y_!IJJJ؝d[Ғ=2M7C 2oBi%/`˂äzT^^޾tSO=W^ۋcX,kii!Hn2CKwsozM::+C({Ш@%!$ tիWw}ҥKO9N;m[nի!X,&I,YKL 8ixHž#"8LW祥mmmsp1;w^xWˊȲ d]c7RU݂ݦۢtZ`Ю %{G֣=^Z4]ST{{;Im4JiAA!$2)hUGٝgV^ ]8O[2c/}OtK@j}E쿽.s[!FY wܹ~3gjRd@}q=!KC{{>t@1(!|c=#IR,+9(s*X}nqB`pu؋O]  0|ڬ0{Own~ b<<˗<b>kO>$kגe06lahQd6m: o>){[aox! ɔ]<@KKKqq~ ;wX,d[q.ٳ"R;d~7dz,x2sR9h )no/ uQPqV[∳_t`yaeW^uM6UWWWWW~{,Xn䭲8χJvݥBK @|ca^gWy !niر_4U/)^џQΝ_^@*ɮq=\*k!2dϧ|MB%l9[0_ֶOi??L}%af&`g䝠@A|??ظ6n3ܹA4~{  o{Jim{NM}̔#1i2Hw=ܳ_~G0q'xuW~W_}U`СNn o߾h %ǯMrF dwB>ضm!b\~e֭PYY GC]dɒ%K Ķڲe h4a~NP,Ny !8#իwqA]pbȐ!˖-ؿ[~7of[vS#ΚT#qvڃ:έ[8֬Yӻwos[p](p;ɳqsl[nE/qn:S۷o.lw]gCdWsXٝy!aR0𚛛wShAg/B=Opu|ovw=xn;%&wn~C!i/SRΰ*c< 1 [6H9%!|]V.w9wJޯ2&4B ,/N81/{# i) a2BKt#R5<9f̙s졓c8dM2h9e SRHh=i4{0@.Уԛ|_ca$YiZH@HtïÎ"@`P{|_]2vE {>u{H[C% Q~U9Xk@L`07C9Aڕ0=&f/xPbؙr-EUbJw40p]S)0RШa6r2X|Jk!* LC;=^)pصˮ$юQZELNϏîr|ftRFu0C[O]R*בl{g[Nj4јuI@ǡ0;=ؙ؎ct?]mxvxu]u3)9r.vƓp(=Gyk}> ;Laɡˡ٠!Xwr9D[OŽT(J7c|vRiZt!D7>N)C52p(P,`,s=\%|v:.`}r ^ 9?'1b7G]W7 )ɬ/2*.)J@{+7750sag< w2 ;S0;9JÆ6a}9nWq@YfQ0s.`yo}> ;["TaC*vBOHbv2{H?^f"{v23i4P"tgooU5QUBBBv R,P% JBB)PH( XB!K@($b R,P% JBB)PH( XB!K@($b R,P% JBB)PH( XB!K@($b R,P% JBB)PH( XB!K@($b R,P% JBB)P(aiiZ"sDTUM9< /%' S (B@|Ey@>f U? ۛh+&'a()J!+@hSXbfR9Ed9*PLHQ}soկfy&8% ljHT*^er'P)asRcQg4 YAm-ި3 tM +,Qv(:Jy7zzMOL4VP J(P(BQb~"G4RrźgC/IXA9gZ.5Ώ)P%Tak~*uP7s&Y^fš{MܟZhK8a.- ,u!;,?ǩ'tJ@6"* un-Yjs=C֮qtB{obxL}w S(V}1%+~z.#+ BNqBLĄkkm:Va(2b90Wpn!΍@VPcn}{`g/qȊ증]?m6{_Ǔq(2|zuJK7ڏuAcC(f87]c68<#/ZaG(8\i0u:'0ˎP)2W?{޸4n ޅ=l%ኗqI-#[.x;$؅V$. 1# Ǚ8󚨇_7>-ϩ´ͽQ7e%5) h^xn6gx( dQ Wa #J +]Q`bw8tWϳ?Q8?_bsmn7 r6Kcd#G0c2MR˯K%5uqZs:5osYl;!|-D06[0@S IAq^f Yyt-dEns; i3<y[`.OR/ƛ+ktW9}:>A .7h-V'OVl8ܳ ǿU(6cg̘ѫW6mڐރDVL*_ Ō 5j^‚L{ C]3n߬he@2x xEC#ճ7ţkk켘:qӸmC^bsiӧO2d/7냵- !-*ᅨS;&wVxMdr"řh}P1Psg|]Ġnxu݆W_|a<_Rf[Y f eˆKjLO7O.ֶrnz֫Č)1%&i>  \9ѩU~ sWZWAxnP<{h o-LO.(Δ|6:lNn(f5YYcX[YS1czՐNu}O~qU^OZ@ś}Zm-=ka߇J-!ls پ>@4qhڹuCxa&?MHdI[SGH 6 1ϪZ'yZ_I?ӓX:dr T\;pǔ{Q5M/tMӪ* ,7?;"CQ /sLN8{+Ua75oJK(\cg.u7&LXVnt<{sn5,/`@%Pu&aSN&Jzmu /yO;M;Y+S/,󃰒5.sufh0 b\)c*.ٳ)tד@Y^*s.=!6ŌuB͒ކA]@>S:XԝKʓQ dE]VxNC7Ϯ_{K/ǼI|.'$04_m=+}x&x|ZYMM !ܥ ~KlZn.^0h ^oļN7vpsq-kх'ȴ%6.bTT[ ;)VQ )ȵI>ř ~!]LOgeopt嘦ܲoT ABxGdɳضl/4ALbtNcw7axt5lĊURo):\j.BaոuH}x3BO׳JAuw6ٝy}.n6g}8̐c;)'/;M6~b2haXvlv:|OD\xrh~>?^3inMĊXR7xV\ PVǵsv18yJ%PT1.`x|g_}oR|&(]f!\}j!ӴČil@HdPȦ\U9 WK殘[Ç-x9nSd@Q  }]_(!okѷdmCxɄ7@!Yɘ^xd=``PYm.r]f`]-__ܼ.%2l̰$,ώ*s]:%7n*A+1aǽd6 Tu:Bi6pW<)@V[ԍ(釭z4!|+읺PA+rs;k-4L9ןFkBDlZRN-5#-4лy!SvA&m5ow&?!Ŗ1]yQ!Lu#ZSk3,캌T0y\L (V-i=^CoZ%Dk1iGcǔ!i)I]Ć_brDu'gmwew.DLƓ_d~ƞ-c}͠i2}PIbg>~s*P|MX<5%/KH!f(`s Ea1ʀs?iEꘇf%P(tJxCҭ˯pkp.{sO}I$0744lf~_sKd|ه%)Q< A$m(L9\),oSsyk8)M@w;v׊nǻS]ɕ֝v๎bPQW֔0b N$pZo~7=o))x2BL3V %{FޜjM-c!@&E2kU"of`)SWyˬٝA*aw1S6j ylD1h4a{2pޢVb&f^BnEUo!V?*y.]&s3-e<(~t;+ɡ{_ھmE S\ow-V\\Ω$^w< d<ބ@&/ ^mWzX&\M.S̫O}!Zs`҆p3OOk7숹K>e%lKț<_2i Ru~lur>[`2 {VKͥ4Z̔}xS(-mVnUI"BAWז1a\bS&k]L슂upe)!QjZglO/X^(یBu~T*t8D֎/lm^3SkM(twѻvGM(%VJ3(O<#[m:q7 8  p_޳u+|x'I?go6ArWye <_ϚD?< Md y^󺟤}7 VBm&< Ǔ  ug:Ty?(le:iZe ٯP;sŚaiS"ީ=hܹQ3ZQ(iƙ'Rz4°6^+goYU Y:~l$Q ~5f,\˯\8&P'Px5{=}MdSg*;k r\:7% u9O]@tgSK);^}xuC㟖$qhӓVˠ:>\oVBV@֜9(6X`ChY:P?vk_'ihEqN-Ai o r ,!S3F!~Md<?9CxSWW@7 ~s{O6{xT!oOyޥ//Qwx1K<?<6:BCh;{]V:C #u (JY4 63"؛&E!3W!:~PW͌^R.bU4TKuqؐEd$_} IDAT3 $hV9w<\.[6yL1ݏ/'yS:^:ag->_>+f) ;GR0/}:J[PϾ8$A ~:I[_49KP)@xۋCU\xYJrRAUfg4X;[ !Sa./r}M{>{AwTge5 gqosu/oH 4M{I 4ENݜgrVwMmElyVxe^|:Pj7t+8w~% y`A|3SY-DE2T\yq㆒\Z3UKpO'AI8UӴ1|yyuq9"CPT+:"*QWS}k\M')5JDV2fwϛeIYBA6OY>M39ڻBM'+D ͯ(m#[eoy\y(fP1gGft|‚#L~^]KX=_?|{?k)4Zb1TϯtBGqܔh9X+$z7]A*"0̹^6,Q5a]C̶DGoK ;-(yLfo@(?\R$ )%źbv 0!x<9͍ U/3LhƙLfV*)_dzd=֠'Ys{;I!YO-˵((ݷ^9_m<`*=,O 6YYP̟lI <{Xҟd~rX"!2B4\?jv>=hA[@ur@ 1Zl hX=W T&kn<ho@%}Otʶ[W$ 5y3s SJbyFb  <)~RXJs.ʊ7wnYle.Y NBVY<'[M rv *"O)">C#NuT }mfznفF7r׵OHpOr}U8s5(%/*m?l-Ml̢.-ѦdN YiDZdi ު2$SB5WG!ybE~;^4{H.8 Ąyj!/;@W2{,BLBV*ݷ:.$ʯ8ag< <&NJ6ٔѮ (p]+O 6)NjNFg_'grڃR$k()&xN{\o@ ^ƴ ~gb|P,~ōd^\@~c'ͼ\3X쑀v]jE0xXVgFN !Jw-2Zli23L^_ssrJȚ-\񌿟 <ۋDR◺~ހ>;ҝ,m$?{2:9L$?uB8xѦQ,Q< -wjP}~ԈwDk.JGϿ%!;5rz 䵝%'6=:ù{ fMN,8F)uەFB͞#\/} S`Qog#Q'CO_3|rタ.on31B/xՌ6W,mz +yTFDADmJAHɓ'<rq3KVC4dH3i;l[E3:23`k똞b7؃Uf&ye} N5 ӻ^ a_mRkEycz5kwi_X YCdi dj䷳g!TWO |~(BAc Y<uf+tbkDJu|<ѦEDQ+/*eGXv<>htrazxo{jekG3XA\ZMl=~˃KIG9sͼ+ 1U,@P ׯͨ<^;1=XXǫ/}Xm*^ߣ:PmEm)qFWsL?]\ݷYc+oү,bluw7 AohPk}[7r{V3TyF+*xyęvKŒ6 2={e.-E^S+ j )ffEQ1 ~ROϹ5浃٫!c\/W_mnCͼ)/o*t8ȪnO}sjf¢M? ZeV% ~gS,ņ)lM(s#7u\M=͹D QD"(of> !Rl4b4yn;ȔXSEۜĦkMgHv; e 9r x2 +Mt@?gynSx㟞ljyPt vYW>Ţx1ZD( %qmN:rPEBd$l ȵ*xurӧaw8U+{ӰTӴW.m$< icV_iqMwZ)qs2nU+-*e&i6.A]7Yf4/hØޜsLS$fR fK,ٳ'r-=rٟ/nUMn#)Kxy)c1m}7?2m+u7.]Թs KZe!)3nZtԟbqN4>`n{s}$:4" رtۛ|Em]aܝ АH]O8s-͍BQMO`@:U9? 1=N[y8mӋmk5m {x<^ݻ{!>7aa=K] n5km]LѦъ Ź6`@|OV.\TbS,鱢iypZ-Z@Ziq}斱Id0ek׮]vmC [2xks74Զ{DyuJE)*6dݩ0kd^,a\W(nҼ3[zU\_-g87>LL~ުi5sB3Ȥn:+ڴЮJ[xe[+pڋL򃍎_TW7.tsBȞSZ/;,I(!D̻ZRiͳֶ('$3e}qd靁)K mer!~ kC=b߰>3 Ad~3(g|^SlBPؙUY$?P.u(5LCr^ރ,|W{~O_8M N(PEuA6xAɇ(L/8RlGSs8֧V=b^kXS$gӘg IԕVy4Ҿ'DQ ;h䳘T+^]Pau1)\K`]#Geu\<$^{6o<#'J "Roe2"㖢-7gY-uؠZ 6TQ',ZPl6=jjQ+첢M+Zq#oVe yGEպ:%t?BѕoI0TWWe73¿]L op榄6 ƿJ#:#bWX5EN#mr1[z^ ޒ#:Xh;- ^jAi^)JWpJvs9_iKU=B:+ԩG!)ZxJr ̷"Th}L"g𲧀Pv[h9^!dPEh6ݦ!'{e \:వO^)+ DGjƦ5NC^,_YP$E;`qbF]A6Ϭ`frlz{QYluX.mhFܤWA= JH!bK[GOӇHVqeT\>p)nJ F(u'ڔaƸ<fz9cPG3TUjfYzustX,ų -jSq !yY$R384hf :,:UcԻgarbuqL/ժRe5m۶ۼysǎ {=wWWW[mtANNDVmnƛ^!{09e/[}tk6p1cصk?3w槟~zAZajfj 8ѐx8T+4MTmطono~aȏT_ hG?Ȫ4k `\BAL-m,lM/Vδ*b[]]}Q]駟ʲ|䔣-i.>g*i<=)5S_J޳qF=-{D5? BBHmmǏ7{555-Z0{gܹo].];idr͍=2&4mXeWfpwxGyX_hx?|}XnݨQ/?A-Ii$Z&^-@%8j8glٲ8Xig^p83\}#G}E9X=V p]'}ہ<4{ _je;JJ$f꫚6m0p@{}'55x嗍mAQ7|s]]ݼyCe8u`XPcO!]&3]# |ᇋ]`a 6&L_!6l橧pm˶lٲqF$yyyGy{W]}'z6XbEMMͫʯ4G8x )D`=؃?ua{{}Vc,em4!@)$C;wܶmÇ=\K.o߾{رcxF ԘA7|sVpb}+9^-zkٲ1bUuֵkךիWB|F y{>_Vd]!/[Wh~٦ǿ!?V>ZQ5=sVMvr->cvzUV-^CI50-]guXҰ=g' 5ʁ+`c//FiAEBn<̚z蝊=NnHKc&C$gz瘞=;[fz|ࡑmM eeeeeemڴPT\l?AOE~sz%9C{Xk4=4!{eOhE? jjjdY{«(O13|z[tw  ^bWp琙?Qё 9Y IDAT*ڭouuu[wT;w}'VN{4-Wf`?gd*l1t w!1~Q:+ re `ՇݻwG9\㰇d@K=[bC@=P7BR([ڦҥK{ioxAFb$Z< Prw<4e 9>"C=P7PXXu X|oiT/N?|pO ?{ dJ[l>99Xkj6&iݺ5nݺرO4lhiL)3 PӴ e"(.-[8SPP7l5{l3G195P;G:RjF=4gli5e5 &Wk2fӥ z(MWCR[ZӱM/Nxe9S_+FEӰOY}[aưQ6E8ڐJY8PuÀ5ʞl"6BpʇrBOJ{9LOРjivA<akm1&4Z*'5vVvA*QӇ=G̞!?is03I%1>NO]^is]ǝQ993i6А?Iw:h l^W>1sRi"*jԦ9Nllt#&Җ=4#ly5VVN4N?hV_e5M%P<,bQWB$ۣ-!% B)g K;,UNqb\Evh9{؞_iVr( $kQ=@=4x{#I@$8Lg py񊿉d) 4.NYyuj2\Ktk5?{Uh* tʍx~)d/i?[áХCV^h}9!Ϥa$ UP̘6"}ك;9VS4fM8F'Ikh9rh (س/>sΑ ~!]w\-N^qǩ.Bᄉ_<ƥu4Ou+7Sr2$>N8=?[:<&$8n@+4/ {H' p4yEOH ^v쩱=[9{h&瑀01ysHzcΘ" ei!a qL41{H&fqSdO-gM_a&)CcA}\<֗" F'+˭#a l*vXLm8% 8lʋ#كW1,d!ai3{ha'<6 IBH@0jy7) I@`jpӿ 0k0Q ,u^[Ɩ"w?cz C)>>CvI8a+i|/7=[F䇕I8a"jΊ9 ;XN~=8 'lt6sb T KH Kwur@wTX_26!Rt&ƞ#q)ك/n6a*,YXhK7 كd% lR@I|NL&%a}!acrJCY`$ l qkZn J"1t L/uvMx8lk]X_sG3M6bar~xVB'a D!% Lp' 2F”)ØGBF0 0iyQ֗tWy ߋg%a}D S(f\8't5C S0]""lhY]J5i@;={͐0=k4M+oT $<,/$ L㄁AX_0H+-̖0ȡ2H´SXTX_J@eD>M% R,)' $ XB!K@($b R,P% JBB)PH( XB!K@($b R,P% JBB)PH( XB!K@($b R,P% JBB)PH( XB!K@($b?W0cIENDB`mayavi-4.5.0/integrationtests/mayavi/images/test_streamline_5.png0000644000076500000240000006063212747716313025731 0ustar prabhustaff00000000000000PNG  IHDR,," IDATx^w$e{BO HK"A1s% z<~ju (q]@TT*i]%$E%tQou vg黟{޷$iOm3]RK-{ՂY-[jiՂY-[jiՂY-[jiՂY-[jiՂY-[jiՂY-[jiՂY-[jiՂY-[jiՂY-[jiՂY-[jiՂY-[jiՂY-[jiՂY-[jiՂY-[jiՂY-[jiՂY-[jiՂY-[jiՂY-[jiՂY-[jiՂY-[jiՂY.hd2aK3k*2&^ՂI4X a P –`M[6`0n; ^BqԂpKцPTBw0,tA%w5 -6PM4 AwPMR)4B(Cg)f#2ӮVp6O% :ݡFIuDhbR?3L"p6-S-7amu(F#Y:^bJ|bRo'gO.h8[ՂpSx6o:ݡFqҘBJ(b_5fN8Tib؎ui8$g\]LQg;(N'fP"=n8V/;QA0ea;8mLjAi<@QM,$P+rr喕O8:1 z:I6]\\ֿ)B1R ל{EG3X.SWbBRb;ય'}j)G7L,uR"t_܊-AsaENwp-!ByZŏ_yT!J;l$Ձ4.@B.K.ǿKw%g-LݓiA]h RJ4FӯčN<ކ:*.,,ƶ 1tᥲqhuUchQ1M, FjO4li( @muqC%mh8i Xv/eS_}?%nc VA]4J;ϣCk\TњH2s9{VN`a1xJg'q\<8J_[4Ӫ%ت g NQ-1Y(:N7F&ˮT';o>v+]aĥiaZ19Diw*NKaic`ht$(R.-+p=u!dfojA86guf(:v'freWQ̉$riskcAz)t,T4zEux+N`6&Y:9[ 'W Wԕ3:7m!aCB0TRXvA=?s@QNܦ`W|\|_o ^rJe S6pB!8p';?ęDA0XIlG4o(nnu *]}7-m3=^Ah X6i4*]!uWsF7lJd:<"'a`V$vGQ025)3737+8qTUM$]v 6S==PA Ge;ΰn]01NiatAyD˛9?ztN`*,z+tw(N>w_'Ŝ9iA0IlWƖu$%~*T(VV ʹlF(n&nvtwwR)˲ikk[vmdl6^e,u Y*RScR 3-?^Azw2mLM;tQre9y~oS8(415R6TPZ̗Fq;,~aVq©!MCVȖUW*cL P!ӟ|$N۶L&-I$eҌ^my(nQ.+X7w^ nHk@1-P ::ED'g?nUT0 flKHu D6>_{RWOLDFiITjlԠBBBoMM»}oooo*4u]˲,&n'{'P'kQ^7J9JyJy~?=?qVuFve_TJw7Wӭ;ʘe`htyېlX8={(fɏpaI 03%7C3%3s>;fXzj=0f͔MMBM/^ef*m{+cb LF5j󠔣\GM4 th*L4t'juȕu\Y{:S+) ABSBD]ȕLY9t? Ѥ $VV1TpWk̴so (:hߛɡ C~QAo֠h] ˮ Pbsn8?]0"ɴl,Bj,CJ>G>G/o'̹Zb:J:VP| P̒]73=ICm + ; qu/4ǹA^Db԰zef~nB(nrξ>uy<ГO>wO(nJ)~-m҇LkPՓLKRs'<7ȩ_􏙳/}e(YhA |bl?ܻ0QAϯff)LBL[VCmϴz`8P&,Tnks]07&& a[[[{{{gggOO`wwyaLzqVk_O?¯~!m. wie7QYICp4ݺS+XȘpgh*]aS)9} /=WH@0x[VEu'nvjPT&W&W\޺ؒ TA61:e()(x:^v߫90aj5`Y%MmXROi$J;=*,ک1aEWuQ.ȷ'OgT0X՝;];Y"b~͏%#3=ICA:wQug+XI .Bs[̻Xx? (&l [:&cE0/)e)s}+܀F+(ZZKGL&%I4-LJ%H$rSOʹ@+4:pU`$?|n.%tuL1)cyDy|o`n;nl(n‘M4UUtN#'_׫WH5f`$Sq=:P7F]Sw}jQ ],]+E[U(R-$PKxӕsvMy'`v$, <+]J\]$wOT垞@֑͸i#h.:bx+`|U}nl(n‘K$ʲ<22RVr4&IRgg/o~wL&abt Fʂױ׿ y1MTn]"kbBk9#;v@nJ2#,M8+CI8#9N&$BgV0|%m<;_piOqP,:v7àe(((Yl6@4.cFjZR) \n7J{d(B9 wy~ q9g 1=KlTg@L]ȪyͲ#Cw!ly ݔhtLKwba:JQQs.|l~Q!SmmmaB0:: /<eE/vR)K}gδ z+bS1L# <_usRR~'#r:wn{ۃ;Eu'K'H(c"",T8j5Kř֞\AxXQ)l`u1P ߜǯN7 SƑqU+INBugKy{R"\Us[AOMP1*0PXupU1}<Ċ 0]43#Ŋ'E(Uȗ9&v?@`wyL -0L e{q~($S*X⪸Iz U(2Z&Wї57T~ڲ lfL&#L⬸Zx ?NDl/ɥ!8<W0xg"=Xpfreϼ`vR;yZQ7L=9JH8a< =wbX7$mįgjyee>mzuPܲ d*/l*Pw"{c]Ţl=%0 {1h I_VɊp7RfcC7DVA?Ib8LjXi1J4 ~ÒPN?lL9JQpq$&ͭjllkorCn8#IG\^r "&| qxmws78up܃;L;sE7]ל{SG<3WwuuVLt2(4x.| YCVpM Ntӏ-c+FՠB%+RCI0V v~b> Q[z_Hz4 Wx ahc&r$/Ho./:{|rȄ ًbDG6gHyҢC0Ŝ^ߠ"UzQ& ]aѱ{gZ~r}Ồ_ud B04T\9;:a.뿁VpKCE4e%ereEz]}l"Gs1=֠8^A7[/މfZ(:nWac rѩI;c !O^9hZL{a'qy ѤՉҴ{^v01m)73eB ֞Nw <0K9|?ѿ['%17? 4?a+L 8 ]Vd$F2v]3)A }OD;hxŰ쀨;x</w}b}\LSQ{ 3JQֿx nlwl確3e)Lx/UN->,W]`lrdIBLӼӶ ŪhT\9֗A#9&ocދE~lC%9ޚgV%] (%j\Mൃ@mCkGO|"Wl3u 4nWvCH|>'X%K:::,4Mg=sU޷}ϢeSW Ja=.:?3jZ-bkxerevi,\X+"ޡ_ByAmJYJ9e)xkH`$xq7lzm6I_G77vM%EHȓ/yљ?{3LFe뺳zjHxG'21@u1pTMpȫUAMaħՄ-"si^I3| G,\>ӶzNqEiooOR㛁s/+&z?SCBk'ј{TOK ^ f|u䨢)DrIxӭfAwS=ϳqm,#M5<#)G͕es^e \'@oLM}P=ؔ"f #{]^j8{GLxb0#3dYm[כZg& kX*reK9哾 |`r=='>1,6f_B*bu'?#"dk9h.F\z#,\o'LI(e7^J9K9O@bf>fTuM٦`[D"/vCU U5 Uooj3J!ls,/7p,+: u0I6d2F:bS, ֌l$zUY Π-1^BPH5RON0Xj;6팥j:);f/ql:9}X fl4yzS'~D܀K?XBBBRw1=?ݫ-ї^d+?ԋbkƂZ;cj[~A I+SW5 EDohyx<,^<62vT-VIQ! .u#]Gv̫B\Y/%a&mX(JZBT* B r{{7`+ ج;=)ƣ^lS&M2*y#ӻC}qX ~O8G煝0#x=^ZNujw`*<9СM%YWS* >2\PXXW1ۜQ["#/W4/v04::-dTJtXJ_Vj2TUuڵ<3$s1Òz K?Dwz=Bs=^ }j:;cho~󱝰 =3yat0NMB^wGި9rZKRd!N8 /lMEG}k֬y[ߺ{akÏ^HKLh>~2ѧ0A_F1u,Bzb+:xxX6ax) ~GLL&3M-OX6"knmaon;\;Pmh@,n C\%rrfm~Uއ%lWzU.zf^6g&U-İ͍.-}h6 zRd<]fM(v =s ‡~X ]lQij\K=ՔwJ ^j\pxIO'\qVdi9mҮ7٤mcR.vmw.ŵq, ˺+iM+U(S Ga  : 4xKqL;IDPxT2vf**5\);4\ O1Jmf" C) ;)sU9rYOfCu>qh,:6\ Cc#&'H57W͕rn2AL[L9Iw.ݍqUیˋT"DP-.qtZ|0EC9ڊ)ʼJZe^- '2i/vAAg^bԖ!1KQ'} _?zL (QעǬ7Wv2\Ojʎ(6<.]0+^H!?='UWNOG8iՃ'󄂣Ye#dKJrGMJo(+n_]Z!lt5>g˼6E:xU5?{c! "%6TmA6+&GVyh)yhlg64y;c;ho꯬p S޸)+ٱxR:BM#Zl%BHXHU+>dqVɭ/w4vBzuEoZpᛷw.]. YZLZ:g"ic<\yw@q<\%1-:=ԎDeE"l )bS!boӟ"thVm_ls@v=r|9i4jN8} N-b~_C7cx6z0<+:/I no}:]:2G~,oT6$#<|IW"+/(QEPl &i`[6)ƵӠFh J[XeWi zÙOjX*N<-"/x()f$tm%Ij3LF: TG-Jۤ ~vzģl7_+gyOJ/I=_}I^}Hz ai@IUR(_Ml.@ebQ7Ml43N\on(vǗyz;Kwh*MR=ORAӦl3[WN>M|@tx?L{E=d5H rik3`ޘ] V'N̸Gf Q 3c"+r㴽0lBJC3oC9䔐CtgH=BB:Vt6S'6 ʼhSp2v hP;o|D 7`*(U8%2:M3>L-HfõItx8H`~~k/וBHZ"A *Yʣlu_AmJ+7*#0(ָdLXc'"viaʬUg^'24C1w0%}HF46ͯ5W:iJqlP\Z4iõcK+71T8Sx::__"Ymf2̷2c^A sp\<Q5We$|o鋃^nރ"Z\(,`n!WLTy)~00m,'ix k#}KQcB<I/C:jH?ŵv6Lt9_&]<z;;5wxf^5ޘ_8OTH;e/1Z$[<հL\mB(AѧˮV/ ߏۍ݂E(PɲՅ[ x͚g6ƁN^zml)Hb=](.CWBP͕ b76=z),wCJ6|GlþF ޥ(q@KSu?셇KҸ2/2U)̉x:JIҌ{ejuf ઋyHy6ݝȝqpQ|,٬ 6٣;EDsFHerm&mQOĭ޺~xLN֜$}d2w/\qtT:`A: $ Ż6@W'"RشL\[x}( wȕ'ųcq'xUMAH$5JYp5l;fgE wI}C ^ddѬ57E!(hZ#B*#l)U|ZL,#^sYsc{aҪ?aFS]#Tt1r, q6-y%27CMxJo66F_6tT .?=_NW7shWGh2iwLY,--+֌tx ȍ2)@]d#a`3r*Qmsɘ[7lpp?`Pk5p6$Ld/Ʒ u2oCc Қϱtix%wg yȖp_orw2Hw!y }.#W׽%<.>}&S̫ xC>Id&Mfu٢d O{F:v QѬ{ŝKQ"_+Ht,x4?f#+B ׉'xg3x4yO  ɍ]L&.p"4L fwI&x2/ @>"[_9*Y^sp5: RKU:d~fd-B ի_GwITPzv\3Q1`=z~^3PLt]"=I R3x Kv|r,>]zQi?Sg &deTf`Ex.cA>3 q'Hܺ#<AJ(7A7,U JoL6U >ffltuOI:)::Hh=ێVbc澍Ω 3Na^V+JRa gS Z<덙h 1uqk0$srl)MWcaGũLWhԽa/zv `]zi/ .p aqǞtD-&_!z|EX^7qlh =WÝ\ta @Hhnn*:Q@X$0HBP,|>O&:aS*z#yŠoۙn Q: KQEiȤ{giT l779/2e4_rmKIt hlmϟ^#"89U1m3R [/3`f4,t zI%O"v>wY =L̠l6%IRX\~i,KTVDR)JPM)pre2鴋0LH㵋C"E=VjPu,aćAT ;S(;?6)ƭEk_ܼ0Hܹ39^7qlFj!nܦ,7Q0{]$lne1ҍR:Kk7@]$0r\DuT"& j{ZASp1>Qܹv}U~3jӿ~hށ GޅWzFX"F `p6fLcre/R,aNcNQgYGGȧd!@tHeʋٺ'H#Ͳ̃/P g߬[Q'sJBy>|8|>ӹ|rgu?lP/F0D>)uX$ʧNQK_ƀa"~\pfalZۤ+ =iADj 0|2qYAH~aX _Zȼ ~CkA:luflTU:e9X=Ns%W[/+q|1 \`st攄8DNr8lvjj*m߾ꫯpӒRl F C eщSںp2M?Â4:( s(~=f4h+(:riTQ:#-SnELcZzc &{vE,& K@V‹SJ\ʧN%. ~ၻIz>ϦX{~Hr `ӹpG3P9{!YYm-cQ ]x b^*T $Wqbp73+{<͐~QPYB5Q.D3&՞?`);WW FLWM٫e#HX +6TM PyڭE@IC> z(lzR+(_Nm=,rXSb byDMT)"ƠR{Ab{Y y堗ΉkAO Tq!-g^7(Ʀ ݯr%Cv0vE5>uHi+WWAo^U%3]Nve^u KLKo#3HĄ)}29! *"+h 8Aԛu)l_kzvO̐~&/<_[ D!ʾ?< f|:@R(qLil/~DjЋ[zx=) Y:j% OLͲxY|r ^NiѠjqXd9-K/rQ-Ų _!2b9:@JApLf3ǝ={A/W  YڭÊO_gjW-%Y~ʕ'bZG @ЧNN-V 4t)-ՂavVa;7u/z,kYc 'w!(uK)w~jЋ zet^T>s A4w |CLl( '4']N4VcЀ_Jzշ,Y Aol=Y\Q-/d~<9_˲=L_?SXA#C:WgЫeYXpYarPP9dE ,8渄DVA/ D.P\<`y4Ys zyD+I^iil"4YCfޓ,K8 7146ޭGyngߴGl{[19M%ÔM|\p: 躦zGZ#S+AOV/bۭ5<v\ӽkӷ#GZ*w}7E"Ιp8l{#>@rzfeo(* t:((JT;f`k]C ta} &Jb۶ms\,oذks]n;\|>JbXPBAexxq<1fogck|BZQ;Cac^^xbo9LLOOgL&z].E/;vnjţH 2*U8- 3yuU |-\B󊢜s9dY%@7ܛy%fǏw]bRv Ǐ_~JYBwkn }iuѬ{=3b)ءKU%ĦMn+$IRwk^s=P= X,H(BP8v,۷o5үc٘_$Zr*gBpzؾ3w _ybX*ZX[f* 099dHKR&9zԞ={*=U I&g@Is (822 i+uOζ>gMseI-W}IJ811AG-_&D'd}|H޽}KoQwx,ڈG%.ϙڊp"%N0}8oUG '''i!Ihǎ v t[g>r`0X;عWzQqyp/źgږ~UK?Nb*o>sWɝM>f~!|9*#}֦lp/]=% _zTlVQzHBlj{O|N5dOJz4UCJ5I_HH4GrϟwމaodɤA߂bjM~B]<> X Wx鳆/~{,V sM}nޤ/$vn%K?޽;-]ʕ+Kҝwy+8o㩯)oE# ]Yg⡚{,Խ`'f?Чf2p8-[oŭ[^s5tT*Z˖$ orEQy'ݞ زe 0L/0W25z=}*!G7nxeQ/2ә<-1|gxL}_y<Y׭[ evbpǢK* 9L'ࠢ(tEQ%Yc_>T*MNN 0bf *T8sjSY鑐HH[֬YE|v=I;0n޿z<:wtNNNeN-I/ 1ʧLb{:P5G +*=a#7*7eY_ Є{UQ=P d])GGBʕ+/"_­z33ӏ*X"[Aq8Uج=1V#Q| ]jڟa[G GFF袆`m3 `˖-=W]u#epvWKyi:џХ&EBiqk.~m+VPe{~͛7_r%,X( M̪N枾͊)̪8g< x800uL&dzH29lrJ%YoOҥK | +hнr#[ZLO~:&=+`<8|%Ko^7R37T/ xw^`[x۶m3̉'㪻3waǒvNBu=Uz5GChUQBs-g{=cimqJJ^tZ0]? 62v0Jn35*zѽkS2^$4\Bo=(޵P3H|Ieef}=Iv 㕾ZuNe.!tCcW=c7?Д%ela ƿE=c Lk|Y{.~53f{,ɟϊo\ڴFՏ*4< ICU-4V;+ZXWauirHb3L`WjyР~3^ށKhC =lҽ60t Ӄr 홉 3VX ZhGV*HYc9ܫ\uհzhlR"gՊv=*;ԯZ a赑yxua'C!$ }B'E+\KvCM+fPLjǢr @AB P7!({@B`N̮P{%ZPLZn\FI8Xq鎇\z"&=r{RvOԀi~wsp z[.XCq`] LBKk%l6}͜ J=:_5X4p ֺ{=RNC{ɒ͉a=>f`n41wǔ;Qe"6IZa^% ;ߵ Jf{R3MB4`~JP:ꞎg~3|n.ak 6A:d൶Vz#6ɺ:r3ػbCχ>\aki`|:,Lt&Qj"@Qh7[B .La=d7$K2a'CvZz[? z()OI{mJp [,VKu,vVKl0!wOQ0WB .a`!,*IVhIи~s,qsSc{ŰZ7D=̡gKz:a %l Q:힓9}Lp ;Ak=tW?P }&T6br:-c\ȘvU+YvCƥNx$l#Dú F{U N`OJHvX|Ώ)/vG?u'g5L WS.RC{gWG;.q]E:ݩ1BEq ; ݅Džɖ%HaP~,J5{p ;Gvn= Y࡯Ixus vcJxhR=Z{%(ßiΎíu\FvJy\_gh=ݛ \.{d6:ys.a`!;@kׯp m<.aװ=pZ7fB.%2- x.\ޢip<\C4؏վ` x)=eHx4s*`x6\^CkWk&z.aQ=&< 롾Q(ӀPxe%un+?3O<}.aC =IDAT- ###rWY?^%EXG&l Hxp {]x<>11syX;Dںf'|# ٳgU7;ps뮻V0\žFZ68.azݛ6W;0\B8jp8Kt.!eNr8]Kt.!eNr8]Kt.!eNr8]Kt.!eNr8]Kt.!eNr8]Kt.!eNr8]Kt.!eNr8]Kt89Hf$c&IENDB`mayavi-4.5.0/integrationtests/mayavi/images/test_streamline_6.png0000644000076500000240000006011612747716313025727 0ustar prabhustaff00000000000000PNG  IHDR,," IDATx^wu۝^vr~_ I(RHDl|* P  "H(!("%JQD[h!!;|fwzr׃gfu]ZjӜh^Z lV –Za lV –Za lV –Za lV –Za lV –Za lV –Za lV –Za lV –Za lV –Za lV –Za lV –Za lV –Za lV –Za lV –Za lV –Za lV –Za lV –Za lV –Za lifdG4UINvLKv@.adjh;&-ԨS-_ZJ5 gP ׸oSuNK#ԂբiSjsmǀ0T©,R]-gC3fc(:.LP̺T;ZMATDmzcԵ (9>utU[(nZnŚu<<+.{ܧ&[{Z(NQ-&xub<X/Oq?{Xb@9}яPTb+W?SGYh6ue(V+~#'[[(fY4,l0 VLLxU+H0tԩjHfMB]o~r1LǡӬN5P;:.uD Bp0搈Q*<̒pܣ?&)eztL3Feѕ-v\>&^Ub+&\/uZH]'f[uu^ǭyGkC1 L ƶE!i-B({~q_@CN&ҙ́$Ԡ Er"|ۿpGUb 14 ǻQ4:[ǤD,q~;LHyQ3Ma&Nw1RP)lxgwq"'S1 "WזG7ړk֣؂OQgM:RZ~~HRhSgtw1WuϚ_r|zuǑ1'Nf('Wއ9l1u=> (!FNAƦhkʦ0?\ឰe^z,iZh84f?/p|;~:j)B4mv,Q m]ٗ[^o1XI,'-'e6+Q|U@8 Ch}>.֟'3FD7D8Rd2db.f5P|ntRf冓gj,TYďknk˂6L܀L`2NSJh pS|diWfgvR `/<'_ vТ4ecYC ~Py]f*S&Qcdn&_/'9,#*bSޙI ܈]7V=AZ < wclS|g_%tTuuQD6Gï9TB^GSӲϝ0 |YPi#?gD` L޼`)tc! m]Or,{^\uSڢ ]+-c`& s'ZB_G odQC8ŷSWϦ&ۨ&ՁQ<_q݆֞~.p젲Ԋa@7rDjGWMўRJNhOcdZbh ꌺĜ<~]s+__OS,Qc/fB>~.#@o(KtcI E޻=OفN{O*5.u%(D\)8qr/+ҘDUƬᇡ]崓ݏ|xuǗXu'S#YB7sx:f.:=pJ<.Ėk=4wUQ&Yw|ϓ ^D)~$^ڊ!+Dy-kNkOY^M}afDєƬ0 >g&Jʏ'4AtLfd^q#ٕbAlsǯצX,3w2V-ArL.r27[\믃lX6jԘs$׭ŭ qh2"2rwNu<.whvn'KZԠ~?\~yZ'S4Z,CB|?3ο(V((y~~jJ֛Il##c1sW W}m;:砘(#¯?[[1[QoV>9օԕ":.?=vZ5yM*aIѮoKKZGHa1'dns3P̉뗹 M4Qe,n},sWƯ+s 0-j:(6ށ$ˋkr}>ʹSn-(nY`?P* rGLЌX14f0 >koGM˺Ck;3d6 :շ8cHf} ?J#4ߡ'c]h Ykr7>>_~jX$5.pcrR}WOSGqk͎<0dJҧFy{TnÔ Ń4´0 t Z2<_BׯGyAԱ t4;y Qhw|lp3&X?ws}z7'bG.UɗW(To>}{~ 7lg&?sl:merύiHtzcCE/ej i/Qg 0EcQO^xu'_d/ɬDPd,\E >%?_^z7Ţ;+$0wU e̼QbUN"eГudYuN6?Ϭh?42Q%#Ҙijtt4f r>^?喁c 0cNf T EYחg(E&_fc>0w2f-A>Eѝ_˷r-y?}DTc^z&]l!(1?0ww>~4gDC/ՋE :M'!-7*a7f$f/w1|]k,]!cN&QBQ?+-pN^sęT y75Ewa<(UQN\M|턩/zl(6l0tYgV|n_m+Ya׿śHw=荄JPS(PYw 9) 1'SM*Z C;q&J1tS=x܅ 'o󭯹݂'J=s1keOB?fgF!)|( \gkSWd:dVB\~x+S+lz >.j#BWHVQ1]H 񹛸!#{̔z\㺻Ki3x&Az>33۷̢8 ,(A. uLޡ?22T2ܓYy]k("+vOvB!&DcJb&to Ncsn5I_.jJV2Bl=yׅRg}jɎz5S(&&;`+S6 /b ,IdKVz4e2Njb:d^;sJs,ޝ[.cMMxV$V4QQfsWj۟rC<~S\p& K?bFHjݨM] ()X>smd!w}UHqd+ˉl mf@dQN{p(V#ss=.o-")ڠ#s׮C2QX{Z<&*d yO;Kh:ϊ=Ix/s[Ha Yi^>(6KXWlL4_V`h sgLATk\^9].b>q(׭үGju߄ +I*rDY_ z{'9 زA/iQZEˠ+M~f,KYѕ@>`,o6p^+~u_.9r免s^.?-/5[nmaS0cNW 4h#L?r2=KL1%{~pq8~Q֘ƒ1I2at'5ʏǺ H<äB~ӏKgNݰWB'W&_fɅ'OKR +)iiCHk+Ò%H<t%Y(R(qUv!gnX /? @ɑK`$I0wUjF2sy^n~ ?|1uK1,:z{c{9 ~f|qz<äFfÖѓt4U.J N1:9[%B?3[OLmn 2f[i׮!kM^$g2ObPqkńv^:((x ] `鼚(ܕ}n>?ҌzYo eº[!]MusF1HFmbUA]8My+= (ӓtHq#kܝMxc ppv. ((7ytG/M w.3ukƯԘJ "s-AF2{(di{?FUz>T)8gO>}ݏa0YQ]#zB2 ;v?_XO`ئ{Mxkrrt 01[H'=w,'p$Pk>%G;]T+TNwǹO|l0:Qc7,BA]Y(ߩ)[yy߱ %2w ~] > $tlE~6їgF9G9c? (4MV4xq;WC-na˯l6~ ė%]H|IB69~G >?< ǾؒNDZE61R^|fA]dX0)Fk߆衟y?=S&ědjypɽy2cIYu?y",մ]^)Wx>cTf!+ϱuP"]dRS+XoIrka6t#ӇJ$#/X¸{9C/={W.x[OXdI'eҿKZudzl9g`z(k![ u8BYYo7 I-قIaE-t޼Y)ھineh\{PL4-Z{U3}$ K(J e57WyUAV+K5چ0z&F:$HO=&qqa#uaЙ ),=B6M㊯9K|hɆ~f%g|*O{y=+"RJAxRݓo=Ћb9iN±Hvp2Wls׹HT)읜Rw̉,^zՖJs|fBbb勚`FhXPq{d=.B= .v<'Fb0w)*8&gV ܍?)}G/<$.9 \Ѽb#3+GQdV'{`.jbnڈ,9 (#_Zx <7{Ф=Yh݉)o٨s-ކ`aam 1'tPVWz2 WTsN7BՏaϼ[cw$3+BآSɬx 6MXч8|w'F[!e!J5Mجy;ίa^"z#kb;nxc~©hKx}'8D TY #_YR9gLxQA 2}2Nhάcxyr2kt)ʬLtiy(p5v "pJ~f< mNKT^ǃYC'|eu- IDAT8'YrD?4?՘MI-25*rݔE-E[ZTZ>3H'iOl4{㥀{Z~Sn\\]'Oņx~DoCWK<):I"WqKmN a]#|S޼d};o3C[IG~7jT }~tׂ)Yy‘^tӃ8aVJ?ʬ<x :CۢZ)4o 93xz@2/x iol^Ϫ7cx_h<;"v rHsdoLBeB وZ\abn0oXKaiCH3#ޛM,C܀=l'jfl%;z s1Laf>l55R V~I4?q[j ^i`o1I-<xEB^Q$W2+ݶhs,^ 'pX 9]pt. j]8xiޯcXy*;Rѓt1*B&rind@LK֎xJjTcHӼX@yNfvxvOj#+Z,kO:u9-?0Ȯ.;!Q:7eL3+e]w?K"&ًwh[Rq.Cs'WQ(K0n2x,#47|faqT$ݡŋr"r K|&joί(X~E<*A^T0o,-22>~/ di9ZCۈxU :4΂w?0YC"$M.ޞ s1r"Fg貹j)°NT .3@?6Kꠥ3Ɖ)^KX<ۤ3޾=irp.vɵ1>_ VF/8g ^\[(S8Z2 oܢP3bSMY 2 &_?>h!Q cp}IO6M@Mi jxNrZ`+4Q@4H"ZBdiCK- }K[I;8Fg۰L3P2zB$Wo*ʯ|@jKA#Rjw*U0xWij0LĎ`h̊_& ~;]z(8?+}&I0uܲ_g%E-Aˠ)$d@x[7SuKC'i/VfQlviT'M8 6I٤pl. sY:iLŽM1@oc(4WU Qim7;4 >9CecF5("=}a /̝_ܽ? I#2BW|fމk_h@}o7Y%YF.,s-ڝ^L?}zVO<W-ŔU)Ӯub)̯DAwBϰm").X i݌LoyX@+F4dPm^t@>Hۤv6j-mP{۪LDOl6*2&oś\o"3q4lLU(ofȫTP|v \t8!+%}8ozJT+$Qgл;\/IGpO ,cɑų" v9S ;bɤ48x*G'{wDu ӨV7Fs uQ! $ FM -,C>[Ho"=D5(Qz"{Z5 xF#ZӃÎO~543f'L$Klcv0:CUOl*(ziSɯDC0/O#at$ H䮨/"PhCw/z PGt?ئmAEzv{+{+zmY' V] rtˣ&=\{,%m5W- p<}9oۊPAoi",ҋp,lTwXQZzVs~et8 sHG%cZu7"E-쇐fCC‰V%Dpb{GQSm/.ON >~PΧ]|R#(<+QaѮ>o ɑ{GqRR6 H|K,R B7!@{c(sF45_v>*¼ N4!sJ1¶Hzt+<4!~-{sX{}>B!xM=IF͐'vJ~%?O ]-(?@ ',_v ç$P7?`$ix H:^ۗ.absTXRbJ-6a/!L;CE>2M+^|s8 !Ųῷy mK>.^5(&hC9׏^EMk]Mi4 ,3|^1uuf~2m6Ř:= [Z>dʜ cp0/ʯqL"QˍuK¼۴:MY;-]'0>S#L뺽 J#;itK亞z={qa۔[OJ0r #/,dP3x),͠Ky^RU `I:lP$ 88FʟD,O AYм{Q,PQC^Sb2l'ax 'i+:ZB`Mی+J{=̋ulj 5߄tG#bۑZ %%ܱm7`LL;pϼl#3KZ):R(i&zw=@DyJ1h6@ؤ6FC> .cqvWi[AlB/I97@YPBdog~ŽjƩF*ˤ= \n' 0OWL\te +e:usYG`8$]ؖM%Jɕ~/{Jmz)3)lޮh7>/iQtm4T1LGSej\^_^"K\#̤H9á*h}U}7ECo^#8S4c¶Hu¼3KW_)^F~ER$k½Uw,m*:ɕݳW\ހ6),ξ!x= R,wOg BAb_TUkWkkpR?ggY  vɕn.Őd8`tyxEpW web&{F4CiTS ߑ.ԃ}>e[1t'7Sb3T߶:UĦjM-.+pJw#/ lCaK9)W2H+y˒L$->n4Iqo:)q7R8!9;U ^\[7Km筼"A@p܇ģMўEj@R\ 쮨_wWࠥ2H;|P$x9s+FO^"i4kT)f4Q(CnݺMs(mM |?N代8ӲaUTBQZ* PǙIj'hN#RPSt@<Et)}qmn;GhTGހUDfw/XMygι?>/|ͷF3IS,>a*1 XAf[Lt D˜UnɎb ,i?ݵ @6>NW[S0ul+e=W!xM.Z).D  Bxy<7yWeH%ض>'.i$6υ^,<;"L'$ 5~ALE.' Nw,r lfO2J1oӉ6FU(ͫ)[bjV(XG5RI; HEIdLҍW0T")jBm PS~۽N*;?(lJ 5ղ\fM 5+>^|a\4E 7b(iGE;VYXedAt Ǣdx*=m+nP=y+ɦ.Z7aESmUzRC^~/iL IhMi W"/f֭{;v{ԫ_&җs@6K&jԞf'wlצ'3, ^l(p'D ˎSIDAT'QT(Nm o3퐲q~M%L>p=벵}^$iH S,\JIZ7mHϏfW`~1_"Ƌ=U}GTlcQYYvm' W((\uEh_BCDVV C#R&X02h4z i= ^Tg|n {jW$yry+N&%z)Z8X2&^OoыZ McF/;z)WsE2&!a4wW T6ӏ^E5 7iVCczla%xۿ;ijC#db3Fx!mǢ Gs5x۴GWHh#9?p|~k$ 6F{CBb)U˜`tCuLѫFrёm-0E]%-)4Ȳ(sRKT8wxjVAHsIpRo, ~Txwţ=ʇg t8E8BǨޱBm3A%iiM wIA^K$ᓘQѭ=/Nfl^&,R,c1 >xy"˒ HXh%WMem2=mxM;K~8{ xWT'0/65oZ𺓂!2eRr=v]1A%݌JsH-:(QڣEA\F6 y"$m)u c.yd!Rz66-DwT^l:"!t ,44 !Ocq.dSݍ n;V1d:c@ 1o!`dz>2a8G_|Ⱐw[ ?]ohn=0f6[DFwQnT4jw NIq MCI}h^zH/<=+??LCL"@xQ9^Y Juow{Ce D< z7oK5,cXDdRom7c[ez1<BcG12iYAc@ ';M!GӗAV^yNy7P˒ԇ'X5˒rԦ%EFX(?L\+oceÈ 6cEd~ "6=cx|$HzC`U=cӦ y-(3MSl8"z}ry  q!_W]xf"f鄾x',2d=vv]d1∌Uo2P(i 2nrk}('#1h|7G8BI$ahJ(ϣsVD lB-_aMŠ6x#F,` 2Y[<ʣcxO#<2,hݼRkݾVY)$FF<,0WG1S+譢r rqL,Q'Y{B62Amjw=p>}ud2,(}x**GoG" chИYlqaAMk E)@_Ưj j=Dr%GAt ~ J8PA p'%pJO]quzX`qedw=vB;zcҧS T}Ncx$ S(4αMLgk'!1hܬ7!vx{hG{J˨ L9!e-ˢGh~ ?67R,dv:5RS,S7_Dٴ$QѸ?i>|ខ %g+yD-O" =,%mho9A75A!'D(_{p9R,,Rtl'!1Q6m9+RzvPK<O,E]S=򳌧 JZe U0;VP? M,gql0}lXE$ "d!SP@#QýmC 9ICՇEjӈ{9@! $S1ȸn. =7Ҥil}X^4{Sz+$B G1:PJy3(e3۰p+ NSLO 1&شi#MʷS~G)腖`hؔҲ,,eS[s^Fce[X}%ax.17! D0ЗY" {߭xp $d6c>UQ֢x0'hAЯtKډsVjS7Ƹi%`^LW)Z%ТИK>5PJZBt`ouC 0{hFtH[+X[+T@!mLse(ICx.%[AْeQ T" =B~ HV|ݹ!!`{B/ 1(6O[C`۱-m]F(1qu<Ѓ^FAJ`=|_:I"PXS{W:6EEc N.XeK1!H{{OϘ^"6ᡄ@=+4i½ރ,ToȼCvɞe3}u ¿$: =n pw dY= @%r v'O3Nj]<=[GHh z#9H7B)t44G4P'sYQ`kVLY@CK }m/$l-გ [NQh $dpRisY(gP੣5>e#E</ M0>>~{;y9 J^i0 9Xrr !%E9Jt]1e6Dc5`sj˔XAP|>?>>>::O}ݥR)-,,ܶ盬Ç_}[Q=?[ttxtxL*m"jǀJw^YUU{"K5\(-S?~= r Ń+B<-(#) #U^_0 UUn ?^Ҿߨl#B>ZZ.+{O[c ıyxx_ ;w B{#<z;'PUz$};] {՞ HPҞ}Z.w4-:qv&^ O>dR )B=;F"7y[=!x9flPn#B;]tǐPxhg$ܽ{w$) 7|Q( _~OLMEC^ zܳ@tU,H CE"r~RJ)e2an3nÇHRd78S=K-f{ xN&){F#5RWRnN AHP QC%}_w8P->պws2:N5Y30[geE2ڃ!v{M=$Uemxب{`zA8Ezuxz==u>{A.Ng{Az($PgШ~0,C!3RJ:#kM?TCίu!+nZ"dGi=__LX<2 B kS (3pu~ r[1te}Cu SiiuT=xԏ#]qxĎH^]4=F݃~笟 h][ Bp/Rޔ3-1<#?a{C6 !@a={賗g&{BfpPVxwz醐IxhM-:B`xBpN[â }C մ~u_?%,2i_CBV=tt}CH ~MA }w=!=0Y>/[{2Z'CH6a~ u.l !a;q LQԫUR![CE yX[=84#Vc;868m}v^9p^$=3p{qh4S=,_?W :~"5;~qFm)NE?J"5N=<8#2F"pO~½HYx`o&+D$,|<4iϷn9EH+.߽)B_v>+){E }5[np5kdD$ c/t~Ch{ }n׽vZ<7D$퍇mwB#"Xmt"~CtP6ל;X#GD*"vc/t~G*촠","v:T }%Wp !oIo "avTΩPv7MٹxCtslJHD[ {G?Z!硣{o"$Q!!@ }}WCK$tt"-~=E+!*B_#$-=ׁpvrˁ?:½G (½AH(t@  .#$P 2BB .#$P 2BB .#$P 2BB .#$P 2BB .#$P 2BB .#$P 2BB .#$P 2{IENDB`mayavi-4.5.0/integrationtests/mayavi/README.txt0000644000076500000240000000621312747716313022021 0ustar prabhustaff00000000000000======================= Notes on testing Mayavi ======================= This directory contains integration tests for mayavi. The unit tests are in `mayavi/tests` and are distributed with the package. The tvtk unit tests are in `enthought/tvtk/tests`. Running the tests ================= The best way to run the tests in this directory is to do:: $ ./run.py This will run all of the tests in the mayavi directory by running them each in a separate Python interpreter. You may also run each test individually. For example:: $ python test_contour.py To see the supported command line options you may do:: $ python test_contour.py -h # or --help Usage: test_contour.py [options] Options: -h, --help show this help message and exit -v, --verbose Print verbose output -i, --interact Allow interaction after test (default: False) -p, --profile Profile for memory usage and leaks (default: False). [Long Running] -s, --nostandalone Run test using envisage without standalone (default: False) -o, --offscreen Always use offscreen rendering when generating images (default: False) You should be able to run the tests as:: $ nosetests However, nosetests changes the Python environment when it runs the tests and this does not always work cleanly with Mayavi. So if this does run, fine if not use `run.py`. Writing tests ============= Mayavi tests are not typical tests. The easiest way to get started writing a test is to look at the existing ones and copy one of them then modify it suitably for your test. Image based tests ================= Image based tests (like the ones VTK uses) are possible but a pain since there are almost always complications. The image tests may fail due to hardware/driver issues and this becomes a red-herring for new users. **Therefore, in general we do not recommend the use of image based tests**. There is one test that is image based for your reference -- `test_streamline.py`, the images for this test are in the `images` directory. The image based tests use the same approach that VTK uses. A visualization is created and the rendered scene is saved to a PNG image. The test code will check to see if a rendered scene is similar to the image saved. If the pictures are nearly-identical then the test passes. If not one gets a failure with an error message and a bunch of images that indicate the difference between the saved and rendered images. In addition no error or warning messages should be shown if a test passes. VTK and the `mayavi` image based tests support the notion of multiple valid test images. For example between VTK-4.4 and 5.0 there were changes made to the way the camera was reset. Thus, an image produced with 4.4 is different from that with 5.0. In order to be able to test for these VTK tests allow the user to save a number of test images. These are all tested in sequence to check for a valid image. If a default test image is called `test_outline_image.png` then its various alternatives can be called `test_outline_image_%d.png` (for example, `test_outline_image_1.png`). mayavi-4.5.0/integrationtests/mayavi/run.py0000644000076500000240000000472012747716313021502 0ustar prabhustaff00000000000000#!/usr/bin/env python """Script to run all the tests. """ # Author: Prabhu Ramachandran # Copyright (c) 2008-2015, Prabhu Ramachandran # License: BSD Style. import sys import os from os.path import splitext import glob from common import TestCase def get_tests(): """Get all the tests to run. """ files = glob.glob('test_*.py') return files def run_all(tests): """Run the given tests. """ args = ' '.join(sys.argv[1:]) success = [] fail = [] for test in tests: cmd = 'python %s %s'%(test, args) print(cmd) status = os.system(cmd) if status == 0: print("OK") success.append(test) else: print("FAIL: %s"%test) fail.append(test) print('-'*70) print("%d successful tests, %d failures"%(len(success), len(fail))) for test in fail: print(test) print('-'*70) return len(fail) != 0 class RunAllTests(TestCase): """Runs all the tests in one go, instead of running each test separately. This speeds up the testing. """ def get_tests(self): tests = get_tests() tests = [splitext(t)[0] for t in tests] klasses = [] for test in tests: # Find test. m = __import__(test) m.mayavi = self.script m.application = self.application for name in dir(m): klass = getattr(m, name) try: if issubclass(klass, TestCase) and klass is not TestCase: mod_name = '%s.%s'%(test, name) klasses.append((mod_name, klass)) break except TypeError: continue return klasses def do(self): klasses = self.get_tests() for name, klass in klasses: # Close existing scenes. e = self.script.engine for scene in e.scenes: e.close_scene(scene) print('*'*80) print(name) obj = klass() obj.set(script=self.script) obj.test() def main(): argv = ' '.join(sys.argv) if '--one-shot' in argv: argv = argv.replace('--one-shot', '') sys.argv = argv.split() t = RunAllTests() t.main() else: tests = get_tests() status = run_all(tests) sys.exit(status) if __name__ == "__main__": main() mayavi-4.5.0/integrationtests/mayavi/test_array_source.py0000644000076500000240000001545412747716313024441 0ustar prabhustaff00000000000000"""Tests for the ArraySource data source for MayaVi. """ # Author: Prabhu Ramachandran # Copyright (c) 2005, Enthought, Inc. # License: BSD Style. # Standard library imports. from os.path import abspath from io import BytesIO import copy import numpy # Enthought library imports. from traits.api import TraitError # Local imports. from common import TestCase class TestArraySource(TestCase): def check_input_validation(self, obj): """Tests if only the correct forms of input arrays are supported.""" # These should work. obj.scalar_data = numpy.zeros((2,2), 'd') obj.scalar_data = numpy.zeros((2,2,2), 'd') obj.scalar_data = None obj.vector_data = numpy.zeros((2,2,3), 'd') obj.vector_data = numpy.zeros((2,2,2,3), 'd') obj.vector_data = None # These should not. self.assertRaises(TraitError, setattr, obj, 'scalar_data', [1,2,3]) self.assertRaises(TraitError, setattr, obj, 'scalar_data', numpy.zeros((2,2,2,3), 'd')) obj.scalar_data = None self.assertRaises(TraitError, setattr, obj, 'vector_data', [[1,2,3]]) self.assertRaises(TraitError, setattr, obj, 'vector_data', numpy.zeros((2,2,2,1), 'd')) obj.vector_data = None obj.scalar_data = numpy.zeros((2,2), 'd') self.assertRaises(TraitError, setattr, obj, 'vector_data', numpy.zeros((4,4,3), 'd')) obj.vector_data = numpy.zeros((2,2,3), 'd') self.assertRaises(TraitError, setattr, obj, 'scalar_data', numpy.zeros((4,3), 'i')) self.assertRaises(TraitError, setattr, obj, 'scalar_data', numpy.zeros((2,2,2), 'i')) obj.scalar_data = numpy.zeros((2,2), 'f') # Clean up the object so it can be used for further testing. obj.scalar_data = obj.vector_data = None def make_2d_data(self): s = numpy.array([[0, 1],[2, 3]], 'd') v = numpy.array([[[1,1,1], [1,0,0]],[[0,1,0], [0,0,1]]], 'd') tps = numpy.transpose s, v = tps(s), tps(v, (1, 0, 2)) return s, v def make_3d_data(self): s = numpy.array([[[0, 1],[2, 3]], [[4, 5],[6, 7]]], 'd') v = numpy.array([[[[0,0,0], [1,0,0]], [[0,1,0], [1,1,0]]], [[[0,0,1], [1,0,1]], [[0,1,1], [1,1,1]]]], 'd') tps = numpy.transpose s, v = tps(s), tps(v, (2, 1, 0, 3)) return s, v def check(self): script = self.script s = script.engine.current_scene d1, d2 = s.children s1, v1 = d1.children[0].children[1:] expect = list(self.make_2d_data()) tps = numpy.transpose expect[0] = tps(expect[0]) expect[1] = tps(expect[1], (1, 0, 2)) sc1 = s1.actor.mapper.input.point_data.scalars.to_array() assert numpy.allclose(sc1.flatten(), expect[0].flatten()) vec1 = s1.actor.mapper.input.point_data.vectors.to_array() assert numpy.allclose(vec1.flatten(), expect[1].flatten()) s2, v2 = d2.children[0].children[1:] expect = list(self.make_3d_data()) tps = numpy.transpose expect[0] = tps(expect[0]) expect[1] = tps(expect[1], (2, 1, 0, 3)) sc2 = s2.actor.mapper.input.point_data.scalars.to_array() assert numpy.allclose(sc2.flatten(), expect[0].flatten()) vec2 = s2.actor.mapper.input.point_data.vectors.to_array() assert numpy.allclose(vec2.flatten(), expect[1].flatten()) def test(self): self.main() def do(self): ############################################################ # Imports. script = self.script from mayavi.sources.array_source import ArraySource from mayavi.modules.outline import Outline from mayavi.modules.surface import Surface from mayavi.modules.vectors import Vectors ############################################################ # Create a new scene and set up the visualization. s = self.new_scene() d = ArraySource() self.check_input_validation(d) sc, vec = self.make_2d_data() d.origin = (-1, -1, 0) d.scalar_data = sc d.vector_data = vec script.add_source(d) # Create an outline for the data. o = Outline() script.add_module(o) # View the data. s = Surface() script.add_module(s) v = Vectors() script.add_module(v) # Add a 3D data source d = ArraySource() sc, vec = self.make_3d_data() d.scalar_data = sc d.vector_data = vec script.add_source(d) # Create an outline for the data. o = Outline() script.add_module(o) # View a slice. s = Surface() script.add_module(s) v = Vectors() script.add_module(v) # Set the scene to a suitable view. s.scene.z_plus_view() c = s.scene.camera c.azimuth(-30) c.elevation(30) self.check() ############################################################ # Test if saving a visualization and restoring it works. bg = s.scene.background # Save visualization. f = BytesIO() f.name = abspath('test.mv2') # We simulate a file. script.save_visualization(f) f.seek(0) # So we can read this saved data. # Remove existing scene. engine = script.engine engine.close_scene(s) # Load visualization script.load_visualization(f) s = engine.current_scene # Set the scene to a suitable view. s.scene.z_plus_view() c = s.scene.camera c.azimuth(-30) c.elevation(30) s.scene.background = bg self.check() ############################################################ # Test if the MayaVi2 visualization can be deepcopied. # Pop the source object. sources = s.children s.children = [] # Add it back to see if that works without error. s.children.extend(sources) s.scene.reset_zoom() self.check() # Now deepcopy the source and replace the existing one with # the copy. This basically simulates cutting/copying the # object from the UI via the right-click menu on the tree # view, and pasting the copy back. sources1 = copy.deepcopy(sources) s.children[:] = sources s.scene.reset_zoom() self.check() # If we have come this far, we are golden! if __name__ == "__main__": t = TestArraySource() t.test() mayavi-4.5.0/integrationtests/mayavi/test_close_scene.py0000644000076500000240000000133612747716313024217 0ustar prabhustaff00000000000000#!/usr/bin/env mayavi2 # Author: Prabhu Ramachandran # Copyright (c) 2008, Prabhu Ramachandran # License: BSD Style. """This tests that closing a hidden TVTK scene window does not crash or raise PyDeadObjectErrors. """ from common import TestCase class TestCloseScene(TestCase): def test(self): self.main() def do(self): mayavi = self.script engine = mayavi.engine s1 = mayavi.new_scene() s2 = mayavi.new_scene() # This should not crash or throw any errors (PyDeadObjects etc.) engine.close_scene(s1) # Neither should this. engine.close_scene(s2) if __name__ == "__main__": t = TestCloseScene() t.test() mayavi-4.5.0/integrationtests/mayavi/test_contour.py0000644000076500000240000001713612747716313023433 0ustar prabhustaff00000000000000"""Simple test for the contour related modules. """ # Author: Prabhu Ramachandran # Copyright (c) 2005-2008, Enthought, Inc. # License: BSD Style. # Standard library imports. from os.path import abspath from io import BytesIO import copy import numpy # Local imports. from common import TestCase, get_example_data class TestContour(TestCase): def check(self): """Do the actual testing.""" script = self.script e = script.engine scene = e.current_scene src = scene.children[0] mm = src.children[0] cgp1 = mm.children[1] assert cgp1.grid_plane.position == 15 cgp2 = mm.children[2] assert cgp2.contour.filled_contours == True assert cgp2.grid_plane.axis == 'y' assert cgp2.grid_plane.position == 15 iso = mm.children[3] ctr = iso.contour.contours assert iso.compute_normals == True assert ctr == [200.0] rng = iso.actor.mapper.input.point_data.scalars.range assert rng[0] == 200.0 assert rng[1] == 200.0 cp = mm.children[4] ip = cp.implicit_plane assert abs(numpy.sum(ip.normal - (0,0,1))) < 1e-16 assert abs(numpy.sum(ip.origin - (0,0,5))) < 1e-16 assert ip.widget.enabled == False def test(self): self.main() def do(self): ############################################################ # Imports. script = self.script from mayavi.sources.vtk_file_reader import VTKFileReader from mayavi.modules.outline import Outline from mayavi.modules.iso_surface import IsoSurface from mayavi.modules.contour_grid_plane \ import ContourGridPlane from mayavi.modules.scalar_cut_plane import ScalarCutPlane ############################################################ # Create a new scene and set up the visualization. s = self.new_scene() # Read a VTK (old style) data file. r = VTKFileReader() r.initialize(get_example_data('heart.vtk')) script.add_source(r) # Create an outline for the data. o = Outline() script.add_module(o) # Create one ContourGridPlane normal to the 'x' axis. cgp1 = ContourGridPlane() script.add_module(cgp1) # Set the position to the middle of the data. cgp1.grid_plane.position = 15 # Another with filled contours normal to 'y' axis. cgp2 = ContourGridPlane() cgp2.contour.filled_contours = True # Set the axis and position to the middle of the data. cgp2.grid_plane.axis = 'y' cgp2.grid_plane.position = 15 script.add_module(cgp2) # An isosurface module. iso = IsoSurface(compute_normals=True) script.add_module(iso) iso.contour.contours = [200.0] # An interactive scalar cut plane. cp = ScalarCutPlane() script.add_module(cp) ip = cp.implicit_plane ip.normal = 0,0,1 ip.origin = 0,0,5 ip.widget.enabled = False # Set the scene to an isometric view. s.scene.isometric_view() # Now test. self.check() ############################################################ # Test if the modules respond correctly when the components # are changed. ctr = cgp2.contour cgp2.contour = ctr.__class__() cgp2.contour = ctr cgp2.actor = cgp2.actor.__class__() iso.contour = iso.contour.__class__() iso.contour.contours = [200.0] iso.actor = iso.actor.__class__() iso.normals = iso.normals.__class__() ip = cp.implicit_plane cp.implicit_plane = cp.implicit_plane.__class__() cp.implicit_plane = ip ip.widget.enabled = False cp.contour = cp.contour.__class__() cp.cutter = cp.cutter.__class__() cp.actor = cp.actor.__class__() s.render() # Now check. self.check() ############################################################ # Test if saving a visualization and restoring it works. # Save visualization. f = BytesIO() f.name = abspath('test.mv2') # We simulate a file. script.save_visualization(f) f.seek(0) # So we can read this saved data. # Remove existing scene. engine = script.engine engine.close_scene(s) # Load visualization script.load_visualization(f) s = engine.current_scene self.check() ############################################################ # Test if the MayaVi2 visualization can be deep-copied. # Pop the source object. source = s.children.pop() # Add it back to see if that works without error. s.children.append(source) # Now set the enabled status of the widget, this is impossible # to get correctly. cp = source.children[0].children[-1] cp.implicit_plane.widget.enabled = False self.check() # Now deepcopy the source and replace the existing one with # the copy. This basically simulates cutting/copying the # object from the UI via the right-click menu on the tree # view, and pasting the copy back. source1 = copy.deepcopy(source) s.children[0] = source1 cp = source1.children[0].children[-1] cp.implicit_plane.widget.enabled = False self.check() # If we have come this far, we are golden! def do_profile(self): ############################################################ # Imports. ############################################################ script = self.script from mayavi.sources.vtk_file_reader import VTKFileReader from mayavi.modules.outline import Outline from mayavi.modules.iso_surface import IsoSurface from mayavi.modules.contour_grid_plane \ import ContourGridPlane from mayavi.modules.scalar_cut_plane import ScalarCutPlane ############################################################ # Create a new scene and set up the visualization. ############################################################ s = self.new_scene() # Read a VTK (old style) data file. r = VTKFileReader() r.initialize(get_example_data('heart.vtk')) script.add_source(r) # Create an outline for the data. o = Outline() script.add_module(o) # Create one ContourGridPlane normal to the 'x' axis. cgp1 = ContourGridPlane() script.add_module(cgp1) # Set the position to the middle of the data. cgp1.grid_plane.position = 15 # Another with filled contours normal to 'y' axis. cgp2 = ContourGridPlane() cgp2.contour.filled_contours = True # Set the axis and position to the middle of the data. cgp2.grid_plane.axis = 'y' cgp2.grid_plane.position = 15 script.add_module(cgp2) # An isosurface module. iso = IsoSurface(compute_normals=True) script.add_module(iso) iso.contour.contours = [200.0] # An interactive scalar cut plane. cp = ScalarCutPlane() script.add_module(cp) ip = cp.implicit_plane ip.normal = 0,0,1 ip.origin = 0,0,5 ip.widget.enabled = False # Set the scene to an isometric view. s.scene.isometric_view() s.render() # Remove existing scene. engine = script.engine engine.close_scene(s) if __name__ == "__main__": t = TestContour() t.test() mayavi-4.5.0/integrationtests/mayavi/test_generic_module.py0000644000076500000240000001303712747716313024717 0ustar prabhustaff00000000000000"""Simple test for the GenericModule. """ # Author: Prabhu Ramachandran # Copyright (c) 2008, Prabhu Ramachandran # License: BSD Style. # Standard library imports. from os.path import abspath from io import BytesIO import copy # Local imports. from mayavi.core.common import get_output from common import TestCase, get_example_data class TestGenericModule(TestCase): def test(self): self.main() def do(self): ############################################################ # Imports. script = self.script from mayavi.filters.optional import Optional from mayavi.filters.warp_scalar import WarpScalar from mayavi.filters.cut_plane import CutPlane from mayavi.components.poly_data_normals import PolyDataNormals from mayavi.components.contour import Contour from mayavi.components.actor import Actor from mayavi.modules.generic_module import GenericModule from mayavi.sources.vtk_xml_file_reader import VTKXMLFileReader ############################################################ # Create a new scene and set up the visualization. s = self.new_scene() # Read a VTK (old style) data file. r = VTKXMLFileReader() r.initialize(get_example_data('fire_ug.vtu')) script.add_source(r) # We now create the complete equivalent of a ScalarCutPlane in # the next block! cp = CutPlane() w = WarpScalar() warper = Optional(filter=w, label_text='Enable warping', enabled=False) c = Contour() ctr = Optional(filter=c, label_text='Enable contours', enabled=False) p = PolyDataNormals(name='Normals') normals = Optional(filter=p, label_text='Compute normals', enabled=False) a = Actor() components = [cp, warper, ctr, normals, a] m = GenericModule(name='ScalarCutPlane', components=components, contour=c, actor=a) script.add_module(m) s.scene.isometric_view() ######################################## # do the testing. def check(mod): """Check if test status is OK for the given module.""" cut, warper, ctr, normals, a = mod.components c = ctr.filter # The intermediate ones are disabled. assert normals.outputs[0] is cut.outputs[0] # Enable the contours. ctr.enabled = True assert ctr.outputs[0] is c.outputs[0] assert ctr.outputs[0] is normals.outputs[0] n_output = get_output(normals.outputs[0]) rng = n_output.point_data.scalars.range assert (rng[1] - rng[0]) < 1e-4 # Turn on auto-contours c.auto_contours = True # Increase number of contours and the range should change. c.number_of_contours = 10 n_output = get_output(normals.outputs[0]) assert len(n_output.points) != 0 rng = n_output.point_data.scalars.range assert rng[0] < rng[1] # Check if pipeline_changed is correctly propagated. old = get_output(normals.outputs[0]) assert a.mapper.scalar_mode == 'default' c.filled_contours = True n_output = get_output(normals.outputs[0]) c_output = get_output(c.outputs[0]) assert n_output != old assert n_output is c_output # Check if the actor responds correctly to the # filled_contour change. assert a.mapper.scalar_mode == 'use_cell_data' # Set back everything to original state. c.filled_contours = False assert a.mapper.scalar_mode == 'default' c.number_of_contours = 1 c.auto_contours = False ctr.enabled = False assert normals.outputs[0] is cut.outputs[0] check(m) ############################################################ # Test if saving a visualization and restoring it works. # Save visualization. f = BytesIO() f.name = abspath('test.mv2') # We simulate a file. script.save_visualization(f) f.seek(0) # So we can read this saved data. # Remove existing scene. engine = script.engine engine.close_scene(s) # Load visualization script.load_visualization(f) s = engine.current_scene s.scene.isometric_view() # Now do the check. m = s.children[0].children[0].children[0] check(m) ############################################################ # Test if the Mayavi2 visualization can be deep-copied. # Pop the source object. source = s.children.pop() # Add it back to see if that works without error. s.children.append(source) # Now do the check. m = s.children[0].children[0].children[0] s.scene.isometric_view() check(m) # Now deepcopy the source and replace the existing one with # the copy. This basically simulates cutting/copying the # object from the UI via the right-click menu on the tree # view, and pasting the copy back. source1 = copy.deepcopy(source) s.children[0] = source1 # Now do the check. m = s.children[0].children[0].children[0] s.scene.isometric_view() check(m) # If we have come this far, we are golden! if __name__ == "__main__": t = TestGenericModule() t.test() mayavi-4.5.0/integrationtests/mayavi/test_glyph.py0000644000076500000240000001303412747716313023056 0ustar prabhustaff00000000000000"""Tests for the Glyph module. """ # Author: Prabhu Ramachandran # Copyright (c) 2005, Enthought, Inc. # License: BSD Style. # Standard library imports. from os.path import abspath from io import BytesIO import copy import numpy # Enthought library imports. from traits.api import TraitError # Local imports. from common import TestCase class TestGlyph(TestCase): def make_data(self): """Trivial data -- creates an elementatry scalar field and a constant vector field along the 'x' axis.""" s = numpy.arange(0.0, 10.0, 0.01) s = numpy.reshape(s, (10,10,10)) s = numpy.transpose(s) v = numpy.zeros(3000, 'd') v[1::3] = 1.0 v = numpy.reshape(v, (10,10,10,3)) return s, v def set_view(self, s): """Sets the view correctly.""" #s.scene.reset_zoom() s.scene.z_plus_view() c = s.scene.camera c.azimuth(-30) c.elevation(20) s.render() def check(self): script = self.script s = script.engine.current_scene src = s.children[0] g = src.children[0].children[1] assert g.glyph.glyph_source.glyph_position == 'center' assert g.glyph.glyph.vector_mode == 'use_normal' assert g.glyph.glyph.scale_factor == 0.5 assert g.actor.property.line_width == 1.0 v = src.children[0].children[2] glyph = v.glyph gs = glyph.glyph_source assert gs.glyph_position == 'tail' assert gs.glyph_source == gs.glyph_list[1] assert numpy.allclose(v.implicit_plane.normal, (0., 1., 0.)) v = src.children[0].children[3] glyph = v.glyph gs = glyph.glyph_source assert gs.glyph_source == gs.glyph_list[2] assert gs.glyph_position == 'head' assert numpy.allclose(v.implicit_plane.normal, (0., 1., 0.)) def test(self): self.main() def do(self): ############################################################ # Imports. script = self.script from mayavi.sources.array_source import ArraySource from mayavi.modules.outline import Outline from mayavi.modules.glyph import Glyph from mayavi.modules.vector_cut_plane import VectorCutPlane ############################################################ # Create a new scene and set up the visualization. s = self.new_scene() d = ArraySource() sc, vec = self.make_data() d.origin = (-5, -5, -5) d.scalar_data = sc d.vector_data = vec script.add_source(d) # Create an outline for the data. o = Outline() script.add_module(o) # Glyphs for the scalars g = Glyph() script.add_module(g) g.glyph.glyph_source.glyph_position = 'center' g.glyph.glyph.vector_mode = 'use_normal' g.glyph.glyph.scale_factor = 0.5 g.actor.property.line_width = 1.0 v = VectorCutPlane() glyph = v.glyph gs = glyph.glyph_source gs.glyph_position = 'tail' gs.glyph_source = gs.glyph_list[1] script.add_module(v) v.implicit_plane.set(normal=(0, 1, 0), origin=(0, 3, 0)) v = VectorCutPlane() glyph = v.glyph gs = glyph.glyph_source gs.glyph_source = gs.glyph_list[2] gs.glyph_position = 'head' script.add_module(v) v.implicit_plane.set(normal=(0, 1, 0), origin=(0, -2, 0)) # Set the scene to a suitable view. self.set_view(s) self.check() ############################################################ # Test if the modules respond correctly when the components # are changed. g.actor = g.actor.__class__() glyph = g.glyph g.glyph = glyph.__class__() g.glyph = glyph glyph = v.glyph v.glyph = glyph.__class__() v.glyph = glyph v.actor = v.actor.__class__() v.cutter = v.cutter.__class__() ip = v.implicit_plane v.implicit_plane = ip.__class__() v.implicit_plane = ip s.render() self.check() ############################################################ # Test if saving a visualization and restoring it works. # Save visualization. f = BytesIO() f.name = abspath('test.mv2') # We simulate a file. script.save_visualization(f) f.seek(0) # So we can read this saved data. # Remove existing scene. engine = script.engine engine.close_scene(s) # Load visualization script.load_visualization(f) s = engine.current_scene # Set the scene to a suitable view. self.set_view(s) self.check() ############################################################ # Test if the MayaVi2 visualization can be deepcopied. # Pop the source object. sources = s.children s.children = [] # Add it back to see if that works without error. s.children.extend(sources) self.set_view(s) self.check() # Now deepcopy the source and replace the existing one with # the copy. This basically simulates cutting/copying the # object from the UI via the right-click menu on the tree # view, and pasting the copy back. sources1 = copy.deepcopy(sources) s.children[:] = sources self.set_view(s) self.check() # If we have come this far, we are golden! if __name__ == "__main__": t = TestGlyph() t.test() mayavi-4.5.0/integrationtests/mayavi/test_grid_plane.py0000644000076500000240000000730712747716313024045 0ustar prabhustaff00000000000000"""Simple test for the grid plane and outline module. """ # Author: Prabhu Ramachandran # Copyright (c) 2005, Enthought, Inc. # License: BSD Style. # Standard library imports. from os.path import abspath from io import BytesIO import copy # Local imports. from common import TestCase, get_example_data class TestGridPlane(TestCase): def check(self): script = self.script s = script.engine.current_scene mm = s.children[0].children[0] gp1, gp2, gp3 = mm.children[1:] assert gp1.grid_plane.axis == 'x' assert gp1.grid_plane.position == 0 assert gp1.actor.property.ambient == 1.0 assert gp2.grid_plane.axis == 'y' assert gp2.grid_plane.position == 16 assert gp2.actor.property.ambient == 1.0 assert gp3.grid_plane.axis == 'z' assert gp3.grid_plane.position == 6 assert gp3.actor.property.ambient == 1.0 def test(self): self.main() def do(self): ############################################################ # Imports. script = self.script from mayavi.sources.vtk_file_reader import VTKFileReader from mayavi.modules.outline import Outline from mayavi.modules.grid_plane import GridPlane ############################################################ # Create a new scene and set up the visualization. s = self.new_scene() # Read a VTK (old style) data file. r = VTKFileReader() r.initialize(get_example_data('heart.vtk')) script.add_source(r) # Create an outline for the data. o = Outline() script.add_module(o) # Create three simple grid plane modules. # First normal to 'x' axis. gp1 = GridPlane() script.add_module(gp1) # Second normal to 'y' axis. gp2 = GridPlane() # We'll test how robust things are by setting attributes # *before* we add it to the scene. gp2.grid_plane.axis = 'y' gp2.grid_plane.position = 16 script.add_module(gp2) # Third normal to 'z' axis. gp3 = GridPlane() script.add_module(gp3) gp3.grid_plane.axis = 'z' gp3.grid_plane.position = 6 for gp in (gp1, gp2, gp3): gp.actor.property.set(ambient=1.0) # Set the scene to an isometric view. s.scene.isometric_view() self.check() ############################################################ # Test if saving a visualization and restoring it works. # Save visualization. f = BytesIO() f.name = abspath('test.mv2') # We simulate a file. script.save_visualization(f) f.seek(0) # So we can read this saved data. # Remove existing scene. engine = script.engine engine.close_scene(s) # Load visualization script.load_visualization(f) s = engine.current_scene self.check() ############################################################ # Test if the MayaVi2 visualization can be deepcopied. # Pop the source object. source = s.children.pop() # Add it back to see if that works without error. s.children.append(source) self.check() # Now deepcopy the source and replace the existing one with # the copy. This basically simulates cutting/copying the # object from the UI via the right-click menu on the tree # view, and pasting the copy back. source1 = copy.deepcopy(source) s.children[0] = source1 self.check() # If we have come this far, we are golden! if __name__ == "__main__": t = TestGridPlane() t.test() mayavi-4.5.0/integrationtests/mayavi/test_hide_show.py0000644000076500000240000001111712747716313023704 0ustar prabhustaff00000000000000"""Test for the hide-show feature. """ # Author: Prabhu Ramachandran # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. # Standard library imports. from os.path import abspath from io import BytesIO import copy # Local imports. from common import TestCase, get_example_data class TestHideShow(TestCase): def check(self, saved=False): """Does the checking, if saved is True it does not change the properties at first to see how those behave and only tests the final unpickled state.""" script = self.script e = script.engine scene = e.current_scene wrl = scene.children[0] src = scene.children[1] mm = src.children[0] scp = mm.children[0] iso = mm.children[1] if not saved: assert scp.actor.actor.visibility == True assert scp.implicit_plane.widget.enabled == True for a in wrl.actors: assert a.visibility == True assert iso.actor.actor.visibility == True # Check if widget state is remembered. scp.implicit_plane.widget.enabled = False scp.visible = False assert scp.actor.actor.visibility == False assert scp.implicit_plane.widget.enabled == False assert scp.name == 'ScalarCutPlane [Hidden]' # Reenable it and check widget state. scp.visible = True assert scp.actor.actor.visibility == True assert scp.implicit_plane.widget.enabled == False # Reset the visible state. wrl.visible = False scp.visible = False iso.visible = False # Check final state. for a in wrl.actors: assert a.visibility == False assert wrl.name.find('[Hidden]') > -1 assert scp.actor.actor.visibility == False assert scp.implicit_plane.widget.enabled == False assert scp.name == 'ScalarCutPlane [Hidden]' assert iso.name == 'IsoSurface [Hidden]' assert iso.actor.actor.visibility == False def test(self): self.main() def do(self): ############################################################ # Imports. from mayavi.sources.api import VTKXMLFileReader,\ VRMLImporter from mayavi.modules.api import ScalarCutPlane,\ IsoSurface ############################################################ # Create a new scene and set up the visualization. s = self.new_scene() script = mayavi = self.script # Read a VRML file. w = VRMLImporter() w.initialize(get_example_data('room_vis.wrl')) script.add_source(w) # Read a VTK data file. r = VTKXMLFileReader() r.initialize(get_example_data('fire_ug.vtu')) script.add_source(r) # Create the modules. scp = ScalarCutPlane() script.add_module(scp) iso = IsoSurface() script.add_module(iso) # Check. self.check(saved=False) ############################################################ # Test if saving a visualization and restoring it works. # Save visualization. f = BytesIO() f.name = abspath('test.mv2') # We simulate a file. script.save_visualization(f) f.seek(0) # So we can read this saved data. # Remove existing scene. engine = script.engine engine.close_scene(s) # Load visualization script.load_visualization(f) s = engine.current_scene s.scene.isometric_view() # Now do the check. self.check(saved=True) ############################################################ # Test if the Mayavi2 visualization can be deep-copied. # Pop the source object. sources = s.children s.children = [] # Add it back to see if that works without error. s.children.extend(sources) # Now do the check. s.scene.isometric_view() self.check(saved=True) # Now deepcopy the source and replace the existing one with # the copy. This basically simulates cutting/copying the # object from the UI via the right-click menu on the tree # view, and pasting the copy back. sources1 = copy.deepcopy(sources) s.children[:] = sources1 # Now do the check. s.scene.isometric_view() self.check(saved=True) # If we have come this far, we are golden! if __name__ == "__main__": t = TestHideShow() t.test() mayavi-4.5.0/integrationtests/mayavi/test_image_data_probe.py0000644000076500000240000001010112747716313025165 0ustar prabhustaff00000000000000"""Simple test for the ImageDataProbe filter. """ # Author: Prabhu Ramachandran # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. # Standard library imports. from os.path import abspath from io import BytesIO import copy # Local imports. from common import TestCase, get_example_data class TestImageDataProbe(TestCase): def check(self, saved=False): """Does the checking, if saved is True it does not change the properties at first to see how those behave and only tests the final unpickled state.""" script = self.script e = script.engine scene = e.current_scene src = scene.children[0] idp = src.children[0] mm = idp.children[0] if not saved: assert src.get_output_dataset().is_a('vtkUnstructuredGrid') assert idp.get_output_dataset().is_a('vtkImageData') sc = idp.get_output_dataset().point_data.scalars assert sc.name == 't' assert mm.scalar_lut_manager.data_name == 't' assert abs(sc.range[0]) < 1.0 assert abs(sc.range[1] - 626.0) < 1.0 idp.rescale_scalars = True idp.dimensions = (41, 19, 19) sc = idp.get_output_dataset().point_data.scalars assert sc.name == idp.rescaled_scalar_name assert mm.scalar_lut_manager.data_name == idp.rescaled_scalar_name assert abs(sc.range[0]) < 1e-2 assert abs(sc.range[1] - 65535.0) < 1.e-2 assert (idp.get_output_dataset().dimensions == (41, 19, 19)).all() def test(self): self.main() def do(self): ############################################################ # Imports. from mayavi.filters.image_data_probe import ImageDataProbe from mayavi.modules.api import ContourGridPlane from mayavi.sources.vtk_xml_file_reader import VTKXMLFileReader ############################################################ # Create a new scene and set up the visualization. s = self.new_scene() script = mayavi = self.script # Read a VTK (old style) data file. r = VTKXMLFileReader() r.initialize(get_example_data('fire_ug.vtu')) script.add_source(r) # Create the filters. idp = ImageDataProbe() script.add_filter(idp) cgp = ContourGridPlane(enable_contours=False) script.add_module(cgp) cgp.grid_plane.axis = 'z' cgp.grid_plane.position = 2 s.scene.isometric_view() # Check. self.check(saved=False) ############################################################ # Test if saving a visualization and restoring it works. # Save visualization. f = BytesIO() f.name = abspath('test.mv2') # We simulate a file. script.save_visualization(f) f.seek(0) # So we can read this saved data. # Remove existing scene. engine = script.engine engine.close_scene(s) # Load visualization script.load_visualization(f) s = engine.current_scene s.scene.isometric_view() # Now do the check. self.check(saved=True) ############################################################ # Test if the Mayavi2 visualization can be deep-copied. # Pop the source object. source = s.children.pop() # Add it back to see if that works without error. s.children.append(source) # Now do the check. s.scene.isometric_view() self.check(saved=True) # Now deepcopy the source and replace the existing one with # the copy. This basically simulates cutting/copying the # object from the UI via the right-click menu on the tree # view, and pasting the copy back. source1 = copy.deepcopy(source) s.children[0] = source1 # Now do the check. s.scene.isometric_view() self.check(saved=True) # If we have come this far, we are golden! if __name__ == "__main__": t = TestImageDataProbe() t.test() mayavi-4.5.0/integrationtests/mayavi/test_image_plane_widget.py0000644000076500000240000001115412747716313025540 0ustar prabhustaff00000000000000"""Tests for the ImagePlaneWidget module. """ # Author: Prabhu Ramachandran # Copyright (c) 2005, Enthought, Inc. # License: BSD Style. # Standard library imports. from os.path import abspath from io import BytesIO import copy import numpy # Enthought library imports. from traits.api import TraitError # Local imports. from common import TestCase class TestImagePlaneWidget(TestCase): def make_data(self): """Creates suitable data for the test.""" dims = numpy.array((64, 64, 64), 'i') # Create some scalars to render. dx, dy, dz = 10.0/(dims - 1) x = numpy.reshape(numpy.arange(-5.0, 5.0+dx*0.5, dx, 'f'), (dims[0], 1, 1)) y = numpy.reshape(numpy.arange(-5.0, 5.0+dy*0.5, dy, 'f'), (1, dims[1], 1)) z = numpy.reshape(numpy.arange(-5.0, 5.0+dz*0.5, dz, 'f'), (1, 1, dims[0])) scalars = numpy.sin(x*y*z)/(x*y*z) return scalars def set_view(self, s): """Sets the view correctly.""" #s.scene.reset_zoom() s.scene.z_plus_view() c = s.scene.camera c.azimuth(30) c.elevation(30) s.render() def check(self): script = self.script src = script.engine.current_scene.children[0] i1, i2, i3 = src.children[0].children[1:] assert i1.ipw.plane_orientation == 'x_axes' assert numpy.allclose(i1.ipw.center, (0, 31.5, 31.5)) rng = i1.ipw.reslice_output.point_data.scalars.range assert numpy.allclose(rng, (-0.2, 1.0), atol=0.1) assert i2.ipw.plane_orientation == 'y_axes' assert numpy.allclose(i2.ipw.center, (31.5, 0, 31.5)) rng = i2.ipw.reslice_output.point_data.scalars.range assert numpy.allclose(rng, (-0.2, 1.0), atol=0.1) assert i3.ipw.plane_orientation == 'z_axes' assert numpy.allclose(i3.ipw.center, (31.5, 31.5, 0)) rng = i3.ipw.reslice_output.point_data.scalars.range assert numpy.allclose(rng, (-0.2, 1.0), atol=0.1) def test(self): self.main() def do(self): ############################################################ # Imports. script = self.script from mayavi.sources.array_source import ArraySource from mayavi.modules.outline import Outline from mayavi.modules.image_plane_widget import ImagePlaneWidget ############################################################ # Create a new scene and set up the visualization. s = self.new_scene() d = ArraySource() sc = self.make_data() d.scalar_data = sc script.add_source(d) # Create an outline for the data. o = Outline() script.add_module(o) # ImagePlaneWidgets for the scalars ipw = ImagePlaneWidget() script.add_module(ipw) ipw_y = ImagePlaneWidget() script.add_module(ipw_y) ipw_y.ipw.plane_orientation = 'y_axes' ipw_z = ImagePlaneWidget() script.add_module(ipw_z) ipw_z.ipw.plane_orientation = 'z_axes' # Set the scene to a suitable view. self.set_view(s) self.check() ############################################################ # Test if saving a visualization and restoring it works. # Save visualization. f = BytesIO() f.name = abspath('test.mv2') # We simulate a file. script.save_visualization(f) f.seek(0) # So we can read this saved data. # Remove existing scene. engine = script.engine engine.close_scene(s) # Load visualization script.load_visualization(f) s = engine.current_scene # Set the scene to a suitable view. self.set_view(s) self.check() ############################################################ # Test if the MayaVi2 visualization can be deepcopied. # Pop the source object. sources = s.children s.children = [] # Add it back to see if that works without error. s.children.extend(sources) self.set_view(s) self.check() # Now deepcopy the source and replace the existing one with # the copy. This basically simulates cutting/copying the # object from the UI via the right-click menu on the tree # view, and pasting the copy back. sources1 = copy.deepcopy(sources) s.children[:] = sources self.set_view(s) self.check() # If we have come this far, we are golden! if __name__ == "__main__": t = TestImagePlaneWidget() t.test() mayavi-4.5.0/integrationtests/mayavi/test_ipw_multiple_scalars.py0000644000076500000240000000542012747716313026155 0ustar prabhustaff00000000000000 # Author: Prabhu Ramachandran # Copyright (c) 2009, Prabhu Ramachandran # License: BSD Style. # Local imports. from common import TestCase from numpy import zeros, random from tvtk.api import tvtk from tvtk.common import is_old_pipeline class TestIPWMultipleScalars(TestCase): """Tests the IPW with multiple scalars. We have this in addition to the unittests since some of these errors only show up when the view is active.""" def test(self): self.main() def do(self): ############################################################ # Imports. script = self.script from mayavi.sources.vtk_data_source import VTKDataSource from mayavi.modules.api import ImagePlaneWidget # Create dataset with multiple scalars. arr1 = zeros(27, 'f') for n in range(27): arr1[n] = (1+float(n))/10.0 arr2 = (arr1 + 1).astype('d') arr3 = arr1 + 2.0*(0.5 - random.random(27)) arr3 = arr3.astype('f') p = tvtk.ImageData(dimensions=[3,3,3], spacing=[1,1,1]) if is_old_pipeline(): p.scalar_type = 'int' p.point_data.scalars = arr1 p.point_data.scalars.name = 'first' j2 = p.point_data.add_array(arr2) p.point_data.get_array(j2).name='second' j3 = p.point_data.add_array(arr3) p.point_data.get_array(j3).name='third' if is_old_pipeline(): p.update() # Make the pipeline. self.new_scene() src = VTKDataSource(data=p) script.add_source(src) ipw = ImagePlaneWidget() script.add_module(ipw) # Test. ipw = ipw.ipw scalars = ipw.input.point_data.scalars r = scalars.range expect = min(arr1), max(arr1) assert r == expect o = src.outputs[0] o.update_traits() if is_old_pipeline(): st = ipw.input.scalar_type assert scalars.data_type == 10 assert st == 'float' src.point_scalars_name = 'second' scalars = ipw.input.point_data.scalars r = scalars.range expect = min(arr2), max(arr2) assert r == expect o.update_traits() if is_old_pipeline(): st = ipw.input.scalar_type assert scalars.data_type == 11 assert st == 'double' src.point_scalars_name = 'third' scalars = ipw.input.point_data.scalars r = scalars.range expect = min(arr3), max(arr3) assert r == expect o.update_traits() if is_old_pipeline(): st = ipw.input.scalar_type assert scalars.data_type == 10 assert st == 'float' if __name__ == '__main__': t = TestIPWMultipleScalars() t.test() mayavi-4.5.0/integrationtests/mayavi/test_labels.py0000644000076500000240000001006212747716313023173 0ustar prabhustaff00000000000000"""Simple test for the ImageDataProbe filter. """ # Author: Prabhu Ramachandran # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. # Standard library imports. from os.path import abspath from io import BytesIO import copy # Local imports. from common import TestCase, get_example_data class TestLabels(TestCase): def check(self, saved=False): """Does the checking, if saved is True it does not change the properties at first to see how those behave and only tests the final unpickled state.""" script = self.script e = script.engine scene = e.current_scene src = scene.children[0] mm = src.children[0] l = mm.children[1] if not saved: np = l.visible_points.get_output_dataset().number_of_points assert np < 35 and np > 20 l.visible_points.enabled = True l.mapper.label_mode = 'label_scalars' l.label_format = '%.1f' l.number_of_labels = 45 l.property.color = (0,0,0) l.property.italic = False np = l.visible_points.get_output_dataset().number_of_points assert np < 60 and np > 35 assert l.visible_points.enabled == True assert l.visible_points.get_output_dataset() == \ l.visible_points.filter.filter.output assert l.property.color == (0,0,0) assert l.property.italic == False assert l.mapper.label_mode == 'label_scalars' assert l.label_format == '%.1f' def test(self): self.main() def do(self): ############################################################ # Imports. from mayavi.modules.api import ScalarCutPlane from mayavi.modules.labels import Labels from mayavi.sources.vtk_xml_file_reader import VTKXMLFileReader ############################################################ # Create a new scene and set up the visualization. s = self.new_scene() script = mayavi = self.script # Read a VTK (old style) data file. r = VTKXMLFileReader() r.initialize(get_example_data('fire_ug.vtu')) script.add_source(r) # Create the filters. cp = ScalarCutPlane() script.add_module(cp) l = Labels(object=cp) script.add_module(l) s.scene.isometric_view() self.check(saved=False) ############################################################ # Test if saving a visualization and restoring it works. # Save visualization. f = BytesIO() f.name = abspath('test.mv2') # We simulate a file. script.save_visualization(f) f.seek(0) # So we can read this saved data. # Remove existing scene. engine = script.engine engine.close_scene(s) # Load visualization script.load_visualization(f) s = engine.current_scene s.scene.isometric_view() # Seems to be needed for the test to pass. :( Just flushes the # pipeline. s.children[0].pipeline_changed = True # Check. # Now do the check. self.check(saved=True) ############################################################ # Test if the Mayavi2 visualization can be deep-copied. # Pop the source object. source = s.children.pop() # Add it back to see if that works without error. s.children.append(source) # Now do the check. s.scene.isometric_view() self.check(saved=True) # Now deepcopy the source and replace the existing one with # the copy. This basically simulates cutting/copying the # object from the UI via the right-click menu on the tree # view, and pasting the copy back. source1 = copy.deepcopy(source) s.children[0] = source1 # Now do the check. s.scene.isometric_view() self.check(saved=True) # If we have come this far, we are golden! if __name__ == "__main__": t = TestLabels() t.test() mayavi-4.5.0/integrationtests/mayavi/test_mlab.py0000644000076500000240000000562112747716313022651 0ustar prabhustaff00000000000000"""Tests for the mlab interface to Mayavi """ # Author: Gael Varoquaux # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. # Standard library imports. from inspect import getmembers import sys from time import sleep # Enthought library imports from pyface.api import GUI # Local imports. from common import TestCase def is_timer_running(timer): """Written to work around a pyface bug. """ if hasattr(timer, 'isActive'): # The Qt backend's IsRunning does not work correctly. return timer.isActive() else: return timer.IsRunning() def run_mlab_examples(): from mayavi import mlab from mayavi.tools.animator import Animator ############################################################ # run all the "test_foobar" functions in the mlab module. for name, func in getmembers(mlab): if not callable(func) or not name[:4] in ('test', 'Test'): continue if sys.platform == 'win32' and name == 'test_mesh_mask_custom_colors': # fixme: This test does not seem to work on win32, disabling for now. continue mlab.clf() GUI.process_events() obj = func() if isinstance(obj, Animator): obj.delay = 10 # Close the animation window. obj.close() while is_timer_running(obj.timer): GUI.process_events() sleep(0.05) # Mayavi has become too fast: the operator cannot see if the # Test function was succesful. GUI.process_events() sleep(0.1) class TestMlab(TestCase): def test(self): self.main() def do(self): ############################################################ # Imports. from mayavi import mlab ############################################################ # Create a new scene and set up the visualization. s = self.new_scene() s.scene.isometric_view() ############################################################ # run all the "test_foobar" functions in the mlab module. run_mlab_examples() ############################################################ # Test some specific corner-cases import numpy x, y, z = numpy.mgrid[1:10, 1:10, 1:10] u, v, w = numpy.mgrid[1:10, 1:10, 1:10] s = numpy.sqrt(u**2 + v**2) mlab.clf() # Test the extra argument "scalars" mlab.quiver3d(x, y, z, u, v, w, scalars=s) # Test surf with strange-shaped inputs X, Y = numpy.ogrid[-10:10, -10:10] Z = X**2 + Y**2 mlab.surf(X, Y, Z) mlab.surf(X.ravel(), Y.ravel(), Z) x, y, z = numpy.mgrid[-10:10, -10:10, -3:2] mlab.flow(x, y, z) # Test glyphs with number-only coordinnates mlab.points3d(0, 0, 0, resolution=50) if __name__ == "__main__": t = TestMlab() t.test() mayavi-4.5.0/integrationtests/mayavi/test_mlab_envisage.py0000644000076500000240000000145112747716313024527 0ustar prabhustaff00000000000000from mayavi import mlab from pyface.api import GUI def close(): """Close the scene.""" f = mlab.gcf() e = mlab.get_engine() e.window.workbench.prompt_on_exit = False e.window.close() mlab.options.backend = 'auto' # Hack: on Linux the splash screen does not go away so we force it. GUI.invoke_after(500, e.window.workbench.application.gui.stop_event_loop) def test_mlab_envisage(): "Test if mlab runs correctly when the backend is set to 'envisage'." @mlab.show def f(): from mayavi.preferences.api import preference_manager preference_manager.root.show_splash_screen = False mlab.options.backend = 'envisage' mlab.test_contour3d() GUI.invoke_after(3000, close) f() if __name__ == '__main__': test_mlab_envisage() mayavi-4.5.0/integrationtests/mayavi/test_mlab_savefig.py0000644000076500000240000000544512747716313024361 0ustar prabhustaff00000000000000import os import shutil import sys import unittest import tempfile import numpy from mayavi import mlab from mayavi.core.engine import Engine from mayavi.core.off_screen_engine import OffScreenEngine from mayavi.tools.figure import savefig from common import TestCase def create_quiver3d(): x, y, z = numpy.mgrid[1:10, 1:10, 1:10] u, v, w = numpy.mgrid[1:10, 1:10, 1:10] s = numpy.sqrt(u**2 + v**2) mlab.quiver3d(x, y, z, u, v, w, scalars=s) # Note: the figure(window) size is delibrately set to be smaller than # the required size in `savefig`, this forces the re-rendering to # occur and catch any potential ill rendering class TestMlabSavefigUnitTest(unittest.TestCase): def setUp(self): # Make a temporary directory for saved figures self.temp_dir = tempfile.mkdtemp() self.filename = os.path.join(self.temp_dir, "saved_figure.png") # this ensures that the temporary directory is removed self.addCleanup(self.remove_tempdir) def remove_tempdir(self): shutil.rmtree(self.temp_dir) def setup_engine_and_figure(self, engine): # Set up a Engine/OffScreenEngine/... for the test case self.engine = engine if not engine.running: engine.start() # figure size is set to be small to force re-rendering engine.new_scene(size=(90, 100)) self.figure = engine.current_scene # the clean up function will close all figures and stop the engine self.addCleanup(self.cleanup_engine, self.engine) def cleanup_engine(self, engine): """ Close all scenes in the engine and stop it """ scenes = [scene for scene in engine.scenes] for scene in scenes: engine.close_scene(scene) engine.stop() @unittest.skipIf(os.environ.get("TRAVIS", False), ("Offscreen rendering is not tested on Travis " "due to lack of GLX support")) def test_many_savefig_offscreen(self): """Test if savefig works with off_screen_rendering and Engine""" engine = Engine() for _ in xrange(5): self.setup_engine_and_figure(engine) # Use off-screen rendering self.figure.scene.off_screen_rendering = True # Set up the scene create_quiver3d() # save the figure savefig(self.filename, size=(131, 217), figure=self.figure) class TestMlabSavefig(TestCase): def test(self): self.main() def do(self): suite = unittest.TestLoader().loadTestsFromTestCase( TestMlabSavefigUnitTest) result = unittest.TextTestRunner().run(suite) if result.errors or result.failures: sys.exit(1) if __name__ == "__main__": t = TestMlabSavefig() t.test() mayavi-4.5.0/integrationtests/mayavi/test_mlab_show.py0000644000076500000240000000133312747716313023705 0ustar prabhustaff00000000000000"""Test for the mlab.show function/decorator.""" from mayavi import mlab from pyface.api import GUI from test_mlab import run_mlab_examples def close(): """Close the scene.""" f = mlab.gcf() e = mlab.get_engine() v = e.get_viewer(f) v.close() def test_mlab_show(): """Test mlab.show()""" run_mlab_examples() # Automatically close window in 100 msecs. GUI.invoke_after(100, close) mlab.show() def test_show_decorator(): """Test the @mlab.show decorator""" @mlab.show def f(): run_mlab_examples() # Automatically close window in 100 msecs. GUI.invoke_after(100, close) f() if __name__ == '__main__': test_mlab_show() test_show_decorator() mayavi-4.5.0/integrationtests/mayavi/test_optional_collection.py0000644000076500000240000001030412747716313025770 0ustar prabhustaff00000000000000"""Simple test for the Optional and Collection filters. """ # Author: Prabhu Ramachandran # Copyright (c) 2008, Prabhu Ramachandran # License: BSD Style. # Standard library imports. from os.path import abspath from io import BytesIO import copy # Local imports. from common import TestCase, get_example_data class TestOptionalCollection(TestCase): def test(self): self.main() def do(self): ############################################################ # Imports. script = self.script from mayavi.sources.vtk_file_reader import VTKFileReader from mayavi.filters.contour import Contour from mayavi.filters.optional import Optional from mayavi.filters.collection import Collection from mayavi.filters.api import PolyDataNormals from mayavi.modules.api import Surface ############################################################ # Create a new scene and set up the visualization. s = self.new_scene() # Read a VTK (old style) data file. r = VTKFileReader() r.initialize(get_example_data('heart.vtk')) script.add_source(r) c = Contour() # `name` is used for the notebook tabs. n = PolyDataNormals(name='Normals') o = Optional(filter=n, label_text='Compute normals') coll = Collection(filters=[c, o], name='IsoSurface') script.add_filter(coll) s = Surface() script.add_module(s) ######################################## # do the testing. def check(coll): """Check if test status is OK given the collection.""" c, o = coll.filters c = c.filter n = o.filter assert coll.get_output_dataset().point_data.scalars.range == (127.5, 127.5) # Adding a contour should create the appropriate output in # the collection. c.contours.append(200) assert coll.get_output_dataset().point_data.scalars.range == (127.5, 200.0) # the collection's output should be that of the normals. assert coll.get_output_dataset() is n.get_output_dataset() # disable the optional filter and check. o.enabled = False assert 'disabled' in o.name assert coll.get_output_dataset() is c.get_output_dataset() # Set back everything to original state. c.contours.pop() o.enabled = True assert coll.get_output_dataset().point_data.scalars.range == (127.5, 127.5) assert coll.get_output_dataset() is n.get_output_dataset() assert 'disabled' not in o.name check(coll) ############################################################ # Test if saving a visualization and restoring it works. # Save visualization. f = BytesIO() f.name = abspath('test.mv2') # We simulate a file. script.save_visualization(f) f.seek(0) # So we can read this saved data. # Remove existing scene. engine = script.engine engine.close_scene(s) # Load visualization script.load_visualization(f) s = engine.current_scene # Now do the check. coll = s.children[0].children[0] check(coll) ############################################################ # Test if the Mayavi2 visualization can be deep-copied. # Pop the source object. source = s.children.pop() # Add it back to see if that works without error. s.children.append(source) # Now do the check. coll = s.children[0].children[0] check(coll) # Now deepcopy the source and replace the existing one with # the copy. This basically simulates cutting/copying the # object from the UI via the right-click menu on the tree # view, and pasting the copy back. source1 = copy.deepcopy(source) s.children[0] = source1 # Now do the check. coll = s.children[0].children[0] check(coll) # If we have come this far, we are golden! if __name__ == "__main__": t = TestOptionalCollection() t.test() mayavi-4.5.0/integrationtests/mayavi/test_plot3d_mb_reader.py0000644000076500000240000000560212747716313025142 0ustar prabhustaff00000000000000"""Test for the PLOT3D reader and its multiblock capabilities. This also tests the SelectOutput filter. """ # Author: Prabhu Ramachandran # Copyright (c) 2008, Prabhu Ramachandran # License: BSD Style. # Standard library imports. from os.path import abspath from io import BytesIO import copy # Local imports. from common import TestCase, get_example_data class TestPLOT3DReader(TestCase): def test(self): self.main() def do(self): ############################################################ # Imports. script = self.script from mayavi.sources.plot3d_reader import PLOT3DReader from mayavi.filters.select_output import SelectOutput from mayavi.modules.outline import Outline ############################################################ # Create a new scene and set up the visualization. s = self.new_scene() # Read the multi-block plot3d file. r = PLOT3DReader() r.reader.set(has_byte_count=True, multi_grid=True, byte_order='little_endian') r.initialize(get_example_data('tiny.xyz'), get_example_data('tiny.q'), configure=False) script.add_source(r) # Add the filter. f = SelectOutput() script.add_filter(f) # Create an outline for the data. o = Outline() script.add_module(o) # Check the bounds of the outline. assert o.outline_filter.output.bounds == (1.0, 2.0, 1.0, 2.0, 1.0, 2.0) # Copy the reader to see if it does not pop up the UI. r1 = copy.deepcopy(r) script.add_source(r1) s.render() o1 = r1.children[0].children[0].children[0] assert o1.outline_filter.output.bounds == (1.0, 2.0, 1.0, 2.0, 1.0, 2.0) r1.children[0].output_index = 1 assert o1.outline_filter.output.bounds == (2.0, 3.0, 1.0, 2.0, 1.0, 2.0) ############################################################ # Test if saving a visualization and restoring it works. # Save visualization. f = BytesIO() f.name = abspath('test.mv2') # We simulate a file. script.save_visualization(f) f.seek(0) # So we can read this saved data. # Remove existing scene. engine = script.engine engine.close_scene(s) # Load visualization script.load_visualization(f) s = engine.current_scene o = s.children[0].children[0].children[0].children[0] o1 = s.children[1].children[0].children[0].children[0] assert o.outline_filter.output.bounds == (1.0, 2.0, 1.0, 2.0, 1.0, 2.0) assert o1.outline_filter.output.bounds == (2.0, 3.0, 1.0, 2.0, 1.0, 2.0) # If we have come this far, we are golden! return if __name__ == "__main__": t = TestPLOT3DReader() t.test() mayavi-4.5.0/integrationtests/mayavi/test_restore_scene.py0000644000076500000240000000434412747716313024577 0ustar prabhustaff00000000000000"""Simple test for the Optional and Collection filters. """ # Author: Prabhu Ramachandran # Copyright (c) 2008, Prabhu Ramachandran # License: BSD Style. # Standard library imports. from os.path import abspath from io import BytesIO from numpy import array from mayavi.sources.vtk_file_reader import VTKFileReader from mayavi.modules.api import Surface from mayavi.tools.camera import view from apptools.persistence.state_pickler import get_state # Local imports. from common import TestCase, get_example_data class TestRestoreScene(TestCase): def test(self): self.main() def do(self): script = self.script ############################################################ # Create a new scene and set up the visualization. scene = self.new_scene() # Read a VTK (old style) data file. source = VTKFileReader() source.initialize(get_example_data('heart.vtk')) script.add_source(source) script.add_module(Surface()) # In order to test the restoration of visualization properly # we should modify the camera view(130., 44., 65., [14., 14., 14.]) ############################################################ # Test if saving a visualization and restoring it works. # Save visualization. f = BytesIO() f.name = abspath('test.mv2') # We simulate a file. script.save_visualization(f) f.seek(0) # So we can read this saved data. # This is the old camera state old_camera_state = get_state(scene.scene.camera) # Remove existing scene. engine = script.engine engine.close_scene(scene) # Load visualization script.load_visualization(f) scene = engine.current_scene # Now do the check. new_camera_state = get_state(scene.scene.camera) for attr, new_value in new_camera_state.items(): if attr.startswith("_"): continue new_value = array(new_value) old_value = array(old_camera_state[attr]) assert (new_value == old_value).all() if __name__ == "__main__": t = TestRestoreScene() t.test() mayavi-4.5.0/integrationtests/mayavi/test_set_active_attribute.py0000644000076500000240000000713312747716313026147 0ustar prabhustaff00000000000000# Author: Prabhu Ramachandran # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. # Standard library imports. from os.path import abspath from io import BytesIO import copy # Local imports. from mayavi.core.common import get_output from common import TestCase, get_example_data class TestSetActiveAttribute(TestCase): def check(self): """Check if the visualization is OK. Note that this is not an image based check, which is very convenient. """ e = self.script.engine scene = e.current_scene src = scene.children[0] assert src.point_scalars_name == 'u' c = src.children[1] sc = get_output(c.outputs[0]).point_data.scalars assert sc.name == 'u' # It is an iso-contour! assert sc.range[0] == sc.range[1] aa = c.children[0].children[0] assert aa.point_scalars_name == 't' sc = get_output(aa.outputs[0]).point_data.scalars assert sc.name == 't' assert abs(sc.range[0] - 308) < 1.0 assert abs(sc.range[1] - 631) < 1.0 s = aa.children[0].children[0] def test(self): self.main() def do(self): """Test for the SetActiveAttribute filter. """ from mayavi.sources.api import VTKXMLFileReader from mayavi.filters.contour import Contour from mayavi.filters.api import PolyDataNormals from mayavi.filters.set_active_attribute import SetActiveAttribute from mayavi.modules.api import Surface, Outline mayavi = script = self.script scene = self.new_scene() r = VTKXMLFileReader() r.initialize(get_example_data('fire_ug.vtu')) mayavi.add_source(r) r.point_scalars_name = 'u' o = Outline() mayavi.add_module(o) c = Contour() mayavi.add_filter(c) n = PolyDataNormals() mayavi.add_filter(n) aa = SetActiveAttribute() mayavi.add_filter(aa) aa.point_scalars_name = 't' s = Surface() mayavi.add_module(s) scene.scene.isometric_view() # Check if things are OK. self.check() ############################################################ # Test if saving a visualization and restoring it works. # Save visualization. f = BytesIO() f.name = abspath('test.mv2') # We simulate a file. mayavi.save_visualization(f) f.seek(0) # So we can read this saved data. # Remove existing scene. engine = mayavi.engine engine.close_scene(s) # Load visualization mayavi.load_visualization(f) s = engine.current_scene # Now do the check. s.scene.isometric_view() self.check() ############################################################ # Test if the Mayavi2 visualization can be deep-copied. # Pop the source object. source = s.children.pop() # Add it back to see if that works without error. s.children.append(source) # Now do the check. self.check() # Now deepcopy the source and replace the existing one with # the copy. This basically simulates cutting/copying the # object from the UI via the right-click menu on the tree # view, and pasting the copy back. source1 = copy.deepcopy(source) s.children[0] = source1 # Now do the check. s.scene.isometric_view() self.check() # If we have come this far, we are golden! if __name__ == '__main__': t = TestSetActiveAttribute() t.test() mayavi-4.5.0/integrationtests/mayavi/test_streamline.py0000644000076500000240000001324312747716313024100 0ustar prabhustaff00000000000000"""Tests for the Streamline module. This module uses the compare_image function to perform image based testing. This is so just to illustrate how you could use image based tests. However, we recommend that one does not use image based tests since they are not always reliable and a pain. """ # Author: Prabhu Ramachandran # Copyright (c) 2005-2008, Enthought, Inc. # License: BSD Style. # Standard library imports. from os.path import abspath from io import BytesIO import copy import numpy import sys # Local imports. from common import TestCase, is_running_with_nose class TestStreamline(TestCase): def make_data(self): """Trivial data -- creates an elementatry scalar field and a constant vector field along the 'x' axis.""" s = numpy.arange(0.0, 10.0, 0.01) s = numpy.reshape(s, (10,10,10)) s = numpy.transpose(s) v = numpy.zeros(3000, 'd') v[::3] = 1.0 v = numpy.reshape(v, (10,10,10,3)) return s, v def test(self): if is_running_with_nose(): import unittest raise unittest.SkipTest('This test Segfaults after passing or fails.') self.main() def do(self): ############################################################ # Imports. script = self.script from mayavi.sources.array_source import ArraySource from mayavi.modules.outline import Outline from mayavi.modules.streamline import Streamline ############################################################ # Create a new scene and set up the visualization. s = self.new_scene() d = ArraySource() sc, vec = self.make_data() d.origin = (-5, -5, -5) d.scalar_data = sc d.vector_data = vec script.add_source(d) # Create an outline for the data. o = Outline() script.add_module(o) # View the data. st = Streamline() script.add_module(st) widget = st.seed.widget widget.set(radius=1.0, center=(-4.0, -4.0, -4.0), theta_resolution=4, phi_resolution=4) st = Streamline(streamline_type='ribbon') seed = st.seed seed.widget = seed.widget_list[1] script.add_module(st) seed.widget.set(point1=(-5.0, -4.5, -4.0), point2=(-5.0, -4.5, 4.0)) st.ribbon_filter.width = 0.25 st = Streamline(streamline_type='tube') seed = st.seed seed.widget = seed.widget_list[2] script.add_module(st) seed.widget.set(center=(-5.0, 1.5, -2.5)) st.tube_filter.radius = 0.15 st = Streamline(streamline_type='tube') seed = st.seed seed.widget = seed.widget_list[3] script.add_module(st) seed.widget.position=(-5.0, 3.75, 3.75) st.tube_filter.radius = 0.2 # Set the scene to a suitable view. s.scene.z_plus_view() c = s.scene.camera c.azimuth(-30) c.elevation(30) s.render() # Update the streamlines. mm = o.module_manager for child in mm.children[1:]: child.update_streamlines = True # Now compare the image. self.compare_image(s, 'images/test_streamline.png') ############################################################ # Test if the modules respond correctly when the components # are changed. tf = st.tube_filter st.tube_filter = tf.__class__() st.tube_filter = tf st.ribbon_filter = st.ribbon_filter.__class__() seed = st.seed st.seed = seed.__class__() st.seed = seed st.actor = st.actor.__class__() tracer = st.stream_tracer st.stream_tracer = tracer.__class__() st.stream_tracer = tracer s.render() # Now compare the image. self.compare_image(s, 'images/test_streamline.png') s.render() ############################################################ # Test if saving a visualization and restoring it works. bg = s.scene.background # Save visualization. f = BytesIO() f.name = abspath('test.mv2') # We simulate a file. script.save_visualization(f) f.seek(0) # So we can read this saved data. # Remove existing scene. engine = script.engine engine.close_scene(s) # Load visualization script.load_visualization(f) s = engine.current_scene # Set the scene to a suitable view. s.scene.z_plus_view() c = s.scene.camera c.azimuth(-30) c.elevation(30) s.render() s.scene.background = bg # Now compare the image. self.compare_image(s, 'images/test_streamline.png') ############################################################ # Test if the MayaVi2 visualization can be deepcopied. # Pop the source object. sources = s.children s.children = [] # Add it back to see if that works without error. s.children.extend(sources) s.scene.reset_zoom() # Now compare the image. self.compare_image(s, 'images/test_streamline.png') # Now deepcopy the source and replace the existing one with # the copy. This basically simulates cutting/copying the # object from the UI via the right-click menu on the tree # view, and pasting the copy back. sources1 = copy.deepcopy(sources) s.children[:] = sources s.scene.reset_zoom() self.compare_image(s, 'images/test_streamline.png') # If we have come this far, we are golden! if __name__ == "__main__": t = TestStreamline() t.test() mayavi-4.5.0/integrationtests/mayavi/test_text3d.py0000644000076500000240000000352612747716313023153 0ustar prabhustaff00000000000000"""Tests for the Text3D module """ import os import shutil import sys import unittest import tempfile import numpy from PIL import Image from mayavi import mlab from common import TestCase class TestText3DUnitTest(unittest.TestCase): def setUp(self): # Make a temporary directory for saved figures self.temp_dir = tempfile.mkdtemp() self.filename = os.path.join(self.temp_dir, "saved_figure.png") # this ensures that the temporary directory is removed self.addCleanup(self.remove_tempdir) def remove_tempdir(self): shutil.rmtree(self.temp_dir) def mlab_close_all(self): mlab.close(all=True) def test_text3d(self): """Test if Text3D shows""" # the points3d is there to provide data for # attaching the text3d module. Opacity is set to # zero so that the image should only show # the text3d and we look for the pixels mlab.points3d(0., 0., 0., opacity=0.) self.addCleanup(self.mlab_close_all) mlab.text3d(0., 0., 0., "X") mlab.savefig(self.filename) self.check() def check(self): image = numpy.array(Image.open(self.filename))[:, :, :3] # Check that the image has pixel different from the background # Supposedly the first pixel is the background color if not (numpy.sum(image != image[0, 0], axis=2) == 3).any(): message = "Looks like the Text3D is not shown" self.fail(message) class TestText3D(TestCase): def test(self): self.main() def do(self): suite = unittest.TestLoader().loadTestsFromTestCase( TestText3DUnitTest) result = unittest.TextTestRunner().run(suite) if result.errors or result.failures: sys.exit(1) if __name__ == "__main__": t = TestText3D() t.test() mayavi-4.5.0/integrationtests/mayavi/test_texture.py0000644000076500000240000001012412747716313023430 0ustar prabhustaff00000000000000import os import shutil import sys import unittest import tempfile import numpy from PIL import Image from tvtk.api import tvtk from mayavi import mlab from mayavi.tools.figure import savefig from common import TestCase # path to mayavi source MAYAVI_DIR = os.path.split(mlab.__file__)[0] class TestTextureUnitTest(unittest.TestCase): def setUp(self): # Make a temporary directory for saved figures self.temp_dir = tempfile.mkdtemp() self.filename = os.path.join(self.temp_dir, "saved_figure.png") # this ensures that the temporary directory is removed self.addCleanup(self.remove_tempdir) # texture image # the image is a black-white checker box pattern image_path = os.path.join( MAYAVI_DIR, "../integrationtests/mayavi/images/checker.jpg") img=tvtk.JPEGReader(file_name=image_path) self.texture=tvtk.Texture(input_connection=img.output_port, interpolate=1) def remove_tempdir(self): shutil.rmtree(self.temp_dir) def mlab_close_all(self): mlab.close(all=True) def add_texture(self, source, mode): # Add texture source.actor.actor.mapper.scalar_visibility=False source.actor.enable_texture=True source.actor.tcoord_generator_mode=mode source.actor.actor.texture=self.texture def test_texture_curve(self): """ Test texture on mlab.surf """ mlab.figure() X, Y = numpy.mgrid[-1:1:20j,-1:1:20j] Z = -numpy.cos(Y*X)+.5 source = mlab.surf(X, Y, Z, color=(1., 1., 1.)) # ensure the figure is closed at the end of the test self.addCleanup(self.mlab_close_all) # Apply the texture self.add_texture(source, "plane") # Zoom in closer for analysis mlab.view(67.2, 47, 2.1, [0.22, 0.13, -0.6]) mlab.savefig(self.filename, size=(400, 300)) # Check the saved image (if texture fails, std ~ 10) self.check_image_std(target_std=150.) def test_texture_sphere(self): """ Test texture on mlab.points3d (sphere) """ mlab.figure() source = mlab.points3d(0, 0, 0) # ensure the figure is closed at the end of the test self.addCleanup(self.mlab_close_all) # Apply the texture self.add_texture(source, "sphere") # Zoom in closer for analysis mlab.view(-158., 10.4, 2., [0, 0, 0]) mlab.savefig(self.filename, size=(400, 300)) # Check the saved image (if texture fails, std ~ 90) self.check_image_std(target_std=150.) def test_texture_cylinder(self): """ Test texture on mlab.points3d (cylinder) """ mlab.figure() source = mlab.points3d(0, 0, 0, mode="cylinder") # ensure the figure is closed at the end of the test self.addCleanup(self.mlab_close_all) # Apply the texture self.add_texture(source, "cylinder") # Zoom in closer for analysis mlab.view(52., 38., 1.4, [0., 0., 0.]) mlab.savefig(self.filename, size=(400, 300)) # Check the saved image (if texture fails, std ~ 90) self.check_image_std(target_std=150.) def check_image_std(self, target_std): # Check that the pixels in the image vary greatly as # the pattern is a checker box image = numpy.array(Image.open(self.filename))[:, :, :3].sum(axis=2) message = ("The Texture is a checker box but the image " "pixels do not vary greatly enough. " "It looks wrong. Target standard deviation: {0}, " "got {1}") self.assertGreaterEqual(image.std(), target_std, message.format(target_std, image.std())) class TestTexture(TestCase): def test(self): self.main() def do(self): suite = unittest.TestLoader().loadTestsFromTestCase( TestTextureUnitTest) result = unittest.TextTestRunner().run(suite) if result.errors or result.failures: sys.exit(1) if __name__ == "__main__": t = TestTexture() t.test() mayavi-4.5.0/integrationtests/mayavi/test_tools_camera.py0000644000076500000240000000574212747716313024412 0ustar prabhustaff00000000000000"""Tests for the tools.camera """ import sys import unittest from contextlib import contextmanager from numpy import array from mayavi import mlab from mayavi.sources.builtin_image import BuiltinImage from mayavi.tools import camera as camera_tools from common import TestCase @contextmanager def check_attrs_change(test_case, obj, attrs): old_attrs = {attr: array(getattr(obj, attr)) for attr in attrs} try: yield finally: unchanged = [] for attr, old_value in old_attrs.items(): new_value = array(getattr(obj, attr)) if all(new_value == old_value): unchanged.append(attr) if unchanged: msg = "Expect {} to change. They stayed the same." test_case.fail(msg.format(", ".join(unchanged))) @contextmanager def check_attrs_do_not_change(test_case, obj, attrs): old_attrs = {attr: array(getattr(obj, attr)) for attr in attrs} try: yield finally: changed = [] for attr, old_value in old_attrs.items(): new_value = array(getattr(obj, attr)) if any((new_value - old_value) > 1.e-5): changed.append((attr, old_value, new_value)) msg = ("'{0}' changed: \n" "old value: {1} New value: {2}") if changed: all_messages = "\n".join([msg.format(attr, old, new) for attr, old, new in changed]) test_case.fail(all_messages) class TestCameraUnitTest(unittest.TestCase): def setUp(self, figure=None): self.engine = mlab.get_engine() fig = mlab.figure() mlab.pipeline.surface(BuiltinImage(), figure=fig) self.camera = self.engine.current_scene.scene.camera def tearDown(self): mlab.close(all=True) def test_move_with_forward(self): camera = self.engine.current_scene.scene.camera with check_attrs_change(self, camera, ("focal_point", "position", "clipping_range")): camera_tools.move(forward=20.) def test_camera_move_with_right(self): camera = self.engine.current_scene.scene.camera with check_attrs_change(self, camera, ("focal_point", "position")), \ check_attrs_do_not_change(self, camera, ("clipping_range",)): camera_tools.move(right=20.) def test_camera_move_with_up(self): camera = self.engine.current_scene.scene.camera with check_attrs_change(self, camera, ("focal_point", "position", "clipping_range")): camera_tools.move(up=20.) class TestCamera(TestCase): def test(self): self.main() def do(self): suite = unittest.TestLoader().loadTestsFromTestCase(TestCameraUnitTest) result = unittest.TextTestRunner().run(suite) if result.errors or result.failures: sys.exit(1) if __name__ == "__main__": t = TestCamera() t.test() mayavi-4.5.0/integrationtests/mayavi/test_user_defined.py0000644000076500000240000001270212747716313024370 0ustar prabhustaff00000000000000"""Simple test for the UsedDefined filter. """ # Author: Prabhu Ramachandran # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. # Standard library imports. from os.path import abspath from io import BytesIO import copy # Enthought library imports. from tvtk.api import tvtk # Local imports. from common import TestCase, get_example_data class TestUserDefined(TestCase): def check(self, saved=False): """Does the checking, if saved is True it does not change the properties at first to see how those behave and only tests the final unpickled state.""" script = self.script e = script.engine scene = e.current_scene src = scene.children[0] ud = src.children[0] o = ud.children[0].children[0].children[0] mm = o.children[0] if not saved: assert ud.filter.vector_mode == 'compute_gradient' assert src.get_output_dataset().point_data.scalars.name == 't' assert src.get_output_dataset().point_data.vectors.name == 'uvw' expect = ['ScalarGradient', 'Vorticity'] expect1 = [x +'-y' for x in expect] expect2 = [x + ' magnitude' for x in expect] # FIXME: This is really a bug in VTK, the name of the scalar # should really be ScalarGradient-y. This is fixed in # 5.2 but earlier versions fail. assert o.get_output_dataset().point_data.scalars.name in expect1 assert o.get_output_dataset().point_data.vectors.name in expect assert mm.scalar_lut_manager.data_name in expect1 # Turn of extraction. o.enabled = False assert o.get_output_dataset().point_data.scalars.name in expect2 assert o.get_output_dataset().point_data.vectors.name in expect assert mm.scalar_lut_manager.data_name in expect2 # Compute the vorticity ud.filter.vector_mode = 'compute_vorticity' assert o.get_output_dataset().point_data.scalars.name == 'Vorticity magnitude' assert o.get_output_dataset().point_data.vectors.name == 'Vorticity' assert mm.scalar_lut_manager.data_name == 'Vorticity magnitude' # Turn on extraction. o.enabled = True assert o.get_output_dataset().point_data.scalars.name == 'Vorticity-y' assert o.get_output_dataset().point_data.vectors.name == 'Vorticity' assert mm.scalar_lut_manager.data_name == 'Vorticity-y' # Turn off extraction. o.enabled = False def test(self): self.main() def do(self): ############################################################ # Imports. from mayavi.filters.optional import Optional from mayavi.filters.user_defined import UserDefined from mayavi.filters.api import (CellToPointData, ExtractVectorNorm, ExtractVectorComponents) from mayavi.modules.api import ScalarCutPlane from mayavi.sources.vtk_xml_file_reader import VTKXMLFileReader ############################################################ # Create a new scene and set up the visualization. s = self.new_scene() script = mayavi = self.script # Read a VTK (old style) data file. r = VTKXMLFileReader() r.initialize(get_example_data('fire_ug.vtu')) script.add_source(r) # Create the filters. # CellDerivatives cd = tvtk.CellDerivatives() ud = UserDefined(filter=cd) script.add_filter(ud) ctp = CellToPointData() ctp.filter.pass_cell_data = False script.add_filter(ctp) evn = ExtractVectorNorm() script.add_filter(evn) evc = ExtractVectorComponents(component='y-component') o = Optional(filter=evc) script.add_filter(o) script.add_module(ScalarCutPlane()) s.scene.isometric_view() # Check. self.check(saved=False) ############################################################ # Test if saving a visualization and restoring it works. # Save visualization. f = BytesIO() f.name = abspath('test.mv2') # We simulate a file. script.save_visualization(f) f.seek(0) # So we can read this saved data. # Remove existing scene. engine = script.engine engine.close_scene(s) # Load visualization script.load_visualization(f) s = engine.current_scene s.scene.isometric_view() # Now do the check. self.check(saved=True) ############################################################ # Test if the Mayavi2 visualization can be deep-copied. # Pop the source object. source = s.children.pop() # Add it back to see if that works without error. s.children.append(source) # Now do the check. s.scene.isometric_view() self.check(saved=True) # Now deepcopy the source and replace the existing one with # the copy. This basically simulates cutting/copying the # object from the UI via the right-click menu on the tree # view, and pasting the copy back. source1 = copy.deepcopy(source) s.children[0] = source1 # Now do the check. s.scene.isometric_view() self.check(saved=True) # If we have come this far, we are golden! if __name__ == "__main__": t = TestUserDefined() t.test() mayavi-4.5.0/integrationtests/mayavi/test_vtk_data_source.py0000644000076500000240000001007112747716313025106 0ustar prabhustaff00000000000000"""Simple test for the VTKDataSource source. This is basically a copy of test_contour.py with the data source alone modified. """ # Author: Prabhu Ramachandran # Copyright (c) 2005, Enthought, Inc. # License: BSD Style. # Standard library imports. from os.path import abspath from io import BytesIO import copy # Local imports. from common import get_example_data from test_contour import TestContour class TestVTKDataSource(TestContour): def make_data(self): script = self.script from mayavi.sources.vtk_data_source import VTKDataSource from tvtk.api import tvtk ############################################################ # Create a new scene and set up the visualization. s = self.new_scene() # Read a VTK (old style) data file. r = tvtk.StructuredPointsReader() r.file_name = get_example_data('heart.vtk') r.update() d = VTKDataSource(data=r.output) script.add_source(d) def test(self): self.main() def do(self): # Setup the source. self.make_data() from mayavi.modules.outline import Outline from mayavi.modules.iso_surface import IsoSurface from mayavi.modules.contour_grid_plane \ import ContourGridPlane from mayavi.modules.scalar_cut_plane import ScalarCutPlane script = self.script s = script.engine.current_scene # Create an outline for the data. o = Outline() script.add_module(o) # Create one ContourGridPlane normal to the 'x' axis. cgp = ContourGridPlane() script.add_module(cgp) # Set the position to the middle of the data. cgp.grid_plane.position = 15 # Another with filled contours normal to 'y' axis. cgp = ContourGridPlane() cgp.contour.filled_contours = True # Set the axis and position to the middle of the data. cgp.grid_plane.axis = 'y' cgp.grid_plane.position = 15 script.add_module(cgp) # An isosurface module. iso = IsoSurface(compute_normals=True) script.add_module(iso) iso.contour.contours = [200.0] # An interactive scalar cut plane. cp = ScalarCutPlane() script.add_module(cp) ip = cp.implicit_plane ip.normal = 0,0,1 ip.origin = 0,0,5 ip.widget.enabled = False # Set the scene to an isometric view. s.scene.isometric_view() self.check() ############################################################ # Test if saving a visualization and restoring it works. # Save visualization. f = BytesIO() f.name = abspath('test.mv2') # We simulate a file. script.save_visualization(f) f.seek(0) # So we can read this saved data. # Remove existing scene. engine = script.engine engine.close_scene(s) # Load visualization script.load_visualization(f) s = engine.current_scene self.check() ############################################################ # Test if the MayaVi2 visualization can be deep-copied. # Pop the source object. source = s.children.pop() # Add it back to see if that works without error. s.children.append(source) # Now set the enabled status of the widget, this is impossible # to get correctly. cp = source.children[0].children[-1] cp.implicit_plane.widget.enabled = False self.check() # Now deepcopy the source and replace the existing one with # the copy. This basically simulates cutting/copying the # object from the UI via the right-click menu on the tree # view, and pasting the copy back. source1 = copy.deepcopy(source) s.children[0] = source1 cp = source1.children[0].children[-1] cp.implicit_plane.widget.enabled = False self.check() # If we have come this far, we are golden! if __name__ == "__main__": t = TestVTKDataSource() t.test() mayavi-4.5.0/integrationtests/mayavi/test_vtk_xml_reader.py0000644000076500000240000000176612747716313024752 0ustar prabhustaff00000000000000"""Simple test to check the VTK XML reader -- this is basically a copy of test_contour.py with just the reader changed. """ # Author: Prabhu Ramachandran # Copyright (c) 2005-2008, Enthought, Inc. # License: BSD Style. # Standard library imports. from os.path import abspath import copy # Local imports. from common import TestCase, get_example_data from test_vtk_data_source import TestVTKDataSource class TestVTKXMLReader(TestVTKDataSource): def make_data(self): script = self.script from mayavi.sources.vtk_xml_file_reader import VTKXMLFileReader ############################################################ # Create a new scene and set up the visualization. s = self.new_scene() # Read a VTK XML data file. r = VTKXMLFileReader() r.initialize(get_example_data('heart.vti')) script.add_source(r) def test(self): self.main() if __name__ == "__main__": t = TestVTKXMLReader() t.test() mayavi-4.5.0/LICENSE.txt0000644000076500000240000000312012747716313015244 0ustar prabhustaff00000000000000This software is OSI Certified Open Source Software. OSI Certified is a certification mark of the Open Source Initiative. Copyright (c) 2006, Enthought, Inc. 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 Enthought, Inc. nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. mayavi-4.5.0/LICENSE_COLORBREWER.txt0000644000076500000240000000363212747716313017121 0ustar prabhustaff00000000000000Apache-Style Software License for ColorBrewer Color Schemes Version 1.1 Copyright (c) 2002 Cynthia Brewer, Mark Harrower, and The Pennsylvania State University. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions as source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. The end-user documentation included with the redistribution, if any, must include the following acknowledgment: "This product includes color specifications and designs developed by Cynthia Brewer (http://colorbrewer.org/)." Alternately, this acknowledgment may appear in the software itself, if and wherever such third-party acknowledgments normally appear. 3. The name "ColorBrewer" must not be used to endorse or promote products derived from this software without prior written permission. For written permission, please contact Cynthia Brewer at cbrewer@psu.edu. 4. Products derived from this software may not be called "ColorBrewer", nor may "ColorBrewer" appear in their name, without prior written permission of Cynthia Brewer. THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED 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 CYNTHIA BREWER, MARK HARROWER, OR THE PENNSYLVANIA STATE UNIVERSITY 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. mayavi-4.5.0/LICENSE_YORICK.txt0000644000076500000240000000445012747716313016333 0ustar prabhustaff00000000000000BSD-style license for gist/yorick colormaps. Copyright: Copyright (c) 1996. The Regents of the University of California. All rights reserved. Permission to use, copy, modify, and distribute this software for any purpose without fee is hereby granted, provided that this entire notice is included in all copies of any software which is or includes a copy or modification of this software and in all copies of the supporting documentation for such software. This work was produced at the University of California, Lawrence Livermore National Laboratory under contract no. W-7405-ENG-48 between the U.S. Department of Energy and The Regents of the University of California for the operation of UC LLNL. DISCLAIMER This software was prepared as an account of work sponsored by an agency of the United States Government. Neither the United States Government nor the University of California nor any of their employees, makes any warranty, express or implied, or assumes any liability or responsibility for the accuracy, completeness, or usefulness of any information, apparatus, product, or process disclosed, or represents that its use would not infringe privately-owned rights. Reference herein to any specific commercial products, process, or service by trade name, trademark, manufacturer, or otherwise, does not necessarily constitute or imply its endorsement, recommendation, or favoring by the United States Government or the University of California. The views and opinions of authors expressed herein do not necessarily state or reflect those of the United States Government or the University of California, and shall not be used for advertising or product endorsement purposes. AUTHOR David H. Munro wrote Yorick and Gist. Berkeley Yacc (byacc) generated the Yorick parser. The routines in Math are from LAPACK and FFTPACK; MathC contains C translations by David H. Munro. The algorithms for Yorick's random number generator and several special functions in Yorick/include were taken from Numerical Recipes by Press, et. al., although the Yorick implementations are unrelated to those in Numerical Recipes. A small amount of code in Gist was adapted from the X11R4 release, copyright M.I.T. -- the complete copyright notice may be found in the (unused) file Gist/host.c. mayavi-4.5.0/MANIFEST.in0000644000076500000240000000170612747716313015167 0ustar prabhustaff00000000000000include *.rst *.txt *.py recursive-include artwork *.* recursive-include docs *.* Makefile* recursive-include examples *.py *.txt *.jpg *.ipynb recursive-include examples/mayavi/data *.* recursive-include integrationtests *.py *.txt *.png recursive-include mayavi *.txt *.ini recursive-include mayavi/core/images *.* recursive-include mayavi/core/ui/images *.* recursive-include mayavi/core/lut *.gif *.pkl *.txt recursive-include mayavi/images *.* recursive-include mayavi/preferences/images *.* recursive-include mayavi/scripts *.py mayavi2 recursive-include mayavi/tests/csv_files *.* csv_2_py recursive-include mayavi/tests/data *.* recursive-include mayavi/tools/data_wizards *.csv recursive-include mayavi/tools/static *.css *.js recursive-include scripts *.py recursive-include tvtk/pipeline/images *.* recursive-include tvtk/plugins/scene *.ini recursive-include tvtk/pyface/images *.* recursive-include tvtk/tools/images *.* prune docs/build prune docs/pdf mayavi-4.5.0/mayavi/0000755000076500000240000000000012747722127014713 5ustar prabhustaff00000000000000mayavi-4.5.0/mayavi/__init__.py0000644000076500000240000000177012747716326017035 0ustar prabhustaff00000000000000# Author: Prabhu Ramachandran, Gael Varoquaux # Copyright (c) 2004-2016, Enthought, Inc. # License: BSD Style. """ A tool for easy and interactive visualization of data. Part of the Mayavi project of the Enthought Tool Suite. """ __version__ = '4.5.0' __requires__ = [ 'apptools', 'traits', 'traitsui', ] __extras_require__ = { 'app': [ 'envisage', ], } # Try forcing the use of wx 2.8 before any other import. import sys if not 'wx' in sys.modules: try: # Try forcing the use of wx 2.8 from traits.etsconfig.api import ETSConfig if ETSConfig.toolkit in ('wx', ''): import wxversion wxversion.ensureMinimal('2.8') except ImportError: """ wxversion not installed """ def _jupyter_nbextension_paths(): return [dict( section="notebook", # the path is relative to the `mayavi` directory src="tools/static", # directory in the `nbextension/` namespace dest="mayavi", )] mayavi-4.5.0/mayavi/__version__.py0000644000076500000240000000031512747716313017545 0ustar prabhustaff00000000000000"""Version information for MayaVi2. """ # Author: Prabhu Ramachandran # Copyright (c) 2006, Enthought, Inc. # License: BSD Style. from mayavi.version import version as __version__ mayavi-4.5.0/mayavi/action/0000755000076500000240000000000012747722127016170 5ustar prabhustaff00000000000000mayavi-4.5.0/mayavi/action/__init__.py0000644000076500000240000000013212747716313020275 0ustar prabhustaff00000000000000# Author: Prabhu Ramachandran # Copyright (c) 2005, Enthought, Inc. # License: BSD Style. mayavi-4.5.0/mayavi/action/filters.py0000644000076500000240000000455212747716313020220 0ustar prabhustaff00000000000000"""Actions to start various filters. """ # Author: Prabhu Ramachandran # Copyright (c) 2005-2008, Enthought, Inc. # License: BSD Style. from pyface.action.api import Action from traits.api import Instance from mayavi.plugins.script import get_imayavi from mayavi.core.registry import registry from mayavi.core.metadata import Metadata from mayavi.core.pipeline_base import PipelineBase def new_class(name, bases, dict_): try: import new return new.classobj(name, bases, dict_) except ImportError: return type(name, bases, dict_) ###################################################################### # `FilterAction` class. ###################################################################### class FilterAction(Action): # The Metadata associated with this particular action. metadata = Instance(Metadata) mayavi = Instance('mayavi.plugins.script.Script') # We disable the actions by default since these are dynamically # enabled depending on the current selection or object. enabled = False def __init__(self, **traits): super(FilterAction, self).__init__(**traits) self.mayavi.engine.on_trait_change(self._update_enabled, ['current_selection', 'current_object']) ########################################################################### # 'Action' interface. ########################################################################### def perform(self, event): """ Performs the action. """ callable = self.metadata.get_callable() obj = callable() mv = self.mayavi mv.add_filter(obj) mv.engine.current_selection = obj def _update_enabled(self, obj): if isinstance(obj, PipelineBase): e = obj.menu_helper.check_active(self.metadata) self.enabled = e else: self.enabled = False def _mayavi_default(self): return get_imayavi(self.window) ###################################################################### # Creating the filter actions automatically. for filter in registry.filters: d = {'tooltip': filter.tooltip, 'description': filter.desc, 'metadata': filter} action = new_class(filter.id, (FilterAction,), d) globals()[filter.id] = action mayavi-4.5.0/mayavi/action/help.py0000644000076500000240000000654012747716313017477 0ustar prabhustaff00000000000000"""Actions for the help menu. """ # Authors: Gael Varoquaux # Prabhu Ramachandran # Copyright (c) 2007-2008, Enthought, Inc. # License: BSD Style. # Standard library imports. from os import path import os import sys from os.path import join, dirname # Enthought library imports. from pyface.action.api import Action from traitsui.api import auto_close_message # Local imports import mayavi.api from mayavi.core.common import error from mayavi.preferences.api import preference_manager # To find the html documentation directory, first look under the # standard place. If that directory doesn't exist, assume you # are running from the source. local_dir = dirname(mayavi.api.__file__) HTML_DIR = join(local_dir, 'html') if not path.exists(HTML_DIR): HTML_DIR = join(dirname(dirname(local_dir)), 'build', 'docs', 'html', 'mayavi') if not path.exists(HTML_DIR): HTML_DIR = None def browser_open(url): if sys.platform == 'darwin': os.system('open %s &' % url) else: import webbrowser if webbrowser._iscommand('firefox') and \ preference_manager.root.open_help_in_light_browser: # Firefox is installed, let's use it, we know how to make it # chromeless. firefox = webbrowser.get('firefox') firefox._invoke(['-chrome', url], remote=False, autoraise=True) else: webbrowser.open(url, autoraise=1) def open_help_index(): """ Open the mayavi user manual index in a browser. """ # If the HTML_DIR was found, bring up the documentation in a # web browser. Otherwise, bring up an error message. if HTML_DIR: auto_close_message("Opening help in web browser...") browser_open(join(HTML_DIR, 'index.html')) else: error("Could not find the user guide in your installation " \ "or the source tree.") def open_tvtk_docs(): """ Open the TVTK class browser. """ from tvtk.tools.tvtk_doc import TVTKClassChooser TVTKClassChooser().edit_traits() ###################################################################### # `HelpIndex` class. ###################################################################### class HelpIndex(Action): """ An action that pop up the help in a browser. """ tooltip = "The Mayavi2 user guide" description = "The Mayavi2 user guide" ########################################################################### # 'Action' interface. ########################################################################### def perform(self, event): """ Performs the action. """ open_help_index() ###################################################################### # `TVTKClassBrowser` class. ###################################################################### class TVTKClassBrowser(Action): """ An action that opens the tvtk interactive class browser. """ tooltip = "The TVTK interactive class browser" description = "The TVTK interactive class browser" ########################################################################### # 'Action' interface. ########################################################################### def perform(self, event): """ Performs the action. """ open_tvtk_docs() mayavi-4.5.0/mayavi/action/modules.py0000644000076500000240000000473512747716313020223 0ustar prabhustaff00000000000000"""Actions to start various modules. """ # Author: Prabhu Ramachandran # Copyright (c) 2005-2015, Enthought, Inc. # License: BSD Style. # Local imports. from mayavi.core.registry import registry from mayavi.core.metadata import ModuleMetadata from mayavi.core.pipeline_info import PipelineInfo from mayavi.action.filters import FilterAction, new_class ###################################################################### # `ModuleAction` class. ###################################################################### class ModuleAction(FilterAction): ########################################################################### # 'Action' interface. ########################################################################### def perform(self, event): """ Performs the action. """ callable = self.metadata.get_callable() obj = callable() mv = self.mayavi mv.add_module(obj) mv.engine.current_selection = obj ###################################################################### # `AddModuleManager` class. ###################################################################### class AddModuleManager(ModuleAction): """ An action that adds a ModuleManager to the tree. """ tooltip = "Add a ModuleManager to the current source/filter" description = "Add a ModuleManager to the current source/filter" metadata = ModuleMetadata(id="AddModuleManager", class_name="mayavi.core.module_manager.ModuleManager", menu_name="&Add ModuleManager", tooltip="Add a ModuleManager to the current source/filter", description="Add a ModuleManager to the current source/filter", input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']) ) def perform(self, event): """ Performs the action. """ from mayavi.core.module_manager import ModuleManager mm = ModuleManager() mv = self.mayavi mv.add_module(mm) mv.engine.current_selection = mm ###################################################################### # Creating the module actions automatically. for module in registry.modules: d = {'tooltip': module.tooltip, 'description': module.desc, 'metadata': module} action = new_class(module.id, (ModuleAction,), d) globals()[module.id] = action mayavi-4.5.0/mayavi/action/save_load.py0000644000076500000240000001073112747716313020501 0ustar prabhustaff00000000000000"""Actions to save and load a MayaVi2 visualization file. """ # Author: Prabhu Ramachandran # Copyright (c) 2005-2015, Enthought, Inc. # License: BSD Style. # Standard library imports. import sys from os.path import isfile # Enthought library imports. from pyface.api import FileDialog, OK from pyface.action.api import Action # Local imports from mayavi.plugins.script import get_imayavi from mayavi.core.common import error, exception ###################################################################### # `SaveVisualization` class. ###################################################################### class SaveVisualization(Action): """ An action that saves the current visualization. """ tooltip = "Save current visualization" description = "Save current visualization to a MayaVi2 file" ########################################################################### # 'Action' interface. ########################################################################### def perform(self, event): """ Performs the action. """ wildcard = 'MayaVi2 files (*.mv2)|*.mv2|' + FileDialog.WILDCARD_ALL dialog = FileDialog(parent=self.window.control, title='Save MayaVi2 file', action='save as', wildcard=wildcard ) if dialog.open() == OK: mv = get_imayavi(self.window) mv.save_visualization(dialog.path) ###################################################################### # `LoadVisualization` class. ###################################################################### class LoadVisualization(Action): """ An action that loads a visualization from file. """ tooltip = "Load saved visualization" description = "Load saved visualization from a MayaVi2 file" ########################################################################### # 'Action' interface. ########################################################################### def perform(self, event): """ Performs the action. """ wildcard = 'MayaVi2 files (*.mv2)|*.mv2|' + FileDialog.WILDCARD_ALL parent = self.window.control dialog = FileDialog(parent=parent, title='Open MayaVi2 file', action='open', wildcard=wildcard ) if dialog.open() == OK: if not isfile(dialog.path): error("File '%s' does not exist"%dialog.path, parent) return mv = get_imayavi(self.window) mv.load_visualization(dialog.path) ###################################################################### # `RunScript` class. ###################################################################### class RunScript(Action): """ An action that runs a mayavi script. WARNING: this can be dangerous since the file runs execfile! """ tooltip = "Execute a Python script (typically a Mayavi script)" description = "Execute a Python script (typically a Mayavi script)" ########################################################################### # 'Action' interface. ########################################################################### def perform(self, event): """ Performs the action. """ wildcard = 'Python files (*.py)|*.py' parent = self.window.control dialog = FileDialog(parent=parent, title='Open Python file', action='open', wildcard=wildcard ) if dialog.open() == OK: if not isfile(dialog.path): error("File '%s' does not exist"%dialog.path, parent) return # Get the globals. # The following code is taken from scripts/mayavi2.py. g = sys.modules['__main__'].__dict__ if 'mayavi' not in g: mv = get_imayavi(self.window) g['mayavi'] = mv g['engine'] = mv.engine g['__file__'] = dialog.path # Do execfile try: # If we don't pass globals twice we get NameErrors and nope, # using exec open(script_name).read() does not fix it. exec(compile( open(dialog.path).read(), dialog.path, 'exec'), g, g ) except Exception as msg: exception(str(msg)) mayavi-4.5.0/mayavi/action/sources.py0000644000076500000240000000721512747716313020232 0ustar prabhustaff00000000000000"""An action to open various source files. """ # Author: Prabhu Ramachandran # Copyright (c) 2005-2008, Enthought, Inc. # License: BSD Style. # Standard library imports. from os.path import isfile # Enthought library imports. from traits.api import Instance, Str from pyface.api import FileDialog, OK from pyface.action.api import Action # Local imports from mayavi.plugins.script import get_imayavi from mayavi.core.common import error from mayavi.core.metadata import Metadata from mayavi.core.registry import registry from .filters import new_class ###################################################################### # Utility functions ###################################################################### def get_scene(mayavi): """Given a mayavi script instance, get the current scene. If none is available create a new one. """ s = mayavi.engine.current_scene if s is None: mayavi.engine.new_scene() s = mayavi.engine.current_scene return s ###################################################################### # `OpenFile` class. ###################################################################### class OpenFile(Action): """ An action that opens a data file depending on the supported extensions. """ tooltip = "Open a supported data file" description = "Open any supported data file" path = Str("MenuBar/File/LoadDataMenu") ########################################################################### # 'Action' interface. ########################################################################### def perform(self, event): """ Performs the action. """ mv = get_imayavi(self.window) s = get_scene(mv) if s is None: return wildcard = 'All files (*.*)|*.*' for src in registry.sources: if len(src.extensions) > 0: if wildcard.endswith('|') or \ src.wildcard.startswith('|'): wildcard += src.wildcard else: wildcard += '|' + src.wildcard parent = self.window.control dialog = FileDialog(parent=parent, title='Open supported data file', action='open', wildcard=wildcard ) if dialog.open() == OK: if not isfile(dialog.path): error("File '%s' does not exist!"%dialog.path, parent) return # FIXME: Ask for user input if a filetype is unknown and # choose appropriate reader. src = mv.open(dialog.path) if src is not None: mv.engine.current_selection = src ###################################################################### # `SourceAction` class. ###################################################################### class SourceAction(Action): # The Metadata associated with this particular action. metadata = Instance(Metadata) def perform(self, event): mv = get_imayavi(self.window) s = get_scene(mv) if s is None: return callable = self.metadata.get_callable() obj = callable() mv.add_source(obj) mv.engine.current_selection = obj ###################################################################### # Creating the source actions automatically. for src in registry.sources: if len(src.extensions) == 0: d = {'tooltip': src.tooltip, 'description': src.desc, 'metadata': src} action = new_class(src.id, (SourceAction,), d) globals()[src.id] = action mayavi-4.5.0/mayavi/api.py0000644000076500000240000000031612747716313016036 0ustar prabhustaff00000000000000from mayavi.version import version, version as __version__ from mayavi.core.engine import Engine from mayavi.core.off_screen_engine import OffScreenEngine from mayavi.tests.runtests import m2_tests as test mayavi-4.5.0/mayavi/components/0000755000076500000240000000000012747722127017100 5ustar prabhustaff00000000000000mayavi-4.5.0/mayavi/components/__init__.py0000644000076500000240000000013212747716313021205 0ustar prabhustaff00000000000000# Author: Prabhu Ramachandran # Copyright (c) 2005, Enthought, Inc. # License: BSD Style. mayavi-4.5.0/mayavi/components/actor.py0000644000076500000240000002215512747716313020567 0ustar prabhustaff00000000000000"""A simple actor component. """ # Author: Prabhu Ramachandran # Copyright (c) 2005-2016, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import Instance, Bool, Enum from tvtk.api import tvtk from traits.api import DelegatesTo from tvtk.common import is_old_pipeline # Local imports. from mayavi.core.component import Component from mayavi.core.source import Source ###################################################################### # `Actor` class. ###################################################################### class Actor(Component): # The version of this class. Used for persistence. __version__ = 0 # The mapper. mapper = Instance(tvtk.Mapper, record=True) # The actor. actor = Instance(tvtk.Actor, record=True) # The actor's property. property = Instance(tvtk.Property, record=True) # FIXME: None of the texture stuff is picklable. This will NOT be # supported till the pickling infrastructure is cleaned up and # fixed. # If texturing is enabled for the actor or not enable_texture = Bool(False, desc='if texturing is enabled') # The source of the texture's image texture_source_object = Instance(Source) # The actors texture texture = Instance(tvtk.Texture, record=True) # The texture coord generation mode. tcoord_generator_mode = Enum('none', 'cylinder', 'sphere', 'plane', desc='the mode for texture coord generation') # Texture coord generator. tcoord_generator = Instance(tvtk.Object, allow_none=True) ###################################################################### # `object` interface ###################################################################### def __get_pure_state__(self): d = super(Actor, self).__get_pure_state__() for attr in ('texture', 'texture_source_object', 'enable_texture', 'tcoord_generator_mode', 'tcoord_generator'): d.pop(attr,None) return d ###################################################################### # `Component` interface ###################################################################### def setup_pipeline(self): """Override this method so that it *creates* its tvtk pipeline. This method is invoked when the object is initialized via `__init__`. Note that at the time this method is called, the tvtk data pipeline will *not* yet be setup. So upstream data will not be available. The idea is that you simply create the basic objects and setup those parts of the pipeline not dependent on upstream sources and filters. """ self.mapper = tvtk.PolyDataMapper(use_lookup_table_scalar_range=1) self.actor = tvtk.Actor() self.property = self.actor.property self.texture = tvtk.Texture() def update_pipeline(self): """Override this method so that it *updates* the tvtk pipeline when data upstream is known to have changed. This method is invoked (automatically) when the input fires a `pipeline_changed` event. """ if (len(self.inputs) == 0) or \ (len(self.inputs[0].outputs) == 0): return self.configure_input(self.mapper, self.inputs[0].outputs[0]) self._tcoord_generator_mode_changed(self.tcoord_generator_mode) self.render() def update_data(self): """Override this method to do what is necessary when upstream data changes. This method is invoked (automatically) when any of the inputs sends a `data_changed` event. """ # Invoke render to update any changes. if not is_old_pipeline(): from mayavi.modules.outline import Outline from mayavi.components.glyph import Glyph #FIXME: A bad hack, but without these checks results in seg fault input = self.inputs[0] if isinstance(input, Outline) or isinstance(input, Glyph): self.mapper.update(0) else: self.mapper.update() self.render() ###################################################################### # `Actor` interface ###################################################################### def set_lut(self, lut): """Set the Lookup table to use.""" self.mapper.lookup_table = lut # A hack to avoid a problem with the VRML output that seems to # ignore the use_lookup_table_scalar_range setting # on the mapping self.mapper.scalar_range = lut.table_range ###################################################################### # Non-public interface. ###################################################################### def _setup_handlers(self, old, new): if old is not None: old.on_trait_change(self.render, remove=True) new.on_trait_change(self.render) def _mapper_changed(self, old, new): # Setup the handlers. self._setup_handlers(old, new) # Setup the LUT. if old is not None: self.set_lut(old.lookup_table) # Setup the inputs to the mapper. if (len(self.inputs) > 0) and (len(self.inputs[0].outputs) > 0): self.configure_connection(new, self.inputs[0]) # Setup the actor's mapper. actor = self.actor if actor is not None: actor.mapper = new self.render() def _actor_changed(self, old, new): # Setup the handlers. self._setup_handlers(old, new) # Set the mapper. mapper = self.mapper if mapper is not None: new.mapper = mapper # Set the property. prop = self.property if prop is not None: new.property = prop # Setup the `actors` trait. self.actors = [new] def _property_changed(self, old, new): # Setup the handlers. self._setup_handlers(old, new) # Setup the actor. actor = self.actor if new is not actor.property: actor.property = new def _foreground_changed_for_scene(self, old, new): # Change the default color for the actor. self.property.color = new self.render() def _scene_changed(self, old, new): super(Actor, self)._scene_changed(old, new) self._foreground_changed_for_scene(None, new.foreground) def _enable_texture_changed(self, value): if self.texture_source_object is None : self.actor.texture = None return if value: self.actor.texture = self.texture else: self.actor.texture = None def _can_object_give_image_data(self, source): if source is None: return False if not isinstance(source, Source): return False if source.get_output_dataset().is_a('vtkImageData'): return True return False def _change_texture_input(self): if self._can_object_give_image_data(self.texture_source_object): self.configure_connection( self.texture, self.texture_source_object ) self.actor.texture = self.texture else: self.texture_source_object = None def _texture_source_object_changed(self,old,new): if old is not None : old.on_trait_change(self._change_texture_input, 'pipeline_changed', remove=True) if new is not None : new.on_trait_change(self._change_texture_input, 'pipeline_changed' ) if new is not None: self._change_texture_input() else: self.actor.texture = None self.texture.input = None self.texture.input_connection = None def _texture_changed(self,value): # Setup the actor's texture. actor = self.actor if actor is not None and (value.input is not None or value.input_connection is not None): actor.texture = value self.texture.on_trait_change(self.render) self.render() def _tcoord_generator_mode_changed(self, value): inp = self.inputs if (len(inp) == 0) or \ (len(inp[0].outputs) == 0): return old_tg = self.tcoord_generator if old_tg is not None: old_tg.on_trait_change(self.render, remove=True) if value == 'none': self.tcoord_generator = None self.configure_connection(self.mapper, inp[0]) else: tg_dict = {'cylinder': tvtk.TextureMapToCylinder, 'sphere': tvtk.TextureMapToSphere, 'plane': tvtk.TextureMapToPlane} tg = tg_dict[value]() self.tcoord_generator = tg self.configure_connection(tg, inp[0]) self.configure_connection(self.mapper, tg) tg = self.tcoord_generator if tg is not None: tg.on_trait_change(self.render) self.render() mayavi-4.5.0/mayavi/components/actor2d.py0000644000076500000240000001221712747716313021013 0ustar prabhustaff00000000000000"""A simple actor component. """ # Author: Prabhu Ramachandran # Copyright (c) 2005, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import Instance from traitsui.api import View, Group, Item, InstanceEditor from tvtk.api import tvtk # Local imports. from mayavi.core.component import Component ###################################################################### # `Actor2D` class. ###################################################################### class Actor2D(Component): # The version of this class. Used for persistence. __version__ = 0 # The mapper. mapper = Instance(tvtk.AbstractMapper, record=True) # The actor. actor = Instance(tvtk.Prop, record=True) # The actor's property. property = Instance(tvtk.Property2D, record=True) ######################################## # View related traits. # The Actor's view group. _actor_group = Group(Item(name='visibility'), Item(name='height'), Item(name='width'), show_border=True, label='Actor') # The View for this object. view = View(Group(Item(name='actor', style='custom', editor=InstanceEditor(view=View(_actor_group))), show_labels=False, label='Actor' ), Group(Item(name='mapper', style='custom', resizable=True), show_labels=False, label='Mapper'), Group(Item(name='property', style='custom', resizable=True), show_labels=False, label='Property'), resizable=True, ) ###################################################################### # `Component` interface ###################################################################### def setup_pipeline(self): """Override this method so that it *creates* its tvtk pipeline. This method is invoked when the object is initialized via `__init__`. Note that at the time this method is called, the tvtk data pipeline will *not* yet be setup. So upstream data will not be available. The idea is that you simply create the basic objects and setup those parts of the pipeline not dependent on upstream sources and filters. """ if self.mapper is None: self.mapper = tvtk.TextMapper() self.actor = tvtk.Actor2D() self.property = self.actor.property def update_pipeline(self): """Override this method so that it *updates* the tvtk pipeline when data upstream is known to have changed. This method is invoked (automatically) when the input fires a `pipeline_changed` event. """ if (len(self.inputs) == 0) or \ (len(self.inputs[0].outputs) == 0): return self.configure_connection(self.mapper, self.inputs[0]) self.render() def update_data(self): """Override this method to do what is necessary when upstream data changes. This method is invoked (automatically) when any of the inputs sends a `data_changed` event. """ # Invoke render to update any changes. self.render() ###################################################################### # Non-public interface. ###################################################################### def _setup_handlers(self, old, new): if old is not None: old.on_trait_change(self.render, remove=True) new.on_trait_change(self.render) def _mapper_changed(self, old, new): # Setup the handlers. self._setup_handlers(old, new) # Setup the inputs to the mapper. if (len(self.inputs) > 0) and (len(self.inputs[0].outputs) > 0): self.configure_connection(new, self.inputs[0]) # Setup the actor's mapper. actor = self.actor if actor is not None: actor.mapper = new self.render() def _actor_changed(self, old, new): # Setup the handlers. self._setup_handlers(old, new) # Set the mapper. mapper = self.mapper if mapper is not None: new.mapper = mapper # Set the property. prop = self.property if prop is not None: new.property = prop # Setup the `actors` trait. self.actors = [new] def _property_changed(self, old, new): # Setup the handlers. self._setup_handlers(old, new) # Setup the actor. actor = self.actor if new is not actor.property: actor.property = new def _foreground_changed_for_scene(self, old, new): # Change the default color for the actor. self.property.color = new self.render() def _scene_changed(self, old, new): super(Actor2D, self)._scene_changed(old, new) self._foreground_changed_for_scene(None, new.foreground) mayavi-4.5.0/mayavi/components/common.py0000644000076500000240000000316712747716313020751 0ustar prabhustaff00000000000000"""Common code used by different components. """ # Author: Prabhu Ramachandran # Copyright (c) 2005-2016, Enthought, Inc. # License: BSD Style. # Enthought library imports. from tvtk.api import tvtk # Local imports. from tvtk.common import configure_input from mayavi.core.component import Component from mayavi.core.common import error def get_module_source(obj): """Given an object (either a component or a module), return the ModuleManager managing the module that contains this component. """ o = obj while isinstance(o, Component): o = o.inputs[0] return o def convert_to_poly_data(obj): """Given a VTK dataset object, this returns the data as PolyData. This is primarily used to convert the data suitably for filters that only work for PolyData. """ if obj.is_a('vtkDataSet'): data = obj else: # FIXME data = obj.output if obj.is_a('vtkPolyData') or data.is_a('vtkPolyData'): return obj conv = {'vtkStructuredPoints': tvtk.ImageDataGeometryFilter, 'vtkImageData': tvtk.ImageDataGeometryFilter, 'vtkRectilinearGrid': tvtk.RectilinearGridGeometryFilter, 'vtkStructuredGrid': tvtk.StructuredGridGeometryFilter, 'vtkUnstructuredGrid':tvtk.GeometryFilter} fil = None for name, fil_class in conv.items(): if data.is_a(name): fil = fil_class() break if fil is not None: configure_input(fil, obj) fil.update() return fil else: error('Given object is not a VTK dataset: %s'%data.__class__.__name__) mayavi-4.5.0/mayavi/components/contour.py0000644000076500000240000003123412747716313021146 0ustar prabhustaff00000000000000"""A contour component. This component wraps around the tvtk.ContourFilter and provides convenient options to either automatically generate a specified number of contours between a given minimum and maximum value or explicitly specify the contours. This component may be used for any input data. The component also provides a convenient option to create "filled contours". """ # Author: Prabhu Ramachandran # Copyright (c) 2005-2016, Enthought, Inc. # License: BSD Style. # Standard library imports. import numpy # Enthought library imports. from traits.api import Instance, List, Tuple, Bool, Range, \ Float, Property from tvtk.api import tvtk # Local imports. from mayavi.core.component import Component from mayavi.core.common import error from mayavi.components.common \ import get_module_source, convert_to_poly_data ###################################################################### # `Contour` class. ###################################################################### class Contour(Component): # The version of this class. Used for persistence. __version__ = 0 # The contour filter being currently used. contour_filter = Property # Specify if filled contours are generated. filled_contours = Bool(False, desc='if filled contours are '\ 'to be generated') # Specify if contours are generated explicitly or automatically. auto_contours = Bool(False, desc='if contours are '\ 'given explicitly or automatically computed') # Number of contours, used when `auto_contours` are chosen. number_of_contours = Range(1, 100000, enter_set=True, auto_set=False, desc='number of contours to generate') # Minimum contour, this is the starting value when `auto_contours` # is turned on. minimum_contour = Range(value=0.0, low='_data_min', high='_data_max', enter_set=True, auto_set=False, desc='the starting contour value') # Maximum contour, this is the last contour when `auto_contours` # is turned on. maximum_contour = Range(value=0.0, low='_data_min', high='_data_max', enter_set=True, auto_set=False, desc='the ending contour value') # The explicit contours to create. These specify the contours # explicitly and are used when `auto_contours` is turned off. The # traits of the items in the list are dynamically generated based # on input data. contours = List(Range(value='_default_contour', low='_data_min', high='_data_max', enter_set=True, auto_set=False, ), rows=3, desc='explicitly the contours to be generated') # Specify if the filled contour option should be shown in the view # or not. This is useful in situations like the iso_surface # module where it does not make sense to use filled contours at # all. show_filled_contours = Bool(True) # Specify if the lower and upper bound for the data is to be # automatically reset or not. auto_update_range = Bool(True, desc='if the contour range is updated automatically') ######################################## # The component's view #view = View(Group(Item(name='filled_contours', # defined_when='show_filled_contours'), # Item(name='auto_contours'), '_', # Item(name='contours', # style='custom', # visible_when='not auto_contours'), # Item(name='number_of_contours', # visible_when='auto_contours'), # Item(name='minimum_contour', # visible_when='auto_contours'), # Item(name='maximum_contour', # visible_when='auto_contours'), # Item(name='auto_update_range'), # Item(name='_data_min', # label='Data minimum', # visible_when='not auto_update_range'), # Item(name='_data_max', # label='Data maximum', # visible_when='not auto_update_range'), # ) # ) ######################################## # Private traits. _current_range = Tuple # The minimum value of the input data. Set to a very large negative value # to avoid errors prior to the object being added to the mayavi # tree. _data_min = Float(-1e20, enter_set=True, auto_set=False) # The maximum value of the input data. Set to a very large value # to avoid errors prior to the object being added to the mayavi # tree. _data_max = Float(1e20, enter_set=True, auto_set=False) # The default value of the contour to add, this property is computed # from the _data_min and _data_max traits and used when the user # adds a contour manually from the UI when auto_contours are turned # off. _default_contour = Property(Float) # The contour filter. _cont_filt = Instance(tvtk.ContourFilter, args=()) # The filled contour filter. This filter generates the filled contours. _fill_cont_filt = Instance(tvtk.BandedPolyDataContourFilter, args=(), kw={'clipping': 1, 'scalar_mode':'value'}) ###################################################################### # `object` interface ###################################################################### def __get_pure_state__(self): d = super(Contour, self).__get_pure_state__() # These traits are dynamically created. for name in ('_data_min', '_data_max', '_default_contour'): d.pop(name, None) return d ###################################################################### # `Component` interface ###################################################################### def update_pipeline(self): """Override this method so that it *updates* the tvtk pipeline when data upstream is known to have changed. This method is invoked (automatically) when the input fires a `pipeline_changed` event. """ if not self._has_input(): return cf = self._set_contour_input() first = False if len(self._current_range) == 0: first = True self._update_ranges() # If this is the first time, create a default contour if first: cr = self._current_range self.contours = [(cr[0] + cr[1])/2] self.minimum_contour = cr[0] self.maximum_contour = cr[1] self.outputs = [cf] def update_data(self): """Override this method to do what is necessary when upstream data changes. This method is invoked (automatically) when any of the inputs sends a `data_changed` event. """ self._update_ranges() # Propagage the data changed event. self.data_changed = True def has_output_port(self): """ The contour filter has an output port.""" return True def get_output_object(self): """ Returns the output port.""" return self.contour_filter.output_port ###################################################################### # Non-public methods. ###################################################################### def _contours_items_changed(self, list_event): if self.auto_contours or not self._has_input(): return cf = self.contour_filter added, removed, index = (list_event.added, list_event.removed, list_event.index) if len(added) == len(removed): cf.set_value(index, added[0]) cf.update() self.data_changed = True else: self._contours_changed(self.contours) def _contours_changed(self, values): if self.auto_contours or not self._has_input(): return cf = self.contour_filter cf.number_of_contours = len(values) for i, x in enumerate(values): cf.set_value(i, x) cf.update() self.data_changed = True def _update_ranges(self): # Here we get the module's source since the input of this # component may not in general represent the entire object. if not self.auto_update_range: return src = get_module_source(self.inputs[0]) dataset = self._get_source_dataset(src) sc = dataset.point_data.scalars if sc is not None: sc_array = sc.to_array() has_nan = numpy.isnan(sc_array).any() if has_nan: rng = (float(numpy.nanmin(sc_array)), float(numpy.nanmax(sc_array))) else: rng = sc.range else: error('Cannot contour: No scalars in input data!') rng = (0.0, 1.0) if rng != self._current_range: self.set(_data_min=rng[0], _data_max=rng[1], trait_change_notify=False) self._clip_contours(rng) self._current_range = rng def _minimum_contour_changed(self, value): self._do_auto_contours() def _maximum_contour_changed(self, value): self._do_auto_contours() def _number_of_contours_changed(self, value): self._do_auto_contours() def _auto_contours_changed(self, value): if value: self._do_auto_contours() else: self._contours_changed(self.contours) def _auto_update_range_changed(self, value): if value: rng = self._data_min, self._data_max self._current_range = rng self._update_ranges() self.trait_property_changed('_data_min', rng[0], self._data_min) self.trait_property_changed('_data_max', rng[1], self._data_max) def _do_auto_contours(self): if not self._has_input(): return if self.auto_contours: minc, maxc = self.minimum_contour, self.maximum_contour self.contour_filter.generate_values(self.number_of_contours, min(minc, maxc), max(minc, maxc)) self.data_changed = True def _filled_contours_changed(self, val): if not self._has_input(): return cf = self._set_contour_input() # This will trigger a change. self._auto_contours_changed(self.auto_contours) self.outputs = [cf] def _get_contour_filter(self): if self.filled_contours: return self._fill_cont_filt else: return self._cont_filt def _set_contour_input(self): """Sets the input to the appropriate contour filter and returns the currently used contour filter. """ inp = self.inputs[0].outputs[0] cf = self.contour_filter if self.filled_contours: inp = convert_to_poly_data(inp) self.configure_input(cf, inp) else: self.configure_input(cf, inp) cf.update() return cf def _has_input(self): """Returns if this component has a valid input.""" if (len(self.inputs) > 0) and \ (len(self.inputs[0].outputs) > 0): return True else: return False def _clip_contours(self, rng): """Clips the contour related values when the data range has changed. The new range is given as the argument. """ ctr = [] dmin, dmax = rng ctr = [min(max(x, dmin), dmax) for x in self.contours] if self.auto_contours or ctr != self.contours: self.contours = ctr self.set(minimum_contour=self._data_min, maximum_contour=self._data_max, trait_change_notify=False) self._do_auto_contours() def _get__default_contour(self): return (self._data_min + self._data_max)*0.5 def _get_source_dataset(self, src): o = src.outputs[0] if o.is_a('vtkDataSet'): return o elif hasattr(o, 'output'): return o.output mayavi-4.5.0/mayavi/components/custom_grid_plane.py0000644000076500000240000001522312747716313023153 0ustar prabhustaff00000000000000"""A grid plane component. """ # Author: Prabhu Ramachandran # Copyright (c) 2005-2006, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import Instance, Int, Range from traitsui.api import View, Group, Item from tvtk.api import tvtk # Local imports. from mayavi.core.component import Component from mayavi.core.common import error ###################################################################### # `CustomGridPlane` class. ###################################################################### class CustomGridPlane(Component): # The version of this class. Used for persistence. __version__ = 0 # The TVTK object that extracts the grid plane. This is created # dynamically based on the input data type. plane = Instance(tvtk.Object) # Minimum x value. x_min = Range(value=0, low='_x_low', high='_x_high', enter_set=True, auto_set=False, desc='minimum x value of the domain') # Maximum x value. x_max = Range(value=10000, low='_x_low', high='_x_high', enter_set=True, auto_set=False, desc='maximum x value of the domain') # Minimum y value. y_min = Range(value=0, low='_y_low', high='_y_high', enter_set=True, auto_set=False, desc='minimum y value of the domain') # Maximum y value. y_max = Range(value=10000, low='_y_low', high='_y_high', enter_set=True, auto_set=False, desc='maximum y value of the domain') # Minimum z value. z_min = Range(value=0, low='_z_low', high='_z_high', enter_set=True, auto_set=False, desc='minimum z value of the domain') # Maximum z value. z_max = Range(value=10000, low='_z_low', high='_z_high', enter_set=True, auto_set=False, desc='maximum z value of the domain') ######################################## # Private traits. # Determines the lower/upper limit of the axes for the sliders. _x_low = Int(0) _x_high = Int(10000) _y_low = Int(0) _y_high = Int(10000) _z_low = Int(0) _z_high = Int(10000) ######################################## # View related traits. # The View for this object. view = View(Group(Item(name='x_min'), Item(name='x_max'), Item(name='y_min'), Item(name='y_max'), Item(name='z_min'), Item(name='z_max'), ), resizable=True ) ###################################################################### # `object` interface ###################################################################### def __get_pure_state__(self): d = super(CustomGridPlane, self).__get_pure_state__() # These traits are dynamically created. for axis in ('x', 'y', 'z'): for name in ('_min', '_max'): d.pop(axis + name, None) d.pop('_' + axis + '_low', None) d.pop('_' + axis + '_high', None) d.pop('plane', None) return d ###################################################################### # `Component` interface ###################################################################### def update_pipeline(self): """Override this method so that it *updates* the tvtk pipeline when data upstream is known to have changed. This method is invoked (automatically) when the input fires a `pipeline_changed` event. """ if len(self.inputs) == 0: return input = self.inputs[0].get_output_dataset() plane = None if input.is_a('vtkStructuredGrid'): plane = tvtk.StructuredGridGeometryFilter() elif input.is_a('vtkStructuredPoints') or input.is_a('vtkImageData'): plane = tvtk.ImageDataGeometryFilter () elif input.is_a('vtkRectilinearGrid'): plane = tvtk.RectilinearGridGeometryFilter () else: msg = "The GridPlane component does not support the %s dataset."\ %(input.class_name) error(msg) raise TypeError(msg) self.configure_connection(plane, self.inputs[0]) self.plane = plane self._update_limits() self._update_voi() self.outputs = [plane] def update_data(self): """Override this method to do what is necessary when upstream data changes. This method is invoked (automatically) when any of the inputs sends a `data_changed` event. """ self._update_limits() self._update_voi() # Propagate the data_changed event. self.data_changed = True def has_output_port(self): """ The contour filter has an output port.""" return True def get_output_object(self): """ Returns the output port.""" return self.plane.output_port ###################################################################### # Non-public methods. ###################################################################### def _update_limits(self): extents = self.plane.input.whole_extent self._x_low, self._x_high = extents[:2] self._y_low, self._y_high = extents[2:4] self._z_low, self._z_high = extents[4:] def _x_min_changed(self, val): if val > self.x_max: self.x_max = val else: self._update_voi() def _x_max_changed(self, val): if val < self.x_min: self.x_min = val else: self._update_voi() def _y_min_changed(self, val): if val > self.y_max: self.y_max = val else: self._update_voi() def _y_max_changed(self, val): if val < self.y_min: self.y_min = val else: self._update_voi() def _z_min_changed(self, val): if val > self.z_max: self.z_max = val else: self._update_voi() def _z_max_changed(self, val): if val < self.z_min: self.z_min = val else: self._update_voi() def _update_voi(self): if len(self.inputs) == 0: return plane = self.plane extents = (self.x_min, self.x_max, self.y_min, self.y_max, self.z_min, self.z_max) try: plane.set_extent(extents) except AttributeError: plane.extent = tuple(extents) plane.update_whole_extent() plane.update() self.data_changed = True mayavi-4.5.0/mayavi/components/cutter.py0000644000076500000240000000465412747716313020771 0ustar prabhustaff00000000000000"""A simple wrapper for `tvtk.Cutter`. """ # Author: Prabhu Ramachandran # Copyright (c) 2005-2016, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import Instance, Property from traitsui.api import View, Group, Item from tvtk.api import tvtk # Local imports. from mayavi.core.component import Component ###################################################################### # `Cutter` class. ###################################################################### class Cutter(Component): # The version of this class. Used for persistence. __version__ = 0 # The mapper. cutter = Instance(tvtk.Cutter, args=()) # The cut function. This should be a delegate but due to a bug in # traits that does not work. cut_function = Property ######################################## # View related traits. view = View(Group(Item(name='cutter', style='custom', resizable=True), show_labels=False), resizable=True) ###################################################################### # `Component` interface ###################################################################### def update_pipeline(self): """Override this method so that it *updates* the tvtk pipeline when data upstream is known to have changed. This method is invoked (automatically) when the input fires a `pipeline_changed` event. """ if (len(self.inputs) == 0) or (len(self.inputs[0].outputs) == 0): return c = self.cutter self.configure_input(c, self.inputs[0].outputs[0]) c.update() self.outputs = [c] def update_data(self): """Override this method to do what is necessary when upstream data changes. This method is invoked (automatically) when any of the inputs sends a `data_changed` event. """ self.data_changed = True ###################################################################### # `Cutter` interface ###################################################################### def _get_cut_function(self): return self.cutter.cut_function def _set_cut_function(self, val): old = self.cutter.cut_function self.cutter.cut_function = val self.trait_property_changed('cut_function', old, val) mayavi-4.5.0/mayavi/components/glyph.py0000644000076500000240000002557112747716313020607 0ustar prabhustaff00000000000000"""A component that allows one to place colored and scaled glyphs at input point data. """ # Author: Prabhu Ramachandran # KK Rai (kk.rai [at] iitb.ac.in) # R. Ambareesha (ambareesha [at] iitb.ac.in) # Copyright (c) 2005-2016, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import Instance, Trait, Bool from traits.api import Enum from traitsui.api import View, Group, Item from tvtk.api import tvtk from tvtk.tvtk_base import TraitRevPrefixMap import tvtk.common as tvtk_common # Local imports. from mayavi.core.component import Component from mayavi.core.module import Module from mayavi.components import glyph_source ###################################################################### # `Glyph` class. ###################################################################### class Glyph(Component): # The version of this class. Used for persistence. __version__ = 0 # Type of Glyph: 'tensor' or 'vector' glyph_type = Enum('vector', 'tensor', desc = 'if the glyph is vector or tensor') # The scaling mode to use when scaling the glyphs. We could have # used the glyph's own scale mode but it allows users to set the # mode to use vector components for the scaling which I'd like to # disallow. scale_mode = Trait('scale_by_scalar', TraitRevPrefixMap({'scale_by_vector': 1, 'scale_by_vector_components': 2, 'data_scaling_off': 3, 'scale_by_scalar': 0}), desc="if scaling is done using scalar or vector/normal magnitude" ) # The color mode to use when coloring the glyphs. We could have # used the glyph's own color_mode trait but it allows users to set # the mode to use vector components for the scaling which I'd # like to disallow. color_mode = Trait('color_by_scalar', TraitRevPrefixMap({'color_by_vector': 2, 'color_by_scalar': 1, 'no_coloring': 0}), desc="if coloring is done by scalar or vector/normal magnitude" ) color_mode_tensor = Trait('scalar', TraitRevPrefixMap({'scalars': 1, 'eigenvalues':2, 'no_coloring': 0}), desc="if coloring is done by scalar or eigenvalues" ) # Specify if the input points must be masked. By mask we mean # that only a subset of the input points must be displayed. mask_input_points = Bool(False, desc="if input points are masked") # The MaskPoints filter. mask_points = Instance(tvtk.MaskPoints, args=(), kw={'random_mode': True}, record=True) # The Glyph3D instance. glyph = Instance(tvtk.Object, allow_none=False, record=True) # The Source to use for the glyph. This is chosen from # `self._glyph_list` or `self.glyph_dict`. glyph_source = Instance(glyph_source.GlyphSource, allow_none=False, record=True) # The module associated with this component. This is used to get # the data range of the glyph when the scale mode changes. This # *must* be set if this module is to work correctly. module = Instance(Module) # Should we show the GUI option for changing the scalar mode or # not? This is useful for vector glyphing modules where there it # does not make sense to scale the data based on scalars. show_scale_mode = Bool(True) ######################################## # Private traits. # Used for optimization. _updating = Bool(False) ######################################## # View related traits. view = View(Group(Item(name='mask_input_points'), Group(Item(name='mask_points', enabled_when='object.mask_input_points', style='custom', resizable=True), show_labels=False, ), label='Masking', ), Group(Group(Item(name='scale_mode', enabled_when='show_scale_mode', visible_when='show_scale_mode'), Item(name='color_mode', enabled_when= 'glyph_type == "vector"', visible_when= 'glyph_type == "vector"'), Item(name='color_mode_tensor', enabled_when= 'glyph_type == "tensor"', visible_when= 'glyph_type == "tensor"'), ), Group(Item(name='glyph', style='custom', resizable=True), show_labels=False), label='Glyph', selected=True, ), Group(Item(name='glyph_source', style='custom', resizable=True), show_labels=False, label='Glyph Source', ), resizable=True ) ###################################################################### # `object` interface ###################################################################### def __get_pure_state__(self): d = super(Glyph, self).__get_pure_state__() for attr in ('module', '_updating'): d.pop(attr, None) return d ###################################################################### # `Module` interface ###################################################################### def setup_pipeline(self): """Override this method so that it *creates* the tvtk pipeline. This method is invoked when the object is initialized via `__init__`. Note that at the time this method is called, the tvtk data pipeline will *not* yet be setup. So upstream data will not be available. The idea is that you simply create the basic objects and setup those parts of the pipeline not dependent on upstream sources and filters. You should also set the `actors` attribute up at this point. """ self._glyph_type_changed(self.glyph_type) self.glyph_source = glyph_source.GlyphSource() # Handlers to setup our source when the sources pipeline changes. self.glyph_source.on_trait_change(self._update_source, 'pipeline_changed') self.mask_points.on_trait_change(self.render) def update_pipeline(self): """Override this method so that it *updates* the tvtk pipeline when data upstream is known to have changed. This method is invoked (automatically) when any of the inputs sends a `pipeline_changed` event. """ if ((len(self.inputs) == 0) or (len(self.inputs[0].outputs) == 0)): return self._mask_input_points_changed(self.mask_input_points) if self.glyph_type == 'vector': self._color_mode_changed(self.color_mode) else: self._color_mode_tensor_changed(self.color_mode_tensor) self._scale_mode_changed(self.scale_mode) # Set our output. tvtk_common.configure_outputs(self, self.glyph) self.pipeline_changed = True def update_data(self): """Override this method so that it flushes the vtk pipeline if that is necessary. This method is invoked (automatically) when any of the inputs sends a `data_changed` event. """ self._scale_mode_changed(self.scale_mode) self.data_changed = True def render(self): if not self._updating: super(Glyph, self).render() def start(self): """Overridden method. """ if self.running: return self.glyph_source.start() super(Glyph, self).start() def stop(self): if not self.running: return self.glyph_source.stop() super(Glyph, self).stop() def has_output_port(self): """ The filter has an output port.""" return True def get_output_object(self): """ Returns the output port.""" return self.glyph.output_port ###################################################################### # Non-public methods. ###################################################################### def _update_source(self): self.configure_source_data(self.glyph, self.glyph_source.outputs[0]) def _glyph_source_changed(self, value): self.configure_source_data(self.glyph, value.outputs[0]) def _color_mode_changed(self, value): if len(self.inputs) == 0: return if value != 'no_coloring': self.glyph.color_mode = value def _color_mode_tensor_changed(self, value): if len(self.inputs) == 0: return self._updating = True if value != 'no_coloring': self.glyph.color_mode = value self.glyph.color_glyphs = True else: self.glyph.color_glyphs = False self._updating = False self.render() def _scale_mode_changed(self, value): if (self.module is None) or (len(self.inputs) == 0)\ or self.glyph_type == 'tensor': return self._updating = True try: glyph = self.glyph glyph.scale_mode = value mm = self.module.module_manager if glyph.scale_mode == 'scale_by_scalar': glyph.range = tuple(mm.scalar_lut_manager.data_range) else: glyph.range = tuple(mm.vector_lut_manager.data_range) finally: self._updating = False self.render() def _mask_input_points_changed(self, value): inputs = self.inputs if len(inputs) == 0: return if value: mask = self.mask_points tvtk_common.configure_input(mask, inputs[0].outputs[0]) self.configure_connection(self.glyph, mask) else: self.configure_connection(self.glyph, inputs[0]) self.glyph.update() def _glyph_type_changed(self, value): if self.glyph_type == 'vector': self.glyph = tvtk.Glyph3D(clamping=True) else: self.glyph = tvtk.TensorGlyph(scale_factor=0.1) self.show_scale_mode = False self.glyph.on_trait_change(self.render) def _scene_changed(self, old, new): super(Glyph, self)._scene_changed(old, new) self.glyph_source.scene = new mayavi-4.5.0/mayavi/components/glyph_source.py0000644000076500000240000002262712747716313022166 0ustar prabhustaff00000000000000"""A component that allows creates the source for the glyphs and handle transformation. """ # Author: KK Rai (kk.rai [at] iitb.ac.in) # R. Ambareesha (ambareesha [at] iitb.ac.in) # Prabhu Ramachandran # Enthought library imports. from traits.api import (Instance, List, Trait, Bool, TraitPrefixList, Property, Dict) from traitsui.api import View, Group, Item, InstanceEditor from tvtk.api import tvtk from tvtk.common import camel2enthought, configure_outputs from apptools.persistence.state_pickler import set_state # Local imports. from mayavi.core.common import handle_children_state from mayavi.core.component import Component ###################################################################### # `GlyphSource` class. ###################################################################### class GlyphSource(Component): # The version of this class. Used for persistence. __version__ = 1 # Glyph position. This can be one of ['head', 'tail', 'center'], # and indicates the position of the glyph with respect to the # input point data. Please note that this will work correctly # only if you do not mess with the source glyph's basic size. For # example if you use a ConeSource and set its height != 1, then the # 'head' and 'tail' options will not work correctly. glyph_position = Trait('center', TraitPrefixList(['head', 'tail', 'center']), desc='position of glyph w.r.t. data point') # The Source to use for the glyph. This is chosen from # `self._glyph_list` or `self.glyph_dict`. glyph_source = Instance(tvtk.Object, allow_none=False, record=True) # A dict of glyphs to use. glyph_dict = Dict(desc='the glyph sources to select from', record=False) # A list of predefined glyph sources that can be used. glyph_list = Property(List(tvtk.Object), record=False) ######################################## # Private traits. # The transformation to use to place glyph appropriately. _trfm = Instance(tvtk.TransformFilter, args=()) # Used for optimization. _updating = Bool(False) ######################################## # View related traits. view = View(Group(Group(Item(name='glyph_position')), Group(Item(name='glyph_source', style='custom', resizable=True, editor=InstanceEditor(name='glyph_list'), ), label='Glyph Source', show_labels=False) ), resizable=True) ###################################################################### # `Base` interface ###################################################################### def __get_pure_state__(self): d = super(GlyphSource, self).__get_pure_state__() for attr in ('_updating', 'glyph_list'): d.pop(attr, None) return d def __set_pure_state__(self, state): if 'glyph_dict' in state: # Set their state. set_state(self, state, first=['glyph_dict'], ignore=['*']) ignore = ['glyph_dict'] else: # Set the dict state using the persisted list. gd = self.glyph_dict gl = self.glyph_list handle_children_state(gl, state.glyph_list) for g, gs in zip(gl, state.glyph_list): name = camel2enthought(g.__class__.__name__) if name not in gd: gd[name] = g # Set the glyph source's state. set_state(g, gs) ignore = ['glyph_list'] g_name = state.glyph_source.__metadata__['class_name'] name = camel2enthought(g_name) # Set the correct glyph_source. self.glyph_source = self.glyph_dict[name] set_state(self, state, ignore=ignore) ###################################################################### # `Component` interface ###################################################################### def setup_pipeline(self): """Override this method so that it *creates* the tvtk pipeline. This method is invoked when the object is initialized via `__init__`. Note that at the time this method is called, the tvtk data pipeline will *not* yet be setup. So upstream data will not be available. The idea is that you simply create the basic objects and setup those parts of the pipeline not dependent on upstream sources and filters. You should also set the `actors` attribute up at this point. """ self._trfm.transform = tvtk.Transform() # Setup the glyphs. self.glyph_source = self.glyph_dict['glyph_source2d'] def update_pipeline(self): """Override this method so that it *updates* the tvtk pipeline when data upstream is known to have changed. This method is invoked (automatically) when any of the inputs sends a `pipeline_changed` event. """ self._glyph_position_changed(self.glyph_position) self.pipeline_changed = True def update_data(self): """Override this method so that it flushes the vtk pipeline if that is necessary. This method is invoked (automatically) when any of the inputs sends a `data_changed` event. """ self.data_changed = True def render(self): if not self._updating: super(GlyphSource, self).render() ###################################################################### # Non-public methods. ###################################################################### def _glyph_source_changed(self, value): if self._updating == True: return gd = self.glyph_dict value_cls = camel2enthought(value.__class__.__name__) if value not in gd.values(): gd[value_cls] = value # Now change the glyph's source trait. self._updating = True recorder = self.recorder if recorder is not None: name = recorder.get_script_id(self) lhs = '%s.glyph_source'%name rhs = '%s.glyph_dict[%r]'%(name, value_cls) recorder.record('%s = %s'%(lhs, rhs)) name = value.__class__.__name__ if name == 'GlyphSource2D': configure_outputs(self, value) else: self.configure_input(self._trfm, value) configure_outputs(self, self._trfm) value.on_trait_change(self.render) self._updating = False # Now update the glyph position since the transformation might # be different. self._glyph_position_changed(self.glyph_position) def _glyph_position_changed(self, value): if self._updating == True: return self._updating = True tr = self._trfm.transform tr.identity() g = self.glyph_source name = g.__class__.__name__ # Compute transformation factor if name == 'CubeSource': tr_factor = g.x_length/2.0 elif name == 'CylinderSource': tr_factor = -g.height/2.0 elif name == 'ConeSource': tr_factor = g.height/2.0 elif name == 'SphereSource': tr_factor = g.radius else: tr_factor = 1. # Translate the glyph if value == 'tail': if name == 'GlyphSource2D': g.center = 0.5, 0.0, 0.0 elif name == 'ArrowSource': pass elif name == 'CylinderSource': g.center = 0, tr_factor, 0.0 elif hasattr(g, 'center'): g.center = tr_factor, 0.0, 0.0 elif value == 'head': if name == 'GlyphSource2D': g.center = -0.5, 0.0, 0.0 elif name == 'ArrowSource': tr.translate(-1, 0, 0) elif name == 'CylinderSource': g.center = 0,-tr_factor, 0.0 else: g.center = -tr_factor, 0.0, 0.0 else: if name == 'ArrowSource': tr.translate(-0.5, 0, 0) elif name != 'Axes': g.center = 0.0, 0.0, 0.0 if name == 'CylinderSource': tr.rotate_z(90) self._updating = False self.render() def _get_glyph_list(self): # Return the glyph list as per the original order in earlier # implementation. order = ['glyph_source2d', 'arrow_source', 'cone_source', 'cylinder_source', 'sphere_source', 'cube_source', 'axes'] gd = self.glyph_dict for key in gd: if key not in order: order.append(key) return [gd[key] for key in order] def _glyph_dict_default(self): g = {'glyph_source2d': tvtk.GlyphSource2D(glyph_type='arrow', filled=False), 'arrow_source': tvtk.ArrowSource(), 'cone_source': tvtk.ConeSource(height=1.0, radius=0.2, resolution=15), 'cylinder_source': tvtk.CylinderSource(height=1.0, radius=0.15, resolution=10), 'sphere_source': tvtk.SphereSource(), 'cube_source': tvtk.CubeSource(), 'axes': tvtk.Axes(symmetric=1)} return g mayavi-4.5.0/mayavi/components/grid_plane.py0000644000076500000240000001463612747716313021570 0ustar prabhustaff00000000000000"""A grid plane component. """ # Author: Prabhu Ramachandran # Copyright (c) 2005-2006, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import Instance, Enum, Int, Range from traitsui.api import View, Group, Item from tvtk.api import tvtk from apptools.persistence import state_pickler # Local imports. from mayavi.core.component import Component from mayavi.core.common import error def _get_extent(inp): """Get the extents from the given input. """ d = inp.dimensions return [0, d[0]-1, 0, d[1]-1, 0, d[2]-1] ###################################################################### # `GridPlane` class. ###################################################################### class GridPlane(Component): # The version of this class. Used for persistence. __version__ = 0 # The TVTK object that extracts the grid plane. This is created # dynamically based on the input data type. plane = Instance(tvtk.Object) # The axis which is normal to the plane chosen. axis = Enum('x', 'y', 'z', desc='specifies the axis normal to the grid plane') # The position of the grid plane. position = Range(value=0, low='_low', high='_high', enter_set=True, auto_set=False) ######################################## # Private traits. # Determines the lower limit of the position trait and is always 0. _low = Int(0) # Determines the upper limit of the position trait. The value is # dynamically set depending on the input data and state of the # axis trait. The default is some large value to avoid errors in # cases where the user may set the position before adding the # object to the mayavi tree. _high = Int(10000) ######################################## # View related traits. # The View for this object. view = View(Group(Item(name='axis'), Item(name='position', enabled_when='_high > 0')) ) ###################################################################### # `object` interface ###################################################################### def __get_pure_state__(self): d = super(GridPlane, self).__get_pure_state__() # These traits are dynamically created. for name in ('plane', '_low', '_high'): d.pop(name, None) return d def __set_pure_state__(self, state): state_pickler.set_state(self, state) self._position_changed(self.position) ###################################################################### # `Component` interface ###################################################################### def setup_pipeline(self): """Override this method so that it *creates* its tvtk pipeline. This method is invoked when the object is initialized via `__init__`. Note that at the time this method is called, the tvtk data pipeline will *not* yet be setup. So upstream data will not be available. The idea is that you simply create the basic objects and setup those parts of the pipeline not dependent on upstream sources and filters. """ pass def update_pipeline(self): """Override this method so that it *updates* the tvtk pipeline when data upstream is known to have changed. This method is invoked (automatically) when the input fires a `pipeline_changed` event. """ if len(self.inputs) == 0: return input = self.inputs[0].get_output_dataset() plane = None if input.is_a('vtkStructuredGrid'): plane = tvtk.StructuredGridGeometryFilter() elif input.is_a('vtkStructuredPoints') or input.is_a('vtkImageData'): plane = tvtk.ImageDataGeometryFilter () elif input.is_a('vtkRectilinearGrid'): plane = tvtk.RectilinearGridGeometryFilter () else: msg = "The GridPlane component does not support the %s dataset."\ %(input.class_name) error(msg) raise TypeError(msg) self.configure_connection(plane, self.inputs[0]) self.plane = plane self.plane.update() self.outputs = [plane] self._update_limits() self._update_extents() # If the data is 2D make sure that we default to the # appropriate axis. extents = list(_get_extent(input)) diff = [y-x for x, y in zip(extents[::2], extents[1::2])] if diff.count(0) > 0: self.axis = ['x', 'y', 'z'][diff.index(0)] def update_data(self): """Override this method to do what is necessary when upstream data changes. This method is invoked (automatically) when any of the inputs sends a `data_changed` event. """ self._update_limits() self._update_extents() # Propagate the data_changed event. self.data_changed = True def has_output_port(self): """ The filter has an output port.""" return True def get_output_object(self): """ Returns the output port.""" return self.plane.output_port ###################################################################### # Non-public methods. ###################################################################### def _get_axis_index(self): return {'x':0, 'y':1, 'z':2}[self.axis] def _update_extents(self): inp = self.plane.input extents = list(_get_extent(inp)) pos = self.position axis = self._get_axis_index() extents[2*axis] = pos extents[2*axis+1] = pos try: self.plane.set_extent(extents) except AttributeError: self.plane.extent = extents def _update_limits(self): extents = _get_extent(self.plane.input) axis = self._get_axis_index() pos = min(self.position, extents[2*axis+1]) self._high = extents[2*axis+1] return pos def _axis_changed(self, val): if len(self.inputs) == 0: return pos = self._update_limits() if self.position == pos: self._update_extents() self.data_changed = True else: self.position = pos def _position_changed(self, val): if len(self.inputs) == 0: return self._update_extents() self.data_changed = True mayavi-4.5.0/mayavi/components/implicit_plane.py0000644000076500000240000001556312747716313022455 0ustar prabhustaff00000000000000"""A component to manage an implicit plane widget. """ # Author: Prabhu Ramachandran # Copyright (c) 2005-2016, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import Instance, Bool, Property from traitsui.api import View, Group, Item, InstanceEditor from tvtk.api import tvtk # Local imports. from mayavi.core.component import Component VTK_VER = tvtk.Version().vtk_version ###################################################################### # `ImplicitPlane` class. ###################################################################### class ImplicitPlane(Component): # The version of this class. Used for persistence. __version__ = 0 # The widget that controls the plane. widget = Instance(tvtk.ImplicitPlaneWidget, args=(), kw={'key_press_activation': False, 'place_factor':1.2, 'draw_plane':False, 'outline_translation':False}, record=True) # The plane that the widget controls. Do not change the # attributes of the plane, do it via the widget. plane = Instance(tvtk.Plane, args=(), kw={'origin':(0.0, 0.0, 0.0), 'normal':(0,0,1)}, record=True) # Convenience property for the normal delegated to the widget. normal = Property # Convenience property for the origin delegated to the widget. origin = Property ######################################## # Private traits _first = Bool(True) _busy = Bool(False) ######################################## # View related traits. if VTK_VER[:3] in ['4.2', '4.4']: _widget_group = Group(Item(name='enabled'), Item(name='normal_to_x_axis'), Item(name='normal_to_y_axis'), Item(name='normal_to_z_axis'), Item(name='outline_translation'), Item(name='tubing'), Item(name='draw_plane'), Item(name='normal'), Item(name='origin') ) else: _widget_group = Group(Item(name='enabled'), Item(name='normal_to_x_axis'), Item(name='normal_to_y_axis'), Item(name='normal_to_z_axis'), Item(name='outline_translation'), Item(name='scale_enabled'), Item(name='tubing'), Item(name='draw_plane'), Item(name='normal'), Item(name='origin') ) view = View(Group(Item(name='widget', style='custom', editor=InstanceEditor(view=View(_widget_group))), show_labels=False) ) ###################################################################### # `Component` interface ###################################################################### def setup_pipeline(self): """Override this method so that it *creates* its tvtk pipeline. This method is invoked when the object is initialized via `__init__`. Note that at the time this method is called, the tvtk data pipeline will *not* yet be setup. So upstream data will not be available. The idea is that you simply create the basic objects and setup those parts of the pipeline not dependent on upstream sources and filters. """ # Setup our widgets and hook up all handlers. self.widgets = [self.widget] self._connect() def update_pipeline(self): """Override this method so that it *updates* the tvtk pipeline when data upstream is known to have changed. This method is invoked (automatically) when the input fires a `pipeline_changed` event. """ if len(self.inputs) == 0 or len(self.inputs[0].outputs) == 0: return inp = self.inputs[0].outputs[0] w = self.widget self.configure_input(w, inp) if self._first: w.place_widget() self.origin = self.inputs[0].get_output_dataset().center self._first = False else: n = self.normal # A hack to update the widget when data changes upstream. # This is perhaps a VTK bug, not sure. self.normal = n[0], n[1], n[2] + 0.001 self.normal = n # Just pass the inputs back out. This may trigger a pipeline # changed downstream if it does not then fire a data_changed. if self.outputs != [inp]: self.outputs = [inp] else: self.data_changed = True def update_data(self): """Override this method to do what is necessary when upstream data changes. This method is invoked (automatically) when any of the inputs sends a `data_changed` event. """ self.data_changed = True def update_plane(self): """Convenience method to update the plane once the widget is changed. """ self.widget.get_plane(self.plane) self.update_data() ###################################################################### # Non-public interface. ###################################################################### def _get_normal(self): return self.widget.normal def _set_normal(self, value): w = self.widget old = w.normal w.normal = value self.trait_property_changed('normal', old, value) self.update_plane() def _get_origin(self): return self.widget.origin def _set_origin(self, value): # Ugly, but needed. w = tvtk.to_vtk(self.widget) old = w.GetOrigin() w.SetOrigin(list(value)) self.trait_property_changed('origin', old, value) self.update_plane() def _on_interaction_event(self, obj, event): if not self._busy: self._busy = True self.update_plane() self._busy = False def _on_normal_set(self): w = self.widget w.place_widget() w.update_traits() def _connect(self): """Wires up all the event handlers.""" w = self.widget w.add_observer('InteractionEvent', self._on_interaction_event) w.on_trait_change(self._on_normal_set, 'normal_to_x_axis') w.on_trait_change(self._on_normal_set, 'normal_to_y_axis') w.on_trait_change(self._on_normal_set, 'normal_to_z_axis') w.on_trait_change(self._on_interaction_event) for obj in (self.plane, w): obj.on_trait_change(self.render) mayavi-4.5.0/mayavi/components/implicit_widgets.py0000644000076500000240000002365512747716313023025 0ustar prabhustaff00000000000000"""A component that provides a selection of implicit widgets to be used by various modules. """ # Author: Suyog Dutt Jain # Prabhu Ramachandran # Copyright (c) 2009-2015, Enthought, Inc. # License: BSD Style. import pickle from traits.api import (Instance, Trait, Bool, TraitMap, Enum, Dict, Str, Int) from traitsui.api import View, Group, Item from tvtk.api import tvtk from apptools.persistence.state_pickler import set_state from mayavi.core.component import Component ###################################################################### # `ImplicitWidgets` class. ###################################################################### class ImplicitWidgets(Component): # The version of this class. Used for persistence. __version__ = 0 # The widget type to use. widget_mode = Enum('Box', 'Sphere', 'Plane','ImplicitPlane', desc='the implicit widget to use') # The actual poly data source widget. widget = Instance(tvtk.ThreeDWidget, record=True) update_mode = Trait('semi-interactive', TraitMap({'interactive':'InteractionEvent', 'semi-interactive': 'EndInteractionEvent'}), desc='speed at which the data should be updated') implicit_function = Instance(tvtk.ImplicitFunction, allow_none=False) ######################################## # Private traits. _first = Bool(True) _busy = Bool(False) _observer_id = Int(-1) # The actual widgets. _widget_dict = Dict(Str, Instance(tvtk.ThreeDWidget, allow_none=False)) # The actual implicit functions. _implicit_function_dict = Dict(Str, Instance(tvtk.ImplicitFunction, allow_none=False)) ######################################## # View related traits. ######################################## # Create the UI for the traits. view = View(Group(Item(name='widget_mode'), Item(name='widget', style='custom', resizable=True), label='Widget Source', show_labels=False), resizable=True) ##################################################################### # `object` interface ###################################################################### def __init__(self, **traits): # Call parent class' init. super(ImplicitWidgets, self).__init__(**traits) # Initialize the source to the default widget's instance from # the dictionary if needed. if 'widget_mode' not in traits: self._widget_mode_changed(self.widget_mode) ###################################################################### # `Base` interface ###################################################################### def __get_pure_state__(self): d = super(ImplicitWidgets, self).__get_pure_state__() for attr in ('_first', '_busy', '_observer_id', 'widget', 'implicit_function'): d.pop(attr, None) # The box widget requires a transformation matrix to be pickled. tfm = tvtk.Transform() w = self._widget_dict['Box'] w.get_transform(tfm) d['matrix'] = pickle.dumps(tfm.matrix) return d def __set_pure_state__(self, state): # Pop the transformation matrix for the box widget. mat = state.pop('matrix') # Now set their state. set_state(self, state, first=['widget_mode'], ignore=['*']) # Set state of rest of the attributes ignoring the widget_mode. set_state(self, state, ignore=['widget_mode']) # Set the transformation for Box widget. tfm = tvtk.Transform() tfm.set_matrix(pickle.loads(mat)) w = self._widget_dict['Box'] w.set_transform(tfm) # Some widgets need some cajoling to get their setup right. w = self.widget # Set the input. if len(self.inputs) > 0: self.configure_input(w, self.inputs[0].outputs[0]) w.update_traits() mode = self.widget_mode if mode == 'Plane': wd = state._widget_dict[mode] w.origin = wd.origin w.normal = wd.normal w.update_placement() self.update_implicit_function() # Set the widgets trait so that the widget is rendered if needed. self.widgets = [w] ###################################################################### # `Component` interface ###################################################################### def setup_pipeline(self): """Override this method so that it *creates* the tvtk pipeline. """ # Setup the widgets. self.widgets = [self.widget] def update_pipeline(self): """Override this method so that it *updates* the tvtk pipeline when data upstream is known to have changed. This method is invoked (automatically) when any of the inputs sends a `pipeline_changed` event. """ if len(self.inputs) == 0: return inp = self.inputs[0].outputs[0] w = self.widget self.configure_input(w, inp) if self._first: w.place_widget() self._first = False # Set our output. if self.outputs != [inp]: self.outputs = [inp] else: self.data_changed = True self.pipeline_changed = True def update_data(self): """Override this method so that it flushes the vtk pipeline if that is necessary. This method is invoked (automatically) when any of the inputs sends a `data_changed` event. """ self.data_changed = True ###################################################################### # `SourceWidget` interface ###################################################################### def update_implicit_function(self): """Update the implicit_function from the widget data. """ dispatch = {'Sphere': 'get_sphere', 'Box': 'get_planes', 'Plane': 'get_plane', 'ImplicitPlane': 'get_plane'} method = getattr(self.widget, dispatch[self.widget_mode]) method(self.implicit_function) ###################################################################### # Non-public traits. ###################################################################### def _widget_changed(self, old, value): if len(self.inputs) > 0: self.configure_input(value, self.inputs[0].outputs[0]) value.place_widget() self.implicit_function = self._implicit_function_dict[self.widget_mode] if old is not None: self._connect(old, remove=True) self._connect(value, remove=False) self.widgets = [value] def _connect(self, value, remove=False): """Wire up event handlers or tear them down given a widget `value`. If `remove` is True, then tear them down.""" if remove and self._observer_id > 0: value.remove_observer(self._observer_id) else: self._observer_id = value.add_observer(self.update_mode_, self._on_interaction_event) if isinstance(value, tvtk.PlaneWidget) or \ isinstance(value, tvtk.ImplicitPlaneWidget): value.on_trait_change(self._on_alignment_set, 'normal_to_x_axis', remove=remove) value.on_trait_change(self._on_alignment_set, 'normal_to_y_axis', remove=remove) value.on_trait_change(self._on_alignment_set, 'normal_to_z_axis', remove=remove) value.on_trait_change(self._on_widget_trait_changed, remove=remove) value.on_trait_change(self.render, remove=remove) def _on_interaction_event(self, obj, event): self.update_implicit_function() def _update_mode_changed(self, old, new): w = self.widget if w is not None: w.remove_observer(self._observer_id) self._observer_id = w.add_observer(self.update_mode_, self._on_interaction_event) w.on_trait_change(self.render) self.render() def _on_widget_trait_changed(self): if (not self._busy) and (self.update_mode != 'non-interactive'): self._busy = True self.implicit_function = self._implicit_function_dict[self.widget_mode] self.update_implicit_function() self.render() self._busy = False def _on_alignment_set(self): """Event handler when the widget's normal is reset (if applicable).""" w = self.widget w.place_widget() w.update_traits() self.render() def _scene_changed(self, old, new): super(ImplicitWidgets, self)._scene_changed(old, new) self._foreground_changed_for_scene(None, new.foreground) def _widget_mode_changed(self, value): """This method is invoked (automatically) when the `source` trait is changed. """ self.widget = self._widget_dict[self.widget_mode] def __widget_dict_default(self): """Default value for source dict.""" w = {'Box':tvtk.BoxWidget(place_factor = 0.9), 'Sphere':tvtk.SphereWidget(place_factor = 0.9), 'Plane':tvtk.PlaneWidget(place_factor = 0.9), 'ImplicitPlane': tvtk.ImplicitPlaneWidget(place_factor=0.9, draw_plane=False)} return w def __implicit_function_dict_default(self): """Default value for source dict.""" ip = {'Box':tvtk.Planes(), 'Sphere':tvtk.Sphere(), 'Plane':tvtk.Plane(), 'ImplicitPlane': tvtk.Plane()} return ip mayavi-4.5.0/mayavi/components/optional.py0000644000076500000240000001076212747716313021305 0ustar prabhustaff00000000000000"""A meta-component that allows a component to be optionally enabled or disabled. This component is mostly for illustration and is not used anywhere. This is because it is usually much easier to simply add a trait in the module to enable/disable a particular component. """ # Author: Prabhu Ramachandran # Copyright (c) 2005, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import Instance, Bool, Str, Property from traitsui.api import View, Group, Item # Local imports. from mayavi.core.component import Component ###################################################################### # `Optional` class. ###################################################################### class Optional(Component): # The version of this class. Used for persistence. __version__ = 0 # The outputs of this component is a property and not a list. outputs = Property # The component that is enabled or disabled. component = Instance(Component) # Is the component enabled or not. enabled = Bool(True, desc='if the component is enabled') # The label of the checkbox to use in the view. label = Str ######################################## # The component's view # This is defined outside the view so that the label may be easily # changed. enabled_item = Item(name='enabled') view = View(Group(Group(enabled_item), Group(Item(name='component', style='custom', visible_when='object.enabled'), show_labels=False) ) ) ###################################################################### # `Component` interface ###################################################################### def update_pipeline(self): """Override this method so that it *updates* the tvtk pipeline when data upstream is known to have changed. This method is invoked (automatically) when the input fires a `pipeline_changed` event. """ comp = self.component if self.inputs != comp.inputs: comp.inputs = self.inputs self.pipeline_changed = True def update_data(self): """Override this method to do what is necessary when upstream data changes. This method is invoked (automatically) when any of the inputs sends a `data_changed` event. """ self.data_changed = True ###################################################################### # `Base` interface ###################################################################### def start(self): """This is invoked when this object is added to the mayavi pipeline. Note that when start is invoked, all the other information for the pipeline should be already set. """ # Do nothing if we are already running. if self.running: return super(Optional, self).start() self.component.start() def stop(self): """Invoked when this object is removed from the mayavi pipeline. """ if not self.running: return self.component.stop() super(Optional, self).stop() ###################################################################### # Non-public methods. ###################################################################### def _get_outputs(self): if self.enabled: return self.component.outputs else: return self.inputs[0].get_output_object() def _enabled_changed(self, value): # Force downstream modules to update. self.pipeline_changed = True def _label_changed(self, value): # Change the displayed label for the enable trait in the view. item = self.trait_view_elements().content['enabled_item'] item.label = value def _component_changed(self, old, new): if old is not None: old.on_trait_change(self._fire_pipeline_changed, 'pipeline_changed', remove=True) old.on_trait_change(self._fire_data_changed, 'data_changed', remove=True) new.on_trait_change(self._fire_pipeline_changed, 'pipeline_changed') new.on_trait_change(self._fire_data_changed, 'data_changed') def _fire_pipeline_changed(self): self.pipeline_changed = True def _fire_data_changed(self): self.data_changed = True mayavi-4.5.0/mayavi/components/poly_data_normals.py0000644000076500000240000000572112747716313023166 0ustar prabhustaff00000000000000"""This component computes normals for input poly data. """ # Author: Prabhu Ramachandran # Copyright (c) 2005-2016, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import Instance from traitsui.api import View, Group, Item, InstanceEditor from tvtk.api import tvtk # Local imports. from mayavi.core.component import Component from mayavi.components.common import convert_to_poly_data ###################################################################### # `PolyDataNormals` class. ###################################################################### class PolyDataNormals(Component): # The version of this class. Used for persistence. __version__ = 0 # The filter that generates the normals. filter = Instance(tvtk.PolyDataNormals, args=(), kw={'feature_angle': 45.0}, record=True) ######################################## # The component's view _filter_group = Group(Item(name='feature_angle')) view = View(Group(Item(name='filter', style='custom', editor=InstanceEditor(view=View(_filter_group))), show_labels=False ) ) ###################################################################### # `Component` interface ###################################################################### def setup_pipeline(self): """Override this method so that it *creates* its tvtk pipeline. This method is invoked when the object is initialized via `__init__`. Note that at the time this method is called, the tvtk data pipeline will *not* yet be setup. So upstream data will not be available. The idea is that you simply create the basic objects and setup those parts of the pipeline not dependent on upstream sources and filters. """ self.filter.on_trait_change(self.update_data) def update_pipeline(self): """Override this method so that it *updates* the tvtk pipeline when data upstream is known to have changed. This method is invoked (automatically) when the input fires a `pipeline_changed` event. """ if (len(self.inputs) == 0) or \ (len(self.inputs[0].outputs) == 0): return f = self.filter input = self.inputs[0].outputs[0] self.configure_input(f, convert_to_poly_data(input)) f.update() self.outputs = [f] def update_data(self): """Override this method to do what is necessary when upstream data changes. This method is invoked (automatically) when any of the inputs sends a `data_changed` event. """ self.data_changed = True def has_output_port(self): """ The filter has an output port.""" return True def get_output_object(self): """ Returns the output port.""" return self.filter.output_port mayavi-4.5.0/mayavi/components/source_widget.py0000644000076500000240000002714212747716313022323 0ustar prabhustaff00000000000000"""A component that provides a selection of poly data source widgets to be used by various modules. """ # Author: Prabhu Ramachandran # Copyright (c) 2005-2016, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import Event, Instance, List, Trait, Bool, TraitPrefixList from traitsui.api import View, Group, Item, InstanceEditor from tvtk.api import tvtk from apptools.persistence.state_pickler import set_state # Local imports. from mayavi.core.common import handle_children_state from mayavi.core.component import Component ###################################################################### # `SourceWidget` class. ###################################################################### class SourceWidget(Component): # The version of this class. Used for persistence. __version__ = 0 # The actual poly data source widget. widget = Instance(tvtk.ThreeDWidget, record=True) # Specifies the updation mode of the poly_data attribute. There # are three modes: 1) 'interactive' -- the poly_data attribute is # updated as the widget is interacted with, 2) 'semi-interactive' # -- poly_data attribute is updated when the traits of the widget # change and when the widget interaction is complete, 3) # 'non-interactive' -- poly_data is updated only explicitly at # users request by calling `object.update_poly_data`. update_mode = Trait('interactive', TraitPrefixList(['interactive', 'semi-interactive', 'non-interactive']), desc='the speed at which the poly data is updated') # A list of predefined glyph sources that can be used. widget_list = List(tvtk.Object, record=False) # The poly data that the widget manages. poly_data = Instance(tvtk.PolyData, args=()) ######################################## # Private traits. _first = Bool(True) _busy = Bool(False) _unpickling = Bool(False) ######################################## # View related traits. view = View(Group(Item(name='widget', style='custom', resizable=True, editor=InstanceEditor(name='widget_list')), label='Source Widget', show_labels=False, ), resizable=True, ) ###################################################################### # `Base` interface ###################################################################### def __get_pure_state__(self): d = super(SourceWidget, self).__get_pure_state__() for attr in ('poly_data', '_unpickling', '_first', '_busy'): d.pop(attr, None) return d def __set_pure_state__(self, state): self._unpickling = True # First create all the allowed widgets in the widget_list attr. handle_children_state(self.widget_list, state.widget_list) # Now set their state. set_state(self, state, first=['widget_list'], ignore=['*']) # Set the widget attr depending on value saved. m = [x.__class__.__name__ for x in self.widget_list] w_c_name = state.widget.__metadata__['class_name'] w = self.widget = self.widget_list[m.index(w_c_name)] # Set the input. if len(self.inputs) > 0: self.configure_input(w, self.inputs[0].outputs[0]) # Fix for the point widget. if w_c_name == 'PointWidget': w.place_widget() # Set state of rest of the attributes ignoring the widget_list. set_state(self, state, ignore=['widget_list']) # Some widgets need some cajoling to get their setup right. w.update_traits() if w_c_name == 'PlaneWidget': w.origin = state.widget.origin w.normal = state.widget.normal w.center = state.widget.center w.update_placement() w.get_poly_data(self.poly_data) elif w_c_name == 'SphereWidget': # XXX: This hack is necessary because the sphere widget # does not update its poly data even when its ivars are # set (plus it does not have an update_placement method # which is a bug). So we force this by creating a similar # sphere source and copy its output. s = tvtk.SphereSource(center=w.center, radius=w.radius, theta_resolution=w.theta_resolution, phi_resolution=w.phi_resolution, lat_long_tessellation=True) s.update() self.poly_data.shallow_copy(s.output) else: w.get_poly_data(self.poly_data) self._unpickling = False # Set the widgets trait so that the widget is rendered if needed. self.widgets = [w] ###################################################################### # `Component` interface ###################################################################### def setup_pipeline(self): """Override this method so that it *creates* the tvtk pipeline. This method is invoked when the object is initialized via `__init__`. Note that at the time this method is called, the tvtk data pipeline will *not* yet be setup. So upstream data will not be available. The idea is that you simply create the basic objects and setup those parts of the pipeline not dependent on upstream sources and filters. You should also set the `actors` attribute up at this point. """ # Setup the glyphs. sources = [tvtk.SphereWidget(theta_resolution=8, phi_resolution=6), tvtk.LineWidget(clamp_to_bounds=False), tvtk.PlaneWidget(), tvtk.PointWidget(outline=False, x_shadows=False, y_shadows=False, z_shadows=False), ] self.widget_list = sources # The 'widgets' trait is set in the '_widget_changed' handler. self.widget = sources[0] for s in sources: self._connect(s) def update_pipeline(self): """Override this method so that it *updates* the tvtk pipeline when data upstream is known to have changed. This method is invoked (automatically) when any of the inputs sends a `pipeline_changed` event. """ if len(self.inputs) == 0: return inp = self.inputs[0].outputs[0] w = self.widget self.configure_input(w, inp) if self._first: w.place_widget() self._first = False # If the dataset is effectively 2D switch to using the line # widget since that works best. b = self.inputs[0].get_output_dataset().bounds l = [(b[1]-b[0]), (b[3]-b[2]), (b[5]-b[4])] max_l = max(l) for i, x in enumerate(l): if x/max_l < 1.0e-6: w = self.widget = self.widget_list[1] w.clamp_to_bounds = True w.align = ['z_axis', 'z_axis', 'y_axis'][i] break # Set our output. w.get_poly_data(self.poly_data) self.outputs = [self.poly_data] self.pipeline_changed = True def update_data(self): """Override this method so that it flushes the vtk pipeline if that is necessary. This method is invoked (automatically) when any of the inputs sends a `data_changed` event. """ self.data_changed = True ###################################################################### # `SourceWidget` interface ###################################################################### def update_poly_data(self): self.widget.get_poly_data(self.poly_data) ###################################################################### # Non-public traits. ###################################################################### def _widget_changed(self, value): # If we are being unpickled do nothing. if self._unpickling: return if value not in self.widget_list: classes = [o.__class__ for o in self.widget_list] vc = value.__class__ self._connect(value) if vc in classes: self.widget_list[classes.index(vc)] = value else: self.widget_list.append(value) recorder = self.recorder if recorder is not None: idx = self.widget_list.index(value) name = recorder.get_script_id(self) lhs = '%s.widget'%name rhs = '%s.widget_list[%d]'%(name, idx) recorder.record('%s = %s'%(lhs, rhs)) if len(self.inputs) > 0: self.configure_input(value, self.inputs[0].outputs[0]) value.place_widget() value.on_trait_change(self.render) self.widgets = [value] def _update_mode_changed(self, value): if value in ['interactive', 'semi-interactive']: self.update_poly_data() self.render() def _on_interaction_event(self, obj, event): if (not self._busy) and (self.update_mode == 'interactive'): self._busy = True self.update_poly_data() self._busy = False def _on_widget_trait_changed(self): if (not self._busy) and (self.update_mode != 'non-interactive'): self._busy = True # This render call forces any changes to the trait to be # rendered only then will updating the poly data make # sense. self.render() self.update_poly_data() self._busy = False def _on_alignment_set(self): w = self.widget w.place_widget() w.update_traits() def _connect(self, obj): """Wires up all the event handlers.""" obj.add_observer('InteractionEvent', self._on_interaction_event) if isinstance(obj, tvtk.PlaneWidget): obj.on_trait_change(self._on_alignment_set, 'normal_to_x_axis') obj.on_trait_change(self._on_alignment_set, 'normal_to_y_axis') obj.on_trait_change(self._on_alignment_set, 'normal_to_z_axis') elif isinstance(obj, tvtk.LineWidget): obj.on_trait_change(self._on_alignment_set, 'align') # Setup the widgets colors. fg = (1,1,1) if self.scene is not None: fg = self.scene.foreground self._setup_widget_colors(obj, fg) obj.on_trait_change(self._on_widget_trait_changed) obj.on_trait_change(self.render) def _setup_widget_colors(self, widget, color): trait_names = widget.trait_names() props = [x for x in trait_names if 'property' in x and 'selected' not in x] sel_props = [x for x in trait_names if 'property' in x and 'selected' in x] for p in props: setattr(getattr(widget, p), 'color', color) setattr(getattr(widget, p), 'line_width', 2) for p in sel_props: # Set the selected color to 'red'. setattr(getattr(widget, p), 'color', (1,0,0)) setattr(getattr(widget, p), 'line_width', 2) self.render() def _foreground_changed_for_scene(self, old, new): # Change the default color for the actor. for w in self.widget_list: self._setup_widget_colors(w, new) self.render() def _scene_changed(self, old, new): super(SourceWidget, self)._scene_changed(old, new) self._foreground_changed_for_scene(None, new.foreground) mayavi-4.5.0/mayavi/components/ui/0000755000076500000240000000000012747722127017515 5ustar prabhustaff00000000000000mayavi-4.5.0/mayavi/components/ui/__init__.py0000644000076500000240000000013212747716313021622 0ustar prabhustaff00000000000000# Author: Judah De Paula # Copyright (c) 2005-2008, Enthought, Inc. # License: BSD Style. mayavi-4.5.0/mayavi/components/ui/actor.py0000644000076500000240000001007012747716313021175 0ustar prabhustaff00000000000000""" Traits View definition file. The view trait of the parent class is extracted from the model definition file. This file can either be exec()ed or imported. See core/base.py:Base.trait_view() for what is currently used. Using exec() allows view changes without needing to restart Mayavi, but is slower than importing. """ # Authors: Prabhu Ramachandran # Judah De Paula # Copyright (c) 2005-2008, Enthought, Inc. # License: BSD Style. from traitsui.api import (View, Group, Item, InstanceEditor, DropEditor, Tabbed) from tvtk.api import tvtk VTK_VER = tvtk.Version().vtk_version # The properties view group. _prop_base_group = Group(Item(name='representation'), Item(name='color'), Item(name='line_width'), Item(name='point_size'), Item(name='opacity'), ) _prop_group = Group(Item(name='property', style='custom', show_label=False, editor=InstanceEditor(view=View(_prop_base_group))), Item(name='property', show_label=False, editor=InstanceEditor(label='More options ...')), show_border=True, label='Property') # The mapper's view group. if VTK_VER[:3] in ['4.2', '4.4']: _mapper_base_group = Group(Item(name='scalar_visibility')) else: _mapper_base_group = Group(Item(name='scalar_visibility'), Item(name='interpolate_scalars_before_mapping'), ) _mapper_group = Group(Item(name='mapper', style='custom', show_label=False, editor=InstanceEditor(view=View(_mapper_base_group))), Item(name='mapper', show_label=False, editor=InstanceEditor(label='More options ...')), show_border=True, label='Mapper') # The Texture's view group _texture_group = Group(Item(name='interpolate'), Item(name='map_color_scalars_through_lookup_table'), Item(name='repeat'), show_border=True, #label='Texture', ) # The Actor's view group. _actor_base_group = Group(Item(name='visibility'))#, _actor_group = Group(Item(name='actor', style='custom', show_label=False, editor=InstanceEditor(view=View(_actor_base_group))), Item(name='actor', show_label=False, editor=InstanceEditor(label='More options ...')), show_border=True, label='Actor') actor_group = Group(_actor_group, _mapper_group, _prop_group, label='Actor', show_labels=False, ) texture_group = Group(Item(name='enable_texture'), Group(Item(name='texture_source_object', editor=DropEditor()), Item(name='tcoord_generator_mode'), Tabbed(Item(name='texture', style='custom', show_label=False, editor=InstanceEditor(view=View(_texture_group))), Item(name='tcoord_generator', style='custom', show_label=False, resizable=True, visible_when='texture_mode != "none"'), ), show_labels=True, label='Texture Properties', enabled_when='object.enable_texture', show_border=True), label='Texture', ) # The Views for this object. Pick the one that you need. actor_view = View(actor_group, resizable=True) texture_view = View(texture_group, resizable=True) view = View(actor_group, texture_group, resizable=True) mayavi-4.5.0/mayavi/components/ui/contour.py0000644000076500000240000000316412747716313021564 0ustar prabhustaff00000000000000""" Traits View definition file. The view trait of the parent class has been extracted from the model definition file. This file can either be exec()ed or imported. See core/base.py:Base.trait_view() for what is currently used. Using exec() allows view changes without needing to restart Mayavi, but is slower than importing. """ # Authors: Prabhu Ramachandran # Judah De Paula # Copyright (c) 2005-2008, Enthought, Inc. # License: BSD Style. from traitsui.api import Item, Group, View view = View(Group(Item(name='filled_contours', defined_when='show_filled_contours'), Item(name='auto_contours'), # One group or the other, but not both. Group( Item(name='contours', style='custom', visible_when='not auto_contours', show_label=False), ), Group( Item(name='number_of_contours'), Item(name='minimum_contour'), Item(name='maximum_contour'), visible_when='auto_contours', ), Item(name='auto_update_range'), Group( Item(name='_data_min', label='Data minimum'), Item(name='_data_max', label='Data maximum'), visible_when='not auto_update_range', ) ) ) mayavi-4.5.0/mayavi/core/0000755000076500000240000000000012747722127015643 5ustar prabhustaff00000000000000mayavi-4.5.0/mayavi/core/__init__.py0000644000076500000240000000013212747716313017750 0ustar prabhustaff00000000000000# Author: Prabhu Ramachandran # Copyright (c) 2005, Enthought, Inc. # License: BSD Style. mayavi-4.5.0/mayavi/core/adder_node.py0000644000076500000240000003206112747716313020303 0ustar prabhustaff00000000000000""" Custom nodes for a Tree Editor that provide views for adding various nodes to the tree. """ # Authors: Judah De Paula # Prabhu Ramachandran # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import (HasTraits, Str, Property, Any, Button, List, Instance, provides, ToolbarButton) from traitsui.api import View, Item, Group,\ TextEditor, TreeEditor, TreeNode, ListEditor, ITreeNode from pyface.api import ImageResource from pyface.resource.api import resource_path # Local imports. from .registry import registry ############################################################################### # AdderNode class ############################################################################### @provides(ITreeNode) class AdderNode(TreeNode): """ Base class that will display a TreeNode to add items to the tree. """ # String to be shown in the TreeEditor. label = Str('Base AdderNode') # Default tooltip for this class. tooltip = Str('Add an item') # The parent object that should be manipulated for adding children. object = Any # Duck-typing is necessary since Mayavi assumes nodes always have scenes. scene = Property # Trait view to show in the Mayavi current object panel. view = View(Group(label='AdderNode')) def dialog_view(self): """ View shown by double-clicking on the node. Same as in Base(). """ view = self.trait_view() view.buttons = [ ] view.title = self.label view.icon = ImageResource('add.ico') view.resizable = True view.width = 350 view.height = 650 return view def _get_scene(self): """ Trait Property getter for 'scene'. """ object = self.object if isinstance(object, AdderNode): return None if object is not None: return object.scene else: return None #------------------------------------------------------------------------ # The ITreeNode interface needed by the Qt tree_editor #------------------------------------------------------------------------ def get_label(self): return self.label def get_icon(self, obj, is_expanded=False): return self.icon_name def get_icon_path(self): return resource_path() def get_tooltip(self): return self.tooltip def allows_children(self): return False def get_children_id(self, node=None): return [] def when_label_changed(self, label_updated, remove): return def when_column_labels_change(self, listener, remove): return ############################################################################### # SceneAdderNode class ############################################################################### class SceneAdderNode(AdderNode): """ Subclass for adding Scene nodes to a Mayavi Engine node. """ # String to be shown in the TreeEditor. label = Str('Add a new scene') # The name of the icon icon_name = Str('add_scene.png') # Button for the View. add_scene = Button('Add a new scene', image=ImageResource('add_scene.png')) # Trait view to show in the Mayavi current object panel. view = View(Group(Item('add_scene', show_label=False, style='custom'), label='Add a scene')) def _add_scene_fired(self): """ Trait handler for when the add_scene button is clicked. """ self.object.new_scene() ############################################################################### # DocumentedItem class ############################################################################### class DocumentedItem(HasTraits): """ Container to hold a name and a documentation for an action. """ # Name of the action name = Str # Button to trigger the action add = ToolbarButton('Add', orientation='horizontal', image=ImageResource('add.ico')) # Object the action will apply on object = Any # Two lines documentation for the action documentation = Str view = View('_', Item('add', style='custom', show_label=False), Item('documentation', style='readonly', editor=TextEditor(multi_line=True), resizable=True, show_label=False), ) def _add_fired(self): """ Trait handler for when the add_source button is clicked in one of the sub objects in the list. """ action = getattr(self.object.menu_helper, self.id) action() def documented_item_factory(name='', documentation='', id='', object=None): """ Factory for creating a DocumentedItem with the right button label. """ documentation = documentation.replace('\n', '') documentation = documentation.replace(' ', '') class MyDocumentedItem(DocumentedItem): add = ToolbarButton('%s' % name, orientation='horizontal', image=ImageResource('add.ico')) return MyDocumentedItem( name=name, documentation=documentation, id=id, object=object) ############################################################################### # ListAdderNode class ############################################################################### class ListAdderNode(AdderNode): """ A node for adding object, with a list of objects to add generated from the registry. """ # The list of items to display to the user. items_list = List(DocumentedItem) # A reference to the registry, to generate this list. items_list_source = List() # Selected item selected_item = Instance(DocumentedItem) # A reference to self, to allow to build the tree view. self = Instance(AdderNode) # The icon of the displayed objects icon_name = Str('add.ico') def _self_default(self): return self def default_traits_view(self): nodes = [TreeNode(node_for=[AdderNode], label='name', copy=False, delete=False, rename=False, children='items_list', ), TreeNode(node_for=[DocumentedItem], label='name', copy=False, delete=False, rename=False, icon_item=self.icon_name, ), ] tree_editor = TreeEditor(editable=False, hide_root=True, orientation='vertical', selected='object.selected_item', nodes=nodes, on_dclick='object._on_tree_dclick', ) view = View(Item('self', show_label=False, editor=tree_editor, resizable=True, springy=True, height=0.5), Item('selected_item', style='custom', show_label=False, height=0.5), resizable=True) return view def _object_changed(self, value): """ Trait handler for when the self.object trait changes. """ result = [] if value is not None: # Don't need 'x', but do need to generate the actions. x = value.menu_helper.actions for src in self.items_list_source: if not self._is_action_suitable(value, src): continue name = src.menu_name.replace('&','') result.append( documented_item_factory( name=name, documentation=src.help, id=src.id, object=value) ) self.items_list = result def _is_action_suitable(self, object, src): """ Check that the action described by src can be applied on the given object. """ if hasattr(object.menu_helper, 'check_%s' % src.id) \ and getattr(object.menu_helper, 'check_%s' % src.id)(): return True else: return False def _on_tree_dclick(self, object): """ Called when an user double clicks on an item in the tree view. """ object._add_fired() ############################################################################### # SourceAdderNode class ############################################################################### class SourceAdderNode(ListAdderNode): """ Tree node that presents a view to the user to add a scene source. """ # Button for adding a data file, with automatic format checking. open_file = ToolbarButton('Load data from file', orientation='horizontal', image=ImageResource('file.png')) # A reference to the registry, to generate this list. items_list_source = [source for source in registry.sources if len(source.extensions) == 0] # The string to display on the icon in the TreeEditor. label = 'Add Data Source' # The icon of the displayed objects icon_name = Str('source.ico') # Trait view to show in the Mayavi current object panel. def default_traits_view(self): return View(Group(Group(Item('open_file', style='custom'), show_labels=False, show_border=False), Item('items_list', style='readonly', editor=ListEditor(style='custom')), show_labels=False, label='Add a data source')) def _open_file_fired(self): """ Trait handler for when the open_file button is clicked. """ self.object.menu_helper.open_file_action() def _is_action_suitable(self, object, src): return True ############################################################################### # ModuleAdderNode class ############################################################################### class ModuleAdderNode(ListAdderNode): """ Tree node that presents a view to the user to add modules. """ # String to be shown in the TreeEditor. label = Str('Add a visualization module') # The icon of the displayed objects icon_name = Str('module.ico') # A reference to the registry, to generate this list. items_list_source = registry.modules def _object_changed(self, value): if value is not None: value.menu_helper._build_filter_actions() ListAdderNode._object_changed(self, value) ############################################################################### # FilterAdderNode class ############################################################################### class FilterAdderNode(ListAdderNode): """ Tree node that presents a view to the user to add filters. """ # String to be shown in the TreeEditor. label = Str('Add a processing filter') # The icon of the displayed objects icon_name = Str('filter.ico') # A reference to the registry, to generate this list. items_list_source = registry.filters ############################################################################### # ModuleFilterAdderNode class ############################################################################### class ModuleFilterAdderNode(AdderNode): """ Tree node that presents a view to the user to add filter and modules. """ # The string to display on the icon in the TreeEditor. label = 'Add module or filter' # An adder node for modules modules = Instance(ModuleAdderNode, ()) # An adder node for filters filters = Instance(FilterAdderNode, ()) def _object_changed(self): """ Propagate the object to the sub nodes. """ self.filters.object = self.object self.modules.object = self.object # Trait view to show in the Mayavi current object panel. view = View( Group(Item('modules', style='custom', springy=True, resizable=True, height=1., ), show_labels=False, label='Visualization modules'), Group(Item('filters', style='custom', springy=True, resizable=True, height=1., ), show_labels=False, label='Processing filters'), ) ### EOF ####################################################################### mayavi-4.5.0/mayavi/core/api.py0000644000076500000240000000063012747716313016765 0ustar prabhustaff00000000000000 from .registry import registry from .metadata import SourceMetadata from .pipeline_info import PipelineInfo from .pipeline_base import PipelineBase from .engine import Engine from .null_engine import NullEngine from .off_screen_engine import OffScreenEngine from .module_manager import ModuleManager from .source import Source from .scene import Scene from .filter import Filter from .module import Module mayavi-4.5.0/mayavi/core/base.py0000644000076500000240000004104212747716313017130 0ustar prabhustaff00000000000000"""The base object from which all MayaVi pipeline objects derive. """ # Author: Prabhu Ramachandran # Copyright (c) 2005-2015, Enthought, Inc. # License: BSD Style. # Standard library imports. import pickle from copy import deepcopy import os import logging import imp # Enthought library imports. from traits.api import (Any, Instance, Property, Bool, Str, Python, HasTraits, WeakRef, on_trait_change) from traitsui.api import TreeNodeObject from tvtk.pyface.tvtk_scene import TVTKScene from apptools.persistence import state_pickler from pyface.resource.api import resource_path from pyface.image_resource import ImageResource from traitsui.menu import Menu, Action, Separator from traitsui.api import View from apptools.scripting.api import Recorder # Local imports. from tvtk.common import is_old_pipeline from mayavi.preferences.api import preference_manager from mayavi.core.common import get_engine # Setup a logger for this module. logger = logging.getLogger(__name__) # Subdirectory that the Base class will check for possible external views. UI_DIR_NAME = ['ui'] #------------------------------------------------------------------------------- # The core tree node menu actions: #------------------------------------------------------------------------------- NewAction = 'NewAction' CopyAction = Action(name = 'Copy', action = 'editor._menu_copy_node', enabled_when = 'editor._is_copyable(object)' ) CutAction = Action(name = 'Cut', action = 'editor._menu_cut_node', enabled_when = 'editor._is_cutable(object)' ) PasteAction = Action(name = 'Paste', action = 'editor._menu_paste_node', enabled_when = 'editor._is_pasteable(object)' ) DeleteAction = Action(name = 'Delete', action = 'editor._menu_delete_node', enabled_when = 'editor._is_deletable(object)' ) RenameAction = Action(name = 'Rename', action = 'editor._menu_rename_node', enabled_when = 'editor._is_renameable(object)' ) standard_menu_actions = [Separator(), CutAction, CopyAction, PasteAction, Separator(), RenameAction, DeleteAction, Separator(), ] ###################################################################### # `Base` class. ###################################################################### class Base(TreeNodeObject): # The version of this class. Used for persistence. __version__ = 0 ######################################## # Traits # The scene (RenderWindow) associated with this component. scene = Instance(TVTKScene, record=False) # Is this object running as part of the mayavi pipeline. running = Property(Bool, record=False) # The object's name. name = Str('') # The default icon. icon = 'module.ico' # The human readable type for this object type = Str('', record=False) # Is this object visible or not. visible = Bool(True, desc='if the object is visible') # Extend the children list with an AdderNode when a TreeEditor needs it. children_ui_list = Property(depends_on=['children'], record=False) # The parent of this object, i.e. self is an element of the parents # children. If there is no notion of a parent/child relationship # this trait is None. parent = WeakRef(record=False) # A helper for the right click menus, context sensitivity etc. menu_helper = Instance(HasTraits, record=False) # Our recorder. recorder = Instance(Recorder, record=False) ################################################## # Private traits _is_running = Bool(False) # This is used to save the state of the object when it is not # running. When the object "starts", the state is loaded. This # is done because a stopped object will not have a meaningful VTK # pipeline setup, so setting its state will lead to all kinds of # errors. _saved_state = Any('') # Hide and show actions _HideShowAction = Instance(Action, kw={'name': 'Hide/Show', 'action': 'object._hideshow'}, ) # The menu shown on right-click for this. _menu = Instance(Menu, transient=True) # Path to the icon for this object. _icon_path = Str() # Adder node: a dialog to add children to this object _adder_node_class = None # Name of the file that may host the hand-crafted view _view_filename = Str(transient=True) # Hand crafted view. _module_view = Instance(View, transient=True) # Work around problem with HasPrivateTraits. __ = Python ################################################## ###################################################################### # `object` interface ###################################################################### def __get_pure_state__(self): """Method used by the state_pickler. """ d = self.__dict__.copy() for attr in ('scene', '_is_running', '__sync_trait__', '__traits_listener__', '_icon_path', '_menu', '_HideShowAction', 'menu_helper', 'parent', 'parent_', '_module_view', '_view_filename', 'mlab_source'): d.pop(attr, None) return d def __getstate__(self): """Allows standard pickle to work via the state_pickler. """ return state_pickler.dumps(self) def __setstate__(self, str_state): """Allows standard pickle to work via the state_pickler. """ self.__init__() # Get the state from the string and update it. state = state_pickler.loads_state(str_state) state_pickler.update_state(state) # Save the state and load it if we are running. self._saved_state = pickle.dumps(state) if self.running: self._load_saved_state() def __deepcopy__(self, memo): """Method used by copy.deepcopy(). This also uses the state_pickler to work correctly. """ # Create a new instance. new = self.__class__() # If we have a saved state, use it for the new instance. If # not, get our state and save that. saved_state = self._saved_state if len(saved_state) == 0: state = state_pickler.get_state(self) #FIXME: This is for streamline seed point widget position which #does not get serialized correctly if not is_old_pipeline(): try: st = state.children[0].children[4] l_pos = st.seed.widget.position st.seed.widget.position = [pos.item() for pos in l_pos] except (IndexError, AttributeError): pass saved_state = pickle.dumps(state) new._saved_state = saved_state # In the unlikely case that a new instance is running, load # the saved state. if new.running: new._load_saved_state() return new ###################################################################### # `Base` interface ###################################################################### def start(self): """Invoked when this object is added to the mayavi pipeline. """ self.running = True self._load_saved_state() def stop(self): """Invoked when this object is removed from the mayavi pipeline. """ self.running = False def add_child(self, child): """This method intelligently adds a child to this object in the MayaVi pipeline. """ raise NotImplementedError def remove_child(self, child): """Remove specified child from our children. """ raise NotImplementedError() def remove(self): """Remove ourselves from the mayavi pipeline. """ if self.parent is not None: e = get_engine(self) self.parent.remove_child(self) if e.current_object is self: e.current_object = self.parent def render(self): """Invokes render on the scene, this in turn invokes Render on the VTK pipeline. """ s = self.scene if s is not None: s.render() def dialog_view(self): """ Returns a view with an icon and a title. """ view = self.trait_view() icon = self._icon_path + os.sep + 'images' + os.sep \ + self.icon view.icon = ImageResource(icon) view.title = "Edit%s: %s" % (self.type, self.name) view.buttons = ['OK', 'Cancel'] return view def trait_view(self, name = None, view_element = None ): """ Gets or sets a ViewElement associated with an object's class. Overridden here to search for a separate file in the same directory for the view to use for this object. The view should be declared in the file named _view. If a file with this name is not found, the trait_view method on the base class will be called. """ # If a name is specified, then call the HasTraits trait_view method # which will return (or assign) the *view_element* associated with # *name*. if name: return super(Base, self).trait_view(name, view_element) view = self._load_view_cached(name, view_element) # Uncomment this when developping views. #view = self._load_view_non_cached(name, view_element) return view ###################################################################### # `TreeNodeObject` interface ###################################################################### def tno_get_label(self, node): """Gets the label to display for a specified object. """ if self.name == '': self.name = self.__class__.__name__ return self.name def tno_get_view(self, node): """Gets the View to use when editing an object. """ view = self.trait_view() view.kind = 'subpanel' return view def tno_confirm_delete(self, node): """Confirms that a specified object can be deleted or not. """ if preference_manager.root.confirm_delete: return None else: return True def tno_get_menu ( self, node ): """ Returns the contextual pop-up menu. """ if self._menu is None: return super(Base, self).tno_get_menu(node) return self._menu def tno_get_icon(self, node, is_expanded): return self.icon def tno_get_icon_path(self, node): return self._icon_path def tno_delete_child(self, node, index): if len(self.children_ui_list) > len(self.children): del self.children[index - 1] else: del self.children[index] def tno_append_child(self, node, child): """ Appends a child to the object's children. """ self.children.append(child) def tno_insert_child(self, node, index, child): """ Inserts a child into the object's children. """ if len(self.children_ui_list) > len(self.children): idx = index -1 else: idx = index self.children[idx:idx] = [child] ###################################################################### # Non-public interface ###################################################################### def _get_running(self): return self._is_running def _set_running(self, new): if self._is_running == new: return else: old = self._is_running self._is_running = new self.trait_property_changed('running', old, new) def _get_children_ui_list(self): """ Getter for Traits Property children_ui_list. For the base class, do not add anything to the children list. """ if ((not preference_manager.root.show_helper_nodes or len(self.children) > 0) or self._adder_node_class is None or (not self.type == ' scene' and 'none' in self.output_info.datasets) # We can't use isinstance, as we would have circular # imports ): return self.children else: return [self._adder_node_class(object=self),] @on_trait_change('children[]') def _trigger_children_ui_list(self, old, new): """ Trigger a children_ui_list change when scenes changed. """ self.trait_property_changed('children_ui_list', old, new) def _visible_changed(self , value): # A hack to set the name when the tree view is not active. # `self.name` is set only when tno_get_label is called and this # is never called when the tree view is not shown leading to an # empty name. if len(self.name) == 0: self.tno_get_label(None) if value: #self._HideShowAction.name = "Hide" self.name = self.name.replace(' [Hidden]', '') else: #self._HideShowAction.name = "Show" n = self.name if ' [Hidden]' not in n: self.name = "%s [Hidden]" % n def _load_view_cached(self, name, view_element): """ Use a cached view for the object, for faster refresh. """ if self._module_view is not None: view = self._module_view else: logger.debug("No view found for [%s] in [%s]. " "Using the base class trait_view instead.", self, self._view_filename) view = super(Base, self).trait_view(name, view_element) return view def _load_view_non_cached(self, name, view_element): """ Loads the view by execing a file. Useful when tweaking views. """ result = {} view_filename = self._view_filename try: exec(compile( open(view_filename).read(), view_filename, 'exec'), {}, result ) view = result['view'] except IOError: logger.debug("No view found for [%s] in [%s]. " "Using the base class trait_view instead.", self, view_filename) view = super(Base, self).trait_view(name, view_element) return view def _hideshow(self): if self.visible: self.visible = False else: self.visible = True def _load_saved_state(self): """Load the saved state (if any) of this object. """ saved_state = self._saved_state if len(saved_state) > 0: state = pickle.loads(saved_state) if hasattr(self, '__set_pure_state__'): self.__set_pure_state__(state) else: state_pickler.set_state(self, state) self._saved_state = '' def __view_filename_default(self): """ The name of the file that will host the view. """ module = self.__module__.split('.') class_filename = module[-1] + '.py' module_dir_name = module[1:-1] base_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) view_filename = os.path.join(*([base_dir] + module_dir_name \ + UI_DIR_NAME + [class_filename])) return view_filename def __module_view_default(self): """ Try to load a view for this object. """ view_filename = self._view_filename try: result = imp.load_module('view', open(view_filename, 'r'), view_filename, ('.py', 'U', 1)) view = result.view except: view = None return view def __menu_default(self): extras = [] if self.menu_helper is not None: extras = self.menu_helper.actions + self._extra_menu_items() menu_actions = [Separator()] + extras + \ [Separator(), self._HideShowAction, Separator()] + \ deepcopy(standard_menu_actions) return Menu( *menu_actions) def __icon_path_default(self): return resource_path() def _extra_menu_items(self): """Override this to generate any new menu actions you want on the right click menu.""" return [] mayavi-4.5.0/mayavi/core/common.py0000644000076500000240000001133212747716313017505 0ustar prabhustaff00000000000000"""Common utility functions and classes. This includes error/warning messages etc. """ # Author: Prabhu Ramachandran # Copyright (c) 2005-2008, Enthought, Inc. # License: BSD Style. # Standard library imports. import sys import traceback import logging import vtk # Enthought library imports. from apptools.persistence.state_pickler import create_instance from traits.etsconfig.api import ETSConfig if ETSConfig.toolkit in ('null', ''): pyface = None else: from pyface import api as pyface # Setup a logger for this module. logger = logging.getLogger(__name__) ###################################################################### # Utility functions. ###################################################################### def debug(msg): """Handle a debug message. """ logger.debug(msg) def warning(msg, parent=None): """Handle a warning message. """ logger.warn(msg) if pyface is not None: pyface.warning(parent, msg) def error(msg, parent=None): """Handle an error message. """ logger.error(msg) if pyface is not None: pyface.error(parent, msg) def exception(msg='Exception', parent=None): """This function handles any exception derived from Exception and prints out an error. The optional `parent` argument is passed along to the dialog box. The optional `msg` is printed and sent to the logger. So you could send extra information here. """ try: type, value, tb = sys.exc_info() info = traceback.extract_tb(tb) filename, lineno, function, text = info[-1] # last line only exc_msg = "%s\nIn %s:%d\n%s: %s (in %s)" %\ (msg, filename, lineno, type.__name__, str(value), function) # Log and display the message. logger.exception(msg) if pyface is not None: pyface.error(parent, exc_msg, title='Exception') finally: type = value = tb = None # clean up def process_ui_events(): """Process GUI events. This function merely abstracts the function so nothing is done when no UI is running. """ if pyface is not None: pyface.GUI.process_events() def get_engine(obj): """Try and return the engine given an object in the mayavi pipeline. This basically walks up the parent's of the object till the engine is found. """ from mayavi.core.engine import Engine while obj is not None: if isinstance(obj, Engine): return obj else: obj = obj.parent return None def get_output(obj): """Given an object, extracts the output object, hiding differences between old and new pipeline.""" if obj.is_a('vtkDataSet'): return obj else: return obj.output def get_object_path(object, parent, path='engine'): """Given a mayavi object on the tree view, this should find its "path" with respect to the parent object that contains it. """ def _get_child_trait(obj): if hasattr(obj, 'scenes'): return 'scenes' elif hasattr(obj, 'children'): return 'children' return '' def _finder(obj, to_find, path): if obj is to_find: return path else: child_t = _get_child_trait(obj) if child_t == '': return '' for i, o in enumerate(getattr(obj, child_t)): pth = _finder(o, to_find, '%s.%s[%d]'%(path, child_t, i)) if len(pth) > 0: return pth return '' return _finder(parent, object, path) def handle_children_state(children, kids): """Given a list of children (as `children`) of a particular object and their states in the `kids` argument, this function sets up the children by removing unnecessary ones, fixing existing ones and adding new children if necessary (depending on the state). """ # Make a copy of the list so adding/removing does not trigger events # each time. m_children = list(children) n_child, n_kid = len(m_children), len(kids) # Remove extra children we have. for i in range(n_child - n_kid): m_children.pop() # Now check existing children deleting existing ones and # creating new ones if needed. for i in range(n_child): child, kid = m_children[i], kids[i] md = kid.__metadata__ if (child.__module__ != md['module']) \ or (child.__class__.__name__ != md['class_name']): m_children[i] = create_instance(kid) # Add any extra kids. for i in range(n_kid - n_child): child = create_instance(kids[n_child + i]) m_children.append(child) # Now set the children in one shot. children[:] = m_children mayavi-4.5.0/mayavi/core/component.py0000644000076500000240000001223312747716313020220 0ustar prabhustaff00000000000000"""The base class for all MayaVi components. """ # Author: Prabhu Ramachandran # Copyright (c) 2005, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import List # Local imports. from mayavi.core.pipeline_base import PipelineBase ###################################################################### # `Component` class. ###################################################################### class Component(PipelineBase): # The version of this class. Used for persistence. __version__ = 0 # A list of inputs for this component. inputs = List(record=False) # A list of sources for this component. sources = List(record=False) ###################################################################### # `object` interface ###################################################################### def __init__(self, **traits): super(Component, self).__init__(**traits) # Let the filter setup its pipeline. self.setup_pipeline() def __get_pure_state__(self): d = super(Component, self).__get_pure_state__() # Remove dynamically set things. for x in ['inputs', 'sources']: d.pop(x, None) return d ###################################################################### # `Component` interface ###################################################################### def setup_pipeline(self): """Override this method so that it *creates* its tvtk pipeline. This method is invoked when the object is initialized via `__init__`. Note that at the time this method is called, the tvtk data pipeline will *not* yet be setup. So upstream data will not be available. The idea is that you simply create the basic objects and setup those parts of the pipeline not dependent on upstream sources and filters. """ pass def update_pipeline(self): """Override this method so that it *updates* the tvtk pipeline when data upstream is known to have changed. This method is invoked (automatically) when the input fires a `pipeline_changed` event. """ raise NotImplementedError def update_data(self): """Override this method to do what is necessary when upstream data changes. This method is invoked (automatically) when any of the inputs sends a `data_changed` event. """ # Invoke render to update any changes. self.render() # Propagate the data_changed event. self.data_changed = True ###################################################################### # `Base` interface ###################################################################### def start(self): """This is invoked when this object is added to the mayavi pipeline. Note that when start is invoked, all the other information for the pipeline should be already set. """ # Do nothing if we are already running. if self.running: return # Setup event handlers. self._setup_event_handlers() # Update the pipeline. self.update_pipeline() # Call parent method to set the state. super(Component, self).start() def stop(self): """Invoked when this object is removed from the mayavi pipeline. """ if not self.running: return # Teardown event handlers. self._teardown_event_handlers() # Call parent method to set the state. super(Component, self).stop() ###################################################################### # Non-public interface ###################################################################### def _inputs_changed(self, old, new): if self.running: self.update_pipeline() self._setup_events(old, new) def _inputs_items_changed(self, list_event): if self.running: self.update_pipeline() self._setup_events(list_event.removed, list_event.added) def _sources_changed(self, old, new): if self.running: self.update_pipeline() self._setup_events(old, new) def _sources_items_changed(self, list_event): if self.running: self.update_pipeline() self._setup_events(list_event.removed, list_event.added) def _setup_event_handlers(self): self._setup_events([], self.inputs) self._setup_events([], self.sources) def _teardown_event_handlers(self): self._setup_events(self.inputs, []) self._setup_events(self.sources, []) def _setup_events(self, removed, added): for object in removed: object.on_trait_event(self.update_pipeline, 'pipeline_changed', remove=True) object.on_trait_event(self.update_data, 'data_changed', remove=True) for object in added: object.on_trait_event(self.update_pipeline, 'pipeline_changed') object.on_trait_event(self.update_data, 'data_changed') mayavi-4.5.0/mayavi/core/customize.py0000644000076500000240000000756012747716313020247 0ustar prabhustaff00000000000000""" This module helps customize the mayavi install. It tries to import any `site_mayavi.py` (anywhere on `sys.path`) or `user_mayavi.py`. The `user_mayavi.py` script is found in the users `~/.mayavi2` directory and this directory is also injected into the path. It is the users responsibility to import the mayavi registry (mayavi.registry:registry) and register any new modules or filters into mayavi using suitable metadata. If the user desires to contribute any plugins then they may expose a function called `get_plugins()` which returns a list of plugins that they wish to add to the default mayavi envisage app. The user may expose one set of global plugins in the `site_mayavi` module and another in the `user_mayavi` module without any problems. The function `get_custom_plugins` returns a list of all the available custom plugins. """ # Author: Prabhu Ramachandran # Copyright (c) 2008-2015, Prabhu Ramachandran, Enthought, Inc. # License: BSD Style. from __future__ import print_function # Standard library imports. import sys import traceback from os.path import join, exists # Enthought library imports. from traits.util.home_directory import get_home_directory from mayavi.preferences.api import preference_manager # The functions that return the plugins. _get_global_plugins = lambda: [] _get_user_plugins = lambda: [] # First try the global mayavi customizations. try: # This will import site_mayavi, so any plugin registrations done # there will be run. from site_mayavi import get_plugins as _get_global_plugins except ImportError: pass # Now do any local user level customizations. # # The following code obtains any customizations and that are imported # from a `user_mayavi.py` provided by the user in their `~/.mayavi2` # directory. # # Note that `~/.mayavi2` is placed in `sys.path` so make sure that you # choose your module names carefully (so as not to override any common # module names). home = get_home_directory() m2dir = join(home, '.mayavi2') user_module = join(m2dir, 'user_mayavi.py') if exists(user_module): # Add ~/.mayavi2 to sys.path. sys.path.append(m2dir) # Doing an import gives user information on any errors. import user_mayavi try: # Now try and import the user defined plugin extension. from user_mayavi import get_plugins as _get_user_plugins except ImportError: # user_mayavi may not be adding any new plugins. pass # Now handle any contributions that the user has chosen via the # preferences. def _import_contrib(pkg): mod = None try: components = pkg.split('.') if len(components) > 1: mod_name = '.'.join(components[:-1]) sym_name = components[-1] mod = __import__(mod_name, globals(), locals(), [sym_name], level=0) mod = getattr(mod, sym_name) else: mod_name = components[0] mod = __import__(mod_name, globals(), locals(), [mod_name], level=0) except Exception: print("*"*80) traceback.print_exc(file=sys.stdout) print("*"*80) return mod def add_contributions(): """Import any contributions that the user has selected via preferences.""" for pkg in preference_manager.root.contrib_packages: _import_contrib(pkg + '.user_mayavi') def get_contrib_plugins(): """Get plugins requested by different contributions.""" plugins = [] for pkg in preference_manager.root.contrib_packages: mod = _import_contrib(pkg + '.user_mayavi') if mod is not None and hasattr(mod, 'get_plugins'): plugins.extend(mod.get_plugins()) return plugins # Import the contributions. add_contributions() def get_custom_plugins(): """Convenience function that returns all customization plugins as a list. """ return _get_global_plugins() + _get_user_plugins() + \ get_contrib_plugins() mayavi-4.5.0/mayavi/core/dataset_manager.py0000644000076500000240000002240612747716313021340 0ustar prabhustaff00000000000000""" Code to help with managing a TVTK data set in Pythonic ways. """ # Author: Prabhu Ramachandran # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. from traits.api import (HasTraits, Instance, Array, Str, Property, Dict) from tvtk.api import tvtk from tvtk.array_handler import array2vtk import tvtk.common as tvtk_common ###################################################################### # Utility functions. ###################################################################### def get_array_type(arr): """Returns if the array is a scalar ('scalars'), vector ('vectors') or tensor ('tensors'). It looks at the number of components to decide. If it has a wierd number of components it returns the empty string. """ n = arr.number_of_components ret = {1: 'scalars', 3: 'vectors', 4: 'scalars', 9:'tensors'} return ret.get(n) or '' def get_attribute_list(data): """ Gets scalar, vector and tensor information from the given data (either cell or point data). """ attr = {'scalars':[], 'vectors':[], 'tensors':[]} if data is not None: n = data.number_of_arrays for i in range(n): name = data.get_array_name(i) t = get_array_type(data.get_array(i)) if len(t) > 0 and name is not None: attr[t].extend([name]) def _mk_first(lst, value): """Makes the specified `value` the first item in `lst`.""" lst.remove(value) lst.insert(0, value) attr1 = attr.copy() for a in attr: v = getattr(data, a) if v is not None: name = v.name if name is not None: try: _mk_first(attr[a], v.name) except ValueError: # Sometimes we have a multi-component scalar. attr1[a].insert(0, name) return attr1 def get_all_attributes(obj): """Gets the scalar, vector and tensor attributes that are available in the given VTK data object. """ point_attr = get_attribute_list(obj.point_data) cell_attr = get_attribute_list(obj.cell_data) return point_attr, cell_attr ################################################################################ # `DatasetManager` class. ################################################################################ class DatasetManager(HasTraits): # The TVTK dataset we manage. dataset = Instance(tvtk.DataSet) # Our output, this is the dataset modified by us with different # active arrays. output = Property(Instance(tvtk.DataSet)) # The point scalars for the dataset. You may manipulate the arrays # in-place. However adding new keys in this dict will not set the # data in the `dataset` for that you must explicitly call # `add_array`. point_scalars = Dict(Str, Array) # Point vectors. point_vectors = Dict(Str, Array) # Point tensors. point_tensors = Dict(Str, Array) # The cell scalars for the dataset. cell_scalars = Dict(Str, Array) cell_vectors = Dict(Str, Array) cell_tensors = Dict(Str, Array) # This filter allows us to change the attributes of the data # object and will ensure that the pipeline is properly taken care # of. Directly setting the array in the VTK object will not do # this. _assign_attribute = Instance(tvtk.AssignAttribute, args=(), allow_none=False) ###################################################################### # Public interface. ###################################################################### def add_array(self, array, name, category='point'): """ Add an array to the dataset to specified category ('point' or 'cell'). """ assert len(array.shape) <= 2, "Only 2D arrays can be added." data = getattr(self.dataset, '%s_data'%category) if len(array.shape) == 2: assert array.shape[1] in [1, 3, 4, 9], \ "Only Nxm arrays where (m in [1,3,4,9]) are supported" va = tvtk.to_tvtk(array2vtk(array)) va.name = name data.add_array(va) mapping = {1:'scalars', 3: 'vectors', 4: 'scalars', 9: 'tensors'} dict = getattr(self, '%s_%s'%(category, mapping[array.shape[1]])) dict[name] = array else: va = tvtk.to_tvtk(array2vtk(array)) va.name = name data.add_array(va) dict = getattr(self, '%s_scalars'%(category)) dict[name] = array def remove_array(self, name, category='point'): """Remove an array by its name and optional category (point and cell). Returns the removed array. """ type = self._find_array(name, category) data = getattr(self.dataset, '%s_data'%category) data.remove_array(name) d = getattr(self, '%s_%s'%(category, type)) return d.pop(name) def rename_array(self, name1, name2, category='point'): """Rename a particular array from `name1` to `name2`. """ type = self._find_array(name1, category) data = getattr(self.dataset, '%s_data'%category) arr = data.get_array(name1) arr.name = name2 d = getattr(self, '%s_%s'%(category, type)) d[name2] = d.pop(name1) def activate(self, name, category='point'): """Make the specified array the active one. """ type = self._find_array(name, category) self._activate_data_array(type, category, name) def update(self): """Update the dataset when the arrays are changed. """ self.dataset.modified() self._assign_attribute.update() ###################################################################### # Non-public interface. ###################################################################### def _dataset_changed(self, value): self._setup_data() tvtk_common.configure_input_data(self._assign_attribute, value) def _get_output(self): return self._assign_attribute.output def _setup_data(self): """Updates the arrays from what is available in the input data. """ input = self.dataset pnt_attr, cell_attr = get_all_attributes(input) self._setup_data_arrays(cell_attr, 'cell') self._setup_data_arrays(pnt_attr, 'point') def _setup_data_arrays(self, attributes, d_type): """Given the dict of the attributes from the `get_all_attributes` function and the data type (point/cell) data this will setup the object and the data. """ attrs = ['scalars', 'vectors', 'tensors'] aa = self._assign_attribute input = self.dataset data = getattr(input, '%s_data'%d_type) for attr in attrs: values = attributes[attr] # Get the arrays from VTK, create numpy arrays and setup our # traits. arrays = {} for name in values: va = data.get_array(name) npa = va.to_array() # Now test if changes to the numpy array are reflected # in the VTK array, if they are we are set, else we # have to set the VTK array back to the numpy array. if len(npa.shape) > 1: old = npa[0,0] npa[0][0] = old - 1 if abs(va[0][0] - npa[0,0]) > 1e-8: va.from_array(npa) npa[0][0] = old else: old = npa[0] npa[0] = old - 1 if abs(va[0] - npa[0]) > 1e-8: va.from_array(npa) npa[0] = old arrays[name] = npa setattr(self, '%s_%s'%(d_type, attr), arrays) def _activate_data_array(self, data_type, category, name): """Activate (or deactivate) a particular array. Given the nature of the data (scalars, vectors etc.) and the type of data (cell or points) it activates the array given by its name. Parameters: ----------- data_type: one of 'scalars', 'vectors', 'tensors' category: one of 'cell', 'point'. name: string of array name to activate. """ input = self.dataset data = None data = getattr(input, category + '_data') method = getattr(data, 'set_active_%s'%data_type) if len(name) == 0: # If the value is empty then we deactivate that attribute. method(None) else: aa = self._assign_attribute method(name) aa.assign(name, data_type.upper(), category.upper() +'_DATA') aa.update() def _find_array(self, name, category='point'): """Return information on which kind of attribute contains the specified named array in a particular category.""" types = ['scalars', 'vectors', 'tensors'] for type in types: attr = '%s_%s'%(category, type) d = getattr(self, attr) if name in d.keys(): return type raise KeyError('No %s array named %s available in dataset' %(category, name)) mayavi-4.5.0/mayavi/core/engine.py0000644000076500000240000005414412747716313017472 0ustar prabhustaff00000000000000"""The Mayavi engine. This class manages the Mayavi objects at the highest level. """ # Author: Prabhu Ramachandran # Copyright (c) 2005-2015, Enthought, Inc. # License: BSD Style. # Standard library imports. # VTK is used to just shut off the warnings temporarily. try: import vtk except ImportError as m: m.args = ('%s\n%s\nDo you have vtk and its Python bindings installed properly?' % (m.args[0], '_'*80),) raise # Enthought library imports. from traits.api import (HasStrictTraits, List, Str, Property, Instance, Event, HasTraits, Callable, Dict, Bool, on_trait_change, WeakRef) from traitsui.api import View, Item from apptools.persistence import state_pickler from apptools.scripting.api import Recorder, recordable # Local imports. from tvtk.common import is_old_pipeline from mayavi.core.base import Base from mayavi.core.scene import Scene from mayavi.core.common import error, process_ui_events from mayavi.core.registry import registry from mayavi.core.adder_node import AdderNode, SceneAdderNode from mayavi.preferences.api import preference_manager from mayavi.core.ui.mayavi_scene import viewer_factory ###################################################################### # Utility functions. ###################################################################### def _id_generator(): """Returns a sequence of numbers for the title of the scene window.""" n = 1 while True: yield(n) n += 1 scene_id_generator = _id_generator() def get_args(function): """ Simple inspect-like function to inspect the arguments a function takes. """ return function.__code__.co_varnames[:function.__code__.co_argcount] ###################################################################### # `Engine` class ###################################################################### class Engine(HasStrictTraits): """ The Mayavi engine base class. """ # The version of this class. Used for persistence. __version__ = 0 # The scenes associated with this project. scenes = List(Scene, record=True) # The list to provide to a TreeEditor. Always add on a AdderNode. # TODO: It makes more sense to put the modification of the list # in some other UI module, and not here. children_ui_list = Property(record=False) # Our name. name = Str('Mayavi Engine') # Current scene. current_scene = Property(Instance(Scene), record=False) # Current object. current_object = Property(record=False) # Current selection -- the currently selected object on the tree. current_selection = Property(record=False) # Has the Engine started? Use this event to do something after # the engine has been started. started = Event(record=False) # An optional callable that will generate a usable new viewer # containing a `tvtk.pyface.TVTKScene` instance. Ideally # the viewer should have an interface like # `tvtk.pyface.TVTKWindow` -- basically it must # implement the `closing` and `activated` events, however, this is # not necessary. The created viewer is used by the `new_scene` # method to create a new Viewer. This is a mechanism to use a # user specified scene with the Engine and have the ability to # load saved visualizations using the new scene. Handy for things # like off-screen rendering. scene_factory = Callable(viewer_factory) # Are we running? running = Bool(False, record=False) # This event is invoked when the engine has been stopped. closed = Event() # The recorder for script recording. recorder = Instance(Recorder, record=False) ######################################## # Private traits. _current_scene = WeakRef(Scene, allow_none=True) _current_object = WeakRef(HasTraits, allow_none=True) _current_selection = WeakRef(HasTraits, allow_none=True) _viewer_ref = Dict # View related traits. current_selection_view = View(Item(name='_current_selection', enabled_when='_current_selection is not None', style='custom', springy=True, show_label=False,), resizable=True, scrollable=True ) ###################################################################### # `object` interface ###################################################################### def __init__(self, **traits): super(Engine, self).__init__(**traits) # FIXME: This is tied to preferences. It really should not be # we need to use bind_preferences here. # To remove ref cycle with root preferences helper, the trait change # handler is an instance method preference_manager.root.on_trait_change(self._show_helper_nodes_changed, 'show_helper_nodes') def __get_pure_state__(self): d = self.__dict__.copy() for x in ['_current_scene', '_current_object', '__sync_trait__', '_viewer_ref', '__traits_listener__']: d.pop(x, None) return d def __set_pure_state__(self, state): # Current number of scenes. n_scene = len(self.scenes) # Number of scenes in saved state. n_saved_scene = len(state.scenes) # Remove extra ones. for i in range(n_scene - n_saved_scene): self.close_scene(self.scenes[-1]) # Add new ones. for i in range(n_saved_scene - n_scene): self.new_scene() # Set the state. state_pickler.set_state(self, state) def __getstate__(self): return state_pickler.dumps(self) def __setstate__(self, str_state): self.__init__() state = state_pickler.loads_state(str_state) state_pickler.update_state(state) self.__set_pure_state__(state) ###################################################################### # `Engine` interface ###################################################################### def start(self): """This is called by the plugin when the plugin actually starts.""" registry.register_engine(self) # Notify any listeners that the engine is started. self.started = self self.running = True def stop(self): registry.unregister_engine(self) self.running = False self.closed = True @recordable def add_source(self, src, scene=None): """Adds a source to the pipeline. Uses the current scene unless a scene is given in the scene keyword argument.""" passed_scene = scene if scene is not None: tvtk_scene = scene.scene for sc in self.scenes: if sc.scene == tvtk_scene: scene = sc break else: error('This scene is not managed by mayavi') return else: scene = self.current_scene # Create a new scene if none is available. if scene is None: self.new_scene() scene = self.current_scene scene.add_child(src) self.current_object = src @recordable def add_filter(self, fil, obj=None): """Adds a filter to the pipeline at an appropriate point. Adds it to the selected object, or to an object passed as the kwarg `obj`. """ passed_obj = obj if obj is None: obj = self.current_object if not isinstance(obj, Base): msg = 'No valid current object, '\ 'please select an active object.' error(msg) return if (obj is not None) and (not isinstance(obj, Scene)): if obj.running: obj.add_child(fil) self.current_object = fil else: msg = 'Current object is not active, '\ 'please select an active object.' error(msg) else: if obj is None: error('Please create a VTK scene and open some data first.') else: error('No data: cannot use a Filter/Module/ModuleManager.') @recordable def add_module(self, mod, obj=None): """Adds a module to the pipeline at an appropriate point. Adds it to the selected object, or to an object passed through the kwarg `obj`. """ self.add_filter(mod, obj=obj) @recordable def save_visualization(self, file_or_fname): """Given a file or a file name, this saves the current visualization to the file. """ # Save the state of VTK's global warning display. o = vtk.vtkObject w = o.GetGlobalWarningDisplay() o.SetGlobalWarningDisplay(0) # Turn it off. try: #FIXME: This is for streamline seed point widget position which #does not get serialized correctly if is_old_pipeline(): state_pickler.dump(self, file_or_fname) else: state = state_pickler.get_state(self) st = state.scenes[0].children[0].children[0].children[4] l_pos = st.seed.widget.position st.seed.widget.position = [pos.item() for pos in l_pos] saved_state = state_pickler.dumps(state) file_or_fname.write(saved_state) except (IndexError, AttributeError): state_pickler.dump(self, file_or_fname) finally: # Reset the warning state. o.SetGlobalWarningDisplay(w) @recordable def load_visualization(self, file_or_fname): """Given a file/file name this loads the visualization.""" # Save the state of VTK's global warning display. o = vtk.vtkObject w = o.GetGlobalWarningDisplay() o.SetGlobalWarningDisplay(0) # Turn it off. try: # Get the state from the file. state = state_pickler.load_state(file_or_fname) state_pickler.update_state(state) # Add the new scenes. for scene_state in state.scenes: self.new_scene() scene = self.scenes[-1] # Disable rendering initially. if scene.scene is not None: scene.scene.disable_render = True # Update the state. state_pickler.update_state(scene_state) scene.__set_pure_state__(scene_state) # Setting the state will automatically reset the # disable_render. scene.render() finally: # Reset the warning state. o.SetGlobalWarningDisplay(w) @recordable def open(self, filename, scene=None): """Open a file given a filename if possible in either the current scene or the passed `scene`. """ passed_scene = scene reader = registry.get_file_reader(filename) if reader is None: msg = 'No suitable reader found for the file %s'%filename error(msg) else: src = None if scene is None: scene = self.current_scene if scene is None: scene = self.new_scene() try: sc = scene.scene if sc is not None: sc.busy = True callable = reader.get_callable() if reader.factory is None: src = callable() src.initialize(filename) else: # Factory functions are passed the filename and a # reference to the engine. src = callable(filename, self) if src is not None: self.add_source(src, passed_scene) finally: if sc is not None: sc.busy = False if src is not None: return src def record(self, msg): """This is merely a convenience method to record messages to the script recorder. """ r = self.recorder if r is not None: r.record(msg) ###################################################################### # Scene creation/deletion related methods. ###################################################################### def add_scene(self, scene, name=None): """Add given `scene` (a `pyface.tvtk.scene.Scene` instance) to the mayavi engine so that mayavi can manage the scene. This is used when the user creates a scene. Note that for the `EnvisageEngine` this is automatically taken care of when you create a new scene using the TVTK scene plugin. Parameters: ----------- scene - `pyface.tvtk.scene.Scene` The scene that needs to be managed from mayavi. name - `str` The name assigned to the scene. It tries to determine the name of the scene from the passed scene instance. If this is not possible it defaults to 'Mayavi Scene'. """ if name is None: if hasattr(scene, 'name'): name = scene.name else: name = 'Mayavi Scene %d'%next(scene_id_generator) s = Scene(scene=scene, name=name, parent=self) s.start() # We don't want the startup setup to be recorded. recorder = self.recorder self.scenes.append(s) self.current_scene = s if recorder is not None: recorder.register(s) @recordable def remove_scene(self, scene, **kwargs): """Remove a given `scene` (a `pyface.tvtk.scene.Scene` instance) from the mayavi engine if it is already being managed by mayavi. Note that for the `EnvisageEngine` this is automatically taken care of when you close a scene started using the TVTK scene plugin. Parameters: ----------- scene - `pyface.tvtk.scene.Scene` The scene that needs to be removed from mayavi. """ s = None for index, x in enumerate(self.scenes): if x.scene is scene: s = x break if s is not None: s.stop() self.scenes.remove(s) # Don't record it shutting down. To do this we must # unregister it here so we don't record unnecessary calls. recorder = self.recorder if recorder is not None: recorder.unregister(s) # Remove the reference to the viewer if any. if scene in self._viewer_ref: del self._viewer_ref[scene] # Clear the current scene if it has been removed. if scene is self._current_scene: self._current_scene = None @recordable def new_scene(self, viewer=None, name=None, **kwargs): """Create or manage a new VTK scene window. If no `viewer` argument is provided, the method creates a new viewer using `self.scene_factory`. If `self.scene_factory` is `None` then it creates an `ivtk` viewer. This code requires that the `viewer` has a `scene` attribute/trait that is a `pyface.tvtk.scene.Scene`. It also works best if the viewer supports `closing` and `activated` events. The method returns the created viewer. Parameters: ----------- viewer - The viewer object, if None, one is created for you. name - The name attribute of the viewer ``**kwargs`` - The extra keyword arguments are passed along to the scene factory. """ if viewer is None: factory_kwargs = {} factory_kwargs_names = get_args(self.scene_factory) for arg, value in kwargs.items(): if arg in factory_kwargs_names: factory_kwargs[arg] = value viewer = self.scene_factory(**factory_kwargs) process_ui_events() if name is not None: viewer.name = name # Hang on to a reference to this viewer, if not done this will cause a # crash with Qt4. This because the viewer will be closed and gc'd if # there isn't a reference to it. When the viewer is gc'd the scene is # also closed and the engine will have a dead scene causing a crash. self._viewer_ref[viewer.scene] = viewer self.add_scene(viewer.scene) if hasattr(viewer, 'on_trait_change'): viewer.on_trait_change(self._on_scene_closed, 'closing') viewer.on_trait_change(self._on_scene_activated, 'activated') if hasattr(viewer, 'title'): self.current_scene.sync_trait('name', viewer, 'title') return viewer @recordable def close_scene(self, scene): """Given a scene created from new_scene, this method closes it and removes the scene from the list of scenes we manage. Parameters: ----------- scene - `pyface.tvtk.scene.Scene` or an object that holds a reference to a `pyface.tvtk.scene.Scene` in a `scene` attribute. """ viewer = self.get_viewer(scene) self.remove_scene(scene.scene) if hasattr(scene, 'close'): scene.close() elif scene.scene is not None: scene.scene.close() if viewer is not None and hasattr(viewer, 'close'): viewer.close() def get_viewer(self, scene): """Return the viewer associated with a given scene. Parameters: ----------- scene - An `mayavi.core.scene.Scene` instance. """ return self._viewer_ref.get(scene.scene) def dialog_view(self): """ Default dialog view for Engine objects. """ return None ###################################################################### # Non-public interface ###################################################################### def _on_select(self, object): """Called by the EngineTree when an object on the view is selected. This basically sets the current object and current scene.""" self.current_selection = object self._current_object = object try: scene = object.scene for s in self.scenes: if s.scene == scene: self._current_scene = s break except AttributeError: pass def _get_current_scene(self): n_scene = len(self.scenes) if n_scene == 0: return None elif n_scene == 1: return self.scenes[0] elif self._current_scene is not None: return self._current_scene elif n_scene > 1: return self.scenes[-1] else: return None def _set_current_scene(self, scene): old = self._current_scene self._current_scene = scene self.trait_property_changed('current_scene', old, scene) def _get_current_object(self): if self._current_object is not None: return self._current_object elif self.current_scene is not None: return self.current_scene else: return None def _set_current_object(self, object): old = self._current_object self._current_object = object self.trait_property_changed('current_object', old, object) def _get_current_selection(self): return self._current_selection def _set_current_selection(self, object): old = self._current_selection if not isinstance(object, (Base, AdderNode)): object = None self._current_selection = object self.trait_property_changed('current_selection', old, object) def _on_scene_closed(self, obj, name, old, new): self.remove_scene(obj.scene) def _on_scene_activated(self, obj, name, old, new): for scene in self.scenes: if scene.scene is obj.scene: self.current_scene = scene break def _closed_fired(self): """ When the engine is closed, clear the viewer ref which otherwise stores references to scenes to prevent crash on QT4. See: self.new_scene and MlabSceneModel._closed_fired """ self._viewer_ref.clear() self.scenes = [] preference_manager.root.on_trait_change(self._show_helper_nodes_changed, 'show_helper_nodes', remove=True) registry.unregister_engine(self) def _show_helper_nodes_changed(self): self.trait_property_changed('children_ui_list', [], self.children_ui_list) def _get_children_ui_list(self): """ Trait getter for children_ui_list Property. """ if preference_manager.root.show_helper_nodes \ and len(self.scenes) == 0: return [SceneAdderNode(object=self)] else: return self.scenes @on_trait_change('scenes[]') def _trigger_children_ui_list(self, old, new): """ Trigger a children_ui_list change when scenes changed. """ self.trait_property_changed('children_ui_list', old, new) def _recorder_changed(self, old, new): if new is not None: new.record('# Recorded script from Mayavi2') new.record('from numpy import array') new.record('try:') new.record(' engine = mayavi.engine') new.record('except NameError:') new.record(' from mayavi.api import Engine') new.record(' engine = Engine()') new.record(' engine.start()') new.record('if len(engine.scenes) == 0:') new.record(' engine.new_scene()') new.record('# ------------------------------------------- ') elif old is not None: old.record('# ------------------------------------------- ') old.record('from mayavi.tools.show import show') old.record('show()') mayavi-4.5.0/mayavi/core/file_data_source.py0000644000076500000240000002574612747716313021523 0ustar prabhustaff00000000000000"""The base file related data source object from which all MayaVi data sources derive. """ # Author: Prabhu Ramachandran # Copyright (c) 2005-2016, Enthought, Inc. # License: BSD Style. # Standard library imports. import re from os.path import split, join, isfile from glob import glob # Enthought library imports. from traits.api import (Any, Bool, Button, Float, List, Str, Instance, Int, Range) from traitsui.api import Group, HGroup, Item, FileEditor, RangeEditor from apptools.persistence.state_pickler import set_state from apptools.persistence.file_path import FilePath # Local imports from mayavi.core.source import Source from mayavi.core.common import handle_children_state ###################################################################### # Utility functions. ###################################################################### def get_file_list(file_name): """ Given a file name, this function treats the file as a part of a series of files based on the index of the file and tries to determine the list of files in the series. The file name of a file in a time series must be of the form 'some_name[0-9]*.ext'. That is the integers at the end of the file determine what part of the time series the file belongs to. The files are then sorted as per this index.""" # The matching is done only for the basename of the file. f_dir, f_base = split(file_name) # Find the head and tail of the file pattern. head = re.sub("[0-9]+[^0-9]*$", "", f_base) tail = re.sub("^.*[0-9]+", "", f_base) pattern = head+"[0-9]*"+tail # Glob the files for the pattern. _files = glob(join(f_dir, pattern)) # A simple function to get the index from the file. def _get_index(f, head=head, tail=tail): base = split(f)[1] result = base.replace(head, '') return float(result.replace(tail, '')) # Before sorting make sure the files in the globbed series are # really part of a timeseries. This can happen in cases like so: # 5_2_1.vtk and 5_2_1s.vtk will be globbed but 5_2_1s.vtk is # obviously not a valid time series file. files = [] for x in _files: try: _get_index(x) except ValueError: pass else: files.append(x) # Sort the globbed files based on the index value. def file_sort(x, y): x1 = _get_index(x) y1 = _get_index(y) if x1 > y1: return 1 elif y1 > x1: return -1 else: return 0 files.sort(key=lambda x:_get_index(x)) return files class NoUITimer(object): """Dummy timer for case where there is no UI. This implements the pyface.timer.Timer API with the only exception that it does not call Start when constructed and start must be called explicitly. """ def __init__(self, millisecs, callable, *args, **kw): self.callable = callable self.args = args self.kw = kw self._is_active = False def Notify(self): try: self.callable(*self.args, **self.kw) except StopIteration: self.Stop() except: self.Stop() raise def Start(self): self._is_active = True while self._is_active: self.Notify() def Stop(self): self._is_active = False def IsRunning(self): return self._is_active ###################################################################### # `FileDataSource` class. ###################################################################### class FileDataSource(Source): # The version of this class. Used for persistence. __version__ = 0 # The list of file names for the timeseries. file_list = List(Str, desc='a list of files belonging to a time series') # The current time step (starts with 0). This trait is a dummy # and is dynamically changed when the `file_list` trait changes. # This is done so the timestep bounds are linked to the number of # the files in the file list. timestep = Range(value=0, low='_min_timestep', high='_max_timestep', enter_set=True, auto_set=False, desc='the current time step') sync_timestep = Bool(False, desc='if all dataset timesteps are synced') play = Bool(False, desc='if timesteps are automatically updated') play_delay = Float(0.2, desc='the delay between loading files') loop = Bool(False, desc='if animation is looped') update_files = Button('Rescan files') base_file_name=Str('', desc="the base name of the file", enter_set=True, auto_set=False, editor=FileEditor()) # A timestep view group that may be included by subclasses. time_step_group = Group( Item(name='file_path', style='readonly'), Group( Item(name='timestep', editor=RangeEditor( low=0, high_name='_max_timestep', mode='slider' ), ), Item(name='sync_timestep'), HGroup( Item(name='play'), Item(name='play_delay', label='Delay'), Item(name='loop'), ), visible_when='len(object.file_list) > 1' ), Item(name='update_files', show_label=False), ) ################################################## # Private traits. ################################################## # The current file name. This is not meant to be touched by the # user. file_path = Instance(FilePath, (), desc='the current file name') _min_timestep = Int(0) _max_timestep = Int(0) _timer = Any ###################################################################### # `object` interface ###################################################################### def __get_pure_state__(self): d = super(FileDataSource, self).__get_pure_state__() # These are obtained dynamically, so don't pickle them. for x in ['file_list', 'timestep', 'play']: d.pop(x, None) return d def __set_pure_state__(self, state): # Use the saved path to initialize the file_list and timestep. fname = state.file_path.abs_pth if not isfile(fname): msg = 'Could not find file at %s\n'%fname msg += 'Please move the file there and try again.' raise IOError(msg) self.initialize(fname) # Now set the remaining state without touching the children. set_state(self, state, ignore=['children', 'file_path']) # Setup the children. handle_children_state(self.children, state.children) # Setup the children's state. set_state(self, state, first=['children'], ignore=['*']) ###################################################################### # `FileDataSource` interface ###################################################################### def initialize(self, base_file_name): """Given a single filename which may or may not be part of a time series, this initializes the list of files. This method need not be called to initialize the data. """ self.base_file_name = base_file_name ###################################################################### # Non-public interface ###################################################################### def _file_list_changed(self, value): # Change the range of the timestep suitably to reflect new list. n_files = len(self.file_list) timestep = max(min(self.timestep, n_files-1), 0) if self.timestep == timestep: self._timestep_changed(timestep) else: self.timestep = timestep self._max_timestep = max(n_files -1, 0) def _file_list_items_changed(self, list_event): self._file_list_changed(self.file_list) def _timestep_changed(self, value): file_list = self.file_list if len(file_list) > 0: self.file_path = FilePath(file_list[value]) else: self.file_path = FilePath('') if self.sync_timestep: for sibling in self._find_sibling_datasets(): sibling.timestep = value def _base_file_name_changed(self, value): self._update_files_fired() try: self.timestep = self.file_list.index(value) except ValueError: self.timestep = 0 def _play_changed(self, value): mm = getattr(self.scene, 'movie_maker', None) if value: if mm is not None: mm.animation_start() self._timer = self._make_play_timer() if not self._timer.IsRunning(): self._timer.Start() else: self._timer.Stop() self._timer = None if mm is not None: mm.animation_stop() def _loop_changed(self, value): if value and self.play: self._play_changed(self.play) def _play_event(self): mm = getattr(self.scene, 'movie_maker', None) nf = self._max_timestep pc = self.timestep pc += 1 if pc > nf: if self.loop: pc = 0 else: self._timer.Stop() pc = nf if mm is not None: mm.animation_stop() if pc != self.timestep: self.timestep = pc if mm is not None: mm.animation_step() def _play_delay_changed(self): if self.play: self._timer.Stop() self._timer.Start(self.play_delay*1000) def _make_play_timer(self): scene = self.scene if scene is None or scene.off_screen_rendering: timer = NoUITimer(self.play_delay*1000, self._play_event) else: from pyface.timer.api import Timer timer = Timer(self.play_delay*1000, self._play_event) return timer def _find_sibling_datasets(self): if self.parent is not None: nt = self._max_timestep return [x for x in self.parent.children if x._max_timestep == nt] else: return [] def _update_files_fired(self): # First get all the siblings before we change the current file list. siblings = self._find_sibling_datasets() if self.sync_timestep else [] fname = self.base_file_name file_list = get_file_list(fname) if len(file_list) == 0: file_list = [fname] self.file_list = file_list for sibling in siblings: sibling.update_files = True mayavi-4.5.0/mayavi/core/filter.py0000644000076500000240000001341012747716313017501 0ustar prabhustaff00000000000000"""The base filter class from which all MayaVi filters derive. """ # Author: Prabhu Ramachandran # Copyright (c) 2005, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import List, Str # Local imports from mayavi.core.source import Source from mayavi.core.pipeline_base import PipelineBase from mayavi.core.pipeline_info import (PipelineInfo, get_tvtk_dataset_name) ###################################################################### # `Filter` class. ###################################################################### class Filter(Source): """ Base class for all the Mayavi filters. """ # The version of this class. Used for persistence. __version__ = 0 # The inputs for this filter. inputs = List(PipelineBase, record=False) # The icon icon = Str('filter.ico') # The human-readable type for this object type = Str(' filter') # Information about what this object can consume. input_info = PipelineInfo(datasets=['any']) ###################################################################### # `object` interface. ###################################################################### def __init__(self, **traits): super(Filter, self).__init__(**traits) # Let the filter setup its pipeline. self.setup_pipeline() def __get_pure_state__(self): d = super(Filter, self).__get_pure_state__() # Inputs are setup dynamically, don't pickle them. d.pop('inputs', None) return d ###################################################################### # `Filter` interface. ###################################################################### def setup_pipeline(self): """Override this method so that it *creates* its tvtk pipeline. This method is invoked when the object is initialized via `__init__`. Note that at the time this method is called, the tvtk data pipeline will *not* yet be setup. So upstream data will not be available. The idea is that you simply create the basic objects and setup those parts of the pipeline not dependent on upstream sources and filters. """ pass def update_pipeline(self): """Override this method so that it *updates* the tvtk pipeline when data upstream is known to have changed. This method is invoked (automatically) when the input fires a `pipeline_changed` event. """ raise NotImplementedError def update_data(self): """Override this method to do what is necessary when upstream data changes. This method is invoked (automatically) when any of the inputs sends a `data_changed` event. """ # Invoke render to update any changes. self.render() # Propagate the data_changed event. self.data_changed = True ###################################################################### # `Base` interface ###################################################################### def start(self): """This is invoked when this object is added to the mayavi pipeline. Note that when start is invoked, all the other information for the pipeline should be already set. """ # Do nothing if we are already running. if self.running: return # Setup event handlers. self._setup_event_handlers() # Update the pipeline. self.update_pipeline() # Call parent method to start the children and set the state. super(Filter, self).start() def stop(self): """Invoked when this object is removed from the mayavi pipeline. This is where you remove your actors from the scene. """ if not self.running: return # Teardown event handlers. self._teardown_event_handlers() # Call parent method to stop the children and set the state. super(Filter, self).stop() ###################################################################### # Non-public interface ###################################################################### def _set_outputs(self, new_outputs): """Set `self.outputs` to the given list of `new_outputs`. You should always use this method to set `self.outputs`. """ old_outputs = self.outputs self.outputs = new_outputs if len(new_outputs) > 0: self.output_info.datasets = \ [get_tvtk_dataset_name(new_outputs[0])] if old_outputs == self.outputs: # Even if the outputs don't change we want to propagate a # data_changed event since the data could have changed. self.data_changed = True def _inputs_changed(self, old, new): if self.running: self.update_pipeline() self._setup_input_events(old, new) def _inputs_items_changed(self, list_event): if self.running: self.update_pipeline() self._setup_input_events(list_event.removed, list_event.added) def _setup_event_handlers(self): self._setup_input_events([], self.inputs) def _teardown_event_handlers(self): self._setup_input_events(self.inputs, []) def _setup_input_events(self, removed, added): for input in removed: input.on_trait_event(self.update_pipeline, 'pipeline_changed', remove=True) input.on_trait_event(self.update_data, 'data_changed', remove=True) for input in added: input.on_trait_event(self.update_pipeline, 'pipeline_changed') input.on_trait_event(self.update_data, 'data_changed') mayavi-4.5.0/mayavi/core/images/0000755000076500000240000000000012747722127017110 5ustar prabhustaff00000000000000mayavi-4.5.0/mayavi/core/images/add.ico0000644000076500000240000000217612747716313020342 0ustar prabhustaff00000000000000h(  3f$IEmYVDl]GGV_GGYbGF[fȣʤȣȣȣȣ¥¥=d@h@h$byAa,kHݛO n}6g^H0P 2plp#PaOzYg4vMŻAWϿ1>4˔3\ۂ7';jDϡ~Py50QRIȅ o*C= Z[u-%f|ұ=b52S;\G!sIipH j6TQސņ'2(.iFBAOHc)5ì5ǧJ[@*5bF`@%VkRRPC|э:SP4, $ugPU'.`yОڕHD*.6q-=P"xS2s:P^w'ʏ*WKQĨȣ~H?LB(">ք%s@ o4|m |ųN'd҉WY t *`jO?#A=#NGYIENDB`mayavi-4.5.0/mayavi/core/images/add_scene.png0000644000076500000240000000104412747716313021522 0ustar prabhustaff00000000000000PNG  IHDRasRGBbKGD pHYs  tIME 0SIDAT8˥?HQ?.GN)Rl*Xpp&qNMZ\B$:6`pi ApIqU&! : wzbQt=mL}9h$> @ I:' VАR 1Q*%DtUA V"aAmq+Xݳsj֬ݡ+%b?5\ 8dAag 9^ q @R\)sD AM,g7% G7aO38fw{FVXZ^T[^>e}&@::I3д>Wh ?XZM}}N繁f Nj\a=t:-k+yĿ"sA ]yl;9IENDB`mayavi-4.5.0/mayavi/core/images/add_source.png0000644000076500000240000000105412747716313021726 0ustar prabhustaff00000000000000PNG  IHDRasRGBbKGD pHYs  tIME4gIDAT8˥=hSQ~7+ .NAAH.vVı[q\ܚ\t"*h J+(R*J4{3p|ҼZXD1 "EPKW3N@(P5 P#z;xy8$vHIT15sE󎬗B\Exq.hqa)Dqd|[sؚZsa0rWtwOĔG+؟a0'e]$xGHW.^_0;3CJIUzZpkqB`40xDn|yl6=Ygco`j9b/ f)|nݓGT**@.nE;OJ׭Rt7KIENDB`mayavi-4.5.0/mayavi/core/images/file.png0000644000076500000240000000131312747716313020533 0ustar prabhustaff00000000000000PNG  IHDR sRGBbKGD pHYs/tIME"6W{KIDAT8˥=kQ;8I,"!ZbJ,!DӮ$5̺;s9f 3gg[6]q7VjI2?}ۑ >iv 4xOm^? "e݂U𐽽3 `yyN$8,PQ utꎪO VhP #MS4(83,n6PlFqrʸl91~U0t(ܢ 0t( u| md\<΅C*؃c:zCXQx)k7ԼGΆ6fٌzTߪ(+ ʥadž"~89%1XQU{G=H@ãUOZ*ԾB/p""Ջ~T,&CaXUBc=4ut(5jUxeIY\?;ps3unΣߝEvB;uBb_C]gog 1xIENDB`mayavi-4.5.0/mayavi/core/images/filter.ico0000644000076500000240000030657612747716313021112 0ustar prabhustaff00000000000000hf  00%@@(B.C(V(  &5 .,}mm얉%||%п}}& vv}}{q,.z||y^^tty[{zhgoWWsd"DY![ytubtl[n_JT WiZ/()*(;]Cw #(,,,,%1]%}od%,,,,-# < Zumm(,,,,,*0eSDmff1,,,,,*3 &6%I>?pii,,,,,*3 &B1"E<>VRR.(,  /H;rrLCC_) >C;;_ͼ>77_~~cμ<55_lljjWν>60~rCpp|``|dd[Ÿ|EI>SppddqXXs]\Wx&@c=Srkf_z_XnUOrWBY6m\@ c?Dvfl\{eVu`RpD3R8ͻQd]@Jr....,47l'B}22223- .*5y|x($_222221) /5U#ƺ`2222210- 4<ທ`222221/2,"C4+W^ 222221/1/+)0#"W! H222221/1/+/#(\C>>/222221/1/+/#% Vf``;222221/1/+/#% '!!aZTT=??( @  .D99://v!]LL:11z# ZII6,,x wbbͺ}}2**x"ͻzz0((y ssͺyy/&&w"vvggͻxx*##z;@4 vvmm}cc~~ͻxo'%7`XYvvmmiiv]]zzCqr [vvmmii|ccpYYvv f9>[yyppllffybblUUuu#n>\]= Y x^PqWImSEgN@bK=\F9U=*rhw&eagU\= 6oooopppfV]>rZ@9999999.v{g\9qb:55555552,~v>B&x"55555553/*waeri` w 5555555310)~|%nkff y#55555553110,w+fλfbb x 555555531111-}+ZZwͻd``x#55555553111257.&-^PMλb^^z!555555531112576/:+WKLͺ_]]w555555531112576/:5'$#TIIͻgcc.555555531112576/:5'$,""NDDzpp 555555531112576/:5'$,""'JBB 555555531112576/:5'$,""'  F>>555555531112576/:5'$,""'  ;44 ????(0` $  >kf5 ;11_vccgUUv6 =22_jjdRR v6 ?33`oo}}aPP v6 @44_ttɹͻ||[KK v6 bPPFzzͺzzZKK v6 }}̻{{WGG v6 xxͻxxRDD v6 pp~ͺwwPBB v6 ll~̻xxM?? v8jj~ͻ|uuI=< |Y[cP+ ff~ͺ{tsJ;5 )bcD q6 zbb~̻dk+-7fv6 w``~LPdv6 r\\~d_2P!g v6 mXX~it3X[T! gv6 kVU~emChZVZS"dq+mUJ}\^U~gWVZR!g R:Zo|gXVZT!Dd5 2T{gXW[P7f[5/e-|fZW2.cX2b0o ~h3P( !{7 1l/o$C^M\d~&v6 2l-r$Utckgf!v6 1t-o omiieev6 1l/o-T^e̺liiv6 2l/e[!^ͻfccv6 2c/26nrͺebbv6 56 6<.(~{nm̺iee v6 7*)~xllͻc`` v6 0%%~ynnͺa__v5 ,!!~shh̺ebbg* ~pggͻcaa l#~rhhͻǶ{{> ~kbb`~h``_~kbb¿`~ldd ^ B ????(@ @ ">mrH<11bv``s^^.&&M=22b|dd}}xxxcc-$$M?33b}ee||u``,##M@44bggͻ{{r^^+##MA55bii˸{{o[[*""MD77akkп˹ñzzmXX( MeRRGppĵ̺ñyyjVV' OwwᴠͺñxxhUU&Qxx̺°}uudPP-$$O}}ttп˸wllbNN$Mzz ppп˸{ss_OO#Mxx nnп˸}uu\LL"Muu kkп˸{uuYJJ!N"("ss iiп˸±zttVGG!c_ xsR' pp eeп̺ñyrsYG?&Z oBi. nn }dd}}̺ñwqs9' "\k*kk yaass̺dz4a5@ \c$v__zzս[CA  L^"~gg t^^mXR 7Y6z F^${ee p[[~~tec 8ZYZ6z Fc* xbb mWW}}~\f?[XWXZ6z Lk. u`` jUU{{wT\PvcWWWXZ6z \i'w^V nTJ}|L|ESbrbXWWXZ6z [SKKu 'EALtreYVWXZ6Bt#);@"ufYVWXZ6 r)5 9DMudXVWYY " y#668&rbWWZ7 a25>rc[8 @'Yb3 32=v? A6 , N3 32=Q RD5bjfg-# M32=bcW\jfg'!! M32=tfemֽdziff% M32=[\t̺ñhee" O32=%M"RS~ͺñgdd Q33>LFv̺°`]] O3 358E@AL}п˸OLLM3 269=8rfdп˸^\\M65 2)8v ?-k_`п˸caaMG7, 5**j^^п˸b``M@55 2''g\\п˸±b__ M=22 /$$eZZп̺ñ`__ M:// -##WLLǽ̺ñ_^^ H7-- ) F<<Ǽ̺ñ^]]t"'SII̹MLLo 2)) %]SSпʸ°JGG> /&& ZRRҿ_VVb+$$ YPPh__b)!! VNNphhb& TLLzvvb# QIIc  =66haa a  I????????(  ( 7hp@2))RnZZ}fflYY#E0((Pxaajjiihhu__#E/''Pxbbkkllzzmmfft__!E0''P{ddllnnll}eer]]"E1''Pzddmmoo~kk{ddq\\ F4**Q}ffnnqq|jjzbbo[[!F2((P~ggoorrͻı{iixaanZZ!E2))Phhppss˺ȶızhhw``lXXF4++Pjjqqvvν˹ɶIJxggu__kWW F2))Ojjrrwwƶν˺ɶIJwfft]]jVV E2))Okkssxx̾ν˺ɶIJvddr\\hTTF3**Ommttzzξ˺ɷIJuddp[[gTT F 7--Mmmuu||ξ˺ɷIJsccoZZeSSFPBB7ppww}}ν˺ɷIJsbbmXXeRRFuuzz~~ν˺ɷIJqaalWWbPPF||xxν˺ɷŲp``jUUbOOF{{ӕyyν˺ɷŲo__iTT`NNFyy7zzvvν˺ɶŲn^^gSS_MMFww8yyttν˹ɶIJl\\eRR]LLFuu5xxssν˹ɶIJk\\dQQ\LLFuu8wwrrν˹ɶıj[[bPPZIIFss5uuppν˹ɶıiZZaMMZIIFrr8ttooν˹ɶıgYY_LLXHHEqq8ssnnν˹ɶıfXX]LLVGGFpp6qqllν˹ɶIJeWW\JJTEEFnn9ppkkν˹ɶIJdVVZHHTDDFmm9oojjν˹ɶIJbTTYGGRCCF".52( ll6nnhh}}ν˹ɶŲaTTWFFQBBH$0S|"za=kk9mmgg||ν˺ɶIJ`SSVEEOAAu]~ rSZ'jj9kk~ff{{ν˺ɶIJ^QQTCCS@5@ # |Eh+hh9jj}eezzν˺ɷIJeTL>?b1+'# Yk,~gg9ii{cczzν˺ɷIJ_m730*%2& Zk,}ff7hhzbbxxν˹ɷIJr E;92+h  $ Zk,{ee9~ggxaaxxν˹ɷŲư NBA:2 ~ # Zk,{dd9|ffw``wwν˺ռ WJJC:  " Zk,ycc6{ddu__vvú _SSKD %Q? # Zk,xaa9ycct]]uu g\[UM &TZ\A # Zj+v``9xbbr\\ttped]V 'TYWW[@ " Yj,u``9vaaqZZssmhlf_ 'UYWWWW[A $ Yk,s__9u__oYYrrjbijg (TYWWWWWW[@ # Zk,r]]6s^^mXXooe]edd -\ZWWWWWWWW[A # Zk, p\\8r]]kVVppbX``_ 2ki^XWWWWWWWW[A # Yk, o[[8p[[jUUnn`S\[Z7yyng^XWWWWWWWW[@ "  Zk,mXX5oZZhTTllYOWVV<}vog^XWWWWWWWW[A #  Zh'lXX8mYYfRSqhVJRRPB}vnf^XWWWWWWWW[A $ Y[lXS8rYNYRmFHNMLG}vnf^XWWWWWWWW[@ "  F= UK[>HEIJG L}vnf^XWWWWWWWW[A  $  }a-5ADFD!R}vnf^XWWWWWWWW[@  $ T{(6z?B>h!!W~vnf^XWWWWWWWW[A  t37=@:#X~vnf^XWWWWWWWW\>& 56<=7#~vnf^XWWWWWWWZQ2".49<5$0~vnf^XWWWWWYT& ${"3T698J$+}vnf_XWWWYT&i#~S13695^ $-}vng_XWYU& ~+*'#]/2u4792_$+}vog^ZT' 220+!u#325792_ $-}voi\( ;;84/ 7G025792^ $+}zk- DCA<5 'I+ F025792_ $+y2 LLJB F\iC80(' E025792_ $-7 UURJ Mr}{{:44'& F325792_ $+< _][S W}{{:44%% F025792_ $+B gfc\_ư}{{933## E025792_ $,G djld gռIJ|{{711"" F325792_ $+L _dihpú˺ɷIJ|{{611   F025792` $,RZ`dbmν˺ɷIJ}{{500 F325792^ $+WV[_]jν˺ɷIJ}||4// F325792_ $0X PV[Xeν˺ɷIJ|{{3.. F025792_ $!!LRVSbν˺ɷŲ|{{2--F325792_$## GMRN`ν˺ɷŲ}{{1++F025794JgDIMJYν˺ɶŲ|zz/++F32569857:?EIIVν˹ɶIJ|zz-))F3 2469<=@BDFCν˹ɶIJ|zz-))F32w369<=?B@67QgVMν˹ɶı{zz,((F23S4676z.6,4c@I8)://[OOν˹ɶı|{{*'' FE6-8B779--\OOν˹ɶı{zz)&& EA558A557++[NNν˹ɶı{zz(%%  F@336?446++XLLν˹ɶIJ|zz'$$  F>229?334**XMMν˹ɶIJzzz&##  F=119=223((WKKν˹ɶIJzyy#!! F;006<111''VJJν˹ɶŲzyy#!! F://9://0%%UJJν˺ɶIJzyy! E8--99../$$TIIν˺ɶIJzxxF7,,97---##RGGν˺ɷIJyxxE5++96,,+!!QGGν˺ɷIJyyyF4**74***""NDDν˹ɷIJzyyA2))93**( OEEν˹ɷIJyxxq!1))91(('MDDν˺ɷIJyxx)/''60''%LCCξ˺ɷIJRQQi.&&9.&&#KBBξ˺ɶIJojj 7 ,%%9,$$"JAAν˹ɶŲƵ~uu P*##9+## I@@˿ν˺ P)""9)""G??˿ O(!!6(!!D<<ʿ O' 8&D==ʿO%8%D;;ʾ P$5#@88ʾ P"8"@99ɾ P!8 ?88  Q5>77ɽ  P7 =66ɽ  P5 B<<  P7 N6 8 ????????8????mayavi-4.5.0/mayavi/core/images/image_LICENSE.txt0000644000076500000240000000157212747716313022102 0ustar prabhustaff00000000000000The icons are mostly derived work from other icons. As such they are licensed accordingly to the original license: Eclipse: Eclipse Public Licence Nuvola: LGPL Crystal: LGPL OOo: LGPL GV: Gael Varoquaux: BSD-licensed Unless stated in this file, icons are work of enthought, and are released under a 3 clause BSD-like license. Files and orginal authors: ---------------------------------------------------------------- add.ico | GV add_module.png | Crystal add_scene.png | Crystal add_source.png | Crystal file.png | GV filter.ico | Nuvola module.ico | Crystal modulemanager.ico | Crystal scene.ico | Crystal source.ico | Crystal mayavi-4.5.0/mayavi/core/images/module.ico0000644000076500000240000030657612747716313021112 0ustar prabhustaff00000000000000(fh  00%%@@(BVK(   "$&''''''''%"   $-7CMV^djptx|~zuqlg`XOF;1'(9J[jz+ Oj|ŎМ!ئ#޵$%$'''''''''&%%#"ݐ}iQ4 {m_P?.  %:Ri1 cȨ#ܿ%'',27:? DT%T%e8j>h oZB,  !;Y9 x $'08Fa6ySoǯӾ޾ݽڹطʨubxMe6M;4+&"DdF) #G; $'3IqJxݼ޽޽߾ݻ׵ȤesFS"8-%JyR,  D-$h zL! %+2:@FJMRUURMJGA:3+% Qg#-MVѼصЩѪѪѪѪѪѪѪѪѪѪѪѪѪѪҫӬ֯۵ױǟn`02$Yb(&5FUan }#)9;>LMML>;9+" yncVF>'FhɟӨԮˠ̢̢̢̢̢̢̢̢̢̢̢̢̢̢̢̢̢̢̢ΥլϦ_.-d# 2Kd8Pap~}pbM7 b(g8ϣȜŘɠΥŘƚƚƚƚƚƚƚƚƚƚƚƚƚƚƚƚƚƚƚƚƚǛ͡˟[5M "CpEe1]0ŗŗɝ”˝\.ho;9o..DD[[kkzz܇݈xyjkXYEF./_g.m‘ʤ”M"z%9ax 99cc܈ut-0rT$#r! Xn 9 "[gF>Dˍ)Pcutrrrnݽwqrrrrrrrrrrrrrrrrrrrrrrsvnp7+? YeY(,q5OfmkjifڸlijjjjjjjjjjjjjjjjjjjjkmjX|@J'G$+2]![%r7xr7m4l3n3n5p6n4: $f ,ZBjX|`ۃY\ف]ځ^ڂ^ڂ^ڂ^ڂ^ڂ^ڂ^ڂ^ڂ^ڂ^ڂ^ڂ^ڂ^ڂ^ڂ^ڂ^ڂYtl)Cp7m4m4m4l4l4d*cřDKKKKJJJIGEC~@y!Hm5i2i2i2i2i2a(߽ܸٲ֬ԦР͙˓ǎŊÅzuoic`Dd/g1g1g1g1h1h1h1h2i2i2i2i2i2i2i2i2i2i2i2i2i2i2l4[()C +V*U*T*T Lvٍ2b4d5e5e5e5e4d4c3b3a2`1^0\.Z+V*U)S(R)S'T(TI(c.i3h2h2h2h2c,Q߾ݹڳ׮ըңϞ͘ʓǍň‚}xrmgdBc/h2h2h2h2h2h2h2h2h2h2h2h2h2h2h2h2h2h2h2h2h2h2k4A#P"*U)T)S)SKw؎&Q(R)S)S)S)S)R)R(R(R(Q(Q(Q(R)R)R)R)S)S)SXd6Ji4f1f1f1f1e0d.ɯ߾ݹڳ׮ըңϞ͘ʓǍň‚}xrmgc~@c/f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1f1h3[()G *S)R)Q)QIv׍%N'O(P(P(P(P(P(P(P)P)Q)Q)Q)Q)Q)Q)Q)Q)Q)Q&R,O=)a-e1d0d0d0d0[%t߾ݹڳ׮ըңϞ͘ʓǍň‚}xrmgcv:`.d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0d0g2A#X&(Q'P'O'OGw֍$M&N'O'O'O'O'O'O'O'O'O'O'O'O'O'O'O'O'O'O'OTmz/Je1b.b.b.b._*o>߾ݹڳ׮ըңϞ͘ʓǍň‚}xrmhbr8_,b.b.b.b.b.b.b.b.b.b.b.b.b.b.b.b.b.b.b.b.d/Z))K (P'O'N'NFw֍$L&M'N'N'N'N'N'N'N'N'N'N'N'N'N'N'N'N'N'N'N$P/J6 *^,a/`.`.`._-['߾ݹڳ׮ըңϞ͘ʓǍň‚}xrmh_m6],`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.c1B"a('O&N&M&MDvՌ#J%L&M&M&M&M&M&M&M&M&M&M&M&M&M&M&M&M&M&M&M&MQsq)Ha0]-]-]-]-V$a߾ݹڳ׮ըңϞ͘ʓǍň‚}xrmh^h3Z+]-]-]-]-]-]-]-]-]-]-]-]-]-]-]-]-]-]-]-_.X))N 'M&L&K&KBwԋ#I%J&K&K&K&K&K&K&K&K&K&K&K&K&K&K&K&K&K&K&K&K"M0F2 +\,]-\,\,\,Z)b4ջ߾ݹڳ׮ըңϞ͘ʓǍň‚}xrmi[c0Z+\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,_/? g* %L$K$J$JAvԋ!G#I$J$J$J$J$J$J$J$J$J$J$J$J$J$J$J$J$J$J$J$J$JNwj%G^.[+[+[+[+S"즃߾ݹڳ׮ըңϞ͘ʓǍň‚}xrmiY`.Y*[+[+[+[+[+[+[+[+[+[+[+[+[+[+[+[+[+[+\,V((S %J$I$H$H?v҉!E#G$H$H$H$H$H$H$H$H$H$H$H$H$H$H$H$H$H$H$H$H$HJ2A,)X*Z,Y+Y+Y+S$vM߾ݹڳ׮ըңϞ͘ʓǍň‚}xrmjVZ+X*Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+Y+\-?m. $G#G#F#F=wъ D"E#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#F#FKqcDZ,W*W*W*V(V)Ũ߾ݹڳ׮ըңϞ͘ʓǍň‚}xrmjTU(W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*W*X+S&'X #F"D"D"D;wЉA!C"D"D"D"D"D"D"D"D"D"D"D"D"D"D"D"D"D"D"D"D"D"DH##'* U)V)U)U)U)Lo߾ݹڳ׮ըңϞ͘ʓǍň‚}xrmjRO%U)U)U)U)U)U)U)U)U)U)U)U)U)U)U)U)U)U)X+<n- "D"D"C"C:vω@!B"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C"C#GiMCU*R(R(R(N$e<߾ݹڳ׮ըңϞ͘ʓǍň‚}xrmjMM%R(R(R(R(R(R(R(R(R(R(R(R(R(R(R(R(R(S)N%%W !D B B B8vψ@A B B B B B B B B B B B B B B B B B B B B B B"F !x#( Q'Q&Q&Q&P%L!߾ݹڳ׮ըңϞ͘ʓǍň‚}xrmjIL#Q&Q&Q&Q&Q&Q&Q&Q&Q&Q&Q&Q&Q&Q&Q&Q&Q&T)8i- !A A @ @6vΈ>? @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ @"DjN@R(O&O&O&G~Xݹڳ׮ըңϞ͘ʓǍň‚}xrmjDJ#O&O&O&O&O&O&O&O&O&O&O&O&O&O&O&O&P'K## Y  @???5v͇<>??????????????????????!Cs' N%O%N%N%K"U-ήܹڳ׮ըңϞ͘ʓǍň‚}xrmj{AI"N%N%N%N%N%N%N%N%N%N%N%N%N%N%N%N%Q'7q1  >===3v̇;<======================!Ayi(=N&L$L$L$Dyݹڳ׮ըңϞ͘ʓǍň‚}xrmjp;G!L$L$L$L$L$L$L$L$L$L$L$L$L$L$L$M%I"#_ ==<<2vˆ9;<<<<<<<<<<<<<<<<<<<<<<? & J#J#I#I#CjF޾޻ڳ׮ըңϞ͘ʓǍň‚}xrmjk8D I#I#I#I#I#I#I#I#I#I#I#I#I#I#I#L%5o0 ;:::0vˆ89::::::::::::::::::::::= 9J%H#H#F!G"ڳ׮ըңϞ͘ʓǍň‚}xrmj_1C H#H#H#H#H#H#H#H#H#H#H#H#H#H#I$E !^~ 9888.vʅ578888888888888888888888; | ? G$G"G"F"F">ߊfڴ׮ըңϞ͘ʓǍň‚}xrmh[.AF"F"F"F"F"F"F"F"F"F"F"F"F"F"I$0m0} 8666,vɅ5566666666666666666666669 {46F#D!D!@W4Աݶ׮ըңϞ͘ʓǍň‚}xrndT+@D!D!D!D!D!D!D!D!D!D!D!D!D!E"@]} 6555*vȄ2455555555555555555555558 y4!"BCBA>뫆׮ըңϞ͘ʓǍň‚}xrnbP'?BBBBBBBBBBBBBE!-j.| 5444)uDŽ2344444444444444444444447 y43C!AA8sQدըңϞ͘ʓǍň‚}xrn^J$>AAAAAAAAAAAAB <Y{~ 3222 'vƄ/122222222222222222222225 ~x4 >@?<G&ȢܲըңϞ͘ʓǍň‚}xro\E!=????????????A*d *{~1000 %vŃ./00000000000000000000003 ~x40?<<5rըңϞ͘ʓǍň‚}xrpX=;<<<<<<<<<<<=9Ny|0/// $uŃ,.//////////////////////2 |w39<;4`?׮תңϞ͘ʓǍň‚}xrpT7;;;;;;;;;;;;=( Z (y|/... #vĂ,-......................1 |v4+;98:ۯңϞ͘ʓǍň‚}xrqQ199999999999:5Mx{-,,, vÁ)+,,,,,,,,,,,,,,,,,,,,,,/ {v4ݴ698/\ޱңϞ͘ʓǍň‚}xrpJ1888888888889$ V (wz+***u((**********************- zt4o'861L-͡զϞ͘ʓǍň‚}xrpG/666666666671Lwz)(((u%'((((((((((((((((((((((* zt4ز242.z۫ϝ͘ʓǍň‚}xrpr?,33333333335 U &ux('''u%%''''''''''''''''''''''* xr4l%42)iH٩О͘ʓǍň‚}xrpk:+2222222223,G ux '&&&u#%&&&&&&&&&&&&&&&&&&&&&&(xr4 ֯-1-: Ԣ͘ʓǍň‚}xro^2*0000000001I#tw %$$$u""$$$$$$$$$$$$$$$$$$$$$$&wr3f /.&ތfڧ͘ʓǍň‚}xroV.(......../) F tw} #"""u!""""""""""""""""""""""$wq 4ʬ*-%S6ОϚʓǍň‚}xroI'&,,,,,,,,-D#ru| "!!!u~!!!!!!!!!!!!!!!!!!!!!!#up4Y ,*+ﮂӞʓǍň‚}xslD#&+++++++,$ C ru{ !   u~                       "}uo4ǩ&* tQנʓǍň‚}xth= %))))))))@ qtz }u}   |to4U'!>&ƒ͖Ǎň‚}xtc5"&&&&&&'!z @ psy zu|  {sn3!% nӚǍň‚}xu`/"%%%%%%% 7psx y u|  y sm3H $ ]>љȎň‚}xv['!#####$ x < nqw    w t{ } ~                       y ql3   -̑ň‚}xvW! !!!!!! .vnqv } } } }v x~ | | } } } } } } } } } } } } } } } } } } } } } } ~w qk4 ?   فZҖň‚}xwQ   n: mpu | | | |t v{xyzzzzz { { { | | | | | | | | | | | | | | }v pk4   F,ȎNJ‚}xwN  ,rmqt { { { {sw}~$&$| zwsrt v xy z { { { { { { { |u pk4 7  q̍‚}xwvE     h5lns y y y yorwػϬƟjqGN$-|u ru x y y y y zt nh4  eDϐ‚}xvk?     hlor wws ot ٛЄikZ\IK=?.068353545686846FHVWde|}֏ڝݿȟuz\$dez ޖ e~j K'ghi&9EhDgBbAbAbAbAbAbAbAbAbAbAbAbAbAbAbAbAbAbAbAbAbAbAbAbAbAbAbAbAbAbAbAbAbAbAbAbAbAbDfFi,BmgVC m\;̂d  xIg)ggf$;YLsOwLrKpJpJoJoJoJoJoJoJoJoJoJoJoJoJoJoJoJoJoJoJoJoJoJoJoJoJoJoJoJoJoKpLrOvNt@_-hff6v Ґ"uaC$e?ggbj$2KHlS|WXVUT~S}S}S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S|S}S}T~TVXXS}Kp4N)nbgeDzbV`pC ddgf`bm':8TFiT~Y\_bbaa`````````abb_]ZVIm:V)=!pc`eg\;F ƋI-Y7e)befda]aho )%7/G6R095AF.|Mj)0K+K;[A`>[)dc >&+c8 n~ %t!lDR b*t 3(, :NZ ^_[Q@! :DE:-LqXIľu˞ө֬եϖtąccGh/y 3N/{/BBGGDD,3wZ'ϟҤѠǔoIW(ʓ°nSȝbjjnn?A/[EoDy\ZReڳ֥bs6u:r9n3%  c΀:]G"MNh'[0ո߸Ȑt}=X(]+c/L (Te9X@#FK=5C˕zu!B 1@gDܴϙyh5G R(?(Ubv4K/69 +,7.֠vX-?G"|  ar0E&.0$ / }Y٣tH$70+\y`m-> &(.V:9Ȓv:-u r^g+7z}  -W fz- Rlgk@E*028 (z,X'S7s ^ (Nc:M%8);.@9K@T!., W J w%;5S?aCgCf=]1K!;y(9$X `]0c [ op ow it Qh_ G<tp)8>>~~<( @ ",48;;:71) .+mUl$}7!ÉD/͐M6ԑM5ՑL3ՊE,7n'W-rG$D ct{| xjTRX9쟈ڳԬΦjZ7Z {!7W##66@@CCAA:9#+LWfٱÔĖǙΠϠ}l&4JSs\tصqtuuuvq.#"mppqpyς[%r4ˢNRQOKD\&I   O9e9f:f9e+cr.T!r>۶ӤʓƄYg/j2h1f0f0i11 3 G$K$L%M%MPE!G#:A  &գ//11142 4}٧ƉrU+7>?3 Ӣ))+++. 1D>cBդȊpG$08,<| С##%%%' /s.ϐm<*/'y }Ρ  ! - wSՔj1% *mtuˠ~}yz |-$ja;$ˌh& h oxͣ˂CHAEEINR7>~t ,%* ii ]}P`=L."!() /*86E7F* NY9e \ t /H<_EiHlHmHmHmHlFjBe;Z!$lXuITag $5-D4M5P5P1J(<+ b2YYC$RcaV U*\8YCVIWGC>02W!,X|1'?(0` $  $')+++*(%" "7K[gqy~|ulaTA+ &K3 i#ʤ4ڹJ([9hGuRzUySxQuNjB^7M(<) uD ~]7 *;LZafhhe`UHPr@}\߼ݺٵձͨXS*")IDj"CU^dihb[M5>o׺ٷɝˠˡ̢ͣҧԪͣtFes"Pm22OObbppuvuwtwnpegVX5DsypƕϨƕV+w#~\fnLxpپŘpuuuuuuvwrIaj~|͇U!~BMtZ`````^XKl3A 9]MvW~^ۃ^ۃ^ۃ^ۃ^܄Yޅh-Y%l2m3ϷkBGEDAy>r8m4m4FS"!GNޖ1`:g9f9f8e6b*`R@Ij3_&{ݹ׭ПʒÅxj{>e/h1g0f0e0f0f0i2b-#F #GIܕݘH(P'P'P'O'O&O"RXU&a-vGݻ׭ОȐtes9`-c/c/c0c0c0c0f2AW#"CFڕۘC&L&M&M&M'M'M PM8B_.Y'޻׭Пɑ‚vek5\+^-^-^-^-^-`.X( E  ?@ؔٗ?$H$H$H$H$H$H#HJRL"S#[޼׭Пɑ‚vdb0W)Y*Y*Y*Y*Y*\-:T ";<֓ؖ;"D"D"D"D"D"D"DI8!8S(Z/ͯ׭Пɑ‚vbY+R'T(T(T(T(V)M#B 87Ԓ֖7 @ @ @ @ @ @ @!D !AB Ho׭Пɑ‚v^R(N%O&O&O&O&Q(1J 43ґԕ2<<<<<<< @/I,H!c=ڷٯПɑ‚wYL$J#K$K$K$L%E @ 1.Бҕ.8888888< G>B쪆ߵПɑ‚xSD E F!F!F!H#-= ~- *ΐД)44444447 K,y% ;qNܲѠɑ‚yL=@AAB :@ |) %̏Δ %00000003 Pa3E&šդȑ‚y}F4;;;=$ <}y& ʎ̓!,,,,,,,/ Oav = /ۄ`٨ɑÃys@.7780: x"ȍʒ'''''''* La% P2͝˒Ãxi:*222/pvƌȑ#######% Ka *uјÃw_5%-.%r 2t}ċǐ~!~Han_@ΕĄvT.!((]r y ‹Ďx    {Ga Ӱ0ȆtI( $ _+o {sƜ~)& {v y | ~x Fa Zތa΋s=!  Nms uėܡsuW[UXTWY\aedi:A} wt Fa D,džr1 K&i:@ck\e:C(  $&/2;@JEO#-qD^Cju${ImCV/H"9&=)@+A,B,C,C,C,C,B*A)@'>)@4L DFeAs H$e$?_HlKqJoHmHlGkGkGkGkHlImJpKpGj7R A=Y qB d` t,-C:WCdInNtNuNuMsHlAa6R*>"fQ| I-8c [MZ^dhjjjiea[THC ({+ edZ [ [ Y Pmt2????(@ @  #&()**)(&# "1@O[gpw||vpg[N>. "=Z|F mˢ&ڵ.4 ?HM"L!L M!H>4 -%݆g; mS7   AH ü2 \4~Y{ȱݽ׵ӰƢ{aoCJ*p#b5 %5DR[chlnmjd^UHCa|/qHݻ֯زٳ۶޹߻ڵҫfY, "|= ;]7IW_ejnkgbXK:h_3׳ҫȜɞɞɞɞɞʟˠΤӪͣvF< j#2s`z 55EEPPXXYYYYQRGH9:%& [$ŕȝə~/ y% q!$acqb1w˧{~~~~~~~~~~|:j dpQ!Mnnwzlnnnnnnnoppkw?!L5@}}zGN}@MQҵf]____``_]VJyؕ5VE#H#H#H#H#H#H#H#H#HL]x*5Z,W)V(ݹ׮ң͘Ǎ‚woIS&X*X*X*X*X*X*X*Y+X*, @ $G:֓4SA"D"D"D"D"D"D"D"D"D!G37J$V*L hݺ׮ң͘Ǎ‚woEM%T)T)T)T)T)T)T)W+C? #D7Ԓ4P>!A!A!A!A!A!A!A!A!A"D0M\2S)N$^6׷׮ң͘Ǎ‚wn{AK#Q'Q'Q'Q'Q'Q'R'Q') ?   A3Ӓ2N:>>>>>>>>> A. |)F!N$G쪇׮ң͘Ǎ‚wns;G M$M$M$M$M$M$P&?A ~ >0ё1K7;;;;;;;;;=,|M$,L%BuQدң͘Ǎ‚wlj7D I#I#I#I#I#J#J#& D | ;-А0I4888888888:)>E!K'ơܳң͘Ǎ‚xka2BF"F"F"F"F"H$8A z 7 (ΐ.F04444444446&"B :oң͘Ǎ‚xjX->B B B B B B !D y 4 &͐-D.2222222224$|43:]<֭ԥ͘Ǎ‚xiM&;>>>>@2? y 1 #ˏ-A+/////////1"z459:ﲊ٪͘Ǎ‚xgD!9;;;;;<w .ʏ+?(,,,,,,,,,.!w4,0{Xګ͘Ǎ‚yd=57779,> u *ȍ);$(((((((((*u4+/G*ɛϛǍ‚y^613333;~t'nj)9!%%%%%%%%%'t4%+r֠Ǎ‚zY0.//1%y = r~$ō'6 """""""""# r4&# bBҝȎ‚{T++,,+4zp|  }Č&4  p4 3̑‚{N$'(* s : oz z‹%1  o4 " ق\ѕ‚||H#$#-snx w +z } } } ~      |n4 I.Ȏă}qA !" k7lv |r=F%.&0$.)! zu wz | }ym4  rɈ|f; 'mltt s Ɲܡԏ{|ˁuwrtpsorlohmLR'/ xvvl4 hF̉{Y4 d4jpNTNJ{ЀNU%-    "),4AI\cSZ!)oj4 -~{N- fd.1iw.?(+0 2!3!3"4"4"4"4"4!3!3 21/+*;->f0u\~B&  ]1b$4Q3N4O4O4O4O4O4O4O4O4O4O4O4O4O4O4O4O4O3N8V';dtټN1{5^ewq+AFhKqKpHlGkGjFjFjFiFiFiFiFjGjGkGlJoLrHm8TX2 i g+U.hd}e(<h3,M-;L! [e!F-g*J+-$ZzA1X&-\(\0X- ,+bD" 4U @+MGxL3Y+)VvM(ovCI~1h-]'_h2CE~qoK3c!@ yr`k)L!!NL Ds?Y$Ild/J CC}}qqZY f~67""ÇhheeTS Wlʺ*x__oo??0& e Tc((X Qm o1X ( @  1HA$  $r"FzU2 5;&03D23bA .f^ *J5q3K44-XrP-O(1a5l3k3I3343y&X+ D s$E5l4i3f3k3I33335-IC6o3f3f3f3k2F333335 [3*$!%5i3f3f2e2h;\5 33342)aA +Wl!95f3f.b6iMQAg43341P>>qP-'J$82c,aN{h^OBy6k3734/ `{sS^< ,Gl%6=l~oZNAt5i3m3R4/ _yore0,jH!kk30kZM@s5h3f3l6i* _womppIg; )PDjYM@s4g5j4c - tRnmmntSAE!cLcWmZL?s6n-K%}ilmmp^ HEccGG 1z87UqO@q(/ ~Dmjmp_ HECC}}wwZZ !qA?G(.wip`KEoowwoollgg55 ) cn`LBII~~wwoohhggmmSS9[pY/ QQ~~vvnnggffllcc!!%{'Hb 2|N$$ww~~vvnniillGG gU 0EbFS OOzzssbb))4 -C&&Y w$lc''iiQQv^ +J)It J '^ - X%(G>!^4$?(0` $G \WQL!F$=`"4+]f \WQK@$c0'-Y(GIsjb \WMYN&13k4>30r); T zmhb [ Rj,O5m3n3:342/R"> smh_U_02d5k3f3l3:33331k*4{ Qy smd v(M6l4h3f3f3l3:3333321J49 `Wy sIp-1c5l3f3f3f3f3l3:33333333d+.m  M&hlyw&C6m4h3f3f3f3f3f3l3:333333334}.5C Vskh~/Z4i3f3f3f3f3f3f3l3:333333333,AJ6mumjho /W4i3f3f3f3f3f3f2k28233333333)BLU|upmjca]r0T4i3f3f3f3f2e1d"W QQzzuuppllggffffiillFFk$DqB$Y..yyuuppkkggffffffggssII|[*@C Qxx~~yyuuppkkggffffjjhh99w, /K&1ILf _LL~~yyttppkkffggmmWWT? /L0O0Ey)Yp9 ,>"""rryyttoojjjjhh;;3  /L0O.O.K6-G['w lKK}}ttppqqYY^C !2Q0O.O-O+N -F$]  q@0BE+%%jj}}rr??; "c1Q/Q-O+O*O+LB)K X&w pv BB##fD 1(E/R+O*O*P)O*I a t;1C\?O 0+O*O*P(P(P(LZ&M,???????(@ @KTQL G#D&?w!/$ ]ZTQLH- ?$K,g*A'FUh _XTQKrB#f0[400,N&2*hhb ^XU(LQ'53g4p3,42-c+;"<`vjeb ^XjPm.R5m3g3l3,3330|.G'-qu voieb#Z \ 33f4k3f3f3l3,33342/\-62w roiec]t*P5l4h3f3f3f3l3,3333330u0B') e Nv rogh02d5k3f3f3f3f3f3l3,333333320U/2)/ u yv s[k |'M6l4h3f3f3f3f3f3f3l3,3333333331o2<&$ X  N'[wE u,2c6k3f3f3f3f3f3f3f3f3l3,333333333322N.0Z0Bnpyd 3e5j3f3f3f3f3f3f3f3f3f3l3,3333333333321; |)kphl|` 1a4h3f3f3f3f3f3f3f3f3f3l3,333333333332.? yFtmjhl~Z 1a4h3f3f3f3f3f3f3f3f3f2l1'333333333332,A q,awnljhh >-1a3h3f3f3f3f3f3f3f3f1d7n@S523333333331)C Eo<J{wpnljE` .W2a3h3f3f3f3f3f3f2e1dAtPOCh63333333331'D 0z. @t.f~tspn ie 1"2a3h3f3f3f3f3f0c7kP[SLG~@t7;333333341$D di@!z 4N}wtsp?gx 2$2a3h3f3f3f0d0cIzaaXRLEx?s9s4S33333340"GgppS*5g 1m{ywt pk 3'2a3h3f3f-a:lgvf^XRK~Ex?r9l3k3e32333340 Ifnmrd9l+}{yw:n|4*2a3h/d-bW܀sd^WQK~Ex>r8k3f3h3l3N33340LgnmmpoM%*[ }{wq6,2a*bq8k3f3f3f3l3b3+34/Nhnmmmnra3 _#}4u7.-^_܄pc]WPJ}Dw>q8k3f3f3f3f3h3l3H4 /QhnmmmmmpnGOux:/ob]VPJ}Dw=q7j3f3f3f3f3f3f3l5c/#Qgnmmmmmmnr\, P*Qnb\VPJ}Cv=p7j3f3f3f3f3f4g6l,UoQyslmmmmmmmql@ j"}d<0x^mb\VPI|Cv=p6i3f3f3f3f5k3g3 ZY+ulmmmmmmmmot@8<{#J"la\UOI|Cv|mU-6 nn}}zzwwssookkhhffffffffffhhllOO_ F(<\08|BB~~yyvvssookkhhffffffffffhhllMMR #+Dʌ-WT,#Noo~~zzuurrookkggffffffffllaa**vI 00N0Ls0D {tK-.CC}}zzuurrookkggffffhhllKKg+v0N0O.N2/E)VdF[u`nn}}yyvvrrnnkkggffkkcc--P50O0O.N.O.K-F}]: 4#FF||yyvvrrnnjjiillMMo1| 0M2R.N.O-O,O@-F%[ iO#d{`o!!llyyuurrnnoodd//X: #)C1S.O-O,O+O+K*J | [< #89.HH||yyssttQQy6 11T.R,O+O*O*OL*G!` gM#f ~$$iiqq55a>U&C/T+O*O*P)P)K&MX;&=[9 ;0,Q*O*P)P(P(OX(JeiG #f w!G#e*O*P)P(P'P'P%'N C4I????( 6K G!F#D%A'@A)@( R'RPK G!F#D$B%A'>*A(<>&>UNLK G!FG"D#C$=%?&>(=+A, ^-XVQNLKHG!E!=&[/9.v'B':+@(9:$ B[TRQNLAKJDD(}+2f4X40)R'9*=,?)U+ E\WTRQ OMKC [-I4k3l3S333-k(>(:,?'66" G b`XWTR>QPKJ$}(1_4l3f3j3S33340*M(8+=-<$M*J c ^ \XW U~TRI_ +F4k4i3f3f3j3S333342,e(<*9.>&2w3 Lhg _ ^ \X6WWRP ~%1]5l3f3f3f3f3j3S33333330~*I)6-<-: G)Njcb _ ^ \wZXQ` (C4j4i3f3f3f3f3f3j3S333333342-^)9+8/=&/ l/Pnmecb _0 ^ ] X U#/[5l3g3f3f3f3f3f3f3j3S3333333333/x+C+6.;-7B&Spihecbs` ^Xe%@4j4i3f3f3f3f3f3f3f3f3j3S333333333332-X+6,81<$+ b.Vutkihe(dc_\".Y5l3g3f3f3f3f3f3f3f3f3f3j3S3333333333333/q+>,50:.6=%X wpokihmge^ i!=4i4j3f3f3f3f3f3f3f3f3f3f3f3j3S333333333333331-Q,4/71:#'Z,| z rpol#jifa-X6l3g3f3f3f3f3f3f3f3f3f3f3f3f3j3S3333333333333333/k,;-41:-29# v u rpohmkfn:4g5j3f3f3f3f3f3f3f3f3f3f3f3f3f3f3j3S333333333333333331-L-30728!$R*Wv u rqolg+V6l3g3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3j3S3333333333333333333/e-7/328+/|6! : n |v u^ s rls73f5j3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3j3S333333333333333333331/F.11726J,{{wwY v so,T6l4g3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3j3S3333333333333333333333/].40348'(R2 Cyyyw w43e5j3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3j3S333333333333333333333332z/B04588 Azzzv3f5i3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3j3S3333333333333333333333332.738: A{w2b4h3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3j3S3333333333333333333333331-92:: EdN"I}y2b4h3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3j3S3333333333333333333333331,:1;:Nlmf~z2b4h3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3j3S3333333333333333333333331+;/<:Omgha{2b4h3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3j3S3333333333333333333333331*=.>:Ponhgha|2b3h3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3j2Q3333333333333333333333331)>-?2Rpjihg hSbhn 2b3h3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f1h6[5233333333333333333333331(?+A 'f/V0Srrkjih9ggf\2b3h3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f2e3f@sMGg823333333333333333333340'@*@*C# G}3! Ssmmkj i{igba_2b3h3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f1d8kK~ROLHy<=3233333333333333333340%B)A+G&%|J(Uutnmmk0jjed`#2b3h3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f2e2eBuUVQNK~H|E~>Z523333333333333333340$C(B,F>@%#& ;p1Vvponmmwkjbv`92b3h3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f0c8kP\XTQNJ}GzDwBy>m61333333333333333334/#D'?OR}lU."%"n C'Wyxqpon+mmhea8 !2b3h3f3f3f3f3f3f3f3f3f3f3f3f3f1d1dDw]`ZWTPMJ}GzDwAt>s;s6M33333333333333334/"E%@YT|hpg>#"$/g/Yytsqpoponewb8!"2b3h3f3f3f3f3f3f3f3f3f3f3f3f0c9lVea]ZWTPMJ}GzDwAt>q:m7p4`3)333333333333334/!G$AXT{hlooQ* # _=&Z}|ttsq$qplgc8##2b3h3f3f3f3f3f3f3f3f3f3f1d1dJzikc`]ZVSPMJ}GzDwAt=p:m7j4j3j3C3 3333333333334/H#BYT{hlmmqd8 !"!],[~wvttskrqixd8$%2b3h3f3f3f3f3f3f3f3f3f.c:ke{qfb`]YVSPMJ}GzCv@s=p:m7j4g3f3l3[3"333333333334.I!DYT{hlmmmpnL&" W;$ \xwvt"tspke8&%2b3h3f3f3f3f3f3f3f0d/cP}~xnfb`\YVSPMJ}GzCv@s=p:m7j4g3f3f3j3i3=33333333334.K EZT{hlmmmmnq`3 T*]zyxwvbutlyf8''2b3h3f3f3f3f3f3f-b9krwnfb_\YVSPMI|FyCv@s=p:m7j4g3f3f3f3g3l3W3333333334.LGZT{hlmmmmmmpmG"  L6! {zyxwwsng8)(2b3h3f3f3f3f0d-bV~vmfb_\YVSPLI|FyCv@s=p:m6i3f3f3f3f3f3f3j3g3733333334.MH[T{hlmmmmmmmnq[/M) a}|{zyZxxqzh8*)2b3h3f3f3f,a9j~vmfb_\YVSOLI|FyCv@s=p9l6i3f3f3f3f3f3f3f3g3l3Q3333334-NI [T{hlmmmmmmmmmqjA=v2 !}|{zzwqi8,*3b3h3f0d*a[ڀ~vleb_\YUROLI|FyCv@sq;n8k5h3f3f3f3f3f3f3f3f3f3f3f4i5j&Ej UYW`NvkmmmmmmmmmmmmmmmmmmmmnsVA&~~$o92+'^C{ric`^ZWTQNK~H{ExAt>q;n8k5h3f3f3f3f3f3f3f3f3f3f5l0`)\ Z \ [nvkmmmmmmmmmmmmmmmmmmmmmoe$@&~Ds. 0%9zqhca]ZWTQNK~GzDwAt>q;n8k5h3f3f3f3f3f3f3f3f4h6k%G q\` ^cJ~vkmmmmmmmmmmmmmmmmmmmmmoc%@&~ %t22)([Jzqhc`]ZWTQNJ}GzDwAt>q;n8k4g3f3f3f3f3f3f3f6l0a,d`b`nvkmmmmmmmmmmmmmmmmmmmmmoc'@&~Le/.%:wyphc`]ZWTPMJ}GzDwAt>q;n8k4g3f3f3f3f3f4h6l%IybfdfF|vkmmmmmmmmmmmmmmmmmmmmmoc(!@&~ $&{&0()VN}pgc`]ZWTPMJ}GzDwAt>q:m7j4g3f3f3f3f5k1b.jgifnvkmmmmmmmmmmmmmmmmmmmmmod)"@&~ VX/,%9!gshc_]ZVSPMJ}GzDwAt=p:m7j4g3f3f4h5k(LilkiB{timmmmmmmmmmmmmmmmmmmmmod+$@&~ OOjj)) +(.')LPge`]YVSPMJ}GzCv@s=p:m7j4g3f5k2d0 rnplo|vhmmmmmmmmmmmmmmmmmmmmod,&@&~**kk}}yyvvGG  ^M.*%7&Y~c]YVSPMJ}GzCv@s=p:m7j4i5l*N o r rm?{jkmmmmmmmmmmmmmmmmmmod.'@&~ LL~~}}wwuussxxaa 5(-&*GS][VSPMI|FyCv@s=p:m8o3d"2y tv qpurimmmmmmmmmmmmmmmmmoe/)@&~))mm{{xxwwuussqqttoo==fA-)%7,S{YSPLI|FyCv@s=r(P!Zjkmmmmmnf;7#@&~ss~~{{yywwvvttrrqqoommkkiiggffffffffffffffllZZ""l` N;)R"Xrjmmmmnf=9%@&~HH~~}}||yywwvvttrrppoommkkiiggffffffffffffffffiihh<<l` U"<+R#Wjlmmng?;%@&~tt~~}}{{yywwvvttqqppoommkkiiggffffffffffffffffffggllUUma U" ;,R$Wpjmng@<'@&~GG~~||{{zzwwvvttrroonnmmkkiiggffffffffffffffffffffffjjff77na U" ;-Q&W{jmgA>(@&pp~~||zzyyxxvvttrrppnnmmkkiiggffffffffffffffffffffffffggllQQob U"!;/Q&WpeC@)@&%%~~||zzyywwvvttrrppnnllkkiiggffffffffffffffffffffffffffffjjff22oc V""90Q)QwCA*A&CCC~~||zzxxwwvvttrrppnnlljjiiggffffffffffffffffffffffffffffkkcc00rt`Q'Au0Q.K'h k@D+Aruu~~||zzxxvvuuttrrppnnlljjiiggffffffffffffffffffffffffhhkkNNjtx20(A1P.N/I-KVAFEG,FII~~||zzxxvvuussrrppnnlljjhhggffffffffffffffffffffffkkbb..tozj,$#90N /N.N.M.D$k uJFLAN!""zz~~||zzxxvvttssrrppnnlljjhhffffffffffffffffffffhhllOOmvzOL $:0N/N/NE.N-O.H+P]HMN1 L UQQ~~}}zzxxvvuurrqqppnnlljjhhffffffffffffffffffkkdd00yr}m1$&=0N/N/N/N.N-O,L-E s|TNTHc"&(({{~~||zzxxvvuussqqoonnlljjhhffffffffffffffhhllQQqz~UP ,~2R/N/N/N.N.NT-O,O-G(TfQUV8 !O &sc VV}}||zzxxvvuussqqoonnlljjhhffffffffffffjjee33}ur5' 81R1R/N.N.N.O-O,O+L,G{[V\Q$k#&&..||}}{{zzyyvvuussqqoonnlljjhhffffffffggllRRu|YS 8#;1R.N.N.O.O-Oa,O*O+G&XiU[^@(S &rp[[}}{{zzxxwwuussqqoommlljjhhffffffjjff55xw8* 80R0R.O.O-O,O%,O*O*L)I[V_U(q'r244||}}{{yyxxvvuussqqoommkkjjhhffggllTTy`Y 9#;0S.O-O,O,O+Oo*O)O*G#] i TY]A)V &q __}}{{yywwvvuussqqoommkkjjhhjjgg77||<- 90S/S,O,O+O+O3*O)P)L'K Z T \V*u*q?99{{{{yywwvvttssqqoommkkjjmmVV~f\ 9";.S,O+O+O+O *O)P(O)H b  kRW \B.\&qbb{{wwuuttrrqqoommoojj;;@/!;.S-S+O+O*O*O@)P(P(K&OYR[V)t,qM>>yy}}uussrrqqppss\\ k` 9 ;-S+O*O*O*P)P(P'N(IgkQU[ C/^&dd||ttqqttqq@@F3 ;-S*O*O*P*P)PL(P'P'K$S ZOXT ,|0&q\CCvvzzbb%%p f 9,S,S*P*P)P)P(P'P&O&JlnOSYC9c%$$BB I6 9 ;,T*P)P)P(P(P['P%Q&K!V Z NVS ,} 3%piv"i 9,T+T)P(P(P'P'P&Q%O$M#O"Q!WC9g$*M4 79)P(P(P'P'P'Pd&Q$Q#Q!P+| 12`{-BL(P(P'P'P'P&Q7&R$P"bP?????????mayavi-4.5.0/mayavi/core/images/scene.ico0000644000076500000240000030717612747716313020717 0ustar prabhustaff00000000000000hf  00%@@(B.D(V( ecݒ]͕qetVPNœHXQBSOٕ(hmޘyq}!XYxk`epʇqbg,#4oyם{ߗc]MbߙfLD:zvx֙5UNߗdxdU?8sgBhcGS}n~b~lAWQ@Ek`Vߗe*C@Q7?gPt6"1T~xsvrSNsmPGMfQqdkog^2pq?1:+8@jRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRYYYYYYYYYYYYYYYYYYYK=4!OZF Ea6YYI:]LPWN'M_.YY+ `\TGYY *^B531YY/" > #UHYY;)8,@CS2YY&[D?(V$QYY9%7-J0li7YX5㴴( A(3[IJkaczlry]MY|p`gbVf;:5TEBV>T㴴ʧtjR UO`H`m/76#$)",#&LB\]Pl<;E[Xp$1H㴴ʛʺ|}_WY."@VY qjjkjkkkmlnnpopuN㴴=pkljlmlmnnmnnopuM㴴My4u.t.s.s.s-s-s/u0u0t0v1v1w0y2~9_㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴( @ 㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴 * ## % .!4+08-N/#0)+K/2/ 9C)'/%9 5) 㴴H.T7W<O8G-N8YNONKM?#K@m^hW]GY@WEdS^IO3E Q4P1QRim_MZN;(㴴Q;(|h,{`(se&wg$z71~w!{p0|'}-zmWaHI0ZJVBR=+u`H=}.wg3nG0fd+{o"r_gQ㴴W5FzU_rNWgwenzmlͳmto_hozueicelqT=B]9e㴴ҭѽغk<4) VVj\Up3OU'*!7+4162LFOgSrg[x24:`XpYHk6OO?HR_r㴴ὖ˪԰ٷ|{[TS/':E?Xx<)-  cmjcf]tyljge]yePpBXX㴴‘̢̤ͥͤܧȢzwt}3(8CC 4'uXg~`H=W;9\qrXUmaltDQS!2-㴴ˆΞ͞ϞΞΝ¢lxiPbsgzkeG.Š淉smcW")+-0G07M!-0㴴|ĖƔŔȔǔȔޗpxxhzG;Wx͘Ȕʔɖ՝ВYjQ/,"㴴uŽ‹ȎϊquipIŽđĐÐđďőқɋ㴴kćɁFHkn͒ń㴴a}|}|~yʼn~v㴴Xvvvvttvvuxwvxxwyx|{z}|}}~}l㴴Qpppnonpnpnoqprrqsrtvsuvuwud㴴Imkiikkkkkklllkmmlnooopoqso]㴴ޅEjghhgghgggihhjiiiijjlkmlnjW㴴?c`bbߗdb`bޗbdߗcߗcߙefdfcfeeeefihfU㴴|:ݔ_^ݕaޕaޓaޓ_ܕ`ݕ`ݕ`ݕ`ݓ`ݕ_ەaݕbݔbݖaޖdޕaߗcߗcߖaޘbdeffS㴴Ys/t1u2u2s2t0t1q/t0r.r-r/q.s0s2s1s3u1t1v3v5w7y4{6z7y7o#㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴(0` $㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴 C0>3B7K85,4+@4>2DFB9=9GFI;@8K?MKPIMSMaJKM=Q:H2O:F6XC`GNCP?KASYMPG>N<N:K>QBWBP;PDI8 C.B.C1M:W?OAI>H6MBK@FEQSF@ QSZSO?QKVU]m _aVRXGT@RATC]PeP`K[FZH^MVFVHWGQCMH `U eWXGYQWH I2P;YAS>U:X>T=[BT>XH`L^U]R ]]KII9UDUHcNiQ_KXBYAV=Q@WG[L[K\JZCP5P5R9T6\K VXdj_WYKdVSD [GhTkVgLeNhUiWp`pa%yp&~p&t"{rykwjscudwenZlVqWhO aPjYk[dNcMlWiSl\n\p[ tdr\%yl#nla\oal\mYlW vpltqqfgeutpwzhntfik^qmT|uZooly}guuarrui|}OhkbtxK`^QfhB?:>=20,%@?9>5.C6-bVOqkg~Z]`]`ehvwV[]PFHRMMdhdXbaCPL cU\scfoY]N:>kZ\oZ_dQOudaZPNjahw}g`c>21wyVJPniitwtzZXYZX^urtohomnoRYX;=9),!ED:[UNme]GC8WZZlvxPQObcgFBKniq[ZU~~x~L`Z{mctMPUGIO_^fZXbE5I./0"3$DGPUMd]Tmeiw'-&!' WXf{tqME\WWt êԸxudVkbMB<+ !  "#$"755<;<<:CDIOKGS?LU:8)#%$&G?Hb_pYZhYXkBY[193&%+,"*( ("724632350ZUcdZt\Qgg_wUNcOM\b\w_WtQLcBQTAORGWZ ǦȩɨɨɨɨʪҰʬpp|SKMA845,',#70-A@APgnGZ[=:9)%!%*",&!-+"XYcwwmh_Tkb\rj`ye^wge|e^y`Us]PjMS^0J> Ȥʦʦʦ˦˦˧̦Ш̲{\X\4+%*"?HDOW]KAH6"*%&"!)#-#71(TO^c[whZqh^uuqskkf\WmNQ]U]gTfj;KN ˠ̣̣͢ΣΣΣϢϣӣw~w_YaD97HHB92-)-XD0~_ƥ}ղ׵z}jcVJX]Sfmh|}wpdb{HIR]dnOX`.;2 ˜̞̞͞͞͞͞͞Ξϟ̝|kWho`t[AQoQxhլ̜ݪڨ٧٧ݩҠѯ}ai`YMKODDIe`n]Vh\[k>DD>D@ ǖȘȘȘɘɘɘʗʘɘ͙輔}rcw}[9?zۤסӟϜ͛ΛϛϜϜѝ֠آ͘ǤxhKNB/-, %(&,$+.+ ÐēēĒŒŒŒŒŒƒŒʓٯ{{q}vi]odO͕ȔȔɔɔɕʕʕʕʖ˖˖˗Θӝ֟Őɠtdw[>ZI3 Žō}xO2B.L2O7L; dG\KUKOHM8N8NARBPASQTUME KP ]_URF9MBPVWS\cid_TSUWGO7SAS?Q?TD\M^GdN^I^I^I^GX>U?VFR@T>UIOL aS fX^PWHb[^WUGP; YEV=YES<V:[CV@[BX@Q>UI^J gZ_W_R ]Z ]cD>H9]GVEZIePlUjQ`KZEZA[@T<R@N=aOYNYK_O\I]DM2P8O5W?S7`E YT_d)kzdc ^U]Ol^XKTEQ7W>ZAY9L/T7N7T@aLcP_OcUhU lY k\ k^iUcQ]JcOaJZF`JbMYAbEcH`GbN\J]G`MaMaJ`JdNeIcJ[JX?fMcF`J\@eJ `Y ^\UOZJhU`MbK\E]DbZ}W~UrZ`\`T~SPmvkn`ZkkG_lS@xJK{s?k_9hX,RC2VIIso;cY2UBIgVRk\^~rd`xrb`adqjV~TuuX{{XS~MyIwJ{nWZfTVVADlWVsch[HMZJNZKNZMKktrO`WHGDhbigbdhaajffqjpyz}IA>A=?z|D54L>>QTY?.21E1)2!)++ @$!D/-qbbxhjxrqIE@VMPRNTIIHUSRD47K25O;:H77|ni^VZ>24H:7uhk{~iUWG5;g[ZrghsageWU_QN}omMDDrmx_\]* z_\eQJJuux~|zpy\][[^b{vaaehopZej270=GB{NX^%+#'$[a^;3-qjPRP)0-$*)df_TQFK:9.% TKG_YQxojzppzC<5ihkp|~ZTVjis\ZcZTOeke|CTHnyykfrR[[SXahittrsZTaC,D;3<$/$"4"BJMXWlPE][Qf>?@!*$0)^an{NE[RPiYYzwePXH8>;8BG6E69<+60:=>RG^M?Pd_yUMhHF\,"+:3?H>SGOWcia`G?YNKdccȯ˱ԽtqeR@<.'"  #%(%!(#11*723?9BIBODGMC@LJXW.1.:>@5<83+)' %*#'!$;15[UfpnTZddcyIPXA]\9C?(- (%*,!)'& +'"3102-*350885jdyaXq_UnbXnh`xXPgNK[_Zpb^w^YuYNkJM]C;20(*$+R?,sUǣ|ŖʜԤ˜}}j]TGQZPaeYnkbwzowqieMHXOOY_bp\_o)6,@DC ̞̞͟͟͟͞Ο͟͟ΟΟΞӡͮp\kdO`vkmZmL',}ZyY}_GqSǠw˛۩ک֥֥եץݪפѰvZ`WKNKRYYcTV^b_gxqg\tf]tjiADK:A9XY_ ɛʛɛʛʚ˛˛˛˛̚̚˛̛͛}yl`HY}wpawU% ܦעؤ֣ПΝϞϞООООҠףڤΚɧ|uVF<-*&540=@>7=65<40;/6=9+0&ƗƗƖƖǖȖǖȕȕȕȖȖȖʗŔ|{v{q}xaHX_D՞˖˗˗˗˘̙̙͙͙͘ΚΚϚΚϚќסآȖœrw]BH;&2*)"#!,-)621ēēĒĒđĒđőđĒĒŒőŒɒ|~wp_q~{wp]65̖ȓȓȓȓɓȔɔɕɕʕʕʕʕʕʕ˖̖̖Ι՝՝Ǔ٬|lz]@aK2G9'ŽŽŽŽŽŽŽŽŽŽŽǏԩ|}r_JWo?3ďĐĐĐďĐđĐŐđőőƑŒƒƒǒǓȓȓȓȓɓ˕ϘқϙΘËҩx}yyr>wRɓŽŽŽÏŽÎÏďďĐŐŐŐƑőƑŒȓӦ}[DN\HŽŽŽŽϡu}x}}rr}ܫݧ{||{{{{{{{zz{{{|{{|{|||}||}}||}~~~~~zxxxxxwwxwwwwwxwwxxyxxxxyxyyyzyzz{||}||}}}}}~~~~utttttttssrsttsstttttutuuuuvvvvvwwwwxyyyxyzyz{{{{{}~}}rrqqqqqqppopqpqppqpppqrrqrrrsssstststuvvvuuvwwwwwxyyzzpoooonmmmnnnnnnmmonmnmooooopopqppqqqqrssrrrsssttttvvvvmlmllkjjkkkklkkkkkkllmmlmmmmmmnmmnooopqqoppppqqqqqssstlkjijiihijjiiiiiiiiiijjjjjkklkkkklllmmnmmnnmnnoooppqopiigghggghhgghghhggghghhhhiiiiijiiijjjkklkkkllmmmmmmonmggfffeefffeeedffefefffgffgghhghhgggghhhiiiiiiiijjjklmldecccbcccdddccbcdcbdedeeߘdeeefeeeefefffffffgggghihhijjjb````ߖ`ߖ`ߖ`ߖaߕaޕ`ߕaߖ`ߖ`ߕ_ޕ`ޕ`ޖaޖaޕaޕbޖaޖaޖaޕaޕcޖaޖcޖbޖcޖbߖcߖcߖcߗbߗcccccdcbcedefffghhiߔ^ߔ]ޓ^ޔ\ޔ]ޔ^ݔ^ޔ^ޔ^ݓ^ܓ^ܓ^ݔ]ݓ]ݓ]ݓ^ݔ^ݓ]ݓ^ܓ^ܔ]ܓ^ܓ]ܔ^ܓ^ܓ_۔_ܔ_ݔ_ܔ`ܔ_ݔ`ݔ`ݕaݔ`ݕ`ޕ`ޕ`ޖaߖaߖ`ߖ`ߖ`ߖaߗaabddcdfffܒ[ܑ[ۑZܑZݒ\ܒ\ے]ܒ^ܒ]ے\ۑ\ۑ[ۑ[ے[ۑ\ۑ]ۑ[ڑZۑ[ڑ[ڑ[ۑ[ڑZڑ[ۑ\ڒ\ڒ\ے\ے^ے]ڒ]ۓ]ۓ]ے_ے^ܓ^ܓ^ܓ^ܓ^ݓ_ݓ_ݔ]ݔ^ݔ^ޔ_ޕ_ޖ`ߖ`ߖ`ߗ`ߗabdeېZڏXڏWڏXې[ۑZڑ[ې[ۑ[ڐ[ِYُZِZِYِZُZُYِYِXُXُY؏YُX؏XِYِZِZِYِ[ِ[ِ[ؐ[ِ[ِ\ڐ[ڑ[ڑ[ڑ\ۑ[ۑ\ے\ے[ے]ے]ܓ]ܓ]ܔ]ݔ]ݔ^ݔ^ݔ^ޕ`ޖbߗbsDrCrCsCsEsEsEsFsFsFsErErDrDrErCrCrCrCqCqCpBpCqCqCqCrCrCrDrDrDrFsErFsFsEsDsEsEsFsFsFsGsHtGtGuFuGvIvHvIvJwKwK (                                !!! iii|iii    TLTL [X eXQ:G7LCaLX64%/"><JIGD@2C;BDOK`L`H]=_O]IB(J1aX io]MU; l^ nl lgH= ULULN?M9MDHCD6 ]P`MU;V?B:?@D994>?;2IBGEN;=/F@FGHL ]^[TI<3 5-KH\XLM52^T cRR>C>DC IATHXRPUJX MWSHYO ]a X_JXVmT^ `e Y]B=RDYN_PaLM3N8L7<+V<[AN>OEG2F5WHjIhIeIV>H;I@aZTAY@YCO@[\ah \^EOUS TQ PNQFI7I9TCU>W@VBO>SENBUGWGV?^HT<P5S=D1M@ ZRbQSFI= TKYZID K<K<P7J-GDFK;/ RL WN\D iQF<9:<07*64)!HAKIR9R>RGHJKS eccZRB7"6'MC^_LO*%HBTGVJMD30.*UGk^ddBI?ERIeXaaM\B`PjN^ \a[[KDM;R<^QYCL/O8G8H=oS hOP@UKV=K8TGmShQt^XME@PL kmK>G1V@TGV\^mgc^\]f]gKKM@K<I=_OiQYBL<SE\OVIYI^OS?ZKbM WA aQM9 QGbYcQG?4&A3=;=: D+D+K4F4>04-0+/*>5V>T?A57%5%@1=1@/@->1K9N?F:E>>CGHB<>7HL TX \]XRC=A;H9=2G? dXJBD:]LgNeL dOXIN=dSZKHEKO N^\q ^cRPMLUI^KbKWDWA\BYAaEZ?IBL?W?\G^XYQ f_n`p]nZbMSGXP\NUAQCG>IFZh ^gVL]`aqTWRCM?RETH`O[NRL_O`NTJ[K[JUMXJnZxh jW_INID>UAWCQ<H5D3<* E*E*M=NCG5:%2"A1-#72ZBS5H.B2M@K4@2C6F5B:0&:0@3F= RYB7;/;E2< 1< NTW_USG>@4;5NUYYPMUP`RQ>N?TLXPYNUU \S c]Xt%][}[yWXNETZaZcP\AUHXOYHN@K=S@RELB\NbTdUq^fQjP_GW@\K_SU@\GUFVGYRYL^KNDD@LC^ObMfY YTRFIBC<=,BEHPVKZHlg f[\J[ML:M>JA[RXRL3^G`NcZOK =!=!D;F>G/E*M7S>@*E4O:[DdE[EQRTFNLHOF>J9M7M7G7TGUKS@M7F4H5JC N^PXJFGDA>26 GTXV^X\XPMB>:4MFVOKS Wi`b V] Mj\z bg `^ e\XS U^ Ze`aPAD/N<OCKAN=Q9T<UHXGXJXU_T_IhTiVgPY=S>_I\JVO[C]EZDV?R>SAXHYH]ZTTF8G6H9K9J8HHH?V=hK`HTFRBR:]F\LhV l_``a]ZUN@WQSR B/B/E1D);!A)aIeHO4J:TD ]DkR fLXK[F[M `VNCJ8Z<fNL8P@PG\M`J bS^P[PbSVMPP c[UG [W_i^bZU ]\TQSAM8F8K@GIP[MFO:XGaZ rcmUfP[PUMHCSB\CR8R2U9ZFWCUAYDL?TCV=UF[HY=Q:dNaM_NbK_E`GcJaI`RdL^?V9^EU:G2G6N6R1]<gNh` c[QIPOYX fZm` h[h\ e\YJPC\Y]]cUXIL@\E]HUI F2F2I7Q;I1L/R?O3P0ZKdS`>]?\CR8UE[MS>[C[?T:I-J+L.:*94RM YMXB`Qnngg\OYK[N\M KSZsegLI3-=-Q>`FYEVCTE_T_JhLpWpYiOlReM^LXGY;[<[<W8\D_HW>O9S:H2D1L9gPjO]ISLXH_PcUi\c[T<]@dGV;G-S7_EXAR8fIiO]DS2fCePZS ^Tmj.v8u/n{mvgiollh]S ^V d]pe a[RJPEVN]MP= `?`?S=MBbUfP`WVFO0VB WED5C1L/Y6\<eCM1M7^E[F^KfT_Q`J eQ`RYIeM kTg] Z\bRcW \Z\WbZ ebTZJJB22+NIdR\DcMYEXQbK^C[UhagIgP p\jPdM`N^P\HZC^EW:S6Q>ZQZIL<THaVaXUJ[\\RO<Q?]JVHYCbQW>F)N1G1G4G/I,WDQAR4O;ZB_E RSNN MDU[)g{%ovmg[RMDP< VB cSt\t\YLR>VC\LhX\O [D[DP6U<S7R8 ZE hU`F]A\?L1R:Y:[? X@K9TH g[bHi[ fPaL[I cZ fY^F]IfLgXeQcN]JeUrf mZjXeTaNYJbOkWcKgLdHZIJ<WG]HeUbgYIiGdN^IgPbNT?]NZBdRXLR9[AX@]I`KYK]L]IVL`LdQh\_HfLiP[?bG^HWTI>P3bQbXT;P1T>Q<H-M8^?bGfe QUV`X` U[E@;5UM dY gVZGcRcMYE[FYCN9]FZFSD C0C0@(L4[?W;R8Y=T8\=^8U5U3W;U;S=G5P5W:R9aNcT[?X9VB[L[Nh\ p\iOgRpYqaiadKcIcJhSkUaJ_H]EaKjX^GdI jYjRdIjKb<J-R:a=Z8V7[=a?[8\B]T]QUE^I]M]I]N`LfNdGfJcD^AePdHiJfKcLgTeR_JgLiN w\iFnHqVj`iRgH`@oPdJbT hafY^UVMH<S@kTqXiPRB\J]FP:_EYBZAcFbI_C cZcZeYgXqajWiSlWpXiSfU`KZKg]j`i`f\0sl5xu%nh+yk8|zEGT]aiYWymhZMI5C:1/7*|wqts|r%w%x{owc vf)zm&uk(uc.o,n'ug&qy`mTlTdKr[({tj segU`FgKkN"nR!aI&fM(pW0m6x2o0|k5nF6z.m1y3x6uCA<8{FHQE?B;}8uC@AEC7~4y?5z3{5{3t4z6y4z,{p sfa^U\|w{|vRboYpewxqbmi\i`ZcXTXPOMFND@JE;VRIpply}zTTKK?1aVKo`Yx^Xrloj|a\~~~qots{}v|giqhalh\enfpjepnpvps{mu{ox}hss_tt[utZso\yv`{e^ vw{~muorxpsujrlknrxyruxlry~z~yrwshlsinyryvoojlTlauxnjn]WY][]W[Za`emhq~zz|qoo>@HhjuvnrR?AT::meffklOBIWGKB"%, 0V<2U89) 3/101$6G$'@%)`KPXDI}ptLCIripj]i}wvo}icmmhqonusqsllsh`flajg[dmbhk^eymsvmwqmo~idnc^gidkqkoigmppo cXYcXY=/+3A',PDB8*"( 4 ?,"7*"`PXJ/,* 5 .$ /0@.06":/*_Z_LFA5* ! 1!#HAG[\YE>;\PPuji=71vxTNI_XZ\SS:3, "+B;BLX[@F],'7 % ' C53COK &3!!7"<5!D<.$ #%4.!  7' 0% D70;5,KC=0"%(nsg'>&/7'DHD>BC!+$ 26(++$B"44 )T?)ypf[^ % #!}bM uxux,(NBEja^-""B+,6!$/xmusrnWOM;4/<2,M>>I:?\QTRQG'#9+&WKG[VN&% JDPUX^|uhtg^b¾ZMV(2*!*% ]ji57@ smoJHL4==JNNR31UB8,%%%-8A8)%!zy}fcd6@0~}w|SVVfhjgt}7B6(4"8A38I@/4$s-LJ0(.8/*   5A80% [A6JUN)"0 "  {?,:1qmf}ykdXGG:%3($ kje~y~xu{|yz{k^[XNLZPVNQJaV`w$*V_]UGX;K>0J2)3)t|W]Y_f{vz8&;@,D8"56-6>>)4-&!4$!1+=,Q[alpGNdK?ROAURCZc[lDBMKG@9?8#1('=-8OK^cpwwSDaD7MSLhXSobbSLoE8SD:~o_\SH$& caiivvLWd_gpFNP("2((>=BUVoDEM .,-;3:tqu(&bfbžsxeh}wvPc_)73'/&>VTdyghpyystg_n0(;1?3HH$-'37=49;024;6;?:E<@D6?BC3IJ8PC-C;)78==*,*%2 (C-+1&JMZ;?JPMWjbzSIfN?VSI^JBXTPgKS_ )$"NEVbjsmqdc}aay_b}bcTNlG1;7215'5-!- ?<@[NhF@P=3AWI[jeccVPmM@UXPiPSj2>B!0!)+!,;3AD7NA6GETRZcrdb{fgot]XxI=X>;PACVWUn`^]^RNkA9X ŮŮƮǮǮֺ|}f}rski:%)44$08%/7#,4!'+*+)'-(./$1;0)'(&(1 "&/%""/2"-1$,2(19-*2%&,$"<.<:8<@CH|yJFM7A?/B;;7A@8I9A?IY]CKMHCJbbu;DI3<=EpsJux@`dHOZ;/9JKORRaH?T>/=E:K<8B2*/0*,=57XIYSL^LBTRBXMIZ34:>;E8EI.-+;>D+B80:0WLb[QjUH]OAUI8K`Vjlj\XxOF]XXpFJ^%.')+081FBQK:THASME]>;J4H@dqzirjp]XxQIdOGfI>XXXoa`~il^a}EC_ ªªëëëƮ̲ɮ|xn{pXA1$<5'.8''(((,),()""" )&!.&  "&$33+46+)+ !"-,&(,!960D2=HAMCKP>AGLARNCRNKU)4*<>ARH_WMg;.Tc\tXOlNB]RF_NQc!-.'/%TJdZOlQE`QE_ZVnSKdLEWU]ifr~l|JWlNNfSMhLF`_cygjpuuSXs ĪĪĬĬĬīĩêūϸȱĬǮʰ̱Ū׹гw_[RB<5(&$$ &"($'("%  "'"& $&!'#,( ') & /(%6,/F/CGDOAFGTM^OR]69;QBWZOgM:P,%$RmyHbe.C5*'$'!+-(171.4)0;1/=10:/-1++.$++%($1&$8-0C=D=28L>O=@D32087>+-&-0)E:F_Sk\Pg`SnTG]RAWR?Uh`v]TnZQhVJgTJb/<3 +C=I`ZwXOi[SoSIcUNiRE^VNc199NJC``:NF9FA;GE08.&&//&5?4.2&03)191,+%,+$$")+!.1)0+':254236/2282"#=:7nf}f]r]Ql^Snf_yYNgXI]kaug^wYJbhc|JDZ6<>JHT[Qhheza^z_Ys[Rp[WqULhOBZWQhHal#I9.P;<>?;C.+',("+' 6;38=6.1'A@=rnnj`YraVpe\ubZsZRif]qwt_RncZq[SkULcec|YRiYVege}_[u^Zub_yc_VLgL>VUQfXSiCDL/N?*K=)11&9/AYRLdh_kwdv ƩƩǨǩƪǩƩǪǩȧǩȪɧǧǧǨƨƧƨũŨƨǨ˩{vyru|fhlDA?2)%('&%,#,$0&'/(#73.964DBI`akIDIMBPKUYSnuZkv_kvLai=ROOmr) !2# ,0#$!$#+,$#& ("'-)%6/02/+.+%*&.*!:9.&/%,30&- ɥɥʦʥ˥ʤʦʥʥ˥ʥ˥˥˥̥̥̦̦̥ͥͥͥΤΥΥͤФDz}||bMY^\a9/(5*%1(82(>A7>=6@?=_\d\ZaAC?L0!8('& ).%3*0'+ !  # E5"K=)O=*G4%lX?fU=[I4A1#..'NMVlbxgVpeUmcVjdSexk|i]rtprnnf}xqvmh_xwpstfgGHV3<9*>+/I;4F<6K<>REOif1C=(:/-C7&2-)B/]nv ̢̢̢̤̣̤ˣ̢̤̣̣ͣͣ͢Σͤͣ΢ϢΤϢΣϢϣϣϢϢңîufziXdv~}ylnyIED8*"5-!71$AF=EOJBGA@I:DA:5$1$,+( 0%/$)7(O8%kOa߸ʛʝ•ݫ٨بkj]DHD?O?MbO_n^riXp|n|m[pk_vkbwmdxtl~pcykax}}ge_TrNE[?IKADIABI:7=SU]io}DLR+B:%1(&6H@QR^?CH ΟΟ͢͢͡Ρ͢͢ΡϡΠΡΡΡ΢ϡϢϡϡϠϡϡϡϢϢϡϡТѢ~~dHWshj[krg}yy\JUPD>[Qh849!  ̟͟͟͟͟͟͟͠͠Π͠ΟΟΟΟΟϟϠΟΠΠΟΠΠΟϟΠ͟ѡš~xiyW8A^DQ{wzwiTe\?Krdw6 fItSE4"9$5"3=-M9&w[?fÑ٧ץեңңӢӣӤԣԣդԤգդ֤ޫܪɨ~\FB-63-784GIOd`pc[of`lw^Uboisummje]raSjfYukez~rtPPbBBM&+#@I<{ynauWQc$5)  ˝˝˞˝̞˞̝̞̞̞̞̞͟͟͟͝͞͞͞͞͞͞͞ΞΞΞ͟͟͞Ѡz}pYiZ:DT4BeUldKUwp{qfP^U4:.`齍ի~Útuǡv轎ԣڨգѢѡѠѡѡѠҠҡҢӢӢҢӡӢԢӣԢۨۨÓmjJ\S>?@;>DEDAGNQXDFL /#  ʜʜʜʜʜʜ˛ʜʛ˛ʛʛ˜˜˜˝˜̝̜˝̛̛̛̜̜̜̜̝͛̚˛vzk|cIYeQgAmZi|wzos`wP*1<џw֢ҟգץפ֥ӣОΝϝΟΟПНПРОПџѠѠџџѠҟҠѡѠҟդۧڥϞn~fHNC.01$*)%((!*( 680HFGOMMVY]LNU;@=6=68;59D=15.&/ /71340*5) )-B,'  əəɚɛɚɚɚəȚɚʚșʘəʙʙʙʚʙ˙˚˙˙˙˙ʙʚʚʚʙ͚ĖrzxxeObm]mwomUj>t@*ќ͚͙͙͙͚͙͚͚͚͛͜͜ΜΜΝΝϜϝϜϝНМОНѝОООММўҞԡڤ֢ƓqoU>?-(#/,/0!/3$7:.6;-5<01@/4?16@73A54>=4:3/5+"('$)  ǖǖƘǗǘǘǘǗǖǗǗȘȗɗɘɗȘɗɗɕɗʕɗɗɖɘȘɗɘɘȗ̚ḑ}uymm\i|w{tykRa4^֠ʖ̗̗̘̗̗̘̙̘̙̙͙͚͙͛ΛΚϚΚΚΛϛϛϛϛϚϚϛϚЛϜϜНМўԠآ֡đhkO:9+   ('.-6/&/&1&30(13$:B9HDLTKWIFM..$"0 ŕŕƖƔƖŖŖƕŖƕŕƕǔǕƕƕƔǔǔǔƖǕƔƔƕǖǕȔǔǕƖƕ̕ҭ}z|~|qjVf~}vruk~xdtR+3]%͗ʕʕ˗˖˖ʖ˖˗˖ʖ˗ʗ˗̗̘̗̘̗̗̙͙͘͘Θ͙Ι͙͘ΙΘΙΙΙΛΙΛΚϜҞסѝԩ|^}cEH4$+-",'( %'*)-)3,$00$+.!) ĒĒŔēĔĔÕēŒēœŒēĔŔĒŒŒŒŒĒĔēœœœƒƑœœƓƓƓ̔žww}yysbHY~u{yt{rdKSGњlҚȓȓɔɕɔɕɖɔɔʕʕɔɖʕ˕ʖʖ˕ʕ˖̖̕˖̖˗̗˘˖˘˗˖˖˗˗̗̖̖̖˗˘̘Θӛ՞՝pdkJrZ=@+#" +.'% ÏÏőĒÓÑÒđĐĐĐÑĒĐđĐđđđĐĐđđđőőđĐőđđőĐőȑ~w~~wiQdgRayszqztp`jR14](ȔƒƒƓǓǒƑǓǒǒȒȒǒǓȒȓɔȓɔȔȔɕɔɔɔȔȔȕȓɔɓɓʔʖʔ˕˖˕̖̖̖̗̕̕̕̕ϙԜԜҙҚܪ~ySjAYjR2. $ ŽŽ‘ÐÏАŽÏÏÏÎϏÏÏϏÐώŽŽĎÏÐÐÏÎƑ븈}|||quizkU`X5?vC3ŐŒđđĐđőđďőőŐƒƒƒƑƑƒœœŒŒŒŒƒƑƑƓǒǑǒǓȔɓɓɓɓɔɔɕȕɔɔȔȔɔȔɓɔȔʔɔΚҜљԝϞѩ˨x ŽƎܭ{{z|veQ]9 EjL˔ŽÎÎÏÏÏÏÏÏďВÏÐĐÏÐÏĐđŏŏŐŐőĒőőőőőőŒœƒƒǒǓƓǒǒȒǒɒȓȒȔɔɔɓȔǔǕǓɓϙЙ̑ Ê۰|wyyzl|umdLW.N }ՌŒŒÎŽÍŽŽÏÏÎÏÐÏÐÐÏÏÏĐďđđŐƏƐŐƑŐŐŐƑƑƑƒƒƒǑƒƒœŒőƒƓË Ë紆xh{{jx}panxl|S+/0oMɒŽŽÎÏÎÎďÏÏďďĐďďÏŐŐŐŏĐĐŐĐĐĐđŒ 䰁u}hS[`EL?u=&ŠŒŒŽÍŽÎÎĎÎÏώΎÏÏĐ ܩw~uhTYL-1km|ŒŒŽŽ ֣prdskxxvosMIު wawsqnmprx{pʝ~ ﴀ汅ͬ~dۤ{ ~~|~~}}}~}}}~~~~}~~~}~~}~|~ }}}|}}|||{{||}}{z||||{z|{{}{|}{||}}}}|}|||}}|||}}~~}|}|~}}}|~~~ zz|{}{{zzz{zzzzz{zzyxzxxyyz{zzz{{zyy||zz|{||{z|{{{{|{{|||}{|{|}}|~}}~~~}|~~~{ xxz{zzyyzyzyywyxyxxxyxvxyxxxxvxzzyvxyxzxzzzyyyyzyyyzyyyz{zz{{z{{z|{{{{||}}}~}}||~}}~}}~~~~z xxyzxxxwwwvxwvxxuvuxwwuvwvuuwuvwwuvvwwvvwxwwywwwvxxxxxxxxxxywyxyxyxyzzz{{zz{{z{{||||||||}{{|~}}|}~~~}}x uuwxutvtuutwuuututuvtusstssvvtuttsuuttuuuutuuuvttuvvvuvwvwxwuwvvwwvwxxwxyyyyzzzzyz{yyyz{{yz{{|{z{||||||}~~~}~w rrvvsrutssrtrssrusrrqtrqprrssstsrssrsstrrsstrstututstutttuutuuvuutvwvwvwvvwwxwxxxxywwxyyyxzyzzyzz{{zy{{{{||{||||t rrssrqtrrrrrqrtqqsrqqpqonqrqqrpqsqoqrrqqpppqpqrsqsrqrssrtssstussstsuutsttuttuvwvwxwuxxvvwwwyxwywwyxxxxyzyzz{y{z{r rrsrrqqqqppqqppppppoopooooqqopqoqponpqpppopppoqpqrrqqprqqrqrrrrssqrsssssssrstttuvvutvtttuuuvvvvvvvuwvwwxxxyyxyyyp ooqqqpppponpppoonnmnoomoomopoonnnnomoppponnqomnopoponppppppooqqrqqrqqrrqprrsrsrrttsssssqsstrtstvuuuuttuvwxwwwwwvm nnooppmooonnonmmmlllmmmmmllmmmmmnlmllnnmllmnmmnnnmnnnnonoppoooooppnoppoqqpqpqqrrssqqrrrrrrsrsrsssrussrtuvvtuvutvm kknonmmnmllkllkjjjkkkklkklllllllmmmlkkllllmmmmnmnmmmnnnmmmnnnmoonomnonpoppppoqqqqrppqpoqoqqppqrrrrqqsrrsstttstuuk jjlmllkllllkkkjjjijjkjkkkklklkjikljllkkkkkllllmklllllllmlmllmmlnllmmlmmnmnnnnpnoqponooppnnooppqqpppqqppsrrrtttssi jjllllklkjkjjkhhjihiijkkjjjijjjijkiijiijijkijjkjjjjjkklmjkkmllklllklklllllmmmmnnnonnmooonnnmonononpqopopqrsppqrrh iilkkkjiihijjiiighghijjhijhhihiiiiihiihhiiihjhijihjjijijjkkkkjjjlkjjllllklklllklnmlmnmmonnmmnnnoooponpponpronmopg ggjjjkigghghighghhgiihhghgghhhhhhhghhhhhhhihghiihihiijihijjjkijijjiiijjkkkjkkkklllllklllllllmnmonomnmmnommppmmnoe ffihgijggggggfgggghhfgigfffggggghhfffggfggggghhhhhhhhhhihgiihgiijiiihhhikjjhjjjjkklkjkkkjllkkllmkkllmmllnnnonnnne eegghfhgffggfgfeegfgefgeeegfecefeffefffeffgfggfhgffgggfghgihgggihghhhghgihghiihihiiiijjjijkiijijkkjkkkljmmmnmnllc ccgffgffefffffeedfffffddedeeddfddeeeeefeefeefffgffegeffefgihghhghhgggggfffghhhfghhhhhhhjhhhiijiiiikjijkkkklmmlklb ddeecfeedcdedbcccdeddeddecddcdcdceedeecccdfeeedefffefffffߙeffggffegfdfdefefggggffgggfgfghgghhghihhihjigiiijkkkkkja ccccdec`aabaaaaccaacabecdebbbaaaߘ`ߗacbߗcaߖcߗbߘbߘacddccߘdߘdߘedޘcߘdߘfߗeߗeߗeߘdeddfߘcߙdcdddefgdefefefedeeefffeffggfeggfihhgghhhhjiijjjj_ ``edca``_`a`ab_`b``ߖcߖbߖaߕbߖ`ޖbb`aaߖaaaߕaޖ_ߗaޗaߖ`ޖ`ޖaޖaޖbޖaޖbޖbߖcߖbߖbޗbޗcޗbߖaޖaޖbߖcߗcޖdޗbߗcߖcޗcޗcbߗdߖdޗaߗdecߘdߗceߗcߗcdbcedbcdbdbddbddbdgdeeffeffgggghhhgiiii] __dc``^ߖ_ߖ_ߕ``_`ߕ`ߕ`ߖ_ߕaߕ_ߕ_ߖ`ߕaޕaߕ`ޕ^ޕ^ޕaߕ`ߕ_ޕ`ޖ`ߕ^ߕ_ޔ_ޕ_ߕ`ޕ_ޕbݕ`ޕ`ݕ_ݕ`ߔbޔaޕ`ݕbߕaݕaݕaݕ^ޕaݕaޕaޕbޔcݕbݕ`ޖ`ݖbޖdޖ`ޖcޖaޖdߖaݖ`ޖcߕdߕcݕcޖaߖbߖaޗbޖbߗbߗ`bacdcߘcbcdaabbacdddceedffedfefhhhhiii^ ߔ]ߔ]`ߕ_ߕ_^^ߔ_ޔ^ߔ]ߕ]ޕ\ޕ\ޔ^ޔ_ޔ^ޔ]ޔ^ޔ^ޔ`ޓ^ݔ]ݔ_ޔ_ܔ^ܓ^ݓ_ݔ]ݔ^ݕ_ݔ^ݔ\ݔ_ݔ_ݓ^ܔ^ݔ_ݓ_ݔ^ݔ\ݔ]ܓ`ܓ_ݔ]ݔ]ޓ^ݔ]ܓ_ޔ^ݓ^ݔ]ܕ^ܔ_ݔaݔ_ܔ`ݔaܔ`ݕaݕ`ݔ`ݔ`ݕ`ޖ`ݕ_ܕaݔaޔ`ߔbޕcݕaߕ`ޕ`ݕ`ݖbޕ``ޖ`ߔbߖaߗaߖbߖ`ߖ_ߖac`_`ߖadacaabceededeeeefgffgf\ ޓ[ޓ[ޔ]ߓ[ޓ^ޔ\ݓ]ݓ^ݒ^ޓ\ޔ\ݔ\ݓ]ޓ^ޔ]ݔ]ݓ^ݓ_ݔ]ݔ]ݔ^ݔ^ܓ_ܒ^ܒ]ܒ]ܒ\ܓ]ܒ^ܓ]ܓ^ܒ]ܓ^ܓ^ۓ^ܓ^ܓ^ܓ\ܔ\ݓ^ܒ]ܓ]ܓ\ܓ[ܓ\ܓ]ܓ\ܒ^ܓ[ܒ]ܓ_ۓ]ے]ܔ^ܓ^۔_۔^ܔ^ܓ^ܓ^ݔ_ܓ^۔_ܔ_ܔ^ܓ_ݔ_ܔ`ݔ^ܕ_ܔaܔ`ܔ`ݕ`ݔ`ޔ`ޔ`ݔ_ޔ_ݕ`ݖ_ߕbޕaޕ_ߕ`ޕ`ޖ`ߕ`ޕ`ޖ_ޖaޖ`ߗ`ߗa`b`ߗadccbbadeggfffe\ ޒ\ޒ\ޓ^ݓ\ܒ\ܒ\ݑ[ܑZܑ[ݑ[ܒZݓ\ݒ^ݒ]ݓ]ܓ]ܓ^ܓ`ݓ]ܔ\ܓ^ܒ]ے]ܒ]ܒ]ܒ\ܒ\ے[ے[ܒ[ܒ[ܒ[ܒ\ܑ]ܒ]ܒ\ۓ[ۓZے[ܒ\ۑ\ܑ]ۑ]ڒ[ۑ\ܑ[ۑ[ڒYۑ[ۑ\ے]ܑ\ܑ\ڒ]ړ]ڒ^ۓ]ۓ^ے[ۓ]ܓ_ۓ]ۓ]ۓ^ۓ_ۓ_ܓ^ܓ^ړ_ܔ^ܓ_ۓ_ܔ]ܔ]ܔ^ܔ]ܔ_ݔ]ݔ]ݔ^ݕ^ޔ_ݔ_ݔ`ޔ_ݕ]ޔ_ޕ_ݕ_ޖ^ݕ_ޔaޕ_ޖ_ߖ`ߗaߖ`ߖ`ߖbߗ`ޖaߗbߘaߘaߘbߘccdfffeޑZ ݑYݑYݓ]ܒ\ۑZܑZܐZڑYېZܐYݑZݒ[ܒ[ܒZܑ[ے[ے]ܒ\ܒ]ܒ]ܒ]ۑ\ۑ[ۑ[ۑ\ۑ[ڑZڑZےZڑZے[ۑ[ۑ\ڑ\ۑ\ۑ\ۑ[ڑZڑZڑZڑ[ڐ[ڐ[ڑZڑYې[ې[ّZڐ\ڑZڑZڐ[ۑ[ڑZڒ\ڑ]ڑZۑ[ۑ\ے]ۑ^ڒ^ے]ڒ]ۓ\ڒ]ڒ]ڒ[ْ]ڒ_ۑ^ڑ^ڒ]ܓ^ܒ^ܒ]ܓ^ۓ]ܓ]ۓ]ܓ[ۓ_ܒ_ݓ_ݓ^ܔ\ܔ]ܔ]ܔ]ݔ^ޔ^ޔ_ݔ_ޔ]ݕ_ޖ`ޕ^ޔ_ߕ_ߖ_ޕ`ߗ_ߗ_ߖ`ߖ``ߖccdddߘdސX ېXېXܒ[ܒZۑY܏Y܏YڐYڏYڐWېZܑ\ܑ[ۑ[ۑZڑZې]ۑ[ۑ[ܑ\ۑ\ڑ\ۑ\ڐZُYِXِ[ڐZّZِYِYڐZې[ُZِZڐZڐZِYِZڐZِXِXِYڐ[ُX؏ZُZڐXِX؏YُZڐ[ڑZڐYڐ[ُ\ڐYِYّZڐ\ڐ]ِ\ڑ\ْ[ّ\ّ\ّ\ّ\ّZڐ]ڐ\ڑ[ۑ[ې]ۑ\ۑ[ڒ\ڒ\ڑ\ے]ܒ\ܒ[ے\ے]ۑ\ے[ܓ[ܓ\ۓ]ۓ]ܔ]ܓ^ܓ^ݓ]ܓ_ܔ^ܕ^ݔ^ݔ^ݕ^ޕ^ޕ_ޕ_ޕ_ޔ`ߖ`ޕbߗaޘbߘdߗcߗbސX ܐXܐXܑYۑZڐXڎYڎXڎWڎWُVُZڐ[ې[ڐ[ڐZې[ڑ[ڐ[ې[ېYڑ[ڐZڏ[ِZؐXُZُZُY؏ZُYِXُYِX؏ZُXُYُXُY؏X؏X؏W؏X؎X؏X؏W׎W؎W؎V؏W؏X؎XُYُYُZُY؏Z؏[ُYُYُYُZؐXِZُ\ِZؐZؐ\ؐZِYِZُ[؏[ڐZِYّ[ڑ[ڐ\ِ\ڑZڐ[ېZۑ\ڑ[ڑ\ڒZڑ[ے[ۑ]ۑ^ڒ\ے\ܒ]ۓZے]ۓ]ۓ[ۓ\ۓ[ܓ]۔]ܔ]ܔ]ݔ^ܔ^ܔ_ݔ^ܕ_ݖaޖaߖbޖaݕb܏V ڎWڎWېZېYېXُWَVَVَWڏXڏWڏZڏXِYُYُZّZِXُZُZُYڏ[ُY؏YؐZُZ؎Y؏X؎X؎XَYُY؏Y؎Y؏V؏WُXَX؎W؏V؎V׍W׎V׎U׎W׍U׍T׍V׍V׍V؎W؎V׏W׎W؎X؎X؎XُXَX؎X؎X؏X؏Y؏Y؏Y؏X׏[׏ZُY؏Y׏Z׎[ؐYُYُYِX؏XُYُ[ِYِXِ[ِZڐ[ڑXڑYڐ\ڑ\ڑ[ّ[ڑ\ڑ\ڒ[ڒ[ڒ[ۓZےZےZܓ[ۓ]ۓ`ے\۔[ۓ]ܓ\ܓ\ܔ^ܔ_ݕaݕ_ޖ`ݖ_ۏT ڎUڎUڐWۏWۏVڏVُU؎T؏WُWِWڎW؏VَXُWَVَYِXُXُYُX؏YُZ؎X؏W؏Y؎X׏W׎W؎X؎V؏X؎X؎V׎T׎V؎W؎V׍V׍U׎U׍U׍V֌V֌T֌T֌S׍T֍U׌W׌V׍U֍V֍U׍W׍V׍U׎U׍X׎V׎W؎X׏W׏V׎W؍Y؏X׏W׎X׏X׎Z׏X׏X؏YُY؏W؎XُWُY؏W؏X؏YِXِZُYِYِZِZّZّ[ّ[ڑZّZؒYڒZۑYڒZڒ[ے[ڒ[ٓ\ۓ[ٓ\ۓZۓ\ڒ]ܒ]ܓ\ܓ\ܕ^ݕ_ܔ_ۍR ڍQڍQ܏U܏V܎UێTۏTڏSڏTڏSڎTڎTڎVێTَTَSڎTَUڍVڎUڎUڎUڎVَUَUڎUڎT؎T؎U؍U؎SڎTٌVٍT؎T،S،S؍S،S׌S؍R׍Q׌Q׌R׋Q׋P׌Q،Q׌R׋S׋R׋R׌R׌R،T׌S׌R׌S،T،S،U؍T؍R؎S؍S؍U؍W؍U؍T؍T؍U؍U؍W؎U؎U؎TَUَVُTَUڎTڏUُVڏVڎUُVِWڐVڐWۏWڏVِWِVڑXڐXۑWڑXېXۑXۑYےYےYےZۑZܑZܒYܑ[ݒYݓXޓ\ޓ[ޔ[܌Q kDkDmFmFmFmFmEmEmDlFmEmDmFlFlFmEmEmFkFlFmFmFlFmClFlFmEmElElElDlDlElElFlEkElElElClCkCkCkCjCjBkBjDkEkDkDjDkDkDkEkFkFkEkElFlElElDlElDlEmEmFmFmFmElEmFmFmFmFlFmFmFmFmGmFmFmFmFmFmFmFnGmFmFnFnGnInGnGnGnFnGnHnGnGnGnHnHnHnHnHoHpIpJoJƃP    @@@-xxxIuuuHvvvHuuuHtttHtttHtttHsssHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHsssHtttHvvvHvvvHvvvHvvvHvvvHvvvHvvvHvvvHvvvHvvvHvvvHvvvHvvvHvvvHvvvHvvvHvvvHvvvHvvvHvvvHwwwHwwwHxxxHxxxHxxxHxxxHyyyHyyyHzzzHzzzHzzzH~~~IDDD.mayavi-4.5.0/mayavi/core/images/source.ico0000644000076500000240000002335612747716313021115 0ustar prabhustaff00000000000000hF F(  ྶĺ˾˾˾˾˾˾˾˾˾˾˾˾˾˾Ÿ˾˾˾˾­ĸ˾˾˾˾íƺ˾˾˾˾˾˾˾˾˾˾˾˾˾˾Įƹ˾˾˾˾ö˾˾˾˾ɾĶ˾˾˾˾˾˾˾˾˾˾˾˾˾˾ɽƷ˾˾˾˾ʽƸ˾˾˾˾̾øø¸¸¸ùùĺõ´P񾴦øø¸¸¸ùùĺ(, qrdЁpápàoào`̀n`̀n_m^l]~l]~l]̀n^͂p`~l]~l]~l]́p_̅pb˃pb̓qbђt|mps{t|s{r{rzryqxptpspsornqnqmpnrmż¹¶¹ƽȾrwż¹¶¹ƽƽzਜ਼q|lzjxhvetdqaq`o]n\n\o]p_qasbud{k}n|mᑀp笞(0 ~~}}}|{{{{~{{{~yʾǻʶöŹǻɾʾǻʶöŹǻɾ樛᧚ᥙᤗᤖᢔᡓᡓ᠑|ថ|ថ|᠑|᠒~ᡓᢕᤗ᨜᧛᧜᫟( @ a_ŽǺøķķöºöüʿɿȽǽǼŻźƹĹĹźźŻǼǼȽȿɿöüѾϼͺ˸ʵǴǴʵ˷̹λнöjhmayavi-4.5.0/mayavi/core/lut/0000755000076500000240000000000012747722127016447 5ustar prabhustaff00000000000000mayavi-4.5.0/mayavi/core/lut/__init__.py0000644000076500000240000000012612747716313020557 0ustar prabhustaff00000000000000# Author: Gael Varoquaux # Copyright (c) 2005, Enthought, Inc. # License: BSD Style. mayavi-4.5.0/mayavi/core/lut/accent.gif0000644000076500000240000000322212747716313020372 0ustar prabhustaff00000000000000GIF89aP$  !!!###$$$&&&'''***+++000333666999:::;;;AAABBBEEESSSTTTVVVYYYZZZ___zcSrdZ```aaagggjeahhhiiimmmoooppprrrtttvvv{{{~~~:<[Y_7])\#^1`>J*Q B2+N3D#V`h r{aEbL5"+[m~5꺜߷ϲԴٶ乣ǃċ’ʠןÇȈ͊Ӌ؍ގͳžïɱ!,P$*d 7p`IӦ?ԇ=-bH(U4Cn|ҥ *RDr% -[4aDI#Hx!RG @ 14P!C%RQ#G E4R%K0eҴS'O@5TO,x0†#Nx1ƎC,y2ʖ/cάy3Ξ?-z4RP୅"㳑Rn{湝;UYs55Xe[q7|iT^ p`mlrl-,syw#mlgL'Zvpwk-'[ztoq'\jyņs']gK ہnjxv^sn﹨aoh!޸_&+Eַ 6a;W@8%)a=HQ*U`^0Vi&98bMbԘ% g)"Ixb^|tRYf`~$Kr柑FIv8}*%~B eKydj験_)jXgMzf,쬅{%z2dn*+kڂknګ﷡<`oހ+|ۆ . 7',*X.$@+KA(,) |e2̬,0+3) x;pRsF ގM{R 2 4д <* na=*ltu>>CJPV]cipv|CCCEEEJJJNNNPPPQQQUUUVVVWWW^^^___```fffgggooossstttwww{{{}}} #)/6<BIOU\bhou| $*07=CJPV]cipv|!,P$pB 8t` 1d̠Qc &N@"e *V`ɢe .^ #f 2fΠIf 6n#G B BH"K0eTԩV4P!C%RQ#G E4R%K0eҴS'O@5T)SPN+m巘no|*kᯈ..m䵔^n绠nZwŻVn^sInɗ]iuZqᵖ\y5^mѵ[uv pܡFx!Gl̡GtF|aG jǍrzMn׍v1`6;h@"-bAXVj8e} ~H~#8$Θ#߄(8 - I_uנ7'< x!A·`2djɨ_0Vi杈*%}: erJWLv某J9'ez.ڤoTiIj&> &hTkfv+K|m$!k+-t.+wx Ģ4BЈ  sT` :{o'0 BT+*(#TPI#|2̱B,H(APǻJ'bϱ0J$kDɱXPI$ Do溒6ƒՆ IWbD"P/`mĢ n,HSAp @_=+ 9TtHpc- -ܐɒ ^x8ֱqҫo'7;mayavi-4.5.0/mayavi/core/lut/autumn.gif0000644000076500000240000000342512747716313020453 0ustar prabhustaff00000000000000GIF89aP$  ###&&&'''---222333444666777999:::;;;>>>???CCCEEEJJJNNNVVVWWW```fffgggmmmooossstttvvvwww{{{}}} !$'*.147:=ADGJMPTWZ]`cgjmpsvz}!,P$e̠A 9rѣ A!RĈ#I(i(QLR ,Yl0bČS4i԰a͛7rСSZU!XvG' C4R/le<קgx&iw*،=]wږ/YM8ēOu{1sS tM~agIu0W!xWzeU5VAXXFJd8vfy[x(n h5ؗ{&|J'cb5vy#TO'-s/ևWi9eaS[&h\ɭ(1YgVWccQȝd8^9FVgzԟW裁RbxRnXEhb(z Fڔ-Y&Q]~wfI {-t3FI%U!eXyD'I8lJ蚟 b712\IX@Ju<%FX>'fYy]eZjMd| a߱&kLj)"p$J.RK浮6T n5G.L7PG-TWmXg\7-)]-6_mօDPIKJ<nm,( % @&< 'Ax- `'4I$lBI[m&^Bqn9r[,DXؔLէ`"~-wK\Ou"| "["%KtgR)d0B|쟠Q zx_>/jD"RQ" (@"`0 gHPl;mayavi-4.5.0/mayavi/core/lut/binary.gif0000644000076500000240000000347412747716313020432 0ustar prabhustaff00000000000000GIF89aP$  !!!###$$$&&&''')))***+++---...111222333444666777999:::;;;===>>>???@@@AAACCCDDDEEEFFFGGGJJJMMMNNNPPPRRRSSSTTTWWWZZZ[[[]]]```aaaccceeefffgggiiijjjmmmpppssstttuuuvvvyyy}}}~~~!,P$-MhѡCg jTBLCXpQW"޺ثcbItb̛͹ϠC` ^({⮍ň +Yh+]DVT5t cgMqrx4ՙNrT`E VUu}HUY܀ -Tj $lYWmY)p2 2yxei6IQw؄/f_Y נk,.I_m&cSn 7q@ Iv=)#$^YO" sE9؃V$mwiMn] 'zBSNAEM~X6eZC5gdr[>ZЁVfFc8Hq'ԑ*|{Vȑ"EmfSƍ bk.$D.Fq):NJRkcg{ Q|e;)߆nQ9޿f9-~Y,B Ƕ#*w[ņ8%\·ReJ`>>???AAABBBCCCEEEFFFIIIJJJNNNOOOPPPQQQRRRSSSTTTVVVWWWYYY[[[\\\^^^```aaadddeeefffggghhhiiikkklllmmmnnnppprrrssstttuuuvvvwwwyyyzzz}}}~~~!,P$#` 1l#J4 -S 7 ę3ǎ<{Zy%"DbBdIMMr uUZ*V-] DCT=~tkɓ)W$eLG4-մ-(=O*tQ LÈQR͸#"GăRC/a&N;}[nRL>U$pŋ[4nԊXIbC~9Mo\sK:$Ԫs-;,嵸3 *Z8j˄Icei˴6۸ 5z^'rWUsйufNO^J'_ rc^9vH|HenIWATawJb1(5mbno3V#`"s!t. Y-j7Pu!hQya*cdbZ7$\蟓fFu\Fu4Hd %hRț]Yfvrl"tU'ӊlA\Q*c|bpfi}\7Xj˩WWNutJ^mhQ}[IZ) 1*׾ͱqJd}IQ߽ qhHal&6+wMmyaLPa![AJ6 #'UނzbK)j$b@-DmH'L7;JCӖP 4" @N Z#m5 >v>"X#\qXm-[ .' VDPA ".-P,|eL (rJCh!|P1bA RXXA])ر ,}-X,"9>C"'t{KDxՖ,s{]>Lg} E>[. XZM|6&qm"B : {&7|`pC vh.|𾠝@ G8ErN+m巘no|*kᯈ..m䵔^n绠nZwŻVn^sInɗ]iuZqᵖ\y5^mѵ[uv pܡFx!Gl̡GtF|aG jǍrzMn׍v1`6;h@"-bAXVj8e} ~H~#8$Θ#߄(8 - I_uנ7'< x!A·`2djɨ_0Vi杈*%}: erJWLv某J9'2q$ih^ hRYʚ\@bfv+km&;) ;njҮr22 pI+X%X` 7pĭA﷌`)/P 'r+4)+P(\12 |¾{֪&"#X J+tͭb0 ,H @Ѐrh2g`|C@'dJ# W}m&Mխ܊ [ن< D'AŸl 4η̳]c-#*p@|/ XPPc+X0|CG/Wog;mayavi-4.5.0/mayavi/core/lut/blues.gif0000644000076500000240000000340212747716313020247 0ustar prabhustaff00000000000000GIF89aP$ """'''+++---///000333555666777:::===???1m4q7v:{AAABBBPPPSSSTTTYYYhhhiiimmmsssvvv>BEHKNQ U X[^adgkn!q$t(x+{/258;>BFJNSW[_cglrw|قچۋݐޕߚ!,P$U"5JT(P&M#G)J9ry͚jМb )Rt҄%I1R!Aуǎ8pܸQ 1H!"@zR ңG"NDd7o>QrdɓR@q%L4mg7l=#)S 4uՇZqqcGj҈$iڵ-_ƜYfΝ=k(R լwmXf+OQ6[r?-TK%$׈c/XlgQ|V3sAk/j偣p#7哻p9g0Zy2p`P 6U{E}Q}UZx…vWq{!z :{l5k@f_vepG\^!&\2j1{LTcm]wp9Fq0(-xb*"阒LPn> "Z1RlbrDufZ_߭icoej>ޗ)IKy1JuᘑXYZhT~H` ƥ6g᪘)ɩD63J١]&訐9)2F!VT˅z9"MJ*f^*iPz t+:VY˛RA8K`lJoF1x[ BFp0mvi>VAAABBBAAZCC^PPPQQQRRRSSSTTTUUUVVVWWWYYY[[[^^^___FFbIIeKKiOOmQQqTUtWYvY]y\`|_d```fffiiiuuuvvvwwwbhelgpjsmwq|svy{~¥ũȭʱͶкҾ!,P$ 0 0dа!$Jx#6n)b$J0iR,Yl˗3hҨYæ7pP ABHH&] TQ4P!C%RQ#G E4R%K0eҴS'O@5T)SPHb桇bPC&}4:8"9E=9 - `ؠ(N x!Aa}22~7FhZ"nhɨ\N([N*%w"j$jr]A!sZ)f(Zy9(SgGfQiE^&.c6[t+k覫춛.A+KK?0":l #+qtk QIwKGdl4@8 !J+IwtE SL ݒ#c &1r*$t L T FH 3M5KNݲmt"vkL{t25YMt% s H$lJ$Pgw砇.;mayavi-4.5.0/mayavi/core/lut/brbg.gif0000644000076500000240000000316412747716313020056 0ustar prabhustaff00000000000000GIF89aP$ >3###$$$'''***---///444555777===???X2_6f:m>D8I>tB{FNDSIYO^UcZia ogtl{sAAAPPPVVVXXX]]]```kkksss{{{J O T Y`fkr!w&}*y$1č<ȕE̝PХYԭcصmܽw+19BLT^gqzȼÀȉ͒қ֣۬彃ŒǕ˝Ϧԯظ!,P$;xb8r@)b$J̜AF6m "TJ,dHQ"D̑7TH剓&L ҂ )P0QBD DC)ZĨG"ID$.aʤiN> %jRN,x0†#Nx1ƎC,y2Sٳ-_ƜYfΝ=ZhҥMFKUZ wE vؔfJ^[-減zZԾUcհaT 9df˹gNk5pV\U,IRn{湝;z{ߋcAg{&vƝpgk)[smU|VZwåqGY9G{uѧpyGj!Zc\mM[|V 6_%Jcz?aDء(x"b) wg^lPx!Cah>9/n2$F*Z8h䌉eM> fsZWlvqJ$eZ'ɥNBZY坈%L:槂Jb*K6h!tji^t+k覫춛.& x - +06"5@`/#'[4eP&g<.t Bp1HRnɚ`'}, &cb'e` »@G4fB4V3{ r5}qA4 6hݺE @TuoHzAr\$Q@{TP'VH܈0L@xoW|GޟxYw ds.nD;mayavi-4.5.0/mayavi/core/lut/brg.gif0000644000076500000240000000305012747716313017706 0ustar prabhustaff00000000000000GIF89aP$ ###&&&''')))+++---222444777<<<===???@@@LLLPPPRRRSSSWWW[[[]]]___eeefffuuuvvvxxxzzz /")5<#*60=OBHU[nbhu{CIVP\obiu|o|vicV\PIC6=0*# n{uhbO[UHB/<5)" !,P$ܱC9oqF 5iД9c&N,I:v!F+TH3l C)bDʔ(T\%.[x1d4P!C%RQ#G E4R%K0eҴS'O@5T)SPN+m巘no|*kᯈ..m䵔^n绠nZwŻVn^sInɗ]iuZqᵖ\y5^mѵ[uv pܡFx!Gl̡GtF|aG jǍrzMn׍v1`6;h@"-bAXVj8e} ~H~#8$Θ#߄(8 - I_uנ7'< x!A·`2djɨ_0Vi杈*%}: erJWLv某J9'ez.ڤoTiIj&> &hTkfv+kn'p슛nƛ |0tyL 4w+}Pb@2@8"\@KA#` &T;R`#T;2 q'GՒ\-!7L `@wēdP BBdI'4I <ЇTm-$T[f`m r|7;mayavi-4.5.0/mayavi/core/lut/bugn.gif0000644000076500000240000000330612747716313020073 0ustar prabhustaff00000000000000GIF89aP$  $$$&&&'''***---///333444555777999;;;===???FJNR V"Z$^&b'f)k+n-q/t2 w4z7}9AAAPPPVVVXXX```kkkmmmsssvvv{{{<>@ C$G'L*P-U/Z2_6d9iScܹL":'(¥"D)Hzd"b #W #ҙi#v*&ꄣW1RJ9j@ve)H*g)} Ib#ògOhT2ʳ6d#y~*k~z뤦0Xb&ppl ޚv`>/B(x+b+w ,$l(,, 0`A$qA PI<$b#{@ɣ Ǚ0Jpu+21H[4Oˢ2 ݊YBFKOSW[_dhlpty}ŒČǎȐ˒͔ΕЗҙԛםٟڢۦܩެ߯!,P$)JdAʃ;tȉ/]lْ+UL'CP":nܨA 0`xт )P0Q8lА "\a+qC,yIBZāCf7u3ТG.mt` 0|x9ZxG"I4lڔs']BȫS.ăYbl NTu 퍷8u QpUE˕RFۃwߛ;%n^{OeNkpXM Ro9yi}EX{ItyU}ڝo1[\}fQz :ZEQ}M߅kUSxryX`ɩ U(Z4,vRL4zFq`j<dVvFe~ 0`]7ASJX=bMH_omCġPh!A<lMGydf4l+lZ UDBZahy$gB* e#F5ȭ |Z%f wiҪcATrFm橧N$+Qޭ>{e]Ydٟo4i-]灲m"^kFխ{x 5%C.8˺㏆W]x.2A|"N ? tGzGz\אۖ)fQ]G-YO *̰'C|A#Xg\wY3dmh6؈6un@k!G#80i譸| bXAy# uEL狇uێ#CX Hzꗋ: u ,p$4:/wnQm>{H"muA1F_yH GuS[`M 5@ 'H Z̠7x;mayavi-4.5.0/mayavi/core/lut/bwr.gif0000644000076500000240000000304512747716313017732 0ustar prabhustaff00000000000000GIF89aP$ ###''')))---222333444777999===???AAAPPPQQQRRRSSSVVVWWW[[[]]]eeefffkkkmmmnnnuuuvvvyyy""((..55;;AAHHNNTT[[aaggmmttzz $$++1177>>DDJJQQWW]]ddjjppvv}}!,P$}D"EAD&M<M5kشqN@*Q#I*ER?}9c 1b€:ra2bx*4P!C%RQ#G E4R%K0eҴS'O@5T)SPN+m巘no|*kᯈ..m䵔^n绠nZwŻVn^sInɗ]iuZqᵖ\y5^mѵ[uv pܡFx!Gl̡GtF|aG jǍrzMn׍v1`6;h@"-bAXVj8e} ~H~#8$Θ#߄(8 - I_uנ7'< x!A·`2djɨ_0Vi杈*%}: erJWLv某J9'ez.ڤoTiIj&> &hTkfv+[nnE @DE&SI&daR@f@&&I1 ؁t 1YDP$ ܱ0@t>>HUb!!n$${BBBCCCDDDEEEFFFGGGJJJKKKNNNOOOPPPRRRTTTWWW]]]```aaacccdddeeefffgggiiioooqqqssstttvvvwwwxxxyyy{{{}}}?)=3<Vh*Vɧ꧲znʨ= [f)^䤫+kn'" A%B@"@3X [ 4|*XӋ BDr01;.4< r K ,n' 0b @"  0;C X5 5B A)hB$`'8p55:S 0 R01 A|Ղ n60@4َҌ1p@J +9(аCn .5)LN'HHq<OCJ ֈ:)#A0ҧ;4wM5g6rXBf0$..5PԐgT.kFG<8(** QU_vxP@)~"ˇFLĀ;mayavi-4.5.0/mayavi/core/lut/cool.gif0000644000076500000240000000310412747716313020070 0ustar prabhustaff00000000000000GIF89aP$ !!!$$$&&&+++333666PPPQQQUUUVVV^^^___```aaaggghhhmmmpppwww~~~ '!$*.714:=GADJMWPTZ]gc`jmvspy}v|yspfmic`V]ZSPGJMC@7:=40'*-$! !,P$٬If 3dʘ0]dѢ*UL$ (M0YI#G D;xБ5hĘ! .ZPq"&F !4P!C%V1#GMB,y҈J.aʤiN> %jRNJ-x0†#Nx1ƎŒ,Rl˗1gּsgϟA=tiӧQ୅"+#fW>V+men9o}: E8md^ngR{5V,U{zylNvk9nf~+zpZ cԈXư5^mѵ[u]}DvXʽvlϭwtv|pwbA`mҹu]ZW&Wk)mбu}cZ܋! 2)}XxWh$3&d9RGeVX2"$7:IwX H162((~VgV9d05.䈔I*2碝j [!dK>%~B*rV=- }>q>ձ<'Z,F jp8D؞HHItVBo2b,l 7<G 0 `"ԑb{ $z@!@H #3#m``/y!DH;ljƽ " to{FIM6#E+5 q4F/K 3݇ؽ$l,THwwߌ7G.Wo@;mayavi-4.5.0/mayavi/core/lut/coolwarm.gif0000644000076500000240000000336212747716313020765 0ustar prabhustaff00000000000000GIF89aP$  !!!###$$$&&&''')))+++---222333444666777999:::;;;===>>>???AAACCCEEEJJJNNNPPPQQQRRRUUUVVVWWW]]]^^^___```aaaeeefffggghhhkkkmmmnnnooopppssstttvvvwwwyyy{{{}}}~~~ '+(.1296A:H>PBVF]JdNiRoWv\{`einsx|N+m巘no|*kᯈ..m䵔^n绠nZwŻVn^sInɗ]iuZqᵖ\y5^mѵ[uv pܡFx!Gl̡GtF|aG jǍrzMn׍v1`6;h@"-bAXVj8e} ~H~#8$Θ#߄(8 - I_uנ7'< x!A·`2djɨ_0Vi杈*%}: erJWLv:sZXMz&nHevk٨"{͵fv+kbJ.aA:Ds̵*5lp\G\s!rM+$A+" |bJA(P33p -  2{D\ÂD10J23p* pJ+L RKR &S@4r}; H 18#D Ko+ +R`q9ȑG`;4_{1:;+B$Gs'*\ۊѸ{זa @Ȯ5$3 5|t5zﵯR Brl2[=_s;|$8+\LF? ؠok>ˁՌ4@hǾk,&H Z̠7+ ;mayavi-4.5.0/mayavi/core/lut/copper.gif0000644000076500000240000000331312747716313020426 0ustar prabhustaff00000000000000GIF89aP$      ! %)-15!9$=&!!!###$$$&&&'''+++---...///000222333666888:::???@)D+H-L0P3 T5!X7#\:%`<&c>(hA)kD+oF,sI.wK0{M1P3AAABBBJJJOOOPPPQQQSSSTTTUUUVVVWWWYYY]]]^^^___```aaadddggghhhiiimmmpppvvvwwwxxx~~~S4U6W8Z9\;_e@gBiClEnFqHsIvKxM{N}PˀQ΂S҅UևVډXތY[\^`acdegijlmoprtuwxz|}!,P$0p0dаC`Đ1F 7pбG?tL1cȔ1sM5kشqN9sԱsO={'P A*tE4P!C%RQ#G E4R%K0eҴS'O@-T顦O,x0†#Nx1ƎC,y2ʖ/cάy3Ξ?jR);UYs55Xe[@ %z4R୅"㳑Rn{ݼ{+5T4~Ja66 9dfޜoR xy˥s6]|]G]pfy)kα7tfvEiW!N]ōZrzEme&WqH"Fx!g^k̩tF|qvMxi).I3.n;* /Y 42`}lGR Xʨ$٘QHƘڸۡP95:dˆ9&))Z:ir鈪ijbscHJj K9~zvYXpzY襽}+y66VK!z磡l]s,l' 7G,/|L 0@CL4Ђ*X2E& (&P+#&T* 'DD@" 9[+sRE@0#VK (4ѯ,30P%k %EB^'ZBX@;mayavi-4.5.0/mayavi/core/lut/cubehelix.gif0000644000076500000240000000334112747716313021107 0ustar prabhustaff00000000000000GIF89aP$    &-38=!!!$$$&&&'''((()))+++---...000111222333444666777888:::<<<===???g?$j<)m9/q66t3=v1Ew/Nx/Wy/az/jz0tz2}z5$B)E.H4K9M?NENJMOL^ETJZHcBAAABBBPPPRRRSSSTTTVVVWWWYYY[[[aaafffggghhhiiimmmpppuuuvvv~~~z9z>yDyMyUy]yfypzy|}ҁӄԈԌӐєϙΞˤɩǯŵû!,P$0 2h B)bI#JbȘA8r0aČ!S4i "T!D-bѣPF*eT+TTbe]4P!C%RQ#G E4R%K0eҴS'O@5T)SPN+m巘no|*kᯈ..m䵔^n绠nZwŻVn^sInɗ]iuZqᵖ\y5^mѵ[uv pܡFx!Gl̡GtF|aG jǍrzMn׍v1`6;h@"-bAXVj8e} ~H~#8$Θ#߄(8 - I_uנ7'< x!A·`2djɨ_0Vi杈*%}JgʣQ9'ez.ڤoTiIj&> fNZg\'cfv+kuPn'!{T¹rvҁGX2 V1u<*dbm$(<@+pP_LL&KBg| [{01 >-X0m† 3BK%Cp>>???z};CCCEEEFFFJJJNNNOOOQQQTTTWWW]]]^^^~lIyjOng\siU```fffhfbrrrtttvvvyyyzzz|||}}}mgvz~t#r&q/s)n %jRNJ-x0†#Nx1ƎC,y2ʖ/cάy3۞?-z4ҦO[/V[ {Ev1Yg#r\t;w4UWk%0Xcv2[p3ls^SZu0W_e\1Zk+.ws]xC𢡊a^n[v]jŅZr\zuiqqెy1m x{]7v jƉrzIn ~_؟xt,y `h!@!}1.b~6BX;V"jbG#(q8$ؠ(8 - `^fz.ڥVix&%M飧NIfvK藀~*)ey'ZdRjH(m:*RP˵fv+k"`#&- !`#bKb6-_K ԒI@ś,0I"\+ 8r-c; 2$@I0H-r$0pv2@- 'hl,8)h?0ҵ\,8PQgR#Āӵb{/ג`B:B-)d- 4ح2RH+` o&o-@ Պ.^  l`~ .t/?|@;mayavi-4.5.0/mayavi/core/lut/file.gif0000644000076500000240000000246012747716313020057 0ustar prabhustaff00000000000000GIF89aP$!!!777>>>DDDLLLSSSVVVPSXSW]WZ_XXXZZZ\\\^^^GOaGPeEQiFPjFQkGQlGRlOWfHRkHRmHSlHSmITmQYgWZ`TZeV\gT\iT\jV^l[^cY_k_bgX`oYan[bm]bi[cq[du\dq\esYe{[e~]h~eeegggadjcfkaelgjolllknsppptttyyy~~~GcGdHcHdKfJgKgKhMjNjMjNjNkWkXkQmPmYqQnSpTpTqVsVsWt[wYvZvZw_x\y\z]z_}bjblgo`x`ybzc{d}e~fxgbehijkmmhokoostqrstuvnqwtxzz||~ɂĀʁ˂̃̈́ψĈŎҎӞРҡգ֥٧۩ݳ!,P$ HdᆒÇPŋ3^PKV7laHI`!Fm˗0ɛ8 ~peh۷g@ V+9ਐBҫ?0ғMFVEAlP%kQرp~88ixVWq~ǚ[!V"KEy|)^|0`lySĈԁsyȆjQ6Y„=]`'qΒ3CV =h\8c:UH̘_,aJ֯j# edžKe9P!X m(+*I MNџqą' )pIHI1!IiB aB)t%8Q'}! DI@74~XcR4\P[VpfL)di)`@9&b0N9 'V pv>@,̝'ih9 R9 @I%EڦN4i96A8LFzHPͪj뭸j]@;mayavi-4.5.0/mayavi/core/lut/flag.gif0000644000076500000240000000314512747716313020052 0ustar prabhustaff00000000000000GIF89aP$' 82& " $46 &&&+++222444666777:::<<<>>>???K`bz|IKacy{@@@CCCEEEJJJLLLNNNPPPWWW___```eeeffftttuuuvvvxxxzzz}}} &29"N0Q2gCjFZ\ru   &'!8#:0L2MBbDdX|bp{Ƥͭ׺!,P$Ba@[, N0}QQɥ0,F(q4fJ$Ty`dO+4"CE>f@(DRaH@\.y M0YQbI'1-4P!C%RQ#G E4R%K0eҴS'O!QZ4LK>: >8Ō;~ 9ɔ+[9͜;I$/vu UߪzثⰍB>;Y;+kaJW w_bFFKyev}w}:Xᮉ2ج䴕b~Y(Q݅/^䫝kE7{6_vrWW~zgj)zƞtgnZP[PA^LƂi!y̹tGma7}8Tpq\k=[{uHh).y3.!8BI_Qb (x 2HgT:&qCR HfX`Mz{ ch.(/!42a9F(囕zju*lJ(^ʉ项>Ff椂圙"J&^fef>m]inR:`ҩi}%>RVPʿ,l' 7Cwh+\&X KT".,|q)0'7PJ"Rl5#b1(5҃QX'm1)?tB Q۠ƿ\5'bqpR QO]g\iE&P!Mthl1'0  Q dDŽW"[ w^ ! h hx ,(F;mayavi-4.5.0/mayavi/core/lut/gist_earth.gif0000644000076500000240000000341312747716313021270 0ustar prabhustaff00000000000000GIF89aP$ 6 """###&&&'''+++---///000222333444555666777:::<<<>>>???Ys t u u v&w.w4x;xByHyNzU{ Z{"`|$e|&j}(o}+t~-y/~@@@AAABBBCCCEEEJJJLLLNNNPPPSSSTTTVVVWWWYYY[[[]]]___```eeefffhhhiiitttuuuvvvxxxzzz}}}<]>Y;`9d7l8h5p2w3t0{IFBMDIPGWIAQ@U`KgMnOuQ{RSTUVWXYZ[\]^_cdba`iĤqȧy̩Ϭӯֲٶ޺῱ƺ!,P$5x#4jظ#Tii*f~: dViUg ꤄Ͷv+k覫RB`.h' o{/ZdЍ`s, `@ @l; K7GT<D(w{K B,C+TqPK7`KP 1srA݈-K7/4-5` 1PÅ$ǻm6BRɶp7PA#"TA (޷}'c3 ĠI7kk ҍ&(,;,4's3ِ/"X kL,ב@M2(,A2/33^ ΰ4K :4Dҍ4Dx @K"x[ٶG8]b[@Z&WT H#u(P! (FTW W ;mayavi-4.5.0/mayavi/core/lut/gist_gray.gif0000644000076500000240000000374712747716313021141 0ustar prabhustaff00000000000000GIF89aP$  !!!"""###$$$&&&'''***+++---...///000222333444555666777999:::<<<===>>>???@@@CCCEEEFFFGGGJJJLLLMMMNNNPPPSSSVVVWWWZZZ[[[]]]___```aaaccceeefffhhhiiimmmpppssstttuuuvvvxxxyyyzzz|||}}}~~~!,P$ $XС%PpbF7rc"F(Y䉔)Xhٲ˗1c̤Iæ9rO@JH#J.]ԩS .8pÇYh1?)r ɓ)Wr&L6o٩' CFRNH 4`B!J:`| 9I-j]4#ܹ<{ _K<,XƎKI*p& g3l<'^*m*`"=+`lr1g*IW]Џ*e_UE;D[Y%p/\\u&OB^HaT`Dl)]cހI!EJ, W\zp$vH|ui~UE7ؑxI[Zk z6-מsB]Rbuq_VGf`f/o4$PJ a~V%eEA[%Km<^iv#k&|yn1"hx ^5ҷ)TgmEYٙ/)ҥveBwB&'[ {ͱQRha a %X})ްGHܒ-J%fPB fSDf) o Ta7գB ,lꞮu$fsu0t} WUvukB&}чkj\M*'MlLJ:elVܧ"YǠi娼"B U܊h/eJkt[kk_|n'7G.RB8A.qRG~`Uҕ iQF8~i`6 C/f:Sq;mayavi-4.5.0/mayavi/core/lut/gist_heat.gif0000644000076500000240000000341012747716313021103 0ustar prabhustaff00000000000000GIF89aP$   $).27< """&&&'''+++///000222333444555666777:::<<<>>>???AEJOTX]bgkpuz~@@@AAABBBCCCEEEJJJLLLNNNPPPSSSTTTVVVWWWYYY[[[___```eeefffhhhiiitttuuuvvvxxxzzz}}} #*06=CIPV\ciov| ,9FR_lx…ȒΞի۸!,P$8B BA 9tÇ A !&1dʜ9&5lڸy'9tع'=|(A :("RLBׯe4P!C%RQ#G ˈ,y2ʖ/cάy3Ξ?-z4ҦO,x0†#Nx1ƎC5R%K0eҴS'O@5T)SP@r$g!2s9W4UWk%kb$}V2o1\3{[u0W..m䵔^n绠N^ON>vsE^n[v&DkȽy=mӹuwPQj1wmЭu|Vvx)R\zIמn[6F\\yiޑ(N%-b8d2v݉hQq&EX!a}] !bB#G}^긟Pja¸:j8 zuH&yH>]H+^gh2 &Ozf*iY_[ꘇbi6#bke&)Pac覫+kլkK b#5{ (Яܮ%x@16bSMH6IA3 bn*.H 0N2$K," `/'("K6D #(dQ61U\a:ztƜJ*ڢ6>>???QT#Q?P o@@@CCCEEEJJJLLLNNNPPPVVVWWW[[[]]]___```aaaeeefffggghhhmmmppptttuuuvvvxxxzzz}}}~~~ 0?SmN 3-G[hou{No %27  +*,Y+< Nat!,P$aŋ9tعcP"E-BTР/^PbK-[tC9rؼM5jФ(P8ad <ѳ@RZŪb4P!C%RQ#G E4y&ʖ/cάy3Ξ?-z4ҦO,x0†#Nx1ƎC,iJ.aʤiN> %jRNJ[/V[ {Ev1YNfkmf~+z/UWk%0XcF+ymennhSZu0W_eld^yng𢡊9zбuiqqెy˝7s6{]7v jƉrIzInuZqᵖ\y5^mѵ[u]i1._6BXl'(,y }`~"!;h@! bgVj"}Hm#8duؠ~#߄(8 - `}ej~>sZH:%JJefމ%'BRjh橨]'R)g[`ƙ7fvnk覫.m٬+2cʻҫ/P@AܴM6B$Ѐ#p @`*؊AB{ 7rK k1 7vKPs ,Œp1L@p ;RH(, l,,oo.pJ6p#M9(=5Ooۃ%eWn6|p054-/a6h!@CۺX7Rs3" 7ƌI6KJ-,|3|<--('L2/| ͨs9,AOR ,3 %lpI-s $D8߁ύ'C6̐ 4.;ϋ+؞ PC$t@@&- i 'ح;mayavi-4.5.0/mayavi/core/lut/gist_rainbow.gif0000644000076500000240000000353712747716313021635 0ustar prabhustaff00000000000000GIF89aP$  """###&&&''')))+++---///222333444555666777999:::;;;<<<===>>>???@@@AAACCCEEEJJJLLLNNNPPPQQQRRRSSSUUUVVVWWW[[[]]]^^^___```eeefffhhhkkkmmmnnntttuuuvvvwwwxxxyyyzzz}}} '8IZk|*;);L]oK\n!2"3CTewEVgx!,P$H2+XhQ 8tܩ3G7m̔!3̗.\x # 4&Qi'P:qʄ%C G<{H!D5r)#F4P!C%RQ#G E4R%K0eҴS'O@5T)SPN+m巘no|*kᯈ..m䵔^n绠nZwŻVn^sInɗ]iuZqᵖ\y5^mѵ[uv pܡFx!Gl̡GtF|aG jǍrzMn׍v1`6;h@"-bAXVj8e} ~H~#8$Θ#߄(8 - I_uנ7'< x!A·`2djɨ_0Vi杈*%}: erJWLv某J9'ez.ڤoTiIj&> &hTkfv+䖫 ЎjKK O8.n‚s.<@#3.vk*60sDX@32h zZخZ \`4x,@5F! Akފ1P1(t̀rFũEB0hLŀ;mayavi-4.5.0/mayavi/core/lut/gist_stern.gif0000644000076500000240000000333712747716313021325 0ustar prabhustaff00000000000000GIF89aP$ ( """###&&&'''+++---///000333555666999:::;;;<<N+m巘no|*kᯈ..m䵔^n绠nZwŻVn^sInɗ]iuZqᵖ\y5^mѵ[uv pܡFx!Gl̡GtF|aG jǍrzMn׍v1`6;h@"-bAXVj8e} ~H~#8$Θ#߄(8 - I_uנ7'< x!A·`2djɨ_0Vi杈*%}: erJWLv某J9'ez.ڤoTiIj&> &hTkfv+-(!l0k∺.VKH RA1 0G15P/#/S ztpJ ~Iؖ(otJ(R̽*,0@10-@Ƞ1>rJz2D $_K*J |X !8TK ) [M[ Ֆry0y{G8@2u1͸m?]-#P] *2"B"^ky1s aWƎ7^)mɵl"l #,?zHA  0:$0PP/|P 2z7}&B"ۉbߖ>4=H@?: ;mayavi-4.5.0/mayavi/core/lut/gist_yarg.gif0000644000076500000240000000372512747716313021135 0ustar prabhustaff00000000000000GIF89aP$  !!!"""###$$$&&&'''***+++---...///111222333444555666777999:::<<<===>>>???@@@CCCDDDEEEFFFGGGJJJLLLMMMNNNPPPSSSVVVWWWZZZ[[[]]]___```aaaccceeefffhhhiiimmmpppssstttuuuvvvxxxyyyzzz|||}}}~~~!,P$Q&M*IѡCg;vyӦ3cƄe-XHyD$F ǎ:n؈'L|С &@`4CF!Jh1#m| 9$J+IdfM8uDF1(] ԤQC'Vh+4bɒ4-K0Ƀ6<.Q z'0`Ԃ.%,8?xk(HIV[un^>uS >+X5%%1-PMԃj/ĽbaEY Rq\9 6RVkTagXV6^pL1\OR5URɆE9 HgyWh/0gPFQ(݌ը[uwJxg-"Mek܇mcWtc Hpiafgb]TQmvxF`y$UTDE*N,UEǚ¶&m@Rŵ ~*jwauVucIRqVl^ Ef|06V]Uꛋd4Zb:2T#šUJybreiGۚ}7"ii1mVӥ=ʩ^6u I]vH 蠾~@+AAe1W٢0%bָJ\T>rUk{|!r{wZL uk2̸e;'GcԅZ uS.y@*x|߀.n^ ~ߝ݉~G凧qb@I*6p(|X(p#!i\yߌ@%,`p| I!H G xG%IFHAró{7J'xC(t"U'OA =I|€Csx3C&ٯo6xC*7 #L *V7;q AE%NT8oa 6~maBTPy+ q[Znͻng_4rXɆVdfiwpGi sށQem~}7xYhfIeCXf@`w W-bt*QeAWƣpg`BXs"Y[D!:(e~TGaV*^3T#P&xʹ9r"8SC b#BcU.vٞH !fN1#_[!|YbVF˱fNi6ƵFc9"zg֧'B#fbpncmQ갑B-uIݘ;E ժ ᮭڬk&P 7G,Wlg[Xp@#h) zlZ0!e@*&b+lq'p} @p+6w& O ÂP)'Pm)L_с+zlX R͂D4s2jbX*`R y+L6q!^( hS=xϚ0+7Yq`hR4&}(\ͦtBx2@x+oqxAn Pp Xw/o>;mayavi-4.5.0/mayavi/core/lut/gnuplot.gif0000644000076500000240000000334712747716313020635 0ustar prabhustaff00000000000000GIF89aP$  #-3 &&&'''+++---...///222333777888999:::;;;<<Z`… FXbƍ?YdʕDЪY[<`2W(QH2u u`_jkb97/̙绢j`8lcLm͝;z Z+⯋:mLZYzovC%q)z6KMWNoq'\ť6^r\l{kU[}e~ wZxǭVrl+^|}wġ&rlއ0)]C(HθdNRV]%B]pV"cȤa>1NUߙ?蟅D8I҈L4%c bI JFdַ ]X$*')z} 镒y]ƞjYh(NH뚦 ʥj y'UgZJ좻eƪYj[lmR)XN&6{dgl' 7G,GL Kw\oqĐDAɿ" P/t0p̿HrC / bI/)-#?\B)-:̿"$41+dR 0 q@RAX,Iؿ@*`H ""p Lw3op/:@0 /qK>0*wlͷߨN+m巘no|*kᯈ..m䵔^n绠nZwŻVn^sInɗ]iuZqᵖ\y5^mѵ[uv pܡFx!Gl̡GtF|aG jǍrzMn׍v1`6;h@"-bAXVj8e} ~H~#8$Θ#߄(8 - I_uנ7'< x!A·`2djɨ_0Vi杈*%}: erJWLv某J9'ez.ڤoTiIj&> &hTkfv+k.t~'r羢$KSĽv; PB3H*"T P 03P&4@/ϼ @?+ b#AGlI"D>cKղ[ Ϡ!DԜ@2ϼ]*7@>>???@@@CCCEEEFFFJJJLLLMMMNNNPPPSSSVVVWWWYYY]]]___```aaaccceeefffiiilllmmmpppssstttuuuvvvxxxyyyzzz|||}}}~~~!,P$p@ L`B :q"Ŋ-\Ȑ1ƍ;vȐ#I0qI)S¥˗/dȘ1 8q̱s?"tHG0P! ;Xbƍ3f|!䐓)0y*Xд9F4= J(RA5UI`(0+][|1ّ%OQɓpiּiOBY S#\1d]h {lYhUt2/uuwѣ >Tي6b )L$J-?ÍetݝfG_~)%kQtPUqW"xY h3N]8GQ=6u &fՈV$nu fL&J Ǟ7ƧWjX!QvXbp0h{Y؜j&XuHCݖdu4o@d0V#rGg l{2֧VIepjNƢ5ꚇa%Z/j\ǽSOp\Q!ug~yz%JYeKj^oUc?Vǒ UYQPd斤fgnf#q*t=jWb)^ojkW^ ElYi{Ю렻^ևTt{ .7[+rGprv$pC!Y|qBQ{G Q@u"C!~;?P _<1{7<EDBNu. Fw@ Tǀ,P![AF@dp9gE )̰ͱaP `8Eaa朠q_x&: ;mayavi-4.5.0/mayavi/core/lut/greens.gif0000644000076500000240000000341712747716313020426 0ustar prabhustaff00000000000000GIF89aP$  """###$$$&&&'''***+++---///000444555666777999:::;;;???FJNR V"Z$^%b'f)j+n-q/t1 w4z7}9AAABBBPPPSSSTTTVVVXXXYYY]]]```hhhiiikkkvvv{{{<>@ C#E'H*J-L/O2Q5S9V[B]G_LbQeVg[jalenkqptvxz{˂͆ϊюӑՕטٜ۠ܤާ߫᮹㲼!,P$aZ**TLiZ钥J&I?}ѓ;ȗGK,WT2EJ(O4aDI$G!"DH0^hb(N(Ab_2x*!)M0Yzqbŋ7vrdɓ)W|sf͛9w$ТG.mT`A buQ"E5rR$I(Ut S&M8uRW(QH2u uઃU2$0Xcv2[o3I缢&ڪL X,㲏J^[-f$7z/iQ^rau|6Zm/4w绠;p%WW{MnPqpZys&{Y7B@p*&8dIk̥tF]|J4[O~Pb* ybEm1fqgwF`1fZsE!^%AJX 8&bW z"T+9f2a}~He|b]H, iNebcojJa.ء:.8S#1W `v$Byޣ7"(驻6kO°s)BBRbx+U\&b{(,z,¬qāƧ.I+(ڭv%:k%o +ޓ ko%1ֺK-,0,4l8zܱcN8nܴYs1^lReJ'N9bdK >|Q0`XE\nM$ެnlm(: bcZq'z2)DhjX'؆On'7G.C>EHPCwQ<eA$S1aG Ft@$C ԠSC@ e|! (PEtGz-<`AGWQ>%@"(lQ 8 x w*x (t@F)p#.)jP3PAt}C .p <%W!0%`L*$|J2P)Sт$AX5qq8:ZaG>;mayavi-4.5.0/mayavi/core/lut/hot.gif0000644000076500000240000000301112747716313017723 0ustar prabhustaff00000000000000GIF89aP$ !)19&&&'''+++<<N+m巘no|*kᯈ..m䵔^n绠nZwŻVn^sInɗ]iuZqᵖ\y5^mѵ[uv pܡFx!Gl̡GtF|aG jǍrzMn׍v1`6;h@"-bAXVj8e} ~H~#8$Θ#߄(8 - I_uנ7'< x!A·`2djɨ_0Vi杈*%}:TF!e~GIj&> fNZg\Q9',h^* fv+kGƛ+  -Ax{n`TG "`غA bm;@,wK/ "b @ 3<#2 C1SlF#dsFs̀,0`@Qw`-dm6;mayavi-4.5.0/mayavi/core/lut/hsv.gif0000644000076500000240000000303112747716313017733 0ustar prabhustaff00000000000000GIF89aP$ """&&&'''***+++///555666888:::<<N+m巘no|*kᯈ..m䵔^n绠nZwŻVn^sInɗ]iuZqᵖ\y5^mѵ[uv pܡFx!Gl̡GtF|aG jǍrzMn׍v1`6;h@"-bAXVj8e} ~H~#8$Θ#߄(8 - I_uנ7'< x!A·`2djɨ_0Vi杈*%}: erJWLv某J9'ez.ڤoTiIj&> &hTkfv+k rn4G%x`qTAw;s<!@TKg DR 40"<hr~$yH@-Wr̄L!$BB}r Wb"A;1!7|5={lp-;mayavi-4.5.0/mayavi/core/lut/inferno.gif0000644000076500000240000000317212747716313020601 0ustar prabhustaff00000000000000GIF89aP$   ( / 6 > ###&&&'''+++---000333999:::;;;??? F# M( T. Z4 _9 b> fD hI jN kSlXn]nbnhnlnqnvm|lAAABBBPPPQQQSSSTTTUUUVVVYYY]]]^^^___```iiitttvvvwwwn~ysK>N:R6_+[/V3d'i#.^0[4U8Q2Yk$g!j"i&f)b(d,`=K:NCE@HGB  %,5>GQ]iv!,P$h 4@B -\C 5l0^ŒCK.Z)L(QT2&O4YFM7ođ3N;wѳF4P!C%RQ#G`ˆ$ J,]”I&N<}J(RLBZ`… FXbƍ?Ydʕ-_ƜYfΝ=ZhҥMFط*`#ⱍBV;er9hT^pW`u6Zn/L]zGOk5pV\}ؤ촒V~Y溞K:xwóNctwomgpߩvxaUsmQ[|Vwa5 Gr9Wzuͧ]iyq%RbtWoe ި;ףa0顂57:*P^8Cr XY`%Hd xȟ))fBnxG.hc~1 * *em6bNdU&n'y#AZa,Jg&%l:*>9fZgI2bLhNifzXZYٙ"k覫+on l2ۉ!>I[)$b T#"<  /\"<[S$1 trL@r%r tb'l/% 0"Ҧ( 4[w` EIÛ(} h2Rݦ$Z\vg׍v́0$9}7`-⮭tӂw^EC uQPI❣n #L;mayavi-4.5.0/mayavi/core/lut/jet.gif0000644000076500000240000000301612747716313017720 0ustar prabhustaff00000000000000GIF89aP$ '''+++,,,000:::AAABBBEEESSSTTTVVVYYYiiivvv&2=JU`mx6 ,!_J@Uis!.:GS`mz7Vju`LB-#!,P$ !R$I(a(QLR/`”1s& 1dX,Y:v 3bx*R8a"B 4P!C%RQ#G E4R%K0eҴS'O@5T)SPN+m巘no|*kᯈ..m䵔^n绠nZwŻVn^sInɗ]iuZqᵖ\y5^mѵ[uVāqqెy1mбui6w7k˝7s6{]7ox"_',i Eڷ`6;X@IY ֨߃%*H`/4 97a>{Iߝ38'!= xaBnHx*m `IA"aHf=JuzXwEY<%ëF eta^fk6*Bg9֪*~9-k覫+kou0nƾl+\p W,o|HP.nlXP ,$ sB|sw @1B p4 vkA7Zwm.x- !h ;mayavi-4.5.0/mayavi/core/lut/magma.gif0000644000076500000240000000326212747716313020223 0ustar prabhustaff00000000000000GIF89aP$   $ , 3: ###&&&'''+++222333444666777:::;;;<<<>>>???BI"Q'Y7l,`2f=qBuGxMzR|W}\~`@@@CCCEEEJJJLLLNNNWWW___```eeefffgggooossstttuuuvvvwwwxxxzzz{{{}}},.~/}1|3{9v5z7x=r:t?pV_[]`\e\k\q\w\|]JgDkAnGiNdRa_adgjmqvz~ejot y"~#%')+Èʍϒ՗۝!,P$8  .@B+\C 5ę3N;wi (SHR劘0c)%-\xb 4jְi͢E9z)I4P!C%RQuYdʕ-_ƜYfΝ=ZTRLBZ`… FXb8_=I$J,]”I&N<}JݤK>:oUXo5cرM8>Y-嶗j3^{KS{U]^Lv6䴓Z~Y.wC%=կY s=5㲏J^[-減zΞw4S#Ωgtf|igpޡfx)l{Q_PkFpܙFx!GX5fs6{]gԇ`q᭖\y)VV]|V_pݝcIh^s+ ]ƈ &9~"6e0Xo52$E#Q ڸ&:8!q^bCv'Y߃}9ʘ!`ha J 1vxH*)rgl>J9'wij(M8jf[2jb rk[ᚨKQ N.l KjqP+kl'" |` xn L H<Pð8\K' dBdtr&/lI*>ar( ,G(  ,,J!=7tRm5, zJ0n7䰵|Ios-7,tۍlxsRHRG5pNOng8%;IΥq7G駧93N8(p!l/9(.' g.&{h/>zD췿n@;mayavi-4.5.0/mayavi/core/lut/nipy_spectral.gif0000644000076500000240000000355312747716313022020 0ustar prabhustaff00000000000000GIF89aP$ 19 !!!"""###$$$&&&'''+++---...///000222333444555666777888999:::;;;===>>>???OZl{@@@AAABBBCCCEEEFFFJJJNNNOOOPPPSSSTTTVVVWWWYYY[[[]]]```aaadddeeefffggghhhiiimmmppptttvvvxxx}}}~~~9_FFyy4KyVx .Py}q-Ki{݁܂̫!,P$dA#I!:D!F=INN+m巘no|*kᯈ..m䵔^n绠nZwŻVn^sInɗ]iuZqᵖ\y5^mѵ[uv pܡFx!2mбui6w7%7s6{]7ox!_',i Eڷ 68$} zHc~;X@!)a=Qf"u_"](- 9xhZ%BcRjxhr$9iVމfK٧F)dVz$yN hnXg"䖩'cfv+[1'-3!.ֻz{L>)hK< E(4AT8m;L@(# X  h/ 9Q@p7Q|K ֎̶P1@ C7 HC0՜J<ج@\#@0D<⬀̀@0 O;@CT3%7Ģ7R`9p/.3}M<< 7>cw*9-+7':"=5004 !!!$$$&&&'''+++000222333444666777999:::;;;>>>[_VQn irw|dC'M!H$J MGC@SPVZ ]`cfi$m(p-s2v6y<|AAABBBCCCEEEJJJNNNPPPQQQSSSTTTUUUVVVWWWYYY^^^___```aaafffggghhhiiimmmppptttvvvwww}}}~~~BFKPUY^cgmqv{ '0:CMV`ir|Ӄ֏٘ܢ߫!,P$_h 'R1#,H@ 4jȱG?2H#G̜AF6mܼG:uG>})M:yj.^4P!C%RQ#G E4R%K0eҴS'O@5T)SPN+m巘no|*kᯈ..m䵔^n绠nZwŻVn^sInɗ]iuZqᵖ\y5^mѵ[uv pܡFx!Gl̡GtF|aG jǍrzMn׍v1`6;h@"-bAXVj8e} ~H~#8$Θ#߄(8 - I_uנ7'< x!A·`2djɨ_0Vi杈*%}: erJ9䐟j&> fNZ6囀F!e~lB`ƺ'dv+k覫 >>???@@@AAABBBCCCDDDEEEGGGJJJLLLNNNPPPSSSTTTWWWYYY]]]___```aaaeeefffhhhiiijjjmmmtttuuuvvvxxxzzz{{{}}}')*,-/023568:<>?ACEGIKPSVY \ _cfjmqt x$|(,048>CHLQUZ_dhnsx~ÎƓʙΟѣӨլװٵ۹޾!,P$Y 1cň  SJ%*O:q=zc9ry 5jҠAc 1b| -Z`b )R@y %J4P!C%RQ#G Sdʕ,_Ds͜:{ :JR0md&\aĉ/fwE2-5k O@4ҦOL*a*8:SaLo;+.^M&zUZwe ܕ얳gλԉ򿀏Z8+b:Ll7m;hWyf1|UGv+ol'xt5rU{Q7HٷUYÅ`izUεtfIf3]%u` (t}N]eaqTPޔ=:x,iߋ|Hkϝc'^Iي۽ĉ$jcTf;2h%qF^iSpH9*H">>(i.v 㗛Fᩝ%Vc}E.i媘{>zkڵq:c~ 2p3&WjꟖUʟŦy1d3̬'g欅Eq426Zk(2fڻ)V ,$l(,$?2B 8rL +1hD.2ԒB HK9Pl#PH8( ,&+҂ȊP9L@à -7EPN- #HܓhL,7I &R6nе`PE|lI㊤^73IЛ1Bv9$B 1XkPN|\ ف0L9l0A 2J>>???BBBCCCDDDGGGJJJLLLPPPRRRWWW]]]```aaajjjmmmoooqqqwwwxxx{{{}}}   #(-2 7$<(A,F0L4Q8V<\AaEeHiJnKqMvOzP}RTVW[_chlpty}ÌŏȒʔ͖ϙҜԟ֣اګܯ޴!,P$G 钥J&Ii@gN+m巘no|*kᯈ..m䵔^n绠nZwŻVn^sInɗ]iuZqᵖ\y5^mѵ[uv pܡFx!Gl̡GtF|aG jǍrzMn׍v1`6;h@"-bAXVj8e} ~H~#8$Θ#߄(8 - I_uנ7'< x!A·`2djɨ_0Vi杈*%}: erJWLv某J9'ez.ڤoTiIBĚ|6$bfv+k.iL %kd + !,sH*#@PTmuO|-?̪P*'0Dkי A,"wt*Ir4@'>m$ 䤗n騧ꬷ*;mayavi-4.5.0/mayavi/core/lut/paired.gif0000644000076500000240000000324612747716313020407 0ustar prabhustaff00000000000000GIF89aP$  ###'''+++---...000222333444666777:::>>>???AAABBBCCCDDDEEEJJJNNNSSSTTTWWWYYY]]]```fffiiioooqqqtttuuuvvvxxx}}}*+1';LM^^}@{Loo8/F6H;aE|SYIkU|b"11cq̓ONX֪_@O^kcko{n~&}*~mAXvKr[l{:vr[ˏgޭ3{I/|rz7mpe]}upwV;ƞtOq}}Gi!WkͩXև?&}y߉Vr!Ɉ6օ•q>s ])Wq_8X%We[2e;F+R9iu\N"@y't j&ٟ9#n#ONJhndFj#]zjk2hꠅ)b(7 ')ÚZ{웟*nEVf5/覫+k AJl`/- kp$B*z@J2pW.A ! KR  vDA[|0ƿB/0(Ђ(,P-1RB6  @ .30rb/ 7 U A!b A (= K$*-+t]/- 6ɤX*=q2Vg!J) ]翬!PrKy@ DGgw/;mayavi-4.5.0/mayavi/core/lut/pastel1.gif0000644000076500000240000000344612747716313020516 0ustar prabhustaff00000000000000GIF89aP$  """'''+++...///000222444555666777:::>>>AAABBBCCCEEEJJJNNNPPPSSSTTTVVVWWWYYY```aaafffhhhiiikkktttuuuvvv}}}繻ڧתޫٽؾݿְնӼٿڽն޻ظڵ!,P$< 9qĜAC̘1s"I$JɣGP 24HK,SP¥/:剓L.YR B-bhRNѪ5֭\4P!C3#Nx1F=A$iʕ.aʤiNV~ZhҥMFX`… @H"F=Ydʕ-_ƜYfNK*QJ:ͥKjߪZ+bC2.䵕,s]xe߫ s=5lULSfWh୆&=Y*~t%휹 )q~Yy1Ǒs&]dVNg-`jɡW=^m 4_}I8v.My-{7[tQ'li <4o^2Fr齖bнE?VF$زN8$U>v@f۱ScXjYS oMCS_2K^y6yhR4ɥ9JWra`b\xz9)s#rh<*sgj.BIwH頶d2zb2yڪU$R)XzӐWdٮ-*)xe%jlWvbazPQ~5V[_]-/k[*:v!’2L :1ʫ"HݒŴ0,4l8>>AAABBBCCCEEEJJJNNNPPPQQQSSSTTTVVVWWWYYY```fffhhhiiitttuuuvvvzzz|||}}}ٿ׼չέͬϻͱζԶѴбȶ!,P$ ,_Ѳ.="T*TVj+XbѢUҥJLʤ(PBy7mƈS 4gtӤI"A Ϟ=x4P!C%R4d1ƎC"iJ.aYez iI1m Uj 6|qbEUQm 2ؒ'Sl2̶8u;]LH%-wߪz+Gڙpd)7虺EA'iTT_%bU8l䳔ծQN>r"Ix@L ଆ-b.=cf'&N޽6^pq졶|+'uvn|]CR=iʽsJGXіeSaR葶_ɹZsJt"dզp׆w$`x c{1_WDw!~21$>fQaz$V I$&bMfMɍJɩ%r\.x|CgءBo" ɕsc J*JHiKonRס:玌*h"ѤfVj!vZ+O`?ڐE;X)PF T~hY*WZmO9&(+p9@橮*jXhD%^IyR;&׺ (xo ʰ{RA<`Q c"Xյ+$s!Ke̡:cH'L7PG-TWmu5DLM2K㱁Tpp \X .F c€jGp$`B@8 3Ԁ3x; F/0[,CuBp0850@ )p0;3~32xnAvITNLEUG#B F@_wD }T\Җuȝ-HgGxP@=@  \ !`,La;0<[/w<#Z  8P@8`Q wہֶ z` H2hZ@;mayavi-4.5.0/mayavi/core/lut/pink.gif0000644000076500000240000000312112747716313020074 0ustar prabhustaff00000000000000GIF89aP$ )6 &&&'''+++...///222333888999:::;;;>>>???@%%I,,Q11X77`;;f??FFFJJJOOOTTTWWW]]]^^^kDDqHHvKK|NN```dddrrrvvvxxxQQUUXX[[^^aaccffiikknnpprruuwwyy{{~}ÃĈŌǑȕə˝̠ͥϩЭұӴԷջ׾ĠǢʣΥѦԨש٫ܭ߮!,P$0 PPB 5lC=|D'OD2J+WdѲK/_3L3gФQM7xç? BhG4P!C%RQ#G E4R%K0̬y3Ξ?-z4!NMZ`… FXbƍ?Ydʕ-_~֦4:y*QJ>:oUXo55qXdLo}r9ҦO`"xcaS&lv w^SZ 0_m\2ɕo}纡K||jzAt6q}w'jǙr{g|j'}݉pWjʥsL"n[~0ˆpᝦjɡZsLŠ}f"xGbbvX#N7`YhƸ$6b RGeX¨M9'~9bhnf\B*[`N:e抦Y6꩛*~gmX2iz bcp+k,pPpo#  3,1Hp1IaA ($IбoLrH` /DuPD"/X@4@ˋ̓8r1#@pBT#$4?. @ulo^0 ,rG]1 2@rO%PAxƐA#Q+y{yw;mayavi-4.5.0/mayavi/core/lut/piyg.gif0000644000076500000240000000314212747716313020106 0ustar prabhustaff00000000000000GIF89aP$ $$$***...///333444555777)g-l2q7x;}JJJNNNOOOPPPVVVXXX[[[\\\```gggkkkuuu{{{UZ ` ejpuz@EJ O"V&\*b.h2n6t:{>DMU^fow"-9DO[gr{ჶ㋼݀ሿ!,P$YpF 3AD&M1N9s!T!D$])&O8U4i@if4h!2DH ?|CG7lԠ 4P!C%RQ#G E4R%K0eҴS'O@5T)SPN+m巘nh*kᯈ..m䵔^ngyOݴp揄wܼl&{|jārzAnu]o\w^kɕ[s]{ui}q㽶y=mpË"v4'9w"> "R.j(hGb7W<AX$}Ƞh!yev.Xc~#B(V〹y y&8g="v(3޷hndcYʈ\駓:WDRih %}6hr:e0rXkɤ`)yd_sD0[t+k覫춫n+aA)*T - kd@ˆ l@V4a0Lnyx[vR@bߎ@8Kr)!)w  T[J Poҥ,xt+O,t^&ݭ xE݂bv +ߪ]JBvˈY{AvzGA·P8{ |xTXXZxAy夗n騧ꬷ.v@;mayavi-4.5.0/mayavi/core/lut/plasma.gif0000644000076500000240000000324212747716313020414 0ustar prabhustaff00000000000000GIF89aP$  """###'''+++...///222333444555666777888:::;;;>>>CCCEEEJJJNNNOOOPPPTTTWWW]]]```dddfffggghhhooossstttvvvwwwxxx{{{}}}=}Of_nYj\qWuTyQ[g_dPoTmWjLrIuA{Dxbb>9<.,*631'%($$%$%&#&FDILA#)/5:@EJOTY^chmrv{/+26 $( :!,P$˘9&5lڸy'9tعPCѳO A($J!RĈ!KxHcĀ C&RPy%ʕ*Vd٢K/^4P!C%RQ#G E4R%K0eҴS'O@5T)SPN+m巘no|*kᯈ..m䵔^n绠nZwŻVn^sInɗ]iuZqᵖ\y5^mѵ[uv pܡFx!Gl̡GtF|aG jǍrzMn׍v1`6;h@"-bAXVj8e} ~H~#8$Θ#߄(8 - I_uנ7'< x!A·`2djɨ_0Vi杈*%} Ŋ\)y%y*dn sZXMz&nHevkIa.fv+k.+R .x@.B 2,'$ 0R"#p"&.P'" Ap+"K/@J,2-4- >>HO U$ \'c+i/o2v5 |:BNITP [Vb]idpk!wq&~BBBJJJPPPRRRVVVXXX```kkkooouuuvvvwww{{{(?0E7J?OGTOYW_`eimsu|}w-{6>GPXajqxDž͍Ӕ؜ܣߪ᰼潳¹ǽ¦ǫ˱зս!,P$OHb. Id &N@%QI$J,]I&N<}J(RLBZ`… FXbƍ`?Y$*-#YfΝ=ZhҥMFط*`磤eCv m巘no轤*XkᮈnLȓZy.g+j଄$YӾI帚v Z~6.ufYmM[|VvwZqᭆG(sj'nY}iāry$ t^u͗o6w7^b+2"uɇoq`=767[$x$#_(vD%$YFaK.(AxaU)ZI cwg fdl $(NdlVH"M6Xw")zW6IFJ*t):z%Njvfh~9'Pkb)*rdgo*}+k@2p]X@5,.F'h!!+[>1>@+W'_R NyߦzR[ `F>z7G/W?}@;mayavi-4.5.0/mayavi/core/lut/prism.gif0000644000076500000240000000325412747716313020274 0ustar prabhustaff00000000000000GIF89aP$ """###'''---...///222333444555666888:::;;;???JJJOOOPPPTTTWWW]]]dddggghhhooosssvvvwwwxxx{{{   &(;=44SfhRPi49+-= NNbctWopWUm ()/JKqr`ω߈!,P$g@rϙ=:n`BL;0xx ;/I5l)bFM;(YQsFX )ӦN^'c$MaC "T!D-b#H$MT%Lmg/Bp 6K>X`… FXbƍ?Ydʕ-_Fb$,:;4uu TVg55Wb"c`4q`ssE˔4_ Zx+b:&lev˙Q$M-jૄl㱐Ƽ; ö ^7Qe^j̩tFYPBwIG-kϵtI`n9Eo _qy5kѽ'[u9Vo@xiʡs&| >~ gq&:i"^GngY8HX M֨`֥c8lq!4&lMv}^9dxy䋆.9#B#Z;XBRXdezQfYvV9驄byg@~"‰6( fz*ߔVPCgRJ-{逻~jffY2 t&)/[iv&[~r*P6h_iqG,Wlgw KH!l2Ǟr!Bh@)t#2 $)hB(R'4!I М0)D`#XB xA(&JLH:'@#r#$g)I ;0s& H|J ,Їތ)XBxl@$7~5%kA!T C0 @ usXRA ~y氷h ͕ $@wLwއo1o;mayavi-4.5.0/mayavi/core/lut/pubu.gif0000644000076500000240000000320512747716313020111 0ustar prabhustaff00000000000000GIF89aP$ ---...///333777===???9Z<_@dCjFoItMzQAAAmmmsssuuuTWZ\_acegilnp svy}#(-27=CIPV\bhnu{шӉԎՔ֘ם٢ڧ۫ܯݴ޸߼!,P$)RT@ѓN:sĉM6]lђ+TL!B:ra2bx*R8a:pؠ! 2X! FXb.;~"I*Y)M:y*QJ:(TB^eD1j ّ%O\e̙5ogСE&]@0W_kiج䴕b~Y纡{jօ"*vh)VstAt߿WcM.MWaC>;Y嶙rٮ輥lue=nu~}Z=$ X&{Y7o7SH8HUUrz[u}#w2 -ynކv]~DdMbb5iۓE;Z~~"rFL]{e*(U>x"_LUpqޘx&bT:hbw|I%*ay7J <^aVUH2'w""S6XpF%薅j vH Ehw֢]ic!9謢XJAvܴdɧvjB-헯V(fV*9[^bIi#G,Wlgw w܀$?ņL2b @I`F)ч!<70F,!t}@܇ @W-?@JOM#rDt]6V@ g'Fx]ueN!rwDjm@c-q@MCAK6?;6QkGx}|90=1 @*7`Ĵ:/o'o|@;mayavi-4.5.0/mayavi/core/lut/pubugn.gif0000644000076500000240000000343112747716313020437 0ustar prabhustaff00000000000000GIF89aP$  $$$&&&'''***---...///333444555777999;;;===???H8L;P?TCXF[J_McPfTjWm\oaqesjuowtzy|~AAAPPPVVVXXX```kkkmmmsssuuuvvv{{{~ #).38=AFLPUZ_dlrx~ӃԋՑח؝٣ڨܱ۬޵߹!,P$czJUT@)ISL,Q4IR$H}ѓ;ȗ+UL'M,Q#E 2bx*R0a 8+F=I$J,]”I&N<}J(RxBȗ_ZjWbvZn3LyG\B%Rl5qXdr[p7loS᫈?U.l䴔^~Yn纠%}髃)gXs{U'_n[w7qk{Mmѷv-,(b*rP&vkέ'tf|iwg&@+&07`zAmŇvo藋( sLnx#QcVp\_JB VI"ieF:$favh #hW^Z%_!:a N)^EbK޹ JbrHE)0Dj3$8ƪf>ep{W)rR%P"I 1}-d=[&%W*)JU4lo6[)кX%.ɇ騨 hQ 0Þik'ß~g ,$l(,$;Q2+3ϼ 'A D@x"F#,C&q]<| ؂3)@+e6) 2,L+;,o$Gܶڶ-ol@" tf 4>؂f@+n 6|ky׈TlfCnHuM }CCCDDDGGGJJJLLL]]]aaajjjmmmuuu{{{}}}<@CGJNRUZ_d i o ty~!+5>IR\fp{R%W,\5b?gHmRr[we}nv}ȅ͏љפܮปŨʮϴҹֽ¿!,P$Wh2fШa:v B)"f 2fΜP#G,UQB d獛6l֤I& ,O4aDI$Ga 4P!C%RQ#G !iJ.aʤi5<}B :Ѥ:* >8Ō;~ 9I+[9͜p{b+QJ>:oX o=Uqe)r[q7|wh:Xᮉ2&{Rv䴔^~sI6WUY sEuX掜ֲrww;6>7tFfFowqᭆ\ymѹʇ]h5hpvy- %<ǞmiޡVx%gl͵^mҽW ]~:Fx?Z8Eag_۔Djx`|X~h#w1 Xdfh f \.yiVmv(#ոe~)s:mhf$vdad$x镪fiyb"%h$ j$ ^HVl$J*ekɹ覫+k* L k0 "TpG),q%g<t qTp"q@J D0q'|q$r'V| ܑ rl IΝB ~dr xG-<!\w.E<R;FϜncG!K{ 鞐s  H';砇.褗n;mayavi-4.5.0/mayavi/core/lut/purd.gif0000644000076500000240000000317512747716314020117 0ustar prabhustaff00000000000000GIF89aP$ ###---...333777;;;>>>???i n$s'x+}/BBBDDDJJJPPPRRRWWW```mmmoooqqquuuwwwxxx269=ACEGIK M O PSTW]bglq v"{$'*06zء#6jИ!#.ZXс 4P!Æ%RQ#G E4R%K0eҴS'O@5T)SPZБDFXbƍ?Ydʕ-_ƜYfΝ=ZhҥMFX`_zbBF;yerh{E-Xkᮈ.l䴔^~Yn纠&* {M1g%3s= w^S*>kͦ^tWne}-j!ZyɖtGna[}~Ʊ6rmI{6vHǵFr\mM|FvU5"x"b) &yڃx"Q-̸T6rYb򨢀Dɐme~Lz=8`BˆG g7virx!.aj%ПK8i)Z*%)}Xjc"zW)'^Wq ک{6`$†ihVy&4.[$:G;-TYCiɺ+k:d!&"j ,D$ /~;~Tn:Z`.iʄ钥J&I=yܱS9rqӦ/]Ȝ剓&L(Irg"CG;tQ zC)ZĨG"IL%1eBy3ΞF~ZhҥL,85BTW#Nx1ƎC,9l]FNGJ(RLB勰jÇ3i-ܕWbQq|L6-yng՗+밌elVM,sxE%^83m5ybi\ 7|7^|P`ʭו{`-ft-jէfyhMGTUj˱ l%&LTeup5 iv`qш4 ~Rep<7&PA x(8ڎ)RJo FD-$Pw 9tc5ץX>E]/6fzbP:' x؝%JǒK(Y[gwMI@oJy2bW`ldMG}iirdzq}{`cӍi&h*hj`%$"0:fʴ:fZd".lTSQP*$[rġg^ķCQ{*BtZK"\,zNH wKeiR j7| )/BL\)Ѻ챶!wGYB/TWmXg\w`-dk-AhOEو\P`CF)h1"d|s- Ug P=HኌPEb!0K!n I/U=6~N0B a(6h0ۣ0`F+2Kl20`@5r#2-7 0By/a@5,NPo $@"P-F UwU A(]絿]Mu۴@@j J1Rm B)l7DM@C)j^Xj>3P@PCET. (hB]/ 0   20_׽-zql]6hL;mayavi-4.5.0/mayavi/core/lut/pylab_luts.pkl0000644000076500000240000136606612747716314021360 0ustar prabhustaff00000000000000(dp1 S'data' p2 (dp3 VSpectral p4 (dp5 g2 S'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\n' p6 sS'type' p7 S'numeric' p8 sS'id' p9 I1 ssVsummer p10 (dp11 g2 S'H4sIABfKe1cC/3XXd5RdVRUG8JkUkKEIgoqCCogailGwAIJ+qBRhICoQmggkk0SIyWRmMgMMNSCE\n0ENRiqghhBBiDOm9957pvb3e3wu9t/2de1wL9uzfH3lr1vdu3nv3nrPP3pMGlJXXjK+oHVo2oWr0\n0PE146pvHFFVNaK25Lqq0WUTyidWV9WUVZdUFrt3lZSPcmnlgNKi+4YXj7z/ksqBQ0qLLy4qLh00\nOXjPqOraitEllYOGDxhzemlRafFn7xk8pHTg8OKzhg0bduEnn+E/pUXVIx+4rOiYoi/ow3PPina4\nv/fhUKoIXq18Eo4hnR9JU/Bjsq6firNJ50fQU/gDWf//M7iedH40PY8Ksj5/GiaRzr9C0/H4VGF9\nvxl4YZrQ+ddoJubPE9b3n4X164TOv0mzUV8nrN83B6E+Uvm3aS5e2yes3z8PxRRS+WE0P3gNGfdn\nAY4lnR9OC3EKhYz7twi/Jp1/lRbjjxQy7u8SjCCdf52WopJCxv1fhnvuFjr/Bi3HE4+LkPF8VmD6\nC0LnR9FKLJgvQsbzW4UN64XOv0Wr0VAvQsbzXYNwiFT+HVqL118TIeP5r8MACqucy37quuA5h431\nsR7Hkc7dfVuPUylsrJ8N+A31cz1twCUUNtbXRowknT/1pNiIKgob628T7qF+rqdNwfcIG+tzM16c\nLnT+j7+LzVi4QISN9bsFGzeIfq6nLWhsEGFjfW9FJEwqf+ZpsRVvvC7CxvrfhoEU0dfTtuA+R4z9\nsR3fJZ27v7fjJxQx9s8O/Jb6uZ524FKKGPtrJ8pI58//U+xE9UQRMfbfLtz7N9HP9bQrWEcRY3/u\nxowXhc7//S+xG4sWioixf/dg00bRz/W0B02NImLs772IRkjl0/4j9uLNN0TE2P91GERRlbtzty7Y\nJ1GjPtTheNK5O7fq8FOKGvWjHueQzl3dr8dlFDXqSz1Gkc5d3axHNUWN+tOAe0nnru40BHUgatSn\nBswgnbt924DFi0TUqF+N2LxJ6Nyt+0Y0N4moUd8aEYuSyt26acRbb4qoUf+aMJhiKnf3vSmoczGj\nPjbhe6Rz972b8DOKGfWzGeeSzodTc/AaM+prM8aMFjpvaSbcVCNiRv1tweT7hM4vp5bgc2JGfW7B\nzJeEzltbCEsWi5hRv1uxZbPQ+RXUGvyOmFHfWxGPkcrbWglvvyViRv1vw34UV/mV1Bbcp7hxPrTh\n+6Tz9jbCzylunB/tOI90fhW1B88hbpwv7RhDOu9oJ9xEceP86cBk0vnV1BE857hxPnVgJum8s4Ow\ndImIG+dXJ7ZuETr/E3UG6yhunG+dSMRJ5V2dhHfeFnHj/OvC/pRQ+TXUFazThHE+duEHpPPuLsJp\nlDDOz26cTzr/M3UH+yBhnK/duOEvQuc93YRbbhYJ4/ztwZT7hc6vpZ5gnyWM87kHs14WOu/tISxb\nKhLG+d2LbVuFzq+j3mAfJ4zzvRfJBKm8r5fw7jsiYZz/ffgSJVXu53ZXJ5JGf9CHIaRzP3efTkmj\nf+jD70jnfm52dShp9Bd9uIF07ufeWyhp9B8hTCGd+7nV1bmk0Z+EMIt07ufOZZQ0+pcQtm8TOvdz\no6ujSaO/CSGVJJX7ue+9d0XS6H/COIBSKvdzm6vTKaM/CuME0rmfu86glNE/hXEB6dzPTVfzHEgZ\n/VUYY28UOvdzz621ImX0XxE8+IDQ+efnlpTRn0Uw+xWh84nB3LFiuUgZ/VsEO7YLnfu5wZ1jKaO/\niyCdIpX7vv/990TK6P+iKKG0yn3f7s7JtNEfRnEi6dz33b+gtNE/RnEh6dz3ze4cThv9ZRRjSee+\n772V0kb/GcODpPP/962UNvrTGGaTzmuCvnMFpY3+NYadO4TOfd/o+oi00d/GkEmTyn3f98H7Im30\nv3EcSBmV+77N9SkZoz+O4yTSue+7zqSM0T/HUUo6933TNeyDMkZ/Hce4vwqd+77n9ttExui/E3j4\nIaFz37e4Pitj9OcJzPmv0PnNQd+xaqXIGP17Art2Cp37vsH1cRmjv08gmyGV+3P/ww9Exuj/kziI\nsir357brE7PGfJDEyaRzf+6eRVljfkjiItL58uDcdH1o1pgvkhhHOvfn3u2UNeaPFB4mnftzy/W5\nWWM+SWEO6bw2OHdWUdaYX1LYvUvo3J8bro/OGvNNCrksqdzX/Y8+FFlj/knjYMqp3Ndt16fnjPko\njR+Szn3d/SXljPkpjYtJ5yuDunkt54CcMV+lUT5e6NzXvTvvEDlj/srg0UeEzn3dcnNGzpjPMpj7\nP6Hz24K6s2a1yBnzWwZ7dgud+7rh5picMd9lkM+Ryv2+//gjkTPmvywOobzK/b51c1LemA+zGEo6\n9/vuV5Q35scshpHOVwf7xs1heWO+zKKcdO7X/Z2UN+bPHB4lnft16+a8vDGf5jCXdH5HsO7WUN6Y\nX3PYu0fo3K8bN0fmjfk2h0KeVO6f+ycfi7wx/+bxZSqo3D83N6cWjPk4jx+Rzv19dwrG/JzH70nn\na4P7dj3n4IIxX+dRMUHo3P/uSXeJgjF/FzD1MaFz/73dnF0w5vMC5r0qdH5X8Lnr1oqCMb8XULdX\n6Nxf5+b4gjHfF7CvQCr/4qvqz0cO/RQPr6n6hyAAAA==\n' p12 sg7 g8 sg9 I2 ssVRdYlGn p13 (dp14 g2 S'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\nEvBAz7c8bRX/A/7Slg6HIAAA\n' p15 sg7 g8 sg9 I4 ssVPuBu p16 (dp17 g2 S'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\n' p18 sg7 g8 sg9 I5 ssVcopper p19 (dp20 g2 S'H4sIABfKe1cC/4WXeUBNeRvHS9ZQQ/ZddkOWSBRPGKHImlL23SDaS2MoEUOjJko1yJKlIkpaaN/3\n7lL33tZ7u2vdFiQtttfMfV7nvL/zx3v+4I9PT53zW57n8z3XY7+d84lT7nr7Tzoc1DvhfNzp6F4H\nh73umrsdDu4/aefo5OC830nTXl31U5p2B1TUvoe52gVL9X0+m+01ppurr1dTN+95EX/mgJP7qYOa\n9j0texwyNFczV//+M72mm2tYqhtbWFiYffv+/PuPuZrTvstb1Sao/Z/nLXSmlvwUynOEn/9ew40e\ncRRmbolept6xG/6Xn0fujvzkD/5hvEHwkUxfmOBsUHee7QV7ftdoNelyJeoDsP4y1p/9wT+e7FHu\nWXwTDDJt8qt2XYPugNm5e7rPE7//Fv7+v/D3+/zgXfKXzx7tuAsPL6UKgttvQPYRwbCJnVeIv38f\n/34w/v1rP3hHkMLhz80P4Xk0qyTb6G/Iu70i9m23P/F+j/H97uD7Bfzg7avHLHJeEwm7lO9EnSZ3\nYfblEVVlXTeI93+K738P3z+Iev9Pj77MHv8cxF9PV2sdeAB/Obb0eNEZTHzfC/y+cPy+UOr7OOm7\nJ4bEwJHBPXmTfR5Bx86smf4dt4jvj8Xvf4Lff4f6/siq9CFD46Blii9rSUQE6E1e/8TwUxixPq9w\nfaJwfe5S63O+fVJfv3hwXDysaGPxU9g70jD5cfc9Yv0ScP2icf3uU+tnq33xk2YS/PZww359t+dw\nXWsSa0T3A2J9X+P6vsD1DafWV3+GouXCG4C51/ek9IuBHA0t6aWuh8T6J+P6x+D6P/rB2/qvNKtX\nS4UeSfyda0Njoavzn+cxsT9puD8vcX+eUNxer6IxOQ2yVo615c6Kg59bxAOOdkYQ+5eO+xeH+xdJ\n8Z1GPgc+pYNP8V7r3SmvYJe4ZIKgI4rY3wzc33jc36cUX7vGsNYwE8ysHlo2bkgAf37igrUdz4j9\nz8T9T8T9j6b2Z6Flg5VLFgwQNW52FiWC6NDmBzs8nhPnIxvPRxKeDxqfuC+EFZsNZb/O2ajm+Bo8\nRKufDfF4QZyfHDw/b/D8ULx94Elz83c54P/Bcf2VnskwZMfShKLTMcT5ysXzlYzni8a7PD5n6eWB\n5e8JZsMCU+BZxfwM79OxxPnLw/OXiueP4h+kl54uO54P/b2/3i/TSQPTTdOLjE+/JM5nAZ7PNDyf\nNM66sSvhSQE054XpBlangahwbMUH9zji/Bbi+U3H80vxtuR72vPlhVAycOVd2/B0cDfVEUa5vyLO\ndxGe7ww83zT+JDotcnIxPN8sHT/RLgN00vs2HnCPJ85/MZ7/DDz/FH9/4439lH0l4B/kc1tmkAlR\nRl/bxrgnEPejFO9HJt4PGvfM171zpxQcq2eMjfqWCaav2r5w3RKJ+1OG9ycL7w+NGyiPXrUrgy0T\ni0Lt87Kgdm5DH1+3JOJ+leH9ysb7ReNR9ivWDmTBwkN2oxb5Z4N7ZO2gVW6vifvHwvuXjfeP4p26\nnaN6R7FgWORPwZ+358CgqdzRX1zfEPeThfczB+8njd/8vS3DjA2drTHDM3RzITIsf0qcazJxf9l4\nf3Px/tK4Vq+isw1sECywDPRR5sIvo1PnnHBNIe43B+93Ht5vGve+8sD4Egdeu3cMWf8yD2pvvFw8\nxTWVuP8cvP/5eP9pvHvQma6pXAhNCQ4YfCYfjPqW37UzSiP6Axf7Qz72B4p3nrpp+SqbC2c0jAfz\nVxXApezSh2av04j+UY79owD7B43Lxuk5HiiHXWtq/W5pFQLXqyByqlE60V/Ksb8UYn+h8R3hvedq\nVICJ7znt/bxC0DXJft7jdTrRfyqw/xRh/6Fx9s91TXcrYCJb98/pYUVg9yU1rnZJBtGfKrA/FWN/\novjHNTHxT0x4oDE8e0DLkWJ4nfTPk0H0Lx72r2LsXzSeYuh3qI4HYtvDV2LnlUAft7jUwCWZRH/j\nY38rwf5G4wtSj0z6nQ85Yf003btLYOvC51kOSZlE/+Nj/yvF/kfjEauWC8cI4KE08tKyzFIIex+R\nb7Eki+iPAuyPZdgfKd4+oWjkrdcC+GXoI40epmXQEh1eMjMpi+ifldg/y7B/0njg5vfbbSrh5aLO\njAMRZbDkRBin95Jsor9WYn8tw/5K4wMEBcO6KmGKzVqvXK3v93RmKL8+MZvov1XYf1nYf2nca/d9\nTlAVBP4WsnymIws48hs1KYtziP5chf2Zhf2Z4h86pR5+BtXQ545SzZfHggnhfvUhiTlE/67G/s3G\n/k3jdse3ri+vBtd047RWIzYc33dF7rI4l+jvNdjf2djfaVzyfpamUw0oxL5nN4exIXH8xabNiblE\n/6/B/s/G/k/jNu69cgfXgnXvumVxPTnQu+bcO73FecR8qMX5wMH5QPG2sm8151/UQsH0uV+HH+XA\nlhCPj5qJecT8qMP5wcH5QeOmF1+ZbKyDJeaeyaeLOXDHyuWTzDCfmC91OF84OF9o/M2Aa19a6iDy\nBPu3mnlcaBpir5aZkE/MHyHOHy7OH4q7B+fr15gKYbTfJGOTQC4Yso/1umNYQMwnIc4nLs4nirtz\nB4QZBQrhaozTp3vdXLhw7ZCmR0IBMb+EOL/KcX7R6rU3DgiRCuEzNzup1+5yYK/bq21lWEjMNxHO\nt3KcbxR3Nwtw61wgAruOYaePZJbDeM0dQ/QTCon5J8L5V47zj1Z/oUKyzVsEtSOPLC6cVgHHcreN\n1DYsIuajCOdjBc5HirunjdwUxxHBBuPEztlXKyDBe9M4ZXwRMT9FOD8rcH7S6j/tSNaZVA+puzQT\n/N5WQM8V6yblLiom5ms9zlcezleKuxmEzXBwqIe5nraubVt5sOmb6fT78cXE/K3H+cvD+Uurtxff\nKEuvh7v3owy2JfLg1pvls88uKiHmcz3OZx7OZ4q7RU3tMWeQGAbnfGlPGMsHpbvxfNv4EmJ+i3F+\n83F+0+rlR+1894jBS2ERN9qLD4v+fUqJ+S7G+c7H+U5xN92nlcpoMbRphjn9LuOD94d5xjrxpcT8\nF+P8F+D8p9XvfGtq9k0M+2e/0xeZCUBhHRjmOrqM8AMJ+oEA/YDibjf1Yx9bSICzYUXbymgB/Bmv\nc/+gbRnhDxL0BwH6A62e4zK+z20JrHIIiHmoUwkLh/mHbwktI/xCgn5RiX5BcVetpCsHmyXw6rrE\nvp9bJVQ5aT1eXlVG+IcU/aMS/YNWv/ZLR6axFKbGL5x3vLoSPDlXIuaMZhF+IkU/qUI/obirt8kB\n3atSCBRcfFtiUgXT5vd7OtaWRfiLFP2lCv2FVp96vuxclRT6fuZFzwuvglK/i9H9Q1mE38jQb6rQ\nb2j13TnGdTNl4DZuxsnr/arBuVUjpquSRfiPDP2nGv2HVr9Q88nS0zJoMDmt13GiGkZbeL6Uj2IT\nfiRDP6pGP6K466n1Q//Ol8H2/YXN29nVkB719VW5DZvwJxn6Uw36E60+0s+ze4QcCi+MefrGoAaO\n9P8tMTOETfiVHP2qBv2K4i4yTrP1ETkYPT5xfHxoDWj92vX6RSWb8C85+lcN+hetfuJwm/h4OUQW\npPzs9a0GXua5pNwZxSH8TI5+Vot+RnGXHTY5Q/soYEyztlKyvxZspn1I87XhEP6mQH+rRX+j1Qfd\nmu+0TQG+2nsjVufVgvpF+0yPEA7hdwr0u1r0O1o9W3ibHa6Ar/NijkbMqoNHkpbso5Ucwv8U6H91\n6H+0+oGT+89rV4DdVo0ZA/3rYP3K43lWo7iEHzagH9ahH1LcZc1h12u/NECty1bFyfY6aLvbULDK\nhkv4YwP6oxD9kVZ/PkLcHNAAj4vYWxpmCSFE7XCxfgiX8MsG9Esh+iXFnVOaN6wTN4Bwp0fsqN1C\nWL5bUjqxkkv4ZyP6pxD9k1bfNfdNxPxGGNE6SWedvxDkyXvZ2qPKCT9tRD8Vop9S3HmB0/R+Xo2w\n8VyRw5lMIfiOqeN+2V5O+Gsj+qsQ/ZVWfzL++mFWI1we5Mx+1i6EBR47eMrgcsJvG9FvRei3tPqI\nbrWcCUrIuDd2vnCaCCoF/zzlhP8q0X9F6L+0eunSE5NPKaFbP8d/kI0IzhlaVeeOrCD8WIl+LEI/\nprjzBE+BV6oS5mfbvVtxVQRTg7i1cdsrCH9Woj+L0J9p9bZZq0RaTXBs2/BNTikiKG7fJLofXEH4\ndRP6tQj9muJOgX1iYFcT3JenPg9/KwLHraVif0EF4d9N6N/16N+0epbZuNtPm6DK7chPPN16GBm7\nTnZ2JI/w8yb083r0c4o7Dfjzj8+fm0BHc9CpvpbfPWZQgeLEdh7h783o7/Xo77T61ayPNuuaYV1o\nYulin3o4dGq10jaYR/h9M/p9Pfo9rd5ryP7E0GbwnrVvzrHEehhQmtW8VsAj/L8Z/b8e/Z9Wn2xV\nOlzZDG+SNa/9rayH2Nkr3i4aySfyQQvmAzHmA4o7dYYYuSxpgXaL2JbisWLYfjX1/ZTtfCI/tGB+\nEGN+oNXr1z7iXm6B2UJbi28bxKCmNG7XCeYT+aIF84UY8wXFHe0mDtEXtMAh+57P5nqJ4eHapA51\nAZ/IH62YP8SYP2j1Tw6c85/eCrd7PB2476UY1j1e1N363ZP+N5+0Yj4RYz6huKPkUVOraytUBFie\nCJCJ4X3vuM811gIiv7RifhFjfqHVj1daW+S2gvaUr0VZIyQQfHD+t8KbAiLftGK+kWC+ofh//1/9\n6uGsj2YSgKxo9SQ+k6vyjwTzD5OfXb3h6rQzEpDqzu75eEQlg6vykQTzEZPH8zuU1tESuOIZ0TvQ\nmslV+UmC+YnJ3x4NM/9DJIHvTayf900mV+UrCeYrJp/+aU3kax0p8JeF93fgM7kqf0kxfzH5nqvv\nNJtXSeHsLV2tPSOqGFyVz6SYz5g8eGzIr+PcpDDl852fLKyZXJXfpJjfmJz1bEXBhggpFNmM1TG+\nyeSqfCfFfMfkmibKGZ7VUnBIDBk6k8/kqvwnxfzH5CtYAZdjtGQw4t+nmsFV+VCG+ZDJT+8zbhCb\nyCDF5cao3tZMrsqPMsyPTB7bJlkz1FEGB8sHj/0QxOSqfCnDfMnkSm/fx6bhMui/wG98PY/JVflT\nhvmTyScNM+jrxpPBi78G6pYNr2FwVT6VYT5lcttHtYef9JOD1bs/JqdYMbkqv8oxvzL5dUOf3Eoj\nOXzd0HdaVBCTq/KtHPMtkxflz5k2wE4OD55dmBHCY3JV/pVj/mXynrb8i0vD5GA2UGPWpeG1DK7K\nx3LMx0y+tOmczI4th3fHzum5WDG5Kj/LMT8zucuZGaZhPRVws+DL3ANBTK7K1wrM10z+TIsdzjJQ\nwLIZHvqbeUyuyt8KzN9MLrtzupfGUQVIfDoXmgyvY3BVPldgPmfycfMmHVwQqoA/ZM6GelZMrsrv\nCszvTG6VUZh18Lunz1vVtmRMEJOr8r0C8z2TX9viNDnomwJ4908t1eRR3Gmf3n8AjGsVI4cgAAA=\n' p21 sg7 g8 sg9 I6 ssVspring p22 (dp23 g2 S'H4sIABfKe1cC/3WZV3BVZRDHE8AXniJGjBjxPvLE2EVF992MjCIdRGnOOCOQhAQI/cX2hoqKSBvG\ncRzHYei99056L/fm5uam03vzfHt2j+O3u78H7jD/++Wce8737f53d0W/GXOKZ+eXDJ8xt3DW8NnF\nXxV9Oa2wcFrJwM8KZ82YO2deUWHxjKKBBZnhtwbOmRmqBf3yMr4emzn929EF/YflZX6YkZk34Bv6\nzsyikvxZAwsGjO33xYi8jLzM4DtPDcvrPzZz5KhRoz54EoD/5GUUTf9+TEYsg7gKGf+D///fZxaS\nD/EWxxVDXwFHDjuknoN8Bxs3OKz1K2HFcofUs5FV8Bli/f3VECL1XGQtvIRY198ITx47+oQ+CNkE\nLc2OPuP+/oDDhxxSH4z8CRvWO/qM+/8LliFSH4L8DVORPuP3/QPvI1Ifimymzz7j92+Bx48cvUJ/\nGtkKzU2OXuP5bINDBx1SfwbZDuvXOXqN57cDli11SP1ZZCd8ivQaz3cXvIdI/TlkN7yI9BrPfw88\neujoEfrzyF5oanT0GO9nHxw84JD6C8h+WLfW0WO8vwOwBJF6eN8HYQrSY7zfQzASkXq47w/TdXqM\n938EHj5wdAt9JXIEGhsc3cb+OAoH9juk/uMPjqOw9ndHt7F/jsGSxQ5lPXIMpkx2dBv76zi8i0h9\n1U+O4/Qeuo39dwIe3Hd0yfXICWiod3QZ+/Mk7N/nkPovPztOwhqky9i/p2ARoqxHTsEkpMvY36fh\nHUTqq391nKZ92mXs/zNw/56jU65HzkB9naPTOB9nYd9eh9TX/OY4S5+dxvk5B4tKHMp65BxMmujo\nNM7XeXgbkXq4787TfXYa5+8C3Lvr6JDrkQtQV+voMM7nRdi7xyH1MO5dpOfYYZzfS7AQUdYjl2AC\n0mGc78swApF6mHcv03vuMM5/Kdy940gL/SOkFGprHGkjPpTCnt0OqZeVIrQP00b8KIOFCxxS/xgp\ngwnjHWkjvpTBW4jUy8sQOidpI/6Uw53bjnahj0bKoaba0W7Ep3LYvcsh9YpyhM5xuxG/KmA+IvVP\nkAoYh7Qb8a0C3kSkXlmBUJxpN+JfJdy+5UgJfQxSCdVVjpQRHyth106H1KsqEYqDKSN+VsH8YofU\nxyJVMA4/U0Z8rYI3EKmH911F10kZ8bcabt10tAk9fO7V9DvajPhcDTt3OKQe7ptqek5tRvyugSJE\n6rjtx9fQe2gz4nsNvI5IPTy3NfSe24z4Xws3bziSQg/jTi3to6SRH2phx3aH1MO4WUv7NGnkjzoo\nmueQOob9iXUwBs9B0sgvdfAaIvUwb9XROUsa+aceblx3tAo9zLv1dI5bjfxUD9u3OaQe+oZ6ihOt\nRv5qgEJE6mh7JjdQHGo18lsDvIpIPfRtDRTnWo381wjXrzkSQg99ZyPF0YSRHxth21aH1EPf3Ehx\nOmHkzyYoLHBIPfT9TTAa80DCyK9N8Aoi9bBuaaI8kzDybzNcu+qICz2su5opj8WN/NwMW7c4pB7W\njc2UJ+NG/m6BfETqYd3bQnk4buT3FngZkXpYt7dQno8b+T8efc/X+e/ydXR/EIfP6T59nX9XjH6n\n7h+C69Nz8nV+rvycdX8Rj96Tr/N75fes+49EtE98nfcV7zPdnyRgKu1TXy+gfT2U9rnuXxLQSOfE\n1/lc8TnT/U0iOqe+zueaz7nuf1qjOOHrHFc4zuj+qJXqM6lzXMulOKf7p+D6FCd9neMqx1ndX7VG\ncdrXOa5znNf9VzLKE77OeYXzjO7PklSfSH0e5bUhlOd0/5aEWsqTvs55lfOs7u+SUZ72dc7rnOd1\n/9cW+QRfZ1/BPkP3h23kz6XOviaHfI7uH4Prk0/ydfZV7LN0f9kW+TRfZ1/HPk/3n6nIJ/o6+0r2\nmbo/TZE/lXox+drB5HN1/5qCSvLJvs6+mn227m9TkU/3dfb17PN1/9se1Qm+znUF1xm6P24nfyZ1\nrmuyqc7R/XNwfaqTfJ3rKq6zdH/dHtVpvs51Hdd5uv9OR3Wir3NdyXWm7s/T5E+kvoDq2kFU5+r+\nPQ2lVCf7OtfVXGfr/j4d1em+znU91/m6/++I+gS+zn2FGPUZ9PogWE99Cl/nvkaM+hx6/RCspz6J\nr3NfJZf6LHp90RH1aXyd+zrc59Hrj86oT+Tr3FfKpT6TXp8E66lP5esl1NfKpT6XXr90wmrqk/k6\n99VyqM+m1zedUZ/O17mvx30+vf7pivqEvs59xRzqM+r1UbCe+pS+zn3NHOpz6vVTsJ76pL7OfdVs\n6rPq9VVX1Kf1de7rcp9Xr7+6oz6xr3NfOZv6zHp9FqynPrWvL6a+djb1ufX6rRtWUp/c17mvnkV9\ndr2+64769L7OfX3u8+v1Xw+d78NC57lCjOYMen0Y6DSn8HWea8RozqHXj4FOcxJf57lKDs1Z9Pqy\nh87HXqHzXIfnPHr92Uv7e7fQea6UQ3MmvT4NdJpT+fpSmmvl0JxLr197IYvmZL7Oc7UsmrPp9W0v\n7Y+tQue5Hs/59Pq3j97vZqHzXDFGc0a9Pg50mlP6Os81YzTn1OvnQKc5qa/zXDWL5qx6fd1Hz2eT\n0Hmuy3Nevf6+Qr9vrdB5rhyjObNenwc6zal9fTnNtWM059br9yuQQXNyX4/m6jRn1+t71vPBmuP7\nc/6i6cP/Bcg1gCqHIAAA\n' p24 sg7 g8 sg9 I7 ssS'viridis' p25 (dp26 g2 S'H4sIABfKe1cC/2XZeTTU7/cAcEt8spUSKSWlrFlTEXVLlqxZi1ZCsi8RERUllF1FEZFkX7MvM9ax\nz9jX7NvMyIcilHxHn47H7/z84RznNXO8z/O+z33uvc8jGhNbZxv7+6Imdo5mojbO1k4Wxo6OxvcZ\nbzqamdjZ3nVydDZxYnSg/u9TjLam/6kDjRrVU33qW890HGgF1Kg1qKjVtvj8/Yyp0317M0aHLfo0\nt6XVqNSoKZ+hE1Cj1aeW09TUVF2j/Pz5pUbldMtPj4qHiooqbXnuNQcBGt2jLCoW74L4wrePh9g7\ngOrPz78Q7CsYoiBGgBZNeuW6FG/QeNzYHOeCXH/3v5KVSgTA1r9XzPsWABVxhzT5e5AfcghK2H6d\nAFF2Cj9SrcLhmJ8bNlGmc8MPe1bvFXUkwJrht1ExkTdADOs3ZotETm3LIcbhQwDWA91zN3liQT6s\nKtTxB/KdO34r4iMIcDMyn3hKLx6EOcoFU/W6NvzowzIRg2QCcPw4ELkt+iMQtvgbVGUi58FH5iYV\nEcDXa49uZk0SbHUxn8lj6t7wfWQN5ro6Aqx8Xmh72JkKpNH3s7ZmyHnaeqXyughgpywt4krIAHc1\nmZvkUuT43Kr6O2ME2I73kMm5ngXPq+0Yhdl7Nvzq/bq1sVkCyNouDTg1ZENIJNM1bivkGJ7pNqEV\nApSQrHFwLBeMBzUPVZQjb60wYz9B2wpPdt7u/f3yMzSluwvvZOvd8HLl1QVGplZIFwzuMfyeB+oX\nDUaozZAb1M6dT9jRCpddXz9f0iyA7G4+9oDPyBsFqSUYdrfC6AfxWYePhRDnZmWUsqVvw8k+Ns8l\nuVpBWPIUD8PPIuA+zld1TQf5rozsPEHuVuB/ej/omEYJRF3cnxL+Dvk0Qe/ixIFWyORpMpCKLoXZ\n4dBRzWnkkV07nlnztMLEBBfhNKkMiLR1ss8k+zecFzN9vYTyfW2RQ/51XBgwaqL2knFDnnv3DV3v\n/lZI+rK3WwiLge82WJ3rGOSa87yUCGwFsU92kW1mWPg0/k/6/JaBDZ+V9an15GiF7ythS/0MFaCh\nvvvWgjLyaumHbIyU9XtHzxx6Jq0C8golThv7IT9a6E95461wRk4teIdWJeQrRrJI1iHHkY+6JdJQ\n/r9106Ub85XAszX4vck/X9D+eRFTU7pMAPtXoeOHw6vg4Ho4nEcu83okOZsSP9efc8TaHK8Gf6pE\nlzlP5HKLOQb+lPh74zZwSLyzGsRvq11SLEBuEEKgVukmgLeUCcHpXg0AzcOl5VnkhVrLXfP1BHD0\n492uwFELfmTvo0x8gxtesiXxTHAJ4W/c1MJpFs7DHleQF3tcihRMI0D0/JSSgR4OfNWXWfUCkPu1\nqeQVRRFAqsviQ8I8DmQrLLDPy5CnlRUJaT0ngItPkohzcB34XOI3F/iK/PL6n64EyLiZyZUnUg/D\n5E7JPduGNpylxlfhvRkBTh5bIdjX18NIVky1zmHkq14DmTbaBMgTZ5qJut0ADiMp+6tlkF9S4o25\nLEcAIYNR61M0jVB2u9DaSRO5wtLucyZ8BJDuof96NroRslWnI2/cQp5ycD0BEmA4x9k+82QTfLyR\nv/WFM/LCZHLxoSU81O/ODX5EaAKfdIXYlWfIrcP8a3oH8fBtS4VmlmUzJDOyVGVHIn/wQP7elxo8\nUKXwKp+ibYHfnhJXs5ORc2i2/pJIw4NGr94A79sW6OsTqaMuRl6BuUvZcnjYuSyaILoHD4bsw3zx\n9cj7PsRlLbrggT3EmN3OFA8JbAwf3/QgJ2ZHdD+4hgd/urK4qxl4oM2RD/k6iXxfG9sr17N44PDB\nTZOW8XD3W8DUuwXkDR1BGvO8eCja+Zh4QIEAp7KeLWbRDG+4112l8EV6PDinTH74EUCAt7hGOtHt\nyLsFSCfZ2lrggtYvzruUPJwuIifGzoW83yuh6NHrFqDbQ80eSMkjeSWOpTZ8yC2qT+46c7UFPPdL\nmytYtMLwddERWQnkfZj9n3S5W0COY30lWsFphmnqqSzy8xP1sb1DzZCnmikdtdwKtlZMLWqKyC91\nnqgejWuGvfHOesfPtcG5qGdsEZrI7Y0HXF1Mm+HOAeElG982mHn46LPlZeS/cGkq+UeaoTkxUF+1\npQ2aJhw4G28iz0yL+Z0z0QT/Wh1mqGBvh6WqU/pl5sjlM5NveCY2wS/dZIWeq+2QveiSp2yHPAff\nbMFxpwnmb65nnnYQMJ20sb6H3FbrZ1q0QBOsuSg8JU60g++CUpq4B/K7YuLCu6Yb4XAUR8mUcAes\nhep9jPBG3vZliCksqRGMGl+l+tt3QML6MeKHfErUL+eQZSPkbK2+hM/tgNLknCtGQcgt/xyAjfDn\nWF3qAOfpm6H14cizTXhZM0gNIHjDzEZXrhNW2rMoOxC5a6HvbFVqA+wP2vPpxcNOULdJ8i55h3xX\naCNxv20DZD/5LHGvohNqvSpi1eORj5VamlWINUDBJfduJroueMzQX/Q2EXnUwBW+yrl6kKSzitJQ\n7oLghXZiSgryCCxniEBuPai5ymeAXxec4lV1985A/ufYvFcPtJnUO0bqu8AjVNb6UA7ymt0zc/Kn\n6sE//PY3aeZucDzp2+mfh3zJj3bqx2odDBxxuKSg0Q0KKzMkTCHyXuou9mMVdWAoFR3NHNgNlOis\nrilBTlm83WSfOmjpOvo6oLkbFqJvhseWI38bcu7rIfU6+FOebOsBGnNBQ80K5M/3qlf+u6MOjr/K\nPFGj2QPK3L5HW6uQCyWx4RW6caATeWubV2APfEuROStei7ydZZcrfwwO5qezRGibe4Ce9Uz4nTrk\nvhc0iiNu44DD9124CksvPFJ9KeDegDxOUHY1VhQHxKsTTobqvRBwflXUugm5FevEPbEftWBn5tcs\n+bwXxH46J8q2ID/TVPdcHVMLrS8U23rqeuGB2ZdkEh75PqMJ2SW/WjhX1J2rs7UP7nqdkHnQijxp\nqZxXSK8WAumenotU6gN2HU+dmbZN60PJ3j3ctbALavo/P+kDN1z49nMdyF0sRU9yEmug7XaUz6eK\nPogZv2/v0on82l3ltYbPNdD44B9woOqH9bcY2oVcdviI9MLjGjDU9rbgPNMPSluDTgR2I7d7oqgY\npVkD6r+02yPd+6GWpfytbQ/yCZLkr0SuGqDWnB1ZLegHxqLSDxK9yGN3f73GOV0NqjeiTc4u9gMf\ntaVlzyZfrw4W8qpBn32vr9mxASCv0BUb9yEfKm7i4n9aDRev8no52A+Af9BFXPMmzwhbyc7VrQZp\n8UJt07QBaO/0NdrXv2l/lz2uCzhUDacfRArIEwcAh8/yVt3kz60nfybNVYERVNEz8X8Bc496CcNN\nHmGTmLYDWwXv7suQy0y+QFZ/q+WFTV6jpZmbElwF+j+d5G7HfoH79CyrbJucg6N/u6tRFQj8KQC/\nQNmK61Txpuf3LdXC3BOvgph9dJQWYvC/82STcymnVidSVUHQi46JNf1BCL0iEBm1af24dv4wWMFX\nwuJ560z70EFg+hOIyH24Jdxs31cCjfAzjp7mQSg96UM1tOn9Fsh1vmB2rIRenrAXUXRDEPr6eBZm\nU3xcirIUaZSvBK4CWud63qH/F1/FLJbln9kqQdw8T/j7uSGIo3Rxq+2b4iO4Xb5urAIUOCxG9hsN\nQW3MJ2uDTfHdcyQ5nz6vAoQHrpuf9xyCHN4OF08CckpR9fjeswrY+UGHfCdqCMwJsuz2m/Yf7kig\nHKthBSxbKjsEFg1BY+6qsPCm/esuEc42I1QBgxKUSrZ7CBp6ZOPT6pEbBX+3YF/FQuYWnVtdi0P/\n1eeb8kvbTuH4kBYsvGpQmvy1axhkObMuUlUj9zcU83GMw/6Xd48Ng4W+2ql6LPKXHU6nCc5YcNfY\nzqiqPQwdtBMHdcs2rV/E7aIuFSzc2rUlyI5yrj7mfUz/tmhTfmr1jfTgxsK9yjzFyIBh4O9+GP12\nU/5mfanUSP6GASdP/1EM5dzIpmRBnexN8afN5nGmHgMxB/flkCl5kVGc0tGmIe+Y6qBKeI+B+qo0\nL86pYRAbXMn88gk53epTSgRhYMEcdBToR6DG8tta8qbzzZ2VZv6IHgZOrmWccjw8Ar+L2qL5N52P\nauGlCVFiGHB9xcMbKz8CbmsH+NUjkFOlBu6bZsYA4aD9YbzRCNzhedW0LxT5Nsk6nGF3ObAVDjH/\n9hwBW40ikZDnyAu5FKwU35aDlYL4NtHokf/6yyfIs/aqGXCZlENaX+zi1eIRwDQwc5ltqj++hsVT\naYuXw6zjjkG/nhHAnX13vcwZeWDzsmAgbTlIMHrV5v8YgYA548Vsm035H8/IbDhQBtfS2F6Pso8C\ny5fL4/JmyPcOeVkblpWB/bUaDRapUaAXGh00v4b82QcOVb7EMrDd/YYkpTMKCaXY3Xy6yEmVbvGX\nIsrgDDHjsoE9xUsuybuoIE8dM3F5HFoGw+3/hLoEjkLPmTGRy4BcK8hmj/2rMrBueJQTnjoK5xQs\ne6ulkOMFrq+8/lAGuePX/FPqR6G2m0EMK4j8wtKXwdjSMmje7S5WNjUKulvHdipzI+f+kIg7OFIG\ngff3O+Dox6D5yx4b/Z3Ibe6auFXsLAeGtUN3Gg+PwalrKafJdMgr/Ka6Oi+WA3x6vqtefgy0P/yU\noVtG9b206OhH+jflsCUgUqHUaAzY8hlvxZKQfxqVoH05Vw6274V3fPIcg8fh3Z9LB5ALndRWuyuM\nAa1V7ws+UWNgo5dIa9iCfMKVLo7fDANdlGPjWtEYYGkiJO0xyB2XPlA6FgyUmR+W5+0eA/eYZHna\nLOT/9ZMYkPIKIA0ujMGzE1RcrO+Rdx17YvLqNBa+//zd9JxtHBrbCuPCg5GbBhdv1Q3HgnDpCS5h\niXGQ8l7CBD5E7i+nUnR7npJ/pl/75muOQ7lCifNvG+R/8vXlCrhlMaR83HoczoorBw1eRV5N5cen\nVVUBxno6/LF+49As48onpYK8PrE2j1m6Eh7kbdu2+HEctGzsD60cR97j5mPfmF0JDd7fd8lUjcPb\nEQdtkUPIh7fqCN6TqoITuMO85sPjUB1wtbGFBXnrUF7evyVV8CkIc8Dz9zicYxmsKJpD/bc/T3Ml\ng3o1HOitZfTkmvg7R0O+XtXEDFfD05yrDabSE7AlhTju8gb5O8KlIyEeNdDL9cBYUn8CRm1Z09ht\nkO+8eO9Y/IFamBOyojz6BESxrydE5JMBYRUltbV/988EPLcToCwF8vd9apTWCwehR+4enU2e+Btf\naL4hWivMelqwDrbsT7NUqZ0Anaj4wMAU5Gzv8KSLI3XA1PZjr9foBKz6+NELuiIf4VY7UBRbDx+V\ndU9Hrk2Al57//oBN8xmJran7rpg2QIdbOSGQaxJGtnxsK2JBLn3Bd55OpBEsn3h+vHFyEsIG48IS\nOtF8SKLJiVIiNUK4uuYMs+4kzOf+wui/Q56p71U93NgEP2gojbftJKw+WV9o5Cqx2I/N8c2ADbLs\nnvWbhCsP1ah+CyIPtjpfLf2wBXp/v3zJlzAJpk5ndy7OoPkYs+wLlYdilP79jssFCcwkfHVvv5mR\niVyuXODcw/d4eFE+w7CzbxLq1ttVR+TNfqdzg9gJwLJf9lPVwiQsMsRyGm6a392p16SkDgJEPrrJ\nq8I6BRc+7dFRnEPzP70hU0rp0goSxCvuMUJTQLJ3evk1HXm/kO/jdI9W+ORg51mpMAVDJpkjelbI\nE3rktnlT+vJVjuijn29MgcDjJsoOQk7ZTEcFXdpAvHf0qZPrFGBxDW8MhtD8s/vx+gCiDYRqTR3W\nQqYg9VQK3WIE8he9q0IYl3bomD7bqZsyBdOdVm5aWps8+t+dUSvtICHvmutQNQWqny/WmtAjTx0J\naOR92AGsU+q9egNTEDcTUSRcjOa761NbTbpO8GuJNlpbmAJ1rcr8TFvkmXV7F1gDOsFufdtsm4YL\nA81l8zybnLIaxhxdgE12W47mm4ZX4cUtcwQ0n2awbsYee98Fj/4MMKdha2BDQdJj5EVmz5aeiXSD\nB20Yl+KlaRDwkt7OL45cbreSm3ZxNxCafp8ttJkGqwLc6esDaL4umRk4+ky1BzTYX6gSn0yDKPVS\nop4fcrsL8TT8fT3wT/Me7d6303/PWeQ1P6oThGx6oZSLidE7exq6lvMbPAfQ/H9gxs3Cn6oPnsyf\nCZzATUNp0oWnWU+RCzn6Fsi87AOlG51VNIPToKV3IjXpKPJHUeLGUsL9QHuTkNb1fRqClx+dNW9F\n9xdPon6sOVT0wwdKlWHCSITkxxN3v95D3v/emBKaAyBwXl894QAR3pFvK8Fe5ML98yHh3wfA9AwP\nPlKKCDhKlrxV0r7hiiYzs9ZBX8C7125GQYUIjUyZQZrXka9qhu2xEx6E87KJhrHXiXDs0wnpHatt\nqD//TVb2xw1CnFHNrlQHIgjhWpTS3yLfIeNx+uaxISg4k3rS8ikRnniX+h2UQf6GHJNI7T0ENsP3\nk7ojiFAXKvPKpaMVzXezYsUF2oYgVU9LeyGF8nwsPqdS7Vv/b37hHQanCDExTBkRJqu4KScB8tU+\ns/KvTsOQXiAtdJJABILBT9m+eMKGY+3TjX1qhsEhSfXqtVEi+NdxUTpu5Npev+WDOEegbH0Ms0BZ\nv3wXlpVWPJoPSRVy0lqNgMfWZKUMehLkMzU577VA/i10rW6wdAReB8q0dO8mgbmw2HLMrxZ0/jbp\nf9u3YxRkxwkBmQIkeBvwMsL8CHLxf/vdC0xHQYsz3EJKhvL9bSoi4erN6PzjXuJMLaDUbfyPbpmq\nkIAUJM5s4NiE5sO+wuazzGPwZwxqSIIwXdnK9leNG64sE6HxyHgMLv+5KCIBv1X7eamiBjT/txm9\nqJc3BqbX+5VoXUngYdibVNhfv+GJshflzJnGYbmIeW3ahwSFVFKqr3/XbXgY7gwu22gcOKcVZzxf\nkuD2k/x/DvIg9zt/Ilg0bxy+tiier4mnfP9kuXHcOdyGK+EjVNqZJsDNjpkak0WCixnhZr4mtWj/\nviMGvzWegNLaSD7rchJYZ9BRWtQaNB8ZyKB5kD8BY5iU8eZGEmBOt8ScSK5G+5uyux1YKOfKFfkz\nUz2U53sf3XYUX4XuFyWp9BxMJoFpfdtMkOD+wf3cFUuVG/4zO1f3buEkyKwXit9IcGJyKBJ/GPm1\ny41b7bZP/T2fKe/nxexzNf0KVP9ebNh+zWwK/lwTMpH/3jdgUfyW7uKWKp6C6sCa9567yZDD+JZa\nFIdB81uS7Tsi6zQkxFIKDV4yTMUM3VJkQa46y3XT/fY0mOAZ3nuLkkFJ/mpzQkHZhnPSYUf7iqdh\nWnA9UZEhREEs3sC2FMX3nfXJIBFCPILNsApkqJA84ZQDJag+kjgSOmVGBMfy89qxF8mAcVcOYJAo\nRvdfgcl8vkVEoDSpHoZXyLCWxbqfRrkIzWdKpOc6tpHgdboR15wpGdqeGqzu8ClE/cegZGLDLRJI\nHVW6bmVHhj/XHPMF6H7jyP5xozwSYKULnBrvkyFs9ZuUUTBybKLM/RAGMliWOIVxPiHDr6S5Vo1b\nyE+9ZKbSv0aGGzEyJN1AMnB5jUraWiKfoOtWTkwnQ3bHePijCDIwr2/vJORWgjwzD6lmgJIcvn2M\nI8OBpyTtAm70/FG7+ct6tWcgMM18a20qGQ7n8w28wiHv4W1nToqbgXf/rF/8kiFd6V6C2Qe0PjLy\n9PPk+Rmo1jcbZMeSYZ4p4/D9dLS+pY6lNh/lv8KNO+ltFxrIQLVa9vDbCHo/J5pkNQkhX+EOpf32\n6SDD+hQ77jR6/y4WlcYWQ19BIH/GvX2Qsk5i6xVAObqf0HUOshadhc+VN8OOE8nAYLN+44fia/GV\nY1m3+ywcMXwWn/KdDJfaFhS6nqL4PS7w5p9M3CyU6lL/kFsjgyfuarqnNYp/p1ui/wMurruAhyAA\nAA==\n' p27 sg7 g8 sg9 I3 ssVterrain p28 (dp29 g2 S'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\n' p30 sg7 g8 sg9 I9 ssVOrRd p31 (dp32 g2 S'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\n' p33 sg7 g8 sg9 I10 ssVautumn p34 (dp35 g2 S'H4sIABfKe1cC/4WZR3DUZRjGdwNeclLsBfTIKaNiQUVyZ4eMlFhQYUiIM85IyC4bJSrlQvEGCoiK\nyjgO4ziOQ3ov9A7pvWzvuwm9g3mfwI3H53fIIb/9ks1/v+97n2eyKauwuHR1SVlO4RpPUc7q0i+8\nn6/0eFaWZa/wFBWuKV7r9ZQWerPdzqlXZRevmrLuLJdjc76zYOti97TZLudCh9M1fcv916zylpUU\nZbun52d9NtflcDknX/PIbNe0fOe8vLy8BfcmwReXw1vw3VLHS477TOQ6HsqD70/kPgpKcv/fb6L+\nGbBNrN9O/RNgp/j5e6h/AewVv38f9TPAH+L9/Un9U2C/eP9/Uf8c+Fv8ff9QPwv8K/7+A9Q/BsrF\n86mg/nFQKZ5fFfVPgmrxfGuofxrUiudfR/2zoF58Pg3UPw8axefXRP1M0Cw+3xbqXwSt4vNvo347\naBP74yD13+8wDor9c4ivB4fE/jpM/c4fjMNi/x3h68ERsT+PUr97l3FU7N9jfD04Jvb3cer3/Ggc\nF/v/BF8PTojzcZL6n38yTorzc4qvB6fE+TpN/d5fjNPi/J3h68EZcT7PUv/br8ZZcX7P8fXgnDjf\n56nf97txXpz/durfA+3ifuC+ox2I+6OD+kWgQ9wv3Hd2AHH/dFK/GHSK+4n7rk4g7q8u6peALnG/\ncd/dBcT91039UtAt7kfue7qBuD97qM8HPeJ+5b63B4j7t5f690GvuJ+57+sF4v7uo/4D0Cfud+77\n+4C4//up/xD0i/nA/UA/EPNjgPqPwICYL9wPDgAxfwapXwYGxXzifmgQiPk1RP3HYEjMN+6Hh4CY\nf8PUfwKGxXzkfmQYiPk5Qv2nYETMV+5HR4CYv6PULwejYj5zPzYKxPweo34FGBPznXvfGBDz30f9\ny8An8gH3JcAn8gP35QcMn8gX3F+YMHwif/ipfwX4RT7h3g38Ir9wX1Fu+EW+4f7iBcMv8k+A+ldB\nQOQj7j0gIPIT95UVRkDkK+4vXTQCIn8FqZ8DgiKfcb8WBEV+476q0giKfMf95UtGUOS/EPWvgZDI\nh9x7QUjkR+6rq4yQyJfcX7lshET+DFP/OgiLfMp9KQiL/Mp9TbURFvmW+6tXjLDIvxHq3wARkY+5\n/xJERH7mvrbGiIh8zf21q0ZE5O8o9W+CqMjn3H8FoiK/c19Xa0RFvuf++jUjKvJ/jPq5ICb6Affr\nQEz0B+7r64yY6Bfc37huxET/iFP/FoiLfsJ9GYiL/sJ9Q70RF/2G+5s3jLjoPwnq3wYJ0Y+4/xok\nRH/ivrHBSIh+xf2tm0ZC9K8k9e+ApOhn3H8DkqK/cd/UaCRFv+P+9i0jKfpfivp5ICX6IfffgpTo\nj9w3Nxkp0S+5v3PbSIn+mab+XZAW/ZT79SAt+iv3Lc1GWvRb7u/eMdKi/2aonw8yoh9zvwFkRH/m\nvrXFyIh+zf29u0ZG9O9x6qcYF/2c+41gXPR37ttajXHR77l/+P/5J3N5Qc5/ZLM5lYcgAAA=\n' p36 sg7 g8 sg9 I12 ssVgist_ncar p37 (dp38 g2 S'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\nIjOZ/wLXrmqghyAAAA==\n' p39 sg7 g8 sg9 I74 ssS'magma' p40 (dp41 g2 S'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\nq47Ev4cgAAA=\n' p42 sg7 g8 sg9 I39 ssVVega20 p43 (dp44 g2 S'H4sIABfKe1cC/+3YS0sCURTA8RmzjbsoatNr6cp1i+DsGxKKhKhFpBkEZTmNhNSiTUXLXmrfoU1t\nshcRRR9AS8voYZaaVrTsReY5jbPwA9hdnN9iDsP/7obLHe6syeXxjU34ba5x1W0b841qI4OqOui3\nDKhu17hnUlN9Ls3ilf9WWTxDf9VrUqQ5h+xc6PZWWRW5U5IV87y+ZkjzT7gtXrPDNNymSIpcXFNt\nVaoccrvdbu8oFNFDkTTnYo/UKkkt5BBurgkEAygNEnkD7v/bY+foET7eURaayAt3QXpp3t0SaCQb\n3AXrUyQDzeSGe4V6PTmFOvJgvHMXo9eSFHx/oTx0kSR3QfpVAuVgdQUd69/xhLsgvfw7RiPonnuF\n+soyuofEJYHwNspwF6TvhFFWP3fSsLeLctwF6ctLKAmBNXSu768Id0H6eghl9fMnZew37pXpM+TZ\nuJ/pJVnugvTCD3qFeAyloY/kuAvSS/cy5ZO7GL10r1k+uVemh4IoY/w315Aj7oL0aZI35tYmSnIX\npDeQbbiIowx8fqAn7oL0syhKQT/Jw8E+euYuSNectl8KwVo5hyAAAA==\n' p45 sg7 g8 sg9 I14 ssVgnuplot2 p46 (dp47 g2 S'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\n' p48 sg7 g8 sg9 I78 ssVSet1 p49 (dp50 g2 S'H4sIABfKe1cC/+3Kv0vDQBjG8bu0LlkVBHFw7BQEFwfh3T3MoGaWNo0g2LSJlyGbi4qrVUGt2L9D\nHF3Ezdq5hVa6iLj4Y7L2rs3kbNrh+Q73cnyefcP1o1Ilttxy6FmlaFfu5MMwH5tboeeW/T0ZRq40\nAz5cmX5xqIEh2IHDC0frQSYn+BrjIns42hRlXPHMIOsY28uCCT7YTOVExuErtm2v9gfpRzBZON5k\nC4xd11SvNKe7pXndHTHdO8Hh8PF57Ur1SPUbVYtmdT04HJ6Cb+ga9PmheqHqieoJDoen4NO6Dp1W\nVQ2Sui4cDp8AT267pRv9k+BweBqe3MsL1QPB4fD/9+azqkvnZ6omzeju4XD4BHj/R/VGi7o2fX+p\nenA4PAVf0nX+XDgcPn6XBesX1fQBs4cgAAA=\n' p51 sg7 g8 sg9 I15 ssVSet2 p52 (dp53 g2 S'H4sIABfKe1cC/+3YsUrDQBzH8bu0Lpl1cnHslFmw8N89DCgG3KRJUxBs2sSLmM1FxVUHWxd9BUU3\nnX0BCzpWgkRa0AdQtHdtJ9+g9/sO94f/5/8Ed2gFUdpsZ07QSkKnme7KnVqS1DJ7OwmDVrQnkzSQ\ndszHV3ZUH2tsCXbkcf9kIy5VBF9jXJSPJzd1mbVDOy57VmNZMMFHN3MVUfJ41XXd1d9R+hFM+qeb\nbImxy67qlbZ0Bd3fqXJiui+Cw+Gz69dXqk+6vVH1qdtRvcDhcAN8up/X5ZTpPuBwuAH+860a0rqu\nTwe6Ag6HG+C9Z1VOi7oBLeh6cDjcAJ/OFd2AOheqJzgcboA/PqiGk3+Bgs7PVG9wONwA39e9/5tw\nOHz2XfrOH8W0bt6HIAAA\n' p54 sg7 g8 sg9 I16 ssVSet3 p55 (dp56 g2 S'H4sIABfKe1cC/+3WsU7CUBSA4duCSycfwZGpozHR5Oze2MFITHQwUDAxkUJrMcHE6KLGFxAwGn0F\nXAQj6ltIhEGXFqykjjop50IZ9AUuyfmHe5L7nQc4h6ppFXOFkm7mnayeK267WynHSZW0DSdr5q0d\n1ymarmYrwy3NygzVVjk7Sirpk2U7luDKElN4/Hi0k3FLhaxmx5Pq5hxnXBnsTCV4LKksGIax+DNI\nPJy56dMVNsPYTQ17gz3RO3x/YV1gok8gJ5fZ/85dkUdOLoW3njEfVkU+rIsCcnIp/EAUwrToFS4v\nsA45uRQe/c+KvPEdQE4+Cf70iIVQPsM8qFawFjm5FB7dq502FsCa6IWcXAq/vsJCuGtgPWjeYx/k\n5FL4vCj4N8nJJ8ErZcwf37H1W8wnJ5fCz6tYD/ZFfWjUsS45uRQezYcm1h/dsW1y8olwN63/AtNz\n6JmHIAAA\n' p57 sg7 g8 sg9 I17 ssVbrg p58 (dp59 g2 S'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\n' p60 sg7 g8 sg9 I18 ssVcoolwarm p61 (dp62 g2 S'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\n' p63 sg7 g8 sg9 I19 ssVVega20b p64 (dp65 g2 S'H4sIABfKe1cC/+3Zvy8DYRjA8btiud0qRlNng+TZXTTSaEgkRK+VSPTXuQ6NxYLY0EqIH38F6k8w\nINJWoj/Ur9JUDVZC8Dzte4Ob9d7h+Q5dPu92ued93+uSx4gmI/GU14iZYW8kOW/NzZjmTEqbNsNG\nLLpgmUnD0hJqa5UWDbU04dGV5YAaXPUnugZ0dURR9e6V9pqQlYqHtUR3wDM7qCu6+rumZ0DvCqhD\nPp9v+Ps3+tEVK7g2pvQryv4edgYH+9g5TFFVUKg3YHfXtzJYAXqpK7CoGrskXi5RsLeLleHjHWuw\nS+KZNPYIhTz2CJUy1mTvkBevKXuuiXnHLodvbmD3MEbV7HnHLodnj7Fne66Jeccuh5eKWAMWqaY9\nD9k74+L9maTKsLONnbJL4idZrG6fD/7uP+zu+tcn9grjVN2x/7DL4SmqAelN7IG9Q76xjt1BH3Xh\neH/Y3fXjI+wJ/FSu/fxy7JJ467z8AhPUteP8zO6ui/mXz2EPjvM1+//6bZWCUeoSbioUuyR+dIjV\n2t9nCo7zAbu7Lr4PiPunuO+wy+Hi/wBx/xT7EbscbgW9P9RSvVyHIAAA\n' p66 sg7 g8 sg9 I20 ssVVega20c p67 (dp68 g2 S'H4sIABfKe1cC/+3YO0vDUBTA8aStS3ZBBcWxUycRwcrZDRbRdhAR6UsQ7CtNhyKCi4qfwIqPD+Cm\ni246OjlYK7UaUFvtIy066uCj96Qp2O7xDuc/5BB+d01ubtZtwWgqEk+7gjEl7IqkVtRlv6L409Ki\nEg7GoklVSQVVKSEaq6RoyNCETRY2fGJgayZhd8rilCDKjs3WmpCajoelhMNnWxqTBVlsrulxynaf\n6PZ4PJM/zfAiC2pg2ysMC8JuhnUJ09gjnJ2yyiBg70D+v35fwOA2x3pp3dfIOfGbLKsIc1gV3Fid\nnBO/y7MqsIrp8P3FapBb5NoDqw4+LAcD2BE5J35xznqDk2PWEwxhV+Sc+d/9p0DOmRvPVQ28WInc\nIje/n1WsBL1YjpwTH8S01roKHB6wNHJOfAQrwTimQxIrknPinx+sCkxgDejDKuQW+QKmtff9UeyV\nnBM3z/+zWBH6sSo5J57ZYZXb/zX391g6OSc+j+ntuYY1yC1y4/9ZvmuS8+HZa9Zz1yTnw833Wuck\n58PNc03nJOfD1YDrFy0evPmHIAAA\n' p69 sg7 g8 sg9 I21 ssVPastel2 p70 (dp71 g2 S'H4sIABfKe1cC/+3YT0rDQBTH8Zm0bnIHwWVXWSuIb+9gFmIWgihNGkGwaRMnQnZuVDyAguKfc1jB\negldtcsKIzF6A+1MbRceofP7LuYx83knmBMnSvJ2t/CiThZ77fxQHjSzrFm4e1kcdZIjmeWRdFM+\n2XKT1kRTR7DTgIfnm2mtIfgG46J+9rfTkkU3dtN64OwvCyb4eGehIWoBX/V9f/1nnDkEk+HFFlti\n7Nj0TjumknqPOkXM9E1wOHx+/aWv+5q9X13qRnA43AIvTIqeeroPWjR9wuFwC/zhXlfRtknR3a2u\nhMPhFvhwoCup/6yraMWk4HC4BT6du6aK3l51IzgcboGvmarZ/+DNtU7B4XALfHr/P+Fw+Py7DL1f\ngmhHIocgAAA=\n' p72 sg7 g8 sg9 I60 ssVgist_rainbow p73 (dp74 g2 S'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\n/OEuJjK/Akf5eVqHIAAA\n' p75 sg7 g8 sg9 I69 ssVspectral p76 (dp77 g2 S'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\n' p78 sg7 g8 sg9 I22 ssVbinary p79 (dp80 g2 S'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\n' p81 sg7 g8 sg9 I23 ssVwinter p82 (dp83 g2 S'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\n' p84 sg7 g8 sg9 I24 ssVjet p85 (dp86 g2 S'H4sIABfKe1cC/63ZezxV6RoHcLcUMUMzok6xSYrKLeSSVoOJKMmlUUkukSP3qMyn2hlSRxeX+rhM\nISm5cwySSy5JQqh22tFlk2tu5TNnpow4rdXmPetd8/x3fn/UZ/Xdu/Ze632f581zSsjdL8Q3IFTd\n3T/IQ903xCf4n65BQa6h4vuDPNz9/Q4HB4W4B4sHCn59lbjfga8aKGQlcNpB0O2MbaDwaivB7QKC\nViKR/NccCA4N8BAPFHEQ8tS3ErAS/PKaeauthB0EN1pbW1vOfAn1i5VAsNu/7AVYAkB4xNff3xO4\nxNX87C4aB7ty2H8aJJS7QS/9IUDtu1LYLYSGLyyx6AG9s87jg0In7D7hPHsVn7egT5vuLVs7DXuM\nSMc/1sf0gq5034ZtoNQHevHp5h6iGPYtVPpB54rWZm3jwu79wEjSznsA9KkzpQG7p2C/aKHF2X9x\nEHSWWO4GT9YQ6EUPVa74FMFuFpU2HWT2DvQOy2VuoR2wey1MuM/2GgZ9sllaNXIS9vNURkCX3z7/\nfZz8KOiFkr/YJRXCbtI6VZpqMgY65+LRpRkc2D13TJzI9RwH/eO3vt1FH2Gn//n/z6WouBCQT0gv\n+pI40KWppIG+hEoW6LExZApBv3CZTDHoSYlkykBPvkqmEnQbKjWgW9uSqQPdnko96LuoNIDuSKUR\nfv8eMk2gO1FpAd2ZSivomlTaQdfQIvMYdG0qT0BfT+Up6DpUOPD7dck8A12PSgfoG6g8B12fChd+\nvwGZF6AbUukE3YhKF+gbqbyE329M5hXom6i8Bp2g8gZ0FhUe6GnXyMCuoEimG/TraWRgV6LSA3r6\ndTKwr6DyFvQb6WRgV6bSC/rNG2RgX7GSTB/oGTfJwK5CpR/0WxlkYF9FZQD0zFtkYF9NZRD0rEwy\nsK9SJTMEenYWGdjVqLwDPSebDOxrqAyDnptDZpjorjZaM8Rj9te1VEaInwnHCvNQpuflkhkhFlUH\nW2VIIxf9LnPSzC+cWLOOzCiRuym2SyQb9f/sxfWhNjnxRH4emVHC9G7eIff/OT+0SS81qm5LI9Sp\njBFdxk1/1Xai88dWOVuDjq2ZREE+mTHicFX/OdZh5PfkozaM3ssnNKiMExLGwsvYC5GnLOpeKpRa\nRBQWkBknblQq5L5KR+ejLpnPSZIvS+auv9Yh5HJU374zd/2swrHlVw66zxbLdBOVd6G+6m8U4vTJ\nB3mcwk5ZzUvV6H5VxI78NA/5wVi95uVetejzGuYfL01Gz1n0Un1Uuui9uWu98iYJGT3kNy7bWqre\nRH23zWDg6uFWtM5M43liBaao7x68I7zuiSfy7gS/hzo9D9DzNmBVac6gdX4qaeps+amHc9eJZRu3\nRycgl7sSZbFZoXnuWlt/96tRDeRVV+UWNFShvtx4O8R3WyPah3tTMh5YOaG+7Loh7nO2C/LJVJ0z\njyfb0HVp/gWxT6gOtNi4pue0oL4dR97OWORXdq4OH7uC+rZa6UBegypyb9txN61DqG/X6YpsWlmH\n6pShXalJsCHq23tKWK3he5CL2p9Qui2G+vbvOsbOPROoTnLtzYQmucjPF+8e23wO+S2HhT0bM1Ff\nV9Y5cjJ1BfKju57Uso+ivl75W9w30xWojm/5KSmtbgvq6/brC1Kc7JHLOLqEzVuM+vpoUbN6xQjq\nI72Oq1wt+pBHag/eXXIaOfVxi1Hfly8S2XFsOXI2dUNQ3y/TUnzTUYL6nO3e4wLSdqjvW//b2F/X\nGrmikynPTgn1/X7NPTOX+lGffe8kXhP/ATm78Ej0xEnkNfsep76oQecCOc1LX3Yc8mjnRPayGHQu\ncNlPBp0DnLHrGOz1stjfV4f9eyexzzOBfV78+yhh39cSux97sPtVgt3PCOx+L8eeB/68IrDn2Y89\n7xFsPSzG1gu+nvD1VoGtx2PYel2BredMbL1HYfuhE9svE9h+Esf2G74f8f1ai+1nH2y/q2L14CpW\nL2KweoLXm49YPZrC6pULVs+csHpXj9XDFqxeamD1lIXV2wSsHuP1elqfXs97sXrvifUDM6xfPML6\nCd5vdLF+tADrV8lYP/PC+p0I1g9jsH7pg/VTR6zfPsX6Md6vjbB+zsP6fTp2HrjGPy/MrTfsPFHD\nP2/MXgdh5xEb/nllbj1j55l2/nln9noT/zx01DlCv/3aOMGS/XpemvUs/nkqjKPK5qiOE6f4561Z\nl+Kfx6It2+5zi8YI/Occx/jnueSaYIlXRkzn8c+DOXpL7brrRwno5yRludVJfdthb1Dy4A11jIDO\nSRRfNbYf9p5vCn0nBodBH49wKP4jEPbPk2Tegb4w8NoPM+Gwyw38eFZYEnaVfcOt8+OHQNd5GiMj\noQC7yVY9J6m5/z8w3a666/r3WrA764YNyZUPgH4oR0VzuSnsoYotRxRb+kGPTAisWukA+2VJWRG1\n132gXw+vtFQ/CHvhJ9dY7fe9oN/1n8/VC4W9pS9X3kgI9hd7bT2Ic29BH3j8Z47p97D/bp48YZ7c\nA7rQXRODbSqwS+kMsm0KukGXz77QYK8PuwZrveTuWh7ohvFcu32WsF+Um9K5l/EG9GwR87rmstfw\n/n0fu4PT9Ap03ksqoE81rvLuG+uC91dJ0J+jArBrp1VF/LGoE3TrCwsWzSi/AN071C51/gYuvL49\nUtZKbX0O+rWdQ3fk9naAXmmsY67o+wx0Llme2Rx4fck0uWrHPgV9sZDMuGH6E9DVxvYfNy15DPqW\nzmyxbQ/aQa8/P7wuq6gN9I8HwizKOx6Brmks69482Qy6l0zeiZfyTfD9HTVJHDVphPvDl+417dkA\nukSK36Nvz9WDbnZEZJBVUAf6cetfhbSf1oDust3FMHKsCvT2z+f8M/XKQd+cf/tG08lShv/Fn2cU\nOr99MdJQxHA//jwkQJ5MPsOf8+cpUuyQs275GQz/kT+P4ZHt+UQKw3/jz3M2C8cG5xlFM1xxdh7k\nNfj6Q7M5w6Np8yTmHGWKNo9iujdtnsV0Lm0exvQttHka04tp8zimK9HmeUyPoc0DmT5Nmycy3Yc2\nj2R6J22eyfRttHko00to81Smr6DNY5keS5vnMn2GNg/+m+9Hmyf/zfejzaOZTp9nM50+D2c6fZ7O\ndPo8HprzwR7spv5frjKpZIcgAAA=\n' p87 sg7 g8 sg9 I25 ssVgist_earth p88 (dp89 g2 S'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\nAA==\n' p90 sg7 g8 sg9 I26 ssVDark2 p91 (dp92 g2 S'H4sIABfKe1cC/+3XP0vDQBjH8bu0Lpnc/YNjp8yCwrN7GFDMKNKkEQSbNvEiZOui4q6Dgr4R0cl3\nYMUWGkH8s9jBF6Bo76ld9B0kv+9wN3ye+binYwVR2mxnTtBKQqeZ7uqdepLUM3srCYNWtKeTNNB2\nLMdTdtQYa2wpceBJ/2g9rtSUXBVSVQ9/Zxo6a4d2XPWs7UUllBzNTNVUxZPLruuufI/iQwntH2+I\nBSFmuCvq3pme6THnSHAfBIfDi+tL3Dv1Hjia5jpwOLwEvsnlNMsNaJ97g8PhJfCvT9OQTk9Mt7TG\nPcHh8BL4+ZmpT/dd0wvNczdwOLwEng9MQ0q513/7ARwOL65P3oXLC1NOc9w1HA4vgU/+B39vOBxe\nfNe+8wOnSxfehyAAAA==\n' p93 sg7 g8 sg9 I27 ssVRdBu p94 (dp95 g2 S'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\nfO4wHuj8wMNG9n/5mjcrhyAAAA==\n' p96 sg7 g8 sg9 I28 ssVgist_yarg p97 (dp98 g2 S'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\n' p99 sg7 g8 sg9 I29 ssVBuGn p100 (dp101 g2 S'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\n' p102 sg7 g8 sg9 I31 ssVprism p103 (dp104 g2 S'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\nyPHMiVzNiD6hTzFrCj8feVjt+TdWhLrjhyAAAA==\n' p105 sg7 g8 sg9 I30 ssVPiYG p106 (dp107 g2 S'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\nGu9pk4cgAAA=\n' p108 sg7 g8 sg9 I33 ssVYlOrBr p109 (dp110 g2 S'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\n' p111 sg7 g8 sg9 I34 ssVocean p112 (dp113 g2 S'H4sIABfKe1cC/4WZe2zUVRbHW1CjxCjusmxdUdnEZMlGyeqi1l3XY0w0ZrtLWFa0Kr4oGDUKbZ2y\nsKJi4juaoMvqiJVtzEKIGlIKlAKlIM9CEabttJ2+pjOd0hctxRdWxQf33O/tHX9nTvz8AWk//fU3\nv3vPOfecX5ePK1hY8kTh0ukFi4oXTH+i5PHQow8VFz+0dMIDxQsKFi18MlRcUhCaUJRtf2rCwvnW\nFo3Ly3phTva8l2YXjZ+Wl/33rOy8s17Ez8wPLS1cMKHorDnjHs7Ny8rLPvMzZ0/LGz8n+8aZM2f+\n9Ycz8D95WaF5r9yRNTUrQIJ++vXJsa/L/mfooolMIQU9Mc4vF74rzlAO87LwzzBxXL9C+MuYOE1i\nVgpfs8PQid8fFv4+ppOmMKXCf3fa0IH7lwn/Xqmhg37BvC/8jUwHPt//he9oZ2gys1b4ZU8Z2vH5\n1wl/CdNOv2E+EH77NkMbnu8j4e9h2siu43rhv/na0IrnLxd+1TuGVrqI2SD8DUwr1qdC+NYYQ79k\nNgq/hIlh/TYJb9clRr9iNgtftcXQgvWtFD7/LkML/ZrZIvxXpwzNWP8q4d9imuliZqvw1zHN2J9t\nwjc3MWT3cbvwi0sMTdi/auHtczfRpcwO4TdvMkSxvzXC38FE6XJmp/BffG5oxP7vEn7lfwyNtIKR\n/o9MI+LjY+EbLPTmGwbpi5kGxM9u4e33z1zPSF+xwVCP+Noj/D+YerLPIf2nJw0RxN9e4d/g547Q\nSkb6PzARxOc+ylw/j9Jb/zVIn+DyeATxu1/4qbyvR8jGofT3c337BPF9QHguX6WHKfy24YBSn+oQ\n/7XCT+G4raMwU6vUl0PIj4PCh7l+HKRV+D/obXmoRf4cUvK/llYxh5T8PoD8qlPydz+VvmuoU/Jz\nH/LvsPCTsa9uHTPn117k5ydK/uyh1e8ZpI9yeuxG/h4RfhLyYjUj/WyO74+R30eFd3nr4jBzfO5E\n/keU+KuhWYz0Zbwu1agP0ueg7tVHGCU+tqJ+1Cv7X0Uuj8X68v5Wor5IPwnnRkM9o+zPRnJ1JvP6\nV9BsRvqV/NzlqE8Nyvqtp0bUQeF5fT5E/WqUHn3BPxnpJ/LzrSFXp4VH3xJtZJTPtxr1L6rcP0zu\nHBGef/+bqI/SZ6Hva4oyil9C7pwTHsxhmtTrbX1tUu/vzmHh8flt/W1Wrg/TnUwGj/VzfYK2/i3N\njLp/tn63SI/9vwt9jBY/tr63qPEXa2GU+lBOrs/K/PkrKJ+RfgXyx54P0ucg/1wfKPIf+WvPj1Y1\n/+9mpC9D/XB9aub12U5trYxav+z506bWP9dHa/XTnk9tav1tb2OEn4X67fr8zOu/m+5l2tXzw55v\n7er54+YQ7fyy51+HUj/30VxG+ijOz1LMSZn3dz91djDq+W3Pz071/HdznNY/2PO1U+0/4p2MvD/6\nFzdnZj6/6uh+RvoY+id7PsfV/svNwUE/F/2bPb+7ZP+FvuABpkvtH92crvWfiS5G7V/t+Z9Q4jdC\n9uekP4n+2fYHCSW+66mQkb4c/bu9T0I5fxtoQ7lB+hDmB9tfJJT8aCDb50s/4yfzS1Kdf65mkur8\nZPuTpDp/FTHSV2J+s/1LUuk/m8jOOUl1frT9TVKdPz/71JBU51fb/3Sr8+81jPSnMD/b/kj6O3Fu\n2TlP+krM77Z/6lbn/40Vhm71/YHtr7qV+hCjzz8zSJ+L9xe2/0op9aOV7Jwr/Sjen9j+LKXUlzZ6\nkpG+Gu9vbJyllPmrnTZtNKTU90e2v0up759snKZ+5v1Vj1K/OmgGI/1pvD+zcd6j1LdOCjHSV+P9\nne0fe5TzN072PYf0y/H+0PaXPUp9jNOXXxikvxnvL23/eYy095/XMseU/jRBtj9N8+g7Xd3kNC0J\n+jA9yCTQv6Z59I2uLlZuNgSvX0e7mAT62zSPvu8k6t6pLw3B319BU39rSKL/7fUefdss1DVbJ3oD\n96+i5c8ZkuiP0zz6rnLUrcVMb+Dz1VAiyaB/9t71Ta4ubak0eO/6oluYbvTXadej73F1x77nS7se\nfc37TDf67z5/PfqWBtSV6xnvJ6IvGTfekEJ/nnY9+o5rUDf+xXg/FX3F/AJDCv2792XoG1xdsO85\n065HX7B3jyGF/j7tepz7Lu9HvzL0BdY3QlcwPej/+8e8O7ddXucy/YH1b6DnmR7MB95HcO5uQt7a\nOt0f2J9G6rFgfvA+H+fmZOTl1iqD9zk4F2+71XAM84X3MZx7i5F3X48avA/jXFu7xnAM88eAvz/O\nLZdX9j239+5cOofpxXzivTt3XN4sZbwvw7nyyMOGXswv3j+IcyOMvNi21TAQiJ92qt1v6MV8430C\ndX8UcW/f8w8E4quDpv3O0If5Z9DfH3U7H3H9J2YwEH9xevklQx/mI+9d3XVx+29mMBCfXdTfx2B+\n8t7VTReX9u8cg4H4TdDtTD/mK+9d3XNx9+03hsFAfCdpHdOP+ev4mHd1K4a4+jNzPBD/3XTueYYB\nzGfeF6Lu5CJu+Jh+yvso6spjjxoGML95PwN1w8VF9XaD964uHDpoGMB8573Le7fvp781eO/y+vfM\nIOa/oTHv8tbtq+0TvJ+EvHyVGcR86H0IebcN+7aM8T6KvBq0YH70Phd5MwX7sqPaMBTI3176W57h\nOOZL713cL8O627/zDQXyu48++tBwHPPn8Jh3cevW9S/McCD/++l8Zgjzqfcu7ty6Pc0MB+pDPz3O\nDGF+9d7FjVsX+3dO78OIi8PMEOZb70fdvuO5v//O4H0+9vXKqwzDmH9P+OfHvs3Fc93EeJ+DfXnt\ndcMw5mPvl2Ddq/G57d95vY9hXYeGGczP3rt1c59rZ43Be7cuM5kTmK+9d8/t7vvD9wbv3XOtZ05g\n/h4Z8+5zx/F7Ld5Pwee64ELDCOZz75fhvjfhumeZkUB9PEGFiwwjqIfe34zr3Pd37TSMBOrnCEWO\nGkYw348E+lP9/9C86T8ChDwmMIcgAAA=\n' p114 sg7 g8 sg9 I70 ssS'inferno' p115 (dp116 g2 S'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\nxlpNhyAAAA==\n' p117 sg7 g8 sg9 I35 ssVYlGn p118 (dp119 g2 S'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\n' p120 sg7 g8 sg9 I36 ssVpink p121 (dp122 g2 S'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\n' p123 sg7 g8 sg9 I13 ssVbwr p124 (dp125 g2 S'H4sIABfKe1cC/42ZuW9cVRTGZ5zQuBrCEB5hCK9I4co1BRI9IywwtjFrFDtGQiJOPIwLd2kA0YU9\nGIyjiIKCAiGEEEKIfV+8je2xPfaM9938B5B7c/IVZ87Rx1fkV3zz4pn33j3n3vNdbukfHL5waaS9\n/2JpoP3C8Avl58+VSudGWs+WBvovDr5YLg33l1uHsjc/1Tp4/qY71FLMvNSd7Xulc+hYWzH7cCZb\nPP6yfOZ8eeTSQOvQ8e6W5+4vZorZG5+5ra14rDv7QEdHx0P/3lD8p5gp973alUkzjv558BZzUZdB\n278Caj+Jugra118DtZ+P+hC0//+PQO0Xoj4G7b//Caj9E1Gfgvb3+wzU/smoz0H7+38Bav9U1Jeg\n/fu+ArV/Oupr0P7934Davz3qW9C+P9+B2r8j6nvQvn8/gNq/M+pH0L6/P4HavyvqZ9C+/7+A2r87\n6lfQfj6/gdq/J+p30H5+f4DavzfqT9B+vn+B2r8v6m/Qfv4ToPavRE2A9vsxCWr/9deCJkH7/ZkC\nm66PmgLt92sa1P6bbwRNg/b7NwM2XR81A9rvZwXU/ttvBVVA+/2dBZuuj5oF7fd7DtT+1XeC5kD7\n/Z8Hm66Pmgft9VEFtT/6blAVtNfPAth0fdQCaK+vRVD7778XtAja628JbLo+agm012cN1P4HY0E1\n0F6/y2DT9VHLoL2+V0DtXxsPWgHt9V8Htf9IVB2060Md1P7kRFAdtOtHA9T+o1EN0K4vDVD7U5NB\nDdCuP6ug9jujVkG7Pq2C2p+eCloF7fq1Bmr/sag10K5va6D2Z6aD1kC7/q2D2u+KWgft+rgOar8y\nE7QO2vVzA9R+d9QGaNfXDVD7s5WgDdCuv5ug9nuiNkG7Pm+C2p+bDdoE7fq9BWr/8agt0K7vW6D2\n5+eCtkC7/m+D2u+N2gbt/rANar86H7QN2v1jB9T+E1E7oN1fdkDtL1SDdkC7/+yC2n8yahe0+9Mu\nqP3FhaBd0O5fe6D2n4raA+3+tgdqf2kxaA+0+98+qP2no/ZBuz/ug9qvLQXtg3b/PAC1/0zUAWj3\n1wNQ+8u1oAPQ7r+HoPafjToE7f58CGp/ZTnoELT79xGo/bNRR6Dd349A7ddXgo5A7f/fz7G/w74n\n+50NuT8N5z6Ny/0dd+4ze07sObP3hL1n7D1l7zlbJ2OyvsacdcbWKVvnrE6wOsPqFKtzNamPNadO\nsjrL6jSr86xPsD7D+hTrc6xPsj7L+jTr82yfwPYZvbI/6XX2KWyfU5X9UdXZJ7F9FtunsX0e2yey\nfWaP7E97nH0q2+eyfTLbZ7N9Otvns3MCO2d0yfmkyzmnsHNORc5HFeecxM5Z7JzGznnsnMjOmZ1y\nPu10zqnsnMvOyeyczc7p7JzP5gSpzBdSZ87A5hRsznFd5iPXvTmJzFdOO3MWNqehcx42J5L5UsGZ\nM7E5FZ1zsTmZzNdOOXM2Nqejcz42J5T5YuLMGdmcks05R2U+OurNSWW+etKZs7I5LZ3zsjmxzJfz\nzpyZzanpnJvNyWW+fsKZs7M5PZvzp5IPpE5OkEq+kDo5Q0HyiYKTU7Cc44zkI2e8nETylYKTsySS\nzyROTsNynkTyocTLiSRfSpycKS/5VN7JqVjOlZd8LO/lZJKv5Z2cLSf5XM7J6VjOl0o+mDo5YSr5\nYurkjInkk4mTU7Kcs03y0TYvJ5V8NXFy1pzkszknp2U5byr5cOrkxKnky6mTM+ckn845OTXLuVPJ\nx1MnJ08lX0+dnD1zK593cnov5y/3tf8HfggAdocgAAA=\n' p126 sg7 g8 sg9 I41 ssVRdPu p127 (dp128 g2 S'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\n' p129 sg7 g8 sg9 I42 ssVcubehelix p130 (dp131 g2 S'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\n' p132 sg7 g8 sg9 I43 ssVGreens p133 (dp134 g2 S'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\n' p135 sg7 g8 sg9 I44 ssVrainbow p136 (dp137 g2 S'H4sIABfKe1cC/2WZeTyW2R7AX2mZVGpapZQ0I1dyC5VQP7Qp055So7K8yCRFhFIM6uYqk9CmMhJp\naKFiMGWLNvu+7/uaLMmS23mc55znvu/3j3w+fZ33vJ7nnN/vd37HZYyJld3xk46KJidsTBWP21na\nWhjZ2Bg5ih2xMTU5YXXK1sbOxFbMWmT0t8Ss+KPWeowu74KeiPF/dluLyumKbOOJ6I69iH+Hb+t4\n0lTMeqzeGDNVXZ6uyPffGSenK6onorF9+/atI99h/tHl2Rp77OVJ8zBVwPs/PgH708UZUQl3ay2i\nJqt7gMRfMquKRjqJH/mGqABrTRW1P9RugeXt9iJDjj/PUAGJ6/KubW+9D4tCPJpvfaP+2zCiHHLW\nfNt/S/UR+LvWW7gNc8afQ5RDNV9qbbP7UwhLeGkgNUT98BCiDNQ3qmeMNEZCboptivkA9U4MZTDx\nv+s6MiZHQVCycahxP/VDg4hScCmTjklaHgNLHl8QE+/jjD+LKIXcbZ+64vb8A3z5R10W3dQPDiBK\nIO6wvam/XTx88TjMP/2J+jMMJaAZHtMrrZsI0c+GLJTbqR/4iiiG6/Prld+VJMHZCX+KBTZzxjsi\nioE/o6r+ucUbaDeT3xFfT/3XfkQRfFS87pn3JQVOiKzX8qqm3oGhCF6kFoRLXngLMrr7WqeUU9//\nBVEInWkdxad/fA/dlX7664o44+0RhdCrrx1efOcDpJr3+y7Mpf5LH6IA5IvrU5WXpEGcw5rHEenU\nn2YogPe1qwrtnqXDWfviJz1vqe/rReTD6UBbv6uqmfDUTiq0KZEz3g6RD7n1YcaxR7LASXxq6JU4\n6nt7EHlgMV/P30MmGxZpOb2ufUG9LUMe7O7vMH5Slw2hW74MtjymvqcbkQuy1bsUF4XkwHP7Auug\nEM74U4hc+D1M07HELBcMRFWUpgRQ3/0ZkQPnDj1PzZHNA+Wq9h1yN6i3YcgB17BFgWMa8mCXV3BF\njxf1n7sQ2WAln37b+EE+XGqO/2xzkTPeGpENeiqTtrcaFUBYHz/w/jnquz4hsqDMyeuQ34JC6H7i\nzHO3pf4kQxaY735me6CkEJzev5Kdc4z6qkpEJqh5xGxe7lcEVa5/LDUw4vgKRAZETFnqO31HMXQa\nL1myZz/1FeWIdMiSHL/o64QScOGdURr6hfoyhjTQmT4zviy+BEyS15rv1+b4UsRHkOtetiXqdCmc\netBSyV/N8SWID+Br6fbgvEIZxLfGRP+kQH1JMeI9eHpUJyhWl0FxW7DYDWnqixjewbzu/pvxvuWg\nnWjRGzeT4wsRb2FfapCS/OYKGOT97ufzA8cXIFJh+aB8gHl/BSg6Lpm4YKiD+IJ8RAo8OuA5eDK0\nEsZU65/4tZP6PIY3sGHY4O+ApVXgfTmrUbeG43MRyXBJrmeumWsVDEhN9OnM4/gcRBI4l5usv1RU\nBQEqGtc2vaU+JxuRCLO3NpSOUayGi5LGE3bFUJ/FkAABpqreOa7VUHpixaypYdT/GYCIB8uB2Dk9\nBdUQkreg0uUOx99FvAL94z7yfPka8Llq4BFyhfo7/og4GNFK81x4rgYGVUtUXc5Tf/MWIgYOH7Qb\nuzizBkb2bpghfoLjbyCi4f6nZP4x6VqoHRGFnUc43g/xEiq2KLn3nqyF8x7rajftoN7XB/EcbKUD\ntF4n1ELbzPwln9dRf9UbEQEdbyzdkqbWgf5K/srditRLL0Q8BdmegNUjh+rgB4/1K82lOH4eIgxO\nGX3bYx1WB267L+xaMZl6iTmIhxDXrVAwq78Ohqf2vXg20E78tBmIIFj+Ij25eX09VE6b71nfRL30\nAsQ9CDp+V77Fqx68J67mZRVw/GzEdVAYvCo9s7geLINB6+Qbjp+PuAwSGz8n82UaoHF249nUCOp5\nEggH+NripF78WwP0BV+vyLnH8dMQhvDw1pkoq8gG+FPjxE0/T46fiXAHrcmVljJfGyCjS6dY3IHj\npyOuQXOUSUDXukbYei0yex2f8/0kEbdBRzLoRrFbI0yQ64r8eSfn+fyICITE18qhhW8bwc955Emy\nOsfPQgSDdkGSQrNYE5SGXemXWML5/LmIRxDupvjfSduaYPwlXvLP0zleCvEYslIDFDW8miBhtbV2\ny1AbXR8Mz2D85AfeDhlNcCc4PMyskeOvISJh4+FNKq+nNEP6iJKKfzbH+yJeQL2aXKDYL80gobx6\n+qU46m9eR0RB37jblr96NMMk/j2nZcEcz/A3/LLgucqTlGY4bzbyl6cXx99GxILuVYtAnkgL7FG+\nn3/fnvo/7yD+AWezR/yd6i3gYuC88pQhx99DvAbZG8fU/G1bgO8MY4d1qN/JkACvrqQ1VYR/9y/V\nnDRXcPwuRCJE7ZDRnFvXAnljHIrWzuX43YgksFefPk9HshUU34Tv7eVRv3cPIhmyDEMOW+xohWtz\nNZaZN7VSz/AGRG2MB864tULwzlUBPpkcr4dIgb9+0W86E9UKYfgn6/X3IVLJ545vF9ssdZfj9yPe\nku89Fs9DPMM78lyGK6W0fS04/gDiPXnu2fjvIP4g4gN5r7FB4t4DKtQb/Ir4SNaNA35OxDOkkXVZ\nOTATdo+0UH8IkQ4leN2z74H1hocRGWRfjb/TZnT3HccfQWRCOt637Htm/XKGLOjFceGlbcLciqvU\nP2PIgmM47rDriIxfgcgmcc3RfZb3bH3qIyMQ2SRusuuU9UoMOSQuz9v1ckhnAWc8Qw6J++w+YL2K\nMiKX5JXQnhv+9rXNxL94jsgleYvdZ2Q8Qx7JiytS06MePOSMZ8gjefcL3sdk/EpEPsnrsveOBub8\nRn3US0Q+qRsacJxg/SqGAlKXyEbz/xZdxhnPUEDqnk04DrFedTWikNRVSgrexmodTcT/HY0oJHUb\nG+fIeIYiUhf+NMthmuMTzniGIlJ3ZuM4SsavQRSTulZfe5NG0nHqY2MQxaRuDsNxmvVqDCWkLr9y\nM9JCQoEznqGE1P3rcR5gvYY6opScK7Km1P98vrmR+H/iEKXk3JKE8wwZz1BGzkXuOocm9AVzxjOU\nkXPXFpzHyPi1iHJyrnOpLnrsakT961eIcnJubMF5kvXrGCrIuXTl1jVJsvM54xkqyLlXG+dh1msC\nopKcq3v2W/TV5VOfEI+oJOf2UJznSX5kqCJ+s532uAQv6g0Zqsjns3UEyS8MVeT7nT1jHRm7ifqq\nUcjfJ4nrFDL/IkQ1eT56ir9+KByuJ97YCFFNni9bB7H+fiCimryf2Sd5MpIvqK+pZoDF+P2ydRbr\nZRhq4C1eH0WTaq67W3DmZ6gh62sFruPI/Aw1ZH0eUasTl1zAmX8Usr7/wXUi639ajKgl+8M2fYVD\neTb1fBNELdlfbB3K+gdBiFp6LhRb+D7bnfq6Wgayv9k6l8zPUEfiQ/nyybyBVZz5GeqAj+NLJ66j\nyfwMdZCA49Oz6M2LDzTV0vlHgfU4vtnhOp3M/zOinsTHcqVPmp9vUm9miqgn8bUSnwNYHxKMqCfx\nOa4r3+qdDvUN9QwkvrPnDNbLMjSQ/LB9u8GHii81dH6G7+tVbzS/sOcYMj9DA8lPNyMOOqiGUN8w\nChzA+Y09J7FebgmikeTHrG3DD4r2UH/UHNFI8it7DmN96ENEIzkXPP8j2C2JR31TIwOp+9lzHpmf\noYnU9T/qfNj+NZz6owxNpL5gz5FkfoYmKMP1SY9X4WYXfeqbRoEkXN9I4HMqmf9fiGbIxPWRp5F4\n9EFR6n+zQNC62QWfg1n/1yNEM6nP5g6ZtHo+pr6lmQFMcX3ngc/ZrJdnaIF8XB9u6TJUm7Of+t8Y\nWsAH15fsOZ7Mz9BC6lKR/+unfp9/FBiH685w3CdgvcJSRCupjzfsnrvWZyf1lscQraRuXIH7EKwP\nD0O0krpw3BTR4Y4A6ttaGUjdx/Y5yPwMbaSu832XNl+yo5zOz9BG6ja2j0LmZ2gjddlRDYML89Sp\nbxsFtuG6i+3TkPmXIdpJXZXhJrd04CL1VscR7dCI66YbuA/E+iePEe2wGddFPp09U15llxLf0c4A\nP+C6Rx73mVivyNABObiu0TL3VD02j3orhg54jOuWrbiPReZn6IANuC6JNTidMIlPfcco8AbXHXm4\nT0bq538jOsn5uHhvbEpwWDHt351AdJLzdSTuw5H6/CmC1gXNE/6w0fxcRPynTgaS99Vxn0+wzz+A\n8/rl+RKDNauFPZu3LXAfUdAvw3lZzEXqrq+TsA/GebcC9ykFvRLOq88OJwcYJBQI+VicN/fiPqig\nZ/OieLzWHm1RYc/mPbbPKujZ/tBQkv+0bRuFPdtfYvu4gp7NS+O8961xvyjsg3DeOY/7xIL+CM4r\nO5v/vbozNVfI87RH84Yr7kML+oM4L7w6mnfWb7ywt8JxXw73uQV9II7rk875uZzfKOzZuK2H++iC\n3hXHZdEpC1Mj3IS9J467lrhPL+g347h6plAhb1VilpBn+6vsPYCgZ+PiPAlnG/mhTCG/H8c9e3zP\nIOjn47i2Xito5iPbDCF/Gcetj/geQ9DfxHHpdtqclP7WNCG/FMcdRXxPIug34LhSkNidImf8Uchn\n4LjxGd/DCPqnOC5seXeWr1P4Xsir4n3fju95hNYH3tcuXR79ZrrvhHwt3rdx+B5J0B/C+zJVsrfW\n53WqkLfH+y4P31MJrQ+8r062fvGuWC7snfG+McP3YILeDe8LJ7sbp/fdTxby/8Lr/ha+ZxP0+/C6\nHus8UXzSDGF/HK/bDfgeT9AX4XX5yVGybJJbgpD/Ha+7VHxPKOhT8LpKMZQtzKp7Jfz98brJwfeQ\ngp69nzu2X8PfMClWyLP3e+w9p6B/id/rkegDSg33ooV8Jn5vk/E9qqA/it/L4okxeS5nXgj5O/i5\na+J7WkG/CT/XBd0vk3foRQj5j/i5deF7YEHfgJ+L10MF77rD4ULeD//dDfieWdAvwn+XkmSI2dTp\nIUJ+L/7epfgeWyg/mo5+r2srXU1fXQoQ8lPVRud9iu/JBf0b/LkzLpbtkmm7Jrx+8LhwfA8v9H7w\n/1/OjJiloO4o5CcYzFSWDQnUGP3prUHymrHi/wAkPXCuhyAAAA==\n' p138 sg7 g8 sg9 I45 ssVPRGn p139 (dp140 g2 S'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\n' p141 sg7 g8 sg9 I46 ssVgist_heat p142 (dp143 g2 S'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\nhqd+h6dm/QcQJntuhyAAAA==\n' p144 sg7 g8 sg9 I47 ssVYlGnBu p145 (dp146 g2 S'H4sIABfKe1cC/2XZCTTUb9QHcEuSQlRK1pRKhbTJfqUURkiyhWRLsu+pyK5UdtnaqSyRfcsyY0vZ\n930bjJkxMylLWnjl39vjvO89c8xxPr85Z87Md+5zn+d3l8Hc3s3O8aa4uYOzpbidm63r9avOzldv\nbrzibGnuYO/i6uxm7rrRif6/qzbaW/ynTgwYusBL9GbB2k6MIhj683T0mHVBf6+xcL3paLnRad0l\nBispDB2GfuUaJhEM4yV6OQ0NDbXllVr9g6FzNbunQ7eL7m99gf99ll0t8r//o1MK6/spNOgawJNm\nvtNAzTkBR9qCfD/GIaqwnwYZxXWd+BkaGKQuqiaQSP+89Ms+46h6GvjGpld2kmhgPaLfqopDrhE7\ntM+hkAZ6LmHpdXgaeOwo0l+MRz4mG/tFLYUGYlouscUDNAjS2DHy1gm52+j5kn1RNGAU0/NN76RB\ndKD7NX1V5CzBTAEMvjToZZG1fdJEg1cfOqnMQsiTRMvOD9nTIHNSQC+sjgY53467F34n/nOJNtcd\nJUY0CKhiUPKtpAH2YPRvqxbkVR6iozFqNDB8PinqUkyDlqvfAra/Ra7HP57mJEUDiTufdljm0GA4\nTpu11gc5CZfoen4fDdYbZjLopdOA2pwd5aaH3Nv6osKBbTTol4ykqCTT4Pd6Tt69h5Fzsm/awMRA\ng+yt7j0yT2jAquD4smM98pRcXOsIjQrBXwyqRGNpwOPWfCBgaOqfSxl4JX4YpIJxo3ymQBgNDmaI\nZx8rQN6wdMQy7jMVjqUJxXOE0EAK/3DlgfxKMlHctZgKG/5+zud4KBWRlsi/qb74rvmGCkPmRPvZ\nmzTQvaB+TkkeeRBNH3cohgp5io0Gk840sAxJb5rZhpwnhuMBsz8V7vNnn+m5QQPXio26L6YJ//yd\nzMdLeEcqmP6IPvzJggb+89cHtaqRnxrxEawwoYJktyfPB2MaRIrVW9AlIe8IPElMUKfCpjwjpkxd\nGrywEJnOckFufYiW4y5DhdFwxS/PNGnwPjHY5QoG+c+W17e1RahQaCfcH6FCg/K2yR/se5CHuZuc\nFd9OhYdqG2r9T9GgkeWsX/mPyX++m287x8Z1VDDbP/3eTYYGA4opLPZtyAuwjb0TMxSQWteSeO0Y\nDcge6yL405CrXgt8hR2mAPtobpCBKA1+ZJpzN/oiH2SVt3vSSIHxssdOmL00YJnEPbttgHw0xebw\nbBEF8mI8DGT5acBdpLcQK4n892TrhzeRFDBQkxXlZ1/JR5053RNp5DtEpNUu21JgeelPUUGuy4Hl\nlRzyo9efd7OfpUDy3xxqTtzakgrIz6cxW+IEKaBmHZSMG6HC1dlg3iwl5NZk+69ui9PwhU/NI7mV\nCi6M0cL5ysj9Rbt8DrRPQ0wrm1oQjgqBW56Llaogf2onzzaYMQ2yQa181rlUeCyUIYnFIC/OTE4I\nD5qGEZkYmmoyFVIliqBOA3kHbZPIGdPpfzkthWqVxgvIaRIu+QvS0yCazBfDFkSFRo2WC+06yDc6\n9ymlb52GVv2RazR3KgwbDxj26iHfm3uqxYRCBg+2ZJnWa1SYsZ0yHzZErjj71nhLHRn4cNfYcvWp\nsO72rO2EMfLLJzjINc/JgHM/NBKtSoXtoXTuZFPk7u4enje9yHDtb45FElh9ZsyRRxQOMYnpkIFt\nJCdQ/xAVZFK5QxaskGd8V44aESNDbrS7vgwfFdSLhCN+X0deK/1uVzQzGfRVZQ7xsVHBpE4igdFu\nTb68tmWeGyXB0u8/RQHHLrlXLI7If5Xekv1ZQoJXOdiWYSoF/CZUMja7IOf+PfYxM5r0L+fRszr5\nXO5r8qWgpmtmTwIar6r7qxYKvGa8Ws57c02+fLLxXCokiG5hVQ3EUqB4i12d0O01+arkdqpfWQ9k\nAlt4r+VQ4LPQzZb9PmvyRX936fZPIgxLR1NVXlFgUCKwV8xvTb6UCKESnUQIpOqtLA0UoEHE2LHA\nNfny19g5nkmEg694o1kDKUCv+YQsHbImX9X5rx+HEKFFb9iK6kaBrSapsxC6Jl9M/McxZkRwZ30l\n3WJFgb12+b+VH63J17kA7JIsEXixVqw5ehQ4eRu7Xj1iTb5CyBo5XETAuh0cjlKhgGpo42btaOQP\nn77HdUxOwVYeIZHDkhQwezbIaxiHvP94GPH00ymwefi+fX4nBR7gFiWsnyE/+NmOI/fSFODoFH3K\nf09DwQTXWffXyD2uqp/czTYFO12bDwaNrvzONhy9HPAOec3CQZOIlX7tSDDpOl8zDRtFNRwj85Bv\nfcQSSHebAHWGVF+u1Gk4rmkT+LwU+VXhqXSHYwQQaLojNvhgGq44ByVk4pBnldS2DZEmwf0UW2+y\n4zTci3mZ9aF+TX/TSlk8/3ISGvOSAmx1piG3qLz6UwtyDMF/V9lKvxQWEZU4LjUNg/19vT3dyBPu\nmJ0T5ZyE24ml/T95p4F5eZ46OYScsPWUfeLHCWhjxwRXLZPhyO6t6+YmkJ9IE4zZeHcCDvr1HQ3F\nk8FI+fBORsqa/Ckuld48OQG+c9eHtFf6QJA1RpxzFnlr18DYFHUceqwX7/Gkk+F96LXTgj+RC9qV\nsui/HgeJgZATY4/I0Jfpry/GgNYnO8YEiTrjcQjW5B5NdSbDurZndrIsyEvjPfUkucZhCPfmgZMu\nGcTnSv1UOZBvlNDzTmnAg6TkSSlpmZU+wN3zWG8Hcr3aEynbAvDwILUWTydABn/Z2QxLAeQpRtsa\n/GXxMM6nG/aRngzvTDhwLnuRf/v6p8ZANnxCJnyCBN2+oiuPNev7vdadZmljEMnoNqlXTwL6FJXp\nsGNr1l/B94qtV8eA5L4uUvAdCQ59tKB/KoN8MP/RNcWdY3CKFCVPCCeBLvnu9oxTyA+p2z3KahmF\nOOM9xExXEtxlf3KoRAW51xgmXyBkFL605Kx0SBKkHSlW/KiJvM7z4MBDGIWzZ5QUFeRI0KHTealL\nF/n2zSyMv+dH4GlhK5lp10qf9JixGTdGbpFCOGCbOQJzB68+bmQkgUgi292vFshzZGu1+i1HQP3p\nF6UYAhG0yw/E0Nkip2tL9lDjH4FkzrtUo89EuDOqnMa+Zr5RmU++yJA9DFbshVc2ZBPhxoaUU0Ne\nyI2CcwY3HB+G/gRDnr54Irw8UW/0xR+5C3fltc2FQ3Bh/1JHuh8ReswoHgwPkQemNs5wyQxBbe6L\nsDs3iMAezhm1LRZ5gkz/Lb6yQZBVVFbT1CHCmbITmfueIc/6PMW0R3EQshum1gnJE+EWyaBe6i3y\nKqP5sANVA7DP4EHF171EyN7hPa6WjbyHwsgjcXYAkiYOe1WzE4Fw5uWyUQnyaW/OZMn6fuB0bj8e\nuzAFAs61PA5VyOk5BMXl1fshaMmddm1kCnSekU74NiDnfiFadLq5D37d50mTrp+C+w3sF6I6kR88\nKqOkpt0HTjvKLTblTEHl4lHblCHkUHWuQauzFyZfXRUcTJiChX16wYUE5Bd1Lunq6feCkQTTyk93\nCsR0br2s/7JmPp0wGzHu74HWD2+j79pOgbnvs7L+ReS33R1tLEx64Kyquqb2Sp+Oz6zqoTCg+TqC\n2XvWZrQbPnTSWIQVpqCln/BteRPy13Gh3k4W3XDELKp6bt8UrGdh3byFC/mHA/EbPAld8IYq6VO3\neQrkJCUOCgsgby55Helt0wV8t/qk478TwMVcR1lyP/JxTB5fIKXz7/sgQGq4p6mKBPLvA9jXoY6d\nwBwtlCX3iQDDZUm3DKWRs9o3S0R+64Dbu2qus+cSgItcGWurhHz38kBJnHsHfM2wFh5JJIA690S2\nNwa5ZDjpzLPFdrgmzTqcHUAAP2WWxnAd5GpC35tSbrfDQE1WvL8dAYqcxaZeGiO/msNkkLHcBtra\nf74pAlCfXWDMt0LuenorPsevDeqG5tn3AwH2NroJ1DkgD+nYZVfM1AZyNxLqv+8nwOUf8dK9nsif\nWIovVIS0Qs6CfMCnlb4bsb9ch+yLPGde1rd2UyvsDxhVSFqchI86Yw6/7yOvDVbd1PioBZI4Ahft\nxiZhyXd96OZo5B6JFXhm0RYg3GR9dqR6Eh4+Co+MjkV+31yOi1rbDBsqPQ4Tnk6Cm9fdoAeRyPeF\nL5o1nGiGA+vxFUkrc5exlaNXwCPkuA8F79OSm0BNXUNLe2UuVtY2tb+95v2ZE12WQrY2gV1k8Qjz\n4UkQU9Aycw1C/oPriPo1v0Z40CPsVMYyCdsOKura+iGPVaLGK880wDuBcHqX8Qn4xSWhZuGN/KhD\nOmGPaQM0WfyMEKmYgHH6XQpGXsibEq1PMDR/Blqa1e6h+AlooGw+quOO3ObjXv8R+c/AMdOaE+U6\nAXm9y3vVnZGvnxtrKc/4BEdOyp9W1ZyApBrazjP2yF8KPRd4wvsJtO+8bV86MAEB2cNscjbIFTSM\nbW/drweXqq0Weesm4MaTZvrja/LT78VTYrD4EaJZfGavD4/DxXsVc4fMkLu/6WaWsv4I+ZqkAMGS\ncZB1yyLuMUG+tSP60vbuOuiKucTVGT0Oe67+GfCQZ9Jpv5pVroOF/sqU+w7jsOl8WOtW3TX5F9s8\n05ZXC9y7RSUV1cbhm5RPzSZt5JMGDQrZe2pB2vpx7ZzwOPQLOxQzaiD3C7r3ICyyBlaPN5bxUMVx\n5d1PVeR7cs/22dHXwO1ZO4JpHx7Sf2m8+KaMvHSYUUTdsRqSZHo9tufjIXJKIYZ8Crke65/JtgrK\n7p7Z0BCGB68O8Xv4NecL36S8qzZoVMFQbVacrw0ezCoF7vSv6R9hlrKchA84WGblPXBSGQ9qGexO\n7SeQH4r8blJzCAe7LgYVTwvi4WjcksXnI8jryvMzXiVg4VT8jOrLH2PAE0DVrxJbk2+y8w9fFiyY\nDRv16XWOAYPjkHrpAeTLOyRUTD0rwX/vRxu292NAvNykmLt3TX+613foTlMFJN849hN3fwxaz5Uf\nTxdCbj+mUyedUQ7V2U9DPS3HoPhYpsgr/jX9W7bZbP5eGUwusPCJK47BC8GnfIk7kecl+FprSpbB\nltUag/KGftLiBuQp5rtHn5mUwRCnsmf60Oj/W39iRasMvgSVQTqn59CZ9FFI6ucxjO9BHjxn3qaY\nVQaenOlnhjxGgdW8hPN6JXKP8nWYiO4yOMs5lOZxZhRu/5/1/XpwStXochlwrtYokJwW724IR26o\ndVbuqEg5DHGc8UgbHAHDxTipHg/kmJ2EPD+tckjj8Bg8nTYC9Xelvry5glxuLFis3bMcPDjSTg+6\nj4DUhp43HueQi6eLvN7zohxOcwymup8egbdhHlfOHUYu6Fov4FpfDhyrNQI7Vgs5h7zN4+qZcigW\nDJrWLh6GoKcFTZNLaD6nX7+Jg4unArQFp4sCtYdhfq9uUMEk8q9N6SGWShUwLaAdWEQeAst3c/JB\nTcjxj9XpC2wqIFCg6AI5YAg6jsfMXSpYs780pdxcH1UBAqs1BGc+HH+39+ma/deBR191SyugkD+A\npFU4CLmnOyzm1uxfC76K33iDrwAtflKBv9Yg7P7swlezZn/fMUiY+clUCSQ+Lf8C4gBEav/pOMjV\nlaTEhXlW8s1XoEn0GwD6vpxQC3nk1a9DbNTFK2EX358aAKer2qeP70Uuv6n3tatSJRTw+k1p5PfD\nyNTMD0a2Ne/P4QA+SbcSNHin8nw1+kHTMSKnfXYCfX8dNwVrbCphikfDN4/QB+ULEjavBpC/kfp0\nmeJdCb48eecJd/tA3KdFyKUa+a4nPHFcUZXAs1p98GS9Y69SBvI4+hsd8m8qIW/n3Un13F5gfbQ5\nYks0ck6rUg6r0kpQ3zmZ46PeC7e5slTGbiG/92nT+UfNlTDJre6TM9ED5CQNuhxz5AyHje4V4CvB\nhzsHM+HdA4bC1EJfDHKvqIyaoYVK4F6tHviU/tDhwjHk3xZ+0TOzYiFndS7uBuljYvuFeJGfUzgh\nuocHC3yXE3q59buhtL6HMM+EPNzLUkt2HxZ256sMODB2g9LqAe04mq8LYlwvHsWCyOaFodrMLvhE\nJ+XwehD5rm81cTcUsCB2PWWU37ALLiQRjnrXI7c+PP/BXw0LklUXx12ZuqD35OP5S/nIs2/sG03U\nxYI0PwPh8/tOMG0/WyL2AvniG12mPDMsKHi8J+426gSC/fwdpofIlcaDDjTYY+FMq8n0TeZOcNj4\n+tSgJ/L7uwrPj3thQe0QG60lpwPmUy4x5VsgbzMiOP0KwoJmYOnMfpMO8D7FVP9ACzlv/I7YbVFY\nuDR8fdabpQOYBvMeWMghN+88VyL6DAuXpbkXOvPa4aGnhZacCPL/+iYWTKNqF0VN22HbaiGfPf+W\nwbgQC1YU11/+m9ohKauqm7yyjv7rX/d79rlVYcH23J7lvoI22INxSawiIw+o3YB52IwFpxet9EfN\n2iB9cveVxG7kjQzSDin9WPD46bPuHlsbHPVr2+1ShZwLrkeVEbBw55I480hRK5Tw+02qZSE3vhVf\n2PkNC35ZAywnLVrhVPGRtN2JyF//uX20jIUQltCVn0brynw6avcjCDn12+IyEysOws2lN0+UtMCF\nL+FH2pyRr24nuHEQXUbglLNqge5QxblUE+Q+toYqksI4WP0aOFvgyv4vRb5qyOve3rfVkMCBAj5k\npRU0w+rxtyRyjomScCs5HKg+njjm19IE9iaaikd2I9cXIud5q+BAB6MkLbG/CeYWlxhZ2JE/N+bt\njdXBgenyU4WhO41wJyazbmRx7J8T4zG/M01xcCP35+kHHQ2w7ohJaNEE8iNdt4TqbHHw566VzKEG\neNDAphneivzmlgzlYU8c+PHma0z5foat1mVbrMuQ4zQGri8E4OBhM6dObM8nSGS064JU5Bv/fOwR\nOIjztzc4c/gT7H7Gl7AjBnlWtJfpWVEc5Afq7v/+sR6678PsW+Ox/5e/+4XjnGBbD3bGGiAhhFya\nuSvZRWklv0TnX4Gb64FRwnjl0lF0/6qS8dz9xko4wUtPaMj5CAkMtp0Kb5HX3jxCfK5fCeyrc+dH\nONrptav2BnJ2q/LtDnUVMOLN/8FwsQ5q39y7cf4w8rienZeTBsuh4H366xdJdWDsFVfQ8XUE7f8w\nbs/qv5VB6Jh0xBTUwTf1N/RGBcjTy1rw8yxlYLrt463D+Fq4J1igjr+J/LiEqIjwrg8geVbXyj2o\nFnZ9rX5sI4+8/GWw7QXJUmD1HNcqO1ALBdXtYzN0yFW48O+91UtgNNVZdl1jDcSJ11z+GjKM+kuw\nwly6WTEU9NPtwzjWQM2fl3Mg/28/WAQP2MI4IrfWwFdPupDNj4fQ/tl27s76sEIwA/6fPQXV/9b5\nf/PhsBbuWEoBnHRKnxA0rAZMlWyeaMog2l9fyFh/tTQfVo+Xf1eBp/WfOz3I/aqZMY9a82Cso67k\n3fMqSGbzGFHNHfjnm06ah5UScqFwvW7K7OkqaP1zDCaDPCa1vH3qdw48lBoPkyXgYEkvh/Uath/t\nH/l4uLdvywFLG2cvv/s4EP/d/NJNBfnbR25Gpw9mg1QSnWW9GA70XlKkApr70P6OvvW5o+J7YGt6\npMnRioWAc5uaI3WRuxP0P8m+y4SxZT4ZPVcsvJ8WsXwx2Iv6f8Pmi7G9GVB0JF346Q4sDEWc/Zll\ngTwpu7b/C1M6PFrtT5Ww8aRFRDm555+/j71jgTmaCuYxdYuHTCpBcsB3f6Mz8upbxykpJm9Aqu7S\nuDN9JVisns90//MuU7IbXWgK8H2te+KiWgHh+8ouku4iJym/XDIsfAWrLw8vhw+f+4jfmZH/OmgQ\nnI9/Ac7FdCphXWVAcvzuwxzWhfrbaj0H/tUqg+2rhdzVTPx/AEL0OoSHIAAA\n' p147 sg7 g8 sg9 I48 ssVBuPu p148 (dp149 g2 S'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\n' p150 sg7 g8 sg9 I79 ssVRdYlBu p151 (dp152 g2 S'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\nKIWVnKiADxnsQO7roPR/NOic4YcgAAA=\n' p153 sg7 g8 sg9 I49 ssVPaired p154 (dp155 g2 S'H4sIABfKe1cC/+3YTUsCQRjA8ZnVLnuODhHV0ZOXIDoEz70hoReDTqHrBkGu7jYehKAuFX2BIgP7\nHhHYIYIunSpIoxcUwwrsVlBQzuPqwS/gLDz/wwzL7zkPM7ttWE4unc1HrYxnR9O5dbmW8LxE3lzx\nbCvjbEgvZ0nT5e0p00m11TUE24nz5N68G4oIPsu4CO/6MymZz9qmG44bq1OCCd6aGYiIUJxPx2Kx\nmb9WuAgmk/uLbJyx2xtVDcr3qgZsYh/AsE8gJ9fZx7ASjGKPcHigqpOTa+FLWB1+f1TvMIe9kJNr\n4YUj1RUMYjUYwi7JybXwLawJC1gVJrAqOXkgvHNfHcZOYQQ7IyfXws9LqiZ8f6le4aGCkZNr4Z39\n+QnzvzuRk/fXl7FG951VKavegJw8CH5cUJXhpKi67t5jycl18N69931FTt5Pn8Tq/vl65//HuiAn\nD4TLZPQfdgUMIYcgAAA=\n' p156 sg7 g8 sg9 I50 ssVflag p157 (dp158 g2 S'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\n' p159 sg7 g8 sg9 I51 ssVOranges p160 (dp161 g2 S'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\n' p162 sg7 g8 sg9 I52 ssVhsv p163 (dp164 g2 S'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\nQx2HIAAA\n' p165 sg7 g8 sg9 I53 ssVWistia p166 (dp167 g2 S'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\n' p168 sg7 g8 sg9 I66 ssVBrBG p169 (dp170 g2 S'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\nhyAAAA==\n' p171 sg7 g8 sg9 I55 ssVseismic p172 (dp173 g2 S'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\n' p174 sg7 g8 sg9 I56 ssVCMRmap p175 (dp176 g2 S'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\nF4B/t5aHIAAA\n' p177 sg7 g8 sg9 I76 ssVPurples p178 (dp179 g2 S'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\n' p180 sg7 g8 sg9 I58 ssVcool p181 (dp182 g2 S'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\nlxbRc4cgAAA=\n' p183 sg7 g8 sg9 I59 ssVReds p184 (dp185 g2 S'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\nEAuHIAAA\n' p186 sg7 g8 sg9 I40 ssVgray p187 (dp188 g2 S'H4sIABfKe1cC/4XXR4xWZRTG8RnAzazsvS1ZEbuoqHsnEkXGrgQGTEwEZoYZdaxsbDtUVFRUYowx\nxhh6770zvZev90LvRd6DZ5In/wXPgt/imQvD991733Pmjqqd1TSzrnlc7eyGGeNmNr3T+PbUhoap\nzVVTGmbUzp41p7Ghqbaxqr7yyk9VzZp+pa0fVV3xWU3ltC8m1Y8eW135bEVl9ZjP//+Z6Y3NdTOq\n6sfUjHprfHVFdeXln7lmbPXomsoJEydOfObS5dgf1RWN076aXHFvxVVy+OlrLXVQ+7nQ+1stX0K9\nfh70/kbLfKh//wLo/Z2WhVD//UXQ++stv0P9/f6A3t9s+RPq7/8X9P52y99Q/3//QO/vtvwL9f+/\nGHp/nWUJ1M9nKfT+BssyqJ/fcuj9TZYVUD/fldD7WyyroH7+q6H3t1nWQP1+1kLv77Csg/r9rYfe\n32XZAPX73Qi9v8eyCer3vxl6P8+yGer9sQV6/83XIVug3j9b4cj1lq1Q769t0Pv534Zsg3r/bYcj\n11u2Q70/d0Dvv/8uZAfU+3cnHLneshPq/b0Ler/gh5BdUO//3XDkestuqM/HHuj9Tz+G7IH6/OyF\nI9db9kJ9vvZB7xf+HLIP6vO3H45cb9kP9fk8AL3/9ZeQA1Cf34Nw5HrLQajP9yHo/aLfQg5Bff5b\noPfPWVqgvh9aoPetLRao749W6P3zllao75dW6H1bqwXq+6cNej/J0gb1/dQGvW9vs0B9f7VD71+w\ntEN9v7VD7zvaLVDffx3Q+8mWDqjvxw7ofWeHBer7sxN6X2PphPp+7YTed3VaoL5/u6D3L1q6oL6f\nu6D33V0WqO/vbuj9S5ZuqO/3buh9T7cF6vu/B3r/sqUH6vnQA73v7bFAPT96ofevWHqhni+90Pu+\nXgvU86cPev+qpQ/q+dQHve/vs0A9v/qh969Z+qGeb/3Q+4F+C9TzbwB6/7plAOr5OAC9HxywQD0/\nB6H3b1gGoZ6vg9D7oUEL1PN3CHr/pmUI6vk8BL0fHrJAPb+HofdTLMNQz/dh6H1k2AL1/I9A7++z\nRKDOBxHofZ0lAnV+iEDvlywOiUCdLyLQ+yOHQyJQ548o9P5+SxTqfBKF3tdbolDnlyj0fumSkCjU\n+SYKvT96JCQKdf6JQe8fsMSgzkcx6H2DJQZ1fopB75ctDYlBna9i0PtjR0NiUOevOPT+QUsc6nwW\nh97PscShzm9x6P3yZSFxqPNdHHp//FhIHOr8l4DeP2RJQJ0PE9D7RksC6vyYgN6vWB6SgDpfJqD3\nJ46HJKDOn0no/cOWJNT5NAm9b7Ikoc6vSej9yhUhSajzbRJ6f/JESBLq/JuC3j9iSUGdj1PQ+3ct\nKajzcwp6v2plSArqfJ2C3p86GZKCOn+nofePWtJQ5/M09P49Sxrq/J6G3q9eFZKGOt+nofenT4Wk\noc7/Gej9eEsG6n6Qgd6/b8lA3R8y0Ps1q0MyUPeLDPT+zOmQDNT9Iwu9f8yShbqfZKH3zZYs1P0l\nC71fuyYkC3W/yULvz54JyULdf3LQ+8ctOaj7UQ56/4ElB3V/ykHv160NyUHdr3LQ+3NnQ3JQ9688\n9P4JSx7qfpaH3n9oyUPd3/LQ+/XrQvJQ97s89P78uZA81P2vAL2fYClA3Q8L0PuPLAWo+2MBer9h\nfUgB6n5ZgN5fOB9SgLp/FqH3T1qKUPfTIvT+Y0sR6v5ahN5v3BBShLrfFqH3Fy+EFKHuvyXo/VOW\nEtT9uAS9/8RSgro/l6D3mzaGlKDu1yXo/aWLISWo+3cZen8lZaj7eRl6/6mlDHV/L0PvN28KKUPd\n78vQ+6vZOG3cf5NPCDiHIAAA\n' p189 sg7 g8 sg9 I61 ssVPastel1 p190 (dp191 g2 S'H4sIABfKe1cC/+3VvUrDUBjG8ZO0LrkFF8dOmQWFd/dgBzGToDRpBMF+JCZCQNFFxRtQFOtt2EpF\nL8K6KOig1ZDUegfa91QXnU07PP/hvMPv2c+u7lTDSj0ynZrvmpVwPVgr+X4pMlZ816lVNwI/dALD\n04Yro1oeqqdLsWdp9sGClytIbV5oMr//vSkHUd01vLylr05LIbXBZqIgc5Y2WywW5z4HqUeKwD5c\nFFNC7Kj6dHzEdemuw72QUH0QHA4fnW+qunTZ4mLaUqVwODwDPz3hYtpW9ajV5N7gcHgG/nDPJRSp\nYmqccSkcDh8Df3rk+jSjSqhzyz3D4fAM/Pf9+U/hcPj/+1WbS2lSlVDzgnuFw+Fj4DfXXJ+WVAmd\nN7geHA7PwJdV738uHA4fvQe2+QXEsoWOhyAAAA==\n' p192 sg7 g8 sg9 I62 ssVgist_stern p193 (dp194 g2 S'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\n4NQAdr9vBesjvYIyv8f+b5a5Tf0/nqNJWIcgAAA=\n' p195 sg7 g8 sg9 I63 ssVgnuplot p196 (dp197 g2 S'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\n' p198 sg7 g8 sg9 I64 ssVGnBu p199 (dp200 g2 S'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\nv363gcJSIPe2k/8/pWUXVYcgAAA=\n' p201 sg7 g8 sg9 I65 ssS'plasma' p202 (dp203 g2 S'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\nFsHnIH0dXHxd31K64i5me/8HP9HlPIcgAAA=\n' p204 sg7 g8 sg9 I38 ssVVega10 p205 (dp206 g2 S'H4sIABfKe1cC/+3Yv0rDUBTH8Zu2LtkE0UXQsVNmB+HsXswgBtykTSMI9k9iMhQcXFQcbbX1Idzr\nVkTxARRRK/5FjIpDV10097TNIIh5gN93yCH5nAe4N+spuxQUK1XDLnuOUQxW/OWc5+Wq+qLn2OXS\nqu8Ftq+7Wm9LLxV66qak2LC0/Nacm85KbVZoMrPZ3yn41YqjuxkrtTQlhdSinaGsTFvatGmaM99R\n/JDCz2/Pi0khJrg23d1y1GyoXkhwXYLD4X/7YD7cczTOHcDh8Oj7KHdKI9xz/A6Hw//3m47qnXbr\nquP+3gkcDo+8XlM9Ueeao8OWKoTD4Qm8tqN6pMae6oLOzzg4HB75GvcR3/8XuFc4HJ7AB/8Ffk84\nHN6l/aYqjM9lw9wRHA5P4GNci64uVSF9fare4HB4Avfzxg8PZ7SfhyAAAA==\n' p207 sg7 g8 sg9 I67 ssVGreys p208 (dp209 g2 S'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\n' p210 sg7 g8 sg9 I68 ssVRdGy p211 (dp212 g2 S'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\n' p213 sg7 g8 sg9 I11 ssVhot p214 (dp215 g2 S'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\naday/wBuOtylhyAAAA==\n' p216 sg7 g8 sg9 I32 ssVYlOrRd p217 (dp218 g2 S'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\n' p219 sg7 g8 sg9 I71 ssVAccent p220 (dp221 g2 S'H4sIABfKe1cC/+3YsUrDUBTG8XvTumTqVAVFHDtlcVEQzu7FDGJmadIIgk2beDNk66LiI1gfxFEf\nwEEHW8XBQtGqg7rppr2nutg3SL7/cA+H33mC27GCKG22MydoJaHTTPf0bj1J6pm9nYRBK9rXSRpo\nO5aTKztqTDS2lDjwpH+0GZdqSm4IqcqHvzcNnbVDOy571s6KEkqOb2ZqquTJNdd117/H8aOE9o+3\nxJIQgweOVrkX+tsF90FwODy/fts3jah3Y3qk067pFQ6HF8Avzk3vNMc90/WVaQCHwwvg/+cyN4TD\n4QXwBe6S5rl7qnJPcDi8AL7IvVGF60z9D8Dh8Pz616dpRP0eR9VZ0xkcDi+Ad09Md1MTDofn37Xv\n/ABKzSDthyAAAA==\n' p222 sg7 g8 sg9 I72 ssVPuOr p223 (dp224 g2 S'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\n/wD6bigkhyAAAA==\n' p225 sg7 g8 sg9 I73 ssVPuRd p226 (dp227 g2 S'H4sIABfKe1cC/03ZCTSU3/8HcGshlFBSQshWKamsfSSkUL4KUYosbfaskTaRUCRFC5WikDWRfd8S\n2bLvw5iZZyZStFD/qe/35/O/5zlzzpzXc+48z8yde9+f+1xis3Pxcnbz22Tn6uGwydnLyfO0rYeH\nrR/PcQ8HO1eXc54eXnaePO6s/57F42L/r7qzGbJcM2M9EWLqzi5nyGrMwmrIEfzfOfaefm4OPO4c\nZmyOqoYshqzMczjlDNnNWDX379+/7zez/X0xZPE8EXqIRYKF5fevP40BCfF/GgP+bZ+A5W+bhIT0\nkqYBBgM2gKmDbxgD2PlWSipuQ995LDC+ZIABBYOcG0x9GVDTw2BbqYg+wLfTJb6JAXsuvf2s6MCA\nGy9qSGyS6BeK57UCSxjQIeH8ltOUAfu942sYK9DFnIv5jqUz4ES5xKXBnQxYruv9oocXvWjNhX4t\n5nVP2rbrv1Vk9iOw/0YNG/rRRs1XYjcZcIHtOl+0CAPiBmWcsr8xFnzOfy5g/gIDliRqtDtxMsD6\n1bxxPAP9gWKRUb8zA2J3f7qv/5kOkv4dSjdI6Bq9/muKrRmwnvTUVmKQDiSDVwLePeg9NzSIh8YM\nyAkyl/vxjg4vVlybtv2Afl79Z2GAFgO0ZXg+teXTwYl0tMO4Bn0VtSDs6EYGNFUX5756TofN2Sp5\nakXob+POH9EUY8ARR/eAkNt0mL7IGyeTjX54r7riGj4GUBbJ7La9SIc8Y9J5gRfo3759//Fzjg7e\nyV3cGk508F9ddHT+EXrsi7cNvQQdOAzCPwhZ0mEnJZp5oO847He/sI8OURNwj6FHB7a8sxIdoeid\ni9XOPGikg3jotHWdMh1qgnazlV9E9877puZfRIc0+WTpp+J0uGG6mpTmhb7iZD73kTQ6qDdY0fx5\n6WAsMV0dexY9d4Vvt/pDOtSe4c82+06AAKMhOcgW3axmx0vRcDqYLanwVRonoKPwaaibBfoXr1nf\nH/50GEn1Au42AuJCz589aox+RybPoOcsHdyM5BeNlhJw1MLU2GA3ukqHt0jBETrME32NRWkESMgo\nKKmoobcFbZ+IM2TeV0Rk9N04AkifWQUklNDPqczk+WnQQWSTrpVbMAEvyro/L5FBX07KDbFUpMPz\nplmJfecIOHszq31WFD072stCbTUdtrqmkqVsCFA6GvpmdBn6P7u3ya5aQoeypcfT540ImJa3jW1e\nhL7UvW1b7A8C1krJbVTeQUCTm+Cbwz/pC/5QIGTOnUzARquQ18P8BJgsLvXeNI6ukK1eadhOgGbU\nuEbUOA1aHp3ZwdGCnmfKCJUpJ8CwTq9Su4QGpiorvnUXoutNPzH5/YoAy9/P9k3G0KC9oTw/Iwm9\nNdpsZfd9Ak5v52hNcKaBma2z37UodBsV7oHsEAJ8nO0sD+jRoHNWRP1IADq9vehZuCcBwc8qhn6t\nocHhm1U/Np9E9/dyO+toS0BMr+Sp9C9U6JZ2K1xkis61QlpZez8Bz5Zf/mTdSIUjhasD+jTR777p\n/LZKg4CcvUPefM+o0PdPrWa2LLqURVjptCwBFZfgV5E/FY5NeMyHLEfPmt0Z/F6IgJa8+GtOB6kw\nGLi2xHqewPk19rNRMisBQ4x53jWKVLAVbgjcOoHeqJokeJlBA4aM9Z13bNSFcfw/t+y27LHqpcH8\n0aLV/j0UsNORZBksRif78T1RqaMB753ViQrZFBjraix7/QLdU7T8JH8uDda8O6/QE0oBR1ffyzei\n0dkKPTdNPKGBAltPVqgtBSY4pXVsAtFvHZH7Wn6TBmp/GwVOP2xm234afc1cb+EDfxoYuMWWTSyj\nAFXZv3LJIfSUh7eueJ2igUXy7J7YiQlwql8fNLwTXVVr994DZjRwHDBv3lM2AfTjrbp58ujV/TNL\n5XVo4CX8xnz23gS4zlzgjBBCNw1M+cimRIMgI+GBJNcJmAyXrznxm7bgQ2uPPepbTYPoq54O5nsm\nwEOqI1iViu5cKmD/hosGTwraCE7xCZh+e2kPfwf6z+PVCpFfqZA5peyZO0MGT5MNXKRS9OssflOn\nR6hQKnf7p30TGWbGO+vepqCveLIhf3czFZqOT10RSiKDz4Wrobdi0BN3DQWKFVGh/64JT9UFMnwT\nVNrncAl9y0i03uwLKhDvM6LOmZHhfEoPj8ZZ9IbwA8s77jE/n8v0AWkjGQJ3c72PMv9/12cmNVUS\nToWh/cWK97nIwEsqjD67G11/7Wzzi8tUYIuRKzowOg73g1yt9Dajs5Mb0m97U2Fdb7QRZ8k4yMpI\nSYqLoZdnxEcEnKXCbsnffQWx4/C6+iP5Gzf6RV8PJ0cbKtifPOPsdm4cdBxvpLfOUBdcc5e+oYkZ\nFa696piX2T8OzYt2eqWNov/gFlVQ30eFpGntm71y42CdPKUR/AE9v5XOJQ1UqFVLWxvFPg7UPc/Z\nbIrRvR+Uk/lUqDBxcWWG/sAY+E4crldLQd9qH1MzK0cFnporMJc/BotCeSMF76FPbTj9fFiMCgq8\njOas6DGIli8zp19Fz/iqGfRuORUMTS1tTrqMgUTDObFaN3SnkmV2uYup4BRbNblm7xikn5ElPbZG\nVwgh7UqYo0DEgNLlVqkx0FjSm3J+H/rEgXyJ0CkKpEs/ELj+iwT1qTfdD+1Afy4S/ttjnALNZxY9\n1eomgbmRjuomaXS74eMDR3spMJnprjydQwIS8fXXYgF0yZStxfofKLB8tq/ixU0SeES8rB6ep2D+\n81j8cHM1BZS1DA4eO02C3xutwwup6A81es+LFlDg4NWcUUFdEoQ3LTsY04luxZFhyZFBAc/6tcyD\nBKKuVatcq9BXvr+iykikQMzSGxwXv49C8lLfIYMs9I4Y85VdsRR4Y/b1jkr7KGzLVExeF48efUxh\npjyCAp0PbGSo6aNQYTLoPHcD3UT2V3vqFQp8G36XmxA6CiZTt1U++qDzT7bkxDDfi8rt0DezH4X+\nKP2fGfbojfnPb190ooC6y9OPPDAKZ5V/lIf+gx562c/9NHPePPqa72TZqlH41vrqut1O9D37jE0O\nmlMg4IfvrNeXEQg+Z3tASxGdU1BSScuQAvHapBDF5hEQFBJesVIEvaL3C5+sNgVKgg+IDL8cgSev\n6/omOdBTT4i2hu6iAHfBWbHmSyPw3Hgmfs/kxIIrtXgIvbGgAP19+i23f0ZAtCfOclU3+mt4Zz7i\nTIG24SnW5etGINJRS4hWjq6WLhXHH0SBvK8qnjmfh4FzeqipKAW9eE1Ar/p9Cjzk9h0/VDkM5y8G\nhd6MRtcJaxc7mUmBS2KFh2eih2FyiZyuTQB6zfcNNtE1FHDY8qvhnv0wOMS++7XFAd3w1LWnpX0U\n2Ke3S0tt2zD0Sru+Zd+P/uFjP4n2mQKbLIMyejiHwSRruWfHdvRDettlRbipIOhcKxnwcQiqtd5s\nShZH78q5eVpXnArfLvHcEUseAo0GS4ovF7r1OnKq2zZmLrhjvKjUZwgyzecT902RF3wkEhgPDalQ\n/iLS18ZgCGRGHx9b04N+8ve9zfW2zPmrqI3KumoIHrjqrmJUoNOcJz2++lBB+MnGAv22QVg2R24r\nTUV36zPIlbxJhYG6nPhQz0EIvh52M+oO+pd9T2aNmbnlxaTa1UbhQfgppLTX7gK639vvaucLqOAu\nUnZyad4AuD1pZd/miD4vaxqQxJxPNbX1jUwPD8D4Ru+SRQfQr9xNKWkdpwLHqcbNMd/74UjBKr+u\nHeiLOdlZf89R4f0tU+Gu+/3wQb94a4oEevi5I7sVBWlwL6/ru6hmP+i32TD8udGXjeRcs5Cngc3g\nsQHr/j4oPM7x0vjz+ILHmPDWXQVmPlk8VvE4sA82E8l24r3oq0rteTKZ+WF609nkUfE+SPI1XDtV\niR6/sdioj7leFplPha0v74XVnJ+6KtLQ1z0UvsV1hQYhgT5up0/0QlTU7eg7MejJPC4tKrE0OJA0\nfyiNvRcWrd2+3zEQfYNfjaBtOg1Emq6qfXrWA/4p3VyqJ9EzyWvNI6poMPKVe62yfg9Mbb9QyW2C\nvs3cJ/ZtDw1SxSLZvMjd4FgpEdiril5Q1dwzNkkDT70V5Lzr3dB7oEr1lSS60DJeLg4WAj4pnno2\ntKYbEt/U931iQ9dV3SAhxEXAmpZr6p8Su6BkdvOZxL6xBfeyMVKVXkbAXu/ED/MKXdCtGjtr/gb9\n+XUnExURArxXlzvyZnfCF7/fQTyR6B2Z4ad0JQhIKhuYE1XrhGWFjstLTqNzdqddOiRHQLPD3G35\nso+gMPc+wX03+jbW97H2mwmY4xGVV93zEfS0tm2UEUN3lKdneqoSIJe5o1S/qQNsAh8WdM2QML//\nw1cfpE2A2d/WAf6l7MxKF73Gb+PwHQMCrvzwoNn1tcNdlrMdkII+88T4+zMTAtITIi972LVD1q7W\nE9NX0WUbnAVyDxPQq5u+8jK1DRqvqE0mWaNbfI6Qr2bWbVzUd69uubcBufLxBasd6CGi6bs6ThGw\n7RZld/y3VmDj5FrCL4Cep9NkOeZGwAmVxT1pF1tBTN81tpw6ivn+DMP9qy8BN/8WNq2gGvJRxqsK\nXSSa/wbnZQIKA3UWNUS0wME6rRy5eHSDwk1PhUMJmJCyedgl1AIu3M+1+3zQfUf3F8hEESBUf0GZ\n/OADXN/H23TrH/QXS1xbtzHr3l0uD+q+rvsAz8L+/KHRu7beouo9IWB0vUcx16FmKGvsmZjhQOc+\nmsFm/pJ5/+6vKDInmqCbT8c7ZWAE15egZlHHLOb9FU4I73Z7D1/2v2Q/lo9+Ou2Tsvdb4r+6pBGW\nRi6LEriNHte+1DCYWZ/uMjnuciH8HSi0+KytPoveMKdkd7eegPt/WwPoLR9M9dVD/yFt4p/UQsAX\nUkdN3ot6sDmor7ZBHF3B2C36TTcBxkoC0+1v6sD/zquawW/DmG+8IlNrhglI9jMS/1xVC3c7hA5F\nt6LfeJRZ+ZHCrFeqQgyXttVA1oqAYf009MLqD73jUwRY8Vf6bBiuhkaLUZcf19Bp9Mnpme/M+vTw\nr8S9n6qAHLtv7tVx9IubBiK06AQUnNtIfmxVBXzp+z/d2ow+kemns4RZ30c+L2whz1dC+4sLprJz\nQ7i/sFV4tquAAIfOvUWbnlTC/cS03JJa9MLczNQk5u+rwd2V5KVbCbbxvSLm0egyqkY2ntcJENRw\njCoiV4B8HE8A/Rh6RAFZSMeVgHGnL/7sYRXAiFYbDFJAn9W8Wr/UnDl+46847ttUAafFWoJUiUHc\nHyhdG9ivSUDUh2X/RLWUw8xyJcOTV9HrdxUop0oR4MiWoNHlWQ5BXBECd0XRt1aZkX15CNBU2bhe\nXKQcBH5RO6uyBjC/6k890J+igYBj4TLHwjKInzZgHuic9eEmQl00GL+392fasTJQpCTZrxvqX3BX\nQznOkRLm+lLfOTbNWgb5AxyK//igd72vfJvxnAZSs+8ee+0rBf32E1MX+dH/Hbc0aLKa8GKPKoG2\n+rK89Od9mO9af6wzPEcD3xIOw6jO4v++D3Qhs7udIlY0kF4nKSG+thjorwN0edt7cX+2c0v4uDaz\n/2taX9Psi/6rH9HHLd9rv5algR/FskE9tRAWP1ZtOc2GbtJ36utlfmb/xt4JdVMFcCfm7r3YuB5c\nn45xpBxg1sftmbc9zVULQCbsi3XtZvR1wwnHxPqocF4oYy8p8C1kXDKVnqntxnxgpyFIq6CCjO+7\ntR7V+aDpnUmVPo7+dexjbf5LKnzoJU//XpIP9Wf5sw7OdC34sVMeAcGRVPAHjvoI0zwwt3XyuRKB\nXkfl23KIma/WJ0rEr457AyTzBq0safQtzi/HJI8x+1+kde7lYC64GclxDBV2Lvj9T7rMg9n/GUuD\nHetz4deu4Ab+g+gcHn8qa2b/TV5i1U6vIWwHKVKL+hH3F/4Me2Z92LLl9mfTnBwQ2ahj4XQZ/aP3\nyvzD35n1QUx67dD3bEha91jsgQi69vdsp/VDFJD93vDQRTsblEV+jdZndOD6yJ93nItZL4VMH29U\nfZ4FZxYlQp8vusTv/qIH5ykgJSEmulIoC67t4WFGNfTeTxyiSroUKDXqOfn1SiY8vu5utXsDesyQ\nok8FH7P++vwnYGVAYX0XeYYT3bTFtN2scwK+Gb5cZF+eDp082l4pg+0LzlPht4XyeALWP5d6KpHw\nCqYMk9mOvUWvzn58M+DMBBz/9UirPyANeCP4IwWi0S8m1tKWqkzAPQuR7jirVJD9+z2jq99hGCTO\nk6Hp7/hLAZ2l/Sm++uhfgoSTtteSYREP3zLBFS/B2uRPIkLP8NJkb4gkA9iFpDZPJ4NvVGr14Pe2\nBT/jaGdjbUUGnyLWPeEtSRDduvxgdBu6tMWN4kkpMmQIB4wYZDyHdMHzQ/qv0Af2ZIkG0ceB7PJn\n4+oZ1B0adv4RjB6n2uWzMm8cxOvcVlWcSQRSjMHPVzboh+R/t6dcGgcLSdrrQIOn8OtjxnVbdXR+\n0fXKO/eNw63zDiYa65/AKpGVK4SF0Ot4jG+1CI5DbdsgbZb9MahYBibW0VsX/OrPc4R9PzNvWb3m\nP135CA7cH9scUIu+k7i/91vSGLjxvtQbCXwAZ3qNSpSeoP/oK08KcxuDzyWPAo6ox0HwmteGo+fR\ns99PsIurj4GJ++2c9q934bH16u67h9CdS5baZrOPQZlUCNU4685/6wC6XMb2Er33JNj80V+y1uk2\nfBykTM8vRh9J+NMhiTlu3Q5ry0XClMQ/l7OGW3B+jwzydbIhgYR3w9pztWHAeyKf36EQ3eJyasdv\neWYe680Jd9gZArKJ4g9FYtCXe7QqR0+PwhA8+mGRewV0SMHyjS7ojSe+31pfPAqX9vK13DkcANYy\njDcXDdBDDkrQ3waPgrbgUJqf/jnwdTTT3boOfZfunx0CZl4qcBAoPmUP0clFLeM/P+DzLRWX5KFV\nTHeyMtgurQzpE1LH73egZxXWtPSR/5dXWFjM7rQtN41CD61m3Xn+DXqiQrZauQH6iWbNlJXX0KfK\nIm02s6BrdPusyD2IfjF9gB9cmxdceDT7iuk6dPHeB0fFBpoWnCDojE+Twwuet9gy5acRetWM3JGI\nUvSDf58vvF/wRyz2tQo30T/ZtOnlK6B78yRsrTuKHvb3OU3jgu8X6klwUESXLTAe9uRCl10rzMv+\nY2jBK8d5lA76vFtwFjkT38d16McF6wK2jDfg+r4ljKR1D/0nXGtYaoaepVFj0uuAfs9JR4RRWY/5\nUI+12FcFfWvcb4dGZfQTBzTlV7CjN1cX5aQ8qcP7z2YonEwcXHCnz36socvQ5Wrs2Z9qo3OJ7zhw\n8mLtgnd39/T29Q8s+DPDLw/1GDV4fXST1yv90bV9s6hS1ug7WWvDTUXQh565qLI1VuPzGyEth4jc\n/gX3bVEMHlJHj5fL0aozRRf6NdFW8rIK88ef25/sW/BMhSTJRyLorCYJDK0IdCMLO1f/kEqcf+yE\na30V0CeuShRbzlQsuL1PWEJObe+CB2X286g6oAuFsfoy7NEl+u8fXtFejvVlvI+JPBt6EffhpC86\n6L7ZdDn7hJ4FP7xd+EtrVtn/+33sWBM00b+caN2VJYHe0/234f/rbyvF5zsnNv0f5UTfzIcgAAA=\n' p228 sg7 g8 sg9 I54 ssVgist_gray p229 (dp230 g2 S'H4sIABfKe1cC/4XXR4xWZRTG8RnAzazsvS1ZEbuoqHsnEkXGrgQGTEwEZoYZdaxsbDtUVFRUYowx\nxhh6770zvZev90LvRd6DZ5In/wXPgt/imQvD991733Pmjqqd1TSzrnlc7eyGGeNmNr3T+PbUhoap\nzVVTGmbUzp41p7Ghqbaxqr7yyk9VzZp+pa0fVV3xWU3ltC8m1Y8eW135bEVl9ZjP//+Z6Y3NdTOq\n6sfUjHprfHVFdeXln7lmbPXomsoJEydOfObS5dgf1RWN076aXHFvxVVy+OlrLXVQ+7nQ+1stX0K9\nfh70/kbLfKh//wLo/Z2WhVD//UXQ++stv0P9/f6A3t9s+RPq7/8X9P52y99Q/3//QO/vtvwL9f+/\nGHp/nWUJ1M9nKfT+BssyqJ/fcuj9TZYVUD/fldD7WyyroH7+q6H3t1nWQP1+1kLv77Csg/r9rYfe\n32XZAPX73Qi9v8eyCer3vxl6P8+yGer9sQV6/83XIVug3j9b4cj1lq1Q769t0Pv534Zsg3r/bYcj\n11u2Q70/d0Dvv/8uZAfU+3cnHLneshPq/b0Ler/gh5BdUO//3XDkestuqM/HHuj9Tz+G7IH6/OyF\nI9db9kJ9vvZB7xf+HLIP6vO3H45cb9kP9fk8AL3/9ZeQA1Cf34Nw5HrLQajP9yHo/aLfQg5Bff5b\noPfPWVqgvh9aoPetLRao749W6P3zllao75dW6H1bqwXq+6cNej/J0gb1/dQGvW9vs0B9f7VD71+w\ntEN9v7VD7zvaLVDffx3Q+8mWDqjvxw7ofWeHBer7sxN6X2PphPp+7YTed3VaoL5/u6D3L1q6oL6f\nu6D33V0WqO/vbuj9S5ZuqO/3buh9T7cF6vu/B3r/sqUH6vnQA73v7bFAPT96ofevWHqhni+90Pu+\nXgvU86cPev+qpQ/q+dQHve/vs0A9v/qh969Z+qGeb/3Q+4F+C9TzbwB6/7plAOr5OAC9HxywQD0/\nB6H3b1gGoZ6vg9D7oUEL1PN3CHr/pmUI6vk8BL0fHrJAPb+HofdTLMNQz/dh6H1k2AL1/I9A7++z\nRKDOBxHofZ0lAnV+iEDvlywOiUCdLyLQ+yOHQyJQ548o9P5+SxTqfBKF3tdbolDnlyj0fumSkCjU\n+SYKvT96JCQKdf6JQe8fsMSgzkcx6H2DJQZ1fopB75ctDYlBna9i0PtjR0NiUOevOPT+QUsc6nwW\nh97PscShzm9x6P3yZSFxqPNdHHp//FhIHOr8l4DeP2RJQJ0PE9D7RksC6vyYgN6vWB6SgDpfJqD3\nJ46HJKDOn0no/cOWJNT5NAm9b7Ikoc6vSej9yhUhSajzbRJ6f/JESBLq/JuC3j9iSUGdj1PQ+3ct\nKajzcwp6v2plSArqfJ2C3p86GZKCOn+nofePWtJQ5/M09P49Sxrq/J6G3q9eFZKGOt+nofenT4Wk\noc7/Gej9eEsG6n6Qgd6/b8lA3R8y0Ps1q0MyUPeLDPT+zOmQDNT9Iwu9f8yShbqfZKH3zZYs1P0l\nC71fuyYkC3W/yULvz54JyULdf3LQ+8ctOaj7UQ56/4ElB3V/ykHv160NyUHdr3LQ+3NnQ3JQ9688\n9P4JSx7qfpaH3n9oyUPd3/LQ+/XrQvJQ97s89P78uZA81P2vAL2fYClA3Q8L0PuPLAWo+2MBer9h\nfUgB6n5ZgN5fOB9SgLp/FqH3T1qKUPfTIvT+Y0sR6v5ahN5v3BBShLrfFqH3Fy+EFKHuvyXo/VOW\nEtT9uAS9/8RSgro/l6D3mzaGlKDu1yXo/aWLISWo+3cZen8lZaj7eRl6/6mlDHV/L0PvN28KKUPd\n78vQ+6vZOG3cf5NPCDiHIAAA\n' p231 sg7 g8 sg9 I75 ssVBlues p232 (dp233 g2 S'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\n' p234 sg7 g8 sg9 I57 ssVPuBuGn p235 (dp236 g2 S'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\n' p237 sg7 g8 sg9 I77 ssVnipy_spectral p238 (dp239 g2 S'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\n' p240 sg7 g8 sg9 I37 ssVafmhot p241 (dp242 g2 S'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\nwOjezPm6F/08LflfOBIdFIcgAAA=\n' p243 sg7 g8 sg9 I8 ssVbone p244 (dp245 g2 S'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\n' p246 sg7 g8 sg9 I80 sssg7 S'dict' p247 sg9 I0 s.mayavi-4.5.0/mayavi/core/lut/rainbow.gif0000644000076500000240000000327112747716314020603 0ustar prabhustaff00000000000000GIF89aP$  ###&&&''')))---222333444666777999:::;;;===>>>???AAACCCEEEJJJNNNPPPQQQRRRSSSUUUVVVWWW[[[]]]^^^___```eeefffkkkmmmnnntttuuuvvvwwwyyy}}} #-7@ J%S*]/f4o8x=BGLPUZ^cgy~lpu{nu[7h#b-;f5o/xOJU@HSB]n{t("  "(/5;HO[TAah쎩߂!,P$t2d̜ #fL7kؼ#'ΜN+m巘no|*kᯈ..m䵔^n绠nZwŻVn^sInɗ]iuZqᵖ\y5^mѵ[uv pܡFx!Gl̡GtF|aG jǍrzMn׍v1`6;h@"-bAXVj8e} ~H~#8$Θ#߄(8 - I_uנ7'< x!A·`2djɨ_0Vi杈*%}: erJWLv某J9'ez.ڤoTiIj&> &hTkfv+K*l T.-+" r1LP@Jtpdr#(T+I 1[H3#~02KC cpL+L,#`1,p.0pL=s,![0BPR.# $C<}D`C!tLP0>h0 Uʙ/o bI>X{-, o7$貰]\@,}.O#6 Dέ&"0hp1s#7n?]Lq/o 1@8*z#5T '\| *\Cɧ/;mayavi-4.5.0/mayavi/core/lut/rdbu.gif0000644000076500000240000000315312747716314020075 0ustar prabhustaff00000000000000GIF89aP$ ###---///333777;;;===>>>???nx!2d 9n @wAAABBBDDDJJJPPPRRRWWW```mmmoooqqqssswwwxxx" $ &'(*-'2069:B?KCTG]KeQnWv_ekryFMSZa"g&m*r.x3~7;?EOYclwԅĩʲѺ׊ړݛ!,P$5lh2fШa:v BФQM7 B(MDy鑣F)S9q༩Be(P8id$H)Bd4P!C%RQ#G E4R%K0eҴS'O@5T)SPN+m巘no|*kᯈ..m䵔^n绠nZwŻVn^sInɗ]iuZqᵖ\y5^mѵ[uv pܡFx!Gl̡GtF|aG jǍrzMn׍v1`6;h@"-bAXVj8e} ~H~#8$Θ#߄(8 - I_uנ7'< x!A·`2djɨM4'RIhGb6囀F!eyhZ'N Q)*F^f2%PP< fNZg\yZ)v+k覫& %Z@) >P%qA ޛ/$GytjY pK Q&Ks+ VyHR (Y`ɥ@|- +(S=A!gDF)%t2~l F\WG2+PJ ,83~Kb6o k,I (1@ %w;w@̥PbX}ꬷ.;mayavi-4.5.0/mayavi/core/lut/rdgy.gif0000644000076500000240000000340212747716314020103 0ustar prabhustaff00000000000000GIF89aP$ ###$$$***+++...///111444555777999;;;===>>>lu!"@@@BBBCCCDDDFFFJJJPPPQQQRRRVVVWWWXXX___```aaaeeefffiiikkkmmmnnnoooqqquuuwwwxxx{{{|||~~~ $ %'(*,%1.579@=IBRFZJcOlUt]}cipw}§ȯϸ!,P$=| B)b$J0i (RԱsO=5rhPHҥI24H?sؤ13 ,VaF )La„4P!C%RQ#G E4R)P0M)9oب7M*酧E kFj᫈.l䱔U \M?q?'CQlᬊ6 YgR$ oAhʑs9}7voM{E|QvJ`Bq |]AU([v]Q֛df!Gr' U^E7_/Gv#vf1&tNAufb$kveʼnz]:_,R705nޜ-"lya3ɡ)"q?yW{ﭸdʤin%aV qp)(-8W䘏y*Bice 㦈ihF[nH%riDZ.p r\[v:^ַ*hMvFKR&d*(ƑN&*<@-DmH' &L3&4ЂKwl.L]*]4@"o0(^]t~:gXT!.Xs6ȭt>>???LjPkUmZn_odqhrmsrtwv|wBBBDDDJJJPPPRRRWWW```mmmoooqqquuuwwwxxxxxyz{{|}} !&+05;@EJOTY^djpu{¿!,P$9edR%J-R!C 9ry 5jҠ9c& 'N0Y$ #F"$>zء#6jИ!#!@|Ё 4P!C%Rq#G E4R%K0eҴS'O@5T)SPb*x0†#Nx1ƎC,y2ʖ/cάy3Ξ?-z4ҦO[/V[ {Ev1Yg#2\s;7^~J뛯2.䵕b绡8`,䴓Z~Y.纟ƴR%(^1y污]mQ|[_VuZqǚvs7n][ar p jEk97zuɧ׈ 6܉ɖ^tWn$8 ]j=NcyA aF衍'kT!Eء]pIN>_ɑ /Y 4Ɨo5~Iw8$ΨP];BޘYx$(~ih($X٧7T #(P"BqڟvZĪWI㬴 wȃtxhhu~W} س؆ZzCkB:Lb"ETnxoj-Jz;x%I~ 7G,Wlg? Ú(pbDIp$ \&d1.}x0 WT|0,yTpBgy, Rxx8B D 䑇Wí@p 0\'|XMs BF]xB^Նc ,xayA^ yt0(N#%u G$>ơ3,F_[<}>>???AAABBBDDDJJJNNNOOOPPPRRRWWW[[[\\\```gggmmmoooqqqsssuuuwwwxxx& &&&'"'('-'5)<,D/K3S7Z:b>jArEyHLPSW[^diou{294A6I9Q;Y>`AhCpGwMSX_djov}ԅπև܌؋ڑݘ!,P$e̠Q 9t A !R$I,aI={P A8uXH E!:d!0_tEK,WT2EJ(O4P!C%RQ#G E4R%K0eҴS'O@5T)SPN+m巘no|*kᯈ..m䵔^n绠nZwŻVn^sInɗ]iuZqᵖ\y5^mѵ[uv pܡFx!Gl̡GtF|aG jǍrzMn׍v1`6;h@"-bAXVj8e} ~H~#8$Θ#߄(8 - I_uנ7'< x!A·`2djɨ_0Vi杈*ɒ\Q9'ez.ڤoTiIj&> fNZgKhzB˵fv+kB d; PK-0+pJ+h; j\TR,J&-@0>kpp-@Pб*TF. @+ת@-dp-%>\עBB<#xr.#FЬ/Ƴ2 &|B@ ׮Oo[5ep_Q&wLG.'Q5k&@&`7#_ C نvz_-זAB., c \,Q# P*:bGYnx_[36t.+PA,o觯o;mayavi-4.5.0/mayavi/core/lut/rdylgn.gif0000644000076500000240000000327212747716314020442 0ustar prabhustaff00000000000000GIF89aP$  ###$$$&&&'''***+++...///444555777999;;;>>>k8q;w? }BBBBDDDJJJNNNOOOPPPRRRVVVWWWXXX[[[\\\```gggkkkoooqqquuuvvvwwwxxx{{{& &&&'!'''-'4)<,C/K3R6Z9a=iAqDyHEHKNQ(S1U:XDZM\W_`ajcqdyeLOSW[^chmegghikoswrx|{Ղۇ!,P$w B)b$J00aČ! H,]¤PDiSJ&I 5jҠ9c-Y\R)QN+m巘no|*kᯈ..m䵔^n绠nZwŻVn^sInɗ]iuZqᵖ\y5^mѵ[uv pܡFx!Gl̡GtF|aG jǍrzMn׍v1`6;h@"-bAXVj8e} ~H~#8$Θ#߄(8 - I_uנ7'< x!A·`2djɨ_0Vi$i&',e~>sZX(]'RJW筫(a9Vgi`F̵fv+k>0@ d `m  +(K.|  }\{- K#-` _)µz<\Xd+pʏ\\; ucJRת  |lq#p urB@ Ґõ4|m,0}zp-,qsTK,L@1-btpR/1ڮML;r4C lC}/@,m9p9*v&}mϭ/1s,0,P |N" B< ĮЧ/;mayavi-4.5.0/mayavi/core/lut/README.txt0000644000076500000240000000141312747716313020144 0ustar prabhustaff00000000000000This directory contains lookup tables imported from pylab automaticaly by "cm2lut" script. Do not modify manually These colormaps are borrowed from matplotlib. See matplotlib license for license agreement (http://matplotlib.sourceforge.net/license.html) 34 of the colormaps are based on color specifications and designs developed by Cynthia Brewer (http://colorbrewer.org). The ColorBrewer palettes have been included under the terms of an Apache-stype license (for details, see the file LICENSE_COLORBREWER in the base directory of mayavi source). 7 palettes are from the Yorick scientific visalisation package, an evolution of the GIST package, both by David H. Munro. They are released under a BSD-like license (see LICENSE_YORICK in the base directory of mayavi source). mayavi-4.5.0/mayavi/core/lut/reds.gif0000644000076500000240000000324612747716314020101 0ustar prabhustaff00000000000000GIF89aP$ """###'''+++///000555666:::;;;>>>j pv|AAABBBDDDJJJPPPRRRSSSTTTWWWYYY```hhhiiioooqqqvvvwwwxxx    "!'#*%-&1'4)7*<,@/E2J5N8S:X=\AaDfGkKoOsSwW{[_cgkosx}ìƱʶκѿ!,P$UBM4adR!BO>{#& /^p٢% +VP"% 'N0Y$ #F$>zء#6jИ!デ:ea FXbƍ?Ydʕ-_Ɯ&"DthѣI6}!@^eD1jH&Qd&nsIW(QH2u UAVފⰎF>KY%moj绡qM+cJF[y-D ]3^{K=j*x,d¼m;T䕗j5Z{_ueoy\&y˵s7]ma\Dp~ Ǘ_RyǜkA'|ԩuu#o7TrlIG|N8!}CwG\A/(K"xPXnVv\CTdj1f6zduf:ck _.饜ء %%g>&)RG8L&#H(N_\^grؤ9Z6%?u!4)I)|b'حwbg'b*k{^ĵhنY'v nю+)b{i=lZ"l' 7G,`#x0)LA )h 2 1-j<ò ,'$A ) ! !ЂtBrL@I#PB״<@5-m + /-rH-6A %wH-e I kr<0{l0@( ܈pӲHǐxM W崠( +'"tlPRAt, -tP@^ m<@+# w/;mayavi-4.5.0/mayavi/core/lut/seismic.gif0000644000076500000240000000325012747716314020573 0ustar prabhustaff00000000000000GIF89aP$ !!!"""###$$$'''+++///000333444555666:::;;;PYbkt|AAABBBPPPSSSTTTYYYaaaggghhhiiimmmooopppsssvvvwww{{{~~~ --99FFSS__llyy**77CCPP]]iivv!,P$;x"*U\E.]|F2e̜AF͚@*ӧU^I?~"% 'N0Y$ #F"$>zء#64P!C%RQ#G E4R%K0eҴS'O@5T)SPN+m巘no|*kᯈ..m䵔^n绠nZwŻVn^sInɗ]iuZqᵖ\y5^mѵ[uv pܡFx!Gl̡GtF|aG jǍrzMn׍v1`6;h@"-bAXVj8e} ~H~#8$Θ#߄(8 - I_uנ7'< x!A·`2djɨ_0Vi杈*%}: erJWLv某J9'ez.ڤoTiIj&> &hTkfv+knX@".A.*k/-*bA(r"܂o +1$"!A+bwPp#\bJxlq( O" p )o)+{ vl;q*3D>T_LGcQr]kY{gJc[d[hjmy^_KOPMIYWVEpBzfhnqGe Đ,͡-ֱ./!&0+120=yq[}o`eNoO\STfquy}><:8@Í͋ֈ鄸!,P$UaG._pif7G(!"dH HRF̘0dvc 10iɔ*Vlђ )Qxт>~1sMB ;r4P!C%RQ#G E4R%K0eҴS'O@5T)SPN+m巘no|*kᯈ..m䵔^n绠nZwŻVn^sInɗ]iuZqᵖ\y5^mѵ[uOa iqqెy1mбR`vnwp߭vx-wlϭwtvhh߂!޸&`+Y`ov8} #cRߋDҗ5 :7a?!!58bI^8&U 6`;G@1whzndoXh和'Q(z&Y*h~~ esjX&(}z$FAHjH&&]:h-;((v+k覫쮛H #I(r 8Rp"/  t$!8< $p$+A}h$ 1 pko \jdp(y&p54 &up0`LKGR@0rt7G@ 08@@-5 3P@@p } Wng;mayavi-4.5.0/mayavi/core/lut/set2.gif0000644000076500000240000000316012747716314020014 0ustar prabhustaff00000000000000GIF89aP$ !!!***+++///000222333777888999:::;;;@@@AAABBBEEEGGGHHHKKKLLLMMMQQQSSSTTTVVVYYYiiiqqqtttvvvzzz{{{|||~~~=69301:}{ɞw֙rݑ~dklfuMJUQ]gqGC@CL^Tofw{nӓʕ´ɬϥӾؿ՞ڗߑƹ˻ϼ¸ǁʼnđ•ǑʙɡɩȰǸЏ׍ߋȑ!,P$TN+Io1\3{X+ᮇ=lMYj8okn湜~+Z;pމmQ|Fw¡q!yT{_uїou7\j%F^rmI[|V ]qEyɦ|6v٨_x3 X{  "߈")V8V c y߉ e!Fb7$(eH.d~$~e<"Ty`3*e~~bsR↗"|.H}*VJX%U$)itjiY#]-kBZf4.eFv#p6+Aygk覫 K+kf ;p  |҂ 'J 'q#" %$'elP+bB[JmJ*KI4'.+X@R B@ۆm(,, +[`4(K,K)&XJdEP /c5@ע$ '`q'4G)-,KgX 4'#4pq,d.K .n#;mayavi-4.5.0/mayavi/core/lut/set3.gif0000644000076500000240000000314412747716314020017 0ustar prabhustaff00000000000000GIF89aP$ ***+++000777999:::<<<@@@AAABBBEEEGGGHHHIIIKKKLLLMMMSSSTTTVVVYYY^^^___bbbiiioootttvvvzzz{{{~~~wyccbqgjxdfgvߊΑ撓ٳȲޚ֢ͩى֚ԫҼ򹿌ɅͿØǤĹŲ˰ϼϖĦ!,P$ 8q丱P";{|E X$A҄N'RtƍN+m巘no|*kᯈ..m䵔^n绠nZwŻVn^sInɗ]iuZqᵖ\y5^mѵ[uv pܡFx!Gl̡GtF|aG jǍrzMn׍v1`6;h@"-bAXVj8e} ~H~#8$Θ#߄(8 - I_uנ7'< x!A·`2djɨ_0Vi杈*%}: erJWLv某J9'ez.ڤoTiIj&+Tkfv+K" p ,A8b" 08B "0J-T  b*0^AXUB KQ )$-,B?QB@-K -l ,E <5; (Ւ"@,O j0DCC]HD ՂReLD2L2L-A̪ wΓXQ%՞P pΏn騧ꬷ:;mayavi-4.5.0/mayavi/core/lut/spectral.gif0000644000076500000240000000331712747716314020760 0ustar prabhustaff00000000000000GIF89aP$ 18 !!!"""###$$$'''+++---...///000222333444555666777888:::>>>???NZk{AAABBBCCCEEEJJJNNNOOOPPPSSSTTTVVVWWWYYY]]]```aaadddfffggghhhiiimmmppptttvvvxxx}}}~~~:`EExx5JxWx /Py}r-Jhz݁܂̪!,P$X`DGϞ@*dP$I&AzEԤ-\|F2e̜Af:v6lT2EJ(O0Yĉ+4P!C%RQ#G E4R%K0eҴS'O@5T)SPN+m巘no|*kᯈ..m䵔^n绠nZwŻVn^sInɗ]iuZqᵖ\y5^mѵ[uv pܡFx!Gl̡GtF|aG jǍrzMn׍v1`6;h@"-bAXVj8e} ~H~#8$Θ#߄(8 - I_uנ7'< x!A·`2djɨ_0Vi杈*%}: erJWLv某J9'ez.ڤoTiIj&> &hTkfv+kP,զm,.5A<@%؀ KT[JAM T ' Pn)2&aq1L.`R'- /R>`C. 6PP.P-4`S 6Pc `/faH T (3XB* ,0`,XD1Ƞ6ݭ.`K ԶtRCĂMDT (`ALk`K/!p l02 ls$3d4ŔP7ۯkL 4 7lK [>+/(B(@,>b5w[u ;mayavi-4.5.0/mayavi/core/lut/spring.gif0000644000076500000240000000324212747716314020442 0ustar prabhustaff00000000000000GIF89aP$  """###&&&'''+++---...///222333555666888999:::;;;<<GADJMWQTZ]g`djmwspz}v|yspflic`V]YSPFMJC@7:=40'*-$! !,P$ (>zɃ;t#獛5mبIc͙2dŒ /]h%*RL'L Q䈑!E# &+leкx= VXe'634z{R㨕wBvVEW|F_vwvWi~f tMw|ff\QǗ@U1l{6v4a\UQG2@#WyX41dOs %-܌u(9q]r|)Oy 8u%n&uWN9UޚY%>X_הM>s& jY(yjy$ \Y1bƱP:EEP`$&f0"&'ؐ Yz˛[;)h-iF+njZ^~x LNڦ0ݾƭgj£*8L|-]tqq?*4l8<@-DmH'tϬ@H3CB%S+XX̎T BTΈHI$p25- XЀB߁7 $@"+P#s2 +`'0 &% z!#̌ J;RB}S"/ %B, 8L:_‰+d`$̌ǻ_2H4GBy,Hpb )>>???AAABBBCCCEEEJJJNNNSSSTTTVVVWWWYYY]]]```fffiiitttvvv}}}^U`YfXn[v_hapibxrgmi l-n9qFsSv_xl{y~zfilptwǷz~/9+A'J"RZcks |À ±ȸ怒肟녫ǁЄ؈!,P$LR,YCf /]l B)b=|3P!D%:dHP @QzrJ^k`)$HHf枌:%JJev[٧P)ReڪME^(+k覫.`0Ƌo)v/&*`@ BIfX@e\K%K%!Axo4@G)1P@ d"#ClL ޢB+ o%GJ&L4$9WTR8AP"f{ pB [ӽZ(LwʁA) s}҉vhӍF +*wX@Pz)&4t{;mayavi-4.5.0/mayavi/core/lut/vega10.gif0000644000076500000240000000303612747716314020224 0ustar prabhustaff00000000000000GIF89aP$  $$$%%%&&&(((+++///000111222444666777:::<<<>>>???@@@AAABBBCCCDDDEEEFFFJJJLLLNNNRRRSSSTTTUUUVVVWWWYYY___```aaabbbeeefffiiikkknnnqqqtttuuuvvvxxxzzz}}}'(4FVKd};+,,'"dwXx`gxwπ!,P$8J>>???@@@AAABBBCCCDDDEEEFFFJJJLLLNNNQQQRRRSSSTTTUUUVVVWWWYYY___```bbbeeefffiiinnnqqqtttuuuvvvxxxzzz|||}}}'(3.VKWL,,0/"#mqxwghw|5.{߀Ĝʔ݇ߊهۍƻŰҲ۞!,P$c +PfѢ˔T-ĉC!¥#HE)PB"i$If4i2S'GVdԨ0@T*p A2tQ"EN0jH&Q%̙4mYOaXP6|8%E/fؑǐ#>>???cy99;y@@@AAABBBCCCDDDEEEFFFJJJLLLNNNPPPQQQRRRSSSTTTUUUVVVWWWYYY[[[___{AsBv```bbbeeefffiiinnnqqqtttuuuvvvxxxzzz|||}}}<9?=m1o1IJKMakbkk>9RSkʧAR[kCERTWYknnqХQ~m疜ƈۜ˔ݝޞ!,P$eL6TZx'C0b"ACͤhc3 PI,\Rv˗H0 čM7pr±t@ "d%VQAI$*YI&͛8u9 Vj0/Nʸc!GR*y2%^ƜM;{^Тk&}T.]vN.w%l&ⱋ MkҸMF[/=,V1che-\B+^X0ӾU;f5esgn麭ΉjᭋFxmK{nӽp 'qշfuhQGu6{7qL's9x^{]|}7fyv 6\e Wh"v=ȝG}4g~Udw&!aXf1y7߉kZcm36H'iI!z:"B)#UUKc]見a֧钝:Xm%}hWY靈)-)SBjIk&6F+Vk,7 PJ JKL RS @2Ѯ+Q,$ KTPA G 2 /@/2tA4)7 >2@.ML Cí .K4L."I|Q,. Dr/2b1UDQ" K+KG!T2u,1r.opz02rr䶍'ܸp'c^u s#3$+  iSLv :24<lp/#Tql#'?M6qb@#  Ȉt,0d r +A2|HЁrˋ@H` 4PW~`o}:Ad  |V$ &+(L W;mayavi-4.5.0/mayavi/core/lut/vega20c.gif0000644000076500000240000000352012747716314020366 0ustar prabhustaff00000000000000GIF89aP$  !!!$$$%%%&&&(((***+++///000111222333444666777888:::;;;<<<>>>???@@@AAABBBCCCDDDEEEFFFJJJLLLNNNQQQRRRSSSTTTUUUVVVWWWYYY___```aaabbbccceeefffggghhhiiimmmnnnpppqqqtttuuuvvvxxxzzz|||}}}~~~U X1T2Tnstvyz<=hkukyo1:knրٛٝѽɗ͝ТȟȻۼܞ!,P$C`J-SVHEG =[dd#0(DZ)i$Jd͚UJHn$"R C J :( E_0j1 HHD F%˗0eBHΝz jhQ2.lJĉ/fHժ#K:re0cάySN> XJsmTԾWo-5ؚ6>&ZWm)P]yz/ଂ w58b6Srl"\vgݟ>zxic]SUF?vuι\xlŖzY]L|f_pieO (e!hW]n'~gbSk=t߈}W\%Zy@F ӹ͇'(4`ZilIzh]|$^# ymH#uK^`Gީ^)V3f 6I՘vw@ӐN%5W(vNBybYo*PS\Z<؝拑9JU"6H%֨f(iڶahyzZejWF*zZhޣ( jT".|lA,l'0iJ," *B#®,Ǹ0Rx 3Q i|0 q{ :oC-AwXoP*s(|d@,/ 6* FB%P4Ì %@c249{ . 'ߡMO m+@PsFРrG(t }18~BB:D ăm0 *, @r9u0z4xDo{Oe\lXsTJkWd]aQh;%*50 EJ@E5D9B=?D>G=K;O:R8U6Y3_5\/i.l,o2b1f+q*t'{&~)xA@%$#"! !"%!,P$1dаC@1")gTrK-\ 1c̐)æ7pIf9tرC5|=tIԐ.ѨElbGfufh@^YW-ZhdywEs~8m|e6tBj1&9` )ZjIVvv6:ԑ(%f*^nkֺdCk;#A8FF-I# 7؀Z!vх{rے0ɑo̮HhRzڥӆe<KK離G$F7o+Z)(,)b 4l8>>???CCCEEEJJJNNNPPPVVVWWWYYY^^^```cccfffhhhmmmtttuuuwwwxxxyyy}}}  $).37|?AJJJNNNOOOPPPVVVXXX[[[\\\```gggkkkuuuvvv{{{ B$D'F*I-K/N2P6S9V[C]H`McSfYi^kcniqnttwzz|~΀Ђ҄Ն׈يیݎߑᓼ!,P$5I鑣F 菟>|ɃΝ:tȉ獛6l֨I挔(P8id$H)BDM >|ృ(N(Ab >xa "T!D/b#H$MT%L4m C'ϟ@O jRM,x0†#NhNƍ?Ydʕ-_ƜIfn}@ТG. ԿVgxbB6;9mwd"红:--oX oⰎF>K&n{Z  `9:-qYh+Ƭnй/\kͽX{u qpzwqeeGz}u`tGe otu_Wj}8VQgua B_jȝWVh tc=cmD 1_nBx\B_6cPtTZ[+hd~xHfczNzR%gos!wlZ枠eO)!ihZ4Ħʉp_*f!OU^]~zx>5*R n)+6zEʫN9!(I(n }zmjYLK*lc:51(w ,$l(,@!t,@C%-(0eP!0E_PBF |*&L04ͣ`"!2!`` A!`H(dTr"X |wǔ!s +LR#ߔB\',rL>J] \sNzlyS,%AN;ն^3\X ^/Wog-;mayavi-4.5.0/mayavi/core/lut/ylgnbu.gif0000644000076500000240000000325412747716314020443 0ustar prabhustaff00000000000000GIF89aP$  $$$&&&'''***+++---...///333444555777999;;;===??? Z `"f$l&r)x+~AAAJJJNNNOOOPPPVVVXXX[[[\\\```gggkkkmmmsssuuuvvv{{{- /"2%5$9$=$A$E#J#N#R"V"Z"_x}!d!i n sb¿hľoƽtȼz˻!$(+/26:=CJPU\ͺкӹոظ۷޶ᶺ!,P$arՊժL.YDiH9jhD*Dh+VPb 1b€ -Z`%O4a#E =xH℉$4P!C%RQ#G E4R%K0eҴS'O@5T)SPN+m巘no|*kᯈ..m䵔^n绠nZwŻVn^sInɗ]iuZqᵖ\y5^mѵ[uv pܡFx!Gl̡GtF|aG jǍrzMn׍v1`6;h@"-bAXVj8e} ~H~#8$Θ#߄(8 - I_uנ7'< x!A·`2djɨ_0Vi杈*%}: erJWLv某J9'ez.ڤoTiIj&> &hTkfv+䖻m\ `` l '.Qm nr@P,/ -_ A|KZ C(F2̽c lBܜ1.GGڞRp K" ؼ3$& բugĢX2 $0\\&T_-n,X{,ܰ)jCڢ^GLv zKK\[ 6֮'T;y՞"W{rhB"wz"AԱ9:F7$Au/o[;mayavi-4.5.0/mayavi/core/lut/ylorbr.gif0000644000076500000240000000321612747716314020452 0ustar prabhustaff00000000000000GIF89aP$ """###'''+++---...///222444777888===???i%n's(x*}+AAACCCDDDGGGJJJLLLNNNOOO[[[\\\]]]aaagggjjjmmmsssuuu{{{}}}-.01357:<>ACEHJMQTX[ _ c fjmquy}!#%'+/27:>AEIMRY`flszۀއ!,P$US'N4)J萡B 菟>kԤAsL2cĄK.[drJ*SDI&K$ArH"CG;tAb 4P!C%RQ#G E4R%K0eҴS'O@5T)SPN+m巘no|*kᯈ..m䵔^n绠nZwŻVn^sInɗ]iuZqᵖ\y5^mѵ[uv pܡFx!Gl̡GtF|aG jǍrzM,^7ox!_&+&|v(#~ xcȣiEڷ 5a:X>څCYҨ߃$)ƉaC ^d|߄(8SnX$!({hNb6?Y'wz8c~zen:.X&fzI9V ^dfžjhgJ'_lR"k覫+5d@. .@bxp2R.+<@̫<|(@@8 r ,lz0pJ-Q ŗ0 !md@ʵ+7|,0G/&kG (#;2Ԏ m( 0C|L II{mr )KnN I, &ء%L`m0\K r\?^Ţh,, +1">od+nD )xNp>>???BBBCCCDDDGGGJJJLLLNNNOOOPPPRRRWWW[[[\\\]]]```aaagggjjjmmmoooqqquuuwwwxxx{{{}}}&&&&&&&&&&%!&#$" ! + 0!5#:$@&E'J(P*V,\.b/h1n3u5{78:<>?ACDFGIJMQVZ^bfjnsw{߃!,P$[iL.YDiH٩Cg8p޸if4h̘)Cf0`xe,XXBe(P$ArH"C4ad @~c84P!C%RQ#G ό,y2ʖ/cάy3Ξ?-z4ҦO,x0†#Nx1Ǝш%iJ.aʤiN> %jRNJ[/V[ {EvlcNfkmf~+z/UWk%0XŮ>F+ymennhSZu0W_/&ld^yng𢡊6{]7v jƉ\y5^mѵ[u]iuZqƘrzInFx!7"̡GtF|aGpɈ_"[X)!='R,f($} z8c~޸(y E`6*;@"-bh!^f(aBRjHMD`)Uy$e~>s*띈j禍&%JJeF VbD0v+k覫;ޖ)tkH.2 ˷ Ҁ:R,r[-BK)-. "  Gx{Atp p 葀LĄx-! R 30$ ,Lt5 @pJJ[=@400(b "t45R*D`0(~ rf@ 2# {]yy"J r ^ , P:뮣]/d0@/w00w/n@;mayavi-4.5.0/mayavi/core/lut_manager.py0000644000076500000240000004156312747716314020525 0ustar prabhustaff00000000000000"""This manages the lookup table used to map values to colors. """ # Author: Prabhu Ramachandran # Copyright (c) 2005-2016, Enthought, Inc. # License: BSD Style. import os.path import sys import subprocess import warnings # Enthought library imports. from traits.api import Instance, Range, Bool, Array, \ Str, Property, Enum, Button from traitsui.api import FileEditor, auto_close_message from apptools.persistence import state_pickler from tvtk.api import tvtk # Local imports. from mayavi.core.base import Base from mayavi.core.common import error from mayavi.core import lut # The directory that contains the pickled files for colormap lut_image_dir = os.path.dirname(lut.__file__) pylab_luts_file = os.path.join(lut_image_dir, 'pylab_luts.pkl') try: pylab_luts = state_pickler.load_state(pylab_luts_file) except (IOError, ValueError) as exception: # IOError: failed to open file # ValueError: pickled file is built from an OS w/ different # architecture, or with an incompatible protocol message = ("Failed to load pylab colormaps from file:\n" "{filepath}\n" "Last error: {err_type} {err_message}\n" "Some colormaps will not be available. " "You may rebuild this file using the script provided " "in the mayavi source code: scripts/cm2lut.py") warnings.warn(message.format(filepath=pylab_luts_file, err_type=type(exception).__name__, err_message=str(exception))) pylab_luts = {} ################################################################# # Utility functions. ################################################################# def set_lut(vtk_lut, lut_lst): """Setup the tvtk.LookupTable (`vtk_lut`) using the passed list of lut values.""" n_col = len(lut_lst) vtk_lut.number_of_colors = n_col vtk_lut.build() for i in range(0, n_col): lt = lut_lst[i] vtk_lut.set_table_value(i, lt[0], lt[1], lt[2], lt[3]) return vtk_lut def check_lut_first_line(line, file_name=''): """Check the line to see if this is a valid LUT file.""" first = line.split() if first[0] != "LOOKUP_TABLE": errmsg = "Error: The input data file \"%s\"\n"%(file_name) errmsg = errmsg+ "is not a proper lookup table file."\ " No LOOKUP_TABLE tag in first line. Try again." raise IOError(errmsg) try: n_color = first[2] except: raise IOError("Error: No size for LookupTable specified.") else: return n_color def parse_lut_file(file_name): """Parse the file specified by its name `file_name` for a LUT and return the list of parsed values.""" input = open(file_name, "r") line = input.readline() n_color = check_lut_first_line(line, file_name) lut = [] for line in input.readlines(): entr = line.split() if len(entr) != 4: errmsg="Error: insufficient or too much data in line "\ "-- \"%s\""%(entr) raise IOError(errmsg) tmp = [] for color in entr: try: tmp.append(float(color)) except: raise IOError( "Unknown entry '%s'in lookup table input."%color ) lut.append(tmp) return lut def lut_mode_list(): """ Function to generate the list of acceptable lut_mode values. """ lut_mode_list = ( ['blue-red', 'black-white', 'file', ] + list(pylab_luts.keys()) ) lut_mode_list.sort() return lut_mode_list ###################################################################### # `LUTManager` class. ###################################################################### class LUTManager(Base): # The version of this class. Used for persistence. __version__ = 0 # The lookup table. lut = Instance(tvtk.LookupTable, (), record=False) # The scalar bar. scalar_bar = Instance(tvtk.ScalarBarActor, (), record=True) # The scalar_bar_widget scalar_bar_widget = Instance(tvtk.ScalarBarWidget, ()) # The representation associated with the scalar_bar_widget. This # only exists in VTK versions about around 5.2. scalar_bar_representation = Instance(tvtk.Object, allow_none=True, record=True) # The title text property of the axes. title_text_property = Property(record=True) # The label text property of the axes. label_text_property = Property(record=True) # The current mode of the LUT. lut_mode = Enum('blue-red', lut_mode_list(), desc='the type of the lookup table') # File name of the LUT file to use. file_name = Str('', editor=FileEditor, desc='the filename containing the LUT') # Reverse the colors of the LUT. reverse_lut = Bool(False, desc='if the lut is to be reversed') # Turn on/off the visibility of the scalar bar. show_scalar_bar = Bool(False, desc='if scalar bar is shown or not') # This is an alias for show_scalar_bar. show_legend = Property(Bool, desc='if legend is shown or not') # The number of labels to use for the scalar bar. number_of_labels = Range(0, 64, 8, enter_set=True, auto_set=False, desc='the number of labels to display') # Number of colors for the LUT. number_of_colors = Range(2, 2147483647, 256, enter_set=True, auto_set=False, desc='the number of colors for the LUT') # Enable shadowing of the labels and text. shadow = Bool(False, desc='if the labels and text have shadows') # Use the default data name or the user specified one. use_default_name = Bool(True, desc='if the default data name is to be used') # The default data name -- set by the module manager. default_data_name = Str('data', enter_set=True, auto_set=False, desc='the default data name') # The optionally user specified name of the data. data_name = Str('', enter_set=True, auto_set=False, desc='the title of the legend') # Use the default range or user specified one. use_default_range = Bool(True, desc='if the default data range is to be used') # The default data range -- this is computed and set by the # module manager. default_data_range = Array(shape=(2,), value=[0.0, 1.0], dtype=float, enter_set=True, auto_set=False, desc='the default range of the data mapped') # The optionally user defined range of the data. data_range = Array(shape=(2,), value=[0.0, 1.0], dtype=float, enter_set=True, auto_set=False, desc='the range of the data mapped') # Create a new LUT. create_lut = Button('Launch LUT editor', desc='if we launch a Lookup table editor in' ' a separate process') ######################################## ## Private traits. # The original range of the data. _orig_data_range = Array(shape=(2,), value=[0.0, 1.0], dtype=float) _title_text_property = Instance(tvtk.TextProperty) _label_text_property = Instance(tvtk.TextProperty) ###################################################################### # `object` interface ###################################################################### def __init__(self, **traits): super(LUTManager, self).__init__(**traits) # Initialize the scalar bar. sc_bar = self.scalar_bar sc_bar.set(lookup_table=self.lut, title=self.data_name, number_of_labels=self.number_of_labels, orientation='horizontal', width=0.8, height=0.17) pc = sc_bar.position_coordinate pc.set(coordinate_system='normalized_viewport', value=(0.1, 0.01, 0.0)) self._shadow_changed(self.shadow) # Initialize the lut. self._lut_mode_changed(self.lut_mode) # Set the private traits. ttp = self._title_text_property = sc_bar.title_text_property ltp = self._label_text_property = sc_bar.label_text_property # Call render when the text properties are changed. ttp.on_trait_change(self.render) ltp.on_trait_change(self.render) # Initialize the scalar_bar_widget self.scalar_bar_widget.set(scalar_bar_actor=self.scalar_bar, key_press_activation=False) self._number_of_colors_changed(self.number_of_colors) ###################################################################### # `Base` interface ###################################################################### def start(self): """This is invoked when this object is added to the mayavi pipeline. """ # Do nothing if we are already running. if self.running: return # Show the legend if necessary. self._show_scalar_bar_changed(self.show_scalar_bar) # Call parent method to set the running state. super(LUTManager, self).start() def stop(self): """Invoked when this object is removed from the mayavi pipeline. """ if not self.running: return # Hide the scalar bar. sbw = self.scalar_bar_widget if sbw.interactor is not None: sbw.off() # Call parent method to set the running state. super(LUTManager, self).stop() ###################################################################### # Non-public interface ###################################################################### def _lut_mode_changed(self, value): if value == 'file': if self.file_name: self.load_lut_from_file(self.file_name) #self.lut.force_build() return reverse = self.reverse_lut if value in pylab_luts: lut = pylab_luts[value] if reverse: lut = lut[::-1, :] n_total = len(lut) n_color = self.number_of_colors if not n_color >= n_total: lut = lut[::round(n_total/float(n_color))] self.load_lut_from_list(lut.tolist()) #self.lut.force_build() return elif value == 'blue-red': if reverse: hue_range = 0.0, 0.6667 saturation_range = 1.0, 1.0 value_range = 1.0, 1.0 else: hue_range = 0.6667, 0.0 saturation_range = 1.0, 1.0 value_range = 1.0, 1.0 elif value == 'black-white': if reverse: hue_range = 0.0, 0.0 saturation_range = 0.0, 0.0 value_range = 1.0, 0.0 else: hue_range = 0.0, 0.0 saturation_range = 0.0, 0.0 value_range = 0.0, 1.0 lut = self.lut lut.set(hue_range=hue_range, saturation_range=saturation_range, value_range=value_range, number_of_table_values=self.number_of_colors, ramp='sqrt') lut.modified() lut.force_build() self.render() def _scene_changed(self, value): sbw = self.scalar_bar_widget if value is None: return if sbw.interactor is not None: sbw.off() value.add_widgets(sbw, enabled=False) if self.show_scalar_bar: sbw.on() self._foreground_changed_for_scene(None, value.foreground) def _foreground_changed_for_scene(self, old, new): # Change the default color for the text. self.title_text_property.color = new self.label_text_property.color = new self.render() def _number_of_colors_changed(self, value): if self.lut_mode == 'file': return elif self.lut_mode in pylab_luts: # We can't interpolate these LUTs, as they are defined from a # table. We hack around this limitation reverse = self.reverse_lut lut = pylab_luts[self.lut_mode] if reverse: lut = lut[::-1, :] n_total = len(lut) if value > n_total: return lut = lut[::round(n_total/float(value))] self.load_lut_from_list(lut.tolist()) else: lut = self.lut lut.number_of_table_values = value lut.modified() lut.build() self.render() # necessary to flush. sc_bar = self.scalar_bar sc_bar.maximum_number_of_colors = value sc_bar.modified() self.render() def _number_of_labels_changed(self, value): sc_bar = self.scalar_bar sc_bar.number_of_labels = value sc_bar.modified() self.render() def _file_name_changed(self, value): if self.lut_mode == 'file': self.load_lut_from_file(value) else: # This will automagically load the LUT from the file. self.lut_mode = 'file' def _reverse_lut_changed(self, value): # This will do the needful. self._lut_mode_changed(self.lut_mode) def _show_scalar_bar_changed(self, value): if self.scene is not None: # Without a title for scalar bar actor, vtkOpenGLTexture logs this: # Error: No scalar values found for texture input! if self.scalar_bar.title == '': self.scalar_bar.title = ' ' self.scalar_bar_widget.enabled = value self.render() def _get_show_legend(self): return self.show_scalar_bar def _set_show_legend(self, value): old = self.show_scalar_bar if value != old: self.show_scalar_bar = value self.trait_property_changed('show_legend', old, value) def _shadow_changed(self, value): sc_bar = self.scalar_bar sc_bar.title_text_property.shadow = self.shadow sc_bar.label_text_property.shadow = self.shadow self.render() def _use_default_name_changed(self, value): self._default_data_name_changed(self.default_data_name) def _data_name_changed(self, value): sc_bar = self.scalar_bar sc_bar.title = value sc_bar.modified() self.render() def _default_data_name_changed(self, value): if self.use_default_name: self.data_name = value def _use_default_range_changed(self, value): self._default_data_range_changed(self.default_data_range) def _data_range_changed(self, value): try: self.lut.set_range(value[0], value[1]) except TypeError: self.lut.set_range((value[0], value[1])) except AttributeError: self.lut.range = value self.scalar_bar.modified() self.render() def _default_data_range_changed(self, value): if self.use_default_range: self.data_range = value def _visible_changed(self, value): state = self.show_scalar_bar and value self._show_scalar_bar_changed(state) super(LUTManager, self)._visible_changed(value) def load_lut_from_file(self, file_name): lut_list = [] if len(file_name) > 0: try: f = open(file_name, 'r') except IOError: msg = "Cannot open Lookup Table file: %s\n"%file_name error(msg) else: f.close() try: lut_list = parse_lut_file(file_name) except IOError as err_msg: msg = "Sorry could not parse LUT file: %s\n"%file_name msg += err_msg error(msg) else: if self.reverse_lut: lut_list.reverse() self.lut = set_lut(self.lut, lut_list) self.render() def load_lut_from_list(self, list): self.lut = set_lut(self.lut, list) self.render() def _get_title_text_property(self): return self._title_text_property def _get_label_text_property(self): return self._label_text_property def _create_lut_fired(self): from tvtk import util script = os.path.join(os.path.dirname(util.__file__), 'wx_gradient_editor.py') subprocess.Popen([sys.executable, script]) auto_close_message('Launching LUT editor in separate process ...') def _scalar_bar_representation_default(self): w = self.scalar_bar_widget if hasattr(w, 'representation'): r = w.representation r.on_trait_change(self.render) return r else: return None mayavi-4.5.0/mayavi/core/metadata.py0000644000076500000240000001055212747716314020001 0ustar prabhustaff00000000000000""" The definition of different kinds of metadata that is put into the mayavi registry """ # Author: Prabhu Ramachandran # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import HasTraits, Str, Callable, Either, List, Instance from mayavi.core.pipeline_info import PipelineInfo ################################################################################ # Utility functions. ################################################################################ def import_symbol(symbol_path): """ Import the symbol defined by the specified symbol path. Copied from envisage's import manager. """ if ':' in symbol_path: module_name, symbol_name = symbol_path.split(':') module = import_module(module_name) symbol = eval(symbol_name, module.__dict__) else: components = symbol_path.split('.') module_name = '.'.join(components[:-1]) symbol_name = components[-1] module = __import__( module_name, globals(), locals(), [symbol_name] ) symbol = getattr(module, symbol_name) return symbol def import_module(module_name): """This imports the given module name. This code is copied from envisage's import manager! """ module = __import__(module_name) components = module_name.split('.') for component in components[1:]: module = getattr(module, component) return module ################################################################################ # `Metadata` class. ################################################################################ class Metadata(HasTraits): """ This class allows us to define metadata related to mayavi's sources, filters and modules. """ # Our ID. id = Str # The class that implements the module/filter/source. class_name = Str # The factory that implements the object overrides the class_name if # not the empty string. The callable will be given the filename to # open along with the engine (for sources). factory = Either(Str, Callable, allow_none=False) # Description of the object being described. desc = Str # Help string for the object. help = Str # The name of this object in a menu. menu_name = Str # The optional tooltip to display for this object. tooltip = Str # Information about what this object can consume. input_info = Instance(PipelineInfo) # Information about what this object can produce. output_info = Instance(PipelineInfo) ###################################################################### # Metadata interface. ###################################################################### def get_callable(self): """Return the callable that will create a new instance of the object implementing this metadata. """ factory = self.factory if factory is not None: if callable(factory): symbol = factory elif isinstance(factory, str) and len(factory) > 0: symbol = import_symbol(factory) else: symbol = import_symbol(self.class_name) else: symbol = import_symbol(self.class_name) return symbol ################################################################################ # `ModuleMetadata` class. ################################################################################ class ModuleMetadata(Metadata): pass ################################################################################ # `FilterMetadata` class. ################################################################################ class FilterMetadata(Metadata): pass ################################################################################ # `SourceMetadata` class. ################################################################################ class SourceMetadata(Metadata): # The file name extension that this reader/source handles. Empty if # it does not read a file. extensions = List(Str) # Wildcard for the file dialog. wildcard = Str # `Callable` to check if the reader can actually read the file # `Callable` must accept the filename to be read and it should # return `True` if its possible to read the file else 'False' can_read_test = Str mayavi-4.5.0/mayavi/core/module.py0000644000076500000240000002035012747716314017503 0ustar prabhustaff00000000000000"""The base class for all MayaVi modules. """ # Author: Prabhu Ramachandran # Copyright (c) 2005-2008, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import List, Instance, Str # Local imports from mayavi.core.pipeline_base import PipelineBase from mayavi.core.pipeline_info import PipelineInfo from mayavi.core.common import exception ###################################################################### # `Module` class. ###################################################################### class Module(PipelineBase): """ Base class for the Mayavi modules. """ # The version of this class. Used for persistence. __version__ = 0 # The ModuleManager associated with this module. A Module is # always a child of a ModuleManager. When the module is added to # the mayavi pipeline (as a child of the module manager), the # module manager automatically sets this trait. module_manager = Instance('mayavi.core.module_manager.ModuleManager', record=False) # The (optional) components used by this module. NOTE: This is # not pickled. It is the developers responsibility to setup the # components when the component traits are set in the handler. components = List(record=False) # The icon icon = Str('module.ico') # The human-readable type for this object type = Str(' module') # Information about what this object can consume. input_info = PipelineInfo(datasets=['any']) # Information about what this object can produce. output_info = PipelineInfo(datasets=['none']) ###################################################################### # `object` interface. ###################################################################### def __init__(self, **traits): super(Module, self).__init__(**traits) # Let the module setup its pipeline. self.setup_pipeline() def __get_pure_state__(self): d = super(Module, self).__get_pure_state__() for x in ('module_manager', 'components'): d.pop(x, None) return d ###################################################################### # `Module` interface. ###################################################################### def setup_pipeline(self): """Override this method so that it *creates* the tvtk pipeline. This method is invoked when the object is initialized via `__init__`. Note that at the time this method is called, the tvtk data pipeline will *not* yet be setup. So upstream data will not be available. The idea is that you simply create the basic objects and setup those parts of the pipeline not dependent on upstream sources and filters. You should also set the `actors` attribute up at this point. """ pass def update_pipeline(self): """Override this method so that it *updates* the tvtk pipeline when data upstream is known to have changed. This method is invoked (automatically) when the input fires a `pipeline_changed` event. """ raise NotImplementedError def update_data(self): """Override this method so that it flushes the vtk pipeline if that is necessary. This method is invoked (automatically) when any of the inputs sends a `data_changed` event. """ # By default, just invoke render and set data_changed. self.data_changed = True self.render() ###################################################################### # `Base` interface ###################################################################### def start(self): """This is invoked when this object is added to the mayavi pipeline. Note that when start is invoked, all the other information for the pipeline should be already set. """ if self.running: return # Setup event handlers. self._setup_event_handlers() # Setup the pipeline. self.update_pipeline() # Start the components. try: for component in self.components: component.start() except: exception() # Call parent method to set the running state. super(Module, self).start() def stop(self): """Invoked when this object is removed from the mayavi pipeline. """ if not self.running: return # Teardown event handlers. self._teardown_event_handlers() # Stop the components. for component in self.components: component.stop() # Call parent method to set the running state. super(Module, self).stop() def add_child(self, child): """This method intelligently adds a child to this object in the MayaVi pipeline. """ # Pass on the buck to our module_manager. self.module_manager.add_child(child) ###################################################################### # `TreeNodeObject` interface ###################################################################### def tno_has_children(self, node): """ Returns whether or not the object has children. """ return False def tno_allows_children(self, node): """ Returns whether chidren of this object are allowed or not. """ return False def tno_get_children(self, node): """ Gets the object's children. """ return None ###################################################################### # Non-public interface ###################################################################### def _change_components(self, old, new): """This method sets up the `components` trait and is typically called from a handler for a particular component. For example lets say you are using a `Actor` component and have a `actor` trait on the module. The `_actor_changed` method should setup the pipeline. Typically inside this handler, you also want to change the module's `components` trait. This method merely does that by removing the older component and adding the new one and then updating the pipeline just in case. """ comp = self.components if old is not None: comp.remove(old) comp.append(new) if old is not None: self.update_pipeline() def _setup_event_handlers(self): mm = self.module_manager src = mm.source mm.on_trait_change(self.update_pipeline, 'source') src.on_trait_event(self.update_pipeline, 'pipeline_changed') src.on_trait_event(self.update_data, 'data_changed') def _teardown_event_handlers(self): mm = self.module_manager src = mm.source mm.on_trait_change(self.update_pipeline, 'source', remove=True) src.on_trait_event(self.update_pipeline, 'pipeline_changed', remove=True) src.on_trait_event(self.update_data, 'data_changed', remove=True) def _scene_changed(self, old_scene, new_scene): for component in self.components: component.scene = new_scene super(Module, self)._scene_changed(old_scene, new_scene) def _components_changed(self, old, new): self._handle_components(old, new) def _components_items_changed(self, list_event): self._handle_components(list_event.removed, list_event.added) def _handle_components(self, removed, added): for component in removed: if self.running: component.stop() scene = self.scene for component in added: if scene is not None: component.scene = scene if self.running: component.start() def _visible_changed(self,value): for c in self.components: c.visible = value super(Module,self)._visible_changed(value) def _menu_helper_default(self): from mayavi.core.traits_menu import ModuleMenuHelper return ModuleMenuHelper(object=self.module_manager) mayavi-4.5.0/mayavi/core/module_manager.py0000644000076500000240000003024712747716314021203 0ustar prabhustaff00000000000000"""Manages a collection of module objects. Also manages the lookup tables. """ # Author: Prabhu Ramachandran # Copyright (c) 2005-2008, Enthought, Inc. # License: BSD Style. import numpy # Enthought library imports. from traits.api import List, Instance, Trait, TraitPrefixList, \ HasTraits, Str from apptools.persistence.state_pickler import set_state # Local imports from mayavi.core.base import Base from mayavi.core.module import Module from mayavi.core.common import get_output from mayavi.core.lut_manager import LUTManager from mayavi.core.common import handle_children_state, exception from mayavi.core.pipeline_info import PipelineInfo ###################################################################### # `DataAttributes` class. ###################################################################### class DataAttributes(HasTraits): """A simple helper class used to store some attributes of an input data object.""" # The version of this class. Used for persistence. __version__ = 0 # The name of the input data array. name = Str('') # The range of the data array. range = List def _get_np_arr(self, arr): data_array = arr.to_array() data_has_nan = numpy.isnan(data_array).any() return data_array, data_has_nan def compute_scalar(self, data, mode='point'): """Compute the scalar range from given VTK data array. Mode can be 'point' or 'cell'.""" if data is not None: if data.name is None or len(data.name) == 0: data.name = mode + '_scalars' self.name = data.name data_array, data_has_nan = self._get_np_arr(data) if data_has_nan: self.range = [float(numpy.nanmin(data_array)), float(numpy.nanmax(data_array))] else: self.range = list(data.range) def compute_vector(self, data, mode='point'): """Compute the vector range from given VTK data array. Mode can be 'point' or 'cell'.""" if data is not None: if data.name is None or len(data.name) == 0: data.name = mode + '_vectors' self.name = data.name data_array, data_has_nan = self._get_np_arr(data) if data_has_nan: d_mag = numpy.sqrt((data_array*data_array).sum(axis=1)) self.range = [float(numpy.nanmin(d_mag)), float(numpy.nanmax(d_mag))] else: self.range = [0.0, data.max_norm] def config_lut(self, lut_mgr): """Set the attributes of the LUTManager.""" rng = [0.0, 1.0] if len(self.range) > 0: rng = self.range lut_mgr.default_data_range = list(rng) lut_mgr.default_data_name = self.name # Constant for a ModuleManager class and it's View. LUT_DATA_MODE_TYPES = ['auto', 'point data', 'cell data'] ###################################################################### # `ModuleManager` class. ###################################################################### class ModuleManager(Base): """ The module manager node (represented as 'Colors and Legends'). """ # The source object this is connected to. source = Instance(Base) # The modules contained by this manager. children = List(Module, record=True) # The data type to use for the LUTs. Changing this setting will # change the data range and name of the lookup table/legend bar. # If set to 'auto', it automatically looks for cell and point data # with point data being preferred over cell data and chooses the # one available. If set to 'point data' it uses the input point # data for the LUT and if set to 'cell data' it uses the input # cell data. lut_data_mode = Trait('auto', TraitPrefixList(LUT_DATA_MODE_TYPES), desc='specify the data type used by the lookup tables', ) # The scalar lookup table manager. scalar_lut_manager = Instance(LUTManager, args=(), record=True) # The vector lookup table manager. vector_lut_manager = Instance(LUTManager, args=(), record=True) # The name of the ModuleManager. name = Str('Colors and legends') # The icon icon = Str('modulemanager.ico') # The human-readable type for this object type = Str(' colors and legends') # Information about what this object can consume. input_info = PipelineInfo(datasets=['any']) # Information about what this object can produce. output_info = PipelineInfo(datasets=['any']) ###################################################################### # `object` interface ###################################################################### def __get_pure_state__(self): d = super(ModuleManager, self).__get_pure_state__() # Source is setup dynamically, don't pickle it. d.pop('source', None) return d def __set_pure_state__(self, state): # Do everything but our kids. set_state(self, state, ignore=['children']) # Setup children. handle_children_state(self.children, state.children) # Now setup the children. set_state(self, state, first=['children'], ignore=['*']) self.update() ###################################################################### # `ModuleManager` interface ###################################################################### def update(self): """Update any internal data. This is invoked when the source changes or when there are pipeline/data changes upstream. """ if len(self.source.outputs) == 0: return self._setup_scalar_data() self._setup_vector_data() ###################################################################### # `Base` interface ###################################################################### def start(self): """This is invoked when this object is added to the mayavi pipeline. """ # Do nothing if we are already running. if self.running: return # Setup event handlers. self._setup_event_handlers() # Start all our children. for obj in self.children: obj.start() for obj in (self.scalar_lut_manager, self.vector_lut_manager): obj.start() # Call parent method to set the running state. super(ModuleManager, self).start() def stop(self): """Invoked when this object is removed from the mayavi pipeline. """ if not self.running: return # Teardown event handlers. self._teardown_event_handlers() # Stop all our children. for obj in self.children: obj.stop() for obj in (self.scalar_lut_manager, self.vector_lut_manager): obj.stop() # Call parent method to set the running state. super(ModuleManager, self).stop() def add_child(self, child): """This method intelligently adds a child to this object in the MayaVi pipeline. """ if isinstance(child, Module): self.children.append(child) else: # Ask our source to deal with it. self.source.add_child(child) def remove_child(self, child): """Remove specified child from our children. """ self.children.remove(child) ###################################################################### # `TreeNodeObject` interface ###################################################################### def tno_can_add(self, node, add_object): """ Returns whether a given object is droppable on the node. """ try: if issubclass(add_object, Module): return True except TypeError: if isinstance(add_object, Module): return True return False def tno_drop_object(self, node, dropped_object): """ Returns a droppable version of a specified object. """ if isinstance(dropped_object, Module): return dropped_object ###################################################################### # Non-public interface ###################################################################### def _children_changed(self, old, new): self._handle_children(old, new) def _children_items_changed(self, list_event): self._handle_children(list_event.removed, list_event.added) def _handle_children(self, removed, added): # Stop all the old children. for obj in removed: obj.stop() # Setup and start the new ones. for obj in added: obj.set(module_manager=self, scene=self.scene, parent=self) if self.running: # It makes sense to start children only if we are running. # If not, the children will be started when we start. try: obj.start() except: exception() def _source_changed(self): self.output_info.copy_traits(self.source.output_info) self.update() def _setup_event_handlers(self): src = self.source src.on_trait_event(self.update, 'pipeline_changed') src.on_trait_event(self.update, 'data_changed') def _teardown_event_handlers(self): src = self.source src.on_trait_event(self.update, 'pipeline_changed', remove=True) src.on_trait_event(self.update, 'data_changed', remove=True) def _scene_changed(self, value): for obj in self.children: obj.scene = value for obj in (self.scalar_lut_manager, self.vector_lut_manager): obj.scene = value def _lut_data_mode_changed(self, value): self.update() def _setup_scalar_data(self): """Computes the scalar range and an appropriate name for the lookup table.""" input = get_output(self.source.outputs[0]) ps = input.point_data.scalars cs = input.cell_data.scalars data_attr = DataAttributes(name='No scalars') point_data_attr = DataAttributes(name='No scalars') point_data_attr.compute_scalar(ps, 'point') cell_data_attr = DataAttributes(name='No scalars') cell_data_attr.compute_scalar(cs, 'cell') if self.lut_data_mode == 'auto': if len(point_data_attr.range) > 0: data_attr.copy_traits(point_data_attr) elif len(cell_data_attr.range) > 0: data_attr.copy_traits(cell_data_attr) elif self.lut_data_mode == 'point data': data_attr.copy_traits(point_data_attr) elif self.lut_data_mode == 'cell data': data_attr.copy_traits(cell_data_attr) data_attr.config_lut(self.scalar_lut_manager) def _setup_vector_data(self): input = get_output(self.source.outputs[0]) pv = input.point_data.vectors cv = input.cell_data.vectors data_attr = DataAttributes(name='No vectors') point_data_attr = DataAttributes(name='No vectors') point_data_attr.compute_vector(pv, 'point') cell_data_attr = DataAttributes(name='No vectors') cell_data_attr.compute_vector(cv, 'cell') if self.lut_data_mode == 'auto': if len(point_data_attr.range) > 0: data_attr.copy_traits(point_data_attr) elif len(cell_data_attr.range) > 0: data_attr.copy_traits(cell_data_attr) elif self.lut_data_mode == 'point data': data_attr.copy_traits(point_data_attr) elif self.lut_data_mode == 'cell data': data_attr.copy_traits(cell_data_attr) data_attr.config_lut(self.vector_lut_manager) def _visible_changed(self,value): for c in self.children: c.visible = value self.scalar_lut_manager.visible = value self.vector_lut_manager.visible = value super(ModuleManager,self)._visible_changed(value) def _menu_helper_default(self): from mayavi.core.traits_menu import ModuleMenuHelper return ModuleMenuHelper(object=self) mayavi-4.5.0/mayavi/core/mouse_pick_dispatcher.py0000644000076500000240000001646412747716314022575 0ustar prabhustaff00000000000000""" An object to register callbacks and dispatch event wiring mouse clicks on a scene to picking. """ # ETS imports from traits.api import HasTraits, Dict, Instance, \ Enum, Int, Callable, on_trait_change, List, Tuple, WeakRef from mayavi.core.scene import Scene from tvtk.api import tvtk VTK_VERSION = tvtk.Version().vtk_major_version \ + .1*tvtk.Version().vtk_minor_version ################################################################################ # class `MousePickDispatcher` ################################################################################ class MousePickDispatcher(HasTraits): """ An event dispatcher to send pick event on mouse clicks. This objects wires VTK observers so that picking callbacks can be bound to mouse click without movement. The object deals with adding and removing the VTK-level callbacks. """ # The scene events are wired to. scene = WeakRef(Scene) # The list of callbacks, with the picker type they should be using, # and the mouse button that triggers them. callbacks = List(Tuple( Callable, Enum('cell', 'point', 'world'), Enum('Left', 'Middle', 'Right'), ), help="The list of callbacks, with the picker type they " "should be using, and the mouse button that " "triggers them. The callback is passed " "as an argument the tvtk picker." ) #-------------------------------------------------------------------------- # Private traits #-------------------------------------------------------------------------- # Whether the mouse has moved after the button press _mouse_no_mvt = Int # The button that has been pressed _current_button = Enum('Left', 'Middle', 'Right') # The various picker that are used when the mouse is pressed _active_pickers = Dict # The VTK callback numbers corresponding to our callbacks _picker_callback_nbs = Dict(value_trait=Int) # The VTK callback numbers corresponding to mouse movement _mouse_mvt_callback_nb = Int # The VTK callback numbers corresponding to mouse press _mouse_press_callback_nbs = Dict # The VTK callback numbers corresponding to mouse release _mouse_release_callback_nbs = Dict #-------------------------------------------------------------------------- # Callbacks management #-------------------------------------------------------------------------- @on_trait_change('callbacks_items') def dispatch_callbacks_change(self, name, trait_list_event): for item in trait_list_event.added: self.callback_added(item) for item in trait_list_event.removed: self.callback_removed(item) def callback_added(self, item): """ Wire up the different VTK callbacks. """ callback, type, button = item picker = getattr(self.scene.scene.picker, '%spicker' % type) self._active_pickers[type] = picker # Register the pick callback if not type in self._picker_callback_nbs: self._picker_callback_nbs[type] = \ picker.add_observer("EndPickEvent", self.on_pick) # Register the callbacks on the scene interactor if VTK_VERSION>5: move_event = "RenderEvent" else: move_event = 'MouseMoveEvent' if not self._mouse_mvt_callback_nb: self._mouse_mvt_callback_nb = \ self.scene.scene.interactor.add_observer(move_event, self.on_mouse_move) if not button in self._mouse_press_callback_nbs: self._mouse_press_callback_nbs[button] = \ self.scene.scene.interactor.add_observer( '%sButtonPressEvent' % button, self.on_button_press) if VTK_VERSION>5: release_event = "EndInteractionEvent" else: release_event = '%sButtonReleaseEvent' % button if not button in self._mouse_release_callback_nbs: self._mouse_release_callback_nbs[button] = \ self.scene.scene.interactor.add_observer( release_event, self.on_button_release) def callback_removed(self, item): """ Clean up the unecessary VTK callbacks. """ callback, type, button = item # If the picker is no longer needed, clean up its observers. if not [t for c, t, b in self.callbacks if t == type]: picker = self._active_pickers[type] picker.remove_observer(self._picker_callback_nbs[type]) del self._active_pickers[type] # If there are no longer callbacks on the button, clean up # the corresponding observers. if not [b for c, t, b in self.callbacks if b == button]: self.scene.scene.interactor.remove_observer( self._mouse_press_callback_nbs[button]) self.scene.scene.interactor.remove_observer( self._mouse_release_callback_nbs[button]) if len(self.callbacks) == 0 and self._mouse_mvt_callback_nb: self.scene.scene.interactor.remove_observer( self._mouse_mvt_callback_nb) self._mouse_mvt_callback_nb = 0 def clear_callbacks(self): while self.callbacks: self.callbacks.pop() #-------------------------------------------------------------------------- # Mouse movement dispatch mechanism #-------------------------------------------------------------------------- def on_button_press(self, vtk_picker, event): self._current_button = event[:-len('ButtonPressEvent')] self._mouse_no_mvt = 2 def on_mouse_move(self, vtk_picker, event): if self._mouse_no_mvt: self._mouse_no_mvt -= 1 def on_button_release(self, vtk_picker, event): """ If the mouse has not moved, pick with our pickers. """ if self._mouse_no_mvt: x, y = vtk_picker.GetEventPosition() for picker in self._active_pickers.values(): try: picker.pick((x, y, 0), self.scene.scene.renderer) except TypeError: picker.pick(x, y, 0, self.scene.scene.renderer) self._mouse_no_mvt = 0 def on_pick(self, vtk_picker, event): """ Dispatch the pick to the callback associated with the corresponding mouse button. """ picker = tvtk.to_tvtk(vtk_picker) for event_type, event_picker in self._active_pickers.items(): if picker is event_picker: for callback, type, button in self.callbacks: if ( type == event_type and button == self._current_button): callback(picker) break #-------------------------------------------------------------------------- # Private methods #-------------------------------------------------------------------------- def __del__(self): self.clear_callbacks() mayavi-4.5.0/mayavi/core/null_engine.py0000644000076500000240000000267112747716314020523 0ustar prabhustaff00000000000000""" A Null engine for Mayavi. The `NullEngine` class lets you create a full-fledged (almost) Mayavi engine without the need for it poping up a window. It is useful for testing or for using VTK as numerical engine. It does not allow for rendering. """ # Author: Prabhu Ramachandran # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. from traits.api import HasTraits, Any, Event, Callable from mayavi.core.engine import Engine def dummy_viewer_factory(): """Factory function for the dummy viewer.""" return DummyViewer() ################################################################################ # `NullEngine` class. ################################################################################ class NullEngine(Engine): """ This class represents a NullEngine which creates a DummyViewer with a scene set to None. This allows us to write full mayavi scripts without the need for a UI and this is perfect for testing, or to use Mayavi (and VTK) as a numerical engine. This engine does not allow for rendring. """ scene_factory = Callable(dummy_viewer_factory) ################################################################################ # `DummyViewer` class. ################################################################################ class DummyViewer(HasTraits): """Mimics the API of a viewer.""" scene = Any closing = Event activated = Event mayavi-4.5.0/mayavi/core/off_screen_engine.py0000644000076500000240000000174712747716314021665 0ustar prabhustaff00000000000000""" An off-screen mayavi engine. """ # Author: Prabhu Ramachandran # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. from traits.api import Callable, Str from tvtk.pyface.tvtk_scene import TVTKWindow from mayavi.core.engine import Engine from mayavi.preferences.api import set_scene_preferences def off_screen_viewer_factory(size=(400, 350)): """A factory that creates an offscreen viewer.""" win = TVTKWindow(off_screen_rendering=True) # Set all preferences. set_scene_preferences(win.scene) # Set the size. win.scene.set_size(size) return win ################################################################################ # `OffScreenEngine` class. ################################################################################ class OffScreenEngine(Engine): # Overriding the scene factory trait of Engine. scene_factory = Callable(off_screen_viewer_factory) # Our name. name = Str('Mayavi offscreen Engine') mayavi-4.5.0/mayavi/core/pipeline_base.py0000644000076500000240000002350012747716314021015 0ustar prabhustaff00000000000000"""The base class for all objects in the MayaVi pipeline. This class basically abstracts out the common parts of the pipeline interface. """ # Author: Prabhu Ramachandran # Copyright (c) 2005-2008, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import List, Event, Bool, Instance # Local imports. from mayavi.core.base import Base from mayavi.core.pipeline_info import PipelineInfo import tvtk.common as tvtk_common ###################################################################### # `PipelineBase` class. ###################################################################### class PipelineBase(Base): """ Base class for all the Source, Filters and Modules in the pipeline. """ # The version of this class. Used for persistence. __version__ = 0 # A list of outputs for this object. outputs = List(record=False) # The actors generated by this object that will be rendered on the # scene. Changing this list while the actors are renderered *is* # safe and will do the right thing. actors = List(record=False) # The optional list of actors belonging to this object. These # will be added to the scene at an appropriate time. Changing # this list while the widgets are renderered *is* safe and will do # the right thing. widgets = List(record=False) # Information about what this object can consume. input_info = Instance(PipelineInfo) # Information about what this object can produce. output_info = Instance(PipelineInfo) ######################################## # Events. # This event is fired when the pipeline has changed. pipeline_changed = Event(record=False) # This event is fired when the data alone changes but the pipeline # outputs are the same. data_changed = Event(record=False) ################################################## # Private traits. ################################################## # Identifies if `actors` and `widgets` are added to the `scene` or # not. _actors_added = Bool(False) # Stores the state of the widgets prior to disabling them. _widget_state = List ###################################################################### # `object` interface. ###################################################################### def __get_pure_state__(self): d = super(PipelineBase, self).__get_pure_state__() # These are setup dynamically so we should not pickle them. for x in ('outputs', 'actors', 'widgets', '_actors_added', ): d.pop(x, None) return d ###################################################################### # `Base` interface ###################################################################### def start(self): """This is invoked when this object is added to the mayavi pipeline. Note that when start is invoked, all the other information for the pipeline should be already set. """ if self.running: return # Add any actors. self.add_actors() # Call parent method to set the running state. super(PipelineBase, self).start() def stop(self): """Invoked when this object is removed from the mayavi pipeline. """ if not self.running: return # Remove any of our actors from the scene. self.remove_actors() # Call parent method to set the running state. super(PipelineBase, self).stop() def render(self): """Invokes render on the scene, this in turn invokes Render on the VTK pipeline. """ s = self.scene if s is not None: s.render() elif self.running: # If there is no scene and we are running, we flush the # pipeline manually by calling update. for actor in self.actors: if hasattr(actor, 'mapper'): m = actor.mapper if m is not None: if tvtk_common.is_old_pipeline(): m.update() else: m.update(0) if tvtk_common.is_old_pipeline(): for widget in self.widgets: if hasattr(widget, 'input'): input = widget.input if input is not None: input.update() if hasattr(self, 'components'): for component in self.components: component.render() ###################################################################### # `PipelineBase` interface. ###################################################################### # Normally, you will not need to override the following methods # but you can if you really need to for whatever reason. def add_actors(self): """Adds `self.actors` to the scene. This is typically called when start is invoked. You should avoid calling this unless you know what you are doing. """ scene = self.scene if scene is not None: scene.add_actors(self.actors) scene.add_widgets(self.widgets) self._set_widget_visibility(self.widgets) self._actors_added = True def remove_actors(self): """Removes `self.actors` from the scene. This is typically called when stop is invoked. You should avoid calling this unless you know what you are doing. """ scene = self.scene if scene is not None: scene.remove_actors(self.actors) scene.remove_widgets(self.widgets) self._actors_added = False def has_output_port(self): """ We assume the old pipeline topology. As such we assume no output_port exists.""" return False def get_output_object(self): """ We assume the old pipeline topology. As such we return the first output.""" return self.outputs[0] def get_output_dataset(self): """ Return the output dataset of this object. """ if self.outputs: o = self.outputs[0] if o.is_a('vtkDataSet'): return o else: output = o.output if output is None and hasattr(o, 'update'): o.update() return o.output else: return None def configure_connection(self, obj, inp): """ Configure topology for vtk pipeline obj.""" tvtk_common.configure_connection(obj, inp) def configure_input_data(self, obj, data): """ Configure the input data for vtk pipeline object obj.""" tvtk_common.configure_input_data(obj, data) def configure_input(self, inp, op): """ Configure the inp using op.""" tvtk_common.configure_input(inp, op) def configure_source_data(self, obj, data): """ Configure the source data for vtk pipeline object obj.""" tvtk_common.configure_source_data(obj, data) ###################################################################### # Non-public interface ###################################################################### def _outputs_changed(self, new): self.pipeline_changed = True def _outputs_items_changed(self, list_event): self.pipeline_changed = True def _actors_changed(self, old, new): if self._actors_added: self.scene.remove_actors(old) self.scene.add_actors(new) self.scene.render() def _actors_items_changed(self, list_event): if self._actors_added: self.scene.remove_actors(list_event.removed) self.scene.add_actors(list_event.added) self.scene.render() def _widgets_changed(self, old, new): self._handle_widgets_changed(old, new) def _widgets_items_changed(self, list_event): self._handle_widgets_changed(list_event.removed, list_event.added) def _handle_widgets_changed(self, removed, added): if self._actors_added: scene = self.scene scene.remove_widgets(removed) scene.add_widgets(added) self._set_widget_visibility(added) def _scene_changed(self, old_scene, new_scene): if self._actors_added: old_scene.remove_actors(self.actors) old_scene.remove_widgets(self.widgets) new_scene.add_actors(self.actors) new_scene.add_widgets(self.widgets) self._set_widget_visibility(self.widgets) def _backup_widget_state(self): # store the enabled trait of the widgets # in the _widget_state list state = [] for w in self.widgets: state.append(w.enabled) self._widget_state[:] = state def _restore_widget_state(self): if len(self._widget_state) != len(self.widgets): # someone has played with the widgets # we just enable all of them for w in self.widgets: w.enabled = True else: for i in range(len(self.widgets)): self.widgets[i].enabled = self._widget_state[i] def _visible_changed(self,value): if value: # restore the state of the widgets from the # backed up values. self._restore_widget_state() else: self._backup_widget_state() # disable all the widgets self._set_widget_visibility(self.widgets) # hide all actors for a in self.actors: a.visibility = value self.render() super(PipelineBase , self)._visible_changed(value) def _set_widget_visibility(self, widgets): if not self.visible: for widget in widgets: widget.enabled = False mayavi-4.5.0/mayavi/core/pipeline_info.py0000644000076500000240000000446412747716314021046 0ustar prabhustaff00000000000000""" Defines the class that describes the information on the inputs and outputs of an object in the pipeline. """ # Author: Prabhu Ramachandran # Copyright (c) 2008-2016, Prabhu Ramachandran Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import HasTraits, Enum, List # The list of datasets supported. DataSet = Enum('none', 'any', 'image_data', 'rectilinear_grid', 'poly_data', 'structured_grid', 'unstructured_grid') # Attribute type. AttributeType = Enum('any', 'cell', 'point', 'none') # Attribute. Attribute = Enum('any', 'none', 'scalars', 'vectors', 'tensors') ################################################################################ # Utility functions. ################################################################################ def get_tvtk_dataset_name(dataset): """Given a TVTK dataset `dataset` return the string dataset type of the dataset. """ result = 'none' if hasattr(dataset, 'is_a'): if not dataset.is_a('vtkDataSet') and hasattr(dataset, 'output'): # FIXME: Use pipeline information to do this correctly. dataset = dataset.output if dataset.is_a('vtkStructuredPoints') or \ dataset.is_a('vtkImageData'): result = 'image_data' elif dataset.is_a('vtkRectilinearGrid'): result = 'rectilinear_grid' elif dataset.is_a('vtkPolyData'): result = 'poly_data' elif dataset.is_a('vtkStructuredGrid'): result = 'structured_grid' elif dataset.is_a('vtkUnstructuredGrid'): result = 'unstructured_grid' else: result = 'none' else: result = 'none' return result ################################################################################ # `PipelineInfo` class. ################################################################################ class PipelineInfo(HasTraits): """ This class represents the information that a particular input or output of an object should contain. """ # The datasets supported by the object. datasets = List(DataSet) # The attribute types the object works on. attribute_types = List(AttributeType) # The attributes the object can use/produce. attributes = List(Attribute) mayavi-4.5.0/mayavi/core/registry.py0000644000076500000240000001206612747716314020073 0ustar prabhustaff00000000000000""" A registry for engines, sources, filters and modules. """ # Author: Prabhu Ramachandran # Copyright (c) 2008-2015, Enthought, Inc. # License: BSD Style. # Standard library imports. from os.path import splitext import logging # Enthought library imports. from traits.api import HasTraits, List, Instance, Dict, Str # Local imports. from mayavi.core.metadata import Metadata, import_symbol # A logger for this module. logger = logging.getLogger(__name__) ################################################################################ # `Registry` class. ################################################################################ class Registry(HasTraits): """ This class is a registry for various engines, and metadata from sources, filters and modules """ # The mayavi engines used. engines = Dict(Str, Instance('mayavi.core.engine.Engine')) # The metadata for the sources. sources = List(Metadata) # The metadata for the modules. modules = List(Metadata) # The metadata for the filters. filters = List(Metadata) ###################################################################### # `Registry` interface. ###################################################################### def register_engine(self, engine, name=''): """Registers a mayavi engine with an optional name. Note that we allow registering an engine with the same name as another already registered. """ engines = self.engines if len(name) == 0: name = '%s%d'%(engine.__class__.__name__, len(engines) + 1) logger.debug('Engine [%s] named %s registered', engine, name) engines[name] = engine def unregister_engine(self, engine_or_name): """Unregisters a mayavi engine specified either as a name or an engine instance.""" engines = self.engines name = None if isinstance(engine_or_name, str): name = engine_or_name else: for key, engine in engines.items(): if engine_or_name == engine: name = key break if name: del engines[name] logger.debug('Engine named %s unregistered', name) def get_file_reader(self, filename): """Given a filename, find a suitable source metadata that will read the file. Returns a suitable source metadata object that will handle this. """ base, ext = splitext(filename) result = [] if len(ext) > 0: ext = ext[1:] result = [src for src in self.sources \ if ext in src.extensions] # 'result' contains list of all source metadata that can handle # the file. # If there is only single source metadata available to handle # the file, we simply return it. # If there is a conflict i.e. more then one source metadata objects # capable of handling the file then we check if they are capable of # actually reading it using 'can_read_function' which may be a class # method or a simple function which returns whether the object is # capable of reading the file or not. # Finally returns the most suitable source metadata object to the engine. If # multiple objects are still present we return the last one in the list. if len(result) > 1: for res in result[:]: if len(res.can_read_test) > 0: can_read = import_symbol(res.can_read_test)(filename) if can_read: return res else: result.remove(res) if len(result) == 0: return None return result[-1] def find_scene_engine(self, scene): """ Find the engine corresponding to a given tvtk scene. """ for engine in self.engines.values(): for s in engine.scenes: if scene is s: return engine sc = s.scene if scene is sc: return engine elif hasattr(sc, 'scene_editor') and \ scene is sc.scene_editor: # This check is needed for scene model objects. return engine else: raise TypeError("Scene not attached to a mayavi engine.") # The global registry instance. registry = Registry() # Import the metadata from the sources, modules and filters so they are # all registered. from mayavi.sources.metadata import sources registry.sources.extend(sources) from mayavi.filters.metadata import filters registry.filters.extend(filters) from mayavi.modules.metadata import modules registry.modules.extend(modules) # Do any customizations from either the `site_mayavi.py` or the # `user_mayavi.py` files. This is done by importing the customize.py # module here which in turn imports the necessary code from the users's # customization. from mayavi.core import customize mayavi-4.5.0/mayavi/core/scene.py0000644000076500000240000001744312747716314017324 0ustar prabhustaff00000000000000"""A scene object manages a TVTK scene and objects in it. """ # Author: Prabhu Ramachandran # Copyright (c) 2005, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import Event, List, Str, Instance from traitsui.api import View, Group, Item from apptools.persistence.state_pickler import set_state # Local imports. from tvtk.pyface.tvtk_scene import TVTKScene from mayavi.core.base import Base from mayavi.core.source import Source from mayavi.core.common import handle_children_state, exception from mayavi.core.adder_node import SourceAdderNode ###################################################################### # `Scene` class. ###################################################################### class Scene(Base): """ The Mayavi scene class. """ # The version of this class. Used for persistence. __version__ = 0 # The scene (RenderWindow) associated with this component -- we # redeclare it here just to be able to record this scene, we don't # want it recorded on all objects since the scene is shared # (although it isn't an error to register an object twice with the # recorder). scene = Instance(TVTKScene, record=True) # The source objects associated with this object. children = List(Source, record=True) # The name of this scene. name = Str('TVTK Scene') # The icon icon = Str('scene.ico') # The human-readable type for this object type = Str(' scene') # The objects view. view = View(Group(Item(name='scene', style='custom'), show_labels=False) ) # The adder node dialog class _adder_node_class = SourceAdderNode # The dispatch, to register callbacks on mouse pick _mouse_pick_dispatcher = Instance( 'mayavi.core.mouse_pick_dispatcher.MousePickDispatcher', record=False) ###################################################################### # `object` interface ###################################################################### def __get_pure_state__(self): # Base removes the scene, but we need to save it! d = super(Scene, self).__get_pure_state__() d['scene'] = self.scene d.pop('_mouse_pick_dispatcher', None) return d def __set_pure_state__(self, state): handle_children_state(self.children, state.children) # As `camera.distance` is derived from other camera parameters # if camera is defined, we should skip restoring "distance" if state.scene and state.scene.camera: state.scene.camera.pop("distance", None) # Now set our complete state. Doing the scene last ensures # that the camera view is set right. set_state(self, state, last=['scene']) ###################################################################### # `Scene` interface ###################################################################### def on_mouse_pick(self, callback, type='point', button='Left', remove=False): """ Add a picking callback on mouse click. When the mouse button is press, object picking is called, and the given callback is invoked with the resulting pick as an argument. **Keyword arguments** :type: 'point', 'cell', or 'world' The picker type used for picking. :button: 'Left', 'Middle', or 'Right' The mouse button triggering the picking event. :remove: boolean If remove is True, the callback is removed from the list of callbacks. **Returns** picker: a tvtk picker The picker that will be used to do the picking. **Notes** The callback must accept one argument: the TVTK picker. The same callback can be added multiple times. """ key = (callback, type, button) if remove: self._mouse_pick_dispatcher.callbacks.remove(key) else: self._mouse_pick_dispatcher.callbacks.append(key) return self._mouse_pick_dispatcher._active_pickers[type] ###################################################################### # `Base` interface ###################################################################### def start(self): """This is invoked when this object is added to the mayavi pipeline. """ # Do nothing if we are already running. if self.running: return # Start all our children. for obj in self.children: obj.start() # Disallow the hide action in the context menu self._HideShowAction.enabled = False super(Scene, self).start() def stop(self): """Invoked when this object is removed from the mayavi pipeline. """ if not self.running: return # Disable rendering to accelerate shutting down. scene = self.scene if scene is not None: status = scene.disable_render scene.disable_render = True try: # Stop all our children. for obj in self.children: obj.stop() finally: # Re-enable rendering. if scene is not None: scene.disable_render = status self.scene = None super(Scene, self).stop() def add_child(self, child): """This method intelligently adds a child to this object in the MayaVi pipeline. """ self.children.append(child) def remove_child(self, child): """Remove specified child from our children. """ self.children.remove(child) def remove(self): """Remove ourselves from the mayavi pipeline. """ if self.parent is not None: self.stop() self.parent.close_scene(self) ###################################################################### # `TreeNodeObject` interface ###################################################################### def tno_can_add(self, node, add_object): """ Returns whether a given object is droppable on the node. """ try: if issubclass(add_object, Source): return True except TypeError: if isinstance(add_object, Source): return True return False def tno_drop_object(self, node, dropped_object): """ Returns a droppable version of a specified object. """ if isinstance(dropped_object, Source): return dropped_object ###################################################################### # Non-public interface ###################################################################### def _children_changed(self, old, new): self._handle_children(old, new) def _children_items_changed(self, list_event): self._handle_children(list_event.removed, list_event.added) def _handle_children(self, removed, added): for obj in removed: obj.stop() for obj in added: obj.set(scene=self.scene, parent=self) if self.running: # It makes sense to start children only if we are running. # If not, the children will be started when we start. try: obj.start() except: exception() def _menu_helper_default(self): from mayavi.core.traits_menu import SourceMenuHelper return SourceMenuHelper(object=self) def __mouse_pick_dispatcher_default(self): from mayavi.core.mouse_pick_dispatcher import \ MousePickDispatcher return MousePickDispatcher(scene=self) mayavi-4.5.0/mayavi/core/source.py0000644000076500000240000002204512747716314017521 0ustar prabhustaff00000000000000"""The base source object from which all MayaVi sources derive. """ # Author: Prabhu Ramachandran # Copyright (c) 2005-2008, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import List, Str from apptools.persistence.state_pickler import set_state from traitsui.menu import Action from tvtk.api import write_data from apptools.scripting.api import recordable # Local imports from mayavi.core.base import Base from mayavi.core.pipeline_base import PipelineBase from mayavi.core.module import Module from mayavi.core.module_manager import ModuleManager from mayavi.core.common import handle_children_state, \ exception, error from mayavi.core.pipeline_info import PipelineInfo from mayavi.core.adder_node import ModuleFilterAdderNode ###################################################################### # Utility functions. ###################################################################### def is_filter(object): from mayavi.core.filter import Filter return isinstance(object, Filter) ###################################################################### # `Source` class. ###################################################################### class Source(PipelineBase): """ Base class for the sources objects in the pipeline. """ # The version of this class. Used for persistence. __version__ = 0 # The children of this source in the tree view. These objects all # get the output of this source. children = List(Base, record=True) # The icon icon = 'source.ico' # The human-readable type for this object type = Str(' data source') # Information about what this object can consume. input_info = PipelineInfo(datasets=['none']) # Information about what this object can produce. output_info = PipelineInfo(datasets=['any']) # The adder node dialog class _adder_node_class = ModuleFilterAdderNode ###################################################################### # `object` interface ###################################################################### def __set_pure_state__(self, state): # Do everything but our kids. set_state(self, state, ignore=['children']) # Setup children. handle_children_state(self.children, state.children) # Now setup the children. set_state(self, state, first=['children'], ignore=['*']) ###################################################################### # `Source` interface ###################################################################### def add_module(self, module): """ Adds a module smartly. If no ModuleManager instances are children, it first creates a new ModuleManager and then adds the module to it. If not it adds the module to the first available ModuleManager instance.""" mm = None for child in self.children: if isinstance(child, ModuleManager): mm = child if mm is None: mm = ModuleManager(source=self, scene=self.scene) if self.running: mm.start() self.children.append(mm) if self.recorder is not None: index = len(self.children) - 1 self.recorder.register(mm, parent=self, trait_name_on_parent='children[%d]'%index) mm.children.append(module) @recordable def save_output(self, fname): """Save our output (by default the first of our outputs) to the specified filename as a VTK file. Both old style and new style XML files are supported. """ if len(self.outputs) > 0: write_data(self.outputs[0], fname) else: error('Object has no outputs to save!') ###################################################################### # `Base` interface ###################################################################### def start(self): """This is invoked when this object is added to the mayavi pipeline. """ # Do nothing if we are already running. if self.running: return # Start all our children. for obj in self.children: try: obj.start() except: exception() # Call parent method to set the running state. super(Source, self).start() def stop(self): """Invoked when this object is removed from the mayavi pipeline. """ if not self.running: return # Stop all our children. for obj in self.children: obj.stop() # Call parent method to set the running state. super(Source, self).stop() def add_child(self, child): """This method intelligently adds a child to this object in the MayaVi pipeline. """ if is_filter(child): # It is a Filter, so append to children. self.children.append(child) elif isinstance(child, Source): # A non-filter source object. This should be added to the # scene. self.parent.add_child(child) elif isinstance(child, Module): # Modules should be added carefully via add_module. self.add_module(child) elif isinstance(child, ModuleManager): self.children.append(child) else: self.children.append(child) def remove_child(self, child): """Remove specified child from our children. """ self.children.remove(child) ###################################################################### # `TreeNodeObject` interface ###################################################################### def tno_can_add(self, node, add_object): """ Returns whether a given object is droppable on the node. """ from mayavi.core.filter import Filter try: if issubclass(add_object, Filter) or \ issubclass(add_object, ModuleManager): return True except TypeError: if isinstance(add_object, Filter) or \ isinstance(add_object, ModuleManager): return True return False def tno_drop_object(self, node, dropped_object): """ Returns a droppable version of a specified object. """ if is_filter(dropped_object) or \ isinstance(dropped_object, ModuleManager): return dropped_object ###################################################################### # Non-public interface ###################################################################### def _children_changed(self, old, new): self._handle_children(old, new) def _children_items_changed(self, list_event): self._handle_children(list_event.removed, list_event.added) def _handle_children(self, removed, added): # Stop all the removed children. for obj in removed: obj.stop() # Process the new objects. for obj in added: obj.set(scene=self.scene, parent=self) if isinstance(obj, ModuleManager): obj.source = self elif is_filter(obj): obj.inputs.append(self) if self.running: try: obj.start() except: exception() def _scene_changed(self, old, new): super(Source, self)._scene_changed(old, new) for obj in self.children: obj.scene = new def _visible_changed(self,value): for c in self.children: c.visible = value super(Source,self)._visible_changed(value) def _menu_helper_default(self): from mayavi.core.traits_menu import FilterMenuHelper return FilterMenuHelper(object=self) def _extra_menu_items(self): """Return a save output menu action.""" save_output = Action(name='Save output to file', action='object._save_output_action', enabled_when='len(object.outputs) > 0') return [save_output] def _save_output_action(self): """Pops up a dialog box for the action to ask for a file.""" # FIXME: in a refactor this should all go in a separate view # related object. from pyface.api import FileDialog, OK wildcard = 'All files (*.*)|*.*|'\ 'VTK XML files (*.xml)|*.xml|'\ 'Image Data (*.vti)|*.vti|'\ 'Poly Data (*.vtp)|*.vtp|'\ 'Rectilinear Grid (*.vtr)|*.vtr|'\ 'Structured Grid (*.vts)|*.vts|'\ 'Unstructured Grid (*.vtu)|*.vtu|'\ 'Old-style VTK files (*.vtk)|*.vtk' dialog = FileDialog(title='Save output to file', action='save as', wildcard=wildcard ) if dialog.open() == OK: self.save_output(dialog.path) mayavi-4.5.0/mayavi/core/trait_defs.py0000644000076500000240000002405512747716314020350 0ustar prabhustaff00000000000000#--------------------------------------------------------------------------- # # DEnum: is a 'dynamic enum' trait whose values are obtained from # another trait on the object. # # Caveat: # The problem with this trait is that the listeners (for changes to # the valid values) are added only when the attribute is read or # set. Thus if the acceptable list of values are changed before the # listeners are activated then the value will be set correctly only # when it is accessed and not when the values are set. # # Written by: David C. Morrill and Prabhu Ramachandran # # (c) Copyright 2006-2008 by Enthought, Inc. # #--------------------------------------------------------------------------- from traits.api import (CArray, Int, NO_COMPARE, Property, TraitError, TraitFactory, TraitType) from traitsui.api import EnumEditor from traits.traits import trait_cast import numbers #--------------------------------------------------------------------------- # Utility functions: #--------------------------------------------------------------------------- def super_getattr(object, name, *args): """Works the same way as getattr, except that name can be of the form 'a.b.c' (as many levels as you like). For example: >>> class A: ... pass ... >>> a = A() >>> a.b = A() >>> a.b.c = 1 >>> super_getattr(a, 'b.c') 1 >>> super_getattr(a.b, 'c') 1 """ if '.' in name: attrs = name.split('.') last = attrs.pop() obj = object for attr in attrs: obj = getattr(obj, attr) return getattr(obj, last, *args) else: return getattr(object, name, *args) def super_setattr(object, name, value): """Works the same way as setattr, except that name can be of the form 'a.b.c' (as many levels as you like). For example: >>> class A: ... pass ... >>> a = A() >>> a.b = A() >>> super_setattr(a, 'b.c', 1) >>> a.b.c 1 """ if '.' in name: attrs = name.split('.') last = attrs.pop() obj = object for attr in attrs: obj = getattr(obj, attr) setattr(obj, last, value) else: setattr(object, name, value) #-------------------------------------------------------------------------------- # Helper class for DEnum trait. #-------------------------------------------------------------------------------- class DEnumHelper(object): """Defines a bunch of staticmethods that collect all the helper functions needed for the DEnum trait. """ ###################################################################### # Get/Set functions for the property. def get_value ( object, name ): return super_getattr(object, DEnumHelper._init_listeners(object, name)) get_value = staticmethod(get_value) def set_value ( object, name, value ): _name = DEnumHelper._init_listeners( object, name ) trait = object.trait( name ) values = super_getattr(object, trait.values_name) if value not in values: raise TraitError(object, name,"one of %s"%values, value) old = super_getattr(object, _name) super_setattr( object, _name, value ) object.trait_property_changed(name, old, value) set_value = staticmethod(set_value) ###################################################################### # Makes a default EnumEditor for the trait: def make_editor ( trait = None ): return EnumEditor( name=trait.values_name ) make_editor = staticmethod(make_editor) ###################################################################### # Ensures that the listeners are initialized. def _init_listeners ( object, name ): _name = '_' + name if not hasattr( object, _name ): trait = object.trait( name ) DEnumHelper._add_listeners( object, name, trait.values_name) default = trait.default or '' values = super_getattr( object, trait.values_name ) if values: if default is None or default not in values: default = values[0] super_setattr( object, _name, default ) return _name _init_listeners = staticmethod(_init_listeners) def _add_listeners ( object, name, values_name ): def check_values(object, values_name, old, new): cur_choice = super_getattr(object, name) if cur_choice not in new: if new: super_setattr(object, name, new[0]) else: super_setattr(object, name, '') def check_values_items(object, values_name, list_event): cur_choice = super_getattr(object, name) values = super_getattr(object, values_name[:-6]) if cur_choice not in values: if values: super_setattr(object, name, values[0]) else: super_setattr(object, name, '') object.on_trait_change( check_values, values_name ) object.on_trait_change( check_values_items, values_name + '_items' ) _add_listeners = staticmethod(_add_listeners) #------------------------------------------------------------------------------- # Defines the DEnum property: #------------------------------------------------------------------------------- DEnum = Property(DEnumHelper.get_value, DEnumHelper.set_value, values_name = 'values', editor = (DEnumHelper.make_editor, {'trait': None}) ) DEnum = TraitFactory(DEnum) ########################################################################## # `ShadowProperty` trait type. ########################################################################## class ShadowProperty(TraitType): # Not really necessary but specifies the attribute up front. trait_type = None # Call the notifiers smartly only when the value has really changed. # If this is set to False, the notification will always occur. smart_notify = True def __init__(self, trait_type, smart_notify=True, **metadata): """Defines a shadow property trait that is best explained by example:: class Thing(HasTraits): x = ShadowProperty(Float, smart_notify=False) def _x_changed(self, value): print value In this example, the actual value of the property (`x`) will be stored in `_x` and `_x_changed` will be called regardless whether the value actually changed or not. If `smart_notify` is set to `True` then the handler is called only if the value has actually changed. Note that the validation uses the validation of the specified `trait_type` parameter. """ self.trait_type = trait_cast(trait_type) self.smart_notify = smart_notify super(ShadowProperty, self).__init__(**metadata) def validate(self, object, name, value): """Validates that a specified value is valid for this trait. """ trt = self.trait_type if trt is not None and hasattr(trt, 'validate'): value = trt.validate(object, name, value) return value def get(self, object, name): """Get the value of the trait.""" shadow = self._get_shadow(name) d = object.__dict__ if shadow in d: return d[shadow] else: return None def set(self, object, name, value): """Set the value of the trait.""" old = self.get(object, name) shadow = self._get_shadow(name) object.__dict__[shadow] = value # Fire a trait property changed. fire = True if self.smart_notify: if old is value: fire = False if fire and self._check_notification(object): object.trait_property_changed(name, old, value) def _get_shadow(self, name): """Get the shadow attribute name to use.""" return '_' + name def _check_notification(self, object): """Checks to see if notifications are allowed or not i.e. has the trait been set via: object.set(name=value, trait_change_notify=False) """ if hasattr(object, '_get_trait_change_notify'): return object._get_trait_change_notify() else: # Traits won't tell us so we find out by adding a dynamic # trait, changing it and then seeing if the callback was # called, sigh! attr = '_testing_Notification_handlers_tmp_dont_touch' def callback(value): callback.value = value callback.value = -1 object.add_trait(attr, Int) object.on_trait_change(callback, attr) setattr(object, attr, 1) status = False if callback.value == 1: status = True object.on_trait_change(callback, attr, remove=True) object.remove_trait(attr) return status class ArrayOrNone(CArray): """ Either an array-like object or None. """ def __init__(self, *args, **metadata): metadata['comparison_mode'] = NO_COMPARE super(ArrayOrNone, self).__init__(*args, **metadata) def validate(self, object, name, value): if value is None: return value return super(ArrayOrNone, self).validate(object, name, value) def get_default_value(self): return (0, None) class ArrayNumberOrNone(CArray): """ Either an array-like, number converted to a 1D array, or None. """ def __init__(self, *args, **metadata): metadata['comparison_mode'] = NO_COMPARE super(ArrayNumberOrNone, self).__init__(*args, **metadata) def validate(self, object, name, value): if value is None: return value elif isinstance(value, numbers.Number): # Local import to avoid explicit dependency. import numpy value = numpy.atleast_1d(value) return super(ArrayNumberOrNone, self).validate(object, name, value) def get_default_value(self): return (0, None) mayavi-4.5.0/mayavi/core/traits_menu.py0000644000076500000240000001705412747716314020557 0ustar prabhustaff00000000000000""" Code related to traits UI menu items for the tree view of mayavi. """ # Author: Prabhu Ramachandran # Copyright (c) 2008-2015, Prabhu Ramachandran Enthought, Inc. # License: BSD Style. from __future__ import print_function # Standard library imports. from os.path import splitext, isfile # Enthought library imports. from traits.api import HasTraits, Any, List from traitsui.menu import Action, Menu from pyface.api import FileDialog, OK, GUI # Local imports. from mayavi.core.registry import registry from mayavi.core.common import error, get_engine ################################################################################ # `MenuHelper` class. ################################################################################ class MenuHelper(HasTraits): # The object this menu generates the menus for. object = Any # The actions this helper generates. actions = List() ###################################################################### # Public interface. ###################################################################### def check_active(self, metadata): """Check if the `metadata` passed can be added to `self.object`. """ # FIXME: This should also have logic for checking the attributes # and attribute_types. output_info = self.object.output_info input_info = metadata.input_info if output_info is None: return True elif input_info is None: return True output_datasets = output_info.datasets input_datasets = input_info.datasets if 'none' in output_datasets: return False if 'any' in input_datasets: return True for d in input_datasets: if d in output_datasets: return True return False def open_file_action(self): wildcard = 'All files (*.*)|*.*' for src in registry.sources: if len(src.extensions) > 0: if wildcard.endswith('|') or \ src.wildcard.startswith('|'): wildcard += src.wildcard else: wildcard += '|' + src.wildcard dialog = FileDialog(parent=None, title='Open supported data file', action='open', wildcard=wildcard ) if dialog.open() == OK: if not isfile(dialog.path): error("File '%s' does not exist!"%dialog.path) return # FIXME: Ask for user input if a filetype is unknown and # choose appropriate reader. object = self.object engine = get_engine(object) engine.open(dialog.path, object) ###################################################################### # Non-public interface. ###################################################################### def _create_source(self, metadata, select=True): """Create source object given its metadata. If `select` is `True` make the created object the active selection. """ callable = metadata.get_callable() obj = callable() parent = self.object engine = get_engine(parent) engine.add_source(obj, parent) if select: self._make_active(obj) def _create_object(self, metadata, select=True): """Create mayavi pipeline object given its metadata. If `select` is `True` make the created object the active selection. """ callable = metadata.get_callable() obj = callable() parent = self.object engine = get_engine(parent) engine.add_filter(obj, parent) if select: self._make_active(obj) def _make_active(self, obj): """Make the object given, `obj`, the current selection of the engine.""" engine = get_engine(obj) if engine is not None: # This is required when running mayavi in envisage. GUI.set_trait_later(engine, 'current_selection', obj) else: print("No engine") def _build_source_actions(self): actions = [] a = Action(name='Open File ...', action='object.menu_helper.open_file_action', tooltip='Open a supported data file') actions.append(a) for src in registry.sources: if len(src.extensions) == 0: # The method that creates the source. setattr(self, src.id, lambda self=self, md=src, select=True: self._create_source(md, select)) a = Action(name=src.menu_name, action='object.menu_helper.'+src.id, tooltip=src.tooltip) actions.append(a) return actions def _build_filter_actions(self): actions = [] for fil in registry.filters: # The method that creates the object. setattr(self, fil.id, lambda self=self, md=fil, select=True: self._create_object(md, select)) # The method that checks if the menu can be activated or # not. setattr(self, 'check_' + fil.id, lambda self=self, md=fil: self.check_active(md)) a = Action(name=fil.menu_name, action='object.menu_helper.' + fil.id, enabled_when='object.menu_helper.check_%s()'%fil.id, tooltip=fil.tooltip) actions.append(a) return actions def _build_module_actions(self): actions = [] for mod in registry.modules: # The method that creates the module. setattr(self, mod.id, lambda self=self, md=mod, select=True: self._create_object(md, select)) # The method that checks if the menu can be activated or # not. setattr(self, 'check_' + mod.id, lambda self=self, md=mod: self.check_active(md)) a = Action(name=mod.menu_name, action='object.menu_helper.' + mod.id, enabled_when='object.menu_helper.check_%s()'%mod.id, tooltip=mod.tooltip) actions.append(a) return actions ################################################################################ # `SourceMenuHelper` class. ################################################################################ class SourceMenuHelper(MenuHelper): def _actions_default(self): actions = self._build_source_actions() return [Menu(name='Add Source', *actions)] ################################################################################ # `FilterMenuHelper` class. ################################################################################ class FilterMenuHelper(MenuHelper): def _actions_default(self): filter_actions = self._build_filter_actions() module_actions = self._build_module_actions() return [Menu(name='Add Filter', *filter_actions), Menu(name='Add Module', *module_actions)] ################################################################################ # `ModuleMenuHelper` class. ################################################################################ class ModuleMenuHelper(MenuHelper): def _actions_default(self): module_actions = self._build_module_actions() return [Menu(name='Add Module', *module_actions)] mayavi-4.5.0/mayavi/core/ui/0000755000076500000240000000000012747722127016260 5ustar prabhustaff00000000000000mayavi-4.5.0/mayavi/core/ui/__init__.py0000644000076500000240000000013212747716314020366 0ustar prabhustaff00000000000000# Author: Judah De Paula # Copyright (c) 2005-2008, Enthought, Inc. # License: BSD Style. mayavi-4.5.0/mayavi/core/ui/api.py0000644000076500000240000000046212747716314017406 0ustar prabhustaff00000000000000from mayavi.tools.mlab_scene_model import MlabSceneModel from mayavi.core.ui.mayavi_scene import MayaviScene, \ DecoratedScene from tvtk.pyface.scene_editor import SceneEditor from mayavi.core.ui.engine_view import EngineView from mayavi.core.ui.engine_rich_view import EngineRichView mayavi-4.5.0/mayavi/core/ui/engine_rich_view.py0000644000076500000240000001461712747716314022150 0ustar prabhustaff00000000000000"""A view of the pipeline with a panel to edit objects. """ # Author: Gael Varoquaux # Copyright (c) 2009, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traitsui.api import Item, View, HSplit, InstanceEditor from traitsui.menu import Action, Separator from pyface.image_resource import ImageResource from pyface.api import GUI from mayavi.core.adder_node import SceneAdderNode # Local imports. from mayavi.core.scene import Scene from mayavi.preferences.preference_manager_view import \ preference_manager_view from mayavi.core.ui.engine_view import EngineView, \ EngineViewHandler class EngineRichViewHandler(EngineViewHandler): """ A handler for the EngineRichView object. """ def init_info(self, info): """ Informs the handler what the UIInfo object for a View will be. Overridden here to add a callback on the creation of the view. """ super(EngineRichViewHandler, self).init_info(info) info.on_trait_change(self.select_selected, 'initialized') return def select_selected(self, initialized): """ Force the tree editor to select the current engine selection, and eventually collapse other scenes. """ # We need to explore the editors to find the one we are # interested in, and to switch its selection to None, and then # back to what we are interested in. editors = self.info.ui._editors if editors is not None: for editor in editors: if editor.factory is self.info.object.tree_editor: tree_editor = editor break else: return else: return # We switch the selection to None, but we avoid # trait callback, to avoid changing the engine's # current_selection. tree_editor.set(selected=None, trait_change_notify=False) current_selection = self.info.object.engine.current_selection GUI.set_trait_later(tree_editor, 'selected', current_selection) # If we are selecting a scene, collapse the others if isinstance(current_selection, Scene) and \ hasattr(tree_editor._tree, 'Collapse'): # The wx editor can collapse, dunno for the Qt for scene in self.info.object.engine.scenes: if scene is not current_selection: tree_editor._tree.Collapse( tree_editor._get_object_nid(scene)) def _on_dclick(self, object): """ Called when a node in the tree editor is double-clicked. """ if isinstance(object, SceneAdderNode): self.info.object._perform_new_scene() else: # In this view, we want the dialogs not to be modals, so that # the EngineRichView window can be closed while leaving # objects dialogs open. object.edit_traits(view=object.dialog_view()) ############################################################################## # EngineRichView class. ############################################################################## class EngineRichView(EngineView): """ A view displaying the engine's object tree, alongside with a panel to edit the objects. """ ########################################################################### # `HasTraits` interface. ########################################################################### def default_traits_view(self): """The default traits view of the Engine View. """ view = View(HSplit( Item('engine', id='mayavi.engine_rich_view.pipeline_view', springy=True, resizable=True, editor=self.tree_editor, dock='tab', label='Pipeline'), Item('engine', id='mayavi.engine_rich_view.current_selection', editor=InstanceEditor( view='current_selection_view'), springy=True, resizable=True, style='custom'), show_labels=False, id='mayavi.engine_rich_view_group', ), id='mayavi.engine_rich_view', help=False, resizable=True, undo=False, revert=False, ok=False, cancel=False, title='Mayavi pipeline', icon=self.icon, toolbar=self.toolbar, handler=EngineRichViewHandler) return view def _actions_default(self): """ Append a preferences action to the toolbar: this view of the engine is meant to be a powerful view giving access to all of Mayavi's functionality. """ preferences_action = \ Action( image=ImageResource('preferences.png', search_path=self._image_path), tooltip="Modify Mayavi's preferences", checked=False, defined_when='True', perform=preference_manager_view.dialog_view, ) actions = super(EngineRichView, self)._actions_default() actions.extend((Separator(), preferences_action)) return actions ########################################################################### # EngineRichView interface. ########################################################################### def scene_editing_view(self, scene): # Selecting an object if good, because it forces the HSplit to # choose a sensible split ratio for mayavi_scene in self.engine.scenes: sc = mayavi_scene.scene # Support for the `MlabSceneModel` where the `scene_editor` # trait contains the scene. s = getattr(sc, 'scene_editor', sc) if s is scene: self.engine.current_selection = mayavi_scene return self.edit_traits() ### EOF ###################################################################### mayavi-4.5.0/mayavi/core/ui/engine_view.py0000644000076500000240000002706212747716314021141 0ustar prabhustaff00000000000000"""The MayaVi view in Envisage. """ # Author: Prabhu Ramachandran # Copyright (c) 2005-2009, Enthought, Inc. # License: BSD Style. # Standard library imports. from os.path import join # Enthought library imports. from traits.api import Instance, HasTraits, Any, Delegate, \ List, Either from traitsui.api import (Item, TreeEditor, TreeNode, ObjectTreeNode, View, Handler, UIInfo) from traitsui.menu import ToolBar, Action, Separator from pyface.resource.resource_path import resource_path from pyface.image_resource import ImageResource from apptools.scripting.api import start_recording, stop_recording # Local imports. from mayavi.core.engine import Engine from mayavi.core.base import Base from mayavi.core.adder_node import ModuleFilterAdderNode, \ SourceAdderNode, ModuleAdderNode, FilterAdderNode, \ SceneAdderNode, AdderNode from mayavi.action.help import open_help_index, open_tvtk_docs class EngineViewHandler(Handler): """ A handler for the EngineView object. """ info = Instance(UIInfo) def init_info(self, info): """ Informs the handler what the UIInfo object for a View will be. Overridden here to save a reference to the info object. """ self.info = info return def _on_dclick(self, object): """ Called when a node in the tree editor is double-clicked. """ if isinstance(object, SceneAdderNode): self.info.object._perform_new_scene() else: object.edit_traits(view=object.dialog_view(), parent=self.info.ui.control) def _on_select(self, object): """ Called when a node in the tree editor is selected. """ self.info.object.engine._on_select(object) class AdderTreeNode(TreeNode): """ TreeNode for the adder nodes. """ children='' label='label' auto_open=True copy=False delete_me=False rename_me=False tooltip='tooltip' icon_path=resource_path() icon_item='add.ico' ############################################################################## # EngineView class. ############################################################################## class EngineView(HasTraits): """ A view displaying the engine's object tree. """ # The MayaVi engine we are a view of. engine = Instance(Engine, allow_none=True) # Path used to search for images _image_path = [join(resource_path(), 'images'), ] # The icon of the dialog icon = ImageResource('mv2.ico', search_path=_image_path) # Nodes on the tree. nodes = Any # TreeEditor tree_editor = Instance(TreeEditor) # Toolbar toolbar = Instance(ToolBar) # Toolbar actions. actions = List(Either(Action, Separator)) # Some delegates, for the toolbar to update scenes = Delegate('engine') current_selection = Delegate('engine') ########################################################################### # `object` interface. ########################################################################### def __init__(self, **traits): super(EngineView, self).__init__(**traits) ########################################################################### # `HasTraits` interface. ########################################################################### def default_traits_view(self): """The default traits view of the Engine View. """ view = View(Item(name='engine', id='engine', editor=self.tree_editor, resizable=True, show_label=False), id='mayavi.engine', help=False, resizable=True, scrollable=True, undo=False, revert=False, ok=False, cancel=False, icon=self.icon, title = 'Mayavi pipeline', toolbar=self.toolbar, handler=EngineViewHandler) return view def _nodes_default(self): """ The default value of the cached nodes list. """ # Now setup the view. nodes = [TreeNode(node_for=[Engine], children='children_ui_list', label='=Mayavi', auto_open=False, copy=False, delete=False, rename=True, ), ObjectTreeNode(node_for=[Base], children='children_ui_list', label='name', auto_open=True, copy=True, delete=True, rename=True, tooltip='=Right click for more options', ), AdderTreeNode(node_for=[SceneAdderNode], icon_item='add_scene.png', ), AdderTreeNode(node_for=[SourceAdderNode], icon_item='add_source.png', ), AdderTreeNode(node_for=[ModuleFilterAdderNode], icon_item='add_module.png', ), ] return nodes def _tree_editor_default(self): return TreeEditor(editable=False, hide_root=True, on_dclick='handler._on_dclick', on_select='handler._on_select', orientation='vertical', selected='object.engine.current_selection', nodes=self.nodes ) def _toolbar_default(self): toolbar = ToolBar(*self.actions) toolbar.image_size = (16, 16) toolbar.show_tool_names = False toolbar.show_divider = False return toolbar def _actions_default(self): add_scene = \ Action( image=ImageResource('add_scene.png', search_path=self._image_path), tooltip="Create a new scene", defined_when='True', enabled_when='True', perform=self._perform_new_scene, ) add_source = \ Action( image=ImageResource('add_source.png', search_path=self._image_path), tooltip="Add a data source", defined_when='True', enabled_when='len(scenes) > 0', perform=self._perform_add_source, ) add_module = \ Action( image=ImageResource('add_module.png', search_path=self._image_path), tooltip="Add a visualization module", defined_when='True', # isinstance doesn't work in enabled_when enabled_when=\ 'current_selection is not None and' '( hasattr(current_selection, "output_info")' 'or current_selection.__class__.__name__ ==' '"ModuleFilterAdderNode")', perform=self._perform_add_module, ) add_filter = \ Action( image=ImageResource('add_filter.png', search_path=self._image_path), tooltip="Add a processing filter", defined_when='True', enabled_when=\ 'current_selection is not None and' '( ( hasattr(current_selection, "output_info")' ' and not current_selection.type in (" module", ' ' " module manager"))' 'or current_selection.__class__.__name__ ==' '"ModuleFilterAdderNode")', perform=self._perform_add_filter, ) help = \ Action( image=ImageResource('help-action.png', search_path=self._image_path), tooltip="Help on the Mayavi pipeline", defined_when='True', enabled_when='True', perform=open_help_index, ) tvtk_docs = \ Action( image=ImageResource('reader.png', search_path=self._image_path), tooltip="Search the VTK class browser", defined_when='True', enabled_when='True', perform=open_tvtk_docs, ) record = \ Action( image=ImageResource('record.png', search_path=self._image_path), tooltip="Start/Stop script recording", style='toggle', checked=False, defined_when='True', enabled_when='engine is not None', perform=self._perform_record, ) # Check the record icon if the engine already has a recorder # set. if self.engine is not None and self.engine.recorder is not None: record.checked = True return [tvtk_docs, Separator(), add_scene, add_source, add_module, add_filter, Separator(), help, record] ########################################################################### # Private interface. ########################################################################### def _perform_new_scene(self): self.engine.new_scene() self.engine.current_selection = self.engine.current_scene def _perform_add_source(self): adder = SourceAdderNode(object=self.engine.current_scene) adder.edit_traits(view=adder.dialog_view()) def _perform_add_module(self): object = self.engine.current_selection if isinstance(object, AdderNode): object = object.object adder = ModuleAdderNode(object=object) adder.edit_traits(view=adder.dialog_view()) def _perform_add_filter(self): object = self.engine.current_selection if isinstance(object, AdderNode): object = object.object adder = FilterAdderNode(object=object) adder.edit_traits(view=adder.dialog_view()) def _perform_record(self): e = self.engine if e.recorder is None: start_recording(e, known=True, script_id='engine') else: stop_recording(e, save=False) def _recorder_changed_for_engine(self, recorder): """Called when the recorder trait on the engine trait of this object changes. This basically toggles the recording action when someone attaches a recorder to the engine. """ record_action = None for action in self.actions: if hasattr(action, 'tooltip') and \ action.tooltip.endswith('recording'): record_action = action break if record_action is not None: if recorder is not None: record_action.checked = True else: record_action.checked = False ### EOF ###################################################################### mayavi-4.5.0/mayavi/core/ui/images/0000755000076500000240000000000012747722127017525 5ustar prabhustaff00000000000000mayavi-4.5.0/mayavi/core/ui/images/add.ico0000644000076500000240000000217612747716314020760 0ustar prabhustaff00000000000000h(  3f$IEmYVDl]GGV_GGYbGF[fȣʤȣȣȣȣ¥¥=d@h@hW{^(Qne=f+rrSSkjbbJLOйyIR8Tu""sW6_ym󑷹ܤ[Ԩ&TUM z>j罎c6bJ0gN5(6aeS1ጪ_~="QU~sb.D- r;ghn˘ K}]GA§gd~0i[l0o1on\Mf }Z=u_tw PVUy)IUNK[-h=!6x):@26BAle hgVgMx_XvG5MTW1 \D"~zyBKt+l_ V%>1IENDB`mayavi-4.5.0/mayavi/core/ui/images/add_module.png0000644000076500000240000000136012747716314022331 0ustar prabhustaff00000000000000PNG  IHDRasRGBbKGD pHYs  tIME2OpIDAT8˥[HQ3;3gf+q+j("znPHCEXkB^)&aAemflvqT8w>$byAa,kHݛO n}6g^H0P 2plp#PaOzYg4vMŻAWϿ1>4˔3\ۂ7';jDϡ~Py50QRIȅ o*C= Z[u-%f|ұ=b52S;\G!sIipH j6TQސņ'2(.iFBAOHc)5ì5ǧJ[@*5bF`@%VkRRPC|э:SP4, $ugPU'.`yОڕHD*.6q-=P"xS2s:P^w'ʏ*WKQĨȣ~H?LB(">ք%s@ o4|m |ųN'd҉WY t *`jO?#A=#NGYIENDB`mayavi-4.5.0/mayavi/core/ui/images/add_scene.png0000644000076500000240000000104412747716314022140 0ustar prabhustaff00000000000000PNG  IHDRasRGBbKGD pHYs  tIME 0SIDAT8˥?HQ?.GN)Rl*Xpp&qNMZ\B$:6`pi ApIqU&! : wzbQt=mL}9h$> @ I:' VАR 1Q*%DtUA V"aAmq+Xݳsj֬ݡ+%b?5\ 8dAag 9^ q @R\)sD AM,g7% G7aO38fw{FVXZ^T[^>e}&@::I3д>Wh ?XZM}}N繁f Nj\a=t:-k+yĿ"sA ]yl;9IENDB`mayavi-4.5.0/mayavi/core/ui/images/add_source.png0000644000076500000240000000105412747716314022344 0ustar prabhustaff00000000000000PNG  IHDRasRGBbKGD pHYs  tIME4gIDAT8˥=hSQ~7+ .NAAH.vVı[q\ܚ\t"*h J+(R*J4{3p|ҼZXD1 "EPKW3N@(P5 P#z;xy8$vHIT15sE󎬗B\Exq.hqa)Dqd|[sؚZsa0rWtwOĔG+؟a0'e]$xGHW.^_0;3CJIUzZpkqB`40xDn|yl6=Ygco`j9b/ f)|nݓGT**@.nE;OJ׭Rt7KIENDB`mayavi-4.5.0/mayavi/core/ui/images/help-action.png0000644000076500000240000000162512747716314022443 0ustar prabhustaff00000000000000PNG  IHDRasBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDAT8eML\Us3L#2TUc+jsa(+]]"*]&D7.\ш`Re w={ t闼y6(8:c٦d2!n^VJ;ݛ.G'&>/z~/u>>;a;b,x"%㴖~%]=OMsJ:uW|̂z9 [w^3m(B6eiveEт(FP$OdF{N K܈Qn*V3t^ B$׌aٺpȫzt 5<38ێ,CkHga;HSq%W˞qW^cU17:]`h4M+Q0Pq4ff9X MnZ:DøT 'qkdE3 1V2O櫛W!Pv!Sj= RD bT5-Oܨ,maWYQqn2ҍXhv/e7ԈuvÒf@S,rff~]ˍICc֞ v=4̩"=>:3/IƼYYYP:PSM[jdW\TaZRvg`E^WO4 #KICf~v^ncV/"kX3rnLiƃD0'QRJ}qqtD_[m~WhnǺ?x~tnƬiL^dn]*/$j_m]UD8jatWucZhHKdHpKW?fa9xl`]oLh{FheCXxQ[~V| x?(  LW=i& )+egzW e[OKT9}azp]+iY:\lLaWgq@%$OkF\[AL2(?(, AQ9,d~N_|Wjh|Woc-jie{cjsLrMmδoվp`zAbaAe0lstub97*Y$_h[w|nZG;LxrUQGEN=3T=;5,F9 W]U¹v9E@gy6 . &!+9)"E:1LA8TKBc]Uxjcc?'+ # (1 9 AIQaF/o^C²Gws, %"Yb\ye\L>c0uOjuBf}UǾACXR0/ *C:3uqlr^(gzE]c`Vk{q3 1 xztpl˰lxFbR]c]cmku}RPF9 C*!}urnҺlhzF]b]c^[CRF5oԾspC@j{uroԾols@bX_bbYfomδp`~oHM0%orqonniy_dG_iGRfG& btjŦmɯU*Ob[QazgfiZ \D457&;a{emLgJ&C;+!JS7^ki~Kq_)~t[MW:__f~IgoLEW9j\`hzZ??(0 b{Rd{PdlO?SfGlk6mjjĥ_p`\iFtUlmжoԼl{SU;nm?hnqrsp;cC)Z6(tvy{u\^PCOmr@MKBKM0%sN-"@[f]sWTK< 5 QQIlƽź_vC(1 *#"(0 <L8.TH>`XMxiaBSN9s/ ( "+ 5 9@GNW gT5r_DAnNJE80)#"jzn`pb]5 l>q\&fMjxSs]ld, )X_XwsoԽpsHnf0cO]cdSCXQDzK@71 0 }uqnѹlir=_[]c]cgu}{:7 SSJwspmͲkoeK]c]c]]isv^zn?= y~xtqnҹmiu@_[]d_Z9E-@OBIn϶psL&DTSH~|xtqlhxmxPjyMc[IaDpcjkȫnзfLK e_WbmhkƨZ>.R^N@`sehs`( ^;&93)01!1`uc}qY'lI}p`GO4~]gfRpb+kgGIQ5^`dMbpH>K1F\_a{W???( @ `|Td{KXmImOdEhwBmi3hfcnR?\pKnf0qn(U\[Mux{}~~e?[L?QM ufHF=MITH=yS9.E@h~ƼURNFB= : }o--(J.%: 5 3 HB;\ler}^vpKb]ou7 2 , '# !%*0 5 C(OA8WOEa[RφvqrޏND<0 *%%*0 5 ; AFLQ \B0eTA멒/ *$!- TXPXaYV[RUUKUPEM&MS\ h7s\)hd?{iUunTXO*&#"PRKyk`hXa7l>tUlk5dN^XSoq, )'7$xtqnиnnDq\&ir=bS]c]_`&1-y^nf/ - , p}vspnзlnh3gzE_\]c]ce{JQvmxD/&3 1 8ytroֿmͳj¢kn9cO]c]c]c^Xhu{u: 7 6 czq{usqnӺlʮk~gyC`Y]c]c]cdxV+4.oоsv{XbW=< ?|vtroֿmδmjs=cO]c]c]`iz[Pn`prtrFB@a}s~zvtrpnp_ml7fJ`ad^@R8VdnѷpqbHFI lqqpnmkjifzbjQkkI[eDRaD7B0"hlʮnзoֿU9+LJ\UK:F7_hjäkɬfRPU7* _q[fgi`H1WVg^S]y[dehie1a) bUA\_a{d}rT!nBgW5 \d_pj}Jq[%oa.83 %]d`\it>ko:xr\]c`XbPjoRYX\Z?O4B????(0` $boW_~R^rFZhGmpcw1>+LdPgxCko9hzeXrX}^]wThwBkm7og2hhidfo\byOlk6oa+ptCi¢jĥkƨkȫkçXoYdsJp`*sVoTkǪlʮḻmδmжnѸ[shoGtUrJmlFmͲmжnҹoԼoֿpp\zCcf@sJl>gS2nҺoվppqqrrYuBSS8m?f3`+nɳqqrssttt^((8g8`( Y dorstuuuvvv\{bF,Z UV/"tuvxyz{{{z^ti^P?UROjxz|~wIE;SOLUH<}lD U0$MJGf[{RNCKGDC {ź`xt771QI EB?J4*~jSE:C@< 9 YaWsEHJAA=: 7 4 ]kce UQG< 8 5 1 . 1ORKWc\_rkfzmty\lgG^X< 6 3 / , (%#!"#&), 0 3 8E,#MB8SMEXUNygcoasj5 1 - *&# "%(, 0 3 7 ; >BFJ S4'UC6ZPD|v#!;0 , (%!!%(, 0 4 7 ; ?BFJNQU^)cP3d\D{rdQpjl/ + ($ "&)477 8 < @CGKNRW_& g6pEsZ%flBrl]q=( + ($!!' Zd]znbwZOBTY a*i9rIsX!mg1hxB^yOmra)305w, )&#""$z~yusoϻfleA"l>tNq\&lk5gzEbT]d`nLb„- *(&%&dun}xusqoֿmγnyRuRoa+jp:e~I`Y]c]c]yPlŻ/ , *))1|wtsqoվmϵkɬqrAnf0hu@cO^^]c]c]cdsJ'409zm1 . - , , dwpzvtrpoӻmͳkǪlvll6gzEaU]c]c]c]c]_\|z~RSJ3 1 0 / 2}xusqpnѹl̰jƧj~ir=dL_[]c]c]c]c]cx_gw{95 4 3 2 XaX~zvtrqoվmϵlʭjĥjggyCbR]a]c]c]c]c\_'3-= =|ɾ~{xutrqpnҹlͱlmwEit>dL_[]c]c\_WrP &1)@nϸprstuYdXCB@@X`V}zwutsqpnӻnqSod/ko9f|Ga[]cYZ6G1`\zlnзoվprsrIFDDD u~~|zwtqonȺkid_~fbkKjjChqLXgENaC2?,Z`ḻnѷoվpqcJHGGTLB,;7U'41G'%9,  fkȫḻnзoԼpU9+LKJN$33,@-8-fhjäkǪl˰mϵfQONM]VMVkXghiãkƨlʮZ>.SRQV;.Zz`fghig~Z WUV"?:0p\jdeghdF'`( ]# [! YPC !axcdei}Ui9g4d0`P82:(`va{bfusNpEm@gT0 EU:_n`taymo;sVuQqX'xknSiH]g^ldZnf0pa*p`*gcJUhG]d_^gyCjq;ll6]cAShH^abTdLf}HZhCE_?]c^^_X[hJ. WWZV:J0^????( ;L68lWh|d69)`cT~rXKAw~k23"W[RVPEmaBX/7/rB$snm9aYgvcfZ[OnlhzZ`aDT87]sPmi;IB/7V}SkxY??mayavi-4.5.0/mayavi/core/ui/images/preferences.png0000644000076500000240000000677412747716314022553 0ustar prabhustaff00000000000000PNG  IHDRa pHYs   OiCCPPhotoshop ICC profilexڝSgTS=BKKoR RB&*! J!QEEȠQ, !{kּ> H3Q5 B.@ $pd!s#~<<+"x M0B\t8K@zB@F&S`cbP-`'{[! eDh;VEX0fK9-0IWfH  0Q){`##xFW<+*x<$9E[-qWW.(I+6aa@.y24x6_-"bbϫp@t~,/;m%h^ uf@Wp~<5j>{-]cK'Xto(hw?G%fIq^D$.Tʳ?D*A, `6B$BB dr`)B(Ͱ*`/@4Qhp.U=pa( Aa!ڈbX#!H$ ɈQ"K5H1RT UH=r9\F;2G1Q= C7F dt1r=6Ыhڏ>C03l0.B8, c˱" VcϱwE 6wB aAHXLXNH $4 7 Q'"K&b21XH,#/{C7$C2'ITFnR#,4H#dk9, +ȅ3![ b@qS(RjJ4e2AURݨT5ZBRQ4u9̓IKhhitݕNWGw Ljg(gwLӋT071oUX**| J&*/Tު UUT^S}FU3S ԖUPSSg;goT?~YYLOCQ_ cx,!k u5&|v*=9C3J3WRf?qtN (~))4L1e\kXHQG6EYAJ'\'GgSSݧ M=:.kDwn^Loy}/TmG X $ <5qo</QC]@Caaᄑ.ȽJtq]zۯ6iܟ4)Y3sCQ? 0k߬~OCOg#/c/Wװwa>>r><72Y_7ȷOo_C#dz%gA[z|!?:eAAA!h쐭!ΑiP~aa~ 'W?pX15wCsDDDޛg1O9-J5*>.j<74?.fYXXIlK9.*6nl {/]py.,:@LN8A*%w% yg"/6шC\*NH*Mz쑼5y$3,幄'L Lݛ:v m2=:1qB!Mggfvˬen/kY- BTZ(*geWf͉9+̳ې7ᒶKW-X潬j9(xoʿܔĹdff-[n ڴ VE/(ۻCɾUUMfeI?m]Nmq#׹=TR+Gw- 6 U#pDy  :v{vg/jBFS[b[O>zG499?rCd&ˮ/~јѡ򗓿m|x31^VwwO| (hSЧc3-gAMA|Q cHRMz%u0`:o_FIDATxtRklS=vcJ9`lE$c 0BL`LH8(FP!"ujha#1:bq׽sKN89_H7nޱ5$Vl'y}O~uyw7*LBM]dK'ޘΟ}o9'r{u$,R첈w)+/yjNz@Kĝt tk=w8H|DqBsZ'F?t  <4S~]M$5oBf9]2yKvivbBА:("L?xl#t42x|X #Ta( l T"gv1_TE3Q6 Oǐa###ݧ)|7?~ gˠ'!*@@E߿?~koh훫'z/_@'- ߯~A Rgcjo,G+H %  Ѡ}Aq"+_c ҦrOKs1 gdt~1>2 ث@ͻA^ w~o|)7Ms'8`1M {NOa81uE bfdg,lAڇeu5Xĸظ1z- gn`8=wow$݃>@DO7?OXߨGv@e^#rR'V? ^ӛ]+r#@!+ 0Js.dbg 1El@ -kIENDB`mayavi-4.5.0/mayavi/core/ui/images/record.png0000644000076500000240000000106112747716314021510 0ustar prabhustaff00000000000000PNG  IHDRasBIT|d pHYsvv}ՂtEXtSoftwarewww.inkscape.org<IDAT81H[Q> (T.yАT%Ո"KҭKF;CE]J)S(vHJKC^!h"=p{\.WT)₈DkɅX4g]yZ]w??AF$hiiN.2Ý׳BɛVk"^,.3ҸgfˬT_Xm{#LPs̶D,/Nst3ܮccr)!cZ/Tx($ph # Judah De Paula # Copyright (c) 2005-2015, Enthought, Inc. # License: BSD Style. from traits.etsconfig.api import ETSConfig from traitsui.api \ import Item, Group, View, ImageEnumEditor, InstanceEditor, HGroup from mayavi.core.lut_manager import lut_mode_list, \ lut_image_dir def _number_of_lut_cols(): return 1 if ETSConfig.toolkit == 'qt4' else 6 # The view of the LUT Manager object. view = View(Group(Item(name='lut_mode', editor=ImageEnumEditor(values=lut_mode_list(), cols=_number_of_lut_cols(), path=lut_image_dir)), Item(name='file_name', visible_when="lut_mode=='file'"), Item(name='number_of_colors'), Item(name='reverse_lut'), Item(name='lut', show_label=False, editor=InstanceEditor(label='Edit LUT properties', id='mayavi.core.lut_manager.edit_lut')), Item(name='scalar_bar_representation', show_label=False, visible_when='scalar_bar_representation is not None', editor=InstanceEditor(label='Edit Legend representation', id='mayavi.core.lut_manager.edit_represetation')), Item(name='create_lut', show_label=False), Group(Item(name='show_legend'), Group( Item(name='number_of_labels'), enabled_when='show_scalar_bar==True', ), Group( Item(name='shadow'), Item(name='use_default_name'), Item(name='data_name', enabled_when='not object.use_default_name'), HGroup( Item(name='_title_text_property', show_label=False, editor=InstanceEditor(label='Edit bar Title', id='mayavi.core.lut_manager.bar_title_text')), Item(name='_label_text_property', show_label=False, editor=InstanceEditor(label='Edit bar Text', id='mayavi.core.lut_manager.bar_label_text'), label='Edit bar Text'), ), HGroup( Item(name='scalar_bar', show_label=False, editor=InstanceEditor(label='Edit bar Actor', id='mayavi.core.lut_manager.bar_actor'), ), Item(name='scalar_bar_widget', show_label=False, editor=InstanceEditor(label='Edit bar Widget', id='mayavi.core.lut_manager.bar_widget'), ), ), enabled_when='show_scalar_bar==True', ), show_border=True, ), Group( Item(name='use_default_range'), Item(name='data_range', enabled_when='not object.use_default_range'), show_border=True, ), label='LUT (Look Up Table) Manager', ), # Delete this once we're sure we want to keep the new integrated format. # Group(Item(name='_title_text_property', # style='custom', # resizable=True), # show_labels=False, # defined_when='show_scalar_bar==True', # label='Title'), # Group(Item(name='_label_text_property', # style='custom', # resizable=True), # enabled_when='show_scalar_bar==True', # show_labels=False, # label='Labels'), resizable=True, ) mayavi-4.5.0/mayavi/core/ui/mayavi_scene.py0000644000076500000240000000623212747716314021301 0ustar prabhustaff00000000000000""" A viewer for mlab scene. Adds a button to open up the engine. """ # Author: Gael Varoquaux # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. # Standard library imports from os.path import join # Enthought library imports from tvtk.tools.ivtk import IVTK from tvtk.pyface.api import DecoratedScene from traits.api import Callable from pyface.api import ImageResource from pyface.action.api import Action, Group from pyface.resource.api import resource_path # Local imports from mayavi.core.common import error from mayavi.preferences.api import set_scene_preferences, \ get_scene_preferences ############################################################################### # A decorated scene with an additional button. ############################################################################### class MayaviScene(DecoratedScene): """ A scene UI, similar to a decorated scene, but with more buttons. """ image_search_path = [join(resource_path(), 'images'), ] ########################################################################## # Non-public interface. ########################################################################## def show_engine(self): """ Open the engine view corresponding to the engine of the scene. """ from mayavi.core.registry import registry from mayavi.core.ui.engine_rich_view import EngineRichView try: engine = registry.find_scene_engine(self) except TypeError: error('This scene is not managed by Mayavi') return EngineRichView(engine=engine).scene_editing_view(scene=self) ###################################################################### # Trait handlers. ###################################################################### def _actions_default(self): actions = [ Group( Action(tooltip="View the Mayavi pipeline", image=ImageResource('m2', search_path=self.image_search_path), on_perform=self.show_engine, ), ), ] actions.extend(DecoratedScene._actions_default(self)) return actions def mayavi_scene_factory(parent): """A mayavi scene factory that creates a scene with preferences appropriately set.""" p = get_scene_preferences() s = MayaviScene(parent, stereo=p['stereo']) set_scene_preferences(s, p) return s ############################################################################### # A viewer making use of the MayaviScene ############################################################################### class MayaviViewer(IVTK): """ A viewer window for mlab. """ _scene_factory = Callable(mayavi_scene_factory) def _size_default(self): return (400, 300) def viewer_factory(size=(400, 350)): viewer = MayaviViewer() viewer.menu_bar_manager = None viewer.size=size viewer.open() return viewer if __name__ == '__main__': from mayavi.tools.show import show viewer_factory() show() mayavi-4.5.0/mayavi/core/ui/module_manager.py0000644000076500000240000000214712747716314021616 0ustar prabhustaff00000000000000""" Traits View definition file. The view trait of the parent class is extracted from the model definition file. This file can either be exec()ed or imported. See core/base.py:Base.trait_view() for what is currently used. Using exec() allows view changes without needing to restart Mayavi, but is slower than importing. """ # Authors: Prabhu Ramachandran # Judah De Paula # Copyright (c) 2005-2008, Enthought, Inc. # License: BSD Style. from traitsui.api import Item, Group, View, EnumEditor from mayavi.core.module_manager import LUT_DATA_MODE_TYPES view = View(Group(Item('scalar_lut_manager', style='custom'), label='Scalar LUT', show_labels=False, selected=True), Group(Item('vector_lut_manager', style='custom'), label='Vector LUT', show_labels=False), Group(Item('lut_data_mode', style='custom', editor = EnumEditor(values=LUT_DATA_MODE_TYPES)), label='ModuleManager', selected=False), ) mayavi-4.5.0/mayavi/filters/0000755000076500000240000000000012747722127016363 5ustar prabhustaff00000000000000mayavi-4.5.0/mayavi/filters/__init__.py0000644000076500000240000000013212747716314020471 0ustar prabhustaff00000000000000# Author: Prabhu Ramachandran # Copyright (c) 2005, Enthought, Inc. # License: BSD Style. mayavi-4.5.0/mayavi/filters/api.py0000644000076500000240000000334312747716314017512 0ustar prabhustaff00000000000000""" Defines the publicly accessible MayaVi2 filters. """ # Authors: Frederic Petit, Prabhu Ramachandran and Gael Varoquaux # Copyright (c) 2007-2015, Enthought, Inc. # License: BSD Style. from .cell_derivatives import CellDerivatives from .cell_to_point_data import CellToPointData from .collection import Collection from .data_set_clipper import DataSetClipper from .contour import Contour from .cut_plane import CutPlane from .decimatepro import DecimatePro from .delaunay2d import Delaunay2D from .delaunay3d import Delaunay3D from .elevation_filter import ElevationFilter from .extract_edges import ExtractEdges from .extract_grid import ExtractGrid from .extract_tensor_components import ExtractTensorComponents from .extract_unstructured_grid import ExtractUnstructuredGrid from .extract_vector_components import ExtractVectorComponents from .extract_vector_norm import ExtractVectorNorm from .gaussian_splatter import GaussianSplatter from .greedy_terrain_decimation import GreedyTerrainDecimation from .image_change_information import ImageChangeInformation from .image_data_probe import ImageDataProbe from .mask_points import MaskPoints from .optional import Optional from .point_to_cell_data import PointToCellData from .poly_data_normals import PolyDataNormals from .quadric_decimation import QuadricDecimation from .select_output import SelectOutput from .set_active_attribute import SetActiveAttribute from .stripper import Stripper from .threshold import Threshold from .transform_data import TransformData from .triangle_filter import TriangleFilter from .tube import Tube from .user_defined import UserDefined from .vorticity import Vorticity from .warp_scalar import WarpScalar from .warp_vector import WarpVector from .wrapper import Wrapper mayavi-4.5.0/mayavi/filters/cell_derivatives.py0000644000076500000240000000307612747716314022270 0ustar prabhustaff00000000000000# Author: Prabhu Ramachandran # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import Instance from tvtk.api import tvtk # Local imports from mayavi.filters.filter_base import FilterBase from mayavi.core.pipeline_info import PipelineInfo ###################################################################### # `CellDerivatives` class. ###################################################################### class CellDerivatives(FilterBase): """Computes derivatives from input point scalar and vector data and produces cell data on the gradients. Can be used to approximately calcuate the vorticity for example. """ # The version of this class. Used for persistence. __version__ = 0 # The actual TVTK filter that this class manages. filter = Instance(tvtk.CellDerivatives, args=(), allow_none=False, record=True) # Information about what this object can consume. input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']) # Information about what this object can produce. output_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']) def has_output_port(self): """ The filter has an output port.""" return True def get_output_object(self): """ Return the output port.""" return self.filter.output_port mayavi-4.5.0/mayavi/filters/cell_to_point_data.py0000644000076500000240000000446312747716314022570 0ustar prabhustaff00000000000000# Author: Prabhu Ramachandran # Copyright (c) 2006, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import Instance from tvtk.api import tvtk # Local imports from mayavi.filters.filter_base import FilterBase from mayavi.core.pipeline_info import PipelineInfo ###################################################################### # `CellToPointData` class. ###################################################################### class CellToPointData(FilterBase): """Transforms cell attribute data to point data by averaging the cell data from the cells at the point. """ # The version of this class. Used for persistence. __version__ = 0 # The actual TVTK filter that this class manages. filter = Instance(tvtk.CellDataToPointData, args=(), kw={'pass_cell_data':1}, allow_none=False, record=True) # Information about what this object can consume/produce. input_info = PipelineInfo(datasets=['any'], attribute_types=['cell'], attributes=['any']) output_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']) def update_pipeline(self): # Do nothing if there is no input. inputs = self.inputs if len(inputs) == 0: return fil = self.filter input = inputs[0].outputs[0] self.configure_connection(fil, inputs[0]) fil.update() dataset = self.inputs[0].get_output_dataset() # This filter creates different outputs depending on the # input. out_map = {'vtkStructuredGrid': 'structured_grid_output', 'vtkRectilinearGrid': 'rectilinear_grid_output', 'vtkStructuredPoints': 'structured_points_output', 'vtkUnstructuredGrid': 'unstructured_grid_output', 'vtkPolyData': 'poly_data_output', 'vtkImageData': 'image_data_output'} # Find the input data type and pass that to our output.. for type in out_map: if dataset.is_a(type): self._set_outputs([getattr(fil, out_map[type])]) break mayavi-4.5.0/mayavi/filters/collection.py0000644000076500000240000001515312747716314021076 0ustar prabhustaff00000000000000"""Defines a Collection filter which is a collection of mayavi filters/components bundled into one. """ # Author: Prabhu Ramachandran # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import Instance, Bool, List from traitsui.api import Item, Group, View, ListEditor # Local imports. from mayavi.core.pipeline_base import PipelineBase from mayavi.core.filter import Filter from mayavi.core.common import handle_children_state ################################################################################ # `Collection` class. ################################################################################ class Collection(Filter): """ Defines a Collection filter which is a collection of mayavi filters/components bundled into one. """ # The filters we manage. filters = List(Instance(PipelineBase), record=True) ######################################## # Private traits. # Is the pipeline ready? Used internally. _pipeline_ready = Bool(False) ###################################################################### # `object` interface. ###################################################################### def __set_pure_state__(self, state): # Create and set the filters. handle_children_state(self.filters, state.filters) # Restore our state using the super class method. super(Collection, self).__set_pure_state__(state) ###################################################################### # HasTraits interface. ###################################################################### def default_traits_view(self): """Returns the default traits view for this object.""" le = ListEditor(use_notebook=True, deletable=False, export='DockWindowShell', page_name='.name') view = View(Group(Item(name='filters', style='custom', show_label=False, editor=le, resizable=True), show_labels=False), resizable=True) return view ###################################################################### # `Filter` interface. ###################################################################### def setup_pipeline(self): """Setup the pipeline.""" # Needed because a user may have defined the filters by setting # the default value of the trait in the subclass in which case # the filters_changed handler will never be called leading to # problems. if len(self.filters) > 0 and not self._pipeline_ready: self._filters_changed([], self.filters) def stop(self): # There is no need to override start since the wrapped filters # are always started automatically in the filters_changed # handler. super(Collection, self).stop() for filter in self.filters: filter.stop() def update_pipeline(self): """This method *updates* the tvtk pipeline when data upstream is known to have changed. This method is invoked (automatically) when the input fires a `pipeline_changed` event. """ self._setup_pipeline() # Propagate the event. self.pipeline_changed = True def update_data(self): """This method does what is necessary when upstream data changes. This method is invoked (automatically) when any of the inputs sends a `data_changed` event. """ # Propagate the data_changed event. self.data_changed = True ###################################################################### # Private interface. ###################################################################### def _setup_pipeline(self): """Sets up the objects in the pipeline.""" if len(self.inputs) == 0 or len(self.filters) == 0: return # Our input. my_input = self.inputs[0] filters = self.filters if not self._pipeline_ready: # Hook up our first filter. first = self.filters[0] first.inputs = [my_input] # Hook up the others to each other. for i in range(1, len(filters)): filter = filters[i] filter.inputs = [filters[i-1]] self._pipeline_ready = True # Start filters. for filter in filters: filter.start() # Set our outputs last = filters[-1] self._set_outputs(last.outputs) def _filters_changed(self, old, new): """Static traits handler.""" self._handle_filters_changed(old, new) def _filters_items_changed(self, list_event): """Static traits handler.""" self._handle_filters_changed(list_event.removed, list_event.added) def _scene_changed(self, old, new): """Static traits handler.""" for filter in self.filters: filter.scene = new super(Collection, self)._scene_changed(old, new) def _handle_filters_changed(self, removed, added): for filter in removed: self._setup_events(filter, remove=True) filter.stop() for filter in added: if self.scene is not None: filter.scene = self.scene if len(filter.name) == 0: filter.name = filter.__class__.__name__ if filter is self.filters[-1]: self._setup_events(filter) self._pipeline_ready = False self._setup_pipeline() def _fire_pipeline_changed(self): # When the last filter fires a pipeline changed we should reset # our outputs to that of its outputs. Calling _setup_pipeline # is expensive and will cause a recursion error. self._set_outputs(self.filters[-1].outputs) def _setup_events(self, obj, remove=False): obj.on_trait_change(self.update_data, 'data_changed', remove=remove) obj.on_trait_change(self._fire_pipeline_changed, 'pipeline_changed', remove=remove) def _visible_changed(self, value): for filter in self.filters: filter.visible = value super(Collection, self)._visible_changed(value) def _recorder_changed(self, old, new): super(Collection, self)._recorder_changed(old, new) for filter in self.filters: filter.recorder = new mayavi-4.5.0/mayavi/filters/contour.py0000644000076500000240000000225512747716314020433 0ustar prabhustaff00000000000000# Author: Prabhu Ramachandran # Copyright (c) 2008, Prabhu Ramachandran # License: BSD Style. # Enthought library imports. from traits.api import Instance # Local imports. from mayavi.components.contour import Contour as ContourComponent from mayavi.core.pipeline_info import PipelineInfo from mayavi.filters.wrapper import Wrapper ################################################################################ # `Contour` class. ################################################################################ class Contour(Wrapper): """ A contour filter that wraps around the Contour component to generate iso-surfaces on any input dataset. """ # The version of this class. Used for persistence. __version__ = 0 # The contour component this wraps. filter = Instance(ContourComponent, args=(), record=True) input_info = PipelineInfo(datasets=['any'], attribute_types=['point'], attributes=['any']) output_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']) mayavi-4.5.0/mayavi/filters/cut_plane.py0000644000076500000240000000273412747716314020716 0ustar prabhustaff00000000000000# Author: Prabhu Ramachandran # Copyright (c) 2008, Prabhu Ramachandran # License: BSD Style. # Local imports. from mayavi.components.cutter import Cutter from mayavi.components.implicit_plane import ImplicitPlane from mayavi.filters.collection import Collection from mayavi.core.pipeline_info import PipelineInfo ################################################################################ # `CutPlane` class. ################################################################################ class CutPlane(Collection): """ This class represents a cut plane that can be used to slice through any dataset. It also provides a 3D widget interface to position and move the slice interactively. """ # The version of this class. Used for persistence. __version__ = 0 input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']) output_info = PipelineInfo(datasets=['poly_data'], attribute_types=['any'], attributes=['any']) ###################################################################### # `Filter` interface. ###################################################################### def setup_pipeline(self): """Creates the pipeline.""" ip = ImplicitPlane() cut = Cutter(cut_function=ip.plane) self.filters = [ip, cut] mayavi-4.5.0/mayavi/filters/data_set_clipper.py0000644000076500000240000001422612747716314022245 0ustar prabhustaff00000000000000"""This filter enables one to clip a selection from an input dataset using various Implicit Widgets. """ # Author: Suyog Dutt Jain # Prabhu Ramachandran # Copyright (c) 2009-2016, Enthought, Inc. # License: BSD Style. # Standard library imports. try: import cPickle except ImportError: import pickle as cPickle # Enthought library imports. from traits.api import Instance, Button, Delegate from traitsui.api import View, Group, Item from apptools.persistence import state_pickler from tvtk.api import tvtk # Local imports from mayavi.core.filter import Filter from mayavi.core.pipeline_info import PipelineInfo from mayavi.components.implicit_widgets import ImplicitWidgets ###################################################################### # `DataSetClipper` class. ###################################################################### class DataSetClipper(Filter): # The version of this class. Used for persistence. __version__ = 0 # The widgets to be used for the Clipping Filter. widget = Instance(ImplicitWidgets, allow_none=False, record=True) # The clipping filter. filter = Instance(tvtk.Object, allow_none=False, record=True) # The update mode of the widget-- this is delegated to the # ImplicitWidgets. update_mode = Delegate('widget', modify=True) input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']) output_info = PipelineInfo(datasets=['any'], attributes=['any']) ######################################## # View related traits. # Button to reset the boundaries of the implicit_widget. reset_button = Button('Reset Boundaries') view = View(Group(Group(Item('update_mode'), ), Group(Item('reset_button'), Item(name='widget', style='custom', resizable=True), show_labels=False ), label='ImplicitWidget' ), Group(Group(Item('filter', style='custom'), show_labels=False), label='Clipper' ), resizable=True ) ######################################## # Private traits. _transform = Instance(tvtk.Transform, allow_none=False) ###################################################################### # `object` interface. ###################################################################### def __get_pure_state__(self): d = super(DataSetClipper, self).__get_pure_state__() for name in ('_first', '_observer_id'): d.pop(name, None) d['matrix'] = cPickle.dumps(self._transform.matrix) return d def __set_pure_state__(self, state): mat = state.pop('matrix') super(DataSetClipper, self).__set_pure_state__(state) state_pickler.set_state(self, state) self._transform.set_matrix(cPickle.loads(mat)) self.widget.set_transform(self._transform) ###################################################################### # `Filter` interface ###################################################################### def setup_pipeline(self): self.widget = ImplicitWidgets() self._transform = tvtk.Transform() self.filter = tvtk.ClipDataSet() self.widget.on_trait_change(self._handle_widget, 'widget') super(DataSetClipper, self).setup_pipeline() def update_pipeline(self): inputs = self.inputs if len(inputs) == 0: return widget = self.widget widget.inputs = inputs widget.update_pipeline() filter = self.filter self.configure_connection(filter, inputs[0]) widget.update_implicit_function() filter.clip_function = widget.implicit_function filter.update() self._set_outputs([filter]) self.pipeline_changed = True def update_data(self): # Do nothing if there is no input. if len(self.inputs) == 0: return self.filter.update() # Propagate the data_changed event. self.data_changed = True ###################################################################### # Non-public methods. ###################################################################### def _on_interaction_event(self, obj, event): tfm = self._transform self.widget.widget.get_transform(tfm) recorder = self.recorder if recorder is not None: state = {} state['elements'] = tfm.matrix.__getstate__()['elements'] name = recorder.get_script_id(self) recorder.record('%s._transform.matrix.__setstate__(%s)'\ %(name, state)) recorder.record('%s.widget.widget.set_transform(%s._transform)'\ %(name, name)) recorder.record('%s.widget.update_implicit_function()' % name) recorder.record('%s.render()' % name) def _widget_changed(self, old, new): self.widgets = self.widget.widgets if len(self.inputs) > 0: new.inputs = self.inputs new.update_pipeline() self._observer_id = new.widget.add_observer(self.update_mode_, self._on_interaction_event) def _filter_changed(self, old, new): if old is not None: old.on_trait_change(self.render, remove=True) new.on_trait_change(self.render) if len(self.inputs) > 0: self.configure_connection(new, self.inputs[0]) self.outputs = [new] def _reset_button_fired(self): self.widget.widget.place_widget() self.widget.update_implicit_function() self.filter.update() self.render() def _handle_widget(self, value): self.widgets = self.widget.widgets f = self.filter f.clip_function = self.widget.implicit_function f.update() self.update_pipeline() mayavi-4.5.0/mayavi/filters/decimatepro.py0000644000076500000240000000222312747716314021231 0ustar prabhustaff00000000000000# Author: Gael Varoquaux # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import Instance from tvtk.api import tvtk # Local imports from mayavi.filters.filter_base import FilterBase from mayavi.core.pipeline_info import PipelineInfo ###################################################################### # `DecimatePro` class. ###################################################################### class DecimatePro(FilterBase): """ Reduces the number of triangles in a mesh using the tvtk.DecimatePro class. """ # The version of this class. Used for persistence. __version__ = 0 # The actual TVTK filter that this class manages. filter = Instance(tvtk.DecimatePro, args=(), allow_none=False, record=True) input_info = PipelineInfo(datasets=['poly_data'], attribute_types=['any'], attributes=['any']) output_info = PipelineInfo(datasets=['poly_data'], attribute_types=['any'], attributes=['any']) mayavi-4.5.0/mayavi/filters/delaunay2d.py0000644000076500000240000000232012747716314020763 0ustar prabhustaff00000000000000# Author: Prabhu Ramachandran # Copyright (c) 2006, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import Instance from tvtk.api import tvtk # Local imports from mayavi.filters.filter_base import FilterBase from mayavi.core.pipeline_info import PipelineInfo ###################################################################### # `Delaunay2D` class. ###################################################################### class Delaunay2D(FilterBase): """Performs a 2D Delaunay triangulation using the tvtk.Delaunay2D class. """ # The version of this class. Used for persistence. __version__ = 0 # The actual TVTK filter that this class manages. filter = Instance(tvtk.Delaunay2D, args=(), allow_none=False, record=True) input_info = PipelineInfo(datasets=['structured_grid', 'poly_data', 'unstructured_grid'], attribute_types=['any'], attributes=['any']) output_info = PipelineInfo(datasets=['poly_data'], attribute_types=['any'], attributes=['any']) mayavi-4.5.0/mayavi/filters/delaunay3d.py0000644000076500000240000000233012747716314020765 0ustar prabhustaff00000000000000# Author: Prabhu Ramachandran # Copyright (c) 2006, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import Instance from tvtk.api import tvtk # Local imports from mayavi.filters.filter_base import FilterBase from mayavi.core.pipeline_info import PipelineInfo ###################################################################### # `Delaunay3D` class. ###################################################################### class Delaunay3D(FilterBase): """Performs a 3D Delaunay triangulation using the tvtk.Delaunay3D class. """ # The version of this class. Used for persistence. __version__ = 0 # The actual TVTK filter that this class manages. filter = Instance(tvtk.Delaunay3D, args=(), allow_none=False, record=True) input_info = PipelineInfo(datasets=['structured_grid', 'poly_data', 'unstructured_grid'], attribute_types=['any'], attributes=['any']) output_info = PipelineInfo(datasets=['unstructured_grid'], attribute_types=['any'], attributes=['any']) mayavi-4.5.0/mayavi/filters/elevation_filter.py0000644000076500000240000000217412747716314022275 0ustar prabhustaff00000000000000# Author: Gael Varoquaux # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import Instance from tvtk.api import tvtk # Local imports from mayavi.filters.filter_base import FilterBase from mayavi.core.pipeline_info import PipelineInfo ###################################################################### # `ElevationFilter` class. ###################################################################### class ElevationFilter(FilterBase): """ Generate scalar data from the elevation in a given direction """ # The version of this class. Used for persistence. __version__ = 0 # The actual TVTK filter that this class manages. filter = Instance(tvtk.ElevationFilter, args=(), allow_none=False, record=True) input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']) output_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']) mayavi-4.5.0/mayavi/filters/extract_edges.py0000644000076500000240000000210612747716314021556 0ustar prabhustaff00000000000000# Author: Gael Varoquaux # Copyright (c) 2007, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import Instance from tvtk.api import tvtk # Local imports from mayavi.filters.filter_base import FilterBase from mayavi.core.pipeline_info import PipelineInfo ###################################################################### # `ExtractEdges` class. ###################################################################### class ExtractEdges(FilterBase): """Turns edges into lines. """ # The version of this class. Used for persistence. __version__ = 0 # The actual TVTK filter that this class manages. filter = Instance(tvtk.ExtractEdges, args=(), allow_none=False, record=True) input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']) output_info = PipelineInfo(datasets=['poly_data'], attribute_types=['any'], attributes=['any']) mayavi-4.5.0/mayavi/filters/extract_grid.py0000644000076500000240000002152012747716314021415 0ustar prabhustaff00000000000000"""This filter enables one to select a portion of, or subsample an input dataset which may be a StructuredPoints, StructuredGrid or Rectilinear. """ # Author: Prabhu Ramachandran # Copyright (c) 2007-2015, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import Instance, Int, Range from traitsui.api import View, Group, Item from tvtk.api import tvtk # Local imports from mayavi.core.common import error from mayavi.filters.filter_base import FilterBase from mayavi.core.pipeline_info import PipelineInfo from tvtk.common import is_old_pipeline ###################################################################### # `ExtractGrid` class. ###################################################################### class ExtractGrid(FilterBase): """This filter enables one to select a portion of, or subsample an input dataset which may be a StructuredPoints, StructuredGrid or Rectilinear. """ # The version of this class. Used for persistence. __version__ = 0 # Minimum x value. x_min = Range(value=0, low='_x_low', high='_x_high', enter_set=True, auto_set=False, desc='minimum x value of the domain') # Maximum x value. x_max = Range(value=10000, low='_x_low', high='_x_high', enter_set=True, auto_set=False, desc='maximum x value of the domain') # Minimum y value. y_min = Range(value=0, low='_y_low', high='_y_high', enter_set=True, auto_set=False, desc='minimum y value of the domain') # Maximum y value. y_max = Range(value=10000, low='_y_low', high='_y_high', enter_set=True, auto_set=False, desc='maximum y value of the domain') # Minimum z value. z_min = Range(value=0, low='_z_low', high='_z_high', enter_set=True, auto_set=False, desc='minimum z value of the domain') # Maximum z value. z_max = Range(value=10000, low='_z_low', high='_z_high', enter_set=True, auto_set=False, desc='maximum z value of the domain') # Sample rate in x. x_ratio = Range(value=1, low='_min_sample', high='_x_s_high', enter_set=True, auto_set=False, desc='sample rate along x') # Sample rate in y. y_ratio = Range(value=1, low='_min_sample', high='_y_s_high', enter_set=True, auto_set=False, desc='sample rate along y') # Sample rate in z. z_ratio = Range(value=1, low='_min_sample', high='_z_s_high', enter_set=True, auto_set=False, desc='sample rate along z') # The actual TVTK filter that this class manages. filter = Instance(tvtk.Object, tvtk.ExtractVOI(), allow_none=False) input_info = PipelineInfo(datasets=['image_data', 'rectilinear_grid', 'structured_grid'], attribute_types=['any'], attributes=['any']) output_info = PipelineInfo(datasets=['image_data', 'rectilinear_grid', 'structured_grid'], attribute_types=['any'], attributes=['any']) ######################################## # Private traits. # Determines the lower/upper limit of the axes for the sliders. _min_sample = Int(1) _x_low = Int(0) _x_high = Int(10000) _x_s_high = Int(100) _y_low = Int(0) _y_high = Int(10000) _y_s_high = Int(100) _z_low = Int(0) _z_high = Int(10000) _z_s_high = Int(100) ######################################## # View related traits. # The View for this object. view = View(Group(Item(label='Select Volume Of Interest'), Item(name='x_min'), Item(name='x_max'), Item(name='y_min'), Item(name='y_max'), Item(name='z_min'), Item(name='z_max'), Item('_'), Item(label='Select Sample Ratio'), Item(name='x_ratio'), Item(name='y_ratio'), Item(name='z_ratio'), label='VOI' ), Group(Item(name='filter', style='custom', resizable=True), show_labels=False, label='Filter'), resizable=True, ) ###################################################################### # `object` interface ###################################################################### def __get_pure_state__(self): d = super(ExtractGrid, self).__get_pure_state__() for axis in ('x', 'y', 'z'): for name in ('_min', '_max'): d.pop(axis + name, None) d.pop('_' + axis + '_low', None) d.pop('_' + axis + '_high', None) d.pop('_' + axis + '_s_high', None) d.pop(axis + '_ratio', None) return d ###################################################################### # `Filter` interface ###################################################################### def update_pipeline(self): inputs = self.inputs if len(inputs) == 0: return input = inputs[0].get_output_dataset() mapping = {'vtkStructuredGrid': tvtk.ExtractGrid, 'vtkRectilinearGrid': tvtk.ExtractRectilinearGrid, 'vtkImageData': tvtk.ExtractVOI} for key, klass in mapping.items(): if input.is_a(key): self.filter = klass() break else: error('This filter does not support %s objects'%\ (input.__class__.__name__)) return fil = self.filter self.configure_connection(fil, inputs[0]) fil.update_whole_extent() fil.update() self._set_outputs([fil]) self._update_limits() self._update_voi() self._update_sample_rate() def update_data(self): """This method is invoked (automatically) when any of the inputs sends a `data_changed` event. """ self._update_limits() fil = self.filter fil.update_whole_extent() fil.update() # Propagate the data_changed event. self.data_changed = True ###################################################################### # Non-public methods. ###################################################################### def _update_limits(self): if is_old_pipeline(): extents = self.filter.input.whole_extent else: extents = self.filter.get_update_extent() self._x_low, self._x_high = extents[:2] self._y_low, self._y_high = extents[2:4] self._z_low, self._z_high = extents[4:] self._x_s_high = max(1, self._x_high) self._y_s_high = max(1, self._y_high) self._z_s_high = max(1, self._z_high) def _x_min_changed(self, val): if val > self.x_max: self.x_max = val else: self._update_voi() def _x_max_changed(self, val): if val < self.x_min: self.x_min = val else: self._update_voi() def _y_min_changed(self, val): if val > self.y_max: self.y_max = val else: self._update_voi() def _y_max_changed(self, val): if val < self.y_min: self.y_min = val else: self._update_voi() def _z_min_changed(self, val): if val > self.z_max: self.z_max = val else: self._update_voi() def _z_max_changed(self, val): if val < self.z_min: self.z_min = val else: self._update_voi() def _x_ratio_changed(self): self._update_sample_rate() def _y_ratio_changed(self): self._update_sample_rate() def _z_ratio_changed(self): self._update_sample_rate() def _update_voi(self): f = self.filter f.voi = (self.x_min, self.x_max, self.y_min, self.y_max, self.z_min, self.z_max) f.update_whole_extent() f.update() self.data_changed = True def _update_sample_rate(self): f = self.filter f.sample_rate = (self.x_ratio, self.y_ratio, self.z_ratio) f.update_whole_extent() f.update() self.data_changed = True def _filter_changed(self, old, new): if old is not None: old.on_trait_change(self.render, remove=True) new.on_trait_change(self.render) mayavi-4.5.0/mayavi/filters/extract_tensor_components.py0000644000076500000240000000256012747716314024252 0ustar prabhustaff00000000000000# Author: Prabhu Ramachandran # Copyright (c) 2007, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import Instance from tvtk.api import tvtk # Local imports from mayavi.filters.filter_base import FilterBase from mayavi.core.pipeline_info import PipelineInfo ###################################################################### # `ExtractTensorComponents` class. ###################################################################### class ExtractTensorComponents(FilterBase): """Wraps the TVTK ExtractTensorComponents filter to extract components from a tensor field. """ # The version of this class. Used for persistence. __version__ = 0 # The actual TVTK filter that this class manages. filter = Instance(tvtk.ExtractTensorComponents, args=(), kw={'pass_tensors_to_output':True, 'scalar_mode': 'effective_stress', 'extract_scalars': True}, allow_none=False, record=True) input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['tensors']) output_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']) mayavi-4.5.0/mayavi/filters/extract_unstructured_grid.py0000644000076500000240000000227112747716314024246 0ustar prabhustaff00000000000000# Author: Prabhu Ramachandran # Copyright (c) 2006, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import Instance from tvtk.api import tvtk # Local imports from mayavi.filters.filter_base import FilterBase from mayavi.core.pipeline_info import PipelineInfo ###################################################################### # `ExtractUnstructuredGrid` class. ###################################################################### class ExtractUnstructuredGrid(FilterBase): """Allows a user to select a part of an unstructured grid. """ # The version of this class. Used for persistence. __version__ = 0 # The actual TVTK filter that this class manages. filter = Instance(tvtk.ExtractUnstructuredGrid, args=(), allow_none=False, record=True) input_info = PipelineInfo(datasets=['unstructured_grid'], attribute_types=['any'], attributes=['any']) output_info = PipelineInfo(datasets=['unstructured_grid'], attribute_types=['any'], attributes=['any']) mayavi-4.5.0/mayavi/filters/extract_vector_components.py0000644000076500000240000000525012747716314024241 0ustar prabhustaff00000000000000# Author: Varun Hiremath # Enthought library imports. from traits.api import Instance, Enum from traitsui.api import View, Group, Item from tvtk.api import tvtk # Local imports from mayavi.filters.filter_base import FilterBase from mayavi.core.pipeline_info import PipelineInfo ###################################################################### # `ExtractVectorComponents` class. ###################################################################### class ExtractVectorComponents(FilterBase): """ This wraps the TVTK ExtractVectorComponents filter and allows one to select any of the three components of an input vector data attribute.""" # The version of this class. Used for persistence. __version__ = 0 # The actual TVTK filter that this class manages. filter = Instance(tvtk.ExtractVectorComponents, args=(), allow_none=False) # The Vector Component to be extracted component = Enum('x-component', 'y-component', 'z-component', desc='component of the vector to be extracted') input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['vectors']) output_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']) view = View(Group(Item(name='component')), resizable=True ) ###################################################################### # `Filter` interface. ###################################################################### def update_pipeline(self): # Do nothing if there is no input. inputs = self.inputs if len(inputs) == 0 or len(inputs[0].outputs) == 0: return fil = self.filter self.configure_connection(fil, inputs[0]) fil.update() self._component_changed(self.component) ###################################################################### # Non-public interface. ###################################################################### def _component_changed(self, value): # Obtain output from the TVTK ExtractVectorComponents filter # corresponding to the selected vector component if len(self.inputs) == 0 or len(self.inputs[0].outputs) == 0: return if value == 'x-component': self._set_outputs([self.filter.vx_component]) elif value == 'y-component': self._set_outputs([self.filter.vy_component]) elif value == 'z-component': self._set_outputs([self.filter.vz_component]) self.render() mayavi-4.5.0/mayavi/filters/extract_vector_norm.py0000644000076500000240000000606612747716314023035 0ustar prabhustaff00000000000000# Author: Prabhu Ramachandran # Copyright (c) 2006, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import Instance from tvtk.api import tvtk # Local imports from mayavi.filters.filter_base import FilterBase from mayavi.core.pipeline_info import PipelineInfo ###################################################################### # `ExtractVectorNorm` class. ###################################################################### class ExtractVectorNorm(FilterBase): """Computes the norm (Eucliedean) of the input vector data (with optional scaling between [0, 1]). This is useful when the input data has vector input but no scalar data for the magnitude of the vectors. """ # The version of this class. Used for persistence. __version__ = 0 # The actual TVTK filter that this class manages. filter = Instance(tvtk.VectorNorm, args=(), allow_none=False, record=True) input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['vectors']) output_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']) ###################################################################### # `Filter` interface. ###################################################################### def update_pipeline(self): # Do nothing if there is no input. inputs = self.inputs if len(inputs) == 0 or len(inputs[0].outputs) == 0: return # By default we set the input to the first output of the first # input. fil = self.filter self.configure_connection(fil, inputs[0]) fil.update() self._set_array_name(fil) self._set_outputs([fil]) def update_data(self): """Override this method to do what is necessary when upstream data changes. This method is invoked (automatically) when any of the inputs sends a `data_changed` event. """ # Do nothing if there is no input. inputs = self.inputs if len(inputs) == 0 or len(inputs[0].outputs) == 0: return self.filter.update() self._set_array_name(self.filter) # Propagate the data_changed event. self.data_changed = True ###################################################################### # Non-public interface. ###################################################################### def _set_array_name(self, filter): # Do nothing if there is no input. if len(self.inputs) == 0 or len(self.inputs[0].outputs) == 0: return o = filter.output pd = o.point_data ps = pd.scalars cd = o.cell_data cs = cd.scalars if (ps is not None) and (not ps.name): ps.name = pd.vectors.name + ' magnitude' elif (cs is not None) and (not cs.name): cs.name = cd.vectors.name + ' magnitude' mayavi-4.5.0/mayavi/filters/filter_base.py0000644000076500000240000000634612747716314021226 0ustar prabhustaff00000000000000"""The base class for many filters. """ # Author: Prabhu Ramachandran # Copyright (c) 2006, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import Instance from traitsui.api import View, Group, Item from tvtk.api import tvtk # Local imports from mayavi.core.filter import Filter ###################################################################### # `FilterBase` class. ###################################################################### class FilterBase(Filter): """The base class for many of the filters. """ # The version of this class. Used for persistence. __version__ = 0 # The actual TVTK filter that this class manages. filter = Instance(tvtk.Object, allow_none=False, record=True) # The view of these filters. view = View(Group(Item(name='filter', style='custom', resizable=True, show_label=False), springy=True), scrollable=True, resizable=True ) ###################################################################### # `Filter` interface. ###################################################################### def setup_pipeline(self): """Override this method so that it *creates* its tvtk pipeline. This method is invoked when the object is initialized via `__init__`. Note that at the time this method is called, the tvtk data pipeline will *not* yet be setup. So upstream data will not be available. The idea is that you simply create the basic objects and setup those parts of the pipeline not dependent on upstream sources and filters. """ f = self.filter if f is not None: # Just hook up the filter so the update_data method is # called when the traits change. f.on_trait_change(self.update_data) def update_pipeline(self): """Override this method so that it *updates* the tvtk pipeline when data upstream is known to have changed. This method is invoked (automatically) when the input fires a `pipeline_changed` event. """ # Do nothing if there is no input. inputs = self.inputs fil = self.filter if len(inputs) == 0 or fil is None: return # By default we set the input to the first output of the first # input. self.configure_connection(fil, inputs[0]) fil.update() self._set_outputs([fil]) def update_data(self): """Override this method to do what is necessary when upstream data changes. This method is invoked (automatically) when any of the inputs sends a `data_changed` event. """ # Do nothing if there is no input and we aren't running. if len(self.inputs) == 0 or not self.running: return self.filter.update() # Propagate the data_changed event. self.data_changed = True def _filter_changed(self, old, new): if old is not None: old.on_trait_change(self.update_data, remove=True) new.on_trait_change(self.update_data) if old is not None: self.update_pipeline() mayavi-4.5.0/mayavi/filters/gaussian_splatter.py0000644000076500000240000000210212747716314022461 0ustar prabhustaff00000000000000# Author: Gael Varoquaux # Copyright (c) 2007, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import Instance from tvtk.api import tvtk # Local imports from mayavi.filters.filter_base import FilterBase from mayavi.core.pipeline_info import PipelineInfo ###################################################################### # `GaussianSplatter` class. ###################################################################### class GaussianSplatter(FilterBase): # The version of this class. Used for persistence. __version__ = 0 # The actual TVTK filter that this class manages. filter = Instance(tvtk.GaussianSplatter, args=(), allow_none=False, record=True) input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']) output_info = PipelineInfo(datasets=['image_data'], attribute_types=['any'], attributes=['any']) mayavi-4.5.0/mayavi/filters/greedy_terrain_decimation.py0000644000076500000240000000226012747716314024135 0ustar prabhustaff00000000000000# Author: Gael Varoquaux # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import Instance from tvtk.api import tvtk # Local imports from mayavi.filters.filter_base import FilterBase from mayavi.core.pipeline_info import PipelineInfo ###################################################################### # `GreedyTerrainDecimation` class. ###################################################################### class GreedyTerrainDecimation(FilterBase): """ Performs a triangulation of image data after simplifying it. """ # The version of this class. Used for persistence. __version__ = 0 # The actual TVTK filter that this class manages. filter = Instance(tvtk.GreedyTerrainDecimation, args=(), allow_none=False, record=True) input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']) output_info = PipelineInfo(datasets=['poly_data'], attribute_types=['any'], attributes=['any']) mayavi-4.5.0/mayavi/filters/image_change_information.py0000644000076500000240000000244212747716314023734 0ustar prabhustaff00000000000000""" A filter that lets you change the spacing and origin of an input ImageData dataset. """ # Author: Prabhu Ramachandran # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import Instance from tvtk.api import tvtk # Local imports from mayavi.filters.filter_base import FilterBase from mayavi.core.pipeline_info import PipelineInfo ###################################################################### # `ImageChangeInformation` class. ###################################################################### class ImageChangeInformation(FilterBase): """ A filter that lets you change the spacing and origin of an input ImageData dataset. """ # The version of this class. Used for persistence. __version__ = 0 # The actual TVTK filter that this class manages. filter = Instance(tvtk.ImageChangeInformation, args=(), allow_none=False, record=True) input_info = PipelineInfo(datasets=['image_data'], attribute_types=['any'], attributes=['any']) output_info = PipelineInfo(datasets=['image_data'], attribute_types=['any'], attributes=['any']) mayavi-4.5.0/mayavi/filters/image_data_probe.py0000644000076500000240000002143112747716314022201 0ustar prabhustaff00000000000000# Author: Prabhu Ramachandran # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. # Standard library imports. import numpy # Enthought library imports. from traits.api import Instance, Bool, Array, Button, Str from traitsui.api import View, Group, Item from tvtk.api import tvtk import tvtk.common as tvtk_common # Local imports. from mayavi.core.filter import Filter from mayavi.core.pipeline_info import PipelineInfo ################################################################################ # `ImageDataProbe` class. ################################################################################ class ImageDataProbe(Filter): """ A filter that can be used to probe any dataset using a Structured Points dataset. The filter also allows one to convert the scalar data to an unsigned short array so that the scalars can be used for volume visualization. """ # The image data onto which the data is probed. probe_data = Instance(tvtk.ImageData, args=()) # The probe filter. filter = Instance(tvtk.ProbeFilter, args=()) rescale_scalars = Bool(False, desc='if the input scalars are '\ 'rescaled to an unsigned short '\ 'array') # Specifies if we can change the spacing/dimensions -- not allowed # for imagedata/structured points data. allow_changes = Bool(True) # Spacing of points in the image data. spacing = Array(value=(0.0, 0.0, 0.0), shape=(3,), cols=1, dtype=float, enter_set=True, auto_set=False, labels=['sx', 'sy', 'sz'], desc='the spacing of points') # Dimensions of the image data. dimensions = Array(value=(0,0,0), shape=(3,), cols=1, dtype=int, enter_set=True, auto_set=False, labels=['nx', 'ny', 'nz'], desc='the dimensions of the image data') # Reset settings to defaults. reset_defaults = Button(desc='if probe data is reset to defaults') # Name of rescaled scalar to generate. rescaled_scalar_name = Str('probe_us_array') input_info = PipelineInfo(datasets=['image_data'], attribute_types=['any'], attributes=['any']) output_info = PipelineInfo(datasets=['image_data'], attribute_types=['any'], attributes=['any']) ######################################## # Private traits. # A trait to prevent static handlers from firing unnecessarily. _event_handled = Bool(False) ######################################## # View related traits. view = View(Group(Item(name='dimensions', enabled_when='allow_changes' ), Item(name='spacing', enabled_when='allow_changes'), Item(name='rescale_scalars'), Item(name='reset_defaults', show_label=False), ), resizable=True ) ###################################################################### # `Filter` interface. ###################################################################### def setup_pipeline(self): """Creates the pipeline.""" self.configure_input_data(self.filter, self.probe_data) def update_pipeline(self): """Connect and update the pipeline.""" inputs = self.inputs if len(inputs) == 0: return fil = self.filter self.configure_source_data(fil, inputs[0].outputs[0]) reset = False if self.dimensions.sum() == 0: reset = True self._setup_probe_data(reset) fil.update() self._rescale_scalars_changed(self.rescale_scalars) self._set_outputs([fil]) ###################################################################### # Non-public interface. ###################################################################### def _setup_probe_data(self, reset=False): pd = self.probe_data input = self.inputs[0].get_output_dataset() if input.is_a('vtkImageData'): self.allow_changes = False self.set(spacing=input.spacing, dimensions=input.dimensions) pd.set(origin=input.origin, dimensions=input.dimensions, spacing=input.spacing) pd.update() elif reset: self.allow_changes = True b = numpy.array(input.bounds) pd.origin = b[::2] l = b[1::2] - b[::2] tot_len = sum(l) npnt = pow(input.number_of_points, 1./3.) + 0.5 fac = 3.0*npnt/tot_len dims = (l*fac).astype(int) + 1 extent = (0, dims[0] -1, 0, dims[1] -1, 0, dims[2] -1) if tvtk_common.is_old_pipeline(): pd.set(extent=extent, update_extent=extent, whole_extent=extent, dimensions=dims) else: pd.set(extent=extent, dimensions=dims) max_dim = dims.max() dims = (dims-1).clip(min=1, max=max_dim+1) l = l.clip(min=1e-3, max=l.max()+1.0) pd.spacing = l/dims self._event_handled = True self.set(spacing = pd.spacing, dimensions=pd.dimensions) self._event_handled = False def _rescale_scalars_changed(self, value): out = self.filter.output pd = out.point_data sc = pd.scalars if sc is None: # no input scalars return if not value: dataset = self.inputs[0].get_output_dataset() orig_sc = dataset.point_data.scalars if sc.is_a('vtkUnsignedShortArray') and \ sc.name == self.rescaled_scalar_name: pd.set_active_scalars(orig_sc.name) pd.update() self.pipeline_changed = True self.render() return s_min, s_max = sc.range # checking to see if input array is constant. avg = (s_max + s_min)*0.5 diff = 1 if (s_max > avg) and (avg > s_min): diff = s_max - s_min arr = (sc.to_array() - s_min)*65535.0/diff uc = tvtk.UnsignedShortArray(name=self.rescaled_scalar_name) uc.from_array(arr) pd.add_array(uc) pd.set_active_scalars(self.rescaled_scalar_name) pd.update() self.pipeline_changed = True self.render() def _dimensions_changed(self, value): if not self.allow_changes or self._event_handled: return max_d = value.max() dims = (value-1).clip(min=1, max=max_d) b = numpy.array(self.inputs[0].get_output_dataset().bounds) l = b[1::2] - b[::2] self.spacing = l/dims self._update_probe() def _spacing_changed(self, value): if not self.allow_changes or self._event_handled: return b = numpy.array(self.inputs[0].get_output_dataset().bounds) l = b[1::2] - b[::2] dims = (l/value + 0.5).astype(int) + 1 # Recalculate space because of rounding. maxd = dims.max() dims1 = (dims -1).clip(min=1, max=maxd) sp = l/dims1 self._event_handled = True self.set(spacing = sp, dimensions=dims) self._event_handled = False self._update_probe () def _update_probe(self): pd = self.probe_data dims = self.dimensions spacing = self.spacing extent = (0, dims[0] -1, 0, dims[1] -1, 0, dims[2] -1) if tvtk_common.is_old_pipeline(): pd.set(extent=extent, update_extent=extent, whole_extent=extent, dimensions=dims, spacing=spacing) else: pd.set(extent=extent, dimensions=dims, spacing=spacing) pd.modified() fil = self.filter w = fil.global_warning_display fil.global_warning_display = False fil.remove_all_inputs() self.configure_input_data(fil, pd) fil.update_whole_extent() fil.update() self._rescale_scalars_changed(self.rescale_scalars) fil.global_warning_display = w self.data_changed = True def _reset_defaults_fired(self): self._setup_probe_data(reset=True) self._rescale_scalars_changed(self.rescale_scalars) mayavi-4.5.0/mayavi/filters/mask_points.py0000644000076500000240000000434012747716314021266 0ustar prabhustaff00000000000000# Author: Prabhu Ramachandran # Copyright (c) 2006, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import Instance from tvtk.api import tvtk # Local imports from mayavi.filters.filter_base import FilterBase from mayavi.core.pipeline_info import PipelineInfo ###################################################################### # `MaskPoints` class. ###################################################################### class MaskPoints(FilterBase): """Selectively passes the input points downstream. This can be used to subsample the input points. Note that this does not pass geometry data, this means all grid information is lost. """ # The version of this class. Used for persistence. __version__ = 0 # The actual TVTK filter that this class manages. filter = Instance(tvtk.MaskPoints, args=(), allow_none=False, record=True) input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']) output_info = PipelineInfo(datasets=['poly_data'], attribute_types=['any'], attributes=['any']) ###################################################################### # `Filter` interface. ###################################################################### def update_pipeline(self): # FIXME: This is needed, for with VTK-5.10 (for sure), the filter # allocates memory for maximum_number_of_points which is impossibly # large, so we set it to the number of points in the input # for safety. self.filter.maximum_number_of_points = \ self._find_number_of_points_in_input() super(MaskPoints, self).update_pipeline() ###################################################################### # Non-public interface. ###################################################################### def _find_number_of_points_in_input(self): inp = self.inputs[0].outputs[0] if hasattr(inp, 'update'): inp.update() inp = self.inputs[0].get_output_dataset() return inp.number_of_points mayavi-4.5.0/mayavi/filters/metadata.py0000644000076500000240000006362212747716314020527 0ustar prabhustaff00000000000000""" Metadata for all filters. """ # Author: Prabhu Ramachandran # Copyright (c) 2008, Prabhu Ramachandran Enthought, Inc. # License: BSD Style. # Local imports. from mayavi.core.metadata import FilterMetadata from mayavi.core.pipeline_info import PipelineInfo BASE = 'mayavi.filters' ################################################################################ # Factory functions. ################################################################################ def make_user_defined_filter(): from mayavi.filters.user_defined import UserDefined f = UserDefined() f.setup_filter() return f ################################################################################ # Metadata. cell_derivatives_filter = FilterMetadata( id = "CellDerivativesFilter", menu_name = "&CellDerivatives", class_name = BASE + '.cell_derivatives.CellDerivatives', tooltip = "Calculate derivatives of input point/vector data and output these as cell data", desc = "Calculate derivatives of input point/vector data and output these as cell data", help = "Calculate derivatives of input point/vector data and output these as cell data", input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']), output_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']) ) cell_to_point_data_filter = FilterMetadata( id = "CellToPointDataFilter", menu_name = "&CellToPointData", class_name = BASE + '.cell_to_point_data.CellToPointData', tooltip = "Convert cell data to point data for the active data", desc = "Convert cell data to point data for the active data", help = "Convert cell data to point data for the active data", input_info = PipelineInfo(datasets=['any'], attribute_types=['cell'], attributes=['any']), output_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']) ) clip_filter = FilterMetadata( id = "DataSetClipperFilter", menu_name = "&DataSet Clipper", class_name = BASE + '.data_set_clipper.DataSetClipper', tooltip = "Clip the input dataset", desc = "Clip the input dataset", help = "Clip the input dataset", input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']), output_info = PipelineInfo(datasets=['unstructured_grid'], attribute_types=['any'], attributes=['any']) ) contour_filter = FilterMetadata( id = "ContourFilter", menu_name = "&Contour", class_name = BASE + '.contour.Contour', tooltip = "Compute contours of the input dataset", desc = "Compute contours of the input dataset", help = "Compute contours of the input dataset", input_info = PipelineInfo(datasets=['any'], attribute_types=['point'], attributes=['any']), output_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']) ) cut_plane_filter = FilterMetadata( id = "CutPlaneFilter", menu_name = "&CutPlane", class_name = BASE + '.cut_plane.CutPlane', tooltip = "Slice the input dataset with a cut plane", desc = "Slice the input dataset with a cut plane", help = "Slice the input dataset with a cut plane", input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']), output_info = PipelineInfo(datasets=['poly_data'], attribute_types=['any'], attributes=['any']) ) decimatepro_filter = FilterMetadata( id = "DecimateProFilter", menu_name = "&DecimatePro", class_name = BASE + '.decimatepro.DecimatePro', tooltip = "Simpilies a mesh using the DecimatePro filter", desc = "Simpilies a mesh using the DecimatePro filter", help = "Simpilies a mesh using the DecimatePro filter", input_info = PipelineInfo(datasets=['poly_data'], attribute_types=['any'], attributes=['any']), output_info = PipelineInfo(datasets=['poly_data'], attribute_types=['any'], attributes=['any']) ) delaunay2d_filter = FilterMetadata( id = "Delaunay2DFilter", menu_name = "&Delaunay2D", class_name = BASE + '.delaunay2d.Delaunay2D', tooltip = "Perform a 2D Delaunay triangulation for the given data", desc = "Perform a 2D Delaunay triangulation for the given data", help = "Perform a 2D Delaunay triangulation for the given data", input_info = PipelineInfo(datasets=['structured_grid', 'poly_data', 'unstructured_grid'], attribute_types=['any'], attributes=['any']), output_info = PipelineInfo(datasets=['poly_data'], attribute_types=['any'], attributes=['any']) ) delaunay3d_filter = FilterMetadata( id = "Delaunay3DFilter", menu_name = "Delaunay&3D", class_name = BASE + '.delaunay3d.Delaunay3D', tooltip = "Perform a 3D Delaunay triangulation for the given data", desc = "Perform a 3D Delaunay triangulation for the given data", help = "Perform a 3D Delaunay triangulation for the given data", input_info = PipelineInfo(datasets=['structured_grid', 'poly_data', 'unstructured_grid'], attribute_types=['any'], attributes=['any']), output_info = PipelineInfo(datasets=['unstructured_grid'], attribute_types=['any'], attributes=['any']) ) elevation_filter = FilterMetadata( id = "ElevationFilter", menu_name = "Elevation Filter", class_name = BASE + '.elevation_filter.ElevationFilter', tooltip = "Creates scalar data from the elevation along a direction", desc = "Creates scalar data from the elevation along a direction", help = "Creates scalar data from the elevation along a direction", input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']), output_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']) ) extract_edges_filter = FilterMetadata( id = "ExtractEdgesFilter", menu_name = "Extract Edges", class_name = BASE + '.extract_edges.ExtractEdges', tooltip = "Turns edges into lines.", desc = "Turns edges into lines.", help = "Turns edges into lines.", input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']), output_info = PipelineInfo(datasets=['poly_data'], attribute_types=['any'], attributes=['any']) ) extract_grid_filter = FilterMetadata( id = "ExtractGridFilter", menu_name = "Extract &Grid", class_name = BASE + '.extract_grid.ExtractGrid', tooltip = "Extract/subsample part of any structured grid", desc = "Extract/subsample part of any structured grid", help = "Extract/subsample part of any structured grid", input_info = PipelineInfo(datasets=['image_data', 'rectilinear_grid', 'structured_grid'], attribute_types=['any'], attributes=['any']), output_info = PipelineInfo(datasets=['image_data', 'rectilinear_grid', 'structured_grid'], attribute_types=['any'], attributes=['any']) ) extract_tensor_components_filter = FilterMetadata( id = "ExtractTensorComponentsFilter", menu_name = "Extract &Tensor Components", class_name = BASE + '.extract_tensor_components.ExtractTensorComponents', tooltip = "Extract tensor components from tensor data", desc = "Extract tensor components from tensor data", help = "Extract tensor components from tensor data", input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['tensors']), output_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']) ) extract_unstructured_grid_filter = FilterMetadata( id = "ExtractUnstructuredGridFilter", menu_name = "Extract &Unstructured Grid", class_name = BASE + '.extract_unstructured_grid.ExtractUnstructuredGrid', tooltip = "Extract part of an unstructured grid", desc = "Extract part of an unstructured grid", help = "Extract part of an unstructured grid", input_info = PipelineInfo(datasets=['unstructured_grid'], attribute_types=['any'], attributes=['any']), output_info = PipelineInfo(datasets=['unstructured_grid'], attribute_types=['any'], attributes=['any']) ) extract_vector_norm_filter = FilterMetadata( id = "ExtractVectorNormFilter", menu_name = "Extract Vector &Norm", class_name = BASE + '.extract_vector_norm.ExtractVectorNorm', tooltip = "Compute the vector norm for the current vector data", desc = "Compute the vector norm for the current vector data", help = "Compute the vector norm for the current vector data", input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['vectors']), output_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']) ) extract_vector_components_filter = FilterMetadata( id = "ExtractVectorComponentsFilter", menu_name = "Extract &Vector Components", class_name = BASE + '.extract_vector_components.ExtractVectorComponents', tooltip = "Extract vector components from vector data", desc = "Extract vector components from vector data", help = "Extract vector components from vector data", input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['vectors']), output_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']) ) gaussian_splatter_filter = FilterMetadata( id = "GaussianSplatterFilter", menu_name = "Gaussian Splatter", class_name = BASE + '.gaussian_splatter.GaussianSplatter', tooltip = "Builds a structured set of points from a cloud of points, the local density defining the scalar", desc = "Builds a structured set of points from a cloud of points, the local density defining the scalar", help = """Builds a structured set of points from a cloud of points, the local density defining the scalar. It is essentially equivalent to a 3D Gaussian kernel density estimate.""", input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']), output_info = PipelineInfo(datasets=['image_data'], attribute_types=['any'], attributes=['any']) ) greedy_terrain_decimation_filter = FilterMetadata( id = "GreedyTerrainDecimationFilter", menu_name = "Greedy Terrain Decimation", class_name = BASE + '.greedy_terrain_decimation.GreedyTerrainDecimation', tooltip = "Simplifies image data and performs a triangulation", desc = "Simplifies image data and performs a triangulation", help = "Simplifies image data and performs a triangulation", input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']), output_info = PipelineInfo(datasets=['poly_data'], attribute_types=['any'], attributes=['any']) ) image_change_information_filter = FilterMetadata( id = "ImageChangeInformationFilter", menu_name = "Change &ImageData information", class_name = BASE + '.image_change_information.ImageChangeInformation', tooltip = "Change the origin, spacing and extents of an image dataset", desc = "Change the origin, spacing and extents of an image dataset", help = "Change the origin, spacing and extents of an image dataset", input_info = PipelineInfo(datasets=['image_data'], attribute_types=['any'], attributes=['any']), output_info = PipelineInfo(datasets=['image_data'], attribute_types=['any'], attributes=['any']) ) image_data_probe_filter = FilterMetadata( id = "ImageDataProbeFilter", menu_name = "&Probe data onto image data", class_name = BASE + '.image_data_probe.ImageDataProbe', tooltip = "Samples arbitrary datasets onto an image dataset (cube of data)", desc = "Samples arbitrary datasets onto an image dataset (cube of data)", help = "Samples arbitrary datasets onto an image dataset (cube of data)", input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']), output_info = PipelineInfo(datasets=['image_data'], attribute_types=['any'], attributes=['any']) ) mask_points_filter = FilterMetadata( id = "MaskPointsFilter", menu_name = "&Mask Points", class_name = BASE + '.mask_points.MaskPoints', tooltip = "Mask the input points in the data", desc = "Mask the input points in the data", help = "Mask the input points in the data", input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']), output_info = PipelineInfo(datasets=['poly_data'], attribute_types=['any'], attributes=['any']) ) point_to_cell_data_filter = FilterMetadata( id = "PointToCellDataFilter", menu_name = "&PointToCellData", class_name = BASE + '.point_to_cell_data.PointToCellData', tooltip = "Convert point data to cell data for the active data", desc = "Convert point data to cell data for the active data", help = "Convert point data to cell data for the active data", input_info = PipelineInfo(datasets=['any'], attribute_types=['point'], attributes=['any']), output_info = PipelineInfo(datasets=['any'], attribute_types=['cell'], attributes=['any']) ) poly_data_normals_filter = FilterMetadata( id = "PolyDataNormalsFilter", menu_name = "Compute &Normals", class_name = BASE + '.poly_data_normals.PolyDataNormals', tooltip = "Compute normals and smooth the appearance", desc = "Compute normals and smooth the appearance", help = "Compute normals and smooth the appearance", input_info = PipelineInfo(datasets=['poly_data'], attribute_types=['any'], attributes=['any']), output_info = PipelineInfo(datasets=['poly_data'], attribute_types=['any'], attributes=['any']) ) quadric_decimation_filter = FilterMetadata( id = "QuadricDecimationFilter", menu_name = "Quadric Decimation", class_name = BASE + '.quadric_decimation.QuadricDecimation', tooltip = "Simplifies a triangular mesh", desc = "Simplifies a triangular mesh", help = "Simplifies a triangular mesh", input_info = PipelineInfo(datasets=['poly_data'], attribute_types=['any'], attributes=['any']), output_info = PipelineInfo(datasets=['poly_data'], attribute_types=['any'], attributes=['any']) ) select_output_filter = FilterMetadata( id = "SelectOutputFilter", menu_name = "&Select Output", class_name = BASE + '.select_output.SelectOutput', tooltip = "Choose the output of the source that should be used", desc = "Choose the output of the source that should be used", help = "Choose the output of the source that should be used", input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']), output_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']) ) set_active_attribute_filter = FilterMetadata( id = "SetActiveAttributeFilter", menu_name = "&SetActiveAttribute", class_name = BASE + '.set_active_attribute.SetActiveAttribute', tooltip = "Set the active attribute (scalar/vector/tensor) to use", desc = "Set the active attribute (scalar/vector/tensor) to use", help = "Set the active attribute (scalar/vector/tensor) to use", input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']), output_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']) ) stripper = FilterMetadata( id = "Stripper", menu_name = "Stripper", class_name = BASE + '.stripper.Stripper', tooltip = "Regularizes surfaces by creating triangle strips", desc = "Regularizes surfaces by creating triangle strips", help = "Regularizes surfaces by creating triangle strips", input_info = PipelineInfo(datasets=['poly_data'], attribute_types=['any'], attributes=['any']), output_info = PipelineInfo(datasets=['poly_data'], attribute_types=['any'], attributes=['any']) ) transform_data_filter = FilterMetadata( id = "TransformDataFilter", menu_name = "T&ransform Data", class_name = BASE + '.transform_data.TransformData', tooltip = "Transform (rotate/translate/scale) non ImageData datasets", desc = "Transform (rotate/translate/scale) non ImageData datasets", help = "Transform (rotate/translate/scale) non ImageData datasets", input_info = PipelineInfo(datasets=['poly_data', 'structured_grid', 'unstructured_grid'], attribute_types=['any'], attributes=['any']), output_info = PipelineInfo(datasets=['poly_data', 'structured_grid', 'unstructured_grid'], attribute_types=['any'], attributes=['any']) ) threshold_filter = FilterMetadata( id = "ThresholdFilter", menu_name = "&Threshold", class_name = BASE + '.threshold.Threshold', tooltip = "Threshold input data based on scalar values", desc = "Threshold input data based on scalar values", help = "Threshold input data based on scalar values", input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']), output_info = PipelineInfo(datasets=['poly_data', 'unstructured_grid'], attribute_types=['any'], attributes=['any']) ) triangle_filter = FilterMetadata( id = "TriangleFilterFilter", menu_name = "TriangleFilter", class_name = BASE + '.triangle_filter.TriangleFilter', tooltip = "Convert input polygons and triangle strips to triangles", desc = "Convert input polygons and triangle strips to triangles", help = "Convert input polygons and triangle strips to triangles", input_info = PipelineInfo(datasets=['poly_data'], attribute_types=['any'], attributes=['any']), output_info = PipelineInfo(datasets=['poly_data'], attribute_types=['any'], attributes=['any']) ) tube_filter = FilterMetadata( id = "TubeFilter", menu_name = "Tu&be", class_name = BASE + '.tube.Tube', tooltip = "Turns lines into tubes", desc = "Turns lines into tubes", help = "Turns lines into tubes", input_info = PipelineInfo(datasets=['poly_data'], attribute_types=['any'], attributes=['any']), output_info = PipelineInfo(datasets=['poly_data'], attribute_types=['any'], attributes=['any']) ) user_defined_filter = FilterMetadata( id = "UserDefinedFilter", menu_name = "&UserDefined", factory = make_user_defined_filter, tooltip = "Create a UserDefined filter (will popup a selection dialog)", desc = "Create a UserDefined filter (will popup a selection dialog)", help = "Create a UserDefined filter (will popup a selection dialog)", input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']), output_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']) ) vorticity_filter = FilterMetadata( id = "VorticityFilter", menu_name = "&Vorticity", class_name = BASE + '.vorticity.Vorticity', tooltip = "Calculate the vorticity (curl) of input vector field", desc = "Calculate the vorticity (curl) of input vector field", help = "Calculate the vorticity (curl) of input vector field", input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['vectors']), output_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']) ) warp_scalar_filter = FilterMetadata( id = "WarpScalarFilter", menu_name = "Warp S&calar", class_name = BASE + '.warp_scalar.WarpScalar', tooltip = "Move points of data along normals by the scalar data", desc = "Move points of data along normals by the scalar data", help = "Move points of data along normals by the scalar data", input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['scalars']), output_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']) ) warp_vector_filter = FilterMetadata( id = "WarpVectorFilter", menu_name = "Warp &Vector", class_name = BASE + '.warp_vector.WarpVector', tooltip = "Move points of data along the vector data at point", desc = "Move points of data along the vector data at point", help = "Move points of data along the vector data at point", input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['vectors']), output_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']) ) # Now collect all the filters for the mayavi registry. filters = [cell_derivatives_filter, cell_to_point_data_filter, clip_filter, contour_filter, cut_plane_filter, decimatepro_filter, delaunay2d_filter, delaunay3d_filter, elevation_filter, extract_edges_filter, extract_grid_filter, extract_tensor_components_filter, extract_unstructured_grid_filter, extract_vector_norm_filter, extract_vector_components_filter, gaussian_splatter_filter, greedy_terrain_decimation_filter, image_change_information_filter, image_data_probe_filter, mask_points_filter, point_to_cell_data_filter, poly_data_normals_filter, quadric_decimation_filter, select_output_filter, set_active_attribute_filter, stripper, transform_data_filter, threshold_filter, triangle_filter, tube_filter, user_defined_filter, vorticity_filter, warp_scalar_filter, warp_vector_filter, ] mayavi-4.5.0/mayavi/filters/optional.py0000644000076500000240000000130112747716314020556 0ustar prabhustaff00000000000000"""The Optional filter is one which may be turned on and off and wraps around any mayavi filter or component. """ # Author: Prabhu Ramachandran # Copyright (c) 2008, Prabhu Ramachandran # License: BSD Style. from mayavi.filters.wrapper import Wrapper ################################################################################ # `Optional` class. ################################################################################ class Optional(Wrapper): """ This class wraps around any mayavi filter or component and allows a user to turn it on or off. """ # This filter should allow us to turn on/off the filter. _show_enabled = True mayavi-4.5.0/mayavi/filters/point_to_cell_data.py0000644000076500000240000000222212747716314022557 0ustar prabhustaff00000000000000# Author: Prabhu Ramachandran # Copyright (c) 2006, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import Instance from tvtk.api import tvtk # Local imports from mayavi.filters.cell_to_point_data import CellToPointData from mayavi.core.pipeline_info import PipelineInfo ###################################################################### # `PointToCellData` class. ###################################################################### class PointToCellData(CellToPointData): # The version of this class. Used for persistence. __version__ = 0 # The actual TVTK filter that this class manages. filter = Instance(tvtk.PointDataToCellData, args=(), kw={'pass_point_data':1}, allow_none=False, record=True) input_info = PipelineInfo(datasets=['any'], attribute_types=['point'], attributes=['any']) output_info = PipelineInfo(datasets=['any'], attribute_types=['cell'], attributes=['any']) mayavi-4.5.0/mayavi/filters/poly_data_filter_base.py0000644000076500000240000000220212747716314023245 0ustar prabhustaff00000000000000# Author: Gael Varoquaux # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. # Local imports from mayavi.filters.filter_base import FilterBase from mayavi.components.common import convert_to_poly_data ###################################################################### # `PolyDataFilterBase` class. ###################################################################### class PolyDataFilterBase(FilterBase): """ Base class for a filter requiring polydata input. Converts the source to polydata. """ ###################################################################### # `Filter` interface. ###################################################################### def update_pipeline(self): # Do nothing if there is no input. inputs = self.inputs if len(inputs) == 0: return # By default we set the input to the first output of the first # input. fil = self.filter self.configure_input(fil, convert_to_poly_data(inputs[0].outputs[0])) fil.update() self._set_outputs([fil]) mayavi-4.5.0/mayavi/filters/poly_data_normals.py0000644000076500000240000000234212747716314022446 0ustar prabhustaff00000000000000# Author: Prabhu Ramachandran # Copyright (c) 2006, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import Instance from tvtk.api import tvtk # Local imports from mayavi.filters.poly_data_filter_base import \ PolyDataFilterBase from mayavi.core.pipeline_info import PipelineInfo ###################################################################### # `PolyDataNormals` class. ###################################################################### class PolyDataNormals(PolyDataFilterBase): """Computes normals from input data. This gives meshes a smoother appearance. This should work for any input dataset. """ # The version of this class. Used for persistence. __version__ = 0 # The actual TVTK filter that this class manages. filter = Instance(tvtk.PolyDataNormals, args=(), allow_none=False, record=True) input_info = PipelineInfo(datasets=['poly_data'], attribute_types=['any'], attributes=['any']) output_info = PipelineInfo(datasets=['poly_data'], attribute_types=['any'], attributes=['any']) mayavi-4.5.0/mayavi/filters/quadric_decimation.py0000644000076500000240000000222412747716314022562 0ustar prabhustaff00000000000000# Author: Gael Varoquaux # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import Instance from tvtk.api import tvtk # Local imports from mayavi.filters.poly_data_filter_base import \ PolyDataFilterBase from mayavi.core.pipeline_info import PipelineInfo ###################################################################### # `QuadricDecimation` class. ###################################################################### class QuadricDecimation(PolyDataFilterBase): """ Simplifies triangles of a mesh """ # The version of this class. Used for persistence. __version__ = 0 # The actual TVTK filter that this class manages. filter = Instance(tvtk.QuadricDecimation, args=(), allow_none=False, record=True) input_info = PipelineInfo(datasets=['poly_data'], attribute_types=['any'], attributes=['any']) output_info = PipelineInfo(datasets=['poly_data'], attribute_types=['any'], attributes=['any']) mayavi-4.5.0/mayavi/filters/select_output.py0000644000076500000240000000651212747716314021641 0ustar prabhustaff00000000000000"""Filter that allows a user to select one among several of the outputs of a given input. This is typically very useful for a multi-block data source. """ # Author: Prabhu Ramachandran # Copyright (c) 2008, Prabhu Ramachandran # License: BSD Style. # Enthought library imports. from traits.api import Int, Range from traitsui.api import View, Group, Item from mayavi.core.filter import Filter from mayavi.core.pipeline_info import PipelineInfo ################################################################################ # `SelectOutput` class. ################################################################################ class SelectOutput(Filter): """ This filter lets a user select one among several of the outputs of a given input. This is typically very useful for a multi-block data source. """ # The output index in the input to choose from. output_index = Range(value=0, enter_set=True, auto_set=False, low='_min_index', high='_max_index') input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']) output_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']) # The minimum output index of our input. _min_index = Int(0, desc='the minimum output index') # The maximum output index of our input. _max_index = Int(0, desc='the maximum output index') ######################################## # Traits View. view = View(Group(Item('output_index', enabled_when='_max_index > 0')), resizable=True) ###################################################################### # `object` interface. def __get_pure_state__(self): d = super(SelectOutput, self).__get_pure_state__() d['output_index'] = self.output_index return d def __set_pure_state__(self, state): super(SelectOutput, self).__set_pure_state__(state) # Force an update of the output index -- if not this doesn't # change. self._output_index_changed(state.output_index) ###################################################################### # `Filter` interface. def update_pipeline(self): # Do nothing if there is no input. inputs = self.inputs if len(inputs) == 0: return # Set the maximum index. self._max_index = len(inputs[0].outputs) - 1 self._output_index_changed(self.output_index) def update_data(self): # Propagate the event. self.data_changed = True ###################################################################### # Trait handlers. def _output_index_changed(self, value): """Static trait handler.""" if value > self._max_index: self.output_index = self._max_index elif value < self._min_index: self.output_index = self._min_index else: self._set_outputs([self.inputs[0].outputs[value]]) s = self.scene if s is not None: s.renderer.reset_camera_clipping_range() s.render() mayavi-4.5.0/mayavi/filters/set_active_attribute.py0000644000076500000240000002143012747716314023147 0ustar prabhustaff00000000000000# Author: Prabhu Ramachandran # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import Instance, List, Str, Bool from traitsui.api import View, Group, Item from tvtk.api import tvtk from tvtk.common import is_old_pipeline # Local imports. from mayavi.core.pipeline_info import PipelineInfo from mayavi.core.filter import Filter from mayavi.core.trait_defs import DEnum from mayavi.sources.vtk_xml_file_reader import get_all_attributes ################################################################################ # `SetActiveAttribute` class. ################################################################################ class SetActiveAttribute(Filter): """ This filter lets a user set the active data attribute (scalars, vectors and tensors) on a VTK dataset. This is particularly useful if you need to do something like compute contours of one scalar on the contour of another scalar. """ # Note: most of this code is from the XMLFileDataReader. # The version of this class. Used for persistence. __version__ = 0 input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']) output_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']) ######################################## # Dynamic traits: These traits are dynamic and are automatically # updated depending on the contents of the file. # The active point scalar name. An empty string indicates that # the attribute is "deactivated". This is useful when you have # both point and cell attributes and want to use cell data by # default. point_scalars_name = DEnum(values_name='_point_scalars_list', desc='scalar point data attribute to use') # The active point vector name. point_vectors_name = DEnum(values_name='_point_vectors_list', desc='vectors point data attribute to use') # The active point tensor name. point_tensors_name = DEnum(values_name='_point_tensors_list', desc='tensor point data attribute to use') # The active cell scalar name. cell_scalars_name = DEnum(values_name='_cell_scalars_list', desc='scalar cell data attribute to use') # The active cell vector name. cell_vectors_name = DEnum(values_name='_cell_vectors_list', desc='vectors cell data attribute to use') # The active cell tensor name. cell_tensors_name = DEnum(values_name='_cell_tensors_list', desc='tensor cell data attribute to use') ######################################## # Our view. view = View(Group(Item(name='point_scalars_name'), Item(name='point_vectors_name'), Item(name='point_tensors_name'), Item(name='cell_scalars_name'), Item(name='cell_vectors_name'), Item(name='cell_tensors_name'), )) ######################################## # Private traits. # These private traits store the list of available data # attributes. The non-private traits use these lists internally. _point_scalars_list = List(Str) _point_vectors_list = List(Str) _point_tensors_list = List(Str) _cell_scalars_list = List(Str) _cell_vectors_list = List(Str) _cell_tensors_list = List(Str) # This filter allows us to change the attributes of the data # object and will ensure that the pipeline is properly taken care # of. Directly setting the array in the VTK object will not do # this. _assign_attribute = Instance(tvtk.AssignAttribute, args=(), allow_none=False) # Toggles if this is the first time this object has been used. _first = Bool(True) ###################################################################### # `object` interface ###################################################################### def __get_pure_state__(self): d = super(SetActiveAttribute, self).__get_pure_state__() for name in ('_assign_attribute', '_first'): d.pop(name, None) # Pickle the 'point_scalars_name' etc. since these are # properties and not in __dict__. attr = {} for name in ('point_scalars', 'point_vectors', 'point_tensors', 'cell_scalars', 'cell_vectors', 'cell_tensors'): d.pop('_' + name + '_list', None) d.pop('_' + name + '_name', None) x = name + '_name' attr[x] = getattr(self, x) d.update(attr) return d ###################################################################### # `Filter` interface. ###################################################################### def update_data(self): self.data_changed = True def update_pipeline(self): if len(self.inputs) == 0 or len(self.inputs[0].outputs) == 0: return aa = self._assign_attribute self.configure_connection(aa, self.inputs[0]) self._update() self._set_outputs([aa]) ###################################################################### # Non-public interface. ###################################################################### def _update(self): """Updates the traits for the fields that are available in the input data. """ if len(self.inputs) == 0 or len(self.inputs[0].outputs) == 0: return input = self.inputs[0].get_output_object() if self._first and is_old_pipeline(): # Force all attributes to be defined and computed input.update() pnt_attr, cell_attr = get_all_attributes( self.inputs[0].get_output_dataset() ) self._setup_data_traits(cell_attr, 'cell') self._setup_data_traits(pnt_attr, 'point') if self._first: self._first = False def _setup_data_traits(self, attributes, d_type): """Given the dict of the attributes from the `get_all_attributes` function and the data type (point/cell) data this will setup the object and the data. """ attrs = ['scalars', 'vectors', 'tensors'] aa = self._assign_attribute input = self.inputs[0].get_output_dataset() data = getattr(input, '%s_data'%d_type) for attr in attrs: values = attributes[attr] values.append('') setattr(self, '_%s_%s_list'%(d_type, attr), values) if len(values) > 1: default = getattr(self, '%s_%s_name'%(d_type, attr)) if self._first and len(default) == 0: default = values[0] getattr(data, 'set_active_%s'%attr)(default) aa.assign(default, attr.upper(), d_type.upper() +'_DATA') aa.update() kw = {'%s_%s_name'%(d_type, attr): default, 'trait_change_notify': False} self.set(**kw) def _set_data_name(self, data_type, attr_type, value): if value is None or len(self.inputs) == 0: return input = self.inputs[0].get_output_dataset() if len(value) == 0: # If the value is empty then we deactivate that attribute. d = getattr(input, attr_type + '_data') method = getattr(d, 'set_active_%s'%data_type) method(None) self.data_changed = True return aa = self._assign_attribute data = None if attr_type == 'point': data = input.point_data elif attr_type == 'cell': data = input.cell_data method = getattr(data, 'set_active_%s'%data_type) method(value) aa.assign(value, data_type.upper(), attr_type.upper() +'_DATA') aa.update() # Fire an event, so the changes propagate. self.data_changed = True def _point_scalars_name_changed(self, value): self._set_data_name('scalars', 'point', value) def _point_vectors_name_changed(self, value): self._set_data_name('vectors', 'point', value) def _point_tensors_name_changed(self, value): self._set_data_name('tensors', 'point', value) def _cell_scalars_name_changed(self, value): self._set_data_name('scalars', 'cell', value) def _cell_vectors_name_changed(self, value): self._set_data_name('vectors', 'cell', value) def _cell_tensors_name_changed(self, value): self._set_data_name('tensors', 'cell', value) mayavi-4.5.0/mayavi/filters/stripper.py0000644000076500000240000000227112747716314020610 0ustar prabhustaff00000000000000# Author: Gael Varoquaux # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import Instance from tvtk.api import tvtk # Local imports from mayavi.filters.filter_base import FilterBase from mayavi.core.pipeline_info import PipelineInfo ###################################################################### # `Stripper` class. ###################################################################### class Stripper(FilterBase): """ Create triangle strips and/or poly-lines. Useful for regularizing broken up surfaces, such as those created by the Tube filter. """ # The version of this class. Used for persistence. __version__ = 0 # The actual TVTK filter that this class manages. filter = Instance(tvtk.Stripper, args=(), allow_none=False, record=True) input_info = PipelineInfo(datasets=['poly_data'], attribute_types=['any'], attributes=['any']) output_info = PipelineInfo(datasets=['poly_data'], attribute_types=['any'], attributes=['any']) mayavi-4.5.0/mayavi/filters/threshold.py0000644000076500000240000002464012747716314020740 0ustar prabhustaff00000000000000"""A simple filter that thresholds on input data. """ # Author: Prabhu Ramachandran # Copyright (c) 2005, Enthought, Inc. # Author: Gael Varoquaux # Copyright (c) 2010, Enthought, Inc. # License: BSD Style. import numpy as np # Enthought library imports. from traits.api import Instance, Range, Float, Bool, \ Property, Enum from traitsui.api import View, Group, Item from tvtk.api import tvtk # Local imports from mayavi.core.filter import Filter from mayavi.core.pipeline_info import PipelineInfo ###################################################################### # `Threshold` class. ###################################################################### class Threshold(Filter): # The version of this class. Used for persistence. __version__ = 0 # The threshold filter used. threshold_filter = Property(Instance(tvtk.Object, allow_none=False), record=True) # The filter type to use, specifies if the cells or the points are # cells filtered via a threshold. filter_type = Enum('cells', 'points', desc='if thresholding is done on cells or points') # Lower threshold (this is a dynamic trait that is changed when # input data changes). lower_threshold = Range(value=-1.0e20, low='_data_min', high='_data_max', enter_set=True, auto_set=False, desc='the lower threshold of the filter') # Upper threshold (this is a dynamic trait that is changed when # input data changes). upper_threshold = Range(value=1.0e20, low='_data_min', high='_data_max', enter_set=True, auto_set=False, desc='the upper threshold of the filter') # Automatically reset the lower threshold when the upstream data # changes. auto_reset_lower = Bool(True, desc='if the lower threshold is ' 'automatically reset when upstream ' 'data changes') # Automatically reset the upper threshold when the upstream data # changes. auto_reset_upper = Bool(True, desc='if the upper threshold is ' 'automatically reset when upstream ' 'data changes') input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']) output_info = PipelineInfo(datasets=['poly_data', 'unstructured_grid'], attribute_types=['any'], attributes=['any']) # Our view. view = View(Group(Group(Item(name='filter_type'), Item(name='lower_threshold'), Item(name='auto_reset_lower'), Item(name='upper_threshold'), Item(name='auto_reset_upper')), Item(name='_'), Group(Item(name='threshold_filter', show_label=False, visible_when='object.filter_type == "cells"', style='custom', resizable=True)), ), resizable=True ) ######################################## # Private traits. # These traits are used to set the limits for the thresholding. # They store the minimum and maximum values of the input data. _data_min = Float(-1e20) _data_max = Float(1e20) # The threshold filter for cell based filtering _threshold = Instance(tvtk.Threshold, args=(), allow_none=False) # The threshold filter for points based filtering. _threshold_points = Instance(tvtk.ThresholdPoints, args=(), allow_none=False) # Internal data to _first = Bool(True) ###################################################################### # `object` interface. ###################################################################### def __get_pure_state__(self): d = super(Threshold, self).__get_pure_state__() # These traits are dynamically created. for name in ('_first', '_data_min', '_data_max'): d.pop(name, None) return d ###################################################################### # `Filter` interface. ###################################################################### def setup_pipeline(self): attrs = ['all_scalars', 'attribute_mode', 'component_mode', 'selected_component'] self._threshold.on_trait_change(self._threshold_filter_edited, attrs) def update_pipeline(self): """Override this method so that it *updates* the tvtk pipeline when data upstream is known to have changed. This method is invoked (automatically) when the input fires a `pipeline_changed` event. """ if len(self.inputs) == 0: return # By default we set the input to the first output of the first # input. fil = self.threshold_filter self.configure_connection(fil, self.inputs[0]) self._update_ranges() self._set_outputs([self.threshold_filter]) def update_data(self): """Override this method to do what is necessary when upstream data changes. This method is invoked (automatically) when any of the inputs sends a `data_changed` event. """ if len(self.inputs) == 0: return self._update_ranges() # Propagate the data_changed event. self.data_changed = True ###################################################################### # Non-public interface ###################################################################### def _lower_threshold_changed(self, new_value): fil = self.threshold_filter fil.threshold_between(new_value, self.upper_threshold) fil.update() self.data_changed = True def _upper_threshold_changed(self, new_value): fil = self.threshold_filter fil.threshold_between(self.lower_threshold, new_value) fil.update() self.data_changed = True def _update_ranges(self): """Updates the ranges of the input. """ data_range = self._get_data_range() if len(data_range) == 0: return dr = data_range if self._first: self._data_min, self._data_max = dr self.set(lower_threshold = dr[0], trait_change_notify=False) self.upper_threshold = dr[1] self._first = False return # Decide whether to change 'lower' or 'upper' first, to avoid # ending up with inconsistent bounds (max < min) in the lower_threshold # and upper_threshold Range traits. if dr[0] <= self._data_min: # Safe to change lower bound first: intermediate range is [dr[0], # self._data_max], and dr[0] <= self._data_min <= self._data_max. change_lower_first = True else: # Safe to change upper bound first: intermediate range is [self._data_min, dr[1]], # and self._data_min < dr[0] <= dr[1]. change_lower_first = False if change_lower_first: if self.auto_reset_lower: self._data_min = dr[0] notify = not self.auto_reset_upper self.set(lower_threshold = dr[0], trait_change_notify=notify) if self.auto_reset_upper: self._data_max = dr[1] self.upper_threshold = dr[1] else: if self.auto_reset_upper: self._data_max = dr[1] notify = not self.auto_reset_lower self.set(upper_threshold = dr[1], trait_change_notify=notify) if self.auto_reset_lower: self._data_min = dr[0] self.lower_threshold = dr[0] def _get_data_range(self): """Returns the range of the input scalar data.""" input = self.inputs[0].outputs[0] data_range = [] ps = input.point_data.scalars cs = input.cell_data.scalars # FIXME: need to be able to handle cell and point data # together. if ps is not None: data_range = list(ps.range) if np.isnan(data_range[0]): data_range[0] = float(np.nanmin(ps.to_array())) if np.isnan(data_range[1]): data_range[1] = float(np.nanmax(ps.to_array())) elif cs is not None: data_range = cs.range if np.isnan(data_range[0]): data_range[0] = float(np.nanmin(cs.to_array())) if np.isnan(data_range[1]): data_range[1] = float(np.nanmax(cs.to_array())) return data_range def _auto_reset_lower_changed(self, value): if len(self.inputs) == 0: return if value: dr = self._get_data_range() self._data_min = dr[0] self.lower_threshold = dr[0] def _auto_reset_upper_changed(self, value): if len(self.inputs) == 0: return if value: dr = self._get_data_range() self._data_max = dr[1] self.upper_threshold = dr[1] def _get_threshold_filter(self): if self.filter_type == 'cells': return self._threshold else: return self._threshold_points def _filter_type_changed(self, value): if value == 'cells': old = self._threshold_points new = self._threshold else: old = self._threshold new = self._threshold_points self.trait_property_changed('threshold_filter', old, new) def _threshold_filter_changed(self, old, new): if len(self.inputs) == 0: return fil = new self.configure_connection(fil, self.inputs[0]) fil.threshold_between(self.lower_threshold, self.upper_threshold) fil.update() self._set_outputs([fil]) def _threshold_filter_edited(self): self.threshold_filter.update() self.data_changed = True mayavi-4.5.0/mayavi/filters/transform_data.py0000644000076500000240000001667412747716314021760 0ustar prabhustaff00000000000000"""Performs a linear transformation to input data using a tvtk.BoxWidget. This does not work with ImageData/StructuredPoints/RectilinearGrid. """ # Author: Prabhu Ramachandran # Copyright (c) 2006-2015, Enthought, Inc. # License: BSD Style. # Standard library imports. try: import cPickle except ImportError: import pickle as cPickle # Enthought library imports. from traits.api import Instance, Property, Bool, Int, \ Trait, TraitMap, Button from traitsui.api import View, Group, Item from tvtk.api import tvtk from apptools.persistence import state_pickler # Local imports from mayavi.core.filter import Filter from mayavi.core.common import error from mayavi.core.pipeline_info import PipelineInfo ###################################################################### # `TransformData` class. ###################################################################### class TransformData(Filter): """Performs a linear transformation to input data using a tvtk.BoxWidget. This does not work with ImageData/StructuredPoints/RectilinearGrid. """ # The version of this class. Used for persistence. __version__ = 0 # The widget that we use to perform the transformation. widget = Instance(tvtk.ThreeDWidget, allow_none=False, record=True) # The filter we manage. filter = Instance(tvtk.Object, allow_none=False) # The transform. transform = Property # Update the data immediately or at the end of the interaction. update_mode = Trait('semi-interactive', TraitMap({'interactive':'InteractionEvent', 'semi-interactive': 'EndInteractionEvent'}), desc='speed at which the data should be updated') input_info = PipelineInfo(datasets=['poly_data', 'structured_grid', 'unstructured_grid'], attribute_types=['any'], attributes=['any']) output_info = PipelineInfo(datasets=['poly_data', 'structured_grid', 'unstructured_grid'], attribute_types=['any'], attributes=['any']) ######################################## # View related code. # Reset the transformation. reset = Button("Reset Transformation") view = View(Group(Group(Item('update_mode'), ), Group(Item('reset'), Item(name='widget', style='custom', resizable=True), show_labels=False ) ), resizable=True ) ######################################## # Private traits. _transform = Instance(tvtk.Transform, allow_none=False) _first = Bool(True) _observer_id = Int(-1) ###################################################################### # `object` interface. ###################################################################### def __get_pure_state__(self): d = super(TransformData, self).__get_pure_state__() for name in ('_first', '_observer_id'): d.pop(name, None) d['matrix'] = cPickle.dumps(self._transform.matrix) return d def __set_pure_state__(self, state): mat = state.pop('matrix') super(TransformData, self).__set_pure_state__(state) state_pickler.set_state(self, state) self._transform.set_matrix(cPickle.loads(mat)) self.widget.set_transform(self._transform) ###################################################################### # `Filter` interface. ###################################################################### def setup_pipeline(self): self._transform = tvtk.Transform() self.widget = tvtk.BoxWidget(place_factor=1.1) self.filter = tvtk.TransformFilter() super(TransformData, self).setup_pipeline() def update_pipeline(self): # Do nothing if there is no input. inputs = self.inputs if len(inputs) == 0: return inp = inputs[0].get_output_dataset() if inp.is_a('vtkImageData') or inp.is_a('vtkRectilinearGrid'): error('Transformation not supported for '\ 'ImageData/StructuredPoints/RectilinearGrid') return # Set the input for the widget and place it if this hasn't # been done before. w = self.widget self.configure_input_data(w, inp) if self._first: w.place_widget() self._first = False # By default we set the input to the first output of the first # input. fil = self.filter self.configure_connection(fil, inputs[0]) fil.transform = self._transform fil.update() self._set_outputs([fil]) def update_data(self): # Do nothing if there is no input. if len(self.inputs) == 0: return self.filter.update() # Propagate the data_changed event. self.data_changed = True ###################################################################### # Non-public interface. ###################################################################### def _get_transform(self): return self._transform def _on_interaction_event(self, obj, event): tfm = self._transform self.widget.get_transform(tfm) f = self.filter f.transform = tfm f.update() self.render() recorder = self.recorder if recorder is not None: state = {} state['elements'] = tfm.matrix.__getstate__()['elements'] name = recorder.get_script_id(self) recorder.record('%s.transform.matrix.__setstate__(%s)'\ %(name, state)) recorder.record('%s.widget.set_transform(%s.transform)'\ %(name, name)) recorder.record('%s.filter.update()'%name) def _widget_changed(self, old, new): if old is not None: old.on_trait_change(self.render, remove=True) old.remove_observer(self._observer_id) self.widgets.remove(old) new.on_trait_change(self.render) self._observer_id = new.add_observer(self.update_mode_, self._on_interaction_event) self.widgets.append(new) if len(self.inputs) > 0: self.configure_input(new, self.inputs[0].outputs[0]) def _filter_changed(self, old, new): if old is not None: old.on_trait_change(self.render, remove=True) new.on_trait_change(self.render) transform = self.transform if transform is not None: new.transform = transform if len(self.inputs) > 0: self.configure_connection(new, self.inputs[0]) self.outputs = [new] def _reset_fired(self): self._transform.identity() self.widget.place_widget() self.filter.update() self.render() def _update_mode_changed(self, old, new): w = self.widget if w is not None: w.remove_observer(self._observer_id) self._observer_id = w.add_observer(self.update_mode_, self._on_interaction_event) self.render() mayavi-4.5.0/mayavi/filters/triangle_filter.py0000644000076500000240000000243612747716314022115 0ustar prabhustaff00000000000000# Author: Robert Kern # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import Instance from tvtk.api import tvtk # Local imports from mayavi.filters.filter_base import FilterBase from mayavi.core.pipeline_info import PipelineInfo ###################################################################### # `TriangleFilter` class. ###################################################################### class TriangleFilter(FilterBase): """ Converts input polygons and triangle strips to triangles using the tvtk.TriangleFilter class. This is useful when you have a downstream filter that only processes triangles.""" # The version of this class. Used for persistence. __version__ = 0 # The actual TVTK filter that this class manages. filter = Instance(tvtk.TriangleFilter, args=(), allow_none=False, record=True) input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']) output_info = PipelineInfo(datasets=['poly_data', 'unstructured_grid'], attribute_types=['any'], attributes=['any']) mayavi-4.5.0/mayavi/filters/tube.py0000644000076500000240000000207212747716314017676 0ustar prabhustaff00000000000000# Author: Gael Varoquaux # Copyright (c) 2007, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import Instance from tvtk.api import tvtk # Local imports from mayavi.filters.filter_base import FilterBase from mayavi.core.pipeline_info import PipelineInfo ###################################################################### # `Tube` class. ###################################################################### class Tube(FilterBase): """Turns lines into tubes. """ # The version of this class. Used for persistence. __version__ = 0 # The actual TVTK filter that this class manages. filter = Instance(tvtk.TubeFilter, args=(), allow_none=False, record=True) input_info = PipelineInfo(datasets=['poly_data'], attribute_types=['any'], attributes=['any']) output_info = PipelineInfo(datasets=['poly_data'], attribute_types=['any'], attributes=['any']) mayavi-4.5.0/mayavi/filters/user_defined.py0000644000076500000240000000601212747716314021371 0ustar prabhustaff00000000000000# Author: Prabhu Ramachandran # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. # Enthought library imports. from tvtk.tools.tvtk_doc import TVTKFilterChooser, TVTK_FILTERS # Local imports. from mayavi.filters.filter_base import FilterBase from mayavi.core.common import handle_children_state, error from mayavi.core.pipeline_info import PipelineInfo ################################################################################ # `UserDefined` class. ################################################################################ class UserDefined(FilterBase): """ This filter lets the user define their own filter dynamically/interactively. It is like `FilterBase` but allows a user to specify the class without writing any code. """ # The version of this class. Used for persistence. __version__ = 0 input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']) output_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']) ###################################################################### # `object` interface. ###################################################################### def __set_pure_state__(self, state): # Create and set the filter. children = [f for f in [self.filter] if f is not None] handle_children_state(children, [state.filter]) self.filter = children[0] self.update_pipeline() # Restore our state. super(UserDefined, self).__set_pure_state__(state) ###################################################################### # `UserDefined` interface. ###################################################################### def setup_filter(self): """Setup the filter if none has been set or check it if it already has been.""" obj = self.filter if not self._check_object(obj): if obj is not None: cname = obj.__class__.__name__ error('Invalid filter %s chosen! Try again!'%cname) obj = self._choose_filter() self.filter = obj ###################################################################### # Non-public interface. ###################################################################### def _choose_filter(self): chooser = TVTKFilterChooser() chooser.edit_traits(kind='livemodal') obj = chooser.object if obj is None: error('Invalid filter chosen! Try again!') return obj def _check_object(self, obj): if obj is None: return False if obj.__class__.__name__ in TVTK_FILTERS: return True return False def _filter_changed(self, old, new): self.name = 'UserDefined:%s'%new.__class__.__name__ super(UserDefined, self)._filter_changed(old, new) mayavi-4.5.0/mayavi/filters/vorticity.py0000644000076500000240000000646712747716314021007 0ustar prabhustaff00000000000000# Author: Prabhu Ramachandran # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. # Standard library imports. # Enthought library imports. from traits.api import Instance from traitsui.api import View, Group, Item # Local imports. from mayavi.core.pipeline_info import PipelineInfo from mayavi.filters.optional import Optional from mayavi.filters.collection import Collection from mayavi.filters.cell_derivatives import CellDerivatives from mayavi.filters.cell_to_point_data import CellToPointData from mayavi.filters.extract_vector_norm import ExtractVectorNorm from mayavi.filters.extract_vector_components import ExtractVectorComponents ################################################################################ # `Vorticity` class. ################################################################################ class Vorticity(Optional): """ This filter computes the vorticity of an input vector field. For convenience, the filter allows one to optionally pass-through the given input vector field. The filter also allows the user to show the component of the vorticity along a particular cartesian co-ordinate axes. It produces point data on output which is ready to visualize. """ # This is used just for the UI. vorticity_component = Instance(Optional, record=True) input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['vectors']) output_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']) ###################################################################### # `object` interface. ###################################################################### def __get_pure_state__(self): d = super(Vorticity, self).__get_pure_state__() for name in ('vorticity_component'): d.pop(name, None) return d ###################################################################### # `HasTraits` interface. ###################################################################### def default_traits_view(self): view = View(Group(Group(Item(name='enabled', label='Compute Vorticity', )), Group(Item(name='vorticity_component', style='custom', resizable=True, show_label=False), )) ) return view ###################################################################### # `Filter` interface. ###################################################################### def setup_pipeline(self): """Setup our pipeline""" cd = CellDerivatives() cd.filter.vector_mode = 'compute_vorticity' c2d = CellToPointData() evn = ExtractVectorNorm() evc = ExtractVectorComponents() o = Optional(filter=evc, label_text='Extract Component of Vorticity', enabled=False) self.vorticity_component = o c = Collection(filters=[cd, c2d, evn, o], name='Vorticity') self.filter = c mayavi-4.5.0/mayavi/filters/warp_scalar.py0000644000076500000240000000237112747716314021237 0ustar prabhustaff00000000000000# Author: Prabhu Ramachandran # Copyright (c) 2006, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import Instance from tvtk.api import tvtk # Local imports from mayavi.filters.poly_data_normals import PolyDataNormals from mayavi.core.pipeline_info import PipelineInfo ###################################################################### # `WarpScalar` class. ###################################################################### class WarpScalar(PolyDataNormals): """Warps the input data along a particular direction (either the normals or a specified direction) with a scale specified by the local scalar value. Useful for making carpet plots. """ # The version of this class. Used for persistence. __version__ = 0 # The actual TVTK filter that this class manages. filter = Instance(tvtk.WarpScalar, args=(), allow_none=False, record=True) input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['scalars']) output_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']) mayavi-4.5.0/mayavi/filters/warp_vector.py0000644000076500000240000000232012747716314021266 0ustar prabhustaff00000000000000# Author: Prabhu Ramachandran # Copyright (c) 2006, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import Instance from tvtk.api import tvtk # Local imports from mayavi.filters.poly_data_normals import PolyDataNormals from mayavi.core.pipeline_info import PipelineInfo ###################################################################### # `WarpVector` class. ###################################################################### class WarpVector(PolyDataNormals): """Warps the input data along a the point vector attribute scaled as per a scale factor. Useful for showing flow profiles or displacements. """ # The version of this class. Used for persistence. __version__ = 0 # The actual TVTK filter that this class manages. filter = Instance(tvtk.WarpVector, args=(), allow_none=False, record=True) input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['vectors']) output_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']) mayavi-4.5.0/mayavi/filters/wrapper.py0000644000076500000240000001500712747716314020421 0ustar prabhustaff00000000000000"""The `Wrapper` filter is one which wraps around any mayavi filter or component. By default it does not allow the user to set it on and off from the UI, for that see the `Optional` filter. """ # Author: Prabhu Ramachandran # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import Instance, Bool, Str from traitsui.api import Item, Group, View from apptools.persistence import state_pickler # Local imports. from mayavi.core.pipeline_base import PipelineBase from mayavi.core.filter import Filter from mayavi.core.common import handle_children_state ################################################################################ # `Wrapper` class. ################################################################################ class Wrapper(Filter): """ The `Wrapper` filter is one which wraps around any mayavi filter or component. By default it does not allow the user to set it on and off from the UI, for that see the `Optional` filter. """ # The filter we wrap. filter = Instance(PipelineBase, allow_none=False, record=True) # The text to show in the UI of form "Enable SomeFilter" label_text = Str('Enable Filter') # Are we enabled or not. enabled = Bool(True, desc='if the filter is enabled or not') ######################################## # Private traits. # Should we show enabled in the UI or not. This defaults to False, # the `Optional` filter merely changes this to True. This trait is # not meant for interactive changing. _show_enabled = Bool(False) ###################################################################### # `object` interface. ###################################################################### def __set_pure_state__(self, state): # Create and set the filter. children = [f for f in [self.filter] if f is not None] handle_children_state(children, [state.filter]) self.filter = children[0] # Restore our state. super(Wrapper, self).__set_pure_state__(state) ###################################################################### # HasTraits interface. ###################################################################### def default_traits_view(self): """Returns the default traits view for this object.""" if self._show_enabled: view = View(Group(Group(Item(name='enabled', label=self.label_text)), Group(Item(name='filter', style='custom', enabled_when='enabled', resizable=True), show_labels=False)), resizable=True) else: view = View(Group(Item(name='filter', style='custom', enabled_when='enabled', resizable=True), show_labels=False), resizable=True) return view ###################################################################### # `Filter` interface. ###################################################################### def setup_pipeline(self): """Setup the pipeline.""" # Needed because a user may have defined a filter by setting the # default value of the trait in the subclass in which case the # filter changed handler will never be called leading to # problems. if self.filter is not None: self._setup_events(self.filter) def stop(self): # There is no need to override start since the wrapped filter is # always started automatically in the _enabled_changed handler. super(Wrapper, self).stop() if self.filter is not None: self.filter.stop() def update_pipeline(self): """This method *updates* the tvtk pipeline when data upstream is known to have changed. This method is invoked (automatically) when the input fires a `pipeline_changed` event. """ self._enabled_changed(self.enabled) self.pipeline_changed = True def update_data(self): """This method does what is necessary when upstream data changes. This method is invoked (automatically) when any of the inputs sends a `data_changed` event. """ # Propagate the data_changed event. self.data_changed = True ###################################################################### # Private interface. ###################################################################### def _enabled_changed(self, value): """Static traits handler.""" if len(self.inputs) == 0 or self.filter is None: return my_input = self.inputs[0] filter = self.filter if len(filter.name) == 0: name = filter.__class__.__name__ else: name = filter.name if value and filter is not None: filter.inputs = [my_input] if not filter.running: filter.start() self._set_outputs(self.filter.outputs) else: self._set_outputs(my_input.outputs) name += ' (disabled)' self.name = name self.render() def _filter_changed(self, old, new): """Static traits handler.""" if old is not None: self._setup_events(old, remove=True) old.stop() if self.scene is not None: new.scene = self.scene self._setup_events(new, remove=False) self._enabled_changed(self.enabled) def _scene_changed(self, old, new): """Static traits handler.""" if self.filter is not None: self.filter.scene = new super(Wrapper, self)._scene_changed(old, new) def _filter_pipeline_changed(self): if self.enabled: self._set_outputs(self.filter.outputs) def _setup_events(self, obj, remove=False): obj.on_trait_change(self._filter_pipeline_changed, 'pipeline_changed', remove=remove) obj.on_trait_change(self.update_data, 'data_changed', remove=remove) def _visible_changed(self, value): self.filter.visible = value super(Wrapper, self)._visible_changed(value) mayavi-4.5.0/mayavi/images/0000755000076500000240000000000012747722127016160 5ustar prabhustaff00000000000000mayavi-4.5.0/mayavi/images/image_LICENSE.txt0000644000076500000240000000025712747716314021152 0ustar prabhustaff00000000000000Icon original authors and license GV: Gael Varoquaux: BSD-licensed Files and original authors: ----------------------------------- m2.png | GV m2_about.jpg | GV mayavi-4.5.0/mayavi/images/m2.ico0000644000076500000240000005024612747716314017202 0ustar prabhustaff00000000000000 vhv  00%)H^O(  @c|Ve^psTnlBkqlt]YC]cVr>:3/IƼYYYP:PSM[jdW\TaZRvg`E^WO4 #KICf~v^ncV/"kX3rnLiƃD0'QRJ}qqtD_[m~WhnǺ?x~tnƬiL^dn]*/$j_m]UD8jatWucZhHKdHpKW?fa9xl`]oLh{FheCXxQ[~V| x?(  LW=i& )+egzW e[OKT9}azp]+iY:\lLaWgq@%$OkF\[AL2(?(, AQ9,d~N_|Wjh|Woc-jie{cjsLrMmδoվp`zAbaAe0lstub97*Y$_h[w|nZG;LxrUQGEN=3T=;5,F9 W]U¹v9E@gy6 . &!+9)"E:1LA8TKBc]Uxjcc?'+ # (1 9 AIQaF/o^C²Gws, %"Yb\ye\L>c0uOjuBf}UǾACXR0/ *C:3uqlr^(gzE]c`Vk{q3 1 xztpl˰lxFbR]c]cmku}RPF9 C*!}urnҺlhzF]b]c^[CRF5oԾspC@j{uroԾols@bX_bbYfomδp`~oHM0%orqonniy_dG_iGRfG& btjŦmɯU*Ob[QazgfiZ \D457&;a{emLgJ&C;+!JS7^ki~Kq_)~t[MW:__f~IgoLEW9j\`hzZ??(0 b{Rd{PdlO?SfGlk6mjjĥ_p`\iFtUlmжoԼl{SU;nm?hnqrsp;cC)Z6(tvy{u\^PCOmr@MKBKM0%sN-"@[f]sWTK< 5 QQIlƽź_vC(1 *#"(0 <L8.TH>`XMxiaBSN9s/ ( "+ 5 9@GNW gT5r_DAnNJE80)#"jzn`pb]5 l>q\&fMjxSs]ld, )X_XwsoԽpsHnf0cO]cdSCXQDzK@71 0 }uqnѹlir=_[]c]cgu}{:7 SSJwspmͲkoeK]c]c]]isv^zn?= y~xtqnҹmiu@_[]d_Z9E-@OBIn϶psL&DTSH~|xtqlhxmxPjyMc[IaDpcjkȫnзfLK e_WbmhkƨZ>.R^N@`sehs`( ^;&93)01!1`uc}qY'lI}p`GO4~]gfRpb+kgGIQ5^`dMbpH>K1F\_a{W???( @ `|Td{KXmImOdEhwBmi3hfcnR?\pKnf0qn(U\[Mux{}~~e?[L?QM ufHF=MITH=yS9.E@h~ƼURNFB= : }o--(J.%: 5 3 HB;\ler}^vpKb]ou7 2 , '# !%*0 5 C(OA8WOEa[RφvqrޏND<0 *%%*0 5 ; AFLQ \B0eTA멒/ *$!- TXPXaYV[RUUKUPEM&MS\ h7s\)hd?{iUunTXO*&#"PRKyk`hXa7l>tUlk5dN^XSoq, )'7$xtqnиnnDq\&ir=bS]c]_`&1-y^nf/ - , p}vspnзlnh3gzE_\]c]ce{JQvmxD/&3 1 8ytroֿmͳj¢kn9cO]c]c]c^Xhu{u: 7 6 czq{usqnӺlʮk~gyC`Y]c]c]cdxV+4.oоsv{XbW=< ?|vtroֿmδmjs=cO]c]c]`iz[Pn`prtrFB@a}s~zvtrpnp_ml7fJ`ad^@R8VdnѷpqbHFI lqqpnmkjifzbjQkkI[eDRaD7B0"hlʮnзoֿU9+LJ\UK:F7_hjäkɬfRPU7* _q[fgi`H1WVg^S]y[dehie1a) bUA\_a{d}rT!nBgW5 \d_pj}Jq[%oa.83 %]d`\it>ko:xr\]c`XbPjoRYX\Z?O4B????(0` $boW_~R^rFZhGmpcw1>+LdPgxCko9hzeXrX}^]wThwBkm7og2hhidfo\byOlk6oa+ptCi¢jĥkƨkȫkçXoYdsJp`*sVoTkǪlʮḻmδmжnѸ[shoGtUrJmlFmͲmжnҹoԼoֿpp\zCcf@sJl>gS2nҺoվppqqrrYuBSS8m?f3`+nɳqqrssttt^((8g8`( Y dorstuuuvvv\{bF,Z UV/"tuvxyz{{{z^ti^P?UROjxz|~wIE;SOLUH<}lD U0$MJGf[{RNCKGDC {ź`xt771QI EB?J4*~jSE:C@< 9 YaWsEHJAA=: 7 4 ]kce UQG< 8 5 1 . 1ORKWc\_rkfzmty\lgG^X< 6 3 / , (%#!"#&), 0 3 8E,#MB8SMEXUNygcoasj5 1 - *&# "%(, 0 3 7 ; >BFJ S4'UC6ZPD|v#!;0 , (%!!%(, 0 4 7 ; ?BFJNQU^)cP3d\D{rdQpjl/ + ($ "&)477 8 < @CGKNRW_& g6pEsZ%flBrl]q=( + ($!!' Zd]znbwZOBTY a*i9rIsX!mg1hxB^yOmra)305w, )&#""$z~yusoϻfleA"l>tNq\&lk5gzEbT]d`nLb„- *(&%&dun}xusqoֿmγnyRuRoa+jp:e~I`Y]c]c]yPlŻ/ , *))1|wtsqoվmϵkɬqrAnf0hu@cO^^]c]c]cdsJ'409zm1 . - , , dwpzvtrpoӻmͳkǪlvll6gzEaU]c]c]c]c]_\|z~RSJ3 1 0 / 2}xusqpnѹl̰jƧj~ir=dL_[]c]c]c]c]cx_gw{95 4 3 2 XaX~zvtrqoվmϵlʭjĥjggyCbR]a]c]c]c]c\_'3-= =|ɾ~{xutrqpnҹlͱlmwEit>dL_[]c]c\_WrP &1)@nϸprstuYdXCB@@X`V}zwutsqpnӻnqSod/ko9f|Ga[]cYZ6G1`\zlnзoվprsrIFDDD u~~|zwtqonȺkid_~fbkKjjChqLXgENaC2?,Z`ḻnѷoվpqcJHGGTLB,;7U'41G'%9,  fkȫḻnзoԼpU9+LKJN$33,@-8-fhjäkǪl˰mϵfQONM]VMVkXghiãkƨlʮZ>.SRQV;.Zz`fghig~Z WUV"?:0p\jdeghdF'`( ]# [! YPC !axcdei}Ui9g4d0`P82:(`va{bfusNpEm@gT0 EU:_n`taymo;sVuQqX'xknSiH]g^ldZnf0pa*p`*gcJUhG]d_^gyCjq;ll6]cAShH^abTdLf}HZhCE_?]c^^_X[hJ. WWZV:J0^????( ;L68lWh|d69)`cT~rXKAw~k23"W[RVPEmaBX/7/rB$snm9aYgvcfZ[OnlhzZ`aDT87]sPmi;IB/7V}SkxY??mayavi-4.5.0/mayavi/images/m2_about.jpg0000644000076500000240000032271612747722125020403 0ustar prabhustaff00000000000000JFIFyyExifMM*CC"   !1AQ aq" #2RSTU$34568BWrstu%CVx'9DEYbw&(cdg)7FfvyG b !1A"Qa2q#BRb$3Ce%567FSTfrs 'EGWcu&UVdt4Dv ?ƍ4`P~Cg'rGXX1=!AG#˂iD"ŻZ,_r2oMVv$?G .*{s\i{jS9"qONv~#xEo*d] &rBmڽ^ә}@*'Dqe0㉶!T~[q7oߞ$'FV 4hF0`ѣF4hѣ #Bx9)iӉa%ݬF*W#S=ls$evuJdnHBᥟ^cM>&Z=< >٫TtjKUs!OLn7 IqZ@͹̵4)R_S6q6ilm{~y?*/KK'$zt3x.lnl0Y,JsA)W:q(lz-wM(]їq)N2*˜tp8*eEUk`ʀ?I>{r^=eH]"r)0X"O\&+"=bAGW*+qS*v2 ZS8bH"]hѪ4`ll${ycY:t((9:m2h܊tunYeB)ncn$3#bΖ3Ƽ*bTEy2 <7j>dvdL;>)-?]5RK$dr&[aH+j&du"SP\ˊLⴡޒPErieʛ*L%2i%Ҥzp{7*[t4hѯ>0`ѣF4hѣ 4hF0`ѣF4hѣ 4hF0`ѣF4hѣ 4hF0`ѣF4hѣ 4hFq,hʪr&uQCiNsФ!@Ls@(@: Ѩ#ӝCe3#N^[ Tr UF6~* JP23]Ut̩LbamK  s4E^PmȷXf7jpTw0,UZ䫩lщn6C|MKYL*#xbm喸ժƒv ZeFxse\\̬Gʹ[=ҷr2Ryruʘ8W+;,d$ ;WcYEUKp_w\=bhK*tIըΓ|-0/pKWn$흳ɘQ/ bvRYKC;tYQ!AaiZa% SANEТᥰk|)5)]hKRS HaV] ܐgZC(S%OLqwұ4D-ϛZt.'F5b`ת/庱^,,,X Z^30-z8|oqeec$r  O/N3j: u!6Keݵ~_?x{ȕ,GīE"9??#YYN&gnJ{&JFZ\6fܲ.k qճ ],/%AX]q/Rm'ie5\ݾ2Ͷ#o;15G óTV)/&RUI"ҝH%AHUV\R- 'ڈ#@6P!Qפ'?ݿk1《.+]~(lk5+V/P|{n^6]MBu_iM8.ԏlߺ7P*phѣZ 4hF0`jT$񳦋)FfxnPQk!/!U)vXlP#rEd5uDHN^8:FU0tr(8špE9SzIR3lM-JkiJ|5zRj-ӗ{hip^[6M^q|XSɿ\t9k>B*QLg:5lthѯEs~Xg<\TBSeSQHQeO@$]؏,[XPӼ3O:|I;<0.ҖVXHwk\(P-Rwv}|SDSbQUWvHcEA; H  UhQfS%%o-:ҮBZ Í5L4g]BV/k4;ƾƱpejtߙ%}1LQ_8\.9AF,R8ڼWf8p#ҷYZuiHUb)@T$B9R( ?~UY7K>xFE ެw,Lu\.P1cpB͟0KXRq=*HK5N{EIfXtEHi] \"-oqΛZӵ,?0sf! a) 4E`1o!J&0@DVoßO)l~?aZyjvw%zLpiצ+Mtxb*ĭRQ{T!!/hѯ qkphѣpF 5LP1C!1 phѣF>ѣF4hѣ 4hF0`ѣF4hѸx ;PpˏFF0`ѣF4hѣ 4hMËvVYzdaD ^L.+pI &)G>f) 6N|Ӧƚt3rzV M@ ֤qqi6R8R51{qmoo|h'*2>՛UޤiIý+tt@rnJd! %e,ž ̒A(@|4s ]@JbfZQg+Xk6^9e_5: nCמ@ש%'3sZ(haAҩ)U~$ݥhǭ%zZL`J̼1͵# Ԫ9L!jZqo)q-:vRp& lC=(]7g4gQ v[nJ]l{ krĎN^EXSI3Hw%\ԝ&'3]S7|qjX403ms&;؛3gZ-"WXH-g粴/J\i)7p2 C*-'&hCAF)(RmUBӢ<=1rRJ&+dZ}\ld#p@18̪{ɕRJ(M%ZɄ,hҜpUTYB9'AQGl0GrH!S2QC}dsB(n6ÑPjԕr84hѭكF0`})߈薸>JL#8ճo[O\tn("0/l2srkNGjH%O䊘ItUD=/["ͩ3ؑ14{츶,d2/.q2 GcOkpd!DZ "M2B Jg&+j=5](r-T+T #Jb5Qz-hܸTWݎѩa/M-SQگwPH1grZ(U,hv.g뉪 9E'!1 tUkv"`Z+׉V'ZSw/ ͔"^6Ed!(m/ld Ke6tэ3m j8|W.2MȪ(e9g‘BcDLإt$% W)}ƥMBN٥d? E]*/FcUBv˅ѣ]QL]II8n=W^vjͣT.WPA4[LJD)8J#H%)JT)A)JET`sKda3>94w7 )n*9% &Z61uب)qud8/)eK, -vꀐ#鐄N4;'j)Hxq2몡pG<mIL QhDOKHTaW]KQ 5ۑ%i8v`鷴]wc}PWÄZZ5[sXrGbǮfH58/NtUr&n|V6b9nkìv 8xˤE0\1-ie]U\8UE]C(eVYe &UuPDꬡu0qs9_2>iGq]:nn)m ۶U6$|ʧIL[c]ʺeʢW.2q"3*PnU[7f&!e/IiuJL$W"%n(Ul]aKqЖ !E:RS(P:9YW;]ueW]w+D,eUC21100Üaq1Zƙɪ(jɧtM+'IAFl"d]$*Gٸݲv-,E ;jhU61rg-&Ak?D/2J1"ۋǮ²nLgvs9EHG7 gNv/G-̧+4dC+>)ςL@%8m pqtoŌB3:7)lޔN#qNTeI+"эMzAAwoZg?q85y_x{b,xoCŎSN;Ǔq6S,tg;HK1_UzrƠ̶\|0-)+9"ji8XK2dWfMw-!ET!r rج3v$fgX&T{-96ii7jt~Μ!eN$!%!ZToEN)Y%A:ej5UezU<R !+Ai)#Ci&<|K5&\2N<}i㩍n`);V$e21r1ۄ@D=X1R"E 移czGa8Otz-݈,qS;^$ $n<]P0(m xpw˔ ` %8!N`߿nzfY糇뙣+ŭVZu{eHFBXfKL#\HBTldo=J.ˉahmEN-NJq <,efqoO^-9_oC]tΘa71rDJnbuOvh$HH+{]R`#[30yCxL`((JB %) "%!ǥk[7orIvP-!\k JFsW.U)C7IAH37s[DR ݙd*[l"Mj4hRe*VRqռ!ә!Kl/Z-{)\8[n (Ns c_͎8b}qllVǓv-U~*]ؠ9"+9'tjEmo'+"D[Lg9Gi_]aǩVdUԀ H*5~ݹ$f "epE]9QVÇɨ̑QE5|טڄ[([eE*-+MMlJRNj+PmwTf kHPQ!$r6D ӹ9'xAkgN. QQUNe%(@1~R|yr\hO|8B$DIV"面$gγ/YE'U2(e}\JYБ i.TT4/k-of M• [( xb0Y%>>,0Uq*dH$%d8v5i,\ȷH a83MSkݱz?i+2NPRSԪ1J2tE! ٰnP i˹ ^> %|F]fқ\XuNXOo^igsCH7R2Q|6E[{DIU9aeIQq_sxi,vʷiN؟D8|o٪ҥ*PnhǪ!zk6$dQtw2OỖ8a%"pQXo;H58D!ȡJb.w+>CN64o1{'"eSI!QOHg8#4NQ *!P$ʆNTMԖ$Udp^[Jm23iCTqiJq0Zөi_M*ei2%^vs13H5L8XMeU(NAԺEt$h7%[ϓGX"_aK$h{I4Y;bXIM^4pvTAAKN?EMDn+S\>j'ݺk6&&PC""6T⭃yN8vC( ˌ] $1Ϸ\8$;nMyz!vk8j~U6Nj)%#Ydm\j[ZS%rIME:{z3u !9O;ٞI.\0ycOC!3L]-qU $WbWղ2$Bp{2^ㄒcKU(zaůqѪZ{/TBnop.+^/ sj~$!ITG2K;Gl\CuQ^]3IԞWi\Zʿ4g$j*^)x͡7uiEnVah9e4n8ņ/b.M^̄h)(7mM,IPKz*.R@!d8=ඁ_R(rp[mH5-@2_eeӤP m֜V-.)%8jJ,IiHFaUF[hP8c{`N?n=]ZT"3 5JX(2V85Z6 Y0ɘ86ֶi{čv5olN꤮C[|K7 @DJѪX!,EHVeE觶PG~EENBvQsV a@E`,'fj|\6(hoG+'-%2w.Ĵa`p3hw4Mm1 SPeP< $Ĩ \ļ"/HqN-A[hpB {$aaFjJ3E4;(jɹb加*7A\IرbTkٹo\[ZCqHb݋_',l iW"bw+lR܍ j)D(EƭJlDgq/enUͥehii՟,ʳN{j&]M0t-.תVH]+zd gUƚ̪AU>cֻ)%kKUw) wW2Smt㬔JzuĔVr6'0kYK$\VjhʪX>I("R3 y4u EMRpA52+vi7wRS;k'"fNAN%zCMXf S/nA($ >*lڷcSdS#+\A:]-΂2q“'뱪lY[4ʡ.VKZ5xRخSl}Q~cޱcpGd7=**1,)W mwȦɵ]Fv۪r$[ȧ)nGL3r鬃"0cG C$T%IRRBX4hѣK?Lx{A隤|ٵ;o FΡTՎ9JR&,^Tͺn][B֮*$]MPl熎#v"yw9LTXpes©F;E _vB.þd6\yF2tcH*&ab9AVQ r1UDH)9YNퟱr0i$Qn2*t זҥ ! 6_yYJ=72礖ܿ[zN)0w 6(8 RXxXi&ɦ,jڲE=QYșnRX\koڠblR)sOX!'00G,\CmT '/Cy "wt)dp 2R;M"( oRaS~*$氺@c1o4Nُ"#0DSBPS:L]ivzjS2% &c%Xyu#"=Vq^&bLn9|zZ8UBS4s<0$ M׳|'-Vw8n[;&Rn[Lx>i;Lb&H9'۪nTyLnXױDDFŃO4LR)$11.Ѻ&Q4RE) =j4q=+;8ڞ2^2ݔMVe\E=2Hb,lK3Y>Tfk>R j)h=÷\'OdF`/+u2 d~3GicP<`y -kF0^l1: b:^7+J-'l@1ڱV x"T=vBqR#*L>vPrqI=,tsEuћFE;W*tL-,H9&PHPƒqr~xpn.ҋWvˣ8 ;k,9(4!P3д].6D6Rd;s-&$w%>e4BXZ}&ؐ""d Xe=t& HeѰIw,Z7ILAǼ8+MQM K*zxyqKU޲f)/0Pq!-\vhYWӨ1T.KnieηM"tud<*"\D-,CJۼ4nHJI%V'Vƍ4h%ġkx(-Mf8%AdEJؠJ8E(䣈Ww"wWC|+gvj{܏X)VAR(SE]Y㢐r8bRGSIsa;Tp6yI/31MBgRr :gۘijYjiXʼn*]l6FLq;1ZRcz8{@˯G:C8[!Gkl0}b͕.ֱmr*AbJjPHEd]N&nP$(Pb#5HtL"PL0B(QHS6!@)(=_G~᷋alU/SmX\~\.eIY]yT?&fnsΝ'fMޒViZ(Ǟi@l˒^I|mqN+p6J}T71{Ed!THQ3MBC0t1 Q)"Su.=6 |iyIJ!öyY0PY0TUJ2r*@HdJ` yj ?ݵFjT4,B8}?yq3S.,[NppdԴhۦ6)Lg)j:v$'Jd-oC^JlPB=ҪUf+p~hyѠZ߆|K?[\㜉ëJ2y$ݳ:brGhMfs*鬙1 bB}in20btaou`1[hM{NQ!>t6j&"c"໦a 7);V/Lgse^q.p8=ŜZt m֤챾C-)rt[RN?n*PQX[Qt e26 T첓>s:RuRn1j@$eH\3 *Q^HB.l*1q{e)UJ鮾I dZYM&"^  6p4rL"룺2jVza1' ?dEʑqA}a)[f{˥`$(ws֢A_$4zL (V0)er2-n`{²qI*:&ǒ/g#&s`FH98Lߖ,Wl˄ bVζ(bm ҹ4؛oGMo rqfK;19IR BE]hA7P776ӨB")KTK3_߮D%7WHZ8R*Q̓k T<옳cbͭa ~p<10 8҂EU@zq2>;1W`ˎ*t%s…TE5ĕH>rF̤YYsl KTkfr{fRFv&fGqsmEhɔYf+]xlV؂mA͌Ri)^!"n!q#lE'QfAnSԇB.h\㜻fBzFO[nWX L$-![Je#*[iϨRU$ My=Uki5^p/zN%LJviܣX8rV#]-V `Unm?徢"z!cY2z5VVT`fm*XA)X' H#`LAz%RwӗCZk̷.=95q"TvRPw$1ҡwHMKҲ쉪6h,RPP栥)iEH0sI.]1V YK?+jLSpR=+$ W:mZ2vNLqoJ SdW+uBps} C!]96﫷m}3Ni^--ft`0h=$it;7 b03+4H+e\"5 &9D sv@H*|7zTs Py+n25' E\1q \10T>TP!%"m{)/p}|w) 沋ú02q* 5z^=)3]9o ;tBdPEo0ʪf*JI[~CL ֞n4uڙi% (iԬ<OS^LXm \`7R@mqc\9%G4xnEsGQT*˷|1e7P+O(jm*T3¶#VbʹEl+brT^n.~ɓID"}jvݒN5r eCpݐyG cv2tw E[\9CX w].SkӦS>"DrQl"zR L8P^ fRd0jK1첕ړZQCM4%[XXI,mqGdjk7.֫O0ڮMtVD1ȲJSQ1/1NSa1DjxڥřbC9kaە$ "" dXn'T !˲M+?frF1vM=,!o0'q,O6bvHp6qJO9dt *|uffS$@*wfZV7) 2Xs5KpV _TO?R?Ugqx,Lq$ur,2Z<g.a 2dTndݵK彏1!Tp2X?|:rJYcllٱT4TQU*1&Ū˴y˱cJ^Yᨷ\(ZJC47PcQ%e A tL[si`1͊dq a&8l)<{20vDܻ Sqsu8-z.A욥fSs^SEluTD;PWBW0 K#Qf c+.UMBt]i(1bAySIRWfݚv{J6JR9Q\PK@N7b8%@ -5kpF֪[ܽ-q,8lH7%c{Ēw_4¥Wg+`d"HOQbIT˷PQ1Q)iƙ{"`_,NF10vRE)H+)'NQ2S6DzZYZݙi<9OFREqi㋂B\6eV!D:34-˄6S$]_u$jIF{&jV6mpK;3ՊWGM\ꘈSLP.g(C5Zp'K.! xZ%EnXB%:Z_RXrȴ2MЖ)CM[YJ@v|q/5d K-FiA!m*qnl!$q[m qťBJd7,v-:0V٨ùModW;nS2M%T܉0{3%)f"SX#9 dT )C=yvPJgCd!sCtYTM)W@ DYAٱoɉA9\|Qk_Q=h0fBVa!zK->\[)[RZmADggt5)֡24 ҧT,J@-ڍobmYŌ%etc(\sSL9.a~ޏ:n+^l `0D֋x"m"*lP ҪZ5fbfq/.!\iSeppW.($y1:T"EV{RV\"FsU`f wg|0_ lwBG!)V [&8zB3R%H,pgkD*J.JmZB_ KhI;i^*(;LRCr!Zr&ԧ]R\jU{PQ)VdVf>.+rT}`:RLAS% hm$ Yui+ޛs 7G1BCYqr8ʉ_] ? 8k4cpVyH :E[fVQ՚"dQhNz(VV,TU>|g%Y#:E؂qv*ò7+ROR3બnQf*GJ$ot$EU[(Pnw-ApWucjm+ j[9+",2 ݞ0WP\6d&AD]JvNʌHO227'2/L8fdV\+u\}at*?6K:y<ڶ(O4yW9븲ۛ% B^B[F(I(ߡVdp~nVfi%Q9beI_DLZ+OHͨ}Md I$7܈l?{_tp㪥%[8f*hnsҧa+;In e^Y(7ǷTU#ڣORA8PV-t3.R̴NAiޢXMhcÒupL 6{e&2* ݹXqˬlZTɴ3y2/вN[e gfbof"٤&ABvX ^DkXa1HUFG˫ J,ϮQn_fey~&Zm6Tٽ25MB rq2vJk0X.DZwNΉlGGHݚA]sLyNJ23L722o&$*w1U`wZbS:T *!γ]!ogn UQr*6QPSZ V(uHʃPI!_mHRmaA#b/| r4KRiA-'Jbm¹E2yDfYiID0nUEDH?n岠U9AV>#AVs-O*Nu-܏r+u$mu"@ab҈#PxyNDkB&(m6$ iTYBWЁFRnI6p!rX>˙&ľmȮvn=ۗeE}(3X!8Vixd A-1f@ȝȰA=5[S&aȗfz{rH^b.2>mF1I=Q,d9ܲ*%F͐rb3|QM9'֚" -HT ba`էD%^tIsY0V m_x=EzuL~m߮=5k^5`wA@P7 ^c]2׳}>M5i%kI)+k" ;& $)U<* pH өT:9IΑACtX !1A(D#Ǥhg<"ž: QE)q: !J$ܝ6M"M9u8ڢ KCZ$J'HV}j(XFGeJ"5ň*[)+Src"*ʘ .ݎZ(ͭt$ <-ٻ 2䍓z so"v@t7H}J*PO'S.9%xיiHyJ-m !<+ W2?1AyP͕tƍ{PvBJ=Hۉ^jI0t($m/!*EE BT?%TeWP(( 2ޏ5boF$^'BNHHB:2)%סAv )#*EIˤ0Nsۻ_8[F9ofΜd! ?u; "ܱ@YQFW:ҕtI̆ݐ-4>:ܕ ɺ8so_NHXS7`,e +ndՔnbv3r; 3(Cyِ)Tj~eL!IZ"=!ҖᲅJ*rm8:s $)סmmn)&. O];Aͥ{ j%R:NQ1 c).إLL"9 N)L=DzjKmƲ dV*%}^Hs9+N59W2n{Q^̩K_+7'-"QuyHI7h#?3ۮeUU. eWLۇb3d*R"]B_~LGmV-zHZ hc376릸.2%Otߞ6;mBDȲC.M3ItSxDE&j&徽ȥU'*p+ Pjd9MҴŵdYƔղ' 1ږñNmM*۝NUXpV8Fg# Ivʗ])bl8n9L:Rc~H~Zn$gz̚.%RchHp!Swt1"F2QlEA2"2Wc*Y wNԦ̢"SYI4@ i4oUn t#;Om'&m38=[HO6n)Ũ9˼4V4\\'Sn2ӵ Ë#JPGwS@͙c7}*5b5§3vq1Hcdi+?X&grԛ'@QQED%P^p!DR&>5?Mѩ(eHObǦ &cӰ"&***DJ'2o{z#e.s+vP^HQe:Oc#lqG8&eQ\@_'Յ|:yBB^-o{(iS.>PAzT6>I\J.hhlBZb+iܨVId݆lOI,Eԡ%ffݘ̢.=I#鸜M|RuuسIQ ?GN?hT:uv6TdV-#[ PpÞS8ve].u ˝Ay_z(8uko!ZUGi.ܰKo.2[Q5sfK4ճaY225RD*Ca9z|BSW+Y6}:5<@nEJB˂j}%7:Rn*'nI ij?Bg)BsM2ؒ)iL9ᄞ&K>Fzu{q-VB:v&y;I8i"q EF(%0byR[a܆^,ݼ@Fɹ+b4qi 6+Q59'Rh1d *)>1ba/dÃ%M٦g<YyziLk?X!Ԅ_Y(fW @e6h^ ,\ƥ-4<$+ۭH\\*g񐿣kBѤ-ń.mUC6ɝQM s H9LHECAciJ?<&&%NH+`]Ҁf-]>tb EURjM$O*1"z\(!ƒlHZpmnDVI[6ANhljRHas+H8.8蹗n9{ΒRMaܠVQf%Y%Q]E-Z6E&E4nDEHd"i"e! RM!8`WLGJL̚hٝ J8( 2t 6&X)pnNq2*^9~)Io"Ugg!&{ sl2[ &e"hX "pGRU̶6R4߸@c9jSkZ8w,4ʳ|ٜ⡚Xf#[!&?9)i!Jdk E)# dQȨCm?*B:DT+lҎF6h7hR)9.c9p :ʜn%pT{n1d-BޢII2FqU:2YGgAjU:Q􆖕4g gP7Y+JVӉ?*eDI +#}Id\ҮnI֫&}_70CPx؏"0<3XgőNK%`Y@]aۮ=t;ϹNCOUq.o`Md_zD\uڽt!LT! `)Jq( $2'{ˋJIE;g+_rzft`)U eC ؋3c7oi&ӯX1RIlQBnY͚8\ꂍ*AUM#S{UkpIWrN%9jMAt[ԥm,).%ѤնP(Y5V#ʃ)D{")MDGsN(CmRi1WL[l$&RMrk9fDI\8`h{xL.AMaFaDYTIR\eS}gzj)y5]^B҂.! 2kP;*ŦPu 3=>-Ez.~D#''7KJ˕IGlb+8.ȼ3P`g.rRL{q F"=䌬\T^ӯb~p:a͋5];\Ը[^ŸE{)v9+$#"n͹+Pa%gr%QjS]ڬXt\UUa\DHB]J 87֠) zE\"؁+""4% uVU-J㔗[QUa$d9;.Ækgoűc+ ~S,qudY4`)zV.s곖FWgW&wDT6jfVCdkiJrEN),e{NvTz<-r!c2l&DV2_i'9&=>8=q/ liqT#z#\QkocqNƬSUư9'6pA|^nL2rQM/pnSCBHYU=3Z SGq%+=o$ *yH*[:ԐvrNʰfy!)et4}%jD l HXC-)MԷy|Ɗ,l'G0HYX(H)xƊ3uX]~,ެ(&ۉ0p_U07XDw+)ۤg(v l{3$eHQtWMQk5?#'Rb"ul$/%E8Z13.[ٻxjsrMpes0gP1 c+2E]itʁMP<r,PK석V!$|uBWcHp }XR]Iuo`ŜICV3,|H^Eg@P8ljZc 2$4lU%ܻEVJk6Yb7GHPxB)"M4Uc7_s TTT;+4ت.C(&R4rYE2,+?n6m6N<*Us؍[AD]u 5rwl%Dż;#AnKEg.3 -A;i Uck n,[sgekSpNȱ`IǸ#/9DUMtL:jCK?C-V;+Ig,V3D7U2(M6"xf`"fw <)ؓ(cP;zS&t3Cs*"U$#u:_$$"#.{QǜXӲŖs%Cf: P'2٦SdJR] 'p(3.ݱF{LN? cK$!%r7N\icF|icH*ФiC㖀u}oÞ[5XamPzܓ *>nf1O#eZ:ED8fȹlf2jC Dszd *BT )*O0AbcFF4F0hѣF 4hу4hу4`}F h3ʹfBWeOzpxzj,̹L,Jڣ˹9m?82Frr`'A <\<$K.=^N6ԁȨE!'`Y&(5Vn0fՠ9tt2)9zܵr~=LXשL9UˤrD\ b`'e1DHXǼwO@^Ss& r gӡf%,IFm4jǺfB>$81IKjaHX5\㙫(]>[%(HZJBu"[V;X8TG!?z(=>0>h£tc601U' fv P^kxw/%:}ގOQ_:fkX弴E~1E\UfhJz‹V'#hd|̨.|vX- rΩ_z%٤MuΒVTJ'&ȴ2"eV1{w-VG3)dg>Ko44Ĉ8ӛ&[wLxeN`>9nbUhH4!hq@S6 l#VZ]WAxzH󨉗ڡ)-VfA^6f!㛪ᷬ?4x*ź2Uڤ48Tƣ4tPpp6Xa6l!'(Ż&&j$u$!v +E!`}tj;}%J*Ɯch ̽t3d=dsW1/;f sG%jeHTpsQ8xw)|:MoY:K7fUX`PS} *w8!ST3VylxCJB&>u>x箱OB1djwGQxbBe@DW6dq.EsSsX&w`tvII;Tu)J[)aj_[JQvPHs:o-2N]"kj1H*4S`%wDžEѕn{F+Nrj_qa&PUk5MwN^d"+`nie Iv@di4 {KEJLMQ' "Ɔgm wz6^(\E9IY `gGQ5mlA,CCx(bKud*Yxy+MAT%G8p*I*m n2X%m4HJkbMS%ǃNo;Ԏ;JRMWesknr]\ErE=k,[m}0#C}YZGhe_-qpU2qj5|;?,᫉.kA_ȶDlGmsl}N\?^.cMOY6ɗ^x{36*d%J?C+-SժW {n1,Ǚ{E4ȕyy╶ݰff;4Z*O關ɋ,a{loXiHJ0xo֥d!R!..ܴx_|MV3(O9h*tF+WRVUG(I7^Sm[fFc8㞮p).u@5r RJIJ7Df[〄iXykЅt,+ fC[e $fiJ\N!'Cݜخ6uEb-^. um$y~2.°WQq"ƶDຓR|em!Y+ٻ7cYm3SS*Tcdd[XG::m/xno Ⱥ2友a1TAϙLVOn[KNq y,a<,Ck/9b^Iv˪*2DD@D`6$1Cm#xjeT Ɛ%>)q ]sk cb?]DvMG:q±HO$ eC [8 ݢe0SSc(@@"pml4 c$a0tN`f)#HIC9 'dX7Q2n`7"KDST™C2cJW(YV)<7|N@@_pƿ l'1`gq+GeM%z䨽ܠ٠wJ; @ PP9bb ?!אæ`*c5Mm vo53i)r!wqyDp 'ʺhEBlqP05{ZR1k(Ld=E>z9tRLQ)D(̬t5HY; >ΌZ-tMH\8G49zА_hs _IlONFVC؄yAI }!;{ۻ3Y BF.;^a@ԀtGz#ilLUQ;.|y;a PIm]mח\HN1|n6c=ww6@ l)bm AM\:Csm^۞߫ i`&Mi{ېUlݱ}Xy䢆Omto!ۦBME>|Ra~/lmu>/ՇeMF3snVQ]"=`"'iM6H6ZNw+*]Y#Ģ1/U~f8Ԥ-?T?gy ;L]:wþ mGo boI-հ>1~ 5}oVWԆ?mǍ nU/h},1$PV9@LB"Pmf&pۯc6Gk;|c@Yӯv&{Q<MMA:__?+o HF\ɟ`xuDniק]69o0؛.zr"3Gp˿iqݼ9wgۄdz.\P6Ze_gx6%Fx:,/W > O@$&&b q@ra~~]wN`ܔ~;ۗ;ۖ8.\o=yv_[yucy?Xx ^B ePf!`r=;%W"ZrT6 iǝRH %K iX[mamH>z6 5 oI < Q)yCњ=YPqB;)QTaR7ՒF8ZWn MS8ai,ۺ]ђ 8`9eErӵp b|WM #ue-CN7azOЋP1K#|>"MzZ9L+#(1C&WT9 gl\U6lodUA3cWHE]TM@/.7h~oa":vz5bfkϗlF"V|141o\^4<۷M2"#e3#6!a&rCi\u){1D2L.}s %c5Hm"TJPа- l#o&vQݑ f+7Y$`+hCSu<0 1qH70ñaڔñJ#@ Pq%CZȥXcI(Ǐl7x9T?inS$P1L`ҋDBN@ҩ+qZE3ITX>Rna0b)=*3;|pjZ3b$lyve/5%2via*@Do&H_UQƾ36Љʋ|'J8MUd$T"oK0#|j*zcQ7M9Ԍbw۔00bHh4,}QVJ`1uY̢A3ItrRO9Sgސn2&LD;!=: `g VĴswglvKJ8z5ThgoJp85Ċ&ȊYb|j̈^]ͯj o"Lf6`(NI n-{q8*cU"`w ma)(͢J$f0s@9%Hb |MQ*<9|QQNt5eV%[&ټQVlWg.rM8.[&SDTH 0KpӈB%BI.0fB"i&nVG8*J4>/1[p|Ca+*+Vm$[un<$T,uW|cUN\2וa]tᑔt5fi $,BIr#tAc<(,D p\IGLlČ&"Q#9@&hJ,u=?svG9tf9trTE$r,cN'8aG!M"bU`TձJP۬J4vl2 sJ{EsS]((6͔;sAaNMZ6Z2MD<ʁt 0#rI޹)TJgNtk*GPirG5>%EJWȈJӮ8f6x,G!UզmLTjd᪉f`VQcӷڪux5RZ( сJRFQ<57ƨFGFyܼ:.,@G)+ؚz PQxQq693z>)^H@F#*${[2S嘗-)W68RѭB;੠B-*6-ؓ}ĤXC6:d>NuVI>m}8dz {Ze֙p|kUT^$,"YY򡎸kACø* yhk3<-mRf)5½[y >q =]Y3NN +cEgQ&--ع#Q1}ǹkDWNJi4Mwmd?J1]GK!&% 0W'[ 9MAVr7s~Fmr?ɔ+=ΣxSSRa.d$jܖ:wzY>d{j_ťimo K/2:;ݹPr8uRQ9!6i|pi1Rk\He[rjd 4*g+fy%X ^lLݎxZR6tʼn1nGr5:LZ0v4tTSB)|.>FuyMa.wk.8᠜:`s1u逵*B8@k|# 8U.dl-h˹O0@ƌVOF+;ݞ2eGh)ͪyhlpWˉ)ՓȬg~նW`|V6ݐ>\RWmX4F B<̧K.VJ42BQ(mR D߿ͰZKza(JuCZ[x$[xzHV)334I  YҌټ?[2nuk;xHW۫sn"@ c a7D<6=XC{_} lnn4+ 6@ansy>A9vr(%Ha]Vqι2"v8}~aLC~J6?qʯ}?V.QB>D)ID]9k~X*Uypo=]-\ (ٰwn;GCW˜0WH!b8 gcb[cJx4WE>~Sl$X)!uW`Oa6/6@6v[}ܪ\ɱdF[2wZHSo4 A"l42~y9ey-2#=pW_=zp~n/1;{;:yorC;y@vo yzl;^[N CV$ny\۞xj6@- mZ w{|Ln%omzk{~?o]A>oȐAv૆6Qr}:XVU(?q*(( BpOf~0x4vg ;˻ǾEĦUIe(qvY7 ScP;r/~0`e@~gdJ#}:E6ðuzyt!qUFͽ;5^HSۢI;XUٰ|zoiõ?S$NJ;ox|į^j "(zw<߿!p} \&&~^cHʄy%(M|?: DG=|yㄹ]%rۨ}î;3SdïO/=ʠ{}_ŮNolrjJoa4YQ"ޗ<% v?C>=6ۿwLf1mͻp w:t=|{<{k21)S߿o~ӮR({=-S^ˮ$87Ks%10;matMcyy7xq7Ob}l>unG J"r߬@@<~ݩF\R]ې@;w=[,'ѷ]"y}K1S߱C6iMB'‰;ǧۆ {rNM7N~KtZu;۝(ҥ&ַßMEN>X_kv; 5a$cQLP )S9yZSc%^Qh!B>؃++s0 m|9vDLQuE$^poӧ[|ԶZ &܀#t 1=JS)BẢ]13r4#ltd].BPL`lX;($^P4T9C "$TG嫸ʋQ슬/QF:#$R*S*qm{;p~9Bf?XGČ c?)Hǣqmo}6BI@׻}|gez_Iu=ƌ8{~; ԗդJ8mڙJM@T$E# !.co$袰4Oq83GJTآЛhb%pY%%^*9ҧwki覭d" Haǽ rX2 J6*̈RۂL%)QXOIkJCR-AOIbKZSF9X'h!侒_>3=/ל 5q7(Wڧ8]IYTJ YZ`Qk6)-081ni~f[C5FЙ:R/"K7hLr1*_TYD0pUW}!>#d˅%e9f]yRyn@)*N)*W~5R0e֕[o-4U[sB}>3=/_kjg2q3 qK_0;} r%z&62!5Nl݂hĕk$ λng:(z~i~@tfʤAv)̆%KKz Lr<mi; $\hDϦ2jBRa53! z:ũf4wϧv_uZ_(>%i6@BEV~&&L˥ف3yv뿙o#Zeqt-?_Y)?*]?ƞfaCaS~E֏OK"^c?iQGд_GY)?*yspt-7v_u;/ט#Zeq 9B;?{QK̏=&?Gm7r +5js(ESEC9ÔD2G1@LDw]OK/38VI?ҴuYٛ?7y/agW/|gez_Iu1I?ҴuGOlw %Xl%
b6PQp2#|W5Lv fP*_vesƵ.;.<&ʏC*"ޱ^Bqn8.WzT94yHuM8򜑙Zm65-D܄k7Gv_Z(mlnl9# ӫ^]+q|s]JK 6NB©P`ě1ʵhŝ9Q 3E?}5gOrAKCI";m5@]wq$de* FE5E(Ybv}k?U"4:`F@"<89yT2̎D\"  H^-B@˽URGdlJQ9is*n$% rNIM+o[3tZ!.H{7xjnQXK$@T2V= Z36z(4JhAb굲E]dS3eC짅.ˋݡeI]إ03NJ(y7N*)C2kQ2N9#6M̴IY& ujKVTEUVSsi nBtpԕ7e G9^(9މKT$`fJibLͨJZN ?u&[.P←I p4GpɲXDL J=>;30ѣF 6-4`P$ؖsqs?HaY2+̀FU&@I6CQtJ#%~[S9s >a#,,J6f?wf-7t>0[l, %kK!ZӆkRҎYt13+4D R>Yz ^w@T)sgk ͲzEKUpl 2n܁Z~hdforLVn\>#Lutl WCm\@M90믥LnKii+񥲖ChZrK:PY4 8Ѿʬ W_u4ưY_.яVp:.eSfѹd0Fyʟg:I$31qHܽx1ԼK/jX1XӔtطVrl<85*~sWYӸޕ%ӚY᭵|Sh $fߵ)kXt9 X 吶I˨JYJ.\pM-0,TC2M7i|)3$Վ^))Un]VDNeˇ;F2ar$RRbML#lqx=\%DZ'*P˒豴㶗Zr\IaJfQ rM`2ky& CUoߣ.4Lg/$F5Kǩj[ǯwRYgҍnrk_೻V[^|H; Mp=-3dR.7yrYNr!IB.\JB kB|۝m”Q`% JOC+ɬ1%\m% xæ>y9g9 cepCVɘX^u#v`J:t Yyę=/kUkm2N,0< ./^c[cfonBΪAHvAp邤[SS*Y|?Ĺpq#>۱hC׉C&gxk8pN60d 4j앆R*:MsO &gƶZojC1EY(vlC8X(.ox ZOXe9xe:|WVI̸eVHky%֟eA-li Al8-n؄~z㭲cEʈXMPL<2*RP#,55J&TCbohoׯvt U b=%:JRl (Cc bJ'.4 !8=oKclڷz\²s 1HTS!C=09@M5Dc Ko2[|6wJ"Crԛצ(?@w_{9mۧqYނ* Gʶ.2Jg}hPPL6(́/U'R1Lw˷;!>akWdV'PHi(=j%Q9DyNQ oA 8wmn :mQanq@Vx&"'DIG ȧ)Ԋuw(շΚ%9+),ԂJ C [6 Vb+03DDqA3Pl-|zHJmͥ ^&.uow^f P߻~}zl S!밆;奆"P>OmT1M,;#I{mT{Þ](Sx?/p/t ǿo`=DG}ZZ*|=G{Zayuk0ũFm!R/{;wO*cxO53 >p{teHWg%+U?"Q=w](D<75!yxa+woۿxxtקVjSH!AVAO$k߯Ls97~=k2rz=t'>zTTM^ܮH班;~Ǐ}xàJ :}rtfM./қi6k]-~^xQ(_laGO>w]}(^z<<59@~~LqGnvۻǿYF)1c6~{"`u{t(1 v?{o|[$ ߸o@=]aH3uGpExp۫V!`@mϖ́ۿ{NRÿ}/#Hq߯?=߿cXz7(w{H뤟\i -?R/ $@xC*1M"[Co"mGG!㤊mw8swsum׻2QϢ?f"Zuq7Sh7Nd^=:[T́DD9ۯI6Scx}mJTtwPVܭ7{n{5C|w_PvY'7߯A/~H|h2o=~#SѽONV #RU-퀟dGmvH |FFR|AaSU_lnjZv܌C3l`X;Ph8Hd v7&A/xl#&އ#-pHf o "v CʤEX r"0yUH5Lˤݤp;PMWMS72&@5xjIRcNZ:M2LBym>W\8nu#.Gy]>Bd-H. QIpM۪`5Zn( !DN<͸PxLc d*\t!ݠčSrXD+OQDi1ī ^bfg6|[75kX'B2~Nj~rW(<P-2)/R>UEENFrqa \Ě)FDKC5BHvh&CWA6+B( N8icz4&~3j1l.Si(IGsȢ )/&gqLȋ3B퍺RX C3NSپHn Yr2Yb79Ci1`Ƈ:Kl8im 1vS}}L$͖sNdTЇ iuV[;B֯z2sٚ\Uǖ(k"jq,&d6@(;LtleW(\g; F1nMJ7u=VIђYIc#@-1? *De59, FEosBIU$W)"564dee K4}k2>olX68biZͪQvfNRdO:,iF]g{*ٙoR*\Oq}dYɔd~sRPZNhcdaJq濣 .`3@+W K8VTDnqLLK)p?lv'R=fbQY IEҏ*ddRJ*]z:53.C<i˨>K)5N)O,/qVkp_e\VSe(d-bVkRW\I% 8RZHoKmY8A9c8U6Ih*dLujôWdn^gz 򭍜d<928F96k4QFʑ7+rvU%Nu8{Faҭ>Iov$Oc$WWbȚ8^᳐<20^3x4;+'rI;;(H9k>lEL۵Ew0zv$֠f̿7l":v FBҴ0tea+$4ׅ?ї'+h j3JȖTED!襤Uk)j'>lӐ-dmv,U+H-L3f!$ѡVA(*dnWh a9{ͽ&Cौ)$`JAv"nZivްʤP9~=XW)rQ E>I^G\, ZCi%3yC6LTQ0*g"ETp"EUߠ&t@~wqlcK֤nQfFGa`ꪦfcc9z}zP0(D9*nT2PU!֩Rj ȧ)3& n!Y~_ cRޅ$+IAnVL3g qVQÔ^\h]\ !%kn|];OWRtUR+Ktڼٖ+0Rq3rՍ]&~{5w2Mם(@c ;f9·vʎؑa&Nh{/SV)MFa~;Mmtd:SX %Dfԟsԅ4m2 X[eQY.b_X=ZqRkK#kJ"NG㥑%Aii )JBx$)hS`)$n sR"B]mn0[GJ4Kڲ\kƠk=qeLQ,R &y{O)Vњ8ZSM>""BnV.u8xZd.-F`Y<{+E{56 '7*vziEcX<:nV='sFIy+4g<4iys {\\[-q`F/)d긁mbbbXS%E%}>J`ǶZt] 9m+J'L@bb?] 6~mzw5p0nut6u:Mp!\Pk%k |.g݇|' huxr9sjsǸ{X~]=]f|<~71zxSU>^SͶB7>V-/<&Hk[~t; Q}[#{cwC}|5}G.e>Hkr _o~=k4ie_3KJbboo;Z+Z|;Gn"eP;s7w.}(ol 'o-pnV #7ۻ4jrBl.Sl||W<\Znݺ{$!Ul =O_xmgLpmϒm>`?F5Q2ܪn"&(}^SZaa, >``ݷsNEA oH`e7>קwnZNY p66鷏KOs*w]-M(z5_k^v=qۛs;ut։#):~s(@;if<l~Ht$myr;=Aq[yI&7Xrp8wL;_Ş~bnw|w}Ynx'*^f7O1b?% ,߱MDR}#}kQ4٨_~]<`4jҌ |R??Vr' eY8r<$4ۘ#=MDIR(N_$[eMx%/7|H "CnĻDJ;: XjVj|צkrfhr'#Ƽ3UEH7rTPs&p/!XflN$i)dU{:|)$$.dtQWQM^d*vaTuE{$n V .٤LL5R09RPAJ;z=:s8 iؿ*FC? :B6vt^jҬ"$܋;rlHWLPb6%1D:!A nKё!lC~5@y76R3n!St}W\Ip^o0`̀{0`Ya_ ?9TXR`Bz>_BOѨ ؘ4hF0`4VW TR`jdCw*C(YZGEX!1Lui/-$pEPSq*"v0UEC":2fE~*<ڒ<668aٷ}%7"[uߘ,I4Or%s5H/HE 4]ۮ]- 6BV1"Gti7ȐʥR1 0Jz,Vj" u>ҙ]u߰$^Sy".kUxBCx[37pϐA1zM#%ۤdZLJwE19dPĖ_urƳy1y 4d1̶mHИ!5Quw,ЮB p'5ҷxDw5wREONC݄&%e Yaj#!QzƼ4G.LN} &N^g3Ķ` 67sAV6["F7E2IUch̓C`y{(q+[̚V3(ǔ$cڭ'Gq=I-ֵng/1 WJV G"0}q<9N۫-Qy ^ ;_^j2gy8Snҥ?ſ 7dT ]L2oD&]#ۓ/񍗅8+⫕9K%^>y+Zߴȧ5Py+,KLh%4Q삣GKm(m )NVRB|F8nmnnpU `@6r 0вYO_)[=c72 ݴt׳URҺ8fnr|Kfe\HLafױpm0q2l"=G٫"!VD֬%:ÿXiS3BehYFLy-- ՕJ*ejv]*f-b]-tjI遀YWDP `jv첤5&*R 7}BSiڊ%I)Ze8NdisS >[8P)%7xw֠`cr{w5I`܂y{~SRVx\/62KHw<>W~of+|`_7wI{7.!=?v. PjN Bu*Zp#,'sEZٙ3KMS[Z#P7vZYhg#o n Λj1۝}H ,Rs7Qf[f۬zF٩Ϋ_Ei5&U73uNWMT1*7z#ӖZZ+lLjѺ{-ellzo\;H)Z&-jʐ.-8=emᨤܧR %r8}nvzuZHmo#=\^`";lH^bQ( ;ep8q샶G-!h_b/ץVp>mw^r9Tv@o:N1m9oӇd*;wӿq}uægN[ۑ.RRVF7ۧ/o4XTQ0{;=yKlX۠z{붣&zrpKe ӂ\W9"@~N(Gv뿇P|Br>ڈR}c.^V=Aۘ_\eHJ\x } >ޞ;<E^d{vߤ.a:v0xyuZW/zroN~a~3M\؃o,>$#ag66~9mncӿ` c=vkzGyu\?GѾ5IE ԛW^xi6<gϩ?r w^߿߰|hRL1#Qa_\6k#P86~xl=zyo{ U.v@<gצ0-IS|C{@:AouhAzg@+n =D~Q֟x*8HW"Tǟ^iwTEqDyV6;t}MFpᵱwZI7Ԃw1ڮ'TVWn}ÿYns]7 uþK1ta]-|BwyKJMv;[`w !I䕛unNnCI+8uv^>WӝڅA7@7:}K42ӥvk{;m8j*2҄-J{ۙ=os|+/Dm߭Me@w=~L\D(v7.:Ӣ (C6$@KfǞn71A#HSe@ZO<ۮm˷pn;yZRy|Fc6uOŇOS(uPn:=zxjߟc8a7Xae3iZdyWZQ&mQIU;:HѺlILgTmhѣ^bןץ ~dqݩ[[dS"Ԭڬ#GtKc=%3eH`֎Us#()U ,,(iYmzr$ F[5,],E u FމNtJVŊDT\C4:i>a*bEMbwRi{:лnN \V{g&T8@dl U Cbs "Xw|%ysz}#5 >qNE>U*h1~` >(WɸA_^ CEy2H _FG|²x+T)TIT*T!b1 Qn4_e.X5F)M_BOѨ ؘ4hF0`ѣF?Jz<_l!Z]JR)`vULrr rjX?YP dX#Eȿt robj\Nu:ۖ945᢯[sbڻj/{n$1Yo>WE]YEbDPY`0gK@`(ӏ%c9c\XW](nYDlH+W, VЌܰUy#YÐȱMu#uS!uRM)mn3VjBiWFܮu+P6-kF}+j%XQQIgTЉ)rE ׎iyJXfXC,$_+=KY<q<3e:#F]N+N߲[cW-NH¯~e6+d-ڪ՛:.CBAH9V#ܳ -XiP왿c;{e]eȹƣ4hg Akw"89imWw#Uȳ7:+bp6r*cܱO61gp!I,%ĒSoq7 ZVE %A 8HJvl@6Vg+Bn[p>2!\)..p=n35Vue նHa,LKk%m-iORŸ&^s$>vyb?$d'T{ݾH =w J^J\퓵qFۄ2E2Y8WIJ\ث 9w"TQoxHR~TGjTEY# ^>hY.mG2tCo,Xv}ZG{Cpp\DZT7ۧSclp>ԦJօ(]ZCN\jW4 Zm#n[Ow5 ɒMZe:ǏSpe1]8[ڲS |[q'M 4ladr4+ўAY%zq(7)pl~7P_\6"c6-hd\tA*5lf*t; |i7biZPOUm cz20ujؤ-ViDs+b\&2ϜH;T;rΒn~ [QtP|F(pT_H5+(q40BTʉ^Mb@y`!ui~=_^þw Z*{߇[,k}`?2]Ǘ r~W?7R#VV0 sة)CI}VH7ۘhuyy{;߿v$%~22vЊz.Eɐ &c},JQ"_DCwo:; SyQTޗ\l9.LHeiSmRG X=2Y>5m͆ؕϸN6SpZ祰j=}DULT[CC`(Pz4qcC٬.9Բ;bk #suۛpêzv)'rw]vdS{ R"rT޺`J@Av#G7.qR!C~7\^]5Bl&>{oҳťT )Q709M_(xP쌙F/JJfhC&US2ՉL PɳFuCEfQ0 DݷP12u(wҫ!pjSO[F (P!;=%jv.֧5`x]CVywgQB=(=<;9-({! 1ĂA!-qn$H -$0( 钸~̫ʲfni;dr ۬*$U38'<29jBut~Q,> @YHK$\m۷5=/4Q+LRAK >wJPgF*m1$r P!÷~ ߻E.@T7/h>ۿٷxD\2/a@Dvo1 j8r~l\>~wۧ^h%Z\u()W-i;7?5ᖑ'jQvp cmm禳jIZ662~xe>W8uco[t뿴@79 g[o7۸|D;:Y/)qM(3F p|S*-s#P)OWz={xq67߯0>CۿvOYcmAݷw?@yWst]a߶}&mhJy!H#˟[ܨ|.8 :CnNgFP[76|mA[~yO 7XU0;twۻ_V:]haMi\:s{97dWҡI Jv㚯kg BNmCǻ}ߧo|-IqߜC>}zJPxw뼗,m =@M=7?Ф+Oёo#n?cR }Rrz;XO0*7~/܎%}YD~7l> B;÷vAOWt (7~]A:XDQ}"u\s a~Ӹ}÷/T7C?n7-EX)B{mwﶮ116Ox8.* b ?l;l!mQg}=cYןE4)-4):n #ر5v. 1H߸Ft".;QEJs%6 'l+E:P2eQ7ãX8ڽ5^im+ZJNc2\cX>ARw(Pʭ 'f<9Tp2H@Xy[6Q övͪbq~v*oJ17jb=NRK1A 0;^uT]QAO3BA&(t!P]EiR%QDx{MRC\\iIW;|qǞiR96rK2$@!=UPH*n\#ND ;@ ϊٞW!xϐZth ;,Ю rcE?m4GTZ<P5U?^əRf;MU6ZA\zq -$ZVʔ4e6HN+V|6DP:!-1hQqqh- c%]e(#;^` {@OSm>}?ê?H3W?NO3lb J%6(\qo5 EL@9ma7(r6w^[fx _1ŖmHFRIH#則lHIRC)K7c)J6W1L٨@t=ӿHA.jB%!&1 ";wpYj6<ې* ^Q0wde)USH )opkF\qXE[`$_B\EB acVa.>䆛S6J'{\XW6a㡚.DqADzn==j=,2JKէ2#!(Ɉ:` Q0|c3w1n<1X:xs]dE }Q8uaw;wɲN\HËBѡu$CpAmo.3܇SRP9! u%"/6}!֓}(}=-͡0RVx;Y4C3)*e{)S%&5pmǼBc<1YLPBB6A˲J d6Q7 -x'Q"J& ~`n!onwdVX/+\l>ޅsnWO`#_X.:Auʹ$bI1Mbe~"0UpUDCN!&4RЏWi/iRyG2?>A~ǘQNVKvqwI+!c\JF~U<^3/Hmbİÿ^|~Yua_Mz Dq%̽^|^GR 埦Xfq?ړaBz>_BOѨ 4hF0`ѣF{uYH%o-Xlx; Ǩej3~1U4Į?mۦ@fM1N=9 h_ ӌwfS*xe$|e w#N:lf>M_rʒS ^7􄛏67vئFk.̴ʥ U$xUT1tԂӄ^Xqˈ ddb^vFl0HlX=]CpbVx"70;Ռ3S:^FjE7$onԦ>j 1JHہ-!uV:arOHȱi`44ME솉8cJ8+ c{-RȐ5_v¹cqLLo(FX%8ha- >cɶS5@M͈6qKSj J2H+ dNHVuVTQw<7u7o(1AY bqWcV8;@a%tswUi5Rq\V;9W2PsT-HbʩEavnӦ4훪9v)+~8Ƣ ad+%g{SuTL1 G ORj(W!.1]VdXf>-nb#rvÕ8>F^G`&|Nlu̍dv ^]"HP[Sa>j6>Pd{{m)#.bqݖ꘮TYnt.@,M$ZC`sѧ`Z*!ȫm e۫"e,cI0zDv6ӻo|f,&rMr@VRM87E["moќkR"m$D@)H]1y?{vX0i\}wk]4-d|-pS;EҐM#]#ӯwA;[R=Cq/=jmg/Hj]+b<߆߭i@~<b=G־A!n(/n:ͧGsn{a]ZZ}`a߷28勣VFJXy %Yd\ڐLfE` 'XIXu"J.mk_RmrE6]e)ԄNw-s=[\dyNcyp1zti) kU>6EZ?$*)O\٢<&(u8\Yh׶9%n樳N`nssν^&HEEDF7Q0_G|BWfDrD*!HufVT',\yc(jgK t?*MJME&:IY sENp),.WmqS ~=f0|u=ø8*jvb8E]mAdLRbWL ʪV &xqP+TO;^-!aq-Š:mۤ묲EUSCKEYs_YgzI<ӧ T2Qf8:bz܁mbl&*e K@ʪ9p<`svѣF?hѣF A|nu| %@p^dP-YnxK@MdPN"ZVngHzQuɽx7n:=9~UM+*HR1R},ar7[HbbPM5Tfi&IP1`@*DbKZ.3#Zj*FZRɍP@Z2y)-'GD)9$3iSsY͔ζO>-dJ8)W7 #kp ̭EZ"dJV}W>C-=NX$$[֭StYCydPWi-a*mWʬV~`tsnf4Ï $QGpo \^|^ҏWGBGzzDGpĸ{1s|ibF9g_aK?qu/!_cE+l}ѣF4hѣ 4hXxQ/*9`#(GEb2g0v dk]*JGUmClP2pj5`FWb'”ԛ(6p]6̈CpDZ*>z*!p4d8DcQSF'+OXzewX|kRsu5 T4M!XQfݠ;"Vq!lW) T)A/ ͵nO \+L"1A!)T̛wXh ;39ZA&$WRygOd;xBId$*pN9XU˗.Ue*c**EIjB.PkőkR[ZA? nQ ]Z:]ٮ嬃bswO?Oޞ<$_{ew;uH@k??hߦ>kO'R^$/]P/(9w1>}8wQk.;[{d|`bn孿??SPL6ߠu=>.ɧ(>קI)$J]m#, ;{;=Wc1m}ōX[{ߠ11ha̜'s }eR=,G>=t s%8#ާw׿C]BPyl9n6%>׵Z9t/ox}ȥ6uܦot~0aԽ6}^?"*o#;؜=нm7x>iUK8Ím??/Ӷ7:  GmݦҥWm`߿H/r;cmvXͦĨ(؝of)+WԷ/-BuD7^u/rsvzNj[lASqvDvCmҫ?*N6ZEcxiMMZ%(ȚdF6g r" a8uHeB7pm x)Ē(@$'yue2;ϼzk]yH m~t7_R?ÿVxro =;4ǍXp\ %{t UU0  %~QYN: ;aHXsDs\mĝv:Bz*'LH0u-&ŘxHrBǕ7be5EcoymZ:\4UcD@(cJRq1~ICqJ!,'=%mCplQ_g[QEQ+ "M䬈(gN@ C0?/ GqdǑV]I|Ʃo[q];eihʔBS7dܜsJR)J(lwڂ3F`6[7i7 ؏-:y_ ÒTΕ?jFnJdctfCY*eT":@ ˣՙlH)\UY9L\M.x|v/b )4Y6)"*ii9wBR̛kzAW̓<|Pug13vR~@* K:G@Ki)H*za(ѭi()OSoa ?hѣHƁx0sG1sog#ΤuiFC{˸~8ԓ?iԬ6kr*Xp>`p}}m6 4h5 ?&g V?ĔnI?Atn0f ;bq0.۲@g |fGٷeBřr 9/EvrW+,(Ƴ]B. py;]\_ 챸I ZQqmx)&dtqf[X.MܝcGvJŒU\3A'U*)pwC_{٫/MȐoIfw7݈S/X&x c?'l=s^I弑 %-W3U y*eI[Ld3#IRl#nᥘQ)aHqfH}mוˊJ}-/KdZK Om5t$yJAW/sQcICW"o7Q)9Uȉf"`07 ǯ_Aq7nRU# kIAT7ؠ^||AjS  ^P{Cg{@9βbTǧij4tjM]]y帧RĦQ\#EַN)]ۓl;sE`D4PA&;`PQjʎ33q%E*Ce'.OT!8 G *,TCM^^`x꠼a1T*,"τrD}Z)eٱT6+7֍eb 5*$R/'$dL^ʯ?Tw vUa]2MBߎN6 d䧠th4T6X)@{(U>}-`4lAkJcov 4k 4hу4`0]IDu79įkϋ[\?B_&g?LT!7qH_hЅޟ폣E{j=&3F0`ѣF4hѣ 4hCzMZ[D^啍/D,)C}D6eQY'+#Qg2vjkSLXz60K(EH$@G^4@}2e6\*/B.h0xD8YuF*;1)4 W6'ѫ$%Ө5F0*rn&ɐ^mFH*a2)~VL8ΖI;eT`7u9`ثd Dm5uٻwƘ:I"qh/)@;M2wx/5wmli4֩q#Fa:Za*)ߩ,pyWV,r?f%專y^ʠNMm>^c,:_w ?O{jl_ZpVW ߟMA۔}r v_?=e/H -o9 eY:>{:þwpm vW99y\40o E ߸toi"&1W"LWD(wLpGNz 9PRQmAّФ= Dž]3 ' ~|-ςU #ݶ|:.ui!O KD80wwWD8yu(uH qh}0myr_z;xx8(:ۭ7Ow^5"0o_$_v/wev_8 Ƀ큰 Uda2]0ݎzӕY›þ;tm_UhS>?vQyko񵾯RYw?k$)Ϡ:~l=`1Dpg g=GoQ~mѾ>(?tm~Gź w?m]#,EEܯys}C !-+Q^ֶkkmA&ۛ~w|ԧKF/Z~ayy3)bydKf0k^QQ!ZQb$&@8 t+̋۶<ɶ-=` CP[y˧",7ӿm:[sE`%XIe?\b&.CWVAE9rCsIvH(9PgsrwnD[L̽>W\J.F?X5r"֤#b@!!I6X}+ $vUNćVXcfPGL9La7(KS1FJD}k498u֚") & 747,W7f!sǥZP!VVR2{q_GA'VlWKU M+֦+rRůOKE֘u]fy!m~"b:-}, n$숪gTxRULې뎦J mKMa|QKg(8cg;원+Q 6H)D:! d9e}ej/" Gu]tSK>Q ]7H)(S`ȪQ)GaC˘+!@DD60y>?sqf:JG2T,qU mh/! i`2pY/a I!JPIFhB #V/ݢ ̙01:`>f6K?4(թ$z?4(թ$z]mgJ~doщX1\%Ƭ`"gW.XnjĎSM$"N+ t"j!D=ڒ=7llVSbehѨ|4hуj_d뛞JR.c$MTAI|>'|N 4[KhJ x9΃\srA> !:!gM|^?7NӑW|VXnܩ]-Pk夗 {SEE?m" y]'ʧU9 D Ϻ!ߡݍ(B֤RʔjQRG; c +;)Un2XpI2;#*a!œUеd 8NwG Ty!%'o=pddV)F*^LAAq TN*,`3lT̺(Sd%)J.dT7fS&#FI[cS옇:}}CT_=vWӤJ3/-q(K^lt-kUŝiÉ„w#tsZ;(Rn=$)h&R$iK@9zoH[v5n|=Op᭭h {wo_GQQY67**êoc~CЃaorHҤNR!{yw^;kcmUrm|m.k/gA߬q% m>~?f_sk;Q}>^{DJ˥[焜l%̥xB'NtP/GhwͥUH FA!OnM+*sVn2nPPg=m}:H"$xtߦ6)M_o=VdR!!uQL]mS}RmpͶ-kFѢ>;o79 8m6hw_l|0j:WquxYB-xUbb }in6䳖]TW|.*.=#:|Edś6ɀӧJt(4 ky5&5RBHbլĔ).cQ/L8BM ϓ;,GoױHoХR+?/&XQ$4C!,g Wlu5!Yf;RJaj!ԓ:B5[rn.TrPʋJR !VP:7Z굚ci 1Am%aYlZJw :)LTt,IahO?ǭJrHnAGiG{{|-tƶ/BlA^Q䅒$%^n'\Yw:vÀ9W œXI!%coIW,$@؁zӰ4ͨ9fHl̛UܖXb[s͋nQ3MN)W\nԏy)_kbi}o>x0qyANDlxWcQ%6IԪq,U1$ô6\(AoXԲ^ΙN??h:| cJU~WZ׃Y_L蹿Qe׿XԲ^S@Ch=XRՏ?e+1K%$K%$)Տ?e+=XRу }7|LBHw\m)s_r3P96Jrr/Eܦpwxm3;p0*s&11s++cӿ?8lVSbdhѨ|4hуa~o|>B3ɊдL5g(VW燳c̫zKSreuQpnX,eHDϰUV$(v:+ rCnf:&=d{Dc ɛdCqlh!Ku&Ca4rQeASm!. (J@}V9.MYӋy1aMYu̗q{] AF6X89l , ]E?ƱnP"RAŁ=6(6W$l6/gQ̙/uOpRA6KF tvEe!(mk gy 4h֌(`ѣF4hѣ 4hF0azD_q/eV4׿cG^~(\Kks|1wgR ;?ixAG#{YBz>~CޟѨ ؘ4hF0`ѣF5x{W/^.VYӧ.*(7l3,*q&)ꪡd1 R볨""~7RѵPHcTۨ`@.-}&bp4g}:avlISCI {m;n8BWO<=2kHfu\$8y5Π\iExHy&(sTR%"J{buLyCn07"(qCqy밒"& =;6oOR驇v[ XlN)r|!h˔5`C`s7ͪ,LђT y7oonvbheZT"Vs+yK$w%ФE"upJRRZNW-HVGy[&r9[a/sAm>Pk쫂]H?'n]`rB۔?|3n ˷^RcF}8jˆٱ6 8^'hmlRE=$sm|G|r#P<<+`dygiΐ}o~㿇mj×n!w_]m//M;}<IHU9L^{6cU|/U׹Ia ?f5I T2)@6>>ZnB [r}vxۭk*EWo0 G}~x%b{+sFgd :{ X@SV|H@>Q`TH+47R"ֵ{9|i)R*[ahy$ FtWb2?9J$%/v-b b*5{H(PlQ#vqё&mPL ٺi !uM:*# jq,>ڎby oX ݿ:qGoD>nWSpgo>ZPef*9x49"pz<#^թlylZUO.@z{ջ٭qa`Āf *(#"< 0v=v CsCD K1DGIX 6#ii*ʾMIxʶpUe5E]K$DvI'z řo5}$Ez&+i6*k[(a)%Q1Hb B1L8+l(*W`!7 &.Ԁo}%).ᕲud D>Z'AǷTȳMeK9űnͅl,tyFMLVm/[wt@@1ƪ7(X"!jm'CpԱ_r-Pi E~F a®Db_our6],D "nM}5;<Lˤ~ӡL@ aA?TnqzyӔ2 -EC+42ѪZF},`9su=T PC9%stWJw;0ITW HL&̭BP$tG##&qLƩw8y^02srstb*o?OLuc sw=76HsrQ]=X+$WJ6MdY4UL\#خa\s&o-:ΎbNjw2kp1'zTlVzTmUZ=tRBz}KO"{[^kUͳ//SYLc**$TiQG}&c<#:l)-U"! CkN c,֛8fC~<6Y@Kkb5L{ZNGt2C]X9_OghV?OZ/ՏzO3n]1+B8=p+XDmGwþI\%jUNVͷ5vм]-Y%kpͫiQ84;jU,a NAb<`^n(=:`M]cVnpu2%AqDSdEu< .Fum6؋oz濲&4WO$ٴ"PB̛!TyOy9ʞxϲˁE0nb˻N (_ނؙyDC;r 28G^Ԩݖ<^үXI̍y}xOӇ0X1N?%SlL)JNrni+ r{}t󱗠[K!\_7\[kSΑrw7 uK ;,|8( cW1&U=NvRa:ާdf9́GNkri}V?ӕ//!9;GOP9ؤ?ITA}_Z@BSHkgqoDTk\nr.0hG`͙$:'oƥ\& Y+qDƦI-=fbG ݿp-__5MI4̒Dv{JMob2+~]lQ*S\3<'i9=ؤIT1CLxb%S@W  7Te2B'X9ԊdY8F2#nn:Ȩt9C;2#9R=ldlN+֔,]crHE8BK7#sVaL)JG~S4_^CN3G=d?_OUz?{Ǐ|)RU? Pb,SMLQ3rzJ 2>ZJA|s~)&TlfnԫBTJ}ҥZ5y|B5Jmax Se`SELȼIrSMbJOO=ߣ{ |c|zϕ//!?X9!撫sߦC%WWBz Cgx8ԲT5}eWwV>=ZYJxoY V# pqঈ:RHn=:z@' jVI6#yG|1Y~*my5~_M?]6|2i*=cǾ{)*(t^]>?6_/ d3\[Uvo/{(Uoa?IUU}Ϧ<ñO^*ӻ%r_\?O&G^?UſY'kF(Uo}}+߰ǍJUۛ3Nn/3ڽl,\/$舻nrAa".ZJ!K7SdJ!8(Kpmt+~ɹIa7F8QѣF4hѣ 4h^ce-Xs*҆{xFcREP;jskVFK䁻xrQ]~`o'R`\ïE*3[3gW5JIj+mDc~Q&P)rd" x񓮏dK}jX26;lٷcȾry~Z"{5mFEEhBh6'bR<_V 6Z JVxƚTPۿ2ɦḔzӿqwm4E|e#W:!K nFfzSk_y42:yӿV8oG8\8pEy8bf D4m5"D"%p}JLZg)#[ٴ@v*Ŷxn܎m[@fbMDHDB1#YWLB=ǃ,xOd6Ul}[k$ͬycL &7m3epbDs9V6J UvCt&\mȮpʺ%: ?d3m] q**hui[MC"ĸHQ6 ;'qb0$ۼ]S`2}:r~ݰvݦ.EG"Sn=?? ѶCQmPi b!o.# ;5WW#lYJ67'[ >ոPQq.7ܶ<^ߦ8w;uۇOgxJje/vt{};￘`-sYS}ۨw{7 z`˗` >?7ӁHaB{r:>wp- ;rXώ/ ~k;oçy4Dw{||5ƴC{Bw>gx3^GRy{:4_k[,nneD;>Ξu o||<OoMk/& ?l};٭"Rx9L<;wȖ <~/3R ۿ˻}#{U~7лm:y0LG|~˿g]N"JE0&IE8I$"u1TS ~P:QL ﵉ko;R:t>^]:x3 b VqF4ubܥShA,ki۶~cӷ"(s Z똲)Hjf@.OQL%uEDqir:*=\Ý\˔#)6Q-Ҥ~΢,9k5&I !JBe>lAE.8}Sة(RVڈF>@W`ѣFxߏŸpov}0ڛNAO7MAvM0I<οh1G^4k3tr.$n"nl1 - ((u1[$.Tg" CY#X'[tΥ*2ݳď&wڦ"l;%?"l~'ݨk[ϟuYQdU|y lQ3Kl}GǿD1Z`Vדf$$k짻ms&m6Xf\Ӧf_AB9\c8XvNܺpx`(u!EL!]~,ǖ(c::L5+xv͂":1Itùɓ:Ew;NjWY㈢WtʴW,d%PwR(%>F+4'U*}|r2ܫ;2o1?d4=%.wc`=T"[WdKĸIda\k4-cje\ˬr(r5YRbʼ1LWt}f\ "k]Ƌv[1V'b+{S풵#''1 fs(D(2v !3OW 9!]DNpU4$x{-̢Dd! 졥eq#'<\nW%[U]O[YCEzhу/ú5.3{wF|=wW> ~4~@ wthQ`!ޏ[YCwhy"Q/7QG{֟/G|"cF2) !=*{=th M4`FdR< q$ S*ٱRaFdP~ DD}J*qd\1hC mהwwP;2}Mb]~Q(* z0bɔ xThpv'7nCoٚ" ihN[u>۸M`a^u=Јo+$LLv᳕P,7|t␰tv?J{{|DǻZN֞ݿrY:MI>$|xXېǸa6+Ca^sۖUFh-QF[y]Y[;,\FF*ɦ.SU le=*VsM"^,sG+:ԝv0%F̴JfR"L-Ub`*pNe Pm h̞D)27Kz>|N&(l9wn0BIZ8)Ack"r+K gmTY]>-R:r(D5Zn{+dǫHtz?=ݺtO??,h>~dΜ&mOXzb1K.pQD jJЕa]C 퉞X2AݤuiES6_g#"֬D*,I5XUQrO%S!h9QVi&(j4( ="[$<"IuH^VG~ x!Lj]GTi{=^"zN:7ftAIWs3I!9u)Us[w =SD(>b=n=OU @X|~.>6j߸^.ӧń[o\ZCktvx FcCC75ޝo!."w|:x_/ ;׿['z܉ܡa_/!>`YC&< vt7>o*(2-S] mLn<<|4r;ph P2 mZ5ѣ 4hF0`ѣFjq60ìSb-6bU9V_b1O اzTk$tMRb C ={m}`e1ĢhG=+ 7jV*]Mw7bV:NI- )`0)nB6{tY(ʋ 'MrX޻vLUN!Ƶ^ܒ%>[n|.q~j5Har4p<(!!lI.\{r]| }}&6U3n0l ٿN_]7ɌDܛm;~6nD:oQm{ 7MWo|X:a.4+mc.G+vU}P`t ~7oyopH\.l"=NZˡ:Pe>{o˦DvSmH>|/xQeoGܬp7}wi04(oڔ~okpvw>aӧ}>8o|>p~oק^@/o^?v8]JX >n72.-`$tI眐L@b#TL_{!uzZICTpz14KTFEEǠVزhJ-D!R@&H<%:m$nM[㲔ӓe< YBIbwP-ZX?pmF<0F1S oF_ݣSiȟ ݿ:0a:[7H_" |/0 X+!%5۩[b.$;e#$%# 䲇%.feN3ԂE.&ȗG-e݊)alx+""vLaXx;վ2rw]-L<¯.ɛi#t9&Kv.Z<`l]Zz2s\8oE&2J-24ݠfnXQWV1HIWq"YZwEÆGJ/t]Ҿ&A#qȨ}٦|M5{ jrBFIV0ՕTZHMvKuW&kL1 *QFFv%c,z8w`4F ;ä(LQҢ-b]v[+z\,)HYIM H63xrj r:ȃ;.KOTU.LdEm F.` ZdϨ Ӗ7L!M:i__|JzcQ^rԡ$ge|+]ARzܓhL:NUUF*A΋?,ۚ=E6pڶ eTK&K3wHjm^r-͒n9H6.5op ٢WV#9]"+ju:E7P5l͘{};D4/4Y0+c1)vc>&سMɀ4V:*8i+E,N2 K08uzTQ" װ%mF6mhJǥ$sYپQvzً$"ͪJ_?Ql3O-i}p} OTǩr#e*uZ@qpp>&RH})?o_ǎ#]'zGǎ#]'zIôI#?|Li8t 8t 0>&RH})?o_ǎ#GE-A>A3V1y #@ܻD"(l}ĎEQRqCb*H&G[նTkUΐ}+ыԡ\7d]89䒣Q 'N=HP3'`B qLH!*mQ怜͋^ARDG T?eNґpqJ̝\Eۧg,hi n·Lal[Jds-֟Ƿ9*1ʧn]0n^صjnH `)P=F CgO!dF!p4^=$P~=DWQу8q-]޷ʇ?2Z>Y=٭jw[M~*w(rYJ^Ȼ :r2GHlS7]kwmٮ0J,T5 w$:czǁ1hh(˹4@h!➼tꕋD$Yf3O1sÿvƆEO"-]BG r4aEbW.eܝH-Gc ` @Ohl& ZىDZeʳE$@ȧG=W+~6$IƬYIӊF[i=)hqJK;`JVqr>,*9.ŝIpVFTHade]h' Hhl$|K0~6&QsZI eI >C)D)̬NH8;Y(ɉ36 [1Q蠛XtUlu̡d&~Dʺ " T$-DU@'_+Rg4ćuB٥2nI\4ߒU Xgh$5& ʎ%R/m;kߜVn8h\ =0qI?2cq?l1.*ca?OmkG{c##޿qH{oIкQ?j~0F0hѣF 4hу4`F0k)) ^Yh踶.䤤,FG@nF25 ɒh nq-kc8{)IQyWUq1B2dlE.jP# tQ `4017|wQ%^S&'}~ݶ?4iȑL!=u=uy- :f# tKMs梳u8*B;NmR \f&&#w)?1z~|:DNl@8w_~ç Hq0mpw5SsiU،oq67幎;E~M3k䶜2 Hk{Xo 5@T@.m6 9`Tq 1<7jJ {:Ҩ6Q*{ o~|wn;*ܯ݊ y:nmwmvR8(v=D<7ݮp,:;Ͱ=o ݇lltۧӯ،!oݰOQ鰏v%-}`:yǮ,="~|Cw#Ѵ('P.0 l vpi8|v=wmlĚ6#~RE_opo5`^~ߡ{&l@(tJ B?|~jR&S!=6ukõܭә?`;߷t;l*iEP~g8i'b7IfiK!DO A$eEy@G2"$*mJ fykp7VYӷU~ϳ4&DH([YǎEƵ{(5/ׂ|=HZdc%/5Kޭn$tª o (ֿ Sx(ZE(/̠[C29UkE=}+غokmH agc-? 8dE5$eOM9L̂HpH7"(ѥ^?hKiJ!)JE`ml4hьhѣF ~Oxtnфp~877[aF pDB=oqml[?N׿yߒj5?>AWۤH+CJ;IE55v&49AgnΜP1@MTMV|gb?ԂMRZWnHdF.ÕQFIQF)'Jmԭ>lI?v 8̯|ab%V,DüA%QI}MrȢq_If.l|kVekw0hPUNucW;`QDg6,JxvJv %ü0Tl Tg>4RC62IUP-;8Ja E5^릒k<[XVrDz/ȒB)2 Z/6VkV-#@_ȸB9YtyصffOA^z,&\SVe*n֮x`i%M)yktmdVzC֎Ѫq{ mVBHlu!9" ΚO_2OW2¸Qk0WV)ɲ~KVdk,j)>Z 5Qݞ.r:˱fLyRPf-􀇞תȻ4+Y@c~4u!.RֆVQF _ZtzN29'q~=Hg`(c99L(v,b#<ո$ C*6gYaWLB;C)P7[rCtn??ApyyINۜ ܭ间B۔if^nnPR7iG틤-N!FU )e7 󁹇n]G?sq..ӵ_t/mާ/i݇?{O^rOⰪaPp@QLb&A.˸tn??A1DSOA$uF)70?h`ܼÿ:j%P:g*?ybt@w 7qD:?V:VjMdΒt(@o!f#Ѹt`XzH}Y']$u]DOQу8/u=Pp'_G'{5No~>J~Gѣ[q娖Ⳉ۾>dxOi|S)I$v ߶z@6t_LyVg)B]寍ͧ=-JZOKc B9 4sXRa!ԩ$ iZmjORD[2vQ~$GZ6_{9Rva*1\ Je׬=˶Jv&s]FRCIrfoGP)sM6"|-KU(g7%"qMw$Ƌf3ufe]FUد*c/*ᴂqҡ_З<{?|&<{ǔ7Go pk_= W-o×Yf.PYؚ8]Dors2"Fr16ܥ|fbǬ]& h\wH8G?êuq>qOIwqU mT}kB?{܏aF06OچF06Oچߌ0hѣF 4hу4`F0hѣF cf6GU'! syۈZlR=˺=NJCbm1E昘U1Q#ZTD0x' xwޮcZ <="@0DCw@' #JJ"? `;lypmns刾Dp<{qЂi ! xo}{7G}&*@ll;%נ=e6w `(DN||~=j@$߼6۠t'_xoߦK+O,ED,|ȱGj3\ P(4[rL]oYɏ(|/?? "'{Ci,FKD㷖~㯋Le7<xIXz~9a]3&ַO|/<(o,%)DQnsEb,M[{pbqͱIH80hK::m#X& 4}g2N|ՌE272 ldJ6&1(NM⨵f2ތFJ!&È{CbdK/nnOFTȫ:DH^1R{f|9 Mcz;0EW{Msp}a啨s@S4 6&ŦM{ cws= bŢtט.}2 ($fjlƣ˄b*l*QdXwi)JRTug$F j,f !$rbz 4ktѣF4hѣ?'Cb?Xmv8 >zq}m_ jm0U>O@z~TC |[O#yߧ̍X[5>I ѬM,K'fjr#7v]$Uyؔt@DڥjAԜV{;I {S+4DSC3$:o.a9UnIM6-cg=0INJ#`g$~A@l&ߞ sŜ pd+KgP@a E$VU$>%p'I-dyI2#6&;Qhߍf.$ksU%oLQ)Th,?,GRJI>^w|U$!1FYhYnalB(+ &kw6̣/ )Ҥ$N%gRVUQ - qQQ JIV'k OՃ<~TBt;V~穮UD"۫82Kn՜QJvF?՜~͉DfcW4"dZIxÄu~5,s !gx\TQpK¹|ɬbӫkX rUeZ.G)dKGW7RPkq _fayaLo2- j+تӉyؕ{YH3#TTI2%q ABzZmhU͹#?iJHu ƍ;l޽CE{J9_ddS@E;w:Z@\MMKc;v-ڞ),Eo~$9]L<ϼ;t?JSE @yJmo cs?w+OǣN<ح?ΞC~Z$9]?w+Oǭ3!t?$9]?w+Oǭ3!t?$9]5P~ wpUlԫ$IDHKBb%at? pF EgO';YD_C/m~H>j\}$sMDgO@=)v;hx*Ow?.]hu? P֏?.oZVfW0hѣ[q 4hF0`ѣFaޒT>\4qkl:Oؘ;XO?+/*ccSZ_,w`Q>d5wԟ 4hу4`F0hѣF 4hу~U䏤A*~f|0U0)2EUؘPf)J"%B;^*6gI.AA;M)<1znI]+Α5t:!5_ ⛥:SZ7o6*-J;uw@V)Q0s}=|r@M?Bwϭ9\ =GM}}.eP;C&P*R_H@b ?ۦu^s\O{;tګ*>@:A0@=yijz$)@b;ow *;[oͩTz=|n97_ Y@<}ṳsmCwpZ(}ק}Ӫp"㿼L~@sD27˧_ua ۠wټ~f&۟~=J ?lx{Gtkaq7.l$HA6;/3PX~o/cLFL?Y{n[\c0G& (ZQȃF**dSp|Pm|[pkDF8:gHS((HQjK<c5vkňS^LY'l,݉}\HZx Qkg&uYd)H1E`6Iw62FJɕ%=ĉGI׹](U/Fߣ+I4Rퟭq(yATLR$J-&nHP$)LGJ@p{4rxw}5Lg]q]V:řR5 )b3) \ZQԵ( X 4hּvѣF4hѣ 4hŸpov}0ڛNAO7MAvM 7Ɉ ÈLXDa Dv-lpۻa7~]=5Tw5?ZMAw1q3T?YYDʳo뭄vb7 $.اUӵ@H9I/n?vwGLV:NFa7q"W:b"V^!0=icgLVQbYd5U霩0ܒ%|Yo-HoɛBhLS2ږnT8 Qp%il_$[PH>Ҷob $}*$[pF)ɵ=ww!?^)Z^%`L.u"'d#E>9#IQb* -ᦫ-],V("IHGa2-ƩI"lQ#:nړm6vƍZ "E3(fn,8Lp^t8bq]JpcnZ"0 w-.TvEc&񟭋PISdOQY7R~.D(謹` F`#$=L!UӞ:]V}j>l3g)'NՔ̚u9:fh%E""gr|9"В 3lɴi|5j,!h4q~ϻvQ;wMHNeJ\./܏ u1|ګ\]QJUnVHwLB~Q$=#XdqvR!^,qWEZML"%dUj)-2fĻY,;Q:+s0CBpyy2sU4hԠ# gB9I;i$IE˸bL=qHSג& -~HE6Mob7 (;KvA?z|LaSsoM~F v.?H'/G1OͿ4|LaSsoM1\ `  8"y:?1LmSLSM|NF3#^>Tp5阪 `+b: `׼@kY>3OR"kYQu`泥-Pp7'CZ>[=ӹo2~5˷;֧y7Uߨ~ѣF 4hу4`F0}%=_Y5Sl1j,A6?e5GQϰz"'B#tOh]du`ѣF4hѣ 4hF0`ѣF5C.cS)KozjUNr^]dPSv#  qP.c cU# _%C vvEtż$b02 .r#Hjgg&YƉ!he>ɶ5<(۸mAܓDoCٿ3~oyt Z.rw9b;3~]|އh`A(]}ϭCpkJhܻ{ǻ[SOCiYNAEEM)'}D o7Fk(/]/pdHRnt_N@%鰆~# 2TuW,֫LJ\T۳d؇T`* *8Y$Hc4 Zt)IQV>xF -BqjCMSR[ۖ8MHM@=^V^+ 7{xxc"ٲܼ0c!qk$k,Ɋn%'t;GGW@f:28EJyQMz*c%'0Tf{WDW"ABŴAdLS&A6MSIfȦ"H!C`(uŤ뛥jI(nw~˾i&Q"_ li IupexjaJNNxW|!bI +5vFr& Ղ4r˰) +7fѹAkVq6 (kY̓ ;Yn1\?Y?hpfHτ^_zhEǯ?WjDZ>1\?Y?h3W>{Q#֏WjDZ0aLEǯ渖tYUT'0 u9ya) "_ߦ+5{G޴`wzH?@}?гj"At{kTGԼJ[:e;_fWE^&oh5#wOd@";!Ψ/mj8hmӻbo֍eg`'oɑö_X4C͘Aèv;8uas%90 ,w6ff$&\E.:5-\;9l"{ASN=؆+8yyy?>G]ѪQ}O8b?_>{ |/S|o|1uyS!<s)ǿ_#//384~߰b5J/WϩCGyS!G^^gpiO珑aś=%AWZ85SlHn??鿘~=nK}~%R[7 Ҹ-&o*#3TeB2%¶:`P(2g&,.7~ d# A -U{j'kZqwkǧN<5 L>]w5`ѣF4hѣ 4hF0`ѣF5V`5ڝ*>vgؠZ6fmұr UM'\.eR]ʤp{FA F#pw#yzWy;l?bW<*Zw;4^ʶ\E:bDa#"lq鶑py_!aS~fc^V* Ng景3?bZ=A7Ld$pG(]n $U3D97WRfxlI?WXvG$&uUOm[M7[hfc% 4EFmk ,\:)`S]CqJpB Zn@pIl[ǚ* pp.Q( DTq>yK(dc+u[L(fdncu('踤j=;f69 wH5 ܝR$7Ra߳qD}LMVXG(u۝"#pD{,%Y$M%{UTb*sp?Ʈd#d5 Qɑ8luTǭ]ļhź͕^8q : 4Tz+&S/ܸnOT8Qw"t .ʦHCmF-QٗH 癱-Ī(0t$.j]$T"WMnFEH6Hmr B8k^|E/K0Ôd`NAGJtoPP`LoQ$0#r>gnmʑԫN-{VUUT[c,B(;$4u~!rT72NH ,RTkK JWLuJ*P ^S-f:]HC M+3A.*]44pv?f(WI&xk7Py꽞>ق'p.P$̑Hv]Pu$2(e𑆚,qTLYm0bq1Ҫ+$̨dc$(D~3&߬Hgv(PP"PjSns1lXZ2rƾwoj]`VGz%YXԲ,oeDnxG$c&39'YIJ%X>%&Ld "gEBj q[7 h8 <;Scc,p22#oC1xIÍo) \]TkXEBȴh.!f60bGi % q"s&3ȴUbP9ZB-2JPh˝bf"s2b<"ͯ,ջvPod$--izwyԌ;#PrYU#wI #1v8G5t|U=d=U3q3\{z LpS_">4&7K?j5}&]Nk(ݳxePEEQESQ$%!D1PQiyuI) 𱵼z~>8(g4Dj].$Zz9FJB(8U2ZT=ՏR (8}M^+,KU1egudbŻ4|C%%MR8]Dݏ`1Z ID0]RAU0ZE"B &;rcA3E_U#(v3PF7n2zeƷg!Sf 4I""BX.qȷHc/Ž(YqP#0ƆFT\#U@"ڎp I b}J k [rv-52O"N1~z$d%Rul䍒tT+.Ig8` UejQ̣dfwbhJ\~c%^N0\HRhS,۴VUdqƪ)&7PpιL]$BO=Isr1#lCv 6nRd+pELKkSSGa0rⲝ)&-v9Z2i O,f")|Z1YT-îR{9WušQ;UT]]\$\`#=H "Homzo[mۦwmqQ.5o pFn(,xլ,D@pQ*Jr$FvVBcI=Θ@""?s#-G)FO=@}}~m6#xh̭o*7@b`:D0 ^^mw0~?LKnQně/yknx1.8uS[0"ta>o2=>d_净0` o2o2=>eWGE0` o2o2=>eWGE0` o2o2=>eWGE0` %i,J !op~|7pZAAJ!ȑ۔a- d"5)~p}@!JB6 ~hу4`F0hѣF 4hу4`F0hѣ_߃6 5`ۯ4`F0hѣF 4hу4`F0hѣF 4hу R%}ȤrbvӻF1 # Gael Varoquaux # Copyright (c) 2007-2016, Enthought, Inc. # License: BSD Style. # Try forcing the use of wx 2.8 before any other import. import sys if not 'wx' in sys.modules: try: from traits.etsconfig.api import ETSConfig if ETSConfig.toolkit in ('wx', ''): import wxversion wxversion.ensureMinimal('2.8') except ImportError: """ wxversion not installed """ # Mayavi imports from mayavi.tools.camera import view, roll, yaw, pitch, move from mayavi.tools.figure import figure, clf, gcf, savefig, \ draw, sync_camera, close, screenshot from mayavi.tools.engine_manager import get_engine, show_pipeline, \ options, set_engine from mayavi.tools.show import show from mayavi.tools.animator import animate def show_engine(): """ This function is deprecated, please use show_pipeline. """ import warnings warnings.warn('The show_engine function is deprecated, please use' 'show_pipeline', stacklevel=2) return show_pipeline() from .tools.helper_functions import contour3d, test_contour3d, \ quiver3d, test_quiver3d, test_quiver3d_2d_data, \ points3d, test_points3d, test_molecule, \ flow, test_flow, \ imshow, test_imshow, \ surf, test_surf, mesh, test_mesh, test_simple_surf, \ test_mesh_sphere, test_fancy_mesh,\ contour_surf, test_contour_surf, \ plot3d, test_plot3d, \ test_plot3d_anim, test_points3d_anim, test_contour3d_anim,\ test_simple_surf_anim, test_flow_anim, test_mesh_sphere_anim, \ triangular_mesh, test_triangular_mesh, barchart, \ test_barchart, test_mesh_mask_custom_colors from .tools.decorations import colorbar, scalarbar, vectorbar, \ outline, axes, xlabel, ylabel, zlabel, text, title, \ orientation_axes, text3d from .tools import pipeline from .tools.tools import start_recording, stop_recording from .tools.notebook import init as init_notebook if __name__ == "__main__": import numpy n_mer, n_long = 6, 11 pi = numpy.pi dphi = pi/1000.0 phi = numpy.arange(0.0, 2*pi + 0.5*dphi, dphi, 'd') mu = phi*n_mer x = numpy.cos(mu)*(1+numpy.cos(n_long*mu/n_mer)*0.5) y = numpy.sin(mu)*(1+numpy.cos(n_long*mu/n_mer)*0.5) z = numpy.sin(n_long*mu/n_mer)*0.5 pl = plot3d(x, y, z, numpy.sin(mu), tube_radius=0.05, colormap='Spectral') colorbar(orientation='vertical') t = numpy.linspace(0, 4*numpy.pi, 100) cos = numpy.cos sin = numpy.sin x = sin(2*t) y = cos(t) z = sin(2*t) s = sin(t) pts = points3d(x, y, z, s, colormap="YlGnBu", scale_factor=0.1, extent=(-0.3,0.3, -0.3, 0.3, -0.2,0.2)) axes(xlabel='X', ylabel='Y', zlabel='Z') outline(pl) title('Mayavi rocks', height=0.85) mayavi-4.5.0/mayavi/modules/0000755000076500000240000000000012747722127016363 5ustar prabhustaff00000000000000mayavi-4.5.0/mayavi/modules/__init__.py0000644000076500000240000000013212747716314020471 0ustar prabhustaff00000000000000# Author: Prabhu Ramachandran # Copyright (c) 2005, Enthought, Inc. # License: BSD Style. mayavi-4.5.0/mayavi/modules/api.py0000644000076500000240000000215612747716314017513 0ustar prabhustaff00000000000000""" Defines the publicly accessible Mayavi2 modules. """ # Author: Frederic Petit and Prabhu Ramachandran # Copyright (c) 2007-2015, Enthought, Inc. # License: BSD Style. from .axes import Axes from .contour_grid_plane import ContourGridPlane from .custom_grid_plane import CustomGridPlane from .generic_module import GenericModule from .glyph import Glyph from .grid_plane import GridPlane from .hyper_streamline import HyperStreamline from .image_actor import ImageActor from .image_plane_widget import ImagePlaneWidget from .iso_surface import IsoSurface from .labels import Labels from .orientation_axes import OrientationAxes from .outline import Outline from .scalar_cut_plane import ScalarCutPlane from .slice_unstructured_grid import SliceUnstructuredGrid from .streamline import Streamline from .structured_grid_outline import StructuredGridOutline from .surface import Surface from .text import Text from .text3d import Text3D from .tensor_glyph import TensorGlyph from .vector_cut_plane import VectorCutPlane from .vectors import Vectors from .volume import Volume from .warp_vector_cut_plane import WarpVectorCutPlane mayavi-4.5.0/mayavi/modules/axes.py0000644000076500000240000002226412747716314017704 0ustar prabhustaff00000000000000"""Draws a simple axes using tvtk.CubeAxesActor2D. """ # Author: Prabhu Ramachandran # Copyright (c) 2005-2006, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import Instance, Property, true from traitsui.api import View, Group, HGroup, \ Item, BooleanEditor from tvtk.api import tvtk from apptools.persistence import state_pickler # Local imports from mayavi.core.module import Module from mayavi.core.pipeline_info import PipelineInfo ###################################################################### # `CubeAxesActor2D` class. ###################################################################### class CubeAxesActor2D(tvtk.CubeAxesActor2D): """ Just has a different view than the tvtk.CubesAxesActor2D, with an additional tick box. """ # Automaticaly fit the bounds of the axes to the data use_data_bounds = true input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']) ######################################## # The view of this object. traits_view = View(Group( Group( Item('visibility'), HGroup( Item('x_axis_visibility', label='X axis'), Item('y_axis_visibility', label='Y axis'), Item('z_axis_visibility', label='Z axis'), ), show_border=True, label='Visibity'), Group( Item('use_ranges'), HGroup( Item('ranges', enabled_when='use_ranges'), ), show_border=True), Group( Item('use_data_bounds'), HGroup( Item('bounds', enabled_when='not use_data_bounds'), ), show_border=True), Group( Item('x_label'), Item('y_label'), Item('z_label'), Item('label_format'), Item('number_of_labels'), Item('font_factor'), show_border=True), HGroup(Item('show_actual_bounds', label='Use size bigger than screen', editor=BooleanEditor())), Item('fly_mode'), Item('corner_offset'), Item('layer_number'), springy=True, ), scrollable=True, resizable=True, ) ###################################################################### # `Axes` class. ###################################################################### class Axes(Module): # The version of this class. Used for persistence. __version__ = 0 # The tvtk axes actor. axes = Instance(CubeAxesActor2D, allow_none=False, record=True) # The property of the axes (color etc.). property = Property(record=True) # The title text property of the axes. title_text_property = Property(record=True) # The label text property of the axes. label_text_property = Property(record=True) ######################################## # Private traits. _property = Instance(tvtk.Property2D) _title_text_property = Instance(tvtk.TextProperty) _label_text_property = Instance(tvtk.TextProperty) ######################################## # The view of this object. view = View(Group(Item(name='axes', style='custom', resizable=True), label='Axes', show_labels=False), Group(Item(name='_property', style='custom', resizable=True), label='Property', show_labels=False), Group(Item(name='_title_text_property', style='custom', resizable=True), label='Title Text', show_labels=False), Group(Item(name='_label_text_property', style='custom', resizable=True), label='Label Text', show_labels=False), scrollable=True, resizable=True, width=500, height=600 ) ###################################################################### # `object` interface ###################################################################### def __set_pure_state__(self, state): for prop in ['axes', '_property', '_title_text_property', '_label_text_property']: obj = getattr(self, prop) state_pickler.set_state(obj, state[prop]) ###################################################################### # `Module` interface ###################################################################### def setup_pipeline(self): """Override this method so that it *creates* the tvtk pipeline. This method is invoked when the object is initialized via `__init__`. Note that at the time this method is called, the tvtk data pipeline will *not* yet be setup. So upstream data will not be available. The idea is that you simply create the basic objects and setup those parts of the pipeline not dependent on upstream sources and filters. You should also set the `actors` attribute up at this point. """ # Create the axes and set things up. axes = CubeAxesActor2D(number_of_labels= 2, font_factor=1.5, fly_mode='outer_edges', corner_offset=0.0, scaling=False) axes.axis_title_text_property.shadow = False axes.axis_label_text_property.shadow = False # Set the axes. self.axes = axes def update_pipeline(self): """Override this method so that it *updates* the tvtk pipeline when data upstream is known to have changed. This method is invoked (automatically) when any of the inputs sends a `pipeline_changed` event. """ mm = self.module_manager if mm is None or not self.axes.use_data_bounds: self.configure_input_data(self.axes, None) return src = mm.source self.configure_input_data(self.axes, src.outputs[0]) self.pipeline_changed = True def update_data(self): """Override this method so that it flushes the vtk pipeline if that is necessary. This method is invoked (automatically) when any of the inputs sends a `data_changed` event. """ # Just set data_changed, the component should do the rest. self.data_changed = True ###################################################################### # Non-public interface ###################################################################### def _scene_changed(self, old, new): super(Axes, self)._scene_changed(old, new) self.axes.camera = new.camera self._foreground_changed_for_scene(None, new.foreground) def _foreground_changed_for_scene(self, old, new): # Change the default color for the actor. self.property.color = new self.label_text_property.color = new self.title_text_property.color = new self.render() def _axes_changed(self, old, new): if old is not None: for obj in (old, self._property, self._title_text_property, self._label_text_property): obj.on_trait_change(self.render, remove=True) self.actors.remove(old) # Setup the axes. scene = self.scene if scene is not None: new.camera = scene.camera # Setup the private traits. self._property = new.property for prop in ['_title_text_property', '_label_text_property']: setattr(self, prop, getattr(new, 'axis' + prop)) # The handlers. for obj in (new, self._property, self._title_text_property, self._label_text_property): obj.on_trait_change(self.render) self.actors.append(new) if old is not None: self.update_pipeline() def _get_property(self): return self._property def _get_title_text_property(self): return self._title_text_property def _get_label_text_property(self): return self._label_text_property def _use_data_bounds_changed_for_axes(self): """ Updating the pipeline for this module is inexpensive and fits the actor to the source (if any). We are using it here. """ self.update_pipeline() mayavi-4.5.0/mayavi/modules/contour_grid_plane.py0000644000076500000240000001443212747716314022617 0ustar prabhustaff00000000000000"""A contour grid plane module. This module lets one take a slice of input grid data and view contours of the data. The module only works for structured points, rectilinear grid and structured grid input. """ # Author: Prabhu Ramachandran # Copyright (c) 2005-2006, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import Instance, Bool from traitsui.api import View, Group, Item # Local imports from mayavi.core.module import Module from mayavi.components.grid_plane import GridPlane from mayavi.components.contour import Contour from mayavi.components.actor import Actor from mayavi.core.pipeline_info import PipelineInfo ###################################################################### # `ContourGridPlane` class. ###################################################################### class ContourGridPlane(Module): # The version of this class. Used for persistence. __version__ = 0 # The grid plane component. grid_plane = Instance(GridPlane, allow_none=False, record=True) # Specifies if contouring is to be done or not. enable_contours = Bool(True, desc='if contours are generated') # The contour component that contours the data. contour = Instance(Contour, allow_none=False, record=True) # The actor component that represents the visualization. actor = Instance(Actor, allow_none=False, record=True) input_info = PipelineInfo(datasets=['image_data', 'structured_grid', 'rectilinear_grid'], attribute_types=['any'], attributes=['any']) view = View([Group(Item(name='grid_plane', style='custom'), show_labels=False), Group(Item(name='enable_contours')), Group(Item(name='contour', style='custom', enabled_when='object.enable_contours'), Item(name='actor', style='custom'), show_labels=False) ] ) ###################################################################### # `Module` interface ###################################################################### def setup_pipeline(self): """Override this method so that it *creates* the tvtk pipeline. This method is invoked when the object is initialized via `__init__`. Note that at the time this method is called, the tvtk data pipeline will *not* yet be setup. So upstream data will not be available. The idea is that you simply create the basic objects and setup those parts of the pipeline not dependent on upstream sources and filters. You should also set the `actors` attribute up at this point. """ # Create the components self.grid_plane = GridPlane() self.contour = Contour(auto_contours=True, number_of_contours=10) self.actor = Actor() def update_pipeline(self): """Override this method so that it *updates* the tvtk pipeline when data upstream is known to have changed. This method is invoked (automatically) when any of the inputs sends a `pipeline_changed` event. """ mm = self.module_manager if mm is None: return # Data is available, so set the input for the grid plane. self.grid_plane.inputs = [mm.source] # This makes sure that any changes made to enable_contours # when the module is not running are updated when it is # started. self._enable_contours_changed(self.enable_contours) # Set the LUT for the mapper. self.actor.set_lut(mm.scalar_lut_manager.lut) self.pipeline_changed = True def update_data(self): """Override this method so that it flushes the vtk pipeline if that is necessary. This method is invoked (automatically) when any of the inputs sends a `data_changed` event. """ # Just set data_changed, the components should do the rest if # they are connected. self.data_changed = True ###################################################################### # Non-public methods. ###################################################################### def _filled_contours_changed(self, value): """When filled contours are enabled, the mapper should use the the cell data, otherwise it should use the default scalar mode. """ if value: self.actor.mapper.scalar_mode = 'use_cell_data' else: self.actor.mapper.scalar_mode = 'default' self.render() def _enable_contours_changed(self, value): """Turns on and off the contours.""" if self.module_manager is None: return if value: self.actor.inputs = [self.contour] if self.contour.filled_contours: self.actor.mapper.scalar_mode = 'use_cell_data' else: self.actor.inputs = [self.grid_plane] self.actor.mapper.scalar_mode = 'default' self.render() def _grid_plane_changed(self, old, new): cont = self.contour if cont is not None: cont.inputs = [new] self._change_components(old, new) def _contour_changed(self, old, new): if old is not None: old.on_trait_change(self._filled_contours_changed, 'filled_contours', remove=True) new.on_trait_change(self._filled_contours_changed, 'filled_contours') # Setup the contours input. gp = self.grid_plane if gp is not None: new.inputs = [gp] # Setup the actor. actor = self.actor if actor is not None: actor.inputs = [new] self._change_components(old, new) def _actor_changed(self, old, new): if old is None: # First time this is set. new.property.set(line_width=2.0) # Set the actors scene and input. new.scene = self.scene cont = self.contour if cont is not None: new.inputs = [cont] self._change_components(old, new) mayavi-4.5.0/mayavi/modules/custom_grid_plane.py0000644000076500000240000000420212747716314022432 0ustar prabhustaff00000000000000"""A custom grid plane with a lot more flexibility than GridPlane. This also only works for non-unstructured/non-polygonal datasets. """ # Author: Prabhu Ramachandran # Copyright (c) 2007, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import Instance from traitsui.api import View, Group, Item # Local imports from mayavi.components import custom_grid_plane from mayavi.modules.contour_grid_plane import \ ContourGridPlane, Contour, Actor ###################################################################### # `CustomGridPlane` class. ###################################################################### class CustomGridPlane(ContourGridPlane): grid_plane = Instance(custom_grid_plane.Component, allow_none=False, record=True) # Overriding the ContourGridPlane's default view. view = View(Group(Item(name='grid_plane', style='custom'), show_labels=False, label='GridPlane'), Group(Group(Item(name='enable_contours')), Group(Item(name='contour', style='custom', enabled_when='object.enable_contours'), show_labels=False, ), label='Contour', ), Group(Item(name='actor', style='custom'), label='Actor', show_labels=False) ) ###################################################################### # `Module` interface ###################################################################### def setup_pipeline(self): # Note that we don't call the parent class method here. This # is intentional to avoid problems with the execution of the # VTK pipeline. # Create the components. self.grid_plane = custom_grid_plane.CustomGridPlane() self.contour = Contour(auto_contours=True, number_of_contours=10) self.actor = Actor() self.enable_contours = False self.actor.property.point_size = 2 mayavi-4.5.0/mayavi/modules/generic_module.py0000644000076500000240000002273712747716314021732 0ustar prabhustaff00000000000000""" Defines a GenericModule which is a collection of mayavi filters/components put together. This is very convenient and useful to create new modules. """ # Author: Prabhu Ramachandran # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import Bool, Enum, Instance from traitsui.api import Item, Group, View, ListEditor from apptools.persistence import state_pickler # Local imports. from mayavi.core.module import Module from mayavi.core.common import handle_children_state from mayavi.components.actor import Actor ################################################################################ # Utility function. ################################################################################ def find_object_given_state(needle, haystack, object): """ Find the object which corrsponds to given state instance (`needle`) in the given state (`haystack`) and object representing that haystack. Parameters ---------- `needle` -- The `State` instance to find haystack -- The source State in which we are to find the state `object` -- the object corresponding to the `haystack` """ if needle is haystack: return object if hasattr(object, 'filter'): return find_object_given_state(needle, haystack.filter, object.filter) elif hasattr(object, 'filters'): for h, obj in zip(haystack.filters, object.filters): r = find_object_given_state(needle, h, obj) if r is not None: return r return None ################################################################################ # `GenericModule` class. ################################################################################ class GenericModule(Module): """ Defines a GenericModule which is a collection of mayavi filters/components put together. This is very convenient and useful to create new modules. Note that all components including the actor must be passed as a list to set the components trait. """ # The *optional* Contour component to which we must listen to if # any. This is needed for modules that use a contour component # because when we turn on filled contours the mapper must switch to # use cell data. contour = Instance('mayavi.components.contour.Contour', allow_none=True) # The *optional* Actor component for which the LUT must be set. If # None is specified here, we will attempt to automatically determine # it. actor = Instance(Actor, allow_none=True) # Should we use the scalar LUT or the vector LUT? lut_mode = Enum('scalar', 'vector') ######################################## # Private traits. # Is the pipeline ready? Used internally. _pipeline_ready = Bool(False) ###################################################################### # `object` interface. ###################################################################### def __get_pure_state__(self): # Need to pickle the components. d = super(GenericModule, self).__get_pure_state__() d['components'] = self.components d.pop('_pipeline_ready', None) return d def __set_pure_state__(self, state): # If we are already running, there is a problem since the # components will be started automatically in the module's # handle_components even though their state is not yet set call # so we disable it here and restart it later. running = self.running self.running = False # Remove the actor states since we don't want these unpickled. actor_st = state.pop('actor', None) contour_st = state.pop('contour', None) # Create and set the components. handle_children_state(self.components, state.components) components = self.components # Restore our state using set_state. state_pickler.set_state(self, state) # Now set our actor and component by finding the right one to get from # the state. if actor_st is not None: for cst, c in zip(state.components, components): actor = find_object_given_state(actor_st, cst, c) if actor is not None: self.actor = actor break if contour_st is not None: for cst, c in zip(state.components, components): contour = find_object_given_state(contour_st, cst, c) if contour is not None: self.contour = contour break # Now start all components if needed. self._start_components() self.running = running ###################################################################### # `HasTraits` interface. ###################################################################### def default_traits_view(self): """Returns the default traits view for this object.""" le = ListEditor(use_notebook=True, deletable=False, export='DockWindowShell', page_name='.name') view = View(Group(Item(name='components', style='custom', show_label=False, editor=le, resizable=True), show_labels=False), resizable=True) return view ###################################################################### # `Module` interface. ###################################################################### def setup_pipeline(self): """Setup the pipeline.""" # Needed because a user may have setup the components by setting # the default value of the trait in the subclass in which case # the components_changed handler will never be called leading to # problems. if len(self.components) > 0 and not self._pipeline_ready: self._components_changed([], self.components) def update_pipeline(self): """This method *updates* the tvtk pipeline when data upstream is known to have changed. This method is invoked (automatically) when the input fires a `pipeline_changed` event. """ mm = self.module_manager if mm is None: return self._setup_pipeline() # Propagate the event. self.pipeline_changed = True def update_data(self): """This method does what is necessary when upstream data changes. This method is invoked (automatically) when any of the inputs sends a `data_changed` event. """ # Propagate the data_changed event. self.data_changed = True ###################################################################### # Private interface. ###################################################################### def _setup_pipeline(self): """Sets up the objects in the pipeline.""" mm = self.module_manager if mm is None or len(self.components) == 0: return # Our input. my_input = mm.source components = self.components if not self._pipeline_ready: # Hook up our first component. first = self.components[0] first.inputs = [my_input] # Hook up the others to each other. for i in range(1, len(components)): component = components[i] component.inputs = [components[i-1]] self._pipeline_ready = True # Start components. self._start_components() # Setup the LUT of any actors. self._lut_mode_changed(self.lut_mode) def _handle_components(self, removed, added): super(GenericModule, self)._handle_components(removed, added) for component in added: if len(component.name) == 0: component.name = component.__class__.__name__ if self.actor is None: if isinstance(component, Actor): self.actor = component if len(self.components) == 0: self.input_info.datasets = ['none'] else: self.input_info.copy_traits(self.components[0].input_info) self._pipeline_ready = False self._setup_pipeline() def _lut_mode_changed(self, value): """Static traits listener.""" mm = self.module_manager if mm is None: return lm = mm.scalar_lut_manager if value == 'vector': lm = mm.vector_lut_manager if self.actor is not None: self.actor.set_lut(lm.lut) def _actor_changed(self, old, new): self._lut_mode_changed(self.lut_mode) def _filled_contours_changed_for_contour(self, value): """When filled contours are enabled, the mapper should use the the cell data, otherwise it should use the default scalar mode. """ if self.actor is None: return if value: self.actor.mapper.scalar_mode = 'use_cell_data' else: self.actor.mapper.scalar_mode = 'default' self.render() def _start_components(self): for component in self.components: if len(component.inputs) > 0 and \ len(component.inputs[0].outputs) > 0: component.start() mayavi-4.5.0/mayavi/modules/glyph.py0000644000076500000240000001235512747716314020067 0ustar prabhustaff00000000000000"""Displays different types of glyphs oriented and colored as per scalar or vector data at the input points. """ # Author: Prabhu Ramachandran # Copyright (c) 2005, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import Instance from traitsui.api import View, Group, Item # Local imports from mayavi.core.module import Module from mayavi.components import glyph from mayavi.components.actor import Actor from mayavi.core.pipeline_info import PipelineInfo ###################################################################### # `Glyph` class. ###################################################################### class Glyph(Module): # The version of this class. Used for persistence. __version__ = 0 # The Glyph component. glyph = Instance(glyph.Glyph, allow_none=False, record=True) # The Glyph component. actor = Instance(Actor, allow_none=False, record=True) input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']) ######################################## # View related traits. view = View(Group(Item(name='glyph', style='custom', resizable=True), label='Glyph', show_labels=False), Group(Item(name='actor', style='custom'), label='Actor', show_labels=False), ) ###################################################################### # `Module` interface ###################################################################### def setup_pipeline(self): """Override this method so that it *creates* the tvtk pipeline. This method is invoked when the object is initialized via `__init__`. Note that at the time this method is called, the tvtk data pipeline will *not* yet be setup. So upstream data will not be available. The idea is that you simply create the basic objects and setup those parts of the pipeline not dependent on upstream sources and filters. You should also set the `actors` attribute up at this point. """ # Setup the glyphs. self.glyph = glyph.Glyph(scale_mode='scale_by_scalar', color_mode='color_by_scalar', show_scale_mode=True) # Create the components actor = self.actor = Actor() actor.mapper.scalar_visibility = 1 actor.property.set(line_width=2, backface_culling=False, frontface_culling=False) def update_pipeline(self): """Override this method so that it *updates* the tvtk pipeline when data upstream is known to have changed. This method is invoked (automatically) when any of the inputs sends a `pipeline_changed` event. """ mm = self.module_manager if mm is None: return self.glyph.inputs = [mm.source] # Set the LUT for the mapper. self._color_mode_changed(self.glyph.color_mode) self.pipeline_changed = True def update_data(self): """Override this method so that it flushes the vtk pipeline if that is necessary. This method is invoked (automatically) when any of the inputs sends a `data_changed` event. """ # Just set data_changed, the other components should do the rest. self.data_changed = True ###################################################################### # Non-public traits. ###################################################################### def _color_mode_changed(self, value): # This is a listner for the glyph component's color_mode trait # so that the the lut can be changed when the a different # color mode is requested. if self.module_manager is None: return actor = self.actor if value == 'color_by_scalar': actor.mapper.scalar_visibility = 1 lut_mgr = self.module_manager.scalar_lut_manager actor.set_lut(lut_mgr.lut) elif value == 'color_by_vector': lut_mgr = self.module_manager.vector_lut_manager actor.set_lut(lut_mgr.lut) else: actor.mapper.scalar_visibility = 0 self.render() def _glyph_changed(self, old, new): # Hookup a callback to set the lut appropriately. if old is not None: old.on_trait_change(self._color_mode_changed, 'color_mode', remove=True) new.on_trait_change(self._color_mode_changed, 'color_mode') # Set the glyph's module attribute -- this is important! new.module = self # Setup actors inputs. actor = self.actor if actor is not None: actor.inputs = [new] self._change_components(old, new) def _actor_changed(self, old, new): # Setup the actors scene and inputs. new.scene = self.scene g = self.glyph if g is not None: new.inputs = [g] self._change_components(old, new) mayavi-4.5.0/mayavi/modules/grid_plane.py0000644000076500000240000000752312747716314021051 0ustar prabhustaff00000000000000"""A simple grid plane module. """ # Author: Prabhu Ramachandran # Copyright (c) 2005, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import Instance from traitsui.api import View, Group, Item # Local imports from mayavi.core.module import Module from mayavi.components import grid_plane from mayavi.components.actor import Actor from mayavi.core.pipeline_info import PipelineInfo ###################################################################### # `GridPlane` class. ###################################################################### class GridPlane(Module): # The version of this class. Used for persistence. __version__ = 0 grid_plane = Instance(grid_plane.GridPlane, allow_none=False, record=True) actor = Instance(Actor, allow_non=False, record=True) input_info = PipelineInfo(datasets=['image_data', 'structured_grid', 'rectilinear_grid'], attribute_types=['any'], attributes=['any']) view = View(Group(Item(name='grid_plane', style='custom'), Item(name='actor', style='custom'), show_labels=False)) ###################################################################### # `Module` interface ###################################################################### def setup_pipeline(self): """Override this method so that it *creates* the tvtk pipeline. This method is invoked when the object is initialized via `__init__`. Note that at the time this method is called, the tvtk data pipeline will *not* yet be setup. So upstream data will not be available. The idea is that you simply create the basic objects and setup those parts of the pipeline not dependent on upstream sources and filters. You should also set the `actors` attribute up at this point. """ # Create the components self.grid_plane = grid_plane.GridPlane() self.actor = Actor() # Setup the actor suitably for this module. prop = self.actor.property prop.set(backface_culling=0, frontface_culling=0, representation='w') self.actor.mapper.scalar_visibility = 0 def update_pipeline(self): """Override this method so that it *updates* the tvtk pipeline when data upstream is known to have changed. This method is invoked (automatically) when any of the inputs sends a `pipeline_changed` event. """ mm = self.module_manager if mm is None: return # Data is available, so set the input for the grid plane. self.grid_plane.inputs = [mm.source] # Set the LUT for the mapper. self.actor.set_lut(mm.scalar_lut_manager.lut) self.pipeline_changed = True def update_data(self): """Override this method so that it flushes the vtk pipeline if that is necessary. This method is invoked (automatically) when any of the inputs sends a `data_changed` event. """ # Just set data_changed, the component should do the rest. self.data_changed = True ###################################################################### # Non-public methods. ###################################################################### def _grid_plane_changed(self, old, new): actor = self.actor if actor is not None: actor.inputs = [new] self._change_components(old, new) def _actor_changed(self, old, new): new.scene = self.scene gp = self.grid_plane if gp is not None: new.inputs = [gp] self._change_components(old, new) mayavi-4.5.0/mayavi/modules/hyper_streamline.py0000644000076500000240000001314012747716314022307 0ustar prabhustaff00000000000000""" A module that integrates through a tensor field to generate a hyperstreamline. The integration is along the maximum eigenvector and the cross section of the hyperstreamline is defined by the two other eigenvectors. Thus the shape of the hyperstreamline is "tube-like", with the cross section being elliptical. Hyperstreamlines are used to visualize tensor fields. """ # Authors: KK Rai (kk.rai [at] iitb.ac.in) # R. Ambareesha (ambareesha [at] iitb.ac.in) # Prabhu Ramachandran # Enthought library imports. from traits.api import Instance from traitsui.api import View, Group, Item from tvtk.api import tvtk # Local imports from mayavi.core.module import Module from mayavi.core.pipeline_info import PipelineInfo from mayavi.components.actor import Actor ###################################################################### # `HyperStreamline` class. ###################################################################### class HyperStreamline(Module): # The version of this class. Used for persistence. __version__ = 0 # The hyper streamline object. streamline = Instance(tvtk.HyperStreamline, allow_none=False, record=True) # The actor for the streamlines. actor = Instance(Actor, allow_none=False, record=True) # A point widget widget = Instance(tvtk.PointWidget, args=(), kw={'outline': False, 'x_shadows': False, 'y_shadows': False, 'z_shadows': False}, allow_none=False) input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['tensors']) # Create the UI for the traits. view = View(Group(Item(name='actor', style='custom'), show_labels=False, label='Actor'), Group(Item(name='widget', style='custom', resizable=True), show_labels=False, label='PointWidget'), Group(Item(name='streamline', style='custom', resizable=True), label='Streamline', show_labels=False), resizable=True ) ###################################################################### # `Module` interface ###################################################################### def setup_pipeline(self): """Override this method so that it *creates* the tvtk pipeline. This method is invoked when the object is initialized via `__init__`. Note that at the time this method is called, the tvtk data pipeline will *not* yet be setup. So upstream data will not be available. The idea is that you simply create the basic objects and setup those parts of the pipeline not dependent on upstream sources and filters. You should also set the `actors` attribute up at this point. """ self.widget.on_trait_change(self._start_position_changed) self.streamline = tvtk.HyperStreamline() self.streamline.start_position = self.widget.position self.streamline.integrate_minor_eigenvector() self.streamline.maximum_propagation_distance = 10.0 self.streamline.integration_step_length =0.1 self.streamline.step_length = 0.01 self.streamline.radius = 0.25 self.streamline.number_of_sides = 18 self.streamline.integration_direction = 2 #integrate both direction self.streamline.on_trait_change(self.render) self.actor = Actor() self.widgets.append(self.widget) def update_pipeline(self): """Override this method so that it *updates* the tvtk pipeline when data upstream is known to have changed. This method is invoked (automatically) when any of the inputs sends a `pipeline_changed` event. """ mm = self.module_manager if mm is None: return src = mm.source.outputs[0] self.configure_connection(self.streamline, mm.source) w = self.widget old_inp = w.input self.configure_input_data(w, src) if old_inp is None or src != old_inp: w.place_widget() self.streamline.update() self.outputs = [self.streamline.output] self.pipeline_changed = True def update_data(self): """Override this method so that it flushes the vtk pipeline if that is necessary. This method is invoked (automatically) when any of the inputs sends a `data_changed` event. """ # Just set data_changed, the component should do the rest. self.data_changed = True ###################################################################### # Non-public methods. ###################################################################### def _streamline_changed(self, old, new): if old is not None: old.on_trait_change(self.render, remove=True) new.on_trait_change(self.render) mm = self.module_manager if mm is not None: self.configure_connection(new, mm.source) # A default output so there are no pipeline errors. The # update_pipeline call corrects this if needed. self.outputs = [new.output] self.update_pipeline() def _start_position_changed(self, value): self.streamline.start_position = self.widget.position def _actor_changed(self, old, new): new.scene = self.scene new.inputs = [self] self._change_components(old, new) mayavi-4.5.0/mayavi/modules/image_actor.py0000644000076500000240000001022112747716314021204 0ustar prabhustaff00000000000000"""Displays ImageData efficiently. """ # Author: Prabhu Ramachandran # Copyright (c) 2007, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import Instance, Bool, on_trait_change, \ Property from traitsui.api import View, Group, Item from tvtk.api import tvtk # Local imports from mayavi.core.module import Module from mayavi.core.pipeline_info import PipelineInfo ###################################################################### # `ImageActor` class ###################################################################### class ImageActor(Module): # An image actor. actor = Instance(tvtk.ImageActor, allow_none=False, record=True) input_info = PipelineInfo(datasets=['image_data'], attribute_types=['any'], attributes=['any']) # An ImageMapToColors TVTK filter to adapt datasets without color # information image_map_to_color = Instance(tvtk.ImageMapToColors, (), allow_none=False, record=True) map_scalars_to_color = Bool _force_map_scalars_to_color = Property(depends_on='module_manager.source') ######################################## # The view of this module. view = View(Group(Item(name='actor', style='custom', resizable=True), show_labels=False, label='Actor'), Group( Group(Item('map_scalars_to_color', enabled_when='not _force_map_scalars_to_color')), Item('image_map_to_color', style='custom', enabled_when='map_scalars_to_color', show_label=False), label='Map Scalars', ), width=500, height=600, resizable=True) ###################################################################### # `Module` interface ###################################################################### def setup_pipeline(self): self.actor = tvtk.ImageActor() @on_trait_change('map_scalars_to_color,' 'image_map_to_color.[output_format,pass_alpha_to_output],' 'module_manager.scalar_lut_manager.lut_mode,' 'module_manager.vector_lut_manager.lut_mode') def update_pipeline(self): """Override this method so that it *updates* the tvtk pipeline when data upstream is known to have changed. """ mm = self.module_manager if mm is None: return src = mm.source if self._force_map_scalars_to_color: self.set(map_scalars_to_color=True, trait_change_notify=False) if self.map_scalars_to_color: self.configure_connection(self.image_map_to_color, src) self.image_map_to_color.lookup_table = mm.scalar_lut_manager.lut self.image_map_to_color.update() self.configure_input_data(self.actor, self.image_map_to_color.output) else: self.configure_input_data(self.actor, src.outputs[0]) self.pipeline_changed = True def update_data(self): """Override this method so that it flushes the vtk pipeline if that is necessary. """ # Just set data_changed, the component should do the rest. self.data_changed = True ###################################################################### # Non-public methods. ###################################################################### def _actor_changed(self, old, new): if old is not None: self.actors.remove(old) old.on_trait_change(self.render, remove=True) self.actors.append(new) new.on_trait_change(self.render) def _get__force_map_scalars_to_color(self): mm = self.module_manager if mm is None: return False src = mm.source return not isinstance(src.outputs[0].point_data.scalars, tvtk.UnsignedCharArray) mayavi-4.5.0/mayavi/modules/image_plane_widget.py0000644000076500000240000001105412747716314022543 0ustar prabhustaff00000000000000"""A simple ImagePlaneWidget module to view image data. """ # Author: Prabhu Ramachandran # Copyright (c) 2005-2015, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import Instance, Bool, on_trait_change from traitsui.api import View, Group, Item from tvtk.api import tvtk # Local imports from mayavi.core.module import Module from mayavi.core.common import error from mayavi.core.pipeline_info import PipelineInfo ###################################################################### # `ImagePlaneWidget` class. ###################################################################### class ImagePlaneWidget(Module): # The version of this class. Used for persistence. __version__ = 0 ipw = Instance(tvtk.ImagePlaneWidget, allow_none=False, record=True) use_lookup_table = Bool(True, help='Use a lookup table to map input scalars to colors') input_info = PipelineInfo(datasets=['image_data'], attribute_types=['any'], attributes=['scalars']) view = View(Group(Item(name='ipw', style='custom', resizable=True), show_labels=False ), width=600, height=600, resizable=True, scrollable=True ) ###################################################################### # `Module` interface ###################################################################### def setup_pipeline(self): """Override this method so that it *creates* the tvtk pipeline. This method is invoked when the object is initialized via `__init__`. Note that at the time this method is called, the tvtk data pipeline will *not* yet be setup. So upstream data will not be available. The idea is that you simply create the basic objects and setup those parts of the pipeline not dependent on upstream sources and filters. You should also set the `actors` attribute up at this point. """ # Create the various objects for this module. self.ipw = tvtk.ImagePlaneWidget(display_text=1, key_press_activation=0, left_button_action=1, middle_button_action=0, user_controlled_lookup_table=True) self.setup_lut() def update_pipeline(self): """Override this method so that it *updates* the tvtk pipeline when data upstream is known to have changed. This method is invoked (automatically) when any of the inputs sends a `pipeline_changed` event. """ mod_mgr = self.module_manager if mod_mgr is None: return # Data is available, so set the input for the IPW. input = mod_mgr.source.outputs[0] dataset = mod_mgr.source.get_output_dataset() if not (dataset.is_a('vtkStructuredPoints') \ or dataset.is_a('vtkImageData')): msg = 'ImagePlaneWidget only supports structured points or '\ 'image data.' error(msg) raise TypeError(msg) self.configure_input(self.ipw, input) self.setup_lut() def update_data(self): """Override this method so that it flushes the vtk pipeline if that is necessary. This method is invoked (automatically) when any of the inputs sends a `data_changed` event. """ # Just set data_changed, the component should do the rest. self.data_changed = True @on_trait_change('use_lookup_table') def setup_lut(self): # Set the LUT for the IPW. if self.use_lookup_table: if self.module_manager is not None: self.ipw.lookup_table = \ self.module_manager.scalar_lut_manager.lut else: self.ipw.color_map.lookup_table = None self.render() ###################################################################### # Non-public methods. ###################################################################### def _ipw_changed(self, old, new): if old is not None: old.on_trait_change(self.render, remove=True) self.widgets.remove(old) new.on_trait_change(self.render) self.widgets.append(new) if old is not None: self.update_pipeline() self.pipeline_changed = True mayavi-4.5.0/mayavi/modules/iso_surface.py0000644000076500000240000001317312747716314021245 0ustar prabhustaff00000000000000"""An IsoSurface module that allows the user to make contours of input point data. """ # Author: Prabhu Ramachandran # Copyright (c) 2005, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import Instance, Bool # Local imports from mayavi.core.module import Module from mayavi.components.contour import Contour from mayavi.components.poly_data_normals import PolyDataNormals from mayavi.components.actor import Actor from mayavi.core.pipeline_info import PipelineInfo ###################################################################### # `IsoSurface` class. ###################################################################### class IsoSurface(Module): # The version of this class. Used for persistence. __version__ = 0 # The contour component. contour = Instance(Contour, record=True) # Specify if normals are to be computed to make a smoother surface. compute_normals = Bool(True, desc='if normals are to be computed '\ 'to make the iso-surface smoother') # The component that computes the normals. normals = Instance(PolyDataNormals, record=True) # The actor component that represents the iso-surface. actor = Instance(Actor, record=True) input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['scalars']) ######################################## # The view of this object. # Commented out, since we are now using the iso_surface_view.py version. #view = View([Group( # Item( name = 'contour', # style = 'custom' ), # show_labels = False, # show_border = True, # label = 'Contours' ), # Group( # Item( name = 'compute_normals' ), # '_', # Item( name = 'normals', # style = 'custom', # show_label = False, # enabled_when = 'compute_normals' ), # show_border = True, # label = 'Normals' ), # Group( # Item( name = 'actor', # style = 'custom' ), # show_labels = False ) # ] # ) ###################################################################### # `Module` interface ###################################################################### def setup_pipeline(self): """Override this method so that it *creates* the tvtk pipeline. This method is invoked when the object is initialized via `__init__`. Note that at the time this method is called, the tvtk data pipeline will *not* yet be setup. So upstream data will not be available. The idea is that you simply create the basic objects and setup those parts of the pipeline not dependent on upstream sources and filters. You should also set the `actors` attribute up at this point. """ # Create the components self.contour = Contour(show_filled_contours=False) self.normals = PolyDataNormals() self.actor = Actor() # Setup the actor suitably for this module. self.actor.mapper.scalar_visibility = 1 def update_pipeline(self): """Override this method so that it *updates* the tvtk pipeline when data upstream is known to have changed. This method is invoked (automatically) when any of the inputs sends a `pipeline_changed` event. """ mm = self.module_manager if mm is None: return # Data is available, so set the input for the grid plane. self.contour.inputs = [mm.source] # Force the normals setting to be noted. self._compute_normals_changed(self.compute_normals) # Set the LUT for the mapper. self.actor.set_lut(mm.scalar_lut_manager.lut) self.pipeline_changed = True def update_data(self): """Override this method so that it flushes the vtk pipeline if that is necessary. This method is invoked (automatically) when any of the inputs sends a `data_changed` event. """ # Just set data_changed, the component should do the rest. self.data_changed = True ###################################################################### # Non-public interface. ###################################################################### def _compute_normals_changed(self, value): if self.module_manager is None: return actor = self.actor if value: if actor: actor.inputs = [self.normals] else: if actor: actor.inputs = [self.contour] self.render() def _contour_changed(self, old, new): normals = self.normals if normals is not None: normals.inputs = [new] self._change_components(old, new) def _normals_changed(self, old, new): contour = self.contour if contour is not None: new.inputs = [contour] self._change_components(old, new) def _actor_changed(self, old, new): # Here we set the inputs in any case to avoid VTK pipeline # errors. The pipeline is corrected when update_pipeline is # called anyway. contour = self.contour if contour is not None: new.inputs = [contour] self._change_components(old, new) mayavi-4.5.0/mayavi/modules/labels.py0000644000076500000240000001746012747716314020210 0ustar prabhustaff00000000000000# Author: Prabhu Ramachandran # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. # Standard library imports. # Enthought library imports. from traits.api import Int, Instance, Str, TraitError from traitsui.api import View, Group, Item from tvtk.api import tvtk from apptools.persistence import state_pickler # Local imports. from mayavi.core.common import error from mayavi.core.pipeline_base import PipelineBase from mayavi.core.pipeline_info import PipelineInfo from mayavi.core.module import Module from mayavi.filters.optional import Optional from mayavi.filters.mask_points import MaskPoints from mayavi.filters.user_defined import UserDefined from mayavi.components.actor2d import Actor2D from mayavi.core.common import handle_children_state ################################################################################ # `Labels` class. ################################################################################ class Labels(Module): """ Allows a user to label the current dataset or the current actor of the active module. """ # Used for persistence. __version__ = 0 # The object which we are labeling. object = Instance(PipelineBase, record=False) # The label format string. label_format = Str('', enter_set=True, auto_set=False, desc='the label format string') # Number of points to label. number_of_labels = Int(25, enter_set=True, auto_set=False, desc='the number of points to label') # The filter used for masking of the points. mask = Instance(MaskPoints, record=True) # Filter to select visible points. visible_points = Instance(Optional, record=True) # The 2D actor for the labels. actor = Instance(Actor2D, record=True) # The text property of the labels. property = Instance(tvtk.TextProperty, record=True) # The mapper for the labels. mapper = Instance(tvtk.LabeledDataMapper, args=(), record=True) input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']) ######################################## # Private traits. # The input used for the labeling. input = Instance(PipelineBase) # The id of the object in the modulemanager only used for # persistence. object_id = Int(-2) ######################################## # View related traits. view = View(Group(Item(name='number_of_labels'), Item(name='label_format'), Item(name='mapper', style='custom', show_label=False, resizable=True), Item(name='mask', style='custom', resizable=True, show_label=False), label='Labels' ), Group( Item(name='visible_points', style='custom', resizable=True, show_label=False), label='VisiblePoints' ), Group(Item(name='property', style='custom', show_label=False, resizable=True), label='TextProperty' ), resizable=True ) ###################################################################### # `object` interface. ###################################################################### def __get_pure_state__(self): self._compute_object_id() d = super(Labels, self).__get_pure_state__() for name in ('object', 'mapper', 'input'): d.pop(name, None) # Must pickle the components. d['components'] = self.components return d def __set_pure_state__(self, state): handle_children_state(self.components, state.components) state_pickler.set_state(self, state) self.update_pipeline() ###################################################################### # `Module` interface. ###################################################################### def setup_pipeline(self): mask = MaskPoints() mask.filter.set(generate_vertices=True, random_mode=True) self.mask = mask v = UserDefined(filter=tvtk.SelectVisiblePoints(), name='VisiblePoints') self.visible_points = Optional(filter=v, enabled=False) mapper = tvtk.LabeledDataMapper() self.mapper = mapper self.actor = Actor2D(mapper=mapper) self.property = mapper.label_text_property self.property.on_trait_change(self.render) self.components = [self.mask, self.visible_points, self.actor] def update_pipeline(self): mm = self.module_manager if mm is None: return self._find_input() # Calculates self.input self.mask.inputs = [self.input] self.visible_points.inputs = [self.mask] self.actor.inputs = [self.visible_points] self._number_of_labels_changed(self.number_of_labels) self._label_format_changed(self.label_format) ###################################################################### # Non-public interface. ###################################################################### def _find_input(self): mm = self.module_manager if self.object is None: if self.object_id == -1: self.input = mm.source elif self.object_id > -1: obj = mm.children[self.object_id] if hasattr(obj, 'actor'): self.set(object=obj, trait_change_notify=False) self.input = obj.actor.inputs[0] else: self.input = mm.source else: o = self.object if hasattr(o, 'module_manager'): # A module. if hasattr(o, 'actor'): self.input = o.actor.inputs[0] else: self.input = o.module_manager.source if self.input is None: if self.object_id == -2: self.input = mm.source else: error('No object to label!') return def _number_of_labels_changed(self, value): if self.input is None: return f = self.mask.filter inp = self.input.outputs[0] if not inp.is_a('vtkDataSet'): inp = inp.output if hasattr(inp, 'update'): inp.update() npts = inp.number_of_points typ = type(f.on_ratio) f.on_ratio = typ(max(npts/value, 1)) if self.mask.running: f.update() self.mask.data_changed = True def _label_format_changed(self, value): if len(value) > 0: self.mapper.label_format = value self.render() else: try: self.mapper.label_format = None except TraitError: self.mapper.label_format = '%g' self.render() def _object_changed(self, value): self.update_pipeline() def _compute_object_id(self): mm = self.module_manager input = self.input self.object_id = -2 if input is mm.source: self.object_id = -1 return for id, child in enumerate(mm.children): if child is self.object: self.object_id = id return def _scene_changed(self, old, new): self.visible_points.filter.filter.renderer = new.renderer super(Labels, self)._scene_changed(old, new) mayavi-4.5.0/mayavi/modules/metadata.py0000644000076500000240000003360512747716314020525 0ustar prabhustaff00000000000000""" Metadata for all modules. """ # Author: Prabhu Ramachandran # Copyright (c) 2008, Prabhu Ramachandran Enthought, Inc. # License: BSD Style. # Local imports. from mayavi.core.metadata import ModuleMetadata from mayavi.core.pipeline_info import PipelineInfo BASE = 'mayavi.modules' ################################################################################ # Metadata. axes_module = ModuleMetadata( id = "AxesModule", menu_name = "&Axes", class_name = BASE + '.axes.Axes', desc = "Draw cubical axes on the outline for given input", tooltip = "Draw axes on the outline of input data", help = "Draw axes on the outline of input data", input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']) ) contour_grid_plane_module = ModuleMetadata( id = "ContourGridPlaneModule", menu_name = "&ContourGridPlane", class_name = BASE + '.contour_grid_plane.ContourGridPlane', desc = "Shows a contour grid plane for the given input", tooltip = "Shows a contour grid plane for the given input", help = "Shows a contour grid plane for the given input", input_info = PipelineInfo(datasets=['image_data', 'structured_grid', 'rectilinear_grid'], attribute_types=['any'], attributes=['any']) ) custom_grid_plane_module = ModuleMetadata( id = "CustomGridPlaneModule", menu_name = "CustomGridPlane", class_name = BASE + '.custom_grid_plane.CustomGridPlane', desc = "Creates a highly customizable grid plane for given input", tooltip = "Creates a highly customizable grid plane for given input", help = "Creates a highly customizable grid plane for given input", input_info = PipelineInfo(datasets=['image_data', 'structured_grid', 'rectilinear_grid'], attribute_types=['any'], attributes=['any']) ) glyph_module = ModuleMetadata( id = "GlyphModule", menu_name = "Gl&yph", class_name = BASE + '.glyph.Glyph', desc = "Creates colored and scaled glyphs at at input points", tooltip = "Creates colored and scaled glyphs at at input points", help = "Creates colored and scaled glyphs at at input points", input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']) ) grid_plane_module = ModuleMetadata( id = "GridPlaneModule", menu_name = "&GridPlane", class_name = BASE + '.grid_plane.GridPlane', desc = "Shows a grid plane for the given input", tooltip = "Shows a grid plane for the given input", help = "Shows a grid plane for the given input", input_info = PipelineInfo(datasets=['image_data', 'structured_grid', 'rectilinear_grid'], attribute_types=['any'], attributes=['any']) ) hyper_streamline_module = ModuleMetadata( id = "HyperStreamlineModule", menu_name = "&HyperStreamline", class_name = BASE + '.hyper_streamline.HyperStreamline', desc = "Shows hyper streamlines for tensor data", tooltip = "Shows hyper streamlines for tensor data", help = "Shows hyper streamlines for tensor data", input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['tensors']) ) image_actor_module = ModuleMetadata( id = "ImageActorModule", menu_name = "&ImageActor", class_name = BASE + '.image_actor.ImageActor', desc = "Shows an image actor for image data", tooltip = "Shows an image actor for image data", help = "Shows an image actor for image data", input_info = PipelineInfo(datasets=['image_data'], attribute_types=['any'], attributes=['any']) ) image_plane_widget_module = ModuleMetadata( id = "ImagePlaneWidgetModule", menu_name = "I&magePlaneWidget", class_name = BASE + '.image_plane_widget.ImagePlaneWidget', desc = "Shows an image plane widget for image data", tooltip = "Shows an image plane widget for image data", help = "Shows an image plane widget for image data", input_info = PipelineInfo(datasets=['image_data'], attribute_types=['any'], attributes=['scalars']) ) isosurface_module = ModuleMetadata( id = "IsoSurfaceModule", menu_name = "&IsoSurface", class_name = BASE + '.iso_surface.IsoSurface', desc = "Creates an iso-surface for the given input", tooltip = "Creates an iso-surface for the given input", help = "Creates an iso-surface for the given input", input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['scalars']) ) labels_module = ModuleMetadata( id = "LabelsModule", menu_name = "&Labels", class_name = BASE + '.labels.Labels', desc = "Display labels for active dataset or active module", tooltip = "Display labels for active dataset or active module", help = "Display labels for active dataset or active module", input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']) ) orientation_axes_module = ModuleMetadata( id = "OrientationAxesModule", menu_name = "Orientation A&xes", class_name = BASE + '.orientation_axes.OrientationAxes', desc = "Show an axes indicating the current orientation", tooltip = "Show an axes indicating the current orientation", help = "Show an axes indicating the current orientation", input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']) ) outline_module = ModuleMetadata( id = "OutlineModule", menu_name = "&Outline", class_name = BASE + '.outline.Outline', desc = "Draw an outline for given input", tooltip = "Draw an outline for given input", help = "Draw an outline for given input", input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']) ) scalar_cut_plane_module = ModuleMetadata( id = "ScalarCutPlaneModule", menu_name = "Scalar Cut &Plane", class_name = BASE + '.scalar_cut_plane.ScalarCutPlane', desc = "Slice through the data with optional contours", tooltip = "Slice through the data with optional contours", help = "Slice through the data with optional contours", input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['scalars']) ) slice_ug_module = ModuleMetadata( id = "SliceUnstructuredGridModule", menu_name = "Slice &Unstructured Grid", class_name = BASE + '.slice_unstructured_grid.SliceUnstructuredGrid', desc = "Slice an unstructured grid to show cells", tooltip = "Slice an unstructured grid to show cells", help = "Slice an unstructured grid to show cells", input_info = PipelineInfo(datasets=['unstructured_grid'], attribute_types=['any'], attributes=['any']) ) sgrid_outline_module = ModuleMetadata( id = "StructuredGridOutlineModule", menu_name = "StructuredGridOutline", class_name = BASE + '.structured_grid_outline.StructuredGridOutline', desc = "Draw a grid-conforming outline for structured grids", tooltip = "Draw a grid-conforming outline for structured grids", help = "Draw a grid-conforming outline for structured grids", input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']) ) streamline_module = ModuleMetadata( id = "StreamlineModule", menu_name = "Stream&line", class_name = BASE + '.streamline.Streamline', desc = "Generate streamlines for the vectors", tooltip = "Generate streamlines for the vectors", help = "Generate streamlines for the vectors", input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['vectors']) ) surface_module = ModuleMetadata( id = "SurfaceModule", menu_name = "&Surface", class_name = BASE + '.surface.Surface', desc = "Creates a surface for the given input", tooltip = "Creates a surface for the given input", help = "Creates a surface for the given input", input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']) ) tensor_glyph_module = ModuleMetadata( id = "TensorGlyphModule", menu_name = "Te&nsorGlyph", class_name = BASE + '.tensor_glyph.TensorGlyph', desc = "Displays glyphs scaled and oriented as per tensor data", tooltip = "Displays glyphs scaled and oriented as per tensor data", help = "Displays glyphs scaled and oriented as per tensor data", input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['tensors']) ) text_module = ModuleMetadata( id = "TextModule", menu_name = "&Text", class_name = BASE + '.text.Text', desc = "Displays user specified text on screen", tooltip = "Displays text on screen", help = "Displays text on screen", input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']) ) text3d_module = ModuleMetadata( id = "Text3DModule", menu_name = "&Text3D", class_name = BASE + '.text3d.Text3D', desc = "Displays user-specified text at a 3D location in the scene", tooltip = "Displays user-specified text at a 3D location in the scene", help = "Displays user-specified text at a 3D location in the scene", input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']) ) vector_cut_plane_module = ModuleMetadata( id = "VectorCutPlaneModule", menu_name = "&VectorCutPlane", class_name = BASE + '.vector_cut_plane.VectorCutPlane', desc = "Display vectors along a cut plane", tooltip = "Display vectors along a cut plane", help = "Display vectors along a cut plane", input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['vectors']) ) vectors_module = ModuleMetadata( id = "VectorsModule", menu_name = "Vecto&rs", class_name = BASE + '.vectors.Vectors', desc = "Display input vectors using arrows or other glyphs", tooltip = "Display input vectors using arrows or other glyphs", help = "Display input vectors using arrows or other glyphs", input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']) ) volume_module = ModuleMetadata( id = "VolumeModule", menu_name = "Volum&e", class_name = BASE + '.volume.Volume', desc = "Use volume rendering to view the scalar field", tooltip = "Use volume rendering to view the scalar field", help = "Use volume rendering to view the scalar field", input_info = PipelineInfo(datasets=['image_data', 'unstructured_grid'], attribute_types=['any'], attributes=['scalars']) ) warp_vector_cut_plane_module = ModuleMetadata( id = "WarpVectorCutPlaneModule", menu_name = "&WarpVectorCutPlane", class_name = BASE + '.warp_vector_cut_plane.WarpVectorCutPlane', desc = "Warp cut plane along scaled input vectors", tooltip = "Warp cut plane along scaled input vectors", help = "Warp cut plane along scaled input vectors", input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['vectors']) ) # Now collect all the modules for the mayavi registry. modules = [axes_module, contour_grid_plane_module, custom_grid_plane_module, glyph_module, grid_plane_module, hyper_streamline_module, image_actor_module, image_plane_widget_module, isosurface_module, labels_module, orientation_axes_module, outline_module, scalar_cut_plane_module, slice_ug_module, sgrid_outline_module, streamline_module, surface_module, tensor_glyph_module, text_module, text3d_module, vector_cut_plane_module, vectors_module, volume_module, warp_vector_cut_plane_module, ] mayavi-4.5.0/mayavi/modules/orientation_axes.py0000644000076500000240000001743112747716314022317 0ustar prabhustaff00000000000000"""Creates a small axes on the side that indicates the position of the co-ordinate axes and thereby marks the orientation of the scene. It uses the OrientationMarkerWidget which requires VTK-4.5 and above. """ # Author: Prabhu Ramachandran # Copyright (c) 2005-2015, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import Instance, Property from traitsui.api import View, Group, Item, InstanceEditor from tvtk.api import tvtk from apptools.persistence import state_pickler # Local imports from mayavi.core.module import Module from mayavi.core.common import error from mayavi.core.pipeline_info import PipelineInfo if not hasattr(tvtk, 'OrientationMarkerWidget'): msg = 'The OrientationAxes module requires VTK version >= 4.5' error(msg) raise ImportError(msg) ###################################################################### # `OrientationAxes` class. ###################################################################### class OrientationAxes(Module): # The version of this class. Used for persistence. __version__ = 0 # The tvtk orientation marker widget. marker = Instance(tvtk.OrientationMarkerWidget, allow_none=False) # The tvtk axes that will be shown. axes = Instance(tvtk.AxesActor, allow_none=False, record=True) # The property of the axes (color etc.). text_property = Property(record=True) input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']) ######################################## # Private traits. _text_property = Instance(tvtk.TextProperty) ######################################## # The view of this object. _marker_group = Group(Item(name='enabled'), Item(name='interactive'), show_border=True, label='Widget') _axes_group = Group(Item(name='axis_labels'), Item(name='visibility'), Item(name='x_axis_label_text'), Item(name='y_axis_label_text'), Item(name='z_axis_label_text'), Item(name='cone_radius'), Item(name='cone_resolution'), Item(name='cylinder_radius'), Item(name='cylinder_resolution'), Item(name='normalized_label_position'), Item(name='normalized_shaft_length'), Item(name='normalized_tip_length'), Item(name='total_length'), show_border=True, label='Axes') view = View(Group(Item(name='marker', style='custom', editor=InstanceEditor(view=View(_marker_group))), Item(name='axes', style='custom', editor=InstanceEditor(view=View(_axes_group))), label='Widget/Axes', show_labels=False), Group(Item(name='_text_property', style='custom', resizable=True), label='Text Property', show_labels=False), ) ###################################################################### # `object` interface ###################################################################### def __set_pure_state__(self, state): for prop in ['axes', 'marker', '_text_property']: obj = getattr(self, prop) state_pickler.set_state(obj, state[prop]) ###################################################################### # `Module` interface ###################################################################### def setup_pipeline(self): """Override this method so that it *creates* the tvtk pipeline. This method is invoked when the object is initialized via `__init__`. Note that at the time this method is called, the tvtk data pipeline will *not* yet be setup. So upstream data will not be available. The idea is that you simply create the basic objects and setup those parts of the pipeline not dependent on upstream sources and filters. You should also set the `actors` attribute up at this point. """ # Setup the default objects. self.axes = tvtk.AxesActor(normalized_tip_length=(0.4, 0.4, 0.4), normalized_shaft_length=(0.6, 0.6, 0.6), shaft_type='cylinder') self.text_property.set(color=(1,1,1), shadow=False, italic=False) self.marker = tvtk.OrientationMarkerWidget(key_press_activation=False) def update_pipeline(self): """Override this method so that it *updates* the tvtk pipeline when data upstream is known to have changed. This method is invoked (automatically) when any of the inputs sends a `pipeline_changed` event. """ self.pipeline_changed = True def update_data(self): """Override this method so that it flushes the vtk pipeline if that is necessary. This method is invoked (automatically) when any of the inputs sends a `data_changed` event. """ # Just set data_changed, the component should do the rest. self.data_changed = True ###################################################################### # Non-public interface ###################################################################### def _marker_changed(self, old, new): if old is not None: old.on_trait_change(self.render, remove=True) self.widgets.remove(old) axes = self.axes if axes is not None: new.orientation_marker = axes new.on_trait_change(self.render) self.widgets.append(new) self.render() def _axes_changed(self, old, new): if old is not None: old.on_trait_change(self.render, remove=True) self._text_property.on_trait_change(self.render, remove=True) marker = self.marker if marker is not None: marker.orientation_marker = new p = new.x_axis_caption_actor2d.caption_text_property new.y_axis_caption_actor2d.caption_text_property = p new.z_axis_caption_actor2d.caption_text_property = p self._text_property = p # XXX: The line of code below is a stop-gap solution. Without it, # Some observers in the AxesActor trigger a modification of the # font_size each time the mouse is moved over the OrientationAxes # (this can be seen when running the record mode, for instance), # and thus a render, which is very slow. On the other hand, font # size does not work for the AxesActor, with or without the # line of code below. So we probably haven't found the true # cause of the problem. p.teardown_observers() new.on_trait_change(self.render) p.on_trait_change(self.render) self.render() def _get_text_property(self): return self._text_property def _foreground_changed_for_scene(self, old, new): # Change the default color for the actor. self.text_property.color = new self.render() def _scene_changed(self, old, new): super(OrientationAxes, self)._scene_changed(old, new) self._foreground_changed_for_scene(None, new.foreground) self._visible_changed(self.visible) def _visible_changed(self, value): if self.scene is not None and self.marker.interactor: # Enabling an OrientationAxes without an interactor will # lead to a segfault super(OrientationAxes, self)._visible_changed(value) mayavi-4.5.0/mayavi/modules/outline.py0000644000076500000240000001700212747716314020415 0ustar prabhustaff00000000000000""" A module that displays the outline for the given data, either as a box, or the corners of the bounding box. """ # Authors: Prabhu Ramachandran # KK Rai (kk.rai [at] iitb.ac.in) # R. Ambareesha (ambareesha [at] iitb.ac.in) # Copyright (c) 2005-2007, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import Instance, Enum, Property, Bool, \ DelegatesTo from traitsui.api import View, Group, Item from tvtk.api import tvtk from tvtk.common import is_old_pipeline # Local imports from mayavi.core.module import Module from mayavi.components.actor import Actor from mayavi.core.pipeline_info import PipelineInfo ###################################################################### # `Outline` class. ###################################################################### class Outline(Module): # The version of this class. Used for persistence. __version__ = 0 # The `Outline` filter which can either be an instance of # `OutlineFilter` or `OutlineCornerFilter`. The `ObjectBase` class # is the superclass of both the `OutlineFilter` and the # `OutlineCornerFilter`. outline_filter = Property(Instance(tvtk.ObjectBase, allow_none=False), record=True) # Enum to set the outline type. outline_mode = Enum('full', 'cornered', desc='if outline mode is "full" or "cornered"') actor = Instance(Actor, allow_none=False, record=True) input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']) # An outline source, optionally used to choose the bounds of the # outline. outline_source = Instance(tvtk.OutlineSource, ()) bounds = DelegatesTo('outline_source', desc="the bounds of the outline: xmin, xmax, ymin, ymax") manual_bounds = Bool( desc="whether the bounds are automatically inferred from " "the data source") # Create the UI for the traits. # The controls for the outline_filter should be enabled only when the # Cornered Outline Filter is selected. view = View(Group( Group( Item(name='outline_mode'), Item(name='outline_filter', style='custom', enabled_when='outline_mode == "cornered"', visible_when='outline_mode == "cornered"', resizable=True, show_label=False), label='Outline', show_labels=False), Group('manual_bounds', Item('bounds', enabled_when='manual_bounds'), label='Bounds', ), Item(name='actor', style='custom'), layout='tabbed', show_labels=False), resizable=True) ######################################## # Private traits. # We make these private traits and cache them because if we create # these anew each time the `outline_mode` changes, then we loose # any settings the user changed on the previous mode. _full_outline = Instance(tvtk.OutlineFilter, args=(), allow_none=False) _cornered_outline = Instance(tvtk.OutlineCornerFilter, args=(), allow_none=False) ###################################################################### # `Module` interface ###################################################################### def setup_pipeline(self): """Override this method so that it *creates* the tvtk pipeline. This method is invoked when the object is initialized via `__init__`. Note that at the time this method is called, the tvtk data pipeline will *not* yet be setup. So upstream data will not be available. The idea is that you simply create the basic objects and setup those parts of the pipeline not dependent on upstream sources and filters. You should also set the `actors` attribute up at this point. """ # When any trait on the outline filters change call the render # method. self._full_outline.on_trait_change(self.render) self._cornered_outline.on_trait_change(self.render) # In the new pipeline, vtkCompositeDataPipeline complains if # an outline filter is configured without an input connection self.configure_connection(self.outline_filter, self.outline_source) self.actor = Actor() def update_pipeline(self): """Override this method so that it *updates* the tvtk pipeline when data upstream is known to have changed. This method is invoked (automatically) when any of the inputs sends a `pipeline_changed` event. """ mm = self.module_manager if mm is None: return self._outline_mode_changed(self.outline_mode) self.pipeline_changed = True def update_data(self): """Override this method so that it flushes the vtk pipeline if that is necessary. This method is invoked (automatically) when any of the inputs sends a `data_changed` event. """ # Just set data_changed, the component should do the rest. self.data_changed = True def render(self): if not is_old_pipeline(): self.outline_filter.update() super(Outline, self).render() ###################################################################### # Non-public methods. ###################################################################### def _outline_mode_changed(self, value): """This method is invoked (automatically) when the 'outline_mode' attribute is changed. """ # Properties don't fire events, so we fire an event here so UI # elements and any listners can update due to the changed mode. new = self.outline_filter old = self._cornered_outline if new is self._full_outline: old = self._cornered_outline self.trait_property_changed('outline_filter', old, new) mm = self.module_manager if mm is None: return # Set the input of the filter. self._manual_bounds_changed() # The module has a list of outputs, but at this stage, # the output of the newly instantiated filter will be its only output. self.outputs = [self.outline_filter.output] def _get_outline_filter(self): if self.outline_mode == 'full': return self._full_outline else: return self._cornered_outline def _actor_changed(self, old, new): new.scene = self.scene new.inputs = [self] self._change_components(old, new) def _manual_bounds_changed(self): if self.manual_bounds: if is_old_pipeline(): self.outline_filter.input = self.outline_source.output else: self.outline_filter.input_connection = self.outline_source.output_port else: # Set the input of the filter. mm = self.module_manager self.configure_connection(self.outline_filter, mm.source) self.render() def _bounds_changed(self): self.outline_filter.update() self.pipeline_changed = True mayavi-4.5.0/mayavi/modules/scalar_cut_plane.py0000644000076500000240000002650312747716314022243 0ustar prabhustaff00000000000000"""Takes a cut plane of any input data set using an implicit plane and plots the data with optional contouring and scalar warping. """ # Author: Prabhu Ramachandran # Copyright (c) 2005, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import Instance, Bool from traitsui.api import View, Group, Item, InstanceEditor # Local imports from mayavi.core.module import Module from mayavi.core.pipeline_info import PipelineInfo from mayavi.components.implicit_plane import ImplicitPlane from mayavi.components.cutter import Cutter from mayavi.filters.warp_scalar import WarpScalar from mayavi.components.poly_data_normals import PolyDataNormals from mayavi.components.contour import Contour from mayavi.components.actor import Actor ###################################################################### # `ScalarCutPlane` class. ###################################################################### class ScalarCutPlane(Module): # The version of this class. Used for persistence. __version__ = 0 # The implicit plane widget used to place the implicit function. implicit_plane = Instance(ImplicitPlane, allow_none=False, record=True) # The cutter. Takes a cut of the data on the implicit plane. cutter = Instance(Cutter, allow_none=False, record=True) # Specifies if contouring is to be done or not. enable_contours = Bool(False, desc='if contours are generated') # The Contour component that contours the data. contour = Instance(Contour, allow_none=False, record=True) # Specifies if scalar warping is to be done or not. enable_warp_scalar = Bool(False, desc='if scalar warping is enabled') # The WarpScalarCutPlane component that warps the data. warp_scalar = Instance(WarpScalar, allow_none=False, record=True) # Specify if scalar normals are to be computed to make a smoother surface. compute_normals = Bool(False, desc='if normals are to be computed '\ 'to make the warped scalar surface smoother') # The component that computes the scalar normals. normals = Instance(PolyDataNormals, allow_none=False, record=True) # The actor component that represents the visualization. actor = Instance(Actor, allow_none=False, record=True) input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['scalars']) ######################################## # View related code. _warp_group = Group(Item(name='filter', style='custom', editor=\ InstanceEditor(view= View(Item('scale_factor')))), show_labels=False) view = View(Group(Item(name='implicit_plane', style='custom'), label='ImplicitPlane', show_labels=False), Group(Group(Item(name='enable_contours')), Group(Item(name='contour', style='custom', enabled_when='object.enable_contours'), show_labels=False), label='Contours', show_labels=False), Group(Item(name='enable_warp_scalar'), Group(Item(name='warp_scalar', enabled_when='enable_warp_scalar', style='custom', editor=InstanceEditor(view= View(_warp_group)) ), show_labels=False, ), Item(name='_'), Item(name='compute_normals', enabled_when='enable_warp_scalar'), Item(name='normals', style='custom', show_label=False, enabled_when='compute_normals and enable_warp_scalar'), label='WarpScalar', show_labels=True), Group(Item(name='actor', style='custom'), label='Actor', show_labels=False) ) ###################################################################### # `Module` interface ###################################################################### def setup_pipeline(self): """Override this method so that it *creates* the tvtk pipeline. This method is invoked when the object is initialized via `__init__`. Note that at the time this method is called, the tvtk data pipeline will *not* yet be setup. So upstream data will not be available. The idea is that you simply create the basic objects and setup those parts of the pipeline not dependent on upstream sources and filters. You should also set the `actors` attribute up at this point. """ # Create the objects. self.implicit_plane = ImplicitPlane() self.cutter = Cutter() self.contour = Contour(auto_contours=True, number_of_contours=10) self.warp_scalar = WarpScalar() self.normals = PolyDataNormals() self.actor = Actor() # Setup the actor suitably for this module. prop = self.actor.property prop.line_width = 2.0 def update_pipeline(self): """Override this method so that it *updates* the tvtk pipeline when data upstream is known to have changed. This method is invoked (automatically) when any of the inputs sends a `pipeline_changed` event. """ mm = self.module_manager if mm is None: return # Data is available, so set the input for the grid plane. self.implicit_plane.inputs = [mm.source] # Ensure that the warped scalar surface's normal is setup right. self.warp_scalar.filter.normal = self.implicit_plane.normal # This makes sure that any changes made to enable_warp when # the module is not running are updated when it is started -- # this in turn calls the other functions (normals and # contours) internally. self._enable_warp_scalar_changed(self.enable_warp_scalar) # Set the LUT for the mapper. self.actor.set_lut(mm.scalar_lut_manager.lut) self.pipeline_changed = True def update_data(self): """Override this method so that it flushes the vtk pipeline if that is necessary. This method is invoked (automatically) when any of the inputs sends a `data_changed` event. """ # Just set data_changed, the components should do the rest if # they are connected. self.data_changed = True ###################################################################### # Non-public methods. ###################################################################### def _get_warp_output(self): """Helper function to return the warped (or not) output depending on settings. """ if self.enable_warp_scalar: if self.compute_normals: return self.normals else: return self.warp_scalar else: return self.cutter def _get_contour_output(self): """Helper function to return the contoured (and warped (or not)) output depending on settings. """ if self.enable_contours: return self.contour else: return self._get_warp_output() def _filled_contours_changed_for_contour(self, value): """When filled contours are enabled, the mapper should use the the cell data, otherwise it should use the default scalar mode. """ if value: self.actor.mapper.scalar_mode = 'use_cell_data' else: self.actor.mapper.scalar_mode = 'default' self.render() def _enable_warp_scalar_changed(self, value): """Turns on and off the scalar warping.""" if self.module_manager is None: return if value: self.warp_scalar.inputs = [self.cutter] else: self.warp_scalar.inputs = [] self._compute_normals_changed(self.compute_normals) self.render() def _compute_normals_changed(self, value): if self.module_manager is None: return if self.enable_warp_scalar: normals = self.normals if value: normals.inputs = [self.warp_scalar] else: normals.inputs = [] self._enable_contours_changed(self.enable_contours) self.render() def _enable_contours_changed(self, value): """Turns on and off the contours.""" if self.module_manager is None: return actor = self.actor if value: self.contour.inputs = [self._get_warp_output()] actor.inputs = [self._get_contour_output()] if self.contour.filled_contours: actor.mapper.scalar_mode = 'use_cell_data' else: self.contour.inputs = [] actor.inputs = [self._get_warp_output()] actor.mapper.scalar_mode = 'default' self.render() def _normals_changed(self, old, new): warp_scalar = self.warp_scalar if warp_scalar is not None: new.inputs = [warp_scalar] self._compute_normals_changed(self.compute_normals) self._change_components(old, new) def _implicit_plane_changed(self, old, new): cutter = self.cutter if cutter is not None: cutter.cut_function = new.plane cutter.inputs = [new] # Update the pipeline. self._enable_warp_scalar_changed(self.enable_warp_scalar) # Hook up events to set the normals of the warp filter. if old is not None: old.widget.on_trait_change(self._update_normal, 'normal', remove=True) new.widget.on_trait_change(self._update_normal, 'normal') self._change_components(old, new) def _cutter_changed(self, old, new): ip = self.implicit_plane if ip is not None: new.cut_function = ip.plane new.inputs = [ip] # Update the pipeline. self._enable_warp_scalar_changed(self.enable_warp_scalar) self._change_components(old, new) def _contour_changed(self, old, new): # Update the pipeline. self._enable_contours_changed(self.enable_contours) self._change_components(old, new) def _warp_scalar_changed(self, old, new): # Update the pipeline. self._enable_warp_scalar_changed(self.enable_warp_scalar) self._change_components(old, new) def _actor_changed(self, old, new): # Update the pipeline. self._enable_contours_changed(self.enable_contours) self._change_components(old, new) def _update_normal(self): """Invoked when the orientation of the implicit plane changes. """ ws = self.warp_scalar if ws is not None: ws.filter.normal = self.implicit_plane.widget.normal mayavi-4.5.0/mayavi/modules/skeleton_module.py0000644000076500000240000000540612747716314022134 0ustar prabhustaff00000000000000"""Module documentation goes here.""" # Enthought library imports. from traits.api import Instance from traitsui.api import View, Group, Item from tvtk.api import tvtk # Local imports from mayavi.core.module import Module from mayavi.components.actor import Actor ###################################################################### # `MyModule` class. ###################################################################### class MyModule(Module): # The version of this class. Used for persistence. __version__ = 0 # The actor component that represents the visualization. actor = Instance(Actor) ######################################## # View related code. ###################################################################### # `Module` interface ###################################################################### def setup_pipeline(self): """Override this method so that it *creates* the tvtk pipeline. This method is invoked when the object is initialized via `__init__`. Note that at the time this method is called, the tvtk data pipeline will *not* yet be setup. So upstream data will not be available. The idea is that you simply create the basic objects and setup those parts of the pipeline not dependent on upstream sources and filters. You should also set the `actors` attribute up at this point. """ # Create the components and set them up. # Setup the actor suitably for this module. # Setup the components, actors and widgets. (sample code) #self.components.extend([your_components, ...]) #self.actors.append(your_actor) # Note that self.actor.actor need not be added. #self.widgets.append(your_widget) def update_pipeline(self): """Override this method so that it *updates* the tvtk pipeline when data upstream is known to have changed. This method is invoked (automatically) when any of the inputs sends a `pipeline_changed` event. """ # Data is available, so set the input for the grid plane. # Do your stuff here! # Now flush the pipeline self.pipeline_changed = True def update_data(self): """Override this method so that it flushes the vtk pipeline if that is necessary. This method is invoked (automatically) when any of the inputs sends a `data_changed` event. """ # Just set data_changed, the components should do the rest if # they are connected. self.data_changed = True ###################################################################### # Non-public methods. ###################################################################### mayavi-4.5.0/mayavi/modules/slice_unstructured_grid.py0000644000076500000240000001430512747716314023674 0ustar prabhustaff00000000000000"""This module takes a slice of the unstructured grid data and shows the cells that intersect or touch the slice.""" # Enthought library imports. from traits.api import Instance from traitsui.api import View, Group, Item from tvtk.api import tvtk # Local imports from mayavi.core.module import Module from mayavi.core.pipeline_info import PipelineInfo from mayavi.components.implicit_plane import ImplicitPlane from mayavi.components.actor import Actor from mayavi.core.common import error ###################################################################### # `MyModule` class. ###################################################################### class SliceUnstructuredGrid(Module): """This module takes a slice of the unstructured grid data and shows the cells that intersect or touch the slice.""" # The version of this class. Used for persistence. __version__ = 0 # The implicit plane widget. implicit_plane = Instance(ImplicitPlane, allow_none=False, record=True) # Extract the cells to display. extract_geometry = Instance(tvtk.ExtractGeometry, allow_none=False, record=True) # The geometry filter. geom_filter = Instance(tvtk.GeometryFilter, allow_none=False, record=True) # The actor component that represents the visualization. actor = Instance(Actor, allow_none=False, record=True) input_info = PipelineInfo(datasets=['unstructured_grid'], attribute_types=['any'], attributes=['any']) ######################################## # View related code. view = View(Group(Item(name='implicit_plane', style='custom'), label='ImplicitPlane', show_labels=False), Group(Item(name='extract_geometry', style='custom', resizable=True), label='Extract Geometry', show_labels=False), Group(Item(name='geom_filter', style='custom', resizable=True), label='Geometry Filter', show_labels=False), Group(Item(name='actor', style='custom'), label='Actor', show_labels=False) ) ###################################################################### # `Module` interface ###################################################################### def setup_pipeline(self): """Override this method so that it *creates* the tvtk pipeline. This method is invoked when the object is initialized via `__init__`. Note that at the time this method is called, the tvtk data pipeline will *not* yet be setup. So upstream data will not be available. The idea is that you simply create the basic objects and setup those parts of the pipeline not dependent on upstream sources and filters. You should also set the `actors` attribute up at this point. """ # Create the components and set them up. self.implicit_plane = ImplicitPlane() ex = tvtk.ExtractGeometry(extract_only_boundary_cells=1, extract_boundary_cells=1) self.extract_geometry = ex self.geom_filter = tvtk.GeometryFilter() # Setup the actor suitably for this module. self.actor = Actor() self.actor.property.representation = 'w' def update_pipeline(self): """Override this method so that it *updates* the tvtk pipeline when data upstream is known to have changed. This method is invoked (automatically) when any of the inputs sends a `pipeline_changed` event. """ mod_mgr = self.module_manager if mod_mgr is None: return # Data is available, so set the input for the grid plane. input = mod_mgr.source.outputs[0] if not input.is_a('vtkUnstructuredGrid'): error('SliceUnstructuredGrid only works with input '\ 'unstructured grids') self.implicit_plane.inputs = [mod_mgr.source] src = self.module_manager.source self.configure_connection(self.extract_geometry, src) # Set the LUT for the mapper. self.actor.set_lut(self.module_manager.scalar_lut_manager.lut) # Now flush the pipeline self.pipeline_changed = True def update_data(self): """Override this method so that it flushes the vtk pipeline if that is necessary. This method is invoked (automatically) when any of the inputs sends a `data_changed` event. """ # Just set data_changed, the components should do the rest if # they are connected. self.data_changed = True ###################################################################### # Non-public methods. ###################################################################### def _implicit_plane_changed(self, old, new): ex = self.extract_geometry if ex is not None: ex.implicit_function = new.plane self._change_components(old, new) def _extract_geometry_changed(self, old, new): if old is not None: old.on_trait_change(self.render, remove=True) mm = self.module_manager if mm is not None: src = mm.source self.configure_connection(new, src) ip = self.implicit_plane if ip is not None: new.implicit_function = ip.plane gf = self.geom_filter if gf is not None: gf.input_connection = new.output_port new.on_trait_change(self.render) self.update_pipeline() def _geom_filter_changed(self, old, new): if old is not None: old.on_trait_change(self.render, remove=True) ex = self.extract_geometry if ex is not None: new.input_connection = ex.output_port new.on_trait_change(self.render) self.outputs = [new.output_port] def _actor_changed(self, old, new): new.scene = self.scene new.inputs = [self] self._change_components(old, new) mayavi-4.5.0/mayavi/modules/streamline.py0000644000076500000240000002406012747716314021103 0ustar prabhustaff00000000000000"""Allows the user to draw streamlines for given vector data. This supports various types of seed objects (line, sphere, plane and point seeds). It also allows the user to draw ribbons or tubes and further supports different types of interactive modes of calculating the streamlines. """ # Author: Prabhu Ramachandran # Copyright (c) 2005, Enthought, Inc. # License: BSD Style. # Standard library imports. from math import sqrt # Enthought library imports. from traits.api import Instance, Bool, TraitPrefixList, Trait, \ Delegate, Button from traitsui.api import View, Group, Item, InstanceEditor from tvtk.api import tvtk from tvtk.common import configure_outputs # Local imports from mayavi.core.module import Module from mayavi.core.pipeline_info import PipelineInfo from mayavi.components.actor import Actor from mayavi.components.source_widget import SourceWidget ###################################################################### # `Streamline` class. ###################################################################### class Streamline(Module): # The version of this class. Used for persistence. __version__ = 0 # The streamline generator. stream_tracer = Instance(tvtk.StreamTracer, allow_none=False, record=True) # The seed for the streamlines. seed = Instance(SourceWidget, allow_none=False, record=True) # The update mode of the seed -- this is delegated to the # SourceWidget. update_mode = Delegate('seed', modify=True) # Determines if the streamlines are shown as lines or ribbons or # tubes. streamline_type = Trait('line', TraitPrefixList(['line', 'ribbon', 'tube']), desc='draw streamlines as lines/ribbons/tubes') # The ribbon filter. ribbon_filter = Instance(tvtk.RibbonFilter, allow_none=False, record=True) # The tube filter. tube_filter = Instance(tvtk.TubeFilter, allow_none=False, record=True) # The clean poly data filter clean_filter = Instance(tvtk.CleanPolyData, allow_none=False, record=True) # The actor component that represents the visualization. actor = Instance(Actor, allow_none=False, record=True) input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['vectors']) ######################################## # Private traits. _first = Bool(True) ######################################## # View related code. # A button to update the streamlines. update_streamlines = Button('Update Streamlines') _tube_group = Group(Item(name='capping'), Item(name='sides_share_vertices'), Item(name='vary_radius'), Item(name='number_of_sides'), Item(name='radius'), Item(name='radius_factor'), Item(name='offset'), Item(name='on_ratio') ) _ribbon_group = Group(Item(name='vary_width'), Item(name='width'), Item(name='width_factor'), Item(name='angle') ) view = View(Group(Group(Item(name='update_mode'), ), Group(Item(name='update_streamlines'), show_labels=False, ), Group(Item(name='streamline_type'), Item(name='ribbon_filter', style='custom', visible_when='object.streamline_type == "ribbon"', editor=InstanceEditor(view=View(_ribbon_group))), Item(name='tube_filter', style='custom', visible_when='object.streamline_type == "tube"', editor=InstanceEditor(view=View(_tube_group))), show_labels=False, label='Streamline' ), label='Streamline' ), Group(Item(name='seed', style='custom', resizable=True), label='Seed', show_labels=False), Group(Item(name='stream_tracer', style='custom', resizable=True), label='StreamTracer', show_labels=False), Group(Item(name='actor', style='custom'), label='Actor', show_labels=False), resizable=True ) ###################################################################### # `Module` interface ###################################################################### def setup_pipeline(self): """Override this method so that it *creates* the tvtk pipeline. This method is invoked when the object is initialized via `__init__`. Note that at the time this method is called, the tvtk data pipeline will *not* yet be setup. So upstream data will not be available. The idea is that you simply create the basic objects and setup those parts of the pipeline not dependent on upstream sources and filters. You should also set the `actors` attribute up at this point. """ # Create and setup the default objects. self.seed = SourceWidget() self.stream_tracer = tvtk.StreamTracer(maximum_propagation=50, integration_direction='forward', compute_vorticity=True, integrator_type='runge_kutta4', ) self.ribbon_filter = tvtk.RibbonFilter() self.tube_filter = tvtk.TubeFilter() self.clean_filter = tvtk.CleanPolyData() self.actor = Actor() # Setup the actor suitably for this module. self.actor.property.line_width = 2.0 def update_pipeline(self): """Override this method so that it *updates* the tvtk pipeline when data upstream is known to have changed. This method is invoked (automatically) when any of the inputs sends a `pipeline_changed` event. """ mm = self.module_manager if mm is None: return src = mm.source self.configure_connection(self.stream_tracer, src) self.seed.inputs = [src] # Setup the radius/width of the tube/ribbon filters based on # given input. if self._first: b = src.get_output_dataset().bounds l = [(b[1]-b[0]), (b[3]-b[2]), (b[5]-b[4])] length = sqrt(l[0]*l[0] + l[1]*l[1] + l[2]*l[2]) self.ribbon_filter.width = length*0.0075 self.tube_filter.radius = length*0.0075 self._first = False self._streamline_type_changed(self.streamline_type) # Set the LUT for the mapper. self.actor.set_lut(mm.scalar_lut_manager.lut) self.pipeline_changed = True def update_data(self): """Override this method so that it flushes the vtk pipeline if that is necessary. This method is invoked (automatically) when any of the inputs sends a `data_changed` event. """ # Just set data_changed, the components should do the rest if # they are connected. self.data_changed = True ###################################################################### # Non-public methods. ###################################################################### def _streamline_type_changed(self, value): if self.module_manager is None: return st = self.stream_tracer rf = self.ribbon_filter tf = self.tube_filter if value == 'line': configure_outputs(self, st) elif value == 'ribbon': self.configure_connection(rf, st) configure_outputs(self, rf) elif value == 'tube': # Without a clean poly data filter, tube filter will throw could # not generate normals warning cf = self.clean_filter self.configure_connection(cf, st) self.configure_connection(tf, cf) configure_outputs(self, tf) self.render() def _update_streamlines_fired(self): self.seed.update_poly_data() self.stream_tracer.update() self.render() def _stream_tracer_changed(self, old, new): if old is not None: old.on_trait_change(self.render, remove=True) seed = self.seed if seed is not None: self.configure_source_data(new, seed.poly_data) new.on_trait_change(self.render) mm = self.module_manager if mm is not None: src = mm.source self.configure_connection(new, src) # A default output so there are no pipeline errors. The # update_pipeline call corrects this if needed. self.outputs = [new] self.update_pipeline() def _seed_changed(self, old, new): st = self.stream_tracer if st is not None: self.configure_source_data(st, new.poly_data) self._change_components(old, new) def _ribbon_filter_changed(self, old, new): if old is not None: old.on_trait_change(self.render, remove=True) new.on_trait_change(self.render) self._streamline_type_changed(self.streamline_type) def _tube_filter_changed(self, old, new): if old is not None: old.on_trait_change(self.render, remove=True) new.on_trait_change(self.render) self._streamline_type_changed(self.streamline_type) def _actor_changed(self, old, new): new.scene = self.scene new.inputs = [self] self._change_components(old, new) mayavi-4.5.0/mayavi/modules/structured_grid_outline.py0000644000076500000240000000164512747716314023714 0ustar prabhustaff00000000000000"""Draws a grid-conforming outline for structured grids. """ # Author: Prabhu Ramachandran # Copyright (c) 2007, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import Instance from tvtk.api import tvtk # Local imports. from mayavi.components.actor import Actor from mayavi.modules.outline import Outline ###################################################################### # `StructuredGridOutline` class. ###################################################################### class StructuredGridOutline(Outline): """Draws a grid-conforming outline for structured grids. """ # The outline filter. outline_filter = Instance(tvtk.StructuredGridOutlineFilter, allow_none = False, record=True) def setup_pipeline(self): self.outline_filter = tvtk.StructuredGridOutlineFilter() self.actor = Actor() mayavi-4.5.0/mayavi/modules/surface.py0000644000076500000240000001216412747716314020372 0ustar prabhustaff00000000000000"""Draws a surface for any input dataset with optional contouring. """ # Author: Prabhu Ramachandran # Copyright (c) 2005, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import Instance, Bool from tvtk.api import tvtk # Local imports from mayavi.core.pipeline_info import PipelineInfo from mayavi.core.module import Module from mayavi.components.contour import Contour from mayavi.components.actor import Actor ###################################################################### # `Surface` class. ###################################################################### class Surface(Module): # The version of this class. Used for persistence. __version__ = 0 # Specifies if contouring is to be done or not. enable_contours = Bool(False, desc='if contours are generated') # The contour component that contours the data. contour = Instance(Contour, allow_none=False, record=True) # The actor component that represents the visualization. actor = Instance(Actor, allow_none=False, record=True) input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']) ###################################################################### # `Module` interface ###################################################################### def setup_pipeline(self): """Override this method so that it *creates* the tvtk pipeline. This method is invoked when the object is initialized via `__init__`. Note that at the time this method is called, the tvtk data pipeline will *not* yet be setup. So upstream data will not be available. The idea is that you simply create the basic objects and setup those parts of the pipeline not dependent on upstream sources and filters. You should also set the `actors` attribute up at this point. """ # Setup the objects. self.contour = Contour(auto_contours=True, number_of_contours=10) self.actor = Actor() # Setup the actor suitably for this module. self.actor.property.line_width = 2.0 def update_pipeline(self): """Override this method so that it *updates* the tvtk pipeline when data upstream is known to have changed. This method is invoked (automatically) when any of the inputs sends a `pipeline_changed` event. """ mm = self.module_manager if mm is None: return # This makes sure that any changes made to enable_contours # when the module is not running are updated when it is # started. Also sets up the pipeline and inputs correctly. self._enable_contours_changed(self.enable_contours) # Set the LUT for the mapper. self.actor.set_lut(mm.scalar_lut_manager.lut) self.pipeline_changed = True def update_data(self): """Override this method so that it flushes the vtk pipeline if that is necessary. This method is invoked (automatically) when any of the inputs sends a `data_changed` event. """ # Just set data_changed, the components should do the rest if # they are connected. self.data_changed = True ###################################################################### # Non-public methods. ###################################################################### def _filled_contours_changed(self, value): """When filled contours are enabled, the mapper should use the the cell data, otherwise it should use the default scalar mode. """ if value: self.actor.mapper.scalar_mode = 'use_cell_data' else: self.actor.mapper.scalar_mode = 'default' self.render() def _enable_contours_changed(self, value): """Turns on and off the contours.""" if self.module_manager is None: return if value: self.contour.inputs = [self.module_manager.source] self.actor.inputs = [self.contour] if self.contour.filled_contours: self.actor.mapper.scalar_mode = 'use_cell_data' else: old_inputs = self.actor.inputs self.actor.inputs = [self.module_manager.source] self.actor.mapper.scalar_mode = 'default' self.render() def _contour_changed(self, old, new): if old is not None: old.on_trait_change(self._filled_contours_changed, 'filled_contours', remove=True) new.on_trait_change(self._filled_contours_changed, 'filled_contours') self._change_components(old, new) def _actor_changed(self, old, new): if old is None: # First time the actor is set. new.mapper = tvtk.DataSetMapper(use_lookup_table_scalar_range=1) new.scene = self.scene mm = self.module_manager if mm is not None: new.inputs = [mm.source] self._change_components(old, new) mayavi-4.5.0/mayavi/modules/tensor_glyph.py0000644000076500000240000000767112747716314021466 0ustar prabhustaff00000000000000""" Displays tensor glyphs oriented and colored as per scalar or vector data at the input points. """ # Authors: KK Rai (kk.rai [at] iitb.ac.in) # R. Ambareesha (ambareesha [at] iitb.ac.in) # Prabhu Ramachandran # Enthought library imports. from traits.api import Instance from traitsui.api import View, Group, Item # Local imports from mayavi.core.pipeline_info import PipelineInfo from mayavi.core.module import Module from mayavi.components.actor import Actor from mayavi.components import glyph ###################################################################### # `TensorGlyph` class. ###################################################################### class TensorGlyph(Module): # The version of this class. Used for persistence. __version__ = 0 # The glyph component we use to do the actual glyphing. glyph = Instance(glyph.Glyph, allow_none=False, record=True) # The actor. actor = Instance(Actor, allow_none=False, record=True) input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['tensors']) # Create the UI for the traits. view = View(Group(Item(name='actor', style='custom'), show_labels=False, label='Actor'), Group(Item(name='glyph', style='custom', resizable=True), label='Tensor Glyph', selected=True, show_labels=False )) ###################################################################### # `Module` interface ###################################################################### def setup_pipeline(self): """Override this method so that it *creates* the tvtk pipeline. This method is invoked when the object is initialized via `__init__`. Note that at the time this method is called, the tvtk data pipeline will *not* yet be setup. So upstream data will not be available. The idea is that you simply create the basic objects and setup those parts of the pipeline not dependent on upstream sources and filters. You should also set the `actors` attribute up at this point. """ # Setup the glyphs. self.glyph = glyph.Glyph(glyph_type='tensor') self.glyph.glyph_source.glyph_source = self.glyph.glyph_source.glyph_list[4] self.actor = Actor() def update_pipeline(self): """Override this method so that it *updates* the tvtk pipeline when data upstream is known to have changed. This method is invoked (automatically) when any of the inputs sends a `pipeline_changed` event. """ mm = self.module_manager if mm is None: return self.glyph.inputs = [mm.source] self.pipeline_changed = True def update_data(self): """Override this method so that it flushes the vtk pipeline if that is necessary. This method is invoked (automatically) when any of the inputs sends a `data_changed` event. """ # Just set data_changed, the component should do the rest. self.data_changed = True ###################################################################### # Non-public methods. ###################################################################### def _glyph_changed(self, old, new): # Set the glyph's module attribute -- this is important! new.module = self # Setup actors inputs. actor = self.actor if actor is not None: actor.inputs = [new] self._change_components(old, new) def _actor_changed(self, old, new): new.scene = self.scene #new.inputs = [self] g = self.glyph if g is not None: new.inputs = [g] self._change_components(old, new) mayavi-4.5.0/mayavi/modules/text.py0000644000076500000240000002646412747716314017736 0ustar prabhustaff00000000000000"""This module allows the user to place text on the screen. """ # Author: Prabhu Ramachandran # Copyright (c) 2005, Enthought, Inc. # License: BSD Style. from distutils.version import StrictVersion # Enthought library imports. from traits.api import Instance, Range, Str, Bool, Property, \ Float from traitsui.api import View, Group, Item, InstanceEditor from tvtk.api import tvtk from apptools.persistence import state_pickler # Local imports from mayavi.core.module import Module from mayavi.core.pipeline_info import PipelineInfo VTK_VER = StrictVersion(tvtk.Version().vtk_version) ###################################################################### # `Text` class. ###################################################################### class Text(Module): # The version of this class. Used for persistence. __version__ = 0 # The tvtk TextActor. actor = Instance(tvtk.TextActor, allow_none=False, record=True) # The property of the axes (color etc.). property = Property(record=True) # The text to be displayed. Note that this should really be `Str` # but wxGTK only returns unicode. text = Str('Text', desc='the text to be displayed') # The x-position of this actor. x_position = Float(0.0, desc='the x-coordinate of the text') # The y-position of this actor. y_position = Float(0.0, desc='the y-coordinate of the text') # The z-position of this actor. z_position = Float(0.0, desc='the z-coordinate of the text') # Shadow the positions as ranges for 2D. Simply using a RangeEditor # does not work as it resets the 3D positions to 1 when the dialog is # loaded. _x_position_2d = Range(0., 1., 0., enter_set=True, auto_set=False, desc='the x-coordinate of the text') _y_position_2d = Range(0., 1., 0., enter_set=True, auto_set=False, desc='the y-coordinate of the text') # 3D position position_in_3d = Bool(False, desc='whether the position of the object is given in 2D or in 3D') # The width of the text. width = Range(0.0, 1.0, 0.4, enter_set=True, auto_set=False, desc='the width of the text as a fraction of the viewport') input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']) ######################################## # The view of this object. if VTK_VER > '5.1': _text_actor_group = Group(Item(name='visibility'), Item(name='text_scale_mode'), Item(name='alignment_point'), Item(name='minimum_size'), Item(name='maximum_line_height'), show_border=True, label='Text Actor') else: _text_actor_group = Group(Item(name='visibility'), Item(name='scaled_text'), Item(name='alignment_point'), Item(name='minimum_size'), Item(name='maximum_line_height'), show_border=True, label='Text Actor') _position_group_2d = Group(Item(name='_x_position_2d', label='X position'), Item(name='_y_position_2d', label='Y position'), visible_when='not position_in_3d') _position_group_3d = Group(Item(name='x_position', label='X', springy=True), Item(name='y_position', label='Y', springy=True), Item(name='z_position', label='Z', springy=True), show_border=True, label='Position', orientation='horizontal', visible_when='position_in_3d') view = View(Group(Group(Item(name='text'), Item(name='position_in_3d'), _position_group_2d, _position_group_3d, Item(name='width', enabled_when='object.actor.scaled_text'), ), Group(Item(name='actor', style='custom', editor=\ InstanceEditor(view=View(_text_actor_group)) ), show_labels=False), label='TextActor', show_labels=False ), Group(Item(name='_property', style='custom', resizable=True), label='TextProperty', show_labels=False), ) ######################################## # Private traits. _updating = Bool(False) _property = Instance(tvtk.TextProperty) ###################################################################### # `object` interface ###################################################################### def __set_pure_state__(self, state): self._updating = True state_pickler.set_state(self, state, first=['actor'], ignore=['_updating']) self._updating = False ###################################################################### # `Module` interface ###################################################################### def setup_pipeline(self): """Override this method so that it *creates* the tvtk pipeline. This method is invoked when the object is initialized via `__init__`. Note that at the time this method is called, the tvtk data pipeline will *not* yet be setup. So upstream data will not be available. The idea is that you simply create the basic objects and setup those parts of the pipeline not dependent on upstream sources and filters. You should also set the `actors` attribute up at this point. """ actor = self.actor = tvtk.TextActor(input=str(self.text)) if VTK_VER > '5.1': actor.set(text_scale_mode='prop', width=0.4, height=1.0) else: actor.set(scaled_text=True, width=0.4, height=1.0) c = actor.position_coordinate c.set(coordinate_system='normalized_viewport', value=(self.x_position, self.y_position, 0.0)) c = actor.position2_coordinate c.set(coordinate_system='normalized_viewport') self._property.opacity = 1.0 self._text_changed(self.text) self._width_changed(self.width) self._shadow_positions(True) def update_pipeline(self): """Override this method so that it *updates* the tvtk pipeline when data upstream is known to have changed. This method is invoked (automatically) when any of the inputs sends a `pipeline_changed` event. """ self.pipeline_changed = True def update_data(self): """Override this method so that it flushes the vtk pipeline if that is necessary. This method is invoked (automatically) when any of the inputs sends a `data_changed` event. """ # Just set data_changed, the component should do the rest. self.data_changed = True ###################################################################### # Non-public interface ###################################################################### def _text_changed(self, value): actor = self.actor if actor is None: return if self._updating: return actor.input = str(value) self.render() def _shadow_positions(self, value): self.sync_trait('x_position', self, '_x_position_2d', remove=(not value)) self.sync_trait('y_position', self, '_y_position_2d', remove=(not value)) if not value: self._x_position_2d = self.x_position self._y_position_2d = self.y_position def _position_in_3d_changed(self, value): if value: self.actor.position_coordinate.coordinate_system='world' self.actor.position2_coordinate.coordinate_system='world' else: self.actor.position2_coordinate.coordinate_system=\ 'normalized_viewport' self.actor.position_coordinate.coordinate_system=\ 'normalized_viewport' x = self.x_position y = self.y_position if x < 0: x = 0 elif x > 1: x = 1 if y < 0: y = 0 elif y > 1: y = 1 self.set(x_position=x, y_position=y, trait_change_notify=False) self._shadow_positions(not value) self._change_position() self.actor._width_changed(self.width, self.width) self.pipeline_changed = True def _change_position(self): """ Callback for _x_position, _y_position, and z_position. """ actor = self.actor if actor is None: return if self._updating: return x = self.x_position y = self.y_position z = self.z_position if self.position_in_3d: actor.position_coordinate.value = x, y, z else: actor.position = x, y self.render() _x_position_changed = _change_position _y_position_changed = _change_position _z_position_changed = _change_position def _width_changed(self, value): actor = self.actor if actor is None: return if self._updating: return actor.width = value self.render() def _update_traits(self): self._updating = True try: actor = self.actor self.text = actor.input pos = actor.position self.x_position, self.y_position = pos self.width = actor.width finally: self._updating = False def _get_property(self): return self._property def _actor_changed(self, old, new): if old is not None: for obj in (old, self._property): obj.on_trait_change(self.render, remove=True) old.on_trait_change(self._update_traits, remove=True) self._property = new.text_property for obj in (new, self._property): obj.on_trait_change(self.render) new.on_trait_change(self._update_traits) self.actors = [new] self.render() def _foreground_changed_for_scene(self, old, new): # Change the default color for the actor. self.property.color = new self.render() def _scene_changed(self, old, new): super(Text, self)._scene_changed(old, new) self._foreground_changed_for_scene(None, new.foreground) mayavi-4.5.0/mayavi/modules/text3d.py0000644000076500000240000001451412747716314020156 0ustar prabhustaff00000000000000""" This module allows the user to place text in 3D at a location on the scene. Unlike the 'Text' module, this module positions text in 3D in the scene, and in 2D on the screen. As a result the text resizes with the figure, and can be masked by objects in the foreground. """ # Author: Gael Varoquaux # Copyright (c) 2009, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import Instance, Str, CArray, Bool from traitsui.api import View, Group, Item # Local imports from tvtk.api import tvtk from mayavi.core.module import Module from mayavi.core.pipeline_info import PipelineInfo from mayavi.components.actor import Actor ###################################################################### # `Text3D` class. ###################################################################### class Text3D(Module): # The version of this class. Used for persistence. __version__ = 0 # The Mayavi Actor. actor = Instance(Actor, allow_none=False, record=True) # And the text source vector_text = Instance(tvtk.VectorText, allow_none=False, record=True) # The text to be displayed. text = Str('Text', desc='the text to be displayed', enter_set=True, auto_set=False) # The position of the actor position = CArray(value=(0., 0., 0.), cols=3, desc='the world coordinates of the text', enter_set=True, auto_set=False) # The scale of the actor scale = CArray(value=(1., 1., 1.), cols=3, desc='the scale of the text', enter_set=True, auto_set=False) # The orientation of the actor orientation = CArray(value=(0., 0., 0.), cols=3, desc='the orientation angles of the text', enter_set=True, auto_set=False) # Orient actor to camera orient_to_camera = Bool(True, desc='if the text is kept facing the camera') input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']) ######################################## # The view of this object. view = View(Group(Item(name='text'), Group(Item(name='position'), show_labels=False, show_border=True, label='Position'), Group(Item(name='scale'), show_labels=False, show_border=True, label='Scale'), Group( Item(name='orient_to_camera'), Item(name='orientation', label='Angles'), show_border=True, label='Orientation'), label='Text', ), Group(Item(name='actor', style='custom', show_label=False), label='Actor'), ) ###################################################################### # `Module` interface ###################################################################### def setup_pipeline(self): """Override this method so that it *creates* the tvtk pipeline. This method is invoked when the object is initialized via `__init__`. Note that at the time this method is called, the tvtk data pipeline will *not* yet be setup. So upstream data will not be available. The idea is that you simply create the basic objects and setup those parts of the pipeline not dependent on upstream sources and filters. You should also set the `actors` attribute up at this point. """ self.vector_text = tvtk.VectorText(text=self.text) self.outputs = [self.vector_text.output] self.actor = Actor() self._text_changed(self.text) def update_pipeline(self): """Override this method so that it *updates* the tvtk pipeline when data upstream is known to have changed. This method is invoked (automatically) when any of the inputs sends a `pipeline_changed` event. """ self.pipeline_changed = True def has_output_port(self): """ Return True as the text3d has output port. """ return True def get_output_object(self): return self.vector_text.output_port ###################################################################### # Non-public interface ###################################################################### def _text_changed(self, value): vector_text = self.vector_text if vector_text is None: return vector_text.text = str(value) self.render() def _actor_changed(self, old, new): new.scene = self.scene new.inputs = [self] self._change_components(old, new) old_actor = None if old is not None: old_actor = old.actor new.actor = self._get_actor_or_follower(old=old_actor) self.actors = new.actors self.render() def _orient_to_camera_changed(self): self.actor.actor = \ self._get_actor_or_follower(old=self.actor.actor) def _get_actor_or_follower(self, old=None): """ Get a tvtk.Actor or a tvtk.Follower for the actor of the object and wire the callbacks to it. If old is given, it is the old actor, to remove its callbacks. """ if self.orient_to_camera: new = tvtk.Follower() if self.scene is not None: new.camera = self.scene.camera else: new = tvtk.Actor() if old is not None: self.sync_trait('position', old, 'position', remove=True) self.sync_trait('scale', old, 'scale', remove=True) self.sync_trait('orientation', old, 'orientation', remove=True) self.sync_trait('position', new, 'position') self.sync_trait('scale', new, 'scale') self.sync_trait('orientation', new, 'orientation') return new def _scene_changed(self, old, new): super(Text3D, self)._scene_changed(old, new) if new is not None and self.orient_to_camera: self.actor.actor.camera = new.camera mayavi-4.5.0/mayavi/modules/ui/0000755000076500000240000000000012747722127017000 5ustar prabhustaff00000000000000mayavi-4.5.0/mayavi/modules/ui/__init__.py0000644000076500000240000000013212747716314021106 0ustar prabhustaff00000000000000# Author: Judah De Paula # Copyright (c) 2005-2008, Enthought, Inc. # License: BSD Style. mayavi-4.5.0/mayavi/modules/ui/iso_surface.py0000644000076500000240000000365112747716314021662 0ustar prabhustaff00000000000000""" Traits View definition file. The view trait of the parent class has been extracted from the model definition file. This file can either be exec()ed or imported. See core/base.py:Base.trait_view() for what is currently used. Using exec() allows view changes without needing to restart Mayavi, but is slower than importing. """ # Authors: Prabhu Ramachandran # Judah De Paula # Copyright (c) 2005-2008, Enthought, Inc. # License: BSD Style. from traitsui.api import Item, Group, View, InstanceEditor from mayavi.components.ui.actor import actor_view, texture_view view = View(Group( Group( Item( name = 'contour', style = 'custom' ), show_labels = False, show_border = True, label = 'Contours' ), Group( Item( name = 'compute_normals' ), Item( name = 'normals', style = 'custom', show_label = False, enabled_when = 'compute_normals' ), show_border = True, label = 'Normals' ), label='Contours', ), Group(Item('actor', resizable=True, style='custom', editor=InstanceEditor(view=actor_view) ), label='Actor', show_labels=False, ), Group(Item('actor', resizable=True, style='custom', editor=InstanceEditor(view=texture_view) ), label='Texturing', show_labels=False, ), resizable=True ) mayavi-4.5.0/mayavi/modules/ui/surface.py0000644000076500000240000000313712747716314021007 0ustar prabhustaff00000000000000""" Traits View definition file. The view trait of the parent class is extracted from the model definition file. This file can either be exec()ed or imported. See core/base.py:Base.trait_view() for what is currently used. Using exec() allows view changes without needing to restart Mayavi, but is slower than importing. """ # Authors: Prabhu Ramachandran # Judah De Paula # Copyright (c) 2005-2008, Enthought, Inc. # License: BSD Style. from traitsui.api import Item, Group, View, InstanceEditor from mayavi.components.ui.actor import actor_view, texture_view view = View( Group(Item(name='enable_contours', label='Enable Contours'), Group(Item(name='contour', style='custom', enabled_when='object.enable_contours' ), show_labels=False, ), show_labels=True, label='Contours' ), Group(Item('actor', resizable=True, style='custom', editor=InstanceEditor(view=actor_view) ), label='Actor', show_labels=False, ), Group(Item('actor', resizable=True, style='custom', editor=InstanceEditor(view=texture_view) ), label='Texturing', show_labels=False, ), ) mayavi-4.5.0/mayavi/modules/vector_cut_plane.py0000644000076500000240000001444112747716314022276 0ustar prabhustaff00000000000000"""Takes an arbitrary slice of the input data using an implicit cut plane and places glyphs according to the vector field data. The glyphs may be colored using either the vector magnitude or the scalar attributes. """ # Author: Prabhu Ramachandran # Copyright (c) 2005, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import Instance from traitsui.api import View, Group, Item # Local imports from mayavi.core.pipeline_info import PipelineInfo from mayavi.core.module import Module from mayavi.components.implicit_plane import ImplicitPlane from mayavi.components.cutter import Cutter from mayavi.components.glyph import Glyph from mayavi.components.actor import Actor ###################################################################### # `VectorCutPlane` class. ###################################################################### class VectorCutPlane(Module): # The version of this class. Used for persistence. __version__ = 0 # The implicit plane widget used to place the implicit function. implicit_plane = Instance(ImplicitPlane, allow_none=False, record=True) # The cutter. Takes a cut of the data on the implicit plane. cutter = Instance(Cutter, allow_none=False, record=True) # The Glyph component. glyph = Instance(Glyph, allow_none=False, record=True) # The Glyph component. actor = Instance(Actor, allow_none=False, record=True) input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['vectors']) ######################################## # View related traits. view = View(Group(Item(name='implicit_plane', style='custom'), label='ImplicitPlane', show_labels=False), Group(Item(name='glyph', style='custom', resizable=True), label='Glyph', show_labels=False), Group(Item(name='actor', style='custom'), label='Actor', show_labels=False), ) ###################################################################### # `Module` interface ###################################################################### def setup_pipeline(self): """Override this method so that it *creates* the tvtk pipeline. This method is invoked when the object is initialized via `__init__`. Note that at the time this method is called, the tvtk data pipeline will *not* yet be setup. So upstream data will not be available. The idea is that you simply create the basic objects and setup those parts of the pipeline not dependent on upstream sources and filters. You should also set the `actors` attribute up at this point. """ # Create the objects and set them up. self.implicit_plane = ImplicitPlane() self.cutter = Cutter() self.glyph = Glyph(module=self, scale_mode='scale_by_vector', color_mode='color_by_vector', show_scale_mode=False) self.glyph.glyph_source.glyph_position='tail' actor = self.actor = Actor() actor.mapper.scalar_visibility = 1 actor.property.set(line_width=2, backface_culling=False, frontface_culling=False) def update_pipeline(self): """Override this method so that it *updates* the tvtk pipeline when data upstream is known to have changed. This method is invoked (automatically) when any of the inputs sends a `pipeline_changed` event. """ mm = self.module_manager if mm is None: return self.implicit_plane.inputs = [mm.source] # Set the LUT for the mapper. self._color_mode_changed(self.glyph.color_mode) self.pipeline_changed = True def update_data(self): """Override this method so that it flushes the vtk pipeline if that is necessary. This method is invoked (automatically) when any of the inputs sends a `data_changed` event. """ # Just set data_changed, the other components should do the rest. self.data_changed = True ###################################################################### # Non-public traits. ###################################################################### def _color_mode_changed(self, value): # This is a listner for the glyph component's color_mode trait # so that the the lut can be changed when the a different # color mode is requested. actor = self.actor if value == 'color_by_scalar': actor.mapper.scalar_visibility = 1 lut_mgr = self.module_manager.scalar_lut_manager actor.set_lut(lut_mgr.lut) elif value == 'color_by_vector': lut_mgr = self.module_manager.vector_lut_manager actor.set_lut(lut_mgr.lut) else: actor.mapper.scalar_visibility = 0 self.render() def _implicit_plane_changed(self, old, new): cutter = self.cutter if cutter is not None: cutter.cut_function = new.plane cutter.inputs = [new] self._change_components(old, new) def _cutter_changed(self, old, new): ip = self.implicit_plane if ip is not None: new.cut_function = ip.plane new.inputs = [ip] g = self.glyph if g is not None: g.inputs = [new] self._change_components(old, new) def _glyph_changed(self, old, new): if old is not None: old.on_trait_change(self._color_mode_changed, 'color_mode', remove=True) new.module = self cutter = self.cutter if cutter: new.inputs = [cutter] new.on_trait_change(self._color_mode_changed, 'color_mode') self._change_components(old, new) def _actor_changed(self, old, new): new.scene = self.scene glyph = self.glyph if glyph is not None: new.inputs = [glyph] self._change_components(old, new) mayavi-4.5.0/mayavi/modules/vectors.py0000644000076500000240000000174612747716314020433 0ustar prabhustaff00000000000000"""Displays different types of glyphs oriented and colored as per vector data at the input points. This is merely a convenience module that is entirely based on the Glyph module. """ # Author: Prabhu Ramachandran # Copyright (c) 2005, Enthought, Inc. # License: BSD Style. # Local imports from mayavi.modules.glyph import Glyph ###################################################################### # `Vectors` class. ###################################################################### class Vectors(Glyph): ###################################################################### # `Module` interface ###################################################################### def setup_pipeline(self): super(Vectors, self).setup_pipeline() self.glyph.set(scale_mode='scale_by_vector', color_mode='color_by_vector', show_scale_mode=False) self.glyph.glyph_source.glyph_position='tail' mayavi-4.5.0/mayavi/modules/volume.py0000644000076500000240000004436112747716314020255 0ustar prabhustaff00000000000000"""The Volume module visualizes scalar fields using volumetric visualization techniques. This supports ImageData and UnstructuredGrid data. It also supports the FixedPointRenderer for ImageData. However, the performance is slow so your best bet is probably with the ImageData based renderers. """ # Author: Prabhu Ramachandran # Copyright (c) 2006, Enthought, Inc. # License: BSD Style. # Standard imports from math import cos, sqrt, pi from vtk.util import vtkConstants # Enthought library imports. from traits.api import Instance, Property, List, ReadOnly, \ Str, Button, Tuple from traitsui.api import View, Group, Item, InstanceEditor from tvtk.api import tvtk from tvtk.util.gradient_editor import hsva_to_rgba, GradientTable from tvtk.util.traitsui_gradient_editor import VolumePropertyEditor from tvtk.util.ctf import save_ctfs, load_ctfs, \ rescale_ctfs, set_lut, PiecewiseFunction, ColorTransferFunction from apptools.persistence import state_pickler # Local imports from mayavi.core.pipeline_info import PipelineInfo from mayavi.core.module import Module from mayavi.core.common import error from mayavi.core.trait_defs import DEnum from mayavi.core.lut_manager import LUTManager ###################################################################### # Utility functions. ###################################################################### def is_volume_pro_available(): """Returns `True` if there is a volume pro card available. """ try: map = tvtk.VolumeProMapper() except AttributeError: return False else: return map.number_of_boards > 0 def find_volume_mappers(): res = [] for name in dir(tvtk): if 'Volume' in name and 'Mapper' in name and 'OpenGL' not in name: try: klass = getattr(tvtk, name) inst = klass() except TypeError: pass else: res.append(name) ignores = ['VolumeTextureMapper3D', 'VolumeProMapper'] for name in ignores: if name in res: res.remove(name) return res def default_OTF(x1, x2): """Creates a default opacity transfer function. """ maxs = max(x1, x2) mins = min(x1, x2) otf = PiecewiseFunction() otf.add_point(mins, 0.0) otf.add_point(maxs, 0.2) return otf def make_CTF(x1, x2, hue_range=(2.0/3.0, 0.0), sat_range=(1.0, 1.0), val_range=(1.0, 1.0), n=10, mode='sqrt'): """Creates a CTF as per given arguments. Lets one set a hue, saturation and value range. The mode can be one of 'sqrt', or 'linear'. The idea of this function is to create a CTF that is similar to the LUT being used. 's_curve' is not implemented. Patches welcome. """ maxs = max(x1, x2) mins = min(x1, x2) ds = maxs - mins dhue = hue_range[1] - hue_range[0] dsat = sat_range[1] - sat_range[0] dval = val_range[1] - val_range[0] ctf = ColorTransferFunction() try: ctf.range = (mins, maxs) except Exception: # VTK versions < 5.2 don't seem to need this. pass if mode == 'sqrt': for i in range(n+1): # Generate x in [0, 1] x = 0.5*(1.0 + cos((n-i)*pi/n)) # Chebyshev nodes. h = hue_range[0] + dhue*x s = sat_range[0] + dsat*x v = val_range[0] + dval*x r, g, b, a = [sqrt(c) for c in hsva_to_rgba(h, s, v, 1.0)] ctf.add_rgb_point(mins+x*ds, r, g, b) elif mode == 'linear': for i in range(n+1): # Generate x in [0, 1] x = float(i)/n # Uniform nodes. h = hue_range[0] + dhue*x s = sat_range[0] + dsat*x v = val_range[0] + dval*x r, g, b, a = hsva_to_rgba(h, s, v, 1.0) ctf.add_rgb_point(mins+x*ds, r, g, b) return ctf def default_CTF(x1, x2): """Creates a default RGB color transfer function. In this case we default to a red-blue one with the 'sqrt' mode. """ return make_CTF(x1, x2, hue_range=(2.0/3.0, 0.0), sat_range=(1.0, 1.0), val_range=(1.0, 1.0), n=10, mode='sqrt') def load_volume_prop_from_grad(grad_file_name, volume_prop, scalar_range=(0, 255)): """Load a ``*.grad`` file (*grad_file_name*) and set the given volume property (*volume_prop*) given the *scalar_range*. """ gt = GradientTable(300) gt.load(grad_file_name) gt.store_to_vtk_volume_prop(volume_prop, scalar_range) def save_volume_prop_to_grad(volume_prop, grad_file_name): """Save the given volume property (*volume_prop*) to a ``*.grad`` file given as *grad_file_name*. """ gt = GradientTable(300) gt.load_from_vtk_volume_prop(volume_prop) gt.save(grad_file_name) ###################################################################### # `VolumeLutManager` class. ###################################################################### class VolumeLUTManager(LUTManager): """Just has a different view than the LUTManager. """ view = View(Group(Item(name='show_scalar_bar'), Item(name='number_of_labels'), Item(name='shadow'), Item(name='use_default_name'), Item(name='data_name'), label='Scalar Bar', ), Group(Item(name='_title_text_property', style='custom', resizable=True), show_labels=False, label='Title'), Group(Item(name='_label_text_property', style='custom', resizable=True), show_labels=False, label='Labels'), resizable=True ) ###################################################################### # `Volume` class. ###################################################################### class Volume(Module): """The Volume module visualizes scalar fields using volumetric visualization techniques. This supports ImageData and UnstructuredGrid data. It also supports the FixedPointRenderer for ImageData. However, the performance is slow so your best bet is probably with the ImageData based renderers. """ # The version of this class. Used for persistence. __version__ = 0 volume_mapper_type = DEnum(values_name='_mapper_types', desc='volume mapper to use') ray_cast_function_type = DEnum(values_name='_ray_cast_functions', desc='Ray cast function to use') volume = ReadOnly volume_mapper = Property(record=True) volume_property = Property(record=True) ray_cast_function = Property(record=True) lut_manager = Instance(VolumeLUTManager, args=(), allow_none=False, record=True) input_info = PipelineInfo(datasets=['image_data', 'unstructured_grid'], attribute_types=['any'], attributes=['scalars']) ######################################## # View related code. update_ctf = Button('Update CTF') view = View(Group(Item(name='_volume_property', style='custom', editor=VolumePropertyEditor, resizable=True), Item(name='update_ctf'), label='CTF', show_labels=False), Group(Item(name='volume_mapper_type'), Group(Item(name='_volume_mapper', style='custom', resizable=True), show_labels=False ), Item(name='ray_cast_function_type'), Group(Item(name='_ray_cast_function', enabled_when='len(_ray_cast_functions) > 0', style='custom', resizable=True), show_labels=False), label='Mapper', ), Group(Item(name='_volume_property', style='custom', resizable=True), label='Property', show_labels=False), Group(Item(name='volume', style='custom', editor=InstanceEditor(), resizable=True), label='Volume', show_labels=False), Group(Item(name='lut_manager', style='custom', resizable=True), label='Legend', show_labels=False), resizable=True ) ######################################## # Private traits _volume_mapper = Instance(tvtk.AbstractVolumeMapper) _volume_property = Instance(tvtk.VolumeProperty) _ray_cast_function = Instance(tvtk.Object) _mapper_types = List(Str, ['TextureMapper2D', 'RayCastMapper', ]) _available_mapper_types = List(Str) _ray_cast_functions = List(Str) current_range = Tuple # The color transfer function. _ctf = Instance(ColorTransferFunction) # The opacity values. _otf = Instance(PiecewiseFunction) ###################################################################### # `object` interface ###################################################################### def __get_pure_state__(self): d = super(Volume, self).__get_pure_state__() d['ctf_state'] = save_ctfs(self._volume_property) for name in ('current_range', '_ctf', '_otf'): d.pop(name, None) return d def __set_pure_state__(self, state): self.volume_mapper_type = state['_volume_mapper_type'] state_pickler.set_state(self, state, ignore=['ctf_state']) ctf_state = state['ctf_state'] ctf, otf = load_ctfs(ctf_state, self._volume_property) self._ctf = ctf self._otf = otf self._update_ctf_fired() ###################################################################### # `Module` interface ###################################################################### def start(self): super(Volume, self).start() self.lut_manager.start() def stop(self): super(Volume, self).stop() self.lut_manager.stop() def setup_pipeline(self): """Override this method so that it *creates* the tvtk pipeline. """ v = self.volume = tvtk.Volume() vp = self._volume_property = tvtk.VolumeProperty() self._ctf = ctf = default_CTF(0, 255) self._otf = otf = default_OTF(0, 255) vp.set_color(ctf) vp.set_scalar_opacity(otf) vp.shade = True vp.interpolation_type = 'linear' v.property = vp v.on_trait_change(self.render) vp.on_trait_change(self.render) available_mappers = find_volume_mappers() if is_volume_pro_available(): self._mapper_types.append('VolumeProMapper') available_mappers.append('VolumeProMapper') self._available_mapper_types = available_mappers if 'FixedPointVolumeRayCastMapper' in available_mappers: self._mapper_types.append('FixedPointVolumeRayCastMapper') self.actors.append(v) def update_pipeline(self): """Override this method so that it *updates* the tvtk pipeline when data upstream is known to have changed. This method is invoked (automatically) when any of the inputs sends a `pipeline_changed` event. """ mm = self.module_manager if mm is None: return dataset = mm.source.get_output_dataset() ug = hasattr(tvtk, 'UnstructuredGridVolumeMapper') if ug: if not dataset.is_a('vtkImageData') \ and not dataset.is_a('vtkUnstructuredGrid'): error('Volume rendering only works with '\ 'StructuredPoints/ImageData/UnstructuredGrid datasets') return elif not dataset.is_a('vtkImageData'): error('Volume rendering only works with '\ 'StructuredPoints/ImageData datasets') return self._setup_mapper_types() self._setup_current_range() self._volume_mapper_type_changed(self.volume_mapper_type) self._update_ctf_fired() self.pipeline_changed = True def update_data(self): """Override this method so that it flushes the vtk pipeline if that is necessary. This method is invoked (automatically) when any of the inputs sends a `data_changed` event. """ self._setup_mapper_types() self._setup_current_range() self._update_ctf_fired() self.data_changed = True ###################################################################### # Non-public methods. ###################################################################### def _setup_mapper_types(self): """Sets up the mapper based on input data types. """ dataset = self.module_manager.source.get_output_dataset() if dataset.is_a('vtkUnstructuredGrid'): if hasattr(tvtk, 'UnstructuredGridVolumeMapper'): check = ['UnstructuredGridVolumeZSweepMapper', 'UnstructuredGridVolumeRayCastMapper', ] mapper_types = [] for mapper in check: if mapper in self._available_mapper_types: mapper_types.append(mapper) if len(mapper_types) == 0: mapper_types = [''] self._mapper_types = mapper_types return else: if dataset.point_data.scalars.data_type not in \ [vtkConstants.VTK_UNSIGNED_CHAR, vtkConstants.VTK_UNSIGNED_SHORT]: if 'FixedPointVolumeRayCastMapper' \ in self._available_mapper_types: self._mapper_types = ['FixedPointVolumeRayCastMapper'] else: error('Available volume mappers only work with \ unsigned_char or unsigned_short datatypes') else: mapper_types = ['TextureMapper2D', 'RayCastMapper'] check = ['FixedPointVolumeRayCastMapper', 'VolumeProMapper' ] for mapper in check: if mapper in self._available_mapper_types: mapper_types.append(mapper) self._mapper_types = mapper_types def _setup_current_range(self): mm = self.module_manager # Set the default name and range for our lut. lm = self.lut_manager slm = mm.scalar_lut_manager lm.set(default_data_name=slm.default_data_name, default_data_range=slm.default_data_range) # Set the current range. dataset = mm.source.get_output_dataset() sc = dataset.point_data.scalars if sc is not None: rng = sc.range else: error('No scalars in input data!') rng = (0, 255) if self.current_range != rng: self.current_range = rng def _get_volume_mapper(self): return self._volume_mapper def _get_volume_property(self): return self._volume_property def _get_ray_cast_function(self): return self._ray_cast_function def _volume_mapper_type_changed(self, value): mm = self.module_manager if mm is None: return old_vm = self._volume_mapper if old_vm is not None: old_vm.on_trait_change(self.render, remove=True) if value == 'RayCastMapper': new_vm = tvtk.VolumeRayCastMapper() self._volume_mapper = new_vm self._ray_cast_functions = ['RayCastCompositeFunction', 'RayCastMIPFunction', 'RayCastIsosurfaceFunction'] new_vm.volume_ray_cast_function = tvtk.VolumeRayCastCompositeFunction() elif value == 'TextureMapper2D': new_vm = tvtk.VolumeTextureMapper2D() self._volume_mapper = new_vm self._ray_cast_functions = [''] elif value == 'VolumeProMapper': new_vm = tvtk.VolumeProMapper() self._volume_mapper = new_vm self._ray_cast_functions = [''] elif value == 'FixedPointVolumeRayCastMapper': new_vm = tvtk.FixedPointVolumeRayCastMapper() self._volume_mapper = new_vm self._ray_cast_functions = [''] elif value == 'UnstructuredGridVolumeRayCastMapper': new_vm = tvtk.UnstructuredGridVolumeRayCastMapper() self._volume_mapper = new_vm self._ray_cast_functions = [''] elif value == 'UnstructuredGridVolumeZSweepMapper': new_vm = tvtk.UnstructuredGridVolumeZSweepMapper() self._volume_mapper = new_vm self._ray_cast_functions = [''] src = mm.source self.configure_connection(new_vm, src) self.volume.mapper = new_vm new_vm.on_trait_change(self.render) def _update_ctf_fired(self): set_lut(self.lut_manager.lut, self._volume_property) self.render() def _current_range_changed(self, old, new): rescale_ctfs(self._volume_property, new) self.render() def _ray_cast_function_type_changed(self, old, new): rcf = self.ray_cast_function if len(old) > 0: rcf.on_trait_change(self.render, remove=True) if len(new) > 0: new_rcf = getattr(tvtk, 'Volume%s'%new)() new_rcf.on_trait_change(self.render) self._volume_mapper.volume_ray_cast_function = new_rcf self._ray_cast_function = new_rcf else: self._ray_cast_function = None self.render() def _scene_changed(self, old, new): super(Volume, self)._scene_changed(old, new) self.lut_manager.scene = new mayavi-4.5.0/mayavi/modules/warp_vector_cut_plane.py0000644000076500000240000001632412747716314023331 0ustar prabhustaff00000000000000# -*- coding: UTF-8 -*- """Takes an arbitrary slice of the input data using an implicit cut plane and warps it according to the vector field data. The scalars are displayed on the warped surface as colors. """ # Authors: Fr�d�ric Petit and Prabhu Ramachandran # Copyright (c) 2006, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import Instance, Bool from traitsui.api import View, Group, Item, InstanceEditor from tvtk.api import tvtk # Local imports from mayavi.core.pipeline_info import PipelineInfo from mayavi.core.module import Module from mayavi.components.implicit_plane import ImplicitPlane from mayavi.components.cutter import Cutter from mayavi.filters.warp_vector import WarpVector from mayavi.components.poly_data_normals import PolyDataNormals from mayavi.components.actor import Actor ###################################################################### # `VectorCutPlane` class. ###################################################################### class WarpVectorCutPlane(Module): # The version of this class. Used for persistence. __version__ = 0 # The implicit plane widget used to place the implicit function. implicit_plane = Instance(ImplicitPlane, allow_none=False, record=True) # The cutter. Takes a cut of the data on the implicit plane. cutter = Instance(Cutter, allow_none=False, record=True) # The WarpVectorCutPlane component that warps the data. warp_vector = Instance(WarpVector, allow_none=False, record=True) # Specify if vector normals are to be computed to make a smoother surface. compute_normals = Bool(False, desc='if normals are to be computed '\ 'to make the warped surface smoother') # The component that computes the normals. normals = Instance(PolyDataNormals, record=True) # The Actor component. actor = Instance(Actor, allow_none=False, record=True) input_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['vectors']) ######################################## # View related traits. _warp_group = Group(Item(name='filter', style='custom', editor=\ InstanceEditor(view= View(Item('scale_factor')))), show_labels=False) view = View(Group(Item(name='implicit_plane', style='custom'), label='ImplicitPlane', show_labels=False), Group(Group(Item(name='warp_vector', style='custom', resizable=True, show_label=False, editor=InstanceEditor(view=View(_warp_group)) ), ), Item(name='_'), Item(name='compute_normals'), Group(Item(name='normals', style='custom', show_label=False, enabled_when = 'compute_normals'), ), label='WarpVector', show_labels=True), Group(Item(name='actor', style='custom'), label='Actor', show_labels=False), resizable=True, ) ###################################################################### # `Module` interface ###################################################################### def setup_pipeline(self): """Override this method so that it *creates* the tvtk pipeline. This method is invoked when the object is initialized via `__init__`. Note that at the time this method is called, the tvtk data pipeline will *not* yet be setup. So upstream data will not be available. The idea is that you simply create the basic objects and setup those parts of the pipeline not dependent on upstream sources and filters. You should also set the `actors` attribute up at this point. """ # Create the objects and set them up. self.implicit_plane = ImplicitPlane() self.cutter = Cutter() self.warp_vector = WarpVector() self.normals = PolyDataNormals() actor = self.actor = Actor() actor.mapper.scalar_visibility = 1 def update_pipeline(self): """Override this method so that it *updates* the tvtk pipeline when data upstream is known to have changed. This method is invoked (automatically) when any of the inputs sends a `pipeline_changed` event. """ mm = self.module_manager if mm is None: return self.implicit_plane.inputs = [mm.source] # Force the vector normals setting to be noted. self._compute_normals_changed(self.compute_normals) # Set the LUT for the mapper. self.actor.set_lut(mm.scalar_lut_manager.lut) self.pipeline_changed = True def update_data(self): """Override this method so that it flushes the vtk pipeline if that is necessary. This method is invoked (automatically) when any of the inputs sends a `data_changed` event. """ # Just set data_changed, the other components should do the rest. self.data_changed = True ###################################################################### # Non-public traits. ###################################################################### def _compute_normals_changed(self, value): if self.module_manager is None: return actor = self.actor if actor is not None: if value: actor.inputs = [self.normals] else: actor.inputs = [self.warp_vector] self.render() def _normals_changed(self, old, new): warp_vector = self.warp_vector compute_normals = self.compute_normals if compute_normals is not None: new.inputs = [warp_vector] self._compute_normals_changed(self.compute_normals) self._change_components(old, new) def _implicit_plane_changed(self, old, new): cutter = self.cutter if cutter is not None: cutter.cut_function = new.plane cutter.inputs = [new] self._change_components(old, new) def _warp_vector_changed(self, old, new): cutter = self.cutter if cutter is not None: new.inputs = [cutter] self._compute_normals_changed(self.compute_normals) self._change_components(old, new) def _cutter_changed(self, old, new): ip = self.implicit_plane if ip is not None: new.cut_function = ip.plane new.inputs = [ip] w = self.warp_vector if w is not None: w.inputs = [new] self._change_components(old, new) def _actor_changed(self, old, new): self._compute_normals_changed(self.compute_normals) self._change_components(old, new) mayavi-4.5.0/mayavi/plugins/0000755000076500000240000000000012747722127016374 5ustar prabhustaff00000000000000mayavi-4.5.0/mayavi/plugins/__init__.py0000644000076500000240000000013212747716314020502 0ustar prabhustaff00000000000000# Author: Prabhu Ramachandran # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. mayavi-4.5.0/mayavi/plugins/app.py0000644000076500000240000002111212747716314017524 0ustar prabhustaff00000000000000"""The Mayavi Envisage application. """ # Author: Prabhu Ramachandran # Copyright (c) 2008-2015, Enthought, Inc. # License: BSD Style. # Standard library imports. import sys import os.path import logging # Enthought library imports. from apptools.logger.api import LogFileHandler, FORMATTER from traits.etsconfig.api import ETSConfig from traits.api import (HasTraits, Instance, Int, on_trait_change, Bool) # Local imports. from .mayavi_workbench_application import MayaviWorkbenchApplication from mayavi.preferences.api import preference_manager from mayavi.core.customize import get_custom_plugins # GLOBALS logger = logging.getLogger() ###################################################################### # Useful functions. ###################################################################### def setup_logger(logger, fname, stream=True, mode=logging.ERROR): """Setup a log file and the logger. If the given file name is not absolute, put the log file in `ETSConfig.application_home`, if not it will create it where desired. Parameters: ----------- fname -- file name the logger should use. If this is an absolute path it will create the log file as specified, if not it will put it in `ETSConfig.application_home`. stream -- Add a stream handler. mode -- the logging mode of the stream handler. """ if not os.path.isabs(fname): path = os.path.join(ETSConfig.application_home, fname) else: path = fname # Check if we have already added a logger (can happen when the app # is started multiple number of times from ipython say). handlers = logger.handlers if len(handlers) > 1: h = handlers[0] if isinstance(h, LogFileHandler) and h.baseFilename == path: logger.info('Logging handlers already set! Not duplicating.') return logger.setLevel(logging.DEBUG) handler = LogFileHandler(path) handler.setLevel(logging.DEBUG) logger.addHandler(handler) if stream: s = logging.StreamHandler() s.setFormatter(FORMATTER) s.setLevel(mode) logger.addHandler(s) logger.info("*"*80) logger.info("logfile is: '%s'", os.path.abspath(path)) logger.info("*"*80) def get_non_gui_plugin_classes(): """Get list of basic mayavi plugin classes that do not add any views or actions.""" from envisage.core_plugin import CorePlugin from envisage.ui.workbench.workbench_plugin import WorkbenchPlugin from tvtk.plugins.scene.scene_plugin import ScenePlugin from mayavi.plugins.mayavi_plugin import MayaviPlugin plugins = [CorePlugin, WorkbenchPlugin, MayaviPlugin, ScenePlugin, ] return plugins def get_non_gui_plugins(): """Get list of basic mayavi plugins that do not add any views or actions.""" return [cls() for cls in get_non_gui_plugin_classes()] def get_plugin_classes(): """Get list of default plugin classes to use for Mayavi.""" # Force the selection of a toolkit: from traitsui.api import toolkit toolkit() from traits.etsconfig.api import ETSConfig try_use_ipython = preference_manager.root.use_ipython use_ipython = False if ETSConfig.toolkit == 'wx' and try_use_ipython: try: # If the right versions of IPython, EnvisagePlugins and # Pyface are not installed, this import will fail. from envisage.plugins.ipython_shell.view.ipython_shell_view \ import IPythonShellView use_ipython = True except: pass if use_ipython: from envisage.plugins.ipython_shell.ipython_shell_plugin import \ IPythonShellPlugin PythonShellPlugin = IPythonShellPlugin else: from envisage.plugins.python_shell.python_shell_plugin import PythonShellPlugin from envisage.plugins.text_editor.text_editor_plugin import TextEditorPlugin from apptools.logger.plugin.logger_plugin import LoggerPlugin from tvtk.plugins.scene.ui.scene_ui_plugin import SceneUIPlugin from mayavi.plugins.mayavi_ui_plugin import MayaviUIPlugin plugins = get_non_gui_plugin_classes() plugins.extend([ LoggerPlugin, MayaviUIPlugin, SceneUIPlugin, PythonShellPlugin, TextEditorPlugin, ]) return plugins def get_plugins(): """Get list of default plugins to use for Mayavi.""" return [cls() for cls in get_plugin_classes()] ########################################################################### # `Mayavi` class. ########################################################################### class Mayavi(HasTraits): """The Mayavi application class. This class may be easily subclassed to do something different. For example, one way to script MayaVi (as a standalone application and not interactively) is to subclass this and do the needful. """ # The main envisage application. application = Instance('envisage.ui.workbench.api.WorkbenchApplication') # Turn this off if you don't want the workbench to start the GUI # event loop. start_gui_event_loop = Bool(True, desc='start a GUI event loop') # The MayaVi Script instance. script = Instance('mayavi.plugins.script.Script') # The logging mode. log_mode = Int(logging.ERROR, desc='the logging mode to use') def main(self, argv=None, plugins=None): """The main application is created and launched here. Parameters ---------- argv : list of strings The list of command line arguments. The default is `None` where no command line arguments are parsed. To support command line arguments you can pass `sys.argv[1:]`. plugins : list of Plugin objects List of plugins to start. If none is provided it defaults to something meaningful. log_mode : The logging mode to use. """ # Parse any cmd line args. if argv is None: argv = [] self.parse_command_line(argv) if plugins is None: plugins = get_plugins() plugins += get_custom_plugins() # Create the application prefs = preference_manager.preferences app = MayaviWorkbenchApplication(plugins=plugins, preferences=prefs, start_gui_event_loop=self.start_gui_event_loop) self.application = app # Setup the logger. self.setup_logger() # Start the application. app.run() def setup_logger(self): """Setup logging for the application.""" setup_logger(logger, 'mayavi.log', mode=self.log_mode) def parse_command_line(self, argv): """Parse command line options. Parameters ---------- - argv : `list` of `strings` The list of command line arguments. """ from optparse import OptionParser usage = "usage: %prog [options]" parser = OptionParser(usage) (options, args) = parser.parse_args(argv) def run(self): """This function is called after the GUI has started. Override this to do whatever you want to do as a MayaVi script. If this is not overridden then an empty MayaVi application will be started. *Make sure all other MayaVi specific imports are made here!* If you import MayaVi related code earlier you will run into difficulties. Use 'self.script' to script the mayavi engine. """ pass ###################################################################### # Non-public interface. ###################################################################### @on_trait_change('application.gui:started') def _on_application_gui_started(self, obj, trait_name, old, new): """This is called as soon as the Envisage GUI starts up. The method is responsible for setting our script instance. """ if trait_name != 'started' or not new: return app = self.application from mayavi.plugins.script import Script window = app.workbench.active_window # Set our script instance. self.script = window.get_service(Script) # Call self.run from the GUI thread. app.gui.invoke_later(self.run) def main(argv=None): """Simple helper to start up the mayavi application. This returns the running application.""" m = Mayavi() m.main(argv) return m if __name__ == '__main__': main(sys.argv[1:]) mayavi-4.5.0/mayavi/plugins/envisage_engine.py0000644000076500000240000001254012747716314022077 0ustar prabhustaff00000000000000"""The MayaVi Engine meant to be used with Envisage. """ # Author: Prabhu Ramachandran # Copyright (c) 2005-2007, Enthought, Inc. # License: BSD Style. # Standard library imports. import logging # Enthought library imports. from traits.api import Instance, on_trait_change, Str from tvtk.plugins.scene.i_scene_manager import \ ISceneManager from tvtk.plugins.scene.ui.actions import NewScene from tvtk.plugins.scene import scene_editor from pyface.api import GUI from pyface.workbench.api import WorkbenchWindow from apptools.scripting.api import recordable # Local imports. from mayavi.core.engine import Engine logger = logging.getLogger() ###################################################################### # `EnvisageEngine` class ###################################################################### class EnvisageEngine(Engine): # The version of this class. Used for persistence. __version__ = 0 # The envisage application. window = Instance(WorkbenchWindow) # Our name. name = Str('Mayavi Envisage Engine') ###################################################################### # `object` interface ###################################################################### def __get_pure_state__(self): d = super(EnvisageEngine, self).__get_pure_state__() for x in ['window',]: d.pop(x, None) return d ###################################################################### # `Engine` interface ###################################################################### def start(self): """This starts the engine. Only after the engine starts is it possible to use mayavi. This particular method is called automatically when the window is opened.""" if self.running: return # Add all the existing scenes from the scene plugin. scene_manager = self.window.get_service(ISceneManager) for scene in scene_manager.scenes: self.add_scene(scene) # Setup a handler that is invoked when a new Scene is # added/removed. scene_manager.on_trait_change(self._scene_editors_changed, 'scenes_items') # Call the parent start method. super(EnvisageEngine, self).start() logger.debug ('--------- EnvisageEngine started ----------') def stop(self): # Call the parent stop method. super(EnvisageEngine, self).stop() @recordable def new_scene(self, viewer=None, name=None, **kwargs): """ Creates a new VTK scene window. For the time being the extra kwargs are ignored with the envisage engine. """ action = NewScene(window=self.window) editor = action.perform(None) if name is not None: editor.name = name # Flush the UI. GUI.process_events() return self.scenes[-1] @recordable def close_scene(self, scene): """Given a VTK scene instance, this method closes it. """ active_window = self.window s = scene.scene for editor in active_window.editors[:]: if isinstance(editor, scene_editor.SceneEditor): if id(editor.scene) == id(s): editor.close() break # Flush the UI. GUI.process_events() ###################################################################### # Non-public interface ###################################################################### def _scene_editors_changed(self, list_event): """This is called when the items of the editors trait of the SceneManager change. This is used to update `self.scenes`.""" # Remove any removed scenes. for scene in list_event.removed: self.remove_scene(scene) # Add any new scenes. for scene in list_event.added: self.add_scene(scene) @on_trait_change('window:opened') def _on_window_opened(self, obj, trait_name, old, new): """We start the engine when the window is opened.""" if trait_name == 'opened': self.start() @on_trait_change('window:closed') def _on_window_closed(self, obj, trait_name, old, new): """We stop the engine when the window is closed.""" if trait_name == 'closed': self.stop() def _window_changed(self, old, new): """Static trait handler.""" # This is needed since the service may be offered *after* the # window is opened in which case the _on_window_opened will do # nothing. sm = new.get_service(ISceneManager) if sm is not None: self.start() @on_trait_change('window:editors[]') def _sync_scene_editor_name(self, obj, trait_name, old, new): """Synchronize the Mayavi scene's name trait with that of the editor's name.""" if trait_name.startswith('editors'): scenes = list(self.scenes) scenes.reverse() for editor in new: if not hasattr(editor, 'scene'): continue for scene in scenes: if id(editor.scene) == id(scene.scene): editor.name = scene.name scene.sync_trait('name', editor, 'name') break mayavi-4.5.0/mayavi/plugins/mayavi_plugin.py0000644000076500000240000000323412747716314021615 0ustar prabhustaff00000000000000"""The Mayavi plugin. """ # Author: Prabhu Ramachandran # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. from traits.api import List from envisage.api import Plugin, ServiceOffer # This module's package. PKG = '.'.join(__name__.split('.')[:-1]) # The mayavi package ID. ID = 'mayavi' ############################################################################### # `MayaviPlugin` class. ############################################################################### class MayaviPlugin(Plugin): # Extension point Ids. SERVICE_OFFERS = 'envisage.ui.workbench.service_offers' PREFERENCES = 'envisage.preferences' # The plugins name. name = 'Mayavi plugin' # Our ID. id = ID ###### Contributions to extension points made by this plugin ###### # Services we contribute. service_offers = List(contributes_to=SERVICE_OFFERS) # Preferences. preferences = List(contributes_to=PREFERENCES) def _preferences_default(self): """ Trait initializer. """ return ['pkgfile://%s/preferences/preferences.ini' % ID] ###################################################################### # Private methods. def _service_offers_default(self): """ Trait initializer. """ engine_service_offer = ServiceOffer( protocol = 'mayavi.core.engine.Engine', factory = PKG + '.envisage_engine.EnvisageEngine' ) script_service_offer = ServiceOffer( protocol = 'mayavi.plugins.script.Script', factory = PKG + '.script.Script' ) return [engine_service_offer, script_service_offer] mayavi-4.5.0/mayavi/plugins/mayavi_ui_action_set.py0000644000076500000240000001216312747716314023145 0ustar prabhustaff00000000000000"""Mayavi action set for menus and actions etc. """ # Author: Prabhu Ramachandran # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. # Enthought library imports. from envisage.ui.action.api import Action, ActionSet, Group, Menu from mayavi.core.registry import registry ######################################## # Groups file_group = Group( id='MayaviFileGroup', path='MenuBar/File', before='ExitGroup' ) visualize_group = Group( id='VisualizeGroup', path='MenuBar/VisualizeMenu', ) modules_group = Group( id='ModulesGroup', path='MenuBar/VisualizeMenu/ModulesMenu', ) filters_group = Group( id='FiltersGroup', path='MenuBar/VisualizeMenu/FiltersMenu', ) ######################################## # Menus open_menu = Menu( id = "LoadDataMenu", name = "&Load data", path = 'MenuBar/File', group='MayaviFileGroup' ) visualize_menu = Menu( id = "VisualizeMenu", name = "Visuali&ze", path = "MenuBar", before = "View" ) modules_menu = Menu( id = "ModulesMenu", name = "&Modules", path="MenuBar/VisualizeMenu", ) filters_menu = Menu( id = "FiltersMenu", name = "&Filters", path="MenuBar/VisualizeMenu", after="ModulesMenu", ) ######################################## # File menu items. ID = 'mayavi' #################### # Source actions. open_file = Action( id = "OpenFile", class_name = ID + ".action.sources.OpenFile", name = "&Open file ...", path = "MenuBar/File/LoadDataMenu" ) # Automatic source generation for non-open file related sources. SOURCE_ACTIONS = [open_file] for src in registry.sources: if len(src.extensions) == 0: action = Action(id=src.id, class_name=ID + ".action.sources." + src.id, name= src.menu_name, path="MenuBar/File/LoadDataMenu" ) SOURCE_ACTIONS.append(action) #################### # Save/load actions. save_viz = Action( id = "SaveVisualization", class_name = ID + ".action.save_load.SaveVisualization", name = "&Save Visualization", group = "MayaviFileGroup", path="MenuBar/File", ) load_viz = Action( id = "LoadVisualization", class_name = ID + ".action.save_load.LoadVisualization", name = "&Load Visualization", group = "MayaviFileGroup", path="MenuBar/File", ) run_script = Action( id = "RunScript", class_name = ID + ".action.save_load.RunScript", name = "&Run Python Script", group = "MayaviFileGroup", path="MenuBar/File", ) ######################################## # Visualize menu items. add_mm = Action( id = "AddModuleManager", class_name = ID + ".action.modules.AddModuleManager", name = "&Add ModuleManager", path="MenuBar/VisualizeMenu", after="FiltersMenu" ) ######################################## # Modules. MODULE_ACTIONS = [] for module in registry.modules: action = Action(id=module.id, class_name=ID + ".action.modules." + module.id, name= module.menu_name, group = "ModulesGroup", path="MenuBar/VisualizeMenu/ModulesMenu" ) MODULE_ACTIONS.append(action) ######################################## # Filter items. ######################################## FILTER_ACTIONS = [] for filter in registry.filters: action = Action(id=filter.id, class_name=ID + ".action.filters." + filter.id, name= filter.menu_name, group = "FiltersGroup", path="MenuBar/VisualizeMenu/FiltersMenu" ) FILTER_ACTIONS.append(action) ######################################## # Help menu items. help_index = Action( id = "HelpIndex", class_name = ID + ".action.help.HelpIndex", name = "&User Guide", path="MenuBar/Help" ) tvtk_class_browser = Action( id = "TVTKClassBrowser", class_name = ID + ".action.help.TVTKClassBrowser", name = "&VTK Class Browser", path = "MenuBar/Help", ) ################################################################################ # `MayaviUIActionSet` class. ################################################################################ class MayaviUIActionSet(ActionSet): """ The default action set for the mayavi UI plugin. """ groups = [file_group, visualize_group, modules_group, filters_group, ] menus = [open_menu, visualize_menu, modules_menu, filters_menu ] actions = SOURCE_ACTIONS + \ [save_viz, # Save load actions. load_viz, run_script, # Add module manager. add_mm, ] + \ MODULE_ACTIONS + \ FILTER_ACTIONS + \ [help_index, tvtk_class_browser, ] mayavi-4.5.0/mayavi/plugins/mayavi_ui_plugin.py0000644000076500000240000001751012747716314022314 0ustar prabhustaff00000000000000"""The Mayavi UI plugin """ # Author: Prabhu Ramachandran # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. # Standard library imports. import logging # Enthought library imports. from traits.api import List, on_trait_change from envisage.api import Plugin from pyface.workbench.api import Perspective, PerspectiveItem from traits.etsconfig.api import ETSConfig logger = logging.getLogger() # View IDs. ENGINE_VIEW = 'mayavi.core.ui.engine_view.EngineView' CURRENT_SELECTION_VIEW = 'mayavi.core.engine.Engine.current_selection' SHELL_VIEW = 'envisage.plugins.python_shell_view' LOGGER_VIEW = 'apptools.logger.plugin.view.logger_view.LoggerView' ############################################################################### # `MayaviPerspective` class. ############################################################################### class MayaviPerspective(Perspective): """ A default perspective for Mayavi. """ # The perspective's name. name = 'Mayavi' # Should this perspective be enabled or not? enabled = True # Should the editor area be shown in this perspective? show_editor_area = True # The contents of the perspective. contents = List() def _contents_default(self): contents = [ PerspectiveItem(id=ENGINE_VIEW, position='left'), PerspectiveItem(id=CURRENT_SELECTION_VIEW, position='bottom', relative_to=ENGINE_VIEW), PerspectiveItem(id=SHELL_VIEW, position='bottom'), ] show_logger = True if ETSConfig.toolkit == 'wx': # XXX: Bugware: avoid a crash in Wx with the logger import wx if wx.__version__.split('.')[:2] == ['2', '6']: show_logger = False if show_logger: contents.append(PerspectiveItem(id=LOGGER_VIEW, position='with', relative_to=SHELL_VIEW)) return contents ############################################################################### # `MayaviUIPlugin` class. ############################################################################### class MayaviUIPlugin(Plugin): # Extension point Ids. VIEWS = 'envisage.ui.workbench.views' PERSPECTIVES = 'envisage.ui.workbench.perspectives' PREFERENCES_PAGES = 'envisage.ui.workbench.preferences_pages' ACTION_SETS = 'envisage.ui.workbench.action_sets' BANNER = 'envisage.plugins.ipython_shell.banner' # The plugins name. name = 'Mayavi UI plugin' # Our ID. id = 'mayavi_ui' ###### Contributions to extension points made by this plugin ###### # Views. views = List(contributes_to=VIEWS) # Perspectives. perspectives = List(contributes_to=PERSPECTIVES) # Preferences pages. preferences_pages = List(contributes_to=PREFERENCES_PAGES) # Our action sets. action_sets = List(contributes_to=ACTION_SETS) # IPython banner banner = List(contributes_to=BANNER) def _views_default(self): """ Trait initializer. """ return [self._engine_view_factory, self._current_selection_view_factory] def _perspectives_default(self): """ Trait initializer. """ return [MayaviPerspective] def _preferences_pages_default(self): """ Trait initializer. """ from mayavi.preferences.mayavi_preferences_page import ( MayaviRootPreferencesPage, MayaviMlabPreferencesPage) return [MayaviRootPreferencesPage, MayaviMlabPreferencesPage] def _action_sets_default(self): """ Trait initializer. """ from mayavi.plugins.mayavi_ui_action_set import ( MayaviUIActionSet ) return [MayaviUIActionSet] def _banner_default(self): """Trait initializer """ return ["""Welcome to Mayavi, this is the interactive IPython shell. If this is your first time using Mayavi, take a quick look at the tutorial examples section of the user guide, accessible via the help menu. To use Mayavi, you need to load your data in "data sources" and apply "visualization modules" to it. """] ###################################################################### # Private methods. def _engine_view_factory(self, window, **traits): """ Factory method for engine views. """ from pyface.workbench.traits_ui_view import \ TraitsUIView from mayavi.core.ui.engine_view import \ EngineView engine_view = EngineView(engine=self._get_engine(window)) tui_engine_view = TraitsUIView(obj=engine_view, id=ENGINE_VIEW, name='Mayavi', window=window, position='left', **traits ) return tui_engine_view def _current_selection_view_factory(self, window, **traits): """ Factory method for the current selection of the engine. """ from pyface.workbench.traits_ui_view import \ TraitsUIView engine = self._get_engine(window) tui_engine_view = TraitsUIView(obj=engine, view='current_selection_view', id=CURRENT_SELECTION_VIEW, name='Mayavi object editor', window=window, position='bottom', relative_to=ENGINE_VIEW, **traits ) return tui_engine_view def _get_engine(self, window): """Return the Mayavi engine of the particular window.""" from mayavi.core.engine import Engine return window.get_service(Engine) def _get_script(self, window): """Return the `mayavi.plugins.script.Script` instance of the window.""" from mayavi.plugins.script import Script return window.get_service(Script) ###################################################################### # Trait handlers. @on_trait_change('application.gui:started') def _on_application_gui_started(self, obj, trait_name, old, new): """This is called when the application's GUI is started. The method binds the `Script` and `Engine` instance on the interpreter. """ # This is called when the application trait is set but we don't # want to do anything at that point. if trait_name != 'started' or not new: return # Get the script service. app = self.application window = app.workbench.active_window script = self._get_script(window) # Get a hold of the Python shell view. id = SHELL_VIEW py = window.get_view_by_id(id) if py is None: logger.warn('*'*80) logger.warn("Can't find the Python shell view to bind variables") return # Bind the script and engine instances to names on the # interpreter. try: py.bind('mayavi', script) py.bind('engine', script.engine) try: # The following will fail under Qt, as it needs the Pyface # Tree that has not been ported from Wx yet. from apptools.naming.ui.api import explore py.bind('explore', explore) except ImportError: pass except AttributeError as msg: # This can happen when the shell is not visible. # FIXME: fix this when the shell plugin is improved. logger.warn(msg) logger.warn("Can't find the Python shell to bind variables") mayavi-4.5.0/mayavi/plugins/mayavi_workbench_application.py0000644000076500000240000001036512747716314024667 0ustar prabhustaff00000000000000"""Mayavi specific workbench application. """ # Author: Prabhu Ramachandran # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. # Standard library imports. from os.path import dirname import logging # Enthought library imports. from traits.api import Bool from envisage.ui.workbench.api import WorkbenchApplication from pyface.api import AboutDialog, ImageResource, SplashScreen # Local imports. import mayavi.api from mayavi.preferences.api import preference_manager IMG_DIR = dirname(mayavi.api.__file__) logger = logging.getLogger(__name__) class MayaviWorkbenchApplication(WorkbenchApplication): """ The mayavi application. """ #### MayaviWorkbenchApplication interface ################################# # Turn this off if you don't want the workbench to start a GUI # event loop. start_gui_event_loop = Bool(True, desc='start a GUI event loop') #### 'IApplication' interface ############################################# # The application's globally unique Id. id = 'mayavi_e3' #### 'WorkbenchApplication' interface ##################################### # Branding information. # # The icon used on window title bars etc. icon = ImageResource('m2.ico', search_path=[IMG_DIR]) # The name of the application (also used on window title bars etc). name = 'Mayavi2 - The 3D data visualizer' ########################################################################### # 'WorkbenchApplication' interface. ########################################################################### def run(self): """ Run the application. This does the following: 1) Starts the application 2) Creates and opens a workbench window 3) Starts the GUI event loop (only if start_gui_event_loop is True) 4) When the event loop terminates, stops the application This particular method is overridden from the parent class to allow the user to not run the gui event loop as would be necessary when the loop is started elsewhere or when run fron IPython. """ logger.debug('---------- workbench application ----------') # Make sure the GUI has been created (so that, if required, the splash # screen is shown). gui = self.gui # Start the application. if self.start(): # Create and open the first workbench window. window = self.workbench.create_window( position=self.window_position, size=self.window_size ) window.open() # We stop the application when the workbench has exited. self.workbench.on_trait_change(self._on_workbench_exited, 'exited') # Start the GUI event loop if needed. if self.start_gui_event_loop: # THIS CALL DOES NOT RETURN UNTIL THE GUI IS CLOSED. gui.start_event_loop() return ###################################################################### # Non-public interface. ###################################################################### def _about_dialog_default(self): """ Trait initializer. """ from mayavi import api from vtk import vtkVersion vtk_version = vtkVersion().GetVTKVersion() about_dialog = AboutDialog( parent = self.workbench.active_window.control, image = ImageResource('m2_about.jpg', search_path=[IMG_DIR]), additions = ['Authors: Prabhu Ramachandran', 'and Gael Varoquaux', '', 'Mayavi version %s \t - \t VTK version %s' % (api.__version__, vtk_version)], ) return about_dialog def _splash_screen_default(self): """ Trait initializer. """ if preference_manager.root.show_splash_screen: splash_screen = SplashScreen( image = ImageResource('m2_about.jpg', search_path=[IMG_DIR]), show_log_messages = True, ) else: splash_screen = None return splash_screen mayavi-4.5.0/mayavi/plugins/script.py0000644000076500000240000000740312747716314020257 0ustar prabhustaff00000000000000"""This represents the scripting API for MayaVi. The Script class provides a scriptable view of the MayaVi Engine. It is safe to instantiate as many Script instances as desired. """ # Author: Prabhu Ramachandran # Copyright (c) 2005-2008, Enthought, Inc. # License: BSD Style. # Enthought imports from traits.api import HasTraits, Instance # Local imports from mayavi.core.engine import Engine from mayavi.core.common import exception ############################################################################## # Utility functions. ############################################################################## def get_imayavi_engine(window): """Returns the MayaVi Engine given the Envisage worbench window. """ return window.get_service(Engine) def get_imayavi(window): """Given the Envisage workbench window, returns the mayavi.script.Script instance (registered as `mayavi.services.IMAYAVI`). """ return window.get_service(Script) ############################################################################## # `Script` class. ############################################################################## class Script(HasTraits): """This class basically presents a scriptable 'view' of the MayaVi Engine. It is registered as the IMayaVi service (via an ApplicationObject) because this is the interface users should be using when they script. """ # The workbench window we are associated with. window = Instance('pyface.workbench.api.WorkbenchWindow') # The MayaVi engine that we are managing. engine = Instance(Engine) ###################################################################### # `Script` interface ###################################################################### def add_source(self, src, scene=None): """Adds a given source to the MayaVi pipeline. """ try: self.engine.add_source(src, scene=scene) except: exception() def add_module(self, mod, obj=None): """Adds a given module to the MayaVi pipeline. Adds it to the selected object, or to an object passed thought the kwarg `obj`. """ try: self.engine.add_module(mod, obj=obj) except: exception() def add_filter(self, fil, obj=None): """Adds a given filter to the MayaVi pipeline. Adds it to the selected object, or to an object passed thought the kwarg `obj`. """ try: self.engine.add_filter(fil, obj=obj) except: exception() def new_scene(self): """Creates a new VTK scene window. """ return self.engine.new_scene() def load_visualization(self, fname): """Given a file/file name this loads the visualization. """ try: self.engine.load_visualization(fname) except: exception() def save_visualization(self, fname): """Given a file or a file name, this saves the current visualization to the file. """ try: self.engine.save_visualization(fname) except: exception() def get_active_window(self): """Get the currently active window.""" return self.window def open(self, filename): """Open a data file if possible. """ try: return self.engine.open(filename) except: exception() ###################################################################### # Non-public interface ###################################################################### def _window_changed(self, window): """Traits handler for changes to application. """ self.engine = get_imayavi_engine(window) mayavi-4.5.0/mayavi/preferences/0000755000076500000240000000000012747722127017214 5ustar prabhustaff00000000000000mayavi-4.5.0/mayavi/preferences/__init__.py0000644000076500000240000000013212747716314021322 0ustar prabhustaff00000000000000# Author: Prabhu Ramachandran # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. mayavi-4.5.0/mayavi/preferences/api.py0000644000076500000240000000031112747716314020333 0ustar prabhustaff00000000000000"""The public API for the preferences.""" # The global PreferenceManager instance from .preference_manager import preference_manager from .bindings import set_scene_preferences, get_scene_preferences mayavi-4.5.0/mayavi/preferences/bindings.py0000644000076500000240000000205712747716314021370 0ustar prabhustaff00000000000000""" Code to setup the preferences for common objects. """ # Author: Prabhu Ramachandran # Copyright (c) 2008-2015, Enthought Inc. # License: BSD Style. from .preference_manager import preference_manager def get_scene_preferences(): """Return a dictionary of the scene's default preferences.""" pref = preference_manager.preferences res = {} res['stereo'] = eval(pref.get('tvtk.scene.stereo')) res['magnification'] = \ eval(pref.get('tvtk.scene.magnification')) res['foreground'] = eval(pref.get('tvtk.scene.foreground_color')) res['background'] = eval(pref.get('tvtk.scene.background_color')) return res def set_scene_preferences(scene, prefs_dict=None): """Setup the preferences for a scene given a scene and an optional dictionary with the preferences. """ if prefs_dict is None: prefs_dict = get_scene_preferences() # Set the preferences. scene.set(**prefs_dict) # If this isn't done the background isn't set. scene.renderer.background = scene.background mayavi-4.5.0/mayavi/preferences/contrib_finder.py0000644000076500000240000000621312747716314022560 0ustar prabhustaff00000000000000""" Code that looks for mayavi contributions on sys.path or other standard places, making it easy for users to add contributions to load on startup. """ # Author: Prabhu Ramachandran # Copyright (c) 2008-2015, Prabhu Ramachandran # License: BSD Style. import sys from os.path import isdir, exists, join from os import listdir from traits.api import (HasTraits, List, Str, Instance, DelegatesTo, Button) from traitsui.api import View, Item, SetEditor ################################################################################ # `ContribFinder` class. ################################################################################ class ContribFinder(HasTraits): """ This class helps find installed mayavi contributions. """ # The preference helper whose contrib_packages trait we contribute # to. preference_helper = Instance(HasTraits) # The selected contributions. contrib_packages = DelegatesTo('preference_helper') # The found contrib packages. found_contrib = List(Str, desc='the mayavi contribution ' 'packages on the system') # Search for contributions. search = Button('Search for packages', desc='search again for contributions') ######################################## # View related code. view = View(Item('contrib_packages', show_label=False, editor=SetEditor(name='found_contrib', left_column_title='Available '\ 'contributions', right_column_title='Selected '\ 'contributions', can_move_all=False), resizable=True, ), Item('search', show_label=False), resizable=True ) ###################################################################### # `object` interface. ###################################################################### def __init__(self, **traits): super(ContribFinder, self).__init__(**traits) # Find the contributions by default. self.find() ###################################################################### # `ContribFinder` interface. ###################################################################### def find(self): """Find the contrib directories from sys.path.""" found = [] for d in sys.path: if isdir(d): for s in listdir(d): if exists(join(d, s, 'user_mayavi.py')): found.append(s) self.found_contrib = found ###################################################################### # Non-public interface. ###################################################################### def _preference_helper_default(self): from .preference_manager import preference_manager return preference_manager.root def _search_fired(self): self.find() mayavi-4.5.0/mayavi/preferences/images/0000755000076500000240000000000012747722127020461 5ustar prabhustaff00000000000000mayavi-4.5.0/mayavi/preferences/images/image_LICENSE.txt0000644000076500000240000000067212747716314023454 0ustar prabhustaff00000000000000The icons are mostly derived work from other icons. As such they are licensed accordingly to the original license: CP (Crystal Project Icons): LGPL license as described in image_LICENSE_CP.txt Unless stated in this file, icons are work of enthought, and are released under BSD-like license. Files and orginal authors: -------------------------------------------------------------------- preferences.png CP preferences.ico CP mayavi-4.5.0/mayavi/preferences/images/preferences.ico0000644000076500000240000031342612747716314023470 0ustar prabhustaff00000000000000(vh   00%F/@@(BT( R,R,  R,  R,  !#$%&(()))(('%$#" R,Z; "%(*-0247:<>@BCDDDCB@?=;8530.+)&#  ʿ๬俳M(wAiLk֩ڱ๬ $(,059=AEILPSWZ]`bcddc`^[XTQMJFC?:72/+&"Ĺ๬ݷݴ Ѣnw^Y9U/j8J&`By` q ʗѢگݷ⽱ $ź)ź.ź4Ƚ9ʿ>DINSX]bfkpsx{~܀ځځ}yuqmid`[ʿVźQźLGA俳<俳7⽱2⽱,๬'ܳ#ٮӦ˛ÎznuZ bD T2t@M(J'e6{C R0 cFqWhtĐ{"ʗ&˙+ϟ1Ѣ6Ѣ=ӦB֩HٮNگU۲[ݴa๬fẮl⽱qv÷{ĹȽÒĔĖĖÓʿź÷俳Ắ~๭yݷtܳoڱjٮe֩_ӤZѢTϟMΞH˙A˛;ʗ5ő}0Œw+n&}e!v]lQ_AS1H$p= S,< 3F% ^2 o<F!R0Z;bC"hL'pT+tY1w_6{c<}eBhHlNpUu\Îzbő}iȓnȓtʘ{˙ΞϟѢӦԧ׬گگ׬֩ӤϟΞ˛ȕȓƒ~Đ{yŒwtqnnihc|d\y`Vw^PtYIqWBlR=jN7eH2_A.Y9(R0$L(}D p<b5 M(8 &   /A$R,b5 l9u@!|D&J&*M*/R05T39W6?Y9E[',  8Iv]hLG&U+*>"NL(ő}Ƚɾ÷÷÷÷÷÷÷øøøøøøøøøøøøøøøøøøźøøȽ⽱|du@-<!%Z0rkøźźø^>'-  8Iv]ʿÎzlQߨlQܿt÷ɾø÷÷÷÷÷÷÷÷øøøøøøøøøøøøøøøøøøźźźźøøݴ{c`BġdG˛øźźźźø^>'-  8Iv]Ⱦø÷÷÷÷÷÷÷÷øøøøøøøøøøøøøøøøøøźźźźźźøøøźźźźźźø^>',  8Iv]Ĺ÷÷÷÷÷÷÷÷øøøøøøøøøøøøøøøøøøźźźźźźźźøøøźźźźźźźźø^>',  8Jv]Ĺ÷÷÷÷÷÷÷÷øøøøøøøøøøøøøøøøøøźźźźźźźźźźøźȽȽźøźźźźźźźźźźø^>'- 8Iv]Ĺ÷÷÷÷÷÷÷÷øøøøøøøøøøøøøøøøøøźźźźźźźźźźźźźźźźźźźźźźźźźźźø^>', < Dw^Ⱦø÷÷÷÷÷÷÷÷øøøøøøøøøøøøøøøøøøźźźźźźźźźźźźźźźźźźźźźźźźźźźźø^@+) cFɾø÷÷÷÷÷÷÷÷øøøøøøøøøøøøøøøøøøźźźźźźźźźźźźźźźźźźźźźźźźźźźźźøݴL(H'-y`ɾø÷÷÷÷÷÷÷÷øøøøøøøøøøøøøøøøøøźźźźźźźźźźźźźźźźźźźźźźźźźźźźźźøϟhJ  jN⽱Ƚ·÷÷÷÷÷÷÷÷źźȽȽȽȽȽȽȽźźźøøøøøøźźźźźźźźźźźźźźźźźźźźźźźźźźźźź·ӦY8b3 Klź÷÷÷÷÷øźø⾲ຮڲ׮ժժժժժ׭ڲߺ⾲ĹȽźøøøźźźźźźźźźźźźźźźźźźźźźźźźźźźź·ʿqW< $]1 LzbȾĹ÷÷øź۴ӧϡϡϡѦԧ׮ٱڲڲڱ׮ժУϢϡӧ۲÷ȽȽźźźźźźźźźźźźźźźźźźźźźźźźźźźøʿnS8#< ;uZȽ·øź߹ӦΟӦݷȽɾźȽɾɾźݷӧ˜УݸȽƽźźźźźźźźźźźźźźźźźźźźźźźźøʿnS8$M(DiźøܴϡУάȽ·øŹȽȽɾɾ߹ТΟ۴ȽȽźźźźźźźźźźźźźźźźźźźźźźȽnS8"]1 Quɾ÷ܷڲȽøøźźȽɾɾźѦ̝ݷȾȽźźźźźźźźźźźźźźźźźźźźȾnS8'zCẮȾø÷źźȽɾøΡѦøȽźźźźźźźźźźźźźźźźźźź֩[0fR,VӤø÷źźȽȽ۳ʛ߸ȾźźźźźźźźźźźźźźźźźźʗH'; l9۲Ĺ÷źźȽȽ˜׮ȾźźźźźźźźźźźźźźźźźѢT-[ (1v]ĹøźȽɾɾϡԧȾźźźźźźźźźźźźźźźźɾW6  zCẮź๭ݷᾲڱ÷ժӧȾźźźźźźźźźźźźźźźźӤW-j/;iø̜đ|pĐ{Ӧ׮ԧȾźźźźźźźźźźźźźźøhJ zC⽱÷foӦ}fđ|ӧ֬Ⱦźźźźźźźźźźźźźźź֪Z0j-0}eɾȽȕĐ{q֪Ο۴ȾźźźźźźźźźźźźźźȾ_@k9ܳ߹źøźԧʙڱɾ˜·ȽźźźźźźźźźźźźźźʘF%LhJУ׮Ĺ÷øɾ⾲ϢȽźźźźźźźźźźźźźźȽ|D L(UΞάÎzɾø÷ŹźȽȾɾӧ۲Ⱦźźźźźźźźźźźźźźw_&{Cźɾƕź·øȽȽȽȽΟźźźźźźźźźźźźźźźԧW/`sWɾźȽ׮ƕȽ÷׮֬ȾźźźźźźźźźźźźźȽJ' J'Q˙ɾȾɾȽźĹø÷źœøȾ̝øźźźźźźźźźźźźźźw^&  v@俳øĹźźĹĹøø·÷÷÷ĹܴȖĐ{Y9L[0   X-Y8Dq֬ڲȾźźźźźźźźźźźźź֩Y/a   N*dl÷÷÷÷÷÷÷÷÷÷÷÷÷Ƚ˜۴}ezW-' pU`ϡȽźźźźźźźźźźźźźȽ|dj9M(S,   5;d5 e6d5 d5 d5 d5 d5 yBo÷÷÷÷÷÷÷÷÷÷÷÷đ}֩X-+[0ȾУάȽźźźźźźźźźźźźź˛lqWУhJI&s>f6b5 ^2 s'+ H'B{cʿʿʿʿȽʿø÷÷÷÷÷÷÷÷÷÷÷źٮ˝uYm i8GȽø÷÷߸Ϣ⾲ȾɾȽźø÷÷÷øøźø÷÷÷÷øøȽຮu`3 rZ;Ƚ÷øøøøøøøøøøøøøźœ߹ɾJ', ˛ɾź⾲ݷУɾȽźø÷÷øٮ_3 rT2÷øøøøøøøøøøøøɾ̝׭էW6⾲ܴԨȾɾź÷⾲`3 a< 0ÎzȽʿʿʿʿȽ÷øøøøøøøøøøøȽ֬ϡp  s>vźźڲݷɾøʿȽʿʿʿȽzb28#e6dc5 hd5 gc5 gc5 gc5 gc5 ed5 siL⽱÷øøøøøøøøøøøĹ⾲ƓĐ{C$*  j9ըժl|Dc5 fc5 gc5 gc5 gc5 gc5 id5 [32 sXźøøøøøøøøøøøøɾɘຮȾȽԅJ'a  _2 M_@ӤɾժpU< ?yBĹȾøøøøøøøøøøøøȽٮ̝ɾøẮĖY8xT-?&  &F%8O,gԧݸά֪^2 fW/SէøøøøøøøøøøøøøźœɾȽ÷÷׬๭թi/#&iøøøøøøøøøøøźøɾ֬ӦɾȽźøøȽά๬W6W6øźźźźźźźźźźźźȽđ}ɾȽø÷źøȕd5 t_3 ZӤźźźźźźźźźźźźźȾڲɘɾȽø÷ȽĹqW8,&w^øźźźźźźźźźźźźȖ߹ɾȽźøøɾӤR0F!ܳøźźźźźźźźźźźźȽ·Ð{ɾȽźøøo[0WH'3tøźźźźźźźźźźźźȾڱƕȽȽø÷ź⽱⽱÷֩bC T2֩źźźźźźźźźźźźźźТ̝ȽȽø÷ź֪wđ}vٮpp<pM(7løźźźźźźźźźźźźź˜ժɾȽø÷ȽÎzoԧqȕٮhL/T2źøźźźźźźźźźźźźźźɘԨɾȽø÷ȽڱqÎyٮѢp<oH'7uȽźźźźźźźźźźźźźźźȾ˜ϡɾȽø÷Ƚ⾲˙⽱iL zC⽱źźźźźźźźźźźźźźźźϡƕȽȽø÷źڱ_3 mR,aٮźźźźźźźźźźźźźźźźź׮ŽzȽȽø÷ź·ʘL(E q=⽱źźźźźźźźźźźźźźźźźźὲŕТɾȽȽźøøٯ̝ӤW/g O*`oźźźźźźźźźźźźźźźźźźźźȽȾժđ}۳Ƚ÷÷·ɾ÷ɘάʿhL28 O*`løźźźźźźźźźźźźźźźźźźźźźȾøϡđ}ڲźøɾ߹˜ݷjN29  O*`lȾźźźźźźźźźźźźźźźźźźźźźźźźøӦƕ̝÷У̝ຮiM29  O*_løźźźźźźźźźźźźźźźźźźźźźźźźźźȾȾ߹Ӧ˜̞׭⾲ڲϡТ۲iM28 U/WnøźźźźźźźźźźźźźźźźźźźźźźźźźźźźȽ۲׮ӦТ̝̝̝ѤԧڱຮlQ54iLźøźźźźźźźźźźźźźźźźźźźźźźźźźźźøźɾٮS1 J(+zb俴źźźźźźźźźźźźźźźźźźźźźźźźźźźø÷źϟhJ  bD·źźźźźźźźźźźźźźźźźźźźźźźźźź÷øȽԧQ/@$4qW·źźźźźźźźźźźźźźźźźźźźźźźźø÷øɾ⽱eH5< 5pU·źźźźźźźźźźźźøøøźźźźȽȽźĹø÷øɾ⽱cF3< 5pU·źźźźźźźźźźøź·źɾȽȽźĹø÷ĹɾܳcF3< 5pU·źźźźźźźź·ȽźȽȽźĹø÷źȾ۲_A5< 5pU·źźźźźź·źøźøø÷źȾ۲_A5< 6pU·źźźź·Đ{kOǤiLΞź÷÷źȾʿŒwdGeHÍy۲_A5< 5pU·źź·źiS1h [0WiM֪⾲÷Ƚ̜^>O*:^2 Po۲`B5< 5pU·ʿnSD%+, q=fsX֪̜`BY/K _3 Lo۲_A5< 5pUʿʿnS8#-s>ehLΞȽ๭ÍyY9Y/H ^2 N}e۲_A3< 5pTlQ8#X-DT3}e׬ʿ˙nSzCM(-^2 M|d_A5< 5w_{c8"5b5 XT2nSȓ俳niM|DU/=  `3 KtkO38d5 db3 _2  R,9]=Ắ⽱cF6-; (e6j`3 X- W/FuɾĹtY5,,*pUܴ֩`B$kOݷ׬bD %lQݷ֪bD %lQݷ֪`B  %kOܴը^@ ${chJʗzbnSW6@$3pUtzby`y`y`y`y`y`y`y`y`y`y`y`{cŒw`B5??????????????(  zCzCqW|Do<-a2n-g2fk9R0·øJ&^>ٮ׭׭׭گW6n;Ξ⾲÷Ď{øe6zCn߹qiloڱw`zCR,mźຮԧdGv^ő}·L(f]1 vȾὲԧj9~F!֬Y/oH$JhLȾڱ|dP'\ɗ۲jNW/CiMȽȕ⾲ϟeIh7۲Ӧݷc5 "hk|doŒww_绅nŒw|dΞoThtYI%R0U5O, eHn;Jw^w_O*C?7?(,  != <3gA,oKiHeC 2-xgܰ%U #+ J-pV* p6u\GݲƼĸ⽯gA)*_cB,dH 8 N-ǶЩล䷤ʙ翰}U?13 ܦ⸭zosq߷ĴqKhPGҝڭܵʝ̞͡޳Ɣ㽲ǽ˽vi?.)%;& ~ئ߹ƺ·ŏ޴`M  hJ߲ᷫ㾲ďzƒ~ѠƼԣw:[){I/]B׭ƺϟĹvJ'kO̔h>8Ǚث俴ĺkNޑU25!c3[ϪǼἯҢ߸޲b4OsYƺÏ~ຯǼhH-3_ɠź⾲ПС˖|(@iPڰz໯źɿhE)C( PÛȾ¶ҡ׭带I,xKi༰xǻ佯fD'M(K(M+תۯ˞U:0A51}c೥qTɇCR, 7cBߺ޶˫l3H)8" tΛٯgW a@1濲໯Ɛ֨ǻx AaἯԡקݱ廯DpD-cE_ǛЦpسصwX@$]?lz`ƮsZ6_A9lM֯hȫpTVr*sXoR[9Z:V5A" jB1y2U5 Q.u\oy_⺁k ?8xxx?(0 !!N+s>s>ڈN+  ,̜֬6X- ThJ&ݷȽɾٮF!_  cX-2)H$bCR0ő}ȽøøɾoO,ٟcFwA)M+ø÷źøøźȾF!ʘ⾲|dzc{c|d俴źźźøn <گڱźɾϡøźɗ 4>"ຮٮຮѤźܴ6[=øő}tÍyő}źR0(Z;֞bD֬ɾ⾲ȽĐ{R,&R,&ȕ·øթ|DۤiL 9-X໮Ƚ÷ຮԧ}etYТ·źݷ; k-[ԧȽøź߹ϟڲU3qW⾲ອТ·źɾС; k-UݷȾøάϟøqU4iLźΞźøɾٮ< hI%T2Q/ܴȽ{C z Q/ź߹S1ӊN,< !fJźຮ^@W-Ƚ·ԧøȽJ(v [˙ź·Ѥ⾲ѢG ]=źźźø÷ӦܴݷܴX7cFøȽȽ]=_@`B۲eHuő}ő}ܳ`B`BQ/ísY,eH4T2·T3iL,cF6R0žbC !y_sYu@ʗƪnSpUὅo<<<<( @  <khhk5wAӦʘʘӤj8T3H$9"* 6dhLøøX7]1 6$8;|Db3 S,L'Îzøøøøp}D "Rl9s>9;N+hŹ÷÷øøøø׭v]}D 8F!ø÷øźźźøźźȽźȾq=˛÷άຮ໯άάźźźźźźøp@$%ʘȾŹȽźȽøᾲȽźźźl0N,źɾᾲȽźźF! IٮѣܵȽźƓ=l9źɾ⾲Ƚźøźź_3 6ikv]Ƚź߹˛ŒwĐ{ӦຮȽźjNog)p<ÍyŒwȽ÷÷άźpUpȓάźźź֩ʗf6 [=ø÷ø߹Ƚը J(Đ{⾲·źȽT3 W7øøøźݷάźӦoT̜⾲ԧᾲȽɾN,W6·øøźݷຮź۲}e3׭ȽڱȽ߹øĹźȽO,`B÷źάຮɾ@$|c5 ߺøW6  hL=iyQ/|ϟø÷άϟT- owc3 ȽѣT3py}D 5X7źȽ߹⽱J'W/bźźøøźB%Py_źȽ⿴ø۲nS.T2źźȽĸɾL("l9Ƚźźźźø⿴÷øb3 lRøźźøøźȽq}D ๭·ź·lW6-}D ܴv]O,eHő}iMWگ}feH.F!ϟ˦iM*sXKpUٮݷqWnSCdG8lRޡdG5S2H$^@O,hLaÎzľppʗyBU@???(0` $  Ӧ ,:FR\fnrpiaWK@3%ẮO, e6 ^@h)ƒ<ΞOѢd׬yڱ۲๬Ĺ俳ݴ۲گӦ̜rȕ\ÍyH|d6cF'|DA$   H')b5 :o<MwA]F!rI&R0_AƟcFΦiMԩlRڤhLڞbDՍR0L(H$zCp<rj8__3 NL(=0.   "/ =M$[+jsT3iL$-( pa S B5''2<DDM+ȽȽȽȽkOf]TKB6*   M*øøøøiM  A%e .'RÎzøøøøɗ-Y %C$iv@h/ '^2 dGܳøøøø÷ອhLb5 , 'pTO, yBh; oi8ƒ÷÷øøøøøøȕq=0anSQ/n;ź÷÷÷øøøøøøøøźɾźøH$t@Ƚ÷÷÷øøøøøøøźźøȽźźźøJ' "3ź÷øøøøøøźĹøźźźźźźźźźøA$T^@øά߹ڱڲݷݸ۲۲ຮ·ȽźźźźźźźźźqW Z;ɾᾲźŹɾɾȽ߹߹øȽźźźźźźnS &9⽱ȽźݸὲȽźźźźȾ·@$V]1 ɾ߹άάȽźźźźn;Œwøʙ̝źὲȽźźźϟ3Y/|ɾź÷ຮ߹øźźźźh7`B۲ຮȽźźźsX Bԧźøø߹ܴO-b3 [c5 ]^>ݷøźźźݷC%i Y9үuZnSƒ÷÷÷øܴ{c-F%.ڱ÷źźźź๭u|dߝ`B"5A$TŹ÷÷÷÷øڲԧH'2÷ݷȽźźźƽF%j@$T֪Ƚ·÷÷÷÷÷÷Ӧ^>uZٱȽźźɾ߸C$j@$T׭Ⱦøøøøøø·УȽɾ۳Ӧ⾲W/P}D v⾲У߹ȾڲŻźȽɾ߸C$j@$T׭Ⱦøøøøøø·ТøȽѤȕ⾲R,P|DyܴĐ{ӦȽ׮źøźȽȽɾ߹D%j@$TթźøøøøøѦźȽȽźW6qWɾȽø⾲ڱɾøøøźźø۱C$lA$Sźøøøźڱź߹& 29Ⱦݷὲɾø÷J(i [4,! ٮL(b5 Y9 |dʗ#ԧ/ڱ<ݷJ๭Y俳fĹtʿċɕ̞ЦӫЪ̤ƜʿĹ俳๬r۲eگV׬HѢ:ȕ.k#jNL(R, /W-v@#N,/Z;"k  l9ɾźøøøøøøگH'z  /< l&eH`B+To<nSɾøøøøøø÷๬dGd5 B 4tYX7$bD]=!C$o[<ܳ÷øøøøøøøøѢO,3[  6pTU5&bDhLe6]=ʿɾ÷÷øøøøøøøø÷øȾݷR0b5 w^ȾU5$bDȽ÷÷÷÷øøøøøøøøøźźøźȽøźøU5&bDȽ÷÷÷÷øøøøøøøøøźźźźøȽźźźźźøU5^@Ƚ÷÷÷÷øøøøøøøøøźźźźźźźźźźźźźøN,$˙ź÷÷øøøø··øźźźøźźźźźźźźźźźźźźøhe6Ƚøøάݷڱٱ׮ڲڲڲڱ۴ຮøȽźźźźźźźźźźźźź⽱T-fX-{ʿɾຮڱߺźź÷źɾɾøߺڲܷøȽźźźźźźźźźøẮR,hn;øźȽɾڱݷȽźźźźźźźźȾ·]1 }< U÷øȽɾ÷ڲźźźźźźźźٮ2>R0÷ຮڲźźźźźźźȽzC8W๭ѤÎzȕڱƻźźźźźźѢ'?R0۲Ѥ׭۲ȽźźźźźźyB6ϟٮź÷÷ȽɾάάȽźźźźźkb5 ຮݷڱȽźźźźźI'e^>ȽȽȽźøĹժ蹀iU5bDԧ߹໯ȽźźźźźL(0UC$|A$z; so<๬Ƚ÷÷÷÷÷άٮR/" J',Ѣɾ۲ȽźźźźźܳR0j8O*oB%o+JB%Vٮ÷÷÷÷ø۲߹۲W/Rw]ڱøźźźźźø'<b3 xĹȽ÷÷÷÷÷źթźu@۲ڱὲȽźźźźź< \_2 vܴȽ··÷÷÷÷÷÷÷øӧɾ๭&{Cm۴߹ȽźźźȽ; Z_2 vݷȾøøøøøøøøøøУźȽȽøtY5!ɾݷݷȽźźȽ; Z_2 vݷȾøøøøøøøøøøϡάźȽϟƓТȽR0 ߸άĐ{ȕݷ۲ȽźȽȽɾɾ; Z_2 vݷȾøøøøøøøøøøТ⾲źȽТƓԧX7 ຮຮƓĐ{άɾ۴۴źøźźźȽɾɾ; Z_2 vݷȾøøøøøøøøøøУɾȽɾɾŒwJ'?ŹźøȽڲݷź÷÷øøźȽȽɾȾ; Z_3 xݷȽ÷÷··øøøøøźӦάJ'AZ;ȾĹø׮Ƚźø÷øøøźȽ; [_3 o÷øøøøȽ׮߹t @$Møڲź÷< Q Y9lQΣhJʞbDǸhøøøøøź߹۲kO &OȓȽߺĎzbDɣhJʩlRϑT3  høøøøø÷׮Ѣq=}+9  'F%MX6ٮźɾw^M*øøøøøȽڱɾøຮŹȽn;O*`Ĺźźźźź·ڱɾźøѢ0B iøźźźźȾ۲źȽøȽ_@s>ȾźźźźźȽ֬ȽøɾУݷW-t ő}øźźźźźź֬ȽøȾ๭Œ}ΞqW k9ȽźźźźźȽø֬ȾȽøɾW-tA$`ຮźźźźźźȽź׮ź÷Ƚ๭2G 4pUźźźźźźźźźȾ߹ڱźȽ]= 4pUȽźźźźźźźźźźȽźݷ۲άɾø^> iLȾźźźźźźźźźźźźźȽɾȽȽźɾT2 ʗ·źźźźźźźźźźźźøĹ|d U/søźźźźź···źźź÷źڱM(YS,tøźźźøȽøĹ÷ź׬J'YS,tøøøȕź⾲źÍy׬J(ZS,søẮh7S,jhlQI'Yf6׬J(YS,t÷R,hX-lhL俳׬[Q|$<|D"qc^cM+|zʴ(_(/FJ=ޤͿOwe_6|pve0 K%(yBZSvݿgY$IAપ cvTU8>>dY,Nd>U(eIY? q!ݗ}sZ2S.{pmp'E"H$q\o;? /q IENDB`mayavi-4.5.0/mayavi/preferences/mayavi_preferences_page.py0000644000076500000240000001453512747716314024442 0ustar prabhustaff00000000000000"""Preferences for Mayavi """ # Author: Prabhu Ramachandran # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import (Bool, Enum, Tuple, Range, List, Str, Instance, HasTraits) from traitsui.api import View, Group, Item, RGBColorEditor from apptools.preferences.ui.api import PreferencesPage ################################################################################ # `MayaviRootPreferencesPage` class ################################################################################ class MayaviRootPreferencesPage(PreferencesPage): """ Preferences page for Mayavi. """ #### 'PreferencesPage' interface ########################################## # The page's category (e.g. 'General/Appearance'). The empty string means # that this is a top-level page. category = '' # The page's help identifier (optional). If a help Id *is* provided then # there will be a 'Help' button shown on the preference page. help_id = '' # The page name (this is what is shown in the preferences dialog. name = 'Mayavi' # The path to the preferences node that contains the preferences. preferences_path = 'mayavi' #### Preferences ########################################################## # Specifies if the nodes on the tree may be deleted without a # confirmation or not. If True the user will be prompted before # the object is deleted. If it is False then the user will not be # prompted. confirm_delete = Bool(desc='if the user is prompted before' ' a node on the MayaVi tree is deleted') # Specifies if the splash screen is shown when mayavi starts. show_splash_screen = Bool(desc='if the splash screen is shown at' ' startup') # Specifies if the adder nodes are shown on the mayavi tree view. show_helper_nodes = Bool(desc='if the helper (adder) nodes are shown' ' on the tree view') # Specifies if the adder nodes are shown on the mayavi tree view. open_help_in_light_browser = Bool( desc='if the help pages are opened in a chromeless' 'browser window (only works with Firefox') # Contrib directories to load on startup. contrib_packages = List(Str, desc='contrib packages to load on startup') # Whether or not to use IPython for the Shell. use_ipython = Bool(desc='use IPython for the embedded shell ' '(if available)') ######################################## # Private traits. _contrib_finder = Instance(HasTraits) #### Traits UI views ###################################################### traits_view = View( Group( Group( Item(name='confirm_delete'), Item(name='show_splash_screen'), Item(name='show_helper_nodes'), Item(name='open_help_in_light_browser'), Item(name='use_ipython'), label='General settings', show_border=True, ), Group( Group( Item('_contrib_finder', style='custom', show_label=False, resizable=True, ), ), label='Contribution settings', show_border=True, ), ), resizable=True ) ###################################################################### # Non-public interface. ###################################################################### def __contrib_finder_default(self): from .contrib_finder import ContribFinder return ContribFinder() ################################################################################ # `MayaviMlabPreferencesPage` class ################################################################################ class MayaviMlabPreferencesPage(PreferencesPage): """ Preferences page for Mayavi. """ #### 'PreferencesPage' interface ########################################## # The page's category (e.g. 'General/Appearance'). The empty string means # that this is a top-level page. category = 'Mayavi' # The page's help identifier (optional). If a help Id *is* provided then # there will be a 'Help' button shown on the preference page. help_id = '' # The page name (this is what is shown in the preferences dialog. name = 'Mlab' # The path to the preferences node that contains the preferences. preferences_path = 'mayavi.mlab' #### Preferences ########################################################## # The mlab backend to use. backend = Enum('auto', 'envisage', 'simple', 'test', desc='the mlab backend to use') # The background color of the renderer. background_color = Tuple(Range(0., 1., 1.), Range(0., 1., 1.), Range(0., 1., 1.), editor=RGBColorEditor, desc='the background color of the scene') # The foreground color of the renderer. foreground_color = Tuple(Range(0., 1., 0.), Range(0., 1., 0.), Range(0., 1., 0.), editor=RGBColorEditor, desc='the foreground color of the scene') # Offscreen rendering. offscreen = Bool(desc='if mlab should use offscreen rendering' ' (no window will show up in this case)') ###################################################################### # Traits UI view. traits_view = View(Group( Item('backend'), Item('background_color'), Item('foreground_color'), Item('offscreen'), ), resizable=True ) mayavi-4.5.0/mayavi/preferences/preference_manager.py0000644000076500000240000001105312747716314023377 0ustar prabhustaff00000000000000"""A preference manager for all mayavi related preferences. The idea behind this module is that it lets the mayavi library/application use the same preferences by managing them no matter if mayavi is used as an application (via envisage3) or as a library. The preferences helpers are divided into different categories for different kinds of preferences. Currently the following are available. - root: for global mayavi preferences of the form 'mayavi.preference'. For more details on the general preferences support in enthought, please read the documentation for apptools.preferences (part of the AppTools package). """ # Author: Prabhu Ramachandran # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. # Standard library imports from os.path import join import pkg_resources # Enthought library imports. from traits.etsconfig.api import ETSConfig from traits.api import HasTraits, Instance from traitsui.api import View, Group, Item from apptools.preferences.api import (ScopedPreferences, IPreferences, PreferencesHelper) # Local imports. from mayavi.preferences.preferences_helpers import ( RootPreferencesHelper, MlabPreferencesHelper ) # The application ID where the preferences are stored. ID = 'mayavi_e3' ################################################################################ # `PreferenceManager` class ################################################################################ class PreferenceManager(HasTraits): # The root preferences helper for preferences of the form # 'mayavi.preference'. root = Instance(PreferencesHelper) # The mlab preferences helper for preferences of the form # 'mayavi.mlab.preference'. mlab = Instance(PreferencesHelper) # The preferences. preferences = Instance(IPreferences) ###################################################################### # Traits UI view. traits_view = View(Group( Group(Item(name='root', style='custom'), show_labels=False, label='Root', show_border=True ), Group(Item(name='mlab', style='custom'), show_labels=False, label='Mlab', show_border=True, ), ), buttons=['OK', 'Cancel'], resizable=True ) ###################################################################### # `HasTraits` interface. ###################################################################### def __init__(self, **traits): super(PreferenceManager, self).__init__(**traits) if 'preferences' not in traits: self._load_preferences() def _preferences_default(self): """Trait initializer.""" return ScopedPreferences() def _root_default(self): """Trait initializer.""" return RootPreferencesHelper(preferences=self.preferences) def _mlab_default(self): """Trait initializer.""" return MlabPreferencesHelper(preferences=self.preferences) ###################################################################### # Private interface. ###################################################################### def _load_preferences(self): """Load the default preferences.""" # Save current application_home. app_home = ETSConfig.get_application_home() # Set it to where the mayavi preferences are temporarily. path = join(ETSConfig.get_application_data(), ID) ETSConfig.application_home = path try: for pkg in ('mayavi.preferences', 'tvtk.plugins.scene'): pref = 'preferences.ini' pref_file = pkg_resources.resource_stream(pkg, pref) preferences = self.preferences default = preferences.node('default/') default.load(pref_file) pref_file.close() finally: # Set back the application home. ETSConfig.application_home = app_home def _preferences_changed(self, preferences): """Setup the helpers if the preferences trait changes.""" for helper in (self.root, ): helper.preferences = preferences ########################################################## # A Global preference manager that all other modules can use. preference_manager = PreferenceManager() mayavi-4.5.0/mayavi/preferences/preference_manager_view.py0000644000076500000240000000477112747716314024442 0ustar prabhustaff00000000000000""" A view for the Mayavi preferences outside of Envisage. """ # Author: Gael Varoquaux # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. # Standard library imports from os.path import join # Enthought library imports. from traits.api import List from apptools.preferences.ui.api import PreferencesManager, \ PreferencesPage from pyface.api import ImageResource from pyface.resource.api import resource_path from apptools.preferences.ui.preferences_node import PreferencesNode # Local imports. from mayavi.preferences.mayavi_preferences_page import \ MayaviRootPreferencesPage, MayaviMlabPreferencesPage from mayavi.preferences.preference_manager import \ preference_manager ################################################################################ # `PreferenceManagerView` class ################################################################################ class PreferenceManagerView(PreferencesManager): """ A preference manager UI for Mayavi, to be used outside of Envisage. """ # Path used to search for images _image_path = [join(resource_path(), 'images'), ] # The icon of the dialog icon = ImageResource('preferences.ico', search_path=_image_path) # The preference pages displayed pages = List(PreferencesPage) def _pages_default(self): return [ MayaviRootPreferencesPage( preferences=preference_manager.root.preferences), MayaviMlabPreferencesPage( preferences=preference_manager.mlab.preferences), ] def dialog_view(self): """ Poor-man's subclassing of view to overload size. """ view = self.trait_view() view.width = 0.7 view.height = 0.5 view.title = 'Mayavi preferences' view.icon = self.icon ui = self.edit_traits( view=view, scrollable=True, id='mayavi.preferences.preference_view') return ui def _get_root(self): """ Subclass the root getter, to work outside of envisage, with no well-defined root. """ root = PreferencesNode(page=self.pages[0]) for page in self.pages: root.append(PreferencesNode(page=page)) return root def apply(self): super(PreferenceManagerView, self).apply() for page in self.pages: page.preferences.save() preference_manager_view = PreferenceManagerView() mayavi-4.5.0/mayavi/preferences/preferences.ini0000644000076500000240000000043512747716314022221 0ustar prabhustaff00000000000000[mayavi] confirm_delete = True show_splash_screen = True show_helper_nodes = True open_help_in_light_browser = True use_ipython = False contrib_packages = '[]' [mayavi.mlab] backend = 'auto' background_color = "(0.5, 0.5, 0.5)" foreground_color = "(1.0, 1.0, 1.0)" offscreen = False mayavi-4.5.0/mayavi/preferences/preferences_helpers.py0000644000076500000240000001137612747716314023622 0ustar prabhustaff00000000000000"""Various preference helpers for the mayavi preferences. """ # Author: Prabhu Ramachandran # Copyright (c) 2008-2015, Enthought, Inc. # License: BSD Style. # Enthought library imports from traits.api import (Bool, Enum, Tuple, Range, List, Str, Instance, HasTraits) from traitsui.api import (View, Group, Item, RGBColorEditor, InstanceEditor) from apptools.preferences.api import PreferencesHelper ################################################################################ # `RootPreferencesHelper` class ################################################################################ class RootPreferencesHelper(PreferencesHelper): # The preferences path for which we use. preferences_path = 'mayavi' ###################################################################### # Our preferences. # Specifies if the nodes on the tree may be deleted without a # confirmation or not. If True the user will be prompted before # the object is deleted. If it is False then the user will not be # prompted. confirm_delete = Bool(desc='if the user is prompted before' ' a node on the MayaVi tree is deleted') # Specifies if the splash screen is shown when mayavi starts. show_splash_screen = Bool(desc='if the splash screen is shown at' ' startup') # Specifies if the adder nodes are shown on the mayavi tree view. show_helper_nodes = Bool(desc='if the helper (adder) nodes are shown' ' on the tree view') # Specifies if the adder nodes are shown on the mayavi tree view. open_help_in_light_browser = Bool( desc='if the help pages are opened in a chromeless' ' browser window (only works with Firefox)') # Contrib directories to load on startup. contrib_packages = List(Str, desc='contrib packages to load on startup') # Whether or not to use IPython for the Shell. use_ipython = Bool(desc='use IPython for the embedded shell ' '(if available)') ######################################## # Private traits. _contrib_finder = Instance(HasTraits) ###################################################################### # Traits UI view. traits_view = View( Group( Item(name='confirm_delete'), Item(name='show_splash_screen'), Item(name='show_helper_nodes'), Item(name='open_help_in_light_browser'), Item('_contrib_finder', show_label=False, editor=InstanceEditor(label='Find contributions'), ) ), resizable=True ) ###################################################################### # Non-public interface. ###################################################################### def __contrib_finder_default(self): from .contrib_finder import ContribFinder return ContribFinder() ################################################################################ # `MlabPreferencesHelper` class ################################################################################ class MlabPreferencesHelper(PreferencesHelper): # The preferences path for which we use. preferences_path = 'mayavi.mlab' ###################################################################### # Our preferences. # The mlab backend to use. backend = Enum('auto', 'envisage', 'simple', 'test', desc='the mlab backend to use') # The background color of the renderer. background_color = Tuple(Range(0., 1.), Range(0., 1.), Range(0., 1.), editor=RGBColorEditor, desc='the background color of the scene') # The foreground color of the renderer. foreground_color = Tuple(Range(0., 1.), Range(0., 1.), Range(0., 1.), editor=RGBColorEditor, desc='the foreground color of the scene') # Offscreen rendering. offscreen = Bool(desc='if mlab should use offscreen rendering' ' (no window will show up in this case)') ###################################################################### # Traits UI view. traits_view = View(Group( Item('backend'), Item('background_color'), Item('foreground_color'), Item('offscreen') ), resizable=True ) mayavi-4.5.0/mayavi/scripts/0000755000076500000240000000000012747722127016402 5ustar prabhustaff00000000000000mayavi-4.5.0/mayavi/scripts/__init__.py0000644000076500000240000000013712747716314020515 0ustar prabhustaff00000000000000# Author: Prabhu Ramachandran # Copyright (c) 2005-2007, Enthought, Inc. # License: BSD Style. mayavi-4.5.0/mayavi/scripts/mayavi20000755000076500000240000000011112747716314017672 0ustar prabhustaff00000000000000#!/usr/bin/env python from mayavi.scripts import mayavi2 mayavi2.main() mayavi-4.5.0/mayavi/scripts/mayavi2.py0000644000076500000240000005150312747716314020331 0ustar prabhustaff00000000000000#!/usr/bin/env python """The Mayavi application standalone script. This script parses the command line arguments and launches Mayavi2 suitably. It is meant to be used by those using Mayavi2 as a standalone application. Mayavi2: http://docs.enthought.com/mayavi/mayavi/overview.html """ # Author: Prabhu Ramachandran # Copyright (c) 2005-2015, Enthought, Inc. # License: BSD Style. from __future__ import print_function # Standard library imports. import sys import types import getopt import logging from os.path import splitext, exists, join, abspath # Local imports. from mayavi.__version__ import __version__ from mayavi.scripts.util import get_data_dir # Globals. OFFSCREEN = False # A global mayavi instance so we can close it correctly. mayavi = None ########################################################################### # Utility functions. ########################################################################### def usage (): msg="""Usage:\n\nmayavi2 [options] ... [arg1] [arg2] ... Where arg1, arg2 ... are optional file names that correspond to saved Mayavi2 visualizations (file.mv2) or Mayavi2 scripts (file.py) or any data files supported by Mayavi. Valid options are one or more of the following: -d datafile.ext --data datafile.ext datafile.ext can be any of the supported data file formats. This includes VTK file formats (*.vtk, *.xml, *.vt[i,p,r,s,u], *.pvt[i,p,r,s,u]), VRML2 (*.wrl), 3D Studio (*.3ds), PLOT3D (*.xyz), STL, BYU, RAW, PLY, PDB, SLC, FACET, OBJ, AVSUCD (*.inp), GAMBIT (*.neu), Exodus (*.exii), PNG, JPEG, BMP, PNM, DCM, DEM, MHA, MHD, MINC, XIMG, TIFF, and various others that are supported. datafile.ext can also be a source object not associated with a file, for example ParametricSurface or PointLoad will load the corresponding data sources into Mayavi. --filter filter-name -f filter-name The passed filter name is loaded with respect to the current source/filter object. The filter name must be a valid one if not you will get an error message. If the filter is specified as 'package.sub.filter.SomeFilter' then the filter (`SomeFilter`) is imported from 'package.sub.filter'. Standard modules provided with mayavi2 do not need the full path specification. Example:: mayavi2 -d data.vtk -f ExtractVectorNorm -f m2_user_filters.TestFilter In this example 'ExtractVectorNorm' is a standard filter and 'm2_user_filters.TestFilter' is some user defined filter. -m module-name --module module-name The passed module name is loaded in the current ModuleManager. The module name must be a valid one if not you will get an error message. If a module is specified as 'package.sub.module.SomeModule' then the module (`SomeModule`) is imported from 'package.sub.module'. Standard modules provided with mayavi2 do not need the full path specification. Example:: mayavi2 -d data.vtk -m Outline -m m2_user_modules.TestModule In this example 'Outline' is a standard module and 'm2_user_modules.TestModule' is some user defined module. -M --module-mgr Starts up a new module manager on the Mayavi pipeline. -n --new-scene Creates a new TVTK scene. Any options passed after this will apply to this newly created scene. -o --offscreen Run Mayavi in offscreen mode without any graphical user interface. This is most useful for scripts that need to render images offscreen. -x script-file --exec script-file This executes the given script in a namespace where we guarantee that the name 'mayavi' is Mayavi's script instance -- just like in the embedded Python interpreter. **WARNING**: Note that this uses `execfile`, so please note that this can be dangerous if the script does something nasty! -s python-expression --set python-expression Execute the expression on the last created object. For example, lets say the previous object was a module. If you want to set the color of that object and save the scene you may do:: $ mayavi2 [...] -m Outline -s"actor.property.color = (1,0,0)" \ -s "scene.save('test.png', size=(800, 800))" You should use quotes for the expression. **WARNING**: Note that this uses `exec`, so please note that this can be dangerous! -z saved-visualization-file --viz saved-visualization-file --visualization saved-visualization-file Loads a previously saved Mayavi2 visualization file passed as the argument. -t --test Runs the mayavi2 test suite and exits. If run as such, this runs both the TVTK and Mayavi2 unittests. If any additional arguments are passed they are passed along to the test runner. So this may be used to run other tests as well. For example:: mayavi2 -t apptools.persistence This will run just the tests inside the apptools.persistence package. You can also specify a directory with test files to run with this, for example:: mayavi2 -t relative_path_to/integrationtests/mayavi will run the integration tests from the mayavi sources. -v --verbose Prints verbose logs on the console. -V --version Prints the Mayavi version. -h --help Prints this help message. Examples:: mayavi2 test.mv2 (or mayavi2 -z test.mv2) mayavi2 test.py (or mayavi2 -x test.py) mayavi2 test.mv2 other.mv2 (or mayavi2 -z test.mv2 -z other.mv2) mayavi2 -d test.vtk -m Axes -m GridPlane \\ -f Threshold -m IsoSurface \\ -n -d heart.vtk -m Outline -m ContourGridPlane """ return msg def parse_cmd_line(arguments): """Returns the options and arguments parsed via getopts. Due to the special needs (order of args is important and repeated options will be supplied) of this command line parser we must use getopts and not optparse. Input Arguments: arguments -- This can be either a list of arguments as in sys.argv[1:] or a string that is similar to the one passed on the command line. If it is a string the string is split to create a list of arguments. """ if type(arguments) is str: arguments = arguments.split() options = "d:m:f:z:x:s:nMvo" long_opts = ['data=', 'module=', 'filter=', 'visualization=', 'viz=', 'exec=', 'set=', 'verbose', 'module-mgr', 'new-scene', 'offscreen'] try: opts, args = getopt.getopt (arguments, options, long_opts) except getopt.error as msg: print(msg) print(usage()) print('-'*70) print(msg) sys.exit (1) return opts, args def _get_non_file_sources(): """Returns a dict indexed on the name of non-file related sources ids with the value being the corresponding metadata object. """ from mayavi.core.registry import registry data = {} for src in registry.sources: if len(src.extensions) == 0: name = src.id[:-6] data[name] = src return data def process_cmd_line(app, opts, args): """ Processes the passed command line arguments. Input Arguments: app -- A Mayavi application instance. opts -- The list of options returned by getopt. args -- The remaining arguments returned by getopt. """ from mayavi.core.common import error, exception from tvtk.common import camel2enthought sources = _get_non_file_sources() script = app.script last_obj = None # Start a new scene by default if there is none currently and none # was specified at the start of the command line arguments. if script.engine.current_scene is None: new_scene = False if len(opts) == 0: if len(args) == 0: new_scene = True elif (opts[0][0] not in ('-n', '--new-scene', '-z', '--visualization', '--viz', '-x', '--exec')): new_scene = True if new_scene: last_obj = script.new_scene() for o, a in opts: if o in ('-d', '--data'): base, ext = splitext(a) if exists(a): last_obj = script.open(a) elif a in sources: md = sources[a] src = md.get_callable()() script.add_source(src) last_obj = src else: error("File/Source %s does not exist!"%a) return if o in ('-m', '--module'): if '.' in a: idx = a.rfind('.') modname = a[:idx] classname = a[idx+1:] else: modname = 'mayavi.modules.%s'%camel2enthought(a) classname = a try: mod = __import__(modname, globals(), locals(), [classname]) except ImportError as msg: exception(str(msg)) return else: m = getattr(mod, classname)() if classname == 'Labels': m.object = script.engine.current_object script.add_module(m) last_obj = m if o in ('-f', '--filter'): if '.' in a: idx = a.rfind('.') modname = a[:idx] classname = a[idx+1:] else: if a[:12] == 'UserDefined:': modname = 'mayavi.filters.user_defined' classname = 'UserDefined' # Create the wrapped filter. fname = a[12:] from tvtk.api import tvtk try: extra = getattr(tvtk, fname)() except (AttributeError, TypeError): # Don't worry about errors. extra = None else: modname = 'mayavi.filters.%s'%camel2enthought(a) classname = a extra = None try: mod = __import__(modname, globals(), locals(), [classname]) except ImportError as msg: exception(str(msg)) return else: klass = getattr(mod, classname) if classname != 'UserDefined': f = klass() else: if extra is not None: f = klass(filter=extra) else: f = klass() f.setup_filter() script.add_filter(f) last_obj = f if o in ('-M', '--module-mgr'): from mayavi.core.module_manager \ import ModuleManager mm = ModuleManager() script.add_filter(mm) last_obj = mm if o in ('-n', '--new-scene'): script.new_scene() e = script.engine s = e.scenes[-1] e.set(current_scene=s, current_object=s) last_obj = s if o in ('-x', '--exec' ): err = run_script(script, a) if err: # stop processing options. return if o in ('-s', '--set'): try: stmt = 'last_obj.' + a exec(stmt, locals(), globals()) except Exception as msg: exception(str(msg)) if o in ('-z', '--visualization', '--viz'): script.load_visualization(a) # for remaining arguments simply load saved visualizations. for arg in args: base, ext = splitext (arg) if ext == '.mv2': script.load_visualization(arg) elif ext == '.py': err = run_script(script, arg) if err: # stop processing arguments. return else: script.open(arg) def run_script(mayavi, script_name): """Execfiles a given script. The name `mayavi` is bound to the mayavi script instance just like in the embedded interpreter. `script_name` is the name of the script to execute. Note that this function uses `execfile`. You should be careful when using this. It returns `False` if everything was OK and `True` if not. """ from mayavi.core.common import exception g = sys.modules['__main__'].__dict__ if 'mayavi' not in g: g['mayavi'] = mayavi g['engine'] = mayavi.engine g['__file__'] = script_name error = False # Do execfile try: # If we don't pass globals twice we get NameErrors and nope, # using exec open(script_name).read() does not fix it. exec(compile(open(script_name).read(), script_name, 'exec'), g, g) except Exception as msg: exception(str(msg)) error = True return error # This runs the runtests script and sends any args to it. if ('-t' in sys.argv[1:]) or ('--test' in sys.argv[1:]): from mayavi.tests import runtests for arg in ('-t', '--test'): if arg in sys.argv[1:]: sys.argv.remove(arg) runtests.main() # If the user just wants help messages. Print them before importing # any of the big modules. if ('-h' in sys.argv[1:]) or ('--help' in sys.argv[1:]): print(usage()) sys.exit(0) if ('-V' in sys.argv[1:]) or ('--version' in sys.argv[1:]): print('Mayavi %s'%__version__) sys.exit(0) for opt, arg in parse_cmd_line(sys.argv[1:])[0]: if opt in ('-o', '--offscreen'): OFFSCREEN = True break # Create opt and arg to be able to delete them even if the previous loop # is empty. opt, arg = None, None del opt, arg # The vtk module is imported by the engine, so mayavi is never going to # start without it. Let us capture the error early, and give a meaningful # error message try: import vtk except ImportError as m: msg = '%s\n%s\nDo you have vtk installed properly?\n' \ 'VTK (and build instructions) can be obtained from http://www.vtk.org\n' \ % (m, '_'*80) raise ImportError(msg) # Try forcing the use of wx 2.8 before any other import. import sys if not 'wx' in sys.modules: try: # Try forcing the use of wx 2.8 from traits.etsconfig.api import ETSConfig if ETSConfig.toolkit in ('wx', ''): import wxversion wxversion.ensureMinimal('2.8') except ImportError: """ wxversion not installed """ # Importing here to avoid time-consuming import when user only wanted # version/help information. try: from mayavi.plugins.app import Mayavi, setup_logger except ImportError as m: msg = '''%s %s Could not load envisage. You might have a missing dependency. Do you have the EnvisageCore and EnvisagePlugins installed? If you installed Mayavi with easy_install, try 'easy_install '. 'easy_install Mayavi[app]' will also work. If you performed a source checkout and installed via 'python setup.py develop', be sure to run the same command in the EnvisageCore and EnvisagePlugins folders. If these packages appear to be installed, check that your numpy and configobj are installed and working. If you need numpy, 'easy_install numpy' will install numpy. Similarly, 'easy_install configobj' will install configobj. ''' % (m, '_'*80) raise ImportError(msg) ########################################################################## # `MayaviApp` class ########################################################################## class MayaviApp(Mayavi): def parse_command_line(self, argv): """Parse command line options.""" # Parse and store command line options to process once app has # started in `run`. options, args = parse_cmd_line(argv) self.cmd_line_opts = (options, args) # If the verbose option is set, change the log mode. for opts, args in options: if opts in ('-v', '--verbose'): self.log_mode = logging.DEBUG break def run(self): """Process the command line options and setup mayavi as per the users needs. """ options, args = self.cmd_line_opts # Process the options. process_cmd_line(self, options, args) ################################################################################ # `MayaviOffscreen` class. ################################################################################ class MayaviOffscreen(MayaviApp): """ The mayavi application used for offscreen rendering. """ def _script_default(self): from mayavi.plugins.script import Script from mayavi.core.off_screen_engine import OffScreenEngine engine = OffScreenEngine() engine.start() s = Script(engine=engine) return s def setup_logger(self): from traits.etsconfig.api import ETSConfig path = join(ETSConfig.application_data, 'mayavi_e3', 'mayavi.log') path = abspath(path) logger = logging.getLogger() setup_logger(logger, path, mode=self.log_mode) def main(self, argv=None): if argv is None: argv = [] self.parse_command_line(argv) self.setup_logger() self.run() ########################################################################## # Helper functions ########################################################################## def get_mayavi_script_instance(): """Return the mayavi Script instance from the first available set of envisage engines registered in the registry. """ from mayavi.core.registry import registry from mayavi.plugins.envisage_engine import EnvisageEngine from mayavi.plugins.script import Script for name, engine in registry.engines.items(): if isinstance(engine, EnvisageEngine): return engine.window.get_service(Script) return def contains_mayavi(namespace): """Returns if the given namespace contains a 'mayavi' name bound to a mayavi script instance. """ from mayavi.plugins.script import Script if 'mayavi' in namespace: if isinstance(namespace.get('mayavi'), Script): return True return False def standalone(func): """A decorator to run a function from within mayavi. This lets users write a normal Python function and have that run from within mayavi. It implicitly assumes that the name 'mayavi' refers the the Script instance and will overwrite it if not. """ def wrapper(*args, **kw): script = get_mayavi_script_instance() if script is None and mayavi is not None: script = mayavi.script if script is None: def caller(script): """Callback that runs the function inside the mayavi app.""" # Bind the 'mayavi' name to the script instance func.__globals__['mayavi'] = script # Run the function in the event loop. g = script.window.application.gui g.invoke_later(func, *args, **kw) # Start up mayavi and invoke caller when the script instance # is available. m = Mayavi() m.on_trait_change(caller, 'script') # Run the mayavi app. m.main() else: ns = func.__globals__ if not contains_mayavi(ns): # Bind the 'mayavi' name to the script instance ns['mayavi'] = script # Now run the function. func(*args, **kw) return wrapper def main(): """This starts up the mayavi2 application. """ global mayavi # Make sure '.' is in sys.path if '' not in sys.path: sys.path.insert(0, '') # Start the app. if OFFSCREEN: mayavi = MayaviOffscreen() else: from traits.etsconfig.api import ETSConfig # Check that we have a traits backend installed from traitsui.toolkit import toolkit toolkit() # This forces the selection of a toolkit. if ETSConfig.toolkit in ('null', ''): raise ImportError('''Could not import backend for traits ________________________________________________________________________________ Make sure that you have either the TraitsBackendWx or the TraitsBackendQt projects installed. If you installed Mayavi with easy_install, try easy_install . easy_install Mayavi[app] will also work. If you performed a source checkout, be sure to run 'python setup.py install' in Traits, TraitsGUI, and the Traits backend of your choice. Also make sure that either wxPython or PyQT is installed. wxPython: http://www.wxpython.org/ PyQT: http://www.riverbankcomputing.co.uk/software/pyqt/intro ''' ) mayavi = MayaviApp() mayavi.main(sys.argv[1:]) def close(): """ This closes the mayavi2 application. """ if mayavi is not None and not OFFSCREEN: mayavi.window.close() if __name__ == '__main__': main() mayavi-4.5.0/mayavi/scripts/util.py0000644000076500000240000000163112747716314017733 0ustar prabhustaff00000000000000""" This module collects utility code that does not import any significant envisage/mayavi code but is useful for scripts that use mayavi. """ # Author: Prabhu Ramachandran # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. import sys from os.path import join, abspath, dirname, isdir def get_data_dir( example_filename ): """ Get the data directory while running an example script. Parameters: ----------- example_filename: Path absolute path of the example script """ if 'mayavi2' in sys.argv[0]: if isdir('data'): return 'data' filename = sys.argv[-1] dir_name = join(dirname(abspath(filename)), 'data') if isdir(dir_name): return dir_name raise Exception('Run example from the example directory') else: return join(dirname(example_filename), 'data') mayavi-4.5.0/mayavi/sources/0000755000076500000240000000000012747722127016376 5ustar prabhustaff00000000000000mayavi-4.5.0/mayavi/sources/__init__.py0000644000076500000240000000013212747716314020504 0ustar prabhustaff00000000000000# Author: Prabhu Ramachandran # Copyright (c) 2005, Enthought, Inc. # License: BSD Style. mayavi-4.5.0/mayavi/sources/api.py0000644000076500000240000000153612747716314017527 0ustar prabhustaff00000000000000""" Defines the publicly accessible MayaVi2 sources. """ # Author: Frederic Petit, Prabhu Ramachandran # Copyright (c) 2007-2015, Enthought, Inc. # License: BSD Style. from .array_source import ArraySource from .builtin_image import BuiltinImage from .builtin_surface import BuiltinSurface from .chaco_reader import ChacoReader from .image_reader import ImageReader from .parametric_surface import ParametricSurface from .plot3d_reader import PLOT3DReader from .point_load import PointLoad from .poly_data_reader import PolyDataReader from .three_ds_importer import ThreeDSImporter from .vrml_importer import VRMLImporter from .volume_reader import VolumeReader from .vtk_data_source import VTKDataSource from .vtk_file_reader import VTKFileReader from .vtk_xml_file_reader import VTKXMLFileReader from .unstructured_grid_reader import UnstructuredGridReader mayavi-4.5.0/mayavi/sources/array_source.py0000644000076500000240000002504512747716314021455 0ustar prabhustaff00000000000000"""A simple source that allows one to view a suitably shaped numpy array as ImageData. This supports both scalar and vector data. """ # Author: Prabhu Ramachandran # Copyright (c) 2005, Enthought, Inc. # License: BSD Style. # Standard library imports. import numpy from vtk.util import vtkConstants # Enthought library imports from traits.api import (Instance, Trait, Str, Bool, Button, DelegatesTo, List, Int) from traitsui.api import View, Group, Item from tvtk.api import tvtk from tvtk import array_handler from tvtk.common import is_old_pipeline # Local imports from mayavi.core.source import Source from mayavi.core.pipeline_info import PipelineInfo def _check_scalar_array(obj, name, value): """Validates a scalar array passed to the object.""" if value is None: return None arr = numpy.asarray(value) assert len(arr.shape) in [2,3], "Scalar array must be 2 or 3 dimensional" vd = obj.vector_data if vd is not None: assert vd.shape[:-1] == arr.shape, \ "Scalar array must match already set vector data.\n"\ "vector_data.shape = %s, given array shape = %s"%(vd.shape, arr.shape) return arr _check_scalar_array.info = 'a 2D or 3D numpy array' def _check_vector_array(obj, name, value): """Validates a vector array passed to the object.""" if value is None: return None arr = numpy.asarray(value) assert len(arr.shape) in [3,4], "Vector array must be 3 or 4 dimensional" assert arr.shape[-1] == 3, \ "The vectors must be three dimensional with `array.shape[-1] == 3`" sd = obj.scalar_data if sd is not None: assert arr.shape[:-1] == sd.shape, \ "Vector array must match already set scalar data.\n"\ "scalar_data.shape = %s, given array shape = %s"%(sd.shape, arr.shape) return arr _check_vector_array.info = 'a 3D or 4D numpy array with shape[-1] = 3' ###################################################################### # 'ArraySource' class. ###################################################################### class ArraySource(Source): """A simple source that allows one to view a suitably shaped numpy array as ImageData. This supports both scalar and vector data. """ # The scalar array data we manage. scalar_data = Trait(None, _check_scalar_array, rich_compare=False) # The name of our scalar array. scalar_name = Str('scalar') # The vector array data we manage. vector_data = Trait(None, _check_vector_array, rich_compare=False) # The name of our vector array. vector_name = Str('vector') # The spacing of the points in the array. spacing = DelegatesTo('change_information_filter', 'output_spacing', desc='the spacing between points in array') # The origin of the points in the array. origin = DelegatesTo('change_information_filter', 'output_origin', desc='the origin of the points in array') # Fire an event to update the spacing and origin. This # is here for backwards compatability. Firing this is no # longer needed. update_image_data = Button('Update spacing and origin') # The image data stored by this instance. image_data = Instance(tvtk.ImageData, (), allow_none=False) # Use an ImageChangeInformation filter to reliably set the # spacing and origin on the output change_information_filter = Instance(tvtk.ImageChangeInformation, args=(), kw={'output_spacing' : (1.0, 1.0, 1.0), 'output_origin' : (0.0, 0.0, 0.0)}) # Should we transpose the input data or not. Transposing is # necessary to make the numpy array compatible with the way VTK # needs it. However, transposing numpy arrays makes them # non-contiguous where the data is copied by VTK. Thus, when the # user explicitly requests that transpose_input_array is false # then we assume that the array has already been suitably # formatted by the user. transpose_input_array = Bool(True, desc='if input array should be transposed (if on VTK will copy the input data)') # Information about what this object can produce. output_info = PipelineInfo(datasets=['image_data']) # Specify the order of dimensions. The default is: [0, 1, 2] dimensions_order = List(Int, [0, 1, 2]) # Our view. view = View(Group(Item(name='transpose_input_array'), Item(name='scalar_name'), Item(name='vector_name'), Item(name='spacing'), Item(name='origin'), show_labels=True) ) ###################################################################### # `object` interface. ###################################################################### def __init__(self, **traits): # Set the scalar and vector data at the end so we pop it here. sd = traits.pop('scalar_data', None) vd = traits.pop('vector_data', None) # Now set the other traits. super(ArraySource, self).__init__(**traits) self.configure_input_data(self.change_information_filter, self.image_data) # And finally set the scalar and vector data. if sd is not None: self.scalar_data = sd if vd is not None: self.vector_data = vd self.outputs = [ self.change_information_filter.output ] self.on_trait_change(self._information_changed, 'spacing,origin') def __get_pure_state__(self): d = super(ArraySource, self).__get_pure_state__() d.pop('image_data', None) return d ###################################################################### # ArraySource interface. ###################################################################### def update(self): """Call this function when you change the array data in-place.""" d = self.image_data d.modified() pd = d.point_data if self.scalar_data is not None: pd.scalars.modified() if self.vector_data is not None: pd.vectors.modified() self.change_information_filter.update() self.data_changed = True ###################################################################### # Non-public interface. ###################################################################### def _image_data_changed(self, value): self.configure_input_data(self.change_information_filter, value) def _scalar_data_changed(self, data): img_data = self.image_data if data is None: img_data.point_data.scalars = None self.data_changed = True return dims = list(data.shape) if len(dims) == 2: dims.append(1) # set the dimension indices dim0, dim1, dim2 = self.dimensions_order img_data.origin = tuple(self.origin) img_data.dimensions = tuple(dims) img_data.extent = 0, dims[dim0]-1, 0, dims[dim1]-1, 0, dims[dim2]-1 if is_old_pipeline(): img_data.update_extent = 0, dims[dim0]-1, 0, dims[dim1]-1, 0, dims[dim2]-1 else: update_extent = [0, dims[dim0]-1, 0, dims[dim1]-1, 0, dims[dim2]-1] self.change_information_filter.set_update_extent(update_extent) if self.transpose_input_array: img_data.point_data.scalars = numpy.ravel(numpy.transpose(data)) else: img_data.point_data.scalars = numpy.ravel(data) img_data.point_data.scalars.name = self.scalar_name # This is very important and if not done can lead to a segfault! typecode = data.dtype if is_old_pipeline(): img_data.scalar_type = array_handler.get_vtk_array_type(typecode) img_data.update() # This sets up the extents correctly. else: filter_out_info = self.change_information_filter.get_output_information(0) img_data.set_point_data_active_scalar_info(filter_out_info, array_handler.get_vtk_array_type(typecode), -1) img_data.modified() img_data.update_traits() self.change_information_filter.update() # Now flush the mayavi pipeline. self.data_changed = True def _vector_data_changed(self, data): img_data = self.image_data if data is None: img_data.point_data.vectors = None self.data_changed = True return dims = list(data.shape) if len(dims) == 3: dims.insert(2, 1) data = numpy.reshape(data, dims) img_data.origin = tuple(self.origin) img_data.dimensions = tuple(dims[:-1]) img_data.extent = 0, dims[0]-1, 0, dims[1]-1, 0, dims[2]-1 if is_old_pipeline(): img_data.update_extent = 0, dims[0]-1, 0, dims[1]-1, 0, dims[2]-1 else: self.change_information_filter.update_information() update_extent = [0, dims[0]-1, 0, dims[1]-1, 0, dims[2]-1] self.change_information_filter.set_update_extent(update_extent) sz = numpy.size(data) if self.transpose_input_array: data_t = numpy.transpose(data, (2, 1, 0, 3)) else: data_t = data img_data.point_data.vectors = numpy.reshape(data_t, (sz/3, 3)) img_data.point_data.vectors.name = self.vector_name if is_old_pipeline(): img_data.update() # This sets up the extents correctly. else: img_data.modified() img_data.update_traits() self.change_information_filter.update() # Now flush the mayavi pipeline. self.data_changed = True def _scalar_name_changed(self, value): if self.scalar_data is not None: self.image_data.point_data.scalars.name = value self.data_changed = True def _vector_name_changed(self, value): if self.vector_data is not None: self.image_data.point_data.vectors.name = value self.data_changed = True def _transpose_input_array_changed(self, value): if self.scalar_data is not None: self._scalar_data_changed(self.scalar_data) if self.vector_data is not None: self._vector_data_changed(self.vector_data) def _information_changed(self): self.change_information_filter.update() self.data_changed = True mayavi-4.5.0/mayavi/sources/builtin_image.py0000644000076500000240000001015512747716314021563 0ustar prabhustaff00000000000000""" A module that offers lots of VTK image data sources """ #Author: Suyog Dutt Jain # Prabhu Ramachandran # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import Instance, Enum, Dict, Str from traitsui.api import View, Item, Group from tvtk.api import tvtk # Local imports from mayavi.core.source import Source from mayavi.core.pipeline_info import PipelineInfo ###################################################################### # `BuiltinImage` class. ###################################################################### class BuiltinImage(Source): # The version of this class. Used for persistence. __version__ = 0 # Flag to set the image data type. source = Enum('ellipsoid','gaussian','grid','mandelbrot','noise', 'sinusoid','rt_analytic', desc='which image data source to be used') # Define the trait 'data_source' whose value must be an instance of # type ImageAlgorithm data_source = Instance(tvtk.ImageAlgorithm, allow_none=False, record=True) # Information about what this object can produce. output_info = PipelineInfo(datasets=['image_data'], attribute_types=['any'], attributes=['any']) # Create the UI for the traits. view = View(Group(Item(name='source'), Item(name='data_source', style='custom', resizable=True), label='Image Source', show_labels=False), resizable=True) ######################################## # Private traits. # A dictionary that maps the source names to instances of the # image data objects. _source_dict = Dict(Str, Instance(tvtk.ImageAlgorithm, allow_none=False)) ###################################################################### # `object` interface ###################################################################### def __init__(self, **traits): # Call parent class' init. super(BuiltinImage, self).__init__(**traits) # Initialize the source to the default mode's instance from # the dictionary if needed. if 'source' not in traits: self._source_changed(self.source) def __set_pure_state__(self, state): self.source = state.source super(BuiltinImage, self).__set_pure_state__(state) def has_output_port(self): """ Return True as the data source has output port.""" return True def get_output_object(self): """ Return the data source output port.""" return self.data_source.output_port ###################################################################### # Non-public methods. ###################################################################### def _source_changed(self, value): """This method is invoked (automatically) when the `function` trait is changed. """ self.data_source = self._source_dict[self.source] def _data_source_changed(self, old, new): """This method is invoked (automatically) when the image data source is changed .""" self.outputs = [self.data_source.output] if old is not None: old.on_trait_change(self.render, remove=True) new.on_trait_change(self.render) def __source_dict_default(self): """The default _source_dict trait.""" sd = { 'ellipsoid':tvtk.ImageEllipsoidSource(), 'gaussian':tvtk.ImageGaussianSource(), 'grid':tvtk.ImageGridSource(), 'mandelbrot':tvtk.ImageMandelbrotSource(), 'noise':tvtk.ImageNoiseSource(), 'sinusoid':tvtk.ImageSinusoidSource(), } if hasattr(tvtk, 'RTAnalyticSource'): sd['rt_analytic'] = tvtk.RTAnalyticSource() else: sd['rt_analytic'] = tvtk.ImageNoiseSource() return sd mayavi-4.5.0/mayavi/sources/builtin_surface.py0000644000076500000240000001062112747716314022127 0ustar prabhustaff00000000000000""" A module that allows a user to create one of several standard VTK poly data sources. """ #Author: Suyog Dutt Jain # Prabhu Ramachandran # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import Instance, Enum, Dict, Str from traitsui.api import View, Item, Group from tvtk.api import tvtk # Local imports from mayavi.core.source import Source from mayavi.core.pipeline_info import PipelineInfo ###################################################################### # `BuiltinSurface` class. ###################################################################### class BuiltinSurface(Source): # The version of this class. Used for persistence. __version__ = 0 # Flag to set the poly data type. source = Enum('arrow','cone','cube','cylinder','disk','earth','line', 'outline','plane','point', 'polygon','sphere', 'superquadric','textured sphere', 'glyph2d', desc='which poly data source to be used') # Define the trait 'data_source' whose value must be an instance of # type PolyData data_source = Instance(tvtk.PolyDataAlgorithm, allow_none=False, record=True) # Information about what this object can produce. output_info = PipelineInfo(datasets=['poly_data'], attribute_types=['any'], attributes=['any']) # Create the UI for the traits. view = View(Group(Item(name='source'), Item(name='data_source', style='custom', resizable=True), label='Surface Source', show_labels=False), resizable=True) ######################################## # Private traits. # A dictionary that maps the source names to instances of the # poly data sources. _source_dict = Dict(Str, Instance(tvtk.PolyDataAlgorithm, allow_none=False)) ###################################################################### # `object` interface ###################################################################### def __init__(self, **traits): # Call parent class' init. super(BuiltinSurface, self).__init__(**traits) # Initialize the source to the default mode's instance from # the dictionary if needed. if 'source' not in traits: self._source_changed(self.source) def __set_pure_state__(self, state): self.source = state.source super(BuiltinSurface, self).__set_pure_state__(state) def has_output_port(self): """ Return True as the data source has output port.""" return True def get_output_object(self): """ Return the data source output port.""" return self.data_source.output_port ###################################################################### # Non-public methods. ###################################################################### def _source_changed(self, value): """This method is invoked (automatically) when the `source` trait is changed. """ self.data_source = self._source_dict[self.source] def _data_source_changed(self, old, new): """This method is invoked (automatically) when the poly data source is changed .""" self.outputs = [self.data_source.output] if old is not None: old.on_trait_change(self.render, remove=True) new.on_trait_change(self.render) def __source_dict_default(self): """Default value for source dict.""" sd = {'arrow':tvtk.ArrowSource(), 'cone':tvtk.ConeSource(), 'cube':tvtk.CubeSource(), 'cylinder':tvtk.CylinderSource(), 'disk':tvtk.DiskSource(), 'earth':tvtk.EarthSource(), 'line':tvtk.LineSource(), 'outline':tvtk.OutlineSource(), 'plane':tvtk.PlaneSource(), 'point':tvtk.PointSource(), 'polygon':tvtk.RegularPolygonSource(), 'sphere':tvtk.SphereSource(), 'superquadric':tvtk.SuperquadricSource(), 'textured sphere':tvtk.TexturedSphereSource(), 'glyph2d': tvtk.GlyphSource2D()} return sd mayavi-4.5.0/mayavi/sources/chaco_reader.py0000644000076500000240000000512712747716314021355 0ustar prabhustaff00000000000000"""A Chaco file reader. """ # Author: Suyog Dutt Jain # Copyright (c) 2009, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import Instance, Str from traitsui.api import View, Group, Item from tvtk.api import tvtk # Local imports. from mayavi.core.source import Source from mayavi.core.pipeline_info import PipelineInfo ######################################################################## # `ChacoReader` class ######################################################################## class ChacoReader(Source): """A Chaco reader. """ # The version of this class. Used for persistence. __version__ = 0 base_name = Str('', desc='basename of the Chaco files') # The VTK data file reader. reader = Instance(tvtk.ChacoReader, args=(), allow_none=False, record=True) # Information about what this object can produce. output_info = PipelineInfo(datasets=['unstructured_grid']) ######################################## # View related code. # Our view. view = View(Group(Item(name='reader', style='custom', resizable=True), show_labels=False), resizable=True) ###################################################################### # `FileDataSource` interface ###################################################################### def __init__(self, base_name='', configure=True, **traits): super(ChacoReader, self).__init__(**traits) if configure: self.reader.edit_traits(kind='livemodal') self.base_name = self.reader.base_name def update(self): if len(self.base_name) == 0: return self.reader.update() self.render() def has_output_port(self): """ Return True as the reader has output port.""" return True def get_output_object(self): """ Return the reader output port.""" return self.reader.output_port ###################################################################### # Non-public interface ###################################################################### def _base_name_changed(self, value): if len(value) == 0: return else: self.reader.base_name = value self._update_reader_output() def _update_reader_output(self): self.reader.update() self.reader.update_information() self.reader.on_trait_change(self.render) self.outputs = [self.reader.output] self.data_changed = True mayavi-4.5.0/mayavi/sources/image_reader.py0000644000076500000240000001150112747716314021353 0ustar prabhustaff00000000000000"""An Image file reader object. """ # Author: KK Rai (kk.rai [at] iitb.ac.in) # R. Ambareesha (ambareesha [at] iitb.ac.in) # Chandrashekhar Kaushik # Suyog Dutt Jain # Prabhu Ramachandran # Copyright (c) 2007-2015, Enthought, Inc. # License: BSD Style. from os.path import basename # Enthought library imports. from traits.api import Instance, Str, Dict from traitsui.api import View, Group, Item, Include from tvtk.api import tvtk # Local imports. from mayavi.core.file_data_source import FileDataSource from mayavi.core.pipeline_info import PipelineInfo ######################################################################## # `ImageReader` class ######################################################################## class ImageReader(FileDataSource): """A Image file reader. The reader supports all the different types of Image files. """ # The version of this class. Used for persistence. __version__ = 0 # The Image data file reader. reader = Instance(tvtk.Object, allow_none=False, record=True) # Information about what this object can produce. output_info = PipelineInfo(datasets=['image_data']) # Our view. view = View(Group(Include('time_step_group'), Item(name='base_file_name'), Item(name='reader', style='custom', resizable=True), show_labels=False), resizable=True) ###################################################################### # Private Traits _image_reader_dict = Dict(Str, Instance(tvtk.Object)) ###################################################################### # `object` interface ###################################################################### def __init__(self, **traits): d = {'bmp':tvtk.BMPReader(), 'jpg':tvtk.JPEGReader(), 'png':tvtk.PNGReader(), 'pnm':tvtk.PNMReader(), 'dcm':tvtk.DICOMImageReader(), 'tiff':tvtk.TIFFReader(), 'ximg':tvtk.GESignaReader(), 'dem':tvtk.DEMReader(), 'mha':tvtk.MetaImageReader(), 'mhd':tvtk.MetaImageReader(), } # Account for pre 5.2 VTk versions, without MINC reader if hasattr(tvtk, 'MINCImageReader'): d['mnc'] = tvtk.MINCImageReader() d['jpeg'] = d['jpg'] self._image_reader_dict = d # Call parent class' init. super(ImageReader, self).__init__(**traits) def __set_pure_state__(self, state): # The reader has its own file_name which needs to be fixed. state.reader.file_name = state.file_path.abs_pth # Now call the parent class to setup everything. super(ImageReader, self).__set_pure_state__(state) ###################################################################### # `FileDataSource` interface ###################################################################### def update(self): self.reader.update() if len(self.file_path.get()) == 0: return self.render() def has_output_port(self): """ Return True as the reader has output port.""" return True def get_output_object(self): """ Return the reader output port.""" return self.reader.output_port ###################################################################### # Non-public interface ###################################################################### def _file_path_changed(self, fpath): value = fpath.get() if len(value) == 0: return # Extract the file extension splitname = value.strip().split('.') extension = splitname[-1].lower() # Select image reader based on file type old_reader = self.reader if extension in self._image_reader_dict: self.reader = self._image_reader_dict[extension] else: self.reader = tvtk.ImageReader() self.reader.file_name = value.strip() self.reader.update() self.reader.update_information() if old_reader is not None: old_reader.on_trait_change(self.render, remove=True) self.reader.on_trait_change(self.render) self.outputs = [self.reader.output] # Change our name on the tree view self.name = self._get_name() def _get_name(self): """ Returns the name to display on the tree view. Note that this is not a property getter. """ fname = basename(self.file_path.get()) ret = "%s"%fname if len(self.file_list) > 1: ret += " (timeseries)" if '[Hidden]' in self.name: ret += ' [Hidden]' return ret mayavi-4.5.0/mayavi/sources/metadata.py0000644000076500000240000002432112747716314020533 0ustar prabhustaff00000000000000""" Metadata for all sources. """ # Author: Prabhu Ramachandran # Copyright (c) 2008, Prabhu Ramachandran Enthought, Inc. # License: BSD Style. # Local imports. from mayavi.core.metadata import SourceMetadata from mayavi.core.pipeline_info import PipelineInfo BASE = 'mayavi.sources' open_3ds = SourceMetadata( id = "3DSFile", class_name = BASE + ".three_ds_importer.ThreeDSImporter", tooltip = "Import a 3D Studio file", desc = "Import a 3D Studio file", help = "Import a 3D Studio file", menu_name = "&3D Studio file", extensions = ['3ds'], wildcard = '3D Studio files (*.3ds)|*.3ds', output_info = PipelineInfo(datasets=['none'], attribute_types=['any'], attributes=['any']) ) open_image = SourceMetadata( id = "ImageFile", class_name = BASE + ".image_reader.ImageReader", menu_name = "&Image file (PNG/JPG/BMP/PNM/TIFF/DEM/DCM/XIMG/MHA/MHD/MINC)", tooltip = "Import a PNG/JPG/BMP/PNM/TIFF/DCM/DEM/XIMG/MHA/MHD/MINC image", desc = "Import a PNG/JPG/BMP/PNM/TIFF/DCM/DEM/XIMG/MHA/MHD/MINC image", extensions = ['png', 'jpg', 'jpeg', 'bmp', 'pnm', 'tiff', 'dcm', 'dem', 'ximg', 'mha', 'mhd', 'mnc'], wildcard = 'PNG files (*.png)|*.png|'\ 'JPEG files (*.jpg)|*.jpg|'\ 'JPEG files (*.jpeg)|*.jpeg|'\ 'BMP files (*.bmp)|*.bmp|'\ 'PNM files (*.pnm)|*.pnm|'\ 'DCM files (*.dcm)|*.dcm|'\ 'DEM files (*.dem)|*.dem|'\ 'Meta mha files (*.mha)|*.mha|'\ 'Meta mhd files (*.mhd)|*.mhd|'\ 'MINC files (*.mnc)|*.mnc|'\ 'XIMG files (*.ximg)|*.ximg|'\ 'TIFF files (*.tiff)|*.tiff', output_info = PipelineInfo(datasets=['image_data'], attribute_types=['any'], attributes=['any']) ) open_poly_data = SourceMetadata( id = "PolyDataFile", class_name = BASE + ".poly_data_reader.PolyDataReader", menu_name = "&PolyData file (STL/STLA/STLB/TXT/RAW/PLY/PDB/SLC/FACET\ /OBJ/BYU/XYZ/CUBE)", tooltip = "Import a STL/STLA/STLB/TXT/RAW/PLY/PDB/SLC/FACET/OBJ/\ BYU/XYZ/CUBE Poly Data", desc = "Import a STL/STLA/STLB/TXT/RAWPLY/PDB/SLC/FACET/OBJ/BYU/XYZ/\ CUBE Poly Data", extensions = ['stl', 'stla', 'stlb', 'txt', 'raw', 'ply', 'pdb', 'slc', 'facet', 'xyz', 'cube', 'obj', 'g'], wildcard = 'STL files (*.stl)|*.stl|'\ 'STLA files (*.stla)|*.stla|'\ 'STLB files (*.stlb)|*.stlb|'\ 'BYU files (*.g)|*.g|'\ 'TXT files (*.txt)|*.txt|'\ 'RAW files (*.raw)|*.raw|'\ 'PLY files (*.ply)|*.ply|'\ 'PDB files (*.pdb)|*.pdb|'\ 'SLC files (*.slc)|*.slc|'\ 'XYZ files (*.xyz)|*.xyz|'\ 'CUBE files (*.cube)|*.cube|'\ 'FACET files (*.facet)|*.facet|'\ 'OBJ files (*.obj)|*.obj', can_read_test = 'mayavi.sources.poly_data_reader:PolyDataReader.can_read', output_info = PipelineInfo(datasets=['poly_data'], attribute_types=['any'], attributes=['any']) ) open_ugrid_data = SourceMetadata( id = "VTKUnstructuredFile", class_name = BASE + ".unstructured_grid_reader.UnstructuredGridReader", menu_name = "&Unstrucured Grid fil (INP/NEU/EXII)", tooltip = "Open a Unstrucured Grid file", desc = "Open a Unstrucured Grid file", help = "Open a Unstrucured Grid file", extensions = ['inp', 'neu', 'exii'], wildcard = 'AVSUCD INP files (*.inp)|*.inp|'\ 'GAMBIT NEU (*.neu)|*.neu|'\ 'EXODUS EXII (*.exii)|*.exii', output_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']) ) open_plot3d = SourceMetadata( id = "PLOT3DFile", class_name = BASE + ".plot3d_reader.PLOT3DReader", menu_name = "&PLOT3D file", tooltip = "Open a PLOT3D data data", desc = "Open a PLOT3D data data", help = "Open a PLOT3D data data", extensions = ['xyz'], wildcard = 'PLOT3D files (*.xyz)|*.xyz', output_info = PipelineInfo(datasets=['structured_grid'], attribute_types=['any'], attributes=['any']) ) open_vrml = SourceMetadata( id = "VRMLFile", class_name = BASE + ".vrml_importer.VRMLImporter", menu_name = "V&RML2 file", tooltip = "Import a VRML2 data file", desc = "Import a VRML2 data file", help = "Import a VRML2 data file", extensions = ['wrl'], wildcard = 'VRML2 files (*.wrl)|*.wrl', output_info = PipelineInfo(datasets=['none'], attribute_types=['any'], attributes=['any']) ) open_vtk = SourceMetadata( id = "VTKFile", class_name = BASE + ".vtk_file_reader.VTKFileReader", menu_name = "&VTK file", tooltip = "Open a VTK data file", desc = "Open a VTK data file", help = "Open a VTK data file", extensions = ['vtk'], wildcard = 'VTK files (*.vtk)|*.vtk', output_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']) ) open_vtk_xml = SourceMetadata( id = "VTKXMLFile", class_name = BASE + ".vtk_xml_file_reader.VTKXMLFileReader", menu_name = "VTK &XML file", tooltip = "Open a VTK XML data file", desc = "Open a VTK XML data file", help = "Open a VTK XML data file", extensions = ['xml', 'vti', 'vtp', 'vtr', 'vts', 'vtu', 'pvti', 'pvtp', 'pvtr', 'pvts', 'pvtu'], wildcard = 'VTK XML files (*.xml)|*.xml|'\ 'Image Data (*.vti)|*.vti|'\ 'Poly Data (*.vtp)|*.vtp|'\ 'Rectilinear Grid (*.vtr)|*.vtr|'\ 'Structured Grid (*.vts)|*.vts|'\ 'Unstructured Grid (*.vtu)|*.vtu|'\ 'Parallel Image Data (*.pvti)|*.pvti|'\ 'Parallel Poly Data (*.pvtp)|*.pvtp|'\ 'Parallel Rectilinear Grid (*.pvtr)|*.pvtr|'\ 'Parallel Structured Grid (*.pvts)|*.pvts|'\ 'Parallel Unstructured Grid (*.pvtu)|*.pvtu', output_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']) ) parametric_surface = SourceMetadata( id = "ParametricSurfaceSource", class_name = BASE + ".parametric_surface.ParametricSurface", menu_name = "&Create Parametric surface source", tooltip = "Create a parametric surface source", desc = "Create a parametric surface source", help = "Create a parametric surface source", extensions = [], wildcard = '', output_info = PipelineInfo(datasets=['poly_data'], attribute_types=['any'], attributes=['any']) ) point_load = SourceMetadata( id = "PointLoadSource", class_name = BASE + ".point_load.PointLoad", menu_name = "Create Point &load source", tooltip = "Simulates a point load on a cube of data (for tensors)", desc = "Simulates a point load on a cube of data (for tensors)", help = "Simulates a point load on a cube of data (for tensors)", extensions = [], wildcard = '', output_info = PipelineInfo(datasets=['image_data'], attribute_types=['any'], attributes=['any']) ) builtin_surface = SourceMetadata( id = "BuiltinSurfaceSource", class_name = BASE + ".builtin_surface.BuiltinSurface", menu_name = "Create built-in &surface", tooltip = "Create a vtk poly data source", desc = "Create a vtk poly data source", help = "Create a vtk poly data source", extensions = [], wildcard = '', output_info = PipelineInfo(datasets=['poly_data'], attribute_types=['any'], attributes=['any']) ) builtin_image = SourceMetadata( id = "BuiltinImageSource", class_name = BASE + ".builtin_image.BuiltinImage", menu_name = "Create built-in &image", tooltip = "Create a vtk image data source", desc = "Create a vtk image data source", help = "Create a vtk image data source", extensions = [], wildcard = '', output_info = PipelineInfo(datasets=['image_data'], attribute_types=['any'], attributes=['any']) ) open_volume = SourceMetadata( id = "VolumeFile", class_name = BASE + ".volume_reader.VolumeReader", menu_name = "&Volume file", tooltip = "Open a Volume file", desc = "Open a Volume file", help = "Open a Volume file", extensions = [], wildcard = '', output_info = PipelineInfo(datasets=['image_data'], attribute_types=['any'], attributes=['any']) ) open_chaco = SourceMetadata( id = "ChacoFile", class_name = BASE + ".chaco_reader.ChacoReader", menu_name = "&Chaco file", tooltip = "Open a Chaco file", desc = "Open a Chaco file", help = "Open a Chaco file", extensions = [], wildcard = '', output_info = PipelineInfo(datasets=['unstructured_grid'], attribute_types=['any'], attributes=['any']) ) # Now collect all the sources for the mayavi registry. sources = [open_3ds, open_image, open_plot3d, open_vrml, open_vtk, open_vtk_xml, parametric_surface, point_load, builtin_surface, builtin_image, open_poly_data, open_ugrid_data, open_volume, open_chaco, ] mayavi-4.5.0/mayavi/sources/parametric_surface.py0000644000076500000240000001064412747716314022615 0ustar prabhustaff00000000000000"""A module that displays Parametric Surfaces, which are generated by sets of equations describing the deformation of the real plane into the surface. """ # Authors: KK Rai (kk.rai [at] iitb.ac.in) # R. Ambareesha (ambareesha [at] iitb.ac.in) # Prabhu Ramachandran (prabhu [at] aero.iitb.ac.in) # Enthought library imports. from traits.api import Instance, Enum, Dict, Str from tvtk.api import tvtk # Local imports from mayavi.core.source import Source from mayavi.core.pipeline_info import PipelineInfo ###################################################################### # `ParametricSurface` class. ###################################################################### class ParametricSurface(Source): # The version of this class. Used for persistence. __version__ = 0 # Flag to set the parametric function type. function = Enum('boy','conic_spiral','cap','dini', 'ellipsoid','enneper','figure8klein','klein', 'mobius','random_hills','roman','spline', 'super_ellipsoid','super_toroid','torus', desc='which parametric function to be used') # Define the trait 'parametric_function' whose value must be an instance of # type ParametricFunction parametric_function = Instance(tvtk.ParametricFunction, allow_none=False, record=True) # The Parametric function source which generates the data. source = Instance(tvtk.ParametricFunctionSource, args=(), kw={'scalar_mode': 'distance'}, allow_none=False, record=True) # Information about what this object can produce. output_info = PipelineInfo(datasets=['poly_data'], attribute_types=['any'], attributes=['any']) ######################################## # Private traits. # A dictionary that maps the function names to instances of the # parametric surfaces _function_dict = Dict(Str, Instance(tvtk.ParametricFunction, allow_none=False)) ###################################################################### # `object` interface ###################################################################### def __init__(self, **traits): # Setup the function dict. fd = {'boy':tvtk.ParametricBoy(), 'conic_spiral':tvtk.ParametricConicSpiral(), 'cap':tvtk.ParametricCrossCap(), 'dini':tvtk.ParametricDini(), 'ellipsoid':tvtk.ParametricEllipsoid(), 'enneper':tvtk.ParametricEnneper(), 'figure8klein':tvtk.ParametricFigure8Klein(), 'klein':tvtk.ParametricKlein(), 'mobius':tvtk.ParametricMobius(), 'random_hills':tvtk.ParametricRandomHills(), 'roman':tvtk.ParametricRoman(), 'spline':tvtk.ParametricSpline(), 'super_ellipsoid':tvtk.ParametricSuperEllipsoid(), 'super_toroid':tvtk.ParametricSuperToroid(), 'torus':tvtk.ParametricTorus()} self._function_dict = fd # Call parent class' init. super(ParametricSurface, self).__init__(**traits) # Initialize the function to the default mode's instance from # the dictionary self.parametric_function = self._function_dict[self.function] # Call render everytime source traits change. self.source.on_trait_change(self.render) # Setup the outputs. self.outputs = [self.source.output] ###################################################################### # Non-public methods. ###################################################################### def _function_changed(self, value): """This method is invoked (automatically) when the `function` trait is changed. """ self.parametric_function = self._function_dict[self.function] def _parametric_function_changed(self, old, new): """This method is invoked (automatically) when the `parametric_function` attribute is changed. """ self.source.parametric_function = self.parametric_function # Setup the handlers so that if old is not None: old.on_trait_change(self.render, remove=True) new.on_trait_change(self.render) self.source.update() self.data_changed = True mayavi-4.5.0/mayavi/sources/plot3d_reader.py0000644000076500000240000002426512747716314021511 0ustar prabhustaff00000000000000"""A PLOT3D file reader. This reader does not support a timeseries of files. """ # Author: Prabhu Ramachandran # Copyright (c) 2007-2015, Enthought, Inc. # License: BSD Style. # Standard library imports. from os.path import basename, isfile, exists, splitext # Enthought library imports. from traits.api import Trait, Instance, Str, TraitPrefixMap, Button from traitsui.api import View, Group, Item, FileEditor from tvtk.api import tvtk from apptools.persistence.state_pickler import set_state from apptools.persistence.file_path import FilePath # Local imports. from mayavi.core.source import Source from mayavi.core.common import handle_children_state, error from mayavi.core.pipeline_info import PipelineInfo ######################################################################## # `PLOT3DReader` class ######################################################################## class PLOT3DReader(Source): """A PLOT3D file reader. This reader does not support a timeseries of files. """ # The version of this class. Used for persistence. __version__ = 0 # XYZ file name xyz_file_name = Str('', desc='the XYZ file') # The (optional) Q file. q_file_name = Str('', desc='the Q file') # The active scalar name. scalars_name = Trait('density', TraitPrefixMap({'density': 100, 'pressure':110, 'temperature': 120, 'enthalpy': 130, 'internal energy': 140, 'kinetic energy': 144, 'velocity magnitude': 153, 'stagnation energy': 163, 'entropy': 170, 'swirl': 184}), desc='scalar data attribute to show') # The active vector name. vectors_name = Trait('momentum', TraitPrefixMap({'velocity': 200, 'vorticity': 201, 'momentum': 202, 'pressure gradient': 210}), desc='vector data attribute to show') # The VTK data file reader. reader = Instance(tvtk.MultiBlockPLOT3DReader, args=(), allow_none=False, record=True) # Information about what this object can produce. output_info = PipelineInfo(datasets=['structured_grid']) ######################################## # View related code. update_reader = Button('Update Reader') # Our view. view = View(Group(Item('xyz_file_name', editor=FileEditor()), Item('q_file_name', editor=FileEditor()), Item(name='scalars_name', enabled_when='len(object.q_file_name) > 0'), Item(name='vectors_name', enabled_when='len(object.q_file_name)>0'), Item(name='update_reader'), label='Reader', ), Group(Item(name='reader', style='custom', resizable=True), show_labels=False, label='PLOT3DReader' ), resizable=True) ######################################## # Private traits. # The current file paths. This is not meant to be touched by the # user. xyz_file_path = Instance(FilePath, args=(), desc='the current XYZ file path') q_file_path = Instance(FilePath, args=(), desc='the current Q file path') ###################################################################### # `object` interface ###################################################################### def __get_pure_state__(self): d = super(PLOT3DReader, self).__get_pure_state__() # These traits are dynamically created. for name in ('scalars_name', 'vectors_name', 'xyz_file_name', 'q_file_name'): d.pop(name, None) return d def __set_pure_state__(self, state): xyz_fn = state.xyz_file_path.abs_pth q_fn = state.q_file_path.abs_pth if not isfile(xyz_fn): msg = 'Could not find file at %s\n'%xyz_fn msg += 'Please move the file there and try again.' raise IOError(msg) # Setup the reader state. set_state(self, state, first=['reader'], ignore=['*']) # Initialize the files. self.initialize(xyz_fn, q_fn, configure=False) # Now set the remaining state without touching the children. set_state(self, state, ignore=['children', 'xyz_file_path', 'q_file_path']) # Setup the children. handle_children_state(self.children, state.children) # Setup the children's state. set_state(self, state, first=['children'], ignore=['*']) ###################################################################### # `FileDataSource` interface ###################################################################### def initialize(self, xyz_file_name, q_file_name='', configure=True): """Given an xyz filename and a Q filename which may or may not be part of a time series, this initializes the list of files. This method need not be called to initialize the data. If configure is True, it pops up a UI to configure the PLOT3DReader. """ if len(q_file_name) == 0: base = splitext(xyz_file_name)[0] qf = base + '.q' if exists(qf): q_file_name = qf if configure: # First set properties of the reader. This is useful when # the data format has atypical defaults. Automatic # detection can be disastrous sometimes due to VTK related # problems. self.reader.edit_traits(kind='livemodal') self.xyz_file_name = xyz_file_name if len(q_file_name) > 0: self.q_file_name = q_file_name def update(self): if len(self.xyz_file_path.get()) == 0: return self.reader.update() self.render() def has_output_port(self): """ Return True as the reader has output port.""" return True def get_output_object(self): """ Return the reader output port.""" return self.reader.output_port ###################################################################### # Non-public interface ###################################################################### def _xyz_file_name_changed(self, value): if len(value) == 0: return else: self.reader.xyz_file_name = value self.xyz_file_path.set(value) self._update_reader_output() def _q_file_name_changed(self, value): if len(value) == 0: return else: self.reader.q_file_name = value self.q_file_path.set(value) self._update_reader_output() def _update_reader_output(self): r = self.reader r.update() if r.error_code != 0: try: self.reader.i_blanking = True except AttributeError: pass else: r.update() # Try reading file. if r.error_code != 0: # No output so the file might be an ASCII file. try: # Turn off IBlanking. r.set(i_blanking = False, binary_file = False) except AttributeError: pass else: r.update() # Try again this time as ascii and with blanking. if r.error_code != 0: # No output so the file might be an ASCII file. try: # Turn on IBlanking. r.i_blanking = True except AttributeError: pass else: r.update() # If there still is an error, ask the user. if r.error_code != 0: r.edit_traits(kind='livemodal') r.update() # If there still is an error, ask the user to retry. if r.error_code != 0: msg = 'Unable to read file properly. '\ 'Please check the settings of the reader '\ 'on the UI and press the "Update Reader" button '\ 'when done and try again!' error(msg) return # Now setup the outputs by resetting self.outputs. Changing # the outputs automatically fires a pipeline_changed event. try: n = r.get_output().number_of_blocks except AttributeError: # for VTK >= 4.5 n = r.number_of_outputs outputs = [] for i in range(n): outputs.append(r.get_output().get_block(i)) self.outputs = outputs # Fire data_changed just in case the outputs are not # really changed. This can happen if the dataset is of # the same type as before. self.data_changed = True # Change our name on the tree view self.name = self._get_name() def _scalars_name_changed(self, value): self.reader.scalar_function_number = self.scalars_name_ self.reader.modified() self.update() self.data_changed = True def _vectors_name_changed(self, value): self.reader.vector_function_number = self.vectors_name_ self.reader.modified() self.update() self.data_changed = True def _update_reader_fired(self): self.reader.modified() self._update_reader_output() self.pipeline_changed = True def _get_name(self): """ Gets the name to display on the tree view. """ xyz_fname = basename(self.xyz_file_path.get()) q_fname = basename(self.q_file_path.get()) if len(self.q_file_name) > 0: ret = "PLOT3D:%s, %s"%(xyz_fname, q_fname) else: ret = "PLOT3D:%s"%(xyz_fname) if '[Hidden]' in self.name: ret += ' [Hidden]' return ret mayavi-4.5.0/mayavi/sources/point_load.py0000644000076500000240000000416012747716314021102 0ustar prabhustaff00000000000000"""A source object that computes stress tensors on a volume. The tensors are computed from the application of a point load on a semi-infinite domain. """ # Authors: KK Rai (kk.rai [at] iitb.ac.in) # R. Ambareesha (ambareesha [at] iitb.ac.in) # Prabhu Ramachandran (prabhu [at] aero.iitb.ac.in) # Enthought library imports. from traits.api import Instance from traitsui.api import View, Group, Item from tvtk.api import tvtk # Local imports from mayavi.core.source import Source from mayavi.core.pipeline_info import PipelineInfo ###################################################################### # `PointLoad` class. ###################################################################### class PointLoad(Source): # The version of this class. Used for persistence. __version__ = 0 point_load = Instance(tvtk.PointLoad, args=(), allow_none=False, record=True) # Information about what this object can produce. output_info = PipelineInfo(datasets=['image_data'], attribute_types=['any'], attributes=['any']) # Create the UI for the traits. view = View(Group(Item(name='point_load', style='custom', resizable=True), label='PointLoad', show_labels=False), resizable=True) ###################################################################### # `object` interface ###################################################################### def __init__(self, **traits): # Call parent class' init. super(PointLoad, self).__init__(**traits) # Call render everytime source traits change. self.point_load.on_trait_change(self.render) # Setup the outputs. self.outputs = [self.point_load.output] def has_output_port(self): """ Return True as the point load has output port.""" return True def get_output_object(self): """ Return the point load output port.""" return self.point_load.output_port mayavi-4.5.0/mayavi/sources/poly_data_reader.py0000644000076500000240000001336012747716314022252 0ustar prabhustaff00000000000000"""A PolyData file reader object. """ # Author: R.Sreekanth # Suyog Dutt Jain # Copyright (c) 2009-2015, Enthought, Inc. # License: BSD Style. # Standard library imports. from os.path import basename # Enthought imports. from traits.api import Instance, Str,Dict from traitsui.api import View, Item, Group, Include from tvtk.api import tvtk # Local imports from mayavi.core.file_data_source import FileDataSource from mayavi.core.pipeline_info import PipelineInfo from mayavi.core.common import error ######################################################################## # `PolyDataReader` class ######################################################################## class PolyDataReader(FileDataSource): """A PolyData file reader. The reader supports all the different types of poly data files. """ # The version of this class. Used for persistence. __version__ = 0 # The PolyData file reader reader = Instance(tvtk.Object, allow_none=False, record=True) ###################################################################### # Private Traits _reader_dict = Dict(Str, Instance(tvtk.Object)) # Our View. view = View(Group(Include('time_step_group'), Item(name='base_file_name'), Item(name='reader', style='custom', resizable=True), show_labels=False), resizable=True) #output_info = PipelineInfo(datasets=['none']) output_info = PipelineInfo(datasets=['poly_data'], attribute_types=['any'], attributes=['any']) ###################################################################### # `object` interface ###################################################################### def __set_pure_state__(self, state): # The reader has its own file_name which needs to be fixed. state.reader.file_name = state.file_path.abs_pth # Now call the parent class to setup everything. super(PolyDataReader, self).__set_pure_state__(state) ###################################################################### # `FileDataSource` interface ###################################################################### def update(self): self.reader.update() if len(self.file_path.get()) == 0: return self.render() def has_output_port(self): """ Return True as the reader has output port.""" return True def get_output_object(self): """ Return the reader output port.""" return self.reader.output_port ###################################################################### # Non-public interface ###################################################################### def _file_path_changed(self, fpath): value = fpath.get() if len(value) == 0: return # Extract the file extension splitname = value.strip().split('.') extension = splitname[-1].lower() # Select polydata reader based on file type old_reader = self.reader if extension in self._reader_dict: self.reader = self._reader_dict[extension] else: error('Invalid extension for file: %s'%value) return self.reader.file_name = value.strip() self.reader.update() self.reader.update_information() if old_reader is not None: old_reader.on_trait_change(self.render, remove=True) self.reader.on_trait_change(self.render) old_outputs = self.outputs self.outputs = [self.reader.output] if self.outputs == old_outputs: self.data_changed = True # Change our name on the tree view self.name = self._get_name() def _get_name(self): """ Returns the name to display on the tree view. Note that this is not a property getter. """ fname = basename(self.file_path.get()) ret = "%s"%fname if len(self.file_list) > 1: ret += " (timeseries)" if '[Hidden]' in self.name: ret += ' [Hidden]' return ret def __reader_dict_default(self): """Default value for reader dict.""" rd = {'stl':tvtk.STLReader(), 'stla':tvtk.STLReader(), 'stlb':tvtk.STLReader(), 'txt':tvtk.SimplePointsReader(), 'raw':tvtk.ParticleReader(), 'ply':tvtk.PLYReader(), 'pdb':tvtk.PDBReader(), 'slc':tvtk.SLCReader(), 'xyz':tvtk.XYZMolReader(), 'obj':tvtk.OBJReader(), 'facet':tvtk.FacetReader(), 'cube':tvtk.GaussianCubeReader(), 'g':tvtk.BYUReader(), } return rd # Callable to check if the reader can actually read the file def can_read(cls,filename): """ Class method to check if the reader can actually read the file. Returns 'True' if it can read it succesfully else 'False' """ # Extract the file extension splitname = filename.strip().split('.') extension = splitname[-1].lower() if extension == 'xyz': from vtk import vtkObject o = vtkObject w = o.GetGlobalWarningDisplay() o.SetGlobalWarningDisplay(0) # Turn it off. r = tvtk.XYZMolReader() r.file_name = filename r.update() o.SetGlobalWarningDisplay(w) if len(r.output.points) != 0: return True return False return None can_read = classmethod(can_read) mayavi-4.5.0/mayavi/sources/three_ds_importer.py0000644000076500000240000000366512747716314022501 0ustar prabhustaff00000000000000"""An importer for 3D Studio files. """ # Author: Prabhu Ramachandran # Copyright (c) 2007, Enthought, Inc. # License: BSD Style. # Standard library imports. from os.path import basename # Enthought imports. from tvtk.api import tvtk from traits.api import Instance # Local imports from mayavi.sources.vrml_importer import VRMLImporter ###################################################################### # `ThreeDSImporter` class. ###################################################################### class ThreeDSImporter(VRMLImporter): # The 3DS importer. reader = Instance(tvtk.ThreeDSImporter, args=(), kw={'compute_normals':True}, allow_none=False, record=True) ###################################################################### # `FileDataSource` interface ###################################################################### def has_output_port(self): """ Return True as the reader has output port.""" return True def get_output_object(self): """ Return the reader output port.""" return self.reader.output_port ###################################################################### # Non-public interface ###################################################################### def _file_name_changed(self, value): # This hack is necessary since for some reason the importer # does not clear out the earlier actors. self.reader = reader = tvtk.ThreeDSImporter(compute_normals=True) reader.file_name = value if self.scene is not None: self.reader.render_window = self.scene.render_window name = "3DStudio file (%s)"%basename(self.file_name) if '[Hidden]' in self.name: name += ' [Hidden]' self.name = name self._file_path.set(value) self._update_reader() self.render() mayavi-4.5.0/mayavi/sources/ui/0000755000076500000240000000000012747722127017013 5ustar prabhustaff00000000000000mayavi-4.5.0/mayavi/sources/ui/__init__.py0000644000076500000240000000013212747716314021121 0ustar prabhustaff00000000000000# Author: Judah De Paula # Copyright (c) 2005-2008, Enthought, Inc. # License: BSD Style. mayavi-4.5.0/mayavi/sources/ui/parametric_surface.py0000644000076500000240000000207312747716314023227 0ustar prabhustaff00000000000000""" Traits View definition file. The view trait of the parent class is extracted from the model definition file. This file can either be exec()ed or imported. See core/base.py:Base.trait_view() for what is currently used. Using exec() allows view changes without needing to restart Mayavi, but is slower than importing. """ # Authors: Prabhu Ramachandran # Vibha Srinivasan # Judah De Paula # Copyright (c) 2005-2008, Enthought, Inc. # License: BSD Style. from traitsui.api import Item, Group, View view = View(Group(Item(name='function'), Item(name='parametric_function', style='custom', resizable=True), label='Function', show_labels=False ), Group(Item(name='source', style='custom', resizable=True), label='Source', show_labels=False), resizable=True) mayavi-4.5.0/mayavi/sources/unstructured_grid_reader.py0000644000076500000240000001206412747716314024052 0ustar prabhustaff00000000000000"""A Unstructred Grid file reader object. """ # Author: R.Sreekanth # Suyog Dutt Jain # Copyright (c) 2009-2015, Enthought, Inc. # License: BSD Style. from os.path import basename # Enthought library imports. from traits.api import Instance, Str, Dict from traitsui.api import View, Group, Item, Include from tvtk.api import tvtk # Local imports. from tvtk.common import is_old_pipeline from mayavi.core.file_data_source import FileDataSource from mayavi.core.pipeline_info import PipelineInfo from mayavi.core.common import error ######################################################################## # `UnstructuredGridReader` class ######################################################################## class UnstructuredGridReader(FileDataSource): # The version of this class. Used for persistence. __version__ = 0 # The UnstructuredGridAlgorithm data file reader. reader = Instance(tvtk.Object, allow_none=False, record=True) # Information about what this object can produce. output_info = PipelineInfo(datasets=['unstructured_grid']) ###################################################################### # Private Traits _reader_dict = Dict(Str, Instance(tvtk.Object)) # Our view. view = View(Group(Include('time_step_group'), Item(name='base_file_name'), Item(name='reader', style='custom', resizable=True), show_labels=False), resizable=True) ###################################################################### # `object` interface ###################################################################### def __set_pure_state__(self, state): # The reader has its own file_name which needs to be fixed. state.reader.file_name = state.file_path.abs_pth # Now call the parent class to setup everything. super(UnstructuredGridReader, self).__set_pure_state__(state) ###################################################################### # `FileDataSource` interface ###################################################################### def update(self): self.reader.update() if len(self.file_path.get()) == 0: return self.render() def has_output_port(self): """ Return True as the reader has output port.""" return True def get_output_object(self): """ Return the reader output port.""" return self.reader.output_port ###################################################################### # Non-public interface ###################################################################### def _file_path_changed(self, fpath): value = fpath.get() if len(value) == 0: return # Extract the file extension splitname = value.strip().split('.') extension = splitname[-1].lower() # Select UnstructuredGridreader based on file type old_reader = self.reader if extension in self._reader_dict: self.reader = self._reader_dict[extension] else: error('Invalid file extension for file: %s'%value) return self.reader.file_name = value.strip() self.reader.update_information() if isinstance(self.reader, tvtk.ExodusIIReader): # Make sure the point fields are read during Update(). for k in range(self.reader.number_of_point_result_arrays ): arr_name = self.reader.get_point_result_array_name( k ) self.reader.set_point_result_array_status( arr_name, 1 ) self.reader.update() if old_reader is not None: old_reader.on_trait_change(self.render, remove=True) self.reader.on_trait_change(self.render) old_outputs = self.outputs if isinstance(self.reader, tvtk.ExodusIIReader): self.outputs = [self.reader.output.get_block(0).get_block(0)] else: self.outputs = [self.reader.output] if self.outputs == old_outputs: self.data_changed = True # Change our name on the tree view self.name = self._get_name() def _get_name(self): """ Returns the name to display on the tree view. Note that this is not a property getter. """ fname = basename(self.file_path.get()) ret = "%s"%fname if len(self.file_list) > 1: ret += " (timeseries)" if '[Hidden]' in self.name: ret += ' [Hidden]' return ret def __reader_dict_default(self): """Default value for reader dict.""" if is_old_pipeline(): rd = {'inp':tvtk.AVSucdReader(), 'neu':tvtk.GAMBITReader(), 'exii':tvtk.ExodusReader() } else: rd = {'inp':tvtk.AVSucdReader(), 'neu':tvtk.GAMBITReader(), 'ex2':tvtk.ExodusIIReader() } return rd mayavi-4.5.0/mayavi/sources/utils.py0000644000076500000240000000057212747716314020115 0ustar prabhustaff00000000000000def has_attributes(dataset): """Returns `True` when the given TVTK `dataset` has any attribute arrays in point and cell data and `False` otherwise. """ pd = dataset.point_data if pd is not None and pd.number_of_arrays > 0: return True cd = dataset.cell_data if cd is not None and cd.number_of_arrays > 0: return True return False mayavi-4.5.0/mayavi/sources/volume_reader.py0000644000076500000240000000515112747716314021604 0ustar prabhustaff00000000000000"""A Volume file reader""" # Author: Suyog Dutt Jain # Copyright (c) 2009, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import Instance, Str from traitsui.api import View, Group, Item from tvtk.api import tvtk # Local imports. from mayavi.core.source import Source from mayavi.core.pipeline_info import PipelineInfo ######################################################################## # `VolumeReader` class ######################################################################## class VolumeReader(Source): """A Volume reader. """ # The version of this class. Used for persistence. __version__ = 0 file_prefix = Str('', desc='File prefix for the volume files') # The VTK data file reader. reader = Instance(tvtk.Volume16Reader, args=(), allow_none=False, record=True) # Information about what this object can produce. output_info = PipelineInfo(datasets=['image_data']) ######################################## # View related code. # Our view. view = View(Group(Item(name='reader', style='custom', resizable=True), show_labels=False), resizable=True) ###################################################################### # `Source` interface ###################################################################### def __init__(self, file_prefix='', configure=True, **traits): super(VolumeReader, self).__init__(**traits) if configure: self.reader.edit_traits(kind='livemodal') self.file_prefix = self.reader.file_prefix def update(self): if len(self.file_prefix) == 0: return self.reader.update() self.render() def has_output_port(self): """ Return True as the reader has output port.""" return True def get_output_object(self): """ Return the reader output port.""" return self.reader.output_port ###################################################################### # Non-public interface ###################################################################### def _file_prefix_changed(self, value): if len(value) == 0: return else: self.reader.file_prefix = value self._update_reader_output() def _update_reader_output(self): self.reader.update() self.reader.update_information() self.reader.on_trait_change(self.render) self.outputs = [self.reader.output] self.data_changed = True mayavi-4.5.0/mayavi/sources/vrml_importer.py0000644000076500000240000001210712747716314021653 0ustar prabhustaff00000000000000"""An importer for VRML files. """ # Author: Prabhu Ramachandran # Copyright (c) 2007, Enthought, Inc. # License: BSD Style. # Standard library imports. from os.path import basename # Enthought imports. from tvtk.api import tvtk from traits.api import Instance, Str from traitsui.api import View, Item, FileEditor from apptools.persistence.file_path import FilePath from apptools.persistence.state_pickler import set_state # Local imports from mayavi.core.source import Source from mayavi.core.pipeline_info import PipelineInfo ###################################################################### # `VRMLImporter` class. ###################################################################### class VRMLImporter(Source): __version__ = 0 # The file name. file_name = Str('', enter_set=True, auto_set=False, desc='the VRML file name') # The VRML importer. reader = Instance(tvtk.VRMLImporter, args=(), allow_none=False, record=True) output_info = PipelineInfo(datasets=['none']) ############### # Private traits. # Our file path used for persistence _file_path = Instance(FilePath, args=()) # Our View. view = View(Item(name='file_name', editor=FileEditor())) ###################################################################### # `object` interface ###################################################################### def __get_pure_state__(self): d = super(VRMLImporter, self).__get_pure_state__() # These traits are dynamically created. for name in ('reader', 'file_name'): d.pop(name) return d def __set_pure_state__(self, state): # The reader has its own file_name which needs to be fixed. fname = state._file_path.abs_pth # Now call the parent class to setup everything. self.initialize(fname) # Setup the rest of the state. set_state(self, state, ignore=['_file_path']) def initialize(self, file_name): self.file_name = file_name ###################################################################### # `PipelineBase` interface. ###################################################################### def add_actors(self): """Adds `self.actors` to the scene. """ if not self._actors_added: self.reader.render_window = self.scene.render_window self._update_reader() self._actors_added = True if not self.visible: self._visible_changed(self.visible) self.scene.render() def remove_actors(self): """Removes `self.actors` from the scene. """ if self._actors_added: self.scene.remove_actors(self.actors) self._actors_added = False self.scene.render() def has_output_port(self): """ Return True as the reader has output port.""" return True def get_output_object(self): """ Return the reader output port.""" return self.reader.output_port ###################################################################### # Non-public interface ###################################################################### def _file_name_changed(self, value): reader = self.reader reader.file_name = value self._file_path.set(value) self._update_reader() self.render() name = "VRML file (%s)"%basename(self.file_name) if '[Hidden]' in self.name: name += ' [Hidden]' self.name = name def _update_reader(self): reader = self.reader if self.scene is None or reader.file_name is None \ or len(reader.file_name) == 0: return actors1 = [x for x in self.scene.renderer.actors] reader.read() self.scene.render() actors2 = [x for x in self.scene.renderer.actors] self.actors = [x for x in actors2 if x not in actors1] # If these are the first actors on scene reset the view. if len(actors1) == 0: self.scene.reset_zoom() def _scene_changed(self, old, new): if self._actors_added: old.remove_actors(self.actors) reader = self.reader reader.render_window = new.render_window self._update_reader() def _actors_changed(self, old, new): if self._actors_added: self.scene.remove_actors(old) # The actors are added automatically when the importer # does a read. self.scene.render() def _actors_items_changed(self, list_event): if self._actors_added: self.scene.remove_actors(list_event.removed) # The actors are added automatically when the importer # does a read. self.scene.render() def _visible_changed(self, value): if value: if not self._actors_added: self.scene.add_actors(self.actors) self._actors_added = True super(VRMLImporter, self)._visible_changed(value) mayavi-4.5.0/mayavi/sources/vtk_data_source.py0000644000076500000240000003345712747716314022142 0ustar prabhustaff00000000000000"""This source manages a VTK dataset given to it. When this source is pickled or persisted, it saves the data given to it in the form of a gzipped string. """ # Author: Prabhu Ramachandran # Copyright (c) 2005-2015, Enthought, Inc. # License: BSD Style. import sys import os import tempfile # Enthought library imports. from traits.api import Instance, List, Str, Bool, Int from traitsui.api import View, Group, Item from apptools.persistence.state_pickler \ import gzip_string, gunzip_string, set_state from tvtk.api import tvtk from tvtk import messenger # Local imports. from tvtk.common import is_old_pipeline, configure_input_data from mayavi.core.source import Source from mayavi.core.common import handle_children_state from mayavi.core.trait_defs import DEnum from mayavi.core.pipeline_info import (PipelineInfo, get_tvtk_dataset_name) from .utils import has_attributes from .vtk_xml_file_reader import get_all_attributes ###################################################################### # Utility functions. ###################################################################### def write_dataset_to_string(data): """Given a dataset, convert the dataset to an ASCII string that can be stored for persistence. """ w = tvtk.DataSetWriter(write_to_output_string=1) warn = w.global_warning_display configure_input_data(w, data) w.global_warning_display = 0 w.update() if w.output_string_length == 0: # Some VTK versions (5.2) have a bug when writing structured # grid datasets and produce empty output. We work around this # by writing to a file and then reading that output. w.write_to_output_string = 0 fh, fname = tempfile.mkstemp('.vtk') os.close(fh); os.remove(fname) w.file_name = fname w.write() # Read the data and delete the file. sdata = open(fname).read() os.remove(fname) else: sdata = w.output_string w.global_warning_display = warn return sdata ###################################################################### # `VTKDataSource` class ###################################################################### class VTKDataSource(Source): """This source manages a VTK dataset given to it. When this source is pickled or persisted, it saves the data given to it in the form of a gzipped string. Note that if the VTK dataset has changed internally and you need to notify the mayavi pipeline to flush the data just call the `modified` method of the VTK dataset and the mayavi pipeline will update automatically. """ # The version of this class. Used for persistence. __version__ = 0 # The VTK dataset to manage. data = Instance(tvtk.DataSet, allow_none=False) # Information about what this object can produce. output_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']) ######################################## # Dynamic traits: These traits are dynamic and are updated on the # _update_data method. # The active point scalar name. point_scalars_name = DEnum(values_name='_point_scalars_list', desc='scalar point data attribute to use') # The active point vector name. point_vectors_name = DEnum(values_name='_point_vectors_list', desc='vectors point data attribute to use') # The active point tensor name. point_tensors_name = DEnum(values_name='_point_tensors_list', desc='tensor point data attribute to use') # The active cell scalar name. cell_scalars_name = DEnum(values_name='_cell_scalars_list', desc='scalar cell data attribute to use') # The active cell vector name. cell_vectors_name = DEnum(values_name='_cell_vectors_list', desc='vectors cell data attribute to use') # The active cell tensor name. cell_tensors_name = DEnum(values_name='_cell_tensors_list', desc='tensor cell data attribute to use') ######################################## # Our view. view = View(Group(Item(name='point_scalars_name'), Item(name='point_vectors_name'), Item(name='point_tensors_name'), Item(name='cell_scalars_name'), Item(name='cell_vectors_name'), Item(name='cell_tensors_name'), Item(name='data'), )) ######################################## # Private traits. # These private traits store the list of available data # attributes. The non-private traits use these lists internally. _point_scalars_list = List(Str) _point_vectors_list = List(Str) _point_tensors_list = List(Str) _cell_scalars_list = List(Str) _cell_vectors_list = List(Str) _cell_tensors_list = List(Str) # This filter allows us to change the attributes of the data # object and will ensure that the pipeline is properly taken care # of. Directly setting the array in the VTK object will not do # this. _assign_attribute = Instance(tvtk.AssignAttribute, args=(), allow_none=False) # Toggles if this is the first time this object has been used. _first = Bool(True) # The ID of the observer for the data. _observer_id = Int(-1) ###################################################################### # `object` interface ###################################################################### def __get_pure_state__(self): d = super(VTKDataSource, self).__get_pure_state__() for name in ('_assign_attribute', '_first', '_observer'): d.pop(name, None) for name in ('point_scalars', 'point_vectors', 'point_tensors', 'cell_scalars', 'cell_vectors', 'cell_tensors'): d.pop('_' + name + '_list', None) d.pop('_' + name + '_name', None) data = self.data if data is not None: sdata = write_dataset_to_string(data) if sys.version_info[0] > 2: z = gzip_string(sdata.encode('ascii')) else: z = gzip_string(sdata) d['data'] = z return d def __set_pure_state__(self, state): z = state.data if z is not None: if sys.version_info[0] > 2: d = gunzip_string(z).decode('ascii') else: d = gunzip_string(z) r = tvtk.DataSetReader(read_from_input_string=1, input_string=d) warn = r.global_warning_display r.global_warning_display = 0 r.update() r.global_warning_display = warn self.data = r.output # Now set the remaining state without touching the children. set_state(self, state, ignore=['children', 'data']) # Setup the children. handle_children_state(self.children, state.children) # Setup the children's state. set_state(self, state, first=['children'], ignore=['*']) ###################################################################### # `Base` interface ###################################################################### def start(self): """This is invoked when this object is added to the mayavi pipeline. """ # Do nothing if we are already running. if self.running: return # Update the data just in case. self._update_data() # Call the parent method to do its thing. This will typically # start all our children. super(VTKDataSource, self).start() def update(self): """Invoke this to flush data changes downstream. This is typically used when you change the data object and want the mayavi pipeline to refresh. """ # This tells the VTK pipeline that the data has changed. This # will fire the data_changed event automatically. self.data.modified() self._assign_attribute.update() ###################################################################### # Non-public interface ###################################################################### def _data_changed(self, old, new): if has_attributes(self.data): aa = self._assign_attribute self.configure_input_data(aa, new) self._update_data() aa.update() self.outputs = [aa.output] else: self.outputs = [self.data] self.data_changed = True self.output_info.datasets = \ [get_tvtk_dataset_name(self.outputs[0])] # Add an observer to the VTK dataset after removing the one # for the old dataset. We use the messenger to avoid an # uncollectable reference cycle. See the # tvtk.messenger module documentation for details. if old is not None: old.remove_observer(self._observer_id) self._observer_id = new.add_observer('ModifiedEvent', messenger.send) new_vtk = tvtk.to_vtk(new) messenger.connect(new_vtk, 'ModifiedEvent', self._fire_data_changed) # Change our name so that our label on the tree is updated. self.name = self._get_name() def _fire_data_changed(self, *args): """Simply fire the `data_changed` event.""" self.data_changed = True def _set_data_name(self, data_type, attr_type, value): if value is None: return dataset = self.data if len(value) == 0: # If the value is empty then we deactivate that attribute. d = getattr(dataset, attr_type + '_data') method = getattr(d, 'set_active_%s'%data_type) method(None) self.data_changed = True return aa = self._assign_attribute data = None if attr_type == 'point': data = dataset.point_data elif attr_type == 'cell': data = dataset.cell_data method = getattr(data, 'set_active_%s'%data_type) method(value) aa.assign(value, data_type.upper(), attr_type.upper() +'_DATA') if data_type == 'scalars' and dataset.is_a('vtkImageData'): # Set the scalar_type for image data, if not you can either # get garbage rendered or worse. s = getattr(dataset, attr_type + '_data').scalars r = s.range if is_old_pipeline(): dataset.scalar_type = s.data_type aa.output.scalar_type = s.data_type aa.update() # Fire an event, so the changes propagate. self.data_changed = True def _point_scalars_name_changed(self, value): self._set_data_name('scalars', 'point', value) def _point_vectors_name_changed(self, value): self._set_data_name('vectors', 'point', value) def _point_tensors_name_changed(self, value): self._set_data_name('tensors', 'point', value) def _cell_scalars_name_changed(self, value): self._set_data_name('scalars', 'cell', value) def _cell_vectors_name_changed(self, value): self._set_data_name('vectors', 'cell', value) def _cell_tensors_name_changed(self, value): self._set_data_name('tensors', 'cell', value) def _update_data(self): if self.data is None: return pnt_attr, cell_attr = get_all_attributes(self.data) pd = self.data.point_data scalars = pd.scalars if self.data.is_a('vtkImageData') and scalars is not None: # For some reason getting the range of the scalars flushes # the data through to prevent some really strange errors # when using an ImagePlaneWidget. r = scalars.range if is_old_pipeline(): self._assign_attribute.output.scalar_type = scalars.data_type self.data.scalar_type = scalars.data_type def _setup_data_traits(obj, attributes, d_type): """Given the object, the dict of the attributes from the `get_all_attributes` function and the data type (point/cell) data this will setup the object and the data. """ attrs = ['scalars', 'vectors', 'tensors'] aa = obj._assign_attribute data = getattr(obj.data, '%s_data'%d_type) for attr in attrs: values = sorted(attributes[attr]) values.append('') setattr(obj, '_%s_%s_list'%(d_type, attr), values) if len(values) > 1: default = getattr(obj, '%s_%s_name'%(d_type, attr)) if obj._first and len(default) == 0: default = values[0] getattr(data, 'set_active_%s'%attr)(default) aa.assign(default, attr.upper(), d_type.upper() +'_DATA') aa.update() kw = {'%s_%s_name'%(d_type, attr): default, 'trait_change_notify': False} obj.set(**kw) _setup_data_traits(self, pnt_attr, 'point') _setup_data_traits(self, cell_attr, 'cell') if self._first: self._first = False # Propagate the data changed event. self.data_changed = True def _get_name(self): """ Gets the name to display on the tree. """ ret = "VTK Data (uninitialized)" if self.data is not None: typ = self.data.__class__.__name__ ret = "VTK Data (%s)"%typ if '[Hidden]' in self.name: ret += ' [Hidden]' return ret mayavi-4.5.0/mayavi/sources/vtk_file_reader.py0000644000076500000240000000734512747716314022107 0ustar prabhustaff00000000000000"""A VTK file reader object. """ # Author: Prabhu Ramachandran # Copyright (c) 2005-2015, Enthought, Inc. # License: BSD Style. # Standard library imports. from os.path import basename # Enthought library imports. from traits.api import Instance from tvtk.api import tvtk # Local imports. from mayavi.core.pipeline_info import (PipelineInfo, get_tvtk_dataset_name) from .utils import has_attributes from .vtk_xml_file_reader import VTKXMLFileReader ######################################################################## # `VTKFileReader` class ######################################################################## class VTKFileReader(VTKXMLFileReader): """A VTK file reader. This does not handle the new XML file format but only the older format. The reader supports all the different types of data sets. This reader also supports a time series. """ # The version of this class. Used for persistence. __version__ = 0 # The VTK data file reader. reader = Instance(tvtk.DataSetReader, args=(), kw={'read_all_scalars':True, 'read_all_vectors': True, 'read_all_tensors': True, 'read_all_fields': True} ) # Information about what this object can produce. output_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']) ###################################################################### # `FileDataSource` interface ###################################################################### def has_output_port(self): """ Return True as the reader has output port.""" return True def get_output_object(self): """ Return the reader output port.""" return self.reader.output_port ###################################################################### # Non-public interface ###################################################################### def _file_path_changed(self, fpath): value = fpath.get() if len(value) == 0: self.name = 'No VTK file' return else: self.reader.file_name = value self.update() # Setup the outputs by resetting self.outputs. Changing # the outputs automatically fires a pipeline_changed # event. try: n = self.reader.number_of_outputs except AttributeError: # for VTK >= 4.5 n = self.reader.number_of_output_ports if n > 0: outputs = [] for i in range(n): outputs.append(self.reader.get_output(i)) # FIXME: currently handling only one output (the first one) # with assign attributes. if has_attributes(outputs[0]): aa = self._assign_attribute self.configure_input_data(aa, outputs[0]) self.update_data() aa.update() outputs[0] = aa.output self.outputs = outputs # FIXME: The output info is only based on the first output. self.output_info.datasets = [get_tvtk_dataset_name(outputs[0])] # Change our name on the tree view self.name = self._get_name() def _get_name(self): """ Gets the name to display on the tree view. """ fname = basename(self.file_path.get()) ret = "VTK file (%s)"%fname if len(self.file_list) > 1: ret += " (timeseries)" if '[Hidden]' in self.name: ret += ' [Hidden]' return ret mayavi-4.5.0/mayavi/sources/vtk_xml_file_reader.py0000644000076500000240000003363112747716314022764 0ustar prabhustaff00000000000000"""A VTK XML file reader object. """ # Author: Prabhu Ramachandran # Copyright (c) 2005, Enthought, Inc. # License: BSD Style. # Standard library imports. from os.path import basename # Enthought library imports. from traits.api import Instance, List, Str, Bool, Button from traitsui.api import View, Group, Item, Include from tvtk.api import tvtk # Local imports. from mayavi.core.common import error from mayavi.core.file_data_source import FileDataSource from mayavi.core.trait_defs import DEnum from mayavi.core.pipeline_info import (PipelineInfo, get_tvtk_dataset_name) ###################################################################### # Utility functions. ###################################################################### def find_file_data_type(file_name): "Parses the named file to see what type of data there is." r = tvtk.XMLFileReadTester(file_name=file_name) if r.test_read_file(): return r.file_data_type else: error("File %s is not a valid VTK XML file!"%(file_name)) def get_array_type(arr): """Returns if the array is a scalar ('scalars'), vector ('vectors') or tensor ('tensors'). It looks at the number of components to decide. If it has a wierd number of components it returns the empty string. """ n = arr.number_of_components ret = {1: 'scalars', 3: 'vectors', 4: 'scalars', 9:'tensors'} return ret.get(n) or '' def get_attribute_list(data): """ Gets scalar, vector and tensor information from the given data (either cell or point data). """ attr = {'scalars':[], 'vectors':[], 'tensors':[]} if data is not None: n = data.number_of_arrays for i in range(n): name = data.get_array_name(i) arr = data.get_array(i) if arr is not None: # Some VTK datasets claim they have n arrays, but # actually some of these are None (eg the output of a # tvtk.GraphToPolyData()) t = get_array_type(arr) if len(t) > 0 and name is not None: attr[t].extend([name]) def _mk_first(lst, value): """Makes the specified `value` the first item in `lst`.""" lst.remove(value) lst.insert(0, value) attr1 = attr.copy() for a in attr: v = getattr(data, a) if v is not None: name = v.name if name is not None: try: _mk_first(attr[a], v.name) except ValueError: # Sometimes we have a multi-component scalar. attr1[a].insert(0, name) return attr1 def get_all_attributes(obj): """Gets the scalar, vector and tensor attributes that are available in the given VTK data object. """ point_attr = get_attribute_list(obj.point_data) cell_attr = get_attribute_list(obj.cell_data) return point_attr, cell_attr ###################################################################### # `VTKXMLFileReader` class ###################################################################### class VTKXMLFileReader(FileDataSource): """A VTK XML file reader. The reader supports all the different types of data sets. This reader also supports a time series. Currently, this reader assumes that there is only one output that has configurable attributes. """ # The version of this class. Used for persistence. __version__ = 0 ######################################## # Dynamic traits: These traits are dynamic and are automatically # updated depending on the contents of the file. # The active point scalar name. An empty string indicates that # the attribute is "deactivated". This is useful when you have # both point and cell attributes and want to use cell data by # default. point_scalars_name = DEnum(values_name='_point_scalars_list', desc='scalar point data attribute to use') # The active point vector name. point_vectors_name = DEnum(values_name='_point_vectors_list', desc='vectors point data attribute to use') # The active point tensor name. point_tensors_name = DEnum(values_name='_point_tensors_list', desc='tensor point data attribute to use') # The active cell scalar name. cell_scalars_name = DEnum(values_name='_cell_scalars_list', desc='scalar cell data attribute to use') # The active cell vector name. cell_vectors_name = DEnum(values_name='_cell_vectors_list', desc='vectors cell data attribute to use') # The active cell tensor name. cell_tensors_name = DEnum(values_name='_cell_tensors_list', desc='tensor cell data attribute to use') ######################################## # The VTK data file reader. reader = Instance(tvtk.XMLReader) refresh = Button('Update reader') # Information about what this object can produce. output_info = PipelineInfo(datasets=['any'], attribute_types=['any'], attributes=['any']) # Our view. view = View(Group(Include('time_step_group'), Item(name='point_scalars_name'), Item(name='point_vectors_name'), Item(name='point_tensors_name'), Item(name='cell_scalars_name'), Item(name='cell_vectors_name'), Item(name='cell_tensors_name'), Item(name='reader'), Item(name='refresh', show_label=False) )) ######################################## # Private traits. # These private traits store the list of available data # attributes. The non-private traits use these lists internally. _point_scalars_list = List(Str) _point_vectors_list = List(Str) _point_tensors_list = List(Str) _cell_scalars_list = List(Str) _cell_vectors_list = List(Str) _cell_tensors_list = List(Str) # This filter allows us to change the attributes of the data # object and will ensure that the pipeline is properly taken care # of. Directly setting the array in the VTK object will not do # this. _assign_attribute = Instance(tvtk.AssignAttribute, args=(), allow_none=False) # Toggles if this is the first time this object has been used. _first = Bool(True) ###################################################################### # `object` interface ###################################################################### def __get_pure_state__(self): d = super(VTKXMLFileReader, self).__get_pure_state__() for name in ('_assign_attribute', '_first'): d.pop(name, None) # Pickle the 'point_scalars_name' etc. since these are # properties and not in __dict__. attr = {} for name in ('point_scalars', 'point_vectors', 'point_tensors', 'cell_scalars', 'cell_vectors', 'cell_tensors'): d.pop('_' + name + '_list', None) d.pop('_' + name + '_name', None) x = name + '_name' attr[x] = getattr(self, x) d.update(attr) return d def __set_pure_state__(self, state): # The reader has its own file_name which needs to be fixed. state.reader.file_name = state.file_path.abs_pth # Now call the parent class to setup everything. super(VTKXMLFileReader, self).__set_pure_state__(state) ###################################################################### # `Base` interface ###################################################################### def start(self): """This is invoked when this object is added to the mayavi pipeline. """ # Do nothing if we are already running. if self.running: return # Call the parent method to do its thing. This will typically # start all our children. super(VTKXMLFileReader, self).start() def stop(self): """Invoked when this object is removed from the mayavi pipeline. """ if not self.running: return # Call the parent method to do its thing. super(VTKXMLFileReader, self).stop() ###################################################################### # `FileDataSource` interface ###################################################################### def update(self): if len(self.file_path.get()) == 0: return reader = self.reader reader.update() self.render() def update_data(self): if len(self.file_path.get()) == 0: return self.reader.update() pnt_attr, cell_attr = get_all_attributes(self.reader.output) def _setup_data_traits(obj, attributes, d_type): """Given the object, the dict of the attributes from the `get_all_attributes` function and the data type (point/cell) data this will setup the object and the data. """ attrs = ['scalars', 'vectors', 'tensors'] aa = obj._assign_attribute data = getattr(obj.reader.output, '%s_data'%d_type) for attr in attrs: values = attributes[attr] values.append('') setattr(obj, '_%s_%s_list'%(d_type, attr), values) if len(values) > 1: default = getattr(obj, '%s_%s_name'%(d_type, attr)) if obj._first and len(default) == 0: default = values[0] getattr(data, 'set_active_%s'%attr)(default) aa.assign(default, attr.upper(), d_type.upper() +'_DATA') aa.update() kw = {'%s_%s_name'%(d_type, attr): default, 'trait_change_notify': False} obj.set(**kw) _setup_data_traits(self, cell_attr, 'cell') _setup_data_traits(self, pnt_attr, 'point') if self._first: self._first = False # Propagate the data changed event. self.data_changed = True def has_output_port(self): """ Return True as the reader has output port.""" return True def get_output_object(self): """ Return the reader output port.""" return self.reader.output_port ###################################################################### # Non-public interface ###################################################################### def _file_path_changed(self, fpath): value = fpath.get() if len(value) == 0: return else: if self.reader is None: d_type = find_file_data_type(fpath.get()) self.reader = eval('tvtk.XML%sReader()'%d_type) reader = self.reader reader.file_name = value reader.update() # Setup the outputs by resetting self.outputs. Changing # the outputs automatically fires a pipeline_changed # event. try: n = reader.number_of_outputs except AttributeError: # for VTK >= 4.5 n = reader.number_of_output_ports outputs = [] for i in range(n): outputs.append(reader.get_output(i)) # FIXME: Only the first output goes through the assign # attribute filter. aa = self._assign_attribute self.configure_input_data(aa, outputs[0]) outputs[0] = aa.output self.update_data() self.outputs = outputs # FIXME: The output info is only based on the first output. self.output_info.datasets = [get_tvtk_dataset_name(outputs[0])] # Change our name on the tree view self.name = self._get_name() def _set_data_name(self, data_type, attr_type, value): if value is None: return reader_output = self.reader.output if len(value) == 0: # If the value is empty then we deactivate that attribute. d = getattr(reader_output, attr_type + '_data') method = getattr(d, 'set_active_%s'%data_type) method(None) self.data_changed = True return aa = self._assign_attribute data = None if attr_type == 'point': data = reader_output.point_data elif attr_type == 'cell': data = reader_output.cell_data method = getattr(data, 'set_active_%s'%data_type) method(value) aa.assign(value, data_type.upper(), attr_type.upper() +'_DATA') aa.update() # Fire an event, so the changes propagate. self.data_changed = True def _point_scalars_name_changed(self, value): self._set_data_name('scalars', 'point', value) def _point_vectors_name_changed(self, value): self._set_data_name('vectors', 'point', value) def _point_tensors_name_changed(self, value): self._set_data_name('tensors', 'point', value) def _cell_scalars_name_changed(self, value): self._set_data_name('scalars', 'cell', value) def _cell_vectors_name_changed(self, value): self._set_data_name('vectors', 'cell', value) def _cell_tensors_name_changed(self, value): self._set_data_name('tensors', 'cell', value) def _get_name(self): """ Gets the name to display on the tree view. """ fname = basename(self.file_path.get()) ret = "VTK XML file (%s)"%fname if len(self.file_list) > 1: ret += " (timeseries)" if '[Hidden]' in self.name: ret += ' [Hidden]' return ret def _refresh_fired(self): self.reader.modified() self.update_data() mayavi-4.5.0/mayavi/tests/0000755000076500000240000000000012747722127016055 5ustar prabhustaff00000000000000mayavi-4.5.0/mayavi/tests/__init__.py0000644000076500000240000000000012747716314020155 0ustar prabhustaff00000000000000mayavi-4.5.0/mayavi/tests/common.py0000644000076500000240000000126412747716314017723 0ustar prabhustaff00000000000000""" Common code for mayavi tests. """ # Author: Prabhu Ramachandran # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. import os.path from traits.api import HasTraits, Any, Event, Callable def fixpath(filename): """Given a relative file path it sets the path relative to this directory. This allows us to run the tests from other directories as well. """ return os.path.join(os.path.dirname(__file__), filename) def get_example_data(fname): """Given a relative path to data inside the examples directory, obtains the full path to the file. """ p = os.path.join('data', fname) return os.path.abspath(fixpath(p)) mayavi-4.5.0/mayavi/tests/csv_files/0000755000076500000240000000000012747722127020032 5ustar prabhustaff00000000000000mayavi-4.5.0/mayavi/tests/csv_files/11.csv0000644000076500000240000000226012747716314020771 0ustar prabhustaff0000000000000008 02 22 97 38 15 00 40 00 75 04 05 07 78 52 12 50 77 91 08 49 49 99 40 17 81 18 57 60 87 17 40 98 43 69 48 04 56 62 00 81 49 31 73 55 79 14 29 93 71 40 67 53 88 30 03 49 13 36 65 52 70 95 23 04 60 11 42 69 24 68 56 01 32 56 71 37 02 36 91 22 31 16 71 51 67 63 89 41 92 36 54 22 40 40 28 66 33 13 80 24 47 32 60 99 03 45 02 44 75 33 53 78 36 84 20 35 17 12 50 32 98 81 28 64 23 67 10 26 38 40 67 59 54 70 66 18 38 64 70 67 26 20 68 02 62 12 20 95 63 94 39 63 08 40 91 66 49 94 21 24 55 58 05 66 73 99 26 97 17 78 78 96 83 14 88 34 89 63 72 21 36 23 09 75 00 76 44 20 45 35 14 00 61 33 97 34 31 33 95 78 17 53 28 22 75 31 67 15 94 03 80 04 62 16 14 09 53 56 92 16 39 05 42 96 35 31 47 55 58 88 24 00 17 54 24 36 29 85 57 86 56 00 48 35 71 89 07 05 44 44 37 44 60 21 58 51 54 17 58 19 80 81 68 05 94 47 69 28 73 92 13 86 52 17 77 04 89 55 40 04 52 08 83 97 35 99 16 07 97 57 32 16 26 26 79 33 27 98 66 88 36 68 87 57 62 20 72 03 46 33 67 46 55 12 32 63 93 53 69 04 42 16 73 38 25 39 11 24 94 72 18 08 46 29 32 40 62 76 36 20 69 36 41 72 30 23 88 34 62 99 69 82 67 59 85 74 04 36 16 20 73 35 29 78 31 90 01 74 31 49 71 48 86 81 16 23 57 05 54 01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48 mayavi-4.5.0/mayavi/tests/csv_files/11.py0000644000076500000240000000776412747716314020644 0ustar prabhustaff00000000000000{ 'array': array([ (8.0, 2.0, 22.0, 97.0, 38.0, 15.0, 0.0, 40.0, 0.0, 75.0, 4.0, 5.0, 7.0, 78.0, 52.0, 12.0, 50.0, 77.0, 91.0, 8.0), (49.0, 49.0, 99.0, 40.0, 17.0, 81.0, 18.0, 57.0, 60.0, 87.0, 17.0, 40.0, 98.0, 43.0, 69.0, 48.0, 4.0, 56.0, 62.0, 0.0), (81.0, 49.0, 31.0, 73.0, 55.0, 79.0, 14.0, 29.0, 93.0, 71.0, 40.0, 67.0, 53.0, 88.0, 30.0, 3.0, 49.0, 13.0, 36.0, 65.0), (52.0, 70.0, 95.0, 23.0, 4.0, 60.0, 11.0, 42.0, 69.0, 24.0, 68.0, 56.0, 1.0, 32.0, 56.0, 71.0, 37.0, 2.0, 36.0, 91.0), (22.0, 31.0, 16.0, 71.0, 51.0, 67.0, 63.0, 89.0, 41.0, 92.0, 36.0, 54.0, 22.0, 40.0, 40.0, 28.0, 66.0, 33.0, 13.0, 80.0), (24.0, 47.0, 32.0, 60.0, 99.0, 3.0, 45.0, 2.0, 44.0, 75.0, 33.0, 53.0, 78.0, 36.0, 84.0, 20.0, 35.0, 17.0, 12.0, 50.0), (32.0, 98.0, 81.0, 28.0, 64.0, 23.0, 67.0, 10.0, 26.0, 38.0, 40.0, 67.0, 59.0, 54.0, 70.0, 66.0, 18.0, 38.0, 64.0, 70.0), (67.0, 26.0, 20.0, 68.0, 2.0, 62.0, 12.0, 20.0, 95.0, 63.0, 94.0, 39.0, 63.0, 8.0, 40.0, 91.0, 66.0, 49.0, 94.0, 21.0), (24.0, 55.0, 58.0, 5.0, 66.0, 73.0, 99.0, 26.0, 97.0, 17.0, 78.0, 78.0, 96.0, 83.0, 14.0, 88.0, 34.0, 89.0, 63.0, 72.0), (21.0, 36.0, 23.0, 9.0, 75.0, 0.0, 76.0, 44.0, 20.0, 45.0, 35.0, 14.0, 0.0, 61.0, 33.0, 97.0, 34.0, 31.0, 33.0, 95.0), (78.0, 17.0, 53.0, 28.0, 22.0, 75.0, 31.0, 67.0, 15.0, 94.0, 3.0, 80.0, 4.0, 62.0, 16.0, 14.0, 9.0, 53.0, 56.0, 92.0), (16.0, 39.0, 5.0, 42.0, 96.0, 35.0, 31.0, 47.0, 55.0, 58.0, 88.0, 24.0, 0.0, 17.0, 54.0, 24.0, 36.0, 29.0, 85.0, 57.0), (86.0, 56.0, 0.0, 48.0, 35.0, 71.0, 89.0, 7.0, 5.0, 44.0, 44.0, 37.0, 44.0, 60.0, 21.0, 58.0, 51.0, 54.0, 17.0, 58.0), (19.0, 80.0, 81.0, 68.0, 5.0, 94.0, 47.0, 69.0, 28.0, 73.0, 92.0, 13.0, 86.0, 52.0, 17.0, 77.0, 4.0, 89.0, 55.0, 40.0), (4.0, 52.0, 8.0, 83.0, 97.0, 35.0, 99.0, 16.0, 7.0, 97.0, 57.0, 32.0, 16.0, 26.0, 26.0, 79.0, 33.0, 27.0, 98.0, 66.0), (88.0, 36.0, 68.0, 87.0, 57.0, 62.0, 20.0, 72.0, 3.0, 46.0, 33.0, 67.0, 46.0, 55.0, 12.0, 32.0, 63.0, 93.0, 53.0, 69.0), (4.0, 42.0, 16.0, 73.0, 38.0, 25.0, 39.0, 11.0, 24.0, 94.0, 72.0, 18.0, 8.0, 46.0, 29.0, 32.0, 40.0, 62.0, 76.0, 36.0), (20.0, 69.0, 36.0, 41.0, 72.0, 30.0, 23.0, 88.0, 34.0, 62.0, 99.0, 69.0, 82.0, 67.0, 59.0, 85.0, 74.0, 4.0, 36.0, 16.0), (20.0, 73.0, 35.0, 29.0, 78.0, 31.0, 90.0, 1.0, 74.0, 31.0, 49.0, 71.0, 48.0, 86.0, 81.0, 16.0, 23.0, 57.0, 5.0, 54.0), (1.0, 70.0, 54.0, 71.0, 83.0, 51.0, 54.0, 69.0, 16.0, 92.0, 33.0, 48.0, 61.0, 43.0, 52.0, 1.0, 89.0, 19.0, 67.0, 48.0)], dtype=[('Column 1', float), ('Column 2', float), ('Column 3', float), ('Column 4', float), ('Column 5', float), ('Column 6', float), ('Column 7', float), ('Column 8', float), ('Column 9', float), ('Column 10', float), ('Column 11', float), ('Column 12', float), ('Column 13', float), ('Column 14', float), ('Column 15', float), ('Column 16', float), ('Column 17', float), ('Column 18', float), ('Column 19', float), ('Column 20', float)]), 'kwds': { 'comments': '#', 'delimiter': None, 'dtype': { 'formats': 20 * (float,), 'names': ( 'Column 1', 'Column 2', 'Column 3', 'Column 4', 'Column 5', 'Column 6', 'Column 7', 'Column 8', 'Column 9', 'Column 10', 'Column 11', 'Column 12', 'Column 13', 'Column 14', 'Column 15', 'Column 16', 'Column 17', 'Column 18', 'Column 19', 'Column 20')}, 'skiprows': 0 } } mayavi-4.5.0/mayavi/tests/csv_files/1col.csv0000644000076500000240000000012312747716314021402 0ustar prabhustaff00000000000000# x-values # xmean = 6.1352 # sx = 0.4287309179 5.552 5.963 6.135 6.313 6.713 mayavi-4.5.0/mayavi/tests/csv_files/1col.py0000644000076500000240000000057712747716314021254 0ustar prabhustaff00000000000000{ 'array': array([(5.552,), (5.963,), (6.135,), (6.313,), (6.713,)], dtype=[('x-values', '", 'float') out = out.replace("' # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. The files in this directory are test cases for test_csv_sniff.py ---------------------------------------------------------------- For each xxx.csv and xxx.py the test involves these steps: 1. sniff the xxx.csv; detecting the keyword arguments for numpy.loadtxt 2. load the array using numpy.loadtxt with the detected keywords 3. load the xxx.py [using eval(open('xxx.py').read())] 4. compare the two numpy arrays obtained in step 2 and 3 mayavi-4.5.0/mayavi/tests/csv_files/webaccess.csv0000644000076500000240000000123112747716314022504 0ustar prabhustaff00000000000000Codespeak web access data, number of visits 2003-09-15, 10713 2003-10-15, 23482 2003-11-15, 8522 2003-12-15, 11776 2004-01-15, 6048 2004-02-15, 4196 2004-03-15, 3406 2004-04-15, 4475 2004-05-15, 5304 2004-06-15, 7551 2004-07-15, 4898 2004-08-15, 11499 2004-09-15, 7922 2004-10-15, 10261 2004-11-15, 11866 2004-12-15, 22312 2005-01-15, 10421 2005-02-15, 10564 2005-03-15, 13774 2005-04-15, 20336 2005-05-15, 26889 2005-06-15, 10080 2005-07-15, 13330 2005-08-15, 26420 2005-09-15, 27044 2005-10-15, 34789 2005-11-15, 34332 2005-12-15, 39317 2006-01-15, 41423 2006-02-15, 26403 2006-03-15, 34117 2006-04-15, 30342 2006-05-15, 36894 2006-06-15, 49460 2006-07-15, 31944 mayavi-4.5.0/mayavi/tests/csv_files/webaccess.py0000644000076500000240000000240312747716314022343 0ustar prabhustaff00000000000000{ 'array': array([('2003-09-15', 10713.0), ('2003-10-15', 23482.0), ('2003-11-15', 8522.0), ('2003-12-15', 11776.0), ('2004-01-15', 6048.0), ('2004-02-15', 4196.0), ('2004-03-15', 3406.0), ('2004-04-15', 4475.0), ('2004-05-15', 5304.0), ('2004-06-15', 7551.0), ('2004-07-15', 4898.0), ('2004-08-15', 11499.0), ('2004-09-15', 7922.0), ('2004-10-15', 10261.0), ('2004-11-15', 11866.0), ('2004-12-15', 22312.0), ('2005-01-15', 10421.0), ('2005-02-15', 10564.0), ('2005-03-15', 13774.0), ('2005-04-15', 20336.0), ('2005-05-15', 26889.0), ('2005-06-15', 10080.0), ('2005-07-15', 13330.0), ('2005-08-15', 26420.0), ('2005-09-15', 27044.0), ('2005-10-15', 34789.0), ('2005-11-15', 34332.0), ('2005-12-15', 39317.0), ('2006-01-15', 41423.0), ('2006-02-15', 26403.0), ('2006-03-15', 34117.0), ('2006-04-15', 30342.0), ('2006-05-15', 36894.0), ('2006-06-15', 49460.0), ('2006-07-15', 31944.0)], dtype=[('data', 'S10'), ('number of visits', float)]), 'kwds': { 'comments': '#', 'delimiter': ',', 'dtype': { 'formats': ('S10', float), 'names': ('data', 'number of visits')}, 'skiprows': 2 } } mayavi-4.5.0/mayavi/tests/data/0000755000076500000240000000000012747722127016766 5ustar prabhustaff00000000000000mayavi-4.5.0/mayavi/tests/data/caffeine.pdb0000644000076500000240000000375112747716314021224 0ustar prabhustaff00000000000000ATOM 1 N1 BENZ 1 5.040 1.944 -8.324 ATOM 2 C2 BENZ 1 6.469 2.092 -7.915 ATOM 3 C3 BENZ 1 7.431 0.865 -8.072 ATOM 4 C4 BENZ 1 6.916 -0.391 -8.544 ATOM 5 N5 BENZ 1 5.532 -0.541 -8.901 ATOM 6 C6 BENZ 1 4.590 0.523 -8.394 ATOM 7 C11 BENZ 1 4.045 3.041 -8.005 ATOM 8 H111BENZ 1 4.453 4.038 -8.264 ATOM 9 H112BENZ 1 3.101 2.907 -8.570 ATOM 10 H113BENZ 1 3.795 3.050 -6.926 ATOM 11 O21 BENZ 1 6.879 3.181 -7.503 ATOM 12 C51 BENZ 1 4.907 -1.659 -9.696 ATOM 13 H511BENZ 1 4.397 -1.273 -10.599 ATOM 14 H512BENZ 1 5.669 -2.391 -10.028 ATOM 15 H513BENZ 1 4.161 -2.209 -9.089 ATOM 16 O61 BENZ 1 3.470 0.208 -7.986 ATOM 17 N1 NSP3 1B 8.807 0.809 -7.799 ATOM 18 N1 NSP3 1C 7.982 -1.285 -8.604 ATOM 19 C1 CSP3 1D 9.015 -0.500 -8.152 ATOM 20 H1 CSP3 1D 10.007 -0.926 -8.079 ATOM 21 C1 CSP3 1E 9.756 1.835 -7.299 ATOM 22 H11 CSP3 1E 10.776 1.419 -7.199 ATOM 23 H12 CSP3 1E 9.437 2.207 -6.309 ATOM 24 H13 CSP3 1E 9.801 2.693 -7.994 TER mayavi-4.5.0/mayavi/tests/data/cellsnd.ascii.inp0000755000076500000240000000222112747716314022212 0ustar prabhustaff00000000000000# AVS UCD File # foo # num_nodes num_cells num_node_data num_cell_data num_model_data # nodal coordinates # cell type, topology 13 12 1 2 0 0 -1.000000 -1.000000 0.000000 1 1.000000 -1.000000 0.000000 2 1.000000 1.000000 0.000000 3 -1.000000 1.000000 0.000000 4 0.000000 -2.000000 0.000000 5 2.000000 0.000000 0.000000 6 0.000000 2.000000 0.000000 7 -2.000000 0.000000 0.000000 8 0.000000 -1.000000 0.000000 9 1.000000 0.000000 0.000000 10 0.000000 1.000000 0.000000 11 -1.000000 0.000000 0.000000 12 0.000000 0.000000 0.000000 0 1 tri 0 4 8 1 1 tri 8 4 1 2 2 tri 1 5 9 3 2 tri 9 5 2 4 3 tri 10 2 6 5 3 tri 10 6 3 6 4 tri 7 11 3 7 4 tri 0 11 7 8 1 quad 0 8 12 11 9 1 quad 8 1 9 12 10 1 quad 12 9 2 10 11 1 quad 12 10 3 11 1 1 temperature, F 0 6.000000 1 5.000000 2 6.666667 3 8.333333 4 1.500000 5 3.500000 6 5.500000 7 7.500000 8 5.500000 9 7.000000 10 8.500000 11 9.000000 12 10.500000 2 1 1 temperature, F pressure, p 0 1.000000 12.000000 1 2.000000 11.000000 2 3.000000 10.000000 3 4.000000 9.000000 4 5.000000 8.000000 5 6.000000 7.000000 6 7.000000 6.000000 7 8.000000 5.000000 8 9.000000 4.000000 9 10.000000 3.000000 10 11.000000 2.000000 11 12.000000 1.000000 mayavi-4.5.0/mayavi/tests/data/clown.facet0000644000076500000240000007127412747716314021130 0ustar prabhustaff00000000000000FACET FILE FROM VTK 4 Element0x806a640 0 86 0 0 0 0 0.5 0 0 -0.5 0.216942 0 0.450484 0.390916 0 0.311745 0.487464 0 0.11126 0.487464 0 -0.11126 0.390916 0 -0.311745 0.216942 0 -0.450484 0.195458 0.0941276 0.450484 0.352203 0.169612 0.311745 0.43919 0.211503 0.11126 0.43919 0.211503 -0.11126 0.352203 0.169612 -0.311745 0.195458 0.0941275 -0.450484 0.135261 0.169612 0.450484 0.243732 0.30563 0.311745 0.303929 0.381115 0.11126 0.303929 0.381115 -0.11126 0.243732 0.30563 -0.311745 0.135261 0.169612 -0.450484 0.0482741 0.211503 0.450484 0.0869869 0.381115 0.311745 0.108471 0.475242 0.11126 0.108471 0.475242 -0.11126 0.0869869 0.381115 -0.311745 0.0482741 0.211503 -0.450484 -0.0482741 0.211503 0.450484 -0.086987 0.381115 0.311745 -0.108471 0.475242 0.11126 -0.108471 0.475242 -0.11126 -0.086987 0.381115 -0.311745 -0.0482741 0.211503 -0.450484 -0.135261 0.169612 0.450484 -0.243732 0.30563 0.311745 -0.303929 0.381115 0.11126 -0.303929 0.381115 -0.11126 -0.243732 0.30563 -0.311745 -0.135261 0.169612 -0.450484 -0.195458 0.0941275 0.450484 -0.352203 0.169612 0.311745 -0.43919 0.211503 0.11126 -0.43919 0.211503 -0.11126 -0.352203 0.169612 -0.311745 -0.195458 0.0941275 -0.450484 -0.216942 -1.89657e-08 0.450484 -0.390916 -3.41749e-08 0.311745 -0.487464 -4.26155e-08 0.11126 -0.487464 -4.26155e-08 -0.11126 -0.390916 -3.41749e-08 -0.311745 -0.216942 -1.89657e-08 -0.450484 -0.195458 -0.0941276 0.450484 -0.352203 -0.169612 0.311745 -0.43919 -0.211503 0.11126 -0.43919 -0.211503 -0.11126 -0.352203 -0.169612 -0.311745 -0.195458 -0.0941276 -0.450484 -0.135261 -0.169612 0.450484 -0.243732 -0.30563 0.311745 -0.303929 -0.381115 0.11126 -0.303929 -0.381115 -0.11126 -0.243732 -0.30563 -0.311745 -0.135261 -0.169612 -0.450484 -0.0482741 -0.211503 0.450484 -0.0869869 -0.381115 0.311745 -0.108471 -0.475242 0.11126 -0.108471 -0.475242 -0.11126 -0.0869869 -0.381115 -0.311745 -0.0482741 -0.211503 -0.450484 0.0482741 -0.211503 0.450484 0.086987 -0.381115 0.311745 0.108471 -0.475242 0.11126 0.108471 -0.475242 -0.11126 0.086987 -0.381115 -0.311745 0.0482741 -0.211503 -0.450484 0.135261 -0.169612 0.450484 0.243732 -0.30563 0.311745 0.303929 -0.381115 0.11126 0.303929 -0.381115 -0.11126 0.243732 -0.30563 -0.311745 0.135261 -0.169612 -0.450484 0.195458 -0.0941275 0.450484 0.352203 -0.169612 0.311745 0.43919 -0.211503 0.11126 0.43919 -0.211503 -0.11126 0.352203 -0.169612 -0.311745 0.195458 -0.0941275 -0.450484 1 Element0x806a640 168 3 3 9 1 0 0 9 15 1 0 0 15 21 1 0 0 21 27 1 0 0 27 33 1 0 0 33 39 1 0 0 39 45 1 0 0 45 51 1 0 0 51 57 1 0 0 57 63 1 0 0 63 69 1 0 0 69 75 1 0 0 75 81 1 0 0 81 3 1 0 0 8 2 14 0 0 14 2 20 0 0 20 2 26 0 0 26 2 32 0 0 32 2 38 0 0 38 2 44 0 0 44 2 50 0 0 50 2 56 0 0 56 2 62 0 0 62 2 68 0 0 68 2 74 0 0 74 2 80 0 0 80 2 86 0 0 86 2 8 0 0 3 4 10 0 0 3 10 9 0 0 4 5 11 0 0 4 11 10 0 0 5 6 12 0 0 5 12 11 0 0 6 7 13 0 0 6 13 12 0 0 7 8 14 0 0 7 14 13 0 0 9 10 16 0 0 9 16 15 0 0 10 11 17 0 0 10 17 16 0 0 11 12 18 0 0 11 18 17 0 0 12 13 19 0 0 12 19 18 0 0 13 14 20 0 0 13 20 19 0 0 15 16 22 0 0 15 22 21 0 0 16 17 23 0 0 16 23 22 0 0 17 18 24 0 0 17 24 23 0 0 18 19 25 0 0 18 25 24 0 0 19 20 26 0 0 19 26 25 0 0 21 22 28 0 0 21 28 27 0 0 22 23 29 0 0 22 29 28 0 0 23 24 30 0 0 23 30 29 0 0 24 25 31 0 0 24 31 30 0 0 25 26 32 0 0 25 32 31 0 0 27 28 34 0 0 27 34 33 0 0 28 29 35 0 0 28 35 34 0 0 29 30 36 0 0 29 36 35 0 0 30 31 37 0 0 30 37 36 0 0 31 32 38 0 0 31 38 37 0 0 33 34 40 0 0 33 40 39 0 0 34 35 41 0 0 34 41 40 0 0 35 36 42 0 0 35 42 41 0 0 36 37 43 0 0 36 43 42 0 0 37 38 44 0 0 37 44 43 0 0 39 40 46 0 0 39 46 45 0 0 40 41 47 0 0 40 47 46 0 0 41 42 48 0 0 41 48 47 0 0 42 43 49 0 0 42 49 48 0 0 43 44 50 0 0 43 50 49 0 0 45 46 52 0 0 45 52 51 0 0 46 47 53 0 0 46 53 52 0 0 47 48 54 0 0 47 54 53 0 0 48 49 55 0 0 48 55 54 0 0 49 50 56 0 0 49 56 55 0 0 51 52 58 0 0 51 58 57 0 0 52 53 59 0 0 52 59 58 0 0 53 54 60 0 0 53 60 59 0 0 54 55 61 0 0 54 61 60 0 0 55 56 62 0 0 55 62 61 0 0 57 58 64 0 0 57 64 63 0 0 58 59 65 0 0 58 65 64 0 0 59 60 66 0 0 59 66 65 0 0 60 61 67 0 0 60 67 66 0 0 61 62 68 0 0 61 68 67 0 0 63 64 70 0 0 63 70 69 0 0 64 65 71 0 0 64 71 70 0 0 65 66 72 0 0 65 72 71 0 0 66 67 73 0 0 66 73 72 0 0 67 68 74 0 0 67 74 73 0 0 69 70 76 0 0 69 76 75 0 0 70 71 77 0 0 70 77 76 0 0 71 72 78 0 0 71 78 77 0 0 72 73 79 0 0 72 79 78 0 0 73 74 80 0 0 73 80 79 0 0 75 76 82 0 0 75 82 81 0 0 76 77 83 0 0 76 83 82 0 0 77 78 84 0 0 77 84 83 0 0 78 79 85 0 0 78 85 84 0 0 79 80 86 0 0 79 86 85 0 0 81 82 4 0 0 81 4 3 0 0 82 83 5 0 0 82 5 4 0 0 83 84 6 0 0 83 6 5 0 0 84 85 7 0 0 84 7 6 0 0 85 86 8 0 0 85 8 7 0 0 Element0x806afc8 0 15 0 0 2.46519e-32 1.11022e-16 -1.09 -0.5 4.93038e-32 -0.09 -0.450484 0.216942 -0.09 -0.311745 0.390916 -0.09 -0.11126 0.487464 -0.09 0.11126 0.487464 -0.09 0.311745 0.390916 -0.09 0.450484 0.216942 -0.09 0.5 -2.05104e-10 -0.09 0.450484 -0.216942 -0.09 0.311745 -0.390916 -0.09 0.11126 -0.487464 -0.09 -0.11126 -0.487464 -0.09 -0.311745 -0.390916 -0.09 -0.450484 -0.216942 -0.09 1 Element0x806afc8 26 3 14 13 15 0 0 13 12 15 0 0 15 12 2 0 0 2 12 3 0 0 3 12 4 0 0 4 12 5 0 0 5 12 6 0 0 6 12 7 0 0 12 11 7 0 0 7 11 8 0 0 8 11 9 0 0 10 9 11 0 0 1 2 3 0 0 1 3 4 0 0 1 4 5 0 0 1 5 6 0 0 1 6 7 0 0 1 7 8 0 0 1 8 9 0 0 1 9 10 0 0 1 10 11 0 0 1 11 12 0 0 1 12 13 0 0 1 13 14 0 0 1 14 15 0 0 1 15 2 0 0 Element0x806b668 0 50 0 0 0.5 0 0.2 0.5 0 -0.2 0.586777 0 0.180194 0.656366 0 0.124698 0.694986 0 0.0445042 0.694986 0 -0.0445042 0.656366 0 -0.124698 0.586777 0 -0.180194 0.56136 0.0613604 0.180194 0.610568 0.110568 0.124698 0.637876 0.137876 0.0445042 0.637876 0.137876 -0.0445042 0.610568 0.110568 -0.124698 0.56136 0.0613604 -0.180194 0.5 0.0867767 0.180194 0.5 0.156366 0.124698 0.5 0.194986 0.0445042 0.5 0.194986 -0.0445042 0.5 0.156366 -0.124698 0.5 0.0867767 -0.180194 0.43864 0.0613604 0.180194 0.389432 0.110568 0.124698 0.362124 0.137876 0.0445042 0.362124 0.137876 -0.0445042 0.389432 0.110568 -0.124698 0.43864 0.0613604 -0.180194 0.413223 -7.58626e-09 0.180194 0.343634 -1.367e-08 0.124698 0.305014 -1.70462e-08 0.0445042 0.305014 -1.70462e-08 -0.0445042 0.343634 -1.367e-08 -0.124698 0.413223 -7.58626e-09 -0.180194 0.43864 -0.0613604 0.180194 0.389432 -0.110568 0.124698 0.362124 -0.137876 0.0445042 0.362124 -0.137876 -0.0445042 0.389432 -0.110568 -0.124698 0.43864 -0.0613604 -0.180194 0.5 -0.0867767 0.180194 0.5 -0.156366 0.124698 0.5 -0.194986 0.0445042 0.5 -0.194986 -0.0445042 0.5 -0.156366 -0.124698 0.5 -0.0867767 -0.180194 0.56136 -0.0613604 0.180194 0.610568 -0.110568 0.124698 0.637876 -0.137876 0.0445042 0.637876 -0.137876 -0.0445042 0.610568 -0.110568 -0.124698 0.56136 -0.0613604 -0.180194 1 Element0x806b668 96 3 3 9 1 0 0 9 15 1 0 0 15 21 1 0 0 21 27 1 0 0 27 33 1 0 0 33 39 1 0 0 39 45 1 0 0 45 3 1 0 0 8 2 14 0 0 14 2 20 0 0 20 2 26 0 0 26 2 32 0 0 32 2 38 0 0 38 2 44 0 0 44 2 50 0 0 50 2 8 0 0 3 4 10 0 0 3 10 9 0 0 4 5 11 0 0 4 11 10 0 0 5 6 12 0 0 5 12 11 0 0 6 7 13 0 0 6 13 12 0 0 7 8 14 0 0 7 14 13 0 0 9 10 16 0 0 9 16 15 0 0 10 11 17 0 0 10 17 16 0 0 11 12 18 0 0 11 18 17 0 0 12 13 19 0 0 12 19 18 0 0 13 14 20 0 0 13 20 19 0 0 15 16 22 0 0 15 22 21 0 0 16 17 23 0 0 16 23 22 0 0 17 18 24 0 0 17 24 23 0 0 18 19 25 0 0 18 25 24 0 0 19 20 26 0 0 19 26 25 0 0 21 22 28 0 0 21 28 27 0 0 22 23 29 0 0 22 29 28 0 0 23 24 30 0 0 23 30 29 0 0 24 25 31 0 0 24 31 30 0 0 25 26 32 0 0 25 32 31 0 0 27 28 34 0 0 27 34 33 0 0 28 29 35 0 0 28 35 34 0 0 29 30 36 0 0 29 36 35 0 0 30 31 37 0 0 30 37 36 0 0 31 32 38 0 0 31 38 37 0 0 33 34 40 0 0 33 40 39 0 0 34 35 41 0 0 34 41 40 0 0 35 36 42 0 0 35 42 41 0 0 36 37 43 0 0 36 43 42 0 0 37 38 44 0 0 37 44 43 0 0 39 40 46 0 0 39 46 45 0 0 40 41 47 0 0 40 47 46 0 0 41 42 48 0 0 41 48 47 0 0 42 43 49 0 0 42 49 48 0 0 43 44 50 0 0 43 50 49 0 0 45 46 4 0 0 45 4 3 0 0 46 47 5 0 0 46 5 4 0 0 47 48 6 0 0 47 6 5 0 0 48 49 7 0 0 48 7 6 0 0 49 50 8 0 0 49 8 7 0 0 Element0x806bd08 0 480 0 0 0.198199 1.31144e-08 -0.0567085 0.203909 -0.0574068 -0.0468194 0.220168 -0.106074 -0.0186577 0.220168 -0.106074 -0.0186577 0.244502 -0.138592 0.0234893 0.273205 -0.150011 0.0732051 0.273205 -0.150011 0.0732051 0.301908 -0.138592 0.122921 0.326242 -0.106074 0.165068 0.326242 -0.106074 0.165068 0.342501 -0.0574068 0.19323 0.348211 -7.73183e-17 0.203119 0.348211 -7.73183e-17 0.203119 0.342501 0.0574068 0.19323 0.326242 0.106074 0.165068 0.326242 0.106074 0.165068 0.301908 0.138592 0.122921 0.273205 0.150011 0.0732051 0.273205 0.150011 0.0732051 0.244502 0.138592 0.0234893 0.220168 0.106074 -0.0186577 0.220168 0.106074 -0.0186577 0.203909 0.0574068 -0.0468194 0.198199 -1.31144e-08 -0.0567085 0.220199 1.36135e-08 -0.0760018 0.226126 -0.0595914 -0.0657364 0.243004 -0.110111 -0.036503 0.243004 -0.110111 -0.036503 0.268264 -0.143866 0.00724785 0.298059 -0.15572 0.0588555 0.298059 -0.15572 0.0588555 0.327855 -0.143866 0.110463 0.353115 -0.110111 0.154214 0.353115 -0.110111 0.154214 0.369992 -0.0595914 0.183447 0.375919 -8.34708e-17 0.193713 0.375919 -8.34708e-17 0.193713 0.369992 0.0595914 0.183447 0.353115 0.110111 0.154214 0.353115 0.110111 0.154214 0.327855 0.143866 0.110463 0.298059 0.15572 0.0588555 0.298059 0.15572 0.0588555 0.268264 0.143866 0.00724785 0.243004 0.110111 -0.036503 0.243004 0.110111 -0.036503 0.226126 0.0595914 -0.0657364 0.220199 -1.36135e-08 -0.0760018 0.233141 1.50347e-08 -0.102246 0.239687 -0.0658126 -0.0909084 0.258327 -0.121606 -0.0586232 0.258327 -0.121606 -0.0586232 0.286223 -0.158886 -0.0103048 0.31913 -0.171977 0.0466906 0.31913 -0.171977 0.0466906 0.352036 -0.158886 0.103686 0.379932 -0.121606 0.152004 0.379932 -0.121606 0.152004 0.398572 -0.0658126 0.18429 0.405118 -8.99542e-17 0.195627 0.405118 -8.99542e-17 0.195627 0.398572 0.0658126 0.18429 0.379932 0.121606 0.152004 0.379932 0.121606 0.152004 0.352036 0.158886 0.103686 0.31913 0.171977 0.0466906 0.31913 0.171977 0.0466906 0.286223 0.158886 -0.0103048 0.258327 0.121606 -0.0586232 0.258327 0.121606 -0.0586232 0.239687 0.0658126 -0.0909084 0.233141 -1.50347e-08 -0.102246 0.235055 1.71617e-08 -0.131444 0.242527 -0.0751232 -0.118503 0.263803 -0.13881 -0.0816505 0.263803 -0.13881 -0.0816505 0.295647 -0.181364 -0.0264965 0.333208 -0.196307 0.0385622 0.333208 -0.196307 0.0385622 0.37077 -0.181364 0.103621 0.402613 -0.13881 0.158775 0.402613 -0.13881 0.158775 0.42389 -0.0751233 0.195628 0.431362 -9.57815e-17 0.208569 0.431362 -9.57815e-17 0.208569 0.42389 0.0751233 0.195628 0.402613 0.13881 0.158775 0.402613 0.13881 0.158775 0.37077 0.181364 0.103621 0.333208 0.196307 0.0385622 0.333208 0.196307 0.0385622 0.295647 0.181364 -0.0264965 0.263803 0.13881 -0.0816505 0.263803 0.13881 -0.0816505 0.242527 0.0751232 -0.118503 0.235055 -1.71617e-08 -0.131444 0.225649 1.96706e-08 -0.159153 0.234213 -0.0861059 -0.14432 0.258601 -0.159103 -0.102079 0.258601 -0.159103 -0.102079 0.295099 -0.207878 -0.038862 0.338152 -0.225006 0.0357079 0.338152 -0.225006 0.0357079 0.381205 -0.207878 0.110278 0.417704 -0.159103 0.173495 0.417704 -0.159103 0.173495 0.442091 -0.0861059 0.215736 0.450655 -1.00065e-16 0.230568 0.450655 -1.00065e-16 0.230568 0.442091 0.0861059 0.215736 0.417704 0.159103 0.173495 0.417704 0.159103 0.173495 0.381205 0.207878 0.110278 0.338152 0.225006 0.0357079 0.338152 0.225006 0.0357079 0.295099 0.207878 -0.038862 0.258601 0.159103 -0.102079 0.258601 0.159103 -0.102079 0.234213 0.0861059 -0.14432 0.225649 -1.96706e-08 -0.159153 0.225649 1.96706e-08 -0.159153 0.234213 -0.0861059 -0.14432 0.258601 -0.159103 -0.102079 0.258601 -0.159103 -0.102079 0.295099 -0.207878 -0.038862 0.338152 -0.225006 0.0357079 0.338152 -0.225006 0.0357079 0.381205 -0.207878 0.110278 0.417704 -0.159103 0.173495 0.417704 -0.159103 0.173495 0.442091 -0.0861059 0.215736 0.450655 -1.00065e-16 0.230568 0.450655 -1.00065e-16 0.230568 0.442091 0.0861059 0.215736 0.417704 0.159103 0.173495 0.417704 0.159103 0.173495 0.381205 0.207878 0.110278 0.338152 0.225006 0.0357079 0.338152 0.225006 0.0357079 0.295099 0.207878 -0.038862 0.258601 0.159103 -0.102079 0.258601 0.159103 -0.102079 0.234213 0.0861059 -0.14432 0.225649 -1.96706e-08 -0.159153 0.206356 2.21796e-08 -0.181153 0.216012 -0.0970886 -0.164428 0.24351 -0.179396 -0.1168 0.24351 -0.179396 -0.1168 0.284664 -0.234393 -0.045519 0.333208 -0.253705 0.0385622 0.333208 -0.253705 0.0385622 0.381753 -0.234393 0.122643 0.422906 -0.179396 0.193924 0.422906 -0.179396 0.193924 0.450405 -0.0970886 0.241552 0.460061 -1.02154e-16 0.258277 0.460061 -1.02154e-16 0.258277 0.450405 0.0970886 0.241552 0.422906 0.179396 0.193924 0.422906 0.179396 0.193924 0.381753 0.234393 0.122643 0.333208 0.253705 0.0385622 0.333208 0.253705 0.0385622 0.284664 0.234393 -0.045519 0.24351 0.179396 -0.1168 0.24351 0.179396 -0.1168 0.216012 0.0970886 -0.164428 0.206356 -2.21796e-08 -0.181153 0.180112 2.43066e-08 -0.194095 0.190694 -0.106399 -0.175766 0.220829 -0.1966 -0.12357 0.220829 -0.1966 -0.12357 0.26593 -0.256871 -0.0454539 0.31913 -0.278035 0.0466906 0.31913 -0.278035 0.0466906 0.372329 -0.256871 0.138835 0.41743 -0.1966 0.216951 0.41743 -0.1966 0.216951 0.447565 -0.106399 0.269147 0.458147 -1.01729e-16 0.287476 0.458147 -1.01729e-16 0.287476 0.447565 0.106399 0.269147 0.41743 0.1966 0.216951 0.41743 0.1966 0.216951 0.372329 0.256871 0.138835 0.31913 0.278035 0.0466906 0.31913 0.278035 0.0466906 0.26593 0.256871 -0.0454539 0.220829 0.1966 -0.12357 0.220829 0.1966 -0.12357 0.190694 0.106399 -0.175766 0.180112 -2.43066e-08 -0.194095 0.150914 2.57278e-08 -0.196008 0.162114 -0.11262 -0.176608 0.194012 -0.208095 -0.12136 0.194012 -0.208095 -0.12136 0.241749 -0.27189 -0.0386766 0.298059 -0.294291 0.0588555 0.298059 -0.294291 0.0588555 0.354369 -0.27189 0.156388 0.402107 -0.208095 0.239071 0.402107 -0.208095 0.239071 0.434004 -0.11262 0.294319 0.445205 -9.88554e-17 0.313719 0.445205 -9.88554e-17 0.313719 0.434004 0.11262 0.294319 0.402107 0.208095 0.239071 0.402107 0.208095 0.239071 0.354369 0.27189 0.156388 0.298059 0.294291 0.0588555 0.298059 0.294291 0.0588555 0.241749 0.27189 -0.0386766 0.194012 0.208095 -0.12136 0.194012 0.208095 -0.12136 0.162114 0.11262 -0.176608 0.150914 -2.57278e-08 -0.196008 0.123205 2.62268e-08 -0.186603 0.134623 -0.114805 -0.166826 0.167139 -0.212132 -0.110507 0.167139 -0.212132 -0.110507 0.215803 -0.277164 -0.026219 0.273205 -0.3 0.0732051 0.273205 -0.3 0.0732051 0.330608 -0.277164 0.172629 0.379271 -0.212132 0.256917 0.379271 -0.212132 0.256917 0.411787 -0.114805 0.313236 0.423205 -9.39704e-17 0.333013 0.423205 -9.39704e-17 0.333013 0.411787 0.114805 0.313236 0.379271 0.212132 0.256917 0.379271 0.212132 0.256917 0.330608 0.277164 0.172629 0.273205 0.3 0.0732051 0.273205 0.3 0.0732051 0.215803 0.277164 -0.026219 0.167139 0.212132 -0.110507 0.167139 0.212132 -0.110507 0.134623 0.114805 -0.166826 0.123205 -2.62268e-08 -0.186603 0.123205 2.62268e-08 -0.186603 0.134623 -0.114805 -0.166826 0.167139 -0.212132 -0.110507 0.167139 -0.212132 -0.110507 0.215803 -0.277164 -0.026219 0.273205 -0.3 0.0732051 0.273205 -0.3 0.0732051 0.330608 -0.277164 0.172629 0.379271 -0.212132 0.256917 0.379271 -0.212132 0.256917 0.411787 -0.114805 0.313236 0.423205 -9.39704e-17 0.333013 0.423205 -9.39704e-17 0.333013 0.411787 0.114805 0.313236 0.379271 0.212132 0.256917 0.379271 0.212132 0.256917 0.330608 0.277164 0.172629 0.273205 0.3 0.0732051 0.273205 0.3 0.0732051 0.215803 0.277164 -0.026219 0.167139 0.212132 -0.110507 0.167139 0.212132 -0.110507 0.134623 0.114805 -0.166826 0.123205 -2.62268e-08 -0.186603 0.101205 2.57278e-08 -0.167309 0.112406 -0.11262 -0.147909 0.144303 -0.208095 -0.0926613 0.144303 -0.208095 -0.0926613 0.192041 -0.27189 -0.00997754 0.248351 -0.294291 0.0875546 0.248351 -0.294291 0.0875546 0.304661 -0.27189 0.185087 0.352399 -0.208095 0.267771 0.352399 -0.208095 0.267771 0.384296 -0.11262 0.323018 0.395497 -8.78179e-17 0.342418 0.395497 -8.78179e-17 0.342418 0.384296 0.11262 0.323018 0.352399 0.208095 0.267771 0.352399 0.208095 0.267771 0.304661 0.27189 0.185087 0.248351 0.294291 0.0875546 0.248351 0.294291 0.0875546 0.192041 0.27189 -0.00997754 0.144303 0.208095 -0.0926613 0.144303 0.208095 -0.0926613 0.112406 0.11262 -0.147909 0.101205 -2.57278e-08 -0.167309 0.0882633 2.43066e-08 -0.141065 0.0988453 -0.106399 -0.122737 0.12898 -0.1966 -0.0705412 0.12898 -0.1966 -0.0705412 0.174081 -0.256871 0.00757512 0.227281 -0.278035 0.0997196 0.227281 -0.278035 0.0997196 0.28048 -0.256871 0.191864 0.325581 -0.1966 0.26998 0.325581 -0.1966 0.26998 0.355716 -0.106399 0.322176 0.366298 -8.13345e-17 0.340505 0.366298 -8.13345e-17 0.340505 0.355716 0.106399 0.322176 0.325581 0.1966 0.26998 0.325581 0.1966 0.26998 0.28048 0.256871 0.191864 0.227281 0.278035 0.0997196 0.227281 0.278035 0.0997196 0.174081 0.256871 0.00757512 0.12898 0.1966 -0.0705412 0.12898 0.1966 -0.0705412 0.0988453 0.106399 -0.122737 0.0882633 -2.43066e-08 -0.141065 0.0863495 2.21796e-08 -0.111867 0.0960055 -0.0970886 -0.095142 0.123504 -0.179396 -0.0475138 0.123504 -0.179396 -0.0475138 0.164658 -0.234393 0.0237668 0.213202 -0.253705 0.107848 0.213202 -0.253705 0.107848 0.261746 -0.234393 0.191929 0.3029 -0.179396 0.26321 0.3029 -0.179396 0.26321 0.330398 -0.0970886 0.310838 0.340054 -7.55072e-17 0.327563 0.340054 -7.55072e-17 0.327563 0.330398 0.0970886 0.310838 0.3029 0.179396 0.26321 0.3029 0.179396 0.26321 0.261746 0.234393 0.191929 0.213202 0.253705 0.107848 0.213202 0.253705 0.107848 0.164658 0.234393 0.0237668 0.123504 0.179396 -0.0475138 0.123504 0.179396 -0.0475138 0.0960055 0.0970886 -0.095142 0.0863495 -2.21796e-08 -0.111867 0.0957552 1.96706e-08 -0.0841583 0.104319 -0.0861059 -0.0693254 0.128707 -0.159103 -0.027085 0.128707 -0.159103 -0.027085 0.165205 -0.207878 0.0361323 0.208258 -0.225006 0.110702 0.208258 -0.225006 0.110702 0.251311 -0.207878 0.185272 0.28781 -0.159103 0.24849 0.28781 -0.159103 0.24849 0.312197 -0.0861059 0.29073 0.320761 -7.12232e-17 0.305563 0.320761 -7.12232e-17 0.305563 0.312197 0.0861059 0.29073 0.28781 0.159103 0.24849 0.28781 0.159103 0.24849 0.251311 0.207878 0.185272 0.208258 0.225006 0.110702 0.208258 0.225006 0.110702 0.165205 0.207878 0.0361323 0.128707 0.159103 -0.027085 0.128707 0.159103 -0.027085 0.104319 0.0861059 -0.0693254 0.0957552 -1.96706e-08 -0.0841583 0.0957552 1.96706e-08 -0.0841583 0.104319 -0.0861059 -0.0693254 0.128707 -0.159103 -0.027085 0.128707 -0.159103 -0.027085 0.165205 -0.207878 0.0361323 0.208258 -0.225006 0.110702 0.208258 -0.225006 0.110702 0.251311 -0.207878 0.185272 0.28781 -0.159103 0.24849 0.28781 -0.159103 0.24849 0.312197 -0.0861059 0.29073 0.320761 -7.12232e-17 0.305563 0.320761 -7.12232e-17 0.305563 0.312197 0.0861059 0.29073 0.28781 0.159103 0.24849 0.28781 0.159103 0.24849 0.251311 0.207878 0.185272 0.208258 0.225006 0.110702 0.208258 0.225006 0.110702 0.165205 0.207878 0.0361323 0.128707 0.159103 -0.027085 0.128707 0.159103 -0.027085 0.104319 0.0861059 -0.0693254 0.0957552 -1.96706e-08 -0.0841583 0.115049 1.71617e-08 -0.0621585 0.12252 -0.0751232 -0.0492175 0.143797 -0.13881 -0.0123647 0.143797 -0.13881 -0.0123647 0.17564 -0.181364 0.0427893 0.213202 -0.196307 0.107848 0.213202 -0.196307 0.107848 0.250763 -0.181364 0.172907 0.282607 -0.13881 0.228061 0.282607 -0.13881 0.228061 0.303884 -0.0751233 0.264913 0.311355 -6.91347e-17 0.277854 0.311355 -6.91347e-17 0.277854 0.303884 0.0751233 0.264913 0.282607 0.13881 0.228061 0.282607 0.13881 0.228061 0.250763 0.181364 0.172907 0.213202 0.196307 0.107848 0.213202 0.196307 0.107848 0.17564 0.181364 0.0427893 0.143797 0.13881 -0.0123647 0.143797 0.13881 -0.0123647 0.12252 0.0751232 -0.0492175 0.115049 -1.71617e-08 -0.0621585 0.141292 1.50347e-08 -0.0492165 0.147838 -0.0658126 -0.0378794 0.166478 -0.121606 -0.00559413 0.166478 -0.121606 -0.00559413 0.194374 -0.158886 0.0427242 0.227281 -0.171977 0.0997196 0.227281 -0.171977 0.0997196 0.260187 -0.158886 0.156715 0.288083 -0.121606 0.205033 0.288083 -0.121606 0.205033 0.306723 -0.0658126 0.237319 0.313269 -6.95597e-17 0.248656 0.313269 -6.95597e-17 0.248656 0.306723 0.0658126 0.237319 0.288083 0.121606 0.205033 0.288083 0.121606 0.205033 0.260187 0.158886 0.156715 0.227281 0.171977 0.0997196 0.227281 0.171977 0.0997196 0.194374 0.158886 0.0427242 0.166478 0.121606 -0.00559413 0.166478 0.121606 -0.00559413 0.147838 0.0658126 -0.0378794 0.141292 -1.50347e-08 -0.0492165 0.170491 1.36135e-08 -0.0473027 0.176418 -0.0595914 -0.0370373 0.193296 -0.110111 -0.00780392 0.193296 -0.110111 -0.00780392 0.218555 -0.143866 0.035947 0.248351 -0.15572 0.0875546 0.248351 -0.15572 0.0875546 0.278147 -0.143866 0.139162 0.303406 -0.110111 0.182913 0.303406 -0.110111 0.182913 0.320284 -0.0595914 0.212147 0.326211 -7.24334e-17 0.222412 0.326211 -7.24334e-17 0.222412 0.320284 0.0595914 0.212147 0.303406 0.110111 0.182913 0.303406 0.110111 0.182913 0.278147 0.143866 0.139162 0.248351 0.15572 0.0875546 0.248351 0.15572 0.0875546 0.218555 0.143866 0.035947 0.193296 0.110111 -0.00780392 0.193296 0.110111 -0.00780392 0.176418 0.0595914 -0.0370373 0.170491 -1.36135e-08 -0.0473027 0.198199 1.31144e-08 -0.0567085 0.203909 -0.0574068 -0.0468194 0.220168 -0.106074 -0.0186577 0.220168 -0.106074 -0.0186577 0.244502 -0.138592 0.0234893 0.273205 -0.150011 0.0732051 0.273205 -0.150011 0.0732051 0.301908 -0.138592 0.122921 0.326242 -0.106074 0.165068 0.326242 -0.106074 0.165068 0.342501 -0.0574068 0.19323 0.348211 -7.73183e-17 0.203119 0.348211 -7.73183e-17 0.203119 0.342501 0.0574068 0.19323 0.326242 0.106074 0.165068 0.326242 0.106074 0.165068 0.301908 0.138592 0.122921 0.273205 0.150011 0.0732051 0.273205 0.150011 0.0732051 0.244502 0.138592 0.0234893 0.220168 0.106074 -0.0186577 0.220168 0.106074 -0.0186577 0.203909 0.0574068 -0.0468194 0.198199 -1.31144e-08 -0.0567085 1 Element0x806bd08 512 3 25 1 26 0 0 26 1 2 0 0 26 2 27 0 0 27 2 3 0 0 28 4 29 0 0 29 4 5 0 0 29 5 30 0 0 30 5 6 0 0 31 7 32 0 0 32 7 8 0 0 32 8 33 0 0 33 8 9 0 0 34 10 35 0 0 35 10 11 0 0 35 11 36 0 0 36 11 12 0 0 37 13 38 0 0 38 13 14 0 0 38 14 39 0 0 39 14 15 0 0 40 16 41 0 0 41 16 17 0 0 41 17 42 0 0 42 17 18 0 0 43 19 44 0 0 44 19 20 0 0 44 20 45 0 0 45 20 21 0 0 46 22 47 0 0 47 22 23 0 0 47 23 48 0 0 48 23 24 0 0 49 25 50 0 0 50 25 26 0 0 50 26 51 0 0 51 26 27 0 0 52 28 53 0 0 53 28 29 0 0 53 29 54 0 0 54 29 30 0 0 55 31 56 0 0 56 31 32 0 0 56 32 57 0 0 57 32 33 0 0 58 34 59 0 0 59 34 35 0 0 59 35 60 0 0 60 35 36 0 0 61 37 62 0 0 62 37 38 0 0 62 38 63 0 0 63 38 39 0 0 64 40 65 0 0 65 40 41 0 0 65 41 66 0 0 66 41 42 0 0 67 43 68 0 0 68 43 44 0 0 68 44 69 0 0 69 44 45 0 0 70 46 71 0 0 71 46 47 0 0 71 47 72 0 0 72 47 48 0 0 73 49 74 0 0 74 49 50 0 0 74 50 75 0 0 75 50 51 0 0 76 52 77 0 0 77 52 53 0 0 77 53 78 0 0 78 53 54 0 0 79 55 80 0 0 80 55 56 0 0 80 56 81 0 0 81 56 57 0 0 82 58 83 0 0 83 58 59 0 0 83 59 84 0 0 84 59 60 0 0 85 61 86 0 0 86 61 62 0 0 86 62 87 0 0 87 62 63 0 0 88 64 89 0 0 89 64 65 0 0 89 65 90 0 0 90 65 66 0 0 91 67 92 0 0 92 67 68 0 0 92 68 93 0 0 93 68 69 0 0 94 70 95 0 0 95 70 71 0 0 95 71 96 0 0 96 71 72 0 0 97 73 98 0 0 98 73 74 0 0 98 74 99 0 0 99 74 75 0 0 100 76 101 0 0 101 76 77 0 0 101 77 102 0 0 102 77 78 0 0 103 79 104 0 0 104 79 80 0 0 104 80 105 0 0 105 80 81 0 0 106 82 107 0 0 107 82 83 0 0 107 83 108 0 0 108 83 84 0 0 109 85 110 0 0 110 85 86 0 0 110 86 111 0 0 111 86 87 0 0 112 88 113 0 0 113 88 89 0 0 113 89 114 0 0 114 89 90 0 0 115 91 116 0 0 116 91 92 0 0 116 92 117 0 0 117 92 93 0 0 118 94 119 0 0 119 94 95 0 0 119 95 120 0 0 120 95 96 0 0 145 121 146 0 0 146 121 122 0 0 146 122 147 0 0 147 122 123 0 0 148 124 149 0 0 149 124 125 0 0 149 125 150 0 0 150 125 126 0 0 151 127 152 0 0 152 127 128 0 0 152 128 153 0 0 153 128 129 0 0 154 130 155 0 0 155 130 131 0 0 155 131 156 0 0 156 131 132 0 0 157 133 158 0 0 158 133 134 0 0 158 134 159 0 0 159 134 135 0 0 160 136 161 0 0 161 136 137 0 0 161 137 162 0 0 162 137 138 0 0 163 139 164 0 0 164 139 140 0 0 164 140 165 0 0 165 140 141 0 0 166 142 167 0 0 167 142 143 0 0 167 143 168 0 0 168 143 144 0 0 169 145 170 0 0 170 145 146 0 0 170 146 171 0 0 171 146 147 0 0 172 148 173 0 0 173 148 149 0 0 173 149 174 0 0 174 149 150 0 0 175 151 176 0 0 176 151 152 0 0 176 152 177 0 0 177 152 153 0 0 178 154 179 0 0 179 154 155 0 0 179 155 180 0 0 180 155 156 0 0 181 157 182 0 0 182 157 158 0 0 182 158 183 0 0 183 158 159 0 0 184 160 185 0 0 185 160 161 0 0 185 161 186 0 0 186 161 162 0 0 187 163 188 0 0 188 163 164 0 0 188 164 189 0 0 189 164 165 0 0 190 166 191 0 0 191 166 167 0 0 191 167 192 0 0 192 167 168 0 0 193 169 194 0 0 194 169 170 0 0 194 170 195 0 0 195 170 171 0 0 196 172 197 0 0 197 172 173 0 0 197 173 198 0 0 198 173 174 0 0 199 175 200 0 0 200 175 176 0 0 200 176 201 0 0 201 176 177 0 0 202 178 203 0 0 203 178 179 0 0 203 179 204 0 0 204 179 180 0 0 205 181 206 0 0 206 181 182 0 0 206 182 207 0 0 207 182 183 0 0 208 184 209 0 0 209 184 185 0 0 209 185 210 0 0 210 185 186 0 0 211 187 212 0 0 212 187 188 0 0 212 188 213 0 0 213 188 189 0 0 214 190 215 0 0 215 190 191 0 0 215 191 216 0 0 216 191 192 0 0 217 193 218 0 0 218 193 194 0 0 218 194 219 0 0 219 194 195 0 0 220 196 221 0 0 221 196 197 0 0 221 197 222 0 0 222 197 198 0 0 223 199 224 0 0 224 199 200 0 0 224 200 225 0 0 225 200 201 0 0 226 202 227 0 0 227 202 203 0 0 227 203 228 0 0 228 203 204 0 0 229 205 230 0 0 230 205 206 0 0 230 206 231 0 0 231 206 207 0 0 232 208 233 0 0 233 208 209 0 0 233 209 234 0 0 234 209 210 0 0 235 211 236 0 0 236 211 212 0 0 236 212 237 0 0 237 212 213 0 0 238 214 239 0 0 239 214 215 0 0 239 215 240 0 0 240 215 216 0 0 265 241 266 0 0 266 241 242 0 0 266 242 267 0 0 267 242 243 0 0 268 244 269 0 0 269 244 245 0 0 269 245 270 0 0 270 245 246 0 0 271 247 272 0 0 272 247 248 0 0 272 248 273 0 0 273 248 249 0 0 274 250 275 0 0 275 250 251 0 0 275 251 276 0 0 276 251 252 0 0 277 253 278 0 0 278 253 254 0 0 278 254 279 0 0 279 254 255 0 0 280 256 281 0 0 281 256 257 0 0 281 257 282 0 0 282 257 258 0 0 283 259 284 0 0 284 259 260 0 0 284 260 285 0 0 285 260 261 0 0 286 262 287 0 0 287 262 263 0 0 287 263 288 0 0 288 263 264 0 0 289 265 290 0 0 290 265 266 0 0 290 266 291 0 0 291 266 267 0 0 292 268 293 0 0 293 268 269 0 0 293 269 294 0 0 294 269 270 0 0 295 271 296 0 0 296 271 272 0 0 296 272 297 0 0 297 272 273 0 0 298 274 299 0 0 299 274 275 0 0 299 275 300 0 0 300 275 276 0 0 301 277 302 0 0 302 277 278 0 0 302 278 303 0 0 303 278 279 0 0 304 280 305 0 0 305 280 281 0 0 305 281 306 0 0 306 281 282 0 0 307 283 308 0 0 308 283 284 0 0 308 284 309 0 0 309 284 285 0 0 310 286 311 0 0 311 286 287 0 0 311 287 312 0 0 312 287 288 0 0 313 289 314 0 0 314 289 290 0 0 314 290 315 0 0 315 290 291 0 0 316 292 317 0 0 317 292 293 0 0 317 293 318 0 0 318 293 294 0 0 319 295 320 0 0 320 295 296 0 0 320 296 321 0 0 321 296 297 0 0 322 298 323 0 0 323 298 299 0 0 323 299 324 0 0 324 299 300 0 0 325 301 326 0 0 326 301 302 0 0 326 302 327 0 0 327 302 303 0 0 328 304 329 0 0 329 304 305 0 0 329 305 330 0 0 330 305 306 0 0 331 307 332 0 0 332 307 308 0 0 332 308 333 0 0 333 308 309 0 0 334 310 335 0 0 335 310 311 0 0 335 311 336 0 0 336 311 312 0 0 337 313 338 0 0 338 313 314 0 0 338 314 339 0 0 339 314 315 0 0 340 316 341 0 0 341 316 317 0 0 341 317 342 0 0 342 317 318 0 0 343 319 344 0 0 344 319 320 0 0 344 320 345 0 0 345 320 321 0 0 346 322 347 0 0 347 322 323 0 0 347 323 348 0 0 348 323 324 0 0 349 325 350 0 0 350 325 326 0 0 350 326 351 0 0 351 326 327 0 0 352 328 353 0 0 353 328 329 0 0 353 329 354 0 0 354 329 330 0 0 355 331 356 0 0 356 331 332 0 0 356 332 357 0 0 357 332 333 0 0 358 334 359 0 0 359 334 335 0 0 359 335 360 0 0 360 335 336 0 0 385 361 386 0 0 386 361 362 0 0 386 362 387 0 0 387 362 363 0 0 388 364 389 0 0 389 364 365 0 0 389 365 390 0 0 390 365 366 0 0 391 367 392 0 0 392 367 368 0 0 392 368 393 0 0 393 368 369 0 0 394 370 395 0 0 395 370 371 0 0 395 371 396 0 0 396 371 372 0 0 397 373 398 0 0 398 373 374 0 0 398 374 399 0 0 399 374 375 0 0 400 376 401 0 0 401 376 377 0 0 401 377 402 0 0 402 377 378 0 0 403 379 404 0 0 404 379 380 0 0 404 380 405 0 0 405 380 381 0 0 406 382 407 0 0 407 382 383 0 0 407 383 408 0 0 408 383 384 0 0 409 385 410 0 0 410 385 386 0 0 410 386 411 0 0 411 386 387 0 0 412 388 413 0 0 413 388 389 0 0 413 389 414 0 0 414 389 390 0 0 415 391 416 0 0 416 391 392 0 0 416 392 417 0 0 417 392 393 0 0 418 394 419 0 0 419 394 395 0 0 419 395 420 0 0 420 395 396 0 0 421 397 422 0 0 422 397 398 0 0 422 398 423 0 0 423 398 399 0 0 424 400 425 0 0 425 400 401 0 0 425 401 426 0 0 426 401 402 0 0 427 403 428 0 0 428 403 404 0 0 428 404 429 0 0 429 404 405 0 0 430 406 431 0 0 431 406 407 0 0 431 407 432 0 0 432 407 408 0 0 433 409 434 0 0 434 409 410 0 0 434 410 435 0 0 435 410 411 0 0 436 412 437 0 0 437 412 413 0 0 437 413 438 0 0 438 413 414 0 0 439 415 440 0 0 440 415 416 0 0 440 416 441 0 0 441 416 417 0 0 442 418 443 0 0 443 418 419 0 0 443 419 444 0 0 444 419 420 0 0 445 421 446 0 0 446 421 422 0 0 446 422 447 0 0 447 422 423 0 0 448 424 449 0 0 449 424 425 0 0 449 425 450 0 0 450 425 426 0 0 451 427 452 0 0 452 427 428 0 0 452 428 453 0 0 453 428 429 0 0 454 430 455 0 0 455 430 431 0 0 455 431 456 0 0 456 431 432 0 0 457 433 458 0 0 458 433 434 0 0 458 434 459 0 0 459 434 435 0 0 460 436 461 0 0 461 436 437 0 0 461 437 462 0 0 462 437 438 0 0 463 439 464 0 0 464 439 440 0 0 464 440 465 0 0 465 440 441 0 0 466 442 467 0 0 467 442 443 0 0 467 443 468 0 0 468 443 444 0 0 469 445 470 0 0 470 445 446 0 0 470 446 471 0 0 471 446 447 0 0 472 448 473 0 0 473 448 449 0 0 473 449 474 0 0 474 449 450 0 0 475 451 476 0 0 476 451 452 0 0 476 452 477 0 0 477 452 453 0 0 478 454 479 0 0 479 454 455 0 0 479 455 480 0 0 480 455 456 0 0 mayavi-4.5.0/mayavi/tests/data/cow.g0000644000076500000240000010400112747716314017723 0ustar prabhustaff000000000000001 676 579 1737 1 579 3.247406e+00 2.073333e+00 0.000000e+00 7.338180e-01 1.740873e+00 0.000000e+00 -2.057387e+00 1.841308e+00 0.000000e+00 -3.392806e+00 1.769365e+00 0.000000e+00 -2.348005e+00 -1.869142e+00 0.000000e+00 -3.650579e+00 -1.142448e+00 0.000000e+00 -3.242148e+00 2.021387e+00 0.000000e+00 5.177545e+00 1.932323e+00 2.140000e-04 5.908842e+00 1.388968e+00 1.026000e-03 3.280681e+00 5.108020e-01 -4.994340e-01 3.136321e+00 1.712370e-01 -5.398960e-01 2.406969e+00 1.645328e+00 -3.414790e-01 2.266003e+00 1.273253e+00 -6.633320e-01 2.500490e+00 -3.502900e-02 -1.170179e+00 1.859443e+00 1.450393e+00 -6.322220e-01 2.081700e+00 2.832490e-01 -1.259461e+00 1.640095e+00 -6.745560e-01 -1.246804e+00 2.079600e+00 -1.473377e+00 -6.549970e-01 2.893096e+00 -1.302168e+00 -3.320490e-01 2.721135e+00 -1.520418e+00 -3.623780e-01 1.373216e+00 -5.646200e-01 -1.106245e+00 1.219163e+00 -1.218342e+00 -8.230290e-01 5.423860e-01 -1.882270e-01 -1.370375e+00 -1.795480e-01 1.471301e+00 -5.445130e-01 1.808600e-02 2.865000e-03 -1.523199e+00 -7.194100e-02 -1.346991e+00 -1.237379e+00 -7.847000e-02 -1.688266e+00 -8.002300e-01 -1.126660e-01 -1.806584e+00 -3.833240e-01 -7.524160e-01 4.381320e-01 -1.467349e+00 -5.050450e-01 -9.138270e-01 -1.645612e+00 -5.242310e-01 -1.399266e+00 -1.313019e+00 -5.640740e-01 -1.789401e+00 -8.031910e-01 -1.115594e+00 1.392380e+00 -8.196230e-01 -1.053434e+00 -3.425530e-01 -1.690245e+00 -1.077209e+00 -8.696490e-01 -1.633144e+00 -1.582187e+00 1.567542e+00 -9.823490e-01 -1.721806e+00 1.391264e+00 -1.113307e+00 -2.433366e+00 7.822200e-02 -1.371269e+00 -2.765069e+00 -1.561164e+00 -1.084313e+00 -3.109047e+00 1.789477e+00 -5.653230e-01 -3.085650e+00 1.657340e+00 -7.844790e-01 -2.930312e+00 1.103580e+00 -1.125876e+00 -3.395381e+00 1.726325e+00 -5.547700e-01 -2.901159e+00 -6.195040e-01 -1.284058e+00 -2.982676e+00 -1.264649e+00 -1.133596e+00 -3.734989e+00 1.589433e+00 -2.952020e-01 -3.655148e+00 1.190938e+00 -5.736920e-01 -3.504525e+00 4.055740e-01 -8.470660e-01 -2.462835e+00 -1.305500e+00 -9.663950e-01 -1.576196e+00 -1.696317e+00 -3.581460e-01 -2.126375e+00 -1.866497e+00 -5.028950e-01 -2.699966e+00 -1.850397e+00 -5.700700e-01 -2.811581e+00 -1.798210e+00 -7.127370e-01 -2.614084e+00 -1.905005e+00 -4.049250e-01 -2.503818e+00 -1.909806e+00 -4.314560e-01 -3.533910e+00 -1.330455e+00 -5.682460e-01 -3.335942e+00 -1.365685e+00 -7.245900e-01 2.024692e+00 -1.074646e+00 -1.172465e+00 1.497480e+00 -1.283201e+00 -1.088258e+00 1.801794e+00 -1.465464e+00 -1.129277e+00 1.953911e+00 -2.462233e+00 -8.305940e-01 1.529305e+00 -2.092083e+00 -8.873530e-01 1.451825e+00 -1.576856e+00 -7.027580e-01 1.596751e+00 -1.722028e+00 -6.846550e-01 1.721745e+00 -3.116887e+00 -9.791110e-01 1.811797e+00 -3.135641e+00 -9.330960e-01 1.848272e+00 -2.927260e+00 -9.969660e-01 2.110033e+00 -3.148257e+00 -1.068816e+00 1.919391e+00 -3.487078e+00 -1.110869e+00 1.741854e+00 -3.114181e+00 -7.007050e-01 2.002745e+00 -3.523420e+00 -6.881030e-01 2.236407e+00 -3.220054e+00 -8.920300e-01 2.440236e+00 -3.509564e+00 -1.019417e+00 2.377814e+00 -3.484109e+00 -8.003320e-01 1.857471e+00 -2.950722e+00 -6.699880e-01 1.998099e+00 -3.039955e+00 -7.188550e-01 2.059222e+00 -3.230076e+00 -6.749360e-01 -3.490520e+00 -1.760417e+00 -9.031040e-01 -3.498521e+00 -1.762078e+00 -7.624720e-01 -2.969687e+00 -2.097941e+00 -9.828360e-01 -3.144012e+00 -2.333635e+00 -8.299940e-01 -3.008323e+00 -1.759271e+00 -6.556720e-01 -3.381262e+00 -1.828189e+00 -6.970340e-01 1.947264e+00 -2.443232e+00 -7.325870e-01 -3.302419e+00 -3.017921e+00 -1.128514e+00 -3.016419e+00 -2.765091e+00 -9.666710e-01 -3.316551e+00 -3.168932e+00 -1.121229e+00 -3.217306e+00 -3.187686e+00 -1.075214e+00 -2.729567e+00 -3.602976e+00 -1.377236e+00 -3.098730e+00 -3.539123e+00 -1.252987e+00 -3.031250e+00 -3.095940e+00 -1.106355e+00 -3.294389e+00 -3.166225e+00 -8.428230e-01 -3.006867e+00 -3.575464e+00 -8.302210e-01 -2.749355e+00 -3.272099e+00 -1.034148e+00 -2.583580e+00 -3.514267e+00 -1.278598e+00 -2.593513e+00 -3.536154e+00 -9.424500e-01 -3.166971e+00 -3.002766e+00 -8.121060e-01 -3.040038e+00 -2.780893e+00 -9.146140e-01 -3.900566e+00 1.002504e+00 0.000000e+00 -3.821694e+00 1.477989e+00 -1.076310e-01 -3.675638e+00 1.471512e+00 -6.220100e-02 -1.985123e+00 -2.116661e+00 -3.942560e-01 -2.109684e+00 -2.112345e+00 -5.039970e-01 -2.041110e+00 -2.075348e+00 -5.402010e-01 -2.513187e+00 -2.130859e+00 -4.979200e-01 4.935880e+00 2.051665e+00 -5.728530e-01 4.881855e+00 2.194544e+00 -5.302880e-01 4.472349e+00 2.325133e+00 -4.437640e-01 4.733657e+00 1.227371e+00 -5.928830e-01 5.931474e+00 1.233483e+00 -2.156130e-01 5.998088e+00 1.231874e+00 -1.073340e-01 5.755282e+00 1.004149e+00 -3.075050e-01 5.773410e+00 1.225861e+00 -3.230250e-01 5.851404e+00 9.290080e-01 -1.053620e-01 5.153735e+00 8.315750e-01 -2.183480e-01 5.021254e+00 9.513080e-01 -4.055670e-01 4.366867e+00 1.131136e+00 -6.305810e-01 4.339601e+00 2.592642e+00 -2.588910e-01 4.440760e+00 2.490353e+00 -6.292870e-01 4.636909e+00 2.750501e+00 -8.568590e-01 5.096148e+00 2.759720e+00 -7.747290e-01 4.296769e+00 2.260422e+00 -5.287960e-01 4.444739e+00 2.475795e+00 -8.605150e-01 4.554459e+00 2.511417e+00 -8.505710e-01 4.262798e+00 2.490674e+00 -8.183160e-01 4.138494e+00 2.557838e+00 -6.526510e-01 4.035753e+00 2.399538e+00 -3.439570e-01 4.354196e+00 2.711836e+00 -8.265450e-01 3.928869e+00 2.223919e+00 -6.156830e-01 4.170470e+00 2.458441e+00 -1.241846e+00 4.046673e+00 2.341349e+00 -1.452530e+00 4.094112e+00 1.889281e+00 -5.784350e-01 4.150297e+00 1.820575e+00 -9.170460e-01 4.152166e+00 1.868775e+00 -1.225002e+00 4.369751e+00 2.298204e+00 -9.218940e-01 4.354941e+00 2.064161e+00 -7.788510e-01 4.274886e+00 2.220030e+00 -6.790750e-01 4.278045e+00 1.976660e+00 -5.373510e-01 4.153175e+00 2.084823e+00 -7.996680e-01 4.232341e+00 1.903079e+00 -5.343620e-01 3.758215e+00 2.206683e+00 3.230510e-01 4.120842e+00 6.271410e-01 1.854610e-01 3.650974e+00 1.463740e+00 4.786170e-01 2.668936e+00 2.061820e-01 1.014371e+00 1.859443e+00 1.450393e+00 6.322220e-01 2.081700e+00 2.832490e-01 1.259461e+00 2.141790e+00 -5.530600e-02 1.295565e+00 2.108912e+00 -3.571280e-01 1.259691e+00 2.663024e+00 -1.440487e+00 4.781490e-01 2.079600e+00 -1.473377e+00 6.549970e-01 2.960118e+00 -9.418270e-01 2.847430e-01 2.893096e+00 -1.302168e+00 3.320490e-01 8.573230e-01 9.850010e-01 8.740290e-01 9.603210e-01 -3.080520e-01 1.243133e+00 -1.795480e-01 1.471301e+00 5.445130e-01 1.808600e-02 2.865000e-03 1.523199e+00 -7.194100e-02 -1.346991e+00 1.237379e+00 -7.847000e-02 -1.688266e+00 8.002300e-01 -7.524160e-01 4.381320e-01 1.467349e+00 -5.050450e-01 -9.138270e-01 1.645612e+00 -5.242310e-01 -1.399266e+00 1.313019e+00 -5.640740e-01 -1.789401e+00 8.031910e-01 -1.053434e+00 -3.425530e-01 1.690245e+00 -1.077209e+00 -8.696490e-01 1.633144e+00 -1.582187e+00 1.567542e+00 9.823490e-01 -1.996117e+00 1.387891e+00 1.064104e+00 -2.684930e+00 1.262021e+00 1.110490e+00 -2.765069e+00 -1.561164e+00 1.084313e+00 -3.109047e+00 1.789477e+00 5.653230e-01 -2.930312e+00 1.103580e+00 1.125876e+00 -3.395381e+00 1.726325e+00 5.547700e-01 -3.278080e+00 1.432418e+00 8.539580e-01 -2.901159e+00 -6.195040e-01 1.284058e+00 -2.982676e+00 -1.264649e+00 1.133596e+00 -3.734989e+00 1.589433e+00 2.952020e-01 -3.655148e+00 1.190938e+00 5.736920e-01 -2.462835e+00 -1.305500e+00 9.663950e-01 -1.576196e+00 -1.696317e+00 3.581460e-01 -1.936032e+00 -1.829617e+00 4.889160e-01 -2.126375e+00 -1.866497e+00 5.028950e-01 -2.811581e+00 -1.798210e+00 7.127370e-01 -2.614084e+00 -1.905005e+00 4.049250e-01 -2.503818e+00 -1.909806e+00 4.314560e-01 -3.314868e+00 -1.599081e+00 4.396260e-01 -3.533910e+00 -1.330455e+00 5.682460e-01 -3.569993e+00 -7.319890e-01 6.494350e-01 -3.251210e+00 -9.482050e-01 8.198680e-01 2.158585e+00 -9.558090e-01 1.113647e+00 1.497480e+00 -1.283201e+00 1.088258e+00 1.801794e+00 -1.465464e+00 1.129277e+00 1.953911e+00 -2.462233e+00 8.305940e-01 1.596751e+00 -1.722028e+00 6.846550e-01 1.721745e+00 -3.116887e+00 9.791110e-01 1.848272e+00 -2.927260e+00 9.969660e-01 2.110033e+00 -3.148257e+00 1.068816e+00 2.254361e+00 -3.550931e+00 1.235118e+00 2.113587e+00 -3.011851e+00 8.516480e-01 1.919391e+00 -3.487078e+00 1.110869e+00 1.709173e+00 -3.133145e+00 8.079400e-01 2.002745e+00 -3.523420e+00 6.881030e-01 1.736425e+00 -2.743683e+00 7.368660e-01 2.440236e+00 -3.509564e+00 1.019417e+00 2.377814e+00 -3.484109e+00 8.003320e-01 1.857471e+00 -2.950722e+00 6.699880e-01 1.972647e+00 -2.728848e+00 7.724960e-01 2.059222e+00 -3.230076e+00 6.749360e-01 -3.490520e+00 -1.760417e+00 9.031040e-01 -3.498521e+00 -1.762078e+00 7.624720e-01 -3.177824e+00 -2.279173e+00 1.047580e+00 -3.030605e+00 -2.311222e+00 8.843300e-01 -3.144012e+00 -2.333635e+00 8.299940e-01 -3.316551e+00 -3.168932e+00 1.121229e+00 -2.729567e+00 -3.602976e+00 1.377236e+00 -2.981824e+00 -3.608887e+00 1.346959e+00 -2.770335e+00 -3.208138e+00 1.031045e+00 -2.909010e+00 -3.084482e+00 1.089147e+00 -3.098730e+00 -3.539123e+00 1.252987e+00 -3.031250e+00 -3.095940e+00 1.106355e+00 -3.119570e+00 -3.183977e+00 8.707390e-01 -3.294389e+00 -3.166225e+00 8.428230e-01 -3.006867e+00 -3.575464e+00 8.302210e-01 -2.583580e+00 -3.514267e+00 1.278598e+00 -2.593513e+00 -3.536154e+00 9.424500e-01 -3.166971e+00 -3.002766e+00 8.121060e-01 -3.040038e+00 -2.780893e+00 9.146140e-01 -3.581963e+00 -1.413947e+00 -1.043710e-01 -3.828485e+00 -1.786559e+00 -1.140950e-01 -3.890388e+00 -1.750102e+00 1.761200e-02 -4.029726e+00 -1.043238e+00 1.363050e-01 -3.975337e+00 -5.549610e-01 -1.440700e-02 -4.333831e+00 -1.548255e+00 5.693800e-02 -4.201904e+00 -1.668554e+00 -2.148590e-01 -3.742608e+00 -7.293740e-01 -1.493610e-01 -3.820370e+00 -1.239135e+00 -2.698070e-01 -3.977657e+00 -1.750845e+00 -1.849090e-01 -3.860740e+00 -1.883490e-01 -2.496200e-02 -3.817430e+00 1.503430e-01 4.862900e-02 -3.698925e+00 1.787941e+00 6.664000e-02 -3.469715e+00 1.961504e+00 7.114100e-02 -3.821694e+00 1.477989e+00 1.076310e-01 -3.413372e+00 1.871604e+00 1.423090e-01 -3.703185e+00 1.631820e-01 8.426200e-02 -3.640457e+00 -1.953790e-01 -2.490900e-02 -3.805575e+00 -1.901090e-01 -1.014470e-01 -3.817381e+00 1.503480e-01 -4.872800e-02 -1.933565e+00 -1.993029e+00 4.389020e-01 -2.060902e+00 -2.031698e+00 3.720790e-01 -1.985123e+00 -2.116661e+00 3.942560e-01 -2.144393e+00 -2.117408e+00 4.644890e-01 -2.552923e+00 -2.142304e+00 4.545790e-01 -2.695135e+00 -2.121650e+00 5.080640e-01 -2.527301e+00 -2.106246e+00 5.507350e-01 4.971872e+00 1.924079e+00 5.860260e-01 4.936066e+00 1.737668e+00 5.572760e-01 4.837331e+00 2.235678e+00 4.793320e-01 5.604888e+00 1.546091e+00 1.137730e-01 5.783731e+00 1.341471e+00 2.845900e-01 5.998088e+00 1.231874e+00 1.073340e-01 5.755282e+00 1.004149e+00 3.075050e-01 5.773410e+00 1.225861e+00 3.230250e-01 5.803425e+00 1.260787e+00 2.100020e-01 5.370709e+00 9.802720e-01 3.374320e-01 5.356900e+00 8.511200e-01 1.383240e-01 4.712067e+00 7.705120e-01 3.333930e-01 4.366867e+00 1.131136e+00 6.305810e-01 4.636909e+00 2.750501e+00 8.568590e-01 5.096148e+00 2.759720e+00 7.747290e-01 4.442912e+00 2.343263e+00 5.332200e-01 4.296769e+00 2.260422e+00 5.287960e-01 4.444739e+00 2.475795e+00 8.605150e-01 4.615662e+00 2.633870e+00 9.779860e-01 4.104292e+00 2.537976e+00 5.434370e-01 4.084506e+00 2.570978e+00 2.181680e-01 4.354196e+00 2.711836e+00 8.265450e-01 4.176065e+00 2.636883e+00 6.183840e-01 4.025364e+00 2.359300e+00 4.025970e-01 3.928869e+00 2.223919e+00 6.156830e-01 4.044730e+00 2.254459e+00 7.442090e-01 4.307092e+00 2.367482e+00 8.772020e-01 4.170470e+00 2.458441e+00 1.241846e+00 4.046673e+00 2.341349e+00 1.452530e+00 4.094112e+00 1.889281e+00 5.784350e-01 4.152166e+00 1.868775e+00 1.225002e+00 4.036947e+00 1.992167e+00 1.072561e+00 4.369751e+00 2.298204e+00 9.218940e-01 4.354941e+00 2.064161e+00 7.788510e-01 4.211815e+00 2.282490e+00 1.039137e+00 4.278045e+00 1.976660e+00 5.373510e-01 4.153175e+00 2.084823e+00 7.996680e-01 2.254361e+00 -3.550931e+00 -1.235118e+00 2.254361e+00 -3.550931e+00 -1.235118e+00 2.377814e+00 -3.484109e+00 -8.003320e-01 -2.729567e+00 -3.602976e+00 -1.377236e+00 -2.593513e+00 -3.536154e+00 -9.424500e-01 -3.413372e+00 1.871604e+00 -1.423090e-01 -3.380836e+00 1.819691e+00 -1.232730e-01 -3.675638e+00 1.471512e+00 -6.220100e-02 -3.348274e+00 1.767738e+00 -8.500000e-05 5.895899e+00 1.182730e+00 -1.647050e-01 4.170470e+00 2.458441e+00 -1.241846e+00 4.046673e+00 2.341349e+00 -1.452530e+00 4.152166e+00 1.868775e+00 -1.225002e+00 4.369751e+00 2.298204e+00 -9.218940e-01 4.354941e+00 2.064161e+00 -7.788510e-01 -2.176551e+00 -1.873816e+00 4.457820e-01 2.254361e+00 -3.550931e+00 1.235118e+00 2.377814e+00 -3.484109e+00 8.003320e-01 -3.008323e+00 -1.759271e+00 6.556720e-01 -2.729567e+00 -3.602976e+00 1.377236e+00 -2.593513e+00 -3.536154e+00 9.424500e-01 -3.581963e+00 -1.413947e+00 -1.043710e-01 -3.828485e+00 -1.786559e+00 -1.140950e-01 -3.828485e+00 -1.786559e+00 -1.140950e-01 -3.890388e+00 -1.750102e+00 1.761200e-02 -4.445835e+00 -2.015127e+00 1.897020e-01 -4.445835e+00 -2.015127e+00 1.897020e-01 -4.445835e+00 -2.015127e+00 1.897020e-01 -3.820370e+00 -1.239135e+00 -2.698070e-01 -3.860740e+00 -1.883490e-01 -2.496200e-02 -3.817430e+00 1.503430e-01 4.862900e-02 -3.817381e+00 1.503480e-01 -4.872800e-02 5.895899e+00 1.182730e+00 1.647050e-01 4.266263e+00 2.421651e+00 1.054799e+00 4.170470e+00 2.458441e+00 1.241846e+00 4.046673e+00 2.341349e+00 1.452530e+00 4.150297e+00 1.820575e+00 9.170460e-01 4.152166e+00 1.868775e+00 1.225002e+00 4.082988e+00 2.175805e+00 1.450930e+00 4.369751e+00 2.298204e+00 9.218940e-01 4.354941e+00 2.064161e+00 7.788510e-01 4.278045e+00 1.976660e+00 5.373510e-01 -2.583580e+00 -3.514267e+00 -1.278598e+00 -2.583580e+00 -3.514267e+00 1.278598e+00 -3.330406e+00 -3.185190e+00 9.500580e-01 -3.316551e+00 -3.168932e+00 -1.121229e+00 -3.330406e+00 -3.185190e+00 -9.500580e-01 -4.309744e+00 -1.743848e+00 1.503290e-01 -4.405365e+00 -1.921443e+00 1.929780e-01 2.113587e+00 -3.011851e+00 -8.516480e-01 2.236407e+00 -3.220054e+00 8.920300e-01 4.150297e+00 1.820575e+00 9.170460e-01 -2.749355e+00 -3.272099e+00 1.034148e+00 -3.294389e+00 -3.166225e+00 8.428230e-01 -3.294389e+00 -3.166225e+00 -8.428230e-01 1.721745e+00 -3.116887e+00 9.791110e-01 1.721745e+00 -3.116887e+00 9.791110e-01 1.811797e+00 -3.135641e+00 9.330960e-01 1.721745e+00 -3.116887e+00 -9.791110e-01 1.721745e+00 -3.116887e+00 -9.791110e-01 1.811797e+00 -3.135641e+00 -9.330960e-01 -3.316551e+00 -3.168932e+00 -1.121229e+00 -3.217306e+00 -3.187686e+00 -1.075214e+00 -3.316551e+00 -3.168932e+00 1.121229e+00 -3.217306e+00 -3.187686e+00 1.075214e+00 -3.166971e+00 -3.002766e+00 -8.121060e-01 -3.166971e+00 -3.002766e+00 8.121060e-01 -3.302419e+00 -3.017921e+00 -1.128514e+00 1.972647e+00 -2.728848e+00 -7.724960e-01 4.636909e+00 2.750501e+00 -8.568590e-01 4.554459e+00 2.511417e+00 -8.505710e-01 5.096148e+00 2.759720e+00 -7.747290e-01 1.741854e+00 -3.114181e+00 -7.007050e-01 1.741854e+00 -3.114181e+00 -7.007050e-01 1.741854e+00 -3.114181e+00 7.007050e-01 1.963153e+00 -1.588839e+00 6.128610e-01 1.963153e+00 -1.588839e+00 -6.128610e-01 1.963153e+00 -1.588839e+00 -6.128610e-01 -3.821694e+00 1.477989e+00 1.076310e-01 4.094112e+00 1.889281e+00 5.784350e-01 4.094112e+00 1.889281e+00 -5.784350e-01 -2.126375e+00 -1.866497e+00 5.028950e-01 -2.060902e+00 -2.031698e+00 3.720790e-01 4.936066e+00 1.737668e+00 5.572760e-01 4.842883e+00 2.021333e+00 6.380250e-01 -3.294389e+00 -3.166225e+00 -8.428230e-01 4.728963e+00 2.036146e+00 6.143070e-01 4.751519e+00 2.039658e+00 6.341340e-01 -3.040038e+00 -2.780893e+00 9.146140e-01 4.104292e+00 2.537976e+00 5.434370e-01 4.104292e+00 2.537976e+00 5.434370e-01 4.636909e+00 2.750501e+00 8.568590e-01 4.444739e+00 2.475795e+00 8.605150e-01 4.444739e+00 2.475795e+00 8.605150e-01 5.096148e+00 2.759720e+00 7.747290e-01 5.096148e+00 2.759720e+00 7.747290e-01 -3.008323e+00 -1.759271e+00 -6.556720e-01 -3.335942e+00 -1.365685e+00 -7.245900e-01 4.444739e+00 2.475795e+00 -8.605150e-01 4.307092e+00 2.367482e+00 8.772020e-01 4.266263e+00 2.421651e+00 1.054799e+00 4.036947e+00 1.992167e+00 1.072561e+00 -2.147113e+00 -1.903198e+00 -3.624620e-01 -2.527301e+00 -2.106246e+00 5.507350e-01 -2.527301e+00 -2.106246e+00 5.507350e-01 -2.462835e+00 -1.305500e+00 9.663950e-01 -2.527301e+00 -2.106246e+00 -5.507350e-01 -2.503818e+00 -1.909806e+00 -4.314560e-01 -2.513187e+00 -2.130859e+00 -4.979200e-01 -2.462835e+00 -1.305500e+00 -9.663950e-01 5.783731e+00 1.341471e+00 2.845900e-01 5.783731e+00 1.341471e+00 2.845900e-01 -1.933565e+00 -1.993029e+00 4.389020e-01 5.783731e+00 1.341471e+00 -2.845900e-01 5.783731e+00 1.341471e+00 -2.845900e-01 4.296769e+00 2.260422e+00 -5.287960e-01 4.296769e+00 2.260422e+00 -5.287960e-01 4.296769e+00 2.260422e+00 -5.287960e-01 4.274886e+00 2.220030e+00 -6.790750e-01 4.274886e+00 2.220030e+00 -6.790750e-01 5.177545e+00 1.932323e+00 2.140000e-04 4.881855e+00 2.194544e+00 -5.302880e-01 1.734568e+00 -2.965876e+00 -9.863960e-01 -3.675638e+00 1.471512e+00 -6.220100e-02 -2.770335e+00 -3.208138e+00 -1.031045e+00 -2.770335e+00 -3.208138e+00 -1.031045e+00 -2.770335e+00 -3.208138e+00 1.031045e+00 -3.031250e+00 -3.095940e+00 1.106355e+00 4.025364e+00 2.359300e+00 4.025970e-01 4.554459e+00 2.511417e+00 -8.505710e-01 4.554459e+00 2.511417e+00 -8.505710e-01 4.138494e+00 2.557838e+00 -6.526510e-01 4.440760e+00 2.490353e+00 -6.292870e-01 -2.629199e+00 -2.138983e+00 -4.362270e-01 -2.629199e+00 -2.138983e+00 -4.362270e-01 -2.614084e+00 -1.905005e+00 -4.049250e-01 -2.699966e+00 -1.850397e+00 -5.700700e-01 -2.126375e+00 -1.866497e+00 -5.028950e-01 -2.144393e+00 -2.117408e+00 -4.644890e-01 -3.821694e+00 1.477989e+00 1.076310e-01 4.472349e+00 2.325133e+00 -4.437640e-01 -3.330406e+00 -3.185190e+00 9.500580e-01 -3.144012e+00 -2.333635e+00 8.299940e-01 -3.144012e+00 -2.333635e+00 8.299940e-01 -3.030605e+00 -2.311222e+00 8.843300e-01 -3.016419e+00 -2.765091e+00 -9.666710e-01 3.928869e+00 2.223919e+00 -6.156830e-01 4.150297e+00 1.820575e+00 9.170460e-01 4.094112e+00 1.889281e+00 -5.784350e-01 4.232341e+00 1.903079e+00 -5.343620e-01 4.059885e+00 1.860460e+00 -4.700870e-01 5.773410e+00 1.225861e+00 3.230250e-01 4.150297e+00 1.820575e+00 -9.170460e-01 4.354941e+00 2.064161e+00 -7.788510e-01 5.895899e+00 1.182730e+00 -1.647050e-01 -1.985123e+00 -2.116661e+00 -3.942560e-01 -3.821694e+00 1.477989e+00 1.076310e-01 -3.900566e+00 1.002504e+00 0.000000e+00 1.734568e+00 -2.965876e+00 9.863960e-01 1.736425e+00 -2.743683e+00 7.368660e-01 1.721745e+00 -3.116887e+00 9.791110e-01 1.721745e+00 -3.116887e+00 9.791110e-01 1.848272e+00 -2.927260e+00 9.969660e-01 1.953911e+00 -2.462233e+00 8.305940e-01 1.857471e+00 -2.950722e+00 6.699880e-01 -2.695135e+00 -2.121650e+00 -5.080640e-01 1.857471e+00 -2.950722e+00 -6.699880e-01 -3.975337e+00 -5.549610e-01 -1.440700e-02 -3.703185e+00 1.631820e-01 8.426200e-02 3.247406e+00 2.073333e+00 0.000000e+00 4.936066e+00 1.737668e+00 5.572760e-01 4.369751e+00 2.298204e+00 9.218940e-01 4.082988e+00 2.175805e+00 1.450930e+00 4.082988e+00 2.175805e+00 1.450930e+00 4.211815e+00 2.282490e+00 1.039137e+00 4.025364e+00 2.359300e+00 4.025970e-01 3.928869e+00 2.223919e+00 6.156830e-01 4.036947e+00 1.992167e+00 1.072561e+00 4.307092e+00 2.367482e+00 8.772020e-01 -3.031250e+00 -3.095940e+00 -1.106355e+00 -3.016419e+00 -2.765091e+00 -9.666710e-01 -3.177824e+00 -2.279173e+00 1.047580e+00 -2.770335e+00 -3.208138e+00 1.031045e+00 -2.699966e+00 -1.850397e+00 5.700700e-01 -2.699966e+00 -1.850397e+00 5.700700e-01 -2.462835e+00 -1.305500e+00 9.663950e-01 -2.811581e+00 -1.798210e+00 7.127370e-01 -2.614084e+00 -1.905005e+00 4.049250e-01 -2.462835e+00 -1.305500e+00 -9.663950e-01 -2.699966e+00 -1.850397e+00 -5.700700e-01 -2.811581e+00 -1.798210e+00 -7.127370e-01 -2.981187e+00 -2.142718e+00 -8.583530e-01 -2.126375e+00 -1.866497e+00 -5.028950e-01 -2.699966e+00 -1.850397e+00 5.700700e-01 -2.527301e+00 -2.106246e+00 5.507350e-01 4.354941e+00 2.064161e+00 7.788510e-01 4.712067e+00 7.705120e-01 -3.333930e-01 4.712067e+00 7.705120e-01 -3.333930e-01 4.094112e+00 1.889281e+00 5.784350e-01 1.848272e+00 -2.927260e+00 9.969660e-01 -3.698925e+00 1.787941e+00 6.664000e-02 -3.675638e+00 1.471512e+00 -6.220100e-02 -2.981187e+00 -2.142718e+00 -8.583530e-01 -3.030605e+00 -2.311222e+00 -8.843300e-01 -2.981824e+00 -3.608887e+00 -1.346959e+00 -3.098730e+00 -3.539123e+00 -1.252987e+00 -3.098730e+00 -3.539123e+00 -1.252987e+00 -3.031250e+00 -3.095940e+00 -1.106355e+00 -3.042899e+00 -3.193907e+00 -1.207296e+00 -2.981824e+00 -3.608887e+00 1.346959e+00 -3.098730e+00 -3.539123e+00 1.252987e+00 4.138494e+00 2.557838e+00 -6.526510e-01 4.354196e+00 2.711836e+00 -8.265450e-01 4.296769e+00 2.260422e+00 5.287960e-01 4.354941e+00 2.064161e+00 7.788510e-01 4.044730e+00 2.254459e+00 7.442090e-01 4.354941e+00 2.064161e+00 7.788510e-01 2.960118e+00 -9.418270e-01 2.847430e-01 4.296769e+00 2.260422e+00 5.287960e-01 -2.144393e+00 -2.117408e+00 4.644890e-01 -2.144393e+00 -2.117408e+00 4.644890e-01 -2.060902e+00 -2.031698e+00 3.720790e-01 -2.048681e+00 -2.165282e+00 4.508430e-01 4.472349e+00 2.325133e+00 -4.437640e-01 4.296769e+00 2.260422e+00 -5.287960e-01 4.296769e+00 2.260422e+00 -5.287960e-01 -3.413372e+00 1.871604e+00 1.423090e-01 -3.821694e+00 1.477989e+00 1.076310e-01 1.972647e+00 -2.728848e+00 -7.724960e-01 1.721745e+00 -3.116887e+00 -9.791110e-01 -3.392806e+00 1.769365e+00 0.000000e+00 -3.413372e+00 1.871604e+00 -1.423090e-01 -1.985123e+00 -2.116661e+00 -3.942560e-01 -2.124030e+00 -2.137733e+00 -4.068530e-01 -2.147113e+00 -1.903198e+00 -3.624620e-01 -2.144393e+00 -2.117408e+00 -4.644890e-01 4.035753e+00 2.399538e+00 -3.439570e-01 4.025364e+00 2.359300e+00 4.025970e-01 4.339601e+00 2.592642e+00 -2.588910e-01 4.339601e+00 2.592642e+00 -2.588910e-01 4.138494e+00 2.557838e+00 -6.526510e-01 5.998088e+00 1.231874e+00 1.073340e-01 5.908842e+00 1.388968e+00 1.026000e-03 5.908842e+00 1.388968e+00 1.026000e-03 5.998088e+00 1.231874e+00 -1.073340e-01 5.998088e+00 1.231874e+00 -1.073340e-01 5.423860e-01 -1.882270e-01 -1.370375e+00 5.423860e-01 -1.882270e-01 -1.370375e+00 5.021254e+00 9.513080e-01 -4.055670e-01 5.021254e+00 9.513080e-01 -4.055670e-01 5.783731e+00 1.341471e+00 -2.845900e-01 5.370709e+00 9.802720e-01 -3.374320e-01 3.758215e+00 2.206683e+00 3.230510e-01 9.603210e-01 -3.080520e-01 1.243133e+00 4.863709e+00 2.722151e+00 9.366600e-01 -2.695135e+00 -2.121650e+00 5.080640e-01 -2.552923e+00 -2.142304e+00 4.545790e-01 -2.552923e+00 -2.142304e+00 4.545790e-01 1.848272e+00 -2.927260e+00 -9.969660e-01 -3.469715e+00 1.961504e+00 7.114100e-02 -3.302419e+00 -3.017921e+00 -1.128514e+00 -3.413372e+00 1.871604e+00 -1.423090e-01 -3.698925e+00 1.787941e+00 6.664000e-02 -3.498521e+00 -1.762078e+00 7.624720e-01 2.110033e+00 -3.148257e+00 -1.068816e+00 -3.251210e+00 -9.482050e-01 8.198680e-01 4.150297e+00 1.820575e+00 -9.170460e-01 5.356900e+00 8.511200e-01 1.383240e-01 4.354196e+00 2.711836e+00 8.265450e-01 -2.969687e+00 -2.097941e+00 -9.828360e-01 4.881855e+00 2.194544e+00 -5.302880e-01 5.177545e+00 1.932323e+00 2.140000e-04 5.604888e+00 1.546091e+00 1.137730e-01 -3.008323e+00 -1.759271e+00 6.556720e-01 -3.251210e+00 -9.482050e-01 8.198680e-01 -3.314868e+00 -1.599081e+00 4.396260e-01 -3.302419e+00 -3.017921e+00 1.128514e+00 -2.909010e+00 -3.084482e+00 1.089147e+00 -3.177824e+00 -2.279173e+00 1.047580e+00 1.848272e+00 -2.927260e+00 -9.969660e-01 1.811797e+00 -3.135641e+00 -9.330960e-01 1.596751e+00 -1.722028e+00 6.846550e-01 -7.847000e-02 -1.688266e+00 8.002300e-01 1.497480e+00 -1.283201e+00 1.088258e+00 2.440236e+00 -3.509564e+00 -1.019417e+00 4.094112e+00 1.889281e+00 -5.784350e-01 2.110033e+00 -3.148257e+00 1.068816e+00 2.254361e+00 -3.550931e+00 1.235118e+00 2.440236e+00 -3.509564e+00 1.019417e+00 4.262798e+00 2.490674e+00 -8.183160e-01 -3.166971e+00 -3.002766e+00 -8.121060e-01 -3.166971e+00 -3.002766e+00 -8.121060e-01 -3.217306e+00 -3.187686e+00 -1.075214e+00 -2.981187e+00 -2.142718e+00 -8.583530e-01 -3.302419e+00 -3.017921e+00 -1.128514e+00 -3.490520e+00 -1.760417e+00 -9.031040e-01 -2.982676e+00 -1.264649e+00 -1.133596e+00 -2.982676e+00 -1.264649e+00 -1.133596e+00 -2.969687e+00 -2.097941e+00 -9.828360e-01 -2.147113e+00 -1.903198e+00 -3.624620e-01 -3.490520e+00 -1.760417e+00 9.031040e-01 4.444739e+00 2.475795e+00 8.605150e-01 4.296769e+00 2.260422e+00 5.287960e-01 -3.698925e+00 1.787941e+00 6.664000e-02 5.153735e+00 8.315750e-01 -2.183480e-01 1.497480e+00 -1.283201e+00 -1.088258e+00 1.640095e+00 -6.745560e-01 -1.246804e+00 2.079600e+00 -1.473377e+00 -6.549970e-01 1.991892e+00 -1.748400e+00 -6.527700e-01 4.733657e+00 1.227371e+00 -5.928830e-01 4.733657e+00 1.227371e+00 -5.928830e-01 5.021254e+00 9.513080e-01 -4.055670e-01 5.153735e+00 8.315750e-01 -2.183480e-01 4.615662e+00 2.633870e+00 9.779860e-01 -3.098730e+00 -3.539123e+00 -1.252987e+00 -3.217306e+00 -3.187686e+00 -1.075214e+00 -1.985123e+00 -2.116661e+00 -3.942560e-01 -2.041110e+00 -2.075348e+00 -5.402010e-01 -2.041110e+00 -2.075348e+00 -5.402010e-01 -3.395381e+00 1.726325e+00 -5.547700e-01 5.998088e+00 1.231874e+00 1.073340e-01 5.783731e+00 1.341471e+00 2.845900e-01 -3.119570e+00 -3.183977e+00 8.707390e-01 -3.294389e+00 -3.166225e+00 8.428230e-01 1.919391e+00 -3.487078e+00 -1.110869e+00 -3.217306e+00 -3.187686e+00 1.075214e+00 -3.890388e+00 -1.750102e+00 1.761200e-02 2.079600e+00 -1.473377e+00 6.549970e-01 -3.006867e+00 -3.575464e+00 8.302210e-01 -3.119570e+00 -3.183977e+00 8.707390e-01 1.947264e+00 -2.443232e+00 7.325870e-01 1.736425e+00 -2.743683e+00 7.368660e-01 1.596751e+00 -1.722028e+00 6.846550e-01 -4.333831e+00 -1.548255e+00 5.693800e-02 -3.703185e+00 1.631820e-01 8.426200e-02 -4.029726e+00 -1.043238e+00 1.363050e-01 4.084506e+00 2.570978e+00 2.181680e-01 4.104292e+00 2.537976e+00 5.434370e-01 4.442912e+00 2.343263e+00 5.332200e-01 -3.006867e+00 -3.575464e+00 8.302210e-01 -2.981824e+00 -3.608887e+00 1.346959e+00 5.755282e+00 1.004149e+00 -3.075050e-01 4.615662e+00 2.633870e+00 9.779860e-01 4.354196e+00 2.711836e+00 8.265450e-01 5.021254e+00 9.513080e-01 -4.055670e-01 5.021254e+00 9.513080e-01 -4.055670e-01 5.773410e+00 1.225861e+00 -3.230250e-01 5.895899e+00 1.182730e+00 -1.647050e-01 -2.462835e+00 -1.305500e+00 9.663950e-01 -2.462835e+00 -1.305500e+00 9.663950e-01 -5.242310e-01 -1.399266e+00 1.313019e+00 -2.462835e+00 -1.305500e+00 -9.663950e-01 -2.462835e+00 -1.305500e+00 -9.663950e-01 1.811797e+00 -3.135641e+00 9.330960e-01 1.857471e+00 -2.950722e+00 6.699880e-01 4.120842e+00 6.271410e-01 1.854610e-01 4.232341e+00 1.903079e+00 5.343620e-01 1.497480e+00 -1.283201e+00 1.088258e+00 1.734568e+00 -2.965876e+00 9.863960e-01 1.801794e+00 -1.465464e+00 1.129277e+00 1.596751e+00 -1.722028e+00 -6.846550e-01 1.596751e+00 -1.722028e+00 -6.846550e-01 1.947264e+00 -2.443232e+00 -7.325870e-01 1.953911e+00 -2.462233e+00 -8.305940e-01 -3.335942e+00 -1.365685e+00 -7.245900e-01 -3.533910e+00 -1.330455e+00 -5.682460e-01 -3.166971e+00 -3.002766e+00 -8.121060e-01 -3.006867e+00 -3.575464e+00 -8.302210e-01 -2.749355e+00 -3.272099e+00 -1.034148e+00 3.247406e+00 2.073333e+00 0.000000e+00 -2.503818e+00 -1.909806e+00 4.314560e-01 -3.977657e+00 -1.750845e+00 -1.849090e-01 -3.977657e+00 -1.750845e+00 -1.849090e-01 -3.742608e+00 -7.293740e-01 -1.493610e-01 -3.742608e+00 -7.293740e-01 -1.493610e-01 -3.820370e+00 -1.239135e+00 -2.698070e-01 -3.820370e+00 -1.239135e+00 -2.698070e-01 -3.860740e+00 -1.883490e-01 -2.496200e-02 -3.817381e+00 1.503480e-01 -4.872800e-02 2.110033e+00 -3.148257e+00 -1.068816e+00 2.254361e+00 -3.550931e+00 -1.235118e+00 2.663024e+00 -1.440487e+00 4.781490e-01 4.354196e+00 2.711836e+00 -8.265450e-01 4.354196e+00 2.711836e+00 -8.265450e-01 4.636909e+00 2.750501e+00 -8.568590e-01 5.096148e+00 2.759720e+00 -7.747290e-01 8.573230e-01 9.850010e-01 8.740290e-01 597 58 -11 11 19 -597 19 20 -597 597 20 -64 11 58 -14 642 27 -32 27 28 -32 50 641 -32 641 50 -51 51 397 -641 39 478 -52 39 52 -480 5 57 -54 54 397 -5 5 397 -392 51 392 -397 178 5 -50 392 50 -5 6 47 -655 5 6 -57 56 57 -6 655 44 -654 61 72 -67 569 66 -65 291 614 -669 69 548 -554 570 548 -69 67 72 -68 61 67 -412 363 348 -350 570 69 -71 73 670 -72 68 72 -670 73 72 -292 70 570 -75 570 76 -75 72 358 -456 71 77 -570 76 570 -77 77 72 -456 292 77 -71 72 77 -292 574 74 -71 290 71 -69 39 80 -45 583 587 -588 654 45 -79 78 79 -45 584 481 -86 481 584 -585 81 493 -53 83 81 -53 83 386 -79 387 79 -386 81 83 -344 79 344 -83 79 78 -344 550 344 -78 597 61 -60 519 62 -60 63 62 -518 349 518 -62 412 60 -61 71 290 -574 362 518 -349 518 84 -63 653 366 -651 650 652 -339 597 60 -58 58 60 -595 63 22 -595 598 18 -367 62 63 -595 60 62 -595 19 11 -10 127 659 -528 10 575 -117 11 13 -12 1 10 -12 11 12 -10 117 487 -10 575 10 -1 12 2 -1 13 2 -12 13 11 -14 58 16 -14 13 14 -16 2 13 -15 2 15 -25 25 15 -23 22 30 -23 3 2 -24 25 33 -24 33 25 -29 29 25 -34 25 30 -34 31 30 -26 31 26 -642 27 642 -26 37 36 -33 29 38 -37 34 38 -29 38 34 -35 31 478 -35 595 17 -16 15 13 -16 17 23 -16 58 595 -16 64 572 -63 64 20 -572 21 596 -59 572 22 -63 21 59 -537 22 23 -595 596 21 -536 23 15 -16 25 24 -2 23 30 -25 30 22 -26 26 22 -27 22 28 -27 33 3 -24 29 37 -33 34 30 -35 35 30 -31 478 38 -35 33 36 -3 36 40 -3 37 40 -36 40 37 -42 42 37 -38 7 3 -40 42 41 -40 45 478 -39 521 609 -4 41 47 -43 41 48 -47 520 43 -46 46 43 -47 38 44 -48 45 44 -478 38 478 -44 48 42 -38 41 42 -48 41 43 -40 7 40 -551 43 551 -40 585 586 -481 39 480 -492 492 559 -39 493 81 -435 497 357 -470 414 497 -470 357 88 -87 496 91 -89 496 89 -494 495 469 -498 88 497 -604 85 335 -336 92 351 -352 605 90 -657 88 357 -497 89 94 -95 89 91 -94 95 94 -96 375 582 -97 658 98 -581 657 580 -605 96 656 -93 94 656 -96 332 294 -657 293 657 -90 657 293 -332 415 435 -98 81 344 -355 581 98 -81 435 81 -98 654 44 -45 655 48 -44 47 48 -655 236 99 -245 100 244 -447 244 100 -101 100 552 -101 552 295 -101 298 491 -296 50 606 -51 607 51 -606 103 482 -104 428 589 -427 50 392 -445 399 55 -396 49 398 -479 455 425 -426 397 54 -105 424 105 -54 525 102 -524 608 522 -523 479 398 -423 108 560 -106 107 561 -106 106 109 -140 561 562 -106 430 255 -411 514 108 -106 514 106 -140 109 106 -562 562 116 -109 533 540 -256 110 540 -535 533 535 -540 258 111 -9 111 258 -114 111 114 -631 634 113 -444 116 562 -636 444 113 -404 534 299 -403 541 631 -114 263 541 -114 541 263 -538 258 259 -114 263 114 -259 115 539 -557 264 486 -594 486 600 -594 601 602 -599 109 487 -117 140 117 -438 255 410 -411 421 529 -255 128 126 -120 421 255 -430 430 119 -421 120 126 -124 119 419 -421 513 515 -422 515 123 -422 420 422 -123 125 673 -388 388 405 -125 388 673 -121 674 675 -672 502 579 -501 407 501 -579 526 501 -407 528 530 -127 406 436 -127 659 127 -436 440 129 -408 406 409 -436 301 137 -300 301 370 -137 370 301 -134 135 131 -130 122 138 -137 303 137 -136 137 303 -300 136 137 -138 135 443 -139 135 139 -131 139 443 -556 304 439 -442 637 112 -635 140 109 -117 302 139 -133 131 139 -302 129 440 -459 359 360 -361 442 439 -132 82 54 -57 82 480 -54 52 54 -480 507 188 -617 507 617 -152 152 617 -671 152 19 -507 19 152 -20 152 149 -20 149 150 -20 638 162 -158 162 395 -178 28 22 -158 158 162 -28 32 28 -162 32 162 -50 178 50 -162 395 179 -178 395 305 -179 183 305 -395 168 182 -639 168 181 -182 5 182 -184 182 5 -183 5 305 -183 247 305 -5 246 5 -178 185 184 -187 563 555 -565 46 47 -186 186 47 -185 6 185 -47 5 184 -6 185 6 -184 187 186 -185 186 176 -46 340 453 -489 194 198 -195 195 198 -196 643 198 -194 576 340 -489 643 200 -198 204 199 -193 201 204 -193 347 452 -346 202 340 -577 577 340 -576 202 203 -340 454 345 -364 340 206 -205 621 205 -206 200 643 -206 644 206 -643 200 206 -203 203 206 -340 578 200 -307 306 198 -200 207 168 -174 187 208 -174 590 174 -208 207 209 -168 209 434 -168 211 308 -210 553 308 -211 564 308 -553 334 553 -211 431 566 -208 566 590 -208 191 617 -190 448 649 -647 648 189 -449 449 189 -192 489 453 -450 190 451 -191 200 578 -306 197 620 -191 621 622 -205 622 365 -205 191 620 -617 617 188 -190 188 573 -190 192 189 -154 142 143 -151 19 10 -507 659 527 -528 282 143 -142 143 282 -659 141 659 -282 659 141 -527 143 145 -144 659 145 -143 142 151 -486 10 487 -507 144 151 -143 188 151 -148 147 148 -151 146 147 -144 151 144 -147 144 145 -146 145 659 -2 2 156 -153 676 160 -154 3 155 -2 155 159 -156 159 163 -156 156 163 -160 640 157 -160 161 638 -157 158 157 -638 155 3 -165 165 166 -155 159 166 -163 640 164 -639 148 543 -573 2 153 -145 153 146 -145 147 146 -153 543 148 -153 147 153 -148 148 573 -188 150 571 -20 20 571 -572 154 158 -192 156 2 -155 676 156 -160 160 157 -154 154 157 -158 159 155 -166 163 164 -160 164 640 -160 639 164 -163 165 3 -169 166 165 -169 169 167 -166 163 166 -167 167 170 -163 239 3 -7 239 169 -3 169 170 -167 174 168 -639 241 520 -171 172 171 -176 172 176 -187 173 187 -174 175 171 -46 520 46 -171 175 176 -171 175 46 -176 176 186 -187 174 639 -173 163 173 -639 170 173 -163 187 173 -170 172 187 -170 170 169 -172 171 172 -169 171 169 -239 168 434 -181 434 209 -432 567 209 -207 472 568 -216 353 615 -207 500 213 -417 500 214 -213 615 217 -218 219 212 -343 629 630 -619 354 619 -630 224 220 -334 207 218 -567 615 218 -207 213 222 -342 213 342 -417 222 310 -342 225 612 -613 342 612 -225 618 612 -310 310 612 -342 333 221 -223 309 499 -221 416 567 -218 221 333 -309 215 378 -471 211 224 -334 356 433 -378 471 378 -433 226 228 -227 624 229 -226 229 228 -226 337 338 -228 228 229 -337 229 231 -337 242 230 -625 231 315 -337 230 232 -625 625 232 -623 623 232 -316 232 663 -235 664 234 -661 232 235 -316 368 447 -320 319 320 -447 447 368 -100 100 368 -593 7 551 -490 368 320 -458 238 429 -549 624 226 -446 517 491 -516 413 240 -243 298 516 -491 101 663 -244 237 667 -230 244 663 -232 321 244 -232 667 232 -230 233 297 -311 666 233 -311 666 311 -313 318 312 -314 662 665 -616 616 317 -662 458 320 -457 667 668 -232 178 179 -248 510 248 -179 179 371 -510 249 180 -511 177 394 -660 475 474 -484 250 473 -477 183 393 -182 546 182 -393 402 512 -372 509 372 -512 473 250 -251 545 547 -252 545 252 -483 265 373 -376 253 255 -376 255 253 -410 460 410 -253 376 508 -265 373 262 -8 508 376 -255 265 262 -373 262 256 -8 262 260 -256 533 256 -400 611 531 -532 256 260 -400 322 401 -441 261 610 -257 263 259 -262 262 259 -441 263 264 -594 262 264 -263 264 262 -265 486 264 -142 265 142 -264 508 142 -265 646 488 -645 529 626 -255 558 266 -379 627 628 -626 381 270 -380 270 381 -385 626 628 -255 628 627 -383 255 268 -508 508 268 -591 382 384 -603 632 274 -592 465 592 -274 544 603 -384 274 275 -465 273 276 -272 276 273 -118 267 633 -271 418 542 -505 418 505 -506 506 269 -418 279 504 -278 389 277 -467 281 390 -391 468 284 -323 281 280 -390 281 391 -327 282 466 -141 282 327 -466 466 327 -391 285 324 -325 325 328 -285 503 330 -331 504 279 -285 279 324 -285 289 329 -464 329 289 -485 287 461 -463 485 289 -341 464 437 -289 441 259 -322 254 374 -377 369 286 -326 283 437 -464 462 283 -464 369 288 -286 184 182 -181 476 210 -308 mayavi-4.5.0/mayavi/tests/data/cube.vti0000644000076500000240000000151212747716314020430 0ustar prabhustaff00000000000000 _AQAAAACAAADYAAAA4wAAAA==eJwB2AAn/+csB27h5+M/Ji7JB+7D1z+Mpu8gESjQP0InK3Xy0+4/0KxaRoubzT98W7FoyO3CP3gIVUg1itE/UCjVmz4CrT/cFP5SugzsP64eRz5L0eQ/CinCD/aN3j+f28J7Y1XlPyZ226SEmeg/sMh7gnmUyz8qMwMbGivhP2kU+d4Nj+8/DOCLzY7Q7z/JfhBxSqvkP3/KeOeCO+E/dANDe4HjwT/JaYA/e3PrP6ZcB6sWmek/Xv//COTH3T9GpEN0vFLdP6cZS/1N+u0/+sPGNXE92D+4cUIBwirUPw3Ya3I= mayavi-4.5.0/mayavi/tests/data/disk_out_ref.ex20000755000076500000240000253762012747716314022106 0ustar prabhustaff00000000000000CDF  len_string!len_lineQfour time_stepnum_dim num_nodes!3num_elem0 num_el_blk num_node_sets num_side_sets num_qa_recnum_info num_el_in_blk10num_nod_per_el1 num_nod_ns1 num_nod_ns2 num_nod_ns3 num_side_ss1 num_side_ss2l num_side_ss3< num_side_ss4 num_side_ss5 num_side_ss6 num_side_ss7 num_nod_var  api_version@ version@Gfloating_point_word_sizetitle*cubit({Gen_out_name}): 02/06/96: 14:45:48 time_whole\ eb_statusLeb_prop1 nameIDP ns_status Tns_prop1 nameID ` ss_status lss_prop1 nameIDcoordd coor_namesd qa_records l info_records ,elem_mapt$connect1  elem_typeHEX8node_ns1node_ns2node_ns3elem_ss1side_ss1xelem_ss2side_ss2Űelem_ss3 `side_ss3 Pelem_ss4`@side_ss4`elem_ss5side_ss5elem_ss6side_ss6elem_ss7 side_ss7x vals_nod_var,` name_nod_var,0?1?@8@l@@YC@H@4b@@4b@H@YC@@l@8??1?)^?? @@:@S+@e"x@p"@s @p"@e"x@S+@:@? ??)^?n\?꽡@+@\@p@@>8>_>"t?J>z<>y>2>N??|??g@ ;@A@@%#@+? @%F:@O@@ 0?jK?_?}?t?1??3]@@@~U?T??2?tr?lW?au?sĘ?z?s?a\?l19?˭t?p>?R???G? ?Y?SV>>">t>s?}> >>'>h? w??{?@ @@d@$x@+@$@v@@ ?%?9?~ ?v_??? 9@+$@ @??Fi?VQ?u{?pҫ?]?xp?f?y|?]6?qHS??Χ?l?7?ǟ??]?gl>I>8>׀>)?zZ>>>4>???~?C?*!@ 3@$@x@$@#@+g@$0@9@ :@ ??T?|w?w?&?"?%?O@ 0x??_?KL?8?v^C?saj?[i?z?̈́?|?\-?t??Т*?!?8?;q?? >*>l>T> 4>0?>>>ڧ>?K?|}?2?@ d @@@l@$&@+3@$$S@,@+@ qz??0?{NZ?xK??s?`d?r@ c?>?pp?ꠝ??v?uY?Z?|`? V?t>?\?v$??҄?k??&?t{?Z>f>@>:>>C?Q>>ۅ>&>??z?C?R@ 1@E@u@$7@+ @$5@ @8@ V?Z?+s?y5?y??I?a?p+@ ?)?y??tQ?w?vq?Z\k?~?n?~?\=-?w$?b?`^?ŋ3?8?t?v?>>=>%s>>3?>;>i>>d>ۈ?y?x$?@ {@CZ@#@$N@+ʄ@$J@Ar@K@ c??V?xs?y??Q?_?@?T? ?? '?w8?w?[7?$?6)?P?\?xR-?x?ժ?޺?T?yJ>a>>st>Ũ?>^>ڋm>)>>?x??G@ 3 @G@^@$e@+@$X@@L@ h???w$ ?y4?+?ȗ?3#?9@`?O?R?m?c[?wb?w?[?2?u3?f?]?xP???*?{??ːk?,>5><>>B>?Q>>ڪ%>>Ď>U?w?r? @ b@I@o@$s1@+@$f@@Zn@ '?#7?n?vv?yE?W?ꍐ?z?@$.?#?SD?1??wk?x-?\???I?^?y?????X?Z?xe>>d>f%>W2>d??G> >9>>;t?v*? ?M@ j@=@B@$@+j:@$up@֞@]@ ?o??u?yQ?]?Z?칈?qi@s??a?H?"?wj?x?]T6??Y??_[g?z??!?,?K??΄?$>.>F>\>ؕ> 6??>r>B>>.?u?;?@ |@7@@$@+D@$|@Q@^@ ?B?/?t+X?yc0??/??&@?g?r^? ?u5?wo?y?^?x&?*??`E?z?0U? $?:~??/?϶?>&>f>[>O>??>>Ro>>0?u.?[?z@ M@3r@#@$@+"@$g@@]y@ ?;r?t?sl?yi?Y? ?&?@?1?h??W?wuN?yk?^??s??aQ?z?ҍ?ߍ?K?w?W?n?8>gC>j>Xp>bZ>?m?2 >ܥc>>p>A?t{?? @ %@2 @Gf@$m@+5@$p@8 @Z@ |??,?r£?yj?u??6?@P? ?D>;>Q1>>o??[8>p>>D>d?s?ը?@ @4@a@$@*@$Y@No@^c@ d?F=??r*?yh0??ե?K?u@~?G??螥?H?w?y?`????cj?{ʭ??ۺe?$U?w?g?d?>> >J>r?v?56?l>>>> >?sDH??B@@6/@w&@$@@*Z@$A@d@bV@ Hl??^?q?yl ??p?o?@?v? K?U?L?w?z9?a7? ?$?:=?da?|:a?q? x??? ?w?>;>>D> ,?Ij?E=?> >U8>>?r?g?@ɿ@6@e@$@*@$f@z@e5@ *?߇??q%~?ytT?4?駳?S?@s?m?3?m??w8?zx?bG?h?^?"?eS1?|(??܏+?Ҹ?_ ?Y?#?P۾8_"tJzR?G YSVξ"ts} 'h w{ d$x+$v %9~ v_ 9+$ FiVQu{pҫ]xpÿfy|]6qHSΧl7ǟ]glI8׀)zZ4?~C*! 3$x$@#+g$09 : տ㿸T|ww&"%O 0x_KL8v^Csaj[iz̈́|\-tТ*!8;q *lT 40ӾڧK|}2 d @l$&+3$$S,+ qz0{NZxKs`dr c>ppꠝ쐿vuYZ|` Vt>\v$҄k&t{Zf@:CQۅ&Ҿ׿zCۿR 1Eu$7+ $5 8 VZ+sy5yIap+ )ӿytQwvqZ\k~ҿn~\=-w$b`^ŋ38tvξ=%s3ܾ;iξdۈyx$ {CZ#$N+ʄ$JArK cVxsʿyQ_T 'w8w[7$6)P\xR-xժ޺T<ɈVwyJažstŨ^ڋm)xG 3 G^$e+$XL h▿w$ y4+ȗ3#9`ORmÿc[wbw[꿀2u3f]xPֿϿ*{ːk,5<оBѾQڪ%ĎUwr bIo$s1+$fZn '#7nvvyEWꍐz$.#SD1wkx-ǿ\ɿI^yϿӿؿXZȿxedf%W2dѿGʾ 9;tv* M j=B$+j:$up֞] oҿuȿyQ]Z칈qisͿƿaɿH"wjƿx]T6Y_[gz!,K࿭΄$.F\ؕ 6rB.u; |7$+D$|Q^ B/t+Xyc0/&gϿr^ u5woy^߿x&*¿`Ez0U $:~訿/϶о&f[OοپRo0u.迴[z M3r#$+"$g]y ;rtslyiY &1h⿺WwuNyk^пsaQzҍߍKwWn8gCjXpbZm2 ܥcʾpAԿt{п  %2 Gf$m+5$p8 Z |쿳,r£yju6Pʿ ; sDHB6/w&$@*Z$AdbV Hl᧿^qyl pov KULwz9Ŀa7 ҿ$:=da˿|:aq x w󿴣;ҾাD ,IjE= U8rgɿ6e$*$fze5 *߇߿q%~ytT4駳Ssm3mϿw8zx¿bGh^"eS1|(܏+Ҹ_ Y#P?)^?? @@:@S+@e"x@p"@s @p"@e"x@S+@:@? ??)^?)^?)^??? ? @@@:@:@S+@S+@e"x@e"x@p"@p"@s @s @p"@p"@e"x@e"x@S+@S+@:@:@@? ? ???)^?)^?1?@8@l@@YC@H@4b@@4b@H@YC@@l@8??1?1?1??@8@8@l@l@@@YC@YC@H@H@4b@4b@@@4b@4b@H@H@YC@YC@@@l@l@8@8???1?1?n\?꽡@+@\@p@@pn\꽡+\pf?2?Q?u@@|t@N@RAȿٿ-?rx?T?u?Z ?u?xG?ù fw :P?[Կk돿 ?G?lp*Ϳ???@@**Ϳ%???@@**Ϳ%???@@**Ϳ%???@@**Ϳ%???@@**Ϳ%???@@**Ϳ%???@@**Ϳ???@@**Ϳ???@@**Ϳ???@@**Ϳ???@@**Ϳ???@@**Ϳ???@@**Ϳ???@@*@&8p@6?6?`?:у Å|{%?EDJ"Ͽy}E;;(D>?{C?N?d@@H@ݿtx);f>,?v?‰?z?x%? ?x~$?1&9V"w񃿶Oѿ0? ??i̿ Ϳh@&@?%?z?c:9տ%mLWy&-)H v~euq;l>?xn??9@@h@}!p3w| 6:ܾ>݊?y>?d?儸?? ?xt8?:wo%? e?=?g f@&Ӈ@$? ?r? G;'\"CS&g4Gp>޿irWy;v>>4?uK?3?B@ב@s=@ G ѿyʾS:9>?{?„?/??x?t?5?t@^@@ Y{;6Eo>l?}?“J??(??w? @):(A.v㿶w%:o??y?eJ딿dt@'%R@L?;?{? d;) 4X&Д]wbdٿ瀦 pBp;(>B=?r|??@@2@K2N1}N;@>??~???*?/?w? u;.;v߿ho:{?=?}?dпcu@'C@a?m?? Lz;#ţ 5ES4&T75ǿo&R;#>?q\^? ,?P@@z)@l0™d~;=<8>?e??k?+?/?w]? r?;v=]N?Y?`?dZտc @'^o@v?Ĥ?%? e;A :!|Bp'[%̟5n=ھ);^>|I?p??p@&@@ֿ()ھH9v>\??/??m:?V?w%? Q;6`u᧿翪0-V?'?w?dȿ ?p;?I1?@7[@@馿|%q;~>w8>ǫ?:?j?6?Ϫ?l*?w? <;uxx(?O??cƿ?bg@'y@??'? qu; @a('UPH<X,nQlWz;*>G?o&??Y@Oz@@ tˠÌ Q:>?S0?Û?-?&?)?w? :Mc?o|F??+[@c@%z@ ;` &-=ažM->ĝ??^??x=??w? :Vk˿tu}׿sѱ??i?cοZa@'@I?y?? e:J/xh0\' ;- p⿯ll7sn;y>4?o4?m?@u@C@ ] NSr!⿁u@ >i?????p?w?: 8t鿸}L?w?O?c߿@a@'@?Ū?? Z:?r8j]s' X3Wrlݹ;_v>? ?!?b1???w?҈:mtl $ܹ?2??c6aa@'b@$??? P:l `ĉ4'g tE+k*a;C>Ga?n??@y@|d@ /ƿĠCZLً>0?J?Jy?C?] ?M?w? :ڗ(ڿtQNpF ??f?cia4@'J@?*?Q? H:vYտIJ'% aS ghk֩;&>?n??䮚@@@ "lEm?0L#?*?t?q?;%@f2Qu@|tNRA???kN~-rxTuZ uxG9 ?f?w? :;P?[?k? Glp&8p66`㯺у? ??Å@|{@%?@E@@?DJ?"?y>}E;(D{CNƿdH????tx>)f,v‰zx% x~$1&V?"?w?O?0: 翤i? ?h&%zc9??%m?LW@y@&-)@H @@v?~e??uq>ûl㣿xn9h}?!p?3??w|> 6ܾ݊ӿy>d儸 xt8??w??o9% e=g? ?f&Ӈ$ ڿr G'?\?"?C@S@&g@4@Gp@>??i?rW>yv>4uK3Bבs= ?G? ??y>S9ʿ{ᇿ„/xt5t^ ?Y???{>ʻ6Eol}“J(w @)(?A.?v??w%oۿyeJ??dt'%RL;տ{ d)? ??4X@@&Д@]w@b@d?瀦? ?pB>p(B=r|2K?2??N1?}N>@?~*/w u.?;?v?h?o{߿=}d??cu'Cam˿ Lz#ţ? 5E??S@4@&@T@7@?5??o&R>#q\^ ,Pz)?l?0?™d?~>û=<8ek+/w] r???v=?]?N6Y`dZ??c '^ovĤ% eۻA? :!??|B@p@'@[@@%?̟?5?n=>)^|IpݿԿp&?(?)??>Hùv\俀Ͽ/m:Vw% Q6?`?u??0:-V'wd? ٻ:ڿp;I17[?|%?q?;?~>>w:8ǫ:j6Ϫl*w <??ux??:x(Oc???bg'yӿ' qu? ?@?a@(@'U@P@H<@?X,?nQ?lW>z*Go&ؿYOz ?t?ˠ?Ì?> ;Q:ÿS0Û-&)w ?M`%co|Fҿ+[c%z ;`? ?&-?=?a>M-;ƾĝ^ؿx=w Vk??tu?}?s:ѱiпc?Z?a'Iy eJ?/?xh?0@\@'@ ;-@@ p??l?l7s>ny˾4o4뿰muC ] ?NS?r?!?>u@; оi޿꿺pwݺ 8??t??}:LwOc?@?a'Ū Zк?r?8?j?]@s@'@ X@@3?W?r?l>ݹ_vaC־Gany|d ? ?/?ĠC??ZL;ً0JJyC] Mw ڗ(??tQ?N?pF: 򯿭fc?i?a4'J*Q Hv??Y?IJ@@'%@ @a@S ?g?h?k>֩&n䮚 ?"l?E?m??0?L<#*׿tq@j@}@@;@ԛ@ :AHAAAH@ ;@ԛ@;@@}@j@>@3??? AAH@ ;@ԛ@;@@}@j@>@3??? AAH@ ;@ԛ@;@@}@j@>@3??? AAAAAHAHAHAH@ ;@ ;@ :@ :@ԛ@ԛ@ԛ@ԛ@;@;@;@;@@@@@}@}@}@}@j@j@j@j@>@>@>@>@2@1@1@0??Ŀ?ľ?Ľ????? ? ? ? AAH@ ;@ԛ@;@@}@j@>@3??? AAH@ ;@ԛ@;@@}@j@>@3??? AAH@ ;@ԛ@;@@}@j@>@3??? AAH@ ;@ԛ@;@@}@j@>@3??? AAH@ ;@ԛ@;@@}@j@>@3??? AAH@ ;@ԛ@;@@}@j@>@3??? AAH@ ;@ԛ@;@@}@j@>@3??? AAH@ ;@ԛ@;@@}@j@>@3??? AAH@ ;@ԛ@;@@}@j@>@3??? AAH@ ;@ԛ@;@@}@j@>@3??? AAH@ ;@ԛ@;@@}@j@>@3??? AAH@ ;@ԛ@;@@}@j@>@3??? AAH@ ;@ԛ@;@@}@j@>@3??? AAH@ ;@ԛ@;@@}@j@>@3??? AAH@ ;@ԛ@;@@}@j@>@3??? AAH@ ;@ԛ@;@@}@j@>@3??? AAH@ ;@ԛ@;@@}@j@>@3??? ? ??ļ@0@>@j@}@@;@ԛ@ :AHA? ??ļ@0@>@j@}@@;@ԛ@ :AHA? ??Ľ@0@>@j@}@@;@ԛ@ :AHA? ??Ľ@0@>@j@}@@;@ԛ@ :AHA? ??Ľ@0@>@j@}@@;@ԛ@ :AHA? ??Ľ@1@>@j@}@@;@ԛ@ :AHA? ??ľ@1@>@j@}@@;@ԛ@ :AHA? ??ľ@1@>@j@}@@;@ԛ@ :AHA? ??ľ@1@>@j@}@@;@ԛ@ :AHA? ??ľ@1@>@j@}@@;@ԛ@ :AHA? ??Ŀ@1@>@j@}@@;@ԛ@ ;AHA? ??Ŀ@2@>@j@}@@;@ԛ@ ;AHA? ??Ŀ@2@>@j@}@@;@ԛ@ ;AHA? ??@2@>@j@}@@;@ԛ@ ;AHA? ??@2@>@j@}@@;@ԛ@ ;AHA? ??@2@>@j@}@@;@ԛ@ ;AHA? ??@2@>@j@}@@;@ԛ@ ;AHAAAAAAHAHAHAH@ ;@ ;@ ;@ ;@ԛ@ԛ@ԛ@ԛ@;@;@;@;@@@@@}@}@}@}@j@j@j@j@>@>@>@>@3@3@3@3????????? ? ? ? AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAH@ ;@ ;@ ;@ ;@ <@ <@ <@ ;@ ;@ ;@ ;@ ;@ ;@ ;@ :@ :@ :@ ;@ :@ ;@ :@ ;@ :@ ;@ ;@ ;@ ;@ ;@ ;@ ;@ ;@ ;@ ;@ ;@ ;@ :@ :@ :@ ;@ ;@ ;@ ;@ <@ ;@ ;@ ;@ ;@ ;@ ;@ ;@ :@ :@ :@ ;@ ;@ ;@ ;@ ;@ ;@ ;@ ;@ ;@ ;@ ;@ ;@ :@ :@ :@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@3@3@3@3@4@4@4@4@3@3@3@2@2@1@1@0@0@2@0@2@0@2@1@2@3@3@3@3@3@3@3@3@2@2@2@1@1@1@3@3@3@3@3@3@3@3@3@3@2@2@1@1@0@3@3@3@3@3@3@3@3@3@2@2@2@1@1@0?????????????Ŀ?ľ?ľ?ļ?Ľ??Ľ??ļ?Ŀ?Ľ????????????Ŀ?ľ?Ľ?Ľ????????????Ŀ?ľ?ľ?Ľ????????????Ŀ?ľ?ľ?Ľ????????????????????????????????????????????????????????????????????? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\? ??@3@>@j@}@@;@ԛ@ ;AHA? ??@3@>@j@}@@;@ԛ@ ;AHA? ??@3@>@j@}@@;@ԛ@ ;AHA? ??@3@>@j@}@@;@ԛ@ ;AHA? ??@3@>@j@}@@;@ԛ@ ;AHA? ??@3@>@j@}@@;@ԛ@ ;AHA? ??@3@>@j@}@@;@ԛ@ ;AHA? ??@3@>@j@}@@;@ԛ@ ;AHA? ??@3@>@j@}@@;@ԛ@ ;AHA? ??@3@>@j@}@@;@ԛ@ ;AHA? ??@3@>@j@}@@;@ԛ@ ;AHA? ??@3@>@j@}@@;@ԛ@ ;AHA? ??@3@>@j@}@@;@ԛ@ ;AHA? ??@3@>@j@}@@;@ԛ@ ;AHA? ??@3@>@j@}@@;@ԛ@ ;AHA? ??@3@>@j@}@@;@ԛ@ ;AHA? ??@3@>@j@}@@;@ԛ@ ;AHAAAH@ :@ԛ@;@@}@j@>@0?ļ?? AAH@ :@ԛ@;@@}@j@>@0?ļ?? AAH@ :@ԛ@;@@}@j@>@0?Ľ?? AAH@ :@ԛ@;@@}@j@>@0?Ľ?? AAH@ :@ԛ@;@@}@j@>@0?Ľ?? AAH@ :@ԛ@;@@}@j@>@1?Ľ?? AAH@ :@ԛ@;@@}@j@>@1?ľ?? AAH@ :@ԛ@;@@}@j@>@1?ľ?? AAH@ :@ԛ@;@@}@j@>@1?ľ?? AAH@ :@ԛ@;@@}@j@>@1?ľ?? AAH@ ;@ԛ@;@@}@j@>@1?Ŀ?? AAH@ ;@ԛ@;@@}@j@>@2?Ŀ?? AAH@ ;@ԛ@;@@}@j@>@2?Ŀ?? AAH@ ;@ԛ@;@@}@j@>@2??? AAH@ ;@ԛ@;@@}@j@>@2??? AAH@ ;@ԛ@;@@}@j@>@2??? AAH@ ;@ԛ@;@@}@j@>@2??? AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAH@ :@ :@ :@ ;@ ;@ ;@ ;@ ;@ ;@ ;@ <@ <@ <@ ;@ ;@ ;@ ;@ :@ ;@ :@ ;@ :@ ;@ :@ :@ :@ ;@ ;@ ;@ ;@ ;@ ;@ ;@ ;@ ;@ ;@ ;@ ;@ :@ :@ :@ ;@ ;@ ;@ ;@ ;@ ;@ ;@ <@ ;@ ;@ ;@ ;@ :@ :@ :@ ;@ ;@ ;@ ;@ ;@ ;@ ;@ ;@ ;@ ;@ ;@ ;@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@0@1@1@1@2@2@3@3@3@4@4@4@4@3@3@3@3@0@2@0@2@1@2@1@1@1@2@2@2@3@3@3@3@3@3@3@3@2@0@1@1@2@2@3@3@3@3@3@3@3@3@3@3@0@1@1@2@2@2@3@3@3@3@3@3@3@3@3?Ľ?Ľ?ľ?Ŀ?Ŀ?????????????ļ??ļ??Ľ?Ŀ?Ľ?ľ?ľ?Ŀ????????????Ľ?ľ?Ŀ?Ŀ????????????Ľ?ľ?ľ?Ŀ???????????????????????????????????????????????????????????????????????????????? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? A"\? ??ļ@0@>@j@}@@;@ԛ@ :AHAA"\AAH@ ;@ԛ@;@@}@j@>@3??? A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\? ? ???Ŀ?Ľ@2@1@>@>@j@j@}@}@@@;@;@ԛ@ԛ@ ;@ :AHAHAA? ? ???Ŀ?Ľ@2@1@>@>@j@j@}@}@@@;@;@ԛ@ԛ@ ;@ :AHAHAAAAH@ ;@ԛ@;@@}@j@>@2??? AAH@ ;@ԛ@;@@}@j@>@2??? AAH@ ;@ԛ@;@@}@j@>@2??? AAH@ ;@ԛ@;@@}@j@>@2??? AAH@ ;@ԛ@;@@}@j@>@2?Ŀ?? AAH@ ;@ԛ@;@@}@j@>@2?Ŀ?? AAH@ ;@ԛ@;@@}@j@>@1?Ŀ?? AAH@ :@ԛ@;@@}@j@>@1?ľ?? AAH@ :@ԛ@;@@}@j@>@1?ľ?? AAH@ :@ԛ@;@@}@j@>@1?ľ?? AAH@ :@ԛ@;@@}@j@>@1?ľ?? AAH@ :@ԛ@;@@}@j@>@1?Ľ?? AAH@ :@ԛ@;@@}@j@>@0?Ľ?? AAH@ :@ԛ@;@@}@j@>@0?Ľ?? AAH@ :@ԛ@;@@}@j@>@0?Ľ?? AAH@ :@ԛ@;@@}@j@>@0?ļ?? AAH@ :@ԛ@;@@}@j@>@0?ļ?? AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAH@ =@ <@ >@ =@ =@ =@ =@ =@ =@ <@ <@ <@ <@ ;@ ;@ ;@ :@ :@ :@ :@ 9@ 9@ 9@ 9@ 8@ 8@ 8@ 8@ 7@ 8@ 7@ 7@ 8@ 9@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@7@6@8@7@8@7@7@6@6@6@5@5@4@4@2@2@1@1@0@0@/@/@.@.@,@-@,@,@+@+@*@*@+@,?????????????????ľ?ľ?ļ?ļ?ĺ?ĺ?ĸ?ĸ?ķ?ķ?ĵ?ĵ?Ĵ?ĵ?ij?IJ?Ĵ?Ķ??????????????????????????????????? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\AAH@ :@ԛ@;@@}@j@>@0?ļ?? AAH@ :@ԛ@;@@}@j@>@0?ļ?? AAH@ :@ԛ@;@@}@j@>@0?Ľ?? AAH@ :@ԛ@;@@}@j@>@0?Ľ?? AAH@ :@ԛ@;@@}@j@>@0?Ľ?? AAH@ :@ԛ@;@@}@j@>@1?Ľ?? AAH@ :@ԛ@;@@}@j@>@1?ľ?? AAH@ :@ԛ@;@@}@j@>@1?ľ?? AAH@ :@ԛ@;@@}@j@>@1?ľ?? AAH@ :@ԛ@;@@}@j@>@1?ľ?? AAH@ ;@ԛ@;@@}@j@>@1?Ŀ?? AAH@ ;@ԛ@;@@}@j@>@2?Ŀ?? AAH@ ;@ԛ@;@@}@j@>@2?Ŀ?? AAH@ ;@ԛ@;@@}@j@>@2??? AAH@ ;@ԛ@;@@}@j@>@2??? AAH@ ;@ԛ@;@@}@j@>@2??? AAH@ ;@ԛ@;@@}@j@>@2??? AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAH@ 8@ 9@ 7@ 8@ 7@ 8@ 8@ 8@ 8@ 8@ 9@ 9@ 9@ 9@ :@ :@ :@ :@ ;@ ;@ <@ ;@ <@ <@ =@ <@ =@ =@ =@ =@ >@ =@ =@ <@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@+@-@*@+@+@+@+@,@,@-@-@.@/@/@0@0@1@1@2@2@4@4@5@5@6@6@7@7@7@7@8@8@7@6?Ĵ?ķ?ij?Ĵ?ij?Ĵ?ĵ?ĵ?Ķ?ķ?ĸ?ĸ?ĺ?ĺ?ļ?ļ?ľ?ľ??????????????????????????????????????????????????? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\AAAAAAAAAAAAHAHAHAHAHAHAHAHAHAHAH@ ;@ ;@ ;@ ;@ :@ :@ :@ :@ :@ :@ :@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@;@;@;@;@;@;@;@;@;@;@;@@@@@@@@@@@@}@}@}@}@}@}@}@}@}@}@}@j@j@j@j@j@j@j@j@j@j@j@>@>@>@>@>@>@>@>@>@>@>@2@2@2@2@1@1@1@1@0@0@0???Ŀ?Ŀ?Ŀ?ľ?ľ?Ľ?Ľ?Ľ?ļ???????????? ? ? ? ? ? ? ? ? ? ? AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAH@ :@ :@ :@ :@ :@ :@ :@ ;@ ;@ ;@ ;@ ;@ ;@ ;@ ;@ ;@ ;@ :@ :@ :@ :@ :@ :@ :@ :@ :@ ;@ ;@ ;@ ;@ :@ :@ :@ :@ :@ :@ :@ :@ :@ :@ :@ :@ ;@ ;@ ;@ :@ :@ :@ :@ :@ ;@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@0@0@1@1@1@1@1@2@2@2@2@2@2@2@2@2@1@1@1@1@1@1@0@0@0@0@2@2@2@2@1@1@1@1@1@0@0@1@1@1@1@1@2@2@2@1@1@1@1@1@1?Ľ?Ľ?Ľ?ľ?ľ?ľ?Ŀ?Ŀ?Ŀ?Ŀ????Ŀ?Ŀ?Ŀ?Ŀ?ľ?ľ?ľ?ľ?Ľ?Ľ?Ľ?Ľ?Ľ?Ŀ?Ŀ?Ŀ?Ŀ?Ŀ?ľ?ľ?ľ?Ľ?Ľ?Ľ?Ľ?ľ?ľ?ľ?Ŀ?Ŀ?Ŀ?Ŀ?ľ?ľ?Ľ?ľ?ľ?Ŀ???????????????????????????????????????????????????? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\A"\AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAHAH@ ;@ ;@ ;@ ;@ :@ :@ :@ :@ :@ :@ :@ :@ :@ :@ :@ :@ :@ :@ :@ :@ ;@ ;@ ;@ ;@ ;@ ;@ :@ :@ :@ :@ :@ :@ :@ ;@ ;@ ;@ ;@ ;@ ;@ :@ :@ :@ :@ :@ :@ :@ :@ ;@ ;@ :@ :@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@ԛ@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@}@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@j@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@>@2@2@2@2@1@1@1@1@1@0@0@0@0@0@0@1@1@1@1@1@1@2@2@2@2@2@0@0@1@1@1@1@1@2@2@2@2@2@2@1@1@1@1@1@1@1@1@2@1@1@1??Ŀ?Ŀ?Ŀ?Ŀ?ľ?ľ?ľ?Ľ?Ľ?Ľ?Ľ?Ľ?Ľ?Ľ?Ľ?ľ?ľ?ľ?ľ?Ŀ?Ŀ?Ŀ?Ŀ???Ľ?Ľ?Ľ?ľ?ľ?ľ?Ŀ?Ŀ?Ŀ?Ŀ?Ŀ?Ŀ?Ŀ?Ŀ?ľ?ľ?ľ?Ľ?Ľ?ľ?ľ?Ŀ?Ŀ?ľ?ľ???????????????????????????????????????????????????? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq b\X;; ;;W\ b b\X;; b\X;; ;;;;;;;;XXXX\\\\ b b b b ;;W\ b;;W\ b;;X\ b;;X\ b;;X\ b;;X\ b;;X\ b;;X\ b;;X\ b;;X\ b;;X\ b;;X\ b;;X\ b;;X\ b;;X\ b;;X\ b;;X\ b b\X;; b\X;; b\X;; b\X;; b\X;; b\X;; b\X;; b\X;; b\X;; b\X;; b\X;; b\X;; b\X;; b\X;; b\X;; b\X;; b\X;; ;;;;;;;;XXXX\\\\ b b b b b c c c c c c c c c b b b b b b b b b b b b b b b b b b b b b b b b b b b b b c c c c c c c c b b b b b b b b c c c c c c b b b b b b b\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;X\ b;;X\ b;;X\ b;;X\ b;;X\ b;;X\ b;;X\ b;;X\ b;;X\ b;;X\ b;;X\ b;;X\ b;;X\ b;;X\ b;;X\ b;;X\ b;;X\ b ;;X\ b;;X\ b;;X\ b;;X\ b;;X\ b;;X\ b;;X\ b;;X\ b;;X\ b;;X\ b;;X\ b;;X\ b;;X\ b;;X\ b;;X\ b;;W\ b;;W\ b b b b b b b b c c c c c c c c b b b b b b b b b b b b b b b b b b b b b b b b b b b b b c c c c c c c c b b b b b b b b c c c c c c b b\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; xyzCUBIT1.11.2-2502/06/9614:45:48guacamolRev $Revision: 2.20 $97/03/2613:45:49salsaPrepared97/03/2613:45:49Salsa: Reacting flow code for MIMD machinessalsa: FEM Input file: em_7k.exoIINum unks: 0CPU time: 0.250000salsa: salsa: salsa: salsa: salsa:  e%"X6% e f$6XY8$ f g#8YZ:# g h":Z[<" h i!<[\>! i j >\]@ j k@]^B k lB^_D l mD_`F m nF`aH n oHabJ o pJbcL p qLcdN q rNdeP r sPefR s tRfgT t uTghV uVh v e"#iX u whj x v#$ki w yjl z x$%mk y {ln z%m z |mo | }op } ~p q ~ q  r  r s  st   tu   uv   vw   wx   xy  yz  z{  { |  | "}  {}"$n {sn$ e v fXi~Y f gY~Z g hZ[ h i[\ i j\] j k]^ k l^_ l m_` m n`a n oab o pbc p qcd q rde r sef s tfg t w ugjh v x ik~ ~              y wlj x z | kmo | } op } ~ pq ~  qr  rs st tu uv vw wx xy yz z{ {| |} { y}nl"X676XY8798YZ:9;:Z[<;=<[\>=?>\]@?A@]^BACB^_DCED_`FEGF`aHGIHabJIKJbcLKMLcdNMONdePOQPefRQSRfgTSUTghVUWVhW"#iXhj#$ki jl$%mk !ln%m!moopp q q  r  r s  st tuuvvwwxxyyzz{{ || "}!}"$n!#n$#Xi~YY~ZZ[[\\]]^^__``aabbccddeeffggjhik~~ljkmooppqqrrssttuuvvwwxxyyzz{{||}}nl7579549;43;=32=?21?A10AC0/CE/.EG.-GI-,IK,+KM+*MO*)OQ)(QS('SU'&UW&%W%  !!      !!##                      !!""##  !!""## ! 5 " 4 5!  4"#!!"$%#!.$&'%.; &()';H  (*+)HU  *,-+Ub  ,./-bo   .0!1/o|  "02#!31|"$24%#53$&46'%75&(68)'97(*x8:+);9*,kx:<-+=;,.^k<>/-?=.0Q^>@1/A?02DQ@B 1 A 21 BA  2 DB $"!#&$#%(&%'*('),*)+.,+- 0.-/" !20/1$"!#4213&$#%6435(&%'8657*('):879,*)+<:9;.,+-><;=0.-/@>=?20/1B@?A! 5C 3 5!" 4 3CD 2 4" 2D !#!"EC"$DF!.%#"/GE$&FH.;'%/<IG&(HJ;H)'<IKI(*JLHU+)IVMK*,LNUb-+VcOM,.NPbo/-cpQO.0PRo|1/p}SQ02RT|31}US24TV53WU46VX75YW68XZ97[Y8:xZ\y;9][:<kx\^ly=;_]<>^k^`_l?=a_>@Q^`bR_A?ca@BDQbdER A cA  Bc  dB  Dd  E!#$"CEFD#%&$EGHF%'(&GIJH')*(IKLJ)+,*KMNL+-.,MOPN-/0.OQRP/120QSTR1342SUVT3564UWXV5786WYZX79:8Y[\Z9;<:[]^\;=><]_`^=?@>_ab`?AB@acdbC 3~e 1 3CD 2 1ef 0 2D 0f "EC#geDFfh "/GE#0igFHhj /<IG0=kiHJjl<IKI=JmkJLlnIVMKJWomLNnpVcOMWdqoNPprcpQOdqsqPRrtp}SQq~usRTtv}US~wuTVvxWUywVXxzYW{yXZz|[Y}{Z\y|~z][}\^ly~mz_]^`_l`ma_`bR_S`cabdERFS c c  d  d  E  FCEFDeghfEGHFgijhGIJHikljIKLJkmnlKMNLmopnMOPNoqrpOQRPqstrQSTRsuvtSUVTuwxvUWXVwyzxWYZXy{|zY[\Z{}~|[]^\}~]_`^_ab`acdb~e 1} / 1ef 0 / . 0f . #ge$fh  #0ig$1hj  0=ki1>jl=Jmk>KlnJWomKXnpWdqoXeprdqsqerrtq~usrtv~wuvxywxz{yz|}{|~z{}~mzn{`manS`TaFSGT        F  Geghfgijhikljkmnlmopnoqrpqstrsuvtuwxvwyzxy{|z{}~|}~} /| - / . - , . , $%  $1%2  1>2?>K?LKXLYXeYferfsrs{|n{o|anboTaUbGTHU        G  H| -{ + - , + * , * %&  %2&3  2?3@?L@MLYMZYfZgfsgtst|}o|p}bocpUbVcHUIV        H  I{ +z ) + * ) ( * ( &'  &3'4  3@4A@MANMZN[Zg[hgthutu}~p}q~ cp dq  Vc  Wd  IV JW        I J         z )y ' ) ( ' & ( & '( '4(5 4A5BANBON[O\[h\ihuivuv ! "#!"$%#$&'%~&()'q~(*r +) dq*,er  -+  Wd,.Xe  /- JW.0KX   / / 0 J0 K !" !#$"#%&$%'(&')*(  )+,*    +-.,   -/0.y 'x1 % ' & %12 $ & $2 ()3124(5)653465B6C7568BOCP978:O\P];9:<\i]j=;<>ivjw?=>@vwA? @B!CA "BD#!EC"$DF%#GE$&FH'%IG&(HJ)'KI(*rJLs+)MK*,erLNfs-+OM,.XeNPYf/-QO.0KXPRLY / Q/ 0Q  R0 KR L13423564578679:89;<:;=><=?@> ?AB@!" ACDB!#$"CEFD#%&$EGHF%'(&GIJH')*(IKLJ)+,*KMNL+-.,MOPN-/0.OQRPx1 %wS # %12 $ #ST " $2 "T )31*US24TV)653*7WU46VX6C757DYW68XZCP97DQ[Y8:Z\P];9Q^][:<\^]j=;^k_]<>^`jw?=kxa_>@`bwA?xca@BbdCAecBDdfECgeDFfhGEigFHhjIGkiHJjlKImkJLslntMKomLNfsnpgtOMqoNPYfprZgQOsqPRLYrtMZ Q sQ  Rs  tR Lt  M1342SUVT3564UWXV5786WYZX79:8Y[\Z9;<:[]^\;=><]_`^=?@>_ab`?AB@acdbACDBcefdCEFDeghfEGHFgijhGIJHikljIKLJkmnlKMNLmopnMOPNoqrpOQRPqstrwS #vu ! #ST " !uv "T v *US+wuTVvx*7WU+8ywVXxz7DYW8E{yXZz|DQ[YER}{Z\|~Q^][R_}\^~^k_]_l^`kxa_ly`bxcaybdecdfgefhighjkijlmklntuomnpgthuqoprZg[hsqrtMZN[ s s  t  t  M  NSUVTuwxvUWXVwyzxWYZXy{|zY[\Z{}~|[]^\}~]_`^_ab`acdbcefdeghfgijhikljkmnlmopnoqrpqstrvu !u  !uv   v  +wu,vx+8yw,9xz8E{y9Fz|ER}{FS|~R_}S`~_l`mlymzyzuvhuiv[h\iN[O\        N  Ouwxvwyzxy{|z{}~|}~u t         , - ,9-:9F:GFSGTS`Ta`manmzn{z{vwivjw\i]jO\P]       O  Pt  s       3  - 43-:54:G65GT76Ta87an 98n{  :9{  ;:  <;  =< >=?>w@?jwA@]jBAP]CB      P C F GFHGIHJIKJLKMLNMONPO D PQD^Qk^xkx           F QFGQRGHRSHISTIJT UJKU  VKLV  WLMW  XMNX  YNOY ZOPZ[PD [E DQERQ^R_^k_lkxlyxy  !!!""##$$%%&&'''(()))**++,  ,-  -.  ./  /0  0! 1"#2%$%23&)(4**45++53,,32--26..67//71001 &4('354&"62#176" Q 8\QR\89]RS]9:^ST^:;_T U_;<`U  V`<=aV  Wa=>bW  Xb>?cX  Yc?@dY Zd@AeZ[eABf[E fBF ERFBCSR_SCD`_l`DEmlymEFzyzFGGHHIIJJKKLLMMNNOOPPQ  Q8BARC CRSD !DSTE!FETG!"GTUH"#HUVI#$IVWJ$%JWXK%&KXYL&'LYZM'NMZO'(OZ[P()P[\Q)Q\98)*9\]:*+:]^;+, ;^_< ,- <_`= -. =`a> ./ >ab? /0 ?bc@ 0@cRA! 1"TSdU#2%$VeXW%23&XefY)(4*\[g]*45+]gh^+53,^hf_,32-_fe`-26.`eia.67/aijb/710bjdc01 cdSR&4('Yg[Z354&fhgY"62#UieV176"djiU 8\ kg\89]gklh]9:^hlmi^:;_imnj_;<`jnok`<=akopla=>blpqmb>?cmqrnc?@dnrsod@AeostpeABfptuqfBF quG FBCSGuvTSCD`Tvwa`DEmawxnmEFznxy{zFG{yzGHz{HI{|IJ|}JK}~KL~LMMNNOOPPQ   Q8 kBARCutvCRSDvwDSTEwxFETGyxzGTUHz{HUVI{|IVWJ|}JWXK}~KXYL~LYZMNMZOOZ[PP[\QQ\98lk9\]:lm:]^;mn;^_<no<_`=op=`a>pq>ab?qr?bc@rs@cRAstTSdUVeXWXefY\[g]]gh^^hf__fe``eiaaijbbjdccdSRYg[ZfhgYUieVdjiU kg rgklhrshlmistimnjtujnokuvkoplvwlpqmwxmqrnxynrsoyzostpz{ptuq{|quG |H GuvTHUTvwaUbawxnbonxy{o|{yz|z{{||}}~~   k utvvwwxyxzz{{||}}~~lklmmnnooppqqrrsst r }rs}~st~tuuvvwwxxyyzz{{||H I HUIVUbVcbocpo|p}|}     } }~~          I J IVJWVcWdcpdqp}q~}~        !!""##$$%%&&&''((())**++,  ,-  -.  ./  /  0!"1$#$12%('3))34**42++21,,15--56..60//0%3'&243%!51"065!  778899::; ;<  <=  =>  >?  ?@ @AJ AK JWKABXWdXBCedqeCDrq~rDE~EFFGGHHIIJJKKLLMMNNO OP P7 A@QBBQRC CRSD EDSF !FSTG!"GTUH"#HUVI#$IVWJ$%JWXK%&KXYL&MLYN&'NYZO'(OZ[P(P[87()8[\9)*9\]:*+:]^;+, ;^_< ,- <_`= -. =`a> ./ >ab? / ?bQ@ 0!SRcT"1$#UdWV$12%WdeX('3)[Zf\)34*\fg]*42+]ge^+21,^ed_,15-_dh`-56.`hia.60/aicb/0bcRQ%3'&XfZY243%egfX!51"ThdU065!cihT 7 j78jk89kl9:lm:;mn;<no<=op=>pq>?qr?@rs@AstAK tL KABXLtuYXBCeYuvfeCDrfvwsrDEswxEFxyFGyzGHz{HI{|IJ|}JK}~KL~LMMNNOOPP7jA@QBtsuBQRCuvCRSDvwEDSFxwyFSTGyzGTUHz{HUVI{|IVWJ|}JWXK}~KXYL~MLYNNYZOOZ[PP[87kj8[\9kl9\]:lm:]^;mn;^_<no<_`=op=`a>pq>ab?qr?bQ@rsSRcTUdWVWdeX[Zf\\fg]]ge^^ed__dh``hiaaicbbcRQXfZYegfXThdUcihT j jkkllmmnnooppqqrrssttL M LtuYMZYuvfZgfvwsgtswxtxyyzz{{||}}~~jtsuuvvwxwyyzz{{||}}~~kjkllmmnnooppqqrrs  M N MZN[Zg[hgthutu           N  O N[O \[h\ihuivuv    !!""##$$%%%&&'''(())**++,  ,-  -.  . / !0#"#01$'&2((23))31**10++04,,45--5/../$2&%132$ 40!/54   66778899::; ;<  <=  =>  >?  ?@ O @P O \P@A]\i]ABjivjBCwvwCDDEEFFGGHHIIJJKKLLMMNNOO6   @?PAAPQBBQRCDCRE ERSF !FSTG!"GTUH"#HUVI#$IVWJ$%JWXK%LKXM%&MXYN&'NYZO'OZ76'(7Z[8()8[\9)*9\]:*+:]^;+, ;^_< ,- <_`= -. =`a> . >aP?/ RQbS!0#"TcVU#01$VcdW'&2(ZYe[(23)[ef\)31*\fd]*10+]dc^+04,^cg_,45-_gh`-5/.`hba./abQP$2&%WeYX132$dfeW 40!SgcT/54 bhgS  6 3i;67;ij<78<jk=89=kl>9:>lm?:;?mn@;<@noA<=AopB=>BpqC>?CqrD?@DrsE@P EsC P@A]CstB]ABjBtuAjBCwAuv@wCD@vw?DE?wx>EF>xy=FG=yz<GH<z{;HI;{|:IJ:|}9JK9}~8KL8~7LM76MN65NO54O6 4i3@?PAsrtAPQBtuBQRCuvDCREwvxERSFxyFSTGyzGTUHz{HUVI{|IVWJ|}JWXK}~LKXM~MXYNNYZOOZ76ji7Z[8jk8[\9kl9\]:lm:]^;mn;^_<no<_`=op=`a>pq>aP?qrRQbSTcVUVcdWZYe[[ef\\fd]]dc^^cg__gh``hbaabQPWeYXdfeWSgcTbhgSsfsYfLY ?L 2? 2                             |    o  | b  oU  bH  U;  H.  ;!  .  !                      !  " ! # " $ # %  $   % &    '   & (   ' )   ( *   ) +   * ,   + -   , .   - /  . 0 ! / 1 " ! 0 2 # " 1 3 $ # 2 4 % $ 3   % 4  &   ' &  ( '  ) (   * )   + *    , +    - ,    . -   / .   0 /   1 0   2 1   3 2   4 3    4  5 5 6 6 7 7 8 8 9 9 : : ; ; < < = = > > ?s ? @rsfr @ AefYe A BXYLX B CKL ?K C D>? 2> D E12 1 E  F 5   E G   H F   G I   J H   I K  J   J L  L M  M N  N O  O P  P Q   Q R |  R} S |o  S}p T ob  Tpc U bU  UcV V UH  VVI W H;  WI< X ;.  X</ Y .!  Y/" Z !  Z" K  K   5 F [ 6   6 [ \ 7   7 \ ] 8   8 ] ^ 9   9 ^ _ :   : _ ` ;   ; ` a <   < a b =   = b c >   > c d ? ! ? d e @ ! " @ e f A " # A f g B # $ B g h C $ % C h i D %   D i G E   &  F H j [  & '  [ j k \  ' (  \ k l ]  ( )  ] l m ^  ) *  ^ m n _  * +  _ n o `  + ,  ` o p a  , -  a p q b  - .  b q r c  . / c r s d / 0 ! d s t e ! 0 1 " e t u f " 1 2 # f u v g # 2 3 $ g v w h $ 3 4 % h w x i % 4   i x I G    & H J L j &  ' j L M k ' ( k M N l ( ) l N O m ) * m O P n * + n P Q o +  , o Q R p ,   - p R S q -   . q S T r .   / r T U s /   0 s U V t 0   1 t V W u 1   2 u W X v 2   3 v X Y w 3   4 w Y Z x 4    x Z K I 5 y 5 6 y z 6 7 z { 7 8 { | 8 9 | } 9 : } ~ : ; ~  ; <   < =  = >  > ? ~ ? @r~ qr @ Aeq de A BXd WX B CKW JK C D>J => D E1= 01 E0  F 5 y E G  H F G I  J H I K  J J L  L M  M N  N O  O P  P Q  Q R  R} S ~ S}p T ~q Tpc U qd UcV V dW VVI W WJ WI< X J= X</ Y =0 Y/" Z 0# Z" K # K ~ 5 F [ 6 y z 6 [ \ 7 z { 7 \ ] 8 { | 8 ] ^ 9 | } 9 ^ _ : } ~ : _ ` ; ~  ; ` a <  < a b = = b c > > c d ? ? d e @ @ e f A A f g B B g h C C h i D D i G E F H j [ [ j k \ \ k l ] ] l m ^ ^ m n _ _ n o ` ` o p a a p q b b q r c c r s d d s t e e t u f f u v g g v w h h w x i i x I G H J L j j L M k k M N l l N O m m O P n n P Q o o Q R p p R S q q S T r r T U s s U V t t V W u u W X v v X Y w w Y Z x x Z K I  y  y z  z {  { |  | }  } ~  ~          ~ }~ q} pq dp cd Wc VW JV IJ =I <= 0< /0 /  y                     ~  ~q r qd re dW eX WJ XK J= K> =0 >1 0# 1$ # $ ~ } y z z { { | | } } ~ ~                                } |} p| op co bc Vb UV IU  HI <H  ;< /;  ./ .                                           r s re sf ! eX !fY " XK "YL # K> #L? $ >1 $?2 % 1$ %2% & $ &%  } |   '   ' (   ( )   ) *   * +   + ,   , -   - . . / / 0 0 1 1 2 2 3   3 4   4 5   5     6 ' ' 6 7 ( ( 7 8 ) ) 8 9 * * 9 : + + : ; , , ; < - - < = . . = > / / > ? 0 0 ? @ 1 1 @ A 2 2 A B 3 3 B C 4 4 C D 5 5 D      6 6   7 7   8 8   9 9   : :   ; ;   < <   = =  > > ! ? ? ! " @ @ " # A A # $ B B $ % C C % & D D &    E   E F   F G   G H   H I   I J   J K   K L   L M  M N | N O{| o{ O Pno bn P Qab Ua Q RTU  HT R SGH  ;G S T:;  .: T U-. - U   V E   U W   X V   W Y   Z X   Y [  Z   Z \   \ ]   ] ^   ^ _   _ `   ` a   a b   b c s ct d sf ! dtg e !fY " egZ f "YL # fZM g #L? $ gM@ h $?2 % h@3 i %2% & i3& j &%  j& [ | [{   '  E V k F  ' (  F k l G  ( )  G l m H  ) *  H m n I  * +  I n o J  + ,  J o p K  , -  K p q L  - . L q r M . / M r s N / 0 N s t O 0 1 O t u P 1 2 P u v Q 2 3  Q v w R  3 4  R w x S  4 5  S x y T  5   T y W U   6 ' V X z k ' 6 7 ( k z { l ( 7 8 ) l { | m ) 8 9 * m | } n * 9 : + n } ~ o + : ; , o ~  p , ; < - p  q - < = . q r . = > / r s / > ? 0 s t 0 ? @ 1 t u 1 @ A 2 u v 2 A B 3 v w 3 B C 4 w x 4 C D 5 x y 5 D   y Y W    6 X Z \ z 6   7 z \ ] { 7   8 { ] ^ | 8   9 | ^ _ } 9   : } _ ` ~ :   ; ~ ` a  ;   <  a b <   = b c =  > c d > ! ? d e ? ! " @ e f @ " # A f g A # $ B g h B $ % C h i C % & D i j D &   j [ Y E  E F  F G  G H  H I  I J  J K  K L  L M  M N  N O{ z{ O Pnz mn P Qam `a Q RT` ST R SGS FG S T:F 9: T U-9 ,- U,  V E U W  X V W Y  Z X Y [  Z Z \  \ ]  ] ^  ^ _  _ `  ` a  a b  b c  ct d u dtg e uh egZ f h[ fZM g [N gM@ h NA h@3 i A4 i3& j 4' j& [ ' [{ z E V k F F k l G G l m H H m n I I n o J J o p K K p q L L q r M M r s N N s t O O t u P P u v Q Q v w R R w x S S x y T T y W U V X z k k z { l l { | m m | } n n } ~ o o ~  p p  q q r r s s t t u u v v w w x x y y Y W X Z \ z z \ ] { { ] ^ | | ^ _ } } _ ` ~ ~ ` a   a b b c c d d e e f f g g h h i i j j [ Y                      z yz my lm `l _` S_ RS FR EF 9E 89 ,8 +, +                         u v uh vi h[ i\ [N \O NA OB A4 B5 4' 5( ' ( z y                                                                           y  xy lx  kl _k  ^_ R^  QR EQ  DE 8D  78 +7 !*+ * !  "  ! #  $ " # %  & $ % '  &  & (  ( )  ) *  * +  + ,  , -  - .  . / v /w 0 vi 0wj 1 i\ 1j] 2 \O 2]P 3 OB 3PC 4 B5 4C6 5 5( 56) 6 ( 6) ' y 'x  " 7   7 8   8 9   9 :   : ;   ; <   < =   = >   > ?   ? @   @ A   A B   B C   C D    D E  E # !  " $ F 7   7 F G 8   8 G H 9   9 H I :   : I J ;   ; J K <   < K L =  = L M > > M N ? ? N O @ @ O P A A P Q B  B Q R C   C R S D    D S T E   E T % #  $ & ( F   F ( ) G   G ) * H   H * + I   I + , J   J , - K   K - . L  L . / M M / 0 N N 0 1 O O 1 2 P P 2 3 Q  Q 3 4 R   R 4 5 S   S 5 6 T  T 6 ' %  U   U V   V W   W X   X Y   Y Z   Z [   [ \   \ ]   ] ^  x ^ _wx  kw _ `jk  ^j ` a]^  Q] a bPQ  DP b cCD  7C c d67 !*6 d e)* !) e "  f U ! # e g $ " h f # % g i & $ j h % ' i k & j & ( j l ( ) l m ) * m n * + n o + , o p , - p q - . q r . / r s /w 0 sx t 0wj 1 txk u 1j] 2 uk^ v 2]P 3 v^Q w 3PC 4 wQD x 4C6 5 xD7 y 56) 6 y7* z 6) ' z* k 'x kw  " 7  U f { V  7 8  V { | W  8 9  W | } X  9 :  X } ~ Y  : ;  Y ~  Z  ; <  Z  [  < =  [ \  = >  \ ]  > ?  ] ^  ? @  ^ _  @ A  _ `  A B  ` a  B C  a b  C D  b c  D E c d E # ! d g e " $ F 7 f h { 7 F G 8 { | 8 G H 9 | } 9 H I : } ~ : I J ; ~  ; J K <  < K L = = L M > > M N ? ? N O @ @ O P A A P Q B B Q R C C R S D D S T E E T % # i g $ & ( F h j l F ( ) G l m G ) * H m n H * + I n o I + , J o p J , - K p q K - . L q r L . / M r s M / 0 N s t N 0 1 O t u O 1 2 P u v P 2 3 Q v w Q 3 4 R w x R 4 5 S x y S 5 6 T y z T 6 ' % z k i U  U V  V W  W X  X Y  Y Z  Z [  [ \  \ ]  ] ^  ^ _w vw _ `jv ij ` a]i \] a bP\ OP b cCO BC c d6B 56 d e)5 () e(  f U e g  h f g i  j h i k  j j l  l m  m n  n o  o p  p q  q r  r s  sx t y txk u yl uk^ v l_ v^Q w _R wQD x RE xD7 y E8 y7* z 8+ z* k + kw v U f { V V { | W W | } X X } ~ Y Y ~  Z Z  [ [ \ \ ] ] ^ ^ _ _ ` ` a a b b c c d d g e f h { { | | } } ~ ~   i g h j l l m m n n o o p p q q r r s s t t u u v v w w x x y y z z k i                      v uv iu hi \h [\ O[ NO BN AB 5A 45 (4 '( '                         y z yl zm l_ m` _R `S RE SF E8 F9  8+ 9,  + , v u                                                                                                       !  ! "  " #  # $  $ %  % &  & '  ' (  ( )  ) * u * +tu ht + ,gh [g , -Z[ NZ - .MN AM . /@A 4@ / 034 '3 0 1&' & 1  2 ! 1 3  4 2 3 5  6 4 5 7  6  6 8  8 9  9 :  : ;  ; <  < =  = >  > ? z ?{ @ zm @{n A m` Ana B `S BaT C SF CTG D F9  DG: E 9,  E:- F , F- 7 u 7 t  ! 2 G "   " G H #   # H I $   $ I J %   % J K &   & K L '  ' L M ( ( M N ) ) N O * * O P + + P Q ,  , Q R -   - R S .   . S T /   / T U 0  0 U 3 1   2 4 V G     G V W H     H W X I     I X Y J     J Y Z K     K Z [ L    L [ \ M   M \ ] N   N ] ^ O   O ^ _ P   P _ ` Q    Q ` a R     R a b S     S b c T    T c d U  U d 5 3  4 6 8 V   V 8 9 W   W 9 : X   X : ; Y   Y ; < Z   Z < = [   [ = > \   \ > ? ]   ] ? @ ^   ^ @ A _   _ A B `   ` B C a   a C D b    b D E c    c E F d  d F 7 5 ! e% ! "% e f$ " #$ f g# # $# g h" $ %" h i! % &! i j  & ' j k ' ( k l ( ) l m ) * m n * +t n ot + ,g o pg , -Z p qZ - .M q rM . /@ r s@ / 03 s t3 0 1& t u& 1 u 2 ! v e 1 3 u w 4 2 x v 3 5 w y 6 4 z x 5 7 y { 6 z 6 8 z | 8 9 | } 9 : } ~ : ; ~  ; <  < =  = >   > ?   ?{ @   @{n A   Ana B   BaT C  CTG D  DG: E  E:- F  F- 7  { 7 t {s ! 2 G " e v f " G H # f g # H I $ g h $ I J % h i % J K & i j & K L ' j k ' L M ( k l ( M N ) l m ) N O * m n * O P + n o + P Q , o p , Q R - p q - R S . q r . S T / r s / T U 0 s t 0 U 3 1 t w u 2 4 V G v x G V W H H W X I I X Y J J Y Z K K Z [ L L [ \ M M \ ] N N ] ^ O O ^ _ P P _ ` Q Q ` a R R a b S S b c T T c d U U d 5 3 y w 4 6 8 V x z | V 8 9 W | } W 9 : X } ~ X : ; Y ~  Y ; < Z  Z < = [ [ = > \ \ > ? ] ] ? @ ^ ^ @ A _ _ A B ` ` B C a a C D b b D E c c E F d d F 7 5 { y%S8899::;;<<==>>??@@AABBCCDDE  EFFGGHH47SRI8HJ54RQKIJL65QPMKLN76P/iMMinOOnsPPsxQQx}RR}SSTTUUVVWWXXYYZZ[[\\]]NN178I^99^_::_`;;`a<<ab==bc>>cd??de@@efAAfgBBghCChiDDijEEjkFFklGGlJHIKm^^mn__no``opaapqbbqrccrsddsteetuffuvggvwhhwxiixyjjyzkkz{ll{LJKMOmmOPnnPQooQRppRSqqSTrrTUssUVttVWuuWXvvXYwwYZxxZ[yy[\zz\]{{]NL%S8&O|89|}9:}~:;~;<<==>>??@@AABBCCDDE   EF FGGHH4708SRI8ON|HJ5410RQKINMJL6521QPMKMLLN7632P/iML.hMinOhmOnsPmrPsxQrwQx}Rw|R}S|STTUUVVWWXXYYZZ[[\\]]NN17238I^9|}9^_:}~:_`;~;`a<<ab==bc>>cd??de@@efAAfgBBghCChiDDijEEjkFFklGGlJHIKm^^mn__no``opaapqbbqrccrsddsteetuffuvggvwhhwxiixyjjyzkkz{ll{LJKMOmmOPnnPQooQRppRSqqSTrrTUssUVttVWuuWXvvXYwwYZxxZ[yy[\zz\]{{]NL&O|'K|}}~~    08,9ON|KJ10-,NMJI21.-MLIH32/.L.hH-ghmglmrlqrwqvw|v{|{233/|}}~~'K(G              ,9(:KJGF-,)(JIFE.-*)IHED/.+*H-gD,fglfklqkpqvpuv{uz{z  !!""##$$%%&&''(())3/4+**++,,--.  ./  /0  01  12  23344556677889**9:++:;,,;<--<=..=>//>?00?@11@A22AB33BC44CD55DE66EF77FG88G99::;;<<== >> !??!"@@"#AA#$BB$%CC%&DD&'EE'(FF()GG)(G)CHHIIJJKKL LM  MN  NO  OP  PQ QRRS ST   TUUVVWWX(:X$;GFCBYH)(XZ%$FEBA[Y*)Z\&%EDA@][+*\^'&D,f@+e]fk]ej_kp_jo`pu`otauzatybzby~c c~d !de!"ef"#fg#$gh$%hi%&ij&'jk'(kl()lm)m^4+^5'*HYnI*+InoJ+,JopK,-KpqL-. LqrM ./ MrsN /0 NstO 01 OtuP 12 PuvQ 23QvwR34RwxS45SxyT56TyzU67Uz{V78V{|W8W|ZX9*Y[}n*9:+n}~o+:;,o~p,;<-pq-<=.qr.=>/rs/>?0st0?@1tu1@A2uv2AB3vw3BC4wx4CD5xy5DE6yz6EF7z{7FG8{|8G|\Z9[]_}9:}_`~:;~`a;<ab<=bc= >cd> !?de?!"@ef@"#AfgA#$BghB$%ChiC%&DijD&'EjkE'(FklF()GlmG)m^\)CH$<HIIJJKKLLMMNNOOPPQQRRSST  TUUVVWWXX$;#6CBYH<=XZ%$"#BA[Y=>Z\&%!"A@][>?\^'& !@+e]?*T]ej_TU_jo`UV`otaVWatybWXby~cXYc~dYZdeZ[ef[\fg\]gh]^hi^_ij_`jk`aklablmbcm^cd^5'd0 HYnIInoJJopKKpqLLqrMMrsNNstOOtuPPuvQQvwRRwxSSxyTTyzUUz{VV{|WW|ZXY[}nn}~oo~ppqqrrssttuuvvwwxxyyzz{{||\Z[]_}}_`~~`aabbccddeeffgghhiijjkkllmm^\k&kl&'lm'(mn()no)*op*+pq+,qr,-rs-.st./ tu /0 uv 01vw12wx23xy34yz45z{56{6"|k7&{}68#"~|97}8:$#~;9:<%$s;;==>>??@@AABBCCDDEEFFGGHHIIJJKK<<%k|l&7L'lm'LM(mn(MN)no)NO*op*OP+pq+PQ,qr,QR-rs-RS.st.ST/tu/TU0uv0UV1vw1VW2wx2WX3xy3XY4yz4YZ5z}{5Z86|~79[LL[\MM\]NN]^OO^_PP_`QQ`aRRabSSbcTTcdUUdeVVefWWfgXXghYYhiZ}Zi:8~9;=[[=>\\>?]]?@^^@A__AB``BCaaCDbbDEccEFddFGeeGHffHIggIJhhJKiiK<:&j&'jk'(kl()lm)*mn*+no+,op,-pq-.qr ./  rs  /0  st  01 tu12uv23vw34wx45xy56yz6"z7&{j68#"z|97}{8:$#|~ ;9}:<%$~! ;;==>>??@@AABBCCDDEEFFGGHHIIJJKK<<%!&7L'j{k'LM(kl(MN)lm)NO*mn*OP+no+PQ,op,QR-pq-RS.qr.ST/rs/TU0st0UV1tu1VW2uv2WX3vw3XY4wx4YZ5xy5Z86y|z79[L{}L[\MM\]NN]^OO^_PP_`QQ`aRRabSSbcTTcdUUdeVVefWWfgXXghYYhiZZi:8~|9;=[}[=>\\>?]]?@^^@A__AB``BCaaCDbbDEccEFddFGeeGHffHIggIJhhJKiiK<:~jjkkllmmnnooppqqr  rs  st  tuuvvwwxxyyzz{jz|}{|~ }~! !j{kkllmmnnooppqqrrssttuuvvwwxxyy|z{}~|}~ $  %  $  % &$  %'  (&  ') !*( )+ !",* +- "#.,} -/ #$0.}p /1 $%20pc 13 %&42cV 35 &'64VI 57 '(86I< 79 ():8</ 9; )*<:/" { ;= *+><" n {=? +,@> a n?A ,-B@ T aAC -.DB G TCE . 5D 4ED 5 GE 4 '%$& )'&( +)(* -+*, /-,. 1/.0 3102 5324 7546 9768 ;98: =;:< ?=<> A?>@ CA@B ECBD$ F  $%  FG  % G &$HF%' GI (&JH')  IK  *(LJ)+ KM ,*NL+- MO }.,|PN-/ OQ }p0.|oRP/1 QS pc20obTR13 SU cV42bUVT35 UW VI64UHXV57 WY I<86H;ZX79 Y[ </:8;.\Z9; [] /"<:.!^\;= { ]_ | "><!`^=? n {_a o |@>b`?A a nac b oB@dbAC T ace U bDBfdCE G Teg H U 5D 3fD 5 4Ef 3 2gE 4 Gg 2 H$&'%FHIG&()'HJKI(*+)JLMK*,-+LNOM,./-NPQO.01/PRSQ0231RTUS2453TVWU4675VXYW6897XZ[Y8:;9Z\][:<=;\^_]<>?=^`a_>@A?`bca@BCAbdecBDECdfgeF h  FG  hi  G i HFjhGI ik JHljIK  km  LJnlKM mo NLpnMO oq |PN{rpOQ qs |oRP{ntrQS su obTRnavtSU uw bUVTaTxvUW wy UHXVTGzxWY y{ H;ZXG:|zY[ {} ;.\Z:-~|[] } .!^\- ~]_ |  } !`^ _a o | p }b`ac b o c pdbce U b V cfdeg H U I V 3f~ 1f 3 2g 1 0g 2 H 0 IFHIGhjkiHJKIjlmkJLMKlnomLNOMnpqoNPQOprsqPRSQrtusRTUStvwuTVWUvxywVXYWxz{yXZ[Yz|}{Z\][|~}\^_]~^`a_`bcabdecdfgeh   hi    i  jhik  ljkm   nlmo  pnoq  {rpzqs  {ntrzmsu  navtm`uw  aTxv`Swy  TGzxSFy{  G:|zF9{}  :-~|9,}  - ~, }  ~   p } q ~ c p d q V c W d I V J W~ 1} / 1 0 / . 0 I . Jhjkijlmklnomnpqoprsqrtustvwuvxywxz{yz|}{|~}~               zy  zmyl  m`l_  `S_R  SFRE  F9E8  9,8+  ,+ ~    q ~ r  d q e r W d X e J W K X} /| - / . - , . J , K             yx  ylxk  l_k^  _R^Q  REQD  E8D7  8+7*  +*    r  s  e r f s X e Y f K X L Y| -{ + - , + * , K * L           xw  xkwj  k^j]  ^Q]P  QDPC  D7C6  7*6)  *)    s   t    f s  g t  Y f  Z g L Y M Z{ +z ) + * ) ( * L ( M                    wv  wjvi  j]i\  ! ]P\O"  !# PCOB$" #% C6B5&$ %' 6)5((& ') )(*( )+  ,*  t +- u   .,  g t-/ h u 0.  Z g/1 [ h20 M Z13 N [z )y '2 ) (2 ' &3 ( M3 & N ! "#!"$%#$&'%&()' (*+)   *,-+    ,./-  .01/0231 4   45  5 64578679:8 9; <: ;= vu>< =? viuh@> ?A i\ h[B@! AC \O" [NDB!# CE OB$"NAFD#% EG B5&$A4HF%' GI 5((&4'JH') IK (*('LJ)+ KM ,* NL+- u MO v ., PN-/ h uOQ i v0.RP/1 [ hQS \ i20TR13 N [SU O \y '2x %T2 ' &3T % $U3 & NU $ O467568978:;9:<=;<>?=>@A? !@BCA "#!BDEC"$%#DFGE$&'%FHIG&()'HJKI(*+)JLMK*,-+LNOM,./-NPQO.01/PRSQ0231RTUS4 V  45 VW  5 W 64XV57WY 86ZX79Y[:8\Z9; [] <:^\;= ]_ u><t`^=? _a uh@>tgb`?A ac h[B@gZdbAC ce [NDBZMfdCE eg NAFDM@hfEG gi A4HF@3jhGI ik 4'JH3&ljIK km 'LJ&nlKM mo  NL pnMO v oq w  PN rpOQ i vqs j wRPtrQS \ isu ] jTRvtSU O \uw P ]x %Tw #vT % $Uv # "wU $ Ow " P4675VXYW6897XZ[Y8:;9Z\][:<=;\^_]<>?=^`a_>@A?`bca@BCAbdecBDECdfgeDFGEfhigFHIGhjkiHJKIjlmkJLMKlnomLNOMnpqoNPQOprsqPRSQrtusRTUStvwuV x  VW  xy  W y! XVzxWY y{!ZX|zY[{}\Z~|[] } ^\~]_  t`^s_a  tgb`sfac  gZdbfYce  ZMfdYLeg  M@hfL?gi  @3jh?2ik  3&lj2%km  &nl%mo   pn oq w  x  rp qs j w k xtrsu ] j ^ kvtuw P ] Q ^w #vv !v # "w ! w " P QVXYWxz{yXZ[Yz|}{Z\][|~}\^_]~^`a_`bcabdecdfgefhighjkijlmklnomnpqoprsqrtustvwux   xy    y! " zxy{!"|z{}~|}  ~  sr  sfre  fYeX  YLXK  L?K>  ?2>1  2%1$  %$     x  y    k x l y ^ k _ l Q ^ R _v !u  !    Q  Rxz{yz|}{|~}~      " # "#    ~  r~q  reqd  eXdW  XKWJ  K>J=  >1=0  1$0#  $#     y  z    l y m z _ l ` m R _ S `u t       R  S     #  6 # 7 6  8 7   9 8~  : 9~q  ; :qd  < ;dW  = <WJ  > =J=  ? >=0  @ ?0#  A @#  B A  z  C B  m z D C ` m E D S ` F Et s       S  F P  OP  NO  MN  LM  KL JKIJHIGHFG  G F  T G  a T  n a  { n  {                  !    ! "#"$#$%$&%'&(')(*)*+ *,! + !,-  ,.  -/  .0  /1 02132"38%$#('&45)(49-,+:.-95/.:40/5610472168327#"38+*)99)5:4&%66%87 P [PO[ ZONZ  YNMY  XMLX  WLKW  VKJV UJIUTIHTSHGSRGFRQF G Q H G T H U T a U b a n b o n { o | { |                     !   !""##$$$%%&&''(())***+  +,!!,  ,-  -.  ./  /0  0112233"$#4%&5('(56),+7--78..86//650059119:22:4334#")7+*687)%95&4:9% [ ;f[ Zf;<eZ  Ye<=dY  Xd=>cX  Wc>?bW  Vb?@aV Ua@A`UT`AB_TS_BC^SR^CD]RQ]DE\Q H \E I H U IEF V U b VFG c b o cGH p o | pHI } | }IJ  JK  KL  LM  MN  NO  OP  PQ  QR  RS  ! ST  ! T;"EDUF"#FUVG#$GVWH$IHWJ$%JWXK%&KXYL&'LYZM'(MZ[N()N[\O)*O\]P*QP]R*+ R]^S +,!S^_T!, T_<; ,- <_`= -. =`a> ./ >ab? /0 ?bc@ 01@cdA12AdeB23BefC3"CfUD$#4%WVgX&5('Yh[Z(56)[hi\,+7-_^j`-78.`jka.86/akib/650bihc0591chld19:2dlme2:43emgf34#"fgVU)7+*\j^]687)ikj\%95&XlhY4:9%gmlX ;f nqf;<eqnope<=dpopod=>copqnc>?bnqrmb?@amrsla@A`lstk`AB_ktuj_BC^juvi^CD]ivwh]DE\hwxg\E I gx J IEF V Jxy W VFG c Wyz d cGH p dz{ q pHI } q{| ~ }IJ ~|} JK }~ KL ~ LM  MN  NO  OP  PQ  QR  RS  ST   T; nEDUFxwyFUVGyzGVWHz{IHWJ|{}JWXK}~KXYL~LYZMMZ[NN[\OO\]PQP]RR]^SS^_TT_<;on<_`=op=`a>pq>ab?qr?bc@rs@cdAstAdeBtuBefCuvCfUDvwWVgXYh[Z[hi\_^j``jkaakibbihcchlddlmeemgffgVU\j^]ikj\XlhYgmlX nq |qnop|{popo{zopqnzynqrmyxmrslxwlstkwvktujvujuviutivwhtshwxgsrgx J r K Jxy W K X Wyz d X e dz{ q e r q{| ~ r  ~|}  }~  ~                 nxwyyzz{|{}}~~onoppqqrrssttuuvvw | |{{zzyyxxwwvvuutts~sr~}r K } L K X L Y X e Y f e r f s r  s                                ~~}} L  M L Y M Z Y f Z g f s g t s t                      !!""###$$%%&&''(()))**+  ++,  ,-  -.  ./  /0  01122!#"3$%4'&'45(+*6,,67--75..54//4800891193223"!(6*)576($84%398$  ::; ;<  <=  =>  >?  ?@ @AABBCCD M D N M Z NDE [ Z g [EF h g t hFG u t uGH  HI  IJ  JK  KL  LM  MN  NO  OP  PQ  QR RS S:!DCTE!"ETUF"#FUVG#HGVI#$IVWJ$%JWXK%&KXYL&'LYZM'(MZ[N()N[\O)PO\Q)*Q\]R*+ R]^S +S^;:+, ;^_< ,- <_`= -. =`a> ./ >ab? /0 ?bc@ 01@cdA12AdeB2!BeTC#"3$VUfW%4'&XgZY'45(Zgh[+*6,^]i_,67-_ij`-75.`jha.54/ahgb/480bgkc0891ckld1932dlfe23"!efUT(6*)[i]\576(hji[$84%WkgX398$flkW : m:;mn;<no<=op=>pq>?qr?@rs@AstABtuBCuvCDvwD N w O NDE [ Owx \ [EF h \xy i hFG u iyz v uGH vz{ HI {| IJ |} JK }~ KL ~ LM  MN  NO  OP  PQ  QR RSS:mDCTEwvxETUFxyFUVGyzHGVI{z|IVWJ|}JWXK}~KXYL~LYZMMZ[NN[\OPO\QQ\]RR]^SS^;:nm;^_<no<_`=op=`a>pq>ab?qr?bc@rs@cdAstAdeBtuBeTCuvVUfWXgZYZgh[^]i__ij``jhaahgbbgkccklddlfeefUT[i]\hji[WkgXflkW m  mnnooppqqrrssttuuvvww O  P Owx \ P ] \xy i ] j iyz v j w vz{ w {|  |}  }~  ~             m wvxxyyz{z||}}~~nmnooppqqrrssttuuv   ! P  Q P ] Q ^ ] j ^ k j w k x w x                     ! ! "           Q  R Q ^ R _ ^ k _ l k x l y x y                    !"  !!"""##$$%%&&''((())***++,  ,-  -.  ./  /0  011 "!2#$3&%&34'*)5++56,,64--43..37//780082112! '5)(465'#73$287# " #99::; ;<  <=  =>  >?  ?@ @AABBC R C S R _ SCD ` _ l `DE m l y mEF z y zFG  GH  HI  IJ  JK  KL  LM  MN  NO  OP  PQ  QR"R9# CBSD !DSTE!"ETUF"GFUH"#HUVI#$IVWJ$%JWXK%&KXYL&'LYZM'(MZ[N(ON[P()P[\Q)*Q\]R*R]:9*+:]^;+, ;^_< ,- <_`= -. =`a> ./ >ab? /0 ?bc@ 01@cdA1 AdSB"!2#UTeV$3&%WfYX&34'YfgZ*)5+]\h^+56,^hi_,64-_ig`-43.`gfa.37/afjb/780bjkc0821cked12! deTS'5)(Zh\[465'gihZ#73$VjfW287#ekjV #9 6lE9:ElmD:;DmnC;<CnoB<=BopA=>Apq@>?@qr??@?rs>@A>st=AB=tu<BC<uv;C S ;v F SCD ` Fvw E `DE m Ewx D mEF z Dxy C zFG Cyz B GH Bz{ A HI A{| @ IJ @|} ? JK ?}~ > KL >~ = LM = < MN < ; NO ; : OP : 9 PQ 9 8 QR 8 7R9# 7l 6CBSDvuwDSTEwxETUFxyGFUHzy{HUVI{|IVWJ|}JWXK}~KXYL~LYZMMZ[NON[PP[\QQ\]RR]:9ml:]^;mn;^_<no<_`=op=`a>pq>ab?qr?bc@rs@cdAstAdSBtuUTeVWfYXYfgZ]\h^^hi__ig``gfaafjbbjkcckeddeTSZh\[gihZVjfWekjV/0 /1 02 13 2(4 35(5 4B565OB76\O87i\98vi:9v;:<;=<>=?>?@/?P Q@ Pa  bQ  ar  .b -cb. ,dc-+ed,*fe+")gf*/"(hg)</'ih(I<&ji'VI%kj&cV$lk%pc#ml$}p"nm#}!on" po!qp rq r A0/@B10AC21BD32C E43D! F54E"!G65F#"H76G$#I87H%$J98I&%K:9J'&L;:K('M<;L)(N=<M*)O>=N+*P?>O +RA@Q, SBAR-,TCBS.-UDCT/ .VEDU0! /WFEV1"!0XGFW2#"1YHGX3$#2ZIHY4%$3[JIZ5&%4\KJ[6'&5]LK\7('6^ML]8)(7_NM^9*)8`ON_:+*9aPO`  +:cRQb,  dSRc-,eTSd.-fUTe/.gVUf0/hWVg10iXWh21jYXi32kZYj43l[Zk54m\[l65n]\m76o^]n87p_^o98q`_p:9ra`q  :;;<<==>(>?)(5)?@65B6@ACBOCABPO\PBC]\i]CDjivjDEwvwEFFGGHHIIJJKKL; KM NL  MO  PN  OQ P PRRSST"T!U"/U!.V/<V.;W<IW;HXIVXHUYVcYUbZcpZbo[p}[o|\}\|]]^^__` `Q Q;La<<ab==bc> >cd? !?de@!"@efA"#AfgB#$BghC$%ChiD%&DijE&'EjkF'(FklG()GlmH)*HmnI*+InoJ+ JoMK ,LNpa,-apqb-.bqrc./ crsd /0!dste!01"etuf"12#fuvg#23$gvwh$34%hwxi%45&ixyj&56'jyzk'67(kz{l(78)l{|m)89*m|}n*9:+n}~o+:  o~OM  ,NPRp,-pRSq-.qSTr./rTUs/0sUVt01tVWu12uWXv23vXYw34wYZx45xZ[y56y[\z67z\]{78{]^|89|^_}9:}_`~:  ~`QO;;<<==>>?)*)?@6*76@AC7DCABPDQPBC]Q^]CDj^kjDEwkxwEFxFGGHHIIJJKKL;KMNLMOPNOQP~PRRSSTT!U U!.V -V.;W-:W;HX:GXHUYGTYUbZTaZbo[an[o|\n{\|]{]^^__``QQ;La<<ab==bc>>cd??de@@efAAfgBBghCChiDDijEEjkFFklGGlmHHmnIInoJJoMKLNpaapqbbqrccrsddsteetuffuvggvwhhwxiixyjjyzkkz{ll{|mm|}nn}~oo~OMNPRppRSqqSTrrTUssUVttVWuuWXvvXYwwYZxxZ[yy[\zz\]{{]^||^_}}_`~~`QO*+*7+87D8EDQERQ^R_^k_lkxlyxy~}  -,-:,9:G9FGTFSTaS`an`mn{mz{z   +  ,+8,  98E9  FERF SR_S`_l`mlymzyz}|  !,!+",9"+8#9F#8E$FS$ER%S`%R_&`m&_l'mz'ly(z(y))**++,,--.  ./  /0  01  12  233445566778899::;;<--<=..=>//>?00?@11@A22AB33BC44CD55DE66EF77FG88GH99HI::IJ;;J<<== >> !??!"@@"#AA#$BB$%CC%&DD&'EE'(FF()GG)*HH*+II+,JJ,KKL LM  MN   , NO-,  9-OP:9  F:PQGF SGQRTS`TRSa`maSTnmznTU{z{UVVWWXXYYZZ[[\K[]^\]_`^_a|{``bbc cd !de!+"e*f"+8#f*7g#8E$g7Dh$ER%hDQi%R_&iQ^j&_l'j^kk'ly(kkxl(y)lxm)*mn*+no+,op,paa-K\qL-. LqrM ./ MrsN /0 NstO 01 OtuP 12 PuvQ 23QvwR34RwxS45SxyT56TyzU67Uz{V78V{|W89W|}X9:X}~Y:;Y~Z;Z][<-\^q-<=.qr.=>/rs/>?0st0?@1tu1@A2uv2AB3vw3BC4wx4CD5xy5DE6yz6EF7z{7FG8{|8GH9|}9HI:}~:IJ;~;J_]<^`b<=bc= >cd> !?de?!"@ef@"#AfgA#$BghB$%ChiC%&DijD&'EjkE'(FklF()GlmG)*HmnH*+InoI+,JopJ,pa_KKLLMMN ! NO-!.-OP:.;:PQG;HGQRTHUTRSaUbaSTnbonTU{o|{UV|VWWXXYYZZ[[\K[]^\]_`^_a{`z`bbccddee*f)f*7g)6g7Dh6ChDQiCPiQ^jP]j^kk]jkkxljwlxmwmnnooppaaK\qLLqrMMrsNNstOOtuPPuvQQvwRRwxSSxyTTyzUUz{VV{|WW|}XX}~YY~ZZ][\^qqrrssttuuvvwwxxyyzz{{||}}~~_]^`bbccddeeffgghhiijjkkllmmnnooppa_!"!."/.;/<;H<IHUIVUbVcbocpo|p}|}zy)()6(56C5BCPBOP]O\]j\ijwivwv                      "#"/#0/<0=<I=JIVJWVcWdcpd qp}q !~}~!""##$$%%&&''(')*()+,*+-yx,,..// 00 1(1'2(52'435B34A4BO4AN5O\5N[6\i6[h7iv7hu8v8u99::;;<<--(==>>??@@AABBCCDDE  EF!!FG""GH##HI$$IJ%%JK&&K)'(*L= =LM>  >MN?  ?NO@  @OPA  APQB BQRCCRSDDSTEETUFFUVGGVWHHWXIIXYJJYZKKZ+)*,.L L./M  M/0N  N01O  O12P  P23Q Q34RR45SS56TT67UU78VV89WW9:XX:;YY;<ZZ<-+[ [\   \]#]^$#0$^_10=1_`>=J>`aKJWKabXWdXbced qecdrq !~rde~!"ef"#fg#$gh$%hi%&ij&'jk'k(l[')km*(nl)+mo,*pn+-oqx,wp,.pr./rs/ 0s t0 1t u1'2u&v2'43v&3w34A4w3@x4AN5x@My5N[6yMZz6[h7zZg{7hu8{gt|8u9|t}9:}~:;~;<<-q-q(=[l\=>\]>?]^?@^_@A_`AB`aBCabCDbcDE cd EF!de!FG"ef"GH#fg#HI$gh$IJ%hi%JK&ij&K)'jmk(*L=ln=LM>>MN??NO@@OPAAPQBBQRCCRSDDSTEETUFFUVGGVWHHWXIIXYJJYZKKZ+)om*,.LnprL./MrsM/0NstN01OtuO12PuvP23QvwQ34RwxR45SxyS56TyzT67Uz{U78V{|V89W|}W9:X}~X:;Y~Y;<ZZ<-+qo[[\   \] ]^$%$^_1%21_`>2?>`aK?LKabXLYXbceYfecdrfsrdeseffgghhiijjkkl[kmnlmopnoqwpvprrss t t u u&v%v&3w%2w3@x2?x@My?LyMZzLYzZg{Yf{gt|fs|t}s}~~qq[l\\]]^^__``aabbccddeeffgghhiijjmklnomnprrssttuuvvwwxxyyzz{{||}}~~qo    %&%2&32?3@?L@MLYMZYfZgfsgtstvu    %$%2$12?1>?L>KLYKXYfXefsersr                      !!""##$$%%&&  !!""##$$%%&&' '(   ()&)*'&3'*+43@4+,A@MA,-NMZN-.[Zg[./hgth/0utu0112233445566778'79:89;<:;=ut<<>>? ? @ @ A$A#B$1B#0C1>C0=D>KD=JEKXEJWFXeFWdGerGdqHrHq~II~JJKKLL== '8M(  (MN)  )NO*  *OP+  +PQ, ,QR--RS..ST//TU00UV11VW22WX33XY44YZ55Z[66[97 8:\M  M\]N  N]^O  O^_P  P_`Q Q`aRRabSSbcT TcdU !UdeV!"VefW"#WfgX#$XghY$%YhiZ%&Zij[&[j;9:<>\\>?]]?@^^@A__AB``BCaaCDbbDEc cEFd !dFGe!"eGHf"#fHIg#$gIJh$%hJKi%&iKLj&jL=;'k'( kl ()lm)*'mn'*+4no4+,AopA,-NpqN-.[qr[./hrsh/0ustu01tu12uv23vw34wx45xy56yz67z{7{8'|k79{}:8~|9;}<:~;=t<s<>>?? @@ AA#BB#0CC0=DD=JEEJWFFWdGGdqHHq~II~JJKKLL=='8M(k|l(MN)lm)NO*mn*OP+no+PQ,op,QR-pq-RS.qr.ST/rs/TU0st0UV1tu1VW2uv2WX3vw3XY4wx4YZ5xy5Z[6yz6[97z}{8:\M|~M\]NN]^OO^_PP_`QQ`aRRabSSbcTTcdUUdeVVefWWfgXXghYYhiZZij[[j;9}:<>\~\>?]]?@^^@A__AB``BCaaCDbbDEccEFddFGeeGHffHIggIJhhJKiiKLjjL=;57455450430+32+&21&!10!0//..- -, ,++**))((''&&%%S%45RS56QR67PQ71KKPPUUZZ__ddiinnssxx}}/P                      !!""##  !!""##745804504/0+/*+&*%&!% !     S%O&4501RSNO5612QRMN6723PQLM71K32JKPJOPUOTUZTYZ_Y^_d^cdichinhmnsmrsxrwx}w| } |          /P.L                                                                   !   ! "   " #   #                             ! !   " "   # # 8049, $34/3 $ %./*. % &)*%) & '$% $ ' (  ( ) ) * * +  + ,   , - - . . / / 0 0 1 1 2 2 3 3 4O& 4K'01,- 5 $NO 4 6JK12-. 7 5MN 6 8IJ23./ 9 7LM 8 :HI32J/3I 9JO 9IN ;OT ;NS <TY <SX =Y^ =X] >^c >]b ?ch ?bg @hm @gl Amr Alq Brw Bqv Cw| Cv{ D |  D{ E   E F   F G   G H   H I  I :.L :-H  $ 5 J %   % J K &   & K L '   ' L M (  ( M N )  ) N O *  * O P +  + P Q ,  , Q R -   - R S .   . S T /   / T U 0   0 U V 1   1 V W 2   2 W X 3  3 X 6 4   5 7 Y J     J Y Z K     K Z [ L    L [ \ M   M \ ] N   N ] ^ O   O ^ _ P   P _ ` Q    Q ` a R     R a b S     S b c T    T c d U  !  U d e V  ! "  V e f W  " #  W f g X  # X g 8 6  7 9 ; Y   Y ; < Z   Z < = [   [ = > \   \ > ? ]   ] ? @ ^   ^ @ A _   _ A B `   ` B C a   a C D b    b D E c    c E F d   ! d F G e !   " e G H f "   # f H I g #  g I : 89, $3:( h23 $ %.2 h i-. % &)- i j() & '$( j k#$ ' (# k l ( ) l m ) * m n * + n o + ,  o p  , - p q - . q r . / r s / 0 s t 0 1 t u 1 2 u v 2 3 v w 3 4 w x 4K' xG(,- 5 $() y h 4 6JK x zFG-. 7 5)* { y 6 8IJ z |EF./ 9 7*+ } { 8 :HI | ~DE/3I 9+4H } 9IN ; }HM  ;NS < MR <SX = RW =X] > W\ >]b ? \a ?bg @ af @gl A fk Alq B kp Bqv C pu Cv{ D uz D{ E z E F  F G  G H  H I  I :  ~ :-H ~,D $ 5 J % h y i % J K & i j & K L ' j k ' L M ( k l ( M N ) l m ) N O * m n * O P + n o + P Q , o p , Q R - p q - R S . q r . S T / r s / T U 0 s t 0 U V 1 t u 1 V W 2 u v 2 W X 3 v w 3 X 6 4 w z x 5 7 Y J y { J Y Z K K Z [ L L [ \ M M \ ] N N ] ^ O O ^ _ P P _ ` Q Q ` a R R a b S S b c T T c d U U d e V V e f W W f g X X g 8 6 | z 7 9 ; Y { }  Y ; < Z  Z < = [ [ = > \ \ > ? ] ] ? @ ^ ^ @ A _ _ A B ` ` B C a a C D b b D E c c E F d d F G e e G H f f H I g g I : 8 ~ |:( h2;$ 12 h i-1 ,- i j(, '( j k#' "# k l"  l m  m n  n o  o p    p q  q r  r s  s t  t u  u v  v w  w x  xG( C)() y h$% x zFG BC)* { y%& z |EF AB*+ } {&' | ~DE @A+4H }'5G }HM  GL MR LQ RW QV W\ V[ \a [` af `e fk ej kp jo pu ot uz ty z y~  ~        ~  ~,D +@ h y i i j j k k l l m m n n o o p p q q r r s s t t u u v v w w z x y { | z { }   ~ | ;$ 16# 1 , , ' ' " "                           ! C)!<$$% #"! BC!!=<%& "!!! AB!!>=&' ! !! @A!!?>'5G  06! GL !67! LQ !78! QV !89! V[ ! 9:! [` ! :;! `e ! ;<! ej ! <=! jo ! =>! ot !>?! ty !?@! y~ !@A! ~ !AB!  !BC!  !CD!  !DE!  !EF! +@!F*? !! !! !! !! !! !! !! !! !! !! !! ! !! !!!" !"!# !#!$ !$!! !!!%! !!%!&! !!&!'! !!'!(! !!(!)! !!)!*! !!*!+! !!+!,! !!,!-! !!-!.! !!.!/! ! !/!0!! !!!0!1!" !"!1!2!# !#!2!3!$ !$!3!! !!!!% !%!!!& !&!! !' !'! ! !( !(! ! !) !)! ! !* !*! ! !+ !+! !!, !,!!!- !-!!!. !.!!!/ !/!!!0 !0!!!1 !1!!!2 !2!!!3 !3!!!*      !"#$%&'()*+,-./0123456789:;<=>?@ABC)*+,-./0123456789:;STUVWXYZ[\]^_`ab<=cdefghijklmnopqr>?stuvwxyz{|}~@ABCDEFGHIJKLMNOPQR56789:; <!"=#$>%&?'(@)*A+,B-.C/0D1234stuvwxyz {!|"}#~$%&'()*e f g hijklmnopqrstuv4&3%2~$1}#0|"/{!.z -y,x+w*v)u(t's&r%q~$p}#o)7ESa*8FTb+9GU c,:HV d-;IW e.<JX f/=KY g0>LZh1?M[i2@N\j3AO]k4BP^l5CQ_m6DR`n7ESao8FTbp9GU cq:HV dr 4 & r  d V 3  % q  c U 2 ~ $ p  b T 1 } # o  a S 0 | " n  ` R / { ! m  _ Q . z l  ^ P - y  k  ] O , x  j  \ N + w  i  [ M * v  h  Z L ) u  g YK ( t  f XJ ' s  e WI & r  d VH % q  c UG $ p  b  TF # o  a  SEMNOPQRSTUVWXYZ[\]^[\]^_`ab c d e f ghijkl } 1 ? ~ 2 @  3 A 4 B 5 C 6 D 7 E 8 F 9 G : H ; I < J = K > L ? M @ N A O B P;-<.=/>0?1@2A3B4C5D6E7F8G9H:I;J<K=L>W I X J Y K Z L [ M \ N ] O ^ P _ Q ` R a S b T c U d V e W f X g Y h Z       !"#$%&'()*+,-./0?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~WUSQ?      L : 8 6 4 I G E C 1      > , * ( }&R@><:][YWE`NLJH     k i g e Sn \ Z X V      " y w u s a| j h f d  - + ) ' 0     o x v t r  ; 9 7 5 #);=?AVXZ\n7IKMO     " d f h j |E W Y [ ]      0 r t v x S e g i k  & ( * , >     a s u w y  4 6 8 : LTSRcba-,+|{zFEDUTSnml8}7|6{GFEefg/01NOPWXY!"#vwx@AB   IJKhij234     DEFGHIJKLMNO('&%$#"! ihgfedcba`_^     HIJKLMNOPQRS,+*)('&%$#"!mlkjihgfedcb   LMNOPQRSTUVW0/.-,+*)('&%qponmlkjihgfPQRSTUVWXYZ[^`bdv[mo qseca_M  rpnl*PRTVh }    # 5 7 9 ; B D F H Z o      ' ) + -PQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~efghijklmnopqrstuvwxyz{|}~      !"#$%&'(TempVXVYVZPresAsH3GaMe3CH4H2C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3DdID3D/DNCC&SC#C[CCC&C+C|uCC3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3DdICC|uC+C&CCCZC"C&QCDND/D3CͤCDD8YCCC(CyCCvCC6CcCAC,CC=CCo C>kC'CݨCCCCCCCCݗCCUCC2CCʘCnCsCCgCCʕCwCbC̄^CްC3 CXCPyCCԗCڡCOD 7CTC7D 6D#C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3DdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdID3{D/_DNrCC%CCCCcC&rC C|bCD3OD-DLC~C"CC~CCC& CC|5CD3bD*dDICTCCC CCߡC%QCPC{CD3dD&DE$CCC$CCC%C$jCC{CD3#D$DCCVCCCCtCfC#CC{{CD3D'DEaCCC؟CC1CC#CRC{gCD3D,uDJCCkCcC=CCC#{C9C{jCD3D/GDM%CC@CC CtCqC#CcC{CD3D/DMCC CC CCC#CC{CD3D/DMjChCCC CpClC#CbC{CD3AD,DJbC7CCoC4CCC#uC7C{jCD3D'DEyCCC؊CCCC#CNC{fCD3D$DBCCnC׆CCICLC#CC{yCD3WD&DDC1C CّCCZCC$YCC{CD3MD*)DHCcCC*C rCC߁C%FCMC{CD3#D-8DLCC"4CC>CCC& CC|6CD3TD/"DN0CyC%;CUCCChC&{CC|dCD8YDCCͤCyC(CCC6CCvCCC,CACcC>kCo CC=CBCCݨC'CݖCCCCC2CCUCCsCnCʗCCʕCCgCCްC̄]CbCwCCPxCXC3 D 7CNCڡCԗD#D 6C7CTCCCCCCCCCCCCCCCCCCCC$C$Cy|Cy|CylCyTCyCAjCAC+C+C+bC+2C+C+C+#C+*C+"C+C+C+/C+^C+C+C6C CCCCCCCCCCCCCCC5CCCnCnC>KC>MC=C=cCD#D#D#C6C5C5C4C5C5C6C7JC7C69C58C4C4C5C6D 6=D 5D 4D 4D 4D 5D 6fD 6D 6D 5D 4D 4zD 4D 5WD 6C͗CbCCC̹CCC`C͆CtC1CC̹CCCHC͈CCDDD8YD8YD8YD8YDD8XD8XD8XD8YvD8YD8YD8YD8YD8YD8XD8XD8Y2D8YCC#CCsCC(CCCCWCCrCCC|DD'DDDDCAjCAC+C+C+bC+2C+C+C+#C+*C+"C+C+C+/C+^C+C+C6C CCCCCCCCCCCCCCC5CCCnCnC>KC>MC=C=cCC{CC9=D/uDD+\XDF)CACeC8JC[CCqCz'CCC5D- DD+XDF&C CeJC7CCjCwCx&CC/D(iD#D+ODF[CCd>C6CCCCm>C؜CDDD+IDFCCdC72CVCCCmCgC@DbD D+=5DFgCCd@C6CC&CCmfCCDDoD+H}DFCCdIC5C3CCCqoCC,D)RDD+ZDF*CCdC6CךCCCs:C C1D-DD+_DF.C$CeCC7}CCCC4CCCCC4CC孔CC帲C C8CCrCDWCDUWC{HDPCqDJYCmHDG;Cr@DJC|{DQCDUCDUCdDUAC|*DQCr=DJCmDGnCrDJC|BDQ]CDUCDWD &DSD DPGD tDKD GDDD ]D?^D DDUD DNKD DRD DRD KDRD DN4D DDD D?D DDRD DKUD %DPD rDSXD!D&D! uD&D!fD&D!D&DD!jD&D!vD&D! AD&D!D&D!mD&D!D&fD! D&D!D&D!D&D!D&D!D&D! D&D!'D&DC6CCCCm?C؝CDDD+IDFCCdC72CVCCCmCgCBDcD D+=5DFgCCdAC6CC'CCmgCCDDpD+H}DFCCdIC5C3CCCqpCC,D)RDD+ZDF*CCdC6CךCCCs:C C1D-DD+_DF.C$CeCC7}CCCDD+!D@DAЏDB!D:dD4DLRjDODQDRDSuDSlDSuDRDQDODLRjCCaCCFCC'CCF[CCbCC%C\CCwC=CCCCCȟCBCwCCCCUC4CNCq&CscC@ZCsCpCC3CSCC#CI?CSCC=CSPCCC)CC0CCC=C0C6CiC4C)CC GCtCzCCIC]CKYCC/CDCCCMC,CFC8CCICtCDC"CCyCCZCC`JCCC3&CCֳCJCPC7CBCH\CSCCCCC CuCsC#BCƗC_CaCCCފCg'CZCƭ2C-CC."CZxC(CICCCCϱCaCBC!CoCIC`CC9CC CCrC(C$&C$CYCùCMCӇCUCѨHC:CђC^C;6CCHCBC̳fCC̛C C|_C0CCńC/CÊCC9JCؖCCνCTCCCCC"CΡCCϷCCC; CCCׄCCVC uCn^C؇rCڃC%C-;C6ClCN9CCj CCXoCCcCgC?EC-CoxC=C lCC`CEC\ CCFoC/CwCD DsDwDDDD{UD]DDD0D^D DD~vDDrDDDUDyD|fD]DDc|DaDXD&CD*D.D/QD0!D/aD.D+D&SDYDyDIDDDDD D3mD DSD8DDՌDgDD%D#D#6D&PD'D&D'D&,D#RD#D%2D):D- D-%D.7D-@D- D)D'TD*VD*=D'^ D* D*%mD*D4mD:gD>"D@V DAlDAjDAm0D@[uD>D:s^D4D4eGD3D4\D2z~D3D7D:D;D:­D;D:MD8D8J'D9D=/&D?tD@*D@p!D@%5D?D=; D;5D=D=uQD;=AD=D=cD=DLXDODQfDRDSC6DSvDSCDRDQTDO-DLXrDL1DKDLNDK6DKPDLDLADLMDLmDL[DKDKeDLDKNDL1DOFDN`DN7`DO-DP/ DODP8DO2DNDDNgDOCCCECRC>CC=CSPCCC)CC1CCC=C0C6CiC4C)CC GCsCyCCIC]CKZCC/CDCCCMC,CFC8 CCICtCDC"CC`CEC\ CCFoC/CwC;CCCDx8D kzD DDaDgD D |DvCCwC CCCCcC6CC5CՏCtCCVCPwC|D́D(D|DDDDDDBD7DCD=?D D TD D D IDM'DDCDDD /D'D  D &AD(D@(DFD{LDD{TDDPD9CD (.D D "pD {OD RD jD =D fD PD D D XD #D D >D DsDw DDDD{UD]DDD0D^D DD~vDDrDDDUDyD|fD]DDc|DaDXD&CD*D.D/QD0!D/aD.D+D&SDYDzDIDDDDD D3mD DSD7DDՋDgDD%D#D#6D&PD'D&D'D&+D#RD#D%2D)9D- D-%D.7D-@D- D)D'TD*VD*=D'^ D* D*%mD*D4mD:gD>"D@V DAlDAjDAm0D@[uD>D:s_D4D4eHD3D4\D2zD3=D5%fD5UD4D5VD5D3D2ycD47^D3ɦD4eD9?D8>D7D:D;D:­D;D:MD8D8J&D9D=/&D?tD@*D@p!D@%5D?D=;D;5D=D=uQD;=AD=D=cD=DLXDODQfDRDSC6DSvDSCDRDQTDO-DLXsDL1DKDLNDK6DKPDLDLADLMDLmDL[DKDKeDLDKNDL1DOFDN`DN7`DO-DP/ DODP8DO2DNDDNgDODD=C>TDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIC3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3D9RDiCCCʢC(DDD?SC>TD=DD>C>KC>$C=C=C=C=C=C>%C>AC>4C>C=C=C=C=C>C>?D=D=DDD>D>D>D>ŹD>œD>ŃD>ŘD>D>D>D>D>D>ŠD>ŃD>ŋD>ůD>D=D=D=kD=ZD=jD=D=D=D=D=D=wD=ZD=`D=D=DDϬDyDcD|DϸDDDDDωDcDmDϛDC"CCCCCCC CCCCCCCCCDDDDD?OD?KD?DD?2D?!D?D?#D?6D?HD?QD?MD?>D?)D?D?D?,D?>DDԥDԍDԂDԍDԧDDDDԴDԖDԄDԆDԚDԶDDDDuDDDDDDDDvDyDDCʢCʢCʢCʢCʢCʢCʢCʢCʢCʢCʢCʢCʢCʢCʢCʢCʢCCDiADi=D9RD9RD9RD9R D9RD9RD9RD9RD9RD9RD9RD9RD9R D9RD9RD9RD9RCCC|CrC}CCCCCCCwCvCCDi9Di,DiDiDi!Di/Di=DiEDiBDi8Di)DiDiDi&Di3DdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIDdIC3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C>KC>$C=C=C=C=C=C>%C>AC>4C>C=C=C=C=C>C>?D=D=DDD>D>D>D>ŹD>œD>ŃD>ŘD>D>D>D>D>D>ŠD>ŃD>ŋD>ůD>D=D=D=kD=ZD=jD=D=D=D=D=D=wD=ZD=`D=D=DDϬDyDcD|DϸDDDDDωDcDmDϛDC"CCCCCCC CCCCCCCCCDDDDD?OD?KD?DD?2D?!D?D?#D?6D?HD?QD?MD?>D?)D?D?D?,D?>DDԥDԍDԂDԍDԧDDDDԴDԖDԄDԆDԚDԶDDDDuDDDDDDDDvDyDDCʢCʢCʢCʢCʢCʢCʢCʢCʢCʢCʢCʢCʢCʢCʢCʢCʢCCDiADi=D9RD9RD9RD9R D9RD9RD9RD9RD9RD9RD9RD9RD9R D9RD9RD9RD9RCCC|CrC}CCCCCCCwCvCCDi9Di,DiDiDi!Di0Di=DiEDiBDi8Di)DiDiDi&Di3C3C3C3C3C3C3CZ(CMCeC?;CFCdBCZ(CdBCEC?;CeCMC3C3C3C3C3C3CZCC26CKCF{CCCC% Cg>CC^CZ%CCgCCCCR'CMCWCqCԛ^C@CZ(CZ(CZ(CZ(CZ(CZ(CZ(CZ(CZ(CZ(CZ(CZ(CZ(CZ(CZ(CZ(CZ(CMCdC?:CFCdCCMCdC?;CHCdBCMCdC?;CLCdACMCeC?=CQCdACMCeC??CUCdBCMCfC?ACWCdGCMCgC?CCYCdNCMCgC?DCZCdWCMChC?EC\Cd\CMChC?FC^Cd_CMChC?GC`Cd\CMChC?GCaCdUCMChC?FC_CdNCMChC?EC[CdGCMCgC?BCUCdCCMCfC?@CNCdACMCfC?=CHCdBC3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3CKC26CCZCCCCF{C^CCg>C% CCgCCZ%CMCR'CCC@Cԛ^CqCWCAC@CBCCCDCECFCICKCMCLCKCICFCCC@C@Cԛ_Cԛ_CqCqCWCWCWCWCWCWCWCWCWCWCWCWCWCWCWCWCWCԛ`CԛaCԛcCԛeCԛhCԛjCԛoCԛrCԛtCԛtCԛrCԛnCԛhCԛcCԛ`CqCqCqCqCqCqCqCqCrCrCqCqCqCqCqCMCMCMCMCMCMCMCMCMCMCMCMCMCMCMCMCMCR'CR)CCCCCCCCCCCCCCCCCCCCR)CR,CR0CR2CR4CR5CR6CR8CR9CR:CR;CR:CR6CR2CR-CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCgCiCCCZ$CZ'CZ$CZ&CZ(CZ*CZ+CZ-CZ.CZ/CZ0CZ0CZ1CZ0CZ/CZ,CZ)CgChCjCkClCmCnCnCoCoCpCoCnClCjCCCCCCCCCCCCCCCC^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^CCCg=Cg>C% C%!C%C%C% C% C%!C%"C%"C%#C%#C%$C%$C%$C%#C%#C%"CCCCCCCCCCCCCCCCg=Cg=Cg>Cg>Cg?Cg?Cg@Cg@Cg@CgACgACgACg@Cg@Cg?CCCCCCCCCCCCCCCCCCCCCCF{CF{CF{CF{CF{CF{CF{CF{CF{CF|CF|CF|CF|CF|CF|CF|CF|CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCZCZCZCZCZCZCZCZCZCZCZCZCZCZCZCZCZCCC26C26CKCKCKCKCKCKCKCKCKCKCKCKCKCKCKCKCKCCCCCCCCCCCCCCCC26C26C26C26C26C26C26C26C26C26C26C26C26C26C26C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3C3CZ(CZ(CZ(CZ(CZ(CZ(CZ(CZ(CZ(CZ(CZ(CZ(CZ(CZ(CZ(CZ(CZ(CMCdC?:CECdCCMCdC?:CHCdBCMCdC?C% C%!C%C%C% C% C%!C%"C%"C%#C%#C%$C%$C%$C%#C%#C%"CCCCCCCCCCCCCCCCg=Cg=Cg>Cg>Cg?Cg?Cg@Cg@Cg@CgACgACgACg@Cg@Cg?CCCCCCCCCCCCCCCCCCCCCCF{CF{CF{CF{CF{CF{CF{CF{CF{CF|CF|CF|CF|CF|CF|CF|CF|CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCZCZCZCZCZCZCZCZCZCZCZCZCZCZCZCZCZCCC26C26CKCKCKCKCKCKCKCKCKCKCKCKCKCKCKCKCKCCCCCCCCCCCCCCCC26C26C26C26C26C26C26C26C26C26C26C26C26C26C26AA2n@@E@8?(? X?>Q>=m=ƕ5>s=Z\>b6>"><>O>?~?Nm>7?8\i??1?"??4|@ ?l&@B@B@{?ھ-@T|N@@@Δ@J@A A+AA6%AtAM+/A@V@]C]CVM+/t6%+A:;u@i@@;?6??;n?8><>+>v>(W<1A<%t@@@8%?߿??c:?M~?G$?9?bY>=6A8n@y`@ V@0ݷ??.?ߺ?ӏ?xv?=?Rr>=|A/9@9@9:@#k?\??G?? 5??t?Q=@A ȁ@$S@~}@4??V?Z>??d$?T?b?)Y=NA 0:@09@\0?D??? ??\(?*~?5??"=Ǖ@R@W@2_?m?rp]?l?^?ē?@?J??P'=ݾ @`=@j@TC??,G?H?&?1???el?Z7\=昮@nWD@?? >B??f?`~?.?#?ʗ?\=??|m>==%>ۉ?s?϶?Ӄ?PU?X?Xa=4QI{į/Qn.>wMg?Oy?z?׽???N@r=]ɀ ;u=$S?$ ?5?C?͹?"? ?y]?@?1g?@?}+? =iYwq=K?s?Kk8?cz?C>ס=[tQ|#7! d:Ѿ#ū>x>??MU>E= %i/BѨ`y^g>0>A>y> KB)0̽D"CE^;4 U\ƚ4 K0= UL IHzP )v2 kTApx$uMWӗpܿU72 TB#ݿ &0$>i2>>>g>>l>ݝ>d>>>c>͸>U>52m뼏\CKV Nkk) @w/8IuԼ=A=Gi==.p=Ž==;=r==ɻ=-=q'=ٚ=G}<=p ==[=^>#>$>+g=>,>(*>i>=Q=v'==VXb<{=w=>$+=>oe>9 >ܗ?>/?HJ?l?9??0??V?B?H?c31?=?:> >.->>v&>9)>Q>`\>ܪ>.->>x>>J,>5>`>^C>6>oW>e?? 4?3?B?K?M:?I3?>?.=?p ?>1>=fk=C>I>'j>C>X>hl>p>r>kO>]|>I>/l>j=ٷ= v<k>53=`>n>>>T?b?P?F?z?~?=3?آ?v?6? H?F??n]?5s>ݎ>ym>*>ݨ>?9?^?A? E?Z`?H?>)8>x1>V>@7>?F?:y?[!?u!?1?`?.?f??i?Lw ?)h?>3=&=>C>!>D>aVd>w>Df> >5>v>qfY>X>9}>*_=f=~V}<>6P=r>qo= '>`>ݨ?$?`?9?#?[a??%?QI???^?2?e??*>~>>&Y>C.?ܟ??(b?-I?-?([?l?p>>×>>4 >ק?&4?M-?m?ȝ?^?|??u8??pQ?O?)A>x>v=Ե>n>;>\8^>uN> >P>p>Q>>i>K>(^I=V=*=\=>lS25><'wE>;?0)#?b??g?fW?Z?N??l??e?bd?0>j>wh>>ݘe??͌?!X?)?+?)%?!V???>"?>T>j=?s?.X?P?lz??u?X?}?u?oR?S?27? u">>Id#>%u>Db>e>>8>A> >zf>>oH>P>+0G>h=V =Mj瘽>.>~-@?r?Hy?k5?n?>?;??aV??y;?Y:?3?`>`>2]k>.>C??4?#?&. ?#`?Yi?'>>>>dt=荲:K??>@N?W?iO?tl?x/`?tu#?iG^?V?>p?d>$>K>+Wɺ|N>y=>=W>O>˖>NP>`>r>;>3>^\U>/}z=P=J<9G$#>?T?:n찀?n(n??S?s??:?P.?_?k"(?Jso?#>f>Y=ዾיd0?D?"?-3?2;?2?,b?"?iX>>~z>->6@=iDD=?U+?i+?vF?{I?y?o?^?FW?(?D>>R=  򤾜>и=>T>>쳤>*c>S>ɘ> >,>`(M>Hc=[wt2.{O?PNέ?ӿl2 ? ?c?+?¿??t?j?k%?/)>>(]ܪ#aȿ6j?b ?m%'?qP?n1 ?c?Q?9ڽ?@>>>-y;$m\??ly?E?z??M%?qG?Ds?L>X>eͿ o>M?1p?: ?>i$?<=?5)?(j?>4>Nj>>۵<)s.9v?I0?oЫ@!*; g@$Z@"C@V@H_@?u?I?sT?%=䊾MCs̢ox?.???B??4? ?S{?df>=çѾ*GSk+TdaB@#@@1?&??ΨO??;^?6> {x~;(4??{??J?5 ?z?p)?IO?0@>`>TA.cI QMؿs@m@Sh,o@d9@G@j@@xo@_ѷ@@%3@?v]?&>Kܧ5gD!FL@H@@F@%@ g???S*?rd? t=Ā:t>II/r@]@a*@^%<@Tlf@Dz@-o@d??Q?!&Uu=sq2߿@g|.;@oR@ 2@ܷh@@;@4r@@`@8@FN?l[?JBӔ`"1!uêP@s@xG@u@k@ZBI@B@$ @??CD=ҿٿX/@@>@@|5@@@mD@9?@?D=f1WeĦ@&n@)@&@ @e@ \?u?*%?iz>< ߾+eUɿMjZV@{_d@A&V^HA*GA)A#AA %@o-@N@@?롿DV̉@@i@@k@@s @E9Y@|?ă>,(nbCDerP AAA@H@-4@Tp@\@@e@H?`/ReH@PR@LϺ@Bˈ@2.@@~W?ʣ ??`bRӦ"K6Eo!@!X[ -%o.6̩u0 AA(AA@@@pX@?@ܿ{,_A+6%tM+/V]C*)E@]C@VAAM+/AtA6%AA+ y@0<>g?`?Ѩ@/F@@A%j NMW;x>#?:?l@!$@|#=@QA [uסCczKk6sýKʼ?|?w$@@Y@@l ࣿ}.@1f@]>S{?{?P@/ @@;%jw㢿ڿZy7 >'W?O?K?L(@7D@潽an.>Q>į.>{>J4RXaXPUӃϴsۄ%־ۿ|mý\ʗ#.`~fB nWD昬Z7\elͿ3)H,GTCj`=ݾ PJ@ē`lrp[m2^WRǕ˿?5*~\)꿙 剿@\008 0:N)NbTd%⿖Z>V/~}$Q ȁ@Ptʿ 5G\#f979~/9|yRo=xvӏ߹.ٿ0ݲ Sy]8n6~οbW9G$M~c:߿8 |<%r.(Lv+98;k.;i:;t>>Y>H? ?&?<Ӈ?Lo?V?Z?V ?M?=??'A? F>#O>E>>>K>B)>1>=H=">E>E^<>5>>>U\>ƚ>4 >K>>/>=>U>L> IG>zP? )v?2 k?TA?px$?uN?W??ӗ??p?U7?2 ? >T>B>#? ?&0?ڳA>ՔP'ʪ:9;E;S;;\/;;כ:;u;0;ݳ; ;;z;Y<0 ;?ٽ,$i2þgվlݝ־dc͸U5;-<2m<\@<<=KT= =Nk=k=*= @=/:2HJlʿ90ԿVBڿHc31=:.-@v+9-Q`aܪ.-xξJ'5ƾ`^?4oZeտ 43BKM:I3Ͽ>䙿.=p 1fkCI'lC¾XhlprkN]|Iݾ/ljٷ ur54bnݾTcPGz~=3آv6 HFſn]ֿ5rݎym*ݪ׿9̿_A EZ`H)6x0U@7G:z[!οu!2`Ϳ.fi̿Lw )h3轚(>D!DaVfw龃Dg 5оvqfYX9}*`f~V6Prھqp ,aݫ$`濊9#[a%QI^2e@*۾~&ZC0ܟ޿(b-J-([lp×4 ק&4M-mȝ^|տؿu8ſpQO¿)AyxԵn;Ǿ\8_uN PpQiK(^JZ*ֽg<=lS69/'w𤌻0)#bgfVYNտͿmfbg0jwqݘgĿ͌!X)+)%!Vٿ?"@Tjs.YP棿lzuX}꿁uoTS27 u#׾Id0%yDbe8Aᾏ zfoHP޾+0IkVM-@ܿ>kHyk5޿n>: aTſy;Y>3e`D=]jо.C#5#&. #`Yi'ʾԾdz̺N>@QWiOtl߿x/_tu"iG^V>sd)K+W:|D׾yB=\O˘NRbs;3^\U/}|PP9=G =#}>?>Tڿ:s>tn?(n׍>d$F"-32<2ٿ,c"iX~{-6AiD=D>=ĿU+i+vF{Kyo^FV(趿ERؽ P> >иB[쳩*hSؾɘվ!,`(LHc[2.>{B>ʿPN?Ω?l2?c-¿ujk&/)(b=ܪ>?#?aҼ?6fb ̿m%/qPn1%cQڿ9ڽ@憾-y>$b>\ > l~HzM&qGDsLɾY=>e? g?>G1p:$>i)s'>>0?vI?,u?Ы!*<@ g$Z"GVHau IsT%>?MCq??̢j?u5 D4 S{dfç>*G>Se?+T?da9#5& ΨR;^6耾 y;x>|?;#?0?{Jֿ5#zڿp*IP0@`TA,;>cI>? M?M?sq?Sh@,o@d6Gmxo_ѹ@%4׿v]%K>ܧ7?g?D@!@FLHI% i俪S*rb sz>:r?>I?G?/m]a*^%@TljD|-odP!RP???@QWi㠠|Sb'u'=T>p?=sn?/??g|1@;r@P @0ܷj;4u`8FNl[JB>Ӕa?"@1!@uæ@PsxGukZBJB$ CD罻???X@-> |7mD9?D?f?@1W@eĢ&n)& e \u*%iz˼ ,>&?e?U?K@j @ZU{@_b@&V_AG*H)# %o-N?@D@T@̉@jks E9Y|ă,>(?l@bA@Dd@rP AI-4Tq\eH`?,?@R@c@HPRLϺBˈ2.~Wʣ `=b??R?ӥ@@"K@6@Eo!<@z A]]dAN [KQB~-XbJ;>?6ŗ?@@Z@A~A@"a?XB|- ˥wF81Q L@"*oj|,Ӿ;ʽ晽f^" wleC*AaAABA?Y@- @|@u@˧@Q@F84@@? O???*j?">x>o>;>,=f==" =f_>2>͂>t? W?#?Wf ?@a+@R5@AA=Lx>m? ??*?]f?bM?_k?qP?=T?K%@D?@J@&A4#>.?E?+?h?5?s??:?i@0 @:@oA&?y?{?B? ?x?$?3?ê?ʚ@r@@jAͲ??kJ???֗?ɫ?-#?i??@XX@@?1ӊ?f?)??b??G???JZ?@'@@´?B??@ !?=?ğ?~x?5>=y8>[p?] ?-E@ ^?LR]?>@n@\@?;?M> ƾoѿja>=?J\?F@@ `??ٟ?)۽߿,)xt} Lv?A?w?@-??T?վo"ֿJ?0\?#?{??0X?h>i/+V-nqb?y?? ?Ԑ?H?e+>"0ɔ:\_}X?:6?t ?8???*V^}jE6{_9:>7>4?>=?v?n>?Y|> _&鿂m I;Ϩj%>]O??+e?/?(> ˝SV A4Rn> Գ>|>/>>#m뿛f[`)Z==uR?=]=>OZ>9.>%>l}>݅>|>Q>_?>?Y>?>?s>'?;F>?>?Q >>\>t>E>B"m>>xI>Y= =V>5@>\5>>i? ֚?&s?1~?U?S>>TC>|>_>Y?}?! ?[ߏ?p?u??d?0???/?LJ?@??H???B?g?Cg??S?fp?V????l\?ʺ?%?4>@\><>T>?"*?+?w?\?N?%??7?>>?T?b@U@`@+@0@ ܵ@.@ ?a@??\?dU?܉Q?ʰ?_?p??I) ?Uw>kx>>4 >/?+?Q?UW?ZN?h?"??!(??ӂv?(}??3??@'?T@U;?K??U??.u?+?|q??+??T{F?]v?ʼn?MUZoL>e>D>> ???7^?zm?sM?DF??x????I?Ş)?ˡ?ʪ?ɢ*?dn?Z?D?g?{4?Lx??29?L?WƦ?]'?d?HB;n:e>63= > >?>ꥸ?<%? ?bG?Hg? ?i?e&??*??X?? o?X5??B?4.??kjM?o?GQP?Pi;6f5^S6B^˿ 4QHzƾ=l>=>+>s?'??QP?0?uMGv>?>L?H?6?T?n? ?@?!h?.??מ?y?a?d?F@O5 G#$8 =x#7N 4%`؎R}n(% >~(?G6>r?ٹ>?@@ <$?,?@Jȣ@@S~@r@6@>@y@@@f-@C@q@@@߅A6*<':;1 +{ ]){o%_Nz>jV}@2?~@f@Eu@ɱ@A@ΦADA |A*ACA8A0;A@RA< ACABDdv&gvZiB87Eaί QFF I~(&>@QF@F I@ί @AaAAB8A7EAgvAZiAAv&AAAAdAAA{LAh*AM\A,QA @a@:5Mk;:5Ma ,QM\h*{LA_6̈́t X#Wf a/R:=Lzn ?+]fbM_kqP=XK-D? J+4%.ȿE+hſ5俊sп=m0 :o&y{D x̿#2ëʞwjͳkN֗ɪ-"i׿ X[ۿ1Ӌj)ֿb׿G?J[!'´B⿶ !=ҿğ~r3>NjMF2Jп tzN\߿i}ty8[p] -E ^LR]>n\;M >o>=jaJ\F ` ٣)=?,)?xu?} ?Lw@Aw}-W>o???J@~@ο0\z0Zky?/?+@V@-@nq@byԐHe+վ"?0?ɔ5@@\_@@}X:5t7ȿڿ*63>8tn>Y>_&?e?@I7@Ϧ@gA%ݾ]N+eٿ/( >˝?S @@V @A@A4Rm Բ|쵾/#+=l??f@@[[@&@VA=uRSiOg9.%lݒQ_쉾ӿXǿs';G QLt8B"\x>Y Z5Q\5t ֮&{1~US<~IpW|ѿQT\(˿Ŀ)ntsX4ɿ7i\5?'-BC𛭾TCt|y_ϾY}߿! ſ[ߜp!udϿ6%䱿/Nj@󾭿H?gǿCcMffV̿ο?lKʴ%4~@Q?ScU`+0 ܵ. a\dR܉Pʭ_lI)Uwþkpվ4 /QUCZN࿐_!߿ӂn(x3'WU=NU.y+|tꅿ+ӿT{E]v˿ŃMQ=Z=׾e3Dp?ȿ75zGsMD7꥿o󗿼ݿIŞ)ˡѿʪɢ1duZNg{B>>n>oɿGQ7Pi+?6?55?^S??6C ?^? (?4Q>H?>X>Y ='+s'޿QPϿ0u=Z-~xX D6C?N??LY?7j?B?㲧? ?ʭ??D?LHG? >G?D>3>ɏN=Gs?LH2Tɿn@!MηמyaƿdE@@@O@5 9@G@#;@8@ =@#7_?@ 40?`?؏?R?>n%?% ~=%G.r0]7Կ;v ,!*22uC?"2B EMh@Y@X@@@w8@j@O@mL@!@@P?:@?d?n$,JȟSyr6>yf-qoA6*Ag>p>\>*=\1[*\pgڌ>r>ޒ>2>>/141v/176ޗr?MT?O?:D? >"2*% ޿:DOMT?^2l?^߿fc)0B@@ T??&?:̕2t˿:̖( V @c?@U@3a@3?1Y33aUc?@a@:@~@3}?2B3}~27kR,>a[>>>c%>l?G>} >0>>s}>o>.?!5C?DJ?N;?vl??#?|'???t?L&?A?Q>??T?~??L??4?x?|?Q1??3[Z?=?_%?r_?`???6\?|h?B?`?zX?}??}>O>ښ??H?"?4='?'3? r? )*>]2>?5w??/A???࡝?!?i??[?^?s??vP:?+?cE??Ɋ??Wz?'?t?)?+?`?Yn??'?D?ì?d?R?\?G?N?1????>#>r?x*??(d?<`?3B?K?Ô?>?`?ڐ?Y?ۣD?@@@@ @?ֆ?R?Ԥ? ?I[???xc?,@ /@D@w?q?@??qH?U?n4???t??R?Ѫ@?k? l?p?(m?1?>N:>Z>>? l?#?#?a? @?*`? mz?q_?+?+O?u@0@ @@14@)@?6?7G??տ?=?u???@I@???ҝ?G?Yy=?s$?i????A?ξ?{?q? p??p??E]>>>=>D>>???????jV???҆I?d?[??u?t?w.?D?ň?u??????l}d? L??c??u?c/?k'?Z?w?|?G???r?ؓ?N$eRǾKʾ*O >/4|>>蚶?xZ?(C?+$?^???D?\?????~?a_?@? > >=A?XML?'?b ??sEi?q?=x?]? a&><=CA=[ >Y>???A^?r&?.-?>>l?Gj|?E"4ݿBWh7!tWJ>I?>O?+e?Q֥?_U?j?oC}?j-?mF?S?/?xy>^>BK=#<J1Ӿp6?MU?I6?: >C>w=fӾ ݂龣e(ٿ%HHg1> t>?X?Qꦾ6m>*D>TA.O )4> ??lYc?o?k? T?~h?Z?;r>3>;Aܾ#K-Hk~d ֿ뿲0?w??P>c=\#ҿi쿠<+ٿpۋ_F')>L? 3>6H҆eA=] ݫEӿ*>??eԢ?E?f@5Oq"{Rܲejϵg\Rk? ?+?w=ٿg 'f "Կv.TA}V]>(m?i>숈wQ&5ÿ*T\clfK<=>|<>\^?@ iw@7Ƽ@R(Y@:@L?v?/?dJf>(@:ٿ9a-,/=Yem@1??>XP[D%.UgmZ 2犿%-?9q?3?h޳ ȁYb;ٿ?9>vBQa Pu?.s@@OXk@ @@W9@Ϥ@U@1}?r?<|# 1AiL1Dp-]i@i~@=~@w?092@M%R*hV_29=?@?ۍ+"Fq15?#e:N+'.F}?u@=i@@G@ @@Ŷ@b@u@B?g=`*(e&zI6$՘q ;@]@@[5?bwy`Nt8ׂ[cM[$T>A^@@n0@8'd"t+"?,0 rT_H7Rb ?C@ @'IAA&77ApA :@U@9`@3!@)@?6dB*ID.G5(@/M@- @o@9?j&gmaӵ=QlQ篿Uq?@U}@ @ƿƒ gNe?F@%:[.:\5Fb@2@AEA-A[rAR+OAD;A+;A%!@@8z@Za|"O +CR\A%A%A&@~!@*)0=''Jum,&H].<2 4@/:@@P@;,lY@*8@NaZžc%lG} 1ؾs}o/!5CDJN;vl䏿#|'tL&A˿PTֿ~ֿL4x|Q13[Y=_%r_`?6\|iB`zX}}ھLښH"4=''3 r ),]65z/Eࡢ!iۿ[¿^ƿoڿvP5+cIɎWz't)׿+鿚`Yn&DìdR\JN1#rx*߿(c<`ۿ3BKÔ`뿝ڐYۣE օRԣ I[Կxd, /Dwqο?qHUn5tۿRѪ@k lp(m1ݾN>] l##a @*` m{q_*+Ou0 14)ÿ67G=u񿼦ǿI싿ҝGYy=s$i㔿ΊAξ{q ppE\ݾ=D?Ϳ贿޿jVտֿ҆Hb[u< bI;E(S¾tw-DňuϿ翞l}i Lc?uc/k'Zw׿|G鿙˿rؓ>N>eR>K¸>;O/4{蚵x[(D+$ɿ^Կ뼿BYſ~a_@ӿ KA'XMK%b sEbq=xe a/C[ Y㈿A\r&.-쾰ǾlGjvE!?4?BWb?7?>t=WLI?P+fQ֨_Xj߿oC}j-mFS/xq]B^#]=>1>p?.MUI4:C{wpf> ]>>Q>?(?%@?H>Y>2 tX =>Qu>>6\*)K??)5 ȿlYerp X~iZ;q3;=A>?#}?K-C?k?~d???0w?Pcܽ>\?#?i?)%L 46?H҆?b??A>@]@@ ?ݫC??+?eԤGk5?꿔d"O|?Rܲ?ej?ϵ?e?@@\N@k +y=?=??g@ @&@c@ "@?v,?T?A}>V^(oi숊?wQ?&@5@?*T=\_@l@f@K:@==?|?<\] iy7R(^:Lv/dJj(@?:??9@a@-,.@=@Y@e@m4"?XP[?@@D%-@U@g@m@Z @2@?%>.9qʿ5h?޳@ ȁ@Y`@;??9@v@@B@Q`@ ?Pu.tOXm W;ϧU1}r<}>$?@ 1@A@iL@1@Dn@-[@fi=w09?2?@@M@$@@Q@@*@hV^@2?=9= ɿۍ.?#@F@@q14?#@c@@:N@+@'.?F}u=jG ŷduBg`%?@(e&@zH@6@$@՘@q@ 9_[5ƿb>wz?@`N@t@8@ׂ@@[@c@M[$?TA]n08(?@d"@t@>+"ɿA,/A@rT@_H@7Rb? ቿD 'I&78p :U9a3")@6?d@B*@@I@DA.AG4A(/M- o9l?&@gm@a@ӵAA}#AxO5A5_@@v5XAnqA)y@ޠu@ckA+AA6%AtAM+/A@V@]C]CVM+/t6%+A+A+AAA6%A6%AtAtAM+/AM+/AA@V@V@]C@]C'6'6]C]CVVM+/M+/tt6%6%++}#<>0%v5X5_xO5ckޠu)ynq@d:@^&@QMP@>)@%D@Qh?p?>]oYSl+*?G8nMG[@࿴ռA+#]AmgQAfFAWP.AAA&Ao@m@j ?G6 b+EZ2@@д@ @U@?@Tb@ Fd?ľeS'/m2fVA'/AMAK@@FA@@O?yݲ )l,N`@t@ks@[<@Dc@'@?]T?[>C3p4r ,\4O3cCepeJ@A3a\1ټAtɺtI#AiAWgA?*A @@\@2_=Q&yw=CHVNh@X@z@G@ˏ@~@4G?>p2adPˌ~ޔA+AJVA Y@@'@@G><،g8IMُ(@}ܸ@pr@[@@b@.?G?/? [aL l.kMLe׊wb_X@A7>#;=.AwezAjAVA;A@9_@@ lS `%!)G_̼p@F@ѡ<@ @^@^G@ ?XDfpKӨz▁yA,tA'A@B@DA@VN?|7#/-v(4+6%tM+/V]C*)E@]C@VAAM+/AtA6%AA+++6%6%ttM+/M+/VV]C]C**+k**+k@]C@]C@V@VAAAM+/AM+/AtAtA6%A6%AAA+A+d:^&QMP>)%DQhp]>o?YSk?+?*@?G@8n@MG@[࿴@ռ+A#]mAgQfFWP.A&omj ?@G@6A bA+AEAZ2д U?Tb Fd>e?S@'/@m2@f@@V'/MKFAO쮿y>ݲ@ )@l@@,ANA`tks[3?r? ,@\@4@O3@cCe@peJ@3a\A1ټtɺAtI#iWg?* \2_ؽQ@&@y@AwA=CHAVNAhXyGˏ~4Gžp?1@@a@d@P@ˌ~@ޔ+JV Y'G?[a?L@ l@.k@ML@e׊@wb^@X@7>#A;=.weAzjV;9^ ?l@S @`%A!A)AGA_̼ApFѡ; ^^G XD??fp@K@@Ө@z@▁@y,t'BDAVN|?7#@/@-@AAvA(A4AAAAAA@Va@܍hA+ Ap.AqqA,_^@ۇ@RsAqA-@@V[#AsPA/A@(@[AuhA3Y(@y@ikɿjoD͚oA(dAtAx@|*@@87?^H Jԡ^cM;r*q51_@b@U"X@@@&@?@?y_>S},kZ$|>SaiR@*A/,92 AqrAe!sARH A9 A.@F@@#x+=x!q?6iWhjh@@@ P@@@M@R??:]aF^k) S0DVRGZ@\A+-WAooϱAcSAQgA8ƖA@/(@ @L 1\ ^S;Se9@J@$@/n@%@Q@?oOe99,kLr} bONȓc׿"A#6AA{@ڴa@@_3?ъ⾉ M%Z a&(@S@J@;?@&G6@ AU???!=Nu&.ο P""W8HSRF@"HA**AmknAb2AO1A7ZA4@@@463. ;&R[d&@Ğ@@@@ZM@? }k&Pac+B&E+MA!AA@ڧp@@cP_?ܑ!x,bvK,w dI8<*L#@KY-@>$@*-@?q??JJ:>aelֿƱ/AMSDY@GdA)X)An8m#Ad~AScA;܃A@#@u@9>߿O6> OaD@E@ @@@O@ 2l?zj\##xg|fd ЧA"5AA{@ޥ!@~@nc?7=/i?0-܌ !W@]@].@VHQ@I@5[@?:?3?d>-羜?fwֿ܆ 5I/g@!EoA(8)/AioA\AHA.mzAp@jV@U?t|n(am@c%%AbWqf@ @Đ@U@H@o@+º?>wẐIK@yΈqrA|A A'>@Կ2@@Ws? ׾ V}>rm9V("+6%tM+/V]C*)E@]C@VAAM+/AtA6%AA++++++6%6%6%6%6%tttttM+/M+/M+/M+/M+/VVVVV]C]C]C]C]C**+k**+k*)**+k**+k@]C@]C@]C@]C@]C@V@V@V@V@VAAAAAAM+/AM+/AM+/AM+/AM+/AtAtAtAtAtA6%A6%A6%A6%A6%AAAAAA+A+A+A+A+tObsH)*r/˿G4C?n^??k@"@B@]E@pG@}c @@37A:oDsDuAwlfwQŪ7(ym"??=@\ @AA)KAFHA].An2]*I:Fe*k?j@@oC@@@@͚@o(dsx|*87ɿ^H? @Jԡ@^@cMA:AqA*qA51_bU"W@&߿@ɿy_S>},?kZ?@@$|@>@S@a@iR*@/,9A2 qAre!sRH 9 .F#>x+@=x@@A!qA?6iAWAhjh@ PMR>:]a?F?^j?) @S@0@DV@RG@Z@\+A-WoAoϱcSQg8ƕ/( L> @1\@@ ^ASA;ASAe9J$/n%QoM>e?98@,kK@r} @b@ON@ȓb@׿"#6{ڴa_3ъ>@ M@@%@YA aAA&(SJ;?&G5 AT!ĽNu%?.??@P@""V@8@HS@RF"@H*A*mkAnb2O17Z44>6@3.@ @AA;%AR[Ad&ĝZM腿 |=l?&O@@ac@+@B@&D@+L!ڧpcP^ܑ>!y@,a@vK+@w@dHA8#*+ؿnJJ7a>e?l ??@ư@/@A@M@SDYF@d)XA)n7Am#d~Sc;܃#u9߿@@@OAA6> AOAaDD O 2kzh>\?@##w@g|@f@c@ @Ч"5{ޥ }nc6/?@i?@0-@܌A AA!W]]-VHPI5Y:ʿ3d->??fw??܄@ @5@I/g!@Eo(8A)/iAo\H.mzpjUUt{?n'@am@@AcA%$AAaAWqAf ĐTHo+¹ w?Z@@IK@@x@Έ@q@r| '=Կ0Wr >@ V@}=@r@m8AUA(A"n!? ?[a@8;Ȉ=Nx`{ݛ,8wM=þrY "xa6ؿ-GMM)-vɾcLݿi0⾃$VsFiJM־$,D/ݾjS0Usݿ;ۡ1b b9F*i~ue@]C@VAAM+/AtA6%AA+AA+AA6%AtAM+/A@V@]CE*(`#]ߟɿsdGj5ʌX>=>}P>Ţ>}>mWw,O뿪eoחj,MBX@??j?u ?5m(|%$T͡{<0 @@7?>???N>$ƾ9y.d% ~@f1@1@.???Ѫ>྅C-@Vz㿔| I@@K@XcF@ ?? e%U=[q J}c CM1VáA@#@{ @!Ss??9>!8y*3T^@A%@@w@/??`W><#b/s߾wb$ m+A2@@@8Q??Б?>>k= = DHp>]G>>'=2rA8:@B@S@1ZK????ύ?=x A/gv@柩@@$T?R|?? ?9?H??_?9I=A ʒ@A@~Z@?S?À?G??H)?%?)?)t=A &;@*@\P?$?UQ?8??/?ZI?T?'??Ê='@Y@Z@2??m}?s~?m$v??Ď????P%=s@`#@i@??"?,pF?Hy???`?{4?E?Y[=E@0Z)@?=?8Z y]ZV>ݛ=`wNwȈ??M<>v>,8?x`?? ">rZ?M?G?->6??v?)->M??i0?L>c?JM?Fk?Vs>$?/?D?$,>?s?S?S,>j?1?۝?;?@F*@9@ b?b@@e@u?i~?V6?M?='?'g\? x^>u>>N:}mZ)ٙA '{Ǚ>7>M>y>>M> m`=+;{MZ FǾCQؾU>??q+?Ut?3$? K>>B:>5r n2`Twpp?Mm?=?(!? &>i>XM>?;>a羓zj ѿ'+*;A:}ŏqw[C{r=' ﲽL<=h > bDfpDSվ aO<:P=0D>#C>g.|>>v>h>\=il==g<:?/< w<=<&=| ==C=3=V (Ӿ`;e3E-S;}=0=[==">>U+>$]=>+U㦦>I?Jݿ?ѿ% b<׿zU¼ʾ7n>>N??G]?k?0?~:לsvS\Dk3}->t>2>>>q>X.h#ܾq<:>#2>>5 ?W*??3?BOk]FI-^.־c09|'>&Ճ>BUI>Xq>h?>pSG?ܿ^M?W'?ǹI* zmp5-fR=rkp>?w"?Ou?Y?=??o|Ѿ? ,c<})> >xq>eB>K>#d??s޿iL(ֿžos=6$>m>I?R{?:6??Z?t ?Xs2qPXT8qG!}U<==>!H>C>`Ґ>wE>8->ѿ(S?-$l?tR?ꄿ(e*QCB)=s>ƏS?$t ?`:?k??O?FۿXrf~ 4;\q=w>6^>G>Ȧg>??Օ?(U ֿp1Ot)C=K>6>q}?%٘?L?m??i-K\(@ѽpʽ5<<=o=>}>;>\6>u> z>Rl>n׿!NO?+zu?Q쿥?C {Zb0n(Ipwڻ, >r>g?03?bs??cv?o?~>xj_C19+=B>lV>%>݆??^?!Y?)nDS2"v IžI*B>4>*?xW?.٩?P?lj?? o9P+z:S<s==>U>D>f:8>:>gV>f>>|!?#HV?tn޿y?]"Y&3ѿ9#U=U>*>ڔ??H&?k??g???߲df.=3>a>>Օ>P??=`?#?&?>>A ,>,3>$>??>?WY?i?tS?xGU^H/xO=C =P>>O>zI!>]>>d>>1>>?d?"(a?^#yY?k,)=>>?'?N6Z?nf??,?i?Q??̗۾J7Pq_=>< ><>α>3?_?#?-?3 J?2?- 3达8U-> >f>뱔??;_?Uk?i`?w?|v?z?o߾`x<_=>0Y>zZ(>/B>[N>8>I>>~>>N>ε>+*?9(#?qIܡ~?k\(4=ٜ>?"Aq?`I-?*?~??)?Q?Ȥ]?À?6?V?Ͼ. \>!h>>s/?QN?80?P?b ?m?r+?n?cF?R־N~=>}? t?=:?k}???Z%???? j?p*}D=F|>qo>a>&?&?"ϭ?1?;?>?=A+?54?(D?z>7+?L:?d?˦?٦@ "@ @!Fb@$b@##@ԇ@@?ۤ:>'3>?*=?c?Ą??e? $?9??5??L㾷5;z>«?:K?A?p?A8??2@]@pJ@yC??]?ɇa*#>_j?/?M?s?[?????yS??q `?IrD?)@C@>ܴ:??/@!C@E@dD@{@@l@)@^@x@_q@@2 ɽB>??ſ ʐV?\??ߪ@Q@,:t@Bӕ@S}B@];@a@^@Te@DK@-{eD=M> ?Ui?ͯ2@0@uF@(@փ@ ^@*@@@؆i@U@@dC+ d?%??@@:8@To@g@s6@xk@u@k֯@ZW@B s$9?ev?@0~@eS@i@څ@*@ @k@J$@@@߾w ">|?d??خ@R@K@@&q@)j@&@C!@J@?ځ>?,@E:9@~@M?!A@CR@g@_@6AkA A&[ A* A)2A#٧A܎A $@r'>b?@M@D)@r'@Rg@D@~@Y@w@@:@Ɔ@sy`w??g3@QD@E@0@ y@zk@AJMA@ә@D@Y@=b ?O?AN?֨@_@"1@6j@Ec@N(@P@L@BU@3*@@?ʭ? H@)Zȿ@@q8p@<@/@@RA ܌A%A >wb$>>/s#`R/w%=^C>??T>3>y*̾!89!Sr{#=Vâ>M#?C?c ?J?q=U= e! XcCK=I? ?|???@V>C:ؿѦ.?1f0=~?% ???.e?y>F$Nſ;:7 = ?wRm:}Ţ}Q(=?X?ʊ?5?m?I?sj>ߟ==#G>`?*%?HV6Mѿ=''g\ x^uN}W>Z)>>ٙA? ?'{?ꧾ7MzM m`+{-=[> >F>B>Q>U=>пq+UtͿ3$տ KʾB|>>5>q? n?2`?Tv?p?qMm=(! &iXM?>>a>z>i? ?'+*?29ŏ;;w?;6;8;&= =Lh> >bE>g>pE>>S> a=O:P0E#Cg.}뾪vg\ܽhbp¼;E[5橢;D<=)=@9=?=b=xo=><:B(>e>;=e=3K=1=S<}2X۾U&$];+U>㦩?IJ?!??%?b?¼>7F9n>OG]k-~7>לv>>v>S>\D>k2=}bM,-tþ2q?>\?.h?'>>>=qȼ:#3ݾ5 W*3BO>k >]G>I-`>.>c/=8=<sgeZ@|(&ՂBUFXqh?p?SH?^NW?'ǹ?I?*!?z?mp?5->f>Rýrkqw"OuY޿=??o >|>>>? ,=c}) xq羭eBI#br??i?L?(?>o>r6$mI׿R{:6=ZtW>s2>qP>XT>8>q=G!=}B>)tƏS$t`:濊k˿O쿾G??Xr>f}>> >4;Z=q}w߾6]GȦfՕ(U ??p1?Os?)>>B=K6q|%٘Lmῃ>>i,>K[>(@=p==5<߽o};Ծ\5u yRkn?!NO+{?uQ?C?y?X?b?0n%>Ij>w;, re03bs̿̿cvo~??>v>>>j_@=1ݹ+BlV%݆޿^!Y)?nA?S?2"t? I>>I<*B4龷*xV.٩Plj>o8>P>+z>=:=Sڼ¾UDξf:5:gUfݾ|!?#H?Vҿtn?y]#?Y"?3?9>>EU侁*ڌH#k῍gͿ߿>>?>߯>d=f:,*3оaՕپNɿ=_#&??>?>>;>>,9 ,3$Ͽܿ>ſWYiȿtSxGV>^H>/=x=<OC ۽ZOzI Z焾d߾}.?>dȿ"?(_^?#yXk,)>>=ƽ)'N6Ynf,gQ>̗>F>7I=q@䐾< ;α2_#ݿ-3 H2- 2?>8>U-=ټ ƾi뱘޿;\Uii^w|vzo>`>x=ؼ_0YzZ+/D[M5I yHα)>-9&?#qI>ܡk[>(4ٜӾ"Aw`I0,)ǿOȤZÀ忸6Q>>.;[!r˾s2QN80Pb mr+ncAR>M>r־ t==k}˿西Z#ҿǿ鴿 fp(>>=A&50(Dt/?<| G?6b?C=߾+L>e˧٩ " !Fb$`##}Ԅۤ>=:'8*=cĄ`e #9ܿ5깿L><>THj+a*&_m0Ms[ǿ񿛧yOq YI}?rK$???>ܴ61!CEdD{l)\x_j@2|? =N޿<* lt8#~r&2"8N^k ;? ʖ<\ǿߪQ,:tBӔS}B]8a^TaDG-{_?>EY <7ڮ"nM$?{ $ @l?6V3?I֜Uhͯ40uF(փ ]*؆fUd ?C+= ](:7Togs4xiuk֬ZWB q?$;=ex0eTiڅ* kJ!>w< ~B|d¿خRK&q)j&C Jſځ>,?E:9@~@M?!ICWh_6k &[ * )2#٦܍ $r&>ؾlND)r'RgD~Yw:Ɔsx?`rg6QFE0 yzjJMӘDY۽bOAN֨_"16jEcN(PLBU3*ʭ I>)Z?@q8>p </R ܌%Fum75 > ~?L?9@@U@*?Ok?LLOf*U9޿L׾ ~>5>m@=žFo@?|2?W?e?YD>ŷ>{o;>/ǽ[?>>?0?ibv?@;?Ŗ?<@4@>@ s?i?A??F>A?|2᣿cWŨYD=;{o=[C/񒪿ib|-Ŗ@84ҿ: s>A¿i@ƿA@:5M@aA A,QAM\Ah*A{LAAA AAA{LAh*AM\A,QA @a@:5MIC MEί)=s8?,6?y?}݉?@5?~O;D>&?bW?Y?@^+@n0+?l??#%@d@-C;@n?@wȿ鿑Lr뿶2e#?0D?]U@@\L@}@hs A<* b[??@H@R@aA%OB܉*ao/ǿ´%>ɻ?V@ij@Ub@@A4L oy^>4LJ"=\??@3~@[2@a@|A=;Y<=-ծ=p>J">ŕ?6?iZ@Q@ZO@OAA@>i>5>>U? r?$ v?WI?q@@S@AA=pN>|?@?>Ǭ?\?a?`&?r?H?%u@Dŏ@@TA4;>Г?E[?,?(9??q?$D?E?B'@0L@e@oA&??zS??;?ѭ?p?9??.@@@A%?x??w? S?֫?V?{?k7?y?"@YI@@?1}@????d?,n?t?@A?KS??e@'@i@ŸS?@?R?O?eW@F@?JEk?@m@e@KP??idj>=|>\ ?]#?ğ@ O/>?>+?>?@>`>A>q|>}>Ax>>R>X=*=ݦ4;K;H)m5ǢM,8r+.$i}d6g=Ӿ5Ͼa¾EH?+>cg>Q>zX#2'v?.?Tr? ??ƪ_?P?=?Jo?I?p?kRN?q_?$t?3V> >M=>="~ E[ B7[oW*s0ѿʿ޿Hп@@ ?п@O2?铱?S3?@?}??u?%? ?H?TR>g>u='!=iRw!*vv^2쿡,A׿3 +dſqKP8w?@E?P??\S???1(??N???T<?]2?{W?U>,">;2y.h]ÿ Um$Ynnؿſ~z8ꏟBah?ˌ?ʔ?ɚP?Y|?z??}? ?"? ?1?m?W?]8?b?J+>">=Y=/=nfaEV2[?L7g_zqs8HῬhGᲿ?aZ??? ??;?c?k???w?:?kd?pl?G?P4?n?*g>,D>>k2>`<ԉ=8d"Ԛj?<-!bH4?'S?O?Qy?0F?u?[ ?.?§??Q}?~?>?N?6?v??e? ?~:\??]m?4?4?]_??2h>f?>y>i=>>?IO??-?ox?v^?R??v?J?L?B>~?C{>4 u>?H >Ѧ??ȗ?y?~^@ C@@"v@K@3qF@2i@?@C5@E@M@F@Q@@H@O.I@4@Fv,@#,@7et@ uT@"FI?@ Z?`?ء-?RW?Lt>?%W?ن?~@ @ a@NY@<^-@v@i~?@d@e @B@;@d@y@@@ @w@@&b@@yZ@w@@N@l)@ @@Jx?݇@??d?n<,d?@J @t@TK@rZ@,@5@̗@:B@jw@@A@@f@S@=Ag@v{@"P@jb@ @G@n@h@ʐ@G@2=@_@^@f;@??buH?oAs>T@fd@Eg@ɽA@Ah@ޣAAA "A+%vAA8A0?nA@A<hACkAB[A? ABA6A<ߨA'3A1})AA y:@4A 5@@8@{8@`?U@N\wiv?I@QF@F I@ί @AaAAB8A7EAgvAZiAAv&AAAAdAaAAAdAAAAv&AgvAZiAB8A7EAaA@ί @@QF@F I:5Ma ,QM\h*{LA A{Lh*M\,Q a:5M?ID?@@ ME?Ϋ??)s,6yʿ}݃6????O@?:?A?𘾚>b\Y^-n?0???+?=?>]#)e-C#0L]Y\N?i?s?B??<?* ]c\5eUB>q?=??6?X3>Ԗ[HR a%O>B>ܑ?*ao?/?´>ɻ(XikUb4L >o>y^>>4>LJ>"\13~[2a|=?½-կpJ"ľŕ 6ϿiZPZON@h5¾U r$ tWEqS=pM|@Կ>Ǫ\aֿ`&rҿF%qDŎT4:ГE[п+(9q$DE׿B#0Len&zS:Ѯp㿇9* $xĿv R֫W|k7u"YI1}?ܿd̿,pv@AKM?^'hŸR@<ȿ cAĒ"wROeMFJEjkeKQidp|\ ]ě O.+HmBq|}Ax߾RھXҽ*ݦ2KG=m5=Ǣ=>M->8r>.>i}O>6Z>1>>'?>a?ϸ>4?H㿊JatHWTr6'Z, 5cpQ#zy >3DP>Y>{>ߴ? 9?%?03?TeA?R?~B?pcV?>?>?K?##?'o:Tx ƪlZ=JxRpkRVqc$t3W O>ٽ"{> >D?W? B4?[?oW$?l??0??|? ??H?? ͿO2银S5A}߿v&HĿTTg׾u'!i>T>w?!?*v?v^?2?,?A?2? ?+b??@qK@P7@w}EF\L߿1"N뿕T<]2{YV,";>2Ӈ>.w?]? ?Um.?Y??n?n??̊?z?E?ꏯ?N?aqˌʔ׿ɚ=Yjz鿳}ſ"1jW]8bJ-"Y
"+types+"
";};x3dom.docs.getComponentInfo=function(){var components=[];var component;var result="";var c,cn;for(c in x3dom.components){components.push(c);} components.sort();for(cn in components){c=components[cn];component=x3dom.components[c];result+="

"+ c+"

";result+="
    ";for(var t in component){result+="
  • "+ t+"
  • ";} result+="
";} return result;};x3dom.shader={};x3dom.shader.PICKING="picking";x3dom.shader.PICKING_24="picking24";x3dom.shader.PICKING_ID="pickingId";x3dom.shader.PICKING_COLOR="pickingColor";x3dom.shader.PICKING_TEXCOORD="pickingTexCoord";x3dom.shader.FRONTGROUND_TEXTURE="frontgroundTexture";x3dom.shader.BACKGROUND_TEXTURE="backgroundTexture";x3dom.shader.BACKGROUND_SKYTEXTURE="backgroundSkyTexture";x3dom.shader.BACKGROUND_CUBETEXTURE="backgroundCubeTexture";x3dom.shader.BLUR="blur";x3dom.shader.DEPTH="depth";x3dom.shader.NORMAL="normal";x3dom.shader.TEXTURE_REFINEMENT="textureRefinement";x3dom.shader.SSAO="ssao";x3dom.shader.material=function(){var shaderPart="uniform vec3 diffuseColor;\n"+"uniform vec3 specularColor;\n"+"uniform vec3 emissiveColor;\n"+"uniform float shininess;\n"+"uniform float transparency;\n"+"uniform float ambientIntensity;\n";return shaderPart;};x3dom.shader.twoSidedMaterial=function(){var shaderPart="uniform vec3 backDiffuseColor;\n"+"uniform vec3 backSpecularColor;\n"+"uniform vec3 backEmissiveColor;\n"+"uniform float backShininess;\n"+"uniform float backTransparency;\n"+"uniform float backAmbientIntensity;\n";return shaderPart;};x3dom.shader.fog=function(){var shaderPart="uniform vec3 fogColor;\n"+"uniform float fogType;\n"+"uniform float fogRange;\n"+"varying vec3 fragEyePosition;\n"+"float calcFog(in vec3 eye) {\n"+" float f0 = 0.0;\n"+" if(fogType == 0.0) {\n"+" if(length(eye) < fogRange){\n"+" f0 = (fogRange-length(eye)) / fogRange;\n"+" }\n"+" }else{\n"+" if(length(eye) < fogRange){\n"+" f0 = exp(-length(eye) / (fogRange-length(eye) ) );\n"+" }\n"+" }\n"+" f0 = clamp(f0, 0.0, 1.0);\n"+" return f0;\n"+"}\n";return shaderPart;};x3dom.shader.clipPlanes=function(numClipPlanes){var shaderPart="",c;for(c=0;c= lCutOffAngle) return 0.0;\n"+" else if(spotAngle <= lBeamWidth) return attenuation;\n"+" else return attenuation * (spotAngle - lCutOffAngle) / (lBeamWidth - lCutOffAngle);\n"+" }\n"+"}\n";shaderPart+="void getShadowValues(inout vec4 shadowMapValues, inout float viewSampleDepth, in mat4 lightMatrix, in vec4 worldCoords, in sampler2D shadowMap){\n"+" vec4 lightSpaceCoords = lightMatrix*worldCoords;\n"+" vec3 lightSpaceCoordsCart = lightSpaceCoords.xyz / lightSpaceCoords.w;\n"+" vec2 textureCoords = (lightSpaceCoordsCart.xy + 1.0)*0.5;\n"+" viewSampleDepth = lightSpaceCoordsCart.z;\n"+" shadowMapValues = texture2D(shadowMap, textureCoords);\n";if(!x3dom.caps.FP_TEXTURES||x3dom.caps.MOBILE) shaderPart+=" shadowMapValues = vec4(1.0,1.0,unpackDepth(shadowMapValues),1.0);\n";shaderPart+="}\n";shaderPart+="void getShadowValuesPointLight(inout vec4 shadowMapValues, inout float viewSampleDepth, in vec3 lLocation, in vec4 worldCoords, in mat4 lightViewMatrix,"+"in mat4 lMatrix_0, in mat4 lMatrix_1, in mat4 lMatrix_2, in mat4 lMatrix_3, in mat4 lMatrix_4, in mat4 lMatrix_5,"+"in sampler2D shadowMap_0, in sampler2D shadowMap_1, in sampler2D shadowMap_2, in sampler2D shadowMap_3,"+"in sampler2D shadowMap_4, in sampler2D shadowMap_5){\n"+" vec4 transformed = lightViewMatrix * worldCoords;\n"+" vec3 lightVec = normalize(transformed.xyz/transformed.w);\n"+" vec3 lightVecAbs = abs(lightVec);\n"+" float maximum = max(max(lightVecAbs.x, lightVecAbs.y),lightVecAbs.z);\n"+" if (lightVecAbs.x == maximum) {\n"+" if (lightVec.x < 0.0) getShadowValues(shadowMapValues, viewSampleDepth, lMatrix_3,worldCoords,shadowMap_3);\n"+" else getShadowValues(shadowMapValues, viewSampleDepth, lMatrix_1,worldCoords,shadowMap_1);\n"+" }\n"+" else if (lightVecAbs.y == maximum) {\n"+" if (lightVec.y < 0.0) getShadowValues(shadowMapValues, viewSampleDepth, lMatrix_4,worldCoords,shadowMap_4);\n"+" else getShadowValues(shadowMapValues, viewSampleDepth, lMatrix_5,worldCoords,shadowMap_5);\n"+" }\n"+" else if (lightVec.z < 0.0) getShadowValues(shadowMapValues, viewSampleDepth, lMatrix_0,worldCoords,shadowMap_0);\n"+" else getShadowValues(shadowMapValues, viewSampleDepth, lMatrix_2,worldCoords,shadowMap_2);\n"+"}\n";shaderPart+="void getShadowValuesCascaded(inout vec4 shadowMapValues, inout float viewSampleDepth, in vec4 worldCoords, in float eyeDepth, in mat4 lMatrix_0, in mat4 lMatrix_1, in mat4 lMatrix_2,"+"in mat4 lMatrix_3, in mat4 lMatrix_4, in mat4 lMatrix_5, in sampler2D shadowMap_0, in sampler2D shadowMap_1, in sampler2D shadowMap_2,"+"in sampler2D shadowMap_3, in sampler2D shadowMap_4, in sampler2D shadowMap_5, in float split_0, in float split_1, in float split_2, in float split_3, in float split_4){\n"+" if (eyeDepth < split_0) getShadowValues(shadowMapValues, viewSampleDepth, lMatrix_0, worldCoords, shadowMap_0);\n"+" else if (eyeDepth < split_1) getShadowValues(shadowMapValues, viewSampleDepth, lMatrix_1, worldCoords, shadowMap_1);\n"+" else if (eyeDepth < split_2) getShadowValues(shadowMapValues, viewSampleDepth, lMatrix_2, worldCoords, shadowMap_2);\n"+" else if (eyeDepth < split_3) getShadowValues(shadowMapValues, viewSampleDepth, lMatrix_3, worldCoords, shadowMap_3);\n"+" else if (eyeDepth < split_4) getShadowValues(shadowMapValues, viewSampleDepth, lMatrix_4, worldCoords, shadowMap_4);\n"+" else getShadowValues(shadowMapValues, viewSampleDepth, lMatrix_5, worldCoords, shadowMap_5);\n"+"}\n";shaderPart+="float ESM(float shadowMapDepth, float viewSampleDepth, float offset){\n";if(!x3dom.caps.FP_TEXTURES||x3dom.caps.MOBILE) shaderPart+=" return exp(-80.0*(1.0-offset)*(viewSampleDepth - shadowMapDepth));\n";else shaderPart+=" return shadowMapDepth * exp(-80.0*(1.0-offset)*viewSampleDepth);\n";shaderPart+="}\n";shaderPart+="float VSM(vec2 moments, float viewSampleDepth, float offset){\n"+" viewSampleDepth = (viewSampleDepth + 1.0) * 0.5;\n"+" if (viewSampleDepth <= moments.x) return 1.0;\n"+" float variance = moments.y - moments.x * moments.x;\n"+" variance = max(variance, 0.00002 + offset*0.01);\n"+" float d = viewSampleDepth - moments.x;\n"+" return variance/(variance + d*d);\n"+"}\n";return shaderPart;};x3dom.shader.light=function(numLights){var shaderPart="";for(var l=0;l= lCutOffAngle) spot = 0.0;\n"+" else if(spotAngle <= lBeamWidth) spot = 1.0;\n"+" else spot = (spotAngle - lCutOffAngle ) / (lBeamWidth - lCutOffAngle);\n"+" }\n"+" }\n"+" vec3 H = normalize( L + V );\n"+" float NdotL = clamp(dot(L, N), 0.0, 1.0);\n"+" float NdotH = clamp(dot(H, N), 0.0, 1.0);\n"+" float ambientFactor = lAmbientIntensity * ambIntensity;\n"+" float diffuseFactor = lIntensity * NdotL;\n"+" float specularFactor = lIntensity * pow(NdotH, shin*128.0);\n"+" return vec3(ambientFactor, diffuseFactor, specularFactor) * attentuation * spot;\n"+"}\n";return shaderPart;};x3dom.shader.TBNCalculation=function(){var shaderPart="";shaderPart+="mat3 cotangent_frame(vec3 N, vec3 p, vec2 uv)\n"+"{\n"+" // get edge vectors of the pixel triangle\n"+" vec3 dp1 = dFdx( p );\n"+" vec3 dp2 = dFdy( p );\n"+" vec2 duv1 = dFdx( uv );\n"+" vec2 duv2 = dFdy( uv );\n"+"\n"+" // solve the linear system\n"+" vec3 dp2perp = cross( dp2, N );\n"+" vec3 dp1perp = cross( N, dp1 );\n"+" vec3 T = dp2perp * duv1.x + dp1perp * duv2.x;\n"+" vec3 B = dp2perp * duv1.y + dp1perp * duv2.y;\n"+"\n"+" // construct a scale-invariant frame\n"+" float invmax = inversesqrt( max( dot(T,T), dot(B,B) ) );\n"+" return mat3( T * invmax, B * invmax, N );\n"+"}\n\n";shaderPart+="vec3 perturb_normal( vec3 N, vec3 V, vec2 texcoord )\n"+"{\n"+" // assume N, the interpolated vertex normal and\n"+" // V, the view vector (vertex to eye)\n"+" vec3 map = texture2D(normalMap, texcoord ).xyz;\n"+" map = 2.0 * map - 1.0;\n"+" mat3 TBN = cotangent_frame(N, -V, texcoord);\n"+" return normalize(TBN * map);\n"+"}\n\n";return shaderPart;};x3dom.shader.DynamicShader=function(gl,properties) {this.program=gl.createProgram();var vertexShader=this.generateVertexShader(gl,properties);var fragmentShader=this.generateFragmentShader(gl,properties);gl.attachShader(this.program,vertexShader);gl.attachShader(this.program,fragmentShader);gl.bindAttribLocation(this.program,0,"position");gl.linkProgram(this.program);return this.program;};x3dom.shader.DynamicShader.prototype.generateVertexShader=function(gl,properties) {var shader="";shader+="uniform mat4 modelViewMatrix;\n";shader+="uniform mat4 modelViewProjectionMatrix;\n";if(properties.POSCOMPONENTS==3){shader+="attribute vec3 position;\n";}else if(properties.POSCOMPONENTS==4){shader+="attribute vec4 position;\n";} if(properties.IMAGEGEOMETRY){shader+="uniform vec3 IG_bboxMin;\n";shader+="uniform vec3 IG_bboxMax;\n";shader+="uniform float IG_coordTextureWidth;\n";shader+="uniform float IG_coordTextureHeight;\n";shader+="uniform vec2 IG_implicitMeshSize;\n";for(var i=0;i= 0.0) ? val : -1.0 * val);\n"+"}"+"\n"+"void main(void) {\n"+" vec3 normal = -reflect(normalize(fragNormal), vec3(0.0,0.0,1.0));\n"+" if (magn(normal.y) >= magn(normal.x) && magn(normal.y) >= magn(normal.z))\n"+" normal.xz = -normal.xz;\n"+" gl_FragColor = textureCube(tex, normal);\n"+"}\n";var fragmentShader=gl.createShader(gl.FRAGMENT_SHADER);gl.shaderSource(fragmentShader,shader);gl.compileShader(fragmentShader);if(!gl.getShaderParameter(fragmentShader,gl.COMPILE_STATUS)){x3dom.debug.logError("[BackgroundCubeTextureShader] FragmentShader "+gl.getShaderInfoLog(fragmentShader));} return fragmentShader;};x3dom.shader.ShadowRenderingShader=function(gl,shadowedLights) {this.program=gl.createProgram();var vertexShader=this.generateVertexShader(gl);var fragmentShader=this.generateFragmentShader(gl,shadowedLights);gl.attachShader(this.program,vertexShader);gl.attachShader(this.program,fragmentShader);gl.bindAttribLocation(this.program,0,"position");gl.linkProgram(this.program);return this.program;};x3dom.shader.ShadowRenderingShader.prototype.generateVertexShader=function(gl) {var shader="";shader+="attribute vec2 position;\n";shader+="varying vec2 vPosition;\n";shader+="void main(void) {\n";shader+=" vPosition = position;\n";shader+=" gl_Position = vec4(position, -1.0, 1.0);\n";shader+="}\n";var vertexShader=gl.createShader(gl.VERTEX_SHADER);gl.shaderSource(vertexShader,shader);gl.compileShader(vertexShader);if(!gl.getShaderParameter(vertexShader,gl.COMPILE_STATUS)){x3dom.debug.logError("[ShadowRendering] VertexShader "+gl.getShaderInfoLog(vertexShader));} return vertexShader;};x3dom.shader.ShadowRenderingShader.prototype.generateFragmentShader=function(gl,shadowedLights) {var shader="#ifdef GL_FRAGMENT_PRECISION_HIGH\n";shader+="precision highp float;\n";shader+="#else\n";shader+=" precision mediump float;\n";shader+="#endif\n\n";shader+="uniform mat4 inverseViewProj;\n";shader+="uniform mat4 inverseProj;\n";shader+="varying vec2 vPosition;\n";shader+="uniform sampler2D sceneMap;\n";for(var i=0;i<5;i++) shader+="uniform float cascade"+i+"_Depth;\n";for(var l=0;l=0||navigator.appVersion.indexOf("Mobile")>-1||x3dom.caps.MAX_VARYING_VECTORS<=8||x3dom.caps.MAX_VERTEX_TEXTURE_IMAGE_UNITS<2){x3dom.caps.MOBILE=true;} if(x3dom.caps.MOBILE){if(forbidMobileShaders){x3dom.caps.MOBILE=false;x3dom.debug.logWarning("Detected mobile graphics card! "+"But being forced to desktop shaders which might not work!");} else{x3dom.debug.logWarning("Detected mobile graphics card! "+"Using low quality shaders without ImageGeometry support!");}} else{if(forceMobileShaders){x3dom.caps.MOBILE=true;x3dom.debug.logWarning("Detected desktop graphics card! "+"But being forced to mobile shaders with lower quality!");}}} catch(ex){x3dom.debug.logWarning("Your browser probably supports an older WebGL version. "+"Please try the old mobile runtime instead:\n"+"http://www.x3dom.org/x3dom/src_mobile/x3dom.js");newCtx=null;} return newCtx;}} catch(e){x3dom.debug.logWarning(e);}} return null;} Context.prototype.setupShape=function(gl,drawable,viewarea){var q=0,q6;var textures,t;var vertices,positionBuffer;var texCoordBuffer,normalBuffer,colorBuffer;var indicesBuffer,indexArray;var shape=drawable.shape;var geoNode=shape._cf.geometry.node;if(shape._webgl!==undefined){var needFullReInit=false;if(shape._dirty.colors===true&&shape._webgl.shader.color===undefined&&geoNode._mesh._colors[0].length){needFullReInit=true;} if(needFullReInit&&shape._cleanupGLObjects){shape._cleanupGLObjects(true,false);} if(shape._dirty.texture===true){if(shape._webgl.texture.length!=shape.getTextures().length){for(t=0;t65535)){indexArray=new Uint32Array(shape._webgl.indexes[q]);shape._webgl.indexType=gl.UNSIGNED_INT;} else{indexArray=new Uint16Array(shape._webgl.indexes[q]);shape._webgl.indexType=gl.UNSIGNED_SHORT;} gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER,indicesBuffer);gl.bufferData(gl.ELEMENT_ARRAY_BUFFER,indexArray,gl.STATIC_DRAW);indexArray=null;shape._webgl.positions[q]=geoNode._mesh._positions[q];gl.deleteBuffer(shape._webgl.buffers[q6+1]);positionBuffer=gl.createBuffer();shape._webgl.buffers[q6+1]=positionBuffer;gl.bindBuffer(gl.ARRAY_BUFFER,positionBuffer);gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER,shape._webgl.buffers[q6]);vertices=new Float32Array(shape._webgl.positions[q]);gl.bufferData(gl.ARRAY_BUFFER,vertices,gl.STATIC_DRAW);gl.bindBuffer(gl.ARRAY_BUFFER,positionBuffer);gl.vertexAttribPointer(shape._webgl.shader.position,geoNode._mesh._numPosComponents,shape._webgl.coordType,false,shape._coordStrideOffset[0],shape._coordStrideOffset[1]);vertices=null;} shape._dirty.positions=false;shape._dirty.indexes=false;} if(shape._dirty.colors==true){if(shape._webgl.shader.color!==undefined){shape._webgl.colors[q]=geoNode._mesh._colors[q];gl.deleteBuffer(shape._webgl.buffers[q6+4]);colorBuffer=gl.createBuffer();shape._webgl.buffers[q6+4]=colorBuffer;colors=new Float32Array(shape._webgl.colors[q]);gl.bindBuffer(gl.ARRAY_BUFFER,colorBuffer);gl.bufferData(gl.ARRAY_BUFFER,colors,gl.STATIC_DRAW);gl.vertexAttribPointer(shape._webgl.shader.color,geoNode._mesh._numColComponents,shape._webgl.colorType,false,shape._colorStrideOffset[0],shape._colorStrideOffset[1]);colors=null;} shape._dirty.colors=false;} if(shape._dirty.normals==true){if(shape._webgl.shader.normal!==undefined){shape._webgl.normals[q]=geoNode._mesh._normals[q];gl.deleteBuffer(shape._webgl.buffers[q6+2]);normalBuffer=gl.createBuffer();shape._webgl.buffers[q6+2]=normalBuffer;normals=new Float32Array(shape._webgl.normals[q]);gl.bindBuffer(gl.ARRAY_BUFFER,normalBuffer);gl.bufferData(gl.ARRAY_BUFFER,normals,gl.STATIC_DRAW);gl.vertexAttribPointer(shape._webgl.shader.normal,geoNode._mesh._numNormComponents,shape._webgl.normalType,false,shape._normalStrideOffset[0],shape._normalStrideOffset[1]);normals=null;} shape._dirty.normals=false;} if(shape._dirty.texcoords==true){if(shape._webgl.shader.texcoord!==undefined){shape._webgl.texcoords[q]=geoNode._mesh._texCoords[q];gl.deleteBuffer(shape._webgl.buffers[q6+3]);texCoordBuffer=gl.createBuffer();shape._webgl.buffers[q6+3]=texCoordBuffer;texCoords=new Float32Array(shape._webgl.texcoords[q]);gl.bindBuffer(gl.ARRAY_BUFFER,texCoordBuffer);gl.bufferData(gl.ARRAY_BUFFER,texCoords,gl.STATIC_DRAW);gl.vertexAttribPointer(shape._webgl.shader.texCoord,geoNode._mesh._numTexComponents,shape._webgl.texCoordType,false,shape._texCoordStrideOffset[0],shape._texCoordStrideOffset[1]);texCoords=null;} shape._dirty.texcoords=false;} if(shape._dirty.specialAttribs==true){if(shape._webgl.shader.particleSize!==undefined){var szArr=geoNode._vf.size.toGL();if(szArr.length){gl.deleteBuffer(shape._webgl.buffers[q6+5]);shape._webgl.buffers[q6+5]=gl.createBuffer();gl.bindBuffer(gl.ARRAY_BUFFER,shape._webgl.buffers[q6+5]);gl.bufferData(gl.ARRAY_BUFFER,new Float32Array(szArr),gl.STATIC_DRAW);} shape._dirty.specialAttribs=false;}}}} else {} if(shape._webgl.imageGeometry!=0){for(t=0;t0&&force)||this._parentNodes.length==0)) {var sp=this._webgl.shader;for(var q=0;q65535)){indexArray=new Uint32Array(shape._webgl.indexes[q]);shape._webgl.indexType=gl.UNSIGNED_INT;} else{indexArray=new Uint16Array(shape._webgl.indexes[q]);shape._webgl.indexType=gl.UNSIGNED_SHORT;} gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER,indicesBuffer);gl.bufferData(gl.ELEMENT_ARRAY_BUFFER,indexArray,gl.STATIC_DRAW);indexArray=null;positionBuffer=gl.createBuffer();shape._webgl.buffers[q6+1]=positionBuffer;gl.bindBuffer(gl.ARRAY_BUFFER,positionBuffer);vertices=new Float32Array(shape._webgl.positions[q]);gl.bufferData(gl.ARRAY_BUFFER,vertices,gl.STATIC_DRAW);gl.bindBuffer(gl.ARRAY_BUFFER,positionBuffer);gl.vertexAttribPointer(sp.position,geoNode._mesh._numPosComponents,shape._webgl.coordType,false,shape._coordStrideOffset[0],shape._coordStrideOffset[1]);gl.enableVertexAttribArray(sp.position);vertices=null;} if(sp.normal!==undefined||shape._webgl.normals[q]){normalBuffer=gl.createBuffer();shape._webgl.buffers[q6+2]=normalBuffer;var normals=new Float32Array(shape._webgl.normals[q]);gl.bindBuffer(gl.ARRAY_BUFFER,normalBuffer);gl.bufferData(gl.ARRAY_BUFFER,normals,gl.STATIC_DRAW);gl.vertexAttribPointer(sp.normal,geoNode._mesh._numNormComponents,shape._webgl.normalType,false,shape._normalStrideOffset[0],shape._normalStrideOffset[1]);gl.enableVertexAttribArray(sp.normal);normals=null;} if(sp.texcoord!==undefined){var texcBuffer=gl.createBuffer();shape._webgl.buffers[q6+3]=texcBuffer;var texCoords=new Float32Array(shape._webgl.texcoords[q]);gl.bindBuffer(gl.ARRAY_BUFFER,texcBuffer);gl.bufferData(gl.ARRAY_BUFFER,texCoords,gl.STATIC_DRAW);gl.vertexAttribPointer(sp.texcoord,geoNode._mesh._numTexComponents,shape._webgl.texCoordType,false,shape._texCoordStrideOffset[0],shape._texCoordStrideOffset[1]);gl.enableVertexAttribArray(sp.texcoord);texCoords=null;} if(sp.color!==undefined){colorBuffer=gl.createBuffer();shape._webgl.buffers[q6+4]=colorBuffer;var colors=new Float32Array(shape._webgl.colors[q]);gl.bindBuffer(gl.ARRAY_BUFFER,colorBuffer);gl.bufferData(gl.ARRAY_BUFFER,colors,gl.STATIC_DRAW);gl.vertexAttribPointer(sp.color,geoNode._mesh._numColComponents,shape._webgl.colorType,false,shape._colorStrideOffset[0],shape._colorStrideOffset[1]);gl.enableVertexAttribArray(sp.color);colors=null;} if(sp.particleSize!==undefined){var sizeArr=geoNode._vf.size.toGL();if(sizeArr.length){var sizeBuffer=gl.createBuffer();shape._webgl.buffers[q6+5]=sizeBuffer;gl.bindBuffer(gl.ARRAY_BUFFER,sizeBuffer);gl.bufferData(gl.ARRAY_BUFFER,new Float32Array(sizeArr),gl.STATIC_DRAW);}}} for(var df in geoNode._mesh._dynamicFields) {if(!geoNode._mesh._dynamicFields.hasOwnProperty(df)) continue;var attrib=geoNode._mesh._dynamicFields[df];shape._webgl.dynamicFields[currAttribs]={buf:{},name:df,numComponents:attrib.numComponents};if(sp[df]!==undefined){var attribBuffer=gl.createBuffer();shape._webgl.dynamicFields[currAttribs++].buf=attribBuffer;var attribs=new Float32Array(attrib.value);gl.bindBuffer(gl.ARRAY_BUFFER,attribBuffer);gl.bufferData(gl.ARRAY_BUFFER,attribs,gl.STATIC_DRAW);gl.vertexAttribPointer(sp[df],attrib.numComponents,gl.FLOAT,false,0,0);attribs=null;}}}};Context.prototype.setupScene=function(gl,bgnd){var sphere=null;var texture=null;var that=this;if(bgnd._webgl!==undefined){if(!bgnd._dirty){return;} if(bgnd._webgl.texture!==undefined&&bgnd._webgl.texture){gl.deleteTexture(bgnd._webgl.texture);} if(bgnd._cleanupGLObjects){bgnd._cleanupGLObjects();} bgnd._webgl={};} bgnd._dirty=false;var url=bgnd.getTexUrl();var i=0;var w=1,h=1;if(url.length>0&&url[0].length>0){if(url.length>=6&&url[1].length>0&&url[2].length>0&&url[3].length>0&&url[4].length>0&&url[5].length>0){sphere=new x3dom.nodeTypes.Sphere();bgnd._webgl={positions:sphere._mesh._positions[0],indexes:sphere._mesh._indices[0],buffers:[{},{}]};bgnd._webgl.primType=gl.TRIANGLES;bgnd._webgl.shader=this.cache.getShader(gl,x3dom.shader.BACKGROUND_CUBETEXTURE);bgnd._webgl.texture=x3dom.Utils.createTextureCube(gl,bgnd._nameSpace.doc,url,true,bgnd._vf.crossOrigin,true,false);} else{bgnd._webgl={positions:[-w,-h,0,-w,h,0,w,-h,0,w,h,0],indexes:[0,1,2,3],buffers:[{},{}]};url=bgnd._nameSpace.getURL(url[0]);bgnd._webgl.texture=x3dom.Utils.createTexture2D(gl,bgnd._nameSpace.doc,url,true,bgnd._vf.crossOrigin,true,false);bgnd._webgl.primType=gl.TRIANGLE_STRIP;bgnd._webgl.shader=this.cache.getShader(gl,x3dom.shader.BACKGROUND_TEXTURE);}} else{if(bgnd.getSkyColor().length>1||bgnd.getGroundColor().length){sphere=new x3dom.nodeTypes.Sphere();texture=gl.createTexture();bgnd._webgl={positions:sphere._mesh._positions[0],texcoords:sphere._mesh._texCoords[0],indexes:sphere._mesh._indices[0],buffers:[{},{},{}],texture:texture,primType:gl.TRIANGLES};var N=x3dom.Utils.nextHighestPowerOfTwo(bgnd.getSkyColor().length+bgnd.getGroundColor().length+2);N=(N<512)?512:N;var n=bgnd._vf.groundAngle.length;var tmp=[],arr=[];var colors=[],sky=[0];for(i=0;i0||bgnd._vf.groundColor.length==1){if(sky[sky.length-1]=0;i--){if((i==n-1)&&(Math.PI-bgnd._vf.groundAngle[i]<=Math.PI/2)){sky[sky.length]=Math.PI/2;colors[colors.length]=bgnd._vf.groundColor[bgnd._vf.groundColor.length-1];} sky[sky.length]=Math.PI-bgnd._vf.groundAngle[i];colors[colors.length]=bgnd._vf.groundColor[i+1];} if(n==0&&bgnd._vf.groundColor.length==1){sky[sky.length]=Math.PI/2;colors[colors.length]=bgnd._vf.groundColor[0];} sky[sky.length]=Math.PI;colors[colors.length]=bgnd._vf.groundColor[0];} else{if(sky[sky.length-1]0||s_gl.popGeometry>0)){for(v=0,offset=0,v_n=s_geo._vf.vertexCount.length;v>>8)/255.0;sp.from=from.toGL();sp.sceneSize=sceneSize;if((s_gl.binaryGeometry!=0||s_gl.externalGeometry!=0)&&s_geo._vf["idsPerVertex"]==true){sp.shadowIDs=(shape._vf.idOffset+x3dom.nodeTypes.Shape.objectID+2);} if(s_gl.coordType!=gl.FLOAT){if(!s_gl.popGeometry&&(x3dom.Utils.isUnsignedType(s_geo._vf.coordType))){sp.bgCenter=s_geo.getMin().toGL();} else{sp.bgCenter=s_geo._vf.position.toGL();} sp.bgSize=s_geo._vf.size.toGL();sp.bgPrecisionMax=s_geo.getPrecisionMax('coordType');} if(pickMode==1&&s_gl.colorType!=gl.FLOAT){sp.bgPrecisionColMax=s_geo.getPrecisionMax('colorType');} if(pickMode==2&&s_gl.texCoordType!=gl.FLOAT){sp.bgPrecisionTexMax=s_geo.getPrecisionMax('texCoordType');} if(shape._clipPlanes){sp.modelViewMatrix=mat_view.mult(trafo).toGL();sp.viewMatrixInverse=mat_view.inverse().toGL();for(var cp=0;cp0||s_gl.popGeometry>0)){for(v=0,offset=0,v_n=s_geo._vf.vertexCount.length;v65535)){indexArray=new Uint32Array(shape._webgl.indexes[q]);shape._webgl.indexType=gl.UNSIGNED_INT;} else{indexArray=new Uint16Array(shape._webgl.indexes[q]);shape._webgl.indexType=gl.UNSIGNED_SHORT;} gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER,s_gl.buffers[q6]);gl.bufferData(gl.ELEMENT_ARRAY_BUFFER,indexArray,gl.DYNAMIC_DRAW);indexArray=null;} gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER,s_gl.buffers[q6]);indicesReady=true;} if(sp.position!==undefined&&s_gl.buffers[q6+1]){gl.bindBuffer(gl.ARRAY_BUFFER,s_gl.buffers[q6+1]);gl.vertexAttribPointer(sp.position,s_msh._numPosComponents,s_gl.coordType,false,shape._coordStrideOffset[0],shape._coordStrideOffset[1]);gl.enableVertexAttribArray(sp.position);} if(sp.normal!==undefined&&s_gl.buffers[q6+2]){gl.bindBuffer(gl.ARRAY_BUFFER,s_gl.buffers[q6+2]);gl.vertexAttribPointer(sp.normal,s_msh._numNormComponents,s_gl.normalType,false,shape._normalStrideOffset[0],shape._normalStrideOffset[1]);gl.enableVertexAttribArray(sp.normal);} if(sp.texcoord!==undefined&&s_gl.buffers[q6+3]){gl.bindBuffer(gl.ARRAY_BUFFER,s_gl.buffers[q6+3]);gl.vertexAttribPointer(sp.texcoord,s_msh._numTexComponents,s_gl.texCoordType,false,shape._texCoordStrideOffset[0],shape._texCoordStrideOffset[1]);gl.enableVertexAttribArray(sp.texcoord);} if(sp.color!==undefined&&s_gl.buffers[q6+4]){gl.bindBuffer(gl.ARRAY_BUFFER,s_gl.buffers[q6+4]);gl.vertexAttribPointer(sp.color,s_msh._numColComponents,s_gl.colorType,false,shape._colorStrideOffset[0],shape._colorStrideOffset[1]);gl.enableVertexAttribArray(sp.color);} if((sp.id!==undefined||sp.particleSize!==undefined)&&s_gl.buffers[q6+5]){gl.bindBuffer(gl.ARRAY_BUFFER,s_gl.buffers[q6+5]);if((s_gl.binaryGeometry!=0||s_gl.externalGeometry!=0)&&s_geo._vf["idsPerVertex"]==true) {gl.vertexAttribPointer(sp.id,1,gl.FLOAT,false,4,0);gl.enableVertexAttribArray(sp.id);} else if(isParticleSet) {gl.vertexAttribPointer(sp.particleSize,3,gl.FLOAT,false,0,0);gl.enableVertexAttribArray(sp.particleSize);}} if(s_gl.popGeometry!=0&&s_gl.buffers[q6+5]){gl.bindBuffer(gl.ARRAY_BUFFER,s_gl.buffers[q6+5]);gl.vertexAttribPointer(sp.PG_vertexID,1,gl.FLOAT,false,4,0);gl.enableVertexAttribArray(sp.PG_vertexID);} var indOff,renderMode=viewarea.getRenderMode();if(renderMode>0){var polyMode=(renderMode==1)?gl.POINTS:gl.LINES;if(indicesReady&&(s_gl.binaryGeometry>0||s_gl.popGeometry>0)){for(v=0,offset=0,v_n=s_geo._vf.vertexCount.length;v0||s_gl.popGeometry>0)){for(v=0,offset=0,v_n=s_geo._vf.vertexCount.length;v0){var viewpoint=scene.getViewpoint();var imgPlaneHeightAtDistOne=viewpoint.getImgPlaneHeightAtDistOne();var near=viewpoint.getNear();var center=model_view.multMatrixPnt(popGeo._vf.position);var tightRad=model_view.multMatrixVec(popGeo._vf.size).length()*0.5;var largestRad=model_view.multMatrixVec(popGeo._vf.maxBBSize).length()*0.5;var dist=Math.max(-center.z-tightRad,near);var projPixelLength=dist*(imgPlaneHeightAtDistOne/viewarea._height);var arg=(2*largestRad)/(tol*projPixelLength);currentLOD=Math.ceil(Math.log(arg)/0.693147180559945);currentLOD=(currentLOD<1)?1:((currentLOD>16)?16:currentLOD);} var minPrec=popGeo._vf.minPrecisionLevel,maxPrec=popGeo._vf.maxPrecisionLevel;currentLOD=(minPrec!=-1&¤tLODmaxPrec)?maxPrec:currentLOD;var currentLOD_min=(s_gl.levelsAvailable4){mat_view=viewMat;mat_scene=sceneMat;} else{mat_view=viewarea._last_mat_view;mat_scene=viewarea._last_mat_scene;} var min=x3dom.fields.SFVec3f.copy(scene._lastMin);var max=x3dom.fields.SFVec3f.copy(scene._lastMax);var from=mat_view.inverse().e3();var _min=x3dom.fields.SFVec3f.copy(from);var _max=x3dom.fields.SFVec3f.copy(from);if(_min.x>min.x){_min.x=min.x;} if(_min.y>min.y){_min.y=min.y;} if(_min.z>min.z){_min.z=min.z;} if(_max.x0&&shapeId>>8,buttonState&255);if(objId>=baseID){objId-=baseID;var hitObject;if(pickMode!=4){viewarea._pickingInfo.pickPos=pickPos;viewarea._pick.setValues(pickPos);viewarea._pickingInfo.pickNorm=pickNorm;viewarea._pickNorm.setValues(pickNorm);viewarea._pickingInfo.pickObj=null;viewarea._pickingInfo.lastClickObj=null;hitObject=scene._xmlNode;} else{viewarea._pickingInfo.pickObj=x3dom.nodeTypes.Shape.idMap.nodeID[shapeId];hitObject=viewarea._pickingInfo.pickObj._xmlNode;} if(scene._multiPartMap){var mp,multiPart;for(mp=0;mp=multiPart._minId&&objId<=multiPart._maxId) {hitObject=multiPart._xmlNode;event={target:multiPart._xmlNode,button:button,mouseup:((buttonState>>>8)>0),layerX:x,layerY:y,pickedId:objId,worldX:pickPos.x,worldY:pickPos.y,worldZ:pickPos.z,normalX:pickNorm.x,normalY:pickNorm.y,normalZ:pickNorm.z,hitPnt:pickPos.toGL(),hitObject:hitObject,cancelBubble:false,stopPropagation:function(){this.cancelBubble=true;},preventDefault:function(){this.cancelBubble=true;}};multiPart.handleEvents(event);} else {event={target:multiPart._xmlNode,button:button,mouseup:((buttonState>>>8)>0),layerX:x,layerY:y,pickedId:-1,cancelBubble:false,stopPropagation:function(){this.cancelBubble=true;},preventDefault:function(){this.cancelBubble=true;}};multiPart.handleEvents(event);}}} shadowObjectIdChanged=(viewarea._pickingInfo.shadowObjectId!=objId);viewarea._pickingInfo.lastShadowObjectId=viewarea._pickingInfo.shadowObjectId;viewarea._pickingInfo.shadowObjectId=objId;if((shadowObjectIdChanged||button)&&scene._xmlNode&&(scene._xmlNode["on"+eventType]||scene._xmlNode.hasAttribute("on"+eventType)||scene._listeners[eventType])) {event={target:scene._xmlNode,type:eventType,button:button,mouseup:((buttonState>>>8)>0),layerX:x,layerY:y,shadowObjectId:objId,worldX:pickPos.x,worldY:pickPos.y,worldZ:pickPos.z,normalX:pickNorm.x,normalY:pickNorm.y,normalZ:pickNorm.z,hitPnt:pickPos.toGL(),hitObject:hitObject,cancelBubble:false,stopPropagation:function(){this.cancelBubble=true;},preventDefault:function(){this.cancelBubble=true;}};scene.callEvtHandler(("on"+eventType),event);} if(scene._shadowIdMap&&scene._shadowIdMap.mapping&&objId>>8)>0),layerX:x,layerY:y,pickedId:-1,cancelBubble:false,stopPropagation:function(){this.cancelBubble=true;},preventDefault:function(){this.cancelBubble=true;}};multiPart.handleEvents(event);}} shadowObjectIdChanged=(viewarea._pickingInfo.shadowObjectId!=-1);viewarea._pickingInfo.shadowObjectId=-1;if(shadowObjectIdChanged&&scene._xmlNode&&(scene._xmlNode["on"+eventType]||scene._xmlNode.hasAttribute("on"+eventType)||scene._listeners[eventType])) {event={target:scene._xmlNode,type:eventType,button:button,mouseup:((buttonState>>>8)>0),layerX:x,layerY:y,shadowObjectId:viewarea._pickingInfo.shadowObjectId,cancelBubble:false,stopPropagation:function(){this.cancelBubble=true;},preventDefault:function(){this.cancelBubble=true;}};scene.callEvtHandler(("on"+eventType),event);} if(objId>0){viewarea._pickingInfo.pickPos=pickPos;viewarea._pickingInfo.pickNorm=pickNorm;viewarea._pickingInfo.pickObj=x3dom.nodeTypes.Shape.idMap.nodeID[objId];} else{viewarea._pickingInfo.pickObj=null;viewarea._pickingInfo.lastClickObj=null;}}} var pickTime=x3dom.Utils.stopMeasure("picking");this.x3dElem.runtime.addMeasurement('PICKING',pickTime);return true;};Context.prototype.pickRect=function(viewarea,x1,y1,x2,y2) {var gl=this.ctx3d;var scene=viewarea?viewarea._scene:null;if(!gl||!scene||!scene._webgl||!scene.drawableCollection) return false;var from=viewarea._last_mat_view.inverse().e3();var sceneSize=scene._lastMax.subtract(scene._lastMin).length();var x=(x1<=x2)?x1:x2;var y=(y1>=y2)?y1:y2;var width=(1+Math.abs(x2-x1))*scene._webgl.pickScale;var height=(1+Math.abs(y2-y1))*scene._webgl.pickScale;this.renderPickingPass(gl,scene,viewarea._last_mat_view,viewarea._last_mat_scene,from,sceneSize,0,x,y,(width<1)?1:width,(height<1)?1:height);var index;var pickedObjects=[];for(index=0;scene._webgl.fboPick.pixelData&&index0) pickedObjects.push(objId);} pickedObjects.sort();var pickedObjectsTemp=(function(arr){var a=[],l=arr.length;for(var i=0;i=baseID) {objId-=baseID;if(scene._multiPartMap){var mp,multiPart,colorMap,emissiveMap,specularMap,visibilityMap,partID;for(mp=0;mp=multiPart._minId&&objId<=multiPart._maxId){partID=multiPart._idMap.mapping[objId-multiPart._minId].name;hitObject=new x3dom.Parts(multiPart,[objId],colorMap,emissiveMap,specularMap,visibilityMap);pickedNode={"partID":partID,"part":hitObject};pickedNodes.push(pickedNode);}}}} else {hitObject=x3dom.nodeTypes.Shape.idMap.nodeID[objId];hitObject=(hitObject&&hitObject._xmlNode)?hitObject._xmlNode:null;if(hitObject) pickedNodes.push(hitObject);}} return pickedNodes;};Context.prototype.renderScene=function(viewarea) {var gl=this.ctx3d;var scene=viewarea._scene;if(gl===null||scene===null){return;} var rentex=viewarea._doc._nodeBag.renderTextures;var rt_tex,rtl_i,rtl_n=rentex.length;var texProp=null;var type=gl.UNSIGNED_BYTE;var shadowType=gl.UNSIGNED_BYTE;var nearestFilt=false;if(x3dom.caps.FP_TEXTURES&&!x3dom.caps.MOBILE){type=gl.FLOAT;shadowType=gl.FLOAT;if(!x3dom.caps.FPL_TEXTURES){nearestFilt=true;}} var shadowedLights,numShadowMaps;var i,j,n,size,sizeAvailable;var texType,refinementPos;var vertices=[-1,-1,1,-1,-1,1,-1,1,1,-1,1,1];scene.updateVolume();if(!scene._webgl) {scene._webgl={};this.setupFgnds(gl,scene);scene._webgl.pickScale=0.5;scene._webgl._currFboWidth=Math.round(this.canvas.width*scene._webgl.pickScale);scene._webgl._currFboHeight=Math.round(this.canvas.height*scene._webgl.pickScale);scene._webgl.fboPick=x3dom.Utils.initFBO(gl,scene._webgl._currFboWidth,scene._webgl._currFboHeight,gl.UNSIGNED_BYTE,false,true);scene._webgl.fboPick.pixelData=null;scene._webgl.normalShader=this.cache.getShader(gl,x3dom.shader.NORMAL);scene._webgl.fboShadow=[];shadowedLights=viewarea.getShadowedLights();n=shadowedLights.length;for(i=0;i0||x3dom.SSAO.isEnabled(scene)) scene._webgl.fboScene=x3dom.Utils.initFBO(gl,this.canvas.width,this.canvas.height,shadowType,false,true);scene._webgl.fboBlur=[];for(i=0;i0)&&typeof scene._webgl.fboScene=="undefined"||scene._webgl.fboScene&&(this.canvas.width!=scene._webgl.fboScene.width||this.canvas.height!=scene._webgl.fboScene.height)){scene._webgl.fboScene=x3dom.Utils.initFBO(gl,this.canvas.width,this.canvas.height,shadowType,false,true);}} var env=scene.getEnvironment();env.checkSanity();var bgnd=scene.getBackground();this.setupScene(gl,bgnd);this.numFaces=0;this.numCoords=0;this.numDrawCalls=0;var mat_proj=viewarea.getProjectionMatrix();var mat_view=viewarea.getViewMatrix();if(!this._calledViewpointChangedHandler||!viewarea._last_mat_view.equals(mat_view)){var e_viewpoint=scene.getViewpoint();var e_eventType="viewpointChanged";try{if(e_viewpoint._xmlNode&&(e_viewpoint._xmlNode["on"+e_eventType]||e_viewpoint._xmlNode.hasAttribute("on"+e_eventType)||e_viewpoint._listeners[e_eventType])){var e_viewtrafo=e_viewpoint.getCurrentTransform();e_viewtrafo=e_viewtrafo.inverse().mult(mat_view);var e_mat=e_viewtrafo.inverse();var e_rotation=new x3dom.fields.Quaternion(0,0,1,0);e_rotation.setValue(e_mat);var e_translation=e_mat.e3();var e_event={target:e_viewpoint._xmlNode,type:e_eventType,matrix:e_viewtrafo,position:e_translation,orientation:e_rotation.toAxisAngle(),cancelBubble:false,stopPropagation:function(){this.cancelBubble=true;},preventDefault:function(){this.cancelBubble=true;}};e_viewpoint.callEvtHandler(("on"+e_eventType),e_event);this._calledViewpointChangedHandler=true;}} catch(e_e){x3dom.debug.logException(e_e);}} viewarea._last_mat_view=mat_view;viewarea._last_mat_proj=mat_proj;var mat_scene=mat_proj.mult(mat_view);viewarea._last_mat_scene=mat_scene;scene.drawableCollection=null;if(!scene.drawableCollection) {var drawableCollectionConfig={viewArea:viewarea,sortTrans:env._vf.sortTrans,viewMatrix:mat_view,projMatrix:mat_proj,sceneMatrix:mat_scene,frustumCulling:true,smallFeatureThreshold:env._smallFeatureThreshold,context:this,gl:gl};scene.drawableCollection=new x3dom.DrawableCollection(drawableCollectionConfig);x3dom.Utils.startMeasure('traverse');scene.collectDrawableObjects(x3dom.fields.SFMatrix4f.identity(),scene.drawableCollection,true,false,0,[]);var traverseTime=x3dom.Utils.stopMeasure('traverse');this.x3dElem.runtime.addMeasurement('TRAVERSE',traverseTime);} x3dom.Utils.startMeasure('sorting');scene.drawableCollection.sort();var sortTime=x3dom.Utils.stopMeasure('sorting');this.x3dElem.runtime.addMeasurement('SORT',sortTime);var slights=viewarea.getLights();var numLights=slights.length;var mat_light;var WCToLCMatrices=[];var lMatrices=[];var shadowCount=0;x3dom.Utils.startMeasure('shadow');for(var p=0;p0.0){var lightMatrix=viewarea.getLightMatrix()[p];shadowMaps=scene._webgl.fboShadow[shadowCount];var offset=Math.max(0.0,Math.min(1.0,slights[p]._vf.shadowOffset));if(!x3dom.isa(slights[p],x3dom.nodeTypes.PointLight)){var numCascades=Math.max(1,Math.min(slights[p]._vf.shadowCascades,6));mat_light=viewarea.getWCtoLCMatricesCascaded(lightMatrix,slights[p],mat_proj);for(i=0;i0||x3dom.SSAO.isEnabled(scene)){this.renderShadowPass(gl,viewarea,mat_scene,mat_view,scene._webgl.fboScene,0.0,true);var shadowTime=x3dom.Utils.stopMeasure('shadow');this.x3dElem.runtime.addMeasurement('SHADOW',shadowTime);} else{this.x3dElem.runtime.removeMeasurement('SHADOW');} mat_light=viewarea.getWCtoLCMatrix(viewarea.getLightMatrix()[0]);for(rtl_i=0;rtl_i0) this.renderShadows(gl,viewarea,shadowedLights,WCToLCMatrices,lMatrices,mat_view,mat_proj,mat_scene);this.stateManager.disable(gl.BLEND);this.stateManager.disable(gl.DEPTH_TEST);viewarea._numRenderedNodes=n;if(x3dom.SSAO.isEnabled(scene)) x3dom.SSAO.renderSSAO(this.stateManager,gl,scene,this.canvas);if(viewarea._visDbgBuf!==undefined&&viewarea._visDbgBuf) {var pm=scene._vf.pickMode.toLowerCase();if(pm.indexOf("idbuf")==0||pm=="color"||pm=="texcoord"){this.stateManager.viewport(0,3*this.canvas.height/4,this.canvas.width/4,this.canvas.height/4);scene._fgnd._webgl.render(gl,scene._webgl.fboPick.tex);} if(shadowCount>0||x3dom.SSAO.isEnabled(scene)){this.stateManager.viewport(this.canvas.width/4,3*this.canvas.height/4,this.canvas.width/4,this.canvas.height/4);scene._fgnd._webgl.render(gl,scene._webgl.fboScene.tex);} var row=3,col=2;for(i=0;i1){sp.lastTex=1;gl.activeTexture(gl.TEXTURE1);gl.bindTexture(gl.TEXTURE_2D,rt._webgl.fbo.tex);gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MAG_FILTER,gl.NEAREST);gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MIN_FILTER,gl.NEAREST);gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_WRAP_S,gl.CLAMP_TO_EDGE);gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_WRAP_T,gl.CLAMP_TO_EDGE);} sp.curTex=2;gl.activeTexture(gl.TEXTURE2);gl.bindTexture(gl.TEXTURE_2D,rt._webgl.texture);gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MAG_FILTER,gl.NEAREST);gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MIN_FILTER,gl.NEAREST);gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_WRAP_S,gl.CLAMP_TO_EDGE);gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_WRAP_T,gl.CLAMP_TO_EDGE);sp.mode=rt._currLoadLevel-1;sp.repeat=rt._repeat.toGL();gl.drawArrays(gl.TRIANGLES,0,6);this.stateManager.bindFramebuffer(gl.FRAMEBUFFER,rt._webgl.fbo.fbo);gl.clear(gl.COLOR_BUFFER_BIT|gl.DEPTH_BUFFER_BIT);sp.mode=0;sp.curTex=2;gl.activeTexture(gl.TEXTURE2);gl.bindTexture(gl.TEXTURE_2D,refinementFbo.tex);gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MAG_FILTER,gl.NEAREST);gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MIN_FILTER,gl.NEAREST);gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_WRAP_S,gl.CLAMP_TO_EDGE);gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_WRAP_T,gl.CLAMP_TO_EDGE);gl.drawArrays(gl.TRIANGLES,0,6);gl.activeTexture(gl.TEXTURE0);gl.bindTexture(gl.TEXTURE_2D,null);gl.disableVertexAttribArray(sp.position);this.stateManager.bindFramebuffer(gl.FRAMEBUFFER,null);this.stateManager.viewport(0,0,this.canvas.width,this.canvas.height);if(rt._vf.autoRefinement) rt.nextLevel();if(rt._currLoadLevel==rt._vf.maxLevel) rt._currLoadLevel++;if(rt._webgl.fbo.mipMap){gl.bindTexture(gl.TEXTURE_2D,rt._webgl.fbo.tex);gl.generateMipmap(gl.TEXTURE_2D);gl.bindTexture(gl.TEXTURE_2D,null);} if(!rt.requirePingPong()){gl.deleteTexture(rt._webgl.texture);delete rt._webgl.texture;rt._cleanupGLObjects(true);} rt._renderedImage++;};Context.prototype.renderRTPass=function(gl,viewarea,rt) {if(x3dom.isa(rt,x3dom.nodeTypes.RefinementTexture)){if(rt.requirePingPong()){this.renderPingPongPass(gl,viewarea,rt);} return;} switch(rt._vf.update.toUpperCase()){case"NONE":return;case"NEXT_FRAME_ONLY":if(!rt._needRenderUpdate){return;} rt._needRenderUpdate=false;break;case"ALWAYS":default:break;} var scene=viewarea._scene;var bgnd=null;var mat_view=rt.getViewMatrix();var mat_proj=rt.getProjectionMatrix();var mat_scene=mat_proj.mult(mat_view);var lightMatrix=viewarea.getLightMatrix()[0];var mat_light=viewarea.getWCtoLCMatrix(lightMatrix);var i,n,m=rt._cf.excludeNodes.nodes.length;var arr=new Array(m);for(i=0;i0||s_gl.popGeometry>0){for(v=0,offset=0,v_n=s_geo._vf.vertexCount.length;vtexLimit){renderSplit[renderSplit.length]=i;texUnits=7;}} renderSplit[renderSplit.length]=shadowedLights.length;var n=renderSplit.length-1;var mat_proj_inv=mat_proj.inverse();var mat_scene_inv=mat_scene.inverse();this.stateManager.enable(gl.BLEND);this.stateManager.blendFunc(gl.DST_COLOR,gl.ZERO);for(var s=0;s0){var RefList=[];for(var i=0;i0){viewarea._pickingInfo.pickPos=new x3dom.fields.SFVec3f(data.pickPosX,data.pickPosY,data.pickPosZ);viewarea._pickingInfo.pickObj=x3dom.nodeTypes.Shape.idMap.nodeID[data.objID];}else{viewarea._pickingInfo.pickObj=null;viewarea._pickingInfo.lastClickObj=null;} return true;};Context.prototype.shutdown=function(viewarea){};return setupContext;})();x3dom.NodeNameSpace=function(name,document){this.name=name;this.doc=document;this.baseURL="";this.defMap={};this.parent=null;this.childSpaces=[];};x3dom.NodeNameSpace.prototype.addNode=function(node,name){this.defMap[name]=node;node._nameSpace=this;};x3dom.NodeNameSpace.prototype.removeNode=function(name){var node=name?this.defMap[name]:null;if(node){delete this.defMap[name];node._nameSpace=null;}};x3dom.NodeNameSpace.prototype.getNamedNode=function(name){return this.defMap[name];};x3dom.NodeNameSpace.prototype.getNamedElement=function(name){var node=this.defMap[name];return(node?node._xmlNode:null);};x3dom.NodeNameSpace.prototype.addSpace=function(space){this.childSpaces.push(space);space.parent=this;};x3dom.NodeNameSpace.prototype.removeSpace=function(space){space.parent=null;for(var it=0;it=0)?url.substr(0,i+1):"";x3dom.debug.logInfo("setBaseURL: "+this.baseURL);};x3dom.NodeNameSpace.prototype.getURL=function(url){if(url===undefined||!url.length){return"";} else{return((url[0]==='/')||(url.indexOf(":")>=0))?url:(this.baseURL+url);}};x3dom.hasElementAttribute=function(attrName) {var ok=this.__hasAttribute(attrName);if(!ok&&attrName){ok=this.__hasAttribute(attrName.toLowerCase());} return ok;};x3dom.getElementAttribute=function(attrName) {var attrib=this.__getAttribute(attrName);if(!attrib&&attrib!=""&&attrName){attrib=this.__getAttribute(attrName.toLowerCase());} if(attrib||!this._x3domNode){return attrib;} else{return this._x3domNode._vf[attrName];}};x3dom.setElementAttribute=function(attrName,newVal) {this.__setAttribute(attrName,newVal);var x3dNode=this._x3domNode;if(x3dNode){x3dNode.updateField(attrName,newVal);x3dNode._nameSpace.doc.needRender=true;}};x3dom.getFieldValue=function(fieldName) {var x3dNode=this._x3domNode;if(x3dNode&&(x3dNode._vf[fieldName]!==undefined)){var fieldValue=x3dNode._vf[fieldName];if(fieldValue instanceof Object&&'copy'in fieldValue) {return x3dNode._vf[fieldName].copy();} else {return x3dNode._vf[fieldName];}} return null;};x3dom.setFieldValue=function(fieldName,fieldvalue){var x3dNode=this._x3domNode;if(x3dNode&&(x3dNode._vf[fieldName]!==undefined)){if(fieldvalue instanceof Object&&'copy'in fieldvalue) {x3dNode._vf[fieldName]=fieldvalue.copy();} else x3dNode._vf[fieldName]=fieldvalue;x3dNode.fieldChanged(fieldName);x3dNode._nameSpace.doc.needRender=true;}};x3dom.requestFieldRef=function(fieldName) {var x3dNode=this._x3domNode;if(x3dNode&&x3dNode._vf[fieldName]) {return x3dNode._vf[fieldName];} return null;};x3dom.releaseFieldRef=function(fieldName) {var x3dNode=this._x3domNode;if(x3dNode&&x3dNode._vf[fieldName]) {x3dNode.fieldChanged(fieldName);x3dNode._nameSpace.doc.needRender=true;}};x3dom.NodeNameSpace.prototype.setupTree=function(domNode){var n=null;if(x3dom.isX3DElement(domNode)){if(domNode._x3domNode){x3dom.debug.logWarning('Tree is already initialized');return null;} if((domNode.tagName!==undefined)&&(!domNode.__addEventListener)&&(!domNode.__removeEventListener)) {domNode.__addEventListener=domNode.addEventListener;domNode.addEventListener=function(type,func,phase){if(!this._x3domNode._listeners[type]){this._x3domNode._listeners[type]=[];} this._x3domNode._listeners[type].push(func);this.__addEventListener(type,func,phase);};domNode.__removeEventListener=domNode.removeEventListener;domNode.removeEventListener=function(type,func,phase){var list=this._x3domNode._listeners[type];if(list){for(var it=0;it=2){var otherNS=this;while(otherNS){if(otherNS.name==nsName[0]) n=otherNS.defMap[nsName[1]];if(n) otherNS=null;else otherNS=otherNS.parent;} if(!n){n=null;x3dom.debug.logWarning('Could not USE: '+domNode.getAttribute('USE'));}}} if(n){domNode._x3domNode=n;} return n;} else{if(domNode.localName.toLowerCase()==='route'){var route=domNode;var fnAtt=route.getAttribute('fromNode')||route.getAttribute('fromnode');var tnAtt=route.getAttribute('toNode')||route.getAttribute('tonode');var fromNode=this.defMap[fnAtt];var toNode=this.defMap[tnAtt];if(!(fromNode&&toNode)){x3dom.debug.logWarning("Broken route - can't find all DEFs for "+fnAtt+" -> "+tnAtt);} else{fnAtt=route.getAttribute('fromField')||route.getAttribute('fromfield');tnAtt=route.getAttribute('toField')||route.getAttribute('tofield');fromNode.setupRoute(fnAtt,toNode,tnAtt);route._nodeNameSpace=this;} return null;} domNode.requestFieldRef=x3dom.requestFieldRef;domNode.releaseFieldRef=x3dom.releaseFieldRef;domNode.getFieldValue=x3dom.getFieldValue;domNode.setFieldValue=x3dom.setFieldValue;var nodeType=x3dom.nodeTypesLC[domNode.localName.toLowerCase()];if(nodeType===undefined){x3dom.debug.logWarning("Unrecognised X3D element <"+domNode.localName+">.");} else{if((x3dom.userAgentFeature.supportsDOMAttrModified===false)&&(domNode instanceof Element)){if(domNode.setAttribute&&!domNode.__setAttribute){domNode.__setAttribute=domNode.setAttribute;domNode.setAttribute=x3dom.setElementAttribute;} if(domNode.getAttribute&&!domNode.__getAttribute){domNode.__getAttribute=domNode.getAttribute;domNode.getAttribute=x3dom.getElementAttribute;} if(domNode.hasAttribute&&!domNode.__hasAttribute){domNode.__hasAttribute=domNode.hasAttribute;domNode.hasAttribute=x3dom.hasElementAttribute;}} var ctx={doc:this.doc,xmlNode:domNode,nameSpace:this};n=new nodeType(ctx);if(domNode.hasAttribute('DEF')){n._DEF=domNode.getAttribute('DEF');this.defMap[n._DEF]=n;} else{if(domNode.hasAttribute('id')){n._DEF=domNode.getAttribute('id');this.defMap[n._DEF]=n;}} if(domNode.highlight===undefined) {domNode.highlight=function(enable,colorStr){var color=x3dom.fields.SFColor.parse(colorStr);this._x3domNode.highlight(enable,color);this._x3domNode._nameSpace.doc.needRender=true;};} n._xmlNode=domNode;domNode._x3domNode=n;var that=this;Array.forEach(domNode.childNodes,function(childDomNode){var c=that.setupTree(childDomNode);if(c){n.addChild(c,childDomNode.getAttribute("containerField"));}});n.nodeChanged();return n;}}} else if(domNode.localName){x3dom.debug.logWarning("Unrecognised X3D element <"+domNode.localName+">.");n=null;} return n;};x3dom.registerNodeType("X3DNode","Core",defineClass(null,function(ctx){this._xmlNode=null;this._DEF=null;this._nameSpace=(ctx&&ctx.nameSpace)?ctx.nameSpace:null;this._vf={};this._vfFieldTypes={};this._cf={};this._cfFieldTypes={};this._fieldWatchers={};this._routes={};this._listeners={};this._parentNodes=[];this._childNodes=[];this.addField_SFNode('metadata',x3dom.nodeTypes.X3DMetadataObject);},{type:function(){return this.constructor;},typeName:function(){return this.constructor._typeName;},addChild:function(node,containerFieldName){if(node){var field=null;if(containerFieldName){field=this._cf[containerFieldName];} else{for(var fieldName in this._cf){if(this._cf.hasOwnProperty(fieldName)){var testField=this._cf[fieldName];if(x3dom.isa(node,testField.type)){field=testField;break;}}}} if(field&&field.addLink(node)){node._parentNodes.push(this);this._childNodes.push(node);node.parentAdded(this);return true;}} return false;},removeChild:function(node){if(node){for(var fieldName in this._cf){if(this._cf.hasOwnProperty(fieldName)){var field=this._cf[fieldName];if(field.rmLink(node)){for(var i=node._parentNodes.length-1;i>=0;i--){if(node._parentNodes[i]===this){node._parentNodes.splice(i,1);node.parentRemoved(this);}} for(var j=this._childNodes.length-1;j>=0;j--){if(this._childNodes[j]===node){node.onRemove();this._childNodes.splice(j,1);return true;}}}}}} return false;},onRemove:function(){},parentAdded:function(parent){},parentRemoved:function(parent){for(var i=0,n=this._childNodes.length;i=1){return this.transformMatrix(this._parentNodes[0].getCurrentTransform());} else{return x3dom.fields.SFMatrix4f.identity();}},transformMatrix:function(transform){return transform;},getVolume:function(){return null;},invalidateVolume:function(){},invalidateCache:function(){},volumeValid:function(){return false;},collectDrawableObjects:function(transform,drawableCollection,singlePath,invalidateCache,planeMask,clipPlanes){},highlight:function(enable,color) {if(this._vf.hasOwnProperty("diffuseColor")) {if(enable){if(this._actDiffuseColor===undefined){this._actDiffuseColor=new x3dom.fields.SFColor();this._highlightOn=false;} if(!this._highlightOn){this._actDiffuseColor.setValues(this._vf.diffuseColor);this._highlightOn=true;} this._vf.diffuseColor.setValues(color);} else{if(this._actDiffuseColor!==undefined){this._vf.diffuseColor.setValues(this._actDiffuseColor);this._highlightOn=false;delete this._actDiffuseColor;}}} for(var i=0,n=this._childNodes.length;i0){fieldName=fromField.substr(0,fromField.length-post.length);if(this._vf[fieldName]){fromField=fieldName;}}}} if(!toNode._vf[toField]){pos=toField.indexOf(pre);if(pos===0){fieldName=toField.substr(pre.length,toField.length-1);if(toNode._vf[fieldName]){toField=fieldName;}} else{pos=toField.indexOf(post);if(pos>0){fieldName=toField.substr(0,toField.length-post.length);if(toNode._vf[fieldName]){toField=fieldName;}}}} var where=this._DEF+"&"+fromField+"&"+toNode._DEF+"&"+toField;if(!this._routes[where]){if(!this._fieldWatchers[fromField]){this._fieldWatchers[fromField]=[];} this._fieldWatchers[fromField].push(function(msg){toNode.postMessage(toField,msg);});if(!toNode._fieldWatchers[toField]){toNode._fieldWatchers[toField]=[];} toNode._fieldWatchers[toField].push(function(msg){toNode._vf[toField]=msg;toNode.fieldChanged(toField);});this._routes[where]={from:this._fieldWatchers[fromField].length-1,to:toNode._fieldWatchers[toField].length-1};}},removeRoute:function(fromField,toNode,toField){var pos;var fieldName;var pre="set_",post="_changed";if(!this._vf[fromField]){pos=fromField.indexOf(pre);if(pos===0){fieldName=fromField.substr(pre.length,fromField.length-1);if(this._vf[fieldName]){fromField=fieldName;}}else{pos=fromField.indexOf(post);if(pos>0){fieldName=fromField.substr(0,fromField.length-post.length);if(this._vf[fieldName]){fromField=fieldName;}}}} if(!toNode._vf[toField]){pos=toField.indexOf(pre);if(pos===0){fieldName=toField.substr(pre.length,toField.length-1);if(toNode._vf[fieldName]){toField=fieldName;}} else{pos=toField.indexOf(post);if(pos>0){fieldName=toField.substr(0,toField.length-post.length);if(toNode._vf[fieldName]){toField=fieldName;}}}} var where=this._DEF+"&"+fromField+"&"+toNode._DEF+"&"+toField;if(this._routes[where]){this._fieldWatchers[fromField].splice(this._routes[where].from,1);toNode._fieldWatchers[toField].splice(this._routes[where].to,1);delete this._routes[where];}},fieldChanged:function(fieldName){},nodeChanged:function(){},callEvtHandler:function(eventType,event){var node=this;if(!node._xmlNode){return event.cancelBubble;} try{var attrib=node._xmlNode[eventType];event.target=node._xmlNode;if(typeof(attrib)==="function"){attrib.call(node._xmlNode,event);} else{var funcStr=node._xmlNode.getAttribute(eventType);var func=new Function('event',funcStr);func.call(node._xmlNode,event);} var list=node._listeners[event.type];if(list){for(var it=0;it=0){this.bind(this._vf.bind);}},nodeChanged:function(){this._stack=this._nameSpace.doc._bindableBag.addBindable(this);}}));x3dom.registerNodeType("X3DInfoNode","Core",defineClass(x3dom.nodeTypes.X3DChildNode,function(ctx){x3dom.nodeTypes.X3DInfoNode.superClass.call(this,ctx);}));x3dom.registerNodeType("WorldInfo","Core",defineClass(x3dom.nodeTypes.X3DInfoNode,function(ctx){x3dom.nodeTypes.WorldInfo.superClass.call(this,ctx);this.addField_MFString(ctx,'info',[]);this.addField_SFString(ctx,'title',"");x3dom.debug.logInfo(this._vf.info);x3dom.debug.logInfo(this._vf.title);}));x3dom.registerNodeType("X3DSensorNode","Core",defineClass(x3dom.nodeTypes.X3DChildNode,function(ctx){x3dom.nodeTypes.X3DSensorNode.superClass.call(this,ctx);this.addField_SFBool(ctx,'enabled',true);}));x3dom.registerNodeType("Param","Core",defineClass(x3dom.nodeTypes.X3DNode,function(ctx){x3dom.nodeTypes.Param.superClass.call(this,ctx);x3dom.debug.logWarning('DEPRECATED: Param element needs to be child of X3D element ' +'[DOCS]');}));x3dom.registerNodeType("X3DBoundedObject","Grouping",defineClass(x3dom.nodeTypes.X3DChildNode,function(ctx){x3dom.nodeTypes.X3DBoundedObject.superClass.call(this,ctx);this.addField_SFBool(ctx,'render',true);this.addField_SFVec3f(ctx,'bboxCenter',0,0,0);this.addField_SFVec3f(ctx,'bboxSize',-1,-1,-1);this._graph={boundedNode:this,localMatrix:x3dom.fields.SFMatrix4f.identity(),globalMatrix:null,volume:new x3dom.fields.BoxVolume(),worldVolume:new x3dom.fields.BoxVolume(),center:new x3dom.fields.SFVec3f(0,0,0),coverage:-1,needCulling:true};},{fieldChanged:function(fieldName){if(this._vf.hasOwnProperty(fieldName)){this.invalidateVolume();}},nodeChanged:function(){this.invalidateVolume();},parentAdded:function(parent){this.invalidateVolume();},getVolume:function() {var vol=this._graph.volume;if(!this.volumeValid()&&this._vf.render) {for(var i=0,n=this._childNodes.length;i1)) singlePath=false;if(singlePath&&(invalidateCache=invalidateCache||this.cacheInvalid())) this.invalidateCache();planeMask=drawableCollection.cull(transform,this.graphState(),singlePath,planeMask);if(planeMask<0){return;} var cnode,childTransform;if(singlePath){if(!this._graph.globalMatrix){this._graph.globalMatrix=this.transformMatrix(transform);} childTransform=this._graph.globalMatrix;} else{childTransform=this.transformMatrix(transform);} var n=this._childNodes.length;if(x3dom.nodeTypes.ClipPlane.count>0){var localClipPlanes=[];for(var j=0;j=0&&this._vf.whichChoice1)) singlePath=false;if(singlePath&&(invalidateCache=invalidateCache||this.cacheInvalid())) this.invalidateCache();if(this._vf.whichChoice<0||this._vf.whichChoice>=this._childNodes.length||(planeMask=drawableCollection.cull(transform,this.graphState(),singlePath,planeMask))<0){return;} var cnode,childTransform;if(singlePath){if(!this._graph.globalMatrix){this._graph.globalMatrix=this.transformMatrix(transform);} childTransform=this._graph.globalMatrix;} else{childTransform=this.transformMatrix(transform);} if((cnode=this._childNodes[this._vf.whichChoice])){cnode.collectDrawableObjects(childTransform,drawableCollection,singlePath,invalidateCache,planeMask,clipPlanes);}},doIntersect:function(line) {if(this._vf.whichChoice<0||this._vf.whichChoice>=this._childNodes.length){return false;} var child=this._childNodes[this._vf.whichChoice];if(child){return child.doIntersect(line);} return false;}}));x3dom.registerNodeType("X3DTransformNode","Grouping",defineClass(x3dom.nodeTypes.X3DGroupingNode,function(ctx){x3dom.nodeTypes.X3DTransformNode.superClass.call(this,ctx);if(ctx) ctx.doc._nodeBag.trans.push(this);else x3dom.debug.logWarning("X3DTransformNode: No runtime context found!");this._trafo=null;this._needCssStyleUpdates=true;},{tick:function(t) {var dom=this._xmlNode;if(dom&&(dom['ontransform']||dom.hasAttribute('ontransform')||this._listeners['transform'])){var transMatrix=this.getCurrentTransform();var event={target:dom,type:'transform',worldX:transMatrix._03,worldY:transMatrix._13,worldZ:transMatrix._23,cancelBubble:false,stopPropagation:function(){this.cancelBubble=true;}};this.callEvtHandler("ontransform",event);} if(this._needCssStyleUpdates&&dom){var trans=x3dom.getStyle(dom,"-webkit-transform")||x3dom.getStyle(dom,"-moz-transform")||x3dom.getStyle(dom,"-ms-transform")||x3dom.getStyle(dom,"transform");if(trans&&(trans!='none')){this._trafo.setValueByStr(trans);this.invalidateVolume();return true;} this._needCssStyleUpdates=false;} return false;},transformMatrix:function(transform){return transform.mult(this._trafo);},getVolume:function() {var vol=this._graph.volume;if(!this.volumeValid()&&this._vf.render) {this._graph.localMatrix=this._trafo;for(var i=0,n=this._childNodes.length;i1)) singlePath=false;if(singlePath&&(invalidateCache=invalidateCache||this.cacheInvalid())) this.invalidateCache();planeMask=drawableCollection.cull(transform,this.graphState(),singlePath,planeMask);if(planeMask<0){return;} var cnode,childTransform;if(singlePath){if(!this._graph.globalMatrix){this._graph.globalMatrix=this.transformMatrix(transform);} childTransform=this._graph.globalMatrix;} else{childTransform=this.transformMatrix(transform);} if(this.needBvhRebuild) {var drawableCollectionConfig={viewArea:drawableCollection.viewarea,sortTrans:drawableCollection.sortTrans,viewMatrix:drawableCollection.viewMatrix,projMatrix:drawableCollection.projMatrix,sceneMatrix:drawableCollection.sceneMatrix,frustumCulling:false,smallFeatureThreshold:0,context:drawableCollection.context};this.drawableCollection=new x3dom.DrawableCollection(drawableCollectionConfig);var i,n=this._childNodes.length;for(i=0;i0) {that._idList=[];var arr=x3dom.fields.MFString.parse(evt.data);var n=Math.min(arr.length,Math.abs(that._vf.maxRenderedIds));for(var i=0;i0){nodeName=nodeName.substring(0,starInd);matchNameBegin=true;} if(nodeName.length<=1) continue;if((matchNameBegin&&this._vf.label[i].indexOf(nodeName)==0)||this._vf.label[i]==nodeName){this._visibleList[i]=false;break;}}} else{this._visibleList[i]=false;}} this.invalidateVolume();} else if(fieldName=="render"){this.invalidateVolume();}},getNumRenderedObjects:function(len,isMoving) {var n=len;if(this._vf.maxRenderedIds>0) {var num=Math.max(this._vf.maxRenderedIds,16);var scale=1;if(isMoving) scale=Math.min(this._vf.scaleRenderedIdsOnMove,1);num=Math.max(Math.round(scale*num),0);n=Math.min(n,num);} return n;},collectDrawableObjects:function(transform,drawableCollection,singlePath,invalidateCache,planeMask,clipPlanes) {if(singlePath&&(this._parentNodes.length>1)) singlePath=false;if(singlePath&&(invalidateCache=invalidateCache||this.cacheInvalid())) this.invalidateCache();planeMask=drawableCollection.cull(transform,this.graphState(),singlePath,planeMask);if(planeMask<=0){return;} var viewarea=this._nameSpace.doc._viewarea;var isMoving=viewarea.isMovingOrAnimating();var ts=new Date().getTime();var maxLiveTime=10000;var i,n,numChild=this._childNodes.length;if(!this._vf.enableCulling) {n=this.getNumRenderedObjects(numChild,isMoving);var cnt=0;for(i=0;i0&&ts-this._createTime[i]>maxLiveTime&&shape._cleanupGLObjects) {shape._cleanupGLObjects(true);this._createTime[i]=0;}}} return;} if(this._websocket) this._websocket.updateCamera();if(this._vf.label.length) {n=this.getNumRenderedObjects(this._idList.length,isMoving);for(i=0;i0&&ts-this._createTime[i]>maxLiveTime&&this._childNodes[i]._cleanupGLObjects) {this._childNodes[i]._cleanupGLObjects(true);this._createTime[i]=0;}}}}}));x3dom.registerNodeType("Scene","Grouping",defineClass(x3dom.nodeTypes.X3DGroupingNode,function(ctx){x3dom.nodeTypes.Scene.superClass.call(this,ctx);this.addField_SFString(ctx,'pickMode',"idBuf");this.addField_SFBool(ctx,'doPickPass',true);this.addField_SFString(ctx,'shadowObjectIdMapping',"");this._lastMin=new x3dom.fields.SFVec3f(0,0,0);this._lastMax=new x3dom.fields.SFVec3f(1,1,1);this._shadowIdMap=null;this.loadMapping();this._multiPartMap=null;},{fieldChanged:function(fieldName) {if(fieldName=="shadowObjectIdMapping") {this.loadMapping();}},updateVolume:function() {var vol=this.getVolume();if(vol.isValid()) {this._lastMin=x3dom.fields.SFVec3f.copy(vol.min);this._lastMax=x3dom.fields.SFVec3f.copy(vol.max);}},loadMapping:function() {this._shadowIdMap=null;if(this._vf.shadowObjectIdMapping.length==0){return;} var that=this;var xhr=new XMLHttpRequest();xhr.open("GET",this._nameSpace.getURL(this._vf.shadowObjectIdMapping),true);xhr.send();xhr.onload=function() {that._shadowIdMap=eval("("+xhr.response+")");if(!that._shadowIdMap||!that._shadowIdMap.mapping){x3dom.debug.logWarning("Invalid ID map: "+that._vf.shadowObjectIdMapping);} else{x3dom.debug.assert(that._shadowIdMap.maxID<=that._shadowIdMap.mapping.length,"Too few ID map entries in "+that._vf.shadowObjectIdMapping+", "+"length of mapping array is only "+that._shadowIdMap.mapping.length+" instead of "+that._shadowIdMap.ids.length+"!");}};}}));x3dom.BindableStack=function(doc,type,defaultType,getter){this._doc=doc;this._type=type;this._defaultType=defaultType;this._defaultRoot=null;this._getter=getter;this._bindBag=[];this._bindStack=[];};x3dom.BindableStack.prototype.top=function(){return((this._bindStack.length>0)?this._bindStack[this._bindStack.length-1]:null);};x3dom.BindableStack.prototype.push=function(bindable){var top=this.top();if(top===bindable){return;} if(top){top.deactivate();} this._bindStack.push(bindable);bindable.activate(top);};x3dom.BindableStack.prototype.replaceTop=function(bindable){var top=this.top();if(top===bindable){return;} if(top){top.deactivate();this._bindStack[this._bindStack.length-1]=bindable;bindable.activate(top);}};x3dom.BindableStack.prototype.pop=function(bindable){var top;if(bindable){top=this.top();if(bindable!==top){return null;}} top=this._bindStack.pop();if(top){top.deactivate();} return top;};x3dom.BindableStack.prototype.switchTo=function(target){var last=this.getActive();var n=this._bindBag.length;var toBind=0;var i=0,lastIndex=-1;if(n<=1){return;} switch(target) {case'first':toBind=this._bindBag[0];break;case'last':toBind=this._bindBag[n-1];break;default:for(i=0;i=0){i=lastIndex;while(!toBind){if(target=='next'){i=(i<(n-1))?(i+1):0;}else{i=(i>0)?(i-1):(n-1);} if(i==lastIndex){break;} if(this._bindBag[i]._vf.description.length>=0){toBind=this._bindBag[i];}}} break;} if(toBind){this.replaceTop(toBind);}else{x3dom.debug.logWarning('Cannot switch bindable; no other bindable with description found.');}};x3dom.BindableStack.prototype.getActive=function(){if(this._bindStack.length===0){if(this._bindBag.length===0){if(this._defaultRoot){x3dom.debug.logInfo('create new '+this._defaultType._typeName+' for '+this._type._typeName+'-stack');var obj=new this._defaultType({doc:this._doc,nameSpace:this._defaultRoot._nameSpace,autoGen:true});this._defaultRoot.addChild(obj);obj.nodeChanged();} else{x3dom.debug.logError('stack without defaultRoot');}} else{x3dom.debug.logInfo('activate first '+this._type._typeName+' for '+this._type._typeName+'-stack');} this._bindStack.push(this._bindBag[0]);this._bindBag[0].activate();} return this._bindStack[this._bindStack.length-1];};x3dom.BindableBag=function(doc){this._stacks=[];this.addType("X3DViewpointNode","Viewpoint","getViewpoint",doc);this.addType("X3DNavigationInfoNode","NavigationInfo","getNavigationInfo",doc);this.addType("X3DBackgroundNode","Background","getBackground",doc);this.addType("X3DFogNode","Fog","getFog",doc);this.addType("X3DEnvironmentNode","Environment","getEnvironment",doc);};x3dom.BindableBag.prototype.addType=function(typeName,defaultTypeName,getter,doc){var type=x3dom.nodeTypes[typeName];var defaultType=x3dom.nodeTypes[defaultTypeName];if(type&&defaultType){var stack=new x3dom.BindableStack(doc,type,defaultType,getter);this._stacks.push(stack);} else{x3dom.debug.logWarning('Invalid Bindable type/defaultType: '+ typeName+'/'+defaultType);}};x3dom.BindableBag.prototype.setRefNode=function(node){Array.forEach(this._stacks,function(stack){stack._defaultRoot=node;node[stack._getter]=function(){return stack.getActive();};});};x3dom.BindableBag.prototype.addBindable=function(node){for(var i=0,n=this._stacks.length;i=0;return(this._vf.lit&&hasTris);}}));x3dom.registerNodeType("Mesh","Rendering",defineClass(x3dom.nodeTypes.X3DGeometryNode,function(ctx){x3dom.nodeTypes.Mesh.superClass.call(this,ctx);this.addField_SFString(ctx,'primType',"triangle");this.addField_MFInt32(ctx,'index',[]);this.addField_MFNode('vertexAttributes',x3dom.nodeTypes.X3DVertexAttributeNode);},{nodeChanged:function() {var time0=new Date().getTime();var i,n=this._cf.vertexAttributes.nodes.length;for(i=0;i=0;j--){this._mesh._indices[0].push(cnt++,cnt);if(j==0)cnt++;}}},fieldChanged:function(fieldName){if(fieldName=="coord"){var pnts=this._cf.coord.node.getPoints();this._mesh._positions[0]=pnts.toGL();this.invalidateVolume();Array.forEach(this._parentNodes,function(node){node._dirty.positions=true;node.invalidateVolume();});} else if(fieldName=="color"){var cols=this._cf.color.node._vf.color;this._mesh._colors[0]=cols.toGL();Array.forEach(this._parentNodes,function(node){node._dirty.colors=true;});}}}));x3dom.registerNodeType("IndexedLineSet","Rendering",defineClass(x3dom.nodeTypes.X3DGeometryNode,function(ctx){x3dom.nodeTypes.IndexedLineSet.superClass.call(this,ctx);this.addField_SFBool(ctx,'colorPerVertex',true);this.addField_MFNode('attrib',x3dom.nodeTypes.X3DVertexAttributeNode);this.addField_SFNode('coord',x3dom.nodeTypes.X3DCoordinateNode);this.addField_SFNode('color',x3dom.nodeTypes.X3DColorNode);this.addField_MFInt32(ctx,'coordIndex',[]);this.addField_MFInt32(ctx,'colorIndex',[]);this._mesh._primType='LINES';x3dom.Utils.needLineWidth=true;},{_buildGeometry:function() {var time0=new Date().getTime();var indexes=this._vf.coordIndex;var colorInd=this._vf.colorIndex;var hasColor=false,hasColorInd=false;var colPerVert=this._vf.colorPerVertex;if(colorInd.length==indexes.length) {hasColorInd=true;} var positions,colors;var coordNode=this._cf.coord.node;x3dom.debug.assert(coordNode);positions=coordNode.getPoints();var numColComponents=3;var colorNode=this._cf.color.node;if(colorNode) {hasColor=true;colors=colorNode._vf.color;if(x3dom.isa(colorNode,x3dom.nodeTypes.ColorRGBA)){numColComponents=4;}} else{hasColor=false;} this._mesh._indices[0]=[];this._mesh._positions[0]=[];this._mesh._colors[0]=[];var i,t,cnt,lineCnt;var p0,p1,c0,c1;if((hasColor&&hasColorInd)||positions.length>x3dom.Utils.maxIndexableCoords) {t=0;cnt=0;lineCnt=0;for(i=0;ipositions.length-1) {continue;} if(indexes[i]===-1){t=0;continue;} if(hasColorInd){x3dom.debug.assert(colorInd[i]!=-1);} switch(t) {case 0:p0=+indexes[i];if(hasColorInd&&colPerVert){c0=+colorInd[i];} else{c0=p0;} t=1;break;case 1:p1=+indexes[i];if(hasColorInd&&colPerVert){c1=+colorInd[i];} else if(hasColorInd&&!colPerVert){c1=+colorInd[lineCnt];} else{c1=p1;} this._mesh._indices[0].push(cnt++,cnt++);this._mesh._positions[0].push(positions[p0].x);this._mesh._positions[0].push(positions[p0].y);this._mesh._positions[0].push(positions[p0].z);this._mesh._positions[0].push(positions[p1].x);this._mesh._positions[0].push(positions[p1].y);this._mesh._positions[0].push(positions[p1].z);if(hasColor){if(!colPerVert){c0=c1;} this._mesh._colors[0].push(colors[c0].r);this._mesh._colors[0].push(colors[c0].g);this._mesh._colors[0].push(colors[c0].b);this._mesh._colors[0].push(colors[c1].r);this._mesh._colors[0].push(colors[c1].g);this._mesh._colors[0].push(colors[c1].b);} t=2;lineCnt++;break;case 2:p0=p1;c0=c1;p1=+indexes[i];if(hasColorInd&&colPerVert){c1=+colorInd[i];} else if(hasColorInd&&!colPerVert){c1=+colorInd[lineCnt];} else{c1=p1;} this._mesh._indices[0].push(cnt++,cnt++);this._mesh._positions[0].push(positions[p0].x);this._mesh._positions[0].push(positions[p0].y);this._mesh._positions[0].push(positions[p0].z);this._mesh._positions[0].push(positions[p1].x);this._mesh._positions[0].push(positions[p1].y);this._mesh._positions[0].push(positions[p1].z);if(hasColor){if(!colPerVert){c0=c1;} this._mesh._colors[0].push(colors[c0].r);this._mesh._colors[0].push(colors[c0].g);this._mesh._colors[0].push(colors[c0].b);this._mesh._colors[0].push(colors[c1].r);this._mesh._colors[0].push(colors[c1].g);this._mesh._colors[0].push(colors[c1].b);} lineCnt++;break;default:}} if(positions.length>x3dom.Utils.maxIndexableCoords) this._mesh.splitMesh(2);} else {var n=indexes.length;t=0;for(i=0;i0){positions.push(positions.length-1);} posMax=positions.length;if(!normPerVert||!colPerVert||posMax>x3dom.Utils.maxIndexableCoords) {t=0;cnt=0;faceCnt=0;this._mesh._multiIndIndices=[];this._mesh._posSize=positions.length;for(i=0;i0)&&(i%3===0)){t=0;faceCnt++;} switch(t) {case 0:p0=+indexes[i];if(normPerVert){n0=p0;}else if(!normPerVert){n0=faceCnt;} t0=p0;if(colPerVert){c0=p0;}else if(!colPerVert){c0=faceCnt;} t=1;break;case 1:p1=+indexes[i];if(normPerVert){n1=p1;}else if(!normPerVert){n1=faceCnt;} t1=p1;if(colPerVert){c1=p1;}else if(!colPerVert){c1=faceCnt;} t=2;break;case 2:p2=+indexes[i];if(normPerVert){n2=p2;}else if(!normPerVert){n2=faceCnt;} t2=p2;if(colPerVert){c2=p2;}else if(!colPerVert){c2=faceCnt;} t=3;this._mesh._indices[0].push(cnt++,cnt++,cnt++);this._mesh._positions[0].push(positions[p0].x);this._mesh._positions[0].push(positions[p0].y);this._mesh._positions[0].push(positions[p0].z);this._mesh._positions[0].push(positions[p1].x);this._mesh._positions[0].push(positions[p1].y);this._mesh._positions[0].push(positions[p1].z);this._mesh._positions[0].push(positions[p2].x);this._mesh._positions[0].push(positions[p2].y);this._mesh._positions[0].push(positions[p2].z);if(hasNormal){this._mesh._normals[0].push(normals[n0].x);this._mesh._normals[0].push(normals[n0].y);this._mesh._normals[0].push(normals[n0].z);this._mesh._normals[0].push(normals[n1].x);this._mesh._normals[0].push(normals[n1].y);this._mesh._normals[0].push(normals[n1].z);this._mesh._normals[0].push(normals[n2].x);this._mesh._normals[0].push(normals[n2].y);this._mesh._normals[0].push(normals[n2].z);} else{this._mesh._multiIndIndices.push(p0,p1,p2);} if(hasColor){this._mesh._colors[0].push(colors[c0].r);this._mesh._colors[0].push(colors[c0].g);this._mesh._colors[0].push(colors[c0].b);if(numColComponents===4){this._mesh._colors[0].push(colors[c0].a);} this._mesh._colors[0].push(colors[c1].r);this._mesh._colors[0].push(colors[c1].g);this._mesh._colors[0].push(colors[c1].b);if(numColComponents===4){this._mesh._colors[0].push(colors[c1].a);} this._mesh._colors[0].push(colors[c2].r);this._mesh._colors[0].push(colors[c2].g);this._mesh._colors[0].push(colors[c2].b);if(numColComponents===4){this._mesh._colors[0].push(colors[c2].a);}} if(hasTexCoord){this._mesh._texCoords[0].push(texCoords[t0].x);this._mesh._texCoords[0].push(texCoords[t0].y);if(numTexComponents===3){this._mesh._texCoords[0].push(texCoords[t0].z);} this._mesh._texCoords[0].push(texCoords[t1].x);this._mesh._texCoords[0].push(texCoords[t1].y);if(numTexComponents===3){this._mesh._texCoords[0].push(texCoords[t1].z);} this._mesh._texCoords[0].push(texCoords[t2].x);this._mesh._texCoords[0].push(texCoords[t2].y);if(numTexComponents===3){this._mesh._texCoords[0].push(texCoords[t2].z);}} break;default:}} if(!hasNormal){this._mesh.calcNormals(normPerVert?Math.PI:0);} if(!hasTexCoord){this._mesh.calcTexCoords(texMode);} this._mesh.splitMesh();} else {faceCnt=0;for(i=0;i0)&&(i%3===0)){faceCnt++;} this._mesh._indices[0].push(indexes[i]);if(!normPerVert&&hasNormal){this._mesh._normals[0].push(normals[faceCnt].x);this._mesh._normals[0].push(normals[faceCnt].y);this._mesh._normals[0].push(normals[faceCnt].z);} if(!colPerVert&&hasColor){this._mesh._colors[0].push(colors[faceCnt].r);this._mesh._colors[0].push(colors[faceCnt].g);this._mesh._colors[0].push(colors[faceCnt].b);if(numColComponents===4){this._mesh._colors[0].push(colors[faceCnt].a);}}} this._mesh._positions[0]=positions.toGL();if(hasNormal){this._mesh._normals[0]=normals.toGL();} else{this._mesh.calcNormals(normPerVert?Math.PI:0);} if(hasTexCoord){this._mesh._texCoords[0]=texCoords.toGL();this._mesh._numTexComponents=numTexComponents;} else{this._mesh.calcTexCoords(texMode);} if(hasColor&&colPerVert){this._mesh._colors[0]=colors.toGL();this._mesh._numColComponents=numColComponents;}} this.invalidateVolume();this._mesh._numFaces=0;this._mesh._numCoords=0;for(i=0;ix3dom.Utils.maxIndexableCoords) {x3dom.debug.logWarning("IndexedTriangleSet: fieldChanged with "+"too many coordinates not yet implemented!");return;} if(fieldName=="coord") {this._mesh._positions[0]=pnts.toGL();this.invalidateVolume();Array.forEach(this._parentNodes,function(node){node._dirty.positions=true;node.invalidateVolume();});} else if(fieldName=="color") {pnts=this._cf.color.node._vf.color;if(this._vf.colorPerVertex){this._mesh._colors[0]=pnts.toGL();}else if(!this._vf.colorPerVertex){var faceCnt=0;var numColComponents=3;if(x3dom.isa(this._cf.color.node,x3dom.nodeTypes.ColorRGBA)){numColComponents=4;} this._mesh._colors[0]=[];var indexes=this._vf.index;for(var i=0;i0)&&(i%3===0)){faceCnt++;} this._mesh._colors[0].push(pnts[faceCnt].r);this._mesh._colors[0].push(pnts[faceCnt].g);this._mesh._colors[0].push(pnts[faceCnt].b);if(numColComponents===4){this._mesh._colors[0].push(pnts[faceCnt].a);}}} Array.forEach(this._parentNodes,function(node){node._dirty.colors=true;});} else if(fieldName=="normal") {pnts=this._cf.normal.node._vf.vector;if(this._vf.normalPerVertex){this._mesh._normals[0]=pnts.toGL();}else if(!this._vf.normalPerVertex){var indexes=this._vf.index;this._mesh._normals[0]=[];var faceCnt=0;for(var i=0;i0)&&(i%3===0)){faceCnt++;} this._mesh._normals[0].push(pnts[faceCnt].x);this._mesh._normals[0].push(pnts[faceCnt].y);this._mesh._normals[0].push(pnts[faceCnt].z);}} Array.forEach(this._parentNodes,function(node){node._dirty.normals=true;});} else if(fieldName=="texCoord") {var texCoordNode=this._cf.texCoord.node;if(x3dom.isa(texCoordNode,x3dom.nodeTypes.MultiTextureCoordinate)){if(texCoordNode._cf.texCoord.nodes.length) texCoordNode=texCoordNode._cf.texCoord.nodes[0];} pnts=texCoordNode._vf.point;this._mesh._texCoords[0]=pnts.toGL();Array.forEach(this._parentNodes,function(node){node._dirty.texcoords=true;});}}}));x3dom.registerNodeType("IndexedTriangleStripSet","Rendering",defineClass(x3dom.nodeTypes.X3DComposedGeometryNode,function(ctx){x3dom.nodeTypes.IndexedTriangleStripSet.superClass.call(this,ctx);this.addField_MFInt32(ctx,'index',[]);this._hasIndexOffset=false;this._indexOffset=null;},{hasIndexOffset:function(){return this._hasIndexOffset;},nodeChanged:function() {this.handleAttribs();var hasNormal=false,hasTexCoord=false,hasColor=false;var colPerVert=this._vf.colorPerVertex;var normPerVert=this._vf.normalPerVertex;var indexes=this._vf.index;var positions,normals,texCoords,colors;var coordNode=this._cf.coord.node;x3dom.debug.assert(coordNode);positions=coordNode._vf.point;var normalNode=this._cf.normal.node;if(normalNode){hasNormal=true;normals=normalNode._vf.vector;} else{hasNormal=false;} var texMode="",numTexComponents=2;var texCoordNode=this._cf.texCoord.node;if(x3dom.isa(texCoordNode,x3dom.nodeTypes.MultiTextureCoordinate)){if(texCoordNode._cf.texCoord.nodes.length) texCoordNode=texCoordNode._cf.texCoord.nodes[0];} if(texCoordNode){if(texCoordNode._vf.point){hasTexCoord=true;texCoords=texCoordNode._vf.point;if(x3dom.isa(texCoordNode,x3dom.nodeTypes.TextureCoordinate3D)){numTexComponents=3;}} else if(texCoordNode._vf.mode){texMode=texCoordNode._vf.mode;}} else{hasTexCoord=false;} this._mesh._numTexComponents=numTexComponents;var numColComponents=3;var colorNode=this._cf.color.node;if(colorNode){hasColor=true;colors=colorNode._vf.color;if(x3dom.isa(colorNode,x3dom.nodeTypes.ColorRGBA)){numColComponents=4;}} else{hasColor=false;} this._mesh._numColComponents=numColComponents;this._mesh._indices[0]=[];this._mesh._positions[0]=[];this._mesh._normals[0]=[];this._mesh._texCoords[0]=[];this._mesh._colors[0]=[];this.invalidateVolume();this._mesh._numFaces=0;this._mesh._numCoords=0;var faceCnt=0,cnt=0;if(hasNormal&&positions.length<=x3dom.Utils.maxIndexableCoords) {this._hasIndexOffset=true;this._indexOffset=[];this._mesh._primType='TRIANGLESTRIP';var indexOffset=[0];for(i=0;ix3dom.Utils.maxIndexableCoords)) {if(fieldName=="coord"){this._mesh._positions[0]=[];this._mesh._indices[0]=[];this._mesh._normals[0]=[];this._mesh._texCoords[0]=[];var hasNormal=false,hasTexCoord=false,hasColor=false;var colPerVert=this._vf.colorPerVertex;var normPerVert=this._vf.normalPerVertex;var indexes=this._vf.index;var positions,normals,texCoords,colors;var coordNode=this._cf.coord.node;x3dom.debug.assert(coordNode);positions=coordNode._vf.point;var normalNode=this._cf.normal.node;if(normalNode){hasNormal=true;normals=normalNode._vf.vector;} else{hasNormal=false;} var texMode="",numTexComponents=2;var texCoordNode=this._cf.texCoord.node;if(x3dom.isa(texCoordNode,x3dom.nodeTypes.MultiTextureCoordinate)){if(texCoordNode._cf.texCoord.nodes.length) texCoordNode=texCoordNode._cf.texCoord.nodes[0];} if(texCoordNode){if(texCoordNode._vf.point){hasTexCoord=true;texCoords=texCoordNode._vf.point;if(x3dom.isa(texCoordNode,x3dom.nodeTypes.TextureCoordinate3D)){numTexComponents=3;}} else if(texCoordNode._vf.mode){texMode=texCoordNode._vf.mode;}} else{hasTexCoord=false;} this._mesh._numTexComponents=numTexComponents;var numColComponents=3;var colorNode=this._cf.color.node;if(colorNode){hasColor=true;colors=colorNode._vf.color;if(x3dom.isa(colorNode,x3dom.nodeTypes.ColorRGBA)){numColComponents=4;}} else{hasColor=false;} this._mesh._numColComponents=numColComponents;this._mesh._indices[0]=[];this._mesh._positions[0]=[];this._mesh._normals[0]=[];this._mesh._texCoords[0]=[];this._mesh._colors[0]=[];var faceCnt=0,cnt=0;var p1,p2,p3,n1,n2,n3,t1,t2,t3,c1,c2,c3;var swapOrder=false;if(hasNormal||hasTexCoord||hasColor){for(var i=1;i0){positions.pop();} this._mesh._indices[0]=new Array(positions.length);this._mesh._positions[0]=[];this._mesh._normals[0]=[];this._mesh._texCoords[0]=[];this._mesh._colors[0]=[];var posMax=positions.length/3;var faceCnt,i=0;for(faceCnt=0;faceCnt0||this._cf.material.node._vf.backTransparency&&this._cf.material.node._vf.backTransparency>0)){this._vf.sortType='transparent';} else if(this._cf.texture.node&&this._cf.texture.node._vf.url.length){if(this._cf.texture.node._vf.url[0].toLowerCase().indexOf('.'+'png')>=0){this._vf.sortType='transparent';} else{this._vf.sortType='opaque';}} else{this._vf.sortType='opaque';}}},texTransformMatrix:function(){if(this._cf.textureTransform.node===null){return x3dom.fields.SFMatrix4f.identity();} else{return this._cf.textureTransform.node.texTransformMatrix();}},parentAdded:function(parent){if(this!=x3dom.nodeTypes.Appearance._defaultNode){parent.setAppDirty();}}}));x3dom.nodeTypes.Appearance.defaultNode=function(){if(!x3dom.nodeTypes.Appearance._defaultNode){x3dom.nodeTypes.Appearance._defaultNode=new x3dom.nodeTypes.Appearance();x3dom.nodeTypes.Appearance._defaultNode.nodeChanged();} return x3dom.nodeTypes.Appearance._defaultNode;};x3dom.registerNodeType("X3DAppearanceChildNode","Shape",defineClass(x3dom.nodeTypes.X3DNode,function(ctx){x3dom.nodeTypes.X3DAppearanceChildNode.superClass.call(this,ctx);}));x3dom.registerNodeType("BlendMode","Shape",defineClass(x3dom.nodeTypes.X3DAppearanceChildNode,function(ctx){x3dom.nodeTypes.BlendMode.superClass.call(this,ctx);this.addField_SFString(ctx,'srcFactor',"src_alpha");this.addField_SFString(ctx,'destFactor',"one_minus_src_alpha");this.addField_SFColor(ctx,'color',1,1,1);this.addField_SFFloat(ctx,'colorTransparency',0);this.addField_SFString(ctx,'alphaFunc',"none");this.addField_SFFloat(ctx,'alphaFuncValue',0);this.addField_SFString(ctx,'equation',"none");}));x3dom.registerNodeType("DepthMode","Shape",defineClass(x3dom.nodeTypes.X3DAppearanceChildNode,function(ctx){x3dom.nodeTypes.DepthMode.superClass.call(this,ctx);this.addField_SFBool(ctx,'enableDepthTest',true);this.addField_SFString(ctx,'depthFunc',"none");this.addField_SFBool(ctx,'readOnly',false);this.addField_SFFloat(ctx,'zNearRange',-1);this.addField_SFFloat(ctx,'zFarRange',-1);}));x3dom.registerNodeType("ColorMaskMode","Shape",defineClass(x3dom.nodeTypes.X3DAppearanceChildNode,function(ctx){x3dom.nodeTypes.ColorMaskMode.superClass.call(this,ctx);this.addField_SFBool(ctx,'maskR',true);this.addField_SFBool(ctx,'maskG',true);this.addField_SFBool(ctx,'maskB',true);this.addField_SFBool(ctx,'maskA',true);}));x3dom.registerNodeType("LineProperties","Shape",defineClass(x3dom.nodeTypes.X3DAppearanceChildNode,function(ctx){x3dom.nodeTypes.LineProperties.superClass.call(this,ctx);this.addField_SFBool(ctx,'applied',true);this.addField_SFInt32(ctx,'linetype',1);this.addField_SFFloat(ctx,'linewidthScaleFactor',0);}));x3dom.registerNodeType("X3DMaterialNode","Shape",defineClass(x3dom.nodeTypes.X3DAppearanceChildNode,function(ctx){x3dom.nodeTypes.X3DMaterialNode.superClass.call(this,ctx);}));x3dom.registerNodeType("Material","Shape",defineClass(x3dom.nodeTypes.X3DMaterialNode,function(ctx){x3dom.nodeTypes.Material.superClass.call(this,ctx);this.addField_SFFloat(ctx,'ambientIntensity',0.2);this.addField_SFColor(ctx,'diffuseColor',0.8,0.8,0.8);this.addField_SFColor(ctx,'emissiveColor',0,0,0);this.addField_SFFloat(ctx,'shininess',0.2);this.addField_SFColor(ctx,'specularColor',0,0,0);this.addField_SFFloat(ctx,'transparency',0);},{fieldChanged:function(fieldName){if(fieldName=="ambientIntensity"||fieldName=="diffuseColor"||fieldName=="emissiveColor"||fieldName=="shininess"||fieldName=="specularColor"||fieldName=="transparency") {Array.forEach(this._parentNodes,function(app){Array.forEach(app._parentNodes,function(shape){shape._dirty.material=true;});app.checkSortType();});}}}));x3dom.nodeTypes.Material.defaultNode=function(){if(!x3dom.nodeTypes.Material._defaultNode){x3dom.nodeTypes.Material._defaultNode=new x3dom.nodeTypes.Material();x3dom.nodeTypes.Material._defaultNode.nodeChanged();} return x3dom.nodeTypes.Material._defaultNode;};x3dom.registerNodeType("TwoSidedMaterial","Shape",defineClass(x3dom.nodeTypes.Material,function(ctx){x3dom.nodeTypes.TwoSidedMaterial.superClass.call(this,ctx);this.addField_SFFloat(ctx,'backAmbientIntensity',0.2);this.addField_SFColor(ctx,'backDiffuseColor',0.8,0.8,0.8);this.addField_SFColor(ctx,'backEmissiveColor',0,0,0);this.addField_SFFloat(ctx,'backShininess',0.2);this.addField_SFColor(ctx,'backSpecularColor',0,0,0);this.addField_SFFloat(ctx,'backTransparency',0);this.addField_SFBool(ctx,'separateBackColor',false);},{fieldChanged:function(fieldName){if(fieldName=="ambientIntensity"||fieldName=="diffuseColor"||fieldName=="emissiveColor"||fieldName=="shininess"||fieldName=="specularColor"||fieldName=="transparency"||fieldName=="backAmbientIntensity"||fieldName=="backDiffuseColor"||fieldName=="backEmissiveColor"||fieldName=="backShininess"||fieldName=="backSpecularColor"||fieldName=="backTransparency"||fieldName=="separateBackColor") {Array.forEach(this._parentNodes,function(app){Array.forEach(app._parentNodes,function(shape){shape._dirty.material=true;});app.checkSortType();});}}}));x3dom.registerNodeType("X3DShapeNode","Shape",defineClass(x3dom.nodeTypes.X3DBoundedObject,function(ctx){x3dom.nodeTypes.X3DShapeNode.superClass.call(this,ctx);this.addField_SFBool(ctx,'isPickable',true);this.addField_SFInt32(ctx,'idOffset',0);this.addField_SFNode('appearance',x3dom.nodeTypes.X3DAppearanceNode);this.addField_SFNode('geometry',x3dom.nodeTypes.X3DGeometryNode);this._objectID=0;this._shaderProperties=null;this._clipPlanes=[];this._cleanupGLObjects=null;this._dirty={positions:true,normals:true,texcoords:true,colors:true,specialAttribs:true,indexes:true,texture:true,material:true,text:true,shader:true,ids:true};this._coordStrideOffset=[0,0];this._normalStrideOffset=[0,0];this._texCoordStrideOffset=[0,0];this._colorStrideOffset=[0,0];this._idStrideOffset=[0,0];this._tessellationProperties=[];},{collectDrawableObjects:function(transform,drawableCollection,singlePath,invalidateCache,planeMask,clipPlanes) {var graphState=this.graphState();if(singlePath&&(this._parentNodes.length>1)) singlePath=false;if(singlePath&&(invalidateCache=invalidateCache||this.cacheInvalid())) this.invalidateCache();if(!this._cf.geometry.node||drawableCollection.cull(transform,graphState,singlePath,planeMask)<=0){return false;} if(singlePath&&!this._graph.globalMatrix) this._graph.globalMatrix=transform;if(this._clipPlanes.length!=clipPlanes.length) {this._dirty.shader=true;} this._clipPlanes=clipPlanes;drawableCollection.addShape(this,transform,graphState);return true;},getVolume:function() {var vol=this._graph.volume;if(!this.volumeValid()&&this._vf.render) {var geo=this._cf.geometry.node;var childVol=geo?geo.getVolume():null;if(childVol&&childVol.isValid()) vol.extendBounds(childVol.min,childVol.max);} return vol;},getCenter:function(){var geo=this._cf.geometry.node;return(geo?geo.getCenter():new x3dom.fields.SFVec3f(0,0,0));},getDiameter:function(){var geo=this._cf.geometry.node;return(geo?geo.getDiameter():0);},doIntersect:function(line){return this._cf.geometry.node.doIntersect(line);},forceUpdateCoverage:function() {var geo=this._cf.geometry.node;return(geo?geo.forceUpdateCoverage():false);},tessellationProperties:function() {var geo=this._cf.geometry.node;if(geo&&geo._indexOffset) return geo._indexOffset;else return this._tessellationProperties;},isLit:function(){return this._cf.geometry.node._vf.lit;},isSolid:function(){var twoSidedMat=(this._cf.appearance.node&&this._cf.appearance.node._cf.material.node&&x3dom.isa(this._cf.appearance.node._cf.material.node,x3dom.nodeTypes.TwoSidedMaterial));return this._cf.geometry.node._vf.solid&&!twoSidedMat;},isCCW:function(){return this._cf.geometry.node._vf.ccw;},parentRemoved:function(parent){for(var i=0,n=this._childNodes.length;i0) this.invalidateVolume();if(this._cleanupGLObjects){this._cleanupGLObjects();}},unsetDirty:function(){this._dirty.positions=false;this._dirty.normals=false;this._dirty.texcoords=false;this._dirty.colors=false;this._dirty.specialAttribs=false;this._dirty.indexes=false;this._dirty.texture=false;this._dirty.material=false;this._dirty.text=false;this._dirty.shader=false;},unsetGeoDirty:function(){this._dirty.positions=false;this._dirty.normals=false;this._dirty.texcoords=false;this._dirty.colors=false;this._dirty.specialAttribs=false;this._dirty.indexes=false;},setAllDirty:function(){this._dirty.positions=true;this._dirty.normals=true;this._dirty.texcoords=true;this._dirty.colors=true;this._dirty.specialAttribs=true;this._dirty.indexes=true;this._dirty.texture=true;this._dirty.material=true;this._dirty.text=true;this._dirty.shader=true;this.invalidateVolume();},setAppDirty:function(){this._dirty.texture=true;this._dirty.material=true;this._dirty.shader=true;},setGeoDirty:function(){this._dirty.positions=true;this._dirty.normals=true;this._dirty.texcoords=true;this._dirty.colors=true;this._dirty.specialAttribs=true;this._dirty.indexes=true;this.invalidateVolume();},getShaderProperties:function(viewarea) {if(this._shaderProperties==null||this._dirty.shader==true||(this._webgl!==undefined&&this._webgl.dirtyLighting!=x3dom.Utils.checkDirtyLighting(viewarea))||x3dom.Utils.checkDirtyEnvironment(viewarea,this._shaderProperties)==true) {this._shaderProperties=x3dom.Utils.generateProperties(viewarea,this);this._dirty.shader=false;if(this._webgl!==undefined) {this._webgl.dirtyLighting=x3dom.Utils.checkDirtyLighting(viewarea);}} return this._shaderProperties;},getTextures:function(){var textures=[];var appearance=this._cf.appearance.node;if(appearance){var tex=appearance._cf.texture.node;if(tex){if(x3dom.isa(tex,x3dom.nodeTypes.MultiTexture)){textures=textures.concat(tex.getTextures());} else{textures.push(tex);}} var shader=appearance._cf.shaders.nodes[0];if(shader){if(x3dom.isa(shader,x3dom.nodeTypes.CommonSurfaceShader)){textures=textures.concat(shader.getTextures());}}} var geometry=this._cf.geometry.node;if(geometry){if(x3dom.isa(geometry,x3dom.nodeTypes.ImageGeometry)){textures=textures.concat(geometry.getTextures());} else if(x3dom.isa(geometry,x3dom.nodeTypes.Text)){textures=textures.concat(geometry);}} return textures;}}));x3dom.registerNodeType("Shape","Shape",defineClass(x3dom.nodeTypes.X3DShapeNode,function(ctx){x3dom.nodeTypes.Shape.superClass.call(this,ctx);},{nodeChanged:function(){if(!this._cf.appearance.node){} if(!this._cf.geometry.node){if(this._DEF) x3dom.debug.logError("No geometry given in Shape/"+this._DEF);} else if(!this._objectID){this._objectID=++x3dom.nodeTypes.Shape.objectID;x3dom.nodeTypes.Shape.idMap.nodeID[this._objectID]=this;} this.invalidateVolume();}}));x3dom.nodeTypes.Shape.shaderPartID=0;x3dom.nodeTypes.Shape.objectID=0;x3dom.nodeTypes.Shape.idMap={nodeID:{},remove:function(obj){for(var prop in this.nodeID){if(this.nodeID.hasOwnProperty(prop)){var val=this.nodeID[prop];if(val._objectID&&obj._objectID&&val._objectID===obj._objectID) {delete this.nodeID[prop];x3dom.debug.logInfo("Unreg "+val._objectID);}}}}};x3dom.registerNodeType("X3DLightNode","Lighting",defineClass(x3dom.nodeTypes.X3DChildNode,function(ctx){x3dom.nodeTypes.X3DLightNode.superClass.call(this,ctx);if(ctx) ctx.doc._nodeBag.lights.push(this);else x3dom.debug.logWarning("X3DLightNode: No runtime context found!");this._lightID=0;this._dirty=true;this.addField_SFFloat(ctx,'ambientIntensity',0);this.addField_SFColor(ctx,'color',1,1,1);this.addField_SFFloat(ctx,'intensity',1);this.addField_SFBool(ctx,'global',false);this.addField_SFBool(ctx,'on',true);this.addField_SFFloat(ctx,'shadowIntensity',0);this.addField_SFInt32(ctx,'shadowMapSize',1024);this.addField_SFInt32(ctx,'shadowFilterSize',0);this.addField_SFFloat(ctx,'shadowOffset',0);this.addField_SFFloat(ctx,'zNear',-1);this.addField_SFFloat(ctx,'zFar',-1);},{getViewMatrix:function(vec){return x3dom.fields.SFMatrix4f.identity;},nodeChanged:function(){if(!this._lightID){this._lightID=++x3dom.nodeTypes.X3DLightNode.lightID;}},fieldChanged:function(fieldName) {if(this._vf.hasOwnProperty(fieldName)){this._dirty=true;}},parentRemoved:function(parent) {if(this._parentNodes.length===1&&this._parentNodes[0]==parent){var doc=this.findX3DDoc();for(var i=0,n=doc._nodeBag.lights.length;i=this._vf.duration){return 1;} return this.stepResponseCore(t/this._vf.duration);},stepResponseCore:function(T) {return 0.5-0.5*Math.cos(T*Math.PI);}}));x3dom.registerNodeType("X3DChaserNode","Followers",defineClass(x3dom.nodeTypes.X3DFollowerNode,function(ctx){x3dom.nodeTypes.X3DChaserNode.superClass.call(this,ctx);this.addField_SFTime(ctx,'duration',1);this._initDone=false;this._stepTime=0;this._currTime=0;this._bufferEndTime=0;this._numSupports=60;}));x3dom.registerNodeType("X3DDamperNode","Followers",defineClass(x3dom.nodeTypes.X3DFollowerNode,function(ctx){x3dom.nodeTypes.X3DDamperNode.superClass.call(this,ctx);this.addField_SFTime(ctx,'tau',0.3);this.addField_SFFloat(ctx,'tolerance',-1);this.addField_SFInt32(ctx,'order',3);this._eps=this._vf.tolerance<0?this._eps:this._vf.tolerance;this._lastTick=0;}));x3dom.registerNodeType("ColorChaser","Followers",defineClass(x3dom.nodeTypes.X3DChaserNode,function(ctx){x3dom.nodeTypes.ColorChaser.superClass.call(this,ctx);this.addField_SFColor(ctx,'initialDestination',0.8,0.8,0.8);this.addField_SFColor(ctx,'initialValue',0.8,0.8,0.8);this.addField_SFColor(ctx,'value',0,0,0);this.addField_SFColor(ctx,'destination',0,0,0);this._buffer=new x3dom.fields.MFColor();this._previousValue=new x3dom.fields.SFColor(0,0,0);this._value=new x3dom.fields.SFColor(0,0,0);this.initialize();},{fieldChanged:function(fieldName) {if(fieldName.indexOf("destination")>=0) {this.initialize();this.updateBuffer(this._currTime);if(!this._vf.isActive){this.postMessage('isActive',true);}} else if(fieldName.indexOf("value")>=0) {this.initialize();this._previousValue.setValues(this._vf.value);for(var C=1;C=0;C--) {DeltaIn=this._buffer[C].subtract(this._buffer[C+1]);DeltaOut=DeltaIn.multiply(this.stepResponse((C+Frac)*this._stepTime));Output=Output.add(DeltaOut);} if(!Output.equals(this._value,this._eps)){this._value.setValues(Output);this.postMessage('value',this._value);} else{this.postMessage('isActive',false);} return this._vf.isActive;},updateBuffer:function(now) {var Frac=(now-this._bufferEndTime)/this._stepTime;var C;var NumToShift;var Alpha;if(Frac>=1) {NumToShift=Math.floor(Frac);Frac-=NumToShift;if(NumToShift=NumToShift;C--){this._buffer[C]=this._buffer[C-NumToShift];} for(C=0;C=0) {if(!this._value0.equals(this._vf.destination,this._eps)){this._value0=this._vf.destination;if(!this._vf.isActive){this.postMessage('isActive',true);}}} else if(fieldName.indexOf("value")>=0) {this._value1.setValues(this._vf.value);this._value2.setValues(this._vf.value);this._value3.setValues(this._vf.value);this._value4.setValues(this._vf.value);this._value5.setValues(this._vf.value);this._lastTick=0;this.postMessage('value',this._value5);if(!this._vf.isActive){this._lastTick=0;this.postMessage('isActive',true);}}},initialize:function() {this._value0.setValues(this._vf.initialDestination);this._value1.setValues(this._vf.initialValue);this._value2.setValues(this._vf.initialValue);this._value3.setValues(this._vf.initialValue);this._value4.setValues(this._vf.initialValue);this._value5.setValues(this._vf.initialValue);this._lastTick=0;var active=!this._value0.equals(this._value1,this._eps);if(this._vf.isActive!==active){this.postMessage('isActive',active);}},distance:function(a,b) {var diff=a.subtract(b);return Math.sqrt(diff.r*diff.r+diff.g*diff.g+diff.b*diff.b);},tick:function(now) {if(!this._lastTick) {this._lastTick=now;return false;} var delta=now-this._lastTick;var alpha=Math.exp(-delta/this._vf.tau);this._value1=this._vf.order>0&&this._vf.tau?this._value0.add(this._value1.subtract(this._value0).multiply(alpha)):new x3dom.fields.SFColor(this._value0.r,this._value0.g,this._value0.b);this._value2=this._vf.order>1&&this._vf.tau?this._value1.add(this._value2.subtract(this._value1).multiply(alpha)):new x3dom.fields.SFColor(this._value1.r,this._value1.g,this._value1.b);this._value3=this._vf.order>2&&this._vf.tau?this._value2.add(this._value3.subtract(this._value2).multiply(alpha)):new x3dom.fields.SFColor(this._value2.r,this._value2.g,this._value2.b);this._value4=this._vf.order>3&&this._vf.tau?this._value3.add(this._value4.subtract(this._value3).multiply(alpha)):new x3dom.fields.SFColor(this._value3.r,this._value3.g,this._value3.b);this._value5=this._vf.order>4&&this._vf.tau?this._value4.add(this._value5.subtract(this._value4).multiply(alpha)):new x3dom.fields.SFColor(this._value4.r,this._value4.g,this._value4.b);var dist=this.distance(this._value1,this._value0);if(this._vf.order>1) {var dist2=this.distance(this._value2,this._value1);if(dist2>dist){dist=dist2;}} if(this._vf.order>2) {var dist3=this.distance(this._value3,this._value2);if(dist3>dist){dist=dist3;}} if(this._vf.order>3) {var dist4=this.distance(this._value4,this._value3);if(dist4>dist){dist=dist4;}} if(this._vf.order>4) {var dist5=this.distance(this._value5,this._value4);if(dist5>dist){dist=dist5;}} if(dist<=this._eps) {this._value1.setValues(this._value0);this._value2.setValues(this._value0);this._value3.setValues(this._value0);this._value4.setValues(this._value0);this._value5.setValues(this._value0);this.postMessage('value',this._value0);this.postMessage('isActive',false);this._lastTick=0;return false;} this.postMessage('value',this._value5);this._lastTick=now;return true;}}));x3dom.registerNodeType("OrientationChaser","Followers",defineClass(x3dom.nodeTypes.X3DChaserNode,function(ctx){x3dom.nodeTypes.OrientationChaser.superClass.call(this,ctx);this.addField_SFRotation(ctx,'initialDestination',0,1,0,0);this.addField_SFRotation(ctx,'initialValue',0,1,0,0);this.addField_SFRotation(ctx,'value',0,1,0,0);this.addField_SFRotation(ctx,'destination',0,1,0,0);this._numSupports=30;this._buffer=new x3dom.fields.MFRotation();this._previousValue=new x3dom.fields.Quaternion(0,1,0,0);this._value=new x3dom.fields.Quaternion(0,1,0,0);this.initialize();},{fieldChanged:function(fieldName) {if(fieldName.indexOf("destination")>=0) {this.initialize();this.updateBuffer(this._currTime);if(!this._vf.isActive){this.postMessage('isActive',true);}} else if(fieldName.indexOf("value")>=0) {this.initialize();this._previousValue.setValues(this._vf.value);for(var C=1;C=0;C--) {DeltaIn=this._buffer[C+1].inverse().multiply(this._buffer[C]);Output=Output.slerp(Output.multiply(DeltaIn),this.stepResponse((C+Frac)*this._stepTime));} if(!Output.equals(this._value,this._eps)){Output=Output.normalize(Output);this._value.setValues(Output);this.postMessage('value',this._value);} else{this.postMessage('isActive',false);} return this._vf.isActive;},updateBuffer:function(now) {var Frac=(now-this._bufferEndTime)/this._stepTime;var C;var NumToShift;var Alpha;if(Frac>=1) {NumToShift=Math.floor(Frac);Frac-=NumToShift;if(NumToShift=NumToShift;C--){this._buffer[C]=x3dom.fields.Quaternion.copy(this._buffer[C-NumToShift]);} for(C=0;C=0) {if(!this._value0.equals(this._vf.destination,this._eps)){this._value0=this._vf.destination;if(!this._vf.isActive){this.postMessage('isActive',true);}}} else if(fieldName.indexOf("value")>=0) {this._value1.setValues(this._vf.value);this._value2.setValues(this._vf.value);this._value3.setValues(this._vf.value);this._value4.setValues(this._vf.value);this._value5.setValues(this._vf.value);this._lastTick=0;this.postMessage('value',this._value5);if(!this._vf.isActive){this._lastTick=0;this.postMessage('isActive',true);}}},initialize:function() {this._value0.setValues(this._vf.initialDestination);this._value1.setValues(this._vf.initialValue);this._value2.setValues(this._vf.initialValue);this._value3.setValues(this._vf.initialValue);this._value4.setValues(this._vf.initialValue);this._value5.setValues(this._vf.initialValue);this._lastTick=0;var active=!this._value0.equals(this._value1,this._eps);if(this._vf.isActive!==active){this.postMessage('isActive',active);}},tick:function(now) {if(!this._lastTick) {this._lastTick=now;return false;} var delta=now-this._lastTick;var alpha=Math.exp(-delta/this._vf.tau);this._value1=this._vf.order>0&&this._vf.tau?this._value0.slerp(this._value1,alpha):new x3dom.fields.Quaternion(this._value0.x,this._value0.y,this._value0.z,this._value0.w);this._value2=this._vf.order>1&&this._vf.tau?this._value1.slerp(this._value2,alpha):new x3dom.fields.Quaternion(this._value1.x,this._value1.y,this._value1.z,this._value1.w);this._value3=this._vf.order>2&&this._vf.tau?this._value2.slerp(this._value3,alpha):new x3dom.fields.Quaternion(this._value2.x,this._value2.y,this._value2.z,this._value2.w);this._value4=this._vf.order>3&&this._vf.tau?this._value3.slerp(this._value4,alpha):new x3dom.fields.Quaternion(this._value3.x,this._value3.y,this._value3.z,this._value3.w);this._value5=this._vf.order>4&&this._vf.tau?this._value4.slerp(this._value5,alpha):new x3dom.fields.Quaternion(this._value4.x,this._value4.y,this._value4.z,this._value4.w);var dist=Math.abs(this._value1.inverse().multiply(this._value0).angle());if(this._vf.order>1) {var dist2=Math.abs(this._value2.inverse().multiply(this._value1).angle());if(dist2>dist){dist=dist2;}} if(this._vf.order>2) {var dist3=Math.abs(this._value3.inverse().multiply(this._value2).angle());if(dist3>dist){dist=dist3;}} if(this._vf.order>3) {var dist4=Math.abs(this._value4.inverse().multiply(this._value3).angle());if(dist4>dist){dist=dist4;}} if(this._vf.order>4) {var dist5=Math.abs(this._value5.inverse().multiply(this._value4).angle());if(dist5>dist){dist=dist5;}} if(dist<=this._eps) {this._value1.setValues(this._value0);this._value2.setValues(this._value0);this._value3.setValues(this._value0);this._value4.setValues(this._value0);this._value5.setValues(this._value0);this.postMessage('value',this._value0);this.postMessage('isActive',false);this._lastTick=0;return false;} this.postMessage('value',this._value5);this._lastTick=now;return true;}}));x3dom.registerNodeType("PositionChaser","Followers",defineClass(x3dom.nodeTypes.X3DChaserNode,function(ctx){x3dom.nodeTypes.PositionChaser.superClass.call(this,ctx);this.addField_SFVec3f(ctx,'initialDestination',0,0,0);this.addField_SFVec3f(ctx,'initialValue',0,0,0);this.addField_SFVec3f(ctx,'value',0,0,0);this.addField_SFVec3f(ctx,'destination',0,0,0);this._buffer=new x3dom.fields.MFVec3f();this._previousValue=new x3dom.fields.SFVec3f(0,0,0);this._value=new x3dom.fields.SFVec3f(0,0,0);this.initialize();},{fieldChanged:function(fieldName) {if(fieldName.indexOf("destination")>=0) {this.initialize();this.updateBuffer(this._currTime);if(!this._vf.isActive){this.postMessage('isActive',true);}} else if(fieldName.indexOf("value")>=0) {this.initialize();this._previousValue.setValues(this._vf.value);for(var C=1;C=0;C--) {DeltaIn=this._buffer[C].subtract(this._buffer[C+1]);DeltaOut=DeltaIn.multiply(this.stepResponse((C+Frac)*this._stepTime));Output=Output.add(DeltaOut);} if(!Output.equals(this._value,this._eps)){this._value.setValues(Output);this.postMessage('value',this._value);} else{this.postMessage('isActive',false);} return this._vf.isActive;},updateBuffer:function(now) {var Frac=(now-this._bufferEndTime)/this._stepTime;var C;var NumToShift;var Alpha;if(Frac>=1) {NumToShift=Math.floor(Frac);Frac-=NumToShift;if(NumToShift=NumToShift;C--){this._buffer[C]=x3dom.fields.SFVec3f.copy(this._buffer[C-NumToShift]);} for(C=0;C=0) {this.initialize();this.updateBuffer(this._currTime);if(!this._vf.isActive){this.postMessage('isActive',true);}} else if(fieldName.indexOf("value")>=0) {this.initialize();this._previousValue.setValues(this._vf.value);for(var C=1;C=0;C--) {DeltaIn=this._buffer[C].subtract(this._buffer[C+1]);DeltaOut=DeltaIn.multiply(this.stepResponse((C+Frac)*this._stepTime));Output=Output.add(DeltaOut);} if(!Output.equals(this._value,this._eps)){this._value.setValues(Output);this.postMessage('value',this._value);} else{this.postMessage('isActive',false);} return this._vf.isActive;},updateBuffer:function(now) {var Frac=(now-this._bufferEndTime)/this._stepTime;var C;var NumToShift;var Alpha;if(Frac>=1) {NumToShift=Math.floor(Frac);Frac-=NumToShift;if(NumToShift=NumToShift;C--){this._buffer[C]=x3dom.fields.SFVec2f.copy(this._buffer[C-NumToShift]);} for(C=0;C=0) {if(!this._value0.equals(this._vf.destination,this._eps)){this._value0=this._vf.destination;if(!this._vf.isActive){this.postMessage('isActive',true);}}} else if(fieldName.indexOf("value")>=0) {this._value1.setValues(this._vf.value);this._value2.setValues(this._vf.value);this._value3.setValues(this._vf.value);this._value4.setValues(this._vf.value);this._value5.setValues(this._vf.value);this._lastTick=0;this.postMessage('value',this._value5);if(!this._vf.isActive){this._lastTick=0;this.postMessage('isActive',true);}}},initialize:function() {this._value0.setValues(this._vf.initialDestination);this._value1.setValues(this._vf.initialValue);this._value2.setValues(this._vf.initialValue);this._value3.setValues(this._vf.initialValue);this._value4.setValues(this._vf.initialValue);this._value5.setValues(this._vf.initialValue);this._lastTick=0;var active=!this._value0.equals(this._value1,this._eps);if(this._vf.isActive!==active){this.postMessage('isActive',active);}},tick:function(now) {if(!this._lastTick) {this._lastTick=now;return false;} var delta=now-this._lastTick;var alpha=Math.exp(-delta/this._vf.tau);this._value1=this._vf.order>0&&this._vf.tau?this._value0.add(this._value1.subtract(this._value0).multiply(alpha)):new x3dom.fields.SFVec3f(this._value0.x,this._value0.y,this._value0.z);this._value2=this._vf.order>1&&this._vf.tau?this._value1.add(this._value2.subtract(this._value1).multiply(alpha)):new x3dom.fields.SFVec3f(this._value1.x,this._value1.y,this._value1.z);this._value3=this._vf.order>2&&this._vf.tau?this._value2.add(this._value3.subtract(this._value2).multiply(alpha)):new x3dom.fields.SFVec3f(this._value2.x,this._value2.y,this._value2.z);this._value4=this._vf.order>3&&this._vf.tau?this._value3.add(this._value4.subtract(this._value3).multiply(alpha)):new x3dom.fields.SFVec3f(this._value3.x,this._value3.y,this._value3.z);this._value5=this._vf.order>4&&this._vf.tau?this._value4.add(this._value5.subtract(this._value4).multiply(alpha)):new x3dom.fields.SFVec3f(this._value4.x,this._value4.y,this._value4.z);var dist=this._value1.subtract(this._value0).length();if(this._vf.order>1) {var dist2=this._value2.subtract(this._value1).length();if(dist2>dist){dist=dist2;}} if(this._vf.order>2) {var dist3=this._value3.subtract(this._value2).length();if(dist3>dist){dist=dist3;}} if(this._vf.order>3) {var dist4=this._value4.subtract(this._value3).length();if(dist4>dist){dist=dist4;}} if(this._vf.order>4) {var dist5=this._value5.subtract(this._value4).length();if(dist5>dist){dist=dist5;}} if(dist<=this._eps) {this._value1.setValues(this._value0);this._value2.setValues(this._value0);this._value3.setValues(this._value0);this._value4.setValues(this._value0);this._value5.setValues(this._value0);this.postMessage('value',this._value0);this.postMessage('isActive',false);this._lastTick=0;return false;} this.postMessage('value',this._value5);this._lastTick=now;return true;}}));x3dom.registerNodeType("PositionDamper2D","Followers",defineClass(x3dom.nodeTypes.X3DDamperNode,function(ctx){x3dom.nodeTypes.PositionDamper2D.superClass.call(this,ctx);this.addField_SFVec2f(ctx,'initialDestination',0,0);this.addField_SFVec2f(ctx,'initialValue',0,0);this.addField_SFVec2f(ctx,'value',0,0);this.addField_SFVec2f(ctx,'destination',0,0);this._value0=new x3dom.fields.SFVec2f(0,0);this._value1=new x3dom.fields.SFVec2f(0,0);this._value2=new x3dom.fields.SFVec2f(0,0);this._value3=new x3dom.fields.SFVec2f(0,0);this._value4=new x3dom.fields.SFVec2f(0,0);this._value5=new x3dom.fields.SFVec2f(0,0);this.initialize();},{fieldChanged:function(fieldName) {if(fieldName==="tolerance") {this._eps=this._vf.tolerance<0?0.001:this._vf.tolerance;} else if(fieldName.indexOf("destination")>=0) {if(!this._value0.equals(this._vf.destination,this._eps)){this._value0=this._vf.destination;if(!this._vf.isActive){this.postMessage('isActive',true);}}} else if(fieldName.indexOf("value")>=0) {this._value1.setValues(this._vf.value);this._value2.setValues(this._vf.value);this._value3.setValues(this._vf.value);this._value4.setValues(this._vf.value);this._value5.setValues(this._vf.value);this._lastTick=0;this.postMessage('value',this._value5);if(!this._vf.isActive){this._lastTick=0;this.postMessage('isActive',true);}}},initialize:function() {this._value0.setValues(this._vf.initialDestination);this._value1.setValues(this._vf.initialValue);this._value2.setValues(this._vf.initialValue);this._value3.setValues(this._vf.initialValue);this._value4.setValues(this._vf.initialValue);this._value5.setValues(this._vf.initialValue);this._lastTick=0;var active=!this._value0.equals(this._value1,this._eps);if(this._vf.isActive!==active){this.postMessage('isActive',active);}},tick:function(now) {if(!this._lastTick) {this._lastTick=now;return false;} var delta=now-this._lastTick;var alpha=Math.exp(-delta/this._vf.tau);this._value1=this._vf.order>0&&this._vf.tau?this._value0.add(this._value1.subtract(this._value0).multiply(alpha)):new x3dom.fields.SFVec2f(this._value0.x,this._value0.y,this._value0.z);this._value2=this._vf.order>1&&this._vf.tau?this._value1.add(this._value2.subtract(this._value1).multiply(alpha)):new x3dom.fields.SFVec2f(this._value1.x,this._value1.y,this._value1.z);this._value3=this._vf.order>2&&this._vf.tau?this._value2.add(this._value3.subtract(this._value2).multiply(alpha)):new x3dom.fields.SFVec2f(this._value2.x,this._value2.y,this._value2.z);this._value4=this._vf.order>3&&this._vf.tau?this._value3.add(this._value4.subtract(this._value3).multiply(alpha)):new x3dom.fields.SFVec2f(this._value3.x,this._value3.y,this._value3.z);this._value5=this._vf.order>4&&this._vf.tau?this._value4.add(this._value5.subtract(this._value4).multiply(alpha)):new x3dom.fields.SFVec2f(this._value4.x,this._value4.y,this._value4.z);var dist=this._value1.subtract(this._value0).length();if(this._vf.order>1) {var dist2=this._value2.subtract(this._value1).length();if(dist2>dist){dist=dist2;}} if(this._vf.order>2) {var dist3=this._value3.subtract(this._value2).length();if(dist3>dist){dist=dist3;}} if(this._vf.order>3) {var dist4=this._value4.subtract(this._value3).length();if(dist4>dist){dist=dist4;}} if(this._vf.order>4) {var dist5=this._value5.subtract(this._value4).length();if(dist5>dist){dist=dist5;}} if(dist<=this._eps) {this._value1.setValues(this._value0);this._value2.setValues(this._value0);this._value3.setValues(this._value0);this._value4.setValues(this._value0);this._value5.setValues(this._value0);this.postMessage('value',this._value0);this.postMessage('isActive',false);this._lastTick=0;return false;} this.postMessage('value',this._value5);this._lastTick=now;return true;}}));x3dom.registerNodeType("ScalarChaser","Followers",defineClass(x3dom.nodeTypes.X3DChaserNode,function(ctx){x3dom.nodeTypes.ScalarChaser.superClass.call(this,ctx);this.addField_SFFloat(ctx,'initialDestination',0);this.addField_SFFloat(ctx,'initialValue',0);this.addField_SFFloat(ctx,'value',0);this.addField_SFFloat(ctx,'destination',0);this._buffer=[];this._previousValue=0;this._value=0;this.initialize();},{fieldChanged:function(fieldName) {if(fieldName.indexOf("destination")>=0) {this.initialize();this.updateBuffer(this._currTime);if(!this._vf.isActive){this.postMessage('isActive',true);}} else if(fieldName.indexOf("value")>=0) {this.initialize();this._previousValue=this._vf.value;for(var C=1;Cthis._eps);if(this._vf.isActive!==active){this.postMessage('isActive',active);}}},tick:function(now) {this.initialize();this._currTime=now;if(!this._bufferEndTime) {this._bufferEndTime=now;this._value=this._vf.initialValue;this.postMessage('value',this._value);return true;} var Frac=this.updateBuffer(now);var Output=this._previousValue;var DeltaIn=this._buffer[this._buffer.length-1]-this._previousValue;var DeltaOut=DeltaIn*(this.stepResponse((this._buffer.length-1+Frac)*this._stepTime));Output=Output+DeltaOut;for(var C=this._buffer.length-2;C>=0;C--) {DeltaIn=this._buffer[C]-this._buffer[C+1];DeltaOut=DeltaIn*(this.stepResponse((C+Frac)*this._stepTime));Output=Output+DeltaOut;} if(Math.abs(Output-this._value)>this._eps){this._value=Output;this.postMessage('value',this._value);} else{this.postMessage('isActive',false);} return this._vf.isActive;},updateBuffer:function(now) {var Frac=(now-this._bufferEndTime)/this._stepTime;var C;var NumToShift;var Alpha;if(Frac>=1) {NumToShift=Math.floor(Frac);Frac-=NumToShift;if(NumToShift=NumToShift;C--){this._buffer[C]=this._buffer[C-NumToShift];} for(C=0;C=0) {if(Math.abs(this._value0-this._vf.destination)>this._eps){this._value0=this._vf.destination;if(!this._vf.isActive){this.postMessage('isActive',true);}}} else if(fieldName.indexOf("value")>=0) {this._value1=this._vf.value;this._value2=this._vf.value;this._value3=this._vf.value;this._value4=this._vf.value;this._value5=this._vf.value;this._lastTick=0;this.postMessage('value',this._value5);if(!this._vf.isActive){this._lastTick=0;this.postMessage('isActive',true);}}},initialize:function() {this._value0=this._vf.initialDestination;this._value1=this._vf.initialValue;this._value2=this._vf.initialValue;this._value3=this._vf.initialValue;this._value4=this._vf.initialValue;this._value5=this._vf.initialValue;this._lastTick=0;var active=(Math.abs(this._value0-this._value1)>this._eps);if(this._vf.isActive!==active){this.postMessage('isActive',active);}},tick:function(now) {if(!this._lastTick) {this._lastTick=now;return false;} var delta=now-this._lastTick;var alpha=Math.exp(-delta/this._vf.tau);this._value1=this._vf.order>0&&this._vf.tau?this._value0+alpha*(this._value1-this._value0):this._value0;this._value2=this._vf.order>1&&this._vf.tau?this._value1+alpha*(this._value2-this._value1):this._value1;this._value3=this._vf.order>2&&this._vf.tau?this._value2+alpha*(this._value3-this._value2):this._value2;this._value4=this._vf.order>3&&this._vf.tau?this._value3+alpha*(this._value4-this._value3):this._value3;this._value5=this._vf.order>4&&this._vf.tau?this._value4+alpha*(this._value5-this._value4):this._value4;var dist=Math.abs(this._value1-this._value0);if(this._vf.order>1) {var dist2=Math.abs(this._value2-this._value1);if(dist2>dist){dist=dist2;}} if(this._vf.order>2) {var dist3=Math.abs(this._value3-this._value2);if(dist3>dist){dist=dist3;}} if(this._vf.order>3) {var dist4=Math.abs(this._value4-this._value3);if(dist4>dist){dist=dist4;}} if(this._vf.order>4) {var dist5=Math.abs(this._value5-this._value4);if(dist5>dist){dist=dist5;}} if(dist<=this._eps) {this._value1=this._value0;this._value2=this._value0;this._value3=this._value0;this._value4=this._value0;this._value5=this._value0;this.postMessage('value',this._value0);this.postMessage('isActive',false);this._lastTick=0;return false;} this.postMessage('value',this._value5);this._lastTick=now;return true;}}));x3dom.registerNodeType("CoordinateDamper","Followers",defineClass(x3dom.nodeTypes.X3DDamperNode,function(ctx){x3dom.nodeTypes.CoordinateDamper.superClass.call(this,ctx);this.addField_MFVec3f(ctx,'initialDestination',[]);this.addField_MFVec3f(ctx,'initialValue',[]);this.addField_MFVec3f(ctx,'value',[]);this.addField_MFVec3f(ctx,'destination',[]);x3dom.debug.logWarning("CoordinateDamper NYI");}));x3dom.registerNodeType("TexCoordDamper2D","Followers",defineClass(x3dom.nodeTypes.X3DDamperNode,function(ctx){x3dom.nodeTypes.TexCoordDamper2D.superClass.call(this,ctx);this.addField_MFVec2f(ctx,'initialDestination',[]);this.addField_MFVec2f(ctx,'initialValue',[]);this.addField_MFVec2f(ctx,'value',[]);this.addField_MFVec2f(ctx,'destination',[]);x3dom.debug.logWarning("TexCoordDamper2D NYI");}));x3dom.registerNodeType("X3DInterpolatorNode","Interpolation",defineClass(x3dom.nodeTypes.X3DChildNode,function(ctx){x3dom.nodeTypes.X3DInterpolatorNode.superClass.call(this,ctx);this.addField_MFFloat(ctx,'key',[]);this.addField_SFFloat(ctx,'set_fraction',0);},{linearInterp:function(time,interp){if(time<=this._vf.key[0]) return this._vf.keyValue[0];else if(time>=this._vf.key[this._vf.key.length-1]) return this._vf.keyValue[this._vf.key.length-1];for(var i=0;i0?this._vf.key.length:1;var len=arr.length/key;for(var i=0;i=2)||(this._vf.keyVelocity.length==0));if(!sane) x3dom.debug.logWarning("SplinePositionInterpolator Node: 'key' , 'keyValue' and/or 'keyVelocity' fields have inappropriate sizes");};this.calcDtot=function() {this.dtot=0.0;for(var i=0;i2) {for(i=0;i0.0){if(this._vf.set_fraction<=this._vf.key[0]) value=x3dom.fields.SFVec3f.copy(this._vf.keyValue[0]);else if(this._vf.set_fraction>=this._vf.key[this._vf.key.length-1]) value=x3dom.fields.SFVec3f.copy(this._vf.keyValue[this._vf.key.length-1]);} for(var i=0;i0){this._updateCycleStopTime();} this._backupStartTime=this._vf.startTime;this._backupStopTime=this._vf.stopTime;this._backupCycleInterval=this._vf.cycleInterval;},{tick:function(time) {if(!this._vf.enabled){this._lastTime=time;return false;} var isActive=(this._vf.cycleInterval>0&&time>=this._vf.startTime&&(time=this._vf.pauseTime&&this._vf.pauseTime>this._vf.resumeTime);if(isPaused&&!this._vf.isPaused){this.postMessage('isPaused',true);this.postMessage('pauseTime',time);}else if(!isPaused&&this._vf.isPaused){this.postMessage('isPaused',false);this.postMessage('resumeTime',time);} if(!isPaused){var cycleFrac=this._getCycleAt(time);var cycle=Math.floor(cycleFrac);var cycleTime=this._vf.startTime+cycle*this._vf.cycleInterval;var adjustTime=0;if(this._vf.stopTime>this._vf.startTime&&this._lastTime=this._vf.stopTime) adjustTime=this._vf.stopTime;else if(this._lastTime=cycleTime) adjustTime=cycleTime;if(adjustTime>0){time=adjustTime;cycleFrac=this._getCycleAt(time);cycle=Math.floor(cycleFrac);} var fraction=cycleFrac-cycle;if(fraction=0) anchor=url.slice(aPos+1);var param=this._vf.parameter.length?this._vf.parameter[0]:"";var tPos=param.search("target=");var target="";if(tPos>=0) target=param.slice(tPos+7);x3dom.debug.logInfo("Anchor url="+url+", target="+target+", #viewpoint="+anchor);if(target.length!=0||target!="_self"){window.open(this._nameSpace.getURL(url),target);} else{window.location=this._nameSpace.getURL(url);}}}));x3dom.registerNodeType("Inline","Networking",defineClass(x3dom.nodeTypes.X3DGroupingNode,function(ctx){x3dom.nodeTypes.Inline.superClass.call(this,ctx);this.addField_MFString(ctx,'url',[]);this.addField_SFBool(ctx,'load',true);this.addField_MFString(ctx,'nameSpaceName',[]);this.addField_SFBool(ctx,'mapDEFToID',false);this.initDone=false;this.count=0;this.numRetries=x3dom.nodeTypes.Inline.MaximumRetries;},{fieldChanged:function(fieldName) {if(fieldName=="url"){for(var i=0;i=1) {node.removeChild(node.firstChild);}}} this.loadInline();} else if(fieldName=="render"){this.invalidateVolume();}},nodeChanged:function() {if(!this.initDone){this.initDone=true;this.loadInline();}},fireEvents:function(eventType) {if(this._xmlNode&&(this._xmlNode['on'+eventType]||this._xmlNode.hasAttribute('on'+eventType)||this._listeners[eventType])) {var event={target:this._xmlNode,type:eventType,error:(eventType=="error")?"XMLHttpRequest Error":"",cancelBubble:false,stopPropagation:function(){this.cancelBubble=true;}};try{var attrib=this._xmlNode["on"+eventType];if(typeof(attrib)==="function"){attrib.call(this._xmlNode,event);} else{var funcStr=this._xmlNode.getAttribute("on"+eventType);var func=new Function('event',funcStr);func.call(this._xmlNode,event);} var list=this._listeners[eventType];if(list){for(var i=0;i=0)) nameSpace.setBaseURL(url);else nameSpace.setBaseURL(that._nameSpace.baseURL+url);newScene=nameSpace.setupTree(inlScene);that._nameSpace.addSpace(nameSpace);if(that._vf.nameSpaceName.length!=0) {Array.forEach(inlScene.childNodes,function(childDomNode) {if(childDomNode instanceof Element) {setNamespace(that._vf.nameSpaceName,childDomNode,that._vf.mapDEFToID);that._xmlNode.appendChild(childDomNode);}});}} else{if(xml&&xml.localName) x3dom.debug.logError('No Scene in '+xml.localName);else x3dom.debug.logError('No Scene in resource');} var global=x3dom.getGlobal();if(that._childNodes.length>0&&that._childNodes[0]&&that._childNodes[0]._nameSpace) that._nameSpace.removeSpace(that._childNodes[0]._nameSpace);while(that._childNodes.length!==0) global['_remover']=that.removeChild(that._childNodes[0]);delete global['_remover'];if(newScene) {that.addChild(newScene);that.invalidateVolume();that._nameSpace.doc.downloadCount-=1;that._nameSpace.doc.needRender=true;x3dom.debug.logInfo('Inline: added '+that._vf.url[0]+' to scene.');var theScene=that._nameSpace.doc._scene;if(theScene){theScene.invalidateVolume();window.setTimeout(function(){that.invalidateVolume();theScene.updateVolume();that._nameSpace.doc.needRender=true;},1000);} that.fireEvents("load");} newScene=null;nameSpace=null;inlScene=null;xml=null;return xhr;};if(this._vf.url.length&&this._vf.url[0].length) {var xhrURI=this._nameSpace.getURL(this._vf.url[0]);xhr.open('GET',xhrURI,true);this._nameSpace.doc.downloadCount+=1;try{xhr.send(null);} catch(ex){this.fireEvents("error");x3dom.debug.logError(this._vf.url[0]+": "+ex);}}}}));x3dom.nodeTypes.Inline.AwaitTranscoding=202;x3dom.nodeTypes.Inline.MaximumRetries=15;function setNamespace(prefix,childDomNode,mapDEFToID) {if(childDomNode instanceof Element&&childDomNode.__setAttribute!==undefined){if(childDomNode.hasAttribute('id')){childDomNode.__setAttribute('id',prefix.toString().replace(' ','')+'__'+childDomNode.getAttribute('id'));}else if(childDomNode.hasAttribute('DEF')&&mapDEFToID){childDomNode.__setAttribute('id',prefix.toString().replace(' ','')+'__'+childDomNode.getAttribute('DEF'));if(!childDomNode.id) childDomNode.id=childDomNode.__getAttribute('id');}} if(childDomNode.hasChildNodes()){Array.forEach(childDomNode.childNodes,function(children){setNamespace(prefix,children,mapDEFToID);});}} x3dom.registerNodeType("MultiPart","Networking",defineClass(x3dom.nodeTypes.Inline,function(ctx){x3dom.nodeTypes.MultiPart.superClass.call(this,ctx);this.addField_MFString(ctx,'urlIDMap',[]);this.addField_SFBool(ctx,'isPickable',true);this.addField_SFString(ctx,'sortType','auto');this.addField_SFBool(ctx,'solid',false);this.addField_SFInt32(ctx,'sortKey',0);this.addField_SFString(ctx,'initialVisibility','auto');this._idMap=null;this._inlineNamespace=null;this._highlightedParts=[];this._minId=0;this._maxId=0;this._lastId=-1;this._lastClickedId=-1;this._lastButton=0;this._identifierToPartId=[];this._identifierToAppId=[];this._visiblePartsPerShape=[];this._partVolume=[];this._partVisibility=[];this._originalColor=[];this._materials=[];},{fieldChanged:function(fieldName) {if(fieldName=="url"){if(this._vf.nameSpaceName.length!=0){var node=this._xmlNode;if(node&&node.hasChildNodes()) {while(node.childNodes.length>=1) {node.removeChild(node.firstChild);}}} this.loadInline();} else if(fieldName=="render"){this.invalidateVolume();}},nodeChanged:function() {if(!this.initDone){this.initDone=true;this.loadIDMap();}},getVolume:function() {var vol=this._graph.volume;if(!this.volumeValid()&&this._vf.render) {for(var i=0;i=0)) {that._inlineNamespace.setBaseURL(url);} else {that._inlineNamespace.setBaseURL(that._nameSpace.baseURL+url);} that.replaceMaterials(inlScene);newScene=that._inlineNamespace.setupTree(inlScene);that._nameSpace.addSpace(that._inlineNamespace);if(that._vf.nameSpaceName.length!=0) {Array.forEach(inlScene.childNodes,function(childDomNode) {if(childDomNode instanceof Element) {setNamespace(that._vf.nameSpaceName,childDomNode,that._vf.mapDEFToID);that._xmlNode.appendChild(childDomNode);}});}} else{if(xml&&xml.localName){x3dom.debug.logError('No Scene in '+xml.localName);}else{x3dom.debug.logError('No Scene in resource');}} var global=x3dom.getGlobal();if(that._childNodes.length>0&&that._childNodes[0]&&that._childNodes[0]._nameSpace){that._nameSpace.removeSpace(that._childNodes[0]._nameSpace);} while(that._childNodes.length!==0){global['_remover']=that.removeChild(that._childNodes[0]);} delete global['_remover'];if(newScene) {that.addChild(newScene);that.invalidateVolume();that._nameSpace.doc.downloadCount-=1;that._nameSpace.doc.needRender=true;x3dom.debug.logInfo('Inline: added '+that._vf.url[0]+' to scene.');var theScene=that._nameSpace.doc._scene;if(theScene){theScene.invalidateVolume();window.setTimeout(function(){that.invalidateVolume();theScene.updateVolume();that._nameSpace.doc.needRender=true;},1000);} that.appendAPI();that.fireEvents("load");} newScene=null;inlScene=null;xml=null;return xhr;};if(this._vf.url.length&&this._vf.url[0].length) {var xhrURI=this._nameSpace.getURL(this._vf.url[0]);xhr.open('GET',xhrURI,true);this._nameSpace.doc.downloadCount+=1;try{xhr.send(null);} catch(ex){this.fireEvents("error");x3dom.debug.logError(this._vf.url[0]+": "+ex);}}}}));x3dom.registerNodeType("X3DBackgroundNode","EnvironmentalEffects",defineClass(x3dom.nodeTypes.X3DBindableNode,function(ctx){x3dom.nodeTypes.X3DBackgroundNode.superClass.call(this,ctx);var trans=(ctx&&ctx.autoGen)?1:0;this.addField_SFString(ctx,'crossOrigin','');this.addField_MFColor(ctx,'groundColor',[]);this.addField_MFFloat(ctx,'groundAngle',[]);this.addField_MFColor(ctx,'skyColor',[new x3dom.fields.SFColor(0,0,0)]);this.addField_MFFloat(ctx,'skyAngle',[]);this.addField_SFFloat(ctx,'transparency',trans);this._dirty=true;},{getSkyColor:function(){return new x3dom.fields.SFColor(0,0,0);},getTransparency:function(){return 0;},getTexUrl:function(){return[];}}));x3dom.registerNodeType("X3DFogNode","EnvironmentalEffects",defineClass(x3dom.nodeTypes.X3DBindableNode,function(ctx){x3dom.nodeTypes.X3DFogNode.superClass.call(this,ctx);this.addField_SFColor(ctx,'color',1,1,1);this.addField_SFString(ctx,'fogType',"LINEAR");this.addField_SFFloat(ctx,'visibilityRange',0);},{}));x3dom.registerNodeType("Fog","EnvironmentalEffects",defineClass(x3dom.nodeTypes.X3DFogNode,function(ctx){x3dom.nodeTypes.Fog.superClass.call(this,ctx);},{}));x3dom.registerNodeType("Background","EnvironmentalEffects",defineClass(x3dom.nodeTypes.X3DBackgroundNode,function(ctx){x3dom.nodeTypes.Background.superClass.call(this,ctx);this.addField_MFString(ctx,'backUrl',[]);this.addField_MFString(ctx,'bottomUrl',[]);this.addField_MFString(ctx,'frontUrl',[]);this.addField_MFString(ctx,'leftUrl',[]);this.addField_MFString(ctx,'rightUrl',[]);this.addField_MFString(ctx,'topUrl',[]);},{fieldChanged:function(fieldName) {if(fieldName.indexOf("Url")>0||fieldName=="transparency"||fieldName.search("sky")>=0||fieldName.search("ground")>=0){this._dirty=true;} else if(fieldName.indexOf("bind")>=0){this.bind(this._vf.bind);}},getSkyColor:function(){return this._vf.skyColor;},getGroundColor:function(){return this._vf.groundColor;},getTransparency:function(){return this._vf.transparency;},getTexUrl:function(){return[this._nameSpace.getURL(this._vf.backUrl[0]),this._nameSpace.getURL(this._vf.frontUrl[0]),this._nameSpace.getURL(this._vf.bottomUrl[0]),this._nameSpace.getURL(this._vf.topUrl[0]),this._nameSpace.getURL(this._vf.leftUrl[0]),this._nameSpace.getURL(this._vf.rightUrl[0])];}}));x3dom.registerNodeType("X3DEnvironmentNode","EnvironmentalEffects",defineClass(x3dom.nodeTypes.X3DBindableNode,function(ctx){x3dom.nodeTypes.X3DEnvironmentNode.superClass.call(this,ctx);}));x3dom.registerNodeType("Environment","EnvironmentalEffects",defineClass(x3dom.nodeTypes.X3DEnvironmentNode,function(ctx){x3dom.nodeTypes.Environment.superClass.call(this,ctx);this.addField_SFBool(ctx,'sortTrans',true);this.addField_SFBool(ctx,'shadowExcludeTransparentObjects',false);this.addField_SFString(ctx,'gammaCorrectionDefault',"linear");this.addField_SFBool(ctx,'frustumCulling',true);this.addField_SFBool(ctx,'smallFeatureCulling',false);this.addField_SFFloat(ctx,'smallFeatureThreshold',1.0);this.addField_SFBool(ctx,'occlusionCulling',false);this.addField_SFFloat(ctx,'occlusionVisibilityThreshold',0.0);this.addField_SFBool(ctx,'lowPriorityCulling',false);this.addField_SFFloat(ctx,'lowPriorityThreshold',1.0);this.addField_SFBool(ctx,'tessellationDetailCulling',false);this.addField_SFFloat(ctx,'tessellationErrorThreshold',0.0);this.addField_SFBool(ctx,'enableARC',false);this.addField_SFFloat(ctx,'minFrameRate',1.0);this.addField_SFFloat(ctx,'maxFrameRate',62.5);this.addField_SFFloat(ctx,'userDataFactor',-1);this.addField_SFFloat(ctx,'smallFeatureFactor',-1);this.addField_SFFloat(ctx,'occlusionVisibilityFactor',-1);this.addField_SFFloat(ctx,'lowPriorityFactor',-1);this.addField_SFFloat(ctx,'tessellationErrorFactor',-1);this.addField_SFBool(ctx,'SSAO',false);this.addField_SFFloat(ctx,'SSAOradius',0.7);this.addField_SFFloat(ctx,'SSAOamount',0.3);this.addField_SFInt32(ctx,'SSAOrandomTextureSize',4);this.addField_SFInt32(ctx,'SSAOblurDepthTreshold',1);this._validGammaCorrectionTypes=["none","fastlinear","linear"];this.checkSanity();},{checkSanity:function() {var checkParam=function(flag,value,defaultOn,defaultOff) {if(flag&&(value==defaultOff)) return defaultOn;if(!flag&&(value!=defaultOff)) return defaultOff;return value;};this._smallFeatureThreshold=checkParam(this._vf.smallFeatureCulling,this._vf.smallFeatureThreshold,10,0);this._lowPriorityThreshold=checkParam(this._vf.lowPriorityCulling,this._vf.lowPriorityThreshold,0.5,1);this._occlusionVisibilityThreshold=checkParam(this._vf.occlusionCulling,this._vf.occlusionVisibilityThreshold,1,0);this._tessellationErrorThreshold=checkParam(this._vf.tessellationDetailCulling,this._vf.tessellationErrorThreshold,1,0);var checkGamma=function(field,that){field=field.toLowerCase();if(that._validGammaCorrectionTypes.indexOf(field)>-1){return field;} else{x3dom.debug.logWarning(field+" gammaCorrectionDefault may only be linear (default), fastLinear, or none");return that._validGammaCorrectionTypes[0];}};this._vf.gammaCorrectionDefault=checkGamma(this._vf.gammaCorrectionDefault,this);}}));x3dom.registerNodeType("X3DViewpointNode","Navigation",defineClass(x3dom.nodeTypes.X3DBindableNode,function(ctx){x3dom.nodeTypes.X3DViewpointNode.superClass.call(this,ctx);if(ctx&&ctx.xmlNode){var domNode=ctx.xmlNode;if(!domNode.resetView&&!domNode.getFieldOfView&&!domNode.getNear&&!domNode.getFar) {domNode.resetView=function(){var that=this._x3domNode;that.resetView();that._nameSpace.doc.needRender=true;};domNode.getFieldOfView=function(){return this._x3domNode.getFieldOfView();};domNode.getNear=function(){return this._x3domNode.getNear();};domNode.getFar=function(){return this._x3domNode.getFar();};}}},{activate:function(prev){var viewarea=this._nameSpace.doc._viewarea;if(prev){viewarea.animateTo(this,prev._autoGen?null:prev);} viewarea._needNavigationMatrixUpdate=true;x3dom.nodeTypes.X3DBindableNode.prototype.activate.call(this,prev);},deactivate:function(prev){x3dom.nodeTypes.X3DBindableNode.prototype.deactivate.call(this,prev);},getTransformation:function(){return this.getCurrentTransform();},getCenterOfRotation:function(){return new x3dom.fields.SFVec3f(0,0,0);},setCenterOfRotation:function(cor){this._vf.centerOfRotation.setValues(cor);},getFieldOfView:function(){return 1.57079633;},setView:function(newView){var mat=this.getCurrentTransform();this._viewMatrix=newView.mult(mat);},setViewAbsolute:function(newView) {this._viewMatrix=newView},setProjectionMatrix:function(matrix) {},resetView:function(){},getNear:function(){return 0.1;},getFar:function(){return 10000;},getImgPlaneHeightAtDistOne:function(){return 2.0;},getViewMatrix:function(){return null;},getProjectionMatrix:function(aspect){return null;}}));x3dom.registerNodeType("Viewpoint","Navigation",defineClass(x3dom.nodeTypes.X3DViewpointNode,function(ctx){x3dom.nodeTypes.Viewpoint.superClass.call(this,ctx);this.addField_SFFloat(ctx,'fieldOfView',0.785398);this.addField_SFVec3f(ctx,'position',0,0,10);this.addField_SFRotation(ctx,'orientation',0,0,0,1);this.addField_SFVec3f(ctx,'centerOfRotation',0,0,0);this.addField_SFFloat(ctx,'zNear',-1);this.addField_SFFloat(ctx,'zFar',-1);this._viewMatrix=x3dom.fields.SFMatrix4f.translation(this._vf.position).mult(this._vf.orientation.toMatrix()).inverse();this._projMatrix=null;this._lastAspect=1.0;this._zRatio=10000;this._zNear=this._vf.zNear;this._zFar=this._vf.zFar;this._imgPlaneHeightAtDistOne=2.0*Math.tan(this._vf.fieldOfView/2.0);},{fieldChanged:function(fieldName){if(fieldName=="position"||fieldName=="orientation"){this.resetView();} else if(fieldName=="fieldOfView"||fieldName=="zNear"||fieldName=="zFar"){this._projMatrix=null;this._zNear=this._vf.zNear;this._zFar=this._vf.zFar;this._imgPlaneHeightAtDistOne=2.0*Math.tan(this._vf.fieldOfView/2.0);} else if(fieldName.indexOf("bind")>=0){this.bind(this._vf.bind);}},setProjectionMatrix:function(matrix) {this._projMatrix=matrix;},getCenterOfRotation:function(){return this.getCurrentTransform().multMatrixPnt(this._vf.centerOfRotation);},getViewMatrix:function(){return this._viewMatrix;},getFieldOfView:function(){return this._vf.fieldOfView;},resetView:function(){this._viewMatrix=x3dom.fields.SFMatrix4f.translation(this._vf.position).mult(this._vf.orientation.toMatrix()).inverse();if(this._vf.isActive&&this._nameSpace&&this._nameSpace.doc._viewarea){this._nameSpace.doc._viewarea.resetNavHelpers();}},getNear:function(){return this._zNear;},getFar:function(){return this._zFar;},getImgPlaneHeightAtDistOne:function(){return this._imgPlaneHeightAtDistOne;},getProjectionMatrix:function(aspect) {var fovy=this._vf.fieldOfView;var zfar=this._vf.zFar;var znear=this._vf.zNear;if(znear<=0||zfar<=0) {var nearScale=0.8,farScale=1.2;var viewarea=this._nameSpace.doc._viewarea;var scene=viewarea._scene;var min=x3dom.fields.SFVec3f.copy(scene._lastMin);var max=x3dom.fields.SFVec3f.copy(scene._lastMax);var dia=max.subtract(min);var sRad=dia.length()/2;var mat=viewarea.getViewMatrix().inverse();var vp=mat.e3();var translation=new x3dom.fields.SFVec3f(0,0,0),scaleFactor=new x3dom.fields.SFVec3f(1,1,1);var rotation=new x3dom.fields.Quaternion(0,0,1,0),scaleOrientation=new x3dom.fields.Quaternion(0,0,1,0);mat.getTransform(translation,rotation,scaleFactor,scaleOrientation);var minScal=scaleFactor.x,maxScal=scaleFactor.x;if(maxScalscaleFactor.y)minScal=scaleFactor.y;if(maxScalscaleFactor.z)minScal=scaleFactor.z;if(maxScal>1) nearScale/=maxScal;else if(minScal>x3dom.fields.Eps&&minScal<1) farScale/=minScal;var sCenter=min.add(dia.multiply(0.5));var vDist=(vp.subtract(sCenter)).length();if(sRad){if(vDist>sRad) znear=(vDist-sRad)*nearScale;else znear=0;zfar=(vDist+sRad)*farScale;} else{znear=0.1;zfar=100000;} var zNearLimit=zfar/this._zRatio;znear=Math.max(znear,Math.max(x3dom.fields.Eps,zNearLimit));if(zfar>this._vf.zNear&&this._vf.zNear>0) znear=this._vf.zNear;if(this._vf.zFar>znear) zfar=this._vf.zFar;if(zfar<=znear) zfar=znear+1;} if(this._projMatrix==null) {this._projMatrix=x3dom.fields.SFMatrix4f.perspective(fovy,aspect,znear,zfar);} else if(this._zNear!=znear||this._zFar!=zfar) {var div=znear-zfar;this._projMatrix._22=(znear+zfar)/div;this._projMatrix._23=2*znear*zfar/div;} else if(this._lastAspect!=aspect) {this._projMatrix._00=(1/Math.tan(fovy/2))/aspect;this._lastAspect=aspect;} this._zNear=znear;this._zFar=zfar;return this._projMatrix;}}));x3dom.registerNodeType("OrthoViewpoint","Navigation",defineClass(x3dom.nodeTypes.X3DViewpointNode,function(ctx){x3dom.nodeTypes.OrthoViewpoint.superClass.call(this,ctx);this.addField_MFFloat(ctx,'fieldOfView',[-1,-1,1,1]);this.addField_SFVec3f(ctx,'position',0,0,10);this.addField_SFRotation(ctx,'orientation',0,0,0,1);this.addField_SFVec3f(ctx,'centerOfRotation',0,0,0);this.addField_SFFloat(ctx,'zNear',0.1);this.addField_SFFloat(ctx,'zFar',10000);this._viewMatrix=null;this._projMatrix=null;this._lastAspect=1.0;this.resetView();},{fieldChanged:function(fieldName){if(fieldName=="position"||fieldName=="orientation"){this.resetView();} else if(fieldName=="fieldOfView"||fieldName=="zNear"||fieldName=="zFar"){this._projMatrix=null;this.resetView();} else if(fieldName.indexOf("bind")>=0){this.bind(this._vf.bind);}},getCenterOfRotation:function(){return this.getCurrentTransform().multMatrixPnt(this._vf.centerOfRotation);},getViewMatrix:function(){return this._viewMatrix;},resetView:function(){var offset=x3dom.fields.SFMatrix4f.translation(new x3dom.fields.SFVec3f((this._vf.fieldOfView[0]+this._vf.fieldOfView[2])/2,(this._vf.fieldOfView[1]+this._vf.fieldOfView[3])/2,0));this._viewMatrix=x3dom.fields.SFMatrix4f.translation(this._vf.position).mult(this._vf.orientation.toMatrix());this._viewMatrix=this._viewMatrix.mult(offset).inverse();if(this._vf.isActive&&this._nameSpace&&this._nameSpace.doc._viewarea){this._nameSpace.doc._viewarea.resetNavHelpers();}},getNear:function(){return this._vf.zNear;},getFar:function(){return this._vf.zFar;},getProjectionMatrix:function(aspect) {if(this._projMatrix==null||this._lastAspect!=aspect) {var near=this.getNear();var far=this.getFar();var left=this._vf.fieldOfView[0];var bottom=this._vf.fieldOfView[1];var right=this._vf.fieldOfView[2];var top=this._vf.fieldOfView[3];this._projMatrix=x3dom.fields.SFMatrix4f.ortho(left,right,bottom,top,near,far,aspect);} this._lastAspect=aspect;return this._projMatrix;}}));x3dom.registerNodeType("Viewfrustum","Navigation",defineClass(x3dom.nodeTypes.X3DViewpointNode,function(ctx){x3dom.nodeTypes.Viewfrustum.superClass.call(this,ctx);this.addField_SFMatrix4f(ctx,'modelview',1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);this.addField_SFMatrix4f(ctx,'projection',1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);this._viewMatrix=this._vf.modelview.transpose().inverse();this._projMatrix=this._vf.projection.transpose();this._centerOfRotation=new x3dom.fields.SFVec3f(0,0,0);},{fieldChanged:function(fieldName){if(fieldName=="modelview"){this.resetView();} else if(fieldName=="projection"){this._projMatrix=this._vf.projection.transpose();} else if(fieldName.indexOf("bind")>=0){this.bind(this._vf.bind);}},getCenterOfRotation:function(){return this.getCurrentTransform().multMatrixPnt(this._centerOfRotation);},setCenterOfRotation:function(cor){this._centerOfRotation.setValues(cor);},getViewMatrix:function(){return this._viewMatrix;},getFieldOfView:function(){return(2.0*Math.atan(1.0/this._projMatrix._11));},getImgPlaneHeightAtDistOne:function(){return 2.0/this._projMatrix._11;},resetView:function(){this._viewMatrix=this._vf.modelview.transpose().inverse();this._centerOfRotation=new x3dom.fields.SFVec3f(0,0,0);},getProjectionMatrix:function(aspect){return this._projMatrix;}}));x3dom.registerNodeType("X3DNavigationInfoNode","Navigation",defineClass(x3dom.nodeTypes.X3DBindableNode,function(ctx){x3dom.nodeTypes.X3DNavigationInfoNode.superClass.call(this,ctx);}));x3dom.registerNodeType("NavigationInfo","Navigation",defineClass(x3dom.nodeTypes.X3DNavigationInfoNode,function(ctx){x3dom.nodeTypes.NavigationInfo.superClass.call(this,ctx);this.addField_SFBool(ctx,'headlight',true);this.addField_MFString(ctx,'type',["EXAMINE","ANY"]);this.addField_MFFloat(ctx,'typeParams',[-0.4,60,0.05,2.8]);this.addField_SFString(ctx,'explorationMode','all');this.addField_MFFloat(ctx,'avatarSize',[0.25,1.6,0.75]);this.addField_SFFloat(ctx,'visibilityLimit',0.0);this.addField_SFFloat(ctx,'speed',1.0);this.addField_SFTime(ctx,'transitionTime',1.0);this.addField_MFString(ctx,'transitionType',["LINEAR"]);this._validTypes=["none","examine","turntable","fly","freefly","lookat","lookaround","walk","game","helicopter","any"];this._heliUpdated=false;var type=this.checkType(this.getType());x3dom.debug.logInfo("NavType: "+type);},{fieldChanged:function(fieldName){if(fieldName=="typeParams"){this._heliUpdated=false;} else if(fieldName=="type"){var type=this.checkType(this.getType());switch(type){case'game':this._nameSpace.doc._viewarea.initMouseState();break;case'helicopter':this._heliUpdated=false;break;case"turntable":this._nameSpace.doc._viewarea.initMouseState();this._nameSpace.doc._viewarea.initTurnTable(this);break;default:break;} this._vf.type[0]=type;x3dom.debug.logInfo("Switch to "+type+" mode.");}},setType:function(type,viewarea){var navType=this.checkType(type.toLowerCase());var oldType=this.checkType(this.getType());switch(navType){case'game':if(oldType!==navType){if(viewarea) viewarea.initMouseState();else this._nameSpace.doc._viewarea.initMouseState();} break;case'helicopter':if(oldType!==navType){this._heliUpdated=false;} break;case"turntable":if(oldType!==navType){if(viewarea){viewarea.initMouseState();viewarea.initTurnTable(this);} else{this._nameSpace.doc._viewarea.initMouseState();this._nameSpace.doc._viewarea.initTurnTable(this);}} break;default:break;} this._vf.type[0]=navType;x3dom.debug.logInfo("Switch to "+navType+" mode.");},getType:function(){var type=this._vf.type[0].toLowerCase();if(type.length<=1) type="none";else if(type=="any") type="examine";return type;},getTypeParams:function(){var length=this._vf.typeParams.length;var theta=(length>=1)?this._vf.typeParams[0]:-0.4;var height=(length>=2)?this._vf.typeParams[1]:60.0;var minAngle=(length>=3)?this._vf.typeParams[2]:x3dom.fields.Eps;var maxAngle=(length>=4)?this._vf.typeParams[3]:Math.PI-x3dom.fields.Eps;var params=[theta,height,minAngle,maxAngle];if(length>=5) {params.push(this._vf.typeParams[4]);} return params;},setTypeParams:function(params){for(var i=0;i-1){return type;} else{x3dom.debug.logWarning(type+" is no valid navigation type, use one of "+ this._validTypes.toString());return"examine";}},getExplorationMode:function(){switch(this._vf.explorationMode.toLowerCase()){case"all":return 7;case"rotate":return 1;case"zoom":return 2;case"pan":return 4;case"none":return 0;default:return 7;}}}));x3dom.registerNodeType("Billboard","Navigation",defineClass(x3dom.nodeTypes.X3DGroupingNode,function(ctx){x3dom.nodeTypes.Billboard.superClass.call(this,ctx);this.addField_SFVec3f(ctx,'axisOfRotation',0,1,0);this._eye=new x3dom.fields.SFVec3f(0,0,0);this._eyeViewUp=new x3dom.fields.SFVec3f(0,0,0);this._eyeLook=new x3dom.fields.SFVec3f(0,0,0);},{collectDrawableObjects:function(transform,drawableCollection,singlePath,invalidateCache,planeMask,clipPlanes) {if(singlePath&&(this._parentNodes.length>1)) singlePath=false;if(singlePath&&(invalidateCache=invalidateCache||this.cacheInvalid())) this.invalidateCache();planeMask=drawableCollection.cull(transform,this.graphState(),singlePath,planeMask);if(planeMask<0){return;} singlePath=false;var vol=this.getVolume();var min=x3dom.fields.SFVec3f.MAX();var max=x3dom.fields.SFVec3f.MIN();vol.getBounds(min,max);var mat_view=drawableCollection.viewMatrix;var center=new x3dom.fields.SFVec3f(0,0,0);center=mat_view.inverse().multMatrixPnt(center);var mat_view_model=mat_view.mult(transform);this._eye=transform.inverse().multMatrixPnt(center);this._eyeViewUp=new x3dom.fields.SFVec3f(mat_view_model._10,mat_view_model._11,mat_view_model._12);this._eyeLook=new x3dom.fields.SFVec3f(mat_view_model._20,mat_view_model._21,mat_view_model._22);var rotMat=x3dom.fields.SFMatrix4f.identity();var mid=max.add(min).multiply(0.5);var billboard_to_viewer=this._eye.subtract(mid);if(this._vf.axisOfRotation.equals(new x3dom.fields.SFVec3f(0,0,0),x3dom.fields.Eps)){var rot1=x3dom.fields.Quaternion.rotateFromTo(billboard_to_viewer,new x3dom.fields.SFVec3f(0,0,1));rotMat=rot1.toMatrix().transpose();var yAxis=rotMat.multMatrixPnt(new x3dom.fields.SFVec3f(0,1,0)).normalize();var zAxis=rotMat.multMatrixPnt(new x3dom.fields.SFVec3f(0,0,1)).normalize();if(!this._eyeViewUp.equals(new x3dom.fields.SFVec3f(0,0,0),x3dom.fields.Eps)){var rot2=x3dom.fields.Quaternion.rotateFromTo(this._eyeLook,zAxis);var rotatedyAxis=rot2.toMatrix().transpose().multMatrixVec(yAxis);var rot3=x3dom.fields.Quaternion.rotateFromTo(this._eyeViewUp,rotatedyAxis);rotMat=rot2.toMatrix().transpose().mult(rotMat);rotMat=rot3.toMatrix().transpose().mult(rotMat);}} else{var normalPlane=this._vf.axisOfRotation.cross(billboard_to_viewer).normalize();if(this._eye.z<0){normalPlane=normalPlane.multiply(-1);} var degreesToRotate=Math.asin(normalPlane.dot(new x3dom.fields.SFVec3f(0,0,1)));if(this._eye.z<0){degreesToRotate+=Math.PI;} rotMat=x3dom.fields.SFMatrix4f.parseRotation(this._vf.axisOfRotation.x+", "+this._vf.axisOfRotation.y+", "+ this._vf.axisOfRotation.z+", "+degreesToRotate*(-1));} var childTransform=this.transformMatrix(transform.mult(rotMat));for(var i=0,i_n=this._childNodes.length;i1)) singlePath=false;if(singlePath&&(invalidateCache=invalidateCache||this.cacheInvalid())) this.invalidateCache();planeMask=drawableCollection.cull(transform,this.graphState(),singlePath,planeMask);if(planeMask<0){return;} var cnode,childTransform;if(singlePath){if(!this._graph.globalMatrix){this._graph.globalMatrix=this.transformMatrix(transform);} childTransform=this._graph.globalMatrix;} else{childTransform=this.transformMatrix(transform);} for(var i=0,n=this._childNodes.length;i1)) singlePath=false;if(singlePath&&(invalidateCache=invalidateCache||this.cacheInvalid())) this.invalidateCache();planeMask=drawableCollection.cull(transform,this.graphState(),singlePath,planeMask);if(planeMask<0){return;} singlePath=false;this.visitChildren(transform,drawableCollection,singlePath,invalidateCache,planeMask,clipPlanes);},visitChildren:function(transform,drawableCollection,singlePath,invalidateCache,planeMask,clipPlanes){}}));x3dom.registerNodeType("LOD","Navigation",defineClass(x3dom.nodeTypes.X3DLODNode,function(ctx){x3dom.nodeTypes.LOD.superClass.call(this,ctx);this.addField_MFFloat(ctx,"range",[]);this._lastRangePos=-1;},{visitChildren:function(transform,drawableCollection,singlePath,invalidateCache,planeMask,clipPlanes) {var i=0,n=this._childNodes.length;var mat_view=drawableCollection.viewMatrix;var center=new x3dom.fields.SFVec3f(0,0,0);center=mat_view.inverse().multMatrixPnt(center);this._eye=transform.inverse().multMatrixPnt(center);var len=this._vf.center.subtract(this._eye).length();while(ithis._vf.range[i]){i++;} if(i&&i>=n){i=n-1;} this._lastRangePos=i;var cnode=this._childNodes[i];if(n&&cnode) {var childTransform=this.transformMatrix(transform);cnode.collectDrawableObjects(childTransform,drawableCollection,singlePath,invalidateCache,planeMask,clipPlanes);}},getVolume:function() {var vol=this._graph.volume;if(!this.volumeValid()&&this._vf.render) {var child,childVol;if(this._lastRangePos>=0){child=this._childNodes[this._lastRangePos];childVol=(child&&child._vf.render===true)?child.getVolume():null;if(childVol&&childVol.isValid()) vol.extendBounds(childVol.min,childVol.max);} else{for(var i=0,n=this._childNodes.length;ix3dom.fields.Eps&&len*this._vf.subScale<=this._vf.size.length()){if(this._childNodes.length<=1){var offset=new Array(new x3dom.fields.SFVec3f(-0.25*this._vf.size.x,0.25*this._vf.size.y,0),new x3dom.fields.SFVec3f(0.25*this._vf.size.x,0.25*this._vf.size.y,0),new x3dom.fields.SFVec3f(-0.25*this._vf.size.x,-0.25*this._vf.size.y,0),new x3dom.fields.SFVec3f(0.25*this._vf.size.x,-0.25*this._vf.size.y,0));for(l=0;l<4;l++){var node=new x3dom.nodeTypes.DynamicLOD();node._nameSpace=this._nameSpace;node._eye.setValues(this._eye);node.level=this.level+1;node.quadrant=l;node.cell=this.cell+l;node._vf.urlHead=this._vf.urlHead;node._vf.urlCenter=this._vf.urlCenter;node._vf.urlTail=this._vf.urlTail;node._vf.center=this._vf.center.add(offset[l]);node._vf.size=this._vf.size.multiply(0.5);node._vf.subdivision.setValues(this._vf.subdivision);var app=new x3dom.nodeTypes.Appearance();var tex=new x3dom.nodeTypes.ImageTexture();tex._nameSpace=this._nameSpace;tex._vf.url[0]=this._vf.urlHead+node.quadrant+this._vf.urlCenter+node.cell+this._vf.urlTail;app.addChild(tex);tex.nodeChanged();var shape=new x3dom.nodeTypes.Shape();shape._nameSpace=this._nameSpace;shape.addChild(app);app.nodeChanged();node.addChild(shape,"root");shape.nodeChanged();this.addChild(node);node.nodeChanged();}} else{for(l=1;l=0&&pos=3,"RenderedTexture.dimensions requires at least 3 entries.");this._clearParents=true;this._needRenderUpdate=true;this.checkDepthTextureSupport=function(){if(this._vf.depthMap&&x3dom.caps.DEPTH_TEXTURE===null) x3dom.debug.logWarning("RenderedTexture Node: depth texture extension not supported");};this.checkDepthTextureSupport();},{nodeChanged:function() {this._clearParents=true;this._needRenderUpdate=true;},fieldChanged:function(fieldName) {switch(fieldName) {case"excludeNodes":this._clearParents=true;break;case"update":if(this._vf.update.toUpperCase()=="NEXT_FRAME_ONLY"||this._vf.update.toUpperCase()=="ALWAYS"){this._needRenderUpdate=true;} break;case"depthMap":this.checkDepthTextureSupport();this._x3domTexture.updateTexture();this._needRenderUpdate=true;default:break;}},getViewMatrix:function() {if(this._clearParents&&this._cf.excludeNodes.nodes.length){var that=this;Array.forEach(this._cf.excludeNodes.nodes,function(node){for(var i=0,n=node._parentNodes.length;i11)?11:this._vf.iterations;this._vf.iterations=(this._vf.iterations<3)?3:this._vf.iterations;this._vf.maxLevel=(this._vf.maxLevel>11)?11:this._vf.maxLevel;this._vf.maxLevel=(this._vf.maxLevel<3)?3:this._vf.maxLevel;this._vf.maxLevel=(this._vf.maxLevel>this._vf.iterations)?this._vf.iterations:this._vf.maxLevel;var repeatConfig=[{x:4,y:8},{x:8,y:8},{x:8,y:16},{x:16,y:16},{x:16,y:32},{x:32,y:32},{x:32,y:64},{x:64,y:64},{x:64,y:128}];this._repeat=new x3dom.fields.SFVec2f(this._vf.dimensions[0]/repeatConfig[this._vf.iterations-3].x,this._vf.dimensions[1]/repeatConfig[this._vf.iterations-3].y);this._renderedImage=0;this._currLoadLevel=0;this._loadLevel=1;},{nextLevel:function(){if(this._loadLevel"+"http://x3dom.org/x3dom/doc/help/composedShader.html)\n"+" attribute vec3 position;\n"+" attribute vec3 normal;\n"+" attribute vec2 texcoord;\n"+" attribute vec3 color;\n"+" uniform mat4 modelViewProjectionMatrix;\n"+" uniform mat4 modelViewMatrix;\n"+" uniform mat4 normalMatrix;\n"+" uniform mat4 viewMatrix;\n"+" uniform sampler2D tex;\n");x3dom.nodeTypes.ComposedShader.ShaderInfoMsgShown=true;}},{nodeChanged:function() {var i,n=this._cf.parts.nodes.length;for(i=0;itwoPi) this._vf.angle=twoPi;this._origCCW=this._vf.ccw;var innerRadius=this._vf.innerRadius;var outerRadius=this._vf.outerRadius;if(this._vf.insideOutsideRadius==true) {if(innerRadius>outerRadius){var tmp=innerRadius;innerRadius=outerRadius;outerRadius=tmp;} var rad=(outerRadius-innerRadius)/2;outerRadius=innerRadius+rad;innerRadius=rad;this._vf.ccw=!this._origCCW;} var rings=this._vf.subdivision.x,sides=this._vf.subdivision.y;rings=Math.max(3,Math.round((this._vf.angle/twoPi)*rings));var geoCacheID='Torus_'+innerRadius+'_'+outerRadius+'_'+this._vf.angle+'_'+ this._vf.subdivision+'-'+this._vf.caps;if(this._vf.useGeoCache&&x3dom.geoCache[geoCacheID]!==undefined) {this._mesh=x3dom.geoCache[geoCacheID];} else {var ringDelta=this._vf.angle/rings;var sideDelta=twoPi/sides;var a,b,theta,phi;var cosTheta,sinTheta,cosPhi,sinPhi,dist;for(a=0,theta=0;a<=rings;a++,theta+=ringDelta) {cosTheta=Math.cos(theta);sinTheta=Math.sin(theta);for(b=0,phi=0;b<=sides;b++,phi+=sideDelta) {cosPhi=Math.cos(phi);sinPhi=Math.sin(phi);dist=outerRadius+innerRadius*cosPhi;if(this._vf.insideOutsideRadius){this._mesh._positions[0].push(cosTheta*dist,innerRadius*sinPhi,-sinTheta*dist);this._mesh._normals[0].push(cosTheta*cosPhi,sinPhi,-sinTheta*cosPhi);} else{this._mesh._positions[0].push(cosTheta*dist,-sinTheta*dist,innerRadius*sinPhi);this._mesh._normals[0].push(cosTheta*cosPhi,-sinTheta*cosPhi,sinPhi);} this._mesh._texCoords[0].push(-a/rings,b/sides);}} for(a=0;a0){this._mesh._indices[0].push(origPos);this._mesh._indices[0].push(origPos+b);this._mesh._indices[0].push(origPos+b-1);} if(b==sides){this._mesh._indices[0].push(origPos);this._mesh._indices[0].push(origPos+1);this._mesh._indices[0].push(origPos+b);}} cosTheta=Math.cos(this._vf.angle);sinTheta=Math.sin(this._vf.angle);origPos=this._mesh._positions[0].length/3;var nx=-sinTheta,ny=-cosTheta;if(this._vf.insideOutsideRadius){this._mesh._positions[0].push(cosTheta*outerRadius,0,-sinTheta*outerRadius);this._mesh._normals[0].push(nx,0,ny);} else{this._mesh._positions[0].push(cosTheta*outerRadius,-sinTheta*outerRadius,0);this._mesh._normals[0].push(nx,ny,0);} this._mesh._texCoords[0].push(0.5,0.5);for(b=0,phi=0;b<=sides;b++,phi+=sideDelta) {cosPhi=Math.cos(phi);sinPhi=Math.sin(phi);dist=outerRadius+innerRadius*cosPhi;if(this._vf.insideOutsideRadius){this._mesh._positions[0].push(cosTheta*dist,sinPhi*innerRadius,-sinTheta*dist);this._mesh._normals[0].push(nx,0,ny);} else{this._mesh._positions[0].push(cosTheta*dist,-sinTheta*dist,sinPhi*innerRadius);this._mesh._normals[0].push(nx,ny,0);} this._mesh._texCoords[0].push(1-(1+cosPhi)*0.5,(1-sinPhi)*0.5);if(b>0){this._mesh._indices[0].push(origPos);this._mesh._indices[0].push(origPos+b-1);this._mesh._indices[0].push(origPos+b);} if(b==sides){this._mesh._indices[0].push(origPos);this._mesh._indices[0].push(origPos+b);this._mesh._indices[0].push(origPos+1);}}} this._mesh._invalidate=true;this._mesh._numFaces=this._mesh._indices[0].length/3;this._mesh._numCoords=this._mesh._positions[0].length/3;x3dom.geoCache[geoCacheID]=this._mesh;}},{fieldChanged:function(fieldName) {if(fieldName=="innerRadius"||fieldName=="outerRadius"||fieldName=="subdivision"||fieldName=="angle"||fieldName=="insideOutsideRadius"||fieldName=="caps") {var twoPi=2.0*Math.PI;if(this._vf.angle<0) this._vf.angle=0;else if(this._vf.angle>twoPi) this._vf.angle=twoPi;var innerRadius=this._vf.innerRadius;var outerRadius=this._vf.outerRadius;if(this._vf.insideOutsideRadius==true) {if(innerRadius>outerRadius){var tmp=innerRadius;innerRadius=outerRadius;outerRadius=tmp;} var rad=(outerRadius-innerRadius)/2;outerRadius=innerRadius+rad;innerRadius=rad;this._vf.ccw=!this._origCCW;} else this._vf.ccw=this._origCCW;var rings=this._vf.subdivision.x,sides=this._vf.subdivision.y;rings=Math.max(3,Math.round((this._vf.angle/twoPi)*rings));var ringDelta=this._vf.angle/rings;var sideDelta=twoPi/sides;var a,b,theta,phi;var cosTheta,sinTheta,cosPhi,sinPhi,dist;this._mesh._positions[0]=[];this._mesh._normals[0]=[];this._mesh._texCoords[0]=[];this._mesh._indices[0]=[];for(a=0,theta=0;a<=rings;a++,theta+=ringDelta) {cosTheta=Math.cos(theta);sinTheta=Math.sin(theta);for(b=0,phi=0;b<=sides;b++,phi+=sideDelta) {cosPhi=Math.cos(phi);sinPhi=Math.sin(phi);dist=outerRadius+innerRadius*cosPhi;if(this._vf.insideOutsideRadius){this._mesh._positions[0].push(cosTheta*dist,innerRadius*sinPhi,-sinTheta*dist);this._mesh._normals[0].push(cosTheta*cosPhi,sinPhi,-sinTheta*cosPhi);} else{this._mesh._positions[0].push(cosTheta*dist,-sinTheta*dist,innerRadius*sinPhi);this._mesh._normals[0].push(cosTheta*cosPhi,-sinTheta*cosPhi,sinPhi);} this._mesh._texCoords[0].push(-a/rings,b/sides);}} for(a=0;a0){this._mesh._indices[0].push(origPos);this._mesh._indices[0].push(origPos+b);this._mesh._indices[0].push(origPos+b-1);} if(b==sides){this._mesh._indices[0].push(origPos);this._mesh._indices[0].push(origPos+1);this._mesh._indices[0].push(origPos+b);}} cosTheta=Math.cos(this._vf.angle);sinTheta=Math.sin(this._vf.angle);origPos=this._mesh._positions[0].length/3;var nx=-sinTheta,ny=-cosTheta;if(this._vf.insideOutsideRadius){this._mesh._positions[0].push(cosTheta*outerRadius,0,-sinTheta*outerRadius);this._mesh._normals[0].push(nx,0,ny);} else{this._mesh._positions[0].push(cosTheta*outerRadius,-sinTheta*outerRadius,0);this._mesh._normals[0].push(nx,ny,0);} this._mesh._texCoords[0].push(0.5,0.5);for(b=0,phi=0;b<=sides;b++,phi+=sideDelta) {cosPhi=Math.cos(phi);sinPhi=Math.sin(phi);dist=outerRadius+innerRadius*cosPhi;if(this._vf.insideOutsideRadius){this._mesh._positions[0].push(cosTheta*dist,sinPhi*innerRadius,-sinTheta*dist);this._mesh._normals[0].push(nx,0,ny);} else{this._mesh._positions[0].push(cosTheta*dist,-sinTheta*dist,sinPhi*innerRadius);this._mesh._normals[0].push(nx,ny,0);} this._mesh._texCoords[0].push(1-(1+cosPhi)*0.5,(1-sinPhi)*0.5);if(b>0){this._mesh._indices[0].push(origPos);this._mesh._indices[0].push(origPos+b-1);this._mesh._indices[0].push(origPos+b);} if(b==sides){this._mesh._indices[0].push(origPos);this._mesh._indices[0].push(origPos+b);this._mesh._indices[0].push(origPos+1);}}} this.invalidateVolume();this._mesh._numFaces=this._mesh._indices[0].length/3;this._mesh._numCoords=this._mesh._positions[0].length/3;Array.forEach(this._parentNodes,function(node){node.setAllDirty();node.invalidateVolume();});}}}));x3dom.registerNodeType("Cone","Geometry3D",defineClass(x3dom.nodeTypes.X3DSpatialGeometryNode,function(ctx){x3dom.nodeTypes.Cone.superClass.call(this,ctx);this.addField_SFFloat(ctx,'bottomRadius',1.0);this.addField_SFFloat(ctx,'topRadius',0);this.addField_SFFloat(ctx,'height',2.0);this.addField_SFBool(ctx,'bottom',true);this.addField_SFBool(ctx,'side',true);this.addField_SFBool(ctx,'top',true);this.addField_SFFloat(ctx,'subdivision',32);var geoCacheID='Cone_'+this._vf.bottomRadius+'_'+this._vf.height+'_'+this._vf.top+'_'+ this._vf.bottom+'_'+this._vf.side+'_'+this._vf.topRadius+'_'+this._vf.subdivision;if(this._vf.useGeoCache&&x3dom.geoCache[geoCacheID]!==undefined){this._mesh=x3dom.geoCache[geoCacheID];} else{var bottomRadius=this._vf.bottomRadius,height=this._vf.height;var topRadius=this._vf.topRadius,sides=this._vf.subdivision;var beta,x,z;var delta=2.0*Math.PI/sides;var incl=(bottomRadius-topRadius)/height;var nlen=1.0/Math.sqrt(1.0+incl*incl);var j=0,k=0;var h,base;if(this._vf.side&&height>0){var px=0,pz=0;for(j=0,k=0;j<=sides;j++){beta=j*delta;x=Math.sin(beta);z=-Math.cos(beta);if(topRadius>x3dom.fields.Eps){px=x*topRadius;pz=z*topRadius;} this._mesh._positions[0].push(px,height/2,pz);this._mesh._normals[0].push(x/nlen,incl/nlen,z/nlen);this._mesh._texCoords[0].push(1.0-j/sides,1);this._mesh._positions[0].push(x*bottomRadius,-height/2,z*bottomRadius);this._mesh._normals[0].push(x/nlen,incl/nlen,z/nlen);this._mesh._texCoords[0].push(1.0-j/sides,0);if(j>0){this._mesh._indices[0].push(k);this._mesh._indices[0].push(k+2);this._mesh._indices[0].push(k+1);this._mesh._indices[0].push(k+1);this._mesh._indices[0].push(k+2);this._mesh._indices[0].push(k+3);k+=2;}}} if(this._vf.bottom&&bottomRadius>0){base=this._mesh._positions[0].length/3;for(j=sides-1;j>=0;j--){beta=j*delta;x=bottomRadius*Math.sin(beta);z=-bottomRadius*Math.cos(beta);this._mesh._positions[0].push(x,-height/2,z);this._mesh._normals[0].push(0,-1,0);this._mesh._texCoords[0].push(x/bottomRadius/2+0.5,z/bottomRadius/2+0.5);} h=base+1;for(j=2;jx3dom.fields.Eps){base=this._mesh._positions[0].length/3;for(j=sides-1;j>=0;j--){beta=j*delta;x=topRadius*Math.sin(beta);z=-topRadius*Math.cos(beta);this._mesh._positions[0].push(x,height/2,z);this._mesh._normals[0].push(0,1,0);this._mesh._texCoords[0].push(x/topRadius/2+0.5,1.0-z/topRadius/2+0.5);} h=base+1;for(j=2;j0) {var px=0,pz=0;for(j=0,k=0;j<=sides;j++){beta=j*delta;x=Math.sin(beta);z=-Math.cos(beta);if(topRadius>x3dom.fields.Eps){px=x*topRadius;pz=z*topRadius;} this._mesh._positions[0].push(px,height/2,pz);this._mesh._normals[0].push(x/nlen,incl/nlen,z/nlen);this._mesh._texCoords[0].push(1.0-j/sides,1);this._mesh._positions[0].push(x*bottomRadius,-height/2,z*bottomRadius);this._mesh._normals[0].push(x/nlen,incl/nlen,z/nlen);this._mesh._texCoords[0].push(1.0-j/sides,0);if(j>0){this._mesh._indices[0].push(k);this._mesh._indices[0].push(k+2);this._mesh._indices[0].push(k+1);this._mesh._indices[0].push(k+1);this._mesh._indices[0].push(k+2);this._mesh._indices[0].push(k+3);k+=2;}}} if(this._vf.bottom&&bottomRadius>0) {base=this._mesh._positions[0].length/3;for(j=sides-1;j>=0;j--){beta=j*delta;x=bottomRadius*Math.sin(beta);z=-bottomRadius*Math.cos(beta);this._mesh._positions[0].push(x,-height/2,z);this._mesh._normals[0].push(0,-1,0);this._mesh._texCoords[0].push(x/bottomRadius/2+0.5,z/bottomRadius/2+0.5);} h=base+1;for(j=2;jx3dom.fields.Eps) {base=this._mesh._positions[0].length/3;for(j=sides-1;j>=0;j--){beta=j*delta;x=topRadius*Math.sin(beta);z=-topRadius*Math.cos(beta);this._mesh._positions[0].push(x,height/2,z);this._mesh._normals[0].push(0,1,0);this._mesh._texCoords[0].push(x/topRadius/2+0.5,1.0-z/topRadius/2+0.5);} h=base+1;for(j=2;j0) {this._mesh._indices[0].push(k);this._mesh._indices[0].push(k+1);this._mesh._indices[0].push(k+2);this._mesh._indices[0].push(k+2);this._mesh._indices[0].push(k+1);this._mesh._indices[0].push(k+3);k+=2;}}} if(radius>0) {var h,base=this._mesh._positions[0].length/3;if(this._vf.top) {for(j=sides-1;j>=0;j--) {beta=j*delta;x=radius*Math.sin(beta);z=-radius*Math.cos(beta);this._mesh._positions[0].push(x,height,z);this._mesh._normals[0].push(0,1,0);this._mesh._texCoords[0].push(x/radius/2+0.5,-z/radius/2+0.5);} h=base+1;for(j=2;j=0;j--) {beta=j*delta;x=radius*Math.sin(beta);z=-radius*Math.cos(beta);this._mesh._positions[0].push(x,-height,z);this._mesh._normals[0].push(0,-1,0);this._mesh._texCoords[0].push(x/radius/2+0.5,z/radius/2+0.5);} h=base+1;for(j=2;j0) {var h,base=this._mesh._positions[0].length/3;if(this._vf.top) {for(j=sides-1;j>=0;j--) {beta=j*delta;x=radius*Math.sin(beta);z=-radius*Math.cos(beta);this._mesh._positions[0].push(x,height,z);}}} if(this._vf.bottom) {for(j=sides-1;j>=0;j--) {beta=j*delta;x=radius*Math.sin(beta);z=-radius*Math.cos(beta);this._mesh._positions[0].push(x,-height,z);}} this.invalidateVolume();this._mesh._numCoords=this._mesh._positions[0].length/3;Array.forEach(this._parentNodes,function(node){node._dirty.positions=true;node.invalidateVolume();});} else if(fieldName==="subdivision"||fieldName==="bottom"||fieldName==="top"||fieldName==="side") {this._mesh._positions[0]=[];this._mesh._indices[0]=[];this._mesh._normals[0]=[];this._mesh._texCoords[0]=[];var radius=this._vf.radius,height=this._vf.height/2;var sides=this._vf.subdivision;var beta,x,z,j;var delta=2.0*Math.PI/sides;var k=0;if(this._vf.side) {for(j=0,k=0;j<=sides;j++) {beta=j*delta;x=Math.sin(beta);z=-Math.cos(beta);this._mesh._positions[0].push(x*radius,-height,z*radius);this._mesh._normals[0].push(x,0,z);this._mesh._texCoords[0].push(1.0-j/sides,0);this._mesh._positions[0].push(x*radius,height,z*radius);this._mesh._normals[0].push(x,0,z);this._mesh._texCoords[0].push(1.0-j/sides,1);if(j>0) {this._mesh._indices[0].push(k+0);this._mesh._indices[0].push(k+1);this._mesh._indices[0].push(k+2);this._mesh._indices[0].push(k+2);this._mesh._indices[0].push(k+1);this._mesh._indices[0].push(k+3);k+=2;}}} if(radius>0) {var h,base=this._mesh._positions[0].length/3;if(this._vf.top) {for(j=sides-1;j>=0;j--) {beta=j*delta;x=radius*Math.sin(beta);z=-radius*Math.cos(beta);this._mesh._positions[0].push(x,height,z);this._mesh._normals[0].push(0,1,0);this._mesh._texCoords[0].push(x/radius/2+0.5,-z/radius/2+0.5);} h=base+1;for(j=2;j=0;j--) {beta=j*delta;x=radius*Math.sin(beta);z=-radius*Math.cos(beta);this._mesh._positions[0].push(x,-height,z);this._mesh._normals[0].push(0,-1,0);this._mesh._texCoords[0].push(x/radius/2+0.5,z/radius/2+0.5);} h=base+1;for(j=2;j=this._vf['url'].length) {return;} if(x3dom.BinaryContainerLoader.outOfMemory){return;} shape._webgl.internalDownloadCount=1;shape._nameSpace.doc.downloadCount=1;xhr=new XMLHttpRequest();xhr.open("GET",shape._nameSpace.getURL(this._vf['url'][this._currentURLIdx]),true);xhr.responseType="arraybuffer";xhr.send(null);xhr.onerror=function(){x3dom.debug.logError("Unable to load SRC data from URL \""+that._vf['url'][that._currentURLIdx]+"\"");};xhr.onload=function(){shape._webgl.internalDownloadCount=0;shape._nameSpace.doc.downloadCount=0;var responseBeginUint32=new Uint32Array(xhr.response,0,12);var srcHeaderSize,srcBodySize,srcBodyOffset;var srcHeaderView,srcBodyView;var srcHeaderObj;if((xhr.status==200||xhr.status==0)&&responseBeginUint32.length>=3){srcHeaderSize=responseBeginUint32[2];srcBodyOffset=srcHeaderSize+12;srcBodySize=xhr.response.byteLength-srcBodyOffset;if(srcHeaderSize>0&&srcBodySize>=0) {srcHeaderView=new Uint8Array(xhr.response,12,srcHeaderSize);srcBodyView=new Uint8Array(xhr.response,srcBodyOffset,srcBodySize);try {srcHeaderObj=JSON.parse(String.fromCharCode.apply(null,srcHeaderView));} catch(exc) {x3dom.debug.logError("Unable to parse SRC header: "+exc);return;} that._updateRenderDataFromSRC(shape,shaderProgram,gl,srcHeaderObj,srcBodyView);} else {if((that._currentURLIdx+1)=0);return(this._vf.lit&&hasTris);}}));x3dom.registerNodeType("BinaryGeometry","Geometry3D",defineClass(x3dom.nodeTypes.X3DBinaryContainerGeometryNode,function(ctx){x3dom.nodeTypes.BinaryGeometry.superClass.call(this,ctx);this.addField_SFString(ctx,'index',"");this.addField_SFString(ctx,'coord',"");this.addField_SFString(ctx,'normal',"");this.addField_SFString(ctx,'texCoord',"");this.addField_SFString(ctx,'color',"");this.addField_SFString(ctx,'tangent',"");this.addField_SFString(ctx,'binormal',"");this.addField_SFString(ctx,'indexType',"Uint16");this.addField_SFString(ctx,'coordType',"Float32");this.addField_SFString(ctx,'normalType',"Float32");this.addField_SFString(ctx,'texCoordType',"Float32");this.addField_SFString(ctx,'colorType',"Float32");this.addField_SFString(ctx,'tangentType',"Float32");this.addField_SFString(ctx,'binormalType',"Float32");this.addField_SFBool(ctx,'normalAsSphericalCoordinates',false);this.addField_SFBool(ctx,'rgbaColors',false);this.addField_SFInt32(ctx,'numTexCoordComponents',2);this.addField_SFBool(ctx,'normalPerVertex',true);this.addField_SFBool(ctx,'idsPerVertex',false);this.addField_SFBool(ctx,'compressed',false);this._hasStrideOffset=false;this._mesh._numPosComponents=this._vf.normalAsSphericalCoordinates?4:3;this._mesh._numTexComponents=this._vf.numTexCoordComponents;this._mesh._numColComponents=this._vf.rgbaColors?4:3;this._mesh._numNormComponents=this._vf.normalAsSphericalCoordinates?2:3;this._vertexCountSum=0;for(var i=0;i=0&&strideInd>=0){offset=+this._vf.coord.substring(++offsetInd,strideInd);stride=+this._vf.coord.substring(strideInd);parent._coordStrideOffset=[stride,offset];this._hasStrideOffset=true;if((offset/8)-Math.floor(offset/8)==0){this._mesh._numPosComponents=4;}} else if(strideInd>=0){stride=+this._vf.coord.substring(strideInd);parent._coordStrideOffset=[stride,0];if((stride/8)-Math.floor(stride/8)==0){this._mesh._numPosComponents=4;}} offsetInd=this._vf.normal.lastIndexOf('#');strideInd=this._vf.normal.lastIndexOf('+');if(offsetInd>=0&&strideInd>=0){offset=+this._vf.normal.substring(++offsetInd,strideInd);stride=+this._vf.normal.substring(strideInd);parent._normalStrideOffset=[stride,offset];} else if(strideInd>=0){stride=+this._vf.normal.substring(strideInd);parent._normalStrideOffset=[stride,0];} offsetInd=this._vf.texCoord.lastIndexOf('#');strideInd=this._vf.texCoord.lastIndexOf('+');if(offsetInd>=0&&strideInd>=0){offset=+this._vf.texCoord.substring(++offsetInd,strideInd);stride=+this._vf.texCoord.substring(strideInd);parent._texCoordStrideOffset=[stride,offset];} else if(strideInd>=0){stride=+this._vf.texCoord.substring(strideInd);parent._texCoordStrideOffset=[stride,0];} offsetInd=this._vf.color.lastIndexOf('#');strideInd=this._vf.color.lastIndexOf('+');if(offsetInd>=0&&strideInd>=0){offset=+this._vf.color.substring(++offsetInd,strideInd);stride=+this._vf.color.substring(strideInd);parent._colorStrideOffset=[stride,offset];} else if(strideInd>=0){stride=+this._vf.color.substring(strideInd);parent._colorStrideOffset=[stride,0];} if(this._vf.indexType!="Uint16"&&!x3dom.caps.INDEX_UINT) x3dom.debug.logWarning("Index type "+this._vf.indexType+" problematic");},doIntersect:function(line) {var min=this.getMin();var max=this.getMax();var isect=line.intersect(min,max);if(isect&&line.enterthis._vf.bbMaxModF.x) this._vf.bbShiftVec.x=1.0;if(this._vf.bbMinModF.y>this._vf.bbMaxModF.y) this._vf.bbShiftVec.y=1.0;if(this._vf.bbMinModF.z>this._vf.bbMaxModF.z) this._vf.bbShiftVec.z=1.0;this.addField_MFNode('levels',x3dom.nodeTypes.PopGeometryLevel);this.addField_SFInt32(ctx,'attributeStride',0);this.addField_SFInt32(ctx,'positionOffset',0);this.addField_SFInt32(ctx,'normalOffset',0);this.addField_SFInt32(ctx,'texcoordOffset',0);this.addField_SFInt32(ctx,'colorOffset',0);this.addField_SFInt32(ctx,'numAnchorVertices',0);this.addField_SFInt32(ctx,'positionPrecision',2);this.addField_SFInt32(ctx,'normalPrecision',1);this.addField_SFInt32(ctx,'texcoordPrecision',2);this.addField_SFInt32(ctx,'colorPrecision',1);this.addField_SFInt32(ctx,'minPrecisionLevel',-1);this.addField_SFInt32(ctx,'maxPrecisionLevel',-1);this.addField_SFFloat(ctx,'precisionFactor',1.0);this.addField_SFString(ctx,'coordType',"Uint16");this.addField_SFString(ctx,'normalType',"Uint8");this.addField_SFString(ctx,'texCoordType',"Uint16");this.addField_SFString(ctx,'colorType',"Uint8");this.addField_SFInt32(ctx,'vertexBufferSize',0);this.addField_SFBool(ctx,'indexedRendering',true);this.addField_SFBool(ctx,'sphericalNormals',false);this.addField_MFInt32(ctx,'originalVertexCount',[0]);for(var i=0;i0){var geoCacheID='ImageGeometry_'+this._vf.implicitMeshSize.x+'_'+this._vf.implicitMeshSize.y;if(this._vf.useGeoCache&&x3dom.geoCache[geoCacheID]!==undefined) {this._mesh=x3dom.geoCache[geoCacheID];} else {for(var y=0;y0) {hasNormalInd=true;} if(texCoordInd.length>0) {hasTexCoordInd=true;} if(colorInd.length>0) {hasColorInd=true;} var positions,normals,texCoords,colors;var coordNode=this._cf.coord.node;x3dom.debug.assert(coordNode);positions=coordNode.getPoints();var normalNode=this._cf.normal.node;if(normalNode) {hasNormal=true;normals=normalNode._vf.vector;} else{hasNormal=false;} var texMode="",numTexComponents=2;var texCoordNode=this._cf.texCoord.node;if(x3dom.isa(texCoordNode,x3dom.nodeTypes.MultiTextureCoordinate)){if(texCoordNode._cf.texCoord.nodes.length) texCoordNode=texCoordNode._cf.texCoord.nodes[0];} if(texCoordNode) {if(texCoordNode._vf.point){hasTexCoord=true;texCoords=texCoordNode._vf.point;if(x3dom.isa(texCoordNode,x3dom.nodeTypes.TextureCoordinate3D)){numTexComponents=3;}} else if(texCoordNode._vf.mode){texMode=texCoordNode._vf.mode;}} else{hasTexCoord=false;} this._mesh._numTexComponents=numTexComponents;var numColComponents=3;var colorNode=this._cf.color.node;if(colorNode) {hasColor=true;colors=colorNode._vf.color;if(x3dom.isa(colorNode,x3dom.nodeTypes.ColorRGBA)){numColComponents=4;}} else{hasColor=false;} this._mesh._numColComponents=numColComponents;this._mesh._indices[0]=[];this._mesh._positions[0]=[];this._mesh._normals[0]=[];this._mesh._texCoords[0]=[];this._mesh._colors[0]=[];var i,j,t,cnt,faceCnt;var p0,p1,p2,n0,n1,n2,t0,t1,t2,c0,c1,c2;if((this._vf.creaseAngle<=x3dom.fields.Eps)||(positions.length>x3dom.Utils.maxIndexableCoords)||(hasNormal&&hasNormalInd)||(hasTexCoord&&hasTexCoordInd)||(hasColor&&hasColorInd)) {if(this._vf.creaseAngle<=x3dom.fields.Eps) x3dom.debug.logWarning('Fallback to inefficient multi-index mode since creaseAngle=0.');if(this._vf.convex){t=0;cnt=0;faceCnt=0;this._mesh._multiIndIndices=[];this._mesh._posSize=positions.length;for(i=0;ipositions.length-1) {continue;} if(indexes[i]==-1){t=0;faceCnt++;continue;} if(hasNormalInd){x3dom.debug.assert(normalInd[i]!=-1);} if(hasTexCoordInd){x3dom.debug.assert(texCoordInd[i]!=-1);} if(hasColorInd){x3dom.debug.assert(colorInd[i]!=-1);} switch(t) {case 0:p0=+indexes[i];if(hasNormalInd&&normPerVert){n0=+normalInd[i];} else if(hasNormalInd&&!normPerVert){n0=+normalInd[faceCnt];} else if(normPerVert){n0=p0;} else{n0=faceCnt;} if(hasTexCoordInd){t0=+texCoordInd[i];} else{t0=p0;} if(hasColorInd&&colPerVert){c0=+colorInd[i];} else if(hasColorInd&&!colPerVert){c0=+colorInd[faceCnt];} else if(colPerVert){c0=p0;} else{c0=faceCnt;} t=1;break;case 1:p1=+indexes[i];if(hasNormalInd&&normPerVert){n1=+normalInd[i];} else if(hasNormalInd&&!normPerVert){n1=+normalInd[faceCnt];} else if(normPerVert){n1=p1;} else{n1=faceCnt;} if(hasTexCoordInd){t1=+texCoordInd[i];} else{t1=p1;} if(hasColorInd&&colPerVert){c1=+colorInd[i];} else if(hasColorInd&&!colPerVert){c1=+colorInd[faceCnt];} else if(colPerVert){c1=p1;} else{c1=faceCnt;} t=2;break;case 2:p2=+indexes[i];if(hasNormalInd&&normPerVert){n2=+normalInd[i];} else if(hasNormalInd&&!normPerVert){n2=+normalInd[faceCnt];} else if(normPerVert){n2=p2;} else{n2=faceCnt;} if(hasTexCoordInd){t2=+texCoordInd[i];} else{t2=p2;} if(hasColorInd&&colPerVert){c2=+colorInd[i];} else if(hasColorInd&&!colPerVert){c2=+colorInd[faceCnt];} else if(colPerVert){c2=p2;} else{c2=faceCnt;} t=3;this._mesh._positions[0].push(positions[p0].x);this._mesh._positions[0].push(positions[p0].y);this._mesh._positions[0].push(positions[p0].z);this._mesh._positions[0].push(positions[p1].x);this._mesh._positions[0].push(positions[p1].y);this._mesh._positions[0].push(positions[p1].z);this._mesh._positions[0].push(positions[p2].x);this._mesh._positions[0].push(positions[p2].y);this._mesh._positions[0].push(positions[p2].z);if(hasNormal){this._mesh._normals[0].push(normals[n0].x);this._mesh._normals[0].push(normals[n0].y);this._mesh._normals[0].push(normals[n0].z);this._mesh._normals[0].push(normals[n1].x);this._mesh._normals[0].push(normals[n1].y);this._mesh._normals[0].push(normals[n1].z);this._mesh._normals[0].push(normals[n2].x);this._mesh._normals[0].push(normals[n2].y);this._mesh._normals[0].push(normals[n2].z);} this._mesh._multiIndIndices.push(p0,p1,p2);if(hasColor){this._mesh._colors[0].push(colors[c0].r);this._mesh._colors[0].push(colors[c0].g);this._mesh._colors[0].push(colors[c0].b);if(numColComponents===4){this._mesh._colors[0].push(colors[c0].a);} this._mesh._colors[0].push(colors[c1].r);this._mesh._colors[0].push(colors[c1].g);this._mesh._colors[0].push(colors[c1].b);if(numColComponents===4){this._mesh._colors[0].push(colors[c1].a);} this._mesh._colors[0].push(colors[c2].r);this._mesh._colors[0].push(colors[c2].g);this._mesh._colors[0].push(colors[c2].b);if(numColComponents===4){this._mesh._colors[0].push(colors[c2].a);}} if(hasTexCoord){this._mesh._texCoords[0].push(texCoords[t0].x);this._mesh._texCoords[0].push(texCoords[t0].y);if(numTexComponents===3){this._mesh._texCoords[0].push(texCoords[t0].z);} this._mesh._texCoords[0].push(texCoords[t1].x);this._mesh._texCoords[0].push(texCoords[t1].y);if(numTexComponents===3){this._mesh._texCoords[0].push(texCoords[t1].z);} this._mesh._texCoords[0].push(texCoords[t2].x);this._mesh._texCoords[0].push(texCoords[t2].y);if(numTexComponents===3){this._mesh._texCoords[0].push(texCoords[t2].z);}} break;case 3:p1=p2;t1=t2;if(normPerVert){n1=n2;} if(colPerVert){c1=c2;} p2=+indexes[i];if(hasNormalInd&&normPerVert){n2=+normalInd[i];}else if(hasNormalInd&&!normPerVert){}else if(normPerVert){n2=p2;}else{n2=faceCnt;} if(hasTexCoordInd){t2=+texCoordInd[i];}else{t2=p2;} if(hasColorInd&&colPerVert){c2=+colorInd[i];}else if(hasColorInd&&!colPerVert){}else if(colPerVert){c2=p2;}else{c2=faceCnt;} this._mesh._positions[0].push(positions[p0].x);this._mesh._positions[0].push(positions[p0].y);this._mesh._positions[0].push(positions[p0].z);this._mesh._positions[0].push(positions[p1].x);this._mesh._positions[0].push(positions[p1].y);this._mesh._positions[0].push(positions[p1].z);this._mesh._positions[0].push(positions[p2].x);this._mesh._positions[0].push(positions[p2].y);this._mesh._positions[0].push(positions[p2].z);if(hasNormal){this._mesh._normals[0].push(normals[n0].x);this._mesh._normals[0].push(normals[n0].y);this._mesh._normals[0].push(normals[n0].z);this._mesh._normals[0].push(normals[n1].x);this._mesh._normals[0].push(normals[n1].y);this._mesh._normals[0].push(normals[n1].z);this._mesh._normals[0].push(normals[n2].x);this._mesh._normals[0].push(normals[n2].y);this._mesh._normals[0].push(normals[n2].z);} this._mesh._multiIndIndices.push(p0,p1,p2);if(hasColor){this._mesh._colors[0].push(colors[c0].r);this._mesh._colors[0].push(colors[c0].g);this._mesh._colors[0].push(colors[c0].b);if(numColComponents===4){this._mesh._colors[0].push(colors[c0].a);} this._mesh._colors[0].push(colors[c1].r);this._mesh._colors[0].push(colors[c1].g);this._mesh._colors[0].push(colors[c1].b);if(numColComponents===4){this._mesh._colors[0].push(colors[c1].a);} this._mesh._colors[0].push(colors[c2].r);this._mesh._colors[0].push(colors[c2].g);this._mesh._colors[0].push(colors[c2].b);if(numColComponents===4){this._mesh._colors[0].push(colors[c2].a);}} if(hasTexCoord){this._mesh._texCoords[0].push(texCoords[t0].x);this._mesh._texCoords[0].push(texCoords[t0].y);if(numTexComponents===3){this._mesh._texCoords[0].push(texCoords[t0].z);} this._mesh._texCoords[0].push(texCoords[t1].x);this._mesh._texCoords[0].push(texCoords[t1].y);if(numTexComponents===3){this._mesh._texCoords[0].push(texCoords[t1].z);} this._mesh._texCoords[0].push(texCoords[t2].x);this._mesh._texCoords[0].push(texCoords[t2].y);if(numTexComponents===3){this._mesh._texCoords[0].push(texCoords[t2].z);}} break;default:}}} else{var linklist=new x3dom.DoublyLinkedList();var data={};cnt=0;faceCnt=0;for(i=0;ipositions.length-1) {continue;} this._mesh._indices[0].push(cnt);cnt++;this._mesh._positions[0].push(multi_index_data.point[j].x,multi_index_data.point[j].y,multi_index_data.point[j].z);if(hasNormal){if(multi_index_data.indices[i]>normals.length-1) {continue;} this._mesh._normals[0].push(multi_index_data.normals[j].x,multi_index_data.normals[j].y,multi_index_data.normals[j].z);} if(hasColor){if(multi_index_data.indices[i]>colors.length-1) {continue;} this._mesh._colors[0].push(multi_index_data.colors[j].r,multi_index_data.colors[j].g,multi_index_data.colors[j].b);if(numColComponents===4){this._mesh._colors[0].push(multi_index_data.colors[j].a);}} if(hasTexCoord){if(multi_index_data.indices[i]>texCoords.length-1) {continue;} this._mesh._texCoords[0].push(multi_index_data.texCoords[j].x,multi_index_data.texCoords[j].y);if(numTexComponents===3){this._mesh._texCoords[0].push(multi_index_data.texCoords[j].z);}}} linklist=new x3dom.DoublyLinkedList();faceCnt++;continue;} if(hasNormal){if(hasNormalInd&&normPerVert){data.normals=normals[normalInd[i]];}else if(hasNormalInd&&!normPerVert){data.normals=normals[normalInd[faceCnt]];}else{data.normals=normals[indexes[i]];}} if(hasColor){if(hasColorInd&&colPerVert){data.colors=colors[colorInd[i]];}else if(hasColorInd&&!colPerVert){data.colors=colors[colorInd[faceCnt]];}else if(colPerVert){data.colors=colors[indexes[i]];}else{data.colors=colors[faceCnt];}} if(hasTexCoord){if(hasTexCoordInd){data.texCoords=texCoords[texCoordInd[i]];}else{data.texCoords=texCoords[indexes[i]];}} linklist.appendNode(new x3dom.DoublyLinkedList.ListNode(positions[indexes[i]],indexes[i],data.normals,data.colors,data.texCoords));} this._mesh.splitMesh();} if(!hasNormal){this._mesh.calcNormals(this._vf.creaseAngle,this._vf.ccw);} if(!hasTexCoord){this._mesh.calcTexCoords(texMode);}} else {t=0;if(this._vf.convex){for(i=0;i0) this._mesh._numFaces+=indexLength/3;else this._mesh._numFaces+=numCoords/3;}},nodeChanged:function() {this._buildGeometry();},fieldChanged:function(fieldName) {if(fieldName!="coord"&&fieldName!="normal"&&fieldName!="texCoord"&&fieldName!="color"&&fieldName!="coordIndex") {x3dom.debug.logWarning("IndexedFaceSet: fieldChanged for "+ fieldName+" not yet implemented!");return;} var needNormals=!this._cf.normal.node&&this._vf.normalUpdateMode.toLowerCase()!='none';if(fieldName=="coord") {this._buildGeometry();Array.forEach(this._parentNodes,function(node){node._dirty.positions=true;if(needNormals){node._dirty.normals=true;}});} else if(fieldName=="color") {this._buildGeometry();Array.forEach(this._parentNodes,function(node){node._dirty.colors=true;});} else if(fieldName=="normal") {this._buildGeometry();Array.forEach(this._parentNodes,function(node){node._dirty.normals=true;});} else if(fieldName=="texCoord") {this._buildGeometry();Array.forEach(this._parentNodes,function(node){node._dirty.texcoords=true;});} else if(fieldName=="coordIndex") {this._buildGeometry();Array.forEach(this._parentNodes,function(node){node._dirty.indexes=true;if(needNormals){node._dirty.normals=true;}});}}}));x3dom.registerNodeType("X3DTexture3DNode","Texturing3D",defineClass(x3dom.nodeTypes.X3DTextureNode,function(ctx){x3dom.nodeTypes.X3DTexture3DNode.superClass.call(this,ctx);}));x3dom.registerNodeType("ComposedTexture3D","Texturing3D",defineClass(x3dom.nodeTypes.X3DTexture3DNode,function(ctx){x3dom.nodeTypes.ComposedTexture3D.superClass.call(this,ctx);this.addField_MFNode('texture',x3dom.nodeTypes.X3DTexture3DNode);}));x3dom.registerNodeType("ImageTexture3D","Texturing3D",defineClass(x3dom.nodeTypes.X3DTexture3DNode,function(ctx){x3dom.nodeTypes.ImageTexture3D.superClass.call(this,ctx);}));x3dom.registerNodeType("PixelTexture3D","Texturing3D",defineClass(x3dom.nodeTypes.X3DTexture3DNode,function(ctx){x3dom.nodeTypes.PixelTexture3D.superClass.call(this,ctx);}));x3dom.registerNodeType("TextureCoordinate3D","Texturing3D",defineClass(x3dom.nodeTypes.X3DTextureCoordinateNode,function(ctx){x3dom.nodeTypes.TextureCoordinate3D.superClass.call(this,ctx);this.addField_MFVec3f(ctx,'point',[]);}));x3dom.registerNodeType("TextureTransform3D","Texturing3D",defineClass(x3dom.nodeTypes.X3DTextureTransformNode,function(ctx){x3dom.nodeTypes.TextureTransform3D.superClass.call(this,ctx);this.addField_SFVec3f(ctx,'center',0,0,0);this.addField_SFRotation(ctx,'rotation',0,0,1,0);this.addField_SFVec3f(ctx,'scale',1,1,1);this.addField_SFVec3f(ctx,'translation',0,0,0);this.addField_SFRotation(ctx,'scaleOrientation',0,0,1,0);}));x3dom.registerNodeType("TextureTransformMatrix3D","Texturing3D",defineClass(x3dom.nodeTypes.X3DTextureTransformNode,function(ctx){x3dom.nodeTypes.TextureTransformMatrix3D.superClass.call(this,ctx);this.addField_SFMatrix4f(ctx,'matrix',1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1);}));x3dom.registerNodeType("X3DPointingDeviceSensorNode","PointingDeviceSensor",defineClass(x3dom.nodeTypes.X3DSensorNode,function(ctx) {x3dom.nodeTypes.X3DPointingDeviceSensorNode.superClass.call(this,ctx);},{pointerPressedOverSibling:function(event) {if(this._vf.enabled) {this._vf.isActive=true;this.postMessage('isActive',true);}},pointerMoved:function(event) {},pointerMovedOver:function(event) {if(this._vf.enabled) {this.postMessage('isOver',true);}},pointerMovedOut:function(event) {if(this._vf.enabled) {this.postMessage('isOver',false);}},pointerReleased:function() {if(this._vf.enabled) {this._vf.isActive=false;this.postMessage('isActive',false);}}}));x3dom.registerNodeType("X3DDragSensorNode","PointingDeviceSensor",defineClass(x3dom.nodeTypes.X3DPointingDeviceSensorNode,function(ctx) {x3dom.nodeTypes.X3DDragSensorNode.superClass.call(this,ctx);this.addField_SFBool(ctx,'autoOffset',true);this._lastX=-1;this._lastY=-1;},{pointerPressedOverSibling:function(event) {x3dom.nodeTypes.X3DPointingDeviceSensorNode.prototype.pointerPressedOverSibling.call(this,event);this._lastX=event.layerX;this._lastY=event.layerY;this._startDragging(event.viewarea,event.layerX,event.layerX,event.worldX,event.worldY,event.worldZ);},pointerMoved:function(event) {x3dom.nodeTypes.X3DPointingDeviceSensorNode.prototype.pointerMoved.call(this,event);if(this._vf.isActive&&this._vf.enabled) {this._process2DDrag(event.layerX,event.layerY,event.layerX-this._lastX,event.layerY-this._lastY);}},pointerReleased:function() {x3dom.nodeTypes.X3DPointingDeviceSensorNode.prototype.pointerReleased.call(this);this._stopDragging();},_startDragging:function(viewarea,x,y,wx,wy,wz) {},_process2DDrag:function(x,y,dx,dy) {},_stopDragging:function() {}}));x3dom.registerNodeType("X3DTouchSensorNode","PointingDeviceSensor",defineClass(x3dom.nodeTypes.X3DPointingDeviceSensorNode,function(ctx) {x3dom.nodeTypes.X3DTouchSensorNode.superClass.call(this,ctx);},{}));x3dom.registerNodeType("TouchSensor","PointingDeviceSensor",defineClass(x3dom.nodeTypes.X3DTouchSensorNode,function(ctx) {x3dom.nodeTypes.TouchSensor.superClass.call(this,ctx);},{}));x3dom.registerNodeType("PlaneSensor","PointingDeviceSensor",defineClass(x3dom.nodeTypes.X3DDragSensorNode,function(ctx) {x3dom.nodeTypes.PlaneSensor.superClass.call(this,ctx);this.addField_SFRotation(ctx,'axisRotation',0,0,1,0);this.addField_SFVec2f(ctx,'minPosition',0,0);this.addField_SFVec2f(ctx,'maxPosition',-1,-1);this.addField_SFVec3f(ctx,'offset',0,0,0);this._rotationMatrix=this._vf.axisRotation.toMatrix();this._worldToLocalMatrix=null;this._initialPlaneIntersection=null;this._planeNormal=null;this._viewArea=null;this._currentTranslation=new x3dom.fields.SFVec3f(0.0,0.0,0.0);},{getCurrentTransform:function() {var parentTransform=x3dom.nodeTypes.X3DDragSensorNode.prototype.getCurrentTransform.call(this);return parentTransform.mult(this._rotationMatrix);},_startDragging:function(viewarea,x,y,wx,wy,wz) {x3dom.nodeTypes.X3DDragSensorNode.prototype._startDragging.call(this,viewarea,x,y,wx,wy,wz);this._viewArea=viewarea;this._currentTranslation=new x3dom.fields.SFVec3f(0.0,0.0,0.0).add(this._vf.offset);this._worldToLocalMatrix=this.getCurrentTransform().inverse();this._initialPlaneIntersection=this._worldToLocalMatrix.multMatrixPnt(new x3dom.fields.SFVec3f(wx,wy,wz));this._planeNormal=new x3dom.fields.SFVec3f(0.0,0.0,1.0);},_process2DDrag:function(x,y,dx,dy) {x3dom.nodeTypes.X3DDragSensorNode.prototype._process2DDrag.call(this,x,y,dx,dy);var intersectionPoint;var minPos,maxPos;if(this._initialPlaneIntersection) {var viewRay=this._viewArea.calcViewRay(x,y);viewRay.pos=this._worldToLocalMatrix.multMatrixPnt(viewRay.pos);viewRay.dir=this._worldToLocalMatrix.multMatrixVec(viewRay.dir.normalize());intersectionPoint=viewRay.intersectPlane(this._initialPlaneIntersection,this._planeNormal);if(!intersectionPoint) {intersectionPoint=viewRay.intersectPlane(this._initialPlaneIntersection,this._planeNormal.negate());} if(intersectionPoint) {this._currentTranslation=intersectionPoint.subtract(this._initialPlaneIntersection);this._currentTranslation=this._currentTranslation.add(this._vf.offset);minPos=this._vf.minPosition;maxPos=this._vf.maxPosition;if(minPos.x<=maxPos.x) {this._currentTranslation.x=Math.min(this._currentTranslation.x,maxPos.x);this._currentTranslation.x=Math.max(this._currentTranslation.x,minPos.x);} if(minPos.y<=maxPos.y) {this._currentTranslation.y=Math.min(this._currentTranslation.y,maxPos.y);this._currentTranslation.y=Math.max(this._currentTranslation.y,minPos.y);} this.postMessage('translation_changed',x3dom.fields.SFVec3f.copy(this._currentTranslation));}}},_stopDragging:function() {x3dom.nodeTypes.X3DDragSensorNode.prototype._stopDragging.call(this);if(this._vf.autoOffset) {this._vf.offset=x3dom.fields.SFVec3f.copy(this._currentTranslation);this.postMessage('offset_changed',this._vf.offset);}}}));x3dom.registerNodeType("SphereSensor","PointingDeviceSensor",defineClass(x3dom.nodeTypes.X3DDragSensorNode,function(ctx) {x3dom.nodeTypes.SphereSensor.superClass.call(this,ctx);this.addField_SFRotation(ctx,'offset',0,1,0,0);this._currentRotation=null;this._rotationMatrix=this._vf.offset.toMatrix();},{getCurrentTransform:function() {var parentTransform=x3dom.nodeTypes.X3DDragSensorNode.prototype.getCurrentTransform.call(this);return parentTransform.mult(this._rotationMatrix);},_startDragging:function(viewarea,x,y,wx,wy,wz) {x3dom.nodeTypes.X3DDragSensorNode.prototype._startDragging.call(this,viewarea,x,y,wx,wy,wz);this._currentRotation=new x3dom.fields.Quaternion();this._viewArea=viewarea;this._localOrigin=new x3dom.fields.SFVec3f(0.0,0.0,0.0);this._inverseToWorldMatrix=this.getCurrentTransform().inverse();var firstIntersection=this._inverseToWorldMatrix.multMatrixPnt(new x3dom.fields.SFVec3f(wx,wy,wz));this._initialSphereIntersectionVector=firstIntersection.subtract(this._localOrigin);this._sphereRadius=this._initialSphereIntersectionVector.length();this._initialSphereIntersectionVector=this._initialSphereIntersectionVector.normalize();},_process2DDrag:function(x,y,dx,dy) {x3dom.nodeTypes.X3DDragSensorNode.prototype._process2DDrag.call(this,x,y,dx,dy);var viewRay=this._viewArea.calcViewRay(x,y);viewRay.pos=this._inverseToWorldMatrix.multMatrixPnt(viewRay.pos);viewRay.dir=this._inverseToWorldMatrix.multMatrixVec(viewRay.dir);var A=viewRay.dir.dot(viewRay.dir);var B=2.0*(viewRay.dir.dot(viewRay.pos.subtract(this._localOrigin)));var C=viewRay.pos.dot(viewRay.pos)-2.0*this._localOrigin.dot(viewRay.pos)+ this._localOrigin.dot(this._localOrigin)-this._sphereRadius*this._sphereRadius;var determinant=(B*B)-(4.0*A*C);var alpha_1;var alpha_2;if(determinant>=0.0){alpha_1=(-B+Math.sqrt(determinant))/(2.0*A);alpha_2=(-B-Math.sqrt(determinant))/(2.0*A);alpha_1=Math.min(alpha_1,alpha_2);if(alpha_1>=1.0){var hitPoint=viewRay.pos.add(viewRay.dir.multiply(alpha_1));var vecToHitPoint=hitPoint.subtract(this._localOrigin).normalize();this._currentRotation=x3dom.fields.Quaternion.rotateFromTo(this._initialSphereIntersectionVector,vecToHitPoint);this._currentRotation=this._currentRotation.multiply(this._vf.offset);this.postMessage('rotation_changed',this._currentRotation);}} else{}},_stopDragging:function() {x3dom.nodeTypes.X3DDragSensorNode.prototype._stopDragging.call(this);if(this._vf.autoOffset) {this._vf.offset=this._currentRotation;this.postMessage('offset_changed',this._vf.offset);} this._currentRotation=new x3dom.fields.Quaternion();}}));x3dom.registerNodeType("CylinderSensor","PointingDeviceSensor",defineClass(x3dom.nodeTypes.X3DDragSensorNode,function(ctx) {x3dom.nodeTypes.CylinderSensor.superClass.call(this,ctx);this.addField_SFFloat(ctx,'offset',0);this.addField_SFRotation(ctx,'axisRotation',0,1,0,0);this.addField_SFFloat(ctx,'diskAngle',0.262);this.addField_SFFloat(ctx,'minAngle',0);this.addField_SFFloat(ctx,'maxAngle',-1);this._rotationMatrix=this._vf.axisRotation.toMatrix();this._inverseToWorldMatrix=null;this._initialCylinderIntersectionVector=null;this._viewArea=null;this._cylinderRadius=0.0;this._yAxisLine=null;this._cylinderMode=true;this._currentRotationAngle=0.0;},{getCurrentTransform:function() {var parentTransform=x3dom.nodeTypes.X3DDragSensorNode.prototype.getCurrentTransform.call(this);return parentTransform.mult(this._rotationMatrix);},_startDragging:function(viewarea,x,y,wx,wy,wz) {x3dom.nodeTypes.X3DDragSensorNode.prototype._startDragging.call(this,viewarea,x,y,wx,wy,wz);this._currentRotation=new x3dom.fields.Quaternion();this._viewArea=viewarea;this._yAxisLine=new x3dom.fields.Line(new x3dom.fields.SFVec3f(0.0,0.0,0.0),new x3dom.fields.SFVec3f(0.0,1.0,0.0));this._inverseToWorldMatrix=this.getCurrentTransform().inverse();var firstIntersection=this._inverseToWorldMatrix.multMatrixPnt(new x3dom.fields.SFVec3f(wx,wy,wz));var closestPointOnYAxis=this._yAxisLine.closestPoint(firstIntersection);this._initialCylinderIntersectionVector=firstIntersection.subtract(closestPointOnYAxis);this._cylinderRadius=this._initialCylinderIntersectionVector.length();this._initialCylinderIntersectionVector=this._initialCylinderIntersectionVector.normalize();},_process2DDrag:function(x,y,dx,dy) {x3dom.nodeTypes.X3DDragSensorNode.prototype._process2DDrag.call(this,x,y,dx,dy);if(this._cylinderMode) {var viewRay=this._viewArea.calcViewRay(x,y);viewRay.pos=this._inverseToWorldMatrix.multMatrixPnt(viewRay.pos);viewRay.dir=this._inverseToWorldMatrix.multMatrixVec(viewRay.dir);var A=viewRay.dir.subtract(this._yAxisLine.dir.multiply(viewRay.dir.dot(this._yAxisLine.dir)));var B=viewRay.pos.subtract(this._yAxisLine.pos).add(this._yAxisLine.dir.multiply(this._yAxisLine.dir.dot(this._yAxisLine.pos.subtract(viewRay.pos))));var p=2*A.dot(B)/A.dot(A);var q=(B.dot(B)-this._cylinderRadius*this._cylinderRadius)/A.dot(A);var sqrt_part=p*p*0.25-q;var alpha_1;var alpha_2;if(sqrt_part>=0) {sqrt_part=Math.sqrt(sqrt_part);alpha_1=-p*0.5+sqrt_part;alpha_2=-p*0.5-sqrt_part;alpha_1=Math.min(alpha_1,alpha_2);if(alpha_1>0.0) {var hitPoint=viewRay.pos.add(viewRay.dir.multiply(alpha_1));var closestPointOnYAxis=this._yAxisLine.closestPoint(hitPoint);var vecToHitPoint=hitPoint.subtract(closestPointOnYAxis).normalize();this._currentRotation=x3dom.fields.Quaternion.rotateFromTo(this._initialCylinderIntersectionVector,vecToHitPoint);var offsetQuat=x3dom.fields.Quaternion.axisAngle(this._yAxisLine.dir,this._vf.offset);this._currentRotation=this._currentRotation.multiply(offsetQuat);this.postMessage('rotation_changed',this._currentRotation);}}} else {}},_stopDragging:function() {x3dom.nodeTypes.X3DDragSensorNode.prototype._stopDragging.call(this);if(this._vf.autoOffset) {this._vf.offset=this._currentRotation.angle();this.postMessage('offset_changed',this._vf.offset);}}}));x3dom.versionInfo={version:'1.7.1',revision:'27d2b19b572f365b32d12cd9883e4bf894e60cef',date:'Tue Jan 5 13:25:24 2016 +0100'};mayavi-4.5.0/mayavi/tools/tools.py0000644000076500000240000003052512747716314017573 0ustar prabhustaff00000000000000""" The general purpose tools to manipulate the pipeline with the mlab interface. """ # Author: Prabhu Ramachandran , # Gael Varoquaux # Copyright (c) 2007-2015 Enthought, Inc. # License: BSD Style. # Standard library imports. import numpy # Enthought library imports. from tvtk.api import tvtk # MayaVi related imports. from mayavi.sources.vtk_data_source import VTKDataSource from mayavi.core.module_manager import ModuleManager from mayavi.core.source import Source from mayavi.core.filter import Filter from .engine_manager import get_engine, engine_manager, get_null_engine from .figure import gcf ###################################################################### # Utility functions. def add_dataset(dataset, name='', **kwargs): """Add a dataset object to the Mayavi pipeline. **Parameters** :dataset: a tvtk dataset, or a Mayavi source. The dataset added to the Mayavi pipeline :figure: a figure identifier number or string, None or False, optionnal. If no `figure` keyword argument is given, the data is added to the current figure (a new figure if created if necessary). If a `figure` keyword argument is given, it should either the name the number of the figure the dataset should be added to, or None, in which case the data is not added to the pipeline. If figure is False, a null engine is created. This null engine does not create figures, and is mainly usefull for tensting, or using the VTK algorithms without visualization. **Returns** The corresponding Mayavi source is returned. """ if isinstance(dataset, tvtk.Object): d = VTKDataSource() d.data = dataset elif isinstance(dataset, Source): d = dataset else: raise TypeError( "first argument should be either a TVTK object"\ " or a mayavi source") if len(name) > 0: d.name = name if not 'figure' in kwargs: # No figure has been specified, retrieve the default one. gcf() engine = get_engine() elif kwargs['figure'] is False: # Get a null engine that we can use. engine = get_null_engine() elif kwargs['figure'] is not None: figure = kwargs['figure'] engine = engine_manager.find_figure_engine(figure) engine.current_scene = figure else: # Return early, as we don't want to add the source to an engine. return d engine.add_source(d) return d def add_module_manager(object): """ Add a module-manager, to control colors and legend bars to the given object. """ return get_engine().add_module(ModuleManager(), object) def _traverse(node): """ Generator to traverse a tree accessing the nodes' children attribute. **Example** Here is a simple example printing the names of all the objects in the pipeline:: for obj in mlab.pipeline.traverse(mlab.gcf()): print obj.name """ try: for leaf in node.children: for leaflet in _traverse(leaf): yield leaflet except AttributeError: pass yield node def get_vtk_src(mayavi_object, stop_at_filter=True): """ Goes up the Mayavi pipeline to find the data sources of a given object. **Parameters** :object: any Mayavi visualization object :stop_at_filter: optional boolean flag: if True, the first object exposing data found going up the pipeline is returned. If False, only the source itself is returned. **Returns** :sources: List of vtk data sources (vtk data sources, and not Mayavi source objects). **Notes** This function traverses the Mayavi pipeline. Thus the input object 'mayavi_object' should already be added to the pipeline. """ if isinstance(mayavi_object, tvtk.Object): if mayavi_object.is_a('vtkDataSet'): # We have been passed a tvtk source return [mayavi_object] elif hasattr(mayavi_object, 'output'): return [mayavi_object.output] if not (hasattr(mayavi_object, 'parent') or isinstance(mayavi_object, Source)): raise TypeError('Cannot find data source for given object %s' % ( mayavi_object)) while True: # XXX: If the pipeline is not a DAG, this is an infinite loop if isinstance(mayavi_object, Source): if stop_at_filter or not isinstance(mayavi_object, Filter): get_output = lambda x: x if x.is_a('vtkDataSet') else x.output return [get_output(x) for x in mayavi_object.outputs] mayavi_object = mayavi_object.parent def _has_scalar_data(object): """Tests if an object has scalar data. """ data_sources = get_vtk_src(object) for source in data_sources: if source.point_data.scalars is not None: return True elif source.cell_data.scalars is not None: return True return False def _has_vector_data(object): """Tests if an object has vector data. """ data_sources = get_vtk_src(object) for source in data_sources: if source.point_data.vectors is not None: return True elif source.cell_data.vectors is not None: return True return False def _has_tensor_data(object): """Tests if an object has tensor data. """ data_sources = get_vtk_src(object) for source in data_sources: if source.point_data.tensors is not None: return True elif source.cell_data.tensors is not None: return True return False def _find_module_manager(object=None, data_type=None): """If an object is specified, returns its module_manager, elsewhere finds the first module_manager in the scene. """ if object is None: for object in _traverse(gcf()): if isinstance(object, ModuleManager): if data_type == 'scalar': if not _has_scalar_data(object): continue try: if not object.actor.mapper.scalar_visibility: continue except AttributeError: pass if data_type == 'vector' and not _has_vector_data(object): continue if data_type == 'tensor' and not _has_tensor_data(object): continue return object else: if hasattr(object, 'module_manager'): if ((data_type == 'scalar' and _has_scalar_data(object)) or (data_type == 'vector' and _has_vector_data(object)) or (data_type == 'tensor' and _has_tensor_data(object)) or data_type is None): return object.module_manager else: print("This object has no %s data" % data_type) else: print("This object has no color map") return None def _typical_distance(data_obj): """ Returns a typical distance in a cloud of points. This is done by taking the size of the bounding box, and dividing it by the cubic root of the number of points. """ x_min, x_max, y_min, y_max, z_min, z_max = data_obj.bounds distance = numpy.sqrt(((x_max - x_min) ** 2 + (y_max - y_min) ** 2 + (z_max - z_min) ** 2) / (4 * data_obj.number_of_points ** (0.33))) if distance == 0: return 1 else: return 0.4 * distance def _min_distance(x, y, z): """ Return the minimum interparticle distance in a cloud of points. This is done by brute force calculation of all the distances between particle couples. """ distances = numpy.sqrt((x.reshape((-1,)) - x.reshape((1, -1))) ** 2 + (y.reshape((-1,)) - y.reshape((1, -1))) ** 2 + (z.reshape((-1,)) - z.reshape((1, -1))) ** 2 ) return distances[distances != 0].min() def _min_axis_distance(x, y, z): """ Return the minimum interparticle distance in a cloud of points along one of the axis. This is done by brute force calculation of all the distances with norm infinity between particle couples. """ def axis_min(a): a = numpy.abs(a.reshape((-1,)) - a.reshape((-1, 1))) a = a[a > 0] if a.size == 0: return numpy.inf return a.min() distances = min(axis_min(x), axis_min(y), axis_min(z)) if distances == numpy.inf: return 1 else: return distances def set_extent(module, extents): """ Attempts to set the physical extents of the given module. The extents are given as (xmin, xmax, ymin, ymax, zmin, zmax). This does not work on an image plane widget, as this module does not have an actor. Once you use this function on a module, be aware that other modules applied on the same data source will not share the same scale. Thus for instance an outline module will not respect the outline of the actors whose extent you modified. You should pass in the same "extents" parameter for this to work.You can have a look at the wigner.py example for a heavy use of this functionnality. **Note** This function does not work on some specific modules, such as Outline, Axes, or ImagePlaneWidget. For Outline and Axes, use the extent keyword argument of mlab.pipeline.outline and mlab.pipeline.axes. """ if numpy.all(extents == 0.): # That the default setting. return if not hasattr(module, 'actor'): print('Cannot set extents for %s' % module) return xmin, xmax, ymin, ymax, zmin, zmax = extents xo = 0.5 * (xmax + xmin) yo = 0.5 * (ymax + ymin) zo = 0.5 * (zmax + zmin) extentx = 0.5 * (xmax - xmin) extenty = 0.5 * (ymax - ymin) extentz = 0.5 * (zmax - zmin) # Extract the actor, checking either module.actor.actor # or module.actor as a fallback actor = getattr(module.actor, 'actor', module.actor) # Now the actual bounds. xmin, xmax, ymin, ymax, zmin, zmax = actor.bounds # Scale the object boundsx = 0.5 * (xmax - xmin) boundsy = 0.5 * (ymax - ymin) boundsz = 0.5 * (zmax - zmin) xs, ys, zs = actor.scale if not numpy.allclose(xmin, xmax): scalex = xs * extentx / boundsx else: scalex = 1 if not numpy.allclose(ymin, ymax): scaley = ys * extenty / boundsy else: scaley = 1 if not numpy.allclose(zmin, zmax): scalez = zs * extentz / boundsz else: scalez = 1 actor.scale = (scalex, scaley, scalez) ## Remeasure the bounds xmin, xmax, ymin, ymax, zmin, zmax = actor.bounds xcenter = 0.5 * (xmax + xmin) ycenter = 0.5 * (ymax + ymin) zcenter = 0.5 * (zmax + zmin) # Center the object actor.origin = (0., 0., 0.) xpos, ypos, zpos = actor.position actor.position = (xpos + xo - xcenter, ypos + yo - ycenter, zpos + zo - zcenter) def start_recording(ui=True): """Start automatic script recording. If the `ui` parameter is `True`, it creates a recorder with a user interface, if not it creates a vanilla recorder without a UI. **Returns** The `Recorder` instance created. """ from apptools.scripting.api import start_recording as start e = get_engine() msg = "Current engine, %s, is already being recorded." % (e) assert e.recorder is None, msg r = start(e, ui=ui) return r def stop_recording(file=None): """Stop the automatic script recording. **Parameters** :file: An open file or a filename or `None`. If this is `None`, nothing is saved. """ from apptools.scripting.api import stop_recording as stop e = get_engine() r = e.recorder if r is not None: stop(e, save=False) if type(file) is str: f = open(file, 'w') r.save(f) f.close() elif hasattr(file, 'write') and hasattr(file, 'flush'): r.save(file) mayavi-4.5.0/mayavi/version.py0000644000076500000240000000047212747716314016756 0ustar prabhustaff00000000000000# Wrapped in a try/except in those situations where someone hasn't installed # as an egg. What do we do then? For now, we just punt since we don't want # to define the version number in two places. try: import pkg_resources version = pkg_resources.require('Mayavi')[0].version except: version = '' mayavi-4.5.0/mayavi.egg-info/0000755000076500000240000000000012747722127016405 5ustar prabhustaff00000000000000mayavi-4.5.0/mayavi.egg-info/dependency_links.txt0000644000076500000240000000000112747722126022452 0ustar prabhustaff00000000000000 mayavi-4.5.0/mayavi.egg-info/entry_points.txt0000644000076500000240000000063112747722126021702 0ustar prabhustaff00000000000000[envisage.plugins] mayavi = mayavi.plugins.mayavi_plugin:MayaviPlugin mayavi_ui = mayavi.plugins.mayavi_ui_plugin:MayaviUIPlugin tvtk.browser = tvtk.plugins.browser.browser_plugin:BrowserPlugin tvtk.scene = tvtk.plugins.scene.scene_plugin:ScenePlugin tvtk.scene_ui = tvtk.plugins.scene.ui.scene_ui_plugin:SceneUIPlugin [gui_scripts] mayavi2 = mayavi.scripts.mayavi2:main tvtk_doc = tvtk.tools.tvtk_doc:main mayavi-4.5.0/mayavi.egg-info/not-zip-safe0000644000076500000240000000000112665575301020632 0ustar prabhustaff00000000000000 mayavi-4.5.0/mayavi.egg-info/PKG-INFO0000644000076500000240000000673012747722126017507 0ustar prabhustaff00000000000000Metadata-Version: 1.1 Name: mayavi Version: 4.5.0 Summary: The Mayavi scientific data 3-dimensional visualizer. Home-page: http://docs.enthought.com/mayavi/mayavi/ Author: ETS Developers Author-email: enthought-dev@enthought.com License: BSD Download-URL: https://www.github.com/enthought/mayavi Description: The Mayavi *project* includes two related *packages* for 3-dimensional visualization: - **Mayavi2**: A tool for easy and interactive visualization of data. - **TVTK**: A Traits-based wrapper for the Visualization Toolkit, a popular open-source visualization library. These libraries operate at different levels of abstraction. TVTK manipulates visualization objects, while Mayavi2 lets you operate on your data, and then see the results. Most users either use the Mayavi user interface or program to its scripting interface; you probably don't need to interact with TVTK unless you want to create a new Mayavi module. Mayavi2 ------- Mayavi2 seeks to provide easy and interactive visualization of 3-D data. It offers: - An (optional) rich user interface with dialogs to interact with all data and objects in the visualization. - A simple and clean scripting interface in Python, including one-liners, or an object-oriented programming interface. - The power of the VTK toolkit, harnessed through these interfaces, without forcing you to learn it. Additionally Mayavi2 is a reusable tool that can be embedded in your applications in different ways or combined with the Envisage application-building framework to assemble domain-specific tools. TVTK ---- TVTK wraps VTK objects to provide a convenient, Pythonic API, while supporting Traits attributes and NumPy/SciPy arrays. TVTK is implemented mostly in pure Python, except for a small extension module. Developers typically use TVTK to write Mayavi modules, and then use Mayavi to interact with visualizations or create applications. Prerequisites ------------- You must have the following libraries installed before installing the Mayavi project: * `Numpy `_ version 1.1.1 or later * `VTK `_ version 5.0 or later * One of the following GUI toolkit packages: - `Qt `_ version 4.8 with either PyQt 4.11.4 or PySide 1.2.2 - `wxPython `_ version 2.8 or later * `configobj `_ Platform: Windows Platform: Linux Platform: Mac OS-X Platform: Unix Platform: Solaris Classifier: Development Status :: 5 - Production/Stable Classifier: Intended Audience :: Developers Classifier: Intended Audience :: Science/Research Classifier: License :: OSI Approved :: BSD License Classifier: Operating System :: MacOS Classifier: Operating System :: Microsoft :: Windows Classifier: Operating System :: OS Independent Classifier: Operating System :: POSIX Classifier: Operating System :: Unix Classifier: Programming Language :: C Classifier: Programming Language :: Python Classifier: Topic :: Scientific/Engineering Classifier: Topic :: Software Development Classifier: Topic :: Software Development :: Libraries mayavi-4.5.0/mayavi.egg-info/requires.txt0000644000076500000240000000005112747722126021000 0ustar prabhustaff00000000000000apptools traits traitsui [app] envisage mayavi-4.5.0/mayavi.egg-info/SOURCES.txt0000644000076500000240000011176312747722127020302 0ustar prabhustaff00000000000000DEVELOPING.rst LICENSE.txt LICENSE_COLORBREWER.txt LICENSE_YORICK.txt MANIFEST.in README-tvtk.txt README.rst image_LICENSE.txt image_LICENSE_CP.txt image_LICENSE_Eclipse.txt image_LICENSE_Nuvola.txt image_LICENSE_OOo.txt mlab_reference.py setup.py artwork/mayavi-banner.jpg artwork/dataset_diagram/dataset_diagram.svg artwork/dataset_diagram/structured_points.jpg artwork/dataset_diagram/structured_points_connected.jpg artwork/dataset_diagram/unstructured_points.jpg artwork/dataset_diagram/unstructured_points_cell_data.jpg artwork/dataset_diagram/unstructured_points_connected.jpg artwork/dataset_diagram/unstructured_points_scalar_data.jpg artwork/dataset_diagram/unstructured_points_scalar_data_labels.jpg artwork/dataset_diagram/unstructured_points_vector_data.jpg docs/API.txt docs/CHANGES.txt docs/DEVELOPMENT.txt docs/Makefile docs/MakefileMayavi docs/MakefileTVTK docs/THANKS.txt docs/TODO.txt docs/mayavi2.man docs/source/render_examples.py docs/source/render_images.py docs/source/mayavi/advanced_scripting.rst docs/source/mayavi/advanced_use.rst docs/source/mayavi/application.rst docs/source/mayavi/bugs.rst docs/source/mayavi/building_applications.rst docs/source/mayavi/changes.rst docs/source/mayavi/citation.bib docs/source/mayavi/clamping_off.jpg docs/source/mayavi/clamping_on.jpg docs/source/mayavi/conf.py docs/source/mayavi/data.rst docs/source/mayavi/example_exploring_a_vector_field.rst docs/source/mayavi/example_fire.rst docs/source/mayavi/example_gradient.jpg docs/source/mayavi/example_heart.rst docs/source/mayavi/example_parametric_surface.rst docs/source/mayavi/example_potential.jpg docs/source/mayavi/example_potential_ipython.jpg docs/source/mayavi/example_streamline.jpg docs/source/mayavi/example_trajectories.jpg docs/source/mayavi/example_using_with_scipy.rst docs/source/mayavi/example_vector_cut_plane.jpg docs/source/mayavi/examples.rst docs/source/mayavi/filters.rst docs/source/mayavi/image_data.jpg docs/source/mayavi/index.rst docs/source/mayavi/inline-css.rst docs/source/mayavi/installation.rst docs/source/mayavi/m2_about.jpg docs/source/mayavi/mayavi-logo.png docs/source/mayavi/mayavi_objects.rst docs/source/mayavi/misc.rst docs/source/mayavi/mlab.rst docs/source/mayavi/mlab_3d_plotting_functions.rst docs/source/mayavi/mlab_animating.rst docs/source/mayavi/mlab_case_studies.rst docs/source/mayavi/mlab_changing_object_looks.rst docs/source/mayavi/mlab_demo.rst docs/source/mayavi/mlab_figures_decorations.rst docs/source/mayavi/mlab_pipeline.rst docs/source/mayavi/mlab_pipeline_modules.rst docs/source/mayavi/mlab_pipeline_reference.rst docs/source/mayavi/mlab_running_scripts.rst docs/source/mayavi/modules.rst docs/source/mayavi/overview.rst docs/source/mayavi/pipeline.rst docs/source/mayavi/poly_data.jpg docs/source/mayavi/rectilinear_grid.jpg docs/source/mayavi/structured_grid.jpg docs/source/mayavi/tips.rst docs/source/mayavi/unstructured_grid.jpg docs/source/mayavi/vector_field_combination.jpg docs/source/mayavi/vector_field_cut_plane.jpg docs/source/mayavi/vector_field_flow.jpg docs/source/mayavi/vector_field_isosurface.jpg docs/source/mayavi/vector_field_quiver.jpg docs/source/mayavi/vector_field_vectors.jpg docs/source/mayavi/volumetric_combination.jpg docs/source/mayavi/volumetric_contour3d.jpg docs/source/mayavi/volumetric_cut_plane.jpg docs/source/mayavi/volumetric_volume.jpg docs/source/mayavi/volumetric_volume_tweaked.jpg docs/source/mayavi/_static/mayavi-logo.png docs/source/mayavi/_templates/layout.html docs/source/mayavi/api/core_view_objects.rst docs/source/mayavi/api/index.rst docs/source/mayavi/api/pipeline_objects.rst docs/source/mayavi/auto/adjust_cropping_extents.py docs/source/mayavi/auto/atomic_orbital.py docs/source/mayavi/auto/boy.py docs/source/mayavi/auto/bunny.py docs/source/mayavi/auto/canyon.py docs/source/mayavi/auto/canyon_decimation.py docs/source/mayavi/auto/changes.rst docs/source/mayavi/auto/chemistry.py docs/source/mayavi/auto/coil_design_application.py docs/source/mayavi/auto/compute_in_thread.py docs/source/mayavi/auto/contour.py docs/source/mayavi/auto/contour_contour.py docs/source/mayavi/auto/custom_colormap.py docs/source/mayavi/auto/datasets.py docs/source/mayavi/auto/delaunay_graph.py docs/source/mayavi/auto/dragon.py docs/source/mayavi/auto/example_adjust_cropping_extents.rst docs/source/mayavi/auto/example_atomic_orbital.rst docs/source/mayavi/auto/example_boy.rst docs/source/mayavi/auto/example_bunny.rst docs/source/mayavi/auto/example_canyon.rst docs/source/mayavi/auto/example_canyon_decimation.rst docs/source/mayavi/auto/example_chemistry.rst docs/source/mayavi/auto/example_coil_design_application.rst docs/source/mayavi/auto/example_compute_in_thread.rst docs/source/mayavi/auto/example_contour.rst docs/source/mayavi/auto/example_contour_contour.rst docs/source/mayavi/auto/example_custom_colormap.rst docs/source/mayavi/auto/example_datasets.rst docs/source/mayavi/auto/example_delaunay_graph.rst docs/source/mayavi/auto/example_dragon.rst docs/source/mayavi/auto/example_flight_graph.rst docs/source/mayavi/auto/example_glyph.rst docs/source/mayavi/auto/example_image_cursor_filter.rst docs/source/mayavi/auto/example_julia_set.rst docs/source/mayavi/auto/example_julia_set_decimation.rst docs/source/mayavi/auto/example_lorenz.rst docs/source/mayavi/auto/example_lorenz_ui.rst docs/source/mayavi/auto/example_lucy.rst docs/source/mayavi/auto/example_magnetic_field.rst docs/source/mayavi/auto/example_magnetic_field_lines.rst docs/source/mayavi/auto/example_mayavi_traits_ui.rst docs/source/mayavi/auto/example_mlab_3D_to_2D.rst docs/source/mayavi/auto/example_mlab_interactive_dialog.rst docs/source/mayavi/auto/example_mlab_traits_ui.rst docs/source/mayavi/auto/example_mlab_visual.rst docs/source/mayavi/auto/example_mri.rst docs/source/mayavi/auto/example_multiple_engines.rst docs/source/mayavi/auto/example_multiple_mlab_scene_models.rst docs/source/mayavi/auto/example_nongui.rst docs/source/mayavi/auto/example_numeric_source.rst docs/source/mayavi/auto/example_offscreen.rst docs/source/mayavi/auto/example_pick_on_surface.rst docs/source/mayavi/auto/example_plotting_many_lines.rst docs/source/mayavi/auto/example_poll_file.rst docs/source/mayavi/auto/example_polydata.rst docs/source/mayavi/auto/example_probe_filter.rst docs/source/mayavi/auto/example_protein.rst docs/source/mayavi/auto/example_qt_embedding.rst docs/source/mayavi/auto/example_scatter_plot.rst docs/source/mayavi/auto/example_select_red_balls.rst docs/source/mayavi/auto/example_simple_structured_grid.rst docs/source/mayavi/auto/example_spherical_harmonics.rst docs/source/mayavi/auto/example_standalone.rst docs/source/mayavi/auto/example_streamline.rst docs/source/mayavi/auto/example_structured_grid.rst docs/source/mayavi/auto/example_structured_points2d.rst docs/source/mayavi/auto/example_structured_points3d.rst docs/source/mayavi/auto/example_subclassing_mayavi_application.rst docs/source/mayavi/auto/example_superquad_with_gui.rst docs/source/mayavi/auto/example_surf_regular_mlab.rst docs/source/mayavi/auto/example_surface_from_irregular_data.rst docs/source/mayavi/auto/example_tvtk_in_mayavi.rst docs/source/mayavi/auto/example_tvtk_segmentation.rst docs/source/mayavi/auto/example_unstructured_grid.rst docs/source/mayavi/auto/example_user_mayavi.rst docs/source/mayavi/auto/example_volume_slicer.rst docs/source/mayavi/auto/example_volume_slicer_advanced.rst docs/source/mayavi/auto/example_wigner.rst docs/source/mayavi/auto/example_wx_embedding.rst docs/source/mayavi/auto/example_wx_mayavi_embed_in_notebook.rst docs/source/mayavi/auto/example_zzz_reader.rst docs/source/mayavi/auto/examples.rst docs/source/mayavi/auto/flight_graph.py docs/source/mayavi/auto/glyph.py docs/source/mayavi/auto/image_cursor_filter.py docs/source/mayavi/auto/julia_set.py docs/source/mayavi/auto/julia_set_decimation.py docs/source/mayavi/auto/lorenz.py docs/source/mayavi/auto/lorenz_ui.py docs/source/mayavi/auto/lucy.py docs/source/mayavi/auto/magnetic_field.py docs/source/mayavi/auto/magnetic_field_lines.py docs/source/mayavi/auto/mayavi_traits_ui.py docs/source/mayavi/auto/mlab_3D_to_2D.py docs/source/mayavi/auto/mlab_camera.rst docs/source/mayavi/auto/mlab_decorations.rst docs/source/mayavi/auto/mlab_figure.rst docs/source/mayavi/auto/mlab_helper_functions.rst docs/source/mayavi/auto/mlab_interactive_dialog.py docs/source/mayavi/auto/mlab_other_functions.rst docs/source/mayavi/auto/mlab_pipeline_data.rst docs/source/mayavi/auto/mlab_pipeline_other_functions.rst docs/source/mayavi/auto/mlab_pipeline_reference.rst docs/source/mayavi/auto/mlab_pipeline_sources.rst docs/source/mayavi/auto/mlab_pipeline_tools.rst docs/source/mayavi/auto/mlab_reference.rst docs/source/mayavi/auto/mlab_traits_ui.py docs/source/mayavi/auto/mlab_visual.py docs/source/mayavi/auto/mri.py docs/source/mayavi/auto/multiple_engines.py docs/source/mayavi/auto/multiple_mlab_scene_models.py docs/source/mayavi/auto/nongui.py docs/source/mayavi/auto/numeric_source.py docs/source/mayavi/auto/offscreen.py docs/source/mayavi/auto/pick_on_surface.py docs/source/mayavi/auto/plotting_many_lines.py docs/source/mayavi/auto/poll_file.py docs/source/mayavi/auto/polydata.py docs/source/mayavi/auto/probe_filter.py docs/source/mayavi/auto/protein.py docs/source/mayavi/auto/qt_embedding.py docs/source/mayavi/auto/scatter_plot.py docs/source/mayavi/auto/select_red_balls.py docs/source/mayavi/auto/simple_structured_grid.py docs/source/mayavi/auto/spherical_harmonics.py docs/source/mayavi/auto/standalone.py docs/source/mayavi/auto/streamline.py docs/source/mayavi/auto/structured_grid.py docs/source/mayavi/auto/structured_points2d.py docs/source/mayavi/auto/structured_points3d.py docs/source/mayavi/auto/subclassing_mayavi_application.py docs/source/mayavi/auto/superquad_with_gui.py docs/source/mayavi/auto/surf_regular_mlab.py docs/source/mayavi/auto/surface_from_irregular_data.py docs/source/mayavi/auto/tvtk_in_mayavi.py docs/source/mayavi/auto/tvtk_segmentation.py docs/source/mayavi/auto/unstructured_grid.py docs/source/mayavi/auto/user_mayavi.py docs/source/mayavi/auto/volume_slicer.py docs/source/mayavi/auto/volume_slicer_advanced.py docs/source/mayavi/auto/wigner.py docs/source/mayavi/auto/wx_embedding.py docs/source/mayavi/auto/wx_mayavi_embed_in_notebook.py docs/source/mayavi/auto/zzz_reader.py docs/source/mayavi/generated_images/enthought_mayavi_mlab_barchart.jpg docs/source/mayavi/generated_images/enthought_mayavi_mlab_contour3d.jpg docs/source/mayavi/generated_images/enthought_mayavi_mlab_contour_surf.jpg docs/source/mayavi/generated_images/enthought_mayavi_mlab_fancy_mesh.jpg docs/source/mayavi/generated_images/enthought_mayavi_mlab_flow.jpg docs/source/mayavi/generated_images/enthought_mayavi_mlab_imshow.jpg docs/source/mayavi/generated_images/enthought_mayavi_mlab_mesh.jpg docs/source/mayavi/generated_images/enthought_mayavi_mlab_mesh_sphere.jpg docs/source/mayavi/generated_images/enthought_mayavi_mlab_molecule.jpg docs/source/mayavi/generated_images/enthought_mayavi_mlab_plot3d.jpg docs/source/mayavi/generated_images/enthought_mayavi_mlab_points3d.jpg docs/source/mayavi/generated_images/enthought_mayavi_mlab_quiver3d.jpg docs/source/mayavi/generated_images/enthought_mayavi_mlab_quiver3d_2d_data.jpg docs/source/mayavi/generated_images/enthought_mayavi_mlab_simple_surf.jpg docs/source/mayavi/generated_images/enthought_mayavi_mlab_surf.jpg docs/source/mayavi/generated_images/enthought_mayavi_mlab_triangular_mesh.jpg docs/source/mayavi/generated_images/example_atomic_orbital.jpg docs/source/mayavi/generated_images/example_boy.jpg docs/source/mayavi/generated_images/example_canyon.jpg docs/source/mayavi/generated_images/example_canyon_decimation.jpg docs/source/mayavi/generated_images/example_chemistry.jpg docs/source/mayavi/generated_images/example_custom_colormap.jpg docs/source/mayavi/generated_images/example_flight_graph.jpg docs/source/mayavi/generated_images/example_julia_set.jpg docs/source/mayavi/generated_images/example_julia_set_decimation.jpg docs/source/mayavi/generated_images/example_lorenz.jpg docs/source/mayavi/generated_images/example_magnetic_field_lines.jpg docs/source/mayavi/generated_images/example_mri.jpg docs/source/mayavi/generated_images/example_plotting_many_lines.jpg docs/source/mayavi/generated_images/example_protein.jpg docs/source/mayavi/generated_images/example_simple_structured_grid.jpg docs/source/mayavi/generated_images/example_spherical_harmonics.jpg docs/source/mayavi/generated_images/example_surface_from_irregular_data.jpg docs/source/mayavi/generated_images/example_tvtk_in_mayavi.jpg docs/source/mayavi/generated_images/example_wigner.jpg docs/source/mayavi/images/core-class.xmi docs/source/mayavi/images/dataset_diagram.jpg docs/source/mayavi/images/design2a.jpg docs/source/mayavi/images/design2b.png docs/source/mayavi/images/design2c.jpg docs/source/mayavi/images/example_mlab_interactive_dialog.jpg docs/source/mayavi/images/example_mlab_visual.jpg docs/source/mayavi/images/heart.jpg docs/source/mayavi/images/m2_big_picture.png docs/source/mayavi/images/mayavi2-48x48.png docs/source/mayavi/images/mayavi_ui_first.jpg docs/source/mayavi/images/mayavi_ui_second.jpg docs/source/mayavi/images/mlab_surf_example.jpg docs/source/mayavi/images/param.jpg docs/source/mayavi/images/pipeline_and_scene.jpg docs/source/mayavi/images/pipeline_and_scene2.jpg docs/source/mayavi/images/streamline.jpg docs/source/mayavi/sphinxext/LICENSE.txt docs/source/mayavi/sphinxext/linkcode.py docs/source/mayavi/sphinxext/phantom_import.py docs/source/mayavi/sphinxext/plot_directive.py docs/source/mayavi/sphinxext/sphinxext/__init__.py docs/source/mayavi/sphinxext/sphinxext/__init__.pyc docs/source/mayavi/sphinxext/sphinxext/comment_eater.py docs/source/mayavi/sphinxext/sphinxext/comment_eater.pyc docs/source/mayavi/sphinxext/sphinxext/compiler_unparse.py docs/source/mayavi/sphinxext/sphinxext/compiler_unparse.pyc docs/source/mayavi/sphinxext/sphinxext/docscrape.py docs/source/mayavi/sphinxext/sphinxext/docscrape.pyc docs/source/mayavi/sphinxext/sphinxext/docscrape_sphinx.py docs/source/mayavi/sphinxext/sphinxext/docscrape_sphinx.pyc docs/source/mayavi/sphinxext/sphinxext/numpydoc.py docs/source/mayavi/sphinxext/sphinxext/numpydoc.pyc docs/source/mayavi/sphinxext/sphinxext/traitsdoc.py docs/source/mayavi/sphinxext/sphinxext/traitsdoc.pyc docs/source/tvtk/README.txt docs/source/tvtk/conf.py docs/source/tvtk/devel.txt docs/source/tvtk/index.txt examples/mayavi/README.txt examples/mayavi/mayavi_jupyter.ipynb examples/mayavi/nongui.py examples/mayavi/standalone.py examples/mayavi/user_mayavi.py examples/mayavi/zzz_reader.py examples/mayavi/advanced_visualization/contour.py examples/mayavi/advanced_visualization/contour_contour.py examples/mayavi/advanced_visualization/datasets.py examples/mayavi/advanced_visualization/delaunay_graph.py examples/mayavi/advanced_visualization/glyph.py examples/mayavi/advanced_visualization/image_cursor_filter.py examples/mayavi/advanced_visualization/magnetic_field.py examples/mayavi/advanced_visualization/mlab_3D_to_2D.py examples/mayavi/advanced_visualization/numeric_source.py examples/mayavi/advanced_visualization/offscreen.py examples/mayavi/advanced_visualization/polydata.py examples/mayavi/advanced_visualization/probe_filter.py examples/mayavi/advanced_visualization/scatter_plot.py examples/mayavi/advanced_visualization/streamline.py examples/mayavi/advanced_visualization/structured_grid.py examples/mayavi/advanced_visualization/structured_points2d.py examples/mayavi/advanced_visualization/structured_points3d.py examples/mayavi/advanced_visualization/surf_regular_mlab.py examples/mayavi/advanced_visualization/tvtk_segmentation.py examples/mayavi/advanced_visualization/unstructured_grid.py examples/mayavi/data/fire_ug.vtu examples/mayavi/data/gen_tinyplot3d.f examples/mayavi/data/heart.vti examples/mayavi/data/heart.vtk examples/mayavi/data/room_vis.wrl examples/mayavi/data/tiny.q examples/mayavi/data/tiny.xyz examples/mayavi/data_interaction/pick_on_surface.py examples/mayavi/data_interaction/select_red_balls.py examples/mayavi/explorer/explorer3d.py examples/mayavi/explorer/explorer_app.py examples/mayavi/interactive/adjust_cropping_extents.py examples/mayavi/interactive/coil_design_application.py examples/mayavi/interactive/compute_in_thread.py examples/mayavi/interactive/lorenz_ui.py examples/mayavi/interactive/mayavi_traits_ui.py examples/mayavi/interactive/mlab_interactive_dialog.py examples/mayavi/interactive/mlab_traits_ui.py examples/mayavi/interactive/mlab_visual.py examples/mayavi/interactive/multiple_engines.py examples/mayavi/interactive/multiple_mlab_scene_models.py examples/mayavi/interactive/poll_file.py examples/mayavi/interactive/qt_embedding.py examples/mayavi/interactive/subclassing_mayavi_application.py examples/mayavi/interactive/superquad_with_gui.py examples/mayavi/interactive/volume_slicer.py examples/mayavi/interactive/volume_slicer_advanced.py examples/mayavi/interactive/wx_embedding.py examples/mayavi/interactive/wx_mayavi_embed_in_notebook.py examples/mayavi/mlab/atomic_orbital.py examples/mayavi/mlab/boy.py examples/mayavi/mlab/bunny.py examples/mayavi/mlab/canyon.py examples/mayavi/mlab/canyon_decimation.py examples/mayavi/mlab/chemistry.py examples/mayavi/mlab/custom_colormap.py examples/mayavi/mlab/dragon.py examples/mayavi/mlab/flight_graph.py examples/mayavi/mlab/julia_set.py examples/mayavi/mlab/julia_set_decimation.py examples/mayavi/mlab/lorenz.py examples/mayavi/mlab/lucy.py examples/mayavi/mlab/magnetic_field_lines.py examples/mayavi/mlab/mri.py examples/mayavi/mlab/plotting_many_lines.py examples/mayavi/mlab/protein.py examples/mayavi/mlab/simple_structured_grid.py examples/mayavi/mlab/spherical_harmonics.py examples/mayavi/mlab/surface_from_irregular_data.py examples/mayavi/mlab/tvtk_in_mayavi.py examples/mayavi/mlab/wigner.py examples/tvtk/actor_editor.py examples/tvtk/animated_texture.py examples/tvtk/array_animation.py examples/tvtk/dscene.py examples/tvtk/ivtk_example.py examples/tvtk/off_screen.py examples/tvtk/scene.py examples/tvtk/scene_editor.py examples/tvtk/simple.py examples/tvtk/texture_glyph.py examples/tvtk/tiny_mesh.py examples/tvtk/images/image_LICENSE.txt examples/tvtk/images/masonry.jpg examples/tvtk/plugins/test.py examples/tvtk/visual/bounce.py examples/tvtk/visual/doublependulum.py examples/tvtk/visual/gyro.py examples/tvtk/visual/gyro2.py examples/tvtk/visual/lorenz.py examples/tvtk/visual/orbit.py examples/tvtk/visual/randombox.py examples/tvtk/visual/wave.py integrationtests/mayavi/README.txt integrationtests/mayavi/common.py integrationtests/mayavi/run.py integrationtests/mayavi/test_array_source.py integrationtests/mayavi/test_close_scene.py integrationtests/mayavi/test_contour.py integrationtests/mayavi/test_generic_module.py integrationtests/mayavi/test_glyph.py integrationtests/mayavi/test_grid_plane.py integrationtests/mayavi/test_hide_show.py integrationtests/mayavi/test_image_data_probe.py integrationtests/mayavi/test_image_plane_widget.py integrationtests/mayavi/test_ipw_multiple_scalars.py integrationtests/mayavi/test_labels.py integrationtests/mayavi/test_mlab.py integrationtests/mayavi/test_mlab_envisage.py integrationtests/mayavi/test_mlab_savefig.py integrationtests/mayavi/test_mlab_show.py integrationtests/mayavi/test_optional_collection.py integrationtests/mayavi/test_plot3d_mb_reader.py integrationtests/mayavi/test_restore_scene.py integrationtests/mayavi/test_set_active_attribute.py integrationtests/mayavi/test_streamline.py integrationtests/mayavi/test_text3d.py integrationtests/mayavi/test_texture.py integrationtests/mayavi/test_tools_camera.py integrationtests/mayavi/test_user_defined.py integrationtests/mayavi/test_vtk_data_source.py integrationtests/mayavi/test_vtk_xml_reader.py integrationtests/mayavi/images/test_streamline.png integrationtests/mayavi/images/test_streamline_1.png integrationtests/mayavi/images/test_streamline_2.png integrationtests/mayavi/images/test_streamline_3.png integrationtests/mayavi/images/test_streamline_4.png integrationtests/mayavi/images/test_streamline_5.png integrationtests/mayavi/images/test_streamline_6.png mayavi/__init__.py mayavi/__version__.py mayavi/api.py mayavi/mlab.py mayavi/version.py mayavi.egg-info/PKG-INFO mayavi.egg-info/SOURCES.txt mayavi.egg-info/dependency_links.txt mayavi.egg-info/entry_points.txt mayavi.egg-info/not-zip-safe mayavi.egg-info/requires.txt mayavi.egg-info/top_level.txt mayavi/action/__init__.py mayavi/action/filters.py mayavi/action/help.py mayavi/action/modules.py mayavi/action/save_load.py mayavi/action/sources.py mayavi/components/__init__.py mayavi/components/actor.py mayavi/components/actor2d.py mayavi/components/common.py mayavi/components/contour.py mayavi/components/custom_grid_plane.py mayavi/components/cutter.py mayavi/components/glyph.py mayavi/components/glyph_source.py mayavi/components/grid_plane.py mayavi/components/implicit_plane.py mayavi/components/implicit_widgets.py mayavi/components/optional.py mayavi/components/poly_data_normals.py mayavi/components/source_widget.py mayavi/components/ui/__init__.py mayavi/components/ui/actor.py mayavi/components/ui/contour.py mayavi/core/__init__.py mayavi/core/adder_node.py mayavi/core/api.py mayavi/core/base.py mayavi/core/common.py mayavi/core/component.py mayavi/core/customize.py mayavi/core/dataset_manager.py mayavi/core/engine.py mayavi/core/file_data_source.py mayavi/core/filter.py mayavi/core/lut_manager.py mayavi/core/metadata.py mayavi/core/module.py mayavi/core/module_manager.py mayavi/core/mouse_pick_dispatcher.py mayavi/core/null_engine.py mayavi/core/off_screen_engine.py mayavi/core/pipeline_base.py mayavi/core/pipeline_info.py mayavi/core/registry.py mayavi/core/scene.py mayavi/core/source.py mayavi/core/trait_defs.py mayavi/core/traits_menu.py mayavi/core/images/add.ico mayavi/core/images/add_module.png mayavi/core/images/add_scene.png mayavi/core/images/add_source.png mayavi/core/images/file.png mayavi/core/images/filter.ico mayavi/core/images/image_LICENSE.txt mayavi/core/images/module.ico mayavi/core/images/modulemanager.ico mayavi/core/images/scene.ico mayavi/core/images/source.ico mayavi/core/lut/README.txt mayavi/core/lut/__init__.py mayavi/core/lut/accent.gif mayavi/core/lut/afmhot.gif mayavi/core/lut/autumn.gif mayavi/core/lut/binary.gif mayavi/core/lut/black-white.gif mayavi/core/lut/blue-red.gif mayavi/core/lut/blues.gif mayavi/core/lut/bone.gif mayavi/core/lut/brbg.gif mayavi/core/lut/brg.gif mayavi/core/lut/bugn.gif mayavi/core/lut/bupu.gif mayavi/core/lut/bwr.gif mayavi/core/lut/cmrmap.gif mayavi/core/lut/cool.gif mayavi/core/lut/coolwarm.gif mayavi/core/lut/copper.gif mayavi/core/lut/cubehelix.gif mayavi/core/lut/dark2.gif mayavi/core/lut/file.gif mayavi/core/lut/flag.gif mayavi/core/lut/gist_earth.gif mayavi/core/lut/gist_gray.gif mayavi/core/lut/gist_heat.gif mayavi/core/lut/gist_ncar.gif mayavi/core/lut/gist_rainbow.gif mayavi/core/lut/gist_stern.gif mayavi/core/lut/gist_yarg.gif mayavi/core/lut/gnbu.gif mayavi/core/lut/gnuplot.gif mayavi/core/lut/gnuplot2.gif mayavi/core/lut/gray.gif mayavi/core/lut/greens.gif mayavi/core/lut/greys.gif mayavi/core/lut/hot.gif mayavi/core/lut/hsv.gif mayavi/core/lut/inferno.gif mayavi/core/lut/jet.gif mayavi/core/lut/magma.gif mayavi/core/lut/nipy_spectral.gif mayavi/core/lut/ocean.gif mayavi/core/lut/oranges.gif mayavi/core/lut/orrd.gif mayavi/core/lut/paired.gif mayavi/core/lut/pastel1.gif mayavi/core/lut/pastel2.gif mayavi/core/lut/pink.gif mayavi/core/lut/piyg.gif mayavi/core/lut/plasma.gif mayavi/core/lut/prgn.gif mayavi/core/lut/prism.gif mayavi/core/lut/pubu.gif mayavi/core/lut/pubugn.gif mayavi/core/lut/puor.gif mayavi/core/lut/purd.gif mayavi/core/lut/purples.gif mayavi/core/lut/pylab_luts.pkl mayavi/core/lut/rainbow.gif mayavi/core/lut/rdbu.gif mayavi/core/lut/rdgy.gif mayavi/core/lut/rdpu.gif mayavi/core/lut/rdylbu.gif mayavi/core/lut/rdylgn.gif mayavi/core/lut/reds.gif mayavi/core/lut/seismic.gif mayavi/core/lut/set1.gif mayavi/core/lut/set2.gif mayavi/core/lut/set3.gif mayavi/core/lut/spectral.gif mayavi/core/lut/spring.gif mayavi/core/lut/summer.gif mayavi/core/lut/terrain.gif mayavi/core/lut/vega10.gif mayavi/core/lut/vega20.gif mayavi/core/lut/vega20b.gif mayavi/core/lut/vega20c.gif mayavi/core/lut/viridis.gif mayavi/core/lut/winter.gif mayavi/core/lut/wistia.gif mayavi/core/lut/ylgn.gif mayavi/core/lut/ylgnbu.gif mayavi/core/lut/ylorbr.gif mayavi/core/lut/ylorrd.gif mayavi/core/ui/__init__.py mayavi/core/ui/api.py mayavi/core/ui/engine_rich_view.py mayavi/core/ui/engine_view.py mayavi/core/ui/lut_manager.py mayavi/core/ui/mayavi_scene.py mayavi/core/ui/module_manager.py mayavi/core/ui/images/add.ico mayavi/core/ui/images/add_filter.png mayavi/core/ui/images/add_module.png mayavi/core/ui/images/add_scene.png mayavi/core/ui/images/add_source.png mayavi/core/ui/images/help-action.png mayavi/core/ui/images/image_LICENSE.txt mayavi/core/ui/images/m2.png mayavi/core/ui/images/mv2.ico mayavi/core/ui/images/preferences.png mayavi/core/ui/images/reader.png mayavi/core/ui/images/record.png mayavi/filters/__init__.py mayavi/filters/api.py mayavi/filters/cell_derivatives.py mayavi/filters/cell_to_point_data.py mayavi/filters/collection.py mayavi/filters/contour.py mayavi/filters/cut_plane.py mayavi/filters/data_set_clipper.py mayavi/filters/decimatepro.py mayavi/filters/delaunay2d.py mayavi/filters/delaunay3d.py mayavi/filters/elevation_filter.py mayavi/filters/extract_edges.py mayavi/filters/extract_grid.py mayavi/filters/extract_tensor_components.py mayavi/filters/extract_unstructured_grid.py mayavi/filters/extract_vector_components.py mayavi/filters/extract_vector_norm.py mayavi/filters/filter_base.py mayavi/filters/gaussian_splatter.py mayavi/filters/greedy_terrain_decimation.py mayavi/filters/image_change_information.py mayavi/filters/image_data_probe.py mayavi/filters/mask_points.py mayavi/filters/metadata.py mayavi/filters/optional.py mayavi/filters/point_to_cell_data.py mayavi/filters/poly_data_filter_base.py mayavi/filters/poly_data_normals.py mayavi/filters/quadric_decimation.py mayavi/filters/select_output.py mayavi/filters/set_active_attribute.py mayavi/filters/stripper.py mayavi/filters/threshold.py mayavi/filters/transform_data.py mayavi/filters/triangle_filter.py mayavi/filters/tube.py mayavi/filters/user_defined.py mayavi/filters/vorticity.py mayavi/filters/warp_scalar.py mayavi/filters/warp_vector.py mayavi/filters/wrapper.py mayavi/images/image_LICENSE.txt mayavi/images/m2.ico mayavi/images/m2_about.jpg mayavi/modules/__init__.py mayavi/modules/api.py mayavi/modules/axes.py mayavi/modules/contour_grid_plane.py mayavi/modules/custom_grid_plane.py mayavi/modules/generic_module.py mayavi/modules/glyph.py mayavi/modules/grid_plane.py mayavi/modules/hyper_streamline.py mayavi/modules/image_actor.py mayavi/modules/image_plane_widget.py mayavi/modules/iso_surface.py mayavi/modules/labels.py mayavi/modules/metadata.py mayavi/modules/orientation_axes.py mayavi/modules/outline.py mayavi/modules/scalar_cut_plane.py mayavi/modules/skeleton_module.py mayavi/modules/slice_unstructured_grid.py mayavi/modules/streamline.py mayavi/modules/structured_grid_outline.py mayavi/modules/surface.py mayavi/modules/tensor_glyph.py mayavi/modules/text.py mayavi/modules/text3d.py mayavi/modules/vector_cut_plane.py mayavi/modules/vectors.py mayavi/modules/volume.py mayavi/modules/warp_vector_cut_plane.py mayavi/modules/ui/__init__.py mayavi/modules/ui/iso_surface.py mayavi/modules/ui/surface.py mayavi/plugins/__init__.py mayavi/plugins/app.py mayavi/plugins/envisage_engine.py mayavi/plugins/mayavi_plugin.py mayavi/plugins/mayavi_ui_action_set.py mayavi/plugins/mayavi_ui_plugin.py mayavi/plugins/mayavi_workbench_application.py mayavi/plugins/script.py mayavi/preferences/__init__.py mayavi/preferences/api.py mayavi/preferences/bindings.py mayavi/preferences/contrib_finder.py mayavi/preferences/mayavi_preferences_page.py mayavi/preferences/preference_manager.py mayavi/preferences/preference_manager_view.py mayavi/preferences/preferences.ini mayavi/preferences/preferences_helpers.py mayavi/preferences/images/image_LICENSE.txt mayavi/preferences/images/preferences.ico mayavi/preferences/images/preferences.png mayavi/scripts/__init__.py mayavi/scripts/mayavi2 mayavi/scripts/mayavi2.py mayavi/scripts/util.py mayavi/sources/__init__.py mayavi/sources/api.py mayavi/sources/array_source.py mayavi/sources/builtin_image.py mayavi/sources/builtin_surface.py mayavi/sources/chaco_reader.py mayavi/sources/image_reader.py mayavi/sources/metadata.py mayavi/sources/parametric_surface.py mayavi/sources/plot3d_reader.py mayavi/sources/point_load.py mayavi/sources/poly_data_reader.py mayavi/sources/three_ds_importer.py mayavi/sources/unstructured_grid_reader.py mayavi/sources/utils.py mayavi/sources/volume_reader.py mayavi/sources/vrml_importer.py mayavi/sources/vtk_data_source.py mayavi/sources/vtk_file_reader.py mayavi/sources/vtk_xml_file_reader.py mayavi/sources/ui/__init__.py mayavi/sources/ui/parametric_surface.py mayavi/tests/README.txt mayavi/tests/__init__.py mayavi/tests/common.py mayavi/tests/data_reader_test_base.py mayavi/tests/datasets.py mayavi/tests/runtests.py mayavi/tests/test_array_source.py mayavi/tests/test_builtin_image.py mayavi/tests/test_builtin_surface.py mayavi/tests/test_contour.py mayavi/tests/test_core_common.py mayavi/tests/test_csv_sniff.py mayavi/tests/test_customize.py mayavi/tests/test_cut_plane.py mayavi/tests/test_dataset_manager.py mayavi/tests/test_engine_manager.py mayavi/tests/test_extract_grid_filter.py mayavi/tests/test_file_timestep.py mayavi/tests/test_garbage_collection.py mayavi/tests/test_glyph.py mayavi/tests/test_grid_plane.py mayavi/tests/test_image_data_probe.py mayavi/tests/test_image_data_reader.py mayavi/tests/test_image_plane_widget.py mayavi/tests/test_ipw_multiple_scalars.py mayavi/tests/test_mayavi_traits.py mayavi/tests/test_mlab_integration.py mayavi/tests/test_mlab_null_engine.py mayavi/tests/test_mlab_scene_model.py mayavi/tests/test_mlab_source.py mayavi/tests/test_mlab_source_integration.py mayavi/tests/test_mouse_pick_dispatcher.py mayavi/tests/test_no_ui_toolkit.py mayavi/tests/test_optional_collection.py mayavi/tests/test_pipeline_info.py mayavi/tests/test_plot3d_mb_reader.py mayavi/tests/test_poly_data_reader.py mayavi/tests/test_preference.ini mayavi/tests/test_preferences_mirror.py mayavi/tests/test_pylab_luts.py mayavi/tests/test_recorder.py mayavi/tests/test_registry.py mayavi/tests/test_script_recording.py mayavi/tests/test_set_active_attribute.py mayavi/tests/test_sources.py mayavi/tests/test_streamline.py mayavi/tests/test_text3d.py mayavi/tests/test_threshold_filter.py mayavi/tests/test_unstructured_data_reader.py mayavi/tests/test_user_defined.py mayavi/tests/test_volume.py mayavi/tests/test_vtk_data_source.py mayavi/tests/test_vtk_file_reader.py mayavi/tests/test_vtk_xml_reader.py mayavi/tests/csv_files/11.csv mayavi/tests/csv_files/11.py mayavi/tests/csv_files/1col.csv mayavi/tests/csv_files/1col.py mayavi/tests/csv_files/54.csv mayavi/tests/csv_files/54.py mayavi/tests/csv_files/79.csv mayavi/tests/csv_files/79.py mayavi/tests/csv_files/82.csv mayavi/tests/csv_files/82.py mayavi/tests/csv_files/89.csv mayavi/tests/csv_files/89.py mayavi/tests/csv_files/99.csv mayavi/tests/csv_files/99.py mayavi/tests/csv_files/OObeta3.csv mayavi/tests/csv_files/OObeta3.py mayavi/tests/csv_files/README.txt mayavi/tests/csv_files/colors.csv mayavi/tests/csv_files/colors.py mayavi/tests/csv_files/csv_2_py mayavi/tests/csv_files/example1.csv mayavi/tests/csv_files/example1.py mayavi/tests/csv_files/hp11c.csv mayavi/tests/csv_files/hp11c.py mayavi/tests/csv_files/loc.csv mayavi/tests/csv_files/loc.py mayavi/tests/csv_files/multi-col.csv mayavi/tests/csv_files/multi-col.py mayavi/tests/csv_files/mydata.csv mayavi/tests/csv_files/mydata.py mayavi/tests/csv_files/post.csv mayavi/tests/csv_files/post.py mayavi/tests/csv_files/webaccess.csv mayavi/tests/csv_files/webaccess.py mayavi/tests/data/Particles.raw mayavi/tests/data/README.txt mayavi/tests/data/RectGrid2.vtk mayavi/tests/data/SampleStructGrid.vtk mayavi/tests/data/caffeine.pdb mayavi/tests/data/cellsnd.ascii.inp mayavi/tests/data/clown.facet mayavi/tests/data/cow.g mayavi/tests/data/cube.vti mayavi/tests/data/disk_out_ref.ex2 mayavi/tests/data/edgeFaceElem.exii mayavi/tests/data/example.dem mayavi/tests/data/fieldfile.vtk mayavi/tests/data/foot.mha mayavi/tests/data/foot.raw mayavi/tests/data/humanoid_tri.stla mayavi/tests/data/nut.slc mayavi/tests/data/points.txt mayavi/tests/data/polyEx.vtk mayavi/tests/data/prism.neu mayavi/tests/data/pyramid.ply mayavi/tests/data/pyramid_ug.vtu mayavi/tests/data/shuttle.obj mayavi/tests/data/texThres2.vtk mayavi/tests/data/thio3xx.xyz mayavi/tests/data/tiny.q mayavi/tests/data/tiny.xyz mayavi/tests/data/uGridEx.vtk mayavi/tools/__init__.py mayavi/tools/animator.py mayavi/tools/auto_doc.py mayavi/tools/camera.py mayavi/tools/decorations.py mayavi/tools/engine_manager.py mayavi/tools/figure.py mayavi/tools/filters.py mayavi/tools/helper_functions.py mayavi/tools/mlab.py mayavi/tools/mlab_scene_model.py mayavi/tools/modules.py mayavi/tools/notebook.py mayavi/tools/pipe_base.py mayavi/tools/pipeline.py mayavi/tools/preferences_mirror.py mayavi/tools/probe_data.py mayavi/tools/server.py mayavi/tools/show.py mayavi/tools/sources.py mayavi/tools/tools.py mayavi/tools/data_wizards/__init__.py mayavi/tools/data_wizards/csv_loader.py mayavi/tools/data_wizards/csv_sniff.py mayavi/tools/data_wizards/csv_source_factory.py mayavi/tools/data_wizards/data_source_factory.py mayavi/tools/data_wizards/data_source_wizard.py mayavi/tools/data_wizards/loadtxt.py mayavi/tools/data_wizards/mydata.csv mayavi/tools/data_wizards/preview_window.py mayavi/tools/static/x3d/LICENSE.txt mayavi/tools/static/x3d/x3dom.css mayavi/tools/static/x3d/x3dom.js scripts/cm2lut.py scripts/gen_lut_previews.py tvtk/__init__.py tvtk/api.py tvtk/array_handler.py tvtk/class_tree.py tvtk/code_gen.py tvtk/common.py tvtk/indenter.py tvtk/messenger.py tvtk/misc.py tvtk/setup.py tvtk/special_gen.py tvtk/tvtk_access.py tvtk/tvtk_base.py tvtk/tvtk_base_handler.py tvtk/value_column.py tvtk/version.py tvtk/vtk_module.py tvtk/vtk_parser.py tvtk/wrapper_gen.py tvtk/custom/__init__.py tvtk/pipeline/__init__.py tvtk/pipeline/browser.py tvtk/pipeline/images/actor.png tvtk/pipeline/images/camera.png tvtk/pipeline/images/coordinate.png tvtk/pipeline/images/filter.png tvtk/pipeline/images/image_LICENSE.txt tvtk/pipeline/images/lookuptable.png tvtk/pipeline/images/mapper.png tvtk/pipeline/images/polydata.png tvtk/pipeline/images/property.png tvtk/pipeline/images/reader.png tvtk/pipeline/images/renderer.png tvtk/pipeline/images/rendererwindow.png tvtk/pipeline/images/rendererwindowinteractor.png tvtk/pipeline/images/source.png tvtk/pipeline/images/texture.png tvtk/pipeline/images/window.png tvtk/pipeline/images/writer.png tvtk/plugins/__init__.py tvtk/plugins/browser/__init__.py tvtk/plugins/browser/browser_plugin.py tvtk/plugins/browser/browser_view.py tvtk/plugins/scene/__init__.py tvtk/plugins/scene/i_scene_manager.py tvtk/plugins/scene/preferences.ini tvtk/plugins/scene/scene_editor.py tvtk/plugins/scene/scene_manager.py tvtk/plugins/scene/scene_plugin.py tvtk/plugins/scene/ui/__init__.py tvtk/plugins/scene/ui/actions.py tvtk/plugins/scene/ui/scene_preferences_page.py tvtk/plugins/scene/ui/scene_ui_action_set.py tvtk/plugins/scene/ui/scene_ui_plugin.py tvtk/pyface/__init__.py tvtk/pyface/actor_editor.py tvtk/pyface/actor_model.py tvtk/pyface/actors.py tvtk/pyface/api.py tvtk/pyface/decorated_scene.py tvtk/pyface/light_manager.py tvtk/pyface/movie_maker.py tvtk/pyface/picker.py tvtk/pyface/scene.py tvtk/pyface/scene_editor.py tvtk/pyface/scene_model.py tvtk/pyface/toolkit.py tvtk/pyface/tvtk_scene.py tvtk/pyface/utils.py tvtk/pyface/images/16x16/configure.png tvtk/pyface/images/16x16/fullscreen.png tvtk/pyface/images/16x16/image_LICENSE.txt tvtk/pyface/images/16x16/isometric.png tvtk/pyface/images/16x16/origin_glyph.png tvtk/pyface/images/16x16/parallel.png tvtk/pyface/images/16x16/save.png tvtk/pyface/images/16x16/x-axis.png tvtk/pyface/images/16x16/y-axis.png tvtk/pyface/images/16x16/z-axis.png tvtk/pyface/ui/__init__.py tvtk/pyface/ui/null/__init__.py tvtk/pyface/ui/null/init.py tvtk/pyface/ui/qt4/QVTKRenderWindowInteractor.py tvtk/pyface/ui/qt4/__init__.py tvtk/pyface/ui/qt4/actor_editor.py tvtk/pyface/ui/qt4/decorated_scene.py tvtk/pyface/ui/qt4/init.py tvtk/pyface/ui/qt4/scene.py tvtk/pyface/ui/qt4/scene_editor.py tvtk/pyface/ui/wx/__init__.py tvtk/pyface/ui/wx/actor_editor.py tvtk/pyface/ui/wx/decorated_scene.py tvtk/pyface/ui/wx/init.py tvtk/pyface/ui/wx/scene.py tvtk/pyface/ui/wx/scene_editor.py tvtk/pyface/ui/wx/wxVTKRenderWindowInteractor.py tvtk/src/array_ext.c tvtk/src/array_ext.pyx tvtk/tests/__init__.py tvtk/tests/common.py tvtk/tests/test_array_ext.py tvtk/tests/test_array_handler.py tvtk/tests/test_class_tree.py tvtk/tests/test_ctf_util.py tvtk/tests/test_garbage_collection.py tvtk/tests/test_indenter.py tvtk/tests/test_messenger.py tvtk/tests/test_misc.py tvtk/tests/test_movie_maker.py tvtk/tests/test_pyface_utils.py tvtk/tests/test_tvtk.py tvtk/tests/test_tvtk_base.py tvtk/tests/test_tvtk_scene.py tvtk/tests/test_visual.py tvtk/tests/test_vtk_parser.py tvtk/tests/test_wrapper_gen.py tvtk/tools/__init__.py tvtk/tools/ivtk.py tvtk/tools/mlab.py tvtk/tools/tvtk_doc.py tvtk/tools/visual.py tvtk/tools/images/image_LICENSE.txt tvtk/tools/images/scene.ico tvtk/util/__init__.py tvtk/util/ctf.py tvtk/util/gradient_editor.py tvtk/util/qt_gradient_editor.py tvtk/util/tk_gradient_editor.py tvtk/util/traitsui_gradient_editor.py tvtk/util/wx_gradient_editor.py tvtk/view/__init__.py tvtk/view/parametric_function_source_view.pymayavi-4.5.0/mayavi.egg-info/top_level.txt0000644000076500000240000000001412747722126021131 0ustar prabhustaff00000000000000mayavi tvtk mayavi-4.5.0/mlab_reference.py0000644000076500000240000003102712747716314016734 0ustar prabhustaff00000000000000""" Script to generate the function reference for mlab. """ # Author: Gael Varoquaux # Copyright (c) 2007-2016, Enthought, Inc. # License: BSD Style. from __future__ import print_function import os import sys DEFAULT_INPUT_DIR = os.path.join('docs', 'source') OUT_DIR = os.sep.join( [os.path.dirname(os.path.abspath(__file__)), DEFAULT_INPUT_DIR, 'mayavi','auto'] ) from mayavi.tools import auto_doc from mayavi import mlab from inspect import getmembers, getsource, getargspec, formatargspec from docutils import io as docIO from docutils import core as docCore # We need to exec render_image, as we can't import it, because it is not # in a python package. _src = os.path.abspath(os.path.join('docs', 'source', 'render_images.py')) render_images = dict(__name__='', __file__=_src) exec(compile(open(_src).read(), _src, 'exec'), render_images) IMAGE_DIR = render_images['IMAGE_DIR'] ############################################################################## def dedent(string): if string is not None: return auto_doc.dedent(string).lstrip(' ') else: return '\n' def indent(lines): if lines is None: return '' return '\n'.join(' '+line for line in lines.split('\n')) def relpath(target, base=os.curdir): """ Return a relative path to the target from either the current dir or an optional base dir. Base can be a directory specified either as absolute or relative to current dir. Adapted from http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/302594 """ base_list = (os.path.abspath(base)).split(os.sep) target_list = (os.path.abspath(target)).split(os.sep) # Starting from the filepath root, work out how much of the filepath is # shared by base and target. for i in range(min(len(base_list), len(target_list))): if base_list[i] != target_list[i]: break else: # If we broke out of the loop, i is pointing to the first # differing path elements. If we didn't break out of the loop, i # is pointing to identical path elements. # Increment i so that in all cases it points to the first # differing path elements. i+=1 rel_list = [os.pardir] * (len(base_list)-i) + target_list[i:] return os.path.join(*rel_list) def is_valid_rst(string): """ Check if the given string can be compiled to rst. """ publisher = docCore.Publisher( source_class = docIO.StringInput, destination_class = docIO.StringOutput ) publisher.set_components('standalone', 'restructuredtext', 'pseudoxml') publisher.process_programmatic_settings(None, None, None) publisher.set_source(string, None) compiled_rst = publisher.reader.read(publisher.source, publisher.parser, publisher.settings) if compiled_rst.parse_messages: return False else: return True def document_function(func, func_name=None, example_code=None, image_file=None): """ Creates a rst documentation string for the function, with an image and a example code, if given. """ if func_name is None: func_name = func.__name__ func_doc = func.__doc__ if func_doc is None: print('function %s is undocumented' % func_name) func_doc = '\n\n' else: if is_valid_rst(func_doc): func_doc = dedent(func_doc) else: func_doc = "\n::\n" + func_doc func_signature = formatargspec(*getargspec(func)) documentation = """ %(func_name)s %(title_line)s .. function:: %(func_name)s%(func_signature)s %(func_doc)s """ % { 'func_name' : func_name, 'title_line': '~'*len(func_name), 'func_signature': func_signature, 'func_doc' : indent(dedent(func_doc)) } if image_file is not None: documentation += """ .. image:: %s """ % image_file if example_code is not None: documentation += """ **Example** (run in ``ipython --gui=qt``, or in the mayavi2 interactive shell, see :ref:`running-mlab-scripts` for more info):: %s """ % indent(example_code) return documentation ############################################################################## class ModuleReference(object): """ The object representing the documentation pages for mlab. """ # Filename of the entry point for the module documentation. filename = 'mlab_reference.rst' # Directory for the output rst files. out_dir = OUT_DIR # Directory where the illustration files can be found. image_dir = IMAGE_DIR # Module to document module = None # Submodule to classify by sub_modules = () # Headers for the sub modules sub_headers = None # Filenames for the sub modules sub_filenames = None # Titles for the sub modules pages sub_modules_titles = None # Header for the main file header = '' # Footer for the main file footer = '' # Misc entries that are in no submodules. # If this is None, no separate page will be created misc_title = None # Misc file name misc_filename = None def __init__(self, **kwargs): self.__dict__.update(kwargs) def document_function(self, func_name): """ Return the documentation page string for a function, with automatic discovery of the example and image. """ func = getattr(self.module, func_name) print("Documenting function %s" % func_name, file=sys.stderr) if hasattr(self.module, 'test_' + func_name): example_code = getsource( getattr(self.module, 'test_' + func_name)) example_code = """ import numpy from mayavi.mlab import * %s """ % example_code else: example_code = None image_file = self.image_dir + os.sep + \ self.module.__name__.replace('.', '_') + '_' \ + func_name + '.jpg' if not os.path.exists(image_file): image_file = None else: image_file = relpath(image_file, self.out_dir) documentation = document_function(func, func_name=func_name, example_code=example_code, image_file=image_file) return documentation def write_doc(self): """ Entry point of the object: goes throught the module and writes the docs to the disk. """ self.to_document = set([name for name, func in getmembers(self.module) if not ( name[:5] == 'test_' or name[0] == '_') and callable(func)]) outfile = file(os.sep.join([self.out_dir, self.filename]), 'w') outfile.write(self.header) outfile.write(""" .. module:: %s .. toctree:: """ % self.module.__name__) if self.sub_modules_titles is None: self.sub_modules_titles = ['' for submodule in self.sub_modules] if self.sub_headers is None: self.sub_headers = ['' for submodule in self.sub_modules] if self.sub_filenames is None: self.sub_filenames = ['%s.rst' for submodule in self.sub_modules] # Document the functions imported from a submodule for submodule, header, filename, title in zip( self.sub_modules, self.sub_headers, self.sub_filenames, self.sub_modules_titles): self.write_doc_submodule(filename, title=title, header=header, submodulename=submodule) outfile.write('\t%s\n' % filename) # And now the rest if self.misc_filename is None: misc_filename = self.module.__name__ + '.misc' else: misc_filename = self.misc_filename self.write_doc_submodule(misc_filename, title=self.misc_title) if self.misc_title is None: outfile.write(""" .. include:: %s """ % misc_filename) else: outfile.write('\t%s\n' % misc_filename) outfile.write(self.footer) outfile.write('\n\n') def write_doc_submodule(self, filename, title=None, header=None, submodulename=None): """ Writes the docs only for the functions defined in a given submodule. If submodule is none, all the non-processed functions are processed. """ outfile = file(os.sep.join([self.out_dir, filename]), 'w') if header is not None: outfile.write(header) outfile.write(''' .. currentmodule:: %s .. note:: This section is only a reference describing the function, please see the chapter on :ref:`simple-scripting-with-mlab` for an introduction to mlab and how to interact with and assemble the functions of `mlab`. Please see the section on :ref:`running-mlab-scripts` for instructions on running the examples. ''' % self.module.__name__ ) if title is not None: outfile.write(title + '\n') outfile.write('='*len(title) + '\n') documented = set() for func_name in sorted(self.to_document): func = getattr(self.module, func_name) if ( submodulename is not None and not func.__module__ == submodulename ): continue outfile.write(self.document_function(func_name)) outfile.write("\n\n") documented.add(func_name) self.to_document.difference_update(documented) ############################################################################# # Entry point if __name__ == '__main__': try: os.makedirs(OUT_DIR) except: pass ######################################################################### # The main mlab module. from mayavi.tools import helper_functions, camera, \ decorations, figure sub_modules = [helper_functions, figure, decorations, camera] mlab_reference = ModuleReference( filename = 'mlab_reference.rst', module = mlab, header = """ .. _mlab-reference: MLab reference ================= Reference list of all the main functions of ``mayavi.mlab`` with documentation and examples. .. note:: This section is only a reference describing the function, please see the chapter on :ref:`simple-scripting-with-mlab` for an introduction to mlab and how to run the examples or interact with and assemble the functions of `mlab`. """, footer = """\t../mlab_pipeline_reference.rst\n""", sub_modules = [module.__name__ for module in sub_modules], sub_filenames = ['mlab_%s.rst' % module.__name__.split('.')[-1] for module in sub_modules], sub_modules_titles = ['Plotting functions', 'Figure handling functions', 'Figure decoration functions', 'Camera handling functions'], misc_title = 'Other functions', misc_filename = 'mlab_other_functions.rst', ) mlab_reference.write_doc() ######################################################################### # The mlab.pipeline module, sources functions. from mayavi.tools import pipeline, sources, tools, \ probe_data pipeline_reference = ModuleReference( filename = 'mlab_pipeline_reference.rst', module = pipeline, header = """ .. _mlab-pipeline-reference: MLab pipeline reference ======================== Reference list of all the main functions of ``pipeline`` sub module of ``mlab``. You can access these functions using:: mlab.pipeline.function(...) These functions can be used for finer control of the Mayavi pipeline than the main mlab interface. For usage examples, see :ref:`ontrolling-the-pipeline-with-mlab-scripts`. """, sub_modules = [sources.__name__, tools.__name__, probe_data.__name__], sub_filenames = ['mlab_pipeline_sources.rst', 'mlab_pipeline_tools.rst', 'mlab_pipeline_data.rst'], sub_modules_titles = ['Sources', 'Tools', 'Data'], misc_title = 'Filters, modules, other functions', misc_filename = 'mlab_pipeline_other_functions.rst', ) pipeline_reference.write_doc() mayavi-4.5.0/PKG-INFO0000644000076500000240000000673012747722127014530 0ustar prabhustaff00000000000000Metadata-Version: 1.1 Name: mayavi Version: 4.5.0 Summary: The Mayavi scientific data 3-dimensional visualizer. Home-page: http://docs.enthought.com/mayavi/mayavi/ Author: ETS Developers Author-email: enthought-dev@enthought.com License: BSD Download-URL: https://www.github.com/enthought/mayavi Description: The Mayavi *project* includes two related *packages* for 3-dimensional visualization: - **Mayavi2**: A tool for easy and interactive visualization of data. - **TVTK**: A Traits-based wrapper for the Visualization Toolkit, a popular open-source visualization library. These libraries operate at different levels of abstraction. TVTK manipulates visualization objects, while Mayavi2 lets you operate on your data, and then see the results. Most users either use the Mayavi user interface or program to its scripting interface; you probably don't need to interact with TVTK unless you want to create a new Mayavi module. Mayavi2 ------- Mayavi2 seeks to provide easy and interactive visualization of 3-D data. It offers: - An (optional) rich user interface with dialogs to interact with all data and objects in the visualization. - A simple and clean scripting interface in Python, including one-liners, or an object-oriented programming interface. - The power of the VTK toolkit, harnessed through these interfaces, without forcing you to learn it. Additionally Mayavi2 is a reusable tool that can be embedded in your applications in different ways or combined with the Envisage application-building framework to assemble domain-specific tools. TVTK ---- TVTK wraps VTK objects to provide a convenient, Pythonic API, while supporting Traits attributes and NumPy/SciPy arrays. TVTK is implemented mostly in pure Python, except for a small extension module. Developers typically use TVTK to write Mayavi modules, and then use Mayavi to interact with visualizations or create applications. Prerequisites ------------- You must have the following libraries installed before installing the Mayavi project: * `Numpy `_ version 1.1.1 or later * `VTK `_ version 5.0 or later * One of the following GUI toolkit packages: - `Qt `_ version 4.8 with either PyQt 4.11.4 or PySide 1.2.2 - `wxPython `_ version 2.8 or later * `configobj `_ Platform: Windows Platform: Linux Platform: Mac OS-X Platform: Unix Platform: Solaris Classifier: Development Status :: 5 - Production/Stable Classifier: Intended Audience :: Developers Classifier: Intended Audience :: Science/Research Classifier: License :: OSI Approved :: BSD License Classifier: Operating System :: MacOS Classifier: Operating System :: Microsoft :: Windows Classifier: Operating System :: OS Independent Classifier: Operating System :: POSIX Classifier: Operating System :: Unix Classifier: Programming Language :: C Classifier: Programming Language :: Python Classifier: Topic :: Scientific/Engineering Classifier: Topic :: Software Development Classifier: Topic :: Software Development :: Libraries mayavi-4.5.0/README-tvtk.txt0000644000076500000240000000376112747716313016120 0ustar prabhustaff00000000000000=================== TVTK: Traited VTK =================== Description ----------- TVTK_ provides a Traits enabled version of VTK_. TVTK objects wrap around VTK objects but additionally support Traits_, support numpy arrays transparently and provide a convenient Pythonic API. TVTK is implemented mostly in pure Python (except for a small extension module). TVTK is distributed under a liberal BSD style license with the Mayavi_ package, which is part of the Enthought Tool Suite (ETS) and is distributed. License information is available in the LICENSE.txt file in this same directory. .. _VTK: http://www.vtk.org .. _Traits: https://docs.enthought.com/traits .. _TVTK: https://docs.enthought.com/mayavi/tvtk .. _Mayavi: https://docs.enthought.com/mayavi/mayavi Getting the package ------------------- The source for TVTK should be acquired with the source for Mayavi here: http://pypi.python.org/pypi/mayavi Documentation -------------- Documentation is hosted here: http://docs.enthought.com/mayavi/tvtk Examples -------- Examples are all in the `examples` directory of the source or the SVN checkout. The docs and examples do not ship with the binary eggs. Test suite ---------- The test suite may be run like so (on a bash shell):: cd enthought/tvtk/tests for i in test*.py; do python $i; done Use a similar line for your particular shell. Bug tracker, mailing list etc. ------------------------------- The bug tracker is available here: https://github.com/enthought/mayavi/issues To submit a bug you will necessarily have to register on Github. Alternatively, you can post on the info@enthought.com mailing list. Authors and Contributors ------------------------ Prabhu Ramachandran: main author. Gerald Knizia: Initial version of Tkinter based gradient editor. Pete Schmitt: wxPython version of gradient editor. Raashid Baig: `visual` module. Phil Thompson: PyQt4 versions of pyface widgets. Many thanks to all those who have submitted bug reports and suggestions for further enhancements. mayavi-4.5.0/README.rst0000644000076500000240000001201512747716313015113 0ustar prabhustaff00000000000000======================================================= MayaVi2: 3D visualization of scientific data in Python ======================================================= Mayavi doc: http://docs.enthought.com/mayavi/mayavi/ TVTK doc: http://docs.enthought.com/mayavi/tvtk .. image:: https://api.travis-ci.org/enthought/mayavi.png?branch=master :target: https://travis-ci.org/enthought/mayavi :alt: Build status .. image:: http://codecov.io/github/enthought/mayavi/coverage.svg?branch=master :target: http://codecov.io/github/enthought/mayavi?branch=master Vision ====== MayaVi2 seeks to provide easy and interactive visualization of 3D data. It does this by the following: - an (optional) rich user interface with dialogs to interact with all data and objects in the visualization. - a simple and clean scripting interface in Python, including one-liners, a-la mlab, or object-oriented programming interface. - harnesses the power of the VTK toolkit without forcing you to learn it. Additionally Mayavi2 strives to be a reusable tool that can be embedded in your applications in different ways or combined with the envisage application-building framework to assemble domain-specific tools. Mayavi is part of the Enthought Tool Suite (ETS). Features =========== MayaVi2 is a general purpose, cross-platform tool for 2-D and 3-D scientific data visualization. Its features include: * Visualization of scalar, vector and tensor data in 2 and 3 dimensions * Easy scriptability using Python * Easy extendability via custom sources, modules, and data filters * Reading several file formats: VTK (legacy and XML), PLOT3D, etc. * Saving of visualizations * Saving rendered visualization in a variety of image formats * Convenient functionality for rapid scientific plotting via mlab (see mlab documentation) * See the MayaVi2 Users Guide for more information. Unlike its predecessor MayaVi1_, Mayavi2 has been designed with scriptability and extensibility in mind from the ground up. While the mayavi2 application is usable by itself, it may be used as an Envisage plugin which allows it to be embedded in user applications natively. Alternatively, it may be used as a visualization engine for any application. .. _MayaVi1: http://mayavi.sf.net Quick start =========== If you are new to mayavi it is a good idea to read the users guide which should introduce you to how to install and use it. The user guide is available in the `docs` directory and also available from the mayavi home page. If you have installed `mayavi` as described in the previous section you should be able to launch the `mayavi2` application and also run any of the examples in the examples directory. Getting the package =================== The mayavi codebase can be found in github: https://github.com/enthought/mayavi General Build and Installation instructions are available `here `_ Source tarballs for necessary stable ETS packages are available through pypi - `traits `_ - `traitsui `_ - `pyface `_ - `apptools `_ - `envisage `_ - `mayavi `_ Development versions exist in the github `Enthought organization `_ Documentation ============== More documentation is available in the `online user manual `_ or in ``docs`` directory of the sources. This includes a man page for the ``mayavi2`` application, a users guide in HTML and PDF format and documentation for `mlab`. Examples ======== Examples are all in the ``examples`` directory of the source or the SVN checkout. The docs and examples do not ship with the binary eggs. The examples directory also contains some sample data. Test suite ========== The basic test suites for tvtk and mayavi can be run using nose:: nosetests -v tvtk/tests nosetests -v mayavi The integration tests:: cd integrationtests/mayavi python run.py Bug tracker, mailing list etc. ============================== The bug tracker is available in `github `_ Please provide info and details on platform, python, vtk and gui backends and their versions. If possible, a small example replicating the the problem. Authors and Contributors ======================== * Core contribtuors: Prabhu Ramachandran: primary author. Gaël Varoquaux: mlab, icons, many general improvements and maintainance. Deepak Surti: Upgrade to VTK 5.10.1, VTK 6.x with new pipeline. * Support and code contributions from Enthought Inc. * Patches from many people (see the release notes), including K K Rai and R A Ambareesha for tensor support, parametric source and image data. Many thanks to all those who have submitted bug reports and suggestions for further enhancements. mayavi-4.5.0/scripts/0000755000076500000240000000000012747722127015114 5ustar prabhustaff00000000000000mayavi-4.5.0/scripts/cm2lut.py0000755000076500000240000000206512747716314016703 0ustar prabhustaff00000000000000#!/usr/bin/env python """ Script used to create lut lists used by mayavi from matplotlib colormaps. This requires matplotlib to be installed and should not be ran by the user, but only once in a while to synchronize with MPL development. """ # Authors: Frederic Petit , # Gael Varoquaux # Copyright (c) 2007-2009, Enthought, Inc. # License: BSD Style. import os import numpy as np from matplotlib.cm import datad, get_cmap from matplotlib._cm_listed import cmaps from mayavi.core import lut as destination_module from apptools.persistence import state_pickler target_dir = os.path.dirname(destination_module.__file__) values = np.linspace(0., 1., 256) lut_dic = {} # Some of the cmaps are listed in cm.datad, and others in _cm_listed.cmaps cmap_names = datad.keys() cmap_names.extend(cmaps.keys()) for name in cmap_names: if name.endswith('_r'): continue lut_dic[name] = get_cmap(name)(values.copy()) out_name = os.path.join(target_dir, 'pylab_luts.pkl') state_pickler.dump(lut_dic, out_name) mayavi-4.5.0/scripts/gen_lut_previews.py0000644000076500000240000000147012747716314021052 0ustar prabhustaff00000000000000""" Script to generate the preview images for the mayavi2 LUTs. Requires ImageMagick. """ import os from mayavi import mlab from mayavi.core.lut_manager import lut_mode_list, lut_image_dir import numpy as np # Create some data X = np.arange(0, 255) X = X * np.ones((200, 1)) mlab.clf() image = mlab.imshow(X.T) mlab.view(0, 0, 118) # Make a preview for each possible lut for lut in lut_mode_list(): filebasename = os.path.join(lut_image_dir, lut.lower()) if not lut == 'file': image.module_manager.scalar_lut_manager.lut_mode = lut mlab.savefig(filebasename + '.png', size=(80, 20)) #os.system('convert %s.png %s.gif &' %(filebasename, filebasename)) os.system('montage -geometry -0-0 -label "%s" %s.png %s.gif &' % (lut, filebasename, filebasename) ) mayavi-4.5.0/setup.cfg0000644000076500000240000000007312747722127015246 0ustar prabhustaff00000000000000[egg_info] tag_build = tag_date = 0 tag_svn_revision = 0 mayavi-4.5.0/setup.py0000644000076500000240000004155112747716314015146 0ustar prabhustaff00000000000000#!/usr/bin/env python # # Copyright (c) 2008-2016 by Enthought, Inc. # All rights reserved. """ The Mayavi scientific data 3-dimensional visualizer. The Mayavi *project* includes two related *packages* for 3-dimensional visualization: - **Mayavi2**: A tool for easy and interactive visualization of data. - **TVTK**: A Traits-based wrapper for the Visualization Toolkit, a popular open-source visualization library. These libraries operate at different levels of abstraction. TVTK manipulates visualization objects, while Mayavi2 lets you operate on your data, and then see the results. Most users either use the Mayavi user interface or program to its scripting interface; you probably don't need to interact with TVTK unless you want to create a new Mayavi module. Mayavi2 ------- Mayavi2 seeks to provide easy and interactive visualization of 3-D data. It offers: - An (optional) rich user interface with dialogs to interact with all data and objects in the visualization. - A simple and clean scripting interface in Python, including one-liners, or an object-oriented programming interface. - The power of the VTK toolkit, harnessed through these interfaces, without forcing you to learn it. Additionally Mayavi2 is a reusable tool that can be embedded in your applications in different ways or combined with the Envisage application-building framework to assemble domain-specific tools. TVTK ---- TVTK wraps VTK objects to provide a convenient, Pythonic API, while supporting Traits attributes and NumPy/SciPy arrays. TVTK is implemented mostly in pure Python, except for a small extension module. Developers typically use TVTK to write Mayavi modules, and then use Mayavi to interact with visualizations or create applications. Prerequisites ------------- You must have the following libraries installed before installing the Mayavi project: * `Numpy `_ version 1.1.1 or later * `VTK `_ version 5.0 or later * One of the following GUI toolkit packages: - `Qt `_ version 4.8 with either PyQt 4.11.4 or PySide 1.2.2 - `wxPython `_ version 2.8 or later * `configobj `_ """ # NOTE: Setuptools must be imported BEFORE numpy.distutils or else # numpy.distutils does the Wrong(TM) thing. import setuptools from setuptools import Command import numpy import os import subprocess import shutil import re import sys import traceback from os.path import (abspath, basename, dirname, exists, getmtime, isdir, join, split, splitext) from numpy.distutils.command import build, install_data from distutils.command import clean from distutils import log from setuptools.command import develop, install_scripts info = {} fname = join('mayavi', '__init__.py') exec(compile(open(fname).read(), fname, 'exec'), info) DEFAULT_HTML_TARGET_DIR = join('docs', 'build') DEFAULT_INPUT_DIR = join('docs', 'source',) class GenDocs(Command): description = \ "This command generates generated part of the documentation " \ "when needed. It's run automatically before a build_docs, and that's " \ "the only time it needs to be run." user_options = [ ('None', None, 'this command has no options'), ] def latest_modified(self, the_path, filetypes='', ignore_dirs=''): """Traverses a path looking for the most recently modified file Parameters ---------- the_path : string Contains path to be traversed or filename to be inspected. filetypes : string Regular expression pattern of files to examine. If specified, other files are ignored. Otherwise, all files are examined. ignore_dirs : string Regular expression pattern of directories to be ignored. If ignore specified, all directories are walked. Returns ------- latest_time : float Modification time of latest_path. latest_path : string Most recently modified file. Description ----------- """ file_re = re.compile(filetypes) dir_re = re.compile(ignore_dirs) if not exists(the_path): return 0, the_path if isdir(the_path): latest_time = 0 latest_path = the_path for root, dirs, files in os.walk(the_path): if ignore_dirs != '': # This needs to iterate over a copy of the list. Otherwise, # as things get removed from the original list, the indices # become invalid. for dir in dirs[:]: if dir_re.search(dir): dirs.remove(dir) for file in files: if filetypes != '': if not file_re.search(file): continue current_file_time = getmtime(join(root, file)) if current_file_time > latest_time: latest_time = current_file_time latest_path = join(root, file) return latest_time, latest_path else: return getmtime(the_path), the_path def mlab_reference(self): """ If mayavi is installed, run the mlab_reference generator. """ # XXX: This is really a hack: the script is not made to be used # for different projects, but it ended up being. This part is # mayavi-specific. mlab_ref_dir = join(DEFAULT_INPUT_DIR, 'mayavi','auto') source_path = 'mayavi' sources = '(\.py)|(\.rst)$' excluded_dirs = '^\.' target_path = mlab_ref_dir target_time = self.latest_modified(target_path, ignore_dirs=excluded_dirs)[0] if (self.latest_modified(source_path, filetypes=sources, ignore_dirs=excluded_dirs)[0] > target_time or self.latest_modified('mlab_reference.py')[0] > target_time or not exists(join('docs', 'source', 'mayavi', 'auto', 'mlab_reference.rst')) ): try: from mayavi import mlab from mayavi.tools import auto_doc print("Generating the mlab reference documentation") os.system('python mlab_reference.py') except: pass def example_files(self): """ Generate the documentation files for the examples. """ mlab_ref_dir = join(DEFAULT_INPUT_DIR, 'mayavi','auto') source_path = join('examples', 'mayavi') sources = '(\.py)|(\.rst)$' excluded_dirs = '^\.' target_path = mlab_ref_dir target_time = self.latest_modified(target_path, ignore_dirs=excluded_dirs)[0] script_file_name = join('docs', 'source', 'render_examples.py') if (self.latest_modified(source_path, filetypes=sources, ignore_dirs=excluded_dirs)[0] > target_time or self.latest_modified(script_file_name)[0] > target_time or not exists(join('docs', 'source', 'mayavi', 'auto', 'examples.rst')) ): try: from mayavi import mlab from mayavi.tools import auto_doc print("Generating the example list") subprocess.call('python %s' % basename(script_file_name), shell=True, cwd=dirname(script_file_name)) except: pass def run(self): self.mlab_reference() self.example_files() def initialize_options(self): pass def finalize_options(self): pass class BuildDocs(Command): description = \ "This command generates the documentation by running Sphinx. " \ "It then zips the docs into an html.zip file." user_options = [ ('None', None, 'this command has no options'), ] def make_docs(self): if os.name == 'nt': print("Please impelemnt sphinx building on windows here.") else: subprocess.call(['make', 'html'], cwd='docs') def run(self): self.make_docs() def initialize_options(self): pass def finalize_options(self): pass # Functions to generate the docs def list_doc_projects(): """ List the different source directories under DEFAULT_INPUT_DIR for which we have docs. """ source_dir = join(abspath(dirname(__file__)), DEFAULT_INPUT_DIR) source_list = os.listdir(source_dir) # Check to make sure we're using non-hidden directories. source_dirs = [listing for listing in source_list if isdir(join(source_dir, listing)) and not listing.startswith('.')] return source_dirs def list_docs_data_files(project): """ List the files to add to a project by inspecting the documentation directory. This works only if called after the build step, as the files have to be built. returns a list of (install_dir, [data_files, ]) tuples. """ project_target_dir = join(DEFAULT_HTML_TARGET_DIR, project, 'html') return_list = [] for root, dirs, files in os.walk(project_target_dir, topdown=True): # Modify inplace the list of directories to walk dirs[:] = [d for d in dirs if not d.startswith('.')] if len(files) == 0: continue install_dir = root.replace(project_target_dir, join(project, 'html')) return_list.append((install_dir, [join(root, f) for f in files])) return return_list # Our custom distutils hooks def build_tvtk_classes_zip(): MY_DIR = os.path.dirname(__file__) sys.path.insert(0, MY_DIR) import tvtk tvtk_dir = 'tvtk' sys.path.insert(0, tvtk_dir) from setup import gen_tvtk_classes_zip gen_tvtk_classes_zip() sys.path.remove(tvtk_dir) sys.path.remove(MY_DIR) class MyBuild(build.build): """ A build hook to generate the documentation. We sub-class numpy.distutils' build command because we're relying on numpy.distutils' setup method to build python extensions. """ def run(self): build_tvtk_classes_zip() build.build.run(self) self.run_command('gen_docs') try: self.run_command('build_docs') except: log.warn("Couldn't build documentation:\n%s" % traceback.format_exception(*sys.exc_info())) class MyDevelop(develop.develop): """ A hook to have the docs rebuilt during develop. Subclassing setuptools' command because numpy.distutils doesn't have an implementation. """ def run(self): self.run_command('gen_docs') try: self.run_command('build_docs') except: log.warn("Could not build documentation:\n%s" % traceback.format_exception(*sys.exc_info())) # Make sure that the 'build_src' command will # always be inplace when we do a 'develop'. self.reinitialize_command('build_src', inplace=1) # tvtk_classes.zip always need to be created on 'develop'. build_tvtk_classes_zip() develop.develop.run(self) class MyInstallData(install_data.install_data): """ An install hook to copy the generated documentation. We subclass numpy.distutils' command because we're relying on numpy.distutils' setup method to build python extensions. """ def run(self): install_data_command = self.get_finalized_command('install_data') for project in list_doc_projects(): install_data_command.data_files.extend( list_docs_data_files(project)) # make sure tvtk_classes.zip always get created before putting it # in the install data. build_tvtk_classes_zip() tvtk_dir = 'tvtk' install_data_command.data_files.append( (tvtk_dir, [join(tvtk_dir, 'tvtk_classes.zip')])) install_data.install_data.run(self) class MyClean(clean.clean): """Reimplements to remove the extension module array_ext to guarantee a fresh rebuild every time. The module hanging around could introduce problems when doing develop for a different vtk version.""" def run(self): MY_DIR = os.path.dirname(__file__) ext_file = os.path.join( MY_DIR, "tvtk", "array_ext" + (".pyd" if sys.platform == "win32" else ".so") ) if os.path.exists(ext_file): print("Removing in-place array extensions {}".format(ext_file)) os.unlink(ext_file) clean.clean.run(self) # Configure our extensions to Python def configuration(parent_package=None, top_path=None): from numpy.distutils.misc_util import Configuration config = Configuration(None, parent_package, top_path) config.set_options( ignore_setup_xxx_py=True, assume_default_configuration=True, delegate_options_to_subpackages=True, quiet=True, ) config.add_subpackage('tvtk') config.add_data_dir('mayavi/core/lut') config.add_data_dir('mayavi/tests/data') config.add_data_dir('mayavi/tests/csv_files') config.add_data_dir('mayavi/tools/static') # Image files. for pkgdir in ('mayavi', 'tvtk'): for root, dirs, files in os.walk(pkgdir): if split(root)[-1] == 'images': config.add_data_dir(root) # *.ini files. config.add_data_dir('tvtk/plugins/scene') config.add_data_dir('mayavi/preferences') return config ########################################################################### # Similar to package_data, but installed before build build_package_data = {'mayavi.images': ['docs/source/mayavi/m2_about.jpg']} # Instal our data files at build time. This is iffy, # but we need to do this before distutils kick in. for package, files in build_package_data.items(): target_path = package.replace('.', os.sep) for filename in files: shutil.copy(filename, target_path) ########################################################################### # Build the full set of packages by appending any found by setuptools' # find_packages to those discovered by numpy.distutils. config = configuration().todict() packages = setuptools.find_packages(exclude=config['packages'] + ['docs', 'examples']) config['packages'] += packages # The actual setup call DOCLINES = __doc__.split("\n") numpy.distutils.core.setup( name = 'mayavi', version = info['__version__'], author = "Prabhu Ramachandran, et. al.", author_email = "prabhu@aero.iitb.ac.in", maintainer = 'ETS Developers', maintainer_email = 'enthought-dev@enthought.com', url = 'http://docs.enthought.com/mayavi/mayavi/', classifiers = [c.strip() for c in """\ Development Status :: 5 - Production/Stable Intended Audience :: Developers Intended Audience :: Science/Research License :: OSI Approved :: BSD License Operating System :: MacOS Operating System :: Microsoft :: Windows Operating System :: OS Independent Operating System :: POSIX Operating System :: Unix Programming Language :: C Programming Language :: Python Topic :: Scientific/Engineering Topic :: Software Development Topic :: Software Development :: Libraries """.splitlines() if len(c.split()) > 0], cmdclass = { # Work around a numpy distutils bug by forcing the use of the # setuptools' sdist command. 'sdist': setuptools.command.sdist.sdist, 'build': MyBuild, 'clean': MyClean, 'develop': MyDevelop, 'install_data': MyInstallData, 'gen_docs': GenDocs, 'build_docs': BuildDocs, }, description = DOCLINES[1], download_url=('https://www.github.com/enthought/mayavi'), entry_points = { 'gui_scripts': [ 'mayavi2 = mayavi.scripts.mayavi2:main', 'tvtk_doc = tvtk.tools.tvtk_doc:main' ], 'envisage.plugins': [ 'tvtk.scene = tvtk.plugins.scene.scene_plugin:ScenePlugin', 'tvtk.scene_ui = tvtk.plugins.scene.ui.scene_ui_plugin:SceneUIPlugin', 'tvtk.browser = tvtk.plugins.browser.browser_plugin:BrowserPlugin', 'mayavi = mayavi.plugins.mayavi_plugin:MayaviPlugin', 'mayavi_ui = mayavi.plugins.mayavi_ui_plugin:MayaviUIPlugin' ], }, extras_require = info['__extras_require__'], include_package_data = True, install_requires = info['__requires__'], license = "BSD", long_description = '\n'.join(DOCLINES[3:]), platforms = ["Windows", "Linux", "Mac OS-X", "Unix", "Solaris"], zip_safe = False, **config ) mayavi-4.5.0/tvtk/0000755000076500000240000000000012747722127014415 5ustar prabhustaff00000000000000mayavi-4.5.0/tvtk/__init__.py0000644000076500000240000000240712747716314016532 0ustar prabhustaff00000000000000# Author: Prabhu Ramachandran # License: BSD style # Copyright (c) 2004, Enthought, Inc. """ A Traits-based wrapper for the Visualization Toolkit. Part of the Mayavi project of the Enthought Tool Suite. """ from os.path import exists, join, dirname, isdir import logging # use a null handler when used as a library logging.getLogger('tvtk').addHandler(logging.NullHandler()) # The tvtk wrapper code is all typically inside one zip file. We try to # find this file and put it in __path__ and then create the 'tvtk' module # wrapper from that. If the ZIP file is extracted into a tvtk_classes # directory the ZIP file is not used and the tvtk_classes directory is # inserted into sys.path and the directory contents are used for the tvtk # classes -- note that you must have the following structure # tvtk_classes/tvtk_classes/__init__.py. This is handy for tools like # pydev (Eclipse). # We add the path to the local __path__ here, in the __init__, so that # the unpickler can directly unpickle the TVTK classes. _zip = join(dirname(__file__), 'tvtk_classes.zip') tvtk_class_dir = join(dirname(__file__), 'tvtk_classes') if exists(tvtk_class_dir) and isdir(tvtk_class_dir): # Nothing to do, it will imported anyhow. pass elif exists(_zip): __path__.append(_zip) mayavi-4.5.0/tvtk/api.py0000644000076500000240000000055512747716314015546 0ustar prabhustaff00000000000000# Author: Prabhu Ramachandran # License: BSD style # The external API for tvtk. # The version of TVTK that is installed from tvtk.version import version, version as __version__ # The TVTK pseudo-module. from tvtk.tvtk_access import tvtk # Handy colors from VTK. from vtk.util import colors # Some miscellaneous functionality. from tvtk.misc import write_data mayavi-4.5.0/tvtk/array_handler.py0000644000076500000240000006577612747716314017630 0ustar prabhustaff00000000000000""" This module contains all the array handling code for TVTK. The most important functions provided by this module involve the conversion of numpy arrays/Python lists to different VTK data arrays and vice-versa. Warning: Numpy Character arrays will not work properly since there seems no unique one-to-one VTK data array type to map it to. """ # Author: Prabhu Ramachandran # Copyright (c) 2004-2015, Enthought, Inc. # License: BSD Style. import sys import vtk from vtk.util import vtkConstants try: from vtk.util import numpy_support except ImportError: numpy_support = None import numpy # Enthought library imports. from tvtk.array_ext import set_id_type_array from tvtk.common import is_old_pipeline # Useful constants for VTK arrays. VTK_ID_TYPE_SIZE = vtk.vtkIdTypeArray().GetDataTypeSize() if VTK_ID_TYPE_SIZE == 4: ID_TYPE_CODE = numpy.int32 elif VTK_ID_TYPE_SIZE == 8: ID_TYPE_CODE = numpy.int64 VTK_LONG_TYPE_SIZE = vtk.vtkLongArray().GetDataTypeSize() if VTK_LONG_TYPE_SIZE == 4: LONG_TYPE_CODE = numpy.int32 ULONG_TYPE_CODE = numpy.uint32 elif VTK_LONG_TYPE_SIZE == 8: LONG_TYPE_CODE = numpy.int64 ULONG_TYPE_CODE = numpy.uint64 BASE_REFERENCE_COUNT = vtk.vtkObject().GetReferenceCount() if sys.version_info[0] > 2: unicode = str def getbuffer(array): return getattr(numpy, 'getbuffer', memoryview)(array) ###################################################################### # The array cache. ###################################################################### class ArrayCache(object): """Caches references to numpy arrays that are not copied but views of which are converted to VTK arrays. The caching prevents the user from deleting or resizing the numpy array after it has been sent down to VTK. The cached arrays are automatically removed when the VTK array destructs.""" ###################################################################### # `object` interface. ###################################################################### def __init__(self): # The cache. self._cache = {} def __len__(self): return len(self._cache) def __contains__(self, vtk_arr): key = vtk_arr.__this__ return key in self._cache ###################################################################### # `ArrayCache` interface. ###################################################################### def add(self, vtk_arr, np_arr): """Add numpy array corresponding to the vtk array to the cache.""" key = vtk_arr.__this__ cache = self._cache # Setup a callback so this cached array reference is removed # when the VTK array is destroyed. Passing the key to the # `lambda` function is necessary because the callback will not # receive the object (it will receive `None`) and thus there # is no way to know which array reference one has to remove. vtk_arr.AddObserver('DeleteEvent', lambda o, e, key=key: \ self._remove_array(key)) # Cache the array cache[key] = np_arr def get(self, vtk_arr): """Return the cached numpy array given a VTK array.""" key = vtk_arr.__this__ return self._cache[key] ###################################################################### # Non-public interface. ###################################################################### def _remove_array(self, key): """Private function that removes the cached array. Do not call this unless you know what you are doing.""" try: del self._cache[key] except KeyError: pass ###################################################################### # Setup a global `_array_cache`. The array object cache caches all the # converted numpy arrays that are not copied. This prevents the user # from deleting or resizing the numpy array after it has been sent down # to VTK. ###################################################################### _dummy = None # This makes the cache work even when the module is reloaded. for name in ['array_handler', 'tvtk.array_handler']: if name in sys.modules: mod = sys.modules[name] if hasattr(mod, '_array_cache'): _dummy = mod._array_cache del mod break if _dummy: _array_cache = _dummy else: _array_cache = ArrayCache() del _dummy ###################################################################### # Array conversion functions. ###################################################################### def get_vtk_array_type(numeric_array_type): """Returns a VTK typecode given a numpy array.""" # This is a Mapping from numpy array types to VTK array types. _arr_vtk = {numpy.dtype(numpy.character):vtkConstants.VTK_UNSIGNED_CHAR, numpy.dtype(numpy.uint8):vtkConstants.VTK_UNSIGNED_CHAR, numpy.dtype(numpy.uint16):vtkConstants.VTK_UNSIGNED_SHORT, numpy.dtype(numpy.int8):vtkConstants.VTK_CHAR, numpy.dtype(numpy.int16):vtkConstants.VTK_SHORT, numpy.dtype(numpy.int32):vtkConstants.VTK_INT, numpy.dtype(numpy.uint32):vtkConstants.VTK_UNSIGNED_INT, numpy.dtype(numpy.float32):vtkConstants.VTK_FLOAT, numpy.dtype(numpy.float64):vtkConstants.VTK_DOUBLE, numpy.dtype(numpy.complex64):vtkConstants.VTK_FLOAT, numpy.dtype(numpy.complex128):vtkConstants.VTK_DOUBLE, } _extra = {numpy.dtype(ID_TYPE_CODE):vtkConstants.VTK_ID_TYPE, numpy.dtype(ULONG_TYPE_CODE):vtkConstants.VTK_UNSIGNED_LONG, numpy.dtype(LONG_TYPE_CODE):vtkConstants.VTK_LONG, } for t in _extra: if t not in _arr_vtk: _arr_vtk[t] = _extra[t] try: return _arr_vtk[numeric_array_type] except KeyError: for key in _arr_vtk: if numpy.issubdtype(numeric_array_type, key): return _arr_vtk[key] raise TypeError("Couldn't translate array's type to VTK") def get_vtk_to_numeric_typemap(): """Returns the VTK array type to numpy array type mapping.""" _vtk_arr = {vtkConstants.VTK_BIT:numpy.bool, vtkConstants.VTK_CHAR:numpy.int8, vtkConstants.VTK_UNSIGNED_CHAR:numpy.uint8, vtkConstants.VTK_SHORT:numpy.int16, vtkConstants.VTK_UNSIGNED_SHORT:numpy.uint16, vtkConstants.VTK_INT:numpy.int32, vtkConstants.VTK_UNSIGNED_INT:numpy.uint32, vtkConstants.VTK_LONG:LONG_TYPE_CODE, vtkConstants.VTK_UNSIGNED_LONG:ULONG_TYPE_CODE, vtkConstants.VTK_ID_TYPE:ID_TYPE_CODE, vtkConstants.VTK_FLOAT:numpy.float32, vtkConstants.VTK_DOUBLE:numpy.float64} return _vtk_arr def get_numeric_array_type(vtk_array_type): """Returns a numpy array typecode given a VTK array type.""" return get_vtk_to_numeric_typemap()[vtk_array_type] def get_sizeof_vtk_array(vtk_array_type): """Returns the size of a VTK array type.""" _size_dict = {vtkConstants.VTK_BIT : 1, vtkConstants.VTK_CHAR : 1, vtkConstants.VTK_UNSIGNED_CHAR : 1, vtkConstants.VTK_SHORT : 2, vtkConstants.VTK_UNSIGNED_SHORT : 2, vtkConstants.VTK_INT : 4, vtkConstants.VTK_UNSIGNED_INT : 4, vtkConstants.VTK_LONG : VTK_LONG_TYPE_SIZE, vtkConstants.VTK_UNSIGNED_LONG : VTK_LONG_TYPE_SIZE, vtkConstants.VTK_ID_TYPE : VTK_ID_TYPE_SIZE, vtkConstants.VTK_FLOAT : 4, vtkConstants.VTK_DOUBLE : 8 } return _size_dict[vtk_array_type] def create_vtk_array(vtk_arr_type): """Internal function used to create a VTK data array from another VTK array given the VTK array type. """ tmp = vtk.vtkDataArray.CreateDataArray(vtk_arr_type) # CreateDataArray sets the refcount to 3 and this causes a severe # memory leak. tmp.SetReferenceCount(BASE_REFERENCE_COUNT) return tmp def array2vtk(num_array, vtk_array=None): """Converts a real numpy Array (or a Python list) to a VTK array object. This function only works for real arrays. Complex arrays are NOT handled. It also works for multi-component arrays. However, only 1, and 2 dimensional arrays are supported. This function is very efficient, so large arrays should not be a problem. Even in cases when no copy of the numpy array data is performed, a reference to the array is cached. The passed array can therefore be deleted safely in all circumstances. Parameters ---------- - num_array : numpy array or Python list/tuple The input array must be 1 or 2D. A copy of the numeric array data passed is made in the following circumstances: 1. A Python list/tuple was passed. 2. A non-contiguous numpy array was passed. 3. A `vtkBitArray` instance was passed as the second argument. 4. The types of the `vtk_array` and the `num_array` are not equivalent to each other. For example if one is an integer array and the other a float. - vtk_array : `vtkDataArray` (default: `None`) If an optional `vtkDataArray` instance, is passed as an argument then a new array is not created and returned. The passed array is itself returned. """ z = numpy.asarray(num_array) shape = z.shape assert len(shape) < 3, \ "Only arrays of dimensionality 2 or lower are allowed!" assert not numpy.issubdtype(z.dtype, complex), \ "Complex numpy arrays cannot be converted to vtk arrays."\ "Use real() or imag() to get a component of the array before"\ " passing it to vtk." # First create an array of the right type by using the typecode. # Bit arrays need special casing. bit_array = False if vtk_array is None: vtk_typecode = get_vtk_array_type(z.dtype) result_array = create_vtk_array(vtk_typecode) elif vtk_array.GetDataType() == vtkConstants.VTK_BIT: vtk_typecode = vtkConstants.VTK_CHAR result_array = create_vtk_array(vtkConstants.VTK_CHAR) bit_array = True else: vtk_typecode = vtk_array.GetDataType() result_array = vtk_array # Find the shape and set number of components. if len(shape) == 1: result_array.SetNumberOfComponents(1) else: result_array.SetNumberOfComponents(shape[1]) result_array.SetNumberOfTuples(shape[0]) # Ravel the array appropriately. arr_dtype = get_numeric_array_type(vtk_typecode) if numpy.issubdtype(z.dtype, arr_dtype): z_flat = numpy.ravel(z) else: z_flat = numpy.ravel(z).astype(arr_dtype) # Point the VTK array to the numpy data. The last argument (1) # tells the array not to deallocate. result_array.SetVoidArray(getbuffer(z_flat), len(z_flat), 1) if bit_array: # Handle bit arrays -- they have to be copied. Note that bit # arrays are used ONLY when the user has passed one as an # argument to this function. vtk_array.SetNumberOfTuples(result_array.GetNumberOfTuples()) vtk_array.SetNumberOfComponents(result_array.GetNumberOfComponents()) for i in range(result_array.GetNumberOfComponents()): vtk_array.CopyComponent(i, result_array, i) result_array = vtk_array else: # Save a reference to the flatted array in the array cache. # This prevents the user from deleting or resizing the array # and getting into serious trouble. This is only done for # non-bit array cases where the data is not copied. global _array_cache _array_cache.add(result_array, z_flat) return result_array def vtk2array(vtk_array): """Converts a VTK data array to a numpy array. Given a subclass of vtkDataArray, this function returns an appropriate numpy array containing the same data. The function is very efficient since it uses the VTK imaging pipeline to convert the data. If a sufficiently new version of VTK (5.2) is installed then it actually uses the buffer interface to return a view of the VTK array in the returned numpy array. Parameters ---------- - vtk_array : `vtkDataArray` The VTK data array to be converted. """ typ = vtk_array.GetDataType() assert typ in get_vtk_to_numeric_typemap().keys(), \ "Unsupported array type %s"%typ shape = vtk_array.GetNumberOfTuples(), \ vtk_array.GetNumberOfComponents() if shape[0] == 0: dtype = get_numeric_array_type(typ) return numpy.array([], dtype) # First check if this array already has a numpy array cached, # if it does and the array size has not been changed, reshape # that and return it. if vtk_array in _array_cache: arr = _array_cache.get(vtk_array) if shape[1] == 1: shape = (shape[0], ) if arr.size == numpy.prod(shape): arr = numpy.reshape(arr, shape) return arr # If VTK's new numpy support is available, use the buffer interface. if numpy_support is not None and typ != vtkConstants.VTK_BIT: dtype = get_numeric_array_type(typ) result = numpy.frombuffer(vtk_array, dtype=dtype) if shape[1] == 1: shape = (shape[0], ) result.shape = shape return result # Setup an imaging pipeline to export the array. img_data = vtk.vtkImageData() img_data.SetDimensions(shape[0], 1, 1) if typ == vtkConstants.VTK_BIT: iarr = vtk.vtkCharArray() iarr.DeepCopy(vtk_array) img_data.GetPointData().SetScalars(iarr) elif typ == vtkConstants.VTK_ID_TYPE: # Needed since VTK_ID_TYPE does not work with VTK 4.5. iarr = vtk.vtkLongArray() iarr.SetNumberOfTuples(vtk_array.GetNumberOfTuples()) nc = vtk_array.GetNumberOfComponents() iarr.SetNumberOfComponents(nc) for i in range(nc): iarr.CopyComponent(i, vtk_array, i) img_data.GetPointData().SetScalars(iarr) else: img_data.GetPointData().SetScalars(vtk_array) if is_old_pipeline(): img_data.SetNumberOfScalarComponents(shape[1]) if typ == vtkConstants.VTK_ID_TYPE: # Hack necessary because vtkImageData can't handle VTK_ID_TYPE. img_data.SetScalarType(vtkConstants.VTK_LONG) r_dtype = get_numeric_array_type(vtkConstants.VTK_LONG) elif typ == vtkConstants.VTK_BIT: img_data.SetScalarType(vtkConstants.VTK_CHAR) r_dtype = get_numeric_array_type(vtkConstants.VTK_CHAR) else: img_data.SetScalarType(typ) r_dtype = get_numeric_array_type(typ) img_data.Update() else: if typ == vtkConstants.VTK_ID_TYPE: r_dtype = get_numeric_array_type(vtkConstants.VTK_LONG) elif typ == vtkConstants.VTK_BIT: r_dtype = get_numeric_array_type(vtkConstants.VTK_CHAR) else: r_dtype = get_numeric_array_type(typ) img_data.Modified() exp = vtk.vtkImageExport() if is_old_pipeline(): exp.SetInput(img_data) else: exp.SetInputData(img_data) # Create an array of the right size and export the image into it. im_arr = numpy.empty((shape[0]*shape[1],), r_dtype) exp.Export(im_arr) # Now reshape it. if shape[1] == 1: shape = (shape[0], ) im_arr = numpy.reshape(im_arr, shape) return im_arr def array2vtkCellArray(num_array, vtk_array=None): """Given a nested Python list or a numpy array, this method creates a vtkCellArray instance and returns it. A variety of input arguments are supported as described in the Parameter documentation. If numpy arrays are given, this method is highly efficient. This function is most efficient if the passed numpy arrays have a typecode `ID_TYPE_CODE`. Otherwise a typecast is necessary and this involves an extra copy. This method *always copies* the input data. An alternative and more efficient way to build the connectivity list is to create a vtkIdTypeArray having data of the form (npts,p0,p1,...p(npts-1), repeated for each cell) and then call .SetCells(n_cell, id_list). Parameters ---------- - num_array : numpy array or Python list/tuple Valid values are: 1. A Python list of 1D lists. Each 1D list can contain one cell connectivity list. This is very slow and is to be used only when efficiency is of no consequence. 2. A 2D numpy array with the cell connectivity list. 3. A Python list of 2D numpy arrays. Each numeric array can have a different shape. This makes it easy to generate a cell array having cells of different kinds. - vtk_array : `vtkCellArray` (default: `None`) If an optional `vtkCellArray` instance, is passed as an argument then a new array is not created and returned. The passed array is itself modified and returned. Example ------- >>> a = [[0], [1, 2], [3, 4, 5], [6, 7, 8, 9]] >>> cells = array_handler.array2vtkCellArray(a) >>> a = numpy.array([[0,1,2], [3,4,5], [6,7,8]], 'l') >>> cells = array_handler.array2vtkCellArray(a) >>> l_a = [a[:,:1], a[:2,:2], a] >>> cells = array_handler.array2vtkCellArray(l_a) """ if vtk_array: cells = vtk_array else: cells = vtk.vtkCellArray() assert cells.GetClassName() == 'vtkCellArray', \ 'Second argument must be a `vtkCellArray` instance.' if len(num_array) == 0: return cells ######################################## # Internal functions. def _slow_array2cells(z, cells): cells.Reset() vtk_ids = vtk.vtkIdList() for i in z: vtk_ids.Reset() for j in i: vtk_ids.InsertNextId(j) cells.InsertNextCell(vtk_ids) def _get_tmp_array(arr): try: tmp_arr = numpy.asarray(arr, ID_TYPE_CODE) except TypeError: tmp_arr = arr.astype(ID_TYPE_CODE) return tmp_arr def _set_cells(cells, n_cells, id_typ_arr): vtk_arr = vtk.vtkIdTypeArray() array2vtk(id_typ_arr, vtk_arr) cells.SetCells(n_cells, vtk_arr) ######################################## msg = "Invalid argument. Valid types are a Python list of lists,"\ " a Python list of numpy arrays, or a numpy array." if issubclass(type(num_array), (list, tuple)): assert len(num_array[0]) > 0, "Input array must be 2D." tp = type(num_array[0]) if issubclass(tp, list): # Pure Python list. _slow_array2cells(num_array, cells) return cells elif issubclass(tp, numpy.ndarray): # List of arrays. # Check shape of array and find total size. tot_size = 0 n_cells = 0 for arr in num_array: assert len(arr.shape) == 2, "Each array must be 2D" shp = arr.shape tot_size += shp[0]*(shp[1] + 1) n_cells += shp[0] # Create an empty array. id_typ_arr = numpy.empty((tot_size,), ID_TYPE_CODE) # Now populate it with the ids. count = 0 for arr in num_array: tmp_arr = _get_tmp_array(arr) shp = arr.shape sz = shp[0]*(shp[1] + 1) set_id_type_array(tmp_arr, id_typ_arr[count:count+sz]) count += sz # Now set them cells. _set_cells(cells, n_cells, id_typ_arr) return cells else: raise TypeError(msg) elif issubclass(type(num_array), numpy.ndarray): assert len(num_array.shape) == 2, "Input array must be 2D." tmp_arr = _get_tmp_array(num_array) shp = tmp_arr.shape id_typ_arr = numpy.empty((shp[0]*(shp[1] + 1),), ID_TYPE_CODE) set_id_type_array(tmp_arr, id_typ_arr) _set_cells(cells, shp[0], id_typ_arr) return cells else: raise TypeError(msg) def array2vtkPoints(num_array, vtk_points=None): """Converts a numpy array/Python list to a vtkPoints object. Unless a Python list/tuple or a non-contiguous array is given, no copy of the data is made. Thus the function is very efficient. Parameters ---------- - num_array : numpy array or Python list/tuple The input array must be 2D with `shape[1] == 3`. - vtk_points : `vtkPoints` (default: `None`) If an optional `vtkPoints` instance, is passed as an argument then a new array is not created and returned. The passed array is itself modified and returned. """ if vtk_points: points = vtk_points else: points = vtk.vtkPoints() arr = numpy.asarray(num_array) assert len(arr.shape) == 2, "Points array must be 2 dimensional." assert arr.shape[1] == 3, "Incorrect shape: shape[1] must be 3." vtk_array = array2vtk(arr) points.SetData(vtk_array) return points def array2vtkIdList(num_array, vtk_idlist=None): """Converts a numpy array/Python list to a vtkIdList object. Parameters ---------- - num_array : numpy array or Python list/tuple The input array must be 2D with `shape[1] == 3`. - vtk_idlist : `vtkIdList` (default: `None`) If an optional `vtkIdList` instance, is passed as an argument then a new array is not created and returned. The passed array is itself modified and returned. """ if vtk_idlist: ids = vtk_idlist else: ids = vtk.vtkIdList() arr = numpy.asarray(num_array) assert len(arr.shape) == 1, "Array for vtkIdList must be 1D" ids.SetNumberOfIds(len(arr)) for i, j in enumerate(arr): ids.SetId(i, j) return ids ###################################################################### # Array argument handling functions. ###################################################################### def is_array(arr): """Returns True if the passed `arr` is a numpy array or a List.""" if issubclass(type(arr), (numpy.ndarray, list)): return True return False def convert_array(arr, vtk_typ=None): """Convert the given array to the optional type specified by `vtk_typ`. Parameters ---------- - arr : numpy array/list. - vtk_typ : `string` or `None` represents the type the array is to be converted to. """ if vtk_typ: conv = {'vtkCellArray': array2vtkCellArray, 'vtkPoints': array2vtkPoints, 'vtkIdList': array2vtkIdList} if vtk_typ in conv.keys(): vtk_arr = getattr(vtk, vtk_typ)() return conv[vtk_typ](arr, vtk_arr) elif vtk_typ.find('Array') > -1: try: vtk_arr = getattr(vtk, vtk_typ)() except TypeError: # vtk_typ == 'vtkDataArray' return array2vtk(arr) else: return array2vtk(arr, vtk_arr) else: return arr else: return array2vtk(arr) def is_array_sig(s): """Given a signature, return if the signature has an array.""" if not isinstance(s, (unicode, str)): return False arr_types = ['Array', 'vtkPoints', 'vtkIdList'] for i in arr_types: if s.find(i) > -1: return True return False def is_array_or_vtkarray(arg): """Returns True if the argument is an array/Python list or if it is a vtk array.""" if is_array(arg): return True else: if hasattr(arg, '_vtk_obj'): if is_array_sig(arg._vtk_obj.__class__.__name__): return True return False def get_correct_sig(args, sigs): """Given a list of args and a collection of possible signatures, this function returns the most appropriate signature. This function is only called by deref_array. This implies that one of the signatures has an array type. """ # First do the trivial cases. if sigs is None: return None if len(sigs) == 1: return sigs[0] else: # Non-trivial cases. la = len(args) candidate_sigs = [s for s in sigs if len(s) == la] count = len(candidate_sigs) if count == 0: # No sig has the right number of args. msg = "Insufficient number of arguments to method."\ "Valid arguments are:\n%s"%sigs raise TypeError(msg) elif count == 1: # If only one of the sigs has the right number of args, # return it. return candidate_sigs[0] else: # More than one sig has the same number of args. # Check if args need conversion at all. array_idx = [i for i, a in enumerate(args) \ if is_array_or_vtkarray(a)] n_arr = len(array_idx) if n_arr == 0: # No conversion necessary so signature info is # useless. return None else: # Need to find the right sig. This is done by finding # the first signature that matches all the arrays in # the argument. for sig in candidate_sigs: array_in_sig = [is_array_sig(s) for s in sig] if array_in_sig.count(True) != len(array_idx): continue bad = False for i in array_idx: if not array_in_sig[i]: bad = True if not bad: return sig # Could not find any valid signature, so give up. return None def deref_vtk(obj): """Dereferences the VTK object from the object if possible. This is duplicated from `tvtk_base.py` because I'd like to keep this module independent of `tvtk_base.py`. """ if hasattr(obj, '_vtk_obj'): return obj._vtk_obj else: return obj def deref_array(args, sigs=None): """Given a bunch of arguments and optional signature information, this converts the arguments suitably. If the argument is either a Python list or a numpy array it is converted to a suitable type based on the signature information. If it is not an array, but a TVTK object the VTK object is dereferenced. Otherwise nothing is done. If no signature information is provided the arrays are automatically converted (this can sometimes go wrong). The signature information is provided in the form of a list of lists. """ ret = [] sig = get_correct_sig(args, sigs) if sig: for a, s in zip(args, sig): if is_array(a) and is_array_sig(s): ret.append(convert_array(a, s)) else: ret.append(deref_vtk(a)) else: for a in args: if is_array(a): ret.append(convert_array(a)) else: ret.append(deref_vtk(a)) return ret mayavi-4.5.0/tvtk/class_tree.py0000644000076500000240000002000012747716314017104 0ustar prabhustaff00000000000000# Author: Prabhu Ramachandran # Copyright (c) 2004-2015, Enthought, Inc. # License: BSD Style. """This module generates the class hierarchy for any given Python modules. This can be used (among other things) to generate the traitified VTK classes in the correct order. """ import sys if sys.version_info[0] > 2: import builtins else: import __builtin__ as builtins class TreeNode: """Represents a node in the class tree. Stores information on the sub and super classes of a particular class. It also stores the inheritance level of the class inside the inheritance tree (essentially how many levels of inheritance are there below this class). This inheritance level is computed when the `get_level` method is called. The `get_level` method works only when the parent information is complete. """ def __init__(self, klass): """Given a class, create a node in the tree. Parameters ---------- - klass : `class` The class which is represented as a node in the tree. """ self.klass = klass self.name = klass.__name__ self.children = [] self.parents = [] # Uninitialized level is set to None self.level = None def add_parent(self, parent): """Add a parent node.""" assert isinstance(parent, TreeNode) if parent not in self.parents: self.parents.append(parent) def add_child(self, child): """Add a child node. """ assert isinstance(child, TreeNode) if child not in self.children: self.children.append(child) def get_level(self): """Returns the inheritance level of the node (an int). If the level has not been set, the method computes it. Note however, that this computation will fail if the parent information is incorrect. """ if not self.level: if self.parents: self.level = max([x.get_level() for x in self.parents]) + 1 else: self.level = 0 return self.level def get_ancestors(self): """Returns a list of ancestor nodes from which this class has descended. """ def _get_ancestors(node, ancestors): ancestors.extend(node.parents) for p in node.parents: _get_ancestors(p, ancestors) ancestors = [] _get_ancestors(self, ancestors) return ancestors class ClassTree: """Contains and generates all the class tree information. On initialization of the instance, nothing is done. The classes are obtained using the list of modules (or a single module) that is used to initialize the instance. One must then call the `create` method to generate the tree structure. The instance of the class also can be treated as an iterator which iterates over the nodes of the tree. There are two ways in which the tree hierarchy is stored. A dictionary mapping class names to the tree node and a tree represented as a list of lists containing the nodes. The tree is organized based on a concept of an inheritance level. A class that has no parent classes (no base classes) is said to be at level zero. If a class inherits successively from 7 classes, it is at level 6. An example of inheritance for a vtkFoo class is given below: vtkFoo -> vtkBar -> vtkObject -> vtkObjectBase Here, vtkObjectBase has an inheritance level of 0 and vtkFoo a level of 3. One can traverse the tree by using the level as an index and find all the classes at a particular level. Here is some example usage of this class:: >>> import vtk >>> t = ClassTree(vtk) >>> t.create() >>> print t.get_node('vtkObject').name vtkObject >>> print t.get_node('vtkObject').parents[0].name vtkObjectBase >>> print len(t.tree[0]) 1 >>> t.tree[0][0].name vtkObjectBase """ def __init__(self, modules): """Initialize the instance with the given modules. Parameters ---------- - modules : `sequence` of modules or a module This is either a single module or a sequence of modules. The instance uses these list of modules to generate the class tree. """ self.nodes = {} self.tree = [[]] if not hasattr(modules, '__iter__'): self.modules = [modules] else: self.modules = modules def __iter__(self): return iter(self.nodes.values()) def _generate_hierarchy(self, klass): """Does the hard work of generating the class hierarchy.""" node = self.get_node(klass.__name__, create=1) for base in klass.__bases__: base_node = self.get_node_from_class(base, create=1) node.add_parent(base_node) base_node.add_child(node) self._generate_hierarchy(base) def get_class(self, name): """Given a class name in the given modules returns the class.""" klass = None for m in self.modules: if hasattr(m, name): return getattr(m, name) if hasattr(builtins, name): klass = getattr(builtins, name) if not klass: try: klass = self.nodes[name].klass except KeyError: raise KeyError("Cannot find class of name %s"%name) return klass def add_node(self, klass): """Create a node for the given class.""" name = klass.__name__ if not name in self.nodes: node = TreeNode(klass) self.nodes[name] = node return node def get_node(self, name, create=0): """Get a node of the given name. Parameters ---------- - name : `str` Name of the node to get. - create : `boolean` If True, a new node will be added if no node of the given name is available. Defaults to False. Returns ------- - `TreeNode` """ if name in self.nodes: return self.nodes[name] elif create: return self.add_node(self.get_class(name)) def get_node_from_class(self, cls, create=0): """Get a node of the given class. Parameters ---------- - cls : `class` Class of the node to get. - create : `boolean` If True, a new node will be added if no node of the given name is available. Defaults to False. Returns ------- - `TreeNode` """ name = cls.__name__ if name in self.nodes: return self.nodes[name] elif create: return self.add_node(cls) def create(self, class_names=None): """This method generates the class tree given an optional list of class names. Parameters ---------- - class_names - `list` of `str` An optional list of names of the classes to generate the tree for. Defaults to None where the class list is computed from the modules. """ if class_names is None: class_names = [] for m in self.modules: class_names.extend(dir(m)) # Generate the nodes. for name in class_names: if ('.' in name): # With VTK 6.x and above there are strange names # in the vtk module which we ignore. continue klass = self.get_class(name) if klass and hasattr(klass, '__bases__'): self._generate_hierarchy(klass) # Compute the inheritance level and store the nodes in the tree. for node in self: d = node.get_level() while len(self.tree) <= d: self.tree.append([]) self.tree[d].append(node) # Sort the nodes alphabetically. for nodes in self.tree: nodes.sort(key=lambda x:x.name) mayavi-4.5.0/tvtk/code_gen.py0000644000076500000240000002264012747716314016537 0ustar prabhustaff00000000000000"""This module generates tvtk (Traited VTK) classes from the VTK-Python API. """ # Author: Prabhu Ramachandran # Copyright (c) 2004-2015, Enthought, Inc. # License: BSD Style. from __future__ import print_function import vtk import os import os.path import zipfile import tempfile import shutil import glob import logging from optparse import OptionParser # Local imports -- these should be relative imports since these are # imported before the package is installed. try: from .common import get_tvtk_name, camel2enthought from .wrapper_gen import WrapperGenerator from .special_gen import HelperGenerator except SystemError: from common import get_tvtk_name, camel2enthought from wrapper_gen import WrapperGenerator from special_gen import HelperGenerator logger = logging.getLogger(__name__) ###################################################################### # `TVTKGenerator` ###################################################################### class TVTKGenerator: """Generates all the TVTK code.""" def __init__(self, out_dir=''): """Initializes the instance. Parameters ---------- - out_dir - `string` The output directory to generate code in. The directory is created if it does not exist. A directory called `tvtk_classes` is created inside this directory and all the code is written here. Any existing code there is blindly overwritten. If no out_dir is specified, a temporary one is created using `tempfile.mkdtemp`. """ if not out_dir: out_dir = tempfile.mkdtemp() self.out_dir = os.path.join(out_dir, 'tvtk_classes') if not os.path.exists(self.out_dir): os.makedirs(self.out_dir) self.zip_name = 'tvtk_classes.zip' self.wrap_gen = WrapperGenerator() self.helper_gen = HelperGenerator() ################################################################# # `TVTKGenerator` interface. ################################################################# def generate_code(self): """Generate all the wrapper code in `self.out_dir`. """ out_dir = self.out_dir helper_gen = self.helper_gen wrap_gen = self.wrap_gen # Create an __init__.py file with open(os.path.join(out_dir, '__init__.py'), 'w'): pass # Crete a vtk_version.py file that contains VTK build # information. v = vtk.vtkVersion() vtk_version = v.GetVTKVersion()[:3] vtk_src_version = v.GetVTKSourceVersion() code ="vtk_build_version = \'%s\'\n"%(vtk_version) code += "vtk_build_src_version = \'%s\'\n"%(vtk_src_version) with open(os.path.join(out_dir, 'vtk_version.py'), 'w') as f: f.write(code) # Write the helper code header. with open(os.path.join(out_dir, 'tvtk_helper.py'), 'w') as helper_file: helper_gen.write_prelims(helper_file) # Write the wrapper files. tree = wrap_gen.get_tree().tree classes = [] for node in wrap_gen.get_tree(): name = node.name if not name.startswith('vtk') or name.startswith('vtkQt'): continue if not hasattr(vtk, name) or not hasattr(getattr(vtk, name), 'IsA'): # noqa # We need to wrap VTK classes that are derived # from vtkObjectBase, the others are # straightforward VTK classes that can be used as # such. All of these have an 'IsA' method so we # check for that. Only the vtkObjectBase # subclasses support observers etc. and hence only # those make sense to wrap into TVTK. continue classes.append(name) for nodes in tree: for node in nodes: if node.name in classes: tvtk_name = get_tvtk_name(node.name) logger.debug( 'Wrapping %s as %s' % (node.name, tvtk_name)) self._write_wrapper_class(node, tvtk_name) helper_gen.add_class(tvtk_name, helper_file) def write_wrapper_classes(self, names): """Given VTK class names in the list `names`, write out the wrapper classes to a suitable file. This is a convenience method so one can generate a just a few of the wrapper classes if desired. This is useful when debugging. Please note that the method also generates code for all the ancestors of the specified classes. """ # Wrappers for the ancesors are generated in order to get the # _updateable_traits_ information correctly. nodes = [] for name in names: node = self.wrap_gen.get_tree().get_node(name) if node is None: print('ERROR: Cannot find class: %s' % name) nodes.append(node) # Get ancestors. for node in nodes[:]: anc = node.get_ancestors() for i in anc: if i not in nodes: nodes.insert(0, i) # Sort them as per their level. nodes.sort(lambda x, y: cmp(x.level, y.level)) # Write code. for node in nodes: tvtk_name = get_tvtk_name(node.name) self._write_wrapper_class(node, tvtk_name) def build_zip(self, include_src=False): """Build the zip file (with name `self.zip_name`) in the current directory. Parameters ---------- include_src : `bool` (default: False) If True, also includes all the ``*.py`` files in the ZIP file. By default only the ``*.pyc`` files are included. """ cwd = os.getcwd() d = os.path.dirname(self.out_dir) os.chdir(d) z = zipfile.PyZipFile(self.zip_name, 'w', zipfile.ZIP_DEFLATED) if include_src: l = glob.glob(os.path.join('tvtk_classes', '*.py')) for x in l: fname = os.path.basename(x) z.write(x, 'tvtk_classes/%s' % fname) z.writepy('tvtk_classes') z.close() if os.path.exists(cwd + "/" + self.zip_name): os.unlink(cwd + "/" + self.zip_name) shutil.move(self.zip_name, cwd) os.chdir(cwd) def clean(self): """Delete the temporary directory where the code has been generated. """ tmp_dir = os.path.dirname(self.out_dir) d = os.listdir(tmp_dir) ok = 0 if len(d) == 1 and d[0] == 'tvtk_classes': ok = 1 if ok: shutil.rmtree(tmp_dir) else: print("Not removing directory:", tmp_dir) print("It does not contain a tvtk_classes directory!") ################################################################# # Non-public interface. ################################################################# def _write_wrapper_class(self, node, tvtk_name): """Write the wrapper code to a file.""" # The only reason this method is separate is to generate code # for an individual class when debugging. fname = camel2enthought(tvtk_name) + '.py' out = open(os.path.join(self.out_dir, fname), 'w') self.wrap_gen.generate_code(node, out) out.close() ###################################################################### # Utility functions. ###################################################################### def main(): usage = """usage: %prog [options] [vtk_classes] The options are described below. An optional list of VTK classes for which code is to be generated may be specified. If none are specified code will be generated for all the VTK classes. """ parser = OptionParser(usage) parser.add_option( "-o", "--output-dir", action="store", type="string", dest="out_dir", default='', help="Output directory in which to generate code.") parser.add_option( "-n", "--no-clean", action="store_false", dest="clean", default=True, help="Do not clean the temporary directory.") parser.add_option( "-z", "--no-zipfile", action="store_false", dest="zip", default=True, help="Do not create a ZIP file.") parser.add_option( "-s", "--source", action="store_true", dest="src", default=False, help="Include source files (*.py) in " "addition to *.pyc files in the ZIP file.") parser.add_option( "-v", "--verbose", action="store_true", dest="verbose", default=False, help="Verbose output for debugging") (options, args) = parser.parse_args() if options.verbose: # Log to console logger = logging.getLogger() logger.setLevel(logging.DEBUG) ch = logging.StreamHandler() ch.setLevel(logging.DEBUG) formatter = logging.Formatter( '%(asctime)s - %(name)s - %(levelname)s - %(message)s') ch.setFormatter(formatter) logger.addHandler(ch) # Now do stuff. gen = TVTKGenerator(options.out_dir) if len(args) == 0: gen.generate_code() else: gen.write_wrapper_classes(args) if options.zip: gen.build_zip(options.src) if options.clean: gen.clean() if __name__ == '__main__': main() mayavi-4.5.0/tvtk/common.py0000644000076500000240000001070112747716314016257 0ustar prabhustaff00000000000000"""Common functions and classes. """ # Author: Prabhu Ramachandran # Copyright (c) 2005-2015, Enthought, Inc. # License: BSD Style. import os import string import sys import re import vtk vtk_major_version = vtk.vtkVersion.GetVTKMajorVersion() vtk_minor_version = vtk.vtkVersion.GetVTKMinorVersion() ###################################################################### # Utility functions. ###################################################################### def get_tvtk_name(vtk_name): """Converts a VTK class name to a TVTK class name. This function additionally converts any leading digits into a suitable string. For example: >>> get_tvtk_name('vtk3DSImporter') 'ThreeDSImporter' >>> get_tvtk_name('vtkXMLDataReader') 'XMLDataReader' """ if vtk_name[:3] == 'vtk': name = vtk_name[3:] dig2name = {'1':'One', '2':'Two', '3':'Three', '4':'Four', '5':'Five', '6': 'Six', '7':'Seven', '8':'Eight', '9': 'Nine', '0':'Zero'} if name[0] in string.digits: return dig2name[name[0]] + name[1:] else: return name else: return vtk_name def is_old_pipeline(): return vtk_major_version < 6 def is_version_7(): return vtk_major_version > 6 def is_version_62(): return vtk_major_version == 6 and vtk_minor_version == 2 def is_version_58(): return vtk_major_version == 5 and vtk_minor_version == 8 def configure_connection(obj, inp): """ Configure topology for vtk pipeline obj.""" if hasattr(inp, 'output_port'): obj.input_connection = inp.output_port elif inp.has_output_port(): obj.input_connection = inp.get_output_object() else: configure_input(obj, inp.outputs[0]) def configure_input_data(obj, data): """ Configure the input data for vtk pipeline object obj.""" if is_old_pipeline(): obj.input = data else: obj.set_input_data(data) def configure_port_input_data(obj, port, data): """ Configure the input data for vtk pipeline object obj at port.""" if is_old_pipeline(): obj.set_input(port, data) else: obj.set_input_data(port, data) def configure_input(inp, op): """ Configure the inp using op.""" if is_old_pipeline(): if op.is_a('vtkDataSet'): inp.input = op else: inp.input = op.output else: if hasattr(op, 'output_port'): if hasattr(inp, 'input_connection'): inp.input_connection = op.output_port elif hasattr(inp, 'set_input_connection'): inp.set_input_connection(op.output_port) elif op.is_a('vtkAlgorithmOutput'): inp.input_connection = op elif op.is_a('vtkDataSet'): inp.set_input_data(op) else: raise ValueError('Unknown input type for object %s'%op) def configure_outputs(obj, tvtk_obj): if is_old_pipeline(): obj.outputs = [tvtk_obj.output] else: if hasattr(tvtk_obj, 'output_port'): obj.outputs = [tvtk_obj.output_port] else: obj.outputs = [tvtk_obj] def configure_source_data(obj, data): """ Configure the source data for vtk pipeline object obj.""" if is_old_pipeline(): obj.source = data else: if data.is_a('vtkAlgorithmOutput'): obj.set_source_connection(data) elif hasattr(data, 'output_port'): obj.set_source_connection(data.output_port) else: obj.set_source_data(data) class _Camel2Enthought: """Simple functor class to convert names from CamelCase to Enthought compatible names. For example:: >>> camel2enthought = _Camel2Enthought() >>> camel2enthought('XMLActor2DToSGML') 'xml_actor2d_to_sgml' """ def __init__(self): self.patn = re.compile(r'([A-Z0-9]+)([a-z0-9]*)') self.nd_patn = re.compile(r'(\D[123])_D') def __call__(self, name): ret = self.patn.sub(self._repl, name) ret = self.nd_patn.sub(r'\1d', ret) if ret[0] == '_': ret = ret[1:] return ret.lower() def _repl(self, m): g1 = m.group(1) g2 = m.group(2) if len(g1) > 1: if g2: return '_' + g1[:-1] + '_' + g1[-1] + g2 else: return '_' + g1 else: return '_' + g1 + g2 # Instantiate a converter. camel2enthought = _Camel2Enthought() mayavi-4.5.0/tvtk/custom/0000755000076500000240000000000012747722127015727 5ustar prabhustaff00000000000000mayavi-4.5.0/tvtk/custom/__init__.py0000644000076500000240000000013712747716314020042 0ustar prabhustaff00000000000000# Author: Prabhu Ramachandran # Copyright (c) 2004-2007, Enthought, Inc. # License: BSD Style. mayavi-4.5.0/tvtk/indenter.py0000644000076500000240000002057712747716314016613 0ustar prabhustaff00000000000000"""This module defines an indenter class that handles indentation levels for automatic code generation. It also defines other miscellaneous classes useful for the tvtk code generation. """ # Author: Prabhu Ramachandran # Copyright (c) 2004-2015, Enthought, Inc. # License: BSD Style. import re # Local imports (there is a good reason for the relative imports). from .common import get_tvtk_name, camel2enthought ###################################################################### # `Indent` class. ###################################################################### class Indent: """This class manages indentation levels for dynamically generated Python code. The class also provides a method that formats a text string suitably at a given indentation level. """ def __init__(self, nspace=4): """Initializes the object. Parameters ---------- - nspace : `int` Specifies the number of spaces to use for each indentation level. Defaults to 4. """ self.tab = '' self.txt = '' self.nspace = 0 self.set_tab(nspace) self.space_re = re.compile(r'^\s*$') self.find_space_re = re.compile(r'\s*(\S)') def __repr__(self): return self.txt def set_tab(self, nspace): """Set the number of spaces a tab represents.""" self.nspace = nspace self.tab = ' '*nspace def reset(self): """Reset the indentation level to 0.""" self.txt = '' def incr(self): """Increase the indentation level.""" self.txt += self.tab def decr(self): """Decrease the indentation level.""" self.txt = self.txt[:-self.nspace] def format(self, txt): """Formats given text as per current indentation levels. Note that the returned string always ends with a newline to avoid problems for subsequent lines in the output that have to deal trailing garbage in the last line. Parameters ---------- - txt : `string` Input text string to be formatted. Can contain newlines. If the input text is a single line of text then leading space is stripped and the current indentation is added to the left along with a newline and the resulting string is returned. If the input text is multi-line input the indentation of the first line is ignored, and the second line is considered. All subsequent lines have the current indentation followed by any extra space from the default indentation. """ space_re = self.space_re find_space_re = self.find_space_re d = txt.split('\n') one_liner = 1 if len(d) > 1: for i in d[1:]: if not space_re.match(i): one_liner = 0 break elif len(d) == 0: return '\n' if one_liner: return '%s%s\n'%(repr(self), d[0].strip()) else: strip_idx = 0 m = find_space_re.match(d[1]) try: strip_idx = m.start(1) except AttributeError: strip_idx = 0 ret = [] if not space_re.match(d[0]): ret.append('%s%s'%(repr(self), d[0])) for i in d[1:]: if i: ret.append('%s%s'%(repr(self), i[strip_idx:])) else: ret.append(repr(self)) if space_re.match(ret[-1]): ret[-1] = '' else: ret.append('') return '\n'.join(ret) ###################################################################### # `VTKDocMassager` class. ###################################################################### class VTKDocMassager: """This class massages the documentation strings suitably for inclusion in the TVTK code. The names of all the VTK classes are changed suitably and when possible the method names are also changed. This class is *not* generic and is *very* specific to VTK documentation strings. """ def __init__(self): self.renamer = re.compile(r'(vtk[A-Z0-9]\S+)') self.ren_func = lambda m: get_tvtk_name(m.group(1)) self.func_re = re.compile(r'([a-z0-9]+[A-Z])') self.cpp_method_re = re.compile(r'C\+\+: .*?;\n*') ################################################################# # `VTKDocMassager` interface. ################################################################# def write_class_doc(self, doc, out, indent): """Write processed class documentation string into `out`. Parameters ---------- - doc : `string` The documentation string. - out : file line object. - indent : `Indent` """ ret = self.massage(doc) indent.incr() out.write(indent.format('"""')) out.write(indent.format('\n' + ret)) out.write(indent.format('"""')) indent.decr() def write_trait_doc(self, doc, out, indent): """Write processed trait documentation string into `out`. This method removes the call signature information from the method. Parameters ---------- - doc : `string` The documentation string. - out : file line object. - indent : `Indent` """ ret = self._remove_sig(doc) indent.incr() out.write(indent.format('"""')) out.write(indent.format('\n'+self.massage(ret))) out.write(indent.format('"""')) indent.decr() def write_method_doc(self, doc, out, indent): """Write processed method documentation string into `out`. The method signature is appopriately massaged. Parameters ---------- - doc : `string` The documentation string. - out : file line object. - indent : `Indent` """ orig_name = doc[2:doc.find('(')] name = camel2enthought(orig_name) my_sig = self._rename_class(doc[:doc.find('\n\n')]) my_sig = self.cpp_method_re.sub('', my_sig) my_sig = my_sig.replace('V.'+orig_name, 'V.'+name) indent.incr() out.write(indent.format('"""')) out.write(indent.format(my_sig)) ret = self._remove_sig(doc) if ret: out.write('\n') out.write(indent.format('\n'+self.massage(ret))) out.write(indent.format('"""')) indent.decr() def get_method_doc(self, doc): """Return processed method documentation string from `doc`. The method signature is appopriately massaged. Parameters ---------- - doc : `string` The documentation string. """ orig_name = doc[2:doc.find('(')] name = camel2enthought(orig_name) my_sig = self._rename_class(doc[:doc.find('\n\n')]) my_sig = self.cpp_method_re.sub('', my_sig) my_sig = my_sig.replace('V.'+orig_name, 'V.'+name) ret = self.massage(self._remove_sig(doc)) if ret: return my_sig + '\n' + ret else: return my_sig def massage(self, doc): """Returns massaged documentation string from passed docstring, `doc`. This method basically renames the methods and classes in the docstring. """ ret = self._rename_methods(doc) ret = self._rename_class(ret) return ret ################################################################# # Non-public interface. ################################################################# def _rename_class(self, doc): return self.renamer.sub(self.ren_func, doc) def _remove_sig(self, doc): idx = doc.find('\n\n') + 2 if len(doc) > idx: return doc[idx:] else: return '' def _rename_methods(self, doc): lines = doc.split('\n') nl = [] for line in lines: words = line.split(' ') nw = [] for word in words: if word[:3] == 'vtk': nw.append(word) else: if self.func_re.search(word): nw.append(camel2enthought(word)) else: nw.append(word) nl.append(' '.join(nw)) return '\n'.join(nl) mayavi-4.5.0/tvtk/messenger.py0000644000076500000240000002362712747716314016772 0ustar prabhustaff00000000000000""" Implements a simple, robust, safe, Messenger class that allows one to register callbacks for a signal/slot (or event/handler) kind of messaging system. One can basically register a callback function/method to be called when an object sends a particular event. The Messenger class is Borg. So it is easy to instantiate and use. This module is also reload-safe, so if the module is reloaded the callback information is not lost. Method callbacks do not have a reference counting problem since weak references are used. The main functionality of this module is provided by three functions, `connect`, `disconnect` and `send`. Here is example usage with VTK:: >>> import messenger, vtk >>> def cb(obj, evt): ... print obj.__class__.__name__, evt ... >>> o = vtk.vtkProperty() >>> o.AddObserver('ModifiedEvent', messenger.send) 1 >>> messenger.connect(o, 'ModifiedEvent', cb) >>> >>> o.SetRepresentation(1) vtkOpenGLProperty ModifiedEvent >>> messenger.connect(o, 'AnyEvent', cb) >>> o.SetRepresentation(2) vtkOpenGLProperty ModifiedEvent vtkOpenGLProperty ModifiedEvent >>> >>> messenger.send(o, 'foo') vtkOpenGLProperty foo >>> messenger.disconnect(o, 'AnyEvent') >>> messenger.send(o, 'foo') >>> This approach is necessary if you don't want to be bitten by reference cycles. If you have a Python object holding a reference to a VTK object and pass a method of the object to the AddObserver call, you will get a reference cycle that cannot be collected by the garbage collector. Using this messenger module gets around the problem. Also note that adding a connection for 'AnyEvent' will trigger a callback no matter what event was generated. The code above also shows how disconnection works. """ # Author: Prabhu Ramachandran # Copyright (c) 2004-2007, Enthought, Inc. # License: BSD Style. __all__ = ['Messenger', 'MessengerError', 'connect', 'disconnect', 'send'] import types import sys import weakref ################################################################# # This code makes the module reload-safe. ################################################################# _saved = {} for name in ['messenger', 'tvtk.messenger']: if name in sys.modules: mod = sys.modules[name] if hasattr(mod, 'Messenger'): _saved = mod.Messenger._shared_data del mod break ################################################################# # `MessengerError` class for exceptions raised by Messenger. ################################################################# class MessengerError(Exception): pass ################################################################# # `Messenger` class. ################################################################# class Messenger: """Implements a messenger class which deals with something like signals and slots. Basically, an object can register a signal that it plans to emit. Any other object can decide to handle that signal (of that particular object) by registering itself with the messenger. When a signal is emitted the messenger calls all handlers. This makes it totally easy to deal with communication between objects. The class is Borg. Rather than use this class, please use the 'connect' and 'disconnect' functions. """ _shared_data = _saved def __init__(self): """Create the messenger. This class is Borg. So all instances are the same. """ self.__dict__ = self._shared_data if not hasattr(self, '_signals'): # First instantiation. self._signals = {} self._catch_all = ['AnyEvent', 'all'] ################################################################# # 'Messenger' interface. ################################################################# def connect(self, obj, event, callback): """ Registers a slot given an object and its signal to slot into and also given a bound method in `callback` that should have two arguments. `send` will call the callback with the object that emitted the signal and the actual event/signal as arguments. Parameters ---------- - obj : Python object Any Python object that will generate the particular event. - event : An event (can be anything, usually strings) The event `obj` will generate. If this is in the list `self._catch_all`, then any event will call this callback. - callback : `function` or `method` This callback will be called when the object generates the particular event. The object, event and any other arguments and keyword arguments given by the `obj` are passed along to the callback. """ typ = type(callback) key = hash(obj) if not key in self._signals: self._signals[key] = {} signals = self._signals[key] if not event in signals: signals[event] = {} slots = signals[event] callback_key = hash(callback) if typ is types.FunctionType: slots[callback_key] = (None, callback) elif typ is types.MethodType: obj = weakref.ref(callback.__self__) name = callback.__name__ slots[callback_key] = (obj, name) else: raise MessengerError( "Callback must be a function or method. "\ "You passed a %s."%(str(callback)) ) def disconnect(self, obj, event=None, callback=None, obj_is_hash=False): """Disconnects the object and its event handlers. Parameters ---------- - obj : Object The object that generates events. - event : The event. (defaults to None) - callback : `function` or `method` The event handler. If `event` and `callback` are None (the default) all the events and handlers for the object are removed. If only `callback` is None, only this handler is removed. If `obj` and 'event' alone are specified, all handlers for the event are removed. - obj_is_hash : `bool` Specifies if the object passed is a hash instead of the object itself. This is needed if the object is gc'd but only the hash exists and one wants to disconnect the object. """ signals = self._signals if obj_is_hash: key = obj else: key = hash(obj) if not key in signals: return if callback is None: if event is None: del signals[key] else: del signals[key][event] else: del signals[key][event][hash(callback)] def send(self, source, event, *args, **kw_args): """To be called by the object `source` that desires to generate a particular event. This function in turn invokes all the handlers for the event passing the `source` object, event and any additional arguments and keyword arguments. If any connected callback is garbage collected without being disconnected, it is silently removed from the existing slots. Parameters ---------- - source : Python object This is the object that generated the event. - event : The event. If there are handlers connected to events called 'AnyEvent' or 'all', then any event will invoke these. """ try: sigs = self._get_signals(source) except (MessengerError, KeyError): return events = self._catch_all[:] if event not in events: events.append(event) for evt in events: if evt in sigs: slots = sigs[evt] for key in list(slots.keys()): obj, meth = slots[key] if obj: # instance method inst = obj() if inst: getattr(inst, meth)(source, event, *args, **kw_args) else: # Oops, dead reference. del slots[key] else: # normal function meth(source, event, *args, **kw_args) def is_registered(self, obj): """Returns if the given object has registered itself with the messenger. """ try: sigs = self._get_signals(obj) except MessengerError: return 0 else: return 1 def get_signal_names(self, obj): """Returns a list of signal names the object passed has registered. """ return list(self._get_signals(obj).keys()) ################################################################# # Non-public interface. ################################################################# def _get_signals(self, obj): """Given an object `obj` it returns the signals of that object. """ ret = self._signals.get(hash(obj)) if ret is None: raise MessengerError( "No such object: %s, has registered itself "\ "with the messenger."%obj ) else: return ret ################################################################# # Convenience functions. ################################################################# _messenger = Messenger() def connect(obj, event, callback): _messenger.connect(obj, event, callback) connect.__doc__ = _messenger.connect.__doc__ def disconnect(obj, event=None, callback=None, obj_is_hash=False): _messenger.disconnect(obj, event, callback) disconnect.__doc__ = _messenger.disconnect.__doc__ def send(obj, event, *args, **kw_args): _messenger.send(obj, event, *args, **kw_args) send.__doc__ = _messenger.send.__doc__ del _saved mayavi-4.5.0/tvtk/misc.py0000644000076500000240000000410412747716314015722 0ustar prabhustaff00000000000000"""Some miscellaneous convenience functionality. """ # Author: Prabhu Ramachandran # Copyright (c) 2007, Enthought, Inc. # License: BSD Style. from os.path import splitext # We import from tvtk.py and not api.py to prevent circular imports. from tvtk.tvtk_access import tvtk from tvtk.common import configure_input_data ###################################################################### # Utility functions. ###################################################################### def write_data(dataset, fname, **kwargs): """Given a TVTK `dataset` this writes the `dataset` to a VTK XML file having file name `fname`. If the given file name has no extension, one is automatically picked based on the dataset and an XML file is written out. If the filename has a '.vtk' extension an old style VTK file is written. If any other extension is specified, an XML file is written out with the given extension. Any additional keyword arguments are passed to the writer used. """ err_msg = "Can only write tvtk.DataSet instances "\ "'got %s instead"%(dataset.__class__.__name__) assert isinstance(dataset, tvtk.DataSet), err_msg # Mapping to determine appropriate extension and writer. d2r = {'vtkImageData': ('.vti', tvtk.StructuredPointsWriter), 'vtkRectilinearGrid': ('.vtr', tvtk.RectilinearGridWriter), 'vtkStructuredGrid': ('.vts', tvtk.StructuredGridWriter), 'vtkPolyData': ('.vtp', tvtk.PolyDataWriter), 'vtkUnstructuredGrid': ('.vtu', tvtk.UnstructuredGridWriter) } for type in d2r: if dataset.is_a(type): datatype = d2r[type] break ext = splitext(fname)[1] if ext == '.vtk': file_name = fname writer = datatype[1] elif len(ext) == 0: file_name = fname + datatype[0] writer = tvtk.XMLDataSetWriter else: file_name = fname writer = tvtk.XMLDataSetWriter w = writer(file_name=file_name, **kwargs) configure_input_data(w, dataset) w.write() mayavi-4.5.0/tvtk/pipeline/0000755000076500000240000000000012747722127016222 5ustar prabhustaff00000000000000mayavi-4.5.0/tvtk/pipeline/__init__.py0000644000076500000240000000013212747716314020330 0ustar prabhustaff00000000000000# Author: Prabhu Ramachandran # Copyright (c) 2005, Enthought, Inc. # License: BSD Style. mayavi-4.5.0/tvtk/pipeline/browser.py0000644000076500000240000007106112747716314020265 0ustar prabhustaff00000000000000"""A tvtk pipeline browser. An abstract `TreeGenerator` class defines the interface of a tree generator. This class is responsible for generating the list of children. Often tvtk object's children are collections of various objects, some sequences and some simple objects. In order to provide a unified interface to all children, all of these objects are wrapped using the `CompositeIterable` which presents all children as a single iterable. `SimpleTreeGenerator` does not do extensive analysis of the passed object in order to compute the children. `FullTreeGenerator` however uses the algorithm that MayaVi-1.x uses and therefore generates a large number of objects. The `PipelineBrowser` class presents the view of the pipeline as a tree. It allows one to specify the TreeGenerator instance. The `TreeEditor` from the traits package is used to represent the view. A `TVTKLeafNode` defines a node that has no children. A `TVTKBranchNode` is a node that has children. The nodes basically wrap up the tvtk object and present an interface suitable for the TreeEditor. TODO: * When a node is selected, the actor involved could be highlighted. """ # Author: Prabhu Ramachandran # Copyright (c) 2005, Enthought, Inc. # License: BSD Style. # Standard library imports. import re # Enthought library imports. from traits.api import HasTraits, Property, Any, Instance, \ Trait, List, Str, Dict, Python from traitsui.api import \ TreeEditor, TreeNodeObject, ObjectTreeNode, View, Item, Group from traitsui.menu import Menu, Action from tvtk.api import tvtk from tvtk import messenger from tvtk.tvtk_base import TVTKBase from tvtk.tvtk_base_handler import TVTKBaseHandler from tvtk.common import camel2enthought ###################################################################### # Utility functions. ###################################################################### def is_iterable(x): return hasattr(x, '__iter__') def get_icon(object_name): """Given the name of the object, this function returns an appropriate icon image name. If no icon is appropriate it returns the empty string.""" # The mapping from names to icons. icon_map = {'actor': 'actor.png', 'camera': 'camera.png', 'coordinate': 'coordinate.png', 'filter': 'filter.png', 'lookuptable': 'lookuptable.png', 'mapper': 'mapper.png', 'polydata': 'polydata.png', 'property': 'property.png', 'reader': 'reader.png', 'renderer': 'renderer.png', 'rendererwindowinteractor': 'rendererwindowinteractor.png', 'source': 'source.png', 'texture': 'texture.png', 'window': 'window.png', 'writer': 'writer.png', } # Lower case the name. name = object_name.lower() for key in icon_map: if name.endswith(key): return icon_map[key] # No valid icon for this object. return '' ###################################################################### # `TreeGenerator` class. ###################################################################### class TreeGenerator(HasTraits): """Encapsulates the methods that generate the tree via the `get_children` method.""" def has_children(self, obj): """Returns True if object `obj` has children.""" raise NotImplementedError def get_children(self, obj): """Returns a dictionary containing the children of the object `obj`.""" raise NotImplementedError def get_node(self, obj): """Get a node object representing this object.""" raise NotImplementedError def get_nodes(self, menu): """Returns a list of nodes for the tree editor. The menu entries to use for the nodes are passed as `menu`.""" raise NotImplementedError ###################################################################### # `SimpleTreeGenerator` class. ###################################################################### class SimpleTreeGenerator(TreeGenerator): """This particular class generates a simple pipeline representation. Not every possible object is obtained.""" def has_children(self, obj): """Returns true of the object has children, false if not. This is very specific to tvtk objects.""" if isinstance(obj, (tvtk.RenderWindow, tvtk.Renderer, tvtk.Collection)): return True for attribute in ['source', 'get_input', 'input', 'mapper', 'property', 'texture', 'text_property', 'volume_property', 'lookup_table', 'producer_port', 'producer']: if hasattr(obj, attribute): return True return False def get_children(self, obj): """Returns the child objects of a particular tvtk object in a dictionary, the keys are the trait names. This is used to generate the tree in the browser.""" kids = {} def _add_kid(key, x): if x is None: kids[key] = None else: if type(x) in (type([]), type(())): x1 = [i for i in x if isinstance(i, TVTKBase)] if x1: kids[key] = x1 elif isinstance(x, TVTKBase): kids[key] = x if isinstance(obj, tvtk.RenderWindow): return {'renderers':obj.renderers} elif isinstance(obj, tvtk.Renderer): if hasattr(obj, 'view_props'): return {'view_props':obj.view_props, 'active_camera':obj.active_camera} else: return {'props':obj.props, 'active_camera':obj.active_camera} #if isinstance(obj, tvtk.Collection): # _add_kid(obj) # Misc. properties. for attribute in ['mapper', 'property', 'texture', 'text_property', 'volume_property', 'lookup_table', 'producer']: if hasattr(obj, attribute): _add_kid(attribute, getattr(obj, attribute)) # Check for sources and inputs. if hasattr(obj, 'number_of_sources'): srcs = [obj.get_source(i) \ for i in range(obj.number_of_sources)] _add_kid('source', srcs) elif hasattr(obj, 'source'): _add_kid('source', obj.source) if hasattr(obj, 'get_input'): inputs = [] if hasattr(obj, 'number_of_input_ports'): if obj.number_of_input_ports: inputs = [obj.get_input(i) \ for i in range(obj.number_of_input_ports)] else: inputs = [obj.get_input(i) \ for i in range(obj.number_of_inputs)] _add_kid('input', inputs) elif hasattr(obj, 'input'): _add_kid('input', obj.input) if hasattr(obj, 'producer_port'): _add_kid('producer_port', obj.producer_port) return kids def get_node(self, obj): """Get a node object representing the object passed.""" if self.has_children(obj): return TVTKBranchNode(object=obj, tree_generator=self) else: return TVTKLeafNode(object=obj) def get_nodes(self, menu): """Returns a list of nodes for the tree editor. The menu entries to use are given as `menu`""" nodes = [ObjectTreeNode(node_for=[TVTKBranchNode], view=View(Group(Item('object', style='custom'), show_labels=False)), auto_open=False, children='children', label='name', menu=menu, rename=False, delete=False, copy=False, insert=False), ObjectTreeNode(node_for=[TVTKLeafNode], view=View(Group(Item('object', style='custom'), show_labels=False)), auto_open=False, label='name', menu=menu, rename=False, delete=False, copy=False, insert=False), ObjectTreeNode(node_for=[TVTKCollectionNode], auto_open=True, children='children', label='name', menu=menu, rename=False, delete=False, copy=False, insert=False), ] return nodes ###################################################################### # `FullTreeGenerator` class. ###################################################################### class FullTreeGenerator(SimpleTreeGenerator): """This particular class picks up a lot more children in the pipeline and is similar to the code used in MayaVi-1.x's pipeline browser.""" def __init__(self, **traits): super(FullTreeGenerator, self).__init__(**traits) self.last_transform = 0 def get_children(self, obj): """Returns the child objects of a particular tvtk object in a dictionary, the keys are the trait names. This is used to generate the tree in the browser.""" vtk_obj = tvtk.to_vtk(obj) methods = self._get_methods(vtk_obj) kids = {} def _add_kid(key, x): if x is None: kids[key] = None else: if type(x) in (type([]), type(())): x1 = [i for i in x if isinstance(i, TVTKBase)] if x1: kids[key] = x1 elif isinstance(x, TVTKBase): if hasattr(x, '__iter__'): # Don't add iterable objects that contain non # acceptable nodes if len(list(x)) and isinstance(list(x)[0], TVTKBase): kids[key] = x else: kids[key] = x for method in methods: attr = camel2enthought(method[0]) if hasattr(obj, attr): _add_kid(attr, getattr(obj, attr)) # Check for sources and inputs. if hasattr(obj, 'number_of_sources'): srcs = [obj.get_source(i) \ for i in range(obj.number_of_sources)] _add_kid('source', srcs) elif hasattr(obj, 'source'): _add_kid('source', obj.source) if hasattr(obj, 'get_input'): inputs = [] if hasattr(obj, 'number_of_input_ports'): if obj.number_of_input_ports: # Sometimes not all the inputs can be retrieved using # 'get_input', as they may be sources (for instance # the ProbeFilter). inputs = list() for i in range(obj.number_of_input_ports): try: inputs.append(obj.get_input(i)) except TypeError: pass if not inputs: inputs = [obj.get_input()] else: inputs = [obj.get_input(i) \ for i in range(obj.number_of_inputs)] _add_kid('input', inputs) elif hasattr(obj, 'input'): _add_kid('input', obj.input) if hasattr(obj, 'producer_port'): _add_kid('producer_port', obj.producer_port) return kids def has_children(self, obj): """Returns true of the object has children, false if not. This is very specific to tvtk objects.""" if isinstance(obj, (tvtk.RenderWindow, tvtk.Renderer, tvtk.Collection)): return True for attribute in ['source', 'get_input', 'input', 'mapper', 'property', 'texture', 'text_property', 'volume_property', 'lookup_table', 'producer_port', 'producer']: if hasattr(obj, attribute): return True # FIXME: This is inefficient. We probably should cache the # get_children call. if self.get_children(obj): return True return False ########################################################################### # Non-public interface. ########################################################################### def _get_methods(self, vtk_obj): """Obtain the various methods from the passed object.""" def _remove_method(name, methods, method_names): """Removes methods if they have a particular name.""" try: idx = method_names.index(name) except ValueError: pass else: del methods[idx], method_names[idx] return methods, method_names # The following code basically gets the 'str' representation # of the VTK object and parses it to obtain information about # the object's children. It is a hack but has worked well for # a *very* long time with MayaVi-1.x and before. # Oops, this isn't a VTK object. if not hasattr(vtk_obj, 'GetClassName'): return [] methods = str(vtk_obj) methods = methods.split("\n") del methods[0] # using only the first set of indented values. patn = re.compile(" \S") for method in methods[:]: if patn.match(method): if method.find(":") == -1: methods.remove(method) elif method[1].find("none") > -1: methods.remove(method) else: methods.remove(method) # Props/Prop is deprecated in more recent VTK releases. for method in methods[:]: if method.strip()[:6] == "Props:": if hasattr(vtk_obj, "GetViewProps"): methods.remove(method) methods.append("ViewProps: ") elif method.strip()[:5] == "Prop:": if hasattr(vtk_obj, "GetViewProp"): methods.remove(method) methods.append("ViewProp: ") method_names = [] for i in range(0, len(methods)): strng = methods[i].replace(" ", "") methods[i] = strng.split(":") method_names.append(methods[i][0]) if re.match("vtk\w*Renderer", vtk_obj.GetClassName()): methods.append(["ActiveCamera", ""]) if re.match("vtk\w*Assembly", vtk_obj.GetClassName()): methods.append(["Parts", ""]) methods.append(["Volumes", ""]) methods.append(["Actors", ""]) if vtk_obj.IsA('vtkAbstractTransform'): if self.last_transform > 0: _remove_method('Inverse', methods, method_names) else: self.last_transform += 1 else: self.last_transform = 0 # Some of these object are removed because they arent useful in # the browser. I check for Source and Input anyway so I dont need # them. for name in('Output', 'FieldData', 'CellData', 'PointData', 'Source', 'Input', 'ExtentTranslator', 'Interactor', 'Lights', 'Information', 'Executive'): _remove_method(name, methods, method_names) return methods ###################################################################### # `CompositeIterable` class. ###################################################################### class CompositeIterable(HasTraits): """This class allows one to iterate over a bunch of disparate objects treating them as one single iterable. Each of the iterated objects is wrapped with a suitable Node class so that the object may be used in a Traits Tree Editor. """ tree_generator = Instance(TreeGenerator) def __init__(self, args, **traits): super(CompositeIterable, self).__init__(**traits) self.args = args def __iter__(self): tg = self.tree_generator for arg in self.args: if is_iterable(arg): for x in arg: yield tg.get_node(x) else: yield tg.get_node(arg) def __len__(self): x = 0 for arg in self.args: if is_iterable(arg): x += len(arg) else: x += 1 return x ###################################################################### # `TVTKLeafNode` class. ###################################################################### class TVTKLeafNode(TreeNodeObject): """Represents a leaf in the tree view.""" # The tvtk object being wrapped. object = Instance(TVTKBase) # Name to show on the view. name = Property # Work around problem with HasPrivateTraits. __ = Python def __hash__(self): return hash(tvtk.to_vtk(self.object)) def _get_name(self): return self.object.__class__.__name__ ###################################################################### # `TreeNodeObject` interface ###################################################################### def tno_get_icon(self, node, is_expanded): """ Returns the icon for a specified object. """ icon = get_icon(self.name) if icon: return icon else: return super(TVTKLeafNode, self).tno_get_icon(node, is_expanded) ###################################################################### # `TVTKBranchNode` class. ###################################################################### class TVTKBranchNode(TreeNodeObject): """Represents a branch in the tree view. The `children` trait produces an iterable that represents the children of the branch. """ # The tvtk object being wrapped. object = Instance(TVTKBase) # Children of the object. children = Property # Name to show on the view. name = Property # Tree generator to use. tree_generator = Instance(TreeGenerator) # Cache of children. children_cache = Dict # Work around problem with HasPrivateTraits. __ = Python def __init__(self, **traits): super(TVTKBranchNode, self).__init__(**traits) def __del__(self): try: self._remove_listners() except: pass def __hash__(self): return hash(tvtk.to_vtk(self.object)) def _get_children_from_cache(self): return [x for x in self.children_cache.values() if x is not None] def _create_children(self): kids = self.tree_generator.get_children(self.object) self.children_cache = kids self._setup_listners() def _setup_listners(self): object = self.object kids = self.children_cache for key, val in kids.items(): if isinstance(val, tvtk.Collection): vtk_obj = tvtk.to_vtk(val) messenger.connect(vtk_obj, 'ModifiedEvent', self._notify_children) else: object.on_trait_change(self._notify_children, key) def _remove_listners(self): object = self.object kids = self.children_cache for key, val in kids.items(): if isinstance(val, tvtk.Collection): vtk_obj = tvtk.to_vtk(val) messenger.disconnect(vtk_obj, 'ModifiedEvent', self._notify_children) else: object.on_trait_change(self._notify_children, key, remove=True) def _notify_children(self, obj=None, name=None, old=None, new=None): old_val = self._get_children_from_cache() self._remove_listners() self._create_children() new_val = self._get_children_from_cache() self.trait_property_changed('children', old_val, new_val) def _get_children(self): if not self.children_cache: self._create_children() kids = self._get_children_from_cache() tg = self.tree_generator return CompositeIterable(kids, tree_generator=tg) def _get_name(self): return self.object.__class__.__name__ ###################################################################### # `TreeNodeObject` interface ###################################################################### def tno_get_icon(self, node, is_expanded): """ Returns the icon for a specified object. """ icon = get_icon(self.name) if icon: return icon else: return super(TVTKBranchNode, self).tno_get_icon(node, is_expanded) ###################################################################### # `TVTKCollectionNode` class. ###################################################################### class TVTKCollectionNode(TreeNodeObject): """Represents a collection of typically unconnected roots in the tree view. """ # List of child nodes. object = List(TVTKBase) # Children of the object. children = Property # Name to show on the view. name = Str # Tree generator to use. tree_generator = Instance(TreeGenerator) # Work around problem with HasPrivateTraits. __ = Python def __init__(self, **traits): super(TVTKCollectionNode, self).__init__(**traits) def _get_children(self): tg = self.tree_generator return CompositeIterable(self.object, tree_generator=tg) ###################################################################### # `CloseHandler` class. ###################################################################### class UICloseHandler(TVTKBaseHandler): """This class cleans up after the UI for the object is closed.""" # The browser associated with this UI. browser = Any def close(self, info, is_ok): """This method is invoked when the user closes the UI.""" obj = info.object obj.on_trait_change(self.browser.render, remove=True) return True ###################################################################### # `PipelineBrowser` class. ###################################################################### class PipelineBrowser(HasTraits): # The tree generator to use. tree_generator = Trait(FullTreeGenerator(), Instance(TreeGenerator)) # The TVTK render window(s) associated with this browser. renwins = List # The root object to view in the pipeline. If None (default), the # root object is the render_window of the Scene instance passed at # object instantiation time. root_object = List(TVTKBase) # Private traits. # The root of the tree to display. _root = Any ########################################################################### # `object` interface. ########################################################################### def __init__(self, renwin=None, **traits): """Initializes the object. Parameters ---------- - renwin: `Scene` instance. Defaults to None. This may be passed in addition to the renwins attribute which can be a list of scenes. """ super(PipelineBrowser, self).__init__(**traits) self.ui = None self.view = None if renwin: self.renwins.append(renwin) self._root_object_changed(self.root_object) menu = Menu(Action(name='Refresh', action='editor.update_editor'), Action(name='Expand all', action='editor.expand_all')) self.menu = menu nodes = self.tree_generator.get_nodes(menu) self.tree_editor = TreeEditor(nodes=nodes, editable=False, orientation='vertical', hide_root=True, on_dclick=self._on_dclick) self.view = View(Group(Item(name='_root', editor=self.tree_editor, resizable=True), show_labels=False, show_border=False, orientation='vertical'), title='Pipeline browser', help=False, resizable=True, undo=False, revert=False, width=.3, height=.3) ########################################################################### # `PipelineBrowser` interface. ########################################################################### def show(self, parent=None): """Show the tree view if not already show. If optional `parent` widget is passed, the tree is displayed inside the passed parent widget.""" # If UI already exists, raise it and return. if self.ui and self.ui.control: try: self.ui.control.Raise() except AttributeError: pass else: return else: # No active ui, create one. if parent: self.ui = self.view.ui(self, parent=parent, kind='subpanel') else: self.ui = self.view.ui(self, parent=parent) def update(self): """Update the tree view.""" # This is a hack. if self.ui and self.ui.control: try: ed = self.ui._editors[0] ed.update_editor() self.ui.control.Refresh() except (AttributeError, IndexError): pass # Another name for update. refresh = update def render(self): """Calls render on all render windows associated with this browser.""" for rw in self.renwins: rw.render() ########################################################################### # Non-public interface. ########################################################################### def _make_default_root(self): tree_gen = self.tree_generator objs = [x.render_window for x in self.renwins] node = TVTKCollectionNode(object=objs, name="Root", tree_generator=tree_gen) return node def _tree_generator_changed(self, tree_gen): """Traits event handler.""" if self._root: root_obj = self._root.object else: root_obj = self.root_object if root_obj: ro = root_obj if not hasattr(root_obj, '__len__'): ro = [root_obj] self._root = TVTKCollectionNode(object=ro, name="Root", tree_generator=tree_gen) else: self._root = self._make_default_root() self.tree_editor.nodes = tree_gen.get_nodes(self.menu) self.update() def _root_object_changed(self, root_obj): """Trait handler called when the root object is assigned to.""" tg = self.tree_generator if root_obj: self._root = TVTKCollectionNode(object=root_obj, name="Root", tree_generator=tg) else: self._root = self._make_default_root() self.root_object = self._root.object self.update() def _root_object_items_changed(self, list_event): """Trait handler called when the items of the list change.""" self._root_object_changed(self.root_object) def _on_dclick(self, obj): """Callback that is called when nodes are double-clicked.""" if hasattr(obj, 'object') and hasattr(obj.object, 'edit_traits'): object = obj.object view = object.trait_view() view.handler = UICloseHandler(browser=self) object.on_trait_change(self.render) ui = object.edit_traits(view=view) ###################################################################### # Test cases. ###################################################################### def main(instantiate_gui=True): """Simple test case.""" from tvtk.tools import ivtk v = ivtk.viewer(browser=False, instantiate_gui=instantiate_gui) cs = tvtk.ConeSource() m = tvtk.PolyDataMapper(input=cs.output) a = tvtk.Actor(mapper=m) v.scene.add_actor(a) v.scene.reset_zoom() b = PipelineBrowser(v.scene) b.show() return v, b, a if __name__ == '__main__': from pyface.api import GUI gui = GUI() main(instantiate_gui=False) gui.start_event_loop() mayavi-4.5.0/tvtk/pipeline/images/0000755000076500000240000000000012747722127017467 5ustar prabhustaff00000000000000mayavi-4.5.0/tvtk/pipeline/images/actor.png0000644000076500000240000000153512747716314021312 0ustar prabhustaff00000000000000PNG  IHDRabKGD pHYs  tIME  IDAT8mk\UsϹ?3tZ&֢4ՂТ`TK7+ֿ¥ӥ b;(-!iӦ0if܉s9…]}V(WR 41oF,f[+\uo5xw]&=|,MǞCr_{Kw{Ju@\ wуN4amb?8+&`ݛ7م]ZP|xGv!: obM5•(6Q%˜95%570B 2Ji Bq*l(,Ҳ aYDGD =RA&d](q A{1:ViBԄ OwaeaA .pHbƂ2X BU>* aX렌B X2m KrA%`cJ[d>$a1V_i (v)T*K2"P:2P0` TRVʤ@Gr5#U֖ A 02Yq mkwn .~CN8q'_q<neX%U~2ԕb˃c{䀂c53'_Hȱj<^Vcgm΃ 7@ѱP+`ćPoD_5C5pܿV ,c%*IENDB`mayavi-4.5.0/tvtk/pipeline/images/camera.png0000644000076500000240000000105212747716314021424 0ustar prabhustaff00000000000000PNG  IHDRasBIT|d pHYsu85tEXtSoftwarewww.inkscape.org<IDAT8ՓOkQ̛y3Jtt5);QqWpkˮ5Xڂ`BQqȟ&3n$P ^8pν+ysRRS Xk;b( Ɠʥz +^zL)vx$ɱ֚4MnՄg߻l|ц M՗_Ԫs7iI*.T/>qG+,W[s\}](iֿhQ\.q~vfF̔J,߽σu5ssX]YbU\Gݩae~_ڟÐ(bE)T8Zw;@w($I2[kQCѠYoYl6QꡈL+P"REp\g z؀IENDB`mayavi-4.5.0/tvtk/pipeline/images/coordinate.png0000644000076500000240000000177612747716314022340 0ustar prabhustaff00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb?% X@ >>_\\ _d`e`g '#7&&EVnno!aagyII%/3b1H٘V^EU\B@^^^TRPUA;7o Pcf`@`5BT\ZҒ]JJovƇ~?~s>0225y@`d8Κ!,(3qu~] ~ @ĝ/__JI305ן X~3j hj ^f_3Ԥw@y 2r b@ 6Ǐn=XG_ᯘ}BX7`fa`@;8#Sd3g /20'3h< Tdo|@`6~|_f߹%_WNΎ;ÿa𛅙A 59EW.$.|7005;_^?0%e8P@ 0fff`o01* @'uf~>fL }gcgb  3þ^}2&Kǎ0|axvn9ڍk? A)dqϟ o޿gx {x%#:7o<{O {|@`|E_cm?}@%'Cv8##󗁁*X:` ?$ؑ 0shIENDB`mayavi-4.5.0/tvtk/pipeline/images/filter.png0000644000076500000240000000140412747716314021462 0ustar prabhustaff00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb?% X.# g.$.s޽ͤ{HDDHyݺU@e[>|Ĥw`,,\ _ؿkfb"ƀ/_0h^d-/R : (7 v17o?t췀vt(3pa8,۝mWgcc Ԭr@a5*oC i3TYJ~-ffUbЬ@ rk5w\27SP@Xhdx ïƻLԈ[8Dx{ T~3_1hlfp R Y U]^ǰ=l~0J))-pG% lB, /.}r,6ׯ?LR23#Ynİ3?gť kڰĉ+xWmma1PhHdN?Tef`} ޽;f̘pW^@[  trsktvN/..B5AA S^^@1=dyB MIENDB`mayavi-4.5.0/tvtk/pipeline/images/image_LICENSE.txt0000644000076500000240000000220312747716314022452 0ustar prabhustaff00000000000000The icons are mostly derived work from other icons. As such they are licensed accordingly to the original license: Eclipse: Eclipse Public Licence Nuvola: LGPL Crystal: LGPL OOo: LGPL GV: Gael Varoquaux: BSD-licensed Unless stated in this file, icons are work of enthought, and are released under a 3 clause BSD-like license. Files and orginal authors: ---------------------------------------------------------------- actor.png | Nuvola camera.png | GV coordinate.png | Crystal filter.png | Nuvola lookuptable.png | OOo mapper.png | Crystal polydata.png | Nuvola property.png | Eclipse reader.png | Crystal renderer.png | Crystal rendererwindowinteractor.png | Nuvola rendererwindow.png | Crystal source.png | OOo texture.png | Eclipse window.png | Eclipse writer.png | GV mayavi-4.5.0/tvtk/pipeline/images/lookuptable.png0000644000076500000240000000054112747716314022517 0ustar prabhustaff00000000000000PNG  IHDRabKGD pHYs  tIME  8"xIDAT8˵1j0_c<f =D@K7kNƘ?ıCIL"~O QoYexD5š4MrUU;7Ooqm/#.׃ 9u]𠠛/r8(R%#dqp!rI "243mΆ{o3Sh>oxq }Ϯhwв[N;ܿ|π=NAIENDB`mayavi-4.5.0/tvtk/pipeline/images/mapper.png0000644000076500000240000000220212747716314021456 0ustar prabhustaff00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbd`h``d`a'_m$il&.#)o (:}I@!uk)Z9x9y^~zsO߿3Kq Y4uߟ7GIPH"_w/8Yu8٥؁?1Q/63<}3LeYkn'  |A/3\&"D '+M?2Sߘ&q=+';0Qr20p1???/^:??C##?:j @123['V)`Wp`x;?@Wgd``̔\̐u#ߓ~k9Y82 10s00r10('4?'˗r2k~=O7oI=}wz/` ;OcW H~.7*tfS'A]1    E8#P߿|'ʿc@~!+IENDB`mayavi-4.5.0/tvtk/pipeline/images/polydata.png0000644000076500000240000000206612747716314022017 0ustar prabhustaff00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxbdfff`bbb77ϟQ 200| ܼY^VVrO_}zmKa`x@1 `eee`ddda5+[2.}??Be33v1q0 ȶJq1(Ynfg`kOXN=V{oO 󟁝Kt%Iﱼ-p;îdfv &3t?y@aA^fc߃?~ K 8]fgf^bidggrvv711z%:9 & dxngwo.?~Ԓ%Kgc(oU4yޓik(KV¡ A 444Xܿ&4YWW xLO>exÙ3g޽(~(g"˯7o8b+&& 'O2:uAEEAPPHT{c[m~& 30v;t?~E01jiiI 䅇1|ADZZVdY!~)Sp1~ }㧓紏 ߿u"""< JJJ @zB`z:0]m+ ۀi'!F&be` TPP#..~(y ~g_B5Ibd@I2di)%9Q`Ö>\@Ⱥafv\arrllJ E ǟ>g(~٣d8 b݄Εji{+z(lR`w<ڣIENDB`mayavi-4.5.0/tvtk/pipeline/images/property.png0000644000076500000240000000064712747716314022071 0ustar prabhustaff00000000000000PNG  IHDRabKGD pHYs  tIME  2GI4IDAT8˭OKQq/|VKc"hQ&kȆg#[VQiӦoжhEr[uFtz{߹wfJ8YRJN);Z-<@DX%k   CDXg3?.ԙqGz(h!}7 ApE>6tNN.A^t 7Ivu㐪d' oc*j]*raV4{  b*INJkIENDB`mayavi-4.5.0/tvtk/pipeline/images/reader.png0000644000076500000240000000167212747716314021446 0ustar prabhustaff00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<LIDATxb?%  ~ɠ(3?~?QAVjG:1uf@ X@_@C20gd``'"K9ӫ/>?t  <4S~]M$5oBf9]2yKvivbBА:("L?xl#t42x|X #Ta( l T"gv1_TE3Q6 Oǐa###ݧ)|7?~ gˠ'!*@@E߿?~koh훫'z/_@'- ߯~A Rgcjo,G+H %  Ѡ}Aq"+_c ҦrOKs1 gdt~1>2 ث@ͻA^ w~o|)7Ms'8`1M {NOa81uE bfdg,lAڇeu5Xĸظ1z- gn`8=wow$݃>@DO7?OXߨGv@e^#rR'V? ^ӛ]+r#@!+ 0Js.dbg 1El@ -kIENDB`mayavi-4.5.0/tvtk/pipeline/images/renderer.png0000644000076500000240000000166112747716314022010 0ustar prabhustaff00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<CIDATxb?% (Ȕh͑& _xץ53οg400|9l@nU2b` %_s^?$q0oϭ?2l@1,`/g3eeyíK 8 #f5R0;00b񛁍/ ?xu%3pJ0 300IŒ &NE~Z5{}[99%ge`b׫h@L I@s05p2s1:I[8*24G\G; |T_ ?@qsß@8XxY=Ř842@&L0 vF$|cZt *#2P@H238ӻ |l8IMᥚÇ89tM@13q2r#йL 083#A8XD%Aa8 <:m;[TL ȻӿA`g.KؐSߟ~}|8@1R 1F&vIENDB`mayavi-4.5.0/tvtk/pipeline/images/rendererwindow.png0000644000076500000240000000043112747716314023232 0ustar prabhustaff00000000000000PNG  IHDRa pHYs B4gAMA|Q cHRMz%u0`:o_FIDATxb?% X@,)@X3i3 ā2,Zb+ C & j Db/^ @{ (@QhLbb FJ3@>DIENDB`mayavi-4.5.0/tvtk/pipeline/images/rendererwindowinteractor.png0000644000076500000240000000202112747716314025322 0ustar prabhustaff00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb?% XJK; f100+rrR8e55i+;x~GbIŮ55dcc>~|]RA##T%a* rrꊞ*< L >ccc)w X~Ġ1p -FF`^GG6>>N70^ׯ&߿4$$$W mãG}:ADAZZAHt!!aǏoܸ| @A @3,[wihY\#'' 6`ݺ_ϟg & ر**2.]:=a߾ˁ1.!!Y ӇoY޽{k/_]AFFMCC_'$$AO߿c^F ,-YLÇ>b>u7o^~5+_JIIs XZZ)(H1/2,Z(@xx?VPPa`aaPY hjwA\\AJJ(W _5W qq `%++.Gϟ89ف)ܹ8q`ӧ˯_?,X0@\moQAQQ 8gP`FP͛gW^jy X@ĭ[WWp缼ڥrr߿bsP>0a2<{f2@0 ܹss %(qrr1̜9=z/F=ã  ,-mqssCX=;&cg+IENDB`mayavi-4.5.0/tvtk/pipeline/images/source.png0000644000076500000240000000043712747716314021502 0ustar prabhustaff00000000000000PNG  IHDRabKGD pHYs  tIME  9LaIDAT8!0FH/sLM]3z k !KP|əw}vJu%NADByCHSjc ]%{8x4MXk*)'șж-[P}4Ws w *qwu~87՜5>WTIENDB`mayavi-4.5.0/tvtk/pipeline/images/texture.png0000644000076500000240000000071312747716314021677 0ustar prabhustaff00000000000000PNG  IHDRabKGD pHYs  tIME  k|6XIDAT8͓K@ǿ1l :ԂWN YCY2tTqq -Z*r9q|{>:N#.}nxu,ף ;{ɹɸ{] lӇ63ln 0R\_r3ePUzф2M Jx r~V AG7KzVł? BbRb9t6nRFRGÛ{:[ިsώϱA;y`I"  yCp;a/N@*ObeGi fo zM邽sIENDB`mayavi-4.5.0/tvtk/plugins/0000755000076500000240000000000012747722127016076 5ustar prabhustaff00000000000000mayavi-4.5.0/tvtk/plugins/__init__.py0000644000076500000240000000013212747716314020204 0ustar prabhustaff00000000000000# Author: Prabhu Ramachandran # Copyright (c) 2005, Enthought, Inc. # License: BSD Style. mayavi-4.5.0/tvtk/plugins/browser/0000755000076500000240000000000012747722127017561 5ustar prabhustaff00000000000000mayavi-4.5.0/tvtk/plugins/browser/__init__.py0000644000076500000240000000013712747716314021674 0ustar prabhustaff00000000000000# Author: Prabhu Ramachandran # Copyright (c) 2005-2007, Enthought, Inc. # License: BSD Style. mayavi-4.5.0/tvtk/plugins/browser/browser_plugin.py0000644000076500000240000000344712747716314023205 0ustar prabhustaff00000000000000""" The TVTK pipeline browser plugin. """ # Enthought library imports. from envisage.api import Plugin from traits.api import List class BrowserPlugin(Plugin): """ The TVTK pipeline browser plugin. """ # Extension point Ids. VIEWS = 'envisage.ui.workbench.views' #### 'IPlugin' interface ################################################## # The plugin's name (suitable for displaying to the user). name = 'TVTK Pipeline Browser' # Our ID. id = 'tvtk.browser' #### Extension points offered by this plugin ############################## # None. #### Contributions to extension points made by this plugin ################ views = List(contributes_to=VIEWS) def _views_default(self): """ Trait initializer. """ return [self._browser_view_factory] ########################################################################### # Private interface. ########################################################################### def _browser_view_factory(self, window, **traits): """ Factory method for browser views. """ from tvtk.plugins.browser.browser_view import ( BrowserView ) browser_view = BrowserView( scene_manager = self._get_scene_manager(window), window = window, **traits ) return browser_view def _get_scene_manager(self, window): """ Lookup the window's scene manager service. """ # Get the scene manager (a 'per window' service, so we look it up via # the window!). from tvtk.plugins.scene.i_scene_manager import ( ISceneManager ) return window.get_service(ISceneManager) #### EOF ###################################################################### mayavi-4.5.0/tvtk/plugins/browser/browser_view.py0000644000076500000240000000555312747716314022661 0ustar prabhustaff00000000000000""" The TVTK pipeline browser view. """ # Author: Prabhu Ramachandran # Copyright (c) 2005, Enthought, Inc. # License: BSD Style. # Enthought library imports. from pyface.workbench.api import View from traits.api import Instance, on_trait_change class BrowserView(View): """ The TVTK pipeline browser view. """ #### 'IWorkbenchPart' interface ########################################### # The part's name (displayed to the user). name = 'TVTK Pipeline Browser' #### 'IView' interface #################################################### # The position of the view relative to the item specified in the # 'relative_to' trait. position = 'left' #### 'BrowserView' interface ############################################## # The pipeline browser instance that we are a view of. browser = Instance('tvtk.pipeline.browser.PipelineBrowser') # The scene manager. scene_manager = Instance( 'tvtk.plugins.scene.i_scene_manager.ISceneManager' ) ########################################################################### # 'IWorkbenchPart' interface. ########################################################################### def create_control(self, parent): """ Create the toolkit-specific control that represents the view. """ from tvtk.pipeline.browser import PipelineBrowser self.browser = PipelineBrowser() self.browser.show(parent=parent) return self.browser.ui.control ########################################################################### # Private interface. ########################################################################### #### Trait change handlers ################################################ @on_trait_change('scene_manager:scenes_items') def _on_scenes_changed(self, event): """ Dynamic trait change handler. This is called when scenes are added/removed from the scene manager, it is used to add and remove objects from the pipeline. """ # Scenes that were removed. map(self._remove_scene, event.removed) # Scenes that were added. map(self._add_scene, event.added) return #### Methods ############################################################## def _add_scene(self, scene): """ Add the specified scene to the pipeline browser. """ self.browser.renwins.append(scene) self.browser.root_object.append(scene.render_window) return def _remove_scene(self, scene): """ Remove the specified scene from the pipeline browser. """ if scene in self.browser.renwins: self.browser.renwins.remove(scene) self.browser.root_object.remove(scene.render_window) return #### EOF ###################################################################### mayavi-4.5.0/tvtk/plugins/scene/0000755000076500000240000000000012747722127017173 5ustar prabhustaff00000000000000mayavi-4.5.0/tvtk/plugins/scene/__init__.py0000644000076500000240000000013712747716314021306 0ustar prabhustaff00000000000000# Author: Prabhu Ramachandran # Copyright (c) 2005-2007, Enthought, Inc. # License: BSD Style. mayavi-4.5.0/tvtk/plugins/scene/i_scene_manager.py0000644000076500000240000000130212747716314022641 0ustar prabhustaff00000000000000""" The interface for TVTK scene managers. """ # Enthought library imports. from tvtk.pyface.tvtk_scene import TVTKScene from pyface.workbench.api import WorkbenchWindow from traits.api import Interface, List, Instance class ISceneManager(Interface): """ The interface for TVTK scene managerss. """ # The currently active scene (None, if no scene is active). current_scene = Instance(TVTKScene) # A list of all open scenes. scenes = List(TVTKScene) # The workbench window that the manager is in (there is one scene manager # per workbench window). window = Instance(WorkbenchWindow) #### EOF ###################################################################### mayavi-4.5.0/tvtk/plugins/scene/preferences.ini0000644000076500000240000000017012747716314022174 0ustar prabhustaff00000000000000[tvtk.scene] stereo = False magnification = 1 background_color = "(0.5, 0.5, 0.5)" foreground_color = "(1.0, 1.0, 1.0)" mayavi-4.5.0/tvtk/plugins/scene/scene_editor.py0000644000076500000240000000646512747716314022224 0ustar prabhustaff00000000000000""" A TVTK scene editor. """ # Author: Prabhu Ramachandran # Copyright (c) 2005, Enthought, Inc. # License: BSD Style. # Enthought library imports. from apptools.preferences.api import get_default_preferences from tvtk.pyface.tvtk_scene import TVTKScene from tvtk.pyface.api import DecoratedScene from pyface.workbench.api import Editor from traits.api import Instance #### Handy functions ########################################################## def _id_generator(): """ Return an ever-increasing number useful for creating unique Ids. """ n = 1 while True: yield(n) n += 1 _id_generator = _id_generator() class SceneEditor(Editor): """ A TVTK scene editor. """ #### 'SceneEditor' interface ############################################## # The TVTK scene object. scene = Instance(TVTKScene) ########################################################################### # 'IWorkbenchPart' interface. ########################################################################### #### Trait initializers ################################################### def _id_default(self): """ Trait initializer. """ return self.name def _name_default(self): """ Trait initializer. """ return 'TVTK Scene %d' % (next(_id_generator)) #### Methods ############################################################## def create_control(self, parent): """ Create the toolkit-specific control that represents the editor. """ # We hold a reference to the scene itself to make sure it does not get # garbage collected (because we only return the scene's 'control' not # the scene itself). The scene is also referenced by the scene manager. self.scene = self._create_decorated_scene(parent) self.scene.render() return self.scene.control def destroy_control(self): """ Destroy the toolkit-specific control that represents the editor. """ if self.scene is not None: # Close the scene to cleanly shut it down. self.scene.close() # Call the parent method. return super(SceneEditor, self).destroy_control() ########################################################################### # Private interface. ########################################################################### def _create_decorated_scene(self, parent): """ Create a new decorated scene. """ pref = get_default_preferences() stereo = eval(pref.get('tvtk.scene.stereo')) scene = DecoratedScene(parent, stereo=stereo) # Set the scene's traits to preference values. scene.magnification = \ eval(pref.get('tvtk.scene.magnification')) fg = eval(pref.get('tvtk.scene.foreground_color')) bg = eval(pref.get('tvtk.scene.background_color')) scene.foreground = fg scene.background = bg # FIXME: This seems necessary for some strange reason, if not # the actual background of the renderer never gets set even # though the renderer and the scene's background are synced. scene.renderer.background = scene.background return scene #### EOF ###################################################################### mayavi-4.5.0/tvtk/plugins/scene/scene_manager.py0000644000076500000240000000527212747716314022343 0ustar prabhustaff00000000000000""" Manage the TVTK scenes. """ # Enthought library imports. from tvtk.pyface.tvtk_scene import TVTKScene from pyface.workbench.api import WorkbenchWindow from traits.api import HasTraits, List, Instance, Property from traits.api import provides, on_trait_change from tvtk.plugins.scene.scene_editor import SceneEditor # Local imports. from .i_scene_manager import ISceneManager @provides(ISceneManager) class SceneManager(HasTraits): """ Manage the TVTK scenes. """ #### 'SceneManager' interface ############################################# # The currently active scene (None, if no scene is active). current_scene = Property(Instance(TVTKScene)) # A list of all open scenes. scenes = List(TVTKScene) # The workbench window that the manager is in (there is one scene manager # per workbench window). window = Instance(WorkbenchWindow) #### Private interface #################################################### # Shadow trait for the 'current_scene' property. _current_scene = Instance(TVTKScene) ########################################################################### # 'SceneManager' interface. ########################################################################### #### Trait properties ##################################################### def _get_current_scene(self): """ Property getter. """ scene_count = len(self.scenes) if scene_count == 0: scene = None elif scene_count == 1: scene = self.scenes[0] else: scene = self._current_scene return scene def _set_current_scene(self, scene): """ Property setter. """ self._current_scene = scene return #### Trait change handlers ################################################ @on_trait_change('window:editor_opened') def _on_editor_opened(self, obj, trait_name, old, new): """ Dynamic trait change handler. """ if isinstance(new, SceneEditor): self.scenes.append(new.scene) return @on_trait_change('window:editor_closing') def _on_editor_closed(self, obj, trait_name, old, new): """ Dynamic trait change handler. """ if isinstance(new, SceneEditor): self.scenes.remove(new.scene) return @on_trait_change('window:active_editor') def _on_active_editor_changed(self, obj, trait_name, old, new): """ Dynamic trait change handler. """ if isinstance(new, SceneEditor): self.current_scene = new.scene else: self.current_scene = None return #### EOF ###################################################################### mayavi-4.5.0/tvtk/plugins/scene/scene_plugin.py0000644000076500000240000000264112747716314022224 0ustar prabhustaff00000000000000""" The TVTK render window scene plugin. """ # Enthought library imports. from envisage.api import Plugin, ServiceOffer from traits.api import List # This module's package. PKG = '.'.join(__name__.split('.')[:-1]) class ScenePlugin(Plugin): """ The TVTK render window scene plugin. """ # Extension point Ids. PREFERENCES = 'envisage.preferences' SERVICE_OFFERS = 'envisage.ui.workbench.service_offers' #### 'IPlugin' interface ################################################## # The plugin's name (suitable for displaying to the user). name = 'TVTK Scene Plugin' # Our ID. id = 'tvtk.scene' #### Extension points offered by this plugin ############################## # None. #### Contributions to extension points made by this plugin ################ preferences = List(contributes_to=PREFERENCES) def _preferences_default(self): """ Trait initializer. """ return ['pkgfile://%s/preferences.ini' % PKG] service_offers = List(contributes_to=SERVICE_OFFERS) def _service_offers_default(self): """ Trait initializer. """ scene_manager_service_offer = ServiceOffer( protocol = PKG + '.i_scene_manager.ISceneManager', factory = PKG + '.scene_manager.SceneManager', ) return [scene_manager_service_offer] #### EOF ###################################################################### mayavi-4.5.0/tvtk/plugins/scene/ui/0000755000076500000240000000000012747722127017610 5ustar prabhustaff00000000000000mayavi-4.5.0/tvtk/plugins/scene/ui/__init__.py0000644000076500000240000000013712747716314021723 0ustar prabhustaff00000000000000# Author: Prabhu Ramachandran # Copyright (c) 2005-2007, Enthought, Inc. # License: BSD Style. mayavi-4.5.0/tvtk/plugins/scene/ui/actions.py0000644000076500000240000001747612747716314021642 0ustar prabhustaff00000000000000""" The various actions for the Scene plugin. """ # Author: Prabhu Ramachandran # Copyright (c) 2005-2007, Enthought, Inc. # License: BSD Style. # Enthought library imports. from pyface.api import FileDialog, OK from pyface.action.api import Action from traits.api import Instance, Property, Str class SceneAction(Action): """ Base class for actions that require a scene manager. """ #### 'SceneAction' interface ############################################## # The scene manager. scene_manager = Property(Instance( 'tvtk.plugins.scene.i_scene_manager import ISceneManager' )) def _get_scene_manager(self): """ Trait property getter. """ from tvtk.plugins.scene.i_scene_manager import ( ISceneManager ) return self.window.get_service(ISceneManager) class NewScene(Action): """ An action that creates a new TVTK scene. """ #### 'Action' interface ################################################### name = 'Scene' def perform(self, event): """ Performs the action. """ from tvtk.plugins.scene.scene_editor import SceneEditor editor = self.window.edit(object(), kind=SceneEditor) return editor class SaveScene(SceneAction): """ An action that saves a scene to an image. """ #### 'Action' interface ################################################### name = 'Save Scene' def perform(self, event): """ Performs the action. """ extensions = [ '*.png', '*.jpg', '*.jpeg', '*.tiff', '*.bmp', '*.ps', '*.eps', '*.tex', '*.rib', '*.wrl', '*.oogl', '*.pdf', '*.vrml', '*.obj', '*.iv', '*.pov', '*x3d' ] descriptions = [ 'PNG', 'JPG', 'JPEG', 'TIFF', 'Bitmap', 'PostScript', 'EPS', 'TeX', 'RIB', 'WRL', 'Geomview', 'PDF', 'VRML', 'Wavefront', 'Povray', 'X3D' ] wildcard = '' for description, extension in zip(descriptions, extensions): wildcard += '{} ({})|{}|'.format(description, extension, extension) wildcard += 'Determine by extension (*.*)|(*.*)' dialog = FileDialog( parent = self.window.control, title = 'Save scene to image', action = 'save as', wildcard = wildcard ) if dialog.open() == OK: scene = self.scene_manager.current_scene if scene is not None: scene.save(dialog.path) return class SaveSceneToImage(SceneAction): """ An action that saves a scene to an image. """ #### 'Action' interface ################################################### # Name of the action. name = 'Image' #### 'SaveSceneToImage' interface ######################################### # The save method name. save_method = Str('save') # The wildcard for the file dialog. wildcard = Str("All files (*.*)|*.*") ########################################################################### # 'Action' interface. ########################################################################### def perform(self, event): """ Perform the action. """ dialog = FileDialog( parent = self.window.control, title = 'Save scene to %s' % self.name, action = 'save as', wildcard = self.wildcard ) if dialog.open() == OK: scene = self.scene_manager.current_scene if scene is not None: method = getattr(scene, self.save_method) method(dialog.path) return # These are all specific subclasses that save particular images. class SaveSceneToPNG(SaveSceneToImage): name = 'PNG Image' save_method = 'save_png' wildcard = 'PNG images (*.png)|*.png|' \ 'All files (*.*)|*.*' class SaveSceneToJPEG(SaveSceneToImage): name = 'JPEG Image' save_method = 'save_jpg' wildcard = 'JPEG images (*.jpg)|*.jpg|' \ 'JPEG images (*.jpeg)|*.jpeg|' \ 'All files (*.*)|*.*' class SaveSceneToBMP(SaveSceneToImage): name = 'BMP Image' save_method = 'save_bmp' wildcard = 'BMP images (*.bmp)|*.bmp|' \ 'All files (*.*)|*.*' class SaveSceneToTIFF(SaveSceneToImage): name = 'TIFF Image' save_method = 'save_tiff' wildcard = 'TIFF images (*.tif)|*.tif|' \ 'TIFF images (*.tiff)|*.tiff|' \ 'All files (*.*)|*.*' class SaveSceneToPS(SaveSceneToImage): name = 'PostScript bitmap Image' save_method = 'save_ps' wildcard = 'PostScript bitmap images (*.ps)|*.ps|' \ 'All files (*.*)|*.*' class SaveSceneToGL2PS(SaveSceneToImage): name = 'Vector PS/EPS/PDF/TeX' save_method = 'save_gl2ps' wildcard = 'All files (*.*)|*.*|' \ 'EPS files (*.eps)|*.eps|' \ 'PS files (*.ps)|*.ps|' \ 'PDF files (*.pdf)|*.pdf|' \ 'TeX files (*.tex)|*.tex' class SaveSceneToRIB(SaveSceneToImage): name = 'RenderMan RIB file' save_method = 'save_rib' wildcard = 'RIB files (*.rib)|*.rib|' \ 'All files (*.*)|*.*' class SaveSceneToOOGL(SaveSceneToImage): name = 'GeomView OOGL file' save_method = 'save_oogl' wildcard = 'OOGL files (*.oogl)|*.oogl|' \ 'All files (*.*)|*.*' class SaveSceneToIV(SaveSceneToImage): name = 'OpenInventor file' save_method = 'save_iv' wildcard = 'OpenInventor files (*.iv)|*.iv|' \ 'All files (*.*)|*.*' class SaveSceneToVRML(SaveSceneToImage): name = 'VRML file' save_method = 'save_vrml' wildcard = 'VRML files (*.wrl)|*.wrl|' \ 'All files (*.*)|*.*' class SaveSceneToOBJ(SaveSceneToImage): name = 'Wavefront OBJ file' save_method = 'save_wavefront' wildcard = 'OBJ files (*.obj)|*.obj|' \ 'All files (*.*)|*.*' class SaveSceneToPovray(SaveSceneToImage): name = 'Povray File' save_method = 'save_povray' wildcard = 'Povray (*.pov)|*.pov|' \ 'All files (*.*)|*.*' class SaveSceneToX3D(SaveSceneToImage): name = 'X3D File' save_method = 'save_x3d' wildcard = 'X3D (*.x3d)|*.pov|' \ 'All files (*.*)|*.*' class SetView(SceneAction): """ An action that sets the current scene to a particular view.""" #### 'SetView' interface ################################################## # The method to invoke on the scene that will set the view. view_method = Str ########################################################################### # 'Action' interface. ########################################################################### def perform(self, event): """ Perform the action. """ scene = self.scene_manager.current_scene if scene is not None: method = getattr(scene, self.view_method) method() return # These are all specific subclasses that invoke particular views. class ResetZoom(SetView): name = '&Reset Zoom' view_method = 'reset_zoom' class IsometricView(SetView): name = '&Isometric View' view_method = 'isometric_view' class XPlusView(SetView): name = '&X+ View' view_method = 'x_plus_view' class XMinusView(SetView): name = '&X- View' view_method = 'x_minus_view' class YPlusView(SetView): name = '&Y+ View' view_method = 'y_plus_view' class YMinusView(SetView): name = '&Y- View' view_method = 'y_minus_view' class ZPlusView(SetView): name = '&Z+ View' view_method = 'z_plus_view' class ZMinusView(SetView): name = '&Z- View' view_method = 'z_minus_view' #### EOF ###################################################################### mayavi-4.5.0/tvtk/plugins/scene/ui/scene_preferences_page.py0000644000076500000240000000407012747716314024636 0ustar prabhustaff00000000000000""" Preferences page for a TVTK scene. """ # Author: Prabhu Ramachandran # Copyright (c) 2005, Enthought, Inc. # License: BSD Style. # Enthought library imports. from apptools.preferences.ui.api import PreferencesPage from traits.api import Range from traitsui.api import View, Group, Item from tvtk.tvtk_base import false_bool_trait, vtk_color_trait class ScenePreferencesPage(PreferencesPage): """ Preferences page for a TVTK scene. """ #### 'PreferencesPage' interface ########################################## # The page's category (e.g. 'General/Appearance'). The empty string means # that this is a top-level page. category = '' # The page's help identifier (optional). If a help Id *is* provided then # there will be a 'Help' button shown on the preference page. help_id = '' # The page name (this is what is shown in the preferences dialog. name = 'TVTK Scene' # The path to the preferences node that contains the preferences. preferences_path = 'tvtk.scene' #### Preferences ########################################################## # Turn on/off stereo rendering. Note that this is useful only at startup # and not at runtime. stereo = false_bool_trait( desc='specifies if stereo rendering is turned on' ) # The magnification to use when dumping the screen to an image. magnification = Range( 1, 2048, 1, desc='specifies the magnification to use while generating images' ) # The background color of the renderer. background_color = vtk_color_trait((0.5, 0.5, 0.5)) # The foreground color of the renderer. foreground_color = vtk_color_trait((1.0, 1.0, 1.0)) #### Traits UI views ###################################################### traits_view = View( Group( Item(name='background_color'), Item(name='foreground_color'), Item(name='stereo'), Item(name='magnification') ) ) #### EOF ###################################################################### mayavi-4.5.0/tvtk/plugins/scene/ui/scene_ui_action_set.py0000644000076500000240000001120312747716314024162 0ustar prabhustaff00000000000000""" The default action set for the scene UI plugin. """ # Author: Prabhu Ramachandran # Copyright (c) 2006, Enthought, Inc. # License: BSD Style. # Enthought library imports. from envisage.ui.action.api import Action, ActionSet, Group, Menu # This package PKG = '.'.join(__name__.split('.')[:-1]) #### Groups ################################################################### scene_group = Group( id='TVTKSceneGroup', path='MenuBar/File', before='ExitGroup' ) view_group = Group( id='TVTKViewGroup', path='MenuBar/Tools', before='PreferencesGroup' ) #### Menus #################################################################### new_menu = Menu( name='&New', path='MenuBar/File', group='TVTKSceneGroup' ) save_scene_as_menu = Menu( id='SaveSceneAs', name="Sa&ve Scene As", path='MenuBar/File', group='TVTKSceneGroup', after='New' ) #### Actions ################################################################## new_scene = Action( class_name = PKG + '.actions.NewScene', path = 'MenuBar/File/New', group='additions' ) #### Save actions #### save_scene = Action( class_name = PKG + '.actions.SaveScene', path = 'MenuBar/File', group='TVTKSceneGroup', after='SaveSceneAs' ) save_scene_to_png = Action( class_name = PKG + '.actions.SaveSceneToPNG', path = 'MenuBar/File/SaveSceneAs' ) save_scene_to_jpeg = Action( class_name = PKG + '.actions.SaveSceneToJPEG', path = 'MenuBar/File/SaveSceneAs' ) save_scene_to_bmp = Action( class_name = PKG + '.actions.SaveSceneToBMP', path = 'MenuBar/File/SaveSceneAs' ) save_scene_to_tiff = Action( class_name = PKG + '.actions.SaveSceneToTIFF', path = 'MenuBar/File/SaveSceneAs' ) save_scene_to_ps = Action( class_name = PKG + '.actions.SaveSceneToPS', path = 'MenuBar/File/SaveSceneAs' ) save_scene_to_gl2ps = Action( class_name = PKG + '.actions.SaveSceneToGL2PS', path = 'MenuBar/File/SaveSceneAs' ) save_scene_to_rib = Action( class_name = PKG + '.actions.SaveSceneToRIB', path = 'MenuBar/File/SaveSceneAs' ) save_scene_to_oogl = Action( class_name = PKG + '.actions.SaveSceneToOOGL', path = 'MenuBar/File/SaveSceneAs' ) save_scene_to_iv = Action( class_name = PKG + '.actions.SaveSceneToIV', path = 'MenuBar/File/SaveSceneAs' ) save_scene_to_vrml = Action( class_name = PKG + '.actions.SaveSceneToVRML', path = 'MenuBar/File/SaveSceneAs' ) save_scene_to_obj = Action( class_name = PKG + '.actions.SaveSceneToOBJ', path = 'MenuBar/File/SaveSceneAs' ) save_scene_to_pov = Action( class_name = PKG + '.actions.SaveSceneToPovray', path = 'MenuBar/File/SaveSceneAs' ) save_scene_to_x3d = Action( class_name = PKG + '.actions.SaveSceneToX3D', path = 'MenuBar/File/SaveSceneAs' ) #### View actions #### reset_zoom = Action( class_name = PKG + '.actions.ResetZoom', path = 'MenuBar/Tools', group='TVTKViewGroup' ) isometric_view = Action( class_name = PKG + '.actions.IsometricView', path = 'MenuBar/Tools', group='TVTKViewGroup' ) x_plus_view = Action( class_name = PKG + '.actions.XPlusView', path = 'MenuBar/Tools', group='TVTKViewGroup' ) x_minus_view = Action( class_name = PKG + '.actions.XMinusView', path = 'MenuBar/Tools', group='TVTKViewGroup' ) y_plus_view = Action( class_name = PKG + '.actions.YPlusView', path = 'MenuBar/Tools', group='TVTKViewGroup' ) y_minus_view = Action( class_name = PKG + '.actions.YMinusView', path = 'MenuBar/Tools', group='TVTKViewGroup' ) z_plus_view = Action( class_name = PKG + '.actions.ZPlusView', path = 'MenuBar/Tools', group='TVTKViewGroup' ) z_minus_view = Action( class_name = PKG + '.actions.ZMinusView', path = 'MenuBar/Tools', group='TVTKViewGroup' ) class SceneUIActionSet(ActionSet): """ The default action set for the scene UI plugin. """ groups = [scene_group, view_group] menus = [new_menu, save_scene_as_menu] actions = [ new_scene, # Save actions. save_scene, save_scene_to_png, save_scene_to_jpeg, save_scene_to_bmp, save_scene_to_tiff, save_scene_to_ps, save_scene_to_gl2ps, save_scene_to_rib, save_scene_to_oogl, save_scene_to_iv, save_scene_to_vrml, save_scene_to_obj, save_scene_to_pov, save_scene_to_x3d, # Scene actions. reset_zoom, isometric_view, x_plus_view, x_minus_view, y_plus_view, y_minus_view, z_plus_view, z_minus_view ] #### EOF ###################################################################### mayavi-4.5.0/tvtk/plugins/scene/ui/scene_ui_plugin.py0000644000076500000240000000272312747716314023337 0ustar prabhustaff00000000000000""" A TVTK render window scene UI plugin. """ # Enthought library imports. from envisage.api import Plugin from traits.api import List class SceneUIPlugin(Plugin): """ A TVTK render window scene UI plugin. This is the plugin that contributes actions, menus, preferences pages etc. """ # Extension point Ids. ACTION_SETS = 'envisage.ui.workbench.action_sets' PREFERENCES_PAGES = 'envisage.ui.workbench.preferences_pages' #### 'IPlugin' interface ################################################## # The plugin's name (suitable for displaying to the user). name = 'TVTK Scene UI Plugin' # Our ID. id = 'tvtk.scene_ui' #### Extension points offered by this plugin ############################## # None. #### Contributions to extension points made by this plugin ################ action_sets = List(contributes_to=ACTION_SETS) def _action_sets_default(self): """ Trait initializer. """ from tvtk.plugins.scene.ui.scene_ui_action_set import ( SceneUIActionSet ) return [SceneUIActionSet] preferences_pages = List(contributes_to=PREFERENCES_PAGES) def _preferences_pages_default(self): """ Trait initializer. """ from tvtk.plugins.scene.ui.scene_preferences_page import ( ScenePreferencesPage ) return [ScenePreferencesPage] #### EOF ###################################################################### mayavi-4.5.0/tvtk/pyface/0000755000076500000240000000000012747722127015664 5ustar prabhustaff00000000000000mayavi-4.5.0/tvtk/pyface/__init__.py0000644000076500000240000000064712747716314020005 0ustar prabhustaff00000000000000# Copyright (c) 2005-2011, Enthought, Inc. # All rights reserved. # # This software is provided without warranty under the terms of the BSD # license included in LICENSE.txt and may be redistributed only # under the conditions described in the aforementioned license. The license # is also available online at http://www.enthought.com/licenses/BSD.txt # Thanks for using Enthought open source! # # Author: Enthought, Inc. mayavi-4.5.0/tvtk/pyface/actor_editor.py0000644000076500000240000000061312747716314020715 0ustar prabhustaff00000000000000""" A mostly-general Traits UI editor for viewing things in TVTK scenes. """ # Authors: Robert Kern # Prabhu Ramachandran # Copyright (c) 2007, Enthought, Inc. # License: BSD Style. # Import the toolkit specific version. from tvtk.pyface.toolkit import toolkit_object ActorEditor = toolkit_object('actor_editor:ActorEditor') mayavi-4.5.0/tvtk/pyface/actor_model.py0000644000076500000240000000222012747716314020523 0ustar prabhustaff00000000000000""" A simple model to use for viewing TVTK actors/widgets. """ # Authors: Robert Kern # Prabhu Ramachandran # Copyright (c) 2007, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import Dict, Event, HasTraits, Bool ##################################################################### # `ITVTKActorModel` class ##################################################################### class ITVTKActorModel(HasTraits): """ An interface for view models that can control a TVTK scene's contents. """ # This maintains a dictionary mapping objects (by identity) to lists (or # single items) of TVTK Actors or 3D Widgets that represent them in the # scene. Adding and removing objects from this dictionary adds and removes # them from the scene. This is the trait that will be edited by a # ActorEditor. actor_map = Dict() # Turn off rendering such that multiple adds/removes can be refreshed at # once. disable_render = Bool(False) # Send this event in order to force a rendering of the scene. do_render = Event() mayavi-4.5.0/tvtk/pyface/actors.py0000644000076500000240000001060612747716314017535 0ustar prabhustaff00000000000000#------------------------------------------------------------------------------ # Copyright (c) 2005, Enthought, Inc. # All rights reserved. # # This software is provided without warranty under the terms of the BSD # license included in enthought/LICENSE.txt and may be redistributed only # under the conditions described in the aforementioned license. The license # is also available online at http://www.enthought.com/licenses/BSD.txt # Thanks for using Enthought open source! # # Author: Enthought, Inc. # Description: #------------------------------------------------------------------------------ """Helper functions to make a bunch of simple actors. This is useful when writing demo/example code. """ # Author: Prabhu Ramachandran # Copyright (c) 2005, Enthought, Inc. # License: BSD Style. from tvtk.api import tvtk from vtk.util import colors from tvtk.common import configure_input_data def axes_actor(origin=(0, 0, 0), scale_factor=1.0, radius=0.02, sides=12): """Creates a simple axes actor and returns a tvtk.Actor object.""" axes = tvtk.Axes(origin=origin, scale_factor=scale_factor, symmetric=1) tube = tvtk.TubeFilter(radius=radius, number_of_sides=sides, vary_radius='vary_radius_off') configure_input_data(tube, axes.output) mapper = tvtk.PolyDataMapper() configure_input_data(mapper, tube.output) actor = tvtk.Actor(mapper=mapper) axes.update() return actor def cone_actor(center=(0, 0, 0), height=1.0, radius=0.5, direction=(1, 0, 0), resolution=100, color=colors.red, opacity=1.0): """ Sets up a cone actor and returns the tvtk.Actor object.""" source = tvtk.ConeSource(center=center, height=height, radius=radius, direction=direction, resolution=resolution) mapper = tvtk.PolyDataMapper() configure_input_data(mapper, source.output) p = tvtk.Property(opacity=opacity, color=color) actor = tvtk.Actor(mapper=mapper, property=p) source.update() return actor def cube_actor(center=(0, 0, 0), color=colors.blue, opacity=1.0): """ Creates a cube and returns the tvtk.Actor. """ source = tvtk.CubeSource(center=center) mapper = tvtk.PolyDataMapper() configure_input_data(mapper, source.output) p = tvtk.Property(opacity=opacity, color=color) actor = tvtk.Actor(mapper=mapper, property=p) source.update() return actor def cylinder_actor(center=(0, 0, 0), radius=0.5, resolution=64, color=colors.green, opacity=1.0): """ Creates a cylinder and returns a tvtk.Actor. """ source = tvtk.CylinderSource(center=center, radius=radius, resolution=resolution) mapper = tvtk.PolyDataMapper() configure_input_data(mapper, source.output) prop = tvtk.Property(opacity=opacity, color=color) actor = tvtk.Actor(mapper=mapper, property=prop) source.update() return actor def earth_actor(radius=0.5, opacity=1.0): """ Creates an earth source and returns the actor. """ source = tvtk.EarthSource(radius=radius, on_ratio=16, outline=0) mapper = tvtk.PolyDataMapper() configure_input_data(mapper, source.output) prop = tvtk.Property(opacity=opacity) actor = tvtk.Actor(mapper=mapper, property=prop) source.update() return actor def sphere_actor(center=(0, 0, 0), radius=0.5, resolution=32, color=colors.purple, opacity=1.0): """ Creates a sphere and returns the actor. """ source = tvtk.SphereSource(center=center, radius=radius, theta_resolution=resolution, phi_resolution=resolution) mapper = tvtk.PolyDataMapper() configure_input_data(mapper, source.output) prop = tvtk.Property(opacity=opacity, color=color) actor = tvtk.Actor(mapper=mapper, property=prop) source.update() return actor def arrow_actor(color=colors.peacock, opacity=1.0, resolution=24): """ Creates a 3D Arrow and returns an actor. """ source = tvtk.ArrowSource(tip_resolution=resolution, shaft_resolution=resolution) mapper = tvtk.PolyDataMapper() configure_input_data(mapper, source.output) prop = tvtk.Property(opacity=opacity, color=color) actor = tvtk.Actor(mapper=mapper, property=prop) source.update() return actor mayavi-4.5.0/tvtk/pyface/api.py0000644000076500000240000000010512747716314017004 0ustar prabhustaff00000000000000from .decorated_scene import DecoratedScene from .scene import Scene mayavi-4.5.0/tvtk/pyface/decorated_scene.py0000644000076500000240000000072012747716314021345 0ustar prabhustaff00000000000000"""A VTK interactor scene which provides a convenient toolbar that allows the user to set the camera view, turn on the axes indicator etc. """ # Authors: Prabhu Ramachandran , # Dave Peterson # Copyright (c) 2006, Enthought, Inc. # License: BSD Style. # Import the toolkit specific version. from tvtk.pyface.toolkit import toolkit_object DecoratedScene = toolkit_object('decorated_scene:DecoratedScene') mayavi-4.5.0/tvtk/pyface/images/0000755000076500000240000000000012747722127017131 5ustar prabhustaff00000000000000mayavi-4.5.0/tvtk/pyface/images/16x16/0000755000076500000240000000000012747722127017716 5ustar prabhustaff00000000000000mayavi-4.5.0/tvtk/pyface/images/16x16/configure.png0000644000076500000240000000202112747716314022401 0ustar prabhustaff00000000000000PNG  IHDRagAMA7tEXtSoftwareAdobe ImageReadyqe<IDATxb?% XJK; f100+rrR8e55i+;x~GbIŮ55dcc>~|]RA##T%a* rrꊞ*< L >ccc)w X~Ġ1p -FF`^GG6>>N70^ׯ&߿4$$$W mãG}:ADAZZAHt!!aǏoܸ| @A @3,[wihY\#'' 6`ݺ_ϟg & ر**2.]:=a߾ˁ1.!!Y ӇoY޽{k/_]AFFMCC_'$$AO߿c^F ,-YLÇ>b>u7o^~5+_JIIs XZZ)(H1/2,Z(@xx?VPPa`aaPY hjwA\\AJJ(W _5W qq `%++.Gϟ89ف)ܹ8q`ӧ˯_?,X0@\moQAQQ 8gP`FP͛gW^jy X@ĭ[WWp缼ڥrr߿bsP>0a2<{f2@0 ܹss %(qrr1̜9=z/F=ã  ,-mqssCX=;&cg+IENDB`mayavi-4.5.0/tvtk/pyface/images/16x16/fullscreen.png0000644000076500000240000000122612747716314022570 0ustar prabhustaff00000000000000PNG  IHDRabKGDhv|ay pHYs  tIME  78E#IDAT8˥KHTQ;D*&ZDBi WTJ .u0J$+prQ֦Y52H:8ŝ0ТwsW ^Z'I ?08~L0/7@q2ȼ o$tҫvwc+A,ކ0l4Gf6N,#b`x4t34]`o{Iڤ @ <H?A[hҢJ+]6l,SxQg ;A,i7I:bq/E4Т|yby?hKuӭB @ _+[?Kit%4eKA͛(pKjy?P))-t{c1H=|=G}પrË͉ oܵ[w&ſG>wtz>|kצ[ގ =5yו?n߸ ^;ua}o귤+Aj AkHrt` fqiTtiQ=MNdaƀ=J5Sd˯Ɇ%udF Z[ hÃA"'p{&`hfJ.<^nm]b!-iI|)M&XnנcP1` Y`KՋX` .`H[A|6('1Pe'!6؀-2"?x[k 5h] dC1D!(%<, `[P/Cb`~)3.LAɮMjLAB$@΂N*8 JR?>8|,V j,j_C߻2%6[ }c?ضkh J@؅6߂3?H>Q-]rF4>9g)c;"kp/o\W^.Woa[GkͯzssIENDB`mayavi-4.5.0/tvtk/pyface/images/16x16/origin_glyph.png0000644000076500000240000000101012747716314023107 0ustar prabhustaff00000000000000PNG  IHDR(-SPLTEl7____>m|gfejji(yZnpnkooopppqqqvvvwww|vr/yyy{{{|||}}}~~~~LPk]y宨|x»ě˷d&tRNS@fbKGDH pHYs  ~tIMEIUIDATxc`UQ}$PQĐ "H|[w]'QKO~ "dj)yi\T98<@@R͗.Аn?PXN. ;Y!(GIENDB`mayavi-4.5.0/tvtk/pyface/images/16x16/parallel.png0000644000076500000240000000102612747716314022220 0ustar prabhustaff00000000000000PNG  IHDRa pHYs  tIME Mh IDAT8˝jA]#ċ "$$!xw! xBKbg&鞮*îYAuAT( N[2ȯuK.rXkNͻ(8(* ӆTs$0~ʓ=V28@DaI){K+{_0OA%Ԧi$P֊I`{;w4 *I4N)) .⽶(L20'IhQq'0vd~OrL4mk+)>o㲜6XĴmӤj+ ! VcԸM2`$QBl* f~g71?;g7YA' J9ASI%1֔rTN{}1⫣3{P7%̒)IENDB`mayavi-4.5.0/tvtk/pyface/images/16x16/save.png0000644000076500000240000000114112747716314021360 0ustar prabhustaff00000000000000PNG  IHDRa(IDAT8}kTA?]QeXX )*6vV!ZQc\wogweewu/]Y|p\H)[8D^ZՕ޿[[*LrE;k4Fu+<,1FTx9cRBM֑fwUY H"-D٨Ǒ HDZ kLq#4 ) D,iGBA ( $fʇ9w $5u.wP5f)b'fk*rKȤp뜙'aiO>5$E;D"s|/_m߇rʪ rJhobb;jӔ}$F4g[&w:hD E8v? 0 xPk!8X0ʗd;p>jN;% 3eWH;愳S{yrJ'Wu8:[_9p~nC~r~'/M2u4sG^?Jy>{F===m[x0Q5f-K̵.ܝ}q P$h ܿ_ 844@sh[Nn\>R21:Rvv,RӬtˤMrk;*b;WfACfXv UI*Yr |O'{: &E @2sgf_/6o%IENDB`mayavi-4.5.0/tvtk/pyface/images/16x16/z-axis.png0000644000076500000240000000110112747716314021631 0ustar prabhustaff00000000000000PNG  IHDRabKGD pHYs  tIME 79 IDAT8˭=hQ>vXHa- BR%b,4ARӨ`#b@Jb0Q+  5J"AS=o#6Aà b*l&C30bF`<*˽!qaN׉ⅪbC͛-R-U/Tp;Yӹ 66ӐmZGL<ؑO.r<|fEY/9tmza ?1yI3󲦧sy0ʝK$͔L=pE9 >XJs*D I+@I+;oט]| `DJ@3+h*g_J79:Z(, ?&_|dye=:93Ay4vIG`0uF $iܩt Ǘ/۔Bᘹ5/~:&g9IENDB`mayavi-4.5.0/tvtk/pyface/light_manager.py0000644000076500000240000004202412747716314021042 0ustar prabhustaff00000000000000#------------------------------------------------------------------------------ # Copyright (c) 2005, Enthought, Inc. # All rights reserved. # # This software is provided without warranty under the terms of the BSD # license included in enthought/LICENSE.txt and may be redistributed only # under the conditions described in the aforementioned license. The license # is also available online at http://www.enthought.com/licenses/BSD.txt # Thanks for using Enthought open source! # # Author: Enthought, Inc. # Description: #------------------------------------------------------------------------------ """This module provides a light manager that may be used to change the lighting of a VTK scene. This module is largely ported from MayaVi's Lights.py but the implementation is considerably different. """ # Author: Prabhu Ramachandran # Copyright (c) 2005, Enthought, Inc. # License: BSD Style. from math import sin, cos, atan2, pi, sqrt from traits.api import HasTraits, Range, false, \ Instance, Trait, List from traitsui.api import View, Group, Handler, ListEditor, Item from tvtk.api import tvtk from tvtk.tvtk_base import vtk_color_trait, TraitRevPrefixMap from tvtk.common import is_old_pipeline, configure_input, configure_input_data from apptools.persistence import state_pickler ###################################################################### # `LightGlyph` class. ###################################################################### class LightGlyph(HasTraits): """Manages a glyph that represents a Light source in the scene. This gives the user an *idea* of where the light source is placed while configuring the lights. """ # The version of this class. Used for persistence. __version__ = 0 def __init__(self): self.el = 0.0 self.az = 0.0 # Create an arrow. arrow = tvtk.ArrowSource() # Transform it suitably so it is oriented correctly. t = tvtk.Transform() tf = tvtk.TransformFilter() tf.transform = t t.rotate_y(90.0) t.translate((-2, 0, 0)) configure_input_data(tf, arrow.output) mapper = tvtk.PolyDataMapper() configure_input(mapper, tf) self.actor = actor = tvtk.Follower() actor.mapper = mapper prop = actor.property prop.color = 0, 1, 1 prop.ambient = 0.5 prop.diffuse = 0.5 def __get_pure_state__(self): d = self.__dict__.copy() for name in ['__sync_trait__', '__traits_listener__']: d.pop(name, None) return d def __getstate__(self): return state_pickler.dumps(self) def __setstate__(self, str_state): self.__init__() state_pickler.set_state(self, state_pickler.loads_state(str_state)) ################################################################# # `LightGlyph` interface. ################################################################# def add(self, ren, bounds): """Adds the actors to the given renderer (`ren`). The actors are scaled as per the given bounds.""" scale = max(bounds[1]-bounds[0], bounds[3] - bounds[2], bounds[5]-bounds[4])*0.75 self.actor.scale = scale, scale, scale ren.add_actor(self.actor) cam = ren.active_camera self.actor.camera = cam def remove(self, ren): """Removes the actors of the glyph from the given renderer (`ren`).""" ren.remove_actor(self.actor) def move_to(self, elevation=None, azimuth = None): """Move the glyphs to the specified elevation and azimuth.""" self.actor.rotate_x(-self.el) self.actor.rotate_y(-self.az) if elevation != None: self.el = elevation if azimuth != None: self.az = azimuth self.actor.rotate_y(self.az) self.actor.rotate_x(self.el) def show(self): """Show the glyphs on screen.""" self.actor.visibility = 1 def hide(self): """Hide the glyphs on screen.""" self.actor.visibility = 0 def set_color(self, clr): """Change the glyphs color.""" self.actor.property.color = clr ###################################################################### # `CameraLight` class. ###################################################################### class CameraLight(HasTraits): """This class manages a tvtk.Light object and a LightGlyph object.""" # The version of this class. Used for persistence. __version__ = 0 ################################################################# # Traits. ################################################################# elevation = Range(-90.0, 90.0, 0.0, desc="the elevation of the light") azimuth = Range(-180.0, 180.0, 0.0, desc="the aziumthal angle of the light") activate = Trait(False, false, desc="specifies if the light is enabled or not") source = Instance(tvtk.Light, ()) # FIXME: Traits Delegation does not work correctly and changes to # this object are not reflected in the delegate nicely. #color = Delegate('source', modify=True) #intensity = Delegate('source', modify=True) # For now we mirror these traits from the source. intensity = Range(0.0, 1.0, 1.0, desc="the intensity of the light") color = vtk_color_trait((1.0, 1.0, 1.0)) color.desc = "the color of the light" default_view = View(Item(name='activate'), Item(name='elevation'), Item(name='azimuth'), Item(name='intensity'), Item(name='color')) ################################################################# # `object` interface. ################################################################# def __init__(self, renwin, **traits): self.glyph = LightGlyph() super(CameraLight, self).__init__(**traits) self.source.light_type = 'camera_light' self._intensity_changed(self.intensity) self._activate_changed(self.activate) self._color_changed(self.color) renwin.renderer.add_light(self.source) self.on_trait_change(renwin.render) def __get_pure_state__(self): d = self.__dict__.copy() for name in ['__sync_trait__', '__traits_listener__']: d.pop(name, None) return d def __getstate__(self): return state_pickler.dumps(self) def __setstate__(self, str_state): #self.__init__() state_pickler.set_state(self, state_pickler.loads_state(str_state)) ################################################################# # `LightGlyph` interface. ################################################################# def close(self, renwin): """Remove the light source and the glyph from the renderwindow. This is usually to be called when the Light is removed from the scene.""" ren = renwin.renderer self.on_trait_change(renwin.render, remove=True) ren.remove_light(self.source) self.remove_glyph(ren) def add_glyph(self, ren, bounds): """Add the light glyph to the passed renderer ('ren'). Scale the actors using the bounds (`bounds`) provided.""" self.glyph.add(ren, bounds) def remove_glyph(self, ren): """Remove the light glyph from the passed renderer.""" self.glyph.remove(ren) def move_to(self, elevation, azimuth): """Move the light to the specified elevation and azimuthal angles (in degrees).""" self.elevation = elevation self.azimuth = azimuth ################################################################# # Trait handlers. ################################################################# def _activate_changed(self, val): if val: self.source.switch = 1 self.glyph.show() else: self.source.switch = 0 self.glyph.hide() def _intensity_changed(self, val): self.source.intensity = val def _color_changed(self, val): if is_old_pipeline(): self.source.color = val else: self.source.set_color(val) self.glyph.set_color(val) def _elevation_changed(self, val): self.glyph.move_to(val, self.azimuth) self.source.position = self._to_pos(val, self.azimuth) def _azimuth_changed(self, val): self.glyph.move_to(self.elevation, val) self.source.position = self._to_pos(self.elevation, val) ################################################################# # Non-public interface. ################################################################# def _to_pos(self, elevation, azimuth): """Convert the given elevation and azimuth angles (degrees) to a position vector.""" theta = azimuth*pi/180.0 phi = (90.0-elevation)*pi/180.0 x = sin(theta)*sin(phi) y = cos(phi) z = cos(theta)*sin(phi) return x, y, z def _from_pos(self, x, y, z): """Given the position vector, return an elevation and azimuth angle (in degrees).""" theta = atan2(x, z) phi = atan2(sqrt(x**2+z**2), y) az = theta*180.0/pi el = 90.0 - phi*180.0/pi return el, az ###################################################################### # `CloseHandler` class. ###################################################################### class CloseHandler(Handler): """This class cleans up after the UI for the Light Manager is closed.""" def close(self, info, is_ok): """This method is invoked when the user closes the UI.""" light_manager = info.object light_manager.on_ui_close() return True ###################################################################### # `LightManager` class. ###################################################################### class LightManager(HasTraits): """This class manages all the lights and presents a GUI for the lights. There are two default lighting modes possible (specified via the `light_mode` trait). The 'vtk' mode uses the default lighting mode which is basically a single headlight. The 'raymond' mode creates three lights to give better overall illumination (thanks to Raymond Maple). """ # The version of this class. Used for persistence. __version__ = 0 ################################################################# # Traits. ################################################################# # Valid modes currently are 'vtk' and 'raymond'. 'vtk' is the # default VTK light setup with only one light on in headlight # mode. 'raymond' is Raymond Maple's default configuration with # three active lights. Please note that this only specifies a # default mode used to initialize the lights to a sane default. # The user can always change the light configuration via the GUI # such that the mode is neither 'vtk' nor 'raymond'. light_mode = Trait('raymond', TraitRevPrefixMap({'raymond':1, 'vtk':2}), desc='specifies a default lighting mode') # Specify the number of lights. If new lights are added they are # by default turned off. Similarly if the number of lights are # reduced the last lights alone are removed. number_of_lights = Range(3, 8, 4, desc='specifies the number of lights') # The list of added lights. lights = List(CameraLight, editor=ListEditor(use_notebook=True, page_name='Light'), record=True) view = View( Group( 'light_mode', 'number_of_lights', ), Item('lights', style='custom', show_label=False), resizable=True, buttons=['OK']) ################################################################# # `object` interface. ################################################################# def __init__(self, renwin, **traits): super(LightManager, self).__init__(**traits) self.ui = None self.renwin = renwin ren = self.renwin.renderer # VTK requires that there always be atleast one light turned # on (with SwitchOn). The renderer already has one headlight # already enabled. We merely set the intensity of this light # to zero and never change that. Note that if this light is # turned off, and no other lights are "on", then VTK will # create a new light! ren.lights[0].intensity = 0.0 # Create the lights. self.lights = [] for i in range(self.number_of_lights): light = CameraLight(self.renwin) self.lights.append(light) # Setup the light mode. self._light_mode_changed(self.light_mode) def __get_pure_state__(self): d = self.__dict__.copy() for name in ['__sync_trait__', 'renwin', 'ui', '__traits_listener__']: d.pop(name, None) return d def __set_pure_state__(self, state): first = ['light_mode', 'number_of_lights'] state_pickler.set_state(self, state, first=first, last=['lights']) def __getstate__(self): return state_pickler.dumps(self) def __setstate__(self, str_state): # This method is unnecessary since this object will almost # never be pickled by itself and only via the scene, therefore # __init__ will be called when the scene is constructed. # However, setstate is defined just for completeness. #self.__init__() state = state_pickler.loads_state(str_state) state_pickler.update_state(state) self.__set_pure_state__(state) ################################################################# # `LightManager` interface. ################################################################# def configure(self): """Pops up the GUI control widget.""" if self.ui is None: self._show_glyphs() view = View(Group(Item(name='light_mode'), Item(name='number_of_lights'), label='LightManager'), Group(Item(name='lights', style='custom'), label='Lights', selected=True, show_labels=False), resizable=True, buttons=['OK'], handler=CloseHandler()) self.ui = view.ui(self) else: try: self.ui.control.Raise() except AttributeError: pass def on_ui_close(self): """This method removes the glyphs used to show the lights on screen when the GUI dialog is closed. This is typically only called from the CloseHandler.""" ren = self.renwin.renderer for l in self.lights: l.remove_glyph(ren) self.ui = None ################################################################# # Non-public interface. ################################################################# def _show_glyphs(self): """Shows the glyphs when the light config UI is shown.""" rw = self.renwin ren = rw.renderer rw.reset_zoom() bounds = ren.compute_visible_prop_bounds() for light in self.lights: light.add_glyph(ren, bounds) rw.render() def _light_mode_changed(self, mode): lights = self.lights if mode == 'raymond': for i in range(len(lights)): if i < 3: lights[i].activate = True lights[i].intensity = 1.0 lights[i].color = 1.0, 1.0, 1.0 else: lights[i].activate = False lights[i].move_to(0.0, 0.0) lights[i].intensity = 1.0 lights[i].color = 1.0, 1.0, 1.0 lights[0].move_to(45.0, 45.0) lights[1].move_to(-30.0,-60.0) lights[1].intensity = 0.6 lights[2].move_to(-30.0, 60.0) lights[2].intensity = 0.5 else: for i in range(len(lights)): lights[i].move_to(0.0, 0.0) lights[i].intensity = 1.0 lights[i].color = 1.0, 1.0, 1.0 if i == 0 : lights[i].activate = True else: lights[i].activate = False def _number_of_lights_changed(self, old, new): ren = self.renwin.renderer changed = False if new == old: return elif new > old: for i in range(new - old): light = CameraLight(self.renwin) self.lights.append(light) changed = True elif new < old: for i in range(old - new): light = self.lights.pop() light.close(self.renwin) changed = True mayavi-4.5.0/tvtk/pyface/movie_maker.py0000644000076500000240000000535612747716314020546 0ustar prabhustaff00000000000000import os from glob import glob from contextlib import contextmanager from traits.api import Bool, Directory, HasTraits, Instance, Int, Str from traits.util.home_directory import get_home_directory class MovieMaker(HasTraits): record = Bool(False, desc='if a movie should be recorded') scene = Instance('tvtk.pyface.tvtk_scene.TVTKScene', record=False) directory = Directory filename = Str('anim%05d.png') anti_alias = Bool(True, desc='if the saved images should be anti-aliased') ################## # Private traits _subdir = Str _count = Int(0) def default_traits_view(self): from traitsui.api import Item, View view = View( Item('record'), Item('anti_alias'), Item('filename'), Item('directory'), ) return view def animation_start(self): if self.record: self._update_subdir() self._count = 0 self._save_scene(self._count) def animation_step(self): if self.record: self._count += 1 self._save_scene(self._count) def animation_stop(self): pass @contextmanager def record_movie(self): """Context manager to record a movie. Using this will turn on the recording automatically and also shut it off after it is done. For example:: >>> s = mlab.test_simple_surf() >>> ms = s.mlab_source >>> x = ms.x >>> with s.scene.movie_maker.record_movie() as mm: ... for i in range(10): ... ms.scalars = numpy.asarray(x * 0.1 * (i + 1), 'd') ... mm.animation_step() ... """ self.record = True self.animation_start() try: yield self finally: self.animation_stop() self.record = False def _save_scene(self, count): dir = os.path.join(self.directory, self._subdir) if not os.path.exists(dir): os.makedirs(dir) fname = os.path.join(dir, self.filename%count) if not self.anti_alias: orig_aa = self.scene.anti_aliasing_frames self.scene.save(fname) if not self.anti_alias: self.scene.anti_aliasing_frames = orig_aa def _directory_default(self): home = get_home_directory() return os.path.join(home, 'Documents', 'mayavi_movies') def _update_subdir(self): pattern = os.path.join(self.directory, 'movie*') existing = sorted([x for x in glob(pattern) if os.path.isdir(x)]) last_index = 1 if existing: last = existing[-1] last_index = int(last[-3:]) + 1 self._subdir = 'movie%03d'%last_index mayavi-4.5.0/tvtk/pyface/picker.py0000644000076500000240000004065012747716314017521 0ustar prabhustaff00000000000000#------------------------------------------------------------------------------ # Copyright (c) 2005-2016, Enthought, Inc. # All rights reserved. # # This software is provided without warranty under the terms of the BSD # license included in enthought/LICENSE.txt and may be redistributed only # under the conditions described in the aforementioned license. The license # is also available online at http://www.enthought.com/licenses/BSD.txt # Thanks for using Enthought open source! # # Author: Enthought, Inc. # Description: #------------------------------------------------------------------------------ """This module provides basic picking functionality. Using this, one can interactively select a point and/or a cell in the data. One can also can use a world point picker (i.e. a generic point in space) and probe for the data at that point. """ # Author: Prabhu Ramachandran # Copyright (c) 2004-2016, Enthought, Inc. # License: BSD Style. from traits.api import HasTraits, Trait, Long, Array, Any, Float, \ Instance, Range, true, Str from traitsui.api import View, Group, Item, Handler from tvtk.api import tvtk from tvtk.tvtk_base import TraitRevPrefixMap, false_bool_trait from tvtk.common import configure_input from apptools.persistence import state_pickler ###################################################################### # Utility functions. ###################################################################### def get_last_input(data): """Attempts to get the deepest possible data value in the pipeline. Used when probing a selected point.""" tmp = inp = data while tmp: try: tmp = inp.input if tmp: inp = tmp except AttributeError: tmp = None return inp ###################################################################### # `PickedData` class. ###################################################################### class PickedData(HasTraits): """This class stores the picked data.""" # Was there a valid picked point? valid = Trait(false_bool_trait, desc='specifies the validity of the pick event') # Id of picked point (-1 implies none was picked) point_id = Long(-1, desc='the picked point ID') # Id of picked cell (-1 implies none was picked) cell_id = Long(-1, desc='the picked cell ID') # World pick -- this has no ID. world_pick = Trait(false_bool_trait, desc='specifies if the pick is a world pick.') # Coordinate of picked point. coordinate = Array('d', (3,), labels=['x', 'y', 'z'], cols=3, desc='the coordinate of the picked point') # The picked data -- usually a tvtk.PointData or tvtk.CellData of # the object picked. The user can use this data and extract any # necessary values. data = Any ###################################################################### # `PickerHandler` class. ###################################################################### class PickHandler(HasTraits): """This is the handler for the picked data. Subclass this to do what you need. Each time a pick occurs the handle_pick is called by the `Picker` class.""" def handle_pick(self, data): """Called when a pick event happens. Parameters ---------- - data : `PickedData` instance. """ pass ###################################################################### # `DefaultPickerHandler` class. ###################################################################### class DefaultPickHandler(PickHandler): """The default handler for the picked data.""" # Traits. ID = Trait(None, None, Long, desc='the picked ID') coordinate = Trait(None, None, Array('d', (3,)), desc='the coordinate of the picked point') scalar = Trait(None, None, Float, desc='the scalar at picked point') vector = Trait(None, None, Array('d', (3,)), desc='the vector at picked point') tensor = Trait(None, None, Array('d', (3,3)), desc='the tensor at picked point') # History of picked data. history = Str default_view = View(Item(name='ID', style='readonly'), Item(name='coordinate', style='readonly'), Item(name='scalar', style='readonly'), Item(name='vector', style='readonly'), Item(name='tensor', style='readonly'), Item(name='history', style='custom'), ) def __init__(self, **traits): super(DefaultPickHandler, self).__init__(**traits) # This saves all the data picked earlier. self.data = {'ID':[], 'coordinate':[], 'scalar':[], 'vector':[], 'tensor':[]} ################################################################# # `DefaultPickHandler` interface. ################################################################# def handle_pick(self, data): """Called when a pick event happens. """ if data.valid_: if data.point_id > -1: self.ID = data.point_id elif data.cell_id > -1: self.ID = data.cell_id self.coordinate = data.coordinate if data.data: array_data = {'scalar': data.data.scalars, 'vector': data.data.vectors, 'tensor': data.data.tensors} else: array_data = {'scalar': None, 'vector': None, 'tensor': None} for name in array_data.keys(): if array_data[name]: setattr(self, name, array_data[name][self.ID]) else: setattr(self, name, None) else: for name in ['ID', 'coordinate', 'scalar', 'vector', 'tensor']: setattr(self, name, None) self._update_data() ################################################################# # Non-public interface. ################################################################# def _update_data(self): for name in ['ID', 'coordinate', 'scalar', 'vector', 'tensor']: value = getattr(self, name) self.data.get(name).append(getattr(self, name)) self.history += '%s: %r\n'%(name, value) ###################################################################### # `CloseHandler` class. ###################################################################### class CloseHandler(Handler): """This class cleans up after the UI for the Picker is closed.""" def close(self, info, is_ok): """This method is invoked when the user closes the UI.""" picker = info.object picker.on_ui_close() return True ###################################################################### # `Picker` class. ###################################################################### class Picker(HasTraits): """This module creates a 'Picker' that can interactively select a point and/or a cell in the data. It also can use a world point picker (i.e. a generic point in space) and will probe for the data at that point. The Picker is usually called via a callback from the GUI interactor window. After performing a pick on the VTK scene, a Picker object creates a `PickedData` object and passes it on to the pick_handler trait for further handling. """ # The version of this class. Used for persistence. __version__ = 0 # Speficifies the pick type. The 'point_picker' and 'cell_picker' # options are self-explanatory. The 'world_picker' picks a point # using a WorldPointPicker and additionally uses a ProbeFilter to # probe the data at the picked point. pick_type = Trait('point', TraitRevPrefixMap({'point_picker':1, 'cell_picker':2, 'world_picker':3}), desc='specifies the picker type to use') # The pick_handler. Set this to your own subclass if you want do # do something different from the default. pick_handler = Trait(DefaultPickHandler(), Instance(PickHandler)) # Picking tolerance. tolerance = Range(0.0, 0.25, 0.025) # show the GUI on pick ? show_gui = true(desc = "whether to show the picker GUI on pick") # Raise the GUI on pick ? auto_raise = true(desc = "whether to raise the picker GUI on pick") default_view = View(Group(Group(Item(name='pick_type'), Item(name='tolerance'), show_border=True), Group(Item(name='pick_handler', style='custom'), show_border=True, show_labels=False), Group(Item(name='show_gui'), Item(name='auto_raise'), show_border=True), ), resizable=True, buttons=['OK'], handler=CloseHandler()) ################################################################# # `object` interface. ################################################################# def __init__(self, renwin, **traits): super(Picker, self).__init__(**traits) self.renwin = renwin self.pointpicker = tvtk.PointPicker() self.cellpicker = tvtk.CellPicker() self.worldpicker = tvtk.WorldPointPicker() self.probe_data = tvtk.PolyData() self._tolerance_changed(self.tolerance) # Use a set of axis to show the picked point. self.p_source = tvtk.Axes() self.p_mapper = tvtk.PolyDataMapper() self.p_actor = tvtk.Actor () self.p_source.symmetric = 1 self.p_actor.pickable = 0 self.p_actor.visibility = 0 prop = self.p_actor.property prop.line_width = 2 prop.ambient = 1.0 prop.diffuse = 0.0 configure_input(self.p_mapper, self.p_source) self.p_actor.mapper = self.p_mapper self.probe_data.points = [[0.0, 0.0, 0.0]] self.ui = None def __get_pure_state__(self): d = self.__dict__.copy() for x in ['renwin', 'ui', 'pick_handler', '__sync_trait__', '__traits_listener__']: d.pop(x, None) return d def __getstate__(self): return state_pickler.dumps(self) def __setstate__(self, str_state): # This method is unnecessary since this object will almost # never be pickled by itself and only via the scene, therefore # __init__ will be called when the scene is constructed. # However, setstate is defined just for completeness. state_pickler.set_state(self, state_pickler.loads_state(str_state)) ################################################################# # `Picker` interface. ################################################################# def pick(self, x, y): """Calls one of the current pickers and then passes the obtained data to the `self.pick_handler` object's `handle_pick` method. Parameters ---------- - x : X position of the mouse in the window. - y : Y position of the mouse in the window. Note that the origin of x, y must be at the left bottom corner of the window. Thus, for most GUI toolkits, y must be flipped appropriately such that y=0 is the bottom of the window. """ data = None if self.pick_type_ == 1: data = self.pick_point(x, y) elif self.pick_type_ == 2: data = self.pick_cell(x, y) elif self.pick_type_ == 3: data = self.pick_world(x, y) self.pick_handler.handle_pick(data) if self.show_gui: self._setup_gui() def pick_point(self, x, y): """ Picks the nearest point. Returns a `PickedData` instance.""" self.pointpicker.pick((float(x), float(y), 0.0), self.renwin.renderer) pp = self.pointpicker id = pp.point_id picked_data = PickedData() coord = pp.pick_position picked_data.coordinate = coord if id > -1: data = pp.mapper.input.point_data bounds = pp.mapper.input.bounds picked_data.valid = 1 picked_data.point_id = id picked_data.data = data self._update_actor(coord, bounds) else: self.p_actor.visibility = 0 self.renwin.render() return picked_data def pick_cell (self, x, y): """ Picks the nearest cell. Returns a `PickedData` instance.""" try: self.cellpicker.pick(float(x), float(y), 0.0, self.renwin.renderer) except TypeError: # On old versions of VTK, the signature used to be different self.cellpicker.pick((float(x), float(y), 0.0), self.renwin.renderer) cp = self.cellpicker id = cp.cell_id picked_data = PickedData() coord = cp.pick_position picked_data.coordinate = coord if id > -1: data = cp.mapper.input.cell_data bounds = cp.mapper.input.bounds picked_data.valid = 1 picked_data.cell_id = id picked_data.data = data self._update_actor(coord, bounds) else: self.p_actor.visibility = 0 self.renwin.render() return picked_data def pick_world(self, x, y): """ Picks a world point and probes for data there. Returns a `PickedData` instance.""" self.worldpicker.pick((float(x), float(y), 0.0), self.renwin.renderer) # Use the cell picker to get the data that needs to be probed. try: self.cellpicker.pick( (float(x), float(y), 0.0), self.renwin.renderer) except TypeError: self.cellpicker.pick( float(x), float(y), 0.0, self.renwin.renderer) wp = self.worldpicker cp = self.cellpicker coord = wp.pick_position self.probe_data.points = [list(coord)] picked_data = PickedData() picked_data.coordinate = coord if cp.mapper: data = get_last_input(cp.mapper.input) # Need to create the probe each time because otherwise it # does not seem to work properly. probe = tvtk.ProbeFilter() probe.source = data probe.input = self.probe_data probe.update() data = probe.output.point_data bounds = cp.mapper.input.bounds picked_data.valid = 1 picked_data.world_pick = 1 picked_data.point_id = 0 picked_data.data = data self._update_actor(coord, bounds) else: self.p_actor.visibility = 0 self.renwin.render() return picked_data def on_ui_close(self): """This method makes the picker actor invisible when the GUI dialog is closed.""" self.p_actor.visibility = 0 self.renwin.renderer.remove_actor(self.p_actor) self.ui = None ################################################################# # Non-public interface. ################################################################# def _tolerance_changed(self, val): """ Trait handler for the tolerance trait.""" self.pointpicker.tolerance = val self.cellpicker.tolerance = val def _update_actor(self, coordinate, bounds): """Updates the actor by setting its position and scale.""" dx = 0.3*(bounds[1]-bounds[0]) dy = 0.3*(bounds[3]-bounds[2]) dz = 0.3*(bounds[5]-bounds[4]) scale = max(dx,dy,dz) self.p_source.origin = coordinate self.p_source.scale_factor = scale self.p_actor.visibility = 1 def _setup_gui(self): """Pops up the GUI control widget.""" # Popup the GUI control. if self.ui is None: self.ui = self.edit_traits() # Note that we add actors to the renderer rather than to # renwin to prevent event notifications on actor # additions. self.renwin.renderer.add_actor(self.p_actor) elif self.auto_raise: try: self.ui.control.Raise() except AttributeError: pass mayavi-4.5.0/tvtk/pyface/scene.py0000644000076500000240000000174212747716314017340 0ustar prabhustaff00000000000000#------------------------------------------------------------------------------ # Copyright (c) 2005, Enthought, Inc. # All rights reserved. # # This software is provided without warranty under the terms of the BSD # license included in enthought/LICENSE.txt and may be redistributed only # under the conditions described in the aforementioned license. The license # is also available online at http://www.enthought.com/licenses/BSD.txt # Thanks for using Enthought open source! # # Author: Enthought, Inc. # Description: #------------------------------------------------------------------------------ """A VTK interactor scene widget for the PyFace wxPython backend. See the class docs for more details. """ # Author: Prabhu Ramachandran # Copyright (c) 2004-2007, Enthought, Inc. # License: BSD Style. # Import the toolkit specific version. from tvtk.pyface.toolkit import toolkit_object Scene = toolkit_object('scene:Scene') mayavi-4.5.0/tvtk/pyface/scene_editor.py0000644000076500000240000000055512747716314020707 0ustar prabhustaff00000000000000"""A `SceneEditor` for the `SceneModel`. """ # Authors: Prabhu Ramachandran # Robert Kern # # Copyright (c) 2007, Enthought, Inc. # License: BSD Style. # Import the toolkit specific version. from tvtk.pyface.toolkit import toolkit_object SceneEditor = toolkit_object('scene_editor:SceneEditor') mayavi-4.5.0/tvtk/pyface/scene_model.py0000644000076500000240000002735612747716314020531 0ustar prabhustaff00000000000000""" TODO: * We need a cleaner way to manipulate the camera and other things as a model. The current approach will be far from perfect but should work. Caveats: * You can't have multiple views of the model. This will not be supported. """ # Author: Prabhu Ramachandran # Copyright (c) 2007, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import Dict, Event, \ Instance, List, Property from traitsui.api import View, Group, Item, InstanceEditor from tvtk.pyface.tvtk_scene import TVTKScene ##################################################################### # `SceneModelError` class ##################################################################### class SceneModelError(Exception): pass ##################################################################### # `SceneModel` class ##################################################################### class SceneModel(TVTKScene): ######################################## # TVTKScene traits. picker = Property ######################################## # SceneModel traits. # A convenient dictionary based interface to add/remove actors and widgets. # This is similar to the interface provided for the ActorEditor. actor_map = Dict() # This is used primarily to implement the add_actor/remove_actor methods. actor_list = List() # The actual scene being edited. scene_editor = Instance(TVTKScene) do_render = Event() # Fired when this is activated. activated = Event() # The control is going to be closed. closing = Event() # This exists just to mirror the TVTKWindow api. scene = Property ################################### # View related traits. # Render_window's view. _stereo_view = Group(Item(name='stereo_render'), Item(name='stereo_type'), show_border=True, label='Stereo rendering', ) # The default view of this object. default_view = View(Group( Group(Item(name='background'), Item(name='foreground'), Item(name='parallel_projection'), Item(name='disable_render'), Item(name='off_screen_rendering'), Item(name='jpeg_quality'), Item(name='jpeg_progressive'), Item(name='magnification'), Item(name='anti_aliasing_frames'), ), Group(Item(name='render_window', style='custom', visible_when='object.stereo', editor=InstanceEditor(view=View(_stereo_view)), show_label=False), ), label='Scene'), Group(Item(name='light_manager', style='custom', editor=InstanceEditor(), show_label=False), label='Lights') ) ################################### # Private traits. # Used by the editor to determine if the widget was enabled or not. enabled_info = Dict() def __init__(self, parent=None, **traits): """ Initializes the object. """ # Base class constructor. We call TVTKScene's super here on purpose. # Calling TVTKScene's init will create a new window which we do not # want. super(TVTKScene, self).__init__(**traits) self.control = None ###################################################################### # TVTKScene API. ###################################################################### def render(self): """ Force the scene to be rendered. Nothing is done if the `disable_render` trait is set to True.""" self.do_render = True def add_actors(self, actors): """ Adds a single actor or a tuple or list of actors to the renderer.""" if hasattr(actors, '__iter__'): self.actor_list.extend(actors) else: self.actor_list.append(actors) def remove_actors(self, actors): """ Removes a single actor or a tuple or list of actors from the renderer.""" my_actors = self.actor_list if hasattr(actors, '__iter__'): for actor in actors: my_actors.remove(actor) else: my_actors.remove(actors) # Conevenience methods. add_actor = add_actors remove_actor = remove_actors def add_widgets(self, widgets, enabled=True): """Adds widgets to the renderer. """ if not hasattr(widgets, '__iter__'): widgets = [widgets] for widget in widgets: self.enabled_info[widget] = enabled self.add_actors(widgets) def remove_widgets(self, widgets): """Removes widgets from the renderer.""" if not hasattr(widgets, '__iter__'): widgets = [widgets] self.remove_actors(widgets) for widget in widgets: del self.enabled_info[widget] def reset_zoom(self): """Reset the camera so everything in the scene fits.""" if self.scene_editor is not None: self.scene_editor.reset_zoom() def save(self, file_name, size=None, **kw_args): """Saves rendered scene to one of several image formats depending on the specified extension of the filename. If an additional size (2-tuple) argument is passed the window is resized to the specified size in order to produce a suitably sized output image. Please note that when the window is resized, the window may be obscured by other widgets and the camera zoom is not reset which is likely to produce an image that does not reflect what is seen on screen. Any extra keyword arguments are passed along to the respective image format's save method. """ self._check_scene_editor() self.scene_editor.save(file_name, size, **kw_args) def save_ps(self, file_name): """Saves the rendered scene to a rasterized PostScript image. For vector graphics use the save_gl2ps method.""" self._check_scene_editor() self.scene_editor.save_ps(file_name) def save_bmp(self, file_name): """Save to a BMP image file.""" self._check_scene_editor() self.scene_editor.save_bmp(file_name) def save_tiff(self, file_name): """Save to a TIFF image file.""" self._check_scene_editor() self.scene_editor.save_tiff(file_name) def save_png(self, file_name): """Save to a PNG image file.""" self._check_scene_editor() self.scene_editor.save_png(file_name) def save_jpg(self, file_name, quality=None, progressive=None): """Arguments: file_name if passed will be used, quality is the quality of the JPEG(10-100) are valid, the progressive arguments toggles progressive jpegs.""" self._check_scene_editor() self.scene_editor.save_jpg(file_name, quality, progressive) def save_iv(self, file_name): """Save to an OpenInventor file.""" self._check_scene_editor() self.scene_editor.save_iv(file_name) def save_vrml(self, file_name): """Save to a VRML file.""" self._check_scene_editor() self.scene_editor.save_vrml(file_name) def save_oogl(self, file_name): """Saves the scene to a Geomview OOGL file. Requires VTK 4 to work.""" self._check_scene_editor() self.scene_editor.save_oogl(file_name) def save_rib(self, file_name, bg=0, resolution=None, resfactor=1.0): """Save scene to a RenderMan RIB file. Keyword Arguments: file_name -- File name to save to. bg -- Optional background option. If 0 then no background is saved. If non-None then a background is saved. If left alone (defaults to None) it will result in a pop-up window asking for yes/no. resolution -- Specify the resolution of the generated image in the form of a tuple (nx, ny). resfactor -- The resolution factor which scales the resolution. """ self._check_scene_editor() self.scene_editor.save_rib(file_name, bg, resolution, resfactor) def save_wavefront(self, file_name): """Save scene to a Wavefront OBJ file. Two files are generated. One with a .obj extension and another with a .mtl extension which contains the material proerties. Keyword Arguments: file_name -- File name to save to """ self._check_scene_editor() self.scene_editor.save_wavefront(file_name) def save_gl2ps(self, file_name, exp=None): """Save scene to a vector PostScript/EPS/PDF/TeX file using GL2PS. If you choose to use a TeX file then note that only the text output is saved to the file. You will need to save the graphics separately. Keyword Arguments: file_name -- File name to save to. exp -- Optionally configured vtkGL2PSExporter object. Defaults to None and this will use the default settings with the output file type chosen based on the extention of the file name. """ self._check_scene_editor() self.scene_editor.save_gl2ps(file_name, exp) def save_povray(self, file_name): self._check_scene_editor() self.scene_editor.save_povray(file_name) def save_x3d(self, filename): self._check_scene_editor() self.scene_editor.save_x3d(file_name) def get_size(self): """Return size of the render window.""" self._check_scene_editor() return self.scene_editor.get_size() def set_size(self, size): """Set the size of the window.""" self._check_scene_editor() self.scene_editor.set_size(size) def _update_view(self, x, y, z, vx, vy, vz): """Used internally to set the view.""" if self.scene_editor is not None: self.scene_editor._update_view(x, y, z, vx, vy, vz) def _check_scene_editor(self): if self.scene_editor is None: msg = """ This method requires that there be an active scene editor. To do this, you will typically need to invoke:: object.edit_traits() where object is the object that contains the SceneModel. """ raise SceneModelError(msg) def _scene_editor_changed(self, old, new): if new is None: self._renderer = None self._renwin = None self._interactor = None else: self._renderer = new._renderer self._renwin = new._renwin self._interactor = new._interactor def _get_picker(self): """Getter for the picker.""" se = self.scene_editor if se is not None and hasattr(se, 'picker'): return se.picker return None def _get_light_manager(self): """Getter for the light manager.""" se = self.scene_editor if se is not None: return se.light_manager return None ###################################################################### # SceneModel API. ###################################################################### def _get_scene(self): """Getter for the scene property.""" return self mayavi-4.5.0/tvtk/pyface/toolkit.py0000644000076500000240000000615412747716314017732 0ustar prabhustaff00000000000000#------------------------------------------------------------------------------ # Copyright (c) 2007, Riverbank Computing Limited # All rights reserved. # # This software is provided without warranty under the terms of the BSD # license included in enthought/LICENSE.txt and may be redistributed only # under the conditions described in the aforementioned license. The license # is also available online at http://www.enthought.com/licenses/BSD.txt # #------------------------------------------------------------------------------ # Standard library imports. import sys # Enthought library imports. from traits.etsconfig.api import ETSConfig # This is set to the toolkit selection. _toolkit = None def _init_toolkit(): """ Initialise the current toolkit. """ def import_toolkit(tk): try: # Try and import the toolkit's pyface backend init module. __import__('tvtk.pyface.ui.%s.init' % tk) except: raise if ETSConfig.toolkit: # If the toolkit has been explicitly specified, just import it and # allow failure if an exception is thrown. import_toolkit(ETSConfig.toolkit) tk = ETSConfig.toolkit else: # Toolkits to check for if none is explicitly specified. known_toolkits = ('wx', 'qt4', 'null') for tk in known_toolkits: try: import_toolkit(tk) # In case we have just decided on a toolkit, tell everybody else. ETSConfig.toolkit = tk break except ImportError: pass else: # Try to import the null toolkit but don't set the ETSConfig toolkit try: tk = 'null' import_toolkit(tk) import warnings warnings.warn("Unable to import the %s backend for pyface;"\ " using the 'null' toolkit instead." % ", ".join(toolkits)) except: raise ImportError("unable to import a pyface backend for any of the %s toolkits" \ % ", ".join(known_toolkits)) # Save the imported toolkit name. global _toolkit _toolkit = tk # Do this once then disappear. _init_toolkit() del _init_toolkit def toolkit_object(name): """ Return the toolkit specific object with the given name. The name consists of the relative module path and the object name separated by a colon. """ mname, oname = name.split(':') be = 'tvtk.pyface.ui.%s.' % _toolkit be_mname = be + mname class Unimplemented(object): """ This is returned if an object isn't implemented by the selected toolkit. It raises an exception if it is ever instantiated. """ def __init__(self, *args, **kwargs): raise NotImplementedError("the %s pyface backend doesn't implement %s" % (be, oname)) be_obj = Unimplemented try: __import__(be_mname) try: be_obj = getattr(sys.modules[be_mname], oname) except AttributeError: pass except ImportError: pass return be_obj mayavi-4.5.0/tvtk/pyface/tvtk_scene.py0000644000076500000240000010636212747716314020414 0ustar prabhustaff00000000000000"""A TVTK interactor scene widget. This class only uses TVTK and Traits. It does not even use any Pyface widgets. This is nice when you want to create a raw TVTK window but with some nice funcationality that is similar to the widgets. It is also the base class for the toolkit specific classes since it implements the core functionality. See the class docs for more details. """ # Author: Prabhu Ramachandran # Copyright (c) 2007-2016, Enthought, Inc. # License: BSD Style. from __future__ import print_function import os import os.path from apptools.persistence import state_pickler from tvtk.api import tvtk from tvtk import messenger from tvtk.tvtk_base import vtk_color_trait from tvtk.common import configure_input from traits.api import HasPrivateTraits, HasTraits, Any, Int, \ Property, Instance, Event, Range, Bool, Trait, Str from tvtk.pyface import light_manager VTK_VER = tvtk.Version().vtk_version ###################################################################### # `TVTKScene` class. ###################################################################### class TVTKScene(HasPrivateTraits): """A TVTK interactor scene widget. This widget uses a RenderWindowInteractor and therefore supports interaction with VTK widgets. The widget uses TVTK. The widget also supports the following: - Save the scene to a bunch of common (and not so common) image formats. - save the rendered scene to the clipboard. - adding/removing lists/tuples of actors - setting the view to useful predefined views (just like in MayaVi). - If one passes `stereo=1` to the constructor, stereo rendering is enabled. By default this is disabled. Changing the stereo trait has no effect during runtime. - One can disable rendering by setting `disable_render` to True. """ # The version of this class. Used for persistence. __version__ = 0 ########################################################################### # Traits. ########################################################################### # Turn on/off stereo rendering. This is set on initialization and # has no effect once the widget is realized. stereo = Bool(False) # Perform line smoothing for all renderered lines. This produces # much nicer looking lines but renders slower. This setting works # only when called before the first render. line_smoothing = Bool(False) # Perform point smoothing for all renderered points. This # produces much nicer looking points but renders slower. This # setting works only when called before the first render. point_smoothing = Bool(False) # Perform polygon smoothing (anti-aliasing) for all rendered # polygons. This produces much nicer looking points but renders # slower. This setting works only when called before the first # render. polygon_smoothing = Bool(False) # Enable parallel projection. This trait is synchronized with # that of the camera. parallel_projection = Bool(False, desc='if the camera uses parallel projection') # Disable rendering. disable_render = Bool(False, desc='if rendering is to be disabled') # Enable off-screen rendering. This allows a user to render the # scene to an image without the need to have the window active. # For example, the application can be minimized and the saved # scene should be generated correctly. This is handy for batch # scripts and the like. This works under Win32. Under Mac OS X # and Linux it requires a recent VTK version (later than Oct 2005 # and ideally later than March 2006) to work correctly. off_screen_rendering = Bool(False, desc='if off-screen rendering is enabled') # The background color of the window. This is really a shadow # trait of the renderer's background. Delegation does not seem to # work nicely for this. background = Trait(vtk_color_trait((0.5, 0.5, 0.5)), desc='the background color of the window') # The default foreground color of any actors. This basically # saves the preference and actors will listen to changes -- # the scene itself does not use this. foreground = Trait(vtk_color_trait((1.0, 1.0, 1.0)), desc='the default foreground color of actors') # The magnification to use when generating images from the render # window. magnification = Range(1, 2048, 1, desc='the magnification used when the screen is saved to an image') # Specifies the number of frames to use for anti-aliasing when # saving a scene. This basically increases # `self.render_window.aa_frames` in order to produce anti-aliased # figures when a scene is saved to an image. It then restores the # `aa_frames` in order to get interactive rendering rates. anti_aliasing_frames = Range(0, 20, 8, desc='number of frames to use for anti-aliasing when saving a scene') # Default JPEG quality. jpeg_quality = Range(10, 100, 95, desc='the quality of the JPEG image to produce') # Default JPEG progressive setting. jpeg_progressive = Bool(True, desc='if the generated JPEG should be progressive') # The light manager. light_manager = Instance(light_manager.LightManager, record=True) # The movie maker instance. movie_maker = Instance('tvtk.pyface.movie_maker.MovieMaker', record=True) # Is the scene busy or not. busy = Property(Bool, record=False) ######################################## # Events # Lifecycle events: there are no opening/opened events since the # control is actually created in __init__. # The control is going to be closed. closing = Event(record=False) # The control has been closed. closed = Event(record=False) # Event fired when an actor is added to the scene. actor_added = Event(record=False) # Event fired when any actor is removed from the scene. actor_removed = Event(record=False) ######################################## # Properties. # The interactor used by the scene. interactor = Property(Instance(tvtk.GenericRenderWindowInteractor)) # The render_window. render_window = Property(Instance(tvtk.RenderWindow)) # The renderer. renderer = Property(Instance(tvtk.Renderer)) # The camera. camera = Property(Instance(tvtk.Camera)) # The control to mimic the Widget behavior. control = Any ######################################## # Private traits. # A recorder for script recording. recorder = Instance(HasTraits, record=False, transient=True) # Cached last camera state. _last_camera_state = Any(transient=True) _camera_observer_id = Int(transient=True) _script_id = Str(transient=True) # The renderer instance. _renderer = Instance(tvtk.Renderer) _renwin = Instance(tvtk.RenderWindow) _interactor = Instance(tvtk.RenderWindowInteractor) _camera = Instance(tvtk.Camera) _busy_count = Int(0) ########################################################################### # 'object' interface. ########################################################################### def __init__(self, parent=None, **traits): """ Initializes the object. """ # Base class constructor. super(TVTKScene, self).__init__(**traits) # Used to set the view of the scene. self._def_pos = 1 self.control = self._create_control(parent) self._renwin.update_traits() def __get_pure_state__(self): """Allows us to pickle the scene.""" # The control attribute is not picklable since it is a VTK # object so we remove it. d = self.__dict__.copy() for x in ['control', '_renwin', '_interactor', '_camera', '_busy_count', '__sync_trait__', 'recorder', '_last_camera_state', '_camera_observer_id', '_script_id', '__traits_listener__']: d.pop(x, None) # Additionally pickle these. d['camera'] = self.camera return d def __getstate__(self): return state_pickler.dumps(self) def __setstate__(self, str_state): # This method is unnecessary since this object will almost # never be pickled by itself and only via an object that # contains it, therefore __init__ will be called when the # scene is constructed. However, setstate is defined just for # completeness. state_pickler.set_state(self, state_pickler.loads_state(str_state)) ########################################################################### # 'event' interface. ########################################################################### def _closed_fired(self): self.light_manager = None self._interactor = None self.movie_maker = None ########################################################################### # 'Scene' interface. ########################################################################### def render(self): """ Force the scene to be rendered. Nothing is done if the `disable_render` trait is set to True.""" if not self.disable_render: self._renwin.render() def add_actors(self, actors): """ Adds a single actor or a tuple or list of actors to the renderer.""" # Reset the zoom if this is the first actor. reset_zoom = (len(self._renderer.actors) == 0 and len(self._renderer.volumes)==0) if hasattr(actors, '__iter__'): for actor in actors: self._renderer.add_actor(actor) else: self._renderer.add_actor(actors) self.actor_added = actors if reset_zoom: self.reset_zoom() else: self.render() def remove_actors(self, actors): """ Removes a single actor or a tuple or list of actors from the renderer.""" if hasattr(actors, '__iter__'): for actor in actors: self._renderer.remove_actor(actor) else: self._renderer.remove_actor(actors) self.actor_removed = actors self.render() # Conevenience methods. add_actor = add_actors remove_actor = remove_actors def add_widgets(self, widgets, enabled=True): """Adds a single 3D widget or a sequence of widgets to the renderer. If `enabled` is True the widget is also enabled once it is added.""" if not hasattr(widgets, '__iter__'): widgets = [widgets] iren = self._interactor for widget in widgets: widget.interactor = iren widget.enabled = enabled self.render() def remove_widgets(self, widgets): """Removes a single 3D widget or a sequence of widgets from the renderer.""" if not hasattr(widgets, '__iter__'): widgets = [widgets] iren = self._interactor for widget in widgets: if widget.interactor is not None: widget.enabled = False widget.interactor = None self.render() def close(self): """Close the scene cleanly. This ensures that the scene is shutdown cleanly. This should be called if you are getting async errors when closing a scene from a UI. This is based on the observations of Charl Botha here: http://public.kitware.com/pipermail/vtkusers/2008-May/095291.html """ # Return if we are already closed. if self._renwin is None: return # Fire the "closing" event. self.closing = True # Disable any renders through traits listner callbacks. self.disable_render = True # Remove sync trait listeners. self.sync_trait('background', self._renderer, remove=True) self.sync_trait('parallel_projection', self.camera, remove=True) self.sync_trait('off_screen_rendering', self._renwin, remove=True) # Remove all the renderer's props. self._renderer.remove_all_view_props() # Set the renderwindow to release all resources and the OpenGL # context. self._renwin.finalize() # Disconnect the interactor from the renderwindow. self._interactor.render_window = None # Remove the reference to the render window. del self._renwin # Fire the "closed" event. self.closed = True def x_plus_view(self): """View scene down the +X axis. """ self._update_view(self._def_pos, 0, 0, 0, 0, 1) self._record_methods('x_plus_view()') def x_minus_view(self): """View scene down the -X axis. """ self._update_view(-self._def_pos, 0, 0, 0, 0, 1) self._record_methods('x_minus_view()') def z_plus_view(self): """View scene down the +Z axis. """ self._update_view(0, 0, self._def_pos, 0, 1, 0) self._record_methods('z_plus_view()') def z_minus_view(self): """View scene down the -Z axis. """ self._update_view(0, 0, -self._def_pos, 0, 1, 0) self._record_methods('z_minus_view()') def y_plus_view(self): """View scene down the +Y axis. """ self._update_view(0, self._def_pos, 0, 1, 0, 0) self._record_methods('y_plus_view()') def y_minus_view(self): """View scene down the -Y axis. """ self._update_view(0, -self._def_pos, 0, 1, 0, 0) self._record_methods('y_minus_view()') def isometric_view(self): """Set the view to an iso-metric view. """ self._update_view(self._def_pos, self._def_pos, self._def_pos, 0, 0, 1) self._record_methods('isometric_view()') def reset_zoom(self): """Reset the camera so everything in the scene fits.""" self._renderer.reset_camera() self.render() self._record_methods('reset_zoom()') def save(self, file_name, size=None, **kw_args): """Saves rendered scene to one of several image formats depending on the specified extension of the filename. If an additional size (2-tuple) argument is passed the window is resized to the specified size in order to produce a suitably sized output image. Please note that when the window is resized, the window may be obscured by other widgets and the camera zoom is not reset which is likely to produce an image that does not reflect what is seen on screen. Any extra keyword arguments are passed along to the respective image format's save method. """ ext = os.path.splitext(file_name)[1] meth_map = {'.ps': 'ps', '.bmp': 'bmp', '.tiff': 'tiff', '.png': 'png', '.jpg': 'jpg', '.jpeg': 'jpg', '.iv': 'iv', '.wrl': 'vrml', '.vrml':'vrml', '.oogl': 'oogl', '.rib': 'rib', '.obj': 'wavefront', '.eps': 'gl2ps', '.pdf':'gl2ps', '.tex': 'gl2ps', '.x3d': 'x3d', '.pov': 'povray'} if ext.lower() not in meth_map: raise ValueError( 'Unable to find suitable image type for given file extension.' ) meth = getattr(self, 'save_' + meth_map[ext]) if size is not None: orig_size = self.get_size() self.set_size(size) meth(file_name, **kw_args) self.set_size(orig_size) self._record_methods('save(%r, %r)'%(file_name, size)) else: meth(file_name, **kw_args) self._record_methods('save(%r)'%(file_name)) def save_ps(self, file_name): """Saves the rendered scene to a rasterized PostScript image. For vector graphics use the save_gl2ps method.""" if len(file_name) != 0: w2if = tvtk.WindowToImageFilter(read_front_buffer= not self.off_screen_rendering) w2if.magnification = self.magnification self._lift() w2if.input = self._renwin ex = tvtk.PostScriptWriter() ex.file_name = file_name configure_input(ex, w2if) self._exporter_write(ex) def save_bmp(self, file_name): """Save to a BMP image file.""" if len(file_name) != 0: w2if = tvtk.WindowToImageFilter(read_front_buffer= not self.off_screen_rendering) w2if.magnification = self.magnification self._lift() w2if.input = self._renwin ex = tvtk.BMPWriter() ex.file_name = file_name configure_input(ex, w2if) self._exporter_write(ex) def save_tiff(self, file_name): """Save to a TIFF image file.""" if len(file_name) != 0: w2if = tvtk.WindowToImageFilter(read_front_buffer= not self.off_screen_rendering) w2if.magnification = self.magnification self._lift() w2if.input = self._renwin ex = tvtk.TIFFWriter() ex.file_name = file_name configure_input(ex, w2if) self._exporter_write(ex) def save_png(self, file_name): """Save to a PNG image file.""" if len(file_name) != 0: w2if = tvtk.WindowToImageFilter(read_front_buffer= not self.off_screen_rendering) w2if.magnification = self.magnification self._lift() w2if.input = self._renwin ex = tvtk.PNGWriter() ex.file_name = file_name configure_input(ex, w2if) self._exporter_write(ex) def save_jpg(self, file_name, quality=None, progressive=None): """Arguments: file_name if passed will be used, quality is the quality of the JPEG(10-100) are valid, the progressive arguments toggles progressive jpegs.""" if len(file_name) != 0: if not quality and not progressive: quality, progressive = self.jpeg_quality, self.jpeg_progressive w2if = tvtk.WindowToImageFilter(read_front_buffer= not self.off_screen_rendering) w2if.magnification = self.magnification self._lift() w2if.input = self._renwin ex = tvtk.JPEGWriter() ex.quality = quality ex.progressive = progressive ex.file_name = file_name configure_input(ex, w2if) self._exporter_write(ex) def save_iv(self, file_name): """Save to an OpenInventor file.""" if len(file_name) != 0: ex = tvtk.IVExporter() self._lift() ex.input = self._renwin ex.file_name = file_name self._exporter_write(ex) def save_vrml(self, file_name): """Save to a VRML file.""" if len(file_name) != 0: ex = tvtk.VRMLExporter() self._lift() ex.input = self._renwin ex.file_name = file_name self._exporter_write(ex) def save_oogl(self, file_name): """Saves the scene to a Geomview OOGL file. Requires VTK 4 to work.""" if len(file_name) != 0: ex = tvtk.OOGLExporter() self._lift() ex.input = self._renwin ex.file_name = file_name self._exporter_write(ex) def save_rib(self, file_name, bg=0, resolution=None, resfactor=1.0): """Save scene to a RenderMan RIB file. Keyword Arguments: file_name -- File name to save to. bg -- Optional background option. If 0 then no background is saved. If non-None then a background is saved. If left alone (defaults to None) it will result in a pop-up window asking for yes/no. resolution -- Specify the resolution of the generated image in the form of a tuple (nx, ny). resfactor -- The resolution factor which scales the resolution. """ if resolution is None: # get present window size Nx, Ny = self.render_window.size else: try: Nx, Ny = resolution except TypeError: raise TypeError( "Resolution (%s) should be a sequence with two elements"%resolution ) if len(file_name) == 0: return f_pref = os.path.splitext(file_name)[0] ex = tvtk.RIBExporter() ex.size = int(resfactor*Nx), int(resfactor*Ny) ex.file_prefix = f_pref ex.texture_prefix = f_pref + "_tex" self._lift() ex.render_window = self._renwin ex.background = bg if VTK_VER[:3] in ['4.2', '4.4']: # The vtkRIBExporter is broken in respect to VTK light # types. Therefore we need to convert all lights into # scene lights before the save and later convert them # back. ######################################## # Internal functions def x3to4(x): # convert 3-vector to 4-vector (w=1 -> point in space) return (x[0], x[1], x[2], 1.0 ) def x4to3(x): # convert 4-vector to 3-vector return (x[0], x[1], x[2]) def cameralight_transform(light, xform, light_type): # transform light by 4x4 matrix xform origin = x3to4(light.position) focus = x3to4(light.focal_point) neworigin = xform.multiply_point(origin) newfocus = xform.multiply_point(focus) light.position = x4to3(neworigin) light.focal_point = x4to3(newfocus) light.light_type = light_type ######################################## save_lights_type=[] for light in self.light_manager.lights: save_lights_type.append(light.source.light_type) # Convert lights to scene lights. cam = self.camera xform = tvtk.Matrix4x4() xform.deep_copy(cam.camera_light_transform_matrix) for light in self.light_manager.lights: cameralight_transform(light.source, xform, "scene_light") # Write the RIB file. self._exporter_write(ex) # Now re-convert lights to camera lights. xform.invert() for i,light in enumerate(self.light_manager.lights): cameralight_transform(light.source, xform, save_lights_type[i]) # Change the camera position. Otherwise VTK would render # one broken frame after the export. cam.roll(0.5) cam.roll(-0.5) else: self._exporter_write(ex) def save_wavefront(self, file_name): """Save scene to a Wavefront OBJ file. Two files are generated. One with a .obj extension and another with a .mtl extension which contains the material proerties. Keyword Arguments: file_name -- File name to save to """ if len(file_name) != 0: ex = tvtk.OBJExporter() self._lift() ex.input = self._renwin f_pref = os.path.splitext(file_name)[0] ex.file_prefix = f_pref self._exporter_write(ex) def save_gl2ps(self, file_name, exp=None): """Save scene to a vector PostScript/EPS/PDF/TeX file using GL2PS. If you choose to use a TeX file then note that only the text output is saved to the file. You will need to save the graphics separately. Keyword Arguments: file_name -- File name to save to. exp -- Optionally configured vtkGL2PSExporter object. Defaults to None and this will use the default settings with the output file type chosen based on the extention of the file name. """ # Make sure the exporter is available. if not hasattr(tvtk, 'GL2PSExporter'): msg = "Saving as a vector PS/EPS/PDF/TeX file using GL2PS is "\ "either not supported by your version of VTK or "\ "you have not configured VTK to work with GL2PS -- read "\ "the documentation for the vtkGL2PSExporter class." print(msg) return if len(file_name) != 0: f_prefix, f_ext = os.path.splitext(file_name) ex = None if exp: ex = exp if not isinstance(exp, tvtk.GL2PSExporter): msg = "Need a vtkGL2PSExporter you passed a "\ "%s"%exp.__class__.__name__ raise TypeError(msg) ex.file_prefix = f_prefix else: ex = tvtk.GL2PSExporter() # defaults ex.file_prefix = f_prefix if f_ext == ".ps": ex.file_format = 'ps' elif f_ext == ".tex": ex.file_format = 'tex' elif f_ext == ".pdf": ex.file_format = 'pdf' else: ex.file_format = 'eps' ex.sort = 'bsp' ex.compress = 1 ex.edit_traits(kind='livemodal') self._lift() ex.render_window = self._renwin if ex.write3d_props_as_raster_image: self._exporter_write(ex) else: ex.write() # Work around for a bug in VTK where it saves the file as a # .pdf.gz when the file is really a PDF file. if f_ext == '.pdf' and os.path.exists(f_prefix + '.pdf.gz'): os.rename(f_prefix + '.pdf.gz', file_name) def save_x3d(self, file_name): """Save scene to an X3D file (http://www.web3d.org/x3d/). Keyword Arguments: file_name -- File name to save to. """ # Make sure the exporter is available. if not hasattr(tvtk, 'X3DExporter'): msg = "Saving as a X3D file does not appear to be "\ "supported by your version of VTK." print(msg) return if len(file_name) != 0: ex = tvtk.X3DExporter() ex.input = self._renwin ex.file_name = file_name ex.update() ex.write() def save_povray(self, file_name): """Save scene to a POVRAY (Persistance of Vision Raytracer), file (http://www.povray.org). Keyword Arguments: file_name -- File name to save to. """ # Make sure the exporter is available. if not hasattr(tvtk, 'POVExporter'): msg = "Saving as a POVRAY file does not appear to be "\ "supported by your version of VTK." print(msg) return if len(file_name) != 0: ex = tvtk.POVExporter() ex.input = self._renwin if hasattr(ex, 'file_name'): ex.file_name = file_name else: ex.file_prefix = os.path.splitext(file_name)[0] ex.update() ex.write() def get_size(self): """Return size of the render window.""" return self._interactor.size def set_size(self, size): """Set the size of the window.""" self._interactor.size = size self._renwin.size = size ########################################################################### # Properties. ########################################################################### def _get_interactor(self): """Returns the vtkRenderWindowInteractor of the parent class""" return self._interactor def _get_render_window(self): """Returns the scene's render window.""" return self._renwin def _get_renderer(self): """Returns the scene's renderer.""" return self._renderer def _get_camera(self): """ Returns the active camera. """ return self._renderer.active_camera def _get_busy(self): return self._busy_count > 0 def _set_busy(self, value): """The `busy` trait is either `True` or `False`. However, this could be problematic since we could have two methods `foo` and `bar that both set `scene.busy = True`. As soon as `bar` is done it sets `busy` back to `False`. This is wrong since the UI is still busy as `foo` is not done yet. We therefore store the number of busy calls and either increment it or decrement it and change the state back to `False` only when the count is zero. """ bc = self._busy_count if value: bc += 1 else: bc -= 1 bc = max(0, bc) self._busy_count = bc if bc == 1: self.trait_property_changed('busy', False, True) if bc == 0: self.trait_property_changed('busy', True, False) ########################################################################### # Non-public interface. ########################################################################### def _create_control(self, parent): """ Create the toolkit-specific control that represents the widget. """ # Create the renderwindow. renwin = self._renwin = tvtk.RenderWindow() # If we are doing offscreen rendering we set the window size to # (1,1) so the window does not appear at all if self.off_screen_rendering: renwin.size = (1,1) renwin.set(point_smoothing=self.point_smoothing, line_smoothing=self.line_smoothing, polygon_smoothing=self.polygon_smoothing) # Create a renderer and add it to the renderwindow self._renderer = tvtk.Renderer() renwin.add_renderer(self._renderer) self._interactor = tvtk.RenderWindowInteractor(render_window=renwin) # Save a reference to our camera so it is not GC'd -- needed for # the sync_traits to work. self._camera = self.camera # Sync various traits. self._renderer.background = self.background self.sync_trait('background', self._renderer) self._renderer.on_trait_change(self.render, 'background') self._camera.parallel_projection = self.parallel_projection self.sync_trait('parallel_projection', self._camera) renwin.off_screen_rendering = self.off_screen_rendering self.sync_trait('off_screen_rendering', self._renwin) self.render_window.on_trait_change(self.render, 'off_screen_rendering') self.render_window.on_trait_change(self.render, 'stereo_render') self.render_window.on_trait_change(self.render, 'stereo_type') self.camera.on_trait_change(self.render, 'parallel_projection') self._interactor.initialize() self._interactor.render() self.light_manager = light_manager.LightManager(self) if self.off_screen_rendering: # We want the default size to be the normal (300, 300). # Setting the size now should not resize the window if # offscreen is working properly in VTK. renwin.size = (300, 300) return self._interactor def _lift(self): """Lift the window to the top. Useful when saving screen to an image.""" return def _exporter_write(self, ex): """Abstracts the exporter's write method.""" # Bumps up the anti-aliasing frames when the image is saved so # that the saved picture looks nicer. rw = self.render_window aa_frames = rw.aa_frames rw.aa_frames = self.anti_aliasing_frames rw.render() ex.update() ex.write() # Set the frames back to original setting. rw.aa_frames = aa_frames rw.render() def _update_view(self, x, y, z, vx, vy, vz): """Used internally to set the view.""" camera = self.camera camera.focal_point = 0.0, 0.0, 0.0 camera.position = x, y, z camera.view_up = vx, vy, vz self._renderer.reset_camera() self.render() def _disable_render_changed(self, val): if not val and self._renwin is not None: self.render() def _record_methods(self, calls): """A method to record a simple method called on self. We need a more powerful and less intrusive way like decorators to do this. Note that calls can be a string with new lines in which case we interpret this as multiple calls. """ r = self.recorder if r is not None: sid = self._script_id for call in calls.split('\n'): r.record('%s.%s'%(sid, call)) def _record_camera_position(self, vtk_obj=None, event=None): """Callback to record the camera position.""" r = self.recorder if r is not None: state = self._get_camera_state() lcs = self._last_camera_state if state != lcs: self._last_camera_state = state sid = self._script_id for key, value in state: r.record('%s.camera.%s = %r'%(sid, key, value)) r.record('%s.camera.compute_view_plane_normal()'%sid) r.record('%s.render()'%sid) def _get_camera_state(self): c = self.camera state = [] state.append(('position', list(c.position))) state.append(('focal_point', list(c.focal_point))) state.append(('view_angle', c.view_angle)) state.append(('view_up', list(c.view_up))) state.append(('clipping_range', list(c.clipping_range))) return state def _recorder_changed(self, r): """When the recorder is set we add an event handler so we can record the change to the camera position after the interaction. """ iren = self._interactor if r is not None: self._script_id = r.get_script_id(self) id = iren.add_observer('EndInteractionEvent', messenger.send) self._camera_observer_id = id i_vtk = tvtk.to_vtk(iren) messenger.connect(i_vtk, 'EndInteractionEvent', self._record_camera_position) else: self._script_id = '' iren.remove_observer(self._camera_observer_id) i_vtk = tvtk.to_vtk(iren) messenger.disconnect(i_vtk, 'EndInteractionEvent', self._record_camera_position) def _movie_maker_default(self): from tvtk.pyface.movie_maker import MovieMaker return MovieMaker(scene=self) ###################################################################### # `TVTKScene` class. ###################################################################### class TVTKWindow(HasTraits): """A basic TVTK window class that can be used in the MayaVi engine for visualization without envisage/pyface etc. Technically we could just have used the `TVTKScene` class but we want to support the closing and activated events since they are used to notify the MayaVi engine if the window is closed or activated. In this case we do nothing but honour the interface. """ closing = Event activated = Event def __init__(self, **traits): """All the keyword arguments are passed on to the `TVTKScene` instance created.""" self.scene = TVTKScene(**traits) mayavi-4.5.0/tvtk/pyface/ui/0000755000076500000240000000000012747722127016301 5ustar prabhustaff00000000000000mayavi-4.5.0/tvtk/pyface/ui/__init__.py0000644000076500000240000000120712747716314020413 0ustar prabhustaff00000000000000#------------------------------------------------------------------------------ # # Copyright (c) 2008, Enthought, Inc. # All rights reserved. # # This software is provided without warranty under the terms of the BSD # license included in enthought/LICENSE.txt and may be redistributed only # under the conditions described in the aforementioned license. The license # is also available online at http://www.enthought.com/licenses/BSD.txt # # Thanks for using Enthought open source! # # Author: Enthought, Inc. # #------------------------------------------------------------------------------ """ Enthought pyface package component """ mayavi-4.5.0/tvtk/pyface/ui/null/0000755000076500000240000000000012747722127017253 5ustar prabhustaff00000000000000mayavi-4.5.0/tvtk/pyface/ui/null/__init__.py0000644000076500000240000000120712747716314021365 0ustar prabhustaff00000000000000#------------------------------------------------------------------------------ # # Copyright (c) 2008, Enthought, Inc. # All rights reserved. # # This software is provided without warranty under the terms of the BSD # license included in enthought/LICENSE.txt and may be redistributed only # under the conditions described in the aforementioned license. The license # is also available online at http://www.enthought.com/licenses/BSD.txt # # Thanks for using Enthought open source! # # Author: Enthought, Inc. # #------------------------------------------------------------------------------ """ Enthought pyface package component """ mayavi-4.5.0/tvtk/pyface/ui/null/init.py0000644000076500000240000000137012747716314020572 0ustar prabhustaff00000000000000#------------------------------------------------------------------------------ # Copyright (c) 2007, Riverbank Computing Limited # All rights reserved. # # This software is provided without warranty under the terms of the BSD # license included in enthought/LICENSE.txt and may be redistributed only # under the conditions described in the aforementioned license. The license # is also available online at http://www.enthought.com/licenses/BSD.txt #------------------------------------------------------------------------------ """ Initialize this backend. """ # There is nothing for us to initialize, but the toolkit switching code depends # on the existence of this module. #### EOF ###################################################################### mayavi-4.5.0/tvtk/pyface/ui/qt4/0000755000076500000240000000000012747722127017011 5ustar prabhustaff00000000000000mayavi-4.5.0/tvtk/pyface/ui/qt4/__init__.py0000644000076500000240000000064712747716314021132 0ustar prabhustaff00000000000000# Copyright (c) 2005-2011, Enthought, Inc. # All rights reserved. # # This software is provided without warranty under the terms of the BSD # license included in LICENSE.txt and may be redistributed only # under the conditions described in the aforementioned license. The license # is also available online at http://www.enthought.com/licenses/BSD.txt # Thanks for using Enthought open source! # # Author: Enthought, Inc. mayavi-4.5.0/tvtk/pyface/ui/qt4/actor_editor.py0000644000076500000240000001632212747716314022046 0ustar prabhustaff00000000000000""" A mostly-general Traits UI editor for viewing things in TVTK scenes. """ # Authors: Robert Kern # Prabhu Ramachandran # Copyright (c) 2007, Enthought, Inc. # License: BSD Style. # Major library imports. import os from pyface.qt import QtGui # Enthought library imports. from traits.api import Any, Bool, Callable, Dict, Str from traitsui.qt4.editor import Editor from traitsui.basic_editor_factory import BasicEditorFactory from .decorated_scene import DecoratedScene ##################################################################### # `_ActorEditor` class ##################################################################### class _ActorEditor(Editor): """ An editor for TVTK scenes. """ # The editor is scrollable, so override the default. scrollable = Bool(True) # Internal GUI traits. _scene = Any() #### Public 'Editor' interface ############################################# def init(self, parent): """ Finishes initializing the editor by creating the underlying toolkit widget. """ factory = self.factory self.control = QtGui.QWidget() lay = QtGui.QVBoxLayout(self.control) lay.setContentsMargins(0, 0, 0, 0) self._create_scene() def update_editor(self): """ Updates the editor when the object trait changes external to the editor. """ # Everything should really be handled elsewhere in trait notifications. # Just pass here. pass def dispose(self): """ Disposes of the contents of an editor. """ # Remove notifications. self._setup_scene_notifications(remove=True) # Remove the current scene. if self._scene is not None: self._scene.close() self._scene = None # This will destroy self.control and all of its children, including the # scene's control. super(_ActorEditor, self).dispose() #### Private '_ActorEditor' interface ################################## def _create_scene(self): """ Create the TVTK scene widget. """ factory = self.factory self._scene = factory.scene_class(self.control, **factory.scene_kwds) scene = self._scene # Disable rendering on the scene until we're finished. scene.disable_render = True # Add all of the actors in the current actor map. for obj, actors in self.value.items(): self._add_actors_widgets(actors) # Set up Traits notifications. self._setup_scene_notifications() # Re-enable rendering. scene.disable_render = False self.control.layout().addWidget(scene.control) # Force a render. scene.render() def _setup_scene_notifications(self, remove=False): """ Set up or remove all of the Trait notifications that control the scene widget. """ self.object.on_trait_change( self._set_scene_disable_render, name=self.factory.disable_render_name, remove=remove, ) self.object.on_trait_event( self._scene.render, name=self.factory.do_render_name, remove=remove, ) self.object.on_trait_change( self._actors_changed, name=self.name+'_items', remove=remove, ) self.object.on_trait_change( self._actor_map_changed, name=self.name, remove=remove, ) def _set_scene_disable_render(self, new): """ A callback for Traits notifications. """ self._scene.disable_render = new def _actors_changed(self, event): """ Handle the event of the actors in the actor map changing. """ scene = self._scene # Temporarily turn off rendering. We (re)store the old value of # disable_render because it may already be True. old_disable_render = scene.disable_render scene.disable_render = True try: for obj, actors in event.removed.items(): self._remove_actors_widgets(actors) for obj, actors in event.added.items(): self._add_actors_widgets(actors) for obj, actors in event.changed.items(): # The actors in the event are the old ones. Grab the new ones # from the actor map itself. self._remove_actors_widgets(actors) self._add_actors_widgets(self.value[obj]) finally: scene.disable_render = old_disable_render scene.render() def _actor_map_changed(self, object, name, old, new): """ Handle the case when the entire actor map is set to something else. """ scene = self._scene # Temporarily turn off rendering. We (re)store the old value of # disable_render because it may already be True. old_disable_render = scene.disable_render scene.disable_render = True try: for obj, actors in old.items(): self._remove_actors_widgets(actors) for obj, actors in new.items(): self._add_actors_widgets(actors) finally: scene.disable_render = old_disable_render scene.render() def _separate_actors_widgets(self, actors_widgets): """Given a sequence (or single) of actors or widgets, this returns a list of just the actors and another of just the widgets. """ if not hasattr(actors_widgets, '__getitem__'): actors_widgets = [actors_widgets] actors = [] widgets = [] for actor in actors_widgets: if actor.is_a('vtk3DWidget'): widgets.append(actor) else: actors.append(actor) return actors, widgets def _add_actors_widgets(self, actors_widgets): """Add actors and widgets to scene.""" scene = self._scene actors, widgets = self._separate_actors_widgets(actors_widgets) scene.add_actors(actors) scene.add_widgets(widgets) def _remove_actors_widgets(self, actors_widgets): """Remove actors and widgets from scene.""" scene = self._scene actors, widgets = self._separate_actors_widgets(actors_widgets) scene.remove_actors(actors) scene.remove_widgets(widgets) ##################################################################### # `ActorEditor` class ##################################################################### class ActorEditor(BasicEditorFactory): """ An editor factory for TVTK scenes. """ # The class of the editor object to be constructed. klass = _ActorEditor # The class or factory function for creating the actual scene object. scene_class = Callable(DecoratedScene) # Keyword arguments to pass to the scene factory. scene_kwds = Dict() # The name of the trait used for ITVTKActorModel.disable_render. disable_render_name = Str('disable_render') # The name of the trait used for ITVTKActorModel.do_render. do_render_name = Str('do_render') #### EOF ####################################################################### mayavi-4.5.0/tvtk/pyface/ui/qt4/decorated_scene.py0000644000076500000240000002534212747716314022501 0ustar prabhustaff00000000000000"""A VTK interactor scene which provides a convenient toolbar that allows the user to set the camera view, turn on the axes indicator etc. """ # Authors: Prabhu Ramachandran , # Dave Peterson # Copyright (c) 2006-2016, Enthought, Inc. # License: BSD Style. # System imports. from os.path import dirname import os from pyface.qt import QtGui # Enthought library imports. from pyface.api import ImageResource from pyface.action.api import ToolBarManager, Group, Action from tvtk.api import tvtk from traits.api import Instance, false, Either, List # Local imports. from .scene import Scene, popup_save ########################################################################### # 'DecoratedScene' class ########################################################################### class DecoratedScene(Scene): """A VTK interactor scene which provides a convenient toolbar that allows the user to set the camera view, turn on the axes indicator etc. """ ####################################################################### # Traits ####################################################################### if hasattr(tvtk, 'OrientationMarkerWidget'): # The tvtk orientation marker widget. This only exists in VTK # 5.x. marker = Instance(tvtk.OrientationMarkerWidget, ()) # The tvtk axes that will be shown for the orientation. axes = Instance(tvtk.AxesActor, ()) else: marker = None axes = None # Determine if the orientation axis is shown or not. show_axes = false # The list of actions represented in the toolbar actions = List(Either(Action, Group)) ########################################################################## # `object` interface ########################################################################## def __init__(self, parent, **traits): super(DecoratedScene, self).__init__(parent, **traits) self._setup_axes_marker() def __get_pure_state__(self): """Allows us to pickle the scene.""" # The control attribute is not picklable since it is a VTK # object so we remove it. d = super(DecoratedScene, self).__get_pure_state__() for x in ['_content', '_panel', '_tool_bar', 'actions']: d.pop(x, None) return d ########################################################################## # Non-public interface. ########################################################################## def _create_control(self, parent): """ Create the toolkit-specific control that represents the widget. Overridden to wrap the Scene control within a panel that also contains a toolbar. """ # Create a panel as a wrapper of the scene toolkit control. This # allows us to also add additional controls. self._panel = QtGui.QMainWindow() # Add our toolbar to the panel. tbm = self._get_tool_bar_manager() self._tool_bar = tbm.create_tool_bar(self._panel) self._panel.addToolBar(self._tool_bar) # Create the actual scene content self._content = super(DecoratedScene, self)._create_control(self._panel) self._panel.setCentralWidget(self._content) return self._panel def _setup_axes_marker(self): axes = self.axes if axes is None: # For VTK versions < 5.0. return axes.set( normalized_tip_length=(0.4, 0.4, 0.4), normalized_shaft_length=(0.6, 0.6, 0.6), shaft_type='cylinder' ) p = axes.x_axis_caption_actor2d.caption_text_property axes.y_axis_caption_actor2d.caption_text_property = p axes.z_axis_caption_actor2d.caption_text_property = p p.set(color=(1,1,1), shadow=False, italic=False) self._background_changed(self.background) self.marker.set(key_press_activation=False) self.marker.orientation_marker = axes def _get_tool_bar_manager(self): """ Returns the tool_bar_manager for this scene. """ tbm = ToolBarManager( *self.actions ) return tbm def _get_image_path(self): """Returns the directory which contains the images used by the toolbar.""" # So that we can find the images. import tvtk.pyface.api return dirname(tvtk.pyface.api.__file__) def _toggle_projection(self): """ Toggle between perspective and parallel projection, this is used for the toolbar. """ if self._panel is not None: self.parallel_projection = not self.parallel_projection def _toggle_axes(self, *args): """Used by the toolbar to turn on/off the axes indicator. """ if self._panel is not None: self.show_axes = not self.show_axes def _save_snapshot(self): """Invoked by the toolbar menu to save a snapshot of the scene to an image. Note that the extension of the filename determines what image type is saved. The default is PNG. """ if self._panel is not None: path = popup_save(self._panel) if len(path) > 0: # The extension of the path will determine the actual # image type saved. self.save(path) def _configure_scene(self): """Invoked when the toolbar icon for configuration is clicked. """ self.edit_traits() ###################################################################### # Trait handlers. ###################################################################### def _show_axes_changed(self): marker = self.marker if (self._vtk_control is not None) and (marker is not None): if not self.show_axes: marker.interactor = None marker.enabled = False else: marker.interactor = self.interactor marker.enabled = True self.render() def _background_changed(self, value): # Depending on the background, this sets the axes text and # outline color to something that should be visible. axes = self.axes if (self._vtk_control is not None) and (axes is not None): p = self.axes.x_axis_caption_actor2d.caption_text_property m = self.marker s = value[0] + value[1] + value[2] if s <= 1.0: p.color = (1,1,1) m.set_outline_color(1,1,1) else: p.color = (0,0,0) m.set_outline_color(0,0,0) self.render() def _actions_default(self): return [ Group( Action( image = ImageResource('16x16/x-axis', search_path = [self._get_image_path()], ), tooltip = "View along the -X axis", on_perform = self.x_minus_view, ), Action( image = ImageResource('16x16/x-axis', search_path = [self._get_image_path()], ), tooltip = "View along the +X axis", on_perform = self.x_plus_view, ), Action( image = ImageResource('16x16/y-axis', search_path = [self._get_image_path()], ), tooltip = "View along the -Y axis", on_perform = self.y_minus_view, ), Action( image = ImageResource('16x16/y-axis', search_path = [self._get_image_path()], ), tooltip = "View along the +Y axis", on_perform = self.y_plus_view, ), Action( image = ImageResource('16x16/z-axis', search_path = [self._get_image_path()], ), tooltip = "View along the -Z axis", on_perform = self.z_minus_view, ), Action( image = ImageResource('16x16/z-axis', search_path = [self._get_image_path()], ), tooltip = "View along the +Z axis", on_perform = self.z_plus_view, ), Action( image = ImageResource('16x16/isometric', search_path = [self._get_image_path()], ), tooltip = "Obtain an isometric view", on_perform = self.isometric_view, ), ), Group( Action( image = ImageResource('16x16/parallel', search_path = [self._get_image_path()], ), tooltip = 'Toggle parallel projection', style="toggle", on_perform = self._toggle_projection, checked = self.parallel_projection, ), Action( image = ImageResource('16x16/origin_glyph', search_path = [self._get_image_path()], ), tooltip = 'Toggle axes indicator', style="toggle", enabled=(self.marker is not None), on_perform = self._toggle_axes, checked = self.show_axes, ), Action( image = ImageResource('16x16/fullscreen', search_path = [self._get_image_path()], ), tooltip = 'Full Screen (press "q" or "e" or Esc to exit fullscreen)', style="push", on_perform = self._full_screen_fired, ), ), Group( Action( image = ImageResource('16x16/save', search_path = [self._get_image_path()], ), tooltip = "Save a snapshot of this scene", on_perform = self._save_snapshot, ), Action( image = ImageResource('16x16/configure', search_path = [self._get_image_path()], ), tooltip = 'Configure the scene', style="push", on_perform = self._configure_scene, ), ), ] mayavi-4.5.0/tvtk/pyface/ui/qt4/init.py0000644000076500000240000000270112747716314020327 0ustar prabhustaff00000000000000#------------------------------------------------------------------------------ # Copyright (c) 2007, Riverbank Computing Limited # All rights reserved. # # This software is provided without warranty under the terms of the BSD # license. # # Author: Riverbank Computing Limited # Description: # # In an e-mail to enthought-dev on 2008.09.12 at 2:49 AM CDT, Phil Thompson said: # The advantage is that all of the PyQt code in ETS can now be re-licensed to # use the BSD - and I hereby give my permission for that to be done. It's # been on my list of things to do. #------------------------------------------------------------------------------ # Standard library imports. import sys # Major package imports. import os # PyQt4 version check crash PySide toolkit from pyface.qt import qt_api if qt_api == 'pyqt': from PyQt4 import QtGui, QtCore # Check the version numbers are late enough. if QtCore.QT_VERSION < 0x040200: raise RuntimeError("Need Qt v4.2 or higher, but got v%s" % QtCore.QT_VERSION_STR) if QtCore.PYQT_VERSION < 0x040100: raise RuntimeError("Need PyQt v4.1 or higher, but got v%s" % QtCore.PYQT_VERSION_STR) else: from PySide import QtGui, QtCore # It's possible that it has already been initialised. _app = QtGui.QApplication.instance() if _app is None: _app = QtGui.QApplication(sys.argv) #### EOF ###################################################################### mayavi-4.5.0/tvtk/pyface/ui/qt4/QVTKRenderWindowInteractor.py0000644000076500000240000005177312747716314024551 0ustar prabhustaff00000000000000""" A simple VTK widget for PyQt or PySide. See http://www.trolltech.com for Qt documentation, http://www.riverbankcomputing.co.uk for PyQt, and http://pyside.github.io for PySide. This class is based on the vtkGenericRenderWindowInteractor and is therefore fairly powerful. It should also play nicely with the vtk3DWidget code. Created by Prabhu Ramachandran, May 2002 Based on David Gobbi's QVTKRenderWidget.py Changes by Gerard Vermeulen Feb. 2003 Win32 support. Changes by Gerard Vermeulen, May 2003 Bug fixes and better integration with the Qt framework. Changes by Phil Thompson, Nov. 2006 Ported to PyQt v4. Added support for wheel events. Changes by Phil Thompson, Oct. 2007 Bug fixes. Changes by Phil Thompson, Mar. 2008 Added cursor support. Changes by Rodrigo Mologni, Sep. 2013 (Credit to Daniele Esposti) Bug fix to PySide: Converts PyCObject to void pointer. Changes by Greg Schussman, Aug. 2014 The keyPressEvent function now passes keysym instead of None. Changes by Alex Tsui, Apr. 2015 Port from PyQt4 to PyQt5. Changes by Fabian Wenzel, Jan. 2016 Support for Python3 """ import sys from pyface.qt import qt_api if qt_api == 'pyqt': PyQtImpl = "PyQt4" else: PyQtImpl = "PySide" import vtk from tvtk import messenger if PyQtImpl == "PyQt5": from PyQt5.QtWidgets import QWidget, QSizePolicy, QApplication from PyQt5.QtGui import QWheelEvent from PyQt5.QtCore import Qt, QTimer, QObject, QSize, QEvent elif PyQtImpl == "PyQt4": from PyQt4.QtGui import QWidget, QSizePolicy, QApplication, QWheelEvent from PyQt4.QtCore import Qt, QTimer, QObject, QSize, QEvent elif PyQtImpl == "PySide": from PySide.QtGui import QWidget, QSizePolicy, QApplication, QWheelEvent from PySide.QtCore import Qt, QTimer, QObject, QSize, QEvent else: raise ImportError("Unknown PyQt implementation " + repr(PyQtImpl)) class QVTKRenderWindowInteractor(QWidget): """ A QVTKRenderWindowInteractor for Python and Qt. Uses a vtkGenericRenderWindowInteractor to handle the interactions. Use GetRenderWindow() to get the vtkRenderWindow. Create with the keyword stereo=1 in order to generate a stereo-capable window. The user interface is summarized in vtkInteractorStyle.h: - Keypress j / Keypress t: toggle between joystick (position sensitive) and trackball (motion sensitive) styles. In joystick style, motion occurs continuously as long as a mouse button is pressed. In trackball style, motion occurs when the mouse button is pressed and the mouse pointer moves. - Keypress c / Keypress o: toggle between camera and object (actor) modes. In camera mode, mouse events affect the camera position and focal point. In object mode, mouse events affect the actor that is under the mouse pointer. - Button 1: rotate the camera around its focal point (if camera mode) or rotate the actor around its origin (if actor mode). The rotation is in the direction defined from the center of the renderer's viewport towards the mouse position. In joystick mode, the magnitude of the rotation is determined by the distance the mouse is from the center of the render window. - Button 2: pan the camera (if camera mode) or translate the actor (if object mode). In joystick mode, the direction of pan or translation is from the center of the viewport towards the mouse position. In trackball mode, the direction of motion is the direction the mouse moves. (Note: with 2-button mice, pan is defined as -Button 1.) - Button 3: zoom the camera (if camera mode) or scale the actor (if object mode). Zoom in/increase scale if the mouse position is in the top half of the viewport; zoom out/decrease scale if the mouse position is in the bottom half. In joystick mode, the amount of zoom is controlled by the distance of the mouse pointer from the horizontal centerline of the window. - Keypress 3: toggle the render window into and out of stereo mode. By default, red-blue stereo pairs are created. Some systems support Crystal Eyes LCD stereo glasses; you have to invoke SetStereoTypeToCrystalEyes() on the rendering window. Note: to use stereo you also need to pass a stereo=1 keyword argument to the constructor. - Keypress e: exit the application. - Keypress f: fly to the picked point - Keypress p: perform a pick operation. The render window interactor has an internal instance of vtkCellPicker that it uses to pick. - Keypress r: reset the camera view along the current view direction. Centers the actors and moves the camera so that all actors are visible. - Keypress s: modify the representation of all actors so that they are surfaces. - Keypress u: invoke the user-defined function. Typically, this keypress will bring up an interactor that you can type commands in. - Keypress w: modify the representation of all actors so that they are wireframe. """ # Map between VTK and Qt cursors. _CURSOR_MAP = { 0: Qt.ArrowCursor, # VTK_CURSOR_DEFAULT 1: Qt.ArrowCursor, # VTK_CURSOR_ARROW 2: Qt.SizeBDiagCursor, # VTK_CURSOR_SIZENE 3: Qt.SizeFDiagCursor, # VTK_CURSOR_SIZENWSE 4: Qt.SizeBDiagCursor, # VTK_CURSOR_SIZESW 5: Qt.SizeFDiagCursor, # VTK_CURSOR_SIZESE 6: Qt.SizeVerCursor, # VTK_CURSOR_SIZENS 7: Qt.SizeHorCursor, # VTK_CURSOR_SIZEWE 8: Qt.SizeAllCursor, # VTK_CURSOR_SIZEALL 9: Qt.PointingHandCursor, # VTK_CURSOR_HAND 10: Qt.CrossCursor, # VTK_CURSOR_CROSSHAIR } def __init__(self, parent=None, wflags=Qt.WindowFlags(), **kw): # the current button self._ActiveButton = Qt.NoButton # private attributes self.__oldFocus = None self.__saveX = 0 self.__saveY = 0 self.__saveModifiers = Qt.NoModifier self.__saveButtons = Qt.NoButton # do special handling of some keywords: # stereo, rw try: stereo = bool(kw['stereo']) except KeyError: stereo = False try: rw = kw['rw'] except KeyError: rw = None # create qt-level widget QWidget.__init__(self, parent, wflags|Qt.MSWindowsOwnDC) if rw: # user-supplied render window self._RenderWindow = rw else: self._RenderWindow = vtk.vtkRenderWindow() wid = self._get_win_id() self._RenderWindow.SetWindowInfo(wid) self._should_set_parent_info = (sys.platform == 'win32') if stereo: # stereo mode self._RenderWindow.StereoCapableWindowOn() self._RenderWindow.SetStereoTypeToCrystalEyes() try: self._Iren = kw['iren'] except KeyError: self._Iren = vtk.vtkGenericRenderWindowInteractor() self._Iren.SetRenderWindow(self._RenderWindow) # do all the necessary qt setup self.setAttribute(Qt.WA_OpaquePaintEvent) self.setAttribute(Qt.WA_PaintOnScreen) self.setMouseTracking(True) # get all mouse events self.setFocusPolicy(Qt.WheelFocus) self.setSizePolicy(QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)) self._Timer = QTimer(self) self._Timer.timeout.connect(self.TimerEvent) # add wheel timer to fix scrolling issue with trackpad self.wheel_timer = QTimer() self.wheel_timer.setSingleShot(True) self.wheel_timer.setInterval(25) self.wheel_timer.timeout.connect(self._emit_wheel_event) self.wheel_accumulator = 0 self._saved_wheel_event_info = () self._Iren.AddObserver('CreateTimerEvent', messenger.send) messenger.connect(self._Iren, 'CreateTimerEvent', self.CreateTimer) self._Iren.AddObserver('DestroyTimerEvent', messenger.send) messenger.connect(self._Iren, 'DestroyTimerEvent', self.DestroyTimer) self._RenderWindow.AddObserver('CursorChangedEvent', messenger.send) messenger.connect(self._RenderWindow, 'CursorChangedEvent', self.CursorChangedEvent) # Create a hidden child widget and connect its destroyed signal to its # parent ``Finalize`` slot. The hidden children will be destroyed # before its parent thus allowing cleanup of VTK elements. self._hidden = QWidget(self) self._hidden.hide() self._hidden.destroyed.connect(self.Finalize) def __getattr__(self, attr): """Makes the object behave like a vtkGenericRenderWindowInteractor""" if attr == '__vtk__': return lambda t=self._Iren: t elif hasattr(self._Iren, attr): return getattr(self._Iren, attr) else: raise AttributeError( self.__class__.__name__ + " has no attribute named " + attr ) def _get_win_id(self): WId = self.winId() # Python2 if type(WId).__name__ == 'PyCObject': from ctypes import pythonapi, c_void_p, py_object pythonapi.PyCObject_AsVoidPtr.restype = c_void_p pythonapi.PyCObject_AsVoidPtr.argtypes = [py_object] WId = pythonapi.PyCObject_AsVoidPtr(WId) # Python3 elif type(WId).__name__ == 'PyCapsule': from ctypes import pythonapi, c_void_p, py_object, c_char_p pythonapi.PyCapsule_GetName.restype = c_char_p pythonapi.PyCapsule_GetName.argtypes = [py_object] name = pythonapi.PyCapsule_GetName(WId) pythonapi.PyCapsule_GetPointer.restype = c_void_p pythonapi.PyCapsule_GetPointer.argtypes = [py_object, c_char_p] WId = pythonapi.PyCapsule_GetPointer(WId, name) return str(int(WId)) def Finalize(self): ''' Call internal cleanup method on VTK objects ''' self._RenderWindow.Finalize() def CreateTimer(self, obj, evt): self._Timer.start(10) def DestroyTimer(self, obj, evt): self._Timer.stop() return 1 def TimerEvent(self): self._Iren.TimerEvent() def CursorChangedEvent(self, obj, evt): """Called when the CursorChangedEvent fires on the render window.""" # This indirection is needed since when the event fires, the current # cursor is not yet set so we defer this by which time the current # cursor should have been set. QTimer.singleShot(0, self.ShowCursor) def HideCursor(self): """Hides the cursor.""" self.setCursor(Qt.BlankCursor) def ShowCursor(self): """Shows the cursor.""" vtk_cursor = self._Iren.GetRenderWindow().GetCurrentCursor() qt_cursor = self._CURSOR_MAP.get(vtk_cursor, Qt.ArrowCursor) self.setCursor(qt_cursor) def closeEvent(self, evt): self.Finalize() def sizeHint(self): return QSize(400, 400) def paintEngine(self): return None def paintEvent(self, ev): self._RenderWindow.Render() def resizeEvent(self, ev): if self._should_set_parent_info: # Set the window info and parent info on every resize. # vtkWin32OpenGLRenderWindow will render using incorrect offsets if # the parent info is not given to it because it assumes that it # needs to make room for the title bar. winid = self._get_win_id() self._RenderWindow.SetWindowInfo(winid) parent = self.parent() if parent is not None: self._RenderWindow.SetParentInfo(winid) else: self._RenderWindow.SetParentInfo('') w = self.width() h = self.height() vtk.vtkRenderWindow.SetSize(self._RenderWindow, w, h) self._Iren.SetSize(w, h) self._Iren.ConfigureEvent() self.update() def _GetCtrlShift(self, ev): ctrl = shift = False if hasattr(ev, 'modifiers'): if ev.modifiers() & Qt.ShiftModifier: shift = True if ev.modifiers() & Qt.ControlModifier: ctrl = True else: if self.__saveModifiers & Qt.ShiftModifier: shift = True if self.__saveModifiers & Qt.ControlModifier: ctrl = True return ctrl, shift def enterEvent(self, ev): if not self.hasFocus(): self.__oldFocus = self.focusWidget() self.setFocus() ctrl, shift = self._GetCtrlShift(ev) self._Iren.SetEventInformationFlipY(self.__saveX, self.__saveY, ctrl, shift, chr(0), 0, None) self._Iren.EnterEvent() def leaveEvent(self, ev): if self.__saveButtons == Qt.NoButton and self.__oldFocus: self.__oldFocus.setFocus() self.__oldFocus = None ctrl, shift = self._GetCtrlShift(ev) self._Iren.SetEventInformationFlipY(self.__saveX, self.__saveY, ctrl, shift, chr(0), 0, None) self._Iren.LeaveEvent() def mousePressEvent(self, ev): ctrl, shift = self._GetCtrlShift(ev) repeat = 0 if ev.type() == QEvent.MouseButtonDblClick: repeat = 1 self._Iren.SetEventInformationFlipY(ev.x(), ev.y(), ctrl, shift, chr(0), repeat, None) self._ActiveButton = ev.button() if self._ActiveButton == Qt.LeftButton: self._Iren.LeftButtonPressEvent() elif self._ActiveButton == Qt.RightButton: self._Iren.RightButtonPressEvent() elif self._ActiveButton == Qt.MidButton: self._Iren.MiddleButtonPressEvent() def mouseReleaseEvent(self, ev): ctrl, shift = self._GetCtrlShift(ev) self._Iren.SetEventInformationFlipY(ev.x(), ev.y(), ctrl, shift, chr(0), 0, None) if self._ActiveButton == Qt.LeftButton: self._Iren.LeftButtonReleaseEvent() elif self._ActiveButton == Qt.RightButton: self._Iren.RightButtonReleaseEvent() elif self._ActiveButton == Qt.MidButton: self._Iren.MiddleButtonReleaseEvent() def mouseMoveEvent(self, ev): self.__saveModifiers = ev.modifiers() self.__saveButtons = ev.buttons() self.__saveX = ev.x() self.__saveY = ev.y() ctrl, shift = self._GetCtrlShift(ev) self._Iren.SetEventInformationFlipY(ev.x(), ev.y(), ctrl, shift, chr(0), 0, None) self._Iren.MouseMoveEvent() def keyPressEvent(self, ev): """ React to key pressed event. If event text contains multiple characters, it is truncated to first one. """ ctrl, shift = self._GetCtrlShift(ev) key_sym = _qt_key_to_key_sym(ev.key()) if ev.key() < 256: # Sometimes, the OS allows a chord (e.g. Alt-T) to generate # a Unicode character outside of the 8-bit Latin-1 range. We will # try to pass along Latin-1 characters unchanged, since VTK expects # a single `char` byte. If not, we will try to pass on the root key # of the chord (e.g. 'T' above). if ev.text() and ev.text() <= u'\u00ff': key = ev.text().encode('latin-1') else: # Has modifiers, but an ASCII key code. key = chr(ev.key()) else: key = chr(0) # Truncating key pressed to first character if slow machine leads to # multiple times the same key (required by SetEventInformationFlipY): if ev.isAutoRepeat(): key = key[0] self._Iren.SetEventInformationFlipY(self.__saveX, self.__saveY, ctrl, shift, key, 0, key_sym) self._Iren.KeyPressEvent() self._Iren.CharEvent() def keyReleaseEvent(self, ev): ctrl, shift = self._GetCtrlShift(ev) key_sym = _qt_key_to_key_sym(ev.key()) if ev.key() < 256: if ev.text() and ev.text() <= u'\u00ff': key = ev.text().encode('latin-1') else: # Has modifiers, but an ASCII key code. key = chr(ev.key()) else: key = chr(0) self._Iren.SetEventInformationFlipY(self.__saveX, self.__saveY, ctrl, shift, key, 0, None) self._Iren.KeyReleaseEvent() def wheelEvent(self, ev): """ Reimplemented to work around scrolling bug in Mac. Work around https://bugreports.qt-project.org/browse/QTBUG-22269. Accumulate wheel events that are within a period of 25ms into a single event. Changes in buttons or modifiers, while a scroll is going on, are not handled, since they seem to be too much of a corner case to be worth handling. """ self.wheel_accumulator += ev.delta() self._saved_wheel_event_info = ( ev.pos(), ev.globalPos(), self.wheel_accumulator, ev.buttons(), ev.modifiers(), ev.orientation() ) ev.setAccepted(True) if not self.wheel_timer.isActive(): self.wheel_timer.start() def _emit_wheel_event(self): ev = QWheelEvent(*self._saved_wheel_event_info) if ev.delta() >= 0: self._Iren.MouseWheelForwardEvent() else: self._Iren.MouseWheelBackwardEvent() self.wheel_timer.stop() self.wheel_accumulator = 0 def GetRenderWindow(self): return self._RenderWindow def Render(self): self.update() def QVTKRenderWidgetConeExample(): """A simple example that uses the QVTKRenderWindowInteractor class.""" # every QT app needs an app app = QApplication(['QVTKRenderWindowInteractor']) # create the widget widget = QVTKRenderWindowInteractor() widget.Initialize() widget.Start() # if you dont want the 'q' key to exit comment this. widget.AddObserver("ExitEvent", lambda o, e, a=app: a.quit()) ren = vtk.vtkRenderer() widget.GetRenderWindow().AddRenderer(ren) cone = vtk.vtkConeSource() cone.SetResolution(8) coneMapper = vtk.vtkPolyDataMapper() coneMapper.SetInputConnection(cone.GetOutputPort()) coneActor = vtk.vtkActor() coneActor.SetMapper(coneMapper) ren.AddActor(coneActor) # show the widget widget.show() # start event processing app.exec_() _keysyms = { Qt.Key_Backspace: 'BackSpace', Qt.Key_Tab: 'Tab', Qt.Key_Backtab: 'Tab', # Qt.Key_Clear : 'Clear', Qt.Key_Return: 'Return', Qt.Key_Enter: 'Return', Qt.Key_Shift: 'Shift_L', Qt.Key_Control: 'Control_L', Qt.Key_Alt: 'Alt_L', Qt.Key_Pause: 'Pause', Qt.Key_CapsLock: 'Caps_Lock', Qt.Key_Escape: 'Escape', Qt.Key_Space: 'space', # Qt.Key_Prior : 'Prior', # Qt.Key_Next : 'Next', Qt.Key_End: 'End', Qt.Key_Home: 'Home', Qt.Key_Left: 'Left', Qt.Key_Up: 'Up', Qt.Key_Right: 'Right', Qt.Key_Down: 'Down', Qt.Key_SysReq: 'Snapshot', Qt.Key_Insert: 'Insert', Qt.Key_Delete: 'Delete', Qt.Key_Help: 'Help', Qt.Key_0: '0', Qt.Key_1: '1', Qt.Key_2: '2', Qt.Key_3: '3', Qt.Key_4: '4', Qt.Key_5: '5', Qt.Key_6: '6', Qt.Key_7: '7', Qt.Key_8: '8', Qt.Key_9: '9', Qt.Key_A: 'a', Qt.Key_B: 'b', Qt.Key_C: 'c', Qt.Key_D: 'd', Qt.Key_E: 'e', Qt.Key_F: 'f', Qt.Key_G: 'g', Qt.Key_H: 'h', Qt.Key_I: 'i', Qt.Key_J: 'j', Qt.Key_K: 'k', Qt.Key_L: 'l', Qt.Key_M: 'm', Qt.Key_N: 'n', Qt.Key_O: 'o', Qt.Key_P: 'p', Qt.Key_Q: 'q', Qt.Key_R: 'r', Qt.Key_S: 's', Qt.Key_T: 't', Qt.Key_U: 'u', Qt.Key_V: 'v', Qt.Key_W: 'w', Qt.Key_X: 'x', Qt.Key_Y: 'y', Qt.Key_Z: 'z', Qt.Key_Asterisk: 'asterisk', Qt.Key_Plus: 'plus', Qt.Key_Minus: 'minus', Qt.Key_Period: 'period', Qt.Key_Slash: 'slash', Qt.Key_F1: 'F1', Qt.Key_F2: 'F2', Qt.Key_F3: 'F3', Qt.Key_F4: 'F4', Qt.Key_F5: 'F5', Qt.Key_F6: 'F6', Qt.Key_F7: 'F7', Qt.Key_F8: 'F8', Qt.Key_F9: 'F9', Qt.Key_F10: 'F10', Qt.Key_F11: 'F11', Qt.Key_F12: 'F12', Qt.Key_F13: 'F13', Qt.Key_F14: 'F14', Qt.Key_F15: 'F15', Qt.Key_F16: 'F16', Qt.Key_F17: 'F17', Qt.Key_F18: 'F18', Qt.Key_F19: 'F19', Qt.Key_F20: 'F20', Qt.Key_F21: 'F21', Qt.Key_F22: 'F22', Qt.Key_F23: 'F23', Qt.Key_F24: 'F24', Qt.Key_NumLock: 'Num_Lock', Qt.Key_ScrollLock: 'Scroll_Lock', } def _qt_key_to_key_sym(key): """ Convert a Qt key into a vtk keysym. This is essentially copied from the c++ implementation in GUISupport/Qt/QVTKInteractorAdapter.cxx. """ if key not in _keysyms: return None return _keysyms[key] if __name__ == "__main__": QVTKRenderWidgetConeExample() mayavi-4.5.0/tvtk/pyface/ui/qt4/scene.py0000644000076500000240000004065012747716314020466 0ustar prabhustaff00000000000000#------------------------------------------------------------------------------ # Copyright (c) 2005, Enthought, Inc. # All rights reserved. # # This software is provided without warranty under the terms of the BSD # license included in enthought/LICENSE.txt and may be redistributed only # under the conditions described in the aforementioned license. The license # is also available online at http://www.enthought.com/licenses/BSD.txt # Thanks for using Enthought open source! # # Author: Enthought, Inc. # Description: #------------------------------------------------------------------------------ """A VTK interactor scene widget for the PyFace PyQt backend. See the class docs for more details. """ # Author: Prabhu Ramachandran # Copyright (c) 2004-2016, Enthought, Inc. # License: BSD Style. import os import tempfile from pyface.qt import QtCore, QtGui from tvtk.api import tvtk from tvtk import messenger from traits.api import Instance, Button, Any from traitsui.api import View, Group, Item, InstanceEditor from pyface.api import Widget, GUI from tvtk.pyface import picker from tvtk.pyface import light_manager from tvtk.pyface.utils import popup_save from tvtk.pyface.tvtk_scene import TVTKScene from .QVTKRenderWindowInteractor import QVTKRenderWindowInteractor ###################################################################### # `_VTKRenderWindowInteractor` class. ###################################################################### class _VTKRenderWindowInteractor(QVTKRenderWindowInteractor): """ This is a thin wrapper around the standard VTK PyQt interactor. """ def __init__(self, scene, parent, **kwargs): QVTKRenderWindowInteractor.__init__(self, parent, **kwargs) self._scene = scene self._interacting = False def resizeEvent(self, e): """ Reimplemented to refresh the traits of the render window. """ QVTKRenderWindowInteractor.resizeEvent(self, e) self._scene._renwin.update_traits() def paintEvent(self, e): """ Reimplemented to create the light manager only when needed. This is necessary because it makes sense to create the light manager only when the widget is realized. Only when the widget is realized is the VTK render window created and only then are the default lights all setup correctly. """ QVTKRenderWindowInteractor.paintEvent(self, e) scene = self._scene if scene.light_manager is None: scene.light_manager = light_manager.LightManager(scene) renwin = scene._renwin renwin.update_traits() vtk_rw = tvtk.to_vtk(renwin) renwin.add_observer('StartEvent', messenger.send) messenger.connect(vtk_rw, 'StartEvent', self._start_event_callback) renwin.add_observer('EndEvent', messenger.send) messenger.connect(vtk_rw, 'EndEvent', self._end_event_callback) def keyPressEvent(self, e): """ This method is overridden to prevent the 's'/'w'/'e'/'q' keys from doing the default thing which is generally useless. It also handles the 'p' and 'l' keys so the picker and light manager are called. """ key = e.key() modifiers = e.modifiers() scene = self._scene camera = scene.camera if key in [QtCore.Qt.Key_Minus]: camera.zoom(0.8) scene.render() scene._record_methods('camera.zoom(0.8)\nrender()') return if key in [QtCore.Qt.Key_Equal, QtCore.Qt.Key_Plus]: camera.zoom(1.25) scene.render() scene._record_methods('camera.zoom(1.25)\nrender()') return if key in [QtCore.Qt.Key_E, QtCore.Qt.Key_Q, QtCore.Qt.Key_Escape]: scene._disable_fullscreen() return if key in [QtCore.Qt.Key_W]: return if key in [QtCore.Qt.Key_R]: scene._record_methods('reset_zoom()') return if key in [QtCore.Qt.Key_P] and modifiers == QtCore.Qt.NoModifier: pos = self.mapFromGlobal(QtGui.QCursor.pos()) x = pos.x() y = self.height() - pos.y() scene.picker.pick(x, y) return if key in [QtCore.Qt.Key_F] and modifiers == QtCore.Qt.NoModifier: pos = self.mapFromGlobal(QtGui.QCursor.pos()) x = pos.x() y = self.height() - pos.y() data = scene.picker.pick_world(x, y) coord = data.coordinate if coord is not None: camera.focal_point = coord scene.render() scene._record_methods('camera.focal_point = %r\n'\ 'render()'%list(coord)) return if key in [QtCore.Qt.Key_L] and modifiers == QtCore.Qt.NoModifier: scene.light_manager.configure() return if key in [QtCore.Qt.Key_S] and modifiers == QtCore.Qt.NoModifier: fname = popup_save(self.parent()) if len(fname) != 0: self._scene.save(fname) return shift = ((modifiers & QtCore.Qt.ShiftModifier) == QtCore.Qt.ShiftModifier) if key == QtCore.Qt.Key_Left: if shift: camera.yaw(-5) scene._record_methods('camera.yaw(-5)') else: camera.azimuth(5) scene._record_methods('camera.azimuth(5)') scene.render() scene._record_methods('render()') return if key == QtCore.Qt.Key_Right: if shift: camera.yaw(5) scene._record_methods('camera.yaw(5)') else: camera.azimuth(-5) scene._record_methods('camera.azimuth(-5)') scene.render() scene._record_methods('render()') return if key == QtCore.Qt.Key_Up: if shift: camera.pitch(-5) scene._record_methods('camera.pitch(-5)') else: camera.elevation(-5) scene._record_methods('camera.elevation(-5)') camera.orthogonalize_view_up() scene.render() scene._record_methods('camera.orthogonalize_view_up()\nrender()') return if key == QtCore.Qt.Key_Down: if shift: camera.pitch(5) scene._record_methods('camera.pitch(5)') else: camera.elevation(5) scene._record_methods('camera.elevation(5)') camera.orthogonalize_view_up() scene.render() scene._record_methods('camera.orthogonalize_view_up()\nrender()') return QVTKRenderWindowInteractor.keyPressEvent(self, e) def mousePressEvent(self, ev): """Override for mouse presses.""" self._interacting = True QVTKRenderWindowInteractor.mousePressEvent(self, ev) def mouseReleaseEvent(self, ev): """Override for mouse releases.""" self._interacting = False QVTKRenderWindowInteractor.mouseReleaseEvent(self, ev) def _start_event_callback(self, obj, event): if self._interacting: return else: self._scene.busy = True def _end_event_callback(self, obj, event): if self._interacting: return else: self._scene.busy = False ###################################################################### # `Scene` class. ###################################################################### class Scene(TVTKScene, Widget): """A VTK interactor scene widget for pyface and PyQt. This widget uses a RenderWindowInteractor and therefore supports interaction with VTK widgets. The widget uses TVTK. In addition to the features that the base TVTKScene provides this widget supports: - saving the rendered scene to the clipboard. - picking data on screen. Press 'p' or 'P' when the mouse is over a point that you need to pick. - The widget also uses a light manager to manage the lighting of the scene. Press 'l' or 'L' to activate a GUI configuration dialog for the lights. - Pressing the left, right, up and down arrow let you rotate the camera in those directions. When shift-arrow is pressed then the camera is panned. Pressing the '+' (or '=') and '-' keys let you zoom in and out. - full screen rendering via the full_screen button on the UI. """ # The version of this class. Used for persistence. __version__ = 0 ########################################################################### # Traits. ########################################################################### # Turn on full-screen rendering. full_screen = Button('Full Screen') # The picker handles pick events. picker = Instance(picker.Picker) ######################################## # Render_window's view. _stereo_view = Group(Item(name='stereo_render'), Item(name='stereo_type'), show_border=True, label='Stereo rendering', ) # The default view of this object. default_view = View(Group( Group(Item(name='background'), Item(name='foreground'), Item(name='parallel_projection'), Item(name='disable_render'), Item(name='off_screen_rendering'), Item(name='jpeg_quality'), Item(name='jpeg_progressive'), Item(name='magnification'), Item(name='anti_aliasing_frames'), Item(name='full_screen', show_label=False), ), Group(Item(name='render_window', style='custom', visible_when='object.stereo', editor=InstanceEditor(view=View(_stereo_view)), show_label=False), ), label='Scene'), Group( Item(name='light_manager', style='custom', show_label=False), label='Lights'), Group( Item( name='movie_maker', style='custom', show_label=False ), label='Movie'), buttons=['OK', 'Cancel'] ) ######################################## # Private traits. _vtk_control = Instance(_VTKRenderWindowInteractor) _fullscreen = Any(False) ########################################################################### # 'object' interface. ########################################################################### def __init__(self, parent=None, **traits): """ Initializes the object. """ # Base class constructor. super(Scene, self).__init__(parent, **traits) # Setup the default picker. self.picker = picker.Picker(self) # The light manager needs creating. self.light_manager = None self._cursor = QtCore.Qt.ArrowCursor def __get_pure_state__(self): """Allows us to pickle the scene.""" # The control attribute is not picklable since it is a VTK # object so we remove it. d = super(Scene, self).__get_pure_state__() for x in ['_vtk_control', '_fullscreen', '_cursor']: d.pop(x, None) return d ########################################################################### # 'Scene' interface. ########################################################################### def render(self): """ Force the scene to be rendered. Nothing is done if the `disable_render` trait is set to True.""" if not self.disable_render: self._vtk_control.Render() def get_size(self): """Return size of the render window.""" sz = self._vtk_control.size() return (sz.width(), sz.height()) def set_size(self, size): """Set the size of the window.""" self._vtk_control.resize(*size) def hide_cursor(self): """Hide the cursor.""" self._cursor = self._vtk_control.cursor().shape() self._vtk_control.setCursor(QtCore.Qt.BlankCursor) def show_cursor(self): """Show the cursor.""" self._vtk_control.setCursor(self._cursor) ########################################################################### # 'TVTKScene' interface. ########################################################################### def save_to_clipboard(self): """Saves a bitmap of the scene to the clipboard.""" handler, name = tempfile.mkstemp() self.save_bmp(name) QtGui.QApplication.clipboard().setImage(QtGui.QImage(name)) os.close(handler) os.unlink(name) ########################################################################### # 'event' interface. ########################################################################### def _closed_fired(self): super(Scene, self)._closed_fired() self.picker = None self._vtk_control = None self.control = None ########################################################################### # Non-public interface. ########################################################################### def _create_control(self, parent): """ Create the toolkit-specific control that represents the widget. """ # Create the VTK widget. self._vtk_control = window = _VTKRenderWindowInteractor( self, parent, stereo=self.stereo) # Switch the default interaction style to the trackball one. window.GetInteractorStyle().SetCurrentStyleToTrackballCamera() # Grab the renderwindow. renwin = self._renwin = tvtk.to_tvtk(window.GetRenderWindow()) renwin.set(point_smoothing=self.point_smoothing, line_smoothing=self.line_smoothing, polygon_smoothing=self.polygon_smoothing) # Create a renderer and add it to the renderwindow self._renderer = tvtk.Renderer() renwin.add_renderer(self._renderer) # Save a reference to our camera so it is not GC'd -- needed for # the sync_traits to work. self._camera = self.camera # Sync various traits. self._renderer.background = self.background self.sync_trait('background', self._renderer) self.renderer.on_trait_change(self.render, 'background') renwin.off_screen_rendering = self.off_screen_rendering self._camera.parallel_projection = self.parallel_projection self.sync_trait('parallel_projection', self._camera) self.sync_trait('off_screen_rendering', self._renwin) self.render_window.on_trait_change(self.render, 'off_screen_rendering') self.render_window.on_trait_change(self.render, 'stereo_render') self.render_window.on_trait_change(self.render, 'stereo_type') self.camera.on_trait_change(self.render, 'parallel_projection') self._interactor = tvtk.to_tvtk(window._Iren) return window def _lift(self): """Lift the window to the top. Useful when saving screen to an image.""" if self.render_window.off_screen_rendering: # Do nothing if off screen rendering is being used. return self._vtk_control.window().raise_() QtCore.QCoreApplication.processEvents() def _full_screen_fired(self): fs = self._fullscreen if fs: self._vtk_control.window().showNormal() self._fullscreen = False else: self._vtk_control.window().showFullScreen() self._fullscreen = True def _disable_fullscreen(self): fs = self._fullscreen if fs: self._vtk_control.window().showNormal() self._fullscreen = False def _busy_changed(self, val): GUI.set_busy(val) mayavi-4.5.0/tvtk/pyface/ui/qt4/scene_editor.py0000644000076500000240000002125712747716314022036 0ustar prabhustaff00000000000000"""A `SceneEditor` for the `SceneModel`. """ # Authors: Prabhu Ramachandran # Robert Kern # # Copyright (c) 2007, Enthought, Inc. # License: BSD Style. import os from pyface.qt import QtGui # Enthought library imports. from traits.api import Any, Bool, Callable from traitsui.qt4.editor import Editor from traitsui.basic_editor_factory import BasicEditorFactory from .decorated_scene import DecoratedScene ##################################################################### # `_SceneEditor` class ##################################################################### class _SceneEditor(Editor): """ An editor for SceneModels. """ # The editor is scrollable, so override the default. scrollable = Bool(True) # Internal GUI traits. _scene = Any() #### Public 'Editor' interface ############################################# def init(self, parent): """ Finishes initializing the editor by creating the underlying toolkit widget. """ factory = self.factory self.control = QtGui.QWidget() lay = QtGui.QVBoxLayout(self.control) lay.setContentsMargins(0, 0, 0, 0) assert self.value.scene_editor is None, \ "The SceneModel may only have one active editor!" self._create_scene() self.value.activated = True def update_editor(self): """ Updates the editor when the object trait changes external to the editor. """ # Everything should really be handled elsewhere in trait notifications. # Just pass here. pass def dispose(self): """ Disposes of the contents of an editor. """ # Remove notifications. self.value.closing = True self.value.scene_editor = None self._setup_scene_notifications(remove=True) # Remove the current scene. if self._scene is not None: self._scene.close() self._scene = None # This will destroy self.control and all of its children, including the # scene's control. super(_SceneEditor, self).dispose() #### Private '_SceneEditor' interface ################################## def _create_scene(self): """ Create the TVTK scene widget. """ factory = self.factory self._scene = factory.scene_class(self.control) scene = self._scene self.value.scene_editor = scene # Disable rendering on the scene until we're finished. scene.disable_render = True # Add all of the actors in the current actor map. for obj, actors in self.value.actor_map.items(): self._add_actors_widgets(actors) # Add all of the actors in the current actor map. self._add_actors_widgets(self.value.actor_list) # Set up Traits notifications. self._setup_scene_notifications() # Re-enable rendering. scene.disable_render = False self.control.layout().addWidget(scene.control) # Force a render. scene.render() def _setup_scene_notifications(self, remove=False): """ Set up or remove all of the Trait notifications that control the scene widget. """ traits_to_sync = ['foreground', 'anti_aliasing_frames', 'stereo', 'background', 'off_screen_rendering', 'polygon_smoothing', 'jpeg_progressive', 'point_smoothing', 'busy', 'disable_render', 'magnification', 'jpeg_quality', 'parallel_projection', 'line_smoothing'] model = self.value scene = self._scene if not remove: scene.set(**model.get(traits_to_sync)) for trait in traits_to_sync: scene.sync_trait(trait, model, mutual=True, remove=remove) model.on_trait_change( scene.render, name='do_render', remove=remove, ) model.on_trait_change( self._actors_changed, name='actor_map_items', remove=remove, ) model.on_trait_change( self._actor_map_changed, name='actor_map', remove=remove, ) model.on_trait_change( self._actor_list_items_changed, name='actor_list_items', remove=remove, ) model.on_trait_change( self._actor_list_changed, name='actor_list', remove=remove, ) def _actors_changed(self, event): """ Handle the event of the actors in the actor map changing. """ scene = self._scene # Temporarily turn off rendering. We (re)store the old value of # disable_render because it may already be True. old_disable_render = scene.disable_render scene.disable_render = True try: for obj, actors in event.removed.items(): self._remove_actors_widgets(actors) for obj, actors in event.added.items(): self._add_actors_widgets(actors) for obj, actors in event.changed.items(): # The actors in the event are the old ones. Grab the new ones # from the actor map itself. self._remove_actors_widgets(actors) self._add_actors_widgets(self.value.actor_map[obj]) finally: scene.disable_render = old_disable_render scene.render() def _actor_map_changed(self, object, name, old, new): """ Handle the case when the entire actor map is set to something else. """ scene = self._scene # Temporarily turn off rendering. We (re)store the old value of # disable_render because it may already be True. old_disable_render = scene.disable_render scene.disable_render = True try: for obj, actors in old.items(): self._remove_actors_widgets(actors) for obj, actors in new.items(): self._add_actors_widgets(actors) finally: scene.disable_render = old_disable_render scene.render() def _actor_list_items_changed(self, event): self._actor_list_changed(self.value, 'actor_list', event.removed, event.added) def _actor_list_changed(self, object, name, old, new): """ Handle the event of the actors in the actor map changing. """ scene = self._scene # Temporarily turn off rendering. We (re)store the old value of # disable_render because it may already be True. old_disable_render = scene.disable_render scene.disable_render = True try: self._remove_actors_widgets(old) self._add_actors_widgets(new) finally: scene.disable_render = old_disable_render scene.render() def _separate_actors_widgets(self, actors_widgets): """Given a sequence (or single) of actors or widgets, this returns a list of just the actors and another of just the widgets. """ if not hasattr(actors_widgets, '__getitem__'): actors_widgets = [actors_widgets] actors = [] widgets = [] for actor in actors_widgets: if actor.is_a('vtk3DWidget') or actor.is_a('vtkInteractorObserver'): widgets.append(actor) else: actors.append(actor) return actors, widgets def _add_actors_widgets(self, actors_widgets): """Add actors and widgets to scene.""" scene = self._scene actors, widgets = self._separate_actors_widgets(actors_widgets) scene.add_actors(actors) enabled_info = self.value.enabled_info for widget in widgets: scene.add_widgets(widget, enabled_info.get(widget, True)) def _remove_actors_widgets(self, actors_widgets): """Remove actors and widgets from scene.""" scene = self._scene actors, widgets = self._separate_actors_widgets(actors_widgets) scene.remove_actors(actors) scene.remove_widgets(widgets) ##################################################################### # `SceneEditor` class ##################################################################### class SceneEditor(BasicEditorFactory): """ A TraitsUI editor factory for SceneModel instances. """ # The class of the editor object to be constructed. klass = _SceneEditor # The class or factory function for creating the actual scene object. scene_class = Callable(DecoratedScene) #### EOF ####################################################################### mayavi-4.5.0/tvtk/pyface/ui/wx/0000755000076500000240000000000012747722127016737 5ustar prabhustaff00000000000000mayavi-4.5.0/tvtk/pyface/ui/wx/__init__.py0000644000076500000240000000120712747716314021051 0ustar prabhustaff00000000000000#------------------------------------------------------------------------------ # # Copyright (c) 2005, Enthought, Inc. # All rights reserved. # # This software is provided without warranty under the terms of the BSD # license included in enthought/LICENSE.txt and may be redistributed only # under the conditions described in the aforementioned license. The license # is also available online at http://www.enthought.com/licenses/BSD.txt # # Thanks for using Enthought open source! # # Author: Enthought, Inc. # #------------------------------------------------------------------------------ """ Enthought pyface package component """ mayavi-4.5.0/tvtk/pyface/ui/wx/actor_editor.py0000644000076500000240000002002012747716314021762 0ustar prabhustaff00000000000000#------------------------------------------------------------------------------ # # Copyright (c) 2007, Enthought, Inc. # All rights reserved. # # This software is provided without warranty under the terms of the BSD # license included in enthought/LICENSE.txt and may be redistributed only # under the conditions described in the aforementioned license. The license # is also available online at http://www.enthought.com/licenses/BSD.txt # # Thanks for using Enthought open source! # # Authors: Robert Kern # Prabhu Ramachandran # #------------------------------------------------------------------------------ """ A mostly-general Traits UI editor for viewing things in TVTK scenes. """ # Major library imports. import wx # Enthought library imports. from traits.api import Any, Bool, Callable, Dict, Str from traitsui.wx.editor import Editor from traitsui.basic_editor_factory import BasicEditorFactory from .decorated_scene import DecoratedScene ##################################################################### # `_ActorEditor` class ##################################################################### class _ActorEditor(Editor): """ An editor for TVTK scenes. """ # The editor is scrollable, so override the default. scrollable = Bool(True) # Internal GUI traits. _sizer = Any() _scene = Any() #### Public 'Editor' interface ############################################# def init(self, parent): """ Finishes initializing the editor by creating the underlying toolkit widget. """ factory = self.factory self.control = wx.Panel(parent, -1) self._sizer = wx.BoxSizer(wx.VERTICAL) self.control.SetSizer(self._sizer) self._create_scene() def update_editor(self): """ Updates the editor when the object trait changes external to the editor. """ # Everything should really be handled elsewhere in trait notifications. # Just pass here. pass def dispose(self): """ Disposes of the contents of an editor. """ # Remove notifications. self._setup_scene_notifications(remove=True) # Remove the current scene. if self._scene is not None: self._scene.close() self._scene = None self._sizer = None # This will destroy self.control and all of its children, including the # scene's control. super(_ActorEditor, self).dispose() #### Private '_ActorEditor' interface ################################## def _create_scene(self): """ Create the TVTK scene widget. """ factory = self.factory self._scene = factory.scene_class(self.control, **factory.scene_kwds) scene = self._scene # Disable rendering on the scene until we're finished. scene.disable_render = True # Add all of the actors in the current actor map. for obj, actors in self.value.items(): self._add_actors_widgets(actors) # Set up Traits notifications. self._setup_scene_notifications() # Re-enable rendering. scene.disable_render = False # Ensure the scene's wx control is sized to fill our view's area. Note # that the sizer doesn't automatically layout its contents upon adding # a new child so we have to force it to do a layout. self._sizer.Add(scene.control, 1, wx.EXPAND) self._sizer.Layout() wx.EVT_IDLE(scene.control, None) # Force a render. scene.render() def _setup_scene_notifications(self, remove=False): """ Set up or remove all of the Trait notifications that control the scene widget. """ self.object.on_trait_change( self._set_scene_disable_render, name=self.factory.disable_render_name, remove=remove, ) self.object.on_trait_event( self._scene.render, name=self.factory.do_render_name, remove=remove, ) self.object.on_trait_change( self._actors_changed, name=self.name+'_items', remove=remove, ) self.object.on_trait_change( self._actor_map_changed, name=self.name, remove=remove, ) def _set_scene_disable_render(self, new): """ A callback for Traits notifications. """ self._scene.disable_render = new def _actors_changed(self, event): """ Handle the event of the actors in the actor map changing. """ scene = self._scene # Temporarily turn off rendering. We (re)store the old value of # disable_render because it may already be True. old_disable_render = scene.disable_render scene.disable_render = True try: for obj, actors in event.removed.items(): self._remove_actors_widgets(actors) for obj, actors in event.added.items(): self._add_actors_widgets(actors) for obj, actors in event.changed.items(): # The actors in the event are the old ones. Grab the new ones # from the actor map itself. self._remove_actors_widgets(actors) self._add_actors_widgets(self.value[obj]) finally: scene.disable_render = old_disable_render scene.render() def _actor_map_changed(self, object, name, old, new): """ Handle the case when the entire actor map is set to something else. """ scene = self._scene # Temporarily turn off rendering. We (re)store the old value of # disable_render because it may already be True. old_disable_render = scene.disable_render scene.disable_render = True try: for obj, actors in old.items(): self._remove_actors_widgets(actors) for obj, actors in new.items(): self._add_actors_widgets(actors) finally: scene.disable_render = old_disable_render scene.render() def _separate_actors_widgets(self, actors_widgets): """Given a sequence (or single) of actors or widgets, this returns a list of just the actors and another of just the widgets. """ if not hasattr(actors_widgets, '__getitem__'): actors_widgets = [actors_widgets] actors = [] widgets = [] for actor in actors_widgets: if actor.is_a('vtk3DWidget'): widgets.append(actor) else: actors.append(actor) return actors, widgets def _add_actors_widgets(self, actors_widgets): """Add actors and widgets to scene.""" scene = self._scene actors, widgets = self._separate_actors_widgets(actors_widgets) scene.add_actors(actors) scene.add_widgets(widgets) def _remove_actors_widgets(self, actors_widgets): """Remove actors and widgets from scene.""" scene = self._scene actors, widgets = self._separate_actors_widgets(actors_widgets) scene.remove_actors(actors) scene.remove_widgets(widgets) ##################################################################### # `ActorEditor` class ##################################################################### class ActorEditor(BasicEditorFactory): """ An editor factory for TVTK scenes. """ # The class of the editor object to be constructed. klass = _ActorEditor # The class or factory function for creating the actual scene object. scene_class = Callable(DecoratedScene) # Keyword arguments to pass to the scene factory. scene_kwds = Dict() # The name of the trait used for ITVTKActorModel.disable_render. disable_render_name = Str('disable_render') # The name of the trait used for ITVTKActorModel.do_render. do_render_name = Str('do_render') #### EOF ####################################################################### mayavi-4.5.0/tvtk/pyface/ui/wx/decorated_scene.py0000644000076500000240000002664612747716314022437 0ustar prabhustaff00000000000000#------------------------------------------------------------------------------ # # Copyright (c) 2006, Enthought, Inc. # All rights reserved. # # This software is provided without warranty under the terms of the BSD # license included in enthought/LICENSE.txt and may be redistributed only # under the conditions described in the aforementioned license. The license # is also available online at http://www.enthought.com/licenses/BSD.txt # # Thanks for using Enthought open source! # # Authors: Prabhu Ramachandran , # Dave Peterson # #------------------------------------------------------------------------------ """ A VTK interactor scene which provides a convenient toolbar that allows the user to set the camera view, turn on the axes indicator, etc. """ # System imports. from os.path import dirname import wx # Enthought library imports. from pyface.api import ImageResource from pyface.action.api import ToolBarManager, Group, Action from tvtk.api import tvtk from traits.api import Instance, false, List, Either # Local imports. from .scene import Scene, popup_save ########################################################################### # 'DecoratedScene' class ########################################################################### class DecoratedScene(Scene): """A VTK interactor scene which provides a convenient toolbar that allows the user to set the camera view, turn on the axes indicator etc. """ ####################################################################### # Traits ####################################################################### if hasattr(tvtk, 'OrientationMarkerWidget'): # The tvtk orientation marker widget. This only exists in VTK # 5.x. marker = Instance(tvtk.OrientationMarkerWidget, ()) # The tvtk axes that will be shown for the orientation. axes = Instance(tvtk.AxesActor, ()) else: marker = None axes = None # Determine if the orientation axis is shown or not. show_axes = false # The list of actions represented in the toolbar actions = List(Either(Action, Group)) ########################################################################## # `object` interface ########################################################################## def __init__(self, parent, **traits): super(DecoratedScene, self).__init__(parent, **traits) self._setup_axes_marker() def __get_pure_state__(self): """Allows us to pickle the scene.""" # The control attribute is not picklable since it is a VTK # object so we remove it. d = super(DecoratedScene, self).__get_pure_state__() for x in ['_content', '_panel', '_sizer', '_tool_bar', 'actions']: d.pop(x, None) return d ########################################################################## # Non-public interface. ########################################################################## def _create_control(self, parent): """ Create the toolkit-specific control that represents the widget. Overridden to wrap the Scene control within a panel that also contains a toolbar. """ # Create a panel as a wrapper of the scene toolkit control. This # allows us to also add additional controls. self._panel = wx.Panel(parent, -1, style=wx.CLIP_CHILDREN) self._sizer = wx.BoxSizer(wx.VERTICAL) self._panel.SetSizer(self._sizer) # Add our toolbar to the panel. tbm = self._get_tool_bar_manager() self._tool_bar = tbm.create_tool_bar(self._panel) self._sizer.Add(self._tool_bar, 0, wx.EXPAND) # Create the actual scene content self._content = super(DecoratedScene, self)._create_control( self._panel) self._sizer.Add(self._content, 1, wx.EXPAND) # Ensure the child controls are laid-out. self._sizer.Layout() return self._panel def _setup_axes_marker(self): axes = self.axes if axes is None: # For VTK versions < 5.0. return axes.set( normalized_tip_length=(0.4, 0.4, 0.4), normalized_shaft_length=(0.6, 0.6, 0.6), shaft_type='cylinder' ) p = axes.x_axis_caption_actor2d.caption_text_property axes.y_axis_caption_actor2d.caption_text_property = p axes.z_axis_caption_actor2d.caption_text_property = p p.set(color=(1,1,1), shadow=False, italic=False) self._background_changed(self.background) self.marker.set(key_press_activation=False) self.marker.orientation_marker = axes def _get_tool_bar_manager(self): """ Returns the tool_bar_manager for this scene. """ tbm = ToolBarManager( *self.actions ) return tbm def _get_image_path(self): """Returns the directory which contains the images used by the toolbar.""" # So that we can find the images. import tvtk.pyface.api return dirname(tvtk.pyface.api.__file__) def _toggle_projection(self): """ Toggle between perspective and parallel projection, this is used for the toolbar. """ if self._panel is not None: self.parallel_projection = not self.parallel_projection def _toggle_axes(self): """Used by the toolbar to turn on/off the axes indicator. """ if self._panel is not None: self.show_axes = not self.show_axes def _save_snapshot(self): """Invoked by the toolbar menu to save a snapshot of the scene to an image. Note that the extension of the filename determines what image type is saved. The default is PNG. """ if self._panel is not None: path = popup_save(self._panel) if len(path) > 0: # The extension of the path will determine the actual # image type saved. self.save(path) def _configure_scene(self): """Invoked when the toolbar icon for configuration is clicked. """ self.edit_traits() ###################################################################### # Trait handlers. ###################################################################### def _show_axes_changed(self): marker = self.marker if (self._vtk_control is not None) and (marker is not None): if not self.show_axes: marker.interactor = None marker.enabled = False else: marker.interactor = self.interactor marker.enabled = True self.render() def _background_changed(self, value): # Depending on the background, this sets the axes text and # outline color to something that should be visible. axes = self.axes if (self._vtk_control is not None) and (axes is not None): p = self.axes.x_axis_caption_actor2d.caption_text_property m = self.marker s = value[0] + value[1] + value[2] if s <= 1.0: p.color = (1,1,1) m.set_outline_color(1,1,1) else: p.color = (0,0,0) m.set_outline_color(0,0,0) self.render() def _actions_default(self): return [ Group( Action( image = ImageResource('16x16/x-axis', search_path = [self._get_image_path()], ), tooltip = "View along the -X axis", on_perform = self.x_minus_view, ), Action( image = ImageResource('16x16/x-axis', search_path = [self._get_image_path()], ), tooltip = "View along the +X axis", on_perform = self.x_plus_view, ), Action( image = ImageResource('16x16/y-axis', search_path = [self._get_image_path()], ), tooltip = "View along the -Y axis", on_perform = self.y_minus_view, ), Action( image = ImageResource('16x16/y-axis', search_path = [self._get_image_path()], ), tooltip = "View along the +Y axis", on_perform = self.y_plus_view, ), Action( image = ImageResource('16x16/z-axis', search_path = [self._get_image_path()], ), tooltip = "View along the -Z axis", on_perform = self.z_minus_view, ), Action( image = ImageResource('16x16/z-axis', search_path = [self._get_image_path()], ), tooltip = "View along the +Z axis", on_perform = self.z_plus_view, ), Action( image = ImageResource('16x16/isometric', search_path = [self._get_image_path()], ), tooltip = "Obtain an isometric view", on_perform = self.isometric_view, ), ), Group( Action( image = ImageResource('16x16/parallel', search_path = [self._get_image_path()], ), tooltip = 'Toggle parallel projection', style="toggle", on_perform = self._toggle_projection, checked = self.parallel_projection, ), Action( image = ImageResource('16x16/origin_glyph', search_path = [self._get_image_path()], ), tooltip = 'Toggle axes indicator', style="toggle", enabled=(self.marker is not None), on_perform = self._toggle_axes, checked = self.show_axes, ), Action( image = ImageResource('16x16/fullscreen', search_path = [self._get_image_path()], ), tooltip = 'Full Screen (press "q" or "e" or ESC to exit fullscreen)', style="push", on_perform = self._full_screen_fired, ), ), Group( Action( image = ImageResource('16x16/save', search_path = [self._get_image_path()], ), tooltip = "Save a snapshot of this scene", on_perform = self._save_snapshot, ), Action( image = ImageResource('16x16/configure', search_path = [self._get_image_path()], ), tooltip = 'Configure the scene', style="push", on_perform = self._configure_scene, ), ), ] mayavi-4.5.0/tvtk/pyface/ui/wx/init.py0000644000076500000240000000203612747716314020256 0ustar prabhustaff00000000000000#------------------------------------------------------------------------------ # # Copyright (c) 2007, Riverbank Computing Limited # All rights reserved. # # This software is provided without warranty under the terms of the BSD # license included in enthought/LICENSE.txt and may be redistributed only # under the conditions described in the aforementioned license. The license # is also available online at http://www.enthought.com/licenses/BSD.txt # #------------------------------------------------------------------------------ # Major package imports. import wx # Check the version number is late enough. if wx.VERSION < (2, 6): raise RuntimeError("Need wx version 2.6 or higher, but got %s" % str(wx.VERSION)) # It's possible that it has already been initialised. _app = wx.GetApp() if _app is None: _app = wx.PySimpleApp() # Before we can load any images we have to initialize wxPython's image # handlers. wx.InitAllImageHandlers() #### EOF ###################################################################### mayavi-4.5.0/tvtk/pyface/ui/wx/scene.py0000644000076500000240000006610712747716314020421 0ustar prabhustaff00000000000000#------------------------------------------------------------------------------ # Copyright (c) 2005-2016, Enthought, Inc. # All rights reserved. # # This software is provided without warranty under the terms of the BSD # license included in enthought/LICENSE.txt and may be redistributed only # under the conditions described in the aforementioned license. The license # is also available online at http://www.enthought.com/licenses/BSD.txt # Thanks for using Enthought open source! # # Author: Enthought, Inc. # Description: #------------------------------------------------------------------------------ """A VTK interactor scene widget for the PyFace wxPython backend. See the class docs for more details. """ # Author: Prabhu Ramachandran # Copyright (c) 2004-2016, Enthought, Inc. # License: BSD Style. import sys import os import tempfile import wx from tvtk.api import tvtk from tvtk import messenger from traits.api import Instance, Button, Any, Bool from traitsui.api import View, Group, Item, InstanceEditor from pyface.api import Widget, GUI from tvtk.pyface import picker from tvtk.pyface import light_manager from tvtk.pyface.utils import popup_save from tvtk.pyface.tvtk_scene import TVTKScene from .wxVTKRenderWindowInteractor import wxVTKRenderWindowInteractor ###################################################################### # `FullScreen` class. ###################################################################### class FullScreen(object): """Creates a full screen interactor widget. This will use VTK's event loop until the user presses 'q'/'e' on the full screen window. This does not yet support interacting with any widgets on the renderered scene. This class is really meant to be used for VTK versions earlier than 5.1 where there was a bug with reparenting a window. """ def __init__(self, scene): self.scene = scene self.old_rw = scene.render_window self.ren = scene.renderer def run(self): # Remove the renderer from the current render window. self.old_rw.remove_renderer(self.ren) # Creates renderwindow tha should be used ONLY for # visualization in full screen full_rw = tvtk.RenderWindow(stereo_capable_window=True, full_screen=True ) # add the current visualization full_rw.add_renderer(self.ren) # Under OS X there is no support for creating a full screen # window so we set the size of the window here. if sys.platform == 'darwin': full_rw.size = tuple(wx.GetDisplaySize()) # provides a simple interactor style = tvtk.InteractorStyleTrackballCamera() self.iren = tvtk.RenderWindowInteractor(render_window=full_rw, interactor_style=style) # Gets parameters for stereo visualization if self.old_rw.stereo_render: full_rw.set(stereo_type=self.old_rw.stereo_type, stereo_render=True) # Starts the interactor self.iren.initialize() self.iren.render() self.iren.start() # Once the full screen window is quit this releases the # renderer before it is destroyed, and return it to the main # renderwindow. full_rw.remove_renderer(self.ren) self.old_rw.add_renderer(self.ren) self.old_rw.render() self.iren.disable() ###################################################################### # `PopupScene` class. ###################################################################### class PopupScene(object): """Pops up a Scene instance with an independent `wx.Frame` in order to produce either a standalone window or usually a full screen view with *complete* interactivity (including widget interaction). """ def __init__(self, scene): self.orig_parent = None self.orig_size = None self.orig_pos = None self.frame = None self.scene = scene self.vtk_control = self.scene._vtk_control def _setup_frame(self): vtk_control = self.vtk_control self.orig_parent = vtk_control.GetParent() self.orig_size = vtk_control.GetSize() self.orig_pos = vtk_control.GetPosition() f = self.frame = wx.Frame(None, -1) return f def reparent_vtk(self, widget): """Reparent VTK control to another widget. """ scene = self.scene vc = self.vtk_control # We want to disable any rendering at this time so we override # the original render with a dummy after saving it. orig_disable_render = scene.disable_render scene.disable_render = True orig_render = vc.Render vc.Render = lambda : None rw = vc.GetRenderWindow() if sys.platform != 'darwin' and wx.Platform != '__WXMSW__': rw.SetNextWindowInfo(str(widget.GetHandle())) rw.WindowRemap() vc.Reparent(widget) wx.GetApp().Yield(True) # Restore the original render. vc.Render = orig_render vc.Render() scene.disable_render = orig_disable_render def popup(self, size=None): """Create a popup window of scene and set its default size. """ vc = self.vtk_control f = self._setup_frame() if size is None: f.SetSize(vc.GetSize()) else: f.SetSize(size) f.Show(True) self.reparent_vtk(f) def fullscreen(self): """Create a popup window of scene. """ f = self._setup_frame() f.Show(True) self.reparent_vtk(f) f.ShowFullScreen(True) def close(self): """Close the window and reparent the TVTK scene. """ f = self.frame if f is None: return vc = self.vtk_control self.reparent_vtk(self.orig_parent) vc.SetSize(self.orig_size) vc.SetPosition(self.orig_pos) f.ShowFullScreen(False) f.Show(False) f.Close() self.frame = None ###################################################################### # `Scene` class. ###################################################################### class Scene(TVTKScene, Widget): """A VTK interactor scene widget for pyface and wxPython. This widget uses a RenderWindowInteractor and therefore supports interaction with VTK widgets. The widget uses TVTK. In addition to the features that the base TVTKScene provides this widget supports: - saving the rendered scene to the clipboard. - picking data on screen. Press 'p' or 'P' when the mouse is over a point that you need to pick. - The widget also uses a light manager to manage the lighting of the scene. Press 'l' or 'L' to activate a GUI configuration dialog for the lights. - Pressing the left, right, up and down arrow let you rotate the camera in those directions. When shift-arrow is pressed then the camera is panned. Pressing the '+' (or '=') and '-' keys let you zoom in and out. - Pressing the 'f' key will set the camera focal point to the current point. - full screen rendering via the full_screen button on the UI. """ # The version of this class. Used for persistence. __version__ = 0 ########################################################################### # Traits. ########################################################################### # Turn on full-screen rendering. full_screen = Button('Full Screen') # The picker handles pick events. picker = Instance(picker.Picker) ######################################## # Render_window's view. _stereo_view = Group(Item(name='stereo_render'), Item(name='stereo_type'), show_border=True, label='Stereo rendering', ) # The default view of this object. default_view = View(Group( Group(Item(name='background'), Item(name='foreground'), Item(name='parallel_projection'), Item(name='disable_render'), Item(name='off_screen_rendering'), Item(name='jpeg_quality'), Item(name='jpeg_progressive'), Item(name='magnification'), Item(name='anti_aliasing_frames'), Item(name='full_screen', show_label=False), ), Group(Item(name='render_window', style='custom', visible_when='object.stereo', editor=InstanceEditor(view=View(_stereo_view)), show_label=False), ), label='Scene'), Group( Item(name='light_manager', style='custom', show_label=False), label='Lights'), Group( Item( name='movie_maker', style='custom', show_label=False ), label='Movie'), buttons=['OK', 'Cancel'] ) ######################################## # Private traits. _vtk_control = Instance(wxVTKRenderWindowInteractor) _fullscreen = Any _interacting = Bool ########################################################################### # 'object' interface. ########################################################################### def __init__(self, parent=None, **traits): """ Initializes the object. """ # Base class constructor. super(Scene, self).__init__(parent, **traits) # Setup the default picker. self.picker = picker.Picker(self) def __get_pure_state__(self): """Allows us to pickle the scene.""" # The control attribute is not picklable since it is a VTK # object so we remove it. d = super(Scene, self).__get_pure_state__() for x in ['_vtk_control', '_fullscreen', '_interacting']: d.pop(x, None) return d ########################################################################### # 'Scene' interface. ########################################################################### def render(self): """ Force the scene to be rendered. Nothing is done if the `disable_render` trait is set to True.""" if not self.disable_render: self._vtk_control.Render() def get_size(self): """Return size of the render window.""" return self._vtk_control.GetSize() def set_size(self, size): """Set the size of the window.""" self._vtk_control.SetSize(size) def hide_cursor(self): """Hide the cursor.""" self._vtk_control.HideCursor() def show_cursor(self): """Show the cursor.""" self._vtk_control.ShowCursor() ########################################################################### # 'TVTKScene' interface. ########################################################################### def save_to_clipboard(self): """Saves a bitmap of the scene to the clipboard.""" handler, name = tempfile.mkstemp() self.save_bmp(name) bmp = wx.Bitmap(name, wx.BITMAP_TYPE_BMP) bmpdo = wx.BitmapDataObject(bmp) wx.TheClipboard.Open() wx.TheClipboard.SetData(bmpdo) wx.TheClipboard.Close() os.close(handler) os.unlink(name) ########################################################################### # `wxVTKRenderWindowInteractor` interface. ########################################################################### def OnKeyDown(self, event): """This method is overridden to prevent the 's'/'w'/'e'/'q' keys from doing the default thing which is generally useless. It also handles the 'p' and 'l' keys so the picker and light manager are called. """ keycode = event.GetKeyCode() modifiers = event.HasModifiers() camera = self.camera if keycode < 256: key = chr(keycode) if key == '-': camera.zoom(0.8) self.render() self._record_methods('camera.zoom(0.8)\nrender()') return if key in ['=', '+']: camera.zoom(1.25) self.render() self._record_methods('camera.zoom(1.25)\nrender()') return if key.lower() in ['q', 'e'] or keycode == wx.WXK_ESCAPE: self._disable_fullscreen() if key.lower() in ['w']: event.Skip() return if key.lower() in ['r']: self._record_methods('reset_zoom()') # Handle picking. if key.lower() in ['p']: # In wxPython-2.6, there appears to be a bug in # EVT_CHAR so that event.GetX() and event.GetY() are # not correct. Therefore the picker is called on # KeyUp. event.Skip() return # Camera focal point. if key.lower() in ['f']: event.Skip() return # Light configuration. if key.lower() in ['l'] and not modifiers: self.light_manager.configure() return if key.lower() in ['s'] and not modifiers: parent = self._vtk_control.GetParent() fname = popup_save(parent) if len(fname) != 0: self.save(fname) return shift = event.ShiftDown() if keycode == wx.WXK_LEFT: if shift: camera.yaw(-5) self._record_methods('camera.yaw(-5)') else: camera.azimuth(5) self._record_methods('camera.azimuth(5)') self.render() self._record_methods('render()') return elif keycode == wx.WXK_RIGHT: if shift: camera.yaw(5) self._record_methods('camera.yaw(5)') else: camera.azimuth(-5) self._record_methods('camera.azimuth(-5)') self.render() self._record_methods('render()') return elif keycode == wx.WXK_UP: if shift: camera.pitch(-5) self._record_methods('camera.pitch(-5)') else: camera.elevation(-5) self._record_methods('camera.elevation(-5)') camera.orthogonalize_view_up() self.render() self._record_methods('camera.orthogonalize_view_up()\nrender()') return elif keycode == wx.WXK_DOWN: if shift: camera.pitch(5) self._record_methods('camera.pitch(5)') else: camera.elevation(5) self._record_methods('camera.elevation(5)') camera.orthogonalize_view_up() self.render() self._record_methods('camera.orthogonalize_view_up()\nrender()') return self._vtk_control.OnKeyDown(event) # Skipping the event is not ideal but necessary because we # have no way of knowing of the event was really handled or # not and not skipping will break any keyboard accelerators. # In practice this does not seem to pose serious problems. event.Skip() def OnKeyUp(self, event): """This method is overridden to prevent the 's'/'w'/'e'/'q' keys from doing the default thing which is generally useless. It also handles the 'p' and 'l' keys so the picker and light manager are called. The 'f' key sets the camera focus. """ keycode = event.GetKeyCode() modifiers = event.HasModifiers() if keycode < 256: key = chr(keycode) if key.lower() in ['s', 'w', 'e', 'q']: event.Skip() return # Set camera focal point. if key.lower() in ['f']: if not modifiers: if sys.platform == 'darwin': x, y = self._interactor.event_position else: x = event.GetX() y = self._vtk_control.GetSize()[1] - event.GetY() data = self.picker.pick_world(x, y) coord = data.coordinate if coord is not None: self.camera.focal_point = coord self.render() self._record_methods('camera.focal_point = %r\n'\ 'render()'%list(coord)) return # Handle picking. if key.lower() in ['p']: if not modifiers: if sys.platform == 'darwin': x, y = self._interactor.event_position else: x = event.GetX() y = self._vtk_control.GetSize()[1] - event.GetY() self.picker.pick(x, y) return else: # This is here to disable VTK's own pick handler # which can get called when you press Alt/Ctrl + # 'p'. event.Skip() return # Light configuration. if key.lower() in ['l']: event.Skip() return self._vtk_control.OnKeyUp(event) event.Skip() def OnPaint(self, event): """This method is overridden temporarily in order to create the light manager. This is necessary because it makes sense to create the light manager only when the widget is realized. Only when the widget is realized is the VTK render window created and only then are the default lights all setup correctly. This handler is removed on the first Paint event and the default paint handler of the wxVTKRenderWindowInteractor is used instead.""" # Call the original handler (this will Show the widget) self._vtk_control.OnPaint(event) if len(self.renderer.lights) == 0: # The renderer is not ready yet, we do not do anything, and # we do not remove this callback, so that it will be called # later. return # Now create the light manager. self.light_manager = light_manager.LightManager(self) renwin = self._renwin renwin.update_traits() vtk_rw = tvtk.to_vtk(renwin) renwin.add_observer('StartEvent', messenger.send) messenger.connect(vtk_rw, 'StartEvent', self._start_event_callback) renwin.add_observer('EndEvent', messenger.send) messenger.connect(vtk_rw, 'EndEvent', self._end_event_callback) # Reset the event handler to the default since our job is done. wx.EVT_PAINT(self._vtk_control, None) # Remove the default handler. wx.EVT_PAINT(self._vtk_control, self._vtk_control.OnPaint) def OnSize(self, event): """Overrides the default OnSize in order to refresh the traits of the render window.""" if self._renwin is not None: self._vtk_control.OnSize(event) self._renwin.update_traits() def OnButtonDown(self, event): """Overrides the default on button down method. """ self._interacting = True self._vtk_control.OnButtonDown(event) def OnButtonUp(self, event): self._interacting = False self._vtk_control.OnButtonUp(event) ########################################################################### # 'event' interface. ########################################################################### def _closed_fired(self): super(Scene, self)._closed_fired() self.picker = None self._vtk_control = None ########################################################################### # Non-public interface. ########################################################################### def _create_control(self, parent): """ Create the toolkit-specific control that represents the widget. """ # Create the VTK widget. self._vtk_control = window = wxVTKRenderWindowInteractor(parent, -1, stereo=self.stereo) # Override these handlers. wx.EVT_CHAR(window, None) # Remove the default handler. wx.EVT_CHAR(window, self.OnKeyDown) wx.EVT_KEY_UP(window, None) # Remove the default handler. wx.EVT_KEY_UP(window, self.OnKeyUp) wx.EVT_PAINT(window, None) # Remove the default handler. wx.EVT_PAINT(window, self.OnPaint) wx.EVT_SIZE(window, None) # Remove the default handler. wx.EVT_SIZE(window, self.OnSize) # Override the button down and up handlers as well to note the # interaction. This is to toggle the busy status nicely. for evt in (wx.EVT_LEFT_DOWN, wx.EVT_RIGHT_DOWN, wx.EVT_MIDDLE_DOWN): evt(window, None) evt(window, self.OnButtonDown) for evt in (wx.EVT_LEFT_UP, wx.EVT_RIGHT_UP, wx.EVT_MIDDLE_UP): evt(window, None) evt(window, self.OnButtonUp) # Enable the widget. window.Enable(1) # Switch the default interaction style to the trackball one. window.GetInteractorStyle().SetCurrentStyleToTrackballCamera() # Grab the renderwindow. renwin = self._renwin = tvtk.to_tvtk(window.GetRenderWindow()) renwin.set(point_smoothing=self.point_smoothing, line_smoothing=self.line_smoothing, polygon_smoothing=self.polygon_smoothing) # Create a renderer and add it to the renderwindow self._renderer = tvtk.Renderer() renwin.add_renderer(self._renderer) # Save a reference to our camera so it is not GC'd -- needed for # the sync_traits to work. self._camera = self.camera # Sync various traits. self._renderer.background = self.background self.sync_trait('background', self._renderer) self.renderer.on_trait_change(self.render, 'background') self._camera.parallel_projection = self.parallel_projection self.sync_trait('parallel_projection', self._camera) renwin.off_screen_rendering = self.off_screen_rendering self.sync_trait('off_screen_rendering', self._renwin) self.render_window.on_trait_change(self.render, 'off_screen_rendering') self.render_window.on_trait_change(self.render, 'stereo_render') self.render_window.on_trait_change(self.render, 'stereo_type') self.camera.on_trait_change(self.render, 'parallel_projection') def _show_parent_hack(window, parent): """A hack to get the VTK scene properly setup for use.""" # Force the parent to show itself. parent.Show(1) # on some platforms, this SetSize() is necessary to cause # an OnPaint() when the event loop begins; else we get an # empty window until we force a redraw. window.SetSize(parent.GetSize()) # This is necessary on slow machines in order to force the # wx events to be handled. wx.GetApp().Yield(True) window.Render() if wx.Platform == '__WXMSW__': _show_parent_hack(window, parent) else: if (wx.VERSION[0] == 2) and (wx.VERSION[1] < 5): _show_parent_hack(window, parent) window.Update() # Because of the way the VTK widget is setup, and because we # set the size above, the window sizing is usually completely # messed up when the application window is shown. To work # around this a dynamic IDLE event handler is added and # immediately removed once it executes. This event handler # simply forces a resize to occur. The _idle_count allows us # to execute the idle function a few times (this seems to work # better). def _do_idle(event, window=window): w = wx.GetTopLevelParent(window) # Force a resize sz = w.GetSize() w.SetSize((sz[0]-1, sz[1]-1)) w.SetSize(sz) window._idle_count -= 1 if window._idle_count < 1: wx.EVT_IDLE(window, None) del window._idle_count window._idle_count = 2 wx.EVT_IDLE(window, _do_idle) self._interactor = tvtk.to_tvtk(window._Iren) return window def _lift(self): """Lift the window to the top. Useful when saving screen to an image.""" if self.render_window.off_screen_rendering: # Do nothing if off screen rendering is being used. return w = self._vtk_control while w and not w.IsTopLevel(): w = w.GetParent() if w: w.Raise() wx.GetApp().Yield(True) self.render() def _start_event_callback(self, obj, event): if self._interacting: return else: self.busy = True def _end_event_callback(self, obj, event): if self._interacting: return else: self.busy = False def _busy_changed(self, val): GUI.set_busy(val) def _full_screen_fired(self): fs = self._fullscreen if isinstance(fs, PopupScene): fs.close() self._fullscreen = None elif fs is None: ver = tvtk.Version() popup = False if wx.Platform == '__WXMSW__': popup = True elif ver.vtk_major_version > 5: popup = True elif (ver.vtk_major_version == 5) and \ ((ver.vtk_minor_version >= 1) or \ (ver.vtk_build_version > 2)): popup = True if popup: # There is a bug with earlier versions of VTK that # breaks reparenting a window which is why we test for # the version above. f = PopupScene(self) self._fullscreen = f f.fullscreen() else: f = FullScreen(self) f.run() # This will block. self._fullscreen = None def _disable_fullscreen(self): fs = self._fullscreen if isinstance(fs, PopupScene): fs.close() self._fullscreen = None mayavi-4.5.0/tvtk/pyface/ui/wx/scene_editor.py0000644000076500000240000002275312747716314021766 0ustar prabhustaff00000000000000#------------------------------------------------------------------------------ # # Copyright (c) 2007, Enthought, Inc. # All rights reserved. # # This software is provided without warranty under the terms of the BSD # license included in enthought/LICENSE.txt and may be redistributed only # under the conditions described in the aforementioned license. The license # is also available online at http://www.enthought.com/licenses/BSD.txt # # Thanks for using Enthought open source! # # Authors: Prabhu Ramachandran # Robert Kern # #------------------------------------------------------------------------------ """ A `SceneEditor` for the `SceneModel`. """ import wx # Enthought library imports. from traits.api import Any, Bool, Callable from traitsui.wx.editor import Editor from traitsui.basic_editor_factory import BasicEditorFactory from .decorated_scene import DecoratedScene ##################################################################### # `_SceneEditor` class ##################################################################### class _SceneEditor(Editor): """ An editor for SceneModels. """ # The editor is scrollable, so override the default. scrollable = Bool(True) # Internal GUI traits. _sizer = Any() _scene = Any() #### Public 'Editor' interface ############################################# def init(self, parent): """ Finishes initializing the editor by creating the underlying toolkit widget. """ factory = self.factory self.control = wx.Panel(parent, -1) self._sizer = wx.BoxSizer(wx.VERTICAL) self.control.SetSizer(self._sizer) assert self.value.scene_editor is None, \ "The SceneModel may only have one active editor!" self._create_scene() self.value.activated = True def update_editor(self): """ Updates the editor when the object trait changes external to the editor. """ # Everything should really be handled elsewhere in trait notifications. # Just pass here. pass def dispose(self): """ Disposes of the contents of an editor. """ # Remove notifications. self.value.closing = True self.value.scene_editor = None self._setup_scene_notifications(remove=True) # Remove the current scene. if self._scene is not None: self._scene.close() self._scene = None self._sizer = None # This will destroy self.control and all of its children, including the # scene's control. super(_SceneEditor, self).dispose() #### Private '_SceneEditor' interface ################################## def _create_scene(self): """ Create the TVTK scene widget. """ factory = self.factory self._scene = factory.scene_class(self.control) scene = self._scene self.value.scene_editor = scene # Disable rendering on the scene until we're finished. scene.disable_render = True # Add all of the actors in the current actor map. for obj, actors in self.value.actor_map.items(): self._add_actors_widgets(actors) # Add all of the actors in the current actor map. self._add_actors_widgets(self.value.actor_list) # Set up Traits notifications. self._setup_scene_notifications() # Re-enable rendering. scene.disable_render = False # Ensure the scene's wx control is sized to fill our view's area. Note # that the sizer doesn't automatically layout its contents upon adding # a new child so we have to force it to do a layout. self._sizer.Add(scene.control, 1, wx.EXPAND) self._sizer.Layout() wx.EVT_IDLE(scene.control, None) # Force a render. scene.render() def _setup_scene_notifications(self, remove=False): """ Set up or remove all of the Trait notifications that control the scene widget. """ traits_to_sync = ['foreground', 'anti_aliasing_frames', 'stereo', 'background', 'off_screen_rendering', 'polygon_smoothing', 'jpeg_progressive', 'point_smoothing', 'busy', 'disable_render', 'magnification', 'jpeg_quality', 'parallel_projection', 'line_smoothing'] model = self.value scene = self._scene if not remove: scene.set(**model.get(traits_to_sync)) for trait in traits_to_sync: scene.sync_trait(trait, model, mutual=True, remove=remove) model.on_trait_change( scene.render, name='do_render', remove=remove, ) model.on_trait_change( self._actors_changed, name='actor_map_items', remove=remove, ) model.on_trait_change( self._actor_map_changed, name='actor_map', remove=remove, ) model.on_trait_change( self._actor_list_items_changed, name='actor_list_items', remove=remove, ) model.on_trait_change( self._actor_list_changed, name='actor_list', remove=remove, ) def _actors_changed(self, event): """ Handle the event of the actors in the actor map changing. """ scene = self._scene # Temporarily turn off rendering. We (re)store the old value of # disable_render because it may already be True. old_disable_render = scene.disable_render scene.disable_render = True try: for obj, actors in event.removed.items(): self._remove_actors_widgets(actors) for obj, actors in event.added.items(): self._add_actors_widgets(actors) for obj, actors in event.changed.items(): # The actors in the event are the old ones. Grab the new ones # from the actor map itself. self._remove_actors_widgets(actors) self._add_actors_widgets(self.value.actor_map[obj]) finally: scene.disable_render = old_disable_render scene.render() def _actor_map_changed(self, object, name, old, new): """ Handle the case when the entire actor map is set to something else. """ scene = self._scene # Temporarily turn off rendering. We (re)store the old value of # disable_render because it may already be True. old_disable_render = scene.disable_render scene.disable_render = True try: for obj, actors in old.items(): self._remove_actors_widgets(actors) for obj, actors in new.items(): self._add_actors_widgets(actors) finally: scene.disable_render = old_disable_render scene.render() def _actor_list_items_changed(self, event): self._actor_list_changed(self.value, 'actor_list', event.removed, event.added) def _actor_list_changed(self, object, name, old, new): """ Handle the event of the actors in the actor map changing. """ scene = self._scene # Temporarily turn off rendering. We (re)store the old value of # disable_render because it may already be True. old_disable_render = scene.disable_render scene.disable_render = True try: self._remove_actors_widgets(old) self._add_actors_widgets(new) finally: scene.disable_render = old_disable_render scene.render() def _separate_actors_widgets(self, actors_widgets): """Given a sequence (or single) of actors or widgets, this returns a list of just the actors and another of just the widgets. """ if not hasattr(actors_widgets, '__getitem__'): actors_widgets = [actors_widgets] actors = [] widgets = [] for actor in actors_widgets: if actor.is_a('vtk3DWidget') or actor.is_a('vtkInteractorObserver'): widgets.append(actor) else: actors.append(actor) return actors, widgets def _add_actors_widgets(self, actors_widgets): """Add actors and widgets to scene.""" scene = self._scene actors, widgets = self._separate_actors_widgets(actors_widgets) scene.add_actors(actors) enabled_info = self.value.enabled_info for widget in widgets: scene.add_widgets(widget, enabled_info.get(widget, True)) def _remove_actors_widgets(self, actors_widgets): """Remove actors and widgets from scene.""" scene = self._scene actors, widgets = self._separate_actors_widgets(actors_widgets) scene.remove_actors(actors) scene.remove_widgets(widgets) ##################################################################### # `SceneEditor` class ##################################################################### class SceneEditor(BasicEditorFactory): """ A TraitsUI editor factory for SceneModel instances. """ # The class of the editor object to be constructed. klass = _SceneEditor # The class or factory function for creating the actual scene object. scene_class = Callable(DecoratedScene) #### EOF ####################################################################### mayavi-4.5.0/tvtk/pyface/ui/wx/wxVTKRenderWindowInteractor.py0000644000076500000240000000031112747716314024713 0ustar prabhustaff00000000000000# Simply import the VTK code instead of maintaing another copy. # If there are additions that are needed here, they should be sent upstream # into VTK. from vtk.wx.wxVTKRenderWindowInteractor import * mayavi-4.5.0/tvtk/pyface/utils.py0000644000076500000240000000261112747716314017377 0ustar prabhustaff00000000000000""" Collection of utility functions common to different toolkits. """ def popup_save(parent=None): """Popup a dialog asking for an image name to save the scene to. This is used mainly to save a scene in full screen mode. Returns a filename, returns empty string if action was cancelled. `parent` is the parent widget over which the dialog will be popped up. """ from pyface.api import FileDialog, OK extensions = ['*.png', '*.jpg', '*.tiff', '*.bmp', '*.ps', '*.eps', '*.pdf', '*.tex', '*.rib', '*.wrl', '*.oogl', '*.vrml', '*.obj', '*.iv', '*.pov', '*.x3d'] descriptions = ["PNG", "JPG", "TIFF", "Bitmap", "PostScript", "EPS", "PDF", "Tex", "RIB", "WRL", "Geomview", "VRML", "Wavefront", "Open Inventor", "Povray", "X3D"] wildcard = "" for description, extension in zip(descriptions, extensions): wildcard += "{} ({})|{}|".format(description, extension, extension) wildcard += "Determine by extension (*.*)|(*.*)" dialog = FileDialog( parent=parent, title='Save scene to image', action='save as', default_filename="snapshot.png", wildcard=wildcard ) if dialog.open() == OK: return dialog.path else: return '' mayavi-4.5.0/tvtk/setup.py0000755000076500000240000000517612747716314016144 0ustar prabhustaff00000000000000#!/usr/bin/env python # Setup script for TVTK, numpy.distutils based. # # from __future__ import print_function import os, sys def configuration(parent_package=None, top_path=None): from os.path import join from numpy.distutils.misc_util import Configuration config = Configuration('tvtk',parent_package,top_path) config.set_options(ignore_setup_xxx_py=True, assume_default_configuration=True, delegate_options_to_subpackages=True, quiet=True) config.add_subpackage('custom') config.add_subpackage('pipeline') config.add_data_dir('pipeline/images') config.add_data_dir('pyface/images') config.add_data_dir('tools/images') config.add_subpackage('plugins') config.add_subpackage('plugins.*') config.add_subpackage('tools') config.add_subpackage('util') config.add_subpackage('tests') # Numpy support. config.add_extension('array_ext', sources = [join('src','array_ext.c')], depends = [join('src','array_ext.pyx')], ) tvtk_classes_zip_depends = config.paths( 'code_gen.py','wrapper_gen.py', 'special_gen.py', 'tvtk_base.py', 'indenter.py', 'vtk_parser.py') return config def gen_tvtk_classes_zip(): MY_DIR = os.path.dirname(__file__) sys.path.append(MY_DIR) from tvtk.code_gen import TVTKGenerator target = os.path.join(MY_DIR, 'tvtk_classes.zip') output_dir = os.path.dirname(target) try: os.mkdir(output_dir) except: pass print('-'*70) if os.path.exists(target): print('Deleting possibly old TVTK classes') os.unlink(target) print("Building TVTK classes...", end=' ') sys.stdout.flush() cwd = os.getcwd() os.chdir(output_dir) gen = TVTKGenerator('') gen.generate_code() gen.build_zip(True) os.chdir(cwd) print("Done.") print('-'*70) sys.path.remove(MY_DIR) def vtk_version_changed(zipfile): """Checks the ZIP file's VTK build version versus the current installed version of VTK and returns `True` if the versions are different. """ result = True if os.path.exists(zipfile): import vtk vtk_version = vtk.vtkVersion().GetVTKVersion()[:3] sys.path.append(zipfile) try: from tvtk_classes.vtk_version import vtk_build_version except ImportError: result = True else: if vtk_version != vtk_build_version: result = True else: result = False sys.path.pop() return result mayavi-4.5.0/tvtk/special_gen.py0000644000076500000240000004470412747716314017252 0ustar prabhustaff00000000000000"""This module defines classes used in tvtk code generation, `SpecialGenerator` defines methods that write out special code for some of the VTK classes. `HelperGenerator` helps generate the `tvtk_helper.py` class. """ # Author: Prabhu Ramachandran # Copyright (c) 2004-2007, Enthought, Inc. # License: BSD Style. import vtk # These are relative imports for good reason. from . import indenter from .common import get_tvtk_name ###################################################################### # `SpecialGenerator` class. ###################################################################### class SpecialGenerator: """Generates special code for some of the TVTK classes. For example vtkMatrix4x4 objects can be pickled nicely if the elements of the matrix are stored and restored. So we define a `_write_Matrix4x4` method that generates the appropriate code. """ def __init__(self, indent): """`indent` is a reference to the `Indenter` instance of the WrapperGenerator. """ self.indent = indent ################################################################# # `SpecialGenerator` interface. ################################################################# def generate_code(self, node, out): """Write the code given the node in the class tree, `node`, and output file-like object, `out`. """ self._write_special(node.name, out) ################################################################# # Non-public interface. ################################################################# def _write_special(self, name, out): """Given the name of the class, call appropriate method, if available. """ tname = get_tvtk_name(name) writer = '_write_%s'%tname if hasattr(self, writer): getattr(self, writer)(out) def _write_InteractorEventRecorder(self, out): # This class is a pain because it must always take highest # priority, the default value is therefore set to a huge # number so that it catches all events first. code = ''' priority = traits.Trait(1.0, traits.Float, traits.Range(0.0, 1.0)) def _priority_changed(self, old_val, new_val): self._do_change(self._vtk_obj.SetPriority, self.priority) priority.help = \ """ Set/Get the priority at which events are processed. This is used when multiple interactor observers are used simultaneously. The default value is 0.0 (lowest priority.) Note that when multiple interactor observer have the same priority, then the last observer added will process the event first. (Note: once the set_interactor() method has been called, changing the priority does not effect event processing. You will have to set_interactor(_null), change priority, and then set_interactor(iren) to have the priority take effect.) """ ''' out.write(self.indent.format(code)) def _write_Matrix4x4(self, out): code = """ def __getstate__(self): d = tvtk_base.TVTKBase.__getstate__(self) obj = self._vtk_obj e = [obj.GetElement(i, j) for i in range(4) for j in range(4)] d['elements'] = e return d def __setstate__(self, dict): e = dict.pop('elements') tvtk_base.TVTKBase.__setstate__(self, dict) self._in_set = 1 obj = self._vtk_obj [obj.SetElement(i, j, e[4*i+j]) for i in range(4) for j in range(4)] self._in_set = 0 self.update_traits() def from_array(self, arr): '''Set the value of the matrix using the passed Numeric array or Python list. ''' obj = self._vtk_obj [obj.SetElement(i, j, arr[i,j]) for i in range(4) for j in range(4)] def to_array(self): '''Return the object as a numpy array.''' obj = self._vtk_obj e = [obj.GetElement(i, j) for i in range(4) for j in range(4)] arr = array_handler.numpy.array(e, dtype=float) arr.shape = (4,4) return arr """ out.write(self.indent.format(code)) def _write_Property(self, out): # Color is made from the other specified colors. code = """ def __getstate__(self): d = tvtk_base.TVTKBase.__getstate__(self) if 'color' in d: del d['color'] return d def __setstate__(self, dict): tvtk_base.TVTKBase.__setstate__(self, dict) self.update_traits() """ out.write(self.indent.format(code)) _write_Light = _write_Property def _write_Collection(self, out): code = """ def __len__(self): return self._vtk_obj.GetNumberOfItems() def __iter__(self): self._vtk_obj.InitTraversal() return self def next(self): try: val = self._vtk_obj.GetNextItem() except AttributeError: val = self._vtk_obj.GetNextProp() if val is None: raise StopIteration return wrap_vtk(val) __next__ = next def __getitem__(self, key): obj = self._vtk_obj if type(key) != type(1): raise TypeError("Only integers are valid keys.") ni = obj.GetNumberOfItems() if key < 0: key = ni + key ret = obj.GetItemAsObject(key) if ret is None: raise IndexError("Index %s out of range."%key) return wrap_vtk(ret) def __setitem__(self, key, val): obj = self._vtk_obj if type(key) != type(1): raise TypeError("Only integers are valid keys.") ni = obj.GetNumberOfItems() if key < 0: key = ni + key if key < 0 or key >= ni: raise IndexError("Index out of range.") obj.ReplaceItem(key, deref_vtk(val)) def __delitem__(self, key): obj = self._vtk_obj if type(key) != type(1): raise TypeError("Only integers are valid keys.") ni = obj.GetNumberOfItems() if key < 0: key = ni + key if key < 0 or key >= ni: raise IndexError("Index %s out of range."%key) obj.RemoveItem(key) def __repr__(self): return repr([repr(x) for x in self]) def append(self, val): self._vtk_obj.AddItem(deref_vtk(val)) def extend(self, arr): obj = self._vtk_obj for i in arr: obj.AddItem(deref_vtk(i)) """ out.write(self.indent.format(code)) def _write_DataArray(self, out): code = """ def __len__(self): return self._vtk_obj.GetNumberOfTuples() def __iter__(self): obj = self._vtk_obj n = obj.GetNumberOfTuples() nc = obj.GetNumberOfComponents() if nc in [1,2,3,4,9]: meth = getattr(obj, 'GetTuple%d'%nc) for i in range(n): yield meth(i) else: for i in range(n): yield tuple([obj.GetComponent(i, x) for x in range(nc)]) def _check_key(self, key, n): if type(key) not in [int, long]: raise TypeError("Only integers are valid keys.") if key < 0: key = n + key if key < 0 or key >= n: raise IndexError("Index %s out of range."%key) return key def __getitem__(self, key): obj = self._vtk_obj n = obj.GetNumberOfTuples() key = self._check_key(key, n) nc = obj.GetNumberOfComponents() if nc in [1,2,3,4,9]: return getattr(obj, 'GetTuple%d'%nc)(key) else: return tuple([obj.GetComponent(key, x) for x in range(nc)]) def __setitem__(self, key, val): obj = self._vtk_obj n = obj.GetNumberOfTuples() key = self._check_key(key, n) nc = obj.GetNumberOfComponents() if nc == 1: obj.SetValue(key, val) elif nc in [2,3,4,9]: getattr(obj, 'SetTuple%d'%nc)(key, *val) else: assert len(val) == nc, \ 'length of %s != %s.'%(val, nc) for x in range(nc): obj.SetComponent(key, x, val[x]) def __repr__(self): obj = self._vtk_obj n = obj.GetNumberOfTuples() if n <= 10: return repr([x for x in self]) else: first, last = self[0], self[-1] return '[%s, ..., %s], length = %s'%(first, last, n) def append(self, val): obj = self._vtk_obj nc = obj.GetNumberOfComponents() if nc == 1: obj.InsertNextTuple1(val) elif nc in [2,3,4,9]: meth = getattr(obj, 'InsertNextTuple%d'%nc) meth(*val) else: n = obj.GetNumberOfTuples() for x in range(nc): obj.InsertComponent(n, x, val[x]) self.update_traits() def extend(self, arr): obj = self._vtk_obj nc = obj.GetNumberOfComponents() if nc == 1: for i in arr: obj.InsertNextTuple1(i) elif nc in [2,3,4,9]: meth = getattr(obj, 'InsertNextTuple%d'%nc) for i in arr: meth(*i) else: n = obj.GetNumberOfTuples() for i in range(len(arr)): for x in range(nc): obj.InsertComponent(n+i, x, arr[i][x]) self.update_traits() def from_array(self, arr): '''Set the value of the data array using the passed Numeric array or Python list. This is implemented efficiently. ''' array_handler.array2vtk(arr, self._vtk_obj) self.update_traits() def to_array(self): '''Return the object as a Numeric array.''' return array_handler.vtk2array(self._vtk_obj) """ out.write(self.indent.format(code)) def _write_Points(self, out): code = """ def __len__(self): return self._vtk_obj.GetNumberOfPoints() def __iter__(self): obj = self._vtk_obj n = obj.GetNumberOfPoints() for i in range(n): yield obj.GetPoint(i) def _check_key(self, key, n): ############################################## # Allow int and long keys. Fixes GH Issue 173. ############################################## if not isinstance(key, (int, long)): raise TypeError("Only int and long are valid keys.") if key < 0: key = n + key if key < 0 or key >= n: raise IndexError("Index %s out of range."%key) return key def __getitem__(self, key): obj = self._vtk_obj n = obj.GetNumberOfPoints() key = self._check_key(key, n) return obj.GetPoint(key) def __setitem__(self, key, val): obj = self._vtk_obj n = obj.GetNumberOfPoints() key = self._check_key(key, n) obj.SetPoint(key, val) def __repr__(self): obj = self._vtk_obj n = obj.GetNumberOfPoints() if n <= 10: return repr([x for x in self]) else: meth = obj.GetPoint return '[%s, ..., %s], length = %s'%(meth(0), meth(n-1), n) def append(self, val): self._vtk_obj.InsertNextPoint(val) self.update_traits() def extend(self, arr): obj = self._vtk_obj for i in arr: obj.InsertNextPoint(i) self.update_traits() def from_array(self, arr): '''Set the value of the data array using the passed Numeric array or Python list. This is implemented efficiently. ''' array_handler.array2vtkPoints(arr, self._vtk_obj) self.update_traits() def to_array(self): '''Return the object as a Numeric array.''' return array_handler.vtk2array(self._vtk_obj.GetData()) """ out.write(self.indent.format(code)) def _write_IdList(self, out): code = """ def __len__(self): return self._vtk_obj.GetNumberOfIds() def __iter__(self): obj = self._vtk_obj n = obj.GetNumberOfIds() for i in range(n): yield obj.GetId(i) def _check_key(self, key, n): if type(key) != type(1): raise TypeError("Only integers are valid keys.") if key < 0: key = n + key if key < 0 or key >= n: raise IndexError("Index %s out of range."%key) return key def __getitem__(self, key): obj = self._vtk_obj n = obj.GetNumberOfIds() key = self._check_key(key, n) return obj.GetId(key) def __setitem__(self, key, val): obj = self._vtk_obj n = obj.GetNumberOfIds() key = self._check_key(key, n) obj.SetId(key, val) def __repr__(self): obj = self._vtk_obj n = obj.GetNumberOfIds() if n <= 10: return repr([x for x in self]) else: meth = obj.GetId return '[%s, ..., %s], length = %s'%(meth(0), meth(n-1), n) def append(self, val): self._vtk_obj.InsertNextId(val) self.update_traits() def extend(self, arr): obj = self._vtk_obj for i in arr: obj.InsertNextId(i) self.update_traits() def from_array(self, arr): '''Set the value of the data array using the passed Numeric array or Python list. This is implemented efficiently. ''' array_handler.array2vtkIdList(arr, self._vtk_obj) self.update_traits() """ out.write(self.indent.format(code)) def _write_CellArray(self, out): code = """ def from_array(self, arr): '''Set the value of the data array using the passed Numeric array or Python list. This is implemented efficiently. ''' array_handler.array2vtkCellArray(arr, self._vtk_obj) self.update_traits() def to_array(self): '''Return the object as a Numeric array.''' return array_handler.vtk2array(self._vtk_obj.GetData()) """ out.write(self.indent.format(code)) ###################################################################### # `HelperGenerator` class. ###################################################################### class HelperGenerator: """Writes out the tvtk_helper.py file that makes it easy to use tvtk objects efficiently. """ def __init__(self): self.indent = indenter.Indent() ################################################################# # `HelperGenerator` interface. ################################################################# def write_prelims(self, out): """ Write out the preliminary data.""" indent = self.indent v = vtk.vtkVersion() vtk_version = v.GetVTKVersion()[:3] vtk_src_version = v.GetVTKSourceVersion() code = """ import vtk from tvtk import tvtk_base from tvtk.common import get_tvtk_name, camel2enthought # Caches all the classes. _cache = {} def set_ancestors(klass): tmp = klass.__bases__ if not tmp: return # Assuming a single inheritance. tmp = tmp[0] name = tmp.__name__ while name not in _cache and \ name not in ['TVTKBase', 'object']: _cache[name] = tmp tmp = tmp.__bases__[0] name = tmp.__name__ def get_module(fname): try: mod = __import__('tvtk.custom.%%s'%%fname, globals(), locals(), [fname]) except ImportError: # This is a local import since the tvtk modules are all # inside the tvtk_classes ZIP file and are local to the # current module: tvtk_helper.py mod = __import__('tvtk.tvtk_classes.%%s'%%fname, globals(), locals(), [fname]) return mod def get_class(name): if name in _cache: return _cache[name] else: fname = camel2enthought(name) mod = get_module(fname) klass = getattr(mod, name) _cache[name] = klass set_ancestors(klass) return klass def wrap_vtk(obj): if isinstance(obj, tvtk_base.TVTKBase): return obj elif isinstance(obj, vtk.vtkObjectBase): cached_obj = tvtk_base.get_tvtk_object_from_cache(obj) if cached_obj is not None: return cached_obj cname = get_tvtk_name(obj.__class__.__name__) tvtk_class = get_class(cname) return tvtk_class(obj) else: return obj class TVTK(object): to_tvtk = staticmethod(wrap_vtk) to_vtk = staticmethod(tvtk_base.deref_vtk) """%locals() out.write(indent.format(code)) indent.incr() def add_class(self, name, out): """Add a tvtk class with name, `name` as a property to the helper class output file-like object, `out`. """ code = """ %(name)s = property(lambda self: get_class('%(name)s')) """%locals() out.write(self.indent.format(code)) mayavi-4.5.0/tvtk/src/0000755000076500000240000000000012747722127015204 5ustar prabhustaff00000000000000mayavi-4.5.0/tvtk/src/array_ext.c0000644000076500000240000027544012747716314017363 0ustar prabhustaff00000000000000/* Generated by Cython 0.14.1 on Sun Feb 13 21:50:50 2011 */ #define PY_SSIZE_T_CLEAN #include "Python.h" #ifndef Py_PYTHON_H #error Python headers needed to compile C extensions, please install development version of Python. #else #include /* For offsetof */ #ifndef offsetof #define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) #endif #if !defined(WIN32) && !defined(MS_WINDOWS) #ifndef __stdcall #define __stdcall #endif #ifndef __cdecl #define __cdecl #endif #ifndef __fastcall #define __fastcall #endif #endif #ifndef DL_IMPORT #define DL_IMPORT(t) t #endif #ifndef DL_EXPORT #define DL_EXPORT(t) t #endif #ifndef PY_LONG_LONG #define PY_LONG_LONG LONG_LONG #endif #if PY_VERSION_HEX < 0x02040000 #define METH_COEXIST 0 #define PyDict_CheckExact(op) (Py_TYPE(op) == &PyDict_Type) #define PyDict_Contains(d,o) PySequence_Contains(d,o) #endif #if PY_VERSION_HEX < 0x02050000 typedef int Py_ssize_t; #define PY_SSIZE_T_MAX INT_MAX #define PY_SSIZE_T_MIN INT_MIN #define PY_FORMAT_SIZE_T "" #define PyInt_FromSsize_t(z) PyInt_FromLong(z) #define PyInt_AsSsize_t(o) PyInt_AsLong(o) #define PyNumber_Index(o) PyNumber_Int(o) #define PyIndex_Check(o) PyNumber_Check(o) #define PyErr_WarnEx(category, message, stacklevel) PyErr_Warn(category, message) #endif #if PY_VERSION_HEX < 0x02060000 #define Py_REFCNT(ob) (((PyObject*)(ob))->ob_refcnt) #define Py_TYPE(ob) (((PyObject*)(ob))->ob_type) #define Py_SIZE(ob) (((PyVarObject*)(ob))->ob_size) #define PyVarObject_HEAD_INIT(type, size) \ PyObject_HEAD_INIT(type) size, #define PyType_Modified(t) typedef struct { void *buf; PyObject *obj; Py_ssize_t len; Py_ssize_t itemsize; int readonly; int ndim; char *format; Py_ssize_t *shape; Py_ssize_t *strides; Py_ssize_t *suboffsets; void *internal; } Py_buffer; #define PyBUF_SIMPLE 0 #define PyBUF_WRITABLE 0x0001 #define PyBUF_FORMAT 0x0004 #define PyBUF_ND 0x0008 #define PyBUF_STRIDES (0x0010 | PyBUF_ND) #define PyBUF_C_CONTIGUOUS (0x0020 | PyBUF_STRIDES) #define PyBUF_F_CONTIGUOUS (0x0040 | PyBUF_STRIDES) #define PyBUF_ANY_CONTIGUOUS (0x0080 | PyBUF_STRIDES) #define PyBUF_INDIRECT (0x0100 | PyBUF_STRIDES) #endif #if PY_MAJOR_VERSION < 3 #define __Pyx_BUILTIN_MODULE_NAME "__builtin__" #else #define __Pyx_BUILTIN_MODULE_NAME "builtins" #endif #if PY_MAJOR_VERSION >= 3 #define Py_TPFLAGS_CHECKTYPES 0 #define Py_TPFLAGS_HAVE_INDEX 0 #endif #if (PY_VERSION_HEX < 0x02060000) || (PY_MAJOR_VERSION >= 3) #define Py_TPFLAGS_HAVE_NEWBUFFER 0 #endif #if PY_MAJOR_VERSION >= 3 #define PyBaseString_Type PyUnicode_Type #define PyStringObject PyUnicodeObject #define PyString_Type PyUnicode_Type #define PyString_Check PyUnicode_Check #define PyString_CheckExact PyUnicode_CheckExact #endif #if PY_VERSION_HEX < 0x02060000 #define PyBytesObject PyStringObject #define PyBytes_Type PyString_Type #define PyBytes_Check PyString_Check #define PyBytes_CheckExact PyString_CheckExact #define PyBytes_FromString PyString_FromString #define PyBytes_FromStringAndSize PyString_FromStringAndSize #define PyBytes_FromFormat PyString_FromFormat #define PyBytes_DecodeEscape PyString_DecodeEscape #define PyBytes_AsString PyString_AsString #define PyBytes_AsStringAndSize PyString_AsStringAndSize #define PyBytes_Size PyString_Size #define PyBytes_AS_STRING PyString_AS_STRING #define PyBytes_GET_SIZE PyString_GET_SIZE #define PyBytes_Repr PyString_Repr #define PyBytes_Concat PyString_Concat #define PyBytes_ConcatAndDel PyString_ConcatAndDel #endif #if PY_VERSION_HEX < 0x02060000 #define PySet_Check(obj) PyObject_TypeCheck(obj, &PySet_Type) #define PyFrozenSet_Check(obj) PyObject_TypeCheck(obj, &PyFrozenSet_Type) #endif #ifndef PySet_CheckExact #define PySet_CheckExact(obj) (Py_TYPE(obj) == &PySet_Type) #endif #define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type) #if PY_MAJOR_VERSION >= 3 #define PyIntObject PyLongObject #define PyInt_Type PyLong_Type #define PyInt_Check(op) PyLong_Check(op) #define PyInt_CheckExact(op) PyLong_CheckExact(op) #define PyInt_FromString PyLong_FromString #define PyInt_FromUnicode PyLong_FromUnicode #define PyInt_FromLong PyLong_FromLong #define PyInt_FromSize_t PyLong_FromSize_t #define PyInt_FromSsize_t PyLong_FromSsize_t #define PyInt_AsLong PyLong_AsLong #define PyInt_AS_LONG PyLong_AS_LONG #define PyInt_AsSsize_t PyLong_AsSsize_t #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask #endif #if PY_MAJOR_VERSION >= 3 #define PyBoolObject PyLongObject #endif #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y) #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y) #else #define __Pyx_PyNumber_Divide(x,y) PyNumber_Divide(x,y) #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceDivide(x,y) #endif #if (PY_MAJOR_VERSION < 3) || (PY_VERSION_HEX >= 0x03010300) #define __Pyx_PySequence_GetSlice(obj, a, b) PySequence_GetSlice(obj, a, b) #define __Pyx_PySequence_SetSlice(obj, a, b, value) PySequence_SetSlice(obj, a, b, value) #define __Pyx_PySequence_DelSlice(obj, a, b) PySequence_DelSlice(obj, a, b) #else #define __Pyx_PySequence_GetSlice(obj, a, b) (unlikely(!(obj)) ? \ (PyErr_SetString(PyExc_SystemError, "null argument to internal routine"), (PyObject*)0) : \ (likely((obj)->ob_type->tp_as_mapping) ? (PySequence_GetSlice(obj, a, b)) : \ (PyErr_Format(PyExc_TypeError, "'%.200s' object is unsliceable", (obj)->ob_type->tp_name), (PyObject*)0))) #define __Pyx_PySequence_SetSlice(obj, a, b, value) (unlikely(!(obj)) ? \ (PyErr_SetString(PyExc_SystemError, "null argument to internal routine"), -1) : \ (likely((obj)->ob_type->tp_as_mapping) ? (PySequence_SetSlice(obj, a, b, value)) : \ (PyErr_Format(PyExc_TypeError, "'%.200s' object doesn't support slice assignment", (obj)->ob_type->tp_name), -1))) #define __Pyx_PySequence_DelSlice(obj, a, b) (unlikely(!(obj)) ? \ (PyErr_SetString(PyExc_SystemError, "null argument to internal routine"), -1) : \ (likely((obj)->ob_type->tp_as_mapping) ? (PySequence_DelSlice(obj, a, b)) : \ (PyErr_Format(PyExc_TypeError, "'%.200s' object doesn't support slice deletion", (obj)->ob_type->tp_name), -1))) #endif #if PY_MAJOR_VERSION >= 3 #define PyMethod_New(func, self, klass) ((self) ? PyMethod_New(func, self) : PyInstanceMethod_New(func)) #endif #if PY_VERSION_HEX < 0x02050000 #define __Pyx_GetAttrString(o,n) PyObject_GetAttrString((o),((char *)(n))) #define __Pyx_SetAttrString(o,n,a) PyObject_SetAttrString((o),((char *)(n)),(a)) #define __Pyx_DelAttrString(o,n) PyObject_DelAttrString((o),((char *)(n))) #else #define __Pyx_GetAttrString(o,n) PyObject_GetAttrString((o),(n)) #define __Pyx_SetAttrString(o,n,a) PyObject_SetAttrString((o),(n),(a)) #define __Pyx_DelAttrString(o,n) PyObject_DelAttrString((o),(n)) #endif #if PY_VERSION_HEX < 0x02050000 #define __Pyx_NAMESTR(n) ((char *)(n)) #define __Pyx_DOCSTR(n) ((char *)(n)) #else #define __Pyx_NAMESTR(n) (n) #define __Pyx_DOCSTR(n) (n) #endif #ifdef __cplusplus #define __PYX_EXTERN_C extern "C" #else #define __PYX_EXTERN_C extern #endif #if defined(WIN32) || defined(MS_WINDOWS) #define _USE_MATH_DEFINES #endif #include #define __PYX_HAVE_API__array_ext #include "numpy/arrayobject.h" #ifdef PYREX_WITHOUT_ASSERTIONS #define CYTHON_WITHOUT_ASSERTIONS #endif /* inline attribute */ #ifndef CYTHON_INLINE #if defined(__GNUC__) #define CYTHON_INLINE __inline__ #elif defined(_MSC_VER) #define CYTHON_INLINE __inline #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define CYTHON_INLINE inline #else #define CYTHON_INLINE #endif #endif /* unused attribute */ #ifndef CYTHON_UNUSED # if defined(__GNUC__) # if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) # define CYTHON_UNUSED __attribute__ ((__unused__)) # else # define CYTHON_UNUSED # endif # elif defined(__ICC) || defined(__INTEL_COMPILER) # define CYTHON_UNUSED __attribute__ ((__unused__)) # else # define CYTHON_UNUSED # endif #endif typedef struct {PyObject **p; char *s; const long n; const char* encoding; const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; /*proto*/ /* Type Conversion Predeclarations */ #define __Pyx_PyBytes_FromUString(s) PyBytes_FromString((char*)s) #define __Pyx_PyBytes_AsUString(s) ((unsigned char*) PyBytes_AsString(s)) #define __Pyx_PyBool_FromLong(b) ((b) ? (Py_INCREF(Py_True), Py_True) : (Py_INCREF(Py_False), Py_False)) static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); static CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x); static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*); static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t); static CYTHON_INLINE size_t __Pyx_PyInt_AsSize_t(PyObject*); #define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) #ifdef __GNUC__ /* Test for GCC > 2.95 */ #if __GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)) #define likely(x) __builtin_expect(!!(x), 1) #define unlikely(x) __builtin_expect(!!(x), 0) #else /* __GNUC__ > 2 ... */ #define likely(x) (x) #define unlikely(x) (x) #endif /* __GNUC__ > 2 ... */ #else /* __GNUC__ */ #define likely(x) (x) #define unlikely(x) (x) #endif /* __GNUC__ */ static PyObject *__pyx_m; static PyObject *__pyx_b; static PyObject *__pyx_empty_tuple; static PyObject *__pyx_empty_bytes; static int __pyx_lineno; static int __pyx_clineno = 0; static const char * __pyx_cfilenm= __FILE__; static const char *__pyx_filename; static const char *__pyx_f[] = { "array_ext.pyx", }; /* Type declarations */ #ifndef CYTHON_REFNANNY #define CYTHON_REFNANNY 0 #endif #if CYTHON_REFNANNY typedef struct { void (*INCREF)(void*, PyObject*, int); void (*DECREF)(void*, PyObject*, int); void (*GOTREF)(void*, PyObject*, int); void (*GIVEREF)(void*, PyObject*, int); void* (*SetupContext)(const char*, int, const char*); void (*FinishContext)(void**); } __Pyx_RefNannyAPIStruct; static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL; static __Pyx_RefNannyAPIStruct * __Pyx_RefNannyImportAPI(const char *modname) { PyObject *m = NULL, *p = NULL; void *r = NULL; m = PyImport_ImportModule((char *)modname); if (!m) goto end; p = PyObject_GetAttrString(m, (char *)"RefNannyAPI"); if (!p) goto end; r = PyLong_AsVoidPtr(p); end: Py_XDECREF(p); Py_XDECREF(m); return (__Pyx_RefNannyAPIStruct *)r; } #define __Pyx_RefNannySetupContext(name) void *__pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__) #define __Pyx_RefNannyFinishContext() __Pyx_RefNanny->FinishContext(&__pyx_refnanny) #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_XDECREF(r) do { if((r) != NULL) {__Pyx_DECREF(r);} } while(0) #else #define __Pyx_RefNannySetupContext(name) #define __Pyx_RefNannyFinishContext() #define __Pyx_INCREF(r) Py_INCREF(r) #define __Pyx_DECREF(r) Py_DECREF(r) #define __Pyx_GOTREF(r) #define __Pyx_GIVEREF(r) #define __Pyx_XDECREF(r) Py_XDECREF(r) #endif /* CYTHON_REFNANNY */ #define __Pyx_XGIVEREF(r) do { if((r) != NULL) {__Pyx_GIVEREF(r);} } while(0) #define __Pyx_XGOTREF(r) do { if((r) != NULL) {__Pyx_GOTREF(r);} } while(0) static PyObject *__Pyx_GetName(PyObject *dict, PyObject *name); /*proto*/ static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact, Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); /*proto*/ static void __Pyx_RaiseDoubleKeywordsError( const char* func_name, PyObject* kw_name); /*proto*/ static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[], PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, const char* function_name); /*proto*/ static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) { PyObject *r; if (!j) return NULL; r = PyObject_GetItem(o, j); Py_DECREF(j); return r; } #define __Pyx_GetItemInt_List(o, i, size, to_py_func) (((size) <= sizeof(Py_ssize_t)) ? \ __Pyx_GetItemInt_List_Fast(o, i) : \ __Pyx_GetItemInt_Generic(o, to_py_func(i))) static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i) { if (likely(o != Py_None)) { if (likely((0 <= i) & (i < PyList_GET_SIZE(o)))) { PyObject *r = PyList_GET_ITEM(o, i); Py_INCREF(r); return r; } else if ((-PyList_GET_SIZE(o) <= i) & (i < 0)) { PyObject *r = PyList_GET_ITEM(o, PyList_GET_SIZE(o) + i); Py_INCREF(r); return r; } } return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); } #define __Pyx_GetItemInt_Tuple(o, i, size, to_py_func) (((size) <= sizeof(Py_ssize_t)) ? \ __Pyx_GetItemInt_Tuple_Fast(o, i) : \ __Pyx_GetItemInt_Generic(o, to_py_func(i))) static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i) { if (likely(o != Py_None)) { if (likely((0 <= i) & (i < PyTuple_GET_SIZE(o)))) { PyObject *r = PyTuple_GET_ITEM(o, i); Py_INCREF(r); return r; } else if ((-PyTuple_GET_SIZE(o) <= i) & (i < 0)) { PyObject *r = PyTuple_GET_ITEM(o, PyTuple_GET_SIZE(o) + i); Py_INCREF(r); return r; } } return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); } #define __Pyx_GetItemInt(o, i, size, to_py_func) (((size) <= sizeof(Py_ssize_t)) ? \ __Pyx_GetItemInt_Fast(o, i) : \ __Pyx_GetItemInt_Generic(o, to_py_func(i))) static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i) { PyObject *r; if (PyList_CheckExact(o) && ((0 <= i) & (i < PyList_GET_SIZE(o)))) { r = PyList_GET_ITEM(o, i); Py_INCREF(r); } else if (PyTuple_CheckExact(o) && ((0 <= i) & (i < PyTuple_GET_SIZE(o)))) { r = PyTuple_GET_ITEM(o, i); Py_INCREF(r); } else if (Py_TYPE(o)->tp_as_sequence && Py_TYPE(o)->tp_as_sequence->sq_item && (likely(i >= 0))) { r = PySequence_GetItem(o, i); } else { r = __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); } return r; } static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type); /*proto*/ static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb); /*proto*/ static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb); /*proto*/ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb); /*proto*/ static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list); /*proto*/ static CYTHON_INLINE unsigned char __Pyx_PyInt_AsUnsignedChar(PyObject *); static CYTHON_INLINE unsigned short __Pyx_PyInt_AsUnsignedShort(PyObject *); static CYTHON_INLINE unsigned int __Pyx_PyInt_AsUnsignedInt(PyObject *); static CYTHON_INLINE char __Pyx_PyInt_AsChar(PyObject *); static CYTHON_INLINE short __Pyx_PyInt_AsShort(PyObject *); static CYTHON_INLINE int __Pyx_PyInt_AsInt(PyObject *); static CYTHON_INLINE signed char __Pyx_PyInt_AsSignedChar(PyObject *); static CYTHON_INLINE signed short __Pyx_PyInt_AsSignedShort(PyObject *); static CYTHON_INLINE signed int __Pyx_PyInt_AsSignedInt(PyObject *); static CYTHON_INLINE int __Pyx_PyInt_AsLongDouble(PyObject *); static CYTHON_INLINE unsigned long __Pyx_PyInt_AsUnsignedLong(PyObject *); static CYTHON_INLINE unsigned PY_LONG_LONG __Pyx_PyInt_AsUnsignedLongLong(PyObject *); static CYTHON_INLINE long __Pyx_PyInt_AsLong(PyObject *); static CYTHON_INLINE PY_LONG_LONG __Pyx_PyInt_AsLongLong(PyObject *); static CYTHON_INLINE signed long __Pyx_PyInt_AsSignedLong(PyObject *); static CYTHON_INLINE signed PY_LONG_LONG __Pyx_PyInt_AsSignedLongLong(PyObject *); static PyTypeObject *__Pyx_ImportType(const char *module_name, const char *class_name, long size, int strict); /*proto*/ static PyObject *__Pyx_ImportModule(const char *name); /*proto*/ static void __Pyx_AddTraceback(const char *funcname); /*proto*/ static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); /*proto*/ /* Module declarations from numpy */ /* Module declarations from array_ext */ static PyTypeObject *__pyx_ptype_9array_ext_ndarray = 0; static PyObject *__pyx_f_9array_ext_c_set_id_type_array(PyArrayObject *, PyArrayObject *); /*proto*/ static PyObject *__pyx_f_9array_ext_c_set_id_type_array_long(PyArrayObject *, PyArrayObject *); /*proto*/ #define __Pyx_MODULE_NAME "array_ext" static int __pyx_module_is_main_array_ext = 0; /* Implementation of array_ext */ static PyObject *__pyx_builtin_ValueError; static char __pyx_k_1[] = "out_array must be contiguous."; static char __pyx_k_2[] = "id_array must be a two dimensional array."; static char __pyx_k_3[] = "out_array size is incorrect, expected: %s, given: %s"; static char __pyx_k_4[] = "Unsupported VTK_ID_TYPE_SIZE=%d"; static char __pyx_k_5[] = "\nA Pyrex extension module for numpy. Currently this extension module\nallows us to massage a 2D scipy array into a form usable as a\n`vtkIdTypeArray`. This is then used to set the cells of a\n`vtkCellArray` instance.\n"; static char __pyx_k__vtk[] = "vtk"; static char __pyx_k__data[] = "data"; static char __pyx_k__size[] = "size"; static char __pyx_k__dtype[] = "dtype"; static char __pyx_k__flags[] = "flags"; static char __pyx_k__numpy[] = "numpy"; static char __pyx_k__shape[] = "shape"; static char __pyx_k__strides[] = "strides"; static char __pyx_k____main__[] = "__main__"; static char __pyx_k____test__[] = "__test__"; static char __pyx_k__id_array[] = "id_array"; static char __pyx_k__itemsize[] = "itemsize"; static char __pyx_k__array_ext[] = "array_ext"; static char __pyx_k__out_array[] = "out_array"; static char __pyx_k__ValueError[] = "ValueError"; static char __pyx_k__contiguous[] = "contiguous"; static char __pyx_k__dimensions[] = "dimensions"; static char __pyx_k__issubdtype[] = "issubdtype"; static char __pyx_k__signedinteger[] = "signedinteger"; static char __pyx_k__vtkIdTypeArray[] = "vtkIdTypeArray"; static char __pyx_k__GetDataTypeSize[] = "GetDataTypeSize"; static char __pyx_k__set_id_type_array[] = "set_id_type_array"; static PyObject *__pyx_kp_s_1; static PyObject *__pyx_kp_s_2; static PyObject *__pyx_kp_s_3; static PyObject *__pyx_kp_s_4; static PyObject *__pyx_n_s__GetDataTypeSize; static PyObject *__pyx_n_s__ValueError; static PyObject *__pyx_n_s____main__; static PyObject *__pyx_n_s____test__; static PyObject *__pyx_n_s__array_ext; static PyObject *__pyx_n_s__contiguous; static PyObject *__pyx_n_s__data; static PyObject *__pyx_n_s__dimensions; static PyObject *__pyx_n_s__dtype; static PyObject *__pyx_n_s__flags; static PyObject *__pyx_n_s__id_array; static PyObject *__pyx_n_s__issubdtype; static PyObject *__pyx_n_s__itemsize; static PyObject *__pyx_n_s__numpy; static PyObject *__pyx_n_s__out_array; static PyObject *__pyx_n_s__set_id_type_array; static PyObject *__pyx_n_s__shape; static PyObject *__pyx_n_s__signedinteger; static PyObject *__pyx_n_s__size; static PyObject *__pyx_n_s__strides; static PyObject *__pyx_n_s__vtk; static PyObject *__pyx_n_s__vtkIdTypeArray; static PyObject *__pyx_int_1; static PyObject *__pyx_int_4; static PyObject *__pyx_int_8; /* "array_ext.pyx":43 * ###################################################################### * * cdef c_set_id_type_array(ndarray id_array, ndarray out_array): # <<<<<<<<<<<<<< * # This function sets the data of the passed 2D `id_array` into the * # passed out_array such that out_array can be used as a */ static PyObject *__pyx_f_9array_ext_c_set_id_type_array(PyArrayObject *__pyx_v_id_array, PyArrayObject *__pyx_v_out_array) { int __pyx_v_cell_length; int __pyx_v_dim0; int *__pyx_v_id_data; int *__pyx_v_out_data; int __pyx_v_stride0; int __pyx_v_stride1; int __pyx_v_i; int __pyx_v_j; int __pyx_v_in_idx; int __pyx_v_out_idx; PyObject *__pyx_r = NULL; size_t __pyx_t_1; int __pyx_t_2; int __pyx_t_3; __Pyx_RefNannySetupContext("c_set_id_type_array"); /* "array_ext.pyx":58 * cdef int stride0, stride1 * * cell_length = id_array.dimensions[1]; # <<<<<<<<<<<<<< * dim0 = id_array.dimensions[0] * id_data = id_array.data */ __pyx_v_cell_length = (__pyx_v_id_array->dimensions[1]); /* "array_ext.pyx":59 * * cell_length = id_array.dimensions[1]; * dim0 = id_array.dimensions[0] # <<<<<<<<<<<<<< * id_data = id_array.data * out_data = out_array.data */ __pyx_v_dim0 = (__pyx_v_id_array->dimensions[0]); /* "array_ext.pyx":60 * cell_length = id_array.dimensions[1]; * dim0 = id_array.dimensions[0] * id_data = id_array.data # <<<<<<<<<<<<<< * out_data = out_array.data * stride0 = id_array.strides[0]/sizeof(int) */ __pyx_v_id_data = ((int *)__pyx_v_id_array->data); /* "array_ext.pyx":61 * dim0 = id_array.dimensions[0] * id_data = id_array.data * out_data = out_array.data # <<<<<<<<<<<<<< * stride0 = id_array.strides[0]/sizeof(int) * stride1 = id_array.strides[1]/sizeof(int) */ __pyx_v_out_data = ((int *)__pyx_v_out_array->data); /* "array_ext.pyx":62 * id_data = id_array.data * out_data = out_array.data * stride0 = id_array.strides[0]/sizeof(int) # <<<<<<<<<<<<<< * stride1 = id_array.strides[1]/sizeof(int) * */ __pyx_t_1 = (sizeof(int)); if (unlikely(__pyx_t_1 == 0)) { PyErr_Format(PyExc_ZeroDivisionError, "integer division or modulo by zero"); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_v_stride0 = ((__pyx_v_id_array->strides[0]) / __pyx_t_1); /* "array_ext.pyx":63 * out_data = out_array.data * stride0 = id_array.strides[0]/sizeof(int) * stride1 = id_array.strides[1]/sizeof(int) # <<<<<<<<<<<<<< * * cdef int i, j, in_idx, out_idx */ __pyx_t_1 = (sizeof(int)); if (unlikely(__pyx_t_1 == 0)) { PyErr_Format(PyExc_ZeroDivisionError, "integer division or modulo by zero"); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 63; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_v_stride1 = ((__pyx_v_id_array->strides[1]) / __pyx_t_1); /* "array_ext.pyx":66 * * cdef int i, j, in_idx, out_idx * for i from 0 <= i < dim0: # <<<<<<<<<<<<<< * in_idx = i*stride0 * out_idx = i*cell_length + i */ __pyx_t_2 = __pyx_v_dim0; for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_2; __pyx_v_i++) { /* "array_ext.pyx":67 * cdef int i, j, in_idx, out_idx * for i from 0 <= i < dim0: * in_idx = i*stride0 # <<<<<<<<<<<<<< * out_idx = i*cell_length + i * out_data[out_idx] = cell_length */ __pyx_v_in_idx = (__pyx_v_i * __pyx_v_stride0); /* "array_ext.pyx":68 * for i from 0 <= i < dim0: * in_idx = i*stride0 * out_idx = i*cell_length + i # <<<<<<<<<<<<<< * out_data[out_idx] = cell_length * for j from 0 <= j < cell_length: */ __pyx_v_out_idx = ((__pyx_v_i * __pyx_v_cell_length) + __pyx_v_i); /* "array_ext.pyx":69 * in_idx = i*stride0 * out_idx = i*cell_length + i * out_data[out_idx] = cell_length # <<<<<<<<<<<<<< * for j from 0 <= j < cell_length: * out_data[out_idx + j + 1] = id_data[in_idx + j*stride1] */ (__pyx_v_out_data[__pyx_v_out_idx]) = __pyx_v_cell_length; /* "array_ext.pyx":70 * out_idx = i*cell_length + i * out_data[out_idx] = cell_length * for j from 0 <= j < cell_length: # <<<<<<<<<<<<<< * out_data[out_idx + j + 1] = id_data[in_idx + j*stride1] * */ __pyx_t_3 = __pyx_v_cell_length; for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_3; __pyx_v_j++) { /* "array_ext.pyx":71 * out_data[out_idx] = cell_length * for j from 0 <= j < cell_length: * out_data[out_idx + j + 1] = id_data[in_idx + j*stride1] # <<<<<<<<<<<<<< * * cdef c_set_id_type_array_long(ndarray id_array, ndarray out_array): */ (__pyx_v_out_data[((__pyx_v_out_idx + __pyx_v_j) + 1)]) = (__pyx_v_id_data[(__pyx_v_in_idx + (__pyx_v_j * __pyx_v_stride1))]); } } __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_AddTraceback("array_ext.c_set_id_type_array"); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "array_ext.pyx":73 * out_data[out_idx + j + 1] = id_data[in_idx + j*stride1] * * cdef c_set_id_type_array_long(ndarray id_array, ndarray out_array): # <<<<<<<<<<<<<< * # This function sets the data of the passed 2D `id_array` into the * # passed out_array such that out_array can be used as a */ static PyObject *__pyx_f_9array_ext_c_set_id_type_array_long(PyArrayObject *__pyx_v_id_array, PyArrayObject *__pyx_v_out_array) { Py_ssize_t __pyx_v_cell_length; Py_ssize_t __pyx_v_dim0; Py_ssize_t *__pyx_v_id_data; Py_ssize_t *__pyx_v_out_data; Py_ssize_t __pyx_v_stride0; Py_ssize_t __pyx_v_stride1; int __pyx_v_i; int __pyx_v_j; int __pyx_v_in_idx; int __pyx_v_out_idx; PyObject *__pyx_r = NULL; size_t __pyx_t_1; Py_ssize_t __pyx_t_2; Py_ssize_t __pyx_t_3; __Pyx_RefNannySetupContext("c_set_id_type_array_long"); /* "array_ext.pyx":87 * cdef Py_ssize_t stride0, stride1 * * cell_length = id_array.dimensions[1]; # <<<<<<<<<<<<<< * dim0 = id_array.dimensions[0] * id_data = id_array.data */ __pyx_v_cell_length = (__pyx_v_id_array->dimensions[1]); /* "array_ext.pyx":88 * * cell_length = id_array.dimensions[1]; * dim0 = id_array.dimensions[0] # <<<<<<<<<<<<<< * id_data = id_array.data * out_data = out_array.data */ __pyx_v_dim0 = (__pyx_v_id_array->dimensions[0]); /* "array_ext.pyx":89 * cell_length = id_array.dimensions[1]; * dim0 = id_array.dimensions[0] * id_data = id_array.data # <<<<<<<<<<<<<< * out_data = out_array.data * stride0 = id_array.strides[0]/sizeof(Py_ssize_t) */ __pyx_v_id_data = ((Py_ssize_t *)__pyx_v_id_array->data); /* "array_ext.pyx":90 * dim0 = id_array.dimensions[0] * id_data = id_array.data * out_data = out_array.data # <<<<<<<<<<<<<< * stride0 = id_array.strides[0]/sizeof(Py_ssize_t) * stride1 = id_array.strides[1]/sizeof(Py_ssize_t) */ __pyx_v_out_data = ((Py_ssize_t *)__pyx_v_out_array->data); /* "array_ext.pyx":91 * id_data = id_array.data * out_data = out_array.data * stride0 = id_array.strides[0]/sizeof(Py_ssize_t) # <<<<<<<<<<<<<< * stride1 = id_array.strides[1]/sizeof(Py_ssize_t) * */ __pyx_t_1 = (sizeof(Py_ssize_t)); if (unlikely(__pyx_t_1 == 0)) { PyErr_Format(PyExc_ZeroDivisionError, "integer division or modulo by zero"); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_v_stride0 = ((__pyx_v_id_array->strides[0]) / __pyx_t_1); /* "array_ext.pyx":92 * out_data = out_array.data * stride0 = id_array.strides[0]/sizeof(Py_ssize_t) * stride1 = id_array.strides[1]/sizeof(Py_ssize_t) # <<<<<<<<<<<<<< * * cdef int i, j, in_idx, out_idx */ __pyx_t_1 = (sizeof(Py_ssize_t)); if (unlikely(__pyx_t_1 == 0)) { PyErr_Format(PyExc_ZeroDivisionError, "integer division or modulo by zero"); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 92; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_v_stride1 = ((__pyx_v_id_array->strides[1]) / __pyx_t_1); /* "array_ext.pyx":95 * * cdef int i, j, in_idx, out_idx * for i from 0 <= i < dim0: # <<<<<<<<<<<<<< * in_idx = i*stride0 * out_idx = i*cell_length + i */ __pyx_t_2 = __pyx_v_dim0; for (__pyx_v_i = 0; __pyx_v_i < __pyx_t_2; __pyx_v_i++) { /* "array_ext.pyx":96 * cdef int i, j, in_idx, out_idx * for i from 0 <= i < dim0: * in_idx = i*stride0 # <<<<<<<<<<<<<< * out_idx = i*cell_length + i * out_data[out_idx] = cell_length */ __pyx_v_in_idx = (__pyx_v_i * __pyx_v_stride0); /* "array_ext.pyx":97 * for i from 0 <= i < dim0: * in_idx = i*stride0 * out_idx = i*cell_length + i # <<<<<<<<<<<<<< * out_data[out_idx] = cell_length * for j from 0 <= j < cell_length: */ __pyx_v_out_idx = ((__pyx_v_i * __pyx_v_cell_length) + __pyx_v_i); /* "array_ext.pyx":98 * in_idx = i*stride0 * out_idx = i*cell_length + i * out_data[out_idx] = cell_length # <<<<<<<<<<<<<< * for j from 0 <= j < cell_length: * out_data[out_idx + j + 1] = id_data[in_idx + j*stride1] */ (__pyx_v_out_data[__pyx_v_out_idx]) = __pyx_v_cell_length; /* "array_ext.pyx":99 * out_idx = i*cell_length + i * out_data[out_idx] = cell_length * for j from 0 <= j < cell_length: # <<<<<<<<<<<<<< * out_data[out_idx + j + 1] = id_data[in_idx + j*stride1] * */ __pyx_t_3 = __pyx_v_cell_length; for (__pyx_v_j = 0; __pyx_v_j < __pyx_t_3; __pyx_v_j++) { /* "array_ext.pyx":100 * out_data[out_idx] = cell_length * for j from 0 <= j < cell_length: * out_data[out_idx + j + 1] = id_data[in_idx + j*stride1] # <<<<<<<<<<<<<< * * ###################################################################### */ (__pyx_v_out_data[((__pyx_v_out_idx + __pyx_v_j) + 1)]) = (__pyx_v_id_data[(__pyx_v_in_idx + (__pyx_v_j * __pyx_v_stride1))]); } } __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_AddTraceback("array_ext.c_set_id_type_array_long"); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "array_ext.pyx":106 * ###################################################################### * * def set_id_type_array(id_array, out_array): # <<<<<<<<<<<<<< * """Given a 2D Int array (`id_array`), and a contiguous 1D numarray * array (`out_array`) having the correct size, this function sets */ static PyObject *__pyx_pf_9array_ext_set_id_type_array(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static char __pyx_doc_9array_ext_set_id_type_array[] = "Given a 2D Int array (`id_array`), and a contiguous 1D numarray\n array (`out_array`) having the correct size, this function sets\n the data from `id_array` into `out_array` so that it can be used\n in place of a `vtkIdTypeArray` in order to set the cells of a\n `vtkCellArray`.\n\n Note that if `shape = id_array.shape` then `size(out_array) ==\n shape[0]*(shape[1] + 1)` should be true. If not you'll get an\n `AssertionError`.\n\n `id_array` need not be contiguous but `out_array` must be.\n "; static PyMethodDef __pyx_mdef_9array_ext_set_id_type_array = {__Pyx_NAMESTR("set_id_type_array"), (PyCFunction)__pyx_pf_9array_ext_set_id_type_array, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_9array_ext_set_id_type_array)}; static PyObject *__pyx_pf_9array_ext_set_id_type_array(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyObject *__pyx_v_id_array = 0; PyObject *__pyx_v_out_array = 0; PyObject *__pyx_v_vtk; PyObject *__pyx_v_VTK_ID_TYPE_SIZE; PyObject *__pyx_v_shp; PyObject *__pyx_v_sz; PyObject *__pyx_v_e_sz; PyObject *__pyx_r = NULL; PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; int __pyx_t_5; int __pyx_t_6; int __pyx_t_7; Py_ssize_t __pyx_t_8; static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__id_array,&__pyx_n_s__out_array,0}; __Pyx_RefNannySetupContext("set_id_type_array"); __pyx_self = __pyx_self; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args = PyDict_Size(__pyx_kwds); PyObject* values[2] = {0,0}; switch (PyTuple_GET_SIZE(__pyx_args)) { case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); case 0: break; default: goto __pyx_L5_argtuple_error; } switch (PyTuple_GET_SIZE(__pyx_args)) { case 0: values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__id_array); if (likely(values[0])) kw_args--; else goto __pyx_L5_argtuple_error; case 1: values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__out_array); if (likely(values[1])) kw_args--; else { __Pyx_RaiseArgtupleInvalid("set_id_type_array", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, PyTuple_GET_SIZE(__pyx_args), "set_id_type_array") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } __pyx_v_id_array = values[0]; __pyx_v_out_array = values[1]; } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { goto __pyx_L5_argtuple_error; } else { __pyx_v_id_array = PyTuple_GET_ITEM(__pyx_args, 0); __pyx_v_out_array = PyTuple_GET_ITEM(__pyx_args, 1); } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("set_id_type_array", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("array_ext.set_id_type_array"); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_v_vtk = Py_None; __Pyx_INCREF(Py_None); __pyx_v_VTK_ID_TYPE_SIZE = Py_None; __Pyx_INCREF(Py_None); __pyx_v_shp = Py_None; __Pyx_INCREF(Py_None); __pyx_v_sz = Py_None; __Pyx_INCREF(Py_None); __pyx_v_e_sz = Py_None; __Pyx_INCREF(Py_None); /* "array_ext.pyx":119 * `id_array` need not be contiguous but `out_array` must be. * """ * import vtk # <<<<<<<<<<<<<< * VTK_ID_TYPE_SIZE = vtk.vtkIdTypeArray().GetDataTypeSize() * assert numpy.issubdtype(id_array.dtype, numpy.signedinteger) and \ */ __pyx_t_1 = __Pyx_Import(((PyObject *)__pyx_n_s__vtk), 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 119; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_v_vtk); __pyx_v_vtk = __pyx_t_1; __pyx_t_1 = 0; /* "array_ext.pyx":120 * """ * import vtk * VTK_ID_TYPE_SIZE = vtk.vtkIdTypeArray().GetDataTypeSize() # <<<<<<<<<<<<<< * assert numpy.issubdtype(id_array.dtype, numpy.signedinteger) and \ * id_array.dtype.itemsize == VTK_ID_TYPE_SIZE */ __pyx_t_1 = PyObject_GetAttr(__pyx_v_vtk, __pyx_n_s__vtkIdTypeArray); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 120; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 120; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__GetDataTypeSize); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 120; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 120; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_v_VTK_ID_TYPE_SIZE); __pyx_v_VTK_ID_TYPE_SIZE = __pyx_t_2; __pyx_t_2 = 0; /* "array_ext.pyx":121 * import vtk * VTK_ID_TYPE_SIZE = vtk.vtkIdTypeArray().GetDataTypeSize() * assert numpy.issubdtype(id_array.dtype, numpy.signedinteger) and \ # <<<<<<<<<<<<<< * id_array.dtype.itemsize == VTK_ID_TYPE_SIZE * */ #ifndef CYTHON_WITHOUT_ASSERTIONS __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__numpy); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_1 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__issubdtype); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = PyObject_GetAttr(__pyx_v_id_array, __pyx_n_s__dtype); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = __Pyx_GetName(__pyx_m, __pyx_n_s__numpy); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__signedinteger); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(((PyObject *)__pyx_t_3)); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2); __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_4); __Pyx_GIVEREF(__pyx_t_4); __pyx_t_2 = 0; __pyx_t_4 = 0; __pyx_t_4 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0; __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (__pyx_t_5) { /* "array_ext.pyx":122 * VTK_ID_TYPE_SIZE = vtk.vtkIdTypeArray().GetDataTypeSize() * assert numpy.issubdtype(id_array.dtype, numpy.signedinteger) and \ * id_array.dtype.itemsize == VTK_ID_TYPE_SIZE # <<<<<<<<<<<<<< * * assert out_array.flags.contiguous == 1, \ */ __pyx_t_4 = PyObject_GetAttr(__pyx_v_id_array, __pyx_n_s__dtype); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 122; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __pyx_t_3 = PyObject_GetAttr(__pyx_t_4, __pyx_n_s__itemsize); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 122; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = PyObject_RichCompare(__pyx_t_3, __pyx_v_VTK_ID_TYPE_SIZE, Py_EQ); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 122; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 122; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_7 = __pyx_t_6; } else { __pyx_t_7 = __pyx_t_5; } if (unlikely(!__pyx_t_7)) { PyErr_SetNone(PyExc_AssertionError); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } #endif /* "array_ext.pyx":124 * id_array.dtype.itemsize == VTK_ID_TYPE_SIZE * * assert out_array.flags.contiguous == 1, \ # <<<<<<<<<<<<<< * "out_array must be contiguous." * */ #ifndef CYTHON_WITHOUT_ASSERTIONS __pyx_t_4 = PyObject_GetAttr(__pyx_v_out_array, __pyx_n_s__flags); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __pyx_t_3 = PyObject_GetAttr(__pyx_t_4, __pyx_n_s__contiguous); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = PyObject_RichCompare(__pyx_t_3, __pyx_int_1, Py_EQ); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (unlikely(!__pyx_t_7)) { PyErr_SetObject(PyExc_AssertionError, ((PyObject *)__pyx_kp_s_1)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 124; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } #endif /* "array_ext.pyx":127 * "out_array must be contiguous." * * shp = id_array.shape # <<<<<<<<<<<<<< * assert len(shp) == 2, "id_array must be a two dimensional array." * */ __pyx_t_4 = PyObject_GetAttr(__pyx_v_id_array, __pyx_n_s__shape); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 127; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_v_shp); __pyx_v_shp = __pyx_t_4; __pyx_t_4 = 0; /* "array_ext.pyx":128 * * shp = id_array.shape * assert len(shp) == 2, "id_array must be a two dimensional array." # <<<<<<<<<<<<<< * * sz = numpy.size(out_array) */ #ifndef CYTHON_WITHOUT_ASSERTIONS __pyx_t_8 = PyObject_Length(__pyx_v_shp); if (unlikely(__pyx_t_8 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 128; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (unlikely(!(__pyx_t_8 == 2))) { PyErr_SetObject(PyExc_AssertionError, ((PyObject *)__pyx_kp_s_2)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 128; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } #endif /* "array_ext.pyx":130 * assert len(shp) == 2, "id_array must be a two dimensional array." * * sz = numpy.size(out_array) # <<<<<<<<<<<<<< * e_sz = shp[0]*(shp[1]+1) * assert sz == e_sz, \ */ __pyx_t_4 = __Pyx_GetName(__pyx_m, __pyx_n_s__numpy); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 130; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __pyx_t_3 = PyObject_GetAttr(__pyx_t_4, __pyx_n_s__size); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 130; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 130; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(((PyObject *)__pyx_t_4)); __Pyx_INCREF(__pyx_v_out_array); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_out_array); __Pyx_GIVEREF(__pyx_v_out_array); __pyx_t_1 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 130; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_v_sz); __pyx_v_sz = __pyx_t_1; __pyx_t_1 = 0; /* "array_ext.pyx":131 * * sz = numpy.size(out_array) * e_sz = shp[0]*(shp[1]+1) # <<<<<<<<<<<<<< * assert sz == e_sz, \ * "out_array size is incorrect, expected: %s, given: %s"%(e_sz, sz) */ __pyx_t_1 = __Pyx_GetItemInt(__pyx_v_shp, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_1) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 131; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_4 = __Pyx_GetItemInt(__pyx_v_shp, 1, sizeof(long), PyInt_FromLong); if (!__pyx_t_4) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 131; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __pyx_t_3 = PyNumber_Add(__pyx_t_4, __pyx_int_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 131; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = PyNumber_Multiply(__pyx_t_1, __pyx_t_3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 131; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_v_e_sz); __pyx_v_e_sz = __pyx_t_4; __pyx_t_4 = 0; /* "array_ext.pyx":132 * sz = numpy.size(out_array) * e_sz = shp[0]*(shp[1]+1) * assert sz == e_sz, \ # <<<<<<<<<<<<<< * "out_array size is incorrect, expected: %s, given: %s"%(e_sz, sz) * */ #ifndef CYTHON_WITHOUT_ASSERTIONS __pyx_t_4 = PyObject_RichCompare(__pyx_v_sz, __pyx_v_e_sz, Py_EQ); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; if (unlikely(!__pyx_t_7)) { /* "array_ext.pyx":133 * e_sz = shp[0]*(shp[1]+1) * assert sz == e_sz, \ * "out_array size is incorrect, expected: %s, given: %s"%(e_sz, sz) # <<<<<<<<<<<<<< * * if VTK_ID_TYPE_SIZE == 4: */ __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 133; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(((PyObject *)__pyx_t_4)); __Pyx_INCREF(__pyx_v_e_sz); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_e_sz); __Pyx_GIVEREF(__pyx_v_e_sz); __Pyx_INCREF(__pyx_v_sz); PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_v_sz); __Pyx_GIVEREF(__pyx_v_sz); __pyx_t_3 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_3), ((PyObject *)__pyx_t_4)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 133; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(((PyObject *)__pyx_t_3)); __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0; PyErr_SetObject(PyExc_AssertionError, ((PyObject *)__pyx_t_3)); __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0; {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } #endif /* "array_ext.pyx":135 * "out_array size is incorrect, expected: %s, given: %s"%(e_sz, sz) * * if VTK_ID_TYPE_SIZE == 4: # <<<<<<<<<<<<<< * c_set_id_type_array(id_array, out_array) * elif VTK_ID_TYPE_SIZE == 8: */ __pyx_t_3 = PyObject_RichCompare(__pyx_v_VTK_ID_TYPE_SIZE, __pyx_int_4, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 135; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 135; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (__pyx_t_7) { /* "array_ext.pyx":136 * * if VTK_ID_TYPE_SIZE == 4: * c_set_id_type_array(id_array, out_array) # <<<<<<<<<<<<<< * elif VTK_ID_TYPE_SIZE == 8: * c_set_id_type_array_long(id_array, out_array) */ if (!(likely(((__pyx_v_id_array) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_id_array, __pyx_ptype_9array_ext_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 136; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_3 = __pyx_v_id_array; __Pyx_INCREF(__pyx_t_3); if (!(likely(((__pyx_v_out_array) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_out_array, __pyx_ptype_9array_ext_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 136; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_4 = __pyx_v_out_array; __Pyx_INCREF(__pyx_t_4); __pyx_t_1 = __pyx_f_9array_ext_c_set_id_type_array(((PyArrayObject *)__pyx_t_3), ((PyArrayObject *)__pyx_t_4)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 136; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; goto __pyx_L6; } /* "array_ext.pyx":137 * if VTK_ID_TYPE_SIZE == 4: * c_set_id_type_array(id_array, out_array) * elif VTK_ID_TYPE_SIZE == 8: # <<<<<<<<<<<<<< * c_set_id_type_array_long(id_array, out_array) * else: */ __pyx_t_1 = PyObject_RichCompare(__pyx_v_VTK_ID_TYPE_SIZE, __pyx_int_8, Py_EQ); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 137; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 137; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (__pyx_t_7) { /* "array_ext.pyx":138 * c_set_id_type_array(id_array, out_array) * elif VTK_ID_TYPE_SIZE == 8: * c_set_id_type_array_long(id_array, out_array) # <<<<<<<<<<<<<< * else: * raise ValueError('Unsupported VTK_ID_TYPE_SIZE=%d'\ */ if (!(likely(((__pyx_v_id_array) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_id_array, __pyx_ptype_9array_ext_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 138; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_1 = __pyx_v_id_array; __Pyx_INCREF(__pyx_t_1); if (!(likely(((__pyx_v_out_array) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_out_array, __pyx_ptype_9array_ext_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 138; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_4 = __pyx_v_out_array; __Pyx_INCREF(__pyx_t_4); __pyx_t_3 = __pyx_f_9array_ext_c_set_id_type_array_long(((PyArrayObject *)__pyx_t_1), ((PyArrayObject *)__pyx_t_4)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 138; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; goto __pyx_L6; } /*else*/ { /* "array_ext.pyx":141 * else: * raise ValueError('Unsupported VTK_ID_TYPE_SIZE=%d'\ * %VTK_ID_TYPE_SIZE) # <<<<<<<<<<<<<< * */ __pyx_t_3 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_4), __pyx_v_VTK_ID_TYPE_SIZE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(((PyObject *)__pyx_t_3)); __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(((PyObject *)__pyx_t_4)); PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_t_3)); __Pyx_GIVEREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0; __pyx_t_3 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0; __Pyx_Raise(__pyx_t_3, 0, 0); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; {__pyx_filename = __pyx_f[0]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_L6:; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_AddTraceback("array_ext.set_id_type_array"); __pyx_r = NULL; __pyx_L0:; __Pyx_DECREF(__pyx_v_vtk); __Pyx_DECREF(__pyx_v_VTK_ID_TYPE_SIZE); __Pyx_DECREF(__pyx_v_shp); __Pyx_DECREF(__pyx_v_sz); __Pyx_DECREF(__pyx_v_e_sz); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyMethodDef __pyx_methods[] = { {0, 0, 0, 0} }; #if PY_MAJOR_VERSION >= 3 static struct PyModuleDef __pyx_moduledef = { PyModuleDef_HEAD_INIT, __Pyx_NAMESTR("array_ext"), __Pyx_DOCSTR(__pyx_k_5), /* m_doc */ -1, /* m_size */ __pyx_methods /* m_methods */, NULL, /* m_reload */ NULL, /* m_traverse */ NULL, /* m_clear */ NULL /* m_free */ }; #endif static __Pyx_StringTabEntry __pyx_string_tab[] = { {&__pyx_kp_s_1, __pyx_k_1, sizeof(__pyx_k_1), 0, 0, 1, 0}, {&__pyx_kp_s_2, __pyx_k_2, sizeof(__pyx_k_2), 0, 0, 1, 0}, {&__pyx_kp_s_3, __pyx_k_3, sizeof(__pyx_k_3), 0, 0, 1, 0}, {&__pyx_kp_s_4, __pyx_k_4, sizeof(__pyx_k_4), 0, 0, 1, 0}, {&__pyx_n_s__GetDataTypeSize, __pyx_k__GetDataTypeSize, sizeof(__pyx_k__GetDataTypeSize), 0, 0, 1, 1}, {&__pyx_n_s__ValueError, __pyx_k__ValueError, sizeof(__pyx_k__ValueError), 0, 0, 1, 1}, {&__pyx_n_s____main__, __pyx_k____main__, sizeof(__pyx_k____main__), 0, 0, 1, 1}, {&__pyx_n_s____test__, __pyx_k____test__, sizeof(__pyx_k____test__), 0, 0, 1, 1}, {&__pyx_n_s__array_ext, __pyx_k__array_ext, sizeof(__pyx_k__array_ext), 0, 0, 1, 1}, {&__pyx_n_s__contiguous, __pyx_k__contiguous, sizeof(__pyx_k__contiguous), 0, 0, 1, 1}, {&__pyx_n_s__data, __pyx_k__data, sizeof(__pyx_k__data), 0, 0, 1, 1}, {&__pyx_n_s__dimensions, __pyx_k__dimensions, sizeof(__pyx_k__dimensions), 0, 0, 1, 1}, {&__pyx_n_s__dtype, __pyx_k__dtype, sizeof(__pyx_k__dtype), 0, 0, 1, 1}, {&__pyx_n_s__flags, __pyx_k__flags, sizeof(__pyx_k__flags), 0, 0, 1, 1}, {&__pyx_n_s__id_array, __pyx_k__id_array, sizeof(__pyx_k__id_array), 0, 0, 1, 1}, {&__pyx_n_s__issubdtype, __pyx_k__issubdtype, sizeof(__pyx_k__issubdtype), 0, 0, 1, 1}, {&__pyx_n_s__itemsize, __pyx_k__itemsize, sizeof(__pyx_k__itemsize), 0, 0, 1, 1}, {&__pyx_n_s__numpy, __pyx_k__numpy, sizeof(__pyx_k__numpy), 0, 0, 1, 1}, {&__pyx_n_s__out_array, __pyx_k__out_array, sizeof(__pyx_k__out_array), 0, 0, 1, 1}, {&__pyx_n_s__set_id_type_array, __pyx_k__set_id_type_array, sizeof(__pyx_k__set_id_type_array), 0, 0, 1, 1}, {&__pyx_n_s__shape, __pyx_k__shape, sizeof(__pyx_k__shape), 0, 0, 1, 1}, {&__pyx_n_s__signedinteger, __pyx_k__signedinteger, sizeof(__pyx_k__signedinteger), 0, 0, 1, 1}, {&__pyx_n_s__size, __pyx_k__size, sizeof(__pyx_k__size), 0, 0, 1, 1}, {&__pyx_n_s__strides, __pyx_k__strides, sizeof(__pyx_k__strides), 0, 0, 1, 1}, {&__pyx_n_s__vtk, __pyx_k__vtk, sizeof(__pyx_k__vtk), 0, 0, 1, 1}, {&__pyx_n_s__vtkIdTypeArray, __pyx_k__vtkIdTypeArray, sizeof(__pyx_k__vtkIdTypeArray), 0, 0, 1, 1}, {0, 0, 0, 0, 0, 0, 0} }; static int __Pyx_InitCachedBuiltins(void) { __pyx_builtin_ValueError = __Pyx_GetName(__pyx_b, __pyx_n_s__ValueError); if (!__pyx_builtin_ValueError) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L1_error;} return 0; __pyx_L1_error:; return -1; } static int __Pyx_InitCachedConstants(void) { __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants"); __Pyx_RefNannyFinishContext(); return 0; } static int __Pyx_InitGlobals(void) { if (__Pyx_InitStrings(__pyx_string_tab) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __pyx_int_1 = PyInt_FromLong(1); if (unlikely(!__pyx_int_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __pyx_int_4 = PyInt_FromLong(4); if (unlikely(!__pyx_int_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __pyx_int_8 = PyInt_FromLong(8); if (unlikely(!__pyx_int_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; return 0; __pyx_L1_error:; return -1; } #if PY_MAJOR_VERSION < 3 PyMODINIT_FUNC initarray_ext(void); /*proto*/ PyMODINIT_FUNC initarray_ext(void) #else PyMODINIT_FUNC PyInit_array_ext(void); /*proto*/ PyMODINIT_FUNC PyInit_array_ext(void) #endif { PyObject *__pyx_t_1 = NULL; #if CYTHON_REFNANNY void* __pyx_refnanny = NULL; __Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny"); if (!__Pyx_RefNanny) { PyErr_Clear(); __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny"); if (!__Pyx_RefNanny) Py_FatalError("failed to import 'refnanny' module"); } __pyx_refnanny = __Pyx_RefNanny->SetupContext("PyMODINIT_FUNC PyInit_array_ext(void)", __LINE__, __FILE__); #endif __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #ifdef __pyx_binding_PyCFunctionType_USED if (__pyx_binding_PyCFunctionType_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #endif /*--- Library function declarations ---*/ /*--- Threads initialization code ---*/ #if defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS #ifdef WITH_THREAD /* Python build with threading support? */ PyEval_InitThreads(); #endif #endif /*--- Module creation code ---*/ #if PY_MAJOR_VERSION < 3 __pyx_m = Py_InitModule4(__Pyx_NAMESTR("array_ext"), __pyx_methods, __Pyx_DOCSTR(__pyx_k_5), 0, PYTHON_API_VERSION); #else __pyx_m = PyModule_Create(&__pyx_moduledef); #endif if (!__pyx_m) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; #if PY_MAJOR_VERSION < 3 Py_INCREF(__pyx_m); #endif __pyx_b = PyImport_AddModule(__Pyx_NAMESTR(__Pyx_BUILTIN_MODULE_NAME)); if (!__pyx_b) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; if (__Pyx_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; /*--- Initialize various global constants etc. ---*/ if (unlikely(__Pyx_InitGlobals() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (__pyx_module_is_main_array_ext) { if (__Pyx_SetAttrString(__pyx_m, "__name__", __pyx_n_s____main__) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; } /*--- Builtin init code ---*/ if (unlikely(__Pyx_InitCachedBuiltins() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /*--- Constants init code ---*/ if (unlikely(__Pyx_InitCachedConstants() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /*--- Global init code ---*/ /*--- Function export code ---*/ /*--- Type init code ---*/ __pyx_ptype_9array_ext_ndarray = __Pyx_ImportType("numpy", "ndarray", sizeof(PyArrayObject), 0); if (unlikely(!__pyx_ptype_9array_ext_ndarray)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /*--- Type import code ---*/ /*--- Function import code ---*/ /*--- Execution code ---*/ /* "array_ext.pyx":12 * # License: BSD Style. * * import numpy # <<<<<<<<<<<<<< * * ###################################################################### */ __pyx_t_1 = __Pyx_Import(((PyObject *)__pyx_n_s__numpy), 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); if (PyObject_SetAttr(__pyx_m, __pyx_n_s__numpy, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "array_ext.pyx":37 * void import_array() * * import_array() # <<<<<<<<<<<<<< * * ###################################################################### */ import_array(); /* "array_ext.pyx":106 * ###################################################################### * * def set_id_type_array(id_array, out_array): # <<<<<<<<<<<<<< * """Given a 2D Int array (`id_array`), and a contiguous 1D numarray * array (`out_array`) having the correct size, this function sets */ __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_9array_ext_set_id_type_array, NULL, __pyx_n_s__array_ext); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); if (PyObject_SetAttr(__pyx_m, __pyx_n_s__set_id_type_array, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 106; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "array_ext.pyx":1 * """ # <<<<<<<<<<<<<< * A Pyrex extension module for numpy. Currently this extension module * allows us to massage a 2D scipy array into a form usable as a */ __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(((PyObject *)__pyx_t_1)); if (PyObject_SetAttr(__pyx_m, __pyx_n_s____test__, ((PyObject *)__pyx_t_1)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); if (__pyx_m) { __Pyx_AddTraceback("init array_ext"); Py_DECREF(__pyx_m); __pyx_m = 0; } else if (!PyErr_Occurred()) { PyErr_SetString(PyExc_ImportError, "init array_ext"); } __pyx_L0:; __Pyx_RefNannyFinishContext(); #if PY_MAJOR_VERSION < 3 return; #else return __pyx_m; #endif } /* Runtime support code */ static PyObject *__Pyx_GetName(PyObject *dict, PyObject *name) { PyObject *result; result = PyObject_GetAttr(dict, name); if (!result) PyErr_SetObject(PyExc_NameError, name); return result; } static void __Pyx_RaiseArgtupleInvalid( const char* func_name, int exact, Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found) { Py_ssize_t num_expected; const char *number, *more_or_less; if (num_found < num_min) { num_expected = num_min; more_or_less = "at least"; } else { num_expected = num_max; more_or_less = "at most"; } if (exact) { more_or_less = "exactly"; } number = (num_expected == 1) ? "" : "s"; PyErr_Format(PyExc_TypeError, #if PY_VERSION_HEX < 0x02050000 "%s() takes %s %d positional argument%s (%d given)", #else "%s() takes %s %zd positional argument%s (%zd given)", #endif func_name, more_or_less, num_expected, number, num_found); } static void __Pyx_RaiseDoubleKeywordsError( const char* func_name, PyObject* kw_name) { PyErr_Format(PyExc_TypeError, #if PY_MAJOR_VERSION >= 3 "%s() got multiple values for keyword argument '%U'", func_name, kw_name); #else "%s() got multiple values for keyword argument '%s'", func_name, PyString_AS_STRING(kw_name)); #endif } static int __Pyx_ParseOptionalKeywords( PyObject *kwds, PyObject **argnames[], PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, const char* function_name) { PyObject *key = 0, *value = 0; Py_ssize_t pos = 0; PyObject*** name; PyObject*** first_kw_arg = argnames + num_pos_args; while (PyDict_Next(kwds, &pos, &key, &value)) { name = first_kw_arg; while (*name && (**name != key)) name++; if (*name) { values[name-argnames] = value; } else { #if PY_MAJOR_VERSION < 3 if (unlikely(!PyString_CheckExact(key)) && unlikely(!PyString_Check(key))) { #else if (unlikely(!PyUnicode_CheckExact(key)) && unlikely(!PyUnicode_Check(key))) { #endif goto invalid_keyword_type; } else { for (name = first_kw_arg; *name; name++) { #if PY_MAJOR_VERSION >= 3 if (PyUnicode_GET_SIZE(**name) == PyUnicode_GET_SIZE(key) && PyUnicode_Compare(**name, key) == 0) break; #else if (PyString_GET_SIZE(**name) == PyString_GET_SIZE(key) && _PyString_Eq(**name, key)) break; #endif } if (*name) { values[name-argnames] = value; } else { /* unexpected keyword found */ for (name=argnames; name != first_kw_arg; name++) { if (**name == key) goto arg_passed_twice; #if PY_MAJOR_VERSION >= 3 if (PyUnicode_GET_SIZE(**name) == PyUnicode_GET_SIZE(key) && PyUnicode_Compare(**name, key) == 0) goto arg_passed_twice; #else if (PyString_GET_SIZE(**name) == PyString_GET_SIZE(key) && _PyString_Eq(**name, key)) goto arg_passed_twice; #endif } if (kwds2) { if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad; } else { goto invalid_keyword; } } } } } return 0; arg_passed_twice: __Pyx_RaiseDoubleKeywordsError(function_name, **name); goto bad; invalid_keyword_type: PyErr_Format(PyExc_TypeError, "%s() keywords must be strings", function_name); goto bad; invalid_keyword: PyErr_Format(PyExc_TypeError, #if PY_MAJOR_VERSION < 3 "%s() got an unexpected keyword argument '%s'", function_name, PyString_AsString(key)); #else "%s() got an unexpected keyword argument '%U'", function_name, key); #endif bad: return -1; } static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type) { if (unlikely(!type)) { PyErr_Format(PyExc_SystemError, "Missing type object"); return 0; } if (likely(PyObject_TypeCheck(obj, type))) return 1; PyErr_Format(PyExc_TypeError, "Cannot convert %.200s to %.200s", Py_TYPE(obj)->tp_name, type->tp_name); return 0; } static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb) { PyObject *tmp_type, *tmp_value, *tmp_tb; PyThreadState *tstate = PyThreadState_GET(); tmp_type = tstate->curexc_type; tmp_value = tstate->curexc_value; tmp_tb = tstate->curexc_traceback; tstate->curexc_type = type; tstate->curexc_value = value; tstate->curexc_traceback = tb; Py_XDECREF(tmp_type); Py_XDECREF(tmp_value); Py_XDECREF(tmp_tb); } static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb) { PyThreadState *tstate = PyThreadState_GET(); *type = tstate->curexc_type; *value = tstate->curexc_value; *tb = tstate->curexc_traceback; tstate->curexc_type = 0; tstate->curexc_value = 0; tstate->curexc_traceback = 0; } #if PY_MAJOR_VERSION < 3 static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb) { Py_XINCREF(type); Py_XINCREF(value); Py_XINCREF(tb); /* First, check the traceback argument, replacing None with NULL. */ if (tb == Py_None) { Py_DECREF(tb); tb = 0; } else if (tb != NULL && !PyTraceBack_Check(tb)) { PyErr_SetString(PyExc_TypeError, "raise: arg 3 must be a traceback or None"); goto raise_error; } /* Next, replace a missing value with None */ if (value == NULL) { value = Py_None; Py_INCREF(value); } #if PY_VERSION_HEX < 0x02050000 if (!PyClass_Check(type)) #else if (!PyType_Check(type)) #endif { /* Raising an instance. The value should be a dummy. */ if (value != Py_None) { PyErr_SetString(PyExc_TypeError, "instance exception may not have a separate value"); goto raise_error; } /* Normalize to raise , */ Py_DECREF(value); value = type; #if PY_VERSION_HEX < 0x02050000 if (PyInstance_Check(type)) { type = (PyObject*) ((PyInstanceObject*)type)->in_class; Py_INCREF(type); } else { type = 0; PyErr_SetString(PyExc_TypeError, "raise: exception must be an old-style class or instance"); goto raise_error; } #else type = (PyObject*) Py_TYPE(type); Py_INCREF(type); if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) { PyErr_SetString(PyExc_TypeError, "raise: exception class must be a subclass of BaseException"); goto raise_error; } #endif } __Pyx_ErrRestore(type, value, tb); return; raise_error: Py_XDECREF(value); Py_XDECREF(type); Py_XDECREF(tb); return; } #else /* Python 3+ */ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb) { if (tb == Py_None) { tb = 0; } else if (tb && !PyTraceBack_Check(tb)) { PyErr_SetString(PyExc_TypeError, "raise: arg 3 must be a traceback or None"); goto bad; } if (value == Py_None) value = 0; if (PyExceptionInstance_Check(type)) { if (value) { PyErr_SetString(PyExc_TypeError, "instance exception may not have a separate value"); goto bad; } value = type; type = (PyObject*) Py_TYPE(value); } else if (!PyExceptionClass_Check(type)) { PyErr_SetString(PyExc_TypeError, "raise: exception class must be a subclass of BaseException"); goto bad; } PyErr_SetObject(type, value); if (tb) { PyThreadState *tstate = PyThreadState_GET(); PyObject* tmp_tb = tstate->curexc_traceback; if (tb != tmp_tb) { Py_INCREF(tb); tstate->curexc_traceback = tb; Py_XDECREF(tmp_tb); } } bad: return; } #endif static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list) { PyObject *py_import = 0; PyObject *empty_list = 0; PyObject *module = 0; PyObject *global_dict = 0; PyObject *empty_dict = 0; PyObject *list; py_import = __Pyx_GetAttrString(__pyx_b, "__import__"); if (!py_import) goto bad; if (from_list) list = from_list; else { empty_list = PyList_New(0); if (!empty_list) goto bad; list = empty_list; } global_dict = PyModule_GetDict(__pyx_m); if (!global_dict) goto bad; empty_dict = PyDict_New(); if (!empty_dict) goto bad; module = PyObject_CallFunctionObjArgs(py_import, name, global_dict, empty_dict, list, NULL); bad: Py_XDECREF(empty_list); Py_XDECREF(py_import); Py_XDECREF(empty_dict); return module; } static CYTHON_INLINE unsigned char __Pyx_PyInt_AsUnsignedChar(PyObject* x) { const unsigned char neg_one = (unsigned char)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(unsigned char) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(unsigned char)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to unsigned char" : "value too large to convert to unsigned char"); } return (unsigned char)-1; } return (unsigned char)val; } return (unsigned char)__Pyx_PyInt_AsUnsignedLong(x); } static CYTHON_INLINE unsigned short __Pyx_PyInt_AsUnsignedShort(PyObject* x) { const unsigned short neg_one = (unsigned short)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(unsigned short) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(unsigned short)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to unsigned short" : "value too large to convert to unsigned short"); } return (unsigned short)-1; } return (unsigned short)val; } return (unsigned short)__Pyx_PyInt_AsUnsignedLong(x); } static CYTHON_INLINE unsigned int __Pyx_PyInt_AsUnsignedInt(PyObject* x) { const unsigned int neg_one = (unsigned int)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(unsigned int) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(unsigned int)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to unsigned int" : "value too large to convert to unsigned int"); } return (unsigned int)-1; } return (unsigned int)val; } return (unsigned int)__Pyx_PyInt_AsUnsignedLong(x); } static CYTHON_INLINE char __Pyx_PyInt_AsChar(PyObject* x) { const char neg_one = (char)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(char) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(char)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to char" : "value too large to convert to char"); } return (char)-1; } return (char)val; } return (char)__Pyx_PyInt_AsLong(x); } static CYTHON_INLINE short __Pyx_PyInt_AsShort(PyObject* x) { const short neg_one = (short)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(short) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(short)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to short" : "value too large to convert to short"); } return (short)-1; } return (short)val; } return (short)__Pyx_PyInt_AsLong(x); } static CYTHON_INLINE int __Pyx_PyInt_AsInt(PyObject* x) { const int neg_one = (int)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(int) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(int)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to int" : "value too large to convert to int"); } return (int)-1; } return (int)val; } return (int)__Pyx_PyInt_AsLong(x); } static CYTHON_INLINE signed char __Pyx_PyInt_AsSignedChar(PyObject* x) { const signed char neg_one = (signed char)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(signed char) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(signed char)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to signed char" : "value too large to convert to signed char"); } return (signed char)-1; } return (signed char)val; } return (signed char)__Pyx_PyInt_AsSignedLong(x); } static CYTHON_INLINE signed short __Pyx_PyInt_AsSignedShort(PyObject* x) { const signed short neg_one = (signed short)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(signed short) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(signed short)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to signed short" : "value too large to convert to signed short"); } return (signed short)-1; } return (signed short)val; } return (signed short)__Pyx_PyInt_AsSignedLong(x); } static CYTHON_INLINE signed int __Pyx_PyInt_AsSignedInt(PyObject* x) { const signed int neg_one = (signed int)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(signed int) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(signed int)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to signed int" : "value too large to convert to signed int"); } return (signed int)-1; } return (signed int)val; } return (signed int)__Pyx_PyInt_AsSignedLong(x); } static CYTHON_INLINE int __Pyx_PyInt_AsLongDouble(PyObject* x) { const int neg_one = (int)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(int) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(int)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to int" : "value too large to convert to int"); } return (int)-1; } return (int)val; } return (int)__Pyx_PyInt_AsLong(x); } static CYTHON_INLINE unsigned long __Pyx_PyInt_AsUnsignedLong(PyObject* x) { const unsigned long neg_one = (unsigned long)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; #if PY_VERSION_HEX < 0x03000000 if (likely(PyInt_Check(x))) { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to unsigned long"); return (unsigned long)-1; } return (unsigned long)val; } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { if (unlikely(Py_SIZE(x) < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to unsigned long"); return (unsigned long)-1; } return PyLong_AsUnsignedLong(x); } else { return PyLong_AsLong(x); } } else { unsigned long val; PyObject *tmp = __Pyx_PyNumber_Int(x); if (!tmp) return (unsigned long)-1; val = __Pyx_PyInt_AsUnsignedLong(tmp); Py_DECREF(tmp); return val; } } static CYTHON_INLINE unsigned PY_LONG_LONG __Pyx_PyInt_AsUnsignedLongLong(PyObject* x) { const unsigned PY_LONG_LONG neg_one = (unsigned PY_LONG_LONG)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; #if PY_VERSION_HEX < 0x03000000 if (likely(PyInt_Check(x))) { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to unsigned PY_LONG_LONG"); return (unsigned PY_LONG_LONG)-1; } return (unsigned PY_LONG_LONG)val; } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { if (unlikely(Py_SIZE(x) < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to unsigned PY_LONG_LONG"); return (unsigned PY_LONG_LONG)-1; } return PyLong_AsUnsignedLongLong(x); } else { return PyLong_AsLongLong(x); } } else { unsigned PY_LONG_LONG val; PyObject *tmp = __Pyx_PyNumber_Int(x); if (!tmp) return (unsigned PY_LONG_LONG)-1; val = __Pyx_PyInt_AsUnsignedLongLong(tmp); Py_DECREF(tmp); return val; } } static CYTHON_INLINE long __Pyx_PyInt_AsLong(PyObject* x) { const long neg_one = (long)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; #if PY_VERSION_HEX < 0x03000000 if (likely(PyInt_Check(x))) { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to long"); return (long)-1; } return (long)val; } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { if (unlikely(Py_SIZE(x) < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to long"); return (long)-1; } return PyLong_AsUnsignedLong(x); } else { return PyLong_AsLong(x); } } else { long val; PyObject *tmp = __Pyx_PyNumber_Int(x); if (!tmp) return (long)-1; val = __Pyx_PyInt_AsLong(tmp); Py_DECREF(tmp); return val; } } static CYTHON_INLINE PY_LONG_LONG __Pyx_PyInt_AsLongLong(PyObject* x) { const PY_LONG_LONG neg_one = (PY_LONG_LONG)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; #if PY_VERSION_HEX < 0x03000000 if (likely(PyInt_Check(x))) { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to PY_LONG_LONG"); return (PY_LONG_LONG)-1; } return (PY_LONG_LONG)val; } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { if (unlikely(Py_SIZE(x) < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to PY_LONG_LONG"); return (PY_LONG_LONG)-1; } return PyLong_AsUnsignedLongLong(x); } else { return PyLong_AsLongLong(x); } } else { PY_LONG_LONG val; PyObject *tmp = __Pyx_PyNumber_Int(x); if (!tmp) return (PY_LONG_LONG)-1; val = __Pyx_PyInt_AsLongLong(tmp); Py_DECREF(tmp); return val; } } static CYTHON_INLINE signed long __Pyx_PyInt_AsSignedLong(PyObject* x) { const signed long neg_one = (signed long)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; #if PY_VERSION_HEX < 0x03000000 if (likely(PyInt_Check(x))) { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to signed long"); return (signed long)-1; } return (signed long)val; } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { if (unlikely(Py_SIZE(x) < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to signed long"); return (signed long)-1; } return PyLong_AsUnsignedLong(x); } else { return PyLong_AsLong(x); } } else { signed long val; PyObject *tmp = __Pyx_PyNumber_Int(x); if (!tmp) return (signed long)-1; val = __Pyx_PyInt_AsSignedLong(tmp); Py_DECREF(tmp); return val; } } static CYTHON_INLINE signed PY_LONG_LONG __Pyx_PyInt_AsSignedLongLong(PyObject* x) { const signed PY_LONG_LONG neg_one = (signed PY_LONG_LONG)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; #if PY_VERSION_HEX < 0x03000000 if (likely(PyInt_Check(x))) { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to signed PY_LONG_LONG"); return (signed PY_LONG_LONG)-1; } return (signed PY_LONG_LONG)val; } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { if (unlikely(Py_SIZE(x) < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to signed PY_LONG_LONG"); return (signed PY_LONG_LONG)-1; } return PyLong_AsUnsignedLongLong(x); } else { return PyLong_AsLongLong(x); } } else { signed PY_LONG_LONG val; PyObject *tmp = __Pyx_PyNumber_Int(x); if (!tmp) return (signed PY_LONG_LONG)-1; val = __Pyx_PyInt_AsSignedLongLong(tmp); Py_DECREF(tmp); return val; } } #ifndef __PYX_HAVE_RT_ImportType #define __PYX_HAVE_RT_ImportType static PyTypeObject *__Pyx_ImportType(const char *module_name, const char *class_name, long size, int strict) { PyObject *py_module = 0; PyObject *result = 0; PyObject *py_name = 0; char warning[200]; py_module = __Pyx_ImportModule(module_name); if (!py_module) goto bad; #if PY_MAJOR_VERSION < 3 py_name = PyString_FromString(class_name); #else py_name = PyUnicode_FromString(class_name); #endif if (!py_name) goto bad; result = PyObject_GetAttr(py_module, py_name); Py_DECREF(py_name); py_name = 0; Py_DECREF(py_module); py_module = 0; if (!result) goto bad; if (!PyType_Check(result)) { PyErr_Format(PyExc_TypeError, "%s.%s is not a type object", module_name, class_name); goto bad; } if (!strict && ((PyTypeObject *)result)->tp_basicsize > size) { PyOS_snprintf(warning, sizeof(warning), "%s.%s size changed, may indicate binary incompatibility", module_name, class_name); #if PY_VERSION_HEX < 0x02050000 PyErr_Warn(NULL, warning); #else PyErr_WarnEx(NULL, warning, 0); #endif } else if (((PyTypeObject *)result)->tp_basicsize != size) { PyErr_Format(PyExc_ValueError, "%s.%s has the wrong size, try recompiling", module_name, class_name); goto bad; } return (PyTypeObject *)result; bad: Py_XDECREF(py_module); Py_XDECREF(result); return 0; } #endif #ifndef __PYX_HAVE_RT_ImportModule #define __PYX_HAVE_RT_ImportModule static PyObject *__Pyx_ImportModule(const char *name) { PyObject *py_name = 0; PyObject *py_module = 0; #if PY_MAJOR_VERSION < 3 py_name = PyString_FromString(name); #else py_name = PyUnicode_FromString(name); #endif if (!py_name) goto bad; py_module = PyImport_Import(py_name); Py_DECREF(py_name); return py_module; bad: Py_XDECREF(py_name); return 0; } #endif #include "compile.h" #include "frameobject.h" #include "traceback.h" static void __Pyx_AddTraceback(const char *funcname) { PyObject *py_srcfile = 0; PyObject *py_funcname = 0; PyObject *py_globals = 0; PyCodeObject *py_code = 0; PyFrameObject *py_frame = 0; #if PY_MAJOR_VERSION < 3 py_srcfile = PyString_FromString(__pyx_filename); #else py_srcfile = PyUnicode_FromString(__pyx_filename); #endif if (!py_srcfile) goto bad; if (__pyx_clineno) { #if PY_MAJOR_VERSION < 3 py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, __pyx_clineno); #else py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, __pyx_clineno); #endif } else { #if PY_MAJOR_VERSION < 3 py_funcname = PyString_FromString(funcname); #else py_funcname = PyUnicode_FromString(funcname); #endif } if (!py_funcname) goto bad; py_globals = PyModule_GetDict(__pyx_m); if (!py_globals) goto bad; py_code = PyCode_New( 0, /*int argcount,*/ #if PY_MAJOR_VERSION >= 3 0, /*int kwonlyargcount,*/ #endif 0, /*int nlocals,*/ 0, /*int stacksize,*/ 0, /*int flags,*/ __pyx_empty_bytes, /*PyObject *code,*/ __pyx_empty_tuple, /*PyObject *consts,*/ __pyx_empty_tuple, /*PyObject *names,*/ __pyx_empty_tuple, /*PyObject *varnames,*/ __pyx_empty_tuple, /*PyObject *freevars,*/ __pyx_empty_tuple, /*PyObject *cellvars,*/ py_srcfile, /*PyObject *filename,*/ py_funcname, /*PyObject *name,*/ __pyx_lineno, /*int firstlineno,*/ __pyx_empty_bytes /*PyObject *lnotab*/ ); if (!py_code) goto bad; py_frame = PyFrame_New( PyThreadState_GET(), /*PyThreadState *tstate,*/ py_code, /*PyCodeObject *code,*/ py_globals, /*PyObject *globals,*/ 0 /*PyObject *locals*/ ); if (!py_frame) goto bad; py_frame->f_lineno = __pyx_lineno; PyTraceBack_Here(py_frame); bad: Py_XDECREF(py_srcfile); Py_XDECREF(py_funcname); Py_XDECREF(py_code); Py_XDECREF(py_frame); } static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) { while (t->p) { #if PY_MAJOR_VERSION < 3 if (t->is_unicode) { *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL); } else if (t->intern) { *t->p = PyString_InternFromString(t->s); } else { *t->p = PyString_FromStringAndSize(t->s, t->n - 1); } #else /* Python 3+ has unicode identifiers */ if (t->is_unicode | t->is_str) { if (t->intern) { *t->p = PyUnicode_InternFromString(t->s); } else if (t->encoding) { *t->p = PyUnicode_Decode(t->s, t->n - 1, t->encoding, NULL); } else { *t->p = PyUnicode_FromStringAndSize(t->s, t->n - 1); } } else { *t->p = PyBytes_FromStringAndSize(t->s, t->n - 1); } #endif if (!*t->p) return -1; ++t; } return 0; } /* Type Conversion Functions */ static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) { int is_true = x == Py_True; if (is_true | (x == Py_False) | (x == Py_None)) return is_true; else return PyObject_IsTrue(x); } static CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x) { PyNumberMethods *m; const char *name = NULL; PyObject *res = NULL; #if PY_VERSION_HEX < 0x03000000 if (PyInt_Check(x) || PyLong_Check(x)) #else if (PyLong_Check(x)) #endif return Py_INCREF(x), x; m = Py_TYPE(x)->tp_as_number; #if PY_VERSION_HEX < 0x03000000 if (m && m->nb_int) { name = "int"; res = PyNumber_Int(x); } else if (m && m->nb_long) { name = "long"; res = PyNumber_Long(x); } #else if (m && m->nb_int) { name = "int"; res = PyNumber_Long(x); } #endif if (res) { #if PY_VERSION_HEX < 0x03000000 if (!PyInt_Check(res) && !PyLong_Check(res)) { #else if (!PyLong_Check(res)) { #endif PyErr_Format(PyExc_TypeError, "__%s__ returned non-%s (type %.200s)", name, name, Py_TYPE(res)->tp_name); Py_DECREF(res); return NULL; } } else if (!PyErr_Occurred()) { PyErr_SetString(PyExc_TypeError, "an integer is required"); } return res; } static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { Py_ssize_t ival; PyObject* x = PyNumber_Index(b); if (!x) return -1; ival = PyInt_AsSsize_t(x); Py_DECREF(x); return ival; } static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) { #if PY_VERSION_HEX < 0x02050000 if (ival <= LONG_MAX) return PyInt_FromLong((long)ival); else { unsigned char *bytes = (unsigned char *) &ival; int one = 1; int little = (int)*(unsigned char*)&one; return _PyLong_FromByteArray(bytes, sizeof(size_t), little, 0); } #else return PyInt_FromSize_t(ival); #endif } static CYTHON_INLINE size_t __Pyx_PyInt_AsSize_t(PyObject* x) { unsigned PY_LONG_LONG val = __Pyx_PyInt_AsUnsignedLongLong(x); if (unlikely(val == (unsigned PY_LONG_LONG)-1 && PyErr_Occurred())) { return (size_t)-1; } else if (unlikely(val != (unsigned PY_LONG_LONG)(size_t)val)) { PyErr_SetString(PyExc_OverflowError, "value too large to convert to size_t"); return (size_t)-1; } return (size_t)val; } #endif /* Py_PYTHON_H */ mayavi-4.5.0/tvtk/src/array_ext.pyx0000644000076500000240000001136312747716314017751 0ustar prabhustaff00000000000000""" A Pyrex extension module for numpy. Currently this extension module allows us to massage a 2D scipy array into a form usable as a `vtkIdTypeArray`. This is then used to set the cells of a `vtkCellArray` instance. """ # Author: Prabhu Ramachandran # Copyright (c) 2005-2007, Enthought, Inc. # License: BSD Style. import numpy ###################################################################### # External declarations. ###################################################################### # Expose various external interfaces needed subsequently. cdef extern from "numpy/arrayobject.h": ctypedef int intp struct PyArray_Descr: int type_num, elsize char type ctypedef extern class numpy.ndarray [object PyArrayObject]: cdef char *data cdef int nd cdef intp *dimensions cdef intp *strides cdef object base cdef PyArray_Descr *descr cdef int flags void import_array() import_array() ###################################################################### # Internal C functions. ###################################################################### cdef c_set_id_type_array(ndarray id_array, ndarray out_array): # This function sets the data of the passed 2D `id_array` into the # passed out_array such that out_array can be used as a # `vtkIdTypeArray`. # # `id_array` need not be contiguous. # # No type or size checking is done here. All that is done in the # Python function upstream that calls this. cdef int cell_length, dim0 cdef int *id_data cdef int *out_data cdef int stride0, stride1 cell_length = id_array.dimensions[1]; dim0 = id_array.dimensions[0] id_data = id_array.data out_data = out_array.data stride0 = id_array.strides[0]/sizeof(int) stride1 = id_array.strides[1]/sizeof(int) cdef int i, j, in_idx, out_idx for i from 0 <= i < dim0: in_idx = i*stride0 out_idx = i*cell_length + i out_data[out_idx] = cell_length for j from 0 <= j < cell_length: out_data[out_idx + j + 1] = id_data[in_idx + j*stride1] cdef c_set_id_type_array_long(ndarray id_array, ndarray out_array): # This function sets the data of the passed 2D `id_array` into the # passed out_array such that out_array can be used as a # `vtkIdTypeArray`. # # `id_array` need not be contiguous. # # No type or size checking is done here. All that is done in the # Python function upstream that calls this. cdef Py_ssize_t cell_length, dim0 cdef Py_ssize_t *id_data cdef Py_ssize_t *out_data cdef Py_ssize_t stride0, stride1 cell_length = id_array.dimensions[1]; dim0 = id_array.dimensions[0] id_data = id_array.data out_data = out_array.data stride0 = id_array.strides[0]/sizeof(Py_ssize_t) stride1 = id_array.strides[1]/sizeof(Py_ssize_t) cdef int i, j, in_idx, out_idx for i from 0 <= i < dim0: in_idx = i*stride0 out_idx = i*cell_length + i out_data[out_idx] = cell_length for j from 0 <= j < cell_length: out_data[out_idx + j + 1] = id_data[in_idx + j*stride1] ###################################################################### # Exported (externally visible) functions. ###################################################################### def set_id_type_array(id_array, out_array): """Given a 2D Int array (`id_array`), and a contiguous 1D numarray array (`out_array`) having the correct size, this function sets the data from `id_array` into `out_array` so that it can be used in place of a `vtkIdTypeArray` in order to set the cells of a `vtkCellArray`. Note that if `shape = id_array.shape` then `size(out_array) == shape[0]*(shape[1] + 1)` should be true. If not you'll get an `AssertionError`. `id_array` need not be contiguous but `out_array` must be. """ import vtk VTK_ID_TYPE_SIZE = vtk.vtkIdTypeArray().GetDataTypeSize() assert numpy.issubdtype(id_array.dtype, numpy.signedinteger) and \ id_array.dtype.itemsize == VTK_ID_TYPE_SIZE assert out_array.flags.contiguous == 1, \ "out_array must be contiguous." shp = id_array.shape assert len(shp) == 2, "id_array must be a two dimensional array." sz = numpy.size(out_array) e_sz = shp[0]*(shp[1]+1) assert sz == e_sz, \ "out_array size is incorrect, expected: %s, given: %s"%(e_sz, sz) if VTK_ID_TYPE_SIZE == 4: c_set_id_type_array(id_array, out_array) elif VTK_ID_TYPE_SIZE == 8: c_set_id_type_array_long(id_array, out_array) else: raise ValueError('Unsupported VTK_ID_TYPE_SIZE=%d'\ %VTK_ID_TYPE_SIZE) mayavi-4.5.0/tvtk/tests/0000755000076500000240000000000012747722127015557 5ustar prabhustaff00000000000000mayavi-4.5.0/tvtk/tests/__init__.py0000644000076500000240000000000012747716314017657 0ustar prabhustaff00000000000000mayavi-4.5.0/tvtk/tests/common.py0000644000076500000240000000344712747716314017432 0ustar prabhustaff00000000000000""" Test utilities """ # Authors: Deepak Surti, Ioannis Tziakos # Copyright (c) 2015, Enthought, Inc. # License: BSD Style. import contextlib import gc import unittest import weakref @contextlib.contextmanager def restore_gc_state(): """Ensure that gc state is restored on exit of the with statement.""" originally_enabled = gc.isenabled() try: yield finally: if originally_enabled: gc.enable() else: gc.disable() class TestGarbageCollection(unittest.TestCase): """ This is a base class to use when testing garbage collection. See: tvtk.tests.test_garbage_collection mayavi.tests.test_garbage_collection """ def check_object_garbage_collected(self, obj_create_fn, obj_close_fn=None): """ Call this from a test function to test for garbage collection passing the following parameters: obj_create_fn: function A function with no parameters that creates the object obj_close_fn: function A function of 1 parameter which is the object created by obj_create_fn, to handling the object closing, if any. """ # given object_collected = [] object_weakref = None def object_collected_callback(weakref): object_collected.append(True) def do(): obj = obj_create_fn() reference = weakref.ref(obj, object_collected_callback) if obj_close_fn: obj_close_fn(obj) return reference # when with restore_gc_state(): gc.disable() object_weakref = do() # The object should have been collected. self.assertTrue(object_collected[0]) self.assertIsNone(object_weakref()) mayavi-4.5.0/tvtk/tests/test_array_ext.py0000644000076500000240000000400512747716314021166 0ustar prabhustaff00000000000000"""Unit tests for the array related extension code. """ # Author: Prabhu Ramachandran # Copyright (c) 2005, Enthought, Inc. # License: BSD Style. import unittest import numpy from tvtk.array_handler import ID_TYPE_CODE from tvtk.array_ext import set_id_type_array class TestArrayExt(unittest.TestCase): def test_set_id_type_array(self): N = 5 a = numpy.zeros((N,4), ID_TYPE_CODE) a[:,1] = 1 a[:,2] = 2 a[:,3] = 3 def diff_arr(x, y): return numpy.sum(numpy.ravel(x) - numpy.ravel(y[:,1:])) # Test contiguous arrays. b = numpy.zeros((N,5), ID_TYPE_CODE) set_id_type_array(a, b) self.assertEqual(diff_arr(a, b), 0) # Test non-contiguous arrays. b = numpy.zeros((N,3), ID_TYPE_CODE) set_id_type_array(a[:,::2], b) self.assertEqual(diff_arr(a[:,::2], b), 0) # Test 1D array. b = numpy.zeros(N*5, ID_TYPE_CODE) set_id_type_array(a, b) self.assertEqual(diff_arr(a, numpy.reshape(b, (N,5))), 0) # Test assertions. d = a.astype('d') b = numpy.zeros((N, 5), ID_TYPE_CODE) self.assertRaises(AssertionError, set_id_type_array, d, b) # B should b contiguous. b = numpy.zeros((N, 10), ID_TYPE_CODE) self.assertRaises(AssertionError, set_id_type_array, a, b[:,::2]) self.assertRaises(AssertionError, set_id_type_array, a[0], b) # Test size check assertion. b = numpy.zeros((N, 4), ID_TYPE_CODE) self.assertRaises(AssertionError, set_id_type_array, a, b) b = numpy.zeros(N*6, ID_TYPE_CODE) self.assertRaises(AssertionError, set_id_type_array, a, b) # This should work! set_id_type_array(a, b[:N*5]) self.assertEqual(diff_arr(a, numpy.reshape(b[:N*5], (N,5))), 0) if __name__ == "__main__": unittest.main() mayavi-4.5.0/tvtk/tests/test_array_handler.py0000644000076500000240000004204212747716314022006 0ustar prabhustaff00000000000000""" Tests for array_handler.py. """ # Author: Prabhu Ramachandran # Copyright (c) 2005-2008, Enthought, Inc. # License: BSD Style. import unittest import vtk import numpy from tvtk import array_handler from tvtk import tvtk_base # FIXME: test_tvtk_base.py is in the local directory so just doing # from test_tvtk_base import Prop # should be enough, however nose 0.9.3 will not find it, unless you give # it the full path. It nose 0.10.3 works fine in this respect. from tvtk.tests.test_tvtk_base import Prop def mysum(arr): val = arr while type(val) == numpy.ndarray: val = numpy.sum(val) return val class TestArrayHandler(unittest.TestCase): def _check_arrays(self, arr, vtk_arr): self.assertEqual(vtk_arr.GetNumberOfTuples(), len(arr)) if len(arr.shape) == 2: dim1 = arr.shape[1] self.assertEqual(vtk_arr.GetNumberOfComponents(), dim1) for i in range(len(arr)): if dim1 in [1,2,3,4,9]: res = getattr(vtk_arr, 'GetTuple%s'%dim1)(i) self.assertEqual(numpy.sum(res - arr[i]), 0) else: res = [vtk_arr.GetComponent(i, j) for j in range(dim1)] self.assertEqual(numpy.sum(res - arr[i]), 0) else: if arr.dtype.char == 'c': for i in range(len(arr)): self.assertEqual(chr(int(vtk_arr.GetTuple1(i))), arr[i]) else: for i in range(len(arr)): self.assertEqual(vtk_arr.GetTuple1(i), arr[i]) def test_array2vtk(self): """Test Numeric array to VTK array conversion and vice-versa.""" # Put all the test arrays here. t_z = [] # Test the different types of arrays. t_z.append(numpy.array([-128, 0, 127], numpy.int8)) # FIXME: character arrays are a problem since there is no # unique mapping to a VTK data type and back. #t_z.append(numpy.array([-128, 0, 127], numpy.character)) t_z.append(numpy.array([-32768, 0, 32767], numpy.int16)) t_z.append(numpy.array([-2147483648, 0, 2147483647], numpy.int32)) t_z.append(numpy.array([0, 255], numpy.uint8)) t_z.append(numpy.array([0, 65535], numpy.uint16)) t_z.append(numpy.array([0, 4294967295], numpy.uint32)) t_z.append(numpy.array([-1.0e38, 0, 1.0e38], 'f')) t_z.append(numpy.array([-1.0e299, 0, 1.0e299], 'd')) # Check multi-component arrays. t_z.append(numpy.array([[1], [2], [300]], 'd')) t_z.append(numpy.array([[1, 20], [300, 4000]], 'd')) t_z.append(numpy.array([[1, 2, 3], [4, 5, 6]], 'f')) t_z.append(numpy.array([[1, 2, 3],[4, 5, 6]], 'd')) t_z.append(numpy.array([[1, 2, 3, 400],[4, 5, 6, 700]], 'd')) t_z.append(numpy.array([list(range(9)),list(range(10,19))], 'f')) # Test if a Python list also works. t_z.append(numpy.array([[1., 2., 3., 400.],[4, 5, 6, 700]], 'd')) # Test if arrays with number of components not in [1,2,3,4,9] work. t_z.append(numpy.array([[1, 2, 3, 400, 5000], [4, 5, 6, 700, 8000]], 'd')) t_z.append(numpy.array([list(range(10)), list(range(10,20))], 'd')) for z in t_z: vtk_arr = array_handler.array2vtk(z) # Test for memory leaks. self.assertEqual(vtk_arr.GetReferenceCount(), array_handler.BASE_REFERENCE_COUNT) self._check_arrays(z, vtk_arr) z1 = array_handler.vtk2array(vtk_arr) if len(z.shape) == 1: self.assertEqual(len(z1.shape), 1) if z.dtype.char != 'c': #print z1 self.assertEqual(sum(numpy.ravel(z) - numpy.ravel(z1)), 0) else: #print z1.astype('c') self.assertEqual(z, z1.astype('c')) # Check if type conversion works correctly. z = numpy.array([-128, 0, 127], numpy.int8) vtk_arr = vtk.vtkDoubleArray() ident = id(vtk_arr) vtk_arr = array_handler.array2vtk(z, vtk_arr) # Make sure this is the same array! self.assertEqual(ident, id(vtk_arr)) self._check_arrays(z, vtk_arr) # Check the vtkBitArray. vtk_arr = vtk.vtkBitArray() vtk_arr.InsertNextValue(0) vtk_arr.InsertNextValue(1) vtk_arr.InsertNextValue(0) vtk_arr.InsertNextValue(1) arr = array_handler.vtk2array(vtk_arr) self.assertEqual(numpy.sum(arr - [0,1,0,1]), 0) vtk_arr = array_handler.array2vtk(arr, vtk_arr) self.assertEqual(vtk_arr.GetValue(0), 0) self.assertEqual(vtk_arr.GetValue(1), 1) self.assertEqual(vtk_arr.GetValue(2), 0) self.assertEqual(vtk_arr.GetValue(3), 1) # ---------------------------------------- # Test if the array is copied or not. a = numpy.array([[1, 2, 3],[4, 5, 6]], 'd') vtk_arr = array_handler.array2vtk(a) # Change the numpy array and see if the changes are # reflected in the VTK array. a[0] = [10.0, 20.0, 30.0] self.assertEqual(vtk_arr.GetTuple3(0), (10., 20., 30.)) # Make sure the cache is doing its job. key = vtk_arr.__this__ z = array_handler._array_cache.get(vtk_arr) self.assertEqual(numpy.sum(z - numpy.ravel(a)), 0.0) l1 = len(array_handler._array_cache) # del the Numeric array and see if this still works. del a self.assertEqual(vtk_arr.GetTuple3(0), (10., 20., 30.)) # Check the cache -- just making sure. self.assertEqual(len(array_handler._array_cache), l1) # Delete the VTK array and see if the cache is cleared. del vtk_arr self.assertEqual(len(array_handler._array_cache), l1-1) self.assertEqual(key in array_handler._array_cache._cache, False) # Make sure bit arrays are copied. vtk_arr = vtk.vtkBitArray() a = numpy.array([0,1,0,1], numpy.int32) vtk_arr = array_handler.array2vtk(a, vtk_arr) del a self.assertEqual(vtk_arr.GetValue(0), 0) self.assertEqual(vtk_arr.GetValue(1), 1) self.assertEqual(vtk_arr.GetValue(2), 0) self.assertEqual(vtk_arr.GetValue(3), 1) # Make sure the code at least runs for all the non-complex # numerical dtypes in numpy. for dtype in (numpy.sctypes['int'] + numpy.sctypes['uint'] + numpy.sctypes['float']): array_handler.array2vtk(numpy.zeros((1,), dtype=dtype)) def test_arr2cell_array(self): """Test Numeric array to vtkCellArray conversion.""" # Test list of lists. a = [[0], [1, 2], [3, 4, 5], [6, 7, 8, 9]] cells = array_handler.array2vtkCellArray(a) z = numpy.array([1, 0, 2, 1,2, 3, 3,4,5, 4, 6,7,8,9]) arr = array_handler.vtk2array(cells.GetData()) self.assertEqual(numpy.sum(arr - z), 0) self.assertEqual(len(arr.shape), 1) self.assertEqual(len(arr), 14) # Test if optional argument stuff also works. cells = vtk.vtkCellArray() ident = id(cells) cells = array_handler.array2vtkCellArray(a, cells) self.assertEqual(id(cells), ident) arr = array_handler.vtk2array(cells.GetData()) self.assertEqual(numpy.sum(arr - z), 0) self.assertEqual(cells.GetNumberOfCells(), 4) # Make sure this resets the cell array and does not add to the # existing list! cells = array_handler.array2vtkCellArray(a, cells) self.assertEqual(cells.GetNumberOfCells(), 4) # Test Numeric array handling. N = 3 a = numpy.zeros((N,3), numpy.int) a[:,1] = 1 a[:,2] = 2 cells = array_handler.array2vtkCellArray(a) arr = array_handler.vtk2array(cells.GetData()) expect = numpy.array([3, 0, 1, 2]*3, numpy.int) self.assertEqual(numpy.alltrue(numpy.equal(arr, expect)), True) self.assertEqual(cells.GetNumberOfCells(), N) # Test if a list of Numeric arrays of different cell lengths works. l_a = [a[:,:1], a, a[:2,:2]] cells = array_handler.array2vtkCellArray(l_a) arr = array_handler.vtk2array(cells.GetData()) expect = numpy.array([1, 0]*3 + [3, 0, 1, 2]*3 + [2, 0,1]*2, numpy.int) self.assertEqual(numpy.alltrue(numpy.equal(arr, expect)), True) self.assertEqual(cells.GetNumberOfCells(), N*2 + 2) # This should not take a long while. This merely tests if a # million cells can be created rapidly. N = int(1e6) a = numpy.zeros((N,3), numpy.int) a[:,1] = 1 a[:,2] = 2 cells = array_handler.array2vtkCellArray(a) self.assertEqual(cells.GetNumberOfCells(), N) def test_arr2vtkPoints(self): """Test Numeric array to vtkPoints conversion.""" a = [[0.0, 0.0, 0.0], [1.0, 1.0, 1.0]] p = array_handler.array2vtkPoints(a) self.assertEqual(p.GetPoint(0), (0.0, 0.0, 0.0)) self.assertEqual(p.GetPoint(1), (1.0, 1.0, 1.0)) p = vtk.vtkPoints() ident = id(p) p = array_handler.array2vtkPoints(numpy.array(a), p) self.assertEqual(p.GetPoint(0), (0.0, 0.0, 0.0)) self.assertEqual(p.GetPoint(1), (1.0, 1.0, 1.0)) self.assertEqual(id(p), ident) self.assertRaises(AssertionError, array_handler.array2vtkPoints, [0.0, 1.0]) self.assertRaises(AssertionError, array_handler.array2vtkPoints, [0.0, 1.0, 1.0]) def test_arr2vtkIdList(self): """Test array to vtkIdList conversion.""" a = [1, 2, 3, 4, 5] p = array_handler.array2vtkIdList(a) for i, j in enumerate(a): self.assertEqual(p.GetId(i), j) p = vtk.vtkIdList() ident = id(p) p = array_handler.array2vtkIdList(numpy.array(a), p) for i, j in enumerate(a): self.assertEqual(p.GetId(i), j) self.assertEqual(id(p), ident) self.assertRaises(AssertionError, array_handler.array2vtkIdList, [[1,2,3]]) def test_get_correct_sig(self): """Test multiple signature cases that have array arguments.""" obj = tvtk_base.TVTKBase(vtk.vtkIdTypeArray) sigs = [ None, [['vtkDataArray']], [['int', 'vtkIdList']], [['int', 'vtkPoints'], ['int', 'int']], [['int', 'vtkPoints'], ['int']], [['int'], ['int', 'vtkPoints']], [['int', 'vtkDataArray'], ['int', 'int']], [['int', 'vtkDataArray'], ['int', 'int']], [['vtkIdList', 'vtkCellArray'], ['int', 'vtkPoints'], ['int', 'vtkDataArray']], [['vtkIdList', 'vtkCellArray'], ['int', 'vtkPoints'], ['int', 'vtkDataArray']], [['vtkIdTypeArray', 'vtkCellArray'], ['int', 'vtkPoints'], ['int', 'vtkDataArray']], [['vtkIdTypeArray', 'vtkCellArray'], ['int', 'vtkPoints'], ['int', 'vtkDataArray']], [['vtkIdTypeArray', 'vtkCellArray'], ['int', 'vtkPoints'], ['int', ('float', 'float', 'float')]], ] args = [ [1], # No sig info. ['foo'], # One sig. [1], # One sig. [1], # Error [1], # Only one valid sig. [1,[1,1,1]], # Only one valid sig. [1, [1,1,1]], # Multiple valid sigs. [1,1], # No arrays! [1,1], # No match so returns None. [1, [1,1,1]], # ambiguous, pick first match. [numpy.array([1,1]), [1,1,1]], # Match! [obj, [2,1,2,3]], # TVTK array object, match. [[2,1,2,3], obj], # TVTK array object, match but has # wrong argument. Should be caught # by VTK. ] res = [ None, ['vtkDataArray'], ['int', 'vtkIdList'], TypeError, ['int'], ['int', 'vtkPoints'], ['int', 'vtkDataArray'], None, None, ['int', 'vtkPoints'], ['vtkIdTypeArray', 'vtkCellArray'], ['vtkIdTypeArray', 'vtkCellArray'], ['vtkIdTypeArray', 'vtkCellArray'], ] for i in range(len(sigs)): if res[i] is TypeError: self.assertRaises(res[i], array_handler.get_correct_sig, args[i], sigs[i]) else: s = array_handler.get_correct_sig(args[i], sigs[i]) #print s, res[i] self.assertEqual(s, res[i]) def test_deref_array(self): """Test if dereferencing array args works correctly.""" sigs = [[['vtkDataArray']], [['vtkFloatArray']], [['vtkCellArray']], [['vtkPoints']], [['int', 'vtkIdList']], [['int', ('float', 'float'), 'vtkDataArray']], [['Prop', 'int', 'vtkDataArray']], [['Points', ('float', 'float', 'float')]] ] args = [[[1,2,3]], [[0,0,0]], [[[1,2,3],[4,5,6]]], [[[0.,0.,0.], [1.,1.,1.]]], [1, [1,2,3]], [1, (0.0, 0.0), [1.0, 1.0, 1.0]], [Prop(), 1, numpy.array([1.0, 1.0, 1.0])], [[[1,2,3]], [1,2,3]] ] r = array_handler.deref_array(args[0], sigs[0]) self.assertEqual(mysum(array_handler.vtk2array(r[0]) -args[0]), 0) r = array_handler.deref_array(args[1], sigs[1]) self.assertEqual(mysum(array_handler.vtk2array(r[0]) - args[1]), 0) r = array_handler.deref_array(args[2], sigs[2]) self.assertEqual(r[0].GetNumberOfCells(), 2) r = array_handler.deref_array(args[3], sigs[3]) self.assertEqual(mysum(array_handler.vtk2array(r[0].GetData()) - numpy.array(args[3], 'f')), 0) r = array_handler.deref_array(args[4], sigs[4]) self.assertEqual(r[0], 1) self.assertEqual(r[1].__class__.__name__, 'vtkIdList') r = array_handler.deref_array(args[5], sigs[5]) self.assertEqual(r[0], 1) self.assertEqual(r[1], (0.0, 0.0)) self.assertEqual(mysum(array_handler.vtk2array(r[2]) -args[5][2]), 0) r = array_handler.deref_array(args[6], sigs[6]) self.assertEqual(r[0].IsA('vtkProperty'), True) self.assertEqual(r[1], 1) self.assertEqual(mysum(array_handler.vtk2array(r[2]) -args[6][2]), 0) r = array_handler.deref_array(args[7], sigs[7]) def test_reference_to_array(self): """Does to_array return an existing array instead of a new copy.""" arr = numpy.arange(0.0, 10.0, 0.1) arr = numpy.reshape(arr, (25, 4)) vtk_arr = array_handler.array2vtk(arr) arr1 = array_handler.vtk2array(vtk_arr) # Now make sure these are using the same memory. arr[0][0] = 100.0 self.assertEqual(arr[0][0], arr1[0][0]) self.assertEqual(arr.shape, arr1.shape) def test_array_cache(self): """Test the ArrayCache class.""" cache = array_handler.ArrayCache() # Test if len works. self.assertEqual(len(cache), 0) arr = numpy.zeros(100, float) varr = vtk.vtkFloatArray() # test contains self.assertEqual(varr not in cache, True) cache.add(varr, arr) self.assertEqual(len(cache), 1) self.assertEqual(varr in cache, True) # Test the get method. self.assertEqual(cache.get(varr) is arr, True) # Test if the cache is cleared when the array is deleted. del varr self.assertEqual(len(cache), 0) def test_vtk2array_appended_array(self): """Test the vtk2array can tolerate appending a cached array.""" # array is cached upon array2vtk is called arr = numpy.arange(8).reshape(2, 4) vtk_arr = array_handler.array2vtk(arr) arr1 = array_handler.vtk2array(vtk_arr) # the vtk array is appended, shapes don't match cached array anymore extra_row = (1, 2, 3, 4) vtk_arr.InsertTuple4(2, *extra_row) # arr2 has a different shape arr2 = array_handler.vtk2array(vtk_arr) self.assertEqual(arr2.shape, (3, 4)) # check values expected = numpy.vstack((arr, numpy.array(extra_row))) self.assertEqual(numpy.sum(arr2 - expected), 0) def test_id_array(self): """Test if a vtkIdTypeArray is converted correctly.""" arr = vtk.vtkIdTypeArray() arr.SetNumberOfTuples(10) for i in range(10): arr.SetValue(i, i) np = array_handler.vtk2array(arr) self.assertEqual(numpy.all(np == list(range(10))), True) if __name__ == "__main__": unittest.main() mayavi-4.5.0/tvtk/tests/test_class_tree.py0000644000076500000240000001525012747716314021320 0ustar prabhustaff00000000000000# Author: Prabhu Ramachandran # License: BSD style # Copyright (c) 2004, Enthought, Inc. """Tests class_tree.py. Uses the vtk module to test the code. Also tests if the tree generation works for the __builtin__ module. """ import sys import unittest from contextlib import contextmanager from tvtk import class_tree import vtk if sys.version_info[0] > 2: import builtins as __builtin__ else: import __builtin__ # This computation can be expensive, so we cache it. _cache = class_tree.ClassTree(vtk) _cache.create() vtk_major_version = vtk.vtkVersion.GetVTKMajorVersion() def get_level(klass): """Gets the inheritance level of a given class.""" if not klass.__bases__: return 0 else: return max([get_level(b) for b in klass.__bases__]) + 1 class TestClassTree(unittest.TestCase): def setUp(self): self.t = _cache @contextmanager def _remove_loader_from_builtin(self): self._loader = None if hasattr(__builtin__, '__loader__'): self._loader = __builtin__.__loader__ del __builtin__.__loader__ try: yield finally: if self._loader: __builtin__.__loader__ = self._loader def test_basic_vtk(self): """Basic tests for the VTK module.""" t = self.t self.assertEqual(t.get_node('vtkObject').name, 'vtkObject') self.assertEqual(t.get_node('vtkObject').parents[0].name, 'vtkObjectBase') if (hasattr(vtk, 'vtkTuple')): names = [x.name for x in t.tree[0]] names.sort() if vtk_major_version < 6: expect = ['object', 'vtkColor3', 'vtkColor4', 'vtkDenseArray', 'vtkObjectBase', 'vtkRect', 'vtkSparseArray', 'vtkTuple', 'vtkTypedArray', 'vtkVector', 'vtkVector2', 'vtkVector3'] elif len(vtk.vtkObjectBase.__bases__) > 0: if vtk_major_version == 7: expect = ['object', 'vtkColor3', 'vtkColor4', 'vtkDenseArray', 'vtkQuaternion', 'vtkRect', 'vtkSparseArray', 'vtkTuple', 'vtkTypedArray', 'vtkVariantStrictWeakOrderKey', 'vtkVector', 'vtkVector2', 'vtkVector3'] else: expect = ['object', 'vtkColor3', 'vtkColor4', 'vtkDenseArray', 'vtkQuaternion', 'vtkRect', 'vtkSparseArray', 'vtkTuple', 'vtkTypedArray', 'vtkVector', 'vtkVector2', 'vtkVector3'] else: expect = ['object', 'vtkColor3', 'vtkColor4', 'vtkDenseArray', 'vtkObjectBase', 'vtkQuaternion', 'vtkRect', 'vtkSparseArray', 'vtkTuple', 'vtkTypedArray', 'vtkVector', 'vtkVector2', 'vtkVector3'] self.assertEqual(names, expect) elif (hasattr(vtk, 'vtkVector')): self.assertEqual(len(t.tree[0]), 11) names = [x.name for x in t.tree[0]] names.sort() expect = ['object', 'vtkColor3', 'vtkColor4', 'vtkDenseArray', 'vtkObjectBase', 'vtkRect', 'vtkSparseArray', 'vtkTypedArray', 'vtkVector', 'vtkVector2', 'vtkVector3'] self.assertEqual(names, expect) elif (hasattr(vtk, 'vtkArrayCoordinates') and issubclass(vtk.vtkArrayCoordinates, object)): self.assertEqual(len(t.tree[0]), 2) names = [x.name for x in t.tree[0]] names.sort() self.assertEqual(names, ['object', 'vtkObjectBase']) else: self.assertEqual(len(t.tree[0]), 1) self.assertEqual(t.tree[0][0].name, 'vtkObjectBase') def test_ancestors(self): """Check if get_ancestors is OK.""" # The parent child information is already tested so this test # needs to ensure that the method works for a few known # examples. # Simple VTK test. t = self.t n = t.get_node('vtkDataArray') x = vtk.vtkDataArray ancestors = [] while x.__name__ != 'vtkObjectBase': x = x.__bases__[0] ancestors.append(x.__name__) if len(vtk.vtkObjectBase.__bases__) > 0: ancestors.append('object') self.assertEqual([x.name for x in n.get_ancestors()], ancestors) def _get_ancestors(klass): bases = [] for base in klass.__bases__: bases.append(base) bases.extend(_get_ancestors(base)) return bases # Simple __builtin__ test. with self._remove_loader_from_builtin(): t = class_tree.ClassTree(__builtin__) t.create() n = t.get_node('TabError') bases = [x.__name__ for x in _get_ancestors(TabError)] self.assertEqual([x.name for x in n.get_ancestors()], bases) def test_parent_child(self): """Check if the node's parent and children are correct.""" t = self.t for node in t: n_class = t.get_class(node.name) base_names = [x.__name__ for x in n_class.__bases__] base_names.sort() parent_names = [x.name for x in node.parents] parent_names.sort() self.assertEqual(base_names, parent_names) for c in node.children: c_class = t.get_class(c.name) base_names = [x.__name__ for x in c_class.__bases__] self.assertEqual(node.name in base_names, True) def test_level(self): """Check the node levels.""" t = self.t for node in t: self.assertEqual(get_level(t.get_class(node.name)), node.level) def test_tree(self): """Check the tree structure.""" t = self.t n = sum([len(x) for x in t.tree]) self.assertEqual(n, len(t.nodes)) for level, nodes in enumerate(t.tree): for n in nodes: self.assertEqual(n.level, level) def test_builtin(self): """Check if tree structure for __builtin__ works.""" # This tests to see if the tree structure generation works for # the __builtin__ module. with self._remove_loader_from_builtin(): t = class_tree.ClassTree(__builtin__) t.create() self.t = t self.test_parent_child() self.test_level() self.test_tree() if __name__ == "__main__": unittest.main() mayavi-4.5.0/tvtk/tests/test_ctf_util.py0000644000076500000240000000442112747716314021003 0ustar prabhustaff00000000000000"""Simple tests for the color transfer function utilities in tvtk.""" import unittest from tvtk.util.ctf import (load_ctfs, save_ctfs, \ rescale_ctfs, ColorTransferFunction, PiecewiseFunction) from tvtk.api import tvtk def make_volume_prop(mins=255, maxs=355): """Make a volume property for the testing.""" table = tvtk.VolumeProperty() ctf = ColorTransferFunction() ds = (maxs-mins)/4.0 try: ctf.range = (mins, maxs) except Exception: # VTK versions < 5.2 don't seem to need this. pass ctf.add_rgb_point(mins, 0.00, 0.0, 1.00) ctf.add_rgb_point(mins+ds, 0.25, 0.5, 0.75) ctf.add_rgb_point(mins+2*ds, 0.50, 1.0, 0.50) ctf.add_rgb_point(mins+3*ds, 0.75, 0.5, 0.25) ctf.add_rgb_point(maxs, 1.00, 0.0, 0.00) otf = PiecewiseFunction() otf.add_point(mins, 0.0) otf.add_point(maxs, 0.2) table.set_color(ctf) table.set_scalar_opacity(otf) return table, ctf, otf ################################################################################ # `TestCTFUtil` class. ################################################################################ class TestCTFUtil(unittest.TestCase): def setUp(self): """Called before every test is run.""" vp, ctf, otf = make_volume_prop() self.vp = vp self.ctf = ctf self.otf = otf def tearDown(self): """Called after the test is run.""" return def test_save_load_ctf(self): """Test saving and loading of a CTF.""" # Create a default ctf, save it. data = save_ctfs(self.vp) # load it into another volume property, mvp = tvtk.VolumeProperty() ctf = load_ctfs(data, mvp) # get the data from the new one mdata = save_ctfs(mvp) # check that both the data are identical. self.assertEqual(mdata, data) def test_rescale_ctf(self): """Test rescaling a CTF.""" # Expected data. evp, ectf, eotf = make_volume_prop(0.0, 1.0) edata = save_ctfs(evp) # Rescaled data. ctf, otf = rescale_ctfs(self.vp, (0.0, 1.0)) data = save_ctfs(self.vp) # check that both the data are identical. self.assertEqual(edata, data) if __name__ == '__main__': unittest.main() mayavi-4.5.0/tvtk/tests/test_garbage_collection.py0000644000076500000240000000344312747716314023000 0ustar prabhustaff00000000000000""" Tests for the garbage collection of objects in tvtk package. """ # Authors: Deepak Surti, Ioannis Tziakos # Copyright (c) 2015, Enthought, Inc. # License: BSD Style. import unittest from traits.etsconfig.api import ETSConfig from tvtk.pyface.tvtk_scene import TVTKScene from tvtk.pyface.api import DecoratedScene, Scene from tvtk.pyface.scene_model import SceneModel from tvtk.tests.common import TestGarbageCollection class TestTVTKGarbageCollection(TestGarbageCollection): """ See: tvtk.tests.common.TestGarbageCollection """ def test_tvtk_scene(self): """ Tests if TVTK scene can be garbage collected.""" def create_fn(): return TVTKScene() def close_fn(o): o.closing = True self.check_object_garbage_collected(create_fn, close_fn) @unittest.skipIf( ETSConfig.toolkit=='wx', 'Test segfaults using WX (issue #216)') def test_scene(self): """ Tests if Scene can be garbage collected.""" def create_fn(): return Scene() def close_fn(o): o.close() self.check_object_garbage_collected(create_fn, close_fn) @unittest.skipIf( ETSConfig.toolkit=='wx', 'Test segfaults using WX (issue #216)') def test_decorated_scene(self): """ Tests if Decorated Scene can be garbage collected.""" def create_fn(): return DecoratedScene(parent=None) def close_fn(o): o.closing = True self.check_object_garbage_collected(create_fn, close_fn) def test_scene_model(self): """ Tests if SceneModel can be garbage collected.""" def create_fn(): return SceneModel() def close_fn(o): o.closing = True self.check_object_garbage_collected(create_fn, close_fn) mayavi-4.5.0/tvtk/tests/test_indenter.py0000644000076500000240000002211612747716314021003 0ustar prabhustaff00000000000000"""Tests for indenter.py.""" # Author: Prabhu Ramachandran # License: BSD style # Copyright (c) 2004-2015, Enthought, Inc. import unittest try: import cStringIO except ImportError: import io as cStringIO from tvtk import indenter class TestIndent(unittest.TestCase): def test_basic(self): """Simple tests for indenter.""" id = indenter.Indent() self.assertEqual(str(id), '') id.incr() self.assertEqual(str(id), ' ') id.incr() self.assertEqual(str(id), ' ') id.decr() self.assertEqual(str(id), ' ') id.decr() self.assertEqual(str(id), '') id.incr(); id.incr() id.reset() self.assertEqual(str(id), '') def test_format(self): """Tests if formatting works ok.""" id = indenter.Indent() id.incr() # test one liner with trailing newlines txt = """class foo:\n\n \n \n""" t1 = id.format(txt) self.assertEqual(t1, ' class foo:\n') # test one liner with no trailing newline. txt = """class foo:""" t1 = id.format(txt) self.assertEqual(t1, ' class foo:\n') # test multi-line text. txt = """print "hi!" if name == 'hi': print "hi, hi!" """ res = """ print "hi!"\n if name == 'hi':\n print "hi, hi!"\n""" self.assertEqual(id.format(txt), res) txt = """ class Foo: def __init__(self): pass def _get_a(self): return self._a""" res = """ class Foo: def __init__(self): pass def _get_a(self): return self._a""" + '\n' self.assertEqual(id.format(txt), res) class TestVTKDocMassager(unittest.TestCase): def test_doc_massage(self): """Test massage method.""" doc = "This is a test. All VTK classes and vtk classes\n"\ "are named like this: vtkActor, vtkLODProperty,\n"\ "vtkXMLDataReader, vtk3DSImporter etc. The methods \n"\ "of a VTK object are like GetData, GetOutput, \n"\ "SetRepresentationToWireframe. Ivars are named like\n"\ "SpecularColor, Write3DPropsAsRasterImage etc." ret = "This is a test. All VTK classes and vtk classes\n"\ "are named like this: Actor, LODProperty,\n"\ "XMLDataReader, ThreeDSImporter etc. The methods \n"\ "of a VTK object are like get_data, get_output, \n"\ "set_representation_to_wireframe. Ivars are named like\n"\ "specular_color, write3d_props_as_raster_image etc." dm = indenter.VTKDocMassager() self.assertEqual(dm.massage(doc), ret) def test_rename_class(self): """Test if VTK classes are renamed correctly.""" dm = indenter.VTKDocMassager() t = 'vtkFooBar vtkXMLDataReader vtk3DSReader vtk2000Bug' r = dm._rename_class(t) correct = 'FooBar XMLDataReader ThreeDSReader Two000Bug' self.assertEqual(r, correct) def test_remove_sig(self): """Test if function signature is removed correctly.""" dm = indenter.VTKDocMassager() t = 'V.GetOutput(int) -> vtkStructuredPoints\n'\ 'C++: vtkStructuredPoints *GetOutput (int idx);\n'\ 'V.GetOutput() -> vtkStructuredPoints\n'\ 'C++: vtkStructuredPoints *GetOutput ();\n\n'\ ' Set/Get the output of this reader.\n' r = dm._remove_sig(t) correct = ' Set/Get the output of this reader.\n' self.assertEqual(r, correct) t = 'V.GetOutput(int) -> vtkStructuredPoints\n'\ 'C++: vtkStructuredPoints *GetOutput (int idx);\n'\ 'V.GetOutput() -> vtkStructuredPoints\n'\ 'C++: vtkStructuredPoints *GetOutput ();\n\n' r = dm._remove_sig(t) correct = '' self.assertEqual(r, correct) def test_class_doc(self): """Test if class docs are generated correctly.""" dm = indenter.VTKDocMassager() indent = indenter.Indent() out = cStringIO.StringIO() doc = "vtkLODProperty, vtkXMLDataReader, vtk3DSImporter\n"\ "SetRepresentationToWireframe, Write3DPropsAsRasterImage" dm.write_class_doc(doc, out, indent) out.seek(0) ret = out.read() correct = ''' """ LODProperty, XMLDataReader, ThreeDSImporter set_representation_to_wireframe, write3d_props_as_raster_image """\n''' #print ret #print correct self.assertEqual(ret, correct) # Test empty doc out = cStringIO.StringIO() doc = "" dm.write_class_doc(doc, out, indent) out.seek(0) ret = out.read() self.assertEqual(ret, ' """\n \n """\n') def test_trait_doc(self): """Test if trait docs are generated correctly.""" dm = indenter.VTKDocMassager() indent = indenter.Indent() out = cStringIO.StringIO() doc = 'V.GetOutput(int) -> vtkStructuredPoints\n'\ 'C++: vtkStructuredPoints *GetOutput (int idx);\n'\ 'V.GetOutput() -> vtkStructuredPoints\n'\ 'C++: vtkStructuredPoints *GetOutput ();\n\n'\ 'vtkLODProperty, vtkXMLDataReader, vtk3DSImporter\n'\ 'SetRepresentationToWireframe, Write3DPropsAsRasterImage' dm.write_trait_doc(doc, out, indent) out.seek(0) ret = out.read() correct = ''' """ LODProperty, XMLDataReader, ThreeDSImporter set_representation_to_wireframe, write3d_props_as_raster_image """\n''' #print ret #print correct self.assertEqual(ret, correct) # Test empty doc. out = cStringIO.StringIO() doc = 'V.GetOutput(int) -> vtkStructuredPoints\n'\ 'C++: vtkStructuredPoints *GetOutput (int idx);\n'\ 'V.GetOutput() -> vtkStructuredPoints\n'\ 'C++: vtkStructuredPoints *GetOutput ();\n\n' dm.write_trait_doc(doc, out, indent) out.seek(0) ret = out.read() self.assertEqual(ret, ' """\n \n """\n') def test_method_doc(self): """Test if method docs are generated correctly.""" dm = indenter.VTKDocMassager() indent = indenter.Indent() out = cStringIO.StringIO() doc = 'V.GetOutput(int) -> vtkStructuredPoints\n'\ 'C++: vtkStructuredPoints *GetOutput (int idx);\n'\ 'V.GetOutput() -> vtkStructuredPoints\n'\ 'C++: vtkStructuredPoints *GetOutput ();\n\n'\ 'vtkLODProperty, vtkXMLDataReader, vtk3DSImporter\n'\ 'SetRepresentationToWireframe, Write3DPropsAsRasterImage' dm.write_method_doc(doc, out, indent) out.seek(0) ret = out.read() correct = ''' """ V.get_output(int) -> StructuredPoints V.get_output() -> StructuredPoints LODProperty, XMLDataReader, ThreeDSImporter set_representation_to_wireframe, write3d_props_as_raster_image """\n''' #print ret #print correct self.assertEqual(ret, correct) # Test empty doc. out = cStringIO.StringIO() doc = 'V.GetOutput(int) -> vtkStructuredPoints\n'\ 'C++: vtkStructuredPoints *GetOutput (int idx);\n'\ 'V.GetOutput() -> vtkStructuredPoints\n'\ 'C++: vtkStructuredPoints *GetOutput ();\n\n' dm.write_method_doc(doc, out, indent) out.seek(0) ret = out.read() correct = ''' """ V.get_output(int) -> StructuredPoints V.get_output() -> StructuredPoints """\n''' #print ret #print correct self.assertEqual(ret, correct) def test_get_method_doc(self): """Test if get_method_doc works correctly.""" dm = indenter.VTKDocMassager() doc = 'V.GetOutput(int) -> vtkStructuredPoints\n'\ 'C++: vtkStructuredPoints *GetOutput (int idx);\n'\ 'V.GetOutput() -> vtkStructuredPoints\n'\ 'C++: vtkStructuredPoints *GetOutput ();\n\n'\ 'vtkLODProperty, vtkXMLDataReader, vtk3DSImporter\n'\ 'SetRepresentationToWireframe, Write3DPropsAsRasterImage' ret = dm.get_method_doc(doc) correct = 'V.get_output(int) -> StructuredPoints\n'\ 'V.get_output() -> StructuredPoints\n\n'\ 'LODProperty, XMLDataReader, ThreeDSImporter\n'\ 'set_representation_to_wireframe, '\ 'write3d_props_as_raster_image' #print ret #print correct self.assertEqual(ret, correct) # Test empty doc (only signature exists). doc = 'V.GetOutput(int) -> vtkStructuredPoints\n'\ 'C++: vtkStructuredPoints *GetOutput (int idx);\n'\ 'V.GetOutput() -> vtkStructuredPoints\n'\ 'C++: vtkStructuredPoints *GetOutput ();\n\n' ret = dm.get_method_doc(doc) correct = 'V.get_output(int) -> StructuredPoints\n'\ 'V.get_output() -> StructuredPoints\n' self.assertEqual(ret, correct) if __name__ == "__main__": unittest.main() mayavi-4.5.0/tvtk/tests/test_messenger.py0000644000076500000240000001060412747716314021162 0ustar prabhustaff00000000000000"""Tests for messenger.py """ # Author: Prabhu Ramachandran # Copyright (c) 2004-2015, Enthought, Inc. # License: BSD Style. import imp import unittest from tvtk import messenger ################################################################# # Support code. ################################################################# class A: def __init__(self): self.event = None self.args = None self.kw = None self.did_catch_all = 0 def callback(self, obj, event, *args, **kw): self.event = event self.args = args self.kw = kw def catch_all_cb(self, obj, event, *args, **kw): self.did_catch_all = 1 ret = None def callback(obj, event, *args, **kw): global ret ret = event, args, kw class B: def __init__(self): self.a = A() messenger.connect(self, 'method', self.a.callback) messenger.connect(self, 'function', callback) def __del__(self): messenger.disconnect(self) def send(self, *args, **kw): messenger.send(self, 'method', *args, **kw) messenger.send(self, 'function', *args, **kw) ################################################################# # The test case. ################################################################# class TestMessenger(unittest.TestCase): def test_basic(self): """Test basic functionality of the messenger.""" m = messenger.Messenger() orig_len = len(m._signals) b = B() b.send(1, test=1) self.assertEqual(b.a.event, 'method') self.assertEqual(ret[0], 'function') self.assertEqual(b.a.args, (1,)) self.assertEqual(ret[1], (1,)) self.assertEqual(b.a.kw, {'test':1}) self.assertEqual(ret[2], {'test':1}) # Ensures that disconnect works and also that there are no # reference cycles. self.assertEqual(len(m._signals) > orig_len, True) del b self.assertEqual(len(m._signals), orig_len) def test_reload(self): """Tests if module is reload safe.""" b = B() m = messenger.Messenger() orig_len = len(m._signals) imp.reload(messenger) m = messenger.Messenger() self.assertEqual(len(m._signals), orig_len) b.send(1, test=1) self.assertEqual(b.a.event, 'method') self.assertEqual(ret[0], 'function') self.assertEqual(b.a.args, (1,)) self.assertEqual(ret[1], (1,)) self.assertEqual(b.a.kw, {'test':1}) self.assertEqual(ret[2], {'test':1}) def test_catchall(self): """Tests if catch all handlers are called.""" b = B() b.send() self.assertEqual(b.a.event, 'method') self.assertEqual(b.a.args, ()) self.assertEqual(b.a.kw, {}) self.assertEqual(b.a.did_catch_all, 0) messenger.connect(b, 'AnyEvent', b.a.catch_all_cb) b.send(1, test=1) self.assertEqual(b.a.event, 'method') self.assertEqual(b.a.args, (1,)) self.assertEqual(b.a.kw, {'test':1}) self.assertEqual(b.a.did_catch_all, 1) b.a.did_catch_all = 0 messenger.disconnect(b, 'AnyEvent') b.send(1, test=1) self.assertEqual(b.a.did_catch_all, 0) def test_disconnect(self): """Tests if disconnection works correctly.""" global ret ret = None b = B() messenger.disconnect(b) b.send(1, test=1) self.assertEqual(b.a.event, None) self.assertEqual(b.a.args, None) self.assertEqual(b.a.kw, None) self.assertEqual(b.a.did_catch_all, 0) self.assertEqual(ret, None) def test_send_on_dead_ref(self): """Test if sending to a gc'd callback works gracefully.""" class C: def foo(self, o, e): pass c = C() c1 = C() messenger.connect(c1, 'foo', c.foo) messenger.send(c1, 'foo') # Test if things behave sanely if a message was sent and one # of the callbacks has been gc'd. m = messenger.Messenger() l1 = len(m._signals[hash(c1)]['foo']) # del c messenger.send(c1, 'foo') # l2 = len(m._signals[hash(c1)]['foo']) # Since 'c' is gc'd this callback should have been cleared # out. self.assertEqual(l2, l1 - 1) # Clean up. messenger.disconnect(c1) if __name__ == "__main__": unittest.main() mayavi-4.5.0/tvtk/tests/test_misc.py0000644000076500000240000000553612747716314020135 0ustar prabhustaff00000000000000""" Tests for enthought/tvtk/misc.py """ # Author: Prabhu Ramachandran # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. import unittest import tempfile import os.path import os from tvtk.api import tvtk, write_data class TestMisc(unittest.TestCase): def setUp(self): datasets = [tvtk.ImageData(), tvtk.StructuredPoints(), tvtk.RectilinearGrid(), tvtk.StructuredGrid(), tvtk.PolyData(), tvtk.UnstructuredGrid(), ] exts = ['.vti', '.vti', '.vtr', '.vts', '.vtp', '.vtu'] self.datasets = datasets self.exts = exts def test_write_data_xml_noext(self): "XML file writing without extensions" # Check if write_data writes out XML files with the correct # extension when none is specified. datasets = self.datasets exts = self.exts for d, ext in zip(datasets, exts): fh, fname = tempfile.mkstemp(ext) fbase = os.path.splitext(fname)[0] os.close(fh) os.remove(fname) write_data(d, fbase) self.assertEqual(os.path.exists(fname), True) os.remove(fname) def test_write_data_xml(self): "XML file writing with specified extension" datasets = self.datasets for d in datasets: fh, fname = tempfile.mkstemp('.xml') os.close(fh) os.remove(fname) self.assertEqual(os.path.exists(fname), False) write_data(d, fname) self.assertEqual(os.path.exists(fname), True) os.remove(fname) def test_write_data_xml_kwargs(self): "XML file writing with extra keyword arguments" datasets = self.datasets exts = self.exts for d, ext in zip(datasets, exts): fh, fname = tempfile.mkstemp(ext) fbase = os.path.splitext(fname)[0] os.close(fh) os.remove(fname) # Test if passing extra keyword args is supported. write_data(d, fbase, compressor=None, data_mode='ascii') self.assertEqual(os.path.exists(fname), True) os.remove(fname) def test_write_data_vtk(self): "Old-style VTK file writing with specified extension" datasets = self.datasets for d in datasets: fh, fname = tempfile.mkstemp('.vtk') os.close(fh) os.remove(fname) self.assertEqual(os.path.exists(fname), False) write_data(d, fname) self.assertEqual(os.path.exists(fname), True) r = tvtk.DataSetReader(file_name=fname) r.update() self.assertEqual(isinstance(r.output, d.__class__), True) os.remove(fname) if __name__ == '__main__': unittest.main() mayavi-4.5.0/tvtk/tests/test_movie_maker.py0000644000076500000240000000410112747716314021463 0ustar prabhustaff00000000000000import mock import os import shutil import tempfile import unittest from tvtk.pyface.movie_maker import MovieMaker class TestMovieMaker(unittest.TestCase): def setUp(self): self.root = tempfile.mkdtemp() def tearDown(self): shutil.rmtree(self.root) def test_does_nothing_when_record_is_off(self): # Given mm = MovieMaker(record=False) mm._save_scene = mock.MagicMock() # When mm.animation_start() mm.animation_step() mm.animation_step() mm.animation_stop() # Then mm._save_scene.assert_not_called() def test_calls_save_scene_when_record_is_on(self): # Given mm = MovieMaker(record=True) mm._save_scene = mock.MagicMock() # When mm.animation_start() mm.animation_step() mm.animation_step() mm.animation_stop() # Then self.assertEqual(mm._save_scene.call_count, 3) def test_calls_save_scene_with_record_movie(self): # Given mm = MovieMaker(record=False) mm._save_scene = mock.MagicMock() mm.animation_start = mock.MagicMock() mm.animation_stop = mock.MagicMock() # When with mm.record_movie(): mm.animation_step() mm.animation_step() # Then mm.animation_start.assert_called_once_with() self.assertEqual(mm._save_scene.call_count, 2) mm.animation_stop.assert_called_once_with() self.assertEqual(mm.record, False) def test_directory_updates_correctly(self): # Given mm = MovieMaker(record=True, directory=self.root) mm._save_scene = mock.MagicMock() # When with mm.record_movie(): mm.animation_step() # Then self.assertEqual(mm._subdir, 'movie001') # When. os.makedirs(os.path.join(self.root, mm._subdir, 'movie001')) with mm.record_movie(): mm.animation_step() # Then self.assertEqual(mm._subdir, 'movie002') if __name__ == '__main__': unittest.main() mayavi-4.5.0/tvtk/tests/test_pyface_utils.py0000644000076500000240000000160612747716314021663 0ustar prabhustaff00000000000000import mock import unittest from pyface.api import FileDialog, NO, OK class TestPopupSave(unittest.TestCase): def _make_mock_file_dialog(self, return_value): m = mock.Mock(spec=FileDialog) m.open.return_value = return_value m.path = 'mock' return m def test_popup_save_with_user_ok(self): with mock.patch('pyface.api.FileDialog') as fd: fd.return_value = self._make_mock_file_dialog(OK) from tvtk.pyface.utils import popup_save x = popup_save() self.assertEqual(x, 'mock') def test_popup_save_with_user_not_ok(self): with mock.patch('pyface.api.FileDialog') as fd: fd.return_value = self._make_mock_file_dialog(NO) from tvtk.pyface.utils import popup_save x = popup_save() self.assertEqual(x, '') if __name__ == '__main__': unittest.main() mayavi-4.5.0/tvtk/tests/test_tvtk.py0000644000076500000240000011063312747716314020165 0ustar prabhustaff00000000000000"""Tests for tvtk objects. Some of these tests are copied from test_tvtk_base. This is just to make sure that the generated code works well. """ # Author: Prabhu Ramachandran # Copyright (c) 2004-2016, Enthought, Inc. # License: BSD Style. import unittest import pickle import weakref import sys import gc import traceback import contextlib import types import inspect import re import numpy import vtk from tvtk import tvtk_base from tvtk.common import get_tvtk_name, configure_input_data, is_version_7 from traits.api import TraitError vtk_major_version = vtk.vtkVersion.GetVTKMajorVersion() vtk_minor_version = vtk.vtkVersion.GetVTKMinorVersion() try: from tvtk.api import tvtk except ImportError: msg = """ You need to build the tvtk_classes.zip file to run this test. To generate tvtk_classes.zip you must do the following:: $ cd ../ # This is the enthought/tvtk directory $ python code_gen.py """ raise ImportError(msg) # Only used for testing. from tvtk.tvtk_classes import tvtk_helper PY_VER = sys.version_info[0] if PY_VER > 2: long = int def mysum(arr): val = arr while type(val) == numpy.ndarray: val = numpy.sum(val) return val def has_subclass(tvtk_class): """ Return True if `tvtk_class` has a subclass (excluding itself) Unfortunately because of the VTK API we cannot tell whether the subclass is abstract or not """ def is_sub_class(x): return (inspect.isclass(x) and issubclass(x, tvtk_class) and x is not tvtk_class) # wish there was an iterator version of inspect.getmembers return bool(inspect.getmembers(tvtk, is_sub_class)) def skipUnlessTVTKHasattr(attr): if hasattr(tvtk, attr): return lambda func: func message = "{} is not available on this build of TVTK" return unittest.skip(message.format(attr)) class TestTVTK(unittest.TestCase): def test_wrap_vtk(self): """Test if the wrap_vtk function works.""" o = vtk.vtkVolume() w = tvtk_helper.wrap_vtk(o) self.assertEqual(w.__class__.__name__, 'Volume') w1 = tvtk_helper.wrap_vtk(w) self.assertEqual(w, w1) del w1, w, o class A: pass a = A() w = tvtk_helper.wrap_vtk(a) self.assertEqual(a, w) def test_cache(self): """Test the caching of ancestor classes.""" # Shut off pesky warnings. vtk.vtkObject.GlobalWarningDisplayOff() o = tvtk.ImageFFT() vtk_ver = vtk.vtkVersion().GetVTKVersion() if vtk_ver[:3] in ['4.2', '4.4']: cached = ['ImageFourierFilter', 'ImageDecomposeFilter', 'ImageIterateFilter', 'ImageToImageFilter', 'ImageSource', 'Source', 'ProcessObject', 'Object', 'ObjectBase'] else: cached = ['ImageFourierFilter', 'ImageDecomposeFilter', 'ImageIterateFilter', 'ThreadedImageAlgorithm', 'ImageAlgorithm', 'Algorithm', 'Object', 'ObjectBase'] for i in cached: self.assertIn(i, tvtk_helper._cache) vtk.vtkObject.GlobalWarningDisplayOn() def test_custom(self): """Test if custom modules can be imported.""" # First clear the cache. Another module may have already imported # the same class and this would compromise the test from tvtk.tvtk_classes import tvtk_helper tvtk_helper._cache.clear() # Hack to simulate a module inside tvtk.custom. mod = types.ModuleType('xml_data_reader') class XMLDataReader: def f(self): return 'f' setattr(mod, 'XMLDataReader', XMLDataReader) sys.modules['tvtk.custom.xml_data_reader'] = mod # Now test if this is the one imported. r = tvtk.XMLDataReader() self.assertEqual(r.f(), 'f') if len(vtk.vtkObjectBase.__bases__) > 0: if is_version_7(): expect = () else: expect = (object,) else: expect = tuple() self.assertEqual(r.__class__.__bases__, expect) # Clean up. del sys.modules['tvtk.custom.xml_data_reader'] tvtk_helper._cache.clear() def test_basic(self): """Test a simple tvtk pipeline.""" # If this works without any problems, we are ok. cs = tvtk.ConeSource() m = tvtk.PolyDataMapper() if vtk_major_version < 6: m.input = cs.output # This should work m.input = cs.get_output() # This should also work. else: m.input_connection = cs.output_port # This should work. m.set_input_data(cs.get_output()) # This should also work. a = tvtk.Actor() a.mapper = m cs.resolution = 36 p = a.property p.representation = 'w' def test_do_change(self): """Test if VTK object changes when trait is changed.""" p = tvtk.Property() p.edge_visibility = not p.edge_visibility p.representation = 'p' p.interpolation = 'phong' p.opacity = 0.5 p.color = (0, 1, 0) p.diffuse_color = (1, 1, 1) p.specular_color = (1, 1, 0) for t, g in p._updateable_traits_: val = getattr(p._vtk_obj, g)() if t in ['representation', 'interpolation']: self.assertEqual(val, getattr(p, t + '_')) else: self.assertEqual(val, getattr(p, t)) def test_auto_update(self): """Test if traits are updated when the VTK object changes.""" p = tvtk.Property() obj = p._vtk_obj obj.SetEdgeVisibility(1) self.assertEqual(p.edge_visibility, 1) obj.SetOpacity(0.5) self.assertEqual(p.opacity, 0.5) obj.SetRepresentationToPoints() self.assertEqual(p.representation, 'points') # color traits have been made non updateable if vtk_major_version <= 5 and vtk_minor_version < 10: val = (1.0, 1.0, 0.0) obj.SetColor(val) self.assertEqual(p.color, val) val = (1.0, 0.0, 0.0) obj.SetDiffuseColor(val) self.assertEqual(p.diffuse_color, val) val = (0.0, 1.0, 0.0) obj.SetSpecularColor(val) self.assertEqual(p.specular_color, val) def test_obj_del(self): """Test object deletion and reference cycles.""" p = tvtk.Property() p.representation = 0 ref = weakref.ref(p) del p self.assertEqual(ref(), None) def test_help_trait(self): """Test if the help attribute is correct.""" n = tvtk.PolyDataNormals() t = n.traits() test = t['splitting'].help != t['non_manifold_traversal'].help self.assertEqual(test, True) def test_object_cache(self): """Test if object cache works.""" cs = tvtk.ConeSource() hash1 = hash(cs) o = cs.output if hasattr(o, 'producer_port'): src = o.producer_port.producer else: src = cs.executive.algorithm self.assertEqual(src, cs) self.assertEqual(hash1, hash(src)) del cs, src gc.collect() # The test sometimes fails as VTK seems to generate objects with the # same memory address and hash, we try to force it to allocate more # objects so as to not end up reusing the same address and hash. junk = [tvtk.ConeSource() for i in range(50)] # Now get another ConeSource and ensure the hash is different. cs = tvtk.ConeSource() o = cs.output if hasattr(o, 'producer_port'): src = o.producer_port.producer else: src = cs.executive.algorithm ############################################################## # This assertion is related to a bug fixed in VTK 6 onwards # For VTK 5.x this test is inconsistent, hence skipeed for 5.x # See http://review.source.kitware.com/#/c/15095/ ############################################################## if vtk_major_version > 5: self.assertEqual(hash1 != hash(src), True) self.assertEqual(hash(cs), hash(src)) # Test for a bug with collections and the object cache. r = tvtk.Renderer() def _get_props(obj): if hasattr(obj, 'view_props'): return obj.view_props else: return obj.props p = _get_props(r) l1 = len(tvtk_base._object_cache) p1 = _get_props(r) del p1 l2 = len(tvtk_base._object_cache) self.assertEqual(l1, l2) def test_init_traits(self): """Test if the objects traits can be set in __init__.""" p = tvtk.Property(opacity=0.1, color=(1, 0, 0), representation='p') self.assertEqual(p.opacity, 0.1) self.assertEqual(p.color, (1.0, 0.0, 0.0)) self.assertEqual(p.representation, 'points') # Test case where the object traits are wrong. self.assertRaises(TraitError, tvtk.Property, foo='bar') cs = tvtk.ConeSource(radius=0.1, height=0.5, resolution=32) self.assertEqual(cs.radius, 0.1) self.assertEqual(cs.height, 0.5) self.assertEqual(cs.resolution, 32) # Test case where the object traits are wrong. self.assertRaises(TraitError, tvtk.ConeSource, foo=1) def test_matrix4x4(self): """Test if Matrix4x4 works nicely.""" m = tvtk.Matrix4x4() [m.set_element(i, j, i*4 + j) for i in range(4) for j in range(4)] s = pickle.dumps(m) del m m = pickle.loads(s) for i in range(4): for j in range(4): self.assertEqual(m.get_element(i, j), i*4 + j) # Test the from/to_array functions. a = numpy.array(list(range(16)), dtype=float) a.shape = 4, 4 m = tvtk.Matrix4x4() m.from_array(a) b = m.to_array() self.assertEqual(numpy.allclose(a, b), True) def test_property(self): """Test if Property's color works ok in all circumstances.""" p = tvtk.Property() val = (0., 1., 0.) p.color = val p.specular = 1.0 self.assertEqual(p.specular_color, val) self.assertEqual(p.diffuse_color, val) self.assertEqual(p.ambient_color, val) sc = (1., 0., 1.) p.specular_color = sc self.assertEqual(p.specular_color, sc) self.assertEqual(p.diffuse_color, val) self.assertEqual(p.ambient_color, val) self.assertEqual(p.color, (0.5, 0.5, 0.5)) # Test pickling. s = pickle.dumps(p) del p p = pickle.loads(s) self.assertEqual(p.specular_color, sc) self.assertEqual(p.diffuse_color, val) self.assertEqual(p.ambient_color, val) self.assertEqual(p.color, (0.5, 0.5, 0.5)) def test_points_lookup(self): """ Test if points can be looked up with both int and long keys. Fixes GH Issue 173. """ points = tvtk.Points() points.insert_next_point((0, 1, 2)) pt = points[0] self.assertEqual(pt, (0, 1, 2)) ptl = points[long(0)] self.assertEqual(ptl, (0, 1, 2)) get_pt = points.get_point(0) self.assertEqual(get_pt, (0, 1, 2)) get_ptl = points.get_point(long(0)) self.assertEqual(get_ptl, (0, 1, 2)) def test_cell_array(self): """ Test if cell array insertion updates number of cells. Fixes GH Issue 178. """ cell_array = tvtk.CellArray() line1 = tvtk.Line() self.assertEqual(cell_array.number_of_cells, 0) cell_array.insert_next_cell(line1) self.assertEqual(cell_array.number_of_cells, 1) line2 = tvtk.Line() cell_array.insert_next_cell(line2) self.assertEqual(cell_array.number_of_cells, 2) def test_collection(self): """Test if Collection objects work nicely.""" ac = tvtk.ActorCollection() self.assertEqual(len(ac), 0) self.assertRaises(IndexError, ac.__getitem__, 0) a_list = [] a = tvtk.Actor() a_list.append(a) ac.append(a) self.assertRaises(TypeError, ac.__getitem__, 's') self.assertEqual(len(ac), 1) a = tvtk.Actor() a_list.append(a) ac.append(a) self.assertEqual(len(ac), 2) # Test iterator nature. for i, j in zip(ac, a_list): self.assertEqual(i._vtk_obj, j._vtk_obj) for i, j in enumerate(ac): self.assertEqual(a_list[i]._vtk_obj, j._vtk_obj) # Test __setitem__. ac[0] = a_list[1] ac[1] = a_list[0] self.assertEqual(ac[0]._vtk_obj, a_list[1]._vtk_obj) self.assertEqual(ac[1]._vtk_obj, a_list[0]._vtk_obj) self.assertRaises(TypeError, ac.__setitem__, 's', a_list[1]) # Test __delitem__. del ac[-2] self.assertEqual(ac[0]._vtk_obj, a_list[0]._vtk_obj) self.assertEqual(len(ac), 1) self.assertRaises(TypeError, ac.__delitem__, 1.414) del ac[0] self.assertEqual(len(ac), 0) # Test __repr__. self.assertEqual(repr(ac), '[]') # test extend. ac.extend(a_list) self.assertEqual(len(ac), 2) for i, j in enumerate(ac): self.assertEqual(a_list[i]._vtk_obj, j._vtk_obj) # Test the prop collection. pc = tvtk.PropCollection() a = tvtk.Actor() pc.append(a) self.assertEqual(pc[0], a) for i in pc: self.assertEqual(i, a) def test_set_scalars(self): """Test if SetScalars works without a segfault.""" mesh = tvtk.PolyData() sc = tvtk.FloatArray() # If this does not segfault, we are OK. mesh.point_data.scalars = sc def test_data_array(self): """Test if vtkDataArrays behave in a Pythonic fashion.""" # Check a 3D array. f = tvtk.FloatArray() a = numpy.array([[0., 0, 0], [1, 1, 1]]) f.from_array(a) self.assertEqual(f.number_of_components, 3) self.assertEqual(f.number_of_tuples, 2) self.assertEqual(mysum(f.to_array() - a), 0) for i, j in zip(a, f): self.assertEqual(mysum(i-j), 0.0) self.assertEqual(f[0], (0.0, 0.0, 0.0)) self.assertEqual(f[-1], (1., 1., 1.)) self.assertEqual(repr(f), '[(0.0, 0.0, 0.0), (1.0, 1.0, 1.0)]') f.append((2, 2, 2)) f.extend([[3, 3, 3], [4, 4, 4]]) self.assertEqual(len(f), 5) self.assertEqual(f.number_of_components, 3) self.assertEqual(f.number_of_tuples, 5) f[1] = [-1, -1, -1] self.assertEqual(f[1], (-1.0, -1.0, -1.0)) self.assertRaises(IndexError, f.__getitem__, 100) self.assertRaises(IndexError, f.__setitem__, 100, 100) # Check a 5D arrray a = numpy.array([[0., 0, 0, 0, 0], [1, 1, 1, 1, 1]]) f.from_array(a) self.assertEqual(mysum(f.to_array() - a), 0.0) for i, j in zip(a, f): self.assertEqual(mysum(i - j), 0.0) self.assertEqual(f[0], (0.0, 0.0, 0.0, 0.0, 0.0)) self.assertEqual(f[-1], (1., 1., 1., 1., 1.)) self.assertEqual( repr(f), '[(0.0, 0.0, 0.0, 0.0, 0.0), (1.0, 1.0, 1.0, 1.0, 1.0)]') f.append((2, 2, 2, 2, 2)) f.extend([[3, 3, 3, 3, 3], [4, 4, 4, 4, 4]]) self.assertEqual(len(f), 5) self.assertEqual(f.number_of_components, 5) self.assertEqual(f.number_of_tuples, 5) self.assertEqual(f[-1], (4., 4., 4., 4., 4.)) f[1] = [-1, -1, -1, -1, -1] self.assertEqual(f[1], (-1.0, -1.0, -1.0, -1.0, -1.0)) self.assertRaises(IndexError, f.__getitem__, 100) self.assertRaises(IndexError, f.__setitem__, 100, 100) def test_points(self): """Test if vtkPoints behaves in a Pythonic fashion.""" f = tvtk.Points() a = numpy.array([[0., 0, 0], [1, 1, 1]]) f.from_array(a) self.assertEqual(mysum(f.to_array() - a), 0) for i, j in zip(a, f): self.assertEqual(mysum(i - j), 0) a[0, 0] = 1.0 # Should change the VTK data! # Make sure that everything works even when the original array # is deleted. del a self.assertEqual(f[0], (1.0, 0.0, 0.0)) self.assertEqual(f[-1], (1., 1., 1.)) self.assertEqual(repr(f), '[(1.0, 0.0, 0.0), (1.0, 1.0, 1.0)]') f.append((2, 2, 2)) f.extend([[3, 3, 3], [4, 4, 4]]) self.assertEqual(len(f), 5) f[1] = [-1, -1, -1] self.assertEqual(f[1], (-1.0, -1.0, -1.0)) self.assertRaises(IndexError, f.__getitem__, 100) self.assertRaises(IndexError, f.__setitem__, 100, 100) def test_idlist(self): """Test if vtkIdList behaves in a Pythonic fashion.""" f = tvtk.IdList() a = numpy.array([0, 1, 2, 3]) f.from_array(a) for i, j in zip(a, f): self.assertEqual(i, j) self.assertEqual(f[-1], 3) self.assertEqual(f[0], 0) if sys.version_info[0] > 2: self.assertEqual(repr(f), '[0, 1, 2, 3]') else: if type(f[0]) is long: self.assertEqual(repr(f), '[0L, 1L, 2L, 3L]') else: self.assertEqual(repr(f), '[0, 1, 2, 3]') f.append(4) f.extend([5, 6]) self.assertEqual(len(f), 7) f[1] = -1 self.assertEqual(f[1], -1) self.assertRaises(IndexError, f.__getitem__, 100) self.assertRaises(IndexError, f.__setitem__, 100, 100) def test_array_conversion(self): """Test if Numeric/VTK array conversion works.""" # This is only a simple test. data = numpy.array( [[0, 0, 0, 10], [1, 0, 0, 20], [0, 1, 0, 20], [0, 0, 1, 30]], 'f') triangles = numpy.array([[0, 1, 3], [0, 3, 2], [1, 2, 3], [0, 2, 1]]) points = data[:, :3] temperature = data[:, -1] mesh = tvtk.PolyData() mesh.points = points mesh.polys = triangles mesh.point_data.scalars = temperature # Test if a normal float array also works. temp = tvtk.FloatArray() temp.from_array(temperature) mesh.point_data.scalars = temp def test_append_poly_data_input(self): """Test if AppendPolyData has its get_input wrapped right.""" a = tvtk.AppendPolyData() self.assertEqual(hasattr(a, 'get_input'), True) self.assertEqual(a.input, None) def test_property_change_notification(self): """Test if changes to properties generate notification events.""" # Create a dummy class to test with. class Junk: def f(self, obj, name, old, new): self.data = obj, name, old, new z = Junk() cs = tvtk.ConeSource() m = tvtk.PolyDataMapper() if vtk_major_version < 6: m.on_trait_change(z.f, 'input') m.input = cs.output self.assertEqual(z.data, (m, 'input', None, cs.output)) m.input = None self.assertEqual(z.data, (m, 'input', cs.output, None)) m.on_trait_change(z.f, 'input', remove=True) m.input = cs.output else: m.on_trait_change(z.f, 'input_connection') m.input_connection = cs.output_port self.assertEqual( z.data, (m, 'input_connection', None, cs.output_port)) m.input_connection = None self.assertEqual( z.data, (m, 'input_connection', cs.output_port, None)) m.on_trait_change(z.f, 'input_connection', remove=True) m.input_connection = cs.output_port a = tvtk.Actor() a.on_trait_change(z.f, 'mapper') a.on_trait_change(z.f, 'property') a.mapper = m self.assertEqual(z.data, (a, 'mapper', None, m)) old = a.property new = tvtk.Property() a.property = new self.assertEqual(z.data, (a, 'property', old, new)) # Check if property notification occurs on add_input/remove_input a = tvtk.AppendPolyData() pd = tvtk.PolyData() if vtk_major_version < 6: a.on_trait_change(z.f, 'input') a.add_input(pd) old, new = None, pd self.assertEqual(z.data, (a, 'input', old, new)) a.remove_input(pd) old, new = pd, None self.assertEqual(z.data, (a, 'input', old, new)) a.remove_all_inputs() old, new = None, None self.assertEqual(z.data, (a, 'input', old, new)) else: a.add_input_data(pd) self.assertEqual(a.input, pd) a.remove_input_data(pd) self.assertEqual(a.input, None) a.remove_all_inputs() self.assertEqual(a.input, None) def test_tuple_array_handling(self): """Test if methods can take any sequence rather than only tuples.""" sg = tvtk.StructuredGridGeometryFilter() # setting a bogus value triggers an error since VTK assumes # that we want the extent set in the passed object. If we use # an Array type instead of a Tuple then we can pass in # a list and it should work OK. sg.extent = [0, -1, 0, -1, 0, -1] def test_information_keys(self): """Test if vtk information objects can be created.""" s = tvtk.StructuredPoints() x = s.FIELD_ARRAY_TYPE() y = tvtk.Information() x.get(y) def test_parent_child_bounds(self): """CubeAxesActor2D's bounds should be writable.""" c = tvtk.CubeAxesActor2D() c.bounds = (0, 1, 0, 1, 0, 1) def test_parent_child_input(self): """Case where parent has GetInput and child SetInput.""" if (vtk_major_version >= 6 and vtk_minor_version > 1) or \ vtk_major_version == 7: vm = tvtk.SmartVolumeMapper() else: vm = tvtk.VolumeTextureMapper2D() # In this case if the wrapping is not done right, the input # trait is made read-only which is a bug. We set the input # below to test this. configure_input_data(vm, tvtk.ImageData()) spw = tvtk.StructuredPointsWriter() if vtk_major_version < 6: spw.input = None else: spw.input_connection = None @unittest.skipIf( vtk_major_version >= 6, "Setting scalar type is no longer supported on VTK 6") def test_image_data_scalar_type(self): """Does ImageData support all scalar types?. """ img = tvtk.ImageData() # There are 22 scalar types in VTK-5.2. We should be able to # use them all. for i in range(0, 22): img.scalar_type = i def test_null_string_wrapper(self): "Check if a null string default is wrapped as a String trait." cap = tvtk.CaptionActor2D() self.assertEqual( ('caption', 'GetCaption') in cap._updateable_traits_, True) self.assertEqual('caption' in cap._full_traitnames_list_, True) def test_spider_plot_actor_set_axis_label(self): """ Test SpiderPlotActor Get/SetAxisLabel works """ # SpiderPlotActor.SetAxisLabel accepts two arguments # that are of different type, we need to make sure they # are coded as is actor = tvtk.SpiderPlotActor() actor.set_axis_label(1, 'ss') self.assertEqual(actor.get_axis_label(1), 'ss') def test_image_convolve_kernel(self): """ Test that setting the kernels in ImageConvolve works """ tvtk_filter = tvtk.ImageConvolve() expected = numpy.arange(9.) if vtk_major_version < 6: # Before VTK 6, the ImageConvolve.GetKernel3x3 # requires an array as argument # Set the kernel tvtk_filter.set_kernel3x3(expected) # Get it back result = numpy.empty(9) tvtk_filter.get_kernel3x3(result) self.assertTrue(numpy.allclose(result, expected), True) with self.assertRaises(TypeError): # VTK Set method raises the TypeError tvtk_filter.set_kernel3x3(range(2)) else: # Since VTK 6.x, ImageConvolve.GetKernel3x3 # can take either no argument or an array # With that change in the API, kernel3x3 # is a Trait (similarly for kernel3x3x3, ...) tvtk_filter.kernel3x3 = expected # Get it back result = numpy.empty(9) tvtk_filter._vtk_obj.GetKernel3x3(result) self.assertTrue(numpy.allclose(result, expected), True) # The shape is validated by Trait with self.assertRaises(TraitError): tvtk_filter.kernel3x3 = range(2) @skipUnlessTVTKHasattr('DistanceRepresentation2D') def test_distance_representation_2d_point1_world_position(self): """ Test that Position attributes in DistanceRepresentation2D works """ tvtk_filter = tvtk.DistanceRepresentation2D() tvtk_filter.instantiate_handle_representation() if vtk_major_version < 6: # Before VTK 6, the DistanceRepresentation2D.GetPoint1WorldPosition # requires an array as argument # Set the kernel expected = (1, 2, 3) tvtk_filter.set_point1_world_position(expected) # Get it back result = numpy.empty(3) tvtk_filter.get_point1_world_position(result) self.assertTrue(numpy.allclose(result, expected), True) with self.assertRaises(TypeError): # VTK Set method raises the TypeError tvtk_filter.set_point1_world_position(range(2)) else: # Since VTK 6.x, DistanceRepresentation2D.GetPoint1WorldPosition # can take either no argument or an array # With that change in the API, point1_world_position # is a Trait (similarly for point2_world_position ...) # Set the position expected = (1, 2, 3) tvtk_filter.point1_world_position = expected # Get it back result = numpy.empty(3) tvtk_filter._vtk_obj.GetPoint1WorldPosition(result) self.assertTrue(numpy.allclose(result, expected), True) # The shape is validated by Trait with self.assertRaises(TraitError): tvtk_filter.point1_world_position = range(2) @skipUnlessTVTKHasattr('XOpenGLRenderWindow') def test_xopengl_render_window(self): """ Test that setting the position to a render window works Issue #357 """ window = tvtk.XOpenGLRenderWindow() # Setting it to some valid value window.position = (1, 1) # But setting to some invalid value outside of update_traits # should fail as long as Traits is doing its job with self.assertRaises(TraitError): window.position = 1 @unittest.skipIf(vtk_major_version < 6, ('vtkHardwareSelector.PropColorValue is not available ' 'for vtk version < 6')) @skipUnlessTVTKHasattr('HardwareSelector') def test_hardware_selector_prop_color_value(self): """ Test that PropColorValue of HardwareSelector works Issue #360 """ selector = tvtk.HardwareSelector() # Setting it to some valid value selector.prop_color_value = (0.1, 0.4, 0.2) # But setting to some invalid value outside of update_traits # should fail as long as Traits is doing its job with self.assertRaises(TraitError): selector.prop_color_value = (-100., 10., 1.) @skipUnlessTVTKHasattr('AxesTransformRepresentation') def test_axes_transform_representation_tolerance(self): """ Test the tolerance of AxesTransformRepresentation is set properly """ tvtk_obj = tvtk.AxesTransformRepresentation() vtk_obj = vtk.vtkAxesTransformRepresentation() self.assertTrue(tvtk_obj.tolerance <= vtk_obj.GetToleranceMaxValue()) self.assertTrue(tvtk_obj.tolerance >= vtk_obj.GetToleranceMinValue()) @skipUnlessTVTKHasattr('ObjectFactory') def test_object_factory_enableflag_api(self): """ Test ObjectFactory Get/SetEnableFlag API """ # It is an abstract class, can't instantiate klass = tvtk.ObjectFactory if has_subclass(klass): # If we place this check as a unittest.skipIf decorator, # this would cause garbage collection tests in the test suite to fail # as the some classes are kept live raise unittest.SkipTest(('ObjectFactory has a subclass. ' 'This may cause the TVTK API to be different ' 'from if it had not')) # The Set/Get methods require many args # they should be coded as such self.assertTrue(hasattr(klass, 'set_enable_flag')) self.assertTrue(hasattr(klass, 'get_enable_flag')) @skipUnlessTVTKHasattr('ContextDevice2D') def test_contextdevice2d_matrix_api(self): """ Test ContextDevice2D Get/SetMatrix API """ # It is an abstract class, can't instantiate klass = tvtk.ContextDevice2D if has_subclass(klass): # If we place this check as a unittest.skipIf decorator, # this would cause garbage collection tests in the test suite to fail # as the some classes are kept live raise unittest.SkipTest(('ContextDevice2D has a subclass. ' 'This may cause the TVTK API to be different ' 'from if it had not')) # The Set/Get methods require many args # they should be coded as such self.assertTrue(hasattr(klass, 'set_matrix')) self.assertTrue(hasattr(klass, 'get_matrix')) # This separates out any tests for the entire module that would affect # the functioning of the other tests. class TestTVTKModule(unittest.TestCase): def tearDown(self): tvtk_helper._cache.clear() vtk.vtkObject.GlobalWarningDisplayOn() def setUp(self): vtk.vtkObject.GlobalWarningDisplayOff() self.names = [] # Filter the ones that are abstract or not implemented for name in dir(vtk): if (not name.startswith('vtk') or name.startswith('vtkQt') or len(name) <= 3): continue vtk_klass = getattr(vtk, name) tvtk_klass_name = get_tvtk_name(name) tvtk_klass = getattr(tvtk, tvtk_klass_name, None) if hasattr(vtk_klass, '__bases__') and tvtk_klass is not None: try: obj = vtk_klass() except (TypeError, NotImplementedError): continue else: self.names.append(name) def test_all_instantiable(self): """Test if all the TVTK classes can be instantiated""" errors = [] for name in self.names: tvtk_name = get_tvtk_name(name) tvtk_klass = getattr(tvtk, tvtk_name, None) try: tvtk_klass() except TraitError: errors.append(traceback.format_exc()) if len(errors) > 0: message = "Not all classes could be instantiated:\n{0}\n" raise AssertionError(message.format(''.join(errors))) def test_trait_with_range(self): '''Test if all the attributes with MinValue/MaxValue are traits with Range ''' def to_camel_case(text): """ Convert text to CamelCase""" def replace_func(matched): word = matched.group(0).strip("_") return word[0].upper()+word[1:].lower() return re.sub(r'(_?[a-zA-Z]+)', replace_func, text) def get_min_max_value(vtk_klass, vtk_attr_name): """ Return (min, max) of a VTK attribute If MaxValue or MinValue is not available (None, None) is returned """ get_min_method = 'Get' + vtk_attr_name + 'MinValue' get_max_method = 'Get' + vtk_attr_name + 'MaxValue' try: return (getattr(vtk_klass(), get_min_method)(), getattr(vtk_klass(), get_max_method)()) except AttributeError: return None, None for name in self.names: vtk_klass = getattr(vtk, name) tvtk_klass_name = get_tvtk_name(name) try: obj = getattr(tvtk, tvtk_klass_name)() except Exception: # testing for instantiation is above pass for trait_name in obj.editable_traits(): vtk_attr_name = to_camel_case(trait_name) min_value, max_value = get_min_max_value(vtk_klass, vtk_attr_name) # Explicitly checking for None instead of bool(value) # since min_value/max_value could be int(0) if max_value is not None and min_value is not None: # If max and min values are defined, setting the trait # to outside this range should fail with self.assertRaises(TraitError): setattr(obj, trait_name, (min_value-1, max_value)) with self.assertRaises(TraitError): setattr(obj, trait_name, (min_value, max_value+1)) def test_no_trait_has_ptr_address_as_value(self): '''Test if none of the TVTK classes' traits has a value of "*_p_void" ''' errors_trait_is_ptr = [] for name in self.names: tvtk_klass_name = get_tvtk_name(name) try: obj = getattr(tvtk, tvtk_klass_name)() except Exception: # testing for instantiation is above pass # Had to use `_full_traitnames_list_` instead of calling # editable_traits(), otherwise looping over the trait name # and getting the attribute (getattr) cause Segfault for # AxisActor.title_prop3d, DataSetCellIterator.cell_type # DataSetCellIterator.number_of_points ...etc for trait_name in obj._full_traitnames_list_: try: trait = getattr(obj, trait_name) except (TypeError, TraitError): pass # this is tested in another test else: if isinstance(trait, str) and trait.endswith('_p_void'): errors_trait_is_ptr.append( (tvtk_klass_name, trait_name, trait)) if errors_trait_is_ptr: message = 'These traits are invalid:\n' message += '\n'.join(('tvtk.{0}.{1} = {2!r}'.format(*error) for error in errors_trait_is_ptr)) self.fail(message) def test_all_traits_can_be_obtained(self): '''Test if all of the traits can be obtained ''' errors_getting_trait = [] for name in self.names: tvtk_klass_name = get_tvtk_name(name) try: obj = getattr(tvtk, tvtk_klass_name)() except Exception: # testing for instantiation is above pass for trait_name in obj._full_traitnames_list_: try: trait = getattr(obj, trait_name) except Exception as exception: errors_getting_trait.append( (tvtk_klass_name, trait_name, str(exception))) if errors_getting_trait: message = 'These traits cannot be obtained:\n' message += '\n'.join(('tvtk.{0}.{1} : {2}'.format(*error) for error in errors_getting_trait)) self.fail(message) def test_import_tvtk_does_not_import_gui(self): from subprocess import check_output, STDOUT output = check_output( [sys.executable, "-v", "-c", "from tvtk.api import tvtk; p = tvtk.Property()"], stderr=STDOUT ) output = output.decode('ascii') self.assertFalse('QtCore' in output) self.assertFalse('wx' in output) @unittest.skipIf(PY_VER > 2, "Irrelevant for python 3") def test_unicode_traits(self): reader = tvtk.DelimitedTextReader() self.assertIsInstance(reader.unicode_record_delimiters, unicode) self.assertIsInstance(reader.unicode_string_delimiters, unicode) self.assertIsInstance(reader.unicode_field_delimiters, unicode) if __name__ == "__main__": unittest.main() mayavi-4.5.0/tvtk/tests/test_tvtk_base.py0000644000076500000240000002375112747716314021163 0ustar prabhustaff00000000000000"""Tests for tvtk_base.py. These only test the basic functionality of the code in tvtk_base. More tests for TVTK objects should be in test_tvtk.py. """ # Author: Prabhu Ramachandran # Copyright (c) 2004-2015, Enthought, Inc. # License: BSD Style. import unittest import pickle import weakref import vtk import gc import imp from traits import api as traits from tvtk import tvtk_base from tvtk.common import get_tvtk_name, camel2enthought # An elementary class based on vtkProperty that is used only for # testing. class Prop(tvtk_base.TVTKBase): def __init__(self, obj=None, update=1, **traits): tvtk_base.TVTKBase.__init__(self, vtk.vtkProperty, obj, update, **traits) edge_visibility = tvtk_base.false_bool_trait def _edge_visibility_changed(self, old_val, new_val): self._do_change(self._vtk_obj.SetEdgeVisibility, self.edge_visibility_) representation = traits.Trait('surface', tvtk_base.TraitRevPrefixMap({'points': 0, 'wireframe': 1, 'surface': 2})) def _representation_changed(self, old_val, new_val): self._do_change(self._vtk_obj.SetRepresentation, self.representation_) opacity = traits.Trait(1.0, traits.Range(0.0, 1.0)) def _opacity_changed(self, old_val, new_val): self._do_change(self._vtk_obj.SetOpacity, self.opacity) specular_color = tvtk_base.vtk_color_trait((1.0, 1.0, 1.0)) def _specular_color_changed(self, old_val, new_val): self._do_change(self._vtk_obj.SetSpecularColor, self.specular_color, 1) diffuse_color = tvtk_base.vtk_color_trait((1.0, 1.0, 1.0)) def _diffuse_color_changed(self, old_val, new_val): self._do_change(self._vtk_obj.SetDiffuseColor, self.diffuse_color, 1) color = tvtk_base.vtk_color_trait((1.0, 1.0, 1.0)) def _color_changed(self, old_val, new_val): self._do_change(self._vtk_obj.SetColor, self.color) _updateable_traits_ = (('edge_visibility', 'GetEdgeVisibility'), ('opacity', 'GetOpacity'), ('specular_color', 'GetSpecularColor'), ('color', 'GetColor'), ('diffuse_color', 'GetDiffuseColor'), ('representation', 'GetRepresentation')) class TestTVTKBase(unittest.TestCase): def test_tvtk_name(self): """Test VTK to TVTK class name conversion.""" v_name = ['vtkFooBar', 'vtkXMLDataReader', 'vtk3DSReader', 'vtk2000Bug'] t_name = ['FooBar', 'XMLDataReader', 'ThreeDSReader', 'Two000Bug'] for i, vn in enumerate(v_name): tn = get_tvtk_name(vn) self.assertEqual(tn, t_name[i]) num = ['Zero', 'One', 'Two', 'Three', 'Four', 'Five', 'Six', 'Seven', 'Eight', 'Nine'] for i in range(10): vn = 'vtk%dA'%i tn = get_tvtk_name(vn) self.assertEqual(tn, '%sA'%num[i]) def test_camel2enthought(self): """Test CamelCase to Enthought style name conversion.""" v_name = ['GetFooBar', 'GetOBBTree', 'XMLDataReader', 'GetFooXML', 'HTMLIsSGML', '_SetMe', '_XYZTest', 'Actor2D', 'Actor3D', 'Actor6D', 'PLOT3DReader', 'Actor61Dimension', 'GL2PSExporter', 'Volume16Reader'] t_name = ['get_foo_bar', 'get_obb_tree', 'xml_data_reader', 'get_foo_xml', 'html_is_sgml', '_set_me', '_xyz_test', 'actor2d', 'actor3d', 'actor6_d', 'plot3d_reader', 'actor61_dimension', 'gl2ps_exporter', 'volume16_reader'] for i, vn in enumerate(v_name): tn = camel2enthought(vn) self.assertEqual(tn, t_name[i]) def test_do_change(self): """Test if VTK object changes when trait is changed.""" p = Prop() p.edge_visibility = not p.edge_visibility p.representation = 'p' p.opacity = 0.5 p.color = (0,1,0) p.diffuse_color = (1,1,1) p.specular_color = (1,1,0) for t, g in p._updateable_traits_: val = getattr(p._vtk_obj, g)() if t == 'representation': self.assertEqual(val, getattr(p, t + '_')) else: self.assertEqual(val, getattr(p, t)) def test_auto_update(self): """Test trait updation when the VTK object changes.""" p = Prop() obj = p._vtk_obj obj.SetEdgeVisibility(1) self.assertEqual(p.edge_visibility, 1) obj.SetOpacity(0.5) self.assertEqual(p.opacity, 0.5) obj.SetRepresentationToPoints() self.assertEqual(p.representation, 'points') val = (1.0, 1.0, 0.0) obj.SetColor(val) self.assertEqual(p.color, val) val = (1.0, 0.0, 0.0) obj.SetDiffuseColor(val) self.assertEqual(p.diffuse_color, val) val = (0.0, 1.0, 0.0) obj.SetSpecularColor(val) self.assertEqual(p.specular_color, val) def test_setup_teardown_observers(self): """If setup_observers and teardown_observers work correctly.""" p = Prop() # Turn off the observers. p.teardown_observers() obj = p._vtk_obj obj.SetEdgeVisibility(1) self.assertEqual(p.edge_visibility, 0) obj.SetOpacity(0.5) self.assertEqual(p.opacity, 1.0) obj.SetRepresentationToPoints() self.assertEqual(p.representation, 'surface') # Setup the observers again. p.update_traits() p.setup_observers() self.assertEqual(p.edge_visibility, 1) self.assertEqual(p.opacity, 0.5) self.assertEqual(p.representation, 'points') obj.SetEdgeVisibility(0) self.assertEqual(p.edge_visibility, 0) obj.SetOpacity(1.0) self.assertEqual(p.opacity, 1.0) obj.SetRepresentationToSurface() self.assertEqual(p.representation, 'surface') def test_pickle(self): """Test if pickling works.""" p = Prop() p.edge_visibility = 1 p.representation = 'p' p.opacity = 0.5 p.color = (0,1,0) p.diffuse_color = (0,1,1) p.specular_color = (1,1,0) s = pickle.dumps(p) del p p = pickle.loads(s) self.assertEqual(p.edge_visibility, 1) self.assertEqual(p.opacity, 0.5) self.assertEqual(p.representation, 'points') val = (0.0, 1.0, 1.0) self.assertEqual(p.color, val) val = (0.0, 1.0, 1.0) self.assertEqual(p.diffuse_color, val) val = (1.0, 1.0, 0.0) self.assertEqual(p.specular_color, val) # test if pickling also works on an existing object. d = p.__getstate__() del p p = Prop() addr = p._vtk_obj.__this__ p.__setstate__(d) # Make sure its the same object. self.assertEqual(addr, p._vtk_obj.__this__) self.assertEqual(p.edge_visibility, 1) self.assertEqual(p.opacity, 0.5) self.assertEqual(p.representation, 'points') val = (0.0, 1.0, 1.0) self.assertEqual(p.color, val) def test_rev_prefix_map(self): """Test the reverse prefix map trait we use.""" p = Prop() p.representation = 'p' p.representation = 'wire' p.representation = 'points' p.representation = 2 self.assertEqual(p.representation, 'surface') self.assertRaises(traits.TraitError, setattr , p, 'representation', 'points1') self.assertRaises(traits.TraitError, setattr , p, 'representation', 'POINTS') def test_deref_vtk(self): """Test the `deref_vtk` function.""" p = Prop() o = tvtk_base.deref_vtk(p) self.assertEqual(o.IsA('vtkProperty'), True) o1 = tvtk_base.deref_vtk(o) self.assertEqual(o1.IsA('vtkProperty'), True) o = tvtk_base.deref_vtk(self) self.assertEqual(o.__class__.__name__, 'TestTVTKBase') def test_obj_del(self): """Test object deletion and reference cycles.""" p = Prop() p.representation = 0 ref = weakref.ref(p) del p self.assertEqual(ref(), None) def test_strict_traits(self): """Test if TVTK objects use strict traits.""" p = Prop() self.assertRaises(traits.TraitError, setattr, p, 'foo', 1) self.assertRaises(traits.TraitError, setattr, p, '_foo', 1) self.assertRaises(traits.TraitError, setattr, p, '__foo', 1) def test_init_traits(self): """Test if the objects traits can be set in __init__.""" p = Prop(opacity=0.1, color=(1,0,0), representation='p') self.assertEqual(p.opacity, 0.1) self.assertEqual(p.color, (1.0, 0.0, 0.0)) self.assertEqual(p.representation, 'points') # Test case where the object traits are wrong. self.assertRaises(traits.TraitError, Prop, foo='bar') def test_zz_object_cache(self): """Test if object cache works correctly.""" # HACK! The zz in the method name ensures that this is run # last. The reloading messes up some of the other tests # because the Prop classes base class is different. l1 = len(tvtk_base._object_cache) p = Prop() addr = p._vtk_obj.__this__ self.assertEqual(l1 + 1, len(tvtk_base._object_cache)) self.assertEqual(p, tvtk_base._object_cache.get(addr)) del p gc.collect() # Force collection. self.assertEqual(l1, len(tvtk_base._object_cache)) self.assertEqual(addr in tvtk_base._object_cache, False) # Check reload-safety. p = Prop() l1 = len(tvtk_base._object_cache) imp.reload(tvtk_base) self.assertEqual(l1, len(tvtk_base._object_cache)) # Reloading causes havoc with nosetests based tests so we skip in # that case. Unittest will see the test just fine. test_zz_object_cache.__test__ = False if __name__ == "__main__": unittest.main() mayavi-4.5.0/tvtk/tests/test_tvtk_scene.py0000644000076500000240000000173112747716314021340 0ustar prabhustaff00000000000000""" Tests for the garbage collection of TVTKScene objects. """ # Authors: Deepak Surti, Ioannis Tziakos # Copyright (c) 2015, Enthought, Inc. # License: BSD Style. import unittest import weakref import gc from tvtk.pyface.tvtk_scene import TVTKScene from tvtk.tests.common import restore_gc_state class TestTVTKScene(unittest.TestCase): def test_tvtk_scene_garbage_collected(self): # given scene_collected = [] scene_weakref = None def scene_collected_callback(weakref): scene_collected.append(True) def do(): scene = TVTKScene() reference = weakref.ref(scene, scene_collected_callback) scene.close() return reference # when with restore_gc_state(): gc.disable() scene_weakref = do() # The TVTK Scene should have been collected. self.assertTrue(scene_collected[0]) if __name__ == "__main__": unittest.main() mayavi-4.5.0/tvtk/tests/test_visual.py0000644000076500000240000002031312747716314020473 0ustar prabhustaff00000000000000import unittest import numpy as np from numpy.testing import assert_allclose from tvtk.tools import visual def get_bounds(pos, sz): pos = np.asarray(pos) sz = np.asarray(sz) diff = sz*0.5 bounds = np.zeros(6, dtype=float) bounds[::2] = pos - diff bounds[1::2] = pos + diff return bounds class DummyScene: def __init__(self): self.actors = [] def add_actors(self, *args): self.actors.extend(args) def remove_actors(self, *args): for arg in args: self.actors.remove(arg) def render(self): pass def reset_zoom(self): pass class DummyViewer: def __init__(self): self.scene = DummyScene() class TestVisual(unittest.TestCase): def setUp(self): self.viewer = DummyViewer() visual.set_viewer(self.viewer) def tearDown(self): visual.set_viewer(None) def test_ring(self): # Given r = visual.ring() # Then assert_allclose(r.polydata.bounds, (0.0, 0.0, -0.5, 0.5, -0.5, 0.5)) self.assertEqual(r.radius, 0.5) self.assertEqual(r.tube.radius, 0.01) # Given r = visual.ring(radius=1.0, pos=(1.0, 1.0, 1.0)) # When/Then self.assertEqual(r.radius, 1.0) self.assertEqual(r.thickness, 0.01) self.assertEqual(r.tube.radius, 0.01) assert_allclose(r.pos, (1.0, 1.0, 1.0)) assert_allclose(r.polydata.bounds, (1.0, 1.0, 0.0, 2.0, 0.0, 2.0)) # When r.x = 10.0 # Then assert_allclose(r.pos, (10.0, 1.0, 1.0)) # When r = visual.ring(axis=(0., 1., 0.)) # Then assert_allclose(r.polydata.bounds, (-0.5, 0.5, 0.0, 0.0, -0.5, 0.5), atol=1e-8, rtol=0) self.assertEqual(r.radius, 0.5) self.assertEqual(r.tube.radius, 0.01) # When r.axis = 1,0,0 assert_allclose(r.polydata.bounds, (0.0, 0.0, -0.5, 0.5, -0.5, 0.5)) def test_cone(self): # Given c = visual.cone() # Then z = np.sqrt(3)/4 assert_allclose(c.polydata.bounds, (-0.5, 0.5, -0.5, 0.5, -z, z)) self.assertEqual(c.radius, 0.5) self.assertEqual(c.height, 1.0) # When c = visual.cone(pos=(1.0, 1.0, 1.0)) # Then z = np.sqrt(3)/4 assert_allclose(c.polydata.bounds, (0.5, 1.5, 0.5, 1.5, 1-z, 1+z)) # When c = visual.cone(axis=(0, 1, 0), height=2.0) # Then z = np.sqrt(3)/4 assert_allclose(c.polydata.bounds, (-0.5, 0.5, -1, 1., -z, z)) def test_sphere(self): # When s = visual.sphere() # Then # The discrete representation of the sphere makes the bounds a bit # smaller than one would expect. assert_allclose(s.polydata.bounds, (-0.5, 0.5, -0.5, 0.5, -0.5, 0.5), rtol=1e-2) self.assertEqual(s.radius, 0.5) # When s = visual.sphere(pos=(1.0, 1.0, 1.0)) # Then assert_allclose(s.polydata.bounds, (0.5, 1.5, 0.5, 1.5, 0.5, 1.5), rtol=1e-2) # When s = visual.sphere(x=1.0) # Then assert_allclose(s.polydata.bounds, (0.5, 1.5, -0.5, 0.5, -0.5, 0.5), rtol=1e-2) def test_cylinder(self): # When c = visual.cylinder(radius=0.5, length=2, pos=(1,1,1)) # Then assert_allclose( c.polydata.bounds, (1.0, 3.0, 0.5, 1.5, 0.5, 1.5), rtol=1e-2 ) # When c = visual.cylinder(radius=0.5, length=2, x=1.0) # Then assert_allclose( c.polydata.bounds, (1.0, 3.0, -0.5, 0.5, -0.5, 0.5), rtol=5e-2 ) def test_box(self): # When pos = np.array((1.0, 2.0, 3.0)) sz = pos.copy() b = visual.box(size=tuple(sz), pos=pos) # Then bounds = get_bounds(pos, sz) assert_allclose(b.polydata.bounds, bounds) # Given b = visual.box() orig_bounds = (-0.5, 0.5, -0.5, 0.5, -0.5, 0.5) assert_allclose(b.polydata.bounds, orig_bounds) # When b.axis = 1,1,0 # Then x = np.sqrt(2) bounds = get_bounds((0.,0,0), (x, x, 1.0)) assert_allclose(b.polydata.bounds, bounds) # When b.axis = 1,0,0 assert_allclose(b.polydata.bounds, orig_bounds) def test_arrow(self): # Given a = visual.arrow() # Then self.assertEqual(a.radius_cone, 0.08) self.assertEqual(a.radius_shaft, 0.03) self.assertEqual(a.length_cone, 0.35) bounds = get_bounds((0.5, 0.0, 0.0), (1.0, 0.16, 0.14)) assert_allclose(a.polydata.bounds, bounds, atol=1e-3, rtol=0) # When a.axis = 0, 0, 1 # Then bounds = get_bounds((0.0, 0.0, 0.5), (0.14, 0.16, 1.0)) assert_allclose(a.polydata.bounds, bounds, atol=1e-3, rtol=0) # Given a = visual.arrow(pos=(1,1,1)) # Then bounds = get_bounds((1.5, 1.0, 1.0), (1.0, 0.16, 0.14)) assert_allclose(a.pos, (1,1,1)) assert_allclose(a.polydata.bounds, bounds, atol=1e-3, rtol=0) def test_ellipsoid(self): # When s = visual.ellipsoid(size=(1.0, 1.0, 1.0), pos=(1,1,1)) # Then # The discrete representation of the sphere makes the bounds a bit # smaller than one would expect. bounds = get_bounds((1., 1, 1), (1., 1, 1)) assert_allclose(s.polydata.bounds, bounds, rtol=1e-2) self.assertEqual(s.radius, 0.5) # Given/When s = visual.ellipsoid(size=(1.0, 1.0, 0.5)) # Then bounds = get_bounds((0., 0, 0), (1., 1.0, 0.5)) assert_allclose(s.polydata.bounds, bounds, rtol=1e-2) self.assertEqual(s.length, 1.0) self.assertEqual(s.height, 1.0) self.assertEqual(s.width, 0.5) # Given/When s = visual.ellipsoid(length=1.0, height=1.0, width=0.5) # Then bounds = get_bounds((0., 0, 0), (1., 1.0, 0.5)) assert_allclose(s.polydata.bounds, bounds, rtol=1e-2) assert_allclose(s.size, (1.0, 1.0, 0.5)) self.assertEqual(s.length, 1.0) self.assertEqual(s.height, 1.0) self.assertEqual(s.width, 0.5) def test_curve(self): # Given/When c = visual.curve(points=[[0,0,0],[1,1,1]], pos=(1,1,1)) # Then bounds = get_bounds((1.5, 1.5, 1.5), (1.0, 1.0, 1.0)) assert_allclose(c.polydata.bounds, bounds) # When c = visual.curve(points=[[0,0,0],[1,1,1]], axis=(0, 1, 0)) # Then bounds = get_bounds((-0.5, 0.5, 0.5), (1.0, 1.0, 1.0)) assert_allclose(c.polydata.bounds, bounds) def test_helix(self): # Given/When h = visual.helix(pos=(1,1,1)) # Then bounds = get_bounds((1.5, 1.0, 1.0), (1.0, 0.4, 0.4)) assert_allclose(h.polydata.bounds, bounds, atol=3e-2, rtol=0) # Given/When h.axis = 0, 1, 0 # Then bounds = get_bounds((1.0, 1.5, 1.0), (0.4, 1.0, 0.4)) assert_allclose(h.polydata.bounds, bounds, atol=3e-2, rtol=0) # Given/When h.axis = 1, 0, 0 # Then bounds = get_bounds((1.5, 1.0, 1.0), (1.0, 0.4, 0.4)) assert_allclose(h.polydata.bounds, bounds, atol=3e-2, rtol=0) def test_frame(self): # Given s = visual.sphere() a = visual.arrow() f = visual.frame(s, a) # Then axis = (1.0, 0, 0) assert_allclose(s.axis, axis, rtol=0, atol=1e-15) assert_allclose(a.axis, axis, rtol=0, atol=1e-15) assert_allclose(f.axis, axis, rtol=0, atol=1e-15) # When axis = (0, 1.0, 0.0) f.axis = axis # Then assert_allclose(s.axis, axis, rtol=0, atol=1e-15) assert_allclose(a.axis, axis, rtol=0, atol=1e-15) assert_allclose(f.axis, axis, rtol=0, atol=1e-15) # When pos = (1., 1.0, 1.0) f.pos = pos # Then assert_allclose(s.pos, pos, rtol=0, atol=1e-15) assert_allclose(a.pos, pos, rtol=0, atol=1e-15) assert_allclose(f.pos, pos, rtol=0, atol=1e-15) if __name__ == '__main__': unittest.main() mayavi-4.5.0/tvtk/tests/test_vtk_parser.py0000644000076500000240000003143412747716314021356 0ustar prabhustaff00000000000000# Author: Prabhu Ramachandran # License: BSD style # Copyright (c) 2004, Enthought, Inc. """Tests for vtk_parser.py. Note that the `test_parse_all` parses every single class in VTK-Python. It organizes the methods and also tries to obtain the method signature for every method in every class. If this runs without crashing or raising any exceptions, then it shows that the vtk_parser will work for any VTK class. The test will show a few VTK error messages but they are usually harmless. """ from __future__ import print_function import unittest from tvtk import vtk_parser import time # Only used when timing. import sys # Only used when debugging. import vtk # This is a little expensive to create so we cache it. _cache = vtk_parser.VTKMethodParser() vtk_major_version = vtk.vtkVersion.GetVTKMajorVersion() vtk_minor_version = vtk.vtkVersion.GetVTKMinorVersion() class TestVTKParser(unittest.TestCase): def setUp(self): self.p = _cache def test_methods(self): """Check get_methods.""" p = self.p meths = p.get_methods(vtk.vtkFloatArray) # Check if special methods are removed. for m in meths: self.assertEqual((m.find('__') == -1), True) def test_parse(self): """Check if the methods are organized correctly.""" p = self.p # Simple case of a vtkObject. p.parse(vtk.vtkObject()) self.assertEqual(p.get_toggle_methods(), {'Debug': 0, 'GlobalWarningDisplay': 1}) if (vtk_major_version >= 5 and vtk_minor_version >= 10) or \ (vtk_major_version >= 6): self.assertEqual(p.get_state_methods(), {}) self.assertEqual(p.get_get_methods(), ['GetCommand', 'GetMTime']) elif vtk_major_version >= 5 and vtk_minor_version >= 6: self.assertEqual(p.get_state_methods(), {}) self.assertEqual(p.get_get_methods(), ['GetMTime']) else: self.assertEqual(p.get_state_methods(), {'ReferenceCount':(1, None)}) self.assertEqual(p.get_get_methods(), ['GetMTime']) self.assertEqual(p.get_get_set_methods(), {}) res = ['AddObserver', 'BreakOnError', 'HasObserver', 'InvokeEvent', 'IsA', 'Modified', 'NewInstance', 'Register', 'RemoveObserver', 'RemoveObservers', 'SafeDownCast', 'UnRegister', 'RemoveAllObservers'] for i in p.get_other_methods(): self.assertEqual(i in res, True) # Parse a fairly complex case of a vtkProperty with the same # parser object. p.parse(vtk.vtkProperty) self.assertEqual(p.toggle_meths, p.get_toggle_methods()) res = {'EdgeVisibility': 0, 'BackfaceCulling': 0, 'FrontfaceCulling': 0} if 'Shading' in p.get_toggle_methods(): res['Shading'] = 0 result = p.get_toggle_methods() for key in res: self.assertEqual(key in result, True) self.assertEqual(result[key], res[key]) res = {'Interpolation': [['Gouraud', 1], ['Flat', 0], ['Gouraud', 1], ['Phong', 2]], 'Representation': [['Surface', 2], ['Points', 0], ['Surface', 2], ['Wireframe', 1]]} self.assertEqual(p.get_state_methods(), res) self.assertEqual(p.state_meths, p.get_state_methods()) obj = vtk.vtkProperty() if hasattr(vtk, 'VTK_LARGE_FLOAT'): int_max = vtk.VTK_LARGE_INTEGER float_max = vtk.VTK_LARGE_FLOAT else: int_max = vtk.VTK_INT_MAX float_max = vtk.VTK_FLOAT_MAX res = {'Ambient': (0.0, (0.0, 1.0)), 'AmbientColor': ((1.0, 1.0, 1.0), None), 'Color': ((1.0, 1.0, 1.0), None), 'Diffuse': (1.0, (0.0, 1.0)), 'DiffuseColor': ((1.0, 1.0, 1.0), None), 'EdgeColor': ((1.0, 1.0, 1.0), None), 'LineStipplePattern': (65535, None), 'LineStippleRepeatFactor': (1, (1, int_max)), 'LineWidth': (1.0, (0.0, float_max)), 'Opacity': (1.0, (0.0, 1.0)), 'PointSize': (1.0, (0.0, float_max)), 'ReferenceCount': (1, None), 'Specular': (0.0, (0.0, 1.0)), 'SpecularColor': ((1.0, 1.0, 1.0), None), 'SpecularPower': (1.0, (0.0, 100.0))} if ('ReferenceCount' not in p.get_get_set_methods()): del res['ReferenceCount'] result = list(p.get_get_set_methods().keys()) if hasattr(obj, 'GetTexture'): result.remove('Texture') self.assertEqual(sorted(res.keys()), sorted(result)) self.assertEqual(p.get_set_meths, p.get_get_set_methods()) for x in res: if res[x][1]: # This is necessary since the returned value is not # usually exactly the same as defined in the header file. default = getattr(obj, 'Get%s'%x)() val = getattr(obj, 'Get%sMinValue'%x)(), \ getattr(obj, 'Get%sMaxValue'%x)() self.assertEqual(p.get_get_set_methods()[x], (default, val)) if hasattr(obj, 'GetTexture'): expect = ['GetMaterial', 'GetMaterialName', 'GetNumberOfTextures', 'GetShaderProgram'] if hasattr(obj, 'GetMaterialName'): if hasattr(obj, 'GetShaderDeviceAdapter2'): expect.append('GetShaderDeviceAdapter2') msg = "%s not in %s"%(p.get_get_methods(), expect) self.assertTrue(all([x in expect for x in sorted(p.get_get_methods())]), msg) else: expect.remove('GetMaterialName') self.assertEqual(p.get_get_methods(), expect) else: self.assertEqual(p.get_get_methods(), []) self.assertEqual(p.get_meths, p.get_get_methods()) res = ['BackfaceRender', 'DeepCopy', 'Render'] if hasattr(obj, 'GetTexture'): if vtk_major_version >= 6: res = ['AddShaderVariable', 'BackfaceRender', 'DeepCopy', 'ReleaseGraphicsResources', 'RemoveAllTextures', 'RemoveTexture', 'Render'] if (vtk_major_version == 7 or vtk_minor_version >= 2): res.append('VTKTextureUnit') else: res = ['AddShaderVariable', 'BackfaceRender', 'DeepCopy', 'LoadMaterial', 'LoadMaterialFromString', 'ReleaseGraphicsResources', 'RemoveAllTextures', 'RemoveTexture', 'Render'] if hasattr(obj, 'PostRender'): res.append('PostRender') res.sort() self.assertEqual(p.get_other_methods(), res) self.assertEqual(p.other_meths, p.get_other_methods()) def test_parse_image_reslice(self): """Check if the vtkImageReslice is parsed correctly.""" p = self.p p.parse(vtk.vtkImageReslice) state_meths = p.get_state_methods() self.assertEqual('OutputSpacing' not in state_meths, True) self.assertEqual('OutputOrigin' not in state_meths, True) self.assertEqual('OutputExtent' not in state_meths, True) def test_props_allocated_rendertime_is_not_a_get_set_method(self): p = self.p a = vtk.vtkActor() if hasattr(a, 'GetAllocatedRenderTime'): p.parse(vtk.vtkProp) self.assertFalse('AllocatedRenderTime' in p.get_get_set_methods()) def test_method_signature(self): """Check if VTK method signatures are parsed correctly.""" p = self.p # Simple tests. o = vtk.vtkProperty() self.assertEqual([(['string'], None)], p.get_method_signature(o.GetClassName)) if hasattr(vtk, 'vtkArrayCoordinates'): self.assertEqual([([('float', 'float', 'float')], None), ([None], (['float', 'float', 'float'],)), ([None], ('float', 'float', 'float'))], p.get_method_signature(o.GetColor)) else: self.assertEqual([([('float', 'float', 'float')], None), ([None], (('float', 'float', 'float'),))], p.get_method_signature(o.GetColor)) if hasattr(vtk, 'vtkArrayCoordinates'): self.assertEqual([([None], ('float', 'float', 'float')), ([None], (['float', 'float', 'float'],))], p.get_method_signature(o.SetColor)) else: self.assertEqual([([None], ('float', 'float', 'float')), ([None], (('float', 'float', 'float'),))], p.get_method_signature(o.SetColor)) # Get VTK version to handle changed APIs. vtk_ver = vtk.vtkVersion().GetVTKVersion() # Test vtkObjects args. o = vtk.vtkContourFilter() if vtk_major_version < 6: sig = p.get_method_signature(o.SetInput) else: sig = p.get_method_signature(o.SetInputData) if len(sig) == 1: self.assertEqual([([None], ['vtkDataSet'])], sig) elif vtk_ver[:3] in ['4.2', '4.4']: self.assertEqual([([None], ['vtkDataObject']), ([None], ('int', 'vtkDataObject')), ([None], ['vtkDataSet']), ([None], ('int', 'vtkDataSet')) ], sig) elif vtk_ver[:2] == '5.' or vtk_ver[:3] == '4.5': self.assertEqual([([None], ['vtkDataObject']), ([None], ('int', 'vtkDataObject')), ], sig) self.assertEqual([(['vtkPolyData'], None), (['vtkPolyData'], ['int'])], p.get_method_signature(o.GetOutput)) # Test if function arguments work. self.assertEqual([(['int'], ('int', 'function'))], p.get_method_signature(o.AddObserver)) # This one's for completeness. if ((len(p.get_method_signature(o.RemoveObserver))) == 2): self.assertEqual([([None], ['vtkCommand']), ([None], ['int'])], p.get_method_signature(o.RemoveObserver)) else: self.assertEqual([([None], ['int'])], p.get_method_signature(o.RemoveObserver)) def test_special_non_state_methods(self): """Check exceptional cases that are not state methods.""" p = self.p p.parse(vtk.vtkDataObject) self.assertTrue('UpdateExtent' not in p.get_state_methods()) if vtk_major_version < 6: self.assertTrue('UpdateExtent' in p.get_get_set_methods()) p.parse(vtk.vtkImageImport) self.assertTrue('DataExtent' not in p.get_state_methods()) self.assertTrue('DataExtent' in p.get_get_set_methods()) def test_no_tree(self): """Check if parser is usable without the tree.""" p = vtk_parser.VTKMethodParser(use_tree=False) self.assertEqual(p.get_tree(), None) self.p = p self.test_methods() self.test_parse() self.test_method_signature() # Now check that it really works for abstract classes. # abstract classes that have state methods abs_class = [vtk.vtkDicer, vtk.vtkMapper, vtk.vtkScalarsToColors, vtk.vtkStreamer, vtk.vtkUnstructuredGridVolumeMapper, vtk.vtkVolumeMapper, vtk.vtkXMLWriter] for k in abs_class: p.parse(k) # Make sure we did get the state methods. self.assertEqual(len(p.get_state_methods()) > 0, True) for key, values in p.get_state_methods().items(): for val in values: # No state information is obtainable since no # class tree is created. self.assertTrue(val[1] in [None, 0, 1, 2]) def test_parse_all(self): """Check if all VTK classes are parseable.""" # This test is a tough one because every single class in the # VTK API is parsed. A few VTK error messages (not test # errors) might be seen on screen but these are normal. #t1 = time.clock() p = self.p for obj in dir(vtk): k = getattr(vtk, obj) ignore = ['mutable', 'exc', 'kits', 'util'] if hasattr(k, '__bases__') and obj not in ignore: #print(k.__name__, end=' ') #sys.stdout.flush() p.parse(k) for method in p.get_methods(k): #print method p.get_method_signature(getattr(k, method)) #print time.clock() - t1, 'seconds' if __name__ == "__main__": unittest.main() mayavi-4.5.0/tvtk/tests/test_wrapper_gen.py0000644000076500000240000000434412747716314021507 0ustar prabhustaff00000000000000"""Elementary tests for wrapper_gen.py. This test suite is not comprehensive because it is very hard to test wrapper_gen directly. """ # Author: Prabhu Ramachandran # Copyright (c) 2004, Prabhu Ramachandran, Enthought, Inc. # License: BSD Style. import unittest import vtk from tvtk import wrapper_gen _cache = wrapper_gen.WrapperGenerator() class TestWrapperGenerator(unittest.TestCase): def setUp(self): self.wg = _cache def test_find_type(self): wg = self.wg sigs = ['int', 'vtkOpenGLVolumeMapper', ('int', 'int', 'float', 'list'), ('int', 'vtkActor', 'vtkXMLReader'), ['vtkImageActor', 'vtkExporter'], ['int', 'vtkDataArray', 'vtkCellArray', 'vtkIdTypeArray'] ] expect = ['basic', 'vtk', 'basic', 'vtk', 'vtk', 'array'] for i, sig in enumerate(sigs): self.assertEqual(expect[i], wg._find_type(sig)) def test_sig_types(self): wg = self.wg meths = [vtk.vtkProperty.GetColor, vtk.vtkProperty.GetRepresentation, vtk.vtkStructuredPointsReader.GetOutput, vtk.vtkPolyData.SetPoints, vtk.vtkPolyData.SetPolys, vtk.vtkQuad.CellBoundary, vtk.vtkContourFilter.SetLocator ] expect = [('basic', 'basic'), ('basic', None), ('vtk', 'basic'), ('basic', 'array'), ('basic', 'array'), ('basic', 'array'), ('basic', 'vtk'), ] for i, meth in enumerate(meths): sig = wg.parser.get_method_signature(meth) self.assertEqual(expect[i], wg._find_sig_type(sig)) sig = [(['int'], ['int']), (['vtkStructuredPoints'], ['vtkFooClass'])] self.assertEqual(('vtk', 'vtk'), wg._find_sig_type(sig)) def test_unicode_return_value(self): wg = self.wg meth = vtk.vtkDelimitedTextReader.GetUnicodeRecordDelimiters sig = wg.parser.get_method_signature(meth) self.assertEqual(sig[0][0][0], 'unicode') if __name__ == "__main__": unittest.main() mayavi-4.5.0/tvtk/tools/0000755000076500000240000000000012747722127015555 5ustar prabhustaff00000000000000mayavi-4.5.0/tvtk/tools/__init__.py0000644000076500000240000000013212747716314017663 0ustar prabhustaff00000000000000# Author: Prabhu Ramachandran # Copyright (c) 2005, Enthought, Inc. # License: BSD Style. mayavi-4.5.0/tvtk/tools/images/0000755000076500000240000000000012747722127017022 5ustar prabhustaff00000000000000mayavi-4.5.0/tvtk/tools/images/image_LICENSE.txt0000644000076500000240000000060112747716314022005 0ustar prabhustaff00000000000000The icons are mostly derived work from other icons. As such they are licensed accordingly to the original license: Crystal: LGPL Unless stated in this file, icons are work of enthought, and are released under a 3 clause BSD-like license. Files and orginal authors: ---------------------------------------------------------------- scene.ico | Crystal mayavi-4.5.0/tvtk/tools/images/scene.ico0000644000076500000240000030717612747716314020632 0ustar prabhustaff00000000000000hf  00%@@(B.D(V( ecݒ]͕qetVPNœHXQBSOٕ(hmޘyq}!XYxk`epʇqbg,#4oyם{ߗc]MbߙfLD:zvx֙5UNߗdxdU?8sgBhcGS}n~b~lAWQ@Ek`Vߗe*C@Q7?gPt6"1T~xsvrSNsmPGMfQqdkog^2pq?1:+8@jRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRYYYYYYYYYYYYYYYYYYYK=4!OZF Ea6YYI:]LPWN'M_.YY+ `\TGYY *^B531YY/" > #UHYY;)8,@CS2YY&[D?(V$QYY9%7-J0li7YX5㴴( A(3[IJkaczlry]MY|p`gbVf;:5TEBV>T㴴ʧtjR UO`H`m/76#$)",#&LB\]Pl<;E[Xp$1H㴴ʛʺ|}_WY."@VY qjjkjkkkmlnnpopuN㴴=pkljlmlmnnmnnopuM㴴My4u.t.s.s.s-s-s/u0u0t0v1v1w0y2~9_㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴( @ 㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴 * ## % .!4+08-N/#0)+K/2/ 9C)'/%9 5) 㴴H.T7W<O8G-N8YNONKM?#K@m^hW]GY@WEdS^IO3E Q4P1QRim_MZN;(㴴Q;(|h,{`(se&wg$z71~w!{p0|'}-zmWaHI0ZJVBR=+u`H=}.wg3nG0fd+{o"r_gQ㴴W5FzU_rNWgwenzmlͳmto_hozueicelqT=B]9e㴴ҭѽغk<4) VVj\Up3OU'*!7+4162LFOgSrg[x24:`XpYHk6OO?HR_r㴴ὖ˪԰ٷ|{[TS/':E?Xx<)-  cmjcf]tyljge]yePpBXX㴴‘̢̤ͥͤܧȢzwt}3(8CC 4'uXg~`H=W;9\qrXUmaltDQS!2-㴴ˆΞ͞ϞΞΝ¢lxiPbsgzkeG.Š淉smcW")+-0G07M!-0㴴|ĖƔŔȔǔȔޗpxxhzG;Wx͘Ȕʔɖ՝ВYjQ/,"㴴uŽ‹ȎϊquipIŽđĐÐđďőқɋ㴴kćɁFHkn͒ń㴴a}|}|~yʼn~v㴴Xvvvvttvvuxwvxxwyx|{z}|}}~}l㴴Qpppnonpnpnoqprrqsrtvsuvuwud㴴Imkiikkkkkklllkmmlnooopoqso]㴴ޅEjghhgghgggihhjiiiijjlkmlnjW㴴?c`bbߗdb`bޗbdߗcߗcߙefdfcfeeeefihfU㴴|:ݔ_^ݕaޕaޓaޓ_ܕ`ݕ`ݕ`ݕ`ݓ`ݕ_ەaݕbݔbݖaޖdޕaߗcߗcߖaޘbdeffS㴴Ys/t1u2u2s2t0t1q/t0r.r-r/q.s0s2s1s3u1t1v3v5w7y4{6z7y7o#㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴(0` $㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴㴴 C0>3B7K85,4+@4>2DFB9=9GFI;@8K?MKPIMSMaJKM=Q:H2O:F6XC`GNCP?KASYMPG>N<N:K>QBWBP;PDI8 C.B.C1M:W?OAI>H6MBK@FEQSF@ QSZSO?QKVU]m _aVRXGT@RATC]PeP`K[FZH^MVFVHWGQCMH `U eWXGYQWH I2P;YAS>U:X>T=[BT>XH`L^U]R ]]KII9UDUHcNiQ_KXBYAV=Q@WG[L[K\JZCP5P5R9T6\K VXdj_WYKdVSD [GhTkVgLeNhUiWp`pa%yp&~p&t"{rykwjscudwenZlVqWhO aPjYk[dNcMlWiSl\n\p[ tdr\%yl#nla\oal\mYlW vpltqqfgeutpwzhntfik^qmT|uZooly}guuarrui|}OhkbtxK`^QfhB?:>=20,%@?9>5.C6-bVOqkg~Z]`]`ehvwV[]PFHRMMdhdXbaCPL cU\scfoY]N:>kZ\oZ_dQOudaZPNjahw}g`c>21wyVJPniitwtzZXYZX^urtohomnoRYX;=9),!ED:[UNme]GC8WZZlvxPQObcgFBKniq[ZU~~x~L`Z{mctMPUGIO_^fZXbE5I./0"3$DGPUMd]Tmeiw'-&!' WXf{tqME\WWt êԸxudVkbMB<+ !  "#$"755<;<<:CDIOKGS?LU:8)#%$&G?Hb_pYZhYXkBY[193&%+,"*( ("724632350ZUcdZt\Qgg_wUNcOM\b\w_WtQLcBQTAORGWZ ǦȩɨɨɨɨʪҰʬpp|SKMA845,',#70-A@APgnGZ[=:9)%!%*",&!-+"XYcwwmh_Tkb\rj`ye^wge|e^y`Us]PjMS^0J> Ȥʦʦʦ˦˦˧̦Ш̲{\X\4+%*"?HDOW]KAH6"*%&"!)#-#71(TO^c[whZqh^uuqskkf\WmNQ]U]gTfj;KN ˠ̣̣͢ΣΣΣϢϣӣw~w_YaD97HHB92-)-XD0~_ƥ}ղ׵z}jcVJX]Sfmh|}wpdb{HIR]dnOX`.;2 ˜̞̞͞͞͞͞͞Ξϟ̝|kWho`t[AQoQxhլ̜ݪڨ٧٧ݩҠѯ}ai`YMKODDIe`n]Vh\[k>DD>D@ ǖȘȘȘɘɘɘʗʘɘ͙輔}rcw}[9?zۤסӟϜ͛ΛϛϜϜѝ֠آ͘ǤxhKNB/-, %(&,$+.+ ÐēēĒŒŒŒŒŒƒŒʓٯ{{q}vi]odO͕ȔȔɔɔɕʕʕʕʖ˖˖˗Θӝ֟Őɠtdw[>ZI3 Žō}xO2B.L2O7L; dG\KUKOHM8N8NARBPASQTUME KP ]_URF9MBPVWS\cid_TSUWGO7SAS?Q?TD\M^GdN^I^I^I^GX>U?VFR@T>UIOL aS fX^PWHb[^WUGP; YEV=YES<V:[CV@[BX@Q>UI^J gZ_W_R ]Z ]cD>H9]GVEZIePlUjQ`KZEZA[@T<R@N=aOYNYK_O\I]DM2P8O5W?S7`E YT_d)kzdc ^U]Ol^XKTEQ7W>ZAY9L/T7N7T@aLcP_OcUhU lY k\ k^iUcQ]JcOaJZF`JbMYAbEcH`GbN\J]G`MaMaJ`JdNeIcJ[JX?fMcF`J\@eJ `Y ^\UOZJhU`MbK\E]DbZ}W~UrZ`\`T~SPmvkn`ZkkG_lS@xJK{s?k_9hX,RC2VIIso;cY2UBIgVRk\^~rd`xrb`adqjV~TuuX{{XS~MyIwJ{nWZfTVVADlWVsch[HMZJNZKNZMKktrO`WHGDhbigbdhaajffqjpyz}IA>A=?z|D54L>>QTY?.21E1)2!)++ @$!D/-qbbxhjxrqIE@VMPRNTIIHUSRD47K25O;:H77|ni^VZ>24H:7uhk{~iUWG5;g[ZrghsageWU_QN}omMDDrmx_\]* z_\eQJJuux~|zpy\][[^b{vaaehopZej270=GB{NX^%+#'$[a^;3-qjPRP)0-$*)df_TQFK:9.% TKG_YQxojzppzC<5ihkp|~ZTVjis\ZcZTOeke|CTHnyykfrR[[SXahittrsZTaC,D;3<$/$"4"BJMXWlPE][Qf>?@!*$0)^an{NE[RPiYYzwePXH8>;8BG6E69<+60:=>RG^M?Pd_yUMhHF\,"+:3?H>SGOWcia`G?YNKdccȯ˱ԽtqeR@<.'"  #%(%!(#11*723?9BIBODGMC@LJXW.1.:>@5<83+)' %*#'!$;15[UfpnTZddcyIPXA]\9C?(- (%*,!)'& +'"3102-*350885jdyaXq_UnbXnh`xXPgNK[_Zpb^w^YuYNkJM]C;20(*$+R?,sUǣ|ŖʜԤ˜}}j]TGQZPaeYnkbwzowqieMHXOOY_bp\_o)6,@DC ̞̞͟͟͟͞Ο͟͟ΟΟΞӡͮp\kdO`vkmZmL',}ZyY}_GqSǠw˛۩ک֥֥եץݪפѰvZ`WKNKRYYcTV^b_gxqg\tf]tjiADK:A9XY_ ɛʛɛʛʚ˛˛˛˛̚̚˛̛͛}yl`HY}wpawU% ܦעؤ֣ПΝϞϞООООҠףڤΚɧ|uVF<-*&540=@>7=65<40;/6=9+0&ƗƗƖƖǖȖǖȕȕȕȖȖȖʗŔ|{v{q}xaHX_D՞˖˗˗˗˘̙̙͙͙͘ΚΚϚΚϚќסآȖœrw]BH;&2*)"#!,-)621ēēĒĒđĒđőđĒĒŒőŒɒ|~wp_q~{wp]65̖ȓȓȓȓɓȔɔɕɕʕʕʕʕʕʕ˖̖̖Ι՝՝Ǔ٬|lz]@aK2G9'ŽŽŽŽŽŽŽŽŽŽŽǏԩ|}r_JWo?3ďĐĐĐďĐđĐŐđőőƑŒƒƒǒǓȓȓȓȓɓ˕ϘқϙΘËҩx}yyr>wRɓŽŽŽÏŽÎÏďďĐŐŐŐƑőƑŒȓӦ}[DN\HŽŽŽŽϡu}x}}rr}ܫݧ{||{{{{{{{zz{{{|{{|{|||}||}}||}~~~~~zxxxxxwwxwwwwwxwwxxyxxxxyxyyyzyzz{||}||}}}}}~~~~utttttttssrsttsstttttutuuuuvvvvvwwwwxyyyxyzyz{{{{{}~}}rrqqqqqqppopqpqppqpppqrrqrrrsssstststuvvvuuvwwwwwxyyzzpoooonmmmnnnnnnmmonmnmooooopopqppqqqqrssrrrsssttttvvvvmlmllkjjkkkklkkkkkkllmmlmmmmmmnmmnooopqqoppppqqqqqssstlkjijiihijjiiiiiiiiiijjjjjkklkkkklllmmnmmnnmnnoooppqopiigghggghhgghghhggghghhhhiiiiijiiijjjkklkkkllmmmmmmonmggfffeefffeeedffefefffgffgghhghhgggghhhiiiiiiiijjjklmldecccbcccdddccbcdcbdedeeߘdeeefeeeefefffffffgggghihhijjjb````ߖ`ߖ`ߖ`ߖaߕaޕ`ߕaߖ`ߖ`ߕ_ޕ`ޕ`ޖaޖaޕaޕbޖaޖaޖaޕaޕcޖaޖcޖbޖcޖbߖcߖcߖcߗbߗcccccdcbcedefffghhiߔ^ߔ]ޓ^ޔ\ޔ]ޔ^ݔ^ޔ^ޔ^ݓ^ܓ^ܓ^ݔ]ݓ]ݓ]ݓ^ݔ^ݓ]ݓ^ܓ^ܔ]ܓ^ܓ]ܔ^ܓ^ܓ_۔_ܔ_ݔ_ܔ`ܔ_ݔ`ݔ`ݕaݔ`ݕ`ޕ`ޕ`ޖaߖaߖ`ߖ`ߖ`ߖaߗaabddcdfffܒ[ܑ[ۑZܑZݒ\ܒ\ے]ܒ^ܒ]ے\ۑ\ۑ[ۑ[ے[ۑ\ۑ]ۑ[ڑZۑ[ڑ[ڑ[ۑ[ڑZڑ[ۑ\ڒ\ڒ\ے\ے^ے]ڒ]ۓ]ۓ]ے_ے^ܓ^ܓ^ܓ^ܓ^ݓ_ݓ_ݔ]ݔ^ݔ^ޔ_ޕ_ޖ`ߖ`ߖ`ߗ`ߗabdeېZڏXڏWڏXې[ۑZڑ[ې[ۑ[ڐ[ِYُZِZِYِZُZُYِYِXُXُY؏YُX؏XِYِZِZِYِ[ِ[ِ[ؐ[ِ[ِ\ڐ[ڑ[ڑ[ڑ\ۑ[ۑ\ے\ے[ے]ے]ܓ]ܓ]ܔ]ݔ]ݔ^ݔ^ݔ^ޕ`ޖbߗbsDrCrCsCsEsEsEsFsFsFsErErDrDrErCrCrCrCqCqCpBpCqCqCqCrCrCrDrDrDrFsErFsFsEsDsEsEsFsFsFsGsHtGtGuFuGvIvHvIvJwKwK (                                !!! iii|iii    TLTL [X eXQ:G7LCaLX64%/"><JIGD@2C;BDOK`L`H]=_O]IB(J1aX io]MU; l^ nl lgH= ULULN?M9MDHCD6 ]P`MU;V?B:?@D994>?;2IBGEN;=/F@FGHL ]^[TI<3 5-KH\XLM52^T cRR>C>DC IATHXRPUJX MWSHYO ]a X_JXVmT^ `e Y]B=RDYN_PaLM3N8L7<+V<[AN>OEG2F5WHjIhIeIV>H;I@aZTAY@YCO@[\ah \^EOUS TQ PNQFI7I9TCU>W@VBO>SENBUGWGV?^HT<P5S=D1M@ ZRbQSFI= TKYZID K<K<P7J-GDFK;/ RL WN\D iQF<9:<07*64)!HAKIR9R>RGHJKS eccZRB7"6'MC^_LO*%HBTGVJMD30.*UGk^ddBI?ERIeXaaM\B`PjN^ \a[[KDM;R<^QYCL/O8G8H=oS hOP@UKV=K8TGmShQt^XME@PL kmK>G1V@TGV\^mgc^\]f]gKKM@K<I=_OiQYBL<SE\OVIYI^OS?ZKbM WA aQM9 QGbYcQG?4&A3=;=: D+D+K4F4>04-0+/*>5V>T?A57%5%@1=1@/@->1K9N?F:E>>CGHB<>7HL TX \]XRC=A;H9=2G? dXJBD:]LgNeL dOXIN=dSZKHEKO N^\q ^cRPMLUI^KbKWDWA\BYAaEZ?IBL?W?\G^XYQ f_n`p]nZbMSGXP\NUAQCG>IFZh ^gVL]`aqTWRCM?RETH`O[NRL_O`NTJ[K[JUMXJnZxh jW_INID>UAWCQ<H5D3<* E*E*M=NCG5:%2"A1-#72ZBS5H.B2M@K4@2C6F5B:0&:0@3F= RYB7;/;E2< 1< NTW_USG>@4;5NUYYPMUP`RQ>N?TLXPYNUU \S c]Xt%][}[yWXNETZaZcP\AUHXOYHN@K=S@RELB\NbTdUq^fQjP_GW@\K_SU@\GUFVGYRYL^KNDD@LC^ObMfY YTRFIBC<=,BEHPVKZHlg f[\J[ML:M>JA[RXRL3^G`NcZOK =!=!D;F>G/E*M7S>@*E4O:[DdE[EQRTFNLHOF>J9M7M7G7TGUKS@M7F4H5JC N^PXJFGDA>26 GTXV^X\XPMB>:4MFVOKS Wi`b V] Mj\z bg `^ e\XS U^ Ze`aPAD/N<OCKAN=Q9T<UHXGXJXU_T_IhTiVgPY=S>_I\JVO[C]EZDV?R>SAXHYH]ZTTF8G6H9K9J8HHH?V=hK`HTFRBR:]F\LhV l_``a]ZUN@WQSR B/B/E1D);!A)aIeHO4J:TD ]DkR fLXK[F[M `VNCJ8Z<fNL8P@PG\M`J bS^P[PbSVMPP c[UG [W_i^bZU ]\TQSAM8F8K@GIP[MFO:XGaZ rcmUfP[PUMHCSB\CR8R2U9ZFWCUAYDL?TCV=UF[HY=Q:dNaM_NbK_E`GcJaI`RdL^?V9^EU:G2G6N6R1]<gNh` c[QIPOYX fZm` h[h\ e\YJPC\Y]]cUXIL@\E]HUI F2F2I7Q;I1L/R?O3P0ZKdS`>]?\CR8UE[MS>[C[?T:I-J+L.:*94RM YMXB`Qnngg\OYK[N\M KSZsegLI3-=-Q>`FYEVCTE_T_JhLpWpYiOlReM^LXGY;[<[<W8\D_HW>O9S:H2D1L9gPjO]ISLXH_PcUi\c[T<]@dGV;G-S7_EXAR8fIiO]DS2fCePZS ^Tmj.v8u/n{mvgiollh]S ^V d]pe a[RJPEVN]MP= `?`?S=MBbUfP`WVFO0VB WED5C1L/Y6\<eCM1M7^E[F^KfT_Q`J eQ`RYIeM kTg] Z\bRcW \Z\WbZ ebTZJJB22+NIdR\DcMYEXQbK^C[UhagIgP p\jPdM`N^P\HZC^EW:S6Q>ZQZIL<THaVaXUJ[\\RO<Q?]JVHYCbQW>F)N1G1G4G/I,WDQAR4O;ZB_E RSNN MDU[)g{%ovmg[RMDP< VB cSt\t\YLR>VC\LhX\O [D[DP6U<S7R8 ZE hU`F]A\?L1R:Y:[? X@K9TH g[bHi[ fPaL[I cZ fY^F]IfLgXeQcN]JeUrf mZjXeTaNYJbOkWcKgLdHZIJ<WG]HeUbgYIiGdN^IgPbNT?]NZBdRXLR9[AX@]I`KYK]L]IVL`LdQh\_HfLiP[?bG^HWTI>P3bQbXT;P1T>Q<H-M8^?bGfe QUV`X` U[E@;5UM dY gVZGcRcMYE[FYCN9]FZFSD C0C0@(L4[?W;R8Y=T8\=^8U5U3W;U;S=G5P5W:R9aNcT[?X9VB[L[Nh\ p\iOgRpYqaiadKcIcJhSkUaJ_H]EaKjX^GdI jYjRdIjKb<J-R:a=Z8V7[=a?[8\B]T]QUE^I]M]I]N`LfNdGfJcD^AePdHiJfKcLgTeR_JgLiN w\iFnHqVj`iRgH`@oPdJbT hafY^UVMH<S@kTqXiPRB\J]FP:_EYBZAcFbI_C cZcZeYgXqajWiSlWpXiSfU`KZKg]j`i`f\0sl5xu%nh+yk8|zEGT]aiYWymhZMI5C:1/7*|wqts|r%w%x{owc vf)zm&uk(uc.o,n'ug&qy`mTlTdKr[({tj segU`FgKkN"nR!aI&fM(pW0m6x2o0|k5nF6z.m1y3x6uCA<8{FHQE?B;}8uC@AEC7~4y?5z3{5{3t4z6y4z,{p sfa^U\|w{|vRboYpewxqbmi\i`ZcXTXPOMFND@JE;VRIpply}zTTKK?1aVKo`Yx^Xrloj|a\~~~qots{}v|giqhalh\enfpjepnpvps{mu{ox}hss_tt[utZso\yv`{e^ vw{~muorxpsujrlknrxyruxlry~z~yrwshlsinyryvoojlTlauxnjn]WY][]W[Za`emhq~zz|qoo>@HhjuvnrR?AT::meffklOBIWGKB"%, 0V<2U89) 3/101$6G$'@%)`KPXDI}ptLCIripj]i}wvo}icmmhqonusqsllsh`flajg[dmbhk^eymsvmwqmo~idnc^gidkqkoigmppo cXYcXY=/+3A',PDB8*"( 4 ?,"7*"`PXJ/,* 5 .$ /0@.06":/*_Z_LFA5* ! 1!#HAG[\YE>;\PPuji=71vxTNI_XZ\SS:3, "+B;BLX[@F],'7 % ' C53COK &3!!7"<5!D<.$ #%4.!  7' 0% D70;5,KC=0"%(nsg'>&/7'DHD>BC!+$ 26(++$B"44 )T?)ypf[^ % #!}bM uxux,(NBEja^-""B+,6!$/xmusrnWOM;4/<2,M>>I:?\QTRQG'#9+&WKG[VN&% JDPUX^|uhtg^b¾ZMV(2*!*% ]ji57@ smoJHL4==JNNR31UB8,%%%-8A8)%!zy}fcd6@0~}w|SVVfhjgt}7B6(4"8A38I@/4$s-LJ0(.8/*   5A80% [A6JUN)"0 "  {?,:1qmf}ykdXGG:%3($ kje~y~xu{|yz{k^[XNLZPVNQJaV`w$*V_]UGX;K>0J2)3)t|W]Y_f{vz8&;@,D8"56-6>>)4-&!4$!1+=,Q[alpGNdK?ROAURCZc[lDBMKG@9?8#1('=-8OK^cpwwSDaD7MSLhXSobbSLoE8SD:~o_\SH$& caiivvLWd_gpFNP("2((>=BUVoDEM .,-;3:tqu(&bfbžsxeh}wvPc_)73'/&>VTdyghpyystg_n0(;1?3HH$-'37=49;024;6;?:E<@D6?BC3IJ8PC-C;)78==*,*%2 (C-+1&JMZ;?JPMWjbzSIfN?VSI^JBXTPgKS_ )$"NEVbjsmqdc}aay_b}bcTNlG1;7215'5-!- ?<@[NhF@P=3AWI[jeccVPmM@UXPiPSj2>B!0!)+!,;3AD7NA6GETRZcrdb{fgot]XxI=X>;PACVWUn`^]^RNkA9X ŮŮƮǮǮֺ|}f}rski:%)44$08%/7#,4!'+*+)'-(./$1;0)'(&(1 "&/%""/2"-1$,2(19-*2%&,$"<.<:8<@CH|yJFM7A?/B;;7A@8I9A?IY]CKMHCJbbu;DI3<=EpsJux@`dHOZ;/9JKORRaH?T>/=E:K<8B2*/0*,=57XIYSL^LBTRBXMIZ34:>;E8EI.-+;>D+B80:0WLb[QjUH]OAUI8K`Vjlj\XxOF]XXpFJ^%.')+081FBQK:THASME]>;J4H@dqzirjp]XxQIdOGfI>XXXoa`~il^a}EC_ ªªëëëƮ̲ɮ|xn{pXA1$<5'.8''(((,),()""" )&!.&  "&$33+46+)+ !"-,&(,!960D2=HAMCKP>AGLARNCRNKU)4*<>ARH_WMg;.Tc\tXOlNB]RF_NQc!-.'/%TJdZOlQE`QE_ZVnSKdLEWU]ifr~l|JWlNNfSMhLF`_cygjpuuSXs ĪĪĬĬĬīĩêūϸȱĬǮʰ̱Ū׹гw_[RB<5(&$$ &"($'("%  "'"& $&!'#,( ') & /(%6,/F/CGDOAFGTM^OR]69;QBWZOgM:P,%$RmyHbe.C5*'$'!+-(171.4)0;1/=10:/-1++.$++%($1&$8-0C=D=28L>O=@D32087>+-&-0)E:F_Sk\Pg`SnTG]RAWR?Uh`v]TnZQhVJgTJb/<3 +C=I`ZwXOi[SoSIcUNiRE^VNc199NJC``:NF9FA;GE08.&&//&5?4.2&03)191,+%,+$$")+!.1)0+':254236/2282"#=:7nf}f]r]Ql^Snf_yYNgXI]kaug^wYJbhc|JDZ6<>JHT[Qhheza^z_Ys[Rp[WqULhOBZWQhHal#I9.P;<>?;C.+',("+' 6;38=6.1'A@=rnnj`YraVpe\ubZsZRif]qwt_RncZq[SkULcec|YRiYVege}_[u^Zub_yc_VLgL>VUQfXSiCDL/N?*K=)11&9/AYRLdh_kwdv ƩƩǨǩƪǩƩǪǩȧǩȪɧǧǧǨƨƧƨũŨƨǨ˩{vyru|fhlDA?2)%('&%,#,$0&'/(#73.964DBI`akIDIMBPKUYSnuZkv_kvLai=ROOmr) !2# ,0#$!$#+,$#& ("'-)%6/02/+.+%*&.*!:9.&/%,30&- ɥɥʦʥ˥ʤʦʥʥ˥ʥ˥˥˥̥̥̦̦̥ͥͥͥΤΥΥͤФDz}||bMY^\a9/(5*%1(82(>A7>=6@?=_\d\ZaAC?L0!8('& ).%3*0'+ !  # E5"K=)O=*G4%lX?fU=[I4A1#..'NMVlbxgVpeUmcVjdSexk|i]rtprnnf}xqvmh_xwpstfgGHV3<9*>+/I;4F<6K<>REOif1C=(:/-C7&2-)B/]nv ̢̢̢̤̣̤ˣ̢̤̣̣ͣͣ͢Σͤͣ΢ϢΤϢΣϢϣϣϢϢңîufziXdv~}ylnyIED8*"5-!71$AF=EOJBGA@I:DA:5$1$,+( 0%/$)7(O8%kOa߸ʛʝ•ݫ٨بkj]DHD?O?MbO_n^riXp|n|m[pk_vkbwmdxtl~pcykax}}ge_TrNE[?IKADIABI:7=SU]io}DLR+B:%1(&6H@QR^?CH ΟΟ͢͢͡Ρ͢͢ΡϡΠΡΡΡ΢ϡϢϡϡϠϡϡϡϢϢϡϡТѢ~~dHWshj[krg}yy\JUPD>[Qh849!  ̟͟͟͟͟͟͟͠͠Π͠ΟΟΟΟΟϟϠΟΠΠΟΠΠΟϟΠ͟ѡš~xiyW8A^DQ{wzwiTe\?Krdw6 fItSE4"9$5"3=-M9&w[?fÑ٧ץեңңӢӣӤԣԣդԤգդ֤ޫܪɨ~\FB-63-784GIOd`pc[of`lw^Uboisummje]raSjfYukez~rtPPbBBM&+#@I<{ynauWQc$5)  ˝˝˞˝̞˞̝̞̞̞̞̞͟͟͟͝͞͞͞͞͞͞͞ΞΞΞ͟͟͞Ѡz}pYiZ:DT4BeUldKUwp{qfP^U4:.`齍ի~Útuǡv轎ԣڨգѢѡѠѡѡѠҠҡҢӢӢҢӡӢԢӣԢۨۨÓmjJ\S>?@;>DEDAGNQXDFL /#  ʜʜʜʜʜʜ˛ʜʛ˛ʛʛ˜˜˜˝˜̝̜˝̛̛̛̜̜̜̜̝͛̚˛vzk|cIYeQgAmZi|wzos`wP*1<џw֢ҟգץפ֥ӣОΝϝΟΟПНПРОПџѠѠџџѠҟҠѡѠҟդۧڥϞn~fHNC.01$*)%((!*( 680HFGOMMVY]LNU;@=6=68;59D=15.&/ /71340*5) )-B,'  əəɚɛɚɚɚəȚɚʚșʘəʙʙʙʚʙ˙˚˙˙˙˙ʙʚʚʚʙ͚ĖrzxxeObm]mwomUj>t@*ќ͚͙͙͙͚͙͚͚͚͛͜͜ΜΜΝΝϜϝϜϝНМОНѝОООММўҞԡڤ֢ƓqoU>?-(#/,/0!/3$7:.6;-5<01@/4?16@73A54>=4:3/5+"('$)  ǖǖƘǗǘǘǘǗǖǗǗȘȗɗɘɗȘɗɗɕɗʕɗɗɖɘȘɗɘɘȗ̚ḑ}uymm\i|w{tykRa4^֠ʖ̗̗̘̗̗̘̙̘̙̙͙͚͙͛ΛΚϚΚΚΛϛϛϛϛϚϚϛϚЛϜϜНМўԠآ֡đhkO:9+   ('.-6/&/&1&30(13$:B9HDLTKWIFM..$"0 ŕŕƖƔƖŖŖƕŖƕŕƕǔǕƕƕƔǔǔǔƖǕƔƔƕǖǕȔǔǕƖƕ̕ҭ}z|~|qjVf~}vruk~xdtR+3]%͗ʕʕ˗˖˖ʖ˖˗˖ʖ˗ʗ˗̗̘̗̘̗̗̙͙͘͘Θ͙Ι͙͘ΙΘΙΙΙΛΙΛΚϜҞסѝԩ|^}cEH4$+-",'( %'*)-)3,$00$+.!) ĒĒŔēĔĔÕēŒēœŒēĔŔĒŒŒŒŒĒĔēœœœƒƑœœƓƓƓ̔žww}yysbHY~u{yt{rdKSGњlҚȓȓɔɕɔɕɖɔɔʕʕɔɖʕ˕ʖʖ˕ʕ˖̖̕˖̖˗̗˘˖˘˗˖˖˗˗̗̖̖̖˗˘̘Θӛ՞՝pdkJrZ=@+#" +.'% ÏÏőĒÓÑÒđĐĐĐÑĒĐđĐđđđĐĐđđđőőđĐőđđőĐőȑ~w~~wiQdgRayszqztp`jR14](ȔƒƒƓǓǒƑǓǒǒȒȒǒǓȒȓɔȓɔȔȔɕɔɔɔȔȔȕȓɔɓɓʔʖʔ˕˖˕̖̖̖̗̕̕̕̕ϙԜԜҙҚܪ~ySjAYjR2. $ ŽŽ‘ÐÏАŽÏÏÏÎϏÏÏϏÐώŽŽĎÏÐÐÏÎƑ븈}|||quizkU`X5?vC3ŐŒđđĐđőđďőőŐƒƒƒƑƑƒœœŒŒŒŒƒƑƑƓǒǑǒǓȔɓɓɓɓɔɔɕȕɔɔȔȔɔȔɓɔȔʔɔΚҜљԝϞѩ˨x ŽƎܭ{{z|veQ]9 EjL˔ŽÎÎÏÏÏÏÏÏďВÏÐĐÏÐÏĐđŏŏŐŐőĒőőőőőőŒœƒƒǒǓƓǒǒȒǒɒȓȒȔɔɔɓȔǔǕǓɓϙЙ̑ Ê۰|wyyzl|umdLW.N }ՌŒŒÎŽÍŽŽÏÏÎÏÐÏÐÐÏÏÏĐďđđŐƏƐŐƑŐŐŐƑƑƑƒƒƒǑƒƒœŒőƒƓË Ë紆xh{{jx}panxl|S+/0oMɒŽŽÎÏÎÎďÏÏďďĐďďÏŐŐŐŏĐĐŐĐĐĐđŒ 䰁u}hS[`EL?u=&ŠŒŒŽÍŽÎÎĎÎÏώΎÏÏĐ ܩw~uhTYL-1km|ŒŒŽŽ ֣prdskxxvosMIު wawsqnmprx{pʝ~ ﴀ汅ͬ~dۤ{ ~~|~~}}}~}}}~~~~}~~~}~~}~|~ }}}|}}|||{{||}}{z||||{z|{{}{|}{||}}}}|}|||}}|||}}~~}|}|~}}}|~~~ zz|{}{{zzz{zzzzz{zzyxzxxyyz{zzz{{zyy||zz|{||{z|{{{{|{{|||}{|{|}}|~}}~~~}|~~~{ xxz{zzyyzyzyywyxyxxxyxvxyxxxxvxzzyvxyxzxzzzyyyyzyyyzyyyz{zz{{z{{z|{{{{||}}}~}}||~}}~}}~~~~z xxyzxxxwwwvxwvxxuvuxwwuvwvuuwuvwwuvvwwvvwxwwywwwvxxxxxxxxxxywyxyxyxyzzz{{zz{{z{{||||||||}{{|~}}|}~~~}}x uuwxutvtuutwuuututuvtusstssvvtuttsuuttuuuutuuuvttuvvvuvwvwxwuwvvwwvwxxwxyyyyzzzzyz{yyyz{{yz{{|{z{||||||}~~~}~w rrvvsrutssrtrssrusrrqtrqprrssstsrssrsstrrsstrstututstutttuutuuvuutvwvwvwvvwwxwxxxxywwxyyyxzyzzyzz{{zy{{{{||{||||t rrssrqtrrrrrqrtqqsrqqpqonqrqqrpqsqoqrrqqpppqpqrsqsrqrssrtssstussstsuutsttuttuvwvwxwuxxvvwwwyxwywwyxxxxyzyzz{y{z{r rrsrrqqqqppqqppppppoopooooqqopqoqponpqpppopppoqpqrrqqprqqrqrrrrssqrsssssssrstttuvvutvtttuuuvvvvvvvuwvwwxxxyyxyyyp ooqqqpppponpppoonnmnoomoomopoonnnnomoppponnqomnopoponppppppooqqrqqrqqrrqprrsrsrrttsssssqsstrtstvuuuuttuvwxwwwwwvm nnooppmooonnonmmmlllmmmmmllmmmmmnlmllnnmllmnmmnnnmnnnnonoppoooooppnoppoqqpqpqqrrssqqrrrrrrsrsrsssrussrtuvvtuvutvm kknonmmnmllkllkjjjkkkklkklllllllmmmlkkllllmmmmnmnmmmnnnmmmnnnmoonomnonpoppppoqqqqrppqpoqoqqppqrrrrqqsrrsstttstuuk jjlmllkllllkkkjjjijjkjkkkklklkjikljllkkkkkllllmklllllllmlmllmmlnllmmlmmnmnnnnpnoqponooppnnooppqqpppqqppsrrrtttssi jjllllklkjkjjkhhjihiijkkjjjijjjijkiijiijijkijjkjjjjjkklmjkkmllklllklklllllmmmmnnnonnmooonnnmonononpqopopqrsppqrrh iilkkkjiihijjiiighghijjhijhhihiiiiihiihhiiihjhijihjjijijjkkkkjjjlkjjllllklklllklnmlmnmmonnmmnnnoooponpponpronmopg ggjjjkigghghighghhgiihhghgghhhhhhhghhhhhhhihghiihihiijihijjjkijijjiiijjkkkjkkkklllllklllllllmnmonomnmmnommppmmnoe ffihgijggggggfgggghhfgigfffggggghhfffggfggggghhhhhhhhhhihgiihgiijiiihhhikjjhjjjjkklkjkkkjllkkllmkkllmmllnnnonnnne eegghfhgffggfgfeegfgefgeeegfecefeffefffeffgfggfhgffgggfghgihgggihghhhghgihghiihihiiiijjjijkiijijkkjkkkljmmmnmnllc ccgffgffefffffeedfffffddedeeddfddeeeeefeefeefffgffegeffefgihghhghhgggggfffghhhfghhhhhhhjhhhiijiiiikjijkkkklmmlklb ddeecfeedcdedbcccdeddeddecddcdcdceedeecccdfeeedefffefffffߙeffggffegfdfdefefggggffgggfgfghgghhghihhihjigiiijkkkkkja ccccdec`aabaaaaccaacabecdebbbaaaߘ`ߗacbߗcaߖcߗbߘbߘacddccߘdߘdߘedޘcߘdߘfߗeߗeߗeߘdeddfߘcߙdcdddefgdefefefedeeefffeffggfeggfihhgghhhhjiijjjj_ ``edca``_`a`ab_`b``ߖcߖbߖaߕbߖ`ޖbb`aaߖaaaߕaޖ_ߗaޗaߖ`ޖ`ޖaޖaޖbޖaޖbޖbߖcߖbߖbޗbޗcޗbߖaޖaޖbߖcߗcޖdޗbߗcߖcޗcޗcbߗdߖdޗaߗdecߘdߗceߗcߗcdbcedbcdbdbddbddbdgdeeffeffgggghhhgiiii] __dc``^ߖ_ߖ_ߕ``_`ߕ`ߕ`ߖ_ߕaߕ_ߕ_ߖ`ߕaޕaߕ`ޕ^ޕ^ޕaߕ`ߕ_ޕ`ޖ`ߕ^ߕ_ޔ_ޕ_ߕ`ޕ_ޕbݕ`ޕ`ݕ_ݕ`ߔbޔaޕ`ݕbߕaݕaݕaݕ^ޕaݕaޕaޕbޔcݕbݕ`ޖ`ݖbޖdޖ`ޖcޖaޖdߖaݖ`ޖcߕdߕcݕcޖaߖbߖaޗbޖbߗbߗ`bacdcߘcbcdaabbacdddceedffedfefhhhhiii^ ߔ]ߔ]`ߕ_ߕ_^^ߔ_ޔ^ߔ]ߕ]ޕ\ޕ\ޔ^ޔ_ޔ^ޔ]ޔ^ޔ^ޔ`ޓ^ݔ]ݔ_ޔ_ܔ^ܓ^ݓ_ݔ]ݔ^ݕ_ݔ^ݔ\ݔ_ݔ_ݓ^ܔ^ݔ_ݓ_ݔ^ݔ\ݔ]ܓ`ܓ_ݔ]ݔ]ޓ^ݔ]ܓ_ޔ^ݓ^ݔ]ܕ^ܔ_ݔaݔ_ܔ`ݔaܔ`ݕaݕ`ݔ`ݔ`ݕ`ޖ`ݕ_ܕaݔaޔ`ߔbޕcݕaߕ`ޕ`ݕ`ݖbޕ``ޖ`ߔbߖaߗaߖbߖ`ߖ_ߖac`_`ߖadacaabceededeeeefgffgf\ ޓ[ޓ[ޔ]ߓ[ޓ^ޔ\ݓ]ݓ^ݒ^ޓ\ޔ\ݔ\ݓ]ޓ^ޔ]ݔ]ݓ^ݓ_ݔ]ݔ]ݔ^ݔ^ܓ_ܒ^ܒ]ܒ]ܒ\ܓ]ܒ^ܓ]ܓ^ܒ]ܓ^ܓ^ۓ^ܓ^ܓ^ܓ\ܔ\ݓ^ܒ]ܓ]ܓ\ܓ[ܓ\ܓ]ܓ\ܒ^ܓ[ܒ]ܓ_ۓ]ے]ܔ^ܓ^۔_۔^ܔ^ܓ^ܓ^ݔ_ܓ^۔_ܔ_ܔ^ܓ_ݔ_ܔ`ݔ^ܕ_ܔaܔ`ܔ`ݕ`ݔ`ޔ`ޔ`ݔ_ޔ_ݕ`ݖ_ߕbޕaޕ_ߕ`ޕ`ޖ`ߕ`ޕ`ޖ_ޖaޖ`ߗ`ߗa`b`ߗadccbbadeggfffe\ ޒ\ޒ\ޓ^ݓ\ܒ\ܒ\ݑ[ܑZܑ[ݑ[ܒZݓ\ݒ^ݒ]ݓ]ܓ]ܓ^ܓ`ݓ]ܔ\ܓ^ܒ]ے]ܒ]ܒ]ܒ\ܒ\ے[ے[ܒ[ܒ[ܒ[ܒ\ܑ]ܒ]ܒ\ۓ[ۓZے[ܒ\ۑ\ܑ]ۑ]ڒ[ۑ\ܑ[ۑ[ڒYۑ[ۑ\ے]ܑ\ܑ\ڒ]ړ]ڒ^ۓ]ۓ^ے[ۓ]ܓ_ۓ]ۓ]ۓ^ۓ_ۓ_ܓ^ܓ^ړ_ܔ^ܓ_ۓ_ܔ]ܔ]ܔ^ܔ]ܔ_ݔ]ݔ]ݔ^ݕ^ޔ_ݔ_ݔ`ޔ_ݕ]ޔ_ޕ_ݕ_ޖ^ݕ_ޔaޕ_ޖ_ߖ`ߗaߖ`ߖ`ߖbߗ`ޖaߗbߘaߘaߘbߘccdfffeޑZ ݑYݑYݓ]ܒ\ۑZܑZܐZڑYېZܐYݑZݒ[ܒ[ܒZܑ[ے[ے]ܒ\ܒ]ܒ]ܒ]ۑ\ۑ[ۑ[ۑ\ۑ[ڑZڑZےZڑZے[ۑ[ۑ\ڑ\ۑ\ۑ\ۑ[ڑZڑZڑZڑ[ڐ[ڐ[ڑZڑYې[ې[ّZڐ\ڑZڑZڐ[ۑ[ڑZڒ\ڑ]ڑZۑ[ۑ\ے]ۑ^ڒ^ے]ڒ]ۓ\ڒ]ڒ]ڒ[ْ]ڒ_ۑ^ڑ^ڒ]ܓ^ܒ^ܒ]ܓ^ۓ]ܓ]ۓ]ܓ[ۓ_ܒ_ݓ_ݓ^ܔ\ܔ]ܔ]ܔ]ݔ^ޔ^ޔ_ݔ_ޔ]ݕ_ޖ`ޕ^ޔ_ߕ_ߖ_ޕ`ߗ_ߗ_ߖ`ߖ``ߖccdddߘdސX ېXېXܒ[ܒZۑY܏Y܏YڐYڏYڐWېZܑ\ܑ[ۑ[ۑZڑZې]ۑ[ۑ[ܑ\ۑ\ڑ\ۑ\ڐZُYِXِ[ڐZّZِYِYڐZې[ُZِZڐZڐZِYِZڐZِXِXِYڐ[ُX؏ZُZڐXِX؏YُZڐ[ڑZڐYڐ[ُ\ڐYِYّZڐ\ڐ]ِ\ڑ\ْ[ّ\ّ\ّ\ّ\ّZڐ]ڐ\ڑ[ۑ[ې]ۑ\ۑ[ڒ\ڒ\ڑ\ے]ܒ\ܒ[ے\ے]ۑ\ے[ܓ[ܓ\ۓ]ۓ]ܔ]ܓ^ܓ^ݓ]ܓ_ܔ^ܕ^ݔ^ݔ^ݕ^ޕ^ޕ_ޕ_ޕ_ޔ`ߖ`ޕbߗaޘbߘdߗcߗbސX ܐXܐXܑYۑZڐXڎYڎXڎWڎWُVُZڐ[ې[ڐ[ڐZې[ڑ[ڐ[ې[ېYڑ[ڐZڏ[ِZؐXُZُZُY؏ZُYِXُYِX؏ZُXُYُXُY؏X؏X؏W؏X؎X؏X؏W׎W؎W؎V؏W؏X؎XُYُYُZُY؏Z؏[ُYُYُYُZؐXِZُ\ِZؐZؐ\ؐZِYِZُ[؏[ڐZِYّ[ڑ[ڐ\ِ\ڑZڐ[ېZۑ\ڑ[ڑ\ڒZڑ[ے[ۑ]ۑ^ڒ\ے\ܒ]ۓZے]ۓ]ۓ[ۓ\ۓ[ܓ]۔]ܔ]ܔ]ݔ^ܔ^ܔ_ݔ^ܕ_ݖaޖaߖbޖaݕb܏V ڎWڎWېZېYېXُWَVَVَWڏXڏWڏZڏXِYُYُZّZِXُZُZُYڏ[ُY؏YؐZُZ؎Y؏X؎X؎XَYُY؏Y؎Y؏V؏WُXَX؎W؏V؎V׍W׎V׎U׎W׍U׍T׍V׍V׍V؎W؎V׏W׎W؎X؎X؎XُXَX؎X؎X؏X؏Y؏Y؏Y؏X׏[׏ZُY؏Y׏Z׎[ؐYُYُYِX؏XُYُ[ِYِXِ[ِZڐ[ڑXڑYڐ\ڑ\ڑ[ّ[ڑ\ڑ\ڒ[ڒ[ڒ[ۓZےZےZܓ[ۓ]ۓ`ے\۔[ۓ]ܓ\ܓ\ܔ^ܔ_ݕaݕ_ޖ`ݖ_ۏT ڎUڎUڐWۏWۏVڏVُU؎T؏WُWِWڎW؏VَXُWَVَYِXُXُYُX؏YُZ؎X؏W؏Y؎X׏W׎W؎X؎V؏X؎X؎V׎T׎V؎W؎V׍V׍U׎U׍U׍V֌V֌T֌T֌S׍T֍U׌W׌V׍U֍V֍U׍W׍V׍U׎U׍X׎V׎W؎X׏W׏V׎W؍Y؏X׏W׎X׏X׎Z׏X׏X؏YُY؏W؎XُWُY؏W؏X؏YِXِZُYِYِZِZّZّ[ّ[ڑZّZؒYڒZۑYڒZڒ[ے[ڒ[ٓ\ۓ[ٓ\ۓZۓ\ڒ]ܒ]ܓ\ܓ\ܕ^ݕ_ܔ_ۍR ڍQڍQ܏U܏V܎UێTۏTڏSڏTڏSڎTڎTڎVێTَTَSڎTَUڍVڎUڎUڎUڎVَUَUڎUڎT؎T؎U؍U؎SڎTٌVٍT؎T،S،S؍S،S׌S؍R׍Q׌Q׌R׋Q׋P׌Q،Q׌R׋S׋R׋R׌R׌R،T׌S׌R׌S،T،S،U؍T؍R؎S؍S؍U؍W؍U؍T؍T؍U؍U؍W؎U؎U؎TَUَVُTَUڎTڏUُVڏVڎUُVِWڐVڐWۏWڏVِWِVڑXڐXۑWڑXېXۑXۑYےYےYےZۑZܑZܒYܑ[ݒYݓXޓ\ޓ[ޔ[܌Q kDkDmFmFmFmFmEmEmDlFmEmDmFlFlFmEmEmFkFlFmFmFlFmClFlFmEmElElElDlDlElElFlEkElElElClCkCkCkCjCjBkBjDkEkDkDjDkDkDkEkFkFkEkElFlElElDlElDlEmEmFmFmFmElEmFmFmFmFlFmFmFmFmGmFmFmFmFmFmFmFnGmFmFnFnGnInGnGnGnFnGnHnGnGnGnHnHnHnHnHoHpIpJoJƃP    @@@-xxxIuuuHvvvHuuuHtttHtttHtttHsssHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHrrrHsssHtttHvvvHvvvHvvvHvvvHvvvHvvvHvvvHvvvHvvvHvvvHvvvHvvvHvvvHvvvHvvvHvvvHvvvHvvvHvvvHvvvHwwwHwwwHxxxHxxxHxxxHxxxHyyyHyyyHzzzHzzzHzzzH~~~IDDD.mayavi-4.5.0/tvtk/tools/ivtk.py0000755000076500000240000004365012747716314017120 0ustar prabhustaff00000000000000"""ivtk - Interactive TVTK. A utility module that makes VTK/TVTK easier to use from the Python interpreter. For a standalone application simply run this file. To use this under IPython (with --gui=qt) use the `viewer()` helper function or use the `IVTK` class. The widget can also make use of the tvtk pipeline browser. Here is example usage of the viewer along with tvtk under IPython: >>> from tvtk.tools import ivtk >>> from tvtk.api import tvtk >>> cs = tvtk.ConeSource() >>> m = tvtk.PolyDataMapper() >>> m.input = cs.output >>> a = tvtk.Actor() >>> a.mapper = m >>> v = ivtk.viewer() >>> v.scene.add_actors(a) >>> v.scene.reset_zoom() """ # Author: Prabhu Ramachandran # Copyright (c) 2005-2008, Enthought, Inc. # License: BSD Style. # Standard library imports. import os.path # Enthought library imports. from pyface.api import FileDialog, GUI, OK, PythonShell from pyface.api import SplitApplicationWindow, ApplicationWindow from pyface.api import SplitPanel from tvtk.pyface.api import Scene, DecoratedScene from pyface.action.api import Action, MenuBarManager,\ MenuManager, Separator from pyface.image_resource import ImageResource from pyface.resource.api import resource_path from traits.api import Float, Str, Instance, Callable from tvtk.api import tvtk from tvtk.pipeline.browser import PipelineBrowser ###################################################################### # The scene icon. ###################################################################### def mk_scene_icon(): icon_path = os.path.join(resource_path(), 'images', 'scene.ico') return ImageResource(icon_path) scene_icon = mk_scene_icon() ###################################################################### # `ExitAction` class. ###################################################################### class ExitAction(Action): """ Exits the application. """ def __init__(self, window): """ Creates a new action. """ self._window = window self.name = "E&xit" def perform(self): """ Performs the action. """ self._window.close() ###################################################################### # `SaveImageAction` class. ###################################################################### class SaveImageAction(Action): """Saves the rendered scene to an image.""" def __init__(self, window): self._window = window self.name = "S&ave Scene" def perform(self): """Pops up a dialog used to save the scene to an image.""" extensions = ['*.png', '*.jpg', '*.tiff', '*.bmp', '*.ps', '*.eps', '*.pdf', '*.tex', '*.rib', '*.wrl', '*.oogl', '*.vrml', '*.obj', '*.iv', '*.pov', '*.x3d'] descriptions = ["PNG", "JPG", "TIFF", "Bitmap", "PostScript", "EPS", "PDF", "Tex", "RIB", "WRL", "Geomview", "VRML", "Wavefront", "Open Inventor", "Povray", "X3D"] wildcard = "" for description, extension in zip(descriptions, extensions): wildcard += "{} ({})|{}|".format(description, extension, extension) wildcard += "Determine by extension (*.*)|(*.*)" dlg = FileDialog(parent=self._window.control, action='save as', wildcard=wildcard, title="Save scene to image") if dlg.open() == OK: self._window.scene.save(dlg.path) ###################################################################### # `SaveToClipboardAction` class. ###################################################################### class SaveToClipboardAction(Action): """ Saves rendered scene to the Clipboard. """ def __init__(self, window): """ Creates a new action. """ self._window = window self.name = "&Copy" def perform(self): """ Performs the action. """ self._window.scene.save_to_clipboard() ###################################################################### # `SpecialViewAction` class. ###################################################################### class SpecialViewAction(Action): """Sets the scene to a particular view.""" def __init__(self, window, name, view): """ Creates a new action. """ self._window = window self.name = name self.view = view def perform(self): """ Performs the action. """ # Hack! Works tho. try: meth = getattr(self._window.scene, self.view) meth() except AttributeError: pass def create_ivtk_menu(obj): """Creates a menu bar suitable for all IVTK windows. Parameters ---------- - obj : A Pyface application window. This is the window which requires the menu items. """ menu_bar_manager = MenuBarManager( MenuManager(SaveImageAction(obj), Separator(), ExitAction(obj), name = '&File', ), MenuManager(SaveToClipboardAction(obj), name = '&Edit', ), MenuManager(SpecialViewAction(obj, "&Reset Zoom", 'reset_zoom'), Separator(), SpecialViewAction(obj, "&Isometric", 'isometric_view'), SpecialViewAction(obj, "&X positive", 'x_plus_view'), SpecialViewAction(obj, "X negative", 'x_minus_view'), SpecialViewAction(obj, "&Y positive", 'y_plus_view'), SpecialViewAction(obj, "Y negative", 'y_minus_view'), SpecialViewAction(obj, "&Z positive", 'z_plus_view'), SpecialViewAction(obj, "Z negative", 'z_minus_view'), name = '&View', ) ) return menu_bar_manager ###################################################################### # `SceneWithBrowser` class. ###################################################################### class SceneWithBrowser(SplitPanel): """ Provides an Scene along with an embedded PyCrust Python shell. In the shell, 'scene' and 's' are bound to the Scene.""" # The ratio of the size of the left/top pane to the right/bottom pane. ratio = Float(0.3) # The direction in which the panel is split. direction = Str('vertical') # The `Scene` instance into which VTK renders. scene = Instance(Scene) # The `PythonShell` instance. browser = Instance(PipelineBrowser) ########################################################################### # `IWidget` interface. ########################################################################### def destroy(self): if self.scene is not None: self.scene.close() super(SceneWithBrowser, self).destroy() ########################################################################### # Protected 'SplitPanel' interface. ########################################################################### def _create_lhs(self, parent): """ Creates the left hand side or top depending on the style. """ self._create_scene(parent) self.browser = PipelineBrowser(self.scene) self.browser.show(parent=parent) return self.browser.ui.control def _create_rhs(self, parent): """ Creates the right hand side or bottom depending on the style. 's' and 'scene' are bound to the Scene instance.""" self._create_scene(parent) self.scene.renderer.background = 0.5, 0.5, 0.5 return self.scene.control ########################################################################### # Private 'SceneWithBrowser' interface. ########################################################################### def _create_scene(self, parent): """ Make sure that the scene has been created. """ if self.scene is None: self.scene = DecoratedScene(parent) ###################################################################### # `IVTKWithCrust` class. ###################################################################### class IVTKWithCrust(SplitApplicationWindow): """ Provides an Scene along with an embedded PyCrust Python shell. In the shell, 'scene' and 's' are bound to the Scene.""" # The ratio of the size of the left/top pane to the right/bottom pane. ratio = Float(0.7) # The direction in which the panel is split. direction = Str('horizontal') # The `Scene` instance into which VTK renders. scene = Instance(Scene) # The `PythonShell` instance. python_shell = Instance(PythonShell) ########################################################################### # 'object' interface. ########################################################################### def __init__(self, **traits): """ Creates a new window. """ # Base class constructor. super(IVTKWithCrust, self).__init__(**traits) self.title = 'TVTK Scene' # Create the window's menu bar. self.menu_bar_manager = create_ivtk_menu(self) ########################################################################### # `IWindow` interface. ########################################################################### def close(self): if self.scene is not None: self.scene.close() super(IVTKWithCrust, self).close() ########################################################################### # Protected 'SplitApplicationWindow' interface. ########################################################################### def _create_lhs(self, parent): """ Creates the left hand side or top depending on the style. """ self.scene = DecoratedScene(parent) self.scene.renderer.background = 0.5, 0.5, 0.5 return self.scene.control def _create_rhs(self, parent): """ Creates the right hand side or bottom depending on the style. 's' and 'scene' are bound to the Scene instance.""" self.python_shell = PythonShell(parent) self.python_shell.bind('scene', self.scene) self.python_shell.bind('s', self.scene) self.python_shell.bind('tvtk', tvtk) return self.python_shell.control ###################################################################### # `IVTKWithCrustAndBrowser` class. ###################################################################### class IVTKWithCrustAndBrowser(SplitApplicationWindow): """ Provides an Scene along with an embedded PyCrust Python shell. In the shell, 'scene' and 's' are bound to the Scene.""" # The ratio of the size of the left/top pane to the right/bottom pane. ratio = Float(0.7) # The direction in which the panel is split. direction = Str('horizontal') # The `Scene` instance into which VTK renders. scene = Instance(Scene) # The `PipelineBrowser` instance. browser = Instance(PipelineBrowser) # The ordered split window to use. browser_scene = Instance(SceneWithBrowser) # The `PythonShell` instance. python_shell = Instance(PythonShell) ########################################################################### # 'object' interface. ########################################################################### def __init__(self, **traits): """ Creates a new window. """ # Base class constructor. super(IVTKWithCrustAndBrowser, self).__init__(**traits) self.title = 'TVTK Scene' # Create the window's menu bar. self.menu_bar_manager = create_ivtk_menu(self) ########################################################################### # `IWindow` interface. ########################################################################### def close(self): if self.scene is not None: self.scene.close() super(IVTKWithCrustAndBrowser, self).close() ########################################################################### # Protected 'SplitApplicationWindow' interface. ########################################################################### # The icon of the window icon = Instance(ImageResource, scene_icon) def _create_lhs(self, parent): """ Creates the left hand side or top depending on the style. """ self.browser_scene = SceneWithBrowser(parent) self.scene = self.browser_scene.scene self.browser = self.browser_scene.browser return self.browser_scene.control def _create_rhs(self, parent): """ Creates the right hand side or bottom depending on the style. 's' and 'scene' are bound to the Scene instance.""" self.python_shell = PythonShell(parent) self.python_shell.bind('scene', self.scene) self.python_shell.bind('s', self.scene) self.python_shell.bind('browser', self.browser) self.python_shell.bind('b', self.browser) self.python_shell.bind('tvtk', tvtk) return self.python_shell.control ###################################################################### # `IVTK` class. ###################################################################### class IVTK(ApplicationWindow): """ Provides an Scene along without an embedded Python shell. This is useful when scripting from the vanilla Python or IPython interpreter.""" # The `Scene` instance into which VTK renders. scene = Instance(Scene) # The callable (or class) to create the scene instance _scene_factory = Callable(DecoratedScene) ########################################################################### # 'object' interface. ########################################################################### def __init__(self, **traits): """ Creates a new application window. """ # Base class constructor. super(IVTK, self).__init__(**traits) self.title = 'TVTK Scene' self.menu_bar_manager = create_ivtk_menu(self) ########################################################################### # `IWindow` interface. ########################################################################### def close(self): if self.scene is not None: self.scene.close() super(IVTK, self).close() ########################################################################### # Protected 'ApplicationWindow' interface. ########################################################################### # The icon of the window icon = Instance(ImageResource, scene_icon) def _create_contents(self, parent): """ Create the contents of the window. """ self.scene = self._scene_factory(parent) return self.scene.control ###################################################################### # `IVTKWithBrowser` class. ###################################################################### class IVTKWithBrowser(ApplicationWindow): """ Provides an Scene along without an embedded Python shell. This is useful when scripting from the vanilla Python or IPython interpreter.""" # The `Scene` instance into which VTK renders. scene = Instance(Scene) # The `PipelineBrowser` instance. browser = Instance(PipelineBrowser) # The ordered split window to use. browser_scene = Instance(SceneWithBrowser) ########################################################################### # 'object' interface. ########################################################################### def __init__(self, **traits): """ Creates a new application window. """ # Base class constructor. super(IVTKWithBrowser, self).__init__(**traits) self.title = 'TVTK Scene' self.menu_bar_manager = create_ivtk_menu(self) ########################################################################### # `IWindow` interface. ########################################################################### def close(self): if self.scene is not None: self.scene.close() super(IVTKWithBrowser, self).close() ########################################################################### # Protected 'ApplicationWindow' interface. ########################################################################### # The icon of the window icon = Instance(ImageResource, scene_icon) def _create_contents(self, parent): """ Create the contents of the window. """ self.browser_scene = SceneWithBrowser(parent) self.scene = self.browser_scene.scene self.browser = self.browser_scene.browser return self.browser_scene.control ###################################################################### # Utility functions. ###################################################################### def viewer(browser=True, instantiate_gui=False): """Creates an IVTK instance, opens the window and returns the embedded scene inside it. This is useful from an IPython/vanilla Python shell. It returns the viewer window instance. Parameters ---------- - browser : `bool` (default, True) If True, creates an IVTK scene with an embedded PipelineBrowser. If False, does not create it. - instantiate_gui : `bool` (default: False) If True, create an instance of GUI(). This is useful when this function is invoked from within an IPython shell. OTOH, if this is called from within a wxPython app (or with ipython --gui=qt) you don't want to start another GUI instance. """ if instantiate_gui: gui = GUI() if browser: v = IVTKWithBrowser(size=(600,600)) else: v = IVTK(size=(600,600)) v.open() return v def main(): # Create the GUI. gui = GUI() # Create and open an application window. window = IVTKWithCrustAndBrowser(size=(800,600)) window.open() # Start the GUI event loop! gui.start_event_loop() if __name__ == '__main__': main() mayavi-4.5.0/tvtk/tools/mlab.py0000644000076500000240000013371412747716314017054 0ustar prabhustaff00000000000000"""A module that provides Matlab like 3d visualization functionality. The general idea is shamelessly stolen from the `high-level API`_ provided by Octaviz_. Some of the test cases and demos are also translated from there! .. _Octaviz: http://octaviz.sourceforge.net/ .. _high-level API: http://octaviz.sourceforge.net/index.php?page=manpagesq The implementation provided here is object oriented and each visualization capability is implemented as a class that has traits. So each of these may be configured. Each visualization class derives (ultimately) from MLabBase which is responsible for adding/removing its actors into the render window. The classes all require that the RenderWindow be a `pyface.tvtk.scene.Scene` instance (this constraint can be relaxed if necessary later on). This module offers the following broad class of functionality: `Figure` This basically manages all of the objects rendered. Just like figure in any Matlab like environment. A convenience function called `figure` may be used to create a nice Figure instance. `Glyphs` This and its subclasses let one place glyphs at points specified as inputs. The subclasses are: `Arrows`, `Cones`, `Cubes`, `Cylinders`, `Spheres`, and `Points`. `Line3` Draws lines between the points specified at initialization time. `Outline` Draws an outline for the contained objects. `Title` Draws a title for the entire figure. `LUTBase` Manages a lookup table and a scalar bar (legend) for it. This is subclassed by all classes that need a LUT. `SurfRegular` MayaVi1's imv.surf like functionality that plots surfaces given x (1D), y(1D) and z (or a callable) arrays. `SurfRegularC` Also plots contour lines. `TriMesh` Given triangle connectivity and points, plots a mesh of them. `FancyTriMesh` Plots the mesh using tubes and spheres so its fancier. `Mesh` Given x, y generated from numpy.mgrid, and a z to go with it. Along with optional scalars. This class builds the triangle connectivity (assuming that x, y are from numpy.mgrid) and builds a mesh and shows it. `FancyMesh` Like mesh but shows the mesh using tubes and spheres. `Surf` This generates a surface mesh just like Mesh but renders the mesh as a surface. `Contour3` Shows contour for a mesh. `ImShow` Allows one to view large numeric arrays as image data using an image actor. This is just like MayaVi1's `mayavi.tools.imv.viewi`. To see nice examples of all of these look at the `test_*` functions at the end of this file. Here is a quick example that uses these test functions:: >>> from tvtk.tools import mlab >>> f = mlab.figure() >>> mlab.test_surf(f) # Create a spherical harmonic. >>> f.pop() # Remove it. >>> mlab.test_molecule(f) # Show a caffeine molecule. >>> f.renwin.reset_zoom() # Scale the view. >>> f.pop() # Remove this. >>> mlab.test_lines(f) # Show pretty lines. >>> f.clear() # Remove all the stuff on screen. """ # Author: Prabhu Ramachandran # Copyright (c) 2005-2007, Enthought, Inc. # License: BSD Style. from distutils.version import StrictVersion import numpy from traits.api import HasTraits, List, Instance, Any, Float, Bool, \ Str, Trait, Int from pyface.api import GUI from tvtk.api import tvtk from tvtk.tvtk_base import TVTKBase, vtk_color_trait from tvtk.common import configure_input_data from tvtk.tools import ivtk # Set this to False to not use LOD Actors. USE_LOD_ACTOR = True VTK_VER = StrictVersion(tvtk.Version().vtk_version) ###################################################################### # Utility functions. ###################################################################### def _make_actor(**kwargs): """Return a TVTK actor. If `mlab.USE_LOD_ACTOR` is `True` it returns an LODActor if not it returns a normal actor. """ if USE_LOD_ACTOR: r = tvtk.LODActor(number_of_cloud_points=1500) r.property.point_size = 2.0 r.set(**kwargs) return r else: return tvtk.Actor(**kwargs) def _create_structured_points_direct(x, y, z=None): """Creates a StructuredPoints object given input data in the form of numpy arrays. Input Arguments: x -- Array of x-coordinates. These should be regularly spaced. y -- Array of y-coordinates. These should be regularly spaced. z -- Array of z values for the x, y values given. The values should be computed such that the z values are computed as x varies fastest and y next. If z is None then no scalars are associated with the structured points. Only the structured points data set is created. """ nx = len(x) ny = len(y) if z is not None: nz = numpy.size(z) assert nx*ny == nz, "len(x)*len(y) != len(z)"\ "You passed nx=%d, ny=%d, nz=%d"%(nx, ny, nz) xmin, ymin = x[0], y[0] dx, dy= (x[1] - x[0]), (y[1] - y[0]) sp = tvtk.StructuredPoints(dimensions=(nx,ny,1), origin=(xmin, ymin, 0), spacing=(dx, dy, 1)) if z is not None: sp.point_data.scalars = numpy.ravel(z) sp.point_data.scalars.name = 'scalars' return sp def sampler(xa, ya, func, *args, **kwargs): """Samples a function at an array of ordered points (with equal spacing) and returns an array of scalars as per VTK's requirements for a structured points data set, i.e. x varying fastest and y varying next. Input Arguments: xa -- Array of x points. ya -- Array if y points. func -- function of x, and y to sample. args -- additional positional arguments for func() (default is empty) kwargs -- a dict of additional keyword arguments for func() (default is empty) """ ret = func(xa[:,None] + numpy.zeros_like(ya), numpy.transpose(ya[:,None] + numpy.zeros_like(xa)), *args, **kwargs ) return numpy.transpose(ret) def _check_sanity(x, y, z): """Checks the given arrays to see if they are suitable for surf.""" msg = "Only ravelled or 2D arrays can be viewed! "\ "This array has shape %s" % str(z.shape) assert len(z.shape) <= 2, msg if len( z.shape ) == 2: msg = "len(x)*len(y) != len(z.flat). You passed "\ "nx=%d, ny=%d, shape of z=%s"%(len(x), len(y), z.shape) assert z.shape[0]*z.shape[1] == len(x)*len(y), msg msg = "length of y(%d) and x(%d) must match shape of z "\ "%s. (Maybe you need to swap x and y?)"%(len(y), len(x), str(z.shape)) assert z.shape == (len(y), len(x)), msg def squeeze(a): "Returns a with any ones from the shape of a removed" a = numpy.asarray(a) b = numpy.asarray(a.shape) val = numpy.reshape(a, tuple(numpy.compress(numpy.not_equal(b, 1), b))) return val def make_surf_actor(x, y, z, warp=1, scale=[1.0, 1.0, 1.0], make_actor=True, *args, **kwargs): """Creates a surface given regularly spaced values of x, y and the corresponding z as arrays. Also works if z is a function. Currently works only for regular data - can be enhanced later. Parameters ---------- x -- Array of x points (regularly spaced) y -- Array if y points (regularly spaced) z -- A 2D array for the x and y points with x varying fastest and y next. Also will work if z is a callable which supports x and y arrays as the arguments. warp -- If true, warp the data to show a 3D surface (default = 1). scale -- Scale the x, y and z axis as per passed values. Defaults to [1.0, 1.0, 1.0]. make_actor -- also create actors suitably (default True) args -- additional positional arguments for func() (default is empty) kwargs -- a dict of additional keyword arguments for func() (default is empty) """ if callable(z): zval = numpy.ravel(sampler(x, y, z, *args, **kwargs)) x, y = squeeze(x), squeeze(y) else: x, y = squeeze(x), squeeze(y) _check_sanity(x, y, z) zval = numpy.ravel(z) assert len(zval) > 0, "z is empty - nothing to plot!" xs = x*scale[0] ys = y*scale[1] data = _create_structured_points_direct(xs, ys, zval) if not make_actor: return data if warp: geom_f = tvtk.ImageDataGeometryFilter() configure_input_data(geom_f, data) warper = tvtk.WarpScalar(scale_factor=scale[2]) configure_input_data(warper, geom_f.output) normals = tvtk.PolyDataNormals(feature_angle=45) configure_input_data(normals, warper.output) mapper = tvtk.PolyDataMapper(scalar_range=(min(zval),max(zval))) configure_input_data(mapper, normals.output) else: mapper = tvtk.PolyDataMapper(scalar_range=(min(zval),max(zval))) configure_input_data(mapper, data) actor = _make_actor(mapper=mapper) return data, actor def make_triangle_polydata(triangles, points, scalars=None): t = numpy.asarray(triangles, 'l') assert t.shape[1] == 3, "The list of polygons must be Nx3." if scalars is not None: assert len(points) == len(numpy.ravel(scalars)) pd = tvtk.PolyData(points=points, polys=t) if scalars is not None: pd.point_data.scalars = numpy.ravel(scalars) pd.point_data.scalars.name = 'scalars' return pd def make_triangles_points(x, y, z, scalars=None): """Given x, y, and z co-ordinates made using numpy.mgrid and optional scalars. This function returns triangles and points corresponding to a mesh formed by them. Parameters ---------- - x : array A list of x coordinate values formed using numpy.mgrid. - y : array A list of y coordinate values formed using numpy.mgrid. - z : array A list of z coordinate values formed using numpy.mgrid. - scalars : array (optional) Scalars to associate with the points. """ assert len(x.shape) == 2, "Array x must be 2 dimensional." assert len(y.shape) == 2, "Array y must be 2 dimensional." assert len(z.shape) == 2, "Array z must be 2 dimensional." assert x.shape == y.shape, "Arrays x and y must have same shape." assert y.shape == z.shape, "Arrays y and z must have same shape." nx, ny = x.shape i, j = numpy.mgrid[0:nx-1,0:ny-1] i, j = numpy.ravel(i), numpy.ravel(j) t1 = i*ny+j, (i+1)*ny+j, (i+1)*ny+(j+1) t2 = (i+1)*ny+(j+1), i*ny+(j+1), i*ny+j nt = len(t1[0]) triangles = numpy.zeros((nt*2, 3), 'l') triangles[0:nt,0], triangles[0:nt,1], triangles[0:nt,2] = t1 triangles[nt:,0], triangles[nt:,1], triangles[nt:,2] = t2 points = numpy.zeros((nx, ny, 3), 'd') points[:,:,0], points[:,:,1], points[:,:,2] = x, y, z points = numpy.reshape(points, (nx*ny, 3)) return triangles, points ###################################################################### # `MLabBase` class. ###################################################################### class MLabBase(HasTraits): # List of actors. actors = List(TVTKBase) # Renderwindow to render into. renwin = Any def update(self): self.renwin.render() def render(self): if self.renwin: self.renwin.render() def _renwin_changed(self, old, new): if old: old.remove_actors(self.actors) old.render() if new: new.add_actors(self.actors) new.render() def _actors_changed(self, old, new): self._handle_actors(old, new) def _actors_items_changed(self, list_event): self._handle_actors(list_event.removed, list_event.added) def _handle_actors(self, removed, added): rw = self.renwin if rw: rw.remove_actors(removed) rw.add_actors(added) rw.render() ###################################################################### # `Glyphs` class. ###################################################################### class Glyphs(MLabBase): # The source glyph which is placed at various locations. glyph_source = Any # A Glyph3D instance replicates the glyph_sources at various # points. glyph = Instance(tvtk.Glyph3D, (), {'vector_mode':'use_vector', 'scale_mode':'data_scaling_off'}) # Color of the glyphs. color = vtk_color_trait((1.0, 1.0, 1.0)) def __init__(self, points, vectors=None, scalars=None, **traits): super(Glyphs, self).__init__(**traits) if vectors is not None: assert len(points) == len(vectors) if scalars is not None: assert len(points) == len(scalars) self.points = points self.vectors = vectors self.scalars = scalars polys = numpy.arange(0, len(points), 1, 'l') polys = numpy.reshape(polys, (len(points), 1)) pd = tvtk.PolyData(points=points, polys=polys) if self.vectors is not None: pd.point_data.vectors = vectors pd.point_data.vectors.name = 'vectors' if self.scalars is not None: pd.point_data.scalars = scalars pd.point_data.scalars.name = 'scalars' self.poly_data = pd configure_input_data(self.glyph, pd) if self.glyph_source: self.glyph.source = self.glyph_source.output mapper = tvtk.PolyDataMapper(input=self.glyph.output) actor = _make_actor(mapper=mapper) actor.property.color = self.color self.actors.append(actor) def update(self): self.poly_data.update() self.renwin.render() def _color_changed(self, val): if self.actors: self.actors[0].property.color = val self.render() def _glyph_source_changed(self, val): self.glyph.source = val.output self.render() ###################################################################### # `Arrows` class. ###################################################################### class Arrows(Glyphs): # The arrow glyph which is placed at various locations. glyph_source = Instance(tvtk.ArrowSource, ()) ###################################################################### # `Cones` class. ###################################################################### class Cones(Glyphs): # The cone glyph which is placed at various locations. glyph_source = Instance(tvtk.ConeSource, ()) # Radius of the cone. radius = Float(0.05, desc='radius of the cone') def __init__(self, points, vectors=None, scalars=None, **traits): super(Cones, self).__init__(points, vectors, scalars, **traits) self._radius_changed(self.radius) def _radius_changed(self, val): self.glyph_source.radius = val self.render() ###################################################################### # `Cubes` class. ###################################################################### class Cubes(Glyphs): # The cube glyph which is placed at various locations. glyph_source = Instance(tvtk.CubeSource, ()) # The side length of the cube. length = Float(0.05, desc='side length of the cube') def __init__(self, points, vectors=None, scalars=None, **traits): super(Cubes, self).__init__(points, vectors, scalars, **traits) self._radius_changed(self.radius) def _length_changed(self, val): self.glyph_source.x_length = val self.glyph_source.y_length = val self.glyph_source.z_length = val self.render() ###################################################################### # `Cylinders` class. ###################################################################### class Cylinders(Glyphs): # The cylinder glyph which is placed at various locations. glyph_source = Instance(tvtk.CylinderSource, ()) ###################################################################### # `Spheres` class. ###################################################################### class Spheres(Glyphs): # The sphere which is placed at various locations. glyph_source = Instance(tvtk.SphereSource, (), {'phi_resolution':15, 'theta_resolution':30}) # Radius of the sphere. radius = Float(0.05, desc='radius of the sphere') def __init__(self, points, vectors=None, scalars=None, **traits): super(Spheres, self).__init__(points, vectors, scalars, **traits) self._radius_changed(self.radius) def _radius_changed(self, val): self.glyph_source.radius = val self.render() ###################################################################### # `Points` class. ###################################################################### class Points(Glyphs): # The point which is placed at various locations. glyph_source = Instance(tvtk.PointSource, (), {'radius':0, 'number_of_points':1}) ###################################################################### # `Line3` class. ###################################################################### class Line3(MLabBase): # Radius of the tube filter. radius = Float(0.01, desc='radius of the tubes') # Should a tube filter be used or not. use_tubes = Bool(True, desc='specifies if the tube filter should be used') # The Tube filter used to generate tubes from the lines. tube_filter = Instance(tvtk.TubeFilter, (), {'number_of_sides':6}) # Color of the actor. color = vtk_color_trait((1.0, 1.0, 1.0)) def __init__(self, points, **traits): super(MLabBase, self).__init__(**traits) assert len(points[0]) == 3, "The points must be 3D" self.points = points np = len(points) - 1 lines = numpy.zeros((np, 2), 'l') lines[:,0] = numpy.arange(0, np-0.5, 1, 'l') lines[:,1] = numpy.arange(1, np+0.5, 1, 'l') pd = tvtk.PolyData(points=points, lines=lines) self.poly_data = pd mapper = tvtk.PolyDataMapper() self.mapper = mapper tf = self.tube_filter tf.radius = self.radius if self.use_tubes: configure_input_data(tf, pd) configure_input_data(mapper, tf.output) a = _make_actor(mapper=mapper) a.property.color = self.color self.actors.append(a) def _radius_changed(self, val): self.tube_filter.radius = val self.render() def _use_tubes_changed(self, val): if val: tf = self.tube_filter configure_input_data(tf, self.poly_data) configure_input_data(self.mapper, tf.output) else: configure_input_data(self.mapper, self.poly_data) self.render() def _color_changed(self, val): if self.actors: self.actors[0].property.color = val self.render() ###################################################################### # `Outline` class. ###################################################################### class Outline(MLabBase): # The axis instance to use to annotate the outline axis = Instance(tvtk.CubeAxesActor2D, (), {'label_format':"%4.2g", 'fly_mode':"outer_edges", 'font_factor':1.25, 'number_of_labels':5, 'corner_offset':0.0, 'scaling':0}) # The outline source. outline = Instance(tvtk.OutlineSource, ()) def __init__(self, **traits): super(Outline, self).__init__(**traits) out_mapper = tvtk.PolyDataMapper(input=self.outline.output) out_actor = _make_actor(mapper=out_mapper) axis = self.axis if hasattr(axis, 'view_prop'): axis.view_prop = out_actor else: axis.prop = out_actor self.actors.extend([out_actor, axis]) def update(self): if self.renwin: rw = self.renwin v1, v2 = [x.visibility for x in self.actors] self.actors[0].visibility = 0 self.actors[1].visibility = 0 rw.render() bounds = rw.renderer.compute_visible_prop_bounds() self.outline.bounds = bounds rw.render() self.actors[0].visibility = v1 self.actors[1].visibility = v2 def _renwin_changed(self, old, new): super(Outline, self)._renwin_changed(old, new) if old: old.on_trait_change(self.update, 'actor_added', remove=True) old.on_trait_change(self.update, 'actor_removed', remove=True) if new: self.axis.camera = new.renderer.active_camera new.on_trait_change(self.update, 'actor_added') new.on_trait_change(self.update, 'actor_removed') ###################################################################### # `Title` class. ###################################################################### class Title(MLabBase): # Text of the title. text = Str('Title', desc='text of the title') # The text actor that renders the title. text_actor = Instance(tvtk.TextActor, ()) def __init__(self, **traits): super(Title, self).__init__(**traits) ta = self.text_actor if VTK_VER > '5.1': ta.set(text_scale_mode='prop', height=0.05, input=self.text) else: ta.set(scaled_text=True, height=0.05, input=self.text) pc = ta.position_coordinate pc.coordinate_system = 'normalized_viewport' pc.value = 0.25, 0.925, 0.0 self.actors.append(self.text_actor) def _text_changed(self, val): self.text_actor.input = val self.render() ###################################################################### # `LUTBase` class. ###################################################################### class LUTBase(MLabBase): # The choices for the lookuptable lut_type = Trait('red-blue', 'red-blue', 'blue-red', 'black-white', 'white-black', desc='the type of the lookup table') # The LookupTable instance. lut = Instance(tvtk.LookupTable, ()) # The scalar bar. scalar_bar = Instance(tvtk.ScalarBarActor, (), {'orientation':'horizontal', 'width':0.8, 'height':0.17}) # The scalar_bar widget. scalar_bar_widget = Instance(tvtk.ScalarBarWidget, ()) # The legend name for the scalar bar. legend_text = Str('Scalar', desc='the title of the legend') # Turn on/off the visibility of the scalar bar. show_scalar_bar = Bool(False, desc='specifies if scalar bar is shown or not') def __init__(self, **traits): super(LUTBase, self).__init__(**traits) self.lut.number_of_colors = 256 self._lut_type_changed(self.lut_type) self.scalar_bar.set(lookup_table=self.lut, title=self.legend_text) pc = self.scalar_bar.position_coordinate pc.coordinate_system = 'normalized_viewport' pc.value = 0.1, 0.01, 0.0 self.scalar_bar_widget.set(scalar_bar_actor=self.scalar_bar, key_press_activation=False) def _lut_type_changed(self, val): if val == 'red-blue': hue_range = 0.0, 0.6667 saturation_range = 1.0, 1.0 value_range = 1.0, 1.0 elif val == 'blue-red': hue_range = 0.6667, 0.0 saturation_range = 1.0, 1.0 value_range = 1.0, 1.0 elif val == 'black-white': hue_range = 0.0, 0.0 saturation_range = 0.0, 0.0 value_range = 0.0, 1.0 elif val == 'white-black': hue_range = 0.0, 0.0 saturation_range = 0.0, 0.0 value_range = 1.0, 0.0 lut = self.lut lut.set(hue_range=hue_range, saturation_range=saturation_range, value_range=value_range, number_of_table_values=256, ramp='sqrt') lut.force_build() self.render() def _legend_text_changed(self, val): self.scalar_bar.title = val self.scalar_bar.modified() self.render() def _show_scalar_bar_changed(self, val): if self.renwin: self.scalar_bar_widget.enabled = val self.renwin.render() def _renwin_changed(self, old, new): sbw = self.scalar_bar_widget if old: sbw.interactor = None old.render() if new: sbw.interactor = new.interactor sbw.enabled = self.show_scalar_bar new.render() super(LUTBase, self)._renwin_changed(old, new) ###################################################################### # `SurfRegular` class. ###################################################################### class SurfRegular(LUTBase): def __init__(self, x, y, z, warp=1, scale=[1.0, 1.0, 1.0], f_args=(), f_kwargs=None, **traits): super(SurfRegular, self).__init__(**traits) if f_kwargs is None: f_kwargs = {} data, actor = make_surf_actor(x, y, z, warp, scale, *f_args, **f_kwargs) self.data = data mapper = actor.mapper mapper.lookup_table = self.lut self.lut.table_range = mapper.scalar_range self.actors.append(actor) ###################################################################### # `SurfRegularC` class. ###################################################################### class SurfRegularC(LUTBase): # Number of contours. number_of_contours = Int(10, desc='number of contours values') # The contour filter. contour_filter = Instance(tvtk.ContourFilter, ()) def __init__(self, x, y, z, warp=1, scale=[1.0, 1.0, 1.0], f_args=(), f_kwargs=None, **traits): super(SurfRegularC, self).__init__(**traits) if f_kwargs is None: f_kwargs = {} data, actor = make_surf_actor(x, y, z, warp, scale, *f_args, **f_kwargs) mapper = actor.mapper mapper.lookup_table = self.lut self.lut.table_range = mapper.scalar_range self.data = data dr = data.point_data.scalars.range cf = self.contour_filter configure_input_data(cf, data) cf.generate_values(self.number_of_contours, dr[0], dr[1]) mapper = tvtk.PolyDataMapper(input=cf.output, lookup_table=self.lut) cont_actor = _make_actor(mapper=mapper) self.actors.extend([actor, cont_actor]) def _number_of_contours_changed(self, val): dr = self.data.point_data.scalars.range self.contour_filter.generate_values(val, dr[0], dr[1]) self.render() ###################################################################### # `TriMesh` class. ###################################################################### class TriMesh(LUTBase): # Disables/enables scalar visibility. scalar_visibility = Bool(False, desc='show scalar visibility') # Representation of the mesh as surface or wireframe. surface = Bool(False, desc='show as surface or wireframe') # Color of the mesh. color = vtk_color_trait((0.5, 1.0, 0.5)) def __init__(self, triangles, points, scalars=None, **traits): """ Parameters ---------- - triangles : array This contains a list of vertex indices forming the triangles. - points : array Contains the list of points referred to in the triangle list. - scalars : array (optional) Scalars to associate with the points. """ super(TriMesh, self).__init__(**traits) self.pd = make_triangle_polydata(triangles, points, scalars) mapper = tvtk.PolyDataMapper(input=self.pd, lookup_table=self.lut, scalar_visibility=self.scalar_visibility) if scalars is not None: rs = numpy.ravel(scalars) dr = min(rs), max(rs) mapper.scalar_range = dr self.lut.table_range = dr actor = _make_actor(mapper=mapper) representation = 'w' if self.surface: representation = 's' if representation == 'w': actor.property.set(diffuse=0.0, ambient=1.0, color=self.color, representation=representation) else: actor.property.set(diffuse=1.0, ambient=0.0, color=self.color, representation=representation) self.actors.append(actor) def _scalar_visibility_changed(self, val): if self.actors: mapper = self.actors[0].mapper mapper.scalar_visibility = val self.render() def _surface_changed(self, val): if self.actors: representation = 'w' if val: representation = 's' actor = self.actors[0] if representation == 'w': actor.property.set(diffuse=0.0, ambient=1.0, representation=representation) else: actor.property.set(diffuse=1.0, ambient=0.0, representation=representation) self.render() def _color_changed(self, val): if self.actors: self.actors[0].property.color = val self.render() ###################################################################### # `FancyTriMesh` class. ###################################################################### class FancyTriMesh(LUTBase): """Shows a mesh of triangles and draws the edges as tubes and points as balls.""" # Disables/enables scalar visibility. scalar_visibility = Bool(False, desc='show scalar visibility') # Color of the mesh. color = vtk_color_trait((0.5, 1.0, 0.5)) # The radius of the tubes. tube_radius = Float(0.0, desc='radius of the tubes') # The radius of the spheres. sphere_radius = Float(0.0, desc='radius of the spheres') # The TubeFilter used to make the tubes for the edges. tube_filter = Instance(tvtk.TubeFilter, (), {'vary_radius':'vary_radius_off', 'number_of_sides':6}) # The sphere source for the points. sphere_source = Instance(tvtk.SphereSource, (), {'theta_resolution':12, 'phi_resolution':12}) def __init__(self, triangles, points, scalars=None, **traits): """ Parameters ---------- - triangles : array This contains a list of vertex indices forming the triangles. - points : array Contains the list of points referred to in the triangle list. - scalars : array (optional) Scalars to associate with the points. """ super(FancyTriMesh, self).__init__(**traits) self.points = points self.pd = make_triangle_polydata(triangles, points, scalars) # Update the radii so the default is computed correctly. self._tube_radius_changed(self.tube_radius) self._sphere_radius_changed(self.sphere_radius) scalar_vis = self.scalar_visibility # Extract the edges and show the lines as tubes. self.extract_filter = tvtk.ExtractEdges(input=self.pd) extract_f = self.extract_filter self.tube_filter.set(input=extract_f.output, radius=self.tube_radius) edge_mapper = tvtk.PolyDataMapper(input=self.tube_filter.output, lookup_table=self.lut, scalar_visibility=scalar_vis) edge_actor = _make_actor(mapper=edge_mapper) edge_actor.property.color = self.color # Create the spheres for the points. self.sphere_source.radius = self.sphere_radius spheres = tvtk.Glyph3D(scaling=0, source=self.sphere_source.output, input=extract_f.output) sphere_mapper = tvtk.PolyDataMapper(input=spheres.output, lookup_table=self.lut, scalar_visibility=scalar_vis) sphere_actor = _make_actor(mapper=sphere_mapper) sphere_actor.property.color = self.color if scalars is not None: rs = numpy.ravel(scalars) dr = min(rs), max(rs) self.lut.table_range = dr edge_mapper.scalar_range = dr sphere_mapper.scalar_range = dr self.actors.extend([edge_actor, sphere_actor]) def _scalar_visibility_changed(self, val): if self.actors: for i in self.actors: i.mapper.scalar_visibility = val self.render() def _tube_radius_changed(self, val): points = self.points if val < 1.0e-9: val = (max(numpy.ravel(points)) - min(numpy.ravel(points)))/250.0 self.tube_radius = val self.tube_filter.radius = val self.render() def _sphere_radius_changed(self, val): points = self.points if val < 1.0e-9: val = (max(numpy.ravel(points)) - min(numpy.ravel(points)))/100.0 self.sphere_radius = val self.sphere_source.radius = val self.render() def _color_changed(self, val): if self.actors: self.actors[0].property.color = val self.render() ###################################################################### # `Mesh` class. ###################################################################### class Mesh(TriMesh): def __init__(self, x, y, z, scalars=None, **traits): """ Parameters ---------- - x : array A list of x coordinate values formed using numpy.mgrid. - y : array A list of y coordinate values formed using numpy.mgrid. - z : array A list of z coordinate values formed using numpy.mgrid. - scalars : array (optional) Scalars to associate with the points. """ triangles, points = make_triangles_points(x, y, z, scalars) super(Mesh, self).__init__(triangles, points, scalars, **traits) ###################################################################### # `FancyMesh` class. ###################################################################### class FancyMesh(FancyTriMesh): def __init__(self, x, y, z, scalars=None, **traits): """ Parameters ---------- - x : array A list of x coordinate values formed using numpy.mgrid. - y : array A list of y coordinate values formed using numpy.mgrid. - z : array A list of z coordinate values formed using numpy.mgrid. - scalars : array (optional) Scalars to associate with the points. """ triangles, points = make_triangles_points(x, y, z, scalars) super(FancyMesh, self).__init__(triangles, points, scalars, **traits) ###################################################################### # `Surf` class. ###################################################################### class Surf(LUTBase): # Disables/enables scalar visibility. scalar_visibility = Bool(True, desc='show scalar visibility') # Color of the mesh. color = vtk_color_trait((0.5, 1.0, 0.5)) def __init__(self, x, y, z, scalars=None, **traits): """ Parameters ---------- - x : array A list of x coordinate values formed using numpy.mgrid. - y : array A list of y coordinate values formed using numpy.mgrid. - z : array A list of z coordinate values formed using numpy.mgrid. - scalars : array (optional) Scalars to associate with the points. """ super(Surf, self).__init__(**traits) triangles, points = make_triangles_points(x, y, z, scalars) self.pd = make_triangle_polydata(triangles, points, scalars) mapper = tvtk.PolyDataMapper(input=self.pd, lookup_table=self.lut, scalar_visibility=self.scalar_visibility) if scalars is not None: rs = numpy.ravel(scalars) dr = min(rs), max(rs) mapper.scalar_range = dr self.lut.table_range = dr actor = _make_actor(mapper=mapper) actor.property.set(color=self.color) self.actors.append(actor) def _scalar_visibility_changed(self, val): if self.actors: mapper = self.actors[0].mapper mapper.scalar_visibility = val self.render() def _surface_changed(self, val): if self.actors: representation = 'w' if val: representation = 's' self.actors[0].property.representation = representation self.render() def _color_changed(self, val): if self.actors: self.actors[0].property.color = val self.render() ###################################################################### # `Contour3` class. ###################################################################### class Contour3(LUTBase): # Number of contours. number_of_contours = Int(10, desc='number of contours values') # The contour filter. contour_filter = Instance(tvtk.ContourFilter, ()) def __init__(self, x, y, z, scalars, **traits): """ Parameters ---------- - x : array A list of x coordinate values formed using numpy.mgrid. - y : array A list of y coordinate values formed using numpy.mgrid. - z : array A list of z coordinate values formed using numpy.mgrid. - scalars : array Scalars to associate with the points. """ super(Contour3, self).__init__(**traits) triangles, points = make_triangles_points(x, y, z, scalars) self.pd = make_triangle_polydata(triangles, points, scalars) dr = self.pd.point_data.scalars.range self.lut.table_range = dr cf = self.contour_filter configure_input_data(cf, self.pd) cf.generate_values(self.number_of_contours, dr[0], dr[1]) mapper = tvtk.PolyDataMapper(input=cf.output, lookup_table=self.lut, scalar_range=dr) cont_actor = _make_actor(mapper=mapper) self.actors.append(cont_actor) def _number_of_contours_changed(self, val): dr = self.pd.point_data.scalars.range self.contour_filter.generate_values(val, dr[0], dr[1]) self.render() ###################################################################### # `ImShow` class. ###################################################################### class ImShow(LUTBase): """Allows one to view a 2D numpy array as an image. This works best for very large arrays (like 1024x1024 arrays). """ # Interpolate the image or not. interpolate = Bool(False, desc='specifies if image should be interpolated') def __init__(self, arr, scale=[1.0, 1.0, 1.0], **traits): """ Parameters ---------- - arr : Array to be viewed. - scale : Scale the x, y and z axis as per passed values. Defaults to [1.0, 1.0, 1.0]. """ super(ImShow, self).__init__(**traits) assert len(arr.shape) == 2, "Only 2D arrays can be viewed!" ny, nx = arr.shape dx, dy, junk = numpy.array(scale)*1.0 xa = numpy.arange(0, nx*scale[0] - 0.1*dx, dx, 'f') ya = numpy.arange(0, ny*scale[1] - 0.1*dy, dy, 'f') arr_flat = numpy.ravel(arr) min_val = min(arr_flat) max_val = max(arr_flat) sp = _create_structured_points_direct(xa, ya) lut = self.lut lut.table_range = min_val, max_val a = lut.map_scalars(arr_flat, 0, 0) sp.point_data.scalars = a sp.point_data.scalars.name = 'scalars' sp.scalar_type = 'unsigned_char' sp.number_of_scalar_components = 4 ia = tvtk.ImageActor(input=sp, interpolate=self.interpolate) self.actors.append(ia) def _interpolate_changed(self, val): if self.actors: ia = self.actors[0] ia.interpolate = val self.render() ###################################################################### # `Figure` class. ###################################################################### class Figure(HasTraits): """A Figure manages varuous MLabBase objects. Each of these objects contains an actor and does something neat.""" # The various instances of MLabBase that populate this figure. objects = List(MLabBase) def __init__(self, renwin, **traits): super(Figure, self).__init__(**traits) self.renwin = renwin def add(self, obj): """Add an object to the figure. This adds the actors of the object to the renderwindow.""" self.objects.append(obj) def pop(self): """Pops out the last object.""" return self.objects.pop() def clear(self): """Removes all objects in the figure.""" self.objects = [] def _objects_changed(self, new, old): self._handle_objects(new, old) def _objects_items_changed(self, list_event): self._handle_objects(list_event.removed, list_event.added) def _handle_objects(self, removed, added): for obj in removed: obj.renwin = None rw = self.renwin for obj in added: obj.renwin = rw rw.reset_zoom() rw.render() def figure(outline=True, browser=True): """Simple helper function that returns a usable figure. Parameters ---------- - outline : `bool` (default: True) If True, create an outline bounding box along with an axes marker for the scene. - browser : `bool` (default, True) If True, creates an IVTK scene with an embedded PipelineBrowser. If False, does not create it. """ v = ivtk.viewer(browser) f = Figure(v.scene) if outline: o = Outline() f.add(o) v.scene.reset_zoom() return f ###################################################################### # Test functions. ###################################################################### def test_arrows(fig): a = Arrows([[-1,-1,-1],[1,0,0]], [[1,1,1],[0,1,0]], color=(1,0,0)) fig.add(a) def test_lines(fig): """Generates a pretty set of lines.""" n_mer, n_long = 6, 11 pi = numpy.pi dphi = pi/1000.0 phi = numpy.arange(0.0, 2*pi + 0.5*dphi, dphi, 'd') mu = phi*n_mer x = numpy.cos(mu)*(1+numpy.cos(n_long*mu/n_mer)*0.5) y = numpy.sin(mu)*(1+numpy.cos(n_long*mu/n_mer)*0.5) z = numpy.sin(n_long*mu/n_mer)*0.5 pts = numpy.zeros((len(mu), 3), 'd') pts[:,0], pts[:,1], pts[:,2] = x, y, z l = Line3(pts, radius=0.05, color=(0.0, 0.0, 0.8)) fig.add(l) def test_molecule(fig): """Generates and shows a Caffeine molecule.""" o = [[30, 62, 19],[8, 21, 10]] n = [[31, 21, 11], [18, 42, 14], [55, 46, 17], [56, 25, 13]] c = [[5, 49, 15], [30, 50, 16], [42, 42, 15], [43, 29, 13], [18, 28, 12], [32, 6, 8], [63, 36, 15], [59, 60, 20]] h = [[23, 5, 7], [32, 0, 16], [37, 5, 0], [73, 36, 16], [69, 60, 20], [54, 62, 28], [57, 66, 12], [6, 59, 16], [1, 44, 22], [0, 49, 6]] oxygen = Spheres(o, radius=8, color=(1,0,0)) nitrogen = Spheres(n, radius=10, color=(0,0,1)) carbon = Spheres(c, radius=10, color=(0,1,0)) hydrogen = Spheres(h, radius=5, color=(1,1,1)) for i in oxygen, nitrogen, carbon, hydrogen: fig.add(i) def test_trimesh(fig): """Test for simple triangle mesh.""" pts = numpy.array([[0.0,0,0], [1.0,0.0,0.0], [1,1,0]], 'd') triangles = [[0, 1, 2]] t1 = TriMesh(triangles, pts) fig.add(t1) pts1 = pts.copy() pts1[:,2] = 1.0 t2 = FancyTriMesh(triangles, pts1) fig.add(t2) def test_surf_regular(fig, contour=1): """Test Surf on regularly spaced co-ordinates like MayaVi.""" def f(x, y): return numpy.sin(x*y)/(x*y) x = numpy.arange(-7., 7.05, 0.1) y = numpy.arange(-5., 5.05, 0.05) if contour: s = SurfRegularC(x, y, f) else: s = SurfRegular(x, y, f) fig.add(s) def test_simple_surf(fig): """Test Surf with a simple collection of points.""" x, y = numpy.mgrid[0:3:1,0:3:1] z = x s = Surf(x, y, z, numpy.asarray(z, 'd')) fig.add(s) def test_surf(fig): """A very pretty picture of spherical harmonics translated from the octaviz example.""" pi = numpy.pi cos = numpy.cos sin = numpy.sin dphi, dtheta = pi/250.0, pi/250.0 [phi,theta] = numpy.mgrid[0:pi+dphi*1.5:dphi,0:2*pi+dtheta*1.5:dtheta] m0 = 4; m1 = 3; m2 = 2; m3 = 3; m4 = 6; m5 = 2; m6 = 6; m7 = 4; r = sin(m0*phi)**m1 + cos(m2*phi)**m3 + sin(m4*theta)**m5 + cos(m6*theta)**m7 x = r*sin(phi)*cos(theta) y = r*cos(phi) z = r*sin(phi)*sin(theta); s = Surf(x, y, z, z) fig.add(s) def test_mesh_sphere(fig): """Create a simple sphere and test the mesh.""" pi = numpy.pi cos = numpy.cos sin = numpy.sin du, dv = pi/20.0, pi/20.0 phi, theta = numpy.mgrid[0.01:pi+du*1.5:du, 0:2*pi+dv*1.5:dv] r = 1.0 x = r*sin(phi)*cos(theta) y = r*sin(phi)*sin(theta) z = r*cos(phi) s = FancyMesh(x, y, z, z, scalar_visibility=True) fig.add(s) def test_mesh(fig): """Create a fancy looking mesh (example taken from octaviz).""" pi = numpy.pi cos = numpy.cos sin = numpy.sin du, dv = pi/20.0, pi/20.0 u, v = numpy.mgrid[0.01:pi+du*1.5:du, 0:2*pi+dv*1.5:dv] x = (1- cos(u))*cos(u+2*pi/3) * cos(v + 2*pi/3.0)*0.5 y = (1- cos(u))*cos(u+2*pi/3) * cos(v - 2*pi/3.0)*0.5 z = cos(u-2*pi/3.) m = FancyMesh(x, y, z, z, scalar_visibility=True) fig.add(m) def test_imshow(fig): """Show a large random array.""" z_large = numpy.random.random((1024, 512)) i = ImShow(z_large) fig.add(i) def main(): gui = GUI() # Create and open an application window. window = ivtk.IVTKWithCrustAndBrowser(size=(800,600)) window.open() f = Figure(window.scene) # Create an outline. o = Outline() f.add(o) # Create some pretty pictures. #test_lines(f) test_surf(f) window.scene.reset_zoom() # Start the GUI event loop! gui.start_event_loop() if __name__ == '__main__': main() mayavi-4.5.0/tvtk/tools/tvtk_doc.py0000644000076500000240000003236212747716314017753 0ustar prabhustaff00000000000000""" Utility code that provides classes helpful in choosing a suitable TVTK class. It does this by providing a list of all the classes along with the option to be able to search for the documentation. The nice thing about the UI is that it performs some kind of completion on names typed by the user, plus it allows users to search through the TVTK class docs very easily. Once a search string is typed the completion and available lists are modified so you can do completion of the searched class names. If a unique enough string is typed the class docs are shown. """ # Author: Prabhu Ramachandran # Copyright (c) 2008-2015, Enthought, Inc. # License: BSD Style. # Standard library imports. import vtk import types import inspect # Enthought library imports. from traits.api import HasTraits, Property, List, Str, \ Instance, Button, Int from traitsui.api import View, Group, Item, EnumEditor,\ ListEditor, TextEditor from tvtk.api import tvtk from tvtk.common import get_tvtk_name ################################################################################ # Utility functions. ################################################################################ def get_tvtk_class_names(): """Returns 4 lists: 1. A list of all the TVTK class names that are not abstract. 2. A list of the TVTK sources (have only outputs and no inputs) 3. A list of the TVTK filters (both inputs and outputs) 4. A list of the TVTK sinks (only inputs and no outputs) """ # Shut of VTK warnings for the time being. o = vtk.vtkObject w = o.GetGlobalWarningDisplay() o.SetGlobalWarningDisplay(0) # Turn it off. all = [] src = [] filter = [] sink = [] for name in dir(vtk): if name.startswith('vtk') and not name.startswith('vtkQt'): klass = getattr(vtk, name) try: c = klass() except (TypeError, NotImplementedError): continue tvtk_name = get_tvtk_name(name) all.append(tvtk_name) has_input = has_output = False if hasattr(klass, 'GetNumberOfInputPorts'): if c.GetNumberOfInputPorts() > 0: has_input = True if hasattr(klass, 'GetNumberOfOutputPorts'): if c.GetNumberOfOutputPorts() > 0: has_output = True if has_input: if has_output: filter.append(tvtk_name) else: sink.append(tvtk_name) elif has_output: src.append(tvtk_name) o.SetGlobalWarningDisplay(w) result = (all, src, filter, sink) for x in result: x.sort() return result def get_func_doc(func, fname): """Returns function documentation.""" if inspect.isfunction(func): func_obj = func elif inspect.ismethod(func): func_obj = func.__func__ else: return '' args, vargs, vkw = inspect.getargs(func_obj.__code__) defaults = func_obj.__defaults__ doc = fname + inspect.formatargspec(args, vargs, vkw, defaults) d = inspect.getdoc(func) if d is not None: doc += '\n\n' + d + '\n\n' return doc def get_tvtk_class_doc(obj): """Return's the objects documentation.""" doc = obj.__doc__ + '\nTraits:\n-------------------\n\n' ignore = ['trait_added', 'trait_modified'] for key, trait in obj.traits().items(): if key.startswith('_') or key.endswith('_') or key in ignore: continue doc += '\n%s: %s'%(key, trait.help) doc += '\nMethods:\n----------------------\n\n' traits = obj.trait_names() for name in dir(obj): if name in traits or name.startswith('_'): continue if name.find('trait') > -1 and name != 'update_traits': continue func = getattr(obj, name) if callable(func): doc += '\n' + get_func_doc(func, name) return doc # GLOBALS TVTK_CLASSES, TVTK_SOURCES, TVTK_FILTERS, TVTK_SINKS = get_tvtk_class_names() ################################################################################ # `DocSearch` class. ################################################################################ class DocSearch(object): """A simple class that provides a method to search through class documentation. This code is taken from mayavi-1.x's ivtk.VtkHelp """ # These are class attributes to prevent regenerating them everytime # this class is instantiated. VTK_CLASSES = [] VTK_CLASS_DOC = [] def __init__(self): self.vtk_classes = self.VTK_CLASSES self.vtk_c_doc = self.VTK_CLASS_DOC if len(self.VTK_CLASSES) == 0: self._setup_data() def _setup_data(self): self.vtk_classes = [x for x in dir(vtk) if x.startswith('vtk')] n = len(self.vtk_classes) # Store the class docs in the list given below. self.vtk_c_doc = ['']*n # setup the data. for i in range(n): c = self.vtk_classes[i] try: doc = getattr(vtk, c).__doc__.lower() self.vtk_c_doc[i] = doc except AttributeError: pass def search(self, word): """ Search for word in class documentation and return matching classes. This is also case insensitive. The searching supports the 'and' and 'or' keywords that allow for fairly complex searches. A space between words assumes that the two words appear one after the other. Parameters ---------- word -- name to search for. """ assert type(word) is str, \ "Sorry, passed argument, %s is not a string."%word if len(word.strip()) == 0: return [] lword = word.lower().strip() tmp_list = lword.split() wlist = [] prev = "" for w in tmp_list: z = w.strip() if z in ('and', 'or'): if prev and prev not in ('and', 'or'): wlist.append(prev) wlist.append(z) prev = z else: if prev and prev not in ('and', 'or'): prev = prev + ' ' + z else: prev = z if prev in ('and', 'or'): del wlist[-1] elif prev: wlist.append(prev) ret = [] i = 0 vtk_classes = self.vtk_classes vtk_c_doc = self.vtk_c_doc N = len(vtk_classes) while i < N: stored_test = 0 do_test = '' for w in wlist: if w == 'and': do_test = 'and' elif w == 'or': do_test = 'or' else: test = (vtk_c_doc[i].find(w) > -1) if do_test == 'and': stored_test = stored_test and test elif do_test == 'or': stored_test = stored_test or test elif do_test == '': stored_test = test if stored_test: ret.append(vtk_classes[i]) i = i + 1 return [get_tvtk_name(x) for x in ret] _search_help_doc = """ Help on Searching --------------------------------------- To search for a particular TVTK class, type in the 'class_name' text entry widget. The class names are all case sensitive. You may also select the class from the list of available class names at the top. As you type you will see completion options in the completions list, the instant a complete match is found the class documentation will be show in the bottom. You can also search the TVTK class documentation for strings (case insensitive). The search option supports the 'and' and 'or' keywords to do advanced searches. Press / to perform the search. The top 25 hits will show up in the completions, to view a particular hit either select the choice from the available ones or type in the name in the 'class_name' entry box. To clear the search string click the 'Clear search' button or erase the search string manually. """ ################################################################################ # `TVTKClassChooser` class. ################################################################################ class TVTKClassChooser(HasTraits): # The selected object, is None if no valid class_name was made. object = Property # The TVTK class name to choose. class_name = Str('', desc='class name of TVTK class (case sensitive)') # The string to search for in the class docs -- the search supports # 'and' and 'or' keywords. search = Str('', desc='string to search in TVTK class documentation '\ 'supports the "and" and "or" keywords. '\ 'press to start search. '\ 'This is case insensitive.') clear_search = Button # The class documentation. doc = Str(_search_help_doc) # Completions for the choice of class. completions = List(Str) # List of available class names as strings. available = List(TVTK_CLASSES) ######################################## # Private traits. finder = Instance(DocSearch) n_completion = Int(25) ######################################## # View related traits. view = View(Group(Item(name='class_name', editor=EnumEditor(name='available')), Item(name='class_name', has_focus=True ), Item(name='search', editor=TextEditor(enter_set=True, auto_set=False) ), Item(name='clear_search', show_label=False), Item('_'), Item(name='completions', editor=ListEditor(columns=3), style='readonly' ), Item(name='doc', resizable=True, label='Documentation', style='custom') ), id='tvtk_doc', resizable=True, width=800, height=600, title='TVTK class chooser', buttons = ["OK", "Cancel"] ) ###################################################################### # `object` interface. ###################################################################### def __init__(self, **traits): super(TVTKClassChooser, self).__init__(**traits) self._orig_available = list(self.available) ###################################################################### # Non-public interface. ###################################################################### def _get_object(self): o = None if len(self.class_name) > 0: try: o = getattr(tvtk, self.class_name)() except (AttributeError, TypeError): pass return o def _class_name_changed(self, value): av = self.available comp = [x for x in av if x.startswith(value)] self.completions = comp[:self.n_completion] if len(comp) == 1 and value != comp[0]: self.class_name = comp[0] o = self.object if o is not None: self.doc = get_tvtk_class_doc(o) else: self.doc = _search_help_doc def _finder_default(self): return DocSearch() def _clear_search_fired(self): self.search = '' def _search_changed(self, value): if len(value) < 3: self.available = self._orig_available return f = self.finder result = f.search(str(value)) if len(result) == 0: self.available = self._orig_available elif len(result) == 1: self.class_name = result[0] else: self.available = result self.completions = result[:self.n_completion] ################################################################################ # `TVTKSourceChooser` class. ################################################################################ class TVTKSourceChooser(TVTKClassChooser): available = List(TVTK_SOURCES) ################################################################################ # `TVTKFilterChooser` class. ################################################################################ class TVTKFilterChooser(TVTKClassChooser): available = List(TVTK_FILTERS) ################################################################################ # `TVTKSinkChooser` class. ################################################################################ class TVTKSinkChooser(TVTKClassChooser): available = List(TVTK_SINKS) def main(): """Pops up a class chooser which doubles as a nice help search documentation tool. """ s = TVTKClassChooser() s.configure_traits() if __name__ == '__main__': main() mayavi-4.5.0/tvtk/tools/visual.py0000644000076500000240000024212612747716314017442 0ustar prabhustaff00000000000000"""A module that provides VPython like capabilities. For more details about VPython, refer the official website. VPython : http://www.vpython.org/index.html The API is based on VPython, but instead of using OpenGL and other C libraries, this is based completly on TVTK, and Traits and Numpy. All of the demos are also translated from VPython examples. The implementation is done using object oriented design, and each visualization capability is implemented as a seperate traits class. The attributes of each class could be independently edited. The API is kept as similar to VPython as much as possible. This module offers the following classes : Display actors sphere, cylinder, cone, box, arrow, curve, ring, helix, ellipsoid Functionality classes frame, vector, animator Utility functions iterator, remove_actor, show To see examples of classes and functions look at the `test_*` functions at the end of this file. Here is a quick example demonstrating how to use visual. Note: The visual module should be interactively used in ipython only when --gui=qt is enabled. `visual` will not work properly in an interactive mode with the vanilla python interpretor. :: $ ipython --gui=qt In [1]: from tvtk.tools import visual In [2]: visual.test_sphere() In [3]: s = visual.sphere() # Create a sphere actor In [4]: s.edit_traits() # Edit sphere actor's properties via GUI """ # Author: Raashid Baig # Prabhu Ramachandran # # License: BSD Style. # Year : 2007-2016 from __future__ import print_function # Standard library imports. import sys import numpy import time from math import sin, cos, pi, sqrt, acos # Enthought library imports. from traits.api import HasTraits, Trait, Instance, Tuple, Int, \ Range, Button, Array, Bool, Any, List, Enum from traitsui.api import View, Item, Group from tvtk.api import tvtk from tvtk.tools import ivtk from tvtk.common import configure_input from pyface.api import GUI from pyface.timer.api import Timer from tvtk.tvtk_base import vtk_color_trait # Set the global variable to None, for it's future use in function # get_viewer() _viewer = None ################################################################# ################ Utility function #################### ################################################################# def _create_viewer(): """Creates and retunrs the ivtk viewer to get_viewer() function""" v = ivtk.viewer(browser = False) v.scene.background = (0,0,0) GUI.process_events() return v def set_viewer(viewer): """Set the global viewer. Handy if you need to use visual from your own viewer. Pass an object that has a `scene` trait containing a tvtk scene instance. """ global _viewer _viewer = viewer def get_viewer(): """ Creates and returns an ivtk viewer. If the fuction is called 1st time than creates and returns the viewer, otherwise the originally created viewer itself is returned. Checking is done through the global variable _viewer. """ global _viewer if _viewer is None: # If no viewer has been created till this point in program # _create_viewer() is called and a new ivtk viewer is created _viewer = _create_viewer() else: try: _viewer.scene.render() except: # If the original ivtk window is destroyed when function # is called more than once an exception is raised so that # a new ivtk browser is created and returned. _viewer = _create_viewer() return _viewer def show_actor(*tvtk_actors): """ Gets an ivtk viewer from the function get_viewer() and adds all the actors given, to the ivtk scene. """ v = get_viewer() v.scene.add_actors(tvtk_actors) v.scene.reset_zoom() def remove_actor(*tvtk_actors): """ Gets the ivtk viewer from the function get_viewer() and removes all the actors given, from the ivtk scene.""" v = get_viewer() for x in tvtk_actors: v.scene.remove_actors(x.actor) v.scene.reset_zoom() def show(): """This function has to be called at the end in a stand alone visual program. Note - Don't call this function when running visual from ipython iterpretor in an interactive mode """ if '-wthread' in sys.argv or '--gui' in sys.argv: pass else: gui = GUI() gui.start_event_loop() def iterate(millisec, callable, *args, **kwargs): """Creates an instance of utility class Animator and returns it, used for programs with animations, see examples for demonstration """ return Animator(millisec, callable, *args, **kwargs) def translate(old, new, points): """Translate function takes 3 arguments the old position, new position and the points. The function translates all the points to the new position and returns the new points""" diff = new - old points[:] = points + diff return points def translate_points(diff, points): """Translate function takes 2 arguments the with which the points are required to be translated and the points. The function translates all the points to the new position and returns the new points""" points[:] = points + diff return points def _create_rotation_matrix(axis, angle): """Create a rotation matrix given an axis and an angle (in degrees) to rotate by. """ axis = numpy.asarray(axis, dtype = float) axis /= sqrt(numpy.inner(axis, axis)) #Normalizing the axis x = axis[0] y = axis[1] z = axis[2] t = angle*pi/180 cost = cos(t) sint = sin(t) rotator = numpy.zeros((3,3), float) rotator[0][0] = cost + (1-cost)*(x*x) rotator[0][1] = (1-cost)*x*y - (sint)*z rotator[0][2] = (1-cost)*x*z + (sint)*y rotator[1][0] = (1-cost)*y*x + (sint)*z rotator[1][1] = cost + (1-cost)*(y*y) rotator[1][2] = (1-cost)*y*z - (sint)*x rotator[2][0] = (1-cost)*z*x - (sint)*y rotator[2][1] = (1-cost)*z*y + (sint)*x rotator[2][2] = cost + (1-cost)*(z*z) return rotator def axis_changed(old, new, pos, points): """The function takes 4 arguments, the old and the new axis, the position and points. All arguments should be given as a numpy array, The first 3 can also be given in form of a tuple. The function rotates all the points so that they become aligned with the new axis""" # Creating a working normalized copy of old axis o = old/float(sqrt(numpy.inner(old, old))) # Creating a working normalized copy of new axis n = new/sqrt(numpy.inner(new, new)) dpdt = numpy.dot(o, n) if abs(abs(dpdt) - 1.0) < 1e-10: if dpdt < 0: #This is a must in the case when the new and the old axis are #opposite to each other diff = -pos points = translate_points(diff, points) #Flipping the points to reverse the axis points[:] = -points diff = pos points = translate_points(diff, points) return points else: #This is useful in the case when the new and the old axis are #very close to each other return points alpha = acos(dpdt)# Calculating angle between the old & new axis raxis = numpy.cross(o, n)# Calculating the axis about which to rotate #Creating the rotation multiplication matrix data = _create_rotation_matrix(raxis, 180.0*alpha/pi) if (numpy.allclose(pos, 0.0)): points[:] = numpy.dot(points, data.T) return points else: diff = -pos points = translate_points(diff, points) points[:] = numpy.dot(points, data.T) diff = pos points = translate_points(diff, points) return points def rotate(axis, angle, origin, pos, points, maxis): """Rotate function takes 6 arguments the axis about which the actor has to be rotated, the angle with which the actor has to be rotated, the point (origin) about which actor has to be rotated and posistion, points and current axis of the actor. The function returns the new position, points and axis of the actor after the rotation.""" data = _create_rotation_matrix(axis, angle) if (numpy.allclose(pos, 0.0) and numpy.allclose(origin, 0.0)): points[:] = numpy.dot(points, data.T) raxis = numpy.dot(maxis, data.T) return pos, points, raxis else: diff = (-1*origin[0], -1*origin[1], -1*origin[2]) pos = pos - origin points = translate_points(diff, points) points[:] = numpy.dot(points, data.T) pos = numpy.dot(pos, data.T) diff = (origin[0], origin[1], origin[2]) points = translate_points(diff, points) pos = pos + origin raxis = numpy.dot(maxis, data.T) return pos, points, raxis def rotate_single_point(axis, angle, origin, pos, maxis): """Rotate function takes 5 arguments the axis about which the actor has to be rotated, the angle with which the actor has to be rotated, the point (origin) about which actor has to be rotated and posistion, and current axis of the actor. The function returns the new position and new axis of the actor after the rotation.""" axis = numpy.asarray(axis, dtype = float) data = _create_rotation_matrix(axis, angle) if (numpy.allclose(pos, 0.0)): raxis = numpy.dot(maxis, data.T) return pos, raxis else: pos = pos - origin pos = numpy.dot(pos, data.T) pos = pos + origin raxis = pos/sqrt(numpy.inner(pos, pos)) return pos, raxis def scale(scale_factor, points, pos): """Scale function takes 2 arguments the scaling_factor in a form of list, or a tuple giving the scale factor for x,y and z axis. The function returns the new points ofthe actor after scaling""" #Creating the scaling multiplication matrix sc = numpy.asarray(scale_factor, dtype=float) data = numpy.diag(sc) if (numpy.allclose(pos, 0.0)): points[:] = numpy.dot(points, data.T) return points else: diff = (-1*pos[0], -1*pos[1], -1*pos[2]) points = translate_points(diff, points) points[:] = numpy.dot(points, data.T) diff = (pos[0], pos[1], pos[2]) points = translate_points(diff, points) return points ################################################################# ####################### Functionality classes ################### ################################################################# class VTimer(Timer): def __init__(self, millisecs, callable, *args, **kw_args): #Initializing the init method of parent class Timer Timer.__init__(self, millisecs, callable, *args, **kw_args) self.viewer = get_viewer() self.viewer.on_trait_change(self._close, 'closing') def _close(self): self.Stop() print("Stopping iterations since the viewer has been closed.") def Notify(self): """Overridden to call the given callable. """ try: self.callable(*self.args, **self.kw_args) except StopIteration: self.Stop() except: self.Stop() raise class Animator(HasTraits): ##################################################################### # Traits definitions start_animation = Button('Start Animation') stop_animation = Button('Stop Animation') time_period = Range(1, 100000, 100, desc='Specifies frequency with which timer is called') itimer = Instance(VTimer) ###################################################################### # User interface view event_group = Group(Item('start_animation', style = 'simple'), Item('_'), Item('stop_animation', style = 'simple'), Item('_'), show_labels = False,) traits_view = View(event_group, Item(name = 'time_period'), title = 'Animation Controler', buttons = ['OK'], width = 250) ###################################################################### # Initialize object def __init__(self, millisec, callable, *args, **kwargs): self.time_period = millisec self.itimer = VTimer(millisec, callable, *args, **kwargs) ###################################################################### # Non-public methods, Event handlers def _start_animation_fired(self): self.itimer.Start() def _stop_animation_fired(self): self.itimer.Stop() def _time_period_changed(self, value): t = self.itimer if t is None: return t.millisec = value if t.IsRunning(): t.Stop() t.Start(value) class MVector(numpy.ndarray): """MVector class gives many of the functionalities given by Vector of VPython""" def __new__(subtype, x = 0.0, y = 0.0, z = 0.0): data = numpy.array((x, y, z), float) ret = numpy.ndarray.__new__(subtype, shape = (3,), buffer = data, dtype=float, order = False) return ret.copy() def _get_x(self): return self[0] def _set_x(self, val): self[0] = val x = property(_get_x, _set_x) def _get_y(self): return self[1] def _set_y(self, val): self[1] = val y = property(_get_y, _set_y) def _get_z(self): return self[2] def _set_z(self, val): self[2] = val z = property(_get_z, _set_z) def dot(vec1, vec2): """ Function performs the dot vector multiplication of 2 vector instances and returning a new vector instance equal to the dot product of given vectors""" i = vec1.x * vec2.x j = vec1.y * vec2.y k = vec1.z * vec2.z dot = i + j + k return dot def cross(vec1, vec2): """ Function performing the cross vector multiplication of 2 vector instances and returning a new vector instance equal to the cross product of given vectors""" i = (vec1.y*vec2.z - vec1.z*vec2.y) j = (vec1.z*vec2.x - vec1.x*vec2.z) k = (vec1.x*vec2.y - vec1.y*vec2.x) cross = MVector(i, j, k) return cross def mag(vec): """ Function computes and returns the magnitude of a vector""" mag = sqrt(vec[0]**2 + vec[1]**2 + vec[2]**2) return mag def norm(vec): """ Function computes and returns the normalized form of a given vector""" norm = vec/sqrt(numpy.inner(vec, vec)) return norm class Frame(HasTraits): """Frame groups together all the actors given to it into a single unit, so that they can be manipulated as a combined entity.""" ##################################################################### # Traits definitions axis = Array(value = (1.0, 0.0, 0.0), desc = 'the frame axis') x = Range(-1e299, 1e299, 0.0, desc = 'the X coordinate of frame objects') y = Range(-1e299, 1e299, 0.0, desc = 'the Y coordinate of frame objects') z = Range(-1e299, 1e299, 0.0, desc = 'the Z coordinate of frame objects') pos = Array(value = (0.0, 0.0, 0.0), desc = 'the frame pos') objects = List visibility = Bool(True) viewer = Any ###################################################################### # User interface view traits_view = View(Group(Item(name = 'x', label = 'Pos X'), Item(name = 'y', label = 'Pos Y'), Item(name = 'z', label = 'Pos Z'), Item(name = 'visibility'), label = 'Frame Properties', show_border = True), buttons=['OK'], ) def __init__(self, *arguments, **traits): self.arg = list(arguments) HasTraits.__init__(self, **traits) self.keys = list(traits.keys()) self._pos_changed(numpy.array([0.0, 0.0, 0.0]), self.pos) self._x_changed(0.0, self.x) self._y_changed(0.0, self.y) self._z_changed(0.0, self.z) #self._axis_changed(numpy.array([1.0, 0.0, 0.0]), self.axis) ###################################################################### # Non-public methods, Event handlers def _pos_changed(self, old, new): diff = new - old for a in self.arg: a.pos = a.pos + diff def _x_changed(self, old, new): diff = new - old for a in self.arg: a.x = a.x + diff def _y_changed(self, old, new): diff = new - old for a in self.arg: a.y = a.y + diff def _z_changed(self, old, new): diff = new - old for a in self.arg: a.z = a.z + diff def _axis_changed(self, old, new): if (numpy.allclose(old, new)): pass else: o = old/sqrt(numpy.inner(old, old)) n = new/sqrt(numpy.inner(new, new)) raxis = numpy.cross(o, n) # raxis is the axis about which the rotation of th objects # will be performed so that they have the new axis alpha = acos(numpy.dot(o, n)) # alpha is the angle between the old and the new axis alpha = 180.0*alpha/pi for a in self.arg: a.rotate(alpha, raxis, self.pos) def _visibility_changed(self, value): val = int(value) if (val == 1): for a in self.arg: a.actor.visibility = 1 else: for a in self.arg: a.actor.visibility = 0 ###################################################################### # Object's public methods def rotate(self, angle, axis, origin = numpy.array([0.0, 0.0, 0.0])): for a in self.arg: a.rotate(angle, axis, origin) pts = numpy.array([1.0, 0.0, 0.0])#junk points passed as arguments pos, pts, faxis = rotate(axis, angle, origin, self.pos, pts, self.axis) self.set(pos=pos, axis = faxis, trait_change_notify = False) ################################################################### ###################### Actor Classes ############################## ################################################################### class Curve(HasTraits): """Curve class creates a polydata source using point and connectivity arrays given by the user, which inturn is used to create a polydata actor""" ##################################################################### # Traits definitions points = Array(dtype=float, shape=(None,3), desc='the points of the curve') pos = Array(value = (0.0, 0.0, 0.0), desc = 'the curve pos') radius = Range(0.0, 1.0e299, value = 0.01, desc = 'the radius of curve tube') axis = Array(value=(1.0, 0.0, 0.0), desc = 'the curve axis') x = Range(-1e299, 1e299, 0.0, desc = 'the X coordinate of curve') y = Range(-1e299, 1e299, 0.0, desc = 'the Y coordinate of curve') z = Range(-1e299, 1e299, 0.0, desc = 'the Z coordinate of curve') color = vtk_color_trait((1.0, 1.0, 1.0)) representation = Enum('s', 'w', 'p') visibility = Bool(True) polydata = Instance(tvtk.PolyData, args=()) property = Instance(tvtk.Property) stripper = Instance(tvtk.Stripper, args=()) tube = Instance(tvtk.TubeFilter, args=()) actor = Instance(tvtk.Actor, args=()) # tvtk Actor, for the usual pipeline architecture. viewer = Any ###################################################################### # User interface view traits_view = View(Group(Item(name = 'color'), Item(name = 'visibility'), Item(name = 'radius'), Item(name = 'x', label = 'Pos X'), Item(name = 'y', label = 'Pos Y'), Item(name = 'z', label = 'Pos Z'), Item(name = 'representation'), label = 'Curve Properties', show_border = True), buttons=['OK'], ) def __init__(self, **traits): self.property = self.actor.property configure_input(self.stripper, self.polydata) configure_input(self.tube, self.stripper) self.tube.number_of_sides = 4 self.tube.capping = 1 m = tvtk.PolyDataMapper() configure_input(m, self.tube) self.actor.mapper = m self.stripper.update() self.tube.update() self.property = self.actor.property self.property.representation = self.representation show_actor(self.actor) self.viewer = get_viewer() self.property.on_trait_change(self.viewer.scene.render) self.actor.on_trait_change(self.viewer.scene.render) self.tube.on_trait_change(self.viewer.scene.render) axis = traits.pop('axis', None) HasTraits.__init__(self, **traits) self._points_changed(self.points) self._color_changed(self.color) self._visibility_changed(self.visibility) self._radius_changed(self.radius) if axis is not None: self._axis_changed(numpy.array((1.0, 0.0, 0.0)), numpy.asarray(axis, dtype=float)) ###################################################################### # Object's public methods def append(self, pnt): """Function appeneds new points given as arguments to the current points""" self.extend([pnt]) def extend(self, pts): if self.points is None: p = pts else: n = self.points.shape[0] p = numpy.resize(self.points, (n+len(pts), 3)) p[:n] = self.points p[n:] = pts self.points = p self.update() def update(self): self.polydata.modified() self.stripper.update() self.tube.update() self.viewer.scene.render() def rotate(self, angle, axis, origin = numpy.array([0.0, 0.0, 0.0])): """Function takes atleast 2 arguments: axis about which to rotate the actor and angle with which to rotate the actor, the 3rd agrument is origin i.e. the point about which to rotate the actor, by default it is set to the global origin""" p, pi, ax = rotate(axis, angle, origin, self.pos, self.points, numpy.array([0.0, 0.0, 0.0])) self.set(pos = p, trait_change_notify = False) self.set(points = pi, trait_change_notify = False) self.set(axis = ax, trait_change_notify = False) self.polydata.points = self.points self.polydata.modified() self.stripper.update() self.tube.update() self.render() def render(self): """Function redraws/refreshs the ivtk viewer's scene""" v = self.viewer if v is not None: v.scene.render() ###################################################################### # Non-public methods, Event handlers def _points_changed(self, value): self.polydata.lines = None self.polydata.points = value if value is None: np = 0 lines = None else: np = len(self.points) - 1 lines = numpy.zeros((np, 2), 'l') lines[:,0] = numpy.arange(0, np-0.5, 1, 'l') lines[:,1] = numpy.arange(1, np+0.5, 1, 'l') self.polydata.lines = lines self.polydata.modified() self.stripper.update() self.tube.update() v = self.viewer if v is not None: v.scene.render() def _x_changed(self, value): self.x = value self.pos = (self.x, self.pos[1],self.pos[2]) def _y_changed(self, value): self.y = value self.pos = (self.pos[0], self.y, self.pos[2]) def _z_changed(self, value): self.z = value self.pos = (self.pos[0], self.pos[1], self.z) def _pos_changed(self, old, new): self.set(x = new[0], trait_change_notify = False) self.set(y = new[1], trait_change_notify = False) self.set(z = new[2], trait_change_notify = False) p = translate(old, new, self.points) self.set(points = p, trait_change_notify = False) self.polydata.points = self.points self.polydata.modified() self.stripper.update() self.tube.update() self.render() def _axis_changed(self, old, new): pts = axis_changed(old, new, self.pos, self.points) self.points = pts.copy() def _color_changed(self, value): self.actor.property.color = value def _radius_changed(self, value): self.tube.radius = self.radius def _representation_changed(self, value): self.property.representation = self.representation self.property.modified() self.render() def _visibility_changed(self, value): val = int(value) if (val == 1): self.actor.visibility = 1 else: self.actor.visibility = 0 class Ring(HasTraits): """Ring class creates a Ring form tvtk polydata, follows the usual VTK pipeline and creates a ring actor.""" ##################################################################### # Traits definitions points = Array('d', shape = (360,3)) radius = Range(-1e299, 1e299, value = 0.5, desc = 'the ring radius') pos = Array(value = (0.0, 0.0, 0.0), desc = 'the ring pos') axis = Array(value = (1.0, 0.0, 0.0), desc = 'the ring axis') color = vtk_color_trait((1.0, 1.0, 1.0)) x = Range(-1e299, 1e299, 0.0, desc = 'the X coordinate of ring center') y = Range(-1e299, 1e299, 0.0, desc = 'the Y coordinate of ring center') z = Range(-1e299, 1e299, 0.0, desc = 'the Z coordinate of ring center') representation = Enum('s', 'w', 'p') thickness = Range(0, 1e299, value = 0.01, desc = 'the ring thickness') visibility = Bool(True) viewer = Any polydata = Instance(tvtk.PolyData, ()) property = Instance(tvtk.Property) tube = Instance(tvtk.TubeFilter, ()) actor = Instance(tvtk.Actor, ()) # tvtk Actor, for the usual pipeline architecture. normals = Instance(tvtk.PolyDataNormals(), ()) ###################################################################### # User interface view traits_view = View(Group(Item(name = 'radius'), Item(name = 'thickness'), Item(name = 'x', label = 'Pos X'), Item(name = 'y', label = 'Pos Y'), Item(name = 'z', label = 'Pos Z'), Item(name = 'color'), Item(name = 'visibility'), Item(name = 'representation'), label = 'Ring Properties', show_border = True), buttons=['OK'], ) def __init__(self, **traits): self.property = self.actor.property self.normals = tvtk.PolyDataNormals() configure_input(self.normals, self.polydata) configure_input(self.tube, self.normals) self.normals.update() self.tube.update() self.tube.number_of_sides = 4 self.tube.capping = 1 m = tvtk.PolyDataMapper() configure_input(m, self.tube) self.actor.mapper = m self.property = self.actor.property self.property.representation = self.representation self.viewer = get_viewer() self.property.on_trait_change(self.viewer.scene.render) self.actor.on_trait_change(self.viewer.scene.render) self.tube.on_trait_change(self.viewer.scene.render) HasTraits.__init__(self, **traits) self._create_points() self._pos_changed([0.0, 0.0, 0.0], self.pos) self._color_changed(self.color) self._visibility_changed(self.visibility) self._thickness_changed(self.thickness) self._axis_changed(numpy.array((1.0, 0.0, 0.0)), self.axis) show_actor(self.actor) ###################################################################### # Non-public methods, Event handlers def _create_points(self): for i in range(0,360,1): theta = i*pi/180 self.points[i][0] = 0.0 self.points[i][1] = self.radius*sin(theta) self.points[i][2] = self.radius*cos(theta) np = len(self.points) - 1 lines = numpy.zeros((np, 2), 'l') lines[:,0] = numpy.arange(0, np-0.5, 1, 'l') lines[:,1] = numpy.arange(1, np+0.5, 1, 'l') self.polydata.points = self.points self.polydata.lines = lines v = self.viewer if v is not None: v.scene.render() def _color_changed(self, value): self.actor.property.color = value def _radius_changed(self, old, new): factor = new/old if (numpy.allclose(self.pos, 0.0)): self.points[:] = factor*self.points[:] self.polydata.modified() self.normals.update() self.tube.update() self.render() else: c = self.pos diff = (0.0, 0.0, 0.0) - c self.points = translate_points(diff, self.points) self.points[:] = factor*self.points[:] diff = c self.points = translate_points(diff, self.points) self.polydata.points = self.points self.polydata.modified() self.normals.update() self.tube.update() self.render() def _x_changed(self, value): self.x = value self.pos = (self.x, self.pos[1],self.pos[2]) def _y_changed(self, value): self.y = value self.pos = (self.pos[0], self.y, self.pos[2]) def _z_changed(self, value): self.z = value self.pos = (self.pos[0], self.pos[1], self.z) def _pos_changed(self, old, new): self.set(x = new[0], trait_change_notify = False) self.set(y = new[1], trait_change_notify = False) self.set(z = new[2], trait_change_notify = False) self.points = translate(old, new, self.points) self.polydata.points = self.points self.polydata.modified() self.normals.update() self.tube.update() self.render() def _axis_changed(self, old, new): self.points = axis_changed(old, new, self.pos, self.points) self.polydata.points = self.points self.polydata.modified() self.normals.update() self.tube.update() self.render() def _representation_changed(self, value): self.property.representation = self.representation self.property.modified() self.render() def _visibility_changed(self, value): self.actor.visibility = value def _thickness_changed(self, value): self.tube.radius = value ###################################################################### # Object's public methods def rotate(self, angle, axis, origin = numpy.array([0.0, 0.0, 0.0])): """Function takes atleast 2 arguments: angle with which to rotate the actor, and the axis about which to rotate the actor, the 3rd agrument is origin i.e. the point about which to rotate the actor, by default it is set to the global origin""" p, pi, ax = rotate(axis, angle, origin, self.pos, self.points, self.axis) self.set(pos = p, trait_change_notify = False) self.points = pi self.set(axis = ax, trait_change_notify = False) self.polydata.points = self.points self.polydata.modified() self.normals.update() self.tube.update() self.render() def render(self): v = self.viewer if v is not None: v.scene.render() class Cone(HasTraits): """Cone class creates Cone from polydata obtained from tvtk ConeSource, follows the usual VTK pipeline and creates a Cone actor, which is passed to the show_actor() function as an argument. """ ##################################################################### # Traits definitions points = Array('d', shape = (7,3)) radius = Range(0.0, 100.0, value = 0.5, desc = 'the cone radius') height = Range(0.0, 100.0, value = 1.0, desc = 'the cone height') pos = Array(value = (0.0, 0.0, 0.0), desc = 'the cone pos') axis = Array(value = (1.0, 0.0, 0.0), desc = 'the cone axis') color = vtk_color_trait((1.0, 1.0, 1.0)) x = Range(-1e299, 1e299, 0.0, desc = 'the X coordinate of cone center') y = Range(-1e299, 1e299, 0.0, desc = 'the Y coordinate of cone center') z = Range(-1e299, 1e299, 0.0, desc = 'the Z coordinate of cone center') representation = Enum('s', 'w', 'p') visibility = Bool(True) viewer = Any polydata = Instance(tvtk.PolyData, ()) property = Instance(tvtk.Property) actor = Instance(tvtk.Actor, ()) ###################################################################### # User interface view traits_view = View(Group(Item(name = 'radius'), Item(name = 'height'), Item(name = 'x', label = 'Pos X'), Item(name = 'y', label = 'Pos Y'), Item(name = 'z', label = 'Pos Z'), Item(name = 'color'), Item(name = 'visibility'), Item(name = 'representation'), label = 'Cone Properties', show_border = True), buttons=['OK'], ) def __init__(self, **traits): self.property = self.actor.property m = tvtk.PolyDataMapper() configure_input(m, self.polydata) self.actor.mapper = m self.property = self.actor.property self.property.representation = self.representation self.viewer = get_viewer() # getting the ivtk viewer self.property.on_trait_change(self.viewer.scene.render) self.actor.on_trait_change(self.viewer.scene.render) HasTraits.__init__(self, **traits) self._create_points(self.radius, self.height, self.pos, self.axis) self._pos_changed(numpy.array([0.0, 0.0, 0.0]), self.pos) self._color_changed(self.color) show_actor(self.actor) # passing the actors function for rendering ###################################################################### # Non-public methods, Event handlers def _create_points(self, r, h, c, d): cs = tvtk.ConeSource(radius=r, height=h, center=tuple(c), direction=tuple(d)) cs.update() ps = cs.output points = ps.points.to_array() self.points = points self.polydata.points = self.points self.polydata.polys = ps.polys return points, ps.polys def _color_changed(self, value): self.actor.property.color = value def _radius_changed(self): points, lines = self._create_points(self.radius, self.height, self.pos, self.axis) self.polydata.points = points self.polydata.modified() self.render() def _height_changed(self): points, lines = self._create_points(self.radius, self.height, self.pos, self.axis) self.polydata.points = points self.polydata.modified() self.render() def _pos_changed(self, old, new): self.set(x = new[0], trait_change_notify = False) self.set(y = new[1], trait_change_notify = False) self.set(z = new[2], trait_change_notify = False) points, lines = self._create_points(self.radius, self.height, self.pos, self.axis) self.points = points self.polydata.modified() self.render() def _axis_changed(self): points, lines = self._create_points(self.radius, self.height, self.pos, self.axis) self.polydata.points = points self.polydata.modified() self.render() def _x_changed(self, value): self.x = value self.pos = (self.x, self.pos[1],self.pos[2]) def _y_changed(self, value): self.y = value self.pos = (self.pos[0], self.y, self.pos[2]) def _z_changed(self, value): self.z = value self.pos = (self.pos[0], self.pos[1], self.z) def _representation_changed(self, value): self.property.representation = self.representation self.property.modified() self.render() def _visibility_changed(self, value): val = int(value) if (val == 1): self.actor.visibility = 1 else: self.actor.visibility = 0 ###################################################################### # Object's public methods def rotate(self, angle, axis, origin = numpy.array([0.0, 0.0, 0.0])): """Function takes atleast 2 arguments: axis about which to rotate the actor and angle with which to rotate the actor, the 3rd agrument is origin i.e. the point about which to rotate the actor, by default it is set to the global origin""" p, pi, ax = rotate(axis, angle, origin, self.pos, self.points, self.axis) self.set(pos = p, trait_change_notify = False) self.points = pi self.set(axis = ax, trait_change_notify = False) self.polydata.points = self.points self.polydata.modified() self.render() def render(self): v = self.viewer if v is not None: v.scene.render() class Sphere(HasTraits): """Sphere class creates Sphere from tvtk SphereSource, follows the usual VTK pipeline and creates a Sphere actor, which is passed to the show_actor() function as an argument. """ ##################################################################### # Traits definitions radius = Range(0.0, 1e299, value = 0.5, desc = 'the sphere radius') pos = Array(value = (0.0, 0.0, 0.0), desc = 'the sphere pos') axis = Array(value = (1.0, 0.0, 0.0), desc= 'the sphere axis') color = vtk_color_trait((1.0, 1.0, 1.0)) x = Range(-1e299, 1e299, 0.0, desc = 'the X coordinate of sphere center') y = Range(-1e299, 1e299, 0.0, desc = 'the Y coordinate of sphere center') z = Range(-1e299, 1e299, 0.0, desc = 'the Z coordinate of sphere center') representation = Enum('s', 'w', 'p') visibility = Bool(True) viewer = Any polydata = Instance(tvtk.PolyData, ()) property = Instance(tvtk.Property) actor = Instance(tvtk.Actor, ()) # tvtk Actor, for the usual pipeline architecture. normals = Instance(tvtk.PolyDataNormals, ()) ###################################################################### # User interface view traits_view = View(Group(Item(name = 'radius', style = 'simple'), Item(name = 'x', label = 'Pos X'), Item(name = 'y', label = 'Pos Y'), Item(name = 'z', label = 'Pos Z'), Item(name = 'color'), Item(name = 'visibility'), Item(name = 'representation'), label = 'Sphere Properties', show_border = True), buttons=['OK'], ) def __init__(self, **traits): self.property = self.actor.property self.normals = tvtk.PolyDataNormals() configure_input(self.normals, self.polydata) self.normals.update() m = tvtk.PolyDataMapper() # the usual vtk pipleine countinuation configure_input(m, self.normals) self.actor.mapper = m self.property = self.actor.property self.property.representation = self.representation show_actor(self.actor) # passing the actors function for rendering self.viewer = get_viewer() # getting the ivtk viewer self.property.on_trait_change(self.viewer.scene.render) self.actor.on_trait_change(self.viewer.scene.render) HasTraits.__init__(self, **traits) self._create_points(self.radius, self.pos) self._color_changed(self.color) self._visibility_changed(self.visibility) self._x_changed(self.x) self._y_changed(self.y) self._z_changed(self.z) ###################################################################### # Non-public methods, Event handlers def _create_points(self, r, c): sp = tvtk.SphereSource(radius = r, center = tuple(c), phi_resolution = 20, theta_resolution = 20) sp.update() ps = sp.output points = ps.points.to_array() self.points = points self.polydata.points = self.points self.polydata.polys = ps.polys return points, ps.polys def _radius_changed(self, value): points, polys = self._create_points(self.radius, self.pos) self.polydata.points = points self.polydata.modified() self.render() def _color_changed(self, value): self.actor.property.color = value def _pos_changed(self, old, new): self.set(x = new[0], trait_change_notify = False) self.set(y = new[1], trait_change_notify = False) self.set(z = new[2], trait_change_notify = False) points, lines = self._create_points(self.radius, self.pos) self.polydata.points = points self.polydata.modified() self.normals.update() self.render() def _axis_changed(self, old, new): self.points = axis_changed(old, new, self.pos, self.points) self.polydata.points = self.points self.polydata.modified() self.normals.update() self.render() def _x_changed(self, value): self.x = value self.pos = (self.x, self.pos[1],self.pos[2]) def _y_changed(self, value): self.y = value self.pos = (self.pos[0], self.y, self.pos[2]) def _z_changed(self, value): self.z = value self.pos = (self.pos[0], self.pos[1], self.z) def _representation_changed(self, value): self.property.representation = self.representation self.property.modified() self.render() def _visibility_changed(self, value): val = int(value) if (val == 1): self.actor.visibility = 1 else: self.actor.visibility = 0 ###################################################################### # Object's public methods def render(self): v = self.viewer if v is not None: v.scene.render() def rotate(self, angle, axis, origin = numpy.array([0.0, 0.0, 0.0])): """Function takes atleast 2 arguments: axis about which to rotate the actor and angle with which to rotate the actor, the 3rd agrument is origin i.e. the point about which to rotate the actor, by default it is set to the global origin""" p, pi, ax = rotate(axis, angle, origin, self.pos, self.points, self.axis) self.set(pos = p, trait_change_notify = False) self.points = pi self.set(axis = ax, trait_change_notify = False) self.polydata.points = self.points self.polydata.modified() self.render() class Cylinder(HasTraits): """Cylinder class creates Cylinder from tvtk CylinderSource, follows the usual VTK pipeline and creates a Sphere actor, which is passed to the show_actor() function as an argument. """ ##################################################################### # Traits definitions # XXX: These should really not be ranges, but positive numbers. radius = Range(0.0, 1e299, value = 1.0, desc = 'the cylinder radius') length = Range(0.0, 1e299, value = 1.0, desc = 'the cylinder length') pos = Array(value = (0.0, 0.0, 0.0), desc = 'the cylinder pos') axis = Array(value = (1.0, 0.0, 0.0), desc = 'the cylinder axis') points = Array('d', shape = (60,3)) color = vtk_color_trait((1.0, 1.0, 1.0)) x = Range(-1e299, 1e299, 0.0, desc = 'the X coordinate of cylinder center') y = Range(-1e299, 1e299, 0.0, desc = 'the Y coordinate of cylinder center') z = Range(-1e299, 1e299, 0.0, desc = 'the Z coordinate of cylinder center') representation = Enum('s', 'w', 'p') visibility = Bool(True) viewer = Any polydata = Instance(tvtk.PolyData, ()) actor = Instance(tvtk.Actor, ()) # tvtk Actor, for the usual pipeline architecture. property = Instance(tvtk.Property) normals = Instance(tvtk.PolyDataNormals(), ()) ###################################################################### # User interface view traits_view = View(Group(Item(name = 'radius', style = 'simple'), Item(name = 'length', style = 'simple'), Item(name = 'x', label = 'Pos X'), Item(name = 'y', label = 'Pos Y'), Item(name = 'z', label = 'Pos Z'), Item(name = 'color'), Item(name = 'visibility'), Item(name = 'representation'), label = 'Cylinder Properties', show_border = True), buttons=['OK'], ) def __init__(self, **traits): self.property = self.actor.property self.normals = tvtk.PolyDataNormals() configure_input(self.normals, self.polydata) m = tvtk.PolyDataMapper() # the usual vtk pipleine countinuation configure_input(m, self.normals) self.actor.mapper = m self.property = self.actor.property self.property.representation = self.representation show_actor(self.actor) # passing the actors function for rendering self.viewer = get_viewer() # getting the ivtk viewer self.property.on_trait_change(self.viewer.scene.render) self.actor.on_trait_change(self.viewer.scene.render) HasTraits.__init__(self, **traits) self._create_points(self.radius, self.pos, self.length) self._color_changed(self.color) self._visibility_changed(self.visibility) self._axis_changed(numpy.array([1.0, 0.0, 0.0]), self.axis) self._x_changed(self.x) self._y_changed(self.y) self._z_changed(self.z) ###################################################################### # Non-public methods, Event handlers def _create_points(self, r, c, h): cp = tvtk.CylinderSource(radius = r, height = h, resolution = 15) cp.update() ps = cp.output points = ps.points.to_array() l = len(points) for i in range(0, l, 1): points[i][1] = points[i][1] + h/2.0 points = axis_changed(numpy.array([0.0,1.0,0.0]),numpy.array([1.0,0.0,0.0]),numpy.array([0.0, 0.0, 0.0]), points) points = translate(numpy.array([0.0, 0.0, 0.0]), self.pos, points) self.points = points self.polydata.points = self.points self.polydata.polys = ps.polys return points, ps.polys def _radius_changed(self, old, new): self.points, polys = self._create_points(self.radius, self.pos, self.length) self.polydata.points = self.points self.polydata.modified() self.normals.update() self.render() def _length_changed(self, value): self.points, polys = self._create_points(self.radius, self.pos, self.length) self.polydata.points = self.points self.polydata.modified() self.normals.update() self.render() def _axis_changed(self, old, new): self.points = axis_changed(old, new, self.pos, self.points) self.polydata.points = self.points self.polydata.modified() self.normals.update() self.render() def _pos_changed(self, old, new): self.set(x = new[0], trait_change_notify = False) self.set(y = new[1], trait_change_notify = False) self.set(z = new[2], trait_change_notify = False) self.points = translate(old, new, self.points) self.polydata.points = self.points self.polydata.modified() self.normals.update() self.render() def _color_changed(self, value): self.actor.property.color = value def _x_changed(self, value): self.x = value self.pos = (self.x, self.pos[1],self.pos[2]) def _y_changed(self, value): self.y = value self.pos = (self.pos[0], self.y, self.pos[2]) def _z_changed(self, value): self.z = value self.pos = (self.pos[0], self.pos[1], self.z) def _representation_changed(self, value): self.property.representation = self.representation self.property.modified() self.render() def _visibility_changed(self, value): val = int(value) if (val == 1): self.actor.visibility = 1 else: self.actor.visibility = 0 ###################################################################### # Object's public methods def rotate(self, angle, axis, origin = numpy.array([0.0, 0.0, 0.0])): """Function takes atleast 2 arguments: axis about which to rotate the actor and angle with which to rotate the actor, the 3rd agrument is origin i.e. the point about which to rotate the actor, by default it is set to the global origin""" p, pi, ax = rotate(axis, angle, origin, self.pos, self.points, self.axis) self.set(pos = p, trait_change_notify = False) self.points = pi self.set(axis = ax, trait_change_notify = False) self.polydata.points = self.points self.polydata.modified() self.normals.update() self.render() def render(self): v = self.viewer if v is not None: v.scene.render() class Box(HasTraits): """Box class creates Box from tvtk CubeSource, follows the usual VTK pipeline and creates a Cube actor, which is passed to the show_actor() function as an argument. """ ##################################################################### # Traits definitions size = Tuple((1.0, 1.0, 1.0), desc = 'the box size') pos = Array(value = (0.0, 0.0, 0.0), desc = 'the Box pos') color = vtk_color_trait((1.0, 1.0, 1.0)) x = Range(-1e299, 1e299, 0.0, desc = 'the X coordinate of box center') y = Range(-1e299, 1e299, 0.0, desc = 'the Y coordinate of box center') z = Range(-1e299, 1e299, 0.0, desc = 'the Z coordinate of box center') representation = Enum('s', 'w', 'p') length = Range(0, 1e299, 1.0, desc = 'the box length') height = Range(0, 1e299, 1.0, desc = 'the box height') width = Range(0, 1e299, 1.0, desc = 'the box width') axis = Array(value = (1.0, 0.0, 0.0), desc = 'the box axis') points = Array('d', shape = (24,3)) visibility = Bool(True) viewer = Any polydata = Instance(tvtk.PolyData, ()) actor = Instance(tvtk.Actor, ()) # tvtk Actor, for the usual pipeline architecture. property = Instance(tvtk.Property) ###################################################################### # User interface view traits_view = View(Group(Item(name = 'length'), Item(name = 'height'), Item(name = 'width'), Item(name = 'x', label = 'Pos X'), Item(name = 'y', label = 'Pos Y'), Item(name = 'z', label = 'Pos Z'), Item(name = 'color'), Item(name = 'visibility'), Item(name = 'representation'), label = 'Box Properties', show_border = True), buttons = ['OK'], ) def __init__(self, **traits): self.property = self.actor.property m = tvtk.PolyDataMapper() # the usual vtk pipleine countinuation configure_input(m, self.polydata) self.actor.mapper = m self.property = self.actor.property self.property.representation = self.representation show_actor(self.actor) # passing the actors function for rendering self.viewer = get_viewer() # getting the ivtk viewer self.property.on_trait_change(self.viewer.scene.render) self.actor.on_trait_change(self.viewer.scene.render) HasTraits.__init__(self, **traits) self._create_points(self.size, self.pos) self._color_changed(self.color) self._visibility_changed(self.visibility) self._axis_changed(numpy.array([1.0, 0.0, 0.0]), self.axis) self._x_changed(self.x) self._y_changed(self.y) self._z_changed(self.z) self._length_changed(self.length) self._height_changed(self.height) self._width_changed(self.width) ###################################################################### # Non-public methods, Event handlers def _create_points(self, s, c): cp = tvtk.CubeSource(x_length = s[0], y_length = s[1], z_length = s[2], center = tuple(c)) cp.update() ps = cp.output points = ps.points.to_array() self.points = points self.polydata.points = self.points self.polydata.polys = ps.polys return points, ps.polys def _size_changed(self, old, new): self.set(length = new[0], trait_change_notify = False) self.set(height = new[1], trait_change_notify = False) self.set(width = new[2], trait_change_notify = False) self.points, lines = self._create_points(self.size, self.pos) self.polydata.points = self.points self.polydata.modified() self.render() def _pos_changed(self, old, new): self.set(x = new[0], trait_change_notify = False) self.set(y = new[1], trait_change_notify = False) self.set(z = new[2], trait_change_notify = False) self.points = translate(old, new, self.points) #self.connectivity.points = self.points self.polydata.modified() self.render() def _axis_changed(self, old, new): self.points = axis_changed(old, new, self.pos, self.points) #self.connectivity.points = self.points self.polydata.modified() self.render() def _color_changed(self, value): self.actor.property.color = value def _x_changed(self, value): self.x = value self.pos = (self.x, self.pos[1],self.pos[2]) def _y_changed(self, value): self.y = value self.pos = (self.pos[0], self.y, self.pos[2]) def _z_changed(self, value): self.z = value self.pos = (self.pos[0], self.pos[1], self.z) def _representation_changed(self, value): self.property.representation = self.representation self.property.modified() self.render() def _length_changed(self, value): self.size = (self.length, self.size[1],self.size[2]) def _height_changed(self, value): self.size = (self.size[0], self.height, self.size[2]) def _width_changed(self, value): self.size = (self.size[0], self.size[1], self.width) def _visibility_changed(self, value): val = int(value) if (val == 1): self.actor.visibility = 1 else: self.actor.visibility = 0 ###################################################################### # Object's public methods def rotate(self, angle, axis, origin = numpy.array([0.0, 0.0, 0.0])): """Function takes atleast 2 arguments: axis about which to rotate the actor and angle with which to rotate the actor, the 3rd agrument is origin i.e. the point about which to rotate the actor, by default it is set to the global origin""" p, pi, ax = rotate(axis, angle, origin, self.pos, self.points, self.axis) self.set(pos = p, trait_change_notify = False) self.points = pi self.set(axis = ax, trait_change_notify = False) #self.connectivity.points = self.points self.polydata.modified() self.render() def render(self): v = self.viewer if v is not None: v.scene.render() class Arrow(HasTraits): """Arrow class creates Arrow from tvtk ArrowSource, follows the usual VTK pipeline and creates a Arrow actor, which is passed to the show_actor() function as an argument. """ ##################################################################### # Traits definitions points = Array('d', shape = (31 ,3)) radius_cone = Range(0.0, 10.0, value = 0.08, desc = 'the radius of cone portion of arrow') radius_shaft = Range(0.0, 5.0, value = 0.03, desc = 'the radius of shaft portion of arrow') length_cone = Range(0.0, 1.0, value = 0.35, desc = 'shaft length of arrow') axis = Array(value = (1.0, 0.0, 0.0), desc = 'the arrow axis') color = vtk_color_trait((1.0, 1.0, 1.0)) pos = Array(value = (0.0, 0.0, 0.0), desc = 'the Arrow pos') x = Range(-1e299, 1e299, 0.0, desc = 'the X coordinate of arrow center') y = Range(-1e299, 1e299, 0.0, desc = 'the Y coordinate of arrow center') z = Range(-1e299, 1e299, 0.0, desc = 'the Z coordinate of arrow center') representation = Enum('s', 'w', 'p') visibility = Bool(True) viewer = Any actor = Instance(tvtk.Actor, ()) # tvtk Actor, for the usual pipeline architecture. property = Instance(tvtk.Property) polydata = Instance(tvtk.PolyData, ()) normals = Instance(tvtk.PolyDataNormals(), ()) ###################################################################### # User interface view traits_view = View(Group(Item(name = 'radius_cone'), Item(name = 'length_cone'), Item(name = 'radius_shaft'), Item(name = 'x', label = 'Pos X'), Item(name = 'y', label = 'Pos Y'), Item(name = 'z', label = 'Pos Z'), Item(name = 'color'), Item(name = 'visibility'), Item(name = 'representation'), label = 'Arrow Properties', show_border = True), buttons=['OK']) def __init__(self, **traits): self.property = self.actor.property self.normals = tvtk.PolyDataNormals() configure_input(self.normals, self.polydata) self.normals.update() m = tvtk.PolyDataMapper() # the usual vtk pipleine countinuation configure_input(m, self.normals) self.actor.mapper = m self.property = self.actor.property self.property.representation = self.representation show_actor(self.actor) # passing the actors function for rendering self.viewer = get_viewer() # getting the ivtk viewer self.property.on_trait_change(self.viewer.scene.render) self.actor.on_trait_change(self.viewer.scene.render) HasTraits.__init__(self, **traits) self._create_points(self.radius_cone, self.length_cone, self.radius_shaft, self.pos) self._color_changed(self.color) self._visibility_changed(self.visibility) self._x_changed(self.x) self._y_changed(self.y) self._z_changed(self.z) self._axis_changed(numpy.array((1.0, 0.0, 0.0)), self.axis) ###################################################################### # Non-public methods, Event handlers def _create_points(self, rc, lc, rs, ps): asrc = tvtk.ArrowSource(tip_radius=rc, tip_length=lc, shaft_radius=rs) asrc.update() ps = asrc.output points = ps.points.to_array() points = translate(numpy.array([0.0, 0.0, 0.0]), self.pos, points) self.points = points self.polydata.points = self.points self.polydata.polys = ps.polys return points, ps.polys def _radius_cone_changed(self, old, new): self.points, polys = self._create_points(self.radius_cone, self.length_cone, self.radius_shaft, self.pos) self.polydata.points = self.points self.polydata.modified() self.normals.update() self.render() def _length_cone_changed(self, old, new): self.points, polys = self._create_points(self.radius_cone, self.length_cone, self.radius_shaft, self.pos) self.polydata.points = self.points self.polydata.modified() self.normals.update() self.render() def _radius_shaft_changed(self, old, new): self.points, polys = self._create_points(self.radius_cone, self.length_cone, self.radius_shaft, self.pos) self.polydata.points = self.points self.polydata.modified() self.normals.update() self.render() def _pos_changed(self, old, new): self.set(x = new[0], trait_change_notify = False) self.set(y = new[1], trait_change_notify = False) self.set(z = new[2], trait_change_notify = False) self.points = translate(old, new, self.points) self.polydata.points = self.points self.polydata.modified() self.normals.update() self.render() def _axis_changed(self, old, new): self.points = axis_changed(old, new, self.pos, self.points) self.polydata.points = self.points self.polydata.modified() self.normals.update() self.render() def _color_changed(self, value): self.actor.property.color = value def _x_changed(self, value): self.x = value self.pos = (self.x, self.pos[1],self.pos[2]) def _y_changed(self, value): self.y = value self.pos = (self.pos[0], self.y, self.pos[2]) def _z_changed(self, value): self.z = value self.pos = (self.pos[0], self.pos[1], self.z) def _representation_changed(self, value): self.property.representation = self.representation self.property.modified() self.render() def _visibility_changed(self, value): val = int(value) if (val == 1): self.actor.visibility = 1 else: self.actor.visibility = 0 ###################################################################### # Object's public methods def rotate(self, angle, axis, origin = numpy.array([0.0, 0.0, 0.0])): """Function takes atleast 2 arguments: axis about which to rotate the actor and angle with which to rotate the actor, the 3rd agrument is origin i.e. the point about which to rotate the actor, by default it is set to the global origin""" p, pi, ax = rotate(axis, angle, origin, self.pos, self.points, self.axis) self.set(pos = p, trait_change_notify = False) self.points = pi self.set(axis = ax, trait_change_notify = False) self.polydata.points = self.points self.polydata.modified() self.normals.update() self.render() def render(self): v = self.viewer if v is not None: v.scene.render() class Helix(HasTraits): """Helix class creates Helix/Spring from tvtk polydata, follows the usual VTK pipeline and creates an Helix actor, which is passed to the show_actor() function as an argument. """ ##################################################################### # Traits definitions coils = Int(5) points = Array('d', shape = (None, 3)) radius = Range(0.01, 1e299, value = 0.2, desc = 'the helix radius') length = Range(0.01, 1e299, value = 1.0, desc = 'the helix length') pos = Array(value = (0.0, 0.0, 0.0), desc = 'the helix position') axis = Array(value = (1.0, 0.0, 0.0), desc = 'the helix axis') color = vtk_color_trait((1.0, 1.0, 1.0)) x = Range(-1e299, 1e299, 0.0, desc = 'the X coordinate of helix center') y = Range(-1e299, 1e299, 0.0, desc = 'the Y coordinate of helix center') z = Range(-1e299, 1e299, 0.0, desc = 'the Z coordinate of helix center') representation = Enum('s', 'w', 'p') thickness = Range(0, 1e299, value = 0.01, desc = 'the helix thickness') visibility = Bool(True) viewer = Any polydata = Instance(tvtk.PolyData, ()) property = Instance(tvtk.Property) tube = Instance(tvtk.TubeFilter, ()) actor = Instance(tvtk.Actor, ()) # tvtk Actor, for the usual pipeline architecture. normals = Instance(tvtk.PolyDataNormals(), ()) ###################################################################### # User interface view traits_view = View(Group(Item(name = 'radius'), Item(name = 'length'), Item(name = 'thickness'), Item(name = 'x', label = 'Pos X'), Item(name = 'y', label = 'Pos Y'), Item(name = 'z', label = 'Pos Z'), Item(name = 'color'), Item(name = 'visibility'), Item(name = 'representation'), label = 'Helix Properties', show_border = True), buttons=['OK']) def __init__(self, **traits): self.property = self.actor.property self.normals = tvtk.PolyDataNormals() configure_input(self.normals, self.polydata) configure_input(self.tube, self.normals) self.tube.number_of_sides = 4 self.tube.capping = 1 m = tvtk.PolyDataMapper() configure_input(m, self.tube) self.actor.mapper = m self.property = self.actor.property self.property.representation = self.representation show_actor(self.actor) self.viewer = get_viewer() self.property.on_trait_change(self.viewer.scene.render) self.actor.on_trait_change(self.viewer.scene.render) self.tube.on_trait_change(self.viewer.scene.render) HasTraits.__init__(self, **traits) self._create_points() self._pos_changed(numpy.array([0.0, 0.0, 0.0]), self.pos) self._x_changed(self.x) self._y_changed(self.y) self._z_changed(self.z) self._color_changed(self.color) self._visibility_changed(self.visibility) self._thickness_changed(self.thickness) self._axis_changed(numpy.array((1.0, 0.0, 0.0)), self.axis) ###################################################################### # Non-public methods, Event handlers def _create_points(self): h = self.length/(self.coils*10) cons = self.length/(self.coils*10) j = 0 self.points.resize(self.coils*10, 3) for i in range(0,self.coils*360,36): theta = i*pi/180 self.points[j][0] = h self.points[j][1] = self.radius*sin(theta) self.points[j][2] = self.radius*cos(theta) j = j+1 h = h + cons np = len(self.points) - 1 lines = numpy.zeros((np, 2), 'l') lines[:,0] = numpy.arange(0, np-0.5, 1, 'l') lines[:,1] = numpy.arange(1, np+0.5, 1, 'l') self.polydata.points = self.points self.polydata.lines = lines self.normals.update() self.tube.update() def _color_changed(self, value): self.actor.property.color = value def _radius_changed(self, old, new): self._create_points() self._pos_changed(numpy.array([0.0, 0.0, 0.0]), self.pos) self.change_axis(numpy.array((1.0, 0.0, 0.0)), self.axis) self.polydata.points = self.points self.polydata.modified() self.normals.update() self.tube.update() self.render() def _coils_changed(self, old, new): p = numpy.arange(self.coils*10*3, dtype = float) p = p.reshape(self.coils*10,3) h = self.length/(self.coils*10) cons = self.length/(self.coils*10) j = 0 for i in range(0,self.coils*360,36): theta = i*pi/180 p[j][0] = h p[j][1] = self.radius*sin(theta) p[j][2] = self.radius*cos(theta) j = j+1 h = h + cons np = len(p) - 1 lines = numpy.zeros((np, 2), 'l') lines[:,0] = numpy.arange(0, np-0.5, 1, 'l') lines[:,1] = numpy.arange(1, np+0.5, 1, 'l') self.polydata.points = p self.polydata.lines = lines self.points = p self._pos_changed(numpy.array([0.0, 0.0, 0.0]), self.pos) self.change_axis(numpy.array((1.0, 0.0, 0.0)), self.axis) self.polydata.modified() self.normals.update() self.tube.update() self.render() def _x_changed(self, value): self.x = value self.pos = (self.x, self.pos[1],self.pos[2]) def _y_changed(self, value): self.y = value self.pos = (self.pos[0], self.y, self.pos[2]) def _z_changed(self, value): self.z = value self.pos = (self.pos[0], self.pos[1], self.z) def _representation_changed(self, value): self.property.representation = self.representation self.property.modified() self.render() def _pos_changed(self, old, new): self.set(x = new[0], trait_change_notify = False) self.set(y = new[1], trait_change_notify = False) self.set(z = new[2], trait_change_notify = False) self.points = translate(old, new, self.points) #self.polydata.points = self.points self.polydata.modified() self.normals.update() self.tube.update() self.render() def _axis_changed(self, old, new): self.points = axis_changed(old, new, self.pos, self.points) #self.polydata.points = self.points self.polydata.modified() self.normals.update() self.tube.update() self.render() def change_axis(self, old, new): self.points = axis_changed(old, new, self.pos, self.points) self.polydata.points = self.points def _length_changed(self, old, new): self._create_points() v = self.viewer if v: v.scene.disable_render = True self._pos_changed(numpy.array([0.0, 0.0, 0.0]), self.pos) self.change_axis(numpy.array((1.0, 0.0, 0.0)), self.axis) if v: v.scene.disable_render = False self.polydata.points = self.points self.polydata.modified() self.normals.update() self.tube.update() self.render() def _visibility_changed(self, value): val = int(value) if (val == 1): self.actor.visibility = 1 else: self.actor.visibility = 0 def _thickness_changed(self, value): self.tube.radius = value ###################################################################### # Object's public methods def rotate(self, angle, axis, origin = numpy.array([0.0, 0.0, 0.0])): """Function takes atleast 2 arguments: axis about which to rotate the actor and angle with which to rotate the actor, the 3rd agrument is origin i.e. the point about which to rotate the actor, by default it is set to the global origin""" p, pi, ax = rotate(axis, angle, origin, self.pos, self.points, self.axis) self.set(pos = p, trait_change_notify = False) self.points = pi self.set(axis = ax, trait_change_notify = False) self.polydata.points = self.points self.polydata.modified() self.normals.update() self.tube.update() self.render() def render(self): v = self.viewer if v is not None: v.scene.render() class Ellipsoid(HasTraits): """Ellipsoid class creates Ellipsoid from tvtk SphereSource by suitably scaling it, follows the usual VTK pipeline and creates a Ellipsoid actor, which is passed to the show_actor() function as an argument. """ ##################################################################### # Traits definitions radius = Range(0.0, 1e299, value = 0.5, desc = 'Undistorted ellipsoid radius') pos = Array(value = (0.0, 0.0, 0.0), desc = 'Ellipsoid pos') color = vtk_color_trait((1.0, 1.0, 1.0)) axis = Array(value = (1.0, 0.0, 0.0), desc= 'Ellipsoid axis') size = Array(value = (1.0, 0.5, 1.0), desc= 'Ellipsoid size_factor') length = Range(0.0, 1e299, 1.0, desc = 'Scaling factor in X direction') height = Range(0.0, 1e299, 0.5, desc = 'Sscaling factor in Y direction') width = Range(0.0, 1e299, 1.0, desc = 'Scaling factor in Z direction') x = Range(-1e299, 1e299, 0.0, desc = 'X coordinate of ellipsoid center') y = Range(-1e299, 1e299, 0.0, desc = 'Y coordinate of ellipsoid center') z = Range(-1e299, 1e299, 0.0, desc = 'Z coordinate of ellipsoid center') representation = Enum('s', 'w', 'p') visibility = Bool(True) viewer = Any polydata = Instance(tvtk.PolyData, ()) property = Instance(tvtk.Property) actor = Instance(tvtk.Actor, ()) # tvtk Actor, for the usual pipeline architecture. normals = Instance(tvtk.PolyDataNormals(), ()) ###################################################################### # User interface view traits_view = View(Group(Item(name = 'radius', style = 'simple'), Item(name = 'x', label = 'Pos X'), Item(name = 'y', label = 'Pos Y'), Item(name = 'z', label = 'Pos Z'), Item(name = 'length', label = 'Length'), Item(name = 'height', label = 'Height'), Item(name = 'width', label = 'Width'), Item(name = 'color'), Item(name = 'visibility'), Item(name = 'representation'), label = 'Ellipsoid Properties', show_border = True), buttons=['OK']) def __init__(self, **traits): self.property = self.actor.property self.normals = tvtk.PolyDataNormals() configure_input(self.normals, self.polydata) m = tvtk.PolyDataMapper() configure_input(m, self.normals) self.actor.mapper = m self.property = self.actor.property self.property.representation = self.representation HasTraits.__init__(self, **traits) self._create_points(self.radius, self.pos) self._color_changed(self.color) self._visibility_changed(self.visibility) self._x_changed(self.x) self._y_changed(self.y) self._z_changed(self.z) self._axis_changed(numpy.array((1.0, 0.0, 0.0)), self.axis) show_actor(self.actor) # passing the actors function for rendering self.viewer = get_viewer() # getting the ivtk viewer self.property.on_trait_change(self.viewer.scene.render) self.actor.on_trait_change(self.viewer.scene.render) ###################################################################### # Non-public methods, Event handlers def _create_points(self, r, c): sp = tvtk.SphereSource(radius=r, center=tuple(c), phi_resolution=20, theta_resolution=20) sp.update() ps = sp.output points = ps.points.to_array() points = scale(self.size, points, self.pos) self.points = points self.polydata.points = self.points self.polydata.polys = ps.polys return points, ps.polys def _radius_changed(self, value): points, polys = self._create_points(self.radius, self.pos) self.polydata.points = points self.polydata.modified() self.normals.update() self.render() def _size_changed(self, value): points, polys = self._create_points(self.radius, self.pos) self.set(length=value[0], height=value[1], width=value[2], trait_change_notify=False) self.polydata.points = points self.polydata.modified() self.normals.update() self.render() def _color_changed(self, value): self.actor.property.color = value def _pos_changed(self, old, new): self.set(x = new[0], trait_change_notify = False) self.set(y = new[1], trait_change_notify = False) self.set(z = new[2], trait_change_notify = False) points, lines = self._create_points(self.radius, self.pos) self.polydata.points = points self.polydata.modified() self.normals.update() self.render() def _axis_changed(self, old, new): points = axis_changed(old, new, self.pos, self.points) self.points = points self.polydata.points = self.points self.polydata.modified() self.normals.update() self.render() def _x_changed(self, value): self.x = value self.pos = (self.x, self.pos[1],self.pos[2]) def _y_changed(self, value): self.y = value self.pos = (self.pos[0], self.y, self.pos[2]) def _z_changed(self, value): self.z = value self.pos = (self.pos[0], self.pos[1], self.z) def _representation_changed(self, value): self.property.representation = self.representation self.property.modified() self.render() def _length_changed(self, value): self.x_scale = value self.size = (self.length, self.size[1], self.size[2]) def _height_changed(self, value): self.y_scale = value self.size = (self.size[0], self.height, self.size[2]) def _width_changed(self, value): self.z_scale = value self.size = (self.size[0], self.size[1], self.width) def _visibility_changed(self, value): val = int(value) if (val == 1): self.actor.visibility = 1 else: self.actor.visibility = 0 ###################################################################### # Object's public methods def render(self): v = self.viewer if v is not None: v.scene.render() def rotate(self, angle, axis, origin = numpy.array([0.0, 0.0, 0.0])): """Function takes atleast 2 arguments: axis about which to rotate the actor and angle with which to rotate the actor, the 3rd agrument is origin i.e. the point about which to rotate the actor, by default it is set to the global origin""" p, pi, ax = rotate(axis, angle, origin, self.pos, self.points, self.axis) self.set(pos = p, trait_change_notify = False) self.points = pi self.set(axis = ax, trait_change_notify = False) self.polydata.points = self.points self.polydata.modified() self.render() ########################################################### ################### Compatibility layer ################### ########################################################### sphere = Sphere vector = MVector frame = Frame curve = Curve ring = Ring cone = Cone cylinder = Cylinder box = Box arrow = Arrow helix = Helix ellipsoid = Ellipsoid mag = numpy.linalg.norm def rate(arg): msg = """Do not use rate, instead use the iterate() function. Iterate should be called with a callback. This callback will be periodically called via a timer. This will make your script's UI completely interactive. """ print('*'*80) print(msg) print('*'*80) ############################################################ # Some examples. def test_remove_actors(): """Test fuction for testing integrity of remove function for actors""" s = sphere(radius = 1.5, pos = (0, 0, 0), color = (1, 0, 0)) b = box(center = (1, 0, 0), size = (2, 1, 1), color = (0.5, 0.5, 1.0)) co = cone(resolution = 100, pos = (2, 0, 0), color = (0, 1, 0)) cy = cylinder(resolution = 100, pos = (3, 0, 0), color = (0, 0, 1)) time.sleep(3) print("Removed sphere from scene") remove_actor(s) time.sleep(3) print("Removed cone from cone") remove_actor(co) def test_frame(): c1 = cone(pos = (3.0, 0.0, 0.0)) r1 = ring() f = frame(r1,c1) f.edit_traits() return f def rotate_frame(): """Test fuction for testing integrity of rotation function of frame""" r1 = ring(pos = (1,0,0)) h1 = helix(pos = (1,0,0)) f = frame(r1,h1) f.pos = (2,0,0) f.axis = (1,1,1) j = 1 def anim(): f.rotate(j, [0.0, 1.0, 0.0]) ti = iterate(200, anim) ti.edit_traits() return ti def test_rotate(): """Test fuction for testing integrity of rotation function of actors""" r = ring() r.pos = (3,0,0) r2 = ring(pos = (3,0,0)) points1 = r2.points r.rotate(90, [0,1,0], [1,0,0]) r.rotate(-90, [0,1,0], [1,0,0]) points2 = r.points if (numpy.allclose(points1, points2)): print("All clear") else: print("Test failed") return r def test_translate(): """This is a basic examples function demonstrating the creating simple animation from visual actors. Note the show function has to be called in stand alone programs.""" b = box() xlen = 10 s = sphere(pos = (xlen, 0, 0)) s.velocity = (-1,0,0) def anim(): x = s.x if (x < 1): s.velocity = (1, 0, 0) elif (x > xlen): s.velocity = (-1, 0, 0) s.x = x + s.velocity[0] ti = iterate(50, anim) ti.edit_traits() def test_bounce(): """This is a basic example function, extending the previous example.""" xlen = 10 b1 = box(size = (1, 4, 4), color = (0,1,0)) b2 = box(size = (1, 4, 4), color = (0,1,0), pos = (xlen, 0, 0)) s = sphere(radius = 0.5, pos = (xlen, 0, 0), color = (1, 0, 0)) s.velocity = (-1, 0, 0) def anim(): x = s.x if (x == 1): s.velocity = (1, 0, 0) elif (x == (xlen-1)): s.velocity = (-1, 0, 0) s.x = x + s.velocity[0] t = iterate(60, anim) t.edit_traits() return t mayavi-4.5.0/tvtk/tvtk_access.py0000644000076500000240000000442212747716314017303 0ustar prabhustaff00000000000000"""Creates a pseudo-package called `tvtk` that lets one use the tvtk classes in a clean and quick manner. The `TVTK` class is instantiated and this instance serves as the `tvtk` 'module'. For more details on this see the devel.txt in the TVTK documentation directory. """ # Author: Prabhu Ramachandran # Copyright (c) 2007-2015, Enthought, Inc. # License: BSD Style. from __future__ import print_function from os.path import exists, join, dirname, isdir # The tvtk wrapper code is all typically inside one zip file. We try to # find this file and then create the 'tvtk' module wrapper from that. If # the ZIP file is extracted into a tvtk_classes directory the ZIP file is # not used and the tvtk_classes directory is inserted into sys.path and # the directory contents are used for the tvtk classes -- note that you # must have the following structure # tvtk_classes/tvtk_classes/__init__.py. This is handy for tools like # pydev (Eclipse). If neither the tvtk_classes directory or the zip file # is found an error is raised. _zip = join(dirname(__file__), 'tvtk_classes.zip') tvtk_class_dir = join(dirname(__file__), 'tvtk_classes') if not ( exists(tvtk_class_dir) and isdir(tvtk_class_dir) or exists(_zip)): raise ImportError("TVTK not built properly. " "Unable to find either a directory: %s or a file: %s " "with the TVTK classes." % (tvtk_class_dir, _zip) ) # Check if the VTK version is the same as that used to build TVTK. from tvtk.tvtk_classes.vtk_version import vtk_build_version # Make sure VTK is installed. try: import vtk except ImportError as m: msg = '%s\n%s\nDo you have vtk installed properly?\n' \ 'VTK (and build instructions) can be obtained from http://www.vtk.org\n' \ % (m, '_'*80) raise ImportError(msg) vtk_version = vtk.vtkVersion().GetVTKVersion()[:3] if vtk_version != vtk_build_version: msg = '*'*80 + "\n" + \ 'WARNING: Imported VTK version (%s) does not match the one used\n'\ ' to build the TVTK classes (%s). This may cause problems.\n'\ ' Please rebuild TVTK.\n'%(vtk_version, vtk_build_version) +\ '*'*80 + '\n' print(msg) # Now setup TVTK itself. from tvtk.tvtk_classes import tvtk_helper tvtk = tvtk_helper.TVTK() mayavi-4.5.0/tvtk/tvtk_base.py0000644000076500000240000004636212747716314016765 0ustar prabhustaff00000000000000"""Commonly used code by tvtk objects. """ # Author: Prabhu Ramachandran # Copyright (c) 2004-2015, Enthought, Inc. # License: BSD Style. from __future__ import print_function import sys import weakref import os import logging import vtk from traits import api as traits from . import messenger # Setup a logger for this module. logger = logging.getLogger(__name__) def BooleanEditor(*args, **kw): from traitsui.api import BooleanEditor as Editor return Editor(*args, **kw) def RGBColorEditor(*args, **kw): from traitsui.api import RGBColorEditor as Editor return Editor(*args, **kw) def FileEditor(*args, **kw): from traitsui.api import FileEditor as Editor return Editor(*args, **kw) ###################################################################### # The TVTK object cache. ###################################################################### class TVTKObjectCache(weakref.WeakValueDictionary): def __init__(self, *args, **kw): self._observer_data = {} weakref.WeakValueDictionary.__init__(self, *args, **kw) def remove(wr, selfref=weakref.ref(self)): self = selfref() if self is not None: self.teardown_observers(wr.key) del self.data[wr.key] self._remove = remove def setup_observers(self, vtk_obj, event, method): """Setup the observer for the VTK object's event. Parameters ---------- vtk_obj -- The VTK object for which the `event` is observed. event -- The VTK event to watch. method -- The method to be called back when `event` is fired on the VTK object. """ # Setup the observer so the traits are updated even if the # wrapped VTK object changes. if hasattr(vtk_obj, 'AddObserver'): # Some classes like vtkInformation* derive from # tvtk.ObjectBase which don't support Add/RemoveObserver. messenger.connect(vtk_obj, event, method) ob_id = vtk_obj.AddObserver(event, messenger.send) key = vtk_obj.__this__ od = self._observer_data if key in od: od[key].append((vtk_obj, ob_id)) else: od[key] = [(vtk_obj, ob_id)] def teardown_observers(self, key): """Given the key of the VTK object (vtk_obj.__this__), this removes the observer for the ModifiedEvent and also disconnects the messenger. """ od = self._observer_data if key not in od: return for vtk_obj, ob_id in od[key]: try: # The disconnection sometimes fails at exit. vtk_obj.RemoveObserver(ob_id) except AttributeError: pass try: messenger.disconnect(vtk_obj) except AttributeError: pass del od[key] # The TVTK object cache (`_object_cache`). This caches all the TVTK # instances using weakrefs. When a VTK object is wrapped via the # `wrap_vtk` function this cache is checked. The key is the VTK # object's address. The value of the dict is the TVTK wrapper object. # If the VTK object address exists in the cache, it is returned by # `wrap_vtk`. `wrap_vtk` is defined in `tvtk_helper.py` which is # stored in the ZIP file. _dummy = None # This makes the cache work even when the module is reloaded. for name in ['tvtk_base', 'tvtk.tvtk_base']: if name in sys.modules: mod = sys.modules[name] if hasattr(mod, '_object_cache'): _dummy = mod._object_cache del mod break if _dummy is not None: _object_cache = _dummy else: _object_cache = TVTKObjectCache() del _dummy def get_tvtk_object_from_cache(vtk_obj): """Returns the cached TVTK object given a VTK object.""" return _object_cache.get(vtk_obj.__this__) ###################################################################### # Special traits used by the tvtk objects. ###################################################################### true_bool_trait = traits.Trait('true', {'true': 1, 't': 1, 'yes': 1, 'y': 1, 'on': 1, 1: 1, 'false': 0, 'f': 0, 'no': 0, 'n': 0, 'off': 0, 0: 0, -1:0}, editor=BooleanEditor) false_bool_trait = traits.Trait('false', true_bool_trait) class TraitRevPrefixMap(traits.TraitPrefixMap): """A reverse mapped TraitPrefixMap. This handler allows for something like the following:: >>> class A(HasTraits): ... a = Trait('ab', TraitRevPrefixMap({'ab':1, 'cd':2})) ... >>> a = A() >>> a.a = 'c' >>> print a.a 'cd' >>> a.a = 1 >>> print a.a 'ab' That is, you can set the trait to the value itself. If multiple keys map to the same value, one of the valid keys will be used. """ def __init__(self, map): traits.TraitPrefixMap.__init__(self, map) self._rmap = {} for key, value in map.items(): self._rmap[value] = key def validate(self, object, name, value): try: if value in self._rmap: value = self._rmap[value] if not value in self._map: match = None n = len( value ) for key in self.map.keys(): if value == key[:n]: if match is not None: match = None break match = key if match is None: self.error( object, name, value ) self._map[ value ] = match return self._map[ value ] except: self.error( object, name, value ) def info(self): keys = [repr(x) for x in self._rmap.keys()] keys.sort() msg = ' or '.join(keys) return traits.TraitPrefixMap.info(self) + ' or ' + msg def vtk_color_trait(default, **metadata): Range = traits.Range if default[0] == -1.0: # Occurs for the vtkTextProperty's color trait. Need to work # around. return traits.Trait(default, traits.Tuple(Range(0.0, 1.0), Range(0.0, 1.0), Range(0.0, 1.0), editor=RGBColorEditor), **metadata) elif type(default[0]) is float: return traits.Trait(traits.Tuple(Range(0.0, 1.0, default[0]), Range(0.0, 1.0, default[1]), Range(0.0, 1.0, default[2])), editor=RGBColorEditor, **metadata) else: return traits.Trait( traits.Tuple( Range(0, 255, default[0]), Range(0, 255, default[1]), Range(0, 255, default[2]), cols=3 ), **metadata ) # Special cases for the FileName and FilePrefix vtk_file_name = traits.Trait(None, None, traits.Str, str, editor=FileEditor) vtk_file_prefix = traits.Trait(None, None, traits.Str, str, editor=(FileEditor, {'truncate_ext': True})) # The Property class traits are delegated in the Actors. vtk_property_delegate = traits.Delegate('property', modify=True) ###################################################################### # Utility functions. ###################################################################### def deref_vtk(obj): """Dereferences the VTK object from the object if possible.""" if isinstance(obj, TVTKBase): return obj._vtk_obj else: return obj ###################################################################### # 'TVTKBase' class (base class for all tvtk classes): ###################################################################### class TVTKBase(traits.HasStrictTraits): """The base class for all TVTK objects. This class encapsulates key functionality common to all the TVTK classes. TVTK classes provide a trait wrapped VTK object. They also primitively picklable. Only the basic state of the object itself is pickled. References to other VTK objects are NOT pickled. """ # This is just a dummy integer (MUST be > 1) that indicates that # we are updating the traits and there is no need to change the # underlying VTK object. DOING_UPDATE = 10 ######################################## # Private traits. # This trait is only used internally and should not activate any # notifications when set which is why we use `Python`. _in_set = traits.Python # The wrapped VTK object. _vtk_obj = traits.Trait(None, None, vtk.vtkObjectBase()) # Stores the names of the traits whose VTK Get methods may return # invalid values (e.g. reference to a point) or uninitialised values # We would try to update but allow it to fail _allow_update_failure_ = traits.Tuple # Stores the names of the traits that need to be updated. _updateable_traits_ = traits.Tuple # List of trait names that are to be included in the full traits view of this object. _full_traitnames_list_ = traits.List ################################################################# # `object` interface. ################################################################# def __init__(self, klass, obj=None, update=True, **traits): """Object initialization. Parameters ---------- - klass: `vtkObjectBase` A VTK class to wrap. If `obj` is passed, its class must be the same as `klass` or a subclass of it. - obj: `vtkObjectBase` (default: None) An optional VTK object. If passed the passed object is wrapped. This defaults to `None` where a new VTK instance of class, `klass` is created. - update: `bool` (default: True) If True (default), the traits of the class are automatically updated based on the state of the wrapped VTK object. If False, no updation is performed. This is particularly useful when the object is being unpickled. - traits: `dict` A dictionary having the names of the traits as its keys. This allows a user to set the traits of the object while creating the object. """ # Initialize the Python attribute. self._in_set = 0 if obj: assert obj.IsA(klass.__name__) self._vtk_obj = obj else: self._vtk_obj = klass() # print "INIT", self.__class__.__name__, repr(self._vtk_obj) # Call the Super class to update the traits. # Inhibit any updates at this point since we update in the end # anyway. self._in_set = 1 super(TVTKBase, self).__init__(**traits) self._in_set = 0 # Update the traits based on the values of the VTK object. if update: self.update_traits() # Setup observers for the modified event. self.setup_observers() _object_cache[self._vtk_obj.__this__] = self def __getinitargs__(self): """This is merely a placeholder so that subclasses can override this if needed. This is called by `__setstate__` because `traits.HasTrait` is a newstyle class. """ # You usually don't want to call update when calling __init__ # from __setstate__ return (None, 0) def __getstate__(self): """Support for primitive pickling. Only the basic state is pickled. """ self.update_traits() d = self.__dict__.copy() for i in ['_vtk_obj', '_in_set', 'reference_count', 'global_warning_display', '__sync_trait__']: d.pop(i, None) return d def __setstate__(self, dict): """Support for primitive pickling. Only the basic state is pickled. """ # This is a newstyle class so we need to call init here. if self._vtk_obj is None: self.__init__(*self.__getinitargs__()) self._in_set = 1 for i in dict: # Not enough to update the dict because the vtk object # needs to be updated. try: setattr(self, i, dict[i]) except traits.TraitError as msg: print("WARNING:", end=' ') print(msg) self._in_set = 0 def __str__(self): """Return a nice string representation of the object. This merely returns the result of str on the underlying VTK object. """ return str(self._vtk_obj) ################################################################# # `HasTraits` interface. ################################################################# def class_trait_view_elements ( cls ): """ Returns the ViewElements object associated with the class. The returned object can be used to access all the view elements associated with the class. Overridden here to search through a particular directory for substitute views to use for this tvtk object. The view should be declared in a file named _view. We execute this file and replace any currently defined view elements with view elements declared in this file (that have the same name). """ # FIXME: This can be enhanced to search for new views also (in addition # to replacing current views). view_elements = super(TVTKBase, cls).class_trait_view_elements() # Get the names of all the currently defined view elements. names = view_elements.filter_by() baseDir = os.path.dirname(os.path.abspath(__file__)) viewDir = os.path.join(baseDir, 'view') try: module_name = cls.__module__.split('.')[-1] view_filename = os.path.join(viewDir, module_name + '_view.py') result = {} exec( compile( open(view_filename).read(), view_filename, 'exec' ), {}, result ) for name in names: if name in result: view_elements.content[ name ] = result[name] except Exception: pass return view_elements class_trait_view_elements = classmethod( class_trait_view_elements ) ################################################################# # `TVTKBase` interface. ################################################################# def setup_observers(self): """Add an observer for the ModifiedEvent so the traits are kept up-to-date with the wrapped VTK object and do it in a way that avoids reference cycles.""" _object_cache.setup_observers(self._vtk_obj, 'ModifiedEvent', self.update_traits) def teardown_observers(self): """Remove the observer for the Modified event.""" _object_cache.teardown_observers(self._vtk_obj.__this__) def update_traits(self, obj=None, event=None): """Updates all the 'updateable' traits of the object. The method works by getting the current value from the wrapped VTK object. `self._updateable_traits_` stores a tuple of tuples containing the trait name followed by the name of the get method to use on the wrapped VTK object. The `obj` and `event` parameters may be ignored and are not used in the function. They exist only for compatibility with the VTK observer callback functions. """ if self._in_set: return if not hasattr(self, '_updateable_traits_'): return self._in_set = self.DOING_UPDATE vtk_obj = self._vtk_obj # Save the warning state and turn it off! warn = vtk.vtkObject.GetGlobalWarningDisplay() vtk.vtkObject.GlobalWarningDisplayOff() for name, getter in self._updateable_traits_: if name == 'global_warning_display': setattr(self, name, warn) continue try: val = getattr(vtk_obj, getter)() except (AttributeError, TypeError): # Some vtk GetMethod accepts more than 1 arguments # FIXME: If we really want to try harder, we could # pass an empty array to the Get method, some Get # method will populate the array as the return # value (e.g. vtkImageConvolve.GetKernel3x3 and alike) pass else: try: setattr(self, name, val) except traits.TraitError: if name in self._allow_update_failure_: pass else: raise # Reset the warning state. vtk.vtkObject.SetGlobalWarningDisplay(warn) self._in_set = 0 ################################################################# # Non-public interface. ################################################################# def _do_change(self, method, val, force_update=False): """This is called by the various traits when they change in order to update the underlying VTK object. Parameters ---------- - method: `method` The method to invoke on the VTK object when called. - val: `Any` Argument to the method. - force_update: `bool` (default: False) If True, `update_traits` is always called at the end. """ if self._in_set == self.DOING_UPDATE: return vtk_obj = self._vtk_obj self._in_set += 1 mtime = self._wrapped_mtime(vtk_obj) + 1 try: method(val) except TypeError: if hasattr(val, '__len__'): method(*val) else: raise self._in_set -= 1 if force_update or self._wrapped_mtime(vtk_obj) > mtime: self.update_traits() def _wrap_call(self, vtk_method, *args): """This method allows us to safely call a VTK method without calling `update_traits` during the call. This method is therefore used to wrap any 'Set' call on a VTK object. The method returns the output of the vtk_method call. Parameters ---------- - vtk_method: `method` The method to invoke safely. - args: `Any` Argument to be passed to the method. """ vtk_obj = self._vtk_obj self._in_set += 1 mtime = self._wrapped_mtime(vtk_obj) + 1 ret = vtk_method(*args) self._in_set -= 1 if self._wrapped_mtime(vtk_obj) > mtime: self.update_traits() return ret def _wrapped_mtime(self, vtk_obj): """A simple wrapper for the mtime so tvtk can be used for `vtk.vtkObjectBase` subclasses that neither have an `AddObserver` or a `GetMTime` method. """ try: return vtk_obj.GetMTime() except AttributeError: return 0 mayavi-4.5.0/tvtk/tvtk_base_handler.py0000644000076500000240000000510012747716314020443 0ustar prabhustaff00000000000000""" Handler and UI elements for tvtk objects. """ # Author: Vibha Srinivasan # Copyright (c) 2008-2016, Enthought, Inc. # License: BSD Style. from traits.api import HasTraits, Str, Instance, Property, Button, List, Enum from traitsui.handler import Handler from traitsui.ui_info import UIInfo from traitsui.item import Item from traitsui.view import View from traits.trait_base import user_name_for, xgetattr def TableEditor(*args, **kw): from .value_column import ObjectColumn, ValueColumn from traitsui.api import TableEditor as _E return _E(columns=[ObjectColumn(name='name'), ValueColumn(name='value')]) class TraitsViewObject(HasTraits): """ Wrapper for all items to be included in the full traits view of the TVTKBase object. """ # Trait name (name of the trait that is to be included in the view). name = Str # The TVTKBase object for which we are building a view. parent = Instance(HasTraits) class TVTKBaseHandler(Handler): """ A handler for the TVTKBase object. """ # A reference to the UIInfo object. info = Instance(UIInfo) # Type of view (of info.object) to display. view_type = Enum(['Basic', 'Advanced']) # The view for the object (that is, info.object) view = Property(depends_on='view_type') # List of TraitsViewObject items, where each item contains information # about the trait to display as a row in a table editor. _full_traits_list = Property(List, editor=TableEditor) def init_info(self, info): """ Informs the handler what the UIInfo object for a View will be. Overridden here to save a reference to the info object. """ self.info = info return def _get__full_traits_list(self): """ Returns a list of objects to be included in the table editor for the full traits view. """ return [TraitsViewObject(name=name, parent = self.info.object) for name in self.info.object._full_traitnames_list_] def _get_view(self): """ Returns the view (for info.object) to be displayed in the InstanceEditor. """ if self.view_type == "Basic": view = self.info.object.trait_view('view') else: view = self.info.object.trait_view('full_traits_view') # This method is called when the default traits view for the object is # displayed. The default traits view already has a title, so do not # display a title for the contained view. view.title = '' return view #### EOF ################################################################### mayavi-4.5.0/tvtk/util/0000755000076500000240000000000012747722127015372 5ustar prabhustaff00000000000000mayavi-4.5.0/tvtk/util/__init__.py0000644000076500000240000000013212747716314017500 0ustar prabhustaff00000000000000# Author: Prabhu Ramachandran # Copyright (c) 2006, Enthought, Inc. # License: BSD Style. mayavi-4.5.0/tvtk/util/ctf.py0000644000076500000240000002321612747716314016525 0ustar prabhustaff00000000000000"""Color transfer function related code. """ # Author: Prabhu Ramachandran # Copyright (c) 2006-2015, Enthought, Inc. # License: BSD Style. # Enthought library imports. from traits.api import List from tvtk.api import tvtk ########################################################################## # Color transfer function related utility code from MayaVi1. ########################################################################## def _err_msg(obj, cls_name): return '%s %s does not have either a "nodes" attribute or a '\ '"get_node_value" method'%(cls_name, str(obj)) def save_ctfs(volume_property): """Given a `tvtk.VolumeProperty` it saves the state of the RGB and opacity CTF to a dictionary and returns that. The 'rgb' key stores a list of (x, r, g, b) and the 'alpha' a list of (x, a) values. """ vp = volume_property ctf = vp.rgb_transfer_function otf = vp.get_scalar_opacity() s1, s2 = ctf.range # The RGB values. nc = ctf.size rgb = [] if hasattr(ctf, 'nodes'): for i in range(nc): x = ctf.nodes[i] r, g, b = ctf.get_color(x) rgb.append([x, r, g, b]) elif hasattr(ctf, 'get_node_value'): val = [0]*6 for i in range(nc): ctf.get_node_value(i, val) rgb.append(val[:4]) else: raise TypeError(_err_msg(ctf, 'ColorTransferFunction')) # The Alpha values. na = otf.size a = [] if hasattr(otf, 'nodes'): for i in range(na): x = otf.nodes[i] val = otf.get_value(x) a.append([x, val]) elif hasattr(otf, 'get_node_value'): val = [0]*4 for i in range(na): otf.get_node_value(i, val) a.append(val[:2]) else: raise TypeError(_err_msg(otf, 'PiecewiseFunction')) return {'range': (s1, s2), 'rgb':rgb, 'alpha':a} def load_ctfs(saved_data, volume_property): """ Given the saved data produced via `save_ctfs`, this sets the state of the passed volume_property appropriately. It returns the new color transfer function and piecewise function. """ rgb = saved_data['rgb'] a = saved_data['alpha'] # The new_ctf/otf shenanigans are necessary because if the ctf/otf # go out of scope we loose the node information. This is because # the tvtk object is really a dynamically generated wrapper. # First do the RGB values ... new_ctf = True ctf = volume_property.rgb_transfer_function if isinstance(ctf, ColorTransferFunction): new_ctf = False ctf.remove_all_points() else: ctf = ColorTransferFunction() nc = len(rgb) for i in range(nc): ctf.add_rgb_point(rgb[i][0], *(rgb[i][1:])) if new_ctf: volume_property.set_color(ctf) try: ctf.range = saved_data['range'] except Exception: # VTK versions < 5.2 don't seem to need this. pass # and then the alpha values. na = len(a) new_otf = True otf = volume_property.get_scalar_opacity() if isinstance(otf, PiecewiseFunction): new_otf = False otf.remove_all_points() else: otf = PiecewiseFunction() for i in range(na): otf.add_point(a[i][0], a[i][1]) if new_otf: volume_property.set_scalar_opacity(otf) return ctf, otf def rescale_ctfs(volume_property, new_range): """ Given the volume_property with a new_range for the data while using the same transfer functions, this function rescales the CTF's so that everything works OK. It returns the CTF and OTF. """ ctf = volume_property.rgb_transfer_function otf = volume_property.get_scalar_opacity() old_range = ctf.range def _rescale_value(x, old, new): nx = (x - old[0])/(old[1] - old[0]) return new[0] + nx*(new[1] - new[0]) if new_range[0] != old_range[0] and new_range[1] != old_range[1]: s_d = save_ctfs(volume_property) # Set the new range making sure that they are in the right order. s1, s2 = new_range if s1 > s2: s_d['range'] = (s2, s1) else: s_d['range'] = (s1, s2) # Rescale the RGB values. rgb = s_d['rgb'] for v in rgb: v[0] = _rescale_value(v[0], old_range, new_range) # Rescale the alpha values. alpha = s_d['alpha'] for v in alpha: v[0] = _rescale_value(v[0], old_range, new_range) # Now load the rescaled values. ctf, otf = load_ctfs(s_d, volume_property) return ctf, otf def set_lut(lut, volume_property): """Given a `tvtk.LookupTable` and a `tvtk.VolumeProperty` it saves the state of the RGB and opacity CTF from the volume property to the LUT. The number of colors to use is obtained from the LUT and not the CTF. """ vp = volume_property ctf = vp.rgb_transfer_function otf = vp.get_scalar_opacity() s1, s2 = ctf.range nc = lut.number_of_colors ds = float(s2-s1)/(nc - 1) for i in range(nc): r, g, b = ctf.get_color(s1 + i*ds) a = otf.get_value(s1 + i*ds) lut.set_table_value(i, r, g, b, a) def set_ctf_from_lut(lut, volume_property): """Given a `tvtk.LookupTable` and a `tvtk.VolumeProperty` it loads the state of the RGB and opacity CTF from the lookup table to the CTF. The CTF range is obtained from the volume property and the number of colors to use is obtained from the LUT. """ vp = volume_property ctf = vp.rgb_transfer_function s1, s2 = ctf.range nc = lut.number_of_colors ds = float(s2-s1)/(nc - 1) ctf = ColorTransferFunction() otf = PiecewiseFunction() for i in range(nc): v = s1 + i*ds r, g, b, a = lut.get_table_value(i) ctf.add_rgb_point(v, r, g, b) otf.add_point(v, a) volume_property.set_color(ctf) volume_property.set_scalar_opacity(otf) ########################################################################## # `ColorTransferFunction` class. ########################################################################## class ColorTransferFunction(tvtk.ColorTransferFunction): """Overrides a few important methods that allow us to glean node information. This is useful in cases where the super class does not have methods to get the nodes. """ # Stores the nodes used by the CTF. Note that this is not a # proper trait and modifying this will not change the underlying # VTK object. nodes = List def add_rgb_point(self, *args): """V.add_rgb_point(float, float, float, float) -> int V.add_rgb_point(float, float, float, float, float, float) -> int Add/Remove a point to/from the function defined in RGB or HSV Return the index of the point (0 based), or -1 on error. Wrapper around parent class functionality to store node information. """ ret = super(ColorTransferFunction, self).add_rgb_point(*args) self.nodes.append(args[0]) self.nodes.sort() return ret def add_hsv_point(self, *args): """V.add_hsv_point(float, float, float, float) -> int V.add_hsv_point(float, float, float, float, float, float) -> int Add/Remove a point to/from the function defined in RGB or HSV Return the index of the point (0 based), or -1 on error. Wrapper around parent class functionality to store node information. """ ret = super(ColorTransferFunction, self).add_hsv_point(*args) self.nodes.append(args[0]) self.nodes.sort() return ret def remove_all_points(self): """Remove all the points. """ super(ColorTransferFunction, self).remove_all_points() self.nodes = [] ########################################################################## # `PiecewiseFunction` class. ########################################################################## class PiecewiseFunction(tvtk.PiecewiseFunction): """Overrides a few important methods that allow us to glean node information. This is useful in cases where the super class does not have methods to get the nodes. """ # Stores the nodes used by the function. Note that this is not a # proper trait and modifying this will not change the underlying # VTK object. nodes = List def initialize(self): """V.initialize() Clears out the current function. A newly created PiecewiseFunction is alreay initialized, so there is no need to call this method which in turn simply calls remove_all_points() """ super(PiecewiseFunction, self).initialize() self.nodes = [] def add_point(self, x, val): """V.add_point(float, float) -> int V.add_point(float, float, float, float) -> int Add/Remove points to/from the function. If a duplicate point is added then the function value is changed at that location. Return the index of the point (0 based), or -1 on error. """ ret = super(PiecewiseFunction, self).add_point(x, val) self.nodes.append(x) self.nodes.sort() return ret def remove_point(self, x): """V.remove_point(float) -> int Add/Remove points to/from the function. If a duplicate point is added then the function value is changed at that location. Return the index of the point (0 based), or -1 on error. """ ret = super(PiecewiseFunction, self).remove_point(x) self.nodes.remove(x) self.nodes.sort() return ret def remove_all_points(self): """Remove all the points. """ super(PiecewiseFunction, self).remove_all_points() self.nodes = [] mayavi-4.5.0/tvtk/util/gradient_editor.py0000644000076500000240000014643512747716314021125 0ustar prabhustaff00000000000000""" The common code for a gradient editor for `tvtk.LookupTables` and `tvtk.VolumeProperty` color transfer functions. Most of the code is independent of tvtk however. The toolkit specific code is in toolkit specific files. This code is distributed under the conditions of the BSD license. This code was originally written by Gerald Knizia and later modified by Prabhu Ramachandran for tvtk and MayaVi2. Copyright (c) 2005-2013, Gerald Knizia and Prabhu Ramachandran """ from os.path import splitext from tvtk.api import tvtk ########################################################################## # Utility functions. ########################################################################## def lerp(arg0,arg1,f): """linearly interpolate between arguments arg0 and arg1. The weight f is from [0..1], with f=0 giving arg0 and f=1 giving arg1""" return (1-f)*arg0 + f*arg1 def rgba_to_hsva(r,g,b,a): """Convert color from RGBA to HSVA. input: r,g,b,a are from [0..1] output: h,s,v,a are from [0..1] (h will never be 1.0) See http://en.wikipedia.org/wiki/HSV_color_space Only difference: hue range is [0..1) here, not [0..360).""" max_comp = max((r,g,b)) min_comp = min((r,g,b)) h = 1.0/6.0 #60.0 if ( max_comp != min_comp ): if ( r >= g) and ( r >= b ): h *= 0 + (g-b)/(max_comp-min_comp) elif ( g >= b ): h *= 2 + (b-r)/(max_comp-min_comp) else: h *= 4 + (r-g)/(max_comp-min_comp) if h < 0: h += 1.0 if h > 1.0: h -= 1.0 if ( max_comp != 0 ): s = ( max_comp - min_comp )/max_comp else: s = 0 v = max_comp return (h,s,v,a) def hsva_to_rgba(h_,s,v,a): """Convert color from HSVA to RGBA. input: h,s,v,a are from [0..1] output: r,g,b,a are from [0..1] See http://en.wikipedia.org/wiki/HSV_color_space Only difference: hue range is [0..1) here, not [0..360).""" (r,g,b,a) = (v,v,v,a) h = h_ * 360.0 if ( s < 1e-4 ): return (r,g,b,a)#zero saturation -> color acromatic hue_slice_index = int(h/60.0) hue_partial = h/60.0 - hue_slice_index p = v * ( 1 - s ) q = v * ( 1 - hue_partial * s ) t = v * ( 1 - (1-hue_partial) * s ) if ( 0 == hue_slice_index ): r, g, b = v, t, p elif ( 1 == hue_slice_index ): r, g, b = q, v, p elif ( 2 == hue_slice_index ): r, g, b = p, v, t elif ( 3 == hue_slice_index ): r, g, b = p, q, v elif ( 4 == hue_slice_index ): r, g, b = t, p, v elif ( 5 == hue_slice_index ): r, g, b = v, p, q return (r,g,b,a) ########################################################################## # `Color` class. ########################################################################## class Color: """Represents a color and provides means of automatic conversion between HSV(A) and RGB(A) color spaces. The color is stored in HSVA space.""" def __init__(self): self.hsva = (0.0, 0.0, 0.5, 1.0) def set_rgb(self,r,g,b): self.set_rgba(r,g,b,1.0) def set_rgba(self,r,g,b,a): self.hsva = rgba_to_hsva(r,g,b,a) def get_rgb255(self): """returns a tuple (r,g,b) of 3 integers in range [0..255] representing the color.""" rgba = self.get_rgba() return (int(rgba[0]*255), int(rgba[1]*255), int(rgba[2]*255) ) def get_rgba(self): h,s,v,a = self.hsva return hsva_to_rgba(h,s,v,a) def get_hsva(self): return self.hsva def set_hsva(self,h,s,v,a): self.hsva = (h,s,v,a) def set_lerp(self, f,A,B): """Set self to result of linear interpolation between colors A and B in HSVA space. The weight f is from [0..1], with f=0 giving A and f=1 giving color B.""" h = lerp(A.hsva[0], B.hsva[0], f) s = lerp(A.hsva[1], B.hsva[1], f) v = lerp(A.hsva[2], B.hsva[2], f) a = lerp(A.hsva[3], B.hsva[3], f) self.hsva = (h,s,v,a) ########################################################################## # `ColorControlPoint` class. ########################################################################## class ColorControlPoint: """A control point represents a fixed position in the gradient and its assigned color. A control point can have indifferent color channels in hsv space, i.e. channels, on which its presence does not impose any effect.""" def __init__(self, active_channels, fixed=False): self.color = Color() # position in the gradient table. range: [0..1]. self.pos = 0.0 # fixed control points can not be moved to other positions. The # control points for the begin and the end of the gradient are usually # the only fixed control points. self.fixed = fixed if ( 'a' != active_channels ): self.active_channels = "rgb" self.activate_channels(active_channels) else: self.active_channels = "a" def activate_channels(self,new_channels): """NewChannels: string consisting of the new color channel names""" for c in new_channels: if ( not ( c in self.active_channels ) ): self.active_channels += c def set_pos(self,f): self.pos = max(min(f,1.0), 0.0) ########################################################################## # `GradientTableOld` class. ########################################################################## class GradientTableOld: """this class represents a logical gradient table, i.e. an array of colors and the means to control it via control points""" def __init__( self, num_entries ): self.size = num_entries self.table = [[0.0]*self.size, [0.0]*self.size, [0.0]*self.size, [0.0]*self.size] self.table_hsva = [[0.0]*self.size, [0.0]*self.size, [0.0]*self.size, [0.0]*self.size] # ^- table[channel][index]: rgba values of the colors of the table. # range: [0..1]^4. # insert the control points for the left and the right end of the # gradient. These are fixed (i.e. cannot be moved or deleted) and # allow one to set begin and end colors. left_control_point = ColorControlPoint(fixed=True, active_channels="hsva") left_control_point.set_pos(0.0) left_control_point.color.set_rgb(0.0, 0.0, 0.0) right_control_point = ColorControlPoint(fixed=True, active_channels="hsva") right_control_point.set_pos(1.0) right_control_point.color.set_rgb(1.0, 1.0, 1.0) self.control_points = [left_control_point, right_control_point] # note: The array of control points always has to be sorted by gradient # position of the control points. # insert another control point. This one has no real function, it # is just there to make the gradient editor more colorful initially # and suggest to the (first time user) that it is actually possible to # place more control points. mid_control_point = ColorControlPoint(active_channels="hsv") mid_control_point.set_pos(0.4) mid_control_point.color.set_rgb(1.0,0.4,0.0) self.insert_control_point( mid_control_point ) # it is possible to scale the output gradient using a nonlinear function # which maps [0..1] to [0..1], aviable using the "nonlin" option in the # gui. Per default, this option is disabled however. self.scaling_function_string = "" # will receive the function string if # set, e.g. "x**(4*a)" self.scaling_function_parameter = 0.5 # the parameter a, slider controlled self.scaling_function = None # the actual function object. takes one # position parameter. None if disabled. self.update() def get_color_hsva(self,idx): """return (h,s,v,a) tuple in self.table_hsva for index idx""" return (self.table_hsva[0][idx],self.table_hsva[1][idx], self.table_hsva[2][idx],self.table_hsva[3][idx]) def get_color(self,idx): """return (r,g,b,a) tuple in self.table for index idx""" return (self.table[0][idx],self.table[1][idx], self.table[2][idx],self.table[3][idx]) def set_color_hsva(self,idx,hsva_color): """set hsva table entry for index idx to hsva_color, which must be (h,s,v,a)""" self.table_hsva[0][idx] = hsva_color[0] self.table_hsva[1][idx] = hsva_color[1] self.table_hsva[2][idx] = hsva_color[2] self.table_hsva[3][idx] = hsva_color[3] def set_color(self,idx,rgba_color): """set rgba table entry for index idx to rgba_color, which must be (r,g,b,a)""" self.table[0][idx] = rgba_color[0] self.table[1][idx] = rgba_color[1] self.table[2][idx] = rgba_color[2] self.table[3][idx] = rgba_color[3] def get_pos_index(self,f): """return index in .table of gradient position f \in [0..1]""" return int(f*(self.size-1)) def get_index_pos(self,idx): """return position f \in [0..1] of gradient table index idx""" return (1.0*idx)/(self.size-1) def get_pos_color(self,f): """return a Color object representing the color which is lies at position f \in [0..1] in the current gradient""" result = Color() #e = self.table_hsva[:,self.get_pos_index(f)] e = self.get_color_hsva(self.get_pos_index(f)) result.set_hsva(e[0], e[1], e[2], e[3]) return result def get_pos_rgba_color_lerped(self,f): """return a (r,g,b,a) color representing the color which is lies at position f \in [0..1] in the current gradient. if f is outside the [0..1] interval, the result will be clamped to this interval""" scaled_pos = max(min(f,1.0), 0.0)*(self.size-1) idx0 = int(scaled_pos) fraction = scaled_pos - idx0 idx1 = min( self.size - 1, 1 + idx0 ) r = lerp( self.table[0][idx0], self.table[0][idx1], fraction ) g = lerp( self.table[1][idx0], self.table[1][idx1], fraction ) b = lerp( self.table[2][idx0], self.table[2][idx1], fraction ) a = lerp( self.table[3][idx0], self.table[3][idx1], fraction ) return (r,g,b,a) def insert_control_point(self,new_point): """Insert a new control point into the table. Does sort the control points, but does NOT update the table.""" self.control_points += [new_point] self.sort_control_points() def sort_control_points(self): """Sort control points by position. Call this if the position of any control point was changed externally. The control point array always has to be sorted.""" def pred(x, y): if x < y: return -1 elif y < x: return +1 else: return 0 self.control_points.sort( lambda x, y: pred(x.pos, y.pos) ) def update(self): """Recalculate the gradient table from the control points. The colors are interpolated linearly between each two control points in hsva space. """ #self.Sortcontrol_points() control_point_indices_total = [] for point in self.control_points: control_point_indices_total.append((self.get_pos_index(point.pos),point)) # first, recalculate the Hsva table channel-wise from the control points for it in [("h",0),("s",1),("v",2),("a",3)]: # take into account only control points which are active # for the current channel control_point_indices = [ x for x in control_point_indices_total \ if it[0] in x[1].active_channels ] assert( len( control_point_indices ) >= 2 ) # we always interpolate between two adjacent control points on the # current channel. NextIntervalBeginIdx marks the first table index # on which the next set of control points is to be choosen. start_point_id = -1 end_point_id = 0 start_pos = 0 #dummy value end_pos = 0 #dummy value next_interval_begin_idx = 0 end_point = control_point_indices[0][1] assert( next_interval_begin_idx == 0 ) for k in range(self.size): while( k == next_interval_begin_idx ): # ^-- this loop makes sure that we won't attempt to # interpolate between two control points that lie on # each other. read "if" instead of "while". start_point_id += 1 end_point_id += 1 start_point = end_point start_pos = end_pos end_point = control_point_indices[end_point_id][1] end_pos = end_point.pos next_interval_begin_idx = 1+control_point_indices[end_point_id][0] # calculate float position of this entry in the gradient table # and (linear) position in the current gradient between the # two current control points cur_pos = self.get_index_pos(k) f = ( cur_pos - start_pos ) / ( end_pos - start_pos ) assert( ( 0 <= f ) and ( f <= 1 ) ) # ^-- this might happen when two control points lie on each # other. Since this case only occurs as an intermediate case # when dragging it is not really problematic. #f = min( 1.0, max( 0.0, f ) ) self.table_hsva[it[1]][k] = lerp(start_point.color.hsva[it[1]], end_point.color.hsva[it[1]], f) assert( next_interval_begin_idx == self.size ) # convert hsva colors to rgba for k in range(self.size): h,s,v,a = self.get_color_hsva(k) self.set_color(k, hsva_to_rgba(h, s, v, a)) def store_to_vtk_lookup_table(self, vtk_table, num_entries=256): """Store current color table in `vtk_table`, an instance of `tvtk.LookupTable`. """ vtk_table.number_of_table_values = num_entries scale_xform = lambda x:x if self.scaling_function: scale_xform = self.scaling_function for idx in range(num_entries): f = scale_xform(float(idx)/(num_entries-1)) rgba = self.get_pos_rgba_color_lerped(f) vtk_table.set_table_value( idx, rgba ) def store_to_vtk_volume_prop(self, volume_prop, scalar_range): """Given a `tvtk.VolumeProperty` and a scalar range to map values into, this sets the CTF based on the current control points. """ # FIXME: This method does not support scaling! ctf = volume_prop.rgb_transfer_function ctf.remove_all_points() otf = volume_prop.get_scalar_opacity() otf.remove_all_points() s1, s2 = scalar_range size = s2 - s1 for point in self.control_points: x = s1 + point.pos*size h, s, v, a = point.color.get_hsva() if point.active_channels != 'a': ctf.add_hsv_point(x, h, s, v) if 'a' in point.active_channels: otf.add_point(x, a) def load_from_vtk_volume_prop(self, volume_prop): """Given a vtkVolumeProperty, this initializes the control points of the gradient table. This works best when a ctf.ColorTransferFunction and PiecewiseFunction are used. Note that it is not as easy to setup the control points from a LUT because the LUT may end up having more than the size of the table editor here. It also usually does not make sense to do this with a LUT. """ # FIXME: This method does not support scaling! ctf = volume_prop.rgb_transfer_function otf = volume_prop.get_scalar_opacity() # We need a CTF with at least 2 points. size = ctf.size assert (size > 1) assert (otf.size > 1) s1, s2 = ctf.range scale = float(s2 - s1) ds = scale/(size -1) new_ctl_pts = [] has_nodes = False if hasattr(ctf, 'nodes'): has_nodes = True for i in range(size): if has_nodes: x = ctf.nodes[i] else: x = s1 + i*ds r, g, b = ctf.get_color(x) a = otf.get_value(x) if (i == 0) or (i == (size-1)): # First and last points are fixed. pt = ColorControlPoint(active_channels="hsva", fixed=True) else: pt = ColorControlPoint(active_channels="hsv", fixed=False) pt.color.set_rgba(r, g, b, a) pos = (x - s1)/scale pt.set_pos(pos) new_ctl_pts.append(pt) # The alpha values are indipendent of the hsv ones. size = otf.size ds = scale/(size -1) has_nodes = False if hasattr(ctf, 'nodes'): has_nodes = True for i in range(1, size-1): if has_nodes: x = otf.nodes[i] else: x = s1 + i*ds a = otf.get_value(x) r, g, b = ctf.get_color(x) pt = ColorControlPoint(active_channels="a", fixed=False) pt.color.set_rgba(r, g, b, a) pos = (x - s1)/scale pt.set_pos(pos) new_ctl_pts.append(pt) self.control_points = new_ctl_pts self.sort_control_points() self.update() def scaling_parameters_changed(self): """Recompile the scaling function.""" from math import tan, atan, cos, acos, sin, asin, pow, log, exp, e, pi self.scaling_function = None # let python generate a new function via the exec statement. to make # the security risk calculable, we execute that function in a local # scope. The downside is that we have to provide math functions # one at a time. def_string = "def ParamFn(x): return %s " % (self.scaling_function_string) dict = {"a":self.scaling_function_parameter, "ParamFn":None, "atan":atan, "tan":tan, "cos":cos, "acos":acos, "sin":sin, "asin":asin, "pow":pow, "log":log, "exp":exp, "e":e, "pi":pi } if ( "" == self.scaling_function_string ): return try: exec(def_string, dict) self.scaling_function = dict["ParamFn"] except: raise ValueError("failed to compile function: ", def_string ) def set_scaling_function_parameter(self,new_parameter): """Set the 'a' parameter of the scaling function""" self.scaling_function_parameter = new_parameter self.scaling_parameters_changed() def set_scaling_function(self,new_function_string): """Set scaling function. new_function_string is a string describing the function, e.g. 'x**(4*a)' """ self.scaling_function_string = new_function_string self.scaling_parameters_changed() def save(self, file_name): """Save control point set into a new file FileName. It is not checked whether the file already exists. Further writes out a VTK .lut file and a .jpg file showing the gradients.""" # Ensure that if the input file name had one of the extensions # we'll be writing out ourselves, it gets stripped out first. path_base,ext = splitext(file_name) #print(file_name) if ext.lower() in ['.lut','.jpg','.jpeg','.grad']: ext = '' file_name = path_base + ext # Create the three names for the files we'll be actually # writing out. file_name_grad = file_name + '.grad' file_name_lut = file_name + '.lut' file_name_jpg = file_name + '.jpg' # write control points set. file = open( file_name_grad, "w" ) file.write( "V 2.0 Color Gradient File\n" ) file.write( "ScalingFunction: %s\n" % (self.scaling_function_string) ) file.write( "ScalingParameter: %s\n" % (self.scaling_function_parameter) ) file.write( "ControlPoints: (pos fixed bindings h s v a)\n" ) for control_point in self.control_points: file.write( " %s %s %s %s %s %s %s\n" % ( \ control_point.pos, control_point.fixed, control_point.active_channels, control_point.color.get_hsva()[0], control_point.color.get_hsva()[1], control_point.color.get_hsva()[2], control_point.color.get_hsva()[3] ) ) file.close() # write vtk lookup table. Unfortunatelly these objects don't seem to # have any built in and exposed means of loading or saving them, so # we build the vtk file directly vtk_table = tvtk.LookupTable() self.store_to_vtk_lookup_table(vtk_table) file = open( file_name_lut, "w" ) num_colors = vtk_table.number_of_table_values file.write( "LOOKUP_TABLE UnnamedTable %s\n" % ( num_colors ) ) for idx in range(num_colors): entry = vtk_table.get_table_value(idx) file.write("%.4f %.4f %.4f %.4f\n" % (entry[0],entry[1],entry[2],entry[3])) file.close() # if the python image library is aviable, also generate a small .jpg # file showing how the gradient looks. Based on code from Arnd Baecker. try: import Image except ImportError: pass # we're ready otherwise. no jpg output tho. else: Ny=64 # vertical size of the jpeg im = Image.new("RGBA",(num_colors,Ny)) for nx in range(num_colors): (r,g,b,a) = vtk_table.get_table_value(nx) for ny in range(Ny): im.putpixel((nx,ny),(int(255*r),int(255*g),int(255*b), int(255*a))) im.save(file_name_jpg,"JPEG") # it might be better to store the gradient as .png file, as these # are actually able to store alpha components (unlike jpg files) # and might also lead to a better compression. def load(self, file_name): """Load control point set from file FileName and recalculate gradient table.""" file = open( file_name, "r" ) version_tag = file.readline() version = float(version_tag.split()[1])+1e-5 if ( version >= 1.1 ): # read in the scaling function and the scaling function parameter function_line_split = file.readline().split() parameter_line = file.readline() if ( len(function_line_split)==2 ): self.scaling_function_string = function_line_split[1] else: self.scaling_function_string = "" self.scaling_function_parameter = float(parameter_line.split()[1]) else: self.scaling_function_string = "" self.scaling_function_parameter = 0.5 file.readline() new_control_points = [] while True: cur_line = file.readline() if len(cur_line) == 0: # readline is supposed to return an empty string at EOF break args = cur_line.split() if ( len(args) < 7 ): msg = "gradient file format broken at line:\n" msg += cur_line raise ValueError(msg) new_point = ColorControlPoint(active_channels="") new_point.set_pos( float( args[0] ) ) new_point.fixed = "True" == args[1] #bool( args[1] ) new_point.active_channels = args[2] (h,s,v,a) = ( float(args[3]), float(args[4]), float(args[5]), float(args[6]) ) new_point.color.set_hsva(h,s,v,a) new_control_points.append(new_point) file.close() self.control_points = new_control_points self.sort_control_points() self.scaling_parameters_changed() self.update() ########################################################################## # `GradientTable` class. ########################################################################## class GradientTable: """this class represents a logical gradient table, i.e. an array of colors and the means to control it via control points This class (unlike the GradientTableOld) does not support scaling and uses VTK's ColorTransferFunction and PiecewiseFunction to perform the actual interpolation. """ def __init__( self, num_entries ): self.size = num_entries self.table = tvtk.ColorTransferFunction() try: self.table.range = (0.0, 1.0) except Exception: # VTK versions < 5.2 don't seem to need this. pass self.alpha = tvtk.PiecewiseFunction() # These VTK classes perform the interpolation for us. # insert the control points for the left and the right end of the # gradient. These are fixed (i.e. cannot be moved or deleted) and # allow one to set begin and end colors. left_control_point = ColorControlPoint(fixed=True, active_channels="hsva") left_control_point.set_pos(0.0) left_control_point.color.set_rgb(0.0, 0.0, 0.0) right_control_point = ColorControlPoint(fixed=True, active_channels="hsva") right_control_point.set_pos(1.0) right_control_point.color.set_rgb(1.0, 1.0, 1.0) self.control_points = [left_control_point, right_control_point] # note: The array of control points always has to be sorted by gradient # position of the control points. # insert another control point. This one has no real function, it # is just there to make the gradient editor more colorful initially # and suggest to the (first time user) that it is actually possible to # place more control points. mid_control_point = ColorControlPoint(active_channels="hsv") mid_control_point.set_pos(0.4) mid_control_point.color.set_rgb(1.0,0.4,0.0) self.insert_control_point( mid_control_point ) # These variables are only for compatibility with GradientTableOld. self.scaling_function_string = "" # will receive the function string if # set, e.g. "x**(4*a)" self.scaling_function_parameter = 0.5 # the parameter a, slider controlled self.scaling_function = None # the actual function object. takes one # position parameter. None if disabled. self.update() def get_color_hsva(self, f): """return (h,s,v,a) tuple in self.table_hsva for fraction f in [0,1].""" r, g, b = self.table.get_color(f) a = self.alpha.get_value(f) return rgba_to_hsva(r, g, b, a) def get_color(self, f): """return (r,g,b,a) tuple in self.table for fraction f in [0,1].""" r, g, b = self.table.get_color(f) a = self.alpha.get_value(f) return r, g, b, a def get_pos_color(self,f): """return a Color object representing the color which is lies at position f \in [0..1] in the current gradient""" result = Color() e = self.get_color_hsva(f) result.set_hsva(*e) return result def get_pos_rgba_color_lerped(self,f): """return a (r,g,b,a) color representing the color which is lies at position f \in [0..1] in the current gradient. if f is outside the [0..1] interval, the result will be clamped to this interval.""" return self.get_color(f) def insert_control_point(self,new_point): """Insert a new control point into the table. Does sort the control points, but does NOT update the table.""" self.control_points += [new_point] self.sort_control_points() def sort_control_points(self): """Sort control points by position. Call this if the position of any control point was changed externally. The control point array always has to be sorted.""" def pred(x, y): if x < y: return -1 elif y < x: return +1 else: return 0 self.control_points.sort( lambda x, y: pred(x.pos, y.pos) ) def update(self): """Recalculate the gradient table from the control points. The colors are interpolated linearly between each two control points in hsva space. """ #self.sort_control_points() table = self.table alpha = self.alpha table.remove_all_points() alpha.remove_all_points() for point in self.control_points: x = point.pos h, s, v, a = point.color.get_hsva() if point.active_channels != 'a': table.add_hsv_point(x, h, s, v) if 'a' in point.active_channels: alpha.add_point(x, a) def store_to_vtk_lookup_table(self, vtk_table, num_entries=256): """Store current color table in `vtk_table`, an instance of `tvtk.LookupTable`. """ vtk_table.number_of_table_values = num_entries for idx in range(num_entries): f = float(idx)/(num_entries-1) rgba = self.get_color(f) vtk_table.set_table_value( idx, rgba ) def store_to_vtk_volume_prop(self, volume_prop, scalar_range): """Given a `tvtk.VolumeProperty` and a scalar range to map values into, this sets the CTF based on the current control points. """ # FIXME: This method does not support scaling! ctf = volume_prop.rgb_transfer_function ctf.remove_all_points() otf = volume_prop.get_scalar_opacity() otf.remove_all_points() s1, s2 = scalar_range try: ctf.range = s1, s2 except Exception: # VTK versions < 5.2 don't seem to need this. pass size = s2 - s1 for point in self.control_points: x = s1 + point.pos*size h, s, v, a = point.color.get_hsva() if point.active_channels != 'a': ctf.add_hsv_point(x, h, s, v) if 'a' in point.active_channels: otf.add_point(x, a) def load_from_vtk_volume_prop(self, volume_prop): """Given a vtkVolumeProperty, this initializes the control points of the gradient table. This works best when a ctf.ColorTransferFunction and PiecewiseFunction are used. Note that it is not as easy to setup the control points from a LUT because the LUT may end up having more than the size of the table editor here. It also usually does not make sense to do this with a LUT. """ # FIXME: This method does not support scaling! ctf = volume_prop.rgb_transfer_function otf = volume_prop.get_scalar_opacity() # We need a CTF with at least 2 points. size = ctf.size assert (size > 1) assert (otf.size > 1) s1, s2 = ctf.range scale = float(s2 - s1) ds = scale/(size -1) new_ctl_pts = [] has_nodes = False if hasattr(ctf, 'nodes'): has_nodes = True for i in range(size): if has_nodes: x = ctf.nodes[i] else: x = s1 + i*ds r, g, b = ctf.get_color(x) a = otf.get_value(x) if (i == 0) or (i == (size-1)): # First and last points are fixed. pt = ColorControlPoint(active_channels="hsva", fixed=True) else: pt = ColorControlPoint(active_channels="hsv", fixed=False) pt.color.set_rgba(r, g, b, a) pos = (x - s1)/scale pt.set_pos(pos) new_ctl_pts.append(pt) # The alpha values are indipendent of the hsv ones. size = otf.size ds = scale/(size -1) has_nodes = False if hasattr(ctf, 'nodes'): has_nodes = True for i in range(1, size-1): if has_nodes: x = otf.nodes[i] else: x = s1 + i*ds a = otf.get_value(x) r, g, b = ctf.get_color(x) pt = ColorControlPoint(active_channels="a", fixed=False) pt.color.set_rgba(r, g, b, a) pos = (x - s1)/scale pt.set_pos(pos) new_ctl_pts.append(pt) self.control_points = new_ctl_pts self.sort_control_points() self.update() def scaling_parameters_changed(self): """Recompile the scaling function.""" raise NotImplementedError def set_scaling_function_parameter(self,new_parameter): """Set the 'a' parameter of the scaling function""" raise NotImplementedError def set_scaling_function(self,new_function_string): """Set scaling function. new_function_string is a string describing the function, e.g. 'x**(4*a)' """ raise NotImplementedError def save(self, file_name): """Save control point set into a new file FileName. It is not checked whether the file already exists. Further writes out a VTK .lut file and a .jpg file showing the gradients.""" # Ensure that if the input file name had one of the extensions # we'll be writing out ourselves, it gets stripped out first. path_base,ext = splitext(file_name) #print(file_name) if ext.lower() in ['.lut','.jpg','.jpeg','.grad']: ext = '' file_name = path_base + ext # Create the three names for the files we'll be actually # writing out. file_name_grad = file_name + '.grad' file_name_lut = file_name + '.lut' file_name_jpg = file_name + '.jpg' # write control points set. file = open( file_name_grad, "w" ) file.write( "V 2.0 Color Gradient File\n" ) file.write( "ScalingFunction: %s\n" % (self.scaling_function_string) ) file.write( "ScalingParameter: %s\n" % (self.scaling_function_parameter) ) file.write( "ControlPoints: (pos fixed bindings h s v a)\n" ) for control_point in self.control_points: file.write( " %s %s %s %s %s %s %s\n" % ( \ control_point.pos, control_point.fixed, control_point.active_channels, control_point.color.get_hsva()[0], control_point.color.get_hsva()[1], control_point.color.get_hsva()[2], control_point.color.get_hsva()[3] ) ) file.close() # write vtk lookup table. Unfortunatelly these objects don't seem to # have any built in and exposed means of loading or saving them, so # we build the vtk file directly vtk_table = tvtk.LookupTable() self.store_to_vtk_lookup_table(vtk_table) file = open( file_name_lut, "w" ) num_colors = vtk_table.number_of_table_values file.write( "LOOKUP_TABLE UnnamedTable %s\n" % ( num_colors ) ) for idx in range(num_colors): entry = vtk_table.get_table_value(idx) file.write("%.4f %.4f %.4f %.4f\n" % (entry[0],entry[1],entry[2],entry[3])) file.close() # if the python image library is aviable, also generate a small .jpg # file showing how the gradient looks. Based on code from Arnd Baecker. try: import Image except ImportError: pass # we're ready otherwise. no jpg output tho. else: Ny=64 # vertical size of the jpeg im = Image.new("RGBA",(num_colors,Ny)) for nx in range(num_colors): (r,g,b,a) = vtk_table.get_table_value(nx) for ny in range(Ny): im.putpixel((nx,ny),(int(255*r),int(255*g),int(255*b), int(255*a))) im.save(file_name_jpg,"JPEG") # it might be better to store the gradient as .png file, as these # are actually able to store alpha components (unlike jpg files) # and might also lead to a better compression. def load(self, file_name): """Load control point set from file FileName and recalculate gradient table.""" file = open( file_name, "r" ) version_tag = file.readline() version = float(version_tag.split()[1])+1e-5 if ( version >= 1.1 ): # read in the scaling function and the scaling function parameter function_line_split = file.readline().split() parameter_line = file.readline() if ( len(function_line_split)==2 ): self.scaling_function_string = function_line_split[1] else: self.scaling_function_string = "" self.scaling_function_parameter = float(parameter_line.split()[1]) else: self.scaling_function_string = "" self.scaling_function_parameter = 0.5 file.readline() new_control_points = [] while True: cur_line = file.readline() if len(cur_line) == 0: # readline is supposed to return an empty string at EOF break args = cur_line.split() if ( len(args) < 7 ): msg = "gradient file format broken at line:\n" msg += cur_line raise ValueError(msg) new_point = ColorControlPoint(active_channels="") new_point.set_pos( float( args[0] ) ) new_point.fixed = "True" == args[1] #bool( args[1] ) new_point.active_channels = args[2] (h,s,v,a) = ( float(args[3]), float(args[4]), float(args[5]), float(args[6]) ) new_point.color.set_hsva(h,s,v,a) new_control_points.append(new_point) file.close() self.control_points = new_control_points self.sort_control_points() #self.scaling_parameters_changed() self.update() ########################################################################## # `ChannelBase` class. ########################################################################## class ChannelBase(object): def __init__(self, function_control, name, rgb_color, channel_index, channel_mode): """arguments documented in function body""" self.control = function_control #owning function control self.name = name #'r','g','b','h','s','v' or 'a' self.rgb_color = rgb_color # ^-- string containing a tk color value with which to # paint this channel self.index = channel_index #0: r or h, 1: g or s, 2: b or v, 3: a self.mode = channel_mode #'hsv' or 'rgb' def get_value(self, color): """Return height value of the current channel for the given color. Range: 0..1""" if ( self.mode == 'hsv' ): return color.get_hsva()[self.index] else: return color.get_rgba()[self.index] def get_value_index(self, color): """Return height index of channel value of Color. Range: [1..ControlHeight]""" return int( 1+(self.control.height-1)*(1.0 - self.get_value(color)) ) def get_index_value(self, y): """Get value in [0..1] of height index y""" return min(1.0, max(0.0, 1.0 - float(y)/(self.control.height-1))) def set_value( self, color, new_value_on_this_channel ): """Color will be modified: NewValue.. will be set to the color channel that ``*self`` represents.""" if ( self.mode == 'hsv' ): hsva = [color.get_hsva()[0], color.get_hsva()[1], color.get_hsva()[2], color.get_hsva()[3] ] hsva[self.index] = new_value_on_this_channel if ( hsva[0] >= 1.0 - 1e-5 ): # hack to make sure hue does not jump back to 0.0 # when it should be at 1.0 (rgb <-> hsv xform not # invertible there) hsva[0] = 1.0 - 1e-5 color.set_hsva(hsva[0],hsva[1],hsva[2],hsva[3]) else: rgba = [color.get_rgba()[0], color.get_rgba()[1], color.get_rgba()[2], color.get_rgba()[3] ] rgba[self.index] = new_value_on_this_channel color.set_rgba(rgba[0],rgba[1],rgba[2],rgba[3]) def set_value_index( self, color, y ): """Color will be modified: the value assigned to the height index y will be set to the color channel of Color ``*self`` represents.""" self.set_value( color, self.get_index_value(y) ) def get_pos_index(self,f): """Return x-index for gradient position f in [0..1]""" return int(f*(self.control.width-1)) def get_index_pos(self,idx): """Return gradient position f in [0..1] for x-index Idx in [0..ControlWidth-1]""" return (1.0*idx)/(self.control.width-1) def paint(self, painter): """Paint current channel into Canvas (a canvas of a function control object). This should be overridden to do the actual painting. """ raise NotImplementedError ########################################################################## # `FunctionControl` class. ########################################################################## class FunctionControl(object): """Widget which displays a rectangular regions on which hue, sat, val or rgb values can be modified. An function control can have one or more attached color channels.""" # Radius around a control point center in which we'd still count a # click as "clicked the control point" control_pt_click_tolerance = 4 ChannelFactory = ChannelBase def __init__(self, master, gradient_table, color_space, width, height): """Initialize a function control widget on tkframe master. Parameters: ----------- master: The master widget. Note that this widget *must* have the methods specified in the `AbstractGradientEditorWidget` interface. on_table_changed: Callback function taking a bool argument of meaning 'FinalUpdate'. FinalUpdate is true if a control point is dropped, created or removed and false if the update is due to a control point currently beeing dragged (but not yet dropped) color_space: String which specifies the channels painted on this control. May be any combination of h,s,v,r,g,b,a in which each channel occurs only once. set_status_text: a callback used to set the status text when using the editor. """ self.text_map = {'r': 'RED', 'g': 'GREEN', 'b': 'BLUE', 'h': 'HUE', 's': 'SATURATION', 'v': 'VALUE', 'a': 'ALPHA'} self.master = master self.table = gradient_table self.gradient_table = gradient_table self.width = width self.height = height self.channels = [] # add the channels Channel = self.ChannelFactory for c in color_space: if c == 'r': self.channels += [Channel(self, "r", (255,0,0), 0, 'rgb' )] elif c == 'g': self.channels += [Channel(self, "g", (0,255,0), 1, 'rgb' )] elif c == 'b': self.channels += [Channel(self, "b", (0,0,255), 2, 'rgb' )] elif c == 'h': self.channels += [Channel(self, "h", (255,0,0), 0, 'hsv' )] elif c == 's': self.channels += [Channel(self, "s", (0,255,0), 1, 'hsv' )] elif c == 'v': self.channels += [Channel(self, "v", (0,0,255), 2, 'hsv' )] elif c == 'a': self.channels += [Channel(self, "a", (0,0,0), 3, 'hsv' )] # generate a list of channels on which markers should # be bound if moved on the current channel. since we interpolate # the colors in hsv space, changing the r, g or b coordinates # explicitely means that h, s and v all have to be fixed. self.active_channels_string = "" for channel in self.channels: self.active_channels_string += channel.name if ( ( 'r' in color_space ) or ( 'g' in color_space ) or ( 'b' in color_space ) ): for c in "hsv": if ( not ( c in self.active_channels_string ) ): self.active_channels_string += c if ( color_space == 'a' ): # alpha channels actually independent of all other channels. self.active_channels_string = 'a' # need to set to "None" initially or event handlers get confused. self.cur_drag = None #<- [channel,control_point] while something is dragged. def find_control_point(self, x, y): """Check if a control point lies near (x,y) or near x if y is None. returns [channel, control point] if found, None otherwise""" for channel in self.channels: for control_point in self.table.control_points: # take into account only control points which are # actually active for the current channel if ( not ( channel.name in control_point.active_channels ) ): continue point_x = channel.get_pos_index( control_point.pos ) point_y = channel.get_value_index( control_point.color ) y_ = y if ( y_ is None ): y_ = point_y if ( (point_x-x)**2 + (point_y-y_)**2 <= self.control_pt_click_tolerance**2 ): return [channel, control_point] return None def table_config_changed(self, final_update): """Called internally in the control if the configuration of the attached gradient table has changed due to actions of this control. Forwards the update/change notice.""" self.table.update() self.master.on_gradient_table_changed(final_update) ###################################################################### # Toolkit specific event methods. # Look at wx_gradient_editor.py and qt_gradient_editor.py to see # the methods that are necessary. ###################################################################### ########################################################################## # `AbstractGradientEditor` interface. ########################################################################## class AbstractGradientEditor(object): def on_gradient_table_changed(self, final_update): """ Update the gradient table and vtk lookuptable.""" raise NotImplementedError def set_status_text(self, msg): """Set the status on the status widget if you have one.""" raise NotImplementedError def get_table_range(self): """Return the CTF or LUT's scalar range.""" raise NotImplementedError ########################################################################## # `GradientEditorWidget` interface. ########################################################################## class GradientEditorWidget(AbstractGradientEditor): """A Gradient Editor widget that can be used anywhere. """ def __init__(self, master, vtk_table, on_change_color_table=None, colors=None): """ Parameters: ----------- vtk_table : the `tvtk.LookupTable` or `tvtk.VolumeProperty` object to set. on_change_color_table : A callback called when the color table changes. colors : list of 'rgb', 'hsv', 'h', 's', 'v', 'a' (Default : ['rgb', 'hsv', 'a']) 'rgb' creates one panel to edit Red, Green and Blue colors. 'hsv' creates one panel to edit Hue, Saturation and Value. 'h', 's', 'v', 'r', 'g', 'b', 'a' separately specified creates different panels for each. """ if colors is None: colors = ['rgb', 'hsv', 'a'] self.colors = colors self.gradient_preview_width = 300 self.gradient_preview_height = 50 self.channel_function_width = self.gradient_preview_width self.channel_function_height = 80 self.gradient_table = GradientTable(self.gradient_preview_width) self.vtk_color_table = vtk_table if isinstance(vtk_table, tvtk.LookupTable): self.vtk_table_is_lut = True else: # This is a tvtk.VolumeProperty self.vtk_table_is_lut = False # Initialize the editor with the volume property. self.gradient_table.load_from_vtk_volume_prop(vtk_table) self.on_change_color_table = on_change_color_table # Add the function controls: self.function_controls = [] self.tooltip_text = 'Left click: move control points\n'\ 'Right click: add/remove control points' editor_data = {'rgb': ('', 'RGB'), 'hsv': ('Hue: Red; Saturation: Green; '\ 'Value: Blue\n', 'HSV' ), 'h': ('', 'HUE'), 's': ('', 'SAT'), 'v': ('', 'VAL'), 'r': ('', 'RED'), 'g': ('', 'GREEN'), 'b': ('', 'BLUE'), 'a': ('', 'ALPHA'), } self.editor_data = editor_data ###################################################################### # `GradientEditorWidget` interface. ###################################################################### def set_status_text(self, msg): raise NotImplementedError def on_gradient_table_changed(self, final_update ): """ Update the gradient table and vtk lookuptable...""" # update all function controls. for control in self.function_controls: control.update() # repaint the gradient display or the external windows only # when the instant*** options are set or when the update was final. #if final_update or ( 1 == self.show_instant_gradients.get() ): if True: self.gradient_control.update() #if final_update or ( 1 == self.show_instant_feedback.get() ): if final_update: vtk_table = self.vtk_color_table if self.vtk_table_is_lut: self.gradient_table.store_to_vtk_lookup_table(vtk_table) else: rng = self.get_table_range() self.gradient_table.store_to_vtk_volume_prop(vtk_table, rng) cb = self.on_change_color_table if cb is not None: cb() def get_table_range(self): vtk_table = self.vtk_color_table if self.vtk_table_is_lut: return vtk_table.table_range else: return vtk_table.get_scalar_opacity().range def load(self, file_name): """Set the state of the color table using the given file. """ if len(file_name) == 0: return self.gradient_table.load(file_name) self.on_gradient_table_changed(final_update = True) def save(self, file_name): """Store the color table to the given file. This actually generates 3 files, a '.grad', a '.lut' file and a '.jpg' file. The .lut file can be used to setup a lookup table. The .grad file is used to set the state of the gradient table and the JPG file is an image of the how the lut will look. """ if len(file_name) == 0: return self.gradient_table.save(file_name) mayavi-4.5.0/tvtk/util/qt_gradient_editor.py0000644000076500000240000004656312747716314021632 0ustar prabhustaff00000000000000""" A Qt based color gradient editor for vtkLookupTables and color transfer functions. This code is distributed under the conditions of the BSD license. Based on a wxPython by Pete Schmitt Author: Prabhu Ramachandran Copyright (c) 2012-2013 Enthought, Inc., Mumbai, India. """ # Enthought library imports from pyface.qt import QtCore, QtGui # Local imports from .gradient_editor import (ColorControlPoint, ChannelBase, FunctionControl, GradientEditorWidget) ########################################################################## # `QGradientControl` class. ########################################################################## class QGradientControl(QtGui.QWidget): """Widget which displays the gradient represented by an GradientTable object (and does nothing beyond that)""" def __init__(self, parent, gradient_table, width, height ): """master: panel in which to place the control. GradientTable is the Table to which to attach.""" super(QGradientControl, self).__init__(parent=parent) self.resize(width, height) self.setAttribute(QtCore.Qt.WA_OpaquePaintEvent, True) self.width = width self.height = height self.gradient_table = gradient_table assert( gradient_table.size == width ) self.setMinimumSize(100, 50) # currently only able to use gradient tables in the same size as the # canvas width def paintEvent(self, event): """Paint handler.""" super(QGradientControl, self).paintEvent(event) painter = QtGui.QPainter(self) brush = QtGui.QBrush(QtGui.QColor(0, 0, 0) ) painter.setBrush(brush) painter.setBackgroundMode(QtCore.Qt.OpaqueMode) sz = self.size() width, height = sz.width(), sz.height() xform = self.gradient_table.scaling_function start_y = 0 end_y = height if xform: # if a scaling transformation is provided, paint the original # gradient under the scaled gradient. start_y = height/2 # paint the original gradient as it stands in the table. color = QtGui.QColor() for x in range(width): (r,g,b,a) = self.gradient_table.get_pos_rgba_color_lerped(float(x)/(width-1)) color.setRgb(int(255*r), int(255*g), int(255*b)) painter.setPen(color) brush.setColor(color) painter.drawLine(x, start_y, x, end_y) if xform: # paint the scaled gradient below end_y = start_y start_y = 0 for x in range(width): f = float(x)/(width-1) (r,g,b,a) = self.gradient_table.get_pos_rgba_color_lerped(xform(f)) color.set(int(255*r), int(255*g), int(255*b)) brush.setColor(color) painter.drawLine(x, start_y, x, end_y) ########################################################################## # `Channel` class. ########################################################################## class Channel(ChannelBase): def paint(self, painter): """Paint current channel into Canvas (a canvas of a function control object). Contents of the canvas are not deleted prior to painting, so more than one channel can be painted into the same canvas. """ table = self.control.table # only control points which are active for the current channel # are to be painted. filter them out. relevant_control_points = [ x for x in table.control_points if self.name in x.active_channels ] # lines between control points color = QtGui.QColor(*self.rgb_color) painter.setPen(color) brush = QtGui.QBrush(color) painter.setBrush(brush) painter.setBackgroundMode(QtCore.Qt.OpaqueMode) for k in range( len(relevant_control_points) - 1 ): cur_point = relevant_control_points[k] next_point = relevant_control_points[1+k] painter.drawLine(self.get_pos_index(cur_point.pos), self.get_value_index(cur_point.color), self.get_pos_index(next_point.pos), self.get_value_index(next_point.color)) # control points themself. color = QtCore.Qt.black painter.setPen(color) for control_point in relevant_control_points: x = self.get_pos_index( control_point.pos ) y = self.get_value_index( control_point.color ) radius=6 #print(x,y) painter.drawRect(x-(radius/2.0), y-(radius/2.0), radius, radius) painter.drawRect(100,80,6,6) ########################################################################## # `QFunctionControl` class. ########################################################################## class QFunctionControl(QtGui.QWidget, FunctionControl): """Widget which displays a rectangular regions on which hue, sat, val or rgb values can be modified. An function control can have one or more attached color channels.""" # Radius around a control point center in which we'd still count a # click as "clicked the control point" control_pt_click_tolerance = 4 ChannelFactory = Channel def __init__(self, master, gradient_table, color_space, width, height): """Initialize a function control widget on tkframe master. Parameters: ----------- master: The master widget. Note that this widget *must* have the methods specified in the `AbstractGradientEditorWidget` interface. on_table_changed: Callback function taking a bool argument of meaning 'FinalUpdate'. FinalUpdate is true if a control point is dropped, created or removed and false if the update is due to a control point currently beeing dragged (but not yet dropped) color_space: String which specifies the channels painted on this control. May be any combination of h,s,v,r,g,b,a in which each channel occurs only once. set_status_text: a callback used to set the status text when using the editor. """ FunctionControl.__init__(self, master, gradient_table, color_space, width, height) QtGui.QWidget.__init__(self, parent=master) self.resize(width, height) self.setMinimumSize(100, 50) ###################################################################### # Qt event handlers. ###################################################################### def paintEvent(self, event): super(QFunctionControl, self).paintEvent(event) painter = QtGui.QPainter(self) brush = QtGui.QBrush(QtGui.QColor(255, 255, 255)) painter.setBrush(brush) width, height = self.size().width(), self.size().height() painter.drawRect(0, 0, width, height) for channel in self.channels: channel.paint(painter) def mousePressEvent(self, event): if event.button() == QtCore.Qt.LeftButton: self.cur_drag = self.find_control_point(event.x(), event.y()) super(QFunctionControl, self).mousePressEvent(event) def mouseReleaseEvent(self, event): if event.button() == QtCore.Qt.LeftButton: if self.cur_drag: self.table_config_changed( final_update = True ) self.cur_drag = None elif event.button() == QtCore.Qt.RightButton: # toggle control point. check if there is a control point # under the mouse. If yes, delete it, if not, create one # at that point. cur_control_point = self.find_control_point(event.x(), None) if cur_control_point: # found a marker at the click position. delete it and return, # unless it is a fixed marker (at pos 0 or 1).. if ( cur_control_point[1].fixed ): # in this case do nothing. Fixed markers cannot be deleted. return self.table.control_points.remove(cur_control_point[1]) self.table_config_changed(final_update=True) else: # since there was no marker to remove at the point, we assume # that we should place one there new_control_point = ColorControlPoint(active_channels=self.active_channels_string) new_control_point.set_pos(self.channels[0].get_index_pos(event.x())) # set new control point color to the color currently present # at its designated position new_control_point.color = self.table.get_pos_color(new_control_point.pos) self.table.insert_control_point(new_control_point) self.table_config_changed(final_update = True) if isinstance(event, QtGui.QMouseEvent): super(QFunctionControl, self).mouseReleaseEvent(event) def leaveEvent(self, event): if self.cur_drag: self.table_config_changed( final_update = True ) self.cur_drag = None super(QFunctionControl, self).leaveEvent(event) def resizeEvent(self, event): sz = self.size() self.width = sz.width() self.height = sz.height() def mouseMoveEvent(self, event): # currently dragging a control point? channel = None point = None if self.cur_drag: channel = self.cur_drag[0] point = self.cur_drag[1] if ( not point.fixed ): point.set_pos( channel.get_index_pos(event.x()) ) point.activate_channels( self.active_channels_string ) self.table.sort_control_points() channel.set_value_index( point.color, event.y() ) self.table_config_changed( final_update = False ) screenX = event.x() screenY = event.y() width, height = self.size().width(), self.size().height() master = self.master s1, s2 = master.get_table_range() if channel is not None: name = self.text_map[channel.name] pos = s1 + (s2 - s1)*point.pos val = channel.get_value(point.color) txt = '%s: (%.3f, %.3f)'%(name, pos, val) else: x = s1 + (s2 - s1)*float(screenX)/(width-1) y = 1.0 - float(screenY)/(height-1) txt = "position: (%.3f, %.3f)"%(x, y) self.master.set_status_text(txt) ########################################################################## # `QGradientEditorWidget` class. ########################################################################## class QGradientEditorWidget(QtGui.QWidget, GradientEditorWidget): """A Gradient Editor widget that can be used anywhere. """ def __init__(self, master, vtk_table, on_change_color_table=None, colors=None): """ Parameters: ----------- vtk_table : the `tvtk.LookupTable` or `tvtk.VolumeProperty` object to set. on_change_color_table : A callback called when the color table changes. colors : list of 'rgb', 'hsv', 'h', 's', 'v', 'a' (Default : ['rgb', 'hsv', 'a']) 'rgb' creates one panel to edit Red, Green and Blue colors. 'hsv' creates one panel to edit Hue, Saturation and Value. 'h', 's', 'v', 'r', 'g', 'b', 'a' separately specified creates different panels for each. """ GradientEditorWidget.__init__(self, master, vtk_table, on_change_color_table, colors) QtGui.QWidget.__init__(self, master) gradient_preview_width = self.gradient_preview_width gradient_preview_height = self.gradient_preview_height channel_function_width = self.channel_function_width channel_function_height = self.channel_function_height # set up all the panels in a grid # 6x2 size: 6 rows, 2 columns... grid = QtGui.QGridLayout() grid.setColumnStretch(0, 0) grid.setColumnStretch(1, 1) # "Gradient Viewer" panel, in position (0,1) for sizer self.gradient_control = QGradientControl(self, self.gradient_table, gradient_preview_width, gradient_preview_height) self.setToolTip('Right click for menu') grid.addWidget(QtGui.QLabel("", self), 0, 0) grid.addWidget(self.gradient_control, 0, 1) # Setup the context menu to fire for the Gradient control alone. gc = self.gradient_control gc.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) gc.customContextMenuRequested.connect(self.contextMenuEventOnGradient) # Add the function controls: function_controls = self.function_controls editor_data = self.editor_data row = 1 for color in self.colors: data = editor_data[color] control = QFunctionControl(self, self.gradient_table, color, channel_function_width, channel_function_height) txt = data[0] + self.tooltip_text control.setToolTip(txt) # Add name of editor (to left side of editor) grid.addWidget(QtGui.QLabel(data[1], self), row, 0) # Add the "RGB" control point editor grid.addWidget(control, row, 1) function_controls.append(control) row += 1 # The status text. self.text = QtGui.QLabel('status', self) grid.addWidget(self.text, row, 0, 1, 2) self.setLayout(grid) self.show() ###################################################################### # `GradientEditorWidget` interface. ###################################################################### def set_status_text(self, msg): self.text.setText(msg) ###################################################################### # Qt event methods. ###################################################################### def contextMenuEventOnGradient(self, pos): menu = QtGui.QMenu(self) saveAction = menu.addAction("Save as") loadAction = menu.addAction("Load") action = menu.exec_(self.mapToGlobal(pos)) if action == saveAction: self.on_save() elif action == loadAction: self.on_load() def on_save(self, event=None): """ Open "Save" dialog, write lookuptable to 3 files: ``*.lut`` (lookuptable) ``*.grad`` (gradient table for use with this program), and ``*.jpg`` (image of the gradient) """ wildcard = "Gradient Files (*.grad);;All Files (*.*)" filename, filter = QtGui.QFileDialog.getSaveFileName(self, "Save LUT to...", '', wildcard) if filename: self.save(filename) def on_load(self, event=None): """ Load a ``*.grad`` lookuptable file. """ wildcard = "Gradient Files (*.grad);;All Files (*.*)" filename, filter = QtGui.QFileDialog.getOpenFileName(self, "Open gradient file...", '', wildcard) if filename: self.load(filename) ########################################################################## # `QGradientEditor` class. ########################################################################## class QGradientEditor(QtGui.QMainWindow): """ QMainWindow that displays the gradient editor window, i.e. the thing that contains the gradient display, the function controls and the buttons. """ def __init__(self, vtk_table, on_change_color_table = None, colors=None): """Initialize the gradient editor window. Parameters ---------- vtk_table: Instance of vtkLookupTable, designating the table which is to be edited. on_change_color_table: Callback function taking no arguments. Called when the color table was changed and rendering is requested. """ super(QGradientEditor, self).__init__() self.setWindowTitle("Color Gradient Editor") self.widget = QGradientEditorWidget(self, vtk_table, on_change_color_table, colors) self.setCentralWidget(self.widget) self.resize(300, 500) self.statusBar() ## Set up the MenuBar menu = self.menuBar() file_menu = menu.addMenu("&File") file_action = QtGui.QAction("&Save", self) file_action.setStatusTip("Save CTF") file_action.triggered.connect(self.widget.on_save) file_menu.addAction(file_action) load_action = QtGui.QAction("&Load", self) load_action.setStatusTip("Load CTF") load_action.triggered.connect(self.widget.on_load) file_menu.addAction(load_action) quit_action = QtGui.QAction("&Quit", self) quit_action.setStatusTip("Quit application") quit_action.triggered.connect(QtGui.QApplication.instance().quit) file_menu.addAction(quit_action) help_menu = menu.addMenu("&Help") action = QtGui.QAction("&Help", self) action.setStatusTip("Help") action.triggered.connect(self.on_help) help_menu.addAction(action) action = QtGui.QAction("&About", self) action.setStatusTip("About application") action.triggered.connect(self.on_about) help_menu.addAction(action) def on_help(self, event=None): """ Help defining the mouse interactions """ message = "Right click to add control points. Left click to move control points" QtGui.QMessageBox.information(self, 'Help', message) def on_about(self, event=None): """ Who wrote the program?""" message = 'tk Gradient Editor for MayaVi1: Gerald Knizia (cgk.d@gmx.net)\n'\ 'wxPython port: Pete Schmitt (schmitt@colorado.edu)\n'\ 'Qt port: Prabhu Ramachandran\n'\ 'Enhanced for Mayavi2: Prabhu Ramachandran' QtGui.QMessageBox.information(self, 'About gradient editor', message) def main(): from .traitsui_gradient_editor import make_test_table import sys table, ctf, otf = make_test_table(lut=False) # the actual gradient editor code. def on_color_table_changed(): """If we had a vtk window running, update it here""" print("Update Render Window") app = QtGui.QApplication.instance() editor = QGradientEditor(table, on_color_table_changed, colors=['rgb', 'a', 'h', 's', 'v'], ) editor.setWindowTitle("Gradient editor") editor.show() sys.exit(app.exec_()) ########################################################################## # Test application. ########################################################################## if __name__ == "__main__": main() mayavi-4.5.0/tvtk/util/tk_gradient_editor.py0000644000076500000240000006544312747716314021622 0ustar prabhustaff00000000000000""" Defines the UI for a gradient editor for vtkLookupTables and color transfer functions. This code is distributed under the conditions of the BSD license. This code was originally written by Gerald Knizia and later modified by Prabhu Ramachandran Copyright (c) 2005-2015, Gerald Knizia and Prabhu Ramachandran """ try: import Tkinter as tk import tkFileDialog except ImportError: import tkinter as tk import tkinter.filedialog as tkFileDialog from .gradient_editor import GradientTable, ColorControlPoint ########################################################################## # `GradientControl` class. ########################################################################## class GradientControl(tk.Frame): """Widget which displays the gradient represented by an GradientTable object (and does nothing beyond that)""" def __init__(self, master, gradient_table, width, height ): """master: frame in which to place the control. GradientTable is the Table to which to attach.""" tk.Frame.__init__(self, master, borderwidth=2, relief='groove') self.width = width self.height = height self.gradient_table = gradient_table assert( gradient_table.size == width ) # ^- currently only able to use gradient tables in the same # size as the canvas width self.canvas = tk.Canvas(self, background="white", width=width, height=height) self.canvas.pack() self.update() def update(self): """Repaint the control.""" self.canvas.delete(tk.ALL) # clears all lines contained. # a look around the web (http://wiki.tcl.tk/11868) told me that # using the PhotoImage tk-control would not be a good idea and # that line objects work faster. While I doubt this is an optimal # solution it currently works fast enought. xform = self.gradient_table.scaling_function start_y = 0 end_y = self.height if xform: # if a scaling transformation is provided, paint the original # gradient under the scaled gradient. start_y = self.height/2 # paint the original gradient as it stands in the table. width = self.width for x in range(width): (r,g,b,a) = self.gradient_table.get_pos_rgba_color_lerped(float(x)/(width-1)) self.canvas.create_line(x,start_y,x,end_y, \ fill="#%02x%02x%02x" % (int(255*r),int(255*g),int(255*b))) if xform: # paint the scaled gradient below end_y = start_y start_y = 0 for x in range(self.width): f = float(x)/(self.width-1) (r,g,b,a) = self.gradient_table.get_pos_rgba_color_lerped(xform(f)) self.canvas.create_line(x,start_y,x,end_y, \ fill="#%02x%02x%02x" % (int(255*r),int(255*g),int(255*b))) ########################################################################## # `FunctionControl` class. ########################################################################## class FunctionControl(tk.Frame): """Widget which displays a rectangular regions on which hue, sat, val or rgb values can be modified. An function control can have one or more attached color channels.""" # Radius around a control point center in which we'd still count a # click as "clicked the control point" control_pt_click_tolerance = 4 class Channel: def __init__(self, function_control, name, color_string, channel_index, channel_mode): """arguments documented in function body""" self.control = function_control #owning function control self.name = name #'r','g','b','h','s','v' or 'a' self.color_string = color_string # ^-- string containing a tk color value with which to # paint this channel self.index = channel_index #0: r or h, 1: g or s, 2: b or v, 3: a self.mode = channel_mode #'hsv' or 'rgb' def get_value(self, color): """Return height value of the current channel for the given color. Range: 0..1""" if ( self.mode == 'hsv' ): return color.get_hsva()[self.index] else: return color.get_rgba()[self.index] def get_value_index(self, color): """Return height index of channel value of Color. Range: [1..ControlHeight]""" return int( 1+(self.control.height-1)*(1.0 - self.get_value(color)) ) def get_index_value(self, y): """Get value in [0..1] of height index y""" return min(1.0, max(0.0, 1.0 - float(y-1)/(self.control.height-1))) def set_value( self, color, new_value_on_this_channel ): """Color will be modified: NewValue.. will be set to the color channel that ``*self`` represents.""" if ( self.mode == 'hsv' ): hsva = [color.get_hsva()[0], color.get_hsva()[1], color.get_hsva()[2], color.get_hsva()[3] ] hsva[self.index] = new_value_on_this_channel if ( hsva[0] >= 1.0 - 1e-5 ): # hack to make sure hue does not jump back to 0.0 # when it should be at 1.0 (rgb <-> hsv xform not # invertible there) hsva[0] = 1.0 - 1e-5 color.set_hsva(hsva[0],hsva[1],hsva[2],hsva[3]) else: rgba = [color.get_rgba()[0], color.get_rgba()[1], color.get_rgba()[2], color.get_rgba()[3] ] rgba[self.index] = new_value_on_this_channel color.set_rgba(rgba[0],rgba[1],rgba[2],rgba[3]) def set_value_index( self, color, y ): """Color will be modified: the value assigned to the height index y will be set to the color channel of Color that ``*self`` represents.""" self.set_value( color, self.get_index_value(y) ) def get_pos_index(self,f): """Return x-index for gradient position f in [0..1]""" return int(f*(self.control.width-1)) def get_index_pos(self,idx): """Return gradient position f in [0..1] for x-index Idx in [0..ControlWidth-1]""" return (1.0*idx)/(self.control.width-1) def paint(self, canvas): """Paint current channel into Canvas (a canvas of a function control object). Contents of the canvas are not deleted prior to painting, so more than one channel can be painted into the same canvas.""" table = self.control.table # only control points which are active for the current channel # are to be painted. filter them out. relevant_control_points = [ x for x in table.control_points \ if self.name in x.active_channels ] # lines between control points for k in range( len(relevant_control_points) - 1 ): cur_point = relevant_control_points[k] next_point = relevant_control_points[1+k] canvas.create_line( self.get_pos_index(cur_point.pos), self.get_value_index(cur_point.color), self.get_pos_index(next_point.pos), self.get_value_index(next_point.color), fill = self.color_string ) # control points themself. for control_point in relevant_control_points: x = self.get_pos_index( control_point.pos ) y = self.get_value_index( control_point.color ) radius = 3 canvas.create_rectangle( x - radius, y - radius, x + radius, y + radius, outline = '#000000' ) def __init__(self, master, gradient_table, color_space, width, height, on_table_changed = None ): tk.Frame.__init__(self, master, borderwidth=2, relief='groove') """Initialize a function control widget on tkframe master. input: OnTableChanged: Callback function taking a bool argument of meaning 'FinalUpdate'. FinalUpdate is true if a control point is dropped, created or removed and false if the update is due to a control point currently beeing dragged (but not yet dropped) ColorSpace: String which specifies the channels painted on this control. May be any combination of h,s,v,r,g,b,a in which each channel occurs only once.""" self.on_table_changed = on_table_changed self.table = gradient_table self.width = width self.height = height self.gradient_table = gradient_table self.canvas = tk.Canvas(self, background="white", \ width=self.width, height=self.height) self.canvas.pack() self.channels = [] # add the channels Channel = FunctionControl.Channel for c in color_space: if c == 'r': self.channels += [Channel(self, "r", "red", 0, 'rgb' )] elif c == 'g': self.channels += [Channel(self, "g", "green", 1, 'rgb' )] elif c == 'b': self.channels += [Channel(self, "b", "blue", 2, 'rgb' )] elif c == 'v': self.channels += [Channel(self, "v", "#7f7f7f", 2, 'hsv' )] elif c == 'h': self.channels += [Channel(self, "h", "#ff0000", 0, 'hsv' )] elif c == 's': self.channels += [Channel(self, "s", "#ffafaf", 1, 'hsv' )] elif c == 'a': self.channels += [Channel(self, "a", "#000000", 3, 'hsv' )] # generate a list of channels on which markers should # be bound if moved on the current channel. since we interpolate # the colors in hsv space, changing the r, g or b coordinates # explicitely means that h, s and v all have to be fixed. self.active_channels_string = "" for channel in self.channels: self.active_channels_string += channel.name if ( ( 'r' in color_space ) or ( 'g' in color_space ) or ( 'b' in color_space ) ): for c in "hsv": if ( not ( c in self.active_channels_string ) ): self.active_channels_string += c if ( color_space == 'a' ): # alpha channels actually independent of all other channels. self.active_channels_string = 'a' self.update() self.canvas.bind( "", self.on_left_button_up ) self.canvas.bind( "", self.on_left_button_down ) self.canvas.bind( "", self.on_right_button_up ) self.canvas.bind( "", self.on_right_button_down ) self.canvas.bind( "", self.on_mouse_move ) self.cur_drag = None #<- [channel,control_point] while something is dragged. def update(self): """Repaint the control.""" canvas = self.canvas # shortcut... canvas.delete(tk.ALL) for channel in self.channels: channel.paint(self.canvas) def find_control_point(self, x, y): """Check if a control point lies near (x,y) or near x if y is None. returns [channel, control point] if found, None otherwise""" for channel in self.channels: for control_point in self.table.control_points: # take into account only control points which are # actually active for the current channel if ( not ( channel.name in control_point.active_channels ) ): continue point_x = channel.get_pos_index( control_point.pos ) point_y = channel.get_value_index( control_point.color ) y_ = y if ( y_ is None ): y_ = point_y if ( (point_x-x)**2 + (point_y-y_)**2 <= self.control_pt_click_tolerance**2 ): return [channel, control_point] return None def on_left_button_down(self, event): self.cur_drag = self.find_control_point( event.x, event.y ) def on_left_button_up(self, event): if self.cur_drag: self.table_config_changed( final_update = True ) self.cur_drag = None def on_right_button_down(self, event): pass def table_config_changed(self, final_update): """Called internally in the control if the configuration of the attached gradient table has changed due to actions of this control. Forwards the update/change notice.""" self.table.update() if self.on_table_changed: self.on_table_changed(final_update) else: self.update() def on_right_button_up(self, event): # toggle control point. check if there is a control point # under the mouse. If yes, delete it, if not, create one # at that point. cur_control_point = self.find_control_point(event.x, None) if cur_control_point: # found a marker at the click position. delete it and return, # unless it is a fixed marker (at pos 0 or 1).. if ( cur_control_point[1].fixed ): # in this case do nothing. Fixed markers cannot be deleted. return self.table.control_points.remove(cur_control_point[1]) self.table_config_changed(final_update=True) else: # since there was no marker to remove at the point, we assume # that we should place one there new_control_point = ColorControlPoint(active_channels = self.active_channels_string) new_control_point.set_pos(self.channels[0].get_index_pos(event.x)) # set new control point color to the color currently present # at its designated position new_control_point.color = self.table.get_pos_color(new_control_point.pos) self.table.insert_control_point( new_control_point ) self.table_config_changed( final_update = True ) def on_mouse_move(self, event): # currently dragging a control point? if self.cur_drag: channel = self.cur_drag[0] point = self.cur_drag[1] if ( not point.fixed ): point.set_pos( channel.get_index_pos(event.x) ) point.activate_channels( self.active_channels_string ) self.table.sort_control_points() channel.set_value_index( point.color, event.y ) self.table_config_changed( final_update = False ) ########################################################################## # `GradientEditor` class. ########################################################################## class GradientEditor(tk.Toplevel): """The gradient editor window, i.e. the thing that contains the gradient display, the function controls and the buttons.""" def __init__(self, master, vtk_table, on_change_color_table = None): """Initialize the gradient editor window. Parameters ---------- master Owning widget, for example a tk root object. VtkTable Instance of vtkLookupTable, designating the table which is to be edited. OnChangeColorTable Callback function taking no arguments. Called when the color table was changed and rendering is requested.""" # Inner dimensions of the color control gui-elements in pixels. gradient_preview_width = 300 gradient_preview_height = 50 channel_function_width = gradient_preview_width channel_function_height = 80 tk.Toplevel.__init__(self, master) self.title("Color Gradient Editor") self.minsize( gradient_preview_width+4, gradient_preview_height + 5 * \ channel_function_height + 50 ) self.gradient_table = GradientTable(gradient_preview_width) self.vtk_color_table = vtk_table # create controls. self.gradient_control = GradientControl(self, self.gradient_table, gradient_preview_width, gradient_preview_height ) self.gradient_control.grid(row=0,column=1,sticky="we") def on_gradient_table_changed( final_update ): # update all function controls. self.function_control_rgb.update() for control in self.function_controls_hsv: control.update() # repaint the gradient display or the external windows only # when the instant*** options are set or when the update was final. if final_update or ( 1 == self.show_instant_gradients.get() ): self.gradient_control.update() if final_update or ( 1 == self.show_instant_feedback.get() ): self.gradient_table.store_to_vtk_lookup_table( self.vtk_color_table ) on_change_color_table() self.on_gradient_table_changed = on_gradient_table_changed self.function_control_rgb = FunctionControl(self, self.gradient_table, "rgb", channel_function_width, channel_function_height, on_gradient_table_changed) label = tk.Label( self, text = "rgb" ) label.grid(row=1, column=0) self.function_control_rgb.grid(row=1,column=1,sticky="we") self.function_controls_hsv = [] for it in [("hue",2), ("sat",3), ("val",4), ("alp", 5) ]: control = FunctionControl(self, self.gradient_table, it[0][0], channel_function_width, channel_function_height, on_gradient_table_changed ) control.grid(row=it[1],column=1,sticky="we") self.function_controls_hsv.append(control) label = tk.Label( self, text = it[0] ) label.grid(row=it[1], column=0) # buttons and the instruction label get into an own subframe for # easier control. button_frame = tk.Frame(self) button_frame.grid(row=6,column=0,columnspan=2) ok_button = tk.Button(button_frame, text="ok", command=self.ok) ok_button.grid(row=0,column=1) #CancelButton = tk.Button(ButtonFrame, text="cancel", command=self.Cancel) #CancelButton.grid(row=0,column=2) spacer = tk.Frame(button_frame, width=10 ) spacer.grid(row=0,column=3) save_button = tk.Button(button_frame, text="save", command=self.save_gradient) save_button.grid(row=0,column=4) load_button = tk.Button(button_frame, text="load", command=self.load_gradient) load_button.grid(row=0,column=5) spacer = tk.Frame(button_frame, width=10 ) spacer.grid(row=0,column=6) label = tk.Label(button_frame,text="instant:") label.grid(row=0,column=7) # these two buttons control whether gradient and render target # updates are executed during movement of control points or # only at the end of such changes. self.show_instant_gradients = tk.IntVar() self.show_instant_gradients.set(1) # enable instant gradients by default self.show_instant_feedback = tk.IntVar() self.show_instant_feedback.set(0) # disable instant feedback by default instant_gradient_button = tk.Checkbutton(button_frame, text="grad") instant_gradient_button.grid(row=0,column=8) instant_gradient_button.configure(variable=self.show_instant_gradients) instant_feedback_button = tk.Checkbutton(button_frame, text="feed") instant_feedback_button.grid(row=0,column=9) instant_feedback_button.configure(variable=self.show_instant_feedback) instruction_label = tk.Label(button_frame, text="left button: move point; right click: toggle point") instruction_label.grid(column=0,columnspan=9,row=1) # insert a ratio button which decides whether the controls for nonlinear # scaling of the gradient are shown and activated. self.nonlinear_scaling_enabled = tk.IntVar() self.nonlinear_scaling_enabled.set(0) nonlinear_enabled_button = tk.Checkbutton(button_frame, text="nonlin") nonlinear_enabled_button.grid(column=9,row=1) nonlinear_enabled_button.configure(variable=self.nonlinear_scaling_enabled, command=self.nonlinear_scaling_option_changed) # the controls for the nonlinear scaling also get into an own frame. # this one can be shown or hidden when the "nonlin"-button is pressed nonlin_frame = tk.Frame(self) self.nonlin_frame = nonlin_frame label = tk.Label(nonlin_frame, text="f(x) =") label.grid(row=0, column=0) self.nonlinear_function_string = tk.StringVar() self.nonlinear_function_string.set( "x**(4*a)" ) function_edit = tk.Entry(nonlin_frame, width=35, textvariable=self.nonlinear_function_string) function_edit.bind("", self.nonlinear_function_string_changed ) function_edit.grid(row=0, column=1) label = tk.Label(nonlin_frame, text="param a:") label.grid(row=1, column=0) self.parameter_scale = tk.Scale(nonlin_frame, from_=0.0, to=1.0, resolution=0.001, length=250, orient="horizontal") self.parameter_scale.bind("", lambda event: self.nonlinear_parameter_scale_changed(final_update=True)) self.parameter_scale.bind("", lambda event:self.nonlinear_parameter_scale_changed(final_update=False)) self.parameter_scale.set(0.5) self.parameter_scale.grid(row=1, column=1) label = tk.Label(nonlin_frame, text= \ "f(x) should map [0..1] to [0..1]. It rescales the gradient.") label.grid(column=0,columnspan=2,row=2) # finally, write the current gradient out into main program on_gradient_table_changed(final_update = True) def nonlinear_scaling_option_changed(self): """called when the 'nonlin'-button is pressed to toggle if nonlinear- scaling is activated and the corresponding controls are shown""" if ( 1 == self.nonlinear_scaling_enabled.get() ): # activate the nonlinear scaling controls self.nonlin_frame.grid(row=7,column=0,columnspan=2) self.nonlinear_parameter_scale_changed(final_update=False) self.nonlinear_function_string_changed(None) else: # disable the nonlinear scaling controls (and the scaling) self.nonlin_frame.pack(side=tk.LEFT, anchor=tk.NW) self.nonlin_frame.pack_forget() self.gradient_table.set_scaling_function("") self.on_gradient_table_changed(final_update=True) def nonlinear_parameter_scale_changed(self,final_update): """Event Handler for the nonlinear-parameter scaling bar. FinalUpdate is true on ButtonRelease and False on Motion""" self.gradient_table.set_scaling_function_parameter(self.parameter_scale.get()) self.on_gradient_table_changed(final_update = final_update) def nonlinear_function_string_changed(self,event): """Invoked when Return is pressed in the nonlinear-function edit""" self.gradient_table.set_scaling_function(self.nonlinear_function_string.get()) self.on_gradient_table_changed(final_update = True) def ok(self): self.destroy() def save_gradient(self): filetypes = [("Gradient Files","*.grad"),("All Files","*")] file_name = tkFileDialog.asksaveasfilename(defaultextension=".grad", filetypes=filetypes) if file_name: # there is probably a way to find out which file type the user # actually selected. But since I don't know it and also don't really # know how to find it out, i rely on this error prone method... if ( ".lut" == file_name[len(file_name)-4:] ): self.gradient_table.save(file_name) self.gradient_table.save(file_name) def load_gradient(self): filetypes = [("Gradient Files","*.grad"), ("All Files","*")] file_name = tkFileDialog.askopenfilename(defaultextension=".grad", filetypes=filetypes) if file_name: self.gradient_table.load(file_name) self.on_gradient_table_changed(final_update = True) if self.gradient_table.scaling_function: self.parameter_scale.set(self.gradient_table.scaling_function_parameter) self.nonlinear_function_string.set(self.gradient_table.scaling_function_string) self.nonlinear_scaling_enabled.set(1) self.nonlinear_scaling_option_changed() else: self.nonlinear_scaling_enabled.set(0) self.nonlinear_scaling_option_changed() if __name__ == "__main__": # prepare a vtk window with an actor for visible feedback. Don't be # be scared, the actual gradient editor code is only 3 lines long, # the rest is setup of the scene. from tvtk.api import tvtk import vtk from vtk.tk import vtkTkRenderWidget from math import cos root = tk.Tk() root.minsize(520,520) render_frame = tk.Frame(root) render_frame.pack() render_widget = vtkTkRenderWidget.vtkTkRenderWidget(render_frame, width=512, height=512 ) render_widget.pack(side=tk.BOTTOM,expand='true',fill='both') render_window = render_widget.GetRenderWindow() renderer = vtk.vtkRenderer() renderer.SetBackground(0.2,0.2,0.4) render_window.AddRenderer(renderer) image_data = vtk.vtkImageData() N = 72 image_data.SetDimensions(N,N,1) try: method = image_data.SetScalarComponentFromFloat except AttributeError: method = image_data.SetScalarComponentFromDouble for i in range(N): for j in range(N): a = float(i)/N b = float(j)/N v = 0.5 + 0.5*cos(13*a)*cos(8*b+3*a*a) v = v**2 method(i,j,0,0,v) geometry_filter = vtk.vtkImageDataGeometryFilter() geometry_filter.SetInput(image_data) warp = vtk.vtkWarpScalar() warp.SetInput(geometry_filter.GetOutput()) warp.SetScaleFactor(8.1) normal_filter = vtk.vtkPolyDataNormals() normal_filter.SetInput(warp.GetOutput()) data_mapper = vtk.vtkDataSetMapper() data_mapper.SetInput(normal_filter.GetOutput()) data_actor = vtk.vtkActor() data_actor.SetMapper(data_mapper) renderer.AddActor(data_actor) table = vtk.vtkLookupTable() data_mapper.SetLookupTable(table) # the actual gradient editor code. def on_color_table_changed(): render_window.Render() # Gradient editor only works with tvtk objects, so convert the lut # to a tvtk version. tvtk_table = tvtk.to_tvtk(table) editor = GradientEditor(root, tvtk_table, on_color_table_changed) root.mainloop() mayavi-4.5.0/tvtk/util/traitsui_gradient_editor.py0000644000076500000240000000654612747716314023047 0ustar prabhustaff00000000000000""" Abstracts the Gradient editors provided for Qt and wxPython so these can be used from TraitsUI. Author: Prabhu Ramachandran Copyright (c) 2012-2013 Enthought Inc., Mumbai, India. """ from traits.etsconfig.api import ETSConfig from traitsui.api import CustomEditor from tvtk.api import tvtk ########################################################################## # Traits UI factory functions. ########################################################################## def gradient_editor_factory(parent, trait_editor): """This is a factory function for `traitsui.CustomEditor` and allows us to use the `wxGradientEditorWidget` or `QGradientEditorWidget` as a traits UI editor. """ tvtk_obj = getattr(trait_editor.object, trait_editor.name) if ETSConfig.toolkit == 'wx': from .wx_gradient_editor import wxGradientEditorWidget widget = wxGradientEditorWidget(parent, tvtk_obj) elif ETSConfig.toolkit == 'qt4': from .qt_gradient_editor import QGradientEditorWidget widget = QGradientEditorWidget(None, tvtk_obj) else: msg = 'Toolkit %s does not implement gradient_editors.'%ETSConfig.toolkit raise NotImplementedError(msg) return widget ########################################################################## # Editor for VolumeProperty ########################################################################## VolumePropertyEditor = CustomEditor(gradient_editor_factory) ########################################################################## # Test case related code. ########################################################################## def make_test_table(lut=False): from .ctf import ColorTransferFunction, PiecewiseFunction if lut: table = tvtk.LookupTable() table.table_range = (255, 355) return table, None, None else: table = tvtk.VolumeProperty() ctf = ColorTransferFunction() mins, maxs = 255, 355 ds = (maxs-mins)/4.0 try: ctf.range = (mins, maxs) except Exception: # VTK versions < 5.2 don't seem to need this. pass ctf.add_rgb_point(mins, 0.00, 0.0, 1.00) ctf.add_rgb_point(mins+ds, 0.25, 0.5, 0.75) ctf.add_rgb_point(mins+2*ds, 0.50, 1.0, 0.50) ctf.add_rgb_point(mins+3*ds, 0.75, 0.5, 0.25) ctf.add_rgb_point(maxs, 1.00, 0.0, 0.00) otf = PiecewiseFunction() otf.add_point(255, 0.0) otf.add_point(355, 0.2) table.set_color(ctf) table.set_scalar_opacity(otf) return table, ctf, otf def test_trait_ui(): from traits.api import HasTraits, Instance, Button from traitsui.api import View, Item, Group class Test(HasTraits): p = Instance(tvtk.VolumeProperty, ()) b = Button('Click me') view = View(Group( Item(name='p', style='custom', resizable=True, editor=VolumePropertyEditor), Item('b'), show_labels=False), resizable=True ) table, otf, ctf = make_test_table(False) t = Test(p=table) # We need to hang on to these so these don't go out of scope. t.otf = otf t.ctf = ctf return t if __name__ == '__main__': t = test_trait_ui() t.configure_traits() mayavi-4.5.0/tvtk/util/wx_gradient_editor.py0000644000076500000240000005041512747716314021633 0ustar prabhustaff00000000000000""" A wxPython based color gradient editor for vtkLookupTables and color transfer functions. This code is distributed under the conditions of the BSD license. Based on a Tk version of this widget by Gerald Knizia Ported to wxPython by Pete Schmitt Cleaned up and enhanced for use with MayaVi2 by Prabhu Ramachandran Copyright (c) 2005-2015, Gerald Knizia, Pete Schmitt and Prabhu Ramachandran """ # Third-party imports import wx # Local imports from .gradient_editor import (ColorControlPoint, ChannelBase, FunctionControl, GradientEditorWidget) ########################################################################## # `wxGradientControl` class. ########################################################################## class wxGradientControl(wx.Panel): """Widget which displays the gradient represented by an GradientTable object (and does nothing beyond that)""" def __init__(self, masterPanel, gradient_table, width, height ): """master: panel in which to place the control. GradientTable is the Table to which to attach.""" wx.Panel.__init__(self, masterPanel, size=wx.Size(width, height), style=wx.RAISED_BORDER, name="Colormap Panel") self.SetBackgroundColour(wx.Colour(255,255,255)) self.width = width self.height = height self.gradient_table = gradient_table assert( gradient_table.size == width ) # ^- currently only able to use gradient tables in the same size as the canvas width # bind paint event to redraw when resizing/creating window... wx.EVT_PAINT(self, self.OnPaint) def OnPaint(self, event): """ Paint event handler for when the window is resized and whatnot.""" dc = wx.PaintDC(self) self.update() def update(self): """Repaint the control.""" #self.canvas.delete(tk.ALL) # clears all lines contained. dc = wx.ClientDC(self) dc.SetBackground(wx.Brush(wx.Colour(0,0,0), wx.SOLID)) dc.Clear() width, height = self.GetSize() # From the old tk GradientEditor: # a look around the web (http://wiki.tcl.tk/11868) told me that # using the PhotoImage tk-control would not be a good idea and # that line objects work faster. While I doubt this is an optimal # solution it currently works fast enought. # So... let's do the same thing for the new and improved (?) wxPython GradientEditor. xform = self.gradient_table.scaling_function start_y = 0 end_y = height if xform: # if a scaling transformation is provided, paint the original # gradient under the scaled gradient. start_y = height/2 # paint the original gradient as it stands in the table. dc.BeginDrawing() for x in range(width): (r,g,b,a) = self.gradient_table.get_pos_rgba_color_lerped(float(x)/(width-1)) dc.SetPen(wx.Pen(wx.Colour(int(255*r),int(255*g),int(255*b)))) dc.SetBrush(wx.Brush((int(255*r),int(255*g),int(255*b)), wx.SOLID)) dc.DrawLine(x, start_y, x, end_y) if xform: # paint the scaled gradient below end_y = start_y start_y = 0 for x in range(width): f = float(x)/(width-1) (r,g,b,a) = self.gradient_table.get_pos_rgba_color_lerped(xform(f)) dc.SetBrush(wx.Brush((int(255*r),int(255*g),int(255*b)), wx.SOLID)) dc.DrawLine(x, start_y, x, end_y) dc.EndDrawing() ########################################################################## # `Channel` class. ########################################################################## class Channel(ChannelBase): def paint(self, deviceContext): """Paint current channel into Canvas (a canvas of a function control object). Contents of the canvas are not deleted prior to painting, so more than one channel can be painted into the same canvas.""" dc = deviceContext table = self.control.table # only control points which are active for the current channel # are to be painted. filter them out. relevant_control_points = [ x for x in table.control_points if self.name in x.active_channels ] dc.BeginDrawing() # lines between control points dc.SetPen(wx.Pen(self.rgb_color,1)) #dc.SetBrush(wx.Brush((255,255,255), wx.SOLID)) dc.SetBrush(wx.Brush((255,255,255), wx.SOLID)) for k in range( len(relevant_control_points) - 1 ): cur_point = relevant_control_points[k] next_point = relevant_control_points[1+k] dc.DrawLine( self.get_pos_index(cur_point.pos), self.get_value_index(cur_point.color), self.get_pos_index(next_point.pos), self.get_value_index(next_point.color)) # control points themself. dc.SetPen(wx.Pen("BLACK",1)) dc.SetBrush(wx.Brush((255,255,255), wx.SOLID)) for control_point in relevant_control_points: x = self.get_pos_index( control_point.pos ) y = self.get_value_index( control_point.color ) radius=6 #print(x,y) dc.DrawRectangle(x-(radius/2.0), y-(radius/2.0),radius,radius) dc.DrawRectangle(100,80,6,6) dc.EndDrawing() ########################################################################## # `wxFunctionControl` class. ########################################################################## class wxFunctionControl(wx.Panel, FunctionControl): """Widget which displays a rectangular regions on which hue, sat, val or rgb values can be modified. An function control can have one or more attached color channels.""" # Radius around a control point center in which we'd still count a # click as "clicked the control point" control_pt_click_tolerance = 4 ChannelFactory = Channel def __init__(self, master, gradient_table, color_space, width, height): """Initialize a function control widget on tkframe master. Parameters: ----------- master: The master widget. Note that this widget *must* have the methods specified in the `AbstractGradientEditorWidget` interface. on_table_changed: Callback function taking a bool argument of meaning 'FinalUpdate'. FinalUpdate is true if a control point is dropped, created or removed and false if the update is due to a control point currently beeing dragged (but not yet dropped) color_space: String which specifies the channels painted on this control. May be any combination of h,s,v,r,g,b,a in which each channel occurs only once. set_status_text: a callback used to set the status text when using the editor. """ FunctionControl.__init__(self, master, gradient_table, color_space, width, height) wx.Panel.__init__(self, master, size=wx.Size(width, height), name="RGBHSVA Editor") self.update() wx.EVT_LEFT_DOWN(self, self.on_left_button_down) wx.EVT_LEFT_UP(self, self.on_left_button_up) wx.EVT_RIGHT_DOWN(self, self.on_right_button_down) wx.EVT_RIGHT_UP(self, self.on_right_button_up) wx.EVT_MOTION(self, self.on_mouse_move) wx.EVT_PAINT(self, self.on_paint) wx.EVT_LEAVE_WINDOW(self, self.on_leave_window) ###################################################################### # wxPython event methods. ###################################################################### def update(self, event = None): """Repaint the control.""" dc = wx.ClientDC(self) #if we have a custom background, we *must* set the background brush *BEFORE* clearing... dc.SetBackground(wx.Brush(wx.Colour(255,255,255), wx.SOLID)) dc.Clear() for channel in self.channels: channel.paint(dc) def on_paint(self, event=None): dc = wx.PaintDC(self) self.update() def on_left_button_down(self, event): self.cur_drag = self.find_control_point( event.GetX(), event.GetY() ) def on_left_button_up(self, event): if self.cur_drag: self.table_config_changed( final_update = True ) self.cur_drag = None def on_leave_window(self, event): self.on_left_button_up(event) def on_right_button_down(self, event): pass def on_right_button_up(self, event): # toggle control point. check if there is a control point # under the mouse. If yes, delete it, if not, create one # at that point. cur_control_point = self.find_control_point(event.GetX(), None) if cur_control_point: # found a marker at the click position. delete it and return, # unless it is a fixed marker (at pos 0 or 1).. if ( cur_control_point[1].fixed ): # in this case do nothing. Fixed markers cannot be deleted. return self.table.control_points.remove(cur_control_point[1]) self.table_config_changed(final_update=True) else: # since there was no marker to remove at the point, we assume # that we should place one there new_control_point = ColorControlPoint(active_channels = self.active_channels_string) new_control_point.set_pos(self.channels[0].get_index_pos(event.GetX())) # set new control point color to the color currently present # at its designated position new_control_point.color = self.table.get_pos_color(new_control_point.pos) self.table.insert_control_point( new_control_point ) self.table_config_changed( final_update = True ) def on_mouse_move(self, event): # currently dragging a control point? channel = None point = None if self.cur_drag: channel = self.cur_drag[0] point = self.cur_drag[1] if ( not point.fixed ): point.set_pos( channel.get_index_pos(event.GetX()) ) point.activate_channels( self.active_channels_string ) self.table.sort_control_points() channel.set_value_index( point.color, event.GetY() ) self.table_config_changed( final_update = False ) screenX = event.GetX() screenY = event.GetY() width, height = self.GetSize() master = self.master s1, s2 = master.get_table_range() if channel is not None: name = self.text_map[channel.name] pos = s1 + (s2 - s1)*point.pos val = channel.get_value(point.color) txt = '%s: (%.3f, %.3f)'%(name, pos, val) else: x = s1 + (s2 - s1)*float(screenX)/(width-1) y = 1.0 - float(screenY)/(height-1) txt = "position: (%.3f, %.3f)"%(x, y) self.master.set_status_text(txt) ########################################################################## # `wxGradientEditorWidget` class. ########################################################################## class wxGradientEditorWidget(wx.Panel, GradientEditorWidget): """A Gradient Editor widget that can be used anywhere. """ def __init__(self, master, vtk_table, on_change_color_table=None, colors=None): """ Parameters: ----------- vtk_table : the `tvtk.LookupTable` or `tvtk.VolumeProperty` object to set. on_change_color_table : A callback called when the color table changes. colors : list of 'rgb', 'hsv', 'h', 's', 'v', 'a' (Default : ['rgb', 'hsv', 'a']) 'rgb' creates one panel to edit Red, Green and Blue colors. 'hsv' creates one panel to edit Hue, Saturation and Value. 'h', 's', 'v', 'r', 'g', 'b', 'a' separately specified creates different panels for each. """ GradientEditorWidget.__init__(self, master, vtk_table, on_change_color_table, colors) wx.Panel.__init__(self, master) gradient_preview_width = self.gradient_preview_width gradient_preview_height = self.gradient_preview_height channel_function_width = self.channel_function_width channel_function_height = self.channel_function_height # set up all the panels in a gridbagsizer (i.e. a big grid) # 6x2 size: 6 rows, 2 columns... sizer = wx.GridBagSizer(2, 2) # "Gradient Viewer" panel, in position (0,1) for sizer self.gradient_control = wxGradientControl(self, self.gradient_table, gradient_preview_width, gradient_preview_height) tt = wx.ToolTip('Right click for menu') self.gradient_control.Bind(wx.EVT_CONTEXT_MENU, self.on_gradient_menu) self.gradient_control.SetToolTip(tt) sizer.Add(self.gradient_control, pos=(0,1)) # Add the function controls: function_controls = self.function_controls editor_data = self.editor_data row = 1 for color in self.colors: data = editor_data[color] control = wxFunctionControl(self, self.gradient_table, color, channel_function_width, channel_function_height) txt = data[0] + self.tooltip_text control.SetToolTip(wx.ToolTip(txt)) # Add name of editor (to left side of editor) sizer.Add(wx.StaticText(self, -1, data[1]), pos=(row, 0), flag=wx.ALIGN_CENTER|wx.ALL) # Add the "RGB" control point editor sizer.Add(control, pos=(row, 1)) function_controls.append(control) row += 1 # The status text. self.text = wx.StaticText(self, -1, 'status') sizer.Add(self.text, (row,0), (row,2)) row += 1 # set the appropriate sizer. sizer.SetSizeHints(self) self.SetSizerAndFit(sizer) ###################################################################### # `wxGradientEditorWidget` interface. ###################################################################### def set_status_text(self, msg): t = self.text t.SetLabel(msg) t.Refresh() t.Update() ###################################################################### # wxPython event methods. ###################################################################### def on_gradient_menu(self, event): if not hasattr(self, 'save_menuid'): # Do this only the first time. self.save_menuid = wx.NewId() self.load_menuid = wx.NewId() self.Bind(wx.EVT_MENU, self.on_save, id=self.save_menuid) self.Bind(wx.EVT_MENU, self.on_load, id=self.load_menuid) menu = wx.Menu() menu.Append(self.save_menuid, "Save as") menu.Append(self.load_menuid, "Load") self.PopupMenu(menu) menu.Destroy() def on_save(self, event): """ Open "Save" dialog, write lookuptable to 3 files: ``*.lut`` (lookuptable) ``*.grad`` (gradient table for use with this program), and ``*.jpg`` (image of the gradient) """ dlg = wx.FileDialog(self, "Save LUT to...", style=wx.SAVE) wildcard = "Gradient Files (.grad)|*.grad|" \ "All files (*.*)|*.*" dlg.SetWildcard(wildcard) if (dlg.ShowModal() == wx.ID_OK): file_name = dlg.GetPath() if file_name: self.save(file_name) def on_load(self, event): """ Load a ``*.grad`` lookuptable file using wxpython dialog """ style = wx.OPEN | wx.HIDE_READONLY dlg = wx.FileDialog(self, "Open a file", style=style) wildcard = "Gradient Files (.grad)|*.grad|" \ "All files (*.*)|*.*" dlg.SetWildcard(wildcard) if (dlg.ShowModal() == wx.ID_OK): file_name = dlg.GetPath() if file_name: self.load(file_name) ########################################################################## # `wxGradientEditor` class. ########################################################################## class wxGradientEditor(wx.Frame): """ wxPython frame that displays the gradient editor window, i.e. the thing that contains the gradient display, the function controls and the buttons. """ def __init__(self, vtk_table, on_change_color_table = None, colors=None): """Initialize the gradient editor window. Parameters ---------- vtk_table: Instance of vtkLookupTable, designating the table which is to be edited. on_change_color_table: Callback function taking no arguments. Called when the color table was changed and rendering is requested. """ wx.Frame.__init__(self, None, -1, "Color Gradient Editor", wx.DefaultPosition, [350, 400]) self.widget = wxGradientEditorWidget(self, vtk_table, on_change_color_table, colors) # draw the rest of the GUI (i.e. statusbar, menubar, etc. self.SetupMenuBar() self.CreateStatusBar() def SetupMenuBar(self): """ Create menus (i.e. Create Filemenu and submenus, help menu, ...) """ ## Set up the MenuBar MenuBar = wx.MenuBar() #FILE Menu.... file_menu = wx.Menu() item = file_menu.Append(-1, "&Save","Save CTF") self.Bind(wx.EVT_MENU, self.widget.on_save, item) item = file_menu.Append(-1, "&Load","Load CTF") self.Bind(wx.EVT_MENU, self.widget.on_load, item) item = file_menu.Append(-1, "&Close","Close this frame") self.Bind(wx.EVT_MENU, self.OnQuit, item) MenuBar.Append(file_menu, "&File") help_menu = wx.Menu() item = help_menu.Append(-1, "&Help", "Help") self.Bind(wx.EVT_MENU, self.OnHelp, item) item = help_menu.Append(-1, "&About", "About") self.Bind(wx.EVT_MENU, self.OnAbout, item) MenuBar.Append(help_menu, "&Help") self.SetMenuBar(MenuBar) def OnQuit(self, event): self.Close() def OnHelp(self, event): """ Help defining the mouse interactions """ message = "Right click to add control points. Left click to move control points" dlg = wx.MessageDialog(self, message, 'About wxGradientEditor', wx.OK | wx.ICON_INFORMATION ) dlg.ShowModal() dlg.Destroy() def OnAbout(self, event): """ Who wrote the program?""" message = 'tk Gradient Editor for MayaVi1: Gerald Knizia (cgk.d@gmx.net)\n'\ 'wxPython port: Pete Schmitt (schmitt@colorado.edu)\n'\ 'Enhanced for MayaVi2: Prabhu Ramachandran' dlg = wx.MessageDialog(self, message, 'About wxGradientEditor', wx.OK | wx.ICON_INFORMATION ) dlg.ShowModal() dlg.Destroy() ########################################################################## # Test application. ########################################################################## def main(): from .traitsui_gradient_editor import make_test_table table, ctf, otf = make_test_table(lut=False) # the actual gradient editor code. def on_color_table_changed(): """If we had a vtk window running, update it here""" print("Update Render Window") app = wx.PySimpleApp() editor = wxGradientEditor(table, on_color_table_changed, colors=['rgb', 'a', 'h', 's', 'v'], ) editor.Show() app.MainLoop() if __name__ == "__main__": main() mayavi-4.5.0/tvtk/value_column.py0000644000076500000240000000245112747716314017463 0ustar prabhustaff00000000000000"""Used by tvtk_base_handler to create a UI. """ from traitsui.table_column import ObjectColumn class ValueColumn(ObjectColumn): """ Column to display the trait value for each trait of a tvtk object. """ def get_object ( self, object ): """ Returns the actual object being edited. Overridden here to return the tvtk object (which is the parent trait of object). """ return object.parent def target_name ( self, object ): """ Returns the target object and name for the column. Overridden here to return the trait name (which is the object's name trait) rather than the column's name trait. """ name = object.name object = self.get_object( object ) col = name.rfind( '.' ) if col < 0: return ( object, name ) return ( xgetattr( object, name[ :col ] ), name[ col + 1: ] ) def get_raw_value ( self, object ): """ Gets the unformatted value of the column for a specified object. Overridden here to return the trait name (which is the object's name trait) rather than the column's name trait. """ try: target, name = self.target_name( object ) return xgetattr( target, name ) except: return None mayavi-4.5.0/tvtk/version.py0000644000076500000240000000047212747716314016460 0ustar prabhustaff00000000000000# Wrapped in a try/except in those situations where someone hasn't installed # as an egg. What do we do then? For now, we just punt since we don't want # to define the version number in two places. try: import pkg_resources version = pkg_resources.require('Mayavi')[0].version except: version = '' mayavi-4.5.0/tvtk/view/0000755000076500000240000000000012747722127015367 5ustar prabhustaff00000000000000mayavi-4.5.0/tvtk/view/__init__.py0000644000076500000240000000000012747716314017467 0ustar prabhustaff00000000000000mayavi-4.5.0/tvtk/view/parametric_function_source_view.py0000644000076500000240000000073412747716314024414 0ustar prabhustaff00000000000000from traitsui.api import View, HGroup, Item from tvtk.tvtk_base import TVTKBaseHandler view = View((['generate_texture_coordinates'], ['scalar_mode'], HGroup(Item('u_resolution', label = 'u'), Item('v_resolution', label = 'v'), Item('w_resolution', label = 'w'), label = 'Resolution', show_border = True)), handler = TVTKBaseHandler, title='Edit ParametricFunctionSource properties', scrollable=True, buttons=['OK', 'Cancel']) mayavi-4.5.0/tvtk/vtk_module.py0000644000076500000240000000112612747716314017141 0ustar prabhustaff00000000000000"""Abstracts all VTK related modules into one module. This makes it trivial to support local VTK classes that a user may have built. By default it imports all of VTK and then looks for a tvtk_local module and imports everything from that. In order to add local classes to the TVTK build one may simply provide a tvtk_local.py module somewhere with any classes that need to be wrapped. """ # Author: Prabhu Ramachandran # Copyright (c) 2007, Enthought, Inc. # License: BSD Style. from vtk import * try: from tvtk_local import * except ImportError: pass mayavi-4.5.0/tvtk/vtk_parser.py0000644000076500000240000006601212747716314017155 0ustar prabhustaff00000000000000"""This module parses the VTK methods, obtains the argument and return type information, and organizes them. """ # Author: Prabhu Ramachandran # Copyright (c) 2004-2015, Enthought, Inc. # License: BSD Style. from __future__ import print_function import collections import re import types # Local imports (these are relative imports for a good reason). from . import class_tree from . import vtk_module as vtk from .common import is_version_62 class VTKMethodParser: """This class provides useful methods for parsing methods of a VTK class or instance. The class allows one to categorize the methods of the VTK class and also obtain the method signatures in a form that is easy to use. When the `parse` method is called, it in turn calls the `_organize_methods` method. This method organizes the VTK methods into different instance variables described in the following. `self.toggle_meths` contains a dictionary of all the boolean methods of the form On/Off. The dictionary keys are strings with the 's and the value of each item is the default value (0/1) of the item (the example below will clarify this). `self.state_meths` contains a dictionary which collects the SetTo type of methods. The key is the and the value is a list containing the different string 's and their corresponding mapped value. The first value in these is the default value of the . `self.get_set_meths` will contain a dictionary which collects all the methods of the form Set/Get that are not already specified in `self.toggle_meths` or `self.state_meths`. The default value of the Get is stored. If the value accepted by the method has a range (via the methods `GetMinValue` and `GetMaxValue`), then that range is computed and stored. `self.get_meths` stores the methods that are of the form `Get`. `self.other_meths` stores the remaining methods. The parsing is quite fast. Parsing every class in the VTK API takes a couple of seconds (on a Pentium III @ 450Mhz). Here is an example:: >>> import vtk >>> p = VTKMethodParser() >>> p.parse(vtk.vtkProperty) >>> print p.get_toggle_methods() {'EdgeVisibility': 0, 'BackfaceCulling': 0, 'FrontfaceCulling': 0} >>> print p.get_state_methods()['Representation'] [['Surface', 2], ['Points', 0], ['Surface', 2], ['Wireframe', 1]] >>> print p.get_get_set_methods()['Opacity'] (1.0, (0.0, 1.0)) >>> print p.get_get_methods() ['GetClassName'] >>> print p.get_other_methods()[:3] ['BackfaceRender', 'DeepCopy', 'IsA'] The class also provides a method called `get_method_signature` that obtains the Python method signature given the VTK method object. Here is an example:: >>> import vtk >>> o = vtk.vtkProperty >>> print VTKMethodParser.get_method_signature(o.GetClassName) [(['string'], None)] >>> print VTKMethodParser.get_method_signature(o.GetColor)[0] ([('float', 'float', 'float')], None) >>> print VTKMethodParser.get_method_signature(o.GetColor)[1] ([None], (('float', 'float', 'float'),)) The `get_method_signature` is fairly efficient and obtaining the signature for every method in every class in the VTK API takes around 6 seconds (on a Pentium III @ 450Mhz). """ def __init__(self, use_tree=True): """Initializes the object. Parameters ---------- - use_tree : `bool` If True (default), use a ClassTree instance to obtain a concrete subclass for an abstract base class. This is used only to find the range and default values for some of the methods. If False, no ClassTree instance is created. This is optional because, creating a ClassTree is expensive. The parser functionality can be very useful even without the use of a ClassTree. For example, if one wants to save the state of a VTK object one only needs to know the names of the methods and not their default values, ranges etc. In that case using a parser should be cheap. """ # The ClassTree is needed to find an instantiable child class # for an abstract VTK parent class. This instance is used to # obtain the state values and the ranges of the arguments # accepted by the Get/Set methods that have a # Get{MaxValue,MinValue} method. if use_tree: self._tree = class_tree.ClassTree(vtk) self._tree.create() else: self._tree = None self._state_patn = re.compile('To[A-Z0-9]') self._initialize() ################################################################# # 'VTKMethodParser' interface. ################################################################# def parse(self, obj, no_warn=True): """Parse the methods for a given VTK object/class. Given a VTK class or object, this method parses the methods and orgaizes them into useful categories. The categories and their usage is documented in the documentation for the class. Parameters ---------- - obj : VTK class or instance - no_warn : `bool` (default: True) If True (default), it suppresses any warnings generated by the VTK object when parsing the methods. This is safe to use. """ if not hasattr(obj, '__bases__'): klass = obj.__class__ else: klass = obj methods = self.get_methods(klass) if no_warn: # Save warning setting and shut it off before parsing. warn = vtk.vtkObject.GetGlobalWarningDisplay() if klass.__name__ != 'vtkObject': vtk.vtkObject.GlobalWarningDisplayOff() self._organize_methods(klass, methods) if no_warn: # Reset warning status. vtk.vtkObject.SetGlobalWarningDisplay(warn) def _get_parent_methods(self, klass): """Returns all the methods of the classes parents.""" methods = {} while len(klass.__bases__) > 0: klass = klass.__bases__[0] meths = dir(klass) d = methods.fromkeys(meths) methods.update(d) return list(methods.keys()) def get_methods(self, klass): """Returns all the relevant methods of the given VTK class.""" methods = dir(klass)[:] if hasattr(klass, '__members__'): # Only VTK versions < 4.5 have these. for m in klass.__members__: methods.remove(m) # Ignore the parent methods. ignore = self._get_parent_methods(klass) # Skip some of the ignores. skip = ['GetInput', 'SetInput'] # Sometimes the child has only GetInput while the parent has # SetInput. if hasattr(klass, 'SetInput') and \ 'SetInput' not in methods and \ 'GetInput' in methods: methods.append('SetInput') # Get/set pairs that are overridden. Basically, if a parent # class has a 'GetThing' and the child overrides/has a # 'SetThing' (or vice-versa), then the removal of the parent # methods is wrong since the child changes the trait definition # which breaks things. We therefore do not remove any of the # Get/SetThings that are ignored due to them being in the # parent. However one has to be careful about cases where these are # really Toggle (ThingOn) or State (SetThingToThong) etc. methods and # in those cases we really should ignore the method. So in essence, # any Get/Set pair that is not a State or Toggle should be redefined. for m in methods: check = False if m.startswith('Get'): m1 = 'Set' + m[3:] check = True elif m.startswith('Set'): m1 = 'Get' + m[3:] check = True if check: if m1 in methods and (m1 in ignore or m in ignore): skip_method = True if hasattr(klass, 'mro'): # New in VTK 6.3.x with Python 3 support. In this # case dir(klass) produces all methods so we check if # the definition is the same as the parent. base_cls = klass.__bases__[0] if getattr(klass, m) is getattr(base_cls, m, None) \ and getattr(klass, m1) is getattr(base_cls, m1, None): skip_method = False if skip_method: # Skips are stored as Set followed by Get. skip.extend(['Set' +m[3:], 'Get'+m[3:]]) for m in skip[:]: if m.startswith('Set'): base = m[3:] mg, ms = 'Get' + base, 'Set' + base m_st = 'Set' + base + 'To' m_t = base + 'Off' for method in methods: if m_st in method or m_t == method: skip.remove(ms) skip.remove(mg) break if 'GetViewProp' in methods and 'GetProp' in methods: ignore.extend(['GetProp', 'SetProp']) if 'GetViewProps' in methods and 'GetProps' in methods: ignore.extend(['GetProps', 'SetProps']) # Remove any deprecated traits. if 'GetScaledText' in methods and 'GetTextScaleMode' in methods: ignore.extend(['GetScaledText', 'SetScaledText', 'ScaledTextOn', 'ScaledTextOff']) # Now we can safely remove the methods. for m in methods[:]: if m in ignore and m not in skip: methods.remove(m) return methods def get_toggle_methods(self): """Returns a dictionary of the parsed On/Off methods along with the default value. """ return self.toggle_meths def get_state_methods(self): """Returns a dict of the parsed SetTo. The keys are the string with a list of the different strings along with their corresponding value (if obtainable). The first value is the default value of the state. """ return self.state_meths def get_get_set_methods(self): """Returns a dict of the parsed Get/Set methods. The keys of the dict are the strings and contain a two-tuple containing the default value (or None if it is not obtainable for some reason) and a pair of numbers specifying an acceptable range of values (or None if not obtainable). """ return self.get_set_meths def get_get_methods(self): """Return a list of parsed Get methods. All of these methods do NOT have a corresponding Set. """ return self.get_meths def get_other_methods(self): """Return list of all other methods, that are not categorizable. """ return self.other_meths @staticmethod def get_method_signature(method): """Returns information on the Python method signature given the VTK method. The doc string of the given method object to get the method signature. The method returns a list of tuples, each of which contains 2 items, the first is a list representing the return value the second represents the arguments to be passed to the function. If the method supports different return values and arguments, this function returns all of their signatures. Parameters ---------- - method : `method` A VTK method object. """ # VTK 6.2 false built in funcs/methods are ignored if is_version_62(): built_in_func = isinstance(method, types.BuiltinFunctionType) built_in_meth = isinstance(method, types.BuiltinMethodType) if not (built_in_func or built_in_meth): return None # Remove all the C++ function signatures. doc = method.__doc__ if doc is None: return None doc = doc[:doc.find('\n\n')] sig = [] c_sig = [] # The C++ signature in_sig = False in_c_sig = False counter = 0 for line in doc.split('\n'): if line.startswith('V.'): in_sig = True in_c_sig = False sig.append(line.strip()) elif line.startswith('C++:'): in_sig = False in_c_sig = True c_sig.append(line.strip()) counter += 1 elif in_sig: sig[counter] = sig[counter] + line.strip() elif in_c_sig: c_sig[counter-1] = c_sig[counter-1] + line.strip() # Remove the V. sig = [x.replace('V.' + method.__name__, '') for x in sig] c_sig = [x[x.find('('):] for x in c_sig] pat = re.compile(r'\b') # Split into [return_value, arguments] after processing them. tmp = list(sig) sig = [] for sig_idx, i in enumerate(tmp): # Split to get return values. x = i.split('->') # Strip each part. x = [y.strip() for y in x] if len(x) == 1: # No return value x = [None, x[0]] else: x.reverse() ret, arg = x # Remove leading and trailing parens for arguments. arg = arg[1:-1] if not arg: arg = None if arg and arg[-1] in [')', ']']: arg = arg + ',' # Check if we are able to parse all the arguments -- some # unstable versions of VTK have problems generating the # docstring and in this case we will try to use the C++ # docstring signature. n_arg = 0 arg_map = {'unsigned int': 'int', 'unsigned char': 'int', 'unsigned long': 'long', 'unsigned short': 'int'} if arg is not None and c_sig: n_arg = arg.count(',') + 1 # The carguments have parenthesis like: (int, int) carg = c_sig[sig_idx][1:-1].split(',') if n_arg > 0: args = [] if len(carg) == n_arg: for idx, x in enumerate(arg.split(',')): if len(x.strip()) == 0: carg_val = carg[idx].strip() if 'unsigned' in carg_val and \ carg_val in arg_map: args.append(arg_map[carg_val]) elif 'void' in carg_val: args.append("string") else: args.append(x) else: args.append(x) arg = ', '.join(args) if ret is not None and ret.startswith('(') and '...' in ret: # A tuple (new in VTK-5.7) ret = "tuple" if arg is not None: if '[float, ...]' in arg: arg = arg.replace('[float, ...]', 'tuple') elif '(float, ...)' in arg: arg = arg.replace('(float, ...)', 'tuple') if ret == '(, )': ret = None # Now quote the args and eval them. Easy! try: if ret: ret = eval(pat.sub('\"', ret)) if arg: arg = eval(pat.sub('\"', arg)) if type(arg) == type('str'): arg = [arg] except SyntaxError: pass else: sig.append(([ret], arg)) return sig def get_tree(self): """Return the ClassTree instance used by this class.""" return self._tree ################################################################# # Non-public interface. ################################################################# def _initialize(self): """Initializes the method categories.""" # Collects the On/Off methods. self.toggle_meths = {} # Collects the SetTo methods. self.state_meths = {} # Collects the Set/Get pairs. self.get_set_meths = {} # Collects the Get methods. self.get_meths = [] # Collects all the remaining methods. self.other_meths = [] def _organize_methods(self, klass, methods): """Organizes the given methods of a VTK class into different categories. Parameters ---------- - klass : A VTK class - methods : `list` of `str` A list of the methods to be categorized. """ self._initialize() meths = methods[:] meths = self._find_toggle_methods(klass, meths) meths = self._find_state_methods(klass, meths) meths = self._find_get_set_methods(klass, meths) meths = self._find_get_methods(klass, meths) self.other_meths = [ x for x in meths \ if isinstance(getattr(klass, x), collections.Callable) ] def _remove_method(self, meths, method): try: meths.remove(method) except ValueError: pass def _find_toggle_methods(self, klass, methods): """Find/store methods of the form {On,Off} in the given `methods`. Returns the remaining list of methods. """ meths = methods[:] tm = self.toggle_meths klass_name = klass.__name__ problem_methods = ['CopyVectors', 'CopyTensors', 'CopyTCoords', 'CopyScalars', 'CopyNormals', 'CopyGlobalIds', 'CopyPedigreeIds'] for method in meths[:]: if klass_name == 'vtkDataSetAttributes' and \ method[:-2] in problem_methods: continue elif method[:-2] == 'AlphaBitPlanes': continue if method[-2:] == 'On': key = method[:-2] if (key + 'Off') in meths and ('Get' + key) in meths: tm[key] = None meths.remove(method) meths.remove(key + 'Off') self._remove_method(meths, 'Set' + key) self._remove_method(meths, 'Get' + key) # get defaults if tm: obj = self._get_instance(klass) if obj: for key in tm: try: tm[key] = getattr(obj, 'Get%s'%key)() except (TypeError, AttributeError): print(klass.__name__, key) return meths def _find_state_methods(self, klass, methods): """Find/store methods of the form SetTo in the given `methods`. Returns the remaining list of methods. The method also computes the mapped value of the different . """ # These ignored ones are really not state methods. ignore = ['SetUpdateExtentToWholeExtent', 'SetDataExtentToWholeExtent', 'SetOutputSpacingToDefault', # In vtkImageReslice. 'SetOutputOriginToDefault', # In vtkImageReslice 'SetOutputExtentToDefault' # In vtkImageReslice ] meths = methods[:] sm = self.state_meths for method in meths[:]: if method not in ignore and method[:3] == 'Set': # Methods of form SetTo match = self._state_patn.search(method) # Second cond. ensures that this is not an accident. if match and (('Get'+method[3:]) not in meths): key = method[3:match.start()] # The part. if (('Get' + key) in methods): val = method[match.start()+2:] # part. meths.remove(method) if key in sm: sm[key].append([val, None]) else: sm[key] = [[val, None]] meths.remove('Get'+ key) self._remove_method(meths, 'Set'+ key) if ('Get' + key + 'MaxValue') in meths: meths.remove('Get' + key + 'MaxValue') meths.remove('Get' + key + 'MinValue') try: meths.remove('Get' + key + 'AsString') except ValueError: pass # Find the values for each of the states, i.e. find that # vtkProperty.SetRepresentationToWireframe() corresponds to # vtkProperty.SetRepresentation(1). if sm: obj = self._get_instance(klass) klass_name = klass.__name__ if obj and not klass_name.endswith('Viewer'): # We do not try to inspect viewers, because they'll # trigger segfaults during the inspection for key, values in sm.items(): default = getattr(obj, 'Get%s'%key)() for x in values[:]: try: getattr(obj, 'Set%sTo%s'%(key, x[0]))() except TypeError: # vtkRenderedGraphRepresentation has some of # its SetIvarToState methods that have # non-standard arguments, this throws off # the parser and we ignore these. #print(klass.__name__, key) pass else: val = getattr(obj, 'Get%s'%key)() x[1] = val if val == default: values.insert(0, [x[0], val]) return meths def _find_get_set_methods(self, klass, methods): """Find/store methods of the form {Get,Set}Prop in the given `methods` and returns the remaining list of methods. Note that it makes sense to call this *after* `_find_state_methods` is called in order to avoid incorrect duplication. This method also computes the default value and the ranges of the arguments (when possible) by using the Get{MaxValue,MinValue} methods. """ meths = methods[:] gsm = self.get_set_meths klass_name = klass.__name__ for method in meths[:]: # Methods of the Set/Get form. if method in ['Get', 'Set']: # This occurs with the vtkInformation class. continue elif klass_name == 'vtkProp' and method[3:] == 'AllocatedRenderTime': # vtkProp.Get/SetAllocatedRenderTime is private and # SetAllocatedRenderTime takes two args, don't wrap it. continue elif klass_name == 'vtkGenericAttributeCollection' and \ method[3:] == 'AttributesToInterpolate': continue elif klass_name == 'vtkOverlappingAMR' and method[3:] == 'Origin': continue elif (klass_name == 'vtkOrientationMarkerWidget' and method[3:] in ['OutlineColor', 'Viewport']): continue elif (klass_name == 'vtkImageDataGeometryFilter' and method[3:] == 'Extent'): continue elif (klass_name == 'vtkVolumeMapper' and method[3:] == 'CroppingRegionPlanes'): continue elif (method[:3] == 'Set') and ('Get' + method[3:]) in methods: key = method[3:] meths.remove('Set' + key) meths.remove('Get' + key) if ('Get' + key + 'MaxValue') in meths: meths.remove('Get' + key + 'MaxValue') meths.remove('Get' + key + 'MinValue') gsm[key] = 1 else: gsm[key] = None # Find the default and range of the values. if gsm: obj = self._get_instance(klass) if obj: for key, value in gsm.items(): if klass_name in ['vtkPolyData', 'vtkContext2D']: # Evil hack, these classes segfault! default = None elif klass_name == 'vtkHyperOctree' and \ key == 'Dimension': # This class breaks standard VTK conventions. gsm[key] = (3, (1, 3)) continue else: try: default = getattr(obj, 'Get%s'%key)() except TypeError: default = None if value: low = getattr(obj, 'Get%sMinValue'%key)() high = getattr(obj, 'Get%sMaxValue'%key)() gsm[key] = (default, (low, high)) else: gsm[key] = (default, None) else: # We still might have methods that have a default range. for key, value in gsm.items(): if value == 1: gsm[key] = None return meths def _find_get_methods(self, klass, methods): """Find/store methods of the form Get in the given `methods` and returns the remaining list of methods. """ meths = methods[:] gm = self.get_meths for method in meths[:]: if method == 'Get': # Occurs with vtkInformation continue elif method[:3] == 'Get': gm.append(method) meths.remove(method) return meths def _get_instance(self, klass): """Given a VTK class, `klass`, returns an instance of the class. If the class is abstract, it uses the class tree to return an instantiable subclass. This is necessary to get the values of the 'state' methods and the ranges for the Get/Set methods. """ obj = None try: obj = klass() except (TypeError, NotImplementedError): if self._tree: t = self._tree n = t.get_node(klass.__name__) if n is not None: for c in n.children: obj = self._get_instance(t.get_class(c.name)) if obj: break return obj mayavi-4.5.0/tvtk/wrapper_gen.py0000644000076500000240000021452412747716314017311 0ustar prabhustaff00000000000000"""This module generates the tvtk (Traited VTK) wrapper classes for VTK classes. """ # Author: Prabhu Ramachandran # Copyright (c) 2004-2015, Enthought, Inc. # License: BSD Style. from __future__ import print_function import re import sys import vtk import types import textwrap import keyword import copy from collections import Sequence from itertools import chain # Local imports (these are relative imports because the package is not # installed when these modules are imported). from .common import get_tvtk_name, camel2enthought, is_version_58 from . import vtk_parser from . import indenter from . import special_gen PY_VER = sys.version_info[0] def get_trait_def(value, **kwargs): """ Return the appropriate trait type, reformatted string and the associated traits meta data for a given `value` If a sequence is given, traits.Array is returned instead of traits.Tuple or traits.List Parameters ---------- value can be anything kwargs : dict keyword arguments for the trait definition Returns ------- tuple : (str, str, str) (trait_type, value, keyword_arguments) Raises ------ TypeError if this function cannot find an appropriate Trait type for `value` Example ------- >>> get_trait_def([100., 200.], enter_set=True, auto_set=False) ('traits.Array', '', 'auto_set=False, enter_set=True, shape=(2,), dtype=float, value=[100.0, 200.0], cols=2') >>> get_trait_def(100, enter_set=True, auto_set=False) ('traits.Int', '100', 'auto_set=False, enter_set=True') >>> get_trait_def(long(100), enter_set=True, auto_set=False) # Python 2 ('traits.Long', '100', 'auto_set=False, enter_set=True') >>> get_trait_def(u'something', enter_set=True, auto_set=False) ('traits.Unicode', "u'something'", 'auto_set=False, enter_set=True') >>> get_trait_def(True, enter_set=True, auto_set=False) ('traits.Bool', 'True', 'auto_set=False, enter_set=True') """ kwargs_code = ', '.join('{0}={1}'.format(key, value) for key, value in kwargs.items()) type_ = type(value) number_map = {int: 'traits.Int', float: 'traits.Float'} # In Python 2 there is long type if PY_VER < 3: number_map[long] = 'traits.Long' if type_ in number_map: return number_map[type_], str(value), kwargs_code elif type_ is str: if value == '\x00': value = '' return 'traits.String', '{!r}'.format(value), kwargs_code elif PY_VER < 3 and type_ is unicode: if value == u'\x00': value = u'' return 'traits.Unicode', '{!r}'.format(value), kwargs_code elif type_ in (tuple, list): shape = (len(value),) dtypes = set(type(element) for element in value) dtype = dtypes.pop().__name__ if len(dtypes) == 1 else None cols = len(value) if kwargs_code: kwargs_code += ', ' kwargs_code += ('shape={shape}, dtype={dtype}, ' 'value={value!r}, cols={cols}').format( shape=shape, dtype=dtype, value=value, cols=min(3, len(value))) return 'traits.Array', '', kwargs_code elif type_ is bool: return 'traits.Bool', str(value), kwargs_code else: raise TypeError("Could not understand type: {}".format(type_)) def patch_default(vtk_get_meth, vtk_set_meth, default): """Patch the initial default value for an attribute of a VTK class that does not initialise it properly. Parameters ---------- vtk_get_meth : Method for getting the position attribute vtk_set_meth : Method for setting the position attribute default : initial default value Returns ------- default If patching fails, the initial default is returned Examples -------- >>> import vtk >>> vtk.vtkVersion.GetVTKVersion() '6.3.0' >>> obj = vtk.vtkXOpenGLRenderWindow() >>> obj.GetPosition() '_000000000351c458_p_void' >>> patch_default(vtk.vtkXOpenGLRenderWindow.GetPosition, vtk.vtkXOpenGLRenderWindow.SetPosition, '_000000000351c458_p_void') (0, 0) """ # We will attempt to guess the default by looking into the # arguments of the Set method # SetPosition(int, int) has a signature of ("int", "int") # SetPosition(int position[2]) has a signature of (["int", "int"],) # Some method even has a signature of (["int", "int"], "vtkInformation") arg_formats = [] # Collect the signatures of the get method # We only use the arguments all_sigs = vtk_parser.VTKMethodParser.get_method_signature(vtk_get_meth) # Collect the signatures of the set method all_sigs.extend( vtk_parser.VTKMethodParser.get_method_signature(vtk_set_meth)) for sig in all_sigs: if sig[1] is None: continue if len(sig[1]) == 1: # This unpacks tuple of something e.g. (('int', 'int', 'int')) arg_formats.append(tuple(chain.from_iterable(sig[1]))) arg_formats.append(tuple(sig[1])) default_mappings = { 'int' : 0, 'float': 0.0, 'string': '' } for arg_format in arg_formats: try: all_same_type = len(set(arg_format)) == 1 except TypeError: # Unhashable continue if all_same_type and arg_format[0] in default_mappings: # All types in `arg_format` are the same and they are # in the mapping (e.g. arg_format = ('int', 'int') default = default_mappings[arg_format[0]] if len(arg_format) > 1: return (default,)*len(arg_format) else: return default else: return default ###################################################################### # `WrapperGenerator` class. ###################################################################### class WrapperGenerator: """Generates the wrapper code for all the TVTK classes. """ def __init__(self): self.indent = indenter.Indent() self.parser = vtk_parser.VTKMethodParser() self.special = special_gen.SpecialGenerator(self.indent) self.dm = indenter.VTKDocMassager() ################################################################# # `WrapperGenerator` interface. ################################################################# def get_tree(self): """Returns the parser's class tree.""" return self.parser.get_tree() def generate_code(self, node, out): """Generates the code for the given node in the parse tree along with an opened file-like object. Parameters ---------- - node A node in the ClassTree. - out : file-like object. Must support a `write` method. Code is written to it. """ self.indent.reset() self._write_prelims(node, out) # Write the class decl and __init__ self._gen_class_init(node, out) # Write the other methods. self._gen_methods(node, out) # Write any special code if available. self.special.generate_code(node, out) out.write('\n') ################################################################# # Non-public interface. ################################################################# def _write_prelims(self, node, out): """Write preliminary information given the node in the class tree, `node`, and output file-like object, `out`. """ prelim = """ # Automatically generated code: EDIT AT YOUR OWN RISK from traits import api as traits from traitsui.item import Item, spring from traitsui.group import HGroup from traitsui.view import View from tvtk import vtk_module as vtk from tvtk import tvtk_base from tvtk.tvtk_base_handler import TVTKBaseHandler from tvtk import messenger from tvtk.tvtk_base import deref_vtk from tvtk import array_handler from tvtk.array_handler import deref_array from tvtk.tvtk_classes.tvtk_helper import wrap_vtk def InstanceEditor(*args, **kw): from traitsui.editors.api import InstanceEditor as Editor return Editor(view_name="handler.view") try: long except NameError: # Silly workaround for Python3. long = int """ out.write(self.indent.format(prelim)) def _gen_class_init(self, node, out): indent = self.indent klass = self.get_tree().get_class(node.name) vtk_class_name = klass.__name__ class_name = self._get_class_name(klass) if node.level == 0 or node.name == 'vtkObjectBase': base_name = 'tvtk_base.TVTKBase' else: base_name = self._get_class_name(klass.__bases__)[0] if base_name != 'object': # Import the base class. base_fname = camel2enthought(base_name) _imp = "from tvtk.tvtk_classes.%(base_fname)s import %(base_name)s"%locals() out.write(indent.format(_imp)) out.write('\n\n') # Write the class declaration. cdef = """ class %(class_name)s(%(base_name)s): """%locals() out.write(indent.format(cdef)) self.dm.write_class_doc(klass.__doc__, out, indent) indent.incr() # Write __init__ decl = """ def __init__(self, obj=None, update=True, **traits): tvtk_base.TVTKBase.__init__(self, vtk.%(vtk_class_name)s, obj, update, **traits) """%locals() out.write(indent.format(decl)) if 'vtk3DWidget' in [x.name for x in node.get_ancestors()]: # In this case we also update the traits on the # EndInteractionEvent. Note that we don't need to change decl = ''' def setup_observers(self): """Setup the observers for the object.""" super(%(class_name)s, self).setup_observers() tvtk_base._object_cache.setup_observers(self._vtk_obj, 'EndInteractionEvent', self.update_traits) '''%locals() out.write(indent.format(decl)) def _gen_methods(self, node, out): klass = self.get_tree().get_class(node.name) self.parser.parse(klass) if klass.__name__ == 'vtkCamera': # 'vtkCamera.Roll' has conflicting signatures -- # Get/SetRoll() plus an additional Roll() method. So we # wrap all of them as methods and not as traits. p = self.parser p.get_set_meths.pop('Roll') p.other_meths.extend(['GetRoll', 'SetRoll']) # ---------------------------------------- # Generate the code. # The return values are editable traits. toggle = self._gen_toggle_methods(klass, out) state = self._gen_state_methods(klass, out) # The first return value contains updateable traits # the second return value contains dubious traits that # are initialised by VTK on init get_set, allow_update_failure = self._gen_get_set_methods(klass, out) # These do not produce editable traits. self._gen_get_methods(klass, out) self._gen_other_methods(klass, out) # ---------------------------------------- # Now write out the _updateable_traits_ and View related code. # Store the data in the node after updating from parents. # Note that this data is generated and stored at run # time. This is the reason why the wrapper code for the # classes are generated in the reverse order of their depth in # the inheritance tree. data = {'toggle':toggle, 'state':state, 'get_set':get_set, 'allow_update_failure': allow_update_failure} if node.level != 0 and node.parents[0].name != 'object': pd = node.parents[0].data for i in data.keys(): data[i].update(pd[i]) node.data = data # ---------------------------------------- # Write out the updateable traits, this is used by # the `update_traits` method. ut = {} for i in (data['toggle'], data['state'], data['get_set']): ut.update(i) junk = textwrap.fill(repr(tuple(ut.items()))) code = "\n_updateable_traits_ = \\" + "\n%s\n\n"%junk out.write(self.indent.format(code)) # ---------------------------------------- # Write out the allow_update_failure traits, this is used by # the `update_traits` method. junk = textwrap.fill(repr(tuple(data['allow_update_failure']))) code = "\n_allow_update_failure_ = \\" + "\n%s\n\n"%junk out.write(self.indent.format(code)) # ---------------------------------------- # Write out the full_traits_view and the more compact # traits_view # First copy the data over (we're going to edit it and don't # want the node's version to be changed). d = copy.deepcopy(data) # Add support for property trait delegation. #Commented out because of problems. #self._generate_delegates(node, d, out) toggle, state, get_set = d['toggle'], d['state'], d['get_set'] # Remove unwanted stuff. def _safe_remove(d, keys): for key in keys: try: del d[key] except KeyError: pass # No point having these in the GUI. _safe_remove(get_set, ['reference_count', 'progress']) class_name = get_tvtk_name(node.name) title = 'Edit %s properties'%class_name # Write the full_traits_view. # The full traits view displays all of the relevant traits in a table # editor. For this, we first write out the _full_traitnames_list: this # is used by the TVTKBaseHandler to build a TableEditor for all of # the (relevant) traits in the tvtk object. t_g = sorted(toggle.keys()) s_g = sorted(state.keys()) gs_g = sorted(get_set.keys()) junk = textwrap.fill("(%s)" % (t_g + s_g + gs_g)) code = "\n_full_traitnames_list_ = \\" + "\n%s\n\n"%junk out.write(self.indent.format(code)) # Start the trait_view() method. code = "\ndef trait_view(self, name=None, view_element=None):" out.write(self.indent.format(code)) self.indent.incr() code = "\nif view_element is not None or name not in (None, '', 'traits_view', 'full_traits_view', 'view'):" out.write(self.indent.format(code)) self.indent.incr() code = "\nreturn super(%s, self).trait_view(name, view_element)" % class_name out.write(self.indent.format(code)) self.indent.decr() # Now write the full traits view. code = "\nif name == 'full_traits_view':" out.write(self.indent.format(code)) self.indent.incr() item_contents = ( 'Item("handler._full_traits_list",show_label=False)') junk = 'View((%s),'% item_contents code = "\nfull_traits_view = \\" + \ "\n%s\ntitle=\'%s\', scrollable=True, resizable=True,"\ "\nhandler=TVTKBaseHandler,"\ "\nbuttons=['OK', 'Cancel'])"\ "\nreturn full_traits_view"%(junk, title) out.write(self.indent.format(code)) self.indent.decr() # Next, we write a compact traits_view (which we call 'view'), which # removes some generally unused items. code = "\nelif name == 'view':" out.write(self.indent.format(code)) self.indent.incr() _safe_remove(get_set, ['progress_text']) _safe_remove(toggle, ['abort_execute', 'release_data_flag', 'dragable', 'pickable', 'debug', 'global_warning_display']) t_g = sorted(toggle.keys()) s_g = sorted(state.keys()) gs_g = sorted(get_set.keys()) junk = textwrap.fill('View((%s, %s, %s),'%(t_g, s_g, gs_g)) code = "\nview = \\" + \ "\n%s\ntitle=\'%s\', scrollable=True, resizable=True,"\ "\nhandler=TVTKBaseHandler,"\ "\nbuttons=['OK', 'Cancel'])"\ "\nreturn view"%(junk, title) out.write(self.indent.format(code)) self.indent.decr() # Finally, we write the default traits_view which includes a field # for specifying the view type (basic or advanced) and the # corresponding view (basic->view and advanced->full_traits_view) code = "\nelif name in (None, 'traits_view'):" out.write(self.indent.format(code)) self.indent.incr() viewtype_contents = ( 'HGroup(spring, "handler.view_type", ' +\ 'show_border=True)') view_contents = ( '\nItem("handler.info.object", ' +\ 'editor = InstanceEditor(view_name="handler.view"), ' +\ 'style = "custom", show_label=False)') junk = 'View((%s, %s),'% (viewtype_contents, view_contents) code = "\ntraits_view = \\" + \ "\n%s\ntitle=\'%s\', scrollable=True, resizable=True,"\ "\nhandler=TVTKBaseHandler,"\ "\nbuttons=['OK', 'Cancel'])"\ "\nreturn traits_view\n\n"%(junk, title) out.write(self.indent.format(code)) self.indent.decr() self.indent.decr() def _generate_delegates(self, node, n_data, out): """This method generates delegates for specific classes. It modifies the n_data dictionary.""" prop_name = {'vtkActor': 'vtkProperty', 'vtkActor2D': 'vtkProperty2D', 'vtkVolume': 'vtkVolumeProperty'} if node.name in prop_name: prop_node = self.get_tree().get_node(prop_name[node.name]) prop_data = prop_node.data # Update the data of the node so the view includes the # property traits. code = '' for key in n_data: props = prop_data[key] n_data[key].update(props) # Write the delegates. for p in props: code += '%s = tvtk_base.vtk_property_delegate\n'%p code += '\n' out.write(self.indent.format(code)) def _gen_toggle_methods(self, klass, out): meths = self.parser.get_toggle_methods() updateable_traits = {} for m in meths: name = self._reform_name(m) updateable_traits[name] = 'Get' + m t_def = 'tvtk_base.false_bool_trait' if meths[m]: t_def = 'tvtk_base.true_bool_trait' try: vtk_set_meth = getattr(klass, 'Set' + m) except AttributeError: # Broken VTK API (4.2) where sometimes GetProp and # PropOn/Off exist but no SetProp method is available. vtk_get_meth = getattr(klass, 'Get' + m) self._write_trait(out, name, t_def, vtk_get_meth, mapped=True, broken_bool=True) else: self._write_trait(out, name, t_def, vtk_set_meth, mapped=True) return updateable_traits def _gen_state_methods(self, klass, out): parser = self.parser indent = self.indent meths = parser.get_state_methods() updateable_traits = {} for m in meths: name = self._reform_name(m) updateable_traits[name] = 'Get' + m d = {} vtk_val = 0 for key, val in meths[m]: d[self._reform_name(key)] = val if isinstance(val, vtk.vtkObjectBase): vtk_val = 1 # Setting the default value of the traits of these classes # Else they are not instantiable if klass.__name__ == 'vtkCellQuality' \ and m == 'QualityMeasure': vtk_val = 1 if klass.__name__ == 'vtkRenderView' \ and m == 'InteractionMode': vtk_val = 1 if klass.__name__ == 'vtkMatrixMathFilter' \ and m == 'Operation': vtk_val = 1 if klass.__name__ == 'vtkResliceImageViewer' \ and m == 'ResliceMode': vtk_val = 'axis_aligned' if klass.__name__ == 'vtkThreshold' \ and m == 'PointsDataType': vtk_val = 10 if (not hasattr(klass, 'Set' + m)): # Sometimes (very rarely) the VTK method is # inconsistent. For example in VTK-4.4 # vtkExtentTranslator::SetSplitMode does not exist. # In this case wrap it specially. vtk_val = 1 if vtk_val == 0 and m in ['DataScalarType', 'OutputScalarType', 'UpdateExtent']: vtk_val = 2 # Sometimes, some methods have default values that are # outside the specified choices. This is to special case # these. extra_val = None if vtk_val == 0 and klass.__name__ == 'vtkGenericEnSightReader' \ and m == 'ByteOrder': extra_val = 2 if vtk_val == 0 and klass.__name__ == 'vtkImageData' \ and m == 'ScalarType': extra_val = list(range(0, 22)) if vtk_val == 0 and klass.__name__ == 'vtkImagePlaneWidget' \ and m == 'PlaneOrientation': extra_val = 3 if (vtk_val == 0) and (klass.__name__ == 'vtkThreshold') \ and (m == 'AttributeMode'): extra_val = -1 if (sys.platform == 'darwin') and (vtk_val == 0) \ and (klass.__name__ == 'vtkRenderWindow') \ and (m == 'StereoType'): extra_val = 0 if not vtk_val: default = self._reform_name(meths[m][0][0]) if extra_val is None: t_def = """traits.Trait('%(default)s', tvtk_base.TraitRevPrefixMap(%(d)s))"""\ %locals() elif hasattr(extra_val, '__iter__'): extra_val = str(extra_val)[1:-1] if (not hasattr(klass, 'Set' + m)): # Sometimes (very rarely) the VTK method is # inconsistent. For example in VTK-4.4 # vtkExtentTranslator::SetSplitMode does not exist. # In this case wrap it specially. vtk_val = 1 if vtk_val == 0 and m in ['DataScalarType', 'OutputScalarType', 'UpdateExtent']: vtk_val = 2 # Sometimes, some methods have default values that are # outside the specified choices. This is to special case # these. extra_val = None if vtk_val == 0 and klass.__name__ == 'vtkGenericEnSightReader' \ and m == 'ByteOrder': extra_val = 2 if vtk_val == 0 and klass.__name__ == 'vtkImageData' \ and m == 'ScalarType': extra_val = list(range(0, 22)) if vtk_val == 0 and klass.__name__ == 'vtkImagePlaneWidget' \ and m == 'PlaneOrientation': extra_val = 3 if (vtk_val == 0) and (klass.__name__ == 'vtkThreshold') \ and (m == 'AttributeMode'): extra_val = -1 if (sys.platform == 'darwin') and (vtk_val == 0) \ and (klass.__name__ == 'vtkRenderWindow') \ and (m == 'StereoType'): extra_val = 0 if not vtk_val: default = self._reform_name(meths[m][0][0]) if extra_val is None: t_def = """traits.Trait('%(default)s', tvtk_base.TraitRevPrefixMap(%(d)s))"""\ %locals() elif hasattr(extra_val, '__iter__'): extra_val = str(extra_val)[1:-1] t_def = """traits.Trait('%(default)s', %(extra_val)s, tvtk_base.TraitRevPrefixMap(%(d)s))"""\ %locals() else: t_def = """traits.Trait('%(default)s', %(extra_val)s, tvtk_base.TraitRevPrefixMap(%(d)s))"""\ %locals() vtk_set_meth = getattr(klass, 'Set' + m) self._write_trait(out, name, t_def, vtk_set_meth, mapped=True) else: del updateable_traits[name] vtk_meth = getattr(klass, 'Get' + m) self._write_tvtk_method(klass, out, vtk_meth) if vtk_val == 2: vtk_meth = getattr(klass, 'Set' + m) self._write_tvtk_method(klass, out, vtk_meth) for key, val in meths[m][1:]: x = self._reform_name(key) vtk_meth = getattr(klass, 'Set%sTo%s'%(m, key)) decl = 'def set_%s_to_%s(self):'%(name, x) body = 'self._vtk_obj.Set%(m)sTo%(key)s()\n'%locals() self._write_generic_method(out, decl, vtk_meth, body) return updateable_traits def _gen_get_set_methods(self, klass, out): parser = self.parser meths = parser.get_get_set_methods() updateable_traits = {} allow_update_failure = set() for vtk_attr_name in meths: # VTK Attribute name (e.g. PropColorValue) # trait name name = self._reform_name(vtk_attr_name) updateable_traits[name] = 'Get' + vtk_attr_name vtk_set_meth = getattr(klass, 'Set' + vtk_attr_name) vtk_get_meth = getattr(klass, 'Get' + vtk_attr_name) get_sig = parser.get_method_signature(vtk_get_meth) set_sig = parser.get_method_signature(vtk_set_meth) #- ---------------------------------------------------------- # Some traits have special API or the VTK API is broken that # we need to handle them separately. # Warning: Be critical about whether the case is special # enthough to be added to the `special_traits` mapping # ----------------------------------------------------------- if self._is_special(klass, vtk_attr_name): updateable, can_fail = self._get_special_updateable_failable( klass, vtk_attr_name) if not updateable: # We cannot update this trait del updateable_traits[name] elif can_fail: # We will update this trait but updating can fail allow_update_failure.add(name) self._write_special_trait(klass, out, vtk_attr_name) continue # -------------------------------------------------------- # If it is an abstract class with no concrete subclass # and if we can read the get method signature, we write # the get and set methods and done # -------------------------------------------------------- if not meths[vtk_attr_name] and get_sig[0][1]: self._write_tvtk_method(klass, out, vtk_get_meth, get_sig) self._write_tvtk_method(klass, out, vtk_set_meth) continue # ------------------------------- # Get default values # ------------------------------- if meths[vtk_attr_name]: default, rng = meths[vtk_attr_name] else: # In some rare cases, the vtk class is an abstract class # that does not have a concrete subclass # We patch the default using the get/set method # while the below seems a hack, this is the best we could do default, rng = (patch_default(vtk_get_meth, vtk_set_meth, None), None) # -------------------------------------------------------- # Has a specified range of valid values. Write and done # -------------------------------------------------------- if rng: self._write_trait_with_range(klass, out, vtk_attr_name) continue # ---------------------------------------------------------- # The VTK Get method for the attribute returns the address # to a pointer, this is therefore, a VTK python bug # ---------------------------------------------------------- if isinstance(default, str) and default.endswith('_p_void'): try: self._write_trait_with_default_undefined(klass, out, vtk_attr_name) except TypeError as exception: # We could not write the trait # we will let the next clause handle it print('Warning:', str(exception)) default = None else: # Getting the trait value using the get method # without argument will continue to return an address to # a pointer, so there is no point in updating. # However, some VTK Get methods have multiple signatures # among which you could pass a numpy array of the right # size and the Get method would populate the array with # the value of the attribute # e.g. x = numpy.empty(9); ImageConvolve.GetKernel3x3(x) # FIXME: we could try harder in retrieving these values # in TVTKBase.update_traits del updateable_traits[name] continue # ------------------------------------------------------ # The default is None, depending on the get/set methods # signature, we will either have the trait as a Property # and write getter/setter or we would just write the # VTK get and set methods # ------------------------------------------------------- if default is None or isinstance(default, vtk.vtkObjectBase): # Bunch of hacks to work around issues. #print get_sig, vtk_get_meth, klass.__name__ if len(get_sig) == 0: get_sig = [([None], None)] if len(set_sig) == 0: set_sig = [([None], [None])] get_sig = [([None], None)] elif set_sig[0][1] is None or set_sig[0][1] == '': set_sig[0] = list(set_sig[0]) set_sig[0][1] = [None] if get_sig[0][0][0] == 'string' and get_sig[0][1] is None: # If the get method really returns a string # wrap it as such. t_def = 'traits.Trait(None, None, '\ 'traits.String(enter_set=True, auto_set=False))' self._write_trait(out, name, t_def, vtk_set_meth, mapped=False) else: if (get_sig[0][1] is None) and (len(set_sig[0][1]) == 1): # Get needs no args and Set needs one arg self._write_property(out, name, vtk_get_meth, vtk_set_meth) else: # Get has args or Set needs many args. self._write_tvtk_method(klass, out, vtk_get_meth, get_sig) self._write_tvtk_method(klass, out, vtk_set_meth, set_sig) # We cannot update the trait del updateable_traits[name] # --------------------------------------------------------- # This is a color, we want RGBEditor for the trait # --------------------------------------------------------- elif (isinstance(default, tuple) and len(default) == 3 and (name.find('color') > -1 or name.find('bond_color') > -1 or name.find('background') > -1)): # This is a color force = 'False' # 'vtkProperty' and 'vtkLight' are special because if you change # one color the GetColor changes value so we must force an # update. if klass.__name__ in ['vtkProperty', 'vtkLight']: force = 'True' t_def = 'tvtk_base.vtk_color_trait({default})'.format(default=default) self._write_trait(out, name, t_def, vtk_set_meth, mapped=False, force_update=force) # ------------------------------------------------------ # Try to get the trait type using the default # ------------------------------------------------------ else: try: # That would give the trait definition as # {trait_type}({default}, {kwargs}) trait_type, default, kwargs = get_trait_def(default, enter_set=True, auto_set=False) except TypeError: # ------------------------------------------ # Nothing works, print what we ignore # ------------------------------------------ print("%s:"%klass.__name__, end=' ') print("Ignoring method: Get/Set%s"%vtk_attr_name) print("default: %s, range: None"%default) del updateable_traits[name] else: if default: t_def = '{0}({1}, {2})'.format(trait_type, default, kwargs) else: t_def = '{0}({1})'.format(trait_type, kwargs) self._write_trait(out, name, t_def, vtk_set_meth, mapped=False) return updateable_traits, allow_update_failure def _gen_get_methods(self, klass, out): parser = self.parser meths = parser.get_get_methods() for m in meths: vtk_get_meth = getattr(klass, m) if m == 'GetOutput': # GetOutput is special. self._write_get_output_method(klass, out, set=False) elif m == 'GetInput': # GetInput is special. self._write_pure_get_input_method(klass, out) elif m == 'GetOutputPort': # This method sometimes prints warnings so we handle # it specially.GetInput is special. self._write_pure_get_output_port_method(klass, out) else: name = self._reform_name(m[3:]) sig = parser.get_method_signature(vtk_get_meth) simple_get = 0 if len(sig) == 1 and sig[0][1] is None: simple_get = 1 elif len(sig) > 1: for i in sig: if i[1] is None: simple_get = 1 break if simple_get: self._write_property(out, name, vtk_get_meth, None) else: # Cannot be represented as a simple property, # so we wrap it as a plain old method. self._write_tvtk_method(klass, out, vtk_get_meth, sig) def _gen_other_methods(self, klass, out): parser = self.parser meths = parser.get_other_methods() for m in meths: vtk_meth = getattr(klass, m) self._write_tvtk_method(klass, out, vtk_meth) ################################################################# # Private utility methods. ################################################################# def _reform_name(self, name, method=False): """Converts a VTK name to an Enthought style one. If `method` is True it does not touch names that are all upper case.""" if name == 'TeX': # Special case for some of the names. TeX occurs in the # vtkGL2PSExporter class. return 'tex' if name.isupper() and method: # All upper case names should remain the same since they # are usually special methods. return name res = camel2enthought(name) if keyword.iskeyword(res): return res + '_' else: return res def _get_class_name(self, klasses): """Returns renamed VTK classes as per TVTK naming style.""" ret = [] if type(klasses) in (list, tuple): return [get_tvtk_name(x.__name__) \ for x in klasses] else: return get_tvtk_name(klasses.__name__) def _find_type(self, val): """Given `val` which is extracted from the method call signature, this returns the type of the value. Right now this is in ['vtk', 'array', 'basic']. 'vtk' refers to a VTK type, 'array' to a vtkDataArray/vtkCellArray/vtkPoints/vtkIdList, 'basic' refers to a non-VTK, basic Python type. """ _arr_types = ['Array', 'vtkPoints', 'vtkIdList'] s = repr(val) if s.find('vtk') > -1: for i in _arr_types: if s.find(i) > -1: return 'array' return 'vtk' else: return 'basic' def _find_arg_type(self, sig): """Given a method signature `sig`, this finds the argument types. It uses the `_find_type` method to obtain its result. If no arguments are present in *all* of the signatures, then it returns `None`. """ if len(sig) == 1: if sig[0][1] is None: return None args = [s[1] for s in sig] return self._find_type(args) def _find_return_type(self, sig): """Given a method signature `sig`, this finds the return types. """ rets = [s[0] for s in sig] return self._find_type(rets) def _find_sig_type(self, sig): """Given a method signature `sig`, this finds the return and argument types using. This is a convenience type and returns a tuple containing (ret_type, arg_type). """ return self._find_return_type(sig), self._find_arg_type(sig) def _find_array_arg_sig(self, sig): """Returns a list of argument signatures from the signature information for a method. """ return [s[1] for s in sig] ################################################################# # The following methods do the writing. ################################################################# def _write_get_output_method(self, klass, out, set=False): """Write the get_output method. This method is special and needs special care. `klass` is the class for which the method is being wrapped, `out` is the output file. If `set` is True, a set_output method is also wrapped. This defaults to False. """ vtk_get_meth = getattr(klass, 'GetOutput') sig = self.parser.get_method_signature(vtk_get_meth) # First write out a property. doc = "Output of this source, i.e. the result of `get_output()`." if set: trait_def = """ def _get_output(self): return wrap_vtk(self._vtk_obj.GetOutput()) def _set_output(self, obj): old_val = self._get_output() self._wrap_call(self._vtk_obj.SetOutput, deref_vtk(obj)) self.trait_property_changed('output', old_val, obj) output = traits.Property(_get_output, _set_output, help=\"%(doc)s\") """%locals() else: trait_def = """ def _get_output(self): return wrap_vtk(self._vtk_obj.GetOutput()) output = traits.Property(_get_output, help=\"%(doc)s\") """%locals() out.write(self.indent.format(trait_def)) # Now write the generic method. if len(sig) == 1: decl = "def get_output(self):" body = "return wrap_vtk(self._vtk_obj.GetOutput())" else: decl = "def get_output(self, idx=None):" body = """ if idx is None: return wrap_vtk(self._vtk_obj.GetOutput()) else: return wrap_vtk(self._vtk_obj.GetOutput(idx)) """ self._write_generic_method(out, decl, vtk_get_meth, body) if set: decl = "def set_output(self, obj):" body = "old_val = self._get_output()\n" body += "self._wrap_call(self._vtk_obj.SetOutput, deref_vtk(obj))\n" body += "self.trait_property_changed('output', old_val, obj)\n" vtk_set_meth = getattr(klass, 'SetOutput') self._write_generic_method(out, decl, vtk_set_meth, body) def _write_get_source_method(self, klass, out): """Write the set/get_source method. This method needs special care. `klass` is the class for which the method is being wrapped, `out` is the output file. """ vtk_get_meth = getattr(klass, 'GetSource') vtk_set_meth = getattr(klass, 'SetSource') set_sig = self.parser.get_method_signature(vtk_set_meth) if len(set_sig) > 1: # Special case. First write the property for the first source. doc = "The first source of this object, i.e. the result of `get_source(0)`." trait_def = """ def _get_source(self): return wrap_vtk(self._vtk_obj.GetSource(0)) def _set_source(self, obj): old_val = self._get_source() self._wrap_call(self._vtk_obj.SetSource, deref_vtk(obj)) self.trait_property_changed('source', old_val, obj) source = traits.Property(_get_source, _set_source, help=\"%(doc)s\") """%locals() out.write(self.indent.format(trait_def)) # Now wrap the set_source and get_source. self._write_tvtk_method(klass, out, vtk_get_meth) self._write_tvtk_method(klass, out, vtk_set_meth, set_sig) else: self._write_property(out, 'source', vtk_get_meth, vtk_set_meth) def _write_pure_get_output_port_method(self, klass, out): """Handle the GetOutputPort method so that it does not print unnecessary warning messages. `klass` is the class for which the method is being wrapped, `out` is the output file. """ vtk_get_meth = getattr(klass, 'GetOutputPort') t_def = """ def _get_output_port(self): if self._vtk_obj.GetNumberOfOutputPorts(): return wrap_vtk(self._vtk_obj.GetOutputPort()) else: return None """%locals() indent = self.indent out.write(indent.format(t_def)) t_def = """output_port = traits.Property(_get_output_port, help=\\""" out.write(indent.format(t_def)) doc = vtk_get_meth.__doc__ self.dm.write_trait_doc(doc, out, indent) # Close the function definition. out.write(indent.format(')')) out.write('\n') def _write_pure_get_input_method(self, klass, out): """Write the get_input method when the class only has the getter and no setter. `klass` is the class for which the method is being wrapped, `out` is the output file. """ vtk_get_meth = getattr(klass, 'GetInput') get_sig = self.parser.get_method_signature(vtk_get_meth) if len(get_sig) > 1: # Special case. First write the property for the first input. doc = "The first input of this object, i.e. the result of `get_input(0)`." trait_def = """ def _get_input(self): try: return wrap_vtk(self._vtk_obj.GetInput(0)) except TypeError: return wrap_vtk(self._vtk_obj.GetInput()) input = traits.Property(_get_input, help=\"%(doc)s\") """%locals() out.write(self.indent.format(trait_def)) # Now wrap the get_input with args. self._write_tvtk_method(klass, out, vtk_get_meth) else: self._write_property(out, 'input', vtk_get_meth, None) def _write_get_input_method(self, klass, out): """Write the set/get_input method. This method needs special care. `klass` is the class for which the method is being wrapped, `out` is the output file. """ vtk_get_meth = getattr(klass, 'GetInput') vtk_set_meth = getattr(klass, 'SetInput') set_sig = self.parser.get_method_signature(vtk_set_meth) if len(set_sig) > 1: # Special case. First write the property for the first input. doc = "The first input of this object, i.e. the result of `get_input(0)`." trait_def = """ def _get_input(self): try: return wrap_vtk(self._vtk_obj.GetInput(0)) except TypeError: return wrap_vtk(self._vtk_obj.GetInput()) def _set_input(self, obj): old_val = self._get_input() self._wrap_call(self._vtk_obj.SetInput, deref_vtk(obj)) self.trait_property_changed('input', old_val, obj) input = traits.Property(_get_input, _set_input, help=\"%(doc)s\") """%locals() out.write(self.indent.format(trait_def)) # Now wrap the set_input and get_input. self._write_tvtk_method(klass, out, vtk_get_meth) self._write_tvtk_method(klass, out, vtk_set_meth, set_sig) else: self._write_property(out, 'input', vtk_get_meth, vtk_set_meth) def _write_get_input_connection_method(self, klass, out): """Write the set/get_input_connection method. This method needs needs to be wrapped as a property and a method for convenience. `klass` is the class for which the method is being wrapped, `out` is the output file. """ vtk_get_meth = getattr(klass, 'GetInputConnection') vtk_set_meth = getattr(klass, 'SetInputConnection') doc = "The first input connection for this object, i.e. the result of `get_input_connection(0, 0)`." trait_def = """ def _get_input_connection(self): if self._vtk_obj.GetTotalNumberOfInputConnections(): return wrap_vtk(self._vtk_obj.GetInputConnection(0, 0)) else: return None def _set_input_connection(self, obj): old_val = self._get_input_connection() self._wrap_call(self._vtk_obj.SetInputConnection, deref_vtk(obj)) self.trait_property_changed('input_connection', old_val, obj) input_connection = traits.Property(_get_input_connection, _set_input_connection, help=\"%(doc)s\") """%locals() out.write(self.indent.format(trait_def)) # Now wrap the set_input_connection and get_input_connection. self._write_tvtk_method(klass, out, vtk_get_meth) self._write_tvtk_method(klass, out, vtk_set_meth) def _write_tvtk_method(self, klass, out, vtk_meth, sig=None): """Write a generic tvtk_method to `out`. Parameters ---------- - out : file like object - vtk_meth : VTK method The VTK method to wrap. A docstring is extracted from this. - sig : Signature of vtk_method (default: None) If None, this is computed. If not, the passed signature information is used. """ if sig is None: sig = self.parser.get_method_signature(vtk_meth) # VTK 6.2: There exists no method signature for false built in # functions/methods if sig is None: return # Figure out if we really need to wrap the return and deref # the args. ret_type, arg_type = self._find_sig_type(sig) vtk_m_name = vtk_meth.__name__ name = self._reform_name(vtk_m_name, method=True) if keyword.iskeyword(name): name = name + '_' method_affects_input = vtk_m_name in ['AddInput', 'RemoveInput', 'RemoveAllInputs', 'SetInputByNumber'] method_needs_update = (vtk_m_name in ['InsertNextCell'] and klass.__name__ in ['vtkCellArray']) if arg_type is None: decl = 'def %s(self):'%name body = "" if method_affects_input: body += "old_val = self._get_input()\n" if ret_type in ['vtk', 'array']: body += "ret = wrap_vtk(self._vtk_obj.%s())\n"\ %vtk_m_name else: body += "ret = self._vtk_obj.%s()\n"\ %vtk_m_name if method_affects_input: body += "self.trait_property_changed('input', old_val, self._get_input())\n" body += "return ret\n\n" else: decl = 'def %s(self, *args):'%name if arg_type == 'vtk': body = "" if method_affects_input: body += "old_val = self._get_input()\n" body += "my_args = [deref_vtk(x) for x in args]\n"\ "ret = self._wrap_call(self._vtk_obj.%s, *my_args)\n"\ %vtk_m_name if method_affects_input: body += "self.trait_property_changed('input', old_val, self._get_input())\n" elif arg_type == 'array': arr_sig = self._find_array_arg_sig(sig) body = "my_args = deref_array(args, %s)\n"\ "ret = self._wrap_call(self._vtk_obj.%s, *my_args)\n"\ %(arr_sig, vtk_m_name) ########################################################## # When a cell is inserted, number of cells is not updated. # Fixes GH Issue 178. ########################################################## if method_needs_update: body += "self.update_traits()\n" else: body = "ret = self._wrap_call(self._vtk_obj.%s, *args)\n"\ %vtk_m_name if ret_type in ['vtk', 'array']: body += "return wrap_vtk(ret)\n" else: body += "return ret\n" self._write_generic_method(out, decl, vtk_meth, body) def _write_generic_method(self, out, decl, vtk_doc_meth, body): """Write out a method given the declaration, `decl`, the VTK method, `vtk_doc_meth`, from which the docstring is to be extracted and the code body, `body`. Each of these is set as per the current indentation level. output is written to the `out` object. `vtk_doc_meth` could also be a string, in which case the string is used directly. """ if type(vtk_doc_meth) is str: doc = vtk_doc_meth else: # Must be a method so get the docstring. doc = self.dm.get_method_doc(vtk_doc_meth.__doc__) indent = self.indent out.write(indent.format(decl)) indent.incr() if doc: out.write(indent.format('"""\n' + doc + '"""\n')) out.write(indent.format(body)) out.write('\n') indent.decr() def _write_trait(self, out, t_name, t_def, vtk_set_meth, mapped, force_update=None, broken_bool=False): """Write out a complete trait definition to `out`. Parameters ---------- - out : File like object. - t_name : `string`: Name of the trait. - t_def : `string` : Trait definition. - vtk_set_meth : VTK setter method. - mapped : `bool` : Specifies if the trait is mapped. - force_update : `string` or `None` : force_update argument. - broken_bool : `bool` (default: `False`) If `True` the bool method does not have a 'Set' method and must be handled specially. In this case make sure that the vtk_set_meth points to the 'Get' method. """ changed = '_%s_changed'%t_name vtk_m_name = vtk_set_meth.__name__ map_str = '' if mapped: map_str = '_' force_str = '' if force_update is not None: force_str = ', %s'%force_update # Fixing the trait definition in order to handle the help trait. if t_def.endswith(')'): t_def = t_def[:-1] + ', help=\\' else: t_def += '(help=\\' trait_def = '%(t_name)s = %(t_def)s'%locals() if broken_bool: msg = "If broken_bool is true, make sure vtk_set_meth "\ "is of form 'GetProp'" assert vtk_m_name[:3] == 'Get', msg vtk_on_name = vtk_m_name[3:] + 'On' vtk_off_name = vtk_m_name[3:] + 'Off' changed_def = """ def %(changed)s(self, old_val, new_val): def _bool_change(val, obj=self._vtk_obj): if val: obj.%(vtk_on_name)s() else: obj.%(vtk_off_name)s() self._do_change(_bool_change, self.%(t_name)s%(map_str)s%(force_str)s) """%locals() else: changed_def = """ def %(changed)s(self, old_val, new_val): self._do_change(self._vtk_obj.%(vtk_m_name)s, self.%(t_name)s%(map_str)s%(force_str)s) """%locals() indent = self.indent # First write the trait definition. out.write(indent.format(trait_def)) # Write the help docs. doc = vtk_set_meth.__doc__ self.dm.write_trait_doc(doc, out, indent) # End the function definition. out.write(indent.format(')')) out.write('\n') # Write the handler method. out.write(indent.format(changed_def)) out.write('\n') def _write_property(self, out, t_name, vtk_get_meth, vtk_set_meth, multi_arg=False): """Writes out a traited property to `out` given the trait name, `t_name`, the VTK get method, `vtk_get_meth` an optional VTK set method for read-write traits as, `vtk_set_meth` plus a boolean value for `multi_arg`. If `multi_arg` is True, the setter is treated as if it accepts a list of parameters. If not the setter is treated as if it accepts a single parameter. """ indent = self.indent getter = '_get_%s'%t_name vtk_get_name = vtk_get_meth.__name__ sig = self.parser.get_method_signature(vtk_get_meth) ret_type = self._find_return_type(sig) if ret_type in ['vtk', 'array']: trait_def = """ def %(getter)s(self): return wrap_vtk(self._vtk_obj.%(vtk_get_name)s()) """%locals() else: trait_def = """ def %(getter)s(self): return self._vtk_obj.%(vtk_get_name)s() """%locals() out.write(indent.format(trait_def)) if vtk_set_meth: setter = '_set_%s'%t_name vtk_set_name = vtk_set_meth.__name__ sig = self.parser.get_method_signature(vtk_set_meth) arg_type = self._find_arg_type(sig) if multi_arg: if arg_type == 'vtk': trait_def = """ def %(setter)s(self, *args): old_val = self.%(getter)s() my_args = [deref_vtk(x) for x in args] self._wrap_call(self._vtk_obj.%(vtk_set_name)s, *my_args) self.trait_property_changed('%(t_name)s', old_val, args) """%locals() elif arg_type == 'array': arr_sig = self._find_array_arg_sig(sig) trait_def = """ def %(setter)s(self, *args): old_val = self.%(getter)s() my_args = deref_array(args, %(arr_sig)s) self._wrap_call(self._vtk_obj.%(vtk_set_name)s, *my_args) self.trait_property_changed('%(t_name)s', old_val, args) """%locals() else: trait_def = """ def %(setter)s(self, *args): old_val = self.%(getter)s() self._wrap_call(self._vtk_obj.%(vtk_set_name)s, *args) self.trait_property_changed('%(t_name)s', old_val, args) """%locals() else: if arg_type == 'vtk': trait_def = """ def %(setter)s(self, arg): old_val = self.%(getter)s() self._wrap_call(self._vtk_obj.%(vtk_set_name)s, deref_vtk(arg)) self.trait_property_changed('%(t_name)s', old_val, arg) """%locals() elif arg_type == 'array': arr_sig = self._find_array_arg_sig(sig) trait_def = """ def %(setter)s(self, arg): old_val = self.%(getter)s() my_arg = deref_array([arg], %(arr_sig)s) self._wrap_call(self._vtk_obj.%(vtk_set_name)s, my_arg[0]) self.trait_property_changed('%(t_name)s', old_val, arg) """%locals() else: trait_def = """ def %(setter)s(self, arg): old_val = self.%(getter)s() self._wrap_call(self._vtk_obj.%(vtk_set_name)s, arg) self.trait_property_changed('%(t_name)s', old_val, arg) """%locals() out.write(indent.format(trait_def)) t_def = "traits.Property(%(getter)s, %(setter)s, help=\\"%locals() else: t_def = "traits.Property(%(getter)s, help=\\"%locals() trait_def = """%(t_name)s = %(t_def)s"""%locals() out.write(indent.format(trait_def)) doc = vtk_get_meth.__doc__ self.dm.write_trait_doc(doc, out, indent) # Close the function definition. out.write(indent.format(')')) out.write('\n') def _write_trait_with_default_undefined(self, klass, out, vtk_attr_name): name = self._reform_name(vtk_attr_name) vtk_get_meth = getattr(klass, 'Get' + vtk_attr_name) vtk_set_meth = getattr(klass, 'Set' + vtk_attr_name) # `patch_default` use the Get and Set method to propose a default # However we are only using it to get the trait type value_for_type = patch_default(vtk_get_meth, vtk_set_meth, None) if value_for_type: # we should not set the default to arbitrary value without # further information. We will set the default as Undefined # or a tuple of Undefined if type(value_for_type) in (tuple, list): default = "({})".format(", ".join( ("traits.Undefined",)*len(value_for_type))) else: default = "traits.Undefined" trait_type, _, kwargs = get_trait_def(value_for_type) t_def = ('traits.Trait({default}, ' # traits.Undefined '{trait_type}({kwargs}), ' # the new default trait 'enter_set=True, auto_set=False)').format( default=default, trait_type=trait_type, kwargs=kwargs) self._write_trait(out, name, t_def, vtk_set_meth, mapped=False) else: # we cannot determine the type message = 'We cannot determine the trait type of {}.{}' raise TypeError(message.format(klass.__name__, vtk_attr_name)) def _write_trait_with_range(self, klass, out, vtk_attr_name): default, rng = self.parser.get_get_set_methods()[vtk_attr_name] # If the default is just a little off from the range # then extend the range. if (default < rng[0]) and (rng[0] - default) < 2: rng = (default, rng[1]) if (default > rng[1]) and (default - rng[1]) < 2: rng = (rng[0], default) # Sometimes the default is not in the valid range to # perhaps indicate that the class is not initialized if (default < rng[0]) or (default > rng[1]): t_def = 'traits.Trait(%(default)s, %(default)s, '\ 'traits.Range%(rng)s'%locals() t_def = t_def[:-1] + ', enter_set=True, auto_set=False))' else: t_def = 'traits.Trait(%(default)s, '\ 'traits.Range%(rng)s'%locals() t_def = t_def[:-1] + ', enter_set=True, auto_set=False))' name = self._reform_name(vtk_attr_name) vtk_set_meth = getattr(klass, 'Set' + vtk_attr_name) self._write_trait(out, name, t_def, vtk_set_meth, mapped=False) # ------------------------------------------------------ # Traits that need special handling # ------------------------------------------------------ # To add a trait for special handling, # add an item to the `special_traits` below, # then add a method that handles the trait. # The method name should be referred to by the `special_traits` # mapping. # special_traits = { # expr: (updateable, allow_to_fail, name_of_method) # } # where # `expr` is a regular expression pattern for matching # {vtkObject}.{Attribute} # `updateable` is whether the trait should # be in the `updateable_traits` tuple, # `allow_to_fail` is whether the trait should be in the # the `allow_update_failure` tuple # `name_of_method` is the name of the method for writing # the code for this trait, # i.e. getattr(self, name_of_method)(...) special_traits = { '[a-zA-Z0-9]+\.Output$': ( False, False, '_write_any_output'), '[a-zA-Z0-9]+\.Source$': ( False, False, '_write_any_source'), '[a-zA-Z0-9]+\.ScalarType$': ( False, False, '_write_any_scalar_type'), # In VTK > 4.5, Set/GetInput have multiple signatures '[a-zA-Z0-9]+\.Input$': ( False, False, '_write_any_input'), '[a-zA-Z0-9]+\.InputConnection$': ( False, False, '_write_any_input_connection'), '[a-zA-Z0-9\.]+FileName$': ( True, False, '_write_any_something_file_name'), '[a-zA-Z0-9\.]+FilePrefix$': ( True, False, '_write_any_something_file_prefix'), 'vtkImageReader2.HeaderSize$': ( True, False, '_write_image_reader2_header_size'), # PropColorValue is not initialised, GetPropColorValue # gives random values as a tuple of float[3] that are 'vtkHardwareSelector.PropColorValue$': ( True, True, '_write_hardware_selector_prop_color_value'), # In VTK 5.8, tolerance is initialised as 0 while the range # is 1-100 'vtkAxesTransformRepresentation.Tolerance$': ( True, True, '_write_axes_transform_representation_tolerance') } @classmethod def _get_special_matched_key(cls, klass, vtk_attr_name): """ Return the key in `special_traits` that matches klass.vtk_attr_name using regular expression Parameters ---------- klass : class VTK class vtk_attr_name : str VTK class attribute name Returns ------- key key is None if nothing matches """ full_name = ".".join((klass.__name__, vtk_attr_name)) for re_expr in cls.special_traits.keys(): if re.match(re_expr, full_name): return re_expr else: return None @classmethod def _get_special_updateable_failable(cls, klass, vtk_attr_name): """ Return (updateable, failable) for the klass.vtk_attr_name Parameters ---------- klass : class VTK class vtk_attr_name : str VTK class attribute name Raises ------ ValueError if klass.vtk_attr_name does not match anything in `special_traits` """ key = cls._get_special_matched_key(klass, vtk_attr_name) if key is None: message = '{0}.{1} does not have a special method for get/set code' raise ValueError(message.format(klass.__name__, vtk_attr_name)) return cls.special_traits[key][:2] @classmethod def _is_special(cls, klass, vtk_attr_name): """ Returns True if klass.vtk_attr_name matches anything in `special_traits` Parameters ---------- klass : class VTK class vtk_attr_name : str VTK class attribute name Returns ------- boolean """ full_name = ".".join((klass.__name__, vtk_attr_name)) return re.match('|'.join(cls.special_traits.keys()), full_name) is not None def _write_special_trait(self, klass, out, vtk_attr_name): key = self._get_special_matched_key(klass, vtk_attr_name) _, _, method_name = self.special_traits[key] getattr(self, method_name)(klass, out, vtk_attr_name) def _write_any_output(self, klass, out, vtk_attr_name): self._write_get_output_method(klass, out, set=True) def _write_any_source(self, klass, out, vtk_attr_name): self._write_get_source_method(klass, out) def _write_any_scalar_type(self, klass, out, vtk_attr_name): """ This method does nothing """ pass def _write_any_input(self, klass, out, vtk_attr_name): self._write_get_input_method(klass, out) def _write_any_input_connection(self, klass, out, vtk_attr_name): self._write_get_input_connection_method(klass, out) def _write_any_something_file_name(self, klass, out, vtk_attr_name): name = self._reform_name(vtk_attr_name) vtk_set_meth = getattr(klass, 'Set' + vtk_attr_name) t_def = 'tvtk_base.vtk_file_name("")' self._write_trait(out, name, t_def, vtk_set_meth, mapped=False) def _write_any_something_file_prefix(self, klass, out, vtk_attr_name): name = self._reform_name(vtk_attr_name) vtk_set_meth = getattr(klass, 'Set' + vtk_attr_name) t_def = 'tvtk_base.vtk_file_prefix("")' self._write_trait(out, name, t_def, vtk_set_meth, mapped=False) def _write_image_reader2_header_size(self, klass, out, vtk_attr_name): if vtk_attr_name != 'HeaderSize': raise RuntimeError("Not sure why you ask for me! " "I only deal with HeaderSize. Panicking.") default, _ = self.parser.get_get_set_methods()[vtk_attr_name] # The documentation of vtkImageReader2.GetHeaderSize says # it returns `int`, but really the API meant `long` # matters for Python 2 if PY_VER < 3: default = long(default) t_def = ('traits.Long({default}, ' 'enter_set=True, auto_set=False)').format(default=default) else: t_def = ('traits.Int({default}, ' 'enter_set=True, auto_set=False)').format(default=default) # trait name name = self._reform_name(vtk_attr_name) # vtk set method vtk_set_meth = getattr(klass, 'Set'+vtk_attr_name) self._write_trait(out, name, t_def, vtk_set_meth, mapped=False) def _write_hardware_selector_prop_color_value(self, klass, out, vtk_attr_name): if vtk_attr_name != 'PropColorValue': raise RuntimeError("Not sure why you ask for me! " "I only deal with PropColorValue. Panicking.") # FIXME: Don't we need to tell the vtk object that we set it # to some value? t_def = ('tvtk_base.vtk_color_trait(' '(1.0, 1.0, 1.0))') # trait name name = self._reform_name(vtk_attr_name) # VTK set method vtk_set_meth = getattr(klass, 'Set'+vtk_attr_name) self._write_trait(out, name, t_def, vtk_set_meth, mapped=False, force_update='False') def _write_axes_transform_representation_tolerance(self, klass, out, vtk_attr_name): if vtk_attr_name != 'Tolerance': raise RuntimeError("Not sure why you ask for me! " "I only deal with Tolerance. Panicking.") default, rng = self.parser.get_get_set_methods()[vtk_attr_name] if is_version_58(): message = ("vtkAxesTransformRepresentation: " "tolerance not updatable " "(VTK 5.8 bug - value not properly initialized)") print(message) default = rng[0] t_def = ('traits.Trait({default}, traits.Range{rng}, ' 'enter_set=True, auto_set=False)').format(default=default, rng=rng) name = self._reform_name(vtk_attr_name) vtk_set_meth = getattr(klass, 'Set' + vtk_attr_name) self._write_trait(out, name, t_def, vtk_set_meth, mapped=False)

fa>E>2>??L;?7g}?z?s9!?H???e??aDƿm𵿐,cbw:khplGP7m*g,9عk辟`Ԅܽ>8=,>#!>?ĭ>?<-?!:?b?H5'33Qc0.uѿ[.¨ QEN6˿v e ~:P]S44燿]_^a22Ҿۃi=B>^=5󼌾Ic=ovrcv߿+L&"C{4 oH +ؿȲⲥ~ C"v^3qY2y?)C5EMFQ@HO.D4Fv #,7ef uE"F9v K`ءRGLe%Wه aN{<^Iv!i~\deNFd w &^ySwNl) @Ji݇?dm0 JtT[rn,5̗:PjMo\Aiv{"Pj^ Gnhʐ>21_^f1?bu=o+>sľKfcEgɽFlޣA (+%|80?s@<kCmB[? B6<ߧ'31}$ y44 5){`TN\\>ih2QFF Iί aB87EgvZiv&dadv&gvZiB87Eaί QFF IϿwt۲Y?t?w???czԎ^7@2z?7A?`?ԑ?~?hg Ͽ?-2~??-??@ @hDgͿ&561<?&56??g@@C2bU2{ >V?b??2?信2տs$پl02*>0>a?$?s?2Ѿ삥 /I=>%;=U3U%N,> /*>삕>)??@F?(G>L3bL(G @Fп̾)?V}I?9I?Zf?Y?X3WYZh9KV}O??=&??'?=03)=.'='?=?G??s_?R3iſR s_G=?rv??!?~?H3>g:H~ ֿrv?v?~? ?6? 2 5 {u?"?c??lJ?;uGEd<>T?/?-?VZ?z?ȿῂ^OfMо9<>?!?RK???g?Uz>:!;rS`; >8o?c?9t,;6y?9?C?ى?L?5 <V0׫jr?m%俫yo*G<>?5;?xl?\??7?޸%e<Z <>|?o?r?Ī4?`?d?=?*E?^O?!???@ ӿ}r=M7?D?J ?.L?җ@P?,c?9?;=*/쫿Ѷ=<?0(=?}?WP @@|?ۑ?q?0 =>DkD<0uҔy7)]=?!?mb?x}?Ŗ6?q@u@ ƿ"Ҭm8d]V=O?(1??Sy???Qj??2= {ſT!m= ?.%?g?$Ld(?p?տ??j6?/=tH Gj:#kĦgs MNվ{ף/>k?U?f??*4?&?⤐? ]xe$3>p??}?.?o??}?lQ?k>-?4*?q]k>d% ?"?+?f]߃ >h>.TwؾX OA U_7P-ԨO-祖>c$M>YY?([?\Z?a?m??kX?ۿ-Կ ݽ$h&>k >dS?$D?W_???Q??V"?>B>[b=ӿ5x>??jL?2>A(?> >?v=>(>e>l>>j|=@о[M~w>Ok>p>GC?=?7?M(V?_V?i?oc?ty1?c?Ue?8>_>}d>\?) ?BX?MN?Ks?Dv?M{?3?g>ɷ>C>X?NQ??>8? ,?AO?0?%??;h?%6ó:mA5=>z?N*?z 8?S=?n*I? D?B?l? ??}?E?8?k????lN?3`>>h~?w?:e?Ak?p?X?&r??dZ?>>a6==>&?[?h?9<@@)@@ @<@ 8g?r?a?b?ş=>O?K$q?\?u?S@ @?I??D6?c@a@o䴍KR\>Q>x?;?c?@@@?@P@-"@GB@Q@e]@mj@k֖@c7@R@:@ @E@?&?o>u`@9@R@d@l@b@RnZ@.@>?a?hB=X>G>mk?ܬ@ڎ@%SO@/1@C@`l@=[@[??{@S@Rcݾ&5&}Jlc?ͩ?@ 6A@#6@?@8(#@!@=o@jX@ b@U@:c@@@'@A@>@S@c=@*K?P?Y d@q @%@@@B@(@V@Vٹ@:`-?w??L9?{?`j@60^@[T@b@}j@U@@Z~S@@]@@j>r6Ӿ2ݕ=d?{e?@#@82@Zϯ@W@%ee@vz@/D@@ҸK@@@3@@o@@@@ @G|?֛@S@U@V@ڡ@f@Ԥ7@@J@\@L??K?d@67@qS@a@ϳ@@ķ@&w@ts@gw@gh@l@-?Rd_?]??Yn?_Z?B@@0EU@71@Zf@`.+@D[@4@@IA|A,A&OA*A,6A$3A1A s@ ,@@K@1.u@@瑾AtA[AA @$@@@?@-θ@?f@;_@@@B@/@,@]@@\@@8@7@@t@ٿ@!@!.>@]@'O@1@)q@@#׭@$5@!@ޕ@MAA3ACQAN7AW'A_bAW~AN#ACA3JAL@髯@z@D}@AIAA"A-`A!hAA7'@İ@K@@K@S@@Ű@@]A:MA[A @n@A T@C!clJuG>g>Usٻ&d9 ſ!RK쿘gUz:"r>?S??`ͻ/8ocп9t>,;?6y4?ىL5 7?0??׫?jv??q?%???y?o?*>G󒾵5;xfY3 ?޸(? ??e<>Z {orĪ1`dڿ;*匼pi?# ? ?1? }J?h?|C( yK!Ab0O E^O!ÿ ????}>rM7DJ .LҗP,c9;?*/??Ѷ?޽<0(>}ϿW??P |ɿۑq0 >D??k?@D@<@?0t?Ҕ?y??7(>]!mbx}Ŗ6qu ?"?Ҭm?8?d>]VP(1ȿSyɿQj2Ž? {??T?!m.%g>$L?d(sտj6/p>H ?G?j?: ?h??Ħe?s?K?N>|=ף1kUfѿ*5'⤒?? Z?x`?$>3˾p}/oѿ}lQk-=>4?*?q??]fd%"+ƿf>]߅? =R1,׿=Ek.Q<4>w>W?O9? ?U?_7I?-Ԡ?>O!=$gȾk dR$CW`?SĿV"Bվ[aӿU=>>xԭǿjO2A>7:d>A>4;zN*z :S?n*Q QB+l Կ}E8kɿꍿlN3_ھhw:gAmrX&rdW>a5&Zh9=}ǿr+6[ܿN.>k?0;I?)4>dKE8Ϳ{SOqMb,# R9G58}J濡=6\+ ˀ< 8gq^_=şݽOK$o[tS HD6c`o>䴔?KR^?>>Qxݿ;c>P-$GBQe]mjk֖c7R: E<&o߾uC9RdlbRnZ.&6?&}?J>lhͦ 6A#6?8($"=ojX cU:e'A=Sc:*HPY \q!&B(VVٸ:`*wӿ L9{ȿ`g60][Tb}kVZ~S\jr6>>2ݣdz{e#82ZϯW%efvz/EҸM3oG|֛SUVڡfԤ6I\L⚿Hd67qSaϳķ&wtsgwgfl.RdZ]~?Yj_WB0EU70Ze`.+D[4J|,&O*,6$31 r ,~K1.s瑾t[ #?-η?f;^B/,][87@tٿ!!.>]'O1)q#׭$5!ޕM3CQN7W'_bW~N#C3JL髯zD}I"-`!h7'İKKSŰ]:M[ n TC>??7$?4'uC8?񭿶><\Y@]C@VAAM+/AtA6%AA+AA+AA6%AtAM+/A@V@]C@]C@]C@V@VAAAM+/AM+/AtAtA6%A6%AAA+A+AAA+A+AAA6%A6%AtAtAM+/AM+/AA@V@V@]C@]C57%>C8?>u>=&>\Y??>oN?YI? ?r@&@8U@M9 @[Z@cg@d<@^(e@Q_@>B+@%W\@[?z?>e@ I>ݷ@O!? @jj@G"@4A vA+xAE$AZ.AgAnAmAf" AWUWAAdA&Aq%@?M@'%^@m2@@ї@J@յv@ޝu@@@n@@D@ @Tj@i@f@@mGAvAVA#~A) A+A'3AU$A@-@@L@ >?m?(@ܰ@4@O"@c7@p]@v2&@t@k{(@[J@Dv'@'@?ff?[??ȅ?؉@6@&@2a@ @AtA=?2AVJAh;AtGVAxNAtSAiAWɩA?.A @(@@r@`c@@B@ˀ@ދ@C@g@0@^@@Uh@֞@~M@4N@g4m@@?gA AӀA(;A1A5]A3b,A+fAOA @s@-@?[7?FN@ f0@.wT@M>@eZ@wY@@n@@}>@px@[,@@n@:Y?V?)? ?bg?X4@/?%@S@ z@^A~A)-AGA_ApAzܸA}AwAj AVRA<A7@<@@K@-@ˠ@ij@⍑@rN@W@}@@މ@Ѩ@@@^@ A@*@AAr A(~A4A;;A<tA7>A,ԍA+MA?@Je@I@VU]CVM+/t6%++6%tM+/V]C]C]CVVM+/M+/tt6%6%++++6%6%ttM+/M+/VV]C]CoPYI r&8UM9 [Ycgd<^(eQ_>B*%W\[ze IݷO" jjG"4 v+xE$Z.gnmf" WUWAd&q%࿸M'%^m2іJյvޝunC TjifmGvV#~) +'3U$-@L m(ܰ4O"c7p]v2&tk{'[JDv''տff[տֿȅ؉6&2a t=?2VJh;tGVxNtSiWɩ?. (r`cBˀދBg0^Ug֝~L4Ng4m?f Ӏ(;15]3b,+eO s-[7FM f/.wTM>eYwY@n}>px[,@n:YV) bgX4/%S z^~)-G_pzܸ}wj VR<7,ԍ+M?JdIVUd^> ?n#Խ/>\ؙ>d>6>!=߬Nw> >M>>:\:>v{??9?u?h-?l@]C@VAAM+/AtA6%AA+AA+AA6%AtAM+/A@V@]C@]C@]C@]C@]C@]C@V@V@V@V@VAAAAAAM+/AM+/AM+/AM+/AM+/AtAtAtAtAtA6%A6%A6%A6%A6%AAAAAA+A+A+A+A+AAAAAA+A+A+A+A+AAAAAA6%A6%A6%A6%A6%AtAtAtAtAtAM+/AM+/AM+/AM+/AM+/AAAAA@V@V@V@V@V@]C@]C@]C@]C@]Cn$ >`?dd\ؙ=/>=Nw߫!6:\:L {ÿ ӿ~v;lh-u?9?e?g@"\@B@] I@p}@}^z@W@@tQ@b@I@)Ѹ@wE?k@J?^P@\r?{@AA)JAFA]An1AwkAy!8AsDAf?AQA7)A@o@@o.@@@7@H@k@@@@_@.C@c@@:?lB@\i@`AMA9A*ohA5/A:n*A:LA3A(eA1Az@@@8;l?k?@@$zR@>@S@a@iP@i@bӜ@U$P@@l@&m@u?D?yd >V??<@ps?j@=x@@@&A!A?5AWAhiArXAuEAqAe!ARHA9 A/@G@L@B!m@@ @I@Ը@JF@@y@@B#@"c@@@M@@\@˫@X AA}A+bA2[A3XA/,A%A&$A@v@@V?F ?]?';@R@0G@DU@R@Z@[@Va@J@8|@!n@{?]?>?8?o@ ?ы@1#@@L@AA;vASAe9AAofAs6AoAcAQh@A8Az@/@ @,j@r{@L@M@Ȓ@׽@[@(`@@K@%@0@'@QՔ@@@b@8A AA&( A-VA/@A+ A#6AkA|~@ڵ@̵@_5?.n?c?.@P @"!@8@HR@R@VZ@S@JF@;@h@&G@ B??%?!K?&? @,=?ܑ@3.@]@@]AA;ARAd&AnAqAmqAb2$AO_A7[.A4@6@@R@acL@*@B@%@*@@@5@@@@ @ZN@@vJ@v@cA7A)A#'A*}A-A*&A!HAA[@ڧ@l@cP?l?׳?@t@/@@A@M@SD@RO@KY*@>A@*a@??D?JJ>a??z??c@@9@@:AA6=AOAa+Am#AqfAn6Ad~AScA;ܕA!@#@u@##[@g{@e@$@@Ц@d@ۇ@C@[@3@ @A@O@ 2@i?@0 @܌AAA!3A)}A,_MA)VA"6 AA|@ޥT@@nc羙->??fw ??^@ @5@I/N@Va@]@]0@VH\@I@5l@ ?:?4?Z̏?@ V? @am?t@@A_A%AAZAWqAfAoAp.AiA\AHA.m}As@jZ@U@@IK@@l@u@q@r@EY@܍Y@!@ @Đ @`@H@o@+@}7@r@m)AKA(A"A)#A+A(4A|A A'C@Կ;@@W|]CVM+/t6%++6%tM+/V]C]C]C]C]C]CVVVVVM+/M+/M+/M+/M+/ttttt6%6%6%6%6%++++++++++6%6%6%6%6%tttttM+/M+/M+/M+/M+/VVVVV]C]C]C]C]Ceg"\B] Hp}}^zWtQbI)ѸwESaiPibӛU$O@l&muDyd V<psj=x&!?5WhirXuDqe!RH9 /GLB!m IԸJFyB#"bM\˫X }+b2[3X/,%&$vVF ]';R0GDURZ[V_J8{!m{\8o ы1#L;vSe9Aofs6ocQh?8z/ ,jr{LMȑ׽[(_K%0'QՔb7 &( -V/@+ #6k|}ڵ̵_5.mb-P "!8HRRVZSJE;@g&G B%!K& ,=ܑ3.]];Rd&nqmpb2#O^7[-46RacK*B%*4 ZNvJvc7)#&*|-*%!H[ڧlcPlײs/?AMSDRMKY(>?*_鿫CJJaٿz¿ÿc996=Oa*m#qen6d~Sc;ܕ!#u##[g{e"ЦdۇBY1 @O 2i?0 ܌!2)|,_L)U"6|ޥSnc>-?fw漿Z 5I/KVa]].VHZI5j:ڿ3Z̎ V amt@_%AZWqfop.i\H.m|sjZUIK@ktqrEW܍W! Đ_Ho+}7rm(J(")"+(3| 'BԿ;W|{4MS4 k:}4{4}: k 4MT7u[XJt3&^5CPuݘ]Fϵ6 d(BU= Ơ|:tdE1 ,$D Ҋ  r-҉$KV*_7*Nb9C|1.2O1Sݷ8`.nHjR? MLZDozվ{˾}Ǿվv~~t~De*۾~|T L4U d k;Q~T O1<I71 % l8;~H*F? q?eܖY䁋E(7M  {FEr;:IfX< # ] L "iQSZ,  Z8k49Q^QY r  -e7 t=P (Gk I e;<fPhB  l ma4`]PLYC )  diK:DZac4Q;KA B  c6Ëm䕲QKUh G  Y#VlKgY ˢ  NN0 ߂_3HU c  KuIJ(A䈁HdH xDFT_K_{= x + ql?`5eL!7 mY<~S2 [JXu[C^5t3'ݘPu6ϴ]F(d | Ơ=BUE1dt: $D, $K-҉ rҊ *N7*_V1.C|9b8`SݶO12? jRnH.DoZMMt3Bt3t4t5it6 t5t5vt5t4t5 t5gt5t6t5t4t3t3a^D^\CC3!2ù"J^^_`$`z```~`|``z`7__*^C6CBCjDIEFGGFFEDaCCwCbPuPv PvPwPydP{UP|P}7P}P|P|xP{;PyPxaPwPvPv"޻ݘݘݘݗ(ݖݙݡݩݭݭ ݬݩݡݚݗݗݘ n REޱާ+9er.qT]]]]]]]]x]4]D]]]N]] ]]2]}!ϑB67L779>PIwUFYaXXTIo?5;D98TzK!6!X +ϵ@D"!֋BZPƉ>bW b df )))*-07>A@J@>d71b.,* ^ zg]ft veNfjpyG]y^q)ljgAA@AAD(HKvLLKJ'G?DCC`C=B<> ] t|}|~|yKaf~<=@$EALSV)UTQKFSSS&S1S;.. ..Z.....!..%.R._.i....(nHnIjÃj|??????????o??M?T???N?nJnMnQnT3nTnSnQnPnQnSxnU(nU4nS4nOnL-j jjjjЩjj͓j:j4jgjjXjjfjMM^MMvM'MMgM6MMMMMM$MMMF݇Dp+DpDrYDvDzD~D}/DyDvDvDw0DzD~DD{Dw/Ds'˳\m6ͱRɥ1ixS%y߸u\u^ucNugcui)ugmucuau`Huauduhujuhucu_\u\E#YKKKbK K KK KK!KKK KK[K LKLKʳkƄ ˢ̸=G?I9.YRbAxzվ{ʾ}Ǿվv~~t~De*۾~|T["3T~< mZ 7 Lg5?` ql , x={K_\THD x HdHA*KJKu  cU H1_߄ 0NN  ˢYgKnW#Y  GUhJQ䕱oÌ6c  BKAQ;3caDZ:Kdi  )CYPL]4`a m l BPhf;<e I Gk(P >t 7e -  rQYQ^:4i8Z  Z,SQi L ] #X<If;;pDF {  M8E(䁍Yܔ?e q ?F)G~; l8 %71I>/O~S;Q k d4UL t3Bt3t4t5it6 t5t5vt5t4t5 t5gt5t6t5t4t3t3a^D^\CC3!2ù"J^^_`$`z```~`|``z`7__*^C6CBCjDIEFGGFFEDaCCwCbPuPv PvPwPycP{UP|P}7P}P|P|xP{PIwUFYaXXTIo?5;C98S{K!6!X *϶@D"!֋AZQƉ>bV c df )))*-07>A@J@>d71a.,* _ zg]es ueOfjpyG]y^q(ljgAAAAAD(H KwLLKJ'G?DCC_C=B<> ^ t|}|~|yKaf~<=@'EBLSV*UTQKF;C.A@& Ʊ .   T ڦ 0 - ӓ B w 99 8:/$E$G$Lg$R)$X$\$\$Z$ZX$Yf$V$S$PB$L$Id҈҈҈ZҊ3ҍҒOҕ^ҕҔғґrҏzҍҍgҍҌAҋ; --Ԧ$$$$A$$+$o$$$v$ӻ$$?$y$ͩ$$ p ogg<Q) --t--<--.----- --|-~-*Gu=  -}  ] P m*^B*`]77*N-*Q*PS*V*_*h *mN*l*g*d*dD*g *iR*i**e*^*V*^o*` *c*f*j*l *kM*i*h*h*h*gD*f0*db*b<7*7777G7'77H7777g7C7!7b:aabdJfCgggHffe$dgdccvc9s92C{C~m111T11'1.1210d1+*1'1'1++1.101-V1&1 -99999.9r99V999-9v9q99C|CCCCC+CCeCCCCCChCt223}467g8"8777h66V5433@O1O2STS888W888888I88{888f8I8 8[O27O3O6qO9=O;OZlºˌy.W 6| yή]` qLSh]859KdbBݑ[B>R%Q9Yف&D‡E d>BQ.a'xtVKwRQ~j/€r%pPR¢ ζ*w~ҷ}l+,!iO|R*p&/Ec-6DQ /ͺppW#.]gP߿7e v0r\A? :QR*sq(-;sbPOUno -(A gQS +x1h%_R7|1‚t(1brT-RƿC *z%fZ%d2Q!ҽٯGŽg>Q\zU7Ÿ*S;KQ濣GyUŸ4 }ԭ`Q꿤{׹4u~qī)YȹVˈ.VAK+ذgˎˎ‡ː?˚˙9ˣO˳˵˫s˵˴'ˣMƧ˙\ą˙ː#”ˎúˏ\]t^a\!r 3各6 哟7m刺b7@6rZ^7\\A]D!D E(W$A?iaޛcޛUDzzd?ޛbޜ?iI"l?$SEugc Bej`9?[eH_~J}UDvE4@DP,|nb3ՑFGլAգ4ՆEզM1հ7Քjn@k;>R>oHxK]vъ}ѽ(Ѷl#)l|ѬU^ ~_ѲmѬJv;l>9 kSq` Az '|_}&adP:D~*"@![tns]rLeQRL\"C [{ˋؔyE(x%^/.P˃ˉɳjP/ ^dH RmmR,5v왊^ asbZe-et{hL~Ss@* c?_XΫΦΝqΙ/ΫSεΨdΦYέΤΨδ՟ΤΒ;ΙlΣrΪ|( p{ z{ 2{ {I I{D |" |0 R|2' |+ j|m {ԕ o{ p?{Y {w { y| ǽ{U&Fス0zĪٽz׽} ztnOUjTJP}Fy@.!罉&轉e!9 ;lߘ.^`%!"[b¥j 8QÿESœ=R$Q|9{Yق'D‡E d>AQ*Z'xtVKwRQyk/€~r%pPR뿠 ζ*w~Ҷ}l+,!iN{R*p&/Ec-6DQ -͸ppW#.]gP߿7b v0r\A? :QR*sq(-ޛbޜ?iI"j?$S9B,CwF^7ݖ`zݗ-f|ݘsݲoݚH.vU_%ap[Bm ݘ)m#ݫ_ݑ\ݔ'^:ݘFdKUi'Ph>Dugc Beja8?\eI_J|VDvE3?DP,|na3ՑEGլ Aգ4ՆEզM1հ7Քjn@l;>S>oHxJ]vъ}ѽ(Ѷk #(l|ѬU^!~_ѲmѬJv;l?9 kSq` @z '|_}&adP:D~*"@![tnt]rLeQRL]"CZ{ˋؓyE(x%^//P˃ˉ ɴjQ/ _dD MmhL'5p왆^asbYe-eu{hP~SsE*cF_]ΫΦΝhuΙ%ΫLεؿΨ_ΦWέΤΨδեΤΓEΙwΣ{Ϊ| _{ y{ { {3 9{4 |" |/ L|2( |+ m|x {Ԥ |{ pN{q {Ǔ { z| ۽{T&Eス/zĪٽzֽ} ztnOUjTJP}Fy@Vm5! 1`& ,v) ,v& 1`5!VmkCU"Ck1UkN(v  (vUkG1bQٿa"=`U>y=`T"YQb i61?8J@r=@.[@r=?8I61 de ;??/ @H@/@@/@H?/3e 8:Nr @@n*@ @E@ @n+@ :NqD'?@K@@@@@@K?D&[N?k@@Yu@S}@"@ַ@"@S}@Yu?kC[M?n@M;@\@p@äh@p@\@M;?nG?L;@.G@Q@#@~@#@Q@.G?L;G5?%@@<2;@[l@eR@[k@<29@?%2N{>7`?d?s?o@?o?s?a>7]NsU>`> ?{?"y?)?"y?z>>`UDVlJȉI5Qu>DBLF.$9T#2?EBA| МGa/̹gp-$Xo|a,4.24^'|U+,Or 9i>+iUOLuɑdXb8<u;z`'9ɥa:C+ ',5:5`w+~WdUI6wWRzUĬR/E_Oy9v)*|>핽h8пMhXn?Bd8OKʄRYxrvoG<^ZGE?@t_?g>`K?@jݿEN?U8??+L?W*?];٫n>@"~@M@[@n@m@T0@$`?@56@4m? @C@1@Aa?rf@V/7@@$ @@@@XP?z{ xʭ>7S57 ` 'Q=Br !?"}^dվg?s@M(9?t!@I@@,@@*@S@K?{VbV9 3 ֿИ_ȿBe;_2}22r?(@RP?o?)??Ƹ?m g?@((@@L@JU@@O@*]?T@7@5v?)@C@2@@Y~?OS@+K @|1@@;i@@|V@,>?V〲$ gn(e7jYu4'Xb? ା;ړ?q??nՑ?,$?|?+r?q@@a@v2K@@u@aA@k?A@ @SI?sy@$s#@@!",?'k@%@8(*@RY@[X@RX@8X@&?,W逿+;`E ɿe0X琿S pү>ƾ>?Cj?7?E??KhQ`C >?B?ޟ@%}@3@:Q@3D@%?S?w./?u?͆?y"? ?A?N?7?|?@9??`?>DK/YobiT!pu(VNɿ*j*sh`.Y><1o ?Θ? ??uL?p?S??&S?}?'r?'Ҵ?fS?@ ?O>^ȝ>3? :??#? ? >ݟW>bEO`Z6bS&oEӾP(=K%rzHA=a>1J=2=>u84>)>ӥ>&>z-==R>,n>??Й? ?c?>t6>vZ>>>j>x>>h>lV&5ڻ ⑽.p #z   5VXڽ\fYcZEBLF.$9T#2?EAA| МG`/̹gp-$Xo|a,3.24^'~U1,Ws 9i>+aUOFuɑdXb8<u<z`'9ɧa:C+ ',5:5}`w+yWdUI6wWRzUĬR)E_O{9v=*{>핽h8MgXn>Bd8OKʅRYxrvmG<^ZGE%? @t\?^>`K?@j!ؿEI?U8??+L?W'?];ٰx>@"~@M@[@n@m@T1@$`?@56@4m?@C@1@Aa?rf@V/7@@$ @@@@XP?zz xʬ>7S47 ` 'Q=Bs !?"^dҾg?=?#?s@M(9?t!@I@@,@@*@S@K?{VbV9 3 տИ_ȿBe;_2}22r?(?RO?o?*??Ƹ?m g?@((@@L@JU@@O@*]?S@7@5v?*@C@2@@Y?OU@+K@|1@@;i@@|U@,>?V޿〱$ fn(e7iYu4'Zc? ૾;ڒ?q??nՑ?,%?|?+t?q@@a@v2K@@u@a@@j?A@ @SI?sz@$s#@@!",?'k@&@8(+@RY@[X@RX@8W@%?,W }(;]B ȿe-W琿S sҳ>ƾ8?Cj?7?E??KhQ`C >?B?ޡ@%~@3@:Q@3D@%?S?w..?u?͆?y$? ?D?O?7?|?@9??^?>DK/Yo\iMpu(UNɿ*j,sl`.Y><2o ?Ι? ??uL?p?S??&S?}?'r?'ҵ?fT?@ ?O>^ȟ>3? :??#? ? >ݟT>bEO`Z)ZS oA;P'BK(r~HACa>1H=1=>u82>)>Ӥ>'>z-==R>,n >??К? ?b?>t4>vZ>>>l>x>>f>lV&5ڻ ⑽.p #z   5VXٽ\fYcZ$9? B 5 : S\ޫpF0J0CUr Oǣ*/$>@t5B ? :ޫ\S : CJ0pF1CCCCLCCCCCCC6CC1C4CCCC JZJepF~pF~860ðâFĞģ8v¢JKpKLDL=KKKKLOLLLDKJpG\pHpIpJpJpIpI1pIpIpJ*pJpJpJpHpG޼=߀߭߻߻j \\,SS1 : :1 :U : : ;( ;3 ;' ; ; ;: ;\ ;x ;q ;9 : :y\i\\H\\\\\\\\\\\'\SkSSTSSSSSSSSSSS3S55566,6;6C6O6X6d6i6k6]6B6 55BB??"BX\3C[a`JB&BKBpBBBBBBBBBBB~BI?(?M?s????????????K$$$$$$$$$%%% $$$$$>>@r@~ >>>>>>'>2>=>F>J>I>?>.>>@w@@@@@@@@@@@@@@ǠǝǧǫǰǶǵDZǫ**/ /"$(59A>AA:,***************/ //////%/*/./1/2///*/"/OOUr UrOOOOOOOOOOOOOOOUr Ur UrUrUrUrUrUrUrUrUr!Ur!UrUrUrCCCCLCCCCCCC6CC1C4CCCC J[JepF~pF~860ðâFĝģ8v¢JKqKLDL=KKKKLOLLLCKJpG\pHpIpJpJpIpI1pIpIpJ*pJpJpJpHpG޽=߀߭߻߻߿i \\+SS1 : :1 :U : : ;( ;3 ;' ; ; ;: ;\ ;x ;q ;9 : :y\i\\H\\\\\\\\\\\&\SkSSUSSSSSSSSSSS3S55566,6;6C6O6X6d6i6k6\6B6 55BB??!CW\3C[a`IB&BKBpBBBBBBBBBBB~BH?(?M?s????????????J$$$$$$$$$%%% $$$$$>>@r@}   >>>>>>'>2>=>E>J>H>>>->>@w@@@@@@@@@@@@@@ǡǞǨǬǰǶǵǰǪ**/ /#$(58A>@@9+***************/ //////%/*/./0/1///)/!/OOUr UrOOOOOOOOOOOOOOOUr Ur UrUrUrUrUrUrUrUrUr Ur UrUrUr<:<;t<;B<; <;D<;t<;;<;.<;3<;j<;J<;<6<ܜ<.s<;ZT<<<]<<[<<#x<<7<7<8<7<7<7<<6<7R<8<8<9'<.)<.M<.<-d<,<-h<.<.<<Ă< <<<уN<у!<т<тh<т^<тz<т<3<K<>3<<<;?<9<<<o<@e<;t<;B<; <;D<;t<;;<;.<;3<;j<;J<;<Z< z< .< < < _< < < G< k< Y< < y< < j< <<(<ܖ.<0n<۞<ы<ij<)<<<:<<۞<ы<ijW<}<U<Ǻ<7<7<8<7<7<7<<6<7R<8<8<9'<.)<.M<.<-c<,<-g<.<.<<Ă< <<<уN<у!<т<тg<т^<тy<т<3<K<>3<<<;?<9<<<n<@e<%<朹<,<榣<)<<&<<#<暅<$<<#<晳<"<<%Z<%<朸<,<榢<)<<&<<#<暅<$<<#<晳<"<<%[x<><=<>Ŕu=<=<><>f<_<<<x<><=<>Ŕu=<=<><>f<_<<<<(<<$<<<<G<<<<<<<<<<<<<{0<}<o<(;Y;<~*<r<( ;Y;<~Z<u<(;Y;<~]<w<(;Y;<~G<y<(;Y;<~6<z<(;Y;<~<<z<(;Y; <~W<x<(;Y;<~x<w<(;Y;<~<t<( ;Y;<~]<q<(;Yu;T<~<m<';YL;<}<k<';Y*;<}&<i<';Y;w<|<"<<˶<<<i<<<H<M<><3<;<T<n<s<K<<<*<<<(<W<e<`<\<g<}<<<i<<<[<$<|<<<<<<<<&<'<<̭<H<;;;/;p;;;;; ;; ;;;i;;;;;~;;;;;/;};;;;+;8;D;M;H;);;š;?;;;;P;;;;;;;;;;B;;;E;ލ;;;';?;O;\;c;\;=;;޵;a;;;;;A;a;{;;;;;;;n;H; ;;;-f;-b;;;3Q;3D;3k;3;3;3;3;3;4;4 ;4 ;4;3;3;3;3z;3X;-~;-;-;-;-;.;.;.$;.%;.;. ;-;-;-;-y;;;;:;S;f;s;z;{;q;];>;;;< :< =< B< I< P< X< _< d< g< g< e< `< X< P< G< @< :< < < < <<<<<<<<<<<<<<<<<< < < < < < < < < < < < < < < < < < < < < < < < < < < < < < <"B<"C<"D<"G<"I<"L<"O<"P<"R<"R<"R<"P<"N<"K<"H<"E<"C<$<$<#u<#v<<<<<<<<<<<<<<<<<<$<$<$<$<$<$<$<$<$<$<$<$<$<$<$<#v<#x<#{<#}<#<#<#<#<#<#<#<#<#~<#{<#x<]a<]`<]`<]_<]_<]_<]_<]^<]_<]^<]^<]^<]^<]_<]_<]`<]`<"<<˷<<<i<<<H<M<><3<;<T<o<s<K<<<+<<<)<W<e<a<\<g<}<<<h<<<[<#<|<<<<<<<<&<'<<̬<H<;;;/;p;;;;;;; ;;;i;;;;;~;;;;;/;};;;;+;8;D;M;H;);;š;@;;;;P;;;;;;;;;;C;;;D;ލ;;;(;?;O;\;c;\;=;;޵;a;;;;;@;`;{;;;;;;;o;I;!;;;-e;-c;;;3P;3E;3j;3;3;3;3;3;4;4 ;4 ;4;3;3;3;3{;3Y;-};-;-;-;-;.;.;.$;.%;.;. ;-;-;-;-z;;;;:;S;f;s;{;{;r;^;?;;;< 9< << B< I< P< X< ^< d< g< g< e< `< Y< P< H< A< ;< < < < <<<<<<<<<<<<<<<<<< < < < < < < < < < < < < < < < < < < < < < < < < < < < < < <"A<"B<"D<"F<"I<"L<"N<"Q<"R<"S<"R<"Q<"O<"L<"I<"F<"D<$<$<#t<#w<<<<<<<<<<<<<<<<<<$<$<$<$<$<$<$<$<$<$<$<$<$<$<$<#u<#w<#z<#}<#<#<#<#<#<#<#<#<#<#|<#y<]_<]_<]_<]^<]^<]^<]_<]^<]_<]_<]_<]_<]_<]`<]`<]a<]a>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>=f=%='W>x> =>"P>> > >>z>>+>;ܔ>>>l>{>&>#d>':>,>1&>6[>:$><>=Eq>;ܔ>>>l>{>&>#d>':>,>1&>6[>:$><>=Eq=f>+>>z>> > >>"P> =>x='X=%>8> *$==ӂ>>L>">X>1>mt><>H@>>>3>#Y>I>/D>V>>>v>-:>4> S>>p>F>#W >ʌ>{>x>&>!W>R>BO>)^>">گ>f>+#>">Q_>;>*>>k> $>(ix>> I>#M>r>E=>;ܱ>;ܯ>;ܒ>;v>;܇>;>;D>;ݔ>;ݰ>;ݎ>;>;k>;>;ے>;۴>;>;X>>>g>s>>#U>':>,>1%>6'>:#><>=E.>>>Y>\>>#'>':z>,?>1%>6>:#w>=D>>>C>;>>#>':+>,>1%?>6d>:# ><>=Dc>>>*>>>#>'9>,>1$>6*>:"><>=D1>>>>>t>#>'9>,>1%>6L>:# ><>=Dq>>>>>a>#~>'9>,>1%Y>6>:#><>=E%>>>>>b>#>':>, >1%>6a>:$c>=E>>>>>l>#>':5>,U>1&*>6>:$><>=Fo>>>>>t>#>':M>,t>1&K>6>:$><>=F>>>>>p>#>':?>,^>1&+>6>:$><>=Fd>>>>>h>#>':>,>1%>6_>:$W>=E>>>>>f>#>'9>,>1%|>6>:#><>=Ev>>>>>u>#>'9>,>1%C>6>:#>=E>>>'>>>#>'9>,>1%M>6>:#>=E>>>?>5>>#>':3>,>1%>6>:#><>=ED>>>U>W>>#!>':{>,U>1%>6.>:$><>=Ew>>>e>p>>#Q>':>,>1&>6[>:$'><>=E=e=e_=d=d=d=e=f=g*=gN=gO=g=fi=e=e=e=f=f-=%='s>x> v>"><>4>!> >>z>>+=&=(>y> >#{>=<>>!7> >>{>>+='=,>|> >%`>>>U>!> >>{>>+=(=0>~> >'>@g>>"U>!P>@>{)>>+=*G=3>> >)r>Au>,>">!o>C>{&>>+=)=1k>> >).>A>>#>!>u>{2>>+=(=,>|> >'>A>>#u>"1>>{J>>+=&=)>z> >&^>@[>_>#p>"A>>{G>>+=&=)>z8> >%>?>>#>>">>{9>>+=&=)>zj> l>&D>@a>o>#}>"H>>{I>>+=(=, >|u> f>'>A7>>#>"?>>{M>>+=*=1>> E>)~>A>>#0>!>{>{5>>+=+=4>> >*>A>s>">!>I>{(>>+=*{=2E>'> >(>@>>">!d>E>{*>>+=(=.;>}G> >&=>?>>!>!>>{>>+='2=*>z> o>$ >=>>!C> >>{>>+=&1=(I>y#> >"><>;>! > >>z>>+=ӂ=> *$>8>X>">L>>H@><>mt>1>#Y>3>>>>V>/D>I>4>-:>v>>F>p>> S>x>{>ʌ>#W >BO>R>!W>&>f>گ>">)^>;>Q_>">+#> $>k>>*> I>>(ix=>E>r>#M>>>>>}>v>q>n>m>n>q>v>|>>>>>L>K>#>#>X>X>X>X>X>X>X>X>X>X>X>X>X>X>X>X>X>K>J>H>D>>>8>4>4>5>8>>>D>H>J>K>$>%>&>#>>>>>>>>#>&>%>#>1>1>1>1>1x>1k>1`>1Z>1Y>1Z>1`>1k>1x>1>1>1>1>mt>ms>=><>HB>HB>HH>HR>H[>HZ>HM>H>>H5>H3>H6>H?>HN>HZ>H[>HR>HG>ms>mr>mo>mg>mY>mM>mF>mE>mG>mN>mZ>mf>mm>mp>mq>?>D>F>B>5>'>>> >(>5>A>E>B>>>>>>}>l>Z>M>G>G>H>O>[>k>z>>>>>>5>3>#]>#Z>#d>#q>#}>#~>#z>#y>#t>#p>#v>#{>#|>#>#|>#o>#a>>>>>>>>>>>>>>>>8>?>C>?>5>*>$>">%>,>6>?>B><>6>F>:>)>>>>>>>>>>>>$>5>C>/D>/A>X>U>">>,>?>W>c>t>>>>>>x>g>Y>?>(>/A>/?>/<>/4>/*>/">/ >/ >/">/&>/->/5>/:>/<>/=>]>h>r>v>v>v>v>u>x>z>y>x>s>f>Z>>>~>h>W>L>L>Q>V>V>R>R>Z>h>{>>>v>s>->>-;><>8>M>t>>>> >+>%>1>*>>>>|>M>t>t>w>x>x>{>~>ف>ك>ق>>}>y>s>q>-H>-\>-w>->->->->->->->->->-}>-_>-F> S> R> R> R> R> R> R> R> R> R> R> R> R> R> R> R> S >>>p>p >F>F>F>G>G>G>H>H?>HB>H8>HK>HP>H'>G>G>G8>F>>>>>>>>>>>>>>>>p>pF>p|>p>p>p>p>p>p>p>p>p>p>pV>p$>#W>#W>#V>#V>#V>#V>#W>#W3>#W@>#W;>#W(>#W>#V>#V>#V>#W >#W>ʌ>ʔ>>>>>>U>>>>>>>>>>>K>>>ʕ>ʯ>>>)>@>I>L>O>N>@>$>>>ʩ>>>\>>>>>>> >>>>%>>&>&>&>&>&>&>&>&6>&@>&9>&#>&>&>&>&>&>&>!U>!o>R>R>Bi>B>B>C>D>E>E>E>EL>E>EI>E>F>E>ER>D3>C,>!m>!>!>!F>!>!>!>!>!>!>!>!}>!?>!>!>R>S~>T$>T>T>T>T>T>T>T>U>T>T>S>S@>)^>)^>)^>)^>)^>)_?>)_y>)_>)_>)_>)_u>)_Y>)_8>)_>)^>)^>)^>">">ڹ>>f>f>g\>h>j.>kB>ka>j>i>i>i>j>k>k>j>ii>g>">"U>">"Q>">">">"b>"j>">">">"W>">"b>>>>ݐ>>ݗ>,>>>|>>>s>܊>۞>+#{>+#k>+#x>+#>+$ >+$u>+$>+$>+$>+$>+$>+$>+$m>+$I>+$>+#>+#>">")>Qc>Q>;>< >=>?>A >@>?>>>>>>U>?>A>A>@>?>==>">"x>">">">">">">">">">"!>">"E>">Q>R>S>T>U>T>S>S>S>TG>U>UH>T>S>R>*>*>*>*>*o>*>*J>*[>*G>*0>*>*>*>*>*>*p>*9>>>c>> $> %{> %> '> (> *> )> (> 'B> &> &> ( > )> *> *> (S> &>>2>>m>>>>Q>P>>>>>/>>>>>>>G>>(>B>>>>>>>(iH>(i >(i >(i,>(i>(j+>(j>(j>(j>(j>(jv>(jI>(j!>(j >(i>(i>(i>>=> 2> ><<><><>=>>>?>?>>>=>=Z>=v>>P>?>@M>?>>>=>>>k>> t> > x> F> => ^> > > _> >> b> > > @> > Y> > > > > > > > > ;>#>#>#>#># >#>#=>#u>#r>#Z>#/>#>#>#>#>#>#z>r>s>E>F==F==A=+=2==;==a=p===w===>r>r>r>s*>s>t>t >s>s>s>s>s>s>s>sO>E>E>F>F>F>G>F>F>F>F>G>G>F>F>FU>>>>>>z>>:>F>5>>>>>>|>`> )> *O==D=ӂ=Ӄ=ӂg=ӂG=ӂi=ӂ=Ӄ=Ӄ=ӄ.=ӄ==ӄ;=ӄ5=ӄ'=ӄ=Ӄ=Ӄ=ӃV> )> )> )> *> *> *> +> +> +> +> *> *> *> *> *x=y=c====c=====o=A===>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>;ܱ>;ܮ>;ܒ>;v>;܇>;>;D>;ݔ>;ݰ>;ݎ>;>;k>;>;ے>;۴>;>;X>=E><>:$'>6[>1&>,>':>#Q>>p>e>>>=Ew><>:$>6.>1%>,U>':{>#!>>W>U>>>=ED><>:#>6>1%>,>':3>#>>5>?>>>=E>:#>6>1%M>,>'9>#>>>'>>>=E>:#>6>1%C>,>'9>#>u>>>>>=Ev><>:#>6>1%|>,>'9>#>f>>>>>=E>:$W>6_>1%>,>':>#>h>>>>>=Fd><>:$>6>1&+>,^>':?>#>p>>>>>=F><>:$>6>1&K>,t>':M>#>t>>>>>=Fo><>:$>6>1&*>,U>':5>#>l>>>>>=E>:$c>6a>1%>, >':>#>b>>>>>=E%><>:#>6>1%Y>,>'9>#~>a>>>>>=Dq><>:# >6L>1%>,>'9>#>t>>>>>=D1><>:">6*>1$>,>'9>#>>>*>>>=Dc><>:# >6d>1%?>,>':+>#>>;>C>>>=D>:#w>6>1%>,?>':z>#'>>\>Y>>>=E.><>:#>6'>1%>,>':>#U>>s>g>>=e=e_=d=d=d=e=f=g*=gN=gO=g=fi=e=e=e=f=f->+>>z>> >! >;><>"> >y"=(H=&0>+>>{>> >!C>>=>$ > o>z=*='2>+>>{>>!>!>>?>&=> >}F=.:=(>+>>{*>F>!d>">>@>(> >'=2D=*z>+>>{(>I>!>">s>A>*> >=4=+>+>>{5>{>!>#0>>A>)~> E>=1=*>+>>{M>>"?>#>>A7>'> f>|u=, =(>+>>{I>>"H>#}>o>@a>&D> l>zj=)=&>+>>{9>>">#>>>?>%> >z8=)=&>+>>{G>>"A>#p>_>@[>&^> >z=)=&>+>>{J>>"1>#u>>A>'> >|=,=(>+>>{2>u>!>#>>A>).> >=1l=)>+>>{&>C>!o>">,>Au>)s> >=3=*G>+>>{)>@>!P>"U>>@g>'> >~=0=(>+>>{>> >!>U>>>%`> >|=,='>+>>{>> >!7>>=<>#{> >y=(=& >+>>z>> >!>4><>"> w>x='t=%>>>>>}>v>q>n>m>n>q>v>|>>>>>L>K>#>#>X>X>X>X>X>X>X>X>X>X>X>X>X>X>X>X>X>K>J>H>D>>>8>4>4>5>8>>>D>H>J>K>$>%>&>#>>>>>>>>#>&>%>#>1>1>1>1>1x>1k>1`>1Z>1Y>1Z>1`>1k>1x>1>1>1>1>mt>ms>=><>HB>HB>HH>HR>H[>HZ>HM>H>>H5>H3>H6>H?>HN>HZ>H[>HR>HG>ms>mr>mo>mg>mY>mM>mF>mE>mG>mN>mZ>mf>mm>mp>mq>?>D>F>B>5>'>>> >(>5>A>E>B>>>>>>}>l>Z>M>G>G>H>N>[>k>z>>>>>>5>3>#]>#Z>#d>#q>#}>#~>#z>#y>#t>#p>#v>#{>#|>#>#|>#o>#a>>>>>>>>>>>>>>>>8>?>C>?>5>*>$>">%>,>6>?>B><>6>F>:>)>>>>>>>>>>>>$>5>C>/D>/A>X>U>">>,>?>W>c>t>>>>>>x>g>Y>?>(>/A>/?>/<>/4>/*>/">/ >/ >/">/&>/->/5>/:>/<>/=>]>h>r>v>v>v>v>u>x>z>y>x>r>f>Z>>>>i>W>L>L>Q>V>V>R>R>Z>h>z>>>v>s>->>-;><>8>M>t>>>> >+>%>1>*>>>>|>M>t>t>w>x>x>{>~>ف>ك>ق>>}>y>s>q>-H>-]>-w>->->->->->->->->->-}>-_>-F> S> R> R> R> R> R> R> R> R> R> R> R> R> R> R> R> S >>>p>p >F>F>F>G>G>G>H>H?>HB>H8>HK>HP>H'>G>G>G8>F>>>>>>>>>>>>>>>>p>pF>p|>p>p>p>p>p>p>p>p>p>p>pV>p#>#W>#W>#V>#V>#V>#V>#W>#W3>#W@>#W;>#W(>#W>#V>#V>#V>#W >#W>ʌ>ʔ>>>>>>U>>>>>>>>>>>K>>>ʕ>ʰ>>>)>@>I>L>O>N>@>$>>>ʩ>>>\>>>>>>> >>>>%>>&>&>&>&>&>&>&>&6>&@>&9>&#>&>&>&>&>&>&>!U>!o>R>R>Bi>B>B>C>D>E>E>E>EL>E>EI>E>F>E>ER>D3>C,>!m>!>!>!F>!>!>!>!>!>!>!>!}>!?>!>!>R>S~>T$>T>T>T>T>T>T>T>U>T>T>S>S@>)^>)^>)^>)^>)^>)_?>)_y>)_>)_>)_>)_t>)_Y>)_8>)_>)^>)^>)^>">">ڹ>>f>f>g\>h>j->kB>ka>j>i>i>i>j>k>k>j>ij>g>">"U>">"Q>">">">"b>"j>">">">"W>">"b>>>>ݐ>>ݗ>,>>>|>>>s>܊>۞>+#{>+#l>+#x>+#>+$ >+$v>+$>+$>+$>+$>+$>+$>+$m>+$I>+$>+#>+#>">")>Qc>Q>;>< >=>?>A >@>?>>>>>>U>?>A>A>@>?>==>">"x>">">">">">">">">">"!>">"F>">Q>R>S>T>U>T>S>S>S>TG>U>UH>T>S>R>*>*>*>*>*o>*>*J>*[>*G>*0>*>*>*>*>*>*p>*9>>>b>> $> %|> %> '> (> *> )> (> 'B> &> &> ( > )> *> *> (T> &>>2>>m>>>>Q>P>>>>>/>>>>>>>G>>(>B>>>>>>>(iH>(i >(i >(i,>(i>(j*>(j>(j>(j>(j>(jv>(jI>(j!>(j >(i>(i>(i>>=> 2> ><<><><>=>>>?>?>>>=>=Z>=v>>P>?>@M>?>>>=>>>k>> t> > x> F> => ^> > > `> >> b> > > @> > X> > > > > > > > > ;>#>#>#>#># >#>#=>#u>#r>#Z>#/>#>#>#>#>#>#z>r>s>E>F==G==@=*=1==:==a=p===x===>r>r>r>s*>s>t>t >s>s>s>s>s>s>s>sO>E>E>F>F>F>G>F>F>F>F>G>G>F>F>FV>>>>>>z>>:>F>5>>>>>>|>`> )> *O==D=ӂ=Ӄ=ӂg=ӂG=ӂi=ӂ=Ӄ=Ӄ=ӄ.=ӄ==ӄ;=ӄ5=ӄ'=ӄ=Ӄ=Ӄ=ӃV> )> )> )> *> *> *> +> +> +> +> *> *> *> *> *x=y=c====b=====o=A====>=ə=bt=W>y,> 2>|>>>>F>>a>>=>>a>>F>>>>|> 2>y-=W=bu=ə>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>=k===W==>s=:O> n>]>n> #>>>>o>>m>R5>~!>] >n>'>>>>>> ==k=W====:O>s>]> n> #>n>>>o>>m>>~!>R5>n>] >>'>>> >>==|=x=R======== ===,==>>b>>F>>o>g>> 3Z>y=X=bK=əh>>b>>F>W>j>ƻ>> 4>{=\-=e=ɛ>>b1>>Fq>>>> > 76>*=e=n=ɠ>>bw>4>Gt>>q>˱>J> >>=q=u=ɢ>>bZ>>F+>=>>l>H> @>=~=a=ɫ>>bX> >G;>>7>ˎ>M> >>=s=x)=ɤ>>bN>>H>H>h>{>> 9n>~=_j=d=ə>>b?>>H>>>\>6> 7>|m=Y=_=ɗB>>b>>GO>>P>>> 7>}=]=g=ɜ>>b@>>H>>>z>G> 7>|=Xo=^=ɖ>>bP>>H>Z>>>ݬ> :I>=`=f\=ɚ>>b[>>GD>>g>>> ?>n=u={=ɦ>>b[>>F0>O>>ʰ>> A7>==I=ɭ>>bx>=>G>&>>2>> ?^>=s`=w=ɣ>>b1>>Fr> >_>G>ٝ> 7>=f=o=ɡH>>b>>F>Z>s>>> 4>{=\=f=ɛ>>b>>F>V>A>A>> 3p>y=X=c =ə>@> >F> >T> >e> >i> >Y> >E> ><> >;> >;> >D> >Y> >i> >d> >S> >F> >@> >>'>>4>>K>>s>>l>>c>>X>>I>>5>>H>>W>>a>>k>>r>>K>>3>>(>'>>'> >'>>'>K>'>>'>L>(>֩>(>֦>'>X>(>֢>(>֧>'>I>'>>'>G>'>>'>>'>>]>Ӄ>]>Ӂ>]4>ӆ>]r>>]W>ӊ>]>>^+>>^6>>]>e>^1>>^$>>]> >]P>ӂ>]j>>]1>Ӄ>]>Ӈ>] >ӗ>RD>~C>RW>~K>R>~v>S&>k>S>~>S>>TA>>TJ>>S>>TA>>T1>>S>>S>~>S >I>R>~]>RW>~L>RR>~\>>Ǡ>>>>Q>>>>ɦ>7>q>>S>>2>2>.>>>>+>>F>>}>W>>T>>>>>Ƿ>>p>4>p>J>q> >tT>>tc>>t>>u>y>tn>>s[>d>tT>>t>>t>9>t>>s>>qB>>pp>>p >V>O>9>9> >1>">>#>>#>>">J>!t>> >>!h>>"L>>##>/>##>T>">Y>v>>>>>>F>o > ȷ>pl> ,>s > (>v> >x> >w5> Ҳ>t> >r> ̺>rK> '>r> >t> Ρ>v> >wc> ->u> #>r-> Y>o> >n> ȍ> o>]> qh>_> t>cu> x>h> z>k> x>iI> t>c}> rF>`X> q>`[> r>`> t>c*> xm>h> y>j> ww>g> s|>bp> p>_> oI>]|>=;>=?>=Gi>=Qx>(=X>=Q>=C>-=<>8=>x>|==>=C5>f=Pp>J=V>=O/>=EV>=>9>ܩ=:==="q=='2==,=W=0==,M==#=Dz=={= f=2= ==#=V=+=Ӵ=/= =*l=t=%7== === ====J==^=+=F=F="=\==m=a===S====;===== =s==^="==\==8==s==*====h====ǩ===;=@==ȸ===~=Q=e==q=Ş=Q==`=Ũ==Ɗ==6>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>==|=w=R======== ===,==>>b>>F>>o>g>> 3Y>y=X=bJ=əh>>b>>F>W>j>ƻ>> 4>{=\,=e=ɛ>>b1>>Fq>>>> > 76>)=e=n=ɠ>>bw>4>Gt>>q>˱>J> >>=q=u=ɢ>>bZ>>F+>=>>l>H> @>=~=`=ɫ>>bX> >G;>>7>ˎ>M> >>=s=x)=ɤ>>bN>>H>H>h>{>> 9n>~=_j=d=ə>>b?>>H>>>\>6> 7>|m=Y=_=ɗA>>b>>GO>>P>>> 7>}=]=g=ɜ>>b@>>H>>>z>G> 7>|=Xo=^=ɖ>>bP>>H>Z>>>ݬ> :I>=`=f\=ɚ>>b[>>GD>>g>>> ?>n=u={=ɦ>>b[>>F0>O>>ʰ>> A8>==J=ɭ>>bx>=>G>&>>2>> ?_>=s`=w=ɣ>>b1>>Fr> >_>G>ٝ> 7>=f=o=ɡH>>b>>F>Z>s>>> 4>{=\=f=ɛ>>b>>F>V>A>A>> 3p>y=X=c =ə>@> >F> >T> >e> >j> >Y> >E> ><> >;> >;> >D> >Y> >i> >d> >S> >F> >@> >>'>>4>>K>>s>>l>>c>>X>>I>>5>>H>>W>>a>>k>>r>>K>>3>>(>'>>'> >'>>'>L>'>>'>L>(>֩>(>֦>'>X>(>֢>(>֧>'>I>'>>'>G>'>>'>>'>>]>Ӄ>]>Ӂ>]4>ӆ>]r>>]W>ӊ>]>>^+>>^6>>]>e>^1>>^$>>]> >]P>ӂ>]j>>]1>Ӄ>]>Ӈ>]>ӗ>RD>~C>RW>~K>R>~v>S&>k>S>~>S>>TA>>TJ>>S>>TA>>T1>>S>>S>~>S >I>R>~]>RW>~L>RR>~\>>Ǡ>>>>P>>>>ɦ>7>q>>S>>2>2>.>>>>+>>F>>}>W>>T>>>>>Ǹ>>p>3>p>J>q>>tS>>tb>>t>>u>x>tn>>s[>d>tT>>t>>t>:>t>>s>>qC>>pq>>p >U>O>8>8> >0>">>#>>#>>">I>!t>> >>!h>>"L>>##>/>##>U>">Z>w>>>>?>F>o > ȶ>pj> +>s > '>v> >x> >w4> ұ>t> >r> ̹>rK> '>r> >t> ΢>v> >wd> .>u> %>r/> Z>o> >n> Ȏ> o>]> qf>_> t>cs> x>h> z>k> x>iH> t>c|> rF>`W> q>`[> r>`> t>c+> xn>h> y>j> wy>g> s~>br> p>_ > oK>]}>=;>=?>=Gd>=Qs>&=X>=Q>=C>,=<>8=>x>|==>=C7>g=Ps>L=V>=O3>=E[>=>?>ܬ=:==="l=='-=z=,=S=0==,J==#=ǰ==z= f=2= ==#=W=+=Ӷ=/= =*p=x=%<== =======G==[=(=C=C="=Z==k=`===S=== ======= =v==a=%==`==;==s==*====h====ǩ===;=@==ȸ===~=Q=e==q=Ş=Q==`=Ũ==Ɗ==6>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>==z=Z=u====u=Z=z=>h>F>>>>6>>>>F>h>>>A>p>_>s>_>p>A>>>>ǟ>>+>>}U>>+>>ǟ>>I>#>S>?>] > F>] >?>S>#>I>Bg>H> p> > > > p>H>Bg>/b> > >5^>>>>5^> > >/a> V> z>P>hA>=>>hA>P> z> V> Z>Y>-==D==D=>->Y> Z>M=/=j=??==T==??=j=/>M== =!=ဈ=D=3=D=ဈ= ====Zl="=[====[="=Zk===35=ʌ=qA=ŧ==ŧ=qA=ʌ=35==æE==1=W=?L=r=?L=W=1==æD>>>p><>>l>m>j>>>G>>>?>>>>>>c>>$>>>>V>>Ď>ɶ>>>> >>>>>>>>>>>>>>>>>>>>>>B>>͵>>Ͱ>>A>>>n>q> >!> N>`>>>> > U>!> >h>>>>S>B>>*>J>0>>>>Um>R>>>a>B>T>y>D>A>zP><>B><>>†>>:s> >>>9>>>>>>>>>;>5>>>S>ij>>w>>>6>|>4>>%>c>>>33>>8>>w>>X>+>@>w>>{W>>5>z>>]>>>>>Y> >[D>1>X>>>C>J>.>>>0>Z> >4>D>> >e>>>X>Fh>q>>>ƪ>6>>>>w>H>>>eZ>CC>k> >>n>>>s>O>>>8~>> x> > > :r> > > p>>4E>L}>>|>>B> >>Z>>J>>>u>z>IH>@>1>>>8>3>6>>[>>>> E> > > > F> >G> > >4> r_> > |>#> ?> E>d6>>>=>aV> > > >>>)>zt>.L>>>>M>1>>R>-!>qa>`>;s> > >b> > > ν> > }>X>> !> w,>1v>>@> >27> nf> <> > > &> Ź> > U> I> 4>b$>W>!>>"n>>UX>> D"> k> )> >|> > z> > yB> > > ­>> > > h> uL> Q> >g>>>X>> x> > >Bj>[>>wG>ս>_>7>>>؎>^>|>>> L>Mu>B=J=k=?L=lQ=}>4>@> G> v[> > ÿ> ޞ> 1>>> }u>>z> > > > > s>W>?Q>>b>@>.r>4l>>>6H>><4===<,= =>/}>TJ>#>>P>k> >}!>҉===L==(=,=$==>>>>U>>a>ht>M<>y>M>u>ol>>?>|>s=>>2=O=R===*<>ٯ>}===Q=&==es=0==|=======,=y<==9U=o== =@*=<=p===v=ߥ==| ===3=e==f====H=T=b==k==b=^=s=쪷=;==m===!=I=᥏=[=G=='=H=e=%=窮=S==(=R==Ԭ=ґ=d=ґ}=ԢK==>=+===f=뷟==ƻ= =====l=4=7====?=e=={l=Z=e=޼=Bh=f=Y]=y==={= :==b=X=^==a=a`=I=~~==1+=ʮU=Ǫ=0=Ť=0'=Ǣ=ʟ{="Q=j=9p= =֔=c=֬+=^=(= =(=k=l=e=m=3=8=۽=¿="o=ٳ=۶=F==P=D=ѵ,==C=Ȱw==ljA==Ȭ?=˲=5\=M=l=,l==˂<==à@==F`=z=_=>:==u2===ׅ=àS==:=====L=/=í=/=UG=`=&=m=)Q==Ag=T=======w~=L=M=$=U=C=f==W==Ue=4==PQ=~=Y===|$=e==u====a=x===U===m=X=*=B===C={==== ==?=k)=0=]|=,=gJ= b=====L=~=&==6=Ff===D===>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>p><>>l>m>j>>>G>>>?>>>>>>c>>$>>>>V>>Ď>ɶ>>>> >>>>>>>>>>>>>>>>>>>>>>B>>͵>>Ͱ>>A>>>n>q> >!> N>`>>>> > U>!> >h>>>>R>B>>*>J>0>>>>Um>R>>>a>B>T>y>D>A>zP><>B><>>†>>:t> >>>9>>>>>>>>>;>5>>>S>ij>>w>>>6>|>4>>%>c>>>33>>8>>w>>X>+>@>w>>{W>>5>z>>]>>>>>Y> >[D>1>X>>>C>I>.>>>0>Z> >4>D>> >e>>>X>Fh>q>>>ƪ>6>>>>w>H>>>eZ>CC>k> >>n>>>s>O>>>8~>> x> > > :r> > > p>>4E>L}>>|>>B> >>Z>>J>>>u>z>IH>@>1>>>8>3>6>>[>>>> E> > > > F> >G> > >4> r_> > |>#> ?> E>d6>>>=>aV> > > >>>)>zt>.K>>>>M>1>>R>-">qa>`>;s> > >b> > > ν> > }>X>> !> w,>1v>>@> >27> nf> <> > > &> ź> > U> I> 4>b%>X>!>>"n>>UW>> D"> k> )> >|> > z> > yB> > > ­>> > > h> uL> Q> >g>>>X>> x> > >Bk>[>>wG>ս>_>7>>>؏>^>|>>> L>Mv>B=J=k=?L=lQ=}>4>@> G> v[> > þ> ޞ> 1>>> }u>>z> > > > > s>W>?Q>>b>@>.r>4l>>>6H>><5===<,= =>/}>TI>#>>P>k> >}!>҉===L==(=,=#==>>>>U>>a>ht>M<>y>M>u>ol>>?>|>t=>>2=O=R===*=>ٯ>}=>=Q=&==es=0==|=======,=y===9U=o== =@*=<=o===v=ߤ==| ===3=e==f====H=U=c==j==b=^=s=쪷=;==n==="=I=᥏=[=G=='=H=e=&=窮=S==)=R==Ԭ=ґ=d=ґ}=ԢK==>=*===f=뷞==ƻ= =====m=4=7====>=e=={l=Z=e=޼=Bi=g=Y]=y==={= :==b=X=^==b=a`=I=~~==1,=ʮU=Ǫ=0=Ť=0'=Ǣ=ʟ{="P=i=9p= =֔=c=֬+=^ =(= =(=k=m=e=m=3=8=۽=¾="o=ٳ=۶=F==P=D=ѵ,==C=Ȱw==ljA==Ȭ>=˲=5\=M=l=,l==˂<==à@==F`=z=_=>:==u2===ׅ=àS==:===<=L=/=í=/=UG=`=&=m=)R==Ag=T=======w~=L=M=$=U=C=f==V==Ue=4==PQ=~=Y===|$=e==u====a=x===U===m=X=*=B===C={==== ==?=k)=0=]|=,=gJ= b=====L=~=&==6=Ff===D===>4>:?>7=џ===џ==>4>:?>7>7y>? ==]=ŭ=䮮>>=y=_>>D=t=@===-=р==>=p=z=b=4=====ѽ=~==~=.=~i==~V==~==~==u=0=== =======8=j==J==B==@==5=>4>4>4>4>4 >4 >>4 q>4 >4 >4 i>4 >4>4K>4>4 >4E>4t>:?g>7>:?>7>:>>7{>:>>7n>:>>7>:?>7>:@&>7>:@>7>:@>7!>:@>7>:@^>7>:@>7>:?>7e>:?>7L>:?>7K>:?>7K>:?>7<=]=>? >7y>>=䮮=ŭ>D>=_=y>D>Dq>DN>DP>D>E>Eu>E>E>E>E>Ef>E6>E!>E>E >D>ټ>=^=_S=<=======7=====U====>ٛ>ن>ّ>>.>ڊ>ڹ>>ڿ>ڭ>ڋ>h>S>B>*=^=^l=^=^=_=`'=`{=`=`=`u=`E=` =_=_=_>>q>T>X>>>U>>>>>b>8> >>>>{>=p==ŭ=ŭ=ŭU=ŭ"=ŭ=ŭW=ŭ=ŮZ=Ů=Ů=Ů=Ů=Ů=ŮZ=Ů6=Ů"=Ů>\>H>O>>>&>Y>l>k>[><>>>>=2= ==`===== ==䯸==V=7=>7S>71>7>7>7I>7>7>8/>8L>8N>8;>8>7>7>7>7>7>>>?*=⭽=)=+======P== =U=a=I=====>>>>>>>>>?*>?s>?>?>?>?>?>?>?j>?X>?E=⭃=\=^=⭛= =⮌=="=-===⮴=⮍=o=O=t=@===-=р==>=p=z=b=4=====ѽ=~==~=.=~i==~V==~==~==u=0=== =======8=j==J==B==@==5=>4>4>4>4>4 >4 >>4 p>4 >4 >4 i>4 >4>4K>4>4 >4E>4t>:?g>7>:?>7>:>>7{>:>>7n>:>>7>:?>7>:@&>7>:@>7>:@>7!>:@>7>:@^>7>:@>7>:?>7e>:?>7L>:?>7K>:?>7K>:?>7<>D>Dq>DN>DP>D>E>Eu>E>E>E>E>Ef>E6>E!>E>E >D>ٻ>=^=_S=<=======7=====U====>ٛ>ن>ّ>>.>ڊ>ڹ>>ڿ>ڭ>ڋ>h>S>B>*=^=^l=^=^=_=`'=`{=`=`=`u=`E=` =_=_=_>>q>T>X>>>U>>>>>b>8> >>>>{>=p==ŭ=ŭ=ŭU=ŭ"=ŭ=ŭW=ŭ=ŮZ=Ů=Ů=Ů=Ů=Ů=ŮZ=Ů6=Ů"=Ů>\>H>O>>>&>Y>l>k>[><>>>>=2= ==`===== ==䯸==V=7=>7S>71>7>7>7I>7>7>8/>8L>8N>8;>8>7>7>7>7>7>>>?*=⭽=)=+======P== =U=a=I=====>>>>>>>>>?*>?s>?>?>?>?>?>?>?j>?X>?E=⭃=\=^=⭛= =⮍=="=-===⮴=⮍=o=O>>'؇>>>7>>?>>j> ->~=N>?=N>~> ->j>>>'؇>>>7>>>t>W0>F>>>`x>>>> |>#> /> >,F>7+>>c> :>=[=C>>{>?>?>?>?>?>?>?>?>?>?>?>?>?>?>?>?>?>>j> !>~=Nw>>j> >~=NG>>j> >~=N>>j> >~}=N >>j> >~w=N>>j> >~=NO>>j> >~=N>>j> >~=N>>j> >~=O*>>j> >~=OP>>j> )>~=OZ>>j> 7>~=OM>>j> ?>~=O4>>j> C>~=O>>j> B>~=N>>j> >>~=N>>j> 7>~=N>>>>>>>>>>>>>>>>>>'g>>>,>>'I>>> >>'5>>>>>'4>>> >>'N>>>>>'؀>>>>>'ؾ>>>>>'>>>>>'>>>>>'1>&>>!>>'0>1>>/>>'>1>>;>>'>(>>C>>'>>>G>>'> > >H>>'ؾ>>>E>>'ؤ>>>?>>F>W0>t>>>`x>>>#> |>>>7+>,F> > />> :>c>>{>=C=[>{g>{L>{8>{7>{N>{{>{>{>| >|>|>| >{>{>{>{>{>> =B=C-=-====== =X=== ======>>>>>>>A>c>s>s>f>T>B>1> =B=Bv=Bi=B=B=C=Cs=C=C=C=C=C=C=Ch=CM>>>>>>>>>>)>4>4>+>>>>> :> :>O>t>>>>>>>>>>>>'>,>*>#>>> :m> :Y> :N> :Q> :c> :> :> :> :> :> :> :> :> :> :>9>%>>>%>>>^>|>ϓ>Ϡ>ϣ>Ϟ>ϖ>ό>π>7>7 >6>6>6>6>6>7>7'>7=>7M>7V>7Y>7V>7O>7F>7:>,6>,S> > > /> /> /> /> /{> /r> /o> /t> /> /> /> /> /> /> /> /> />,%>,>,>,>,>,>,#>,:>,O>,`>,j>,m>,l>,f>,^> > > > > > > > > > > > &> &> #> ># >">">">">">">">">"># >#>#>#$>#$>#">#> s> >v>>>>>>>>>>>>>>>>>>> g> [> O> F> A> B> H> S> `> n> z> > > > >l>`>T>J>D>C>G>P>\>i>v>>>>>>>>>>>>>>>>>>>>>>`t>`y>>>>>>>>>>>>>>>>>>>>`n>`g>`_>`W>`P>`L>`J>`L>`Q>`X>`a>`i>`p>`u>`x>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>t>t>W0>W.>F>F>F>F>F>F>F >F>F>E>E>E>F>F>F >F>F>t>t>t>t>t>t>t>t>t>t>t>t>t>t>t>W.>W*>W%>W>W>W>W>W >W >W>W>W>W>W$>W*>>>>>>>>>>>>>>>>>>>?>>>'ؤ>>E>>>'ؾ>>H> > >'>>G>>>'>>C>>(>'>>;>>1>'>>/>>1>'0>>!>>&>'1>>>>>'>>>>>'>>>>>'ؾ>>>>>'؀>>>>>'N>> >>>'4>>>>>'5>> >>>'I>>,>>>'g>?>?>?>?>?>?>?>?>?>?>?>?>?>?>?>?>?>>j> !>~=Nw>>j> >~=NG>>j> >~=N>>j> >~}=N >>j> >~w=N>>j> >~=NO>>j> >~=N>>j> >~=N>>j> >~=O*>>j> >~=OP>>j> )>~=OZ>>j> 7>~=OM>>j> @>~=O4>>j> C>~=O>>j> B>~=N>>j> >>~=N>>j> 7>~=N>{g>{L>{8>{7>{N>{{>{>{>| >|>|>| >{>{>{>{>{>> =B=C-=-====== =X=== ======>>>>>>>A>c>s>s>f>T>B>1> =B=Bv=Bi=B=B=C=Cs=C=C=C=C=C=C=Ch=CM>>>>>>>>>>)>4>4>+>>>>> :> :>O>t>>>>>>>>>>>>'>,>*>$>>> :m> :Y> :N> :Q> :c> :> :> :> :> :> :> :> :> :> :>9>%>>>%>>>^>|>ϓ>Ϡ>ϣ>Ϟ>ϖ>ό>ρ>7>7 >6>6>6>6>6>7>7'>7=>7M>7V>7Y>7V>7O>7F>7:>,6>,S> > > /> /> /> /> /{> /r> /o> /t> /> /> /> /> /> /> /> /> />,%>,>,>,>,>,>,#>,:>,O>,`>,j>,m>,l>,f>,^> > > > > > > > > > > > &> &> #> ># >">">">">">">">">"># >#>#>#$>#$>#">#> s> >v>>>>>>>>>>>>>>>>>>> g> [> O> F> A> B> H> S> `> n> z> > > > >l>`>T>J>D>C>G>P>\>i>v>>>>>>>>>>>>>>>>>>>>>>`t>`y>>>>>>>>>>>>>>>>>>>>`n>`g>`_>`W>`P>`L>`J>`L>`Q>`X>`a>`i>`p>`u>`x>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>t>t>W0>W.>F>F>F>F>F>F>F >F>F>E>E>E>F>F>F >F>F>t>t>t>t>t>t>t>t>t>t>t>t>t>t>t>W.>W*>W%>W>W>W>W>W >W >W>W>W>W>W$>W*;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ:e;Z;Y@f;);;;n;;U;K;V;z ;Ϻ;];; ;u;4m;d&;x;m;Z;;Y;\|;;R;3];; ;u;4m;d&;x;m;Z;;Y;\|;;R;3^:e;];Ϻ;z ;V;K;U;;n;;;) ;Y@h;Z;=;";I; 8;х;В;0;ϟC;I;;%;`;Դf;@;;б;M;DB;W%;kN;!(;?;u;ώ;8;0;?;u;rv;v;nh;˟Q;Sm;ֳ;:;D3;ظ;l;.;Y;r;?;I#;(;n;\&;j;!; ;A;?1;yX;D; ;y ;@; ;߃;;:;;;;;;;2;;߶;;;A;K; ;u;4c;d;a;l;Z;;YS;\!;7;Rj;2;;u;4C;c;;l;Zu;敃;Y;[;;R<;2;;u;4;c;;l/;Z;1;X;[;0;R;3;;u;3;cm;;k;Y;1;Y;\y;;S;4*;;u;3;c\;;l ;Z1;;Z;];;UW;5;;u;3;c|;;l;Z;;[;_;;W;80;;u;3;c;E;mG;[;.;] ;aO;;Yq;9;;u;4;c;;m;\;2;^(;bi;;Z\;:;;u;4$;d;;n-;]4;晣;^;b;;Z;:;;u;4;c;;n;];p;^f;b;;Z^;:;;u;4;c;c;m;\X;昪;];a;;Y;:;;u;3;c;;l;[n;旒;\r;`;!;Y,;9;;u;3;cf;;lI;Z;斒;[M;_;;X2;91;;u;3;cp;;l;ZL;;Z;^;;W/;8=;;u;4;c;;lG;ZY;;Z;]; ;V;7;;u;4?;c;;l;Z;;Y;]X;#;T;5; ;u;4_;d;\;l;Z;;Y;\;S;S;4g:e:e:e:e:eL:e:e :e:e:es:e :e:en:e:e;:e:e;Z;Y@;);@;d;o*;M;U;K;V;z;Ϻ;];]f;YEG;,P;;`;pF;;U;J;V;y;Ϻ;];b!;YM;1;<;w;r;;V;J;V1;y;Ϻ;];h;YX;9 ;~;V;v;h;W7;J;U;y};Ϻ;];mx;YaO;=;;;yG;;W;J;U;yC;Ϻ;];kQ;Y]r;< ;(;b;z;;Z;L;W';z;Ϻ;];c`;YP;5;;;{;:;];O;Ye;{&;Ϻ;];^;YH;0;;;{6;;];P;Z;{j;Ϻ;];^w;YG};/;;;z;E;];PX;Y;{1;Ϻ;];^7;YG;0;;$;{;1;^@;P;Z&;{s;Ϻ;];c;YP;5;;1;} ;9;];P ;Y;{2;Ϻ;];l;Y` ;=;z;;|;4;Z;M/;WM;z;Ϻ;];q;YgL;AK;:;;{0;;Xw;K;U;yN;Ϻ;];mW;Y`R;=9;7;;x;;W;K ;U;y;Ϻ;];f;YTj;5y;u;;t?;;V|;J;V4;y;Ϻ;];`;YI;.;;;p;;U;J;V;y;Ϻ;];\;YC;*;;;oH;=;U;J;V;z;Ϻ;]; 8;I;";=;ϟC;0;В;х;`;%;;I;б;;@;Դf;kN;W%;DB;M;ώ;u;?;!(;u;?;0;8;˟Q;nh;v;rv;D4;:;ֳ;Sm;Y;.;l;ظ;);I$;?;r;!;k;\&;n;yY;?2;A; ;@;y; ;D;х;х;х;х;ф;ф;ф;ф;ф;ф;ф;ф;ф;х;х;х ;х;В;В;1;1;ϟE;ϟE;ϟK;ϟT;ϟ[;ϟZ;ϟS;ϟK;ϟE;ϟC;ϟF;ϟL;ϟT;ϟ[;ϟ[;ϟT;ϟK;В;В;В;В;В|;Вy;Вx;Вy;Вy;Вz;В};В;В;В;В;2;5;6;4;/;*;';';(;+;0;4;6;4;2;I;I;I;I;I;I;I;I;I;I;I;I;I;I;I;I;I;;;%;%;`";` ;`(;`-;`-;`*;`6;`I;`L;`I;`O;`L;`9;`-;`-;`+;`%;;;;;;;;;;;;;;;;%;%;%;%;%;%;%;%;%;%;%;%;%;%;%;Դ`;ԴK;Դ0;Դ;Դ;Դ;Դ4;ԴM;ԴX;ԴQ;Դ;;Դ!;Դ;Դ;Դ-;ԴG;Դ];@;@;;;б;а;а;а;а;а;б;б;б;б;б;б;б);а;а;а;а;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;;;;;;;<;E;@; ;;;;;;M;L;L;L;L;L;M;MP;Mh;MY;M%;L;L;L;L;L;M ;D<;D6;W";W;kN;k=;k-;k;j;j;k;l;mQ;mZ;m^;l;k;k;j;k;k;D&;D ;C;D;DQ;D;D;D;D;D;Db;D;D;D ;D ;W;V;V;W ;Ww;X;XZ;Xq;Xd;X;W;W;V;V;W;!; ; ; ; ;!;!;!;";";!;!<; ; ; ; ;!;?;?;u;u;ώ;ώ;ώ;ώt;ώ;ώ;ϐ%;ϑ;ϒm;ϒ;ϒ;ϑ;ϐd;Ϗ.;ώ;ώ;ώ;?;?;?;?;@>;@;A?;Ai;AQ;@;@d;?;?;?;?;u;u{;u;u;v;w;x;x8;x$;w;v;v;u;u;u;8;8;8k;8g;8;9A;9;:;:;:;:,;9;8;8;8;8;8;0;0;?;?;;v;;;s;D;;;T;r;;;C;;;;;0o;0p;0;1;1;2;31;3k;3Q;2;2;1];0;0;0;?;?;@?;@;A;C ;C;C;C;CR;BH;AC;@;@;?;r`;r;;r(;rR;r;s;t;uO;u;u|;t;t ;sS;r;r;rn;rt;o;;no;n;˟m;˟|;˟;ˠ;ˢ ;ˣp;˥;˦;˧R;˧d;˧;˧Q;˥;ˤX;ˢ;ˡO;ˠ;x;;(;;;;;;;A;i;y;;;;n;o&;p;q;rZ;s;t2;tg;tj;s;r;q;p;o;n;SR;SC;Sb;S;T;U;V;W;W;W;WW;Vx;U;T;T;S;S;ֳ;ִ;:;; ;Df;D;E8;F;I`;Kt;M;N;N;M;Np;N;NV;L;J;H7;E;ֳ;ִ;ֵo;ֶ;ַ;ָ;ֹq;ֹ;ֹ;ֹP;ָ;ַ;ֶp;ֵc;ִ;;@;;@`;yR;z;z;}';;^;;l;;~&;~;;;#;g;;}3;A;B@;C;F;G;Ho;H&;G;G;H_;H;H;G;E;C;?;Aa;C;E;GH;F;E;E$;Eg;F;H8;H;Gr;E;Bs;;;ˀ;̶;s;T;њ;;;;;;G;k;,;ͱ;H;;!;yt;y;@9;@R;@k;@;@;@ O;@ R;@ ';@;@;@;@ ;@ ;@;@ ;@ ;@;;;;;S;';;;;8;;N;;4;;y#;y ;y;y?;y;y;y;y;y3;y;y;y;y;y;y;=};=;>);?G;@;Bz;C;C;C;C;D;D;C;B;A;@g;?;; ;I;I; ;U; );7;;;;p;;Y;{;~; ;;; ; ;;m;q;;);;;;;=;q;H;;;S;I4;IL;I;I`;I^;I(;I;It;I;If;IQ;Ix;I;I;IE;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ; ;߃;;:;;;;;;;2;;߶;;;A;K;4g;S;S;\;Y;;Z;l;\;d;4_;u; ;5;T;#;]X;Y;;Z;l;;c;4?;u;;7;V; ;];Z;;ZY;lG;;c;4;u;;8=;W/;;^;Z;;ZL;l;;cp;3;u;;91;X2;;_;[M;斒;Z;lI;;cf;3;u;;9;Y,;!;`;\r;旒;[n;l;;c;3;u;;:;Y;;a;];昪;\X;m;c;c;4;u;;:;Z^;;b;^f;p;];n;;c;4;u;;:;Z;;b;^;晣;]4;n-;;d;4$;u;;:;Z\;;bi;^(;2;\;m;;c;4;u;;9;Yq;;aO;] ;.;[;mG;E;c;3;u;;80;W;;_;[;;Z;l;;c|;3;u;;5;UX;;];Z;;Z1;l ;;c\;3;u;;4*;S;;\y;Y;1;Y;k;;cm;3;u;;3;R;0;[;X;1;Z;l/;;c;4;u;;2;R<;;[;Y;敃;Zu;l;;c;4C;u;;2;Rj;7;\!;YS;;Z;l;a;d;4c;u; :e:e:e:e:eL:e:e :e:e:es:e :e:en:e:e;:e:e;];Ϻ;z;V;J;U;=;oG;;;*;YC ;\;];Ϻ;y;V;J;U;;p;;;.;YI;`;];Ϻ;y;V4;J;V|;;t?;;t;5x;YTh;f;];Ϻ;y;U;K ;W;;x;;6;=8;Y`P;mV;];Ϻ;yN;U;K;Xw;;{0;;9;AJ;YgJ;q;];Ϻ;z;WM;M/;Z;4;|;;z;=;Y` ;l;];Ϻ;{2;Y;P ;];9;} ;1;;5;YP;c;];Ϻ;{s;Z&;P;^?;1;{;$;;0;YG;^7;];Ϻ;{1;Y;PX;];E;z;;;/;YG};^w;];Ϻ;{j;Z;P;];;{6;;;0;YH;^;];Ϻ;{&;Ye;O;];:;{;;;5;YP;c`;];Ϻ;z;W';L;Z;;z;c;);< ;Y]s;kR;];Ϻ;yC;U;J;W;;yG;;;=;YaQ;mx;];Ϻ;y};U;J;W7;h;v;W;;9 ;YX;h;];Ϻ;y;V1;J;V;;r;x;=;1;YM;b#;];Ϻ;y;V;J;U;;pG;a;;,Q;YEJ;]g;];Ϻ;z;V;K;U;M;o*;e;@;);Y@;Z;х;х;х;х;ф;ф;ф;ф;ф;ф;ф;ф;ф;х;х;х ;х;В;В;1;1;ϟE;ϟE;ϟK;ϟT;ϟ[;ϟZ;ϟS;ϟK;ϟE;ϟC;ϟF;ϟL;ϟT;ϟ[;ϟ[;ϟT;ϟK;В;В;В;В;В|;Вy;Вx;Вy;Вy;Вz;В};В;В;В;В;2;5;6;4;/;*;';';(;+;0;4;6;4;2;I;I;I;I;I;I;I;I;I;I;I;I;I;I;I;I;I;;;%;%;`";` ;`(;`-;`-;`*;`6;`I;`L;`I;`O;`L;`9;`-;`-;`+;`%;;;;;;;;;;;;;;;;%;%;%;%;%;%;%;%;%;%;%;%;%;%;%;Դ`;ԴK;Դ0;Դ;Դ;Դ;Դ4;ԴM;ԴX;ԴQ;Դ;;Դ!;Դ;Դ;Դ-;ԴG;Դ];@;@;;;б;а;а;а;а;а;б;б;б;б;б;б;б);а;а;а;а;@;@;@;@;@;@;@;@;@;@;@;@;@;@;@;;;;;;;<;E;@; ;;;;;;M;L;L;L;L;L;M;MP;Mh;MY;M%;L;L;L;L;L;M ;D<;D6;W";W;kN;k=;k-;k;j;j;k;l;mQ;mZ;m^;l;k;k;j;k;k;D&;D ;C;D;DQ;D;D;D;D;D;Db;D;D;D ;D ;W;V;V;W ;Ww;X;XZ;Xq;Xd;X;W;W;V;V;W;!; ; ; ; ;!;!;!;";";!;!<; ; ; ; ;!;?;?;u;u;ώ;ώ;ώ;ώt;ώ;ώ;ϐ%;ϑ;ϒm;ϒ;ϒ;ϑ;ϐd;Ϗ.;ώ;ώ;ώ;?;?;?;?;@>;@;A?;Ai;AQ;@;@d;?;?;?;?;u;u{;u;u;v;w;x;x8;x$;w;v;v;u;u;u;8;8;8k;8g;8;9A;9;:;:;:;:,;9;8;8;8;8;8;0;0;?;?;;v;;;s;D;;;T;r;;;C;;;;;0o;0p;0;1;1;2;31;3k;3Q;2;2;1];0;0;0;?;?;@?;@;A;C ;C;C;C;CR;BH;AC;@;@;?;r`;r;;r(;rR;r;s;t;uO;u;u|;t;t ;sS;r;r;rn;rt;o;;no;n;˟m;˟|;˟;ˠ;ˢ ;ˣp;˥;˦;˧R;˧d;˧;˧Q;˥;ˤX;ˢ;ˡO;ˠ;x;;(;;;;;;;A;i;y;;;;n;o&;p;q;rZ;s;t1;tg;tj;s;r;q;p;o;n;SR;SC;Sb;S;T;U;V;W;W;W;WV;Vx;U;T;T;S;S;ֳ;ִ;:;; ;Df;D;E8;F;I`;Kt;M;N;N;M;Np;N;NV;L;J;H8;E;ֳ;ִ;ֵo;ֶ;ַ;ָ;ֹq;ֹ;ֹ;ֹP;ָ;ַ;ֶp;ֵc;ִ;;@;;@a;yQ;z;z;}%;;];;l;;~&;~;;;$;h;;}4;A;B?;C;F;G;Hn;H&;G;G;H`;H;H;G;E;C;?;A`;C;E;GH;F;E;E$;Eg;F;H8;H;Gr;E;Bt;;;;̶;s;T;њ;;;;;;G;k;,;ͱ;H;;!;yr;y;@8;@S;@j;@ ;@;@ N;@ R;@ &;@;@;@;@ ;@ ;@;@ ;@ ;@;;;;;S;';;;;9;;O;;4;;y";y;y;y>;y;y;y;y;y3;y;y;y;y;y;y;=};=;>);?G;@;Bz;C;C;C;C;D;D;C;B;A;@g;?;; ;I;I; ;U; );7;;;;p;;Y;{;~; ;;; ; ;;m;q;;);;;;;=;q;H;;;S;I4;IL;I;I`;I^;I(;I;It;I;If;IQ;Ix;I;I;IE9r;ِ:O6;&b;dBR;;,;P;W;U;P;f;V;C;;ِ9r;;C;V;f;Q;U;X;Q;,;;dBV;&e:O9;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ:T:$::bN;FQ;5K;@;s^;$;yk;F ;;n];/;I;>>;ƏL;Î;_;HN;";@;f;;i;];A;( :$:U:bO:;5K;FQ;s`;@;yl;$;;F ;/;n];>>;I;Î;ƏK;HN;_;@;";;f;];i;( ;A9W9r9!9+9;9JV99o9m999899(>9 99;;å;W;gc;;W;o;n;.;3;dD.;&:NK;;î;WF;f;;W;;;2; ;dN;&d:\;/;ë;U;c;;Tb;;Ł;5;$;db;':Ƈ;;;V:;e=;;]3;;;ID;(o;d;'+:ƔH;;;Rl;^;;U|;;;J;/D;d.;'M:8;b;ü;V;d;;\;;;H;';d=;'/F:Ɵ;;ķ;Z;l; ;d;/;;?b;;dX;&X:L;;z;Z;n;;f ; ;;=u;;dL;&:8;;O;WD;g; ;];;);9';;dS;':a%;;;Z;nA; ;f{; I;Ԯ;=; ;dJj;&:4;;Ļ;Z;m;^;e; J;W;D;;da;':Tg;f;;V8;eD;;]; ;;N0;.;dJ;'::Ư;;;;Ry;^;G;V;2;0;M(;2;d;'T:;;;VZ;e;O;^a;5;;K;+-;dI;'/D:Ɨ3;4;å;U;cw;;U>; ;;7i;;df;':ƈe;;ð;W';e;;W;[;ĉ;1p; f;dN?;&:^E;;Ö;W;f;L;W/;;;.];%;dD;&:P;A;(.;A;(L;A;(~;B;(;B;(;B;(;A;(k;A;(J;A;(7;A;(F;A;(g;B;(;B;(;B;(;A;(z;A;(I;A;(,;i";;i2;;i@;;iD;;i;H;iW;;i;N;i;*;if;;i;%;i;I;iQ;;i;D;iC;;iB;;i6;;i(;;l;$;A;;;I;Π;;;;>;;;^;G;;Ф;;;;;;R;-;p;;r;Θ;;;W;X;;ϋ;V;";l;"/;;!;;!i;; ;l;";;&,;);&;;%;[;&;;& ;;";; _;?;!H;Ѷ;!;Ѿ;"O;;";;_;H;_c;G;_4;GF;_;H;_;FD;a;J;f$;P;g ;Q;e;N`;f;Qh;e;P>;a;J;^;E;_y;H{;^;F;_u;H;_;H;Ən;Ï@;Əq;Ï;Ɛ(;Ïd;ƒ?;ÓN;ƒ";Ñ;ƕ';Õc;ƙ;Ú;ƙ;Û;Ƙ;×;ƙW;Û;Ƙ^;Ú;ƔR;Ôg;Ƒl;ÐY;Ƒ;Òg;Ə;Î;Əg;Ï;Ə;Ï;J;>;J;?p;L;AI;P;G;Q;F;Ty;J;W;N%;V;M;T;I;V=;L;U;L;R;H;Pk;Ev;O;Fp;K;@D;J;?f;JM;?F;o ;0;p;26;t;6J;z;?;}+;@;~;CJ;;B;|;@-;z;<;|W;?l;} ;@\;|;@!;{ ;>;x;=;s/;4;pC;2;o;0;G%;J;J;K;P;;;X;֕;\;e;\;-;X;;Tx;Ώ;R;;S;;V;;Y~;;Y;:;V;;N;$;I0;;F;T;&l;z;*;3;2z;i;<;;A;D;?I;;6;:;0;7;/8;;0;0;5;=;<;;>q;;9;F;/o;;);~l;%;z;BU;sW;F;s;O.;s,;Yz;t;_U;tM;Zc;t ;N;s;G;sؒ;GT;sF;H ;sr;M;s;W;t#;[;t;U`;tK;K;so;D;s֞;An;s;F;5͑;F;5b;Fb;5L;F@;5;Fկ;6;Fʞ;6;F;5 ;Fw;5̊;F;5Ҕ;F@;5͞;F@;5P;F;5;FK;6 ;F;5;Fw;5;F;5;F ;5:::d:%:q/:6:ވ:G.:ޝ:W:޾K:G:ޣy:':nT::[D::i.::\:'s:k:C):ޜ:N_:޵:=:ޖ(:.R:ރ: p:m :L:b}:$|::$:F:$C:T:$:T:$x:%W:$:0:$:h:$::$H:::$0::$::$U:9:$::$: :$::$:g:$z:6;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ9W9r9!9+9;9JW99o9m999899(=9 99;;å;W;gc;;W;o;m;.;2;dD+;&:NH;;î;WF;f;;W;;;2; ;dN;&a:\;/;ë;U;c;;Tb;;ŀ;5;#;db;':Ƈ ;;;V:;e=;;]3;;;ID;(n;d;'+:ƔF;;;Rl;^;;U|;;;J;/C;d,;'M:7;b;ü;V;d;;\;;;H;';d;;'/E:Ɵ;;ķ;Z;l; ;d;.;;?b;;dX;&W:L;;z;Z;n;;f ; ;;=u;;dL;&:8;;O;WD;g; ;];;);9';;dS;':a%;;;Z;nA; ;f{; J;Ԯ;=; ;dJj;&:4;;Ļ;Z;m;^;e; K;X;D;;da;':Th;f;;V8;eD;;];!;;N0;.;dL;'::Ư<;;;Ry;^;G;V;3;0;M);2;d;'T:;;;VZ;e;O;^a;5;;K;+.;dK;'/F:Ɨ5;4;å;U;cw;;U?;;;7j; ;df;':ƈh;;ð;W';e;;W;[;Ċ;1q; g;dNB;&:^H;;Ö;W;f;L;W/;;;.^;&;dD;&:P;A;(.;A;(L;A;(~;B;(;B;(;B;(;A;(k;A;(J;A;(7;A;(F;A;(g;B;(;B;(;B;(;A;(z;A;(I;A;(,;i";;i2;;i@;;iD;;i;H;iW;;i;N;i;*;if;;i;%;i;I;iQ;;i;D;iC;;iB;;i6;;i(;;l;#;A;;;I;Π;;;;=;;;^;G;;Ф;;;;;;R;-;p;;s;Θ;;;W;X;;ϋ;V;";l;".;;!;ѿ;!i;; ;l;";;&,;);&;;%;[;&;;& ;;";; `;@;!H;ѷ;!;ѿ;"P;;";;_;H;_b;G;_3;GE;_;H;_;FC;a;J;f$;P;g ;Q;e;N`;f;Qh;e;P?;a;J;^;E;_z;H|;^;F;_w;H;`;H;Əl;Ï?;Əo;Ï;Ɛ';Ïc;ƒ=;ÓL;ƒ!;Ñ;ƕ&;Õb;ƙ;Ú;ƙ;Û~;Ƙ;×;ƙW;Û;Ƙ_;Ú;ƔS;Ôh;Ƒm;ÐZ;Ƒ;Òh;Ə;Î;Əi;Ï;Ə;Ï;J;>;J;?n;L;AG;P;G;Q;F;Tx;J;W;N$;V;M;T;I;V=;L;U;L;R;H;Pm;Ex;O;Fr;K;@F;J;?i;JO;?G;o;0;p;22;t;6G;z;?;}(;@;~;CG;~;B;|;@,;z;<;|X;?m;}";@^;|;@#;{ ;>;x;=;s2;4;pF;2;o;0;G ;F;J;F;P6;;X;֑;\;b;\;*;X; ;Tw;Ύ;R;;S;;V;;Y;;Y;>;V ;;N ;);I6;;F;Y;&f;z;*;,;2s;c;<;;A;?;?E;;6;7;0;6;/8;;0;1;5;@;<;;>v;;9$;L;/u;;) ;~t;%;z;BM;sL;F;s;O&;s;Ys;t;_O;tB;Z_;t ;N;s;G;s؏;GT;sF;H";su;M;s;W;t+;[;t;Uf;tY;K;s};D;s֯;Au;s*;F;5͆;F;5U;FT;5?;F3;5;Fե;6;Fʗ;5;F ;5;Ft;5̈;F;5Ҕ;FB;5͡;FF;5U;F;5;FT;6 ;F;5;F;5;F;5;F;5:%:d:%:q:5:ވ:G:ޝ:W:޾=:Gv:ޣn:':nL::[?::i-::\:'z:k:C3:ޜ":Nn:޵':=:ޖ9:.e:ރ: :m8:_:b:${::$:F:$B:S:$:T:$w:%V:$:0:$:h:$: :$H:::$1::$::$U:9:$::$: :$::$:h:${:7;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ9=39LO9d9|/9n79iT9n79|/9d9LO9=2; ;Α;R;C;;;;C;R;Α; ;Ѹ;.;˯;ʹ;;Т;;ʹ;˯;.;ѷ;J;Z;ŔB; };o>;ԅ;o>; };ŔA;Z;J; ;;;W;Q;(;Q;W;;; ;B ;Y;;y;pP;;pP;y;;X;B ;s;)(;;Z ;rb;;rb;Z ;;)';s;u;R;S;X/;\;c;\;X.;R;Q;t;);2;+;y;n;j2;n;y;+;2;);al;U_;hB;U;K[;GV;KZ;U;hA;U^;aj;t%;VP;?A@;.;%@S;" ;%@S;.;?A>;VP;t%;A=`;&';-;:l:_A:l;;-;&%;A=];:,:؏::`::`::،:);:;::g:Rn:Ft`:B~:Ft_:Rn:g::9;ΐ;Ώ;S;!;;>;;!;SB;Ώ/;/;Т;(;x;E;ی;H;ˡ;x;;;ۏ;Q;ܧ;`;;Ε;Σa;β;Ή;Ή;Ξr;Έ;Ί*;β;Σ;Ζ=;`;4; ;H; -;4;`;wK;S;P;x;P;Q ;P\;g;̾;˲;Ζ;@; |;@;;˯;̺ ;;Ѻ;;;*;;ͺ;͸;d;͸];ͼ; ;*;-;;k;׍;[;K;̤;̐w;q;̏;̤{;J;;;;o;S;ʵ;;?;;\;˼;˱;];ˠ;˴;;ˡ;;Jz;śo;Q;@;j;G;P2;Ŕ];? ;; e;>;N;@;QH;;6; i;;A;P;(;I;<; -;ȑ;?;ɨ;q;;Ȓ;; h;ɦ;@;Ȕ;7;&;_;!;g;f;1;k;ě;Ů;f;wk;ż3;~;;;%;;;F;(;;;;;6;ƀ*;Ƅ;zi;ƌ;Ş;Œm;@;ŗ;Ūs;ƍ3;u0;{;u);6;;܌;;;^;U;;;u;Y;;Ic;}/;?;ϵ;R;;>;|;O;p;;q;x;;%p;;d;;;jF;z;;0;;7;`';1;;^d;+;;;Q;;;;Z;;/;V;|;b;bT;);n;;w;_;OG;;";Z;;7;;N;$;E#;G;WT;E;+; ;j;;k;9; W;E;;lt;=;3; ;;֨;0; ;Q;;A;*v;s;];;Dq;[;4;;F;'7;b;;#;`;>;4 ;a;I;;;*;:{;[n;U;};o;]5;;; o; %;w;$;8z;F;;;.t;;l;&;D;;_;;Ͷ;;;V;:;v;; ;ʏ;bx;Ӗ;[;* ;mQ;ص;-;2; ;E;;;%;R; ;;m;r;+; ;;;;;/;Z;)-;x;; D;|;;;};;k;{M`;r;n;r;{,;B;;;w;;H>;>;gj;;;@;Y;,;;0;;9;n;;;;E;;;;,;~;s;;@;;|;zd3;|w;;;Hj;; ;?;;@;2;9;92;h;WC;NO;J;NP;W;hMF;;2; ;<;6;;";;;;;A;;F;`8;;;̽;Z;3;~=;z;]A;y9;~le;;;;nc;]&);X;Vjx;X;];n;zj;kw;l%r;z˫;i;l;jB;s{;V(;?;0;();%4;((Y;/;? ;Uw;s;t;x $;v(;}o;v;q;p;t;p4;q;w6;}W;v;w;t;Y9;a;c;T8;OL;T;O;T3;cM{;a|;YO;E1;5g;1A;/[E;1w;5To;D;Q=;Bx;CE;P;Ag;C;A8;AY;&T;;7;:X;;;p;&DF;@;B Z;D;Cy;I;;C>;>;>2A;Al;>4R;?$;D;I;B;D~;B;).;0;2U;%%;!J;%; ;$;1;0j;)~=;/^; 0;Ճ;Jz; ; ;7;"L;Q;;"*;a;G;D;:b:̢s:o:^:SF::A8:H:;M; X ; ; h;"; A;X;);Ф;);T; X;Dz; P; _.; S~::::g::q:ߎ::R5:V:왫:+q:V: :[::}:X: :f:#:ׇ:ή:Ѧ2::::h:S:J :Ff:J:S:h":3:N:::6::FU:[:?::::::EW:H@::p:Yl:::~:>:}:G:4:":!:p :Z1:U:S":Uq:Z:o::l:m޽::k$ :ng:k9\9`09-9}9roI9n(C9ra9}k9k9#99aj9Y9u9N9:D9jo9{9f9m999l9E9b9b69=9^99s9s99h9l9B99"9l]9 U9l9|9 9 9.9B99<9k9O99;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ِ;ΐ;Ώ;S;!;;>;;!;SB;Ώ/;/;Т;(;x;E;ی;H;ˡ;x;;;ۏ;Q;ܧ;`;;Ε;Σa;β;Ή;Ή;Ξr;Έ;Ί*;β;Σ;Ζ=;`;4; ;H; -;4;`;wK;S;P;x;P;Q ;P\;g;̾;˲;Ζ;@; |;@;;˯;̺ ;;Ѻ;;;*;;ͺ;͸;d;͸];ͼ; ;*;.;;k;׍;[;K;̤;̐w;q;̏;̤{;J;;;;o;S;ʵ;;>;;\;˼;˱;];ˠ;˴;;ˡ;;J{;śp;Q;@;j;G;P2;Ŕ];? ;; e;>;N;@;QG;;6; i;;B;P;(;I;<; -;ȑ;?;ɨ;q;;Ȓ;; h;ɦ;@;Ȕ;7;';_;!;g;e;1;k;ě;Ů;f;wk;ż3;~;;;%;;;F;(;;;;;6;ƀ*;Ƅ;zi;ƌ;Ş;Œm;@;ŗ;Ūs;ƍ3;u0;{;u);6;;܌;;;^;U;;;u;Y;;Ic;}/;?;ϵ;R;;>;|;O;p;;q;x;;%q;;e;;;jF;z;;0;;7;`&;1;;^d;+;;;Q;;;;Z;;/;V;|;a;bT;);n;;w;_;OH;;";Z;;7;;N;$;E#;G;WT;E;+; ;j;;k;9; X;E;;lt;<;2; ;;֧;0; ;P;;A;*u;s;];;Dr;[;5;;F;'8;a;;";`;=;4 ;b;I;;;*;:|;[o;U;};o;]4;;; o; %;x;$;8y;F;;;.u;;m;&;C;;_;;Ͷ;;;V;9;v;; ;ʏ;bx;ӗ;[;* ;mQ;ض;-;2; ;D;;;%;R; ;;m;r;+;!;;;;;.;Y;),;x;; E;|;;;~;;k;{Ma;r;n;r;{,;B;;;w;;H=;>;gj;;;@;Z;-;;0;;:;n;;;;E;;;;,;~;s;;@;;|;zd3;|v;;;Hj;; ;?;;@;2;9;93;h;WC;NO;J;NP;W;hME;;2; ;<;5;;!;;;;;A;;G;`9;;;̼;Y;3;~<;z;]A;y9;~le;;;;nc;]&*;X;Vjx;X;];n;zi;kw;l%r;zˬ;i;l;jB;s};V(;?;0;();%4;((Y;/;? ;Ut;s;t;x !;v&;}o;v;q;p;t;p4;q;w6;}W;v;w;t;Y9;a;c;T7;OL;T;O;T3;cM|;a|;YQ;E1;5g;1A;/[E;1w;5Tn;D;Q<;Bx;CE;P;Ag;C;A8;A[;&U;;8;:X;;;p;&DE;@;B X;D;Cy;I:;C=;>;>2A;Al;>4R;?$;D;I;B;D~;B;).;0;2U;%%;!I;%; ;$;1;0k;)~?;/`; 0;Մ;Jz; ; ;6;"L;Q;;"*;b;G;D;:d:̢t:o:^:SF::A7:H:;L; X; ; h; ; @;W;);Ф;);U; Y;dz; R; _0; S::::f::q:ߎ::R7:V:왭:+r:X: :[::}:W: :f:#:׉:ή:Ѧ2::: :h:S:J :Ff:J:S:h":2:K:::5::FU:[~:>::::::EX:HB::p:Yl:::~:>:}:G:4:":":p :Z2:U:S":Uo:Z:o::l:m޾::k$ :ng:k9\9`09-9}9roI9n(C9ra9}k9k9#99aj9X9u9N9:D9jo9{9f9m999l9E9b9b69=9^99s9s99h9l9B99"9l]9 U9l9|9 9 9.9B99<9k9O99;A;t;$:dY:3:%Y:dY:%Y:3;A;t;$;k;\;!:[:ϹT;(;iC;:;6Z;z;;G:dI:d:dl:d:dP:d:d:dP:d:d:dJ:d:d:d:d:d:d:3@:%:3):%:3:%:4:%<:5:%):7>:%:8:%:8C:%:8R:%~:8r:%:8:%n:9>:%:9V:% :8:%?:7:%:6Z:%:4:%;C;Ds;E;F;G;G;G;G;Gf;G;;F;E;DJ;B;A;A?;AB;t;$;t;$;t;$;u;%;w;'p;y];);z;*?;{N;*;{f;*;{o;*;{;+";{f;+(;z;*;z%;*;x;(;wf;'d;u;%:[;!;\;k;;iC;(:ϹT;G;z;;6Z:;G;G;G;H;J/;K;L;M ;M ;M;ME;MR;M ;L_;KE;I;H;z:;z=@;6ZE;6\C:::N:::G:+::L::):0::C:*::(;z:;z;;z=;z@#;zB;zD;zDU;zD,;zDK;zD;zE);zD;zC;zA;z?;6Zf;6[B;6\;6^;6`O;6a+;6a2;6`;6a;6a;6bG;6bX;6a;6` ;6^;;;;;;K;7;;;;;;;1;);;;iB4;iD;(\;(::ϸ~:Ϻ:ϸr:Ϲ8:Ϻ:ϼ:Ͼ]:Ͽb:Ͽ:Ͽ:Ͽ:a::(:k:Ͼ:ϼ;iBL;iC9;iD;iF;iI;iJd;iJ;iJ;iJ;iKf;iK;iK;iJ;iH;iF;(a;( ;(C;(;(D;();(k;(e;(;(;(L;(O;(;(p;(;;;i;Q;z;;q;;;;=;`;@;;;;_;\;\ 8;!\;!.:j::-::::+:e::R:::D:G::g:;\;\;\ ;\ ;\ ;\;\l;\;\;\%;\s;\V;\;\;\ .;!E;!;!;!;![;!E;!;!;!;!F;!;!;!;!;!:dI:d:dl:d:dP:d:d:dP:d:d:dJ:d:d:d:d:d:d:3@:%:3*:%:3:%:4:%<:5:%):7>:%:8:%:8C:%:8R:%~:8r:%:8:%n:9>:%:9V:% :8:%?:7:%:6Z:%:4:%;C;Ds;E;F;G;G;G;G;Gf;G;;F;E;DJ;B;A;A?;AB;t;$;t;$;t;$;u;%;w;'p;y];);z;*?;{N;*;{f;*;{o;*;{;+";{f;+(;z;*;z%;*;x;(;wf;'d;u;%;G;G;G;H;J/;K;L;M ;M ;M;ME;MR;M ;L_;KE;I;H;z:;z=@;6ZE;6\C:::N:::G:+::L::):0::C:*::(;z:;z;;z=;z@#;zB;zD;zDU;zD,;zDK;zD;zE);zD;zC;zA;z?;6Zf;6[B;6\;6^;6`O;6a+;6a2;6`;6a;6a;6bG;6bX;6a;6` ;6^;;;;;;K;7;;;;;;;1;);;;iB4;iD;(\;(::ϸ~:Ϻ:ϸr:Ϲ9:Ϻ:ϼ:Ͼ]:Ͽb:Ͽ:Ͽ:Ͽ:a::(:k:Ͼ:ϼ;iBL;iC9;iD;iF;iI;iJd;iJ;iJ;iJ;iKf;iK;iK;iJ;iH;iF;(a;( ;(C;(;(D;();(k;(e;(;(;(L;(O;(;(p;(;;;i;Q;z;;q;;;;=;`;@;;;;_;\;\ 8;!\;!.:j::-::::+:e::R:::D:G::g:;\;\;\ ;\ ;\ ;\;\l;\;\;\%;\s;\V;\;\;\ .;!E;!;!;!;![;!E;!;!;!;!F;!;!;!;!;!;k0};;;u};n;kS;j2;iz;f;_;L.;2m;j2;2m;L.;_;f;iz;k0};;;u};n;kS;j;j{;jh;j@;i^;i);j|;kOv;f;h;jI;l ;` ;c~F;i_;o;P;W;eM;v4;,<;=\;[;yZ;j2;j2;j2;j2;j2f;j2#;j1;j1;j1h;j1I;j1@;j1P;j1t;j1;j1;j2-;j2l;iz;f;_W;L=;2m;iz;fG;_ؗ;Lk;2l;izI;f;_;L;2ld;iy;f8;_Z;Lˤ;2l;iy;f;_;L;2mm;iyK;fl;_ ;LN;2nZ;iy;fD;_F;L;2oH;ix;fL;_׸;L;2p;ix;f;_J;L΋;2p;ix;f;_;L.;2q;ix;fA;_ـ;Lϱ;2qV;iy;f;_ ;L;2q;iy_;f,;_{;LX;2q;iy;f;_;Ll;2qu;iz;f;_;L@;2p;izJ;f;_;L;2p;iz;f);_ڎ;L;2o ;k0p;k0H;k0 ;k/;k/p;k/#;k.;k.;k.;k.;k.;k.;k/L;k/;k/;k0=;k0k;;$;u|;nZ;k;;;u{;n;k۱; ;;u{<;n;kD;;;u{;n~;k;;e;u{M;n~i;k~;;;u{;n~o;k?;V;;u|;n~;k#;;;u}Y;n;k+;-;;u~;n;kU;j;;u~;n%;kڙ;;;u];n;k;;@;u;n.;kN;;O;u;n;kۭ;k;,;u-;n;k;;;u;n;kG;;3;ub;n;kn;;y;u~;n;ks;j@;jh;j{;j;kOv;j|;i);i^;l ;jI;h;f;o;i_;c~F;` ;v4;eM;W;P;yZ;[;=\;,<;x;x;x;yd;z.;{;{;|*;|q;|;|;};|;|;| ;{);z2;[;[;=[;=^ ;,^;,L;,;,;,);,;,;,;,݅;, ;,k;,޴;,;,;,;,7;,[;[.;[s;[P;[;[;[.;[;[;[;[?;[;[;[;[;[;=[r;=[;=\;=];=^3;=_<;=`;=`;=`;=a,;=ag;=ap;=a!;=`g;=_O;v2;v2=;v2;v2z;v3T;v4o;v5;v6;v7R;v7;v8e;v8;v8;v8;v7;v6;v5z;eK;eNF;W;W;P;P;PN;P;P;P;P;PY;P-;P;P;P ;Pk;P;P;Pr;P;eK/;eJ;eK2;eK;eL;eM;eN;eO;eP);eP;eP;eQ;eP;ePh;eOy;W;W;W;W.;W;W;W;W;W;W;W;W;W ;W;W;o;o;oN;o";oT;o;o;oR;o;o;oO;o;o;o#;o;oe;o;i^;i`w;c}k;c;` ;` n;`K;`;`;`;`;`L;`;`n;` ;` ;` -;` ;` ;` ;` ;i];i]:;i\;i];i];i^#;i^;i_;i`C;i`;iaM;ia;ia;ia;ia,;c|;c{;c{;c{;c{;c|G;c|;c};c~A;c~;cU;c;c;c;c;lg;l;l;l;ln;lp;l;l;l;l;l;l);l;l;l;l;l;jI ;jJ;hs;h J;f;f0;f;f;f;f;fH;f2;fL;f;f;fi;f;fZ;f;f ;f5;jHa;jG;jGE;jF;jF;jG;jGr;jG;jHq;jH;jIz;jI;jJ:;jJc;jJY;h;h?;h;hY;h.;h;;hx;h;hR;h;hT;h;h %;h _;h n;kO4;kN;kNk;kM;kM;kMb;kMC;kMJ;kMq;kM;kN ;kNh;kN;kO;kOc;kO;kO;jD;j;i;i);iS;iJ;i);i;i;i0;i;i;ij;i^;ip;i;i;i.;i;i;i;j;j;j;j;jv;jO;jK;ji;j;j;jM;j;j;jM;j~;i;il;i;i;iV;i;i;i;i;;i{;i;i%;i~;i;i;j;j;jE;j;j;jM;j;j;j;j;j%;jd;j;j;jK;j;j;jv;jc;jh;jg;j@;j@;j@;j@;j@;j@s;j@*;j?;j?;j?w;j?a;j?b;j?z;j?;j?;j@&;j@k;jU;j;j;j{;j+;j;j;j;j;j;j;jY;j;j;j3;jh ;jg;jg;jgY;jg ;jf;jf;jfo;jfi;jf};jf;jf;jg';jgp;jg;k0p;k0H;k0 ;k/;k/p;k/#;k.;k.;k.;k.;k.;k.;k/L;k/;k/;k0=;k0k;ks;n;u~;y;;kn;n;ub;3;;kG;n;u;;;k;n;u-;,;k;kۭ;n;u;O;;kN;n.;u;@;;k;n;u];;;kڙ;n%;u~;;j;kU;n;u~;;-;k+;n;u}Y;;;k#;n~;u|;;V;k?;n~o;u{;;;k~;n~i;u{M;e;;k;n~;u{;;;kD;n;u{<;; ;k۱;n;u{;;;k;nZ;u|;%;;j2;j2;j2;j2;j2f;j2#;j1;j1;j1h;j1I;j1@;j1P;j1t;j1;j1;j2-;j2l;iz;f;_X;L>;2m;iz;fG;_ؗ;Lk;2l;izI;f;_;L;2ld;iy;f8;_Z;Lˤ;2l;iy;f;_;L;2mm;iyK;fl;_ ;LN;2nZ;iy;fD;_F;L;2oH;ix;fL;_׸;L;2p;ix;f;_J;L΋;2p;ix;f;_;L.;2q;ix;fA;_ـ;Lϱ;2qV;iy;f;_ ;L;2q;iy_;f,;_{;LX;2q;iy;f;_;Ll;2qu;iz;f;_;L@;2p;izJ;f;_;L;2p;iz;f);_ڎ;L;2o ;x;x;x;yd;z.;{;{;|*;|q;|;|;};|;|;| ;{);z2;[;[;=[;=^ ;,^;,L;,;,;,);,;,;,;,݅;, ;,k;,޴;,;,;,;,7;,[;[.;[s;[P;[;[;[.;[;[;[;[?;[;[;[;[;[;=[r;=[;=\;=];=^2;=_;;=`;=`;=`;=a-;=ag;=ap;=a!;=`g;=_O;v2;v2=;v2;v2z;v3T;v4o;v5;v6;v7R;v7;v8e;v8;v8;v8;v7;v6;v5z;eK;eNF;W;W;P;P;PN;P;P;P;P;PY;P-;P;P;P ;Pl;P;P;Pr;P;eK/;eJ;eK2;eK;eL;eM;eN;eO;eP*;eP;eP;eQ;eP;ePh;eOy;W;W;W;W.;W;W;W;W;W;W;W;W;W ;W;W;o;o;oN;o";oT;o;o;oR;o;o;oO;o;o;o#;o;oe;o;i^;i`w;c}k;c;` ;` n;`K;`;`;`;`;`L;`;`n;` ;` ;` -;` ;` ;` ;` ;i];i]:;i\;i];i];i^#;i^;i_;i`C;i`;iaM;ia;ia;ia;ia,;c|;c{;c{;c{;c{;c|G;c|;c};c~A;c~;cU;c;c;c;c;lg;l;l;l;ln;lp;l;l;l;l;l;l);l;l;l;l;l;jI ;jJ;hs;h J;f;f0;f;f;f;f;fH;f2;fL;f;f;fi;f;fZ;f;f ;f5;jHa;jG;jGF;jF;jF;jG;jGr;jG;jHq;jH;jIz;jI;jJ:;jJc;jJY;h;h?;h;hY;h.;h;;hx;h;hR;h;hT;h;h %;h _;h n;kO4;kN;kNk;kM;kM;kMb;kMC;kMJ;kMq;kM;kN ;kNh;kN;kO;kOc;kO;kO;jD;j;i;i);iS;iJ;i);i;i;i0;i;i;ij;i^;ip;i;i;i.;i;i;i;j;j;j;j;jv;jO;jK;ji;j;j;jM;j;j;jM;j~;i;il;i;i;iV;i;i;i;i;;i{;i;i%;i~;i;i;j;j;jE;j;j;jM;j;j;j;j;j%;jd;j;j;jK;j;j;jv;jc;jh;jg;j@;j@;j@;j@;j@;j@s;j@*;j?;j?;j?w;j?a;j?b;j?z;j?;j?;j@&;j@k;jU;j;j;j{;j+;j;j;j;j;j;j;jY;j;j;j3;jh ;jg;jg;jgY;jg ;jf;jf;jfo;jfi;jf};jf;jf;jg';jgp;jg:":d`n:BG:!:9п9z9q9/x888@5.77:~7.78/-8+8~99T 92m99z:K:>Ƚ:`:~7.78/-8+8~99T 92m99z:K:>Ƚ:`:"778@5*889/x9q9w9о::!:BF:d`n:g:`:e:rn7 7677v77y7E7Ks8,V8)78*&81818+8888>8Ҍ8 9Q9969 Ø9O39Mx9RK9^ї9t>9_9 d9J9^999î99B9_9E:A:es::π:2s:.u:1y:8:O:I:Mt:W:~Ɣ:~:~:~ :~:~:~b:~:~:~:~:~Q:~:~T:~l:~F:~778/-z88~)99T Q929R9:K:>ȅ:`7N78/,8H8{9 9Tg9/Y99:I:>m:`7z78/(8,8up9e9T9*9~Q9:F:>:`778/#8F8mY9G9S9%I9w9 7:B<:>%:` 77 8/>8r8c<9[9SK9 9q9:?(:>>:`o7H7v;8/8_8XP99S99m9:=:>:`7u7jj8/F88N9G9SY99l[9:=:>:`*7n7b8.!88H99Sߝ99lO9:>:>:`b7ll7_8.88F99S99l9a:?-:>W:`7n7a8.8e8H99SQ99l^9:>:>:`7t7ia8/;88Ms9g9SY9B9k9:=:>:`7~,7t8/88U99Ss99ls9:=:>:`'7a7&8/08Ą8_99S99n9:=i:>:`7?78/!a88i9.9S|9"9s9f:?:>{:`7U7g8/'8/8q9T9S9's9y9a:C3:>:`778/*88xM9 9T9,9a9:G!:>:`F77Z8/,8$8|9G9T @909T9:JH:>:`R:"_:!: ::8::!N:"$:"_:"v:!: : : r:!:!:"f:d_:B:!]:<9о99q9/w88!8@4 7a7Z:d]:Bp:!:9к9~9q9/u888@577:dZ0:B I:!Ԓ:9в0919q9/p88v8@977}:dV:B:!&:9Ч9o9q9/hO88 8@<7ˑ7;:dT$:B\:!˹:9С9|9q9/a888@;47X7:dV":B:!x:_9О99qy9/W'88o8@"7ɱ7j:dZ:B |:!:9Р99q9/L8*88@7ɒ7i:d]:B:!:9УD9u9q9/Ih8'8s8?7Ɉ7|:d^:BP:!:9Ф99q9/J8r8k8?7ɋ67~a:d^D:B:!:9Т99q9/H8%88?7ɇ7|:d[:B :!:59П>99q9/J888@7ɑ^7:dV:B:!:G9М}9q9q9/Tx8ۍ8Ŭ8@!7ɰ7:dT\:B:!?:9Н9y9qg9/^888@9M7 7{:dV:B*:!:9У99qL9/d888@:7ʁ7:dY:B :!p:O9Ю9 9q 9/m88.8@87Ŗ7':d]:B:!U:G9з$9R9q9/tB8c88@6k77:d_r:B :!|:d9м99q9/w888@5$7'7q:rn:e:`:g7v7777 7Ki7E7y7818*&}8)78,V888)818 8Ҍ8>89 Ó9299Q9^є9RH9Mx9O39G9 b9^9t>9î999^9@9_9B9:~::er:A:8:1y:.u:2s:W:Ms:I:O7 7 O777q7'7777777-777 7 7777߰7vQ7vH7vN7wg7x97t7gV7X7QW7O7Q7XQ7f7s:7ws7v7v77777 7u.7nm7l7n7t7~7\777 7ߪ7v77e77¯77i7C777e77޴79777E7b777| 7s7p7s?7{ 7x77|777+7y7yG7$7~7K7KC7K7M7M7G76!7!777<7!747F97LB7L17K[7x7wC7sE7k7^7R7Ii7Fx7H7Q7]a7if7q7u7x7~7~}7|7t7f7W7NC7K7M7V7ea7s 7z7}_7~\8,U8,T8,Q8,L8,Dc8,98,/$8,'8,%Y8,'s8,.#8,88,Bg8,Ju8,O8,S48,U58)68)6l8*&R8*&81p818181I81b81z81jG81W/81M81K81L81V.81h81y 8181(81y8)58)38)/F8)'N8)8)k8)8)18)O8)o8)i8)%d8)-G8)18)48*%8*$8*!p8*8* 8)8)Y8)8)8)8* B8*8*8*#.8*%88n8}88 88588B88T8v8(888 8<88U8_88E8888~8{8u8i08[y8T8Sb8T 8Zp8g8s8y8}'8-88888C88b8܋88888898`8`8 L8 }888888188f888 8]8 888 888888M8888 8!8m88>D8=8Ҍ8ҋ8 8 G8 888i88Ӡ8˿8n88888888;86T8.8$88H888 8 88!U8*82898҉8҄8}8r8ex8Y8Q8O8Q:8W8b8oN8yP8ҁA8҇H9P9N,9I9C9<96&909-z9,g9-%9/94~9:j9@9F9K9On99U999 9 -9 9 9 9 )9 Y9 9 9 u9 f9 %9 )9 H9 v9 9 9 99 9999X9H99999 999>99R9~9vA9o9l=9kG9k9n9ta9{\9699 9O9O9OyI9Op9OhC9O`9O[?9OXw9OW9OX*9OZC9O^t9Od9Oli9Ot9O|,9O9M9M9R9R9^Ь9^9^x9^}9^9^9^:9^9^9^9^9^(9^69^9^ 9^9^'9M9Ma9M9M9M 9Mw9M9M9M\9Mg9M9MK9M?9M9Mt9R9R|h9Rs19Ri9Rax9R[9RX9RXm9RX9RZP9R^9Re9Rnp9Rw9R9s9qO9l9g9bm9^t9\%9[G9[#9[39[9]$9`9dr9i9n9rl999 9 99s99*9C9^9a9999]99999949a99\9999 999H999.999 &9A9?9999 99999&9999^/9[9U9OR9I9E9D-9D 9DE9D9C9DY9F9K[9Qp9W9\E9P9l9o99î:9ì9ê{9ã9Û9Õ-9Ò9Ò 9Ó9Ôg9Óm9ÑP9Ð+9Ñ9×O9ßm9ç39999W99%9;9ߋ9G999m99_999999~b9}o9~9~9~ 9|9|9~9999>9 9999c99G99|9a999999 9A9?h9^9\d9ԓ9Ҍ9o99`99 999999^999-9̞9>98909+9'9'k9(_9)9(9'99&n9'9,\93 9:9Z9TL9L9F9C9D89E9F9F9D 9Bg9Cf9H 9OM9V:A:?:<:9#:6H:4:4:5:6:5:4:44:4:6:9:=:@s:e?:d:į:Ä:,:::w:E:V::â::U:::i::::):cj:`R:\:Z:X:X:Y:ZT:Z:Y:X%:Xn:Zh:]:a6:::::"::::H:::::::2sy:2q:2n:2k:2hw:2gd:2g:2h:2iL:2h:2g:2f:2f:2h:2k:2oH:2r$:.u~:.tC:1x:1w:8:8:8:8ք:8:8b:8І:8ҫ:8Զ:8Ց:8&:8%:8o:8a:8:8Ԋ:8:.s:.p:.m:.k:.j*:.j:.k:.la:.l:.j:.i:.i:.kH:.n>:.q:1w#:1t-:1p:1n:1m:1o:1pe:1q :1p:1o[:1m:1mM:1n:1q:1u,:O:O!:OF:O':O:O :O:O:OK:O:O:O:O:O:O:O:O:I:I:MA:MM:W:W :W:W\:W:W:W/:WQ:W.:W:W:W:W:W:W:W0:W:Ic:I:I:I:I7:I:I:I:Im:IS:I:I:I:I:Ih:Mδ:M+:Mq:Mǔ:MY:My:M:Mʍ:MM:M:M|:M:M:M^:M:gg:g:gj:g:g:g:g:g:gO:g:g:g:g:g:g:g:g0:`:`:eT:e:r#:r޼:r:r:r:r:rV:r:r9:r:r:r:r=:rk:r:rۉ:rJ:`M:`:`:`:`:`9:`<:`:`:`:`:`B:`*:`*:`:e:e:d:d:dl:d`:e:e%:e:e:d:dQ:d :e:e:~Ɣ:~:~:~ :~:~:~b:~:~:~:~:~Q:~:~T:~l:~F:~:`R:>:JH99T909T @9G8|8$8/,7Y7:`F:>:G!99a9,9T9 8xM88/*77:`:>:C39a9y9's9S9T8q8/8/'7g7U:`:>{:?9f9s9"9S|9.8i88/!a77?:`:>:=i99n99S98_8Ą8/07&7a:`':>:=99ls99Ss98U88/7t7~,:`:>:=99k9B9SY9g8Ms88/;7ia7t:`:>:>99l^99SQ98H8e8.7a7n:`:>W:?-9a9l99S98F88.7_7ll:`b:>:>99lO99Sߝ98H88.!7b7n:`*:>:=99l[99SY9G8N88/F7jj7u:`:>:=99m99S98XP8_8/7v;7H:`o:>>:?(99q9 9SK9[8c<8r8/>7 7:` :>%:B<9 69w9%I9S9G8mY8F8/#77:`:>:F99~Q9*9T9e8up8,8/(77z:`:>m:I999/Y9Tg9 8{8H8/,77N:`:>ȅ:K99R929T Q98~)88/-z77:"_:!: ::8::!N:"$:"_:"v:!: : : r:!:!:"f7p718@5(889/w9q99м:e:!}:B :d_s77 8@6o88g9/tE9q9U9з(:I:!W:B:d]7&7š8@88389/m9q9 9Ю:Q:!q:B :dY77ʋ8@:889/d9qO99У::!:B+:dV7z78@9Q889/^9qj9z9Н::!?:B:dT\77ɰ8@! 8Ŭ8ۑ9/T{9q9s9М~:G:!:B:dV77ɑi8@889/J9q99П?:5:!:B :d[7|7ɇ8?88$9/H9q 99Т::!:B:d^E7~a7ɋ68?8k8r9/J9q99Ф::!:BP:d^7|7Ɉ8?8s8'9/If9q9t9УD::!:B:d]7j7ɒ 8@88*9/L9q9~9Р::!:B |:dZ7k7ɱ8@"8o89/W$9qu99О:_:!w:B:dV"77M8@;/889/a9q9{9С::!˸:B[:dT$7<7ˆ8@<889/hL9q|9m9Ч::!%:B:dV7~78@98p89/p9q9.9в-::!ԑ:B H:dZ0778@5889/u9q9{9й::!:Bo:d]7Z7V8@488|9/w9q99о :::!\:B:d_7 7 O777q7'7777777-777 7 7777߰7vQ7vH7vN7wg7x97t7gV7X7QW7O7Q7XQ7f7s:7ws7v7v77777 7u.7nm7l7n7t7~7\777 7ߪ7v77e77¯77i7C777e77޵79777D7b777| 7s7p7s?7{ 7x77|777+7y7y>7.7~7K7KC7K7M7M7G76!7!777<7!747F97LB7L17K[7x7wC7sE7k7^7R7Ii7Fx7H7Q7]a7if7q7u7x7~7~}7|7t7f7W7NC7K7M7V7ea7s 7z7}U7~S8,U8,T8,Q8,L8,Dg8,98,/(8,'8,%Y8,'s8,. 8,88,Bc8,Ju8,O8,S08,U18)68)6h8*&U8*&81t818181M81f81z81jG81W/81M81K81L81V.81h81y!8181$81v8)58)38)/I8)'N8)8)k8)8)18)O8)o8)e8)%d8)-C8)18)48*%8*$8*!s8*8* 8)8)Y8)8)8)8* B8*8*8*#*8*%88p888 88588B88T8v8&8888988S8c88E8888~8{8u8i18[y8T8Sb8T 8Zp8g8s8y8}%8+88888C88b8܋88888868]8b8 O8 888888188f888 8Z8888 888888J88~88 88j88>H8<8Ҍ8ҋ 8 8 D8 8"88i88Ӡ8˿8n88888888;86W8.8$88L8888 88!Q8*82888҉8҄8}8r8e{8Y8Q8O8Q78W8b8oK8yL8ҁ>8҇E9P9N09I9C9<96(909-z9,g9-%9/94|9:h9@9F9K9Oj99S999 9 +9 9 9 9 +9 [9 9 9 u9 d9 #9 &9 E9 t9 9 999 9999X9H99999 999B99U9~9vC9o9l=9kG9k9n9t^9{Z93999O9O9OyO9Op9OhE9O`9O[B9OXw9OW9OX*9OZ@9O^q9Od9Olf9Ot9O|&9O9M9M9R9R9^Я9^9^{9^Ā9^9^9^=9^9^9^9^9^%9^49^9^9^9^$9M9Mf9M9M9M9My9M9M9M\9Md9M9MI9M<9M9Mq9R9R|m9Rs49Ri9Ra{9R[9RY9RXm9RX9RZM9R^9Re9Rnm9Rw9R 9s9qR9l9g9bo9^v9\&9[G9[#9[39[9]"9`9dq9i9n9rj999 9 99r99,9D9`9c9999\99999929b99^9999 999G999-999 )9D9A9999 99999$9999^29[9U9OT9I9E9D.9D 9DE9D9C9DW9F9KY9Qm9W9\C9R9j9s99î;9ì9ê}9ã9Û9Õ/9Ò9Ò 9Ó9Ôg9Ól9ÑO9Ð*9Ñ9×L9ßj9ç1999 9Y99'9;9ߋ9G9޿99l99]999999~c9}p9~9~9~ 9|9|9~9999B9 9999f99H99z9_999999 9A9?f9^9\a9ԕ9ҋ9p99c99999999]999+9̝9>98909+9'9'k9(_9)9(9'99&m9'9,Z93999Z9TO9L9F9C9D:9E9F9F9D9Be9Ce9H9OJ9V:A:?:<:9%:6I:4:4:5:6:5:4:43:4:6:9:=:@r:e@:d:İ:Â:-:::x:G:V::â::U:::i::: :':ck:`S:\:Z :X:X:Y:ZT:Z:Y:X$:Xm:Zg:]:a5:::::#::::H:::::::2sy:2q:2n:2k:2hx:2ge:2g:2h:2iL:2h:2g:2f:2f:2h:2k:2oG:2r$:.u:.tB:1x:1w:8:8:8:8օ:8:8b:8Ї:8Ҭ:8Զ:8Ւ:8':8$:8n:8`:8:8ԉ:8:.s:.p:.m:.k:.j+:.j:.k:.la:.l:.j:.i:.i:.kG:.n>:.q:1w$:1t.:1p:1n:1m:1o:1pe:1q :1p:1oZ:1m:1mM:1n:1q:1u*:O:O":OF:O(:O:O :O:O:OK:O:O:O:O:O:O:O:O:I:I:MB:ML:W:W :W:W]:W:W:W0:WQ:W.:W:W:W:W:W:W:W0:W:Id:I:I:I:I7:I:I:I:Im:IS:I:I:I:I:Ih:Mε:M,:Mq:Mǔ:MY:My:M:Mʍ:MM:M:M|:M:M:M]:M:gg:g:gi:g:g:g:g:g:gO:g:g:g:g:g:g:g:g1:`:`:eT:e:r#:r޼:r:r:r:r:rV:r:r9:r:r:r:r=:rk:r:rۉ:rJ:`M:`:`:`:`:`9:`<:`:`:`:`:`B:`*:`*:`:e:e:d:d:dl:d`:e:e%:e:e:d:dQ:d :e:e:!:s:P 1:/>:'9kJ919r9OGz988ef7F77,:!77,798ee899OGt9r|9.9kF:%:/>:P 0:s:A5::iB:ok:G):Kv:&U:*ܥ:: D#9؝99)9\9}9rv99 )9C998 c8m8JD8W*@77 7$_7-8::A5:ok:iB:Ku:G):*ܤ:&U: D":99؝9[9)9rt9}9C99 ,998m8 d8W*;8JH77&7-87$^:!: :L::::#:%:!a:$:"::z::: W:!77q78eU68 99OA9oL9A9h::/=e:P:s07778e_8|9ī9OA9m9C9d0:U:/:Q:P|:s777_8ev8Ņ929OFy9n 9v9^w::/4:P:s7778en899O$9X99C_::/(:P >:sY77H7G8eE8?9&9O99_y99Bz::/#:P:s(77P78ecZ8c99O L9U99Am::/':P Z:s՗767&8e \8pE9$9O 9P99J::/3 :P:s76]7C8e;8iG9j9O{9O99M::/6:P:s77+78eF899O 9[t99Tj::/6:P:s7678e8h99O9O+99MJ::/7:P:sW76b7%8e r8ox99O9NS9[9F:,:/1:P8:s77O78ea8899OZ9R997ߩ@7ӍX7ߥM7Әa7"7Ӎ7ߥ7ӕ7ߩ`7\77=77/77T7:77g778J8W'8J8W+F8J8W48J8W78J+8WP8J8W 8J{8V8Jr8Vܴ8J}d8V8Js^8V8J|8V8J|8W"8J38WR%8J8W98Jv8W48J8W)8J8W#8 8a8 888M8 888888N8m888y8ܖ88ծ8z8ܬ88(8i88T8888G8 8D8 89959e9`9*999999&9Y99Ѯ99999ܥ9Ϲ9a99 99999999999999Ca999CU98e9CV98 9C 98-9C9899C989C}98w9C}"98`9CJ98S9C~ 989CC98E9C98{9C-989C999C99.9CZ999C9})9p9}9nY9}p9i59}39\9} 9\9}?9U9} 9Q~9}9R9}9XR9}9S9}>9Sq9}9X[9}9^b9}9_9}29k9}!9oM9}9p9'9=9#9O9999 9 9997999 j999u9 9Z9 z9e9 c9999>9999%99(99؛59i9ؕ9-9؋99~9š9x9y9x:99|S99؁C9 9؃99؁9̖9~+9ȏ9{J9ß9|99؃59ɧ9؏9ھ9ؘB99؜`90:z: B:Y: ?:: 9:: 0:Խ: -e:ղ: .:: 4:%: 8:9: 9:$: 8:s: 5:: 0:֋: /-:A: 2: : ;:: @:5: C^:&Tt:*b:&Q7:*#:&K:* :&E:*j:&A:*:&C:* :&I:*`:&M:*2:&NB:*u:&M\:*:&I:*:&D:*d:&C:*g:&G :*(:&M:*Ӻ:&R:*9:&U<:*:G(R:Ka:G%':K:G :K:Gd:K:G:K:G:K:G!v:K:G%f:K:G%&:K5:G$:K:G!:K:G6:KW:GT:Kk:G:K:G!N:K:G&F:K:G) :K:iN:oj:i}:og:ii:oa:i:o]:i:oU:i:o\:i~:oih:i:om:i:oj:i:ol:i:oh:i:o\N:ik:oUk:iO:o\:ik:oa%:i:og:i:oky::A::@::>::>::w::A:^:B::Ai::B@::A::=::;3:L:= :!:=::?::A:!: :L::::#:%:!a:$:"::z::: W:!77p7"8eU;899OA9oN9D9h::/=g:P:s07778e_89ĭ9OA9m9F9d3:V:/:S:P~:s777l8ev8ŋ959OF|9n9y9^y::/4:P:s7778en899O$9X99Ca::/(:P ?:sZ77H7G8eJ8?9(9O99_z99B|::/#:P:s(77O78ec_8c99O O9U99An::/':P [:s՗76728e a8pE9$9O 9P99J::/3:P:s76]7C8e;8iG9j9O~9O99M::/6:P:s77+78eF899O 9[t99Tj::/6:P:s7678e8h99O9O)99MJ::/7:P:sW76c78e m8ox99O9NQ9Z9F:-:/1:P8:s77P78ea3899OX9R999}9p9(9H9#9]99999 999@999 n999u9 9W9 t9_9 Z999909~999%99(99؛G9v9ؕ9=9،9(9 9Ű9y99xE99|Z99؁G9$9؃99؁9̒9~#9ȉ9{@9Õ9|9 9؃%9ɘ9؏9ڭ9ؘ/99؜N9#:: B:c: ?:: 9:: 0:: -k:ո: .:: 4:&: 8:9: 9:": 8:o: 5:: 0:ք: /':9: 2:: ;:: @:-: CV:&T|:*i:&Q@:*+:&K:*:&E:*q:&A:*:&C:*:&I:*d:&M:*3:&NB:*u:&M[:*:&I:*:&D:*_:&C:*a:&G:*!:&M:*ӳ:&R:*/:&U4:*:G(Y:Kg:G%.:K:G :K:Gj:K:G:K:G:K:G!y:K:G%g:K:G%&:K5:G$:K:G!:K:G2:KS:GO:Kf:G{:K:G!G:K:G&?:K:G):K:iS:oj:i:og:im:oa:i:o]:i:oU:i:o\:i:oij:i:om:i:oj:i:ol:i}:oh:i :o\K:ih:oUg:iK:o\:if:oa :i:og:i:okt::A::@::>::>::w::A:^:B::Ai::B@::A::=::;3:L:= : :=::?::A:G:i:k3:h:Y::Y:h:k3:i:G7V7yѭ77yw787V787yv7 7yѬ7V8 P8&Pl8>v8So8a&)8e8a&*8So8>Ӂ8&Pu8 P88v88{8bF8 N8bF888y88V999(d?9296929(d?998V9+ 9G9`69t{9$99$9t{9`69G9+9p\999ϩ9Q99Q9ϫ999p\9l99Y999T999Y99n99~99:p:y:p99999: ԫ::&=:/::0:&=:: Ԭ9::%u:,:1:5:6:5:1:,:%w::9:A:H+:L5a:N:O_>:N:L5a:H,:A:9:Y:_܆:c:f:g:hWJ:g:f:c:_܆:Y:z:}%:O:::: ::::O:}&:z7Xi7z 77/\7sn7a7t78&7D7{;7X:7VS7T37Q 7J7Qe7Y=7Y7U7Yr7Xu7Qd7J 7Q 7T7V]7w7pH7g7~57~ͷ7s%7~7~7gT7p7w|7;7Z717 R77b77e7 7737s7Y7s8 W8&58>8Q8]38aO8]58Qr8>8'T8;8 Qp8 X8 88 B8r88 \88?8 88 <8 ^w8 B8$88p8)KP8+!18#8+78)P8;8x8$pB898K8Q8S8Q8K 898/8=l8>r8/O8@f8>8@8R8`838̀8u8ۄ]8up8̏+8828:8$88M8MS8*8B8+88r88. 8X:8u888۟8_88~88e8.8848R888~8w88 8ў88=88i8#88P8М898i89f399'=9/_929/9'AR998a388@8n8T"8 $88S8⮩8-8f8U89888w9O8$89d9 h9 9 o98c8J9:9v9"J9&9(<09&l9"=$99 9=99 9:9D9"9,/9Gz>9_79r9}w99}M9s F9`49GR9,]9+O9(9):n9#9) (9.2<9.|L9*i9.b9-9(9#y9)L9)O99+t9D9=#9:9Ib9M9FO79M9 9I9:d9=A9Dl9Z89l9r 9t29q9lu9Z`9NG9]9]J9Nh9`9]Q9_9p 9-i9C9=9M9[69 99'9`9p9ob9l9mn9f}9m(!9sPT9s%9o(w9s9r09m9f9m9m,-9o9k,999@9949~9gL9D99CB9@9$9JC99"9!"9j9n9,9(9 M999]!9E9 9 9.\9խ`99թ!9@9D9@V9&9wk99?A9<9x9|99799N9D9L9x9O9O9 999)9^9"919Y<9879Y9ؿ90#99a9،9;99^99#9}9 A9•929` 9.9E99 U:>:u*:=999|,9Cg9̊ 9ʙ9W9f9&R9αA99h99~99K9˚9I9̕9' 9g99e9999K9(9ً9&9Ľ9!9.999998=99w9E99-99): ::I::ط::I:]: c9?99A999:v:ѵ9|:d:9u99@9e9:ٷ::<: p: : D: ": :^: ::::J:.:5::: :˄:: :~:&:Ur::%#:,[:1{D:4v:5:4y:1:,tF:%;:-:`2:j::::ju:h:tV:.:UU:":::s:c:$(:!s: B:%}:' :%:'9:%: :!Z:$ :*r:/:1f:1:1:/:*z:&(:+VO:+:>DG:Be_:C:BpI:C:B:>d\:>֢:A :F{:J:K:L:K:Ja:F:CLW:GX:F:CW:G:Fq:Gev:Y:_:c:fW5:g~:g:g~:f]:c/:_R:Y:YM:X:X4:WH:X:Z:ZK2:Yw:ZL/:Z :Xh:WGc:Y":X5:YM:_B:]~:]'b:`0]:as:`A]:a$:`DN:]@:]:_0:b:ej:f(E:fs:f":e?:b:`:cV:c:Q:`ˁ:cK:c&:cN:z:}U:G::;::$::J:}n:z`:zh:zFO:z|:yu4:z :{B::{d:z":{f:{=M:zuc:yt :z:zY:z}:}_:|:|:~:~oF:~#:~v:~!:|*:|:}:::::k::2:~E:)::~Jd:/J::*X:Gq:j:t::0: :0@::p:h:G[:Ju:P:L:V:K:>:=:I:>:A:N:W:LI:O:Ji:V:V:$:]D:,:Q:(l:Z::{:*:s:::E:L:/:n:}8Q8]38aO8]58Q}8>8'T8;8 Qx8 X8 88 J8r 88 \88?8 88 <8 ^o8 B8$8(8y8)KY8+!18#8+78)P828o8$p9898K 8Q8S8Q8K89 8/8=l8>r8/E8@\8>8@8O8`8/8̀8u8ۄ]8up8̏08868=8'88M8MU8*8B8+88r88. 8X78u888ۢ8c88~88e8.8818O858}8s88 8ў8#8A88i8#88L8И898m89f199'=9/_929/9'AR998a;88D8n8T"8 $88S8⮩8-8f8U8:888o9O8$89d9 h9 9 o98c8J9:9v9"J9&9(<09&l9"=$99 9=99 9:9D9"9,/9Gz;9_49r9}w99}M9s F9`49GU9,]9+O9(9):q9#9) *9.2<9.|L9*i9.b9-9(9#v9)J9)O69+t9D9=#9:9Ib9M9FO79M9 9I9:d9=A 9Dl9Z59l9r 9t29q9lu9Z`9NG9]9]J9Nh9`9]Q9_9p9-g9A9;9K9[69 99)9`9p9oe9l9mn9f}9m($9sPX9s(9o(w9s}9r-9m9f9m9m,*9o9k.999@9949|9gK9D99C@9@9$9JA99"9!$9j9p9,9(9 L999]#9C9 9 9.Z9խ^99թ#9@9D9@X9&9wl99?C9<9z9|99799N9B9L9x9M9M9 999*9`9"919Y:9859W9ؽ90!99a9،9;99^99#9{9 ?9•949` 9.9E99 T:>:u*:=999|.9Cj9̊9ʙ9W9g9&S9αB99h99~99I9˚9G9̕9'"9g9΀9e9999J9'9ً9$9ļ9 9.999998>99w9E99-99': ~::H::ط::J:]: d9A99C999:w:Ѷ9|:c:9s99@9d9:ٹ::<: p: : D: ": :^: ::::J:.:5::: :˄:: :~:&:Us::%#:,[:1{C:4v:5:4y:1:,tG:%;:/:`3:j::::ju:h:tV:.:UU:!: ::q:c:$(:!s: C:%~:' :%:'9:%: :!Y:$ :*q:/:1f:1:1:/ :*z:&):+VO:+:>DH:Be`:C:BpI:C:B:>d[:>֡:A :F{:J:K:L:K:Jb:F:CLX:GX:F:CW:G:Fq:Gev:Y:_:c:fW5:g~:g:g~:f]:c0:_S:Y:YM:X:X4:WH:X:Z:ZK2:Yw:ZL/:Z :Xh:WGc:Y":X4:YM:_B:]~:]'c:`0]:as:`A]:a$:`DN:]@:]:_0:b:ei:f(E:fs:f":e?:b:`:cV:c:Q:`ˁ:cK:c&:cO:z:}U:G::;::$::J:}o:za:zi:zFP:z|:yu4:z :{B;:{d:z":{f:{=M:zuc:yt :z:zY:z|:}_:|:|:~:~oG:~#:~v:~!:|):|:}:::::l::2:~E:)::~Jd:/J::*X:Gq:j:t::0: :0@::p:h:G[:Ju:P:L:V:K:>:=:I:>:A:N:W:LI:O:Ji:V:V:$:]D:,:Q:(l:Z::{:*:s:::E:L:/:n::B::$:::::twG:tu:ts:trh:tr:tr~:tsA:ts:ts:ts :trA:tq:tr:ts:tu:u:u~ :u|:u{:u{v:u| :u|:u}R:u}L:u|:u{:u{:u|:u}2:u~::&:R:j::w:::!:::z:\::_:G::}I:}H:z:z#:}:}J:}:}:}:}c:}_:}:}h:}:}:}:} :}:}:}:}:}H:}Gn:}E:}D:}DX:}D:}E;:}E:}E:}E(:}D:}DM:}D:}E:}Gu:z:z:z:z:zu:z:ze:z:z:zo:z:z:z:z:z:|:|w:|:|~:|~:|~:|U:|:|]:|q:|5:|:|:|:|:|:|:::L:V:::k:3:V:::::!::§::::::¬:a:F:4:::::k:[::µ:::3:2 :0:0,:/:/:0U:0:0:0t:0:/:0L:1:2":3:3:Zu:+Q:Y:*:Xd:):V:(J:U:'_:U:' :U:'A:Ve:':V:':V:':V:'~:U:':U_:&:U:'L:W:(N:X:):Y:*:sT:sR:sPy:sN :sLA:sK:sL2:sM:sM:sM:sL:sK:sKU:sLC:sNJ:sP:sR:j:j:n3:n2m:|1~:|17:|0i:|.:|-P:|,:|,:|.:|/:|/:|/:|.:|-:|-=:|-:|.:|0:jț:jƞ:j}:j:jš:j1:j:jĩ:jĊ:j:j:jk:j+:j:j:n1:n0<:n.k:n-=:n-%:n-:n.:n/y:n/f:n.:n-:n-4:n-:n/.:n0:~:~z:~:~]:~:~@:~ݨ:~p:~:~:~!:~C:~:~ݿ:~y:~:~:txM:twk:u:u:::::: :3:::>:B::$:::::twG:tu:ts:trh:tr:tr~:tsA:ts:ts:ts :trA:tq:tr:ts:tu:u:u~ :u|:u{:u{v:u| :u|:u}R:u}L:u|:u{:u{:u|:u}2:u~::&:R:j::w:::!:::z:\::_:G::}I:}H:z:z#:}:}J:}:}:}:}c:}_:}:}h:}:}:}:} :}:}:}:}:}H:}Gn:}E:}D:}DX:}D:}E;:}E:}E:}E(:}D:}DM:}D:}E:}Gu:z:z:z:z:zu:z:ze:z:z:zo:z:z:z:z:z:u:b::e:+::* :::j::l:* :l::j:::u:b::e:+::_:I:7:-:::1:fp: :C:L:: :b::U:::&:: :4:`::*:*:*&:*4:*A:*K:*R:*T:*R:*K:*B:*6:*):*:*:* :*::":j::m::?:j::l: :W:j::l::f:j::lL:*:i:j::k:1:b:j:a:k:1:R:j:5:k:,:>:jc::k:#:(:jH: :k:::j2::k:::j ::k:::j::k:::j::k:::j::k:::j: :k:::j-:D:l5:::jU::l:u:u:u:u:u:u:u:u:u:u:u:u:u:u:u:u:u:b:::+::b:::,::b:::,::ak:X::,::`::e:, ::`::9:+::`:::+::`:::+::`:::+::`:z::+::`:l::+::`j:[::+z::`]:V::+p::`:m::+m::`:::+t:}:a:::+::b,:W:-:+::-:7:I:_:fp:1::::L:C: :U::b: ::&::::`:4: ::}: :}:::::::::::::2:`:`j:4:4}: : :: : >:::N:=:H:Z:^:O:7:+:@:}::`:`M:_:_b:_!:_:_':_>:_@:_(:_:^:_:_r:_:4:4p:4:3:3h:3Z:3j:3~:3:3n:3R:3E:3`:3:4::::F::::|:w:p:b:Q:L:b:::E:&:&{:F:: ::::::[:0:: :::::::L:&:&:&:&>:%:%:%:%:%:%:%:%:%:%:&$:N:0:::q:G:2:):":::::::}:ł:Ś:Ř:ŀ:X:,::::Ľ:ĭ:ġ:ě:Ģ:ļ:::,::b:bw:M::n:{:s:Y:6:::::::::::F:H:2: ::߻:ߛ:߄:q:b:U:N:T:j:ߓ:b:b:b:b:b:b:b`:bG:b4:b$:b:b:b:b#:bF::::::::::z:h:X:N:K:R:d::n:+:C:C:)::F:]:j:k:b:P:;:$::::::::ҋ:Ҟ:ң:Ҝ:ҋ:t:[:C:-:: :::::C:C:C:C:C:C:C:C:C:C{:Ck:C^:CX:CZ:Cg:f:f:f:f:f:f:f:f:f:f:f:fo:fb:fY:fU:fX:fa:1:1::: :::.:>:J:P:O:I:>:1:"::::::1:1:1:1:1:1:1:1:1:1:1:1:1{:1v:1x::::::::::::::::_:_:_:_:_:`:`:`:_:_:_:_:_:_:_:_:_:I:I:7:7:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:I:J:J:J:J":J%:J":J:J:J:I:I:I:I:I:8:8:8#:80:89:8=:8<:87:8.:8":8:8:7:7:7:u:u:u:u:u:u:u:u:u:u:u:u:u:u:u:u:u::+:-:W:b,::+:::a:}:+t:::`::+m::m:`::+p::V:`]::+z::[:`j::+::l:`::+::z:`::+:::`::+:::`::+:::`::+:9::`::, :e::`::,::X:ak::,:::b::,:::b::+:::b:*:*:*&:*4:*A:*K:*R:*T:*R:*K:*B:*6:*):*:*:* :*::":j::m::?:j::l: :W:j::l::f:j::lL:*:i:j::k:1:b:j:a:k:1:R:j:5:k:,:>:jc::k:#:(:jH: :k:::j2::k:::j ::k:::j::k:::j::k:::j::k:::j: :k:::j-:D:l5:::jU::l::}: :}:::::::::::::2:`:`j:4:4}: : :: : >:::N:=:H:Z:^:O:7:+:@:}::`:`M:_:_b:_!:_:_':_>:_@:_(:_:^:_:_r:_:4:4p:4:3:3h:3Z:3j:3~:3:3o:3R:3E:3`:3:4::::F::::|:w:p:b:Q:L:b:::E:&:&{:F:: ::::::[:0:: :::::::L:&:&:&:&>:%:%:%:%:%:%:%:%:%:%:&$:N:/:::q:G:2:):":::::::~:ł:Ś:Ř::X:,::::Ľ:ĭ:ġ:ě:Ģ:ļ:::,::b:bw:M::n:{:s:Y:6:::::::::::F:H:2: ::߻:ߛ:߄:q:b:U:N:T:j:ߓ:b:b:b:b:b:b:b`:bG:b4:b$:b:b:b:b#:bF::::::::::z:h:X:N:K:R:d::n:+:C:C:)::F:]:j:k:b:P:;:$::::::::ҋ:Ҟ:ң:Ҝ:ҋ:t:[:C:-:: :::::C:C:C:C:C:C:C:C:C:C{:Ck:C^:CX:CZ:Cg:f:f:f:f:f:f:f:f:f:f:f:fo:fb:fY:fU:fX:fa:1:1::: :::.:>:J:P:O:I:>:1:"::::::1:1:1:1:1:1:1:1:1:1:1:1:1{:1v:1x::::::::::::::::_:_:_:_:_:`:`:`:_:_:_:_:_:_:_:_:_:I:I:7:7:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:-:I:J:J:J:J":J%:J":J:J:J:I:I:I:I:I:8:8:8#:80:89:8=:8<:87:8.:8":8:8:7:7:7?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?i?c?`P?]?[om?Y?Y?X:?X ?X?X?XN?XS?Y?O-o?Xp?X?W?W?V['?UuL?T_W?Se?Q?P?Oy?N)?N?O-o?Xp?X?W?W?V['?UuL?T_W?Se?Q?P?Oy?N)?N?i?Y?XS?XN?X?X?X ?X:?Y?Y?[om?]?`P?c?V?\09?`(?d?X{?X5?X?Y ?XK?X~?X?X˷?W~?X'\?X`?X?Wn?W^?X?X`N?Vܒ?WX?W2?X1]?V-t?V2?Wv?X&?Ud[?VR?W(\?W?T?U?V?X-?Sv?U?W?X2?S`r?U?WJ?Y\?Sq?V?Y=k?[ ?T&?X,#?[}?^??U^?Z;?^A?a?O-f?O-d?O-i?O-n?O-i?O-S?O-8?O-#?O-?O-%?O-C?O-s?O-?O-?O-?O-?O-?Xp?X?W?W?V[*?UuP?T_]?Sl?Q?P?Oy?N;?N"?Xp?X?W?W?V[3?Uu\?T_l?S?Q?P?Oy?NV?N;?Xp?X?W?W?V[@?Uum?T_?S?Q?P-?Oz?Ns?NU?Xp?X ?W?W ?V[M?Uu}?T_?S?Q ?P;?Oz?N?Na?Xp?X$?W?W?V[W?Uu?T_?S?Q?P1?Oz?Nl?NM?Xp?X(?W?W?V[[?Uu?T_?S?Q?P?Oy?N;?N?Xp?X*?W?W?V[[?Uu?T_?S?Q?P?Oy?N?N?Xp?X+?W?W?V[W?Uuz?T_{?Su?Q?P?Oy?N?N?Xp?X,?W?W?V[U?Uuv?T_t?Sm?Q?P?Oy?N?N?Xp?X+?W?W?V[V?Uux?T_x?Ss?Q?P?Oy?N?N?Xp?X*?W?W?V[Y?Uu?T_?S?Q?P?Oy?N?N?Xp?X(?W?W?V[Z?Uu?T_?S?Q?P?Oy?N*?N?Xp?X$?W?W?V[W?Uu?T_?S?Q ?P?Oy?NC?N?Xp?X ?W?W?V[N?Uu}?T_?S?Q ?P?Oy?NE?N!?Xp?X?W?W?V[B?Uun?T_?S?Q?P ?Oy?N7?N?Xp?X?W?W?V[5?Uu^?T_l?Sy?Q?P?Oy?N(?N ?Xp?X?W?W?V[,?UuQ?T_]?Sj?Q?P?Oy?N#?N?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?c?`L?] ?[o]?Y?Y?X1?X?X?X?XL?XR?Y?c?`?]?[o?Y?Y?X?X?X?X?XJ?XP?Y?c?`?]%?[nq?Y+?YU?X?X?X?X?XF?XK?Y?cl?`%?]a?[m?Y|?Y?X?X?Xw?X?XB?XG?Y?c5?`?]?[m#?Y?Y?Xj?X?Xo?X?XC?XG?Y?cA?`?]#?[mU?Y&?Y?XO?X?XW?X?X??XJ?Y?c?`?]?[m?Y?Y?XE?Xt?X6?X?X7?XM?Y?c?`?]z?[n}?Y?Y?XT?Xt?X0?X?X7?XP?Y?c?`?]?[n?Y?Y?Xf?X?X:?X?X;?XR?Y?c?`?]?[n?Y?Y?XP?Xp?X.?X?X7?XP?Y?c?`?]?[n?Y?Y?X9?Xm?X2?X?X6?XM?Y?c-?`?]?[mC?Y?Ym?X??X?XR?X?X>?XJ?Y?c?`?]?[l?Y?Yo?XV?X?Xj?X?XC?XG?Y?c.?`?]?[mR?Y>?Y?X}?X?Xq?X?XB?XG?Y?ck?`a?]?[n!?Y?Y0?X?X?X?X?XG?XL?Y?c?`?]?[n?Y?Y?X?X ?X?X?XK?XP?Y?c?`/?]?[oB?Y?Y?X/?X?X?X?XM?XR?Y?d?`(?\09?V?Y ?X?X5?X{?X˷?X?X~?XK?X?X`?X'\?W~?X`N?X?W^?Wn?X1]?W2?WX?Vܒ?X&?Wv?V2?V-t?W?W(\?VR?Ud[?X-?V?U?T?X2?W?U?Sv?Y[?WJ?U?S`r?[ ?Y=k?V?Sq?^??[}?X,#?T&?a?^A?Z;?U^?X{?X{?X|?X}?X?X?X?X?X?X?X?X?X?X~?X}?X|?X{?X5?X5?X?X?Y ?Y ?Y ?Y ?Y ?Y ?Y ?Y ?Y ?Y ?Y ?Y ?Y ?Y ?Y ?Y ?Y ?X6?X6?X6?X7?X9?X;?X?X`8?X`1?X`/?X`0?X`.?X`0?X`7?X`=?X`@?X`F?X`L?W_?W`?Wa?Wc?Wf?Wg?Wg?Wg?Wg?Wf?We?Wc?Wb?Wa?W`?X?X?X?X?X?X?X?X?X?X?X?X?X?X?X?Vܔ?Vܘ?Vܞ?Vܤ?Vܩ?Vܫ?Vܪ?Vܨ?Vܧ?Vܧ?Vܩ?Vܩ?Vܨ?Vܤ?Vܟ?Vܙ?Vܔ?WX?WX?W1?W2?X1[?X1]?X1W?X1N?X1A?X18?X1+?X1?X1?X1?X1?X1?X1(?X14?X1>?X1L?X1W?WX?WX?WX?WX?WX?WX?WX?WX?WX?WX?WX?WX?WX?WX?WX?W/?W*?W#?W?W?W?W?W?W?W?W?W?W"?W)?W/?V-v?V-{?V-?V-?V-?V-?V-?V-?V-|?V-}?V-?V-?V-?V-?V-?V-|?V-v?V2?V2?Wv?Wv?X#?X#?X?X?X?X?X?X?X?X?X?X?X?X?X?X?X?V2?V0?V,?V'?V"?V?V?V?V?V?V?V#?V)?V.?V1?Wv?Wu?Wu?Wu?Wu?Wu?Wu?Wu?Wu?Wu?Wu?Wu?Wu?Wu?Wu?Ud^?Udd?Udj?Udm?Udk?Udd?Ud[?UdS?UdO?UdQ?UdV?Ud^?Udd?Udf?Ude?Uda?Ud\?VR?VR?W(Z?W(W?W?W?W?W?W?Wk?WV?WN?WT?WZ?WQ?WG?WJ?W\?W|?W?W?VR?VR?VR?VR?VR?VR?VR?VR?VR?VR?VR?VR?VR?VR?VR?W(P?W(?S6?S6?S9?S>?SF?SP?SZ?Sc?Sj?Sp?U?U?W?W?X*?X?X?X?X??X?X?X?XL?Xe?XS?X?X?X?X ?Xs?X?U?U?U?U?U?U?U?U?U?U?U?U?U?U?U?W?WS?W?W?W?W?W?W?W?W?W?W?W?W%?Wd?S`z?S`~?S`z?S`k?S`Q?S`4?S`!?S`?S`?S`#?S`'?S`-?S`6?S`@?S`M?S`[?S`g?U?U?WI?W.?YT?Y8?Y?Y?Y:?Y?Y?Y4?Y?Y?Y?YF?Y?Y?Y?Yl?Y?U?U?U?U?Ui?Uj?Uz?U?U?Uv?Ue?Uc?Uy?U?U?W*?W?W̞?W`?WP?Wm?W̙?W̱?W̨?W?WM?W=?W`?W̩?W?Sq?Sq?Sq?Sq?Sqq?SqM?Sq5?Sq0?Sq5?Sq;?Sq@?SqG?SqO?SqY?Sqe?Sqs?Sq?V?V?Y=m?Y=M?[ ?[?[?[z?[?[?[?[?[j?[?[?[.?[?[~?[?[$?[?V?V?V?V?Vl?Vk?V}?V?V?V~?Vj?Ve?Vw?V?V?Y=S?Y=?Y?^>?^? ?^?^?^?x?^?p?^?5?^>?^>?^>?^??^?o?X,+?X,?X,?X+?X+?X+?X+?X+?X+?X+?X+?X+?X+?X+?X+?[} ?[|?[|?[|?[|q?[|?[|?[|?[|?[|?[|n?[|\?[|o?[|?[|?U^?U^)?U^2?U^.?U^?U]?U]?U]?U]?U]?U]?U]?U]?U]?U]?U]?U^?Z;?Z;?^A?^A?a?a?a?a?a?a?a?a?a?a?a?a?ax?ai?a{?a?a?Z;?Z;?Z;?Z;?Z;?Z;y?Z;w?Z;}?Z;?Z;?Z;?Z;?Z;?Z;?Z;?^A?^A?^A?^Aa?^AE?^A=?^AF?^AO?^AO?^AD?^A7?^A5?^A??^AT?^Am?V?V?V?V?V?V?V?V}?Vz?V?V?V?V?V?V?V?V?\0D?\0-?`2?`?d?d?d?d?d?d?d?d͸?dͲ?dͰ?dͰ?dͰ?dͰ?d͵?dͼ?d?d?\0L?\0P?\0J?\07?\0?\/?\/?\/?\/?\/?\0?\0 ?\0?\0?\0 ?`9?`;?`4?`"?`?`?`?`?`?`?`?`?`?`?`?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?YAa?O-f?O-d?O-i?O-n?O-i?O-S?O-8?O-#?O-?O-%?O-C?O-s?O-?O-?O-?O-?O-?N?N#?Oy?P?Q?Sj?T_]?UuQ?V[,?W?W?X?Xp?N ?N(?Oy?P?Q?Sy?T_l?Uu^?V[5?W?W?X?Xp?N?N7?Oy?P ?Q?S?T_?Uun?V[B?W?W?X?Xp?N!?NE?Oy?P?Q ?S?T_?Uu}?V[N?W?W?X ?Xp?N?NC?Oy?P?Q ?S?T_?Uu?V[W?W?W?X$?Xp?N?N*?Oy?P?Q?S?T_?Uu?V[Z?W?W?X(?Xp?N?N?Oy?P?Q?S?T_?Uu?V[Y?W?W?X*?Xp?N?N?Oy?P?Q?Ss?T_x?Uux?V[V?W?W?X+?Xp?N?N?Oy?P?Q?Sm?T_t?Uuv?V[U?W?W?X,?Xp?N?N?Oy?P?Q?Su?T_{?Uuz?V[W?W?W?X+?Xp?N?N?Oy?P?Q?S?T_?Uu?V[[?W?W?X*?Xp?N?N;?Oy?P?Q?S?T_?Uu?V[[?W?W?X(?Xp?NM?Nl?Oz?P1?Q?S?T_?Uu?V[W?W?W?X$?Xp?Na?N?Oz?P;?Q ?S?T_?Uu}?V[M?W ?W?X ?Xp?NU?Ns?Oz?P-?Q?S?T_?Uum?V[@?W?W?X?Xp?N;?NV?Oy?P?Q?S?T_l?Uu\?V[3?W?W?X?Xp?N"?N;?Oy?P?Q?Sl?T_]?UuP?V[*?W?W?X?Xp?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?i?Y?XR?XM?X?X?X?X/?Y?Y?[oC?]?`/?c?Y?XP?XK?X?X?X ?X?Y?Y?[n?]?`?c?Y?XL?XG?X?X?X?X?Y0?Y?[n!?]?`a?ck?Y?XG?XB?X?Xq?X?X}?Y?Y??[mR?] ?`?c.?Y?XG?XC?X?Xj?X?XV?Yo?Y?[l?]?`?c?Y?XJ?X>?X?XR?X?X??Ym?Y?[mC?]?`?c-?Y?XM?X6?X?X2?Xm?X9?Y?Y?[n?]?`?c?Y?XP?X7?X?X.?Xp?XP?Y?Y?[n?]?`?c?Y?XR?X;?X?X:?X?Xf?Y?Y?[n?]?`?c?Y?XP?X7?X?X0?Xt?XT?Y?Y?[n}?]z?`?c?Y?XM?X7?X?X6?Xt?XE?Y?Y?[m?]?`?c?Y?XJ?X??X?XW?X?XO?Y?Y&?[mU?]#?`?cA?Y?XG?XC?X?Xo?X?Xj?Y?Y?[m#?]?`?c5?Y?XG?XB?X?Xw?X?X?Y?Y|?[m?]`?`%?cl?Y?XK?XF?X?X?X?X?YU?Y+?[nq?]%?`?c?Y?XP?XJ?X?X?X?X?Y?Y?[o?]?`?c?Y?XR?XL?X?X?X?X1?Y?Y?[o]?] ?`L?c?X{?X{?X|?X}?X?X?X?X?X?X?X?X?X?X~?X}?X|?X{?X5?X5?X?X?Y ?Y ?Y ?Y ?Y ?Y ?Y ?Y ?Y ?Y ?Y ?Y ?Y ?Y ?Y ?Y ?Y ?X6?X6?X6?X7?X9?X;?X?X`8?X`1?X`/?X`0?X`.?X`0?X`7?X`=?X`@?X`F?X`L?W_?W`?Wa?Wc?Wf?Wg?Wg?Wg?Wg?Wf?We?Wc?Wb?Wa?W`?X?X?X?X?X?X?X?X?X?X?X?X?X?X?X?Vܔ?Vܘ?Vܞ?Vܤ?Vܩ?Vܫ?Vܪ?Vܨ?Vܧ?Vܧ?Vܩ?Vܩ?Vܨ?Vܤ?Vܟ?Vܙ?Vܕ?WX?WX?W1?W2?X1[?X1]?X1W?X1N?X1A?X18?X1+?X1?X1?X1?X1?X1?X1(?X14?X1>?X1L?X1W?WX?WX?WX?WX?WX?WX?WX?WX?WX?WX?WX?WX?WX?WX?WX?W/?W*?W#?W?W?W?W?W?W?W?W?W?W"?W)?W/?V-v?V-{?V-?V-?V-?V-?V-?V-?V-|?V-}?V-?V-?V-?V-?V-?V-|?V-v?V2?V2?Wv?Wv?X#?X#?X?X?X?X?X?X?X?X?X?X?X?X?X?X?X?V2?V0?V,?V'?V"?V?V?V?V?V?V?V#?V)?V.?V1?Wv?Wu?Wu?Wu?Wu?Wu?Wu?Wu?Wu?Wu?Wu?Wu?Wu?Wu?Wu?Ud^?Udd?Udj?Udm?Udk?Udd?Ud[?UdS?UdO?UdQ?UdW?Ud^?Udd?Udf?Ude?Uda?Ud\?VR?VR?W(Z?W(W?W?W?W?W?W?Wk?WV?WN?WT?WZ?WQ?WG?WJ?W\?W|?W?W?VR?VR?VR?VR?VR?VR?VR?VR?VR?VR?VR?VR?VR?VR?VR?W(P?W(?S6?S6?S9?S>?SF?SP?SZ?Sc?Sj?Sp?U?U?W?W?X*?X?X?X?X??X?X?X?XL?Xe?XS?X?X?X?X ?Xr?X?U?U?U?U?U?U?U?U?U?U?U?U?U?U?U?W?WS?W?W?W?W?W?W?W?W?W?W?W?W%?Wd?S`z?S`~?S`z?S`k?S`Q?S`4?S`!?S`?S`?S`#?S`'?S`-?S`6?S`@?S`M?S`[?S`g?U?U?WI?W.?YT?Y8?Y?Y?Y:?Y?Y?Y4?Y?Y?Y?YF?Y?Y?Y?Yl?Y?U?U?U?U?Ui?Uj?Uz?U?U?Uv?Ue?Uc?Uy?U?U?W*?W?W̞?Wa?WP?Wm?W̙?W̱?W̨?W?WM?W=?W`?W̩?W?Sq?Sq?Sq?Sq?Sqq?SqM?Sq5?Sq0?Sq5?Sq;?Sq@?SqG?SqO?SqY?Sqe?Sqs?Sq?V?V?Y=n?Y=M?[ ?[?[?[{?[?[?[?[?[j?[?[?[.?[?[~?[?[$?[?V?V?V?V?Vl?Vk?V}?V?V?V~?Vj?Ve?Vw?V?V?Y=S?Y=?Y?^>?^? ?^?^?^?x?^?p?^?5?^>?^>?^>?^??^?o?X,+?X,?X,?X+?X+?X+?X+?X+?X+?X+?X+?X+?X+?X+?X+?[} ?[|?[|?[|?[|q?[|?[|?[|?[|?[|?[|n?[|\?[|o?[|?[|?U^?U^)?U^2?U^.?U^?U]?U]?U]?U]?U]?U]?U]?U]?U]?U]?U]?U^?Z;?Z;?^A?^A?a?a?a?a?a?a?a?a?a?a?a?a?ax?ai?a{?a?a?Z;?Z;?Z;?Z;?Z;?Z;y?Z;w?Z;}?Z;?Z;?Z;?Z;?Z;?Z;?Z;?^A?^A?^A?^Aa?^AE?^A=?^AF?^AO?^AO?^AD?^A7?^A5?^A??^AT?^Am?V?V?V?V?V?V?V?V}?Vz?V?V?V?V?V?V?V?V?\0D?\0-?`2?`?d?d?d?d?d?d?d?d͸?dͲ?dͰ?dͰ?dͰ?dͰ?d͵?dͼ?d?d?\0L?\0P?\0J?\07?\0?\/?\/?\/?\/?\/?\0?\0 ?\0?\0?\0 ?`9?`;?`4?`"?`?`?`?`?`?`?`?`?`?`?`?iX?YAa?f,?c?`D?]~?\?Z?Z ?Y*?YB?Y?Y?Y?Y"?\?]?`C0?c?f+?Y"(?Y?Yq?Y[?YA?Y7?Z ?ZӐ?\?]?`A}?c?f+n?Y"$?Y?Y?Y?YB?Y?Z ?ZӘ?\#?]?`??c%?f*$?Y"-?Y?Y{?Yj?YA?YG?Z ?ZӒ?\?]?`AM?c?f++?Y"9?Y?YL?Y?YA9?Y?Z ?Z(?\?]?`C?c`?f,?Y"?X?X/?X?X/?X?X9?X?X0?X?X/?X?X??X?XH?X?XB?X?XH?X?XL?X?XM?X?X.?X?X-?X?X'?X?X?X?X!?X?X?X?X?Xx?X?Xs?X?X?X?Xu?X?Xz?X ?X?X#?X?X?X?X(?X?X+?X?X*?X?XΟ?YN?XΛ?YM?X΋?YD?Xg?Y?Xl?Y*?XH?Y?X?Y?X?Y?X,?Y?X?Y?X?Y?XN?Y?Xq?Y0?Xn?Y?Xΐ?YK?XΛ?YM?XΛ?YH?X#?Y:?X?Y:?X?Y:?X?Y:?X?Y:;?Xz?Y:?XN?Y9?XT?Y9?Xv?Y: ?XY?Y9?XW?Y9?X?Y: ?X?Y:F?X?Y:1?X?Y:?X?Y:?X ?Y:?Y)"?Y?Y)?Y?Y(?Yh?Y(C?Y?Y("?Y?Y(?Y?Y'?Yx?Y(?Y?Y(D?Y?Y("?Y?Y( ?Y?Y(?Y?Y(7?Y?Y(^?Y?Y(?Y?Y) ?Y?Y)!?Y?Y?ZC?Y?ZB?Y?ZBQ?Y_?ZAK?Y?ZA?Y?ZA?Y]?ZAt?Y?ZA?Y?ZB?Y?ZA?Yq?ZA?Y=?ZA@?Y??ZA:?Y?ZAy?Y8?ZBx?Y?ZB?Y?ZC?Z?[d5?Z>?[c?Z?[c?Z?[a?Z3?[a9?Zj?[a?Z?[b{?Z?[c?Z?[cE?Z?[c?Z"?[b?Z?[a?Zd?[an?Z?[a?Z?[c>?Z`?[c?Z?[d??\K?]?\KX?]?\J|?]?\Ih?]?\H?]?\IV?]o?\Ji?]?\K?]?\K,?]?\K?]?\Jm?]?\Iw?]?\I?]?\I?]?\J?]I?\K?]+?\K?]?^?_z?^$?_y?^I?_xq?^A?_w?^?_v?^K?_w?^?_x?^R?_y?^P?_y?^=?_y?^?_x?^f?_w;?^?_v`?^?_wf?^?_x?^]?_y?^?_z"?a?b^?a?a?b^?a?b^?a?b^?a ?b^L?a?b\?a?b[?a)?b\?a?b]?ao?b^?a?b^?et?e?eI?e?e?ew?e?e?ed?ez?e?e?e3?e?el?e4?e[?e?ek?e3?e:?e?e?e?e?e?e?eF?e3?e?en?e?e?e-?h?hu?h?h}?h?h?h?ho?h?h?h?hg?h?hF?h?h?\?]?`C0?c?f+?Y"(?Y?Yq?Y[?YA?Y7?Z ?ZӐ?\?]?`A}?c?f+n?Y"$?Y?Y?Y?YB?Y?Z ?ZӘ?\#?]?`??c&?f*$?Y"-?Y?Y{?Yj?YA?YG?Z ?ZӒ?\?]?`AM?c?f++?Y"9?Y?YL?Y?YA9?Y?Z ?Z(?\?]?`C?c`?f,?Y"?X?X/?X?X/?X?X9?X?X0?X?X/?X?X??X?XH?X?XB?X?XH?X?XL?X?XM?X?X.?X?X-?X?X'?X?X?X?X!?X?X?X?X?Xx?X?Xs?X?X?X?Xu?X?Xz?X ?X?X#?X?X?X?X(?X?X+?X?X*?X?XΟ?YN?XΛ?YM?X΋?YD?Xg?Y?Xl?Y*?XH?Y?X?Y?X?Y?X,?Y?X?Y?X?Y?XN?Y?Xq?Y0?Xn?Y?Xΐ?YK?XΛ?YM?XΛ?YG?X#?Y:?X?Y:?X?Y:?X?Y:?X?Y:;?Xz?Y:?XN?Y9?XT?Y9?Xv?Y: ?XY?Y9?XW?Y9?X?Y: ?X?Y:F?X?Y:1?X?Y:?X?Y:?X ?Y:?Y)"?Y?Y)?Y?Y(?Yh?Y(C?Y?Y("?Y?Y(?Y?Y'?Yx?Y(?Y?Y(D?Y?Y("?Y?Y( ?Y?Y(?Y?Y(7?Y?Y(]?Y?Y(?Y?Y) ?Y?Y)!?Y?Y?ZC?Y?ZB?Y?ZBQ?Y_?ZAK?Y?ZA?Y?ZA?Y]?ZAu?Y?ZA?Y?ZB?Y?ZA?Yq?ZA?Y=?ZA@?Y??ZA9?Y?ZAy?Y8?ZBx?Y?ZB?Y?ZC?Z?[d5?Z??[c?Z?[c?Z?[a?Z3?[a:?Zk?[a?Z?[b{?Z?[c?Z?[cE?Z?[c?Z"?[b?Z?[a?Zd?[an?Z?[a?Z?[c>?Z`?[c?Z?[d??\K?]?\KX?]?\J}?]?\Ih?]?\H?]?\IV?]o?\Ji?]?\K?]?\K,?]?\K?]?\Jm?]?\Iv?]?\I?]?\I?]?\J?]I?\K?]+?\K?]?^?_z ?^%?_y?^J?_xr?^B?_w?^?_v?^L?_w?^?_x?^R?_y?^P?_y?^=?_y?^?_x?^f?_w;?^?_v`?^?_we?^?_x?^\?_y?^?_z"?a?b^?a=?b^W?a?b]y?a?b\?aN?b[?a?b\q?a?b^>?a?b^?a?b^?a?b^?a ?b^L?a?b\?a?b[?a(?b\?a?b]?an?b^?a?b^?et?e?eI?e?e?ex?e?e?ed?ez?e?e?e4?e?el?e5?e[?e?ek?e3?e:?e?e?e?e?e?e?eE?e3?e?em?e?e?e-?h?hu?h?h}?h?h?h?ho?h?h?h?hg?h?hF?h?h?Y??Y>?Y;?Y7:?Y1U?Y*?Y*G?Y)?Y(?Y'A?Y)?Y*?Y*?Y)?Y*?Y*?Y)?Y'??Y(?Y)?Y*A?Y0?Y/[?Y-?Y1?Y2?Y/?Y2 ?Y1?Y-?Y/M?Y0?Y5?Y:%?Y< ?Y?Y?Z?YF?Z?Y\?Y#?Y?Y?Z??Zi?Z?Z ?Z0?Z?Z@?Z?ZP?ZRD?Z?Z[?ZPM?ZY?Y?Z?[2?[N?[^?\u?["?[?[4?Z?Y?Yk?YԳ?Yp?Y?Yr?Y?YY?Y߃?Y?Y?Y?Y?YB?Y?YJ?Z?ZS?Z@h?Z?Z?Z?Z?Z?ZB$?ZT=?Zp?[ ?[?[?[d?[?[?[?Z?[#v?[$?Z\?[4:?[!?[1w?ZzH?[eB?\5]?\?]3=?]U6?]2?\ي?\8>?[h?Z{?Zr?Z]?Zb?Z2g?Za?Z?Z?Zn?Z?Z?Z`0?Z2?ZeK?Z`?Zs?[L{?[ w?Zw?[t?[?[`?[?[v?Z#?[ ?[JE?\8?\?\?\g?\?\?\?[j?\?\?[>?\3V?\?\01?[@?\g?]b?^"?^?^?^?^#?]f1?\j?[AW?[6?[?[#?Z?[!?[V?[Z?[3?[Y?[S?[B?Z?['>?[?[7?\Hv?[-?[ڬ?\yU?\?\h?\?\|7?[??[?\Ee?]%?]6?^?^-&?^?]6?](?\?]D?]B?\?][?]=?]XE?\S?]Z?^4?_h?_?`(?_?_?^?]?\T?\G?\&?\3?[?\/?\m?\s?\E?\r?\jW?\,?[x?\7?\*?\H?].?]%?] ?]?]?]?]M?]?]?](U?]u?^?_M?_T?_ ?_M?_?_Y?^9?^?_?`?`?a?a6?a_?`=?`R?_ ?`9?`5?_F?`Q?`0?`K?_?a"?b-?b?cC1?ce?cC?b?a?c>?d?d?d?e?d?d?dy?cAu?b ?a=?a'?aw?ac?a?b?b"?a?b"?b ?a\?a?a.?a԰?a?c?b?bi?cN?c~?cP?c|?cS?b%?b;?c?c?d~h?dO?d3?d?d ?c?cp5?c?c?cq?d ?c/?d ?d?em?f ?fs?f7?f??fR?ft?f ?eo?d?dy'?d\?dl?d. ?di?d?d)?d5?d*?d?df?d-?dr?daP?dy@?eV?er?er?ey?eL?e|?e?e|?e ?eL?eS?ef?fPD?fk?fxh?fj?fP?e?e?eA?e ?eT?e0?e?e?f?g?g@?h?h:?hF?h; ?ht?gr?g?f?f?f?fj?f[?fU?g b?gi?f?gp?g >?f?f?fe?f?f~?gu.?gO?gH?g?g#?g?g?g?gJ?gP?gs?g?h,?h?hs?h??h?g[?gl?g?gD?g?gՔ?g˵?gW?i+z?iV?i{?iV?i?i'?i(?i?i|N?iV?i+~?i*?Y??Y>?Y;?Y7:?Y1U?Y*?Y*G?Y)?Y(?Y'A?Y)?Y*?Y*?Y)?Y*?Y*?Y)?Y'??Y(?Y)?Y*A?Y0?Y/[?Y-?Y1?Y2?Y/?Y2 ?Y1?Y-?Y/M?Y0?Y5?Y:%?Y< ?Y?Y?Z?YF?Z?Y\?Y#?Y?Y?Z??Zi?Z?Z ?Z0?Z?Z@?Z?ZP?ZRD?Z?Z[?ZPM?ZY?Y?Z?[2?[N?[^?\u?["?[?[4?Z?Y?Yk?YԳ?Yp?Y?Yr?Y?YY?Y߃?Y?Y?Y?Y?YB?Y?YJ?Z?ZS?Z@h?Z?Z?Z?Z?Z?ZB$?ZT=?Zp?[ ?[?[?[d?[?[?[?Z?[#v?[$?Z\?[4:?[!?[1w?ZzH?[eB?\5]?\?]3=?]U6?]2?\ي?\8>?[h?Z{?Zr?Z]?Zb?Z2g?Za?Z?Z?Zn?Z?Z?Z`0?Z2?ZeK?Z`?Zs?[L{?[ w?Zw?[t?[?[`?[?[v?Z#?[ ?[JE?\8?\?\?\g?\?\?\?[j?\?\?[>?\3V?\?\01?[@?\g?]b?^"?^?^?^?^#?]f1?\j?[AW?[6?[?[#?Z?[!?[V?[Z?[3?[Y?[S?[B?Z?['>?[?[7?\Hv?[-?[ڬ?\yU?\?\h?\?\|7?[??[?\Ee?]%?]5?^?^-&?^?]6?](?\?]D?]B?\?][?]=?]XE?\S?]Z?^4?_h?_?`(?_?_?^?]?\T?\G?\&?\3?[?\/?\m?\s?\E?\r?\jW?\,?[x?\7?\*?\H?].?]%?] ?]?]?]?]M?]?]?](U?]u?^?_M?_T?_ ?_M?_?_Y?^9?^?_?`?`?a?a6?a_?`=?`R?_ ?`9?`5?_F?`Q?`0?`K?_?a"?b-?b?cC1?ce?cC?_'?_(?_<`?_?_҉?_2?_?_+?_8?_?_=?_ ?_?_?`?`??`}?a5?am?a3n?aq+?a:?`?`?`?a3?b?bB?b?b?bq?a?a`O?b $?bH?aa?b?b>?b?a?c>?d?d?d?e?d?d?dy?cAu?b ?a=?a'?aw?ac?a?b?b"?a?b"?b ?a[?a?a.?a԰?a?c?b?bi?cN?c~?cP?c|?cS?b%?b;?c?c?d~h?dO?d3?d?d ?c?cp5?c?c?cq?d ?c/?d ?d?em?f ?fs?f7?f??fR?ft?f ?eo?d?dy'?d\?dl?d. ?di?d?d)?d5?d*?d?df?d-?dr?daP?dy@?eV?er?er?ey?eL?e|?e?e|?e ?eL?eS?ef?fPD?fk?fxh?fj?fP?e?e?eA?e ?eT?e0?e?e?f?g?g@?h?h:?hF?h; ?ht?gr?g?f?f?f?fj?f[?fV?g b?gi?f?gp?g >?f?f?fe?f?f~?gu.?gO?gH?g?g#?g?g?g?gJ?gP?gs?g?h,?h?hs?h??h?g[?gl?g?gD?g?gՔ?g˵?gW?i+z?iV?i{?iV?i?i'?i(?i?i|N?iV?i+~?i*?f?b?]7?X/?e?a6?]?Wsj?j?j?j?j?j?j?j{?jp?ji?jh?jk?jq?jv?jz?j}?j~?j?j?i|?j ?i|?j?i}?j?i}?j ?i|?j?i|?j?i|?j?i|?j?i|?j?i|?j?i|?j?i|?j?i|?j?i|?j?i|?j?i|?j?i|?QO?QO?QO?QO?QO?QO?QO?QO?QO?QO?QO?QO?QP ?QP?QP?QP?QP?O?PU?O#?PU?O3?PV?O7?PV?O&?PU?O?PU?O?PU?O?PU?O?PU?O?PU?O?PU?O?PU?O?PU?O?PU?O?PU?O?PU?O?PU?f>?b?^T?Xճ?X/?]7?b?f?Wsj?]?a6?e?Wsv?Ws?Ws?Ws?Wsu?WsV?Ws6?Ws%?Ws ?Ws#?Ws+?Ws9?WsF?WsL?WsP?WsU?Ws^?]?]?a??a-?e?e?e?e?e?e?e?e?e?e?e?e?e?e?e?e?e?]?]?]?]?]?]i?]\?]Z?][?]_?]g?]p?]w?]|?]?aG?aK?aH?a9?a#?a?a?a?a?a?a ?a?a?a?a$?X/?X/?X/?X/?X/?X/?X/q?X/`?X/Z?X/[?X/a?X/l?X/w?X/~?X/?X/?X/?]A?]-?b?b?f?fy?f?f?f?f?f}?fk?f_?fY?fX?f\?fc?fj?fo?fr?fu?]I?]M?]K?]=?]&?]?]?]?]?]?] ?]?]?]?]$?b?b?b?b?b?b?b?b?b?b?b?b?b?b?b?Xս?X?X?X?Xռ?Xզ?XՎ?X~?Xv?Xu?Xz?XՂ?XՌ?XՓ?Xՙ?Xՠ?Xթ?^T?^T?b?b?fE?f8?fL?fQ?fR?fK?f>?f/?f#?f?f?f?f#?f)?f.?f1?f4?^T?^T?^T?^T?^T?^T?^T?^T?^T?^T?^T?^T?^T?^T?^T?b?b?b?b?b?b?bɻ?bɴ?bɲ?bɵ?bɻ?b?b?b?b?j?j?j?j?j?j?j{?jp?ji?jh?jk?jq?jv?jz?j}?j~?j?j?i|?j ?i|?j?i}?j?i}?j ?i|?j?i|?j?i|?j?i|?j?i|?j?i|?j?i|?j?i|?j?i|?j?i|?j?i|?j?i|?j?i|?QO?QO?QO?QO?QO?QO?QO?QO?QO?QO?QO?QO?QP ?QP?QP?QP?QP?O?PU?O#?PU?O3?PV?O7?PV?O&?PU?O?PU?O?PU?O?PU?O?PU?O?PU?O?PU?O?PU?O?PU?O?PU?O?PU?O?PU?O?PU?Wsv?Ws?Ws?Ws?Wsu?WsV?Ws6?Ws%?Ws!?Ws#?Ws+?Ws9?WsF?WsL?WsP?WsU?Ws^?]?]?a??a-?e?e?e?e?e?e?e?e?e?e?e?e?e?e?e?e?e?]?]?]?]?]?]i?]\?]Z?][?]_?]g?]p?]w?]|?]?aG?aK?aH?a9?a#?a?a?a?a?a?a ?a?a?a?a$?X/?X/?X/?X/?X/?X/?X/q?X/`?X/Z?X/[?X/a?X/l?X/w?X/~?X/?X/?X/?]A?]-?b?b?f?fy?f?f?f?f?f}?fk?f_?fY?fX?f\?fc?fj?fo?fr?fu?]I?]M?]K?]=?]&?]?]?]?]?]?] ?]?]?]?]$?b?b?b?b?b?b?b?b?b?b?b?b?b?b?b?Xս?X?X?X?Xռ?Xզ?XՎ?X~?Xv?Xu?Xz?XՂ?XՌ?XՓ?Xՙ?Xՠ?Xթ?^T?^T?b?b?fD?f8?fL?fQ?fR?fK?f>?f/?f#?f?f?f?f#?f)?f.?f1?f4?^T?^T?^T?^T?^T?^T?^T?^T?^T?^T?^T?^T?^T?^T?^T?b?b?b?b?b?b?bɻ?bɴ?bɲ?bɵ?bɻ?b?b?b?b?Z^Z?TJ?W?Y?Zé?Zí?Zñ?Zó?Zñ?Zî?Zè?Zâ?ZÜ?ZØ?ZÕ?ZÓ?ZÔ?ZÕ?ZØ?[lX?[l]?[la?[lc?[lb?[l`?[l[?[lU?[lP?[lK?[lH?[lF?[lF?[lF?[lH?ZA?ZA?ZA?ZA?ZA?ZA?ZA?ZA?ZA?ZA?ZA?ZA?ZA?ZA?ZA?ZA?ZA?Zq?Zl?Z!?Z?Zf?Zb?Zh?Zl?Zo?Zr?Zt?Zu?Zu?Zs?Zp?Zl?Zi?Zf?Zc?Zb?Zb?Zu?Zx?Z|?Z~?Z?Z?Z}?Zz?Zv?Zr?Zo?Zl?Zk?Zj?Zk?Z$?Z(?Z+?Z.?Z0?Z0?Z/?Z,?Z)?Z%?Z"?Z?Z?Z?Z?Z^?Z^?Z^?Z^?Z^?Z^?Z^?Z^?Z^?Z^?Z^?Z^?Z^?Z^?Z^?Z^?Z^?Zt?Zt?Z?Z?Z?Z?Z?Z?Z?Z?Z?Z?Z?Z?Z?Z?Z?Z?Z?Z?Z?Zt?Zt?Zt?Zt?Zt?Zt?Zt?Zt?Zt?Zt?Zt?Zt?Zt?Zt?Zt?Z?Z?Z?Z?Z!?Z"?Z#?Z#?Z!?Z ?Z?Z?Z?Z?Z?Zf?Zf?Zf?Zf?Zf?Zf?Zf?Zf?Zf?Zf?Zf?Zf?Zf?Zf?Zf?Zf?Zf?Zo?Zo?Zw0?Zw1?Z{?Z{?Z{?Z{?Z{?Z{?Z{?Z{?Z{?Z{?Z{?Z{?Z{?Z{?Z{?Z{?Z{?Zo?Zo?Zo?Zo?Zo?Zo?Zo?Zo?Zo?Zo?Zo?Zo?Zo?Zo?Zo?Zw0?Zw2?Zw3?Zw5?Zw7?Zw8?Zw:?Zw;?Zw;?Zw:?Zw9?Zw7?Zw5?Zw3?Zw2?Z^Z?Z^[?Z^\?Z^^?Z^`?Z^b?Z^d?Z^e?Z^e?Z^e?Z^d?Z^c?Z^a?Z^_?Z^]?Z^[?Z^Z?ZK?ZY?Y?Zé?Zí?Zñ?Zó?Zñ?Zî?Zè?Zâ?ZÜ?ZØ?ZÕ?ZÓ?ZÔ?ZÕ?ZØ?[lX?[l]?[la?[lc?[lb?[l`?[l[?[lU?[lP?[lK?[lH?[lF?[lF?[lF?[lH?ZA?ZA?ZA?ZA?ZA?ZA?ZA?ZA?ZA?ZA?ZA?ZA?ZA?ZA?ZA?ZA?ZA?Zq?Zl?Z!?Z?Zf?Zb?Zh?Zl?Zo?Zr?Zt?Zu?Zu?Zs?Zp?Zl?Zi?Zf?Zc?Zb?Zb?Zu?Zx?Z|?Z~?Z?Z?Z}?Zz?Zv?Zr?Zo?Zl?Zk?Zj?Zk?Z$?Z(?Z+?Z.?Z0?Z0?Z/?Z,?Z)?Z%?Z"?Z?Z?Z?Z?Z^?Z^?Z^?Z^?Z^?Z^?Z^?Z^?Z^?Z^?Z^?Z^?Z^?Z^?Z^?Z^?Z^?Zt?Zt?Z?Z?Z?Z?Z?Z?Z?Z?Z?Z?Z?Z?Z?Z?Z?Z?Z?Z?Z?Zt?Zt?Zt?Zt?Zt?Zt?Zt?Zt?Zt?Zt?Zt?Zt?Zt?Zt?Zt?Z?Z?Z?Z?Z!?Z"?Z#?Z#?Z!?Z ?Z?Z?Z?Z?Z?Zf?Zf?Zf?Zf?Zf?Zf?Zf?Zf?Zf?Zf?Zf?Zf?Zf?Zf?Zf?Zf?Zf?Zo?Zo?Zw0?Zw1?Z{?Z{?Z{?Z{?Z{?Z{?Z{?Z{?Z{?Z{?Z{?Z{?Z{?Z{?Z{?Z{?Z{?Zo?Zo?Zo?Zo?Zo?Zo?Zo?Zo?Zo?Zo?Zo?Zo?Zo?Zo?Zo?Zw0?Zw2?Zw3?Zw5?Zw7?Zw8?Zw:?Zw;?Zw;?Zw:?Zw9?Zw7?Zw5?Zw3?Zw2mayavi-4.5.0/mayavi/tests/data/edgeFaceElem.exii0000644000076500000240000002220412747716314022135 0ustar prabhustaff00000000000000CDF 3 len_string!len_lineQfour time_stepnum_dim num_nodes num_elemnum_edgenum_face num_el_blk num_ed_blk num_fa_blk num_node_sets num_edge_sets num_face_sets num_side_sets num_elem_sets num_node_maps num_edge_maps num_face_maps num_elem_mapsnum_ed_in_blk1num_nod_per_ed1num_att_in_eblk1num_fa_in_fblk1num_nod_per_fa1num_att_in_fblk1num_fa_in_fblk2num_nod_per_fa2num_att_in_fblk2num_fa_in_fblk3num_nod_per_fa3num_att_in_fblk3num_el_in_blk1num_nod_per_el1num_edg_per_el1 num_fac_per_el1num_att_in_blk1 num_nod_ns1 num_edge_es1 num_df_es1 num_face_fs1 num_side_ss1 num_ele_els1 num_ele_els2 num_glo_var num_nod_var num_edge_var num_face_var num_elem_var num_fset_var  api_version@pversion@C33floating_point_word_size file_sizetitleCreateEdgeFace Test T time_whole 4 eb_status eb_prop1 nameID ed_status ed_prop1 nameID fa_status  fa_prop1 nameID  ns_status ns_prop1 nameID es_status es_prop1 nameID fs_statusfs_prop1 nameID ss_statusss_prop1 nameID els_status els_prop1 nameIDnm_prop1 nameID edm_prop1 nameID fam_prop1 nameIDem_prop1 nameIDcoord  coor_namesd eb_names $ed_names $fa_names dns_names $0es_names $Tfs_names$xss_names$ els_namesD nmap_names$ edmap_names$( famap_names$L emap_names$peattrb1 eattrib_name1$4ebconn1  elem_type STRAIGHT2Xfattrb1 fattrib_name1$fbconn1  elem_typeQUAD4 ,fattrb2L fattrib_name2$Tfbconn2  elem_typeQUAD4xfattrb3 @ fattrib_name3 $fbconn3  elem_typeQUAD4attrib1!% l attrib_name1%Dconnect1!"  elem_typeHEX8@edgconn1!#`facconn1!$0p node_map10 edge_map1P face_map1, elem_map1Lnode_ns1& Tedge_es1'`ornt_es1'x dist_fact_es1(0face_fs1)ornt_fs1)elem_ss1*side_ss1* elem_els1+ elem_els2, vals_glo_var- < name_glo_var-D vals_nod_var.` L name_nod_var.$D name_edge_var/Dhvals_edge_var1eb1 vals_edge_var2eb1!L edge_var_tab / name_face_var0$vals_face_var1fb1!vals_face_var1fb3@! face_var_tab 0  name_elem_var1$vals_elem_var1eb1!"< elem_var_tab 1  name_fset_var2$ vals_fset_var1fs1)"L fset_var_tab2 0dXx@l, @@@@??@@@@??@@@@XYZEli WALLACHAldo GIUFFRELivio LORENZONClaudio SCARCHILLIJohn BARTHAEnnio MORRICONERada RASSIMOVEnzo PETITOLuciano VINCENZONIClint EASTWOODLee VAN CLEEFLuigi PISTILLIAntonio CASALESandro SCARCHILLIBenito STEFANELLI?@@@@@&@*@1@3@7@=@?@B@D@E@G@J@M@N@PSergio LEONE    @Q@R@GOOD @SBAD@T@V@@X@@Y@@Y@Z@[@@\@UGLY     @_@Y@@a @a`SPAGHETTIWESTERN        @@???? CALIBERGUNPOWDERRHOGAMMA1GAMMA2PHIEPSTRNPHI0?@B@B??陙?ٙ?333333??陙??333333?ffffff?ٙ?333333@4@3@2@1@0@.@,@*@(@&@$@"@ @@@@@@?????@@????@@@@??@@@@ @ ?@@@E@E?ffffff??333333??ə?ffffff??陙?ə?333333?@5@4@3@2@1@0@.@,@*@(@&@$@"@ @@@@@@????@@????@@@@@?@@@ @"@;mayavi-4.5.0/mayavi/tests/data/example.dem0000644000076500000240000014400012747716314021110 0ustar prabhustaff00000000000000MOUNT ST. HELENS, WASH. (POST-ERUPTION) MSH-M80 3-176 09/06/80 B-8 N=2.00X1.00 S=2.00X1.00MM 9 PANEL FILES 30M X 30M INTERVAL 1 1 1 10 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 0.000000000000000D+00 2 2 4 0.557945011821133D+06 0.510799133901730D+07 0.557813813954232D+06 0.512188002753253D+07 0.567449420312715D+06 0.512197873846927D+07 0.567602487473599D+06 0.510809006713248D+07 0.682000000000000D+03 0.254300000000000D+04 0.000000000000000D+00 10.300000E+020.300000E+020.100000E+01 1 327 1 1 22 1 0.557820000000000D+06 0.512124000000000D+07 0.000000000000000D+00 0.888000000000000D+03 0.913000000000000D+03 909 910 910 910 911 912 913 911 910 911 911 911 910 911 913 913 911 906 902 896 890 888 1 2 128 1 0.557850000000000D+06 0.511806000000000D+07 0.000000000000000D+00 0.890000000000000D+03 0.120500000000000D+04 1202 1204 1203 1205 1205 1202 1198 1194 1191 1188 1185 1176 1170 1168 1166 1165 1167 1168 1167 1165 1160 1151 1158 1165 1163 1166 1170 1163 1159 1159 1154 1147 1144 1137 1130 1121 1110 1096 1098 1096 1088 1084 1081 1080 1082 1084 1080 1071 1055 1045 1039 1040 1039 1035 1029 1025 1023 1021 1018 1010 1009 1011 1010 1007 1001 998 996 996 992 988 993 995 995 994 991 983 979 977 970 965 961 955 950 948 953 958 951 943 936 935 934 932 930 928 923 922 924 918 915 916 913 910 911 912 911 910 910 910 910 910 912 912 913 911 910 911 911 912 910 909 910 907 904 900 898 895 890 890 1 3 234 1 0.557880000000000D+06 0.511488000000000D+07 0.000000000000000D+00 0.891000000000000D+03 0.123000000000000D+04 1201 1202 1207 1210 1209 1207 1206 1206 1202 1196 1185 1191 1197 1193 1193 1196 1208 1213 1212 1216 1222 1225 1227 1229 1226 1225 1228 1227 1227 1230 1225 1215 1206 1205 1218 1222 1224 1223 1223 1224 1223 1221 1216 1205 1192 1186 1180 1174 1183 1193 1204 1208 1209 1214 1216 1215 1202 1187 1172 1143 1110 1091 1072 1054 1032 1016 1014 1012 1008 994 994 1010 1020 1035 1064 1075 1080 1104 1110 1095 1087 1078 1064 1050 1037 1018 1007 1004 998 994 998 1004 1012 1028 1041 1051 1068 1083 1093 1106 1121 1130 1145 1168 1183 1195 1206 1210 1208 1209 1208 1203 1195 1188 1184 1180 1177 1173 1170 1170 1168 1167 1168 1169 1167 1162 1158 1157 1164 1169 1167 1170 1173 1165 1161 1161 1150 1138 1132 1123 1114 1106 1099 1086 1084 1081 1076 1076 1076 1070 1069 1071 1069 1067 1062 1051 1042 1041 1037 1033 1029 1026 1024 1024 1023 1013 1013 1017 1014 1012 1010 1004 997 991 987 984 985 984 979 981 982 977 972 966 962 960 959 953 949 949 946 944 942 939 936 936 935 932 931 929 923 921 921 918 915 915 912 910 911 911 910 911 910 910 911 912 912 912 913 911 910 911 912 912 910 908 907 903 900 895 893 892 891 894 1 4 340 1 0.557910000000000D+06 0.511170000000000D+07 0.000000000000000D+00 0.894000000000000D+03 0.123200000000000D+04 949 950 955 958 959 961 963 966 968 969 971 973 975 978 981 985 987 988 993 995 995 996 998 1000 1000 1000 1003 1002 999 1002 1006 1012 1016 1018 1015 1015 1017 1022 1026 1028 1032 1037 1041 1044 1047 1051 1055 1059 1065 1069 1068 1064 1060 1068 1072 1072 1076 1079 1079 1080 1083 1086 1088 1090 1092 1095 1101 1103 1104 1103 1104 1108 1113 1115 1114 1116 1118 1121 1124 1129 1133 1136 1135 1135 1134 1139 1141 1143 1148 1153 1159 1165 1169 1168 1171 1176 1180 1184 1188 1190 1191 1194 1196 1198 1203 1204 1201 1203 1207 1209 1209 1207 1207 1210 1207 1201 1190 1192 1194 1188 1191 1201 1212 1217 1215 1219 1223 1225 1228 1231 1229 1228 1229 1226 1224 1229 1225 1215 1205 1204 1217 1224 1229 1228 1229 1232 1224 1216 1211 1203 1195 1187 1183 1181 1192 1203 1211 1214 1216 1220 1222 1222 1206 1187 1166 1133 1099 1080 1062 1043 1036 1030 1028 1023 1016 1001 1001 1018 1028 1043 1074 1085 1090 1118 1124 1108 1096 1083 1068 1047 1025 1005 996 999 997 995 997 1006 1018 1035 1049 1058 1075 1090 1101 1116 1132 1143 1157 1173 1184 1195 1208 1213 1213 1213 1210 1203 1196 1189 1183 1178 1174 1173 1172 1172 1170 1169 1171 1168 1163 1160 1159 1162 1168 1173 1173 1174 1175 1169 1166 1164 1152 1138 1121 1108 1099 1095 1092 1084 1077 1073 1073 1070 1067 1063 1060 1058 1056 1055 1054 1048 1042 1037 1035 1034 1032 1029 1026 1026 1024 1017 1017 1018 1015 1012 1007 1004 1001 999 994 988 986 982 977 977 975 971 968 966 962 960 960 954 950 949 947 944 944 942 938 937 935 933 930 927 923 921 920 918 916 914 912 910 911 911 910 911 911 911 912 913 912 912 913 912 911 911 912 912 912 911 909 905 901 896 894 894 895 899 1 5 445 1 0.557940000000000D+06 0.510855000000000D+07 0.000000000000000D+00 0.834000000000000D+03 0.123600000000000D+04 982 984 986 988 994 997 988 988 991 988 989 995 991 989 991 995 1001 1000 998 992 988 985 985 980 970 946 924 907 895 884 866 850 834 857 873 875 879 883 885 888 890 883 878 879 881 883 885 886 885 888 890 888 889 891 890 888 885 885 887 895 897 896 903 908 911 915 918 923 925 925 926 928 931 930 929 928 925 921 918 914 909 902 897 896 898 902 907 911 911 914 916 917 918 920 922 925 928 932 935 938 940 943 945 946 949 951 951 955 958 959 961 963 966 968 970 972 973 975 979 982 986 988 990 993 996 995 996 998 1002 1003 1004 1006 1006 1004 1006 1008 1013 1018 1021 1019 1018 1018 1022 1026 1029 1034 1039 1041 1044 1048 1051 1055 1060 1065 1069 1071 1069 1065 1068 1071 1073 1077 1081 1082 1084 1086 1087 1089 1090 1092 1096 1103 1105 1106 1107 1109 1110 1116 1119 1118 1120 1124 1125 1127 1129 1135 1139 1140 1139 1138 1142 1144 1143 1146 1149 1153 1157 1162 1166 1169 1172 1178 1183 1183 1188 1193 1194 1196 1198 1202 1202 1202 1204 1206 1207 1209 1207 1209 1211 1210 1205 1196 1195 1193 1186 1192 1203 1216 1221 1218 1220 1223 1225 1229 1233 1231 1230 1231 1227 1224 1227 1222 1211 1204 1204 1215 1225 1233 1234 1235 1236 1221 1210 1205 1203 1200 1187 1185 1190 1201 1212 1221 1222 1221 1225 1227 1227 1208 1186 1162 1127 1092 1078 1062 1045 1052 1055 1050 1038 1024 1009 1011 1027 1037 1053 1083 1093 1100 1133 1141 1126 1102 1081 1065 1040 1013 1002 1000 1009 1007 1005 1005 1012 1023 1039 1054 1067 1082 1096 1109 1126 1144 1156 1168 1179 1187 1197 1208 1213 1215 1214 1209 1201 1197 1193 1187 1181 1176 1174 1173 1173 1171 1170 1171 1167 1160 1165 1167 1167 1173 1177 1177 1177 1176 1171 1167 1164 1157 1145 1123 1108 1098 1092 1089 1085 1081 1078 1075 1076 1075 1065 1061 1059 1055 1050 1045 1041 1039 1039 1037 1033 1030 1029 1029 1027 1024 1019 1018 1017 1015 1011 1004 1003 1002 1001 995 988 988 986 983 979 974 967 967 969 962 959 959 955 952 952 949 945 945 943 939 937 934 930 928 926 924 924 925 920 916 914 912 912 913 911 908 913 916 915 914 913 913 913 913 913 913 912 912 913 915 915 913 910 905 898 897 898 900 904 1 6 463 1 0.557970000000000D+06 0.510801000000000D+07 0.000000000000000D+00 0.836000000000000D+03 0.123900000000000D+04 912 915 914 919 922 923 935 945 950 957 964 969 975 981 986 989 991 990 989 993 995 995 1002 1004 994 993 996 993 996 1004 997 992 996 996 996 996 994 988 985 982 980 976 969 953 934 914 900 887 872 855 836 862 878 878 881 884 887 889 890 884 879 880 882 883 886 887 887 890 891 890 891 892 892 891 889 888 890 900 900 897 905 910 912 916 921 925 927 928 928 930 932 931 931 934 931 924 924 921 913 910 906 901 900 901 907 911 912 915 917 918 920 923 924 927 930 934 937 939 941 943 947 947 951 952 951 954 956 959 963 966 968 969 971 973 975 976 979 983 987 989 991 994 996 996 997 999 1002 1005 1007 1009 1010 1009 1009 1009 1010 1013 1017 1019 1020 1020 1024 1027 1029 1034 1038 1041 1044 1046 1049 1054 1061 1066 1070 1072 1072 1071 1069 1070 1073 1079 1084 1085 1086 1087 1089 1091 1092 1094 1097 1103 1105 1107 1111 1113 1113 1119 1122 1120 1124 1129 1129 1131 1133 1135 1138 1142 1143 1143 1146 1146 1145 1150 1153 1154 1156 1160 1167 1171 1174 1179 1183 1185 1191 1197 1199 1199 1198 1202 1201 1203 1205 1206 1207 1209 1207 1209 1213 1211 1208 1203 1202 1201 1194 1197 1205 1220 1225 1221 1222 1224 1226 1230 1235 1232 1231 1232 1230 1228 1228 1222 1211 1206 1207 1217 1228 1236 1238 1239 1238 1218 1205 1202 1201 1199 1193 1196 1204 1212 1221 1230 1230 1229 1230 1231 1231 1206 1184 1167 1131 1096 1094 1081 1058 1074 1082 1071 1052 1032 1019 1021 1037 1048 1065 1091 1101 1111 1148 1157 1143 1107 1075 1056 1033 1011 1006 1007 1015 1013 1011 1012 1019 1029 1046 1060 1074 1089 1104 1119 1136 1155 1166 1177 1185 1192 1199 1209 1213 1214 1213 1209 1202 1200 1197 1193 1187 1180 1176 1174 1176 1173 1171 1172 1168 1164 1168 1171 1171 1176 1181 1181 1179 1178 1169 1162 1155 1153 1146 1132 1116 1101 1094 1090 1086 1085 1083 1078 1076 1073 1068 1064 1061 1055 1050 1046 1043 1041 1037 1035 1034 1033 1032 1031 1028 1024 1019 1018 1017 1014 1011 1006 1004 1000 995 991 988 987 985 982 979 974 967 966 966 962 959 958 956 954 953 949 945 944 942 938 937 935 932 931 930 927 926 926 922 919 919 919 919 921 919 915 921 923 920 917 915 915 915 914 915 915 914 914 915 919 917 913 907 903 900 901 903 906 908 1 7 463 1 0.558000000000000D+06 0.510801000000000D+07 0.000000000000000D+00 0.845000000000000D+03 0.123900000000000D+04 924 926 925 929 931 932 939 945 953 960 966 971 979 987 991 995 998 998 998 1002 1003 1004 1009 1011 1003 1002 1003 1005 1009 1015 1004 998 1006 1003 995 993 990 984 982 979 975 972 970 958 943 924 908 894 881 863 845 867 880 879 881 884 887 888 889 885 883 883 884 884 886 887 889 891 892 892 893 895 896 895 893 892 894 903 904 902 909 914 916 919 923 927 930 930 930 930 932 930 930 939 937 931 930 926 918 918 918 910 906 904 908 911 914 915 917 919 921 924 926 928 931 935 938 940 942 943 948 948 951 953 953 955 957 960 964 967 969 970 971 974 976 979 980 983 988 990 992 996 997 999 998 999 1003 1005 1008 1011 1012 1012 1011 1010 1009 1012 1016 1020 1021 1021 1027 1031 1031 1036 1040 1041 1043 1045 1048 1053 1062 1066 1070 1074 1075 1074 1075 1074 1073 1081 1087 1088 1089 1090 1093 1095 1096 1098 1100 1103 1105 1108 1113 1115 1116 1121 1125 1123 1126 1131 1132 1134 1138 1140 1142 1144 1147 1149 1149 1149 1149 1153 1155 1155 1159 1164 1169 1173 1177 1177 1179 1183 1188 1194 1198 1199 1198 1200 1201 1204 1205 1206 1208 1209 1208 1211 1214 1213 1211 1207 1211 1211 1203 1202 1205 1224 1230 1224 1225 1226 1226 1231 1237 1235 1233 1232 1231 1231 1233 1228 1220 1213 1213 1221 1231 1239 1239 1239 1237 1217 1206 1205 1199 1196 1201 1207 1214 1222 1229 1233 1236 1237 1235 1233 1230 1203 1183 1175 1138 1104 1112 1100 1073 1096 1102 1079 1059 1041 1028 1032 1049 1062 1078 1099 1110 1122 1159 1167 1153 1110 1073 1048 1028 1013 1010 1012 1017 1017 1017 1017 1024 1034 1053 1069 1080 1097 1114 1130 1147 1165 1178 1188 1193 1197 1201 1210 1212 1210 1209 1208 1206 1204 1200 1194 1189 1184 1178 1177 1180 1176 1173 1172 1169 1167 1172 1175 1175 1181 1184 1183 1180 1176 1165 1154 1141 1138 1135 1128 1113 1098 1094 1091 1088 1088 1085 1081 1076 1072 1067 1063 1058 1055 1052 1051 1047 1043 1043 1040 1037 1036 1034 1032 1027 1023 1019 1018 1016 1012 1008 1004 1003 1000 996 991 988 985 982 979 977 973 968 968 968 964 961 960 957 955 953 949 946 944 942 939 938 937 936 934 932 929 927 927 926 926 929 930 931 933 930 923 930 931 926 924 922 919 918 918 920 919 917 917 918 921 917 911 906 904 905 904 904 907 909 1 8 463 1 0.558030000000000D+06 0.510801000000000D+07 0.000000000000000D+00 0.855000000000000D+03 0.124200000000000D+04 928 930 932 939 942 942 949 953 955 961 969 975 984 994 997 1001 1007 1008 1008 1010 1012 1014 1019 1020 1015 1013 1012 1019 1023 1026 1012 1005 1014 1007 996 990 986 981 976 972 966 962 959 956 947 932 918 904 890 873 855 870 880 883 883 883 887 888 888 887 887 888 887 886 886 887 889 891 892 893 894 896 897 897 897 897 899 905 907 909 917 920 920 924 928 930 930 931 932 932 930 931 935 944 944 940 934 929 924 927 928 917 911 907 909 912 915 918 920 920 922 924 926 929 932 935 939 941 943 944 947 948 952 953 954 956 958 960 964 967 969 970 973 975 978 980 981 984 989 991 993 998 999 1001 1000 1001 1006 1007 1008 1011 1013 1015 1014 1013 1014 1016 1018 1021 1022 1022 1028 1031 1031 1037 1042 1041 1044 1048 1049 1052 1059 1061 1065 1073 1076 1078 1080 1079 1075 1083 1089 1091 1092 1094 1096 1098 1100 1102 1104 1106 1108 1111 1118 1119 1118 1123 1127 1125 1129 1134 1135 1138 1141 1146 1149 1147 1149 1151 1152 1152 1153 1155 1157 1156 1161 1167 1172 1175 1176 1177 1179 1183 1187 1191 1198 1199 1198 1201 1202 1206 1208 1209 1210 1210 1209 1212 1216 1215 1214 1211 1218 1222 1212 1207 1207 1227 1233 1226 1226 1227 1226 1231 1239 1240 1239 1233 1230 1230 1236 1235 1231 1221 1218 1224 1234 1242 1240 1238 1236 1219 1210 1210 1201 1196 1211 1220 1225 1232 1235 1234 1238 1242 1239 1230 1218 1202 1189 1183 1146 1114 1129 1119 1092 1110 1110 1080 1062 1049 1038 1044 1062 1074 1089 1112 1123 1134 1169 1173 1153 1112 1076 1049 1030 1015 1017 1019 1021 1021 1020 1019 1025 1036 1058 1074 1087 1106 1124 1141 1159 1177 1192 1200 1201 1202 1204 1210 1209 1207 1206 1206 1205 1205 1202 1193 1189 1186 1180 1179 1182 1178 1173 1170 1169 1171 1176 1179 1180 1184 1187 1187 1178 1168 1158 1144 1130 1124 1119 1114 1105 1096 1094 1091 1091 1089 1087 1084 1079 1073 1065 1062 1059 1055 1052 1050 1047 1046 1048 1045 1040 1037 1034 1031 1028 1024 1019 1017 1016 1011 1007 1005 1004 1002 998 993 987 984 982 980 977 974 970 969 969 965 963 962 958 955 953 951 948 946 945 944 942 939 936 934 932 930 933 937 938 940 943 940 938 940 936 929 934 936 932 930 928 923 922 923 924 924 922 921 921 925 922 914 908 907 911 907 905 906 910 1 9 463 1 0.558060000000000D+06 0.510801000000000D+07 0.000000000000000D+00 0.867000000000000D+03 0.124700000000000D+04 928 932 937 948 951 949 954 956 956 962 970 978 989 1001 1003 1008 1015 1017 1018 1021 1023 1026 1031 1032 1026 1024 1023 1031 1035 1037 1022 1014 1021 1012 998 990 983 979 969 960 952 945 939 944 942 933 925 914 900 883 867 874 881 886 886 886 888 888 888 888 889 890 891 890 887 887 888 892 894 894 895 896 897 898 901 902 905 910 913 917 924 927 925 929 931 933 933 933 934 934 932 938 944 950 950 947 936 931 931 932 930 920 914 909 910 912 916 920 924 924 926 927 928 930 933 936 939 941 944 946 947 949 952 953 955 958 959 961 964 966 969 971 973 976 978 981 984 986 989 991 994 1000 1001 1004 1002 1003 1008 1010 1011 1012 1015 1019 1018 1017 1017 1019 1021 1022 1023 1025 1030 1032 1031 1038 1042 1040 1044 1048 1049 1052 1058 1061 1066 1076 1081 1084 1084 1083 1081 1086 1091 1093 1094 1096 1099 1102 1105 1106 1108 1111 1112 1114 1122 1124 1120 1126 1130 1129 1131 1135 1138 1142 1146 1148 1149 1150 1151 1152 1155 1156 1156 1159 1160 1159 1163 1168 1172 1175 1176 1178 1183 1191 1191 1192 1197 1200 1201 1203 1204 1208 1211 1211 1213 1213 1212 1214 1217 1218 1217 1213 1222 1226 1219 1212 1208 1229 1235 1228 1229 1229 1228 1233 1241 1247 1245 1236 1229 1227 1236 1241 1242 1229 1224 1229 1238 1246 1247 1241 1232 1220 1213 1212 1207 1206 1219 1228 1235 1234 1234 1234 1236 1239 1238 1230 1218 1209 1200 1191 1155 1126 1149 1140 1114 1122 1115 1085 1069 1057 1047 1056 1077 1085 1100 1128 1137 1146 1176 1174 1150 1114 1082 1057 1036 1021 1022 1023 1025 1022 1020 1019 1025 1034 1054 1074 1093 1114 1132 1147 1166 1185 1197 1204 1207 1207 1208 1213 1211 1207 1206 1205 1202 1201 1199 1193 1190 1188 1182 1181 1182 1178 1175 1172 1172 1174 1180 1184 1187 1187 1187 1186 1175 1162 1148 1135 1124 1115 1107 1101 1099 1097 1096 1094 1094 1091 1088 1086 1078 1071 1068 1065 1062 1055 1053 1055 1053 1050 1048 1046 1042 1037 1034 1031 1028 1024 1019 1016 1014 1011 1008 1005 1003 1001 996 994 993 992 987 981 980 978 973 971 969 967 965 963 959 956 954 953 951 950 949 948 944 940 938 937 936 936 943 954 951 951 953 948 943 945 941 934 938 938 933 931 930 925 924 925 926 927 927 927 928 933 927 917 912 910 913 910 907 908 911 1 10 463 1 0.558090000000000D+06 0.510801000000000D+07 0.000000000000000D+00 0.879000000000000D+03 0.125700000000000D+04 932 935 942 954 957 955 956 956 955 959 966 978 992 1006 1006 1010 1019 1021 1023 1027 1028 1029 1038 1040 1032 1032 1035 1044 1047 1046 1032 1025 1029 1017 1002 992 985 978 964 950 938 929 922 926 926 922 922 916 902 890 879 879 882 887 890 891 889 889 889 889 890 892 893 893 889 887 886 891 894 895 895 895 897 899 903 909 913 917 920 923 930 932 931 933 935 936 935 934 936 937 936 938 941 948 948 944 935 933 936 931 927 921 916 912 912 914 917 919 922 926 928 930 931 932 934 937 939 941 944 947 949 950 953 955 957 960 961 961 965 968 970 972 974 976 980 983 986 988 991 992 995 1000 1002 1004 1004 1005 1009 1011 1013 1012 1016 1022 1022 1022 1021 1024 1026 1026 1027 1029 1033 1034 1031 1038 1042 1038 1043 1050 1051 1054 1058 1064 1071 1080 1085 1088 1088 1088 1086 1089 1091 1093 1097 1100 1103 1107 1111 1110 1111 1115 1116 1117 1122 1124 1123 1130 1134 1132 1133 1135 1139 1144 1151 1150 1150 1153 1154 1154 1158 1158 1156 1160 1162 1162 1166 1170 1174 1178 1182 1182 1185 1193 1193 1193 1198 1201 1204 1206 1206 1210 1213 1213 1214 1216 1214 1217 1221 1221 1220 1217 1225 1229 1225 1217 1212 1230 1237 1234 1233 1232 1232 1236 1243 1248 1246 1238 1231 1229 1239 1245 1247 1236 1231 1235 1242 1250 1257 1247 1229 1222 1217 1213 1211 1213 1226 1234 1240 1235 1233 1234 1236 1237 1236 1234 1230 1220 1211 1204 1168 1143 1171 1164 1136 1129 1115 1091 1074 1062 1056 1068 1091 1099 1115 1144 1153 1159 1177 1170 1146 1117 1090 1065 1043 1026 1025 1026 1028 1024 1022 1021 1026 1035 1053 1073 1095 1113 1129 1141 1161 1183 1193 1203 1214 1212 1212 1216 1214 1210 1210 1207 1202 1199 1197 1196 1193 1189 1184 1182 1182 1178 1175 1176 1177 1180 1186 1190 1190 1187 1183 1177 1167 1156 1138 1125 1117 1110 1103 1101 1100 1099 1097 1095 1093 1089 1085 1083 1080 1076 1067 1064 1062 1058 1057 1060 1056 1052 1049 1046 1043 1038 1033 1028 1027 1025 1019 1015 1012 1011 1008 1005 1003 1000 999 998 998 998 991 981 981 979 975 973 971 969 966 963 961 959 956 954 954 953 951 947 945 944 941 944 947 948 956 966 961 958 958 954 950 947 943 939 940 939 935 933 931 927 926 927 928 930 933 931 931 939 931 917 915 915 916 911 908 911 914 1 11 463 1 0.558120000000000D+06 0.510801000000000D+07 0.000000000000000D+00 0.881000000000000D+03 0.125600000000000D+04 937 940 946 958 960 960 964 963 956 962 970 979 990 1001 1002 1005 1012 1014 1017 1021 1022 1022 1032 1034 1027 1035 1042 1046 1049 1052 1041 1036 1038 1023 1006 997 988 980 967 951 931 920 912 909 908 907 909 906 895 889 884 881 882 887 892 895 891 890 890 891 893 894 895 894 891 889 887 892 895 895 895 896 897 901 906 915 922 925 926 929 936 937 936 937 938 938 937 936 938 938 937 936 937 942 943 941 934 934 938 931 926 922 918 915 915 916 917 918 920 926 927 928 932 935 936 940 942 942 944 948 950 952 955 957 959 963 963 964 968 970 971 973 975 977 980 983 987 990 992 994 996 1000 1002 1004 1005 1007 1009 1012 1013 1013 1018 1023 1025 1025 1026 1030 1032 1030 1032 1035 1036 1035 1031 1039 1042 1037 1041 1048 1057 1065 1072 1078 1083 1087 1090 1091 1094 1094 1091 1090 1090 1093 1099 1105 1106 1110 1114 1113 1114 1120 1122 1123 1126 1127 1127 1134 1138 1136 1136 1138 1140 1146 1152 1150 1151 1155 1156 1158 1159 1160 1159 1161 1163 1165 1170 1174 1177 1181 1186 1185 1187 1192 1193 1195 1202 1205 1207 1210 1209 1212 1214 1215 1216 1219 1216 1219 1224 1224 1223 1222 1228 1232 1231 1223 1217 1232 1241 1245 1240 1236 1237 1240 1243 1244 1242 1240 1236 1236 1242 1247 1249 1240 1238 1241 1247 1253 1256 1244 1228 1224 1221 1218 1214 1216 1233 1240 1242 1242 1240 1237 1240 1242 1235 1235 1237 1227 1220 1216 1182 1162 1194 1185 1154 1135 1115 1096 1081 1070 1069 1084 1106 1114 1130 1160 1168 1172 1180 1167 1141 1119 1094 1065 1044 1028 1027 1028 1032 1027 1024 1023 1028 1036 1053 1070 1089 1104 1118 1131 1151 1173 1186 1202 1219 1216 1215 1218 1216 1212 1213 1211 1205 1203 1200 1194 1192 1191 1185 1183 1183 1177 1175 1180 1182 1185 1192 1188 1178 1173 1168 1161 1155 1148 1130 1119 1115 1111 1108 1105 1103 1101 1097 1094 1089 1086 1083 1082 1082 1080 1074 1070 1068 1063 1061 1062 1058 1054 1050 1046 1043 1039 1034 1028 1028 1025 1019 1014 1011 1008 1005 1003 1001 1000 1000 996 990 988 986 983 982 980 977 974 973 972 969 965 964 963 961 957 954 954 952 950 953 953 948 955 961 960 964 970 964 961 960 956 952 949 946 943 943 942 938 938 937 933 932 931 931 932 935 934 934 942 932 917 919 920 919 913 910 914 918 1 12 463 1 0.558150000000000D+06 0.510801000000000D+07 0.000000000000000D+00 0.882000000000000D+03 0.125500000000000D+04 942 945 951 962 965 966 975 973 965 973 980 983 988 993 993 997 1006 1004 1004 1012 1016 1018 1023 1025 1023 1032 1040 1039 1045 1053 1050 1048 1049 1031 1012 1003 993 983 974 958 935 922 911 903 896 892 895 894 886 884 882 882 883 886 892 895 894 893 893 894 895 896 896 895 893 890 888 893 896 896 895 896 898 902 907 917 924 929 932 935 942 942 940 940 939 938 937 937 939 939 939 939 940 942 942 941 935 936 941 933 927 922 919 917 919 919 917 918 921 926 927 927 932 935 937 942 944 942 945 950 952 954 956 959 962 965 966 967 971 973 974 975 977 978 981 984 987 990 993 995 997 999 1001 1002 1005 1008 1012 1013 1015 1016 1021 1027 1026 1027 1029 1033 1036 1035 1037 1039 1038 1037 1036 1041 1044 1043 1046 1053 1068 1079 1087 1092 1096 1100 1100 1098 1094 1094 1095 1093 1093 1094 1101 1109 1111 1113 1116 1114 1116 1124 1127 1129 1133 1133 1131 1137 1139 1138 1140 1142 1144 1149 1153 1152 1154 1159 1160 1161 1164 1164 1162 1164 1166 1168 1172 1176 1181 1184 1187 1188 1189 1192 1194 1198 1204 1206 1207 1212 1213 1215 1217 1219 1219 1221 1219 1223 1227 1227 1227 1228 1230 1232 1233 1227 1222 1234 1244 1252 1245 1240 1241 1243 1245 1244 1243 1242 1240 1240 1246 1248 1249 1243 1243 1247 1253 1255 1251 1241 1230 1228 1226 1223 1216 1218 1241 1247 1245 1247 1246 1242 1245 1245 1238 1239 1242 1235 1230 1228 1199 1183 1214 1203 1172 1144 1120 1102 1088 1079 1083 1100 1122 1129 1146 1176 1182 1182 1181 1163 1137 1114 1088 1057 1042 1032 1029 1032 1038 1031 1027 1025 1031 1038 1047 1061 1077 1092 1108 1124 1144 1163 1179 1197 1217 1217 1217 1219 1216 1212 1213 1212 1207 1206 1203 1195 1193 1193 1187 1185 1185 1180 1179 1185 1188 1190 1192 1181 1162 1156 1150 1141 1139 1137 1125 1119 1118 1114 1109 1104 1101 1098 1095 1092 1090 1089 1089 1089 1082 1078 1078 1076 1073 1067 1064 1063 1058 1054 1052 1048 1044 1041 1037 1032 1031 1027 1020 1019 1017 1011 1006 1003 999 996 995 992 989 991 991 989 986 983 980 978 976 976 974 972 969 968 971 963 956 958 958 957 964 966 961 967 973 970 968 968 963 961 960 956 952 950 949 948 950 948 943 945 947 945 942 938 935 935 938 937 937 940 932 922 926 926 924 920 917 919 921 1 13 463 1 0.558180000000000D+06 0.510801000000000D+07 0.000000000000000D+00 0.879000000000000D+03 0.126000000000000D+04 947 949 955 966 970 974 986 985 977 984 990 992 998 1003 998 1003 1015 1009 1008 1018 1021 1023 1028 1028 1025 1033 1039 1038 1045 1055 1057 1058 1058 1038 1020 1012 1000 987 980 964 939 931 924 914 900 885 887 886 882 880 879 882 883 885 892 897 899 897 895 896 896 896 896 895 894 892 891 895 897 897 896 896 900 903 907 914 921 928 935 941 946 946 943 942 940 938 938 939 940 941 943 942 941 942 942 942 936 939 944 935 927 922 919 918 920 920 919 920 922 927 928 928 933 936 937 940 942 941 946 953 955 957 959 963 966 967 969 970 973 975 974 977 979 979 983 986 988 991 995 995 997 1000 1001 1002 1005 1009 1013 1015 1017 1020 1024 1027 1026 1028 1032 1035 1037 1039 1042 1043 1042 1041 1040 1042 1046 1051 1061 1073 1082 1090 1097 1100 1104 1110 1111 1110 1104 1100 1096 1097 1098 1096 1104 1112 1116 1117 1116 1115 1119 1129 1129 1130 1136 1137 1135 1140 1142 1140 1141 1144 1147 1151 1155 1156 1158 1163 1163 1164 1169 1171 1170 1169 1170 1173 1175 1177 1182 1186 1189 1189 1191 1195 1198 1201 1206 1208 1209 1214 1215 1217 1220 1222 1223 1223 1223 1226 1230 1230 1231 1232 1232 1232 1234 1231 1229 1236 1244 1254 1249 1246 1245 1246 1248 1246 1245 1244 1244 1245 1250 1250 1249 1244 1244 1248 1256 1260 1255 1245 1234 1232 1230 1228 1220 1222 1247 1251 1249 1251 1250 1246 1249 1249 1242 1244 1249 1243 1240 1241 1218 1206 1232 1214 1178 1149 1125 1107 1095 1090 1097 1116 1139 1146 1163 1191 1192 1187 1177 1157 1132 1107 1081 1052 1045 1042 1037 1040 1046 1037 1031 1029 1034 1040 1042 1051 1065 1083 1101 1119 1138 1157 1175 1191 1207 1215 1220 1220 1216 1212 1212 1210 1205 1205 1203 1199 1197 1196 1191 1187 1183 1183 1185 1192 1194 1194 1186 1171 1150 1143 1137 1132 1129 1128 1125 1121 1116 1110 1105 1103 1101 1100 1098 1095 1095 1094 1092 1089 1084 1081 1081 1079 1076 1070 1067 1065 1059 1055 1056 1050 1044 1047 1046 1042 1041 1037 1028 1029 1030 1023 1018 1013 1003 997 998 995 993 995 994 991 990 988 986 985 985 986 987 986 980 979 984 974 966 972 972 970 975 974 968 972 974 970 968 967 963 960 960 956 953 953 953 953 956 956 950 952 954 954 950 945 941 940 942 941 939 938 932 926 932 935 933 930 927 924 926 1 14 463 1 0.558210000000000D+06 0.510801000000000D+07 0.000000000000000D+00 0.877000000000000D+03 0.126300000000000D+04 953 957 963 972 976 981 994 994 986 993 997 999 1005 1009 1005 1010 1022 1018 1019 1028 1030 1030 1038 1039 1034 1040 1044 1042 1049 1059 1067 1068 1065 1046 1030 1022 1008 992 987 972 948 943 939 929 913 896 890 885 880 877 877 882 883 884 893 900 906 903 900 898 897 898 897 897 896 895 894 898 899 899 897 897 900 903 906 907 913 923 936 945 949 947 944 943 941 939 940 940 941 943 946 943 941 941 943 943 938 940 944 936 929 923 920 919 921 922 922 921 923 929 931 932 935 936 936 939 940 941 948 955 958 960 960 965 968 969 970 973 976 976 974 977 980 981 984 987 990 993 996 996 998 1002 1002 1004 1007 1010 1013 1015 1018 1023 1024 1024 1025 1029 1035 1036 1038 1044 1047 1048 1047 1046 1044 1043 1048 1060 1074 1086 1090 1096 1102 1105 1108 1113 1114 1115 1116 1111 1102 1100 1099 1100 1106 1112 1117 1120 1121 1121 1125 1131 1130 1130 1137 1139 1139 1143 1145 1141 1145 1149 1152 1154 1156 1158 1162 1165 1166 1168 1174 1177 1178 1176 1175 1175 1176 1178 1183 1188 1192 1192 1194 1197 1201 1205 1208 1210 1211 1216 1217 1219 1222 1225 1227 1227 1228 1231 1234 1233 1234 1236 1234 1235 1238 1239 1239 1239 1245 1254 1253 1250 1246 1247 1250 1248 1247 1248 1248 1250 1253 1252 1250 1248 1248 1249 1258 1263 1260 1249 1237 1235 1235 1234 1226 1227 1250 1255 1254 1255 1254 1251 1253 1253 1247 1250 1255 1251 1250 1252 1238 1229 1240 1214 1174 1152 1129 1107 1102 1103 1112 1134 1159 1168 1183 1204 1198 1186 1172 1152 1129 1101 1076 1054 1053 1053 1045 1049 1058 1047 1038 1032 1037 1043 1044 1049 1057 1076 1094 1113 1133 1153 1168 1184 1200 1213 1221 1221 1216 1212 1211 1208 1205 1205 1204 1202 1200 1197 1189 1186 1183 1187 1192 1198 1197 1194 1183 1168 1151 1140 1134 1132 1129 1125 1122 1118 1114 1109 1107 1110 1107 1104 1101 1098 1094 1095 1092 1087 1087 1086 1082 1079 1076 1071 1071 1072 1068 1065 1062 1051 1043 1052 1056 1057 1058 1054 1043 1043 1044 1039 1033 1027 1009 1000 1002 998 994 994 993 992 995 994 990 995 1000 1001 1002 1002 996 995 998 988 980 986 984 980 979 976 971 972 973 967 965 964 960 958 959 958 956 958 958 957 960 960 957 957 956 954 954 953 947 946 948 945 943 943 938 933 941 945 945 942 937 931 933 1 15 463 1 0.558240000000000D+06 0.510801000000000D+07 0.000000000000000D+00 0.879000000000000D+03 0.126600000000000D+04 959 963 969 976 981 988 1001 1002 996 1000 1002 1002 1008 1013 1010 1015 1025 1025 1028 1036 1036 1036 1044 1046 1043 1046 1047 1046 1055 1066 1074 1076 1072 1055 1040 1032 1016 999 995 981 958 957 954 943 928 911 897 887 880 879 879 881 884 887 893 899 905 906 906 902 901 901 900 898 898 896 896 898 899 899 897 898 901 903 904 901 907 919 935 946 951 949 946 945 943 940 942 943 942 944 946 944 942 941 944 945 940 942 944 940 933 925 921 920 923 924 924 922 924 930 933 936 937 934 931 937 941 943 951 958 959 961 961 965 968 969 971 973 977 977 974 978 981 983 985 988 992 996 998 998 1000 1004 1004 1006 1008 1010 1013 1016 1019 1024 1026 1027 1028 1032 1038 1037 1039 1045 1047 1050 1053 1052 1049 1049 1056 1074 1086 1095 1097 1100 1103 1105 1108 1113 1116 1119 1123 1119 1110 1107 1104 1102 1103 1107 1114 1121 1126 1126 1128 1130 1130 1132 1139 1142 1143 1146 1146 1144 1148 1151 1153 1156 1159 1162 1165 1169 1169 1170 1175 1180 1183 1183 1181 1177 1179 1182 1185 1189 1194 1194 1197 1200 1205 1209 1211 1213 1216 1220 1220 1223 1225 1227 1230 1231 1233 1234 1235 1236 1238 1240 1238 1237 1241 1248 1252 1242 1245 1254 1257 1255 1247 1249 1252 1249 1250 1252 1252 1254 1257 1255 1252 1254 1254 1253 1261 1266 1265 1253 1241 1239 1239 1239 1231 1233 1253 1258 1259 1260 1259 1257 1258 1258 1252 1255 1261 1260 1260 1263 1257 1248 1235 1205 1170 1154 1132 1105 1108 1116 1126 1150 1178 1187 1199 1214 1201 1185 1168 1147 1125 1097 1076 1062 1063 1061 1050 1059 1076 1056 1043 1035 1041 1048 1055 1059 1061 1074 1089 1105 1125 1145 1162 1177 1192 1209 1218 1217 1215 1213 1211 1210 1208 1209 1206 1198 1195 1193 1183 1185 1190 1196 1198 1197 1189 1181 1173 1163 1154 1143 1134 1130 1127 1123 1120 1119 1118 1114 1112 1114 1111 1105 1103 1099 1094 1096 1094 1090 1089 1086 1082 1080 1078 1076 1079 1086 1082 1074 1060 1050 1045 1057 1066 1072 1074 1071 1062 1059 1056 1051 1043 1032 1013 1003 1004 999 996 996 997 998 1004 1003 993 1005 1016 1015 1013 1011 1009 1007 1007 998 991 996 991 983 980 977 974 973 971 966 964 963 960 960 962 960 960 961 960 960 961 961 960 959 958 955 955 955 952 951 953 951 949 949 946 944 952 957 957 953 947 940 940 1 16 463 1 0.558270000000000D+06 0.510801000000000D+07 0.000000000000000D+00 0.881000000000000D+03 0.127600000000000D+04 961 965 970 977 985 993 1003 1007 1008 1009 1009 1007 1012 1017 1015 1018 1024 1029 1034 1040 1039 1040 1047 1050 1051 1049 1048 1050 1059 1069 1075 1078 1078 1064 1053 1045 1029 1012 1005 990 969 973 971 957 943 928 906 891 881 881 881 883 886 889 892 895 898 903 907 906 905 904 901 900 899 897 896 900 900 898 898 899 902 903 904 905 912 923 936 946 950 952 952 949 945 942 943 944 943 946 948 945 942 940 945 946 943 943 945 943 938 930 924 921 925 927 927 927 928 931 932 934 936 933 928 937 943 946 954 958 960 961 962 964 967 968 970 972 975 976 975 978 981 983 986 988 992 995 999 1000 1002 1006 1005 1007 1009 1011 1013 1016 1020 1026 1030 1032 1033 1036 1041 1040 1041 1046 1048 1050 1055 1056 1053 1055 1061 1075 1087 1096 1098 1101 1105 1106 1108 1113 1117 1121 1127 1125 1119 1119 1116 1111 1106 1105 1111 1121 1130 1131 1131 1129 1131 1135 1143 1145 1145 1148 1149 1149 1151 1153 1155 1159 1163 1165 1168 1170 1171 1173 1178 1183 1187 1187 1185 1181 1184 1186 1186 1191 1196 1197 1200 1204 1208 1211 1215 1217 1220 1224 1224 1228 1229 1230 1231 1234 1235 1236 1237 1239 1242 1245 1241 1240 1243 1255 1261 1245 1244 1253 1260 1259 1249 1251 1255 1253 1254 1257 1255 1256 1261 1257 1254 1260 1262 1260 1264 1267 1268 1257 1245 1242 1242 1243 1235 1237 1256 1261 1262 1263 1263 1261 1263 1264 1260 1263 1268 1269 1272 1276 1267 1252 1226 1197 1169 1156 1135 1107 1118 1130 1139 1165 1195 1202 1211 1221 1204 1185 1168 1148 1126 1107 1092 1082 1076 1068 1057 1068 1087 1059 1043 1038 1046 1057 1069 1074 1075 1079 1087 1098 1117 1137 1154 1170 1186 1203 1214 1215 1215 1214 1214 1209 1203 1205 1202 1192 1192 1192 1188 1192 1198 1200 1196 1185 1172 1160 1153 1147 1144 1139 1134 1129 1127 1125 1125 1123 1121 1118 1116 1117 1112 1107 1105 1099 1094 1096 1096 1093 1090 1087 1085 1085 1086 1085 1091 1101 1092 1081 1070 1059 1054 1068 1079 1089 1086 1082 1076 1070 1063 1053 1038 1022 1010 1004 1004 1001 1001 1007 1010 1011 1016 1016 1010 1018 1025 1022 1017 1012 1010 1008 1005 1001 997 995 990 985 982 978 975 974 972 967 966 967 965 965 966 964 962 963 962 961 962 962 963 962 961 957 957 957 955 956 958 959 959 957 956 955 964 963 957 955 951 942 942 1 17 463 1 0.558300000000000D+06 0.510801000000000D+07 0.000000000000000D+00 0.883000000000000D+03 0.128400000000000D+04 961 966 971 978 986 995 1001 1006 1010 1015 1016 1013 1015 1018 1019 1021 1025 1031 1037 1041 1042 1044 1048 1052 1055 1051 1051 1054 1064 1073 1077 1079 1080 1072 1063 1056 1038 1022 1015 1001 982 987 986 973 960 944 916 897 884 883 883 884 886 888 892 894 895 898 902 906 906 904 902 901 900 897 896 900 900 898 900 901 902 903 907 917 926 935 941 946 949 952 953 950 947 944 945 945 943 946 948 946 943 940 942 943 944 945 946 945 941 934 926 922 925 928 932 933 932 931 930 931 937 934 930 938 945 949 956 958 960 961 962 963 965 967 968 970 972 974 976 979 981 983 985 988 991 994 999 1001 1003 1007 1008 1011 1013 1013 1013 1016 1020 1026 1030 1034 1036 1038 1042 1041 1043 1047 1049 1050 1054 1057 1058 1060 1063 1067 1080 1091 1096 1101 1107 1107 1110 1118 1121 1124 1129 1130 1129 1131 1129 1122 1120 1119 1117 1123 1132 1135 1135 1132 1133 1137 1145 1148 1148 1152 1153 1152 1154 1156 1157 1161 1166 1167 1169 1173 1174 1176 1181 1185 1189 1191 1189 1185 1188 1190 1190 1195 1201 1201 1204 1207 1211 1214 1217 1220 1223 1228 1228 1230 1233 1234 1235 1235 1238 1240 1241 1241 1244 1248 1244 1243 1245 1260 1267 1247 1244 1250 1262 1264 1253 1255 1258 1257 1259 1261 1257 1258 1264 1259 1256 1267 1268 1265 1268 1270 1271 1260 1248 1245 1245 1248 1239 1240 1259 1264 1266 1268 1267 1264 1268 1270 1268 1271 1275 1278 1281 1284 1262 1239 1215 1191 1169 1153 1136 1117 1131 1144 1149 1177 1210 1215 1220 1226 1206 1187 1174 1154 1134 1122 1111 1101 1091 1081 1070 1077 1089 1058 1041 1038 1052 1068 1085 1091 1092 1096 1098 1099 1113 1129 1144 1162 1182 1202 1214 1216 1214 1212 1213 1208 1200 1203 1202 1195 1200 1204 1199 1201 1205 1196 1183 1166 1157 1151 1146 1143 1139 1140 1138 1133 1131 1129 1129 1126 1122 1119 1118 1117 1112 1108 1106 1100 1096 1101 1100 1097 1093 1091 1089 1094 1098 1100 1106 1115 1101 1091 1086 1075 1068 1081 1092 1100 1096 1087 1075 1069 1062 1048 1032 1015 1009 1006 1007 1005 1007 1020 1025 1027 1029 1030 1029 1029 1027 1024 1018 1012 1010 1007 1002 1001 999 993 988 984 981 979 978 976 974 971 970 970 970 970 969 965 964 966 964 962 962 963 964 965 964 960 960 961 958 959 963 967 968 966 961 959 972 969 954 952 949 944 945 1 18 463 1 0.558330000000000D+06 0.510801000000000D+07 0.000000000000000D+00 0.883000000000000D+03 0.128500000000000D+04 961 967 974 981 985 990 996 998 1000 1011 1015 1014 1017 1019 1021 1024 1027 1032 1037 1041 1043 1046 1051 1054 1057 1057 1057 1059 1067 1075 1077 1079 1081 1076 1071 1065 1046 1028 1021 1010 996 998 995 988 976 960 930 908 890 887 885 884 883 884 891 893 892 894 898 903 904 904 902 901 901 898 896 900 900 898 902 903 902 910 919 929 936 941 943 946 949 949 950 949 947 945 946 946 945 945 946 946 945 945 943 943 946 947 948 946 942 936 928 923 924 931 938 938 935 931 929 930 937 936 935 941 946 952 955 957 958 960 962 961 963 967 968 969 971 974 976 980 981 981 985 988 989 993 999 1001 1004 1008 1009 1013 1015 1015 1013 1015 1019 1026 1030 1033 1038 1041 1043 1043 1045 1048 1049 1050 1054 1059 1063 1065 1066 1066 1073 1081 1086 1096 1107 1107 1112 1122 1126 1129 1132 1134 1136 1138 1139 1136 1134 1131 1124 1127 1134 1137 1137 1135 1137 1140 1146 1150 1152 1156 1158 1157 1158 1159 1160 1163 1166 1167 1170 1176 1176 1178 1185 1189 1193 1196 1194 1188 1193 1196 1195 1200 1206 1206 1208 1210 1214 1217 1219 1223 1227 1231 1231 1233 1236 1237 1238 1239 1241 1244 1245 1245 1248 1251 1247 1247 1249 1265 1272 1251 1246 1250 1265 1268 1258 1260 1262 1262 1265 1267 1260 1260 1270 1267 1265 1275 1275 1270 1272 1274 1274 1263 1252 1250 1251 1254 1244 1245 1261 1266 1268 1271 1271 1268 1273 1275 1275 1277 1281 1283 1284 1285 1255 1229 1210 1187 1166 1157 1144 1128 1146 1159 1159 1192 1228 1227 1226 1226 1206 1188 1181 1162 1142 1131 1116 1097 1097 1096 1087 1092 1098 1073 1054 1041 1051 1068 1095 1106 1110 1115 1115 1109 1118 1130 1144 1161 1180 1203 1216 1219 1213 1209 1215 1214 1210 1217 1215 1204 1209 1214 1209 1205 1200 1185 1171 1158 1154 1152 1153 1148 1141 1140 1139 1135 1132 1130 1128 1125 1122 1120 1118 1116 1112 1109 1109 1104 1102 1104 1103 1100 1094 1092 1094 1103 1111 1113 1116 1118 1109 1103 1102 1093 1088 1097 1095 1087 1087 1079 1062 1053 1045 1034 1024 1015 1011 1009 1008 1010 1016 1034 1041 1042 1041 1039 1036 1033 1029 1024 1019 1015 1011 1008 1005 1003 1000 995 989 984 982 981 981 980 977 974 973 973 973 972 972 968 966 967 966 965 964 965 966 967 966 962 963 964 961 963 968 969 969 971 968 965 968 966 960 956 952 951 952 mayavi-4.5.0/mayavi/tests/data/fieldfile.vtk0000644000076500000240000000104012747716314021433 0ustar prabhustaff00000000000000# vtk DataFile Version 2.0 cell attributes ASCII DATASET UNSTRUCTURED_GRID POINTS 18 float 0.5 0.5 0.5 1.5 0.5 0.5 0.5 1.5 0.5 0.5 0.5 1.5 1.5 0.5 1.5 0.5 1.5 1.5 1.1 1.1 1 2.1 1.1 1 2.1 2.1 1 1.1 2.1 1 1.1 1.1 2 2.1 1.1 2 2.1 2.1 2 1.1 2.1 2 2.2 2.2 2 3.2 2.2 2 2.2 3.2 2 2.2 2.2 3 CELLS 3 27 8 0 1 2 2 3 4 5 5 8 6 7 8 9 10 11 12 13 8 14 15 16 17 17 17 17 17 CELL_TYPES 3 12 12 12 CELL_DATA 3 FIELD attributes 3 group 1 3 int 1 2 1 material 1 3 int 100 200 300 group_and_material 2 3 int 1 100 2 200 1 300 mayavi-4.5.0/mayavi/tests/data/foot.mha0000644000076500000240000000021112747716314020417 0ustar prabhustaff00000000000000NDims = 2 DimSize = 256 256 ElementType = MET_UCHAR ElementSpacing = 1.0 1.0 1.0 ElementByteOrderMSB = False ElementDataFile = foot.raw mayavi-4.5.0/mayavi/tests/data/foot.raw0000644000076500000240000020000012747716314020441 0ustar prabhustaff00000000000000         %!#,%"*'! "!##!+"($(!"  ))# *                &"+(&"")-/ '3*).%%(),+"!3%!#0%+! +"#,0  &"                 "%%&&(++)) $(%/$+,!$+2,-( .+!*'))#'+' #  "41%+"!'!                    &$!--1&(),53'3"&*+(%6,#**23.),./*4; !.$,3('!#%  5,"*(0-                             +9),0,4(.).0*/3&34,0-#!1--.#&0,1.5.2+",+**'&)-  $3/(& !-%                       (.&)$.)*3'+.'''198"(4-.6**)0..)%*'/445"6(/2!''"*.+  #-/32& #"                  **$1$,/&+'$&*53$%/7%35*--*0(.2/.+,'6363/1&//$--"/6% %4(++")))"                     !-.(21&#*-5),./,***'&-'--(*-'/0(1/*+227$30./+.-+'*-& (=3/(++/0                     %,0(,,&'.69'054310((.-'7)--&,05//,%,.1'+-'1,$/1+0+.) )752-4 -/$!                             &-!%(15"$;<.#04&,.48%&2)'8*05'/(*+(+).2-'6)%15/04(/22  ,<4(%+&!$                        &. +)-/3487&,+/.$,9&'-2)0-,7.*./$&5,'2(1)#6610/50,+( +;8-%#!"',                      (!!6-$1:142%(-96/&-*(4*14*13-66,&*+)0!(#+72*058:-1- %30/2./!9'                             ()6331,57-,),/+%*-($!0/-,4/#$6+15,(0,1060).3.)84*;&*;28;)                        "$#4+(2+&0/(1&)8-+*(,*)+1-*3-$'0//63($0,*,,23.15+12, 1<$-<0.B0$                       #)*2+'&+2/1..!7+!2-/9/4-0*'4+*1)252."&+0,,,52160;1 02".5$3?'                    ""-!!4972''1-5,&$-.!/83-(<1-3(1+,71463-%.-)(+1---40)1.  3,'246< !                     )$ ,E/434)/*%*7- %%/7/!)5<3284-'3500:4-091,.6:/+36-)10  7/+2084%                     +?=# &4-7&$,,2"#(#(*(#,38/,5/.#'4'/0015-2478042/*05/51 $B7%%'3(                         $4>'!76+1-<2 02(&'-<1562.31!.1-832122:2+0,..1.3:79( ,A7$ &-'%                      ?7()057+ &6/*)!!$$:>/7531<&#>579,23.2634334**79..6 :B0"#$.,&#                  ,@/#0507/#.-'-#.$'-><,8958=-G/7=)(4/*/78/,00.,-4/( @?(%0# #*)                  !6<432293)5*04%0# !#.)82C42908>#/?,6B8/2.36*+30,+21.=6$ (G0-: &!2%#                    &+1<=?;246)(/,3$$#1*@-;2278760=/2172753.(2413&0B;55" /H*/8%+"                    +&'2962222- !"*, $)&#:3# *=4:01.407"9C561<.77151.+.7(+<3,3  5A'4>) +,                     ! %1!.206277/0.+ !*+&+.)(0;7 $825;750326!2256.6/7.1<42417-,9:3$ @<"%08( && "                       , <: ):2,><7) 20/336.1<70).2' %(A(*9;+*585(1-5=51.9861,01.04;9:7% "@*!3.89 $#(                 &2925=?//8-$!+3%/>;:32<83/)(#3A(#3;31;?3&42/54;19?1*00*264999/ !4%-8477 (                     '& 6M1&:94,53*"&95+97-;=3;;:.$$77113883/?8(=>3357-32.-16./60130' /#/:82+"#8&                      ,,.?7*6<0+-@9-0!$- -*(=:<<48%-',2545755.;50=6044312(2/*96234834,%1!96--2( #                           > %@3%9<5114"#( !#53681,,*34(-:;@:<898/<:29:504.04-*.79.(   !"576"-9.07=33;3734;974=:842552042*(2=<11 *$-6502?*                  #"%/&;A!&<<9-  #)').1$68,8:9;?<-626916=<790332312865994/. "$*;62559' %              )+-5>D+%12  !  .)#7043<40':55==;9:,=@27A=51481-/73,.3989/ '%-855207' +*                         !27=?E>%, #6%C3.A=44,5-3>=<6:27329>42,/=)1+"                 *7-CTME.  #! %5%!7&-:=78/17958218?93A;1:6/==67167,26>;,  ;/%54=;.6B')'(                  %37P[F/%(*" '*( & %>C0+3587=8;:269>74% '#&"# , 8G)7=435A9:;55>;:641<57>588641890&.D1079A52764-                   (,/27A:=:3-5<7. +$ 48(595:4764<,%                  #4.9MQD$#;M6  #( #-$(1)C>2415:4.2@:,;!%47" /&?/*9/7:138;! ,                    /0-8E>B*    'QQ<  ' '(63:>94:?:70576?7422=7/D< #2<.+!2>%4=0=;/397# "1                 %/6$;O?   ,MS3 $% *#% ',327:7><8766;?88;<822=( *55 ;33&@F689:611%!0$                               (3,8B. &' 7RG #)#',-$3' "-'0=6<67?9?A=:7;?;34A!61+ &: 7&,A=;23EA;;%$&!                     #" /:9'/#FX'  (, -/&!%6*%9% $(+14@984/>;5>82:<5=?3:C?:;>?910F6:D9'8 7+><-68C>00: 5+"!                     (#%3/' ", 2*"C:D@6=78A924D*#E8* 3.;(#A9305><9;>7=-                   %-+*'$  !2.3$ +E!' (G0"<#.: "$$!.@C?FB/;?:927==%0;4' 2" #-#/A<71?>;=B? **                       (%$  $B1).# )$$8%  +/$+"$9?2!1>?;>F33@BD30@9%6=4 &.  #%"@$'                       #'!& "%$<* %'1140.#++I2 !(2<:3@20<=I?4C3(?E/2,#.&IA-B@9<>18@9                      &*  "#(" !1# )-9>)% #"."'6@:>36=;FD9>50:;$(0)+ O>2?:9>C9:8?                    (    (9!8+ +,8G>)##!+'%8."$!)AC942:?=8;22:9* 3+7&$1J;84<<9B==70                         !(!! # .1"3'*4 %2!#+4..%$2$+2! >:291@E98?'0G: 240(%AD8:8G=5=;=96"                     #!#" "03)  &6'($3&#" ./# #%"/4-5;DB>B='>G0  A%'%$EB;=8B@:<@>5#E-                 '  "! +*())   '3. %&*'4)*% 2/*-L3!>63=@:2E:( -;%&#&BC<;;AE?8>=, "               ,0  !A&4&$! &.!!$%$+) $I=!=.2=?19C2  9)&&%%AA9:EAC@6=:$                      1+""   '-/&:#,(1)+)#$")/ *G698D@>*8C)  (1'$#7B>>=C<@>:B:$"                   $(%  "%#0'+!  "#6+&=6) #/3<%ND7ELC6,<=7)' (ABC@:=:AB?@8& 2                   *$ ' #2 ''+=9/! %*7,%$'.0)0'66, 9N?CHG06F. ->'%)$;CE?D<8CHB93 %@&!                    $$ % *#&#   !.H@I376 $1=J4@&"(;+26'( " H@?>E07D0/!,/#,;C@DH=AEA944,J,%                      '&&--C(/    +?@@4 "/#@to[:((Q7@8$1&#& $9?A:<+/4 '('"#42*3<@@@;=G@;69B+7               % *2,+#+#%2/4Q,'2G[OEV]Y>&;KWB",%(. /@B@9&4$-"#=0+0%6HD>;1"$ "8A=JC=A:BDDG80G3"                       '-  ./2285,'!'./)!%7'/%"BE2I8!./91119<@O980) @;B%4$ ;4"H0!-$!(7==GB=AC;=KK0 '1%                   +, )&);'12+*1*2- $9B*9#.FOV=#"4&'0765?%A=1$64F51C" +('17>97B?:D@EE9# 6.!                      % 6,C()-/&%)1& #(.;%(-#20=$ 398.BH?A2QYPO:3+J=".,&'CG4655<25:EC?NI;8;KE8 >3)                      - $8&!&!!!#  ,G-+ & *=L':J@14?/GJ;BCEA@EF9 20                    * *=%-#C(   "ZL! 0938C&C?/."( (,8=D00'/')ZmZC>3 (F6=#$#84=9?/KFC,2/)/'EBGM`R  ,. -Ug]LL>"&36'*1"!C=5H:)# /83;==ORMDEID>:B:D1              #2/7J"-)# ! *A'>W2(A0)0#"*4 JC59Ahb&7,'3. %$            ##60  (.)-(   *W6WZ,&?S;-6)(qP2./?A>Z\\kOAIbZCCG626D5!+$!"AB$2]sk`<,VN48;809CE6 #''=9IFCH'(BLB:A<><8/#*/(:J5GFAD&,GK@>C@4FTC<@91F>@A50) +,$8N:>DA04KJ;>I?>NMBFI?==B:0                   '69&0;R E9 #5>N1* -II`@>2YI_J=AKtUNTT?@ ,2)() ))'3-BC,5HKGDEEOJ B=+                       ! +=9' @>1D) !4, 0 &=DLD/6r@@n?"2*SK L]X\iK) &-%2A5>H8@F?+&7GLLBEDHH&/A2.0#"$$, +6/0@FFA>c+It:,K+ IwvE]VNQ`+ *2/'%$+,?2>NAJL:/39GOA9IEHJBFHG=6PH,W5*;"              %-#IM>HF1$/HPK@>PNJBHOFJI5DF$-G6(-#                       $)&)EC3Q%)%"+D>30MZH=EH-("<4''&-3>2&:4VffJ>XP4 %-QBPN6ibT>GWQ8?$$('"5HDHH=EGJIGLI@@/01*/30$@EIU:NI*%( ,4!/1#6B-GF+hbUOQQlrAM;0&4Y* &4IUL:LRF=9+1-D?/BIGNJ8&>PIOG."/  >^[WeJ@*D6;8">@='J6NqLF]xfemC`QK*3^'$0MSURLF),+'7NO2(JKFA9'9JJQ@ANLHKKKLA?IQATU*                  *?)PN:Y:D8&& 7OjhRYD!.$MD1P9NO?Y{~ZJSLENX7+E#7!F`aILD9"- '3AT/KWIC,"6@ASGGNFGMPGCKJDI=# UJ                   2)GZ)NKBKD. "(   M;TSW[STH5+$)+0>?#DPMB*>EINGGFABHDGILN<=K:957?$,            44*@PH$GVRaJ9"% ) DYNU07>QRM Gk_NZN?3 2G)XK& 247A<[aQVYOC:"#$ )0=1 -FLD3"9H?PUJHHHFHFIHJIABJ8'2!# ;<0P7#1&4-1.0Y\L]\CA;(("%1?=*:)/Q8 8O?GOMNKKJ;7FNLK@>M<UM&-.%'&                 672=S=JhM'9(5%(%=$2/1#)! 7C%>3G_E^QE?$"# 831.$-2D[8)HHG._bV39(261E-57((1&8S,CNTWdY=B>)$(&+207F:9N="0EC3BJFNNQO6 ']A!+-/(                 #*((:0".F)Fe$+' 5;;/#=6$)+QO[cdX?:>1$)'/30CFC@@J9 9ACBSOBBC?DD;AJJJMSR;*D,(QK&%             11#,B>'G9>nk$&>*&'4/'+,Q9.<).>$'K8&[=#0!.(jt[O;\P2#!;*',$1>5),JXBTcZPKK;2+,*2-7MLGIMD/.A;=HTRNIGHCAEFHPMBIVF8H?<<*+                &81+57, 1:@,/2#BX #$0"$R:6<$">!0fQSWA%b{c`b$3>C+AjS@>NcIBJ==0)DJ8CRAGCLN?0.(9H@IHCDJIIIIBIG?BJC7*0>A21                  %)33>2,-+9;E<) 60#$P"4K42[)6:+AC/.?$?B)/aoIAB:ZPMS9 6cR3NP?@8L[MNT=435GE4?MDE=CHD-.*[8@ M=BNLMGFMNLKB' DFNT4 ,2                   (,110, 0'5@7=D6:8 410,B5 6J!8*D1eN-*=/W;:3 @I-S;QZZIdgZfokm{o>A/\^=O+OX9CFHC1@OYWIOWK>MRIORKFJK@*(UDW>2,&%#             !./40#%!1VYPOM>,B: #)?'#/>9/E10]7(C%9&<$Y(0D>80EjlsP1${p`ciomiG#5< =WHTG(MFFGMH@8EGHP>ELJAOQ4-+5C;?LND?LQLHYTJTQKHIKC./gSX' O6(1,                   0328( 4 DZ:HR9&!3@)6===g['3xe<",);0(4' HOV\4AQ@TLRPH;JNLSKFKJFRV8++IH4LNEDFEJPLXQKRKKOQN:(;h::"9g>&.!                     2?@) '/0@TZ##\D!"*35-@,$,J?"(AF9,1>"-Y2",0 #Y_M5Of:CSWIC# 8TVUJ#]KBMCJPR;=KKFHENCAKL.,:S;+RQPNHNG>IYPHRPJLRN;"DK(0R1%%              '-8E.  >1fZ'/d[#;^7 16(";%4#6M98A/2W'B9#VzL75B+FU<JR2xtdM$#%6O_dMI+n8CHMOQLE>CCFJ9OJ@BF%5]`35UKNKEPI=IUPBGLIEIRH &Q6"F>7#3-             $5/302/NjPJaZ6,KB     8%QE<-3@EjI#e:KOM4I@ >WQ^+IRBMTZU`lbF?>e0CDNHUGPBB@KN8NLHMG#GbV9S\F>HIDNOLPNBGKJFFTF 1H:EYZF:+ 1%                     *52# '82XE;a;%BO3   ,:D(51F_.%EC<@`??PnQA 8IYjoXejsgV/KTEPAHI@FGOS;6TX;2GQTLOJILBBEJJJKKNTPA!$I>I8'L;0'D!             08;( *&J+6QG*5@+ &:.3>MQ@O]RLSPGFIT>3PUMHJMVJ;?KNJHPMBOXCKQ3JQ>OF(: :               !14,  3RMXgVA5;.1# A[L4J\bS>BAESL;LWHETLOYN. 5wmW>:'L7(#..          ., >$!.Aqj[]]O?E:5 BGOe}]4(3Zw\E$ ;IEL,;9&!(1bf[= $4+KDC^WD+CS7>AG6YQF<>A@SJ3OXG?DLM@6JUEIQHMXUJJZLCOUIOQG*LjeP0 S<$)-+                #&/ &MR:RONydW]TKGA/-*WsL6 #[sbV(3?=DD9IJ''3"P^blVA/&%I9FYH:AQ@:KHBXDRL<@F[8?FGBJJPI6QP8FVMQ[OFKSIITULLSI'$]rmC(4C*0+&               -*&! ,7:*Enl`hVYYKPM92*5[{C *12)-E`n]) GPP3O^J&J:Vc]^SWJ)%6&EN;5ND?>FHRRC[W=;IZ1-2D>JAD6=S=6GYMCLJDFHKQUQSNPF33(3ejM) 2$MM5OCPU=@E$)BRHM;'PCPJDIXTLGJHHNR@(">DIJ*%A7@CI[QJHRHIYLBMTQHLD80:=0EQK@)aE8,**              ,-2D,$.-$81FTG Cy\^bVR/5_GG1.0+*77,4.$3-.;$ D'4*("(:A';922C(&$NBEH (L=) 5I-):45G!CU<#'3:,JF,sQ/;/1B.               (*AWD/0-WYJYMQiQhyPBW]5'LHTD;0$.MNEFZSCFT7- ,C4%A#.;):@O]LHVZRNZSHISXD5@-"3S^[OMXM]q5,"(2           "'5TA3.332DTfODSDMRLe`PO]N(AY8UK%$1 EE/+A$404''1 67=/5+)E$ O%(:0)%54?(,:N]Q]S%IYbi[E+D7WB=BJFFYI5PW?*IHD+-tQL*'@8FYYRKMIJGQUMUD1B5+GUP.17$,O/,))             %#:EDe_BAXG5W_gs_ZQaba^UM@MJPgM#E[(S``hH,FF/E6 7@4623,&O'2QN'/OG(-9CI(@TBCsN9]HMdV9&M=VGID?GEPH5OZ3%! i]7I'3EAPZPLNTIMSQMNQ?7D9G\lX8BbgO( %PO6%&,-         '*&*K`MKOMHUxbYr^\{mMMAD]YXeIDE -3VfwtEOP",EG7:@5-R5$93#.J2+Nl4;83(-:RO)0BLfTip6EZHGbZ?$R8MBK>;JJHH;JZ%*""/~zF?;9DIFU\IRVNFY^RJKA:>D?BSB(M\jlYL$7_93G@8,                  +. 5foTPYSKh~||l^osWTtgSH=baV^[D-E%1:=^V@IQ]]9)CE<2(20+B'31MR DL@)Oj>:,$!8OECS@ivRT.ARROdQ@'Q3PGLF?DQRG>G\*'9 $)4E+#1,4-'*FRPaLHMRRQMM?;F:4FL%1meliO^HLf"#VL1#                ,)*M{lQ?EEcsXi~moyVI_gSE7FnNIW]Y=.L`\sJ07Dz_+/nL;F*, 5++&@^7BD<0#OY7DC4!"CM8RRR1P@N96^_Q`FC*R2SMKMB=FQM@?R<,":3.40.("GIN`HMZRPRTO3+&F^;8gngrlSH'Ai%A4!(           7!+UnqQDACZOWWQ{qgfHViLERUN5DOdm=?FGXeBG\Izl"`;4V'-9 -&-P-,E>7853HL@LSK0;OH4L+1\,1GM:3U\R]OK U6VOFLG??ON@CGD- 3:$.-5(&!+GCKURSQIQQH9$'H?%Kxdanm^0/#()00!           "%3LamF#,PQ^u_KWp[daZvg=CbaE+1ScJ =5KV\_eXSu"Ty)%X.&>'*G2&OD4=63AND<@.(3+@CE:$J\XTI/<:5X_XLZ7XNCLGGOTEBSG5+, 6)'%5-%DMBSUQOEH`W?2,7U/8nrW]nbR:##$DC1<1&            '$(19[vof\ENhZ_qvhGIoedsO\`5NxS9R+'Y^6BLdOYv\EvxP7jB,F&&&/A-.+(I==C2-:BDG!BV!.407)0G]G#  @=";?$);>SdcU2OPIMWI:NRQPEHI\ #54$1" #:(4KOIDL]SIIHK?"$:fjSboY^od*)`Fe7+J&:+(?"             (&+/*;z]Dgklo]B"%PNLlzmNH=9mO8lG8;:`@)Mlfgh,3/WV_NG?78CFLM/L%IE$+DtT A[<,UaG:9&/AdeR?:TFKHHIKIPN?GJZ%?>74.0.2,(>ASEFJXMJIDA,$8aOGnvW]qhN:J[#+<257+;0I)              ("+U?CXDUbqnTS]Za51kiwHAXNZ8Rs;)F?"7NOJE>Hza8g^ZYbB;Y83!:K;&' .T92/2yc ( !!!axL'0]lVJ1'&HeX;DCMILG?NUJ9>PNO1;&)-74#1JAdxB1tlK('FRLDHLSTPAPXGB:AO#4*+-)&7!Zb<84->PUQLF<(!5Sb@5aWFu~i6(%0,&bm7 47*H+           "! (HTdfKU|}}`SbwukNARB`q@@exj$J}BBU`50,*%*K/-L@'CbkcE;9%<93U<5UC$67##Al-*3 4Zgb1$Lcie[;0?T@7KLPXSHQOEG>JN&&. ,*,;$9_H,,*DVQPPG8" CnR'Da\Y[>:C>H=$9+%-8")E+           &+%)2-R_Ujown\<=^SUrjUG5P_RKhG apS*$F\1/CHRTCT}n?,8N# &8'O>2I68K &" MV('3# /6T[00S|_[IBC2NNPDISIH>4M7;*$#.,+;;GJ'#.,CVSOOH1,[rF?|wkeF':0$(.#NI1"#7"'B%       $""-8YM9V[mwu}XP`V8HzoG5^{lS[UJ]wyB a~C Hp'-bH@mP#/5E.!B!8S3486/&/WD    1CSO\zqXUl\UGRHDGGEME7F7&='+-56,.9BG5*/15OUEED&*Oj^<`~fed_P`phePFTKUcK:[M0(D'         "* />SOVotXM:64*$$6UhW=5Qua?EdswZMUɉ4.M3N]'1=,E% /IYRB:EPYRb|k9L}upeHN[^K 8+F059-Z}%-C"F+5O46&@j?5,:Q%<448JE61;/,Peedf`\SX_mzeZ`zLjU512 +I*,80         4)*QB5TV(&64BTL@FV]G  ;R=1KhwqqoXYKMreIWH#6"@38.hHXO *2'HM(CM4?B7-&2b-@" 0'" 4AGOPMTZ,#.SLUXMDG;995, 5*$>A*0G5-81,$81alN43 3EWhBCKBQK[yoRWh^# :WimSWj^Tp]EXlkH ,'1: ,'5W#RM) ;^/$=9+(EW3 *' :( Q2 -KMIMNMB+0=0  IV 39&(69<<(6Q2OQHrqXai[YZQ=X~{rVH\^AE_F*_XH,%B#      ! (ANMX[:  /QnVL]TLKJos\`_fwT(ojafpuedoF/o[" /*#.5!3#'=5Y!/?J{f"srYe|kJDM>7?cwHUr_io:1rX7(L        $+!39IK:18Ti\IS`UaRXLCfpS@UP@Xyk/`wXiwlem^:M3!/(6,$ (+":/+3%,hv\rV@WX,En=Vc(4;518**XX!$ "!1=:qdRTXW^dfUA39Khp<>RDVU(.ZLG /X#            !&&(CJA0%! -IWeZNo^8eWGB#AgG2I<"*YW96IF[iciOFxp:  '2$/A";+%9"&[`ejhRIg9N<9S)-8)MB1%0&.^?  2,B/ 6R/A&,;XetH@;,%!)+78< 61 8EWic'CA( +<@ULANAJ--0gh\^II_]OECD, :]<'0INZ0*Q3          %!'785:E9$ .dd6I_eU66k\>_`FFI;CU;*?TV/6jrttmu;Lp/("!")$MA!5S08;_]ND^/bW[fT)1!5(><2(AQ<8+2^cagn3,MY?IQJN@I5')m]D[hfXE@MSSC,1C@)IN1b]F*$=5         +!187BA@8  ;KdlHEPL5NcRSR[hB%]bKjkN(3: ?hoguQLK #%%"6&8C&.5(=.*<(#M6L2!QU:"((-.%NG A3&LREKYKoc4AI0C;Micd\9G. !..+02AI@E4Dlp\Ub; !FXP>PKMSYuvycT@S; (Aڇa~~M58!$:.(2.5,wD*&'.+.;465:T'/879KDJjo2@)=F9aYM4Xo:<< 5&2:A9.F.=b_IO_O= /OE:CTG:<>JE)"XJLfA.ZbmaIadmpnhP'0eLC_E+>Q%         90)QVTD93 "NCCyT0DD>LKFJPE6DGHUP_`[sS$ 5n`el376.M .C=-DC#1/5DS/JR "+--=1LB&%SDAT)LP&wj=3^mH3F/(7+-1GJOG3KJG[QE[lHBseVnmol[_xXAsp2sE';D-        $  A(:`H6%'<%6(Hf3.A>*hhThJJTA;V\jdMC.!2$2%4GE_@(FLUNYREFK@INRCJPALLCN[B=PDUYTVYK?7CBNk~xxYw'=`3#5*            !'7BgfKG5 ;EG8TFILg>JrWI<@nK6RNGfdU<#".=%A@1U4-1GADAJ^6,D?4;PHN3sj:Zb5b]_yNWpBJ<-= *-(#''&A8AU^O''A5#8RF?BQXEQ`GLbML`^E*$;%/10"/9 'WI+5C(        #  &D9/- Zc:VsYSZqYBNS;*$$*&5IFKLUR?SaG?YXXC #QiQ#*% 40-)=<*C:     !"4:   *5QpFn{\gaq`GqYBMSZpQK5A}d_xhjQR42N#  ASB7#!!.4=D/.;6:n5MlCHQ5;3%551O9/PTZ'. +&&3&&B*FK9=C[[GO^x]64XjU7!3esls358=^2(H8        (>3)$$$' .6I,ClaiqceegYZW:9M_]_A+/\VC?JMcbd-4# 8KB*  "212J4;I+_;02,0:Kj]O)%5(%,5<#*8.29SPp`FRU7-ViwaKcO4Gy+RA %"$AJIDG&HMDEFIHLKMJVP)1+3Y`bkJ*>NXmrqy;HZ7)$"7G*      ! $--8KAGF;EG  ";L-&k\I?;NPXiRZB.^sa0?FBVT.8:T^E9XB, 2F> !# 1)/.&<,)4' SOCZOWO5FE(':* :0"''&%8LgoC4C+-2/FAG=^gUUWH\j[cbb\ESE6cf_  "# 1 /CHBE1NCDTFKVLCB@FP:+;RjY_H-GiiouiWE"$LUH&*JP6#5G2    !!+&4695;98QXLCC  07:Kb3EG2`[8rf[L=REC8EPDUQ;ROM\V:;3!#   :N4  (* '$%;4NO)=@81QvU_7@M).7DG7.4.1TlSDN6=>=5NG6L=LkXSNhjYS[TNZiLKLI],)&/ 738+0;C&0H>:CCIRIDMJKWA&;Y_NXN[oNYmOUB,=I;KLNO?.#NE     %);:DBC=AH41 9\XR>cB5OF8>+fk;7DJAXO@IGBTQXhSQkMBF! "GS5#,"';&3D>T<6NaGCFO`9FBN@?B&9;:>:'#N[KHW?#9Y[- +*'.YPgtG]`qq^YuvUTWOli'4V2G2;; @+0,64/8(64@DGD@BDMLKWG!$LOIN_|n|87WIC`f\l^;1'L?    ! &3-6GTN?NY+%_\JQfZBWzL2cU!=S[taCD91)6P1       2,/+'=>-=BH@57*4_7)9)E>8R@-P*FJ,LO--3>OI0=H6If?FH<:iL"  AH*( E,),+LE<9CMQjROY>?NZQ@HZ33pe9DZTI=>'AA=>;9ES7/SD1$%[>     !*2"05CC',80DD2:9>,   %395?<$EO$)6ED8U;5N?&T>#aT2TA(irJspX]b82  $MR( ( - +&,9--9NcaSVVY&BQU_@DNC ,*>Z.3(2PZK)$ .)'6%LGB;ITmU=cfKnmWUVXWGWaONCs\aaGD!+.B$ (/?MD?FLH=?GTRFKI+(L[DFCAaS)'([pZpb%APE Q>  "$'26983;.>K7GG.1+"  0.GCA21F151InUS+)>:73^4L=2LA(NMQj94TF8@% GR5 /#,,.2%/@OFCn[SVB%KRE_fVDJ8-PF]T>kbM-.ZA?((!$AGWpO4hs]YK=S\if[_E?bdKBQ[TQAhN&-+H/ 8SFEA@HE?AOOE@1$"'?'+-:NRE]v\M#[dP0*M-  $  &8=5AD@CP@1?7"'$ 179La8M_@JddA@`84>W<)89XD[\9XXVdSOsY.0866LN2<@;FP;C[FKJ>JIVYKPC-# JZ< %#!-),JF7JNFKA5CR=4R[TBUUWH1LL& <]=8./PL7,"E@ .4C?cYCNBGDELWOFXURSeX=?R2'`O /RlN+B=UmG !&!&>LKJ`XLBiiA=:L;MmobULRqTNKPTXJEf8DGB@IPIG'&ZzZcomJ)geWZOUB33B:04G ")#$#1..! (('      $EJV"SC+^0;rh);G>WY@PlD>F7=2:49>]SUS'C\K;`L>UF  G\L" !%.>,/JI.5PF/MX?.U^[MOkW<_nE1/;;-35?=^wiT>*10Zk/ !7< =-;9?BNHFLLDIB"'Rtcpod`O:),867=)4A$ G;4YO3201C59RSKVN:<=$LNZZ\N/0>DHpC7L5 3WP&,4610(HH/V:@YK:C9VUJVFE\R5<89;$ 5PB_o0  #%)N2>W5CT68)`NHd[8:\IDkpk_SWM8QmbCH5;/'G#  =>4GKHEFKK@D;,HiWcd__K5*?,4^@+-,$5=T7))"-)%%#(&7!    0A6/0K<9APIO5B621DS5<.3B51@>7?C:A8SR4]a6'0C8*Y<=J5 (L\; !#)1,032P?PG'-CLSH4;EPFFRS@ZcPPJ$N?m0  RP:JF>@B>AGK:!2^IQRSHDN66+<[# +C05O#(*!%#% ))&HWB92$$Q?$,GM/D&,.R6*F1!)3(-7,0D7^P(IL1;86>!C[A,) )G[O "%,5@@;??BUL5+>W^YBAD:WYGCKUU7!(71+!1+U4#,,;%WKBLCN,BYwa7G/3oJ >NDAG1)6("!!%!   #?)Wg%BJ G$ 9ZP)W7-)'N,'671>81<2#,ESJ40>2>@DW8>T#(@.  #XWCDRQVV`\IcqSDYC:GNUKJF2<%-/#2  $7KFTQBBLUL.8'$kbc^]YUhgaXczC9[*OH8IT-,: (+%!$'       ' <0:;7H M+;9)-,Q+>75Q@?13BO)&=R:.37FOM?J52.(>+*O%5?   *LZ2! '6$6KE91#6?LCK^6@4;UPNYHWdRIL?A-BE*K#% )"#!7K-=!DB=.K?3dlNQW_ULgK4^T?LSDWQSSIK@7$23.)  ,PNDUD6GKJJBC,,q_LZdMNX-Jl8E*G++=J-07 #     # %91AVA-*H<.K+1KR=UC7W[iS-67)6D#:L?]K>S]O?--(,?P81*  0JW7 &*#0(4T/.+@OI57W>BBBDHLQGMSSV><3 *5+S.T1+. " <"(E(*3-<NY.NQQM?S: K`>EXLLOD]^]O7=F:5HA3 652^IJG7E>CWV>*2SZV]Yc}`1.@U(<102C,+#&     !'*2FDCf%?D+`9XaCW99G66JAB=2<*CG%8+<97TH4FN=7EU1/W>+GA# )HK>" *(*+&%7"!)<./Q7)>LLFBJ64WZEGI94$D$V7T<,5 -M6)8%Z57SI^U>?QA;&*   3A&@MAI;LLNSR?&7GOUcb}C(6,3z6>C1=D2= $      %-205>Gd?US] 'lG8@=U*,R5$/%+AI@]H#37?)>E;+3C17LTOEaT:ZJ  IUR@('&3'2C.0]H*<7;>8:=DLQGC?<0+4$1M3F( #60=80)LO,>%3Z*=]4H*EU2?BMG0BFKD7614?'0!!5 'C(&O:NJOOPG=87R9/dq^G 8ijkV/}r4(08H:.3       - #(:4;B1b$I"&58@G\A1P.&2PUK%',&$$92: $C>;;724!47859G7D@?899% #%$_7G#$  " '- 4C$=+,/4*2aT*CI8FK[;(M<@V@I73L>BPA-6B6!-&@))  :9:K,FOLC>BA0(35.MK+.]xY[}-34 ,PA&"-      ## 101-&+)8OO745,.^nKMY3);G^;d[/=0!A7&(*=*$I?"""GWNUA2G+"!?STE!#+#,$8*,*-51K7%C7."H@+>M.=XS0Fb4Li81;FA6DG9.<=!%:Q/ (?;P4AERO?B<"."I= )U`81/N85>N?0R*2B/9@:QI.72+6HA*$R"";-220DF8.)2F$# $05LKE&!8/I>>&<;:SF1GB:G&FkCE* $$(88$:9+7+QQ2/:>/:MKTKL`L>K8GOPB3N60D:-%/8<) #:?6I6<>SPF4 (")S1'Hfp\Ylj}<M? #,+(!    $/K5'58:X 0$>7=>[7'C@0"?'9R/4D@@B&.<1I-3)M'"*'.*1*92()* &, (FHMC!1#!6)1=9B:,FN:=H@A9'!OE3C`bKCgBBv(GB-(    1: "/2B/J*2=HI8,,;"/"8IQ\3('HI=9I6,(I- L0.;7..4=<786;":9"-0# !3AURW,(/""!#.0)3I6/>51?B7:8]L3"OC&6*  (",RK[N-'(%-7&#D&(81-+.A2GN.8GF=#%)$!Z?J*  %2'J7#A9HH,66<6$! 57?RXflxcbl %Q)6S4-K7$'"        "!+JA,8F  /"$29!LU0KB5U*QN=YA)QG&+"=4ET22<'(OS)7.'2 $( GP[`.!"$7/*@%'*M<+G9%:L-:G80,"$_KM 4&7'E=!L/FbOf?-92%5<-N`->6O<M&7H67$,[?/85@B =;&/:9>6/1  /''1%5D=EZ[6/g?6Y,2ED*FA8A1.*0/$'',"   9A*'7!#=?>cQaI(YK92Bc0+fX58!579/)1:.*2((%*7/&C8'721:H8 *?=  G1,uq3W7+PK!&8&-/+"'-$#")*##  '+"(%)*% -E2(>IC+>&<@!,AJ&6^G;<K*4469-2I67#++"!   ,\LH %*D.:C;.5$1B70#1,;)E(BG1AI+ F>';24=EbV?=_i%;?/PXN!'"! # '!'!,  +&25FS&&69!:B%,7$+&/?.==,/_6 ,`A)&! "JNaj<'&/%%:M;GKB/CS'3:06/*$"! 7dQJ    L08>HED>765K>RUnIJIPCP $$)-<7,P,,.;G0-6,?3,L28\C?  /17%+B52. %R:*A+"D93:,0.A9$!# $' "@AQc=%-.",.):3.5C'64)'-8-!%5R8<  >3AA2+<-B;4809M(8S]TiIBSWUWL3YMXO4RB:NI",/$;7,%H-%-62+.c(4NF1 -OXT_TOK0 !>e@!*L5'B0       )&"&#,!*01;8C6+4/ &.(&   =/5A$"1A,397TH4@4AQ>"#!  .MPZO:2'& #&%+?+);&-3"-*(,M78",IKD,(78=:)42/61/31."&1:A@:**)  ,$#434#5W/1E55?6.*CL7^\B]K:J>DAA>@,8@4JB/"&;) -(@0&!+\,:0   0DP?# &BPGNiQ34)?5"%<-    %-(089@LEIF801;<783167=450/5<3DRPTMB?;@8-*" /0)XI>=*.C6$,14.3<# (DGQkT;5.1,3345E<+/2.95.5(*S>3%201%&CA:3/07B27A6;4>GDE?FU99E@I:BF&@NC<#3949#"*"$3L$&: 0S 0KX9 0N>)/@IF<2DV/9nG -%(    %!$-81;A:8B3-32/$-4..3*.3:@GDNQ=2978.8B;@;/! ).#DJ8>=.*. (.: ;"*0,#.AMQRU=" &$ )**( 1I@;:%-I4-',T=+!  4'21$(3,!666F)35:OK:EbT398';JHL*H[4CEQB,356"9%-*+,/$ 4B" UY+ "?PD0CF)3C)0Pnf@2g[(& ! #&&*,&* 00)-526E5(C7()+**2,+=<508GKBEE93;.-1/1.73/;E6!&&+8^C!-G.- 0:!'4 $"-%0-DJKTE$#"3$"#334=:/0=10),H/9! ).>/3<7*3.G]+AI2BO>CNIGoL:K2!,H/% #%!3:)23%"181579452)'+%)1=5/=6./351+1---;0*6JJ=<<<75*+,*+-62-7@A53C#$F\.";<#0*0--)!)$ ! %4')@22ISD.(&2 $,-%25(>@306: ! 4D3E)' "-$(@)1"7.'4:(6:=4868B57AD?<;=7<[A7(%+10.4>@637DC1$4+)1::#/A& #(%'=+"BJHI* '."*(!(05,&@1;>%!CFEK3DC<3>'9=3!I.==9A7NV7TYFOB@3>*/@#:4(%B97,24:>>J (DLaI%BF9)+=7FZ> $KCOYW==OEB?@;/().430'E2;C+ $H=QZ1!!F[6$8"+*4>G98L%PNEI!4D74KOFI6?;797BCP6I<$92(/.3:"+4@2==@`3"$ +7# .2.'+<97##C7!;8JR=<3YW $")&)%%&+&)/(--36?;6=DA0.)#)3+!)$#N`llmGD<*,:71/&+22/0155247((058109<;89A:7++63'%-&&1%%,)"4DOJ?$ '#'$$#,)/=(+ 2L=V]3/ 8"!AB>3+&G 6B/.FY"8D /N78>SPQ8?71HLA?7HL!  )**$,***)('"'"%#'880;7-6,07>=-"+=;3%+ ,$")!'#%CK<45&"%%!! &)!BA5?6?#( 2(*("&L ;;&1-C453B/1:+-BB=4EJH1LL1HWA37G.A0,+6)-&9'0B>9A[JD.++*$Hhzpj[6%!+>>CI<%)CAZn!6#%1-1*!'-/17/0*+*'.*+"+2%*$#&$%!"!$ '$#!",0*/+(7**295.*''" 6"20+' )3*%'CNDM=0$ $ =:&E!'&%41+  +":K1#A(; 2N006)7.4@;F=ON:JKO2:MA=,GE8+8;*/#1 '?'":54G>8E/'# ,DYw|cKA9#$1?SD 1BF+";6D3@LFNNS"!&&' $% !"&+*""$+2#   !'%#"*%% ,<-'8/(&  '%(,)++,<;@IDHTQ>1.-## # 6>F"?J$6&&>448 '#'",*:+6 A)6M@,I;:=BL@?JU*GF-X/AA(>%06+(5!/4:7%:+:CF=.##<3$ " -4%1J:A42U-C^!"* '%#+1*.###-,-39=/31'(# ("")" &#*+05*.7+  "%'.0.6834?7570/9<711<*#.8FPQPND>;;1.5-&.87FcnPKf_<:%41Pb2<1#$;4CR$/'*&& $ -2/*56CN:=5TN8DF2AY4K.(H;5,<7,%8+3)7A=4:00))#%6*61B@88FOYXaXPONOC;<@:0*.0**$#6aobVVleC# ! #  &Vb@=7'3=M$( !!=// +135.$9:?/AR2JU:FV6LS==4C8I<3F12+.*#+ /.3.9<#5*"**!#&%c]ajgg^WSI:2/&!, =/1D?5MB#"/&$-)" 1-(3,)-!"&(#.1   +%-11(    *,+86::9;<96:<5648@;=7<=35?<341/21:22:33EdxeJZulF70/#EFGHM#$$# 3$F'&+(*   %,0;79F=58A=:@74>50:<-/A9-1=305+3=7;>76.(0&.9@%>A?;7;9JELF82CJ9:F@AH5&>>1 #2*"75!;<:S8)10LH!/3'3KTN2/% < 5.OD-" ! )"!!%#(/+$!335/)6'    !#+5228?7:B?8-+2=58<2612;1:?;7457749682+8.FmO3GZZQN; 078M= 1>]? '))##"?,420+E<5Q:6G:7.:E@>N:`J)G>EDG74%.'*/&+%'& 3? 59-%0CeU86/24 "35)"'A7$.H;7G0       #**'  .66078239;51744:<83495:8.7A950./0.358893+5>=;8296**N`R,-<:;% ..7>GF0;DM*  14+%31)%3A).O5&<57:AF.7P;'R7EZ:AJGD/1.!("- ,*#/"'+'"KdwD3HMLC5(15?*Wb=V?':/8@  &'-03/.++ !!!!)+5:89:7503@:6317858508<722-(3;01156-465-.64185*488713::+#'FX(0'# 6G *626ADFB91"JX & &'731)2-<0,2316;=5/BF;26K?PF4,TZ8EL7<-%)0/ (*!9/.8==MODZ6)?Z[D@#$!2J*:) .6I=$DD7B:=GO=?<- A"-:'$*#"!$1><$14/C<.DD.3?/4I1KU:IVB?E=;:( !(+!,*!A3 &4@8GD?_ed`^Q7LL1 ' '>,NQ#"$.+()(+&5.--%$!%$ #%&# ''&#%!&*(+.6-<8,45--2..7.1215536<85::3450./)*44/3:6./767<35@<8;64::;:68:??1/3,5C82/8"%/9O5:O8@IH4=J8.2. #)('#"(=,3,1*3%/1A=13J<=9@==@A64XM>JB;N@0?5!1)'4'*6)5>;FcvrmUAE>@QB")$+:C.PH  $#(!,')&&+-')*-538457:1%/1'-352664229=6164+.15*(;5-:G?5924?67><;<<2.65763?:4?832457A% "370/"#D13BRHLG7.5;40>6  %(;?'(*' #,;'.?-.AA#9?6DJ88D9JO@EK2.D6 !)"! !,995B1,24<@>5BI?Pb\W$0),<4K>!  #%* ".#/,-3528:/42&/3.0.1487@B8..04424-*:,)@1*9:30:@4564:64>@,2:,9;070.2/D>088;%C@"):/U5 9F[L/IC1:608;6-B4*" 0" %"*/'.+..().616,896KO51P[=HU9+9))- "= "(% 8://9##10<<:FJPNCBL_5 +=(=>Z9#!!"#(2&/1264+51.--66..3,),33664932@7-6/'+*+1(,74643;5.8927>8344439:67;2(5>1)$"(%>UN8YjE:ZWOI?SO:BG.:ID6?6$?D?A>3/0 ;) %/'+- "3-2<+6B:092,CKM@>P=EV7)! &!!*5##'$,+23)-2;;>QDDRUPNP/ +.5f;%!*    '"3.(:64:30,210:1.-13++1,06487.6;1-20$-.)1/2;0.<4;706/7D;16561.779?.)1&!%!-'0$*"$#+:7//4D\O?F>+@LJTVH@-"&,@#((2#9 $- 55%*-;=91.71?Q70M<1>A@KF&++% ',*+/;E:53*(3616?PUSV@ .1\1!+("#     #'.*!5628@9/47.1,53/3*005824230.66.16.4739.*8.0A3512<9:8,1C:9>8;4("   +($2-*>YMKbWGKI>>LNDO3# ,7A3!'4!-")/1 ://$-:.'-%'1JK-E.573+*&!*/*1605TKFS?7EB>.&6- BA*#/2! "&$()8<.F=7;;9B?7;AHA86;;1/)4,,456) %+ -*,1+--*+(*)+01+178960254281#12$0>-,674+7>392((*0+ '$*%0.;>:=;5>2 # -'"*.%!6HGA>#(N   &+!' $('&$3*%00@?:?;FB;7)+,--/$*/ %'%42 $995>2-?>BACP>(0:#%=3,F3&1)"%!20-7,-*()00&)2.4<=<6?>5641++1%   ,0*++"#4825;24750+:7,176:5-/,-)'$  %42-/*#!( -(2."24062/8(+*& %(("0/&#'& 7Q0& '0*!BG#+/$7-2<<7C9:JE>L+:42$;,, $" )/$%"*?OMG/"'($:6 #+!# &*('$##$*%2#%+4% $ &.*#!&-,(+0/(/8-%.4),-#))  0650265)-,,4)-0(,?;++3B>5+9'-5194'-/372#<8'3 @9 ,$.*+#!#-S;*M33&,.,G79E31:&9/#!$%')1,!%) ->'!!&+1:#  #()*#%"& $&-+"25+*20(6* (%  "+,<,02'(&")$*$#  &)..4==@H92E6(417@:3).- %3'3=4917;8/;.7H/1:+8?1. ,H-2*0$ "$ /= )867.&/(& #C4$535&,9-$  ##'%2<34/*)(  -'#(52?5 $"$$!'(()/5/;?>;9=DG2-9>79:7:501-.=+ +$+,      &&$+'.1$-50<8+32%)20-+@7/75<44)(,:67=/<0(8I;;G/,.'12%B:4::/84"%'+%7 "?()%% "/A996494@.")87"8:00$%-* *%+37HE6:61% 3 #!7+-!(:E*      .5 %79; #(%7/5C01+& )$ '$&)$!,31*"")&:69:-+##.9,02952<)14$$096A;,'/4=(5;8> ,9!4#))$ "('%@5B=)::09<375: )=%))'- ++)-($>=5C?:.0;949 R+,*G3        $"$).43(;@94*(!$)(,+"%&$'(!")0, &*(1:7DG8+20,OE-:;000/ 10" +%+7$&430GHB1-.ID)A/8A!           $)2&$4 %,&)()#(.*-**/35;84468BC=B@90272*7A,0831#$)&/(,3)#/--?;18@13=8>38>1,2*$&90*,&-6,1+-+5" . %( !"3#%1)-#II)RH,;I3,6-0.& "! *4"$7''7;5%(+D^E# =-:G0                (* ,1/44656:::=?HA<@5091*23+2B:0=82A:,-1-4347$)-/3"2<4>C<=9:=3;9*.$/92-%*4*,1,0,"//,<#! *<1 +8*<9)>806C6%/',$  * '$%.' $-.0& $'(5H7               +"%),-&(0-$,-01$AM'                    !#&' *3)./)*,2*202+'/32.BF79#&*)))$*6-3/*2<<1:6+=B7;6=&'4&/1/0)"$*6 935<*%"  &.&18# &%''*-;P9                    &+*$'**(680=60/45;5''($" #17 "2%**9#*.7)"    ,(501)$ )60#(56>3                          !!%&0(',&$+4CD?PHFI+:<6F5!'-:=21620*6@)(42+#*.#'%"& 1! "  #$ $'2700%7-31'$,  !                         (-15.723<*5<;9CABD?C5:60+/-%D'%,/#$ #,!& #   $'-(8&  ,($&!&./!                             ,%%2521@CRBCR>$ 728K(/.(' . # # ,4 7( # ,2'(-0                                +2&" ,6*-:3$   %$$/:.(* 738MD%)4                                      4- +4>$,#$+ 1M:,,4*                                 (!$.'!'/ # *'&                              $ % !*"&.$                      &         '+-*'.&"&,#!%!3)(                           $$     ! !*,%"%*(,"((''"(                                              ## """!%##%%% 1!$''(. *)#1,                             #% &""#!7/+2,,*"                                 $*& &#7 *(                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          mayavi-4.5.0/mayavi/tests/data/humanoid_tri.stla0000644000076500000240000004621112747716314022342 0ustar prabhustaff00000000000000solid MYSOLID created by IVCON, original data in file.obj facet normal 1.000000 0.000000 0.000000 outer loop vertex 3.250000 -2.480000 14.000000 vertex 3.250000 -2.480000 9.010000 vertex 3.250000 2.480000 9.010000 endloop endfacet facet normal 1.000000 0.000000 0.000000 outer loop vertex 3.250000 -2.480000 14.000000 vertex 3.250000 2.480000 9.010000 vertex 3.250000 2.480000 14.000000 endloop endfacet facet normal 0.000000 -1.000000 0.000000 outer loop vertex 0.773000 -2.480000 14.000000 vertex 0.773000 -2.480000 9.010000 vertex 3.250000 -2.480000 9.010000 endloop endfacet facet normal 0.000000 -1.000000 0.000000 outer loop vertex 0.773000 -2.480000 14.000000 vertex 3.250000 -2.480000 9.010000 vertex 3.250000 -2.480000 14.000000 endloop endfacet facet normal -1.000000 0.000000 0.000000 outer loop vertex 0.773000 2.480000 14.000000 vertex 0.773000 2.480000 9.010000 vertex 0.773000 -2.480000 9.010000 endloop endfacet facet normal -1.000000 0.000000 0.000000 outer loop vertex 0.773000 2.480000 14.000000 vertex 0.773000 -2.480000 9.010000 vertex 0.773000 -2.480000 14.000000 endloop endfacet facet normal 0.000000 1.000000 0.000000 outer loop vertex 3.250000 2.480000 14.000000 vertex 3.250000 2.480000 9.010000 vertex 0.773000 2.480000 9.010000 endloop endfacet facet normal 0.000000 1.000000 0.000000 outer loop vertex 3.250000 2.480000 14.000000 vertex 0.773000 2.480000 9.010000 vertex 0.773000 2.480000 14.000000 endloop endfacet facet normal 0.000000 0.000000 1.000000 outer loop vertex 0.773000 2.480000 14.000000 vertex 0.773000 -2.480000 14.000000 vertex 3.250000 -2.480000 14.000000 endloop endfacet facet normal 0.000000 0.000000 1.000000 outer loop vertex 0.773000 2.480000 14.000000 vertex 3.250000 -2.480000 14.000000 vertex 3.250000 2.480000 14.000000 endloop endfacet facet normal 0.000000 0.000000 -1.000000 outer loop vertex 3.250000 -2.480000 9.010000 vertex 0.773000 -2.480000 9.010000 vertex 0.773000 2.480000 9.010000 endloop endfacet facet normal 0.000000 0.000000 -1.000000 outer loop vertex 3.250000 -2.480000 9.010000 vertex 0.773000 2.480000 9.010000 vertex 3.250000 2.480000 9.010000 endloop endfacet facet normal 1.000000 0.000000 0.000000 outer loop vertex 3.470000 -1.290000 17.400000 vertex 3.470000 -1.290000 15.000000 vertex 3.470000 1.190000 15.000000 endloop endfacet facet normal 1.000000 0.000000 0.000000 outer loop vertex 3.470000 -1.290000 17.400000 vertex 3.470000 1.190000 15.000000 vertex 3.470000 1.190000 17.400000 endloop endfacet facet normal 0.000000 -1.000000 0.000000 outer loop vertex 0.601000 -1.290000 17.400000 vertex 0.601000 -1.290000 15.000000 vertex 3.470000 -1.290000 15.000000 endloop endfacet facet normal 0.000000 -1.000000 0.000000 outer loop vertex 0.601000 -1.290000 17.400000 vertex 3.470000 -1.290000 15.000000 vertex 3.470000 -1.290000 17.400000 endloop endfacet facet normal -1.000000 0.000000 0.000000 outer loop vertex 0.601000 1.190000 17.400000 vertex 0.601000 1.190000 15.000000 vertex 0.601000 -1.290000 15.000000 endloop endfacet facet normal -1.000000 0.000000 0.000000 outer loop vertex 0.601000 1.190000 17.400000 vertex 0.601000 -1.290000 15.000000 vertex 0.601000 -1.290000 17.400000 endloop endfacet facet normal 0.000000 1.000000 0.000000 outer loop vertex 3.470000 1.190000 17.400000 vertex 3.470000 1.190000 15.000000 vertex 0.601000 1.190000 15.000000 endloop endfacet facet normal 0.000000 1.000000 0.000000 outer loop vertex 3.470000 1.190000 17.400000 vertex 0.601000 1.190000 15.000000 vertex 0.601000 1.190000 17.400000 endloop endfacet facet normal 0.000000 0.000000 1.000000 outer loop vertex 0.601000 1.190000 17.400000 vertex 0.601000 -1.290000 17.400000 vertex 3.470000 -1.290000 17.400000 endloop endfacet facet normal 0.000000 0.000000 1.000000 outer loop vertex 0.601000 1.190000 17.400000 vertex 3.470000 -1.290000 17.400000 vertex 3.470000 1.190000 17.400000 endloop endfacet facet normal 0.000000 0.000000 -1.000000 outer loop vertex 3.470000 -1.290000 15.000000 vertex 0.601000 -1.290000 15.000000 vertex 0.601000 1.190000 15.000000 endloop endfacet facet normal 0.000000 0.000000 -1.000000 outer loop vertex 3.470000 -1.290000 15.000000 vertex 0.601000 1.190000 15.000000 vertex 3.470000 1.190000 15.000000 endloop endfacet facet normal 1.000000 0.000000 0.000000 outer loop vertex 3.150000 -2.470000 8.010000 vertex 3.150000 -2.470000 3.050000 vertex 3.150000 -0.486000 3.050000 endloop endfacet facet normal 1.000000 0.000000 0.000000 outer loop vertex 3.150000 -2.470000 8.010000 vertex 3.150000 -0.486000 3.050000 vertex 3.150000 -0.486000 8.010000 endloop endfacet facet normal 0.000000 -1.000000 0.000000 outer loop vertex 0.892000 -2.470000 8.010000 vertex 0.892000 -2.470000 3.050000 vertex 3.150000 -2.470000 3.050000 endloop endfacet facet normal 0.000000 -1.000000 0.000000 outer loop vertex 0.892000 -2.470000 8.010000 vertex 3.150000 -2.470000 3.050000 vertex 3.150000 -2.470000 8.010000 endloop endfacet facet normal -1.000000 0.000000 0.000000 outer loop vertex 0.892000 -0.486000 8.010000 vertex 0.892000 -0.486000 3.050000 vertex 0.892000 -2.470000 3.050000 endloop endfacet facet normal -1.000000 0.000000 0.000000 outer loop vertex 0.892000 -0.486000 8.010000 vertex 0.892000 -2.470000 3.050000 vertex 0.892000 -2.470000 8.010000 endloop endfacet facet normal 0.000000 1.000000 0.000000 outer loop vertex 3.150000 -0.486000 8.010000 vertex 3.150000 -0.486000 3.050000 vertex 0.892000 -0.486000 3.050000 endloop endfacet facet normal 0.000000 1.000000 0.000000 outer loop vertex 3.150000 -0.486000 8.010000 vertex 0.892000 -0.486000 3.050000 vertex 0.892000 -0.486000 8.010000 endloop endfacet facet normal 0.000000 0.000000 1.000000 outer loop vertex 0.892000 -0.486000 8.010000 vertex 0.892000 -2.470000 8.010000 vertex 3.150000 -2.470000 8.010000 endloop endfacet facet normal 0.000000 0.000000 1.000000 outer loop vertex 0.892000 -0.486000 8.010000 vertex 3.150000 -2.470000 8.010000 vertex 3.150000 -0.486000 8.010000 endloop endfacet facet normal 0.000000 0.000000 -1.000000 outer loop vertex 3.150000 -2.470000 3.050000 vertex 0.892000 -2.470000 3.050000 vertex 0.892000 -0.486000 3.050000 endloop endfacet facet normal 0.000000 0.000000 -1.000000 outer loop vertex 3.150000 -2.470000 3.050000 vertex 0.892000 -0.486000 3.050000 vertex 3.150000 -0.486000 3.050000 endloop endfacet facet normal 1.000000 0.000000 0.000000 outer loop vertex 3.230000 -3.960000 14.000000 vertex 3.230000 -3.960000 9.010000 vertex 3.230000 -2.480000 9.010000 endloop endfacet facet normal 1.000000 0.000000 0.000000 outer loop vertex 3.230000 -3.960000 14.000000 vertex 3.230000 -2.480000 9.010000 vertex 3.230000 -2.480000 14.000000 endloop endfacet facet normal 0.000000 -1.000000 0.000000 outer loop vertex 0.747000 -3.960000 14.000000 vertex 0.747000 -3.960000 9.010000 vertex 3.230000 -3.960000 9.010000 endloop endfacet facet normal 0.000000 -1.000000 0.000000 outer loop vertex 0.747000 -3.960000 14.000000 vertex 3.230000 -3.960000 9.010000 vertex 3.230000 -3.960000 14.000000 endloop endfacet facet normal -1.000000 0.000000 0.000000 outer loop vertex 0.747000 -2.480000 14.000000 vertex 0.747000 -2.480000 9.010000 vertex 0.747000 -3.960000 9.010000 endloop endfacet facet normal -1.000000 0.000000 0.000000 outer loop vertex 0.747000 -2.480000 14.000000 vertex 0.747000 -3.960000 9.010000 vertex 0.747000 -3.960000 14.000000 endloop endfacet facet normal 0.000000 1.000000 0.000000 outer loop vertex 3.230000 -2.480000 14.000000 vertex 3.230000 -2.480000 9.010000 vertex 0.747000 -2.480000 9.010000 endloop endfacet facet normal 0.000000 1.000000 0.000000 outer loop vertex 3.230000 -2.480000 14.000000 vertex 0.747000 -2.480000 9.010000 vertex 0.747000 -2.480000 14.000000 endloop endfacet facet normal 0.000000 0.000000 1.000000 outer loop vertex 0.747000 -2.480000 14.000000 vertex 0.747000 -3.960000 14.000000 vertex 3.230000 -3.960000 14.000000 endloop endfacet facet normal 0.000000 0.000000 1.000000 outer loop vertex 0.747000 -2.480000 14.000000 vertex 3.230000 -3.960000 14.000000 vertex 3.230000 -2.480000 14.000000 endloop endfacet facet normal 0.000000 0.000000 -1.000000 outer loop vertex 3.230000 -3.960000 9.010000 vertex 0.747000 -3.960000 9.010000 vertex 0.747000 -2.480000 9.010000 endloop endfacet facet normal 0.000000 0.000000 -1.000000 outer loop vertex 3.230000 -3.960000 9.010000 vertex 0.747000 -2.480000 9.010000 vertex 3.230000 -2.480000 9.010000 endloop endfacet facet normal 1.000000 0.000000 0.000000 outer loop vertex 3.270000 2.460000 14.000000 vertex 3.270000 2.460000 9.010000 vertex 3.270000 3.950000 9.010000 endloop endfacet facet normal 1.000000 0.000000 0.000000 outer loop vertex 3.270000 2.460000 14.000000 vertex 3.270000 3.950000 9.010000 vertex 3.270000 3.950000 14.000000 endloop endfacet facet normal 0.000000 -1.000000 0.000000 outer loop vertex 0.795000 2.460000 14.000000 vertex 0.795000 2.460000 9.010000 vertex 3.270000 2.460000 9.010000 endloop endfacet facet normal 0.000000 -1.000000 0.000000 outer loop vertex 0.795000 2.460000 14.000000 vertex 3.270000 2.460000 9.010000 vertex 3.270000 2.460000 14.000000 endloop endfacet facet normal -1.000000 0.000000 0.000000 outer loop vertex 0.795000 3.950000 14.000000 vertex 0.795000 3.950000 9.010000 vertex 0.795000 2.460000 9.010000 endloop endfacet facet normal -1.000000 0.000000 0.000000 outer loop vertex 0.795000 3.950000 14.000000 vertex 0.795000 2.460000 9.010000 vertex 0.795000 2.460000 14.000000 endloop endfacet facet normal 0.000000 1.000000 0.000000 outer loop vertex 3.270000 3.950000 14.000000 vertex 3.270000 3.950000 9.010000 vertex 0.795000 3.950000 9.010000 endloop endfacet facet normal 0.000000 1.000000 0.000000 outer loop vertex 3.270000 3.950000 14.000000 vertex 0.795000 3.950000 9.010000 vertex 0.795000 3.950000 14.000000 endloop endfacet facet normal 0.000000 0.000000 1.000000 outer loop vertex 0.795000 3.950000 14.000000 vertex 0.795000 2.460000 14.000000 vertex 3.270000 2.460000 14.000000 endloop endfacet facet normal 0.000000 0.000000 1.000000 outer loop vertex 0.795000 3.950000 14.000000 vertex 3.270000 2.460000 14.000000 vertex 3.270000 3.950000 14.000000 endloop endfacet facet normal 0.000000 0.000000 -1.000000 outer loop vertex 3.270000 2.460000 9.010000 vertex 0.795000 2.460000 9.010000 vertex 0.795000 3.950000 9.010000 endloop endfacet facet normal 0.000000 0.000000 -1.000000 outer loop vertex 3.270000 2.460000 9.010000 vertex 0.795000 3.950000 9.010000 vertex 3.270000 3.950000 9.010000 endloop endfacet facet normal 1.000000 0.000000 0.000000 outer loop vertex 2.490000 -0.498000 15.000000 vertex 2.490000 -0.498000 14.000000 vertex 2.490000 0.493000 14.000000 endloop endfacet facet normal 1.000000 0.000000 0.000000 outer loop vertex 2.490000 -0.498000 15.000000 vertex 2.490000 0.493000 14.000000 vertex 2.490000 0.493000 15.000000 endloop endfacet facet normal 0.000000 -1.000000 0.000000 outer loop vertex 1.500000 -0.498000 15.000000 vertex 1.500000 -0.498000 14.000000 vertex 2.490000 -0.498000 14.000000 endloop endfacet facet normal 0.000000 -1.000000 0.000000 outer loop vertex 1.500000 -0.498000 15.000000 vertex 2.490000 -0.498000 14.000000 vertex 2.490000 -0.498000 15.000000 endloop endfacet facet normal -1.000000 0.000000 0.000000 outer loop vertex 1.500000 0.493000 15.000000 vertex 1.500000 0.493000 14.000000 vertex 1.500000 -0.498000 14.000000 endloop endfacet facet normal -1.000000 0.000000 0.000000 outer loop vertex 1.500000 0.493000 15.000000 vertex 1.500000 -0.498000 14.000000 vertex 1.500000 -0.498000 15.000000 endloop endfacet facet normal 0.000000 1.000000 0.000000 outer loop vertex 2.490000 0.493000 15.000000 vertex 2.490000 0.493000 14.000000 vertex 1.500000 0.493000 14.000000 endloop endfacet facet normal 0.000000 1.000000 0.000000 outer loop vertex 2.490000 0.493000 15.000000 vertex 1.500000 0.493000 14.000000 vertex 1.500000 0.493000 15.000000 endloop endfacet facet normal 0.000000 0.000000 1.000000 outer loop vertex 1.500000 0.493000 15.000000 vertex 1.500000 -0.498000 15.000000 vertex 2.490000 -0.498000 15.000000 endloop endfacet facet normal 0.000000 0.000000 1.000000 outer loop vertex 1.500000 0.493000 15.000000 vertex 2.490000 -0.498000 15.000000 vertex 2.490000 0.493000 15.000000 endloop endfacet facet normal 0.000000 0.000000 -1.000000 outer loop vertex 2.490000 -0.498000 14.000000 vertex 1.500000 -0.498000 14.000000 vertex 1.500000 0.493000 14.000000 endloop endfacet facet normal 0.000000 0.000000 -1.000000 outer loop vertex 2.490000 -0.498000 14.000000 vertex 1.500000 0.493000 14.000000 vertex 2.490000 0.493000 14.000000 endloop endfacet facet normal 1.000000 0.000000 0.000000 outer loop vertex 3.250000 -2.500000 9.010000 vertex 3.250000 -2.500000 8.010000 vertex 3.250000 2.450000 8.010000 endloop endfacet facet normal 1.000000 0.000000 0.000000 outer loop vertex 3.250000 -2.500000 9.010000 vertex 3.250000 2.450000 8.010000 vertex 3.250000 2.450000 9.010000 endloop endfacet facet normal 0.000000 -1.000000 0.000000 outer loop vertex 0.771000 -2.500000 9.010000 vertex 0.771000 -2.500000 8.010000 vertex 3.250000 -2.500000 8.010000 endloop endfacet facet normal 0.000000 -1.000000 0.000000 outer loop vertex 0.771000 -2.500000 9.010000 vertex 3.250000 -2.500000 8.010000 vertex 3.250000 -2.500000 9.010000 endloop endfacet facet normal -1.000000 0.000000 0.000000 outer loop vertex 0.771000 2.450000 9.010000 vertex 0.771000 2.450000 8.010000 vertex 0.771000 -2.500000 8.010000 endloop endfacet facet normal -1.000000 0.000000 0.000000 outer loop vertex 0.771000 2.450000 9.010000 vertex 0.771000 -2.500000 8.010000 vertex 0.771000 -2.500000 9.010000 endloop endfacet facet normal 0.000000 1.000000 0.000000 outer loop vertex 3.250000 2.450000 9.010000 vertex 3.250000 2.450000 8.010000 vertex 0.771000 2.450000 8.010000 endloop endfacet facet normal 0.000000 1.000000 0.000000 outer loop vertex 3.250000 2.450000 9.010000 vertex 0.771000 2.450000 8.010000 vertex 0.771000 2.450000 9.010000 endloop endfacet facet normal 0.000000 0.000000 1.000000 outer loop vertex 0.771000 2.450000 9.010000 vertex 0.771000 -2.500000 9.010000 vertex 3.250000 -2.500000 9.010000 endloop endfacet facet normal 0.000000 0.000000 1.000000 outer loop vertex 0.771000 2.450000 9.010000 vertex 3.250000 -2.500000 9.010000 vertex 3.250000 2.450000 9.010000 endloop endfacet facet normal 0.000000 0.000000 -1.000000 outer loop vertex 3.250000 -2.500000 8.010000 vertex 0.771000 -2.500000 8.010000 vertex 0.771000 2.450000 8.010000 endloop endfacet facet normal 0.000000 0.000000 -1.000000 outer loop vertex 3.250000 -2.500000 8.010000 vertex 0.771000 2.450000 8.010000 vertex 3.250000 2.450000 8.010000 endloop endfacet facet normal 1.000000 0.000000 0.000000 outer loop vertex 3.270000 0.465000 8.010000 vertex 3.270000 0.465000 3.050000 vertex 3.270000 2.450000 3.050000 endloop endfacet facet normal 1.000000 0.000000 0.000000 outer loop vertex 3.270000 0.465000 8.010000 vertex 3.270000 2.450000 3.050000 vertex 3.270000 2.450000 8.010000 endloop endfacet facet normal 0.000000 -1.000000 0.000000 outer loop vertex 0.795000 0.465000 8.010000 vertex 0.795000 0.465000 3.050000 vertex 3.270000 0.465000 3.050000 endloop endfacet facet normal 0.000000 -1.000000 0.000000 outer loop vertex 0.795000 0.465000 8.010000 vertex 3.270000 0.465000 3.050000 vertex 3.270000 0.465000 8.010000 endloop endfacet facet normal -1.000000 0.000000 0.000000 outer loop vertex 0.795000 2.450000 8.010000 vertex 0.795000 2.450000 3.050000 vertex 0.795000 0.465000 3.050000 endloop endfacet facet normal -1.000000 0.000000 0.000000 outer loop vertex 0.795000 2.450000 8.010000 vertex 0.795000 0.465000 3.050000 vertex 0.795000 0.465000 8.010000 endloop endfacet facet normal 0.000000 1.000000 0.000000 outer loop vertex 3.270000 2.450000 8.010000 vertex 3.270000 2.450000 3.050000 vertex 0.795000 2.450000 3.050000 endloop endfacet facet normal 0.000000 1.000000 0.000000 outer loop vertex 3.270000 2.450000 8.010000 vertex 0.795000 2.450000 3.050000 vertex 0.795000 2.450000 8.010000 endloop endfacet facet normal 0.000000 0.000000 1.000000 outer loop vertex 0.795000 2.450000 8.010000 vertex 0.795000 0.465000 8.010000 vertex 3.270000 0.465000 8.010000 endloop endfacet facet normal 0.000000 0.000000 1.000000 outer loop vertex 0.795000 2.450000 8.010000 vertex 3.270000 0.465000 8.010000 vertex 3.270000 2.450000 8.010000 endloop endfacet facet normal 0.000000 0.000000 -1.000000 outer loop vertex 3.270000 0.465000 3.050000 vertex 0.795000 0.465000 3.050000 vertex 0.795000 2.450000 3.050000 endloop endfacet facet normal 0.000000 0.000000 -1.000000 outer loop vertex 3.270000 0.465000 3.050000 vertex 0.795000 2.450000 3.050000 vertex 3.270000 2.450000 3.050000 endloop endfacet endsolid MYSOLID mayavi-4.5.0/mayavi/tests/data/nut.slc0000644000076500000240000015235012747716314020306 0ustar prabhustaff0000000000000011111 68 41 59 8 1.000000 1.000000 1.000000 2 5 0 1 100 87 X*AAT`````````````````````TTA**6jjj666jjj66YY̔Y(k֥k(((k֥k((((k֥kk((kk֥k(((kk֥k((((k֥kk((kk֥k(((k֥kk((k֥kk(((kɳ֥k((kkޟubbQCC>;@@I]]z֥k(((kkޟubbQCC>;@@I]]z֥k((((kxDD+ .KK~֥kk(kkd.2d֥kkkd.2d֥kDOO  KK֥DDKF֋**\\ZZ***\\ZZ*oo{++--vo GL GL #03##"ppgg"""ppgg"""VVKK"""AA  ;;"""99  55"""99  55"""88  88""">>  @@""">>  @@"""QQQQ"""rrjj"""rrjj""%3.}}%% OF߁ mm..++smmm..++sm**eeZZ*NKԉNKԉCRR  OOԤCCjjm3-dԤjjjm3-dԤj''jۋQQ. +DDxԤjj''jjƄeeK@@;=CCO``vԤj''''jŰԤj'''jŰԤj''jԤjj''jjԤj'''jjԤj''''jԤjj''jjԤj'''jjԤj''''jԤjj''jԤj''WW˓WWW˓W5hhh55*AAR_____________________RRA***AAR_____________________RRA***AAT`````````````````````TTA**6jjj666jjj66YY̔Y(k֥k(((k֥k((((k֥kk((kk֥k(((kk֥k((((k֥kk((kk֥k(((k֥kk((k֥kk(((kɳ֥k((kkޟubbQCC>;@@I]]z֥k(((kkޟubbQCC>;@@I]]z֥k((((kxDD+ .KK~֥kk(kkd.2d֥kkkd.2d֥kDOO  KK֥DDKF֋**\\ZZ***\\ZZ*oo{++--vo GL GL #03##"ppgg"""ppgg"""VVKK"""AA  ;;"""99  55"""99  55"""88  88""">>  @@""">>  @@"""QQQQ"""rrjj"""rrjj""%3.}}%% OF߁ mm..++smmm..++sm**eeZZ*NKԉNKԉCRR  OOԤCCjjm3-dԤjjjm3-dԤj''jۋQQ. +DDxԤjj''jjƄeeK@@;=CCO``vԤj''''jŰԤj'''jŰԤj''jԤjj''jjԤj'''jjԤj''''jԤjj''jjԤj'''jjԤj''''jԤjj''jԤj''WW˓WWW˓W5hhh55*AAR_____________________RRA***AAR_____________________RRA***AAT`````````````````````TTA**6jjj666jjj66YY̔Y(k֥k(((k֥k((((k֥kk((kk֥k(((kk֥k((((k֥kk((kk֥k(((k֥kk((k֥kk(((kɳ֥k((kkޟubbQCC>;@@I]]z֥k(((kkޟubbQCC>;@@I]]z֥k((((kxDD+ .KK~֥kk(kkd.2d֥kkkd.2d֥kDOO  KK֥DDKF֋**\\ZZ***\\ZZ*oo{++--vo GL GL #03##"ppgg"""ppgg"""VVKK"""AA  ;;"""99  55"""99  55"""88  88""">>  @@""">>  @@"""QQQQ"""rrjj"""rrjj""%3.}}%% OF߁ mm..++smmm..++sm**eeZZ*NKԉNKԉCRR  OOԤCCjjm3-dԤjjjm3-dԤj''jۋQQ. +DDxԤjj''jjƄeeK@@;=CCO``vԤj''''jŰԤj'''jŰԤj''jԤjj''jjԤj'''jjԤj''''jԤjj''jjԤj'''jjԤj''''jԤjj''jԤj''WW˓WWW˓W5hhh55*AAR_____________________RRA***AAR_____________________RRA**45 Xy45 Xy45 Xy45 Xy187 XG3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4G296 X/!'#/2>F>2/ 7DMD7 / 7DMD7 / 7DMD7 / 7DMD7 / 7DMD7 / 7DMD7 / 7DMD7 / 7DMD7 / 7DMD7 / 7DMD7 / 7DMD7 / 7DMD7 / 7DMD7 / 7DMD7 / 7DMD7 / 7DMD7 / 7DMD7 /2>F>2/!'#1383 X   6S[WG*)%I{~L+ ) /SS/ ) /SS/ ) /SS/ ) /SS/ ) /SS/ ) /SS/ ) /SS/ ) /SS/ ) /SS/ ) /SS/ ) /SS/ ) /SS/ ) /SS/ ) /SS/ ) /SS/ ) /SS/ ) /SS/ )%I{~L+ +3S[WG*,   r424 X~ #UrzvfG" & 1xۆӶ?%GʏG%GʏG%GʏG%GʏG%GʏG%GʏG%GʏG%GʏG%GʏG%GʏG%GʏG%GʏG%GʏG%GʏG%GʏG%GʏG%GʏG& 1xۆӶ?( RrzvfG" ) r416 X}&%[x{kM( $ :H#TלT#TלT#TלT#TלT#TלT#TלT#TלT#TלT#TלT#TלT#TלT#TלT#TלT#TלT#TלT#TלT#TלT$ :H& Xw{kM( '{416 X|$%[x{kM( " :H!TלT!TלT!TלT!TלT!TלT!TלT!TלT!TלT!TלT!TלT!TלT!TלT!TלT!TלT!TלT!TלT!TלT" :H$ Xw{kM( %z416 X{"%[x{kM(  :HTלTTלTTלTTלTTלTTלTTלTTלTTלTTלTTלTTלTTלTTלTTלTTלTTלT :H" Xw{kM( #y544 Xz %[x }zxy} {kM(  : HT לTT לTT לTTלTTלTTלTTלTTלTT לTT לTT לTT לTT לTTלTTלTTלTTלT :H Xw }{z{ {kM( !   x643 Xy  %[x{o^K;12:I]q {kM(  :ѾHTñלTTIJלTT לTT לTTלTTלTTלTT לTTʺ לTTñלTTñלTTıלTT ־לTT לTTלTTלTTלT : H Xw{p_L;55=L`t {kM(  w740 Xx   %[x{gE:c{kM(  :ɦ|V9&#5OrHTpS@402:JcלTTŚsUA402:JcלTT 꾒lQ>9:APhלTT 巕~snq}לTT לTTלTT לTT ͯ לTTŝy\JADM^x לTTpS@414>PiלTTpS@402:JcלTTĚsUA402:JcלTT 鼐jO>9:APhלTT ⴓ}qmo{לTT לTTלTT לT : ҵ}ols H Xw|gF>f {kM( v826 Xw %[xpI HTb* JלTTj/JלTTV*  JלTT f>&  ,VלTT ߘhG6+&##&*7FYqלTT ӑhNA9536=Ib לTT Ȋ[A2,('(.8Jk לTT}F% ,Fi לTTd, (=cלTTb* &ZלTTb* JלTTj.JלTTT)  JלTT d=%  *VלTT ޗgF6+%""%)5DVnלTT ՒiNB9436=Ha לTT ˍ]B3-(').9Jl לT :کe- .Qy H Xw~g.%d{kM( t785 Xu %[xd\{kM(  :ɂ/1{HTI  4}לTTQ  2{לTT?   2{לTT H$  <לTT k:" $4KyלTT ]6"   2W לTTR.  $=o לTTX"  )P לTTJ  6YלTTI  MלTTI  4}לTTP  2{לTT>   2{לTT ߄G#  <לTT j:"#3JwלTT ^6"   2V} לTTT0  %>o לT :Ґ@ 8h H Xwd b{kM( s748 Xt  %[xh!f{kM(:́(4H  TC /{לT  TQ,xלT  T 9,xלT  T {8 4~לT  T O% %;hלT  T {=  9dלT  T8 'O לT  TI  =u לT  TB 8`לT  TB PלT  TB 0|לT  TP,xלT  T7,xלT  T z7  4}לT  T N$ $:fלT  T |>  8bלT  T9'N לT :ԋ0$\ H  Xwh'l{kM(r671 Xs %[xq,8y{kM'֑/E5:K 7ל::a1ל:: @1ל:: {2 7ל:: A  1dל:: k. (T}ל::{/ > ל::O5t ל::I>pל::I)aל::K 7ל::_1ל:: >1ל:: z1 7ל:: A  0bל:: m/ 'Rzל::}0 = ל:'ܚ5[ 5 Xwq,>~{kM r621 Xr [xzGY {kBo߬E`wbIׂ% Bׂ U Bׂ 5Fׂ > /iׂ m(  #Oxׂ3 ; ׂd8 ׂ_M ׂ_9|ׂbJׂ$ Bׂ S Bׂ 4Fׂ > .gׂ o)  "Muׂ4 : ׂoJg wXwzG _ {kBr622 Xp Pxd /{ {`p  8ݭ (l  A e  }' e  Eg  I 6  ,  %O  BD  (H  & ,f  &%T  ( m  @ e  z& e  Eg  I 4~  -  $M|  CC u/ ݭMwd 5 {` q610 Xo  mz?g p- Mߤ7#e P XV  @XX 5XX G5XX m"6XX h! LXX >-S XX l\ XXS $j XXQ H XXQ ? XXV  @XX ~5XX E5XX l"6XX i! JXX ? ,Q XX m[ X M9 Q P lz?m p-  p588 Xo  v" 7 E  0'f 'Z>'j 9 > 97 9LD@ t" 7 E  1&g &X>&h uܒ$ u Buw-h uB   p592 Xo     Bur ] uB uه1qu=< mz /v 7 v ${Q  H1X.3 .1 /M<= kz .v 7 v %{R  F1Vuׅo u Bur ` uB   p590 Xo     Bup^ uB u؂4yu;? lt .o 1o tF =+L)- ). *P:A jt ,o 1o sG <,Kue u Bupa uB    p588 Xo     Buqf uB uۆ>u@ I tw .q /q xtB 5,C*+{ *0 ,Z ? K sx .q 0q ztC 4,Auցa u Buq i uB    p584 Xo    But%r uB uސ J uN  %V " 5| 3| |~G 44?}2-} 2 6 4$f M  &X " 5| 3| ~~I 24={uيb u But%u uB    p572 Xo    Buy6# uB u+] uf/k +/ B % ;% &T  9B=A4 A B D.y e0m */ B % <% &V  7B;~uޛ'j u Buy6% uB    p584 Xo    Bu~LA uB u傻D%{ u ? B D Z8 J8 %8k FZ AY  = Y S ^ ?  A A E Z8 K8 '8l DZ ?u?"z u Bu~LA uB    p572 Xo Eu`X uEujA u 8 )X  o g (W pV < Va~K}O }%n ]  8  ,\  n i (W pV = Va~Iuc3 uEuaW uE p595 Xo  +vv: '` vv:%f vv: ; vvC 4 vv mF vv 2 =vv A%vv . #vv g#vv ?+vv: &_ vlَ  J m=ut)y u@ p634 Xo k~SE o, L bF O W >6g WW n (mWW |%NWW Z JWW + JWWqRWWk:WWk> WWl"e WW|!b WW >8k WW m )oWW }%NWW [ JWW , JWWrRWWk8W LQ#l O m~TC p-   p650 Xp  Lvr+y z_ 䂫:-| ܬ +  *^  K "R  O.  3 *  b*  C 0  @  Y  @  %[  A D  TH  +  ,a  J#T  P /  4 *  d*  C /  @  W ֎& > ܬPxs+w {`  q641 Xr  WvaQ zjAn 䂌'#n ܿv w'  '\ ց @ #Hց =!gց v#aցB aց-fց݄+=ց݄+Cց-4} ցA> ցv'  )_ց ? $Jց =!hց x$aցCaց-fց݄+;ցnj'j ܿv[xbO {kB  r703 Xs  Wv}P< zjL&~&&m ܿ49 w, -a ֛99 C &J֛99 :[֛99bR֛996 R֛99s'U֛99p&.t֛99p&5o֛99t(1q ֛99@ A ֛99v, /c֛99 B 'L֛99 :[֛99dR֛997 R֛99s'U֛99p& -r֛9'߰V R ܿ4%[x}Q: {kM r787 Xt  WvzH6 zjL'92 5{ ܿG  S @  =r ֛S  S W( 0Y֛S  S E   #\֛S  S`  R֛S  S5  R֛S  Sp*  S֛S  Sn*   *i֛S  Sn*  /b֛S  Ss-  8r ֛S  SL $O ֛S  S@  ?t ֛S  S V(1Z֛S  S F   $\֛S  Sb"  R֛S  S6  R֛S  Sp*  S֛S  Sn*   (g֛S 9ڦTFܿG %[xzH5 {kM' r810 Xu  WvxLA zjL'  9 䃠P Q ܿGS i5  !5] ֛SS ܂A$  /Kw֛SS c-  8l֛SSm1 *`֛SS݌A  )`֛SS|:  )`֛SS{: 0m֛SS{: 7f֛SS̃@  #H} ֛SSj6":k ֛SS i6   "6_ ֛SS ۂB%  1Mz֛SS e. :n֛SSo1 *`֛SSߍB  )`֛SS|:  )`֛SS{: 0l֛S :רa KݿG%[xxL= {kM(   s869 Xv  Wvz\' a zjL'  9 ёU-  +N~ ܿGS rN=5248?Lh ֛SS |P9.('(+1B\֛SS W2 &>c֛SSސR)$J֛SSa1"H֛SSЗ[."H֛SSЗ[.&P֛SSЗ\/ *L֛SSܥl>! $>e ֛SSnF/&""%+5Eh ֛SS rN>6349AMj ֛SS }P:.)'(,2C^֛SS Y3 '?e֛SSS* %K֛SSa2"H֛SSї[."H֛SSЗ[.&O֛S :ٶ}B 1gݿG%[x{\$ \ {kM(   t837 Xw  WvwZ.T zjL'  9 ߲rc_cn ܿGS ֛SS 涘 ֛SS ܤx[I@=BO`}֛SS Ǎ`?+(:X֛SSȖgC+#5S}֛SS侏b@)#5S}֛SS侏b@)%8X֛SSeC,&9T~֛SSجaJ>9:DXw ֛SS ʧ|x} ֛SS 翩 ֛SS 緙 ֛SS ާz]K@>CPb֛SS Ɏa@, (:X֛SSɖgC+#5S}֛SS侏b@)#5S}֛SS侏b@)$8X֛S :˦wK) 9b ݿG%[xuW,O {kM(    u703 Xx   Wv u_H812@Y} zjL'  9ܿGS֛SS֛SS ȷ֛SS ڵuu~֛SSв~ohku֛SSʬ|nhku֛SSʬ|nhlw֛SSϲwrz ֛SS Ʒ ֛SS֛SS֛SS֛SS ˺֛SS ܷwu~֛SSѲoiku֛SSʬ|nhku֛SSʬ|nhkv֛S :̴}i\X^p ܿG%[x r\E6.0%FɎF%FɎF%FɎF%FɎF%FɎF%FɎF%FɎF%FɎF%FɎF%FɎF%FɎF%FɎF%FɎF%FɎF%FɎF%FɎF%FɎF& 0wۆҵ>'"UrzueG! ) r382 X   2RZVF*)%Iz}K* ) .RR. ) .RR. ) .RR. ) .RR. ) .RR. ) .RR. ) .RR. ) .RR. ) .RR. ) .RR. ) .RR. ) .RR. ) .RR. ) .RR. ) .RR. ) .RR. ) .RR. )%Iz}K* +6RZVF*,  r293 X/ &"/1=E=2/ 7CLC7 / 7CLC7 / 7CLC7 / 7CLC7 / 7CLC7 / 7CLC7 / 7CLC7 / 7CLC7 / 7CLC7 / 7CLC7 / 7CLC7 / 7CLC7 / 7CLC7 / 7CLC7 / 7CLC7 / 7CLC7 / 7CLC7 /1=E=2/ &"0187 XG3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4G45 Xy45 Xy45 Xy45 Xy45 Xy45 Xy45 Xymayavi-4.5.0/mayavi/tests/data/Particles.raw0000644000076500000240000000612012747716314021427 0ustar prabhustaff00000000000000DLgFD JD\ADMSD qDADL5DtD/ADMj$D ODYADLD[aDVADNVtD ?DADND D_ADMDDRADMD M Dk ADMiD kDiADMrD DZADLD (=DADND ?D3ADNO{D IDWADMGDDADMXD 1D`ADND DADMDDhADL(DVD(gADM&D DRADLD .DCADM\yD D*oADNZD ODfADM)DF(D[ADL[D N7DVADM(D 0 DuADLoD fD9ADMuD TD;aADL!D ބD]ADM/D aDyADLD D>ADN4FDDMADNDuDIADM>DDADLmDvDLADN D DADL{D]DADM#D DLADMID֗DnADNHYD K&D"QADMP@D DLADN%D D$ADMl7D U#DLADL*D XDADMڜDD4ADM$@DA"DADM4D DADLD )AD^ADLbKD +DADNVD D8ADMD iDJRADMoD @pD@DN@yD JD@DM9+DD@DLhD DpADNpDyDADLD WDADLbBD {&DADMD ܠD[ADNeD $$DYADND F DADLD /D(ADLڝD DADMڊD D+ADM"D mzDADMBD $JD|ADMnD DMADMD D<]ADNxD D{ADLD E8DLADMD oDLADL*D +D`ADNCD DADNKhD .DADMND DADND ODOADMUD D ADLD D ADMQ;D DADMsD DKOADLD DADLsD g D ADMD ^DADM D nD`ADLaD 7DADMD kDa1ADLMD D7BADND eDADMaD VDlADLgD ;DWADMRD s&DlADLD Dx@DLtD D@DN4D 5D@DM4D %DlADNmD DGADMXDDVADLD D ADM9D 2DoOADN]yD^YD3ADLD D?ADND}DqADMD DADMD DJADMD;DADMoDDVADNrD DlgADLDDNDRADMD PD-ADLpbD_DADN.@D DADLD nDADM:D UDxADMODDADLD DADLD':DADMD 9D9ADLԓD DxADNDzD>ADN8D DADMHD DR6ADLQD yDADM]DQDADNLID^D ADL[DhDyUADN%D DADLD DXADM D DQbADM]D DfADMD uDADLDHD&ADL!D "DΦADN8D DADLD+D˷ADMDDDaSADNm>D D _AQAAAACAAAAUAAAAGQAAAA==eJxjYFBwZGBYAMQfgFjBiYHBwwkAITcDYA==AQAAAACAAAAUAAAAGQAAAA==eJxjYFBwZGBQcGJg6AHiE0DM5AwAGcoC4Q==AQAAAACAAAA8AAAAFgAAAA==eJxjYEAGBxxQ2eh8EHBwgGEAh3wFgQ==AQAAAACAAAA8AAAAFgAAAA==eJxjYEAGBxxQ2eh8EHBwgGEAh3wFgQ==AQAAAACAAAAUAAAAFgAAAA==eJxjYGBgYARiJiBmBmIWIAYAAGQACw==AQAAAACAAAAEAAAADAAAAA==eJxjZWBgAAAAGAAGAQAAAACAAAABAAAACQAAAA==eJzjAwAADwAP mayavi-4.5.0/mayavi/tests/data/README.txt0000644000076500000240000000204112747716314020462 0ustar prabhustaff00000000000000Here are the sources of the various files in this directory. VTKData is distributed under a BSD license. John Burkardt's pages (http://people.sc.fsu.edu/~burkardt/data/data.html) list some of the data as LGPL and others without an explicit mention of any licensing. Unfortnately, we are unable to find his email address anywhere. Attempts to contact him at certain addresses results in bounced emails. Particles.raw - VTKData caffeine.pdb - VTKData cellsnd.ascii.inp - http://people.sc.fsu.edu/~burkardt/data/data.html clown.facet - VTKData cow.g - VTKData cube.vti - Self made. edgeFaceElem.exii - VTKData example.dem - Self made from VTKData. foot.mha - VTKData foot.raw - VTKData humanoid_tri.stla - http://people.sc.fsu.edu/~burkardt/data/data.html nut.slc - VTKData points.txt - VTKData prism.neu - VTKData pyramid.ply - http://people.sc.fsu.edu/~burkardt/data/data.html pyramid_ug.vtu - Self made. shuttle.obj - http://people.sc.fsu.edu/~burkardt/data/data.html tiny.q - Contributed by Francesco Poli tiny.xyz - Contributed by Francesco Poli mayavi-4.5.0/mayavi/tests/data/RectGrid2.vtk0000644000076500000240000225023112747716314021307 0ustar prabhustaff00000000000000# vtk DataFile Version 2.0 Sample rectilinear grid ASCII DATASET RECTILINEAR_GRID DIMENSIONS 47 33 11 X_COORDINATES 47 float -1.22396 -1.17188 -1.11979 -1.06771 -1.01562 -0.963542 -0.911458 -0.859375 -0.807292 -0.755208 -0.703125 -0.651042 -0.598958 -0.546875 -0.494792 -0.442708 -0.390625 -0.338542 -0.286458 -0.234375 -0.182292 -0.130209 -0.078125 -0.026042 0.0260415 0.078125 0.130208 0.182291 0.234375 0.286458 0.338542 0.390625 0.442708 0.494792 0.546875 0.598958 0.651042 0.703125 0.755208 0.807292 0.859375 0.911458 0.963542 1.01562 1.06771 1.11979 1.17188 Y_COORDINATES 33 float -1.25 -1.17188 -1.09375 -1.01562 -0.9375 -0.859375 -0.78125 -0.703125 -0.625 -0.546875 -0.46875 -0.390625 -0.3125 -0.234375 -0.15625 -0.078125 0 0.078125 0.15625 0.234375 0.3125 0.390625 0.46875 0.546875 0.625 0.703125 0.78125 0.859375 0.9375 1.01562 1.09375 1.17188 1.25 Z_COORDINATES 11 float 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.75 0.8 0.9 POINT_DATA 17061 SCALARS scalars float LOOKUP_TABLE default 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.0737012 0.0739102 0.0741808 0.0745185 0.0749277 0.0754124 0.0759753 0.0766175 0.0773384 0.0781352 0.0790023 0.0799316 0.080912 0.081929 0.0829659 0.084003 0.0850187 0.0859903 0.0868944 0.0877086 0.0884122 0.0889874 0.0894205 0.0897025 0.0898298 0.0898041 0.0896328 0.0893274 0.0889042 0.088382 0.0877808 0.0871221 0.086426 0.0857118 0.0849963 0.0842939 0.0836164 0.0829728 0.0823694 0.0818106 0.0812986 0.0808342 0.0804168 0.0800448 0.0797162 0.0794282 0.0791778 0.0730946 0.0733023 0.0735823 0.0739418 0.0743877 0.0749263 0.0755623 0.0762989 0.0771371 0.078075 0.0791074 0.0802253 0.0814156 0.0826609 0.0839394 0.0852258 0.0864908 0.0877036 0.0888316 0.0898436 0.0907102 0.0914063 0.0919123 0.092216 0.0923126 0.092206 0.0919076 0.0914359 0.0908151 0.0900729 0.0892393 0.0883442 0.0874162 0.086481 0.0855607 0.0846733 0.0838325 0.0830478 0.0823253 0.0816681 0.0810769 0.0805501 0.0800853 0.0796787 0.0793263 0.0790238 0.0787663 0.0724305 0.0726278 0.0729087 0.0732837 0.0737627 0.0743551 0.0750691 0.0759111 0.0768849 0.0779906 0.0792242 0.0805768 0.0820333 0.0835724 0.0851667 0.0867824 0.0883803 0.0899173 0.0913478 0.0926268 0.093712 0.0945667 0.0951628 0.0954827 0.0955211 0.0952849 0.0947928 0.0940738 0.0931651 0.0921084 0.0909481 0.0897271 0.0884858 0.0872589 0.086075 0.084956 0.083917 0.0829672 0.0821109 0.0813484 0.0806767 0.080091 0.0795853 0.0791528 0.0787867 0.07848 0.078226 0.0717006 0.0718738 0.072143 0.0725225 0.0730265 0.073669 0.0744634 0.0754209 0.07655 0.0778551 0.079335 0.0809818 0.0827791 0.0847022 0.0867156 0.088775 0.0908266 0.0928095 0.0946581 0.0963061 0.0976905 0.0987569 0.0994637 0.0997858 0.099717 0.0992711 0.0984793 0.0973885 0.096056 0.0945459 0.0929233 0.0912509 0.0895848 0.0879721 0.0864493 0.0850424 0.0837668 0.0826292 0.0816291 0.0807611 0.0800164 0.0793842 0.0788532 0.0784119 0.0780496 0.077756 0.077522 0.0708955 0.0710255 0.0712645 0.0716311 0.0721457 0.0728289 0.0737013 0.0747821 0.0760875 0.0776292 0.0794117 0.0814307 0.0836707 0.0861026 0.0886827 0.0913515 0.0940345 0.0966438 0.0990827 0.101251 0.103051 0.104401 0.105237 0.105523 0.105254 0.104461 0.103197 0.101538 0.0995792 0.097415 0.0951418 0.0928482 0.0906113 0.0884935 0.0865404 0.0847813 0.0832299 0.0818868 0.0807428 0.0797824 0.0789864 0.0783347 0.0778077 0.0773875 0.0770578 0.0768044 0.0766152 0.0699619 0.0700222 0.0702033 0.0705305 0.0710315 0.0717365 0.0726769 0.0738836 0.0753855 0.0772064 0.079362 0.0818565 0.0846783 0.0877966 0.091158 0.0946835 0.0982688 0.101785 0.105085 0.10801 0.110407 0.112139 0.113109 0.113264 0.112612 0.111216 0.109179 0.106639 0.103745 0.100643 0.0974693 0.0943428 0.0913609 0.0886005 0.0861156 0.0839375 0.0820756 0.0805206 0.0792489 0.0782287 0.0774246 0.076802 0.076329 0.0759781 0.0757261 0.0755541 0.0754465 0.068812 0.0687663 0.0688511 0.0690995 0.0695497 0.0702446 0.071231 0.0725579 0.0742737 0.0764228 0.0790406 0.0821484 0.0857461 0.0898066 0.0942688 0.0990316 0.10395 0.108833 0.113448 0.117535 0.120832 0.123101 0.124176 0.123983 0.122563 0.120058 0.116691 0.112719 0.1084 0.103959 0.0995755 0.0953869 0.0914941 0.0879711 0.0848701 0.0822205 0.0800265 0.0782678 0.0769035 0.0758791 0.0751358 0.0746172 0.0742737 0.0740644 0.0739565 0.0739253 0.0739515 0.0672676 0.0670682 0.0670048 0.0671198 0.0674648 0.0681001 0.0690942 0.0705229 0.072465 0.0749976 0.0781899 0.0820942 0.0867374 0.092111 0.09816 0.104769 0.111747 0.11881 0.125582 0.131602 0.13638 0.139465 0.140543 0.139512 0.13651 0.131884 0.126115 0.119718 0.113155 0.106774 0.100799 0.0953431 0.0904504 0.0861369 0.0824145 0.0792946 0.0767778 0.0748411 0.0734324 0.0724757 0.0718832 0.071569 0.0714576 0.0714884 0.071616 0.0718076 0.0720397 0.0651138 0.0647033 0.0644272 0.0643396 0.0645081 0.0650163 0.0659632 0.0674623 0.0696376 0.0726164 0.0765206 0.0814575 0.0875108 0.0947302 0.103114 0.11258 0.122912 0.133698 0.14428 0.153759 0.161115 0.165408 0.166051 0.162976 0.156656 0.147952 0.137889 0.127436 0.117369 0.108196 0.100157 0.093274 0.0874329 0.0824834 0.0783084 0.0748506 0.0720962 0.0700371 0.0686362 0.0678155 0.0674649 0.0674647 0.0677047 0.068096 0.0685733 0.0690921 0.0696237 0.0621161 0.061432 0.060872 0.0605024 0.060411 0.0607102 0.0615401 0.0630657 0.0654725 0.0689569 0.0737185 0.0799562 0.087873 0.0976777 0.109565 0.12364 0.139768 0.157339 0.175054 0.190912 0.202557 0.207968 0.206202 0.197761 0.184337 0.168122 0.151099 0.13471 0.119863 0.107057 0.0964743 0.0880134 0.0813573 0.0760967 0.0718662 0.0684324 0.0657042 0.0636809 0.0623749 0.0617524 0.0617161 0.0621259 0.0628344 0.0637146 0.0646714 0.0656415 0.0665865 0.0581886 0.0571757 0.056266 0.0555388 0.0551044 0.0551112 0.0557488 0.0572464 0.0598636 0.0638802 0.0695983 0.0773694 0.0876478 0.101042 0.118312 0.14019 0.166925 0.197527 0.229072 0.256666 0.274599 0.278512 0.267528 0.244901 0.216461 0.187674 0.161524 0.138662 0.118912 0.102233 0.0887382 0.0783944 0.0708651 0.0655561 0.061794 0.059022 0.0569126 0.0553666 0.0544229 0.0541377 0.0544963 0.0553928 0.0566667 0.0581537 0.0597202 0.0612743 0.0627604 0.0534751 0.0520988 0.0507943 0.049653 0.0488091 0.0484499 0.0488205 0.0502174 0.0529728 0.0574486 0.0640751 0.0734611 0.0865748 0.10495 0.130759 0.166402 0.213212 0.269355 0.327958 0.377152 0.403349 0.397211 0.359472 0.302562 0.245137 0.200554 0.168622 0.141924 0.116774 0.0942728 0.0762352 0.0631021 0.0542751 0.0488619 0.0459272 0.044556 0.0440016 0.0438296 0.0439319 0.044406 0.0453789 0.0468776 0.0488061 0.0509995 0.0532929 0.055559 0.0577172 0.0486713 0.0469364 0.0452335 0.0436632 0.0423812 0.0416124 0.0416547 0.0428633 0.045626 0.0503762 0.0577163 0.0686995 0.0852941 0.110958 0.150908 0.211103 0.2951 0.399202 0.508292 0.596061 0.632678 0.598765 0.499385 0.369877 0.266461 0.223431 0.206309 0.175457 0.130563 0.087441 0.0579576 0.0431414 0.0360634 0.0312751 0.0277401 0.0260588 0.026336 0.0278125 0.0296654 0.0315597 0.0335721 0.035885 0.0385678 0.0415379 0.0446366 0.0477093 0.0506455 0.0454661 0.0434291 0.041379 0.03942 0.0377227 0.0365434 0.0362287 0.0371897 0.0398717 0.0448114 0.0529088 0.066011 0.0878905 0.125447 0.1891 0.290555 0.436678 0.620206 0.811575 0.95961 1.00707 0.918165 0.705675 0.447016 0.293535 0.316454 0.334875 0.277851 0.177692 0.0827414 0.036742 0.0506569 0.0602054 0.0578949 0.0491054 0.038022 0.0274738 0.0197056 0.0163458 0.0168688 0.0191674 0.0221035 0.0254477 0.0291269 0.0329935 0.0368677 0.0406023 0.046882 0.0446569 0.0423734 0.0401354 0.038126 0.0366384 0.0360925 0.0370176 0.0400261 0.0459306 0.0562224 0.074075 0.10592 0.163172 0.262586 0.422692 0.65392 0.943069 1.23993 1.45974 1.51035 1.33699 0.964263 0.525946 0.351991 0.500815 0.545642 0.433216 0.2464 0.0746969 0.0539564 0.108853 0.124882 0.118461 0.101949 0.081998 0.0620263 0.0440904 0.029522 0.0189698 0.0125707 0.0103865 0.0118073 0.0152092 0.0194182 0.0238587 0.0282312 0.0538268 0.0515378 0.0491553 0.0467891 0.0446483 0.0430969 0.0427026 0.0442429 0.0486794 0.0572895 0.0722967 0.0982187 0.143886 0.224565 0.362397 0.581628 0.894925 1.28189 1.67152 1.94783 1.98859 1.72509 1.19515 0.58501 0.434318 0.70062 0.75727 0.58394 0.310975 0.065933 0.0952266 0.168137 0.184398 0.171691 0.147455 0.120085 0.0932878 0.0691082 0.0489271 0.0333547 0.0220297 0.0138775 0.00797532 0.00537947 0.00806416 0.0126768 0.0174617 0.058657 0.0563666 0.0539698 0.0515823 0.0494344 0.0479415 0.0477753 0.0498836 0.0554536 0.0660198 0.084136 0.114857 0.167951 0.260214 0.415925 0.661487 1.01009 1.43776 1.86436 2.16092 2.19342 1.8884 1.28984 0.606476 0.476832 0.790954 0.850806 0.650443 0.340361 0.064253 0.111737 0.190741 0.206556 0.191055 0.163726 0.133602 0.104413 0.0781222 0.056106 0.0390172 0.0265005 0.0173554 0.0101862 0.00416786 0.00303118 0.0080807 0.0131969 0.0538268 0.0515378 0.0491553 0.0467891 0.0446483 0.0430969 0.0427026 0.0442429 0.0486794 0.0572895 0.0722967 0.0982187 0.143886 0.224565 0.362397 0.581628 0.894925 1.28189 1.67152 1.94783 1.98859 1.72509 1.19515 0.58501 0.434318 0.70062 0.75727 0.58394 0.310975 0.065933 0.0952266 0.168137 0.184398 0.171691 0.147455 0.120085 0.0932878 0.0691082 0.0489271 0.0333547 0.0220297 0.0138775 0.00797532 0.00537947 0.00806416 0.0126768 0.0174617 0.046882 0.0446569 0.0423734 0.0401354 0.038126 0.0366384 0.0360925 0.0370176 0.0400261 0.0459306 0.0562224 0.074075 0.10592 0.163172 0.262586 0.422692 0.65392 0.943069 1.23993 1.45974 1.51035 1.33699 0.964263 0.525946 0.351991 0.500815 0.545642 0.433216 0.2464 0.0746969 0.0539564 0.108853 0.124882 0.118461 0.101949 0.081998 0.0620263 0.0440904 0.029522 0.0189698 0.0125707 0.0103865 0.0118073 0.0152092 0.0194182 0.0238587 0.0282312 0.0454661 0.0434291 0.041379 0.03942 0.0377227 0.0365434 0.0362287 0.0371897 0.0398717 0.0448114 0.0529088 0.066011 0.0878905 0.125447 0.1891 0.290555 0.436678 0.620206 0.811575 0.95961 1.00707 0.918165 0.705675 0.447016 0.293535 0.316454 0.334875 0.277851 0.177692 0.0827414 0.036742 0.0506569 0.0602054 0.0578949 0.0491054 0.038022 0.0274738 0.0197056 0.0163458 0.0168688 0.0191674 0.0221035 0.0254477 0.0291269 0.0329935 0.0368677 0.0406023 0.0486713 0.0469364 0.0452335 0.0436632 0.0423812 0.0416124 0.0416547 0.0428633 0.045626 0.0503762 0.0577163 0.0686995 0.0852941 0.110958 0.150908 0.211103 0.2951 0.399202 0.508292 0.596061 0.632678 0.598765 0.499385 0.369877 0.266461 0.223431 0.206309 0.175457 0.130563 0.087441 0.0579576 0.0431414 0.0360634 0.0312751 0.0277401 0.0260588 0.026336 0.0278125 0.0296654 0.0315597 0.0335721 0.035885 0.0385678 0.0415379 0.0446366 0.0477093 0.0506455 0.0534751 0.0520988 0.0507943 0.049653 0.0488091 0.0484499 0.0488205 0.0502174 0.0529728 0.0574486 0.0640751 0.0734611 0.0865748 0.10495 0.130759 0.166402 0.213212 0.269355 0.327958 0.377152 0.403349 0.397211 0.359472 0.302562 0.245137 0.200554 0.168622 0.141924 0.116774 0.0942728 0.0762352 0.0631021 0.0542751 0.0488619 0.0459272 0.044556 0.0440016 0.0438296 0.0439319 0.044406 0.0453789 0.0468776 0.0488061 0.0509995 0.0532929 0.055559 0.0577172 0.0581886 0.0571757 0.056266 0.0555388 0.0551044 0.0551112 0.0557488 0.0572464 0.0598636 0.0638802 0.0695983 0.0773694 0.0876478 0.101042 0.118312 0.14019 0.166925 0.197527 0.229072 0.256666 0.274599 0.278512 0.267528 0.244901 0.216461 0.187674 0.161524 0.138662 0.118912 0.102233 0.0887382 0.0783944 0.0708651 0.0655561 0.061794 0.059022 0.0569126 0.0553666 0.0544229 0.0541377 0.0544963 0.0553928 0.0566667 0.0581537 0.0597202 0.0612743 0.0627604 0.0621161 0.061432 0.060872 0.0605024 0.060411 0.0607102 0.0615401 0.0630657 0.0654725 0.0689569 0.0737185 0.0799562 0.087873 0.0976777 0.109565 0.12364 0.139768 0.157339 0.175054 0.190912 0.202557 0.207968 0.206202 0.197761 0.184337 0.168122 0.151099 0.13471 0.119863 0.107057 0.0964743 0.0880134 0.0813573 0.0760967 0.0718662 0.0684324 0.0657042 0.0636809 0.0623749 0.0617524 0.0617161 0.0621259 0.0628344 0.0637146 0.0646714 0.0656415 0.0665865 0.0651138 0.0647033 0.0644272 0.0643396 0.0645081 0.0650163 0.0659632 0.0674623 0.0696376 0.0726164 0.0765206 0.0814575 0.0875108 0.0947302 0.103114 0.11258 0.122912 0.133698 0.14428 0.153759 0.161115 0.165408 0.166051 0.162976 0.156656 0.147952 0.137889 0.127436 0.117369 0.108196 0.100157 0.093274 0.0874329 0.0824834 0.0783084 0.0748506 0.0720962 0.0700371 0.0686362 0.0678155 0.0674649 0.0674647 0.0677047 0.068096 0.0685733 0.0690921 0.0696237 0.0672676 0.0670682 0.0670048 0.0671198 0.0674648 0.0681001 0.0690942 0.0705229 0.072465 0.0749976 0.0781899 0.0820942 0.0867374 0.092111 0.09816 0.104769 0.111747 0.11881 0.125582 0.131602 0.13638 0.139465 0.140543 0.139512 0.13651 0.131884 0.126115 0.119718 0.113155 0.106774 0.100799 0.0953431 0.0904504 0.0861369 0.0824145 0.0792946 0.0767778 0.0748411 0.0734324 0.0724757 0.0718832 0.071569 0.0714576 0.0714884 0.071616 0.0718076 0.0720397 0.068812 0.0687663 0.0688511 0.0690995 0.0695497 0.0702446 0.071231 0.0725579 0.0742737 0.0764228 0.0790406 0.0821484 0.0857461 0.0898066 0.0942688 0.0990316 0.10395 0.108833 0.113448 0.117535 0.120832 0.123101 0.124176 0.123983 0.122563 0.120058 0.116691 0.112719 0.1084 0.103959 0.0995755 0.0953869 0.0914941 0.0879711 0.0848701 0.0822205 0.0800265 0.0782678 0.0769035 0.0758791 0.0751358 0.0746172 0.0742737 0.0740644 0.0739565 0.0739253 0.0739515 0.0699619 0.0700222 0.0702033 0.0705305 0.0710315 0.0717365 0.0726769 0.0738836 0.0753855 0.0772064 0.079362 0.0818565 0.0846783 0.0877966 0.091158 0.0946835 0.0982688 0.101785 0.105085 0.10801 0.110407 0.112139 0.113109 0.113264 0.112612 0.111216 0.109179 0.106639 0.103745 0.100643 0.0974693 0.0943428 0.0913609 0.0886005 0.0861156 0.0839375 0.0820756 0.0805206 0.0792489 0.0782287 0.0774246 0.076802 0.076329 0.0759781 0.0757261 0.0755541 0.0754465 0.0708955 0.0710255 0.0712645 0.0716311 0.0721457 0.0728289 0.0737013 0.0747821 0.0760875 0.0776292 0.0794117 0.0814307 0.0836707 0.0861026 0.0886827 0.0913515 0.0940345 0.0966438 0.0990827 0.101251 0.103051 0.104401 0.105237 0.105523 0.105254 0.104461 0.103197 0.101538 0.0995792 0.097415 0.0951418 0.0928482 0.0906113 0.0884935 0.0865404 0.0847813 0.0832299 0.0818868 0.0807428 0.0797824 0.0789864 0.0783347 0.0778077 0.0773875 0.0770578 0.0768044 0.0766152 0.0717006 0.0718738 0.072143 0.0725225 0.0730265 0.073669 0.0744634 0.0754209 0.07655 0.0778551 0.079335 0.0809818 0.0827791 0.0847022 0.0867156 0.088775 0.0908266 0.0928095 0.0946581 0.0963061 0.0976905 0.0987569 0.0994637 0.0997858 0.099717 0.0992711 0.0984793 0.0973885 0.096056 0.0945459 0.0929233 0.0912509 0.0895848 0.0879721 0.0864493 0.0850424 0.0837668 0.0826292 0.0816291 0.0807611 0.0800164 0.0793842 0.0788532 0.0784119 0.0780496 0.077756 0.077522 0.0724305 0.0726278 0.0729087 0.0732837 0.0737627 0.0743551 0.0750691 0.0759111 0.0768849 0.0779906 0.0792242 0.0805768 0.0820333 0.0835724 0.0851667 0.0867824 0.0883803 0.0899173 0.0913478 0.0926268 0.093712 0.0945667 0.0951628 0.0954827 0.0955211 0.0952849 0.0947928 0.0940738 0.0931651 0.0921084 0.0909481 0.0897271 0.0884858 0.0872589 0.086075 0.084956 0.083917 0.0829672 0.0821109 0.0813484 0.0806767 0.080091 0.0795853 0.0791528 0.0787867 0.07848 0.078226 0.0730946 0.0733023 0.0735823 0.0739418 0.0743877 0.0749263 0.0755623 0.0762989 0.0771371 0.078075 0.0791074 0.0802253 0.0814156 0.0826609 0.0839394 0.0852258 0.0864908 0.0877036 0.0888316 0.0898436 0.0907102 0.0914063 0.0919123 0.092216 0.0923126 0.092206 0.0919076 0.0914359 0.0908151 0.0900729 0.0892393 0.0883442 0.0874162 0.086481 0.0855607 0.0846733 0.0838325 0.0830478 0.0823253 0.0816681 0.0810769 0.0805501 0.0800853 0.0796787 0.0793263 0.0790238 0.0787663 0.0737012 0.0739102 0.0741808 0.0745185 0.0749277 0.0754124 0.0759753 0.0766175 0.0773384 0.0781352 0.0790023 0.0799316 0.080912 0.081929 0.0829659 0.084003 0.0850187 0.0859903 0.0868944 0.0877086 0.0884122 0.0889874 0.0894205 0.0897025 0.0898298 0.0898041 0.0896328 0.0893274 0.0889042 0.088382 0.0877808 0.0871221 0.086426 0.0857118 0.0849963 0.0842939 0.0836164 0.0829728 0.0823694 0.0818106 0.0812986 0.0808342 0.0804168 0.0800448 0.0797162 0.0794282 0.0791778 0.147455 0.147823 0.148309 0.148923 0.149673 0.150568 0.151612 0.152811 0.154162 0.155661 0.1573 0.159063 0.16093 0.162875 0.164866 0.166866 0.168836 0.17073 0.172505 0.174116 0.175525 0.176695 0.1776 0.17822 0.178547 0.178583 0.178339 0.177835 0.177102 0.176173 0.175087 0.173883 0.172599 0.171273 0.169935 0.168614 0.167333 0.16611 0.164958 0.163886 0.162899 0.161999 0.161186 0.160458 0.15981 0.15924 0.158741 0.146276 0.146638 0.147136 0.147785 0.148599 0.149588 0.150764 0.152135 0.153701 0.155463 0.157409 0.159527 0.16179 0.164167 0.166618 0.169095 0.171544 0.173905 0.176117 0.178119 0.179853 0.181271 0.182333 0.183014 0.183302 0.183203 0.182735 0.181931 0.180836 0.179501 0.177981 0.176333 0.174611 0.172865 0.171135 0.169458 0.167861 0.166364 0.164977 0.16371 0.162563 0.161537 0.160625 0.159822 0.159123 0.158516 0.157997 0.144994 0.14533 0.145824 0.146494 0.147362 0.148445 0.149761 0.151322 0.153136 0.155208 0.157529 0.160085 0.162849 0.165781 0.168833 0.171939 0.175028 0.178015 0.180815 0.183341 0.185511 0.187253 0.18851 0.189248 0.18945 0.189129 0.188316 0.187062 0.185437 0.183516 0.181385 0.179123 0.176807 0.174504 0.172268 0.170145 0.168162 0.16634 0.164689 0.163209 0.161898 0.160748 0.159748 0.158886 0.15815 0.157527 0.157007 0.143595 0.143877 0.144341 0.145011 0.145916 0.147083 0.14854 0.150308 0.152405 0.154843 0.157621 0.160725 0.164129 0.167788 0.171634 0.175586 0.179543 0.18339 0.187 0.190248 0.193011 0.195185 0.196684 0.197459 0.197493 0.196806 0.195452 0.193518 0.191108 0.188341 0.18534 0.182224 0.179099 0.176057 0.173169 0.170485 0.168039 0.165845 0.163905 0.162209 0.160744 0.159491 0.15843 0.157539 0.156799 0.156191 0.1557 0.142059 0.142253 0.142649 0.143285 0.144197 0.145429 0.147018 0.149005 0.151421 0.154291 0.157628 0.161426 0.16566 0.170276 0.175193 0.180304 0.185466 0.190512 0.195263 0.199522 0.203108 0.205856 0.207644 0.208396 0.208098 0.206795 0.204585 0.201609 0.198032 0.19404 0.189811 0.185514 0.181299 0.177286 0.173564 0.170193 0.167203 0.164597 0.162362 0.160471 0.15889 0.157582 0.156511 0.155646 0.154956 0.154413 0.153996 0.140285 0.140339 0.140616 0.141163 0.142036 0.143292 0.144991 0.147197 0.149964 0.153343 0.157366 0.162046 0.167366 0.17327 0.179659 0.186389 0.193261 0.200035 0.206431 0.212149 0.216899 0.220421 0.222519 0.223093 0.222141 0.219765 0.216154 0.211554 0.206239 0.200485 0.194553 0.188667 0.183022 0.177766 0.173009 0.168815 0.165205 0.162168 0.159662 0.157632 0.156012 0.154739 0.153753 0.153004 0.152448 0.152049 0.151777 0.138101 0.137944 0.138026 0.138411 0.13917 0.140386 0.14215 0.144557 0.147701 0.151672 0.156543 0.162356 0.169116 0.176777 0.185226 0.194273 0.203645 0.212984 0.221855 0.229774 0.236244 0.240828 0.243205 0.243226 0.240946 0.236608 0.230601 0.223387 0.215437 0.207174 0.198947 0.191027 0.18362 0.176879 0.170913 0.165784 0.161506 0.158045 0.155329 0.153259 0.151726 0.150627 0.149867 0.14937 0.149075 0.148933 0.148908 0.135153 0.134695 0.134483 0.134598 0.135138 0.136217 0.137967 0.140532 0.144068 0.148724 0.154637 0.161911 0.170598 0.180687 0.19207 0.204528 0.217698 0.23105 0.243882 0.255351 0.264559 0.27069 0.273171 0.271797 0.266788 0.258733 0.248466 0.236894 0.224849 0.212988 0.201751 0.191391 0.182028 0.173725 0.16652 0.160447 0.155509 0.151666 0.148824 0.146844 0.145565 0.144826 0.144486 0.14443 0.144569 0.144842 0.145203 0.131015 0.130146 0.129518 0.129231 0.129414 0.130223 0.131846 0.134503 0.138429 0.143871 0.151063 0.160211 0.171473 0.184934 0.200576 0.21822 0.237446 0.257475 0.277105 0.294724 0.308513 0.31683 0.318636 0.313796 0.303102 0.288011 0.270264 0.251537 0.233208 0.216233 0.201122 0.188002 0.176748 0.167141 0.158996 0.152217 0.146776 0.142652 0.139778 0.138009 0.137147 0.136968 0.137269 0.137878 0.138671 0.13956 0.140487 0.125218 0.12382 0.12264 0.121802 0.121468 0.121849 0.12321 0.125861 0.130158 0.136475 0.14519 0.156678 0.171306 0.189431 0.21136 0.237224 0.26671 0.298669 0.330772 0.359485 0.380701 0.390936 0.388603 0.37461 0.351858 0.324016 0.294365 0.265309 0.238454 0.214817 0.194896 0.178681 0.165738 0.155405 0.147052 0.14025 0.134812 0.130717 0.127975 0.126526 0.1262 0.126745 0.127891 0.129398 0.131085 0.132823 0.134537 0.117588 0.11556 0.113707 0.112177 0.111173 0.110968 0.111919 0.114454 0.119068 0.126291 0.136694 0.150923 0.169781 0.194315 0.225793 0.265419 0.313528 0.368302 0.424551 0.47367 0.505683 0.513094 0.494636 0.456294 0.408293 0.359706 0.314943 0.274639 0.2386 0.207269 0.181376 0.161207 0.146329 0.135721 0.12815 0.122556 0.118283 0.115093 0.113024 0.112171 0.112525 0.113914 0.116061 0.118666 0.121475 0.124304 0.127042 0.108412 0.105695 0.103092 0.100772 0.0989798 0.0980598 0.0984658 0.100752 0.105549 0.113548 0.125554 0.142669 0.166593 0.199981 0.246575 0.310525 0.394137 0.49415 0.598382 0.685791 0.732327 0.721654 0.655728 0.557763 0.461632 0.389325 0.336772 0.289133 0.240966 0.196164 0.159511 0.132604 0.114526 0.103473 0.0974756 0.0946488 0.0934739 0.0930441 0.0930844 0.0937391 0.0952544 0.0977271 0.101032 0.104899 0.109028 0.113175 0.117174 0.0990884 0.0956999 0.0923543 0.0892346 0.0866242 0.0849328 0.0847073 0.0866104 0.0913813 0.099853 0.113149 0.133161 0.163352 0.209784 0.281648 0.389551 0.539915 0.726256 0.92168 1.07924 1.14554 1.08576 0.909363 0.682352 0.510111 0.448613 0.424582 0.367197 0.278885 0.190822 0.126665 0.0908042 0.0729922 0.0628149 0.0568536 0.0551035 0.0569767 0.0607301 0.0648176 0.0686576 0.0724377 0.076578 0.0813188 0.0866074 0.0922054 0.0978396 0.103293 0.0929986 0.0890617 0.0850907 0.0812774 0.0779322 0.0755192 0.0746673 0.0761365 0.0807771 0.0896245 0.104355 0.128297 0.16816 0.236219 0.35113 0.533979 0.797246 1.12815 1.47405 1.74355 1.83365 1.67852 1.29917 0.837071 0.575145 0.631659 0.673645 0.570559 0.379908 0.191999 0.0787321 0.0827816 0.101928 0.10033 0.0856733 0.0660021 0.0473607 0.0351692 0.0328015 0.0370303 0.0430202 0.0491703 0.0555226 0.0622636 0.0693214 0.0764536 0.0834068 0.096147 0.091889 0.0875249 0.0832505 0.0794024 0.0765119 0.0753359 0.0768382 0.0821716 0.0928896 0.111774 0.144598 0.202961 0.307425 0.488199 0.77869 1.19777 1.72213 2.26254 2.66767 2.77143 2.47154 1.80571 1.01109 0.683986 0.961349 1.06438 0.869232 0.521043 0.188203 0.0744589 0.183509 0.22228 0.215734 0.187608 0.151229 0.113699 0.0794388 0.0515458 0.032123 0.0226773 0.0225716 0.0275074 0.0344477 0.0423095 0.0505263 0.0586826 0.110246 0.105896 0.101381 0.09691 0.0928727 0.0899293 0.0891006 0.0917974 0.0998182 0.115603 0.143331 0.1913 0.275562 0.423759 0.675856 1.0755 1.64553 2.34989 3.06246 3.57633 3.67102 3.21687 2.27061 1.1548 0.815661 1.30989 1.45232 1.15711 0.653119 0.182443 0.139624 0.292496 0.334934 0.318239 0.27637 0.226308 0.175881 0.129551 0.0904197 0.0601151 0.038408 0.0236599 0.014724 0.0136254 0.0196897 0.0281688 0.0370386 0.11997 0.115626 0.111093 0.106594 0.102552 0.0997229 0.099312 0.103043 0.113142 0.132558 0.166118 0.223137 0.321404 0.49135 0.776793 1.22523 1.86043 2.63994 3.42143 3.97495 4.05857 3.53312 2.46446 1.2109 0.880718 1.46654 1.62326 1.28396 0.713059 0.184161 0.167291 0.333865 0.37665 0.355334 0.307962 0.252857 0.197965 0.147627 0.104942 0.0716032 0.0473338 0.0300958 0.0173494 0.00863723 0.0104943 0.0191494 0.0284783 0.110246 0.105896 0.101381 0.09691 0.0928727 0.0899293 0.0891006 0.0917974 0.0998182 0.115603 0.143331 0.1913 0.275562 0.423759 0.675856 1.0755 1.64553 2.34989 3.06246 3.57633 3.67102 3.21687 2.27061 1.1548 0.815661 1.30989 1.45232 1.15711 0.653119 0.182443 0.139624 0.292496 0.334934 0.318239 0.27637 0.226308 0.175881 0.129551 0.0904197 0.0601151 0.038408 0.0236599 0.014724 0.0136254 0.0196897 0.0281688 0.0370386 0.096147 0.091889 0.0875249 0.0832505 0.0794024 0.0765119 0.0753359 0.0768382 0.0821716 0.0928896 0.111774 0.144598 0.202961 0.307425 0.488199 0.77869 1.19777 1.72213 2.26254 2.66767 2.77143 2.47154 1.80571 1.01109 0.683986 0.961349 1.06438 0.869232 0.521043 0.188203 0.0744589 0.183509 0.22228 0.215734 0.187608 0.151229 0.113699 0.0794388 0.0515458 0.032123 0.0226773 0.0225716 0.0275074 0.0344477 0.0423095 0.0505263 0.0586826 0.0929986 0.0890617 0.0850907 0.0812774 0.0779322 0.0755192 0.0746673 0.0761365 0.0807771 0.0896245 0.104355 0.128297 0.16816 0.236219 0.35113 0.533979 0.797246 1.12815 1.47405 1.74355 1.83365 1.67852 1.29917 0.837071 0.575145 0.631659 0.673645 0.570559 0.379908 0.191999 0.0787321 0.0827816 0.101928 0.10033 0.0856733 0.0660021 0.0473607 0.0351692 0.0328015 0.0370303 0.0430202 0.0491703 0.0555226 0.0622636 0.0693214 0.0764536 0.0834068 0.0990884 0.0956999 0.0923543 0.0892346 0.0866242 0.0849328 0.0847073 0.0866104 0.0913813 0.099853 0.113149 0.133161 0.163352 0.209784 0.281648 0.389551 0.539915 0.726256 0.92168 1.07924 1.14554 1.08576 0.909363 0.682352 0.510111 0.448613 0.424582 0.367197 0.278885 0.190822 0.126665 0.0908042 0.0729922 0.0628149 0.0568536 0.0551035 0.0569767 0.0607301 0.0648176 0.0686576 0.0724377 0.076578 0.0813188 0.0866074 0.0922054 0.0978396 0.103293 0.108412 0.105695 0.103092 0.100772 0.0989798 0.0980598 0.0984658 0.100752 0.105549 0.113548 0.125554 0.142669 0.166593 0.199981 0.246575 0.310525 0.394137 0.49415 0.598382 0.685791 0.732327 0.721654 0.655728 0.557763 0.461632 0.389325 0.336772 0.289133 0.240966 0.196164 0.159511 0.132604 0.114526 0.103473 0.0974756 0.0946488 0.0934739 0.0930441 0.0930844 0.0937391 0.0952544 0.0977271 0.101032 0.104899 0.109028 0.113175 0.117174 0.117588 0.11556 0.113707 0.112177 0.111173 0.110968 0.111919 0.114454 0.119068 0.126291 0.136694 0.150923 0.169781 0.194315 0.225793 0.265419 0.313528 0.368302 0.424551 0.47367 0.505683 0.513094 0.494636 0.456294 0.408293 0.359706 0.314943 0.274639 0.2386 0.207269 0.181376 0.161207 0.146329 0.135721 0.12815 0.122556 0.118283 0.115093 0.113024 0.112171 0.112525 0.113914 0.116061 0.118666 0.121475 0.124304 0.127042 0.125218 0.12382 0.12264 0.121802 0.121468 0.121849 0.12321 0.125861 0.130158 0.136475 0.14519 0.156678 0.171306 0.189431 0.21136 0.237224 0.26671 0.298669 0.330772 0.359485 0.380701 0.390936 0.388603 0.37461 0.351858 0.324016 0.294365 0.265309 0.238454 0.214817 0.194896 0.178681 0.165738 0.155405 0.147052 0.14025 0.134812 0.130717 0.127975 0.126526 0.1262 0.126745 0.127891 0.129398 0.131085 0.132823 0.134537 0.131015 0.130146 0.129518 0.129231 0.129414 0.130223 0.131846 0.134503 0.138429 0.143871 0.151063 0.160211 0.171473 0.184934 0.200576 0.21822 0.237446 0.257475 0.277105 0.294724 0.308513 0.31683 0.318636 0.313796 0.303102 0.288011 0.270264 0.251537 0.233208 0.216233 0.201122 0.188002 0.176748 0.167141 0.158996 0.152217 0.146776 0.142652 0.139778 0.138009 0.137147 0.136968 0.137269 0.137878 0.138671 0.13956 0.140487 0.135153 0.134695 0.134483 0.134598 0.135138 0.136217 0.137967 0.140532 0.144068 0.148724 0.154637 0.161911 0.170598 0.180687 0.19207 0.204528 0.217698 0.23105 0.243882 0.255351 0.264559 0.27069 0.273171 0.271797 0.266788 0.258733 0.248466 0.236894 0.224849 0.212988 0.201751 0.191391 0.182028 0.173725 0.16652 0.160447 0.155509 0.151666 0.148824 0.146844 0.145565 0.144826 0.144486 0.14443 0.144569 0.144842 0.145203 0.138101 0.137944 0.138026 0.138411 0.13917 0.140386 0.14215 0.144557 0.147701 0.151672 0.156543 0.162356 0.169116 0.176777 0.185226 0.194273 0.203645 0.212984 0.221855 0.229774 0.236244 0.240828 0.243205 0.243226 0.240946 0.236608 0.230601 0.223387 0.215437 0.207174 0.198947 0.191027 0.18362 0.176879 0.170913 0.165784 0.161506 0.158045 0.155329 0.153259 0.151726 0.150627 0.149867 0.14937 0.149075 0.148933 0.148908 0.140285 0.140339 0.140616 0.141163 0.142036 0.143292 0.144991 0.147197 0.149964 0.153343 0.157366 0.162046 0.167366 0.17327 0.179659 0.186389 0.193261 0.200035 0.206431 0.212149 0.216899 0.220421 0.222519 0.223093 0.222141 0.219765 0.216154 0.211554 0.206239 0.200485 0.194553 0.188667 0.183022 0.177766 0.173009 0.168815 0.165205 0.162168 0.159662 0.157632 0.156012 0.154739 0.153753 0.153004 0.152448 0.152049 0.151777 0.142059 0.142253 0.142649 0.143285 0.144197 0.145429 0.147018 0.149005 0.151421 0.154291 0.157628 0.161426 0.16566 0.170276 0.175193 0.180304 0.185466 0.190512 0.195263 0.199522 0.203108 0.205856 0.207644 0.208396 0.208098 0.206795 0.204585 0.201609 0.198032 0.19404 0.189811 0.185514 0.181299 0.177286 0.173564 0.170193 0.167203 0.164597 0.162362 0.160471 0.15889 0.157582 0.156511 0.155646 0.154956 0.154413 0.153996 0.143595 0.143877 0.144341 0.145011 0.145916 0.147083 0.14854 0.150308 0.152405 0.154843 0.157621 0.160725 0.164129 0.167788 0.171634 0.175586 0.179543 0.18339 0.187 0.190248 0.193011 0.195185 0.196684 0.197459 0.197493 0.196806 0.195452 0.193518 0.191108 0.188341 0.18534 0.182224 0.179099 0.176057 0.173169 0.170485 0.168039 0.165845 0.163905 0.162209 0.160744 0.159491 0.15843 0.157539 0.156799 0.156191 0.1557 0.144994 0.14533 0.145824 0.146494 0.147362 0.148445 0.149761 0.151322 0.153136 0.155208 0.157529 0.160085 0.162849 0.165781 0.168833 0.171939 0.175028 0.178015 0.180815 0.183341 0.185511 0.187253 0.18851 0.189248 0.18945 0.189129 0.188316 0.187062 0.185437 0.183516 0.181385 0.179123 0.176807 0.174504 0.172268 0.170145 0.168162 0.16634 0.164689 0.163209 0.161898 0.160748 0.159748 0.158886 0.15815 0.157527 0.157007 0.146276 0.146638 0.147136 0.147785 0.148599 0.149588 0.150764 0.152135 0.153701 0.155463 0.157409 0.159527 0.16179 0.164167 0.166618 0.169095 0.171544 0.173905 0.176117 0.178119 0.179853 0.181271 0.182333 0.183014 0.183302 0.183203 0.182735 0.181931 0.180836 0.179501 0.177981 0.176333 0.174611 0.172865 0.171135 0.169458 0.167861 0.166364 0.164977 0.16371 0.162563 0.161537 0.160625 0.159822 0.159123 0.158516 0.157997 0.147455 0.147823 0.148309 0.148923 0.149673 0.150568 0.151612 0.152811 0.154162 0.155661 0.1573 0.159063 0.16093 0.162875 0.164866 0.166866 0.168836 0.17073 0.172505 0.174116 0.175525 0.176695 0.1776 0.17822 0.178547 0.178583 0.178339 0.177835 0.177102 0.176173 0.175087 0.173883 0.172599 0.171273 0.169935 0.168614 0.167333 0.16611 0.164958 0.163886 0.162899 0.161999 0.161186 0.160458 0.15981 0.15924 0.158741 0.221311 0.221794 0.222441 0.223271 0.224295 0.225526 0.226973 0.228643 0.230535 0.232644 0.234959 0.23746 0.240121 0.242904 0.245766 0.248655 0.251514 0.25428 0.25689 0.259282 0.261396 0.26318 0.264594 0.265606 0.266203 0.266384 0.266163 0.265567 0.264635 0.263414 0.261958 0.26032 0.258555 0.256715 0.254847 0.252991 0.251181 0.249442 0.247796 0.246257 0.244831 0.243526 0.242339 0.24127 0.240315 0.239467 0.238721 0.219599 0.220064 0.22072 0.22159 0.222693 0.22405 0.225674 0.227576 0.229764 0.232234 0.234979 0.237977 0.241195 0.244591 0.248108 0.251681 0.25523 0.258674 0.261923 0.264889 0.267491 0.269654 0.271321 0.27245 0.273022 0.273041 0.27253 0.271532 0.270106 0.268324 0.266263 0.264002 0.261618 0.259181 0.256753 0.254385 0.252116 0.249976 0.247984 0.246153 0.244488 0.242988 0.241648 0.240461 0.239419 0.23851 0.237724 0.217748 0.218166 0.218806 0.219696 0.220865 0.222341 0.224148 0.226307 0.228833 0.231731 0.234994 0.238605 0.242527 0.24671 0.251081 0.255552 0.260021 0.264371 0.268478 0.272217 0.275468 0.278128 0.280109 0.281359 0.281849 0.281591 0.280623 0.279016 0.276861 0.274268 0.27135 0.268223 0.264996 0.261765 0.25861 0.255593 0.25276 0.250144 0.247757 0.245607 0.24369 0.241997 0.240515 0.239228 0.23812 0.237174 0.236373 0.215739 0.216072 0.216658 0.217534 0.218742 0.22032 0.222309 0.224744 0.227653 0.231053 0.234947 0.239325 0.244146 0.24935 0.254848 0.260527 0.266242 0.271831 0.277117 0.281915 0.286051 0.289369 0.291746 0.2931 0.293402 0.292673 0.290983 0.288447 0.285207 0.281431 0.277291 0.272954 0.268575 0.264283 0.260184 0.256353 0.25284 0.24967 0.246849 0.244367 0.242208 0.240347 0.238756 0.237408 0.236277 0.235337 0.234565 0.21355 0.213746 0.214224 0.215035 0.216235 0.217885 0.220041 0.222762 0.226098 0.230088 0.234754 0.240094 0.246077 0.25263 0.259646 0.266971 0.274408 0.281723 0.288656 0.294931 0.300286 0.30448 0.307332 0.308728 0.308632 0.307097 0.304251 0.300282 0.295425 0.289931 0.284054 0.278039 0.272097 0.266405 0.261096 0.256257 0.251938 0.24815 0.244876 0.242085 0.239729 0.237762 0.236135 0.234802 0.233721 0.232857 0.232176 0.211034 0.211018 0.211309 0.211978 0.213101 0.21476 0.217045 0.220045 0.223848 0.228527 0.234137 0.2407 0.248197 0.256558 0.265648 0.275265 0.285133 0.294911 0.304206 0.312594 0.319657 0.325024 0.328411 0.329656 0.328741 0.325791 0.321049 0.314851 0.307573 0.299603 0.29131 0.283023 0.27502 0.267526 0.260703 0.25465 0.249405 0.244958 0.241257 0.238227 0.235782 0.23383 0.232295 0.231102 0.230191 0.229512 0.229023 0.207934 0.207604 0.207604 0.20802 0.208956 0.210529 0.21287 0.21612 0.220416 0.225892 0.232657 0.240782 0.250282 0.261095 0.273068 0.285938 0.299321 0.312715 0.325508 0.337022 0.346565 0.353517 0.35742 0.358047 0.355442 0.349907 0.341948 0.332184 0.321256 0.309761 0.298203 0.286987 0.276427 0.266759 0.258152 0.250706 0.244449 0.239342 0.235288 0.232152 0.229788 0.228048 0.226802 0.225943 0.225383 0.225054 0.224902 0.203724 0.202953 0.202516 0.202528 0.203122 0.204465 0.206745 0.210171 0.214967 0.221355 0.229534 0.239659 0.251817 0.26599 0.282031 0.299627 0.318263 0.337195 0.355449 0.371865 0.385217 0.394392 0.3986 0.397538 0.391454 0.381083 0.367494 0.351875 0.335351 0.318844 0.303007 0.288254 0.274812 0.262816 0.252349 0.243471 0.236197 0.230476 0.226177 0.223112 0.221058 0.219789 0.219107 0.218849 0.218889 0.219138 0.219526 0.197768 0.196399 0.195353 0.194768 0.194826 0.195746 0.197797 0.201291 0.206568 0.213986 0.223883 0.236558 0.252234 0.271024 0.292884 0.317537 0.344365 0.372274 0.399611 0.424211 0.443666 0.455819 0.45931 0.45394 0.440674 0.421317 0.39805 0.37302 0.348055 0.324505 0.303181 0.28439 0.268089 0.254064 0.242112 0.232115 0.224033 0.217833 0.213415 0.21058 0.209054 0.208529 0.208716 0.209377 0.210327 0.211441 0.212634 0.189363 0.187232 0.185386 0.183994 0.183286 0.183556 0.185176 0.18859 0.194301 0.202846 0.21477 0.230599 0.250832 0.275929 0.306248 0.341876 0.382286 0.425859 0.469446 0.5084 0.537394 0.551992 0.55026 0.533428 0.505154 0.469915 0.431634 0.393237 0.356862 0.32407 0.295826 0.272397 0.253406 0.238088 0.225639 0.215472 0.207302 0.201067 0.196763 0.194303 0.193455 0.19388 0.195207 0.1971 0.199293 0.201603 0.20391 0.178247 0.175213 0.1724 0.170008 0.168321 0.167721 0.168701 0.171871 0.177925 0.187626 0.201782 0.221285 0.247204 0.280879 0.323889 0.377666 0.442479 0.515787 0.590686 0.655895 0.698489 0.709014 0.686365 0.63887 0.579786 0.519898 0.463469 0.410507 0.361049 0.316588 0.278977 0.249181 0.226887 0.210801 0.199229 0.190655 0.184086 0.179116 0.175738 0.174063 0.17409 0.17561 0.178258 0.181628 0.185363 0.189193 0.192944 0.164852 0.160838 0.156959 0.153442 0.150627 0.148987 0.149152 0.151898 0.158119 0.168803 0.185084 0.208463 0.241177 0.286658 0.349699 0.435598 0.547247 0.680238 0.818403 0.933899 0.99508 0.980941 0.895495 0.771645 0.6552 0.571462 0.508657 0.444965 0.375283 0.307922 0.2517 0.210019 0.181904 0.164643 0.155166 0.150571 0.148541 0.14766 0.147427 0.147981 0.14966 0.152645 0.156828 0.161878 0.167398 0.173039 0.17855 0.151284 0.146333 0.141418 0.136789 0.132836 0.130116 0.129386 0.131568 0.137714 0.14902 0.167061 0.194396 0.235595 0.298595 0.395455 0.540189 0.741355 0.990345 1.25133 1.4617 1.55022 1.47052 1.23669 0.942429 0.735779 0.679422 0.657796 0.577538 0.446845 0.312311 0.209656 0.147901 0.115683 0.0987446 0.0905449 0.0893513 0.0932618 0.0994788 0.105819 0.111483 0.116751 0.122277 0.128516 0.135518 0.143033 0.15071 0.158239 0.142632 0.136938 0.131184 0.125635 0.120716 0.117059 0.115523 0.11716 0.123178 0.135067 0.155175 0.188016 0.24254 0.33507 0.490521 0.737178 1.09183 1.53748 2.00393 2.36917 2.49491 2.29117 1.78436 1.16994 0.845932 0.949891 1.02055 0.880463 0.607206 0.328512 0.139819 0.104746 0.128344 0.129184 0.111092 0.0853024 0.0616005 0.0495038 0.0523388 0.0620998 0.0723207 0.0816503 0.0906265 0.0998411 0.109433 0.119196 0.128819 0.147844 0.141746 0.135505 0.129396 0.123887 0.119704 0.117877 0.119729 0.126883 0.141556 0.167642 0.213036 0.293417 0.436498 0.68295 1.07764 1.6458 2.35634 3.0904 3.64631 3.80071 3.41167 2.52172 1.44682 1.00009 1.39296 1.564 1.31083 0.823038 0.338909 0.0814057 0.227675 0.294566 0.293298 0.257817 0.208147 0.155306 0.106343 0.0665716 0.0407872 0.0332121 0.0386907 0.0479669 0.0582405 0.0691613 0.0804697 0.0917784 0.169331 0.163142 0.156736 0.150416 0.144724 0.140569 0.13934 0.142974 0.153994 0.175885 0.214538 0.281395 0.398337 0.60281 0.948679 1.49442 2.27039 3.22836 4.20064 4.91169 5.06502 4.47907 3.21559 1.69314 1.16111 1.84681 2.09588 1.72208 1.02381 0.345106 0.140781 0.37763 0.4548 0.44166 0.387871 0.319218 0.248043 0.18151 0.124692 0.0805793 0.0496598 0.0306616 0.0229271 0.0259765 0.0352528 0.0468518 0.0590689 0.184026 0.177858 0.171444 0.165099 0.159419 0.155438 0.154804 0.159882 0.173803 0.200802 0.247723 0.327461 0.464304 0.699501 1.09209 1.70562 2.5716 3.63319 4.70118 5.4695 5.61278 4.93551 3.50904 1.79409 1.23607 2.04893 2.32921 1.90289 1.1146 0.353846 0.173953 0.434523 0.513942 0.495187 0.434049 0.358443 0.280989 0.208726 0.146737 0.0980442 0.062881 0.0389036 0.0231115 0.0163461 0.0219604 0.0334346 0.0461109 0.169331 0.163142 0.156736 0.150416 0.144724 0.140569 0.13934 0.142974 0.153994 0.175885 0.214538 0.281395 0.398337 0.60281 0.948679 1.49442 2.27039 3.22836 4.20064 4.91169 5.06502 4.47907 3.21559 1.69314 1.16111 1.84681 2.09588 1.72208 1.02381 0.345106 0.140781 0.37763 0.4548 0.44166 0.387871 0.319218 0.248043 0.18151 0.124692 0.0805793 0.0496598 0.0306616 0.0229271 0.0259765 0.0352528 0.0468518 0.0590689 0.147844 0.141746 0.135505 0.129396 0.123887 0.119704 0.117877 0.119729 0.126883 0.141556 0.167642 0.213036 0.293417 0.436498 0.68295 1.07764 1.6458 2.35634 3.0904 3.64631 3.80071 3.41167 2.52172 1.44682 1.00009 1.39296 1.564 1.31083 0.823038 0.338909 0.0814057 0.227675 0.294566 0.293298 0.257817 0.208147 0.155306 0.106343 0.0665716 0.0407872 0.0332121 0.0386907 0.0479669 0.0582405 0.0691613 0.0804697 0.0917784 0.142632 0.136938 0.131184 0.125635 0.120716 0.117059 0.115523 0.11716 0.123178 0.135067 0.155175 0.188016 0.24254 0.33507 0.490521 0.737178 1.09183 1.53748 2.00393 2.36917 2.49491 2.29117 1.78436 1.16994 0.845932 0.949891 1.02055 0.880463 0.607206 0.328512 0.139819 0.104746 0.128344 0.129184 0.111092 0.0853024 0.0616005 0.0495038 0.0523388 0.0620998 0.0723207 0.0816503 0.0906265 0.0998411 0.109433 0.119196 0.128819 0.151284 0.146333 0.141418 0.136789 0.132836 0.130116 0.129386 0.131568 0.137714 0.14902 0.167061 0.194396 0.235595 0.298595 0.395455 0.540189 0.741355 0.990345 1.25133 1.4617 1.55022 1.47052 1.23669 0.942429 0.735779 0.679422 0.657796 0.577538 0.446845 0.312311 0.209656 0.147901 0.115683 0.0987446 0.0905449 0.0893513 0.0932618 0.0994788 0.105819 0.111483 0.116751 0.122277 0.128516 0.135518 0.143033 0.15071 0.158239 0.164852 0.160838 0.156959 0.153442 0.150627 0.148987 0.149152 0.151898 0.158119 0.168803 0.185084 0.208463 0.241177 0.286658 0.349699 0.435598 0.547247 0.680238 0.818403 0.933899 0.99508 0.980941 0.895495 0.771645 0.6552 0.571462 0.508657 0.444965 0.375283 0.307922 0.2517 0.210019 0.181904 0.164643 0.155166 0.150571 0.148541 0.14766 0.147427 0.147981 0.14966 0.152645 0.156828 0.161878 0.167398 0.173039 0.17855 0.178247 0.175213 0.1724 0.170008 0.168321 0.167721 0.168701 0.171871 0.177925 0.187626 0.201782 0.221285 0.247204 0.280879 0.323889 0.377666 0.442479 0.515787 0.590686 0.655895 0.698489 0.709014 0.686365 0.63887 0.579786 0.519898 0.463469 0.410507 0.361049 0.316588 0.278977 0.249181 0.226887 0.210801 0.199229 0.190655 0.184086 0.179116 0.175738 0.174063 0.17409 0.17561 0.178258 0.181628 0.185363 0.189193 0.192944 0.189363 0.187232 0.185386 0.183994 0.183286 0.183556 0.185176 0.18859 0.194301 0.202846 0.21477 0.230599 0.250832 0.275929 0.306248 0.341876 0.382286 0.425859 0.469446 0.5084 0.537394 0.551992 0.55026 0.533428 0.505154 0.469915 0.431634 0.393237 0.356862 0.32407 0.295826 0.272397 0.253406 0.238088 0.225639 0.215472 0.207302 0.201067 0.196763 0.194303 0.193455 0.19388 0.195207 0.1971 0.199293 0.201603 0.20391 0.197768 0.196399 0.195353 0.194768 0.194826 0.195746 0.197797 0.201291 0.206568 0.213986 0.223883 0.236558 0.252234 0.271024 0.292884 0.317537 0.344365 0.372274 0.399611 0.424211 0.443666 0.455819 0.45931 0.45394 0.440674 0.421317 0.39805 0.37302 0.348055 0.324505 0.303181 0.28439 0.268089 0.254064 0.242112 0.232115 0.224033 0.217833 0.213415 0.21058 0.209054 0.208529 0.208716 0.209377 0.210327 0.211441 0.212634 0.203724 0.202953 0.202516 0.202528 0.203122 0.204465 0.206745 0.210171 0.214967 0.221355 0.229534 0.239659 0.251817 0.26599 0.282031 0.299627 0.318263 0.337195 0.355449 0.371865 0.385217 0.394392 0.3986 0.397538 0.391454 0.381083 0.367494 0.351875 0.335351 0.318844 0.303007 0.288254 0.274812 0.262816 0.252349 0.243471 0.236197 0.230476 0.226177 0.223112 0.221058 0.219789 0.219107 0.218849 0.218889 0.219138 0.219526 0.207934 0.207604 0.207604 0.20802 0.208956 0.210529 0.21287 0.21612 0.220416 0.225892 0.232657 0.240782 0.250282 0.261095 0.273068 0.285938 0.299321 0.312715 0.325508 0.337022 0.346565 0.353517 0.35742 0.358047 0.355442 0.349907 0.341948 0.332184 0.321256 0.309761 0.298203 0.286987 0.276427 0.266759 0.258152 0.250706 0.244449 0.239342 0.235288 0.232152 0.229788 0.228048 0.226802 0.225943 0.225383 0.225054 0.224902 0.211034 0.211018 0.211309 0.211978 0.213101 0.21476 0.217045 0.220045 0.223848 0.228527 0.234137 0.2407 0.248197 0.256558 0.265648 0.275265 0.285133 0.294911 0.304206 0.312594 0.319657 0.325024 0.328411 0.329656 0.328741 0.325791 0.321049 0.314851 0.307573 0.299603 0.29131 0.283023 0.27502 0.267526 0.260703 0.25465 0.249405 0.244958 0.241257 0.238227 0.235782 0.23383 0.232295 0.231102 0.230191 0.229512 0.229023 0.21355 0.213746 0.214224 0.215035 0.216235 0.217885 0.220041 0.222762 0.226098 0.230088 0.234754 0.240094 0.246077 0.25263 0.259646 0.266971 0.274408 0.281723 0.288656 0.294931 0.300286 0.30448 0.307332 0.308728 0.308632 0.307097 0.304251 0.300282 0.295425 0.289931 0.284054 0.278039 0.272097 0.266405 0.261096 0.256257 0.251938 0.24815 0.244876 0.242085 0.239729 0.237762 0.236135 0.234802 0.233721 0.232857 0.232176 0.215739 0.216072 0.216658 0.217534 0.218742 0.22032 0.222309 0.224744 0.227653 0.231053 0.234947 0.239325 0.244146 0.24935 0.254848 0.260527 0.266242 0.271831 0.277117 0.281915 0.286051 0.289369 0.291746 0.2931 0.293402 0.292673 0.290983 0.288447 0.285207 0.281431 0.277291 0.272954 0.268575 0.264283 0.260184 0.256353 0.25284 0.24967 0.246849 0.244367 0.242208 0.240347 0.238756 0.237408 0.236277 0.235337 0.234565 0.217748 0.218166 0.218806 0.219696 0.220865 0.222341 0.224148 0.226307 0.228833 0.231731 0.234994 0.238605 0.242527 0.24671 0.251081 0.255552 0.260021 0.264371 0.268478 0.272217 0.275468 0.278128 0.280109 0.281359 0.281849 0.281591 0.280623 0.279016 0.276861 0.274268 0.27135 0.268223 0.264996 0.261765 0.25861 0.255593 0.25276 0.250144 0.247757 0.245607 0.24369 0.241997 0.240515 0.239228 0.23812 0.237174 0.236373 0.219599 0.220064 0.22072 0.22159 0.222693 0.22405 0.225674 0.227576 0.229764 0.232234 0.234979 0.237977 0.241195 0.244591 0.248108 0.251681 0.25523 0.258674 0.261923 0.264889 0.267491 0.269654 0.271321 0.27245 0.273022 0.273041 0.27253 0.271532 0.270106 0.268324 0.266263 0.264002 0.261618 0.259181 0.256753 0.254385 0.252116 0.249976 0.247984 0.246153 0.244488 0.242988 0.241648 0.240461 0.239419 0.23851 0.237724 0.221311 0.221794 0.222441 0.223271 0.224295 0.225526 0.226973 0.228643 0.230535 0.232644 0.234959 0.23746 0.240121 0.242904 0.245766 0.248655 0.251514 0.25428 0.25689 0.259282 0.261396 0.26318 0.264594 0.265606 0.266203 0.266384 0.266163 0.265567 0.264635 0.263414 0.261958 0.26032 0.258555 0.256715 0.254847 0.252991 0.251181 0.249442 0.247796 0.246257 0.244831 0.243526 0.242339 0.24127 0.240315 0.239467 0.238721 0.295326 0.295877 0.296637 0.297625 0.298858 0.300356 0.302129 0.304187 0.306532 0.30916 0.312058 0.315203 0.318563 0.322095 0.325745 0.329446 0.333129 0.336715 0.340124 0.343274 0.346088 0.348501 0.350454 0.351909 0.352843 0.353249 0.353144 0.352556 0.351533 0.350131 0.348415 0.346452 0.344312 0.342058 0.339751 0.337442 0.335176 0.332986 0.330901 0.32894 0.327115 0.325434 0.323897 0.322505 0.321253 0.320136 0.319145 0.29312 0.293638 0.294397 0.295423 0.296744 0.298385 0.300366 0.302702 0.305406 0.308476 0.311903 0.315663 0.31972 0.324021 0.328497 0.333067 0.337633 0.342091 0.346328 0.350231 0.353694 0.356622 0.358934 0.360579 0.361522 0.361765 0.361331 0.36027 0.358654 0.356568 0.354107 0.35137 0.348454 0.345447 0.342429 0.339465 0.336607 0.333896 0.331359 0.329013 0.326867 0.324922 0.323175 0.321617 0.320239 0.319029 0.317975 0.290749 0.291198 0.291923 0.29296 0.294347 0.296121 0.298313 0.300954 0.304064 0.307653 0.311717 0.316238 0.321171 0.326457 0.332009 0.337719 0.343458 0.349079 0.354426 0.359339 0.363665 0.367265 0.370028 0.371878 0.372772 0.372717 0.371755 0.369968 0.367467 0.364384 0.360861 0.357042 0.353066 0.349051 0.345105 0.341308 0.337721 0.334387 0.331327 0.328554 0.326066 0.323854 0.321904 0.320197 0.318718 0.317443 0.316353 0.288194 0.288524 0.289165 0.290168 0.291583 0.293465 0.295864 0.298827 0.302394 0.306591 0.311428 0.316891 0.322942 0.329506 0.336478 0.343714 0.351039 0.358247 0.365116 0.37141 0.376905 0.381399 0.384727 0.386781 0.387508 0.386927 0.385117 0.38221 0.378381 0.373837 0.36879 0.363452 0.358017 0.352653 0.347496 0.342646 0.338171 0.334107 0.330466 0.327242 0.324416 0.321962 0.319846 0.318038 0.316506 0.315216 0.314143 0.285434 0.285575 0.286063 0.286962 0.288347 0.29029 0.29287 0.296163 0.300235 0.305143 0.310919 0.317569 0.325058 0.333307 0.342182 0.351495 0.361003 0.370415 0.379401 0.387612 0.394712 0.400394 0.404414 0.406615 0.406939 0.405436 0.402249 0.397605 0.391786 0.385106 0.377883 0.370425 0.363003 0.355846 0.349127 0.342965 0.337429 0.33254 0.328285 0.324626 0.321513 0.318888 0.316693 0.314872 0.313376 0.312158 0.31118 0.282272 0.28213 0.282364 0.283062 0.28432 0.286244 0.28895 0.292555 0.297173 0.302905 0.309826 0.317976 0.327338 0.337834 0.349302 0.361494 0.37407 0.386605 0.398604 0.409535 0.418871 0.426134 0.430953 0.433108 0.432548 0.429403 0.423954 0.416595 0.407791 0.398021 0.387752 0.377407 0.367348 0.357868 0.349181 0.341425 0.33466 0.328878 0.324024 0.320012 0.316734 0.314086 0.311966 0.31029 0.308979 0.307971 0.307215 0.278373 0.277821 0.277666 0.278019 0.27901 0.280789 0.283522 0.287388 0.292574 0.299251 0.307568 0.317625 0.329452 0.342984 0.358034 0.374282 0.39125 0.408315 0.424716 0.439608 0.45213 0.461507 0.467149 0.468748 0.466316 0.460176 0.450904 0.439232 0.42594 0.41177 0.39737 0.383274 0.369907 0.357593 0.346564 0.336961 0.328831 0.322137 0.316764 0.312551 0.309319 0.306886 0.305092 0.303801 0.302905 0.302315 0.301965 0.273043 0.271916 0.271189 0.271003 0.271529 0.272973 0.275575 0.279604 0.285347 0.293093 0.303107 0.315594 0.330673 0.348332 0.368389 0.390455 0.413885 0.437754 0.460862 0.481791 0.499054 0.5113 0.517558 0.51742 0.511114 0.499437 0.483587 0.464946 0.444855 0.424464 0.40464 0.385969 0.368813 0.353399 0.339876 0.328336 0.318811 0.31124 0.30547 0.301268 0.298357 0.296463 0.295335 0.294768 0.294605 0.294725 0.295045 0.265432 0.263535 0.262017 0.261052 0.26086 0.261723 0.263976 0.268014 0.274275 0.283214 0.295272 0.310834 0.330184 0.353458 0.380585 0.41119 0.444477 0.47908 0.512988 0.543615 0.568135 0.584042 0.589757 0.585002 0.570788 0.54905 0.522169 0.492556 0.46237 0.433314 0.40652 0.382549 0.361511 0.343268 0.32764 0.314507 0.303821 0.295531 0.289506 0.285499 0.283174 0.282148 0.282064 0.282618 0.283577 0.284777 0.286105 0.254606 0.251733 0.249186 0.247176 0.245984 0.245977 0.247619 0.251469 0.258167 0.268395 0.282847 0.302186 0.327021 0.35788 0.395126 0.438759 0.488022 0.540872 0.59354 0.640598 0.675958 0.694682 0.694727 0.677574 0.647219 0.608327 0.564874 0.519948 0.476098 0.435492 0.399699 0.369429 0.344517 0.324219 0.307636 0.294058 0.283103 0.27465 0.268665 0.265026 0.26345 0.263528 0.264802 0.266852 0.269342 0.272032 0.274762 0.240212 0.236192 0.232414 0.229124 0.22667 0.225523 0.226297 0.22975 0.236764 0.248299 0.265376 0.2891 0.320738 0.361817 0.414065 0.478959 0.55657 0.643707 0.732202 0.808963 0.859272 0.872786 0.84912 0.798614 0.736243 0.67266 0.610532 0.548804 0.488075 0.431453 0.382398 0.342869 0.312878 0.290978 0.275096 0.26329 0.254232 0.247312 0.24244 0.239713 0.239133 0.240463 0.243281 0.247093 0.251454 0.256018 0.260548 0.22283 0.217576 0.212456 0.207748 0.203864 0.201388 0.201094 0.203948 0.211074 0.223721 0.243317 0.271682 0.311448 0.366546 0.4424 0.544945 0.677293 0.834066 0.996182 1.13101 1.20184 1.18518 1.08816 0.952692 0.83314 0.75247 0.688031 0.612075 0.521774 0.431217 0.354167 0.296414 0.257182 0.232879 0.219284 0.212433 0.209183 0.207567 0.206812 0.206991 0.208501 0.211603 0.216228 0.22202 0.228514 0.235276 0.241975 0.205286 0.198871 0.192473 0.186397 0.181115 0.177312 0.175909 0.178048 0.185055 0.198449 0.220202 0.2534 0.303419 0.379485 0.495583 0.668038 0.906826 1.20168 1.51015 1.7582 1.86168 1.76644 1.49217 1.15865 0.949722 0.918684 0.907191 0.807321 0.635222 0.452988 0.308874 0.217501 0.167636 0.14212 0.13103 0.130155 0.13589 0.144342 0.152711 0.159961 0.166419 0.172939 0.180194 0.188379 0.197281 0.206507 0.215678 0.194391 0.187089 0.179698 0.172544 0.166147 0.161278 0.158978 0.160544 0.167494 0.181722 0.206162 0.246273 0.312688 0.424673 0.611682 0.907257 1.33125 1.86335 2.42029 2.85753 3.01069 2.77136 2.17015 1.44954 1.10743 1.27243 1.37677 1.2078 0.858999 0.491819 0.225261 0.129344 0.144113 0.147027 0.127315 0.0979657 0.0731196 0.066245 0.0769206 0.0927548 0.107228 0.119547 0.13078 0.141959 0.153504 0.165317 0.177078 0.202003 0.194258 0.186341 0.178599 0.171612 0.166268 0.163821 0.165894 0.174515 0.192494 0.22468 0.28069 0.37938 0.553905 0.85279 1.32932 2.01308 2.86675 3.7496 4.4231 4.62149 4.17132 3.11492 1.82823 1.30151 1.80239 2.04857 1.75839 1.15039 0.524253 0.115563 0.245517 0.344071 0.352621 0.313453 0.25326 0.187191 0.125155 0.0752467 0.046956 0.0468178 0.0595317 0.0732671 0.0865984 0.100071 0.113867 0.127735 0.23112 0.223309 0.21525 0.207324 0.200215 0.19504 0.193503 0.197979 0.211625 0.238861 0.287076 0.370321 0.515117 0.766496 1.18878 1.85121 2.78896 3.94412 5.11834 5.98618 6.19512 5.52175 4.02407 2.18583 1.48065 2.32574 2.69493 2.27906 1.41943 0.549199 0.112968 0.427767 0.546903 0.543832 0.483043 0.399373 0.310044 0.225161 0.151937 0.0950129 0.0563572 0.0365751 0.0343447 0.0423768 0.054607 0.0687568 0.0836771 0.250869 0.243104 0.235052 0.227119 0.220051 0.215125 0.214358 0.220661 0.237962 0.271655 0.330378 0.430024 0.600089 0.890197 1.3708 2.11701 3.16513 4.44687 5.73846 6.67867 6.88066 6.10336 4.41324 2.33771 1.55901 2.55602 2.97688 2.50722 1.54059 0.567618 0.141701 0.497374 0.621715 0.612764 0.543253 0.451023 0.353806 0.261618 0.181685 0.118576 0.0734751 0.0445372 0.029327 0.0278194 0.0369877 0.0508184 0.0661542 0.23112 0.223309 0.21525 0.207324 0.200215 0.19504 0.193503 0.197979 0.211625 0.238861 0.287076 0.370321 0.515117 0.766496 1.18878 1.85121 2.78896 3.94412 5.11834 5.98618 6.19512 5.52175 4.02407 2.18583 1.48065 2.32574 2.69493 2.27906 1.41943 0.549199 0.112968 0.427767 0.546903 0.543832 0.483043 0.399373 0.310044 0.225161 0.151937 0.0950129 0.0563572 0.0365751 0.0343447 0.0423768 0.054607 0.0687568 0.0836771 0.202003 0.194258 0.186341 0.178599 0.171612 0.166268 0.163821 0.165894 0.174515 0.192494 0.22468 0.28069 0.37938 0.553905 0.85279 1.32932 2.01308 2.86675 3.7496 4.4231 4.62149 4.17132 3.11492 1.82823 1.30151 1.80239 2.04857 1.75839 1.15039 0.524253 0.115563 0.245517 0.344071 0.352621 0.313453 0.25326 0.187191 0.125155 0.0752467 0.046956 0.0468178 0.0595317 0.0732671 0.0865984 0.100071 0.113867 0.127735 0.194391 0.187089 0.179698 0.172544 0.166147 0.161278 0.158978 0.160544 0.167494 0.181722 0.206162 0.246273 0.312688 0.424673 0.611682 0.907257 1.33125 1.86335 2.42029 2.85753 3.01069 2.77136 2.17015 1.44954 1.10743 1.27243 1.37677 1.2078 0.858999 0.491819 0.225261 0.129344 0.144113 0.147027 0.127315 0.0979657 0.0731196 0.066245 0.0769206 0.0927548 0.107228 0.119547 0.13078 0.141959 0.153504 0.165317 0.177078 0.205286 0.198871 0.192473 0.186397 0.181115 0.177312 0.175909 0.178048 0.185055 0.198449 0.220202 0.2534 0.303419 0.379485 0.495583 0.668038 0.906826 1.20168 1.51015 1.7582 1.86168 1.76644 1.49217 1.15865 0.949722 0.918684 0.907191 0.807321 0.635222 0.452988 0.308874 0.217501 0.167636 0.14212 0.13103 0.130155 0.13589 0.144342 0.152711 0.159961 0.166419 0.172939 0.180194 0.188379 0.197281 0.206507 0.215678 0.22283 0.217576 0.212456 0.207748 0.203864 0.201388 0.201094 0.203948 0.211074 0.223721 0.243317 0.271682 0.311448 0.366546 0.4424 0.544945 0.677293 0.834066 0.996182 1.13101 1.20184 1.18518 1.08816 0.952692 0.83314 0.75247 0.688031 0.612075 0.521774 0.431217 0.354167 0.296414 0.257182 0.232879 0.219284 0.212433 0.209183 0.207567 0.206812 0.206991 0.208501 0.211603 0.216228 0.22202 0.228514 0.235276 0.241975 0.240212 0.236192 0.232414 0.229124 0.22667 0.225523 0.226297 0.22975 0.236764 0.248299 0.265376 0.2891 0.320738 0.361817 0.414065 0.478959 0.55657 0.643707 0.732202 0.808963 0.859272 0.872786 0.84912 0.798614 0.736243 0.67266 0.610532 0.548804 0.488075 0.431453 0.382398 0.342869 0.312878 0.290978 0.275096 0.26329 0.254232 0.247312 0.24244 0.239713 0.239133 0.240463 0.243281 0.247093 0.251454 0.256018 0.260548 0.254606 0.251733 0.249186 0.247176 0.245984 0.245977 0.247619 0.251469 0.258167 0.268395 0.282847 0.302186 0.327021 0.35788 0.395126 0.438759 0.488022 0.540872 0.59354 0.640598 0.675958 0.694682 0.694727 0.677574 0.647219 0.608327 0.564874 0.519948 0.476098 0.435492 0.399699 0.369429 0.344517 0.324219 0.307636 0.294058 0.283103 0.27465 0.268665 0.265026 0.26345 0.263528 0.264802 0.266852 0.269342 0.272032 0.274762 0.265432 0.263535 0.262017 0.261052 0.26086 0.261723 0.263976 0.268014 0.274275 0.283214 0.295272 0.310834 0.330184 0.353458 0.380585 0.41119 0.444477 0.47908 0.512988 0.543615 0.568135 0.584042 0.589757 0.585002 0.570788 0.54905 0.522169 0.492556 0.46237 0.433314 0.40652 0.382549 0.361511 0.343268 0.32764 0.314507 0.303821 0.295531 0.289506 0.285499 0.283174 0.282148 0.282064 0.282618 0.283577 0.284777 0.286105 0.273043 0.271916 0.271189 0.271003 0.271529 0.272973 0.275575 0.279604 0.285347 0.293093 0.303107 0.315594 0.330673 0.348332 0.368389 0.390455 0.413885 0.437754 0.460862 0.481791 0.499054 0.5113 0.517558 0.51742 0.511114 0.499437 0.483587 0.464946 0.444855 0.424464 0.40464 0.385969 0.368813 0.353399 0.339876 0.328336 0.318811 0.31124 0.30547 0.301268 0.298357 0.296463 0.295335 0.294768 0.294605 0.294725 0.295045 0.278373 0.277821 0.277666 0.278019 0.27901 0.280789 0.283522 0.287388 0.292574 0.299251 0.307568 0.317625 0.329452 0.342984 0.358034 0.374282 0.39125 0.408315 0.424716 0.439608 0.45213 0.461507 0.467149 0.468748 0.466316 0.460176 0.450904 0.439232 0.42594 0.41177 0.39737 0.383274 0.369907 0.357593 0.346564 0.336961 0.328831 0.322137 0.316764 0.312551 0.309319 0.306886 0.305092 0.303801 0.302905 0.302315 0.301965 0.282272 0.28213 0.282364 0.283062 0.28432 0.286244 0.28895 0.292555 0.297173 0.302905 0.309826 0.317976 0.327338 0.337834 0.349302 0.361494 0.37407 0.386605 0.398604 0.409535 0.418871 0.426134 0.430953 0.433108 0.432548 0.429403 0.423954 0.416595 0.407791 0.398021 0.387752 0.377407 0.367348 0.357868 0.349181 0.341425 0.33466 0.328878 0.324024 0.320012 0.316734 0.314086 0.311966 0.31029 0.308979 0.307971 0.307215 0.285434 0.285575 0.286063 0.286962 0.288347 0.29029 0.29287 0.296163 0.300235 0.305143 0.310919 0.317569 0.325058 0.333307 0.342182 0.351495 0.361003 0.370415 0.379401 0.387612 0.394712 0.400394 0.404414 0.406615 0.406939 0.405436 0.402249 0.397605 0.391786 0.385106 0.377883 0.370425 0.363003 0.355846 0.349127 0.342965 0.337429 0.33254 0.328285 0.324626 0.321513 0.318888 0.316693 0.314872 0.313376 0.312158 0.31118 0.288194 0.288524 0.289165 0.290168 0.291583 0.293465 0.295864 0.298827 0.302394 0.306591 0.311428 0.316891 0.322942 0.329506 0.336478 0.343714 0.351039 0.358247 0.365116 0.37141 0.376905 0.381399 0.384727 0.386781 0.387508 0.386927 0.385117 0.38221 0.378381 0.373837 0.36879 0.363452 0.358017 0.352653 0.347496 0.342646 0.338171 0.334107 0.330466 0.327242 0.324416 0.321962 0.319846 0.318038 0.316506 0.315216 0.314143 0.290749 0.291198 0.291923 0.29296 0.294347 0.296121 0.298313 0.300954 0.304064 0.307653 0.311717 0.316238 0.321171 0.326457 0.332009 0.337719 0.343458 0.349079 0.354426 0.359339 0.363665 0.367265 0.370028 0.371878 0.372772 0.372717 0.371755 0.369968 0.367467 0.364384 0.360861 0.357042 0.353066 0.349051 0.345105 0.341308 0.337721 0.334387 0.331327 0.328554 0.326066 0.323854 0.321904 0.320197 0.318718 0.317443 0.316353 0.29312 0.293638 0.294397 0.295423 0.296744 0.298385 0.300366 0.302702 0.305406 0.308476 0.311903 0.315663 0.31972 0.324021 0.328497 0.333067 0.337633 0.342091 0.346328 0.350231 0.353694 0.356622 0.358934 0.360579 0.361522 0.361765 0.361331 0.36027 0.358654 0.356568 0.354107 0.35137 0.348454 0.345447 0.342429 0.339465 0.336607 0.333896 0.331359 0.329013 0.326867 0.324922 0.323175 0.321617 0.320239 0.319029 0.317975 0.295326 0.295877 0.296637 0.297625 0.298858 0.300356 0.302129 0.304187 0.306532 0.30916 0.312058 0.315203 0.318563 0.322095 0.325745 0.329446 0.333129 0.336715 0.340124 0.343274 0.346088 0.348501 0.350454 0.351909 0.352843 0.353249 0.353144 0.352556 0.351533 0.350131 0.348415 0.346452 0.344312 0.342058 0.339751 0.337442 0.335176 0.332986 0.330901 0.32894 0.327115 0.325434 0.323897 0.322505 0.321253 0.320136 0.319145 0.369559 0.370137 0.37096 0.372052 0.373435 0.375131 0.377157 0.379524 0.382238 0.385296 0.388685 0.392381 0.39635 0.400539 0.40489 0.409328 0.413768 0.418118 0.422283 0.426163 0.429671 0.43272 0.435241 0.437182 0.438511 0.439218 0.439313 0.438831 0.437818 0.436342 0.434473 0.432293 0.429879 0.427308 0.424652 0.421973 0.419324 0.416748 0.414281 0.411945 0.40976 0.407734 0.405874 0.404179 0.402645 0.401267 0.400038 0.366899 0.367426 0.368234 0.369356 0.370826 0.372673 0.374925 0.377602 0.38072 0.384281 0.388278 0.392687 0.397467 0.40256 0.407888 0.413356 0.418852 0.424251 0.429421 0.434228 0.438541 0.442244 0.44524 0.447455 0.44885 0.449414 0.449171 0.448173 0.446498 0.444243 0.441519 0.438441 0.435118 0.43166 0.42816 0.424696 0.421335 0.418126 0.415104 0.412293 0.409706 0.407348 0.405215 0.403302 0.401599 0.400093 0.39877 0.36406 0.364492 0.365243 0.366361 0.367888 0.36987 0.372348 0.375361 0.378934 0.383084 0.387811 0.393097 0.398895 0.405141 0.411737 0.418556 0.425451 0.432248 0.438764 0.444806 0.450189 0.454747 0.458339 0.460865 0.462269 0.462547 0.461742 0.45994 0.457266 0.45387 0.449916 0.445574 0.441005 0.436353 0.431744 0.427279 0.423034 0.419061 0.415394 0.412048 0.409027 0.406323 0.403923 0.401809 0.399959 0.398352 0.396968 0.361025 0.3613 0.361935 0.362991 0.364527 0.366611 0.369304 0.372665 0.376745 0.38158 0.387188 0.39356 0.400656 0.408395 0.416659 0.425285 0.434068 0.442768 0.451121 0.458849 0.465681 0.471372 0.475716 0.478573 0.47987 0.479615 0.477885 0.474827 0.470639 0.465557 0.459828 0.453701 0.447406 0.441145 0.435083 0.429343 0.424013 0.419139 0.414744 0.410826 0.407367 0.404339 0.401709 0.39944 0.397498 0.395848 0.394457 0.357772 0.357807 0.358242 0.359152 0.360624 0.362748 0.365619 0.369329 0.373964 0.379595 0.386271 0.394005 0.402765 0.412468 0.422965 0.434043 0.445418 0.45675 0.467652 0.477713 0.486526 0.493721 0.498996 0.502151 0.503097 0.501869 0.49862 0.493597 0.487122 0.479557 0.471277 0.462645 0.453984 0.445572 0.437623 0.430285 0.423647 0.417743 0.412567 0.408082 0.404233 0.400956 0.398188 0.395867 0.393934 0.392337 0.391032 0.354063 0.353746 0.353859 0.354504 0.355793 0.357858 0.360833 0.364862 0.370088 0.376636 0.384607 0.394057 0.404982 0.417299 0.430829 0.445289 0.460287 0.47533 0.489836 0.503182 0.514738 0.523933 0.530313 0.533592 0.533679 0.530691 0.524927 0.516821 0.506902 0.495729 0.483854 0.471784 0.45996 0.448741 0.438394 0.429095 0.420927 0.413893 0.407937 0.402965 0.398858 0.395499 0.392772 0.390577 0.388826 0.387447 0.386376 0.349484 0.348664 0.348293 0.3485 0.349437 0.351285 0.354239 0.358517 0.364345 0.371938 0.381481 0.393107 0.406868 0.422699 0.440396 0.45959 0.479734 0.5001 0.519807 0.537868 0.553278 0.565125 0.5727 0.575605 0.573797 0.567592 0.557596 0.544612 0.529526 0.513203 0.496423 0.479847 0.464009 0.449321 0.436087 0.424489 0.4146 0.406385 0.399722 0.39443 0.390303 0.387135 0.384739 0.382956 0.381658 0.380742 0.380128 0.343171 0.341653 0.340582 0.340121 0.340469 0.341869 0.344606 0.349002 0.355405 0.364165 0.375607 0.389992 0.407474 0.428053 0.451523 0.477433 0.505034 0.533252 0.560705 0.585769 0.606751 0.622112 0.630728 0.632074 0.626314 0.614232 0.597072 0.576319 0.553481 0.529902 0.506652 0.484506 0.463981 0.445413 0.42903 0.414969 0.40328 0.3939 0.386653 0.381272 0.377441 0.374838 0.373172 0.372201 0.371735 0.371633 0.371794 0.334063 0.331619 0.32959 0.328175 0.327634 0.328292 0.330549 0.33487 0.341781 0.351827 0.365546 0.383402 0.40574 0.432721 0.464245 0.499854 0.538593 0.578871 0.618398 0.654286 0.683431 0.703107 0.711587 0.708501 0.694781 0.672303 0.643444 0.610716 0.576512 0.542857 0.511233 0.482504 0.456997 0.434708 0.415515 0.399315 0.386057 0.375666 0.367983 0.362718 0.359475 0.357814 0.357314 0.357618 0.358447 0.359602 0.360944 0.320995 0.317383 0.314118 0.311441 0.309678 0.309256 0.310719 0.314726 0.322033 0.333456 0.349823 0.371921 0.400455 0.435998 0.478894 0.529024 0.585401 0.645622 0.70545 0.758964 0.799693 0.822543 0.825567 0.810403 0.780997 0.74165 0.695909 0.646728 0.597009 0.549601 0.50681 0.46993 0.439133 0.413797 0.392996 0.375925 0.362109 0.351355 0.343579 0.338614 0.336133 0.335663 0.336672 0.338673 0.341265 0.344154 0.347142 0.303523 0.298546 0.293816 0.289611 0.286331 0.284522 0.284899 0.288348 0.295908 0.30872 0.327994 0.355012 0.391199 0.438189 0.497747 0.571261 0.658508 0.755715 0.8538 0.938579 0.994492 1.01124 0.98965 0.941754 0.882986 0.822153 0.759153 0.691636 0.621114 0.552822 0.492252 0.442645 0.404504 0.376336 0.35574 0.340381 0.328588 0.319521 0.312967 0.308983 0.307551 0.308417 0.311111 0.315076 0.319788 0.324834 0.329922 0.282375 0.275948 0.269638 0.263764 0.258798 0.25541 0.254497 0.257182 0.264788 0.278795 0.300885 0.333145 0.378488 0.441147 0.526852 0.641769 0.788924 0.962074 1.14006 1.28712 1.36358 1.34547 1.24422 1.11016 1.00264 0.936859 0.877405 0.792032 0.681655 0.567091 0.467789 0.392472 0.340835 0.308462 0.289945 0.280222 0.275287 0.272587 0.271024 0.27056 0.271605 0.274486 0.279178 0.285327 0.292419 0.299956 0.307536 0.261115 0.253345 0.245563 0.238119 0.231554 0.226651 0.224468 0.226334 0.233802 0.24868 0.273281 0.311118 0.368151 0.454433 0.585128 0.777948 1.04364 1.37059 1.71153 1.98443 2.09641 1.98892 1.68879 1.34118 1.15777 1.16745 1.17225 1.05601 0.843817 0.613102 0.425162 0.301159 0.230839 0.194743 0.179557 0.178202 0.185146 0.195343 0.205359 0.213878 0.221217 0.228382 0.236246 0.24516 0.254981 0.26531 0.275716 0.248291 0.239531 0.230656 0.22204 0.214282 0.208263 0.205178 0.206522 0.214078 0.230102 0.258026 0.304076 0.380129 0.507505 0.718779 1.05108 1.5262 2.12111 2.74301 3.23135 3.40332 3.13751 2.46888 1.68251 1.36101 1.59831 1.74121 1.5512 1.13384 0.680819 0.335601 0.170181 0.156298 0.157566 0.13719 0.107078 0.0858821 0.0883295 0.107485 0.129152 0.147617 0.162655 0.175806 0.188521 0.201527 0.214879 0.228294 0.258631 0.249429 0.240036 0.230861 0.222582 0.216224 0.213228 0.215468 0.22533 0.246143 0.283583 0.348663 0.462677 0.662806 1.00324 1.54308 2.31444 3.27486 4.2676 5.0282 5.26098 4.76909 3.59264 2.15402 1.58813 2.19314 2.51948 2.21058 1.50039 0.741422 0.198168 0.242503 0.373123 0.395142 0.355405 0.287118 0.209745 0.136297 0.0785062 0.0535142 0.0650769 0.0851894 0.103208 0.119323 0.134939 0.15072 0.166628 0.295616 0.286395 0.276908 0.267615 0.259319 0.253327 0.251606 0.256917 0.272978 0.30505 0.36183 0.45954 0.628352 0.919023 1.40343 2.15804 3.22045 4.52463 5.8499 6.83607 7.09138 6.36116 4.69582 2.62222 1.7792 2.75758 3.25402 2.82661 1.83582 0.790168 0.105478 0.44694 0.613839 0.626456 0.562903 0.46731 0.362146 0.260659 0.172306 0.103643 0.0592139 0.0434251 0.0495612 0.0625327 0.0774888 0.0937729 0.110872 0.320507 0.311359 0.301905 0.29263 0.28442 0.278764 0.278001 0.285519 0.305955 0.345759 0.41516 0.532578 0.731629 1.06827 1.62114 2.47299 3.6623 5.11111 6.57058 7.64112 7.89312 7.05139 5.173 2.82664 1.85858 3.00236 3.57222 3.09542 1.98614 0.820128 0.100299 0.526673 0.70286 0.709987 0.636734 0.531212 0.416713 0.306459 0.209925 0.133372 0.0794103 0.0479461 0.0376614 0.0427621 0.0552196 0.0711007 0.0885749 0.295616 0.286395 0.276908 0.267615 0.259319 0.253327 0.251606 0.256917 0.272978 0.30505 0.36183 0.45954 0.628352 0.919023 1.40343 2.15804 3.22045 4.52463 5.8499 6.83607 7.09138 6.36116 4.69582 2.62222 1.7792 2.75758 3.25402 2.82661 1.83582 0.790168 0.105478 0.44694 0.613839 0.626456 0.562903 0.46731 0.362146 0.260659 0.172306 0.103643 0.0592139 0.0434251 0.0495612 0.0625327 0.0774888 0.0937729 0.110872 0.258631 0.249429 0.240036 0.230861 0.222582 0.216224 0.213228 0.215468 0.22533 0.246143 0.283583 0.348663 0.462677 0.662806 1.00324 1.54308 2.31444 3.27486 4.2676 5.0282 5.26098 4.76909 3.59264 2.15402 1.58813 2.19314 2.51948 2.21058 1.50039 0.741422 0.198168 0.242503 0.373123 0.395142 0.355405 0.287118 0.209745 0.136297 0.0785062 0.0535142 0.0650769 0.0851894 0.103208 0.119323 0.134939 0.15072 0.166628 0.248291 0.239531 0.230656 0.22204 0.214282 0.208263 0.205178 0.206522 0.214078 0.230102 0.258026 0.304076 0.380129 0.507505 0.718779 1.05108 1.5262 2.12111 2.74301 3.23135 3.40332 3.13751 2.46888 1.68251 1.36101 1.59831 1.74121 1.5512 1.13384 0.680819 0.335601 0.170181 0.156298 0.157566 0.13719 0.107078 0.0858821 0.0883295 0.107485 0.129152 0.147617 0.162655 0.175806 0.188521 0.201527 0.214879 0.228294 0.261115 0.253345 0.245563 0.238119 0.231554 0.226651 0.224468 0.226334 0.233802 0.24868 0.273281 0.311118 0.368151 0.454433 0.585128 0.777948 1.04364 1.37059 1.71153 1.98443 2.09641 1.98892 1.68879 1.34118 1.15777 1.16745 1.17225 1.05601 0.843817 0.613102 0.425162 0.301159 0.230839 0.194743 0.179557 0.178202 0.185146 0.195343 0.205359 0.213878 0.221217 0.228382 0.236246 0.24516 0.254981 0.26531 0.275716 0.282375 0.275948 0.269638 0.263764 0.258798 0.25541 0.254497 0.257182 0.264788 0.278795 0.300885 0.333145 0.378488 0.441147 0.526852 0.641769 0.788924 0.962074 1.14006 1.28712 1.36358 1.34547 1.24422 1.11016 1.00264 0.936859 0.877405 0.792032 0.681655 0.567091 0.467789 0.392472 0.340835 0.308462 0.289945 0.280222 0.275287 0.272587 0.271024 0.27056 0.271605 0.274486 0.279178 0.285327 0.292419 0.299956 0.307536 0.303523 0.298546 0.293816 0.289611 0.286331 0.284522 0.284899 0.288348 0.295908 0.30872 0.327994 0.355012 0.391199 0.438189 0.497747 0.571261 0.658508 0.755715 0.8538 0.938579 0.994492 1.01124 0.98965 0.941754 0.882986 0.822153 0.759153 0.691636 0.621114 0.552822 0.492252 0.442645 0.404504 0.376336 0.35574 0.340381 0.328588 0.319521 0.312967 0.308983 0.307551 0.308417 0.311111 0.315076 0.319788 0.324834 0.329922 0.320995 0.317383 0.314118 0.311441 0.309678 0.309256 0.310719 0.314726 0.322033 0.333456 0.349823 0.371921 0.400455 0.435998 0.478894 0.529024 0.585401 0.645622 0.70545 0.758964 0.799693 0.822543 0.825567 0.810403 0.780997 0.74165 0.695909 0.646728 0.597009 0.549601 0.50681 0.46993 0.439133 0.413797 0.392996 0.375925 0.362109 0.351355 0.343579 0.338614 0.336133 0.335663 0.336672 0.338673 0.341265 0.344154 0.347142 0.334063 0.331619 0.32959 0.328175 0.327634 0.328292 0.330549 0.33487 0.341781 0.351827 0.365546 0.383402 0.40574 0.432721 0.464245 0.499854 0.538593 0.578871 0.618398 0.654286 0.683431 0.703107 0.711587 0.708501 0.694781 0.672303 0.643444 0.610716 0.576512 0.542857 0.511233 0.482504 0.456997 0.434708 0.415515 0.399315 0.386057 0.375666 0.367983 0.362718 0.359475 0.357814 0.357314 0.357618 0.358447 0.359602 0.360944 0.343171 0.341653 0.340582 0.340121 0.340469 0.341869 0.344606 0.349002 0.355405 0.364165 0.375607 0.389992 0.407474 0.428053 0.451523 0.477433 0.505034 0.533252 0.560705 0.585769 0.606751 0.622112 0.630728 0.632074 0.626314 0.614232 0.597072 0.576319 0.553481 0.529902 0.506652 0.484506 0.463981 0.445413 0.42903 0.414969 0.40328 0.3939 0.386653 0.381272 0.377441 0.374838 0.373172 0.372201 0.371735 0.371633 0.371794 0.349484 0.348664 0.348293 0.3485 0.349437 0.351285 0.354239 0.358517 0.364345 0.371938 0.381481 0.393107 0.406868 0.422699 0.440396 0.45959 0.479734 0.5001 0.519807 0.537868 0.553278 0.565125 0.5727 0.575605 0.573797 0.567592 0.557596 0.544612 0.529526 0.513203 0.496423 0.479847 0.464009 0.449321 0.436087 0.424489 0.4146 0.406385 0.399722 0.39443 0.390303 0.387135 0.384739 0.382956 0.381658 0.380742 0.380128 0.354063 0.353746 0.353859 0.354504 0.355793 0.357858 0.360833 0.364862 0.370088 0.376636 0.384607 0.394057 0.404982 0.417299 0.430829 0.445289 0.460287 0.47533 0.489836 0.503182 0.514738 0.523933 0.530313 0.533592 0.533679 0.530691 0.524927 0.516821 0.506902 0.495729 0.483854 0.471784 0.45996 0.448741 0.438394 0.429095 0.420927 0.413893 0.407937 0.402965 0.398858 0.395499 0.392772 0.390577 0.388826 0.387447 0.386376 0.357772 0.357807 0.358242 0.359152 0.360624 0.362748 0.365619 0.369329 0.373964 0.379595 0.386271 0.394005 0.402765 0.412468 0.422965 0.434043 0.445418 0.45675 0.467652 0.477713 0.486526 0.493721 0.498996 0.502151 0.503097 0.501869 0.49862 0.493597 0.487122 0.479557 0.471277 0.462645 0.453984 0.445572 0.437623 0.430285 0.423647 0.417743 0.412567 0.408082 0.404233 0.400956 0.398188 0.395867 0.393934 0.392337 0.391032 0.361025 0.3613 0.361935 0.362991 0.364527 0.366611 0.369304 0.372665 0.376745 0.38158 0.387188 0.39356 0.400656 0.408395 0.416659 0.425285 0.434068 0.442768 0.451121 0.458849 0.465681 0.471372 0.475716 0.478573 0.47987 0.479615 0.477885 0.474827 0.470639 0.465557 0.459828 0.453701 0.447406 0.441145 0.435083 0.429343 0.424013 0.419139 0.414744 0.410826 0.407367 0.404339 0.401709 0.39944 0.397498 0.395848 0.394457 0.36406 0.364492 0.365243 0.366361 0.367888 0.36987 0.372348 0.375361 0.378934 0.383084 0.387811 0.393097 0.398895 0.405141 0.411737 0.418556 0.425451 0.432248 0.438764 0.444806 0.450189 0.454747 0.458339 0.460865 0.462269 0.462547 0.461742 0.45994 0.457266 0.45387 0.449916 0.445574 0.441005 0.436353 0.431744 0.427279 0.423034 0.419061 0.415394 0.412048 0.409027 0.406323 0.403923 0.401809 0.399959 0.398352 0.396968 0.366899 0.367426 0.368234 0.369356 0.370826 0.372673 0.374925 0.377602 0.38072 0.384281 0.388278 0.392687 0.397467 0.40256 0.407888 0.413356 0.418852 0.424251 0.429421 0.434228 0.438541 0.442244 0.44524 0.447455 0.44885 0.449414 0.449171 0.448173 0.446498 0.444243 0.441519 0.438441 0.435118 0.43166 0.42816 0.424696 0.421335 0.418126 0.415104 0.412293 0.409706 0.407348 0.405215 0.403302 0.401599 0.400093 0.39877 0.369559 0.370137 0.37096 0.372052 0.373435 0.375131 0.377157 0.379524 0.382238 0.385296 0.388685 0.392381 0.39635 0.400539 0.40489 0.409328 0.413768 0.418118 0.422283 0.426163 0.429671 0.43272 0.435241 0.437182 0.438511 0.439218 0.439313 0.438831 0.437818 0.436342 0.434473 0.432293 0.429879 0.427308 0.424652 0.421973 0.419324 0.416748 0.414281 0.411945 0.40976 0.407734 0.405874 0.404179 0.402645 0.401267 0.400038 0.444069 0.444636 0.445478 0.446623 0.448099 0.44993 0.452139 0.45474 0.457742 0.461144 0.464936 0.469092 0.473577 0.478337 0.483304 0.488399 0.493525 0.498581 0.503454 0.508037 0.512222 0.515909 0.519017 0.52148 0.523257 0.524329 0.524706 0.524415 0.52351 0.52206 0.520141 0.517845 0.515256 0.512464 0.509547 0.506579 0.503622 0.500726 0.497933 0.495274 0.492769 0.490435 0.488279 0.486302 0.484502 0.482875 0.481415 0.440997 0.44149 0.4423 0.443462 0.445016 0.446998 0.44944 0.452369 0.455805 0.459755 0.464213 0.469159 0.474549 0.480322 0.486393 0.492659 0.498994 0.505259 0.511303 0.516973 0.522117 0.5266 0.530303 0.53314 0.535054 0.536028 0.536079 0.535259 0.53365 0.531357 0.5285 0.525207 0.521603 0.517809 0.513933 0.510068 0.506288 0.502655 0.499212 0.495989 0.493004 0.490266 0.487775 0.485526 0.48351 0.481715 0.480127 0.437743 0.438113 0.43884 0.439976 0.441572 0.443681 0.446352 0.44963 0.453551 0.458137 0.463395 0.469307 0.47583 0.482895 0.490394 0.498194 0.506128 0.514002 0.521607 0.528725 0.535142 0.540661 0.545117 0.548385 0.550393 0.551123 0.550611 0.548947 0.546263 0.542722 0.538505 0.533802 0.528793 0.523646 0.518502 0.513481 0.508676 0.504148 0.499941 0.496077 0.492567 0.489402 0.486574 0.484065 0.481853 0.479917 0.478232 0.434294 0.434469 0.435044 0.436085 0.437665 0.439857 0.442736 0.446373 0.450829 0.456151 0.462367 0.469475 0.477436 0.486169 0.495548 0.505393 0.51548 0.525539 0.535272 0.544363 0.552499 0.559392 0.564802 0.568552 0.570546 0.570774 0.569311 0.566307 0.561977 0.556575 0.550379 0.543668 0.536705 0.529719 0.522905 0.516408 0.51033 0.504737 0.499659 0.495099 0.491045 0.487469 0.484338 0.481615 0.479263 0.477244 0.475522 0.430628 0.430514 0.430838 0.431688 0.433162 0.435364 0.438402 0.442387 0.447422 0.453595 0.460969 0.469571 0.479376 0.4903 0.502186 0.514802 0.527836 0.54091 0.553585 0.565396 0.575876 0.584594 0.591197 0.595431 0.597175 0.596445 0.593387 0.588262 0.581419 0.573257 0.564196 0.554648 0.544985 0.535528 0.526527 0.518161 0.510541 0.503716 0.497688 0.492424 0.487867 0.483954 0.480616 0.477786 0.475402 0.473407 0.47175 0.426469 0.425936 0.425872 0.42639 0.427622 0.429711 0.432818 0.437109 0.44275 0.449894 0.458668 0.469147 0.481343 0.495175 0.510458 0.526885 0.544023 0.561323 0.578137 0.593756 0.607467 0.618612 0.626656 0.631245 0.63224 0.629728 0.624006 0.615536 0.604888 0.592689 0.57956 0.566086 0.552782 0.540068 0.528267 0.517588 0.508142 0.499946 0.492947 0.487048 0.482127 0.478053 0.474703 0.471965 0.469742 0.467953 0.466528 0.421324 0.420202 0.419564 0.419554 0.420346 0.422139 0.425162 0.429666 0.435911 0.444153 0.454618 0.467472 0.482791 0.50052 0.520448 0.542174 0.565094 0.588404 0.61112 0.632141 0.650342 0.664689 0.674361 0.678865 0.678087 0.672301 0.662112 0.64836 0.632006 0.614018 0.595298 0.576622 0.558638 0.54185 0.526626 0.513201 0.501672 0.492014 0.484102 0.477742 0.472708 0.468775 0.465734 0.463408 0.461653 0.460352 0.459415 0.414162 0.41223 0.410773 0.409972 0.41005 0.411282 0.413992 0.418546 0.425348 0.434805 0.447302 0.463155 0.482554 0.505519 0.531835 0.561003 0.592194 0.624219 0.655549 0.68441 0.708946 0.727472 0.738723 0.742054 0.737519 0.725826 0.70819 0.686136 0.661284 0.635145 0.608989 0.583785 0.560216 0.538753 0.519706 0.503268 0.48951 0.478369 0.469656 0.463074 0.458272 0.454893 0.45261 0.451149 0.450296 0.449887 0.449804 0.403713 0.400711 0.398144 0.396229 0.395255 0.39559 0.39768 0.402057 0.409322 0.420106 0.43503 0.45464 0.479339 0.509313 0.544446 0.584205 0.627506 0.672581 0.716932 0.75747 0.790925 0.814454 0.826232 0.825764 0.8138 0.791989 0.762535 0.727929 0.690717 0.653233 0.617327 0.584206 0.554469 0.528286 0.505627 0.486427 0.470627 0.458136 0.448759 0.442165 0.437908 0.435497 0.434457 0.434382 0.434956 0.435944 0.437187 0.388574 0.384234 0.380246 0.376873 0.374477 0.373533 0.374653 0.378579 0.38617 0.398363 0.416104 0.440295 0.471723 0.510997 0.558425 0.613768 0.67582 0.741878 0.807376 0.866132 0.911587 0.938772 0.945968 0.934869 0.909017 0.871885 0.826192 0.774557 0.720201 0.666733 0.617318 0.573946 0.537235 0.506761 0.481624 0.460956 0.44419 0.431047 0.421379 0.414965 0.411427 0.410234 0.410798 0.412565 0.415079 0.418001 0.421096 0.36821 0.36232 0.356663 0.351545 0.347409 0.344858 0.344692 0.347906 0.355671 0.36929 0.390136 0.41965 0.459376 0.51101 0.576279 0.656395 0.750791 0.855173 0.959831 1.05004 1.11019 1.13075 1.1142 1.07388 1.0245 0.971611 0.911486 0.840395 0.761079 0.681287 0.608906 0.548712 0.501853 0.466872 0.441096 0.42181 0.406997 0.39556 0.387135 0.381703 0.379211 0.379378 0.381697 0.385558 0.390375 0.395673 0.401109 0.343512 0.335986 0.328551 0.321556 0.31552 0.311185 0.309545 0.311856 0.319609 0.334484 0.358384 0.393622 0.443315 0.511855 0.605056 0.729013 0.886429 1.07026 1.25792 1.41178 1.49096 1.47273 1.37386 1.25255 1.16933 1.12724 1.07765 0.985168 0.855252 0.715963 0.593008 0.498563 0.433115 0.391517 0.367165 0.353859 0.346695 0.342502 0.339817 0.338437 0.338753 0.341123 0.345567 0.35174 0.359102 0.367101 0.375278 0.318786 0.309774 0.300718 0.292001 0.284222 0.278242 0.275233 0.27667 0.284306 0.300193 0.326945 0.368424 0.431005 0.525241 0.666911 0.874377 1.15862 1.50682 1.86834 2.15577 2.2709 2.15376 1.84004 1.50002 1.36389 1.42476 1.45085 1.32186 1.07158 0.792258 0.558672 0.39949 0.306201 0.257483 0.236705 0.233766 0.241074 0.252374 0.263547 0.272957 0.280856 0.288348 0.296475 0.305737 0.316079 0.32712 0.338394 0.304333 0.294271 0.284066 0.274139 0.265152 0.258078 0.254233 0.255276 0.263222 0.280636 0.311385 0.362315 0.446213 0.585778 0.81557 1.17494 1.68667 2.3254 2.99143 3.51325 3.6958 3.40946 2.69475 1.87694 1.60738 1.92488 2.111 1.90805 1.42957 0.894035 0.469979 0.234556 0.17461 0.166239 0.144916 0.11704 0.104106 0.117412 0.144333 0.171212 0.193256 0.210688 0.225437 0.239328 0.253385 0.267846 0.282486 0.317714 0.307242 0.296567 0.286158 0.276773 0.269558 0.266111 0.268523 0.279496 0.302822 0.344889 0.417846 0.544837 0.76594 1.13922 1.72748 2.56383 3.60126 4.67145 5.49232 5.74835 5.22683 3.96603 2.42613 1.85938 2.56648 2.97626 2.66489 1.86979 0.98757 0.320433 0.227537 0.384186 0.422278 0.384571 0.310305 0.223414 0.140316 0.0778846 0.0638345 0.0885605 0.115527 0.137525 0.156158 0.173582 0.190943 0.208453 0.362795 0.352365 0.341668 0.331233 0.321976 0.315368 0.313613 0.319814 0.338195 0.374781 0.439427 0.550164 0.740015 1.06394 1.599 2.426 3.58289 4.99642 6.42969 7.49917 7.78758 7.01904 5.23653 2.99606 2.05852 3.15065 3.77608 3.36243 2.26851 1.06372 0.186575 0.439324 0.657912 0.691033 0.628365 0.523521 0.404585 0.288125 0.185909 0.106672 0.0592881 0.0531516 0.0685835 0.0861728 0.103648 0.121753 0.140617 0.392907 0.382585 0.371951 0.361572 0.352456 0.346289 0.345695 0.35449 0.377961 0.42352 0.502828 0.636439 0.861219 1.23777 1.85027 2.78595 4.08308 5.65518 7.23513 8.3977 8.68566 7.80084 5.79112 3.25059 2.13875 3.39985 4.11981 3.66528 2.4462 1.10642 0.144688 0.526486 0.759872 0.78852 0.715516 0.599561 0.469958 0.343358 0.231538 0.142537 0.0809714 0.0504434 0.0491391 0.0608823 0.0763908 0.0940967 0.113316 0.362795 0.352365 0.341668 0.331233 0.321976 0.315368 0.313613 0.319814 0.338195 0.374781 0.439427 0.550164 0.740015 1.06394 1.599 2.426 3.58289 4.99642 6.42969 7.49917 7.78758 7.01904 5.23653 2.99606 2.05852 3.15065 3.77608 3.36243 2.26851 1.06372 0.186575 0.439324 0.657912 0.691033 0.628365 0.523521 0.404585 0.288125 0.185909 0.106672 0.0592881 0.0531516 0.0685835 0.0861728 0.103648 0.121753 0.140617 0.317714 0.307242 0.296567 0.286158 0.276773 0.269558 0.266111 0.268523 0.279496 0.302822 0.344889 0.417846 0.544837 0.76594 1.13922 1.72748 2.56383 3.60126 4.67145 5.49232 5.74835 5.22683 3.96603 2.42613 1.85938 2.56648 2.97626 2.66489 1.86979 0.98757 0.320433 0.227537 0.384186 0.422278 0.384571 0.310305 0.223414 0.140316 0.0778846 0.0638345 0.0885605 0.115527 0.137525 0.156158 0.173582 0.190943 0.208453 0.304333 0.294271 0.284066 0.274139 0.265152 0.258078 0.254233 0.255276 0.263222 0.280636 0.311385 0.362315 0.446213 0.585778 0.81557 1.17494 1.68667 2.3254 2.99143 3.51325 3.6958 3.40946 2.69475 1.87694 1.60738 1.92488 2.111 1.90805 1.42957 0.894035 0.469979 0.234556 0.17461 0.166239 0.144916 0.11704 0.104106 0.117412 0.144333 0.171212 0.193256 0.210688 0.225437 0.239328 0.253385 0.267846 0.282486 0.318786 0.309774 0.300718 0.292001 0.284222 0.278242 0.275233 0.27667 0.284306 0.300193 0.326945 0.368424 0.431005 0.525241 0.666911 0.874377 1.15862 1.50682 1.86834 2.15577 2.2709 2.15376 1.84004 1.50002 1.36389 1.42476 1.45085 1.32186 1.07158 0.792258 0.558672 0.39949 0.306201 0.257483 0.236705 0.233766 0.241074 0.252374 0.263547 0.272957 0.280856 0.288348 0.296475 0.305737 0.316079 0.32712 0.338394 0.343512 0.335986 0.328551 0.321556 0.31552 0.311185 0.309545 0.311856 0.319609 0.334484 0.358384 0.393622 0.443315 0.511855 0.605056 0.729013 0.886429 1.07026 1.25792 1.41178 1.49096 1.47273 1.37386 1.25255 1.16933 1.12724 1.07765 0.985168 0.855252 0.715963 0.593008 0.498563 0.433115 0.391517 0.367165 0.353859 0.346695 0.342502 0.339817 0.338437 0.338753 0.341123 0.345567 0.35174 0.359102 0.367101 0.375278 0.36821 0.36232 0.356663 0.351545 0.347409 0.344858 0.344692 0.347906 0.355671 0.36929 0.390136 0.41965 0.459376 0.51101 0.576279 0.656395 0.750791 0.855173 0.959831 1.05004 1.11019 1.13075 1.1142 1.07388 1.0245 0.971611 0.911486 0.840395 0.761079 0.681287 0.608906 0.548712 0.501853 0.466872 0.441096 0.42181 0.406997 0.39556 0.387135 0.381703 0.379211 0.379378 0.381697 0.385558 0.390375 0.395673 0.401109 0.388574 0.384234 0.380246 0.376873 0.374477 0.373533 0.374653 0.378579 0.38617 0.398363 0.416104 0.440295 0.471723 0.510997 0.558425 0.613768 0.67582 0.741878 0.807376 0.866132 0.911587 0.938772 0.945968 0.934869 0.909017 0.871885 0.826192 0.774557 0.720201 0.666733 0.617318 0.573946 0.537235 0.506761 0.481624 0.460956 0.44419 0.431047 0.421379 0.414965 0.411427 0.410234 0.410798 0.412565 0.415079 0.418001 0.421096 0.403713 0.400711 0.398144 0.396229 0.395255 0.39559 0.39768 0.402057 0.409322 0.420106 0.43503 0.45464 0.479339 0.509313 0.544446 0.584205 0.627506 0.672581 0.716932 0.75747 0.790925 0.814454 0.826232 0.825764 0.8138 0.791989 0.762535 0.727929 0.690717 0.653233 0.617327 0.584206 0.554469 0.528286 0.505627 0.486427 0.470627 0.458136 0.448759 0.442165 0.437908 0.435497 0.434457 0.434382 0.434956 0.435944 0.437187 0.414162 0.41223 0.410773 0.409972 0.41005 0.411282 0.413992 0.418546 0.425348 0.434805 0.447302 0.463155 0.482554 0.505519 0.531835 0.561003 0.592194 0.624219 0.655549 0.68441 0.708946 0.727472 0.738723 0.742054 0.737519 0.725826 0.70819 0.686136 0.661284 0.635145 0.608989 0.583785 0.560216 0.538753 0.519706 0.503268 0.48951 0.478369 0.469656 0.463074 0.458272 0.454893 0.45261 0.451149 0.450296 0.449887 0.449804 0.421324 0.420202 0.419564 0.419554 0.420346 0.422139 0.425162 0.429666 0.435911 0.444153 0.454618 0.467472 0.482791 0.50052 0.520448 0.542174 0.565094 0.588404 0.61112 0.632141 0.650342 0.664689 0.674361 0.678865 0.678087 0.672301 0.662112 0.64836 0.632006 0.614018 0.595298 0.576622 0.558638 0.54185 0.526626 0.513201 0.501672 0.492014 0.484102 0.477742 0.472708 0.468775 0.465734 0.463408 0.461653 0.460352 0.459415 0.426469 0.425936 0.425872 0.42639 0.427622 0.429711 0.432818 0.437109 0.44275 0.449894 0.458668 0.469147 0.481343 0.495175 0.510458 0.526885 0.544023 0.561323 0.578137 0.593756 0.607467 0.618612 0.626656 0.631245 0.63224 0.629728 0.624006 0.615536 0.604888 0.592689 0.57956 0.566086 0.552782 0.540068 0.528267 0.517588 0.508142 0.499946 0.492947 0.487048 0.482127 0.478053 0.474703 0.471965 0.469742 0.467953 0.466528 0.430628 0.430514 0.430838 0.431688 0.433162 0.435364 0.438402 0.442387 0.447422 0.453595 0.460969 0.469571 0.479376 0.4903 0.502186 0.514802 0.527836 0.54091 0.553585 0.565396 0.575876 0.584594 0.591197 0.595431 0.597175 0.596445 0.593387 0.588262 0.581419 0.573257 0.564196 0.554648 0.544985 0.535528 0.526527 0.518161 0.510541 0.503716 0.497688 0.492424 0.487867 0.483954 0.480616 0.477786 0.475402 0.473407 0.47175 0.434294 0.434469 0.435044 0.436085 0.437665 0.439857 0.442736 0.446373 0.450829 0.456151 0.462367 0.469475 0.477436 0.486169 0.495548 0.505393 0.51548 0.525539 0.535272 0.544363 0.552499 0.559392 0.564802 0.568552 0.570546 0.570774 0.569311 0.566307 0.561977 0.556575 0.550379 0.543668 0.536705 0.529719 0.522905 0.516408 0.51033 0.504737 0.499659 0.495099 0.491045 0.487469 0.484338 0.481615 0.479263 0.477244 0.475522 0.437743 0.438113 0.43884 0.439976 0.441572 0.443681 0.446352 0.44963 0.453551 0.458137 0.463395 0.469307 0.47583 0.482895 0.490394 0.498194 0.506128 0.514002 0.521607 0.528725 0.535142 0.540661 0.545117 0.548385 0.550393 0.551123 0.550611 0.548947 0.546263 0.542722 0.538505 0.533802 0.528793 0.523646 0.518502 0.513481 0.508676 0.504148 0.499941 0.496077 0.492567 0.489402 0.486574 0.484065 0.481853 0.479917 0.478232 0.440997 0.44149 0.4423 0.443462 0.445016 0.446998 0.44944 0.452369 0.455805 0.459755 0.464213 0.469159 0.474549 0.480322 0.486393 0.492659 0.498994 0.505259 0.511303 0.516973 0.522117 0.5266 0.530303 0.53314 0.535054 0.536028 0.536079 0.535259 0.53365 0.531357 0.5285 0.525207 0.521603 0.517809 0.513933 0.510068 0.506288 0.502655 0.499212 0.495989 0.493004 0.490266 0.487775 0.485526 0.48351 0.481715 0.480127 0.444069 0.444636 0.445478 0.446623 0.448099 0.44993 0.452139 0.45474 0.457742 0.461144 0.464936 0.469092 0.473577 0.478337 0.483304 0.488399 0.493525 0.498581 0.503454 0.508037 0.512222 0.515909 0.519017 0.52148 0.523257 0.524329 0.524706 0.524415 0.52351 0.52206 0.520141 0.517845 0.515256 0.512464 0.509547 0.506579 0.503622 0.500726 0.497933 0.495274 0.492769 0.490435 0.488279 0.486302 0.484502 0.482875 0.481415 0.518916 0.519436 0.520258 0.52141 0.522927 0.524836 0.527162 0.529925 0.533138 0.536803 0.540913 0.545442 0.550354 0.555595 0.561095 0.566766 0.572507 0.578204 0.583738 0.588985 0.593824 0.598145 0.601849 0.604863 0.607129 0.608626 0.609352 0.609335 0.608626 0.607293 0.605423 0.603106 0.600439 0.597517 0.594427 0.591252 0.58806 0.58491 0.581851 0.578919 0.57614 0.573534 0.571112 0.568878 0.566833 0.564972 0.563291 0.515474 0.5159 0.516666 0.517818 0.519398 0.521447 0.524004 0.527102 0.530765 0.535006 0.539823 0.545196 0.551087 0.557429 0.564137 0.5711 0.578182 0.585233 0.592085 0.59857 0.604518 0.609773 0.6142 0.617695 0.620187 0.621646 0.622084 0.621547 0.62012 0.617909 0.615043 0.611658 0.607891 0.603875 0.599729 0.595556 0.591444 0.587463 0.583666 0.580086 0.576751 0.57367 0.570851 0.568289 0.565977 0.563904 0.562057 0.51186 0.51213 0.512787 0.513886 0.515484 0.517645 0.520423 0.523871 0.528032 0.532938 0.538599 0.545004 0.552115 0.559858 0.568127 0.576776 0.585629 0.594476 0.603086 0.611219 0.618633 0.625107 0.630449 0.634511 0.6372 0.638483 0.638388 0.637002 0.634459 0.63093 0.626609 0.621699 0.6164 0.610894 0.605344 0.599882 0.594614 0.589617 0.584942 0.58062 0.576665 0.573078 0.569849 0.566964 0.564401 0.562141 0.560158 0.508061 0.508098 0.508564 0.509533 0.511084 0.513301 0.516269 0.520068 0.524773 0.530442 0.537112 0.544791 0.553445 0.562996 0.573313 0.58421 0.595442 0.606724 0.617725 0.628096 0.637489 0.645578 0.652084 0.656798 0.659597 0.660449 0.659419 0.656657 0.652383 0.646867 0.640409 0.633312 0.625865 0.618325 0.61091 0.603786 0.597076 0.590857 0.585172 0.580031 0.575426 0.571334 0.567724 0.564558 0.561798 0.559408 0.55735 0.504062 0.503761 0.503927 0.504657 0.506055 0.508242 0.511338 0.515468 0.520754 0.527299 0.535183 0.544447 0.555079 0.566997 0.580045 0.593978 0.608465 0.623095 0.637392 0.650843 0.662927 0.673162 0.681136 0.686552 0.689247 0.689209 0.686573 0.6816 0.674655 0.666165 0.656587 0.646373 0.635937 0.625639 0.615766 0.606525 0.598048 0.590401 0.583597 0.577608 0.572383 0.567857 0.563959 0.560622 0.557778 0.555371 0.553345 0.499547 0.498766 0.498479 0.498811 0.499903 0.501919 0.505035 0.509438 0.515319 0.522858 0.532203 0.543457 0.556647 0.571704 0.588441 0.606538 0.625537 0.644842 0.663754 0.681496 0.697279 0.710367 0.72015 0.726203 0.728328 0.726574 0.72122 0.712734 0.701717 0.68884 0.674793 0.660225 0.645718 0.631754 0.618702 0.606813 0.596221 0.586962 0.578991 0.572213 0.566501 0.561719 0.55774 0.554442 0.551724 0.549496 0.547686 0.493948 0.492498 0.491553 0.49127 0.491835 0.493471 0.49643 0.500992 0.507453 0.516104 0.52721 0.540973 0.557497 0.576746 0.598508 0.622367 0.647679 0.673579 0.699009 0.722777 0.743656 0.760507 0.772405 0.778754 0.779355 0.774415 0.764509 0.750481 0.733343 0.714147 0.693898 0.673491 0.653679 0.635056 0.618064 0.602984 0.589945 0.578936 0.569829 0.562426 0.556487 0.551772 0.548057 0.545149 0.542891 0.541157 0.539845 0.486068 0.483706 0.481832 0.480641 0.480378 0.481338 0.48388 0.488411 0.495381 0.505253 0.518468 0.535391 0.556259 0.581114 0.609744 0.641621 0.675858 0.71118 0.745956 0.778295 0.806229 0.827952 0.842077 0.847826 0.845106 0.834492 0.817111 0.79447 0.768258 0.740132 0.711551 0.683681 0.657387 0.633279 0.611767 0.5931 0.577379 0.564542 0.554387 0.546599 0.540796 0.536592 0.533629 0.531609 0.530292 0.529501 0.5291 0.474423 0.470866 0.467746 0.465296 0.46383 0.463742 0.465527 0.469769 0.477134 0.48833 0.504055 0.524932 0.551422 0.583743 0.621768 0.664909 0.711983 0.761088 0.809586 0.854276 0.891809 0.919305 0.934871 0.937859 0.928732 0.908782 0.879902 0.844457 0.805095 0.764442 0.724729 0.687546 0.653796 0.623863 0.597836 0.575698 0.557395 0.542814 0.531723 0.523751 0.518408 0.515153 0.513467 0.512904 0.51311 0.513825 0.514864 0.457374 0.452333 0.44763 0.44355 0.440481 0.438938 0.439586 0.443239 0.450844 0.463443 0.482089 0.507787 0.541401 0.583569 0.634563 0.694026 0.760561 0.831226 0.901252 0.964377 1.01418 1.04603 1.05852 1.05328 1.03317 1.00044 0.956683 0.904026 0.845991 0.787021 0.731237 0.681426 0.638732 0.602995 0.573389 0.549007 0.529192 0.513574 0.501923 0.493957 0.489236 0.487178 0.48714 0.488512 0.490792 0.493595 0.496656 0.434302 0.427549 0.421004 0.414995 0.409995 0.406656 0.405845 0.408646 0.416348 0.430385 0.452281 0.483611 0.526019 0.581231 0.650895 0.736007 0.835636 0.945032 1.05408 1.14796 1.21156 1.23676 1.22788 1.19927 1.16388 1.12293 1.06856 0.995632 0.908286 0.817048 0.732474 0.661113 0.604908 0.562526 0.53106 0.507435 0.489286 0.475239 0.464751 0.457692 0.453958 0.453229 0.454962 0.458499 0.463204 0.468548 0.47414 0.406254 0.397715 0.389232 0.381177 0.374108 0.368825 0.366399 0.368196 0.375847 0.391205 0.416365 0.453828 0.506864 0.579941 0.6788 0.809277 0.973583 1.16393 1.35675 1.51355 1.59356 1.57666 1.4859 1.38645 1.33648 1.32405 1.28797 1.1906 1.04204 0.877671 0.729875 0.614807 0.53411 0.482065 0.450889 0.433221 0.42323 0.417089 0.412936 0.410367 0.409704 0.411314 0.415244 0.421161 0.428511 0.436698 0.445215 0.378302 0.368169 0.357956 0.348077 0.339174 0.332174 0.328336 0.32926 0.336862 0.353406 0.381765 0.426093 0.493064 0.593506 0.743403 0.961235 1.25777 1.61911 1.99223 2.28636 2.40052 2.27581 1.95856 1.64354 1.5696 1.68781 1.73947 1.60202 1.31669 0.989539 0.709118 0.512596 0.394028 0.330661 0.302675 0.296898 0.303608 0.315268 0.327035 0.33691 0.345032 0.352553 0.360643 0.369936 0.380463 0.391876 0.403694 0.36251 0.3513 0.339926 0.328842 0.31877 0.310753 0.30621 0.306938 0.315143 0.333661 0.366742 0.421735 0.512094 0.66139 0.90531 1.28436 1.82155 2.48944 3.18333 3.72444 3.91024 3.60697 2.86252 2.04111 1.84626 2.24838 2.48212 2.27471 1.74346 1.12971 0.627242 0.323128 0.208836 0.180338 0.156212 0.133074 0.130837 0.154068 0.18747 0.218775 0.243891 0.263351 0.279387 0.294141 0.308911 0.324114 0.339614 0.379225 0.367661 0.355895 0.344442 0.334137 0.326226 0.322445 0.325077 0.337103 0.362731 0.408977 0.488915 0.627085 0.865572 1.26494 1.89 2.77367 3.86475 4.98641 5.84499 6.11285 5.56799 4.24899 2.64913 2.11486 2.92223 3.41725 3.11792 2.25496 1.25984 0.474857 0.217217 0.380184 0.435484 0.401874 0.323458 0.228739 0.13801 0.0761145 0.0805011 0.117336 0.150372 0.175976 0.196856 0.215805 0.234413 0.253159 0.432603 0.421158 0.409457 0.398095 0.38809 0.381064 0.379437 0.38662 0.407309 0.448224 0.520263 0.642975 0.851605 1.20412 1.78087 2.66478 3.89242 5.38387 6.89023 8.01274 8.31902 7.52099 5.65723 3.30577 2.31912 3.51127 4.26315 3.88376 2.71291 1.3658 0.329748 0.410062 0.681189 0.738857 0.680233 0.568445 0.43756 0.307645 0.19281 0.104305 0.058358 0.0670554 0.0912929 0.113098 0.132889 0.152567 0.172864 0.468011 0.45671 0.44511 0.433848 0.424052 0.417587 0.41734 0.427525 0.454022 0.505147 0.593853 0.742527 0.990582 1.40193 2.06423 3.06662 4.44534 6.10596 7.76778 8.98896 9.29608 8.37803 6.27701 3.60472 2.4007 3.75822 4.62352 4.21431 2.91573 1.42189 0.281039 0.501191 0.794903 0.84977 0.78048 0.656544 0.513742 0.372375 0.24654 0.146107 0.0785033 0.0538438 0.064154 0.0819936 0.100324 0.119671 0.140332 0.432603 0.421158 0.409457 0.398095 0.38809 0.381064 0.379437 0.38662 0.407309 0.448224 0.520263 0.642975 0.851605 1.20412 1.78087 2.66478 3.89242 5.38387 6.89023 8.01274 8.31902 7.52099 5.65723 3.30577 2.31912 3.51127 4.26315 3.88376 2.71291 1.3658 0.329748 0.410062 0.681189 0.738857 0.680233 0.568445 0.43756 0.307645 0.19281 0.104305 0.058358 0.0670554 0.0912929 0.113098 0.132889 0.152567 0.172864 0.379225 0.367661 0.355895 0.344442 0.334137 0.326226 0.322445 0.325077 0.337103 0.362731 0.408977 0.488915 0.627085 0.865572 1.26494 1.89 2.77367 3.86475 4.98641 5.84499 6.11285 5.56799 4.24899 2.64913 2.11486 2.92223 3.41725 3.11792 2.25496 1.25984 0.474857 0.217217 0.380184 0.435484 0.401874 0.323458 0.228739 0.13801 0.0761145 0.0805011 0.117336 0.150372 0.175976 0.196856 0.215805 0.234413 0.253159 0.36251 0.3513 0.339926 0.328842 0.31877 0.310753 0.30621 0.306938 0.315143 0.333661 0.366742 0.421735 0.512094 0.66139 0.90531 1.28436 1.82155 2.48944 3.18333 3.72444 3.91024 3.60697 2.86252 2.04111 1.84626 2.24838 2.48212 2.27471 1.74346 1.12971 0.627242 0.323128 0.208836 0.180338 0.156212 0.133074 0.130837 0.154068 0.18747 0.218775 0.243891 0.263351 0.279387 0.294141 0.308911 0.324114 0.339614 0.378302 0.368169 0.357956 0.348077 0.339174 0.332174 0.328336 0.32926 0.336862 0.353406 0.381765 0.426093 0.493064 0.593506 0.743403 0.961235 1.25777 1.61911 1.99223 2.28636 2.40052 2.27581 1.95856 1.64354 1.5696 1.68781 1.73947 1.60202 1.31669 0.989539 0.709118 0.512596 0.394028 0.330661 0.302675 0.296898 0.303608 0.315268 0.327035 0.33691 0.345032 0.352553 0.360643 0.369936 0.380463 0.391876 0.403694 0.406254 0.397715 0.389232 0.381177 0.374108 0.368825 0.366399 0.368196 0.375847 0.391205 0.416365 0.453828 0.506864 0.579941 0.6788 0.809277 0.973583 1.16393 1.35675 1.51355 1.59356 1.57666 1.4859 1.38645 1.33648 1.32405 1.28797 1.1906 1.04204 0.877671 0.729875 0.614807 0.53411 0.482065 0.450889 0.433221 0.42323 0.417089 0.412936 0.410367 0.409704 0.411314 0.415244 0.421161 0.428511 0.436698 0.445215 0.434302 0.427549 0.421004 0.414995 0.409995 0.406656 0.405845 0.408646 0.416348 0.430385 0.452281 0.483611 0.526019 0.581231 0.650895 0.736007 0.835636 0.945032 1.05408 1.14796 1.21156 1.23676 1.22788 1.19927 1.16388 1.12293 1.06856 0.995632 0.908286 0.817048 0.732474 0.661113 0.604908 0.562526 0.53106 0.507435 0.489286 0.475239 0.464751 0.457692 0.453958 0.453229 0.454962 0.458499 0.463204 0.468548 0.47414 0.457374 0.452333 0.44763 0.44355 0.440481 0.438938 0.439586 0.443239 0.450844 0.463443 0.482089 0.507787 0.541401 0.583569 0.634563 0.694026 0.760561 0.831226 0.901252 0.964377 1.01418 1.04603 1.05852 1.05328 1.03317 1.00044 0.956683 0.904026 0.845991 0.787021 0.731237 0.681426 0.638732 0.602995 0.573389 0.549007 0.529192 0.513574 0.501923 0.493957 0.489236 0.487178 0.48714 0.488512 0.490792 0.493595 0.496656 0.474423 0.470866 0.467746 0.465296 0.46383 0.463742 0.465527 0.469769 0.477134 0.48833 0.504055 0.524932 0.551422 0.583743 0.621768 0.664909 0.711983 0.761088 0.809586 0.854276 0.891809 0.919305 0.934871 0.937859 0.928732 0.908782 0.879902 0.844457 0.805095 0.764442 0.724729 0.687546 0.653796 0.623863 0.597836 0.575698 0.557395 0.542814 0.531723 0.523751 0.518408 0.515153 0.513467 0.512904 0.51311 0.513825 0.514864 0.486068 0.483706 0.481832 0.480641 0.480378 0.481338 0.48388 0.488411 0.495381 0.505253 0.518468 0.535391 0.556259 0.581114 0.609744 0.641621 0.675858 0.71118 0.745956 0.778295 0.806229 0.827952 0.842077 0.847826 0.845106 0.834492 0.817111 0.79447 0.768258 0.740132 0.711551 0.683681 0.657387 0.633279 0.611767 0.5931 0.577379 0.564542 0.554387 0.546599 0.540796 0.536592 0.533629 0.531609 0.530292 0.529501 0.5291 0.493948 0.492498 0.491553 0.49127 0.491835 0.493471 0.49643 0.500992 0.507453 0.516104 0.52721 0.540973 0.557497 0.576746 0.598508 0.622367 0.647679 0.673579 0.699009 0.722777 0.743656 0.760507 0.772405 0.778754 0.779355 0.774415 0.764509 0.750481 0.733343 0.714147 0.693898 0.673491 0.653679 0.635056 0.618064 0.602984 0.589945 0.578936 0.569829 0.562426 0.556487 0.551772 0.548057 0.545149 0.542891 0.541157 0.539845 0.499547 0.498766 0.498479 0.498811 0.499903 0.501919 0.505035 0.509438 0.515319 0.522858 0.532203 0.543457 0.556647 0.571704 0.588441 0.606538 0.625537 0.644842 0.663754 0.681496 0.697279 0.710367 0.72015 0.726203 0.728328 0.726574 0.72122 0.712734 0.701717 0.68884 0.674793 0.660225 0.645718 0.631754 0.618702 0.606813 0.596221 0.586962 0.578991 0.572213 0.566501 0.561719 0.55774 0.554442 0.551724 0.549496 0.547686 0.504062 0.503761 0.503927 0.504657 0.506055 0.508242 0.511338 0.515468 0.520754 0.527299 0.535183 0.544447 0.555079 0.566997 0.580045 0.593978 0.608465 0.623095 0.637392 0.650843 0.662927 0.673162 0.681136 0.686552 0.689247 0.689209 0.686573 0.6816 0.674655 0.666165 0.656587 0.646373 0.635937 0.625639 0.615766 0.606525 0.598048 0.590401 0.583597 0.577608 0.572383 0.567857 0.563959 0.560622 0.557778 0.555371 0.553345 0.508061 0.508098 0.508564 0.509533 0.511084 0.513301 0.516269 0.520068 0.524773 0.530442 0.537112 0.544791 0.553445 0.562996 0.573313 0.58421 0.595442 0.606724 0.617725 0.628096 0.637489 0.645578 0.652084 0.656798 0.659597 0.660449 0.659419 0.656657 0.652383 0.646867 0.640409 0.633312 0.625865 0.618325 0.61091 0.603786 0.597076 0.590857 0.585172 0.580031 0.575426 0.571334 0.567724 0.564558 0.561798 0.559408 0.55735 0.51186 0.51213 0.512787 0.513886 0.515484 0.517645 0.520423 0.523871 0.528032 0.532938 0.538599 0.545004 0.552115 0.559858 0.568127 0.576776 0.585629 0.594476 0.603086 0.611219 0.618633 0.625107 0.630449 0.634511 0.6372 0.638483 0.638388 0.637002 0.634459 0.63093 0.626609 0.621699 0.6164 0.610894 0.605344 0.599882 0.594614 0.589617 0.584942 0.58062 0.576665 0.573078 0.569849 0.566964 0.564401 0.562141 0.560158 0.515474 0.5159 0.516666 0.517818 0.519398 0.521447 0.524004 0.527102 0.530765 0.535006 0.539823 0.545196 0.551087 0.557429 0.564137 0.5711 0.578182 0.585233 0.592085 0.59857 0.604518 0.609773 0.6142 0.617695 0.620187 0.621646 0.622084 0.621547 0.62012 0.617909 0.615043 0.611658 0.607891 0.603875 0.599729 0.595556 0.591444 0.587463 0.583666 0.580086 0.576751 0.57367 0.570851 0.568289 0.565977 0.563904 0.562057 0.518916 0.519436 0.520258 0.52141 0.522927 0.524836 0.527162 0.529925 0.533138 0.536803 0.540913 0.545442 0.550354 0.555595 0.561095 0.566766 0.572507 0.578204 0.583738 0.588985 0.593824 0.598145 0.601849 0.604863 0.607129 0.608626 0.609352 0.609335 0.608626 0.607293 0.605423 0.603106 0.600439 0.597517 0.594427 0.591252 0.58806 0.58491 0.581851 0.578919 0.57614 0.573534 0.571112 0.568878 0.566833 0.564972 0.563291 0.594159 0.594605 0.595368 0.596487 0.597996 0.599928 0.602312 0.605173 0.608524 0.612376 0.616721 0.621539 0.626792 0.63243 0.638377 0.644545 0.650826 0.6571 0.663238 0.669106 0.674572 0.679511 0.683816 0.687395 0.690186 0.692153 0.693289 0.693616 0.693181 0.692054 0.69032 0.688075 0.685421 0.682457 0.679278 0.675975 0.672622 0.669285 0.666021 0.662868 0.659863 0.657025 0.65437 0.651906 0.649638 0.647561 0.645673 0.590392 0.590716 0.591403 0.592498 0.594051 0.596107 0.598711 0.601901 0.605707 0.610146 0.615224 0.620923 0.627207 0.634012 0.641252 0.648809 0.656544 0.664297 0.671889 0.679134 0.685849 0.69186 0.697016 0.701193 0.704307 0.706316 0.707219 0.707059 0.705916 0.7039 0.701139 0.697779 0.693962 0.689832 0.685519 0.681135 0.676778 0.672526 0.668441 0.664564 0.660926 0.657546 0.654432 0.651584 0.648997 0.646662 0.644566 0.586469 0.586609 0.587154 0.588167 0.589712 0.591856 0.594663 0.598191 0.602494 0.607608 0.613555 0.620328 0.627893 0.636182 0.645085 0.654456 0.664107 0.673818 0.683342 0.692418 0.700785 0.708193 0.714428 0.719318 0.722749 0.724673 0.725103 0.724119 0.721854 0.718482 0.714204 0.709236 0.703788 0.69806 0.692227 0.686437 0.680809 0.675429 0.670361 0.665644 0.661298 0.657328 0.653731 0.650494 0.647598 0.645024 0.642749 0.582387 0.582254 0.58257 0.583415 0.584875 0.587042 0.59001 0.59387 0.598708 0.604593 0.611574 0.619668 0.628851 0.63905 0.650134 0.661914 0.674137 0.686499 0.698648 0.710207 0.720797 0.730055 0.737671 0.7434 0.747089 0.748685 0.748235 0.74588 0.741844 0.736405 0.729876 0.72258 0.714828 0.706901 0.699035 0.691419 0.684192 0.677446 0.671233 0.665577 0.660473 0.655904 0.651842 0.648253 0.645098 0.64234 0.639944 0.578132 0.577615 0.577583 0.578138 0.579397 0.581488 0.584543 0.588703 0.594104 0.600865 0.609085 0.618821 0.630072 0.642769 0.656758 0.67179 0.687521 0.70352 0.719279 0.734247 0.747859 0.759579 0.768949 0.775621 0.779391 0.780213 0.778199 0.773605 0.766802 0.758234 0.748385 0.737742 0.726756 0.715821 0.705254 0.695291 0.686088 0.677726 0.670231 0.663583 0.657736 0.652628 0.648191 0.644355 0.641055 0.638229 0.635823 0.573354 0.572298 0.571751 0.571845 0.572733 0.57459 0.577607 0.581993 0.587958 0.595707 0.605414 0.617205 0.631129 0.647133 0.665038 0.684518 0.7051 0.726161 0.746954 0.766652 0.784405 0.799405 0.81097 0.818604 0.822044 0.821292 0.81659 0.808401 0.797341 0.784117 0.769467 0.754101 0.73866 0.723684 0.709588 0.696661 0.685065 0.674853 0.665992 0.658391 0.651924 0.646456 0.641852 0.63799 0.634763 0.632077 0.629855 0.567409 0.565612 0.56433 0.563726 0.564002 0.565394 0.568177 0.572653 0.579151 0.587996 0.599489 0.613869 0.631271 0.651683 0.674904 0.700512 0.727841 0.755988 0.783837 0.810127 0.833551 0.852879 0.867089 0.875481 0.877754 0.87403 0.864823 0.850962 0.83348 0.813496 0.79211 0.770323 0.748989 0.728799 0.71026 0.693706 0.679298 0.667037 0.656807 0.648403 0.641578 0.63608 0.631674 0.628158 0.625364 0.623155 0.621427 0.558932 0.556134 0.553826 0.552211 0.551547 0.552152 0.55441 0.558765 0.565705 0.575744 0.589372 0.607009 0.628935 0.655224 0.685674 0.719747 0.756517 0.794658 0.832466 0.867977 0.899141 0.924064 0.941249 0.949772 0.949364 0.940422 0.923929 0.90133 0.874346 0.844755 0.814196 0.784037 0.755328 0.728827 0.705051 0.684314 0.666743 0.652289 0.640739 0.631757 0.624942 0.61988 0.616193 0.613557 0.611718 0.61048 0.609698 0.546229 0.542129 0.538453 0.53545 0.533448 0.532868 0.534238 0.538188 0.545439 0.556766 0.57294 0.594655 0.622427 0.656512 0.696782 0.742615 0.792755 0.845211 0.897269 0.945678 0.987095 1.01865 1.03843 1.04558 1.04019 1.02312 0.995797 0.9604 0.919629 0.876385 0.833297 0.792355 0.754802 0.721264 0.691969 0.666965 0.646205 0.629556 0.61675 0.607372 0.600889 0.59672 0.594305 0.593162 0.592906 0.593252 0.593996 0.527428 0.521714 0.516319 0.511537 0.507776 0.505583 0.505666 0.508897 0.5163 0.529001 0.548157 0.574858 0.610043 0.654378 0.708101 0.770755 0.840781 0.915064 0.988728 1.05558 1.10952 1.14636 1.16511 1.16723 1.15462 1.12807 1.0878 1.0353 0.974396 0.910392 0.848443 0.792221 0.743464 0.702339 0.668128 0.639911 0.616949 0.598773 0.58506 0.575453 0.569451 0.566411 0.565641 0.566485 0.568392 0.570945 0.573844 0.501815 0.494258 0.486876 0.480013 0.474164 0.470021 0.468503 0.470769 0.478201 0.49235 0.514868 0.547449 0.591824 0.64973 0.72272 0.811558 0.914961 1.02779 1.13972 1.23611 1.3028 1.33346 1.33442 1.32067 1.30267 1.27661 1.23027 1.15704 1.06246 0.959908 0.862821 0.779736 0.713561 0.663177 0.625494 0.597098 0.575277 0.558366 0.545615 0.536765 0.531629 0.529838 0.530806 0.533835 0.538241 0.543449 0.549029 0.470614 0.461149 0.451703 0.442666 0.434625 0.428421 0.425194 0.426395 0.433772 0.449325 0.475313 0.514402 0.569981 0.646532 0.749649 0.884793 1.05359 1.24755 1.44247 1.59963 1.67938 1.66526 1.58708 1.51598 1.50483 1.52574 1.50613 1.4064 1.24071 1.05152 0.878103 0.741107 0.643778 0.580052 0.541027 0.518174 0.50471 0.49613 0.490139 0.486095 0.484215 0.484846 0.488038 0.493466 0.500562 0.5087 0.517331 0.439664 0.428532 0.417287 0.406367 0.396446 0.388506 0.383881 0.384264 0.391712 0.408667 0.438228 0.484796 0.555264 0.660592 0.816709 1.04183 1.34619 1.71489 2.0932 2.38842 2.49872 2.36816 2.05517 1.77765 1.77408 1.95247 2.0336 1.8928 1.57665 1.20356 0.875893 0.640295 0.494338 0.41434 0.377487 0.367553 0.37263 0.383844 0.395588 0.405462 0.413451 0.42071 0.428498 0.43755 0.447983 0.459483 0.471566 0.422806 0.4106 0.398215 0.386136 0.375126 0.366296 0.361146 0.361586 0.369989 0.389431 0.42449 0.482937 0.578715 0.735906 0.990706 1.384 1.93841 2.6246 3.33419 3.88377 4.06672 3.7485 2.98634 2.18257 2.07656 2.56443 2.84972 2.64679 2.07217 1.38581 0.806177 0.434288 0.264487 0.207421 0.177305 0.159559 0.167325 0.198332 0.236802 0.271672 0.299287 0.320373 0.337383 0.352718 0.36791 0.383553 0.399602 0.443118 0.430634 0.417957 0.405646 0.394599 0.386154 0.382168 0.385096 0.39817 0.42598 0.476091 0.562351 0.710343 0.963494 1.3838 2.03689 2.95454 4.08161 5.23482 6.11307 6.38214 5.81612 4.45691 2.82944 2.35445 3.25957 3.84007 3.56573 2.6519 1.55534 0.657545 0.23698 0.365158 0.436398 0.408317 0.327317 0.226443 0.13072 0.0777731 0.104519 0.15133 0.189587 0.218372 0.241212 0.261428 0.281006 0.300684 0.504965 0.492688 0.480175 0.468088 0.457538 0.450286 0.44895 0.457235 0.480266 0.525422 0.604538 0.738471 0.96419 1.34174 1.95336 2.88238 4.16277 5.70821 7.26059 8.41137 8.72036 7.89466 5.97309 3.55406 2.56137 3.84438 4.71674 4.38763 3.16441 1.69253 0.511257 0.36722 0.685624 0.771037 0.719193 0.602464 0.461237 0.319269 0.193039 0.096838 0.0593607 0.0856872 0.117605 0.143192 0.165085 0.186124 0.207588 0.54573 0.533636 0.521267 0.509331 0.499069 0.492511 0.492796 0.504502 0.534081 0.590687 0.688471 0.851407 1.12092 1.56321 2.26781 3.3239 4.76433 6.48698 8.20066 9.45285 9.76203 8.81229 6.6455 3.88964 2.6447 4.08545 5.08691 4.74013 3.38985 1.76225 0.462914 0.456593 0.809838 0.894886 0.832351 0.702554 0.548214 0.393519 0.254894 0.144055 0.07257 0.0602896 0.0827881 0.106008 0.126922 0.147745 0.16961 0.504965 0.492688 0.480175 0.468088 0.457538 0.450286 0.44895 0.457235 0.480266 0.525422 0.604538 0.738471 0.96419 1.34174 1.95336 2.88238 4.16277 5.70821 7.26059 8.41137 8.72036 7.89466 5.97309 3.55406 2.56137 3.84438 4.71674 4.38763 3.16441 1.69253 0.511257 0.36722 0.685624 0.771037 0.719193 0.602464 0.461237 0.319269 0.193039 0.096838 0.0593607 0.0856872 0.117605 0.143192 0.165085 0.186124 0.207588 0.443118 0.430634 0.417957 0.405646 0.394599 0.386154 0.382168 0.385096 0.39817 0.42598 0.476091 0.562351 0.710343 0.963494 1.3838 2.03689 2.95454 4.08161 5.23482 6.11307 6.38214 5.81612 4.45691 2.82944 2.35445 3.25957 3.84007 3.56573 2.6519 1.55534 0.657545 0.23698 0.365158 0.436398 0.408317 0.327317 0.226443 0.13072 0.0777731 0.104519 0.15133 0.189587 0.218372 0.241212 0.261428 0.281006 0.300684 0.422806 0.4106 0.398215 0.386136 0.375126 0.366296 0.361146 0.361586 0.369989 0.389431 0.42449 0.482937 0.578715 0.735906 0.990706 1.384 1.93841 2.6246 3.33419 3.88377 4.06672 3.7485 2.98634 2.18257 2.07656 2.56443 2.84972 2.64679 2.07217 1.38581 0.806177 0.434288 0.264487 0.207421 0.177305 0.159559 0.167325 0.198332 0.236802 0.271672 0.299287 0.320373 0.337383 0.352718 0.36791 0.383553 0.399602 0.439664 0.428532 0.417287 0.406367 0.396446 0.388506 0.383881 0.384264 0.391712 0.408667 0.438228 0.484796 0.555264 0.660592 0.816709 1.04183 1.34619 1.71489 2.0932 2.38842 2.49872 2.36816 2.05517 1.77765 1.77408 1.95247 2.0336 1.8928 1.57665 1.20356 0.875893 0.640295 0.494338 0.41434 0.377487 0.367553 0.37263 0.383844 0.395588 0.405462 0.413451 0.42071 0.428498 0.43755 0.447983 0.459483 0.471566 0.470614 0.461149 0.451703 0.442666 0.434625 0.428421 0.425194 0.426395 0.433772 0.449325 0.475313 0.514402 0.569981 0.646532 0.749649 0.884793 1.05359 1.24755 1.44247 1.59963 1.67938 1.66526 1.58708 1.51598 1.50483 1.52574 1.50613 1.4064 1.24071 1.05152 0.878103 0.741107 0.643778 0.580052 0.541027 0.518174 0.50471 0.49613 0.490139 0.486095 0.484215 0.484846 0.488038 0.493466 0.500562 0.5087 0.517331 0.501815 0.494258 0.486876 0.480013 0.474164 0.470021 0.468503 0.470769 0.478201 0.49235 0.514868 0.547449 0.591824 0.64973 0.72272 0.811558 0.914961 1.02779 1.13972 1.23611 1.3028 1.33346 1.33442 1.32067 1.30267 1.27661 1.23027 1.15704 1.06246 0.959908 0.862821 0.779736 0.713561 0.663177 0.625494 0.597098 0.575277 0.558366 0.545615 0.536765 0.531629 0.529838 0.530806 0.533835 0.538241 0.543449 0.549029 0.527428 0.521714 0.516319 0.511537 0.507776 0.505583 0.505666 0.508897 0.5163 0.529001 0.548157 0.574858 0.610043 0.654378 0.708101 0.770755 0.840781 0.915064 0.988728 1.05558 1.10952 1.14636 1.16511 1.16723 1.15462 1.12807 1.0878 1.0353 0.974396 0.910392 0.848443 0.792221 0.743464 0.702339 0.668128 0.639911 0.616949 0.598773 0.58506 0.575453 0.569451 0.566411 0.565641 0.566485 0.568392 0.570945 0.573844 0.546229 0.542129 0.538453 0.53545 0.533448 0.532868 0.534238 0.538188 0.545439 0.556766 0.57294 0.594655 0.622427 0.656512 0.696782 0.742615 0.792755 0.845211 0.897269 0.945678 0.987095 1.01865 1.03843 1.04558 1.04019 1.02312 0.995797 0.9604 0.919629 0.876385 0.833297 0.792355 0.754802 0.721264 0.691969 0.666965 0.646205 0.629556 0.61675 0.607372 0.600889 0.59672 0.594305 0.593162 0.592906 0.593252 0.593996 0.558932 0.556134 0.553826 0.552211 0.551547 0.552152 0.55441 0.558765 0.565705 0.575744 0.589372 0.607009 0.628935 0.655224 0.685674 0.719747 0.756517 0.794658 0.832466 0.867977 0.899141 0.924064 0.941249 0.949772 0.949364 0.940422 0.923929 0.90133 0.874346 0.844755 0.814196 0.784037 0.755328 0.728827 0.705051 0.684314 0.666743 0.652289 0.640739 0.631757 0.624942 0.61988 0.616193 0.613557 0.611718 0.61048 0.609698 0.567409 0.565612 0.56433 0.563726 0.564002 0.565394 0.568177 0.572653 0.579151 0.587996 0.599489 0.613869 0.631271 0.651683 0.674904 0.700512 0.727841 0.755988 0.783837 0.810127 0.833551 0.852879 0.867089 0.875481 0.877754 0.87403 0.864823 0.850962 0.83348 0.813496 0.79211 0.770323 0.748989 0.728799 0.71026 0.693706 0.679298 0.667037 0.656807 0.648403 0.641578 0.63608 0.631674 0.628158 0.625364 0.623155 0.621427 0.573354 0.572298 0.571751 0.571845 0.572733 0.57459 0.577607 0.581993 0.587958 0.595707 0.605414 0.617205 0.631129 0.647133 0.665038 0.684518 0.7051 0.726161 0.746954 0.766652 0.784405 0.799405 0.81097 0.818604 0.822044 0.821292 0.81659 0.808401 0.797341 0.784117 0.769467 0.754101 0.73866 0.723684 0.709588 0.696661 0.685065 0.674853 0.665992 0.658391 0.651924 0.646456 0.641852 0.63799 0.634763 0.632077 0.629855 0.578132 0.577615 0.577583 0.578138 0.579397 0.581488 0.584543 0.588703 0.594104 0.600865 0.609085 0.618821 0.630072 0.642769 0.656758 0.67179 0.687521 0.70352 0.719279 0.734247 0.747859 0.759579 0.768949 0.775621 0.779391 0.780213 0.778199 0.773605 0.766802 0.758234 0.748385 0.737742 0.726756 0.715821 0.705254 0.695291 0.686088 0.677726 0.670231 0.663583 0.657736 0.652628 0.648191 0.644355 0.641055 0.638229 0.635823 0.582387 0.582254 0.58257 0.583415 0.584875 0.587042 0.59001 0.59387 0.598708 0.604593 0.611574 0.619668 0.628851 0.63905 0.650134 0.661914 0.674137 0.686499 0.698648 0.710207 0.720797 0.730055 0.737671 0.7434 0.747089 0.748685 0.748235 0.74588 0.741844 0.736405 0.729876 0.72258 0.714828 0.706901 0.699035 0.691419 0.684192 0.677446 0.671233 0.665577 0.660473 0.655904 0.651842 0.648253 0.645098 0.64234 0.639944 0.586469 0.586609 0.587154 0.588167 0.589712 0.591856 0.594663 0.598191 0.602494 0.607608 0.613555 0.620328 0.627893 0.636182 0.645085 0.654456 0.664107 0.673818 0.683342 0.692418 0.700785 0.708193 0.714428 0.719318 0.722749 0.724673 0.725103 0.724119 0.721854 0.718482 0.714204 0.709236 0.703788 0.69806 0.692227 0.686437 0.680809 0.675429 0.670361 0.665644 0.661298 0.657328 0.653731 0.650494 0.647598 0.645024 0.642749 0.590392 0.590716 0.591403 0.592498 0.594051 0.596107 0.598711 0.601901 0.605707 0.610146 0.615224 0.620923 0.627207 0.634012 0.641252 0.648809 0.656544 0.664297 0.671889 0.679134 0.685849 0.69186 0.697016 0.701193 0.704307 0.706316 0.707219 0.707059 0.705916 0.7039 0.701139 0.697779 0.693962 0.689832 0.685519 0.681135 0.676778 0.672526 0.668441 0.664564 0.660926 0.657546 0.654432 0.651584 0.648997 0.646662 0.644566 0.594159 0.594605 0.595368 0.596487 0.597996 0.599928 0.602312 0.605173 0.608524 0.612376 0.616721 0.621539 0.626792 0.63243 0.638377 0.644545 0.650826 0.6571 0.663238 0.669106 0.674572 0.679511 0.683816 0.687395 0.690186 0.692153 0.693289 0.693616 0.693181 0.692054 0.69032 0.688075 0.685421 0.682457 0.679278 0.675975 0.672622 0.669285 0.666021 0.662868 0.659863 0.657025 0.65437 0.651906 0.649638 0.647561 0.645673 0.669861 0.670203 0.670879 0.671927 0.673385 0.675292 0.67768 0.680576 0.684002 0.687967 0.692471 0.697498 0.703011 0.70896 0.715271 0.721855 0.728602 0.735384 0.742068 0.748508 0.754565 0.760102 0.764998 0.769152 0.77249 0.774963 0.776558 0.777289 0.777199 0.776353 0.774838 0.772749 0.770192 0.76727 0.764086 0.760731 0.75729 0.753834 0.750424 0.747108 0.743922 0.740895 0.738044 0.735383 0.732916 0.730644 0.728566 0.665811 0.666007 0.666579 0.667579 0.669057 0.671067 0.673656 0.676867 0.680738 0.685293 0.690539 0.696467 0.703043 0.710208 0.717875 0.725926 0.73422 0.742588 0.750843 0.758787 0.766226 0.772967 0.778842 0.783714 0.787482 0.790089 0.791525 0.791822 0.791055 0.789332 0.786782 0.783553 0.779795 0.775656 0.771275 0.766773 0.762257 0.757813 0.753509 0.749397 0.745511 0.741876 0.738504 0.735401 0.732564 0.729987 0.727657 0.661633 0.661613 0.662013 0.662898 0.664338 0.666406 0.669171 0.672701 0.677054 0.682278 0.6884 0.695422 0.703318 0.712023 0.721431 0.731394 0.741722 0.752185 0.762527 0.772468 0.781728 0.790038 0.79716 0.802898 0.807117 0.809748 0.810793 0.810318 0.808452 0.805367 0.801269 0.79638 0.790919 0.785098 0.779104 0.773099 0.767211 0.761539 0.756157 0.751112 0.746432 0.742126 0.738199 0.73464 0.731434 0.728563 0.726005 0.657329 0.657 0.657132 0.657809 0.659126 0.661177 0.664068 0.667899 0.672764 0.678747 0.685906 0.69427 0.703828 0.714512 0.7262 0.7387 0.751756 0.765052 0.778223 0.790868 0.80258 0.812968 0.821687 0.82846 0.833104 0.835538 0.835792 0.833991 0.830356 0.825164 0.818741 0.811423 0.803536 0.795381 0.787212 0.779238 0.771611 0.76444 0.757788 0.751688 0.746144 0.741145 0.736667 0.732679 0.729146 0.726031 0.723301 0.652895 0.652137 0.651873 0.652212 0.653276 0.655202 0.658132 0.662219 0.667614 0.674453 0.68285 0.69288 0.70456 0.717831 0.732549 0.748468 0.765239 0.782415 0.799471 0.81582 0.830863 0.844019 0.854782 0.862758 0.867696 0.869514 0.868296 0.864281 0.857837 0.849418 0.839529 0.828681 0.817357 0.805981 0.794898 0.78437 0.774575 0.76561 0.757516 0.750282 0.743871 0.738224 0.733276 0.728961 0.725212 0.721971 0.719179 0.647941 0.646592 0.645758 0.645574 0.646203 0.647829 0.650657 0.654912 0.660824 0.668619 0.678499 0.690611 0.70503 0.721722 0.74052 0.761108 0.783002 0.805562 0.828016 0.849494 0.869093 0.885946 0.899302 0.908595 0.913496 0.913945 0.910143 0.902529 0.891719 0.878447 0.863487 0.847605 0.83149 0.815736 0.800804 0.787015 0.774561 0.763515 0.753857 0.745503 0.738331 0.732208 0.726998 0.722579 0.718839 0.715684 0.713035 0.641752 0.639598 0.637957 0.637 0.636936 0.638015 0.640526 0.644796 0.651178 0.660027 0.671682 0.686417 0.704398 0.725644 0.749972 0.776965 0.805952 0.836006 0.865975 0.894551 0.920365 0.94211 0.958672 0.969248 0.973428 0.971226 0.963081 0.949774 0.932346 0.911964 0.889807 0.866975 0.844421 0.822924 0.803063 0.785222 0.769593 0.756199 0.74493 0.735581 0.727903 0.721637 0.716541 0.712404 0.709052 0.706344 0.704165 0.632794 0.629563 0.62681 0.624748 0.623644 0.623831 0.625715 0.629766 0.636511 0.646502 0.660281 0.678314 0.700929 0.728234 0.760051 0.795841 0.834667 0.875168 0.915609 0.953981 0.988187 1.01628 1.03664 1.04821 1.05052 1.04375 1.02869 1.00668 0.979451 0.948876 0.916763 0.884676 0.853854 0.825213 0.79938 0.776739 0.757448 0.74147 0.728585 0.718442 0.710623 0.704692 0.700252 0.696964 0.694556 0.692822 0.691604 0.619165 0.614537 0.610315 0.606753 0.604192 0.603071 0.603944 0.607479 0.614443 0.625669 0.641991 0.664169 0.692777 0.728107 0.770045 0.817948 0.870518 0.925716 0.980798 1.03253 1.07763 1.11331 1.1376 1.14946 1.14857 1.13519 1.11028 1.0757 1.03419 0.988881 0.942823 0.898421 0.85728 0.820287 0.787834 0.760043 0.736885 0.718205 0.703697 0.692906 0.685255 0.680124 0.676918 0.675122 0.674329 0.674226 0.674598 0.598755 0.59241 0.586353 0.580886 0.576435 0.573568 0.573025 0.575728 0.582759 0.595323 0.614658 0.64194 0.678172 0.724048 0.779783 0.844837 0.917524 0.99461 1.0712 1.14128 1.19917 1.24129 1.26702 1.27762 1.27388 1.25492 1.21942 1.16816 1.10514 1.03657 0.96868 0.906095 0.851218 0.804591 0.765653 0.733486 0.707281 0.68647 0.670629 0.659313 0.651949 0.647836 0.646232 0.646435 0.647857 0.650044 0.652671 0.570765 0.562468 0.55431 0.546641 0.539979 0.535042 0.532791 0.534444 0.54146 0.555492 0.578294 0.611673 0.657428 0.717303 0.792755 0.884326 0.990405 1.10554 1.21929 1.31744 1.38707 1.42382 1.43615 1.43939 1.44101 1.43195 1.39554 1.32358 1.22277 1.1093 0.999569 0.904324 0.827615 0.768656 0.724236 0.690632 0.664789 0.64475 0.629537 0.618735 0.612056 0.609062 0.609121 0.611487 0.615437 0.620354 0.625768 0.536593 0.526298 0.515983 0.506051 0.497113 0.490046 0.486038 0.486612 0.493611 0.509157 0.535652 0.575905 0.6334 0.712614 0.818943 0.957431 1.12908 1.32475 1.51979 1.67577 1.75474 1.74452 1.68194 1.6429 1.67319 1.72942 1.72892 1.62979 1.44931 1.23633 1.03708 0.877176 0.761974 0.685371 0.637466 0.60858 0.590967 0.579425 0.5712 0.565385 0.562058 0.561507 0.563768 0.568512 0.575154 0.583042 0.591591 0.502868 0.490861 0.478712 0.466875 0.456058 0.447282 0.441937 0.441801 0.449041 0.466254 0.496731 0.545089 0.618395 0.727645 0.888558 1.11885 1.42804 1.80021 2.17945 2.47205 2.57661 2.44156 2.13828 1.90574 1.9749 2.21387 2.32812 2.18986 1.84837 1.43251 1.05811 0.782238 0.607011 0.508476 0.461097 0.445655 0.448025 0.457942 0.469001 0.478371 0.485853 0.49256 0.499796 0.508375 0.518478 0.529825 0.541933 0.485198 0.472147 0.458905 0.445988 0.434196 0.424691 0.419042 0.419258 0.427853 0.448116 0.484916 0.546379 0.646815 0.810569 1.07392 1.47756 2.04337 2.74021 3.45689 4.00711 4.18255 3.85031 3.07885 2.30762 2.29662 2.86858 3.20869 3.01937 2.41187 1.65994 1.00552 0.566427 0.342199 0.252381 0.212699 0.198587 0.213633 0.250067 0.292221 0.329766 0.359258 0.381531 0.399192 0.414836 0.430198 0.446023 0.462358 0.509335 0.496095 0.482678 0.469684 0.45807 0.449251 0.445194 0.448508 0.462661 0.49259 0.546357 0.638456 0.795263 1.06105 1.4985 2.17314 3.11503 4.26526 5.43549 6.31979 6.58099 5.99338 4.60553 2.97457 2.57851 3.57747 4.24215 4.00407 3.05628 1.871 0.865983 0.304392 0.34549 0.427097 0.405116 0.32284 0.217618 0.120942 0.0884036 0.135851 0.190474 0.233094 0.264587 0.28908 0.310316 0.330622 0.350974 0.579791 0.566849 0.553706 0.541081 0.530176 0.522881 0.521999 0.531507 0.556948 0.606309 0.692299 0.836902 1.07845 1.47837 2.11974 3.08512 4.40506 5.98704 7.56546 8.72541 9.02356 8.16769 6.20184 3.7472 2.78626 4.15396 5.13829 4.87121 3.61835 2.04016 0.723701 0.326224 0.673276 0.788531 0.745822 0.625901 0.475759 0.323035 0.186615 0.0848754 0.0660644 0.109166 0.147505 0.176413 0.200175 0.22238 0.244785 0.625959 0.613242 0.600289 0.587873 0.577342 0.570886 0.571878 0.585252 0.617996 0.680066 0.786723 0.963352 1.25298 1.72333 2.46463 3.56479 5.0523 6.81766 8.56104 9.82289 10.1186 9.13355 6.9151 4.11065 2.87143 4.38804 5.51343 5.24067 3.86384 2.12338 0.677875 0.402546 0.806453 0.924789 0.871701 0.737899 0.573475 0.40676 0.256505 0.136293 0.0643554 0.0715892 0.105056 0.13292 0.156161 0.178301 0.201174 0.579791 0.566849 0.553706 0.541081 0.530176 0.522881 0.521999 0.531507 0.556948 0.606309 0.692299 0.836902 1.07845 1.47837 2.11974 3.08512 4.40506 5.98704 7.56546 8.72541 9.02356 8.16769 6.20184 3.7472 2.78626 4.15396 5.13829 4.87121 3.61835 2.04016 0.723701 0.326224 0.673276 0.788531 0.745822 0.625901 0.475759 0.323035 0.186615 0.0848754 0.0660644 0.109166 0.147505 0.176413 0.200175 0.22238 0.244785 0.509335 0.496095 0.482678 0.469684 0.45807 0.449251 0.445194 0.448508 0.462661 0.49259 0.546357 0.638456 0.795263 1.06105 1.4985 2.17314 3.11503 4.26526 5.43549 6.31979 6.58099 5.99338 4.60553 2.97457 2.57851 3.57747 4.24215 4.00407 3.05628 1.871 0.865983 0.304392 0.34549 0.427097 0.405116 0.32284 0.217618 0.120942 0.0884036 0.135851 0.190474 0.233094 0.264587 0.28908 0.310316 0.330622 0.350974 0.485198 0.472147 0.458905 0.445988 0.434196 0.424691 0.419042 0.419258 0.427853 0.448116 0.484916 0.546379 0.646815 0.810569 1.07392 1.47756 2.04337 2.74021 3.45689 4.00711 4.18255 3.85031 3.07885 2.30762 2.29662 2.86858 3.20869 3.01937 2.41187 1.65994 1.00552 0.566427 0.342199 0.252381 0.212699 0.198587 0.213633 0.250067 0.292221 0.329766 0.359258 0.381531 0.399192 0.414836 0.430198 0.446023 0.462358 0.502868 0.490861 0.478712 0.466875 0.456058 0.447282 0.441937 0.441801 0.449041 0.466254 0.496731 0.545089 0.618395 0.727645 0.888558 1.11885 1.42804 1.80021 2.17945 2.47205 2.57661 2.44156 2.13828 1.90574 1.9749 2.21387 2.32812 2.18986 1.84837 1.43251 1.05811 0.782238 0.607011 0.508476 0.461097 0.445655 0.448025 0.457942 0.469001 0.478371 0.485853 0.49256 0.499796 0.508375 0.518478 0.529825 0.541933 0.536593 0.526298 0.515983 0.506051 0.497113 0.490046 0.486038 0.486612 0.493611 0.509157 0.535652 0.575905 0.6334 0.712614 0.818943 0.957431 1.12908 1.32475 1.51979 1.67577 1.75474 1.74452 1.68194 1.6429 1.67319 1.72942 1.72892 1.62979 1.44931 1.23633 1.03708 0.877176 0.761974 0.685371 0.637466 0.60858 0.590967 0.579425 0.5712 0.565385 0.562058 0.561507 0.563768 0.568512 0.575154 0.583042 0.591591 0.570765 0.562468 0.55431 0.546641 0.539979 0.535042 0.532791 0.534444 0.54146 0.555492 0.578294 0.611673 0.657428 0.717303 0.792755 0.884326 0.990405 1.10554 1.21929 1.31744 1.38707 1.42382 1.43615 1.43939 1.44101 1.43195 1.39554 1.32358 1.22277 1.1093 0.999569 0.904324 0.827615 0.768656 0.724236 0.690632 0.664789 0.64475 0.629537 0.618735 0.612056 0.609062 0.609121 0.611487 0.615437 0.620354 0.625768 0.598755 0.59241 0.586353 0.580886 0.576435 0.573568 0.573025 0.575728 0.582759 0.595323 0.614658 0.64194 0.678172 0.724048 0.779783 0.844837 0.917524 0.99461 1.0712 1.14128 1.19917 1.24129 1.26702 1.27762 1.27388 1.25492 1.21942 1.16816 1.10514 1.03657 0.96868 0.906095 0.851218 0.804591 0.765653 0.733486 0.707281 0.68647 0.670629 0.659313 0.651949 0.647836 0.646232 0.646435 0.647857 0.650044 0.652671 0.619165 0.614537 0.610315 0.606753 0.604192 0.603071 0.603944 0.607479 0.614443 0.625669 0.641991 0.664169 0.692777 0.728107 0.770045 0.817948 0.870518 0.925716 0.980798 1.03253 1.07763 1.11331 1.1376 1.14946 1.14857 1.13519 1.11028 1.0757 1.03419 0.988881 0.942823 0.898421 0.85728 0.820287 0.787834 0.760043 0.736885 0.718205 0.703697 0.692906 0.685255 0.680124 0.676918 0.675122 0.674329 0.674226 0.674598 0.632794 0.629563 0.62681 0.624748 0.623644 0.623831 0.625715 0.629766 0.636511 0.646502 0.660281 0.678314 0.700929 0.728234 0.760051 0.795841 0.834667 0.875168 0.915609 0.953981 0.988187 1.01628 1.03664 1.04821 1.05052 1.04375 1.02869 1.00668 0.979451 0.948876 0.916763 0.884676 0.853854 0.825213 0.79938 0.776739 0.757448 0.74147 0.728585 0.718442 0.710623 0.704692 0.700252 0.696964 0.694556 0.692822 0.691604 0.641752 0.639598 0.637957 0.637 0.636936 0.638015 0.640526 0.644796 0.651178 0.660027 0.671682 0.686417 0.704398 0.725644 0.749972 0.776965 0.805952 0.836006 0.865975 0.894551 0.920365 0.94211 0.958672 0.969248 0.973428 0.971226 0.963081 0.949774 0.932346 0.911964 0.889807 0.866975 0.844421 0.822924 0.803063 0.785222 0.769593 0.756199 0.74493 0.735581 0.727903 0.721637 0.716541 0.712404 0.709052 0.706344 0.704165 0.647941 0.646592 0.645758 0.645574 0.646203 0.647829 0.650657 0.654912 0.660824 0.668619 0.678499 0.690611 0.70503 0.721722 0.74052 0.761108 0.783002 0.805562 0.828016 0.849494 0.869093 0.885946 0.899302 0.908595 0.913496 0.913945 0.910143 0.902529 0.891719 0.878447 0.863487 0.847605 0.83149 0.815736 0.800804 0.787015 0.774561 0.763515 0.753857 0.745503 0.738331 0.732208 0.726998 0.722579 0.718839 0.715684 0.713035 0.652895 0.652137 0.651873 0.652212 0.653276 0.655202 0.658132 0.662219 0.667614 0.674453 0.68285 0.69288 0.70456 0.717831 0.732549 0.748468 0.765239 0.782415 0.799471 0.81582 0.830863 0.844019 0.854782 0.862758 0.867696 0.869514 0.868296 0.864281 0.857837 0.849418 0.839529 0.828681 0.817357 0.805981 0.794898 0.78437 0.774575 0.76561 0.757516 0.750282 0.743871 0.738224 0.733276 0.728961 0.725212 0.721971 0.719179 0.657329 0.657 0.657132 0.657809 0.659126 0.661177 0.664068 0.667899 0.672764 0.678747 0.685906 0.69427 0.703828 0.714512 0.7262 0.7387 0.751756 0.765052 0.778223 0.790868 0.80258 0.812968 0.821687 0.82846 0.833104 0.835538 0.835792 0.833991 0.830356 0.825164 0.818741 0.811423 0.803536 0.795381 0.787212 0.779238 0.771611 0.76444 0.757788 0.751688 0.746144 0.741145 0.736667 0.732679 0.729146 0.726031 0.723301 0.661633 0.661613 0.662013 0.662898 0.664338 0.666406 0.669171 0.672701 0.677054 0.682278 0.6884 0.695422 0.703318 0.712023 0.721431 0.731394 0.741722 0.752185 0.762527 0.772468 0.781728 0.790038 0.79716 0.802898 0.807117 0.809748 0.810793 0.810318 0.808452 0.805367 0.801269 0.79638 0.790919 0.785098 0.779104 0.773099 0.767211 0.761539 0.756157 0.751112 0.746432 0.742126 0.738199 0.73464 0.731434 0.728563 0.726005 0.665811 0.666007 0.666579 0.667579 0.669057 0.671067 0.673656 0.676867 0.680738 0.685293 0.690539 0.696467 0.703043 0.710208 0.717875 0.725926 0.73422 0.742588 0.750843 0.758787 0.766226 0.772967 0.778842 0.783714 0.787482 0.790089 0.791525 0.791822 0.791055 0.789332 0.786782 0.783553 0.779795 0.775656 0.771275 0.766773 0.762257 0.757813 0.753509 0.749397 0.745511 0.741876 0.738504 0.735401 0.732564 0.729987 0.727657 0.669861 0.670203 0.670879 0.671927 0.673385 0.675292 0.67768 0.680576 0.684002 0.687967 0.692471 0.697498 0.703011 0.70896 0.715271 0.721855 0.728602 0.735384 0.742068 0.748508 0.754565 0.760102 0.764998 0.769152 0.77249 0.774963 0.776558 0.777289 0.777199 0.776353 0.774838 0.772749 0.770192 0.76727 0.764086 0.760731 0.75729 0.753834 0.750424 0.747108 0.743922 0.740895 0.738044 0.735383 0.732916 0.730644 0.728566 0.746079 0.746296 0.746855 0.7478 0.749172 0.751009 0.753351 0.756228 0.759668 0.763682 0.768274 0.773432 0.779127 0.785307 0.791904 0.798825 0.80596 0.813182 0.820347 0.827307 0.833913 0.840017 0.845489 0.850216 0.854111 0.857117 0.859208 0.860392 0.860705 0.860209 0.858984 0.857129 0.854748 0.851947 0.848834 0.845503 0.842045 0.838537 0.835043 0.831618 0.828303 0.825131 0.822124 0.819298 0.816662 0.814219 0.81197 0.74179 0.741834 0.742264 0.743133 0.744498 0.746412 0.748931 0.752102 0.755969 0.760559 0.76589 0.771955 0.778728 0.786154 0.794148 0.802596 0.811353 0.820246 0.829085 0.837663 0.84577 0.853204 0.859782 0.865348 0.869787 0.873028 0.875049 0.875869 0.875558 0.874214 0.87197 0.868971 0.865369 0.861321 0.856967 0.852439 0.847849 0.843291 0.83884 0.834554 0.830476 0.826635 0.823048 0.819726 0.816667 0.81387 0.811326 0.737407 0.737205 0.737431 0.738153 0.739445 0.741384 0.744048 0.747507 0.751831 0.757072 0.76327 0.770431 0.778541 0.78754 0.797327 0.807758 0.818642 0.829745 0.840803 0.851524 0.861611 0.870777 0.878763 0.88535 0.890383 0.893773 0.895504 0.895629 0.894265 0.891585 0.887789 0.883103 0.877757 0.871966 0.865929 0.859818 0.853771 0.8479 0.842285 0.836983 0.832028 0.827441 0.823226 0.819379 0.81589 0.812744 0.809919 0.732942 0.732397 0.732318 0.732792 0.733918 0.7358 0.738547 0.742269 0.747069 0.753042 0.760259 0.768763 0.77855 0.789569 0.801701 0.814762 0.828496 0.842582 0.856643 0.870262 0.883012 0.894472 0.904269 0.912095 0.917734 0.921079 0.922133 0.921009 0.917915 0.913125 0.906969 0.899791 0.89193 0.883699 0.875373 0.867171 0.859266 0.851773 0.844774 0.838306 0.832388 0.827011 0.82216 0.817806 0.813921 0.810467 0.807415 0.728399 0.727385 0.726865 0.726954 0.727778 0.72948 0.732214 0.73614 0.741424 0.748216 0.756649 0.766812 0.778742 0.792397 0.807644 0.824245 0.841854 0.86002 0.878199 0.895786 0.912148 0.92667 0.9388 0.948097 0.954268 0.957187 0.956905 0.953638 0.947744 0.939679 0.929959 0.919116 0.907655 0.896026 0.884601 0.873665 0.863415 0.853967 0.845372 0.837635 0.830724 0.824589 0.81917 0.814403 0.810225 0.806577 0.803405 0.723354 0.721702 0.720559 0.720068 0.720395 0.721733 0.724298 0.728326 0.734068 0.741768 0.75165 0.763889 0.778585 0.795724 0.815162 0.836592 0.859535 0.883347 0.907235 0.930302 0.951605 0.970224 0.985349 0.996342 1.00281 1.00461 1.00191 0.995111 0.984815 0.971764 0.956769 0.940631 0.924091 0.907787 0.89222 0.877749 0.864592 0.852839 0.842487 0.833461 0.825646 0.818913 0.813127 0.808167 0.803922 0.8003 0.797216 0.717016 0.714504 0.712493 0.71116 0.71072 0.711431 0.713596 0.71756 0.723695 0.732391 0.74401 0.758865 0.777158 0.798936 0.824044 0.852082 0.882382 0.914012 0.945803 0.976417 1.00444 1.02851 1.04741 1.06026 1.06652 1.06609 1.05931 1.04689 1.02987 1.00945 0.98686 0.963301 0.939818 0.917272 0.896313 0.877376 0.860687 0.846286 0.834076 0.823855 0.815374 0.80837 0.802599 0.797844 0.793926 0.790701 0.788052 0.707688 0.704032 0.700836 0.698315 0.696746 0.696471 0.697911 0.70156 0.707971 0.717739 0.731442 0.749597 0.772574 0.800523 0.833291 0.870359 0.910791 0.953221 0.995903 1.03682 1.07385 1.105 1.12861 1.14341 1.14874 1.14453 1.13137 1.11045 1.08345 1.05233 1.01907 0.985402 0.952769 0.922243 0.894566 0.870194 0.849325 0.831931 0.817788 0.806536 0.797739 0.790946 0.785746 0.781784 0.778778 0.776511 0.774816 0.693254 0.688125 0.683374 0.679261 0.676132 0.674441 0.674762 0.67779 0.684332 0.695268 0.71149 0.733814 0.762871 0.798993 0.842086 0.891504 0.945933 1.00332 1.06093 1.11559 1.16415 1.2039 1.2329 1.24988 1.25404 1.24503 1.22323 1.19018 1.14853 1.10167 1.05305 1.00549 0.960988 0.920706 0.885219 0.854735 0.829251 0.80859 0.792413 0.78022 0.771392 0.765273 0.761236 0.758738 0.757347 0.756735 0.756666 0.671371 0.66444 0.657761 0.651643 0.646519 0.642974 0.641774 0.643876 0.650416 0.662656 0.681909 0.709426 0.746266 0.793156 0.850296 0.917078 0.991725 1.07093 1.14984 1.2227 1.28435 1.33185 1.36501 1.38483 1.39093 1.38067 1.35106 1.30203 1.23771 1.16509 1.09156 1.02272 0.961717 0.909515 0.865748 0.829531 0.8 0.776487 0.758461 0.745382 0.736599 0.731347 0.72883 0.728306 0.729149 0.730875 0.733135 0.641158 0.63219 0.623323 0.614912 0.607488 0.601789 0.59881 0.599813 0.606324 0.620072 0.642908 0.676726 0.723395 0.784662 0.861891 0.95542 1.06335 1.17996 1.29481 1.39423 1.46663 1.50981 1.53428 1.55557 1.57802 1.58739 1.56261 1.49362 1.38794 1.2643 1.14211 1.03447 0.946783 0.878741 0.827095 0.787855 0.757644 0.734208 0.716331 0.703423 0.695072 0.690757 0.689785 0.691364 0.694729 0.699223 0.704343 0.604193 0.593164 0.582079 0.571349 0.561605 0.553749 0.54901 0.548968 0.555543 0.570958 0.597739 0.638817 0.697757 0.77902 0.887807 1.02873 1.20217 1.39837 1.5924 1.74633 1.82428 1.81864 1.77307 1.76722 1.83914 1.93145 1.95249 1.85744 1.66535 1.43049 1.20589 1.02254 0.888448 0.797867 0.740076 0.704302 0.681845 0.666795 0.655924 0.648028 0.643019 0.641098 0.642261 0.646154 0.652176 0.659644 0.667945 0.567902 0.555145 0.542221 0.529601 0.518015 0.508519 0.502551 0.501953 0.508984 0.526374 0.557587 0.607421 0.683092 0.795584 0.960328 1.19442 1.50651 1.87974 2.2573 2.54507 2.64289 2.50431 2.21396 2.02913 2.16886 2.46709 2.61774 2.48843 2.12827 1.67411 1.25461 0.937914 0.731849 0.612986 0.553449 0.531137 0.529694 0.53743 0.547107 0.555441 0.562017 0.567872 0.574319 0.582214 0.591785 0.602777 0.614708 0.549659 0.535904 0.52196 0.50836 0.495939 0.485903 0.479877 0.479955 0.488777 0.50982 0.548213 0.612391 0.716942 0.886317 1.15659 1.56793 2.14117 2.84349 3.56152 4.10712 4.27177 3.92592 3.1507 2.42106 2.50469 3.1568 3.55398 3.38724 2.75828 1.94939 1.22384 0.718295 0.440545 0.316439 0.26398 0.250323 0.269433 0.309137 0.353655 0.392961 0.423671 0.446659 0.464627 0.480315 0.495613 0.511396 0.527792 0.577811 0.563968 0.549973 0.536462 0.524444 0.515406 0.51141 0.515213 0.530496 0.562523 0.619805 0.717393 0.88226 1.15917 1.61098 2.30251 3.26176 4.42625 5.60338 6.48404 6.73032 6.11945 4.70973 3.09232 2.78774 3.87507 4.62105 4.42863 3.4635 2.20354 1.09811 0.416291 0.331689 0.410597 0.39392 0.311411 0.204109 0.113438 0.111213 0.174195 0.234753 0.280876 0.314564 0.340375 0.36238 0.383189 0.403991 0.656973 0.643522 0.629917 0.616929 0.605844 0.598675 0.598401 0.60926 0.637185 0.690751 0.783469 0.938326 1.19474 1.61502 2.28234 3.27771 4.62777 6.23407 7.82459 8.97992 9.25628 8.36571 6.36205 3.89394 2.99553 4.44334 5.52928 5.33195 4.0702 2.40488 0.963484 0.315569 0.646752 0.792236 0.760614 0.639041 0.481259 0.318985 0.173596 0.070003 0.0811646 0.137489 0.181044 0.212789 0.23816 0.261341 0.284496 0.708576 0.695394 0.682024 0.669308 0.658691 0.652516 0.654384 0.669565 0.705567 0.773114 0.888509 1.0784 1.38712 1.88333 2.65717 3.79437 5.31859 7.11314 8.87075 10.1268 10.3964 9.37013 7.10596 4.27664 3.08247 4.67138 5.90659 5.71441 4.33327 2.50129 0.921341 0.358456 0.786682 0.94023 0.898963 0.762814 0.589592 0.412044 0.251244 0.122687 0.0566426 0.0886437 0.131003 0.162794 0.188081 0.211375 0.235084 0.656973 0.643522 0.629917 0.616929 0.605844 0.598675 0.598401 0.60926 0.637185 0.690751 0.783469 0.938326 1.19474 1.61502 2.28234 3.27771 4.62777 6.23407 7.82459 8.97992 9.25628 8.36571 6.36205 3.89394 2.99553 4.44334 5.52928 5.33195 4.0702 2.40488 0.963484 0.315569 0.646752 0.792236 0.760614 0.639041 0.481259 0.318985 0.173596 0.070003 0.0811646 0.137489 0.181044 0.212789 0.23816 0.261341 0.284496 0.577811 0.563968 0.549973 0.536462 0.524444 0.515406 0.51141 0.515213 0.530496 0.562523 0.619805 0.717393 0.88226 1.15917 1.61098 2.30251 3.26176 4.42625 5.60338 6.48404 6.73032 6.11945 4.70973 3.09232 2.78774 3.87507 4.62105 4.42863 3.4635 2.20354 1.09811 0.416291 0.331689 0.410597 0.39392 0.311411 0.204109 0.113438 0.111213 0.174195 0.234753 0.280876 0.314564 0.340375 0.36238 0.383189 0.403991 0.549659 0.535904 0.52196 0.50836 0.495939 0.485903 0.479877 0.479955 0.488777 0.50982 0.548213 0.612391 0.716942 0.886317 1.15659 1.56793 2.14117 2.84349 3.56152 4.10712 4.27177 3.92592 3.1507 2.42106 2.50469 3.1568 3.55398 3.38724 2.75828 1.94939 1.22384 0.718295 0.440545 0.316439 0.26398 0.250323 0.269433 0.309137 0.353655 0.392961 0.423671 0.446659 0.464627 0.480315 0.495613 0.511396 0.527792 0.567902 0.555145 0.542221 0.529601 0.518015 0.508519 0.502551 0.501953 0.508984 0.526374 0.557587 0.607421 0.683092 0.795584 0.960328 1.19442 1.50651 1.87974 2.2573 2.54507 2.64289 2.50431 2.21396 2.02913 2.16886 2.46709 2.61774 2.48843 2.12827 1.67411 1.25461 0.937914 0.731849 0.612986 0.553449 0.531137 0.529694 0.53743 0.547107 0.555441 0.562017 0.567872 0.574319 0.582214 0.591785 0.602777 0.614708 0.604193 0.593164 0.582079 0.571349 0.561605 0.553749 0.54901 0.548968 0.555543 0.570958 0.597739 0.638817 0.697757 0.77902 0.887807 1.02873 1.20217 1.39837 1.5924 1.74633 1.82428 1.81864 1.77307 1.76722 1.83914 1.93145 1.95249 1.85744 1.66535 1.43049 1.20589 1.02254 0.888448 0.797867 0.740076 0.704302 0.681845 0.666795 0.655924 0.648028 0.643019 0.641098 0.642261 0.646154 0.652176 0.659644 0.667945 0.641158 0.63219 0.623323 0.614912 0.607488 0.601789 0.59881 0.599813 0.606324 0.620072 0.642908 0.676726 0.723395 0.784662 0.861891 0.95542 1.06335 1.17996 1.29481 1.39423 1.46663 1.50981 1.53428 1.55557 1.57802 1.58739 1.56261 1.49362 1.38794 1.2643 1.14211 1.03447 0.946783 0.878741 0.827095 0.787855 0.757644 0.734208 0.716331 0.703423 0.695072 0.690757 0.689785 0.691364 0.694729 0.699223 0.704343 0.671371 0.66444 0.657761 0.651643 0.646519 0.642974 0.641774 0.643876 0.650416 0.662656 0.681909 0.709426 0.746266 0.793156 0.850296 0.917078 0.991725 1.07093 1.14984 1.2227 1.28435 1.33185 1.36501 1.38483 1.39093 1.38067 1.35106 1.30203 1.23771 1.16509 1.09156 1.02272 0.961717 0.909515 0.865748 0.829531 0.8 0.776487 0.758461 0.745382 0.736599 0.731347 0.72883 0.728306 0.729149 0.730875 0.733135 0.693254 0.688125 0.683374 0.679261 0.676132 0.674441 0.674762 0.67779 0.684332 0.695268 0.71149 0.733814 0.762871 0.798993 0.842086 0.891504 0.945933 1.00332 1.06093 1.11559 1.16415 1.2039 1.2329 1.24988 1.25404 1.24503 1.22323 1.19018 1.14853 1.10167 1.05305 1.00549 0.960988 0.920706 0.885219 0.854735 0.829251 0.80859 0.792413 0.78022 0.771392 0.765273 0.761236 0.758738 0.757347 0.756735 0.756666 0.707688 0.704032 0.700836 0.698315 0.696746 0.696471 0.697911 0.70156 0.707971 0.717739 0.731442 0.749597 0.772574 0.800523 0.833291 0.870359 0.910791 0.953221 0.995903 1.03682 1.07385 1.105 1.12861 1.14341 1.14874 1.14453 1.13137 1.11045 1.08345 1.05233 1.01907 0.985402 0.952769 0.922243 0.894566 0.870194 0.849325 0.831931 0.817788 0.806536 0.797739 0.790946 0.785746 0.781784 0.778778 0.776511 0.774816 0.717016 0.714504 0.712493 0.71116 0.71072 0.711431 0.713596 0.71756 0.723695 0.732391 0.74401 0.758865 0.777158 0.798936 0.824044 0.852082 0.882382 0.914012 0.945803 0.976417 1.00444 1.02851 1.04741 1.06026 1.06652 1.06609 1.05931 1.04689 1.02987 1.00945 0.98686 0.963301 0.939818 0.917272 0.896313 0.877376 0.860687 0.846286 0.834076 0.823855 0.815374 0.80837 0.802599 0.797844 0.793926 0.790701 0.788052 0.723354 0.721702 0.720559 0.720068 0.720395 0.721733 0.724298 0.728326 0.734068 0.741768 0.75165 0.763889 0.778585 0.795724 0.815162 0.836592 0.859535 0.883347 0.907235 0.930302 0.951605 0.970224 0.985349 0.996342 1.00281 1.00461 1.00191 0.995111 0.984815 0.971764 0.956769 0.940631 0.924091 0.907787 0.89222 0.877749 0.864592 0.852839 0.842487 0.833461 0.825646 0.818913 0.813127 0.808167 0.803922 0.8003 0.797216 0.728399 0.727385 0.726865 0.726954 0.727778 0.72948 0.732214 0.73614 0.741424 0.748216 0.756649 0.766812 0.778742 0.792397 0.807644 0.824245 0.841854 0.86002 0.878199 0.895786 0.912148 0.92667 0.9388 0.948097 0.954268 0.957187 0.956905 0.953638 0.947744 0.939679 0.929959 0.919116 0.907655 0.896026 0.884601 0.873665 0.863415 0.853967 0.845372 0.837635 0.830724 0.824589 0.81917 0.814403 0.810225 0.806577 0.803405 0.732942 0.732397 0.732318 0.732792 0.733918 0.7358 0.738547 0.742269 0.747069 0.753042 0.760259 0.768763 0.77855 0.789569 0.801701 0.814762 0.828496 0.842582 0.856643 0.870262 0.883012 0.894472 0.904269 0.912095 0.917734 0.921079 0.922133 0.921009 0.917915 0.913125 0.906969 0.899791 0.89193 0.883699 0.875373 0.867171 0.859266 0.851773 0.844774 0.838306 0.832388 0.827011 0.82216 0.817806 0.813921 0.810467 0.807415 0.737407 0.737205 0.737431 0.738153 0.739445 0.741384 0.744048 0.747507 0.751831 0.757072 0.76327 0.770431 0.778541 0.78754 0.797327 0.807758 0.818642 0.829745 0.840803 0.851524 0.861611 0.870777 0.878763 0.88535 0.890383 0.893773 0.895504 0.895629 0.894265 0.891585 0.887789 0.883103 0.877757 0.871966 0.865929 0.859818 0.853771 0.8479 0.842285 0.836983 0.832028 0.827441 0.823226 0.819379 0.81589 0.812744 0.809919 0.74179 0.741834 0.742264 0.743133 0.744498 0.746412 0.748931 0.752102 0.755969 0.760559 0.76589 0.771955 0.778728 0.786154 0.794148 0.802596 0.811353 0.820246 0.829085 0.837663 0.84577 0.853204 0.859782 0.865348 0.869787 0.873028 0.875049 0.875869 0.875558 0.874214 0.87197 0.868971 0.865369 0.861321 0.856967 0.852439 0.847849 0.843291 0.83884 0.834554 0.830476 0.826635 0.823048 0.819726 0.816667 0.81387 0.811326 0.746079 0.746296 0.746855 0.7478 0.749172 0.751009 0.753351 0.756228 0.759668 0.763682 0.768274 0.773432 0.779127 0.785307 0.791904 0.798825 0.80596 0.813182 0.820347 0.827307 0.833913 0.840017 0.845489 0.850216 0.854111 0.857117 0.859208 0.860392 0.860705 0.860209 0.858984 0.857129 0.854748 0.851947 0.848834 0.845503 0.842045 0.838537 0.835043 0.831618 0.828303 0.825131 0.822124 0.819298 0.816662 0.814219 0.81197 VECTORS vectors float 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.0733288 -0.0073968 0.0001973 0.0734961 -0.0078101 0.0001931 0.0737236 -0.0082211 0.0001874 0.0740176 -0.0086234 0.0001802 0.0743839 -0.0090092 0.0001715 0.0748279 -0.0093694 0.0001613 0.0753542 -0.0096935 0.0001498 0.075966 -0.0099696 0.0001372 0.0766648 -0.0101843 0.0001237 0.0774501 -0.0103236 0.0001097 0.0783184 -0.0103724 9.51e-05 0.0792631 -0.0103159 8.01e-05 0.0802741 -0.0101395 6.44e-05 0.0813371 -0.0098301 4.77e-05 0.0824343 -0.0093772 2.91e-05 0.0835436 -0.0087733 7.8e-06 0.08464 -0.0080158 -1.74e-05 0.0856961 -0.0071071 -4.76e-05 0.0866831 -0.0060557 -8.36e-05 0.0875728 -0.0048765 -0.0001261 0.0883391 -0.0035903 -0.0001748 0.0889593 -0.0022238 -0.0002287 0.0894164 -0.0008078 -0.0002863 0.0896997 0.0006239 -0.0003452 0.0898058 0.0020369 -0.0004022 0.0897387 0.0033974 -0.0004545 0.0895094 0.0046746 -0.0004988 0.0891346 0.0058423 -0.0005326 0.0886359 0.0068801 -0.0005542 0.0880376 0.0077739 -0.0005628 0.087365 0.0085159 -0.0005586 0.0866433 0.0091049 -0.0005428 0.0858958 0.0095448 -0.0005174 0.0851433 0.009844 -0.0004846 0.0844031 0.0100141 -0.000447 0.0836894 0.010069 -0.000407 0.0830126 0.0100237 -0.0003666 0.0823802 0.0098933 -0.0003273 0.0817966 0.0096925 -0.0002902 0.0812643 0.0094352 -0.000256 0.0807836 0.0091338 -0.0002247 0.0803536 0.0087995 -0.0001966 0.0799723 0.008442 -0.0001713 0.0796369 0.0080694 -0.0001486 0.0793444 0.0076886 -0.0001282 0.0790914 0.0073055 -0.0001098 0.0788744 0.0069245 -9.33e-05 0.0726548 -0.0080034 0.0002189 0.0728076 -0.0084994 0.000216 0.0730295 -0.0090002 0.0002119 0.0733289 -0.0094987 0.0002066 0.0737141 -0.0099863 0.0002003 0.0741934 -0.0104524 0.0001936 0.074774 -0.0108845 0.000187 0.0754621 -0.0112679 0.000181 0.0762618 -0.0115859 0.0001764 0.0771749 -0.01182 0.0001738 0.0781994 -0.01195 0.0001733 0.0793293 -0.0119552 0.0001751 0.0805536 -0.0118149 0.0001784 0.0818555 -0.0115095 0.0001818 0.0832124 -0.0110224 0.0001831 0.0845959 -0.0103409 0.0001797 0.0859719 -0.0094584 0.000168 0.0873026 -0.0083757 0.0001448 0.0885472 -0.0071019 0.0001071 0.0896654 -0.0056558 5.27e-05 0.0906191 -0.004065 -1.92e-05 0.0913756 -0.002366 -0.0001074 0.0919101 -0.0006017 -0.0002093 0.0922079 0.0011806 -0.0003202 0.092265 0.002932 -0.0004337 0.0920893 0.0046055 -0.0005427 0.0916988 0.0061587 -0.00064 0.0911203 0.0075564 -0.0007191 0.0903871 0.0087722 -0.0007752 0.0895357 0.0097895 -0.0008055 0.0886036 0.0106016 -0.0008097 0.0876265 0.0112105 -0.0007897 0.0866364 0.0116258 -0.0007492 0.0856607 0.0118628 -0.0006933 0.0847211 0.0119408 -0.0006273 0.0838337 0.0118812 -0.0005567 0.0830097 0.0117062 -0.0004857 0.0822554 0.011437 -0.0004178 0.0815736 0.0110938 -0.0003554 0.0809643 0.0106946 -0.0002996 0.0804253 0.0102553 -0.0002508 0.0799528 0.0097891 -0.0002088 0.0795424 0.0093075 -0.0001728 0.079189 0.0088195 -0.0001421 0.0788874 0.0083326 -0.0001158 0.0786326 0.0078525 -9.32e-05 0.0784194 0.0073836 -7.37e-05 0.0719159 -0.0086152 0.0002426 0.0720414 -0.0092071 0.0002423 0.0722448 -0.0098136 0.0002415 0.0725376 -0.0104277 0.0002408 0.0729314 -0.01104 0.0002411 0.0734381 -0.0116387 0.0002434 0.0740692 -0.0122092 0.0002494 0.074835 -0.0127338 0.0002606 0.0757442 -0.0131917 0.0002788 0.0768023 -0.0135588 0.0003053 0.0780108 -0.0138087 0.0003409 0.0793657 -0.0139126 0.0003852 0.080856 -0.013841 0.0004366 0.0824627 -0.0135652 0.0004917 0.0841578 -0.0130589 0.0005453 0.0859041 -0.0123011 0.0005907 0.0876555 -0.0112786 0.0006199 0.0893586 -0.0099882 0.0006247 0.0909552 -0.0084389 0.0005974 0.092386 -0.006654 0.0005316 0.0935946 -0.0046704 0.0004241 0.0945322 -0.0025381 0.000275 0.0951622 -0.0003179 8.85e-05 0.0954633 0.0019228 -0.0001266 0.0954318 0.0041145 -0.0003579 0.0950818 0.0061904 -0.00059 0.0944434 0.0080914 -0.0008072 0.0935598 0.00977 -0.0009934 0.0924833 0.0111926 -0.0011368 0.0912697 0.0123405 -0.0012288 0.0899747 0.0132097 -0.0012668 0.0886493 0.013809 -0.0012529 0.0873377 0.0141574 -0.0011942 0.0860753 0.0142813 -0.0011007 0.084888 0.0142113 -0.0009842 0.0837935 0.01398 -0.0008559 0.0828013 0.0136191 -0.0007261 0.0819149 0.0131585 -0.0006024 0.0811331 0.0126249 -0.0004902 0.0804513 0.0120413 -0.0003922 0.0798627 0.011427 -0.0003091 0.0793594 0.0107978 -0.0002403 0.0789331 0.010166 -0.0001842 0.0785755 0.0095415 -0.0001389 0.0782788 0.0089314 -0.0001023 0.0780354 0.0083411 -7.26e-05 0.0778387 0.0077742 -4.84e-05 0.0711059 -0.0092113 0.000269 0.0711865 -0.0099119 0.0002735 0.0713534 -0.0106409 0.0002795 0.0716217 -0.0113913 0.0002885 0.0720074 -0.0121539 0.0003027 0.0725272 -0.0129159 0.000325 0.0731987 -0.0136609 0.0003588 0.0740385 -0.0143682 0.000408 0.0750621 -0.0150121 0.0004763 0.0762817 -0.0155626 0.0005667 0.077705 -0.0159846 0.0006808 0.0793326 -0.0162393 0.0008182 0.0811556 -0.0162851 0.000975 0.083154 -0.0160798 0.0011443 0.0852938 -0.0155833 0.0013153 0.0875268 -0.0147612 0.0014741 0.08979 -0.013589 0.0016041 0.0920077 -0.0120557 0.0016876 0.0940949 -0.0101685 0.0017071 0.0959629 -0.0079548 0.0016477 0.0975261 -0.0054637 0.0014987 0.0987102 -0.0027649 0.0012562 0.0994594 5.51e-05 0.0009245 0.0997423 0.0028992 0.0005174 0.0995559 0.0056664 5.75e-05 0.0989258 0.0082613 -0.000425 0.097903 0.0106007 -0.0008956 0.0965583 0.0126201 -0.0013199 0.0949744 0.0142773 -0.0016677 0.0932381 0.0155533 -0.001917 0.0914324 0.0164507 -0.0020568 0.0896308 0.0169907 -0.0020876 0.0878934 0.0172076 -0.0020208 0.0862648 0.0171451 -0.0018757 0.0847746 0.0168506 -0.0016759 0.0834391 0.0163718 -0.0014457 0.0822632 0.0157538 -0.0012073 0.0812436 0.0150369 -0.0009781 0.080371 0.0142555 -0.0007703 0.079633 0.0134384 -0.0005904 0.0790156 0.0126081 -0.0004408 0.0785043 0.0117822 -0.0003202 0.0780856 0.0109736 -0.0002253 0.0777466 0.0101917 -0.000152 0.0774762 0.0094427 -9.6e-05 0.0772643 0.0087307 -5.33e-05 0.0771021 0.0080579 -2.07e-05 0.0702198 -0.0097602 0.0002985 0.0702322 -0.0105813 0.0003117 0.0703381 -0.0114485 0.0003305 0.0705564 -0.0123563 0.0003584 0.0709088 -0.013296 0.0004003 0.0714187 -0.0142549 0.0004623 0.0721115 -0.0152154 0.0005519 0.0730134 -0.0161539 0.0006768 0.07415 -0.0170405 0.0008447 0.0755446 -0.0178376 0.0010618 0.0772151 -0.0185007 0.0013313 0.0791712 -0.0189777 0.0016524 0.0814103 -0.0192112 0.0020182 0.0839135 -0.0191403 0.002416 0.0866416 -0.0187045 0.0028264 0.0895328 -0.0178487 0.0032238 0.0925011 -0.0165296 0.0035777 0.0954381 -0.0147221 0.0038536 0.0982183 -0.0124266 0.0040162 0.100707 -0.0096743 0.0040312 0.102771 -0.0065298 0.0038706 0.104296 -0.0030903 0.0035167 0.105194 0.0005196 0.0029667 0.105417 0.0041576 0.0022373 0.104965 0.0076766 0.001366 0.103886 0.0109378 0.0004083 0.102265 0.0138238 -0.0005667 0.100219 0.0162481 -0.0014848 0.0978829 0.0181597 -0.0022781 0.0953907 0.0195433 -0.0028923 0.0928671 0.0204158 -0.0032949 0.0904171 0.0208194 -0.0034775 0.0881208 0.0208134 -0.0034554 0.0860324 0.0204664 -0.0032625 0.0841817 0.0198496 -0.0029441 0.0825784 0.0190309 -0.0025496 0.0812165 0.0180717 -0.0021249 0.0800793 0.0170247 -0.0017081 0.0791441 0.015933 -0.0013261 0.0783856 0.0148305 -0.000995 0.0777784 0.0137425 -0.000721 0.0772988 0.0126873 -0.0005029 0.0769258 0.0116771 -0.0003349 0.0766412 0.0107197 -0.000209 0.0764295 0.0098193 -0.0001165 0.0762779 0.0089776 -4.93e-05 0.0761757 0.0081944 -1e-06 0.0692108 -0.0102187 0.0003327 0.0691249 -0.0111683 0.000361 0.0691364 -0.0121863 0.0004025 0.0692694 -0.0132697 0.0004647 0.0695519 -0.0144116 0.0005571 0.0700162 -0.0156005 0.0006919 0.0706984 -0.0168191 0.0008833 0.0716377 -0.0180421 0.0011462 0.0728747 -0.0192357 0.0014949 0.0744494 -0.0203554 0.0019409 0.0763969 -0.0213456 0.0024905 0.078743 -0.0221393 0.0031428 0.0814977 -0.0226588 0.0038879 0.0846489 -0.0228181 0.0047063 0.0881548 -0.0225278 0.005568 0.0919382 -0.0217015 0.006433 0.0958828 -0.0202652 0.0072508 0.0998336 -0.0181686 0.0079608 0.103603 -0.0153967 0.0084941 0.106984 -0.0119803 0.008777 0.109769 -0.0080028 0.0087384 0.111772 -0.0036005 0.0083215 0.112855 0.0010458 0.0074961 0.112945 0.0057256 0.0062719 0.112049 0.0102208 0.0047043 0.110251 0.0143289 0.0028929 0.1077 0.0178843 0.0009721 0.104592 0.0207725 -0.0009078 0.101144 0.0229369 -0.0026012 0.0975647 0.0243759 -0.0039872 0.094041 0.0251339 -0.004985 0.0907199 0.0252888 -0.005562 0.0877044 0.0249375 -0.0057329 0.0850549 0.0241845 -0.0055522 0.0827937 0.0231316 -0.0051013 0.0809144 0.0218714 -0.004473 0.0793895 0.0204838 -0.003758 0.0781797 0.019034 -0.0030333 0.07724 0.017573 -0.0023565 0.0765255 0.0161388 -0.0017634 0.0759945 0.0147579 -0.0012704 0.0756104 0.0134475 -0.0008787 0.0753426 0.0122177 -0.0005794 0.075166 0.0110733 -0.0003582 0.0750607 0.010015 -0.0001992 0.0750112 0.0090411 -8.73e-05 0.0750052 0.0081483 -9.9e-06 0.0680009 -0.0105274 0.0003742 0.0677783 -0.011607 0.0004271 0.0676524 -0.0127815 0.0005067 0.0676528 -0.0140515 0.0006265 0.0678154 -0.0154139 0.0008044 0.0681829 -0.0168602 0.0010623 0.0688054 -0.0183752 0.001425 0.0697394 -0.0199344 0.0019188 0.0710468 -0.0215019 0.0025682 0.0727918 -0.0230279 0.0033932 0.0750358 -0.0244467 0.0044057 0.0778313 -0.0256751 0.0056077 0.0812118 -0.0266118 0.0069894 0.0851818 -0.0271394 0.008529 0.0897038 -0.0271287 0.0101914 0.0946868 -0.0264471 0.0119255 0.099977 -0.0249724 0.0136584 0.105355 -0.0226097 0.0152895 0.11054 -0.0193125 0.0166862 0.115211 -0.0151023 0.0176873 0.119039 -0.010083 0.0181196 0.121722 -0.0044445 0.017827 0.123037 0.0015481 0.0167061 0.12287 0.0075805 0.0147397 0.121242 0.0133266 0.0120147 0.118305 0.0184893 0.0087171 0.114321 0.0228359 0.005107 0.109617 0.0262213 0.0014805 0.104544 0.0285934 -0.0018768 0.0994287 0.0299842 -0.0047243 0.0945416 0.0304896 -0.0068957 0.0900823 0.0302449 -0.0083116 0.0861745 0.0294023 -0.0089791 0.0828732 0.0281127 -0.0089793 0.0801787 0.0265138 -0.0084459 0.0780518 0.0247238 -0.0075403 0.0764286 0.022839 -0.0064256 0.0752334 0.0209347 -0.0052462 0.0743887 0.0190667 -0.0041144 0.0738214 0.017274 -0.0031048 0.0734677 0.015582 -0.002256 0.0732741 0.0140054 -0.0015773 0.073198 0.0125504 -0.0010578 0.0732068 0.0112177 -0.0006751 0.0732757 0.0100036 -0.0004021 0.073387 0.0089024 -0.0002127 0.0735276 0.0079066 -8.42e-05 0.0664238 -0.0106127 0.0004285 0.0660176 -0.0118129 0.000519 0.065701 -0.0131373 0.0006574 0.0655088 -0.0145915 0.0008669 0.0654858 -0.016178 0.0011775 0.0656871 -0.0178938 0.0016255 0.0661794 -0.0197289 0.0022514 0.0670419 -0.0216628 0.0030969 0.0683641 -0.0236616 0.0042012 0.0702435 -0.0256742 0.0055967 0.07278 -0.0276287 0.0073067 0.0760667 -0.0294278 0.0093447 0.0801775 -0.0309464 0.0117157 0.0851508 -0.0320302 0.0144166 0.0909688 -0.0324989 0.0174321 0.0975354 -0.0321549 0.0207219 0.104657 -0.0308016 0.0241968 0.112026 -0.0282698 0.0276893 0.119231 -0.0244528 0.0309318 0.125773 -0.0193428 0.0335593 0.131123 -0.0130612 0.0351536 0.134789 -0.0058702 0.035326 0.136401 0.0018413 0.0338189 0.135779 0.0096011 0.0305866 0.132973 0.0169182 0.025823 0.12826 0.0233555 0.0199288 0.122095 0.0285901 0.0134296 0.115031 0.0324483 0.0068805 0.107633 0.0349078 0.0007862 0.100398 0.0360719 -0.0044528 0.0937119 0.0361271 -0.0085687 0.0878271 0.035299 -0.0114322 0.0828713 0.0338147 -0.0130454 0.0788695 0.0318795 -0.013523 0.0757725 0.0296652 -0.0130636 0.0734841 0.0273083 -0.0119155 0.0718838 0.0249126 -0.01034 0.0708441 0.0225546 -0.0085785 0.0702431 0.0202882 -0.0068278 0.0699714 0.0181494 -0.0052272 0.0699369 0.0161602 -0.0038572 0.0700656 0.0143312 -0.0027477 0.0703009 0.0126646 -0.001891 0.0706013 0.0111568 -0.0012564 0.0709378 0.0098001 -0.000803 0.0712909 0.0085845 -0.000489 0.0716478 0.0074988 -0.0002768 0.0642772 -0.0103921 0.0005038 0.0636355 -0.0116883 0.0006475 0.0630675 -0.0131378 0.0008696 0.0626137 -0.014753 0.0012065 0.0623274 -0.0165436 0.0017047 0.0622774 -0.0185148 0.002419 0.0625497 -0.0206653 0.0034094 0.0632494 -0.0229835 0.0047371 0.0645003 -0.0254437 0.0064593 0.0664428 -0.0280011 0.0086274 0.069228 -0.0305854 0.011288 0.0730082 -0.0330933 0.0144899 0.0779212 -0.0353807 0.018293 0.0840669 -0.037256 0.0227717 0.0914762 -0.0384781 0.0280024 0.100072 -0.0387631 0.0340199 0.109628 -0.0378055 0.0407411 0.119735 -0.0353177 0.0478673 0.129792 -0.0310867 0.0548109 0.139033 -0.0250395 0.0607025 0.146611 -0.0173014 0.0645279 0.151715 -0.0082265 0.065382 0.153729 0.0016193 0.0627522 0.152358 0.0115274 0.056705 0.147708 0.0207596 0.0478788 0.140276 0.0286736 0.0372866 0.130852 0.0348275 0.0260409 0.120365 0.0390337 0.0151201 0.109719 0.041348 0.0052485 0.0996585 0.0420101 -0.0031074 0.0907021 0.041359 -0.0096958 0.0831355 0.0397532 -0.0144292 0.0770462 0.037514 -0.0173519 0.0723799 0.0348989 -0.0186208 0.0689943 0.0320977 -0.018486 0.0667036 0.0292429 -0.0172653 0.0653087 0.0264251 -0.0153086 0.0646167 0.0237056 -0.0129586 0.0644521 0.0211262 -0.010514 0.0646638 0.0187147 -0.0082033 0.0651271 0.0164881 -0.0061742 0.0657445 0.0144543 -0.0044973 0.0664432 0.0126137 -0.0031817 0.0671722 0.0109608 -0.0021952 0.0678978 0.0094859 -0.0014838 0.0685995 0.0081764 -0.0009875 0.069266 0.0070184 -0.0006504 0.0613363 -0.0097927 0.0006116 0.0604076 -0.0111414 0.0008241 0.0595278 -0.0126691 0.0011537 0.0587417 -0.014395 0.001653 0.0581108 -0.0163377 0.0023873 0.0577168 -0.0185129 0.0034318 0.0576659 -0.0209318 0.0048669 0.0580911 -0.0235973 0.0067733 0.0591541 -0.0265003 0.0092289 0.0610453 -0.0296129 0.0123128 0.0639801 -0.0328801 0.0161204 0.0681902 -0.0362068 0.0207884 0.0739077 -0.0394433 0.0265242 0.0813359 -0.0423686 0.0336199 0.0906036 -0.0446776 0.0424181 0.101701 -0.0459801 0.053194 0.114403 -0.0458225 0.0659349 0.128192 -0.0437415 0.0800556 0.142218 -0.0393515 0.0941774 0.155321 -0.0324561 0.106158 0.166153 -0.0231546 0.113519 0.173389 -0.011907 0.114216 0.175994 0.0004799 0.107449 0.173476 0.0129601 0.0940612 0.166031 0.0244342 0.0762679 0.154533 0.0339664 0.0568406 0.140338 0.0409617 0.0381873 0.124996 0.0452482 0.0218039 0.109936 0.0470425 0.0082526 0.0962419 0.0468224 -0.0025098 0.0845672 0.0451666 -0.0107543 0.0751635 0.0426179 -0.016749 0.0679867 0.0396025 -0.0206994 0.0628167 0.0364084 -0.0227859 0.0593553 0.0332048 -0.0232193 0.05729 0.0300789 -0.0222734 0.056326 0.0270725 -0.0202857 0.0561999 0.0242074 -0.0176305 0.0566832 0.0215 -0.0146764 0.0575831 0.0189654 -0.0117414 0.0587421 0.0166176 -0.0090606 0.0600372 0.0144664 -0.0067738 0.0613772 0.0125165 -0.004933 0.0626995 0.0107662 -0.0035233 0.063964 0.0092085 -0.0024892 0.0651489 0.007832 -0.0017571 0.0662445 0.0066228 -0.0012535 0.0575175 -0.0087788 0.0007648 0.0562631 -0.0101194 0.001057 0.0550247 -0.0116562 0.0015096 0.0538496 -0.0134155 0.0021912 0.0528055 -0.0154249 0.0031848 0.0519858 -0.0177122 0.0045823 0.0515139 -0.0203042 0.0064796 0.0515492 -0.0232239 0.0089713 0.0522909 -0.0264872 0.0121551 0.0539817 -0.0300961 0.016152 0.0569098 -0.0340271 0.0211506 0.0614064 -0.0382143 0.0274764 0.0678338 -0.042524 0.0356709 0.0765544 -0.0467235 0.0465391 0.0878699 -0.0504514 0.0610835 0.101921 -0.0532 0.0802192 0.118551 -0.0543307 0.1042 0.137155 -0.0531419 0.131839 0.156572 -0.0489972 0.15987 0.175087 -0.0415024 0.183029 0.1906 -0.0306842 0.195281 0.200973 -0.017111 0.192057 0.204498 -0.0018907 0.172476 0.200341 0.0134829 0.140208 0.188826 0.0274203 0.102216 0.171424 0.0385839 0.0659281 0.15042 0.0461857 0.036477 0.128356 0.0501183 0.0154971 0.107464 0.0508761 0.0017955 0.0892789 0.049314 -0.0069982 0.0745402 0.0463592 -0.013002 0.0633233 0.0427878 -0.0174657 0.0552886 0.0391207 -0.020847 0.0499181 0.035627 -0.0231624 0.0466771 0.032391 -0.0243017 0.0450932 0.0293942 -0.0242111 0.0447751 0.0265832 -0.0229688 0.0454027 0.0239122 -0.020791 0.0467101 0.0213588 -0.0179949 0.0484741 0.0189245 -0.0149336 0.0505089 0.0166255 -0.0119287 0.0526652 0.014483 -0.0092185 0.05483 0.0125153 -0.0069389 0.0569238 0.0107335 -0.005131 0.0588963 0.0091403 -0.0037663 0.0607211 0.0077311 -0.0027772 0.0623886 0.0064957 -0.0020827 0.0529533 -0.0073882 0.0009765 0.051358 -0.0086494 0.0013505 0.0497403 -0.0101122 0.0019255 0.048148 -0.0118088 0.0027824 0.0466525 -0.0137753 0.0040145 0.0453543 -0.0160514 0.0057209 0.04439 -0.018681 0.0079993 0.0439391 -0.0217106 0.0109452 0.044232 -0.0251876 0.0146708 0.0455602 -0.029154 0.0193561 0.0482871 -0.0336339 0.0253522 0.0528594 -0.038611 0.0333407 0.0598072 -0.0439924 0.0445305 0.0697202 -0.0495599 0.0608071 0.0831726 -0.0549142 0.0846448 0.100576 -0.059433 0.118498 0.12195 -0.0622708 0.163431 0.146653 -0.0624396 0.217132 0.173152 -0.0589875 0.272204 0.198978 -0.0512592 0.316265 0.220961 -0.0391688 0.33516 0.235779 -0.0233867 0.318807 0.240701 -0.0053546 0.266935 0.234345 0.0129164 0.190943 0.217177 0.0292485 0.109867 0.191548 0.0418137 0.0422262 0.161157 0.0495945 -0.0015006 0.130074 0.052602 -0.0213616 0.10172 0.0517414 -0.0247373 0.0782054 0.0483955 -0.0207162 0.0602308 0.0439421 -0.0159106 0.0474477 0.0394146 -0.013307 0.0389702 0.0353847 -0.0132299 0.0338053 0.0320262 -0.014799 0.0310956 0.0292586 -0.0169206 0.0301947 0.0268941 -0.0187142 0.0306414 0.0247427 -0.0196225 0.0320988 0.0226677 -0.0194133 0.0342994 0.020601 -0.0181428 0.0370128 0.0185324 -0.0160777 0.040035 0.0164886 -0.0135856 0.0431899 0.0145122 -0.0110245 0.0463359 0.0126452 -0.008667 0.049368 0.0109204 -0.0066703 0.0522177 0.0093579 -0.0050865 0.0548471 0.0079652 -0.0038932 0.0572422 0.0067403 -0.0030284 0.048313 -0.0057588 0.0012589 0.0463991 -0.0068718 0.0017097 0.0444234 -0.0081789 0.0023942 0.0424325 -0.0097163 0.0033989 0.0404981 -0.0115263 0.0048181 0.0387237 -0.0136593 0.0067444 0.0372522 -0.0161743 0.0092616 0.0362748 -0.0191406 0.0124513 0.0360437 -0.0226375 0.0164355 0.0368897 -0.0267493 0.0214798 0.0392485 -0.0315535 0.0281975 0.0436917 -0.0370937 0.0378777 0.050952 -0.0433348 0.0529251 0.0619162 -0.0500944 0.0772571 0.0775423 -0.0569598 0.116258 0.0986525 -0.063213 0.175603 0.125575 -0.0678115 0.258295 0.157686 -0.0694811 0.360097 0.193006 -0.0669563 0.465431 0.228084 -0.0593339 0.547491 0.258342 -0.0464327 0.57566 0.278894 -0.0290274 0.529051 0.285654 -0.0088616 0.409523 0.276466 0.0115927 0.245441 0.251917 0.0296206 0.0816209 0.2155 0.0429187 -0.0404877 0.172867 0.0502434 -0.100777 0.130269 0.0517584 -0.105529 0.0928001 0.0488578 -0.0777678 0.0632593 0.0435344 -0.0418205 0.0421012 0.0376455 -0.013015 0.0281938 0.03244 0.0037327 0.0197854 0.0284598 0.0099574 0.0152152 0.025701 0.0092783 0.013237 0.0238607 0.004996 0.0130493 0.0225498 -0.0005343 0.0141799 0.0214298 -0.0057688 0.0163401 0.0202732 -0.009774 0.0193131 0.0189699 -0.0121318 0.022894 0.0175033 -0.0128652 0.0268745 0.0159153 -0.0123106 0.0310517 0.0142737 -0.0109447 0.0352466 0.0126487 -0.0092285 0.0393172 0.011098 -0.0075095 0.043164 0.0096623 -0.0059943 0.0467279 0.0083643 -0.0047667 0.0499829 0.0072128 -0.0038284 0.0452506 -0.0041171 0.0016124 0.0430838 -0.0050281 0.0021431 0.0408193 -0.0061129 0.0029393 0.0385007 -0.0074088 0.0040918 0.0361975 -0.0089616 0.005695 0.0340122 -0.010827 0.0078339 0.0320885 -0.0130741 0.0105791 0.030622 -0.0157869 0.0140049 0.0298771 -0.0190664 0.0182642 0.0302148 -0.0230271 0.0237673 0.0321364 -0.0277858 0.0315363 0.0363418 -0.0334344 0.0438049 0.0437889 -0.0399882 0.0648708 0.0557157 -0.0473058 0.101955 0.0735561 -0.0549825 0.165304 0.0986596 -0.0622497 0.266108 0.13176 -0.0679405 0.410744 0.172265 -0.070603 0.591604 0.217629 -0.0688013 0.778818 0.263195 -0.0615397 0.920757 0.302731 -0.0486547 0.959261 0.329588 -0.0310237 0.856409 0.338182 -0.0105356 0.619273 0.325472 0.0101632 0.306248 0.292107 0.0281408 0.0066759 0.242832 0.0408668 -0.198761 0.18564 0.0469743 -0.274722 0.129539 0.0467517 -0.241319 0.0817612 0.0419839 -0.152075 0.0458878 0.0351363 -0.0592106 0.0218541 0.0283878 0.008155 0.007351 0.023057 0.0445023 -0.0005424 0.0195596 0.056937 -0.0042989 0.0176845 0.05496 -0.0055688 0.016928 0.0457578 -0.0052542 0.016747 0.0337284 -0.0037615 0.0167029 0.0214866 -0.0012591 0.0165128 0.0106795 0.0021411 0.0160443 0.002276 0.0062935 0.0152791 -0.0033908 0.0110008 0.0142697 -0.0065382 0.0160357 0.0131004 -0.007733 0.0211754 0.0118587 -0.0076523 0.0262301 0.0106197 -0.0068978 0.0310584 0.0094382 -0.0059047 0.0355695 0.0083492 -0.0049321 0.0397166 0.0073704 -0.0041003 0.0467638 -0.0026617 0.0019968 0.0444538 -0.0033279 0.002651 0.0420144 -0.004133 0.0036346 0.0394854 -0.0051107 0.0050631 0.0369328 -0.0063031 0.0070592 0.0344562 -0.0077627 0.0097407 0.0321969 -0.0095555 0.0132183 0.0303511 -0.011763 0.0176279 0.0291902 -0.0144841 0.0232428 0.0290988 -0.0178326 0.0307388 0.0306356 -0.021928 0.0417323 0.0346208 -0.0268703 0.0597201 0.042233 -0.0326929 0.091469 0.0550669 -0.0392838 0.148491 0.0750497 -0.0462809 0.24734 0.10408 -0.0529702 0.406239 0.143293 -0.0582567 0.635362 0.192063 -0.0607924 0.921301 0.247167 -0.0592927 1.2136 0.302655 -0.052944 1.42704 0.350676 -0.0417197 1.46848 0.382987 -0.0264924 1.28069 0.392709 -0.0089526 0.880626 0.37601 0.0086052 0.367643 0.333526 0.0236352 -0.109998 0.2711 0.0338897 -0.419728 0.199021 0.038129 -0.506618 0.129218 0.0366696 -0.411867 0.0712595 0.0312935 -0.233786 0.0295116 0.0244295 -0.064124 0.0031813 0.0181388 0.0507164 -0.011453 0.0135549 0.107397 -0.018606 0.0109131 0.123005 -0.0215709 0.0098815 0.116061 -0.0223518 0.0099038 0.0989744 -0.0218875 0.0104319 0.0783312 -0.020462 0.011042 0.0575034 -0.0180808 0.011469 0.0385423 -0.01472 0.0115911 0.0228148 -0.0104447 0.0113923 0.010999 -0.0054273 0.0109213 0.0030484 8.83e-05 0.0102558 -0.0016402 0.0058393 0.0094774 -0.0039361 0.0115883 0.0086568 -0.0047002 0.0171496 0.0078476 -0.0046229 0.0223969 0.0070852 -0.0041733 0.0272586 0.00639 -0.0036247 0.0537607 -0.0013565 0.0022966 0.0514135 -0.0017213 0.0031355 0.0489082 -0.0021674 0.0044201 0.0462803 -0.0027161 0.0063227 0.0435913 -0.0033944 0.0090414 0.0409368 -0.004236 0.0127899 0.038455 -0.0052834 0.0177992 0.0363407 -0.0065888 0.0243593 0.0348693 -0.0082153 0.0329595 0.0344417 -0.0102347 0.0446218 0.0356589 -0.0127218 0.0615907 0.0394319 -0.0157386 0.0885683 0.0471092 -0.0193039 0.134578 0.0605643 -0.0233437 0.21498 0.0821126 -0.027624 0.351889 0.114078 -0.0316877 0.56945 0.157879 -0.0348421 0.880199 0.212792 -0.0362571 1.26358 0.274978 -0.0351785 1.64837 0.33745 -0.0311795 1.91812 0.391176 -0.0243255 1.94958 0.426855 -0.0151959 1.67138 0.436785 -0.0048126 1.11246 0.416602 0.005481 0.410669 0.366881 0.0141911 -0.232011 0.294178 0.0199759 -0.635554 0.210469 0.0220785 -0.727099 0.13 0.0207038 -0.568909 0.0642709 0.0170061 -0.303785 0.0182592 0.0125485 -0.0620991 -0.0095152 0.0086222 0.0943569 -0.023997 0.0058892 0.166312 -0.0304574 0.0044341 0.181811 -0.0328154 0.0040025 0.168478 -0.0333181 0.0042233 0.143579 -0.0329044 0.0047473 0.115391 -0.031743 0.0053114 0.0875602 -0.0296986 0.0057535 0.0621356 -0.0266313 0.0059998 0.0406034 -0.0225341 0.0060406 0.0238383 -0.0175519 0.0059045 0.0119322 -0.011934 0.0056379 0.0042872 -0.0059682 0.0052896 -8.08e-05 7.53e-05 0.0049023 -0.0022137 0.0059789 0.0045085 -0.0029928 0.0115897 0.0041306 -0.0030527 0.0168168 0.003782 -0.0027931 0.0586077 0 0.0024042 0.0562668 0 0.0033526 0.0537541 0 0.0048203 0.0511028 0 0.0070173 0.0483721 0 0.010193 0.0456556 0 0.0146273 0.0430898 0 0.0206336 0.0408682 0 0.0286035 0.039268 0 0.0391551 0.0386956 0 0.0534908 0.0397683 0 0.0741441 0.0434315 0 0.106329 0.0510994 0 0.159989 0.0647525 0 0.252029 0.0868568 0 0.406755 0.119897 0 0.65053 0.165391 0 0.996458 0.222561 0 1.42043 0.287309 0 1.84209 0.352249 0 2.13202 0.407921 0 2.15515 0.444666 0 1.8353 0.454488 0 1.20712 0.432863 0 0.424785 0.380322 0 -0.287617 0.303652 0 -0.730345 0.215463 0 -0.823071 0.130888 0 -0.637138 0.0621961 0 -0.33463 0.0146018 0 -0.0625718 -0.0136622 0 0.110899 -0.0280379 0 0.188669 -0.0342083 0 0.203704 -0.0363293 0 0.187569 -0.0367353 0 0.159552 -0.0363614 0 0.128559 -0.0353314 0 0.0982532 -0.033455 0 0.0705963 -0.030547 0 0.0470613 -0.0265718 0 0.0285706 -0.0216623 0 0.0152651 -0.0160679 0 0.0065599 -0.0100841 0 0.0014388 -0.003992 0 -0.0011979 0.0019797 0 -0.0022954 0.007669 0 -0.0025464 0.0129778 0 -0.002395 0.0537607 0.0013565 0.0022966 0.0514135 0.0017213 0.0031355 0.0489082 0.0021674 0.0044201 0.0462803 0.0027161 0.0063227 0.0435913 0.0033944 0.0090414 0.0409368 0.004236 0.0127899 0.038455 0.0052834 0.0177992 0.0363407 0.0065888 0.0243593 0.0348693 0.0082153 0.0329595 0.0344417 0.0102347 0.0446218 0.0356589 0.0127218 0.0615907 0.0394319 0.0157386 0.0885683 0.0471092 0.0193039 0.134578 0.0605643 0.0233437 0.21498 0.0821126 0.027624 0.351889 0.114078 0.0316877 0.56945 0.157879 0.0348421 0.880199 0.212792 0.0362571 1.26358 0.274978 0.0351785 1.64837 0.33745 0.0311795 1.91812 0.391176 0.0243255 1.94958 0.426855 0.0151959 1.67138 0.436785 0.0048126 1.11246 0.416602 -0.005481 0.410669 0.366881 -0.0141911 -0.232011 0.294178 -0.0199759 -0.635554 0.210469 -0.0220785 -0.727099 0.13 -0.0207038 -0.568909 0.0642709 -0.0170061 -0.303785 0.0182592 -0.0125485 -0.0620991 -0.0095152 -0.0086222 0.0943569 -0.023997 -0.0058892 0.166312 -0.0304574 -0.0044341 0.181811 -0.0328154 -0.0040025 0.168478 -0.0333181 -0.0042233 0.143579 -0.0329044 -0.0047473 0.115391 -0.031743 -0.0053114 0.0875602 -0.0296986 -0.0057535 0.0621356 -0.0266313 -0.0059998 0.0406034 -0.0225341 -0.0060406 0.0238383 -0.0175519 -0.0059045 0.0119322 -0.011934 -0.0056379 0.0042872 -0.0059682 -0.0052896 -8.08e-05 7.53e-05 -0.0049023 -0.0022137 0.0059789 -0.0045085 -0.0029928 0.0115897 -0.0041306 -0.0030527 0.0168168 -0.003782 -0.0027931 0.0467638 0.0026617 0.0019968 0.0444538 0.0033279 0.002651 0.0420144 0.004133 0.0036346 0.0394854 0.0051107 0.0050631 0.0369328 0.0063031 0.0070592 0.0344562 0.0077627 0.0097407 0.0321969 0.0095555 0.0132183 0.0303511 0.011763 0.0176279 0.0291902 0.0144841 0.0232428 0.0290988 0.0178326 0.0307388 0.0306356 0.021928 0.0417323 0.0346208 0.0268703 0.0597201 0.042233 0.0326929 0.091469 0.0550669 0.0392838 0.148491 0.0750497 0.0462809 0.24734 0.10408 0.0529702 0.406239 0.143293 0.0582567 0.635362 0.192063 0.0607924 0.921301 0.247167 0.0592927 1.2136 0.302655 0.052944 1.42704 0.350676 0.0417197 1.46848 0.382987 0.0264924 1.28069 0.392709 0.0089526 0.880626 0.37601 -0.0086052 0.367643 0.333526 -0.0236352 -0.109998 0.2711 -0.0338897 -0.419728 0.199021 -0.038129 -0.506618 0.129218 -0.0366696 -0.411867 0.0712595 -0.0312935 -0.233786 0.0295116 -0.0244295 -0.064124 0.0031813 -0.0181388 0.0507164 -0.011453 -0.0135549 0.107397 -0.018606 -0.0109131 0.123005 -0.0215709 -0.0098815 0.116061 -0.0223518 -0.0099038 0.0989744 -0.0218875 -0.0104319 0.0783312 -0.020462 -0.011042 0.0575034 -0.0180808 -0.011469 0.0385423 -0.01472 -0.0115911 0.0228148 -0.0104447 -0.0113923 0.010999 -0.0054273 -0.0109213 0.0030484 8.83e-05 -0.0102558 -0.0016402 0.0058393 -0.0094774 -0.0039361 0.0115883 -0.0086568 -0.0047002 0.0171496 -0.0078476 -0.0046229 0.0223969 -0.0070852 -0.0041733 0.0272586 -0.00639 -0.0036247 0.0452506 0.0041171 0.0016124 0.0430838 0.0050281 0.0021431 0.0408193 0.0061129 0.0029393 0.0385007 0.0074088 0.0040918 0.0361975 0.0089616 0.005695 0.0340122 0.010827 0.0078339 0.0320885 0.0130741 0.0105791 0.030622 0.0157869 0.0140049 0.0298771 0.0190664 0.0182642 0.0302148 0.0230271 0.0237673 0.0321364 0.0277858 0.0315363 0.0363418 0.0334344 0.0438049 0.0437889 0.0399882 0.0648708 0.0557157 0.0473058 0.101955 0.0735561 0.0549825 0.165304 0.0986596 0.0622497 0.266108 0.13176 0.0679405 0.410744 0.172265 0.070603 0.591604 0.217629 0.0688013 0.778818 0.263195 0.0615397 0.920757 0.302731 0.0486547 0.959261 0.329588 0.0310237 0.856409 0.338182 0.0105356 0.619273 0.325472 -0.0101632 0.306248 0.292107 -0.0281408 0.0066759 0.242832 -0.0408668 -0.198761 0.18564 -0.0469743 -0.274722 0.129539 -0.0467517 -0.241319 0.0817612 -0.0419839 -0.152075 0.0458878 -0.0351363 -0.0592106 0.0218541 -0.0283878 0.008155 0.007351 -0.023057 0.0445023 -0.0005424 -0.0195596 0.056937 -0.0042989 -0.0176845 0.05496 -0.0055688 -0.016928 0.0457578 -0.0052542 -0.016747 0.0337284 -0.0037615 -0.0167029 0.0214866 -0.0012591 -0.0165128 0.0106795 0.0021411 -0.0160443 0.002276 0.0062935 -0.0152791 -0.0033908 0.0110008 -0.0142697 -0.0065382 0.0160357 -0.0131004 -0.007733 0.0211754 -0.0118587 -0.0076523 0.0262301 -0.0106197 -0.0068978 0.0310584 -0.0094382 -0.0059047 0.0355695 -0.0083492 -0.0049321 0.0397166 -0.0073704 -0.0041003 0.048313 0.0057588 0.0012589 0.0463991 0.0068718 0.0017097 0.0444234 0.0081789 0.0023942 0.0424325 0.0097163 0.0033989 0.0404981 0.0115263 0.0048181 0.0387237 0.0136593 0.0067444 0.0372522 0.0161743 0.0092616 0.0362748 0.0191406 0.0124513 0.0360437 0.0226375 0.0164355 0.0368897 0.0267493 0.0214798 0.0392485 0.0315535 0.0281975 0.0436917 0.0370937 0.0378777 0.050952 0.0433348 0.0529251 0.0619162 0.0500944 0.0772571 0.0775423 0.0569598 0.116258 0.0986525 0.063213 0.175603 0.125575 0.0678115 0.258295 0.157686 0.0694811 0.360097 0.193006 0.0669563 0.465431 0.228084 0.0593339 0.547491 0.258342 0.0464327 0.57566 0.278894 0.0290274 0.529051 0.285654 0.0088616 0.409523 0.276466 -0.0115927 0.245441 0.251917 -0.0296206 0.0816209 0.2155 -0.0429187 -0.0404877 0.172867 -0.0502434 -0.100777 0.130269 -0.0517584 -0.105529 0.0928001 -0.0488578 -0.0777678 0.0632593 -0.0435344 -0.0418205 0.0421012 -0.0376455 -0.013015 0.0281938 -0.03244 0.0037327 0.0197854 -0.0284598 0.0099574 0.0152152 -0.025701 0.0092783 0.013237 -0.0238607 0.004996 0.0130493 -0.0225498 -0.0005343 0.0141799 -0.0214298 -0.0057688 0.0163401 -0.0202732 -0.009774 0.0193131 -0.0189699 -0.0121318 0.022894 -0.0175033 -0.0128652 0.0268745 -0.0159153 -0.0123106 0.0310517 -0.0142737 -0.0109447 0.0352466 -0.0126487 -0.0092285 0.0393172 -0.011098 -0.0075095 0.043164 -0.0096623 -0.0059943 0.0467279 -0.0083643 -0.0047667 0.0499829 -0.0072128 -0.0038284 0.0529533 0.0073882 0.0009765 0.051358 0.0086494 0.0013505 0.0497403 0.0101122 0.0019255 0.048148 0.0118088 0.0027824 0.0466525 0.0137753 0.0040145 0.0453543 0.0160514 0.0057209 0.04439 0.018681 0.0079993 0.0439391 0.0217106 0.0109452 0.044232 0.0251876 0.0146708 0.0455602 0.029154 0.0193561 0.0482871 0.0336339 0.0253522 0.0528594 0.038611 0.0333407 0.0598072 0.0439924 0.0445305 0.0697202 0.0495599 0.0608071 0.0831726 0.0549142 0.0846448 0.100576 0.059433 0.118498 0.12195 0.0622708 0.163431 0.146653 0.0624396 0.217132 0.173152 0.0589875 0.272204 0.198978 0.0512592 0.316265 0.220961 0.0391688 0.33516 0.235779 0.0233867 0.318807 0.240701 0.0053546 0.266935 0.234345 -0.0129164 0.190943 0.217177 -0.0292485 0.109867 0.191548 -0.0418137 0.0422262 0.161157 -0.0495945 -0.0015006 0.130074 -0.052602 -0.0213616 0.10172 -0.0517414 -0.0247373 0.0782054 -0.0483955 -0.0207162 0.0602308 -0.0439421 -0.0159106 0.0474477 -0.0394146 -0.013307 0.0389702 -0.0353847 -0.0132299 0.0338053 -0.0320262 -0.014799 0.0310956 -0.0292586 -0.0169206 0.0301947 -0.0268941 -0.0187142 0.0306414 -0.0247427 -0.0196225 0.0320988 -0.0226677 -0.0194133 0.0342994 -0.020601 -0.0181428 0.0370128 -0.0185324 -0.0160777 0.040035 -0.0164886 -0.0135856 0.0431899 -0.0145122 -0.0110245 0.0463359 -0.0126452 -0.008667 0.049368 -0.0109204 -0.0066703 0.0522177 -0.0093579 -0.0050865 0.0548471 -0.0079652 -0.0038932 0.0572422 -0.0067403 -0.0030284 0.0575175 0.0087788 0.0007648 0.0562631 0.0101194 0.001057 0.0550247 0.0116562 0.0015096 0.0538496 0.0134155 0.0021912 0.0528055 0.0154249 0.0031848 0.0519858 0.0177122 0.0045823 0.0515139 0.0203042 0.0064796 0.0515492 0.0232239 0.0089713 0.0522909 0.0264872 0.0121551 0.0539817 0.0300961 0.016152 0.0569098 0.0340271 0.0211506 0.0614064 0.0382143 0.0274764 0.0678338 0.042524 0.0356709 0.0765544 0.0467235 0.0465391 0.0878699 0.0504514 0.0610835 0.101921 0.0532 0.0802192 0.118551 0.0543307 0.1042 0.137155 0.0531419 0.131839 0.156572 0.0489972 0.15987 0.175087 0.0415024 0.183029 0.1906 0.0306842 0.195281 0.200973 0.017111 0.192057 0.204498 0.0018907 0.172476 0.200341 -0.0134829 0.140208 0.188826 -0.0274203 0.102216 0.171424 -0.0385839 0.0659281 0.15042 -0.0461857 0.036477 0.128356 -0.0501183 0.0154971 0.107464 -0.0508761 0.0017955 0.0892789 -0.049314 -0.0069982 0.0745402 -0.0463592 -0.013002 0.0633233 -0.0427878 -0.0174657 0.0552886 -0.0391207 -0.020847 0.0499181 -0.035627 -0.0231624 0.0466771 -0.032391 -0.0243017 0.0450932 -0.0293942 -0.0242111 0.0447751 -0.0265832 -0.0229688 0.0454027 -0.0239122 -0.020791 0.0467101 -0.0213588 -0.0179949 0.0484741 -0.0189245 -0.0149336 0.0505089 -0.0166255 -0.0119287 0.0526652 -0.014483 -0.0092185 0.05483 -0.0125153 -0.0069389 0.0569238 -0.0107335 -0.005131 0.0588963 -0.0091403 -0.0037663 0.0607211 -0.0077311 -0.0027772 0.0623886 -0.0064957 -0.0020827 0.0613363 0.0097927 0.0006116 0.0604076 0.0111414 0.0008241 0.0595278 0.0126691 0.0011537 0.0587417 0.014395 0.001653 0.0581108 0.0163377 0.0023873 0.0577168 0.0185129 0.0034318 0.0576659 0.0209318 0.0048669 0.0580911 0.0235973 0.0067733 0.0591541 0.0265003 0.0092289 0.0610453 0.0296129 0.0123128 0.0639801 0.0328801 0.0161204 0.0681902 0.0362068 0.0207884 0.0739077 0.0394433 0.0265242 0.0813359 0.0423686 0.0336199 0.0906036 0.0446776 0.0424181 0.101701 0.0459801 0.053194 0.114403 0.0458225 0.0659349 0.128192 0.0437415 0.0800556 0.142218 0.0393515 0.0941774 0.155321 0.0324561 0.106158 0.166153 0.0231546 0.113519 0.173389 0.011907 0.114216 0.175994 -0.0004799 0.107449 0.173476 -0.0129601 0.0940612 0.166031 -0.0244342 0.0762679 0.154533 -0.0339664 0.0568406 0.140338 -0.0409617 0.0381873 0.124996 -0.0452482 0.0218039 0.109936 -0.0470425 0.0082526 0.0962419 -0.0468224 -0.0025098 0.0845672 -0.0451666 -0.0107543 0.0751635 -0.0426179 -0.016749 0.0679867 -0.0396025 -0.0206994 0.0628167 -0.0364084 -0.0227859 0.0593553 -0.0332048 -0.0232193 0.05729 -0.0300789 -0.0222734 0.056326 -0.0270725 -0.0202857 0.0561999 -0.0242074 -0.0176305 0.0566832 -0.0215 -0.0146764 0.0575831 -0.0189654 -0.0117414 0.0587421 -0.0166176 -0.0090606 0.0600372 -0.0144664 -0.0067738 0.0613772 -0.0125165 -0.004933 0.0626995 -0.0107662 -0.0035233 0.063964 -0.0092085 -0.0024892 0.0651489 -0.007832 -0.0017571 0.0662445 -0.0066228 -0.0012535 0.0642772 0.0103921 0.0005038 0.0636355 0.0116883 0.0006475 0.0630675 0.0131378 0.0008696 0.0626137 0.014753 0.0012065 0.0623274 0.0165436 0.0017047 0.0622774 0.0185148 0.002419 0.0625497 0.0206653 0.0034094 0.0632494 0.0229835 0.0047371 0.0645003 0.0254437 0.0064593 0.0664428 0.0280011 0.0086274 0.069228 0.0305854 0.011288 0.0730082 0.0330933 0.0144899 0.0779212 0.0353807 0.018293 0.0840669 0.037256 0.0227717 0.0914762 0.0384781 0.0280024 0.100072 0.0387631 0.0340199 0.109628 0.0378055 0.0407411 0.119735 0.0353177 0.0478673 0.129792 0.0310867 0.0548109 0.139033 0.0250395 0.0607025 0.146611 0.0173014 0.0645279 0.151715 0.0082265 0.065382 0.153729 -0.0016193 0.0627522 0.152358 -0.0115274 0.056705 0.147708 -0.0207596 0.0478788 0.140276 -0.0286736 0.0372866 0.130852 -0.0348275 0.0260409 0.120365 -0.0390337 0.0151201 0.109719 -0.041348 0.0052485 0.0996585 -0.0420101 -0.0031074 0.0907021 -0.041359 -0.0096958 0.0831355 -0.0397532 -0.0144292 0.0770462 -0.037514 -0.0173519 0.0723799 -0.0348989 -0.0186208 0.0689943 -0.0320977 -0.018486 0.0667036 -0.0292429 -0.0172653 0.0653087 -0.0264251 -0.0153086 0.0646167 -0.0237056 -0.0129586 0.0644521 -0.0211262 -0.010514 0.0646638 -0.0187147 -0.0082033 0.0651271 -0.0164881 -0.0061742 0.0657445 -0.0144543 -0.0044973 0.0664432 -0.0126137 -0.0031817 0.0671722 -0.0109608 -0.0021952 0.0678978 -0.0094859 -0.0014838 0.0685995 -0.0081764 -0.0009875 0.069266 -0.0070184 -0.0006504 0.0664238 0.0106127 0.0004285 0.0660176 0.0118129 0.000519 0.065701 0.0131373 0.0006574 0.0655088 0.0145915 0.0008669 0.0654858 0.016178 0.0011775 0.0656871 0.0178938 0.0016255 0.0661794 0.0197289 0.0022514 0.0670419 0.0216628 0.0030969 0.0683641 0.0236616 0.0042012 0.0702435 0.0256742 0.0055967 0.07278 0.0276287 0.0073067 0.0760667 0.0294278 0.0093447 0.0801775 0.0309464 0.0117157 0.0851508 0.0320302 0.0144166 0.0909688 0.0324989 0.0174321 0.0975354 0.0321549 0.0207219 0.104657 0.0308016 0.0241968 0.112026 0.0282698 0.0276893 0.119231 0.0244528 0.0309318 0.125773 0.0193428 0.0335593 0.131123 0.0130612 0.0351536 0.134789 0.0058702 0.035326 0.136401 -0.0018413 0.0338189 0.135779 -0.0096011 0.0305866 0.132973 -0.0169182 0.025823 0.12826 -0.0233555 0.0199288 0.122095 -0.0285901 0.0134296 0.115031 -0.0324483 0.0068805 0.107633 -0.0349078 0.0007862 0.100398 -0.0360719 -0.0044528 0.0937119 -0.0361271 -0.0085687 0.0878271 -0.035299 -0.0114322 0.0828713 -0.0338147 -0.0130454 0.0788695 -0.0318795 -0.013523 0.0757725 -0.0296652 -0.0130636 0.0734841 -0.0273083 -0.0119155 0.0718838 -0.0249126 -0.01034 0.0708441 -0.0225546 -0.0085785 0.0702431 -0.0202882 -0.0068278 0.0699714 -0.0181494 -0.0052272 0.0699369 -0.0161602 -0.0038572 0.0700656 -0.0143312 -0.0027477 0.0703009 -0.0126646 -0.001891 0.0706013 -0.0111568 -0.0012564 0.0709378 -0.0098001 -0.000803 0.0712909 -0.0085845 -0.000489 0.0716478 -0.0074988 -0.0002768 0.0680009 0.0105274 0.0003742 0.0677783 0.011607 0.0004271 0.0676524 0.0127815 0.0005067 0.0676528 0.0140515 0.0006265 0.0678154 0.0154139 0.0008044 0.0681829 0.0168602 0.0010623 0.0688054 0.0183752 0.001425 0.0697394 0.0199344 0.0019188 0.0710468 0.0215019 0.0025682 0.0727918 0.0230279 0.0033932 0.0750358 0.0244467 0.0044057 0.0778313 0.0256751 0.0056077 0.0812118 0.0266118 0.0069894 0.0851818 0.0271394 0.008529 0.0897038 0.0271287 0.0101914 0.0946868 0.0264471 0.0119255 0.099977 0.0249724 0.0136584 0.105355 0.0226097 0.0152895 0.11054 0.0193125 0.0166862 0.115211 0.0151023 0.0176873 0.119039 0.010083 0.0181196 0.121722 0.0044445 0.017827 0.123037 -0.0015481 0.0167061 0.12287 -0.0075805 0.0147397 0.121242 -0.0133266 0.0120147 0.118305 -0.0184893 0.0087171 0.114321 -0.0228359 0.005107 0.109617 -0.0262213 0.0014805 0.104544 -0.0285934 -0.0018768 0.0994287 -0.0299842 -0.0047243 0.0945416 -0.0304896 -0.0068957 0.0900823 -0.0302449 -0.0083116 0.0861745 -0.0294023 -0.0089791 0.0828732 -0.0281127 -0.0089793 0.0801787 -0.0265138 -0.0084459 0.0780518 -0.0247238 -0.0075403 0.0764286 -0.022839 -0.0064256 0.0752334 -0.0209347 -0.0052462 0.0743887 -0.0190667 -0.0041144 0.0738214 -0.017274 -0.0031048 0.0734677 -0.015582 -0.002256 0.0732741 -0.0140054 -0.0015773 0.073198 -0.0125504 -0.0010578 0.0732068 -0.0112177 -0.0006751 0.0732757 -0.0100036 -0.0004021 0.073387 -0.0089024 -0.0002127 0.0735276 -0.0079066 -8.42e-05 0.0692108 0.0102187 0.0003327 0.0691249 0.0111683 0.000361 0.0691364 0.0121863 0.0004025 0.0692694 0.0132697 0.0004647 0.0695519 0.0144116 0.0005571 0.0700162 0.0156005 0.0006919 0.0706984 0.0168191 0.0008833 0.0716377 0.0180421 0.0011462 0.0728747 0.0192357 0.0014949 0.0744494 0.0203554 0.0019409 0.0763969 0.0213456 0.0024905 0.078743 0.0221393 0.0031428 0.0814977 0.0226588 0.0038879 0.0846489 0.0228181 0.0047063 0.0881548 0.0225278 0.005568 0.0919382 0.0217015 0.006433 0.0958828 0.0202652 0.0072508 0.0998336 0.0181686 0.0079608 0.103603 0.0153967 0.0084941 0.106984 0.0119803 0.008777 0.109769 0.0080028 0.0087384 0.111772 0.0036005 0.0083215 0.112855 -0.0010458 0.0074961 0.112945 -0.0057256 0.0062719 0.112049 -0.0102208 0.0047043 0.110251 -0.0143289 0.0028929 0.1077 -0.0178843 0.0009721 0.104592 -0.0207725 -0.0009078 0.101144 -0.0229369 -0.0026012 0.0975647 -0.0243759 -0.0039872 0.094041 -0.0251339 -0.004985 0.0907199 -0.0252888 -0.005562 0.0877044 -0.0249375 -0.0057329 0.0850549 -0.0241845 -0.0055522 0.0827937 -0.0231316 -0.0051013 0.0809144 -0.0218714 -0.004473 0.0793895 -0.0204838 -0.003758 0.0781797 -0.019034 -0.0030333 0.07724 -0.017573 -0.0023565 0.0765255 -0.0161388 -0.0017634 0.0759945 -0.0147579 -0.0012704 0.0756104 -0.0134475 -0.0008787 0.0753426 -0.0122177 -0.0005794 0.075166 -0.0110733 -0.0003582 0.0750607 -0.010015 -0.0001992 0.0750112 -0.0090411 -8.73e-05 0.0750052 -0.0081483 -9.9e-06 0.0702198 0.0097602 0.0002985 0.0702322 0.0105813 0.0003117 0.0703381 0.0114485 0.0003305 0.0705564 0.0123563 0.0003584 0.0709088 0.013296 0.0004003 0.0714187 0.0142549 0.0004623 0.0721115 0.0152154 0.0005519 0.0730134 0.0161539 0.0006768 0.07415 0.0170405 0.0008447 0.0755446 0.0178376 0.0010618 0.0772151 0.0185007 0.0013313 0.0791712 0.0189777 0.0016524 0.0814103 0.0192112 0.0020182 0.0839135 0.0191403 0.002416 0.0866416 0.0187045 0.0028264 0.0895328 0.0178487 0.0032238 0.0925011 0.0165296 0.0035777 0.0954381 0.0147221 0.0038536 0.0982183 0.0124266 0.0040162 0.100707 0.0096743 0.0040312 0.102771 0.0065298 0.0038706 0.104296 0.0030903 0.0035167 0.105194 -0.0005196 0.0029667 0.105417 -0.0041576 0.0022373 0.104965 -0.0076766 0.001366 0.103886 -0.0109378 0.0004083 0.102265 -0.0138238 -0.0005667 0.100219 -0.0162481 -0.0014848 0.0978829 -0.0181597 -0.0022781 0.0953907 -0.0195433 -0.0028923 0.0928671 -0.0204158 -0.0032949 0.0904171 -0.0208194 -0.0034775 0.0881208 -0.0208134 -0.0034554 0.0860324 -0.0204664 -0.0032625 0.0841817 -0.0198496 -0.0029441 0.0825784 -0.0190309 -0.0025496 0.0812165 -0.0180717 -0.0021249 0.0800793 -0.0170247 -0.0017081 0.0791441 -0.015933 -0.0013261 0.0783856 -0.0148305 -0.000995 0.0777784 -0.0137425 -0.000721 0.0772988 -0.0126873 -0.0005029 0.0769258 -0.0116771 -0.0003349 0.0766412 -0.0107197 -0.000209 0.0764295 -0.0098193 -0.0001165 0.0762779 -0.0089776 -4.93e-05 0.0761757 -0.0081944 -1e-06 0.0711059 0.0092113 0.000269 0.0711865 0.0099119 0.0002735 0.0713534 0.0106409 0.0002795 0.0716217 0.0113913 0.0002885 0.0720074 0.0121539 0.0003027 0.0725272 0.0129159 0.000325 0.0731987 0.0136609 0.0003588 0.0740385 0.0143682 0.000408 0.0750621 0.0150121 0.0004763 0.0762817 0.0155626 0.0005667 0.077705 0.0159846 0.0006808 0.0793326 0.0162393 0.0008182 0.0811556 0.0162851 0.000975 0.083154 0.0160798 0.0011443 0.0852938 0.0155833 0.0013153 0.0875268 0.0147612 0.0014741 0.08979 0.013589 0.0016041 0.0920077 0.0120557 0.0016876 0.0940949 0.0101685 0.0017071 0.0959629 0.0079548 0.0016477 0.0975261 0.0054637 0.0014987 0.0987102 0.0027649 0.0012562 0.0994594 -5.51e-05 0.0009245 0.0997423 -0.0028992 0.0005174 0.0995559 -0.0056664 5.75e-05 0.0989258 -0.0082613 -0.000425 0.097903 -0.0106007 -0.0008956 0.0965583 -0.0126201 -0.0013199 0.0949744 -0.0142773 -0.0016677 0.0932381 -0.0155533 -0.001917 0.0914324 -0.0164507 -0.0020568 0.0896308 -0.0169907 -0.0020876 0.0878934 -0.0172076 -0.0020208 0.0862648 -0.0171451 -0.0018757 0.0847746 -0.0168506 -0.0016759 0.0834391 -0.0163718 -0.0014457 0.0822632 -0.0157538 -0.0012073 0.0812436 -0.0150369 -0.0009781 0.080371 -0.0142555 -0.0007703 0.079633 -0.0134384 -0.0005904 0.0790156 -0.0126081 -0.0004408 0.0785043 -0.0117822 -0.0003202 0.0780856 -0.0109736 -0.0002253 0.0777466 -0.0101917 -0.000152 0.0774762 -0.0094427 -9.6e-05 0.0772643 -0.0087307 -5.33e-05 0.0771021 -0.0080579 -2.07e-05 0.0719159 0.0086152 0.0002426 0.0720414 0.0092071 0.0002423 0.0722448 0.0098136 0.0002415 0.0725376 0.0104277 0.0002408 0.0729314 0.01104 0.0002411 0.0734381 0.0116387 0.0002434 0.0740692 0.0122092 0.0002494 0.074835 0.0127338 0.0002606 0.0757442 0.0131917 0.0002788 0.0768023 0.0135588 0.0003053 0.0780108 0.0138087 0.0003409 0.0793657 0.0139126 0.0003852 0.080856 0.013841 0.0004366 0.0824627 0.0135652 0.0004917 0.0841578 0.0130589 0.0005453 0.0859041 0.0123011 0.0005907 0.0876555 0.0112786 0.0006199 0.0893586 0.0099882 0.0006247 0.0909552 0.0084389 0.0005974 0.092386 0.006654 0.0005316 0.0935946 0.0046704 0.0004241 0.0945322 0.0025381 0.000275 0.0951622 0.0003179 8.85e-05 0.0954633 -0.0019228 -0.0001266 0.0954318 -0.0041145 -0.0003579 0.0950818 -0.0061904 -0.00059 0.0944434 -0.0080914 -0.0008072 0.0935598 -0.00977 -0.0009934 0.0924833 -0.0111926 -0.0011368 0.0912697 -0.0123405 -0.0012288 0.0899747 -0.0132097 -0.0012668 0.0886493 -0.013809 -0.0012529 0.0873377 -0.0141574 -0.0011942 0.0860753 -0.0142813 -0.0011007 0.084888 -0.0142113 -0.0009842 0.0837935 -0.01398 -0.0008559 0.0828013 -0.0136191 -0.0007261 0.0819149 -0.0131585 -0.0006024 0.0811331 -0.0126249 -0.0004902 0.0804513 -0.0120413 -0.0003922 0.0798627 -0.011427 -0.0003091 0.0793594 -0.0107978 -0.0002403 0.0789331 -0.010166 -0.0001842 0.0785755 -0.0095415 -0.0001389 0.0782788 -0.0089314 -0.0001023 0.0780354 -0.0083411 -7.26e-05 0.0778387 -0.0077742 -4.84e-05 0.0726548 0.0080034 0.0002189 0.0728076 0.0084994 0.000216 0.0730295 0.0090002 0.0002119 0.0733289 0.0094987 0.0002066 0.0737141 0.0099863 0.0002003 0.0741934 0.0104524 0.0001936 0.074774 0.0108845 0.000187 0.0754621 0.0112679 0.000181 0.0762618 0.0115859 0.0001764 0.0771749 0.01182 0.0001738 0.0781994 0.01195 0.0001733 0.0793293 0.0119552 0.0001751 0.0805536 0.0118149 0.0001784 0.0818555 0.0115095 0.0001818 0.0832124 0.0110224 0.0001831 0.0845959 0.0103409 0.0001797 0.0859719 0.0094584 0.000168 0.0873026 0.0083757 0.0001448 0.0885472 0.0071019 0.0001071 0.0896654 0.0056558 5.27e-05 0.0906191 0.004065 -1.92e-05 0.0913756 0.002366 -0.0001074 0.0919101 0.0006017 -0.0002093 0.0922079 -0.0011806 -0.0003202 0.092265 -0.002932 -0.0004337 0.0920893 -0.0046055 -0.0005427 0.0916988 -0.0061587 -0.00064 0.0911203 -0.0075564 -0.0007191 0.0903871 -0.0087722 -0.0007752 0.0895357 -0.0097895 -0.0008055 0.0886036 -0.0106016 -0.0008097 0.0876265 -0.0112105 -0.0007897 0.0866364 -0.0116258 -0.0007492 0.0856607 -0.0118628 -0.0006933 0.0847211 -0.0119408 -0.0006273 0.0838337 -0.0118812 -0.0005567 0.0830097 -0.0117062 -0.0004857 0.0822554 -0.011437 -0.0004178 0.0815736 -0.0110938 -0.0003554 0.0809643 -0.0106946 -0.0002996 0.0804253 -0.0102553 -0.0002508 0.0799528 -0.0097891 -0.0002088 0.0795424 -0.0093075 -0.0001728 0.079189 -0.0088195 -0.0001421 0.0788874 -0.0083326 -0.0001158 0.0786326 -0.0078525 -9.32e-05 0.0784194 -0.0073836 -7.37e-05 0.0733288 0.0073968 0.0001973 0.0734961 0.0078101 0.0001931 0.0737236 0.0082211 0.0001874 0.0740176 0.0086234 0.0001802 0.0743839 0.0090092 0.0001715 0.0748279 0.0093694 0.0001613 0.0753542 0.0096935 0.0001498 0.075966 0.0099696 0.0001372 0.0766648 0.0101843 0.0001237 0.0774501 0.0103236 0.0001097 0.0783184 0.0103724 9.51e-05 0.0792631 0.0103159 8.01e-05 0.0802741 0.0101395 6.44e-05 0.0813371 0.0098301 4.77e-05 0.0824343 0.0093772 2.91e-05 0.0835436 0.0087733 7.8e-06 0.08464 0.0080158 -1.74e-05 0.0856961 0.0071071 -4.76e-05 0.0866831 0.0060557 -8.36e-05 0.0875728 0.0048765 -0.0001261 0.0883391 0.0035903 -0.0001748 0.0889593 0.0022238 -0.0002287 0.0894164 0.0008078 -0.0002863 0.0896997 -0.0006239 -0.0003452 0.0898058 -0.0020369 -0.0004022 0.0897387 -0.0033974 -0.0004545 0.0895094 -0.0046746 -0.0004988 0.0891346 -0.0058423 -0.0005326 0.0886359 -0.0068801 -0.0005542 0.0880376 -0.0077739 -0.0005628 0.087365 -0.0085159 -0.0005586 0.0866433 -0.0091049 -0.0005428 0.0858958 -0.0095448 -0.0005174 0.0851433 -0.009844 -0.0004846 0.0844031 -0.0100141 -0.000447 0.0836894 -0.010069 -0.000407 0.0830126 -0.0100237 -0.0003666 0.0823802 -0.0098933 -0.0003273 0.0817966 -0.0096925 -0.0002902 0.0812643 -0.0094352 -0.000256 0.0807836 -0.0091338 -0.0002247 0.0803536 -0.0087995 -0.0001966 0.0799723 -0.008442 -0.0001713 0.0796369 -0.0080694 -0.0001486 0.0793444 -0.0076886 -0.0001282 0.0790914 -0.0073055 -0.0001098 0.0788744 -0.0069245 -9.33e-05 0.146776 -0.0141075 0.0007811 0.147068 -0.0149052 0.0007643 0.147474 -0.0157007 0.0007411 0.148006 -0.016482 0.0007109 0.148676 -0.0172346 0.0006733 0.149494 -0.0179417 0.0006282 0.150468 -0.0185834 0.0005755 0.151607 -0.0191373 0.0005151 0.152913 -0.0195786 0.0004474 0.154386 -0.0198805 0.0003726 0.156021 -0.0200145 0.0002909 0.157807 -0.0199522 0.0002028 0.159724 -0.0196656 0.0001081 0.161748 -0.0191294 6.5e-06 0.163845 -0.0183225 -0.0001028 0.165974 -0.0172299 -0.0002202 0.16809 -0.0158448 -0.0003469 0.17014 -0.0141704 -0.0004834 0.17207 -0.0122209 -0.0006299 0.173826 -0.0100224 -0.0007861 0.175357 -0.0076128 -0.0009495 0.17662 -0.0050405 -0.001117 0.17758 -0.0023627 -0.0012843 0.178214 0.0003578 -0.0014452 0.178514 0.003056 -0.0015931 0.178485 0.0056679 -0.0017218 0.178144 0.0081344 -0.0018251 0.17752 0.0104048 -0.0018978 0.176654 0.0124384 -0.0019375 0.175589 0.0142064 -0.0019432 0.174372 0.0156922 -0.0019158 0.173051 0.0168907 -0.0018587 0.171669 0.0178072 -0.0017769 0.170267 0.0184557 -0.0016758 0.168878 0.0188566 -0.0015615 0.16753 0.0190347 -0.0014397 0.166244 0.0190174 -0.0013153 0.165035 0.0188327 -0.0011922 0.163913 0.0185081 -0.0010734 0.162884 0.0180696 -0.0009607 0.16195 0.0175412 -0.0008552 0.161109 0.0169441 -0.0007573 0.160359 0.0162969 -0.0006672 0.159695 0.0156158 -0.0005843 0.159112 0.0149142 -0.0005083 0.158605 0.0142035 -0.0004388 0.158166 0.0134928 -0.0003752 0.145477 -0.0152451 0.0008641 0.145738 -0.0161997 0.0008511 0.146129 -0.0171656 0.0008316 0.146667 -0.0181299 0.0008052 0.147367 -0.0190766 0.000772 0.148245 -0.0199862 0.0007321 0.149316 -0.0208352 0.0006861 0.150593 -0.0215962 0.0006345 0.152083 -0.0222378 0.0005785 0.153792 -0.0227251 0.0005186 0.155716 -0.0230205 0.0004554 0.157847 -0.0230842 0.000389 0.160164 -0.0228767 0.0003183 0.162637 -0.0223605 0.0002414 0.165225 -0.0215027 0.0001551 0.167875 -0.0202781 5.57e-05 0.170525 -0.0186723 -6.19e-05 0.173103 -0.0166842 -0.0002021 0.175533 -0.0143291 -0.0003684 0.177737 -0.0116392 -0.0005627 0.179642 -0.0086645 -0.0007845 0.181185 -0.0054711 -0.001029 0.182316 -0.0021381 -0.0012899 0.183003 0.0012462 -0.0015565 0.183236 0.0045901 -0.0018152 0.183025 0.0078044 -0.0020524 0.182401 0.0108078 -0.002254 0.181411 0.0135314 -0.0024076 0.180116 0.0159228 -0.0025052 0.178583 0.0179475 -0.0025424 0.176882 0.0195892 -0.0025195 0.175079 0.0208486 -0.0024416 0.173237 0.0217405 -0.0023175 0.171408 0.0222915 -0.0021578 0.169633 0.0225359 -0.001975 0.167947 0.0225124 -0.0017804 0.166371 0.0222618 -0.0015838 0.16492 0.0218242 -0.0013929 0.1636 0.0212372 -0.0012134 0.162414 0.0205352 -0.0010484 0.161357 0.0197484 -0.0008992 0.160425 0.0189029 -0.000766 0.15961 0.0180207 -0.0006478 0.158902 0.0171198 -0.0005431 0.158294 0.0162149 -0.0004505 0.157774 0.0153177 -0.0003685 0.157336 0.0144373 -0.0002958 0.144062 -0.0163878 0.0009528 0.144267 -0.0175235 0.0009467 0.144618 -0.0186896 0.0009351 0.145137 -0.0198731 0.0009184 0.145847 -0.0210568 0.0008974 0.14677 -0.022219 0.0008737 0.14793 -0.0233325 0.0008493 0.149345 -0.0243644 0.0008264 0.151034 -0.0252758 0.0008078 0.153009 -0.0260219 0.0007955 0.155273 -0.0265527 0.0007905 0.157821 -0.026814 0.0007927 0.160635 -0.0267499 0.0007986 0.163679 -0.026305 0.0008029 0.166905 -0.0254289 0.0007968 0.170243 -0.02408 0.0007694 0.173609 -0.0222305 0.0007076 0.176901 -0.0198714 0.0005983 0.180012 -0.0170165 0.0004298 0.182828 -0.0137055 0.000193 0.185241 -0.0100042 -0.000115 0.187156 -0.0060035 -0.0004905 0.188499 -0.0018147 -0.0009239 0.189227 0.0024367 -0.0013952 0.189325 0.0066204 -0.0018804 0.188817 0.0106098 -0.0023494 0.187752 0.0142912 -0.0027727 0.186209 0.0175716 -0.0031202 0.184282 0.0203833 -0.0033712 0.182075 0.0226862 -0.003511 0.179692 0.0244678 -0.003536 0.17723 0.0257399 -0.0034525 0.174774 0.0265341 -0.0032758 0.172392 0.0268967 -0.0030269 0.170136 0.0268832 -0.0027297 0.168043 0.0265528 -0.0024077 0.166132 0.0259649 -0.0020818 0.164414 0.0251754 -0.0017685 0.162889 0.0242351 -0.001479 0.161549 0.0231881 -0.0012198 0.160383 0.022072 -0.000993 0.159379 0.0209174 -0.0007982 0.158521 0.0197491 -0.0006326 0.157794 0.0185865 -0.0004925 0.157185 0.0174445 -0.0003742 0.156678 0.016334 -0.000274 0.156263 0.0152631 -0.0001889 0.142521 -0.0174945 0.0010464 0.142635 -0.0188353 0.0010523 0.142912 -0.0202324 0.001056 0.143378 -0.0216738 0.0010592 0.144065 -0.0231422 0.0010653 0.145005 -0.0246144 0.0010786 0.146232 -0.0260601 0.0011046 0.147777 -0.0274408 0.0011492 0.149672 -0.0287094 0.0012188 0.151941 -0.0298094 0.001318 0.1546 -0.0306755 0.0014495 0.157653 -0.0312347 0.0016121 0.161086 -0.0314083 0.0017988 0.164865 -0.0311163 0.0019972 0.168927 -0.0302815 0.0021883 0.173186 -0.0288371 0.0023479 0.177525 -0.0267332 0.0024472 0.181803 -0.0239455 0.002456 0.18586 -0.0204821 0.0023451 0.189529 -0.0163891 0.0020912 0.192646 -0.0117532 0.0016785 0.195067 -0.0067 0.0011046 0.196679 -0.0013878 0.0003812 0.197418 0.0040033 -0.0004622 0.19727 0.0092844 -0.001381 0.196274 0.0142744 -0.0023181 0.194518 0.0188133 -0.003209 0.192132 0.0227739 -0.0039906 0.189265 0.0260701 -0.0046087 0.18608 0.0286587 -0.0050239 0.182732 0.0305372 -0.005219 0.179363 0.0317383 -0.0051969 0.176088 0.0323214 -0.004982 0.172995 0.032364 -0.0046122 0.170145 0.0319525 -0.0041348 0.167572 0.0311752 -0.0035977 0.16529 0.0301164 -0.0030448 0.163297 0.0288526 -0.002511 0.161577 0.0274498 -0.0020211 0.16011 0.0259635 -0.0015892 0.158871 0.0244381 -0.0012206 0.157835 0.0229087 -0.0009138 0.156976 0.0214013 -0.0006632 0.156272 0.0199352 -0.0004608 0.155701 0.0185239 -0.0002984 0.155244 0.0171763 -0.0001679 0.154886 0.0158979 -6.28e-05 0.140844 -0.0185048 0.0011423 0.140825 -0.0200719 0.0011687 0.140979 -0.0217293 0.0011999 0.141345 -0.0234672 0.0012414 0.14196 -0.0252701 0.0013011 0.142872 -0.0271147 0.0013893 0.144128 -0.028969 0.0015182 0.145779 -0.0307898 0.0017012 0.147874 -0.0325216 0.0019512 0.150459 -0.0340952 0.0022786 0.153572 -0.0354272 0.0026886 0.157232 -0.0364208 0.003179 0.161439 -0.0369679 0.0037366 0.166161 -0.0369535 0.004338 0.171328 -0.0362624 0.0049473 0.17683 -0.0347884 0.0055187 0.182507 -0.0324457 0.005997 0.188158 -0.029182 0.0063222 0.19355 -0.0249906 0.0064326 0.198426 -0.019922 0.0062714 0.202536 -0.0140887 0.0057931 0.205653 -0.0076649 0.0049735 0.207607 -0.0008776 0.0038132 0.208296 0.0060108 0.00235 0.207708 0.012725 0.0006565 0.205917 0.0190019 -0.0011627 0.203077 0.024615 -0.002981 0.1994 0.0293924 -0.0046625 0.19513 0.0332275 -0.0060862 0.190522 0.03608 -0.0071547 0.18581 0.0379705 -0.0078112 0.181197 0.0389686 -0.0080437 0.17684 0.0391782 -0.0078835 0.172847 0.0387231 -0.0073959 0.169281 0.037734 -0.0066681 0.166168 0.0363376 -0.0057946 0.163501 0.0346499 -0.0048645 0.161253 0.0327715 -0.0039512 0.159386 0.030786 -0.0031082 0.157855 0.0287597 -0.0023678 0.156613 0.0267434 -0.0017434 0.155617 0.0247742 -0.0012342 0.154828 0.0228778 -0.0008298 0.154212 0.021071 -0.000515 0.153741 0.019364 -0.0002734 0.153388 0.0177614 -8.91e-05 0.153135 0.0162647 5.12e-05 0.138941 -0.0193355 0.0012402 0.138731 -0.0211435 0.0012996 0.138701 -0.0230839 0.0013779 0.138896 -0.0251516 0.001487 0.139371 -0.0273349 0.0016436 0.140186 -0.0296133 0.0018688 0.141409 -0.0319553 0.002187 0.143117 -0.0343152 0.0026242 0.145386 -0.0366306 0.0032055 0.148295 -0.0388199 0.0039507 0.151912 -0.0407802 0.0048698 0.156291 -0.0423868 0.00596 0.161455 -0.0434946 0.0072012 0.167387 -0.0439427 0.0085556 0.174013 -0.0435617 0.0099666 0.181196 -0.0421868 0.0113596 0.188722 -0.0396744 0.0126422 0.196305 -0.0359228 0.0137057 0.203595 -0.030894 0.0144292 0.210202 -0.0246336 0.0146862 0.215732 -0.0172844 0.0143579 0.219828 -0.009088 0.0133535 0.222215 -0.0003719 0.0116303 0.222741 0.0084772 0.0092165 0.221398 0.0170522 0.0062212 0.218324 0.0249693 0.0028281 0.213785 0.0319073 -0.0007183 0.208138 0.0376362 -0.0041477 0.201782 0.0420319 -0.0071996 0.195114 0.0450732 -0.0096579 0.18849 0.0468271 -0.0113794 0.182194 0.0474262 -0.0123072 0.176433 0.0470432 -0.0124709 0.171329 0.0458684 -0.0119729 0.166937 0.0440907 -0.0109653 0.163253 0.0418845 -0.0096227 0.160232 0.0394019 -0.0081162 0.157807 0.0367692 -0.0065929 0.155896 0.0340863 -0.0051638 0.154418 0.0314289 -0.0038995 0.153295 0.0288511 -0.0028338 0.152459 0.0263894 -0.0019711 0.151852 0.0240663 -0.001296 0.151427 0.0218937 -0.0007821 0.151146 0.0198756 -0.0003992 0.150978 0.0180109 -0.0001182 0.1509 0.016295 8.63e-05 0.136657 -0.0198743 0.0013409 0.136183 -0.0219251 0.0014516 0.135886 -0.0241581 0.0016056 0.135823 -0.0265754 0.0018264 0.136061 -0.0291722 0.0021453 0.136681 -0.0319341 0.002601 0.137778 -0.0348343 0.0032377 0.139459 -0.0378284 0.0041021 0.141843 -0.0408514 0.0052377 0.145053 -0.0438122 0.0066791 0.14921 -0.04659 0.0084461 0.154416 -0.049031 0.010539 0.16074 -0.0509474 0.0129352 0.168198 -0.0521204 0.0155896 0.176728 -0.0523077 0.0184314 0.186167 -0.0512591 0.0213613 0.196234 -0.0487406 0.0242429 0.206526 -0.0445657 0.0268932 0.216522 -0.038634 0.0290773 0.225623 -0.0309677 0.0305156 0.233202 -0.0217397 0.0309135 0.238684 -0.0112827 0.0300119 0.241628 -7.27e-05 0.0276465 0.241793 0.0113159 0.0238068 0.239187 0.0222766 0.0186625 0.234064 0.0322451 0.0125536 0.226891 0.0407674 0.0059459 0.218268 0.0475454 -0.0006335 0.208848 0.0524519 -0.0066792 0.19925 0.055518 -0.0117642 0.189998 0.0568996 -0.0155919 0.181485 0.0568326 -0.0180203 0.173961 0.0555918 -0.0190615 0.16755 0.0534556 -0.0188626 0.162267 0.0506823 -0.0176675 0.158049 0.0474971 -0.0157736 0.154786 0.0440863 -0.0134846 0.15234 0.0405971 -0.011072 0.150569 0.0371407 -0.0087496 0.149338 0.0337971 -0.0066621 0.148524 0.0306196 -0.0048868 0.148029 0.0276408 -0.0034455 0.14777 0.0248771 -0.0023207 0.147684 0.0223332 -0.0014715 0.147724 0.0200056 -0.0008477 0.147855 0.0178856 -0.000399 0.14805 0.0159612 -8.11e-05 0.13366 -0.0199834 0.0014554 0.132833 -0.0222585 0.0016411 0.132168 -0.0247706 0.0019088 0.131732 -0.0275316 0.0022997 0.131609 -0.0305472 0.0028675 0.131902 -0.0338138 0.0036772 0.132738 -0.0373142 0.0048016 0.134266 -0.0410124 0.0063161 0.136659 -0.0448476 0.0082906 0.140101 -0.0487274 0.0107822 0.144786 -0.0525199 0.0138292 0.150895 -0.056047 0.0174497 0.158572 -0.0590779 0.021643 0.167899 -0.0613277 0.0263905 0.178851 -0.062461 0.031649 0.191261 -0.0621091 0.0373299 0.204775 -0.0599008 0.0432595 0.218835 -0.0555106 0.04913 0.232676 -0.0487217 0.0544646 0.245372 -0.0394936 0.0586254 0.255927 -0.0280187 0.0608927 0.263405 -0.0147485 0.0606097 0.267081 -0.0003738 0.0573588 0.26657 0.0142483 0.0510971 0.261915 0.0282075 0.0421978 0.253581 0.040673 0.0313864 0.242383 0.0510079 0.0195959 0.229337 0.0588408 0.0078001 0.215502 0.0640801 -0.00312 0.201833 0.0668742 -0.0124641 0.189081 0.0675382 -0.0197603 0.177758 0.0664729 -0.0247745 0.168136 0.0640949 -0.0275036 0.16029 0.0607887 -0.0281453 0.154148 0.0568823 -0.0270528 0.149544 0.0526401 -0.0246745 0.146258 0.048267 -0.0214899 0.144055 0.043916 -0.0179474 0.142705 0.0396974 -0.0144181 0.142003 0.035687 -0.0111692 0.141773 0.0319326 -0.0083596 0.141873 0.0284604 -0.0060528 0.142194 0.0252799 -0.0042403 0.142655 0.0223883 -0.0028683 0.143198 0.0197746 -0.0018618 0.143786 0.0174227 -0.0011413 0.144392 0.0153136 -0.000635 0.129544 -0.0195103 0.0016069 0.128265 -0.0219628 0.0018951 0.127118 -0.0247071 0.002321 0.126178 -0.0277672 0.00295 0.125546 -0.0311628 0.003866 0.125351 -0.0349056 0.0051684 0.125755 -0.038995 0.0069665 0.126959 -0.0434119 0.0093708 0.129198 -0.0481116 0.0124847 0.132739 -0.0530135 0.0163981 0.13787 -0.0579904 0.0211888 0.144885 -0.0628541 0.0269336 0.154049 -0.0673413 0.0337221 0.165558 -0.0711005 0.0416644 0.17948 -0.0736885 0.0508679 0.195684 -0.0745806 0.0613643 0.213765 -0.0732083 0.0729766 0.232976 -0.0690285 0.0851515 0.252215 -0.0616239 0.0968366 0.270069 -0.0508219 0.106499 0.284953 -0.0368026 0.112373 0.295339 -0.0201613 0.112914 0.300023 -0.0018897 0.107291 0.298376 0.0167379 0.0957068 0.290503 0.0343586 0.0793634 0.277244 0.0497484 0.0600936 0.260012 0.0620224 0.039867 0.240521 0.0707479 0.0203798 0.220477 0.0759453 0.0028603 0.201325 0.077993 -0.0119135 0.184102 0.077479 -0.0235231 0.169409 0.0750527 -0.031816 0.157467 0.0713143 -0.0368545 0.148212 0.0667568 -0.0388951 0.141402 0.0617527 -0.0383644 0.1367 0.056568 -0.0358209 0.133735 0.0513883 -0.0318945 0.132142 0.0463417 -0.0272133 0.131588 0.0415176 -0.0223349 0.131781 0.036977 -0.0176935 0.132483 0.0327589 -0.0135769 0.133504 0.0288843 -0.0101296 0.134704 0.0253593 -0.0073794 0.13598 0.0221779 -0.0052736 0.137267 0.0193255 -0.0037154 0.138523 0.0167816 -0.002593 0.139723 0.014522 -0.0018004 0.123856 -0.0183242 0.0018398 0.122027 -0.0208727 0.0022569 0.120282 -0.0237604 0.0028826 0.118705 -0.0270249 0.0038118 0.11741 -0.0307019 0.0051631 0.116553 -0.0348229 0.0070738 0.116334 -0.0394107 0.0096909 0.117004 -0.0444736 0.0131612 0.118873 -0.0499974 0.017625 0.122301 -0.0559336 0.0232209 0.127698 -0.0621836 0.0301099 0.135505 -0.0685762 0.0385195 0.146164 -0.07484 0.0487937 0.160062 -0.0805736 0.0614179 0.177447 -0.0852214 0.0769593 0.198317 -0.0880713 0.09586 0.222269 -0.0882904 0.118048 0.248369 -0.0850177 0.142437 0.27507 -0.077518 0.166545 0.30025 -0.0653785 0.186562 0.321418 -0.0487036 0.198121 0.336085 -0.0282418 0.197687 0.34225 -0.0053822 0.18398 0.338864 0.018014 0.158681 0.326126 0.0399287 0.125904 0.3055 0.0585745 0.0906921 0.279414 0.0727338 0.0573456 0.25073 0.0819424 0.0284346 0.222174 0.0864652 0.0047983 0.195885 0.0870898 -0.0138084 0.173214 0.0848416 -0.0279852 0.154749 0.0807236 -0.0382554 0.140495 0.0755516 -0.0449675 0.130089 0.0698972 -0.0483928 0.122994 0.0641121 -0.0488503 0.118625 0.0583892 -0.0467855 0.116419 0.0528287 -0.0427797 0.115868 0.0474874 -0.0375023 0.116528 0.042406 -0.0316308 0.118025 0.0376208 -0.0257626 0.120052 0.0331635 -0.0203504 0.12237 0.0290577 -0.0156725 0.124799 0.0253166 -0.0118433 0.127217 0.0219413 -0.0088486 0.129544 0.0189222 -0.0065932 0.131734 0.0162413 -0.0049438 0.133767 0.0138748 -0.0037623 0.116422 -0.0163667 0.0022158 0.11397 -0.0188975 0.0027817 0.111539 -0.0217994 0.0036353 0.109218 -0.0251229 0.0049011 0.107134 -0.0289209 0.0067304 0.105462 -0.0332469 0.0092923 0.104438 -0.0381527 0.0127621 0.104364 -0.0436837 0.0173124 0.10562 -0.0498716 0.0231186 0.108666 -0.056723 0.0303913 0.114049 -0.064198 0.0394541 0.122396 -0.0721795 0.0508641 0.134387 -0.0804276 0.0655535 0.150703 -0.0885242 0.0849136 0.171907 -0.0958176 0.110678 0.198271 -0.101391 0.144415 0.229522 -0.104088 0.186508 0.264577 -0.102624 0.234763 0.301342 -0.0958128 0.283296 0.336709 -0.0828676 0.322682 0.366838 -0.0637249 0.342176 0.38776 -0.0392711 0.333715 0.396193 -0.0113744 0.295916 0.390363 0.0173432 0.235627 0.370574 0.0439838 0.165662 0.33927 0.0659875 0.0996503 0.300516 0.0817001 0.0469524 0.259029 0.0906785 0.0103893 0.219108 0.0936205 -0.0125235 0.18385 0.0919724 -0.0264737 0.154882 0.0874082 -0.0356154 0.132542 0.0813947 -0.0423706 0.116318 0.074963 -0.0475696 0.105292 0.0686843 -0.0511486 0.0984666 0.0627748 -0.0527831 0.0949324 0.0572424 -0.0522611 0.0939218 0.0520138 -0.0496401 0.0948004 0.0470169 -0.0452631 0.0970412 0.0422165 -0.0396882 0.100203 0.0376181 -0.0335648 0.103922 0.0332544 -0.0275008 0.107905 0.0291673 -0.0219606 0.111932 0.0253943 -0.0172212 0.115846 0.0219595 -0.0133809 0.119548 0.0188718 -0.0104026 0.122983 0.0161259 -0.0081697 0.126131 0.0137057 -0.0065344 0.107504 -0.0137183 0.0028133 0.104402 -0.0160977 0.0035349 0.101247 -0.0188582 0.0046194 0.098131 -0.0220607 0.0062137 0.0951874 -0.0257737 0.0084892 0.0926074 -0.0300729 0.0116284 0.0906512 -0.0350413 0.0158106 0.0896616 -0.0407671 0.02121 0.0900785 -0.0473398 0.0280258 0.0924571 -0.0548389 0.0365708 0.0974862 -0.0633115 0.0474542 0.106006 -0.0727311 0.0618657 0.119008 -0.0829339 0.0819294 0.137585 -0.0935304 0.110972 0.162795 -0.103808 0.153366 0.195396 -0.112653 0.213438 0.235436 -0.118552 0.293017 0.281771 -0.119723 0.387886 0.331661 -0.114423 0.484736 0.380678 -0.101389 0.56135 0.423092 -0.0803149 0.592322 0.452795 -0.0521955 0.559497 0.464594 -0.019407 0.462337 0.455566 0.0145748 0.321476 0.426055 0.0458143 0.171703 0.379903 0.0708084 0.047261 0.323652 0.087365 -0.0321249 0.264872 0.0951158 -0.0662833 0.210228 0.0954067 -0.0690401 0.164103 0.0906194 -0.0577826 0.128247 0.0832877 -0.0453843 0.102318 0.0754145 -0.0377836 0.084814 0.068187 -0.0356844 0.0739093 0.062043 -0.0373453 0.0679576 0.0569164 -0.0405436 0.0656772 0.0525064 -0.0434509 0.0661316 0.0484818 -0.0448719 0.068628 0.044594 -0.044258 0.0726192 0.040714 -0.0416356 0.0776413 0.0368182 -0.0374602 0.0832904 0.0329532 -0.0324067 0.0892228 0.029197 -0.0271554 0.0951628 0.0256296 -0.0222415 0.100907 0.0223151 -0.0179885 0.10632 0.0192946 -0.0145201 0.111328 0.0165864 -0.0118142 0.115901 0.0141901 -0.0097659 0.0984452 -0.0106453 0.0037046 0.0947368 -0.0127444 0.0045824 0.0909029 -0.0152097 0.0058853 0.0870315 -0.0181093 0.0077712 0.0832588 -0.0215237 0.0104143 0.0797829 -0.0255472 0.0139863 0.0768783 -0.0302909 0.0186419 0.0749131 -0.0358844 0.0245295 0.0743715 -0.0424749 0.0318637 0.0758866 -0.050219 0.0411084 0.0802852 -0.0592598 0.0533414 0.0886421 -0.0696797 0.0708461 0.102321 -0.0814184 0.0979047 0.122955 -0.0941525 0.141516 0.152293 -0.107148 0.211309 0.191824 -0.119132 0.317429 0.242137 -0.128254 0.465219 0.302119 -0.132246 0.647057 0.368252 -0.128827 0.835038 0.434401 -0.116296 0.981089 0.492382 -0.0941467 1.03003 0.533316 -0.0634848 0.943619 0.549505 -0.0271215 0.724051 0.536422 0.0107405 0.421592 0.494302 0.0452419 0.117611 0.428724 0.0719703 -0.110768 0.34961 0.0881818 -0.224203 0.268595 0.0936142 -0.232221 0.195717 0.0903887 -0.176922 0.137013 0.0819854 -0.104494 0.0940601 0.0718812 -0.0450529 0.0651948 0.0625667 -0.0089697 0.0473067 0.0552478 0.0061339 0.0372577 0.0500755 0.0070728 0.0325925 0.0465829 0.0003043 0.0316697 0.0440915 -0.0094535 0.0334815 0.041982 -0.0190484 0.0373946 0.0398241 -0.0265298 0.0429394 0.0373995 -0.0309647 0.0496918 0.0346646 -0.0322948 0.0572365 0.0316886 -0.0310972 0.0651795 0.0285936 -0.0282529 0.0731757 0.0255095 -0.0246441 0.0809523 0.0225468 -0.0209572 0.0883178 0.019785 -0.0176172 0.0951568 0.0172714 -0.0148143 0.101417 0.0150263 -0.0125757 0.0925611 -0.0075775 0.0048744 0.088377 -0.0092939 0.0059252 0.0840011 -0.0113375 0.0074639 0.0795166 -0.0137786 0.009658 0.0750572 -0.0167027 0.012683 0.0708213 -0.0202149 0.0166989 0.067088 -0.0244434 0.0218387 0.0642375 -0.0295447 0.0282387 0.0627826 -0.0357052 0.0361722 0.063419 -0.0431355 0.0463672 0.0671019 -0.0520494 0.0606479 0.0751488 -0.0626142 0.0830197 0.0893402 -0.0748591 0.121212 0.111948 -0.0885317 0.188227 0.145573 -0.102913 0.302506 0.192627 -0.116646 0.484172 0.254396 -0.127674 0.744703 0.329796 -0.133441 1.07058 0.414311 -0.131394 1.40851 0.499722 -0.119685 1.66611 0.574995 -0.0978296 1.73841 0.62818 -0.0670718 1.55509 0.648855 -0.0304046 1.12513 0.630667 0.0077408 0.550352 0.573541 0.0421689 -0.0079915 0.484854 0.0680363 -0.3991 0.378496 0.0822697 -0.551153 0.271231 0.0846926 -0.494771 0.177462 0.0780468 -0.32672 0.105209 0.0666854 -0.146109 0.055477 0.0547568 -0.0110789 0.0245545 0.0449708 0.0650192 0.0071055 0.0383584 0.0941675 -0.0016445 0.0347055 0.0941217 -0.0050255 0.0331668 0.0788329 -0.0049544 0.0327616 0.0570825 -0.0023696 0.0326679 0.0342086 0.0022917 0.0323399 0.013629 0.008743 0.0315086 -0.00259 0.0166671 0.0301221 -0.0136421 0.0256691 0.0282657 -0.0198214 0.03531 0.02609 -0.0221412 0.0451647 0.0237571 -0.0218748 0.054872 0.0214084 -0.0201867 0.0641618 0.0191504 -0.0179437 0.0728593 0.0170527 -0.0156808 0.0808726 0.0151532 -0.0136638 0.0958319 -0.0048852 0.0060521 0.0913881 -0.0061377 0.0073574 0.0866952 -0.0076509 0.0092748 0.0818301 -0.0094877 0.012019 0.0769214 -0.0117267 0.0158217 0.0721641 -0.0144663 0.020908 0.0678369 -0.0178288 0.0274915 0.0643257 -0.0219651 0.0358308 0.062163 -0.0270572 0.046431 0.0620956 -0.0333137 0.0605211 0.0651943 -0.0409514 0.0810313 0.0730068 -0.0501508 0.114296 0.0877237 -0.0609701 0.17257 0.112264 -0.073207 0.276672 0.150105 -0.0862172 0.456479 0.204608 -0.0987416 0.744811 0.277719 -0.108862 1.16003 0.368246 -0.114225 1.67842 0.470462 -0.112569 2.21022 0.573924 -0.102398 2.60319 0.664849 -0.0834911 2.68921 0.728563 -0.0571049 2.36103 0.752321 -0.0258887 1.64132 0.728138 0.0063646 0.701483 0.655484 0.0351804 -0.192198 0.543178 0.0562604 -0.791192 0.408917 0.0667809 -0.98042 0.274863 0.066616 -0.821935 0.160224 0.0585112 -0.492332 0.0751195 0.0467911 -0.166096 0.0196422 0.0354374 0.06247 -0.0124335 0.0268478 0.181108 -0.0289552 0.0217171 0.219313 -0.0363913 0.019586 0.211739 -0.0388692 0.019487 0.1825 -0.0384622 0.0204102 0.144825 -0.0359271 0.0215507 0.105699 -0.0314165 0.0223899 0.0694422 -0.0249691 0.0226774 0.0389775 -0.0167517 0.0223656 0.0158445 -0.0071096 0.0215336 0.000136 0.0034898 0.0203201 -0.0091864 0.0145483 0.0188759 -0.0137369 0.0256166 0.0173342 -0.0151645 0.0363419 0.0157978 -0.0148252 0.0464826 0.0143372 -0.0136646 0.055899 0.0129939 -0.012252 0.110013 -0.00249 0.006722 0.105516 -0.0031739 0.0083779 0.100717 -0.0040097 0.0108655 0.0956853 -0.0050373 0.0145082 0.0905438 -0.0063067 0.019682 0.0854814 -0.0078809 0.0267974 0.0807735 -0.0098384 0.036301 0.0768074 -0.0122758 0.0487514 0.0741287 -0.0153087 0.0650711 0.0735208 -0.0190685 0.0871505 0.0761406 -0.0236904 0.119102 0.0837103 -0.0292851 0.169501 0.0987369 -0.0358842 0.25475 0.124645 -0.0433528 0.402686 0.165592 -0.0512738 0.653247 0.225667 -0.0588422 1.04991 0.307263 -0.0648501 1.61529 0.408962 -0.0678559 2.31303 0.523936 -0.0665413 3.01657 0.639966 -0.0601216 3.51809 0.741297 -0.0486069 3.59507 0.811474 -0.0328429 3.11266 0.836298 -0.0144204 2.11094 0.806687 0.0044567 0.826312 0.721668 0.0211788 -0.379539 0.590901 0.0331804 -1.16857 0.434812 0.0387224 -1.38516 0.27982 0.0377219 -1.12213 0.149115 0.0319577 -0.635065 0.0545172 0.0242284 -0.172413 -0.0047911 0.0170538 0.138496 -0.0372455 0.0118656 0.289872 -0.052777 0.008986 0.330628 -0.059171 0.0080345 0.312586 -0.0611213 0.0083542 0.269397 -0.0607678 0.0092951 0.217798 -0.058683 0.0103535 0.165479 -0.0547672 0.0112099 0.116869 -0.0488426 0.0117117 0.0751862 -0.0409387 0.0118297 0.0424017 -0.0313455 0.0116105 0.0189165 -0.0205378 0.0111368 0.0037364 -0.0090585 0.0104987 -0.0049516 0.0025827 0.0097764 -0.0091326 0.0139738 0.0090327 -0.0105274 0.0248228 0.0083115 -0.0104034 0.0349532 0.0076397 -0.0095796 0.119775 0 0.0068405 0.115298 0 0.008697 0.110494 0 0.0115233 0.105429 0 0.0157149 0.10022 0 0.0217458 0.0950548 0 0.0301536 0.090205 0 0.0415443 0.0860585 0 0.0566731 0.083165 0 0.076712 0.0823217 0 0.103898 0.0847181 0 0.142892 0.0921433 0 0.203223 0.107226 0 0.30299 0.133583 0 0.472843 0.175638 0 0.756676 0.237749 0 1.20194 0.322463 0 1.83227 0.428242 0 2.60497 0.547798 0 3.37729 0.668234 0 3.91838 0.773079 0 3.98426 0.84529 0 3.43051 0.870156 0 2.30573 0.838248 0 0.873851 0.748388 0 -0.464305 0.610489 0 -1.33343 0.445985 0 -1.56079 0.282912 0 -1.2524 0.146057 0 -0.69794 0.0479032 0 -0.177822 -0.0127527 0 0.166804 -0.0452528 0 0.330784 -0.0603476 0 0.371784 -0.0663257 0 0.349089 -0.0680885 0 0.300341 -0.0677939 0 0.243599 -0.0659406 0 0.18666 -0.0623298 0 0.133823 -0.0566989 0 0.088307 -0.0490222 0 0.0521905 -0.0395654 0 0.0259821 -0.0288025 0 0.0087276 -0.0172895 0 -0.0014399 -0.0055562 0 -0.0066129 0.0059648 0 -0.0086343 0.0169641 0 -0.0088836 0.0272521 0 -0.0082666 0.110013 0.00249 0.006722 0.105516 0.0031739 0.0083779 0.100717 0.0040097 0.0108655 0.0956853 0.0050373 0.0145082 0.0905438 0.0063067 0.019682 0.0854814 0.0078809 0.0267974 0.0807735 0.0098384 0.036301 0.0768074 0.0122758 0.0487514 0.0741287 0.0153087 0.0650711 0.0735208 0.0190685 0.0871505 0.0761406 0.0236904 0.119102 0.0837103 0.0292851 0.169501 0.0987369 0.0358842 0.25475 0.124645 0.0433528 0.402686 0.165592 0.0512738 0.653247 0.225667 0.0588422 1.04991 0.307263 0.0648501 1.61529 0.408962 0.0678559 2.31303 0.523936 0.0665413 3.01657 0.639966 0.0601216 3.51809 0.741297 0.0486069 3.59507 0.811474 0.0328429 3.11266 0.836298 0.0144204 2.11094 0.806687 -0.0044567 0.826312 0.721668 -0.0211788 -0.379539 0.590901 -0.0331804 -1.16857 0.434812 -0.0387224 -1.38516 0.27982 -0.0377219 -1.12213 0.149115 -0.0319577 -0.635065 0.0545172 -0.0242284 -0.172413 -0.0047911 -0.0170538 0.138496 -0.0372455 -0.0118656 0.289872 -0.052777 -0.008986 0.330628 -0.059171 -0.0080345 0.312586 -0.0611213 -0.0083542 0.269397 -0.0607678 -0.0092951 0.217798 -0.058683 -0.0103535 0.165479 -0.0547672 -0.0112099 0.116869 -0.0488426 -0.0117117 0.0751862 -0.0409387 -0.0118297 0.0424017 -0.0313455 -0.0116105 0.0189165 -0.0205378 -0.0111368 0.0037364 -0.0090585 -0.0104987 -0.0049516 0.0025827 -0.0097764 -0.0091326 0.0139738 -0.0090327 -0.0105274 0.0248228 -0.0083115 -0.0104034 0.0349532 -0.0076397 -0.0095796 0.0958319 0.0048852 0.0060521 0.0913881 0.0061377 0.0073574 0.0866952 0.0076509 0.0092748 0.0818301 0.0094877 0.012019 0.0769214 0.0117267 0.0158217 0.0721641 0.0144663 0.020908 0.0678369 0.0178288 0.0274915 0.0643257 0.0219651 0.0358308 0.062163 0.0270572 0.046431 0.0620956 0.0333137 0.0605211 0.0651943 0.0409514 0.0810313 0.0730068 0.0501508 0.114296 0.0877237 0.0609701 0.17257 0.112264 0.073207 0.276672 0.150105 0.0862172 0.456479 0.204608 0.0987416 0.744811 0.277719 0.108862 1.16003 0.368246 0.114225 1.67842 0.470462 0.112569 2.21022 0.573924 0.102398 2.60319 0.664849 0.0834911 2.68921 0.728563 0.0571049 2.36103 0.752321 0.0258887 1.64132 0.728138 -0.0063646 0.701483 0.655484 -0.0351804 -0.192198 0.543178 -0.0562604 -0.791192 0.408917 -0.0667809 -0.98042 0.274863 -0.066616 -0.821935 0.160224 -0.0585112 -0.492332 0.0751195 -0.0467911 -0.166096 0.0196422 -0.0354374 0.06247 -0.0124335 -0.0268478 0.181108 -0.0289552 -0.0217171 0.219313 -0.0363913 -0.019586 0.211739 -0.0388692 -0.019487 0.1825 -0.0384622 -0.0204102 0.144825 -0.0359271 -0.0215507 0.105699 -0.0314165 -0.0223899 0.0694422 -0.0249691 -0.0226774 0.0389775 -0.0167517 -0.0223656 0.0158445 -0.0071096 -0.0215336 0.000136 0.0034898 -0.0203201 -0.0091864 0.0145483 -0.0188759 -0.0137369 0.0256166 -0.0173342 -0.0151645 0.0363419 -0.0157978 -0.0148252 0.0464826 -0.0143372 -0.0136646 0.055899 -0.0129939 -0.012252 0.0925611 0.0075775 0.0048744 0.088377 0.0092939 0.0059252 0.0840011 0.0113375 0.0074639 0.0795166 0.0137786 0.009658 0.0750572 0.0167027 0.012683 0.0708213 0.0202149 0.0166989 0.067088 0.0244434 0.0218387 0.0642375 0.0295447 0.0282387 0.0627826 0.0357052 0.0361722 0.063419 0.0431355 0.0463672 0.0671019 0.0520494 0.0606479 0.0751488 0.0626142 0.0830197 0.0893402 0.0748591 0.121212 0.111948 0.0885317 0.188227 0.145573 0.102913 0.302506 0.192627 0.116646 0.484172 0.254396 0.127674 0.744703 0.329796 0.133441 1.07058 0.414311 0.131394 1.40851 0.499722 0.119685 1.66611 0.574995 0.0978296 1.73841 0.62818 0.0670718 1.55509 0.648855 0.0304046 1.12513 0.630667 -0.0077408 0.550352 0.573541 -0.0421689 -0.0079915 0.484854 -0.0680363 -0.3991 0.378496 -0.0822697 -0.551153 0.271231 -0.0846926 -0.494771 0.177462 -0.0780468 -0.32672 0.105209 -0.0666854 -0.146109 0.055477 -0.0547568 -0.0110789 0.0245545 -0.0449708 0.0650192 0.0071055 -0.0383584 0.0941675 -0.0016445 -0.0347055 0.0941217 -0.0050255 -0.0331668 0.0788329 -0.0049544 -0.0327616 0.0570825 -0.0023696 -0.0326679 0.0342086 0.0022917 -0.0323399 0.013629 0.008743 -0.0315086 -0.00259 0.0166671 -0.0301221 -0.0136421 0.0256691 -0.0282657 -0.0198214 0.03531 -0.02609 -0.0221412 0.0451647 -0.0237571 -0.0218748 0.054872 -0.0214084 -0.0201867 0.0641618 -0.0191504 -0.0179437 0.0728593 -0.0170527 -0.0156808 0.0808726 -0.0151532 -0.0136638 0.0984452 0.0106453 0.0037046 0.0947368 0.0127444 0.0045824 0.0909029 0.0152097 0.0058853 0.0870315 0.0181093 0.0077712 0.0832588 0.0215237 0.0104143 0.0797829 0.0255472 0.0139863 0.0768783 0.0302909 0.0186419 0.0749131 0.0358844 0.0245295 0.0743715 0.0424749 0.0318637 0.0758866 0.050219 0.0411084 0.0802852 0.0592598 0.0533414 0.0886421 0.0696797 0.0708461 0.102321 0.0814184 0.0979047 0.122955 0.0941525 0.141516 0.152293 0.107148 0.211309 0.191824 0.119132 0.317429 0.242137 0.128254 0.465219 0.302119 0.132246 0.647057 0.368252 0.128827 0.835038 0.434401 0.116296 0.981089 0.492382 0.0941467 1.03003 0.533316 0.0634848 0.943619 0.549505 0.0271215 0.724051 0.536422 -0.0107405 0.421592 0.494302 -0.0452419 0.117611 0.428724 -0.0719703 -0.110768 0.34961 -0.0881818 -0.224203 0.268595 -0.0936142 -0.232221 0.195717 -0.0903887 -0.176922 0.137013 -0.0819854 -0.104494 0.0940601 -0.0718812 -0.0450529 0.0651948 -0.0625667 -0.0089697 0.0473067 -0.0552478 0.0061339 0.0372577 -0.0500755 0.0070728 0.0325925 -0.0465829 0.0003043 0.0316697 -0.0440915 -0.0094535 0.0334815 -0.041982 -0.0190484 0.0373946 -0.0398241 -0.0265298 0.0429394 -0.0373995 -0.0309647 0.0496918 -0.0346646 -0.0322948 0.0572365 -0.0316886 -0.0310972 0.0651795 -0.0285936 -0.0282529 0.0731757 -0.0255095 -0.0246441 0.0809523 -0.0225468 -0.0209572 0.0883178 -0.019785 -0.0176172 0.0951568 -0.0172714 -0.0148143 0.101417 -0.0150263 -0.0125757 0.107504 0.0137183 0.0028133 0.104402 0.0160977 0.0035349 0.101247 0.0188582 0.0046194 0.098131 0.0220607 0.0062137 0.0951874 0.0257737 0.0084892 0.0926074 0.0300729 0.0116284 0.0906512 0.0350413 0.0158106 0.0896616 0.0407671 0.02121 0.0900785 0.0473398 0.0280258 0.0924571 0.0548389 0.0365708 0.0974862 0.0633115 0.0474542 0.106006 0.0727311 0.0618657 0.119008 0.0829339 0.0819294 0.137585 0.0935304 0.110972 0.162795 0.103808 0.153366 0.195396 0.112653 0.213438 0.235436 0.118552 0.293017 0.281771 0.119723 0.387886 0.331661 0.114423 0.484736 0.380678 0.101389 0.56135 0.423092 0.0803149 0.592322 0.452795 0.0521955 0.559497 0.464594 0.019407 0.462337 0.455566 -0.0145748 0.321476 0.426055 -0.0458143 0.171703 0.379903 -0.0708084 0.047261 0.323652 -0.087365 -0.0321249 0.264872 -0.0951158 -0.0662833 0.210228 -0.0954067 -0.0690401 0.164103 -0.0906194 -0.0577826 0.128247 -0.0832877 -0.0453843 0.102318 -0.0754145 -0.0377836 0.084814 -0.068187 -0.0356844 0.0739093 -0.062043 -0.0373453 0.0679576 -0.0569164 -0.0405436 0.0656772 -0.0525064 -0.0434509 0.0661316 -0.0484818 -0.0448719 0.068628 -0.044594 -0.044258 0.0726192 -0.040714 -0.0416356 0.0776413 -0.0368182 -0.0374602 0.0832904 -0.0329532 -0.0324067 0.0892228 -0.029197 -0.0271554 0.0951628 -0.0256296 -0.0222415 0.100907 -0.0223151 -0.0179885 0.10632 -0.0192946 -0.0145201 0.111328 -0.0165864 -0.0118142 0.115901 -0.0141901 -0.0097659 0.116422 0.0163667 0.0022158 0.11397 0.0188975 0.0027817 0.111539 0.0217994 0.0036353 0.109218 0.0251229 0.0049011 0.107134 0.0289209 0.0067304 0.105462 0.0332469 0.0092923 0.104438 0.0381527 0.0127621 0.104364 0.0436837 0.0173124 0.10562 0.0498716 0.0231186 0.108666 0.056723 0.0303913 0.114049 0.064198 0.0394541 0.122396 0.0721795 0.0508641 0.134387 0.0804276 0.0655535 0.150703 0.0885242 0.0849136 0.171907 0.0958176 0.110678 0.198271 0.101391 0.144415 0.229522 0.104088 0.186508 0.264577 0.102624 0.234763 0.301342 0.0958128 0.283296 0.336709 0.0828676 0.322682 0.366838 0.0637249 0.342176 0.38776 0.0392711 0.333715 0.396193 0.0113744 0.295916 0.390363 -0.0173432 0.235627 0.370574 -0.0439838 0.165662 0.33927 -0.0659875 0.0996503 0.300516 -0.0817001 0.0469524 0.259029 -0.0906785 0.0103893 0.219108 -0.0936205 -0.0125235 0.18385 -0.0919724 -0.0264737 0.154882 -0.0874082 -0.0356154 0.132542 -0.0813947 -0.0423706 0.116318 -0.074963 -0.0475696 0.105292 -0.0686843 -0.0511486 0.0984666 -0.0627748 -0.0527831 0.0949324 -0.0572424 -0.0522611 0.0939218 -0.0520138 -0.0496401 0.0948004 -0.0470169 -0.0452631 0.0970412 -0.0422165 -0.0396882 0.100203 -0.0376181 -0.0335648 0.103922 -0.0332544 -0.0275008 0.107905 -0.0291673 -0.0219606 0.111932 -0.0253943 -0.0172212 0.115846 -0.0219595 -0.0133809 0.119548 -0.0188718 -0.0104026 0.122983 -0.0161259 -0.0081697 0.126131 -0.0137057 -0.0065344 0.123856 0.0183242 0.0018398 0.122027 0.0208727 0.0022569 0.120282 0.0237604 0.0028826 0.118705 0.0270249 0.0038118 0.11741 0.0307019 0.0051631 0.116553 0.0348229 0.0070738 0.116334 0.0394107 0.0096909 0.117004 0.0444736 0.0131612 0.118873 0.0499974 0.017625 0.122301 0.0559336 0.0232209 0.127698 0.0621836 0.0301099 0.135505 0.0685762 0.0385195 0.146164 0.07484 0.0487937 0.160062 0.0805736 0.0614179 0.177447 0.0852214 0.0769593 0.198317 0.0880713 0.09586 0.222269 0.0882904 0.118048 0.248369 0.0850177 0.142437 0.27507 0.077518 0.166545 0.30025 0.0653785 0.186562 0.321418 0.0487036 0.198121 0.336085 0.0282418 0.197687 0.34225 0.0053822 0.18398 0.338864 -0.018014 0.158681 0.326126 -0.0399287 0.125904 0.3055 -0.0585745 0.0906921 0.279414 -0.0727338 0.0573456 0.25073 -0.0819424 0.0284346 0.222174 -0.0864652 0.0047983 0.195885 -0.0870898 -0.0138084 0.173214 -0.0848416 -0.0279852 0.154749 -0.0807236 -0.0382554 0.140495 -0.0755516 -0.0449675 0.130089 -0.0698972 -0.0483928 0.122994 -0.0641121 -0.0488503 0.118625 -0.0583892 -0.0467855 0.116419 -0.0528287 -0.0427797 0.115868 -0.0474874 -0.0375023 0.116528 -0.042406 -0.0316308 0.118025 -0.0376208 -0.0257626 0.120052 -0.0331635 -0.0203504 0.12237 -0.0290577 -0.0156725 0.124799 -0.0253166 -0.0118433 0.127217 -0.0219413 -0.0088486 0.129544 -0.0189222 -0.0065932 0.131734 -0.0162413 -0.0049438 0.133767 -0.0138748 -0.0037623 0.129544 0.0195103 0.0016069 0.128265 0.0219628 0.0018951 0.127118 0.0247071 0.002321 0.126178 0.0277672 0.00295 0.125546 0.0311628 0.003866 0.125351 0.0349056 0.0051684 0.125755 0.038995 0.0069665 0.126959 0.0434119 0.0093708 0.129198 0.0481116 0.0124847 0.132739 0.0530135 0.0163981 0.13787 0.0579904 0.0211888 0.144885 0.0628541 0.0269336 0.154049 0.0673413 0.0337221 0.165558 0.0711005 0.0416644 0.17948 0.0736885 0.0508679 0.195684 0.0745806 0.0613643 0.213765 0.0732083 0.0729766 0.232976 0.0690285 0.0851515 0.252215 0.0616239 0.0968366 0.270069 0.0508219 0.106499 0.284953 0.0368026 0.112373 0.295339 0.0201613 0.112914 0.300023 0.0018897 0.107291 0.298376 -0.0167379 0.0957068 0.290503 -0.0343586 0.0793634 0.277244 -0.0497484 0.0600936 0.260012 -0.0620224 0.039867 0.240521 -0.0707479 0.0203798 0.220477 -0.0759453 0.0028603 0.201325 -0.077993 -0.0119135 0.184102 -0.077479 -0.0235231 0.169409 -0.0750527 -0.031816 0.157467 -0.0713143 -0.0368545 0.148212 -0.0667568 -0.0388951 0.141402 -0.0617527 -0.0383644 0.1367 -0.056568 -0.0358209 0.133735 -0.0513883 -0.0318945 0.132142 -0.0463417 -0.0272133 0.131588 -0.0415176 -0.0223349 0.131781 -0.036977 -0.0176935 0.132483 -0.0327589 -0.0135769 0.133504 -0.0288843 -0.0101296 0.134704 -0.0253593 -0.0073794 0.13598 -0.0221779 -0.0052736 0.137267 -0.0193255 -0.0037154 0.138523 -0.0167816 -0.002593 0.139723 -0.014522 -0.0018004 0.13366 0.0199834 0.0014554 0.132833 0.0222585 0.0016411 0.132168 0.0247706 0.0019088 0.131732 0.0275316 0.0022997 0.131609 0.0305472 0.0028675 0.131902 0.0338138 0.0036772 0.132738 0.0373142 0.0048016 0.134266 0.0410124 0.0063161 0.136659 0.0448476 0.0082906 0.140101 0.0487274 0.0107822 0.144786 0.0525199 0.0138292 0.150895 0.056047 0.0174497 0.158572 0.0590779 0.021643 0.167899 0.0613277 0.0263905 0.178851 0.062461 0.031649 0.191261 0.0621091 0.0373299 0.204775 0.0599008 0.0432595 0.218835 0.0555106 0.04913 0.232676 0.0487217 0.0544646 0.245372 0.0394936 0.0586254 0.255927 0.0280187 0.0608927 0.263405 0.0147485 0.0606097 0.267081 0.0003738 0.0573588 0.26657 -0.0142483 0.0510971 0.261915 -0.0282075 0.0421978 0.253581 -0.040673 0.0313864 0.242383 -0.0510079 0.0195959 0.229337 -0.0588408 0.0078001 0.215502 -0.0640801 -0.00312 0.201833 -0.0668742 -0.0124641 0.189081 -0.0675382 -0.0197603 0.177758 -0.0664729 -0.0247745 0.168136 -0.0640949 -0.0275036 0.16029 -0.0607887 -0.0281453 0.154148 -0.0568823 -0.0270528 0.149544 -0.0526401 -0.0246745 0.146258 -0.048267 -0.0214899 0.144055 -0.043916 -0.0179474 0.142705 -0.0396974 -0.0144181 0.142003 -0.035687 -0.0111692 0.141773 -0.0319326 -0.0083596 0.141873 -0.0284604 -0.0060528 0.142194 -0.0252799 -0.0042403 0.142655 -0.0223883 -0.0028683 0.143198 -0.0197746 -0.0018618 0.143786 -0.0174227 -0.0011413 0.144392 -0.0153136 -0.000635 0.136657 0.0198743 0.0013409 0.136183 0.0219251 0.0014516 0.135886 0.0241581 0.0016056 0.135823 0.0265754 0.0018264 0.136061 0.0291722 0.0021453 0.136681 0.0319341 0.002601 0.137778 0.0348343 0.0032377 0.139459 0.0378284 0.0041021 0.141843 0.0408514 0.0052377 0.145053 0.0438122 0.0066791 0.14921 0.04659 0.0084461 0.154416 0.049031 0.010539 0.16074 0.0509474 0.0129352 0.168198 0.0521204 0.0155896 0.176728 0.0523077 0.0184314 0.186167 0.0512591 0.0213613 0.196234 0.0487406 0.0242429 0.206526 0.0445657 0.0268932 0.216522 0.038634 0.0290773 0.225623 0.0309677 0.0305156 0.233202 0.0217397 0.0309135 0.238684 0.0112827 0.0300119 0.241628 7.27e-05 0.0276465 0.241793 -0.0113159 0.0238068 0.239187 -0.0222766 0.0186625 0.234064 -0.0322451 0.0125536 0.226891 -0.0407674 0.0059459 0.218268 -0.0475454 -0.0006335 0.208848 -0.0524519 -0.0066792 0.19925 -0.055518 -0.0117642 0.189998 -0.0568996 -0.0155919 0.181485 -0.0568326 -0.0180203 0.173961 -0.0555918 -0.0190615 0.16755 -0.0534556 -0.0188626 0.162267 -0.0506823 -0.0176675 0.158049 -0.0474971 -0.0157736 0.154786 -0.0440863 -0.0134846 0.15234 -0.0405971 -0.011072 0.150569 -0.0371407 -0.0087496 0.149338 -0.0337971 -0.0066621 0.148524 -0.0306196 -0.0048868 0.148029 -0.0276408 -0.0034455 0.14777 -0.0248771 -0.0023207 0.147684 -0.0223332 -0.0014715 0.147724 -0.0200056 -0.0008477 0.147855 -0.0178856 -0.000399 0.14805 -0.0159612 -8.11e-05 0.138941 0.0193355 0.0012402 0.138731 0.0211435 0.0012996 0.138701 0.0230839 0.0013779 0.138896 0.0251516 0.001487 0.139371 0.0273349 0.0016436 0.140186 0.0296133 0.0018688 0.141409 0.0319553 0.002187 0.143117 0.0343152 0.0026242 0.145386 0.0366306 0.0032055 0.148295 0.0388199 0.0039507 0.151912 0.0407802 0.0048698 0.156291 0.0423868 0.00596 0.161455 0.0434946 0.0072012 0.167387 0.0439427 0.0085556 0.174013 0.0435617 0.0099666 0.181196 0.0421868 0.0113596 0.188722 0.0396744 0.0126422 0.196305 0.0359228 0.0137057 0.203595 0.030894 0.0144292 0.210202 0.0246336 0.0146862 0.215732 0.0172844 0.0143579 0.219828 0.009088 0.0133535 0.222215 0.0003719 0.0116303 0.222741 -0.0084772 0.0092165 0.221398 -0.0170522 0.0062212 0.218324 -0.0249693 0.0028281 0.213785 -0.0319073 -0.0007183 0.208138 -0.0376362 -0.0041477 0.201782 -0.0420319 -0.0071996 0.195114 -0.0450732 -0.0096579 0.18849 -0.0468271 -0.0113794 0.182194 -0.0474262 -0.0123072 0.176433 -0.0470432 -0.0124709 0.171329 -0.0458684 -0.0119729 0.166937 -0.0440907 -0.0109653 0.163253 -0.0418845 -0.0096227 0.160232 -0.0394019 -0.0081162 0.157807 -0.0367692 -0.0065929 0.155896 -0.0340863 -0.0051638 0.154418 -0.0314289 -0.0038995 0.153295 -0.0288511 -0.0028338 0.152459 -0.0263894 -0.0019711 0.151852 -0.0240663 -0.001296 0.151427 -0.0218937 -0.0007821 0.151146 -0.0198756 -0.0003992 0.150978 -0.0180109 -0.0001182 0.1509 -0.016295 8.63e-05 0.140844 0.0185048 0.0011423 0.140825 0.0200719 0.0011687 0.140979 0.0217293 0.0011999 0.141345 0.0234672 0.0012414 0.14196 0.0252701 0.0013011 0.142872 0.0271147 0.0013893 0.144128 0.028969 0.0015182 0.145779 0.0307898 0.0017012 0.147874 0.0325216 0.0019512 0.150459 0.0340952 0.0022786 0.153572 0.0354272 0.0026886 0.157232 0.0364208 0.003179 0.161439 0.0369679 0.0037366 0.166161 0.0369535 0.004338 0.171328 0.0362624 0.0049473 0.17683 0.0347884 0.0055187 0.182507 0.0324457 0.005997 0.188158 0.029182 0.0063222 0.19355 0.0249906 0.0064326 0.198426 0.019922 0.0062714 0.202536 0.0140887 0.0057931 0.205653 0.0076649 0.0049735 0.207607 0.0008776 0.0038132 0.208296 -0.0060108 0.00235 0.207708 -0.012725 0.0006565 0.205917 -0.0190019 -0.0011627 0.203077 -0.024615 -0.002981 0.1994 -0.0293924 -0.0046625 0.19513 -0.0332275 -0.0060862 0.190522 -0.03608 -0.0071547 0.18581 -0.0379705 -0.0078112 0.181197 -0.0389686 -0.0080437 0.17684 -0.0391782 -0.0078835 0.172847 -0.0387231 -0.0073959 0.169281 -0.037734 -0.0066681 0.166168 -0.0363376 -0.0057946 0.163501 -0.0346499 -0.0048645 0.161253 -0.0327715 -0.0039512 0.159386 -0.030786 -0.0031082 0.157855 -0.0287597 -0.0023678 0.156613 -0.0267434 -0.0017434 0.155617 -0.0247742 -0.0012342 0.154828 -0.0228778 -0.0008298 0.154212 -0.021071 -0.000515 0.153741 -0.019364 -0.0002734 0.153388 -0.0177614 -8.91e-05 0.153135 -0.0162647 5.12e-05 0.142521 0.0174945 0.0010464 0.142635 0.0188353 0.0010523 0.142912 0.0202324 0.001056 0.143378 0.0216738 0.0010592 0.144065 0.0231422 0.0010653 0.145005 0.0246144 0.0010786 0.146232 0.0260601 0.0011046 0.147777 0.0274408 0.0011492 0.149672 0.0287094 0.0012188 0.151941 0.0298094 0.001318 0.1546 0.0306755 0.0014495 0.157653 0.0312347 0.0016121 0.161086 0.0314083 0.0017988 0.164865 0.0311163 0.0019972 0.168927 0.0302815 0.0021883 0.173186 0.0288371 0.0023479 0.177525 0.0267332 0.0024472 0.181803 0.0239455 0.002456 0.18586 0.0204821 0.0023451 0.189529 0.0163891 0.0020912 0.192646 0.0117532 0.0016785 0.195067 0.0067 0.0011046 0.196679 0.0013878 0.0003812 0.197418 -0.0040033 -0.0004622 0.19727 -0.0092844 -0.001381 0.196274 -0.0142744 -0.0023181 0.194518 -0.0188133 -0.003209 0.192132 -0.0227739 -0.0039906 0.189265 -0.0260701 -0.0046087 0.18608 -0.0286587 -0.0050239 0.182732 -0.0305372 -0.005219 0.179363 -0.0317383 -0.0051969 0.176088 -0.0323214 -0.004982 0.172995 -0.032364 -0.0046122 0.170145 -0.0319525 -0.0041348 0.167572 -0.0311752 -0.0035977 0.16529 -0.0301164 -0.0030448 0.163297 -0.0288526 -0.002511 0.161577 -0.0274498 -0.0020211 0.16011 -0.0259635 -0.0015892 0.158871 -0.0244381 -0.0012206 0.157835 -0.0229087 -0.0009138 0.156976 -0.0214013 -0.0006632 0.156272 -0.0199352 -0.0004608 0.155701 -0.0185239 -0.0002984 0.155244 -0.0171763 -0.0001679 0.154886 -0.0158979 -6.28e-05 0.144062 0.0163878 0.0009528 0.144267 0.0175235 0.0009467 0.144618 0.0186896 0.0009351 0.145137 0.0198731 0.0009184 0.145847 0.0210568 0.0008974 0.14677 0.022219 0.0008737 0.14793 0.0233325 0.0008493 0.149345 0.0243644 0.0008264 0.151034 0.0252758 0.0008078 0.153009 0.0260219 0.0007955 0.155273 0.0265527 0.0007905 0.157821 0.026814 0.0007927 0.160635 0.0267499 0.0007986 0.163679 0.026305 0.0008029 0.166905 0.0254289 0.0007968 0.170243 0.02408 0.0007694 0.173609 0.0222305 0.0007076 0.176901 0.0198714 0.0005983 0.180012 0.0170165 0.0004298 0.182828 0.0137055 0.000193 0.185241 0.0100042 -0.000115 0.187156 0.0060035 -0.0004905 0.188499 0.0018147 -0.0009239 0.189227 -0.0024367 -0.0013952 0.189325 -0.0066204 -0.0018804 0.188817 -0.0106098 -0.0023494 0.187752 -0.0142912 -0.0027727 0.186209 -0.0175716 -0.0031202 0.184282 -0.0203833 -0.0033712 0.182075 -0.0226862 -0.003511 0.179692 -0.0244678 -0.003536 0.17723 -0.0257399 -0.0034525 0.174774 -0.0265341 -0.0032758 0.172392 -0.0268967 -0.0030269 0.170136 -0.0268832 -0.0027297 0.168043 -0.0265528 -0.0024077 0.166132 -0.0259649 -0.0020818 0.164414 -0.0251754 -0.0017685 0.162889 -0.0242351 -0.001479 0.161549 -0.0231881 -0.0012198 0.160383 -0.022072 -0.000993 0.159379 -0.0209174 -0.0007982 0.158521 -0.0197491 -0.0006326 0.157794 -0.0185865 -0.0004925 0.157185 -0.0174445 -0.0003742 0.156678 -0.016334 -0.000274 0.156263 -0.0152631 -0.0001889 0.145477 0.0152451 0.0008641 0.145738 0.0161997 0.0008511 0.146129 0.0171656 0.0008316 0.146667 0.0181299 0.0008052 0.147367 0.0190766 0.000772 0.148245 0.0199862 0.0007321 0.149316 0.0208352 0.0006861 0.150593 0.0215962 0.0006345 0.152083 0.0222378 0.0005785 0.153792 0.0227251 0.0005186 0.155716 0.0230205 0.0004554 0.157847 0.0230842 0.000389 0.160164 0.0228767 0.0003183 0.162637 0.0223605 0.0002414 0.165225 0.0215027 0.0001551 0.167875 0.0202781 5.57e-05 0.170525 0.0186723 -6.19e-05 0.173103 0.0166842 -0.0002021 0.175533 0.0143291 -0.0003684 0.177737 0.0116392 -0.0005627 0.179642 0.0086645 -0.0007845 0.181185 0.0054711 -0.001029 0.182316 0.0021381 -0.0012899 0.183003 -0.0012462 -0.0015565 0.183236 -0.0045901 -0.0018152 0.183025 -0.0078044 -0.0020524 0.182401 -0.0108078 -0.002254 0.181411 -0.0135314 -0.0024076 0.180116 -0.0159228 -0.0025052 0.178583 -0.0179475 -0.0025424 0.176882 -0.0195892 -0.0025195 0.175079 -0.0208486 -0.0024416 0.173237 -0.0217405 -0.0023175 0.171408 -0.0222915 -0.0021578 0.169633 -0.0225359 -0.001975 0.167947 -0.0225124 -0.0017804 0.166371 -0.0222618 -0.0015838 0.16492 -0.0218242 -0.0013929 0.1636 -0.0212372 -0.0012134 0.162414 -0.0205352 -0.0010484 0.161357 -0.0197484 -0.0008992 0.160425 -0.0189029 -0.000766 0.15961 -0.0180207 -0.0006478 0.158902 -0.0171198 -0.0005431 0.158294 -0.0162149 -0.0004505 0.157774 -0.0153177 -0.0003685 0.157336 -0.0144373 -0.0002958 0.146776 0.0141075 0.0007811 0.147068 0.0149052 0.0007643 0.147474 0.0157007 0.0007411 0.148006 0.016482 0.0007109 0.148676 0.0172346 0.0006733 0.149494 0.0179417 0.0006282 0.150468 0.0185834 0.0005755 0.151607 0.0191373 0.0005151 0.152913 0.0195786 0.0004474 0.154386 0.0198805 0.0003726 0.156021 0.0200145 0.0002909 0.157807 0.0199522 0.0002028 0.159724 0.0196656 0.0001081 0.161748 0.0191294 6.5e-06 0.163845 0.0183225 -0.0001028 0.165974 0.0172299 -0.0002202 0.16809 0.0158448 -0.0003469 0.17014 0.0141704 -0.0004834 0.17207 0.0122209 -0.0006299 0.173826 0.0100224 -0.0007861 0.175357 0.0076128 -0.0009495 0.17662 0.0050405 -0.001117 0.17758 0.0023627 -0.0012843 0.178214 -0.0003578 -0.0014452 0.178514 -0.003056 -0.0015931 0.178485 -0.0056679 -0.0017218 0.178144 -0.0081344 -0.0018251 0.17752 -0.0104048 -0.0018978 0.176654 -0.0124384 -0.0019375 0.175589 -0.0142064 -0.0019432 0.174372 -0.0156922 -0.0019158 0.173051 -0.0168907 -0.0018587 0.171669 -0.0178072 -0.0017769 0.170267 -0.0184557 -0.0016758 0.168878 -0.0188566 -0.0015615 0.16753 -0.0190347 -0.0014397 0.166244 -0.0190174 -0.0013153 0.165035 -0.0188327 -0.0011922 0.163913 -0.0185081 -0.0010734 0.162884 -0.0180696 -0.0009607 0.16195 -0.0175412 -0.0008552 0.161109 -0.0169441 -0.0007573 0.160359 -0.0162969 -0.0006672 0.159695 -0.0156158 -0.0005843 0.159112 -0.0149142 -0.0005083 0.158605 -0.0142035 -0.0004388 0.158166 -0.0134928 -0.0003752 0.220385 -0.0201447 0.0017383 0.220762 -0.0212979 0.0017022 0.221299 -0.0224511 0.0016516 0.222016 -0.0235878 0.001585 0.222927 -0.0246878 0.0015014 0.224049 -0.0257275 0.0013997 0.225396 -0.0266792 0.0012796 0.226979 -0.0275115 0.0011402 0.228803 -0.0281895 0.000982 0.230869 -0.0286751 0.0008048 0.233171 -0.0289282 0.0006087 0.235694 -0.0289078 0.000395 0.238415 -0.028574 0.0001635 0.241298 -0.0278898 -8.51e-05 0.244298 -0.0268239 -0.000351 0.247358 -0.0253535 -0.0006332 0.250415 -0.0234667 -0.0009318 0.253395 -0.0211654 -0.0012455 0.256221 -0.018467 -0.0015722 0.258817 -0.0154058 -0.0019092 0.261109 -0.0120324 -0.00225 0.263033 -0.0084128 -0.0025882 0.264537 -0.0046257 -0.0029159 0.265585 -0.0007588 -0.0032217 0.266162 0.0030966 -0.0034949 0.26627 0.0068496 -0.0037258 0.26593 0.0104158 -0.0039052 0.265182 0.0137211 -0.0040253 0.264076 0.0167054 -0.0040836 0.262673 0.0193247 -0.0040792 0.261039 0.0215519 -0.0040146 0.259239 0.0233765 -0.0038961 0.257336 0.0248027 -0.0037326 0.255386 0.0258471 -0.0035332 0.25344 0.026536 -0.0033086 0.251538 0.0269025 -0.0030686 0.249711 0.0269838 -0.0028219 0.247983 0.0268185 -0.0025754 0.24637 0.0264451 -0.002335 0.244882 0.0259002 -0.0021039 0.243522 0.0252177 -0.001885 0.242292 0.0244282 -0.0016794 0.241187 0.0235587 -0.0014879 0.240203 0.0226325 -0.0013101 0.239333 0.0216696 -0.0011457 0.23857 0.0206867 -0.0009942 0.237905 0.0196976 -0.0008549 0.218512 -0.02174 0.0019196 0.218838 -0.0231157 0.001891 0.219347 -0.0245111 0.0018472 0.220063 -0.0259083 0.0017868 0.221009 -0.0272853 0.0017089 0.222209 -0.0286149 0.001613 0.223684 -0.0298644 0.0014992 0.225451 -0.0309956 0.0013673 0.227526 -0.0319646 0.0012184 0.229915 -0.0327222 0.0010529 0.232618 -0.033215 0.0008712 0.235622 -0.033387 0.0006739 0.238901 -0.0331814 0.0004596 0.242416 -0.0325441 0.0002266 0.24611 -0.0314271 -2.84e-05 0.249911 -0.0297924 -0.0003084 0.253731 -0.0276167 -0.0006186 0.257471 -0.0248954 -0.0009625 0.261024 -0.0216459 -0.0013422 0.264277 -0.0179098 -0.0017567 0.267128 -0.0137538 -0.0022025 0.269481 -0.0092674 -0.0026687 0.271264 -0.0045596 -0.0031443 0.272426 0.0002473 -0.0036116 0.272946 0.0050242 -0.004049 0.272835 0.009645 -0.0044364 0.272129 0.0139925 -0.0047533 0.270891 0.0179665 -0.0049816 0.269201 0.0214888 -0.0051118 0.267153 0.0245059 -0.0051383 0.264843 0.0269895 -0.0050636 0.262366 0.0289355 -0.0048969 0.259809 0.0303606 -0.0046529 0.257248 0.0312978 -0.004349 0.254746 0.0317925 -0.0040053 0.252351 0.0318971 -0.0036402 0.250098 0.0316675 -0.0032698 0.248009 0.0311593 -0.0029069 0.246097 0.0304257 -0.0025614 0.244367 0.0295154 -0.0022388 0.242817 0.0284719 -0.0019423 0.24144 0.0273329 -0.0016728 0.240227 0.0261304 -0.0014297 0.239166 0.0248912 -0.0012108 0.238247 0.0236372 -0.0010144 0.237456 0.022386 -0.0008384 0.23678 0.0211515 -0.0006807 0.216484 -0.0233349 0.0021106 0.216723 -0.0249669 0.0020953 0.217168 -0.0266459 0.0020655 0.217849 -0.0283541 0.0020205 0.2188 -0.0300682 0.0019606 0.220053 -0.0317579 0.0018867 0.22164 -0.0333858 0.0018007 0.223592 -0.0349062 0.0017045 0.225935 -0.0362648 0.0016011 0.228688 -0.0373988 0.0014924 0.231858 -0.0382381 0.0013796 0.235441 -0.0387061 0.0012623 0.239413 -0.0387233 0.001136 0.243731 -0.0382105 0.0009943 0.248324 -0.0370943 0.000826 0.2531 -0.0353135 0.0006184 0.257941 -0.032825 0.0003556 0.262707 -0.0296117 2.27e-05 0.267246 -0.0256875 -0.000393 0.271396 -0.0211025 -0.0008996 0.275002 -0.0159438 -0.0014964 0.277927 -0.0103339 -0.0021732 0.280059 -0.0044257 -0.0029134 0.28133 0.0016074 -0.0036841 0.281712 0.0075825 -0.0044494 0.281228 0.0133201 -0.0051652 0.279942 0.0186569 -0.0057901 0.277957 0.0234566 -0.0062811 0.275401 0.0276172 -0.0066119 0.272418 0.0310752 -0.0067634 0.269152 0.0338051 -0.0067333 0.265741 0.0358162 -0.006533 0.262307 0.0371469 -0.0061875 0.25895 0.0378571 -0.0057295 0.255747 0.0380208 -0.0051959 0.252752 0.0377191 -0.0046228 0.25 0.0370342 -0.0040426 0.247509 0.0360446 -0.0034809 0.24528 0.0348221 -0.0029559 0.243309 0.0334303 -0.0024785 0.241581 0.0319234 -0.002053 0.240081 0.0303466 -0.0016797 0.238788 0.0287365 -0.0013553 0.237683 0.0271222 -0.0010746 0.236746 0.0255264 -0.0008325 0.235959 0.0239663 -0.0006233 0.235304 0.0224544 -0.0004424 0.214288 -0.02487 0.0023079 0.214392 -0.0267911 0.0023144 0.214723 -0.0287963 0.0023102 0.21532 -0.0308693 0.0022966 0.216228 -0.0329868 0.0022766 0.217492 -0.0351169 0.002255 0.21916 -0.037218 0.0022378 0.221281 -0.0392371 0.0022319 0.223899 -0.0411086 0.0022446 0.227051 -0.0427542 0.0022816 0.230763 -0.0440824 0.0023453 0.235045 -0.0449906 0.002434 0.23988 -0.0453679 0.0025376 0.245223 -0.0451002 0.0026399 0.250993 -0.0440769 0.0027153 0.257072 -0.0422002 0.0027326 0.263298 -0.0393952 0.0026543 0.269476 -0.0356214 0.0024429 0.275383 -0.0308826 0.0020625 0.280779 -0.0252352 0.0014867 0.285432 -0.0187927 0.0007005 0.289131 -0.0117235 -0.0002925 0.291711 -0.0042433 -0.0014695 0.293067 0.0033988 -0.0027836 0.293168 0.0109389 -0.0041683 0.292059 0.0181199 -0.0055419 0.289852 0.0247114 -0.006814 0.286718 0.0305267 -0.0078975 0.282863 0.0354342 -0.0087198 0.278512 0.0393617 -0.0092291 0.273885 0.0422946 -0.0094055 0.269181 0.0442682 -0.0092569 0.26457 0.0453576 -0.0088219 0.26018 0.0456649 -0.0081575 0.256104 0.0453072 -0.0073339 0.252396 0.0444062 -0.0064221 0.249083 0.0430796 -0.0054874 0.246165 0.0414355 -0.004582 0.243628 0.0395687 -0.0037438 0.241445 0.0375596 -0.002995 0.239585 0.0354735 -0.0023447 0.238013 0.0333623 -0.0017922 0.236696 0.0312658 -0.0013299 0.235602 0.0292136 -0.0009466 0.234702 0.027227 -0.0006307 0.233971 0.0253208 -0.00037 0.233384 0.0235044 -0.0001547 0.211915 -0.0262574 0.0025025 0.211823 -0.0284967 0.0025442 0.211973 -0.0308683 0.0025847 0.212415 -0.0333594 0.0026296 0.213209 -0.0359491 0.0026884 0.214419 -0.0386064 0.0027736 0.216113 -0.0412872 0.0029 0.218365 -0.0439327 0.0030843 0.221246 -0.0464663 0.0033427 0.224825 -0.0487921 0.003688 0.229156 -0.0507945 0.0041257 0.234274 -0.052338 0.0046519 0.240184 -0.053271 0.0052473 0.246845 -0.0534311 0.0058791 0.254168 -0.052654 0.0064979 0.262001 -0.0507865 0.0070412 0.270128 -0.047702 0.0074349 0.278269 -0.0433185 0.0076005 0.286097 -0.0376163 0.007459 0.293252 -0.0306537 0.0069402 0.299376 -0.0225756 0.0059919 0.304141 -0.0136139 0.004593 0.307293 -0.0040761 0.0027548 0.308675 0.0056761 0.0005404 0.308248 0.0152587 -0.0019429 0.3061 0.0242988 -0.0045471 0.30243 0.0324695 -0.0070973 0.297522 0.0395163 -0.0094073 0.291716 0.0452724 -0.0113162 0.285363 0.0496643 -0.0126943 0.278797 0.0527038 -0.013469 0.27231 0.0544738 -0.0136292 0.26613 0.0551087 -0.0132237 0.260421 0.0547744 -0.012348 0.255282 0.0536492 -0.0111279 0.250757 0.0519096 -0.0096996 0.246847 0.0497192 -0.0081917 0.243523 0.0472216 -0.0067112 0.240733 0.0445377 -0.0053372 0.238419 0.0417653 -0.0041178 0.236519 0.0389798 -0.0030747 0.234974 0.0362378 -0.0022083 0.23373 0.0335795 -0.0015052 0.23274 0.0310321 -0.0009438 0.231962 0.028613 -0.0005006 0.231363 0.0263316 -0.0001523 0.230912 0.024192 0.0001211 0.209233 -0.0273786 0.0026891 0.208862 -0.0299552 0.0027852 0.20874 -0.0327238 0.0028989 0.208932 -0.0356782 0.0030451 0.209513 -0.0388034 0.0032446 0.210569 -0.0420723 0.0035244 0.212198 -0.0454424 0.0039159 0.214508 -0.0488518 0.004453 0.217612 -0.0522154 0.0051679 0.221622 -0.0554208 0.0060856 0.226641 -0.0583258 0.0072178 0.232748 -0.0607574 0.0085578 0.239984 -0.0625133 0.0100749 0.248333 -0.0633673 0.0117143 0.257702 -0.0630806 0.0133944 0.267905 -0.0614177 0.0150111 0.278652 -0.0581701 0.0164365 0.289546 -0.0531843 0.0175244 0.300101 -0.0463924 0.018117 0.30977 -0.0378403 0.0180528 0.31799 -0.0277075 0.0171873 0.324248 -0.0163119 0.0154172 0.32814 -0.0040948 0.0127047 0.329423 0.0084142 0.0091074 0.328057 0.0206483 0.0047882 0.324209 0.0320638 4e-06 0.318226 0.0421953 -0.0049116 0.310594 0.0506978 -0.0095943 0.301864 0.0573706 -0.0136978 0.292595 0.0621562 -0.0169357 0.283293 0.0651236 -0.0191205 0.274373 0.0664381 -0.0201814 0.266139 0.0663276 -0.0201647 0.258785 0.0650496 -0.0192156 0.252401 0.0628654 -0.0175487 0.246995 0.0600199 -0.0154098 0.242517 0.0567298 -0.0130414 0.238879 0.0531777 -0.010653 0.235973 0.04951 -0.0084051 0.233688 0.0458396 -0.0064011 0.231918 0.0422492 -0.0046925 0.230566 0.038796 -0.0032885 0.229553 0.0355172 -0.0021693 0.228811 0.0324339 -0.001298 0.228285 0.029556 -0.000632 0.227932 0.0268851 -0.0001287 0.227718 0.0244172 0.000249 0.20601 -0.0280739 0.0028641 0.205256 -0.0309894 0.0030411 0.204747 -0.034167 0.0032693 0.20456 -0.0376107 0.003579 0.204791 -0.0413156 0.0040112 0.205554 -0.0452638 0.0046171 0.206982 -0.0494197 0.005455 0.209232 -0.0537242 0.0065867 0.212471 -0.0580892 0.0080695 0.216877 -0.0623905 0.0099482 0.222626 -0.0664621 0.0122457 0.229868 -0.0700919 0.0149572 0.238712 -0.0730198 0.0180443 0.249189 -0.0749409 0.0214359 0.261223 -0.075516 0.0250245 0.274599 -0.074392 0.0286638 0.288937 -0.0712336 0.0321605 0.30368 -0.0657673 0.0352636 0.318108 -0.0578325 0.0376621 0.331381 -0.0474338 0.0389956 0.342615 -0.0347809 0.0388945 0.350984 -0.0203052 0.0370472 0.355838 -0.0046416 0.0332712 0.356799 0.0114277 0.0275896 0.353831 0.0270614 0.0202572 0.347244 0.0414597 0.0117451 0.337653 0.0539607 0.0026787 0.325879 0.0641082 -0.0062414 0.312828 0.0716797 -0.0143522 0.299379 0.0766755 -0.0210927 0.286287 0.0792766 -0.0260742 0.274132 0.0797863 -0.0291122 0.263296 0.0785725 -0.0302261 0.253977 0.0760176 -0.0296182 0.246223 0.0724832 -0.0276232 0.239963 0.0682898 -0.0246518 0.235054 0.0637062 -0.021127 0.231313 0.0589485 -0.0174301 0.228544 0.0541824 -0.0138655 0.226557 0.0495295 -0.0106418 0.225186 0.0450738 -0.007874 0.224286 0.0408689 -0.0055983 0.223741 0.0369446 -0.0037937 0.223461 0.0333132 -0.0024045 0.223377 0.0299746 -0.0013605 0.223437 0.0269201 -0.0005893 0.223603 0.0241363 -2.65e-05 0.201747 -0.0281506 0.0030468 0.200485 -0.0313779 0.0033373 0.199444 -0.0349439 0.0037325 0.198717 -0.038867 0.0042867 0.19842 -0.043157 0.0050715 0.198701 -0.0478114 0.0061744 0.199739 -0.0528088 0.0076934 0.201746 -0.0581025 0.0097293 0.204967 -0.0636111 0.0123756 0.20967 -0.0692097 0.0157064 0.21613 -0.0747189 0.0197673 0.22461 -0.0798944 0.0245728 0.235327 -0.084419 0.0301055 0.248406 -0.0878988 0.0363195 0.263827 -0.0898689 0.0431301 0.281372 -0.0898146 0.0503907 0.300565 -0.0872121 0.0578438 0.32064 -0.0815936 0.0650609 0.340544 -0.0726312 0.0714053 0.358989 -0.06023 0.0760454 0.374577 -0.0446083 0.0780654 0.385973 -0.0263393 0.0766542 0.392114 -0.0063331 0.0713311 0.392397 0.0142528 0.0621131 0.386799 0.034161 0.0495543 0.375896 0.0522128 0.0346493 0.360766 0.0674706 0.0186379 0.342801 0.0793476 0.0027907 0.323483 0.0876407 -0.0117576 0.304181 0.0924885 -0.0241075 0.285994 0.0942787 -0.033652 0.269692 0.0935383 -0.0400861 0.255709 0.0908348 -0.0434021 0.244194 0.0867053 -0.0438586 0.235076 0.081617 -0.0419253 0.228143 0.0759535 -0.0382082 0.2231 0.0700165 -0.0333638 0.219622 0.0640352 -0.028014 0.217387 0.058178 -0.0226806 0.216105 0.0525634 -0.0177452 0.215526 0.0472696 -0.0134406 0.215446 0.0423423 -0.009865 0.215707 0.037803 -0.0070145 0.216192 0.0336542 -0.0048182 0.216816 0.029886 -0.0031723 0.217523 0.0264797 -0.0019646 0.218271 0.0234119 -0.0010914 0.195833 -0.0273995 0.0032849 0.193922 -0.0308717 0.0037257 0.192187 -0.0347593 0.0043477 0.190732 -0.0390976 0.0052387 0.1897 -0.043916 0.006512 0.189271 -0.0492339 0.0083028 0.189676 -0.0550534 0.0107592 0.191199 -0.0613518 0.0140311 0.194174 -0.0680707 0.0182572 0.198984 -0.0751031 0.0235545 0.206041 -0.082277 0.030018 0.215766 -0.0893367 0.0377325 0.228542 -0.0959228 0.0467902 0.244658 -0.101554 0.0572996 0.264225 -0.105623 0.0693559 0.287078 -0.107405 0.0829482 0.312675 -0.106109 0.0977882 0.340002 -0.100971 0.113098 0.36755 -0.0913795 0.12746 0.393368 -0.0770423 0.138855 0.415252 -0.0581325 0.145002 0.431037 -0.0353836 0.143965 0.438971 -0.0100812 0.134791 0.438064 0.0160718 0.117911 0.428323 0.0412026 0.0950558 0.410783 0.0635731 0.0687302 0.38732 0.081863 0.041543 0.360287 0.0953481 0.0156706 0.332094 0.10393 -0.0073708 0.304832 0.108031 -0.0266545 0.280053 0.108398 -0.041697 0.258698 0.105903 -0.0523207 0.241163 0.101382 -0.0585968 0.227419 0.0955393 -0.0608369 0.217167 0.0889199 -0.0595801 0.209951 0.0819234 -0.0555555 0.205256 0.0748334 -0.0496063 0.202568 0.0678504 -0.0425904 0.20141 0.061116 -0.0352829 0.201365 0.0547293 -0.0282982 0.202089 0.0487564 -0.0220525 0.203307 0.0432365 -0.0167638 0.204813 0.0381861 -0.0124848 0.20646 0.0336039 -0.0091514 0.208146 0.0294748 -0.0066329 0.20981 0.0257744 -0.0047739 0.211415 0.0224727 -0.0034231 0.187582 -0.0256463 0.0036774 0.184883 -0.0292492 0.0043026 0.18229 -0.0333333 0.0052064 0.179919 -0.0379529 0.0065173 0.177934 -0.0431602 0.0083967 0.17655 -0.0490019 0.0110324 0.176053 -0.0555129 0.0146252 0.1768 -0.0627087 0.0193752 0.17923 -0.0705735 0.0254707 0.183857 -0.079045 0.0330918 0.191266 -0.0879919 0.0424394 0.202084 -0.0971839 0.05379 0.216939 -0.106254 0.0675602 0.236384 -0.114658 0.0843388 0.260781 -0.121642 0.104807 0.290141 -0.126236 0.129467 0.323934 -0.127297 0.15813 0.360901 -0.123634 0.189264 0.398941 -0.114199 0.21951 0.435157 -0.0983542 0.243794 0.466111 -0.076128 0.256392 0.488316 -0.0484057 0.252784 0.498882 -0.0169508 0.23155 0.496153 0.0157824 0.195264 0.480159 0.0470404 0.149717 0.452695 0.0742825 0.101832 0.416974 0.0956602 0.0573528 0.37694 0.110317 0.0195297 0.336471 0.118409 -0.0108215 0.298717 0.120872 -0.0343421 0.265765 0.119046 -0.0520591 0.238619 0.114305 -0.0647722 0.217419 0.107815 -0.0729339 0.201738 0.100422 -0.0768304 0.19086 0.0926698 -0.076796 0.183968 0.0848735 -0.0733508 0.180258 0.0772081 -0.0672305 0.178997 0.0697772 -0.0593223 0.17954 0.0626547 -0.0505517 0.181342 0.0559031 -0.0417545 0.183955 0.0495757 -0.0335783 0.187029 0.0437138 -0.0264337 0.190303 0.0383428 -0.0205026 0.193595 0.0334707 -0.015783 0.196784 0.0290899 -0.012153 0.199802 0.0251797 -0.009431 0.202615 0.0217106 -0.0074232 0.176726 -0.0228224 0.0043678 0.173135 -0.0263966 0.0052042 0.169559 -0.0304962 0.0064281 0.166123 -0.0351933 0.0082091 0.163006 -0.0405639 0.010754 0.160457 -0.0466852 0.014295 0.158808 -0.0536321 0.0190731 0.158492 -0.0614709 0.0253238 0.160046 -0.0702496 0.0332818 0.16413 -0.0799808 0.0432203 0.17152 -0.0906147 0.0555509 0.1831 -0.101996 0.0709807 0.199831 -0.113804 0.0906985 0.222665 -0.125477 0.116486 0.252393 -0.136141 0.150558 0.289401 -0.14456 0.194887 0.333339 -0.149172 0.249841 0.382757 -0.148227 0.312349 0.434842 -0.140073 0.374436 0.485394 -0.123549 0.42347 0.529176 -0.0984088 0.445169 0.560687 -0.0656402 0.428978 0.575223 -0.0275558 0.373438 0.570006 0.0124432 0.288258 0.545012 0.0504394 0.191232 0.503193 0.0827939 0.101175 0.449903 0.106947 0.0308774 0.391652 0.121925 -0.0161052 0.334617 0.128356 -0.0437309 0.283464 0.128017 -0.0590578 0.240837 0.123141 -0.0682801 0.207519 0.11579 -0.0749646 0.182988 0.107485 -0.0802495 0.166051 0.0991239 -0.0838963 0.155319 0.0911001 -0.0852585 0.149486 0.0834904 -0.0838597 0.147423 0.0762342 -0.07964 0.148189 0.0692532 -0.0729822 0.151002 0.0625094 -0.0646119 0.155207 0.0560156 -0.0554168 0.160268 0.0498209 -0.0462538 0.165757 0.0439877 -0.0377949 0.171349 0.038573 -0.0304573 0.176814 0.0336162 -0.0244062 0.182005 0.0291354 -0.0196116 0.18684 0.0251283 -0.0159233 0.191283 0.0215767 -0.013139 0.163653 -0.019055 0.0055422 0.159132 -0.0224135 0.0066037 0.154523 -0.0263105 0.0081571 0.149952 -0.0308327 0.0104031 0.145611 -0.0360774 0.0135772 0.14177 -0.0421523 0.0179314 0.138801 -0.0491749 0.0237126 0.137194 -0.0572701 0.0311582 0.137579 -0.0665641 0.0405331 0.140748 -0.0771693 0.0522427 0.147677 -0.0891536 0.0670757 0.159553 -0.102486 0.0865806 0.177759 -0.116949 0.113539 0.203812 -0.132026 0.152324 0.239167 -0.146767 0.208682 0.284863 -0.159689 0.288267 0.340979 -0.168772 0.393355 0.405995 -0.171625 0.518109 0.47626 -0.165869 0.644552 0.545854 -0.1497 0.742833 0.60706 -0.122494 0.778882 0.651514 -0.0852872 0.728355 0.671853 -0.0409365 0.590634 0.663523 0.0061349 0.393873 0.626234 0.0506681 0.185878 0.564515 0.0876929 0.014202 0.486914 0.113754 -0.0933119 0.403893 0.127766 -0.136162 0.325136 0.131075 -0.133952 0.257424 0.126671 -0.111818 0.203873 0.118001 -0.0886823 0.164498 0.107955 -0.0734441 0.137459 0.0983625 -0.067223 0.120263 0.0900086 -0.0673978 0.110552 0.082932 -0.0705481 0.106425 0.0767934 -0.0738114 0.106459 0.0711695 -0.0752723 0.109587 0.0657257 -0.0739878 0.11497 0.0602801 -0.0698789 0.121907 0.054794 -0.0635193 0.129798 0.0493269 -0.0558332 0.138139 0.043986 -0.047785 0.146528 0.0388844 -0.0401562 0.154669 0.0341161 -0.0334381 0.162365 0.029744 -0.0278396 0.169503 0.0257996 -0.0233559 0.176037 0.0222877 -0.0198555 0.150385 -0.0147283 0.0073683 0.145001 -0.0176899 0.0086674 0.139426 -0.021168 0.0105474 0.133785 -0.0252593 0.013225 0.128272 -0.0300771 0.0169409 0.12317 -0.0357544 0.0219334 0.118876 -0.0424472 0.0284171 0.115919 -0.0503362 0.0365941 0.114998 -0.0596259 0.0467481 0.117019 -0.0705326 0.0594858 0.123158 -0.0832538 0.0762256 0.134929 -0.0979039 0.0999931 0.154229 -0.114406 0.13649 0.183306 -0.13233 0.195056 0.224543 -0.150706 0.288536 0.279943 -0.167846 0.430423 0.350291 -0.18131 0.627718 0.434099 -0.188093 0.870036 0.526704 -0.185138 1.11988 0.619988 -0.170071 1.31273 0.703062 -0.141971 1.37431 0.763918 -0.101922 1.25238 0.791761 -0.0532163 0.948522 0.779592 -0.0010915 0.529535 0.726492 0.0480453 0.106166 0.638821 0.0879576 -0.213976 0.529404 0.114255 -0.373326 0.41432 0.125739 -0.382203 0.308308 0.124611 -0.298477 0.221002 0.115308 -0.18815 0.155742 0.10265 -0.0957237 0.110939 0.0903324 -0.0375151 0.0825332 0.0803291 -0.0108705 0.0661092 0.0730963 -0.0060831 0.0580523 0.0681416 -0.0136026 0.0558493 0.064597 -0.0263009 0.0578976 0.0616221 -0.039349 0.0631639 0.0586098 -0.0497116 0.0708893 0.0552374 -0.055868 0.0804148 0.0514251 -0.0575964 0.0911193 0.0472552 -0.0556322 0.102427 0.0428906 -0.0511923 0.11384 0.0385113 -0.0455374 0.124965 0.0342746 -0.0396763 0.135525 0.030297 -0.0342562 0.145354 0.0266515 -0.0295889 0.154371 0.0233728 -0.0257448 0.141912 -0.010449 0.0097889 0.135858 -0.0128682 0.0113636 0.129522 -0.0157479 0.0136122 0.123024 -0.0191871 0.016766 0.116556 -0.0233059 0.0210699 0.110405 -0.0282513 0.0267493 0.104978 -0.0342024 0.0339923 0.100829 -0.041376 0.0429883 0.0987047 -0.0500289 0.0541054 0.0996088 -0.06045 0.0683157 0.104906 -0.0729304 0.0880643 0.116453 -0.0876964 0.118735 0.136725 -0.104787 0.170738 0.168836 -0.123866 0.261579 0.216299 -0.143981 0.416047 0.282323 -0.16334 0.661094 0.368566 -0.179253 1.01199 0.473537 -0.18837 1.45056 0.591256 -0.187319 1.90554 0.710931 -0.173567 2.25331 0.818047 -0.14622 2.35244 0.896641 -0.106493 2.10574 0.932249 -0.0578182 1.52037 0.91511 -0.0056119 0.728911 0.843279 0.0433721 -0.0509968 0.724814 0.082322 -0.608409 0.577427 0.10627 -0.834752 0.424246 0.113918 -0.763055 0.286616 0.108147 -0.524266 0.177741 0.0945724 -0.259585 0.1008 0.0790465 -0.0560377 0.0516086 0.0657053 0.0631744 0.0229591 0.0563783 0.112989 0.0079736 0.051053 0.1184 0.0016307 0.0487068 0.0998322 0.0008927 0.0480292 0.0704904 0.0041672 0.0478725 0.0385419 0.010648 0.0474488 0.0092658 0.0198105 0.0463509 -0.0140885 0.0311371 0.044478 -0.0301426 0.0440343 0.0419296 -0.0391558 0.057865 0.0389053 -0.0424829 0.072021 0.0356279 -0.0419141 0.0859872 0.0322971 -0.0391323 0.0993779 0.0290671 -0.035423 0.111941 0.0260417 -0.0316045 0.123541 0.0232807 -0.0281051 0.147193 -0.0067279 0.0121217 0.140789 -0.0084892 0.0140875 0.134026 -0.0106161 0.016908 0.127016 -0.0131966 0.0208832 0.119946 -0.0163407 0.026341 0.113103 -0.0201855 0.0336046 0.106899 -0.0249007 0.0429844 0.101902 -0.030695 0.0548528 0.098897 -0.037818 0.0699173 0.0989706 -0.0465545 0.0898637 0.103661 -0.0571977 0.118687 0.115155 -0.0699887 0.165001 0.136496 -0.0850014 0.245433 0.171675 -0.101962 0.388152 0.225358 -0.120012 0.633429 0.301968 -0.137498 1.02529 0.403953 -0.15192 1.58821 0.529599 -0.160224 2.29046 0.671309 -0.159457 3.01239 0.815456 -0.147586 3.55089 0.944084 -0.124108 3.6795 1.0378 -0.0902886 3.24874 1.07907 -0.0491283 2.27865 1.05568 -0.0051856 0.989341 0.964443 0.0357945 -0.262214 0.814534 0.0677972 -1.12795 0.628197 0.0862302 -1.4297 0.435922 0.0898617 -1.23295 0.266371 0.0815797 -0.774456 0.136643 0.0670091 -0.302816 0.0493716 0.0518494 0.0387423 -0.0028998 0.0398597 0.22414 -0.0310106 0.0324088 0.291131 -0.0444477 0.0291151 0.288445 -0.0495611 0.0287488 0.25137 -0.049749 0.0299286 0.199886 -0.0464266 0.0315119 0.144815 -0.0400367 0.0327398 0.092919 -0.0307685 0.0332276 0.0487956 -0.0189294 0.0328808 0.0149708 -0.0050404 0.0317912 -0.0081826 0.0102257 0.0301425 -0.0219962 0.0261612 0.0281415 -0.0287136 0.0421299 0.025976 -0.0306964 0.0576298 0.0237938 -0.0299323 0.072315 0.0216989 -0.0278402 0.0859825 0.0197551 -0.0252986 0.168781 -0.0034343 0.0132014 0.162328 -0.0043931 0.0156702 0.155443 -0.0055641 0.0193072 0.148231 -0.0070028 0.0245683 0.140871 -0.0087788 0.0319906 0.133645 -0.0109798 0.0421669 0.126963 -0.0137145 0.0557491 0.121405 -0.0171158 0.0735496 0.117779 -0.0213422 0.0968856 0.117234 -0.0265724 0.128397 0.121438 -0.0329884 0.173756 0.13283 -0.0407366 0.244704 0.154893 -0.0498553 0.363586 0.192296 -0.0601593 0.56814 0.250599 -0.0710931 0.912216 0.335129 -0.0816004 1.45407 0.44884 -0.0901142 2.22376 0.589636 -0.094775 3.17264 0.748457 -0.0938753 4.13236 0.909428 -0.0863522 4.82599 1.05217 -0.0720904 4.95401 1.1551 -0.051967 4.32725 1.19879 -0.0277692 2.98365 1.16937 -0.0021174 1.22445 1.0626 0.0216684 -0.467535 0.888092 0.04001 -1.61876 0.671234 0.0500691 -1.98485 0.448279 0.0510431 -1.66193 0.25396 0.0447979 -0.990797 0.108599 0.0349925 -0.325699 0.0141729 0.025271 0.137767 -0.0397086 0.0179228 0.375109 -0.0669456 0.0136576 0.449639 -0.0790911 0.0120994 0.434352 -0.0834657 0.0123938 0.378581 -0.0836672 0.0136409 0.307756 -0.0809058 0.0151187 0.233989 -0.0752902 0.0163566 0.164346 -0.0667097 0.0171183 0.103947 -0.0552754 0.0173457 0.056007 -0.041426 0.0170926 0.0213969 -0.0258398 0.0164684 -0.0011079 -0.0092839 0.0155968 -0.0140072 0.0075221 0.0145907 -0.0201322 0.0239942 0.0135403 -0.0219931 0.0397154 0.01251 -0.0214773 0.05443 0.0115407 -0.0198324 0.18355 0 0.0132289 0.177139 0 0.0159767 0.170263 0 0.0200885 0.163019 0 0.0261245 0.155583 0 0.0347624 0.148232 0 0.0467802 0.141377 0 0.0630617 0.135598 0 0.0847072 0.131713 0 0.113398 0.130893 0 0.152277 0.134857 0 0.207799 0.14614 0 0.293042 0.168393 0 0.432692 0.206546 0 0.668312 0.266499 0 1.05907 0.353914 0 1.6685 0.471911 0 2.52793 0.6182 0 3.58021 0.783111 0 4.6355 0.949919 0 5.38638 1.09737 0 5.50446 1.20318 0 4.78661 1.24726 0 3.27989 1.2152 0 1.31987 1.10231 0 -0.559264 0.918284 0 -1.83163 0.689643 0 -2.22477 0.454819 0 -1.84774 0.250979 0 -1.08598 0.0997181 0 -0.339505 0.002719 0 0.173932 -0.0516252 0 0.431445 -0.0784295 0 0.507922 -0.0900437 0 0.486932 -0.0941491 0 0.423715 -0.0944089 0 0.345787 -0.0919485 0 0.265519 -0.0867443 0 0.189847 -0.0785665 0 0.123932 -0.0674472 0 0.0711585 -0.0537882 0 0.0325706 -0.0382648 0 0.007021 -0.0216611 0 -0.0080585 -0.0047237 0 -0.0156487 0.0119347 0 -0.0184343 0.0278727 0 -0.0184658 0.0428158 0 -0.0171178 0.168781 0.0034343 0.0132014 0.162328 0.0043931 0.0156702 0.155443 0.0055641 0.0193072 0.148231 0.0070028 0.0245683 0.140871 0.0087788 0.0319906 0.133645 0.0109798 0.0421669 0.126963 0.0137145 0.0557491 0.121405 0.0171158 0.0735496 0.117779 0.0213422 0.0968856 0.117234 0.0265724 0.128397 0.121438 0.0329884 0.173756 0.13283 0.0407366 0.244704 0.154893 0.0498553 0.363586 0.192296 0.0601593 0.56814 0.250599 0.0710931 0.912216 0.335129 0.0816004 1.45407 0.44884 0.0901142 2.22376 0.589636 0.094775 3.17264 0.748457 0.0938753 4.13236 0.909428 0.0863522 4.82599 1.05217 0.0720904 4.95401 1.1551 0.051967 4.32725 1.19879 0.0277692 2.98365 1.16937 0.0021174 1.22445 1.0626 -0.0216684 -0.467535 0.888092 -0.04001 -1.61876 0.671234 -0.0500691 -1.98485 0.448279 -0.0510431 -1.66193 0.25396 -0.0447979 -0.990797 0.108599 -0.0349925 -0.325699 0.0141729 -0.025271 0.137767 -0.0397086 -0.0179228 0.375109 -0.0669456 -0.0136576 0.449639 -0.0790911 -0.0120994 0.434352 -0.0834657 -0.0123938 0.378581 -0.0836672 -0.0136409 0.307756 -0.0809058 -0.0151187 0.233989 -0.0752902 -0.0163566 0.164346 -0.0667097 -0.0171183 0.103947 -0.0552754 -0.0173457 0.056007 -0.041426 -0.0170926 0.0213969 -0.0258398 -0.0164684 -0.0011079 -0.0092839 -0.0155968 -0.0140072 0.0075221 -0.0145907 -0.0201322 0.0239942 -0.0135403 -0.0219931 0.0397154 -0.01251 -0.0214773 0.05443 -0.0115407 -0.0198324 0.147193 0.0067279 0.0121217 0.140789 0.0084892 0.0140875 0.134026 0.0106161 0.016908 0.127016 0.0131966 0.0208832 0.119946 0.0163407 0.026341 0.113103 0.0201855 0.0336046 0.106899 0.0249007 0.0429844 0.101902 0.030695 0.0548528 0.098897 0.037818 0.0699173 0.0989706 0.0465545 0.0898637 0.103661 0.0571977 0.118687 0.115155 0.0699887 0.165001 0.136496 0.0850014 0.245433 0.171675 0.101962 0.388152 0.225358 0.120012 0.633429 0.301968 0.137498 1.02529 0.403953 0.15192 1.58821 0.529599 0.160224 2.29046 0.671309 0.159457 3.01239 0.815456 0.147586 3.55089 0.944084 0.124108 3.6795 1.0378 0.0902886 3.24874 1.07907 0.0491283 2.27865 1.05568 0.0051856 0.989341 0.964443 -0.0357945 -0.262214 0.814534 -0.0677972 -1.12795 0.628197 -0.0862302 -1.4297 0.435922 -0.0898617 -1.23295 0.266371 -0.0815797 -0.774456 0.136643 -0.0670091 -0.302816 0.0493716 -0.0518494 0.0387423 -0.0028998 -0.0398597 0.22414 -0.0310106 -0.0324088 0.291131 -0.0444477 -0.0291151 0.288445 -0.0495611 -0.0287488 0.25137 -0.049749 -0.0299286 0.199886 -0.0464266 -0.0315119 0.144815 -0.0400367 -0.0327398 0.092919 -0.0307685 -0.0332276 0.0487956 -0.0189294 -0.0328808 0.0149708 -0.0050404 -0.0317912 -0.0081826 0.0102257 -0.0301425 -0.0219962 0.0261612 -0.0281415 -0.0287136 0.0421299 -0.025976 -0.0306964 0.0576298 -0.0237938 -0.0299323 0.072315 -0.0216989 -0.0278402 0.0859825 -0.0197551 -0.0252986 0.141912 0.010449 0.0097889 0.135858 0.0128682 0.0113636 0.129522 0.0157479 0.0136122 0.123024 0.0191871 0.016766 0.116556 0.0233059 0.0210699 0.110405 0.0282513 0.0267493 0.104978 0.0342024 0.0339923 0.100829 0.041376 0.0429883 0.0987047 0.0500289 0.0541054 0.0996088 0.06045 0.0683157 0.104906 0.0729304 0.0880643 0.116453 0.0876964 0.118735 0.136725 0.104787 0.170738 0.168836 0.123866 0.261579 0.216299 0.143981 0.416047 0.282323 0.16334 0.661094 0.368566 0.179253 1.01199 0.473537 0.18837 1.45056 0.591256 0.187319 1.90554 0.710931 0.173567 2.25331 0.818047 0.14622 2.35244 0.896641 0.106493 2.10574 0.932249 0.0578182 1.52037 0.91511 0.0056119 0.728911 0.843279 -0.0433721 -0.0509968 0.724814 -0.082322 -0.608409 0.577427 -0.10627 -0.834752 0.424246 -0.113918 -0.763055 0.286616 -0.108147 -0.524266 0.177741 -0.0945724 -0.259585 0.1008 -0.0790465 -0.0560377 0.0516086 -0.0657053 0.0631744 0.0229591 -0.0563783 0.112989 0.0079736 -0.051053 0.1184 0.0016307 -0.0487068 0.0998322 0.0008927 -0.0480292 0.0704904 0.0041672 -0.0478725 0.0385419 0.010648 -0.0474488 0.0092658 0.0198105 -0.0463509 -0.0140885 0.0311371 -0.044478 -0.0301426 0.0440343 -0.0419296 -0.0391558 0.057865 -0.0389053 -0.0424829 0.072021 -0.0356279 -0.0419141 0.0859872 -0.0322971 -0.0391323 0.0993779 -0.0290671 -0.035423 0.111941 -0.0260417 -0.0316045 0.123541 -0.0232807 -0.0281051 0.150385 0.0147283 0.0073683 0.145001 0.0176899 0.0086674 0.139426 0.021168 0.0105474 0.133785 0.0252593 0.013225 0.128272 0.0300771 0.0169409 0.12317 0.0357544 0.0219334 0.118876 0.0424472 0.0284171 0.115919 0.0503362 0.0365941 0.114998 0.0596259 0.0467481 0.117019 0.0705326 0.0594858 0.123158 0.0832538 0.0762256 0.134929 0.0979039 0.0999931 0.154229 0.114406 0.13649 0.183306 0.13233 0.195056 0.224543 0.150706 0.288536 0.279943 0.167846 0.430423 0.350291 0.18131 0.627718 0.434099 0.188093 0.870036 0.526704 0.185138 1.11988 0.619988 0.170071 1.31273 0.703062 0.141971 1.37431 0.763918 0.101922 1.25238 0.791761 0.0532163 0.948522 0.779592 0.0010915 0.529535 0.726492 -0.0480453 0.106166 0.638821 -0.0879576 -0.213976 0.529404 -0.114255 -0.373326 0.41432 -0.125739 -0.382203 0.308308 -0.124611 -0.298477 0.221002 -0.115308 -0.18815 0.155742 -0.10265 -0.0957237 0.110939 -0.0903324 -0.0375151 0.0825332 -0.0803291 -0.0108705 0.0661092 -0.0730963 -0.0060831 0.0580523 -0.0681416 -0.0136026 0.0558493 -0.064597 -0.0263009 0.0578976 -0.0616221 -0.039349 0.0631639 -0.0586098 -0.0497116 0.0708893 -0.0552374 -0.055868 0.0804148 -0.0514251 -0.0575964 0.0911193 -0.0472552 -0.0556322 0.102427 -0.0428906 -0.0511923 0.11384 -0.0385113 -0.0455374 0.124965 -0.0342746 -0.0396763 0.135525 -0.030297 -0.0342562 0.145354 -0.0266515 -0.0295889 0.154371 -0.0233728 -0.0257448 0.163653 0.019055 0.0055422 0.159132 0.0224135 0.0066037 0.154523 0.0263105 0.0081571 0.149952 0.0308327 0.0104031 0.145611 0.0360774 0.0135772 0.14177 0.0421523 0.0179314 0.138801 0.0491749 0.0237126 0.137194 0.0572701 0.0311582 0.137579 0.0665641 0.0405331 0.140748 0.0771693 0.0522427 0.147677 0.0891536 0.0670757 0.159553 0.102486 0.0865806 0.177759 0.116949 0.113539 0.203812 0.132026 0.152324 0.239167 0.146767 0.208682 0.284863 0.159689 0.288267 0.340979 0.168772 0.393355 0.405995 0.171625 0.518109 0.47626 0.165869 0.644552 0.545854 0.1497 0.742833 0.60706 0.122494 0.778882 0.651514 0.0852872 0.728355 0.671853 0.0409365 0.590634 0.663523 -0.0061349 0.393873 0.626234 -0.0506681 0.185878 0.564515 -0.0876929 0.014202 0.486914 -0.113754 -0.0933119 0.403893 -0.127766 -0.136162 0.325136 -0.131075 -0.133952 0.257424 -0.126671 -0.111818 0.203873 -0.118001 -0.0886823 0.164498 -0.107955 -0.0734441 0.137459 -0.0983625 -0.067223 0.120263 -0.0900086 -0.0673978 0.110552 -0.082932 -0.0705481 0.106425 -0.0767934 -0.0738114 0.106459 -0.0711695 -0.0752723 0.109587 -0.0657257 -0.0739878 0.11497 -0.0602801 -0.0698789 0.121907 -0.054794 -0.0635193 0.129798 -0.0493269 -0.0558332 0.138139 -0.043986 -0.047785 0.146528 -0.0388844 -0.0401562 0.154669 -0.0341161 -0.0334381 0.162365 -0.029744 -0.0278396 0.169503 -0.0257996 -0.0233559 0.176037 -0.0222877 -0.0198555 0.176726 0.0228224 0.0043678 0.173135 0.0263966 0.0052042 0.169559 0.0304962 0.0064281 0.166123 0.0351933 0.0082091 0.163006 0.0405639 0.010754 0.160457 0.0466852 0.014295 0.158808 0.0536321 0.0190731 0.158492 0.0614709 0.0253238 0.160046 0.0702496 0.0332818 0.16413 0.0799808 0.0432203 0.17152 0.0906147 0.0555509 0.1831 0.101996 0.0709807 0.199831 0.113804 0.0906985 0.222665 0.125477 0.116486 0.252393 0.136141 0.150558 0.289401 0.14456 0.194887 0.333339 0.149172 0.249841 0.382757 0.148227 0.312349 0.434842 0.140073 0.374436 0.485394 0.123549 0.42347 0.529176 0.0984088 0.445169 0.560687 0.0656402 0.428978 0.575223 0.0275558 0.373438 0.570006 -0.0124432 0.288258 0.545012 -0.0504394 0.191232 0.503193 -0.0827939 0.101175 0.449903 -0.106947 0.0308774 0.391652 -0.121925 -0.0161052 0.334617 -0.128356 -0.0437309 0.283464 -0.128017 -0.0590578 0.240837 -0.123141 -0.0682801 0.207519 -0.11579 -0.0749646 0.182988 -0.107485 -0.0802495 0.166051 -0.0991239 -0.0838963 0.155319 -0.0911001 -0.0852585 0.149486 -0.0834904 -0.0838597 0.147423 -0.0762342 -0.07964 0.148189 -0.0692532 -0.0729822 0.151002 -0.0625094 -0.0646119 0.155207 -0.0560156 -0.0554168 0.160268 -0.0498209 -0.0462538 0.165757 -0.0439877 -0.0377949 0.171349 -0.038573 -0.0304573 0.176814 -0.0336162 -0.0244062 0.182005 -0.0291354 -0.0196116 0.18684 -0.0251283 -0.0159233 0.191283 -0.0215767 -0.013139 0.187582 0.0256463 0.0036774 0.184883 0.0292492 0.0043026 0.18229 0.0333333 0.0052064 0.179919 0.0379529 0.0065173 0.177934 0.0431602 0.0083967 0.17655 0.0490019 0.0110324 0.176053 0.0555129 0.0146252 0.1768 0.0627087 0.0193752 0.17923 0.0705735 0.0254707 0.183857 0.079045 0.0330918 0.191266 0.0879919 0.0424394 0.202084 0.0971839 0.05379 0.216939 0.106254 0.0675602 0.236384 0.114658 0.0843388 0.260781 0.121642 0.104807 0.290141 0.126236 0.129467 0.323934 0.127297 0.15813 0.360901 0.123634 0.189264 0.398941 0.114199 0.21951 0.435157 0.0983542 0.243794 0.466111 0.076128 0.256392 0.488316 0.0484057 0.252784 0.498882 0.0169508 0.23155 0.496153 -0.0157824 0.195264 0.480159 -0.0470404 0.149717 0.452695 -0.0742825 0.101832 0.416974 -0.0956602 0.0573528 0.37694 -0.110317 0.0195297 0.336471 -0.118409 -0.0108215 0.298717 -0.120872 -0.0343421 0.265765 -0.119046 -0.0520591 0.238619 -0.114305 -0.0647722 0.217419 -0.107815 -0.0729339 0.201738 -0.100422 -0.0768304 0.19086 -0.0926698 -0.076796 0.183968 -0.0848735 -0.0733508 0.180258 -0.0772081 -0.0672305 0.178997 -0.0697772 -0.0593223 0.17954 -0.0626547 -0.0505517 0.181342 -0.0559031 -0.0417545 0.183955 -0.0495757 -0.0335783 0.187029 -0.0437138 -0.0264337 0.190303 -0.0383428 -0.0205026 0.193595 -0.0334707 -0.015783 0.196784 -0.0290899 -0.012153 0.199802 -0.0251797 -0.009431 0.202615 -0.0217106 -0.0074232 0.195833 0.0273995 0.0032849 0.193922 0.0308717 0.0037257 0.192187 0.0347593 0.0043477 0.190732 0.0390976 0.0052387 0.1897 0.043916 0.006512 0.189271 0.0492339 0.0083028 0.189676 0.0550534 0.0107592 0.191199 0.0613518 0.0140311 0.194174 0.0680707 0.0182572 0.198984 0.0751031 0.0235545 0.206041 0.082277 0.030018 0.215766 0.0893367 0.0377325 0.228542 0.0959228 0.0467902 0.244658 0.101554 0.0572996 0.264225 0.105623 0.0693559 0.287078 0.107405 0.0829482 0.312675 0.106109 0.0977882 0.340002 0.100971 0.113098 0.36755 0.0913795 0.12746 0.393368 0.0770423 0.138855 0.415252 0.0581325 0.145002 0.431037 0.0353836 0.143965 0.438971 0.0100812 0.134791 0.438064 -0.0160718 0.117911 0.428323 -0.0412026 0.0950558 0.410783 -0.0635731 0.0687302 0.38732 -0.081863 0.041543 0.360287 -0.0953481 0.0156706 0.332094 -0.10393 -0.0073708 0.304832 -0.108031 -0.0266545 0.280053 -0.108398 -0.041697 0.258698 -0.105903 -0.0523207 0.241163 -0.101382 -0.0585968 0.227419 -0.0955393 -0.0608369 0.217167 -0.0889199 -0.0595801 0.209951 -0.0819234 -0.0555555 0.205256 -0.0748334 -0.0496063 0.202568 -0.0678504 -0.0425904 0.20141 -0.061116 -0.0352829 0.201365 -0.0547293 -0.0282982 0.202089 -0.0487564 -0.0220525 0.203307 -0.0432365 -0.0167638 0.204813 -0.0381861 -0.0124848 0.20646 -0.0336039 -0.0091514 0.208146 -0.0294748 -0.0066329 0.20981 -0.0257744 -0.0047739 0.211415 -0.0224727 -0.0034231 0.201747 0.0281506 0.0030468 0.200485 0.0313779 0.0033373 0.199444 0.0349439 0.0037325 0.198717 0.038867 0.0042867 0.19842 0.043157 0.0050715 0.198701 0.0478114 0.0061744 0.199739 0.0528088 0.0076934 0.201746 0.0581025 0.0097293 0.204967 0.0636111 0.0123756 0.20967 0.0692097 0.0157064 0.21613 0.0747189 0.0197673 0.22461 0.0798944 0.0245728 0.235327 0.084419 0.0301055 0.248406 0.0878988 0.0363195 0.263827 0.0898689 0.0431301 0.281372 0.0898146 0.0503907 0.300565 0.0872121 0.0578438 0.32064 0.0815936 0.0650609 0.340544 0.0726312 0.0714053 0.358989 0.06023 0.0760454 0.374577 0.0446083 0.0780654 0.385973 0.0263393 0.0766542 0.392114 0.0063331 0.0713311 0.392397 -0.0142528 0.0621131 0.386799 -0.034161 0.0495543 0.375896 -0.0522128 0.0346493 0.360766 -0.0674706 0.0186379 0.342801 -0.0793476 0.0027907 0.323483 -0.0876407 -0.0117576 0.304181 -0.0924885 -0.0241075 0.285994 -0.0942787 -0.033652 0.269692 -0.0935383 -0.0400861 0.255709 -0.0908348 -0.0434021 0.244194 -0.0867053 -0.0438586 0.235076 -0.081617 -0.0419253 0.228143 -0.0759535 -0.0382082 0.2231 -0.0700165 -0.0333638 0.219622 -0.0640352 -0.028014 0.217387 -0.058178 -0.0226806 0.216105 -0.0525634 -0.0177452 0.215526 -0.0472696 -0.0134406 0.215446 -0.0423423 -0.009865 0.215707 -0.037803 -0.0070145 0.216192 -0.0336542 -0.0048182 0.216816 -0.029886 -0.0031723 0.217523 -0.0264797 -0.0019646 0.218271 -0.0234119 -0.0010914 0.20601 0.0280739 0.0028641 0.205256 0.0309894 0.0030411 0.204747 0.034167 0.0032693 0.20456 0.0376107 0.003579 0.204791 0.0413156 0.0040112 0.205554 0.0452638 0.0046171 0.206982 0.0494197 0.005455 0.209232 0.0537242 0.0065867 0.212471 0.0580892 0.0080695 0.216877 0.0623905 0.0099482 0.222626 0.0664621 0.0122457 0.229868 0.0700919 0.0149572 0.238712 0.0730198 0.0180443 0.249189 0.0749409 0.0214359 0.261223 0.075516 0.0250245 0.274599 0.074392 0.0286638 0.288937 0.0712336 0.0321605 0.30368 0.0657673 0.0352636 0.318108 0.0578325 0.0376621 0.331381 0.0474338 0.0389956 0.342615 0.0347809 0.0388945 0.350984 0.0203052 0.0370472 0.355838 0.0046416 0.0332712 0.356799 -0.0114277 0.0275896 0.353831 -0.0270614 0.0202572 0.347244 -0.0414597 0.0117451 0.337653 -0.0539607 0.0026787 0.325879 -0.0641082 -0.0062414 0.312828 -0.0716797 -0.0143522 0.299379 -0.0766755 -0.0210927 0.286287 -0.0792766 -0.0260742 0.274132 -0.0797863 -0.0291122 0.263296 -0.0785725 -0.0302261 0.253977 -0.0760176 -0.0296182 0.246223 -0.0724832 -0.0276232 0.239963 -0.0682898 -0.0246518 0.235054 -0.0637062 -0.021127 0.231313 -0.0589485 -0.0174301 0.228544 -0.0541824 -0.0138655 0.226557 -0.0495295 -0.0106418 0.225186 -0.0450738 -0.007874 0.224286 -0.0408689 -0.0055983 0.223741 -0.0369446 -0.0037937 0.223461 -0.0333132 -0.0024045 0.223377 -0.0299746 -0.0013605 0.223437 -0.0269201 -0.0005893 0.223603 -0.0241363 -2.65e-05 0.209233 0.0273786 0.0026891 0.208862 0.0299552 0.0027852 0.20874 0.0327238 0.0028989 0.208932 0.0356782 0.0030451 0.209513 0.0388034 0.0032446 0.210569 0.0420723 0.0035244 0.212198 0.0454424 0.0039159 0.214508 0.0488518 0.004453 0.217612 0.0522154 0.0051679 0.221622 0.0554208 0.0060856 0.226641 0.0583258 0.0072178 0.232748 0.0607574 0.0085578 0.239984 0.0625133 0.0100749 0.248333 0.0633673 0.0117143 0.257702 0.0630806 0.0133944 0.267905 0.0614177 0.0150111 0.278652 0.0581701 0.0164365 0.289546 0.0531843 0.0175244 0.300101 0.0463924 0.018117 0.30977 0.0378403 0.0180528 0.31799 0.0277075 0.0171873 0.324248 0.0163119 0.0154172 0.32814 0.0040948 0.0127047 0.329423 -0.0084142 0.0091074 0.328057 -0.0206483 0.0047882 0.324209 -0.0320638 4e-06 0.318226 -0.0421953 -0.0049116 0.310594 -0.0506978 -0.0095943 0.301864 -0.0573706 -0.0136978 0.292595 -0.0621562 -0.0169357 0.283293 -0.0651236 -0.0191205 0.274373 -0.0664381 -0.0201814 0.266139 -0.0663276 -0.0201647 0.258785 -0.0650496 -0.0192156 0.252401 -0.0628654 -0.0175487 0.246995 -0.0600199 -0.0154098 0.242517 -0.0567298 -0.0130414 0.238879 -0.0531777 -0.010653 0.235973 -0.04951 -0.0084051 0.233688 -0.0458396 -0.0064011 0.231918 -0.0422492 -0.0046925 0.230566 -0.038796 -0.0032885 0.229553 -0.0355172 -0.0021693 0.228811 -0.0324339 -0.001298 0.228285 -0.029556 -0.000632 0.227932 -0.0268851 -0.0001287 0.227718 -0.0244172 0.000249 0.211915 0.0262574 0.0025025 0.211823 0.0284967 0.0025442 0.211973 0.0308683 0.0025847 0.212415 0.0333594 0.0026296 0.213209 0.0359491 0.0026884 0.214419 0.0386064 0.0027736 0.216113 0.0412872 0.0029 0.218365 0.0439327 0.0030843 0.221246 0.0464663 0.0033427 0.224825 0.0487921 0.003688 0.229156 0.0507945 0.0041257 0.234274 0.052338 0.0046519 0.240184 0.053271 0.0052473 0.246845 0.0534311 0.0058791 0.254168 0.052654 0.0064979 0.262001 0.0507865 0.0070412 0.270128 0.047702 0.0074349 0.278269 0.0433185 0.0076005 0.286097 0.0376163 0.007459 0.293252 0.0306537 0.0069402 0.299376 0.0225756 0.0059919 0.304141 0.0136139 0.004593 0.307293 0.0040761 0.0027548 0.308675 -0.0056761 0.0005404 0.308248 -0.0152587 -0.0019429 0.3061 -0.0242988 -0.0045471 0.30243 -0.0324695 -0.0070973 0.297522 -0.0395163 -0.0094073 0.291716 -0.0452724 -0.0113162 0.285363 -0.0496643 -0.0126943 0.278797 -0.0527038 -0.013469 0.27231 -0.0544738 -0.0136292 0.26613 -0.0551087 -0.0132237 0.260421 -0.0547744 -0.012348 0.255282 -0.0536492 -0.0111279 0.250757 -0.0519096 -0.0096996 0.246847 -0.0497192 -0.0081917 0.243523 -0.0472216 -0.0067112 0.240733 -0.0445377 -0.0053372 0.238419 -0.0417653 -0.0041178 0.236519 -0.0389798 -0.0030747 0.234974 -0.0362378 -0.0022083 0.23373 -0.0335795 -0.0015052 0.23274 -0.0310321 -0.0009438 0.231962 -0.028613 -0.0005006 0.231363 -0.0263316 -0.0001523 0.230912 -0.024192 0.0001211 0.214288 0.02487 0.0023079 0.214392 0.0267911 0.0023144 0.214723 0.0287963 0.0023102 0.21532 0.0308693 0.0022966 0.216228 0.0329868 0.0022766 0.217492 0.0351169 0.002255 0.21916 0.037218 0.0022378 0.221281 0.0392371 0.0022319 0.223899 0.0411086 0.0022446 0.227051 0.0427542 0.0022816 0.230763 0.0440824 0.0023453 0.235045 0.0449906 0.002434 0.23988 0.0453679 0.0025376 0.245223 0.0451002 0.0026399 0.250993 0.0440769 0.0027153 0.257072 0.0422002 0.0027326 0.263298 0.0393952 0.0026543 0.269476 0.0356214 0.0024429 0.275383 0.0308826 0.0020625 0.280779 0.0252352 0.0014867 0.285432 0.0187927 0.0007005 0.289131 0.0117235 -0.0002925 0.291711 0.0042433 -0.0014695 0.293067 -0.0033988 -0.0027836 0.293168 -0.0109389 -0.0041683 0.292059 -0.0181199 -0.0055419 0.289852 -0.0247114 -0.006814 0.286718 -0.0305267 -0.0078975 0.282863 -0.0354342 -0.0087198 0.278512 -0.0393617 -0.0092291 0.273885 -0.0422946 -0.0094055 0.269181 -0.0442682 -0.0092569 0.26457 -0.0453576 -0.0088219 0.26018 -0.0456649 -0.0081575 0.256104 -0.0453072 -0.0073339 0.252396 -0.0444062 -0.0064221 0.249083 -0.0430796 -0.0054874 0.246165 -0.0414355 -0.004582 0.243628 -0.0395687 -0.0037438 0.241445 -0.0375596 -0.002995 0.239585 -0.0354735 -0.0023447 0.238013 -0.0333623 -0.0017922 0.236696 -0.0312658 -0.0013299 0.235602 -0.0292136 -0.0009466 0.234702 -0.027227 -0.0006307 0.233971 -0.0253208 -0.00037 0.233384 -0.0235044 -0.0001547 0.216484 0.0233349 0.0021106 0.216723 0.0249669 0.0020953 0.217168 0.0266459 0.0020655 0.217849 0.0283541 0.0020205 0.2188 0.0300682 0.0019606 0.220053 0.0317579 0.0018867 0.22164 0.0333858 0.0018007 0.223592 0.0349062 0.0017045 0.225935 0.0362648 0.0016011 0.228688 0.0373988 0.0014924 0.231858 0.0382381 0.0013796 0.235441 0.0387061 0.0012623 0.239413 0.0387233 0.001136 0.243731 0.0382105 0.0009943 0.248324 0.0370943 0.000826 0.2531 0.0353135 0.0006184 0.257941 0.032825 0.0003556 0.262707 0.0296117 2.27e-05 0.267246 0.0256875 -0.000393 0.271396 0.0211025 -0.0008996 0.275002 0.0159438 -0.0014964 0.277927 0.0103339 -0.0021732 0.280059 0.0044257 -0.0029134 0.28133 -0.0016074 -0.0036841 0.281712 -0.0075825 -0.0044494 0.281228 -0.0133201 -0.0051652 0.279942 -0.0186569 -0.0057901 0.277957 -0.0234566 -0.0062811 0.275401 -0.0276172 -0.0066119 0.272418 -0.0310752 -0.0067634 0.269152 -0.0338051 -0.0067333 0.265741 -0.0358162 -0.006533 0.262307 -0.0371469 -0.0061875 0.25895 -0.0378571 -0.0057295 0.255747 -0.0380208 -0.0051959 0.252752 -0.0377191 -0.0046228 0.25 -0.0370342 -0.0040426 0.247509 -0.0360446 -0.0034809 0.24528 -0.0348221 -0.0029559 0.243309 -0.0334303 -0.0024785 0.241581 -0.0319234 -0.002053 0.240081 -0.0303466 -0.0016797 0.238788 -0.0287365 -0.0013553 0.237683 -0.0271222 -0.0010746 0.236746 -0.0255264 -0.0008325 0.235959 -0.0239663 -0.0006233 0.235304 -0.0224544 -0.0004424 0.218512 0.02174 0.0019196 0.218838 0.0231157 0.001891 0.219347 0.0245111 0.0018472 0.220063 0.0259083 0.0017868 0.221009 0.0272853 0.0017089 0.222209 0.0286149 0.001613 0.223684 0.0298644 0.0014992 0.225451 0.0309956 0.0013673 0.227526 0.0319646 0.0012184 0.229915 0.0327222 0.0010529 0.232618 0.033215 0.0008712 0.235622 0.033387 0.0006739 0.238901 0.0331814 0.0004596 0.242416 0.0325441 0.0002266 0.24611 0.0314271 -2.84e-05 0.249911 0.0297924 -0.0003084 0.253731 0.0276167 -0.0006186 0.257471 0.0248954 -0.0009625 0.261024 0.0216459 -0.0013422 0.264277 0.0179098 -0.0017567 0.267128 0.0137538 -0.0022025 0.269481 0.0092674 -0.0026687 0.271264 0.0045596 -0.0031443 0.272426 -0.0002473 -0.0036116 0.272946 -0.0050242 -0.004049 0.272835 -0.009645 -0.0044364 0.272129 -0.0139925 -0.0047533 0.270891 -0.0179665 -0.0049816 0.269201 -0.0214888 -0.0051118 0.267153 -0.0245059 -0.0051383 0.264843 -0.0269895 -0.0050636 0.262366 -0.0289355 -0.0048969 0.259809 -0.0303606 -0.0046529 0.257248 -0.0312978 -0.004349 0.254746 -0.0317925 -0.0040053 0.252351 -0.0318971 -0.0036402 0.250098 -0.0316675 -0.0032698 0.248009 -0.0311593 -0.0029069 0.246097 -0.0304257 -0.0025614 0.244367 -0.0295154 -0.0022388 0.242817 -0.0284719 -0.0019423 0.24144 -0.0273329 -0.0016728 0.240227 -0.0261304 -0.0014297 0.239166 -0.0248912 -0.0012108 0.238247 -0.0236372 -0.0010144 0.237456 -0.022386 -0.0008384 0.23678 -0.0211515 -0.0006807 0.220385 0.0201447 0.0017383 0.220762 0.0212979 0.0017022 0.221299 0.0224511 0.0016516 0.222016 0.0235878 0.001585 0.222927 0.0246878 0.0015014 0.224049 0.0257275 0.0013997 0.225396 0.0266792 0.0012796 0.226979 0.0275115 0.0011402 0.228803 0.0281895 0.000982 0.230869 0.0286751 0.0008048 0.233171 0.0289282 0.0006087 0.235694 0.0289078 0.000395 0.238415 0.028574 0.0001635 0.241298 0.0278898 -8.51e-05 0.244298 0.0268239 -0.000351 0.247358 0.0253535 -0.0006332 0.250415 0.0234667 -0.0009318 0.253395 0.0211654 -0.0012455 0.256221 0.018467 -0.0015722 0.258817 0.0154058 -0.0019092 0.261109 0.0120324 -0.00225 0.263033 0.0084128 -0.0025882 0.264537 0.0046257 -0.0029159 0.265585 0.0007588 -0.0032217 0.266162 -0.0030966 -0.0034949 0.26627 -0.0068496 -0.0037258 0.26593 -0.0104158 -0.0039052 0.265182 -0.0137211 -0.0040253 0.264076 -0.0167054 -0.0040836 0.262673 -0.0193247 -0.0040792 0.261039 -0.0215519 -0.0040146 0.259239 -0.0233765 -0.0038961 0.257336 -0.0248027 -0.0037326 0.255386 -0.0258471 -0.0035332 0.25344 -0.026536 -0.0033086 0.251538 -0.0269025 -0.0030686 0.249711 -0.0269838 -0.0028219 0.247983 -0.0268185 -0.0025754 0.24637 -0.0264451 -0.002335 0.244882 -0.0259002 -0.0021039 0.243522 -0.0252177 -0.001885 0.242292 -0.0244282 -0.0016794 0.241187 -0.0235587 -0.0014879 0.240203 -0.0226325 -0.0013101 0.239333 -0.0216696 -0.0011457 0.23857 -0.0206867 -0.0009942 0.237905 -0.0196976 -0.0008549 0.294205 -0.0255254 0.0030562 0.294627 -0.0270054 0.0029958 0.295251 -0.0284895 0.0029099 0.2961 -0.0299575 0.0027959 0.297194 -0.0313846 0.0026515 0.298556 -0.0327415 0.0024748 0.300202 -0.0339941 0.0022646 0.302148 -0.0351032 0.0020189 0.304403 -0.0360253 0.0017379 0.306969 -0.0367127 0.0014211 0.309841 -0.0371148 0.0010685 0.313002 -0.0371799 0.0006819 0.316424 -0.0368568 0.0002616 0.320066 -0.036098 -0.0001903 0.323873 -0.0348623 -0.000673 0.327775 -0.0331188 -0.001183 0.331693 -0.0308498 -0.0017185 0.335537 -0.0280543 -0.002275 0.33921 -0.0247505 -0.0028467 0.342615 -0.0209777 -0.0034274 0.345657 -0.0167955 -0.0040054 0.348254 -0.0122836 -0.0045691 0.350336 -0.0075377 -0.0051063 0.351854 -0.0026657 -0.0055994 0.352784 0.0022186 -0.006033 0.353122 0.007001 -0.0063933 0.352891 0.0115742 -0.0066683 0.352133 0.0158427 -0.0068475 0.350911 0.0197276 -0.0069286 0.349295 0.0231697 -0.0069114 0.347367 0.0261305 -0.0068004 0.345207 0.0285919 -0.0066054 0.342895 0.0305547 -0.0063399 0.340501 0.0320358 -0.0060176 0.338091 0.0330647 -0.0056546 0.335716 0.0336801 -0.0052653 0.333419 0.0339263 -0.004863 0.331231 0.0338506 -0.0044585 0.329176 0.0335002 -0.0040608 0.327268 0.0329209 -0.0036758 0.325514 0.0321552 -0.003308 0.323917 0.0312421 -0.0029601 0.322474 0.0302161 -0.0026338 0.32118 0.0291074 -0.0023289 0.320029 0.027942 -0.0020455 0.319012 0.0267419 -0.0017832 0.318119 0.0255255 -0.0015413 0.291807 -0.0275082 0.0033698 0.292157 -0.0292682 0.0033222 0.292736 -0.0310574 0.0032473 0.293574 -0.0328544 0.0031424 0.294701 -0.0346322 0.0030052 0.296148 -0.0363572 0.002834 0.297942 -0.0379893 0.0026279 0.300107 -0.0394812 0.0023856 0.302664 -0.0407783 0.0021077 0.305623 -0.0418194 0.0017938 0.308985 -0.0425377 0.0014443 0.312738 -0.0428623 0.0010602 0.316852 -0.0427216 0.0006397 0.321281 -0.0420463 0.0001824 0.325957 -0.0407738 -0.0003145 0.330792 -0.038854 -0.0008521 0.335678 -0.0362537 -0.0014343 0.340493 -0.0329627 -0.002062 0.345101 -0.028998 -0.0027338 0.349363 -0.0244061 -0.0034437 0.353144 -0.0192652 -0.0041837 0.356325 -0.0136826 -0.0049344 0.358805 -0.0077905 -0.0056792 0.360518 -0.0017395 -0.0063922 0.361428 0.0043105 -0.0070432 0.361541 0.0102006 -0.0076055 0.360896 0.0157819 -0.008052 0.359565 0.0209251 -0.00836 0.357643 0.0255267 -0.0085192 0.355242 0.0295134 -0.0085237 0.352481 0.0328431 -0.0083789 0.349478 0.0355041 -0.0080989 0.346343 0.0375107 -0.0077056 0.343174 0.0388991 -0.0072235 0.340052 0.0397215 -0.0066817 0.33704 0.0400402 -0.006106 0.334186 0.0399228 -0.0055201 0.331522 0.0394378 -0.0049419 0.329068 0.0386513 -0.0043868 0.326832 0.0376246 -0.0038635 0.324815 0.0364128 -0.0033773 0.323011 0.0350644 -0.0029304 0.321411 0.0336209 -0.0025231 0.320002 0.0321173 -0.0021528 0.31877 0.0305826 -0.0018178 0.317701 0.0290402 -0.0015152 0.31678 0.0275091 -0.0012424 0.289227 -0.0294808 0.0036974 0.289459 -0.0315619 0.0036714 0.289948 -0.0337075 0.0036182 0.290731 -0.0358959 0.0035356 0.291851 -0.0380988 0.0034224 0.29335 -0.0402793 0.0032784 0.295269 -0.0423915 0.0031044 0.29765 -0.0443792 0.0029012 0.300526 -0.0461754 0.0026715 0.303923 -0.0477024 0.0024163 0.307855 -0.0488725 0.0021365 0.31232 -0.0495901 0.0018317 0.31729 -0.0497549 0.0014962 0.322716 -0.0492664 0.0011234 0.328516 -0.0480305 0.0007009 0.334576 -0.0459665 0.0002159 0.340753 -0.0430161 -0.000348 0.346875 -0.0391515 -0.001005 0.35275 -0.0343834 -0.0017655 0.358176 -0.0287667 -0.0026342 0.362956 -0.0224022 -0.0036035 0.366911 -0.0154362 -0.0046541 0.369896 -0.0080532 -0.0057604 0.371814 -0.000466 -0.0068749 0.37262 0.0070986 -0.00795 0.372331 0.0144152 -0.0089272 0.371017 0.0212758 -0.0097553 0.368798 0.0275039 -0.0103795 0.365827 0.0329635 -0.0107701 0.362278 0.0375656 -0.0109056 0.358331 0.0412684 -0.0107862 0.354158 0.0440738 -0.0104304 0.349914 0.0460212 -0.0098738 0.345727 0.0471781 -0.0091614 0.3417 0.0476316 -0.0083438 0.337907 0.0474791 -0.00747 0.334395 0.0468212 -0.0065846 0.331192 0.0457552 -0.0057228 0.328306 0.0443714 -0.0049107 0.325734 0.0427505 -0.0041641 0.323464 0.040962 -0.0034903 0.321476 0.0390646 -0.0028908 0.319749 0.0371066 -0.0023624 0.318259 0.0351266 -0.0018986 0.316985 0.0331553 -0.0014933 0.315902 0.0312161 -0.0011388 0.31499 0.0293269 -0.0008291 0.286454 -0.0313662 0.0040308 0.286508 -0.0338088 0.004039 0.286841 -0.0363628 0.004024 0.287506 -0.0390087 0.0039856 0.288556 -0.0417185 0.0039256 0.290053 -0.0444537 0.0038482 0.292056 -0.0471637 0.0037586 0.294628 -0.0497837 0.0036633 0.297827 -0.0522334 0.0035697 0.301703 -0.0544159 0.0034829 0.306293 -0.0562182 0.0034049 0.311611 -0.0575125 0.0033329 0.317645 -0.05816 0.0032539 0.324343 -0.0580168 0.0031489 0.331611 -0.056942 0.0029874 0.339305 -0.0548092 0.002734 0.34723 -0.0515187 0.0023457 0.355145 -0.0470116 0.0017814 0.362773 -0.041283 0.001003 0.369814 -0.0343922 -1.31e-05 0.375972 -0.026469 -0.0012773 0.380977 -0.0177126 -0.0027749 0.38461 -0.0083828 -0.0044684 0.386728 0.0012163 -0.0062921 0.387273 0.0107578 -0.0081573 0.386286 0.0199194 -0.009959 0.383893 0.0284073 -0.011584 0.380293 0.0359781 -0.012926 0.375735 0.0424546 -0.0138985 0.370496 0.0477319 -0.0144416 0.364848 0.0517766 -0.0145365 0.359044 0.0546191 -0.0141982 0.353299 0.0563411 -0.0134812 0.347783 0.0570604 -0.0124614 0.342619 0.0569167 -0.011232 0.337885 0.0560579 -0.0098865 0.333621 0.0546293 -0.0085112 0.329836 0.0527663 -0.0071754 0.326517 0.0505893 -0.0059304 0.323637 0.048201 -0.0048069 0.32116 0.0456867 -0.0038186 0.319048 0.0431147 -0.0029662 0.317259 0.0405385 -0.002241 0.315756 0.0379984 -0.0016292 0.314504 0.0355242 -0.0011158 0.313469 0.0331371 -0.000685 0.312624 0.0308516 -0.0003236 0.28348 -0.0330521 0.0043519 0.283276 -0.0358912 0.0044133 0.28337 -0.0389022 0.0044627 0.283826 -0.0420705 0.0045048 0.284719 -0.0453716 0.0045489 0.286127 -0.0487682 0.0046079 0.288141 -0.0522076 0.0046978 0.290853 -0.0556182 0.0048362 0.294356 -0.0589068 0.0050408 0.29874 -0.061956 0.0053248 0.304076 -0.0646232 0.0056931 0.310416 -0.0667411 0.0061391 0.317771 -0.0681211 0.0066374 0.326101 -0.0685596 0.0071472 0.335301 -0.0678494 0.0076074 0.345191 -0.0657945 0.0079424 0.355508 -0.0622294 0.0080638 0.365912 -0.0570412 0.0078804 0.375995 -0.0501916 0.0073034 0.385308 -0.0417371 0.006258 0.393398 -0.0318406 0.0046945 0.399846 -0.0207735 0.0026038 0.404316 -0.0089042 1.49e-05 0.40659 0.0033278 -0.0029795 0.406598 0.015448 -0.0062367 0.404424 0.026989 -0.0095688 0.400291 0.0375331 -0.0127608 0.39454 0.0467462 -0.0155856 0.38758 0.0543999 -0.0178541 0.379847 0.0603793 -0.0194144 0.371759 0.0646768 -0.020186 0.363687 0.0673757 -0.0201641 0.355928 0.0686273 -0.0194165 0.348698 0.0686264 -0.0180683 0.342135 0.0675884 -0.0162814 0.336307 0.0657299 -0.0142304 0.331227 0.0632546 -0.0120811 0.326867 0.0603443 -0.0099712 0.323172 0.057154 -0.0080043 0.320074 0.0538106 -0.0062445 0.317501 0.050414 -0.0047218 0.315381 0.0470403 -0.0034393 0.313648 0.043745 -0.002381 0.312244 0.0405669 -0.0015201 0.311119 0.0375317 -0.0008268 0.310228 0.0346549 -0.0002706 0.309536 0.0319447 0.0001748 0.280131 -0.0343878 0.0046482 0.279566 -0.0376457 0.004789 0.279306 -0.0411503 0.0049406 0.279432 -0.0448955 0.0051185 0.280038 -0.0488644 0.0053458 0.281233 -0.0530255 0.0056527 0.283141 -0.0573284 0.0060749 0.285898 -0.0616989 0.0066504 0.289649 -0.0660339 0.0074158 0.294539 -0.0701969 0.0083985 0.300702 -0.074014 0.0096094 0.308246 -0.0772725 0.0110367 0.31723 -0.0797222 0.0126383 0.327646 -0.0810823 0.0143425 0.339389 -0.0810535 0.016045 0.35224 -0.0793382 0.0176151 0.365849 -0.0756681 0.0188953 0.379733 -0.0698385 0.0197105 0.39329 -0.0617463 0.0198777 0.405839 -0.0514247 0.0192179 0.416674 -0.0390702 0.0175782 0.425137 -0.0250502 0.0148631 0.430698 -0.0098887 0.0110567 0.433024 0.0057736 0.0062564 0.432026 0.0212393 0.0006825 0.427872 0.0358267 -0.005343 0.420965 0.048939 -0.0114131 0.41188 0.0601194 -0.0170932 0.401295 0.0690833 -0.0219759 0.389904 0.0757233 -0.0257279 0.378346 0.0800914 -0.0281356 0.367156 0.0823652 -0.0291252 0.356735 0.0828072 -0.028763 0.347345 0.0817249 -0.0272347 0.339119 0.0794367 -0.0248102 0.332088 0.0762468 -0.0217978 0.326204 0.0724283 -0.0185025 0.321367 0.0682145 -0.0151899 0.317453 0.0637959 -0.0120648 0.314329 0.0593214 -0.0092615 0.311864 0.0549025 -0.0068488 0.309942 0.0506187 -0.0048417 0.308461 0.0465233 -0.0032175 0.307339 0.042649 -0.0019309 0.306505 0.0390136 -0.0009278 0.305904 0.0356235 -0.0001535 0.305493 0.0324774 0.0004407 0.276098 -0.0351731 0.0049112 0.275043 -0.0388499 0.0051659 0.274283 -0.0428609 0.0054727 0.273918 -0.0472131 0.0058657 0.274065 -0.0519024 0.0063922 0.274869 -0.0569092 0.0071119 0.276498 -0.0621924 0.008093 0.279146 -0.0676825 0.0094073 0.283031 -0.0732737 0.0111216 0.288379 -0.0788164 0.0132859 0.295415 -0.084109 0.0159228 0.304339 -0.0888925 0.0190187 0.315295 -0.0928477 0.0225163 0.328339 -0.0955985 0.0263162 0.34339 -0.0967242 0.0302721 0.360199 -0.0957829 0.0341916 0.378308 -0.0923499 0.0378286 0.397042 -0.0860694 0.0408759 0.415514 -0.0767173 0.042967 0.432685 -0.0642651 0.0436922 0.447447 -0.0489312 0.0426479 0.458752 -0.0312056 0.0395148 0.46575 -0.0118342 0.0341324 0.467921 0.0082437 0.0265861 0.465156 0.0279964 0.0172234 0.45778 0.0464218 0.0066319 0.446506 0.062667 -0.004439 0.432321 0.0761167 -0.015165 0.416341 0.0864372 -0.0247801 0.399667 0.0935713 -0.0326391 0.383265 0.0976935 -0.0382994 0.36789 0.0991428 -0.0415564 0.354058 0.0983512 -0.0424441 0.342053 0.0957817 -0.0412134 0.331963 0.0918817 -0.0382743 0.323727 0.0870541 -0.0341314 0.317184 0.0816426 -0.0293076 0.312118 0.0759276 -0.0242778 0.308292 0.0701279 -0.0194252 0.305474 0.0644072 -0.015016 0.303456 0.0588817 -0.0112002 0.302057 0.0536288 -0.0080291 0.301131 0.0486948 -0.0054806 0.300563 0.0441028 -0.0034876 0.300265 0.0398591 -0.001962 0.300168 0.0359582 -0.0008118 0.300223 0.0323873 4.64e-05 0.270719 -0.0351696 0.0051733 0.269013 -0.0392301 0.0055826 0.267572 -0.0437202 0.0061098 0.266511 -0.0486644 0.0068182 0.265975 -0.0540778 0.0077927 0.266149 -0.0599601 0.009137 0.267258 -0.0662888 0.0109678 0.26957 -0.07301 0.013405 0.273394 -0.0800283 0.0165584 0.27907 -0.0871942 0.0205122 0.286953 -0.0942914 0.0253127 0.29738 -0.101024 0.0309625 0.310635 -0.107006 0.0374188 0.32689 -0.111755 0.0445969 0.34614 -0.1147 0.0523579 0.368136 -0.115205 0.0604877 0.392309 -0.112616 0.0686421 0.417734 -0.106337 0.0762864 0.443123 -0.0959316 0.0826614 0.466892 -0.0812341 0.0868086 0.487301 -0.0624502 0.0877049 0.502665 -0.0402147 0.0844865 0.511606 -0.0155812 0.0767008 0.513287 0.0100726 0.064485 0.507579 0.0352133 0.0485894 0.495092 0.0583642 0.030242 0.47708 0.078307 0.0109118 0.455228 0.0942289 -0.0079381 0.43137 0.105781 -0.025029 0.407237 0.113042 -0.0393591 0.384258 0.116421 -0.0502578 0.363457 0.116522 -0.057389 0.345442 0.114026 -0.0607514 0.330456 0.109595 -0.0606505 0.318457 0.103816 -0.0576433 0.309206 0.0971822 -0.0524561 0.302356 0.0900867 -0.0458854 0.297509 0.0828335 -0.0386946 0.29427 0.0756499 -0.0315322 0.292273 0.0686997 -0.0248797 0.291202 0.0620943 -0.0190366 0.290801 0.0559035 -0.0141356 0.290865 0.0501644 -0.01018 0.291244 0.0448895 -0.0070868 0.291828 0.0400734 -0.0047284 0.29254 0.0356989 -0.0029635 0.293328 0.0317413 -0.0016594 0.263172 -0.0341237 0.0055189 0.260638 -0.0384838 0.0061272 0.25831 -0.0433681 0.0069473 0.256318 -0.0488226 0.0080838 0.254837 -0.0548869 0.0096725 0.254096 -0.0615881 0.011876 0.254382 -0.0689331 0.0148727 0.256053 -0.0768986 0.0188425 0.259532 -0.085418 0.0239501 0.265303 -0.0943652 0.0303289 0.273891 -0.103535 0.0380788 0.285831 -0.11262 0.0472759 0.301616 -0.121186 0.0579908 0.32162 -0.128651 0.0702981 0.346004 -0.134274 0.0842419 0.374586 -0.137173 0.099731 0.406725 -0.136374 0.116346 0.441204 -0.130922 0.133101 0.476192 -0.12003 0.148292 0.509307 -0.103273 0.159556 0.537829 -0.0807655 0.164298 0.559048 -0.0532916 0.160407 0.570709 -0.0223118 0.146991 0.571441 0.0101721 0.124814 0.561072 0.0418918 0.0961346 0.540705 0.0706699 0.0640309 0.512524 0.0947723 0.0315814 0.479382 0.113151 0.0012401 0.444282 0.12552 -0.0253854 0.409908 0.132254 -0.0473822 0.37831 0.134177 -0.0643146 0.350792 0.132315 -0.0760367 0.327958 0.127691 -0.0826364 0.30986 0.121192 -0.0844521 0.296178 0.113528 -0.0820841 0.286373 0.105226 -0.0763712 0.279814 0.096671 -0.0683093 0.275857 0.0881387 -0.0589324 0.2739 0.0798277 -0.0491921 0.273413 0.0718794 -0.0398554 0.273956 0.0643916 -0.0314528 0.275174 0.0574258 -0.024271 0.276802 0.0510137 -0.018391 0.278647 0.0451631 -0.0137436 0.280577 0.0398628 -0.0101723 0.282508 0.0350891 -0.007484 0.284388 0.0308091 -0.0054875 0.252534 -0.0318324 0.0061239 0.248997 -0.0363494 0.0069708 0.245576 -0.0414719 0.0081491 0.242416 -0.0472693 0.0098131 0.239718 -0.0538091 0.0121582 0.237755 -0.0611526 0.015412 0.236883 -0.0693472 0.0198181 0.237553 -0.0784165 0.0256182 0.24032 -0.0883466 0.0330361 0.245834 -0.099067 0.0422782 0.254834 -0.110423 0.0535626 0.268113 -0.122141 0.0671801 0.286465 -0.133781 0.0835654 0.310588 -0.14469 0.103333 0.340948 -0.153962 0.127181 0.377583 -0.160428 0.155574 0.419872 -0.162705 0.188148 0.466313 -0.15933 0.222955 0.514383 -0.148988 0.255935 0.560577 -0.130814 0.281081 0.600698 -0.104705 0.291751 0.630426 -0.0715549 0.28289 0.646066 -0.0333177 0.253248 0.645337 0.0071659 0.206385 0.627955 0.0465913 0.149647 0.595813 0.081779 0.0915449 0.552638 0.110269 0.0389186 0.503222 0.130737 -0.0046366 0.452439 0.143099 -0.0386118 0.404396 0.148285 -0.0642566 0.361932 0.147815 -0.0831586 0.326538 0.143347 -0.0964504 0.29857 0.136344 -0.10468 0.277618 0.127913 -0.108095 0.262842 0.118794 -0.106966 0.253237 0.10944 -0.101803 0.247788 0.100113 -0.0934106 0.245554 0.0909767 -0.0828213 0.245705 0.0821447 -0.0711493 0.247536 0.0737113 -0.0594253 0.250466 0.0657556 -0.048466 0.254043 0.0583395 -0.0388035 0.257926 0.0515041 -0.0306872 0.261875 0.0452684 -0.0241348 0.265732 0.0396304 -0.0190078 0.269404 0.0345711 -0.015086 0.272843 0.0300593 -0.012128 0.238438 -0.0282283 0.0072429 0.233767 -0.0327046 0.0083606 0.229097 -0.0378405 0.0099437 0.224582 -0.0437272 0.0121969 0.220446 -0.0504615 0.0153719 0.217002 -0.058142 0.0197519 0.214668 -0.066865 0.0256307 0.213989 -0.0767162 0.0332933 0.21565 -0.0877588 0.0430186 0.22048 -0.100013 0.0551195 0.229459 -0.113424 0.0700573 0.243701 -0.127809 0.0886205 0.264402 -0.142789 0.112143 0.292747 -0.157696 0.142628 0.329719 -0.17149 0.182555 0.375804 -0.182702 0.234079 0.430602 -0.189463 0.297415 0.492397 -0.189667 0.368688 0.557841 -0.181285 0.438256 0.621912 -0.162814 0.491058 0.678297 -0.133764 0.510263 0.720253 -0.0950545 0.483689 0.741831 -0.0491715 0.410212 0.739222 2.61e-05 0.302216 0.71183 0.0478921 0.181821 0.6627 0.0898865 0.0722495 0.598005 0.122556 -0.0109114 0.525655 0.14425 -0.0637568 0.45349 0.155286 -0.0919231 0.387713 0.157521 -0.104963 0.332092 0.153553 -0.111197 0.288018 0.145926 -0.115372 0.255125 0.136617 -0.11891 0.232064 0.126867 -0.121324 0.217138 0.117282 -0.121547 0.208683 0.108049 -0.118736 0.205231 0.0991509 -0.112621 0.205542 0.0905236 -0.103544 0.208582 0.0821366 -0.0923261 0.213491 0.0740139 -0.0800378 0.219568 0.0662214 -0.0677447 0.226252 0.0588419 -0.056304 0.233122 0.051952 -0.0462658 0.239877 0.0456081 -0.0378676 0.246323 0.0398399 -0.0310964 0.252349 0.0346516 -0.0257808 0.257903 0.0300268 -0.0216753 0.221397 -0.0234885 0.0092031 0.215545 -0.0276922 0.010613 0.209565 -0.0325706 0.0126178 0.203613 -0.038233 0.0154607 0.197929 -0.044802 0.0194295 0.192856 -0.0524133 0.0248328 0.188863 -0.0612143 0.0319729 0.186574 -0.0713618 0.041137 0.186789 -0.0830131 0.0526384 0.190511 -0.0963084 0.066943 0.198974 -0.111333 0.0849549 0.213658 -0.128055 0.108458 0.236282 -0.14622 0.140678 0.268707 -0.165217 0.186697 0.312708 -0.183927 0.253185 0.369544 -0.200603 0.346642 0.439319 -0.212862 0.469483 0.520239 -0.21787 0.614451 0.608 -0.212767 0.759898 0.695603 -0.195289 0.870168 0.773864 -0.164451 0.904712 0.832666 -0.121114 0.834651 0.8628 -0.0682435 0.659555 0.858076 -0.0107434 0.413777 0.817171 0.0452445 0.155909 0.744591 0.0935526 -0.0551668 0.650084 0.129467 -0.184432 0.546361 0.150932 -0.230965 0.445828 0.158892 -0.219634 0.357722 0.15656 -0.182953 0.286806 0.148029 -0.145822 0.233789 0.136961 -0.12019 0.19677 0.125836 -0.107655 0.172772 0.115851 -0.104695 0.158809 0.107236 -0.106609 0.152385 0.0996832 -0.109406 0.151584 0.0927285 -0.110368 0.154951 0.0859782 -0.108084 0.161343 0.0792074 -0.102303 0.169817 0.0723612 -0.0936562 0.179581 0.0655067 -0.0832609 0.189975 0.0587739 -0.072326 0.20048 0.0523045 -0.061858 0.210711 0.0462199 -0.0525118 0.220413 0.0406055 -0.044588 0.229437 0.035508 -0.0381114 0.237718 0.0309407 -0.0329372 0.204117 -0.0181027 0.0122869 0.197174 -0.0218077 0.0140178 0.189976 -0.0261589 0.0164567 0.182677 -0.0312774 0.0198674 0.175524 -0.0373049 0.0245454 0.168878 -0.0444077 0.0307847 0.163245 -0.0527792 0.0388493 0.159303 -0.0626431 0.0489848 0.157946 -0.0742504 0.0615255 0.160329 -0.087865 0.0771777 0.167939 -0.103727 0.0976017 0.182666 -0.121975 0.126359 0.206852 -0.14252 0.170187 0.243241 -0.164855 0.240137 0.294702 -0.187841 0.351382 0.363617 -0.209504 0.519774 0.450897 -0.226993 0.753326 0.554767 -0.236799 1.03932 0.669754 -0.235313 1.33289 0.786361 -0.219629 1.55713 0.891794 -0.188387 1.62329 0.971728 -0.142411 1.46825 1.01283 -0.085002 1.09249 1.00567 -0.0218216 0.574997 0.94758 0.0397802 0.049808 0.844558 0.092129 -0.349591 0.711002 0.129192 -0.548435 0.566414 0.148447 -0.555793 0.429853 0.151579 -0.442444 0.314787 0.143437 -0.29246 0.226909 0.129858 -0.164476 0.165306 0.115654 -0.0812688 0.125401 0.103639 -0.0404417 0.101728 0.0947142 -0.0296412 0.0895805 0.0884935 -0.0362354 0.0855545 0.0840207 -0.0506092 0.0873989 0.0802961 -0.0661827 0.0936274 0.0765652 -0.0787792 0.103155 0.0724067 -0.0862375 0.115071 0.0676969 -0.0881095 0.128547 0.0625185 -0.08522 0.142833 0.0570624 -0.0790594 0.15729 0.0515485 -0.0712224 0.171416 0.046175 -0.0630176 0.184856 0.0410932 -0.0553108 0.197392 0.0364019 -0.0485433 0.20892 0.0321527 -0.0428423 0.193277 -0.0128239 0.016358 0.185499 -0.015847 0.0184732 0.177354 -0.0194449 0.0214184 0.168993 -0.0237408 0.0254765 0.160663 -0.0288843 0.0309515 0.152735 -0.0350577 0.0381251 0.145733 -0.0424819 0.0472343 0.140378 -0.0514231 0.0585146 0.137632 -0.0621946 0.0724113 0.138784 -0.0751456 0.090084 0.145567 -0.0906255 0.114455 0.160305 -0.108903 0.151963 0.186047 -0.130023 0.215068 0.226574 -0.153582 0.32469 0.286085 -0.17846 0.510355 0.368339 -0.202569 0.803995 0.475204 -0.222791 1.22343 0.604837 -0.235259 1.74668 0.750215 -0.236052 2.28894 0.898815 -0.22213 2.70338 1.03379 -0.19218 2.8211 1.13635 -0.147136 2.52339 1.18885 -0.0903592 1.81329 1.17825 -0.0275585 0.843876 1.09991 0.0336654 -0.124359 0.960889 0.0850139 -0.829787 0.780696 0.11964 -1.1277 0.587276 0.134632 -1.04679 0.408432 0.132244 -0.744026 0.263106 0.11868 -0.398216 0.157696 0.10115 -0.125073 0.0885007 0.0851904 0.0404972 0.0470376 0.0735813 0.114638 0.0245688 0.0667073 0.128699 0.0143959 0.0635331 0.109386 0.0122688 0.0625295 0.0744098 0.0158241 0.0622853 0.0348801 0.0237877 0.0617946 -0.001994 0.0353318 0.0605115 -0.0317301 0.0497075 0.0582739 -0.0523142 0.0661181 0.0551777 -0.0638875 0.0837399 0.0514542 -0.0680565 0.101798 0.047374 -0.0670535 0.119642 0.0431861 -0.063032 0.136782 0.0390879 -0.0576744 0.152895 0.0352169 -0.0520816 0.167807 0.0316555 -0.0468546 0.200826 -0.0082668 0.0201486 0.192632 -0.0104626 0.0227951 0.18398 -0.0131127 0.0265052 0.175012 -0.0163263 0.0316518 0.165974 -0.0202398 0.0386478 0.157239 -0.0250222 0.0479057 0.149346 -0.0308822 0.0598281 0.143044 -0.0380749 0.074896 0.139355 -0.0469034 0.0939991 0.139688 -0.0577104 0.119208 0.146004 -0.0708457 0.155386 0.161048 -0.0865918 0.212961 0.18857 -0.105028 0.311993 0.233399 -0.125822 0.486317 0.301071 -0.14796 0.784037 0.3967 -0.169516 1.25737 0.522964 -0.187613 1.93489 0.677643 -0.198755 2.77841 0.851799 -0.199553 3.64611 1.02972 -0.187597 4.29748 1.19078 -0.162084 4.4625 1.31245 -0.124062 3.95752 1.37353 -0.0764293 2.79469 1.35781 -0.023888 1.22401 1.25842 0.0272102 -0.331026 1.08269 0.0696099 -1.43929 0.854599 0.0969831 -1.85927 0.610813 0.106497 -1.64545 0.388863 0.100401 -1.07801 0.213785 0.0849562 -0.471083 0.0923572 0.0672861 -0.0172482 0.0172301 0.052548 0.239208 -0.024693 0.0429763 0.340482 -0.0456978 0.0384705 0.347525 -0.0544252 0.037692 0.306382 -0.0557739 0.0389826 0.243947 -0.0520012 0.04091 0.175108 -0.0439835 0.0424902 0.109196 -0.032151 0.0432002 0.0525559 -0.0169942 0.0428849 0.0087722 0.0007839 0.0416314 -0.0214038 0.0203199 0.0396523 -0.0394819 0.0407204 0.0371985 -0.0482305 0.061185 0.0345033 -0.0506479 0.0810811 0.0317552 -0.0493126 0.0999693 0.02909 -0.0461035 0.117588 0.0265942 -0.0422134 0.230066 -0.0042347 0.0216319 0.221847 -0.0054261 0.0249259 0.213082 -0.0068801 0.0296836 0.203906 -0.0086652 0.0364783 0.194557 -0.0108674 0.0459935 0.185407 -0.0135943 0.0589928 0.177001 -0.0169791 0.0763258 0.170105 -0.0211842 0.0990508 0.165785 -0.0264013 0.128854 0.165537 -0.0328449 0.169037 0.171501 -0.040731 0.226586 0.186739 -0.0502295 0.315821 0.215545 -0.0613783 0.463809 0.263554 -0.0739503 0.715952 0.337325 -0.087288 1.13657 0.442957 -0.100164 1.79464 0.583598 -0.110783 2.72497 0.756472 -0.117029 3.86913 0.950908 -0.116961 5.02787 1.14869 -0.109325 5.87392 1.3266 -0.0938629 6.05069 1.45977 -0.0713374 5.32482 1.52488 -0.0434629 3.72371 1.5036 -0.0129032 1.58646 1.38722 0.0167194 -0.517373 1.18274 0.0411195 -2.00212 0.917048 0.0563888 -2.53347 0.633575 0.0606855 -2.18838 0.37793 0.0554445 -1.36707 0.180263 0.0447574 -0.516838 0.0474311 0.0332245 0.0969956 -0.0312634 0.0240433 0.425945 -0.0728756 0.0184496 0.541712 -0.09255 0.0162041 0.535654 -0.100381 0.0163481 0.472215 -0.101669 0.017785 0.385806 -0.0984968 0.0196007 0.293328 -0.0913562 0.0211795 0.204702 -0.0803116 0.0221982 0.127052 -0.0656058 0.0225604 0.0649181 -0.0478325 0.0223169 0.0197519 -0.0278561 0.0215942 -0.0097706 -0.0066397 0.0205422 -0.0267112 0.0149156 0.0193015 -0.0346521 0.0360757 0.0179865 -0.0368369 0.0563125 0.016681 -0.0357512 0.0752978 0.0154402 -0.0330712 0.24995 0 0.0214535 0.241805 0 0.025097 0.233071 0 0.0304538 0.223878 0 0.0382308 0.214459 0 0.0492928 0.205183 0 0.0646442 0.196596 0 0.0854367 0.189469 0 0.113105 0.184884 0 0.149812 0.184371 0 0.199509 0.190136 0 0.270181 0.205365 0 0.377817 0.234558 0 0.552349 0.283657 0 0.843795 0.359609 0 1.32279 0.468872 0 2.06443 0.614735 0 3.10486 0.79415 0 4.37538 0.995727 0 5.65141 1.20031 0 6.56992 1.38378 0 6.74008 1.5205 0 5.91093 1.58645 0 4.11824 1.56258 0 1.73874 1.43946 0 -0.598718 1.22381 0 -2.244 0.943581 0 -2.82338 0.644716 0 -2.42291 0.376067 0 -1.49398 0.169819 0 -0.541619 0.0328219 0 0.137847 -0.0470297 0 0.495146 -0.0883768 0 0.615402 -0.107478 0 0.603265 -0.114972 0 0.530948 -0.116301 0 0.43577 -0.11347 0 0.335117 -0.106817 0 0.238818 -0.0962584 0 0.15409 -0.0819371 0 0.0857121 -0.0643976 0 0.035377 -0.0444975 0 0.0018809 -0.0232191 0 -0.017915 -0.0014961 0 -0.0277791 0.0199023 0 -0.0311767 0.0404179 0 -0.0308043 0.0596985 0 -0.0285038 0.230066 0.0042347 0.0216319 0.221847 0.0054261 0.0249259 0.213082 0.0068801 0.0296836 0.203906 0.0086652 0.0364783 0.194557 0.0108674 0.0459935 0.185407 0.0135943 0.0589928 0.177001 0.0169791 0.0763258 0.170105 0.0211842 0.0990508 0.165785 0.0264013 0.128854 0.165537 0.0328449 0.169037 0.171501 0.040731 0.226586 0.186739 0.0502295 0.315821 0.215545 0.0613783 0.463809 0.263554 0.0739503 0.715952 0.337325 0.087288 1.13657 0.442957 0.100164 1.79464 0.583598 0.110783 2.72497 0.756472 0.117029 3.86913 0.950908 0.116961 5.02787 1.14869 0.109325 5.87392 1.3266 0.0938629 6.05069 1.45977 0.0713374 5.32482 1.52488 0.0434629 3.72371 1.5036 0.0129032 1.58646 1.38722 -0.0167194 -0.517373 1.18274 -0.0411195 -2.00212 0.917048 -0.0563888 -2.53347 0.633575 -0.0606855 -2.18838 0.37793 -0.0554445 -1.36707 0.180263 -0.0447574 -0.516838 0.0474311 -0.0332245 0.0969956 -0.0312634 -0.0240433 0.425945 -0.0728756 -0.0184496 0.541712 -0.09255 -0.0162041 0.535654 -0.100381 -0.0163481 0.472215 -0.101669 -0.017785 0.385806 -0.0984968 -0.0196007 0.293328 -0.0913562 -0.0211795 0.204702 -0.0803116 -0.0221982 0.127052 -0.0656058 -0.0225604 0.0649181 -0.0478325 -0.0223169 0.0197519 -0.0278561 -0.0215942 -0.0097706 -0.0066397 -0.0205422 -0.0267112 0.0149156 -0.0193015 -0.0346521 0.0360757 -0.0179865 -0.0368369 0.0563125 -0.016681 -0.0357512 0.0752978 -0.0154402 -0.0330712 0.200826 0.0082668 0.0201486 0.192632 0.0104626 0.0227951 0.18398 0.0131127 0.0265052 0.175012 0.0163263 0.0316518 0.165974 0.0202398 0.0386478 0.157239 0.0250222 0.0479057 0.149346 0.0308822 0.0598281 0.143044 0.0380749 0.074896 0.139355 0.0469034 0.0939991 0.139688 0.0577104 0.119208 0.146004 0.0708457 0.155386 0.161048 0.0865918 0.212961 0.18857 0.105028 0.311993 0.233399 0.125822 0.486317 0.301071 0.14796 0.784037 0.3967 0.169516 1.25737 0.522964 0.187613 1.93489 0.677643 0.198755 2.77841 0.851799 0.199553 3.64611 1.02972 0.187597 4.29748 1.19078 0.162084 4.4625 1.31245 0.124062 3.95752 1.37353 0.0764293 2.79469 1.35781 0.023888 1.22401 1.25842 -0.0272102 -0.331026 1.08269 -0.0696099 -1.43929 0.854599 -0.0969831 -1.85927 0.610813 -0.106497 -1.64545 0.388863 -0.100401 -1.07801 0.213785 -0.0849562 -0.471083 0.0923572 -0.0672861 -0.0172482 0.0172301 -0.052548 0.239208 -0.024693 -0.0429763 0.340482 -0.0456978 -0.0384705 0.347525 -0.0544252 -0.037692 0.306382 -0.0557739 -0.0389826 0.243947 -0.0520012 -0.04091 0.175108 -0.0439835 -0.0424902 0.109196 -0.032151 -0.0432002 0.0525559 -0.0169942 -0.0428849 0.0087722 0.0007839 -0.0416314 -0.0214038 0.0203199 -0.0396523 -0.0394819 0.0407204 -0.0371985 -0.0482305 0.061185 -0.0345033 -0.0506479 0.0810811 -0.0317552 -0.0493126 0.0999693 -0.02909 -0.0461035 0.117588 -0.0265942 -0.0422134 0.193277 0.0128239 0.016358 0.185499 0.015847 0.0184732 0.177354 0.0194449 0.0214184 0.168993 0.0237408 0.0254765 0.160663 0.0288843 0.0309515 0.152735 0.0350577 0.0381251 0.145733 0.0424819 0.0472343 0.140378 0.0514231 0.0585146 0.137632 0.0621946 0.0724113 0.138784 0.0751456 0.090084 0.145567 0.0906255 0.114455 0.160305 0.108903 0.151963 0.186047 0.130023 0.215068 0.226574 0.153582 0.32469 0.286085 0.17846 0.510355 0.368339 0.202569 0.803995 0.475204 0.222791 1.22343 0.604837 0.235259 1.74668 0.750215 0.236052 2.28894 0.898815 0.22213 2.70338 1.03379 0.19218 2.8211 1.13635 0.147136 2.52339 1.18885 0.0903592 1.81329 1.17825 0.0275585 0.843876 1.09991 -0.0336654 -0.124359 0.960889 -0.0850139 -0.829787 0.780696 -0.11964 -1.1277 0.587276 -0.134632 -1.04679 0.408432 -0.132244 -0.744026 0.263106 -0.11868 -0.398216 0.157696 -0.10115 -0.125073 0.0885007 -0.0851904 0.0404972 0.0470376 -0.0735813 0.114638 0.0245688 -0.0667073 0.128699 0.0143959 -0.0635331 0.109386 0.0122688 -0.0625295 0.0744098 0.0158241 -0.0622853 0.0348801 0.0237877 -0.0617946 -0.001994 0.0353318 -0.0605115 -0.0317301 0.0497075 -0.0582739 -0.0523142 0.0661181 -0.0551777 -0.0638875 0.0837399 -0.0514542 -0.0680565 0.101798 -0.047374 -0.0670535 0.119642 -0.0431861 -0.063032 0.136782 -0.0390879 -0.0576744 0.152895 -0.0352169 -0.0520816 0.167807 -0.0316555 -0.0468546 0.204117 0.0181027 0.0122869 0.197174 0.0218077 0.0140178 0.189976 0.0261589 0.0164567 0.182677 0.0312774 0.0198674 0.175524 0.0373049 0.0245454 0.168878 0.0444077 0.0307847 0.163245 0.0527792 0.0388493 0.159303 0.0626431 0.0489848 0.157946 0.0742504 0.0615255 0.160329 0.087865 0.0771777 0.167939 0.103727 0.0976017 0.182666 0.121975 0.126359 0.206852 0.14252 0.170187 0.243241 0.164855 0.240137 0.294702 0.187841 0.351382 0.363617 0.209504 0.519774 0.450897 0.226993 0.753326 0.554767 0.236799 1.03932 0.669754 0.235313 1.33289 0.786361 0.219629 1.55713 0.891794 0.188387 1.62329 0.971728 0.142411 1.46825 1.01283 0.085002 1.09249 1.00567 0.0218216 0.574997 0.94758 -0.0397802 0.049808 0.844558 -0.092129 -0.349591 0.711002 -0.129192 -0.548435 0.566414 -0.148447 -0.555793 0.429853 -0.151579 -0.442444 0.314787 -0.143437 -0.29246 0.226909 -0.129858 -0.164476 0.165306 -0.115654 -0.0812688 0.125401 -0.103639 -0.0404417 0.101728 -0.0947142 -0.0296412 0.0895805 -0.0884935 -0.0362354 0.0855545 -0.0840207 -0.0506092 0.0873989 -0.0802961 -0.0661827 0.0936274 -0.0765652 -0.0787792 0.103155 -0.0724067 -0.0862375 0.115071 -0.0676969 -0.0881095 0.128547 -0.0625185 -0.08522 0.142833 -0.0570624 -0.0790594 0.15729 -0.0515485 -0.0712224 0.171416 -0.046175 -0.0630176 0.184856 -0.0410932 -0.0553108 0.197392 -0.0364019 -0.0485433 0.20892 -0.0321527 -0.0428423 0.221397 0.0234885 0.0092031 0.215545 0.0276922 0.010613 0.209565 0.0325706 0.0126178 0.203613 0.038233 0.0154607 0.197929 0.044802 0.0194295 0.192856 0.0524133 0.0248328 0.188863 0.0612143 0.0319729 0.186574 0.0713618 0.041137 0.186789 0.0830131 0.0526384 0.190511 0.0963084 0.066943 0.198974 0.111333 0.0849549 0.213658 0.128055 0.108458 0.236282 0.14622 0.140678 0.268707 0.165217 0.186697 0.312708 0.183927 0.253185 0.369544 0.200603 0.346642 0.439319 0.212862 0.469483 0.520239 0.21787 0.614451 0.608 0.212767 0.759898 0.695603 0.195289 0.870168 0.773864 0.164451 0.904712 0.832666 0.121114 0.834651 0.8628 0.0682435 0.659555 0.858076 0.0107434 0.413777 0.817171 -0.0452445 0.155909 0.744591 -0.0935526 -0.0551668 0.650084 -0.129467 -0.184432 0.546361 -0.150932 -0.230965 0.445828 -0.158892 -0.219634 0.357722 -0.15656 -0.182953 0.286806 -0.148029 -0.145822 0.233789 -0.136961 -0.12019 0.19677 -0.125836 -0.107655 0.172772 -0.115851 -0.104695 0.158809 -0.107236 -0.106609 0.152385 -0.0996832 -0.109406 0.151584 -0.0927285 -0.110368 0.154951 -0.0859782 -0.108084 0.161343 -0.0792074 -0.102303 0.169817 -0.0723612 -0.0936562 0.179581 -0.0655067 -0.0832609 0.189975 -0.0587739 -0.072326 0.20048 -0.0523045 -0.061858 0.210711 -0.0462199 -0.0525118 0.220413 -0.0406055 -0.044588 0.229437 -0.035508 -0.0381114 0.237718 -0.0309407 -0.0329372 0.238438 0.0282283 0.0072429 0.233767 0.0327046 0.0083606 0.229097 0.0378405 0.0099437 0.224582 0.0437272 0.0121969 0.220446 0.0504615 0.0153719 0.217002 0.058142 0.0197519 0.214668 0.066865 0.0256307 0.213989 0.0767162 0.0332933 0.21565 0.0877588 0.0430186 0.22048 0.100013 0.0551195 0.229459 0.113424 0.0700573 0.243701 0.127809 0.0886205 0.264402 0.142789 0.112143 0.292747 0.157696 0.142628 0.329719 0.17149 0.182555 0.375804 0.182702 0.234079 0.430602 0.189463 0.297415 0.492397 0.189667 0.368688 0.557841 0.181285 0.438256 0.621912 0.162814 0.491058 0.678297 0.133764 0.510263 0.720253 0.0950545 0.483689 0.741831 0.0491715 0.410212 0.739222 -2.61e-05 0.302216 0.71183 -0.0478921 0.181821 0.6627 -0.0898865 0.0722495 0.598005 -0.122556 -0.0109114 0.525655 -0.14425 -0.0637568 0.45349 -0.155286 -0.0919231 0.387713 -0.157521 -0.104963 0.332092 -0.153553 -0.111197 0.288018 -0.145926 -0.115372 0.255125 -0.136617 -0.11891 0.232064 -0.126867 -0.121324 0.217138 -0.117282 -0.121547 0.208683 -0.108049 -0.118736 0.205231 -0.0991509 -0.112621 0.205542 -0.0905236 -0.103544 0.208582 -0.0821366 -0.0923261 0.213491 -0.0740139 -0.0800378 0.219568 -0.0662214 -0.0677447 0.226252 -0.0588419 -0.056304 0.233122 -0.051952 -0.0462658 0.239877 -0.0456081 -0.0378676 0.246323 -0.0398399 -0.0310964 0.252349 -0.0346516 -0.0257808 0.257903 -0.0300268 -0.0216753 0.252534 0.0318324 0.0061239 0.248997 0.0363494 0.0069708 0.245576 0.0414719 0.0081491 0.242416 0.0472693 0.0098131 0.239718 0.0538091 0.0121582 0.237755 0.0611526 0.015412 0.236883 0.0693472 0.0198181 0.237553 0.0784165 0.0256182 0.24032 0.0883466 0.0330361 0.245834 0.099067 0.0422782 0.254834 0.110423 0.0535626 0.268113 0.122141 0.0671801 0.286465 0.133781 0.0835654 0.310588 0.14469 0.103333 0.340948 0.153962 0.127181 0.377583 0.160428 0.155574 0.419872 0.162705 0.188148 0.466313 0.15933 0.222955 0.514383 0.148988 0.255935 0.560577 0.130814 0.281081 0.600698 0.104705 0.291751 0.630426 0.0715549 0.28289 0.646066 0.0333177 0.253248 0.645337 -0.0071659 0.206385 0.627955 -0.0465913 0.149647 0.595813 -0.081779 0.0915449 0.552638 -0.110269 0.0389186 0.503222 -0.130737 -0.0046366 0.452439 -0.143099 -0.0386118 0.404396 -0.148285 -0.0642566 0.361932 -0.147815 -0.0831586 0.326538 -0.143347 -0.0964504 0.29857 -0.136344 -0.10468 0.277618 -0.127913 -0.108095 0.262842 -0.118794 -0.106966 0.253237 -0.10944 -0.101803 0.247788 -0.100113 -0.0934106 0.245554 -0.0909767 -0.0828213 0.245705 -0.0821447 -0.0711493 0.247536 -0.0737113 -0.0594253 0.250466 -0.0657556 -0.048466 0.254043 -0.0583395 -0.0388035 0.257926 -0.0515041 -0.0306872 0.261875 -0.0452684 -0.0241348 0.265732 -0.0396304 -0.0190078 0.269404 -0.0345711 -0.015086 0.272843 -0.0300593 -0.012128 0.263172 0.0341237 0.0055189 0.260638 0.0384838 0.0061272 0.25831 0.0433681 0.0069473 0.256318 0.0488226 0.0080838 0.254837 0.0548869 0.0096725 0.254096 0.0615881 0.011876 0.254382 0.0689331 0.0148727 0.256053 0.0768986 0.0188425 0.259532 0.085418 0.0239501 0.265303 0.0943652 0.0303289 0.273891 0.103535 0.0380788 0.285831 0.11262 0.0472759 0.301616 0.121186 0.0579908 0.32162 0.128651 0.0702981 0.346004 0.134274 0.0842419 0.374586 0.137173 0.099731 0.406725 0.136374 0.116346 0.441204 0.130922 0.133101 0.476192 0.12003 0.148292 0.509307 0.103273 0.159556 0.537829 0.0807655 0.164298 0.559048 0.0532916 0.160407 0.570709 0.0223118 0.146991 0.571441 -0.0101721 0.124814 0.561072 -0.0418918 0.0961346 0.540705 -0.0706699 0.0640309 0.512524 -0.0947723 0.0315814 0.479382 -0.113151 0.0012401 0.444282 -0.12552 -0.0253854 0.409908 -0.132254 -0.0473822 0.37831 -0.134177 -0.0643146 0.350792 -0.132315 -0.0760367 0.327958 -0.127691 -0.0826364 0.30986 -0.121192 -0.0844521 0.296178 -0.113528 -0.0820841 0.286373 -0.105226 -0.0763712 0.279814 -0.096671 -0.0683093 0.275857 -0.0881387 -0.0589324 0.2739 -0.0798277 -0.0491921 0.273413 -0.0718794 -0.0398554 0.273956 -0.0643916 -0.0314528 0.275174 -0.0574258 -0.024271 0.276802 -0.0510137 -0.018391 0.278647 -0.0451631 -0.0137436 0.280577 -0.0398628 -0.0101723 0.282508 -0.0350891 -0.007484 0.284388 -0.0308091 -0.0054875 0.270719 0.0351696 0.0051733 0.269013 0.0392301 0.0055826 0.267572 0.0437202 0.0061098 0.266511 0.0486644 0.0068182 0.265975 0.0540778 0.0077927 0.266149 0.0599601 0.009137 0.267258 0.0662888 0.0109678 0.26957 0.07301 0.013405 0.273394 0.0800283 0.0165584 0.27907 0.0871942 0.0205122 0.286953 0.0942914 0.0253127 0.29738 0.101024 0.0309625 0.310635 0.107006 0.0374188 0.32689 0.111755 0.0445969 0.34614 0.1147 0.0523579 0.368136 0.115205 0.0604877 0.392309 0.112616 0.0686421 0.417734 0.106337 0.0762864 0.443123 0.0959316 0.0826614 0.466892 0.0812341 0.0868086 0.487301 0.0624502 0.0877049 0.502665 0.0402147 0.0844865 0.511606 0.0155812 0.0767008 0.513287 -0.0100726 0.064485 0.507579 -0.0352133 0.0485894 0.495092 -0.0583642 0.030242 0.47708 -0.078307 0.0109118 0.455228 -0.0942289 -0.0079381 0.43137 -0.105781 -0.025029 0.407237 -0.113042 -0.0393591 0.384258 -0.116421 -0.0502578 0.363457 -0.116522 -0.057389 0.345442 -0.114026 -0.0607514 0.330456 -0.109595 -0.0606505 0.318457 -0.103816 -0.0576433 0.309206 -0.0971822 -0.0524561 0.302356 -0.0900867 -0.0458854 0.297509 -0.0828335 -0.0386946 0.29427 -0.0756499 -0.0315322 0.292273 -0.0686997 -0.0248797 0.291202 -0.0620943 -0.0190366 0.290801 -0.0559035 -0.0141356 0.290865 -0.0501644 -0.01018 0.291244 -0.0448895 -0.0070868 0.291828 -0.0400734 -0.0047284 0.29254 -0.0356989 -0.0029635 0.293328 -0.0317413 -0.0016594 0.276098 0.0351731 0.0049112 0.275043 0.0388499 0.0051659 0.274283 0.0428609 0.0054727 0.273918 0.0472131 0.0058657 0.274065 0.0519024 0.0063922 0.274869 0.0569092 0.0071119 0.276498 0.0621924 0.008093 0.279146 0.0676825 0.0094073 0.283031 0.0732737 0.0111216 0.288379 0.0788164 0.0132859 0.295415 0.084109 0.0159228 0.304339 0.0888925 0.0190187 0.315295 0.0928477 0.0225163 0.328339 0.0955985 0.0263162 0.34339 0.0967242 0.0302721 0.360199 0.0957829 0.0341916 0.378308 0.0923499 0.0378286 0.397042 0.0860694 0.0408759 0.415514 0.0767173 0.042967 0.432685 0.0642651 0.0436922 0.447447 0.0489312 0.0426479 0.458752 0.0312056 0.0395148 0.46575 0.0118342 0.0341324 0.467921 -0.0082437 0.0265861 0.465156 -0.0279964 0.0172234 0.45778 -0.0464218 0.0066319 0.446506 -0.062667 -0.004439 0.432321 -0.0761167 -0.015165 0.416341 -0.0864372 -0.0247801 0.399667 -0.0935713 -0.0326391 0.383265 -0.0976935 -0.0382994 0.36789 -0.0991428 -0.0415564 0.354058 -0.0983512 -0.0424441 0.342053 -0.0957817 -0.0412134 0.331963 -0.0918817 -0.0382743 0.323727 -0.0870541 -0.0341314 0.317184 -0.0816426 -0.0293076 0.312118 -0.0759276 -0.0242778 0.308292 -0.0701279 -0.0194252 0.305474 -0.0644072 -0.015016 0.303456 -0.0588817 -0.0112002 0.302057 -0.0536288 -0.0080291 0.301131 -0.0486948 -0.0054806 0.300563 -0.0441028 -0.0034876 0.300265 -0.0398591 -0.001962 0.300168 -0.0359582 -0.0008118 0.300223 -0.0323873 4.64e-05 0.280131 0.0343878 0.0046482 0.279566 0.0376457 0.004789 0.279306 0.0411503 0.0049406 0.279432 0.0448955 0.0051185 0.280038 0.0488644 0.0053458 0.281233 0.0530255 0.0056527 0.283141 0.0573284 0.0060749 0.285898 0.0616989 0.0066504 0.289649 0.0660339 0.0074158 0.294539 0.0701969 0.0083985 0.300702 0.074014 0.0096094 0.308246 0.0772725 0.0110367 0.31723 0.0797222 0.0126383 0.327646 0.0810823 0.0143425 0.339389 0.0810535 0.016045 0.35224 0.0793382 0.0176151 0.365849 0.0756681 0.0188953 0.379733 0.0698385 0.0197105 0.39329 0.0617463 0.0198777 0.405839 0.0514247 0.0192179 0.416674 0.0390702 0.0175782 0.425137 0.0250502 0.0148631 0.430698 0.0098887 0.0110567 0.433024 -0.0057736 0.0062564 0.432026 -0.0212393 0.0006825 0.427872 -0.0358267 -0.005343 0.420965 -0.048939 -0.0114131 0.41188 -0.0601194 -0.0170932 0.401295 -0.0690833 -0.0219759 0.389904 -0.0757233 -0.0257279 0.378346 -0.0800914 -0.0281356 0.367156 -0.0823652 -0.0291252 0.356735 -0.0828072 -0.028763 0.347345 -0.0817249 -0.0272347 0.339119 -0.0794367 -0.0248102 0.332088 -0.0762468 -0.0217978 0.326204 -0.0724283 -0.0185025 0.321367 -0.0682145 -0.0151899 0.317453 -0.0637959 -0.0120648 0.314329 -0.0593214 -0.0092615 0.311864 -0.0549025 -0.0068488 0.309942 -0.0506187 -0.0048417 0.308461 -0.0465233 -0.0032175 0.307339 -0.042649 -0.0019309 0.306505 -0.0390136 -0.0009278 0.305904 -0.0356235 -0.0001535 0.305493 -0.0324774 0.0004407 0.28348 0.0330521 0.0043519 0.283276 0.0358912 0.0044133 0.28337 0.0389022 0.0044627 0.283826 0.0420705 0.0045048 0.284719 0.0453716 0.0045489 0.286127 0.0487682 0.0046079 0.288141 0.0522076 0.0046978 0.290853 0.0556182 0.0048362 0.294356 0.0589068 0.0050408 0.29874 0.061956 0.0053248 0.304076 0.0646232 0.0056931 0.310416 0.0667411 0.0061391 0.317771 0.0681211 0.0066374 0.326101 0.0685596 0.0071472 0.335301 0.0678494 0.0076074 0.345191 0.0657945 0.0079424 0.355508 0.0622294 0.0080638 0.365912 0.0570412 0.0078804 0.375995 0.0501916 0.0073034 0.385308 0.0417371 0.006258 0.393398 0.0318406 0.0046945 0.399846 0.0207735 0.0026038 0.404316 0.0089042 1.49e-05 0.40659 -0.0033278 -0.0029795 0.406598 -0.015448 -0.0062367 0.404424 -0.026989 -0.0095688 0.400291 -0.0375331 -0.0127608 0.39454 -0.0467462 -0.0155856 0.38758 -0.0543999 -0.0178541 0.379847 -0.0603793 -0.0194144 0.371759 -0.0646768 -0.020186 0.363687 -0.0673757 -0.0201641 0.355928 -0.0686273 -0.0194165 0.348698 -0.0686264 -0.0180683 0.342135 -0.0675884 -0.0162814 0.336307 -0.0657299 -0.0142304 0.331227 -0.0632546 -0.0120811 0.326867 -0.0603443 -0.0099712 0.323172 -0.057154 -0.0080043 0.320074 -0.0538106 -0.0062445 0.317501 -0.050414 -0.0047218 0.315381 -0.0470403 -0.0034393 0.313648 -0.043745 -0.002381 0.312244 -0.0405669 -0.0015201 0.311119 -0.0375317 -0.0008268 0.310228 -0.0346549 -0.0002706 0.309536 -0.0319447 0.0001748 0.286454 0.0313662 0.0040308 0.286508 0.0338088 0.004039 0.286841 0.0363628 0.004024 0.287506 0.0390087 0.0039856 0.288556 0.0417185 0.0039256 0.290053 0.0444537 0.0038482 0.292056 0.0471637 0.0037586 0.294628 0.0497837 0.0036633 0.297827 0.0522334 0.0035697 0.301703 0.0544159 0.0034829 0.306293 0.0562182 0.0034049 0.311611 0.0575125 0.0033329 0.317645 0.05816 0.0032539 0.324343 0.0580168 0.0031489 0.331611 0.056942 0.0029874 0.339305 0.0548092 0.002734 0.34723 0.0515187 0.0023457 0.355145 0.0470116 0.0017814 0.362773 0.041283 0.001003 0.369814 0.0343922 -1.31e-05 0.375972 0.026469 -0.0012773 0.380977 0.0177126 -0.0027749 0.38461 0.0083828 -0.0044684 0.386728 -0.0012163 -0.0062921 0.387273 -0.0107578 -0.0081573 0.386286 -0.0199194 -0.009959 0.383893 -0.0284073 -0.011584 0.380293 -0.0359781 -0.012926 0.375735 -0.0424546 -0.0138985 0.370496 -0.0477319 -0.0144416 0.364848 -0.0517766 -0.0145365 0.359044 -0.0546191 -0.0141982 0.353299 -0.0563411 -0.0134812 0.347783 -0.0570604 -0.0124614 0.342619 -0.0569167 -0.011232 0.337885 -0.0560579 -0.0098865 0.333621 -0.0546293 -0.0085112 0.329836 -0.0527663 -0.0071754 0.326517 -0.0505893 -0.0059304 0.323637 -0.048201 -0.0048069 0.32116 -0.0456867 -0.0038186 0.319048 -0.0431147 -0.0029662 0.317259 -0.0405385 -0.002241 0.315756 -0.0379984 -0.0016292 0.314504 -0.0355242 -0.0011158 0.313469 -0.0331371 -0.000685 0.312624 -0.0308516 -0.0003236 0.289227 0.0294808 0.0036974 0.289459 0.0315619 0.0036714 0.289948 0.0337075 0.0036182 0.290731 0.0358959 0.0035356 0.291851 0.0380988 0.0034224 0.29335 0.0402793 0.0032784 0.295269 0.0423915 0.0031044 0.29765 0.0443792 0.0029012 0.300526 0.0461754 0.0026715 0.303923 0.0477024 0.0024163 0.307855 0.0488725 0.0021365 0.31232 0.0495901 0.0018317 0.31729 0.0497549 0.0014962 0.322716 0.0492664 0.0011234 0.328516 0.0480305 0.0007009 0.334576 0.0459665 0.0002159 0.340753 0.0430161 -0.000348 0.346875 0.0391515 -0.001005 0.35275 0.0343834 -0.0017655 0.358176 0.0287667 -0.0026342 0.362956 0.0224022 -0.0036035 0.366911 0.0154362 -0.0046541 0.369896 0.0080532 -0.0057604 0.371814 0.000466 -0.0068749 0.37262 -0.0070986 -0.00795 0.372331 -0.0144152 -0.0089272 0.371017 -0.0212758 -0.0097553 0.368798 -0.0275039 -0.0103795 0.365827 -0.0329635 -0.0107701 0.362278 -0.0375656 -0.0109056 0.358331 -0.0412684 -0.0107862 0.354158 -0.0440738 -0.0104304 0.349914 -0.0460212 -0.0098738 0.345727 -0.0471781 -0.0091614 0.3417 -0.0476316 -0.0083438 0.337907 -0.0474791 -0.00747 0.334395 -0.0468212 -0.0065846 0.331192 -0.0457552 -0.0057228 0.328306 -0.0443714 -0.0049107 0.325734 -0.0427505 -0.0041641 0.323464 -0.040962 -0.0034903 0.321476 -0.0390646 -0.0028908 0.319749 -0.0371066 -0.0023624 0.318259 -0.0351266 -0.0018986 0.316985 -0.0331553 -0.0014933 0.315902 -0.0312161 -0.0011388 0.31499 -0.0293269 -0.0008291 0.291807 0.0275082 0.0033698 0.292157 0.0292682 0.0033222 0.292736 0.0310574 0.0032473 0.293574 0.0328544 0.0031424 0.294701 0.0346322 0.0030052 0.296148 0.0363572 0.002834 0.297942 0.0379893 0.0026279 0.300107 0.0394812 0.0023856 0.302664 0.0407783 0.0021077 0.305623 0.0418194 0.0017938 0.308985 0.0425377 0.0014443 0.312738 0.0428623 0.0010602 0.316852 0.0427216 0.0006397 0.321281 0.0420463 0.0001824 0.325957 0.0407738 -0.0003145 0.330792 0.038854 -0.0008521 0.335678 0.0362537 -0.0014343 0.340493 0.0329627 -0.002062 0.345101 0.028998 -0.0027338 0.349363 0.0244061 -0.0034437 0.353144 0.0192652 -0.0041837 0.356325 0.0136826 -0.0049344 0.358805 0.0077905 -0.0056792 0.360518 0.0017395 -0.0063922 0.361428 -0.0043105 -0.0070432 0.361541 -0.0102006 -0.0076055 0.360896 -0.0157819 -0.008052 0.359565 -0.0209251 -0.00836 0.357643 -0.0255267 -0.0085192 0.355242 -0.0295134 -0.0085237 0.352481 -0.0328431 -0.0083789 0.349478 -0.0355041 -0.0080989 0.346343 -0.0375107 -0.0077056 0.343174 -0.0388991 -0.0072235 0.340052 -0.0397215 -0.0066817 0.33704 -0.0400402 -0.006106 0.334186 -0.0399228 -0.0055201 0.331522 -0.0394378 -0.0049419 0.329068 -0.0386513 -0.0043868 0.326832 -0.0376246 -0.0038635 0.324815 -0.0364128 -0.0033773 0.323011 -0.0350644 -0.0029304 0.321411 -0.0336209 -0.0025231 0.320002 -0.0321173 -0.0021528 0.31877 -0.0305826 -0.0018178 0.317701 -0.0290402 -0.0015152 0.31678 -0.0275091 -0.0012424 0.294205 0.0255254 0.0030562 0.294627 0.0270054 0.0029958 0.295251 0.0284895 0.0029099 0.2961 0.0299575 0.0027959 0.297194 0.0313846 0.0026515 0.298556 0.0327415 0.0024748 0.300202 0.0339941 0.0022646 0.302148 0.0351032 0.0020189 0.304403 0.0360253 0.0017379 0.306969 0.0367127 0.0014211 0.309841 0.0371148 0.0010685 0.313002 0.0371799 0.0006819 0.316424 0.0368568 0.0002616 0.320066 0.036098 -0.0001903 0.323873 0.0348623 -0.000673 0.327775 0.0331188 -0.001183 0.331693 0.0308498 -0.0017185 0.335537 0.0280543 -0.002275 0.33921 0.0247505 -0.0028467 0.342615 0.0209777 -0.0034274 0.345657 0.0167955 -0.0040054 0.348254 0.0122836 -0.0045691 0.350336 0.0075377 -0.0051063 0.351854 0.0026657 -0.0055994 0.352784 -0.0022186 -0.006033 0.353122 -0.007001 -0.0063933 0.352891 -0.0115742 -0.0066683 0.352133 -0.0158427 -0.0068475 0.350911 -0.0197276 -0.0069286 0.349295 -0.0231697 -0.0069114 0.347367 -0.0261305 -0.0068004 0.345207 -0.0285919 -0.0066054 0.342895 -0.0305547 -0.0063399 0.340501 -0.0320358 -0.0060176 0.338091 -0.0330647 -0.0056546 0.335716 -0.0336801 -0.0052653 0.333419 -0.0339263 -0.004863 0.331231 -0.0338506 -0.0044585 0.329176 -0.0335002 -0.0040608 0.327268 -0.0329209 -0.0036758 0.325514 -0.0321552 -0.003308 0.323917 -0.0312421 -0.0029601 0.322474 -0.0302161 -0.0026338 0.32118 -0.0291074 -0.0023289 0.320029 -0.027942 -0.0020455 0.319012 -0.0267419 -0.0017832 0.318119 -0.0255255 -0.0015413 0.368287 -0.0302713 0.0047226 0.368718 -0.0320492 0.0046345 0.369386 -0.0338371 0.0045073 0.370318 -0.0356117 0.0043369 0.37154 -0.0373447 0.0041197 0.373078 -0.0390021 0.0038522 0.374955 -0.0405445 0.0035323 0.377188 -0.0419264 0.0031564 0.379791 -0.0430968 0.0027245 0.382769 -0.0440001 0.0022353 0.386117 -0.0445767 0.0016885 0.389818 -0.0447652 0.0010869 0.393843 -0.0445048 0.000431 0.398144 -0.043738 -0.0002752 0.402661 -0.0424144 -0.0010293 0.407316 -0.0404948 -0.0018246 0.412015 -0.0379551 -0.0026566 0.416653 -0.0347902 -0.0035163 0.421119 -0.031017 -0.0043936 0.425295 -0.0266768 -0.0052771 0.429072 -0.0218351 -0.0061487 0.432346 -0.016581 -0.0069904 0.435032 -0.0110233 -0.0077848 0.437067 -0.0052859 -0.0085071 0.438416 0.0004989 -0.0091365 0.439068 0.0061972 -0.0096549 0.439043 0.0116814 -0.010047 0.438387 0.0168367 -0.0102997 0.437163 0.0215664 -0.0104114 0.435455 0.0257961 -0.0103826 0.433352 0.0294749 -0.0102204 0.430949 0.0325762 -0.0099387 0.428337 0.0350952 -0.0095561 0.425602 0.0370466 -0.0090915 0.42282 0.0384606 -0.0085668 0.420055 0.0393789 -0.0080021 0.41736 0.0398508 -0.0074159 0.414775 0.0399297 -0.0068231 0.41233 0.0396699 -0.0062371 0.410044 0.0391246 -0.0056663 0.40793 0.0383437 -0.005118 0.405992 0.0373735 -0.0045965 0.404231 0.0362551 -0.0041048 0.402642 0.0350251 -0.0036433 0.401218 0.033715 -0.0032127 0.399951 0.032352 -0.0028127 0.398831 0.0309588 -0.0024427 0.365413 -0.0325754 0.0052001 0.365749 -0.0346828 0.0051315 0.366353 -0.0368304 0.0050208 0.36726 -0.0389937 0.0048633 0.368507 -0.0411419 0.004655 0.37013 -0.0432366 0.0043925 0.372164 -0.0452315 0.0040735 0.374638 -0.0470718 0.0036948 0.377579 -0.0486944 0.0032565 0.381001 -0.0500279 0.002757 0.384909 -0.0509939 0.0021962 0.389291 -0.0515093 0.0015757 0.394117 -0.051489 0.0008936 0.399335 -0.05085 0.0001507 0.404871 -0.0495167 -0.0006542 0.410623 -0.0474266 -0.0015193 0.41647 -0.0445365 -0.0024461 0.422268 -0.0408292 -0.003431 0.427859 -0.036318 -0.0044672 0.433081 -0.0310514 -0.0055432 0.437771 -0.0251141 -0.0066432 0.441784 -0.0186255 -0.0077391 0.444998 -0.0117354 -0.0088061 0.447324 -0.0046164 -0.0098099 0.448715 0.0025461 -0.0107105 0.449166 0.0095658 -0.0114747 0.448714 0.0162658 -0.012069 0.447435 0.0224899 -0.0124657 0.445432 0.0281107 -0.0126553 0.442833 0.0330348 -0.0126318 0.439774 0.0372049 -0.0124042 0.436392 0.0405986 -0.011993 0.432815 0.0432252 -0.0114272 0.429161 0.0451202 -0.0107397 0.425528 0.0463388 -0.0099688 0.421994 0.0469497 -0.0091489 0.41862 0.0470291 -0.0083114 0.415448 0.0466552 -0.0074806 0.412504 0.0459047 -0.0066776 0.409804 0.0448494 -0.005915 0.407351 0.0435548 -0.005201 0.405143 0.042079 -0.0045396 0.40317 0.040472 -0.0039322 0.401419 0.0387768 -0.0033762 0.399878 0.037029 -0.0028702 0.398529 0.0352581 -0.0024105 0.397356 0.0334879 -0.0019943 0.362343 -0.0348555 0.0056953 0.36253 -0.0373396 0.0056587 0.363014 -0.0399058 0.0055791 0.363843 -0.0425299 0.0054523 0.365065 -0.0451796 0.0052747 0.366732 -0.0478131 0.0050444 0.368894 -0.0503777 0.0047606 0.371601 -0.052809 0.0044221 0.374895 -0.0550295 0.0040304 0.37881 -0.0569493 0.0035856 0.383366 -0.0584663 0.0030873 0.388564 -0.0594687 0.0025351 0.394377 -0.0598383 0.0019225 0.400753 -0.0594559 0.0012431 0.407601 -0.0582082 0.0004842 0.414793 -0.0559967 -0.0003654 0.422166 -0.0527475 -0.001321 0.429521 -0.0484207 -0.0023936 0.436635 -0.0430203 -0.0035891 0.44327 -0.0366011 -0.0049055 0.449192 -0.0292715 -0.0063263 0.454186 -0.0211932 -0.00782 0.458071 -0.0125742 -0.0093508 0.460723 -0.0036578 -0.0108547 0.462076 0.0052936 -0.0122721 0.462137 0.0140157 -0.0135303 0.460975 0.0222614 -0.014569 0.458717 0.0298166 -0.0153229 0.455533 0.0365131 -0.0157609 0.451622 0.0422349 -0.0158601 0.44719 0.0469212 -0.0156255 0.442439 0.0505623 -0.0150836 0.437552 0.053193 -0.0142814 0.432684 0.0548834 -0.0132772 0.42796 0.055728 -0.0121356 0.423474 0.0558355 -0.0109189 0.419289 0.0553203 -0.0096846 0.415442 0.0542951 -0.008478 0.411951 0.0528655 -0.0073334 0.408816 0.0511271 -0.0062723 0.406027 0.0491632 -0.0053057 0.403566 0.047045 -0.0044368 0.401411 0.0448316 -0.003663 0.399536 0.0425712 -0.002977 0.397916 0.0403023 -0.0023718 0.396526 0.0380551 -0.0018382 0.395343 0.0358527 -0.0013685 0.359069 -0.0370188 0.0061936 0.359034 -0.0399255 0.0062064 0.359322 -0.0429699 0.00618 0.359996 -0.0461304 0.0061118 0.361118 -0.0493758 0.0060018 0.362762 -0.0526628 0.005852 0.365 -0.0559337 0.0056664 0.367906 -0.0591148 0.0054495 0.371553 -0.0621139 0.0052078 0.376002 -0.0648194 0.0049449 0.381301 -0.0671006 0.0046616 0.387474 -0.0688089 0.0043535 0.394512 -0.0697818 0.0040051 0.402361 -0.0698498 0.003595 0.41092 -0.0688453 0.0030897 0.420028 -0.0666153 0.0024509 0.429463 -0.0630361 0.0016333 0.438948 -0.0580293 0.0005962 0.448162 -0.0515772 -0.0006968 0.456754 -0.0437357 -0.0022632 0.464373 -0.0346421 -0.0041033 0.470693 -0.0245149 -0.0061882 0.475445 -0.0136453 -0.0084619 0.478444 -0.00238 -0.010838 0.479606 0.0089041 -0.0132048 0.478956 0.0198293 -0.0154352 0.476622 0.0300459 -0.0173961 0.472821 0.0392582 -0.0189645 0.467833 0.0472436 -0.0200452 0.461973 0.0538622 -0.0205733 0.455557 0.0590567 -0.0205345 0.448884 0.0628452 -0.0199538 0.44221 0.065308 -0.0189023 0.435743 0.0665705 -0.0174756 0.429636 0.0667869 -0.0157895 0.423991 0.0661244 -0.0139598 0.418865 0.0647503 -0.0120932 0.414277 0.0628224 -0.0102759 0.410221 0.0604829 -0.0085728 0.406671 0.0578552 -0.0070234 0.403592 0.0550427 -0.0056469 0.40094 0.0521294 -0.0044459 0.398672 0.0491822 -0.0034113 0.396745 0.0462524 -0.0025269 0.39512 0.0433788 -0.0017753 0.39376 0.0405896 -0.001137 0.392631 0.0379048 -0.0005955 0.355585 -0.0389307 0.0066652 0.355234 -0.0422992 0.0067527 0.355227 -0.0458767 0.0068131 0.355638 -0.0496477 0.0068495 0.356554 -0.0535853 0.0068696 0.358072 -0.0576483 0.0068852 0.360296 -0.0617773 0.0069115 0.363337 -0.0658914 0.0069656 0.367308 -0.0698846 0.0070645 0.372317 -0.0736225 0.0072206 0.378457 -0.0769412 0.0074367 0.385794 -0.0796473 0.0077028 0.394348 -0.0815215 0.0079874 0.404085 -0.0823257 0.0082424 0.414892 -0.0818155 0.0083966 0.42657 -0.0797564 0.0083643 0.438822 -0.0759467 0.0080464 0.451257 -0.070242 0.0073444 0.463405 -0.0625813 0.0061659 0.474742 -0.0530111 0.0044389 0.484731 -0.0416996 0.0021238 0.492871 -0.0289417 -0.0007681 0.498749 -0.0151475 -0.0041839 0.502087 -0.0008152 -0.007996 0.502772 0.0135088 -0.0120261 0.50087 0.0272778 -0.0160483 0.496618 0.0399936 -0.0198129 0.490387 0.0512479 -0.0230607 0.482641 0.0607495 -0.025584 0.473882 0.0683369 -0.0272174 0.464599 0.0739738 -0.0278805 0.455233 0.0777322 -0.0275794 0.446141 0.079768 -0.0264039 0.437592 0.0802928 -0.0245081 0.429765 0.0795477 -0.0220884 0.422754 0.0777802 -0.0193553 0.416587 0.075227 -0.0165086 0.411245 0.0721025 -0.0137152 0.406674 0.068592 -0.0111015 0.402801 0.0648494 -0.0087473 0.399548 0.0609979 -0.0066914 0.396834 0.0571331 -0.0049399 0.394586 0.053326 -0.0034755 0.392737 0.049628 -0.002267 0.391228 0.0460741 -0.0012788 0.390008 0.0426873 -0.0004739 0.389034 0.0394809 0.0001803 0.351678 -0.0404126 0.0070894 0.35089 -0.0442671 0.0072849 0.350451 -0.0484181 0.0074798 0.350456 -0.0528607 0.0076885 0.351014 -0.0575771 0.0079342 0.352255 -0.0625333 0.0082482 0.354324 -0.0676738 0.0086676 0.357383 -0.0729155 0.009232 0.361607 -0.0781422 0.0099797 0.367169 -0.0831988 0.0109376 0.374235 -0.0878867 0.0121137 0.382939 -0.0919617 0.0134897 0.393363 -0.095135 0.0150112 0.40551 -0.0970804 0.0165901 0.419273 -0.0974478 0.0181006 0.43441 -0.0958855 0.019388 0.450529 -0.0920711 0.0202696 0.467079 -0.0857506 0.0205488 0.483366 -0.0767819 0.020028 0.498599 -0.0651755 0.018522 0.511946 -0.0511273 0.0158876 0.522622 -0.0350306 0.0120524 0.529979 -0.0174636 0.0070392 0.53359 0.0008517 0.0009957 0.533305 0.0191154 -0.0057959 0.529274 0.036531 -0.0129523 0.521923 0.0523846 -0.0200062 0.511891 0.0661127 -0.0264698 0.49995 0.0773435 -0.0318978 0.486905 0.0859082 -0.0359303 0.473511 0.0918256 -0.0383444 0.46041 0.0952669 -0.0390753 0.448094 0.0965106 -0.0382142 0.436895 0.0958965 -0.0359861 0.426994 0.0937858 -0.0327112 0.41845 0.0905299 -0.028753 0.411226 0.0864501 -0.0244718 0.405222 0.0818244 -0.020182 0.400302 0.0768836 -0.0161288 0.396318 0.0718112 -0.0124746 0.393123 0.0667474 -0.0093047 0.390585 0.0617943 -0.0066406 0.388585 0.0570231 -0.0044578 0.387026 0.0524799 -0.0027037 0.385826 0.0481921 -0.0013147 0.384921 0.0441728 -0.0002245 0.384255 0.0404252 0.0006265 0.346963 -0.0412297 0.0074534 0.345585 -0.0455683 0.0078001 0.344543 -0.0503056 0.0081937 0.343951 -0.0554517 0.00867 0.343946 -0.0610048 0.0092796 0.344699 -0.0669452 0.0100872 0.346407 -0.073229 0.0111668 0.349301 -0.0797796 0.0125963 0.353638 -0.0864794 0.0144474 0.359691 -0.0931596 0.0167716 0.36773 -0.0995918 0.0195874 0.378 -0.105481 0.0228693 0.390686 -0.11046 0.0265385 0.405867 -0.114097 0.0304649 0.42347 -0.115904 0.0344621 0.443224 -0.115364 0.0382911 0.464619 -0.111974 0.0416564 0.486885 -0.105304 0.0442028 0.509008 -0.0950644 0.0455249 0.529782 -0.0811816 0.0451892 0.547912 -0.0638595 0.0427911 0.562154 -0.0436121 0.0380424 0.571474 -0.0212524 0.0308409 0.575204 0.0021698 0.0213626 0.573143 0.0254765 0.0100593 0.565596 0.0474979 -0.0023717 0.553325 0.0672095 -0.0150829 0.537434 0.0838414 -0.027166 0.519203 0.0969378 -0.0377987 0.499921 0.106362 -0.0462966 0.480739 0.112254 -0.0521999 0.462578 0.114959 -0.0553086 0.446084 0.114946 -0.0556811 0.431632 0.112734 -0.0536154 0.419365 0.108839 -0.0495855 0.409242 0.103734 -0.0441743 0.401099 0.0978266 -0.0379871 0.394699 0.0914577 -0.0315776 0.389776 0.0848963 -0.0253961 0.386065 0.0783479 -0.0197592 0.383324 0.071962 -0.014849 0.381344 0.0658415 -0.0107313 0.379952 0.0600519 -0.0073846 0.37901 0.0546301 -0.0047322 0.378413 0.0495914 -0.0026712 0.378079 0.0449362 -0.0010914 0.377948 0.0406549 0.000108 0.34061 -0.0411078 0.0078106 0.338454 -0.0458874 0.0083568 0.336594 -0.0511766 0.0090263 0.335164 -0.0570062 0.009888 0.334332 -0.0633967 0.0110357 0.334315 -0.0703515 0.0125848 0.335377 -0.0778489 0.0146644 0.337835 -0.0858319 0.0174075 0.342055 -0.0941957 0.0209342 0.348442 -0.102774 0.0253329 0.357419 -0.111323 0.0306444 0.369396 -0.119508 0.0368527 0.384719 -0.12689 0.0438817 0.403608 -0.132918 0.0515983 0.426081 -0.136937 0.0597995 0.451873 -0.138212 0.068193 0.480354 -0.13598 0.0763453 0.510476 -0.129535 0.0836242 0.540772 -0.118335 0.0891765 0.569417 -0.102134 0.091967 0.594391 -0.0810942 0.0909397 0.613705 -0.0558612 0.0852612 0.625695 -0.0275651 0.0745893 0.629288 0.0022706 0.0592404 0.624209 0.0319066 0.0401864 0.61104 0.0596203 0.0188718 0.591134 0.0839399 -0.0030598 0.56638 0.103826 -0.0240344 0.5389 0.118756 -0.0427237 0.510737 0.128712 -0.0581119 0.483618 0.134071 -0.0695351 0.458819 0.135472 -0.0766723 0.43713 0.13367 -0.0795465 0.418903 0.129422 -0.0785061 0.404145 0.123417 -0.0741742 0.392617 0.116246 -0.0673674 0.383937 0.108386 -0.0589896 0.377655 0.100212 -0.0499161 0.373312 0.0920115 -0.0408989 0.370482 0.083994 -0.0325035 0.368795 0.0763074 -0.0250882 0.367943 0.0690484 -0.0188175 0.367684 0.0622735 -0.0137032 0.367836 0.0560087 -0.0096534 0.368264 0.050257 -0.0065209 0.368875 0.0450059 -0.0041387 0.369603 0.0402326 -0.0023479 0.331585 -0.0397607 0.0082963 0.328442 -0.0448824 0.009093 0.325522 -0.050623 0.010122 0.322975 -0.0570386 0.0114996 0.321008 -0.0641781 0.0133781 0.319885 -0.0720771 0.0159409 0.319947 -0.0807486 0.0193884 0.321613 -0.0901712 0.0239228 0.325385 -0.100275 0.0297258 0.331835 -0.110921 0.0369391 0.341591 -0.121881 0.0456564 0.355289 -0.132809 0.0559314 0.373521 -0.143216 0.0677938 0.396744 -0.152443 0.0812574 0.425165 -0.159649 0.0962822 0.458608 -0.163828 0.112664 0.496362 -0.163862 0.129831 0.53706 -0.158638 0.146601 0.578629 -0.147213 0.161035 0.618352 -0.129022 0.170541 0.653095 -0.104089 0.172366 0.679689 -0.0731735 0.164404 0.695425 -0.0378088 0.145983 0.698553 -0.0001768 0.118308 0.688659 0.0371703 0.0841894 0.666799 0.0716984 0.0472254 0.635328 0.101295 0.0108465 0.597457 0.124575 -0.0223718 0.556679 0.141008 -0.0508991 0.516202 0.150847 -0.0739881 0.478554 0.154911 -0.0913678 0.445409 0.154314 -0.102995 0.417613 0.150214 -0.109002 0.395337 0.143655 -0.10974 0.378277 0.135491 -0.105836 0.365844 0.126374 -0.0981865 0.357318 0.116788 -0.0878875 0.351946 0.107089 -0.0761002 0.349019 0.0975329 -0.0639127 0.347907 0.0883087 -0.052216 0.348081 0.0795488 -0.041638 0.349118 0.0713412 -0.0325274 0.350694 0.0637368 -0.0249928 0.352576 0.0567564 -0.0189649 0.3546 0.0503973 -0.0142664 0.356661 0.0446395 -0.0106728 0.358693 0.0394515 -0.0079571 0.318727 -0.0369705 0.0091865 0.314388 -0.0422679 0.0102776 0.310164 -0.0482779 0.0117395 0.306223 -0.0550834 0.0137458 0.3028 -0.062766 0.0165177 0.300214 -0.0714006 0.0203139 0.298885 -0.081047 0.025411 0.299345 -0.0917379 0.0320817 0.302248 -0.103464 0.0405752 0.308366 -0.11615 0.0511107 0.318573 -0.129627 0.0639062 0.333809 -0.14359 0.0792382 0.355012 -0.157547 0.0975163 0.38301 -0.170766 0.119317 0.418362 -0.18223 0.145275 0.461136 -0.190623 0.175734 0.510656 -0.194381 0.210097 0.565246 -0.191831 0.24602 0.622072 -0.181438 0.278865 0.677177 -0.162122 0.30195 0.725777 -0.133611 0.308065 0.762873 -0.0967079 0.291975 0.784069 -0.0534068 0.252872 0.786461 -0.0067471 0.195415 0.769345 0.0395956 0.128442 0.734509 0.0819332 0.0618747 0.685953 0.117242 0.0034107 0.629077 0.143692 -0.0432637 0.569591 0.160848 -0.0781903 0.512478 0.169497 -0.103434 0.461334 0.171213 -0.121301 0.418189 0.16784 -0.133349 0.383695 0.161082 -0.140246 0.357525 0.152284 -0.142175 0.338782 0.142382 -0.139284 0.326312 0.131972 -0.131998 0.31892 0.121421 -0.12112 0.315479 0.110958 -0.107759 0.314989 0.100746 -0.0931593 0.316593 0.0909159 -0.0785042 0.319591 0.081576 -0.0647509 0.323431 0.0728116 -0.0525376 0.327697 0.0646829 -0.0421783 0.332097 0.0572228 -0.0337132 0.336436 0.0504389 -0.0269946 0.340593 0.0443176 -0.0217717 0.344506 0.0388293 -0.017762 0.301562 -0.0326817 0.0108715 0.295872 -0.0379258 0.0122936 0.290162 -0.043944 0.0142419 0.284609 -0.0508448 0.016948 0.279475 -0.058743 0.020699 0.275128 -0.0677566 0.0258184 0.272062 -0.0780007 0.0326416 0.270922 -0.0895788 0.041492 0.272518 -0.102568 0.0526799 0.277834 -0.116998 0.0665396 0.288028 -0.132811 0.0835518 0.304409 -0.149806 0.104533 0.328378 -0.167562 0.130873 0.361313 -0.185337 0.16466 0.404353 -0.201976 0.208462 0.458071 -0.215846 0.264426 0.522035 -0.224864 0.332488 0.594346 -0.226666 0.40802 0.671279 -0.218933 0.480029 0.747226 -0.199866 0.531637 0.815079 -0.168708 0.544241 0.867135 -0.126188 0.504734 0.89639 -0.0747475 0.412679 0.898031 -0.0184218 0.283022 0.870718 0.037699 0.141751 0.817233 0.088382 0.015936 0.744133 0.129349 -0.0764766 0.660337 0.158187 -0.131499 0.575093 0.174705 -0.156618 0.496069 0.180607 -0.164039 0.42823 0.178655 -0.164359 0.373721 0.171752 -0.163612 0.332486 0.162277 -0.163532 0.303149 0.151815 -0.163345 0.283783 0.141214 -0.161482 0.272417 0.130805 -0.156646 0.267266 0.120644 -0.14827 0.266804 0.110703 -0.136579 0.269751 0.100969 -0.122425 0.275048 0.0914816 -0.107005 0.28183 0.0823242 -0.0915538 0.289416 0.0735995 -0.0770866 0.297289 0.0654045 -0.0642757 0.305083 0.0578131 -0.0534298 0.312556 0.050869 -0.0445596 0.319569 0.0445861 -0.0374817 0.326056 0.0389528 -0.031916 0.280728 -0.0271233 0.013843 0.273635 -0.0320449 0.0156248 0.266368 -0.0377571 0.0180839 0.259112 -0.0443886 0.0214966 0.252146 -0.052084 0.0261928 0.245876 -0.0610027 0.0325264 0.240861 -0.0713182 0.0408441 0.237842 -0.0832134 0.0514722 0.237771 -0.0968717 0.0647581 0.24184 -0.112455 0.0812041 0.251506 -0.130065 0.101781 0.268507 -0.149666 0.128412 0.294835 -0.170979 0.164595 0.332632 -0.193329 0.215848 0.383917 -0.215481 0.289394 0.450112 -0.235512 0.392174 0.531337 -0.250802 0.526479 0.625606 -0.25822 0.683758 0.728165 -0.254567 0.839471 0.83129 -0.237218 0.953605 0.924782 -0.204829 0.9809 0.997238 -0.157953 0.889308 1.03796 -0.099381 0.678857 1.03919 -0.0340978 0.389076 0.998317 0.0312978 0.0875722 0.919233 0.0897662 -0.157025 0.812131 0.13544 -0.303213 0.691304 0.165143 -0.349486 0.57151 0.179085 -0.325512 0.464413 0.180323 -0.270917 0.376642 0.173314 -0.216633 0.309919 0.162341 -0.177847 0.262564 0.150508 -0.156768 0.231303 0.139477 -0.148977 0.212625 0.129736 -0.148416 0.203476 0.121083 -0.14987 0.201445 0.113061 -0.149733 0.204677 0.105245 -0.146063 0.211713 0.0973808 -0.138379 0.221367 0.0893972 -0.127309 0.232651 0.0813647 -0.114117 0.24476 0.0734299 -0.100216 0.25706 0.0657589 -0.086812 0.269086 0.058498 -0.074713 0.280525 0.0517545 -0.0643131 0.291196 0.0455922 -0.0556741 0.301013 0.0400351 -0.0486477 0.259621 -0.0208756 0.0185017 0.251237 -0.025211 0.0206894 0.242532 -0.0303024 0.0236892 0.233689 -0.0362915 0.0278021 0.225 -0.0433443 0.0333681 0.216896 -0.0516545 0.0407264 0.209981 -0.0614469 0.0501823 0.205073 -0.0729794 0.0620158 0.203241 -0.0865393 0.0765987 0.205867 -0.102427 0.0947052 0.21471 -0.120912 0.118162 0.231982 -0.14215 0.150905 0.260395 -0.16604 0.2004 0.303076 -0.192022 0.278894 0.363252 -0.218839 0.403153 0.443561 -0.244334 0.590557 0.544971 -0.265401 0.849566 0.665487 -0.27822 1.16543 0.799088 -0.278831 1.48763 0.935392 -0.26395 1.73012 1.06038 -0.231818 1.79354 1.15815 -0.182863 1.60657 1.21341 -0.120071 1.16843 1.2145 -0.049018 0.566884 1.15664 0.0225804 -0.045806 1.04452 0.0860829 -0.514304 0.89289 0.13398 -0.747648 0.723578 0.162201 -0.751859 0.559409 0.171408 -0.608036 0.417782 0.166312 -0.416765 0.307238 0.153388 -0.250679 0.228132 0.138417 -0.139618 0.175825 0.12509 -0.082004 0.144058 0.114862 -0.063079 0.12713 0.107582 -0.0671185 0.120739 0.102306 -0.0819234 0.121942 0.0979397 -0.0990802 0.12875 0.0936132 -0.113221 0.139716 0.0888157 -0.121506 0.153657 0.0833749 -0.123215 0.169535 0.0773627 -0.119206 0.186432 0.0709857 -0.111187 0.203576 0.0644939 -0.101043 0.220367 0.0581199 -0.0903542 0.236379 0.0520467 -0.0801956 0.251348 0.046399 -0.0711401 0.265144 0.0412464 -0.0633792 0.246627 -0.0148039 0.0245805 0.237267 -0.0183373 0.0272643 0.227461 -0.0225414 0.0309091 0.217388 -0.0275596 0.03584 0.207344 -0.0335662 0.0424097 0.197776 -0.0407722 0.050948 0.189323 -0.0494325 0.061735 0.182857 -0.059852 0.0750479 0.179545 -0.0723865 0.0913966 0.180939 -0.0874298 0.112089 0.1891 -0.105371 0.140413 0.206752 -0.126506 0.183609 0.237417 -0.150875 0.255671 0.285385 -0.178023 0.380032 0.355336 -0.206713 0.589618 0.451369 -0.234668 0.919762 0.575412 -0.258514 1.38973 0.725301 -0.274093 1.97431 0.893301 -0.277171 2.57862 1.06583 -0.264385 3.03903 1.22465 -0.234063 3.16671 1.34922 -0.186739 2.82643 1.41957 -0.125367 2.01605 1.41974 -0.0554024 0.901171 1.34197 0.0153793 -0.226326 1.19098 0.0777812 -1.06306 0.986183 0.123314 -1.4297 0.758645 0.147174 -1.345 0.541853 0.150325 -0.984573 0.360781 0.138862 -0.560418 0.225982 0.120919 -0.216653 0.135215 0.103323 -0.0016567 0.0793765 0.0899104 0.100222 0.0481712 0.0816408 0.125862 0.0332763 0.0776295 0.108108 0.0291576 0.0762439 0.0693 0.0325722 0.075876 0.0236141 0.0416808 0.0753304 -0.0197519 0.055286 0.0739261 -0.055059 0.0723741 0.0714288 -0.0796245 0.0919367 0.0679149 -0.0934137 0.112971 0.0636313 -0.0982108 0.134553 0.0588829 -0.0966225 0.155907 0.0539593 -0.0912218 0.176455 0.0490962 -0.0840614 0.19581 0.0444624 -0.0765159 0.213761 0.0401643 -0.0693621 0.256699 -0.0095851 0.0300589 0.246882 -0.012145 0.0334156 0.236516 -0.0152327 0.038017 0.225775 -0.018975 0.0442979 0.214958 -0.0235294 0.0527456 0.204522 -0.029091 0.0638546 0.195129 -0.0358993 0.0781154 0.187698 -0.0442453 0.096115 0.183483 -0.054472 0.118913 0.184192 -0.0669639 0.148914 0.192173 -0.0821079 0.191696 0.21065 -0.10021 0.259134 0.243951 -0.121346 0.373942 0.297536 -0.14513 0.574214 0.37753 -0.170438 0.913735 0.489424 -0.195173 1.45033 0.635885 -0.216239 2.21484 0.81419 -0.229912 3.16369 1.01446 -0.232582 4.13874 1.21976 -0.221624 4.87297 1.40803 -0.195985 5.06527 1.55493 -0.156394 4.50577 1.6368 -0.105367 3.19638 1.63395 -0.0472767 1.40277 1.53538 0.0115339 -0.405745 1.34479 0.0631519 -1.73131 1.08536 0.0997769 -2.27152 0.797497 0.116711 -2.05841 0.526569 0.114877 -1.40025 0.306129 0.100463 -0.667757 0.14858 0.081616 -0.102633 0.0480843 0.0648436 0.228672 -0.0098677 0.0533984 0.36915 -0.0400545 0.0476562 0.390207 -0.053429 0.0463269 0.348299 -0.0565475 0.0475771 0.277445 -0.0526866 0.0497374 0.196833 -0.0432998 0.0516181 0.11848 -0.0291525 0.0525561 0.0505095 -0.0109648 0.0523234 -0.0024103 0.0103671 0.0509868 -0.039088 0.0338 0.0487725 -0.0611231 0.0582752 0.0459625 -0.0717168 0.0828495 0.0428276 -0.0744302 0.106777 0.0395917 -0.0723863 0.129535 0.0364199 -0.0679029 0.15081 0.0334215 -0.0624837 0.293851 -0.004939 0.031878 0.28405 -0.0063232 0.0360231 0.273603 -0.0080112 0.0418948 0.262677 -0.0100819 0.050171 0.251563 -0.0126344 0.0616686 0.240724 -0.0157925 0.077313 0.230835 -0.0197085 0.0981458 0.222846 -0.024567 0.125469 0.218075 -0.0305847 0.161322 0.218349 -0.0380013 0.209607 0.226236 -0.0470546 0.278432 0.245343 -0.0579268 0.384224 0.280621 -0.0706487 0.557752 0.338423 -0.0849563 0.850209 0.425961 -0.100119 1.33347 0.549709 -0.114802 2.08369 0.712695 -0.127082 3.13803 0.911446 -0.134721 4.42983 1.13416 -0.135669 5.7373 1.3613 -0.128577 6.69792 1.56823 -0.113062 6.91488 1.72837 -0.0897124 6.1212 1.81589 -0.0600084 4.33009 1.80865 -0.0263804 1.89845 1.69304 0.0076205 -0.546896 1.47138 0.0373753 -2.33193 1.16897 0.0580896 -3.03624 0.833395 0.0667168 -2.70013 0.519855 0.0638048 -1.75952 0.269182 0.0534084 -0.740982 0.0950795 0.0408379 0.0204374 -0.0116979 0.0301951 0.445765 -0.0703901 0.0233596 0.609342 -0.0994529 0.02036 0.618176 -0.111849 0.0202303 0.551308 -0.114812 0.0217364 0.452465 -0.111526 0.0238002 0.343723 -0.103046 0.0256701 0.238046 -0.0897219 0.0269331 0.144617 -0.0719845 0.0274467 0.0693316 -0.0505948 0.0272488 0.0142811 -0.0265897 0.0264738 -0.0218602 -0.0011037 0.0252903 -0.0426086 0.0248064 0.0238613 -0.0522075 0.0502774 0.0223223 -0.0545748 0.0746843 0.0207752 -0.0527636 0.0976335 0.0192888 -0.0488704 0.318969 0 0.0313581 0.30928 0 0.0359201 0.298897 0 0.0425092 0.287979 0 0.0519653 0.276816 0 0.0653258 0.265867 0 0.0838109 0.255812 0 0.108834 0.247612 0 0.142159 0.242606 0 0.186415 0.242668 0 0.246296 0.250449 0 0.331109 0.269704 0 0.459237 0.305618 0 0.66474 0.364886 0 1.00402 0.455125 0 1.55594 0.583159 0 2.40325 0.752106 0 3.58424 0.958139 0 5.0205 1.18866 0 6.46217 1.42318 0 7.50741 1.63616 0 7.72168 1.80033 0 6.81769 1.88913 0 4.81572 1.87961 0 2.11115 1.75715 0 -0.605587 1.52338 0 -2.58718 1.20432 0 -3.36309 0.850186 0 -2.97638 0.520136 0 -1.91682 0.25791 0 -0.778519 0.0776889 0 0.0634369 -0.0312325 0 0.525746 -0.0900091 0 0.697073 -0.118542 0 0.700021 -0.130557 0 0.623205 -0.133532 0 0.514155 -0.130601 0 0.395718 -0.122653 0 0.280844 -0.109873 0 0.178875 -0.0925704 0 0.0960144 -0.071446 0 0.0346622 -0.0475249 0 -0.0063417 -0.0219614 0 -0.0305954 0.0041512 0 -0.0425601 0.0299096 0 -0.0464179 0.0546537 0 -0.0454783 0.0779622 0 -0.0420405 0.293851 0.004939 0.031878 0.28405 0.0063232 0.0360231 0.273603 0.0080112 0.0418948 0.262677 0.0100819 0.050171 0.251563 0.0126344 0.0616686 0.240724 0.0157925 0.077313 0.230835 0.0197085 0.0981458 0.222846 0.024567 0.125469 0.218075 0.0305847 0.161322 0.218349 0.0380013 0.209607 0.226236 0.0470546 0.278432 0.245343 0.0579268 0.384224 0.280621 0.0706487 0.557752 0.338423 0.0849563 0.850209 0.425961 0.100119 1.33347 0.549709 0.114802 2.08369 0.712695 0.127082 3.13803 0.911446 0.134721 4.42983 1.13416 0.135669 5.7373 1.3613 0.128577 6.69792 1.56823 0.113062 6.91488 1.72837 0.0897124 6.1212 1.81589 0.0600084 4.33009 1.80865 0.0263804 1.89845 1.69304 -0.0076205 -0.546896 1.47138 -0.0373753 -2.33193 1.16897 -0.0580896 -3.03624 0.833395 -0.0667168 -2.70013 0.519855 -0.0638048 -1.75952 0.269182 -0.0534084 -0.740982 0.0950795 -0.0408379 0.0204374 -0.0116979 -0.0301951 0.445765 -0.0703901 -0.0233596 0.609342 -0.0994529 -0.02036 0.618176 -0.111849 -0.0202303 0.551308 -0.114812 -0.0217364 0.452465 -0.111526 -0.0238002 0.343723 -0.103046 -0.0256701 0.238046 -0.0897219 -0.0269331 0.144617 -0.0719845 -0.0274467 0.0693316 -0.0505948 -0.0272488 0.0142811 -0.0265897 -0.0264738 -0.0218602 -0.0011037 -0.0252903 -0.0426086 0.0248064 -0.0238613 -0.0522075 0.0502774 -0.0223223 -0.0545748 0.0746843 -0.0207752 -0.0527636 0.0976335 -0.0192888 -0.0488704 0.256699 0.0095851 0.0300589 0.246882 0.012145 0.0334156 0.236516 0.0152327 0.038017 0.225775 0.018975 0.0442979 0.214958 0.0235294 0.0527456 0.204522 0.029091 0.0638546 0.195129 0.0358993 0.0781154 0.187698 0.0442453 0.096115 0.183483 0.054472 0.118913 0.184192 0.0669639 0.148914 0.192173 0.0821079 0.191696 0.21065 0.10021 0.259134 0.243951 0.121346 0.373942 0.297536 0.14513 0.574214 0.37753 0.170438 0.913735 0.489424 0.195173 1.45033 0.635885 0.216239 2.21484 0.81419 0.229912 3.16369 1.01446 0.232582 4.13874 1.21976 0.221624 4.87297 1.40803 0.195985 5.06527 1.55493 0.156394 4.50577 1.6368 0.105367 3.19638 1.63395 0.0472767 1.40277 1.53538 -0.0115339 -0.405745 1.34479 -0.0631519 -1.73131 1.08536 -0.0997769 -2.27152 0.797497 -0.116711 -2.05841 0.526569 -0.114877 -1.40025 0.306129 -0.100463 -0.667757 0.14858 -0.081616 -0.102633 0.0480843 -0.0648436 0.228672 -0.0098677 -0.0533984 0.36915 -0.0400545 -0.0476562 0.390207 -0.053429 -0.0463269 0.348299 -0.0565475 -0.0475771 0.277445 -0.0526866 -0.0497374 0.196833 -0.0432998 -0.0516181 0.11848 -0.0291525 -0.0525561 0.0505095 -0.0109648 -0.0523234 -0.0024103 0.0103671 -0.0509868 -0.039088 0.0338 -0.0487725 -0.0611231 0.0582752 -0.0459625 -0.0717168 0.0828495 -0.0428276 -0.0744302 0.106777 -0.0395917 -0.0723863 0.129535 -0.0364199 -0.0679029 0.15081 -0.0334215 -0.0624837 0.246627 0.0148039 0.0245805 0.237267 0.0183373 0.0272643 0.227461 0.0225414 0.0309091 0.217388 0.0275596 0.03584 0.207344 0.0335662 0.0424097 0.197776 0.0407722 0.050948 0.189323 0.0494325 0.061735 0.182857 0.059852 0.0750479 0.179545 0.0723865 0.0913966 0.180939 0.0874298 0.112089 0.1891 0.105371 0.140413 0.206752 0.126506 0.183609 0.237417 0.150875 0.255671 0.285385 0.178023 0.380032 0.355336 0.206713 0.589618 0.451369 0.234668 0.919762 0.575412 0.258514 1.38973 0.725301 0.274093 1.97431 0.893301 0.277171 2.57862 1.06583 0.264385 3.03903 1.22465 0.234063 3.16671 1.34922 0.186739 2.82643 1.41957 0.125367 2.01605 1.41974 0.0554024 0.901171 1.34197 -0.0153793 -0.226326 1.19098 -0.0777812 -1.06306 0.986183 -0.123314 -1.4297 0.758645 -0.147174 -1.345 0.541853 -0.150325 -0.984573 0.360781 -0.138862 -0.560418 0.225982 -0.120919 -0.216653 0.135215 -0.103323 -0.0016567 0.0793765 -0.0899104 0.100222 0.0481712 -0.0816408 0.125862 0.0332763 -0.0776295 0.108108 0.0291576 -0.0762439 0.0693 0.0325722 -0.075876 0.0236141 0.0416808 -0.0753304 -0.0197519 0.055286 -0.0739261 -0.055059 0.0723741 -0.0714288 -0.0796245 0.0919367 -0.0679149 -0.0934137 0.112971 -0.0636313 -0.0982108 0.134553 -0.0588829 -0.0966225 0.155907 -0.0539593 -0.0912218 0.176455 -0.0490962 -0.0840614 0.19581 -0.0444624 -0.0765159 0.213761 -0.0401643 -0.0693621 0.259621 0.0208756 0.0185017 0.251237 0.025211 0.0206894 0.242532 0.0303024 0.0236892 0.233689 0.0362915 0.0278021 0.225 0.0433443 0.0333681 0.216896 0.0516545 0.0407264 0.209981 0.0614469 0.0501823 0.205073 0.0729794 0.0620158 0.203241 0.0865393 0.0765987 0.205867 0.102427 0.0947052 0.21471 0.120912 0.118162 0.231982 0.14215 0.150905 0.260395 0.16604 0.2004 0.303076 0.192022 0.278894 0.363252 0.218839 0.403153 0.443561 0.244334 0.590557 0.544971 0.265401 0.849566 0.665487 0.27822 1.16543 0.799088 0.278831 1.48763 0.935392 0.26395 1.73012 1.06038 0.231818 1.79354 1.15815 0.182863 1.60657 1.21341 0.120071 1.16843 1.2145 0.049018 0.566884 1.15664 -0.0225804 -0.045806 1.04452 -0.0860829 -0.514304 0.89289 -0.13398 -0.747648 0.723578 -0.162201 -0.751859 0.559409 -0.171408 -0.608036 0.417782 -0.166312 -0.416765 0.307238 -0.153388 -0.250679 0.228132 -0.138417 -0.139618 0.175825 -0.12509 -0.082004 0.144058 -0.114862 -0.063079 0.12713 -0.107582 -0.0671185 0.120739 -0.102306 -0.0819234 0.121942 -0.0979397 -0.0990802 0.12875 -0.0936132 -0.113221 0.139716 -0.0888157 -0.121506 0.153657 -0.0833749 -0.123215 0.169535 -0.0773627 -0.119206 0.186432 -0.0709857 -0.111187 0.203576 -0.0644939 -0.101043 0.220367 -0.0581199 -0.0903542 0.236379 -0.0520467 -0.0801956 0.251348 -0.046399 -0.0711401 0.265144 -0.0412464 -0.0633792 0.280728 0.0271233 0.013843 0.273635 0.0320449 0.0156248 0.266368 0.0377571 0.0180839 0.259112 0.0443886 0.0214966 0.252146 0.052084 0.0261928 0.245876 0.0610027 0.0325264 0.240861 0.0713182 0.0408441 0.237842 0.0832134 0.0514722 0.237771 0.0968717 0.0647581 0.24184 0.112455 0.0812041 0.251506 0.130065 0.101781 0.268507 0.149666 0.128412 0.294835 0.170979 0.164595 0.332632 0.193329 0.215848 0.383917 0.215481 0.289394 0.450112 0.235512 0.392174 0.531337 0.250802 0.526479 0.625606 0.25822 0.683758 0.728165 0.254567 0.839471 0.83129 0.237218 0.953605 0.924782 0.204829 0.9809 0.997238 0.157953 0.889308 1.03796 0.099381 0.678857 1.03919 0.0340978 0.389076 0.998317 -0.0312978 0.0875722 0.919233 -0.0897662 -0.157025 0.812131 -0.13544 -0.303213 0.691304 -0.165143 -0.349486 0.57151 -0.179085 -0.325512 0.464413 -0.180323 -0.270917 0.376642 -0.173314 -0.216633 0.309919 -0.162341 -0.177847 0.262564 -0.150508 -0.156768 0.231303 -0.139477 -0.148977 0.212625 -0.129736 -0.148416 0.203476 -0.121083 -0.14987 0.201445 -0.113061 -0.149733 0.204677 -0.105245 -0.146063 0.211713 -0.0973808 -0.138379 0.221367 -0.0893972 -0.127309 0.232651 -0.0813647 -0.114117 0.24476 -0.0734299 -0.100216 0.25706 -0.0657589 -0.086812 0.269086 -0.058498 -0.074713 0.280525 -0.0517545 -0.0643131 0.291196 -0.0455922 -0.0556741 0.301013 -0.0400351 -0.0486477 0.301562 0.0326817 0.0108715 0.295872 0.0379258 0.0122936 0.290162 0.043944 0.0142419 0.284609 0.0508448 0.016948 0.279475 0.058743 0.020699 0.275128 0.0677566 0.0258184 0.272062 0.0780007 0.0326416 0.270922 0.0895788 0.041492 0.272518 0.102568 0.0526799 0.277834 0.116998 0.0665396 0.288028 0.132811 0.0835518 0.304409 0.149806 0.104533 0.328378 0.167562 0.130873 0.361313 0.185337 0.16466 0.404353 0.201976 0.208462 0.458071 0.215846 0.264426 0.522035 0.224864 0.332488 0.594346 0.226666 0.40802 0.671279 0.218933 0.480029 0.747226 0.199866 0.531637 0.815079 0.168708 0.544241 0.867135 0.126188 0.504734 0.89639 0.0747475 0.412679 0.898031 0.0184218 0.283022 0.870718 -0.037699 0.141751 0.817233 -0.088382 0.015936 0.744133 -0.129349 -0.0764766 0.660337 -0.158187 -0.131499 0.575093 -0.174705 -0.156618 0.496069 -0.180607 -0.164039 0.42823 -0.178655 -0.164359 0.373721 -0.171752 -0.163612 0.332486 -0.162277 -0.163532 0.303149 -0.151815 -0.163345 0.283783 -0.141214 -0.161482 0.272417 -0.130805 -0.156646 0.267266 -0.120644 -0.14827 0.266804 -0.110703 -0.136579 0.269751 -0.100969 -0.122425 0.275048 -0.0914816 -0.107005 0.28183 -0.0823242 -0.0915538 0.289416 -0.0735995 -0.0770866 0.297289 -0.0654045 -0.0642757 0.305083 -0.0578131 -0.0534298 0.312556 -0.050869 -0.0445596 0.319569 -0.0445861 -0.0374817 0.326056 -0.0389528 -0.031916 0.318727 0.0369705 0.0091865 0.314388 0.0422679 0.0102776 0.310164 0.0482779 0.0117395 0.306223 0.0550834 0.0137458 0.3028 0.062766 0.0165177 0.300214 0.0714006 0.0203139 0.298885 0.081047 0.025411 0.299345 0.0917379 0.0320817 0.302248 0.103464 0.0405752 0.308366 0.11615 0.0511107 0.318573 0.129627 0.0639062 0.333809 0.14359 0.0792382 0.355012 0.157547 0.0975163 0.38301 0.170766 0.119317 0.418362 0.18223 0.145275 0.461136 0.190623 0.175734 0.510656 0.194381 0.210097 0.565246 0.191831 0.24602 0.622072 0.181438 0.278865 0.677177 0.162122 0.30195 0.725777 0.133611 0.308065 0.762873 0.0967079 0.291975 0.784069 0.0534068 0.252872 0.786461 0.0067471 0.195415 0.769345 -0.0395956 0.128442 0.734509 -0.0819332 0.0618747 0.685953 -0.117242 0.0034107 0.629077 -0.143692 -0.0432637 0.569591 -0.160848 -0.0781903 0.512478 -0.169497 -0.103434 0.461334 -0.171213 -0.121301 0.418189 -0.16784 -0.133349 0.383695 -0.161082 -0.140246 0.357525 -0.152284 -0.142175 0.338782 -0.142382 -0.139284 0.326312 -0.131972 -0.131998 0.31892 -0.121421 -0.12112 0.315479 -0.110958 -0.107759 0.314989 -0.100746 -0.0931593 0.316593 -0.0909159 -0.0785042 0.319591 -0.081576 -0.0647509 0.323431 -0.0728116 -0.0525376 0.327697 -0.0646829 -0.0421783 0.332097 -0.0572228 -0.0337132 0.336436 -0.0504389 -0.0269946 0.340593 -0.0443176 -0.0217717 0.344506 -0.0388293 -0.017762 0.331585 0.0397607 0.0082963 0.328442 0.0448824 0.009093 0.325522 0.050623 0.010122 0.322975 0.0570386 0.0114996 0.321008 0.0641781 0.0133781 0.319885 0.0720771 0.0159409 0.319947 0.0807486 0.0193884 0.321613 0.0901712 0.0239228 0.325385 0.100275 0.0297258 0.331835 0.110921 0.0369391 0.341591 0.121881 0.0456564 0.355289 0.132809 0.0559314 0.373521 0.143216 0.0677938 0.396744 0.152443 0.0812574 0.425165 0.159649 0.0962822 0.458608 0.163828 0.112664 0.496362 0.163862 0.129831 0.53706 0.158638 0.146601 0.578629 0.147213 0.161035 0.618352 0.129022 0.170541 0.653095 0.104089 0.172366 0.679689 0.0731735 0.164404 0.695425 0.0378088 0.145983 0.698553 0.0001768 0.118308 0.688659 -0.0371703 0.0841894 0.666799 -0.0716984 0.0472254 0.635328 -0.101295 0.0108465 0.597457 -0.124575 -0.0223718 0.556679 -0.141008 -0.0508991 0.516202 -0.150847 -0.0739881 0.478554 -0.154911 -0.0913678 0.445409 -0.154314 -0.102995 0.417613 -0.150214 -0.109002 0.395337 -0.143655 -0.10974 0.378277 -0.135491 -0.105836 0.365844 -0.126374 -0.0981865 0.357318 -0.116788 -0.0878875 0.351946 -0.107089 -0.0761002 0.349019 -0.0975329 -0.0639127 0.347907 -0.0883087 -0.052216 0.348081 -0.0795488 -0.041638 0.349118 -0.0713412 -0.0325274 0.350694 -0.0637368 -0.0249928 0.352576 -0.0567564 -0.0189649 0.3546 -0.0503973 -0.0142664 0.356661 -0.0446395 -0.0106728 0.358693 -0.0394515 -0.0079571 0.34061 0.0411078 0.0078106 0.338454 0.0458874 0.0083568 0.336594 0.0511766 0.0090263 0.335164 0.0570062 0.009888 0.334332 0.0633967 0.0110357 0.334315 0.0703515 0.0125848 0.335377 0.0778489 0.0146644 0.337835 0.0858319 0.0174075 0.342055 0.0941957 0.0209342 0.348442 0.102774 0.0253329 0.357419 0.111323 0.0306444 0.369396 0.119508 0.0368527 0.384719 0.12689 0.0438817 0.403608 0.132918 0.0515983 0.426081 0.136937 0.0597995 0.451873 0.138212 0.068193 0.480354 0.13598 0.0763453 0.510476 0.129535 0.0836242 0.540772 0.118335 0.0891765 0.569417 0.102134 0.091967 0.594391 0.0810942 0.0909397 0.613705 0.0558612 0.0852612 0.625695 0.0275651 0.0745893 0.629288 -0.0022706 0.0592404 0.624209 -0.0319066 0.0401864 0.61104 -0.0596203 0.0188718 0.591134 -0.0839399 -0.0030598 0.56638 -0.103826 -0.0240344 0.5389 -0.118756 -0.0427237 0.510737 -0.128712 -0.0581119 0.483618 -0.134071 -0.0695351 0.458819 -0.135472 -0.0766723 0.43713 -0.13367 -0.0795465 0.418903 -0.129422 -0.0785061 0.404145 -0.123417 -0.0741742 0.392617 -0.116246 -0.0673674 0.383937 -0.108386 -0.0589896 0.377655 -0.100212 -0.0499161 0.373312 -0.0920115 -0.0408989 0.370482 -0.083994 -0.0325035 0.368795 -0.0763074 -0.0250882 0.367943 -0.0690484 -0.0188175 0.367684 -0.0622735 -0.0137032 0.367836 -0.0560087 -0.0096534 0.368264 -0.050257 -0.0065209 0.368875 -0.0450059 -0.0041387 0.369603 -0.0402326 -0.0023479 0.346963 0.0412297 0.0074534 0.345585 0.0455683 0.0078001 0.344543 0.0503056 0.0081937 0.343951 0.0554517 0.00867 0.343946 0.0610048 0.0092796 0.344699 0.0669452 0.0100872 0.346407 0.073229 0.0111668 0.349301 0.0797796 0.0125963 0.353638 0.0864794 0.0144474 0.359691 0.0931596 0.0167716 0.36773 0.0995918 0.0195874 0.378 0.105481 0.0228693 0.390686 0.11046 0.0265385 0.405867 0.114097 0.0304649 0.42347 0.115904 0.0344621 0.443224 0.115364 0.0382911 0.464619 0.111974 0.0416564 0.486885 0.105304 0.0442028 0.509008 0.0950644 0.0455249 0.529782 0.0811816 0.0451892 0.547912 0.0638595 0.0427911 0.562154 0.0436121 0.0380424 0.571474 0.0212524 0.0308409 0.575204 -0.0021698 0.0213626 0.573143 -0.0254765 0.0100593 0.565596 -0.0474979 -0.0023717 0.553325 -0.0672095 -0.0150829 0.537434 -0.0838414 -0.027166 0.519203 -0.0969378 -0.0377987 0.499921 -0.106362 -0.0462966 0.480739 -0.112254 -0.0521999 0.462578 -0.114959 -0.0553086 0.446084 -0.114946 -0.0556811 0.431632 -0.112734 -0.0536154 0.419365 -0.108839 -0.0495855 0.409242 -0.103734 -0.0441743 0.401099 -0.0978266 -0.0379871 0.394699 -0.0914577 -0.0315776 0.389776 -0.0848963 -0.0253961 0.386065 -0.0783479 -0.0197592 0.383324 -0.071962 -0.014849 0.381344 -0.0658415 -0.0107313 0.379952 -0.0600519 -0.0073846 0.37901 -0.0546301 -0.0047322 0.378413 -0.0495914 -0.0026712 0.378079 -0.0449362 -0.0010914 0.377948 -0.0406549 0.000108 0.351678 0.0404126 0.0070894 0.35089 0.0442671 0.0072849 0.350451 0.0484181 0.0074798 0.350456 0.0528607 0.0076885 0.351014 0.0575771 0.0079342 0.352255 0.0625333 0.0082482 0.354324 0.0676738 0.0086676 0.357383 0.0729155 0.009232 0.361607 0.0781422 0.0099797 0.367169 0.0831988 0.0109376 0.374235 0.0878867 0.0121137 0.382939 0.0919617 0.0134897 0.393363 0.095135 0.0150112 0.40551 0.0970804 0.0165901 0.419273 0.0974478 0.0181006 0.43441 0.0958855 0.019388 0.450529 0.0920711 0.0202696 0.467079 0.0857506 0.0205488 0.483366 0.0767819 0.020028 0.498599 0.0651755 0.018522 0.511946 0.0511273 0.0158876 0.522622 0.0350306 0.0120524 0.529979 0.0174636 0.0070392 0.53359 -0.0008517 0.0009957 0.533305 -0.0191154 -0.0057959 0.529274 -0.036531 -0.0129523 0.521923 -0.0523846 -0.0200062 0.511891 -0.0661127 -0.0264698 0.49995 -0.0773435 -0.0318978 0.486905 -0.0859082 -0.0359303 0.473511 -0.0918256 -0.0383444 0.46041 -0.0952669 -0.0390753 0.448094 -0.0965106 -0.0382142 0.436895 -0.0958965 -0.0359861 0.426994 -0.0937858 -0.0327112 0.41845 -0.0905299 -0.028753 0.411226 -0.0864501 -0.0244718 0.405222 -0.0818244 -0.020182 0.400302 -0.0768836 -0.0161288 0.396318 -0.0718112 -0.0124746 0.393123 -0.0667474 -0.0093047 0.390585 -0.0617943 -0.0066406 0.388585 -0.0570231 -0.0044578 0.387026 -0.0524799 -0.0027037 0.385826 -0.0481921 -0.0013147 0.384921 -0.0441728 -0.0002245 0.384255 -0.0404252 0.0006265 0.355585 0.0389307 0.0066652 0.355234 0.0422992 0.0067527 0.355227 0.0458767 0.0068131 0.355638 0.0496477 0.0068495 0.356554 0.0535853 0.0068696 0.358072 0.0576483 0.0068852 0.360296 0.0617773 0.0069115 0.363337 0.0658914 0.0069656 0.367308 0.0698846 0.0070645 0.372317 0.0736225 0.0072206 0.378457 0.0769412 0.0074367 0.385794 0.0796473 0.0077028 0.394348 0.0815215 0.0079874 0.404085 0.0823257 0.0082424 0.414892 0.0818155 0.0083966 0.42657 0.0797564 0.0083643 0.438822 0.0759467 0.0080464 0.451257 0.070242 0.0073444 0.463405 0.0625813 0.0061659 0.474742 0.0530111 0.0044389 0.484731 0.0416996 0.0021238 0.492871 0.0289417 -0.0007681 0.498749 0.0151475 -0.0041839 0.502087 0.0008152 -0.007996 0.502772 -0.0135088 -0.0120261 0.50087 -0.0272778 -0.0160483 0.496618 -0.0399936 -0.0198129 0.490387 -0.0512479 -0.0230607 0.482641 -0.0607495 -0.025584 0.473882 -0.0683369 -0.0272174 0.464599 -0.0739738 -0.0278805 0.455233 -0.0777322 -0.0275794 0.446141 -0.079768 -0.0264039 0.437592 -0.0802928 -0.0245081 0.429765 -0.0795477 -0.0220884 0.422754 -0.0777802 -0.0193553 0.416587 -0.075227 -0.0165086 0.411245 -0.0721025 -0.0137152 0.406674 -0.068592 -0.0111015 0.402801 -0.0648494 -0.0087473 0.399548 -0.0609979 -0.0066914 0.396834 -0.0571331 -0.0049399 0.394586 -0.053326 -0.0034755 0.392737 -0.049628 -0.002267 0.391228 -0.0460741 -0.0012788 0.390008 -0.0426873 -0.0004739 0.389034 -0.0394809 0.0001803 0.359069 0.0370188 0.0061936 0.359034 0.0399255 0.0062064 0.359322 0.0429699 0.00618 0.359996 0.0461304 0.0061118 0.361118 0.0493758 0.0060018 0.362762 0.0526628 0.005852 0.365 0.0559337 0.0056664 0.367906 0.0591148 0.0054495 0.371553 0.0621139 0.0052078 0.376002 0.0648194 0.0049449 0.381301 0.0671006 0.0046616 0.387474 0.0688089 0.0043535 0.394512 0.0697818 0.0040051 0.402361 0.0698498 0.003595 0.41092 0.0688453 0.0030897 0.420028 0.0666153 0.0024509 0.429463 0.0630361 0.0016333 0.438948 0.0580293 0.0005962 0.448162 0.0515772 -0.0006968 0.456754 0.0437357 -0.0022632 0.464373 0.0346421 -0.0041033 0.470693 0.0245149 -0.0061882 0.475445 0.0136453 -0.0084619 0.478444 0.00238 -0.010838 0.479606 -0.0089041 -0.0132048 0.478956 -0.0198293 -0.0154352 0.476622 -0.0300459 -0.0173961 0.472821 -0.0392582 -0.0189645 0.467833 -0.0472436 -0.0200452 0.461973 -0.0538622 -0.0205733 0.455557 -0.0590567 -0.0205345 0.448884 -0.0628452 -0.0199538 0.44221 -0.065308 -0.0189023 0.435743 -0.0665705 -0.0174756 0.429636 -0.0667869 -0.0157895 0.423991 -0.0661244 -0.0139598 0.418865 -0.0647503 -0.0120932 0.414277 -0.0628224 -0.0102759 0.410221 -0.0604829 -0.0085728 0.406671 -0.0578552 -0.0070234 0.403592 -0.0550427 -0.0056469 0.40094 -0.0521294 -0.0044459 0.398672 -0.0491822 -0.0034113 0.396745 -0.0462524 -0.0025269 0.39512 -0.0433788 -0.0017753 0.39376 -0.0405896 -0.001137 0.392631 -0.0379048 -0.0005955 0.362343 0.0348555 0.0056953 0.36253 0.0373396 0.0056587 0.363014 0.0399058 0.0055791 0.363843 0.0425299 0.0054523 0.365065 0.0451796 0.0052747 0.366732 0.0478131 0.0050444 0.368894 0.0503777 0.0047606 0.371601 0.052809 0.0044221 0.374895 0.0550295 0.0040304 0.37881 0.0569493 0.0035856 0.383366 0.0584663 0.0030873 0.388564 0.0594687 0.0025351 0.394377 0.0598383 0.0019225 0.400753 0.0594559 0.0012431 0.407601 0.0582082 0.0004842 0.414793 0.0559967 -0.0003654 0.422166 0.0527475 -0.001321 0.429521 0.0484207 -0.0023936 0.436635 0.0430203 -0.0035891 0.44327 0.0366011 -0.0049055 0.449192 0.0292715 -0.0063263 0.454186 0.0211932 -0.00782 0.458071 0.0125742 -0.0093508 0.460723 0.0036578 -0.0108547 0.462076 -0.0052936 -0.0122721 0.462137 -0.0140157 -0.0135303 0.460975 -0.0222614 -0.014569 0.458717 -0.0298166 -0.0153229 0.455533 -0.0365131 -0.0157609 0.451622 -0.0422349 -0.0158601 0.44719 -0.0469212 -0.0156255 0.442439 -0.0505623 -0.0150836 0.437552 -0.053193 -0.0142814 0.432684 -0.0548834 -0.0132772 0.42796 -0.055728 -0.0121356 0.423474 -0.0558355 -0.0109189 0.419289 -0.0553203 -0.0096846 0.415442 -0.0542951 -0.008478 0.411951 -0.0528655 -0.0073334 0.408816 -0.0511271 -0.0062723 0.406027 -0.0491632 -0.0053057 0.403566 -0.047045 -0.0044368 0.401411 -0.0448316 -0.003663 0.399536 -0.0425712 -0.002977 0.397916 -0.0403023 -0.0023718 0.396526 -0.0380551 -0.0018382 0.395343 -0.0358527 -0.0013685 0.365413 0.0325754 0.0052001 0.365749 0.0346828 0.0051315 0.366353 0.0368304 0.0050208 0.36726 0.0389937 0.0048633 0.368507 0.0411419 0.004655 0.37013 0.0432366 0.0043925 0.372164 0.0452315 0.0040735 0.374638 0.0470718 0.0036948 0.377579 0.0486944 0.0032565 0.381001 0.0500279 0.002757 0.384909 0.0509939 0.0021962 0.389291 0.0515093 0.0015757 0.394117 0.051489 0.0008936 0.399335 0.05085 0.0001507 0.404871 0.0495167 -0.0006542 0.410623 0.0474266 -0.0015193 0.41647 0.0445365 -0.0024461 0.422268 0.0408292 -0.003431 0.427859 0.036318 -0.0044672 0.433081 0.0310514 -0.0055432 0.437771 0.0251141 -0.0066432 0.441784 0.0186255 -0.0077391 0.444998 0.0117354 -0.0088061 0.447324 0.0046164 -0.0098099 0.448715 -0.0025461 -0.0107105 0.449166 -0.0095658 -0.0114747 0.448714 -0.0162658 -0.012069 0.447435 -0.0224899 -0.0124657 0.445432 -0.0281107 -0.0126553 0.442833 -0.0330348 -0.0126318 0.439774 -0.0372049 -0.0124042 0.436392 -0.0405986 -0.011993 0.432815 -0.0432252 -0.0114272 0.429161 -0.0451202 -0.0107397 0.425528 -0.0463388 -0.0099688 0.421994 -0.0469497 -0.0091489 0.41862 -0.0470291 -0.0083114 0.415448 -0.0466552 -0.0074806 0.412504 -0.0459047 -0.0066776 0.409804 -0.0448494 -0.005915 0.407351 -0.0435548 -0.005201 0.405143 -0.042079 -0.0045396 0.40317 -0.040472 -0.0039322 0.401419 -0.0387768 -0.0033762 0.399878 -0.037029 -0.0028702 0.398529 -0.0352581 -0.0024105 0.397356 -0.0334879 -0.0019943 0.368287 0.0302713 0.0047226 0.368718 0.0320492 0.0046345 0.369386 0.0338371 0.0045073 0.370318 0.0356117 0.0043369 0.37154 0.0373447 0.0041197 0.373078 0.0390021 0.0038522 0.374955 0.0405445 0.0035323 0.377188 0.0419264 0.0031564 0.379791 0.0430968 0.0027245 0.382769 0.0440001 0.0022353 0.386117 0.0445767 0.0016885 0.389818 0.0447652 0.0010869 0.393843 0.0445048 0.000431 0.398144 0.043738 -0.0002752 0.402661 0.0424144 -0.0010293 0.407316 0.0404948 -0.0018246 0.412015 0.0379551 -0.0026566 0.416653 0.0347902 -0.0035163 0.421119 0.031017 -0.0043936 0.425295 0.0266768 -0.0052771 0.429072 0.0218351 -0.0061487 0.432346 0.016581 -0.0069904 0.435032 0.0110233 -0.0077848 0.437067 0.0052859 -0.0085071 0.438416 -0.0004989 -0.0091365 0.439068 -0.0061972 -0.0096549 0.439043 -0.0116814 -0.010047 0.438387 -0.0168367 -0.0102997 0.437163 -0.0215664 -0.0104114 0.435455 -0.0257961 -0.0103826 0.433352 -0.0294749 -0.0102204 0.430949 -0.0325762 -0.0099387 0.428337 -0.0350952 -0.0095561 0.425602 -0.0370466 -0.0090915 0.42282 -0.0384606 -0.0085668 0.420055 -0.0393789 -0.0080021 0.41736 -0.0398508 -0.0074159 0.414775 -0.0399297 -0.0068231 0.41233 -0.0396699 -0.0062371 0.410044 -0.0391246 -0.0056663 0.40793 -0.0383437 -0.005118 0.405992 -0.0373735 -0.0045965 0.404231 -0.0362551 -0.0041048 0.402642 -0.0350251 -0.0036433 0.401218 -0.033715 -0.0032127 0.399951 -0.032352 -0.0028127 0.398831 -0.0309588 -0.0024427 0.442683 -0.0344074 0.0067259 0.44309 -0.0364546 0.006608 0.443763 -0.038519 0.0064351 0.444733 -0.0405751 0.0062014 0.446031 -0.0425917 0.0059013 0.447687 -0.0445314 0.00553 0.449728 -0.0463504 0.0050837 0.452177 -0.0479981 0.0045572 0.455049 -0.0494177 0.0039499 0.458354 -0.0505467 0.0032594 0.462088 -0.051318 0.0024853 0.466236 -0.051662 0.001631 0.470767 -0.0515092 0.0006978 0.475632 -0.0507932 -0.0003087 0.480765 -0.0494551 -0.0013835 0.486082 -0.0474475 -0.0025166 0.491479 -0.0447395 -0.0036998 0.496841 -0.0413207 -0.0049186 0.50204 -0.037205 -0.0061574 0.506947 -0.0324333 -0.007399 0.511433 -0.027074 -0.0086175 0.515379 -0.0212219 -0.0097873 0.518686 -0.0149951 -0.010885 0.521275 -0.0085295 -0.0118777 0.523098 -0.0019719 -0.0127386 0.524137 0.0045273 -0.0134449 0.524408 0.0108234 -0.0139775 0.523951 0.016784 -0.0143209 0.522835 0.0222963 -0.0144741 0.521147 0.0272708 -0.0144387 0.518983 0.0316442 -0.0142245 0.516449 0.0353797 -0.0138501 0.513645 0.0384655 -0.01334 0.51067 0.0409122 -0.0127182 0.507609 0.0427481 -0.0120137 0.504538 0.0440158 -0.0112521 0.501519 0.0447672 -0.0104581 0.498601 0.0450596 -0.0096514 0.495821 0.0449527 -0.00885 0.493204 0.0445051 -0.0080656 0.490767 0.0437732 -0.0073085 0.488519 0.0428091 -0.0065853 0.486463 0.0416599 -0.0059005 0.484595 0.0403678 -0.0052553 0.48291 0.0389696 -0.0046515 0.4814 0.0374971 -0.0040889 0.480056 0.0359772 -0.003567 0.439382 -0.0369711 0.0073964 0.439669 -0.0393897 0.0073064 0.440257 -0.0418603 0.0071568 0.441184 -0.0443563 0.0069408 0.442494 -0.0468439 0.0066521 0.444229 -0.0492811 0.0062853 0.446428 -0.0516169 0.0058362 0.449128 -0.0537907 0.0052993 0.452361 -0.0557322 0.0046736 0.456145 -0.057362 0.0039561 0.46049 -0.0585922 0.0031461 0.465387 -0.0593291 0.0022455 0.470805 -0.0594762 0.0012524 0.476692 -0.0589385 0.0001694 0.482966 -0.0576282 -0.0010027 0.489521 -0.0554712 -0.0022584 0.496221 -0.0524142 -0.0035957 0.502908 -0.0484313 -0.0050052 0.509406 -0.0435308 -0.0064735 0.51553 -0.0377592 -0.0079805 0.521097 -0.0312039 -0.0095032 0.525938 -0.0239916 -0.0110015 0.529907 -0.0162839 -0.0124425 0.532898 -0.0082698 -0.0137816 0.534845 -0.0001546 -0.0149687 0.535733 0.0078526 -0.0159638 0.535592 0.0155511 -0.0167269 0.534497 0.0227607 -0.0172257 0.532557 0.0293316 -0.0174518 0.529908 0.0351504 -0.0173992 0.526696 0.0401434 -0.0170822 0.523076 0.0442759 -0.0165271 0.519192 0.0475492 -0.0157719 0.515176 0.0499948 -0.0148575 0.511142 0.0516677 -0.0138327 0.507184 0.0526396 -0.0127406 0.503373 0.0529918 -0.0116212 0.499763 0.0528096 -0.0105057 0.496388 0.0521777 -0.0094215 0.49327 0.0511768 -0.0083857 0.490418 0.0498808 -0.0074099 0.487832 0.0483561 -0.0065007 0.485505 0.046661 -0.0056604 0.483426 0.0448452 -0.0048874 0.48158 0.0429509 -0.0041803 0.479953 0.0410134 -0.0035352 0.478526 0.0390614 -0.0029489 0.435883 -0.039494 0.0080874 0.435989 -0.0423358 0.008042 0.436426 -0.0452774 0.007935 0.437249 -0.0482928 0.0077594 0.438512 -0.0513471 0.0075093 0.440275 -0.0543948 0.0071802 0.442597 -0.0573782 0.0067687 0.445534 -0.0602264 0.0062712 0.449139 -0.062854 0.0056876 0.453452 -0.0651612 0.0050159 0.458501 -0.0670343 0.0042549 0.464291 -0.0683481 0.0034033 0.470799 -0.0689694 0.0024539 0.477972 -0.0687627 0.0014011 0.485713 -0.0675978 0.0002329 0.493887 -0.0653596 -0.0010595 0.502315 -0.0619586 -0.0024885 0.510777 -0.0573421 -0.0040596 0.519026 -0.0515047 -0.0057727 0.526794 -0.044497 -0.0076161 0.533815 -0.0364291 -0.0095625 0.539839 -0.0274713 -0.0115657 0.544656 -0.0178472 -0.0135781 0.54811 -0.0078222 -0.0155177 0.550116 0.0023136 -0.0173123 0.550663 0.0122641 -0.0188751 0.549813 0.0217485 -0.0201371 0.547695 0.0305194 -0.0210234 0.544489 0.0383773 -0.0215033 0.540409 0.0451795 -0.0215536 0.535681 0.0508438 -0.0211854 0.530532 0.0553455 -0.0204341 0.525167 0.0587106 -0.0193595 0.519767 0.0610064 -0.0180334 0.514476 0.0623299 -0.0165351 0.509408 0.0627963 -0.0149405 0.504642 0.0625297 -0.0133203 0.500226 0.061654 -0.0117303 0.496188 0.0602872 -0.0102138 0.492533 0.0585375 -0.0087983 0.489258 0.0565002 -0.0074993 0.486344 0.0542579 -0.0063222 0.483772 0.0518798 -0.0052654 0.481516 0.0494231 -0.0043213 0.479549 0.046934 -0.0034824 0.477846 0.0444495 -0.0027378 0.47638 0.0419984 -0.0020786 0.432182 -0.0418689 0.0087762 0.432024 -0.0451838 0.0087982 0.432225 -0.0486616 0.0087617 0.432853 -0.0522796 0.0086615 0.433984 -0.0560043 0.0084945 0.435696 -0.0597891 0.0082602 0.438076 -0.0635717 0.0079598 0.441209 -0.0672714 0.0075951 0.445179 -0.0707871 0.0071706 0.45006 -0.073996 0.0066875 0.455911 -0.0767531 0.0061446 0.462766 -0.0788933 0.0055357 0.470621 -0.0802346 0.0048425 0.479427 -0.0805857 0.004042 0.489078 -0.0797556 0.0030986 0.499401 -0.0775678 0.0019734 0.510158 -0.0738755 0.0006205 0.521044 -0.0685802 -0.0009974 0.531702 -0.0616486 -0.0029116 0.54174 -0.0531278 -0.0051286 0.550758 -0.0431547 -0.0076365 0.558382 -0.0319573 -0.0103875 0.564296 -0.0198468 -0.0133045 0.568273 -0.0071999 -0.0162785 0.570197 0.0055678 -0.0191738 0.570071 0.0180336 -0.0218419 0.568018 0.0297998 -0.0241314 0.564261 0.0405236 -0.0259059 0.559099 0.0499389 -0.027064 0.552873 0.0578689 -0.0275394 0.545935 0.0642286 -0.027326 0.53862 0.0690179 -0.0264597 0.531222 0.0723085 -0.0250307 0.523982 0.074226 -0.0231542 0.517083 0.0749317 -0.0209689 0.510651 0.0746052 -0.0186122 0.504759 0.0734298 -0.0162111 0.499443 0.0715811 -0.0138685 0.494704 0.0692198 -0.0116628 0.49052 0.0664869 -0.0096428 0.486859 0.0635023 -0.0078336 0.483677 0.0603647 -0.0062403 0.480929 0.057154 -0.004854 0.478572 0.0539323 -0.003657 0.476561 0.0507477 -0.0026295 0.474857 0.0476358 -0.0017487 0.473423 0.0446229 -0.000995 0.428277 -0.0439416 0.0094192 0.427749 -0.0477715 0.0095407 0.427599 -0.0518447 0.0096168 0.427913 -0.0561457 0.0096476 0.428787 -0.0606465 0.0096382 0.430331 -0.0653032 0.0095982 0.432664 -0.0700523 0.0095403 0.435913 -0.0748064 0.0094792 0.44021 -0.0794499 0.0094303 0.445681 -0.083836 0.009403 0.452436 -0.0877843 0.0093971 0.460557 -0.0910809 0.0093985 0.470079 -0.0934819 0.0093693 0.480974 -0.0947208 0.0092548 0.493129 -0.0945213 0.0089752 0.506332 -0.0926157 0.0084367 0.520264 -0.0887688 0.0075329 0.534499 -0.0828051 0.0061622 0.548514 -0.0746386 0.0042335 0.561725 -0.0642983 0.0016843 0.573526 -0.0519478 -0.0015083 0.583341 -0.0378909 -0.0053058 0.590688 -0.0225626 -0.0096257 0.595224 -0.0065016 -0.0143012 0.59679 0.0096916 -0.019116 0.595428 0.025406 -0.0238075 0.591365 0.0400746 -0.028096 0.584992 0.0532208 -0.031696 0.576807 0.0644925 -0.0343898 0.567361 0.0736776 -0.0360062 0.557202 0.0807037 -0.0364716 0.546828 0.0856217 -0.0358081 0.536654 0.0885809 -0.0341302 0.526998 0.0897984 -0.0316214 0.518075 0.0895305 -0.0285112 0.510011 0.0880464 -0.0250441 0.502855 0.0856085 -0.0214518 0.496598 0.0824576 -0.017928 0.491192 0.0788054 -0.014621 0.486566 0.0748301 -0.0116254 0.482637 0.0706769 -0.0089893 0.479322 0.0664599 -0.0067221 0.476541 0.062266 -0.0048059 0.474222 0.0581596 -0.003206 0.4723 0.054186 -0.0018818 0.470718 0.0503764 -0.0007901 0.469428 0.0467503 0.0001076 0.423916 -0.0455096 0.0099874 0.422881 -0.0498794 0.0102497 0.422228 -0.0545908 0.0104958 0.422062 -0.0596401 0.0107378 0.422508 -0.0650102 0.0109977 0.42371 -0.0706663 0.0113053 0.425834 -0.0765498 0.011697 0.429065 -0.0825719 0.0122117 0.433601 -0.0886075 0.0128864 0.439645 -0.0944881 0.0137455 0.44739 -0.0999968 0.0147923 0.456997 -0.104865 0.0160003 0.468572 -0.108775 0.0173024 0.482132 -0.111362 0.018594 0.497575 -0.112236 0.0197286 0.514651 -0.110999 0.0205302 0.532935 -0.10728 0.0207942 0.551829 -0.100779 0.0203081 0.570568 -0.0913131 0.0188676 0.58827 -0.0788627 0.0162933 0.603999 -0.0636086 0.0124625 0.616859 -0.0459496 0.0073421 0.626095 -0.026493 0.0010058 0.631185 -0.006014 -0.0063371 0.631908 0.0146119 -0.0143371 0.628378 0.0344959 -0.0225511 0.62102 0.0528238 -0.03046 0.610511 0.0689332 -0.0375373 0.597687 0.0823646 -0.0433168 0.583441 0.0928796 -0.04743 0.568624 0.100451 -0.0496618 0.553971 0.105226 -0.0499664 0.540061 0.107484 -0.0484667 0.527292 0.107579 -0.0454275 0.515899 0.105901 -0.0412161 0.505973 0.102837 -0.0362453 0.497495 0.098747 -0.0309242 0.490371 0.0939478 -0.0256105 0.484463 0.0887062 -0.0205848 0.479615 0.0832378 -0.0160351 0.47567 0.0777105 -0.0120622 0.472482 0.0722495 -0.008694 0.469922 0.0669446 -0.0059053 0.46788 0.0618568 -0.0036376 0.466264 0.0570243 -0.0018185 0.465002 0.052469 -0.0003712 0.464031 0.0482 0.0007741 0.41864 -0.0463099 0.0104662 0.416926 -0.0512151 0.0109213 0.415575 -0.0565759 0.0114134 0.414714 -0.0624061 0.0119778 0.414499 -0.0687065 0.0126661 0.415119 -0.0754589 0.0135448 0.416799 -0.0826186 0.0146903 0.4198 -0.0901057 0.0161827 0.424414 -0.0977946 0.018095 0.430954 -0.105504 0.0204767 0.439735 -0.112986 0.0233388 0.451043 -0.119918 0.0266416 0.465101 -0.1259 0.0302822 0.482016 -0.130453 0.034098 0.501731 -0.133036 0.0378614 0.523965 -0.133073 0.0412866 0.548174 -0.129993 0.0440308 0.573523 -0.123299 0.045697 0.598897 -0.112638 0.045853 0.622961 -0.0978831 0.0440608 0.644264 -0.0792059 0.0399415 0.661394 -0.0571146 0.0332692 0.673151 -0.0324516 0.0240315 0.67872 -0.0063342 0.0125203 0.677793 0.0199554 -0.0006937 0.670622 0.0451145 -0.0148035 0.65798 0.067971 -0.0288802 0.641042 0.0876087 -0.041961 0.621208 0.103445 -0.0532054 0.599918 0.115247 -0.0619282 0.578485 0.123097 -0.0676874 0.557978 0.127318 -0.0703117 0.539172 0.128392 -0.0698976 0.522536 0.126872 -0.0667918 0.508273 0.123323 -0.0615256 0.496377 0.118272 -0.0547478 0.486691 0.112185 -0.0471323 0.478971 0.105454 -0.0392973 0.472932 0.0983967 -0.0317497 0.468286 0.0912576 -0.0248491 0.464765 0.0842203 -0.0188056 0.462136 0.0774144 -0.0136983 0.460203 0.0709266 -0.0095072 0.458813 0.0648095 -0.006148 0.457842 0.0590904 -0.0035043 0.457198 0.0537778 -0.00145 0.456809 0.0488675 0.0001322 0.411449 -0.0460413 0.0109398 0.408843 -0.0514318 0.0116442 0.406551 -0.0574011 0.0124711 0.404723 -0.0639863 0.0134924 0.403547 -0.0712134 0.014807 0.403267 -0.0790907 0.0165371 0.40418 -0.0875991 0.0188201 0.406643 -0.096681 0.0217961 0.411074 -0.106227 0.0255906 0.417933 -0.11606 0.0302905 0.427707 -0.125918 0.0359262 0.44087 -0.135439 0.0424577 0.457826 -0.144143 0.0497696 0.478845 -0.15143 0.0576727 0.503974 -0.15658 0.0658914 0.532945 -0.158781 0.0740481 0.56509 -0.157182 0.0816151 0.599277 -0.150982 0.0878678 0.633901 -0.139545 0.091879 0.666957 -0.122538 0.0925751 0.696194 -0.100058 0.0889216 0.719373 -0.0727201 0.0801834 0.73457 -0.0416739 0.0661951 0.740483 -0.0085213 0.0475087 0.736664 0.0248587 0.0253481 0.723618 0.0565528 0.0013739 0.702722 0.0848695 -0.0226287 0.675997 0.10855 -0.0450336 0.64578 0.126886 -0.0645368 0.614375 0.139724 -0.0801857 0.583778 0.147373 -0.0913909 0.555502 0.150463 -0.0978935 0.530522 0.149783 -0.0997674 0.509317 0.146159 -0.0974074 0.491958 0.140361 -0.0914906 0.478227 0.133061 -0.0829009 0.467726 0.124812 -0.0726227 0.459968 0.11606 -0.0616165 0.454449 0.107147 -0.050716 0.450693 0.0983292 -0.0405549 0.448281 0.0897931 -0.0315408 0.446866 0.0816645 -0.0238658 0.446171 0.0740227 -0.0175503 0.445985 0.0669099 -0.0124957 0.446153 0.0603409 -0.0085379 0.446563 0.0543112 -0.0054875 0.447138 0.0488025 -0.0031614 0.401096 -0.0443973 0.0116113 0.397359 -0.0501612 0.0126224 0.393852 -0.056625 0.0138785 0.390743 -0.0638539 0.0155032 0.388258 -0.0719059 0.0176608 0.386699 -0.0808251 0.0205487 0.386446 -0.0906312 0.0243833 0.387974 -0.101307 0.0293811 0.391852 -0.112782 0.0357345 0.398731 -0.124912 0.0435852 0.409326 -0.137452 0.053013 0.424367 -0.150032 0.0640382 0.444533 -0.162123 0.0766344 0.470356 -0.17301 0.0907341 0.502097 -0.18178 0.106188 0.53959 -0.187336 0.122652 0.582085 -0.18845 0.139383 0.628112 -0.183885 0.155004 0.675424 -0.172562 0.167379 0.721052 -0.153784 0.173768 0.761542 -0.127459 0.171376 0.793353 -0.0942671 0.158242 0.813379 -0.0557295 0.134044 0.819502 -0.0141037 0.100521 0.811026 0.027881 0.0610786 0.788865 0.0674211 0.0198239 0.75542 0.102076 -0.0195285 0.714135 0.130127 -0.054389 0.668879 0.150763 -0.0834351 0.623312 0.164052 -0.106219 0.580408 0.170738 -0.12275 0.542213 0.171952 -0.13317 0.509838 0.168942 -0.137693 0.483605 0.162872 -0.136695 0.463262 0.15472 -0.130802 0.448203 0.145256 -0.120936 0.437643 0.135061 -0.108245 0.430744 0.124567 -0.093975 0.426704 0.114094 -0.0793127 0.424808 0.103879 -0.0652452 0.424448 0.0940928 -0.0524789 0.425138 0.0848522 -0.0414152 0.426504 0.0762309 -0.0321881 0.428271 0.0682664 -0.0247295 0.430249 0.0609678 -0.0188459 0.43231 0.0543227 -0.0142857 0.434376 0.0483041 -0.0107901 0.386173 -0.0411573 0.0128795 0.381069 -0.0471091 0.0142452 0.376071 -0.0538641 0.0160108 0.371365 -0.061517 0.0183638 0.367214 -0.0701622 0.0215447 0.363975 -0.0798873 0.0258352 0.362122 -0.0907636 0.0315365 0.362258 -0.102834 0.038944 0.365123 -0.116093 0.0483224 0.371596 -0.130468 0.0598943 0.382668 -0.14578 0.0738632 0.399408 -0.161703 0.0904707 0.422879 -0.177711 0.110068 0.45402 -0.193018 0.133145 0.493475 -0.206529 0.16021 0.541345 -0.216829 0.191421 0.596924 -0.222225 0.2259 0.658419 -0.220893 0.260908 0.722783 -0.211121 0.291322 0.785734 -0.191644 0.309968 0.84206 -0.161998 0.309327 0.886231 -0.122835 0.284251 0.913258 -0.0760635 0.234583 0.919646 -0.024762 0.166184 0.904203 0.0271936 0.0893789 0.868452 0.075748 0.0154123 0.816441 0.117391 -0.0472937 0.753961 0.14978 -0.0951203 0.687377 0.172054 -0.128839 0.622451 0.184741 -0.151519 0.563522 0.189345 -0.166351 0.513193 0.187798 -0.17544 0.472479 0.181983 -0.179632 0.441207 0.173449 -0.179049 0.418476 0.16332 -0.173683 0.403034 0.152342 -0.163817 0.393534 0.140991 -0.150191 0.388686 0.129573 -0.133925 0.387333 0.118308 -0.116346 0.388482 0.107366 -0.0987442 0.391318 0.0968884 -0.0821881 0.395199 0.0869861 -0.0674045 0.39964 0.0777409 -0.054764 0.404297 0.0692027 -0.04433 0.408937 0.0613919 -0.0359494 0.413418 0.0543034 -0.029347 0.417661 0.0479129 -0.0242047 0.366098 -0.0362879 0.0152912 0.359453 -0.0421732 0.0170515 0.352759 -0.0489289 0.0193858 0.346213 -0.0566779 0.0225461 0.340111 -0.065551 0.0268465 0.334864 -0.0756829 0.0326418 0.331034 -0.0872055 0.0402995 0.329353 -0.100238 0.0501717 0.330741 -0.11487 0.0625893 0.336318 -0.131139 0.077895 0.347396 -0.148988 0.0965665 0.365452 -0.168204 0.119409 0.39206 -0.188337 0.147799 0.428756 -0.2086 0.183809 0.476806 -0.227759 0.229954 0.536849 -0.244077 0.288225 0.608439 -0.255336 0.358179 0.689554 -0.259001 0.434459 0.77622 -0.25255 0.504952 0.862438 -0.233945 0.551419 0.940561 -0.202167 0.554069 1.00217 -0.157683 0.49939 1.03943 -0.102733 0.387895 1.04658 -0.0412908 0.237015 1.02143 0.021375 0.076277 0.966246 0.0795683 -0.0637566 0.887562 0.128309 -0.163025 0.79492 0.164401 -0.217574 0.6987 0.187002 -0.236834 0.607913 0.197454 -0.235809 0.528754 0.198489 -0.22757 0.464242 0.193227 -0.219607 0.414776 0.184379 -0.21406 0.379075 0.173859 -0.209869 0.355076 0.162775 -0.204917 0.34055 0.151628 -0.197378 0.333425 0.140578 -0.186313 0.3319 0.129649 -0.171759 0.33446 0.118859 -0.154541 0.33985 0.108268 -0.135931 0.347051 0.0979771 -0.117289 0.355263 0.0881102 -0.0997626 0.363879 0.0787836 -0.0841295 0.372471 0.0700898 -0.0707651 0.380753 0.0620882 -0.0597061 0.388557 0.0548044 -0.0507631 0.395801 0.0482349 -0.0436282 0.341636 -0.0300695 0.0195154 0.33339 -0.0355894 0.021705 0.324923 -0.0419964 0.0246388 0.316442 -0.0494359 0.0286187 0.30826 -0.0580706 0.0340069 0.300839 -0.0680805 0.0411938 0.294815 -0.0796601 0.0505606 0.291034 -0.093014 0.0624637 0.290585 -0.108346 0.0772741 0.294826 -0.125834 0.0955129 0.305411 -0.14559 0.118182 0.324293 -0.167578 0.147274 0.353695 -0.191499 0.186429 0.395974 -0.216636 0.24139 0.453333 -0.241682 0.319643 0.5273 -0.264609 0.428249 0.617998 -0.282658 0.569156 0.723305 -0.29253 0.732608 0.838185 -0.290818 0.891757 0.954465 -0.274641 1.00334 1.06131 -0.242339 1.01875 1.14646 -0.194098 0.903815 1.19807 -0.132348 0.659245 1.207 -0.0618362 0.328941 1.16922 0.0107725 -0.011886 1.08755 0.0779265 -0.286079 0.971949 0.132807 -0.446097 0.837636 0.171081 -0.489544 0.701262 0.191974 -0.45037 0.576798 0.198046 -0.37508 0.472892 0.193812 -0.300779 0.392556 0.183998 -0.246191 0.334612 0.17227 -0.214352 0.295693 0.160776 -0.200006 0.271877 0.150328 -0.19569 0.259598 0.140888 -0.194873 0.255961 0.132055 -0.192984 0.258703 0.123407 -0.187486 0.266041 0.114671 -0.177619 0.276535 0.105764 -0.163958 0.28901 0.0967565 -0.147868 0.302513 0.0878067 -0.130924 0.316304 0.0791 -0.114506 0.329841 0.070805 -0.0995606 0.34276 0.0630502 -0.0865712 0.354845 0.0559169 -0.0756403 0.365992 0.0494425 -0.0666224 0.316874 -0.0231566 0.0260566 0.307163 -0.0280162 0.0287381 0.297068 -0.0337228 0.0323182 0.286795 -0.0404352 0.0371265 0.276676 -0.0483393 0.0435381 0.267205 -0.0576515 0.0519291 0.259077 -0.0686213 0.0626374 0.253233 -0.0815331 0.0759715 0.250906 -0.0967011 0.0923309 0.253678 -0.11445 0.112536 0.263551 -0.135069 0.138528 0.283013 -0.15872 0.174494 0.315071 -0.185291 0.228392 0.363144 -0.21418 0.31326 0.430706 -0.244057 0.446876 0.520541 -0.272658 0.647479 0.633612 -0.296746 0.923509 0.767744 -0.312349 1.25838 0.916564 -0.31533 1.59724 1.06919 -0.302183 1.84739 1.21093 -0.270836 1.90191 1.32495 -0.221288 1.68352 1.39456 -0.156015 1.19022 1.40621 -0.0801332 0.515967 1.35288 -0.0012077 -0.172931 1.23729 0.0716726 -0.702791 1.07343 0.129839 -0.967395 0.884325 0.167627 -0.968076 0.69586 0.184293 -0.793782 0.529266 0.183891 -0.56012 0.396323 0.173109 -0.353661 0.299211 0.158489 -0.212006 0.233704 0.144573 -0.135055 0.193041 0.133458 -0.105932 0.17065 0.125342 -0.105817 0.161353 0.119392 -0.119821 0.161477 0.114484 -0.137606 0.168489 0.109672 -0.152566 0.18054 0.104367 -0.161152 0.196159 0.0983472 -0.162342 0.214089 0.0916633 -0.156983 0.233249 0.084527 -0.146952 0.252743 0.077209 -0.134378 0.271878 0.0699693 -0.121087 0.290165 0.0630192 -0.108346 0.3073 0.0565077 -0.0968553 0.323126 0.050524 -0.0868748 0.301927 -0.0164894 0.0344495 0.291124 -0.0204452 0.0377393 0.279801 -0.0251503 0.0421014 0.268164 -0.0307648 0.0478939 0.256553 -0.0374827 0.0555092 0.245487 -0.0455379 0.0653179 0.235708 -0.0552117 0.0776376 0.228232 -0.0668377 0.092784 0.224419 -0.0808023 0.111324 0.226061 -0.0975281 0.134689 0.235511 -0.117428 0.16645 0.25584 -0.140808 0.214456 0.290944 -0.167694 0.293831 0.345492 -0.197591 0.429801 0.424472 -0.229179 0.657613 0.532142 -0.260074 1.01473 0.67036 -0.286783 1.52093 0.83666 -0.30503 2.14812 1.02283 -0.310469 2.79394 1.21471 -0.299586 3.28293 1.39346 -0.270464 3.41234 1.53764 -0.223227 3.03484 1.6258 -0.160254 2.14307 1.63965 -0.0863675 0.909392 1.56823 -0.0089418 -0.352462 1.41297 0.0625701 -1.30567 1.19157 0.118472 -1.73852 0.936414 0.152038 -1.6555 0.685591 0.162435 -1.24389 0.470098 0.154969 -0.744507 0.30542 0.138175 -0.329404 0.191732 0.11997 -0.0621511 0.120033 0.105289 0.0706745 0.0788378 0.0958182 0.110629 0.0583007 0.0909806 0.0965616 0.0515574 0.0891594 0.0555954 0.0543893 0.0886214 0.0051133 0.0642986 0.0880159 -0.0436404 0.0796507 0.0865345 -0.0836638 0.0991294 0.0838635 -0.111596 0.121503 0.0800457 -0.127191 0.145594 0.0753284 -0.132354 0.170339 0.0700382 -0.130004 0.194855 0.0644958 -0.123085 0.218481 0.0589694 -0.113986 0.24078 0.0536572 -0.104342 0.261502 0.0486887 -0.0951019 0.314774 -0.010762 0.0417606 0.303494 -0.0136203 0.0458647 0.291585 -0.0170657 0.051372 0.279252 -0.0212389 0.0587695 0.26684 -0.0263145 0.0686094 0.25489 -0.0325074 0.0814611 0.244181 -0.0400809 0.0978992 0.235795 -0.0493519 0.118616 0.231208 -0.0606913 0.144836 0.232409 -0.0745101 0.179263 0.242094 -0.0912157 0.228076 0.263902 -0.111121 0.304307 0.302622 -0.134285 0.432707 0.364169 -0.160277 0.654489 0.455016 -0.187893 1.02737 0.580776 -0.214938 1.61266 0.743907 -0.238226 2.44194 0.941172 -0.253961 3.46681 1.16204 -0.258491 4.51722 1.38899 -0.249122 5.30794 1.59943 -0.224648 5.51678 1.76834 -0.185483 4.91511 1.87068 -0.133638 3.49458 1.88412 -0.072852 1.52673 1.79355 -0.0089471 -0.490301 1.59797 0.050129 -2.00768 1.31742 0.0955715 -2.6671 0.993584 0.120816 -2.46978 0.678083 0.124938 -1.73802 0.413121 0.113334 -0.889821 0.217999 0.0946682 -0.214922 0.0898325 0.076648 0.194495 0.0136626 0.0636408 0.378632 -0.0273721 0.0566767 0.417561 -0.0464956 0.0546734 0.377815 -0.0520502 0.0557302 0.300789 -0.0484993 0.0580005 0.210232 -0.0380176 0.0601128 0.120953 -0.0218025 0.0612661 0.0428618 -0.0008555 0.0611498 -0.0182979 0.0237174 0.0597957 -0.060868 0.0506992 0.0574291 -0.0864749 0.0788827 0.0543513 -0.0986745 0.107201 0.0508612 -0.101521 0.134809 0.0472126 -0.0986323 0.161116 0.0435976 -0.0927373 0.185759 0.0401472 -0.0856404 0.360101 -0.0055917 0.0437718 0.348896 -0.0071319 0.0488055 0.33696 -0.0090084 0.0558037 0.324488 -0.0113083 0.0655371 0.311827 -0.014141 0.0789459 0.299525 -0.0176424 0.0971094 0.288386 -0.0219793 0.121258 0.279541 -0.0273525 0.152936 0.274549 -0.0339954 0.194532 0.275553 -0.0421636 0.250506 0.285512 -0.0521063 0.329946 0.308504 -0.0640073 0.451008 0.350002 -0.0778838 0.647344 0.416868 -0.0934385 0.974402 0.516671 -0.109889 1.50923 0.655939 -0.12584 2.33225 0.837331 -0.139319 3.48089 1.05666 -0.148065 4.88116 1.30133 -0.150022 6.29484 1.55121 -0.143823 7.33557 1.78131 -0.129016 7.58002 1.96458 -0.106019 6.73766 2.07396 -0.0760114 4.80772 2.08451 -0.0410235 2.15163 1.9779 -0.0042333 -0.570425 1.75054 0.0298009 -2.61941 1.4234 0.0557167 -3.49709 1.04501 0.0692769 -3.19517 0.678265 0.0697955 -2.16361 0.374908 0.060807 -0.993598 0.157232 0.0480075 -0.0882257 0.0192852 0.0363292 0.437394 -0.059215 0.0283806 0.654627 -0.0996214 0.0245823 0.683372 -0.117791 0.0240629 0.616757 -0.123093 0.0255147 0.508204 -0.120037 0.0277288 0.385372 -0.110419 0.0298294 0.26445 -0.0949993 0.0313132 0.156706 -0.0744537 0.0319845 0.0693725 -0.0497296 0.0318591 0.0052003 -0.022029 0.0310707 -0.0370732 0.0073632 0.0297994 -0.0613309 0.0372571 0.0282247 -0.0723949 0.0666801 0.0265005 -0.0747953 0.0949242 0.0247446 -0.0721175 0.121539 0.023039 -0.0668618 0.390575 0 0.0427471 0.379528 0 0.0482661 0.367696 0 0.0560993 0.355271 0 0.067208 0.342594 0 0.082791 0.330216 0 0.104276 0.318947 0 0.133333 0.309934 0 0.172058 0.304771 0 0.223538 0.305654 0 0.293164 0.315645 0 0.391413 0.33899 0 0.538647 0.381421 0 0.77215 0.450153 0 1.15301 0.553168 0 1.76565 0.697301 0 2.69727 0.885235 0 3.98596 1.11235 0 5.5447 1.36519 0 7.10516 1.62269 0 8.23943 1.85903 0 8.48438 2.04658 0 7.52759 2.15759 0 5.37419 2.1663 0 2.42352 2.05311 0 -0.599152 1.8133 0 -2.87592 1.46804 0 -3.84938 1.06838 0 -3.50611 0.681698 0 -2.34929 0.363587 0 -1.04497 0.13749 0 -0.0450679 -0.0038958 0 0.526472 -0.083033 0 0.755322 -0.123057 0 0.778859 -0.140837 0 0.701518 -0.146114 0 0.581484 -0.143401 0 0.447545 -0.134333 0 0.31599 -0.119489 0 0.198323 -0.0994083 0 0.102151 -0.0749677 0 0.0305976 -0.0473514 0 -0.0173892 -0.0178634 0 -0.0457772 0.0122678 0 -0.0596335 0.0420255 0 -0.063792 0.0706633 0 -0.062136 0.0976985 0 -0.0574058 0.360101 0.0055917 0.0437718 0.348896 0.0071319 0.0488055 0.33696 0.0090084 0.0558037 0.324488 0.0113083 0.0655371 0.311827 0.014141 0.0789459 0.299525 0.0176424 0.0971094 0.288386 0.0219793 0.121258 0.279541 0.0273525 0.152936 0.274549 0.0339954 0.194532 0.275553 0.0421636 0.250506 0.285512 0.0521063 0.329946 0.308504 0.0640073 0.451008 0.350002 0.0778838 0.647344 0.416868 0.0934385 0.974402 0.516671 0.109889 1.50923 0.655939 0.12584 2.33225 0.837331 0.139319 3.48089 1.05666 0.148065 4.88116 1.30133 0.150022 6.29484 1.55121 0.143823 7.33557 1.78131 0.129016 7.58002 1.96458 0.106019 6.73766 2.07396 0.0760114 4.80772 2.08451 0.0410235 2.15163 1.9779 0.0042333 -0.570425 1.75054 -0.0298009 -2.61941 1.4234 -0.0557167 -3.49709 1.04501 -0.0692769 -3.19517 0.678265 -0.0697955 -2.16361 0.374908 -0.060807 -0.993598 0.157232 -0.0480075 -0.0882257 0.0192852 -0.0363292 0.437394 -0.059215 -0.0283806 0.654627 -0.0996214 -0.0245823 0.683372 -0.117791 -0.0240629 0.616757 -0.123093 -0.0255147 0.508204 -0.120037 -0.0277288 0.385372 -0.110419 -0.0298294 0.26445 -0.0949993 -0.0313132 0.156706 -0.0744537 -0.0319845 0.0693725 -0.0497296 -0.0318591 0.0052003 -0.022029 -0.0310707 -0.0370732 0.0073632 -0.0297994 -0.0613309 0.0372571 -0.0282247 -0.0723949 0.0666801 -0.0265005 -0.0747953 0.0949242 -0.0247446 -0.0721175 0.121539 -0.023039 -0.0668618 0.314774 0.010762 0.0417606 0.303494 0.0136203 0.0458647 0.291585 0.0170657 0.051372 0.279252 0.0212389 0.0587695 0.26684 0.0263145 0.0686094 0.25489 0.0325074 0.0814611 0.244181 0.0400809 0.0978992 0.235795 0.0493519 0.118616 0.231208 0.0606913 0.144836 0.232409 0.0745101 0.179263 0.242094 0.0912157 0.228076 0.263902 0.111121 0.304307 0.302622 0.134285 0.432707 0.364169 0.160277 0.654489 0.455016 0.187893 1.02737 0.580776 0.214938 1.61266 0.743907 0.238226 2.44194 0.941172 0.253961 3.46681 1.16204 0.258491 4.51722 1.38899 0.249122 5.30794 1.59943 0.224648 5.51678 1.76834 0.185483 4.91511 1.87068 0.133638 3.49458 1.88412 0.072852 1.52673 1.79355 0.0089471 -0.490301 1.59797 -0.050129 -2.00768 1.31742 -0.0955715 -2.6671 0.993584 -0.120816 -2.46978 0.678083 -0.124938 -1.73802 0.413121 -0.113334 -0.889821 0.217999 -0.0946682 -0.214922 0.0898325 -0.076648 0.194495 0.0136626 -0.0636408 0.378632 -0.0273721 -0.0566767 0.417561 -0.0464956 -0.0546734 0.377815 -0.0520502 -0.0557302 0.300789 -0.0484993 -0.0580005 0.210232 -0.0380176 -0.0601128 0.120953 -0.0218025 -0.0612661 0.0428618 -0.0008555 -0.0611498 -0.0182979 0.0237174 -0.0597957 -0.060868 0.0506992 -0.0574291 -0.0864749 0.0788827 -0.0543513 -0.0986745 0.107201 -0.0508612 -0.101521 0.134809 -0.0472126 -0.0986323 0.161116 -0.0435976 -0.0927373 0.185759 -0.0401472 -0.0856404 0.301927 0.0164894 0.0344495 0.291124 0.0204452 0.0377393 0.279801 0.0251503 0.0421014 0.268164 0.0307648 0.0478939 0.256553 0.0374827 0.0555092 0.245487 0.0455379 0.0653179 0.235708 0.0552117 0.0776376 0.228232 0.0668377 0.092784 0.224419 0.0808023 0.111324 0.226061 0.0975281 0.134689 0.235511 0.117428 0.16645 0.25584 0.140808 0.214456 0.290944 0.167694 0.293831 0.345492 0.197591 0.429801 0.424472 0.229179 0.657613 0.532142 0.260074 1.01473 0.67036 0.286783 1.52093 0.83666 0.30503 2.14812 1.02283 0.310469 2.79394 1.21471 0.299586 3.28293 1.39346 0.270464 3.41234 1.53764 0.223227 3.03484 1.6258 0.160254 2.14307 1.63965 0.0863675 0.909392 1.56823 0.0089418 -0.352462 1.41297 -0.0625701 -1.30567 1.19157 -0.118472 -1.73852 0.936414 -0.152038 -1.6555 0.685591 -0.162435 -1.24389 0.470098 -0.154969 -0.744507 0.30542 -0.138175 -0.329404 0.191732 -0.11997 -0.0621511 0.120033 -0.105289 0.0706745 0.0788378 -0.0958182 0.110629 0.0583007 -0.0909806 0.0965616 0.0515574 -0.0891594 0.0555954 0.0543893 -0.0886214 0.0051133 0.0642986 -0.0880159 -0.0436404 0.0796507 -0.0865345 -0.0836638 0.0991294 -0.0838635 -0.111596 0.121503 -0.0800457 -0.127191 0.145594 -0.0753284 -0.132354 0.170339 -0.0700382 -0.130004 0.194855 -0.0644958 -0.123085 0.218481 -0.0589694 -0.113986 0.24078 -0.0536572 -0.104342 0.261502 -0.0486887 -0.0951019 0.316874 0.0231566 0.0260566 0.307163 0.0280162 0.0287381 0.297068 0.0337228 0.0323182 0.286795 0.0404352 0.0371265 0.276676 0.0483393 0.0435381 0.267205 0.0576515 0.0519291 0.259077 0.0686213 0.0626374 0.253233 0.0815331 0.0759715 0.250906 0.0967011 0.0923309 0.253678 0.11445 0.112536 0.263551 0.135069 0.138528 0.283013 0.15872 0.174494 0.315071 0.185291 0.228392 0.363144 0.21418 0.31326 0.430706 0.244057 0.446876 0.520541 0.272658 0.647479 0.633612 0.296746 0.923509 0.767744 0.312349 1.25838 0.916564 0.31533 1.59724 1.06919 0.302183 1.84739 1.21093 0.270836 1.90191 1.32495 0.221288 1.68352 1.39456 0.156015 1.19022 1.40621 0.0801332 0.515967 1.35288 0.0012077 -0.172931 1.23729 -0.0716726 -0.702791 1.07343 -0.129839 -0.967395 0.884325 -0.167627 -0.968076 0.69586 -0.184293 -0.793782 0.529266 -0.183891 -0.56012 0.396323 -0.173109 -0.353661 0.299211 -0.158489 -0.212006 0.233704 -0.144573 -0.135055 0.193041 -0.133458 -0.105932 0.17065 -0.125342 -0.105817 0.161353 -0.119392 -0.119821 0.161477 -0.114484 -0.137606 0.168489 -0.109672 -0.152566 0.18054 -0.104367 -0.161152 0.196159 -0.0983472 -0.162342 0.214089 -0.0916633 -0.156983 0.233249 -0.084527 -0.146952 0.252743 -0.077209 -0.134378 0.271878 -0.0699693 -0.121087 0.290165 -0.0630192 -0.108346 0.3073 -0.0565077 -0.0968553 0.323126 -0.050524 -0.0868748 0.341636 0.0300695 0.0195154 0.33339 0.0355894 0.021705 0.324923 0.0419964 0.0246388 0.316442 0.0494359 0.0286187 0.30826 0.0580706 0.0340069 0.300839 0.0680805 0.0411938 0.294815 0.0796601 0.0505606 0.291034 0.093014 0.0624637 0.290585 0.108346 0.0772741 0.294826 0.125834 0.0955129 0.305411 0.14559 0.118182 0.324293 0.167578 0.147274 0.353695 0.191499 0.186429 0.395974 0.216636 0.24139 0.453333 0.241682 0.319643 0.5273 0.264609 0.428249 0.617998 0.282658 0.569156 0.723305 0.29253 0.732608 0.838185 0.290818 0.891757 0.954465 0.274641 1.00334 1.06131 0.242339 1.01875 1.14646 0.194098 0.903815 1.19807 0.132348 0.659245 1.207 0.0618362 0.328941 1.16922 -0.0107725 -0.011886 1.08755 -0.0779265 -0.286079 0.971949 -0.132807 -0.446097 0.837636 -0.171081 -0.489544 0.701262 -0.191974 -0.45037 0.576798 -0.198046 -0.37508 0.472892 -0.193812 -0.300779 0.392556 -0.183998 -0.246191 0.334612 -0.17227 -0.214352 0.295693 -0.160776 -0.200006 0.271877 -0.150328 -0.19569 0.259598 -0.140888 -0.194873 0.255961 -0.132055 -0.192984 0.258703 -0.123407 -0.187486 0.266041 -0.114671 -0.177619 0.276535 -0.105764 -0.163958 0.28901 -0.0967565 -0.147868 0.302513 -0.0878067 -0.130924 0.316304 -0.0791 -0.114506 0.329841 -0.070805 -0.0995606 0.34276 -0.0630502 -0.0865712 0.354845 -0.0559169 -0.0756403 0.365992 -0.0494425 -0.0666224 0.366098 0.0362879 0.0152912 0.359453 0.0421732 0.0170515 0.352759 0.0489289 0.0193858 0.346213 0.0566779 0.0225461 0.340111 0.065551 0.0268465 0.334864 0.0756829 0.0326418 0.331034 0.0872055 0.0402995 0.329353 0.100238 0.0501717 0.330741 0.11487 0.0625893 0.336318 0.131139 0.077895 0.347396 0.148988 0.0965665 0.365452 0.168204 0.119409 0.39206 0.188337 0.147799 0.428756 0.2086 0.183809 0.476806 0.227759 0.229954 0.536849 0.244077 0.288225 0.608439 0.255336 0.358179 0.689554 0.259001 0.434459 0.77622 0.25255 0.504952 0.862438 0.233945 0.551419 0.940561 0.202167 0.554069 1.00217 0.157683 0.49939 1.03943 0.102733 0.387895 1.04658 0.0412908 0.237015 1.02143 -0.021375 0.076277 0.966246 -0.0795683 -0.0637566 0.887562 -0.128309 -0.163025 0.79492 -0.164401 -0.217574 0.6987 -0.187002 -0.236834 0.607913 -0.197454 -0.235809 0.528754 -0.198489 -0.22757 0.464242 -0.193227 -0.219607 0.414776 -0.184379 -0.21406 0.379075 -0.173859 -0.209869 0.355076 -0.162775 -0.204917 0.34055 -0.151628 -0.197378 0.333425 -0.140578 -0.186313 0.3319 -0.129649 -0.171759 0.33446 -0.118859 -0.154541 0.33985 -0.108268 -0.135931 0.347051 -0.0979771 -0.117289 0.355263 -0.0881102 -0.0997626 0.363879 -0.0787836 -0.0841295 0.372471 -0.0700898 -0.0707651 0.380753 -0.0620882 -0.0597061 0.388557 -0.0548044 -0.0507631 0.395801 -0.0482349 -0.0436282 0.386173 0.0411573 0.0128795 0.381069 0.0471091 0.0142452 0.376071 0.0538641 0.0160108 0.371365 0.061517 0.0183638 0.367214 0.0701622 0.0215447 0.363975 0.0798873 0.0258352 0.362122 0.0907636 0.0315365 0.362258 0.102834 0.038944 0.365123 0.116093 0.0483224 0.371596 0.130468 0.0598943 0.382668 0.14578 0.0738632 0.399408 0.161703 0.0904707 0.422879 0.177711 0.110068 0.45402 0.193018 0.133145 0.493475 0.206529 0.16021 0.541345 0.216829 0.191421 0.596924 0.222225 0.2259 0.658419 0.220893 0.260908 0.722783 0.211121 0.291322 0.785734 0.191644 0.309968 0.84206 0.161998 0.309327 0.886231 0.122835 0.284251 0.913258 0.0760635 0.234583 0.919646 0.024762 0.166184 0.904203 -0.0271936 0.0893789 0.868452 -0.075748 0.0154123 0.816441 -0.117391 -0.0472937 0.753961 -0.14978 -0.0951203 0.687377 -0.172054 -0.128839 0.622451 -0.184741 -0.151519 0.563522 -0.189345 -0.166351 0.513193 -0.187798 -0.17544 0.472479 -0.181983 -0.179632 0.441207 -0.173449 -0.179049 0.418476 -0.16332 -0.173683 0.403034 -0.152342 -0.163817 0.393534 -0.140991 -0.150191 0.388686 -0.129573 -0.133925 0.387333 -0.118308 -0.116346 0.388482 -0.107366 -0.0987442 0.391318 -0.0968884 -0.0821881 0.395199 -0.0869861 -0.0674045 0.39964 -0.0777409 -0.054764 0.404297 -0.0692027 -0.04433 0.408937 -0.0613919 -0.0359494 0.413418 -0.0543034 -0.029347 0.417661 -0.0479129 -0.0242047 0.401096 0.0443973 0.0116113 0.397359 0.0501612 0.0126224 0.393852 0.056625 0.0138785 0.390743 0.0638539 0.0155032 0.388258 0.0719059 0.0176608 0.386699 0.0808251 0.0205487 0.386446 0.0906312 0.0243833 0.387974 0.101307 0.0293811 0.391852 0.112782 0.0357345 0.398731 0.124912 0.0435852 0.409326 0.137452 0.053013 0.424367 0.150032 0.0640382 0.444533 0.162123 0.0766344 0.470356 0.17301 0.0907341 0.502097 0.18178 0.106188 0.53959 0.187336 0.122652 0.582085 0.18845 0.139383 0.628112 0.183885 0.155004 0.675424 0.172562 0.167379 0.721052 0.153784 0.173768 0.761542 0.127459 0.171376 0.793353 0.0942671 0.158242 0.813379 0.0557295 0.134044 0.819502 0.0141037 0.100521 0.811026 -0.027881 0.0610786 0.788865 -0.0674211 0.0198239 0.75542 -0.102076 -0.0195285 0.714135 -0.130127 -0.054389 0.668879 -0.150763 -0.0834351 0.623312 -0.164052 -0.106219 0.580408 -0.170738 -0.12275 0.542213 -0.171952 -0.13317 0.509838 -0.168942 -0.137693 0.483605 -0.162872 -0.136695 0.463262 -0.15472 -0.130802 0.448203 -0.145256 -0.120936 0.437643 -0.135061 -0.108245 0.430744 -0.124567 -0.093975 0.426704 -0.114094 -0.0793127 0.424808 -0.103879 -0.0652452 0.424448 -0.0940928 -0.0524789 0.425138 -0.0848522 -0.0414152 0.426504 -0.0762309 -0.0321881 0.428271 -0.0682664 -0.0247295 0.430249 -0.0609678 -0.0188459 0.43231 -0.0543227 -0.0142857 0.434376 -0.0483041 -0.0107901 0.411449 0.0460413 0.0109398 0.408843 0.0514318 0.0116442 0.406551 0.0574011 0.0124711 0.404723 0.0639863 0.0134924 0.403547 0.0712134 0.014807 0.403267 0.0790907 0.0165371 0.40418 0.0875991 0.0188201 0.406643 0.096681 0.0217961 0.411074 0.106227 0.0255906 0.417933 0.11606 0.0302905 0.427707 0.125918 0.0359262 0.44087 0.135439 0.0424577 0.457826 0.144143 0.0497696 0.478845 0.15143 0.0576727 0.503974 0.15658 0.0658914 0.532945 0.158781 0.0740481 0.56509 0.157182 0.0816151 0.599277 0.150982 0.0878678 0.633901 0.139545 0.091879 0.666957 0.122538 0.0925751 0.696194 0.100058 0.0889216 0.719373 0.0727201 0.0801834 0.73457 0.0416739 0.0661951 0.740483 0.0085213 0.0475087 0.736664 -0.0248587 0.0253481 0.723618 -0.0565528 0.0013739 0.702722 -0.0848695 -0.0226287 0.675997 -0.10855 -0.0450336 0.64578 -0.126886 -0.0645368 0.614375 -0.139724 -0.0801857 0.583778 -0.147373 -0.0913909 0.555502 -0.150463 -0.0978935 0.530522 -0.149783 -0.0997674 0.509317 -0.146159 -0.0974074 0.491958 -0.140361 -0.0914906 0.478227 -0.133061 -0.0829009 0.467726 -0.124812 -0.0726227 0.459968 -0.11606 -0.0616165 0.454449 -0.107147 -0.050716 0.450693 -0.0983292 -0.0405549 0.448281 -0.0897931 -0.0315408 0.446866 -0.0816645 -0.0238658 0.446171 -0.0740227 -0.0175503 0.445985 -0.0669099 -0.0124957 0.446153 -0.0603409 -0.0085379 0.446563 -0.0543112 -0.0054875 0.447138 -0.0488025 -0.0031614 0.41864 0.0463099 0.0104662 0.416926 0.0512151 0.0109213 0.415575 0.0565759 0.0114134 0.414714 0.0624061 0.0119778 0.414499 0.0687065 0.0126661 0.415119 0.0754589 0.0135448 0.416799 0.0826186 0.0146903 0.4198 0.0901057 0.0161827 0.424414 0.0977946 0.018095 0.430954 0.105504 0.0204767 0.439735 0.112986 0.0233388 0.451043 0.119918 0.0266416 0.465101 0.1259 0.0302822 0.482016 0.130453 0.034098 0.501731 0.133036 0.0378614 0.523965 0.133073 0.0412866 0.548174 0.129993 0.0440308 0.573523 0.123299 0.045697 0.598897 0.112638 0.045853 0.622961 0.0978831 0.0440608 0.644264 0.0792059 0.0399415 0.661394 0.0571146 0.0332692 0.673151 0.0324516 0.0240315 0.67872 0.0063342 0.0125203 0.677793 -0.0199554 -0.0006937 0.670622 -0.0451145 -0.0148035 0.65798 -0.067971 -0.0288802 0.641042 -0.0876087 -0.041961 0.621208 -0.103445 -0.0532054 0.599918 -0.115247 -0.0619282 0.578485 -0.123097 -0.0676874 0.557978 -0.127318 -0.0703117 0.539172 -0.128392 -0.0698976 0.522536 -0.126872 -0.0667918 0.508273 -0.123323 -0.0615256 0.496377 -0.118272 -0.0547478 0.486691 -0.112185 -0.0471323 0.478971 -0.105454 -0.0392973 0.472932 -0.0983967 -0.0317497 0.468286 -0.0912576 -0.0248491 0.464765 -0.0842203 -0.0188056 0.462136 -0.0774144 -0.0136983 0.460203 -0.0709266 -0.0095072 0.458813 -0.0648095 -0.006148 0.457842 -0.0590904 -0.0035043 0.457198 -0.0537778 -0.00145 0.456809 -0.0488675 0.0001322 0.423916 0.0455096 0.0099874 0.422881 0.0498794 0.0102497 0.422228 0.0545908 0.0104958 0.422062 0.0596401 0.0107378 0.422508 0.0650102 0.0109977 0.42371 0.0706663 0.0113053 0.425834 0.0765498 0.011697 0.429065 0.0825719 0.0122117 0.433601 0.0886075 0.0128864 0.439645 0.0944881 0.0137455 0.44739 0.0999968 0.0147923 0.456997 0.104865 0.0160003 0.468572 0.108775 0.0173024 0.482132 0.111362 0.018594 0.497575 0.112236 0.0197286 0.514651 0.110999 0.0205302 0.532935 0.10728 0.0207942 0.551829 0.100779 0.0203081 0.570568 0.0913131 0.0188676 0.58827 0.0788627 0.0162933 0.603999 0.0636086 0.0124625 0.616859 0.0459496 0.0073421 0.626095 0.026493 0.0010058 0.631185 0.006014 -0.0063371 0.631908 -0.0146119 -0.0143371 0.628378 -0.0344959 -0.0225511 0.62102 -0.0528238 -0.03046 0.610511 -0.0689332 -0.0375373 0.597687 -0.0823646 -0.0433168 0.583441 -0.0928796 -0.04743 0.568624 -0.100451 -0.0496618 0.553971 -0.105226 -0.0499664 0.540061 -0.107484 -0.0484667 0.527292 -0.107579 -0.0454275 0.515899 -0.105901 -0.0412161 0.505973 -0.102837 -0.0362453 0.497495 -0.098747 -0.0309242 0.490371 -0.0939478 -0.0256105 0.484463 -0.0887062 -0.0205848 0.479615 -0.0832378 -0.0160351 0.47567 -0.0777105 -0.0120622 0.472482 -0.0722495 -0.008694 0.469922 -0.0669446 -0.0059053 0.46788 -0.0618568 -0.0036376 0.466264 -0.0570243 -0.0018185 0.465002 -0.052469 -0.0003712 0.464031 -0.0482 0.0007741 0.428277 0.0439416 0.0094192 0.427749 0.0477715 0.0095407 0.427599 0.0518447 0.0096168 0.427913 0.0561457 0.0096476 0.428787 0.0606465 0.0096382 0.430331 0.0653032 0.0095982 0.432664 0.0700523 0.0095403 0.435913 0.0748064 0.0094792 0.44021 0.0794499 0.0094303 0.445681 0.083836 0.009403 0.452436 0.0877843 0.0093971 0.460557 0.0910809 0.0093985 0.470079 0.0934819 0.0093693 0.480974 0.0947208 0.0092548 0.493129 0.0945213 0.0089752 0.506332 0.0926157 0.0084367 0.520264 0.0887688 0.0075329 0.534499 0.0828051 0.0061622 0.548514 0.0746386 0.0042335 0.561725 0.0642983 0.0016843 0.573526 0.0519478 -0.0015083 0.583341 0.0378909 -0.0053058 0.590688 0.0225626 -0.0096257 0.595224 0.0065016 -0.0143012 0.59679 -0.0096916 -0.019116 0.595428 -0.025406 -0.0238075 0.591365 -0.0400746 -0.028096 0.584992 -0.0532208 -0.031696 0.576807 -0.0644925 -0.0343898 0.567361 -0.0736776 -0.0360062 0.557202 -0.0807037 -0.0364716 0.546828 -0.0856217 -0.0358081 0.536654 -0.0885809 -0.0341302 0.526998 -0.0897984 -0.0316214 0.518075 -0.0895305 -0.0285112 0.510011 -0.0880464 -0.0250441 0.502855 -0.0856085 -0.0214518 0.496598 -0.0824576 -0.017928 0.491192 -0.0788054 -0.014621 0.486566 -0.0748301 -0.0116254 0.482637 -0.0706769 -0.0089893 0.479322 -0.0664599 -0.0067221 0.476541 -0.062266 -0.0048059 0.474222 -0.0581596 -0.003206 0.4723 -0.054186 -0.0018818 0.470718 -0.0503764 -0.0007901 0.469428 -0.0467503 0.0001076 0.432182 0.0418689 0.0087762 0.432024 0.0451838 0.0087982 0.432225 0.0486616 0.0087617 0.432853 0.0522796 0.0086615 0.433984 0.0560043 0.0084945 0.435696 0.0597891 0.0082602 0.438076 0.0635717 0.0079598 0.441209 0.0672714 0.0075951 0.445179 0.0707871 0.0071706 0.45006 0.073996 0.0066875 0.455911 0.0767531 0.0061446 0.462766 0.0788933 0.0055357 0.470621 0.0802346 0.0048425 0.479427 0.0805857 0.004042 0.489078 0.0797556 0.0030986 0.499401 0.0775678 0.0019734 0.510158 0.0738755 0.0006205 0.521044 0.0685802 -0.0009974 0.531702 0.0616486 -0.0029116 0.54174 0.0531278 -0.0051286 0.550758 0.0431547 -0.0076365 0.558382 0.0319573 -0.0103875 0.564296 0.0198468 -0.0133045 0.568273 0.0071999 -0.0162785 0.570197 -0.0055678 -0.0191738 0.570071 -0.0180336 -0.0218419 0.568018 -0.0297998 -0.0241314 0.564261 -0.0405236 -0.0259059 0.559099 -0.0499389 -0.027064 0.552873 -0.0578689 -0.0275394 0.545935 -0.0642286 -0.027326 0.53862 -0.0690179 -0.0264597 0.531222 -0.0723085 -0.0250307 0.523982 -0.074226 -0.0231542 0.517083 -0.0749317 -0.0209689 0.510651 -0.0746052 -0.0186122 0.504759 -0.0734298 -0.0162111 0.499443 -0.0715811 -0.0138685 0.494704 -0.0692198 -0.0116628 0.49052 -0.0664869 -0.0096428 0.486859 -0.0635023 -0.0078336 0.483677 -0.0603647 -0.0062403 0.480929 -0.057154 -0.004854 0.478572 -0.0539323 -0.003657 0.476561 -0.0507477 -0.0026295 0.474857 -0.0476358 -0.0017487 0.473423 -0.0446229 -0.000995 0.435883 0.039494 0.0080874 0.435989 0.0423358 0.008042 0.436426 0.0452774 0.007935 0.437249 0.0482928 0.0077594 0.438512 0.0513471 0.0075093 0.440275 0.0543948 0.0071802 0.442597 0.0573782 0.0067687 0.445534 0.0602264 0.0062712 0.449139 0.062854 0.0056876 0.453452 0.0651612 0.0050159 0.458501 0.0670343 0.0042549 0.464291 0.0683481 0.0034033 0.470799 0.0689694 0.0024539 0.477972 0.0687627 0.0014011 0.485713 0.0675978 0.0002329 0.493887 0.0653596 -0.0010595 0.502315 0.0619586 -0.0024885 0.510777 0.0573421 -0.0040596 0.519026 0.0515047 -0.0057727 0.526794 0.044497 -0.0076161 0.533815 0.0364291 -0.0095625 0.539839 0.0274713 -0.0115657 0.544656 0.0178472 -0.0135781 0.54811 0.0078222 -0.0155177 0.550116 -0.0023136 -0.0173123 0.550663 -0.0122641 -0.0188751 0.549813 -0.0217485 -0.0201371 0.547695 -0.0305194 -0.0210234 0.544489 -0.0383773 -0.0215033 0.540409 -0.0451795 -0.0215536 0.535681 -0.0508438 -0.0211854 0.530532 -0.0553455 -0.0204341 0.525167 -0.0587106 -0.0193595 0.519767 -0.0610064 -0.0180334 0.514476 -0.0623299 -0.0165351 0.509408 -0.0627963 -0.0149405 0.504642 -0.0625297 -0.0133203 0.500226 -0.061654 -0.0117303 0.496188 -0.0602872 -0.0102138 0.492533 -0.0585375 -0.0087983 0.489258 -0.0565002 -0.0074993 0.486344 -0.0542579 -0.0063222 0.483772 -0.0518798 -0.0052654 0.481516 -0.0494231 -0.0043213 0.479549 -0.046934 -0.0034824 0.477846 -0.0444495 -0.0027378 0.47638 -0.0419984 -0.0020786 0.439382 0.0369711 0.0073964 0.439669 0.0393897 0.0073064 0.440257 0.0418603 0.0071568 0.441184 0.0443563 0.0069408 0.442494 0.0468439 0.0066521 0.444229 0.0492811 0.0062853 0.446428 0.0516169 0.0058362 0.449128 0.0537907 0.0052993 0.452361 0.0557322 0.0046736 0.456145 0.057362 0.0039561 0.46049 0.0585922 0.0031461 0.465387 0.0593291 0.0022455 0.470805 0.0594762 0.0012524 0.476692 0.0589385 0.0001694 0.482966 0.0576282 -0.0010027 0.489521 0.0554712 -0.0022584 0.496221 0.0524142 -0.0035957 0.502908 0.0484313 -0.0050052 0.509406 0.0435308 -0.0064735 0.51553 0.0377592 -0.0079805 0.521097 0.0312039 -0.0095032 0.525938 0.0239916 -0.0110015 0.529907 0.0162839 -0.0124425 0.532898 0.0082698 -0.0137816 0.534845 0.0001546 -0.0149687 0.535733 -0.0078526 -0.0159638 0.535592 -0.0155511 -0.0167269 0.534497 -0.0227607 -0.0172257 0.532557 -0.0293316 -0.0174518 0.529908 -0.0351504 -0.0173992 0.526696 -0.0401434 -0.0170822 0.523076 -0.0442759 -0.0165271 0.519192 -0.0475492 -0.0157719 0.515176 -0.0499948 -0.0148575 0.511142 -0.0516677 -0.0138327 0.507184 -0.0526396 -0.0127406 0.503373 -0.0529918 -0.0116212 0.499763 -0.0528096 -0.0105057 0.496388 -0.0521777 -0.0094215 0.49327 -0.0511768 -0.0083857 0.490418 -0.0498808 -0.0074099 0.487832 -0.0483561 -0.0065007 0.485505 -0.046661 -0.0056604 0.483426 -0.0448452 -0.0048874 0.48158 -0.0429509 -0.0041803 0.479953 -0.0410134 -0.0035352 0.478526 -0.0390614 -0.0029489 0.442683 0.0344074 0.0067259 0.44309 0.0364546 0.006608 0.443763 0.038519 0.0064351 0.444733 0.0405751 0.0062014 0.446031 0.0425917 0.0059013 0.447687 0.0445314 0.00553 0.449728 0.0463504 0.0050837 0.452177 0.0479981 0.0045572 0.455049 0.0494177 0.0039499 0.458354 0.0505467 0.0032594 0.462088 0.051318 0.0024853 0.466236 0.051662 0.001631 0.470767 0.0515092 0.0006978 0.475632 0.0507932 -0.0003087 0.480765 0.0494551 -0.0013835 0.486082 0.0474475 -0.0025166 0.491479 0.0447395 -0.0036998 0.496841 0.0413207 -0.0049186 0.50204 0.037205 -0.0061574 0.506947 0.0324333 -0.007399 0.511433 0.027074 -0.0086175 0.515379 0.0212219 -0.0097873 0.518686 0.0149951 -0.010885 0.521275 0.0085295 -0.0118777 0.523098 0.0019719 -0.0127386 0.524137 -0.0045273 -0.0134449 0.524408 -0.0108234 -0.0139775 0.523951 -0.016784 -0.0143209 0.522835 -0.0222963 -0.0144741 0.521147 -0.0272708 -0.0144387 0.518983 -0.0316442 -0.0142245 0.516449 -0.0353797 -0.0138501 0.513645 -0.0384655 -0.01334 0.51067 -0.0409122 -0.0127182 0.507609 -0.0427481 -0.0120137 0.504538 -0.0440158 -0.0112521 0.501519 -0.0447672 -0.0104581 0.498601 -0.0450596 -0.0096514 0.495821 -0.0449527 -0.00885 0.493204 -0.0445051 -0.0080656 0.490767 -0.0437732 -0.0073085 0.488519 -0.0428091 -0.0065853 0.486463 -0.0416599 -0.0059005 0.484595 -0.0403678 -0.0052553 0.48291 -0.0389696 -0.0046515 0.4814 -0.0374971 -0.0040889 0.480056 -0.0359772 -0.003567 0.517446 -0.0379617 0.0090547 0.517798 -0.0402499 0.0089063 0.518441 -0.0425635 0.0086848 0.519408 -0.0448755 0.0083826 0.520735 -0.0471526 0.0079919 0.522456 -0.0493549 0.0075059 0.524601 -0.0514352 0.0069193 0.527197 -0.053339 0.0062248 0.530265 -0.0550049 0.0054208 0.533817 -0.0563649 0.0045039 0.537853 -0.0573456 0.0034733 0.542358 -0.0578707 0.0023331 0.547303 -0.057863 0.0010851 0.552638 -0.0572484 -0.0002627 0.558295 -0.0559601 -0.001703 0.564184 -0.0539428 -0.0032213 0.570196 -0.0511587 -0.0048056 0.576206 -0.0475911 -0.006435 0.582077 -0.0432497 -0.0080874 0.587666 -0.038173 -0.0097386 0.592829 -0.0324293 -0.0113543 0.597435 -0.0261162 -0.0129001 0.601367 -0.0193573 -0.0143455 0.604535 -0.012297 -0.0156491 0.606876 -0.005093 -0.0167774 0.608365 0.0020916 -0.0177018 0.609006 0.0090976 -0.0183999 0.608839 0.0157776 -0.0188534 0.607929 0.0220038 -0.0190617 0.606364 0.0276726 -0.0190281 0.604248 0.0327081 -0.018765 0.601688 0.0370628 -0.0182962 0.598797 0.0407165 -0.0176521 0.59568 0.0436737 -0.0168628 0.592433 0.0459592 -0.0159645 0.589141 0.047614 -0.0149891 0.585874 0.0486906 -0.0139678 0.58269 0.0492484 -0.0129255 0.579633 0.0493502 -0.0118855 0.576734 0.0490589 -0.0108633 0.574016 0.0484354 -0.0098727 0.571491 0.0475367 -0.0089227 0.569166 0.0464152 -0.0080198 0.567041 0.0451178 -0.0071665 0.565111 0.0436859 -0.0063655 0.563369 0.0421557 -0.0056172 0.561807 0.0405582 -0.0049213 0.513766 -0.0407284 0.0099453 0.513975 -0.0434227 0.0098347 0.514508 -0.0461812 0.0096448 0.515412 -0.0489761 0.0093664 0.516733 -0.0517716 0.0089904 0.518519 -0.0545229 0.0085089 0.520815 -0.0571757 0.0079155 0.523665 -0.059665 0.007202 0.527103 -0.0619152 0.006366 0.531156 -0.0638401 0.0054027 0.535836 -0.0653447 0.0043104 0.541138 -0.0663264 0.0030916 0.547035 -0.066679 0.0017438 0.553472 -0.0662971 0.0002723 0.560369 -0.0650822 -0.0013202 0.567612 -0.0629493 -0.0030233 0.575057 -0.0598347 -0.0048305 0.582537 -0.0557037 -0.0067257 0.589859 -0.0505573 -0.0086883 0.596823 -0.0444378 -0.0106878 0.603225 -0.0374314 -0.0126918 0.608875 -0.0296678 -0.0146474 0.613608 -0.0213155 -0.0165124 0.617298 -0.0125745 -0.0182308 0.619862 -0.0036648 -0.0197422 0.62127 0.0051866 -0.020999 0.621544 0.0137592 -0.021954 0.620753 0.0218521 -0.0225717 0.619006 0.0292947 -0.0228441 0.616442 0.0359545 -0.0227662 0.613217 0.0417408 -0.0223579 0.609495 0.0466053 -0.0216521 0.605433 0.0505391 -0.0206957 0.601177 0.0535668 -0.0195385 0.596854 0.0557402 -0.0182406 0.59257 0.0571306 -0.0168537 0.588409 0.0578218 -0.0154274 0.584435 0.0579033 -0.014 0.580693 0.0574655 -0.0126061 0.577209 0.0565956 -0.0112676 0.573999 0.0553746 -0.0100001 0.571067 0.0538759 -0.008813 0.56841 0.0521645 -0.0077106 0.566019 0.0502968 -0.0066917 0.563881 0.0483211 -0.005756 0.56198 0.0462778 -0.0048992 0.560301 0.0442007 -0.0041177 0.509898 -0.0434351 0.0108577 0.509892 -0.0465906 0.0108066 0.510245 -0.0498633 0.0106727 0.511015 -0.0532263 0.0104463 0.512263 -0.0566428 0.010118 0.514057 -0.060065 0.0096803 0.516462 -0.0634318 0.009127 0.519543 -0.0666676 0.0084513 0.523358 -0.069681 0.0076506 0.527959 -0.0723647 0.0067207 0.533378 -0.0745961 0.0056588 0.539627 -0.0762391 0.0044628 0.546689 -0.0771482 0.0031245 0.554511 -0.0771741 0.0016398 0.562997 -0.0761721 -2.4e-06 0.572005 -0.0740118 -0.0018071 0.581347 -0.0705889 -0.0037827 0.590789 -0.065837 -0.0059277 0.600063 -0.0597398 -0.0082335 0.60888 -0.05234 -0.0106774 0.616943 -0.0437449 -0.0132185 0.623975 -0.0341271 -0.0157945 0.629736 -0.0237186 -0.018344 0.634042 -0.0127992 -0.0207659 0.636783 -0.0016795 -0.0229747 0.63793 0.0093199 -0.0248691 0.637533 0.0198904 -0.0263717 0.635717 0.0297549 -0.0273991 0.632663 0.0386856 -0.0279214 0.628594 0.0465132 -0.027917 0.623751 0.0531331 -0.0274036 0.618376 0.0585027 -0.026427 0.612697 0.0626357 -0.0250601 0.606912 0.0655923 -0.0233888 0.601188 0.0674672 -0.0215076 0.595653 0.0683779 -0.0195065 0.590402 0.0684534 -0.0174698 0.585499 0.0678257 -0.0154639 0.580978 0.066622 -0.0135415 0.576855 0.0649604 -0.011737 0.573131 0.0629466 -0.0100705 0.569793 0.0606729 -0.0085506 0.566822 0.0582178 -0.0071768 0.564195 0.0556469 -0.0059419 0.561885 0.053014 -0.0048379 0.559867 0.0503625 -0.0038527 0.558113 0.0477271 -0.0029763 0.505841 -0.0459621 0.01176 0.505531 -0.0496312 0.011797 0.505607 -0.053487 0.0117538 0.506144 -0.0575063 0.0116215 0.507224 -0.0616548 0.0113936 0.508935 -0.0658837 0.0110661 0.511373 -0.0701275 0.0106365 0.514634 -0.0743009 0.0101031 0.518813 -0.0782966 0.0094674 0.523996 -0.0819834 0.0087273 0.530252 -0.0852059 0.007879 0.537627 -0.0877857 0.006914 0.546125 -0.0895254 0.0058111 0.555702 -0.0902157 0.0045463 0.566252 -0.0896462 0.0030823 0.5776 -0.087619 0.0013814 0.589492 -0.0839664 -0.0006002 0.601608 -0.0785694 -0.0028949 0.613562 -0.0713775 -0.0055263 0.624929 -0.0624247 -0.0084864 0.635269 -0.0518409 -0.0117473 0.644166 -0.0398552 -0.0152392 0.65126 -0.0267885 -0.0188618 0.656284 -0.0130363 -0.0224809 0.659086 0.0009582 -0.0259368 0.659645 0.0147376 -0.0290586 0.658068 0.0278646 -0.0316784 0.654576 0.0399546 -0.0336485 0.649475 0.0507009 -0.0348638 0.643123 0.0598899 -0.0352598 0.635898 0.0674063 -0.0348407 0.628163 0.073227 -0.0336555 0.620244 0.0774091 -0.0318148 0.612411 0.0800715 -0.0294539 0.604875 0.0813758 -0.0267346 0.597785 0.0815078 -0.0238154 0.591235 0.080661 -0.0208437 0.585274 0.0790241 -0.0179386 0.579915 0.0767723 -0.0151923 0.575144 0.0740612 -0.0126629 0.570931 0.0710254 -0.0103819 0.567238 0.0677771 -0.0083574 0.56402 0.0644079 -0.0065814 0.561231 0.060991 -0.0050351 0.558827 0.0575835 -0.0036969 0.556768 0.0542288 -0.0025409 0.555013 0.0509596 -0.0015447 0.5016 -0.0481379 0.012593 0.50087 -0.0523641 0.0127578 0.500543 -0.056865 0.012856 0.500714 -0.0616255 0.012884 0.501487 -0.0666176 0.0128431 0.502984 -0.0717964 0.0127394 0.505336 -0.077096 0.0125822 0.508685 -0.0824249 0.0123821 0.513179 -0.0876612 0.0121513 0.518959 -0.0926494 0.0118951 0.526155 -0.0971971 0.0116092 0.534864 -0.101075 0.0112746 0.545137 -0.10402 0.0108466 0.556955 -0.105744 0.0102645 0.57021 -0.105943 0.009441 0.584687 -0.104321 0.008276 0.600052 -0.100614 0.0066585 0.615853 -0.0946162 0.0044875 0.631532 -0.0862143 0.0016773 0.646456 -0.0754161 -0.0018201 0.659959 -0.0623711 -0.0060052 0.671405 -0.0473803 -0.0108069 0.680245 -0.0308887 -0.0161073 0.686077 -0.0134588 -0.0216967 0.688692 0.0042713 -0.027319 0.688094 0.0216417 -0.0326746 0.684495 0.0380282 -0.0374566 0.678285 0.0528942 -0.0413586 0.669982 0.0658289 -0.0441585 0.660171 0.0765689 -0.0456862 0.649443 0.0850002 -0.0458811 0.638345 0.0911446 -0.044786 0.62734 0.0951349 -0.0425427 0.61679 0.0971837 -0.0393647 0.606951 0.0975525 -0.0355147 0.597978 0.0965234 -0.0312691 0.589942 0.0943767 -0.0268899 0.58285 0.091374 -0.0225956 0.576664 0.0877487 -0.0185553 0.571318 0.0837003 -0.0148779 0.566731 0.0793937 -0.0116205 0.562819 0.0749607 -0.0087963 0.559498 0.0705039 -0.0063876 0.556694 0.0661005 -0.0043567 0.554337 0.0618071 -0.0026588 0.552368 0.0576633 -0.001245 0.550734 0.053696 -7.13e-05 0.496886 -0.0497406 0.01332 0.495586 -0.0545484 0.0136626 0.494689 -0.0597377 0.0139701 0.494312 -0.0653068 0.0142513 0.494588 -0.0712402 0.014525 0.495678 -0.0775032 0.0148185 0.497763 -0.0840362 0.0151651 0.501047 -0.0907478 0.0156005 0.505752 -0.0975071 0.0161589 0.512105 -0.104137 0.0168595 0.520324 -0.110408 0.0176994 0.530598 -0.116035 0.0186423 0.543055 -0.120675 0.019608 0.557732 -0.123939 0.0204756 0.574537 -0.125401 0.0210789 0.593217 -0.124625 0.0212221 0.613334 -0.121201 0.0206826 0.634252 -0.114786 0.0192354 0.655159 -0.105155 0.0166753 0.675101 -0.0922526 0.0128377 0.693057 -0.076235 0.0076312 0.708036 -0.0574893 0.0010724 0.719187 -0.0366296 -0.0067017 0.725895 -0.0144598 -0.015411 0.727866 0.0080946 -0.0246339 0.725161 0.0300753 -0.0338655 0.718185 0.0505853 -0.0425396 0.707627 0.068874 -0.050102 0.694362 0.0843962 -0.056079 0.679345 0.0968404 -0.0601092 0.663506 0.106122 -0.0619985 0.64766 0.112353 -0.0617318 0.632461 0.115795 -0.0594696 0.618375 0.116803 -0.0555187 0.605688 0.115782 -0.0502921 0.594527 0.113143 -0.0442476 0.584899 0.109275 -0.037838 0.576723 0.104527 -0.0314587 0.569864 0.0991957 -0.0254219 0.564166 0.0935267 -0.0199383 0.559465 0.0877137 -0.0151231 0.555607 0.0819049 -0.0110103 0.552457 0.0762089 -0.0075742 0.549895 0.070702 -0.0047516 0.547824 0.0654354 -0.0024624 0.546162 0.0604403 -0.0006204 0.544842 0.0557335 0.0008538 0.491164 -0.0504851 0.0139293 0.489104 -0.055867 0.0145111 0.487424 -0.0617539 0.0151162 0.486262 -0.0681632 0.0157777 0.485786 -0.0750992 0.0165459 0.486204 -0.0825462 0.0174867 0.487761 -0.0904607 0.0186758 0.490746 -0.0987618 0.0201922 0.495482 -0.10732 0.0221071 0.502316 -0.115947 0.0244644 0.511602 -0.124381 0.0272656 0.523666 -0.132283 0.0304537 0.538767 -0.139225 0.0339004 0.557045 -0.144697 0.0374096 0.57846 -0.148118 0.0407114 0.602736 -0.148862 0.0434733 0.629309 -0.146306 0.0453068 0.6573 -0.139892 0.0457777 0.685525 -0.129207 0.0444353 0.712549 -0.11407 0.0408515 0.736798 -0.0946036 0.0346927 0.756718 -0.0712886 0.0258192 0.770962 -0.0449644 0.0143336 0.778573 -0.0167775 0.0006665 0.779129 0.011925 -0.014477 0.772806 0.0397426 -0.0301759 0.760352 0.0653813 -0.0454276 0.742971 0.0877931 -0.0592351 0.722143 0.106269 -0.0707679 0.699424 0.120468 -0.0793727 0.676258 0.130397 -0.0846554 0.653851 0.136335 -0.0864975 0.633096 0.138751 -0.0850488 0.614557 0.138211 -0.08071 0.598505 0.135311 -0.0740666 0.584975 0.130619 -0.065825 0.573831 0.124647 -0.0567158 0.564831 0.117833 -0.0474104 0.557681 0.110535 -0.0384621 0.552078 0.103037 -0.0302662 0.547737 0.0955549 -0.0230566 0.544407 0.0882463 -0.0169239 0.541876 0.0812197 -0.0118496 0.539973 0.0745457 -0.0077426 0.538563 0.068265 -0.0044751 0.537544 0.0623966 -0.0019064 0.536833 0.0569437 9.6e-05 0.483265 -0.0500519 0.0145477 0.480211 -0.0559514 0.015434 0.47748 -0.0624885 0.0164376 0.475233 -0.0697064 0.0176306 0.473677 -0.0776369 0.0191139 0.473073 -0.0862932 0.0210132 0.473749 -0.0956603 0.0234692 0.476096 -0.105683 0.0266249 0.480574 -0.11625 0.0306062 0.487695 -0.127179 0.0354946 0.498 -0.138198 0.0413053 0.512019 -0.148925 0.0479704 0.530214 -0.158856 0.0553304 0.552902 -0.167353 0.0631357 0.580162 -0.17365 0.0710313 0.611737 -0.176878 0.0785484 0.646939 -0.176119 0.0850626 0.684582 -0.170493 0.0897586 0.722967 -0.159281 0.0916469 0.759951 -0.142064 0.0896424 0.793112 -0.118859 0.0827709 0.820001 -0.0902218 0.0704448 0.838471 -0.0572731 0.0527285 0.847002 -0.0216352 0.0304565 0.844962 0.0147353 0.0051373 0.832732 0.0497897 -0.02134 0.811657 0.0816563 -0.0470609 0.783821 0.108875 -0.0703844 0.751707 0.130546 -0.0900851 0.717829 0.146358 -0.105337 0.684415 0.156517 -0.115685 0.653198 0.161604 -0.12098 0.625338 0.16241 -0.121378 0.601448 0.159799 -0.117332 0.581681 0.154599 -0.109569 0.565855 0.147547 -0.0990243 0.553576 0.139268 -0.0867419 0.544335 0.130264 -0.0737449 0.537595 0.120933 -0.0609287 0.532843 0.111579 -0.0489798 0.529622 0.102425 -0.038345 0.527551 0.0936284 -0.0292388 0.526322 0.0852926 -0.0216887 0.525701 0.0774792 -0.0155905 0.525512 0.0702175 -0.0107653 0.525631 0.0635135 -0.0070036 0.525966 0.0573562 -0.0041006 0.471722 -0.0481253 0.0154643 0.467412 -0.0544197 0.0167199 0.463329 -0.0614819 0.0182273 0.459654 -0.0693851 0.0201144 0.456634 -0.0781959 0.0225525 0.454594 -0.0879664 0.0257485 0.453953 -0.098724 0.0299283 0.455231 -0.110457 0.0353173 0.459054 -0.123097 0.0421119 0.466143 -0.136498 0.0504481 0.477287 -0.150408 0.0603851 0.493298 -0.16444 0.0719018 0.514936 -0.17804 0.0849058 0.542803 -0.190456 0.0992336 0.577208 -0.200728 0.114607 0.618006 -0.207694 0.130523 0.66443 -0.21005 0.146053 0.714947 -0.206463 0.159622 0.767189 -0.195746 0.168922 0.818015 -0.177081 0.171116 0.863733 -0.150246 0.163449 0.900509 -0.11581 0.144199 0.924904 -0.0752129 0.11349 0.934457 -0.030699 0.0736748 0.928165 0.0149237 0.0288069 0.906736 0.0586713 -0.0164833 0.872506 0.0978366 -0.0582169 0.829035 0.130391 -0.0938486 0.780457 0.155225 -0.122354 0.730808 0.172174 -0.143693 0.683461 0.181842 -0.158261 0.64083 0.18532 -0.166471 0.604302 0.183891 -0.168677 0.57438 0.178802 -0.165297 0.550896 0.171135 -0.156955 0.533255 0.161763 -0.144568 0.520634 0.151359 -0.129305 0.512132 0.140432 -0.112458 0.506869 0.129364 -0.0952789 0.504057 0.118442 -0.0788236 0.503023 0.107876 -0.0638581 0.503221 0.0978148 -0.050825 0.504233 0.0883577 -0.0398789 0.505749 0.0795617 -0.0309532 0.507551 0.0714506 -0.0238403 0.509493 0.0640229 -0.0182649 0.51148 0.0572589 -0.01394 0.454879 -0.0444937 0.0172238 0.449053 -0.0509824 0.0189006 0.443314 -0.058349 0.0209992 0.437865 -0.0666988 0.0237165 0.432991 -0.0761374 0.0273063 0.429081 -0.0867635 0.0320672 0.426654 -0.0986596 0.0383174 0.426373 -0.111878 0.0463675 0.429054 -0.12642 0.0564906 0.435667 -0.142216 0.0689044 0.447306 -0.159082 0.0837883 0.465149 -0.17668 0.101334 0.490368 -0.194463 0.121812 0.524001 -0.211611 0.145591 0.56676 -0.226984 0.173008 0.618784 -0.239101 0.203984 0.679353 -0.24619 0.237325 0.746603 -0.246327 0.269897 0.817351 -0.237671 0.296149 0.887104 -0.2188 0.308539 0.950352 -0.189069 0.299413 1.00118 -0.148933 0.263891 1.03411 -0.10013 0.202612 1.04511 -0.0456487 0.122713 1.03249 0.0105921 0.0360249 0.997361 0.0643155 -0.0448993 0.943649 0.111625 -0.110947 0.87732 0.149697 -0.158628 0.805215 0.177201 -0.189551 0.733762 0.194315 -0.207935 0.667999 0.202364 -0.218023 0.611124 0.203268 -0.222602 0.564565 0.199019 -0.222792 0.528368 0.191331 -0.218685 0.501686 0.181499 -0.210106 0.483211 0.170418 -0.197164 0.471479 0.158676 -0.180481 0.46506 0.146667 -0.161142 0.462655 0.13467 -0.140503 0.463149 0.122899 -0.119925 0.46562 0.11153 -0.100554 0.469341 0.100704 -0.083188 0.473765 0.0905251 -0.0682427 0.478497 0.0810623 -0.055802 0.483273 0.0723515 -0.0457093 0.487924 0.0643992 -0.0376687 0.492357 0.0571892 -0.0313314 0.432045 -0.0391537 0.0205455 0.424509 -0.0455625 0.0226864 0.416889 -0.0529205 0.02544 0.409402 -0.0613629 0.0290732 0.402367 -0.071034 0.0339201 0.396236 -0.0820827 0.0403592 0.391626 -0.0946553 0.0487818 0.389344 -0.108884 0.0595605 0.390408 -0.124871 0.0730391 0.396055 -0.142658 0.0895588 0.407731 -0.162191 0.109579 0.427058 -0.183249 0.133867 0.455753 -0.205366 0.163739 0.49548 -0.227723 0.201176 0.547602 -0.249046 0.248541 0.61281 -0.26754 0.30756 0.690648 -0.280915 0.377332 0.779017 -0.286542 0.451787 0.873795 -0.281773 0.517858 0.968752 -0.264399 0.556266 1.0559 -0.233168 0.546436 1.12636 -0.188261 0.474808 1.17163 -0.131611 0.342996 1.18515 -0.0669519 0.170832 1.16385 0.0005071 -0.0088487 1.10926 0.064844 -0.162205 1.02759 0.120545 -0.267129 0.928607 0.163677 -0.319658 0.823534 0.192663 -0.331144 0.722565 0.208313 -0.319489 0.633106 0.21314 -0.300444 0.559141 0.210334 -0.28318 0.501651 0.202848 -0.270394 0.459575 0.192893 -0.260804 0.430805 0.181839 -0.251726 0.412914 0.170383 -0.240752 0.403575 0.158807 -0.226513 0.40073 0.147209 -0.208799 0.402638 0.135647 -0.18835 0.407853 0.124208 -0.166465 0.41521 0.113015 -0.144591 0.423792 0.10221 -0.123976 0.432911 0.0919292 -0.105487 0.442075 0.0822838 -0.0895569 0.450959 0.0733499 -0.0762461 0.459367 0.065167 -0.065363 0.467198 0.057742 -0.0565768 0.404104 -0.0324357 0.0262769 0.394795 -0.0384425 0.0289205 0.385216 -0.045415 0.0323644 0.375591 -0.0535122 0.0369292 0.366265 -0.0629119 0.043002 0.357747 -0.0738105 0.0510011 0.350739 -0.0864197 0.0613346 0.346183 -0.100961 0.0743813 0.345288 -0.117652 0.0905281 0.349559 -0.136685 0.110304 0.360821 -0.158174 0.134718 0.381211 -0.18208 0.165785 0.413137 -0.20809 0.20719 0.459124 -0.235461 0.264755 0.521499 -0.262843 0.346008 0.601853 -0.288161 0.457893 0.70029 -0.308598 0.601851 0.814595 -0.320787 0.766984 0.939563 -0.321229 0.924563 1.06679 -0.306893 1.02889 1.18512 -0.275878 1.02898 1.28177 -0.228007 0.889348 1.34413 -0.165246 0.611478 1.3619 -0.091885 0.242985 1.32962 -0.014318 -0.13445 1.24874 0.059761 -0.436089 1.12845 0.122863 -0.608573 0.984215 0.169574 -0.648152 0.834078 0.197987 -0.592416 0.694091 0.209875 -0.494466 0.574991 0.209508 -0.397756 0.481315 0.201841 -0.324937 0.412652 0.191007 -0.280193 0.365754 0.179633 -0.257571 0.336419 0.168898 -0.248187 0.320634 0.158984 -0.244128 0.315037 0.149595 -0.239784 0.316954 0.140338 -0.231967 0.32427 0.130942 -0.219589 0.33529 0.121317 -0.203135 0.348646 0.11153 -0.184022 0.363243 0.101748 -0.163955 0.378239 0.0921706 -0.144457 0.393019 0.082986 -0.126594 0.407172 0.0743421 -0.110932 0.420447 0.0663382 -0.0976135 0.432724 0.0590258 -0.0864988 0.375846 -0.0250494 0.0349944 0.364921 -0.0303345 0.0382168 0.353551 -0.03654 0.0424109 0.341963 -0.0438386 0.0479282 0.330524 -0.0524322 0.0551708 0.319782 -0.0625547 0.0645432 0.310515 -0.0744748 0.0764098 0.303778 -0.0884962 0.0911018 0.300951 -0.104951 0.109041 0.303798 -0.124178 0.131082 0.314535 -0.146474 0.159241 0.335882 -0.172001 0.197875 0.371084 -0.200628 0.255259 0.423772 -0.231723 0.344921 0.497571 -0.263913 0.485202 0.595322 -0.294885 0.694699 0.717929 -0.321364 0.981469 0.863052 -0.339349 1.32722 1.0241 -0.344674 1.67374 1.18999 -0.333751 1.92353 1.34575 -0.304311 1.96439 1.47414 -0.255973 1.71485 1.55765 -0.19063 1.1719 1.58126 -0.112702 0.433741 1.53579 -0.0291846 -0.32269 1.42159 0.0509079 -0.908407 1.25098 0.118181 -1.20285 1.04707 0.165519 -1.20113 0.837952 0.190538 -0.997595 0.648402 0.196179 -0.721301 0.493682 0.188898 -0.472699 0.378298 0.175721 -0.297938 0.298921 0.161962 -0.19918 0.248616 0.150408 -0.157811 0.220097 0.141702 -0.151954 0.207349 0.135213 -0.163927 0.205956 0.129862 -0.181372 0.212797 0.124663 -0.196393 0.225594 0.118966 -0.204711 0.242559 0.112502 -0.20498 0.262212 0.105295 -0.198002 0.283307 0.0975513 -0.185781 0.30483 0.0895528 -0.170653 0.326005 0.08158 -0.154654 0.346283 0.0738683 -0.139224 0.365324 0.0665893 -0.125185 0.382948 0.0598517 -0.112861 0.359137 -0.0179711 0.0459504 0.347026 -0.0222677 0.0498912 0.334328 -0.0273763 0.0549999 0.321271 -0.0334701 0.0616602 0.308239 -0.0407583 0.0702958 0.295815 -0.0494927 0.0813107 0.284837 -0.0599734 0.0950558 0.276458 -0.0725544 0.111882 0.272215 -0.087641 0.132412 0.274121 -0.105671 0.15818 0.284794 -0.127067 0.192993 0.307594 -0.152128 0.24516 0.34672 -0.18086 0.330629 0.407101 -0.212727 0.47587 0.493894 -0.246358 0.717609 0.61137 -0.279318 1.09444 0.761212 -0.308093 1.62594 0.940648 -0.328424 2.28137 1.14114 -0.336008 2.95271 1.34835 -0.327335 3.45634 1.5433 -0.300374 3.58022 1.70437 -0.254918 3.16866 1.80944 -0.192745 2.2097 1.83856 -0.117836 0.878604 1.77782 -0.0367292 -0.496655 1.62494 0.0414923 -1.55341 1.39449 0.106508 -2.0506 1.11846 0.149889 -1.97507 0.838159 0.168711 -1.51943 0.590247 0.166866 -0.948689 0.395699 0.152717 -0.462096 0.25802 0.134968 -0.140075 0.169084 0.119618 0.0267309 0.116658 0.109194 0.0836016 0.0895283 0.103571 0.0752319 0.0794905 0.101269 0.0336838 0.0812697 0.100508 -0.0202895 0.0916218 0.0998221 -0.073334 0.108407 0.0982878 -0.117186 0.129968 0.0955086 -0.147814 0.154831 0.0914825 -0.164745 0.181644 0.0864438 -0.169961 0.209212 0.0807282 -0.166644 0.236558 0.0746781 -0.158058 0.26295 0.0685881 -0.146897 0.287901 0.0626822 -0.135032 0.311134 0.0571126 -0.123578 0.375006 -0.011866 0.0551447 0.362417 -0.0149618 0.0600395 0.349131 -0.0186912 0.0664779 0.335378 -0.0232053 0.0749906 0.321553 -0.0286916 0.0861864 0.30827 -0.0353798 0.100703 0.296423 -0.0435499 0.119195 0.287252 -0.0535364 0.142461 0.282442 -0.065727 0.171887 0.284244 -0.0805459 0.210456 0.295673 -0.0984059 0.26487 0.320721 -0.119612 0.349097 0.364539 -0.144198 0.489443 0.433348 -0.171687 0.729348 0.53378 -0.200822 1.12908 0.671361 -0.229365 1.75179 0.84819 -0.254123 2.62854 1.06051 -0.271353 3.70648 1.29732 -0.277489 4.80669 1.54091 -0.269896 5.63175 1.76885 -0.247325 5.8461 1.95624 -0.209953 5.2088 2.07764 -0.159291 3.70296 2.10905 -0.0983098 1.60004 2.03177 -0.0319493 -0.586108 1.83959 0.0323959 -2.27031 1.54769 0.0855264 -3.04548 1.19643 0.119277 -2.87676 0.841739 0.130578 -2.08789 0.534042 0.123369 -1.13436 0.300525 0.106239 -0.351976 0.142674 0.0878316 0.138249 0.0461576 0.0736518 0.370115 -0.0074384 0.0655335 0.430461 -0.0334913 0.0627587 0.395528 -0.0422192 0.0634737 0.314346 -0.039426 0.065722 0.215517 -0.0281482 0.0679808 0.116761 -0.0101166 0.0693174 0.0297687 0.013329 0.0693319 -0.0386763 0.0408508 0.0680088 -0.0864511 0.0710582 0.0655591 -0.115171 0.102608 0.0622916 -0.128682 0.134324 0.0585244 -0.131469 0.165281 0.0545349 -0.127592 0.194825 0.0505388 -0.12016 0.222555 0.0466877 -0.111261 0.42877 -0.0062302 0.0571185 0.416331 -0.0078924 0.063088 0.40309 -0.0099157 0.0712402 0.38927 -0.0123933 0.0824305 0.37527 -0.0154421 0.0977129 0.361722 -0.0192067 0.118314 0.349555 -0.023864 0.14565 0.340076 -0.0296255 0.18151 0.335079 -0.0367344 0.228633 0.337002 -0.0454541 0.292007 0.349164 -0.0560355 0.381599 0.376046 -0.0686556 0.517004 0.423529 -0.0833121 0.734107 0.498804 -0.0996766 1.0914 0.60957 -0.11693 1.66921 0.762151 -0.133654 2.54996 0.958658 -0.14788 3.76962 1.19418 -0.157392 5.2474 1.45554 -0.160205 6.73283 1.72249 -0.155005 7.82387 1.97039 -0.141329 8.08107 2.17264 -0.119467 7.19935 2.30205 -0.0903182 5.16688 2.33209 -0.0554475 2.34231 2.24041 -0.0174591 -0.598816 2.01708 0.0195116 -2.87402 1.67664 0.0499413 -3.91929 1.26541 0.0685972 -3.67119 0.851395 0.0733641 -2.57481 0.496836 0.0668033 -1.27047 0.233987 0.0546042 -0.225836 0.0620528 0.0423764 0.403118 -0.0389762 0.033496 0.679248 -0.0927809 0.0288871 0.732439 -0.118049 0.0278759 0.669331 -0.126447 0.029151 0.553436 -0.124026 0.0314108 0.418437 -0.113507 0.0336713 0.28395 -0.0961789 0.0353404 0.163329 -0.0730356 0.0361642 0.0650961 -0.045236 0.0361282 -0.0073559 -0.0141448 0.0353571 -0.0551926 0.0188178 0.0340351 -0.0825948 0.0523487 0.0323536 -0.0948898 0.0853844 0.0304802 -0.0971595 0.117147 0.0285471 -0.0934797 0.147137 0.0266484 -0.086733 0.464721 0 0.0553937 0.452493 0 0.0619206 0.439406 0 0.0710295 0.425679 0 0.0837942 0.411709 0 0.101565 0.398133 0 0.125971 0.38589 0 0.158939 0.376312 0 0.202896 0.371232 0 0.261387 0.373161 0 0.340477 0.385531 0 0.451694 0.413011 0 0.617064 0.461758 0 0.876374 0.539323 0 1.29404 0.653796 0 1.95796 0.811763 0 2.95723 1.01527 0 4.32785 1.25889 0 5.97478 1.52857 0 7.6159 1.80314 0 8.80625 2.05723 0 9.06559 2.26377 0 8.0664 2.39502 0 5.80213 2.42362 0 2.66834 2.32585 0 -0.594776 2.09022 0 -3.12333 1.73083 0 -4.28733 1.29614 0 -4.01004 0.858962 0 -2.78634 0.486294 0 -1.33615 0.212395 0 -0.184041 0.0354066 0 0.499939 -0.0670393 0 0.792071 -0.120735 0 0.841149 -0.145652 0 0.766769 -0.153994 0 0.638229 -0.151883 0 0.490777 -0.141902 0 0.344277 -0.125155 0 0.212411 -0.102487 0 0.104133 -0.0749748 0 0.0232712 -0.043959 0 -0.0310927 -0.0108777 0 -0.0632251 0.0229269 0 -0.078723 0.0563444 0 -0.0830069 0.0885559 0 -0.0804916 0.119027 0 -0.0743352 0.42877 0.0062302 0.0571185 0.416331 0.0078924 0.063088 0.40309 0.0099157 0.0712402 0.38927 0.0123933 0.0824305 0.37527 0.0154421 0.0977129 0.361722 0.0192067 0.118314 0.349555 0.023864 0.14565 0.340076 0.0296255 0.18151 0.335079 0.0367344 0.228633 0.337002 0.0454541 0.292007 0.349164 0.0560355 0.381599 0.376046 0.0686556 0.517004 0.423529 0.0833121 0.734107 0.498804 0.0996766 1.0914 0.60957 0.11693 1.66921 0.762151 0.133654 2.54996 0.958658 0.14788 3.76962 1.19418 0.157392 5.2474 1.45554 0.160205 6.73283 1.72249 0.155005 7.82387 1.97039 0.141329 8.08107 2.17264 0.119467 7.19935 2.30205 0.0903182 5.16688 2.33209 0.0554475 2.34231 2.24041 0.0174591 -0.598816 2.01708 -0.0195116 -2.87402 1.67664 -0.0499413 -3.91929 1.26541 -0.0685972 -3.67119 0.851395 -0.0733641 -2.57481 0.496836 -0.0668033 -1.27047 0.233987 -0.0546042 -0.225836 0.0620528 -0.0423764 0.403118 -0.0389762 -0.033496 0.679248 -0.0927809 -0.0288871 0.732439 -0.118049 -0.0278759 0.669331 -0.126447 -0.029151 0.553436 -0.124026 -0.0314108 0.418437 -0.113507 -0.0336713 0.28395 -0.0961789 -0.0353404 0.163329 -0.0730356 -0.0361642 0.0650961 -0.045236 -0.0361282 -0.0073559 -0.0141448 -0.0353571 -0.0551926 0.0188178 -0.0340351 -0.0825948 0.0523487 -0.0323536 -0.0948898 0.0853844 -0.0304802 -0.0971595 0.117147 -0.0285471 -0.0934797 0.147137 -0.0266484 -0.086733 0.375006 0.011866 0.0551447 0.362417 0.0149618 0.0600395 0.349131 0.0186912 0.0664779 0.335378 0.0232053 0.0749906 0.321553 0.0286916 0.0861864 0.30827 0.0353798 0.100703 0.296423 0.0435499 0.119195 0.287252 0.0535364 0.142461 0.282442 0.065727 0.171887 0.284244 0.0805459 0.210456 0.295673 0.0984059 0.26487 0.320721 0.119612 0.349097 0.364539 0.144198 0.489443 0.433348 0.171687 0.729348 0.53378 0.200822 1.12908 0.671361 0.229365 1.75179 0.84819 0.254123 2.62854 1.06051 0.271353 3.70648 1.29732 0.277489 4.80669 1.54091 0.269896 5.63175 1.76885 0.247325 5.8461 1.95624 0.209953 5.2088 2.07764 0.159291 3.70296 2.10905 0.0983098 1.60004 2.03177 0.0319493 -0.586108 1.83959 -0.0323959 -2.27031 1.54769 -0.0855264 -3.04548 1.19643 -0.119277 -2.87676 0.841739 -0.130578 -2.08789 0.534042 -0.123369 -1.13436 0.300525 -0.106239 -0.351976 0.142674 -0.0878316 0.138249 0.0461576 -0.0736518 0.370115 -0.0074384 -0.0655335 0.430461 -0.0334913 -0.0627587 0.395528 -0.0422192 -0.0634737 0.314346 -0.039426 -0.065722 0.215517 -0.0281482 -0.0679808 0.116761 -0.0101166 -0.0693174 0.0297687 0.013329 -0.0693319 -0.0386763 0.0408508 -0.0680088 -0.0864511 0.0710582 -0.0655591 -0.115171 0.102608 -0.0622916 -0.128682 0.134324 -0.0585244 -0.131469 0.165281 -0.0545349 -0.127592 0.194825 -0.0505388 -0.12016 0.222555 -0.0466877 -0.111261 0.359137 0.0179711 0.0459504 0.347026 0.0222677 0.0498912 0.334328 0.0273763 0.0549999 0.321271 0.0334701 0.0616602 0.308239 0.0407583 0.0702958 0.295815 0.0494927 0.0813107 0.284837 0.0599734 0.0950558 0.276458 0.0725544 0.111882 0.272215 0.087641 0.132412 0.274121 0.105671 0.15818 0.284794 0.127067 0.192993 0.307594 0.152128 0.24516 0.34672 0.18086 0.330629 0.407101 0.212727 0.47587 0.493894 0.246358 0.717609 0.61137 0.279318 1.09444 0.761212 0.308093 1.62594 0.940648 0.328424 2.28137 1.14114 0.336008 2.95271 1.34835 0.327335 3.45634 1.5433 0.300374 3.58022 1.70437 0.254918 3.16866 1.80944 0.192745 2.2097 1.83856 0.117836 0.878604 1.77782 0.0367292 -0.496655 1.62494 -0.0414923 -1.55341 1.39449 -0.106508 -2.0506 1.11846 -0.149889 -1.97507 0.838159 -0.168711 -1.51943 0.590247 -0.166866 -0.948689 0.395699 -0.152717 -0.462096 0.25802 -0.134968 -0.140075 0.169084 -0.119618 0.0267309 0.116658 -0.109194 0.0836016 0.0895283 -0.103571 0.0752319 0.0794905 -0.101269 0.0336838 0.0812697 -0.100508 -0.0202895 0.0916218 -0.0998221 -0.073334 0.108407 -0.0982878 -0.117186 0.129968 -0.0955086 -0.147814 0.154831 -0.0914825 -0.164745 0.181644 -0.0864438 -0.169961 0.209212 -0.0807282 -0.166644 0.236558 -0.0746781 -0.158058 0.26295 -0.0685881 -0.146897 0.287901 -0.0626822 -0.135032 0.311134 -0.0571126 -0.123578 0.375846 0.0250494 0.0349944 0.364921 0.0303345 0.0382168 0.353551 0.03654 0.0424109 0.341963 0.0438386 0.0479282 0.330524 0.0524322 0.0551708 0.319782 0.0625547 0.0645432 0.310515 0.0744748 0.0764098 0.303778 0.0884962 0.0911018 0.300951 0.104951 0.109041 0.303798 0.124178 0.131082 0.314535 0.146474 0.159241 0.335882 0.172001 0.197875 0.371084 0.200628 0.255259 0.423772 0.231723 0.344921 0.497571 0.263913 0.485202 0.595322 0.294885 0.694699 0.717929 0.321364 0.981469 0.863052 0.339349 1.32722 1.0241 0.344674 1.67374 1.18999 0.333751 1.92353 1.34575 0.304311 1.96439 1.47414 0.255973 1.71485 1.55765 0.19063 1.1719 1.58126 0.112702 0.433741 1.53579 0.0291846 -0.32269 1.42159 -0.0509079 -0.908407 1.25098 -0.118181 -1.20285 1.04707 -0.165519 -1.20113 0.837952 -0.190538 -0.997595 0.648402 -0.196179 -0.721301 0.493682 -0.188898 -0.472699 0.378298 -0.175721 -0.297938 0.298921 -0.161962 -0.19918 0.248616 -0.150408 -0.157811 0.220097 -0.141702 -0.151954 0.207349 -0.135213 -0.163927 0.205956 -0.129862 -0.181372 0.212797 -0.124663 -0.196393 0.225594 -0.118966 -0.204711 0.242559 -0.112502 -0.20498 0.262212 -0.105295 -0.198002 0.283307 -0.0975513 -0.185781 0.30483 -0.0895528 -0.170653 0.326005 -0.08158 -0.154654 0.346283 -0.0738683 -0.139224 0.365324 -0.0665893 -0.125185 0.382948 -0.0598517 -0.112861 0.404104 0.0324357 0.0262769 0.394795 0.0384425 0.0289205 0.385216 0.045415 0.0323644 0.375591 0.0535122 0.0369292 0.366265 0.0629119 0.043002 0.357747 0.0738105 0.0510011 0.350739 0.0864197 0.0613346 0.346183 0.100961 0.0743813 0.345288 0.117652 0.0905281 0.349559 0.136685 0.110304 0.360821 0.158174 0.134718 0.381211 0.18208 0.165785 0.413137 0.20809 0.20719 0.459124 0.235461 0.264755 0.521499 0.262843 0.346008 0.601853 0.288161 0.457893 0.70029 0.308598 0.601851 0.814595 0.320787 0.766984 0.939563 0.321229 0.924563 1.06679 0.306893 1.02889 1.18512 0.275878 1.02898 1.28177 0.228007 0.889348 1.34413 0.165246 0.611478 1.3619 0.091885 0.242985 1.32962 0.014318 -0.13445 1.24874 -0.059761 -0.436089 1.12845 -0.122863 -0.608573 0.984215 -0.169574 -0.648152 0.834078 -0.197987 -0.592416 0.694091 -0.209875 -0.494466 0.574991 -0.209508 -0.397756 0.481315 -0.201841 -0.324937 0.412652 -0.191007 -0.280193 0.365754 -0.179633 -0.257571 0.336419 -0.168898 -0.248187 0.320634 -0.158984 -0.244128 0.315037 -0.149595 -0.239784 0.316954 -0.140338 -0.231967 0.32427 -0.130942 -0.219589 0.33529 -0.121317 -0.203135 0.348646 -0.11153 -0.184022 0.363243 -0.101748 -0.163955 0.378239 -0.0921706 -0.144457 0.393019 -0.082986 -0.126594 0.407172 -0.0743421 -0.110932 0.420447 -0.0663382 -0.0976135 0.432724 -0.0590258 -0.0864988 0.432045 0.0391537 0.0205455 0.424509 0.0455625 0.0226864 0.416889 0.0529205 0.02544 0.409402 0.0613629 0.0290732 0.402367 0.071034 0.0339201 0.396236 0.0820827 0.0403592 0.391626 0.0946553 0.0487818 0.389344 0.108884 0.0595605 0.390408 0.124871 0.0730391 0.396055 0.142658 0.0895588 0.407731 0.162191 0.109579 0.427058 0.183249 0.133867 0.455753 0.205366 0.163739 0.49548 0.227723 0.201176 0.547602 0.249046 0.248541 0.61281 0.26754 0.30756 0.690648 0.280915 0.377332 0.779017 0.286542 0.451787 0.873795 0.281773 0.517858 0.968752 0.264399 0.556266 1.0559 0.233168 0.546436 1.12636 0.188261 0.474808 1.17163 0.131611 0.342996 1.18515 0.0669519 0.170832 1.16385 -0.0005071 -0.0088487 1.10926 -0.064844 -0.162205 1.02759 -0.120545 -0.267129 0.928607 -0.163677 -0.319658 0.823534 -0.192663 -0.331144 0.722565 -0.208313 -0.319489 0.633106 -0.21314 -0.300444 0.559141 -0.210334 -0.28318 0.501651 -0.202848 -0.270394 0.459575 -0.192893 -0.260804 0.430805 -0.181839 -0.251726 0.412914 -0.170383 -0.240752 0.403575 -0.158807 -0.226513 0.40073 -0.147209 -0.208799 0.402638 -0.135647 -0.18835 0.407853 -0.124208 -0.166465 0.41521 -0.113015 -0.144591 0.423792 -0.10221 -0.123976 0.432911 -0.0919292 -0.105487 0.442075 -0.0822838 -0.0895569 0.450959 -0.0733499 -0.0762461 0.459367 -0.065167 -0.065363 0.467198 -0.057742 -0.0565768 0.454879 0.0444937 0.0172238 0.449053 0.0509824 0.0189006 0.443314 0.058349 0.0209992 0.437865 0.0666988 0.0237165 0.432991 0.0761374 0.0273063 0.429081 0.0867635 0.0320672 0.426654 0.0986596 0.0383174 0.426373 0.111878 0.0463675 0.429054 0.12642 0.0564906 0.435667 0.142216 0.0689044 0.447306 0.159082 0.0837883 0.465149 0.17668 0.101334 0.490368 0.194463 0.121812 0.524001 0.211611 0.145591 0.56676 0.226984 0.173008 0.618784 0.239101 0.203984 0.679353 0.24619 0.237325 0.746603 0.246327 0.269897 0.817351 0.237671 0.296149 0.887104 0.2188 0.308539 0.950352 0.189069 0.299413 1.00118 0.148933 0.263891 1.03411 0.10013 0.202612 1.04511 0.0456487 0.122713 1.03249 -0.0105921 0.0360249 0.997361 -0.0643155 -0.0448993 0.943649 -0.111625 -0.110947 0.87732 -0.149697 -0.158628 0.805215 -0.177201 -0.189551 0.733762 -0.194315 -0.207935 0.667999 -0.202364 -0.218023 0.611124 -0.203268 -0.222602 0.564565 -0.199019 -0.222792 0.528368 -0.191331 -0.218685 0.501686 -0.181499 -0.210106 0.483211 -0.170418 -0.197164 0.471479 -0.158676 -0.180481 0.46506 -0.146667 -0.161142 0.462655 -0.13467 -0.140503 0.463149 -0.122899 -0.119925 0.46562 -0.11153 -0.100554 0.469341 -0.100704 -0.083188 0.473765 -0.0905251 -0.0682427 0.478497 -0.0810623 -0.055802 0.483273 -0.0723515 -0.0457093 0.487924 -0.0643992 -0.0376687 0.492357 -0.0571892 -0.0313314 0.471722 0.0481253 0.0154643 0.467412 0.0544197 0.0167199 0.463329 0.0614819 0.0182273 0.459654 0.0693851 0.0201144 0.456634 0.0781959 0.0225525 0.454594 0.0879664 0.0257485 0.453953 0.098724 0.0299283 0.455231 0.110457 0.0353173 0.459054 0.123097 0.0421119 0.466143 0.136498 0.0504481 0.477287 0.150408 0.0603851 0.493298 0.16444 0.0719018 0.514936 0.17804 0.0849058 0.542803 0.190456 0.0992336 0.577208 0.200728 0.114607 0.618006 0.207694 0.130523 0.66443 0.21005 0.146053 0.714947 0.206463 0.159622 0.767189 0.195746 0.168922 0.818015 0.177081 0.171116 0.863733 0.150246 0.163449 0.900509 0.11581 0.144199 0.924904 0.0752129 0.11349 0.934457 0.030699 0.0736748 0.928165 -0.0149237 0.0288069 0.906736 -0.0586713 -0.0164833 0.872506 -0.0978366 -0.0582169 0.829035 -0.130391 -0.0938486 0.780457 -0.155225 -0.122354 0.730808 -0.172174 -0.143693 0.683461 -0.181842 -0.158261 0.64083 -0.18532 -0.166471 0.604302 -0.183891 -0.168677 0.57438 -0.178802 -0.165297 0.550896 -0.171135 -0.156955 0.533255 -0.161763 -0.144568 0.520634 -0.151359 -0.129305 0.512132 -0.140432 -0.112458 0.506869 -0.129364 -0.0952789 0.504057 -0.118442 -0.0788236 0.503023 -0.107876 -0.0638581 0.503221 -0.0978148 -0.050825 0.504233 -0.0883577 -0.0398789 0.505749 -0.0795617 -0.0309532 0.507551 -0.0714506 -0.0238403 0.509493 -0.0640229 -0.0182649 0.51148 -0.0572589 -0.01394 0.483265 0.0500519 0.0145477 0.480211 0.0559514 0.015434 0.47748 0.0624885 0.0164376 0.475233 0.0697064 0.0176306 0.473677 0.0776369 0.0191139 0.473073 0.0862932 0.0210132 0.473749 0.0956603 0.0234692 0.476096 0.105683 0.0266249 0.480574 0.11625 0.0306062 0.487695 0.127179 0.0354946 0.498 0.138198 0.0413053 0.512019 0.148925 0.0479704 0.530214 0.158856 0.0553304 0.552902 0.167353 0.0631357 0.580162 0.17365 0.0710313 0.611737 0.176878 0.0785484 0.646939 0.176119 0.0850626 0.684582 0.170493 0.0897586 0.722967 0.159281 0.0916469 0.759951 0.142064 0.0896424 0.793112 0.118859 0.0827709 0.820001 0.0902218 0.0704448 0.838471 0.0572731 0.0527285 0.847002 0.0216352 0.0304565 0.844962 -0.0147353 0.0051373 0.832732 -0.0497897 -0.02134 0.811657 -0.0816563 -0.0470609 0.783821 -0.108875 -0.0703844 0.751707 -0.130546 -0.0900851 0.717829 -0.146358 -0.105337 0.684415 -0.156517 -0.115685 0.653198 -0.161604 -0.12098 0.625338 -0.16241 -0.121378 0.601448 -0.159799 -0.117332 0.581681 -0.154599 -0.109569 0.565855 -0.147547 -0.0990243 0.553576 -0.139268 -0.0867419 0.544335 -0.130264 -0.0737449 0.537595 -0.120933 -0.0609287 0.532843 -0.111579 -0.0489798 0.529622 -0.102425 -0.038345 0.527551 -0.0936284 -0.0292388 0.526322 -0.0852926 -0.0216887 0.525701 -0.0774792 -0.0155905 0.525512 -0.0702175 -0.0107653 0.525631 -0.0635135 -0.0070036 0.525966 -0.0573562 -0.0041006 0.491164 0.0504851 0.0139293 0.489104 0.055867 0.0145111 0.487424 0.0617539 0.0151162 0.486262 0.0681632 0.0157777 0.485786 0.0750992 0.0165459 0.486204 0.0825462 0.0174867 0.487761 0.0904607 0.0186758 0.490746 0.0987618 0.0201922 0.495482 0.10732 0.0221071 0.502316 0.115947 0.0244644 0.511602 0.124381 0.0272656 0.523666 0.132283 0.0304537 0.538767 0.139225 0.0339004 0.557045 0.144697 0.0374096 0.57846 0.148118 0.0407114 0.602736 0.148862 0.0434733 0.629309 0.146306 0.0453068 0.6573 0.139892 0.0457777 0.685525 0.129207 0.0444353 0.712549 0.11407 0.0408515 0.736798 0.0946036 0.0346927 0.756718 0.0712886 0.0258192 0.770962 0.0449644 0.0143336 0.778573 0.0167775 0.0006665 0.779129 -0.011925 -0.014477 0.772806 -0.0397426 -0.0301759 0.760352 -0.0653813 -0.0454276 0.742971 -0.0877931 -0.0592351 0.722143 -0.106269 -0.0707679 0.699424 -0.120468 -0.0793727 0.676258 -0.130397 -0.0846554 0.653851 -0.136335 -0.0864975 0.633096 -0.138751 -0.0850488 0.614557 -0.138211 -0.08071 0.598505 -0.135311 -0.0740666 0.584975 -0.130619 -0.065825 0.573831 -0.124647 -0.0567158 0.564831 -0.117833 -0.0474104 0.557681 -0.110535 -0.0384621 0.552078 -0.103037 -0.0302662 0.547737 -0.0955549 -0.0230566 0.544407 -0.0882463 -0.0169239 0.541876 -0.0812197 -0.0118496 0.539973 -0.0745457 -0.0077426 0.538563 -0.068265 -0.0044751 0.537544 -0.0623966 -0.0019064 0.536833 -0.0569437 9.6e-05 0.496886 0.0497406 0.01332 0.495586 0.0545484 0.0136626 0.494689 0.0597377 0.0139701 0.494312 0.0653068 0.0142513 0.494588 0.0712402 0.014525 0.495678 0.0775032 0.0148185 0.497763 0.0840362 0.0151651 0.501047 0.0907478 0.0156005 0.505752 0.0975071 0.0161589 0.512105 0.104137 0.0168595 0.520324 0.110408 0.0176994 0.530598 0.116035 0.0186423 0.543055 0.120675 0.019608 0.557732 0.123939 0.0204756 0.574537 0.125401 0.0210789 0.593217 0.124625 0.0212221 0.613334 0.121201 0.0206826 0.634252 0.114786 0.0192354 0.655159 0.105155 0.0166753 0.675101 0.0922526 0.0128377 0.693057 0.076235 0.0076312 0.708036 0.0574893 0.0010724 0.719187 0.0366296 -0.0067017 0.725895 0.0144598 -0.015411 0.727866 -0.0080946 -0.0246339 0.725161 -0.0300753 -0.0338655 0.718185 -0.0505853 -0.0425396 0.707627 -0.068874 -0.050102 0.694362 -0.0843962 -0.056079 0.679345 -0.0968404 -0.0601092 0.663506 -0.106122 -0.0619985 0.64766 -0.112353 -0.0617318 0.632461 -0.115795 -0.0594696 0.618375 -0.116803 -0.0555187 0.605688 -0.115782 -0.0502921 0.594527 -0.113143 -0.0442476 0.584899 -0.109275 -0.037838 0.576723 -0.104527 -0.0314587 0.569864 -0.0991957 -0.0254219 0.564166 -0.0935267 -0.0199383 0.559465 -0.0877137 -0.0151231 0.555607 -0.0819049 -0.0110103 0.552457 -0.0762089 -0.0075742 0.549895 -0.070702 -0.0047516 0.547824 -0.0654354 -0.0024624 0.546162 -0.0604403 -0.0006204 0.544842 -0.0557335 0.0008538 0.5016 0.0481379 0.012593 0.50087 0.0523641 0.0127578 0.500543 0.056865 0.012856 0.500714 0.0616255 0.012884 0.501487 0.0666176 0.0128431 0.502984 0.0717964 0.0127394 0.505336 0.077096 0.0125822 0.508685 0.0824249 0.0123821 0.513179 0.0876612 0.0121513 0.518959 0.0926494 0.0118951 0.526155 0.0971971 0.0116092 0.534864 0.101075 0.0112746 0.545137 0.10402 0.0108466 0.556955 0.105744 0.0102645 0.57021 0.105943 0.009441 0.584687 0.104321 0.008276 0.600052 0.100614 0.0066585 0.615853 0.0946162 0.0044875 0.631532 0.0862143 0.0016773 0.646456 0.0754161 -0.0018201 0.659959 0.0623711 -0.0060052 0.671405 0.0473803 -0.0108069 0.680245 0.0308887 -0.0161073 0.686077 0.0134588 -0.0216967 0.688692 -0.0042713 -0.027319 0.688094 -0.0216417 -0.0326746 0.684495 -0.0380282 -0.0374566 0.678285 -0.0528942 -0.0413586 0.669982 -0.0658289 -0.0441585 0.660171 -0.0765689 -0.0456862 0.649443 -0.0850002 -0.0458811 0.638345 -0.0911446 -0.044786 0.62734 -0.0951349 -0.0425427 0.61679 -0.0971837 -0.0393647 0.606951 -0.0975525 -0.0355147 0.597978 -0.0965234 -0.0312691 0.589942 -0.0943767 -0.0268899 0.58285 -0.091374 -0.0225956 0.576664 -0.0877487 -0.0185553 0.571318 -0.0837003 -0.0148779 0.566731 -0.0793937 -0.0116205 0.562819 -0.0749607 -0.0087963 0.559498 -0.0705039 -0.0063876 0.556694 -0.0661005 -0.0043567 0.554337 -0.0618071 -0.0026588 0.552368 -0.0576633 -0.001245 0.550734 -0.053696 -7.13e-05 0.505841 0.0459621 0.01176 0.505531 0.0496312 0.011797 0.505607 0.053487 0.0117538 0.506144 0.0575063 0.0116215 0.507224 0.0616548 0.0113936 0.508935 0.0658837 0.0110661 0.511373 0.0701275 0.0106365 0.514634 0.0743009 0.0101031 0.518813 0.0782966 0.0094674 0.523996 0.0819834 0.0087273 0.530252 0.0852059 0.007879 0.537627 0.0877857 0.006914 0.546125 0.0895254 0.0058111 0.555702 0.0902157 0.0045463 0.566252 0.0896462 0.0030823 0.5776 0.087619 0.0013814 0.589492 0.0839664 -0.0006002 0.601608 0.0785694 -0.0028949 0.613562 0.0713775 -0.0055263 0.624929 0.0624247 -0.0084864 0.635269 0.0518409 -0.0117473 0.644166 0.0398552 -0.0152392 0.65126 0.0267885 -0.0188618 0.656284 0.0130363 -0.0224809 0.659086 -0.0009582 -0.0259368 0.659645 -0.0147376 -0.0290586 0.658068 -0.0278646 -0.0316784 0.654576 -0.0399546 -0.0336485 0.649475 -0.0507009 -0.0348638 0.643123 -0.0598899 -0.0352598 0.635898 -0.0674063 -0.0348407 0.628163 -0.073227 -0.0336555 0.620244 -0.0774091 -0.0318148 0.612411 -0.0800715 -0.0294539 0.604875 -0.0813758 -0.0267346 0.597785 -0.0815078 -0.0238154 0.591235 -0.080661 -0.0208437 0.585274 -0.0790241 -0.0179386 0.579915 -0.0767723 -0.0151923 0.575144 -0.0740612 -0.0126629 0.570931 -0.0710254 -0.0103819 0.567238 -0.0677771 -0.0083574 0.56402 -0.0644079 -0.0065814 0.561231 -0.060991 -0.0050351 0.558827 -0.0575835 -0.0036969 0.556768 -0.0542288 -0.0025409 0.555013 -0.0509596 -0.0015447 0.509898 0.0434351 0.0108577 0.509892 0.0465906 0.0108066 0.510245 0.0498633 0.0106727 0.511015 0.0532263 0.0104463 0.512263 0.0566428 0.010118 0.514057 0.060065 0.0096803 0.516462 0.0634318 0.009127 0.519543 0.0666676 0.0084513 0.523358 0.069681 0.0076506 0.527959 0.0723647 0.0067207 0.533378 0.0745961 0.0056588 0.539627 0.0762391 0.0044628 0.546689 0.0771482 0.0031245 0.554511 0.0771741 0.0016398 0.562997 0.0761721 -2.4e-06 0.572005 0.0740118 -0.0018071 0.581347 0.0705889 -0.0037827 0.590789 0.065837 -0.0059277 0.600063 0.0597398 -0.0082335 0.60888 0.05234 -0.0106774 0.616943 0.0437449 -0.0132185 0.623975 0.0341271 -0.0157945 0.629736 0.0237186 -0.018344 0.634042 0.0127992 -0.0207659 0.636783 0.0016795 -0.0229747 0.63793 -0.0093199 -0.0248691 0.637533 -0.0198904 -0.0263717 0.635717 -0.0297549 -0.0273991 0.632663 -0.0386856 -0.0279214 0.628594 -0.0465132 -0.027917 0.623751 -0.0531331 -0.0274036 0.618376 -0.0585027 -0.026427 0.612697 -0.0626357 -0.0250601 0.606912 -0.0655923 -0.0233888 0.601188 -0.0674672 -0.0215076 0.595653 -0.0683779 -0.0195065 0.590402 -0.0684534 -0.0174698 0.585499 -0.0678257 -0.0154639 0.580978 -0.066622 -0.0135415 0.576855 -0.0649604 -0.011737 0.573131 -0.0629466 -0.0100705 0.569793 -0.0606729 -0.0085506 0.566822 -0.0582178 -0.0071768 0.564195 -0.0556469 -0.0059419 0.561885 -0.053014 -0.0048379 0.559867 -0.0503625 -0.0038527 0.558113 -0.0477271 -0.0029763 0.513766 0.0407284 0.0099453 0.513975 0.0434227 0.0098347 0.514508 0.0461812 0.0096448 0.515412 0.0489761 0.0093664 0.516733 0.0517716 0.0089904 0.518519 0.0545229 0.0085089 0.520815 0.0571757 0.0079155 0.523665 0.059665 0.007202 0.527103 0.0619152 0.006366 0.531156 0.0638401 0.0054027 0.535836 0.0653447 0.0043104 0.541138 0.0663264 0.0030916 0.547035 0.066679 0.0017438 0.553472 0.0662971 0.0002723 0.560369 0.0650822 -0.0013202 0.567612 0.0629493 -0.0030233 0.575057 0.0598347 -0.0048305 0.582537 0.0557037 -0.0067257 0.589859 0.0505573 -0.0086883 0.596823 0.0444378 -0.0106878 0.603225 0.0374314 -0.0126918 0.608875 0.0296678 -0.0146474 0.613608 0.0213155 -0.0165124 0.617298 0.0125745 -0.0182308 0.619862 0.0036648 -0.0197422 0.62127 -0.0051866 -0.020999 0.621544 -0.0137592 -0.021954 0.620753 -0.0218521 -0.0225717 0.619006 -0.0292947 -0.0228441 0.616442 -0.0359545 -0.0227662 0.613217 -0.0417408 -0.0223579 0.609495 -0.0466053 -0.0216521 0.605433 -0.0505391 -0.0206957 0.601177 -0.0535668 -0.0195385 0.596854 -0.0557402 -0.0182406 0.59257 -0.0571306 -0.0168537 0.588409 -0.0578218 -0.0154274 0.584435 -0.0579033 -0.014 0.580693 -0.0574655 -0.0126061 0.577209 -0.0565956 -0.0112676 0.573999 -0.0553746 -0.0100001 0.571067 -0.0538759 -0.008813 0.56841 -0.0521645 -0.0077106 0.566019 -0.0502968 -0.0066917 0.563881 -0.0483211 -0.005756 0.56198 -0.0462778 -0.0048992 0.560301 -0.0442007 -0.0041177 0.517446 0.0379617 0.0090547 0.517798 0.0402499 0.0089063 0.518441 0.0425635 0.0086848 0.519408 0.0448755 0.0083826 0.520735 0.0471526 0.0079919 0.522456 0.0493549 0.0075059 0.524601 0.0514352 0.0069193 0.527197 0.053339 0.0062248 0.530265 0.0550049 0.0054208 0.533817 0.0563649 0.0045039 0.537853 0.0573456 0.0034733 0.542358 0.0578707 0.0023331 0.547303 0.057863 0.0010851 0.552638 0.0572484 -0.0002627 0.558295 0.0559601 -0.001703 0.564184 0.0539428 -0.0032213 0.570196 0.0511587 -0.0048056 0.576206 0.0475911 -0.006435 0.582077 0.0432497 -0.0080874 0.587666 0.038173 -0.0097386 0.592829 0.0324293 -0.0113543 0.597435 0.0261162 -0.0129001 0.601367 0.0193573 -0.0143455 0.604535 0.012297 -0.0156491 0.606876 0.005093 -0.0167774 0.608365 -0.0020916 -0.0177018 0.609006 -0.0090976 -0.0183999 0.608839 -0.0157776 -0.0188534 0.607929 -0.0220038 -0.0190617 0.606364 -0.0276726 -0.0190281 0.604248 -0.0327081 -0.018765 0.601688 -0.0370628 -0.0182962 0.598797 -0.0407165 -0.0176521 0.59568 -0.0436737 -0.0168628 0.592433 -0.0459592 -0.0159645 0.589141 -0.047614 -0.0149891 0.585874 -0.0486906 -0.0139678 0.58269 -0.0492484 -0.0129255 0.579633 -0.0493502 -0.0118855 0.576734 -0.0490589 -0.0108633 0.574016 -0.0484354 -0.0098727 0.571491 -0.0475367 -0.0089227 0.569166 -0.0464152 -0.0080198 0.567041 -0.0451178 -0.0071665 0.565111 -0.0436859 -0.0063655 0.563369 -0.0421557 -0.0056172 0.561807 -0.0405582 -0.0049213 0.59263 -0.0409649 0.0116982 0.592902 -0.043466 0.0115196 0.593482 -0.0460016 0.0112481 0.594409 -0.0485435 0.0108737 0.595722 -0.0510573 0.0103864 0.597458 -0.0535011 0.0097772 0.599651 -0.0558255 0.0090387 0.602334 -0.0579731 0.0081613 0.605529 -0.0598789 0.0071425 0.609254 -0.0614706 0.0059775 0.613511 -0.06267 0.0046647 0.618289 -0.0633951 0.0032094 0.623559 -0.0635625 0.0016134 0.629275 -0.0630913 -0.0001126 0.635365 -0.0619074 -0.0019585 0.641739 -0.0599485 -0.0039053 0.648283 -0.0571693 -0.0059361 0.654865 -0.0535472 -0.0080232 0.661341 -0.0490859 -0.0101375 0.667557 -0.0438199 -0.0122466 0.673359 -0.0378154 -0.0143067 0.678601 -0.0311699 -0.016274 0.683154 -0.0240094 -0.0181099 0.686913 -0.0164831 -0.019764 0.689805 -0.0087561 -0.0211952 0.691791 -0.0010014 -0.022369 0.692867 0.0066106 -0.0232589 0.693066 0.01392 -0.0238435 0.692449 0.0207855 -0.0241233 0.691103 0.0270905 -0.0241023 0.689132 0.032747 -0.0237966 0.686649 0.0376962 -0.0232352 0.68377 0.0419088 -0.0224549 0.680607 0.0453816 -0.0214917 0.677264 0.0481343 -0.0203897 0.673835 0.0502046 -0.0191876 0.670397 0.0516432 -0.0179234 0.667015 0.05251 -0.0166277 0.663742 0.0528691 -0.0153298 0.660614 0.0527861 -0.014049 0.65766 0.052325 -0.0128032 0.654897 0.0515466 -0.0116043 0.652334 0.0505073 -0.010461 0.649975 0.0492581 -0.0093774 0.64782 0.0478446 -0.0083575 0.645861 0.0463067 -0.0074022 0.644092 0.0446792 -0.006512 0.588619 -0.0438831 0.0128338 0.588721 -0.0468183 0.0127048 0.589168 -0.0498303 0.0124747 0.590008 -0.0528905 0.0121315 0.591294 -0.0559619 0.0116632 0.593077 -0.058998 0.0110592 0.595409 -0.0619422 0.0103101 0.598337 -0.0647263 0.0094049 0.601902 -0.067271 0.0083392 0.606135 -0.0694852 0.0071063 0.611056 -0.071268 0.0057033 0.616661 -0.0725099 0.0041328 0.622928 -0.073097 0.0023922 0.629805 -0.0729151 0.0004891 0.637211 -0.0718561 -0.0015712 0.64503 -0.0698251 -0.0037725 0.653114 -0.0667484 -0.0061045 0.661287 -0.062582 -0.0085421 0.669348 -0.0573187 -0.0110549 0.67708 -0.0509942 -0.0136031 0.684266 -0.0436908 -0.0161433 0.690696 -0.0355371 -0.0186088 0.696189 -0.0267041 -0.0209461 0.700597 -0.0173981 -0.0230873 0.703821 -0.0078488 -0.0249605 0.705816 0.0017036 -0.0265115 0.706591 0.0110228 -0.027684 0.706207 0.0198905 -0.0284404 0.704769 0.0281178 -0.0287722 0.702416 0.0355541 -0.0286774 0.699307 0.042092 -0.0281801 0.695612 0.0476687 -0.0273212 0.691497 0.052263 -0.0261569 0.687119 0.0558908 -0.0247463 0.682617 0.0585978 -0.0231606 0.678107 0.0604525 -0.0214616 0.673686 0.0615379 -0.0197081 0.669427 0.0619453 -0.0179464 0.665383 0.0617685 -0.0162188 0.661589 0.061099 -0.0145521 0.658067 0.0600231 -0.0129668 0.654827 0.0586201 -0.0114755 0.65187 0.0569606 -0.0100844 0.64919 0.0551067 -0.0087938 0.646775 0.0531121 -0.0076042 0.644613 0.0510223 -0.0065111 0.642687 0.0488756 -0.0055113 0.584438 -0.0467207 0.0139913 0.584295 -0.0501473 0.0139387 0.58453 -0.0537079 0.0137802 0.585206 -0.0573753 0.0135024 0.586391 -0.061112 0.0130924 0.588157 -0.0648687 0.0125393 0.590576 -0.0685821 0.0118333 0.59372 -0.0721736 0.0109636 0.597656 -0.0755478 0.0099252 0.602441 -0.078592 0.0087107 0.608117 -0.0811768 0.0073154 0.614702 -0.0831579 0.0057362 0.622185 -0.0843801 0.003964 0.630518 -0.0846828 0.0019959 0.639605 -0.0839089 -0.0001774 0.649304 -0.0819144 -0.0025564 0.659421 -0.0785811 -0.005144 0.669714 -0.0738292 -0.0079309 0.6799 -0.0676299 -0.010898 0.68967 -0.0600156 -0.0140098 0.698708 -0.0510867 -0.0172102 0.706709 -0.0410129 -0.0204191 0.713408 -0.0300284 -0.0235594 0.718593 -0.0184207 -0.0265101 0.722131 -0.0065133 -0.0291714 0.723971 0.0053552 -0.0314271 0.724147 0.0168538 -0.0331922 0.722773 0.027681 -0.0343739 0.720027 0.0375831 -0.0349453 0.716135 0.0463658 -0.034886 0.711344 0.0539016 -0.0342222 0.705911 0.0601283 -0.0330105 0.700075 0.0650444 -0.0313376 0.694053 0.0686993 -0.0293042 0.688027 0.0711815 -0.0270202 0.682143 0.0726062 -0.02459 0.676511 0.0731041 -0.0221116 0.671205 0.0728111 -0.0196627 0.666273 0.0718608 -0.0173059 0.661741 0.0703787 -0.0150826 0.657614 0.0684786 -0.0130181 0.653885 0.0662612 -0.0111245 0.650541 0.0638129 -0.0094034 0.64756 0.0612072 -0.0078478 0.644918 0.0585049 -0.00645 0.642589 0.0557557 -0.0051968 0.640547 0.0529999 -0.0040773 0.580095 -0.0493471 0.0151279 0.579609 -0.0533187 0.0151868 0.579528 -0.0574991 0.0151416 0.579932 -0.0618654 0.0149792 0.58091 -0.0663829 0.0146889 0.582558 -0.0710023 0.0142625 0.584979 -0.0756562 0.0136933 0.588279 -0.0802566 0.012975 0.592564 -0.0846923 0.0121051 0.59793 -0.0888265 0.0110778 0.604458 -0.092496 0.0098857 0.612203 -0.0955131 0.0085178 0.621181 -0.0976684 0.0069497 0.631355 -0.0987387 0.0051566 0.642622 -0.0984972 0.0031004 0.654808 -0.0967279 0.0007461 0.667655 -0.0932437 -0.001948 0.680829 -0.0879066 -0.0050057 0.693926 -0.0806472 -0.0084394 0.706495 -0.0714835 -0.0122259 0.718065 -0.0605336 -0.0163181 0.728182 -0.0480201 -0.0206221 0.73645 -0.0342648 -0.0250107 0.742561 -0.0196721 -0.0293236 0.746328 -0.0047024 -0.0333752 0.747702 0.0101621 -0.0369736 0.746768 0.0244528 -0.039933 0.743734 0.0377499 -0.0420979 0.738906 0.0497098 -0.0433596 0.73265 0.0600835 -0.0436595 0.725359 0.0687235 -0.0430129 0.717418 0.075581 -0.0414846 0.709176 0.0806933 -0.0392061 0.700931 0.084167 -0.0363339 0.692917 0.0861578 -0.0330527 0.685306 0.0868517 -0.0295426 0.678212 0.0864469 -0.0259706 0.671699 0.0851404 -0.0224719 0.665792 0.0831179 -0.0191528 0.660489 0.0805471 -0.0160806 0.655767 0.0775743 -0.0132936 0.65159 0.0743236 -0.0108038 0.647918 0.0708979 -0.0086041 0.644707 0.0673803 -0.0066753 0.641912 0.0638368 -0.0049945 0.639492 0.0603189 -0.0035329 0.637408 0.0568658 -0.0022657 0.5756 -0.0515763 0.0161678 0.574647 -0.0561369 0.0163863 0.574115 -0.0610002 0.0165146 0.574102 -0.0661525 0.0165445 0.574724 -0.0715664 0.016473 0.57611 -0.0771971 0.0163016 0.578401 -0.082978 0.0160345 0.581754 -0.0888155 0.0156776 0.586328 -0.0945845 0.0152381 0.592282 -0.100124 0.0147164 0.59976 -0.105233 0.0141026 0.608878 -0.109672 0.0133723 0.619701 -0.113164 0.0124739 0.632223 -0.115403 0.0113409 0.646345 -0.116066 0.0098791 0.661855 -0.114832 0.0079843 0.678412 -0.11141 0.0055429 0.69555 -0.105568 0.0024568 0.712685 -0.097166 -0.0013499 0.729147 -0.0861854 -0.0059073 0.744227 -0.0727561 -0.0111887 0.757232 -0.0571664 -0.0170858 0.767557 -0.0398582 -0.023441 0.774745 -0.0214033 -0.0299982 0.778534 -0.0024619 -0.0364592 0.778885 0.0162717 -0.0424868 0.775983 0.0341286 -0.0477489 0.770206 0.0505208 -0.0519206 0.762077 0.0649841 -0.0547812 0.752199 0.077204 -0.0561662 0.741193 0.0870221 -0.0560339 0.729645 0.0944247 -0.0544515 0.718059 0.0995203 -0.051591 0.706836 0.102508 -0.0476974 0.696266 0.103645 -0.0430662 0.686536 0.103219 -0.0380047 0.677742 0.10152 -0.0328037 0.66991 0.0988238 -0.0277049 0.663014 0.0953816 -0.0228975 0.656996 0.0914103 -0.0185036 0.651781 0.0870922 -0.0145892 0.647287 0.0825753 -0.011172 0.643431 0.0779769 -0.0082344 0.640137 0.0733872 -0.0057368 0.637334 0.0688736 -0.0036308 0.63496 0.0644854 -0.0018622 0.632961 0.060257 -0.0003818 0.570628 -0.053171 0.0170684 0.569047 -0.0583438 0.0175057 0.567884 -0.0639329 0.0178865 0.56726 -0.0699391 0.0182152 0.56732 -0.0763487 0.0185062 0.568235 -0.0831287 0.0187825 0.570199 -0.09022 0.0190728 0.573434 -0.0975306 0.0194077 0.57818 -0.104927 0.0198161 0.584687 -0.112228 0.0203109 0.593197 -0.119196 0.0208809 0.603922 -0.125533 0.0214794 0.617016 -0.130883 0.0220119 0.632536 -0.134835 0.0223417 0.650405 -0.136939 0.0222833 0.670375 -0.136728 0.0216238 0.692004 -0.133758 0.0201232 0.714638 -0.127647 0.0175491 0.737426 -0.118132 0.0137015 0.759364 -0.10512 0.0084342 0.779368 -0.0887322 0.0016955 0.796367 -0.0693314 -0.0064397 0.809423 -0.0475207 -0.0157614 0.817838 -0.0241105 -0.025911 0.821238 -5.31e-05 -0.0363885 0.819626 0.023646 -0.0466259 0.813366 0.0460253 -0.0560107 0.803138 0.0662583 -0.0639691 0.789835 0.0837206 -0.0700281 0.774453 0.0980256 -0.0738471 0.757976 0.109026 -0.0752637 0.741288 0.116786 -0.0743038 0.725108 0.121537 -0.0711724 0.709965 0.123623 -0.0662215 0.696194 0.123449 -0.0599092 0.683965 0.12144 -0.0527361 0.67331 0.118003 -0.0451941 0.664168 0.113511 -0.0377124 0.656415 0.108289 -0.0306311 0.649897 0.102605 -0.0241808 0.64445 0.0966789 -0.0184892 0.63992 0.0906792 -0.0135965 0.636164 0.0847334 -0.0094768 0.633059 0.0789341 -0.006063 0.630503 0.0733453 -0.0032679 0.628407 0.0680092 -0.0009967 0.626701 0.0629511 0.000839 0.564568 -0.0538302 0.0178265 0.562157 -0.0596045 0.0185546 0.560134 -0.0659257 0.0192894 0.558644 -0.0728151 0.0200603 0.557867 -0.0802808 0.0209145 0.558025 -0.0883101 0.021915 0.559381 -0.0968623 0.0231342 0.562244 -0.105858 0.0246473 0.566965 -0.115166 0.0265205 0.573922 -0.124596 0.0287898 0.583502 -0.133879 0.0314445 0.596069 -0.142664 0.0344087 0.611917 -0.150509 0.0375274 0.631216 -0.156879 0.0405703 0.653952 -0.161165 0.0432251 0.67986 -0.162704 0.045113 0.70837 -0.160832 0.0458015 0.738581 -0.154941 0.0448219 0.769261 -0.144562 0.0417114 0.798903 -0.129458 0.0360609 0.82584 -0.109698 0.0275959 0.848405 -0.0857155 0.0162796 0.865122 -0.0583211 0.0023494 0.874906 -0.0286583 -0.0136074 0.877214 0.0018969 -0.0307364 0.872129 0.0318807 -0.0479944 0.860346 0.0599052 -0.0643072 0.843064 0.084808 -0.0786531 0.821804 0.105759 -0.0902329 0.798201 0.122308 -0.0984489 0.773808 0.134369 -0.102981 0.749944 0.142159 -0.103787 0.727611 0.146114 -0.101084 0.707468 0.146793 -0.0953359 0.689855 0.144804 -0.0871827 0.674857 0.140742 -0.0773829 0.662365 0.135155 -0.0667157 0.652149 0.128515 -0.0558957 0.643918 0.121219 -0.0455141 0.637361 0.113586 -0.0359949 0.632182 0.105862 -0.027591 0.628118 0.0982321 -0.0204028 0.624944 0.0908273 -0.0144122 0.622479 0.0837371 -0.0095225 0.620578 0.0770174 -0.0055953 0.619127 0.0706992 -0.0024767 0.61804 0.0647949 -2.03e-05 0.55608 -0.0532244 0.0186257 0.552586 -0.0595378 0.0197198 0.549416 -0.0665379 0.0209225 0.546738 -0.0742732 0.0223041 0.544772 -0.0827812 0.023965 0.543797 -0.0920807 0.0260311 0.544163 -0.102161 0.0286428 0.546292 -0.112972 0.0319419 0.550678 -0.124403 0.0360508 0.557877 -0.136271 0.0410414 0.568477 -0.148299 0.046911 0.583062 -0.160095 0.0535604 0.602143 -0.171139 0.0607834 0.626083 -0.180771 0.0682662 0.654997 -0.188194 0.0755712 0.688646 -0.192499 0.0821356 0.726339 -0.192719 0.0872337 0.766861 -0.187914 0.0899627 0.808453 -0.177294 0.089279 0.848879 -0.16036 0.084099 0.885588 -0.137042 0.0735342 0.91597 -0.107814 0.0571772 0.93769 -0.0737348 0.0353601 0.949029 -0.0363963 0.0092358 0.949164 0.0022227 -0.0193705 0.938328 0.0399926 -0.0483216 0.917782 0.0749048 -0.0755689 0.889611 0.105325 -0.0994748 0.856385 0.130165 -0.118925 0.820772 0.148944 -0.133267 0.785192 0.161738 -0.142232 0.75158 0.169046 -0.145827 0.721273 0.17163 -0.144323 0.69502 0.17036 -0.138249 0.673071 0.166102 -0.128386 0.655294 0.159642 -0.115712 0.641312 0.15166 -0.101314 0.630613 0.142713 -0.0862613 0.622639 0.13325 -0.0714924 0.616849 0.123616 -0.0577327 0.612759 0.114073 -0.0454577 0.609958 0.10481 -0.0348989 0.608116 0.0959565 -0.0260878 0.606977 0.0875946 -0.0189149 0.606351 0.0797705 -0.0131876 0.606097 0.0725027 -0.0086785 0.606116 0.0657903 -0.0051625 0.543477 -0.0510388 0.0198609 0.538618 -0.05776 0.0213945 0.533975 -0.0653045 0.0231823 0.52974 -0.0737524 0.0253541 0.526174 -0.0831781 0.0280847 0.523624 -0.0936416 0.0315859 0.522538 -0.105178 0.0360885 0.523474 -0.117781 0.041821 0.527107 -0.131388 0.0489791 0.534216 -0.145854 0.0576878 0.545658 -0.160924 0.0679814 0.562316 -0.176205 0.0797924 0.585018 -0.191126 0.0929551 0.61443 -0.204918 0.107202 0.650909 -0.21659 0.122114 0.694338 -0.224941 0.137015 0.743948 -0.228618 0.150781 0.798172 -0.226224 0.161636 0.854574 -0.216489 0.167115 0.909896 -0.198488 0.164311 0.960285 -0.171875 0.150558 1.00169 -0.137082 0.124431 1.03041 -0.095422 0.0865633 1.04366 -0.0490559 0.039975 1.04014 -0.0007824 -0.0105812 1.02031 0.0463225 -0.0599151 0.986336 0.0893555 -0.103768 0.941799 0.126016 -0.13965 0.890996 0.1549 -0.166884 0.838248 0.175577 -0.185914 0.787283 0.188463 -0.197613 0.740856 0.194551 -0.202752 0.700643 0.195109 -0.201887 0.667346 0.19143 -0.195515 0.640908 0.184674 -0.184266 0.620775 0.175799 -0.169042 0.606108 0.165562 -0.151007 0.595963 0.154547 -0.131469 0.589402 0.143195 -0.111717 0.585574 0.131844 -0.0928486 0.583749 0.120744 -0.0756713 0.583334 0.110077 -0.0606568 0.583869 0.0999698 -0.0479736 0.585013 0.0905011 -0.0375547 0.586523 0.081712 -0.0291794 0.588235 0.0736143 -0.0225513 0.590041 0.0661981 -0.0173574 0.524851 -0.0470808 0.0222452 0.518344 -0.0539977 0.0242747 0.511903 -0.0618527 0.0267429 0.505739 -0.0707599 0.0298526 0.500155 -0.0808343 0.0338664 0.495568 -0.0921847 0.0390939 0.492534 -0.104903 0.0458646 0.491765 -0.119052 0.0544976 0.494144 -0.134639 0.0652685 0.500716 -0.151598 0.0783843 0.512667 -0.169745 0.0939938 0.531267 -0.188738 0.11223 0.557782 -0.208018 0.133268 0.593332 -0.226746 0.157333 0.63869 -0.243759 0.184563 0.694029 -0.257546 0.214608 0.758628 -0.266294 0.245935 0.830587 -0.268022 0.275012 0.906646 -0.260808 0.295896 0.98219 -0.243109 0.300754 1.05153 -0.214117 0.281897 1.10847 -0.17408 0.234819 1.14719 -0.12451 0.161027 1.16319 -0.0682032 0.0689755 1.15425 -0.0089907 -0.0279754 1.12104 0.0487738 -0.115935 1.06718 0.100925 -0.185054 0.998625 0.144221 -0.231946 0.922524 0.176856 -0.259075 0.845837 0.198592 -0.27191 0.774236 0.210483 -0.275883 0.711516 0.214343 -0.274621 0.659556 0.212196 -0.269625 0.618676 0.205876 -0.261027 0.588136 0.196823 -0.2485 0.566619 0.186074 -0.23196 0.552577 0.174334 -0.211878 0.544461 0.162084 -0.189262 0.540851 0.149666 -0.165457 0.540519 0.137345 -0.141853 0.542448 0.125333 -0.119649 0.545833 0.113799 -0.0996897 0.550066 0.102873 -0.0824253 0.554711 0.0926459 -0.0679542 0.559467 0.08317 -0.0561154 0.564147 0.074466 -0.0465945 0.568638 0.0665281 -0.0390151 0.499394 -0.0413833 0.026681 0.491031 -0.0482072 0.0292517 0.482549 -0.0560429 0.032468 0.474176 -0.0650357 0.0366071 0.466251 -0.075341 0.0420174 0.45926 -0.0871193 0.0490947 0.453868 -0.100529 0.0582472 0.450947 -0.115713 0.0698613 0.451598 -0.132783 0.0842875 0.457159 -0.151786 0.101859 0.469195 -0.172669 0.123008 0.489448 -0.195206 0.148446 0.519754 -0.218922 0.179402 0.561879 -0.242982 0.217717 0.61726 -0.266094 0.265533 0.686619 -0.286445 0.324238 0.769494 -0.301722 0.392424 0.863742 -0.309265 0.463322 0.965163 -0.306372 0.523022 1.06742 -0.29073 0.551419 1.16235 -0.260903 0.527417 1.24081 -0.216797 0.437606 1.29383 -0.159988 0.28476 1.31419 -0.0938456 0.0909864 1.298 -0.023324 -0.107761 1.24592 0.0456596 -0.274478 1.16356 0.107259 -0.384943 1.06062 0.156909 -0.434991 0.948805 0.192275 -0.43774 0.839307 0.213514 -0.414004 0.740682 0.222752 -0.382403 0.65793 0.223093 -0.354042 0.592727 0.217631 -0.332386 0.544347 0.208822 -0.316044 0.51073 0.19829 -0.301793 0.489316 0.186936 -0.286619 0.477562 0.175187 -0.268677 0.473174 0.163228 -0.247458 0.474193 0.151171 -0.223571 0.478995 0.139136 -0.198298 0.486268 0.127268 -0.173135 0.494989 0.115728 -0.149402 0.504387 0.104673 -0.128032 0.513915 0.094232 -0.109504 0.523208 0.0844983 -0.0939 0.532041 0.0755263 -0.0810246 0.5403 0.0673353 -0.0705276 0.468114 -0.0343237 0.0341846 0.457828 -0.040715 0.0373365 0.447225 -0.048134 0.0413375 0.436541 -0.0567503 0.0465218 0.426148 -0.0667539 0.0532948 0.416593 -0.0783541 0.0620958 0.40864 -0.0917757 0.0733528 0.403312 -0.107252 0.0874612 0.401925 -0.125012 0.104818 0.406116 -0.145252 0.125954 0.417856 -0.168087 0.151874 0.43944 -0.193473 0.18458 0.473424 -0.221084 0.227749 0.522456 -0.250157 0.287168 0.588943 -0.279329 0.370264 0.674496 -0.306513 0.483697 0.779185 -0.328896 0.628291 0.900719 -0.343124 0.792056 1.03381 -0.3457 0.944688 1.16997 -0.333546 1.03862 1.29795 -0.304608 1.02121 1.40477 -0.258398 0.856115 1.47733 -0.196402 0.545656 1.50449 -0.122314 0.140565 1.47946 -0.0420005 -0.271951 1.40218 0.0370522 -0.600337 1.28062 0.107016 -0.78549 1.12991 0.161581 -0.821683 0.968904 0.197667 -0.749342 0.815441 0.216038 -0.627757 0.682312 0.220434 -0.506876 0.575759 0.215801 -0.413729 0.496382 0.20661 -0.354072 0.441273 0.195931 -0.32148 0.406092 0.185331 -0.305699 0.386456 0.175257 -0.297391 0.378565 0.16556 -0.289845 0.379341 0.155912 -0.279171 0.386333 0.146058 -0.263913 0.397585 0.135908 -0.244424 0.411534 0.125531 -0.22214 0.426947 0.115094 -0.198859 0.442881 0.10481 -0.176216 0.458653 0.0948822 -0.155381 0.473805 0.0854758 -0.136986 0.488057 0.0767076 -0.121211 0.50127 0.0686444 -0.107923 0.436506 -0.0266463 0.0453539 0.424477 -0.0322663 0.0491717 0.411946 -0.0388637 0.0540253 0.399157 -0.0466224 0.0602819 0.386506 -0.0557562 0.0683634 0.374593 -0.0665126 0.0786962 0.364271 -0.0791737 0.091665 0.356694 -0.0940558 0.107619 0.353379 -0.111501 0.127 0.356253 -0.131854 0.150689 0.36772 -0.155409 0.18076 0.390699 -0.182316 0.22168 0.428619 -0.212425 0.281922 0.485261 -0.245078 0.375287 0.564326 -0.278877 0.520363 0.668635 -0.311505 0.735731 0.798983 -0.339711 1.02881 0.952878 -0.359561 1.37971 1.1236 -0.366971 1.72753 1.30002 -0.358396 1.97131 1.46724 -0.331495 1.99522 1.60797 -0.285607 1.71495 1.7044 -0.222072 1.12668 1.74049 -0.144507 0.331445 1.70521 -0.059043 -0.485922 1.59639 0.0258519 -1.12384 1.42399 0.100564 -1.44833 1.21019 0.156827 -1.44691 0.984333 0.190567 -1.2168 0.774245 0.203252 -0.898775 0.598751 0.200656 -0.606978 0.465102 0.189965 -0.396953 0.371345 0.177122 -0.274045 0.310721 0.165608 -0.218412 0.27543 0.156582 -0.205224 0.258688 0.149705 -0.213925 0.255333 0.144009 -0.230043 0.261631 0.13851 -0.244336 0.274837 0.132524 -0.251778 0.292831 0.125735 -0.250679 0.313895 0.118139 -0.241775 0.336617 0.109928 -0.227161 0.35987 0.101388 -0.209343 0.382796 0.0928115 -0.190535 0.404796 0.0844539 -0.172328 0.425493 0.0765071 -0.155651 0.44469 0.0690979 -0.140892 0.418215 -0.0193247 0.059059 0.404925 -0.0238873 0.0637015 0.390989 -0.0293099 0.0695957 0.376656 -0.0357756 0.077144 0.362345 -0.043505 0.0867945 0.348701 -0.0527624 0.0989776 0.336653 -0.063861 0.114073 0.327479 -0.0771669 0.132465 0.322882 -0.0930946 0.15483 0.32508 -0.112086 0.182802 0.336924 -0.134557 0.220382 0.362025 -0.160791 0.276246 0.404813 -0.190764 0.366942 0.470389 -0.2239 0.51977 0.563967 -0.258793 0.772312 0.689712 -0.293002 1.16357 0.849058 -0.32306 1.71236 1.03892 -0.344819 2.38543 1.25053 -0.354129 3.07044 1.46957 -0.347613 3.57816 1.67731 -0.323256 3.69058 1.85245 -0.280647 3.24668 1.97284 -0.221041 2.23098 2.01759 -0.147538 0.819262 1.97045 -0.0655624 -0.652023 1.82531 0.0167063 -1.80119 1.59272 0.0889804 -2.36141 1.3026 0.141571 -2.29972 0.997903 0.169407 -1.80814 0.720264 0.174468 -1.171 0.49642 0.164344 -0.61358 0.334024 0.148132 -0.234715 0.226623 0.132778 -0.0310746 0.161753 0.12171 0.0452353 0.127054 0.115384 0.0445073 0.11301 0.112573 0.0038926 0.113231 0.111535 -0.0523097 0.123648 0.110734 -0.108557 0.141548 0.109151 -0.155323 0.164887 0.106309 -0.187927 0.191933 0.102151 -0.205668 0.221153 0.0968878 -0.210577 0.251227 0.0908521 -0.206054 0.28109 0.0843986 -0.19564 0.309948 0.0778416 -0.182293 0.337273 0.0714272 -0.168101 0.362762 0.0653279 -0.15433 0.437348 -0.01295 0.0700873 0.423596 -0.0162282 0.0758206 0.40909 -0.0201743 0.0832239 0.394084 -0.0249474 0.0928644 0.379018 -0.0307437 0.105399 0.364578 -0.0378035 0.121528 0.351765 -0.0464173 0.141983 0.341972 -0.0569296 0.167669 0.33708 -0.0697355 0.200134 0.339588 -0.0852609 0.24263 0.352795 -0.103911 0.302326 0.380999 -0.125972 0.393966 0.429627 -0.151442 0.545044 0.505088 -0.179801 0.800549 0.61402 -0.209755 1.22225 0.761711 -0.239059 1.87392 0.949793 -0.26458 2.78517 1.17397 -0.282705 3.8989 1.42292 -0.290041 5.02937 1.67898 -0.284112 5.87111 1.92023 -0.263728 6.0807 2.12249 -0.228943 5.41016 2.26072 -0.180869 3.83673 2.31021 -0.121717 1.62906 2.24957 -0.0553594 -0.692695 2.06752 0.0118411 -2.51993 1.77318 0.0709576 -3.40543 1.40325 0.112724 -3.27607 1.01563 0.131886 -2.44616 0.667989 0.130387 -1.39852 0.39599 0.116101 -0.511936 0.206814 0.0982321 0.0611384 0.0879316 0.0833561 0.344471 0.0200283 0.0742187 0.429574 -0.0142166 0.0706128 0.401914 -0.0269375 0.0708506 0.318419 -0.0254114 0.0729407 0.212862 -0.0136728 0.0752462 0.106013 0.0059111 0.0767151 0.0113362 0.0315999 0.0768552 -0.063395 0.0617947 0.0755936 -0.115619 0.0949265 0.0731151 -0.146923 0.129523 0.0697245 -0.161396 0.164314 0.0657504 -0.163893 0.198303 0.0614875 -0.158871 0.230786 0.0571709 -0.149779 0.261328 0.0529707 -0.13897 0.499801 -0.0068816 0.0717042 0.486291 -0.0086352 0.0786636 0.471918 -0.0107677 0.0880104 0.456937 -0.0133765 0.100676 0.441796 -0.0165835 0.117822 0.427208 -0.0205393 0.140816 0.414223 -0.0254268 0.171258 0.404319 -0.0314633 0.211187 0.399513 -0.0388963 0.263689 0.402525 -0.0479893 0.334273 0.416997 -0.0589879 0.433705 0.44776 -0.0720546 0.582802 0.501002 -0.0871637 0.819184 0.584103 -0.103957 1.20345 0.704706 -0.121592 1.81775 0.868756 -0.138648 2.74484 1.07769 -0.153204 4.01793 1.32587 -0.163132 5.5497 1.5997 -0.166566 7.08021 1.87906 -0.162294 8.19719 2.14006 -0.149897 8.45236 2.35713 -0.129605 7.53345 2.50383 -0.102102 5.42201 2.5532 -0.0685172 2.4714 2.48004 -0.0307923 -0.639586 2.26844 0.0076415 -3.10377 1.92515 0.0415349 -4.30578 1.49136 0.0650105 -4.12588 1.03719 0.0745113 -2.98867 0.634159 0.0712506 -1.56762 0.325384 0.0604777 -0.389681 0.117018 0.0482441 0.344717 -0.0092052 0.0386755 0.68447 -0.0785547 0.033287 0.766302 -0.112374 0.0317035 0.709652 -0.124739 0.0326855 0.588502 -0.123436 0.0348825 0.443042 -0.112294 0.0372225 0.296542 -0.093262 0.0390296 0.164447 -0.0677258 0.0399887 0.0564953 -0.0370906 0.0400481 -0.0233265 -0.0028883 0.0393158 -0.0760804 0.0333359 0.0379735 -0.106196 0.0701821 0.0362186 -0.119443 0.106511 0.0342292 -0.121395 0.141487 0.032149 -0.116576 0.174572 0.0300832 -0.108223 0.541344 0 0.0690495 0.528103 0 0.0766452 0.513942 0 0.0870776 0.49911 0 0.101526 0.484057 0 0.121485 0.469502 0 0.148779 0.456512 0 0.185592 0.446594 0 0.234683 0.441819 0 0.300064 0.444988 0 0.388455 0.459877 0 0.512353 0.491514 0 0.695203 0.546378 0 0.97874 0.632204 0 1.42967 0.756999 0 2.13774 0.926907 0 3.19205 1.14322 0 4.62514 1.3997 0 6.33417 1.68184 0 8.02635 1.96865 0 9.24558 2.23561 0 9.50259 2.45678 0 8.4629 2.60532 0 6.11351 2.65355 0 2.84393 2.57486 0 -0.603772 2.35145 0 -3.34089 1.98898 0 -4.68195 1.5301 0 -4.48638 1.04983 0 -3.22319 0.625274 0 -1.64759 0.302529 0 -0.350379 0.0871655 0 0.448196 -0.0415065 0 0.808774 -0.111171 0 0.887954 -0.144745 0 0.819669 -0.157034 0 0.684779 -0.155996 0 0.525551 -0.145356 0 0.36569 -0.126885 0 0.221068 -0.101812 0 0.101913 -0.0714507 0 0.0126968 -0.0373045 0 -0.0473625 -0.0009324 0 -0.0827828 0.0362266 0 -0.0996259 0.0729855 0 -0.103838 0.108466 0 -0.100318 0.142092 0 -0.092615 0.499801 0.0068816 0.0717042 0.486291 0.0086352 0.0786636 0.471918 0.0107677 0.0880104 0.456937 0.0133765 0.100676 0.441796 0.0165835 0.117822 0.427208 0.0205393 0.140816 0.414223 0.0254268 0.171258 0.404319 0.0314633 0.211187 0.399513 0.0388963 0.263689 0.402525 0.0479893 0.334273 0.416997 0.0589879 0.433705 0.44776 0.0720546 0.582802 0.501002 0.0871637 0.819184 0.584103 0.103957 1.20345 0.704706 0.121592 1.81775 0.868756 0.138648 2.74484 1.07769 0.153204 4.01793 1.32587 0.163132 5.5497 1.5997 0.166566 7.08021 1.87906 0.162294 8.19719 2.14006 0.149897 8.45236 2.35713 0.129605 7.53345 2.50383 0.102102 5.42201 2.5532 0.0685172 2.4714 2.48004 0.0307923 -0.639586 2.26844 -0.0076415 -3.10377 1.92515 -0.0415349 -4.30578 1.49136 -0.0650105 -4.12588 1.03719 -0.0745113 -2.98867 0.634159 -0.0712506 -1.56762 0.325384 -0.0604777 -0.389681 0.117018 -0.0482441 0.344717 -0.0092052 -0.0386755 0.68447 -0.0785547 -0.033287 0.766302 -0.112374 -0.0317035 0.709652 -0.124739 -0.0326855 0.588502 -0.123436 -0.0348825 0.443042 -0.112294 -0.0372225 0.296542 -0.093262 -0.0390296 0.164447 -0.0677258 -0.0399887 0.0564953 -0.0370906 -0.0400481 -0.0233265 -0.0028883 -0.0393158 -0.0760804 0.0333359 -0.0379735 -0.106196 0.0701821 -0.0362186 -0.119443 0.106511 -0.0342292 -0.121395 0.141487 -0.032149 -0.116576 0.174572 -0.0300832 -0.108223 0.437348 0.01295 0.0700873 0.423596 0.0162282 0.0758206 0.40909 0.0201743 0.0832239 0.394084 0.0249474 0.0928644 0.379018 0.0307437 0.105399 0.364578 0.0378035 0.121528 0.351765 0.0464173 0.141983 0.341972 0.0569296 0.167669 0.33708 0.0697355 0.200134 0.339588 0.0852609 0.24263 0.352795 0.103911 0.302326 0.380999 0.125972 0.393966 0.429627 0.151442 0.545044 0.505088 0.179801 0.800549 0.61402 0.209755 1.22225 0.761711 0.239059 1.87392 0.949793 0.26458 2.78517 1.17397 0.282705 3.8989 1.42292 0.290041 5.02937 1.67898 0.284112 5.87111 1.92023 0.263728 6.0807 2.12249 0.228943 5.41016 2.26072 0.180869 3.83673 2.31021 0.121717 1.62906 2.24957 0.0553594 -0.692695 2.06752 -0.0118411 -2.51993 1.77318 -0.0709576 -3.40543 1.40325 -0.112724 -3.27607 1.01563 -0.131886 -2.44616 0.667989 -0.130387 -1.39852 0.39599 -0.116101 -0.511936 0.206814 -0.0982321 0.0611384 0.0879316 -0.0833561 0.344471 0.0200283 -0.0742187 0.429574 -0.0142166 -0.0706128 0.401914 -0.0269375 -0.0708506 0.318419 -0.0254114 -0.0729407 0.212862 -0.0136728 -0.0752462 0.106013 0.0059111 -0.0767151 0.0113362 0.0315999 -0.0768552 -0.063395 0.0617947 -0.0755936 -0.115619 0.0949265 -0.0731151 -0.146923 0.129523 -0.0697245 -0.161396 0.164314 -0.0657504 -0.163893 0.198303 -0.0614875 -0.158871 0.230786 -0.0571709 -0.149779 0.261328 -0.0529707 -0.13897 0.418215 0.0193247 0.059059 0.404925 0.0238873 0.0637015 0.390989 0.0293099 0.0695957 0.376656 0.0357756 0.077144 0.362345 0.043505 0.0867945 0.348701 0.0527624 0.0989776 0.336653 0.063861 0.114073 0.327479 0.0771669 0.132465 0.322882 0.0930946 0.15483 0.32508 0.112086 0.182802 0.336924 0.134557 0.220382 0.362025 0.160791 0.276246 0.404813 0.190764 0.366942 0.470389 0.2239 0.51977 0.563967 0.258793 0.772312 0.689712 0.293002 1.16357 0.849058 0.32306 1.71236 1.03892 0.344819 2.38543 1.25053 0.354129 3.07044 1.46957 0.347613 3.57816 1.67731 0.323256 3.69058 1.85245 0.280647 3.24668 1.97284 0.221041 2.23098 2.01759 0.147538 0.819262 1.97045 0.0655624 -0.652023 1.82531 -0.0167063 -1.80119 1.59272 -0.0889804 -2.36141 1.3026 -0.141571 -2.29972 0.997903 -0.169407 -1.80814 0.720264 -0.174468 -1.171 0.49642 -0.164344 -0.61358 0.334024 -0.148132 -0.234715 0.226623 -0.132778 -0.0310746 0.161753 -0.12171 0.0452353 0.127054 -0.115384 0.0445073 0.11301 -0.112573 0.0038926 0.113231 -0.111535 -0.0523097 0.123648 -0.110734 -0.108557 0.141548 -0.109151 -0.155323 0.164887 -0.106309 -0.187927 0.191933 -0.102151 -0.205668 0.221153 -0.0968878 -0.210577 0.251227 -0.0908521 -0.206054 0.28109 -0.0843986 -0.19564 0.309948 -0.0778416 -0.182293 0.337273 -0.0714272 -0.168101 0.362762 -0.0653279 -0.15433 0.436506 0.0266463 0.0453539 0.424477 0.0322663 0.0491717 0.411946 0.0388637 0.0540253 0.399157 0.0466224 0.0602819 0.386506 0.0557562 0.0683634 0.374593 0.0665126 0.0786962 0.364271 0.0791737 0.091665 0.356694 0.0940558 0.107619 0.353379 0.111501 0.127 0.356253 0.131854 0.150689 0.36772 0.155409 0.18076 0.390699 0.182316 0.22168 0.428619 0.212425 0.281922 0.485261 0.245078 0.375287 0.564326 0.278877 0.520363 0.668635 0.311505 0.735731 0.798983 0.339711 1.02881 0.952878 0.359561 1.37971 1.1236 0.366971 1.72753 1.30002 0.358396 1.97131 1.46724 0.331495 1.99522 1.60797 0.285607 1.71495 1.7044 0.222072 1.12668 1.74049 0.144507 0.331445 1.70521 0.059043 -0.485922 1.59639 -0.0258519 -1.12384 1.42399 -0.100564 -1.44833 1.21019 -0.156827 -1.44691 0.984333 -0.190567 -1.2168 0.774245 -0.203252 -0.898775 0.598751 -0.200656 -0.606978 0.465102 -0.189965 -0.396953 0.371345 -0.177122 -0.274045 0.310721 -0.165608 -0.218412 0.27543 -0.156582 -0.205224 0.258688 -0.149705 -0.213925 0.255333 -0.144009 -0.230043 0.261631 -0.13851 -0.244336 0.274837 -0.132524 -0.251778 0.292831 -0.125735 -0.250679 0.313895 -0.118139 -0.241775 0.336617 -0.109928 -0.227161 0.35987 -0.101388 -0.209343 0.382796 -0.0928115 -0.190535 0.404796 -0.0844539 -0.172328 0.425493 -0.0765071 -0.155651 0.44469 -0.0690979 -0.140892 0.468114 0.0343237 0.0341846 0.457828 0.040715 0.0373365 0.447225 0.048134 0.0413375 0.436541 0.0567503 0.0465218 0.426148 0.0667539 0.0532948 0.416593 0.0783541 0.0620958 0.40864 0.0917757 0.0733528 0.403312 0.107252 0.0874612 0.401925 0.125012 0.104818 0.406116 0.145252 0.125954 0.417856 0.168087 0.151874 0.43944 0.193473 0.18458 0.473424 0.221084 0.227749 0.522456 0.250157 0.287168 0.588943 0.279329 0.370264 0.674496 0.306513 0.483697 0.779185 0.328896 0.628291 0.900719 0.343124 0.792056 1.03381 0.3457 0.944688 1.16997 0.333546 1.03862 1.29795 0.304608 1.02121 1.40477 0.258398 0.856115 1.47733 0.196402 0.545656 1.50449 0.122314 0.140565 1.47946 0.0420005 -0.271951 1.40218 -0.0370522 -0.600337 1.28062 -0.107016 -0.78549 1.12991 -0.161581 -0.821683 0.968904 -0.197667 -0.749342 0.815441 -0.216038 -0.627757 0.682312 -0.220434 -0.506876 0.575759 -0.215801 -0.413729 0.496382 -0.20661 -0.354072 0.441273 -0.195931 -0.32148 0.406092 -0.185331 -0.305699 0.386456 -0.175257 -0.297391 0.378565 -0.16556 -0.289845 0.379341 -0.155912 -0.279171 0.386333 -0.146058 -0.263913 0.397585 -0.135908 -0.244424 0.411534 -0.125531 -0.22214 0.426947 -0.115094 -0.198859 0.442881 -0.10481 -0.176216 0.458653 -0.0948822 -0.155381 0.473805 -0.0854758 -0.136986 0.488057 -0.0767076 -0.121211 0.50127 -0.0686444 -0.107923 0.499394 0.0413833 0.026681 0.491031 0.0482072 0.0292517 0.482549 0.0560429 0.032468 0.474176 0.0650357 0.0366071 0.466251 0.075341 0.0420174 0.45926 0.0871193 0.0490947 0.453868 0.100529 0.0582472 0.450947 0.115713 0.0698613 0.451598 0.132783 0.0842875 0.457159 0.151786 0.101859 0.469195 0.172669 0.123008 0.489448 0.195206 0.148446 0.519754 0.218922 0.179402 0.561879 0.242982 0.217717 0.61726 0.266094 0.265533 0.686619 0.286445 0.324238 0.769494 0.301722 0.392424 0.863742 0.309265 0.463322 0.965163 0.306372 0.523022 1.06742 0.29073 0.551419 1.16235 0.260903 0.527417 1.24081 0.216797 0.437606 1.29383 0.159988 0.28476 1.31419 0.0938456 0.0909864 1.298 0.023324 -0.107761 1.24592 -0.0456596 -0.274478 1.16356 -0.107259 -0.384943 1.06062 -0.156909 -0.434991 0.948805 -0.192275 -0.43774 0.839307 -0.213514 -0.414004 0.740682 -0.222752 -0.382403 0.65793 -0.223093 -0.354042 0.592727 -0.217631 -0.332386 0.544347 -0.208822 -0.316044 0.51073 -0.19829 -0.301793 0.489316 -0.186936 -0.286619 0.477562 -0.175187 -0.268677 0.473174 -0.163228 -0.247458 0.474193 -0.151171 -0.223571 0.478995 -0.139136 -0.198298 0.486268 -0.127268 -0.173135 0.494989 -0.115728 -0.149402 0.504387 -0.104673 -0.128032 0.513915 -0.094232 -0.109504 0.523208 -0.0844983 -0.0939 0.532041 -0.0755263 -0.0810246 0.5403 -0.0673353 -0.0705276 0.524851 0.0470808 0.0222452 0.518344 0.0539977 0.0242747 0.511903 0.0618527 0.0267429 0.505739 0.0707599 0.0298526 0.500155 0.0808343 0.0338664 0.495568 0.0921847 0.0390939 0.492534 0.104903 0.0458646 0.491765 0.119052 0.0544976 0.494144 0.134639 0.0652685 0.500716 0.151598 0.0783843 0.512667 0.169745 0.0939938 0.531267 0.188738 0.11223 0.557782 0.208018 0.133268 0.593332 0.226746 0.157333 0.63869 0.243759 0.184563 0.694029 0.257546 0.214608 0.758628 0.266294 0.245935 0.830587 0.268022 0.275012 0.906646 0.260808 0.295896 0.98219 0.243109 0.300754 1.05153 0.214117 0.281897 1.10847 0.17408 0.234819 1.14719 0.12451 0.161027 1.16319 0.0682032 0.0689755 1.15425 0.0089907 -0.0279754 1.12104 -0.0487738 -0.115935 1.06718 -0.100925 -0.185054 0.998625 -0.144221 -0.231946 0.922524 -0.176856 -0.259075 0.845837 -0.198592 -0.27191 0.774236 -0.210483 -0.275883 0.711516 -0.214343 -0.274621 0.659556 -0.212196 -0.269625 0.618676 -0.205876 -0.261027 0.588136 -0.196823 -0.2485 0.566619 -0.186074 -0.23196 0.552577 -0.174334 -0.211878 0.544461 -0.162084 -0.189262 0.540851 -0.149666 -0.165457 0.540519 -0.137345 -0.141853 0.542448 -0.125333 -0.119649 0.545833 -0.113799 -0.0996897 0.550066 -0.102873 -0.0824253 0.554711 -0.0926459 -0.0679542 0.559467 -0.08317 -0.0561154 0.564147 -0.074466 -0.0465945 0.568638 -0.0665281 -0.0390151 0.543477 0.0510388 0.0198609 0.538618 0.05776 0.0213945 0.533975 0.0653045 0.0231823 0.52974 0.0737524 0.0253541 0.526174 0.0831781 0.0280847 0.523624 0.0936416 0.0315859 0.522538 0.105178 0.0360885 0.523474 0.117781 0.041821 0.527107 0.131388 0.0489791 0.534216 0.145854 0.0576878 0.545658 0.160924 0.0679814 0.562316 0.176205 0.0797924 0.585018 0.191126 0.0929551 0.61443 0.204918 0.107202 0.650909 0.21659 0.122114 0.694338 0.224941 0.137015 0.743948 0.228618 0.150781 0.798172 0.226224 0.161636 0.854574 0.216489 0.167115 0.909896 0.198488 0.164311 0.960285 0.171875 0.150558 1.00169 0.137082 0.124431 1.03041 0.095422 0.0865633 1.04366 0.0490559 0.039975 1.04014 0.0007824 -0.0105812 1.02031 -0.0463225 -0.0599151 0.986336 -0.0893555 -0.103768 0.941799 -0.126016 -0.13965 0.890996 -0.1549 -0.166884 0.838248 -0.175577 -0.185914 0.787283 -0.188463 -0.197613 0.740856 -0.194551 -0.202752 0.700643 -0.195109 -0.201887 0.667346 -0.19143 -0.195515 0.640908 -0.184674 -0.184266 0.620775 -0.175799 -0.169042 0.606108 -0.165562 -0.151007 0.595963 -0.154547 -0.131469 0.589402 -0.143195 -0.111717 0.585574 -0.131844 -0.0928486 0.583749 -0.120744 -0.0756713 0.583334 -0.110077 -0.0606568 0.583869 -0.0999698 -0.0479736 0.585013 -0.0905011 -0.0375547 0.586523 -0.081712 -0.0291794 0.588235 -0.0736143 -0.0225513 0.590041 -0.0661981 -0.0173574 0.55608 0.0532244 0.0186257 0.552586 0.0595378 0.0197198 0.549416 0.0665379 0.0209225 0.546738 0.0742732 0.0223041 0.544772 0.0827812 0.023965 0.543797 0.0920807 0.0260311 0.544163 0.102161 0.0286428 0.546292 0.112972 0.0319419 0.550678 0.124403 0.0360508 0.557877 0.136271 0.0410414 0.568477 0.148299 0.046911 0.583062 0.160095 0.0535604 0.602143 0.171139 0.0607834 0.626083 0.180771 0.0682662 0.654997 0.188194 0.0755712 0.688646 0.192499 0.0821356 0.726339 0.192719 0.0872337 0.766861 0.187914 0.0899627 0.808453 0.177294 0.089279 0.848879 0.16036 0.084099 0.885588 0.137042 0.0735342 0.91597 0.107814 0.0571772 0.93769 0.0737348 0.0353601 0.949029 0.0363963 0.0092358 0.949164 -0.0022227 -0.0193705 0.938328 -0.0399926 -0.0483216 0.917782 -0.0749048 -0.0755689 0.889611 -0.105325 -0.0994748 0.856385 -0.130165 -0.118925 0.820772 -0.148944 -0.133267 0.785192 -0.161738 -0.142232 0.75158 -0.169046 -0.145827 0.721273 -0.17163 -0.144323 0.69502 -0.17036 -0.138249 0.673071 -0.166102 -0.128386 0.655294 -0.159642 -0.115712 0.641312 -0.15166 -0.101314 0.630613 -0.142713 -0.0862613 0.622639 -0.13325 -0.0714924 0.616849 -0.123616 -0.0577327 0.612759 -0.114073 -0.0454577 0.609958 -0.10481 -0.0348989 0.608116 -0.0959565 -0.0260878 0.606977 -0.0875946 -0.0189149 0.606351 -0.0797705 -0.0131876 0.606097 -0.0725027 -0.0086785 0.606116 -0.0657903 -0.0051625 0.564568 0.0538302 0.0178265 0.562157 0.0596045 0.0185546 0.560134 0.0659257 0.0192894 0.558644 0.0728151 0.0200603 0.557867 0.0802808 0.0209145 0.558025 0.0883101 0.021915 0.559381 0.0968623 0.0231342 0.562244 0.105858 0.0246473 0.566965 0.115166 0.0265205 0.573922 0.124596 0.0287898 0.583502 0.133879 0.0314445 0.596069 0.142664 0.0344087 0.611917 0.150509 0.0375274 0.631216 0.156879 0.0405703 0.653952 0.161165 0.0432251 0.67986 0.162704 0.045113 0.70837 0.160832 0.0458015 0.738581 0.154941 0.0448219 0.769261 0.144562 0.0417114 0.798903 0.129458 0.0360609 0.82584 0.109698 0.0275959 0.848405 0.0857155 0.0162796 0.865122 0.0583211 0.0023494 0.874906 0.0286583 -0.0136074 0.877214 -0.0018969 -0.0307364 0.872129 -0.0318807 -0.0479944 0.860346 -0.0599052 -0.0643072 0.843064 -0.084808 -0.0786531 0.821804 -0.105759 -0.0902329 0.798201 -0.122308 -0.0984489 0.773808 -0.134369 -0.102981 0.749944 -0.142159 -0.103787 0.727611 -0.146114 -0.101084 0.707468 -0.146793 -0.0953359 0.689855 -0.144804 -0.0871827 0.674857 -0.140742 -0.0773829 0.662365 -0.135155 -0.0667157 0.652149 -0.128515 -0.0558957 0.643918 -0.121219 -0.0455141 0.637361 -0.113586 -0.0359949 0.632182 -0.105862 -0.027591 0.628118 -0.0982321 -0.0204028 0.624944 -0.0908273 -0.0144122 0.622479 -0.0837371 -0.0095225 0.620578 -0.0770174 -0.0055953 0.619127 -0.0706992 -0.0024767 0.61804 -0.0647949 -2.03e-05 0.570628 0.053171 0.0170684 0.569047 0.0583438 0.0175057 0.567884 0.0639329 0.0178865 0.56726 0.0699391 0.0182152 0.56732 0.0763487 0.0185062 0.568235 0.0831287 0.0187825 0.570199 0.09022 0.0190728 0.573434 0.0975306 0.0194077 0.57818 0.104927 0.0198161 0.584687 0.112228 0.0203109 0.593197 0.119196 0.0208809 0.603922 0.125533 0.0214794 0.617016 0.130883 0.0220119 0.632536 0.134835 0.0223417 0.650405 0.136939 0.0222833 0.670375 0.136728 0.0216238 0.692004 0.133758 0.0201232 0.714638 0.127647 0.0175491 0.737426 0.118132 0.0137015 0.759364 0.10512 0.0084342 0.779368 0.0887322 0.0016955 0.796367 0.0693314 -0.0064397 0.809423 0.0475207 -0.0157614 0.817838 0.0241105 -0.025911 0.821238 5.31e-05 -0.0363885 0.819626 -0.023646 -0.0466259 0.813366 -0.0460253 -0.0560107 0.803138 -0.0662583 -0.0639691 0.789835 -0.0837206 -0.0700281 0.774453 -0.0980256 -0.0738471 0.757976 -0.109026 -0.0752637 0.741288 -0.116786 -0.0743038 0.725108 -0.121537 -0.0711724 0.709965 -0.123623 -0.0662215 0.696194 -0.123449 -0.0599092 0.683965 -0.12144 -0.0527361 0.67331 -0.118003 -0.0451941 0.664168 -0.113511 -0.0377124 0.656415 -0.108289 -0.0306311 0.649897 -0.102605 -0.0241808 0.64445 -0.0966789 -0.0184892 0.63992 -0.0906792 -0.0135965 0.636164 -0.0847334 -0.0094768 0.633059 -0.0789341 -0.006063 0.630503 -0.0733453 -0.0032679 0.628407 -0.0680092 -0.0009967 0.626701 -0.0629511 0.000839 0.5756 0.0515763 0.0161678 0.574647 0.0561369 0.0163863 0.574115 0.0610002 0.0165146 0.574102 0.0661525 0.0165445 0.574724 0.0715664 0.016473 0.57611 0.0771971 0.0163016 0.578401 0.082978 0.0160345 0.581754 0.0888155 0.0156776 0.586328 0.0945845 0.0152381 0.592282 0.100124 0.0147164 0.59976 0.105233 0.0141026 0.608878 0.109672 0.0133723 0.619701 0.113164 0.0124739 0.632223 0.115403 0.0113409 0.646345 0.116066 0.0098791 0.661855 0.114832 0.0079843 0.678412 0.11141 0.0055429 0.69555 0.105568 0.0024568 0.712685 0.097166 -0.0013499 0.729147 0.0861854 -0.0059073 0.744227 0.0727561 -0.0111887 0.757232 0.0571664 -0.0170858 0.767557 0.0398582 -0.023441 0.774745 0.0214033 -0.0299982 0.778534 0.0024619 -0.0364592 0.778885 -0.0162717 -0.0424868 0.775983 -0.0341286 -0.0477489 0.770206 -0.0505208 -0.0519206 0.762077 -0.0649841 -0.0547812 0.752199 -0.077204 -0.0561662 0.741193 -0.0870221 -0.0560339 0.729645 -0.0944247 -0.0544515 0.718059 -0.0995203 -0.051591 0.706836 -0.102508 -0.0476974 0.696266 -0.103645 -0.0430662 0.686536 -0.103219 -0.0380047 0.677742 -0.10152 -0.0328037 0.66991 -0.0988238 -0.0277049 0.663014 -0.0953816 -0.0228975 0.656996 -0.0914103 -0.0185036 0.651781 -0.0870922 -0.0145892 0.647287 -0.0825753 -0.011172 0.643431 -0.0779769 -0.0082344 0.640137 -0.0733872 -0.0057368 0.637334 -0.0688736 -0.0036308 0.63496 -0.0644854 -0.0018622 0.632961 -0.060257 -0.0003818 0.580095 0.0493471 0.0151279 0.579609 0.0533187 0.0151868 0.579528 0.0574991 0.0151416 0.579932 0.0618654 0.0149792 0.58091 0.0663829 0.0146889 0.582558 0.0710023 0.0142625 0.584979 0.0756562 0.0136933 0.588279 0.0802566 0.012975 0.592564 0.0846923 0.0121051 0.59793 0.0888265 0.0110778 0.604458 0.092496 0.0098857 0.612203 0.0955131 0.0085178 0.621181 0.0976684 0.0069497 0.631355 0.0987387 0.0051566 0.642622 0.0984972 0.0031004 0.654808 0.0967279 0.0007461 0.667655 0.0932437 -0.001948 0.680829 0.0879066 -0.0050057 0.693926 0.0806472 -0.0084394 0.706495 0.0714835 -0.0122259 0.718065 0.0605336 -0.0163181 0.728182 0.0480201 -0.0206221 0.73645 0.0342648 -0.0250107 0.742561 0.0196721 -0.0293236 0.746328 0.0047024 -0.0333752 0.747702 -0.0101621 -0.0369736 0.746768 -0.0244528 -0.039933 0.743734 -0.0377499 -0.0420979 0.738906 -0.0497098 -0.0433596 0.73265 -0.0600835 -0.0436595 0.725359 -0.0687235 -0.0430129 0.717418 -0.075581 -0.0414846 0.709176 -0.0806933 -0.0392061 0.700931 -0.084167 -0.0363339 0.692917 -0.0861578 -0.0330527 0.685306 -0.0868517 -0.0295426 0.678212 -0.0864469 -0.0259706 0.671699 -0.0851404 -0.0224719 0.665792 -0.0831179 -0.0191528 0.660489 -0.0805471 -0.0160806 0.655767 -0.0775743 -0.0132936 0.65159 -0.0743236 -0.0108038 0.647918 -0.0708979 -0.0086041 0.644707 -0.0673803 -0.0066753 0.641912 -0.0638368 -0.0049945 0.639492 -0.0603189 -0.0035329 0.637408 -0.0568658 -0.0022657 0.584438 0.0467207 0.0139913 0.584295 0.0501473 0.0139387 0.58453 0.0537079 0.0137802 0.585206 0.0573753 0.0135024 0.586391 0.061112 0.0130924 0.588157 0.0648687 0.0125393 0.590576 0.0685821 0.0118333 0.59372 0.0721736 0.0109636 0.597656 0.0755478 0.0099252 0.602441 0.078592 0.0087107 0.608117 0.0811768 0.0073154 0.614702 0.0831579 0.0057362 0.622185 0.0843801 0.003964 0.630518 0.0846828 0.0019959 0.639605 0.0839089 -0.0001774 0.649304 0.0819144 -0.0025564 0.659421 0.0785811 -0.005144 0.669714 0.0738292 -0.0079309 0.6799 0.0676299 -0.010898 0.68967 0.0600156 -0.0140098 0.698708 0.0510867 -0.0172102 0.706709 0.0410129 -0.0204191 0.713408 0.0300284 -0.0235594 0.718593 0.0184207 -0.0265101 0.722131 0.0065133 -0.0291714 0.723971 -0.0053552 -0.0314271 0.724147 -0.0168538 -0.0331922 0.722773 -0.027681 -0.0343739 0.720027 -0.0375831 -0.0349453 0.716135 -0.0463658 -0.034886 0.711344 -0.0539016 -0.0342222 0.705911 -0.0601283 -0.0330105 0.700075 -0.0650444 -0.0313376 0.694053 -0.0686993 -0.0293042 0.688027 -0.0711815 -0.0270202 0.682143 -0.0726062 -0.02459 0.676511 -0.0731041 -0.0221116 0.671205 -0.0728111 -0.0196627 0.666273 -0.0718608 -0.0173059 0.661741 -0.0703787 -0.0150826 0.657614 -0.0684786 -0.0130181 0.653885 -0.0662612 -0.0111245 0.650541 -0.0638129 -0.0094034 0.64756 -0.0612072 -0.0078478 0.644918 -0.0585049 -0.00645 0.642589 -0.0557557 -0.0051968 0.640547 -0.0529999 -0.0040773 0.588619 0.0438831 0.0128338 0.588721 0.0468183 0.0127048 0.589168 0.0498303 0.0124747 0.590008 0.0528905 0.0121315 0.591294 0.0559619 0.0116632 0.593077 0.058998 0.0110592 0.595409 0.0619422 0.0103101 0.598337 0.0647263 0.0094049 0.601902 0.067271 0.0083392 0.606135 0.0694852 0.0071063 0.611056 0.071268 0.0057033 0.616661 0.0725099 0.0041328 0.622928 0.073097 0.0023922 0.629805 0.0729151 0.0004891 0.637211 0.0718561 -0.0015712 0.64503 0.0698251 -0.0037725 0.653114 0.0667484 -0.0061045 0.661287 0.062582 -0.0085421 0.669348 0.0573187 -0.0110549 0.67708 0.0509942 -0.0136031 0.684266 0.0436908 -0.0161433 0.690696 0.0355371 -0.0186088 0.696189 0.0267041 -0.0209461 0.700597 0.0173981 -0.0230873 0.703821 0.0078488 -0.0249605 0.705816 -0.0017036 -0.0265115 0.706591 -0.0110228 -0.027684 0.706207 -0.0198905 -0.0284404 0.704769 -0.0281178 -0.0287722 0.702416 -0.0355541 -0.0286774 0.699307 -0.042092 -0.0281801 0.695612 -0.0476687 -0.0273212 0.691497 -0.052263 -0.0261569 0.687119 -0.0558908 -0.0247463 0.682617 -0.0585978 -0.0231606 0.678107 -0.0604525 -0.0214616 0.673686 -0.0615379 -0.0197081 0.669427 -0.0619453 -0.0179464 0.665383 -0.0617685 -0.0162188 0.661589 -0.061099 -0.0145521 0.658067 -0.0600231 -0.0129668 0.654827 -0.0586201 -0.0114755 0.65187 -0.0569606 -0.0100844 0.64919 -0.0551067 -0.0087938 0.646775 -0.0531121 -0.0076042 0.644613 -0.0510223 -0.0065111 0.642687 -0.0488756 -0.0055113 0.59263 0.0409649 0.0116982 0.592902 0.043466 0.0115196 0.593482 0.0460016 0.0112481 0.594409 0.0485435 0.0108737 0.595722 0.0510573 0.0103864 0.597458 0.0535011 0.0097772 0.599651 0.0558255 0.0090387 0.602334 0.0579731 0.0081613 0.605529 0.0598789 0.0071425 0.609254 0.0614706 0.0059775 0.613511 0.06267 0.0046647 0.618289 0.0633951 0.0032094 0.623559 0.0635625 0.0016134 0.629275 0.0630913 -0.0001126 0.635365 0.0619074 -0.0019585 0.641739 0.0599485 -0.0039053 0.648283 0.0571693 -0.0059361 0.654865 0.0535472 -0.0080232 0.661341 0.0490859 -0.0101375 0.667557 0.0438199 -0.0122466 0.673359 0.0378154 -0.0143067 0.678601 0.0311699 -0.016274 0.683154 0.0240094 -0.0181099 0.686913 0.0164831 -0.019764 0.689805 0.0087561 -0.0211952 0.691791 0.0010014 -0.022369 0.692867 -0.0066106 -0.0232589 0.693066 -0.01392 -0.0238435 0.692449 -0.0207855 -0.0241233 0.691103 -0.0270905 -0.0241023 0.689132 -0.032747 -0.0237966 0.686649 -0.0376962 -0.0232352 0.68377 -0.0419088 -0.0224549 0.680607 -0.0453816 -0.0214917 0.677264 -0.0481343 -0.0203897 0.673835 -0.0502046 -0.0191876 0.670397 -0.0516432 -0.0179234 0.667015 -0.05251 -0.0166277 0.663742 -0.0528691 -0.0153298 0.660614 -0.0527861 -0.014049 0.65766 -0.052325 -0.0128032 0.654897 -0.0515466 -0.0116043 0.652334 -0.0505073 -0.010461 0.649975 -0.0492581 -0.0093774 0.64782 -0.0478446 -0.0083575 0.645861 -0.0463067 -0.0074022 0.644092 -0.0446792 -0.006512 0.66829 -0.0434493 0.0146458 0.668457 -0.046136 0.0144385 0.668948 -0.0488666 0.0141165 0.669802 -0.0516125 0.0136679 0.671062 -0.0543385 0.0130796 0.672769 -0.0570018 0.0123404 0.674961 -0.0595512 0.0114407 0.677673 -0.0619276 0.0103682 0.680934 -0.0640634 0.009119 0.684762 -0.0658833 0.0076871 0.689166 -0.0673053 0.00607 0.694138 -0.0682429 0.0042736 0.699651 -0.0686078 0.0023002 0.705661 -0.0683133 0.0001631 0.712097 -0.0672789 -0.0021246 0.718869 -0.0654358 -0.0045388 0.725862 -0.0627318 -0.0070578 0.732939 -0.0591374 -0.009646 0.739951 -0.0546504 -0.0122665 0.746735 -0.0492996 -0.0148784 0.753129 -0.0431473 -0.0174274 0.758975 -0.0362884 -0.0198595 0.764134 -0.0288487 -0.022127 0.768486 -0.0209791 -0.0241702 0.771947 -0.0128491 -0.0259396 0.774465 -0.0046378 -0.0273939 0.776027 0.0034756 -0.0285027 0.776656 0.0113211 -0.0292413 0.776408 0.0187462 -0.0296108 0.775365 0.0256227 -0.0296161 0.773629 0.0318505 -0.0292771 0.771314 0.0373603 -0.028628 0.76854 0.0421125 -0.0277123 0.765423 0.0460957 -0.0265725 0.762074 0.0493228 -0.0252607 0.75859 0.0518266 -0.0238226 0.755058 0.0536548 -0.0223036 0.751549 0.0548654 -0.0207405 0.748122 0.0555224 -0.0191686 0.744821 0.0556925 -0.0176118 0.741679 0.0554414 -0.0160922 0.738718 0.0548327 -0.0146251 0.735953 0.0539255 -0.0132217 0.733391 0.0527744 -0.011888 0.731032 0.051428 -0.0106295 0.728875 0.0499299 -0.0094477 0.726914 0.048318 -0.0083441 0.663993 -0.046473 0.0160499 0.663966 -0.0496155 0.0159054 0.664297 -0.0528474 0.0156364 0.66504 -0.0561396 0.0152277 0.666249 -0.0594547 0.014664 0.667982 -0.0627455 0.0139315 0.670293 -0.0659539 0.0130178 0.673235 -0.0690099 0.0119085 0.676855 -0.0718314 0.010597 0.68119 -0.0743244 0.0090742 0.686262 -0.0763832 0.0073361 0.692076 -0.0778936 0.0053848 0.698613 -0.0787353 0.0032177 0.705824 -0.0787869 0.0008451 0.71363 -0.0779323 -0.0017247 0.721916 -0.0760678 -0.0044709 0.730534 -0.0731102 -0.0073759 0.739301 -0.0690063 -0.010407 0.74801 -0.0637397 -0.0135231 0.756434 -0.0573382 -0.0166728 0.764344 -0.0498775 -0.0198005 0.771515 -0.0414823 -0.0228255 0.777747 -0.032322 -0.0256812 0.782877 -0.022605 -0.0282877 0.786788 -0.0125662 -0.0305611 0.789419 -0.0024544 -0.0324375 0.790765 0.0074824 -0.0338562 0.790875 0.0170119 -0.0347712 0.789847 0.0259292 -0.0351808 0.787816 0.0340677 -0.0350799 0.784939 0.0413037 -0.0345005 0.781391 0.0475595 -0.0334911 0.777342 0.0528008 -0.032116 0.772957 0.0570328 -0.0304457 0.768384 0.0602932 -0.0285629 0.763749 0.0626448 -0.0265386 0.759158 0.0641677 -0.0244423 0.754694 0.0649525 -0.0223281 0.750419 0.0650939 -0.0202467 0.746377 0.0646858 -0.0182304 0.742595 0.0638183 -0.0163048 0.73909 0.0625747 -0.0144858 0.735867 0.0610303 -0.0127826 0.732925 0.059252 -0.0111968 0.730255 0.0572981 -0.0097303 0.727847 0.0552188 -0.0083787 0.725685 0.0530564 -0.0071389 0.659555 -0.0493947 0.0174742 0.659252 -0.0530515 0.0174253 0.659341 -0.0568583 0.0172454 0.659888 -0.060788 0.0169174 0.660966 -0.0648033 0.0164242 0.662652 -0.0688542 0.0157511 0.665024 -0.0728765 0.0148841 0.668161 -0.0767899 0.0138083 0.672135 -0.0804966 0.0125151 0.677013 -0.0838803 0.0109941 0.682842 -0.0868072 0.0092379 0.689649 -0.089127 0.0072423 0.69743 -0.0906771 0.0049969 0.706142 -0.0912883 0.0025007 0.715695 -0.0907928 -0.0002539 0.725947 -0.0890353 -0.003262 0.736704 -0.0858849 -0.0065205 0.747717 -0.0812486 -0.0100105 0.758698 -0.0750845 -0.0137015 0.769321 -0.0674132 -0.0175431 0.779254 -0.0583248 -0.0214631 0.788172 -0.047982 -0.0253615 0.795785 -0.0366157 -0.0291445 0.801858 -0.024515 -0.03267 0.806232 -0.0120099 -0.0358231 0.808833 0.0005493 -0.0384721 0.809678 0.0128155 -0.0405241 0.808865 0.0244671 -0.0418782 0.806565 0.0352281 -0.0425099 0.802997 0.0448813 -0.0424013 0.798414 0.0532766 -0.0415874 0.793076 0.0603316 -0.0401364 0.787234 0.0660273 -0.0381497 0.781118 0.0703995 -0.0357428 0.774923 0.073527 -0.0330417 0.76881 0.0755193 -0.030165 0.762901 0.0765048 -0.0272252 0.757285 0.0766203 -0.0243113 0.752021 0.0760025 -0.0214963 0.747143 0.0747816 -0.0188286 0.742666 0.0730776 -0.0163398 0.738589 0.0709977 -0.0140456 0.734904 0.0686353 -0.0119498 0.731594 0.0660705 -0.0100467 0.728636 0.0633705 -0.0083288 0.726007 0.060591 -0.0067823 0.723682 0.0577777 -0.0053953 0.654991 -0.0520748 0.018864 0.654309 -0.0562998 0.018953 0.654044 -0.0607536 0.0189117 0.654281 -0.0654143 0.0187228 0.655114 -0.0702478 0.0183707 0.656644 -0.0752048 0.0178425 0.658983 -0.0802174 0.0171264 0.662244 -0.0851969 0.0162107 0.666542 -0.0900297 0.0150886 0.671985 -0.0945757 0.0137492 0.678663 -0.0986673 0.0121816 0.686642 -0.10211 0.010371 0.69595 -0.104686 0.0082902 0.706557 -0.106162 0.0059139 0.718371 -0.106298 0.003204 0.731219 -0.104863 0.0001273 0.744844 -0.101652 -0.0033519 0.758906 -0.0965103 -0.0072485 0.77299 -0.0893491 -0.0115621 0.786626 -0.0801684 -0.016251 0.79932 -0.0690706 -0.0212465 0.810588 -0.0562663 -0.0264289 0.819999 -0.0420705 -0.0316418 0.82721 -0.0268877 -0.0366972 0.832 -0.0111859 -0.0413832 0.834287 0.0045369 -0.0454837 0.834131 0.0197893 -0.0488005 0.83172 0.0341231 -0.0511647 0.827353 0.0471626 -0.052473 0.821392 0.0586255 -0.0526684 0.81424 0.0683328 -0.0517816 0.806294 0.0762073 -0.0498945 0.797922 0.0822631 -0.0471593 0.789442 0.0865896 -0.0437559 0.781109 0.0893318 -0.0398921 0.773118 0.0906699 -0.0357685 0.765599 0.0908021 -0.0315724 0.758635 0.0899291 -0.0274549 0.752265 0.088243 -0.023536 0.746496 0.0859199 -0.0198927 0.741315 0.0831159 -0.0165703 0.736693 0.0799651 -0.0135849 0.732594 0.07658 -0.0109312 0.728977 0.073053 -0.0085899 0.725801 0.0694587 -0.0065372 0.723023 0.065856 -0.004742 0.720607 0.062291 -0.0031771 0.65032 -0.0543156 0.0201268 0.649128 -0.0591521 0.0204103 0.648366 -0.0643162 0.020578 0.648139 -0.0697955 0.0206165 0.648567 -0.0755643 0.0205175 0.649787 -0.0815787 0.0202772 0.651949 -0.0877728 0.019894 0.65522 -0.0940527 0.0193672 0.659773 -0.100292 0.0186985 0.665779 -0.106327 0.0178819 0.673398 -0.111953 0.0169013 0.682762 -0.116923 0.0157259 0.693953 -0.120951 0.0142971 0.706978 -0.123719 0.0125426 0.72175 -0.124888 0.0103626 0.738065 -0.124119 0.0076495 0.755584 -0.121098 0.0042891 0.773833 -0.115568 0.0001891 0.792215 -0.107363 -0.0047145 0.810033 -0.0964385 -0.01043 0.826544 -0.0828987 -0.0169005 0.841013 -0.0670116 -0.0239767 0.852785 -0.0492059 -0.0314577 0.86135 -0.0300499 -0.0390381 0.866396 -0.0102118 -0.0463752 0.867839 0.0095933 -0.0530934 0.865826 0.0286646 -0.0588361 0.860714 0.0463721 -0.0632618 0.853017 0.0622046 -0.0661546 0.843343 0.0757991 -0.06736 0.832333 0.0869516 -0.0668588 0.820597 0.0956092 -0.0647466 0.808672 0.10185 -0.0612282 0.796994 0.105851 -0.0565818 0.785884 0.107859 -0.0511354 0.77556 0.108157 -0.0452272 0.766142 0.107039 -0.0391754 0.757676 0.10479 -0.033244 0.750153 0.101673 -0.0276409 0.743525 0.0979174 -0.022501 0.737726 0.0937211 -0.0178991 0.732678 0.0892464 -0.0138572 0.728303 0.0846239 -0.0103587 0.724525 0.079956 -0.0073625 0.721274 0.0753214 -0.004817 0.718488 0.0707785 -0.0026633 0.716109 0.0663701 -0.0008476 0.645179 -0.0558683 0.0212163 0.643308 -0.0613377 0.0217639 0.641861 -0.0672532 0.0222313 0.640964 -0.0736182 0.0226178 0.640769 -0.0804214 0.0229323 0.641455 -0.0876322 0.0231923 0.64323 -0.0951934 0.0234203 0.646327 -0.103014 0.02364 0.651004 -0.110961 0.0238737 0.657529 -0.118851 0.0241258 0.666167 -0.126444 0.0243758 0.677152 -0.133435 0.0245649 0.690662 -0.139459 0.0245847 0.706775 -0.144091 0.0242827 0.725432 -0.146863 0.0234555 0.7464 -0.147287 0.0218724 0.769238 -0.144889 0.019281 0.793284 -0.139257 0.0154427 0.81767 -0.13009 0.0101659 0.841356 -0.117257 0.0033287 0.863208 -0.100841 -0.0050755 0.882094 -0.0811699 -0.0149083 0.897003 -0.0588206 -0.0258794 0.90716 -0.034592 -0.0375451 0.912115 -0.0094422 -0.0493225 0.911802 0.0155969 -0.0605748 0.906536 0.039518 -0.0706479 0.896968 0.0614329 -0.0789452 0.883987 0.0806465 -0.0850089 0.868609 0.0966998 -0.0885216 0.851857 0.109379 -0.089365 0.834667 0.118693 -0.0876149 0.817812 0.124832 -0.0835252 0.801876 0.128118 -0.0774989 0.787245 0.128943 -0.0700399 0.774126 0.127735 -0.0616894 0.762585 0.124912 -0.0529764 0.752582 0.120862 -0.0443599 0.744009 0.11593 -0.036205 0.736721 0.110407 -0.0287596 0.730558 0.104532 -0.0221627 0.725367 0.0984931 -0.0164597 0.721004 0.0924365 -0.0116248 0.717346 0.0864702 -0.0075872 0.714285 0.080672 -0.0042539 0.711732 0.0750954 -0.0015219 0.709612 0.0697752 0.0007051 0.638883 -0.0564218 0.0221453 0.636119 -0.06251 0.0230405 0.633744 -0.06918 0.0239233 0.631908 -0.0764568 0.0248184 0.6308 -0.0843522 0.0257686 0.630651 -0.0928577 0.0268317 0.631739 -0.101936 0.0280749 0.634392 -0.11151 0.029567 0.638982 -0.121451 0.0313668 0.645913 -0.131569 0.0334998 0.655604 -0.141594 0.0359413 0.668451 -0.151168 0.038595 0.68478 -0.159841 0.0412786 0.704795 -0.167066 0.0437272 0.728507 -0.172213 0.0455867 0.755668 -0.174597 0.0464331 0.785718 -0.173519 0.0457911 0.817745 -0.168332 0.0431603 0.850491 -0.158522 0.0380692 0.882404 -0.143795 0.0301342 0.91175 -0.124162 0.0191475 0.936773 -0.0999989 0.0051868 0.955892 -0.0720678 -0.0113633 0.967903 -0.0414817 -0.0297445 0.972149 -0.0096141 -0.0489401 0.968608 0.0220405 -0.0677752 0.957902 0.0520291 -0.0850996 0.941191 0.0790959 -0.0998716 0.920005 0.102302 -0.111333 0.896027 0.121086 -0.118961 0.870888 0.135264 -0.12253 0.846003 0.144975 -0.122091 0.822468 0.150605 -0.117947 0.801031 0.152687 -0.110634 0.782105 0.151825 -0.10085 0.765827 0.148628 -0.0894025 0.752122 0.143663 -0.0771149 0.740782 0.137434 -0.0647372 0.731524 0.130367 -0.052891 0.724038 0.122811 -0.0420227 0.718024 0.115041 -0.0324002 0.713212 0.107267 -0.0241306 0.70937 0.0996442 -0.0171957 0.706309 0.0922797 -0.0114932 0.703875 0.0852462 -0.0068749 0.701951 0.0785878 -0.0031749 0.700441 0.0723276 -0.0002336 0.629917 -0.0556443 0.0231698 0.625995 -0.0622839 0.0244989 0.622389 -0.0696498 0.0259256 0.619274 -0.0777956 0.0275166 0.61688 -0.0867639 0.0293697 0.615499 -0.0965791 0.031608 0.615499 -0.107236 0.0343688 0.617325 -0.118689 0.0377892 0.621503 -0.130832 0.0419847 0.628623 -0.143484 0.0470144 0.639317 -0.156368 0.0528551 0.654212 -0.16909 0.0593739 0.673868 -0.181122 0.0663169 0.69869 -0.191792 0.0733047 0.728829 -0.200286 0.0798162 0.764071 -0.205672 0.0851912 0.803735 -0.206949 0.0886052 0.846595 -0.203135 0.089066 0.890863 -0.193383 0.0854791 0.934245 -0.177121 0.0767723 0.974102 -0.154196 0.0621541 1.00771 -0.124987 0.0414157 1.03257 -0.0904625 0.0151785 1.0468 -0.0521482 -0.01506 1.04939 -0.0119958 -0.0471313 1.04041 0.0278354 -0.0786246 1.02099 0.0652461 -0.107346 0.993166 0.0984591 -0.131654 0.959544 0.126214 -0.150567 0.922891 0.147858 -0.163633 0.88578 0.163317 -0.170809 0.850318 0.172983 -0.172302 0.818009 0.177558 -0.168528 0.789742 0.177894 -0.16012 0.765866 0.174868 -0.147917 0.746315 0.169302 -0.132942 0.730741 0.161915 -0.116315 0.718642 0.153311 -0.0991357 0.70945 0.143983 -0.0823725 0.702609 0.134316 -0.0667768 0.697614 0.124609 -0.052843 0.694033 0.11508 -0.040813 0.691518 0.105885 -0.0307197 0.689798 0.0971301 -0.0224467 0.688665 0.0888785 -0.015789 0.687971 0.0811635 -0.0105019 0.687605 0.0739954 -0.0063421 0.616373 -0.0532308 0.0248115 0.610992 -0.0602838 0.0266583 0.60581 -0.0682037 0.0287597 0.601026 -0.077077 0.0312443 0.596914 -0.0869845 0.0342877 0.593835 -0.0979936 0.0381031 0.592262 -0.110146 0.0429216 0.592785 -0.123444 0.048971 0.596119 -0.137829 0.0564413 0.603092 -0.153161 0.0654434 0.614618 -0.169187 0.0759829 0.631642 -0.185511 0.0879428 0.655054 -0.201561 0.101082 0.685575 -0.216556 0.115022 0.723608 -0.229493 0.129201 0.769066 -0.239155 0.142761 0.82119 -0.244163 0.154377 0.878405 -0.243081 0.162071 0.93824 -0.234582 0.163224 0.997375 -0.217657 0.154876 1.05186 -0.191844 0.134468 1.09749 -0.157432 0.1009 1.13036 -0.11558 0.0553418 1.14743 -0.0683078 0.0015147 1.1471 -0.0183332 -0.0550916 1.12954 0.031258 -0.108681 1.09672 0.0774424 -0.154671 1.05212 0.1177 -0.190602 1.00011 0.15035 -0.21615 0.945206 0.174686 -0.232285 0.89144 0.190897 -0.240434 0.84188 0.19983 -0.241799 0.798483 0.202691 -0.237212 0.762165 0.200779 -0.227295 0.733006 0.195301 -0.212703 0.710512 0.187286 -0.194324 0.693856 0.177564 -0.173305 0.682068 0.166783 -0.150948 0.674167 0.155445 -0.128551 0.669255 0.143934 -0.107235 0.666553 0.132542 -0.0878291 0.665428 0.121485 -0.0708218 0.665384 0.110916 -0.0563882 0.666052 0.100939 -0.0444575 0.66717 0.0916125 -0.0347956 0.668554 0.0829647 -0.0270859 0.670087 0.0749975 -0.0209916 0.596089 -0.0490165 0.0279725 0.588948 -0.0562624 0.0303997 0.581844 -0.064493 0.0332799 0.574998 -0.0738295 0.0368186 0.568727 -0.0843948 0.0412836 0.563469 -0.0963065 0.0469909 0.559808 -0.109665 0.0542759 0.558502 -0.124541 0.0634612 0.560485 -0.140949 0.0748202 0.566871 -0.158828 0.0885447 0.57892 -0.177997 0.10475 0.597984 -0.198112 0.123504 0.625409 -0.21861 0.14488 0.66238 -0.238649 0.168952 0.709724 -0.257059 0.195638 0.767644 -0.272323 0.224305 0.835425 -0.282621 0.253063 0.911155 -0.285952 0.277986 0.991543 -0.280355 0.292757 1.07192 -0.264208 0.289295 1.14651 -0.236566 0.259926 1.20896 -0.19748 0.200549 1.25319 -0.148213 0.113555 1.27432 -0.0912991 0.0087124 1.26966 -0.0303735 -0.0990817 1.23938 0.0302656 -0.194545 1.1867 0.0863129 -0.267001 1.1174 0.134194 -0.313052 1.03875 0.171658 -0.335967 0.958106 0.198017 -0.342491 0.881696 0.213979 -0.33936 0.813887 0.221166 -0.331181 0.757034 0.221561 -0.319972 0.711773 0.217059 -0.305992 0.677527 0.20922 -0.288805 0.653009 0.199205 -0.268138 0.636621 0.187833 -0.244292 0.626724 0.175673 -0.218168 0.621792 0.163137 -0.191062 0.620497 0.150537 -0.164365 0.621735 0.138125 -0.139298 0.624631 0.1261 -0.116733 0.628524 0.114619 -0.097139 0.632934 0.103793 -0.0806227 0.637534 0.093694 -0.0670158 0.642111 0.0843586 -0.0559857 0.64654 0.0757933 -0.0471304 0.568136 -0.0430749 0.0337449 0.559012 -0.050215 0.0367995 0.549731 -0.0584147 0.0405297 0.540529 -0.0678271 0.0452191 0.531764 -0.0786164 0.0512259 0.523948 -0.0909527 0.0589576 0.517786 -0.105003 0.0688338 0.514205 -0.120921 0.0812492 0.514378 -0.138822 0.0965564 0.519734 -0.15876 0.115077 0.531933 -0.180679 0.137211 0.552825 -0.204354 0.163608 0.584341 -0.229301 0.195392 0.628327 -0.254681 0.234236 0.68627 -0.279204 0.282028 0.758913 -0.301062 0.339773 0.845783 -0.317961 0.40553 0.94471 -0.327262 0.471845 1.05147 -0.326266 0.524046 1.15969 -0.31262 0.541337 1.2612 -0.284767 0.502244 1.3467 -0.242373 0.393596 1.40698 -0.186658 0.21928 1.43433 -0.120555 0.0035204 1.42408 -0.0486139 -0.214809 1.37602 0.0234594 -0.395612 1.29496 0.0897019 -0.512404 1.19023 0.145072 -0.560503 1.07374 0.186519 -0.554496 0.957407 0.213473 -0.518013 0.850849 0.227535 -0.472675 0.760092 0.231574 -0.431782 0.68759 0.228708 -0.399823 0.633061 0.221574 -0.375461 0.594585 0.212023 -0.35501 0.569542 0.201164 -0.334854 0.55521 0.189578 -0.312644 0.549089 0.177555 -0.287537 0.549016 0.165272 -0.259968 0.553193 0.152884 -0.231165 0.560172 0.140564 -0.202637 0.568823 0.128493 -0.175747 0.5783 0.116845 -0.151474 0.588 0.105769 -0.130327 0.597522 0.0953739 -0.112403 0.606616 0.0857306 -0.0975008 0.615149 0.0768718 -0.0852524 0.533643 -0.0358249 0.043292 0.522468 -0.0425076 0.0470123 0.510927 -0.0502646 0.0516266 0.49927 -0.0592737 0.0574786 0.487889 -0.0697341 0.0649862 0.477365 -0.0818646 0.0746039 0.468515 -0.0958995 0.0867742 0.462433 -0.112081 0.101904 0.460531 -0.130642 0.120398 0.46456 -0.15178 0.142784 0.47662 -0.175607 0.170056 0.49914 -0.202068 0.204193 0.534792 -0.230825 0.248822 0.586315 -0.261105 0.30964 0.656153 -0.291542 0.393871 0.74591 -0.320069 0.507788 0.855598 -0.343919 0.651536 0.98286 -0.359811 0.812081 1.12237 -0.364325 0.957767 1.26567 -0.354423 1.03955 1.40158 -0.327993 1.00354 1.51714 -0.28432 0.812902 1.59906 -0.224448 0.470687 1.63563 -0.151434 0.0302231 1.61896 -0.0704391 -0.416602 1.54747 0.0115583 -0.772078 1.42761 0.0867424 -0.971371 1.27363 0.148174 -1.00604 1.10468 0.191674 -0.918392 0.93995 0.216857 -0.773294 0.794175 0.226682 -0.627242 0.675406 0.225845 -0.512112 0.585473 0.218989 -0.435741 0.522016 0.209561 -0.391557 0.48072 0.199515 -0.368055 0.456923 0.189595 -0.354464 0.446429 0.179836 -0.342931 0.445767 0.170006 -0.32882 0.452151 0.159886 -0.310267 0.463361 0.149398 -0.287466 0.477639 0.138608 -0.261835 0.49361 0.12769 -0.235232 0.510234 0.116861 -0.209379 0.526764 0.106336 -0.185521 0.542695 0.0962974 -0.164349 0.557722 0.0868772 -0.146069 0.571688 0.0781575 -0.130554 0.498821 -0.028025 0.0571662 0.485794 -0.0338972 0.0616394 0.472212 -0.0407895 0.067207 0.458333 -0.0488932 0.0742463 0.444582 -0.0584315 0.0831936 0.431602 -0.0696608 0.0944906 0.42031 -0.0828722 0.108537 0.411956 -0.0983888 0.125698 0.408179 -0.116556 0.146432 0.411053 -0.137715 0.171646 0.423147 -0.16215 0.20346 0.44755 -0.189992 0.246422 0.487836 -0.221066 0.309125 0.54788 -0.254689 0.405497 0.6314 -0.289453 0.554153 0.741143 -0.323064 0.773414 0.877756 -0.352343 1.0699 1.03859 -0.373484 1.42218 1.21685 -0.382565 1.76718 1.40146 -0.376187 2.00135 1.57778 -0.352051 2.00639 1.72879 -0.309341 1.69612 1.83674 -0.248947 1.06614 1.8851 -0.173698 0.219286 1.86138 -0.0886953 -0.653922 1.76098 -0.0014818 -1.34171 1.59111 0.0786266 -1.69774 1.37213 0.142648 -1.70071 1.13359 0.184942 -1.44819 0.905757 0.205272 -1.09066 0.710885 0.208326 -0.755543 0.559282 0.201082 -0.508592 0.450819 0.189914 -0.359385 0.379293 0.178946 -0.287511 0.336617 0.169901 -0.265392 0.31534 0.162804 -0.269563 0.309574 0.156862 -0.283345 0.31495 0.151147 -0.296094 0.328235 0.144959 -0.302011 0.34695 0.137951 -0.299056 0.369129 0.130084 -0.287881 0.393189 0.121536 -0.270642 0.417888 0.112584 -0.249981 0.442294 0.10353 -0.228259 0.46576 0.0946429 -0.207195 0.487877 0.0861302 -0.18781 0.508429 0.0781367 -0.170546 0.479119 -0.0206078 0.0737405 0.464775 -0.0253686 0.0791392 0.449732 -0.031024 0.085865 0.434258 -0.0377643 0.0943332 0.418808 -0.0458178 0.10501 0.404081 -0.0554569 0.118345 0.39109 -0.0670024 0.134742 0.381231 -0.0808255 0.15462 0.37636 -0.0973416 0.178707 0.378883 -0.116986 0.208734 0.391863 -0.140159 0.248882 0.419121 -0.167116 0.308123 0.465266 -0.197796 0.403452 0.535497 -0.231584 0.562703 0.634998 -0.267051 0.82387 0.767748 -0.301779 1.22584 0.934874 -0.332392 1.78631 1.13296 -0.354915 2.46965 1.3531 -0.365425 3.16001 1.58105 -0.360765 3.66429 1.79858 -0.339049 3.76083 1.98499 -0.299807 3.28555 2.11864 -0.243916 2.22063 2.1784 -0.173681 0.741307 2.14636 -0.0933172 -0.811721 2.01298 -0.0097062 -2.04367 1.78425 0.0675441 -2.666 1.48662 0.128092 -2.62491 1.16304 0.164917 -2.10648 0.859031 0.17776 -1.40921 0.607077 0.172869 -0.78271 0.41964 0.159262 -0.345511 0.292743 0.144625 -0.102397 0.214272 0.13329 -0.0041757 0.171009 0.126392 0.0046637 0.152205 0.123071 -0.033528 0.150321 0.121707 -0.0907198 0.160395 0.120748 -0.149087 0.179077 0.119105 -0.197834 0.203895 0.116225 -0.231655 0.232829 0.111994 -0.249628 0.264158 0.106586 -0.253823 0.296439 0.100323 -0.247817 0.328522 0.093563 -0.23539 0.359561 0.0866318 -0.21973 0.388992 0.0797931 -0.203112 0.416492 0.0732378 -0.186938 0.501747 -0.0140503 0.0864535 0.486972 -0.0174609 0.0930764 0.471396 -0.0215632 0.101485 0.455295 -0.0265215 0.112277 0.439153 -0.0325377 0.126151 0.423724 -0.039858 0.143861 0.41011 -0.0487787 0.166216 0.399848 -0.0596475 0.194224 0.395006 -0.0728591 0.229601 0.398315 -0.0888316 0.275861 0.41333 -0.107953 0.340603 0.444608 -0.130479 0.439233 0.497787 -0.156369 0.600167 0.579365 -0.185059 0.869433 0.695876 -0.215231 1.30956 0.852262 -0.244663 1.98402 1.04963 -0.270318 2.92038 1.28314 -0.288761 4.05742 1.5412 -0.296828 5.20395 1.80636 -0.292262 6.04908 2.05735 -0.274014 6.24513 2.27105 -0.242133 5.54115 2.42335 -0.197477 3.91143 2.48978 -0.14163 1.62142 2.44731 -0.0773739 -0.808321 2.28028 -0.0097314 -2.75654 1.99123 0.0532747 -3.7454 1.61123 0.101942 -3.66417 1.19764 0.129071 -2.80889 0.813852 0.134253 -1.67936 0.504108 0.124018 -0.693124 0.28244 0.107657 -0.035942 0.139341 0.09265 0.302264 0.0553776 0.0827075 0.415337 0.0115988 0.0782614 0.397315 -0.006025 0.0779095 0.31324 -0.0063485 0.0797074 0.202396 0.005468 0.0819497 0.0887764 0.0263173 0.0834828 -0.012378 0.0539904 0.0837239 -0.0923629 0.0865932 0.0825357 -0.148222 0.122366 0.0800667 -0.181518 0.159712 0.0766075 -0.196544 0.197273 0.072488 -0.198485 0.233994 0.0680138 -0.192138 0.269131 0.0634348 -0.18126 0.30222 0.058937 -0.16844 0.57313 -0.0075628 0.0873047 0.558699 -0.0093804 0.0953136 0.54336 -0.0115885 0.105905 0.527395 -0.0142871 0.120081 0.511299 -0.0176009 0.139104 0.495865 -0.0216839 0.164476 0.482257 -0.0267219 0.197982 0.472118 -0.0329335 0.241909 0.467681 -0.0405657 0.299699 0.471926 -0.0498765 0.377371 0.488795 -0.0611001 0.48644 0.523409 -0.0743794 0.64878 0.582189 -0.0896622 0.903365 0.672586 -0.106563 1.31219 0.802059 -0.124224 1.95821 0.976052 -0.141243 2.92324 1.19527 -0.155766 4.23694 1.45335 -0.165785 5.8056 1.73636 -0.169575 7.36155 2.02447 -0.166056 8.48568 2.29465 -0.154891 8.72555 2.52265 -0.136319 7.76716 2.68338 -0.110897 5.59017 2.75048 -0.0794159 2.54363 2.69728 -0.0431742 -0.697166 2.50286 -0.0047331 -3.31527 2.16578 0.0313306 -4.65945 1.71961 0.0589515 -4.55721 1.23334 0.0733089 -3.40088 0.785836 0.074022 -1.88129 0.431355 0.0654634 -0.5774 0.184608 0.0538161 0.263526 0.0306498 0.0438693 0.671146 -0.0564601 0.0377846 0.785599 -0.100417 0.0355795 0.738174 -0.117745 0.0361643 0.613661 -0.118139 0.0381899 0.459273 -0.106711 0.0405214 0.302196 -0.0862062 0.0424085 0.159985 -0.0584854 0.0434736 0.0435125 -0.0252409 0.0436231 -0.0427133 0.0118147 0.0429414 -0.0996678 0.0510161 0.0416014 -0.132001 0.090878 0.0398011 -0.145872 0.130199 0.0377252 -0.147292 0.1681 0.035526 -0.141185 0.204007 0.0333182 -0.131114 0.620371 0 0.0834569 0.606273 0 0.0921892 0.59121 0 0.104005 0.575457 0 0.120184 0.559516 0 0.142359 0.544187 0 0.172545 0.530658 0 0.213182 0.52061 0 0.267368 0.516335 0 0.339583 0.520912 0 0.437196 0.538426 0 0.573612 0.574215 0 0.773514 0.634991 0 1.08016 0.728555 0 1.56175 0.862689 0 2.30872 1.04297 0 3.4088 1.26987 0 4.89011 1.53638 0 6.64229 1.82762 0 8.36368 2.12292 0 9.59074 2.3987 0 9.83016 2.63046 0 8.74657 2.79284 0 6.32603 2.85892 0 2.95365 2.80069 0 -0.633462 2.59515 0 -3.53838 2.2391 0 -5.03829 1.76683 0 -4.93386 1.25193 0 -3.6554 0.779527 0 -1.97511 0.407918 0 -0.541403 0.151902 0 0.372786 -0.0058124 0 0.806432 -0.0938367 0 0.920016 -0.137742 0 0.86075 -0.155003 0 0.721435 -0.15561 0 0.551959 -0.144627 0 0.38018 -0.124637 0 0.224188 -0.0973451 0 0.0953929 -0.0643448 0 -0.0011699 -0.0273135 0 -0.0661739 0.0120727 0 -0.10436 0.0522916 0 -0.122202 0.0920939 0 -0.126115 0.130555 0 -0.121436 0.167065 0 -0.112072 0.57313 0.0075628 0.0873047 0.558699 0.0093804 0.0953136 0.54336 0.0115885 0.105905 0.527395 0.0142871 0.120081 0.511299 0.0176009 0.139104 0.495865 0.0216839 0.164476 0.482257 0.0267219 0.197982 0.472118 0.0329335 0.241909 0.467681 0.0405657 0.299699 0.471926 0.0498765 0.377371 0.488795 0.0611001 0.48644 0.523409 0.0743794 0.64878 0.582189 0.0896622 0.903365 0.672586 0.106563 1.31219 0.802059 0.124224 1.95821 0.976052 0.141243 2.92324 1.19527 0.155766 4.23694 1.45335 0.165785 5.8056 1.73636 0.169575 7.36155 2.02447 0.166056 8.48568 2.29465 0.154891 8.72555 2.52265 0.136319 7.76716 2.68338 0.110897 5.59017 2.75048 0.0794159 2.54363 2.69728 0.0431742 -0.697166 2.50286 0.0047331 -3.31527 2.16578 -0.0313306 -4.65945 1.71961 -0.0589515 -4.55721 1.23334 -0.0733089 -3.40088 0.785836 -0.074022 -1.88129 0.431355 -0.0654634 -0.5774 0.184608 -0.0538161 0.263526 0.0306498 -0.0438693 0.671146 -0.0564601 -0.0377846 0.785599 -0.100417 -0.0355795 0.738174 -0.117745 -0.0361643 0.613661 -0.118139 -0.0381899 0.459273 -0.106711 -0.0405214 0.302196 -0.0862062 -0.0424085 0.159985 -0.0584854 -0.0434736 0.0435125 -0.0252409 -0.0436231 -0.0427133 0.0118147 -0.0429414 -0.0996678 0.0510161 -0.0416014 -0.132001 0.090878 -0.0398011 -0.145872 0.130199 -0.0377252 -0.147292 0.1681 -0.035526 -0.141185 0.204007 -0.0333182 -0.131114 0.501747 0.0140503 0.0864535 0.486972 0.0174609 0.0930764 0.471396 0.0215632 0.101485 0.455295 0.0265215 0.112277 0.439153 0.0325377 0.126151 0.423724 0.039858 0.143861 0.41011 0.0487787 0.166216 0.399848 0.0596475 0.194224 0.395006 0.0728591 0.229601 0.398315 0.0888316 0.275861 0.41333 0.107953 0.340603 0.444608 0.130479 0.439233 0.497787 0.156369 0.600167 0.579365 0.185059 0.869433 0.695876 0.215231 1.30956 0.852262 0.244663 1.98402 1.04963 0.270318 2.92038 1.28314 0.288761 4.05742 1.5412 0.296828 5.20395 1.80636 0.292262 6.04908 2.05735 0.274014 6.24513 2.27105 0.242133 5.54115 2.42335 0.197477 3.91143 2.48978 0.14163 1.62142 2.44731 0.0773739 -0.808321 2.28028 0.0097314 -2.75654 1.99123 -0.0532747 -3.7454 1.61123 -0.101942 -3.66417 1.19764 -0.129071 -2.80889 0.813852 -0.134253 -1.67936 0.504108 -0.124018 -0.693124 0.28244 -0.107657 -0.035942 0.139341 -0.09265 0.302264 0.0553776 -0.0827075 0.415337 0.0115988 -0.0782614 0.397315 -0.006025 -0.0779095 0.31324 -0.0063485 -0.0797074 0.202396 0.005468 -0.0819497 0.0887764 0.0263173 -0.0834828 -0.012378 0.0539904 -0.0837239 -0.0923629 0.0865932 -0.0825357 -0.148222 0.122366 -0.0800667 -0.181518 0.159712 -0.0766075 -0.196544 0.197273 -0.072488 -0.198485 0.233994 -0.0680138 -0.192138 0.269131 -0.0634348 -0.18126 0.30222 -0.058937 -0.16844 0.479119 0.0206078 0.0737405 0.464775 0.0253686 0.0791392 0.449732 0.031024 0.085865 0.434258 0.0377643 0.0943332 0.418808 0.0458178 0.10501 0.404081 0.0554569 0.118345 0.39109 0.0670024 0.134742 0.381231 0.0808255 0.15462 0.37636 0.0973416 0.178707 0.378883 0.116986 0.208734 0.391863 0.140159 0.248882 0.419121 0.167116 0.308123 0.465266 0.197796 0.403452 0.535497 0.231584 0.562703 0.634998 0.267051 0.82387 0.767748 0.301779 1.22584 0.934874 0.332392 1.78631 1.13296 0.354915 2.46965 1.3531 0.365425 3.16001 1.58105 0.360765 3.66429 1.79858 0.339049 3.76083 1.98499 0.299807 3.28555 2.11864 0.243916 2.22063 2.1784 0.173681 0.741307 2.14636 0.0933172 -0.811721 2.01298 0.0097062 -2.04367 1.78425 -0.0675441 -2.666 1.48662 -0.128092 -2.62491 1.16304 -0.164917 -2.10648 0.859031 -0.17776 -1.40921 0.607077 -0.172869 -0.78271 0.41964 -0.159262 -0.345511 0.292743 -0.144625 -0.102397 0.214272 -0.13329 -0.0041757 0.171009 -0.126392 0.0046637 0.152205 -0.123071 -0.033528 0.150321 -0.121707 -0.0907198 0.160395 -0.120748 -0.149087 0.179077 -0.119105 -0.197834 0.203895 -0.116225 -0.231655 0.232829 -0.111994 -0.249628 0.264158 -0.106586 -0.253823 0.296439 -0.100323 -0.247817 0.328522 -0.093563 -0.23539 0.359561 -0.0866318 -0.21973 0.388992 -0.0797931 -0.203112 0.416492 -0.0732378 -0.186938 0.498821 0.028025 0.0571662 0.485794 0.0338972 0.0616394 0.472212 0.0407895 0.067207 0.458333 0.0488932 0.0742463 0.444582 0.0584315 0.0831936 0.431602 0.0696608 0.0944906 0.42031 0.0828722 0.108537 0.411956 0.0983888 0.125698 0.408179 0.116556 0.146432 0.411053 0.137715 0.171646 0.423147 0.16215 0.20346 0.44755 0.189992 0.246422 0.487836 0.221066 0.309125 0.54788 0.254689 0.405497 0.6314 0.289453 0.554153 0.741143 0.323064 0.773414 0.877756 0.352343 1.0699 1.03859 0.373484 1.42218 1.21685 0.382565 1.76718 1.40146 0.376187 2.00135 1.57778 0.352051 2.00639 1.72879 0.309341 1.69612 1.83674 0.248947 1.06614 1.8851 0.173698 0.219286 1.86138 0.0886953 -0.653922 1.76098 0.0014818 -1.34171 1.59111 -0.0786266 -1.69774 1.37213 -0.142648 -1.70071 1.13359 -0.184942 -1.44819 0.905757 -0.205272 -1.09066 0.710885 -0.208326 -0.755543 0.559282 -0.201082 -0.508592 0.450819 -0.189914 -0.359385 0.379293 -0.178946 -0.287511 0.336617 -0.169901 -0.265392 0.31534 -0.162804 -0.269563 0.309574 -0.156862 -0.283345 0.31495 -0.151147 -0.296094 0.328235 -0.144959 -0.302011 0.34695 -0.137951 -0.299056 0.369129 -0.130084 -0.287881 0.393189 -0.121536 -0.270642 0.417888 -0.112584 -0.249981 0.442294 -0.10353 -0.228259 0.46576 -0.0946429 -0.207195 0.487877 -0.0861302 -0.18781 0.508429 -0.0781367 -0.170546 0.533643 0.0358249 0.043292 0.522468 0.0425076 0.0470123 0.510927 0.0502646 0.0516266 0.49927 0.0592737 0.0574786 0.487889 0.0697341 0.0649862 0.477365 0.0818646 0.0746039 0.468515 0.0958995 0.0867742 0.462433 0.112081 0.101904 0.460531 0.130642 0.120398 0.46456 0.15178 0.142784 0.47662 0.175607 0.170056 0.49914 0.202068 0.204193 0.534792 0.230825 0.248822 0.586315 0.261105 0.30964 0.656153 0.291542 0.393871 0.74591 0.320069 0.507788 0.855598 0.343919 0.651536 0.98286 0.359811 0.812081 1.12237 0.364325 0.957767 1.26567 0.354423 1.03955 1.40158 0.327993 1.00354 1.51714 0.28432 0.812902 1.59906 0.224448 0.470687 1.63563 0.151434 0.0302231 1.61896 0.0704391 -0.416602 1.54747 -0.0115583 -0.772078 1.42761 -0.0867424 -0.971371 1.27363 -0.148174 -1.00604 1.10468 -0.191674 -0.918392 0.93995 -0.216857 -0.773294 0.794175 -0.226682 -0.627242 0.675406 -0.225845 -0.512112 0.585473 -0.218989 -0.435741 0.522016 -0.209561 -0.391557 0.48072 -0.199515 -0.368055 0.456923 -0.189595 -0.354464 0.446429 -0.179836 -0.342931 0.445767 -0.170006 -0.32882 0.452151 -0.159886 -0.310267 0.463361 -0.149398 -0.287466 0.477639 -0.138608 -0.261835 0.49361 -0.12769 -0.235232 0.510234 -0.116861 -0.209379 0.526764 -0.106336 -0.185521 0.542695 -0.0962974 -0.164349 0.557722 -0.0868772 -0.146069 0.571688 -0.0781575 -0.130554 0.568136 0.0430749 0.0337449 0.559012 0.050215 0.0367995 0.549731 0.0584147 0.0405297 0.540529 0.0678271 0.0452191 0.531764 0.0786164 0.0512259 0.523948 0.0909527 0.0589576 0.517786 0.105003 0.0688338 0.514205 0.120921 0.0812492 0.514378 0.138822 0.0965564 0.519734 0.15876 0.115077 0.531933 0.180679 0.137211 0.552825 0.204354 0.163608 0.584341 0.229301 0.195392 0.628327 0.254681 0.234236 0.68627 0.279204 0.282028 0.758913 0.301062 0.339773 0.845783 0.317961 0.40553 0.94471 0.327262 0.471845 1.05147 0.326266 0.524046 1.15969 0.31262 0.541337 1.2612 0.284767 0.502244 1.3467 0.242373 0.393596 1.40698 0.186658 0.21928 1.43433 0.120555 0.0035204 1.42408 0.0486139 -0.214809 1.37602 -0.0234594 -0.395612 1.29496 -0.0897019 -0.512404 1.19023 -0.145072 -0.560503 1.07374 -0.186519 -0.554496 0.957407 -0.213473 -0.518013 0.850849 -0.227535 -0.472675 0.760092 -0.231574 -0.431782 0.68759 -0.228708 -0.399823 0.633061 -0.221574 -0.375461 0.594585 -0.212023 -0.35501 0.569542 -0.201164 -0.334854 0.55521 -0.189578 -0.312644 0.549089 -0.177555 -0.287537 0.549016 -0.165272 -0.259968 0.553193 -0.152884 -0.231165 0.560172 -0.140564 -0.202637 0.568823 -0.128493 -0.175747 0.5783 -0.116845 -0.151474 0.588 -0.105769 -0.130327 0.597522 -0.0953739 -0.112403 0.606616 -0.0857306 -0.0975008 0.615149 -0.0768718 -0.0852524 0.596089 0.0490165 0.0279725 0.588948 0.0562624 0.0303997 0.581844 0.064493 0.0332799 0.574998 0.0738295 0.0368186 0.568727 0.0843948 0.0412836 0.563469 0.0963065 0.0469909 0.559808 0.109665 0.0542759 0.558502 0.124541 0.0634612 0.560485 0.140949 0.0748202 0.566871 0.158828 0.0885447 0.57892 0.177997 0.10475 0.597984 0.198112 0.123504 0.625409 0.21861 0.14488 0.66238 0.238649 0.168952 0.709724 0.257059 0.195638 0.767644 0.272323 0.224305 0.835425 0.282621 0.253063 0.911155 0.285952 0.277986 0.991543 0.280355 0.292757 1.07192 0.264208 0.289295 1.14651 0.236566 0.259926 1.20896 0.19748 0.200549 1.25319 0.148213 0.113555 1.27432 0.0912991 0.0087124 1.26966 0.0303735 -0.0990817 1.23938 -0.0302656 -0.194545 1.1867 -0.0863129 -0.267001 1.1174 -0.134194 -0.313052 1.03875 -0.171658 -0.335967 0.958106 -0.198017 -0.342491 0.881696 -0.213979 -0.33936 0.813887 -0.221166 -0.331181 0.757034 -0.221561 -0.319972 0.711773 -0.217059 -0.305992 0.677527 -0.20922 -0.288805 0.653009 -0.199205 -0.268138 0.636621 -0.187833 -0.244292 0.626724 -0.175673 -0.218168 0.621792 -0.163137 -0.191062 0.620497 -0.150537 -0.164365 0.621735 -0.138125 -0.139298 0.624631 -0.1261 -0.116733 0.628524 -0.114619 -0.097139 0.632934 -0.103793 -0.0806227 0.637534 -0.093694 -0.0670158 0.642111 -0.0843586 -0.0559857 0.64654 -0.0757933 -0.0471304 0.616373 0.0532308 0.0248115 0.610992 0.0602838 0.0266583 0.60581 0.0682037 0.0287597 0.601026 0.077077 0.0312443 0.596914 0.0869845 0.0342877 0.593835 0.0979936 0.0381031 0.592262 0.110146 0.0429216 0.592785 0.123444 0.048971 0.596119 0.137829 0.0564413 0.603092 0.153161 0.0654434 0.614618 0.169187 0.0759829 0.631642 0.185511 0.0879428 0.655054 0.201561 0.101082 0.685575 0.216556 0.115022 0.723608 0.229493 0.129201 0.769066 0.239155 0.142761 0.82119 0.244163 0.154377 0.878405 0.243081 0.162071 0.93824 0.234582 0.163224 0.997375 0.217657 0.154876 1.05186 0.191844 0.134468 1.09749 0.157432 0.1009 1.13036 0.11558 0.0553418 1.14743 0.0683078 0.0015147 1.1471 0.0183332 -0.0550916 1.12954 -0.031258 -0.108681 1.09672 -0.0774424 -0.154671 1.05212 -0.1177 -0.190602 1.00011 -0.15035 -0.21615 0.945206 -0.174686 -0.232285 0.89144 -0.190897 -0.240434 0.84188 -0.19983 -0.241799 0.798483 -0.202691 -0.237212 0.762165 -0.200779 -0.227295 0.733006 -0.195301 -0.212703 0.710512 -0.187286 -0.194324 0.693856 -0.177564 -0.173305 0.682068 -0.166783 -0.150948 0.674167 -0.155445 -0.128551 0.669255 -0.143934 -0.107235 0.666553 -0.132542 -0.0878291 0.665428 -0.121485 -0.0708218 0.665384 -0.110916 -0.0563882 0.666052 -0.100939 -0.0444575 0.66717 -0.0916125 -0.0347956 0.668554 -0.0829647 -0.0270859 0.670087 -0.0749975 -0.0209916 0.629917 0.0556443 0.0231698 0.625995 0.0622839 0.0244989 0.622389 0.0696498 0.0259256 0.619274 0.0777956 0.0275166 0.61688 0.0867639 0.0293697 0.615499 0.0965791 0.031608 0.615499 0.107236 0.0343688 0.617325 0.118689 0.0377892 0.621503 0.130832 0.0419847 0.628623 0.143484 0.0470144 0.639317 0.156368 0.0528551 0.654212 0.16909 0.0593739 0.673868 0.181122 0.0663169 0.69869 0.191792 0.0733047 0.728829 0.200286 0.0798162 0.764071 0.205672 0.0851912 0.803735 0.206949 0.0886052 0.846595 0.203135 0.089066 0.890863 0.193383 0.0854791 0.934245 0.177121 0.0767723 0.974102 0.154196 0.0621541 1.00771 0.124987 0.0414157 1.03257 0.0904625 0.0151785 1.0468 0.0521482 -0.01506 1.04939 0.0119958 -0.0471313 1.04041 -0.0278354 -0.0786246 1.02099 -0.0652461 -0.107346 0.993166 -0.0984591 -0.131654 0.959544 -0.126214 -0.150567 0.922891 -0.147858 -0.163633 0.88578 -0.163317 -0.170809 0.850318 -0.172983 -0.172302 0.818009 -0.177558 -0.168528 0.789742 -0.177894 -0.16012 0.765866 -0.174868 -0.147917 0.746315 -0.169302 -0.132942 0.730741 -0.161915 -0.116315 0.718642 -0.153311 -0.0991357 0.70945 -0.143983 -0.0823725 0.702609 -0.134316 -0.0667768 0.697614 -0.124609 -0.052843 0.694033 -0.11508 -0.040813 0.691518 -0.105885 -0.0307197 0.689798 -0.0971301 -0.0224467 0.688665 -0.0888785 -0.015789 0.687971 -0.0811635 -0.0105019 0.687605 -0.0739954 -0.0063421 0.638883 0.0564218 0.0221453 0.636119 0.06251 0.0230405 0.633744 0.06918 0.0239233 0.631908 0.0764568 0.0248184 0.6308 0.0843522 0.0257686 0.630651 0.0928577 0.0268317 0.631739 0.101936 0.0280749 0.634392 0.11151 0.029567 0.638982 0.121451 0.0313668 0.645913 0.131569 0.0334998 0.655604 0.141594 0.0359413 0.668451 0.151168 0.038595 0.68478 0.159841 0.0412786 0.704795 0.167066 0.0437272 0.728507 0.172213 0.0455867 0.755668 0.174597 0.0464331 0.785718 0.173519 0.0457911 0.817745 0.168332 0.0431603 0.850491 0.158522 0.0380692 0.882404 0.143795 0.0301342 0.91175 0.124162 0.0191475 0.936773 0.0999989 0.0051868 0.955892 0.0720678 -0.0113633 0.967903 0.0414817 -0.0297445 0.972149 0.0096141 -0.0489401 0.968608 -0.0220405 -0.0677752 0.957902 -0.0520291 -0.0850996 0.941191 -0.0790959 -0.0998716 0.920005 -0.102302 -0.111333 0.896027 -0.121086 -0.118961 0.870888 -0.135264 -0.12253 0.846003 -0.144975 -0.122091 0.822468 -0.150605 -0.117947 0.801031 -0.152687 -0.110634 0.782105 -0.151825 -0.10085 0.765827 -0.148628 -0.0894025 0.752122 -0.143663 -0.0771149 0.740782 -0.137434 -0.0647372 0.731524 -0.130367 -0.052891 0.724038 -0.122811 -0.0420227 0.718024 -0.115041 -0.0324002 0.713212 -0.107267 -0.0241306 0.70937 -0.0996442 -0.0171957 0.706309 -0.0922797 -0.0114932 0.703875 -0.0852462 -0.0068749 0.701951 -0.0785878 -0.0031749 0.700441 -0.0723276 -0.0002336 0.645179 0.0558683 0.0212163 0.643308 0.0613377 0.0217639 0.641861 0.0672532 0.0222313 0.640964 0.0736182 0.0226178 0.640769 0.0804214 0.0229323 0.641455 0.0876322 0.0231923 0.64323 0.0951934 0.0234203 0.646327 0.103014 0.02364 0.651004 0.110961 0.0238737 0.657529 0.118851 0.0241258 0.666167 0.126444 0.0243758 0.677152 0.133435 0.0245649 0.690662 0.139459 0.0245847 0.706775 0.144091 0.0242827 0.725432 0.146863 0.0234555 0.7464 0.147287 0.0218724 0.769238 0.144889 0.019281 0.793284 0.139257 0.0154427 0.81767 0.13009 0.0101659 0.841356 0.117257 0.0033287 0.863208 0.100841 -0.0050755 0.882094 0.0811699 -0.0149083 0.897003 0.0588206 -0.0258794 0.90716 0.034592 -0.0375451 0.912115 0.0094422 -0.0493225 0.911802 -0.0155969 -0.0605748 0.906536 -0.039518 -0.0706479 0.896968 -0.0614329 -0.0789452 0.883987 -0.0806465 -0.0850089 0.868609 -0.0966998 -0.0885216 0.851857 -0.109379 -0.089365 0.834667 -0.118693 -0.0876149 0.817812 -0.124832 -0.0835252 0.801876 -0.128118 -0.0774989 0.787245 -0.128943 -0.0700399 0.774126 -0.127735 -0.0616894 0.762585 -0.124912 -0.0529764 0.752582 -0.120862 -0.0443599 0.744009 -0.11593 -0.036205 0.736721 -0.110407 -0.0287596 0.730558 -0.104532 -0.0221627 0.725367 -0.0984931 -0.0164597 0.721004 -0.0924365 -0.0116248 0.717346 -0.0864702 -0.0075872 0.714285 -0.080672 -0.0042539 0.711732 -0.0750954 -0.0015219 0.709612 -0.0697752 0.0007051 0.65032 0.0543156 0.0201268 0.649128 0.0591521 0.0204103 0.648366 0.0643162 0.020578 0.648139 0.0697955 0.0206165 0.648567 0.0755643 0.0205175 0.649787 0.0815787 0.0202772 0.651949 0.0877728 0.019894 0.65522 0.0940527 0.0193672 0.659773 0.100292 0.0186985 0.665779 0.106327 0.0178819 0.673398 0.111953 0.0169013 0.682762 0.116923 0.0157259 0.693953 0.120951 0.0142971 0.706978 0.123719 0.0125426 0.72175 0.124888 0.0103626 0.738065 0.124119 0.0076495 0.755584 0.121098 0.0042891 0.773833 0.115568 0.0001891 0.792215 0.107363 -0.0047145 0.810033 0.0964385 -0.01043 0.826544 0.0828987 -0.0169005 0.841013 0.0670116 -0.0239767 0.852785 0.0492059 -0.0314577 0.86135 0.0300499 -0.0390381 0.866396 0.0102118 -0.0463752 0.867839 -0.0095933 -0.0530934 0.865826 -0.0286646 -0.0588361 0.860714 -0.0463721 -0.0632618 0.853017 -0.0622046 -0.0661546 0.843343 -0.0757991 -0.06736 0.832333 -0.0869516 -0.0668588 0.820597 -0.0956092 -0.0647466 0.808672 -0.10185 -0.0612282 0.796994 -0.105851 -0.0565818 0.785884 -0.107859 -0.0511354 0.77556 -0.108157 -0.0452272 0.766142 -0.107039 -0.0391754 0.757676 -0.10479 -0.033244 0.750153 -0.101673 -0.0276409 0.743525 -0.0979174 -0.022501 0.737726 -0.0937211 -0.0178991 0.732678 -0.0892464 -0.0138572 0.728303 -0.0846239 -0.0103587 0.724525 -0.079956 -0.0073625 0.721274 -0.0753214 -0.004817 0.718488 -0.0707785 -0.0026633 0.716109 -0.0663701 -0.0008476 0.654991 0.0520748 0.018864 0.654309 0.0562998 0.018953 0.654044 0.0607536 0.0189117 0.654281 0.0654143 0.0187228 0.655114 0.0702478 0.0183707 0.656644 0.0752048 0.0178425 0.658983 0.0802174 0.0171264 0.662244 0.0851969 0.0162107 0.666542 0.0900297 0.0150886 0.671985 0.0945757 0.0137492 0.678663 0.0986673 0.0121816 0.686642 0.10211 0.010371 0.69595 0.104686 0.0082902 0.706557 0.106162 0.0059139 0.718371 0.106298 0.003204 0.731219 0.104863 0.0001273 0.744844 0.101652 -0.0033519 0.758906 0.0965103 -0.0072485 0.77299 0.0893491 -0.0115621 0.786626 0.0801684 -0.016251 0.79932 0.0690706 -0.0212465 0.810588 0.0562663 -0.0264289 0.819999 0.0420705 -0.0316418 0.82721 0.0268877 -0.0366972 0.832 0.0111859 -0.0413832 0.834287 -0.0045369 -0.0454837 0.834131 -0.0197893 -0.0488005 0.83172 -0.0341231 -0.0511647 0.827353 -0.0471626 -0.052473 0.821392 -0.0586255 -0.0526684 0.81424 -0.0683328 -0.0517816 0.806294 -0.0762073 -0.0498945 0.797922 -0.0822631 -0.0471593 0.789442 -0.0865896 -0.0437559 0.781109 -0.0893318 -0.0398921 0.773118 -0.0906699 -0.0357685 0.765599 -0.0908021 -0.0315724 0.758635 -0.0899291 -0.0274549 0.752265 -0.088243 -0.023536 0.746496 -0.0859199 -0.0198927 0.741315 -0.0831159 -0.0165703 0.736693 -0.0799651 -0.0135849 0.732594 -0.07658 -0.0109312 0.728977 -0.073053 -0.0085899 0.725801 -0.0694587 -0.0065372 0.723023 -0.065856 -0.004742 0.720607 -0.062291 -0.0031771 0.659555 0.0493947 0.0174742 0.659252 0.0530515 0.0174253 0.659341 0.0568583 0.0172454 0.659888 0.060788 0.0169174 0.660966 0.0648033 0.0164242 0.662652 0.0688542 0.0157511 0.665024 0.0728765 0.0148841 0.668161 0.0767899 0.0138083 0.672135 0.0804966 0.0125151 0.677013 0.0838803 0.0109941 0.682842 0.0868072 0.0092379 0.689649 0.089127 0.0072423 0.69743 0.0906771 0.0049969 0.706142 0.0912883 0.0025007 0.715695 0.0907928 -0.0002539 0.725947 0.0890353 -0.003262 0.736704 0.0858849 -0.0065205 0.747717 0.0812486 -0.0100105 0.758698 0.0750845 -0.0137015 0.769321 0.0674132 -0.0175431 0.779254 0.0583248 -0.0214631 0.788172 0.047982 -0.0253615 0.795785 0.0366157 -0.0291445 0.801858 0.024515 -0.03267 0.806232 0.0120099 -0.0358231 0.808833 -0.0005493 -0.0384721 0.809678 -0.0128155 -0.0405241 0.808865 -0.0244671 -0.0418782 0.806565 -0.0352281 -0.0425099 0.802997 -0.0448813 -0.0424013 0.798414 -0.0532766 -0.0415874 0.793076 -0.0603316 -0.0401364 0.787234 -0.0660273 -0.0381497 0.781118 -0.0703995 -0.0357428 0.774923 -0.073527 -0.0330417 0.76881 -0.0755193 -0.030165 0.762901 -0.0765048 -0.0272252 0.757285 -0.0766203 -0.0243113 0.752021 -0.0760025 -0.0214963 0.747143 -0.0747816 -0.0188286 0.742666 -0.0730776 -0.0163398 0.738589 -0.0709977 -0.0140456 0.734904 -0.0686353 -0.0119498 0.731594 -0.0660705 -0.0100467 0.728636 -0.0633705 -0.0083288 0.726007 -0.060591 -0.0067823 0.723682 -0.0577777 -0.0053953 0.663993 0.046473 0.0160499 0.663966 0.0496155 0.0159054 0.664297 0.0528474 0.0156364 0.66504 0.0561396 0.0152277 0.666249 0.0594547 0.014664 0.667982 0.0627455 0.0139315 0.670293 0.0659539 0.0130178 0.673235 0.0690099 0.0119085 0.676855 0.0718314 0.010597 0.68119 0.0743244 0.0090742 0.686262 0.0763832 0.0073361 0.692076 0.0778936 0.0053848 0.698613 0.0787353 0.0032177 0.705824 0.0787869 0.0008451 0.71363 0.0779323 -0.0017247 0.721916 0.0760678 -0.0044709 0.730534 0.0731102 -0.0073759 0.739301 0.0690063 -0.010407 0.74801 0.0637397 -0.0135231 0.756434 0.0573382 -0.0166728 0.764344 0.0498775 -0.0198005 0.771515 0.0414823 -0.0228255 0.777747 0.032322 -0.0256812 0.782877 0.022605 -0.0282877 0.786788 0.0125662 -0.0305611 0.789419 0.0024544 -0.0324375 0.790765 -0.0074824 -0.0338562 0.790875 -0.0170119 -0.0347712 0.789847 -0.0259292 -0.0351808 0.787816 -0.0340677 -0.0350799 0.784939 -0.0413037 -0.0345005 0.781391 -0.0475595 -0.0334911 0.777342 -0.0528008 -0.032116 0.772957 -0.0570328 -0.0304457 0.768384 -0.0602932 -0.0285629 0.763749 -0.0626448 -0.0265386 0.759158 -0.0641677 -0.0244423 0.754694 -0.0649525 -0.0223281 0.750419 -0.0650939 -0.0202467 0.746377 -0.0646858 -0.0182304 0.742595 -0.0638183 -0.0163048 0.73909 -0.0625747 -0.0144858 0.735867 -0.0610303 -0.0127826 0.732925 -0.059252 -0.0111968 0.730255 -0.0572981 -0.0097303 0.727847 -0.0552188 -0.0083787 0.725685 -0.0530564 -0.0071389 0.66829 0.0434493 0.0146458 0.668457 0.046136 0.0144385 0.668948 0.0488666 0.0141165 0.669802 0.0516125 0.0136679 0.671062 0.0543385 0.0130796 0.672769 0.0570018 0.0123404 0.674961 0.0595512 0.0114407 0.677673 0.0619276 0.0103682 0.680934 0.0640634 0.009119 0.684762 0.0658833 0.0076871 0.689166 0.0673053 0.00607 0.694138 0.0682429 0.0042736 0.699651 0.0686078 0.0023002 0.705661 0.0683133 0.0001631 0.712097 0.0672789 -0.0021246 0.718869 0.0654358 -0.0045388 0.725862 0.0627318 -0.0070578 0.732939 0.0591374 -0.009646 0.739951 0.0546504 -0.0122665 0.746735 0.0492996 -0.0148784 0.753129 0.0431473 -0.0174274 0.758975 0.0362884 -0.0198595 0.764134 0.0288487 -0.022127 0.768486 0.0209791 -0.0241702 0.771947 0.0128491 -0.0259396 0.774465 0.0046378 -0.0273939 0.776027 -0.0034756 -0.0285027 0.776656 -0.0113211 -0.0292413 0.776408 -0.0187462 -0.0296108 0.775365 -0.0256227 -0.0296161 0.773629 -0.0318505 -0.0292771 0.771314 -0.0373603 -0.028628 0.76854 -0.0421125 -0.0277123 0.765423 -0.0460957 -0.0265725 0.762074 -0.0493228 -0.0252607 0.75859 -0.0518266 -0.0238226 0.755058 -0.0536548 -0.0223036 0.751549 -0.0548654 -0.0207405 0.748122 -0.0555224 -0.0191686 0.744821 -0.0556925 -0.0176118 0.741679 -0.0554414 -0.0160922 0.738718 -0.0548327 -0.0146251 0.735953 -0.0539255 -0.0132217 0.733391 -0.0527744 -0.011888 0.731032 -0.051428 -0.0106295 0.728875 -0.0499299 -0.0094477 0.726914 -0.048318 -0.0083441 0.744479 -0.0454488 0.0178875 0.744522 -0.0482944 0.0176536 0.744898 -0.0511936 0.0172821 0.745651 -0.0541177 0.0167582 0.746825 -0.0570312 0.016066 0.748463 -0.0598908 0.0151918 0.750609 -0.0626448 0.0141233 0.7533 -0.0652329 0.0128455 0.75657 -0.0675858 0.011353 0.76044 -0.0696263 0.009638 0.764922 -0.0712697 0.0076974 0.770014 -0.0724264 0.0055372 0.775693 -0.0730038 0.0031603 0.781915 -0.0729108 0.0005828 0.788615 -0.0720616 -0.0021792 0.795702 -0.0703812 -0.0050964 0.803061 -0.0678111 -0.0081413 0.810556 -0.0643152 -0.0112701 0.818031 -0.0598844 -0.0144382 0.82532 -0.0545415 -0.0175945 0.832254 -0.0483429 -0.0206743 0.838665 -0.0413794 -0.0236122 0.844403 -0.0337739 -0.026351 0.849339 -0.0256766 -0.0288202 0.853375 -0.017258 -0.0309627 0.856448 -0.0087009 -0.0327289 0.858532 -0.0001902 -0.0340845 0.859642 0.0080965 -0.0350007 0.859825 0.0159975 -0.0354797 0.859157 0.0233744 -0.0355273 0.857735 0.0301165 -0.0351665 0.855674 0.0361438 -0.0344375 0.853091 0.0414067 -0.0333905 0.850106 0.0458847 -0.0320746 0.846834 0.0495831 -0.0305501 0.843376 0.0525283 -0.0288701 0.839826 0.0547633 -0.0270878 0.836261 0.0563431 -0.0252465 0.832744 0.0573301 -0.0233877 0.829328 0.0577902 -0.0215404 0.826049 0.0577899 -0.0197314 0.822936 0.057394 -0.0179794 0.820007 0.0566637 -0.0162987 0.817273 0.0556558 -0.0146972 0.81474 0.0544218 -0.0131823 0.812407 0.0530078 -0.0117565 0.810271 0.0514547 -0.0104221 0.739941 -0.0485373 0.0195819 0.739764 -0.0518548 0.0194259 0.739956 -0.0552737 0.0191202 0.740571 -0.0587654 0.0186466 0.741669 -0.0622924 0.0179858 0.743308 -0.0658073 0.0171208 0.74555 -0.0692516 0.0160357 0.74845 -0.0725544 0.0147123 0.752061 -0.0756323 0.0131417 0.756424 -0.078389 0.0113121 0.761569 -0.0807164 0.0092177 0.767504 -0.0824964 0.0068606 0.774216 -0.0836043 0.0042379 0.781662 -0.0839131 0.0013617 0.789765 -0.0832999 -0.0017554 0.798415 -0.0816532 -0.0050869 0.807463 -0.0788818 -0.0086094 0.816725 -0.0749228 -0.0122808 0.82599 -0.0697509 -0.016048 0.835026 -0.0633847 -0.0198481 0.843591 -0.0558916 -0.0236121 0.851451 -0.0473896 -0.0272427 0.858392 -0.0380437 -0.0306618 0.864233 -0.0280601 -0.0337751 0.868842 -0.0176751 -0.0364858 0.87214 -0.007142 -0.0387225 0.874109 0.0032835 -0.0404144 0.874783 0.0133585 -0.0415136 0.87425 0.0228654 -0.0420196 0.872635 0.0316229 -0.0419263 0.870097 0.0394927 -0.0412748 0.866804 0.0463822 -0.0401198 0.862931 0.0522437 -0.0385362 0.858648 0.0570703 -0.0366042 0.854108 0.0608899 -0.0344182 0.849446 0.0637578 -0.0320599 0.844777 0.065749 -0.029609 0.840191 0.0669509 -0.0271284 0.835759 0.0674573 -0.0246767 0.831532 0.0673625 -0.022293 0.827547 0.0667585 -0.0200077 0.823824 0.0657312 -0.0178411 0.820376 0.0643594 -0.015805 0.817205 0.0627137 -0.0139033 0.814306 0.0608563 -0.012139 0.811672 0.0588413 -0.0105083 0.809291 0.0567151 -0.0090084 0.735298 -0.0515026 0.0212933 0.734817 -0.0553505 0.0212542 0.734736 -0.0593634 0.0210573 0.735124 -0.0635149 0.0206816 0.736059 -0.067768 0.0201053 0.73762 -0.0720731 0.0193096 0.739893 -0.076366 0.0182758 0.742959 -0.0805658 0.0169842 0.7469 -0.0845738 0.0154227 0.751786 -0.0882721 0.0135769 0.757676 -0.0915239 0.0114368 0.764601 -0.0941752 0.0089961 0.772567 -0.0960583 0.0062438 0.781537 -0.0969974 0.0031801 0.791427 -0.0968168 -0.0002 0.802101 -0.0953513 -0.0038861 0.813366 -0.0924587 -0.0078681 0.824973 -0.088034 -0.0121161 0.836628 -0.082022 -0.0165878 0.847999 -0.0744302 -0.0212165 0.858739 -0.0653365 -0.0259119 0.868508 -0.054893 -0.0305534 0.876995 -0.0433232 -0.035029 0.883943 -0.0309121 -0.0391743 0.889169 -0.0179906 -0.0428591 0.892578 -0.0049147 -0.0459349 0.894165 0.0079579 -0.0483011 0.89401 0.0202907 -0.0498488 0.892269 0.031789 -0.0505562 0.889157 0.0422155 -0.0504083 0.884919 0.0513986 -0.0494495 0.879819 0.0592357 -0.0477603 0.874114 0.0656892 -0.0454569 0.86804 0.0707791 -0.0426703 0.861805 0.0745719 -0.0395423 0.855582 0.0771681 -0.0362068 0.849504 0.0786907 -0.0327906 0.843674 0.0792741 -0.0293943 0.83816 0.0790552 -0.0261013 0.833008 0.0781666 -0.0229683 0.82824 0.0767321 -0.0200325 0.823865 0.0748636 -0.0173141 0.819879 0.0726599 -0.0148197 0.816269 0.0702069 -0.012545 0.813019 0.0675773 -0.0104832 0.810108 0.0648323 -0.0086199 0.807511 0.0620225 -0.0069429 0.730575 -0.0541975 0.0229545 0.729682 -0.0586294 0.0230819 0.729212 -0.0633081 0.0230516 0.729253 -0.0682131 0.0228411 0.729903 -0.0733112 0.0224296 0.73127 -0.078554 0.0217987 0.73347 -0.0838746 0.0209312 0.736625 -0.0891842 0.0198091 0.740856 -0.0943689 0.0184205 0.74628 -0.0992877 0.0167494 0.752999 -0.10377 0.0147797 0.76109 -0.107619 0.0124933 0.77059 -0.11061 0.0098599 0.781483 -0.112503 0.0068526 0.793683 -0.113049 0.0034348 0.807027 -0.112003 -0.0004232 0.821261 -0.109148 -0.0047519 0.836045 -0.104312 -0.009555 0.85096 -0.0973869 -0.0148172 0.865523 -0.0883553 -0.0204774 0.879224 -0.0773005 -0.026443 0.891555 -0.0644168 -0.0325647 0.902057 -0.0500064 -0.038658 0.910356 -0.0344665 -0.0445047 0.916196 -0.0182644 -0.0498645 0.919463 -0.0019051 -0.0544993 0.920187 0.0141054 -0.0581943 0.918535 0.0292976 -0.0607728 0.914787 0.0432688 -0.0621332 0.909298 0.0557073 -0.0622227 0.90247 0.0664033 -0.0610911 0.894706 0.0752506 -0.0588357 0.886386 0.0822381 -0.0556331 0.877843 0.0874343 -0.0516853 0.869352 0.0909686 -0.0472233 0.861122 0.0930116 -0.0424695 0.853306 0.0937561 -0.0376308 0.845998 0.0934021 -0.0328741 0.839255 0.0921445 -0.0283333 0.833095 0.0901647 -0.0240951 0.827516 0.0876254 -0.0202122 0.822496 0.0846687 -0.016705 0.818006 0.0814153 -0.0135705 0.81401 0.0779658 -0.0107898 0.81047 0.0744026 -0.0083386 0.807346 0.0707917 -0.0061839 0.804603 0.0671858 -0.0042963 0.725799 -0.0564157 0.0244556 0.724358 -0.0614733 0.024816 0.723349 -0.06688 0.0250332 0.722882 -0.0726253 0.0250883 0.723081 -0.0786852 0.0249671 0.724089 -0.0850177 0.0246592 0.726065 -0.0915585 0.0241566 0.729182 -0.0982149 0.0234512 0.733625 -0.104861 0.022538 0.739577 -0.111334 0.0214035 0.747213 -0.117426 0.0200246 0.756678 -0.122889 0.0183634 0.768071 -0.12743 0.016354 0.781416 -0.130724 0.0139187 0.796639 -0.132421 0.0109525 0.813546 -0.132168 0.0073456 0.831808 -0.129634 0.0029848 0.850952 -0.12454 -0.0022143 0.870372 -0.116693 -0.0083016 0.889358 -0.106025 -0.0152612 0.907143 -0.0926104 -0.0230032 0.922959 -0.0766923 -0.0313343 0.93611 -0.0586775 -0.0400078 0.946039 -0.0391202 -0.0486666 0.952386 -0.0186845 -0.0569214 0.955019 0.0019069 -0.0643572 0.954045 0.0219325 -0.0705928 0.94979 0.0407316 -0.075271 0.942746 0.0577529 -0.0781828 0.933519 0.0725895 -0.0791863 0.922752 0.0849925 -0.0782887 0.911074 0.094868 -0.0756168 0.899045 0.102258 -0.0714106 0.887126 0.107315 -0.0659828 0.87567 0.110264 -0.0596947 0.864919 0.11138 -0.0529152 0.85502 0.110954 -0.0459892 0.846039 0.109272 -0.039202 0.837983 0.106603 -0.0327795 0.83082 0.103189 -0.0268688 0.824494 0.0992375 -0.0215531 0.818934 0.094923 -0.0168592 0.814068 0.0903882 -0.0127714 0.809824 0.0857468 -0.009248 0.806133 0.0810879 -0.0062344 0.802935 0.0764792 -0.0036678 0.800173 0.0719717 -0.0014899 0.720573 -0.0579005 0.0257507 0.718408 -0.063603 0.0264243 0.716664 -0.0697766 0.0269927 0.715474 -0.076427 0.0274488 0.714994 -0.0835461 0.0277955 0.71541 -0.0911058 0.0280431 0.716938 -0.0990519 0.0282071 0.719823 -0.107296 0.0283027 0.724337 -0.115708 0.0283438 0.730764 -0.124104 0.0283253 0.739387 -0.132245 0.0282156 0.750463 -0.139825 0.0279435 0.764192 -0.146474 0.0273863 0.780673 -0.15176 0.0263748 0.79987 -0.155203 0.0246898 0.821565 -0.156301 0.0220852 0.845327 -0.154557 0.0182957 0.8705 -0.149534 0.01308 0.896205 -0.1409 0.0062585 0.921384 -0.128484 -0.0022648 0.94487 -0.112328 -0.0124473 0.965483 -0.0927207 -0.024081 0.982156 -0.0702017 -0.0367933 0.994041 -0.0455427 -0.0500498 1.00062 -0.0196898 -0.0631793 1.00175 0.006318 -0.0754754 0.997699 0.031446 -0.0862368 0.989066 0.0547598 -0.09485 0.976721 0.0755039 -0.100871 0.96168 0.0931521 -0.104013 0.94499 0.107424 -0.104212 0.927619 0.118269 -0.101596 0.910386 0.12583 -0.0964793 0.893923 0.130392 -0.0893161 0.878658 0.13233 -0.0806586 0.864841 0.132061 -0.071089 0.85257 0.130004 -0.0611711 0.841829 0.126559 -0.0513918 0.832529 0.122081 -0.042138 0.824538 0.116878 -0.0336731 0.817705 0.111207 -0.0261459 0.811881 0.105274 -0.0196064 0.806926 0.0992403 -0.0140285 0.802717 0.0932303 -0.0093386 0.799146 0.0873347 -0.0054379 0.796124 0.0816185 -0.0022164 0.793573 0.0761267 0.0004301 0.714133 -0.0583362 0.0268771 0.711022 -0.0646662 0.0279603 0.708292 -0.071606 0.0290108 0.706099 -0.0791843 0.030047 0.704637 -0.0874164 0.031106 0.704146 -0.096298 0.0322391 0.704914 -0.105796 0.0335062 0.707284 -0.115838 0.0349674 0.711645 -0.126299 0.0366721 0.718427 -0.136991 0.0386335 0.72807 -0.147648 0.0408109 0.741002 -0.15791 0.0430867 0.757581 -0.167326 0.0452507 0.778039 -0.175343 0.0470039 0.802416 -0.181322 0.0479516 0.830489 -0.184562 0.0476254 0.86171 -0.184342 0.0455097 0.895173 -0.179987 0.0410742 0.929611 -0.170942 0.0338414 0.963449 -0.156865 0.023456 0.994907 -0.137706 0.0097814 1.02217 -0.113778 -0.006985 1.04356 -0.085781 -0.0263036 1.05779 -0.0547757 -0.047236 1.06408 -0.0221061 -0.0685933 1.06231 0.0107318 -0.0890584 1.053 0.0422485 -0.107398 1.03726 0.0711186 -0.122548 1.01659 0.0963094 -0.133797 0.992704 0.117155 -0.140705 0.96727 0.133369 -0.143155 0.941782 0.145005 -0.141312 0.917418 0.152384 -0.135576 0.895005 0.155997 -0.126566 0.875027 0.15643 -0.115043 0.857675 0.154289 -0.101867 0.842917 0.150153 -0.0879003 0.830568 0.144543 -0.0739235 0.820362 0.137911 -0.0605825 0.811995 0.13063 -0.0483414 0.805172 0.122999 -0.0374783 0.799618 0.115254 -0.0281049 0.795101 0.107568 -0.0202014 0.791425 0.100071 -0.01366 0.788434 0.0928499 -0.0083229 0.786004 0.0859634 -0.0040133 0.784037 0.079446 -0.0005593 0.704794 -0.0573958 0.0281798 0.700459 -0.0642814 0.0297721 0.696426 -0.0719242 0.0314492 0.692875 -0.080382 0.0332731 0.690043 -0.0897024 0.0353373 0.688232 -0.0999148 0.0377596 0.687823 -0.11102 0.0406718 0.689281 -0.122978 0.0442031 0.693155 -0.135688 0.0484592 0.700068 -0.148975 0.0534842 0.710684 -0.162565 0.0592319 0.725673 -0.176066 0.0655347 0.745635 -0.188951 0.0720907 0.771015 -0.200544 0.078454 0.801999 -0.210027 0.0840222 0.838404 -0.216456 0.0880387 0.879566 -0.218815 0.0895786 0.924266 -0.216092 0.0875627 0.970707 -0.207399 0.0808483 1.01657 -0.192103 0.0683738 1.05916 -0.169972 0.0494502 1.09567 -0.141287 0.0240733 1.12351 -0.106911 -0.0068381 1.14062 -0.0682742 -0.0414283 1.14582 -0.0272615 -0.0771649 1.13902 0.0139848 -0.111342 1.12121 0.0533204 -0.141594 1.09433 0.0888629 -0.166263 1.06095 0.119203 -0.184496 1.0239 0.143519 -0.196057 0.985861 0.161581 -0.201161 0.949086 0.173654 -0.200242 0.915229 0.180355 -0.193901 0.885313 0.182492 -0.182893 0.859792 0.180933 -0.168136 0.838672 0.176513 -0.150697 0.821649 0.169982 -0.131727 0.808239 0.16198 -0.112346 0.797877 0.153034 -0.0935432 0.79 0.143567 -0.0760836 0.784091 0.13391 -0.0604719 0.779704 0.12431 -0.0469542 0.776478 0.114952 -0.0355605 0.774128 0.10596 -0.0261668 0.772438 0.0974192 -0.0185546 0.771249 0.0893777 -0.0124638 0.770442 0.0818589 -0.0076333 0.69042 -0.0547917 0.0303289 0.684546 -0.06209 0.0325262 0.678849 -0.0702882 0.0349767 0.673535 -0.0794777 0.0378067 0.668882 -0.0897452 0.0411897 0.665268 -0.101164 0.0453375 0.663181 -0.113784 0.0504782 0.663238 -0.127612 0.0568347 0.666187 -0.142598 0.0645884 0.672897 -0.158607 0.0738325 0.684331 -0.175391 0.0845421 0.701486 -0.192559 0.0965494 0.725305 -0.209539 0.109536 0.75656 -0.225553 0.123017 0.795694 -0.239599 0.13628 0.842651 -0.250458 0.14829 0.896694 -0.256746 0.157516 0.956252 -0.257012 0.161783 1.01885 -0.249897 0.158314 1.08114 -0.234329 0.144101 1.13914 -0.20975 0.116693 1.18854 -0.176309 0.0753161 1.2253 -0.134995 0.0216757 1.24617 -0.0876572 -0.039799 1.24927 -0.0368702 -0.102857 1.23449 0.0143437 -0.161052 1.20353 0.0629163 -0.209418 1.15974 0.106171 -0.24547 1.10744 0.142185 -0.269206 1.05128 0.169979 -0.282135 0.995514 0.189494 -0.286278 0.943489 0.201393 -0.283344 0.897435 0.206776 -0.274503 0.858486 0.206909 -0.260557 0.826876 0.203017 -0.242223 0.802195 0.196178 -0.220384 0.783647 0.18728 -0.196164 0.770253 0.17703 -0.170846 0.761008 0.165984 -0.145722 0.754975 0.154572 -0.121914 0.751339 0.143123 -0.100257 0.749432 0.131888 -0.0812441 0.74873 0.121047 -0.0650489 0.74884 0.110728 -0.0515925 0.74948 0.101011 -0.0406257 0.750455 0.0919389 -0.0318123 0.751633 0.0835291 -0.0247928 0.668591 -0.0503935 0.0344356 0.660862 -0.0578787 0.0373081 0.653139 -0.0663826 0.0406467 0.64565 -0.0760322 0.0446575 0.638721 -0.0869567 0.0496104 0.632805 -0.0992805 0.0558238 0.628514 -0.113112 0.063635 0.626638 -0.128527 0.073366 0.628158 -0.14555 0.0852839 0.634243 -0.164122 0.0995628 0.646218 -0.184067 0.116281 0.665505 -0.205044 0.135443 0.693513 -0.226491 0.157019 0.731486 -0.247571 0.180925 0.780293 -0.267122 0.206861 0.840162 -0.28364 0.2339 0.910389 -0.295321 0.259798 0.989065 -0.300177 0.280234 1.0729 -0.296245 0.288537 1.15722 -0.281863 0.276388 1.23623 -0.255987 0.236137 1.30352 -0.218494 0.164081 1.35285 -0.170394 0.0634504 1.37905 -0.113929 -0.054717 1.37901 -0.0524557 -0.174008 1.35242 0.009899 -0.277702 1.302 0.0688172 -0.354165 1.23325 0.120501 -0.399831 1.15339 0.162308 -0.418643 1.07002 0.193103 -0.418579 0.989842 0.213195 -0.407751 0.917743 0.22394 -0.391867 0.85656 0.227207 -0.373606 0.807282 0.224897 -0.35346 0.769536 0.218648 -0.330949 0.742107 0.209729 -0.305636 0.723384 0.199061 -0.277651 0.711661 0.187303 -0.247765 0.705326 0.174932 -0.217202 0.702963 0.162316 -0.187325 0.703393 0.149742 -0.159353 0.705676 0.137441 -0.134162 0.7091 0.125597 -0.11223 0.71315 0.114342 -0.0936584 0.717471 0.103768 -0.0782694 0.721829 0.0939292 -0.0657111 0.726087 0.0848453 -0.055556 0.638258 -0.0443177 0.0417819 0.628438 -0.051685 0.045378 0.618422 -0.0601461 0.0496787 0.608453 -0.0698599 0.0549714 0.598902 -0.0809973 0.0616204 0.590303 -0.0937354 0.0700403 0.583395 -0.108249 0.0806574 0.57915 -0.124696 0.0938704 0.578806 -0.143199 0.110031 0.583865 -0.163812 0.129446 0.596075 -0.18648 0.152483 0.61737 -0.210974 0.17973 0.649765 -0.236807 0.212199 0.695164 -0.263144 0.251388 0.755088 -0.288705 0.29891 0.830284 -0.311711 0.355375 0.920266 -0.329913 0.418301 1.02285 -0.34073 0.479573 1.13381 -0.341516 0.523812 1.24681 -0.329937 0.529608 1.35372 -0.304375 0.475183 1.44528 -0.264315 0.347597 1.51216 -0.210651 0.151741 1.54631 -0.14586 -0.0862608 1.54245 -0.0739939 -0.324834 1.4995 -0.0003737 -0.520868 1.4214 0.0691345 -0.645439 1.31682 0.1292 -0.692951 1.1976 0.176155 -0.679042 1.07614 0.20869 -0.629934 0.962962 0.227774 -0.570295 0.865085 0.235904 -0.515858 0.785799 0.236103 -0.472412 0.725361 0.231107 -0.438893 0.682084 0.222958 -0.411263 0.653354 0.21296 -0.385347 0.636326 0.201857 -0.358284 0.628317 0.190054 -0.328874 0.626979 0.177798 -0.297348 0.630349 0.165293 -0.264844 0.636848 0.152738 -0.232855 0.645245 0.140336 -0.202757 0.654621 0.128278 -0.175553 0.664323 0.116729 -0.15177 0.673911 0.105817 -0.131509 0.683114 0.0956275 -0.11456 0.691781 0.0862074 -0.100534 0.600667 -0.0370179 0.0536459 0.588686 -0.0439082 0.0579989 0.576295 -0.0519056 0.0632893 0.56375 -0.0611936 0.0698669 0.551462 -0.0719778 0.0781583 0.540042 -0.0844839 0.0886277 0.530351 -0.0989522 0.101728 0.523548 -0.115629 0.117872 0.521126 -0.134748 0.137472 0.524939 -0.156505 0.161053 0.537199 -0.181003 0.189597 0.560447 -0.208174 0.225054 0.597449 -0.237666 0.270989 0.651004 -0.268698 0.332968 0.723569 -0.299915 0.417971 0.816707 -0.329285 0.531827 0.930362 -0.354118 0.67397 1.06211 -0.371246 0.830376 1.20662 -0.37738 0.968197 1.3555 -0.369595 1.03716 1.49775 -0.345807 0.982431 1.6206 -0.305172 0.766795 1.71082 -0.248377 0.393939 1.75639 -0.177868 -0.0807387 1.7486 -0.0980169 -0.561439 1.68445 -0.0150624 -0.944943 1.56873 0.0635278 -1.16072 1.41441 0.13051 -1.19687 1.24037 0.180774 -1.09644 1.0667 0.21275 -0.929086 0.909856 0.228419 -0.757726 0.779732 0.231985 -0.619503 0.679557 0.22808 -0.524902 0.607727 0.220431 -0.467622 0.560116 0.21135 -0.435102 0.531885 0.201895 -0.415184 0.518503 0.192316 -0.398851 0.516126 0.182506 -0.380685 0.521637 0.172304 -0.358388 0.532551 0.161651 -0.331961 0.546911 0.150621 -0.302778 0.563203 0.139386 -0.272727 0.580291 0.128169 -0.243586 0.597361 0.117195 -0.216657 0.613869 0.106657 -0.192671 0.629481 0.0967021 -0.171852 0.644025 0.0874271 -0.154075 0.562756 -0.0292463 0.0704517 0.548833 -0.0352966 0.0756443 0.534307 -0.0423961 0.0819864 0.519449 -0.0507417 0.0898621 0.504706 -0.0605621 0.0997166 0.490761 -0.0721195 0.112002 0.478592 -0.0857095 0.127128 0.469532 -0.101657 0.145472 0.465329 -0.120305 0.167511 0.468194 -0.141984 0.194177 0.480841 -0.166962 0.227637 0.506501 -0.195344 0.272503 0.548863 -0.226926 0.337444 0.611854 -0.261002 0.436424 0.699166 -0.296161 0.58795 0.813428 -0.330149 0.809922 0.955113 -0.35989 1.10806 1.12141 -0.381745 1.4595 1.30545 -0.392006 1.79931 1.49631 -0.387487 2.02195 1.67966 -0.366031 2.0074 1.83894 -0.326795 1.66826 1.95678 -0.270361 0.999767 2.01658 -0.198874 0.105858 2.00489 -0.116375 -0.819034 1.915 -0.0292292 -1.55514 1.75123 0.0540204 -1.94495 1.53139 0.124189 -1.95747 1.28431 0.174357 -1.6881 1.04182 0.20251 -1.2947 0.829353 0.211912 -0.917229 0.660434 0.20896 -0.632334 0.537154 0.200199 -0.454961 0.454258 0.190305 -0.364946 0.403631 0.181571 -0.332294 0.377287 0.174442 -0.330652 0.368652 0.168366 -0.341063 0.372723 0.162513 -0.351423 0.385754 0.156203 -0.355134 0.404889 0.149065 -0.349799 0.427898 0.141035 -0.335969 0.453022 0.132265 -0.315841 0.478903 0.123025 -0.292163 0.504535 0.113615 -0.267413 0.529224 0.104311 -0.243414 0.552535 0.0953367 -0.22126 0.574236 0.0868502 -0.201436 0.541808 -0.0218596 0.0899488 0.526527 -0.0267575 0.0961611 0.510503 -0.0325732 0.10377 0.49402 -0.0395008 0.113198 0.477564 -0.0477735 0.124925 0.461887 -0.0576679 0.139414 0.448078 -0.0695074 0.157089 0.437643 -0.0836629 0.178399 0.43258 -0.100544 0.204129 0.435468 -0.120571 0.236107 0.449558 -0.144119 0.278684 0.478853 -0.171408 0.341089 0.528094 -0.202336 0.440661 0.602525 -0.236247 0.605565 0.707234 -0.271702 0.8739 0.845962 -0.306322 1.2841 1.01949 -0.336853 1.85251 1.22408 -0.359524 2.54122 1.45068 -0.370679 3.23149 1.68522 -0.367437 3.72739 1.90998 -0.348122 3.8051 2.10507 -0.312328 3.29909 2.24967 -0.260734 2.19041 2.32303 -0.195028 0.653456 2.30638 -0.118278 -0.96959 2.18738 -0.0358554 -2.27585 1.96742 0.0438683 -2.95941 1.66843 0.110597 -2.94576 1.33169 0.155784 -2.41048 1.00528 0.176826 -1.6608 0.727037 0.178138 -0.968233 0.514697 0.168151 -0.471974 0.367523 0.154995 -0.187039 0.274383 0.143837 -0.0644845 0.221561 0.136558 -0.0441363 0.197202 0.13276 -0.0784076 0.192622 0.131035 -0.135355 0.20191 0.129873 -0.194759 0.221024 0.128146 -0.244538 0.247013 0.125235 -0.278781 0.277546 0.120969 -0.296365 0.310699 0.115482 -0.29939 0.344902 0.109072 -0.291589 0.378926 0.102092 -0.276939 0.411875 0.0948748 -0.258825 0.443157 0.0876948 -0.239681 0.472429 0.0807579 -0.221028 0.568153 -0.015186 0.104102 0.552486 -0.0186846 0.111667 0.53598 -0.0228895 0.121127 0.518935 -0.0279674 0.133102 0.501872 -0.0341233 0.148328 0.485612 -0.0416061 0.167609 0.471352 -0.0507127 0.191823 0.460765 -0.0617893 0.222085 0.456096 -0.0752233 0.260277 0.460288 -0.0914177 0.310177 0.477132 -0.110735 0.37979 0.511403 -0.133396 0.485103 0.568893 -0.159314 0.655257 0.656117 -0.187887 0.93696 0.779424 -0.217782 1.39295 0.943345 -0.246818 2.08584 1.14842 -0.272082 3.04075 1.38932 -0.290341 4.19251 1.65418 -0.298681 5.34531 1.9258 -0.295092 6.18441 2.18364 -0.278716 6.36013 2.40568 -0.249691 5.62121 2.56913 -0.208783 3.94177 2.65044 -0.157143 1.58522 2.62608 -0.0965993 -0.930525 2.47708 -0.0307135 -2.97981 2.19959 0.0339035 -4.06384 1.81763 0.0878518 -4.03748 1.3855 0.122479 -3.17194 0.970298 0.134905 -1.97381 0.62444 0.129763 -0.893919 0.369682 0.115887 -0.152326 0.200762 0.101397 0.243785 0.0990192 0.0909499 0.38796 0.044298 0.0857174 0.38192 0.0207679 0.0846973 0.298951 0.0179288 0.08608 0.184199 0.0293813 0.088144 0.0650803 0.0511755 0.0896594 -0.0413584 0.0805624 0.0899591 -0.125542 0.115311 0.0888384 -0.184174 0.153456 0.0864011 -0.218809 0.193269 0.0829146 -0.233929 0.233314 0.0787018 -0.235001 0.272484 0.0740721 -0.227123 0.31 0.0692856 -0.214321 0.345379 0.0645408 -0.199391 0.648685 -0.0082801 0.103695 0.633475 -0.0101378 0.112817 0.617324 -0.012392 0.12471 0.600539 -0.0151439 0.140444 0.583663 -0.0185197 0.161373 0.567562 -0.022674 0.189133 0.553512 -0.0277928 0.225689 0.543312 -0.034093 0.273582 0.539398 -0.0418166 0.336609 0.544998 -0.0512122 0.421297 0.56432 -0.0624976 0.539871 0.602735 -0.0757929 0.715137 0.666828 -0.0910184 0.987144 0.764037 -0.107764 1.41877 0.901541 -0.125166 2.093 1.08421 -0.141853 3.08994 1.312 -0.156053 4.43515 1.57789 -0.165888 6.0288 1.86764 -0.169784 7.59653 2.16171 -0.166801 8.71425 2.43798 -0.156705 8.92807 2.67353 -0.13979 7.92577 2.84492 -0.116585 5.68933 2.92717 -0.0876697 2.56647 2.8935 -0.0538113 -0.773282 2.71949 -0.0166636 -3.51388 2.39588 0.0201733 -4.9832 1.94694 0.0509432 -4.96352 1.43731 0.0699127 -3.80733 0.950558 0.0750283 -2.20777 0.551674 0.069392 -0.786856 0.265223 0.0589521 0.160516 0.0812006 0.0490034 0.63976 -0.0259147 0.0423664 0.790678 -0.081719 0.0395303 0.755177 -0.105145 0.0396337 0.629084 -0.107926 0.0413842 0.467172 -0.0966234 0.0436152 0.300854 -0.0749156 0.0455147 0.149839 -0.0452316 0.0466456 0.0260521 -0.0095999 0.0468687 -0.0655657 0.0300668 0.0462395 -0.125941 0.071981 0.0449162 -0.159932 0.11458 0.0430926 -0.17405 0.156611 0.0409554 -0.174688 0.197159 0.0386629 -0.16713 0.235629 0.0363372 -0.15523 0.701716 0 0.0983602 0.686909 0 0.108302 0.671102 0 0.12157 0.6546 0 0.13954 0.637953 0 0.16398 0.622039 0 0.197091 0.608164 0 0.241567 0.59817 0 0.300849 0.594566 0 0.37989 0.600687 0 0.486703 0.620901 0 0.635555 0.660804 0 0.852225 0.727276 0 1.18117 0.828088 0 1.69151 0.970704 0 2.47352 1.16006 0 3.61269 1.3958 0 5.13217 1.67018 0 6.91428 1.96804 0 8.64968 2.26902 0 9.86932 2.55048 0 10.0787 2.78936 0 8.94532 2.96205 0 6.45917 3.04319 0 3.00477 3.00483 0 -0.687472 2.82043 0 -3.72384 2.47845 0 -5.36145 2.00297 0 -5.35188 1.46266 0 -4.07895 0.947777 0 -2.31477 0.528435 0 -0.754735 0.230127 0 0.274831 0.0407458 0 0.785626 -0.0680887 0 0.937761 -0.12415 0 0.890349 -0.147562 0 0.748405 -0.150506 0 0.570058 -0.139575 0 0.387684 -0.118314 0 0.221642 -0.0890018 0 0.0844443 -0.0535657 0 -0.0184146 -0.0138777 0 -0.0875506 0.0282679 0 -0.127917 0.0712741 0 -0.146362 0.113841 0 -0.149715 0.155009 0 -0.143707 0.194142 0 -0.132565 0.648685 0.0082801 0.103695 0.633475 0.0101378 0.112817 0.617324 0.012392 0.12471 0.600539 0.0151439 0.140444 0.583663 0.0185197 0.161373 0.567562 0.022674 0.189133 0.553512 0.0277928 0.225689 0.543312 0.034093 0.273582 0.539398 0.0418166 0.336609 0.544998 0.0512122 0.421297 0.56432 0.0624976 0.539871 0.602735 0.0757929 0.715137 0.666828 0.0910184 0.987144 0.764037 0.107764 1.41877 0.901541 0.125166 2.093 1.08421 0.141853 3.08994 1.312 0.156053 4.43515 1.57789 0.165888 6.0288 1.86764 0.169784 7.59653 2.16171 0.166801 8.71425 2.43798 0.156705 8.92807 2.67353 0.13979 7.92577 2.84492 0.116585 5.68933 2.92717 0.0876697 2.56647 2.8935 0.0538113 -0.773282 2.71949 0.0166636 -3.51388 2.39588 -0.0201733 -4.9832 1.94694 -0.0509432 -4.96352 1.43731 -0.0699127 -3.80733 0.950558 -0.0750283 -2.20777 0.551674 -0.069392 -0.786856 0.265223 -0.0589521 0.160516 0.0812006 -0.0490034 0.63976 -0.0259147 -0.0423664 0.790678 -0.081719 -0.0395303 0.755177 -0.105145 -0.0396337 0.629084 -0.107926 -0.0413842 0.467172 -0.0966234 -0.0436152 0.300854 -0.0749156 -0.0455147 0.149839 -0.0452316 -0.0466456 0.0260521 -0.0095999 -0.0468687 -0.0655657 0.0300668 -0.0462395 -0.125941 0.071981 -0.0449162 -0.159932 0.11458 -0.0430926 -0.17405 0.156611 -0.0409554 -0.174688 0.197159 -0.0386629 -0.16713 0.235629 -0.0363372 -0.15523 0.568153 0.015186 0.104102 0.552486 0.0186846 0.111667 0.53598 0.0228895 0.121127 0.518935 0.0279674 0.133102 0.501872 0.0341233 0.148328 0.485612 0.0416061 0.167609 0.471352 0.0507127 0.191823 0.460765 0.0617893 0.222085 0.456096 0.0752233 0.260277 0.460288 0.0914177 0.310177 0.477132 0.110735 0.37979 0.511403 0.133396 0.485103 0.568893 0.159314 0.655257 0.656117 0.187887 0.93696 0.779424 0.217782 1.39295 0.943345 0.246818 2.08584 1.14842 0.272082 3.04075 1.38932 0.290341 4.19251 1.65418 0.298681 5.34531 1.9258 0.295092 6.18441 2.18364 0.278716 6.36013 2.40568 0.249691 5.62121 2.56913 0.208783 3.94177 2.65044 0.157143 1.58522 2.62608 0.0965993 -0.930525 2.47708 0.0307135 -2.97981 2.19959 -0.0339035 -4.06384 1.81763 -0.0878518 -4.03748 1.3855 -0.122479 -3.17194 0.970298 -0.134905 -1.97381 0.62444 -0.129763 -0.893919 0.369682 -0.115887 -0.152326 0.200762 -0.101397 0.243785 0.0990192 -0.0909499 0.38796 0.044298 -0.0857174 0.38192 0.0207679 -0.0846973 0.298951 0.0179288 -0.08608 0.184199 0.0293813 -0.088144 0.0650803 0.0511755 -0.0896594 -0.0413584 0.0805624 -0.0899591 -0.125542 0.115311 -0.0888384 -0.184174 0.153456 -0.0864011 -0.218809 0.193269 -0.0829146 -0.233929 0.233314 -0.0787018 -0.235001 0.272484 -0.0740721 -0.227123 0.31 -0.0692856 -0.214321 0.345379 -0.0645408 -0.199391 0.541808 0.0218596 0.0899488 0.526527 0.0267575 0.0961611 0.510503 0.0325732 0.10377 0.49402 0.0395008 0.113198 0.477564 0.0477735 0.124925 0.461887 0.0576679 0.139414 0.448078 0.0695074 0.157089 0.437643 0.0836629 0.178399 0.43258 0.100544 0.204129 0.435468 0.120571 0.236107 0.449558 0.144119 0.278684 0.478853 0.171408 0.341089 0.528094 0.202336 0.440661 0.602525 0.236247 0.605565 0.707234 0.271702 0.8739 0.845962 0.306322 1.2841 1.01949 0.336853 1.85251 1.22408 0.359524 2.54122 1.45068 0.370679 3.23149 1.68522 0.367437 3.72739 1.90998 0.348122 3.8051 2.10507 0.312328 3.29909 2.24967 0.260734 2.19041 2.32303 0.195028 0.653456 2.30638 0.118278 -0.96959 2.18738 0.0358554 -2.27585 1.96742 -0.0438683 -2.95941 1.66843 -0.110597 -2.94576 1.33169 -0.155784 -2.41048 1.00528 -0.176826 -1.6608 0.727037 -0.178138 -0.968233 0.514697 -0.168151 -0.471974 0.367523 -0.154995 -0.187039 0.274383 -0.143837 -0.0644845 0.221561 -0.136558 -0.0441363 0.197202 -0.13276 -0.0784076 0.192622 -0.131035 -0.135355 0.20191 -0.129873 -0.194759 0.221024 -0.128146 -0.244538 0.247013 -0.125235 -0.278781 0.277546 -0.120969 -0.296365 0.310699 -0.115482 -0.29939 0.344902 -0.109072 -0.291589 0.378926 -0.102092 -0.276939 0.411875 -0.0948748 -0.258825 0.443157 -0.0876948 -0.239681 0.472429 -0.0807579 -0.221028 0.562756 0.0292463 0.0704517 0.548833 0.0352966 0.0756443 0.534307 0.0423961 0.0819864 0.519449 0.0507417 0.0898621 0.504706 0.0605621 0.0997166 0.490761 0.0721195 0.112002 0.478592 0.0857095 0.127128 0.469532 0.101657 0.145472 0.465329 0.120305 0.167511 0.468194 0.141984 0.194177 0.480841 0.166962 0.227637 0.506501 0.195344 0.272503 0.548863 0.226926 0.337444 0.611854 0.261002 0.436424 0.699166 0.296161 0.58795 0.813428 0.330149 0.809922 0.955113 0.35989 1.10806 1.12141 0.381745 1.4595 1.30545 0.392006 1.79931 1.49631 0.387487 2.02195 1.67966 0.366031 2.0074 1.83894 0.326795 1.66826 1.95678 0.270361 0.999767 2.01658 0.198874 0.105858 2.00489 0.116375 -0.819034 1.915 0.0292292 -1.55514 1.75123 -0.0540204 -1.94495 1.53139 -0.124189 -1.95747 1.28431 -0.174357 -1.6881 1.04182 -0.20251 -1.2947 0.829353 -0.211912 -0.917229 0.660434 -0.20896 -0.632334 0.537154 -0.200199 -0.454961 0.454258 -0.190305 -0.364946 0.403631 -0.181571 -0.332294 0.377287 -0.174442 -0.330652 0.368652 -0.168366 -0.341063 0.372723 -0.162513 -0.351423 0.385754 -0.156203 -0.355134 0.404889 -0.149065 -0.349799 0.427898 -0.141035 -0.335969 0.453022 -0.132265 -0.315841 0.478903 -0.123025 -0.292163 0.504535 -0.113615 -0.267413 0.529224 -0.104311 -0.243414 0.552535 -0.0953367 -0.22126 0.574236 -0.0868502 -0.201436 0.600667 0.0370179 0.0536459 0.588686 0.0439082 0.0579989 0.576295 0.0519056 0.0632893 0.56375 0.0611936 0.0698669 0.551462 0.0719778 0.0781583 0.540042 0.0844839 0.0886277 0.530351 0.0989522 0.101728 0.523548 0.115629 0.117872 0.521126 0.134748 0.137472 0.524939 0.156505 0.161053 0.537199 0.181003 0.189597 0.560447 0.208174 0.225054 0.597449 0.237666 0.270989 0.651004 0.268698 0.332968 0.723569 0.299915 0.417971 0.816707 0.329285 0.531827 0.930362 0.354118 0.67397 1.06211 0.371246 0.830376 1.20662 0.37738 0.968197 1.3555 0.369595 1.03716 1.49775 0.345807 0.982431 1.6206 0.305172 0.766795 1.71082 0.248377 0.393939 1.75639 0.177868 -0.0807387 1.7486 0.0980169 -0.561439 1.68445 0.0150624 -0.944943 1.56873 -0.0635278 -1.16072 1.41441 -0.13051 -1.19687 1.24037 -0.180774 -1.09644 1.0667 -0.21275 -0.929086 0.909856 -0.228419 -0.757726 0.779732 -0.231985 -0.619503 0.679557 -0.22808 -0.524902 0.607727 -0.220431 -0.467622 0.560116 -0.21135 -0.435102 0.531885 -0.201895 -0.415184 0.518503 -0.192316 -0.398851 0.516126 -0.182506 -0.380685 0.521637 -0.172304 -0.358388 0.532551 -0.161651 -0.331961 0.546911 -0.150621 -0.302778 0.563203 -0.139386 -0.272727 0.580291 -0.128169 -0.243586 0.597361 -0.117195 -0.216657 0.613869 -0.106657 -0.192671 0.629481 -0.0967021 -0.171852 0.644025 -0.0874271 -0.154075 0.638258 0.0443177 0.0417819 0.628438 0.051685 0.045378 0.618422 0.0601461 0.0496787 0.608453 0.0698599 0.0549714 0.598902 0.0809973 0.0616204 0.590303 0.0937354 0.0700403 0.583395 0.108249 0.0806574 0.57915 0.124696 0.0938704 0.578806 0.143199 0.110031 0.583865 0.163812 0.129446 0.596075 0.18648 0.152483 0.61737 0.210974 0.17973 0.649765 0.236807 0.212199 0.695164 0.263144 0.251388 0.755088 0.288705 0.29891 0.830284 0.311711 0.355375 0.920266 0.329913 0.418301 1.02285 0.34073 0.479573 1.13381 0.341516 0.523812 1.24681 0.329937 0.529608 1.35372 0.304375 0.475183 1.44528 0.264315 0.347597 1.51216 0.210651 0.151741 1.54631 0.14586 -0.0862608 1.54245 0.0739939 -0.324834 1.4995 0.0003737 -0.520868 1.4214 -0.0691345 -0.645439 1.31682 -0.1292 -0.692951 1.1976 -0.176155 -0.679042 1.07614 -0.20869 -0.629934 0.962962 -0.227774 -0.570295 0.865085 -0.235904 -0.515858 0.785799 -0.236103 -0.472412 0.725361 -0.231107 -0.438893 0.682084 -0.222958 -0.411263 0.653354 -0.21296 -0.385347 0.636326 -0.201857 -0.358284 0.628317 -0.190054 -0.328874 0.626979 -0.177798 -0.297348 0.630349 -0.165293 -0.264844 0.636848 -0.152738 -0.232855 0.645245 -0.140336 -0.202757 0.654621 -0.128278 -0.175553 0.664323 -0.116729 -0.15177 0.673911 -0.105817 -0.131509 0.683114 -0.0956275 -0.11456 0.691781 -0.0862074 -0.100534 0.668591 0.0503935 0.0344356 0.660862 0.0578787 0.0373081 0.653139 0.0663826 0.0406467 0.64565 0.0760322 0.0446575 0.638721 0.0869567 0.0496104 0.632805 0.0992805 0.0558238 0.628514 0.113112 0.063635 0.626638 0.128527 0.073366 0.628158 0.14555 0.0852839 0.634243 0.164122 0.0995628 0.646218 0.184067 0.116281 0.665505 0.205044 0.135443 0.693513 0.226491 0.157019 0.731486 0.247571 0.180925 0.780293 0.267122 0.206861 0.840162 0.28364 0.2339 0.910389 0.295321 0.259798 0.989065 0.300177 0.280234 1.0729 0.296245 0.288537 1.15722 0.281863 0.276388 1.23623 0.255987 0.236137 1.30352 0.218494 0.164081 1.35285 0.170394 0.0634504 1.37905 0.113929 -0.054717 1.37901 0.0524557 -0.174008 1.35242 -0.009899 -0.277702 1.302 -0.0688172 -0.354165 1.23325 -0.120501 -0.399831 1.15339 -0.162308 -0.418643 1.07002 -0.193103 -0.418579 0.989842 -0.213195 -0.407751 0.917743 -0.22394 -0.391867 0.85656 -0.227207 -0.373606 0.807282 -0.224897 -0.35346 0.769536 -0.218648 -0.330949 0.742107 -0.209729 -0.305636 0.723384 -0.199061 -0.277651 0.711661 -0.187303 -0.247765 0.705326 -0.174932 -0.217202 0.702963 -0.162316 -0.187325 0.703393 -0.149742 -0.159353 0.705676 -0.137441 -0.134162 0.7091 -0.125597 -0.11223 0.71315 -0.114342 -0.0936584 0.717471 -0.103768 -0.0782694 0.721829 -0.0939292 -0.0657111 0.726087 -0.0848453 -0.055556 0.69042 0.0547917 0.0303289 0.684546 0.06209 0.0325262 0.678849 0.0702882 0.0349767 0.673535 0.0794777 0.0378067 0.668882 0.0897452 0.0411897 0.665268 0.101164 0.0453375 0.663181 0.113784 0.0504782 0.663238 0.127612 0.0568347 0.666187 0.142598 0.0645884 0.672897 0.158607 0.0738325 0.684331 0.175391 0.0845421 0.701486 0.192559 0.0965494 0.725305 0.209539 0.109536 0.75656 0.225553 0.123017 0.795694 0.239599 0.13628 0.842651 0.250458 0.14829 0.896694 0.256746 0.157516 0.956252 0.257012 0.161783 1.01885 0.249897 0.158314 1.08114 0.234329 0.144101 1.13914 0.20975 0.116693 1.18854 0.176309 0.0753161 1.2253 0.134995 0.0216757 1.24617 0.0876572 -0.039799 1.24927 0.0368702 -0.102857 1.23449 -0.0143437 -0.161052 1.20353 -0.0629163 -0.209418 1.15974 -0.106171 -0.24547 1.10744 -0.142185 -0.269206 1.05128 -0.169979 -0.282135 0.995514 -0.189494 -0.286278 0.943489 -0.201393 -0.283344 0.897435 -0.206776 -0.274503 0.858486 -0.206909 -0.260557 0.826876 -0.203017 -0.242223 0.802195 -0.196178 -0.220384 0.783647 -0.18728 -0.196164 0.770253 -0.17703 -0.170846 0.761008 -0.165984 -0.145722 0.754975 -0.154572 -0.121914 0.751339 -0.143123 -0.100257 0.749432 -0.131888 -0.0812441 0.74873 -0.121047 -0.0650489 0.74884 -0.110728 -0.0515925 0.74948 -0.101011 -0.0406257 0.750455 -0.0919389 -0.0318123 0.751633 -0.0835291 -0.0247928 0.704794 0.0573958 0.0281798 0.700459 0.0642814 0.0297721 0.696426 0.0719242 0.0314492 0.692875 0.080382 0.0332731 0.690043 0.0897024 0.0353373 0.688232 0.0999148 0.0377596 0.687823 0.11102 0.0406718 0.689281 0.122978 0.0442031 0.693155 0.135688 0.0484592 0.700068 0.148975 0.0534842 0.710684 0.162565 0.0592319 0.725673 0.176066 0.0655347 0.745635 0.188951 0.0720907 0.771015 0.200544 0.078454 0.801999 0.210027 0.0840222 0.838404 0.216456 0.0880387 0.879566 0.218815 0.0895786 0.924266 0.216092 0.0875627 0.970707 0.207399 0.0808483 1.01657 0.192103 0.0683738 1.05916 0.169972 0.0494502 1.09567 0.141287 0.0240733 1.12351 0.106911 -0.0068381 1.14062 0.0682742 -0.0414283 1.14582 0.0272615 -0.0771649 1.13902 -0.0139848 -0.111342 1.12121 -0.0533204 -0.141594 1.09433 -0.0888629 -0.166263 1.06095 -0.119203 -0.184496 1.0239 -0.143519 -0.196057 0.985861 -0.161581 -0.201161 0.949086 -0.173654 -0.200242 0.915229 -0.180355 -0.193901 0.885313 -0.182492 -0.182893 0.859792 -0.180933 -0.168136 0.838672 -0.176513 -0.150697 0.821649 -0.169982 -0.131727 0.808239 -0.16198 -0.112346 0.797877 -0.153034 -0.0935432 0.79 -0.143567 -0.0760836 0.784091 -0.13391 -0.0604719 0.779704 -0.12431 -0.0469542 0.776478 -0.114952 -0.0355605 0.774128 -0.10596 -0.0261668 0.772438 -0.0974192 -0.0185546 0.771249 -0.0893777 -0.0124638 0.770442 -0.0818589 -0.0076333 0.714133 0.0583362 0.0268771 0.711022 0.0646662 0.0279603 0.708292 0.071606 0.0290108 0.706099 0.0791843 0.030047 0.704637 0.0874164 0.031106 0.704146 0.096298 0.0322391 0.704914 0.105796 0.0335062 0.707284 0.115838 0.0349674 0.711645 0.126299 0.0366721 0.718427 0.136991 0.0386335 0.72807 0.147648 0.0408109 0.741002 0.15791 0.0430867 0.757581 0.167326 0.0452507 0.778039 0.175343 0.0470039 0.802416 0.181322 0.0479516 0.830489 0.184562 0.0476254 0.86171 0.184342 0.0455097 0.895173 0.179987 0.0410742 0.929611 0.170942 0.0338414 0.963449 0.156865 0.023456 0.994907 0.137706 0.0097814 1.02217 0.113778 -0.006985 1.04356 0.085781 -0.0263036 1.05779 0.0547757 -0.047236 1.06408 0.0221061 -0.0685933 1.06231 -0.0107318 -0.0890584 1.053 -0.0422485 -0.107398 1.03726 -0.0711186 -0.122548 1.01659 -0.0963094 -0.133797 0.992704 -0.117155 -0.140705 0.96727 -0.133369 -0.143155 0.941782 -0.145005 -0.141312 0.917418 -0.152384 -0.135576 0.895005 -0.155997 -0.126566 0.875027 -0.15643 -0.115043 0.857675 -0.154289 -0.101867 0.842917 -0.150153 -0.0879003 0.830568 -0.144543 -0.0739235 0.820362 -0.137911 -0.0605825 0.811995 -0.13063 -0.0483414 0.805172 -0.122999 -0.0374783 0.799618 -0.115254 -0.0281049 0.795101 -0.107568 -0.0202014 0.791425 -0.100071 -0.01366 0.788434 -0.0928499 -0.0083229 0.786004 -0.0859634 -0.0040133 0.784037 -0.079446 -0.0005593 0.720573 0.0579005 0.0257507 0.718408 0.063603 0.0264243 0.716664 0.0697766 0.0269927 0.715474 0.076427 0.0274488 0.714994 0.0835461 0.0277955 0.71541 0.0911058 0.0280431 0.716938 0.0990519 0.0282071 0.719823 0.107296 0.0283027 0.724337 0.115708 0.0283438 0.730764 0.124104 0.0283253 0.739387 0.132245 0.0282156 0.750463 0.139825 0.0279435 0.764192 0.146474 0.0273863 0.780673 0.15176 0.0263748 0.79987 0.155203 0.0246898 0.821565 0.156301 0.0220852 0.845327 0.154557 0.0182957 0.8705 0.149534 0.01308 0.896205 0.1409 0.0062585 0.921384 0.128484 -0.0022648 0.94487 0.112328 -0.0124473 0.965483 0.0927207 -0.024081 0.982156 0.0702017 -0.0367933 0.994041 0.0455427 -0.0500498 1.00062 0.0196898 -0.0631793 1.00175 -0.006318 -0.0754754 0.997699 -0.031446 -0.0862368 0.989066 -0.0547598 -0.09485 0.976721 -0.0755039 -0.100871 0.96168 -0.0931521 -0.104013 0.94499 -0.107424 -0.104212 0.927619 -0.118269 -0.101596 0.910386 -0.12583 -0.0964793 0.893923 -0.130392 -0.0893161 0.878658 -0.13233 -0.0806586 0.864841 -0.132061 -0.071089 0.85257 -0.130004 -0.0611711 0.841829 -0.126559 -0.0513918 0.832529 -0.122081 -0.042138 0.824538 -0.116878 -0.0336731 0.817705 -0.111207 -0.0261459 0.811881 -0.105274 -0.0196064 0.806926 -0.0992403 -0.0140285 0.802717 -0.0932303 -0.0093386 0.799146 -0.0873347 -0.0054379 0.796124 -0.0816185 -0.0022164 0.793573 -0.0761267 0.0004301 0.725799 0.0564157 0.0244556 0.724358 0.0614733 0.024816 0.723349 0.06688 0.0250332 0.722882 0.0726253 0.0250883 0.723081 0.0786852 0.0249671 0.724089 0.0850177 0.0246592 0.726065 0.0915585 0.0241566 0.729182 0.0982149 0.0234512 0.733625 0.104861 0.022538 0.739577 0.111334 0.0214035 0.747213 0.117426 0.0200246 0.756678 0.122889 0.0183634 0.768071 0.12743 0.016354 0.781416 0.130724 0.0139187 0.796639 0.132421 0.0109525 0.813546 0.132168 0.0073456 0.831808 0.129634 0.0029848 0.850952 0.12454 -0.0022143 0.870372 0.116693 -0.0083016 0.889358 0.106025 -0.0152612 0.907143 0.0926104 -0.0230032 0.922959 0.0766923 -0.0313343 0.93611 0.0586775 -0.0400078 0.946039 0.0391202 -0.0486666 0.952386 0.0186845 -0.0569214 0.955019 -0.0019069 -0.0643572 0.954045 -0.0219325 -0.0705928 0.94979 -0.0407316 -0.075271 0.942746 -0.0577529 -0.0781828 0.933519 -0.0725895 -0.0791863 0.922752 -0.0849925 -0.0782887 0.911074 -0.094868 -0.0756168 0.899045 -0.102258 -0.0714106 0.887126 -0.107315 -0.0659828 0.87567 -0.110264 -0.0596947 0.864919 -0.11138 -0.0529152 0.85502 -0.110954 -0.0459892 0.846039 -0.109272 -0.039202 0.837983 -0.106603 -0.0327795 0.83082 -0.103189 -0.0268688 0.824494 -0.0992375 -0.0215531 0.818934 -0.094923 -0.0168592 0.814068 -0.0903882 -0.0127714 0.809824 -0.0857468 -0.009248 0.806133 -0.0810879 -0.0062344 0.802935 -0.0764792 -0.0036678 0.800173 -0.0719717 -0.0014899 0.730575 0.0541975 0.0229545 0.729682 0.0586294 0.0230819 0.729212 0.0633081 0.0230516 0.729253 0.0682131 0.0228411 0.729903 0.0733112 0.0224296 0.73127 0.078554 0.0217987 0.73347 0.0838746 0.0209312 0.736625 0.0891842 0.0198091 0.740856 0.0943689 0.0184205 0.74628 0.0992877 0.0167494 0.752999 0.10377 0.0147797 0.76109 0.107619 0.0124933 0.77059 0.11061 0.0098599 0.781483 0.112503 0.0068526 0.793683 0.113049 0.0034348 0.807027 0.112003 -0.0004232 0.821261 0.109148 -0.0047519 0.836045 0.104312 -0.009555 0.85096 0.0973869 -0.0148172 0.865523 0.0883553 -0.0204774 0.879224 0.0773005 -0.026443 0.891555 0.0644168 -0.0325647 0.902057 0.0500064 -0.038658 0.910356 0.0344665 -0.0445047 0.916196 0.0182644 -0.0498645 0.919463 0.0019051 -0.0544993 0.920187 -0.0141054 -0.0581943 0.918535 -0.0292976 -0.0607728 0.914787 -0.0432688 -0.0621332 0.909298 -0.0557073 -0.0622227 0.90247 -0.0664033 -0.0610911 0.894706 -0.0752506 -0.0588357 0.886386 -0.0822381 -0.0556331 0.877843 -0.0874343 -0.0516853 0.869352 -0.0909686 -0.0472233 0.861122 -0.0930116 -0.0424695 0.853306 -0.0937561 -0.0376308 0.845998 -0.0934021 -0.0328741 0.839255 -0.0921445 -0.0283333 0.833095 -0.0901647 -0.0240951 0.827516 -0.0876254 -0.0202122 0.822496 -0.0846687 -0.016705 0.818006 -0.0814153 -0.0135705 0.81401 -0.0779658 -0.0107898 0.81047 -0.0744026 -0.0083386 0.807346 -0.0707917 -0.0061839 0.804603 -0.0671858 -0.0042963 0.735298 0.0515026 0.0212933 0.734817 0.0553505 0.0212542 0.734736 0.0593634 0.0210573 0.735124 0.0635149 0.0206816 0.736059 0.067768 0.0201053 0.73762 0.0720731 0.0193096 0.739893 0.076366 0.0182758 0.742959 0.0805658 0.0169842 0.7469 0.0845738 0.0154227 0.751786 0.0882721 0.0135769 0.757676 0.0915239 0.0114368 0.764601 0.0941752 0.0089961 0.772567 0.0960583 0.0062438 0.781537 0.0969974 0.0031801 0.791427 0.0968168 -0.0002 0.802101 0.0953513 -0.0038861 0.813366 0.0924587 -0.0078681 0.824973 0.088034 -0.0121161 0.836628 0.082022 -0.0165878 0.847999 0.0744302 -0.0212165 0.858739 0.0653365 -0.0259119 0.868508 0.054893 -0.0305534 0.876995 0.0433232 -0.035029 0.883943 0.0309121 -0.0391743 0.889169 0.0179906 -0.0428591 0.892578 0.0049147 -0.0459349 0.894165 -0.0079579 -0.0483011 0.89401 -0.0202907 -0.0498488 0.892269 -0.031789 -0.0505562 0.889157 -0.0422155 -0.0504083 0.884919 -0.0513986 -0.0494495 0.879819 -0.0592357 -0.0477603 0.874114 -0.0656892 -0.0454569 0.86804 -0.0707791 -0.0426703 0.861805 -0.0745719 -0.0395423 0.855582 -0.0771681 -0.0362068 0.849504 -0.0786907 -0.0327906 0.843674 -0.0792741 -0.0293943 0.83816 -0.0790552 -0.0261013 0.833008 -0.0781666 -0.0229683 0.82824 -0.0767321 -0.0200325 0.823865 -0.0748636 -0.0173141 0.819879 -0.0726599 -0.0148197 0.816269 -0.0702069 -0.012545 0.813019 -0.0675773 -0.0104832 0.810108 -0.0648323 -0.0086199 0.807511 -0.0620225 -0.0069429 0.739941 0.0485373 0.0195819 0.739764 0.0518548 0.0194259 0.739956 0.0552737 0.0191202 0.740571 0.0587654 0.0186466 0.741669 0.0622924 0.0179858 0.743308 0.0658073 0.0171208 0.74555 0.0692516 0.0160357 0.74845 0.0725544 0.0147123 0.752061 0.0756323 0.0131417 0.756424 0.078389 0.0113121 0.761569 0.0807164 0.0092177 0.767504 0.0824964 0.0068606 0.774216 0.0836043 0.0042379 0.781662 0.0839131 0.0013617 0.789765 0.0832999 -0.0017554 0.798415 0.0816532 -0.0050869 0.807463 0.0788818 -0.0086094 0.816725 0.0749228 -0.0122808 0.82599 0.0697509 -0.016048 0.835026 0.0633847 -0.0198481 0.843591 0.0558916 -0.0236121 0.851451 0.0473896 -0.0272427 0.858392 0.0380437 -0.0306618 0.864233 0.0280601 -0.0337751 0.868842 0.0176751 -0.0364858 0.87214 0.007142 -0.0387225 0.874109 -0.0032835 -0.0404144 0.874783 -0.0133585 -0.0415136 0.87425 -0.0228654 -0.0420196 0.872635 -0.0316229 -0.0419263 0.870097 -0.0394927 -0.0412748 0.866804 -0.0463822 -0.0401198 0.862931 -0.0522437 -0.0385362 0.858648 -0.0570703 -0.0366042 0.854108 -0.0608899 -0.0344182 0.849446 -0.0637578 -0.0320599 0.844777 -0.065749 -0.029609 0.840191 -0.0669509 -0.0271284 0.835759 -0.0674573 -0.0246767 0.831532 -0.0673625 -0.022293 0.827547 -0.0667585 -0.0200077 0.823824 -0.0657312 -0.0178411 0.820376 -0.0643594 -0.015805 0.817205 -0.0627137 -0.0139033 0.814306 -0.0608563 -0.012139 0.811672 -0.0588413 -0.0105083 0.809291 -0.0567151 -0.0090084 0.744479 0.0454488 0.0178875 0.744522 0.0482944 0.0176536 0.744898 0.0511936 0.0172821 0.745651 0.0541177 0.0167582 0.746825 0.0570312 0.016066 0.748463 0.0598908 0.0151918 0.750609 0.0626448 0.0141233 0.7533 0.0652329 0.0128455 0.75657 0.0675858 0.011353 0.76044 0.0696263 0.009638 0.764922 0.0712697 0.0076974 0.770014 0.0724264 0.0055372 0.775693 0.0730038 0.0031603 0.781915 0.0729108 0.0005828 0.788615 0.0720616 -0.0021792 0.795702 0.0703812 -0.0050964 0.803061 0.0678111 -0.0081413 0.810556 0.0643152 -0.0112701 0.818031 0.0598844 -0.0144382 0.82532 0.0545415 -0.0175945 0.832254 0.0483429 -0.0206743 0.838665 0.0413794 -0.0236122 0.844403 0.0337739 -0.026351 0.849339 0.0256766 -0.0288202 0.853375 0.017258 -0.0309627 0.856448 0.0087009 -0.0327289 0.858532 0.0001902 -0.0340845 0.859642 -0.0080965 -0.0350007 0.859825 -0.0159975 -0.0354797 0.859157 -0.0233744 -0.0355273 0.857735 -0.0301165 -0.0351665 0.855674 -0.0361438 -0.0344375 0.853091 -0.0414067 -0.0333905 0.850106 -0.0458847 -0.0320746 0.846834 -0.0495831 -0.0305501 0.843376 -0.0525283 -0.0288701 0.839826 -0.0547633 -0.0270878 0.836261 -0.0563431 -0.0252465 0.832744 -0.0573301 -0.0233877 0.829328 -0.0577902 -0.0215404 0.826049 -0.0577899 -0.0197314 0.822936 -0.057394 -0.0179794 0.820007 -0.0566637 -0.0162987 0.817273 -0.0556558 -0.0146972 0.81474 -0.0544218 -0.0131823 0.812407 -0.0530078 -0.0117565 0.810271 -0.0514547 -0.0104221mayavi-4.5.0/mayavi/tests/data/SampleStructGrid.vtk0000644000076500000240000405541512747716314022767 0ustar prabhustaff00000000000000# vtk DataFile Version 3.0 vtk output ASCII DATASET STRUCTURED_GRID DIMENSIONS 20 30 40 POINTS 24000 float 3.90799e-16 9.85395e-06 0.00041631 0.00176643 0.00364602 0.0259133 0.000922976 0.00487217 0.0552675 0.00454433 0.00233178 0.0833129 0.00931732 0.0056806 0.105561 0.000508319 0.00767051 0.125189 0.0025236 0.00298197 0.15876 0.00531557 0.00920261 0.180154 0.00810429 0.0018842 0.208863 0.00570614 0.000767746 0.233153 0.00984891 0.00118352 0.258939 0.00784484 0.00100916 0.277533 0.000198417 0.00378377 0.306789 0.00680923 0.00752707 0.325062 0.00624407 0.00126462 0.356176 0.00770928 0.00186536 0.379967 0.005095 0.00315939 0.407017 0.00367247 0.00876312 0.42871 0.00525252 0.00427835 0.455427 0.00667979 0.00171142 0.483308 0.00861905 0.0326922 0.000525795 0.0096673 0.0283428 0.025821 0.00270315 0.0257426 0.0567623 0.00810159 0.0296421 0.0806919 0.00512203 0.0308651 0.107388 0.00871689 0.0307797 0.134647 0.00333529 0.0289283 0.151769 0.00111869 0.0335268 0.183112 0.00954887 0.0340428 0.201389 0.00686187 0.0262699 0.225041 5.02785e-06 0.0269295 0.255868 0.00374959 0.0252679 0.279648 0.00785343 0.0294223 0.302879 0.00853353 0.0302597 0.332284 0.00266314 0.0328348 0.35468 0.00196997 0.0294718 0.382284 0.00966093 0.0325684 0.404661 0.00868966 0.0263404 0.433461 0.000180877 0.0344085 0.456701 0.00799972 0.0264322 0.481105 0.00908283 0.0577441 0.00366065 0.00944288 0.0588482 0.0294517 0.00163028 0.0542482 0.0547985 0.000311283 0.0560843 0.0829226 0.00182497 0.0552512 0.108988 0.0030879 0.0594263 0.12888 0.00930512 0.0591138 0.153377 0.00532812 0.0570208 0.18471 0.00768085 0.0575194 0.200909 0.00853967 0.0517464 0.225198 0.00419054 0.0529637 0.253782 0.00418716 0.0513845 0.278808 0.0029978 0.0502101 0.302388 0.000371094 0.0522106 0.330254 0.00494525 0.0588252 0.357738 0.000590025 0.051198 0.380478 0.00341916 0.0545681 0.405881 0.0058515 0.0506993 0.433189 0.00403161 0.0558548 0.451912 0.00892277 0.0517633 0.477077 0.00115748 0.0765891 0.00992644 0.00681571 0.083118 0.0314222 0.00329342 0.0823755 0.0582348 0.00721261 0.0815798 0.0785877 0.00610365 0.07915 0.10815 0.00773965 0.0777431 0.125447 0.00601041 0.0801409 0.156302 0.00180893 0.077785 0.179525 0.00642986 0.0824283 0.204137 0.00618052 0.0811829 0.233544 0.00181457 0.0780793 0.250233 9.18198e-05 0.0845145 0.284908 0.0020494 0.0810409 0.309357 0.00559567 0.0804687 0.329391 0.00449752 0.0780681 0.352008 0.002158 0.075499 0.377096 0.00574563 0.0841482 0.404156 0.00654159 0.078557 0.430867 0.00391946 0.0753385 0.452855 0.00091604 0.0794438 0.484259 0.00921284 0.106059 0.00861146 0.000147172 0.106867 0.0334457 0.00129647 0.100597 0.0501307 0.00391159 0.108657 0.0751506 0.00924288 0.108867 0.106621 0.00654911 0.100763 0.12593 3.25213e-05 0.105267 0.157898 0.00654019 0.105459 0.182984 0.00726753 0.102533 0.202552 0.00138354 0.104829 0.229676 0.00100876 0.105042 0.258584 0.000100477 0.108216 0.284643 0.000194594 0.109296 0.300631 0.000379622 0.101903 0.327767 0.00447314 0.106494 0.351511 0.00487155 0.106497 0.380343 0.00356802 0.103941 0.40722 0.00724702 0.103061 0.426066 0.0091078 0.107409 0.452391 0.00651344 0.103684 0.475262 0.00849258 0.125418 0.000561211 0.00426039 0.129797 0.0300169 0.00980527 0.131075 0.0591266 0.00750416 0.132138 0.0847113 0.000292117 0.127643 0.100183 0.000806761 0.126546 0.126144 0.00756538 0.134382 0.151288 0.00592612 0.126225 0.180992 0.000658728 0.12756 0.204125 0.00948387 0.128535 0.22517 0.00973425 0.132624 0.25862 0.0040513 0.133679 0.275368 0.00208479 0.129233 0.309848 0.00564353 0.130763 0.329682 0.0046416 0.132611 0.353021 0.00417256 0.125985 0.376368 0.00698138 0.126804 0.408931 0.00730879 0.128023 0.426412 0.008241 0.129422 0.455901 0.00977622 0.130027 0.483977 0.00724808 0.152613 0.00455035 0.00261958 0.159605 0.0251693 0.00940439 0.15902 0.0509787 0.00521122 0.150847 0.082954 0.0086891 0.150958 0.108803 6.00615e-05 0.15202 0.129726 0.00644231 0.15934 0.150984 0.00570898 0.155076 0.181594 0.00892915 0.157358 0.206893 0.00809339 0.152404 0.232635 0.00768728 0.155424 0.254811 0.0041438 0.150736 0.280267 0.00507623 0.157516 0.301311 9.37614e-05 0.15764 0.326012 0.00965288 0.150892 0.351159 0.00896274 0.157452 0.377185 0.0058546 0.152408 0.408845 0.00396093 0.150565 0.434272 0.0045242 0.158708 0.452302 0.00488962 0.155713 0.483529 0.00218364 0.184205 0.000386261 0.0040839 0.175538 0.0260516 0.00529782 0.18073 0.0511449 0.000425676 0.180009 0.0822475 0.00494231 0.178461 0.100351 0.00366505 0.184156 0.130049 0.00861768 0.184235 0.150153 0.00289962 0.177394 0.182165 0.00101573 0.182774 0.202447 0.00431663 0.180916 0.230145 0.00768635 0.182216 0.258036 0.00740518 0.180062 0.283183 0.000592642 0.180759 0.308617 0.00551174 0.183287 0.326241 0.00710174 0.175016 0.350318 0.00291344 0.181714 0.378002 0.00433837 0.177733 0.401243 0.00134329 0.176049 0.42916 0.00820584 0.177601 0.451483 0.000138782 0.177213 0.478529 0.0076193 0.204212 0.00686691 0.00526691 0.203299 0.0264364 0.00375358 0.207447 0.0572988 0.00731954 0.201738 0.080567 0.00685514 0.208705 0.105584 0.00344739 0.205357 0.134623 0.00923171 0.207527 0.15687 0.00336166 0.203607 0.182079 0.00662554 0.203975 0.200137 0.00407951 0.206675 0.227194 0.000888169 0.206176 0.250192 0.00217242 0.202061 0.278745 0.00399823 0.202939 0.305243 0.00792152 0.203971 0.332271 0.00697282 0.20632 0.35123 0.00733361 0.201687 0.375281 0.0021649 0.201708 0.401701 0.00528646 0.203129 0.434012 0.00443719 0.200792 0.45137 0.0053529 0.206428 0.483421 0.00969753 0.228404 0.00367711 0.00712868 0.225456 0.0262477 0.00258288 0.234652 0.0583749 0.00687851 0.231887 0.0830877 0.0052461 0.230832 0.106839 0.00460254 0.232598 0.127763 0.00316928 0.22566 0.151484 0.00472621 0.227396 0.184448 0.0033058 0.227609 0.201713 0.00873876 0.233638 0.229785 0.00216758 0.232728 0.251027 0.00207741 0.22731 0.276662 0.0026502 0.233045 0.301085 0.00258255 0.233796 0.327152 0.00665078 0.231258 0.357925 0.00345951 0.231304 0.377505 0.000359759 0.23307 0.404051 0.00438404 0.232563 0.432843 0.00480335 0.232159 0.453877 0.000281683 0.229175 0.484008 0.00612354 0.258342 0.00757822 0.00606587 0.258614 0.0290571 0.0023763 0.255848 0.0510524 0.00490458 0.25845 0.0820413 0.00104651 0.25693 0.100331 0.00426893 0.257323 0.127751 0.00335741 0.25314 0.152184 0.00607551 0.255795 0.175706 0.0047934 0.251609 0.202929 0.00657304 0.259967 0.22593 0.000516261 0.250225 0.259335 0.00063295 0.257123 0.280561 0.00412148 0.259882 0.304604 0.00699764 0.256871 0.33035 0.00576024 0.255423 0.35601 0.00371753 0.258978 0.377456 0.00412392 0.255702 0.402901 0.00832116 0.252679 0.427619 0.0049332 0.250659 0.451095 0.00233001 0.256175 0.482036 0.00258866 0.283032 0.00128187 0.00404914 0.283084 0.0266127 0.00443031 0.28191 0.050291 0.00542918 0.280081 0.0841338 0.00438811 0.28364 0.108334 0.00665999 0.283722 0.134146 0.00151167 0.275923 0.156748 0.00131121 0.283959 0.178155 0.000705783 0.280814 0.202138 0.00693284 0.27807 0.23305 0.00878733 0.282438 0.255773 0.00867274 0.283455 0.281466 0.000977268 0.281238 0.30804 0.00930262 0.279449 0.326026 0.00942635 0.283508 0.351359 0.00841756 0.281832 0.380529 0.00981669 0.278488 0.407534 0.00209897 0.279223 0.433543 0.000214089 0.277549 0.455324 0.00627505 0.282739 0.481277 0.00790272 0.301125 0.00887194 0.00773443 0.308572 0.0297974 0.00774054 0.302856 0.0529172 0.00197939 0.30297 0.0797654 0.00313978 0.304048 0.105905 0.00415645 0.308673 0.125469 0.000438109 0.307625 0.15435 0.00490307 0.305333 0.184583 0.00456499 0.309637 0.203852 0.00463136 0.300365 0.228326 0.00868259 0.309457 0.257028 0.00240648 0.301985 0.283619 0.00695628 0.301694 0.308548 0.00186674 0.300614 0.334182 0.00310355 0.30191 0.352895 0.0099856 0.302484 0.38349 0.00427422 0.304577 0.407105 0.00500323 0.303006 0.428407 9.00238e-05 0.30828 0.453666 0.00876902 0.302737 0.481086 0.00764369 0.327182 0.00194412 0.00373621 0.331549 0.027019 0.00428968 0.329375 0.050582 0.00870058 0.331661 0.0780616 0.00110096 0.33428 0.109395 0.00410016 0.327134 0.131991 0.00284144 0.32793 0.156332 0.00547851 0.330873 0.182473 0.000689482 0.334568 0.207272 0.000819872 0.33469 0.226068 0.000906413 0.3294 0.253802 0.00711056 0.334376 0.277908 0.00941991 0.326747 0.300285 0.00387987 0.334453 0.332143 0.00461379 0.328365 0.35826 0.00585883 0.3339 0.382036 0.00919677 0.333902 0.406314 0.00357848 0.325677 0.432922 0.00625854 0.32957 0.457497 0.00292908 0.331228 0.480277 0.00797972 0.356979 0.00237892 0.00203092 0.35578 0.0305656 0.00900761 0.359858 0.0543803 0.00401726 0.350106 0.07978 0.00545855 0.350493 0.104752 0.00729667 0.352353 0.128574 0.00961916 0.350746 0.151512 0.0017388 0.356794 0.17693 0.0074904 0.350831 0.209715 0.00318164 0.357075 0.23016 0.00897557 0.359166 0.251463 0.00698158 0.35829 0.282478 0.00992856 0.358301 0.307788 0.00667334 0.356651 0.327486 0.00138917 0.355826 0.353795 0.00175742 0.359994 0.380988 0.0075652 0.359919 0.406169 0.000997007 0.350896 0.433683 0.00556957 0.35562 0.452256 0.00556367 0.35816 0.480844 0.00735675 0.377932 0.00918379 0.00473664 0.376577 0.0266579 0.00734353 0.383276 0.0597466 0.000460466 0.375776 0.0822827 0.00538749 0.384228 0.100717 0.00237515 0.384274 0.128094 0.00728931 0.384997 0.152552 0.00484168 0.37627 0.180116 0.0099839 0.383528 0.203111 0.00421436 0.380962 0.228278 0.00457622 0.379699 0.258685 0.00552036 0.381354 0.275552 0.00469349 0.377113 0.304587 0.00090265 0.382257 0.333641 0.00177029 0.382643 0.352888 0.00352192 0.384625 0.375054 0.00250467 0.377652 0.408769 0.000906464 0.383994 0.428219 0.00805478 0.382229 0.454796 0.00260901 0.379801 0.480038 0.00957014 0.406396 0.000680288 0.00611262 0.404317 0.027135 0.000191862 0.404358 0.0590534 0.00574822 0.403506 0.0775925 0.00301015 0.408938 0.100393 0.00846019 0.400566 0.132246 0.000181514 0.40159 0.150972 0.00363671 0.405591 0.181711 0.00316299 0.405178 0.208196 0.00791155 0.408434 0.230207 0.00561588 0.404041 0.257734 0.0091708 0.406664 0.275966 0.00831045 0.403976 0.300178 0.00223899 0.407211 0.327381 0.0064325 0.400074 0.359728 0.000962819 0.400611 0.380452 0.00667218 0.401866 0.405139 0.00180096 0.409984 0.425609 0.00948419 0.405995 0.455493 0.00926819 0.400858 0.478254 0.000915002 0.427433 0.00874161 0.00670519 0.431783 0.0273538 0.00800649 0.430604 0.0557938 0.00601434 0.430334 0.0840695 0.00898543 0.430722 0.108288 0.000216981 0.42957 0.127837 0.00570828 0.427147 0.15078 0.00203492 0.432654 0.180757 0.00851232 0.433003 0.206984 0.00590226 0.428161 0.228491 0.00746505 0.433342 0.25013 0.00458611 0.428146 0.278988 0.00195499 0.431967 0.30435 0.00844583 0.42562 0.328505 0.00917694 0.430246 0.359916 0.00520446 0.433632 0.382591 0.00504339 0.427166 0.404698 0.000226138 0.425028 0.425783 0.00558127 0.430096 0.45491 0.00587194 0.426367 0.483887 0.00067121 0.459175 0.00729 0.00014542 0.458943 0.0319875 0.00508778 0.45831 0.0588977 0.00217069 0.455458 0.0822679 0.00540194 0.458219 0.104882 0.00471584 0.450231 0.128155 0.00703843 0.453943 0.153538 0.00798884 0.455185 0.177399 0.00211884 0.451317 0.20533 0.00751298 0.457513 0.232867 0.00727639 0.453262 0.253454 0.00270338 0.458867 0.279832 0.0034219 0.454294 0.308579 0.0045725 0.454418 0.327241 0.00923117 0.452143 0.35893 0.00940692 0.455628 0.384287 0.00932247 0.452331 0.406793 0.00458608 0.455496 0.433699 0.00767137 0.452825 0.450077 0.000421635 0.4503 0.479409 0.00512701 0.481434 0.00304827 0.00253162 0.484467 0.0250961 0.00222067 0.479485 0.057196 0.00328522 0.484785 0.0762263 0.0014961 0.482641 0.106801 0.00904895 0.480975 0.129487 0.00514675 0.479236 0.150727 0.00879651 0.476907 0.181705 0.0062191 0.475949 0.206307 6.70948e-05 0.478764 0.233455 0.0088816 0.476701 0.252393 0.000239499 0.480728 0.283513 0.00380732 0.484442 0.306917 0.00823838 0.481954 0.33413 0.000372871 0.481368 0.353552 0.00519772 0.484695 0.384136 0.00447147 0.479463 0.40346 0.000196333 0.477615 0.430156 0.00245247 0.479569 0.451299 0.00453058 0.476087 0.482588 0.00314982 0.500953 0.00702795 0.00880336 0.505038 0.0338291 0.00378459 0.503249 0.0513282 0.00618121 0.500934 0.0778296 0.0040703 0.500125 0.104809 0.00388466 0.502973 0.12738 0.00406228 0.508662 0.155083 0.00906234 0.50282 0.181345 0.00878872 0.509142 0.203222 0.00666958 0.505692 0.233225 0.00649076 0.506788 0.258346 0.00683346 0.500399 0.275767 1.18701e-05 0.509503 0.302521 0.00471283 0.502268 0.331241 0.00535527 0.50756 0.357365 0.00591635 0.506593 0.379628 0.00890126 0.500676 0.406984 0.00459502 0.508156 0.431607 0.00884149 0.509866 0.45519 0.00254493 0.500701 0.484761 0.00641506 0.526637 0.00157157 0.00757526 0.526394 0.0332009 0.00107183 0.533585 0.0554985 0.00142562 0.532177 0.0762907 0.00588139 0.527022 0.109879 0.00867485 0.526999 0.129193 0.00844964 0.532639 0.159273 0.00307945 0.534842 0.175869 0.00304818 0.528608 0.201825 0.00671749 0.531909 0.230507 0.00336751 0.529822 0.253886 0.0080026 0.531488 0.276482 0.00480955 0.531751 0.303828 0.00266389 0.530818 0.326957 0.00873085 0.525067 0.357086 0.00623765 0.529151 0.383153 0.00949602 0.525856 0.401451 0.0063999 0.52712 0.425664 0.00376344 0.525315 0.454846 0.00908717 0.528282 0.483674 0.000710189 0.551155 0.000309897 0.00993182 0.556888 0.0279736 0.000481244 0.552314 0.0518889 0.00178197 0.557003 0.0794537 0.00620769 0.550214 0.107393 0.0038908 0.551109 0.133601 0.00992008 0.551915 0.153906 0.00866816 0.558096 0.180136 0.00112716 0.553274 0.202133 0.00725136 0.553463 0.233625 0.00265462 0.551669 0.258057 0.0055973 0.553162 0.280054 0.00616738 0.554378 0.306298 0.00934541 0.55377 0.3298 0.00291284 0.551249 0.352486 0.00285735 0.558797 0.377232 0.00114347 0.550368 0.409005 0.00244192 0.559093 0.43438 0.00433103 0.550147 0.450451 0.00930538 0.55518 0.480736 0.000120211 0.578136 0.00922511 0.00041837 0.57865 0.03326 0.00636185 0.578741 0.0516718 0.00795772 0.581061 0.083044 0.00825447 0.580736 0.102847 0.00915067 0.575602 0.132101 0.00788616 0.575827 0.15402 0.00173289 0.577092 0.175809 0.00216152 0.579325 0.205515 0.00118587 0.578789 0.234595 0.00162922 0.583489 0.25621 0.00736834 0.579226 0.279337 0.00447476 0.582584 0.300732 0.00675066 0.583412 0.329083 0.00357614 0.578345 0.355381 0.00575211 0.576632 0.384188 0.00106324 0.580957 0.405493 0.00511954 0.583872 0.432067 0.00334639 0.578133 0.458014 0.00850575 0.576331 0.482869 0.00271694 0.60041 0.00242937 0.00147004 0.609542 0.0281337 0.00814484 0.609745 0.0543473 0.0070699 0.605374 0.0775737 0.0059622 0.600444 0.1081 0.000457719 0.604764 0.126662 0.00677027 0.601613 0.153249 0.000697619 0.602618 0.177477 0.00382626 0.60302 0.205848 0.00643897 0.600038 0.228138 0.0046408 0.60613 0.259272 0.000534655 0.601545 0.284132 0.00297527 0.60226 0.308221 0.0033608 0.60898 0.331673 0.00289052 0.609881 0.356591 0.00571688 0.604538 0.383212 0.00968829 0.606943 0.40714 0.00335035 0.604608 0.430549 0.0073987 0.608209 0.455682 0.00446268 0.602842 0.483929 0.00193273 0.62669 0.00928969 0.00971575 0.632805 0.0324651 0.00882217 0.630326 0.0504273 0.0042752 0.626141 0.0770836 0.00654755 0.629555 0.102925 0.00687791 0.632025 0.134207 0.00509505 0.634948 0.152956 0.00435455 0.631274 0.17862 0.00973598 0.634611 0.209778 0.00037115 0.632617 0.228292 0.00981592 0.634679 0.255663 0.00438247 0.626852 0.276711 0.00108312 0.632701 0.309926 0.00487987 0.630271 0.32881 0.00593073 0.629066 0.358762 0.00417859 0.634016 0.377582 0.00884765 0.626471 0.407372 0.00693719 0.634498 0.430158 0.00520547 0.627714 0.454337 0.00100438 0.633868 0.483351 0.00988304 0.655075 0.00239296 0.00273883 0.650546 0.0311788 0.00232269 0.651114 0.055653 0.00614287 0.658345 0.0758359 0.00611145 0.652736 0.102036 0.00607668 0.657458 0.126766 0.00378453 0.655004 0.152527 0.000912983 0.653903 0.184351 0.000742497 0.659936 0.209881 0.00894795 0.659067 0.233239 0.008005 0.650254 0.258528 0.00855856 0.655047 0.275653 0.00847622 0.65324 0.308758 0.009441 0.651462 0.334584 0.00446779 0.652354 0.354948 0.0020257 0.657606 0.377146 0.00168148 0.659095 0.407427 0.00125124 0.65008 0.426359 0.00814445 0.659762 0.455735 0.00601694 0.658151 0.483765 0.00826305 0.678816 0.00250362 0.00407144 0.682108 0.0280151 0.00563884 0.677393 0.050276 0.0028659 0.675855 0.0773793 0.000735786 0.684312 0.106728 0.00828006 0.677717 0.133338 0.00296835 0.683512 0.150292 0.00665862 0.679539 0.179541 0.00136624 0.680606 0.201903 0.00418964 0.679024 0.231495 0.00132437 0.680017 0.258552 0.00505375 0.680106 0.282638 0.00642102 0.683454 0.30077 0.000700534 0.683185 0.326904 0.00748236 0.676471 0.351116 0.00780798 0.684825 0.376375 0.00721836 0.675334 0.404299 0.00984188 0.680069 0.427169 0.00425786 0.678131 0.459018 0.00994886 0.684211 0.480678 0.0053023 0.705858 0.00529434 0.00839625 0.702343 0.0321379 0.00412383 0.702383 0.0572392 0.00367732 0.706959 0.078854 0.00947667 0.708643 0.103154 0.000840535 0.708052 0.129546 0.00500723 0.708212 0.158423 0.00971657 0.702491 0.176754 0.00932329 0.709415 0.208719 0.00615774 0.707001 0.229683 0.00165106 0.705419 0.2508 0.00721437 0.706238 0.282043 0.00120252 0.703401 0.309279 0.00586205 0.701055 0.332186 0.00263978 0.706838 0.356216 0.00317775 0.708445 0.378961 0.00145615 0.705898 0.407431 0.00973529 0.706168 0.426996 0.00221152 0.704624 0.457024 0.00247353 0.70484 0.476398 0.00780739 0.730585 0.000120589 0.00641422 0.726446 0.0311216 0.00588409 0.734308 0.054115 0.00782728 0.725236 0.0830885 0.00382989 0.730942 0.105975 0.00693359 0.731139 0.126253 0.00936225 0.730456 0.15161 0.00413521 0.730589 0.182484 0.00522858 0.726984 0.206164 0.00367663 0.732428 0.225267 0.00442231 0.734935 0.253282 0.00136929 0.733043 0.27967 0.00777774 0.731015 0.301348 0.00468667 0.730621 0.329785 0.00283298 0.731645 0.357758 0.00697942 0.728494 0.383722 0.00967464 0.731584 0.400647 0.00294662 0.734335 0.425536 0.0078078 0.725478 0.452778 0.00901764 0.734538 0.475375 0.0252148 0.00647751 0.00757365 0.0277489 0.00408517 0.0271207 0.026028 0.00293812 0.0566145 0.0252388 0.00454277 0.0829104 0.033845 0.000984806 0.108006 0.0305892 0.00602915 0.131869 0.0295515 0.00350081 0.158095 0.031648 0.00803307 0.178932 0.0304153 0.00759297 0.200816 0.0327725 0.00322449 0.231899 0.034655 9.21593e-05 0.256138 0.0348132 0.00444805 0.279209 0.0277804 0.00370331 0.30797 0.0269925 0.00948616 0.330683 0.0311574 0.0012067 0.358397 0.0296633 0.0084086 0.378146 0.0306058 0.0040289 0.406602 0.0331138 0.00779788 0.431964 0.0294491 0.00271258 0.454282 0.0303211 0.00538406 0.47667 0.0304394 0.0285745 0.00581409 0.0260725 0.0331745 0.0346198 0.0253102 0.0324929 0.0555635 0.0281471 0.033599 0.079445 0.0328202 0.0280121 0.109205 0.0347218 0.0331674 0.131996 0.0327288 0.0281904 0.153005 0.0338965 0.0312999 0.183198 0.0307247 0.0338358 0.205161 0.0273472 0.0319544 0.231669 0.0290314 0.0316043 0.257359 0.0305301 0.0293287 0.284686 0.0331893 0.0268498 0.308918 0.0319075 0.0326181 0.32501 0.027474 0.0311012 0.359887 0.0335078 0.0321405 0.380107 0.0339958 0.0257347 0.407699 0.0305188 0.0330913 0.431942 0.0264165 0.0258394 0.450909 0.0305829 0.0318622 0.481657 0.0332386 0.0570297 0.0058076 0.0336791 0.0529745 0.0269209 0.0287605 0.056967 0.0541029 0.0253809 0.0592246 0.0771348 0.0321079 0.0587193 0.10442 0.0348542 0.054501 0.127502 0.0265548 0.0522703 0.151228 0.0260721 0.0578003 0.184909 0.0258704 0.0595395 0.208579 0.0266509 0.0571594 0.227239 0.0307145 0.0572639 0.253184 0.0278565 0.0531414 0.275881 0.031705 0.0534221 0.305348 0.026446 0.05257 0.333686 0.0254046 0.0593848 0.352799 0.0318831 0.0514116 0.382118 0.0314843 0.059418 0.40443 0.0292896 0.0571535 0.428733 0.0276686 0.0589693 0.4563 0.0326881 0.0518274 0.476255 0.0268737 0.0787341 0.0093247 0.0256649 0.0827968 0.0293755 0.0307605 0.0839464 0.0501504 0.0258091 0.0786294 0.0782669 0.0271637 0.0818554 0.100195 0.0294652 0.075318 0.129587 0.0309048 0.0768024 0.158882 0.0294117 0.0849702 0.175493 0.0333265 0.0802912 0.202187 0.0297786 0.0771029 0.228584 0.0319964 0.0811858 0.255988 0.0315472 0.0826736 0.275353 0.0340147 0.0824042 0.306682 0.027903 0.0812292 0.333263 0.0272653 0.079596 0.352069 0.0339693 0.0765603 0.377764 0.0270389 0.0846594 0.400608 0.0268192 0.0819386 0.426613 0.0260051 0.0777027 0.45277 0.0257157 0.0842784 0.479312 0.0295858 0.105045 0.00691221 0.0342071 0.100054 0.0338407 0.0329881 0.108973 0.0589342 0.0342687 0.105273 0.0842649 0.0306988 0.106404 0.10005 0.0263187 0.101284 0.130824 0.027678 0.101148 0.155607 0.0289206 0.109706 0.178138 0.0338347 0.108972 0.204957 0.0296386 0.10706 0.228139 0.0253958 0.108658 0.257473 0.0327871 0.102413 0.279038 0.0264597 0.104068 0.308558 0.0305124 0.1083 0.328824 0.0273823 0.108899 0.351058 0.0250498 0.102123 0.376026 0.0283256 0.108007 0.405242 0.0317733 0.106094 0.430401 0.0265184 0.101374 0.458176 0.0297006 0.104385 0.484493 0.0332985 0.125857 0.00370179 0.0260262 0.13374 0.0255484 0.029189 0.134499 0.0577662 0.0280603 0.1315 0.0775416 0.0292507 0.125576 0.10254 0.0305535 0.127833 0.130701 0.026374 0.127289 0.151451 0.0293258 0.131087 0.18281 0.0317832 0.126543 0.207618 0.0309167 0.128242 0.225325 0.0320925 0.125664 0.250963 0.0315509 0.134948 0.283538 0.0254638 0.133072 0.300442 0.0330681 0.126194 0.334585 0.0294632 0.133483 0.357321 0.0279028 0.133229 0.375048 0.0282459 0.128753 0.405044 0.0252238 0.134378 0.425588 0.0321379 0.126082 0.453593 0.0333734 0.128382 0.476596 0.0329991 0.155329 0.000813586 0.0256557 0.153643 0.0287383 0.0260479 0.152814 0.0566705 0.0319344 0.155368 0.0788516 0.034231 0.154388 0.101286 0.0349247 0.152705 0.125381 0.0262305 0.155132 0.152266 0.0254383 0.151522 0.178345 0.0275159 0.153731 0.20867 0.0266231 0.158128 0.225656 0.0299919 0.152892 0.259858 0.0334102 0.157462 0.278139 0.0256549 0.155451 0.301346 0.0293445 0.1542 0.334227 0.0284532 0.154972 0.35638 0.0277068 0.151593 0.383972 0.0257722 0.15021 0.406031 0.0310051 0.151043 0.429486 0.0273329 0.156708 0.45471 0.0313065 0.150897 0.484141 0.0293653 0.183021 0.00788372 0.0306804 0.184201 0.0253254 0.026953 0.178184 0.0535461 0.0251375 0.181582 0.080654 0.0265717 0.184092 0.104602 0.0303649 0.177033 0.125261 0.0343366 0.175636 0.151849 0.0277417 0.175309 0.176499 0.0327265 0.178518 0.204328 0.0313395 0.180487 0.231313 0.0338812 0.1814 0.253976 0.0270684 0.176637 0.276514 0.0306653 0.178349 0.300599 0.0256443 0.182476 0.334794 0.0305474 0.18325 0.350865 0.0321029 0.180073 0.375995 0.034485 0.177723 0.400291 0.0302675 0.175249 0.431109 0.0324848 0.175928 0.450663 0.0301662 0.182066 0.484959 0.0278061 0.207383 0.00575391 0.0295193 0.205273 0.0344496 0.031312 0.209453 0.0561752 0.0273262 0.20407 0.0767197 0.0324843 0.205322 0.109445 0.0333625 0.207601 0.132507 0.0342423 0.205484 0.151074 0.0286604 0.208485 0.176021 0.0275683 0.204954 0.206345 0.0266012 0.203979 0.232918 0.0253872 0.208988 0.256331 0.0293199 0.209266 0.275178 0.0257991 0.205926 0.305233 0.02542 0.209744 0.327329 0.0349275 0.203671 0.359637 0.0291089 0.203933 0.381476 0.0286323 0.203308 0.407187 0.0251476 0.204459 0.430958 0.0265791 0.201363 0.455234 0.0332655 0.202736 0.477 0.0255492 0.231686 0.00719068 0.0318486 0.231192 0.0339869 0.0316556 0.234743 0.0585406 0.0314017 0.234216 0.0841108 0.0290249 0.232915 0.109728 0.0327052 0.22706 0.12984 0.0338752 0.230646 0.158049 0.0292102 0.228086 0.178459 0.0300286 0.226716 0.200195 0.0276228 0.231315 0.226308 0.0333284 0.230617 0.25734 0.033109 0.231399 0.283553 0.0272725 0.226548 0.302833 0.0303043 0.226781 0.330938 0.0322384 0.233429 0.358626 0.0339882 0.230697 0.380023 0.025854 0.229535 0.400779 0.0286042 0.226082 0.427408 0.0344439 0.229912 0.45944 0.0306227 0.231183 0.481572 0.031583 0.25666 0.00144822 0.0254606 0.258144 0.025575 0.026121 0.256576 0.0589897 0.0270589 0.25689 0.0826302 0.0275824 0.256737 0.108563 0.0264704 0.250178 0.133257 0.0269733 0.251032 0.155892 0.027809 0.25293 0.178659 0.0310198 0.251226 0.202132 0.0333106 0.255298 0.231808 0.0298409 0.253056 0.254843 0.0343499 0.254985 0.284226 0.0336941 0.253973 0.307014 0.0330254 0.250593 0.332413 0.026929 0.25103 0.353901 0.0311089 0.251296 0.381039 0.029161 0.255302 0.405424 0.0277178 0.251499 0.433366 0.0332274 0.259378 0.454131 0.0266207 0.251254 0.484462 0.0269577 0.27917 0.00607194 0.03265 0.277511 0.0260947 0.0313629 0.280125 0.0591566 0.0291689 0.280832 0.0830946 0.0269633 0.283633 0.103211 0.0301343 0.280336 0.125411 0.0273992 0.281708 0.158494 0.0272332 0.276028 0.179191 0.032014 0.27771 0.209705 0.0330626 0.282597 0.226518 0.0278289 0.278291 0.257467 0.0251755 0.284494 0.28437 0.0274507 0.28364 0.304589 0.0333852 0.284014 0.332214 0.03418 0.279807 0.359927 0.0285224 0.284622 0.383592 0.0325123 0.284964 0.404143 0.0344162 0.278875 0.430964 0.0318332 0.280384 0.452237 0.0310909 0.278757 0.483013 0.0304511 0.303017 0.00629408 0.0303693 0.306639 0.0331464 0.0334884 0.303411 0.0570777 0.0262039 0.309367 0.0834113 0.0343275 0.308273 0.107455 0.0250478 0.300069 0.134659 0.0284674 0.309676 0.150092 0.0349504 0.302006 0.178605 0.0308827 0.302074 0.203479 0.0339242 0.302759 0.225675 0.0260541 0.304578 0.257523 0.027436 0.302831 0.277849 0.0302576 0.308013 0.308201 0.028925 0.300709 0.327015 0.0322821 0.306608 0.357378 0.0252818 0.308989 0.376889 0.0290636 0.302749 0.403575 0.0338067 0.308423 0.427279 0.0340197 0.306894 0.453835 0.0302766 0.303294 0.475164 0.0251708 0.330936 0.000154209 0.0250014 0.326398 0.0332144 0.0345074 0.334823 0.055415 0.0305475 0.327483 0.0768481 0.0261774 0.333965 0.100057 0.0298691 0.3337 0.132331 0.0293775 0.328198 0.152504 0.0303258 0.331729 0.182986 0.0288205 0.328437 0.201559 0.0322937 0.326406 0.226495 0.0289623 0.330376 0.252159 0.0262814 0.333812 0.277047 0.032372 0.326664 0.304246 0.0270887 0.331984 0.325078 0.0297745 0.327754 0.355703 0.0343456 0.334881 0.379734 0.0264857 0.332779 0.401018 0.0265375 0.333245 0.425803 0.0274192 0.327152 0.452476 0.0283088 0.326576 0.482963 0.0290033 0.35653 0.0017602 0.0281139 0.357482 0.0259013 0.0329819 0.356421 0.0564306 0.0305757 0.356607 0.0813357 0.0252234 0.35567 0.107945 0.0347545 0.356021 0.128706 0.0318019 0.3522 0.158385 0.0270877 0.352832 0.180358 0.0302537 0.35788 0.205912 0.0324395 0.358006 0.234981 0.0252841 0.359499 0.257896 0.0313341 0.359361 0.278739 0.0258323 0.355842 0.303515 0.0329823 0.356221 0.330669 0.0343929 0.358737 0.35451 0.0257947 0.358068 0.381437 0.032768 0.353796 0.403197 0.0282092 0.350676 0.425385 0.0251825 0.351472 0.457964 0.0253003 0.354639 0.47636 0.0276291 0.380515 0.00828069 0.0297685 0.381108 0.0288895 0.0282129 0.377104 0.0525759 0.0333083 0.375553 0.0807385 0.0250392 0.384907 0.106077 0.0329631 0.383215 0.126466 0.0321413 0.379839 0.159126 0.0346186 0.375308 0.179788 0.0348295 0.379758 0.204997 0.0338256 0.381143 0.231954 0.0279089 0.384895 0.251976 0.0327028 0.38212 0.276283 0.0310649 0.382682 0.305487 0.0334102 0.38338 0.328194 0.0306183 0.381633 0.353826 0.0256456 0.384047 0.382604 0.0297012 0.377857 0.409764 0.0284676 0.378723 0.425585 0.0268497 0.381859 0.451447 0.0262662 0.381074 0.47855 0.0252637 0.407341 0.00994107 0.0315019 0.408534 0.0277955 0.0323297 0.406103 0.0539989 0.0317813 0.405596 0.0772193 0.0287218 0.401835 0.101398 0.0281197 0.406166 0.129653 0.0286742 0.403012 0.15946 0.0293951 0.408742 0.175349 0.0277978 0.405765 0.209686 0.0347181 0.406586 0.23169 0.0345913 0.400312 0.252384 0.032382 0.406214 0.283034 0.0337266 0.40421 0.307873 0.0332909 0.401114 0.33252 0.0312771 0.404638 0.358277 0.0279929 0.409222 0.384532 0.0312967 0.405964 0.403197 0.0325476 0.40338 0.42833 0.0296563 0.406124 0.45161 0.0332461 0.406579 0.477165 0.0304697 0.429996 0.00981012 0.0299455 0.432536 0.025578 0.0281376 0.427577 0.0586185 0.0272127 0.427054 0.0788989 0.0315083 0.431775 0.109257 0.0286585 0.430197 0.131061 0.0292398 0.427234 0.155129 0.0315968 0.434431 0.178254 0.0321494 0.426781 0.20436 0.0271839 0.430123 0.233589 0.0260104 0.43031 0.258576 0.0335348 0.42997 0.278376 0.0256232 0.434527 0.301049 0.0291963 0.428261 0.334577 0.0298742 0.433494 0.351849 0.031853 0.430475 0.382672 0.025264 0.426502 0.408288 0.0335614 0.429268 0.425118 0.0292947 0.425933 0.451785 0.0272576 0.428434 0.483837 0.0329296 0.452386 0.00906381 0.0320371 0.45011 0.0339671 0.0283814 0.451833 0.0538215 0.027789 0.450519 0.0846009 0.0296645 0.458222 0.106827 0.0272266 0.452815 0.131971 0.0298869 0.452136 0.15593 0.0285056 0.45546 0.18456 0.0330491 0.453056 0.207157 0.0296411 0.450304 0.231662 0.0325803 0.458522 0.25345 0.0319247 0.458389 0.277136 0.0338614 0.452909 0.304718 0.0283521 0.459493 0.327102 0.0269916 0.45172 0.353411 0.0268221 0.459143 0.377434 0.0272876 0.456346 0.400829 0.0294161 0.45524 0.434882 0.0303623 0.451501 0.453576 0.034172 0.453007 0.480599 0.0305197 0.478761 0.00796295 0.034058 0.482375 0.0269454 0.034231 0.478094 0.0514426 0.0323125 0.476494 0.080567 0.0286063 0.47995 0.108732 0.0301926 0.483889 0.134399 0.0304752 0.483785 0.150305 0.0288814 0.47896 0.176782 0.0256395 0.479171 0.209073 0.0261961 0.47877 0.226578 0.0314407 0.475516 0.258976 0.0251446 0.480495 0.276933 0.0253768 0.484508 0.307526 0.0315527 0.47791 0.334564 0.0307483 0.479787 0.35466 0.0324886 0.483104 0.383777 0.0281736 0.479887 0.405038 0.0309649 0.480772 0.434457 0.0257729 0.482577 0.452657 0.0299863 0.477793 0.475092 0.0334283 0.507709 0.00646951 0.0343213 0.506013 0.0346475 0.0340693 0.500631 0.0550712 0.0329571 0.505075 0.0754337 0.0347703 0.507316 0.105916 0.0263671 0.503123 0.127809 0.0311585 0.509663 0.153526 0.0326722 0.502183 0.183897 0.0299304 0.501819 0.201672 0.0255432 0.503482 0.232582 0.0291941 0.502163 0.258285 0.0271425 0.507151 0.282324 0.0269594 0.50626 0.302736 0.0290007 0.50224 0.329986 0.0267827 0.506721 0.350365 0.0280463 0.508898 0.376367 0.031372 0.509566 0.400555 0.0297132 0.508538 0.434115 0.0324235 0.505502 0.451582 0.0330734 0.503624 0.477316 0.0254109 0.527648 0.00645671 0.0255877 0.532083 0.0272762 0.0340357 0.531771 0.0544707 0.030509 0.531824 0.0846596 0.0263109 0.529808 0.104969 0.0299129 0.532641 0.133333 0.0273255 0.534496 0.154147 0.0309527 0.531789 0.178603 0.0279013 0.525045 0.204905 0.027003 0.529075 0.23478 0.0273798 0.533081 0.25419 0.0323279 0.530012 0.283213 0.0316573 0.526852 0.30644 0.0278303 0.531987 0.334315 0.0330084 0.527441 0.350097 0.0294242 0.525747 0.376135 0.0343082 0.527871 0.402021 0.033352 0.534508 0.429027 0.0277519 0.533886 0.455815 0.0292309 0.52632 0.480762 0.0290435 0.550646 0.00926547 0.030396 0.557232 0.0284711 0.0269724 0.556814 0.0500183 0.032333 0.555531 0.0839824 0.0333335 0.559329 0.103324 0.0278764 0.55879 0.128997 0.0274803 0.55792 0.150367 0.0282031 0.559653 0.183943 0.0252997 0.559386 0.206603 0.03297 0.558019 0.22783 0.0262685 0.550658 0.251911 0.0258271 0.557543 0.281175 0.0317187 0.558103 0.303259 0.0251352 0.557449 0.327134 0.0332443 0.556829 0.353444 0.028745 0.553123 0.375721 0.0282151 0.55632 0.401297 0.0346461 0.553034 0.431183 0.0305868 0.557506 0.456128 0.0262033 0.552965 0.477002 0.0274688 0.579816 0.00406541 0.0250071 0.579142 0.0278231 0.0283404 0.581837 0.0575837 0.0261252 0.578427 0.0807257 0.0256079 0.578699 0.107006 0.0303127 0.575229 0.127586 0.0329787 0.583513 0.152343 0.0253956 0.578686 0.183649 0.034039 0.577167 0.20193 0.0286062 0.580841 0.232601 0.0274431 0.581677 0.253637 0.0333755 0.581988 0.27702 0.0322639 0.578979 0.306159 0.0266207 0.575384 0.330246 0.0281822 0.575562 0.35964 0.0334363 0.580289 0.379356 0.032567 0.58147 0.404532 0.025178 0.580057 0.42911 0.0261605 0.581988 0.459312 0.0279243 0.575774 0.479531 0.0255203 0.601388 0.00945571 0.0349532 0.600448 0.0332906 0.0349763 0.602793 0.0536337 0.0255869 0.603939 0.0790616 0.0340477 0.603132 0.104595 0.0304607 0.608295 0.1345 0.0339827 0.607907 0.159431 0.0288531 0.605289 0.184668 0.0261821 0.601009 0.206986 0.033881 0.606047 0.234284 0.0276316 0.600971 0.256975 0.0261454 0.603395 0.276682 0.0328489 0.604292 0.30677 0.0268497 0.603973 0.33359 0.0327073 0.601633 0.353509 0.0317867 0.609012 0.378278 0.0270545 0.602426 0.403585 0.0264048 0.600151 0.426746 0.0323574 0.60464 0.451768 0.0311798 0.604987 0.483804 0.0271555 0.628499 6.75172e-05 0.033993 0.631751 0.0276573 0.0331012 0.625157 0.0520115 0.0303901 0.632501 0.0802092 0.0266548 0.630887 0.100788 0.0335497 0.627222 0.12916 0.0276578 0.630899 0.154266 0.0286166 0.627214 0.183659 0.0308078 0.629907 0.205133 0.0251768 0.628631 0.231232 0.0304175 0.625252 0.253096 0.0263451 0.626526 0.278296 0.0306421 0.630702 0.304661 0.0255711 0.629165 0.330184 0.0327212 0.626002 0.353751 0.026238 0.632587 0.376742 0.0345634 0.632979 0.404936 0.0300224 0.630284 0.431683 0.0344377 0.628137 0.456756 0.0335191 0.626929 0.482543 0.0281589 0.658376 0.00290625 0.0251687 0.656092 0.0339405 0.0253535 0.656761 0.0587124 0.0261911 0.652524 0.0753927 0.0330636 0.653144 0.108882 0.0276238 0.653835 0.129775 0.0319424 0.654985 0.153111 0.0268111 0.654425 0.17672 0.0346232 0.65163 0.20593 0.0336754 0.656285 0.234329 0.0305502 0.652981 0.254363 0.0286129 0.65147 0.279033 0.0267259 0.659294 0.304017 0.0262915 0.655824 0.328657 0.0289402 0.656652 0.356089 0.0318763 0.655257 0.379422 0.0265468 0.655108 0.405054 0.0311991 0.65581 0.433348 0.0325675 0.659801 0.456112 0.0269022 0.658942 0.479596 0.0254099 0.67528 0.00281516 0.0265507 0.681198 0.0340141 0.0265956 0.681618 0.0529259 0.0285783 0.683515 0.0799348 0.027673 0.679098 0.106718 0.0251417 0.683981 0.125356 0.0273098 0.679929 0.153909 0.0330404 0.677971 0.177909 0.033019 0.679918 0.205056 0.0329552 0.681061 0.229272 0.0285929 0.67524 0.253796 0.0286075 0.683021 0.275998 0.0291352 0.679112 0.304399 0.0284056 0.681325 0.327136 0.0279907 0.675303 0.352337 0.033171 0.675303 0.376537 0.0292025 0.678144 0.401509 0.0276336 0.678407 0.426878 0.0286637 0.675872 0.454443 0.0262275 0.675917 0.480689 0.0294357 0.706587 0.00998781 0.0289183 0.706815 0.0324173 0.0253566 0.700675 0.0509929 0.0313873 0.707843 0.0826718 0.0260109 0.700202 0.109529 0.0342749 0.702325 0.129736 0.0251752 0.704422 0.157942 0.0305785 0.706586 0.184285 0.0328255 0.704345 0.203651 0.0258676 0.700942 0.229328 0.0342809 0.708049 0.259037 0.0333667 0.701147 0.276272 0.0337365 0.700742 0.305255 0.0254879 0.702027 0.32586 0.0250412 0.708233 0.359652 0.0283613 0.703162 0.383991 0.0271368 0.709754 0.405569 0.0252363 0.705742 0.42994 0.0312375 0.705742 0.456838 0.031101 0.70421 0.483649 0.0312329 0.730805 0.00386176 0.0291375 0.727692 0.0342479 0.0317634 0.73305 0.052051 0.0270681 0.7297 0.0798927 0.0342781 0.733779 0.104614 0.0278586 0.732014 0.132729 0.0320599 0.729138 0.156333 0.0255351 0.730513 0.17513 0.0317616 0.732596 0.208278 0.0303618 0.725361 0.230857 0.032151 0.728065 0.253462 0.0312001 0.730118 0.279413 0.0284491 0.725285 0.307773 0.0272962 0.727924 0.331347 0.0264686 0.731924 0.350176 0.025418 0.72813 0.377342 0.0258513 0.734856 0.40792 0.0255156 0.733111 0.430337 0.0331851 0.73374 0.456679 0.0271233 0.725233 0.484922 0.0536629 0.00209362 0.000162526 0.0573373 0.00666976 0.0266572 0.0501194 0.00178349 0.057782 0.0531002 0.00675427 0.0759567 0.0527839 0.00547583 0.102329 0.057267 0.00540187 0.131969 0.0596112 0.00024316 0.150186 0.0513676 0.00655615 0.179905 0.0583855 0.00331954 0.208599 0.0548736 0.00421525 0.233401 0.0513783 0.0030873 0.254229 0.0563852 0.00672714 0.283511 0.0571357 0.00779278 0.3001 0.0514848 0.00180489 0.326886 0.059138 0.00589749 0.356047 0.0572579 0.00517248 0.378364 0.0510119 0.00653997 0.402108 0.0532912 0.00596943 0.42832 0.0586731 0.00621412 0.455383 0.0598438 0.00959979 0.47911 0.0563019 0.0326887 0.0012282 0.0564132 0.0303891 0.0283181 0.0556085 0.0250635 0.0546036 0.0557963 0.0257153 0.0797529 0.0554906 0.0282603 0.100246 0.0543365 0.0339673 0.132841 0.0551011 0.028565 0.159812 0.0592492 0.0313446 0.18245 0.0591253 0.0302884 0.200847 0.0529175 0.0347391 0.22713 0.0511839 0.0333145 0.256873 0.0586724 0.0344631 0.277888 0.0516949 0.0270168 0.304908 0.0526758 0.0333924 0.330755 0.0599887 0.0262812 0.3549 0.0589684 0.0281471 0.38369 0.0546257 0.0276298 0.404453 0.0513147 0.0319973 0.431429 0.0564403 0.0296525 0.450976 0.0541825 0.0316941 0.476786 0.0501071 0.0502624 0.0031425 0.0570667 0.0542953 0.0294941 0.0523073 0.0530156 0.0510653 0.0542681 0.0556909 0.083175 0.0533886 0.0522077 0.108955 0.055469 0.0574151 0.131444 0.0523288 0.0508341 0.159049 0.0506759 0.0517783 0.179378 0.0550433 0.0589256 0.207692 0.0551915 0.0510498 0.232785 0.0582371 0.0529036 0.254271 0.0585464 0.0560207 0.281004 0.0524285 0.0557539 0.30035 0.0584352 0.0586817 0.329249 0.0501853 0.0516343 0.355922 0.0569197 0.0500004 0.376458 0.0549878 0.0522139 0.408198 0.0557779 0.0534631 0.432544 0.0547561 0.0541054 0.45286 0.0594999 0.0564338 0.475783 0.0572772 0.0830191 0.00746768 0.0559734 0.0757707 0.0272191 0.0553996 0.0820766 0.0503194 0.0544898 0.0778114 0.0830824 0.0576445 0.079853 0.109548 0.0566399 0.079525 0.128892 0.057895 0.0769591 0.150386 0.053162 0.0823941 0.184753 0.0576768 0.0766572 0.202061 0.059739 0.0792013 0.229334 0.0519649 0.0782887 0.253561 0.0589424 0.0781023 0.277914 0.0560283 0.0795091 0.304497 0.0557206 0.0805287 0.329134 0.0532559 0.0768877 0.351387 0.0556239 0.0812044 0.383722 0.0505712 0.0765909 0.408524 0.0558658 0.0764579 0.425638 0.0539293 0.0827175 0.459602 0.0591124 0.0841695 0.477754 0.0503315 0.108636 0.00554691 0.054102 0.109738 0.0294664 0.0575353 0.101742 0.0519905 0.0590497 0.100091 0.0849407 0.0560904 0.100447 0.101748 0.0570146 0.102845 0.132283 0.0557542 0.101947 0.153802 0.0574064 0.100312 0.18466 0.0583939 0.10242 0.206142 0.0552696 0.105902 0.22698 0.0531196 0.106244 0.251952 0.0513474 0.101473 0.284201 0.0589148 0.100803 0.308986 0.0567503 0.109272 0.327642 0.0567607 0.10631 0.356104 0.058424 0.108456 0.376637 0.0553894 0.107866 0.403452 0.0536809 0.107732 0.434338 0.0533433 0.107605 0.459006 0.0575339 0.104477 0.484982 0.0587783 0.130077 0.00120684 0.0543395 0.130382 0.0289519 0.0552061 0.129865 0.0571954 0.058639 0.128841 0.0849647 0.0508124 0.128372 0.104449 0.0578818 0.134961 0.125185 0.0536999 0.126255 0.150511 0.0554548 0.125257 0.177507 0.0599401 0.134905 0.201176 0.0557271 0.132008 0.233914 0.05508 0.132143 0.253885 0.056213 0.133632 0.28167 0.0580042 0.133386 0.303588 0.0590503 0.125785 0.325033 0.0541928 0.1339 0.351033 0.0590752 0.129345 0.384019 0.0502003 0.133835 0.409443 0.0525513 0.132265 0.427515 0.0534477 0.129315 0.452239 0.0572858 0.125356 0.479586 0.0583087 0.158924 0.0042207 0.0549212 0.154379 0.0299185 0.0500906 0.152866 0.0579583 0.0590515 0.15212 0.0784395 0.0554788 0.155045 0.105575 0.0556006 0.15551 0.126158 0.0580912 0.152133 0.154001 0.0533024 0.157231 0.184783 0.0584756 0.156834 0.206818 0.0515517 0.155734 0.233681 0.0526192 0.155837 0.250307 0.0527266 0.158526 0.278932 0.0561024 0.154647 0.300311 0.0520943 0.153101 0.328928 0.0543099 0.151145 0.353534 0.0530862 0.159888 0.376967 0.0561529 0.158766 0.4053 0.0513391 0.153305 0.434158 0.0575803 0.158719 0.458695 0.0540592 0.155431 0.475636 0.055758 0.175905 0.00479594 0.057581 0.184199 0.0295031 0.0560419 0.181229 0.0588956 0.0534554 0.183535 0.0776376 0.0542185 0.184788 0.108094 0.0550822 0.177926 0.129001 0.0585248 0.181379 0.156885 0.0583058 0.179402 0.183026 0.0535743 0.175403 0.205799 0.0531078 0.183921 0.231841 0.0599526 0.177536 0.251695 0.0532052 0.176406 0.278499 0.050295 0.176527 0.30311 0.0587046 0.184048 0.333155 0.0519436 0.181512 0.357501 0.0565163 0.179328 0.377006 0.0539815 0.178873 0.40069 0.0566002 0.17984 0.428321 0.0518123 0.178338 0.45618 0.0572415 0.184268 0.483693 0.0530759 0.205573 0.00555172 0.051515 0.20668 0.0323039 0.0549529 0.200785 0.0563377 0.0510877 0.202071 0.0809032 0.0578775 0.20695 0.10303 0.054123 0.201269 0.130524 0.0523448 0.207212 0.158402 0.0505526 0.201915 0.178979 0.0520623 0.209713 0.204408 0.0525764 0.209424 0.229825 0.0511571 0.209762 0.251239 0.0557382 0.200369 0.282036 0.0521922 0.209671 0.308907 0.0518577 0.208833 0.330266 0.0547774 0.207253 0.351442 0.0555414 0.205918 0.378959 0.0519672 0.207273 0.407588 0.0548953 0.205667 0.428924 0.0577664 0.20393 0.452714 0.0513211 0.20034 0.481504 0.0531928 0.232972 0.00559342 0.0532365 0.229636 0.0318515 0.0585614 0.228835 0.0525158 0.0510189 0.233394 0.0798699 0.0573893 0.233563 0.106941 0.0537075 0.23139 0.126713 0.0566239 0.227327 0.154403 0.0528922 0.231314 0.184186 0.0518159 0.230883 0.207755 0.0577128 0.225793 0.225848 0.0531532 0.229576 0.252248 0.0568705 0.234269 0.280299 0.0573942 0.23301 0.302909 0.0551532 0.229099 0.333031 0.0535662 0.233001 0.352059 0.0533755 0.233287 0.383805 0.0569343 0.228395 0.402263 0.058127 0.226254 0.429905 0.0523579 0.225835 0.455622 0.0550571 0.229431 0.475496 0.0533564 0.251141 0.00423439 0.0550769 0.253143 0.0337497 0.0544958 0.255564 0.050043 0.055042 0.252 0.0791389 0.0547844 0.252306 0.100683 0.0525427 0.253694 0.13333 0.0535396 0.259137 0.157968 0.0552022 0.254206 0.18266 0.0568304 0.252052 0.200983 0.0545756 0.257138 0.226236 0.0526867 0.250707 0.254252 0.0518219 0.258577 0.282176 0.059781 0.250534 0.308711 0.0537825 0.259785 0.329253 0.0569826 0.25841 0.357931 0.0515409 0.255873 0.384769 0.0573092 0.254462 0.409218 0.059238 0.259308 0.433447 0.0501752 0.254485 0.450091 0.053216 0.254787 0.477139 0.0536357 0.279545 0.00424031 0.055681 0.278358 0.0312714 0.0588684 0.284892 0.0525961 0.0574683 0.28042 0.0790884 0.0525143 0.282782 0.102886 0.0527804 0.281409 0.132931 0.0566027 0.281601 0.153444 0.0542524 0.276262 0.180881 0.0560712 0.284632 0.200291 0.0593055 0.276923 0.230452 0.0566889 0.280942 0.257919 0.0543285 0.277328 0.283585 0.056333 0.278962 0.302893 0.0529785 0.281376 0.327728 0.0515866 0.276784 0.351602 0.0555547 0.284514 0.380153 0.0514907 0.283801 0.405833 0.0550559 0.277547 0.433509 0.0584693 0.281792 0.450187 0.0524184 0.277057 0.479899 0.0516727 0.301115 0.00497714 0.058434 0.304024 0.0277769 0.051585 0.301642 0.0598688 0.0531438 0.309264 0.0797156 0.0517103 0.302994 0.106475 0.0576631 0.308432 0.133835 0.0569077 0.300575 0.151609 0.0544617 0.303875 0.175489 0.0573548 0.306105 0.206761 0.0587814 0.308039 0.233071 0.0593005 0.301089 0.257943 0.0590909 0.305437 0.27711 0.0553046 0.308266 0.30812 0.050644 0.307454 0.333883 0.056464 0.301623 0.35508 0.055016 0.306929 0.379876 0.0596952 0.300384 0.400378 0.058455 0.306012 0.433294 0.05294 0.303621 0.458285 0.0515686 0.309261 0.475281 0.0592405 0.33438 4.73025e-05 0.054749 0.333641 0.0301281 0.0555409 0.330188 0.0598946 0.0534299 0.32979 0.0807426 0.0506472 0.32645 0.100218 0.0550814 0.327569 0.133143 0.0540969 0.328328 0.15645 0.0562188 0.32511 0.18295 0.0582909 0.329058 0.209382 0.0513574 0.331839 0.23052 0.0571994 0.328303 0.251545 0.0530533 0.33335 0.28485 0.0552853 0.331273 0.305715 0.0579459 0.333558 0.327961 0.0566694 0.328544 0.350852 0.0500601 0.329178 0.384873 0.052219 0.332838 0.406611 0.0566247 0.334929 0.428971 0.0503371 0.331511 0.454798 0.0554295 0.333644 0.476394 0.0520068 0.352964 0.00663664 0.0598078 0.356887 0.0305996 0.0550555 0.352549 0.0565745 0.054405 0.352671 0.0797322 0.059917 0.356131 0.101709 0.0554815 0.356608 0.131966 0.0589311 0.359631 0.15001 0.0551619 0.3552 0.181551 0.0591103 0.352849 0.203085 0.0565949 0.352943 0.227763 0.0578856 0.355616 0.254683 0.0544341 0.356004 0.28249 0.0535554 0.357673 0.302526 0.0563082 0.356209 0.328872 0.0598102 0.35663 0.358071 0.0590466 0.351599 0.382484 0.0513814 0.356901 0.404328 0.0542065 0.354476 0.43224 0.0537558 0.350088 0.455047 0.0501981 0.351486 0.480541 0.0543696 0.377083 0.00132281 0.05728 0.380093 0.029984 0.0594675 0.384975 0.0595013 0.0519011 0.383295 0.0770658 0.0599736 0.383232 0.109701 0.0597911 0.382588 0.126624 0.0578194 0.380928 0.156871 0.0568734 0.375132 0.17895 0.0549548 0.378703 0.20184 0.053975 0.38195 0.234668 0.0576627 0.378612 0.258025 0.0512952 0.378248 0.281992 0.0582186 0.381037 0.301114 0.0564325 0.376779 0.334193 0.0526754 0.383434 0.357077 0.0510892 0.378621 0.379434 0.0508883 0.379296 0.407891 0.0548849 0.381814 0.426316 0.0599869 0.380902 0.458469 0.054102 0.378642 0.476805 0.0550332 0.405977 0.000186271 0.0551932 0.408102 0.0336362 0.0537552 0.402468 0.0522437 0.0550797 0.404951 0.0806003 0.0571166 0.408514 0.105314 0.0569409 0.400747 0.13104 0.0531731 0.409503 0.153002 0.059438 0.406818 0.184651 0.0563102 0.407583 0.203707 0.0569064 0.400241 0.226305 0.0583718 0.408661 0.255114 0.0512803 0.406099 0.283166 0.0518663 0.408337 0.302155 0.0570884 0.404996 0.333216 0.0557362 0.409227 0.358625 0.0551485 0.405685 0.382316 0.05309 0.400712 0.408972 0.0579962 0.40872 0.427533 0.0587302 0.401573 0.45164 0.0567963 0.402885 0.483627 0.0528361 0.430867 0.0071124 0.0582928 0.434973 0.0331389 0.0525097 0.431438 0.0523716 0.0585215 0.428088 0.0772378 0.0534045 0.425564 0.105616 0.0599262 0.428632 0.127429 0.0525333 0.432806 0.159199 0.0599138 0.4264 0.18295 0.0571158 0.433049 0.203717 0.0591542 0.430604 0.230054 0.0548245 0.43449 0.258949 0.0563735 0.426105 0.282831 0.052468 0.42909 0.302764 0.0506364 0.426051 0.331328 0.0503334 0.433438 0.35096 0.0595079 0.426596 0.383442 0.057659 0.42695 0.407265 0.0555342 0.430526 0.427876 0.0584311 0.429096 0.458461 0.0550539 0.429855 0.475459 0.0533614 0.459978 0.00978716 0.0585267 0.45281 0.025769 0.0564842 0.45504 0.055413 0.0528181 0.452175 0.0769731 0.0551971 0.455259 0.10331 0.0502647 0.458188 0.130806 0.0588211 0.455336 0.159519 0.0572508 0.456275 0.176902 0.0575123 0.459605 0.20553 0.0551782 0.458517 0.23255 0.0504402 0.451802 0.253781 0.0576213 0.456565 0.281146 0.0552349 0.453654 0.300463 0.0531138 0.453207 0.331932 0.0583347 0.454265 0.355317 0.0597561 0.451274 0.37506 0.0511227 0.457541 0.404687 0.0520785 0.452557 0.430984 0.0572329 0.458024 0.451473 0.0513245 0.452619 0.476931 0.0552098 0.47954 0.00640049 0.0577221 0.476296 0.0297218 0.0513694 0.481809 0.0573013 0.0545626 0.478955 0.0830026 0.0502252 0.482336 0.100988 0.0591238 0.482382 0.127001 0.0502182 0.480428 0.152798 0.0519318 0.48376 0.181564 0.0570202 0.480551 0.204299 0.0552037 0.48074 0.225036 0.0531134 0.475728 0.252692 0.0548148 0.478919 0.282256 0.0532717 0.476313 0.305044 0.0586199 0.48266 0.327216 0.0556454 0.478288 0.350968 0.0542095 0.481482 0.384308 0.0549449 0.480946 0.407453 0.0555204 0.477736 0.434987 0.053527 0.483033 0.458559 0.0572216 0.482298 0.48045 0.0560671 0.502165 2.91787e-05 0.0578893 0.507784 0.0264735 0.0572414 0.501489 0.0578746 0.0586799 0.503596 0.0798362 0.0584788 0.50975 0.102511 0.0575934 0.506966 0.129585 0.0517826 0.505241 0.156156 0.0535687 0.508895 0.176116 0.0594545 0.509019 0.200961 0.0564119 0.507863 0.228724 0.0598329 0.507031 0.250287 0.0513174 0.504163 0.284656 0.053795 0.501164 0.306686 0.0574044 0.507456 0.332674 0.0570445 0.502288 0.35502 0.0559271 0.50178 0.384528 0.0554428 0.501528 0.403062 0.0596881 0.500651 0.433353 0.0540472 0.503483 0.450969 0.0580037 0.509908 0.476064 0.0564271 0.530318 0.00134252 0.0500696 0.53223 0.0301342 0.0593373 0.527828 0.0567376 0.0530559 0.526843 0.0780169 0.0524382 0.527372 0.101597 0.0517105 0.528848 0.132312 0.0593378 0.530181 0.154738 0.0599177 0.528857 0.180604 0.0513223 0.525998 0.203672 0.0570352 0.533317 0.225795 0.0592915 0.528957 0.253457 0.059337 0.533109 0.282174 0.0548987 0.52625 0.309722 0.0510642 0.533912 0.327533 0.0599729 0.533795 0.350712 0.0540904 0.525137 0.379998 0.0546745 0.531436 0.409584 0.0531454 0.526486 0.42883 0.057801 0.52714 0.455981 0.052353 0.530163 0.475772 0.0570776 0.552186 0.00214551 0.0522475 0.558898 0.0332161 0.0582048 0.554109 0.0529024 0.0573528 0.554219 0.0768482 0.0548824 0.554622 0.104602 0.0503768 0.557539 0.125754 0.056043 0.554363 0.150832 0.0509319 0.551725 0.177083 0.054553 0.550525 0.200917 0.0538182 0.553893 0.233578 0.0506077 0.553514 0.251908 0.0518329 0.555457 0.28027 0.057605 0.550987 0.305393 0.0555092 0.554147 0.325341 0.052927 0.55912 0.354832 0.0521358 0.559306 0.382567 0.0509648 0.556609 0.405314 0.0584115 0.55338 0.433647 0.0575227 0.555834 0.450731 0.0560293 0.558492 0.482866 0.0522024 0.578533 0.00255105 0.0579225 0.584081 0.0260131 0.0508363 0.575949 0.0596397 0.053254 0.581964 0.0756266 0.0507833 0.584589 0.100664 0.0565675 0.575301 0.128556 0.0516962 0.579632 0.157738 0.057295 0.577026 0.17514 0.0538509 0.578729 0.205478 0.0510581 0.58219 0.232326 0.0515128 0.579719 0.257237 0.0533911 0.577451 0.283311 0.0520356 0.582252 0.301005 0.0566227 0.576704 0.325651 0.0505231 0.579121 0.359416 0.0593086 0.577574 0.381586 0.0573112 0.580631 0.402599 0.0568785 0.579736 0.430262 0.0521084 0.576834 0.450618 0.0586993 0.581467 0.477417 0.055694 0.606145 0.0076783 0.056683 0.605696 0.0334818 0.0568285 0.607242 0.0549336 0.0517916 0.607105 0.0842789 0.0547052 0.600764 0.104722 0.0568852 0.600564 0.130016 0.0567894 0.609899 0.151867 0.0557085 0.605428 0.183522 0.0509042 0.600545 0.200433 0.0518924 0.603904 0.232486 0.0558219 0.600301 0.253561 0.0593518 0.601979 0.284768 0.0507216 0.607356 0.306117 0.0559207 0.609221 0.329912 0.0518269 0.600206 0.352453 0.0585421 0.608937 0.376917 0.0573882 0.609096 0.409179 0.0508446 0.602844 0.43379 0.0507545 0.606844 0.454693 0.0518859 0.60623 0.483558 0.0544223 0.629449 0.00685159 0.0560859 0.631394 0.0259401 0.0518456 0.628675 0.0578507 0.0580836 0.626201 0.078366 0.0582026 0.629108 0.103359 0.05906 0.631489 0.125177 0.0568888 0.62522 0.158666 0.050472 0.630154 0.178325 0.0572614 0.629312 0.201071 0.0576427 0.627014 0.228209 0.0518231 0.630564 0.250647 0.0543732 0.625814 0.284938 0.0575667 0.625628 0.301874 0.0549575 0.630854 0.32677 0.0526558 0.634382 0.354619 0.0501114 0.630159 0.377341 0.0520544 0.625463 0.40921 0.0517519 0.626033 0.428377 0.0535482 0.627422 0.45293 0.0576603 0.625753 0.481964 0.059695 0.650448 0.00968417 0.0546994 0.659716 0.033442 0.0583325 0.656149 0.0594593 0.0540507 0.653111 0.0833412 0.0574523 0.653306 0.107681 0.0563122 0.656237 0.130772 0.0565398 0.651288 0.150181 0.0586298 0.659961 0.181408 0.055477 0.650222 0.207573 0.0566722 0.653491 0.226398 0.0562142 0.65413 0.259448 0.0537206 0.652807 0.275279 0.056973 0.651184 0.307251 0.0510189 0.651464 0.334561 0.05192 0.651209 0.354923 0.0543432 0.659724 0.379583 0.054443 0.652784 0.409084 0.0541876 0.650925 0.432657 0.0520851 0.650043 0.453091 0.0535711 0.657837 0.481014 0.0508363 0.676234 0.00125447 0.0510527 0.682345 0.034864 0.0534043 0.675536 0.0591346 0.0533977 0.676946 0.0832724 0.0597376 0.681625 0.103411 0.0562493 0.68058 0.128492 0.0558102 0.68204 0.150845 0.0512673 0.678874 0.183094 0.0527233 0.677063 0.206812 0.0505369 0.680086 0.227215 0.0524355 0.675388 0.259906 0.0517099 0.677609 0.277838 0.0537941 0.675311 0.304922 0.0509266 0.681095 0.331057 0.0590743 0.682014 0.353722 0.0508248 0.679443 0.382272 0.0521453 0.683749 0.406555 0.0570679 0.681888 0.432198 0.0545371 0.679966 0.452895 0.0591652 0.677007 0.483892 0.0520592 0.706348 0.00911723 0.054012 0.700874 0.0316131 0.0506891 0.704677 0.0590366 0.0593257 0.702376 0.0793445 0.0563606 0.700184 0.104768 0.0572277 0.704411 0.125458 0.0511955 0.703183 0.152997 0.0571516 0.703882 0.180505 0.0514665 0.702695 0.201125 0.0572117 0.704262 0.233828 0.0544667 0.700375 0.257521 0.0568449 0.704513 0.275314 0.0537157 0.709122 0.300516 0.0500256 0.70914 0.332585 0.056008 0.703255 0.351122 0.0577087 0.708281 0.382807 0.0593865 0.709742 0.406311 0.055128 0.707304 0.431658 0.0514287 0.701344 0.451556 0.0541518 0.709801 0.48266 0.052916 0.731675 0.00115598 0.0506997 0.72568 0.0286403 0.0554418 0.727529 0.0501578 0.0566732 0.732857 0.0800805 0.0575047 0.731118 0.103264 0.0587385 0.726951 0.133297 0.0570703 0.727132 0.159604 0.0536212 0.725611 0.176795 0.0500432 0.730253 0.202656 0.051219 0.725845 0.228225 0.0533497 0.733934 0.252106 0.0557896 0.729393 0.27724 0.0534859 0.73321 0.30728 0.0549644 0.73301 0.330555 0.0555477 0.729533 0.356878 0.055591 0.729087 0.376454 0.0571412 0.732161 0.408332 0.0561852 0.727941 0.434171 0.0543734 0.732888 0.451895 0.0522816 0.726644 0.477689 0.0763787 0.0056706 0.00751359 0.0822398 0.0072674 0.0268798 0.0809811 0.00529182 0.0569275 0.0801525 0.00440808 0.0849237 0.077879 0.000232847 0.10502 0.0786219 0.00687263 0.130946 0.0795407 0.00950724 0.151669 0.0838411 0.0019784 0.179197 0.0844992 0.00860505 0.203193 0.0757551 0.00902798 0.232011 0.0765872 0.00630149 0.253206 0.0780378 0.00814261 0.280579 0.0821797 0.00693065 0.305281 0.0843674 0.00159439 0.332873 0.0827231 0.00529911 0.352271 0.0773921 0.00801674 0.376467 0.0769997 0.0013926 0.40374 0.0832451 0.00579936 0.426969 0.0750594 0.00684101 0.453667 0.083889 0.00340074 0.475193 0.0827639 0.0344139 0.00598788 0.076455 0.0320416 0.0272056 0.0791678 0.0263651 0.0562584 0.0813268 0.0312324 0.0845324 0.0824905 0.0283707 0.104223 0.0828255 0.03207 0.129718 0.0785036 0.0257016 0.155201 0.080751 0.0341127 0.181953 0.0823139 0.0250039 0.207632 0.0819657 0.0329427 0.227948 0.0770585 0.0314015 0.259123 0.0831829 0.0325393 0.276041 0.0799271 0.0327786 0.301394 0.078456 0.0279791 0.329453 0.083323 0.0277801 0.358109 0.0761219 0.0286594 0.381999 0.0803993 0.0293926 0.404781 0.0833817 0.0268982 0.428143 0.079979 0.0324708 0.45238 0.0779485 0.0250742 0.48286 0.0785062 0.05748 0.00652511 0.0761159 0.0582554 0.0259705 0.0847078 0.0598798 0.0539077 0.0773301 0.0521133 0.0786051 0.0844349 0.0537743 0.106495 0.0844455 0.0537624 0.126073 0.0822659 0.0546617 0.153873 0.0763269 0.0517844 0.178196 0.0845393 0.05904 0.209447 0.0847273 0.0500491 0.230038 0.0768423 0.0590654 0.25256 0.0773724 0.0585899 0.281892 0.0787543 0.0518546 0.306009 0.0769482 0.0577121 0.334499 0.080539 0.0573219 0.357026 0.0773848 0.0550046 0.379658 0.0841747 0.0557264 0.403549 0.0802442 0.0512213 0.431112 0.0785875 0.0539577 0.457664 0.0816569 0.0546314 0.484179 0.0803859 0.078408 0.00167617 0.0797193 0.08242 0.0317157 0.0831785 0.0845621 0.0518513 0.0760313 0.0769807 0.0763891 0.0764417 0.0799368 0.104059 0.0841482 0.0782842 0.130044 0.0752223 0.0798342 0.150326 0.0763371 0.0811567 0.176681 0.0843065 0.0776994 0.206092 0.079388 0.0784694 0.228703 0.0801966 0.0761731 0.256235 0.0777383 0.0842488 0.284445 0.0763664 0.0814216 0.301628 0.0838531 0.0754955 0.326734 0.0798474 0.0773162 0.354267 0.0751069 0.0753109 0.382349 0.0798252 0.077679 0.407381 0.0792073 0.0805585 0.428201 0.0838109 0.0769844 0.456515 0.0758133 0.084922 0.484188 0.0828856 0.104481 0.000211544 0.0822149 0.108617 0.0258737 0.0832605 0.106777 0.0562536 0.0834425 0.109533 0.0771678 0.0833146 0.109381 0.105885 0.0774051 0.105133 0.128935 0.0750753 0.103016 0.15144 0.080373 0.106268 0.181399 0.0809397 0.100054 0.202316 0.0764813 0.108536 0.228079 0.0785038 0.106399 0.25716 0.0773368 0.103332 0.283158 0.0807583 0.10042 0.300979 0.0801239 0.101877 0.331592 0.0841601 0.106531 0.35346 0.0829431 0.100477 0.380274 0.0814719 0.107313 0.405992 0.0835861 0.106316 0.428821 0.0758632 0.106028 0.459883 0.0775647 0.108635 0.480719 0.0765226 0.126889 0.00635078 0.0760559 0.129947 0.0324666 0.0812998 0.134304 0.0557532 0.0763199 0.134227 0.0812722 0.0770956 0.128966 0.106438 0.0787019 0.132332 0.133549 0.0758701 0.131653 0.150921 0.0804495 0.132095 0.175775 0.0823883 0.129271 0.207921 0.0803579 0.132025 0.225935 0.0820333 0.134032 0.252636 0.075983 0.132537 0.280122 0.0849115 0.130067 0.300763 0.0774154 0.127861 0.334399 0.0818078 0.126431 0.352718 0.0819683 0.127511 0.378444 0.0831925 0.130305 0.406618 0.0843442 0.131055 0.428078 0.0841663 0.127922 0.45483 0.0769322 0.134501 0.475985 0.0813631 0.156597 0.00729896 0.0787707 0.152972 0.0317702 0.0793683 0.15872 0.0538292 0.0838453 0.153419 0.0846452 0.0824313 0.155897 0.108387 0.084813 0.15614 0.130935 0.0848648 0.159966 0.159656 0.0783524 0.157729 0.176968 0.077118 0.157514 0.200915 0.0767509 0.159671 0.23287 0.0794378 0.155565 0.25365 0.0780194 0.155028 0.280201 0.0828655 0.154363 0.306249 0.0826489 0.155207 0.329872 0.0844703 0.15438 0.35947 0.0779675 0.159811 0.379754 0.0827416 0.15736 0.403029 0.0815261 0.159065 0.429141 0.0805023 0.1565 0.457768 0.0795611 0.150971 0.478547 0.0835468 0.179369 0.00376487 0.0845762 0.178044 0.0256031 0.0789816 0.18206 0.0595899 0.0783488 0.183743 0.0771916 0.0784045 0.175797 0.109411 0.0789951 0.175828 0.12516 0.0798743 0.177376 0.159046 0.0777271 0.18384 0.178195 0.0757481 0.177936 0.206065 0.0846001 0.183832 0.227273 0.0757014 0.179741 0.259591 0.0787797 0.180075 0.283128 0.0830206 0.17569 0.300516 0.0777817 0.182427 0.333278 0.0778301 0.177208 0.358261 0.0804024 0.179127 0.384527 0.0760306 0.181875 0.40353 0.0827809 0.177632 0.433935 0.0762804 0.177787 0.459164 0.0785537 0.1766 0.477722 0.0800583 0.207565 0.00784884 0.0769175 0.204446 0.030833 0.0758318 0.207802 0.0565371 0.0786688 0.205078 0.0823826 0.0751242 0.20889 0.104361 0.0785213 0.20024 0.128523 0.0783161 0.207257 0.151737 0.0807968 0.206549 0.178796 0.0788031 0.205333 0.205888 0.0849566 0.206921 0.230313 0.0792698 0.206024 0.259892 0.0756756 0.205987 0.281227 0.0764193 0.208441 0.305624 0.0835325 0.205461 0.331179 0.0807742 0.205015 0.355739 0.0800538 0.208701 0.375591 0.0810673 0.201304 0.402232 0.0822111 0.204833 0.427305 0.0766236 0.207244 0.45402 0.0773533 0.208735 0.483455 0.0776887 0.232227 0.00783787 0.0760546 0.233242 0.0274842 0.0797999 0.232219 0.0547646 0.0819679 0.232366 0.0805334 0.0842534 0.227423 0.109012 0.0821824 0.228858 0.126447 0.0805752 0.225476 0.154893 0.0818207 0.226745 0.17857 0.0841538 0.229858 0.205911 0.0827634 0.226087 0.231743 0.0799724 0.226554 0.253982 0.0794073 0.226985 0.282242 0.0822714 0.234675 0.306177 0.0760868 0.230099 0.331979 0.0824426 0.231255 0.357906 0.0795769 0.227204 0.381618 0.080204 0.231953 0.409107 0.0780872 0.234947 0.426042 0.0817298 0.227001 0.450844 0.0763557 0.225031 0.479164 0.0760951 0.258403 0.00195582 0.0756312 0.25984 0.0267092 0.0793185 0.257161 0.0551812 0.0777543 0.251133 0.0833265 0.080952 0.255468 0.104802 0.0823837 0.259144 0.132298 0.0785534 0.251829 0.153627 0.0787838 0.258048 0.177725 0.075712 0.254154 0.207762 0.0838951 0.252349 0.231482 0.0835032 0.253318 0.257126 0.0788267 0.25193 0.281923 0.0833746 0.259592 0.30508 0.0805942 0.253013 0.326923 0.0775477 0.25581 0.351449 0.080557 0.25899 0.381884 0.0848808 0.251345 0.403897 0.0823059 0.255474 0.426339 0.0762136 0.255914 0.4506 0.0772224 0.251145 0.482522 0.0800369 0.280017 0.00162884 0.0815964 0.284713 0.026136 0.0842914 0.276438 0.0542138 0.0822095 0.284544 0.0823824 0.0794538 0.280796 0.10872 0.0832707 0.275124 0.134679 0.0821312 0.281075 0.151933 0.0762868 0.280631 0.179392 0.0763419 0.284782 0.203099 0.0755169 0.280135 0.234224 0.0772554 0.281103 0.250455 0.081129 0.278823 0.28384 0.0790587 0.276725 0.307416 0.0830353 0.27582 0.332732 0.0781182 0.284062 0.35865 0.0829724 0.277751 0.379208 0.0848707 0.281229 0.409858 0.0817435 0.281993 0.427324 0.0786979 0.282821 0.455218 0.0833449 0.279705 0.476148 0.080651 0.309412 0.00720362 0.0777888 0.305221 0.0286476 0.0783867 0.304873 0.0590111 0.0785001 0.300062 0.0796699 0.0776943 0.300886 0.104134 0.0842937 0.30103 0.131464 0.0777432 0.301198 0.159019 0.079702 0.301181 0.183307 0.080858 0.301204 0.203647 0.0779165 0.305999 0.228364 0.0795491 0.305865 0.253488 0.0800451 0.307821 0.277563 0.0795415 0.307304 0.308729 0.0835495 0.302798 0.325728 0.0773395 0.307797 0.352463 0.082727 0.309332 0.378077 0.0821331 0.300968 0.407816 0.0806282 0.308553 0.429295 0.0823061 0.300005 0.456917 0.0812429 0.301769 0.483456 0.0813928 0.326035 0.00487666 0.0841586 0.334702 0.0294632 0.079962 0.326047 0.0593714 0.0849576 0.331029 0.0843472 0.0755173 0.330476 0.106251 0.0799454 0.332846 0.127637 0.0820479 0.32976 0.154446 0.0779942 0.329952 0.176836 0.0754526 0.325999 0.209399 0.0781309 0.333901 0.226446 0.0772923 0.325199 0.254204 0.0849043 0.333067 0.281227 0.0802822 0.330515 0.305133 0.0752311 0.327198 0.33079 0.0783496 0.326494 0.35839 0.0806651 0.330805 0.37545 0.0785107 0.332549 0.403089 0.0798274 0.332251 0.428847 0.0766502 0.330668 0.457176 0.0831534 0.330293 0.483311 0.0778796 0.359731 0.00665728 0.0750793 0.351005 0.0330753 0.0832316 0.353538 0.0568756 0.0843365 0.355434 0.0761099 0.0814617 0.354483 0.106191 0.0756376 0.359762 0.129713 0.081694 0.359355 0.152806 0.0783948 0.354306 0.180492 0.084476 0.355451 0.209412 0.0824533 0.357272 0.230492 0.08014 0.352812 0.258529 0.0752513 0.359858 0.281062 0.0781849 0.35015 0.303014 0.0756872 0.353017 0.334486 0.0768263 0.358238 0.354612 0.0813713 0.359492 0.378049 0.0828768 0.357787 0.405551 0.0794728 0.354379 0.428785 0.0798654 0.350062 0.450557 0.0840376 0.35304 0.484386 0.0771191 0.376653 0.00601157 0.0778942 0.384646 0.0298247 0.0838551 0.382661 0.0503842 0.083896 0.375577 0.0835344 0.0808702 0.376421 0.105718 0.0761963 0.384791 0.128567 0.0760778 0.377373 0.150391 0.0846579 0.378767 0.176614 0.0836776 0.380912 0.200209 0.076106 0.384307 0.231675 0.0757587 0.377326 0.258811 0.0801725 0.375443 0.281203 0.0789276 0.383458 0.308055 0.0771293 0.381312 0.331634 0.0817927 0.383639 0.353475 0.0823386 0.37887 0.382975 0.0811526 0.377067 0.401549 0.083908 0.375659 0.43415 0.0758892 0.382978 0.459332 0.0786785 0.378717 0.477401 0.0757923 0.400654 0.000156507 0.0820137 0.404161 0.0339508 0.0789201 0.409195 0.0520065 0.0839801 0.406868 0.0812997 0.081947 0.40136 0.107621 0.0839805 0.407504 0.126357 0.0816223 0.405268 0.152815 0.0848357 0.405622 0.181435 0.0757721 0.405199 0.202578 0.0837101 0.404422 0.233056 0.0760588 0.409677 0.251215 0.0807275 0.404948 0.279697 0.0798485 0.403199 0.306318 0.0796115 0.400741 0.325767 0.0793242 0.409103 0.351117 0.0775896 0.401689 0.375966 0.0765226 0.400055 0.409444 0.0756842 0.406446 0.430858 0.0849085 0.401578 0.451353 0.0845039 0.408146 0.481618 0.0776257 0.434669 0.00724701 0.0801399 0.430808 0.0341945 0.082554 0.427173 0.0586914 0.0768602 0.427277 0.0789816 0.0807658 0.432581 0.105775 0.0847439 0.433466 0.126928 0.0830637 0.427729 0.154765 0.0783606 0.427795 0.176869 0.082477 0.430179 0.202143 0.0757049 0.428113 0.225792 0.0776554 0.425057 0.259251 0.0836006 0.426379 0.275796 0.0797333 0.428843 0.302508 0.0812425 0.427058 0.332505 0.0805307 0.425171 0.358303 0.0844981 0.431652 0.381538 0.0848045 0.42837 0.404219 0.0787203 0.431408 0.42579 0.0803185 0.432545 0.454958 0.0799132 0.43186 0.484373 0.0801585 0.455672 0.00859827 0.0789782 0.457151 0.0314341 0.0790808 0.455556 0.0519907 0.0837383 0.455674 0.0775835 0.0834091 0.459709 0.102174 0.0799686 0.451225 0.133949 0.0833002 0.451421 0.154837 0.0833237 0.459199 0.180581 0.0803613 0.458042 0.205347 0.0804621 0.455036 0.23123 0.0775046 0.459305 0.255067 0.0761006 0.452136 0.284141 0.0825203 0.455513 0.302638 0.0761301 0.452332 0.32787 0.0792929 0.454032 0.352968 0.0769001 0.457882 0.381709 0.0843785 0.450852 0.400886 0.0801157 0.452278 0.425362 0.0819764 0.454311 0.45056 0.0839405 0.455731 0.477263 0.083075 0.482321 0.005004 0.0829097 0.480712 0.0284408 0.0839168 0.479486 0.055576 0.075431 0.483833 0.0767165 0.0761864 0.481643 0.102845 0.07828 0.483533 0.12669 0.079068 0.477937 0.159169 0.0768532 0.483368 0.182963 0.0823472 0.479701 0.205006 0.0837213 0.481769 0.232731 0.0819842 0.475267 0.2594 0.0773386 0.477771 0.280343 0.0788487 0.484129 0.304458 0.082676 0.481121 0.331749 0.0794667 0.477474 0.352589 0.0812254 0.484734 0.379991 0.0824123 0.484674 0.407993 0.0781126 0.477397 0.428668 0.0755473 0.476422 0.451651 0.0824035 0.477976 0.47518 0.0758897 0.506724 0.00375867 0.0811575 0.508682 0.0263154 0.0831612 0.5041 0.0554562 0.0769409 0.504103 0.0838026 0.078988 0.501936 0.109581 0.0767847 0.500124 0.130744 0.0847881 0.502322 0.154502 0.0767157 0.501815 0.181351 0.0843553 0.505521 0.207176 0.0802278 0.500441 0.23431 0.0817475 0.508645 0.253781 0.079297 0.509629 0.281598 0.0779513 0.506056 0.30037 0.0811585 0.502841 0.326857 0.0825458 0.50225 0.354372 0.0785412 0.508379 0.377309 0.0808646 0.502335 0.40759 0.0778678 0.506489 0.434701 0.0805889 0.509205 0.456188 0.0756891 0.509148 0.48022 0.0772661 0.534698 0.00249981 0.0849864 0.527584 0.0332441 0.0802019 0.530748 0.0582438 0.0820077 0.529779 0.077647 0.0834947 0.525534 0.102928 0.0767303 0.533037 0.134587 0.0828339 0.530826 0.152337 0.0840462 0.531615 0.18401 0.0771868 0.530773 0.209205 0.0834826 0.526498 0.227147 0.0767528 0.531829 0.255991 0.0796623 0.531062 0.284595 0.0835547 0.534475 0.30455 0.0847032 0.529882 0.331109 0.0787455 0.526065 0.35071 0.0833743 0.530504 0.378477 0.0814144 0.531192 0.403997 0.0818624 0.527474 0.425586 0.0842007 0.532692 0.459013 0.0800419 0.533281 0.479109 0.0822206 0.552314 0.00500244 0.0842296 0.550215 0.0302306 0.0774442 0.557287 0.0554078 0.0760691 0.554956 0.0778443 0.076385 0.550612 0.103839 0.0800356 0.555958 0.133198 0.0808768 0.552609 0.151578 0.0824231 0.551003 0.175115 0.0775912 0.556928 0.202331 0.0795945 0.550587 0.226773 0.083992 0.557023 0.258753 0.0769021 0.556027 0.280159 0.0750614 0.550197 0.300563 0.0834883 0.553163 0.332682 0.0799891 0.551102 0.352019 0.0778811 0.554521 0.376596 0.0780153 0.550516 0.402805 0.0826485 0.556103 0.427365 0.0827654 0.556658 0.453363 0.0847692 0.55424 0.482739 0.0754725 0.579049 0.0068505 0.0821165 0.584338 0.0278635 0.0835436 0.576398 0.056354 0.0836867 0.583164 0.0817177 0.0775042 0.5753 0.105891 0.0821336 0.57797 0.126174 0.0782689 0.576031 0.153861 0.080408 0.58058 0.183217 0.0828118 0.579427 0.207373 0.0789423 0.578807 0.231834 0.0818396 0.580491 0.257042 0.0769096 0.579429 0.281208 0.0787088 0.575444 0.30439 0.0799154 0.577178 0.332447 0.0769347 0.577351 0.354642 0.0763455 0.576289 0.37742 0.0771583 0.581389 0.402153 0.0792442 0.58132 0.430997 0.0759758 0.57588 0.454397 0.0828711 0.579177 0.479579 0.0782801 0.609033 0.00896506 0.0789929 0.604484 0.028969 0.0780313 0.601061 0.0559926 0.0843356 0.602137 0.0846783 0.0768205 0.607864 0.107819 0.0776773 0.60169 0.130142 0.0752267 0.601268 0.157682 0.084801 0.600846 0.177669 0.0784688 0.608527 0.209761 0.083172 0.602932 0.231565 0.0785753 0.608921 0.25648 0.0804735 0.605441 0.283994 0.0799344 0.607508 0.303303 0.0764349 0.606868 0.333928 0.0827607 0.609125 0.357096 0.0827064 0.606524 0.383248 0.0775399 0.608721 0.408517 0.0767324 0.609893 0.431763 0.0760926 0.605713 0.454803 0.0790461 0.607793 0.480768 0.0842578 0.634967 0.00949205 0.0814206 0.631453 0.0263229 0.0819701 0.632111 0.0567469 0.0820461 0.634794 0.0831828 0.0799849 0.627668 0.102395 0.0843034 0.631053 0.127593 0.0842195 0.625507 0.159256 0.0829828 0.628412 0.183452 0.0771062 0.626391 0.20761 0.075753 0.629154 0.231685 0.0816701 0.627833 0.252263 0.0763294 0.629554 0.275792 0.075611 0.628519 0.305837 0.0764881 0.628894 0.331383 0.0794627 0.631381 0.357637 0.081515 0.627148 0.382671 0.0840661 0.627193 0.408439 0.0807169 0.633965 0.429216 0.081596 0.627397 0.454943 0.082223 0.625443 0.475656 0.0843712 0.653543 0.0089663 0.0755319 0.658035 0.0281396 0.0829575 0.653947 0.0547588 0.0843359 0.652438 0.0818833 0.0764981 0.659126 0.104127 0.0835013 0.655698 0.126498 0.0799917 0.652562 0.157308 0.0811479 0.659171 0.175172 0.0812658 0.655957 0.200499 0.0775322 0.659306 0.233857 0.0787655 0.653848 0.258759 0.0761691 0.653026 0.278698 0.0839034 0.654777 0.306039 0.0787336 0.650124 0.327801 0.0826287 0.65916 0.352503 0.0776873 0.656859 0.377623 0.0828098 0.655382 0.409719 0.0833173 0.658604 0.429719 0.0801468 0.651698 0.451136 0.0762131 0.652929 0.479394 0.0779862 0.684561 0.00611723 0.0769198 0.68427 0.028651 0.0773334 0.675673 0.0523621 0.0824019 0.67553 0.0754513 0.0834009 0.678963 0.105892 0.0791985 0.675468 0.12576 0.0773238 0.675682 0.158834 0.0834208 0.676977 0.176075 0.0806753 0.684167 0.205323 0.0774443 0.682356 0.230025 0.0800228 0.675583 0.255905 0.0848615 0.682097 0.284771 0.0764593 0.682302 0.304455 0.0813055 0.679872 0.326072 0.0845174 0.682166 0.359794 0.0810083 0.679324 0.376216 0.0785037 0.68427 0.401071 0.0767585 0.682556 0.433231 0.0773611 0.675233 0.451756 0.0818522 0.680564 0.482965 0.0814309 0.707392 0.00752502 0.0831654 0.708988 0.027114 0.0804951 0.703294 0.0561942 0.0819515 0.704545 0.0781183 0.0805518 0.709081 0.106094 0.0838074 0.709081 0.130237 0.077447 0.705505 0.154335 0.0758062 0.707762 0.180407 0.0836516 0.708749 0.201591 0.0755683 0.7086 0.231066 0.0755106 0.707584 0.252032 0.0815402 0.700376 0.282996 0.0766686 0.70604 0.303872 0.0845917 0.708123 0.333833 0.083431 0.705635 0.354747 0.0795274 0.709704 0.380058 0.0796691 0.708882 0.407835 0.080587 0.701501 0.427526 0.0783462 0.700021 0.453907 0.0833013 0.707746 0.475021 0.0768681 0.730586 0.000655378 0.076059 0.734934 0.0275494 0.0756305 0.725949 0.0530311 0.0752489 0.729584 0.0797477 0.0758998 0.73008 0.100258 0.077875 0.727484 0.12911 0.0801857 0.72703 0.155673 0.0807836 0.727564 0.184774 0.0816822 0.727537 0.201188 0.0762424 0.732701 0.226773 0.0755782 0.73315 0.258897 0.0789564 0.734603 0.281522 0.0834689 0.731325 0.303688 0.081067 0.72658 0.329732 0.0772514 0.72912 0.359171 0.0798185 0.734715 0.379008 0.0768078 0.729145 0.40451 0.0827341 0.726993 0.429916 0.080483 0.732151 0.453168 0.0847539 0.727128 0.480403 0.101742 0.00187695 0.00789436 0.10024 0.00385239 0.0285019 0.106531 0.00471914 0.054485 0.108925 0.00285146 0.0806205 0.108647 0.00933602 0.107675 0.100181 0.00231539 0.131862 0.103821 0.00217841 0.152 0.103819 0.00621082 0.181331 0.1024 0.00676307 0.2053 0.107965 0.000448885 0.227238 0.1035 0.00301015 0.254062 0.104524 0.00900401 0.277086 0.105267 0.00405891 0.308847 0.104537 0.00981097 0.331241 0.102199 0.0020847 0.350425 0.103209 0.00819653 0.377903 0.104943 0.00900859 0.408292 0.101487 0.00668161 0.425656 0.107516 0.00618122 0.455633 0.10255 0.00949798 0.483437 0.10995 0.0340048 0.0070902 0.107271 0.0322734 0.0282968 0.100243 0.0254304 0.0509555 0.10144 0.0250388 0.0798136 0.103231 0.0290217 0.107783 0.102028 0.0286432 0.12523 0.109503 0.0326652 0.159153 0.108943 0.0284671 0.177144 0.101797 0.0282261 0.204167 0.106674 0.0345013 0.231322 0.10406 0.029983 0.256889 0.100315 0.0260347 0.277655 0.101078 0.0330264 0.307566 0.104074 0.0303186 0.330621 0.107717 0.0324439 0.352968 0.108261 0.0271407 0.376918 0.109868 0.0304039 0.403879 0.10572 0.028552 0.426732 0.109815 0.0337772 0.458482 0.106064 0.027941 0.483855 0.102998 0.0548734 0.0090224 0.102846 0.0532737 0.0264392 0.100674 0.0584908 0.054035 0.102465 0.0512063 0.0756417 0.104026 0.0536596 0.106862 0.106772 0.0546722 0.130927 0.107135 0.0508339 0.153437 0.107247 0.0599022 0.177186 0.104021 0.058929 0.208002 0.106916 0.055817 0.22683 0.101863 0.0548337 0.256414 0.100537 0.0548476 0.279148 0.107026 0.0548971 0.303343 0.102613 0.0595925 0.331065 0.107411 0.0540206 0.351083 0.102333 0.053256 0.375271 0.109918 0.0510446 0.400109 0.105104 0.058034 0.426136 0.108587 0.0565778 0.451252 0.104279 0.0585393 0.477626 0.108455 0.0806838 0.0031153 0.100987 0.0794683 0.0268152 0.104612 0.0753554 0.0522469 0.106179 0.0771152 0.0750391 0.101367 0.0798598 0.102241 0.107456 0.0782812 0.13051 0.102116 0.0805161 0.15021 0.101136 0.0833611 0.184847 0.106884 0.0836448 0.200967 0.100889 0.0750332 0.226019 0.105993 0.0753191 0.254143 0.106897 0.0786419 0.28495 0.107441 0.0818666 0.307021 0.104153 0.0806053 0.332938 0.103481 0.0766853 0.352689 0.106441 0.0774466 0.382316 0.107031 0.0762438 0.406922 0.108442 0.0764996 0.434005 0.106944 0.0774354 0.45159 0.107846 0.0771343 0.475199 0.105296 0.105788 0.00276729 0.103723 0.106118 0.0276828 0.108449 0.106391 0.055316 0.104846 0.10524 0.0807398 0.103867 0.107661 0.103983 0.108128 0.105403 0.129045 0.108411 0.102515 0.152576 0.103594 0.10344 0.182893 0.1042 0.104877 0.204783 0.102866 0.104605 0.2346 0.10671 0.100827 0.259921 0.104137 0.10746 0.28001 0.105389 0.109257 0.301599 0.101585 0.109929 0.325093 0.106543 0.10853 0.357552 0.10382 0.100788 0.3784 0.102924 0.104732 0.40416 0.104608 0.100593 0.429176 0.103937 0.10146 0.453719 0.103887 0.104108 0.48105 0.100323 0.129817 0.000770049 0.101023 0.134297 0.027632 0.102783 0.132102 0.0579044 0.105124 0.134903 0.0767686 0.100129 0.129174 0.107793 0.109279 0.130725 0.130492 0.101209 0.128824 0.152555 0.106677 0.134452 0.178543 0.106171 0.133434 0.206597 0.107606 0.131495 0.228927 0.108219 0.126015 0.259821 0.107688 0.130216 0.284198 0.107645 0.127572 0.308062 0.104125 0.126595 0.32659 0.104304 0.130284 0.354939 0.100774 0.12673 0.382611 0.106924 0.125462 0.406171 0.106888 0.127062 0.425552 0.108929 0.12908 0.455175 0.101643 0.130128 0.484086 0.106541 0.158834 0.0025574 0.102017 0.154219 0.0349079 0.105584 0.154695 0.0510921 0.100298 0.151296 0.080041 0.108307 0.155504 0.103961 0.103518 0.159735 0.133442 0.109083 0.159972 0.151211 0.1068 0.152622 0.180162 0.105503 0.150018 0.203339 0.107874 0.157996 0.234638 0.103568 0.152646 0.257499 0.10194 0.15411 0.281579 0.101682 0.150859 0.303307 0.106094 0.152508 0.334109 0.105792 0.155433 0.355616 0.10922 0.158023 0.375625 0.100422 0.156187 0.401508 0.10299 0.158369 0.427916 0.10989 0.150248 0.453317 0.106312 0.157836 0.481224 0.105675 0.184266 0.00127841 0.100023 0.180196 0.0299642 0.104125 0.180426 0.053048 0.108782 0.178417 0.0770631 0.1031 0.182776 0.106375 0.102461 0.178519 0.127796 0.1001 0.182039 0.150626 0.106925 0.175339 0.176252 0.107219 0.17609 0.204984 0.101772 0.176676 0.226942 0.102342 0.183478 0.253422 0.103568 0.178146 0.280222 0.105714 0.182266 0.30915 0.109348 0.176095 0.332919 0.103696 0.184743 0.355762 0.100664 0.175159 0.382982 0.101018 0.178407 0.400435 0.10178 0.181892 0.428778 0.106164 0.179491 0.451079 0.109477 0.17684 0.481417 0.106084 0.208479 0.00898546 0.101117 0.206504 0.0316867 0.109968 0.203096 0.0539695 0.100441 0.205393 0.0829724 0.108438 0.206633 0.100269 0.105673 0.205185 0.129444 0.106895 0.204828 0.157577 0.106992 0.200759 0.183541 0.106883 0.204227 0.204216 0.109194 0.204352 0.232594 0.109517 0.201991 0.254244 0.103449 0.201602 0.277485 0.103529 0.203501 0.304036 0.104197 0.20779 0.328275 0.101405 0.205449 0.359056 0.101506 0.204645 0.379255 0.109724 0.20642 0.403884 0.101255 0.204469 0.432132 0.106857 0.200572 0.4556 0.107109 0.200595 0.484622 0.105245 0.22528 0.00433083 0.10154 0.228177 0.0263348 0.102317 0.233198 0.0521009 0.108987 0.229921 0.0759346 0.102509 0.227046 0.104075 0.108049 0.233458 0.127414 0.107204 0.233758 0.15002 0.109449 0.225469 0.183553 0.101003 0.231141 0.203813 0.109347 0.229597 0.232478 0.104294 0.228236 0.259626 0.105129 0.225941 0.277489 0.105601 0.22867 0.300186 0.102208 0.226869 0.327302 0.100445 0.225012 0.351068 0.101179 0.227951 0.383685 0.107478 0.228573 0.402125 0.109863 0.234384 0.433464 0.107087 0.231817 0.450633 0.103396 0.233963 0.477028 0.10921 0.254304 6.23699e-05 0.105548 0.25101 0.0334096 0.107376 0.255838 0.0505657 0.103239 0.256918 0.083539 0.10995 0.250602 0.107854 0.106155 0.254619 0.134251 0.107885 0.253332 0.154701 0.105569 0.258764 0.181739 0.100941 0.253597 0.203895 0.103891 0.25195 0.230889 0.107539 0.252704 0.258794 0.106034 0.257078 0.284383 0.101678 0.254449 0.309008 0.100382 0.25335 0.33238 0.104656 0.258675 0.353738 0.107582 0.250183 0.377128 0.10864 0.255352 0.40499 0.104377 0.252525 0.42836 0.104474 0.25567 0.45652 0.104914 0.253973 0.477465 0.10956 0.281006 0.00600456 0.102439 0.279968 0.0339977 0.108445 0.278548 0.0599288 0.103501 0.281473 0.0819794 0.109612 0.280385 0.100841 0.109626 0.281099 0.12674 0.102819 0.275041 0.159559 0.100789 0.280923 0.180869 0.101857 0.280256 0.203873 0.101212 0.277316 0.228733 0.106088 0.275345 0.25984 0.101527 0.283092 0.278087 0.102862 0.27867 0.306507 0.105925 0.283467 0.328094 0.102532 0.282855 0.358796 0.105006 0.280134 0.382647 0.107942 0.284371 0.405255 0.108947 0.281886 0.426155 0.105485 0.280696 0.450438 0.107877 0.284554 0.479893 0.106304 0.305563 0.00203001 0.10888 0.30658 0.0278661 0.108531 0.309915 0.0503805 0.103781 0.308988 0.0809755 0.108919 0.307844 0.102884 0.105945 0.301805 0.128061 0.103417 0.30263 0.15318 0.107292 0.303047 0.178725 0.105846 0.30373 0.202546 0.109665 0.309801 0.227082 0.109245 0.30645 0.252404 0.109629 0.303525 0.279561 0.101509 0.302523 0.309473 0.108005 0.300469 0.32828 0.100948 0.301651 0.357484 0.102753 0.305922 0.384279 0.107923 0.30514 0.403861 0.108149 0.301065 0.425281 0.104958 0.300252 0.455531 0.105257 0.309283 0.477505 0.105866 0.329882 0.00441003 0.102606 0.331419 0.025008 0.103709 0.333776 0.0546971 0.101772 0.329612 0.0824438 0.101386 0.33115 0.107558 0.105729 0.331719 0.129984 0.106427 0.330401 0.155998 0.109412 0.325067 0.177183 0.100919 0.333255 0.200301 0.10187 0.33255 0.230049 0.103748 0.325775 0.258166 0.102326 0.330296 0.283389 0.108714 0.328365 0.308181 0.100735 0.33485 0.33457 0.105999 0.32731 0.359991 0.104074 0.327701 0.381557 0.108453 0.334108 0.408219 0.100831 0.329887 0.434543 0.106271 0.328491 0.454234 0.108169 0.326477 0.477134 0.10019 0.35846 0.000743641 0.102695 0.3527 0.0333593 0.107429 0.355983 0.0586666 0.108287 0.350619 0.083553 0.109479 0.358697 0.108556 0.108444 0.35303 0.131953 0.10839 0.358209 0.152839 0.100829 0.350748 0.175566 0.108148 0.351697 0.209624 0.108657 0.359163 0.230643 0.106712 0.358853 0.253092 0.105701 0.356034 0.284886 0.103428 0.354669 0.304548 0.106127 0.355867 0.32622 0.107971 0.353506 0.354956 0.104122 0.357276 0.380004 0.101436 0.351275 0.400004 0.105062 0.358536 0.429192 0.104626 0.352616 0.458001 0.10066 0.354545 0.479798 0.102391 0.376311 0.00798144 0.104424 0.382419 0.0260145 0.108864 0.381025 0.0573953 0.106496 0.377996 0.0820451 0.10308 0.379012 0.100216 0.102443 0.381452 0.133589 0.102132 0.379824 0.152636 0.101337 0.377347 0.180782 0.109021 0.382252 0.201114 0.102582 0.378544 0.225048 0.104138 0.377935 0.253391 0.106905 0.384135 0.282444 0.106548 0.382192 0.307802 0.107412 0.383485 0.334427 0.10254 0.380919 0.355961 0.108051 0.38469 0.378364 0.107759 0.375439 0.405667 0.108543 0.380865 0.433316 0.101529 0.376723 0.450042 0.101242 0.375543 0.478279 0.10822 0.401628 0.00368356 0.107031 0.406058 0.0310595 0.109218 0.400626 0.0522606 0.10045 0.404907 0.0754562 0.10481 0.402164 0.108654 0.107903 0.404534 0.125007 0.10499 0.409165 0.150992 0.108654 0.40829 0.182539 0.105485 0.402194 0.207665 0.104745 0.403192 0.233194 0.10469 0.404382 0.251553 0.108734 0.401198 0.278689 0.102734 0.404842 0.305986 0.10999 0.401443 0.325653 0.103213 0.401073 0.354735 0.100271 0.401234 0.382669 0.101427 0.40418 0.404446 0.104543 0.406177 0.425126 0.106264 0.400643 0.457318 0.101536 0.403391 0.484443 0.100628 0.427054 0.00809686 0.107131 0.425129 0.0337857 0.100066 0.432516 0.0556044 0.107014 0.429611 0.0753501 0.108296 0.426891 0.10253 0.100994 0.431529 0.130894 0.104763 0.433501 0.151858 0.106439 0.429158 0.176071 0.100719 0.429155 0.207384 0.109646 0.427982 0.231113 0.103208 0.429787 0.255916 0.108266 0.428327 0.284059 0.102848 0.434914 0.308742 0.107152 0.425491 0.334019 0.106592 0.427093 0.357052 0.108409 0.433575 0.380992 0.106657 0.433463 0.404925 0.103921 0.425394 0.429778 0.10561 0.430428 0.453755 0.109174 0.43436 0.483591 0.107237 0.457382 0.00864168 0.100186 0.456007 0.0318334 0.10518 0.453766 0.0554257 0.106682 0.452519 0.081965 0.108015 0.459688 0.103852 0.104239 0.450194 0.125883 0.10041 0.451022 0.151698 0.10136 0.456656 0.181861 0.109447 0.451455 0.20785 0.105802 0.450388 0.231697 0.105888 0.451862 0.253336 0.101819 0.454221 0.275953 0.109353 0.453857 0.30884 0.100735 0.459152 0.334906 0.102373 0.4594 0.35715 0.109685 0.453036 0.383797 0.107196 0.458055 0.401214 0.107275 0.458895 0.434581 0.108648 0.451362 0.454549 0.101751 0.459245 0.476451 0.100806 0.482501 0.00541849 0.10605 0.47639 0.0270989 0.109279 0.483193 0.0551504 0.106551 0.481978 0.0751792 0.108912 0.480588 0.105876 0.103007 0.481157 0.13067 0.105001 0.476406 0.158756 0.108713 0.482368 0.181144 0.100349 0.478353 0.209297 0.101828 0.47637 0.229316 0.1038 0.475431 0.259282 0.105023 0.482621 0.27562 0.104732 0.476129 0.300578 0.108104 0.483715 0.331733 0.100794 0.482934 0.355466 0.107937 0.480175 0.37612 0.105901 0.479189 0.404504 0.103266 0.476547 0.434026 0.100857 0.480106 0.455832 0.102749 0.484088 0.479806 0.1095 0.508125 0.00705283 0.100491 0.508056 0.0259947 0.102543 0.502361 0.0592962 0.103934 0.500745 0.080689 0.107995 0.507794 0.100007 0.105386 0.506978 0.126505 0.107048 0.506209 0.15055 0.100296 0.50508 0.184361 0.10847 0.500232 0.200002 0.100518 0.509237 0.233261 0.104441 0.508312 0.257987 0.101033 0.506536 0.283122 0.101104 0.508299 0.307464 0.108625 0.501002 0.327394 0.107538 0.507884 0.356215 0.100142 0.506789 0.384444 0.104813 0.50741 0.400024 0.10489 0.500658 0.430894 0.104127 0.507965 0.459419 0.10167 0.503503 0.477328 0.103672 0.527363 0.00798619 0.103695 0.532634 0.0299289 0.10181 0.52578 0.0527842 0.106051 0.531449 0.0793573 0.106146 0.532831 0.108928 0.101101 0.530649 0.125123 0.108645 0.532542 0.158586 0.108675 0.528581 0.183604 0.103631 0.52781 0.203168 0.106445 0.532553 0.229177 0.102808 0.530697 0.250164 0.107046 0.525294 0.280037 0.105053 0.527498 0.309069 0.107272 0.531371 0.32691 0.107586 0.532913 0.359803 0.106449 0.533997 0.383181 0.10753 0.53242 0.405239 0.102692 0.53047 0.43466 0.104406 0.529953 0.456574 0.105592 0.53333 0.483345 0.106073 0.55882 0.00780171 0.104537 0.555022 0.0273242 0.108048 0.551093 0.0534799 0.10058 0.555309 0.0762976 0.107468 0.556616 0.102935 0.100665 0.55723 0.127625 0.109666 0.559767 0.153093 0.105924 0.554165 0.178564 0.108761 0.554593 0.204728 0.104713 0.556523 0.234033 0.105998 0.556763 0.250509 0.105995 0.550811 0.276965 0.100812 0.550727 0.303665 0.104776 0.555338 0.330126 0.107081 0.553167 0.357306 0.10575 0.556158 0.380402 0.103288 0.555055 0.403235 0.105088 0.550748 0.42809 0.10066 0.554613 0.450705 0.100214 0.557728 0.484493 0.103058 0.580424 0.00867754 0.10902 0.576514 0.0348655 0.103934 0.577666 0.055973 0.102762 0.576354 0.0801734 0.101572 0.577769 0.108796 0.104672 0.575924 0.128728 0.102854 0.583513 0.154858 0.100744 0.575747 0.182154 0.104388 0.577759 0.206268 0.101244 0.579574 0.23251 0.105007 0.580075 0.258301 0.106529 0.58105 0.282613 0.103167 0.578162 0.30469 0.102176 0.583071 0.333354 0.10463 0.582105 0.352731 0.103981 0.580618 0.37713 0.105231 0.580013 0.40858 0.100958 0.576281 0.426855 0.101174 0.58237 0.45783 0.106468 0.576447 0.480014 0.101013 0.607554 0.00113532 0.105408 0.609294 0.0302932 0.106218 0.602455 0.0517863 0.107327 0.604986 0.083074 0.105675 0.609265 0.100265 0.103222 0.606809 0.127845 0.105912 0.602584 0.151951 0.107558 0.609581 0.178038 0.107787 0.600405 0.206415 0.104564 0.600383 0.233225 0.107119 0.603874 0.25363 0.10645 0.600267 0.277269 0.107763 0.60227 0.302152 0.109417 0.60024 0.328011 0.108406 0.608091 0.353873 0.107488 0.603688 0.378642 0.108853 0.608418 0.408274 0.108173 0.600456 0.42848 0.101197 0.607941 0.45695 0.105814 0.607126 0.478424 0.108561 0.632768 0.00016516 0.102449 0.633855 0.0293732 0.109826 0.630589 0.05226 0.101781 0.63333 0.0751419 0.102779 0.630926 0.100823 0.100134 0.633421 0.129613 0.100832 0.633126 0.157315 0.102702 0.633129 0.178664 0.105473 0.626949 0.208986 0.109091 0.628141 0.225308 0.104363 0.632353 0.258915 0.107302 0.632874 0.282361 0.105052 0.628716 0.306257 0.109441 0.632694 0.327801 0.102571 0.633158 0.355365 0.103046 0.634327 0.384218 0.103518 0.63218 0.40142 0.105791 0.627173 0.425213 0.108888 0.627146 0.454678 0.109317 0.632522 0.481271 0.104984 0.657168 0.00204701 0.10074 0.657007 0.031703 0.106325 0.652584 0.05589 0.101336 0.657861 0.0836932 0.107241 0.659564 0.108067 0.106282 0.656518 0.129158 0.104474 0.656321 0.158226 0.102998 0.658704 0.182367 0.109802 0.654158 0.202695 0.103893 0.651179 0.22646 0.101906 0.655547 0.250837 0.106837 0.655247 0.28064 0.107516 0.652211 0.307722 0.109848 0.652971 0.3349 0.109684 0.651328 0.351636 0.106908 0.650609 0.375305 0.103659 0.653771 0.400858 0.104146 0.656507 0.428448 0.100645 0.654988 0.459612 0.104201 0.655725 0.478386 0.105869 0.67836 0.00695725 0.107977 0.677262 0.0308735 0.109288 0.682871 0.0504694 0.103588 0.676671 0.08407 0.102716 0.678339 0.105487 0.10142 0.675852 0.130331 0.106006 0.678972 0.159972 0.108366 0.676001 0.1798 0.105909 0.681759 0.207537 0.104521 0.682431 0.225845 0.103068 0.684505 0.254672 0.100904 0.684112 0.277107 0.100512 0.678758 0.304677 0.107523 0.683619 0.329764 0.105409 0.678834 0.35251 0.101394 0.676781 0.382785 0.103155 0.675785 0.402702 0.100248 0.681764 0.42901 0.107565 0.679386 0.45987 0.107259 0.67608 0.480444 0.100659 0.701408 0.00817222 0.103873 0.705669 0.0349118 0.106012 0.70526 0.0510281 0.102553 0.702847 0.0838861 0.100939 0.702948 0.107964 0.106908 0.701102 0.133272 0.10894 0.703286 0.156551 0.104194 0.704589 0.178879 0.106343 0.709311 0.208881 0.109513 0.708669 0.230608 0.109899 0.703247 0.250173 0.102595 0.701861 0.277384 0.101104 0.707392 0.308784 0.108608 0.700939 0.329412 0.107725 0.704787 0.357262 0.101222 0.703278 0.375792 0.108269 0.700399 0.404371 0.109809 0.707606 0.430696 0.109012 0.70023 0.450395 0.10873 0.702804 0.47571 0.103996 0.730003 0.00649973 0.109389 0.728984 0.0296874 0.105924 0.729873 0.0592788 0.100026 0.727027 0.0760439 0.104569 0.726942 0.10812 0.100343 0.734052 0.134614 0.107261 0.73332 0.158728 0.108276 0.727769 0.1789 0.102659 0.733612 0.204973 0.105428 0.733872 0.226245 0.103881 0.732767 0.252168 0.10836 0.725683 0.278782 0.10767 0.727318 0.306274 0.107968 0.726324 0.329872 0.106478 0.731828 0.351958 0.106415 0.730927 0.376125 0.101296 0.734642 0.403798 0.108287 0.730315 0.432434 0.108432 0.733065 0.456406 0.108145 0.731526 0.477778 0.129392 0.00936106 0.00884702 0.126983 0.000965497 0.0264747 0.129391 0.00481869 0.0565437 0.131856 0.0006753 0.0810944 0.132855 0.0073037 0.109391 0.127038 0.00538325 0.133836 0.130157 0.000743797 0.150547 0.132336 0.00470196 0.17612 0.131418 0.00349991 0.204647 0.12774 0.00287868 0.2348 0.131373 0.000480253 0.257136 0.128482 0.00543481 0.275325 0.130112 0.00715842 0.303011 0.126938 0.00459791 0.330392 0.131041 0.00564793 0.350517 0.12617 0.00759793 0.379794 0.133896 0.00885616 0.406783 0.127842 0.00408413 0.434737 0.133603 0.00959551 0.452666 0.131348 0.00515808 0.478913 0.128797 0.0275391 0.00464858 0.130632 0.0302666 0.0316207 0.134509 0.0315089 0.0553782 0.13035 0.0331146 0.0807336 0.130196 0.0263253 0.100307 0.132334 0.0284004 0.131182 0.133268 0.0292882 0.155858 0.131541 0.0294085 0.177502 0.130216 0.034877 0.203793 0.134581 0.0328791 0.233368 0.127685 0.0264266 0.259309 0.126651 0.0329072 0.284517 0.130844 0.0294732 0.30552 0.128989 0.0313271 0.329207 0.131647 0.0255937 0.358527 0.126548 0.0288651 0.376666 0.134351 0.0325309 0.402368 0.128587 0.0344931 0.426992 0.130757 0.0270723 0.459712 0.130226 0.025015 0.480828 0.134276 0.0518266 0.00952982 0.127929 0.0561133 0.0313573 0.128299 0.0591832 0.0512524 0.130836 0.0552762 0.080862 0.132684 0.0571674 0.101561 0.129888 0.0508128 0.13024 0.130578 0.0526303 0.156155 0.127726 0.0558095 0.176238 0.126441 0.0578164 0.204981 0.131403 0.0583649 0.229624 0.129188 0.0578023 0.251936 0.125333 0.0552451 0.283501 0.132963 0.0571442 0.302945 0.125317 0.0561388 0.333377 0.125037 0.0566895 0.354344 0.125996 0.0588976 0.378688 0.125281 0.0592523 0.408358 0.129518 0.0576129 0.425662 0.1283 0.0566504 0.453325 0.134448 0.0507857 0.477494 0.125691 0.083686 0.00508839 0.125545 0.0775242 0.034405 0.131373 0.0759363 0.0535538 0.132814 0.0785078 0.0813984 0.134852 0.0797642 0.10093 0.126228 0.0750133 0.134802 0.131309 0.0840314 0.154888 0.130108 0.0843155 0.181913 0.129491 0.0829179 0.209882 0.129281 0.0813169 0.233324 0.130387 0.0835675 0.254762 0.133686 0.076971 0.280584 0.132269 0.0761383 0.303259 0.131697 0.0817906 0.33227 0.130953 0.0841458 0.359396 0.129133 0.077682 0.380077 0.134476 0.0750333 0.408029 0.127718 0.0818032 0.427591 0.134482 0.0778552 0.450359 0.132272 0.0801689 0.476594 0.128725 0.10291 0.00927252 0.132539 0.108164 0.0339112 0.127136 0.106875 0.0592003 0.132976 0.108928 0.0775248 0.129445 0.106026 0.100511 0.130256 0.107887 0.128918 0.130677 0.10224 0.154506 0.126449 0.101286 0.181654 0.133652 0.104943 0.208101 0.130155 0.107307 0.228452 0.130283 0.105822 0.251577 0.127576 0.106798 0.284917 0.130098 0.107502 0.302442 0.13179 0.109647 0.325578 0.130039 0.102719 0.356188 0.12744 0.101835 0.379428 0.128521 0.10703 0.401327 0.129604 0.108399 0.434069 0.134168 0.105728 0.456513 0.125659 0.106487 0.480882 0.13155 0.12611 0.00747845 0.129505 0.127214 0.0343275 0.132595 0.126106 0.0546074 0.125761 0.134765 0.0821368 0.13399 0.129799 0.109908 0.127081 0.12701 0.128679 0.134347 0.128677 0.154047 0.134384 0.130774 0.18332 0.129144 0.126098 0.204923 0.133229 0.129679 0.231889 0.131462 0.129017 0.258915 0.12502 0.127467 0.279829 0.130897 0.127383 0.308799 0.133132 0.12994 0.330942 0.130399 0.125223 0.35167 0.127756 0.128594 0.384517 0.127021 0.131406 0.407787 0.127936 0.126748 0.427784 0.131898 0.127117 0.45123 0.132828 0.127715 0.483807 0.13217 0.159438 0.0083515 0.131258 0.150201 0.0275101 0.134435 0.156749 0.0554156 0.125607 0.153105 0.0757746 0.134041 0.157515 0.108408 0.129957 0.150462 0.128012 0.130069 0.157312 0.153636 0.127194 0.152951 0.181954 0.128936 0.158149 0.209657 0.127512 0.156077 0.231515 0.134816 0.158961 0.251005 0.129365 0.153562 0.281005 0.131438 0.158109 0.30876 0.129896 0.158708 0.332797 0.132634 0.152119 0.356185 0.12691 0.15292 0.377989 0.129999 0.154846 0.406444 0.126061 0.151141 0.427672 0.132634 0.15847 0.453942 0.129106 0.154745 0.475945 0.126111 0.182236 0.00525006 0.125082 0.181235 0.0311892 0.131721 0.180497 0.0540162 0.125432 0.182417 0.0792824 0.129488 0.180811 0.10863 0.128518 0.179731 0.13073 0.129361 0.18489 0.159555 0.12664 0.184275 0.180269 0.127644 0.18439 0.202753 0.132687 0.182626 0.230919 0.130566 0.182823 0.257458 0.129719 0.184881 0.279023 0.132731 0.182693 0.302389 0.131118 0.184702 0.326285 0.127085 0.179791 0.355875 0.125563 0.181965 0.383971 0.126018 0.17745 0.409647 0.131369 0.180094 0.433352 0.132934 0.184616 0.459404 0.128415 0.183681 0.478035 0.125392 0.209779 0.00853003 0.133483 0.206286 0.0261491 0.127941 0.206213 0.0537303 0.13133 0.201347 0.076869 0.130538 0.207 0.104946 0.134455 0.207042 0.130855 0.134476 0.203915 0.159392 0.127587 0.20631 0.179534 0.125563 0.208105 0.205055 0.125877 0.202552 0.234654 0.126769 0.208213 0.259702 0.132442 0.201673 0.28106 0.128769 0.204958 0.300014 0.131308 0.20614 0.327235 0.126446 0.200998 0.353626 0.126991 0.20718 0.376522 0.132863 0.200067 0.401117 0.128432 0.208363 0.427347 0.130573 0.204186 0.458454 0.127866 0.204047 0.480519 0.127184 0.2259 0.00105885 0.125532 0.233114 0.0312235 0.131593 0.231283 0.0546841 0.125581 0.232452 0.0763853 0.132602 0.227826 0.10803 0.125799 0.230787 0.129544 0.130158 0.230317 0.15157 0.125703 0.227929 0.179865 0.132897 0.230751 0.20437 0.129156 0.23462 0.228234 0.128676 0.232954 0.253846 0.131607 0.225202 0.280537 0.126811 0.234334 0.308709 0.134168 0.234652 0.329195 0.13325 0.231669 0.350307 0.134027 0.233937 0.375577 0.128115 0.234831 0.404322 0.130885 0.225418 0.426779 0.125837 0.234858 0.452842 0.130232 0.226317 0.478678 0.127349 0.252329 0.00972256 0.134456 0.257395 0.0263928 0.134566 0.252928 0.0596505 0.126576 0.250836 0.0776426 0.125995 0.250433 0.104353 0.133805 0.25158 0.133071 0.134054 0.25777 0.150403 0.130144 0.255772 0.177429 0.129363 0.259068 0.200258 0.125798 0.257481 0.230719 0.126615 0.258806 0.250692 0.133774 0.258703 0.277744 0.128248 0.258266 0.303536 0.133763 0.257713 0.330393 0.130089 0.253069 0.352241 0.130078 0.25042 0.381664 0.126209 0.257918 0.409461 0.127237 0.250457 0.427368 0.125542 0.250529 0.457737 0.133201 0.251541 0.481681 0.131227 0.282185 0.00591365 0.133863 0.282058 0.0287928 0.133667 0.282231 0.0510074 0.12658 0.283017 0.0839488 0.129366 0.277259 0.108097 0.132691 0.281252 0.133723 0.129025 0.279692 0.155543 0.133272 0.281128 0.178718 0.128292 0.277667 0.206565 0.133164 0.283942 0.225608 0.126215 0.278389 0.255443 0.12568 0.28311 0.282937 0.129056 0.282396 0.302062 0.134935 0.280479 0.329714 0.128128 0.284029 0.350827 0.129432 0.279544 0.378996 0.131991 0.281424 0.407308 0.128798 0.278338 0.428197 0.128199 0.282448 0.455209 0.133409 0.278351 0.475505 0.133144 0.302319 0.00406762 0.128374 0.301398 0.0278384 0.132096 0.306409 0.0506053 0.133676 0.30567 0.0820494 0.130063 0.307481 0.10609 0.130252 0.302247 0.127052 0.129028 0.300978 0.159914 0.133312 0.305071 0.179777 0.133374 0.300337 0.205828 0.12794 0.302762 0.232309 0.134338 0.308517 0.257978 0.125619 0.301038 0.284771 0.134356 0.303862 0.30745 0.132525 0.307293 0.330205 0.127611 0.301188 0.357534 0.133263 0.30931 0.376935 0.129283 0.300593 0.406242 0.132335 0.306007 0.431195 0.129313 0.309273 0.453812 0.126736 0.307604 0.47593 0.131595 0.328802 0.00695843 0.131328 0.327261 0.0285453 0.132931 0.334909 0.0587957 0.128981 0.329076 0.0790056 0.130997 0.331527 0.101419 0.134286 0.333198 0.13087 0.133667 0.325113 0.150202 0.128666 0.334472 0.176561 0.129441 0.326133 0.200223 0.12829 0.328326 0.226258 0.132531 0.328488 0.250174 0.127639 0.325388 0.277411 0.132713 0.332242 0.309954 0.128248 0.334767 0.328389 0.130787 0.334691 0.358768 0.131757 0.332195 0.381165 0.130441 0.331125 0.40698 0.127477 0.328469 0.431172 0.132419 0.333964 0.458875 0.13198 0.328603 0.483227 0.128983 0.353617 0.00159004 0.127294 0.358395 0.0347196 0.125994 0.359532 0.0536838 0.131167 0.357071 0.0837239 0.130377 0.350661 0.10283 0.126231 0.350958 0.126281 0.134814 0.358767 0.158653 0.133184 0.357684 0.184606 0.12586 0.352812 0.209339 0.125594 0.352378 0.22992 0.129751 0.354462 0.255883 0.134995 0.353861 0.275072 0.126077 0.355136 0.305481 0.133504 0.35489 0.326149 0.130179 0.356508 0.355408 0.129635 0.353365 0.379812 0.128621 0.352558 0.40422 0.131048 0.353536 0.430571 0.128698 0.352479 0.451078 0.131942 0.358503 0.484085 0.130993 0.378967 0.00877613 0.127477 0.378556 0.0302734 0.127223 0.375198 0.0563394 0.128457 0.376727 0.0757234 0.127157 0.375294 0.108105 0.134184 0.381071 0.129789 0.12888 0.377922 0.150165 0.125021 0.382779 0.18454 0.134799 0.381947 0.206478 0.131285 0.378869 0.22978 0.128982 0.381414 0.255932 0.12744 0.38237 0.281512 0.12912 0.376861 0.303622 0.134462 0.383856 0.331232 0.13232 0.379494 0.356173 0.132749 0.380422 0.382334 0.125894 0.380075 0.408556 0.13115 0.377254 0.434083 0.13471 0.38457 0.456227 0.126602 0.375284 0.47552 0.129661 0.409973 0.000744268 0.133567 0.404399 0.030427 0.127016 0.405769 0.0571926 0.130121 0.403907 0.0839977 0.133001 0.40172 0.105787 0.125144 0.409246 0.130307 0.126083 0.404545 0.157734 0.131244 0.402578 0.18004 0.134987 0.40424 0.20758 0.127152 0.408147 0.229678 0.131626 0.400366 0.259694 0.128505 0.403079 0.277129 0.134055 0.403213 0.303649 0.133146 0.401564 0.330408 0.132242 0.408383 0.35087 0.131853 0.405517 0.383928 0.125071 0.401879 0.407883 0.13182 0.406934 0.426641 0.129389 0.406964 0.451313 0.126281 0.405876 0.476537 0.127261 0.432114 0.00391398 0.129372 0.431673 0.0289594 0.131339 0.432781 0.056103 0.130692 0.428754 0.0765181 0.128625 0.426695 0.100079 0.132892 0.430188 0.131416 0.131386 0.425723 0.156509 0.130803 0.427735 0.176416 0.130602 0.426475 0.201891 0.128048 0.43072 0.228596 0.12664 0.428427 0.253873 0.130316 0.432299 0.278409 0.130916 0.42814 0.302004 0.13071 0.427021 0.332751 0.126919 0.43255 0.352556 0.126811 0.429711 0.378922 0.132099 0.42946 0.409065 0.130507 0.426363 0.430009 0.132763 0.425081 0.453033 0.125573 0.432587 0.475132 0.132175 0.457585 0.00217973 0.128855 0.451494 0.0305629 0.128712 0.455928 0.0570222 0.127035 0.45106 0.0829409 0.133916 0.450632 0.104823 0.128052 0.45727 0.12928 0.132391 0.452577 0.158837 0.127943 0.452038 0.178635 0.131176 0.450042 0.202226 0.126721 0.452252 0.229602 0.132679 0.45277 0.251322 0.127174 0.459849 0.283734 0.12883 0.458127 0.307099 0.129498 0.456034 0.327133 0.125706 0.452573 0.358512 0.129276 0.451681 0.37888 0.125114 0.456754 0.406021 0.131424 0.451283 0.427589 0.126304 0.459893 0.458022 0.129928 0.450255 0.484468 0.1277 0.484775 9.65516e-05 0.125269 0.47694 0.0324246 0.133895 0.484056 0.0541552 0.131132 0.483849 0.0836351 0.13312 0.4821 0.109378 0.129938 0.484779 0.130632 0.12612 0.481359 0.152335 0.131053 0.477408 0.184399 0.131402 0.475985 0.20778 0.131355 0.479318 0.225897 0.134408 0.482167 0.259049 0.126025 0.481484 0.278767 0.126653 0.482249 0.309382 0.131772 0.482067 0.329127 0.133414 0.483924 0.350758 0.134794 0.480089 0.375669 0.130188 0.482957 0.404515 0.126264 0.481292 0.42981 0.129103 0.479894 0.454566 0.127893 0.482397 0.484016 0.125635 0.507953 0.0050551 0.125279 0.501148 0.0286675 0.128124 0.508349 0.0519093 0.126232 0.503177 0.0813219 0.127619 0.501397 0.109137 0.132424 0.502428 0.134643 0.127095 0.505681 0.150597 0.131076 0.500759 0.180326 0.134435 0.50971 0.20079 0.126996 0.501754 0.232801 0.133893 0.50322 0.256522 0.1343 0.505571 0.281198 0.125107 0.503525 0.30581 0.130204 0.507206 0.325541 0.132013 0.506838 0.352848 0.129992 0.504257 0.384366 0.126813 0.505369 0.400883 0.133073 0.503778 0.427634 0.132487 0.505289 0.45504 0.131333 0.500269 0.479897 0.126641 0.534684 0.00429879 0.127879 0.529334 0.0286178 0.128361 0.533975 0.0555045 0.125541 0.528667 0.0838195 0.133579 0.527953 0.107621 0.125009 0.53067 0.132491 0.133126 0.526142 0.152508 0.133063 0.531468 0.181935 0.131566 0.525318 0.203735 0.13449 0.5297 0.230605 0.133986 0.525459 0.257566 0.129014 0.532122 0.283478 0.131068 0.525188 0.306695 0.128466 0.533741 0.325864 0.131908 0.529217 0.351347 0.126974 0.528929 0.383606 0.126169 0.529481 0.407613 0.134575 0.533235 0.434614 0.125026 0.528073 0.455652 0.13005 0.534058 0.476999 0.132572 0.556838 0.00215261 0.133958 0.559387 0.0319721 0.128226 0.558868 0.0532126 0.126875 0.557372 0.0788876 0.132513 0.552409 0.103548 0.134225 0.55212 0.13006 0.126334 0.550677 0.155268 0.131775 0.5587 0.182486 0.128571 0.551489 0.208834 0.131654 0.557001 0.230167 0.129079 0.554277 0.251387 0.127385 0.558422 0.277975 0.125212 0.551906 0.309398 0.126852 0.554597 0.325953 0.1342 0.551789 0.356425 0.133895 0.550056 0.381787 0.125052 0.555943 0.403044 0.129401 0.555775 0.427346 0.128285 0.55055 0.455173 0.133864 0.55954 0.481753 0.133905 0.576573 0.00749311 0.134389 0.575217 0.0338854 0.129144 0.584465 0.0580174 0.133006 0.579627 0.0835564 0.132254 0.577792 0.102295 0.133438 0.583739 0.132362 0.12595 0.577322 0.157369 0.131057 0.578492 0.18361 0.130822 0.577997 0.201169 0.125433 0.583525 0.230105 0.134742 0.582826 0.258671 0.128863 0.579515 0.278747 0.128993 0.575122 0.302189 0.13498 0.582152 0.331206 0.134057 0.581593 0.355289 0.127386 0.583204 0.381618 0.129244 0.579161 0.402345 0.126105 0.579141 0.425065 0.133814 0.578974 0.459678 0.125749 0.577244 0.484227 0.130182 0.601608 0.00290451 0.133086 0.607937 0.0324323 0.126767 0.601396 0.0547908 0.131469 0.600334 0.0790645 0.129718 0.607317 0.105656 0.13201 0.601755 0.133745 0.125844 0.606846 0.158276 0.129421 0.604443 0.175704 0.127315 0.600491 0.209409 0.134847 0.605952 0.233964 0.128871 0.60017 0.255525 0.132975 0.601575 0.279806 0.126627 0.606555 0.303621 0.130839 0.604865 0.330951 0.129235 0.600808 0.356835 0.132381 0.609562 0.375035 0.133538 0.602126 0.408268 0.127996 0.606851 0.434999 0.132964 0.603442 0.454013 0.131446 0.609553 0.47678 0.128173 0.628183 0.00846518 0.134655 0.627028 0.0325603 0.128939 0.62652 0.0555315 0.133442 0.629975 0.0793978 0.126451 0.626898 0.109951 0.128566 0.634793 0.130257 0.12514 0.629599 0.159247 0.134124 0.625242 0.177344 0.12795 0.625893 0.209526 0.128913 0.63408 0.226464 0.1341 0.629701 0.252759 0.131706 0.631261 0.280529 0.133022 0.628356 0.308681 0.127155 0.63253 0.328279 0.130486 0.625117 0.353312 0.127203 0.626054 0.377843 0.126081 0.632429 0.400722 0.131657 0.625119 0.425609 0.131651 0.630021 0.458921 0.130146 0.625976 0.48152 0.131889 0.655435 0.00224277 0.131751 0.65436 0.0308815 0.133284 0.656679 0.0569825 0.134233 0.653176 0.0820644 0.132436 0.655232 0.10024 0.131203 0.654058 0.130183 0.1303 0.652341 0.155305 0.130042 0.651051 0.176296 0.128921 0.65752 0.201723 0.132888 0.650025 0.227219 0.132654 0.658066 0.257412 0.130639 0.658346 0.283791 0.133593 0.65014 0.304512 0.133914 0.657309 0.326532 0.134995 0.65598 0.350485 0.13444 0.651869 0.383009 0.132214 0.65704 0.405874 0.12817 0.659981 0.433168 0.132415 0.653633 0.451871 0.13451 0.659065 0.482814 0.129107 0.67984 0.000610441 0.125378 0.68154 0.0268873 0.134853 0.679571 0.0521545 0.126737 0.677235 0.0771241 0.132625 0.681008 0.106737 0.12788 0.684444 0.134974 0.13412 0.682548 0.158042 0.130921 0.677204 0.176223 0.13122 0.677292 0.205479 0.128494 0.683555 0.226432 0.127535 0.684376 0.252406 0.129333 0.682771 0.282969 0.125667 0.675755 0.302257 0.131561 0.675318 0.325239 0.134607 0.678739 0.357574 0.130127 0.679173 0.382768 0.125367 0.678785 0.406855 0.130556 0.682136 0.432589 0.130346 0.677721 0.459286 0.127029 0.675809 0.483895 0.129864 0.702696 0.00791951 0.126974 0.706493 0.0294236 0.13404 0.705744 0.055528 0.128924 0.701152 0.077452 0.126813 0.706719 0.109399 0.128473 0.709138 0.125709 0.132716 0.700367 0.156972 0.130613 0.702517 0.181089 0.125758 0.70768 0.202942 0.12791 0.704047 0.232069 0.127097 0.703302 0.25393 0.129458 0.700441 0.276354 0.131347 0.708515 0.30035 0.126739 0.704298 0.330629 0.126339 0.707312 0.351085 0.127697 0.707938 0.379355 0.128446 0.706932 0.407211 0.125728 0.708655 0.433887 0.129016 0.708655 0.452941 0.130578 0.708739 0.477932 0.1253 0.730345 0.00207837 0.126685 0.730075 0.0346724 0.128081 0.725549 0.0545543 0.130449 0.726664 0.0849036 0.134943 0.729191 0.103022 0.131412 0.727945 0.133788 0.129252 0.730052 0.158109 0.133675 0.725047 0.176751 0.132141 0.732593 0.204086 0.127897 0.72935 0.229881 0.12669 0.73486 0.252984 0.133425 0.726139 0.275358 0.125762 0.725993 0.300723 0.130233 0.726654 0.33374 0.128917 0.732921 0.356839 0.127673 0.725055 0.37872 0.129593 0.733094 0.4044 0.133481 0.725045 0.425225 0.127579 0.733625 0.456759 0.129121 0.731067 0.475801 0.152895 0.00547055 0.00961919 0.154888 0.00227389 0.0291426 0.15863 0.00561335 0.0515629 0.151525 0.00511996 0.0834914 0.157605 0.00428166 0.109898 0.155067 0.00663665 0.128618 0.155275 0.00104681 0.150032 0.15931 0.00600563 0.176709 0.158827 0.00932856 0.204888 0.150173 0.00335751 0.233089 0.156143 0.00145437 0.251112 0.152187 0.00245782 0.279697 0.158558 0.00143722 0.306864 0.156136 0.00412244 0.328429 0.155679 1.09487e-06 0.354391 0.151537 0.00409013 0.380109 0.153394 0.0029011 0.407893 0.152869 0.00186 0.429563 0.157983 0.00213992 0.455529 0.151595 0.00384349 0.48212 0.15685 0.0261413 0.00702434 0.153334 0.0302858 0.0301008 0.15005 0.025976 0.0572967 0.152435 0.0278198 0.0792164 0.157141 0.0343748 0.101066 0.154628 0.0297594 0.128201 0.156447 0.0342412 0.15296 0.157679 0.0329646 0.176806 0.155446 0.0319763 0.200457 0.154997 0.0270827 0.225255 0.159497 0.0272733 0.252393 0.15273 0.0330713 0.284144 0.15135 0.0313875 0.309532 0.15311 0.0337676 0.33175 0.152531 0.0257476 0.35036 0.15185 0.031631 0.380436 0.152086 0.0333392 0.405113 0.154064 0.0266202 0.428439 0.152927 0.0347703 0.450491 0.152957 0.0348774 0.482086 0.156145 0.0562652 0.00979539 0.15761 0.0551945 0.0268618 0.156867 0.0581811 0.0525277 0.158807 0.0572755 0.0840339 0.157689 0.0530104 0.103177 0.159011 0.0515517 0.130318 0.152657 0.0561163 0.156384 0.154007 0.0530967 0.184597 0.158999 0.0551528 0.201204 0.159771 0.0549672 0.229217 0.154333 0.0518555 0.256468 0.15377 0.058607 0.278286 0.153963 0.0598335 0.307232 0.151248 0.0537422 0.325779 0.150411 0.059249 0.357728 0.152617 0.0578668 0.377254 0.156527 0.0562296 0.408423 0.157819 0.0514337 0.425338 0.153883 0.0523339 0.450217 0.157532 0.0578859 0.478392 0.156445 0.0795126 0.00405881 0.150739 0.078779 0.0309104 0.152078 0.07856 0.0579784 0.158934 0.0836895 0.0781008 0.157778 0.0780665 0.102911 0.159002 0.0808945 0.125724 0.15812 0.0750535 0.157139 0.15588 0.0820931 0.180413 0.158054 0.0791214 0.200994 0.158338 0.0773121 0.234382 0.157477 0.0839265 0.255799 0.156117 0.0771358 0.280792 0.152172 0.0809899 0.308302 0.154622 0.0778074 0.327131 0.15237 0.0824384 0.358201 0.152054 0.0762494 0.378632 0.151811 0.0844436 0.40904 0.15847 0.0773029 0.426129 0.156424 0.0831462 0.458501 0.155839 0.0814919 0.476372 0.159911 0.10706 0.00871332 0.155181 0.108301 0.0260172 0.150391 0.108615 0.0560004 0.158984 0.105313 0.0843476 0.159641 0.108727 0.108366 0.159429 0.104044 0.129633 0.154632 0.102074 0.156874 0.158288 0.102185 0.183994 0.157022 0.107958 0.200289 0.159732 0.107006 0.230194 0.15343 0.101073 0.255166 0.152034 0.106453 0.280939 0.157089 0.101834 0.305488 0.150565 0.107283 0.33341 0.152398 0.103957 0.353273 0.150997 0.109526 0.375774 0.151235 0.109684 0.404794 0.15354 0.10829 0.431824 0.15113 0.101271 0.454418 0.152893 0.10603 0.477842 0.151436 0.12511 0.0072511 0.156157 0.131943 0.0325421 0.155635 0.125092 0.0540276 0.157476 0.125218 0.0842583 0.158614 0.12854 0.109729 0.151596 0.128706 0.131802 0.156703 0.12732 0.155799 0.151166 0.125367 0.177346 0.152998 0.129565 0.204736 0.154633 0.130773 0.232269 0.152622 0.128012 0.251097 0.154205 0.126123 0.282679 0.154272 0.134357 0.302305 0.152431 0.127944 0.333512 0.15498 0.131362 0.356586 0.151973 0.126317 0.382822 0.156391 0.128177 0.40044 0.159194 0.128807 0.432804 0.150823 0.130921 0.456478 0.153085 0.128096 0.4784 0.153578 0.15935 0.00466592 0.156972 0.155666 0.0327421 0.150231 0.157312 0.0590524 0.155648 0.156721 0.0751086 0.150251 0.157276 0.104463 0.151672 0.15071 0.127552 0.156285 0.153014 0.156105 0.155896 0.154103 0.178494 0.15309 0.154374 0.204981 0.150966 0.151436 0.230359 0.151195 0.150983 0.252587 0.1593 0.157191 0.275375 0.150256 0.157064 0.300002 0.155678 0.15302 0.325945 0.153519 0.159756 0.35795 0.157698 0.154515 0.383484 0.152859 0.15364 0.403463 0.156689 0.159456 0.425016 0.153462 0.15951 0.451701 0.159599 0.159089 0.477788 0.151376 0.182328 0.00525035 0.157773 0.178884 0.0270049 0.156289 0.184957 0.0516107 0.157495 0.17829 0.0807198 0.153967 0.184208 0.103954 0.150274 0.17902 0.134855 0.154219 0.18025 0.152207 0.151738 0.1793 0.183735 0.151018 0.181395 0.207715 0.156481 0.183149 0.230639 0.159472 0.177787 0.254053 0.156701 0.181758 0.282818 0.156954 0.17775 0.300561 0.155093 0.17544 0.329723 0.15149 0.1811 0.356221 0.150994 0.180212 0.381276 0.155186 0.179259 0.408153 0.158528 0.175679 0.430466 0.159102 0.177559 0.45811 0.159188 0.18196 0.478902 0.158378 0.204186 0.00475498 0.15912 0.209812 0.0289667 0.159228 0.209288 0.054762 0.15074 0.208388 0.0787842 0.15488 0.209659 0.104612 0.15965 0.200386 0.134725 0.151789 0.20721 0.157075 0.150863 0.203851 0.177212 0.15391 0.209883 0.201582 0.15515 0.209194 0.234317 0.151104 0.20436 0.254508 0.154159 0.202654 0.280517 0.159802 0.200647 0.302617 0.153734 0.20684 0.330482 0.15602 0.208047 0.35009 0.151771 0.205287 0.376854 0.157336 0.202062 0.403945 0.157133 0.206747 0.432798 0.15946 0.208066 0.452712 0.156171 0.206739 0.484051 0.150919 0.233924 0.00522863 0.158913 0.22534 0.0310011 0.156335 0.228266 0.0590849 0.15977 0.225457 0.0841289 0.155383 0.226011 0.101486 0.153722 0.233983 0.130899 0.151734 0.229371 0.151468 0.157378 0.233221 0.17515 0.152617 0.229833 0.206587 0.15253 0.225049 0.22666 0.15705 0.226252 0.258786 0.15179 0.231396 0.275009 0.158606 0.23258 0.305349 0.151365 0.234614 0.328567 0.15468 0.226705 0.359353 0.152971 0.234328 0.384694 0.159086 0.232541 0.404655 0.158598 0.233217 0.426331 0.155037 0.231527 0.456756 0.156568 0.228349 0.479828 0.158518 0.255211 0.00199029 0.15399 0.256455 0.029741 0.156897 0.256942 0.0549913 0.156685 0.256133 0.0848367 0.158106 0.253404 0.103131 0.151575 0.251588 0.128545 0.151145 0.251531 0.150534 0.151618 0.253087 0.179272 0.150819 0.258541 0.208348 0.154457 0.254573 0.225345 0.152613 0.251361 0.253337 0.152951 0.255864 0.27747 0.15868 0.255026 0.308948 0.158847 0.253902 0.330131 0.15708 0.2512 0.353791 0.156932 0.254791 0.382142 0.153922 0.259244 0.406971 0.154528 0.250201 0.434715 0.154196 0.258108 0.451342 0.159365 0.252381 0.477494 0.156885 0.278892 0.000431181 0.151384 0.280846 0.0343532 0.158965 0.279494 0.052876 0.158669 0.280835 0.0752381 0.151 0.284463 0.103185 0.155115 0.276043 0.13247 0.157678 0.278305 0.155311 0.156536 0.277464 0.176177 0.156954 0.275802 0.202019 0.157482 0.275973 0.230782 0.150436 0.282653 0.259364 0.157691 0.284674 0.283982 0.152512 0.283674 0.307052 0.157008 0.279324 0.329805 0.154499 0.279078 0.357488 0.153259 0.280254 0.37619 0.151901 0.27561 0.404454 0.158444 0.282968 0.425336 0.156914 0.28304 0.453055 0.150426 0.275143 0.479147 0.154553 0.301369 0.000758385 0.154173 0.304372 0.0320742 0.153857 0.306326 0.0544376 0.151744 0.304142 0.0795608 0.150004 0.300982 0.104566 0.157396 0.301159 0.131036 0.158693 0.304949 0.153462 0.15305 0.300729 0.180205 0.156504 0.300343 0.207083 0.157045 0.306679 0.228381 0.153339 0.30299 0.254385 0.150384 0.304484 0.282944 0.150173 0.309043 0.306165 0.15322 0.302389 0.328101 0.153634 0.30468 0.356061 0.154451 0.308829 0.379435 0.159198 0.303762 0.406856 0.151964 0.305167 0.433655 0.151051 0.300061 0.455079 0.150231 0.301849 0.481187 0.150575 0.32986 0.00313664 0.150832 0.333287 0.025951 0.150651 0.326593 0.0525373 0.158819 0.333665 0.0829453 0.15232 0.328485 0.102743 0.155159 0.328907 0.129423 0.150169 0.327348 0.157745 0.155961 0.328971 0.180157 0.150967 0.331743 0.207596 0.156675 0.33256 0.229688 0.152685 0.329652 0.251861 0.155075 0.327343 0.275261 0.156913 0.332345 0.303286 0.155245 0.328715 0.326117 0.156727 0.329381 0.35641 0.152679 0.330255 0.383255 0.159955 0.32531 0.409922 0.154424 0.328218 0.429428 0.152636 0.325255 0.451365 0.157598 0.331561 0.483045 0.155686 0.359313 0.00494895 0.15735 0.357945 0.0273622 0.15351 0.353507 0.0553206 0.15638 0.355558 0.0829377 0.153804 0.351146 0.103626 0.150422 0.354609 0.132703 0.157613 0.356812 0.153981 0.150936 0.352693 0.18086 0.150385 0.358538 0.20088 0.154424 0.35035 0.22521 0.157235 0.352437 0.250239 0.158355 0.354998 0.278861 0.153581 0.359755 0.306348 0.151358 0.353807 0.327894 0.156 0.354706 0.359497 0.15034 0.350347 0.377684 0.15169 0.351359 0.403306 0.157287 0.351125 0.43473 0.152618 0.357069 0.452204 0.152164 0.3538 0.478051 0.152209 0.382239 0.00878488 0.158111 0.37523 0.0303121 0.158121 0.381798 0.0540619 0.150039 0.384075 0.0771097 0.152998 0.384346 0.10181 0.154327 0.380211 0.126807 0.155586 0.377499 0.154807 0.156125 0.375597 0.179692 0.152523 0.375893 0.206061 0.159526 0.381413 0.232192 0.154768 0.384705 0.253225 0.152211 0.38472 0.276837 0.155086 0.376381 0.302295 0.154588 0.384543 0.329288 0.158728 0.38056 0.358194 0.154499 0.379209 0.377735 0.151596 0.375517 0.400946 0.158195 0.381567 0.43341 0.158553 0.379457 0.459572 0.151539 0.380774 0.484155 0.153885 0.408636 0.00120081 0.154249 0.403251 0.0289347 0.155064 0.406192 0.0548455 0.156751 0.402757 0.0786534 0.155493 0.408863 0.105401 0.15704 0.407974 0.131221 0.150882 0.407091 0.156435 0.153202 0.40632 0.183669 0.1586 0.408147 0.206415 0.156199 0.406822 0.229822 0.15148 0.402258 0.253733 0.156362 0.409911 0.279126 0.152176 0.403149 0.306215 0.150657 0.403363 0.334759 0.1524 0.405024 0.354289 0.155901 0.405445 0.381483 0.152063 0.403375 0.400483 0.155527 0.402918 0.427995 0.150483 0.403252 0.45065 0.158748 0.401266 0.47941 0.158511 0.434024 0.00192286 0.158974 0.425179 0.0334013 0.157023 0.428802 0.0562681 0.156395 0.433501 0.0764943 0.159525 0.433892 0.102987 0.15035 0.427931 0.127274 0.158601 0.432532 0.153446 0.151818 0.42921 0.182545 0.150306 0.428792 0.201869 0.152853 0.425159 0.227408 0.15904 0.426056 0.253727 0.157636 0.428347 0.284287 0.15618 0.425881 0.307453 0.15738 0.434399 0.327112 0.15144 0.430419 0.351466 0.152636 0.427186 0.37734 0.151899 0.427025 0.404085 0.151694 0.434753 0.434497 0.159451 0.425087 0.451971 0.159332 0.429547 0.482404 0.157371 0.455755 0.00384054 0.155094 0.455201 0.0304059 0.159431 0.456567 0.0588053 0.159542 0.458975 0.0843704 0.154159 0.453969 0.106681 0.152056 0.458799 0.127187 0.151427 0.454601 0.150143 0.157284 0.450614 0.17752 0.158891 0.455649 0.200503 0.154264 0.455825 0.22702 0.154391 0.454584 0.250937 0.150862 0.450577 0.278896 0.156737 0.455363 0.307662 0.153651 0.451382 0.332866 0.155841 0.458632 0.357843 0.15641 0.458649 0.375192 0.157852 0.452004 0.409577 0.155905 0.451197 0.427654 0.155385 0.454836 0.453941 0.159106 0.451359 0.482755 0.152128 0.48146 0.00044879 0.154838 0.48403 0.0316008 0.155932 0.476596 0.0542739 0.151824 0.482156 0.0814684 0.157391 0.481803 0.106981 0.150473 0.483333 0.132438 0.152889 0.477805 0.154908 0.153221 0.482437 0.178859 0.155435 0.483081 0.206989 0.154009 0.477305 0.225689 0.155561 0.482862 0.253681 0.152724 0.481503 0.282685 0.150968 0.480352 0.302637 0.159345 0.480576 0.329372 0.15293 0.475194 0.351122 0.151099 0.47877 0.376918 0.154852 0.478619 0.407093 0.155898 0.477462 0.429904 0.158055 0.477996 0.453456 0.155196 0.482275 0.475246 0.154124 0.504723 0.00813588 0.150235 0.503399 0.0293499 0.157825 0.504312 0.0543444 0.150067 0.502077 0.0774817 0.153565 0.507811 0.101606 0.152952 0.500088 0.132225 0.152366 0.505137 0.158607 0.152309 0.509836 0.181109 0.153475 0.508164 0.207868 0.152279 0.505601 0.227133 0.157165 0.502945 0.254936 0.154632 0.504586 0.283261 0.15427 0.506054 0.308131 0.151458 0.502667 0.331679 0.150213 0.509616 0.358273 0.153102 0.503574 0.377054 0.154197 0.507911 0.405619 0.154043 0.508311 0.431121 0.151997 0.50212 0.458646 0.158119 0.503655 0.482013 0.152604 0.526827 0.00140278 0.150071 0.532609 0.0326544 0.15196 0.533114 0.0566957 0.156183 0.526726 0.0765873 0.158501 0.531869 0.101822 0.158631 0.527443 0.129271 0.156594 0.532774 0.156679 0.158278 0.534549 0.184048 0.155593 0.529601 0.205878 0.154843 0.526682 0.233712 0.150317 0.525182 0.252378 0.158788 0.532259 0.282582 0.15852 0.52865 0.306996 0.154472 0.533213 0.333886 0.155852 0.529356 0.357127 0.156177 0.533061 0.379593 0.155745 0.531293 0.405842 0.159665 0.526779 0.433571 0.159392 0.529987 0.455284 0.158145 0.532025 0.476408 0.157585 0.555373 0.00447212 0.158189 0.557928 0.0343474 0.152173 0.553888 0.0529977 0.153006 0.556322 0.0768947 0.150601 0.551013 0.108218 0.154358 0.555701 0.127476 0.152351 0.55458 0.152642 0.158959 0.555403 0.175416 0.154195 0.558498 0.200227 0.157202 0.555594 0.234137 0.153734 0.557934 0.258941 0.15054 0.558877 0.281018 0.151403 0.550384 0.305346 0.154352 0.555021 0.333657 0.153744 0.556869 0.35937 0.158742 0.554742 0.375172 0.152922 0.559783 0.409576 0.15442 0.558874 0.426712 0.156213 0.552245 0.455283 0.158166 0.557157 0.475797 0.153161 0.58031 0.0092568 0.156086 0.580217 0.0320268 0.152661 0.581805 0.0592785 0.15153 0.583277 0.0758273 0.156174 0.58219 0.109589 0.155515 0.575634 0.133931 0.152473 0.584685 0.154211 0.152437 0.578611 0.177353 0.151588 0.579461 0.205439 0.150832 0.576019 0.225622 0.150073 0.583051 0.257996 0.15034 0.576707 0.283427 0.150069 0.579246 0.302389 0.150828 0.578669 0.330846 0.159243 0.576236 0.358863 0.154067 0.582129 0.376961 0.150362 0.575201 0.40272 0.156718 0.582398 0.429612 0.158165 0.57959 0.458089 0.15938 0.577309 0.476792 0.156717 0.600991 0.00798377 0.158996 0.603298 0.0316628 0.156653 0.607557 0.0516577 0.152279 0.608939 0.0839046 0.154777 0.603979 0.106727 0.154186 0.608788 0.132935 0.151068 0.602377 0.151019 0.158736 0.609368 0.178927 0.153911 0.6002 0.205942 0.157805 0.608232 0.23367 0.155389 0.604688 0.253504 0.157221 0.607917 0.275162 0.155161 0.605518 0.307411 0.154037 0.600965 0.333801 0.155198 0.605209 0.359476 0.156793 0.606791 0.378629 0.15167 0.609051 0.403109 0.159674 0.600586 0.42882 0.157395 0.607007 0.45048 0.158027 0.601128 0.478529 0.155445 0.628307 0.00629984 0.159579 0.626554 0.0324279 0.153387 0.631479 0.0571599 0.15922 0.633031 0.0831113 0.153128 0.628858 0.109586 0.154502 0.626019 0.12648 0.159392 0.633551 0.159244 0.156797 0.634575 0.178871 0.158957 0.633095 0.20658 0.155172 0.631344 0.232436 0.150198 0.634461 0.25138 0.157765 0.629883 0.276111 0.155082 0.633837 0.30744 0.151357 0.629818 0.325657 0.153982 0.625207 0.356776 0.157492 0.625397 0.383774 0.154891 0.631141 0.408643 0.152713 0.6345 0.426302 0.15612 0.628119 0.456732 0.157547 0.630411 0.477934 0.150967 0.659212 0.00603488 0.152691 0.659204 0.0307122 0.150812 0.655146 0.0540881 0.153335 0.655263 0.0849131 0.154963 0.655012 0.105529 0.155233 0.656374 0.130223 0.155951 0.6583 0.155781 0.157853 0.652026 0.184417 0.156189 0.654167 0.204494 0.150399 0.651384 0.231215 0.150183 0.658167 0.257264 0.156861 0.650381 0.284846 0.15052 0.65169 0.306648 0.152931 0.657873 0.329615 0.151364 0.650374 0.354957 0.158714 0.658807 0.380664 0.152579 0.656375 0.405586 0.152116 0.650699 0.434205 0.15354 0.656325 0.452583 0.153288 0.656388 0.475873 0.155805 0.675637 0.00429378 0.151459 0.680331 0.0282439 0.159599 0.684138 0.0509153 0.153759 0.68234 0.0827993 0.155295 0.676928 0.106328 0.158638 0.681819 0.125617 0.159585 0.683408 0.155596 0.150261 0.681449 0.1779 0.153221 0.683311 0.205803 0.155304 0.679494 0.231783 0.159344 0.679906 0.254247 0.159006 0.677739 0.276754 0.151685 0.682557 0.308763 0.159333 0.684155 0.327133 0.15117 0.684424 0.3568 0.155439 0.683137 0.376007 0.15122 0.675404 0.404738 0.150475 0.681551 0.430216 0.151123 0.676272 0.453861 0.157305 0.681098 0.477324 0.157554 0.701019 0.00974046 0.151751 0.700636 0.0250691 0.156794 0.703286 0.0590141 0.157666 0.709059 0.0756326 0.154993 0.70878 0.107149 0.150598 0.703196 0.13317 0.153063 0.70007 0.156374 0.159212 0.706401 0.183425 0.151866 0.705482 0.201065 0.154513 0.701589 0.229307 0.151355 0.702379 0.253744 0.15774 0.707843 0.283898 0.15427 0.706744 0.3039 0.158797 0.70143 0.327794 0.153516 0.702472 0.350632 0.153005 0.70385 0.376559 0.156198 0.709568 0.401129 0.158765 0.706797 0.432496 0.153821 0.706607 0.455643 0.150944 0.700872 0.479686 0.151468 0.728868 0.0070934 0.154464 0.727194 0.0303011 0.159927 0.727083 0.0579044 0.159463 0.732737 0.0790485 0.150232 0.726559 0.106051 0.153226 0.7258 0.133007 0.154689 0.731854 0.155719 0.15565 0.726146 0.182596 0.156958 0.730106 0.207914 0.159189 0.730056 0.229718 0.158357 0.726179 0.253432 0.150892 0.730297 0.276575 0.159224 0.733997 0.302474 0.150972 0.728217 0.329245 0.1535 0.733618 0.355179 0.150358 0.733836 0.381835 0.156474 0.728415 0.40466 0.159739 0.733928 0.42577 0.150315 0.725017 0.454813 0.1586 0.728507 0.475979 0.178753 0.00359285 0.00545751 0.177667 0.00719486 0.0280323 0.181242 0.000760688 0.0526622 0.1805 0.00342988 0.0804907 0.183654 0.000493491 0.103364 0.182987 0.00626891 0.132113 0.177988 0.00134278 0.157225 0.183798 0.00349825 0.184123 0.181059 0.00597211 0.203398 0.17598 0.000217647 0.225781 0.179274 0.00202563 0.258261 0.181319 0.00495505 0.278474 0.183293 0.00656687 0.309266 0.183207 0.00540334 0.33139 0.180546 0.00784021 0.354664 0.178523 0.00714942 0.376923 0.176022 0.00536278 0.407573 0.179349 0.00720556 0.428154 0.175307 0.00404669 0.457983 0.183956 0.00646787 0.478646 0.178226 0.0324583 0.00537886 0.176022 0.0274031 0.029754 0.183018 0.034361 0.0502569 0.175749 0.0324851 0.0793602 0.178236 0.0307974 0.106778 0.180159 0.0263106 0.131807 0.17818 0.0291352 0.152278 0.178702 0.0269374 0.175372 0.184763 0.0303697 0.204614 0.175702 0.0255367 0.225638 0.175218 0.0342611 0.257269 0.181439 0.0338032 0.277485 0.179722 0.0278532 0.307567 0.182724 0.0329218 0.330636 0.176453 0.0290941 0.351924 0.182138 0.0277623 0.382857 0.178267 0.0339594 0.404336 0.18324 0.0264988 0.430583 0.181355 0.030135 0.455688 0.175668 0.0338859 0.48199 0.175605 0.0533152 0.00784825 0.180196 0.0522175 0.0287402 0.181372 0.0527347 0.0539095 0.18352 0.0524562 0.0822051 0.181865 0.058389 0.10677 0.18191 0.0585447 0.128955 0.181363 0.0586139 0.1572 0.175437 0.0543018 0.179996 0.177578 0.0544543 0.205996 0.176754 0.0500979 0.23302 0.18248 0.0596189 0.258967 0.180433 0.0525229 0.281151 0.177331 0.0520373 0.305477 0.184653 0.0572491 0.328299 0.182478 0.0517196 0.353979 0.17806 0.0506346 0.377179 0.177087 0.0598578 0.409282 0.18204 0.0565262 0.429971 0.184014 0.0558459 0.451159 0.184268 0.0532176 0.478849 0.177947 0.0785408 0.0070416 0.183742 0.079894 0.03295 0.184392 0.0785243 0.0540843 0.181329 0.0774923 0.0762396 0.182059 0.0799316 0.10419 0.178895 0.0791798 0.133843 0.177337 0.0794258 0.158306 0.17757 0.0757529 0.179999 0.183564 0.075723 0.208299 0.18273 0.0794575 0.230323 0.17817 0.075566 0.258179 0.179861 0.078354 0.280131 0.182513 0.0823101 0.307191 0.182941 0.0838771 0.326833 0.183888 0.0829529 0.350148 0.182749 0.0825531 0.377928 0.183241 0.0768111 0.402708 0.178645 0.0788364 0.432069 0.183287 0.0826009 0.459056 0.181172 0.0777064 0.479202 0.181601 0.10547 0.00772935 0.183514 0.106502 0.0264701 0.184624 0.104891 0.0589185 0.175011 0.104402 0.084952 0.180632 0.109113 0.105038 0.17884 0.105281 0.130929 0.178405 0.101848 0.156767 0.180127 0.107499 0.180664 0.179563 0.102837 0.205509 0.17985 0.109081 0.230722 0.175543 0.107829 0.254467 0.181663 0.102747 0.280615 0.181804 0.106045 0.301219 0.181716 0.104051 0.328776 0.179995 0.103895 0.358269 0.176422 0.106722 0.376457 0.178643 0.104599 0.401738 0.184206 0.105301 0.427726 0.184723 0.107537 0.453249 0.175206 0.102044 0.483967 0.18435 0.125043 9.47238e-05 0.18388 0.134029 0.031864 0.178619 0.126865 0.0511968 0.176747 0.126848 0.0816794 0.177328 0.12533 0.108734 0.184914 0.128067 0.134282 0.184323 0.130577 0.157323 0.178793 0.125809 0.175164 0.180554 0.126485 0.205927 0.177986 0.126422 0.225809 0.175495 0.127367 0.256881 0.181129 0.127051 0.280306 0.182221 0.132299 0.304178 0.17702 0.133696 0.325497 0.181186 0.130568 0.356033 0.179773 0.126049 0.384154 0.175905 0.132281 0.404723 0.175689 0.125797 0.425255 0.182063 0.127011 0.457782 0.181858 0.126417 0.477878 0.175518 0.157128 0.0054697 0.176307 0.159055 0.0270945 0.182119 0.159002 0.059295 0.180068 0.153903 0.0801809 0.177531 0.157233 0.10395 0.17875 0.150464 0.131558 0.18249 0.157109 0.159389 0.183109 0.155891 0.182285 0.175422 0.1521 0.205881 0.184087 0.159283 0.231994 0.184431 0.155734 0.257285 0.181153 0.159696 0.275194 0.175063 0.151688 0.303834 0.17837 0.156698 0.326101 0.183452 0.156305 0.356088 0.180138 0.150409 0.38359 0.175843 0.157068 0.40774 0.175139 0.15986 0.433807 0.179167 0.151934 0.45694 0.176322 0.158145 0.477118 0.179035 0.175331 0.00924641 0.178292 0.18344 0.027129 0.177196 0.176559 0.0547291 0.178537 0.17657 0.0821625 0.180452 0.183469 0.108512 0.179624 0.177489 0.131843 0.183351 0.184391 0.150973 0.183798 0.179206 0.175152 0.179286 0.179252 0.204243 0.18115 0.180983 0.23416 0.182624 0.181974 0.258465 0.176665 0.183246 0.281093 0.184589 0.178416 0.303534 0.181694 0.179716 0.325114 0.17874 0.184614 0.350038 0.181052 0.176973 0.378983 0.177799 0.181615 0.406486 0.17989 0.183664 0.426133 0.175174 0.177445 0.457031 0.177861 0.176836 0.484043 0.176593 0.209306 0.00418574 0.18283 0.208347 0.0266962 0.177919 0.20412 0.0534022 0.183445 0.203135 0.0769529 0.177117 0.201441 0.10619 0.176868 0.2028 0.127544 0.179418 0.200081 0.15787 0.183516 0.209306 0.183279 0.177912 0.207738 0.202541 0.176719 0.206522 0.234534 0.184057 0.208765 0.257747 0.178972 0.207818 0.284752 0.176838 0.20505 0.303813 0.182464 0.202044 0.330777 0.178676 0.20572 0.355431 0.183504 0.2058 0.384689 0.178841 0.205826 0.402937 0.184645 0.208815 0.430534 0.178374 0.204775 0.457835 0.175533 0.204111 0.476246 0.176777 0.225807 0.00248013 0.18274 0.227888 0.0328083 0.183479 0.230689 0.053645 0.17678 0.23443 0.0770406 0.183868 0.228266 0.107541 0.176038 0.227915 0.126409 0.179262 0.227463 0.156439 0.17768 0.23326 0.181497 0.176118 0.229702 0.205072 0.181722 0.233369 0.230289 0.175467 0.225206 0.258835 0.182244 0.233902 0.281687 0.177468 0.229667 0.306768 0.177882 0.230322 0.332341 0.179065 0.230334 0.354364 0.176315 0.225355 0.383898 0.183325 0.232255 0.402075 0.178492 0.227965 0.428857 0.175209 0.23455 0.457371 0.178182 0.22979 0.476241 0.177717 0.253808 0.00640722 0.179193 0.252059 0.0330529 0.178798 0.252429 0.0544947 0.177227 0.25041 0.0786913 0.181703 0.256043 0.104594 0.182189 0.251363 0.130246 0.181578 0.257206 0.154037 0.177739 0.257711 0.181568 0.181312 0.259499 0.201473 0.182714 0.253651 0.225335 0.177559 0.255407 0.256565 0.182718 0.256958 0.278872 0.180325 0.252922 0.30747 0.179494 0.253088 0.334457 0.176564 0.255826 0.35347 0.177977 0.251205 0.375641 0.179506 0.251762 0.40218 0.175395 0.256552 0.431481 0.182001 0.253846 0.451827 0.18491 0.254701 0.48171 0.179527 0.275759 0.000127878 0.178975 0.279048 0.0338611 0.182953 0.281817 0.0580908 0.181093 0.278899 0.0805013 0.180043 0.276949 0.109955 0.182002 0.280846 0.134428 0.182077 0.282777 0.158962 0.179513 0.28438 0.179718 0.184384 0.281087 0.207696 0.175003 0.279759 0.23168 0.182915 0.277811 0.251696 0.178312 0.279492 0.27964 0.175473 0.276285 0.301181 0.182494 0.276351 0.332651 0.182285 0.275341 0.354407 0.175081 0.281823 0.384004 0.178429 0.281748 0.401996 0.180648 0.27841 0.428767 0.183455 0.279197 0.458327 0.179927 0.279236 0.48268 0.183202 0.309157 0.00324738 0.18348 0.301255 0.0261062 0.182858 0.30584 0.0518098 0.18484 0.309113 0.0754261 0.183473 0.307048 0.101281 0.18414 0.300049 0.130051 0.179689 0.306164 0.151153 0.17872 0.30493 0.182209 0.177276 0.305176 0.201621 0.177232 0.304111 0.228642 0.182708 0.309226 0.256562 0.176279 0.303992 0.27994 0.17961 0.307477 0.309066 0.177093 0.305925 0.325373 0.179184 0.301512 0.355918 0.178848 0.305932 0.384017 0.17626 0.307752 0.407949 0.178259 0.301388 0.427393 0.175537 0.302308 0.452229 0.177653 0.303988 0.478886 0.182437 0.326385 0.00600277 0.184713 0.334518 0.0287471 0.179982 0.331644 0.0580103 0.177935 0.326442 0.0768772 0.175588 0.331525 0.107664 0.17751 0.333841 0.125705 0.182297 0.334629 0.156336 0.180497 0.334282 0.182814 0.182165 0.332393 0.204625 0.178705 0.332936 0.225338 0.181576 0.328822 0.251396 0.176781 0.334164 0.28126 0.176498 0.331556 0.301285 0.177665 0.33072 0.33309 0.17711 0.328048 0.353223 0.183128 0.328084 0.378687 0.181576 0.328558 0.404775 0.182502 0.334191 0.426606 0.18188 0.326824 0.451541 0.178711 0.328554 0.478136 0.17707 0.358679 0.0064105 0.179914 0.356266 0.0336139 0.179937 0.358632 0.0516601 0.181878 0.350217 0.0750032 0.176819 0.357553 0.107737 0.175795 0.35743 0.131209 0.184239 0.359635 0.153005 0.179062 0.351125 0.179158 0.18396 0.352833 0.207503 0.182892 0.35809 0.232969 0.177585 0.352417 0.254581 0.184603 0.358684 0.277512 0.176704 0.356244 0.309505 0.18113 0.359383 0.332291 0.17668 0.353799 0.355645 0.184814 0.351737 0.378139 0.176253 0.35959 0.407761 0.178246 0.356807 0.434241 0.175177 0.353022 0.457624 0.18465 0.350344 0.479778 0.182535 0.383161 0.00817496 0.179578 0.381226 0.0307983 0.180988 0.384379 0.0513059 0.18475 0.383431 0.080778 0.175265 0.384369 0.101817 0.184467 0.380854 0.133097 0.182905 0.383965 0.152213 0.183089 0.37526 0.177851 0.181592 0.378365 0.207243 0.17513 0.375633 0.229384 0.181725 0.382359 0.255505 0.18187 0.384216 0.275049 0.176346 0.384089 0.309616 0.181292 0.37956 0.334795 0.177787 0.381789 0.357625 0.182611 0.37999 0.376741 0.183131 0.38219 0.40551 0.178599 0.379095 0.43233 0.175041 0.382532 0.45592 0.182063 0.38222 0.478609 0.180541 0.402203 0.000606283 0.181014 0.406429 0.0279633 0.17722 0.402876 0.0549177 0.17792 0.407937 0.078299 0.176177 0.407226 0.105483 0.181325 0.404521 0.133734 0.184078 0.405636 0.151517 0.176255 0.400822 0.181917 0.175497 0.400145 0.203383 0.180585 0.403194 0.233651 0.180394 0.406967 0.253647 0.184955 0.404921 0.275407 0.183565 0.406767 0.305446 0.176978 0.408846 0.328935 0.181838 0.406651 0.35281 0.17739 0.402785 0.376551 0.176269 0.401309 0.40909 0.179317 0.408381 0.432614 0.175095 0.409001 0.450133 0.184584 0.405394 0.476158 0.176446 0.427693 0.0059298 0.176153 0.434649 0.0328537 0.183725 0.427699 0.0551505 0.178707 0.43198 0.0774441 0.177526 0.432665 0.107238 0.181389 0.432146 0.129188 0.181039 0.427963 0.15347 0.175754 0.429105 0.183894 0.178017 0.426504 0.208985 0.18333 0.433893 0.233526 0.180435 0.429046 0.253001 0.175788 0.428064 0.275419 0.179298 0.434025 0.300172 0.180169 0.431705 0.32644 0.176752 0.42687 0.352661 0.178311 0.429674 0.384599 0.184394 0.428843 0.408579 0.179026 0.43055 0.429672 0.177532 0.430115 0.45388 0.181819 0.428421 0.482506 0.178669 0.450888 0.00711387 0.182655 0.454025 0.0345845 0.184991 0.456963 0.055063 0.176897 0.450302 0.0822407 0.184445 0.455451 0.102504 0.181732 0.45733 0.127631 0.180951 0.454335 0.156143 0.183408 0.45284 0.177079 0.179802 0.453548 0.200686 0.176993 0.454451 0.232827 0.18192 0.45153 0.252923 0.184439 0.457852 0.275126 0.178952 0.451018 0.300445 0.184368 0.459809 0.325446 0.177663 0.456938 0.354847 0.18313 0.459697 0.3788 0.184326 0.45793 0.407873 0.184194 0.456612 0.433989 0.177657 0.455548 0.450939 0.176794 0.459684 0.482324 0.182733 0.481853 0.00933997 0.178604 0.484032 0.0302121 0.178015 0.478624 0.0548026 0.184776 0.482973 0.0848214 0.183472 0.48229 0.103735 0.176744 0.480335 0.131328 0.180376 0.476595 0.153742 0.179148 0.478031 0.17857 0.181279 0.483704 0.205768 0.177436 0.481155 0.229145 0.180671 0.480143 0.259386 0.177952 0.477091 0.278483 0.182377 0.478526 0.309623 0.181795 0.480374 0.327995 0.18291 0.480134 0.357755 0.179639 0.484192 0.378877 0.176105 0.477388 0.405962 0.181874 0.479817 0.425055 0.182672 0.478563 0.457891 0.180357 0.476507 0.480107 0.175692 0.502407 0.00835023 0.175072 0.504488 0.031552 0.179781 0.503358 0.057192 0.176595 0.50462 0.0803819 0.180323 0.507175 0.107046 0.18154 0.503817 0.133093 0.175969 0.504981 0.153077 0.17865 0.509005 0.176167 0.182044 0.50354 0.206637 0.183551 0.504862 0.228853 0.183692 0.50636 0.258915 0.182558 0.50285 0.278599 0.177934 0.505074 0.30831 0.181286 0.509179 0.327756 0.177724 0.506007 0.354125 0.182329 0.505985 0.378287 0.182986 0.508292 0.400164 0.180231 0.506988 0.430435 0.183877 0.502344 0.455532 0.18101 0.500361 0.478434 0.177051 0.528327 0.00871305 0.176785 0.525899 0.0271986 0.184898 0.532262 0.0584682 0.179527 0.534412 0.0771511 0.179868 0.527282 0.108845 0.183119 0.534919 0.128354 0.184206 0.530019 0.150464 0.18042 0.525747 0.176849 0.178611 0.527508 0.206406 0.181225 0.525626 0.225885 0.183954 0.526532 0.258919 0.179008 0.533811 0.278419 0.179515 0.533356 0.309327 0.18275 0.53134 0.327086 0.17664 0.531168 0.352746 0.184808 0.525064 0.3841 0.178235 0.533626 0.407815 0.182946 0.532052 0.426556 0.1841 0.527039 0.450108 0.17901 0.53246 0.47823 0.176785 0.551192 0.00834593 0.178157 0.550076 0.0338038 0.175554 0.55968 0.0530346 0.180636 0.551889 0.0839147 0.179606 0.554637 0.107797 0.179927 0.55614 0.128354 0.177196 0.557544 0.150605 0.180836 0.559992 0.184802 0.178877 0.555885 0.204366 0.180334 0.55752 0.231878 0.180479 0.555061 0.25572 0.176272 0.553503 0.27984 0.183208 0.554615 0.308505 0.181602 0.553233 0.329734 0.1794 0.555704 0.354054 0.183308 0.55881 0.379976 0.182853 0.559951 0.405915 0.184692 0.553053 0.430028 0.179138 0.558593 0.455125 0.182746 0.554634 0.475352 0.184383 0.577728 0.00294392 0.181436 0.578786 0.0325754 0.178715 0.57923 0.0543808 0.183378 0.579094 0.0803446 0.184005 0.576287 0.1032 0.18 0.576766 0.128969 0.179053 0.583939 0.156565 0.182868 0.582452 0.179036 0.179472 0.583891 0.20971 0.175133 0.583791 0.22755 0.178925 0.575976 0.256484 0.178226 0.581799 0.281848 0.178637 0.578566 0.304955 0.180651 0.575739 0.327828 0.184675 0.576005 0.355489 0.180088 0.575935 0.38338 0.178315 0.578714 0.408115 0.179176 0.584988 0.430436 0.183862 0.584085 0.454884 0.175254 0.575757 0.484372 0.180424 0.605533 0.00501804 0.18194 0.602743 0.0339293 0.177814 0.607374 0.0501316 0.178727 0.604304 0.0763254 0.175576 0.606995 0.107784 0.182713 0.608696 0.134643 0.176656 0.601781 0.158583 0.178315 0.60901 0.183986 0.18478 0.601487 0.202861 0.184295 0.603578 0.231825 0.18215 0.600511 0.25489 0.183371 0.603079 0.278831 0.182233 0.606607 0.303894 0.182514 0.600504 0.326663 0.176449 0.603264 0.350792 0.181423 0.600592 0.380012 0.180648 0.607087 0.409245 0.182092 0.606232 0.43066 0.177834 0.601342 0.453217 0.177376 0.607236 0.479165 0.182137 0.633143 0.00850624 0.175904 0.631139 0.0286444 0.180123 0.632507 0.0573331 0.175036 0.632338 0.0820794 0.183789 0.632312 0.102255 0.175815 0.626737 0.133119 0.179552 0.625536 0.150024 0.178443 0.629154 0.175646 0.176785 0.625154 0.209869 0.180168 0.631621 0.225621 0.178822 0.630493 0.257341 0.184769 0.63081 0.278753 0.179976 0.627148 0.300289 0.182931 0.633007 0.334273 0.181032 0.633108 0.354501 0.183251 0.634402 0.383879 0.184431 0.63022 0.405242 0.178972 0.633316 0.434242 0.178469 0.628639 0.454361 0.178115 0.632129 0.484155 0.180548 0.650132 0.00705351 0.182802 0.653962 0.034693 0.180726 0.654588 0.0548521 0.183062 0.65594 0.0824074 0.177223 0.653406 0.108602 0.176831 0.650582 0.125108 0.18009 0.651794 0.155173 0.181399 0.657403 0.182311 0.176485 0.650491 0.20929 0.184452 0.657027 0.229128 0.177358 0.653118 0.256731 0.178053 0.65708 0.281922 0.182431 0.651974 0.302613 0.181542 0.655646 0.331968 0.179577 0.658251 0.357504 0.176775 0.6535 0.380669 0.180595 0.651072 0.400826 0.182871 0.657527 0.429991 0.180171 0.656387 0.457139 0.179984 0.650441 0.477895 0.18079 0.678389 0.0044599 0.181891 0.681787 0.028197 0.177459 0.676749 0.0563973 0.177603 0.67823 0.0844076 0.180467 0.676717 0.106583 0.179852 0.678608 0.133682 0.177042 0.680271 0.155181 0.180509 0.684268 0.184609 0.176694 0.677839 0.207511 0.183712 0.682201 0.233983 0.177486 0.681359 0.252221 0.180019 0.680392 0.281757 0.177671 0.676083 0.307413 0.179148 0.680164 0.327597 0.184134 0.68249 0.350463 0.176155 0.678775 0.38017 0.181343 0.681564 0.405391 0.181594 0.682776 0.426678 0.178145 0.679563 0.45127 0.178883 0.678833 0.477589 0.181102 0.70923 0.00107779 0.18289 0.704712 0.0263588 0.183488 0.704423 0.0589013 0.180583 0.708662 0.0770446 0.18101 0.703315 0.101781 0.176241 0.707628 0.131689 0.18379 0.706627 0.152515 0.177651 0.700479 0.178022 0.184583 0.708542 0.206251 0.176882 0.707377 0.227457 0.179818 0.702525 0.25447 0.180328 0.703619 0.281169 0.178364 0.703233 0.308233 0.178531 0.706531 0.332156 0.181823 0.700658 0.351394 0.183999 0.705314 0.382692 0.180633 0.701718 0.405279 0.176433 0.701012 0.429098 0.184885 0.702514 0.453798 0.181693 0.701502 0.484507 0.17519 0.72633 0.00343138 0.180925 0.72833 0.0324601 0.179247 0.732407 0.0535111 0.176199 0.731487 0.0837072 0.183883 0.732702 0.107379 0.181913 0.72604 0.126551 0.177055 0.729665 0.158646 0.183902 0.728928 0.181304 0.18001 0.731594 0.200648 0.184808 0.734104 0.233369 0.176071 0.732035 0.257834 0.179456 0.72613 0.281078 0.178815 0.72947 0.307143 0.184162 0.727872 0.327771 0.175145 0.727156 0.359044 0.177 0.731223 0.377012 0.183906 0.727526 0.405683 0.178783 0.733176 0.425295 0.1843 0.726616 0.450327 0.176445 0.732033 0.483652 0.20241 0.00157434 0.00358225 0.209252 0.00767356 0.0344701 0.20427 0.00643445 0.0573813 0.207287 0.00314912 0.0810615 0.20734 0.00061149 0.105251 0.202782 0.00410853 0.130757 0.204769 0.00716448 0.155038 0.207359 0.00711614 0.182262 0.207919 0.00532111 0.20249 0.204953 0.0048978 0.23114 0.202237 0.00907542 0.250862 0.203304 0.00339118 0.280317 0.20498 0.00489021 0.305707 0.20117 0.00153322 0.327708 0.204722 0.00243972 0.350404 0.206714 0.00255326 0.377866 0.201194 0.0052595 0.40963 0.207493 0.0073053 0.431812 0.208082 0.00349587 0.456604 0.201605 0.0046143 0.479086 0.204387 0.0283853 0.00404171 0.204703 0.0330959 0.031869 0.20692 0.0336265 0.0539822 0.207063 0.0315937 0.082036 0.206054 0.0275292 0.104192 0.206895 0.026201 0.13255 0.209503 0.0322624 0.150198 0.20362 0.0268755 0.184093 0.208015 0.0256526 0.207388 0.206428 0.0288614 0.228653 0.206101 0.0293557 0.258934 0.203621 0.034415 0.280107 0.209764 0.0333195 0.301074 0.202328 0.0313016 0.326827 0.203367 0.0265063 0.354745 0.203024 0.0253536 0.378755 0.2062 0.0301987 0.403702 0.200154 0.0333297 0.433631 0.20085 0.0292589 0.450416 0.208559 0.029884 0.478716 0.204088 0.0543901 0.00682026 0.205469 0.056028 0.0310144 0.203053 0.0581957 0.0533083 0.206975 0.0587195 0.08051 0.201769 0.0559033 0.104939 0.202205 0.0576772 0.134784 0.208369 0.0564607 0.159525 0.209452 0.0527984 0.17933 0.201382 0.0572189 0.207568 0.209879 0.05008 0.228249 0.208122 0.0586788 0.253324 0.20454 0.0520185 0.277719 0.204523 0.0529242 0.304869 0.207645 0.0569944 0.330055 0.206242 0.0550457 0.356623 0.203017 0.0550746 0.37763 0.208942 0.0528991 0.407996 0.207858 0.056903 0.430896 0.205816 0.0580159 0.456776 0.201497 0.0526727 0.47899 0.206169 0.0758356 0.0067114 0.20104 0.0791388 0.0298671 0.209085 0.0826064 0.0547779 0.202849 0.0764293 0.0753651 0.203207 0.076403 0.108164 0.208109 0.0790949 0.134738 0.204974 0.0841579 0.154916 0.207499 0.0801358 0.177412 0.208252 0.0799673 0.200941 0.204232 0.0783552 0.226425 0.203976 0.0804929 0.257584 0.203413 0.0843682 0.276454 0.20352 0.0812593 0.300133 0.202887 0.0849311 0.331845 0.206334 0.0840094 0.350997 0.204328 0.0788434 0.375349 0.202373 0.0810577 0.401041 0.204349 0.0830344 0.429638 0.201697 0.0803268 0.453895 0.20699 0.0797521 0.482697 0.202942 0.109063 0.00855584 0.202042 0.108995 0.0338642 0.20866 0.104829 0.0587765 0.202672 0.1054 0.0820218 0.203312 0.103427 0.104539 0.204521 0.102893 0.133532 0.201234 0.104732 0.15495 0.205683 0.102851 0.176531 0.201067 0.107543 0.208787 0.203588 0.109412 0.233184 0.207887 0.104271 0.258646 0.209436 0.104434 0.276088 0.201761 0.102898 0.308448 0.207428 0.106445 0.326918 0.202473 0.103053 0.356983 0.206942 0.105629 0.378717 0.200964 0.101146 0.402719 0.206045 0.108356 0.426062 0.206317 0.105676 0.456904 0.208194 0.108217 0.478911 0.204123 0.127655 0.00216488 0.207934 0.129937 0.027989 0.206818 0.134094 0.0547208 0.208314 0.134019 0.0777693 0.209206 0.134309 0.106331 0.206883 0.13141 0.129417 0.201035 0.131916 0.157147 0.201871 0.133019 0.181067 0.202269 0.133137 0.207046 0.205566 0.133856 0.234281 0.207332 0.127607 0.258204 0.205359 0.12915 0.275304 0.204471 0.129657 0.303917 0.203907 0.134876 0.331487 0.204922 0.126312 0.355806 0.209152 0.130205 0.384976 0.206273 0.13089 0.40019 0.2006 0.127824 0.427213 0.209163 0.129396 0.457016 0.205821 0.133892 0.477251 0.206449 0.156487 0.00215963 0.202366 0.153434 0.0260388 0.20016 0.157699 0.0566775 0.204525 0.157327 0.0803021 0.207956 0.156089 0.100489 0.208928 0.15899 0.134095 0.207269 0.151467 0.152406 0.203213 0.150641 0.175117 0.202665 0.158823 0.202535 0.209953 0.153447 0.230201 0.202708 0.158787 0.251741 0.206144 0.153876 0.275949 0.202577 0.154146 0.307717 0.200732 0.153101 0.330094 0.201984 0.158681 0.35886 0.20403 0.158063 0.384166 0.206441 0.152324 0.403136 0.20469 0.154868 0.427333 0.207099 0.157425 0.457725 0.20594 0.152989 0.483139 0.200204 0.178472 0.000286385 0.206278 0.176136 0.0282275 0.203598 0.181794 0.0523988 0.204734 0.183453 0.0764467 0.204503 0.175149 0.10069 0.206947 0.176989 0.128624 0.203909 0.179306 0.159724 0.202612 0.184187 0.178118 0.20715 0.179047 0.204435 0.208872 0.177795 0.226936 0.205036 0.18366 0.25336 0.207591 0.183503 0.276187 0.207709 0.179705 0.300491 0.206544 0.18031 0.330325 0.20745 0.177996 0.35472 0.20023 0.18321 0.380529 0.201457 0.17999 0.406828 0.2002 0.181245 0.432219 0.206715 0.175717 0.456512 0.208239 0.184624 0.483015 0.203022 0.204956 0.00609634 0.209018 0.20345 0.0276648 0.208648 0.208957 0.0590441 0.20324 0.2082 0.0844776 0.204647 0.203762 0.10403 0.206854 0.206282 0.134698 0.20994 0.205584 0.151183 0.202671 0.204468 0.184901 0.209209 0.202648 0.201887 0.201714 0.200457 0.231586 0.207632 0.208481 0.254772 0.20267 0.20683 0.283662 0.204881 0.200056 0.30596 0.208905 0.205572 0.331245 0.204598 0.203863 0.358589 0.207029 0.208995 0.377571 0.202786 0.200413 0.400136 0.200356 0.204868 0.430483 0.202324 0.201085 0.450595 0.208243 0.201534 0.479782 0.204332 0.233751 0.0062474 0.201863 0.230764 0.0261171 0.20353 0.233806 0.0527258 0.200226 0.22935 0.0804144 0.20442 0.230284 0.109858 0.200222 0.232696 0.126051 0.203303 0.230067 0.153028 0.207003 0.22973 0.184698 0.205859 0.228592 0.200436 0.202258 0.227127 0.22765 0.209753 0.231631 0.255067 0.207039 0.229864 0.280662 0.209454 0.232656 0.307593 0.202911 0.226898 0.330293 0.20132 0.225411 0.35377 0.200832 0.232841 0.381506 0.201094 0.226472 0.403196 0.204461 0.226895 0.433742 0.203699 0.232761 0.451889 0.207816 0.227783 0.477756 0.209269 0.258119 0.00033379 0.200025 0.256043 0.0295433 0.202199 0.256258 0.05868 0.203016 0.257051 0.0778289 0.203714 0.256327 0.108083 0.202133 0.252722 0.132377 0.205812 0.250191 0.15628 0.20041 0.25677 0.178445 0.20301 0.253026 0.208019 0.208847 0.2597 0.231151 0.204374 0.25153 0.253211 0.207667 0.250005 0.276201 0.208096 0.251758 0.307968 0.201927 0.253562 0.332451 0.205183 0.255614 0.354832 0.200363 0.259874 0.380186 0.201668 0.253887 0.407465 0.202284 0.257571 0.429182 0.206994 0.257192 0.45814 0.205452 0.256178 0.481427 0.204556 0.27753 0.00103049 0.209722 0.280876 0.0250852 0.207501 0.276713 0.051653 0.206674 0.278492 0.0758969 0.208665 0.280991 0.101194 0.205995 0.278578 0.127148 0.201454 0.281888 0.158171 0.204615 0.27928 0.183244 0.208178 0.282014 0.206171 0.200805 0.283359 0.226495 0.205264 0.275318 0.259633 0.202802 0.281865 0.277033 0.202924 0.282801 0.303449 0.20968 0.279996 0.328345 0.206266 0.284441 0.354412 0.207802 0.282957 0.38451 0.208653 0.280607 0.402817 0.204904 0.278355 0.430263 0.200192 0.275814 0.450918 0.205724 0.281844 0.484307 0.201972 0.304795 0.0016275 0.207031 0.300289 0.0279427 0.204458 0.301871 0.0597749 0.202591 0.306074 0.0804547 0.203668 0.303938 0.103456 0.20501 0.307766 0.129639 0.201839 0.301316 0.155225 0.200045 0.300082 0.176172 0.2038 0.309497 0.204584 0.209775 0.302551 0.225378 0.20415 0.305164 0.254188 0.207035 0.306106 0.283276 0.208229 0.304485 0.302727 0.205301 0.305629 0.329149 0.20773 0.306706 0.356004 0.209252 0.309352 0.384402 0.207155 0.303407 0.409582 0.205643 0.303399 0.431065 0.206589 0.307114 0.453943 0.200812 0.308599 0.478603 0.206762 0.330931 0.0046171 0.208358 0.328564 0.029429 0.208823 0.327638 0.0505337 0.202186 0.332493 0.0837748 0.200501 0.331496 0.107242 0.207911 0.334798 0.12772 0.201766 0.331976 0.156669 0.207821 0.332269 0.175936 0.204077 0.331219 0.209189 0.205136 0.328998 0.229747 0.209776 0.333051 0.250764 0.209836 0.331409 0.278985 0.200195 0.330806 0.308561 0.205412 0.333592 0.333912 0.209738 0.330649 0.350264 0.207256 0.328082 0.384266 0.205102 0.327885 0.402369 0.202901 0.329508 0.429168 0.206349 0.330638 0.457194 0.205386 0.329723 0.476421 0.208366 0.356458 0.00999636 0.206637 0.350541 0.025634 0.206011 0.352404 0.0506695 0.2073 0.351697 0.0766043 0.201901 0.352751 0.106567 0.2065 0.35469 0.129768 0.20235 0.35001 0.15816 0.209351 0.355981 0.181444 0.200686 0.356174 0.20174 0.209655 0.35734 0.230874 0.201703 0.355009 0.259567 0.208634 0.351765 0.28305 0.209722 0.352521 0.306368 0.206919 0.354779 0.333638 0.205713 0.357097 0.351754 0.201359 0.359854 0.38322 0.203516 0.35806 0.400584 0.201159 0.35147 0.432211 0.203799 0.354297 0.458997 0.203961 0.356994 0.481475 0.201764 0.37725 0.00218678 0.208167 0.377676 0.0297711 0.2078 0.380469 0.0570832 0.200888 0.37646 0.079002 0.208986 0.381029 0.102279 0.202977 0.384814 0.133524 0.207591 0.38191 0.155499 0.204675 0.382395 0.177659 0.204984 0.379957 0.205575 0.208948 0.383239 0.227121 0.201542 0.375954 0.255764 0.200892 0.383847 0.278043 0.205264 0.377796 0.308947 0.202797 0.382695 0.328842 0.202326 0.376053 0.351651 0.206662 0.379898 0.383029 0.206564 0.38296 0.402932 0.209551 0.380495 0.426338 0.202908 0.384953 0.453439 0.200858 0.380739 0.482084 0.20769 0.401884 0.00500345 0.207768 0.400455 0.0342791 0.202234 0.409616 0.0578484 0.20404 0.405415 0.0778057 0.202686 0.4047 0.109538 0.206701 0.405014 0.134795 0.206134 0.404394 0.154648 0.209332 0.405924 0.184476 0.204534 0.402489 0.200037 0.204957 0.40482 0.227818 0.208468 0.403034 0.251849 0.202382 0.403565 0.280523 0.207921 0.409993 0.303239 0.209933 0.409853 0.327564 0.206328 0.402201 0.352653 0.200464 0.407113 0.383648 0.208942 0.409451 0.409396 0.201388 0.402085 0.426497 0.202949 0.400623 0.457909 0.201655 0.407572 0.481456 0.204953 0.431717 0.00669319 0.202259 0.434431 0.0310264 0.203436 0.426538 0.0587525 0.204458 0.430747 0.0786318 0.206073 0.434841 0.102604 0.208596 0.434697 0.126263 0.202873 0.42904 0.151422 0.203719 0.425304 0.177486 0.200374 0.432982 0.208842 0.20558 0.431271 0.225681 0.209092 0.429909 0.253239 0.208217 0.425064 0.28487 0.20162 0.427979 0.306363 0.202282 0.431964 0.326403 0.204488 0.434756 0.358652 0.209781 0.433151 0.3794 0.203093 0.430785 0.400253 0.20739 0.425821 0.430648 0.20262 0.425479 0.452481 0.209687 0.431724 0.47742 0.204733 0.45181 0.00269258 0.206673 0.454515 0.0280516 0.206847 0.459194 0.0545811 0.209725 0.452232 0.0794866 0.207296 0.455047 0.103082 0.20986 0.459559 0.134115 0.204375 0.452621 0.153595 0.207676 0.45655 0.176035 0.204902 0.450752 0.203748 0.205776 0.455701 0.234803 0.200511 0.455323 0.25498 0.207616 0.456539 0.277637 0.202044 0.450794 0.304779 0.205373 0.451228 0.331751 0.203719 0.45191 0.359898 0.20802 0.457283 0.3824 0.208584 0.458126 0.403026 0.209589 0.451371 0.432916 0.202621 0.45313 0.451597 0.206107 0.454807 0.47789 0.204415 0.480978 0.00513705 0.203987 0.480388 0.0287841 0.205237 0.481272 0.0566492 0.207096 0.480856 0.0840037 0.207252 0.475322 0.108031 0.202777 0.482398 0.128999 0.208415 0.483413 0.151831 0.206735 0.477347 0.184579 0.20257 0.483179 0.209024 0.208182 0.481537 0.231057 0.200276 0.475077 0.257719 0.204685 0.484457 0.281832 0.204152 0.484751 0.302023 0.206095 0.481969 0.334405 0.200078 0.479821 0.356404 0.203362 0.475706 0.37787 0.209349 0.480081 0.402 0.208494 0.480725 0.425936 0.201556 0.481365 0.459529 0.200159 0.478603 0.480128 0.20234 0.509521 0.00220492 0.20714 0.506941 0.0278374 0.206853 0.502986 0.0504152 0.202187 0.501776 0.0825453 0.205853 0.501161 0.103128 0.200413 0.500042 0.12543 0.206486 0.509302 0.159063 0.208875 0.50659 0.176048 0.201527 0.504582 0.208636 0.206674 0.509601 0.230881 0.205524 0.507945 0.254659 0.203896 0.503997 0.281398 0.20804 0.50162 0.308535 0.208066 0.508418 0.331337 0.209851 0.509279 0.357886 0.209467 0.503007 0.384979 0.205924 0.501808 0.402259 0.209932 0.507828 0.425326 0.207787 0.501843 0.455351 0.201527 0.506462 0.475562 0.207628 0.528984 0.000748817 0.203801 0.534985 0.0255651 0.208764 0.526825 0.0538909 0.207545 0.529538 0.0837486 0.209644 0.525207 0.101731 0.208872 0.528051 0.126237 0.200605 0.533129 0.151274 0.201684 0.532075 0.178466 0.201504 0.528261 0.202461 0.204849 0.533699 0.228114 0.202227 0.528704 0.257037 0.206984 0.528962 0.27875 0.200211 0.532011 0.30725 0.20134 0.526444 0.330745 0.207405 0.526123 0.357978 0.206609 0.533499 0.377943 0.201514 0.527819 0.409225 0.208714 0.530091 0.430433 0.20423 0.530202 0.454503 0.206665 0.533165 0.479359 0.20449 0.556019 0.00521136 0.20659 0.554577 0.0295098 0.201936 0.55096 0.0589481 0.200523 0.550325 0.0822749 0.208775 0.550482 0.103583 0.20784 0.552871 0.133053 0.203132 0.556683 0.154554 0.208097 0.558047 0.178708 0.20473 0.551009 0.20042 0.203456 0.556157 0.225683 0.202741 0.558412 0.253612 0.205443 0.557852 0.280649 0.203681 0.557517 0.303345 0.201483 0.554608 0.333512 0.201049 0.559997 0.357016 0.207885 0.557496 0.384046 0.205519 0.559489 0.402614 0.20781 0.556617 0.425069 0.20454 0.557114 0.451727 0.209432 0.556962 0.476643 0.204461 0.582345 0.00912408 0.208491 0.581969 0.0336568 0.205146 0.576272 0.0514654 0.208481 0.575025 0.0775624 0.205234 0.575426 0.101309 0.2097 0.577168 0.130922 0.203325 0.57711 0.153034 0.203906 0.575869 0.184923 0.20351 0.5759 0.200817 0.208926 0.576891 0.234376 0.208096 0.57602 0.252204 0.201024 0.575344 0.275522 0.208042 0.578901 0.307368 0.20776 0.579363 0.327561 0.204678 0.578482 0.350098 0.206262 0.583022 0.376358 0.201795 0.581587 0.40948 0.205131 0.580644 0.430779 0.207514 0.575285 0.451717 0.205453 0.583938 0.47911 0.204652 0.600864 0.00134514 0.209104 0.600481 0.0286141 0.209717 0.602155 0.0509607 0.209631 0.601107 0.0751822 0.207387 0.604748 0.100019 0.203951 0.60305 0.131689 0.203909 0.607843 0.151606 0.205323 0.600765 0.18425 0.201881 0.607366 0.207437 0.207011 0.603861 0.228297 0.20016 0.601647 0.256666 0.20306 0.604952 0.28374 0.204588 0.60944 0.301236 0.201338 0.609074 0.334118 0.203632 0.603145 0.352026 0.207979 0.604374 0.38003 0.202626 0.60976 0.407846 0.206207 0.606913 0.427667 0.203243 0.604732 0.456793 0.202862 0.606189 0.475671 0.205291 0.629187 0.00312213 0.208592 0.629678 0.0261624 0.207386 0.627845 0.0572995 0.204889 0.630156 0.0761724 0.209038 0.630402 0.105563 0.206484 0.632777 0.132242 0.20872 0.632598 0.153916 0.209242 0.634775 0.177128 0.203978 0.62812 0.206791 0.205854 0.63315 0.230399 0.206198 0.630308 0.256799 0.202031 0.630991 0.279192 0.202639 0.632403 0.303919 0.209809 0.62953 0.332774 0.203775 0.631072 0.355403 0.201592 0.63188 0.377858 0.202304 0.629644 0.400166 0.203352 0.63219 0.434527 0.205192 0.632522 0.456237 0.20625 0.625356 0.484569 0.205669 0.651898 0.00880557 0.203875 0.658482 0.0273185 0.207539 0.65903 0.05809 0.201144 0.655271 0.0795612 0.208376 0.651419 0.102408 0.204194 0.650718 0.126523 0.201236 0.652268 0.155238 0.20046 0.656889 0.178352 0.208278 0.652166 0.204206 0.206312 0.650414 0.230013 0.204899 0.652969 0.258238 0.20078 0.657124 0.278075 0.20972 0.658042 0.302175 0.204211 0.652795 0.328075 0.203329 0.650304 0.352545 0.208475 0.650561 0.376173 0.206131 0.65576 0.403603 0.208484 0.650601 0.430166 0.209508 0.659105 0.45571 0.208989 0.650162 0.478375 0.207512 0.681308 0.00904321 0.204532 0.679158 0.0325189 0.204708 0.677627 0.0503028 0.209081 0.678917 0.0805918 0.202635 0.683518 0.108931 0.205908 0.680164 0.134456 0.208291 0.675135 0.157511 0.207958 0.681229 0.177389 0.20287 0.682437 0.203905 0.201181 0.684617 0.231831 0.202841 0.676635 0.253687 0.208757 0.677411 0.279158 0.209379 0.678049 0.305056 0.203939 0.682678 0.325072 0.204312 0.683046 0.351761 0.204828 0.681727 0.378967 0.203967 0.676012 0.402778 0.203008 0.677066 0.431571 0.207924 0.682232 0.451672 0.203126 0.675491 0.475378 0.207382 0.708863 0.00122755 0.202336 0.706007 0.0277058 0.201656 0.706993 0.0587568 0.200029 0.706921 0.0781927 0.205339 0.70175 0.109298 0.204765 0.706006 0.132897 0.202104 0.704527 0.158876 0.208917 0.700069 0.18311 0.200474 0.706911 0.201655 0.200805 0.700105 0.225226 0.204919 0.706416 0.251059 0.207523 0.700846 0.27847 0.208096 0.707459 0.304197 0.20605 0.705312 0.32695 0.200451 0.703854 0.357342 0.200767 0.700018 0.381606 0.200545 0.702761 0.405187 0.209472 0.706955 0.425792 0.207043 0.709042 0.459522 0.208561 0.705474 0.484521 0.201704 0.729797 0.00524276 0.20918 0.726541 0.0290441 0.200671 0.72637 0.0506532 0.200738 0.729641 0.0836074 0.202496 0.725101 0.109147 0.203582 0.728957 0.127991 0.20257 0.731472 0.15683 0.203306 0.731903 0.177573 0.204752 0.72855 0.208549 0.209856 0.725252 0.22814 0.201759 0.734416 0.25103 0.202879 0.725517 0.282493 0.204491 0.734589 0.304604 0.200473 0.726864 0.330363 0.208899 0.726404 0.354463 0.203382 0.727637 0.375566 0.203451 0.730279 0.401711 0.203734 0.728767 0.431078 0.202124 0.725208 0.453022 0.200572 0.729752 0.476522 0.231616 0.00741956 0.0097728 0.234064 0.00289474 0.0283771 0.230845 0.000437023 0.0530276 0.227985 0.00252383 0.0812389 0.227687 0.0081706 0.101011 0.234622 0.00936078 0.130973 0.230276 0.00426571 0.155006 0.225721 0.00350047 0.178692 0.233157 0.00319152 0.204875 0.232737 0.00882968 0.228602 0.228673 0.00467405 0.259634 0.231787 0.00655029 0.284399 0.230222 0.0069239 0.308874 0.231203 0.00216987 0.325062 0.230905 0.00623721 0.352029 0.231145 0.007647 0.379658 0.225612 0.007847 0.405563 0.230574 0.00776739 0.427372 0.226892 0.00707582 0.459397 0.234346 0.000612722 0.48155 0.225044 0.0293795 0.00392062 0.228657 0.0270693 0.0290688 0.2261 0.0304617 0.0505338 0.230718 0.0277339 0.0784883 0.225042 0.0345854 0.103006 0.2294 0.0317962 0.129785 0.230319 0.0306836 0.151219 0.228145 0.0263804 0.176387 0.226026 0.0254528 0.20427 0.229581 0.0284383 0.232933 0.225574 0.0317723 0.257206 0.225985 0.0276198 0.281853 0.233599 0.0336962 0.306926 0.230049 0.0260779 0.334343 0.225418 0.02543 0.350832 0.225802 0.033634 0.378437 0.226837 0.028699 0.405281 0.234993 0.0310687 0.426394 0.231052 0.0335942 0.450533 0.233026 0.0259293 0.47645 0.225995 0.0512581 0.0031977 0.225637 0.0577837 0.0289268 0.228536 0.0583007 0.0565044 0.226231 0.0578753 0.0842864 0.227582 0.051553 0.105614 0.231076 0.0545097 0.132574 0.228468 0.05041 0.154758 0.229416 0.051124 0.182143 0.232244 0.0565799 0.200221 0.227476 0.05595 0.225156 0.228505 0.0570865 0.255022 0.234852 0.0576154 0.276521 0.23281 0.0569404 0.300396 0.230605 0.051862 0.333235 0.227299 0.0501123 0.351643 0.22805 0.0549799 0.384399 0.233306 0.0541292 0.407964 0.225482 0.0506337 0.430435 0.229072 0.0518826 0.457348 0.234071 0.0545514 0.479522 0.229426 0.0765379 0.00734119 0.229715 0.077442 0.030892 0.22921 0.0786446 0.0559035 0.232526 0.0753991 0.0841321 0.231244 0.0775007 0.100537 0.234672 0.0767504 0.130223 0.231862 0.0758436 0.154942 0.232397 0.0808242 0.178821 0.226586 0.0844932 0.200965 0.225865 0.0808335 0.230395 0.233247 0.0796584 0.255312 0.232607 0.0778115 0.281072 0.230134 0.0807209 0.307249 0.232437 0.0796691 0.327205 0.227932 0.0824969 0.358928 0.228621 0.0757252 0.381631 0.22794 0.0848724 0.40146 0.226419 0.077626 0.425959 0.22704 0.07567 0.456259 0.233065 0.0849447 0.483156 0.228341 0.100867 0.00838883 0.227894 0.101011 0.0291262 0.22558 0.106142 0.0551792 0.231468 0.104582 0.0805629 0.229486 0.101506 0.10847 0.229338 0.109611 0.128921 0.232917 0.1044 0.150083 0.234909 0.107439 0.179326 0.226798 0.105595 0.2005 0.234585 0.104168 0.233083 0.233831 0.104529 0.259042 0.225064 0.105099 0.280374 0.233951 0.100244 0.305809 0.227931 0.109365 0.326774 0.234417 0.104615 0.354675 0.234679 0.102681 0.376381 0.231637 0.104739 0.40153 0.231276 0.104804 0.431026 0.234982 0.104126 0.45364 0.226434 0.106174 0.478831 0.234937 0.130894 0.00119541 0.230549 0.130993 0.0251627 0.23252 0.134854 0.0597009 0.225035 0.131313 0.0822795 0.232944 0.126612 0.109159 0.232471 0.13205 0.12913 0.225717 0.127794 0.155725 0.233052 0.131115 0.177491 0.231036 0.129357 0.205294 0.233447 0.130342 0.231699 0.231865 0.12595 0.252413 0.228429 0.130131 0.278444 0.234497 0.127113 0.305612 0.230585 0.131214 0.332517 0.23466 0.132712 0.352657 0.226217 0.131324 0.376312 0.231852 0.13459 0.406711 0.230827 0.129214 0.433467 0.225436 0.129185 0.454207 0.225097 0.131549 0.482229 0.232123 0.158063 0.00953129 0.225483 0.15367 0.0266136 0.234714 0.157767 0.0534718 0.229678 0.152781 0.0776124 0.234206 0.150137 0.10421 0.230327 0.159006 0.129111 0.231518 0.156311 0.156069 0.227007 0.153458 0.177747 0.230805 0.150545 0.209882 0.234286 0.154056 0.227111 0.231278 0.154512 0.256012 0.232604 0.156177 0.279865 0.227891 0.155993 0.304165 0.234848 0.159827 0.331316 0.229314 0.155491 0.353664 0.230747 0.159109 0.378731 0.232792 0.154236 0.408496 0.234976 0.154128 0.432161 0.232302 0.159055 0.45082 0.231497 0.157189 0.480304 0.226089 0.178515 0.000207872 0.232754 0.176387 0.0263541 0.22932 0.18348 0.0501328 0.234592 0.179703 0.0810345 0.230847 0.184917 0.106644 0.231412 0.176492 0.133039 0.233222 0.184002 0.150905 0.227178 0.176279 0.177166 0.225988 0.184013 0.203209 0.227996 0.181964 0.234213 0.231492 0.179043 0.256661 0.228235 0.182545 0.284701 0.232273 0.179462 0.307018 0.234878 0.179977 0.332997 0.229095 0.179719 0.354585 0.230393 0.177431 0.377743 0.230285 0.180475 0.403012 0.229698 0.181375 0.425508 0.228351 0.180768 0.457596 0.227774 0.180042 0.476362 0.230596 0.205657 0.00568591 0.228222 0.206692 0.0285394 0.227702 0.207786 0.0563936 0.232948 0.207481 0.0771631 0.230061 0.201665 0.108902 0.227157 0.20326 0.130117 0.231465 0.203988 0.158236 0.23368 0.209366 0.181907 0.232682 0.203207 0.208921 0.233035 0.208742 0.232704 0.231029 0.206574 0.258509 0.230604 0.20212 0.275016 0.234022 0.20855 0.303469 0.231067 0.200985 0.327063 0.228236 0.206536 0.359492 0.225463 0.209417 0.377078 0.22967 0.207211 0.407388 0.228154 0.205183 0.426317 0.228368 0.204328 0.452321 0.22921 0.206257 0.482591 0.228286 0.229638 0.00442277 0.225062 0.225216 0.0257347 0.2316 0.226508 0.054387 0.233731 0.225633 0.0797146 0.230365 0.226253 0.104878 0.22901 0.227146 0.130426 0.232305 0.229076 0.1566 0.226694 0.225237 0.182535 0.234778 0.234441 0.20101 0.233402 0.229624 0.225036 0.228093 0.227104 0.256774 0.228233 0.234365 0.28193 0.225744 0.234076 0.30072 0.232051 0.231041 0.331353 0.229043 0.227025 0.35526 0.230719 0.229382 0.375285 0.234848 0.227753 0.405929 0.230799 0.229253 0.429474 0.22981 0.228911 0.452797 0.229319 0.231857 0.483468 0.232844 0.25153 0.00410074 0.226613 0.251432 0.0289534 0.226934 0.25691 0.053935 0.234798 0.252509 0.0825532 0.228003 0.256934 0.100116 0.22898 0.258893 0.129584 0.232987 0.258786 0.150431 0.230017 0.258381 0.178924 0.225676 0.254194 0.204844 0.228163 0.256579 0.228745 0.231652 0.256972 0.250493 0.234704 0.255435 0.277529 0.233549 0.259767 0.3064 0.231609 0.256261 0.328363 0.230402 0.256668 0.351934 0.226654 0.255793 0.381347 0.229826 0.255653 0.408653 0.231872 0.255688 0.429613 0.233202 0.258916 0.450201 0.231928 0.253025 0.484293 0.2256 0.281808 0.00886964 0.234709 0.276939 0.0256765 0.226351 0.282293 0.0582372 0.22758 0.281662 0.0830385 0.226136 0.277018 0.105525 0.233905 0.277659 0.130753 0.228939 0.279313 0.151557 0.23179 0.278085 0.175196 0.229196 0.279423 0.207798 0.233585 0.284892 0.228734 0.23181 0.282869 0.253176 0.232161 0.275209 0.281098 0.227264 0.279716 0.307887 0.229705 0.276577 0.334398 0.227896 0.283438 0.353747 0.230653 0.277308 0.38465 0.227307 0.282899 0.405186 0.22966 0.278885 0.428878 0.233328 0.275246 0.45903 0.225713 0.284553 0.480425 0.228999 0.306051 6.80655e-05 0.233878 0.304304 0.0347462 0.225042 0.304511 0.0513727 0.229386 0.308623 0.0809068 0.225145 0.303202 0.103382 0.231386 0.301382 0.132992 0.232415 0.302105 0.153095 0.230534 0.301224 0.180483 0.226026 0.300396 0.202937 0.225032 0.305357 0.228258 0.229639 0.302747 0.25642 0.228954 0.305552 0.283993 0.229634 0.306009 0.308796 0.232624 0.302365 0.331794 0.232505 0.301043 0.357926 0.228567 0.306541 0.384201 0.229276 0.308157 0.40699 0.231134 0.308738 0.426201 0.229536 0.308438 0.451481 0.228587 0.30771 0.477955 0.227911 0.332686 0.00451527 0.229595 0.331174 0.0272568 0.228178 0.333259 0.05557 0.227585 0.330288 0.07782 0.229166 0.329936 0.103743 0.226571 0.325604 0.126993 0.233156 0.331629 0.15196 0.227565 0.327232 0.179031 0.229498 0.329839 0.209579 0.23354 0.334677 0.227234 0.225993 0.334824 0.258355 0.230059 0.325128 0.279461 0.225876 0.334465 0.309133 0.231184 0.330507 0.333462 0.233007 0.327625 0.35841 0.228147 0.328776 0.378248 0.232242 0.331974 0.408795 0.230826 0.325114 0.427185 0.228284 0.333196 0.455859 0.232066 0.325412 0.481493 0.234351 0.351033 0.00356234 0.23405 0.352525 0.0286706 0.228806 0.357774 0.0532227 0.229588 0.350803 0.0772563 0.232205 0.35562 0.105333 0.225185 0.355584 0.126652 0.230312 0.354771 0.159338 0.228783 0.356427 0.177618 0.227935 0.35015 0.201443 0.23073 0.350839 0.233428 0.234764 0.35856 0.258703 0.231576 0.358068 0.279994 0.232551 0.358077 0.308847 0.228197 0.35549 0.331792 0.227514 0.355863 0.351287 0.233149 0.359707 0.379781 0.230434 0.355222 0.408432 0.232091 0.352267 0.428995 0.234235 0.354065 0.456011 0.229713 0.354692 0.479939 0.225934 0.384628 0.00455031 0.233973 0.377297 0.0349193 0.233053 0.384484 0.0588707 0.225353 0.376801 0.0826947 0.232029 0.377914 0.107103 0.225632 0.375875 0.129841 0.225747 0.377381 0.15662 0.225921 0.383771 0.183383 0.229109 0.384726 0.203618 0.232303 0.379697 0.227556 0.226553 0.383758 0.255695 0.232735 0.37784 0.284886 0.229728 0.375773 0.301539 0.226499 0.382116 0.333569 0.227455 0.375402 0.359783 0.232823 0.383303 0.383184 0.227361 0.375259 0.402306 0.23124 0.375634 0.434969 0.232764 0.384687 0.456853 0.232602 0.3774 0.484676 0.228007 0.407458 0.00825566 0.225083 0.405937 0.0283673 0.232257 0.403857 0.0510404 0.233278 0.404189 0.0750108 0.229891 0.407505 0.106503 0.22528 0.406794 0.12763 0.23395 0.406299 0.157304 0.234288 0.408478 0.177525 0.22998 0.408695 0.204965 0.231204 0.404991 0.232461 0.233223 0.405167 0.258008 0.234303 0.404233 0.279019 0.225583 0.403849 0.309836 0.228878 0.408912 0.328389 0.232031 0.404991 0.353425 0.231583 0.405916 0.377554 0.233739 0.405758 0.40001 0.231498 0.400467 0.425148 0.228547 0.405992 0.4506 0.228599 0.407437 0.484267 0.231486 0.425772 0.00713962 0.227104 0.429724 0.0334509 0.225933 0.427048 0.0521379 0.232349 0.42832 0.0809438 0.232585 0.432861 0.103759 0.226588 0.429117 0.125029 0.227012 0.433952 0.153455 0.226853 0.430429 0.181037 0.233983 0.425904 0.200884 0.225696 0.433573 0.230508 0.226209 0.42897 0.251132 0.228785 0.432405 0.282162 0.231552 0.42545 0.308948 0.228101 0.430794 0.32799 0.228902 0.434152 0.358568 0.229833 0.427604 0.37746 0.234951 0.429259 0.406212 0.23172 0.428481 0.428556 0.232799 0.434317 0.457651 0.229436 0.430787 0.475737 0.226057 0.457844 0.00980621 0.232459 0.451295 0.025409 0.233457 0.45066 0.056172 0.231109 0.458476 0.0815505 0.232177 0.451944 0.100417 0.233352 0.453081 0.13102 0.232772 0.453277 0.151809 0.232496 0.453499 0.176437 0.231611 0.451119 0.209845 0.228706 0.455373 0.231891 0.232268 0.456055 0.251498 0.228982 0.45485 0.277891 0.225027 0.459814 0.305094 0.233134 0.451985 0.326915 0.233083 0.452115 0.353715 0.22949 0.454969 0.379326 0.226271 0.450496 0.405451 0.231386 0.454653 0.431611 0.228567 0.458613 0.454443 0.229879 0.456738 0.479776 0.232716 0.479615 0.00378276 0.233253 0.484095 0.0337172 0.228727 0.479057 0.0515783 0.228758 0.476854 0.0782097 0.23004 0.480806 0.106808 0.226682 0.479648 0.133063 0.225021 0.481511 0.158181 0.225092 0.484396 0.182641 0.233601 0.481188 0.204672 0.234075 0.478948 0.230579 0.229219 0.480956 0.250612 0.229557 0.48291 0.276465 0.227523 0.483834 0.309332 0.230667 0.48428 0.333649 0.227578 0.481759 0.351483 0.228296 0.479569 0.383033 0.229665 0.476268 0.406907 0.228263 0.476471 0.431384 0.226076 0.476392 0.459875 0.229822 0.480168 0.478148 0.232042 0.507543 0.00755137 0.232595 0.500185 0.0281518 0.229971 0.503264 0.0579115 0.232771 0.506875 0.0793 0.230815 0.507321 0.10018 0.232348 0.505502 0.133947 0.230902 0.505502 0.156177 0.233881 0.500812 0.179655 0.230907 0.504288 0.209398 0.233647 0.506642 0.228637 0.232751 0.508621 0.253162 0.2347 0.506291 0.275442 0.228717 0.508677 0.300601 0.225606 0.506081 0.334393 0.227763 0.505019 0.350874 0.230546 0.501602 0.382973 0.232791 0.508196 0.402013 0.232525 0.505222 0.427814 0.232181 0.502818 0.4596 0.232256 0.504993 0.47839 0.229732 0.527035 0.00138595 0.2325 0.534857 0.034463 0.234874 0.533541 0.0567469 0.227092 0.527256 0.0808132 0.229043 0.53086 0.100554 0.233648 0.526185 0.133271 0.227975 0.529085 0.154511 0.229537 0.531154 0.181125 0.231003 0.529069 0.204583 0.229819 0.532007 0.234073 0.229084 0.527068 0.25824 0.230669 0.530938 0.281557 0.231382 0.529458 0.309027 0.231537 0.526293 0.326343 0.234675 0.532599 0.355749 0.229603 0.533975 0.379714 0.23294 0.525578 0.409964 0.232905 0.52677 0.432044 0.23232 0.533297 0.459057 0.225661 0.534014 0.478079 0.228689 0.557255 0.0069113 0.226237 0.550009 0.0266444 0.229494 0.556659 0.0552989 0.232102 0.558 0.0813966 0.225221 0.55416 0.109285 0.227128 0.557104 0.134397 0.232017 0.555055 0.156587 0.233374 0.558317 0.179026 0.225599 0.553257 0.207262 0.229311 0.558058 0.23152 0.229649 0.558331 0.257822 0.228052 0.555738 0.28338 0.232002 0.555944 0.308384 0.230895 0.557093 0.332039 0.227614 0.558545 0.352735 0.229316 0.557544 0.384122 0.225236 0.550536 0.401094 0.228088 0.554023 0.428803 0.234607 0.551307 0.457449 0.227415 0.555826 0.477931 0.225258 0.581369 0.0060398 0.225114 0.578475 0.0280456 0.232424 0.575881 0.0555477 0.233085 0.584891 0.0764867 0.227785 0.581418 0.109137 0.227415 0.581006 0.131369 0.233241 0.582993 0.152023 0.234115 0.584277 0.178746 0.233154 0.575396 0.207166 0.231052 0.580179 0.229036 0.234605 0.583547 0.255548 0.226579 0.581755 0.284808 0.225639 0.582357 0.305562 0.233166 0.576478 0.332996 0.232664 0.580487 0.359562 0.228033 0.583969 0.376411 0.232933 0.578883 0.40873 0.23403 0.576874 0.425402 0.232598 0.584073 0.45485 0.227929 0.582219 0.476485 0.234571 0.606858 0.0089197 0.230219 0.609166 0.0269995 0.234466 0.601211 0.057015 0.234447 0.607199 0.0770113 0.225143 0.600125 0.109821 0.234274 0.604413 0.131308 0.229158 0.607288 0.156036 0.231118 0.600118 0.179614 0.228777 0.601327 0.203422 0.229491 0.607274 0.232027 0.22521 0.608505 0.256337 0.228121 0.608114 0.27764 0.228029 0.608769 0.302484 0.228648 0.606561 0.327528 0.234113 0.600011 0.351307 0.234774 0.609747 0.376827 0.225763 0.601134 0.408732 0.23394 0.607481 0.433207 0.231397 0.605475 0.457597 0.232057 0.600888 0.475723 0.227598 0.62848 0.00732689 0.227735 0.628644 0.0282108 0.229173 0.634005 0.0507012 0.228097 0.63273 0.077627 0.234796 0.632569 0.10867 0.232212 0.628934 0.131655 0.234594 0.631797 0.153135 0.229561 0.625851 0.175609 0.230238 0.634799 0.207511 0.231992 0.629632 0.226685 0.228428 0.631384 0.251103 0.227294 0.632214 0.277864 0.230139 0.630648 0.308658 0.230804 0.625993 0.331026 0.230165 0.628026 0.350863 0.232903 0.629246 0.37591 0.230851 0.625683 0.406465 0.228363 0.629796 0.425335 0.225778 0.629502 0.455376 0.232184 0.626386 0.475525 0.227432 0.658014 0.0083476 0.231237 0.652659 0.0264641 0.232892 0.65527 0.0584888 0.23243 0.657966 0.0845201 0.230196 0.654167 0.108654 0.234829 0.656347 0.130445 0.225223 0.653611 0.153296 0.229983 0.656306 0.180876 0.228432 0.656299 0.209674 0.227831 0.650484 0.228898 0.234892 0.654792 0.253873 0.226442 0.658479 0.275112 0.230588 0.655477 0.30886 0.234934 0.654423 0.334721 0.23191 0.655247 0.352945 0.231418 0.658283 0.376388 0.225855 0.653497 0.401551 0.23416 0.655347 0.42613 0.225483 0.657298 0.459815 0.234627 0.654212 0.479253 0.229228 0.679795 0.00375079 0.227282 0.680486 0.0279524 0.230909 0.682487 0.0529118 0.233537 0.683405 0.0776514 0.226287 0.678906 0.100615 0.232221 0.676721 0.131652 0.229111 0.675238 0.154349 0.226169 0.677887 0.182029 0.233236 0.676619 0.200061 0.226426 0.679487 0.22993 0.227006 0.684737 0.252047 0.233603 0.676399 0.280707 0.225047 0.681206 0.302773 0.227737 0.675981 0.332523 0.226097 0.68352 0.350102 0.227977 0.684735 0.37626 0.229981 0.682383 0.406384 0.231442 0.681242 0.429391 0.232294 0.684769 0.454544 0.229554 0.677773 0.483903 0.232449 0.700195 0.00287236 0.227841 0.702965 0.028957 0.231784 0.709499 0.0584273 0.228728 0.704119 0.0810424 0.230486 0.709668 0.100485 0.226726 0.705133 0.128291 0.228998 0.704129 0.15392 0.234412 0.707175 0.183477 0.226248 0.70853 0.209523 0.233631 0.702282 0.230572 0.232691 0.702022 0.255858 0.230592 0.700897 0.284397 0.232557 0.703902 0.301116 0.226334 0.705695 0.332207 0.232844 0.704967 0.359856 0.234967 0.701986 0.381614 0.229962 0.701662 0.409058 0.229804 0.707873 0.427449 0.233486 0.706658 0.451989 0.232614 0.708855 0.477347 0.233847 0.72698 0.00258363 0.228318 0.72973 0.0251164 0.227335 0.726622 0.0570328 0.228881 0.728556 0.0837073 0.231478 0.731883 0.1067 0.226695 0.726032 0.12831 0.22597 0.730051 0.159076 0.227818 0.726683 0.177665 0.233337 0.726705 0.201784 0.229108 0.728365 0.230145 0.231516 0.729077 0.254875 0.229138 0.733977 0.277948 0.230653 0.7261 0.304323 0.226632 0.733457 0.333191 0.230858 0.730539 0.354589 0.230052 0.732372 0.375934 0.232631 0.731343 0.401043 0.230075 0.729958 0.427201 0.233247 0.732596 0.451644 0.23047 0.728987 0.475257 0.253677 0.00152864 0.00266762 0.251515 0.00296012 0.0340496 0.259908 0.00986112 0.0585108 0.251557 0.00941423 0.0843745 0.251107 0.00992301 0.105948 0.253826 0.00189652 0.133655 0.251619 0.00348378 0.155488 0.254058 0.00751757 0.180832 0.250679 0.00912376 0.201555 0.256993 0.00524708 0.233661 0.254897 0.00188536 0.257509 0.253094 0.00796003 0.280172 0.256268 0.00119229 0.30537 0.251758 0.00120467 0.325395 0.250935 0.00997795 0.358955 0.259374 0.00545422 0.380326 0.251469 0.00598572 0.404499 0.250467 0.00558109 0.431103 0.251089 0.00380937 0.458016 0.255274 0.000984667 0.479701 0.252653 0.0323491 0.00107133 0.256707 0.0303693 0.0327184 0.254661 0.0348019 0.0520274 0.255567 0.0254587 0.0838357 0.252395 0.025469 0.104162 0.255509 0.0292927 0.130937 0.256181 0.033286 0.159964 0.252486 0.0296479 0.178223 0.259344 0.0328239 0.206697 0.255349 0.0260583 0.228573 0.250943 0.0318517 0.251985 0.259264 0.0261503 0.279491 0.255087 0.0270569 0.302351 0.254016 0.0299085 0.33298 0.25121 0.0313299 0.352241 0.259491 0.0333142 0.38115 0.25748 0.0334689 0.400529 0.254208 0.0292814 0.425652 0.251644 0.0288694 0.456357 0.251032 0.0275922 0.475455 0.255333 0.0523845 0.00265158 0.25962 0.0531718 0.0302702 0.257619 0.0507183 0.0599693 0.255368 0.0531948 0.0780422 0.255278 0.0575412 0.103135 0.250836 0.0561557 0.133789 0.254374 0.0557838 0.157833 0.259131 0.0508551 0.18465 0.257473 0.0590361 0.20543 0.251524 0.0594171 0.234496 0.254588 0.05289 0.252437 0.250077 0.0542457 0.278896 0.258778 0.0568284 0.30002 0.257784 0.0587145 0.329947 0.251775 0.0596568 0.357341 0.256405 0.057448 0.380426 0.256563 0.0549209 0.40372 0.257001 0.0506401 0.43071 0.252787 0.0580752 0.45891 0.255353 0.0528158 0.484194 0.252003 0.0791634 0.000516111 0.25156 0.0801716 0.0299335 0.254198 0.0768702 0.0534642 0.254425 0.0796132 0.0837348 0.252084 0.0831529 0.104504 0.258281 0.0771661 0.126722 0.259994 0.0835537 0.157664 0.259134 0.0775886 0.175515 0.255313 0.0824166 0.207476 0.256729 0.0787107 0.233688 0.256044 0.0813243 0.253111 0.253107 0.0848731 0.283185 0.258193 0.0804185 0.303059 0.250533 0.0820752 0.32698 0.255476 0.0835441 0.351329 0.256046 0.0785981 0.382236 0.250592 0.0798259 0.407868 0.251746 0.0832146 0.434685 0.257346 0.0789905 0.459673 0.259153 0.0827972 0.478565 0.256419 0.105805 0.0084296 0.252017 0.104477 0.026197 0.253663 0.106267 0.0591611 0.255791 0.108522 0.0820836 0.256369 0.10224 0.102051 0.257931 0.103383 0.128619 0.250632 0.10417 0.151016 0.252645 0.108726 0.176085 0.257307 0.102 0.205591 0.255292 0.105364 0.234267 0.253495 0.109203 0.253948 0.256559 0.102069 0.278909 0.255188 0.104502 0.309436 0.256336 0.105407 0.327074 0.258804 0.101262 0.350375 0.258133 0.108142 0.379714 0.2578 0.101636 0.404655 0.259643 0.107068 0.431342 0.257804 0.107484 0.458161 0.251697 0.10807 0.480141 0.259404 0.130775 0.000273283 0.25893 0.127781 0.0284049 0.252619 0.132716 0.0586645 0.254413 0.131522 0.077494 0.251097 0.12837 0.109349 0.259587 0.12938 0.130111 0.257349 0.132704 0.150463 0.255071 0.134878 0.178874 0.250164 0.127174 0.207617 0.250739 0.12992 0.230456 0.256414 0.129189 0.256869 0.256067 0.132835 0.28474 0.255424 0.125013 0.306148 0.25244 0.132037 0.3315 0.256457 0.130246 0.359913 0.253535 0.132853 0.381512 0.257558 0.134467 0.409954 0.258143 0.134041 0.428141 0.257939 0.126664 0.451945 0.259587 0.130366 0.477387 0.257459 0.154735 0.00170358 0.259505 0.159702 0.0300826 0.251859 0.157408 0.0511228 0.253985 0.153053 0.081242 0.257897 0.159088 0.103612 0.255615 0.158238 0.133196 0.252605 0.157494 0.159222 0.257624 0.156251 0.178671 0.255207 0.155956 0.209729 0.250465 0.151598 0.226535 0.253028 0.152339 0.2592 0.257346 0.15884 0.280478 0.256668 0.156969 0.304931 0.258613 0.155834 0.333668 0.254054 0.157978 0.358437 0.256566 0.151007 0.380554 0.253847 0.15213 0.409156 0.258977 0.158717 0.426408 0.251317 0.159837 0.458619 0.252754 0.151792 0.481632 0.25306 0.177019 0.0051545 0.254311 0.177931 0.0268811 0.25175 0.179129 0.0594299 0.255211 0.176412 0.0780886 0.256455 0.184075 0.103249 0.259398 0.17697 0.127414 0.25633 0.184642 0.155108 0.251982 0.175297 0.17529 0.253937 0.179289 0.206238 0.254157 0.182647 0.231749 0.252302 0.179824 0.257104 0.255865 0.184357 0.280036 0.259638 0.184984 0.304402 0.259843 0.184764 0.331244 0.251258 0.175823 0.354313 0.256904 0.178251 0.378011 0.251831 0.181971 0.403145 0.253067 0.180692 0.434348 0.254368 0.177457 0.453485 0.253606 0.175767 0.482695 0.251869 0.201576 0.00159432 0.255579 0.203309 0.0307136 0.254487 0.202276 0.0553411 0.251478 0.20265 0.078512 0.252905 0.201532 0.107783 0.259287 0.20291 0.134661 0.257385 0.200612 0.157662 0.25491 0.202296 0.175907 0.25979 0.209198 0.206885 0.258923 0.207459 0.228765 0.252438 0.209196 0.251321 0.254337 0.202286 0.281045 0.256909 0.20125 0.301518 0.25661 0.20094 0.332349 0.251888 0.201091 0.352027 0.253137 0.204366 0.380715 0.254926 0.208878 0.403962 0.257477 0.209086 0.432461 0.258511 0.20369 0.452833 0.25866 0.200479 0.478195 0.251869 0.230413 0.00712207 0.256756 0.232502 0.0252515 0.253951 0.233885 0.0555323 0.255651 0.227116 0.0770244 0.250067 0.23057 0.105537 0.251571 0.233853 0.132753 0.255105 0.23441 0.15348 0.252444 0.23262 0.182215 0.251751 0.229342 0.207197 0.254246 0.22773 0.226147 0.258166 0.233391 0.251696 0.255591 0.231028 0.277022 0.251142 0.228904 0.307377 0.254332 0.225818 0.329264 0.259907 0.22528 0.359948 0.254786 0.234342 0.384365 0.255399 0.229221 0.404415 0.2591 0.22765 0.431028 0.252734 0.227292 0.450768 0.250426 0.231428 0.475855 0.256601 0.250841 0.00493439 0.253713 0.257574 0.0288627 0.254149 0.251945 0.05172 0.2521 0.253385 0.0754268 0.259914 0.25051 0.109447 0.254078 0.250274 0.125851 0.256491 0.256105 0.151857 0.259523 0.250572 0.175325 0.252251 0.258604 0.203903 0.255213 0.25653 0.227135 0.259136 0.251675 0.258031 0.252532 0.252646 0.277825 0.251111 0.259416 0.305151 0.253062 0.253752 0.328314 0.251222 0.2564 0.351863 0.254013 0.257874 0.379008 0.25507 0.251204 0.408562 0.256859 0.255599 0.433248 0.258204 0.25787 0.451865 0.257086 0.258499 0.480373 0.257905 0.283557 0.000489255 0.25546 0.284823 0.0267948 0.253268 0.284152 0.0538397 0.254148 0.282715 0.0783173 0.254823 0.283752 0.101525 0.254233 0.278869 0.130959 0.254265 0.279291 0.152589 0.252114 0.282283 0.180755 0.256324 0.275537 0.204723 0.258231 0.284141 0.230053 0.25629 0.281565 0.257827 0.252293 0.280474 0.278576 0.257258 0.275534 0.305417 0.253086 0.279802 0.331722 0.258315 0.281431 0.350388 0.26 0.283853 0.378375 0.252443 0.281675 0.401691 0.252308 0.283197 0.428766 0.252111 0.281028 0.45233 0.253505 0.280708 0.482122 0.257337 0.300588 0.00113797 0.250163 0.306254 0.0300234 0.251661 0.308293 0.0568721 0.252871 0.309226 0.0811109 0.251766 0.3026 0.105449 0.253798 0.300323 0.133287 0.258794 0.303629 0.154439 0.250445 0.306952 0.181914 0.255276 0.308197 0.208637 0.25947 0.302927 0.226138 0.254226 0.307025 0.257134 0.258203 0.309757 0.283958 0.255523 0.302813 0.302178 0.252378 0.30573 0.331381 0.254535 0.306843 0.351079 0.255057 0.300308 0.383929 0.252241 0.300343 0.404634 0.251196 0.302965 0.427541 0.253028 0.300551 0.459132 0.255095 0.302809 0.475305 0.251979 0.332667 0.00910873 0.259772 0.332702 0.0348829 0.252551 0.331662 0.0530731 0.25613 0.328873 0.0799683 0.256216 0.328692 0.107395 0.253981 0.326147 0.127166 0.258899 0.334432 0.156557 0.255862 0.333603 0.177891 0.253184 0.328488 0.209207 0.250141 0.333908 0.225431 0.255973 0.333467 0.257573 0.25942 0.332162 0.284174 0.252021 0.325218 0.301517 0.258081 0.331567 0.334601 0.255668 0.333739 0.351324 0.259421 0.334898 0.37617 0.25455 0.329764 0.400604 0.251531 0.333319 0.426563 0.252691 0.328515 0.45299 0.255555 0.32892 0.476772 0.25251 0.352966 0.00574024 0.257307 0.35283 0.0251481 0.254331 0.358679 0.0514614 0.250642 0.350218 0.0799434 0.256384 0.356487 0.102119 0.253356 0.355464 0.132474 0.258327 0.358787 0.153795 0.250389 0.358192 0.177124 0.250793 0.356854 0.204033 0.251396 0.353575 0.231468 0.255266 0.354173 0.259539 0.253586 0.357666 0.275696 0.252845 0.354832 0.300805 0.259082 0.354629 0.332777 0.25083 0.352401 0.350498 0.252888 0.35716 0.375224 0.255771 0.353692 0.404623 0.257627 0.355693 0.433204 0.25427 0.353382 0.455806 0.256099 0.359861 0.482095 0.254871 0.380356 0.00423688 0.255978 0.382226 0.0275059 0.252756 0.379557 0.052761 0.256959 0.380072 0.0762612 0.255457 0.375869 0.10326 0.251187 0.381743 0.131675 0.253049 0.378516 0.158919 0.258849 0.381172 0.184522 0.259377 0.384885 0.209188 0.254885 0.380846 0.227486 0.257032 0.375271 0.250885 0.255918 0.380629 0.276775 0.254383 0.384318 0.305792 0.257802 0.37697 0.329283 0.25191 0.383962 0.355565 0.253336 0.376324 0.375441 0.257457 0.381147 0.40951 0.252494 0.383455 0.431999 0.258919 0.384851 0.452945 0.251493 0.380377 0.483294 0.252925 0.408496 0.00112306 0.259714 0.409902 0.02682 0.251658 0.401952 0.0583551 0.250889 0.409473 0.0826887 0.259455 0.408057 0.109337 0.256616 0.405867 0.128411 0.25101 0.406201 0.151508 0.253414 0.408065 0.175125 0.257623 0.404185 0.208795 0.256988 0.403743 0.226322 0.253143 0.409573 0.25919 0.25797 0.400099 0.276542 0.254586 0.409316 0.303271 0.251327 0.409984 0.327118 0.259385 0.404587 0.355263 0.250744 0.409492 0.382201 0.252446 0.408886 0.405801 0.250552 0.408708 0.432509 0.256566 0.402978 0.452714 0.252483 0.406469 0.478643 0.257275 0.433722 0.00290368 0.253736 0.429301 0.0297881 0.257545 0.425562 0.0569536 0.252099 0.42914 0.0765633 0.251578 0.429535 0.104779 0.251164 0.428103 0.132203 0.258472 0.430138 0.151684 0.250964 0.429074 0.181447 0.251604 0.427224 0.20892 0.257413 0.426908 0.229413 0.250415 0.430134 0.259752 0.258898 0.433865 0.282144 0.254563 0.428136 0.300477 0.259791 0.428236 0.328374 0.252371 0.427385 0.35289 0.257759 0.425185 0.375976 0.259089 0.429353 0.400109 0.259232 0.434641 0.427208 0.253561 0.428188 0.459655 0.253676 0.430009 0.482062 0.254636 0.452693 0.00330459 0.259558 0.459268 0.0336907 0.25915 0.452332 0.0588167 0.254386 0.456717 0.0781454 0.25362 0.450164 0.104887 0.256569 0.450104 0.133806 0.252831 0.451483 0.151607 0.254311 0.458696 0.175642 0.250709 0.45359 0.207895 0.257568 0.450793 0.227594 0.255809 0.456594 0.256444 0.250346 0.45672 0.27989 0.250609 0.458323 0.30737 0.250388 0.456085 0.33057 0.25684 0.456296 0.351875 0.254831 0.459528 0.378737 0.252829 0.454243 0.400893 0.256475 0.457316 0.431014 0.255652 0.450902 0.450503 0.255643 0.450208 0.480684 0.25536 0.481341 0.00869854 0.256771 0.479361 0.0311596 0.259183 0.482987 0.0587018 0.254136 0.475641 0.0808526 0.259981 0.47946 0.105694 0.250682 0.48486 0.133843 0.259824 0.482926 0.154098 0.250204 0.48256 0.177902 0.258288 0.475304 0.205137 0.254976 0.483032 0.233719 0.258818 0.47541 0.25744 0.25565 0.482968 0.280795 0.257788 0.475499 0.302505 0.25051 0.480688 0.332291 0.259045 0.484178 0.354868 0.256246 0.483486 0.380692 0.251917 0.478742 0.407484 0.253959 0.48338 0.430247 0.255921 0.482139 0.45527 0.253507 0.478617 0.479344 0.252106 0.507342 0.00996973 0.259532 0.50856 0.0261023 0.255521 0.501943 0.0598764 0.256467 0.501463 0.0817542 0.256632 0.503457 0.101538 0.251709 0.508785 0.131823 0.256437 0.504007 0.154142 0.254366 0.507565 0.182595 0.252597 0.501069 0.209672 0.25564 0.50209 0.229469 0.258362 0.505145 0.257021 0.253665 0.502657 0.284552 0.258784 0.504317 0.30677 0.25249 0.504433 0.326419 0.25179 0.508405 0.358867 0.258465 0.503303 0.383215 0.258123 0.507665 0.40702 0.255113 0.503543 0.434271 0.251343 0.504473 0.455149 0.256071 0.504644 0.480031 0.256188 0.525087 0.0098995 0.256341 0.527484 0.0300307 0.250509 0.525152 0.0501838 0.258879 0.531733 0.0789202 0.253318 0.528826 0.101485 0.251196 0.534967 0.129948 0.259546 0.526951 0.159065 0.257319 0.528748 0.176969 0.252081 0.528403 0.201884 0.252845 0.532944 0.231774 0.25615 0.531596 0.250285 0.254306 0.528411 0.277931 0.252809 0.525631 0.305754 0.254326 0.532699 0.330987 0.251318 0.533431 0.359358 0.250497 0.525451 0.383487 0.259357 0.529951 0.400741 0.257267 0.525778 0.429484 0.25055 0.530848 0.450591 0.25798 0.532294 0.4801 0.256442 0.552087 0.00715422 0.250189 0.550179 0.0305908 0.254069 0.559199 0.0503634 0.252269 0.550242 0.0841718 0.252371 0.559829 0.108808 0.251723 0.559767 0.134144 0.253445 0.556755 0.158552 0.253522 0.554319 0.179754 0.255366 0.557706 0.20571 0.254333 0.557588 0.227607 0.256687 0.553067 0.252702 0.255425 0.552258 0.277558 0.25368 0.557885 0.30133 0.257006 0.558277 0.329222 0.258549 0.552348 0.351968 0.257686 0.556542 0.38208 0.255073 0.551301 0.40135 0.258 0.555031 0.433278 0.257801 0.55392 0.459582 0.256657 0.550375 0.482487 0.257953 0.57962 0.0038288 0.252121 0.581439 0.0346832 0.25251 0.580082 0.0556721 0.250036 0.582159 0.0791149 0.257403 0.582209 0.108147 0.2592 0.578988 0.134762 0.257784 0.575736 0.158553 0.250599 0.580772 0.179063 0.254746 0.584945 0.208374 0.25842 0.578297 0.225039 0.256633 0.58218 0.256507 0.250653 0.578485 0.284071 0.259086 0.575056 0.306036 0.255921 0.579316 0.333701 0.253208 0.582558 0.352544 0.251454 0.576641 0.38054 0.256048 0.578738 0.403797 0.253538 0.576174 0.426387 0.251954 0.582861 0.458255 0.258879 0.578923 0.483815 0.259724 0.605065 0.000169492 0.254578 0.601462 0.0304272 0.255464 0.608832 0.0558675 0.259714 0.609488 0.0765818 0.253376 0.609729 0.101943 0.257045 0.602928 0.128857 0.256085 0.601102 0.158649 0.259057 0.606104 0.178889 0.257047 0.602711 0.205008 0.256533 0.605503 0.22756 0.250493 0.60787 0.252402 0.25356 0.602484 0.275806 0.252761 0.60278 0.301357 0.2549 0.60088 0.328328 0.255313 0.602897 0.355682 0.253021 0.606705 0.378407 0.251951 0.604262 0.404355 0.258654 0.605336 0.430932 0.253954 0.606983 0.454384 0.252633 0.60447 0.476501 0.254218 0.634064 0.0012099 0.253398 0.628938 0.0346526 0.257681 0.630767 0.0502919 0.253906 0.633964 0.0836004 0.250177 0.628446 0.10984 0.250418 0.627732 0.130866 0.255725 0.632077 0.151168 0.25583 0.628609 0.178776 0.255229 0.62908 0.201968 0.255336 0.631965 0.232916 0.252179 0.625447 0.256953 0.251515 0.626636 0.278635 0.251509 0.629076 0.308833 0.250126 0.631994 0.332833 0.259428 0.627136 0.357866 0.254723 0.632197 0.379226 0.255414 0.634747 0.405086 0.251622 0.628549 0.429512 0.255803 0.625303 0.452941 0.256188 0.628 0.480595 0.25111 0.654051 0.00846622 0.256198 0.651759 0.0335046 0.256581 0.65016 0.0541173 0.250062 0.658912 0.0804601 0.251842 0.659124 0.102056 0.25042 0.650211 0.126004 0.254037 0.653147 0.150871 0.255636 0.655619 0.182295 0.250991 0.652621 0.205283 0.256428 0.650884 0.226097 0.251174 0.656642 0.253164 0.250637 0.651677 0.282538 0.251483 0.655497 0.303347 0.253352 0.656604 0.330848 0.251291 0.657571 0.357712 0.257803 0.651838 0.381701 0.252745 0.650249 0.400088 0.258393 0.650499 0.427758 0.258757 0.659645 0.451084 0.25151 0.658451 0.481479 0.258947 0.676723 0.00013161 0.25399 0.677485 0.0321155 0.256003 0.681916 0.0567052 0.252208 0.68143 0.080385 0.255426 0.683771 0.104815 0.257964 0.684135 0.131506 0.254659 0.681971 0.155385 0.252322 0.684528 0.181609 0.254067 0.680829 0.20633 0.258151 0.683141 0.233351 0.250493 0.678346 0.256568 0.252694 0.676465 0.280459 0.254942 0.678855 0.302637 0.250086 0.682312 0.325956 0.258661 0.680762 0.351183 0.255976 0.683447 0.383489 0.254927 0.684866 0.40521 0.25817 0.675562 0.429626 0.258172 0.682337 0.454986 0.255776 0.684298 0.484907 0.253483 0.702012 0.00418372 0.256585 0.702182 0.0277185 0.258351 0.703152 0.0519209 0.253584 0.709256 0.0776453 0.257692 0.700997 0.103788 0.254391 0.702909 0.131721 0.250478 0.704144 0.150708 0.251118 0.702595 0.180175 0.259354 0.700586 0.201488 0.259896 0.701693 0.233933 0.250442 0.703335 0.259977 0.253037 0.705761 0.276177 0.255052 0.706686 0.309377 0.25671 0.709837 0.333183 0.25281 0.708501 0.350576 0.253832 0.705516 0.382197 0.259117 0.701281 0.407311 0.259046 0.706299 0.42593 0.258625 0.701576 0.450629 0.255993 0.708425 0.479668 0.250185 0.73471 0.00599206 0.256948 0.730842 0.0277319 0.252868 0.726957 0.0544863 0.252482 0.732563 0.0778647 0.255156 0.730819 0.100647 0.255238 0.729501 0.12949 0.257976 0.734274 0.150605 0.251459 0.731817 0.175568 0.253005 0.728466 0.203818 0.25925 0.733193 0.233186 0.256071 0.728812 0.252674 0.251741 0.7262 0.283142 0.252703 0.731345 0.309565 0.258702 0.726437 0.332542 0.259581 0.731273 0.359925 0.253439 0.729944 0.376411 0.259909 0.72879 0.402656 0.250579 0.725015 0.432694 0.251252 0.731628 0.455779 0.254669 0.731087 0.476713 0.27595 0.00310003 0.000118473 0.281376 0.00737783 0.0275112 0.279863 0.00703489 0.0529107 0.280355 0.00341718 0.0818893 0.282481 0.000119198 0.100167 0.281644 0.00280486 0.134611 0.280469 0.000746146 0.158884 0.281577 0.0067653 0.184156 0.278155 0.0077698 0.204762 0.276161 0.00526952 0.232779 0.282129 0.00627043 0.251066 0.280157 0.0061633 0.277838 0.279446 0.00645442 0.307789 0.275341 0.00111132 0.328855 0.284646 0.00911148 0.35618 0.275293 0.00673101 0.382158 0.275619 0.00271632 0.405658 0.283254 0.00351625 0.425941 0.283046 0.00691353 0.457079 0.277134 0.000436866 0.477738 0.279751 0.0260686 0.00150078 0.284948 0.0301441 0.030008 0.281816 0.0290465 0.0530173 0.276532 0.0252066 0.075283 0.280081 0.0290434 0.107356 0.277162 0.0268325 0.130694 0.284158 0.0341673 0.155405 0.284498 0.0320128 0.178262 0.282899 0.0284008 0.201037 0.277925 0.0349176 0.225807 0.276951 0.0263562 0.256938 0.277809 0.0284003 0.279222 0.278403 0.0251326 0.309633 0.284591 0.029408 0.329287 0.278123 0.028547 0.350814 0.280815 0.0278278 0.37978 0.275601 0.0319556 0.40981 0.283193 0.02697 0.433956 0.281821 0.0293585 0.458763 0.280077 0.0347734 0.484283 0.282474 0.0569012 0.00476898 0.283397 0.0556764 0.0334644 0.281136 0.0535247 0.0518681 0.278284 0.0508776 0.075571 0.281436 0.0583732 0.108624 0.280273 0.0568702 0.13045 0.279885 0.0510628 0.159023 0.282899 0.0587174 0.181207 0.275966 0.0565933 0.204194 0.276252 0.0597363 0.228832 0.276939 0.0544801 0.251577 0.276735 0.0519164 0.279741 0.282529 0.055112 0.309294 0.277556 0.0525692 0.328789 0.275085 0.0517911 0.353878 0.276566 0.0541241 0.378087 0.277981 0.0584081 0.407329 0.279541 0.0549095 0.43044 0.283973 0.0552026 0.452461 0.27902 0.0594273 0.483539 0.279247 0.0823943 0.00945946 0.28434 0.0801837 0.0315548 0.28433 0.0770488 0.058233 0.283085 0.0836018 0.082369 0.281743 0.0816996 0.100464 0.283363 0.0750519 0.131241 0.280555 0.0811715 0.15791 0.276225 0.0784448 0.182917 0.280618 0.07922 0.207312 0.28206 0.080023 0.233902 0.27668 0.0813974 0.252049 0.277451 0.0755436 0.275477 0.284254 0.0808557 0.305773 0.277211 0.0840428 0.329848 0.278484 0.0802519 0.356046 0.279793 0.0751095 0.376723 0.279547 0.083338 0.404508 0.279372 0.0765766 0.432506 0.282578 0.0784667 0.458717 0.275971 0.0798966 0.479691 0.280312 0.100264 0.00997543 0.27818 0.104384 0.0297258 0.283168 0.106303 0.0563715 0.282302 0.102319 0.0849543 0.282961 0.101093 0.107317 0.283399 0.106775 0.133428 0.284036 0.100067 0.15207 0.284798 0.104313 0.177349 0.281432 0.103026 0.208781 0.284109 0.10003 0.228601 0.278289 0.109483 0.253178 0.279147 0.102519 0.279933 0.277783 0.105025 0.300007 0.275571 0.106123 0.32825 0.281412 0.103619 0.350845 0.279067 0.105376 0.381367 0.277097 0.108249 0.407036 0.283196 0.107437 0.434473 0.275067 0.103762 0.453096 0.27993 0.101528 0.480137 0.279058 0.125005 0.000622049 0.275024 0.132272 0.0296086 0.284343 0.131823 0.0564861 0.281267 0.129812 0.0834515 0.282245 0.133879 0.10549 0.284096 0.132403 0.133123 0.280479 0.127328 0.157283 0.280742 0.132354 0.176776 0.27669 0.13252 0.207612 0.2755 0.130252 0.225031 0.283507 0.13161 0.251791 0.276611 0.127969 0.282122 0.281155 0.130088 0.303264 0.276481 0.12851 0.331486 0.275228 0.125161 0.351516 0.27691 0.130186 0.376927 0.282067 0.132501 0.406328 0.283099 0.12795 0.431645 0.276185 0.126013 0.454352 0.283264 0.131451 0.476941 0.2838 0.157215 0.000471441 0.281418 0.150902 0.0316419 0.280901 0.150109 0.0599243 0.280111 0.154166 0.0842568 0.275339 0.152807 0.107063 0.282116 0.154415 0.133941 0.282093 0.152576 0.159751 0.276328 0.158538 0.177975 0.276317 0.152208 0.207987 0.283741 0.156811 0.231546 0.27661 0.159262 0.250261 0.283945 0.158172 0.279001 0.278318 0.158112 0.301247 0.284441 0.157344 0.33235 0.276602 0.155393 0.355254 0.27641 0.155002 0.380636 0.282537 0.153373 0.401102 0.284854 0.156493 0.430855 0.278372 0.151339 0.450462 0.278304 0.156621 0.482927 0.276838 0.177536 0.00945257 0.284779 0.184453 0.0318643 0.276353 0.17974 0.0551796 0.276544 0.179043 0.0755788 0.278482 0.175039 0.100713 0.284105 0.175287 0.133454 0.279759 0.178177 0.157759 0.284942 0.182313 0.182518 0.279981 0.183913 0.204163 0.279069 0.176589 0.22739 0.277307 0.178585 0.254238 0.275035 0.177432 0.281333 0.276408 0.181509 0.309821 0.280003 0.17918 0.33242 0.279683 0.179161 0.352855 0.284736 0.181477 0.384586 0.281822 0.181995 0.401685 0.277115 0.183175 0.425856 0.277508 0.184028 0.454956 0.276599 0.180434 0.483729 0.279301 0.208326 0.00440166 0.279108 0.207634 0.0282446 0.282791 0.206709 0.0525593 0.28111 0.201585 0.082867 0.284291 0.203351 0.101259 0.282471 0.203086 0.134441 0.276265 0.203914 0.15981 0.279866 0.205812 0.181055 0.280779 0.208522 0.206208 0.280468 0.208505 0.227185 0.279715 0.203554 0.254888 0.284039 0.209996 0.282014 0.277383 0.207017 0.30521 0.283095 0.206184 0.329512 0.278063 0.204495 0.357867 0.275977 0.2071 0.377184 0.279061 0.207059 0.400724 0.276881 0.205635 0.433542 0.278349 0.203694 0.450912 0.284892 0.201285 0.476636 0.27523 0.232258 0.00205403 0.275218 0.227614 0.0320396 0.283332 0.229105 0.0596269 0.280582 0.233395 0.0765886 0.277098 0.228177 0.106363 0.281178 0.230131 0.127596 0.283507 0.228411 0.157606 0.284222 0.227988 0.177737 0.283603 0.232979 0.204618 0.280209 0.228465 0.232392 0.279153 0.230293 0.252306 0.280086 0.22722 0.275399 0.284014 0.227795 0.301045 0.276035 0.231473 0.329748 0.280614 0.226728 0.355616 0.282302 0.233633 0.377046 0.276054 0.227513 0.40768 0.280028 0.227653 0.430457 0.28119 0.23384 0.451061 0.282429 0.228439 0.481192 0.275838 0.251466 0.00953255 0.279576 0.259419 0.0312039 0.279609 0.251122 0.0552044 0.275946 0.253217 0.0813067 0.28231 0.252581 0.104182 0.281075 0.250761 0.126036 0.283479 0.257438 0.159602 0.283122 0.255842 0.181294 0.275938 0.257711 0.209316 0.276228 0.252159 0.232234 0.277962 0.254125 0.252659 0.284716 0.254774 0.283581 0.283584 0.256238 0.305836 0.278904 0.252193 0.329383 0.275259 0.254663 0.356256 0.278562 0.253883 0.384831 0.277745 0.251792 0.404457 0.282938 0.255376 0.430713 0.27656 0.25476 0.458183 0.27522 0.251362 0.477104 0.275236 0.276593 0.00293431 0.277389 0.28226 0.032645 0.283764 0.281104 0.0588543 0.280944 0.275031 0.077676 0.284204 0.276169 0.105609 0.284909 0.280736 0.126217 0.279347 0.275492 0.154689 0.283669 0.275635 0.179076 0.277633 0.280999 0.209257 0.275466 0.280805 0.229737 0.278823 0.284227 0.253846 0.282308 0.278429 0.281816 0.279911 0.281 0.300391 0.282545 0.280901 0.328483 0.276825 0.280504 0.355006 0.284312 0.279255 0.377137 0.281202 0.279226 0.401363 0.282543 0.278618 0.434972 0.279219 0.276691 0.451687 0.279383 0.277924 0.481427 0.283117 0.306109 0.00149525 0.282232 0.306406 0.0335067 0.275003 0.309776 0.0528121 0.284718 0.301591 0.0799859 0.281486 0.303916 0.10703 0.280093 0.307248 0.129399 0.282068 0.304373 0.151972 0.276011 0.307145 0.177196 0.275705 0.304828 0.200259 0.27796 0.307697 0.225937 0.275028 0.300406 0.250053 0.278201 0.306603 0.275847 0.28449 0.302341 0.305312 0.281812 0.306843 0.328473 0.284955 0.305419 0.357816 0.275927 0.306023 0.37808 0.279809 0.305069 0.400968 0.278633 0.308213 0.432794 0.284537 0.30216 0.450772 0.278918 0.30842 0.478088 0.281833 0.330117 0.000605147 0.277983 0.325382 0.02518 0.276241 0.330038 0.0597472 0.27566 0.327163 0.0757981 0.28007 0.333827 0.105914 0.277151 0.331773 0.130776 0.279813 0.328121 0.158147 0.276346 0.334903 0.176392 0.279054 0.330137 0.205169 0.281452 0.331056 0.229292 0.28182 0.33267 0.254829 0.275204 0.331565 0.281904 0.28045 0.328145 0.303144 0.28206 0.329454 0.327664 0.278019 0.333656 0.358011 0.282976 0.334489 0.384362 0.279035 0.333475 0.408813 0.282761 0.327663 0.425819 0.27665 0.333475 0.456826 0.282957 0.326556 0.480253 0.284221 0.353303 0.00794816 0.280702 0.352917 0.0274628 0.281175 0.352727 0.0584141 0.282107 0.359771 0.0804283 0.275701 0.353533 0.10094 0.280595 0.35066 0.134104 0.276614 0.354837 0.158077 0.28119 0.354304 0.179098 0.275065 0.357678 0.205435 0.284351 0.352444 0.229019 0.278139 0.359796 0.250644 0.281629 0.351641 0.278276 0.281144 0.350042 0.308753 0.28075 0.35899 0.333328 0.280709 0.350793 0.353215 0.27903 0.356981 0.376899 0.276266 0.35834 0.405029 0.280855 0.354052 0.428876 0.277593 0.353233 0.45275 0.284599 0.355374 0.47585 0.281915 0.380902 0.00627776 0.282293 0.379942 0.0304057 0.27514 0.377921 0.0590706 0.281585 0.379544 0.0842336 0.28371 0.382002 0.108405 0.278742 0.380804 0.131081 0.284024 0.382249 0.151873 0.278305 0.384741 0.178244 0.277558 0.377127 0.201869 0.283511 0.381186 0.232478 0.279738 0.37529 0.253983 0.276443 0.383183 0.280909 0.276767 0.382456 0.300213 0.278615 0.378854 0.329582 0.2798 0.383909 0.356684 0.280296 0.382208 0.379506 0.276449 0.384338 0.407063 0.282591 0.380615 0.428278 0.28306 0.383604 0.453288 0.282265 0.376749 0.482547 0.279303 0.403021 0.00603314 0.283019 0.403903 0.0326602 0.279797 0.404763 0.0558591 0.282621 0.407346 0.0814697 0.280715 0.403436 0.107054 0.27878 0.400872 0.130738 0.27574 0.409585 0.156016 0.278708 0.409929 0.184529 0.280771 0.400945 0.2042 0.284685 0.408561 0.233647 0.28053 0.403049 0.252895 0.284184 0.401901 0.284371 0.283349 0.403151 0.302619 0.278982 0.401351 0.327196 0.28201 0.401062 0.350784 0.282263 0.400582 0.383206 0.284864 0.404957 0.40758 0.275285 0.400609 0.427868 0.283468 0.407277 0.451579 0.275766 0.403456 0.483941 0.276737 0.433201 0.00512383 0.282422 0.431027 0.033464 0.276846 0.426034 0.0564584 0.278964 0.434477 0.0847801 0.280335 0.427467 0.107994 0.282442 0.426334 0.132418 0.282075 0.425283 0.150163 0.282774 0.430274 0.18317 0.282551 0.428748 0.200152 0.282131 0.430803 0.233931 0.280945 0.425234 0.255513 0.282193 0.428694 0.281165 0.275449 0.42904 0.309774 0.281836 0.432006 0.332952 0.284242 0.434588 0.355689 0.277343 0.427807 0.383806 0.278393 0.429743 0.401489 0.276506 0.428982 0.431649 0.277665 0.42743 0.455003 0.282001 0.425148 0.479493 0.284062 0.459928 0.00992323 0.28372 0.455107 0.0302101 0.275988 0.455056 0.0530229 0.283772 0.457358 0.0829428 0.276709 0.452599 0.105487 0.277216 0.458154 0.1301 0.275155 0.459821 0.15174 0.28155 0.458104 0.177726 0.277546 0.451473 0.200536 0.279157 0.455209 0.228441 0.278827 0.458427 0.255916 0.279701 0.459668 0.283878 0.276317 0.456383 0.306365 0.281127 0.45615 0.332042 0.28322 0.452471 0.354667 0.276324 0.459101 0.383053 0.282677 0.454217 0.404486 0.280629 0.457288 0.42832 0.28177 0.451396 0.459904 0.279716 0.455586 0.477543 0.276379 0.476458 0.00571312 0.283758 0.482706 0.0304209 0.277935 0.480722 0.0584661 0.282825 0.479513 0.0824277 0.281212 0.479454 0.107939 0.284511 0.477939 0.128259 0.279832 0.479314 0.159007 0.27832 0.482606 0.181505 0.276841 0.475137 0.204354 0.280097 0.477243 0.231926 0.277711 0.482986 0.258203 0.275415 0.484889 0.275706 0.282162 0.476852 0.302985 0.279166 0.477237 0.330302 0.283871 0.476578 0.350019 0.275384 0.479869 0.377571 0.278244 0.476512 0.401789 0.275318 0.47655 0.425225 0.282362 0.478181 0.455244 0.282845 0.481378 0.481368 0.282717 0.507578 0.000620806 0.282113 0.500999 0.0300175 0.281836 0.502066 0.0597538 0.279321 0.500174 0.0765549 0.277378 0.501128 0.107738 0.283108 0.504261 0.133379 0.281791 0.507428 0.159802 0.279896 0.502885 0.18281 0.278481 0.500082 0.208398 0.282835 0.509908 0.233931 0.278855 0.503812 0.251777 0.281276 0.505765 0.279717 0.283492 0.505661 0.301727 0.282918 0.506814 0.333284 0.283128 0.508362 0.3553 0.284289 0.508083 0.379592 0.277972 0.509409 0.408371 0.284401 0.508304 0.43314 0.283221 0.501317 0.450117 0.277621 0.509985 0.480749 0.282721 0.528137 0.000319029 0.279499 0.528018 0.0343049 0.284584 0.532607 0.0542247 0.284753 0.534163 0.082885 0.280411 0.530505 0.10947 0.27705 0.526551 0.12779 0.277044 0.526564 0.158002 0.277973 0.529449 0.180026 0.276018 0.530578 0.207424 0.278549 0.526544 0.233504 0.280914 0.527618 0.254343 0.282798 0.52905 0.277653 0.279522 0.531537 0.304079 0.28037 0.526608 0.334014 0.284348 0.525921 0.359977 0.281825 0.531135 0.384094 0.278181 0.533231 0.401132 0.281231 0.532491 0.426053 0.279143 0.528159 0.458024 0.278309 0.530921 0.475838 0.279501 0.559767 0.00146441 0.27754 0.555881 0.0329042 0.275494 0.559634 0.055721 0.278688 0.550701 0.0780552 0.282593 0.557756 0.100722 0.277648 0.550706 0.12654 0.284242 0.550168 0.155979 0.277612 0.553121 0.184965 0.28236 0.559919 0.200778 0.275485 0.559584 0.22984 0.275164 0.553608 0.25353 0.28438 0.55244 0.276654 0.277948 0.55089 0.309885 0.275199 0.559755 0.329921 0.282566 0.550761 0.359989 0.282132 0.554028 0.375223 0.278696 0.558374 0.40354 0.278502 0.551601 0.432355 0.281638 0.554599 0.4508 0.279793 0.552627 0.48144 0.279646 0.580202 0.00680111 0.281899 0.581372 0.0298916 0.276279 0.577453 0.0571064 0.276154 0.580048 0.0750653 0.276352 0.575811 0.109984 0.280143 0.5784 0.125367 0.27783 0.584749 0.157856 0.278062 0.576432 0.176394 0.279581 0.579567 0.208444 0.277492 0.575777 0.227351 0.284482 0.577554 0.250478 0.283539 0.575788 0.280912 0.283628 0.576188 0.305228 0.278759 0.579691 0.334302 0.279413 0.584753 0.350201 0.281654 0.584308 0.382838 0.283807 0.578969 0.405476 0.276225 0.57857 0.432528 0.276557 0.579893 0.459216 0.275516 0.583421 0.480403 0.275537 0.606094 3.82516e-05 0.276198 0.608435 0.0291857 0.28245 0.601612 0.0526821 0.282349 0.601592 0.0763557 0.278017 0.601114 0.105212 0.284718 0.604848 0.131126 0.280111 0.605794 0.151777 0.284905 0.603502 0.181034 0.28312 0.605667 0.206952 0.276642 0.601348 0.226342 0.282238 0.607141 0.257131 0.284553 0.605102 0.283758 0.275863 0.606206 0.303483 0.276353 0.605868 0.3276 0.280055 0.604294 0.353972 0.276244 0.601881 0.376778 0.277084 0.605303 0.405675 0.283524 0.604301 0.428763 0.276489 0.601968 0.452863 0.275726 0.607777 0.476887 0.275012 0.630991 0.00172837 0.280008 0.62793 0.0273584 0.276617 0.633209 0.0541297 0.276418 0.62691 0.0845558 0.277908 0.631379 0.102065 0.276857 0.634987 0.131643 0.279651 0.626827 0.156857 0.277021 0.626804 0.182262 0.280275 0.62889 0.203358 0.275797 0.632169 0.234291 0.278618 0.632652 0.253983 0.276375 0.627952 0.280032 0.275166 0.629155 0.302516 0.281114 0.627793 0.325898 0.280972 0.628413 0.357602 0.28249 0.632295 0.381188 0.282394 0.629706 0.403334 0.28383 0.632675 0.430597 0.283957 0.626049 0.454603 0.281504 0.625114 0.478375 0.279115 0.656874 0.000352624 0.275072 0.658194 0.0297651 0.276955 0.655989 0.0534674 0.27637 0.657383 0.0840332 0.284899 0.659949 0.106967 0.283643 0.65878 0.132369 0.282173 0.655586 0.152164 0.276151 0.65131 0.180122 0.277535 0.651895 0.202702 0.279716 0.655941 0.226781 0.279033 0.657278 0.252939 0.275097 0.656592 0.284894 0.280044 0.6584 0.308228 0.282213 0.655411 0.326833 0.283947 0.654344 0.358416 0.276559 0.651045 0.375278 0.2805 0.652447 0.405479 0.278462 0.65303 0.427622 0.279704 0.652983 0.450342 0.283749 0.652488 0.478794 0.27807 0.680922 0.00430016 0.276996 0.678252 0.0254865 0.279689 0.681148 0.0555837 0.27633 0.680859 0.0801959 0.275076 0.677244 0.100385 0.27548 0.683799 0.133324 0.284928 0.67849 0.156523 0.275612 0.681019 0.182964 0.281987 0.684015 0.20176 0.277509 0.677848 0.231731 0.283741 0.676329 0.254901 0.279197 0.684084 0.281649 0.281001 0.67986 0.301319 0.282966 0.680588 0.328486 0.277375 0.678973 0.359609 0.278502 0.683458 0.376583 0.282684 0.682862 0.400596 0.28446 0.684027 0.431782 0.282362 0.682259 0.452187 0.275538 0.68241 0.480769 0.277096 0.700278 0.00827468 0.276622 0.704116 0.0349594 0.284063 0.705252 0.0562004 0.28232 0.702632 0.0795843 0.276508 0.706969 0.10529 0.279304 0.708793 0.133873 0.282455 0.701568 0.152725 0.281687 0.708905 0.176284 0.276593 0.702566 0.204651 0.280484 0.703201 0.229492 0.283041 0.702251 0.258367 0.279165 0.703029 0.280867 0.279438 0.704647 0.307396 0.279515 0.702414 0.332849 0.283971 0.708494 0.351311 0.284578 0.701336 0.381639 0.277633 0.700019 0.408962 0.2776 0.708552 0.432574 0.277156 0.704917 0.456436 0.28004 0.703484 0.479363 0.278678 0.731779 0.00145107 0.275601 0.728643 0.0253324 0.282122 0.729722 0.0515384 0.27875 0.726138 0.0841803 0.282996 0.727505 0.104162 0.281766 0.730194 0.130551 0.278402 0.727873 0.151939 0.280874 0.727456 0.17799 0.28387 0.730387 0.205604 0.275157 0.730909 0.234614 0.275868 0.730483 0.251377 0.278138 0.732009 0.276647 0.280569 0.725063 0.307226 0.277776 0.727572 0.328762 0.284097 0.734905 0.359093 0.275217 0.72938 0.380533 0.276192 0.733541 0.400158 0.276891 0.726919 0.434373 0.276714 0.734503 0.459687 0.2814 0.732922 0.48167 0.308249 0.00200773 0.00823777 0.308233 0.000587029 0.0301106 0.301003 0.00771308 0.0569317 0.306511 0.00126202 0.0849432 0.309351 0.00510136 0.101143 0.308676 0.00439658 0.126185 0.301576 0.00264391 0.15066 0.301818 0.00338063 0.178902 0.308791 0.00703501 0.20204 0.309077 0.00867694 0.231078 0.3006 5.06823e-05 0.257594 0.304324 0.00154657 0.283416 0.306929 0.0057238 0.302185 0.303221 0.00563674 0.327587 0.300417 0.00476724 0.350143 0.306018 0.00395762 0.381767 0.301665 0.00187967 0.406483 0.30347 0.00863763 0.425695 0.307969 0.00856386 0.459383 0.30639 0.00332178 0.479959 0.305673 0.0253448 0.00629434 0.302924 0.0282479 0.0252247 0.303432 0.0275174 0.0595381 0.30991 0.0275154 0.0765854 0.300202 0.0341856 0.109479 0.304635 0.0301123 0.127469 0.308232 0.0252371 0.155991 0.301646 0.0311843 0.179888 0.304107 0.0271818 0.20966 0.30189 0.0337597 0.231266 0.303896 0.0272567 0.259295 0.305324 0.0261246 0.281086 0.30321 0.0292092 0.302444 0.302637 0.0306323 0.329648 0.308096 0.0283945 0.355754 0.308774 0.0254922 0.382912 0.300386 0.0339714 0.402306 0.307962 0.0298348 0.430905 0.301259 0.0274187 0.45512 0.306863 0.0304397 0.481957 0.300846 0.0549239 0.00024391 0.3079 0.0547121 0.0255591 0.305909 0.0546837 0.0569582 0.309993 0.0543543 0.0820901 0.302461 0.0538298 0.105305 0.30088 0.0555342 0.134324 0.304737 0.0529838 0.155757 0.305437 0.0572576 0.182211 0.304813 0.0509574 0.207495 0.305534 0.0538157 0.23301 0.301645 0.0533875 0.257061 0.301042 0.0575014 0.275021 0.307534 0.050704 0.301351 0.304433 0.0524929 0.327987 0.300521 0.0516688 0.35164 0.302857 0.0571219 0.378675 0.302909 0.0536027 0.408022 0.309221 0.051017 0.42998 0.308433 0.0517589 0.455243 0.305394 0.0571704 0.481126 0.306322 0.0779071 0.00476279 0.300637 0.0829617 0.0275574 0.305791 0.0767419 0.0588362 0.300698 0.0771691 0.0778778 0.302636 0.0768852 0.10834 0.306569 0.0758618 0.132963 0.304652 0.0758689 0.158897 0.308811 0.0793065 0.17985 0.305925 0.0826977 0.208426 0.307537 0.0784516 0.228102 0.304907 0.0801378 0.252535 0.301419 0.0849297 0.275056 0.302891 0.0833524 0.307377 0.304386 0.0813208 0.334412 0.305172 0.0756829 0.35559 0.304341 0.0837514 0.378981 0.308 0.0802587 0.408843 0.304336 0.0751901 0.42657 0.302635 0.0817408 0.458808 0.305437 0.0815003 0.475826 0.306831 0.102871 0.0030979 0.302367 0.100783 0.0317703 0.302118 0.10075 0.0526358 0.307798 0.109631 0.0800927 0.306606 0.106773 0.10628 0.307974 0.104755 0.126758 0.305831 0.101344 0.152586 0.30451 0.107398 0.18337 0.302697 0.103271 0.202394 0.307109 0.108792 0.227527 0.309457 0.103987 0.256663 0.309611 0.101897 0.279422 0.302375 0.103565 0.305023 0.304224 0.100096 0.328147 0.308835 0.103856 0.353653 0.309364 0.101489 0.375711 0.302798 0.108175 0.403438 0.305264 0.109675 0.427639 0.301885 0.100596 0.455584 0.300761 0.101893 0.477134 0.30667 0.132496 0.00894945 0.303729 0.133696 0.0271614 0.308785 0.130851 0.0510339 0.308019 0.127644 0.0778221 0.303952 0.134776 0.109786 0.304968 0.133321 0.134504 0.306783 0.1271 0.15499 0.308257 0.128944 0.176101 0.301092 0.126947 0.200039 0.309176 0.125829 0.232393 0.305263 0.132485 0.2594 0.300764 0.125241 0.281917 0.30548 0.127704 0.302708 0.308429 0.127203 0.330434 0.308563 0.131946 0.350352 0.309285 0.131236 0.382887 0.304056 0.127799 0.40199 0.304051 0.131794 0.43438 0.304027 0.128208 0.459059 0.308077 0.133263 0.476303 0.303278 0.15942 0.00267274 0.305771 0.153233 0.0283049 0.30741 0.158922 0.0554596 0.302782 0.157775 0.0786163 0.307247 0.159884 0.107912 0.306071 0.157596 0.12544 0.30714 0.152505 0.153718 0.309175 0.153585 0.178663 0.300708 0.15283 0.202535 0.30085 0.157211 0.227687 0.309321 0.157985 0.256221 0.302747 0.158869 0.275892 0.300485 0.151293 0.309998 0.309505 0.153826 0.325916 0.301543 0.153171 0.35753 0.301137 0.157044 0.383553 0.308836 0.15298 0.403736 0.303847 0.152534 0.427385 0.301436 0.159762 0.457378 0.30909 0.155424 0.479773 0.303991 0.180863 0.000229645 0.300116 0.182457 0.0300272 0.305037 0.179318 0.0549242 0.301726 0.181107 0.0762436 0.300125 0.181823 0.102852 0.302935 0.178376 0.1288 0.305892 0.180211 0.157778 0.309257 0.177436 0.176171 0.302185 0.177989 0.204496 0.304466 0.180951 0.227238 0.302761 0.184447 0.253424 0.30325 0.180339 0.275835 0.300887 0.183114 0.308978 0.308271 0.17581 0.329017 0.306937 0.180497 0.357624 0.307238 0.17925 0.379778 0.302911 0.178694 0.408031 0.301716 0.177398 0.43375 0.308542 0.181484 0.45103 0.30982 0.175442 0.479798 0.308706 0.208442 0.00280492 0.305967 0.208281 0.0279133 0.309619 0.209183 0.0585993 0.305865 0.208614 0.0758257 0.300549 0.202573 0.107771 0.300909 0.209439 0.133335 0.303976 0.20171 0.155794 0.306447 0.203427 0.179757 0.301658 0.200408 0.205781 0.30748 0.205458 0.229916 0.304259 0.209331 0.254923 0.303559 0.208147 0.275622 0.300621 0.206927 0.307129 0.300035 0.208473 0.327299 0.303801 0.207926 0.355995 0.305339 0.20041 0.384452 0.306411 0.20975 0.402516 0.301152 0.206828 0.428329 0.308886 0.206999 0.450238 0.307862 0.206661 0.484883 0.307377 0.231937 0.000764248 0.304877 0.234027 0.0298356 0.308934 0.229124 0.0547185 0.302686 0.234693 0.08033 0.302282 0.230097 0.101477 0.307313 0.233373 0.128333 0.302044 0.230007 0.151753 0.30521 0.23373 0.176378 0.304446 0.234293 0.2012 0.305835 0.231268 0.227482 0.308646 0.229206 0.252831 0.308052 0.231086 0.283215 0.307976 0.226705 0.30815 0.306503 0.232372 0.333948 0.300764 0.226592 0.359309 0.309463 0.234116 0.384366 0.301844 0.23114 0.405575 0.309486 0.232444 0.429755 0.300551 0.231115 0.459093 0.308263 0.232984 0.475917 0.307077 0.259282 0.00115455 0.301932 0.256756 0.0343071 0.303078 0.257852 0.0529188 0.300694 0.253977 0.0776724 0.300597 0.251597 0.109487 0.308734 0.250473 0.132333 0.301516 0.25986 0.155698 0.308399 0.256387 0.176491 0.307385 0.253571 0.205252 0.302309 0.256482 0.225633 0.301211 0.255487 0.257938 0.300682 0.258371 0.281093 0.308861 0.259469 0.305688 0.300831 0.250099 0.334425 0.304222 0.253643 0.351697 0.304144 0.259953 0.380152 0.307954 0.256937 0.405896 0.309638 0.25018 0.427256 0.300553 0.252514 0.452316 0.302415 0.254282 0.481058 0.300734 0.283001 0.00843857 0.30649 0.283833 0.02812 0.302889 0.276284 0.0556493 0.302343 0.282265 0.0845743 0.306025 0.279723 0.107814 0.308419 0.280727 0.132938 0.300656 0.279111 0.155336 0.307709 0.275319 0.181192 0.300947 0.275797 0.209494 0.305675 0.276483 0.229651 0.307677 0.276705 0.252404 0.300129 0.28174 0.283477 0.304217 0.276514 0.305163 0.30807 0.278569 0.332571 0.307813 0.278766 0.351898 0.309821 0.283375 0.376543 0.305329 0.282118 0.409135 0.306421 0.278248 0.430551 0.300437 0.277167 0.457168 0.307459 0.281083 0.476999 0.306068 0.304883 0.003039 0.309097 0.306387 0.0341254 0.304317 0.306303 0.0507941 0.306577 0.303789 0.0818218 0.308296 0.309902 0.105194 0.302271 0.302292 0.130671 0.304857 0.301317 0.152957 0.303287 0.30682 0.179395 0.305523 0.303451 0.209548 0.30577 0.30824 0.231415 0.307192 0.309229 0.259381 0.304185 0.304081 0.279005 0.304708 0.305857 0.304823 0.301601 0.3083 0.334985 0.3016 0.305961 0.355151 0.301946 0.305273 0.3751 0.303092 0.301353 0.404249 0.303678 0.300483 0.429908 0.309071 0.302105 0.450857 0.302449 0.306984 0.483097 0.304153 0.333936 0.00768421 0.308189 0.333796 0.0319432 0.303748 0.331715 0.0591938 0.303586 0.334367 0.083062 0.308292 0.327394 0.102586 0.309618 0.330647 0.130392 0.306007 0.330407 0.153702 0.308588 0.32636 0.181746 0.301188 0.331433 0.205409 0.30692 0.329979 0.232956 0.309813 0.327377 0.254477 0.300732 0.325855 0.27667 0.304464 0.329289 0.306911 0.303778 0.334028 0.328839 0.301223 0.325489 0.355949 0.309307 0.329632 0.384705 0.305177 0.33072 0.400482 0.301528 0.33349 0.430351 0.300669 0.326026 0.459127 0.302154 0.329946 0.482338 0.308327 0.35642 0.00286016 0.300123 0.350985 0.030264 0.300313 0.350869 0.0597648 0.30914 0.357619 0.0829212 0.308189 0.359492 0.108231 0.302649 0.359877 0.134799 0.303076 0.357401 0.156821 0.305371 0.353897 0.184059 0.302514 0.353586 0.20524 0.300285 0.350893 0.234783 0.30201 0.352102 0.254237 0.307357 0.352054 0.284206 0.308915 0.358042 0.30831 0.304358 0.35853 0.332844 0.305934 0.351131 0.357774 0.300093 0.357895 0.383912 0.30492 0.353087 0.400087 0.309059 0.3563 0.42541 0.309488 0.352974 0.456483 0.306025 0.357718 0.483086 0.304745 0.383761 0.00696115 0.305612 0.37763 0.0307129 0.30609 0.383833 0.0518504 0.30689 0.380519 0.079598 0.304019 0.378417 0.109332 0.305895 0.383197 0.129402 0.300172 0.379679 0.152988 0.307954 0.379866 0.176514 0.303057 0.380653 0.208399 0.30978 0.380996 0.232101 0.308385 0.379989 0.252134 0.308286 0.382211 0.279619 0.304219 0.384599 0.301414 0.306449 0.380251 0.328191 0.307247 0.381989 0.35465 0.305388 0.378671 0.384606 0.30628 0.380166 0.402964 0.300595 0.381882 0.425027 0.309665 0.376819 0.452463 0.303279 0.383504 0.484714 0.300027 0.402974 0.00529406 0.301413 0.406605 0.0250723 0.303429 0.401212 0.0502115 0.308361 0.405528 0.0765455 0.303602 0.409112 0.101107 0.306459 0.401496 0.126247 0.308733 0.407138 0.152221 0.301115 0.405293 0.180558 0.302133 0.401902 0.206628 0.306381 0.404172 0.234913 0.307165 0.408974 0.253667 0.305647 0.40147 0.276165 0.305081 0.400841 0.305949 0.307095 0.402532 0.331012 0.303617 0.401385 0.356203 0.305798 0.401124 0.381592 0.302529 0.404492 0.403336 0.306578 0.401444 0.426182 0.30319 0.403514 0.451846 0.301122 0.400449 0.479528 0.301596 0.432188 0.00294482 0.306995 0.425132 0.0311949 0.30418 0.425633 0.056532 0.309527 0.43137 0.0791477 0.309541 0.430007 0.103489 0.303645 0.431589 0.132553 0.303293 0.431298 0.158633 0.304275 0.430018 0.178127 0.306338 0.430962 0.203256 0.309039 0.434556 0.226012 0.301852 0.42647 0.257517 0.300786 0.426255 0.278761 0.307024 0.427082 0.301276 0.308644 0.428027 0.329221 0.309353 0.431281 0.352271 0.30538 0.428846 0.375966 0.300585 0.431986 0.407578 0.309019 0.431367 0.426652 0.309281 0.431161 0.45287 0.301379 0.433942 0.481712 0.305086 0.459356 0.00689832 0.305692 0.450831 0.0279494 0.308958 0.452153 0.051848 0.303595 0.459606 0.076978 0.308168 0.453832 0.10961 0.307581 0.456163 0.129221 0.300868 0.452423 0.157988 0.306144 0.451361 0.184473 0.302485 0.457442 0.203425 0.30446 0.457091 0.234598 0.304504 0.459279 0.258416 0.309932 0.457098 0.280752 0.309428 0.453475 0.302912 0.300346 0.451789 0.329364 0.300498 0.45156 0.357906 0.309483 0.459092 0.376737 0.303315 0.450515 0.408118 0.306906 0.452891 0.433613 0.309332 0.452942 0.455221 0.306669 0.459929 0.479602 0.306513 0.477149 0.00166824 0.309599 0.481563 0.0268987 0.305359 0.476492 0.0541992 0.304182 0.482457 0.0842317 0.302748 0.475998 0.107313 0.304304 0.483744 0.125625 0.309373 0.482763 0.150239 0.300326 0.479773 0.178414 0.307632 0.482601 0.204825 0.302095 0.482328 0.229629 0.304423 0.482513 0.25138 0.30029 0.478982 0.276392 0.308458 0.477031 0.302744 0.304669 0.484184 0.326854 0.305853 0.484892 0.352636 0.306811 0.475064 0.380626 0.308314 0.475886 0.404221 0.30701 0.481124 0.432332 0.307164 0.478269 0.455377 0.304996 0.482603 0.481348 0.305869 0.509536 0.0032162 0.308188 0.500816 0.0325835 0.303865 0.503761 0.0528487 0.304806 0.501058 0.0789954 0.302841 0.504663 0.100656 0.306102 0.50392 0.129657 0.302117 0.507621 0.153347 0.308642 0.507378 0.181461 0.306605 0.503718 0.20865 0.309234 0.506341 0.2314 0.303083 0.508772 0.253777 0.306787 0.505402 0.278581 0.308857 0.509712 0.307356 0.304514 0.504188 0.330348 0.306244 0.509594 0.355461 0.307067 0.508047 0.381884 0.300435 0.503863 0.403947 0.307905 0.500021 0.43231 0.300523 0.503321 0.458044 0.306414 0.502802 0.481556 0.302635 0.532142 0.00801168 0.305529 0.533165 0.0348201 0.304532 0.528641 0.0553618 0.30651 0.52655 0.0822674 0.301552 0.525215 0.107611 0.301869 0.532708 0.133183 0.3011 0.529084 0.153447 0.306264 0.533976 0.179117 0.301689 0.525382 0.206437 0.305893 0.532315 0.22869 0.304911 0.525917 0.256751 0.304262 0.53258 0.277855 0.300394 0.527574 0.30486 0.300537 0.531816 0.326232 0.309737 0.532349 0.355546 0.301042 0.532875 0.384792 0.30529 0.533638 0.407 0.300003 0.526981 0.43134 0.306479 0.534089 0.458994 0.306167 0.52736 0.480743 0.3021 0.557094 0.00681783 0.308297 0.558677 0.0344775 0.308989 0.55658 0.0529061 0.308553 0.557158 0.0760215 0.302007 0.552036 0.10923 0.301476 0.558238 0.131038 0.309022 0.553596 0.154771 0.300897 0.553203 0.175059 0.302399 0.550456 0.206554 0.301681 0.557369 0.232275 0.308546 0.556158 0.25669 0.303753 0.550059 0.276756 0.306646 0.558125 0.306459 0.309182 0.557802 0.326488 0.309096 0.556979 0.357588 0.300705 0.556897 0.381234 0.301081 0.554332 0.408992 0.306889 0.555507 0.433069 0.30754 0.555491 0.452239 0.300202 0.55217 0.483273 0.306912 0.584819 0.00701239 0.301886 0.583296 0.029017 0.302338 0.575131 0.0565157 0.309076 0.577684 0.0843915 0.302192 0.577608 0.105206 0.309126 0.583527 0.128588 0.307376 0.57534 0.155856 0.308168 0.579183 0.178182 0.302721 0.581182 0.207275 0.301099 0.578315 0.229831 0.303283 0.584932 0.259648 0.307346 0.580484 0.28017 0.308868 0.584459 0.302315 0.303638 0.579786 0.325629 0.301729 0.584321 0.355293 0.309503 0.576398 0.38388 0.308432 0.584766 0.408995 0.305693 0.578622 0.432954 0.302777 0.576828 0.456711 0.304947 0.577096 0.478025 0.309072 0.607808 0.00801763 0.300232 0.609181 0.0294948 0.301532 0.603073 0.0574165 0.306222 0.607712 0.0764009 0.300243 0.607384 0.108376 0.304144 0.602286 0.126593 0.309061 0.603391 0.154764 0.301454 0.602388 0.177217 0.306663 0.605166 0.203881 0.308375 0.60318 0.226986 0.306061 0.601575 0.251194 0.302451 0.605928 0.283744 0.307712 0.605381 0.301909 0.301085 0.607852 0.333723 0.301747 0.605883 0.359241 0.303088 0.608914 0.384312 0.309939 0.607202 0.403729 0.308739 0.603929 0.426618 0.306794 0.601492 0.458457 0.308099 0.607496 0.479336 0.309719 0.630546 0.00348467 0.304079 0.625481 0.0266779 0.308322 0.630193 0.055458 0.301707 0.627081 0.0830274 0.307323 0.633706 0.102883 0.309239 0.634611 0.129456 0.308376 0.625303 0.158976 0.307227 0.628316 0.181292 0.30126 0.628825 0.209071 0.304173 0.631643 0.230468 0.300297 0.626373 0.253401 0.300684 0.628771 0.277785 0.306974 0.631856 0.300655 0.309269 0.63244 0.330596 0.300952 0.632238 0.350063 0.304646 0.627897 0.381581 0.308214 0.625973 0.409217 0.309917 0.63321 0.425415 0.300923 0.632231 0.450872 0.309321 0.625383 0.481198 0.304001 0.652867 0.00224365 0.304887 0.654523 0.0289308 0.300192 0.6528 0.0543419 0.300751 0.652002 0.0761139 0.302663 0.652164 0.105783 0.309052 0.651752 0.131503 0.308271 0.651155 0.15711 0.305674 0.656442 0.18311 0.305435 0.655233 0.207216 0.300241 0.650407 0.231333 0.305602 0.658789 0.252437 0.307074 0.659005 0.277039 0.301474 0.651432 0.307612 0.305067 0.653526 0.334575 0.306591 0.657463 0.350672 0.3068 0.652313 0.38457 0.30938 0.650834 0.409904 0.306433 0.653378 0.42689 0.304175 0.65936 0.450076 0.303351 0.657371 0.482358 0.30566 0.681591 0.000395427 0.307234 0.679975 0.0282105 0.305203 0.684163 0.051739 0.305561 0.679157 0.0843755 0.300642 0.684144 0.102411 0.308458 0.675498 0.12719 0.305065 0.675711 0.151617 0.30125 0.681144 0.175123 0.307551 0.675984 0.20868 0.302581 0.677587 0.234716 0.307594 0.677992 0.250087 0.304094 0.676006 0.278468 0.300763 0.684751 0.303481 0.303614 0.679033 0.330019 0.301826 0.677422 0.354138 0.30013 0.676891 0.375115 0.306978 0.67506 0.402858 0.306563 0.679698 0.434227 0.304136 0.680084 0.455702 0.306055 0.67782 0.483571 0.305624 0.704234 0.00620797 0.3011 0.704194 0.0260827 0.301735 0.707435 0.0580762 0.306384 0.704391 0.0800157 0.306569 0.703395 0.101055 0.305899 0.706214 0.132415 0.309647 0.707468 0.159466 0.302641 0.704505 0.176012 0.308805 0.700266 0.204499 0.302169 0.700146 0.231621 0.306961 0.709998 0.251961 0.300051 0.704312 0.280537 0.309814 0.706252 0.305117 0.302244 0.700341 0.334727 0.302099 0.70093 0.356461 0.301221 0.704218 0.38463 0.303497 0.708552 0.402301 0.303366 0.707923 0.433871 0.309713 0.70167 0.459971 0.300413 0.704314 0.484965 0.303785 0.734278 0.00133318 0.308931 0.729171 0.0284361 0.301007 0.733562 0.0542623 0.300184 0.734791 0.0831088 0.300153 0.72689 0.100915 0.301935 0.730253 0.13149 0.303081 0.729742 0.151974 0.30632 0.730369 0.182942 0.301388 0.725316 0.200176 0.305085 0.727476 0.233117 0.303438 0.731463 0.253085 0.309337 0.729821 0.281903 0.30106 0.725267 0.308199 0.30251 0.734377 0.328013 0.301061 0.725085 0.356316 0.306891 0.732636 0.376122 0.305592 0.733656 0.405193 0.301873 0.726182 0.425387 0.302223 0.72874 0.453837 0.30182 0.730862 0.483246 0.331763 0.00645571 0.00913905 0.332629 0.0046803 0.0334364 0.330209 0.00251805 0.0558683 0.329115 0.00996592 0.0846293 0.32544 0.00930824 0.109163 0.329587 0.00887866 0.134926 0.329721 0.00300467 0.154023 0.32611 0.00423177 0.184425 0.327658 0.00307233 0.200115 0.32651 0.00241918 0.22688 0.326495 0.00137003 0.25786 0.325695 0.00404508 0.282901 0.325619 0.00313123 0.305872 0.326594 0.0012164 0.325934 0.326495 0.00508343 0.359983 0.330193 0.000215705 0.384703 0.332184 0.0044868 0.409273 0.331841 0.0049206 0.432134 0.334286 0.006851 0.457646 0.329208 0.00828195 0.476666 0.328081 0.0327501 0.00823825 0.331983 0.0342988 0.031217 0.327421 0.0325888 0.0572306 0.334458 0.0289068 0.0798474 0.33082 0.0303472 0.102597 0.333114 0.0264766 0.127682 0.329877 0.0292869 0.155926 0.327333 0.0278499 0.184372 0.325558 0.0293275 0.208091 0.332983 0.034058 0.225104 0.328111 0.0314084 0.258568 0.325272 0.0305643 0.275292 0.332559 0.026786 0.309761 0.327197 0.0276388 0.333478 0.329713 0.033116 0.357956 0.328543 0.0257842 0.381372 0.3329 0.0312543 0.409688 0.325856 0.0292134 0.426313 0.332095 0.0269695 0.452303 0.327515 0.034199 0.484401 0.327702 0.0516205 0.00538533 0.332507 0.0538149 0.02843 0.333326 0.0558378 0.052007 0.328176 0.0507036 0.0836556 0.332896 0.0577957 0.108015 0.325119 0.05069 0.132762 0.333919 0.0584088 0.150193 0.33164 0.0561138 0.182263 0.327641 0.0560404 0.200185 0.332205 0.0579444 0.225126 0.333109 0.0588366 0.252757 0.331327 0.0545888 0.279755 0.328713 0.0536309 0.304021 0.330447 0.0553455 0.327143 0.325264 0.0534691 0.356757 0.329054 0.0503339 0.377759 0.328859 0.0573953 0.402438 0.334333 0.0505968 0.431849 0.327283 0.0521622 0.453369 0.331419 0.0590983 0.484829 0.325163 0.0790578 0.0023298 0.333619 0.0815132 0.0347792 0.330291 0.0750809 0.0582659 0.328718 0.0802516 0.0774643 0.334575 0.0807528 0.103392 0.332777 0.0840839 0.126408 0.333903 0.0839603 0.157815 0.326678 0.0761409 0.179633 0.33087 0.0804129 0.20242 0.334268 0.0832142 0.234017 0.327707 0.0821602 0.251123 0.333006 0.075392 0.28416 0.328367 0.0758879 0.300598 0.327326 0.0751217 0.331702 0.327381 0.0822812 0.352458 0.326059 0.082844 0.379328 0.327884 0.07597 0.402028 0.328049 0.0789226 0.433986 0.325554 0.0821617 0.455391 0.32686 0.0839729 0.480398 0.334739 0.106303 0.000686093 0.328898 0.108201 0.0292781 0.334809 0.107476 0.0530758 0.331392 0.107672 0.0826883 0.334495 0.104227 0.101381 0.334147 0.109494 0.125132 0.33038 0.101373 0.15998 0.331238 0.100888 0.18367 0.331817 0.107736 0.207858 0.327286 0.109143 0.234419 0.327436 0.107307 0.250359 0.333716 0.103244 0.281341 0.33085 0.104084 0.308978 0.330752 0.108266 0.334433 0.325324 0.100828 0.351466 0.329758 0.101883 0.384275 0.331402 0.10044 0.40628 0.333466 0.100313 0.434495 0.332795 0.109245 0.453419 0.328886 0.107395 0.481199 0.325584 0.13494 0.00387013 0.32731 0.129453 0.0296085 0.331675 0.126023 0.0585932 0.326299 0.133031 0.0799398 0.331206 0.132232 0.103677 0.326638 0.125665 0.131494 0.325415 0.125232 0.157109 0.330583 0.127177 0.184179 0.334878 0.129189 0.205883 0.330964 0.128709 0.225036 0.325736 0.127398 0.259395 0.331056 0.130114 0.282695 0.333481 0.128021 0.309726 0.327763 0.12515 0.329703 0.328626 0.133403 0.354831 0.327865 0.130899 0.377679 0.33334 0.125014 0.40384 0.331623 0.12725 0.426376 0.327218 0.13074 0.457296 0.333287 0.130254 0.483328 0.333259 0.151132 0.00632919 0.326327 0.159113 0.0305545 0.326697 0.153921 0.0541114 0.329323 0.155794 0.0821295 0.3287 0.153705 0.102688 0.325592 0.158028 0.131147 0.327002 0.152273 0.156807 0.330643 0.157986 0.177057 0.328169 0.152284 0.207535 0.325576 0.15401 0.228607 0.325563 0.152217 0.257516 0.326771 0.153706 0.283179 0.329648 0.152992 0.303439 0.331613 0.159355 0.328696 0.330934 0.152317 0.358271 0.32753 0.150095 0.380765 0.330178 0.158605 0.404718 0.333276 0.156282 0.425545 0.331477 0.157414 0.456439 0.328212 0.159047 0.484768 0.328126 0.181124 0.00504952 0.325504 0.182854 0.0251066 0.332269 0.17887 0.0546827 0.328521 0.182756 0.0773358 0.327707 0.177474 0.10769 0.33044 0.181271 0.132896 0.330304 0.176747 0.159958 0.332568 0.182445 0.182494 0.334093 0.175551 0.204752 0.330386 0.178875 0.226642 0.328574 0.178434 0.251875 0.327257 0.181019 0.276208 0.334376 0.178359 0.304647 0.32917 0.178955 0.328956 0.325649 0.178166 0.355298 0.327331 0.179753 0.383233 0.33214 0.180161 0.40293 0.328723 0.178396 0.429348 0.329254 0.180779 0.456284 0.3267 0.179283 0.481318 0.328069 0.205124 0.00327655 0.333009 0.202716 0.0311281 0.33176 0.208187 0.0504764 0.334925 0.204612 0.0769981 0.325418 0.206054 0.100401 0.330047 0.206049 0.132326 0.327426 0.20718 0.152149 0.332942 0.202265 0.178075 0.331191 0.201524 0.20198 0.328784 0.201594 0.231517 0.326992 0.200336 0.253424 0.334118 0.203412 0.28045 0.33307 0.202801 0.309918 0.334365 0.20416 0.328084 0.33458 0.207891 0.352295 0.33203 0.208957 0.379938 0.329841 0.20879 0.403924 0.328039 0.205317 0.431225 0.325744 0.206258 0.455284 0.32933 0.209371 0.47838 0.332818 0.225017 0.00985465 0.325761 0.227702 0.0251883 0.328414 0.229353 0.0536815 0.327496 0.232306 0.0825038 0.32612 0.226318 0.107675 0.328622 0.225001 0.127299 0.331008 0.226745 0.158686 0.333077 0.227484 0.179797 0.330476 0.232933 0.206356 0.333715 0.234691 0.226144 0.333315 0.234739 0.250557 0.325425 0.234706 0.278815 0.334068 0.234547 0.306289 0.332982 0.230622 0.325778 0.326162 0.233509 0.354576 0.325223 0.234359 0.378995 0.332963 0.230438 0.400769 0.331049 0.230907 0.427156 0.329299 0.228028 0.454452 0.333989 0.229002 0.483825 0.325589 0.258078 0.00213743 0.329082 0.254346 0.0346409 0.33324 0.259614 0.0536616 0.326954 0.251339 0.0792126 0.330917 0.259728 0.101857 0.32728 0.251863 0.126023 0.328643 0.251798 0.151313 0.325382 0.256447 0.178618 0.32833 0.25706 0.20727 0.332671 0.256397 0.231837 0.325793 0.2569 0.250669 0.327672 0.255961 0.277088 0.331168 0.258411 0.307205 0.33445 0.258654 0.329961 0.330196 0.252391 0.351815 0.330082 0.257042 0.376095 0.332786 0.250689 0.408856 0.325918 0.252465 0.425839 0.32741 0.257712 0.45148 0.329184 0.250585 0.480219 0.328238 0.277459 0.00530165 0.329214 0.282738 0.0266806 0.329145 0.277971 0.0513442 0.326241 0.278788 0.0793659 0.330832 0.278516 0.106184 0.327107 0.278679 0.129356 0.332243 0.275539 0.154728 0.333659 0.277998 0.177627 0.327581 0.276942 0.209049 0.330169 0.277783 0.229435 0.32511 0.275325 0.251268 0.330851 0.280753 0.282072 0.33258 0.282976 0.309791 0.329219 0.281819 0.331029 0.331209 0.275016 0.350676 0.329911 0.282 0.383877 0.331521 0.27594 0.402902 0.332963 0.279515 0.430157 0.333651 0.275026 0.452909 0.334117 0.275338 0.47629 0.332782 0.30524 0.00460549 0.33182 0.303868 0.0349857 0.327161 0.300923 0.0510789 0.326538 0.301319 0.0819949 0.331814 0.303424 0.109492 0.327814 0.306954 0.134087 0.325711 0.301749 0.150163 0.334172 0.307861 0.178494 0.332043 0.306118 0.207468 0.330655 0.301017 0.23418 0.334082 0.30851 0.254356 0.330391 0.307759 0.278143 0.330358 0.308252 0.307413 0.334503 0.300599 0.334557 0.326111 0.307207 0.355878 0.325917 0.306445 0.377374 0.331823 0.30929 0.405074 0.332815 0.303032 0.430389 0.329293 0.308573 0.450661 0.334708 0.309226 0.482268 0.331897 0.333671 0.00986942 0.328853 0.329947 0.0277561 0.326046 0.332192 0.0509876 0.325365 0.327297 0.0790268 0.325615 0.325628 0.101233 0.332237 0.329307 0.131651 0.333833 0.330239 0.15143 0.333072 0.325183 0.183639 0.329589 0.334956 0.20408 0.332042 0.334307 0.234451 0.325459 0.331771 0.253962 0.329394 0.329715 0.27518 0.331797 0.334837 0.302398 0.330578 0.333054 0.326758 0.334478 0.332412 0.357614 0.333059 0.326219 0.378338 0.325956 0.332963 0.403739 0.329898 0.332031 0.428655 0.329421 0.328599 0.451388 0.330261 0.326632 0.478759 0.32641 0.358956 0.00764958 0.332326 0.359918 0.0262084 0.331399 0.356231 0.0501923 0.327173 0.355707 0.0773088 0.328153 0.351446 0.101412 0.333546 0.354241 0.132265 0.327927 0.353692 0.158433 0.334653 0.350131 0.178092 0.326613 0.351635 0.203748 0.330145 0.351774 0.229705 0.328155 0.355761 0.255544 0.328246 0.36 0.278614 0.327527 0.352023 0.304497 0.325445 0.359713 0.329606 0.331137 0.351868 0.350568 0.328373 0.357217 0.376589 0.327712 0.352279 0.407471 0.327134 0.355672 0.431973 0.325615 0.357409 0.457026 0.332048 0.359301 0.475971 0.329206 0.382652 0.00736174 0.325963 0.382843 0.0266872 0.331768 0.375267 0.0552437 0.330036 0.384118 0.0785776 0.328495 0.375389 0.10626 0.326725 0.381785 0.131229 0.328476 0.380317 0.15248 0.331355 0.384216 0.177541 0.327889 0.38335 0.203388 0.32517 0.376617 0.226777 0.333313 0.383096 0.254219 0.330364 0.377631 0.284398 0.33117 0.38252 0.304177 0.328464 0.38274 0.328187 0.33232 0.380105 0.355495 0.33315 0.383017 0.384248 0.331143 0.381747 0.403996 0.332507 0.382161 0.426676 0.326848 0.383879 0.453925 0.327832 0.384386 0.478603 0.33338 0.40232 0.00335977 0.328867 0.405014 0.0279091 0.330608 0.40199 0.0560501 0.333992 0.406894 0.0756889 0.331315 0.400847 0.107239 0.333419 0.405765 0.126707 0.330493 0.408035 0.152621 0.326475 0.403507 0.184358 0.330718 0.403162 0.201511 0.330926 0.400967 0.232262 0.33463 0.406304 0.253607 0.327905 0.404919 0.283868 0.331686 0.402049 0.306253 0.326872 0.403353 0.332097 0.334078 0.403651 0.359182 0.327728 0.404895 0.384804 0.328738 0.407735 0.403514 0.333661 0.402754 0.427026 0.32531 0.404949 0.4529 0.326382 0.402018 0.480645 0.331657 0.433176 0.00775689 0.330989 0.426052 0.033954 0.327256 0.431751 0.0590777 0.325103 0.429336 0.078242 0.333742 0.429904 0.11 0.334376 0.426641 0.125018 0.333712 0.431215 0.159517 0.331281 0.432067 0.183836 0.329677 0.433803 0.202861 0.325742 0.428944 0.234564 0.332128 0.429229 0.258577 0.328429 0.427759 0.278535 0.331601 0.430906 0.307623 0.330972 0.428276 0.334781 0.327373 0.427758 0.358874 0.3285 0.43423 0.379451 0.331135 0.433751 0.406719 0.331833 0.433171 0.434139 0.331537 0.432976 0.458316 0.333205 0.430316 0.47512 0.333526 0.459711 0.00489848 0.329813 0.451124 0.0335523 0.331912 0.453313 0.0584444 0.333383 0.458786 0.0834525 0.331731 0.455009 0.100012 0.333468 0.45936 0.134528 0.331401 0.457446 0.152187 0.330394 0.451451 0.178417 0.327047 0.451065 0.203767 0.326192 0.451695 0.2333 0.332008 0.457964 0.258982 0.327814 0.459104 0.275842 0.334762 0.452826 0.303896 0.3298 0.457769 0.329717 0.329868 0.450142 0.357015 0.332711 0.454861 0.376289 0.329486 0.459329 0.400536 0.329487 0.451222 0.429667 0.332548 0.45444 0.456076 0.333853 0.453935 0.482693 0.333389 0.482986 0.000870508 0.325272 0.482776 0.0331691 0.327727 0.480107 0.0526618 0.325091 0.477118 0.0754956 0.329946 0.476817 0.100513 0.333506 0.484209 0.125587 0.32976 0.479008 0.158687 0.329683 0.47895 0.178002 0.326269 0.479585 0.207047 0.333019 0.476104 0.228258 0.333254 0.483598 0.251103 0.329619 0.480818 0.278811 0.334231 0.481797 0.308515 0.334446 0.479718 0.334278 0.333225 0.480112 0.356233 0.330401 0.478368 0.376922 0.326927 0.47585 0.406508 0.327846 0.47978 0.430152 0.33072 0.483628 0.456549 0.32873 0.482368 0.483632 0.325214 0.508774 0.00249345 0.334166 0.506383 0.0301254 0.333055 0.500817 0.050517 0.328963 0.501619 0.0751098 0.333955 0.509668 0.105815 0.326062 0.505983 0.125564 0.334891 0.505989 0.156972 0.334957 0.506019 0.181535 0.32896 0.502029 0.209725 0.325282 0.506945 0.230751 0.331997 0.502621 0.253067 0.331255 0.506316 0.275439 0.330468 0.505585 0.306346 0.328728 0.506898 0.330795 0.334285 0.503786 0.35031 0.330877 0.504341 0.380239 0.334362 0.507715 0.404476 0.326756 0.50762 0.429298 0.329939 0.507955 0.452544 0.333883 0.50226 0.483394 0.327351 0.531083 0.00386333 0.332488 0.528247 0.028402 0.33344 0.530304 0.0562629 0.329293 0.531217 0.0799543 0.331233 0.530012 0.102636 0.334296 0.531803 0.13257 0.328213 0.527073 0.15057 0.333849 0.531896 0.175858 0.325543 0.526879 0.208701 0.328299 0.525482 0.228708 0.329216 0.526309 0.25691 0.3309 0.526416 0.28498 0.328614 0.533088 0.30262 0.328958 0.526453 0.328299 0.333114 0.531693 0.357738 0.325742 0.530504 0.384947 0.328088 0.533898 0.406094 0.332891 0.526576 0.434185 0.328069 0.527574 0.456363 0.334969 0.526021 0.478778 0.331623 0.557674 0.0028326 0.329851 0.55813 0.0332939 0.33239 0.55796 0.0546641 0.334542 0.559446 0.0787964 0.332751 0.553421 0.104498 0.330781 0.550007 0.132455 0.33035 0.551553 0.151387 0.327663 0.550389 0.176555 0.331355 0.559142 0.204148 0.332788 0.553834 0.233732 0.334851 0.554873 0.255732 0.330476 0.55802 0.275045 0.330886 0.551674 0.300268 0.32607 0.5509 0.327381 0.333966 0.558713 0.35127 0.33274 0.550892 0.383581 0.328287 0.557985 0.401242 0.326124 0.554808 0.429212 0.331936 0.556397 0.455639 0.326678 0.558922 0.479879 0.327665 0.580827 0.00976715 0.333111 0.577281 0.0272923 0.333251 0.579014 0.0563014 0.3304 0.583444 0.0801814 0.325205 0.583497 0.109127 0.327815 0.579038 0.133562 0.330868 0.575917 0.151013 0.330664 0.578908 0.176208 0.333042 0.575056 0.204883 0.333436 0.58217 0.234974 0.329545 0.57751 0.259973 0.331992 0.580806 0.275397 0.330977 0.577336 0.301025 0.334034 0.580516 0.327639 0.332075 0.580637 0.351229 0.326792 0.580037 0.378547 0.331636 0.577869 0.404983 0.333036 0.580601 0.425547 0.327861 0.579907 0.450449 0.33121 0.581769 0.48089 0.331463 0.600473 0.000582549 0.329341 0.60536 0.0326047 0.328749 0.605873 0.0540646 0.329012 0.602902 0.0797496 0.333335 0.605448 0.107634 0.329276 0.603781 0.125766 0.329046 0.609234 0.151981 0.326238 0.60366 0.184622 0.328497 0.60475 0.205592 0.331553 0.606519 0.22627 0.333792 0.604973 0.25308 0.331266 0.601381 0.275649 0.33464 0.600211 0.301849 0.33032 0.60538 0.331677 0.329104 0.608561 0.356758 0.332083 0.605149 0.380257 0.332227 0.60396 0.40165 0.331042 0.605228 0.430235 0.329009 0.604837 0.454488 0.326881 0.603832 0.478048 0.333726 0.634209 0.00128321 0.331985 0.632405 0.0308358 0.326751 0.626874 0.0521809 0.328041 0.634003 0.0831039 0.326162 0.628995 0.102691 0.334171 0.628397 0.131535 0.333151 0.629661 0.151902 0.328242 0.628214 0.18434 0.329815 0.633297 0.200603 0.327414 0.625266 0.230576 0.32689 0.62587 0.257754 0.331902 0.629365 0.276686 0.327932 0.627146 0.300979 0.334062 0.626894 0.329494 0.329371 0.626648 0.35762 0.333905 0.628302 0.383296 0.329772 0.625297 0.406304 0.333892 0.63352 0.434956 0.331512 0.629491 0.459637 0.330074 0.625189 0.475773 0.332251 0.652135 0.0020512 0.32874 0.655114 0.0263757 0.328812 0.651964 0.0590625 0.332087 0.650155 0.0812355 0.331844 0.658603 0.103439 0.32846 0.655265 0.130177 0.330473 0.655542 0.159493 0.331349 0.65074 0.181857 0.325601 0.65891 0.200094 0.327045 0.657353 0.229265 0.325353 0.653191 0.258674 0.327262 0.652057 0.280957 0.328138 0.65179 0.302102 0.32979 0.659403 0.331271 0.332818 0.659674 0.357503 0.331478 0.655528 0.375684 0.334993 0.65058 0.406523 0.326447 0.65632 0.430377 0.327082 0.650945 0.454902 0.330228 0.652467 0.477355 0.333825 0.684915 0.00212414 0.328004 0.675918 0.0319075 0.334649 0.681392 0.057362 0.326138 0.68467 0.0784573 0.325579 0.684178 0.108929 0.334106 0.683628 0.133719 0.332748 0.677203 0.150929 0.33165 0.679002 0.178679 0.332111 0.679212 0.201169 0.32679 0.679854 0.234042 0.332101 0.6796 0.253694 0.331201 0.676528 0.278847 0.33411 0.677203 0.309181 0.333152 0.681284 0.32768 0.326347 0.681123 0.35655 0.334655 0.677158 0.380819 0.329776 0.678814 0.400398 0.333273 0.675029 0.425051 0.327725 0.67641 0.459652 0.331504 0.682471 0.476821 0.327012 0.703047 0.00825113 0.330227 0.702081 0.0256851 0.330083 0.709937 0.0569829 0.333512 0.705308 0.0839043 0.328511 0.706102 0.103004 0.330621 0.703438 0.126763 0.325491 0.702681 0.154452 0.332505 0.708811 0.177698 0.333438 0.700551 0.201362 0.327845 0.705365 0.230617 0.325201 0.702605 0.250506 0.332896 0.702605 0.275807 0.332428 0.70105 0.304243 0.326393 0.705982 0.33357 0.333743 0.706862 0.35729 0.333396 0.703384 0.380582 0.334858 0.705985 0.400165 0.326076 0.707889 0.433139 0.331643 0.702548 0.454605 0.325588 0.703606 0.475919 0.331905 0.729746 0.00712618 0.325978 0.734508 0.025457 0.326745 0.725298 0.0554708 0.325309 0.728784 0.0845933 0.333639 0.734732 0.109079 0.332444 0.727412 0.129472 0.331135 0.732826 0.157762 0.32577 0.727914 0.184758 0.328459 0.727991 0.205608 0.325409 0.734161 0.226444 0.333911 0.727158 0.250635 0.334272 0.731065 0.283965 0.333696 0.734913 0.300433 0.326733 0.729339 0.330493 0.334138 0.732576 0.351201 0.330324 0.734689 0.380584 0.334513 0.727498 0.407034 0.331054 0.733787 0.429446 0.331542 0.725609 0.45772 0.325561 0.731661 0.479175 0.351551 0.00101957 0.00779446 0.353699 0.00898859 0.0313377 0.354092 0.00248787 0.05174 0.356721 0.00572165 0.0833144 0.350798 0.00481564 0.107674 0.350476 0.000515824 0.125085 0.359692 0.00871933 0.156743 0.358959 0.0014079 0.175831 0.351113 0.00247116 0.208812 0.356323 0.00409295 0.228855 0.357623 0.00938611 0.253419 0.358206 0.00671935 0.278485 0.357711 0.0066435 0.309426 0.353864 0.00277981 0.334415 0.351872 0.00892312 0.357613 0.358308 0.00891707 0.375999 0.350175 0.00472578 0.407988 0.355432 0.00883228 0.433454 0.35675 0.000845141 0.451825 0.355044 0.00965627 0.479999 0.355175 0.0346334 0.00225064 0.359093 0.0287636 0.0338665 0.357538 0.0336118 0.0529836 0.353482 0.0260212 0.0780912 0.350925 0.029267 0.106104 0.358045 0.0320563 0.131942 0.35872 0.0299396 0.150917 0.354577 0.0293708 0.179757 0.358528 0.0282043 0.205533 0.355472 0.0347907 0.22506 0.35671 0.0316421 0.253682 0.358646 0.0307559 0.281268 0.350839 0.0334106 0.30651 0.356847 0.0284353 0.328991 0.350854 0.0279281 0.357752 0.352798 0.0251658 0.375111 0.35554 0.0302163 0.402377 0.351736 0.0252869 0.432346 0.352699 0.0261622 0.45542 0.357305 0.0282122 0.478614 0.354035 0.0564266 0.00916104 0.35659 0.0570225 0.0268342 0.351766 0.0537597 0.0558203 0.355977 0.0578923 0.0813092 0.352031 0.0576339 0.103897 0.352755 0.0528178 0.127138 0.352714 0.0532444 0.154384 0.352233 0.0516839 0.180061 0.356554 0.0549693 0.201151 0.350177 0.0571514 0.225689 0.356433 0.0538386 0.252632 0.352721 0.0549232 0.275844 0.350514 0.0575164 0.305729 0.356772 0.0532235 0.330213 0.357096 0.0583147 0.352846 0.356912 0.0507981 0.381228 0.352173 0.0532379 0.407525 0.357434 0.0517198 0.431239 0.350943 0.0584571 0.451887 0.354573 0.0545362 0.484701 0.358005 0.082829 0.00642378 0.350802 0.0821007 0.0312065 0.356127 0.0833213 0.0542181 0.354546 0.0847733 0.0778992 0.353086 0.0816603 0.108413 0.358384 0.0827256 0.130295 0.358251 0.0827267 0.154889 0.351937 0.0775217 0.177111 0.350521 0.0826506 0.206912 0.351007 0.0847858 0.228531 0.35369 0.0769657 0.25988 0.356156 0.0775912 0.277959 0.357308 0.0821993 0.307935 0.355013 0.0834213 0.331449 0.353996 0.0796871 0.359905 0.356736 0.0773209 0.375414 0.35782 0.0823838 0.402056 0.352581 0.0775914 0.432878 0.354622 0.0831462 0.45777 0.355552 0.082701 0.483043 0.351775 0.103625 0.00693081 0.351166 0.100645 0.0342101 0.351308 0.106568 0.0518806 0.353783 0.105669 0.0800674 0.352739 0.101533 0.109214 0.359741 0.103329 0.133323 0.357344 0.109018 0.155009 0.356301 0.107888 0.181096 0.356997 0.106275 0.205403 0.359256 0.109762 0.227672 0.355614 0.101902 0.258352 0.359305 0.108587 0.276754 0.354878 0.10952 0.304894 0.35098 0.109125 0.326878 0.355272 0.103774 0.353859 0.353984 0.106148 0.37837 0.355612 0.107954 0.4015 0.355022 0.10821 0.428303 0.354745 0.106359 0.450467 0.357533 0.102596 0.48283 0.358529 0.128836 0.00893185 0.357708 0.134191 0.0300559 0.359599 0.127396 0.0519895 0.356202 0.130801 0.0752173 0.353453 0.130664 0.102071 0.357475 0.131912 0.125921 0.356059 0.133769 0.150827 0.354604 0.133305 0.184134 0.359562 0.12962 0.206104 0.355845 0.12956 0.234718 0.352389 0.125163 0.254413 0.352895 0.132648 0.284202 0.35761 0.131862 0.305189 0.350593 0.131724 0.32729 0.350979 0.130847 0.352321 0.353347 0.127882 0.380381 0.355483 0.12545 0.407825 0.35974 0.125828 0.430078 0.352357 0.13377 0.455498 0.350526 0.128768 0.481797 0.351596 0.158883 0.00755737 0.356109 0.159758 0.0281323 0.358143 0.159614 0.0542948 0.352771 0.154603 0.0779703 0.35705 0.156793 0.101451 0.356133 0.158667 0.128289 0.356414 0.158303 0.155245 0.355674 0.156467 0.175959 0.352983 0.151006 0.209483 0.353048 0.157697 0.226633 0.359407 0.15541 0.254231 0.352236 0.156415 0.283149 0.358746 0.156144 0.301806 0.352559 0.155274 0.332566 0.357916 0.156225 0.35443 0.356479 0.152077 0.38149 0.353867 0.155477 0.407011 0.359304 0.156234 0.434693 0.35812 0.150771 0.454652 0.352438 0.156464 0.475944 0.358925 0.182411 0.00879314 0.359795 0.183034 0.0341727 0.357583 0.179863 0.0583528 0.354197 0.177603 0.082994 0.359161 0.181531 0.104918 0.353741 0.176469 0.127378 0.356513 0.181211 0.156189 0.353352 0.181703 0.176257 0.358754 0.181574 0.206445 0.351531 0.184435 0.228035 0.355322 0.182615 0.258749 0.351935 0.178738 0.281736 0.352075 0.180148 0.305578 0.353832 0.180453 0.326069 0.358591 0.183192 0.358647 0.353329 0.176065 0.377866 0.351957 0.181025 0.402364 0.3565 0.184764 0.425989 0.350581 0.181321 0.457913 0.353301 0.180492 0.477486 0.350164 0.201871 0.00718365 0.353883 0.204144 0.0268589 0.356717 0.202232 0.0525201 0.353407 0.202225 0.0839382 0.355042 0.206354 0.102373 0.358771 0.201257 0.131966 0.355497 0.207855 0.158283 0.350417 0.201541 0.179785 0.359054 0.200622 0.200494 0.35233 0.201797 0.232699 0.354005 0.200188 0.253667 0.356831 0.200711 0.278883 0.359973 0.201618 0.303193 0.350833 0.204237 0.334568 0.358885 0.207091 0.354603 0.358254 0.205506 0.384755 0.35436 0.202875 0.406132 0.353474 0.201237 0.425704 0.3508 0.200317 0.453842 0.35553 0.202064 0.476098 0.358268 0.232337 0.00617135 0.351454 0.22728 0.0296071 0.350105 0.23088 0.0543576 0.350855 0.231637 0.0837644 0.355401 0.22905 0.104508 0.359361 0.234598 0.134844 0.351843 0.226674 0.159436 0.353083 0.23183 0.179277 0.357195 0.234604 0.207489 0.356067 0.234714 0.228266 0.350021 0.228638 0.255403 0.354403 0.228821 0.27886 0.357121 0.227306 0.307675 0.351243 0.228929 0.33407 0.351241 0.230835 0.35012 0.357358 0.229504 0.37653 0.355096 0.228815 0.404834 0.351708 0.225608 0.425496 0.351623 0.22953 0.457685 0.352547 0.230479 0.476906 0.359062 0.254244 0.00686197 0.357288 0.250565 0.0265641 0.355067 0.258779 0.0581203 0.355648 0.255985 0.0815858 0.353961 0.252507 0.107326 0.351139 0.254054 0.12822 0.355434 0.259053 0.158536 0.350687 0.253762 0.179862 0.35242 0.252275 0.201017 0.353819 0.256338 0.232537 0.356303 0.254073 0.257585 0.350673 0.259824 0.284761 0.353101 0.253792 0.304392 0.351952 0.255808 0.333776 0.354563 0.254077 0.358384 0.358257 0.254449 0.382551 0.358057 0.254569 0.40052 0.351438 0.258617 0.43051 0.353925 0.255187 0.451885 0.357316 0.255369 0.478308 0.35822 0.279756 0.000474849 0.355939 0.276308 0.0258445 0.351183 0.280107 0.0556767 0.351176 0.284178 0.0816002 0.359864 0.275657 0.106188 0.354904 0.279686 0.125591 0.357198 0.284998 0.154812 0.357388 0.275982 0.176039 0.355326 0.283028 0.205772 0.352037 0.284784 0.227834 0.350325 0.282666 0.256547 0.350877 0.279019 0.280053 0.359098 0.278773 0.306873 0.356579 0.284248 0.332704 0.357692 0.279083 0.359419 0.353097 0.282738 0.375911 0.358695 0.279521 0.408696 0.35253 0.278486 0.432393 0.358185 0.276258 0.456094 0.351335 0.282973 0.481367 0.356223 0.305045 0.0093396 0.357657 0.301783 0.0281203 0.355183 0.30148 0.055694 0.359184 0.308418 0.0764303 0.356657 0.301025 0.103499 0.357081 0.300117 0.130344 0.350623 0.309394 0.154241 0.351587 0.306781 0.184181 0.357386 0.304577 0.201614 0.359166 0.303091 0.228994 0.359442 0.302068 0.255448 0.358956 0.308256 0.283396 0.358121 0.30802 0.306356 0.352429 0.300245 0.33286 0.353197 0.302609 0.359866 0.358187 0.301337 0.375334 0.352936 0.300301 0.405768 0.356064 0.302708 0.427869 0.3579 0.303611 0.459624 0.350606 0.307667 0.482541 0.35665 0.325636 0.00530375 0.35734 0.329924 0.0272454 0.356961 0.333269 0.0523504 0.359932 0.331172 0.0831665 0.355355 0.332331 0.108017 0.352378 0.330824 0.127351 0.359428 0.328906 0.159767 0.357345 0.333186 0.176173 0.357458 0.329226 0.203687 0.352541 0.326791 0.229056 0.35427 0.326311 0.259819 0.356045 0.326802 0.276109 0.35366 0.333257 0.303111 0.353512 0.325097 0.329259 0.356816 0.329223 0.351633 0.357919 0.326013 0.377843 0.355965 0.330479 0.403237 0.353994 0.325745 0.43173 0.356111 0.328801 0.458149 0.358763 0.330238 0.482981 0.350638 0.358518 0.00630707 0.353419 0.359059 0.0327048 0.355158 0.359477 0.054802 0.353086 0.352925 0.0784606 0.354458 0.350403 0.101523 0.354887 0.352753 0.129139 0.356867 0.3584 0.154338 0.352008 0.355678 0.181275 0.358349 0.350613 0.2097 0.359314 0.359929 0.226524 0.350085 0.353241 0.257766 0.358538 0.356877 0.280097 0.35606 0.351833 0.309373 0.357217 0.35748 0.326775 0.354054 0.351461 0.352011 0.359452 0.357274 0.377987 0.356026 0.356442 0.400347 0.355089 0.359376 0.433485 0.358759 0.356795 0.453247 0.355667 0.354311 0.479979 0.352515 0.376411 0.0068621 0.357734 0.382321 0.0334212 0.359368 0.380559 0.0557023 0.357887 0.382973 0.0843006 0.352914 0.383605 0.10551 0.356445 0.376212 0.126579 0.357681 0.375966 0.15347 0.358319 0.378168 0.17687 0.354285 0.379195 0.201681 0.355394 0.381907 0.2273 0.353348 0.383748 0.254155 0.355329 0.377668 0.280567 0.356702 0.383879 0.305348 0.356104 0.380139 0.331548 0.354703 0.382472 0.359772 0.356489 0.384677 0.375167 0.358171 0.383187 0.401078 0.358239 0.383399 0.428751 0.359168 0.383806 0.451081 0.357754 0.375378 0.481668 0.355966 0.405477 0.0056806 0.356201 0.40547 0.0345597 0.358124 0.402925 0.0552685 0.356534 0.403286 0.0786333 0.359023 0.406184 0.108165 0.356854 0.403798 0.12547 0.351387 0.405109 0.154812 0.353758 0.408797 0.184845 0.352511 0.400013 0.202812 0.357166 0.403251 0.229684 0.3535 0.403475 0.253351 0.352141 0.402623 0.27566 0.358184 0.403359 0.305127 0.359235 0.406065 0.326273 0.353082 0.408584 0.355857 0.352779 0.4054 0.382597 0.356685 0.40032 0.409064 0.358048 0.40442 0.42745 0.358645 0.401389 0.458487 0.350827 0.40601 0.481441 0.352044 0.425962 0.00984467 0.357979 0.426165 0.0252381 0.359497 0.426463 0.053732 0.359784 0.427297 0.0821286 0.355546 0.431451 0.101426 0.352275 0.425481 0.133356 0.359417 0.431567 0.159213 0.357236 0.427942 0.179287 0.359565 0.429404 0.208575 0.355265 0.428099 0.229867 0.358259 0.428266 0.251407 0.357548 0.427234 0.280226 0.350323 0.429341 0.306756 0.355397 0.431755 0.333744 0.35312 0.431191 0.356316 0.35695 0.42797 0.38367 0.357694 0.427861 0.405665 0.354074 0.428643 0.434645 0.355355 0.432548 0.45741 0.356788 0.430552 0.478177 0.355828 0.454622 0.00510123 0.35727 0.45654 0.0258862 0.352836 0.454274 0.0519547 0.352877 0.455686 0.0813086 0.358472 0.45728 0.101791 0.355494 0.457868 0.125088 0.352329 0.455548 0.152006 0.35453 0.452454 0.175631 0.350369 0.453105 0.208088 0.350536 0.457405 0.229564 0.354617 0.459945 0.257979 0.350599 0.45991 0.283828 0.35109 0.454388 0.304929 0.351845 0.455556 0.326957 0.353666 0.457862 0.354943 0.352067 0.451743 0.384926 0.350341 0.454376 0.401894 0.350095 0.458521 0.428732 0.350321 0.458767 0.453829 0.359307 0.451812 0.476159 0.356361 0.480978 0.00313838 0.3536 0.482318 0.0308891 0.353989 0.478734 0.0579824 0.355886 0.481117 0.0785276 0.358906 0.475804 0.104014 0.354477 0.480203 0.134151 0.351879 0.480303 0.156271 0.351133 0.475469 0.178905 0.359956 0.480294 0.205336 0.354863 0.477669 0.234187 0.352577 0.484415 0.255909 0.357785 0.48027 0.281768 0.35321 0.481076 0.309992 0.359784 0.483877 0.331066 0.357984 0.482516 0.354736 0.353786 0.48039 0.380416 0.354296 0.480904 0.4055 0.357277 0.480369 0.428946 0.357729 0.477398 0.454796 0.354288 0.476356 0.48104 0.359172 0.505126 0.000381821 0.359947 0.507336 0.0301911 0.351595 0.504345 0.0572598 0.359503 0.50367 0.0752765 0.357259 0.50288 0.107198 0.355883 0.50916 0.129048 0.355778 0.507052 0.156172 0.350207 0.506917 0.184026 0.357285 0.500988 0.209499 0.353651 0.501572 0.225311 0.356231 0.507077 0.252941 0.357262 0.504815 0.280255 0.358815 0.501529 0.30897 0.352459 0.504471 0.327886 0.358928 0.509425 0.35017 0.356929 0.503059 0.383402 0.356862 0.503746 0.406031 0.358281 0.501483 0.426865 0.350775 0.502737 0.4574 0.355183 0.508848 0.476642 0.354279 0.530231 0.00694543 0.352373 0.528836 0.0339026 0.352762 0.529578 0.0500046 0.352659 0.530565 0.0787209 0.359906 0.532281 0.101213 0.354684 0.528558 0.127827 0.356492 0.528897 0.15804 0.355888 0.532993 0.179116 0.355253 0.526246 0.20906 0.359878 0.525609 0.232222 0.35801 0.53391 0.253928 0.359415 0.533708 0.28295 0.359177 0.531034 0.303182 0.353437 0.534042 0.32609 0.356091 0.528768 0.355855 0.359404 0.529216 0.37599 0.356275 0.526539 0.405486 0.35414 0.527109 0.427765 0.35219 0.527435 0.459434 0.350139 0.525804 0.480258 0.358127 0.556436 0.00611992 0.353626 0.551227 0.0264284 0.352992 0.558487 0.0501995 0.355935 0.553963 0.0838431 0.356912 0.554839 0.102236 0.35409 0.554513 0.128303 0.354891 0.551919 0.157698 0.3587 0.551976 0.180285 0.353163 0.555995 0.200084 0.358898 0.555343 0.234852 0.359489 0.559877 0.252286 0.354514 0.557776 0.281083 0.355395 0.556218 0.309513 0.354399 0.552769 0.334895 0.355838 0.555169 0.354203 0.356006 0.553284 0.381152 0.351168 0.557375 0.401807 0.352753 0.553984 0.428902 0.355175 0.551836 0.452191 0.353161 0.555911 0.48002 0.350984 0.576527 0.0031409 0.357561 0.579359 0.0320767 0.357414 0.584595 0.0541087 0.356763 0.582157 0.0789563 0.35735 0.580026 0.108376 0.355684 0.580245 0.129083 0.351938 0.5768 0.152889 0.351741 0.576804 0.175464 0.35796 0.580969 0.206346 0.358164 0.576052 0.231058 0.353074 0.579422 0.25825 0.353685 0.577126 0.275397 0.350374 0.583102 0.30451 0.350814 0.584587 0.329213 0.358855 0.58044 0.353243 0.350185 0.578043 0.379757 0.354628 0.583983 0.400332 0.354957 0.582732 0.425975 0.359982 0.580611 0.457648 0.359196 0.575023 0.477555 0.353215 0.605532 0.000117809 0.352234 0.605013 0.0269932 0.359633 0.607942 0.0599476 0.352197 0.6046 0.0794566 0.355801 0.601489 0.105394 0.354334 0.602066 0.125991 0.358334 0.605717 0.151104 0.358801 0.60124 0.184614 0.359442 0.607174 0.208005 0.351154 0.608416 0.230578 0.356675 0.608799 0.256245 0.357928 0.601271 0.277664 0.357088 0.606268 0.309859 0.355232 0.603122 0.33473 0.351117 0.607451 0.351822 0.355377 0.603188 0.375564 0.355501 0.608948 0.401971 0.359385 0.603875 0.432301 0.359486 0.609099 0.452678 0.358392 0.605727 0.478174 0.353767 0.633001 0.00181949 0.35032 0.626053 0.0331359 0.356554 0.634738 0.0550902 0.359696 0.633888 0.0795761 0.350208 0.634805 0.103054 0.357491 0.6313 0.127082 0.35098 0.625768 0.152302 0.359669 0.630178 0.183262 0.356263 0.631126 0.208541 0.351646 0.628728 0.232414 0.351134 0.633518 0.25976 0.359423 0.631574 0.276844 0.352907 0.629243 0.306463 0.356196 0.626168 0.330284 0.353262 0.631142 0.359642 0.356096 0.628442 0.37601 0.358075 0.626274 0.400497 0.350606 0.63455 0.430198 0.354021 0.626388 0.451755 0.356739 0.632319 0.482244 0.351749 0.655893 0.00361272 0.354348 0.658063 0.0280241 0.35466 0.653604 0.059194 0.358779 0.656222 0.0805539 0.350619 0.654537 0.10125 0.352328 0.658844 0.125524 0.353655 0.655565 0.157924 0.353596 0.656051 0.177118 0.353177 0.655435 0.202822 0.354863 0.657445 0.232085 0.352171 0.650786 0.255501 0.358827 0.655536 0.279614 0.352637 0.658332 0.300848 0.353088 0.658944 0.326571 0.354603 0.652336 0.353393 0.353361 0.651813 0.375921 0.353086 0.659798 0.408525 0.351637 0.656434 0.431661 0.358079 0.651109 0.452742 0.35367 0.654638 0.478028 0.359844 0.682986 0.00906685 0.356494 0.675597 0.0293984 0.357168 0.68343 0.0550609 0.358332 0.68085 0.0843234 0.35911 0.684198 0.102323 0.355463 0.675474 0.125196 0.356264 0.677055 0.157372 0.35979 0.68229 0.183846 0.353018 0.679515 0.205636 0.35958 0.680463 0.226206 0.353817 0.680317 0.258085 0.354259 0.675983 0.28364 0.352261 0.679156 0.309894 0.355371 0.678475 0.327542 0.352655 0.6797 0.35261 0.356042 0.680001 0.384806 0.350148 0.676368 0.407618 0.353944 0.681317 0.427782 0.355351 0.676575 0.451053 0.355588 0.677826 0.483199 0.354513 0.70609 0.0056189 0.353768 0.709502 0.0305581 0.355475 0.703562 0.0585847 0.358555 0.702761 0.0776873 0.350173 0.701077 0.109314 0.359333 0.703118 0.126947 0.355697 0.70091 0.159149 0.358676 0.702649 0.177416 0.357045 0.702546 0.201857 0.359014 0.70416 0.229108 0.354186 0.703802 0.256567 0.350951 0.707912 0.281199 0.352598 0.701952 0.307452 0.357954 0.709305 0.327843 0.357353 0.709422 0.352812 0.354678 0.703165 0.377969 0.351622 0.701478 0.402012 0.357874 0.703694 0.429202 0.351629 0.70923 0.450084 0.352289 0.708105 0.479618 0.358609 0.725004 0.00400786 0.356949 0.728613 0.0299262 0.359934 0.72505 0.0523914 0.359215 0.727144 0.0834613 0.355079 0.733305 0.105972 0.352454 0.729272 0.130726 0.351505 0.734421 0.159737 0.359781 0.727761 0.184401 0.355397 0.732344 0.200772 0.354179 0.728275 0.225443 0.351764 0.734974 0.256865 0.352279 0.729611 0.279503 0.354018 0.729703 0.303126 0.351886 0.728148 0.333858 0.353267 0.732551 0.352272 0.353851 0.73315 0.384446 0.35613 0.73023 0.403714 0.358554 0.72977 0.425038 0.359223 0.733008 0.457062 0.359082 0.727367 0.480995 0.378692 0.00930386 0.00191949 0.383084 0.00725765 0.0258603 0.383558 0.00225472 0.0578493 0.384653 0.00903911 0.0825683 0.378495 0.00787487 0.101377 0.375682 0.00825338 0.127962 0.375474 0.00371243 0.15078 0.37579 0.00981212 0.175802 0.376553 0.00753952 0.205949 0.382404 0.00337145 0.233468 0.382612 0.00702452 0.25256 0.376533 0.00993321 0.276068 0.379791 0.00192648 0.309813 0.377592 0.00145728 0.33107 0.384306 0.00808387 0.358916 0.378225 0.00742983 0.384758 0.377196 0.000986619 0.404737 0.381001 0.00718138 0.425536 0.37547 0.00922516 0.456027 0.380342 0.00615038 0.483028 0.376442 0.0313396 0.00713983 0.381711 0.0331855 0.0344987 0.37613 0.0322712 0.0580851 0.376713 0.0338536 0.0771961 0.381316 0.030511 0.102688 0.381045 0.0316324 0.131032 0.381524 0.0328729 0.156388 0.382783 0.0344062 0.183185 0.38024 0.0330499 0.203467 0.379111 0.0305814 0.231535 0.381652 0.0307519 0.256273 0.376264 0.0292379 0.283854 0.376902 0.0274731 0.302301 0.377792 0.0324442 0.328791 0.381717 0.0297893 0.35712 0.377239 0.0291917 0.382851 0.382865 0.0255218 0.406849 0.375342 0.0280506 0.425722 0.384411 0.0288696 0.453821 0.378255 0.0265841 0.480106 0.376162 0.0581122 0.00742016 0.383752 0.0560767 0.0277078 0.380767 0.057662 0.0520108 0.381684 0.0500263 0.0774221 0.384067 0.0548264 0.103001 0.378912 0.0541363 0.129764 0.376251 0.0565078 0.152477 0.377673 0.0588256 0.182026 0.376664 0.0530363 0.209254 0.375919 0.0573991 0.22929 0.381955 0.0558973 0.256124 0.376435 0.0506561 0.282538 0.377488 0.056432 0.305774 0.382596 0.0507382 0.328215 0.379822 0.0550024 0.350382 0.378812 0.0528057 0.375745 0.379823 0.0564904 0.401985 0.375125 0.0510079 0.428605 0.384437 0.0509405 0.451802 0.377519 0.0544394 0.475889 0.381336 0.0803506 0.00685079 0.381421 0.0818513 0.0293067 0.379463 0.0781507 0.0506574 0.382114 0.0817975 0.0769993 0.384198 0.0837546 0.106103 0.383189 0.0765206 0.134779 0.382619 0.0769668 0.159695 0.375461 0.0755241 0.176061 0.384076 0.0776886 0.206763 0.383156 0.0814688 0.230579 0.381224 0.0753775 0.255792 0.38052 0.0809205 0.282622 0.375132 0.0846449 0.306083 0.383521 0.0792321 0.328199 0.378873 0.0805155 0.355359 0.379206 0.0779695 0.382636 0.382921 0.0779811 0.405152 0.377655 0.0824538 0.428208 0.379408 0.0757479 0.459179 0.380382 0.0847035 0.47899 0.375954 0.101646 0.00468761 0.384292 0.108275 0.0285645 0.384868 0.103739 0.0522896 0.380753 0.109703 0.0829956 0.375212 0.108972 0.10623 0.3803 0.10003 0.131136 0.380812 0.105593 0.159062 0.379563 0.103119 0.18422 0.379376 0.102697 0.209049 0.380166 0.104866 0.225796 0.3829 0.100482 0.252187 0.377926 0.105122 0.276025 0.379816 0.10371 0.305579 0.382146 0.105072 0.328198 0.37883 0.100023 0.358695 0.383862 0.101686 0.381016 0.380836 0.106087 0.403739 0.378917 0.108339 0.434694 0.376955 0.107385 0.452953 0.380385 0.104273 0.480993 0.377297 0.128982 0.00685345 0.375162 0.128601 0.0295075 0.377746 0.134548 0.059781 0.382399 0.127693 0.0757144 0.3783 0.128284 0.103244 0.38301 0.127501 0.13397 0.383735 0.128622 0.15422 0.377733 0.127818 0.181492 0.38406 0.134191 0.201491 0.375197 0.129799 0.232368 0.382925 0.127412 0.254189 0.382951 0.128232 0.276109 0.375506 0.134824 0.30073 0.383417 0.129315 0.331015 0.37662 0.127729 0.359278 0.378135 0.125509 0.379332 0.376681 0.125824 0.401333 0.377948 0.130441 0.426889 0.375147 0.131073 0.451585 0.379606 0.131566 0.476086 0.377804 0.154638 0.00154498 0.383585 0.151135 0.0254156 0.380382 0.158292 0.0509719 0.381461 0.156556 0.081695 0.378417 0.159594 0.103002 0.384335 0.158948 0.127372 0.377064 0.152519 0.157908 0.377362 0.151375 0.179062 0.381583 0.159376 0.208742 0.375538 0.156591 0.226799 0.381587 0.156956 0.257556 0.382437 0.153121 0.276794 0.380316 0.150263 0.304028 0.381211 0.157212 0.332323 0.376682 0.156786 0.351655 0.381503 0.15362 0.384525 0.379821 0.156393 0.403883 0.377597 0.153751 0.42614 0.378875 0.152419 0.452575 0.37673 0.158239 0.478549 0.384477 0.182984 0.00403266 0.381316 0.178014 0.0287149 0.376903 0.181234 0.0515876 0.383747 0.18317 0.0828127 0.377483 0.177143 0.109539 0.384182 0.1775 0.134104 0.378748 0.182665 0.15065 0.376263 0.1767 0.1796 0.376832 0.179764 0.209828 0.382811 0.180211 0.234769 0.381424 0.179643 0.250894 0.382249 0.181904 0.282456 0.381445 0.181689 0.300294 0.382489 0.175957 0.325415 0.376178 0.179711 0.358488 0.379349 0.181842 0.38413 0.381309 0.175387 0.400949 0.383568 0.177869 0.430188 0.375812 0.180237 0.458866 0.378555 0.176783 0.482095 0.380188 0.200011 0.00658253 0.378716 0.208414 0.0345598 0.375121 0.201655 0.0576096 0.376504 0.207809 0.0776525 0.376437 0.208756 0.102079 0.378683 0.208286 0.133286 0.378221 0.200205 0.151929 0.381581 0.205319 0.175089 0.378787 0.201612 0.200441 0.377734 0.209583 0.225437 0.3821 0.205713 0.252144 0.383938 0.205666 0.279941 0.379328 0.208232 0.300864 0.381431 0.202213 0.330993 0.377103 0.201128 0.351285 0.376577 0.20704 0.379463 0.384714 0.201776 0.40418 0.384802 0.206936 0.425749 0.376176 0.208276 0.451542 0.383899 0.207685 0.479832 0.380532 0.228048 0.00390948 0.378009 0.232706 0.0301165 0.383278 0.230087 0.0545784 0.375887 0.227857 0.0788295 0.379613 0.225544 0.102071 0.376085 0.234624 0.126106 0.381049 0.228823 0.154314 0.384047 0.227362 0.176545 0.376514 0.227348 0.200195 0.375054 0.226812 0.226621 0.381015 0.229954 0.253771 0.378084 0.229758 0.281319 0.381548 0.229172 0.301488 0.376255 0.228824 0.333875 0.379602 0.233754 0.354782 0.377061 0.23302 0.381577 0.384448 0.228821 0.409786 0.375936 0.231766 0.433998 0.37715 0.234597 0.450958 0.382774 0.225983 0.483441 0.381282 0.258454 0.00336562 0.376532 0.250438 0.0328676 0.37796 0.258869 0.0504526 0.376609 0.255455 0.0780304 0.376638 0.250188 0.106554 0.377329 0.254533 0.132035 0.378906 0.250332 0.158011 0.380008 0.251693 0.184043 0.384834 0.253826 0.202578 0.384906 0.251811 0.231881 0.375108 0.255317 0.252869 0.376666 0.254779 0.280499 0.379201 0.259139 0.306638 0.381445 0.250385 0.333482 0.379881 0.254051 0.354841 0.375839 0.252246 0.380309 0.382996 0.258709 0.406649 0.382204 0.259593 0.42804 0.375242 0.258392 0.459814 0.378 0.253567 0.478339 0.381643 0.275474 0.00956758 0.38172 0.277708 0.0282151 0.379629 0.275951 0.0546004 0.37908 0.280461 0.0828633 0.376573 0.279927 0.106277 0.382981 0.275958 0.134716 0.383351 0.281523 0.151355 0.378348 0.282507 0.178279 0.380655 0.28339 0.206391 0.380478 0.282494 0.232588 0.375477 0.280754 0.252447 0.378784 0.280701 0.280688 0.383895 0.27744 0.303409 0.37896 0.275264 0.328558 0.380075 0.279227 0.356591 0.381535 0.281055 0.378908 0.382821 0.276926 0.408701 0.376359 0.281849 0.425613 0.375536 0.280663 0.457376 0.377363 0.276242 0.478568 0.384621 0.309934 0.00198377 0.384968 0.307685 0.0259165 0.379554 0.307635 0.051982 0.375363 0.304099 0.0795692 0.377009 0.302604 0.104234 0.376968 0.30146 0.133582 0.379441 0.306152 0.154297 0.3806 0.307241 0.180286 0.38102 0.303033 0.203104 0.382916 0.305569 0.225559 0.383889 0.309515 0.255873 0.378689 0.306275 0.279653 0.377951 0.305273 0.308682 0.378273 0.307239 0.330583 0.378091 0.306933 0.355829 0.383109 0.30962 0.379682 0.384746 0.303111 0.400197 0.378482 0.307147 0.432185 0.379933 0.307416 0.457227 0.384576 0.303487 0.481164 0.377986 0.331067 0.00946757 0.376861 0.331343 0.0341895 0.375566 0.330132 0.0502816 0.375957 0.325401 0.0790636 0.383665 0.331781 0.100693 0.377636 0.325763 0.133756 0.378365 0.333752 0.159674 0.378859 0.326181 0.177754 0.384023 0.325205 0.205607 0.384109 0.327416 0.23333 0.375531 0.325866 0.253996 0.382371 0.332392 0.280229 0.379527 0.334193 0.308933 0.376103 0.331086 0.325149 0.381486 0.330219 0.354767 0.381818 0.331205 0.377169 0.381641 0.327166 0.408261 0.38276 0.334247 0.429047 0.380715 0.326962 0.452593 0.377508 0.330752 0.477609 0.383142 0.353279 0.000382746 0.384251 0.356659 0.0310002 0.384797 0.356006 0.0508247 0.384963 0.353472 0.0812697 0.377718 0.351463 0.10931 0.376233 0.351084 0.128441 0.377556 0.359567 0.156721 0.379288 0.355673 0.175686 0.379371 0.352008 0.209773 0.382699 0.355807 0.23198 0.378256 0.354726 0.255861 0.37518 0.355292 0.278412 0.377171 0.358893 0.300162 0.379313 0.351541 0.327699 0.378776 0.354882 0.353678 0.379279 0.359433 0.383959 0.37948 0.351586 0.405522 0.380223 0.350205 0.430997 0.376143 0.358902 0.454988 0.384682 0.354997 0.477037 0.378283 0.375741 9.2636e-05 0.375554 0.381466 0.0315475 0.384489 0.384075 0.0566986 0.375493 0.377147 0.0822616 0.383402 0.375333 0.109729 0.375203 0.382444 0.129046 0.379633 0.378217 0.154189 0.377286 0.377504 0.176847 0.384637 0.376932 0.202685 0.381948 0.379223 0.233945 0.377528 0.378819 0.258838 0.382817 0.378949 0.277228 0.379093 0.375732 0.307122 0.37502 0.375593 0.334571 0.383611 0.383508 0.353576 0.37966 0.377625 0.384877 0.379945 0.378575 0.400384 0.384954 0.37962 0.428179 0.380887 0.383607 0.458186 0.381555 0.381789 0.477099 0.380528 0.400808 0.00765864 0.384362 0.404144 0.025285 0.378802 0.407723 0.0541729 0.380108 0.407275 0.0781732 0.384989 0.405775 0.100826 0.384086 0.4052 0.133833 0.384607 0.403222 0.155655 0.380289 0.406781 0.176926 0.379917 0.405617 0.20596 0.383426 0.401807 0.227438 0.382103 0.407727 0.252844 0.37745 0.400305 0.28258 0.383522 0.4029 0.304438 0.379685 0.400754 0.333355 0.376051 0.409364 0.355787 0.375899 0.402898 0.379537 0.383419 0.400206 0.406422 0.380427 0.40733 0.434471 0.381902 0.401938 0.450282 0.378379 0.408413 0.47844 0.376295 0.430773 0.000823857 0.380444 0.433766 0.0321155 0.381298 0.429515 0.0548623 0.381197 0.42992 0.0793117 0.38307 0.426849 0.105725 0.379739 0.430016 0.134891 0.381369 0.428324 0.156929 0.383523 0.428501 0.178673 0.379372 0.428472 0.20163 0.383605 0.425051 0.232979 0.376397 0.428627 0.25921 0.379116 0.432776 0.276036 0.380714 0.42686 0.304504 0.377289 0.431687 0.328062 0.380996 0.425262 0.351376 0.380147 0.425972 0.382852 0.38458 0.431578 0.400026 0.376537 0.425031 0.429468 0.375357 0.42516 0.459828 0.381903 0.430907 0.484665 0.382529 0.455587 0.00716626 0.378595 0.45669 0.02635 0.38219 0.459192 0.0551165 0.383141 0.454747 0.082462 0.376337 0.453796 0.101461 0.382612 0.452036 0.13058 0.377158 0.457404 0.157386 0.384119 0.459894 0.183886 0.375187 0.453559 0.203304 0.382049 0.456022 0.232804 0.376436 0.457825 0.256584 0.375541 0.453275 0.277538 0.38015 0.454878 0.307171 0.377014 0.4596 0.325271 0.376573 0.453812 0.354294 0.379635 0.458452 0.381843 0.376869 0.456943 0.405706 0.380655 0.450859 0.425189 0.379437 0.450986 0.456094 0.375398 0.451496 0.483327 0.383817 0.479787 0.000836095 0.379148 0.484998 0.0254644 0.38336 0.477352 0.0578598 0.375044 0.47687 0.0813185 0.378183 0.481713 0.108819 0.379522 0.484638 0.129766 0.3767 0.482878 0.151758 0.377291 0.476534 0.177506 0.382838 0.481883 0.209941 0.377929 0.481256 0.23327 0.381286 0.478574 0.250517 0.375154 0.483234 0.278979 0.379578 0.482986 0.307482 0.383919 0.481402 0.331778 0.376343 0.479732 0.354483 0.384234 0.475009 0.383786 0.376635 0.481806 0.406722 0.384146 0.484507 0.43083 0.382559 0.480227 0.459847 0.380354 0.476105 0.484142 0.383066 0.509093 0.00890568 0.383649 0.50639 0.0339964 0.376303 0.500407 0.0580172 0.379061 0.502042 0.0765501 0.382022 0.503465 0.10911 0.38057 0.507929 0.129903 0.384568 0.507827 0.152458 0.380762 0.506957 0.181696 0.376966 0.508915 0.201275 0.38387 0.502766 0.230171 0.376818 0.504541 0.257402 0.383726 0.501468 0.283293 0.384836 0.50927 0.309752 0.375274 0.502526 0.332892 0.38427 0.505599 0.35185 0.378051 0.502408 0.381505 0.382981 0.505949 0.409859 0.38033 0.501042 0.426471 0.384848 0.508343 0.456411 0.38015 0.503396 0.477331 0.379866 0.533406 0.00113558 0.376968 0.528722 0.0276172 0.381283 0.530643 0.0511807 0.382843 0.530254 0.0827118 0.375212 0.533454 0.106282 0.378235 0.525014 0.131363 0.375137 0.532027 0.151357 0.377467 0.534036 0.182288 0.383069 0.534509 0.206874 0.382855 0.531173 0.234584 0.383578 0.530082 0.257237 0.38345 0.534451 0.27592 0.380674 0.531814 0.308503 0.37866 0.530104 0.33252 0.38282 0.525228 0.355216 0.377619 0.528701 0.382378 0.378632 0.532661 0.403509 0.379691 0.527271 0.427968 0.379723 0.53126 0.45209 0.380585 0.527522 0.479181 0.38054 0.557015 0.00819957 0.384569 0.551603 0.0285517 0.38486 0.552567 0.052209 0.384321 0.557081 0.0784697 0.376699 0.550051 0.103626 0.377326 0.557618 0.129883 0.378864 0.553809 0.153686 0.382419 0.55438 0.175155 0.380676 0.557798 0.208505 0.380053 0.551776 0.233406 0.382205 0.550713 0.258906 0.37939 0.550227 0.279265 0.375505 0.550084 0.309726 0.381057 0.554203 0.331808 0.384051 0.554624 0.356171 0.375109 0.559274 0.376662 0.379087 0.553693 0.40858 0.381426 0.550783 0.432332 0.381292 0.556004 0.453515 0.375387 0.556253 0.479801 0.384305 0.581021 0.00912771 0.384598 0.584177 0.0273132 0.376135 0.577402 0.0548824 0.37554 0.582431 0.0761136 0.37659 0.576669 0.102134 0.377266 0.577158 0.130243 0.382507 0.577751 0.150296 0.384381 0.576475 0.175685 0.380793 0.577541 0.203193 0.379367 0.583982 0.226371 0.384251 0.577475 0.259876 0.375636 0.575096 0.28107 0.375445 0.575647 0.304911 0.376352 0.579029 0.326248 0.384335 0.576918 0.350998 0.37944 0.575655 0.38122 0.378695 0.581815 0.409366 0.378195 0.575095 0.43369 0.384897 0.575184 0.455376 0.381097 0.575872 0.483319 0.378785 0.600546 0.00116028 0.377798 0.602366 0.0319166 0.37527 0.607845 0.0599105 0.378222 0.604117 0.0826799 0.377931 0.604825 0.101918 0.382284 0.608897 0.131557 0.384789 0.606986 0.150803 0.381909 0.607792 0.182471 0.381438 0.600913 0.201394 0.376433 0.607386 0.225646 0.381072 0.602076 0.253426 0.37669 0.605794 0.284573 0.381109 0.608759 0.306867 0.379533 0.604063 0.331647 0.383036 0.602862 0.351994 0.377345 0.604124 0.377123 0.38025 0.608476 0.40312 0.378655 0.603717 0.431216 0.382674 0.603238 0.459071 0.375623 0.609767 0.476765 0.376165 0.627337 0.00830886 0.379976 0.630481 0.0302249 0.375713 0.626433 0.0588132 0.384535 0.626807 0.0771045 0.379126 0.633216 0.102872 0.379663 0.629145 0.125237 0.379901 0.63019 0.152677 0.383137 0.633528 0.183736 0.375744 0.632895 0.207342 0.380198 0.62898 0.22701 0.380683 0.630432 0.25771 0.376962 0.63438 0.279251 0.380891 0.628736 0.30165 0.381995 0.625613 0.325825 0.378299 0.632388 0.355754 0.382923 0.63404 0.38418 0.379326 0.631919 0.400935 0.383131 0.631125 0.429785 0.382389 0.629895 0.454749 0.377416 0.631508 0.476487 0.384587 0.659823 0.00686949 0.377852 0.65473 0.0333197 0.380573 0.651589 0.0582613 0.380343 0.652741 0.0794349 0.384249 0.654613 0.106386 0.382609 0.657989 0.134575 0.375504 0.65855 0.156359 0.379143 0.659574 0.175808 0.383043 0.653139 0.202098 0.383613 0.653285 0.233372 0.380644 0.657612 0.254716 0.376903 0.652873 0.283023 0.376588 0.658808 0.307564 0.383478 0.651166 0.334916 0.382586 0.650477 0.351383 0.378972 0.657415 0.384968 0.381477 0.656007 0.401207 0.384325 0.652209 0.433078 0.376956 0.65792 0.454068 0.377913 0.656917 0.480754 0.382346 0.679275 0.00181834 0.377919 0.67831 0.0333288 0.384387 0.684103 0.0591157 0.377242 0.678018 0.0803527 0.383464 0.678153 0.106133 0.378793 0.680046 0.132216 0.382474 0.681259 0.155935 0.378398 0.678557 0.181502 0.383613 0.680116 0.201329 0.376912 0.67922 0.233693 0.382135 0.679047 0.253755 0.381322 0.680965 0.279609 0.375906 0.677157 0.307156 0.382154 0.684322 0.333895 0.381877 0.684514 0.357618 0.378504 0.677369 0.382815 0.383221 0.675533 0.40976 0.382524 0.681888 0.43469 0.378985 0.68323 0.456106 0.382403 0.676562 0.482169 0.379599 0.705155 0.00155447 0.382483 0.706189 0.0321398 0.381606 0.704286 0.0578708 0.381767 0.700444 0.0830462 0.384977 0.702772 0.104352 0.38185 0.701029 0.131943 0.382845 0.70797 0.158552 0.379094 0.705895 0.178746 0.376651 0.702109 0.200581 0.381169 0.705419 0.2281 0.375861 0.700506 0.254596 0.377651 0.703295 0.28263 0.384834 0.700511 0.305015 0.377046 0.70439 0.329807 0.375075 0.702533 0.359081 0.376109 0.701601 0.377341 0.380368 0.704597 0.406017 0.383318 0.709196 0.431636 0.381192 0.703589 0.454579 0.383784 0.707793 0.48152 0.381271 0.731367 0.00566696 0.377939 0.729611 0.0331268 0.378919 0.731855 0.0546683 0.382069 0.731829 0.0781073 0.377221 0.728739 0.106048 0.384484 0.729219 0.13109 0.38411 0.729354 0.153925 0.383226 0.727399 0.177615 0.380795 0.72853 0.208859 0.384167 0.726566 0.23447 0.378198 0.731715 0.25353 0.377076 0.734762 0.282754 0.384272 0.73141 0.305877 0.383464 0.727388 0.330972 0.380102 0.726979 0.358198 0.377992 0.729713 0.382283 0.376793 0.728805 0.402764 0.382727 0.731962 0.433554 0.380553 0.729778 0.459595 0.37831 0.728156 0.475855 0.403812 0.000375932 0.00134397 0.402778 0.00577196 0.0252502 0.403562 0.00985536 0.0511727 0.406837 0.0082737 0.0837566 0.401959 0.00756171 0.109809 0.409165 0.00449616 0.132707 0.405528 0.00839263 0.151143 0.405425 0.00761864 0.175642 0.405071 0.00144754 0.203883 0.403776 0.00168587 0.232698 0.401494 0.00714584 0.250835 0.408087 0.0096631 0.277341 0.401208 0.00522875 0.308611 0.401413 0.000107632 0.325235 0.400953 0.00599192 0.358799 0.401982 0.00879057 0.380414 0.400659 0.00409214 0.40238 0.402083 0.00854178 0.430603 0.409362 0.000283017 0.450548 0.406951 0.00325922 0.482928 0.403381 0.0250874 0.00547606 0.404535 0.0327563 0.032595 0.401453 0.0333308 0.0560059 0.404558 0.0272663 0.0837892 0.402823 0.0262598 0.101905 0.401272 0.0276027 0.13379 0.405144 0.0334991 0.152375 0.401376 0.0294753 0.175321 0.406085 0.0281042 0.208474 0.402294 0.0267616 0.231173 0.400457 0.028614 0.257727 0.407516 0.0258873 0.277454 0.401827 0.0344245 0.300931 0.408315 0.0349886 0.327612 0.407579 0.0307635 0.358271 0.401078 0.0279924 0.381337 0.408789 0.027537 0.406061 0.407547 0.027018 0.43036 0.401806 0.0268259 0.450454 0.408668 0.0270808 0.484014 0.405546 0.0510214 0.00742305 0.403408 0.0571465 0.0261078 0.406631 0.0582355 0.0532258 0.400867 0.0553556 0.0795184 0.404716 0.0539355 0.103372 0.408039 0.0533723 0.130408 0.408998 0.0532745 0.158589 0.409323 0.058112 0.184899 0.405943 0.0585789 0.20018 0.409292 0.0565642 0.230085 0.408507 0.0515073 0.252588 0.401792 0.0513522 0.283614 0.402215 0.0599966 0.302609 0.407126 0.0551082 0.33131 0.409221 0.0594946 0.358952 0.401316 0.0595149 0.379043 0.404289 0.052905 0.404991 0.401143 0.0527587 0.434336 0.403969 0.0555112 0.453542 0.402057 0.0508274 0.479766 0.401097 0.079512 0.00951604 0.400382 0.0758279 0.0326072 0.405594 0.0762271 0.0565687 0.403722 0.0765436 0.0773256 0.407914 0.0766755 0.105519 0.402471 0.0815113 0.128582 0.402389 0.0820124 0.158201 0.408904 0.0820155 0.179511 0.403934 0.0753585 0.205582 0.403899 0.0780534 0.228665 0.409573 0.0832036 0.250917 0.408004 0.0802566 0.275396 0.401867 0.0797105 0.306373 0.4003 0.0779467 0.333104 0.409752 0.0750812 0.352933 0.407949 0.0840775 0.376351 0.40149 0.083129 0.40555 0.403374 0.0755942 0.434513 0.401097 0.083909 0.45261 0.407257 0.0837984 0.483617 0.409134 0.108088 0.000579774 0.404171 0.101367 0.0272788 0.406893 0.103858 0.0553841 0.407606 0.100333 0.0827266 0.405365 0.109595 0.101859 0.404805 0.10013 0.133823 0.40696 0.105384 0.155881 0.403169 0.100589 0.177408 0.403056 0.101053 0.205573 0.408193 0.101759 0.227448 0.404422 0.104275 0.257187 0.40338 0.109665 0.27673 0.409449 0.10871 0.301941 0.407804 0.106559 0.333053 0.407901 0.108444 0.352424 0.403105 0.10446 0.384244 0.405225 0.107431 0.400941 0.403497 0.104571 0.42971 0.403187 0.102201 0.456576 0.409857 0.101738 0.483829 0.40508 0.127335 0.000725935 0.401101 0.134444 0.0341367 0.402184 0.12747 0.0568851 0.409537 0.13229 0.0849811 0.401502 0.131916 0.107467 0.400042 0.131748 0.133309 0.40373 0.129676 0.151036 0.407189 0.132055 0.178293 0.402716 0.128258 0.209357 0.406895 0.130355 0.232414 0.407817 0.131083 0.253875 0.404728 0.127405 0.277034 0.407814 0.126254 0.300486 0.401718 0.133068 0.331312 0.404927 0.133605 0.355696 0.403856 0.130394 0.381786 0.405559 0.134424 0.401968 0.406158 0.13307 0.426739 0.407207 0.130711 0.45051 0.405249 0.131899 0.475217 0.406127 0.155869 0.00124844 0.407131 0.157571 0.0272398 0.400975 0.157365 0.0584799 0.4083 0.155938 0.082904 0.407887 0.155569 0.105354 0.400916 0.15044 0.134886 0.406838 0.153066 0.157381 0.403469 0.158101 0.182806 0.409384 0.158991 0.207861 0.400352 0.150323 0.22921 0.40703 0.1503 0.25798 0.408873 0.1543 0.281081 0.40286 0.15665 0.30162 0.40191 0.153258 0.329483 0.400523 0.155093 0.354437 0.406718 0.1537 0.380516 0.402305 0.157767 0.402392 0.40124 0.159879 0.426996 0.407125 0.153112 0.454695 0.404264 0.150793 0.481465 0.401235 0.181638 0.00122573 0.400798 0.182694 0.0277829 0.407995 0.18091 0.0564807 0.409258 0.176477 0.0847251 0.402718 0.179222 0.103005 0.40368 0.176618 0.132167 0.403528 0.178506 0.150597 0.405262 0.180556 0.183912 0.403831 0.176304 0.203491 0.405306 0.183751 0.232542 0.400922 0.179605 0.255944 0.407611 0.183247 0.278282 0.405578 0.178216 0.309362 0.402315 0.181635 0.327204 0.404378 0.17636 0.356054 0.403319 0.179663 0.379254 0.406607 0.184673 0.403338 0.4034 0.182828 0.43124 0.406015 0.175608 0.458231 0.40612 0.178439 0.477752 0.408959 0.20981 0.00620242 0.403945 0.205058 0.0261301 0.406367 0.205933 0.0568235 0.401954 0.207006 0.0794732 0.40803 0.205769 0.107026 0.408653 0.202717 0.12673 0.409603 0.209617 0.157223 0.406917 0.200766 0.179834 0.408192 0.204633 0.203752 0.408877 0.201527 0.22677 0.401276 0.204391 0.257274 0.403513 0.204591 0.275263 0.403773 0.200179 0.305793 0.403519 0.203359 0.334199 0.4 0.207727 0.355554 0.406652 0.201623 0.377057 0.400809 0.202947 0.404629 0.409978 0.204166 0.433305 0.409477 0.20607 0.459051 0.406237 0.208967 0.484798 0.403988 0.234812 0.00460065 0.400208 0.226339 0.0271035 0.403088 0.234581 0.0559349 0.401514 0.23128 0.0786589 0.401215 0.231183 0.105096 0.403171 0.226594 0.127222 0.40994 0.230519 0.157226 0.404968 0.228695 0.181299 0.403144 0.228997 0.203756 0.400276 0.225433 0.228379 0.402828 0.232905 0.256212 0.402158 0.228471 0.276755 0.40989 0.228693 0.30384 0.40248 0.225476 0.325184 0.404946 0.229386 0.358398 0.403124 0.232253 0.384163 0.401975 0.230752 0.403836 0.403883 0.229568 0.432879 0.40192 0.231818 0.45188 0.401161 0.230788 0.480604 0.407526 0.257419 0.00403625 0.40553 0.258755 0.0336608 0.408521 0.257704 0.0574152 0.403808 0.252319 0.0790694 0.405242 0.258773 0.109275 0.407987 0.258268 0.132539 0.408494 0.259741 0.155536 0.407619 0.257217 0.182842 0.409798 0.253033 0.204178 0.401725 0.257005 0.23246 0.400641 0.254057 0.251194 0.404119 0.256212 0.276549 0.407902 0.253191 0.303017 0.409439 0.25307 0.327245 0.402573 0.254627 0.353203 0.406367 0.250321 0.381141 0.403429 0.257906 0.400074 0.404959 0.252343 0.432492 0.404447 0.251424 0.45967 0.408831 0.253253 0.476006 0.405833 0.281753 0.00394167 0.404142 0.276492 0.0318491 0.401102 0.279554 0.0525692 0.403178 0.278864 0.0766874 0.408857 0.284029 0.104543 0.4059 0.281037 0.127255 0.401108 0.27634 0.155127 0.407679 0.277972 0.183138 0.40553 0.277488 0.200196 0.407024 0.282902 0.233107 0.402572 0.275457 0.258013 0.402034 0.282241 0.277313 0.409188 0.277658 0.302606 0.405432 0.282336 0.332633 0.406558 0.278196 0.352056 0.40447 0.283448 0.38307 0.400111 0.28435 0.405218 0.409603 0.278149 0.429651 0.401707 0.280028 0.451773 0.406312 0.280742 0.477964 0.409116 0.302112 0.00850047 0.40085 0.302073 0.0255945 0.406084 0.308202 0.0503023 0.406186 0.306629 0.0793595 0.406611 0.308654 0.10908 0.402439 0.306912 0.133326 0.40125 0.302383 0.159831 0.402338 0.300583 0.184478 0.401237 0.300673 0.206468 0.409882 0.305398 0.229366 0.406711 0.308604 0.254531 0.406097 0.307212 0.280274 0.401842 0.306407 0.30577 0.408641 0.308641 0.331434 0.401743 0.307213 0.354934 0.401391 0.309734 0.378367 0.400594 0.303064 0.400181 0.404442 0.303382 0.430555 0.403466 0.302334 0.453011 0.406723 0.308567 0.478451 0.401125 0.33484 0.00726925 0.401981 0.32942 0.0265057 0.401129 0.334636 0.0577536 0.404744 0.334805 0.0804761 0.401348 0.326383 0.105678 0.406392 0.333406 0.132511 0.403938 0.331198 0.158389 0.406223 0.333341 0.178168 0.405852 0.330593 0.207641 0.408937 0.328389 0.233324 0.404215 0.332887 0.250436 0.405775 0.330753 0.279996 0.402316 0.334762 0.309932 0.401322 0.333034 0.329018 0.406059 0.327161 0.352462 0.405465 0.327632 0.376052 0.402254 0.332116 0.404952 0.408243 0.328177 0.431879 0.40737 0.32542 0.454734 0.403622 0.328767 0.482324 0.400529 0.35632 0.00161381 0.403562 0.356588 0.0331119 0.406752 0.351136 0.0559826 0.40266 0.35114 0.0760293 0.404775 0.359847 0.105608 0.404148 0.35948 0.129885 0.406399 0.351761 0.15953 0.404157 0.353558 0.184778 0.404146 0.351215 0.202187 0.406278 0.352816 0.227454 0.403959 0.356955 0.253267 0.407993 0.35637 0.277804 0.403246 0.354702 0.304628 0.400736 0.350138 0.329357 0.405261 0.35276 0.359886 0.406352 0.359277 0.383067 0.407925 0.355797 0.404316 0.404564 0.355941 0.42531 0.40168 0.359941 0.459776 0.402183 0.352803 0.48 0.403446 0.378321 0.00654716 0.404166 0.384071 0.0285454 0.400231 0.380539 0.0517589 0.405308 0.37849 0.0837748 0.405942 0.384967 0.100511 0.406974 0.380929 0.134674 0.406881 0.379691 0.158934 0.400326 0.382039 0.184459 0.405815 0.377338 0.20495 0.407688 0.375075 0.233281 0.408198 0.381629 0.253192 0.407383 0.381045 0.278903 0.407499 0.377919 0.308137 0.401857 0.377064 0.332575 0.40861 0.375223 0.352236 0.405759 0.377107 0.376915 0.406843 0.383726 0.404152 0.400691 0.379836 0.430449 0.409124 0.383293 0.45419 0.407926 0.384223 0.477768 0.403077 0.406419 0.00727639 0.409275 0.406871 0.0319699 0.403297 0.402746 0.054164 0.407979 0.408601 0.0814869 0.402222 0.403977 0.104277 0.407915 0.403542 0.13095 0.401129 0.408093 0.15354 0.408163 0.402371 0.179181 0.407754 0.409724 0.205443 0.407069 0.400054 0.229992 0.406037 0.401752 0.250593 0.403893 0.401885 0.282057 0.409973 0.401535 0.300834 0.408223 0.400208 0.330041 0.402398 0.400183 0.351591 0.404745 0.403108 0.382968 0.409821 0.401108 0.40795 0.400932 0.409394 0.433584 0.405689 0.409053 0.456207 0.402866 0.408416 0.482666 0.405695 0.434476 0.00201103 0.404092 0.433222 0.0294633 0.406906 0.433706 0.0534561 0.403352 0.433418 0.0844175 0.402287 0.427751 0.104585 0.403031 0.427629 0.126765 0.401798 0.432743 0.152988 0.403148 0.430238 0.181588 0.400607 0.433961 0.201148 0.403099 0.429718 0.228182 0.401056 0.428978 0.257206 0.406604 0.432198 0.278225 0.404622 0.428525 0.302423 0.401842 0.430938 0.332924 0.403784 0.428855 0.358056 0.400322 0.429836 0.379666 0.406326 0.433461 0.408316 0.401335 0.430187 0.426938 0.405529 0.430923 0.456461 0.406288 0.431393 0.479921 0.401435 0.457858 0.000843876 0.407461 0.451105 0.0256305 0.407378 0.457712 0.0550361 0.40739 0.452945 0.0829006 0.408257 0.45413 0.103574 0.405687 0.452172 0.126113 0.401097 0.456402 0.15628 0.400646 0.455546 0.18261 0.403816 0.4585 0.208372 0.401644 0.454448 0.232465 0.400082 0.454637 0.258757 0.401084 0.459421 0.282096 0.402101 0.458057 0.305296 0.407416 0.454078 0.326664 0.408719 0.452737 0.355426 0.40909 0.459471 0.375166 0.407795 0.45657 0.401564 0.400279 0.456391 0.428353 0.406376 0.455783 0.458322 0.409816 0.452035 0.478615 0.405293 0.483405 0.00999116 0.403367 0.47697 0.0300536 0.403098 0.483768 0.0569818 0.409324 0.480849 0.0847246 0.402774 0.478726 0.104096 0.407886 0.47596 0.127762 0.404527 0.484396 0.158605 0.40551 0.484981 0.175023 0.407203 0.483647 0.205227 0.403524 0.478744 0.225231 0.404798 0.482322 0.252843 0.405363 0.478812 0.281511 0.400885 0.483791 0.309187 0.409058 0.484645 0.328987 0.400212 0.475804 0.354861 0.404316 0.482977 0.38249 0.408598 0.482263 0.404684 0.404389 0.481318 0.428761 0.409254 0.483919 0.455865 0.409405 0.476035 0.477616 0.406019 0.504469 0.000796148 0.400507 0.503858 0.0285019 0.407649 0.505822 0.0594929 0.409846 0.503159 0.0834507 0.402253 0.504358 0.103919 0.406896 0.507349 0.128213 0.401326 0.505888 0.156396 0.405918 0.500493 0.183398 0.408721 0.509154 0.208391 0.409599 0.504735 0.22908 0.406668 0.507142 0.254042 0.407235 0.505453 0.277967 0.402672 0.507674 0.307212 0.405259 0.508618 0.328837 0.401609 0.508949 0.357526 0.402636 0.503879 0.375658 0.400334 0.504023 0.406756 0.400871 0.508209 0.432033 0.404024 0.506548 0.453204 0.406862 0.50776 0.475746 0.403612 0.532438 0.00980191 0.409221 0.528488 0.0294295 0.405469 0.529515 0.0557383 0.400435 0.531697 0.0806365 0.406588 0.531839 0.106054 0.401114 0.532167 0.131505 0.409343 0.53253 0.151073 0.403067 0.530181 0.182602 0.407558 0.532397 0.205979 0.406747 0.525807 0.225096 0.407664 0.530706 0.2506 0.40227 0.525226 0.28227 0.407388 0.525961 0.308387 0.406104 0.526063 0.327288 0.400369 0.528056 0.352901 0.405632 0.527545 0.380508 0.401418 0.533208 0.401815 0.407158 0.532316 0.432366 0.404542 0.533196 0.458873 0.400512 0.532994 0.481894 0.405771 0.55115 0.00524574 0.408022 0.556611 0.0320856 0.408608 0.551818 0.0584658 0.400161 0.556729 0.0841218 0.407518 0.559143 0.101843 0.406133 0.559914 0.125795 0.402103 0.553561 0.15475 0.40211 0.55891 0.179837 0.404893 0.556736 0.205601 0.401971 0.551123 0.229543 0.405136 0.553373 0.255597 0.407796 0.5547 0.283875 0.408491 0.55478 0.301695 0.403851 0.558231 0.334797 0.401699 0.55784 0.359034 0.402012 0.556049 0.382013 0.407528 0.557653 0.406967 0.402844 0.552686 0.430718 0.407155 0.558012 0.454563 0.404977 0.559808 0.476354 0.408831 0.580002 0.00359983 0.405834 0.581619 0.0250374 0.405815 0.576446 0.0557888 0.407275 0.583963 0.0756987 0.407831 0.584696 0.10146 0.400033 0.583681 0.128932 0.408904 0.576167 0.155885 0.40008 0.582675 0.17676 0.404758 0.584197 0.208735 0.402803 0.578122 0.230165 0.404234 0.583461 0.255464 0.407156 0.583598 0.278267 0.400073 0.577201 0.305835 0.407185 0.581149 0.326144 0.405715 0.579462 0.355655 0.405957 0.583977 0.375762 0.40763 0.584105 0.409669 0.400989 0.576072 0.427145 0.405954 0.583649 0.458592 0.408348 0.582187 0.480577 0.40376 0.60405 0.00857978 0.407332 0.604218 0.0281598 0.407445 0.606363 0.0536853 0.405395 0.609635 0.0839965 0.404346 0.609203 0.107616 0.407974 0.606709 0.131774 0.40444 0.604321 0.153998 0.409275 0.601015 0.183176 0.408835 0.602616 0.208438 0.400305 0.600134 0.231071 0.407036 0.604558 0.250686 0.40055 0.60925 0.281836 0.401171 0.608916 0.302836 0.401163 0.603762 0.330309 0.403224 0.606344 0.359943 0.403092 0.601681 0.378308 0.408735 0.604861 0.40724 0.409343 0.606573 0.427324 0.401768 0.609896 0.451301 0.407316 0.606201 0.479911 0.404999 0.632301 0.00238045 0.406474 0.628003 0.0283496 0.405501 0.634239 0.0558321 0.405665 0.626324 0.0839975 0.40279 0.62537 0.105565 0.407263 0.633591 0.126818 0.408709 0.632817 0.150092 0.401471 0.627535 0.17708 0.408425 0.633098 0.207361 0.403747 0.6267 0.229324 0.405113 0.629382 0.255963 0.402421 0.634419 0.278247 0.402848 0.6276 0.302656 0.409433 0.629066 0.326295 0.401993 0.632717 0.357539 0.405248 0.628713 0.377286 0.401952 0.626283 0.402151 0.402717 0.629401 0.432025 0.407372 0.627836 0.455399 0.40646 0.627977 0.481506 0.402108 0.657036 0.00201576 0.401127 0.651577 0.0291538 0.407926 0.653714 0.0527841 0.40072 0.657395 0.0848339 0.408402 0.656384 0.10032 0.409205 0.652684 0.129713 0.406282 0.65529 0.151266 0.409792 0.65844 0.184208 0.406941 0.653337 0.201387 0.400574 0.654491 0.227569 0.404387 0.651664 0.259187 0.400072 0.651721 0.279226 0.400926 0.652925 0.306665 0.405399 0.657453 0.332298 0.40011 0.655938 0.350726 0.40997 0.65224 0.38319 0.40492 0.652845 0.400218 0.406249 0.659541 0.429528 0.403752 0.657132 0.457802 0.402442 0.65707 0.475678 0.407104 0.679384 0.00148873 0.400756 0.677935 0.0280347 0.409824 0.675015 0.0595078 0.405711 0.682762 0.0763111 0.404484 0.678098 0.109333 0.407548 0.677354 0.125038 0.403401 0.682337 0.1526 0.402596 0.680909 0.17591 0.407382 0.679009 0.20222 0.401176 0.681804 0.23203 0.404604 0.675888 0.252194 0.407395 0.684529 0.278469 0.403448 0.682123 0.306342 0.40209 0.676257 0.328353 0.405007 0.681794 0.359662 0.40816 0.678236 0.37566 0.406493 0.678745 0.408615 0.403632 0.680865 0.425701 0.4056 0.677372 0.457447 0.401522 0.675591 0.484607 0.405162 0.707471 0.00627508 0.40039 0.704286 0.0265847 0.403032 0.701555 0.0506893 0.409596 0.70517 0.0807262 0.40169 0.701357 0.101113 0.401404 0.701353 0.134017 0.403197 0.705013 0.158078 0.402365 0.706511 0.176059 0.402299 0.70294 0.200141 0.409587 0.702544 0.229532 0.404328 0.700548 0.258924 0.400453 0.705447 0.282078 0.40139 0.705609 0.307424 0.401517 0.702258 0.326083 0.404361 0.701705 0.357195 0.409167 0.708916 0.375834 0.409186 0.709993 0.404439 0.402308 0.705997 0.430963 0.404372 0.704559 0.453076 0.404759 0.709045 0.482775 0.402353 0.730071 0.000160563 0.4008 0.734147 0.0292155 0.405116 0.732976 0.057785 0.403211 0.72834 0.0760946 0.404177 0.725756 0.102219 0.404561 0.730444 0.127912 0.401519 0.728874 0.151998 0.403623 0.733741 0.175084 0.402697 0.727792 0.208175 0.400284 0.729624 0.227232 0.408874 0.730748 0.253785 0.406093 0.725074 0.277188 0.403852 0.730385 0.301023 0.407822 0.731691 0.331859 0.408642 0.729534 0.359683 0.404345 0.729223 0.375242 0.401943 0.731632 0.406386 0.409412 0.725027 0.430158 0.404217 0.731266 0.456172 0.408423 0.727824 0.482138 0.425795 0.00838057 0.00493976 0.430153 0.00997177 0.0338226 0.426751 0.000466491 0.0567201 0.427414 0.00434803 0.0758236 0.432828 0.00361142 0.103119 0.42665 0.00102172 0.125006 0.43076 0.00817995 0.157717 0.431983 0.0083724 0.183468 0.431372 0.00618156 0.207163 0.434369 0.00933513 0.234595 0.432583 0.0046038 0.250541 0.434848 0.00132893 0.281626 0.427892 0.0060627 0.300453 0.426743 0.00755691 0.325618 0.43397 0.000569132 0.354852 0.433206 0.000896118 0.380672 0.434258 0.00704166 0.405685 0.427778 0.00311985 0.431412 0.431714 0.00627954 0.452708 0.427326 0.000979247 0.484369 0.426773 0.0327967 0.00169299 0.426867 0.0311021 0.0339153 0.429247 0.0328616 0.0546252 0.431492 0.032353 0.076457 0.434508 0.0288214 0.108293 0.428108 0.032673 0.133378 0.430523 0.0298886 0.157087 0.427479 0.0307032 0.184315 0.427788 0.0348185 0.200947 0.434412 0.0292566 0.225086 0.432161 0.0292466 0.258884 0.43257 0.0301963 0.27822 0.431695 0.0308792 0.30368 0.433595 0.0272414 0.329932 0.434306 0.0258879 0.358038 0.432593 0.0316509 0.383192 0.429665 0.0324076 0.402772 0.428068 0.034659 0.425487 0.425566 0.0342551 0.456716 0.434679 0.025786 0.477919 0.434016 0.0577405 0.0033566 0.432177 0.0533955 0.0295443 0.43495 0.0547592 0.0527174 0.431774 0.0583833 0.0825025 0.426324 0.0535925 0.105072 0.431207 0.0566616 0.134096 0.425277 0.0536863 0.159747 0.433885 0.0561217 0.17868 0.433405 0.0596565 0.20409 0.434984 0.0524742 0.229663 0.429936 0.0525346 0.25625 0.43037 0.0535021 0.284401 0.42927 0.058195 0.305836 0.432375 0.0554546 0.326451 0.434182 0.0560088 0.353124 0.434293 0.0529777 0.380068 0.429436 0.0585307 0.402842 0.433136 0.0593543 0.433714 0.434942 0.052898 0.452878 0.428126 0.0559998 0.478946 0.428551 0.081713 0.00385834 0.431909 0.0842333 0.0339777 0.430019 0.0787499 0.0579897 0.429329 0.0821658 0.0760211 0.432297 0.0820023 0.105599 0.429015 0.0753478 0.126662 0.430031 0.0807343 0.150214 0.432182 0.0755708 0.181503 0.429292 0.0843306 0.205372 0.431397 0.0805956 0.231562 0.429587 0.0772054 0.258834 0.426609 0.0764793 0.279883 0.432254 0.0787151 0.308088 0.42884 0.0822237 0.327298 0.429282 0.0802849 0.357463 0.426545 0.0757975 0.377539 0.431578 0.0823127 0.402473 0.428746 0.083644 0.43207 0.42692 0.0790682 0.451467 0.426157 0.078891 0.479935 0.429895 0.108985 0.000189189 0.432416 0.108224 0.0330062 0.425841 0.102797 0.0518764 0.426204 0.101989 0.0789254 0.426881 0.101936 0.105354 0.426236 0.108232 0.12835 0.43485 0.108264 0.154325 0.429993 0.107782 0.17613 0.427944 0.107197 0.206831 0.428489 0.100507 0.231277 0.42859 0.103727 0.250793 0.426457 0.104493 0.276208 0.434374 0.10995 0.308703 0.431846 0.102459 0.330963 0.428515 0.104423 0.357545 0.430224 0.103368 0.384572 0.431685 0.100324 0.406322 0.430012 0.106718 0.431716 0.433117 0.103143 0.459418 0.426403 0.100553 0.475031 0.425264 0.13434 0.00313246 0.425606 0.133854 0.0336122 0.425654 0.125987 0.0505726 0.432868 0.129083 0.080466 0.430932 0.130937 0.102454 0.433093 0.131288 0.132684 0.428317 0.125046 0.15695 0.429845 0.127179 0.182123 0.432815 0.134862 0.205213 0.432557 0.13374 0.227814 0.432036 0.134959 0.250192 0.425692 0.133418 0.282975 0.432069 0.133042 0.309239 0.426147 0.129751 0.328037 0.430748 0.131768 0.355831 0.427123 0.134143 0.376888 0.429873 0.129497 0.404578 0.432193 0.132959 0.43395 0.431014 0.134749 0.456565 0.430262 0.131713 0.476484 0.43399 0.159905 0.00689217 0.43209 0.151617 0.0317318 0.431933 0.153548 0.0507363 0.427531 0.154987 0.0786984 0.434628 0.150528 0.103651 0.431003 0.155592 0.127304 0.434087 0.159468 0.155336 0.431347 0.153492 0.182334 0.42671 0.154867 0.204591 0.426068 0.159384 0.231255 0.428956 0.150739 0.255456 0.434148 0.154929 0.277516 0.428886 0.152493 0.304801 0.429874 0.150357 0.325148 0.434391 0.153312 0.358983 0.430628 0.159306 0.383073 0.426098 0.153881 0.409658 0.434374 0.152951 0.434992 0.426139 0.151875 0.45704 0.430911 0.152717 0.476403 0.431377 0.178723 0.00119996 0.431741 0.17718 0.0342751 0.427256 0.177486 0.0503972 0.426455 0.176529 0.0776634 0.432532 0.182184 0.104102 0.426771 0.175067 0.133738 0.425117 0.175073 0.157491 0.425806 0.178853 0.17887 0.431579 0.183565 0.201298 0.426901 0.178904 0.227717 0.431428 0.179262 0.256189 0.427099 0.176297 0.280958 0.425278 0.177138 0.307955 0.434451 0.184515 0.332582 0.432451 0.182888 0.353873 0.433942 0.17515 0.381845 0.427146 0.178745 0.40265 0.433881 0.180236 0.434615 0.431135 0.178448 0.456397 0.431596 0.178621 0.484044 0.428157 0.20984 0.00449348 0.429293 0.204481 0.0263609 0.427811 0.206881 0.0580033 0.430168 0.205325 0.0762819 0.430368 0.204579 0.108854 0.432681 0.207916 0.128382 0.432989 0.200571 0.151171 0.429876 0.209842 0.183781 0.425445 0.209571 0.205329 0.426995 0.204015 0.229764 0.43198 0.207655 0.256855 0.432692 0.20325 0.282144 0.426055 0.209989 0.303582 0.434549 0.20758 0.325438 0.432699 0.20364 0.35353 0.432391 0.205822 0.38002 0.430045 0.202615 0.403357 0.426951 0.205587 0.432025 0.43217 0.204128 0.454456 0.426897 0.209605 0.48263 0.43497 0.234375 0.00802925 0.428257 0.229053 0.0298401 0.434745 0.231249 0.0505976 0.42891 0.230733 0.0776042 0.428786 0.230329 0.108828 0.425519 0.231581 0.12591 0.432752 0.232206 0.155424 0.432249 0.228964 0.18407 0.433276 0.229553 0.202753 0.427048 0.23268 0.228119 0.433516 0.229194 0.253606 0.426568 0.234952 0.277288 0.432116 0.230654 0.308209 0.426516 0.22706 0.331416 0.432126 0.227891 0.359293 0.434795 0.227832 0.382949 0.429553 0.225924 0.401581 0.43312 0.229933 0.433587 0.426992 0.230612 0.459625 0.428575 0.231406 0.475185 0.42769 0.257507 0.00711905 0.433419 0.250337 0.0262431 0.431403 0.258134 0.0535389 0.433303 0.254842 0.0799428 0.426676 0.254053 0.104261 0.427593 0.251774 0.130229 0.433732 0.255863 0.155263 0.427281 0.257702 0.184283 0.42912 0.253673 0.207422 0.431811 0.256734 0.227712 0.427634 0.254475 0.251579 0.428619 0.257156 0.282746 0.426291 0.25072 0.305649 0.433456 0.258269 0.333107 0.430927 0.258132 0.354608 0.428497 0.251621 0.383905 0.432757 0.259936 0.404542 0.428131 0.259519 0.434292 0.433575 0.254691 0.450152 0.433199 0.257177 0.484797 0.428755 0.282326 0.00257802 0.426976 0.277575 0.0349437 0.425311 0.278819 0.0503402 0.428124 0.284907 0.0837919 0.426542 0.276236 0.104254 0.431732 0.275223 0.129398 0.427461 0.276253 0.158246 0.431199 0.280934 0.175754 0.431216 0.278346 0.205038 0.429449 0.281777 0.22725 0.430089 0.27837 0.258363 0.427233 0.284902 0.278716 0.425909 0.27965 0.308541 0.431634 0.278508 0.325494 0.429869 0.282466 0.357223 0.428765 0.283874 0.381785 0.431013 0.278204 0.406045 0.426044 0.27609 0.428954 0.429479 0.283227 0.452316 0.427762 0.280305 0.477192 0.432298 0.303913 0.00768069 0.427179 0.309357 0.0328845 0.430625 0.3026 0.0589446 0.429432 0.306464 0.0793607 0.430766 0.306621 0.104432 0.431771 0.306653 0.126078 0.428169 0.307992 0.155133 0.427961 0.306325 0.18396 0.430122 0.306065 0.200448 0.433061 0.302703 0.234866 0.426669 0.301291 0.255547 0.430731 0.300774 0.27532 0.425403 0.305037 0.306898 0.426343 0.300563 0.332461 0.425835 0.30382 0.350209 0.434612 0.305618 0.380453 0.428012 0.302625 0.406243 0.433894 0.302581 0.42909 0.432069 0.304791 0.451045 0.425194 0.305193 0.47847 0.42993 0.32529 0.0098946 0.429852 0.334873 0.0340097 0.426915 0.334345 0.0548979 0.427887 0.329731 0.080448 0.42981 0.330434 0.102074 0.431632 0.329614 0.134179 0.433688 0.332473 0.151177 0.432029 0.327629 0.18396 0.430015 0.32614 0.208431 0.429802 0.32908 0.227283 0.433093 0.329227 0.253843 0.434505 0.331304 0.279503 0.430134 0.325974 0.30362 0.430689 0.331975 0.330691 0.430662 0.33122 0.353794 0.434729 0.327882 0.381022 0.42538 0.32866 0.407456 0.427065 0.333099 0.427544 0.430326 0.327597 0.459187 0.425519 0.334968 0.476649 0.428374 0.356631 0.00307208 0.430679 0.351088 0.0265706 0.432563 0.352969 0.0577031 0.434783 0.352442 0.0775084 0.428637 0.352855 0.102366 0.433822 0.359849 0.131657 0.433913 0.359298 0.158858 0.426756 0.354797 0.175086 0.433681 0.357867 0.207148 0.425068 0.354028 0.229197 0.4301 0.351823 0.253161 0.432574 0.359687 0.280925 0.429504 0.35512 0.308164 0.430441 0.358472 0.327387 0.433858 0.350931 0.353029 0.432508 0.358222 0.375367 0.431952 0.356821 0.406525 0.425987 0.350055 0.429007 0.433346 0.351642 0.452167 0.433303 0.355396 0.47533 0.426353 0.379394 0.00202338 0.43064 0.375685 0.0327649 0.428785 0.381164 0.0523982 0.426569 0.375594 0.0797229 0.43387 0.375241 0.102974 0.430726 0.378833 0.133545 0.425813 0.378054 0.151393 0.428567 0.377597 0.176634 0.433723 0.383983 0.201397 0.425021 0.379041 0.227273 0.429849 0.375781 0.250208 0.429234 0.381056 0.279769 0.430882 0.383059 0.302733 0.434202 0.382698 0.325549 0.428211 0.380182 0.354893 0.432873 0.376055 0.375382 0.425807 0.376153 0.409376 0.432334 0.381718 0.430551 0.426417 0.38227 0.452837 0.434215 0.378995 0.481898 0.433424 0.403186 0.00407855 0.433924 0.409836 0.0343867 0.433438 0.402296 0.057811 0.428996 0.400217 0.0761259 0.431995 0.407569 0.100807 0.425476 0.40413 0.134298 0.432872 0.406605 0.151447 0.425807 0.401203 0.175127 0.432911 0.408394 0.203645 0.429541 0.409445 0.226835 0.434227 0.403842 0.255995 0.426652 0.400081 0.27594 0.431297 0.405675 0.306579 0.425331 0.402853 0.32889 0.43061 0.401137 0.359467 0.433904 0.402866 0.375079 0.425808 0.407285 0.40987 0.428226 0.408791 0.430747 0.426974 0.403067 0.459847 0.425445 0.402337 0.481504 0.427913 0.43396 0.00970253 0.430105 0.4274 0.0280505 0.431232 0.427186 0.0576996 0.432666 0.425741 0.0751527 0.434663 0.428515 0.102912 0.429555 0.42568 0.13371 0.429527 0.434587 0.153839 0.425478 0.429156 0.184522 0.430348 0.427932 0.20505 0.430793 0.429998 0.232645 0.42605 0.42908 0.250542 0.427792 0.434233 0.281699 0.427188 0.430454 0.308555 0.429593 0.428078 0.328239 0.427173 0.43489 0.35588 0.427392 0.42926 0.378984 0.431282 0.428364 0.405227 0.434819 0.427874 0.428367 0.433306 0.432957 0.453164 0.427467 0.4297 0.484278 0.430396 0.452493 0.00900578 0.433181 0.450575 0.0254469 0.429706 0.456771 0.0532428 0.427897 0.455321 0.0809913 0.434898 0.459124 0.107693 0.429746 0.451595 0.131686 0.42801 0.453635 0.150566 0.433032 0.450057 0.184709 0.432374 0.454108 0.205998 0.426331 0.455019 0.230511 0.433282 0.454192 0.253859 0.427112 0.458338 0.282492 0.432582 0.453511 0.303155 0.427256 0.456724 0.334001 0.429962 0.456338 0.355197 0.427423 0.455713 0.37976 0.429581 0.453692 0.401383 0.426826 0.454932 0.425462 0.433795 0.457978 0.453672 0.430202 0.453458 0.484344 0.42676 0.475655 0.00235978 0.434314 0.484466 0.0254158 0.433397 0.481924 0.0502333 0.432324 0.484025 0.0818252 0.432523 0.480946 0.107299 0.43087 0.480356 0.128107 0.433702 0.480105 0.152269 0.427933 0.482689 0.181636 0.426217 0.48201 0.207648 0.433605 0.480062 0.227016 0.42673 0.484578 0.250761 0.428786 0.482776 0.27997 0.427298 0.484382 0.302135 0.426726 0.481449 0.329988 0.43163 0.480125 0.350213 0.428803 0.478107 0.375159 0.434502 0.477482 0.40711 0.428931 0.480497 0.433855 0.433119 0.484727 0.454918 0.43088 0.483687 0.480079 0.434879 0.504162 0.00976826 0.43289 0.500522 0.0314164 0.433659 0.506526 0.052434 0.429421 0.509554 0.0772633 0.425937 0.501102 0.10281 0.433298 0.505526 0.130206 0.431981 0.507093 0.15155 0.427644 0.509724 0.177744 0.434008 0.500122 0.208102 0.428325 0.503294 0.227602 0.42697 0.508448 0.252599 0.429727 0.503344 0.278216 0.431398 0.507502 0.300389 0.427902 0.508203 0.333849 0.428231 0.504462 0.350111 0.425224 0.504782 0.380799 0.427319 0.500386 0.408535 0.425762 0.505867 0.4269 0.430471 0.504319 0.453704 0.425519 0.508243 0.480378 0.428347 0.527735 0.00536721 0.429147 0.527942 0.0273524 0.429777 0.526797 0.0524577 0.428726 0.526491 0.0801399 0.433695 0.527463 0.100906 0.425911 0.534391 0.130064 0.433185 0.533501 0.150058 0.432549 0.531918 0.182263 0.426583 0.526173 0.201675 0.428161 0.530665 0.231447 0.434818 0.532859 0.254694 0.431788 0.532081 0.277629 0.432979 0.526165 0.308491 0.430813 0.529483 0.328265 0.429493 0.525005 0.355532 0.43422 0.525145 0.382638 0.432888 0.534394 0.400321 0.433082 0.531809 0.42861 0.428652 0.532417 0.450523 0.431377 0.528749 0.478501 0.43192 0.55603 0.00485277 0.428252 0.552319 0.0273767 0.430857 0.558768 0.0522536 0.428562 0.557377 0.0764316 0.434092 0.558032 0.100715 0.428623 0.558893 0.134006 0.425077 0.551539 0.155471 0.425691 0.553593 0.182712 0.432737 0.550279 0.208783 0.4264 0.553774 0.226773 0.426338 0.559829 0.25298 0.429816 0.555761 0.279187 0.429198 0.558606 0.303898 0.430067 0.55091 0.325844 0.429989 0.551271 0.354003 0.434391 0.554009 0.375163 0.427801 0.558527 0.405189 0.428478 0.557219 0.432508 0.429137 0.559019 0.459106 0.425494 0.555362 0.475292 0.426891 0.584301 0.00590836 0.429968 0.577123 0.0280793 0.434558 0.576251 0.0588263 0.432673 0.582464 0.0786443 0.425823 0.581706 0.108559 0.431282 0.579424 0.127356 0.433444 0.575554 0.154661 0.431279 0.581206 0.177051 0.425248 0.581567 0.200646 0.425354 0.577798 0.225209 0.432239 0.584532 0.253728 0.433888 0.579774 0.275689 0.426443 0.584733 0.301648 0.428952 0.582608 0.333701 0.425172 0.577013 0.354746 0.43357 0.582821 0.377034 0.425583 0.578261 0.404937 0.431244 0.579067 0.431637 0.428032 0.578012 0.457932 0.429582 0.583397 0.476333 0.431332 0.600536 0.00518302 0.434294 0.608908 0.0297315 0.431581 0.605862 0.0546559 0.432832 0.60417 0.0848573 0.432143 0.608803 0.103996 0.43265 0.603453 0.126779 0.429672 0.604426 0.151382 0.430903 0.601825 0.177994 0.430854 0.608038 0.20476 0.434361 0.606497 0.234805 0.428466 0.608679 0.25339 0.43023 0.606319 0.281778 0.433921 0.602561 0.303226 0.432148 0.606656 0.331686 0.428931 0.606889 0.356391 0.431361 0.602952 0.381354 0.425906 0.601636 0.408637 0.434803 0.609192 0.426175 0.429391 0.609717 0.452418 0.425262 0.601763 0.482103 0.434006 0.633303 0.0021414 0.433349 0.63486 0.0335368 0.426883 0.630406 0.0518606 0.427875 0.628225 0.0822268 0.434843 0.630568 0.104891 0.428785 0.628717 0.126548 0.429488 0.63439 0.157411 0.433298 0.628168 0.179491 0.425777 0.630159 0.208324 0.432352 0.625288 0.230826 0.429844 0.626665 0.25172 0.434956 0.625533 0.283947 0.425373 0.633383 0.308304 0.430941 0.630783 0.330157 0.426529 0.63057 0.357192 0.42903 0.625236 0.378728 0.433824 0.634059 0.403562 0.429425 0.630799 0.43452 0.432756 0.633747 0.459348 0.425707 0.627135 0.477776 0.430957 0.650466 0.00646061 0.434977 0.657846 0.034191 0.434376 0.651433 0.0503614 0.434923 0.656601 0.079521 0.430714 0.658063 0.10078 0.431746 0.657097 0.128814 0.434005 0.65613 0.154564 0.433083 0.654419 0.180254 0.430602 0.65625 0.200861 0.425119 0.652759 0.232496 0.428508 0.652759 0.255975 0.432733 0.659022 0.278221 0.428664 0.655429 0.309029 0.42511 0.658617 0.329435 0.4301 0.652595 0.359272 0.425595 0.659018 0.37627 0.429957 0.65737 0.4023 0.426592 0.653634 0.429493 0.430065 0.655313 0.450248 0.431081 0.65867 0.476221 0.427823 0.680555 0.00460927 0.427954 0.681291 0.0276787 0.430252 0.680242 0.0520434 0.433271 0.684671 0.0849176 0.430357 0.683568 0.100477 0.428787 0.68094 0.134235 0.433829 0.67899 0.156534 0.432976 0.679063 0.180019 0.430158 0.675266 0.209433 0.434978 0.677249 0.234542 0.42967 0.681926 0.250773 0.432276 0.676328 0.281931 0.430861 0.684654 0.305627 0.426622 0.683335 0.327404 0.426687 0.679993 0.350804 0.433946 0.677114 0.377668 0.429957 0.681076 0.402938 0.430011 0.683054 0.431451 0.426414 0.6769 0.456143 0.43013 0.677241 0.477662 0.426414 0.704258 0.00504377 0.430971 0.703848 0.0278967 0.426472 0.700245 0.0595114 0.434201 0.70788 0.0794177 0.428649 0.707234 0.101257 0.42854 0.709265 0.132113 0.429779 0.70044 0.15685 0.427911 0.701254 0.183162 0.433082 0.70948 0.209578 0.42776 0.702827 0.230433 0.426559 0.709694 0.251058 0.426946 0.704881 0.276971 0.433013 0.704457 0.306903 0.429544 0.705059 0.334051 0.428579 0.707568 0.350518 0.43125 0.706133 0.378974 0.428725 0.709844 0.40463 0.427537 0.703598 0.431311 0.429351 0.701996 0.456141 0.429536 0.70636 0.475765 0.431906 0.730245 0.00405312 0.433984 0.732221 0.0282683 0.425218 0.733854 0.0518162 0.428243 0.729625 0.0817214 0.434689 0.72922 0.106768 0.432958 0.730938 0.126107 0.431618 0.732366 0.155947 0.434792 0.728529 0.178141 0.427424 0.733673 0.208398 0.433338 0.728095 0.231402 0.426211 0.732496 0.251643 0.429682 0.732937 0.282491 0.430898 0.730544 0.30089 0.430711 0.731375 0.330692 0.426805 0.733099 0.35059 0.426211 0.734693 0.382149 0.431795 0.730443 0.406734 0.426168 0.732077 0.4265 0.431687 0.726611 0.458227 0.425249 0.731541 0.478362 0.458293 0.000296891 0.00384928 0.451893 0.00286048 0.0254607 0.458618 0.00246132 0.0532747 0.4583 0.00921019 0.0810485 0.456493 0.00279062 0.109752 0.458656 0.00485147 0.126313 0.450582 0.00877841 0.152677 0.453416 0.000589686 0.184229 0.45376 0.00775282 0.208627 0.45582 0.00963967 0.232145 0.451717 0.00621385 0.258462 0.456603 0.0074613 0.282351 0.459816 0.00367225 0.302031 0.451472 0.00397161 0.326682 0.459462 0.00647091 0.357917 0.457935 0.00183612 0.376294 0.453614 0.00800611 0.408503 0.456614 0.00106185 0.432975 0.458942 0.00310672 0.454764 0.451293 0.00245856 0.48242 0.453726 0.0253068 0.00592769 0.450173 0.0283657 0.0271949 0.451466 0.0269904 0.0509624 0.459792 0.0256788 0.0812548 0.452294 0.0277145 0.103218 0.459765 0.0307166 0.133277 0.45035 0.0261395 0.155477 0.453462 0.0252968 0.183281 0.459894 0.0288515 0.200954 0.459657 0.028106 0.231878 0.457485 0.0290056 0.254304 0.45047 0.0259447 0.276349 0.453218 0.028367 0.308857 0.457084 0.0345859 0.330908 0.457355 0.0303096 0.351492 0.454411 0.0304768 0.382403 0.458809 0.0295438 0.40732 0.454891 0.0291708 0.434154 0.454569 0.0346489 0.452544 0.450279 0.031143 0.484923 0.458695 0.0586918 0.000123958 0.453204 0.0589089 0.0290967 0.455472 0.0599193 0.0528536 0.455368 0.0531047 0.0836555 0.454333 0.0501835 0.101575 0.450311 0.0560286 0.127741 0.456619 0.0564612 0.155604 0.454333 0.0542612 0.180198 0.455477 0.0555615 0.207761 0.454881 0.0501445 0.233439 0.451534 0.0543058 0.256477 0.458111 0.0531483 0.27867 0.459383 0.0552855 0.303745 0.458909 0.0576579 0.328532 0.459642 0.0572355 0.359614 0.458536 0.0536923 0.376301 0.451853 0.0564377 0.405187 0.455949 0.0557918 0.428885 0.455878 0.0550854 0.458414 0.455979 0.0572913 0.482151 0.456317 0.0836379 0.00899766 0.459029 0.0800847 0.0318179 0.45825 0.0830004 0.0511008 0.458655 0.075583 0.0805054 0.456253 0.0760138 0.106907 0.450785 0.0758982 0.128553 0.451714 0.0806693 0.159686 0.454673 0.0814769 0.182556 0.453257 0.0783347 0.202709 0.457414 0.0806806 0.234427 0.45676 0.0800267 0.259278 0.452201 0.0827915 0.28389 0.451006 0.075272 0.306924 0.452562 0.0808296 0.333208 0.457876 0.0849128 0.354946 0.458126 0.0769668 0.380782 0.459879 0.0756296 0.405815 0.455927 0.0813066 0.432569 0.451964 0.0808071 0.45513 0.450435 0.0827175 0.479378 0.458349 0.107666 0.00823146 0.459507 0.106324 0.0281049 0.457291 0.1013 0.0532485 0.456524 0.104667 0.0842311 0.453217 0.107171 0.107529 0.456748 0.108925 0.133276 0.455705 0.101472 0.154535 0.456331 0.105539 0.176266 0.458854 0.10457 0.204537 0.45264 0.101968 0.232761 0.451829 0.102046 0.259826 0.451307 0.106582 0.281733 0.455707 0.104324 0.304922 0.456616 0.103518 0.330388 0.453507 0.104049 0.355918 0.453807 0.105842 0.378973 0.455227 0.105505 0.40258 0.452283 0.109066 0.428986 0.454705 0.107908 0.457133 0.455662 0.104557 0.476389 0.454069 0.133387 0.00341117 0.454939 0.129066 0.0250285 0.45092 0.126363 0.0508887 0.453917 0.129278 0.0847556 0.456905 0.127964 0.107844 0.457791 0.128347 0.133214 0.454343 0.129368 0.152452 0.458628 0.134958 0.178406 0.458711 0.126503 0.209002 0.453244 0.133926 0.225448 0.451735 0.130188 0.258921 0.455043 0.131702 0.280646 0.453043 0.126892 0.30808 0.455602 0.127176 0.330825 0.458449 0.133111 0.358075 0.456509 0.133611 0.378451 0.45907 0.130086 0.402057 0.454543 0.127239 0.431981 0.452013 0.129535 0.454459 0.456415 0.126279 0.483761 0.453317 0.15007 0.00783585 0.454787 0.154785 0.0327493 0.454183 0.154482 0.0584808 0.456762 0.153176 0.0839059 0.45074 0.150412 0.103526 0.450741 0.157972 0.129665 0.450766 0.155636 0.156827 0.457465 0.154233 0.181488 0.457503 0.152759 0.203195 0.456776 0.152629 0.228149 0.459536 0.156758 0.257022 0.456984 0.155193 0.275777 0.455404 0.154921 0.307891 0.454181 0.152841 0.333824 0.452239 0.153346 0.350025 0.459717 0.157321 0.378859 0.456026 0.158033 0.40909 0.456881 0.150186 0.431459 0.452501 0.156661 0.452423 0.454964 0.156275 0.482718 0.454339 0.182527 0.00260221 0.455854 0.183722 0.0325893 0.456052 0.180237 0.0508494 0.452955 0.179689 0.0796312 0.454567 0.178207 0.101915 0.459636 0.184525 0.127444 0.458265 0.182608 0.152869 0.455101 0.182315 0.180871 0.45083 0.176942 0.201489 0.457621 0.184195 0.234955 0.459952 0.184668 0.259865 0.453486 0.18352 0.27528 0.456415 0.177707 0.307727 0.457791 0.184505 0.334294 0.450468 0.177649 0.352593 0.451707 0.176239 0.383821 0.455961 0.178674 0.409509 0.459127 0.183558 0.433527 0.455568 0.177582 0.450477 0.45923 0.181875 0.482191 0.456536 0.203592 0.00103784 0.456048 0.202869 0.0320305 0.450613 0.207965 0.0527625 0.450908 0.208585 0.0760782 0.456174 0.20396 0.108304 0.451789 0.205097 0.127608 0.450472 0.20464 0.156826 0.454301 0.203227 0.1819 0.451311 0.206765 0.20114 0.455336 0.201437 0.23173 0.459891 0.200168 0.254952 0.459989 0.206209 0.275965 0.459519 0.202408 0.306258 0.452409 0.203455 0.334699 0.459844 0.20064 0.351325 0.454577 0.205553 0.3822 0.457526 0.209614 0.402019 0.451543 0.201324 0.4302 0.450099 0.201401 0.451742 0.456051 0.207567 0.479766 0.450793 0.234572 0.0032658 0.45757 0.228761 0.026867 0.458328 0.231928 0.0574905 0.455516 0.228345 0.07834 0.453578 0.234552 0.108196 0.45422 0.231471 0.134852 0.4549 0.225508 0.154871 0.454872 0.233408 0.178373 0.453682 0.226119 0.209001 0.457028 0.232612 0.232737 0.45704 0.234698 0.253222 0.454209 0.228619 0.283415 0.454869 0.232503 0.302335 0.45575 0.234849 0.334528 0.459441 0.226173 0.356991 0.455791 0.229247 0.380473 0.450678 0.231552 0.404344 0.459755 0.228203 0.426102 0.452344 0.232719 0.453855 0.459293 0.226887 0.475318 0.454083 0.255978 0.0011304 0.459949 0.25745 0.0340045 0.455298 0.259053 0.0583176 0.459291 0.255715 0.0825963 0.458817 0.257752 0.108643 0.450244 0.253709 0.128331 0.451779 0.2571 0.15321 0.454947 0.251135 0.184359 0.455463 0.257829 0.203831 0.450926 0.250603 0.232798 0.458868 0.259459 0.254481 0.450765 0.254837 0.276034 0.451331 0.255784 0.30066 0.455021 0.254571 0.333892 0.458525 0.253206 0.354421 0.458716 0.251126 0.380842 0.450296 0.259262 0.402835 0.458386 0.2573 0.432725 0.454652 0.255126 0.456514 0.456715 0.259366 0.483771 0.451961 0.283611 0.00848027 0.45009 0.281569 0.026318 0.458954 0.280792 0.0505684 0.457373 0.276797 0.075453 0.458576 0.278999 0.108002 0.454278 0.278025 0.133474 0.450389 0.275025 0.158267 0.45829 0.278615 0.177154 0.450067 0.2824 0.20323 0.459298 0.277449 0.225994 0.458204 0.282806 0.258087 0.45042 0.283156 0.27739 0.459322 0.279827 0.305757 0.457923 0.281062 0.33111 0.458713 0.275015 0.350574 0.45169 0.277736 0.382015 0.450744 0.280146 0.403198 0.451229 0.28049 0.431032 0.456207 0.281139 0.45355 0.457175 0.284932 0.475634 0.459157 0.304002 0.000689615 0.452361 0.301488 0.0311383 0.459887 0.304448 0.0552194 0.45554 0.303012 0.0774385 0.454894 0.308328 0.108942 0.458389 0.308667 0.128394 0.451413 0.303837 0.156745 0.450677 0.307219 0.177664 0.455611 0.305153 0.201121 0.45377 0.301887 0.225303 0.452259 0.304539 0.255146 0.451823 0.303665 0.277213 0.459641 0.300163 0.30608 0.456937 0.303033 0.334212 0.451302 0.308031 0.359944 0.459824 0.303605 0.377292 0.458149 0.306453 0.401132 0.458258 0.301421 0.42983 0.45135 0.304498 0.450466 0.459365 0.305662 0.484368 0.459618 0.327909 0.000818183 0.458226 0.328628 0.0300193 0.457939 0.330918 0.054983 0.450351 0.325615 0.0790629 0.456135 0.332894 0.109679 0.45635 0.328134 0.132299 0.454929 0.32503 0.152591 0.457284 0.325285 0.182923 0.454459 0.331403 0.203746 0.454835 0.325521 0.22527 0.453105 0.327758 0.256131 0.455294 0.326925 0.280921 0.458851 0.329476 0.302838 0.454809 0.332296 0.334719 0.45009 0.330812 0.351304 0.450087 0.32963 0.378201 0.457318 0.325774 0.400192 0.453602 0.326682 0.426147 0.45102 0.325817 0.457783 0.456666 0.327545 0.479474 0.458309 0.35206 0.00770289 0.458297 0.351229 0.031717 0.459157 0.3591 0.0517062 0.456343 0.352819 0.0776589 0.453465 0.352883 0.100268 0.456482 0.353044 0.126233 0.457366 0.356647 0.151785 0.451982 0.357128 0.183334 0.450834 0.353514 0.206257 0.459625 0.358387 0.225036 0.454279 0.350464 0.259873 0.459066 0.350513 0.278312 0.456839 0.358653 0.30885 0.456777 0.359574 0.326075 0.451151 0.356001 0.359625 0.452207 0.352716 0.379506 0.458414 0.359571 0.404433 0.457039 0.356418 0.428743 0.45577 0.355052 0.457535 0.458032 0.356292 0.484274 0.456039 0.381971 0.00499297 0.453444 0.384226 0.0261551 0.451036 0.375954 0.0598487 0.451525 0.37954 0.0758182 0.455441 0.37658 0.10568 0.45012 0.375691 0.133694 0.456639 0.38356 0.157356 0.452335 0.381639 0.178944 0.459463 0.380307 0.201739 0.4598 0.384474 0.231101 0.459957 0.37762 0.250884 0.454092 0.384046 0.278778 0.45081 0.376988 0.309688 0.452468 0.376079 0.334914 0.455352 0.376305 0.351273 0.455463 0.376646 0.380709 0.452262 0.377593 0.400912 0.45497 0.378537 0.432308 0.45131 0.380004 0.45395 0.458682 0.380983 0.481092 0.459407 0.403042 0.00536033 0.459314 0.405913 0.0315316 0.450619 0.401469 0.0549668 0.455119 0.406077 0.0788771 0.455387 0.401248 0.103335 0.456929 0.400638 0.131376 0.456586 0.401179 0.159924 0.458734 0.401307 0.176392 0.450703 0.404726 0.202852 0.45169 0.407733 0.225927 0.455952 0.404706 0.251796 0.455871 0.405193 0.277824 0.459331 0.407509 0.302911 0.454871 0.401417 0.327953 0.458116 0.402074 0.357904 0.452962 0.404734 0.380434 0.455596 0.409466 0.402296 0.455647 0.400917 0.4266 0.457907 0.401799 0.459531 0.454537 0.406648 0.481993 0.452172 0.432436 0.00323041 0.456014 0.431196 0.0326766 0.451602 0.425622 0.0517913 0.450135 0.425033 0.0781868 0.455746 0.428551 0.106945 0.455336 0.426405 0.128142 0.450222 0.434087 0.152843 0.455927 0.433873 0.182579 0.453202 0.430109 0.207733 0.457742 0.434996 0.229003 0.451267 0.425005 0.254441 0.451188 0.427604 0.284855 0.452403 0.428593 0.305643 0.452541 0.428528 0.331438 0.456598 0.432754 0.353895 0.450291 0.427681 0.378246 0.459809 0.434639 0.409063 0.450197 0.429112 0.426652 0.455819 0.429097 0.456896 0.452133 0.432546 0.47591 0.454244 0.450666 0.0039966 0.452433 0.458475 0.0279753 0.457578 0.457945 0.0523611 0.453382 0.456295 0.0772851 0.45636 0.458619 0.100004 0.457121 0.459669 0.134378 0.455976 0.451037 0.152819 0.452662 0.452228 0.176669 0.455834 0.454988 0.20522 0.455957 0.453102 0.233746 0.451858 0.451975 0.25497 0.455655 0.454691 0.277017 0.459542 0.457613 0.307339 0.453822 0.453825 0.33061 0.454046 0.457116 0.355585 0.457534 0.450412 0.375913 0.450237 0.4502 0.400416 0.453338 0.456684 0.430848 0.459456 0.457597 0.453051 0.45859 0.451993 0.478183 0.455116 0.483187 0.0011346 0.450726 0.47931 0.0273465 0.452946 0.482865 0.0574603 0.45112 0.475163 0.080341 0.450781 0.483435 0.104057 0.450693 0.481752 0.128405 0.453426 0.482486 0.154657 0.453551 0.475715 0.177343 0.456106 0.47581 0.205255 0.458896 0.4776 0.225381 0.456207 0.481369 0.257013 0.459561 0.480192 0.277493 0.458233 0.480384 0.303592 0.452701 0.478432 0.328878 0.458265 0.479694 0.355631 0.451981 0.478887 0.379083 0.452318 0.478749 0.400457 0.450368 0.475397 0.427685 0.451754 0.480396 0.45227 0.450156 0.483859 0.483976 0.450537 0.50861 0.00246935 0.458647 0.504626 0.0312643 0.45679 0.505859 0.0514489 0.455039 0.505504 0.0820325 0.455524 0.504771 0.109102 0.450981 0.50812 0.13233 0.45079 0.509937 0.153188 0.453546 0.501794 0.183495 0.452869 0.502243 0.203422 0.456981 0.50201 0.228993 0.453116 0.504451 0.258834 0.456009 0.501386 0.278313 0.453897 0.509127 0.300418 0.456663 0.507816 0.326931 0.458735 0.50022 0.357775 0.451292 0.508112 0.375314 0.456042 0.507107 0.403589 0.454819 0.500138 0.427621 0.457358 0.505228 0.452968 0.450012 0.506284 0.475131 0.453112 0.529897 0.00733538 0.455888 0.531326 0.033062 0.458089 0.527125 0.051621 0.459296 0.526283 0.0782877 0.451264 0.532093 0.104971 0.453473 0.532935 0.125639 0.457904 0.533461 0.152684 0.452665 0.529112 0.179713 0.450119 0.530263 0.200168 0.451166 0.532624 0.231548 0.453073 0.527256 0.250742 0.456373 0.534069 0.278598 0.458916 0.525362 0.302839 0.459256 0.528563 0.330834 0.459482 0.533245 0.35222 0.452394 0.531303 0.384755 0.458838 0.531774 0.408891 0.451029 0.531041 0.427876 0.453203 0.533687 0.452445 0.457065 0.532483 0.480745 0.458355 0.557648 0.000996545 0.450374 0.550017 0.0347768 0.459847 0.553464 0.0540433 0.450079 0.558694 0.0809212 0.454963 0.553051 0.104383 0.451041 0.554542 0.131313 0.45732 0.5556 0.158412 0.458471 0.556372 0.181189 0.454785 0.559521 0.206303 0.45572 0.559866 0.228989 0.454652 0.552628 0.252831 0.454673 0.559865 0.275766 0.459693 0.554725 0.30985 0.457804 0.554401 0.331528 0.451248 0.550659 0.358429 0.452559 0.55419 0.382334 0.457966 0.550055 0.405526 0.45985 0.553315 0.428332 0.459052 0.554933 0.455987 0.454286 0.553599 0.484695 0.45952 0.583664 0.0066594 0.453878 0.579447 0.0327179 0.451041 0.583042 0.0520076 0.457974 0.581536 0.0812818 0.455918 0.580833 0.105445 0.450285 0.579197 0.130057 0.455708 0.584382 0.151051 0.459035 0.580071 0.179297 0.451209 0.577781 0.204016 0.453878 0.584603 0.227352 0.459743 0.58256 0.258769 0.458906 0.577357 0.282929 0.454903 0.581642 0.302211 0.458615 0.578633 0.330784 0.452204 0.576851 0.355001 0.454703 0.579457 0.381504 0.457793 0.581834 0.409305 0.45278 0.584644 0.429698 0.458809 0.576249 0.456663 0.453042 0.578141 0.480606 0.454719 0.607592 0.00814901 0.455642 0.60092 0.0284628 0.456402 0.606341 0.0547919 0.454943 0.602975 0.0786007 0.452778 0.604747 0.10551 0.456738 0.600021 0.133297 0.455635 0.603186 0.150065 0.456013 0.604065 0.179485 0.455841 0.601698 0.20367 0.453001 0.605692 0.232078 0.455958 0.601542 0.252546 0.454367 0.604848 0.284139 0.455825 0.609991 0.303878 0.454341 0.607192 0.326488 0.456252 0.606121 0.357417 0.456105 0.601921 0.378466 0.452077 0.607202 0.408534 0.459315 0.604602 0.428506 0.458141 0.607129 0.452463 0.455432 0.604358 0.48323 0.453928 0.627526 0.00395946 0.452368 0.626178 0.0259296 0.456924 0.634767 0.0503683 0.450255 0.627626 0.0751643 0.459272 0.630092 0.100517 0.458028 0.634648 0.133534 0.458124 0.630915 0.15 0.458503 0.625002 0.177588 0.457532 0.628708 0.209298 0.454623 0.63304 0.229915 0.450364 0.625292 0.253421 0.450592 0.626345 0.275986 0.457109 0.634417 0.300514 0.456571 0.628831 0.332553 0.458258 0.633168 0.356903 0.456952 0.632848 0.376037 0.451192 0.629412 0.405367 0.455428 0.629624 0.430965 0.451341 0.63369 0.454713 0.459909 0.62566 0.479048 0.457296 0.656016 0.00130564 0.452446 0.653076 0.0259315 0.457223 0.653012 0.0585073 0.457458 0.653379 0.0799036 0.453146 0.651375 0.106873 0.450752 0.657275 0.130929 0.452798 0.657277 0.155017 0.45456 0.656763 0.181948 0.457316 0.654304 0.202544 0.451226 0.651295 0.234437 0.456637 0.658842 0.252154 0.450043 0.65558 0.27998 0.457725 0.657505 0.30425 0.459807 0.655242 0.331376 0.457052 0.658569 0.353027 0.454278 0.650466 0.379052 0.454525 0.651683 0.407088 0.454255 0.658101 0.431456 0.45352 0.650198 0.457755 0.452572 0.658594 0.48232 0.45867 0.678527 0.00406696 0.458261 0.683233 0.0276782 0.457341 0.684262 0.0508249 0.450409 0.683719 0.0840571 0.450674 0.675991 0.103544 0.450127 0.680987 0.130993 0.45003 0.677436 0.15337 0.450659 0.680116 0.184235 0.450323 0.675937 0.20513 0.450899 0.68098 0.226632 0.452837 0.678879 0.253805 0.456914 0.678537 0.283149 0.451868 0.683263 0.306799 0.453696 0.680792 0.333681 0.457088 0.682881 0.350203 0.45603 0.676633 0.379358 0.457238 0.684764 0.401361 0.456778 0.680751 0.434929 0.45529 0.683026 0.454489 0.452363 0.683498 0.48203 0.453687 0.700747 0.00242779 0.459519 0.705961 0.0271587 0.455907 0.707978 0.0526269 0.45444 0.708834 0.0815949 0.450972 0.70909 0.103963 0.453488 0.701571 0.129132 0.457713 0.709905 0.159471 0.4559 0.708549 0.176533 0.45548 0.703877 0.202182 0.453192 0.702493 0.232269 0.451021 0.705122 0.25979 0.458258 0.700843 0.282151 0.455785 0.703691 0.309029 0.459191 0.706342 0.327144 0.454937 0.700974 0.353238 0.455891 0.706517 0.381362 0.451926 0.70046 0.406222 0.454064 0.70252 0.432568 0.450169 0.705585 0.455902 0.458742 0.704499 0.481669 0.452606 0.73149 0.00259981 0.451596 0.730232 0.0263735 0.452464 0.727245 0.0517956 0.456588 0.734658 0.084828 0.453644 0.730939 0.103464 0.456247 0.730226 0.131568 0.45036 0.725999 0.156637 0.458909 0.729634 0.180749 0.452912 0.728803 0.203169 0.451903 0.730556 0.225012 0.453878 0.7268 0.252902 0.455758 0.726615 0.279134 0.452065 0.725053 0.304231 0.451739 0.734245 0.330073 0.455564 0.725438 0.35901 0.459719 0.728218 0.376845 0.451195 0.733543 0.401852 0.459173 0.729879 0.429925 0.458022 0.72662 0.458297 0.454745 0.734448 0.475969 0.481853 0.00766775 0.00949539 0.484785 0.00581439 0.0347824 0.48483 0.00809957 0.0517777 0.484999 0.00937025 0.0836305 0.481366 0.00574497 0.10283 0.48129 0.00531189 0.127747 0.480345 0.00774773 0.156535 0.476873 0.00186072 0.175742 0.481961 0.00991071 0.208196 0.475367 0.00175706 0.229113 0.475136 0.00300517 0.252752 0.479278 0.00350581 0.280539 0.483826 0.00480262 0.301255 0.477984 0.00788539 0.334746 0.483187 0.00721528 0.353001 0.475533 0.00335766 0.375862 0.48388 0.0010573 0.408554 0.481923 0.00588773 0.42791 0.480969 0.00700227 0.458426 0.47725 0.00240742 0.475168 0.476008 0.0288879 0.00256322 0.478989 0.0314542 0.0259491 0.477292 0.0329709 0.0562918 0.47962 0.0349399 0.078901 0.482778 0.0318497 0.10093 0.479004 0.0316157 0.129376 0.482557 0.0306258 0.15007 0.484198 0.0276555 0.17969 0.479919 0.0289535 0.206121 0.476567 0.0308976 0.234918 0.481623 0.0293073 0.257472 0.48124 0.0299264 0.275453 0.484096 0.0311206 0.308541 0.484675 0.0323959 0.330104 0.47673 0.0281197 0.358825 0.483184 0.03273 0.384297 0.475693 0.0276313 0.407239 0.47612 0.0293345 0.432337 0.48042 0.0349897 0.450713 0.478862 0.0337173 0.478797 0.48469 0.0597081 0.00837155 0.484955 0.0502465 0.0326686 0.478654 0.0580774 0.0504571 0.477219 0.0591379 0.0760306 0.480238 0.0521765 0.104954 0.481632 0.0537369 0.134335 0.475603 0.0544182 0.15051 0.478208 0.0536972 0.179309 0.483815 0.0587074 0.207762 0.47857 0.0558005 0.229655 0.479158 0.0597655 0.258176 0.483044 0.05416 0.280115 0.48494 0.0503797 0.308462 0.484072 0.0576684 0.330161 0.478882 0.0537265 0.352056 0.483271 0.0550608 0.375762 0.475189 0.0580954 0.402527 0.484625 0.051302 0.433427 0.480992 0.0572368 0.459424 0.477415 0.0522323 0.483086 0.475823 0.084087 0.00282345 0.480758 0.0839099 0.0334079 0.48146 0.0837352 0.0574068 0.480881 0.0751073 0.0783437 0.481937 0.0767017 0.10002 0.483689 0.0805799 0.12727 0.483207 0.0788158 0.159696 0.482063 0.0835909 0.182671 0.478801 0.0766123 0.204424 0.476961 0.078453 0.231593 0.484847 0.0801194 0.250829 0.479195 0.0775101 0.284319 0.476512 0.0753623 0.305263 0.48398 0.0773509 0.330808 0.480836 0.0834572 0.35327 0.484647 0.0826045 0.378428 0.476517 0.0829205 0.40878 0.482768 0.0757514 0.425343 0.479207 0.0830396 0.452168 0.478398 0.0792053 0.481786 0.477672 0.106903 0.000223263 0.4791 0.100202 0.0308282 0.477302 0.102831 0.057307 0.480175 0.109211 0.0796714 0.481823 0.104979 0.107527 0.478382 0.103216 0.130905 0.475666 0.103803 0.157175 0.480719 0.105877 0.179988 0.47622 0.109345 0.205403 0.481837 0.109295 0.227775 0.479326 0.108777 0.251948 0.4804 0.10004 0.283152 0.476219 0.109147 0.307896 0.479638 0.100722 0.328047 0.476289 0.104888 0.358594 0.476671 0.107532 0.376029 0.480602 0.107398 0.409213 0.480191 0.101211 0.428284 0.478719 0.105005 0.454991 0.47769 0.106175 0.482353 0.479506 0.132855 0.00661447 0.48257 0.133368 0.029736 0.479821 0.126851 0.0512485 0.475107 0.128364 0.0777043 0.482443 0.13194 0.104098 0.476734 0.134413 0.125122 0.482207 0.129577 0.15529 0.484822 0.132045 0.183079 0.479518 0.134193 0.201018 0.481314 0.132884 0.230209 0.482918 0.131287 0.258621 0.476361 0.134998 0.280463 0.480868 0.127723 0.309037 0.480894 0.128574 0.327912 0.47937 0.130812 0.354329 0.483006 0.134686 0.376269 0.478151 0.125272 0.403144 0.477589 0.129934 0.434255 0.475391 0.128067 0.457245 0.480308 0.129286 0.483217 0.482825 0.151056 0.00592514 0.475629 0.151425 0.0308556 0.47995 0.158804 0.0503718 0.477246 0.159525 0.0786826 0.481854 0.158452 0.107823 0.482301 0.156083 0.13262 0.483965 0.157603 0.158821 0.484711 0.156096 0.182912 0.484749 0.151626 0.202368 0.475281 0.156945 0.227567 0.475091 0.157709 0.25426 0.480908 0.157952 0.275217 0.481499 0.153679 0.303142 0.480663 0.150437 0.326526 0.482234 0.154825 0.358218 0.483705 0.152982 0.381347 0.47868 0.151013 0.405681 0.480152 0.153489 0.42787 0.482597 0.155377 0.450283 0.480025 0.158256 0.48321 0.477861 0.180261 0.00125542 0.481394 0.176849 0.028279 0.48486 0.175952 0.0584481 0.481626 0.182283 0.0797967 0.483409 0.184735 0.102283 0.475547 0.179985 0.127129 0.484004 0.176774 0.159556 0.482507 0.184969 0.179065 0.47506 0.177432 0.209275 0.478275 0.183203 0.23487 0.481596 0.181945 0.251341 0.483777 0.177002 0.277455 0.4784 0.184929 0.30332 0.478674 0.182506 0.325346 0.481159 0.175896 0.357082 0.477966 0.18235 0.381018 0.475028 0.180025 0.403937 0.478415 0.179552 0.427348 0.481469 0.178809 0.454954 0.482966 0.184869 0.478631 0.475083 0.201928 0.00110901 0.475842 0.207387 0.030833 0.482046 0.202643 0.0570724 0.480374 0.200599 0.0787101 0.481524 0.208471 0.109868 0.476131 0.20687 0.130548 0.479368 0.204594 0.155761 0.478871 0.200156 0.181 0.476616 0.205149 0.202018 0.484919 0.200656 0.231797 0.479926 0.206264 0.254205 0.47818 0.208434 0.280592 0.482339 0.206171 0.309631 0.484323 0.202829 0.325503 0.476402 0.206079 0.355343 0.476461 0.200247 0.382981 0.483482 0.201718 0.409556 0.483972 0.201762 0.428642 0.47625 0.200595 0.451266 0.484926 0.207907 0.483913 0.48316 0.227092 0.00421137 0.476637 0.230362 0.0305471 0.481687 0.229713 0.0576908 0.479744 0.228508 0.0825527 0.478153 0.225292 0.106797 0.476364 0.232548 0.130193 0.476494 0.228348 0.156109 0.477642 0.226756 0.179258 0.476034 0.232102 0.205351 0.483572 0.228804 0.226739 0.476712 0.231371 0.254287 0.478184 0.2268 0.282495 0.477675 0.227457 0.309838 0.475443 0.230033 0.328364 0.478866 0.232193 0.353022 0.480618 0.230205 0.382252 0.479606 0.229261 0.405993 0.483973 0.231117 0.42879 0.484102 0.232954 0.45989 0.47507 0.234907 0.47812 0.478298 0.254935 0.00369644 0.47818 0.258886 0.0281092 0.478869 0.254292 0.0554137 0.478274 0.252915 0.0790643 0.47714 0.250842 0.102201 0.48007 0.254135 0.134182 0.480458 0.250727 0.152383 0.48001 0.250324 0.183126 0.481246 0.257661 0.209001 0.476849 0.256474 0.232669 0.477903 0.253297 0.258309 0.482994 0.25278 0.279939 0.481928 0.258382 0.309189 0.479409 0.251825 0.33057 0.478017 0.250627 0.355178 0.48159 0.250137 0.377167 0.4834 0.250525 0.401932 0.48094 0.255051 0.428294 0.481475 0.253595 0.450319 0.481855 0.256442 0.475837 0.47792 0.281546 0.00552299 0.480617 0.279391 0.0349709 0.482079 0.284528 0.050466 0.480991 0.282301 0.0751585 0.480972 0.275256 0.101159 0.478094 0.282053 0.127711 0.482185 0.275861 0.155683 0.48015 0.281748 0.177736 0.47637 0.276965 0.203246 0.481963 0.27846 0.227507 0.480615 0.278637 0.25614 0.483071 0.276266 0.283185 0.478331 0.278546 0.30402 0.482849 0.280494 0.327624 0.484399 0.280579 0.357579 0.479557 0.284931 0.375899 0.476894 0.284557 0.407451 0.482194 0.27581 0.427747 0.479042 0.275843 0.45836 0.478082 0.277851 0.479167 0.477817 0.303064 0.0098621 0.475435 0.302237 0.0325106 0.481497 0.302356 0.0541642 0.484671 0.305021 0.0777209 0.48368 0.301119 0.106901 0.482019 0.309886 0.132844 0.476977 0.307917 0.155657 0.484771 0.300294 0.178187 0.479825 0.309515 0.20131 0.479732 0.307351 0.23485 0.482715 0.302358 0.258792 0.483415 0.304941 0.277439 0.484568 0.304184 0.307451 0.481948 0.300937 0.333822 0.484742 0.300942 0.358982 0.484138 0.302718 0.382512 0.475504 0.305318 0.404297 0.47985 0.307876 0.430801 0.484921 0.304188 0.455513 0.484592 0.302817 0.479135 0.482414 0.328288 0.00246024 0.478039 0.326787 0.0293747 0.475609 0.333343 0.0554236 0.482585 0.333676 0.0849887 0.477227 0.32885 0.104908 0.478521 0.334151 0.130073 0.475219 0.334935 0.150291 0.47954 0.328369 0.176028 0.484538 0.330887 0.20893 0.481268 0.327177 0.225577 0.475081 0.330231 0.251183 0.483616 0.3311 0.281497 0.484443 0.32752 0.305534 0.477712 0.326349 0.329493 0.482927 0.327994 0.357429 0.484432 0.327702 0.384066 0.477113 0.331177 0.404889 0.478963 0.330224 0.434817 0.48109 0.325621 0.452094 0.478536 0.325802 0.483646 0.484671 0.358163 0.00442521 0.482493 0.358053 0.0313804 0.484415 0.352524 0.0594023 0.475371 0.350515 0.0762756 0.477096 0.35205 0.102506 0.477799 0.354789 0.128132 0.478728 0.355341 0.157234 0.478921 0.353683 0.176805 0.481285 0.359442 0.201535 0.483267 0.352603 0.230463 0.481335 0.356158 0.256693 0.479868 0.356602 0.276202 0.484761 0.353292 0.302531 0.477426 0.35257 0.331933 0.480036 0.358138 0.353206 0.47682 0.352036 0.380916 0.481203 0.353052 0.409545 0.478984 0.351474 0.426572 0.482077 0.357737 0.452353 0.475778 0.358543 0.484114 0.475004 0.378013 0.00902334 0.481766 0.378334 0.0328642 0.483486 0.375621 0.0533519 0.482803 0.382697 0.0823253 0.476883 0.383585 0.102125 0.484902 0.377231 0.134824 0.477697 0.37544 0.153771 0.482091 0.384768 0.178392 0.47541 0.384011 0.208815 0.481417 0.376103 0.233197 0.479119 0.383278 0.25753 0.477057 0.379383 0.284106 0.477889 0.375916 0.301836 0.48284 0.381529 0.330401 0.477244 0.382742 0.35159 0.475316 0.381551 0.376708 0.483578 0.382551 0.407894 0.475491 0.378108 0.433808 0.483745 0.379768 0.454162 0.484763 0.383345 0.479995 0.477915 0.408877 0.00765235 0.479709 0.406246 0.0313684 0.483224 0.40507 0.0529215 0.480413 0.409134 0.0772767 0.475381 0.408636 0.106756 0.484474 0.40204 0.132321 0.476324 0.400186 0.156998 0.483943 0.400378 0.183187 0.483415 0.404879 0.206798 0.481334 0.403179 0.230262 0.475958 0.404008 0.252788 0.47644 0.405966 0.279477 0.479725 0.409474 0.308861 0.477434 0.400588 0.330507 0.476482 0.400846 0.3545 0.481873 0.403424 0.375766 0.479975 0.401946 0.407528 0.483319 0.409698 0.433364 0.475806 0.408172 0.454308 0.484163 0.401041 0.475705 0.483927 0.426344 0.000618859 0.477064 0.430266 0.0274474 0.479176 0.433472 0.0598537 0.484981 0.433281 0.0775196 0.482217 0.427351 0.108585 0.478795 0.434477 0.125766 0.484602 0.430757 0.154331 0.475977 0.427465 0.182225 0.47709 0.429538 0.207754 0.484671 0.4344 0.233365 0.475761 0.425429 0.25445 0.476956 0.425492 0.28432 0.482366 0.430748 0.307375 0.484511 0.428775 0.330379 0.482247 0.432899 0.357152 0.477439 0.430788 0.376197 0.476778 0.431465 0.401554 0.484231 0.432552 0.433295 0.476129 0.434852 0.457173 0.480463 0.429169 0.476085 0.481647 0.454301 0.00237866 0.481693 0.459814 0.0301056 0.481163 0.454742 0.0545202 0.484672 0.458138 0.0788701 0.476959 0.459323 0.109348 0.480136 0.455847 0.130049 0.478198 0.455115 0.156011 0.479549 0.453402 0.182648 0.477403 0.457866 0.205992 0.476584 0.453548 0.234311 0.480267 0.452132 0.255449 0.482768 0.458967 0.281189 0.482437 0.456026 0.306557 0.477158 0.454521 0.332085 0.479847 0.452221 0.357408 0.482392 0.459 0.382567 0.47722 0.453786 0.401865 0.477424 0.459568 0.433676 0.481261 0.451463 0.4543 0.477098 0.450115 0.477767 0.477065 0.481297 0.00288173 0.483519 0.475507 0.0340101 0.484351 0.476145 0.052303 0.477574 0.482549 0.0751023 0.479474 0.478282 0.105831 0.479987 0.480996 0.131317 0.483386 0.47812 0.150271 0.482225 0.477041 0.178304 0.479655 0.483978 0.202577 0.478741 0.484143 0.225538 0.483574 0.483139 0.256099 0.481521 0.476252 0.279159 0.477443 0.484792 0.301775 0.482526 0.477051 0.33285 0.478273 0.475444 0.355766 0.481748 0.479337 0.382108 0.482941 0.476697 0.408342 0.477178 0.479944 0.428658 0.483505 0.475388 0.452699 0.480162 0.475658 0.475057 0.481654 0.503928 0.00321616 0.483187 0.50047 0.0337971 0.484256 0.505922 0.0551696 0.47707 0.507136 0.0813865 0.476956 0.505051 0.100124 0.475805 0.50203 0.132754 0.484313 0.50723 0.150406 0.484183 0.508195 0.175472 0.482266 0.504944 0.207958 0.478584 0.506148 0.229351 0.479397 0.504683 0.25923 0.483606 0.505725 0.282408 0.478981 0.505452 0.304096 0.480933 0.505029 0.333264 0.481791 0.503403 0.359788 0.484541 0.50846 0.380774 0.480123 0.509817 0.407011 0.481293 0.506241 0.429143 0.484537 0.50202 0.453725 0.479457 0.503492 0.480553 0.47764 0.53365 0.00319384 0.483068 0.526298 0.0312662 0.479014 0.529489 0.0506009 0.483101 0.52642 0.0813964 0.481677 0.533135 0.109936 0.476557 0.530556 0.128157 0.481987 0.5269 0.154117 0.484006 0.533417 0.175549 0.478846 0.5298 0.20895 0.482107 0.529917 0.229136 0.476126 0.527857 0.256567 0.482432 0.532074 0.275603 0.47918 0.529063 0.306935 0.484397 0.529274 0.334402 0.481898 0.526974 0.350735 0.482262 0.53055 0.376987 0.47613 0.530737 0.40486 0.476478 0.527288 0.431099 0.482494 0.528981 0.453178 0.47885 0.529677 0.475294 0.483448 0.55564 0.00341626 0.482765 0.553016 0.0343584 0.476996 0.557682 0.0514657 0.475075 0.552313 0.0773882 0.477363 0.555784 0.104231 0.479691 0.558195 0.127119 0.478916 0.558009 0.154753 0.483873 0.556455 0.175133 0.482119 0.556597 0.205249 0.480145 0.552887 0.228555 0.477233 0.553479 0.251096 0.475602 0.555129 0.28073 0.484092 0.559121 0.300363 0.476044 0.559895 0.334109 0.478295 0.559929 0.352729 0.481154 0.554622 0.381385 0.481581 0.556755 0.402709 0.482295 0.555429 0.431895 0.478857 0.553174 0.458311 0.47858 0.55462 0.478422 0.47858 0.58431 0.00396744 0.483984 0.580222 0.0299804 0.480993 0.578525 0.0576284 0.478912 0.576719 0.0764071 0.475741 0.57887 0.108023 0.477529 0.584438 0.126581 0.477678 0.578696 0.152874 0.481079 0.577649 0.182214 0.477201 0.575078 0.202033 0.480756 0.583798 0.233424 0.476187 0.584685 0.252225 0.481695 0.582567 0.282696 0.479454 0.577523 0.305515 0.478041 0.583275 0.329619 0.483652 0.582395 0.356714 0.481469 0.582625 0.38449 0.477103 0.575957 0.403763 0.475593 0.583187 0.425738 0.482737 0.583347 0.453305 0.480079 0.5767 0.476822 0.478771 0.604365 0.00469032 0.481379 0.602686 0.0319915 0.483506 0.607229 0.0536134 0.477321 0.604871 0.0807615 0.475972 0.606754 0.102886 0.480749 0.609356 0.130292 0.482531 0.605571 0.153861 0.482626 0.607797 0.178439 0.484208 0.608604 0.205048 0.476155 0.600208 0.232593 0.47989 0.606832 0.252713 0.482916 0.606388 0.277015 0.482386 0.606185 0.301446 0.480142 0.607908 0.330473 0.475863 0.602883 0.356806 0.481095 0.606564 0.382826 0.476961 0.602218 0.407102 0.479562 0.602982 0.427005 0.479498 0.603597 0.451388 0.482863 0.609103 0.475816 0.476536 0.62725 0.0082169 0.484287 0.634442 0.0281334 0.482219 0.630083 0.0551071 0.477442 0.630569 0.0771859 0.481382 0.630842 0.106952 0.481114 0.626249 0.129068 0.478739 0.632396 0.152988 0.480182 0.627583 0.179778 0.478105 0.63017 0.205073 0.477574 0.633899 0.231696 0.480809 0.63023 0.251873 0.47972 0.633825 0.281038 0.480152 0.628736 0.30179 0.477372 0.634925 0.332059 0.483873 0.625594 0.354622 0.484925 0.63135 0.37913 0.479781 0.632848 0.407047 0.479714 0.629993 0.426103 0.483382 0.626462 0.457116 0.483418 0.630348 0.479708 0.481342 0.654576 0.000965651 0.476179 0.650454 0.0260621 0.483044 0.656389 0.0594758 0.48308 0.653188 0.0817054 0.481274 0.653894 0.106394 0.477407 0.65172 0.125814 0.477201 0.659699 0.155893 0.475189 0.654582 0.176897 0.479061 0.654149 0.201658 0.476105 0.659655 0.228815 0.480351 0.652384 0.257217 0.475154 0.65835 0.278657 0.479731 0.659286 0.307738 0.48498 0.654547 0.326975 0.478608 0.659097 0.35514 0.477271 0.65739 0.377843 0.481498 0.651264 0.409812 0.477464 0.651473 0.428978 0.476971 0.654577 0.45475 0.479365 0.655236 0.47768 0.478249 0.675713 0.000334595 0.483799 0.679146 0.0257538 0.477363 0.678365 0.0538311 0.483149 0.679341 0.0784664 0.482071 0.679365 0.1058 0.475312 0.681397 0.133365 0.48146 0.678703 0.157986 0.475862 0.680966 0.177393 0.48458 0.681522 0.204628 0.479849 0.680542 0.226646 0.478844 0.675788 0.253092 0.478243 0.683245 0.278264 0.480861 0.683464 0.300252 0.482366 0.681892 0.333179 0.480603 0.675989 0.353405 0.47585 0.675342 0.381848 0.477268 0.675055 0.403612 0.476812 0.680161 0.427296 0.475307 0.683898 0.459593 0.483551 0.680226 0.475507 0.484802 0.700062 0.00866569 0.480719 0.705445 0.0287899 0.48364 0.704043 0.0559421 0.482835 0.708902 0.0829081 0.47628 0.709917 0.105014 0.478426 0.702646 0.125063 0.478728 0.70633 0.156921 0.475265 0.708276 0.182512 0.475942 0.701724 0.203787 0.475604 0.70475 0.227958 0.476343 0.705572 0.257243 0.482539 0.705217 0.280429 0.479675 0.707441 0.308044 0.478727 0.70832 0.325176 0.476196 0.704407 0.355691 0.479395 0.708938 0.376438 0.477728 0.707901 0.402278 0.482314 0.707197 0.428773 0.477261 0.708176 0.455444 0.483254 0.709187 0.475802 0.477064 0.733261 0.0083171 0.482102 0.725901 0.0308868 0.48454 0.729428 0.0539235 0.477408 0.731762 0.0771597 0.479532 0.734455 0.106948 0.478597 0.72814 0.125835 0.476434 0.732304 0.154518 0.479604 0.731869 0.183513 0.484477 0.727498 0.20666 0.476774 0.728489 0.23251 0.483712 0.728547 0.254624 0.476789 0.727292 0.278296 0.479617 0.731182 0.30772 0.479585 0.729414 0.326432 0.477123 0.726888 0.357737 0.479797 0.728403 0.377845 0.483823 0.731575 0.401775 0.475542 0.733937 0.434689 0.478486 0.727427 0.457669 0.479269 0.732697 0.480478 0.501376 0.00431378 0.00365213 0.505432 0.00128359 0.032601 0.508458 0.00789186 0.0560259 0.504497 0.00371833 0.0778446 0.508385 0.00916161 0.103178 0.501162 0.00848841 0.129587 0.500313 0.00162474 0.157873 0.504226 0.0096604 0.177322 0.502071 0.00973031 0.204594 0.508399 0.00734149 0.225064 0.506524 0.00429479 0.257906 0.509461 0.00111414 0.28302 0.508721 0.00412458 0.309487 0.50584 5.67773e-05 0.327989 0.500534 0.000858298 0.350658 0.500505 0.00184575 0.384465 0.507266 0.00717069 0.404575 0.506163 0.00798925 0.426048 0.503129 0.00366588 0.453299 0.503995 0.00632768 0.475074 0.500982 0.0297261 0.00795518 0.504753 0.0296686 0.0306004 0.502825 0.0309476 0.0508956 0.506527 0.0341685 0.0802787 0.507935 0.0263316 0.109675 0.501531 0.0288438 0.129963 0.505496 0.0255951 0.158764 0.503166 0.0344481 0.17724 0.501956 0.0305584 0.20416 0.50244 0.0264316 0.227934 0.506503 0.0272782 0.259389 0.506164 0.0281566 0.283616 0.500583 0.0322132 0.301004 0.505681 0.0258752 0.333807 0.506231 0.025793 0.356697 0.503505 0.0289597 0.382481 0.502171 0.0269379 0.405981 0.50827 0.0279368 0.429362 0.503333 0.0261624 0.45504 0.506368 0.0319734 0.479133 0.503847 0.054513 0.00845288 0.502311 0.0542002 0.0330163 0.501274 0.0516445 0.0557001 0.509698 0.0563071 0.0849456 0.500055 0.0506225 0.10337 0.502962 0.0542117 0.129934 0.508631 0.0564115 0.158957 0.502017 0.0501173 0.184286 0.507805 0.0542333 0.203129 0.503896 0.0522723 0.233237 0.504027 0.0514207 0.253645 0.50341 0.0556744 0.275651 0.506548 0.0508048 0.305006 0.502388 0.059259 0.327552 0.502842 0.0528186 0.359754 0.50383 0.0564624 0.384198 0.504709 0.0549786 0.405794 0.508403 0.05271 0.434233 0.506604 0.0592033 0.459015 0.505045 0.0571567 0.483363 0.500615 0.0753621 0.00470635 0.507529 0.0848041 0.0330495 0.502306 0.0810753 0.0568554 0.506556 0.0801312 0.0810237 0.507004 0.0766591 0.105249 0.50048 0.075196 0.128768 0.508981 0.0758728 0.159816 0.509776 0.0821765 0.175111 0.506856 0.0843025 0.204395 0.505582 0.0761616 0.231567 0.50265 0.0799037 0.251005 0.501892 0.0767078 0.283377 0.505346 0.0755015 0.304417 0.500194 0.0757558 0.326901 0.508965 0.0832322 0.352758 0.505675 0.0778585 0.377634 0.501875 0.0752513 0.406603 0.501733 0.0751019 0.425435 0.500205 0.0758839 0.458111 0.50884 0.0825082 0.478748 0.505863 0.101385 0.00282364 0.504903 0.105288 0.0346654 0.500123 0.108512 0.0585104 0.504222 0.107124 0.0813995 0.506153 0.104658 0.107779 0.504109 0.109255 0.126517 0.505912 0.10959 0.154301 0.503304 0.107013 0.177605 0.502131 0.101579 0.202402 0.505793 0.108474 0.225549 0.501289 0.100102 0.2516 0.501816 0.108507 0.282579 0.503029 0.103175 0.304215 0.505836 0.101935 0.329649 0.502523 0.108225 0.356412 0.508879 0.108151 0.382118 0.503227 0.103952 0.408862 0.500012 0.107127 0.43361 0.509903 0.10739 0.456021 0.505246 0.10911 0.475576 0.505863 0.134388 0.00511127 0.507966 0.125304 0.0284244 0.50935 0.134939 0.0532094 0.501765 0.131888 0.0751166 0.504844 0.132654 0.103444 0.502123 0.129679 0.128386 0.502273 0.128084 0.159753 0.504292 0.130733 0.179325 0.508666 0.132697 0.202166 0.505346 0.133514 0.230136 0.509523 0.128497 0.258377 0.504716 0.131528 0.275973 0.505713 0.125138 0.309595 0.504895 0.130805 0.334044 0.506855 0.125291 0.353249 0.500835 0.133022 0.384658 0.504338 0.133778 0.402192 0.504225 0.125867 0.428183 0.502559 0.133796 0.456781 0.507843 0.128286 0.47966 0.506547 0.156208 0.00605225 0.509115 0.157194 0.028412 0.501865 0.158988 0.0584774 0.505968 0.153428 0.0775482 0.508247 0.159539 0.108502 0.50556 0.153147 0.127674 0.500097 0.154106 0.150601 0.507911 0.153008 0.183219 0.503414 0.152504 0.201888 0.505268 0.157169 0.23171 0.505923 0.15231 0.256342 0.504635 0.152004 0.283976 0.503097 0.158972 0.308264 0.501578 0.15303 0.333329 0.504891 0.159633 0.351769 0.502559 0.159443 0.380262 0.501738 0.154533 0.400426 0.506477 0.158227 0.42986 0.500009 0.157317 0.451178 0.50136 0.154363 0.476566 0.504015 0.181702 0.00669524 0.505214 0.177994 0.0281057 0.50258 0.179208 0.0516441 0.501582 0.177163 0.0790119 0.501207 0.182965 0.107369 0.502127 0.17763 0.1333 0.500775 0.17755 0.151645 0.500512 0.178718 0.180942 0.500377 0.182357 0.204752 0.502489 0.181252 0.226181 0.50236 0.182564 0.25804 0.50406 0.17715 0.28267 0.505567 0.181479 0.304194 0.505038 0.176957 0.329171 0.509233 0.175803 0.357632 0.500466 0.182646 0.381029 0.503229 0.176168 0.405027 0.506847 0.17814 0.425153 0.506491 0.184688 0.453602 0.507705 0.180097 0.48261 0.504686 0.204923 0.000713714 0.501914 0.206926 0.0326672 0.50494 0.200084 0.0527073 0.502792 0.207119 0.0772189 0.504153 0.209432 0.100749 0.501794 0.201858 0.129399 0.509536 0.201293 0.158092 0.505334 0.2068 0.175093 0.509379 0.208996 0.200744 0.50717 0.203959 0.232163 0.504176 0.208691 0.251368 0.505368 0.209499 0.279444 0.503125 0.202594 0.305185 0.503986 0.203755 0.329613 0.506443 0.205376 0.350404 0.502833 0.201414 0.380775 0.502261 0.201032 0.402075 0.503931 0.209753 0.432506 0.501109 0.201784 0.459649 0.501991 0.20846 0.47879 0.50927 0.23382 0.00331382 0.503139 0.234186 0.0325264 0.50389 0.234215 0.0540501 0.503364 0.227039 0.0833419 0.500366 0.230756 0.106353 0.503259 0.229634 0.131589 0.503624 0.231645 0.1567 0.500666 0.232293 0.176282 0.509511 0.226943 0.204417 0.507798 0.230619 0.229753 0.501915 0.233987 0.252499 0.503932 0.228891 0.279066 0.507433 0.22514 0.306089 0.503249 0.234653 0.326947 0.50044 0.227141 0.353644 0.508339 0.227737 0.375915 0.50584 0.234623 0.403183 0.50711 0.229928 0.425561 0.502546 0.230442 0.458068 0.502679 0.228363 0.483006 0.505596 0.257676 0.00482023 0.503735 0.251277 0.0317433 0.503156 0.25463 0.0544759 0.501292 0.254322 0.080909 0.50238 0.25548 0.108069 0.508287 0.251779 0.130196 0.509101 0.258774 0.150058 0.508498 0.251457 0.179922 0.507767 0.259467 0.202434 0.509854 0.251057 0.232985 0.506188 0.257684 0.251797 0.507899 0.259277 0.277465 0.508551 0.252784 0.308978 0.507418 0.25968 0.328108 0.503912 0.253958 0.35451 0.508713 0.257493 0.378769 0.503189 0.252644 0.40082 0.508644 0.255949 0.429326 0.508977 0.256656 0.458031 0.503762 0.255269 0.479074 0.504445 0.277055 0.00185651 0.507696 0.280618 0.0291151 0.503555 0.27939 0.0593654 0.505643 0.283548 0.0788669 0.509593 0.275571 0.105411 0.50727 0.282883 0.131181 0.50851 0.276124 0.150182 0.508595 0.277692 0.176631 0.509031 0.275655 0.205488 0.504026 0.28322 0.225184 0.509131 0.276688 0.254827 0.508914 0.276869 0.283487 0.505925 0.284243 0.305687 0.509257 0.283781 0.332213 0.506025 0.283728 0.353385 0.50943 0.279814 0.375212 0.500999 0.284107 0.405685 0.50619 0.28311 0.426023 0.504825 0.277956 0.45953 0.507331 0.276445 0.482739 0.50996 0.300165 0.00248427 0.506401 0.309596 0.02856 0.509774 0.302845 0.0553341 0.505943 0.307893 0.0775 0.505924 0.306424 0.104123 0.504563 0.30255 0.133208 0.500836 0.303686 0.158515 0.502025 0.306087 0.182144 0.505042 0.301786 0.201841 0.508707 0.308876 0.230335 0.505945 0.303892 0.250209 0.500773 0.304368 0.276287 0.501996 0.305325 0.303376 0.502468 0.30952 0.334984 0.50681 0.304816 0.359168 0.501438 0.304654 0.376282 0.509857 0.309322 0.404265 0.502839 0.308111 0.429135 0.502215 0.309837 0.456941 0.500795 0.300398 0.484486 0.509825 0.332604 0.00611509 0.507904 0.334213 0.0322467 0.509155 0.331204 0.0560662 0.508467 0.329634 0.0783084 0.504517 0.331468 0.104561 0.501153 0.332448 0.125332 0.503005 0.330728 0.152571 0.504293 0.329377 0.180433 0.509746 0.325381 0.205122 0.504408 0.32835 0.230533 0.500031 0.330979 0.255213 0.500817 0.327942 0.275988 0.505231 0.327142 0.300883 0.508374 0.331454 0.329989 0.50226 0.329716 0.357032 0.503901 0.330624 0.379106 0.502711 0.330255 0.401563 0.506284 0.329921 0.433066 0.507429 0.330881 0.452294 0.507258 0.327736 0.483194 0.508582 0.350931 0.00232423 0.501446 0.35035 0.0281699 0.508545 0.354162 0.0510051 0.506069 0.352155 0.0761238 0.508127 0.354683 0.102011 0.507363 0.35277 0.126119 0.504538 0.35674 0.158492 0.505056 0.357093 0.182538 0.50483 0.357427 0.202221 0.509949 0.352567 0.233344 0.508375 0.359928 0.253424 0.504594 0.353386 0.281108 0.504037 0.353116 0.309895 0.504803 0.356997 0.330041 0.502608 0.355795 0.35095 0.5074 0.359675 0.379959 0.507761 0.352061 0.40942 0.509813 0.359633 0.426395 0.50705 0.359973 0.459906 0.508522 0.357725 0.480117 0.501717 0.379558 0.00445328 0.500222 0.377343 0.0273748 0.504659 0.383468 0.0532253 0.50409 0.378983 0.0757316 0.506379 0.384416 0.101957 0.501813 0.379165 0.127547 0.501757 0.379762 0.157699 0.503397 0.381306 0.183421 0.508125 0.378329 0.209846 0.509705 0.382684 0.233481 0.507784 0.376611 0.254018 0.504148 0.381391 0.278347 0.501206 0.384303 0.307046 0.508529 0.381301 0.325208 0.509426 0.381846 0.356785 0.509444 0.377604 0.384921 0.505735 0.375812 0.408852 0.501868 0.375286 0.425007 0.509308 0.378059 0.450088 0.505373 0.379054 0.478251 0.505133 0.406136 0.00789075 0.509091 0.40304 0.0324029 0.501714 0.405294 0.0504977 0.500864 0.403352 0.0829384 0.500006 0.407941 0.109528 0.509285 0.403818 0.127422 0.506823 0.403583 0.151582 0.503114 0.406723 0.177295 0.505585 0.403313 0.201599 0.500086 0.408885 0.229038 0.501564 0.402347 0.252413 0.506852 0.409021 0.27901 0.500197 0.401089 0.309348 0.503125 0.40906 0.334633 0.504051 0.402039 0.354993 0.508764 0.401774 0.377139 0.501312 0.406435 0.403508 0.503543 0.409704 0.426782 0.500065 0.409862 0.459385 0.50746 0.402211 0.481616 0.509363 0.432846 0.00968194 0.503794 0.430899 0.0314491 0.503551 0.427635 0.0506816 0.507616 0.42911 0.0756231 0.503328 0.427253 0.101373 0.508836 0.43001 0.132791 0.508785 0.426693 0.153358 0.505715 0.434496 0.175557 0.504177 0.433953 0.203975 0.501842 0.429562 0.233347 0.503659 0.429816 0.258235 0.505822 0.432172 0.284353 0.505453 0.434229 0.30824 0.504727 0.426783 0.328932 0.501397 0.430216 0.357076 0.501775 0.43171 0.384883 0.504719 0.428374 0.405701 0.503211 0.428085 0.42759 0.500464 0.42628 0.454038 0.507209 0.433105 0.48342 0.505464 0.450516 0.00537846 0.500619 0.455587 0.034461 0.509246 0.450673 0.0509626 0.505109 0.459279 0.0778948 0.508586 0.455138 0.107067 0.5012 0.456676 0.125337 0.506342 0.458071 0.15115 0.502684 0.459024 0.180265 0.503196 0.451043 0.206386 0.502322 0.45205 0.23243 0.50852 0.450929 0.250287 0.506885 0.457989 0.276851 0.50252 0.453176 0.306502 0.504257 0.453133 0.325847 0.504418 0.452605 0.352053 0.507836 0.457515 0.37925 0.50686 0.457207 0.400483 0.507345 0.453783 0.433275 0.501899 0.456591 0.453268 0.506866 0.45657 0.482471 0.50835 0.483879 0.00224918 0.503882 0.481475 0.031341 0.503376 0.475776 0.0599317 0.508214 0.477796 0.0764751 0.503534 0.475379 0.10716 0.507859 0.479491 0.133196 0.504946 0.477218 0.151991 0.50717 0.475653 0.184323 0.508264 0.475611 0.20084 0.500497 0.483803 0.234417 0.50926 0.478073 0.253985 0.506508 0.484526 0.280789 0.504114 0.479174 0.305597 0.506048 0.478418 0.330058 0.507077 0.483605 0.358913 0.50925 0.483018 0.382531 0.507397 0.484762 0.402844 0.507219 0.48284 0.429267 0.500358 0.476835 0.458762 0.501583 0.483904 0.476803 0.507044 0.509982 0.000811502 0.506582 0.509323 0.0255002 0.508734 0.503761 0.0523435 0.500371 0.507598 0.0840839 0.50932 0.509299 0.104151 0.501923 0.504758 0.133149 0.507859 0.507378 0.156693 0.505969 0.506635 0.17901 0.508878 0.505891 0.204105 0.504377 0.503943 0.228994 0.500309 0.501317 0.254538 0.501738 0.509434 0.27827 0.50235 0.503029 0.30904 0.506912 0.50377 0.325762 0.508759 0.509846 0.356897 0.505989 0.509398 0.377824 0.503121 0.500549 0.408299 0.502705 0.500337 0.427397 0.504543 0.509654 0.456064 0.502227 0.509724 0.480474 0.501593 0.527021 0.00149718 0.50286 0.526472 0.0313081 0.508506 0.531104 0.0518548 0.50725 0.530724 0.0785421 0.501892 0.531009 0.10826 0.507041 0.526631 0.132465 0.502434 0.53299 0.159701 0.509442 0.529184 0.181696 0.50332 0.52875 0.203646 0.509476 0.52515 0.231047 0.509024 0.531963 0.256862 0.507661 0.528646 0.282822 0.507753 0.526936 0.304459 0.503784 0.525486 0.328513 0.503209 0.53211 0.356529 0.503454 0.534261 0.382731 0.50467 0.534658 0.404719 0.50959 0.530185 0.433183 0.503131 0.534417 0.455046 0.500561 0.531126 0.479308 0.505494 0.557861 0.00175254 0.500186 0.55915 0.0331442 0.501618 0.55226 0.0558534 0.508244 0.554237 0.0769513 0.502701 0.557811 0.100781 0.505998 0.552263 0.131818 0.508909 0.551359 0.153401 0.501868 0.556105 0.175524 0.505839 0.550428 0.207148 0.502471 0.554094 0.22562 0.500712 0.554019 0.259372 0.50141 0.557893 0.284095 0.502614 0.559328 0.304365 0.501531 0.555411 0.327606 0.507315 0.552551 0.352597 0.507444 0.556004 0.377066 0.504883 0.55875 0.409158 0.503193 0.558152 0.430026 0.505337 0.559701 0.458372 0.504179 0.551313 0.479326 0.505363 0.575132 0.00431776 0.502339 0.57681 0.029521 0.503271 0.580282 0.0553221 0.500071 0.576769 0.0824758 0.504589 0.57811 0.1073 0.506366 0.581617 0.133916 0.500837 0.57799 0.150842 0.501225 0.57842 0.177175 0.500034 0.578425 0.209493 0.502364 0.579041 0.22993 0.504537 0.576304 0.2546 0.509605 0.58388 0.282972 0.500914 0.575304 0.303481 0.509906 0.577031 0.327575 0.502936 0.578124 0.353192 0.503138 0.583095 0.378717 0.506148 0.578061 0.405437 0.503395 0.579718 0.433799 0.504023 0.583194 0.45491 0.504929 0.582373 0.475443 0.507026 0.602911 0.00738386 0.509231 0.605312 0.0344561 0.508389 0.606991 0.0587089 0.503709 0.601141 0.0825513 0.505598 0.603712 0.100928 0.509954 0.602543 0.127529 0.509635 0.608316 0.154999 0.502386 0.604666 0.184775 0.509683 0.609713 0.2055 0.503766 0.608503 0.229665 0.501832 0.607959 0.252058 0.509437 0.601972 0.275761 0.503056 0.60035 0.30111 0.501532 0.602495 0.333426 0.501463 0.606987 0.352026 0.502324 0.608946 0.377685 0.50711 0.600357 0.408197 0.509296 0.606756 0.430653 0.502285 0.6042 0.455986 0.509845 0.608697 0.480131 0.507626 0.63218 0.0060562 0.506458 0.631302 0.0323585 0.508938 0.628348 0.0521199 0.503264 0.627009 0.0847728 0.506698 0.634147 0.101138 0.503848 0.629142 0.132497 0.502953 0.631607 0.152902 0.504308 0.631272 0.181395 0.50703 0.629674 0.207852 0.501815 0.627432 0.22952 0.500691 0.632763 0.252558 0.502086 0.63379 0.280488 0.500508 0.625611 0.306475 0.502901 0.634577 0.329278 0.500367 0.627195 0.350237 0.504168 0.630554 0.375226 0.508911 0.627819 0.40575 0.502452 0.632616 0.426654 0.507017 0.628313 0.45558 0.508346 0.626307 0.482127 0.505883 0.65317 0.00554546 0.501295 0.655543 0.0331742 0.503504 0.653117 0.0544036 0.50787 0.656441 0.083086 0.501733 0.65909 0.10759 0.509145 0.654399 0.128352 0.509323 0.656178 0.153376 0.501604 0.65749 0.178805 0.50754 0.656832 0.208267 0.504224 0.653321 0.233902 0.50026 0.654081 0.253751 0.501838 0.650869 0.28386 0.500427 0.651008 0.306507 0.501481 0.651363 0.3303 0.502533 0.650302 0.357946 0.502262 0.650219 0.379679 0.506213 0.656438 0.405133 0.508145 0.654238 0.433105 0.507639 0.652054 0.45622 0.500623 0.65113 0.483459 0.509216 0.680395 0.00496805 0.504924 0.679516 0.0335464 0.505208 0.680838 0.0584268 0.508994 0.684009 0.0773863 0.507317 0.678418 0.105541 0.504321 0.681836 0.131187 0.503131 0.676697 0.152345 0.506705 0.680923 0.184288 0.506061 0.684689 0.203384 0.503874 0.684877 0.230938 0.508141 0.683351 0.25205 0.509407 0.68101 0.27786 0.501239 0.681506 0.301248 0.503029 0.680027 0.327925 0.508124 0.682934 0.358934 0.503044 0.675662 0.379584 0.509877 0.679787 0.407934 0.503365 0.68349 0.429986 0.505371 0.681737 0.453119 0.505005 0.684489 0.48126 0.504592 0.705195 0.00598888 0.50524 0.702088 0.0329786 0.509657 0.703494 0.0530855 0.500183 0.709848 0.0842321 0.503018 0.704008 0.10182 0.501198 0.70605 0.130364 0.501888 0.702173 0.157368 0.506938 0.701564 0.18083 0.509279 0.709029 0.201708 0.500754 0.709872 0.228113 0.504586 0.704088 0.250239 0.504307 0.707821 0.283651 0.507611 0.708778 0.305941 0.500062 0.709861 0.334213 0.509882 0.708236 0.356662 0.505358 0.702817 0.376931 0.503361 0.701087 0.40847 0.507435 0.701789 0.429618 0.500072 0.707222 0.453687 0.503221 0.709854 0.475807 0.505066 0.7336 0.00892593 0.505223 0.731181 0.03327 0.500107 0.728627 0.0513422 0.502483 0.729411 0.0824563 0.50455 0.730171 0.10891 0.505236 0.726989 0.126979 0.506426 0.727317 0.156369 0.503712 0.733442 0.17828 0.503541 0.725781 0.202603 0.507941 0.725955 0.228652 0.506867 0.728566 0.254484 0.50767 0.733561 0.283162 0.503723 0.728347 0.309081 0.50123 0.726751 0.332399 0.502591 0.72503 0.358867 0.50619 0.734666 0.382648 0.508234 0.729212 0.407335 0.507762 0.731593 0.426887 0.504226 0.729136 0.454067 0.501964 0.725583 0.482243 0.527016 0.0035381 0.00571674 0.532805 0.00731229 0.0252059 0.525981 0.00722023 0.0503218 0.525858 0.00175121 0.0822064 0.529239 0.00129862 0.102132 0.533201 0.00680788 0.129432 0.532366 0.00535519 0.155397 0.534666 0.000340813 0.182715 0.52603 0.00587514 0.205294 0.530574 0.00135646 0.225615 0.532085 0.0011014 0.251432 0.52899 0.00238285 0.276221 0.52615 0.00281669 0.307194 0.525249 0.000555634 0.332575 0.531479 0.00381809 0.357215 0.53049 0.00765883 0.383839 0.526219 0.00141026 0.402838 0.53035 0.00294501 0.433625 0.525026 0.00154281 0.45088 0.528124 0.00291882 0.48459 0.527834 0.0271481 0.00140382 0.531373 0.0298344 0.0301387 0.526264 0.029169 0.0506479 0.532853 0.0302485 0.0789022 0.533849 0.0327087 0.108129 0.534832 0.0330455 0.13111 0.528311 0.0294436 0.158365 0.531164 0.0314712 0.180807 0.52964 0.0329263 0.204382 0.529432 0.0295219 0.23293 0.526975 0.0255576 0.250626 0.526726 0.028818 0.281239 0.531877 0.0276105 0.303915 0.530307 0.0297797 0.328402 0.525204 0.0264323 0.358956 0.526507 0.0277947 0.378678 0.528891 0.0326466 0.40198 0.53111 0.0305127 0.426285 0.532984 0.0295561 0.454503 0.533324 0.0323744 0.483335 0.534757 0.0502116 0.00482703 0.531842 0.0542171 0.0307686 0.530551 0.0519439 0.0546944 0.529352 0.0561002 0.0791589 0.532748 0.0592632 0.105545 0.533034 0.0552058 0.130447 0.532081 0.0547723 0.152427 0.528685 0.0522448 0.180285 0.531514 0.0517919 0.207014 0.531981 0.0589113 0.225321 0.530458 0.0529536 0.250298 0.533379 0.0522747 0.278076 0.530484 0.0531925 0.308927 0.530821 0.0518651 0.32781 0.53317 0.0555903 0.358521 0.528893 0.051045 0.383719 0.525497 0.0590371 0.406974 0.533 0.0574459 0.434883 0.532996 0.0593133 0.450403 0.526862 0.0595329 0.483323 0.534827 0.0784804 0.00303352 0.526763 0.0765302 0.0263065 0.531579 0.0831072 0.0511152 0.526368 0.0777187 0.0756039 0.53289 0.0824588 0.103756 0.526197 0.0790029 0.132332 0.527068 0.0787383 0.156058 0.52821 0.0762674 0.181365 0.529341 0.0791688 0.205762 0.530768 0.0830022 0.229411 0.53007 0.0804043 0.254157 0.529217 0.0768509 0.283074 0.525515 0.0794092 0.301552 0.528597 0.0824103 0.326811 0.532698 0.0750343 0.358172 0.527684 0.0767835 0.377608 0.525839 0.0801058 0.405321 0.531536 0.0829632 0.430327 0.529566 0.0818034 0.450475 0.534171 0.0797254 0.475575 0.526528 0.108523 0.00976717 0.527763 0.104251 0.0320589 0.534359 0.106134 0.0552648 0.529817 0.104719 0.0832977 0.527466 0.100599 0.107373 0.53075 0.109507 0.131012 0.531813 0.101704 0.150849 0.533103 0.106051 0.184244 0.530403 0.105779 0.204858 0.529162 0.10543 0.226871 0.529439 0.104928 0.252212 0.534736 0.10025 0.283203 0.529528 0.104392 0.300998 0.527269 0.108267 0.325653 0.531553 0.102982 0.350743 0.533508 0.108927 0.380469 0.531079 0.101699 0.402693 0.52775 0.105097 0.428432 0.526688 0.100722 0.455718 0.526189 0.100659 0.483339 0.531141 0.130483 0.00523341 0.530985 0.125929 0.033178 0.528318 0.127758 0.0592327 0.534675 0.126441 0.076059 0.534269 0.134414 0.101773 0.526045 0.130015 0.130887 0.534349 0.13246 0.15097 0.529662 0.129537 0.176439 0.526597 0.126249 0.206928 0.527126 0.126184 0.234217 0.527723 0.134587 0.251913 0.533561 0.131323 0.281359 0.531829 0.13455 0.306457 0.525066 0.131336 0.334136 0.534776 0.126562 0.352323 0.525448 0.132723 0.384764 0.525701 0.132252 0.401761 0.531299 0.133169 0.434768 0.529019 0.130852 0.451638 0.527569 0.130268 0.480024 0.527561 0.159968 0.00532707 0.531987 0.154318 0.0313314 0.531604 0.157401 0.0589799 0.528967 0.154171 0.0751681 0.527553 0.156945 0.103638 0.533568 0.152083 0.131541 0.529811 0.157227 0.157581 0.525603 0.156944 0.179923 0.525095 0.151474 0.202995 0.529335 0.159763 0.228048 0.526983 0.15705 0.254397 0.534 0.152123 0.280079 0.531978 0.159255 0.303152 0.526264 0.156019 0.332648 0.530135 0.152707 0.35451 0.533858 0.157284 0.378897 0.529365 0.159595 0.404024 0.534923 0.153896 0.431478 0.53005 0.157962 0.455626 0.533817 0.150438 0.480281 0.527361 0.182747 0.00355177 0.525091 0.182089 0.0319314 0.526563 0.178659 0.0502309 0.52881 0.177409 0.0817607 0.533808 0.177455 0.105167 0.529551 0.176027 0.134344 0.533611 0.177733 0.155962 0.530421 0.181512 0.180994 0.532825 0.176723 0.202518 0.526371 0.178634 0.225756 0.532693 0.178838 0.259902 0.526866 0.183518 0.28102 0.525706 0.175655 0.306894 0.530745 0.180675 0.32551 0.534075 0.179012 0.351101 0.533287 0.176022 0.381827 0.526549 0.182186 0.400127 0.525003 0.18372 0.427619 0.525243 0.184159 0.451355 0.527997 0.184184 0.478343 0.532033 0.206864 0.00706137 0.525523 0.207804 0.0274592 0.529812 0.204966 0.0555608 0.52615 0.205721 0.0836979 0.530603 0.204136 0.107682 0.527881 0.203217 0.128327 0.525003 0.206369 0.155702 0.529556 0.208856 0.176785 0.527866 0.20057 0.208729 0.533292 0.20152 0.229997 0.525583 0.201514 0.252327 0.533377 0.208694 0.281747 0.52593 0.206129 0.308503 0.526118 0.204552 0.327894 0.529143 0.203513 0.352311 0.526213 0.201875 0.375197 0.528721 0.207133 0.400399 0.531579 0.208981 0.429573 0.525199 0.206767 0.454601 0.526528 0.206815 0.482671 0.529036 0.233414 0.000447542 0.526456 0.234673 0.0295854 0.525814 0.22727 0.0567226 0.532689 0.234008 0.0760806 0.527255 0.234884 0.100457 0.532277 0.227296 0.134691 0.531384 0.225771 0.154114 0.52659 0.232735 0.177706 0.534572 0.227328 0.200735 0.527735 0.227944 0.226807 0.533553 0.227889 0.254311 0.527614 0.233404 0.276465 0.533449 0.234589 0.308251 0.534547 0.226963 0.329809 0.530738 0.234751 0.355768 0.528248 0.228433 0.37878 0.525336 0.230873 0.406688 0.532194 0.226527 0.429707 0.526848 0.231531 0.451312 0.529398 0.229966 0.478103 0.525841 0.257077 0.00213022 0.532429 0.250844 0.0330447 0.53286 0.258626 0.0533259 0.529391 0.254307 0.0750112 0.533172 0.253638 0.101196 0.533753 0.252332 0.130468 0.525164 0.257302 0.15845 0.528558 0.251379 0.178434 0.529429 0.252267 0.209781 0.530477 0.257773 0.226823 0.526012 0.258489 0.255522 0.531759 0.256879 0.279902 0.530994 0.25337 0.309093 0.52618 0.255858 0.334354 0.525931 0.257251 0.350639 0.525397 0.255511 0.377395 0.533685 0.256201 0.408475 0.52956 0.254743 0.425412 0.527222 0.257213 0.456338 0.527332 0.259499 0.476124 0.527486 0.276573 0.000248507 0.533317 0.278128 0.0275206 0.532352 0.276952 0.0591512 0.52733 0.277524 0.0771692 0.531567 0.276998 0.10222 0.527118 0.281085 0.128957 0.532434 0.281177 0.157197 0.529697 0.283916 0.184813 0.532132 0.281569 0.206902 0.531178 0.277543 0.232594 0.534423 0.277143 0.250295 0.526477 0.280887 0.282472 0.527585 0.280875 0.309468 0.531821 0.282273 0.33033 0.532203 0.284381 0.352547 0.53016 0.281241 0.379737 0.528956 0.279385 0.406756 0.527835 0.278746 0.428827 0.526314 0.28314 0.456957 0.525455 0.28448 0.47786 0.529827 0.300582 0.00878407 0.531642 0.30484 0.0286433 0.530507 0.302982 0.0537444 0.534878 0.30373 0.0835822 0.532814 0.300754 0.109469 0.531574 0.305567 0.125498 0.525171 0.308434 0.156353 0.527472 0.303195 0.17592 0.527361 0.300707 0.200904 0.526879 0.307473 0.231841 0.52853 0.30342 0.259209 0.53172 0.303804 0.283926 0.532183 0.301346 0.302526 0.530747 0.304771 0.334934 0.525512 0.302034 0.359034 0.526001 0.306826 0.375995 0.530691 0.302348 0.403759 0.525583 0.301594 0.430239 0.531711 0.300917 0.451619 0.533923 0.309024 0.480227 0.527226 0.327123 0.00298217 0.530189 0.326684 0.025231 0.529687 0.330671 0.0505557 0.529393 0.326623 0.0773025 0.528802 0.333693 0.102416 0.52826 0.327689 0.133258 0.526998 0.327186 0.155392 0.531936 0.331103 0.18036 0.531406 0.327414 0.204273 0.528913 0.3328 0.232364 0.528381 0.327006 0.258313 0.526821 0.330654 0.282992 0.531977 0.332902 0.308438 0.531516 0.331246 0.332968 0.528096 0.326628 0.35985 0.525057 0.3337 0.375852 0.529109 0.329989 0.402188 0.53208 0.334194 0.426933 0.525757 0.328411 0.451753 0.533886 0.333074 0.482786 0.534804 0.350646 0.00289177 0.526597 0.359519 0.0303203 0.529482 0.354263 0.0552994 0.530694 0.352499 0.0790616 0.530617 0.359949 0.101181 0.526985 0.357977 0.132288 0.531777 0.357799 0.154651 0.529157 0.358532 0.181386 0.5288 0.351376 0.20415 0.528443 0.357293 0.233146 0.525187 0.35595 0.250819 0.531147 0.352092 0.283031 0.529345 0.352822 0.301447 0.52795 0.352118 0.328203 0.529207 0.35829 0.353258 0.526708 0.351299 0.377806 0.528714 0.350213 0.405782 0.534037 0.351546 0.429171 0.525744 0.357261 0.453743 0.525924 0.35233 0.475718 0.534476 0.376686 0.00866726 0.52863 0.37675 0.0276428 0.52511 0.38225 0.0539126 0.534531 0.384192 0.0772081 0.530931 0.375979 0.101068 0.525393 0.381266 0.13238 0.526258 0.38161 0.151749 0.531533 0.382211 0.184665 0.525114 0.378558 0.20196 0.532274 0.382539 0.233479 0.526024 0.382467 0.258262 0.534394 0.375098 0.281678 0.52641 0.380535 0.309222 0.532527 0.379754 0.327068 0.530339 0.38088 0.359047 0.530688 0.381861 0.37602 0.529665 0.381617 0.401402 0.530966 0.378863 0.427233 0.532631 0.383824 0.453376 0.525362 0.383776 0.479659 0.534349 0.405149 0.00402269 0.525219 0.407484 0.0309114 0.528589 0.407928 0.0584607 0.528692 0.407966 0.083055 0.526486 0.402105 0.1045 0.53377 0.406381 0.133134 0.53355 0.407935 0.157955 0.530807 0.408698 0.175495 0.526133 0.406095 0.20846 0.529245 0.404042 0.226273 0.52648 0.409851 0.251149 0.526571 0.404884 0.284038 0.528838 0.407974 0.30121 0.531093 0.400118 0.327885 0.528833 0.400698 0.354362 0.527233 0.402983 0.380703 0.532247 0.409125 0.409026 0.53309 0.402791 0.427784 0.534775 0.408904 0.455389 0.528314 0.407812 0.47745 0.52888 0.430476 0.00948363 0.528322 0.425405 0.0295774 0.531955 0.428682 0.0595042 0.532728 0.434876 0.0771931 0.52761 0.425831 0.100529 0.534905 0.431714 0.134051 0.526192 0.434373 0.155169 0.533194 0.425664 0.184113 0.531803 0.425001 0.207903 0.52607 0.429923 0.228208 0.534425 0.434629 0.255474 0.533235 0.431945 0.279697 0.53326 0.434219 0.306718 0.52667 0.428407 0.332021 0.534678 0.433533 0.358398 0.533827 0.429802 0.380787 0.53227 0.433484 0.408728 0.526983 0.425693 0.425176 0.529702 0.430207 0.453541 0.526189 0.43392 0.48015 0.534466 0.456037 0.00364248 0.533175 0.451357 0.0341958 0.528586 0.458162 0.0532268 0.526139 0.455452 0.078267 0.5311 0.457672 0.103657 0.530213 0.455151 0.129998 0.532843 0.455363 0.15236 0.533329 0.457175 0.180672 0.527208 0.454627 0.201441 0.527468 0.453554 0.231489 0.526108 0.454743 0.259419 0.528924 0.455481 0.278882 0.530536 0.450418 0.305711 0.534159 0.455388 0.329299 0.529218 0.458379 0.353292 0.527716 0.454023 0.384175 0.526479 0.45414 0.40626 0.531968 0.453002 0.428021 0.530591 0.456733 0.459777 0.528102 0.456264 0.483613 0.531607 0.476059 0.00400617 0.526082 0.479336 0.0258695 0.529757 0.483812 0.0523905 0.534137 0.477414 0.0823773 0.531107 0.484051 0.107166 0.525365 0.478001 0.128627 0.534819 0.475798 0.154428 0.534162 0.482614 0.177818 0.526868 0.480638 0.203692 0.533615 0.481974 0.234282 0.531477 0.477122 0.250025 0.527159 0.476174 0.28027 0.530672 0.481878 0.303291 0.52982 0.482961 0.325248 0.526984 0.476025 0.358238 0.530571 0.483157 0.376764 0.526338 0.483516 0.401033 0.528023 0.478725 0.43414 0.530534 0.479753 0.455143 0.527117 0.482726 0.483722 0.53073 0.506953 0.00396806 0.530798 0.508174 0.0347158 0.526903 0.505552 0.0587893 0.526177 0.504175 0.077749 0.533618 0.503516 0.103506 0.532394 0.50186 0.132635 0.530711 0.506933 0.151933 0.531306 0.504155 0.183024 0.532788 0.508959 0.209399 0.53313 0.504254 0.227709 0.529049 0.503995 0.259184 0.525837 0.508687 0.284738 0.53307 0.505359 0.306864 0.529626 0.509215 0.334546 0.53312 0.502284 0.352108 0.525521 0.508659 0.379713 0.525499 0.501752 0.401268 0.5316 0.503986 0.426883 0.529175 0.50641 0.456493 0.530567 0.503587 0.48389 0.527489 0.530658 0.0053932 0.525284 0.532546 0.0302706 0.532948 0.533716 0.0561247 0.529936 0.527713 0.0769972 0.53316 0.525737 0.101862 0.532476 0.530996 0.131315 0.533705 0.52529 0.152875 0.531644 0.53078 0.184335 0.528951 0.532227 0.208032 0.528977 0.530692 0.230826 0.526299 0.533783 0.251499 0.533099 0.529831 0.275511 0.526965 0.530744 0.306552 0.533987 0.526025 0.334505 0.525628 0.531368 0.352299 0.532006 0.52865 0.377919 0.533476 0.525821 0.401674 0.534947 0.530146 0.433086 0.534615 0.529924 0.455858 0.528513 0.529503 0.475986 0.5335 0.550966 0.00795182 0.528762 0.552681 0.0341903 0.527434 0.556619 0.0514068 0.533282 0.552723 0.0844947 0.532743 0.559801 0.103804 0.528066 0.552805 0.128741 0.525796 0.555609 0.156572 0.529947 0.554752 0.178733 0.533662 0.554083 0.200782 0.529676 0.555264 0.234193 0.530542 0.558996 0.258327 0.527638 0.559142 0.275536 0.533444 0.550474 0.309626 0.525318 0.557535 0.32668 0.529877 0.552506 0.357674 0.534183 0.558886 0.376513 0.533636 0.553195 0.404296 0.532446 0.556723 0.431433 0.53185 0.552942 0.458235 0.530418 0.556479 0.478622 0.526835 0.584059 0.00406253 0.525216 0.58368 0.0305736 0.533178 0.581289 0.0583561 0.533453 0.581237 0.082605 0.527606 0.582598 0.104195 0.533648 0.58492 0.125051 0.531346 0.582734 0.159094 0.532313 0.580529 0.178418 0.527746 0.575422 0.206384 0.528406 0.580902 0.23153 0.52796 0.584646 0.255568 0.534271 0.578164 0.279418 0.529714 0.57684 0.308181 0.531569 0.58018 0.329408 0.530243 0.577091 0.355369 0.528492 0.583037 0.376366 0.533693 0.583751 0.404813 0.531901 0.575626 0.429672 0.525016 0.575438 0.456186 0.53476 0.584239 0.475085 0.530207 0.601764 0.00872569 0.529518 0.601637 0.028369 0.526805 0.608371 0.0515471 0.526703 0.603765 0.081329 0.530783 0.606426 0.100212 0.527102 0.609972 0.128412 0.534153 0.605792 0.15186 0.52894 0.60434 0.175922 0.527894 0.606512 0.203257 0.526851 0.604044 0.225017 0.526931 0.607943 0.250992 0.526959 0.606026 0.276851 0.533877 0.604266 0.301922 0.527823 0.604326 0.331084 0.532275 0.609142 0.35194 0.53367 0.600435 0.381577 0.527878 0.601642 0.405734 0.532031 0.605615 0.428444 0.528622 0.606064 0.459099 0.531876 0.603631 0.477598 0.533895 0.629241 0.00496839 0.529114 0.634683 0.0313882 0.53069 0.631962 0.0569028 0.532205 0.626992 0.0770237 0.530056 0.630627 0.104606 0.534576 0.631009 0.127865 0.53376 0.629758 0.152791 0.529195 0.632273 0.177855 0.525286 0.629585 0.206154 0.530618 0.630559 0.226846 0.532378 0.625056 0.256382 0.527435 0.626405 0.281359 0.530101 0.630062 0.300279 0.528656 0.631853 0.333707 0.527042 0.625777 0.35119 0.526362 0.630584 0.378735 0.531496 0.632016 0.407117 0.529655 0.633582 0.428158 0.526248 0.630821 0.452278 0.527979 0.625342 0.4776 0.530551 0.652886 0.000635237 0.530529 0.655094 0.0257625 0.530589 0.652805 0.0547642 0.531368 0.650549 0.0779179 0.525773 0.656479 0.105103 0.529044 0.650965 0.126967 0.528925 0.652962 0.1585 0.531349 0.654742 0.180319 0.525234 0.658894 0.205624 0.534792 0.657141 0.229825 0.533553 0.657495 0.25241 0.53428 0.65356 0.276413 0.528832 0.655477 0.307105 0.532984 0.651712 0.330074 0.525243 0.658521 0.354631 0.530319 0.65011 0.379076 0.525509 0.652642 0.401756 0.530707 0.654045 0.426481 0.52909 0.657888 0.457782 0.530083 0.652183 0.480879 0.533783 0.682655 0.000110034 0.531037 0.68188 0.0296804 0.526512 0.684017 0.0512533 0.53158 0.679918 0.0751484 0.531829 0.680673 0.104199 0.52955 0.684965 0.128977 0.526246 0.675091 0.157695 0.525572 0.678717 0.177559 0.532285 0.683816 0.209453 0.525433 0.678276 0.226629 0.530665 0.677796 0.259799 0.529573 0.678237 0.27703 0.528729 0.677747 0.308308 0.527055 0.677896 0.331206 0.531705 0.67989 0.356676 0.531091 0.679782 0.384837 0.534159 0.683006 0.408732 0.53049 0.682763 0.427001 0.530619 0.684442 0.459606 0.533167 0.67826 0.476584 0.525735 0.700413 0.00372965 0.531629 0.70795 0.0319597 0.525947 0.700205 0.0526204 0.531899 0.706549 0.0757988 0.525594 0.706731 0.108387 0.525033 0.701834 0.131733 0.526633 0.704312 0.159358 0.528588 0.706063 0.182607 0.530691 0.705906 0.202687 0.528976 0.709598 0.227606 0.530089 0.707955 0.259124 0.533892 0.702749 0.280014 0.528763 0.700666 0.305871 0.529122 0.708239 0.334157 0.52502 0.701894 0.359268 0.528612 0.708854 0.381827 0.525755 0.709894 0.409737 0.527267 0.700016 0.432327 0.533689 0.705008 0.450329 0.534265 0.702366 0.484999 0.527915 0.730537 0.00835795 0.52535 0.728328 0.0315565 0.529407 0.725741 0.0542708 0.52567 0.734044 0.0791033 0.529681 0.728099 0.103152 0.533842 0.731101 0.132949 0.529886 0.727427 0.154114 0.529512 0.725819 0.182536 0.53407 0.732034 0.209141 0.532315 0.730287 0.233936 0.531692 0.73026 0.25702 0.525002 0.734722 0.278759 0.533139 0.734239 0.308128 0.534756 0.732878 0.334222 0.532619 0.725213 0.359094 0.530905 0.727562 0.383146 0.532102 0.728778 0.401269 0.533654 0.729678 0.426274 0.528048 0.730584 0.452753 0.533474 0.7286 0.477583 0.551586 0.00513469 0.00924776 0.557266 0.00580874 0.0302051 0.556161 0.00615019 0.050251 0.556272 0.00432078 0.0835934 0.555366 0.00245885 0.106545 0.555272 0.00958128 0.129517 0.55566 0.0061187 0.156041 0.555084 0.00110938 0.177061 0.557677 0.00308039 0.204074 0.557518 0.0040391 0.228099 0.554918 0.0072071 0.257062 0.551511 0.00167486 0.2773 0.559121 0.00527152 0.304765 0.55104 0.0032598 0.330495 0.553449 0.00620971 0.352028 0.550495 0.00917537 0.377909 0.552362 0.000885484 0.401324 0.551358 0.000781743 0.432549 0.551335 0.000268429 0.456684 0.55585 0.00237905 0.476006 0.554717 0.0267529 0.00707596 0.553373 0.0325303 0.031829 0.554763 0.0276056 0.0521266 0.555227 0.0252143 0.0838623 0.550673 0.02612 0.105913 0.555238 0.0309378 0.130996 0.551831 0.0306591 0.153188 0.55133 0.0326558 0.182882 0.551982 0.0250166 0.208403 0.559608 0.0250043 0.229687 0.551945 0.0281087 0.256103 0.559355 0.0310932 0.284045 0.554706 0.0282503 0.30911 0.556724 0.034605 0.334207 0.55495 0.0271209 0.351927 0.559443 0.0327604 0.382655 0.557348 0.0312226 0.407302 0.558093 0.0330173 0.429996 0.55179 0.0289328 0.459188 0.550694 0.0341943 0.484038 0.552572 0.0503926 0.00525137 0.550035 0.0533812 0.0305604 0.552379 0.0554894 0.0558849 0.556215 0.0503459 0.0830098 0.550098 0.0558919 0.107051 0.559333 0.0564129 0.13241 0.557213 0.0598599 0.154228 0.553553 0.052301 0.184991 0.55795 0.0564131 0.206788 0.55144 0.0593074 0.228072 0.552108 0.0553651 0.258353 0.551331 0.0595826 0.283798 0.55858 0.0563934 0.309533 0.557348 0.0503786 0.325928 0.553938 0.0562989 0.354951 0.556167 0.0507917 0.377762 0.550507 0.0590297 0.407013 0.552173 0.0589257 0.434485 0.553857 0.0545499 0.45342 0.557154 0.0505969 0.476154 0.552464 0.0815755 0.00334802 0.554736 0.0832541 0.0306477 0.551665 0.0807964 0.0571775 0.551863 0.0795835 0.0752366 0.557711 0.0754439 0.104555 0.557748 0.0822365 0.133012 0.554911 0.0799369 0.152615 0.554646 0.0825931 0.182742 0.550971 0.0821073 0.209658 0.556639 0.0776378 0.226599 0.552078 0.0834331 0.250238 0.556939 0.0784079 0.280437 0.558548 0.0838355 0.305618 0.557305 0.0783469 0.32955 0.554681 0.0758932 0.352571 0.550356 0.0800087 0.382833 0.555556 0.0786164 0.403562 0.558965 0.0762161 0.433055 0.556062 0.0808639 0.451005 0.557056 0.0823334 0.481083 0.559305 0.101798 0.00910596 0.55471 0.101286 0.0263125 0.558749 0.106969 0.0547977 0.551658 0.109228 0.0818762 0.558825 0.104175 0.105229 0.55486 0.10152 0.130086 0.559764 0.102517 0.157732 0.553717 0.104966 0.18263 0.550923 0.106475 0.206016 0.554726 0.100849 0.226943 0.55769 0.100993 0.254575 0.556439 0.103739 0.284606 0.559347 0.103086 0.303674 0.550417 0.106289 0.328418 0.553543 0.104665 0.350423 0.553137 0.104464 0.381705 0.556467 0.100772 0.408019 0.552575 0.109376 0.429169 0.55276 0.106281 0.451543 0.558374 0.103167 0.483555 0.554696 0.129258 0.00688548 0.556134 0.133272 0.0339073 0.559461 0.133723 0.0586289 0.551449 0.132397 0.080109 0.555979 0.130583 0.100784 0.553658 0.126162 0.133038 0.559482 0.132787 0.159885 0.559765 0.126352 0.181093 0.552344 0.134739 0.205037 0.55451 0.130152 0.229136 0.55179 0.129181 0.256448 0.552757 0.127553 0.276327 0.554378 0.134463 0.30549 0.552088 0.126578 0.325672 0.551309 0.131564 0.350942 0.550763 0.130583 0.38282 0.550046 0.12717 0.408705 0.556551 0.131805 0.426721 0.55095 0.129117 0.458071 0.550126 0.131083 0.476617 0.556173 0.154593 0.00699539 0.552017 0.158175 0.027314 0.558868 0.154901 0.055765 0.556503 0.153158 0.0832707 0.554033 0.154117 0.101437 0.550727 0.158331 0.127028 0.554535 0.15716 0.155471 0.553998 0.155796 0.181373 0.55855 0.156294 0.209392 0.554482 0.150793 0.228209 0.555813 0.150869 0.259465 0.552401 0.157818 0.281457 0.554712 0.152262 0.305558 0.557169 0.153193 0.326938 0.559366 0.159162 0.352761 0.557971 0.151098 0.384493 0.551842 0.157595 0.409077 0.554702 0.157255 0.431596 0.550024 0.155936 0.45324 0.55244 0.152013 0.48379 0.555646 0.175521 0.0018964 0.557542 0.176415 0.0262673 0.556127 0.175675 0.0593915 0.558201 0.180865 0.0839592 0.553564 0.180662 0.102103 0.550415 0.175374 0.134708 0.558753 0.177524 0.15369 0.555856 0.181676 0.175377 0.552316 0.178085 0.208064 0.557147 0.183045 0.234308 0.552838 0.182567 0.256654 0.559948 0.184579 0.280754 0.559045 0.183031 0.306354 0.550856 0.1809 0.327289 0.558448 0.175171 0.35243 0.554129 0.178039 0.377548 0.552633 0.18128 0.406048 0.550349 0.18209 0.430753 0.555353 0.181825 0.458969 0.553024 0.177253 0.480597 0.558203 0.203746 8.06183e-05 0.558569 0.209594 0.0256579 0.554205 0.209093 0.0521203 0.552597 0.20105 0.0798225 0.551276 0.207006 0.108228 0.55338 0.205768 0.133027 0.552185 0.207723 0.15313 0.557032 0.201062 0.178761 0.554247 0.207519 0.206514 0.552114 0.204867 0.229793 0.550282 0.208553 0.257792 0.559401 0.206218 0.278264 0.554749 0.205253 0.301428 0.550021 0.203269 0.325717 0.557251 0.200091 0.355037 0.557393 0.201186 0.382477 0.556001 0.204058 0.409627 0.557171 0.200354 0.431341 0.551737 0.204493 0.454855 0.558757 0.201106 0.479371 0.553567 0.233948 0.00134025 0.555495 0.232263 0.02742 0.557633 0.231471 0.0545391 0.554152 0.225123 0.0780832 0.55111 0.229626 0.10867 0.556333 0.23444 0.131775 0.558102 0.231348 0.157285 0.555815 0.234332 0.179297 0.552146 0.225989 0.204515 0.552192 0.225098 0.225877 0.554099 0.228326 0.254733 0.557553 0.228703 0.281193 0.552724 0.233759 0.308824 0.554166 0.226039 0.332193 0.552989 0.231892 0.351383 0.556529 0.233713 0.382252 0.555874 0.225953 0.402238 0.557593 0.230053 0.433764 0.550013 0.23344 0.452525 0.557253 0.22816 0.47768 0.557168 0.250885 0.00227441 0.553776 0.252969 0.0294852 0.558761 0.251313 0.0519897 0.558087 0.256194 0.0794548 0.558378 0.257471 0.109847 0.559909 0.251096 0.134938 0.559306 0.256876 0.152385 0.555873 0.255968 0.181282 0.554813 0.254328 0.208081 0.554298 0.255908 0.227731 0.552786 0.252497 0.259286 0.553519 0.250351 0.280955 0.55029 0.25172 0.3065 0.550575 0.252387 0.334296 0.556397 0.2567 0.355019 0.552397 0.258641 0.380013 0.550673 0.253863 0.40055 0.555263 0.257339 0.428778 0.551354 0.258756 0.455209 0.558064 0.257655 0.477023 0.553705 0.282889 0.00407225 0.554745 0.281226 0.0337434 0.550416 0.282824 0.0572161 0.556595 0.282423 0.0784441 0.555313 0.277608 0.10427 0.553825 0.275924 0.13198 0.559123 0.282855 0.15911 0.554853 0.281194 0.183624 0.554207 0.277831 0.209666 0.551455 0.275333 0.23196 0.552643 0.277971 0.258302 0.552334 0.277675 0.27621 0.550358 0.284587 0.309686 0.55427 0.282512 0.330043 0.555919 0.282357 0.352559 0.553288 0.280321 0.377771 0.554604 0.279347 0.40424 0.554008 0.282142 0.42689 0.559927 0.283851 0.452495 0.555212 0.279851 0.484802 0.556302 0.30081 0.00590213 0.556123 0.309427 0.025815 0.558838 0.305782 0.0531875 0.55534 0.301586 0.0832272 0.551549 0.305811 0.100077 0.558493 0.309386 0.126959 0.557794 0.308128 0.155048 0.558476 0.304219 0.1849 0.55342 0.309129 0.207491 0.557472 0.309798 0.233702 0.555937 0.302111 0.257089 0.552712 0.300461 0.275169 0.55789 0.303955 0.302196 0.554155 0.30741 0.330098 0.555144 0.308702 0.353304 0.550649 0.302942 0.375086 0.559359 0.306509 0.409307 0.553917 0.303532 0.429167 0.558336 0.302539 0.458684 0.551501 0.309618 0.484007 0.559993 0.331733 0.00339847 0.553539 0.329611 0.0286515 0.557812 0.331251 0.0517197 0.558701 0.331773 0.0798248 0.55947 0.331657 0.107715 0.55072 0.33099 0.130474 0.550223 0.328265 0.155944 0.550617 0.328057 0.183554 0.550321 0.334233 0.209397 0.553027 0.327959 0.233154 0.550777 0.333747 0.252557 0.551918 0.329451 0.280084 0.558078 0.331197 0.308281 0.55638 0.334671 0.328507 0.551179 0.331372 0.357633 0.555765 0.331015 0.377183 0.551325 0.332519 0.409441 0.555447 0.330855 0.428863 0.558591 0.332958 0.451246 0.553917 0.330895 0.483861 0.550752 0.358755 0.00875569 0.559945 0.358029 0.0330612 0.552301 0.352611 0.0575975 0.552293 0.358461 0.0775049 0.557123 0.35324 0.108995 0.556032 0.350555 0.12572 0.550483 0.352643 0.157423 0.553451 0.355522 0.176261 0.559168 0.35845 0.202157 0.551839 0.359161 0.227543 0.556882 0.350026 0.25925 0.557644 0.350052 0.280419 0.554591 0.355638 0.304341 0.550922 0.357036 0.325152 0.550716 0.351255 0.359353 0.558818 0.354362 0.379556 0.551369 0.357322 0.407963 0.558985 0.350326 0.428468 0.557839 0.351008 0.451181 0.557523 0.351615 0.483144 0.555293 0.377382 0.00451836 0.553876 0.379541 0.0258281 0.556087 0.383572 0.0507963 0.555758 0.379281 0.0828682 0.551142 0.380255 0.10976 0.559341 0.382203 0.131565 0.557762 0.377364 0.152278 0.559175 0.3827 0.178033 0.55417 0.381373 0.203698 0.551672 0.376045 0.225093 0.55093 0.375664 0.255467 0.554755 0.384333 0.278803 0.550825 0.375844 0.305243 0.55882 0.38442 0.332603 0.553238 0.378498 0.351923 0.550447 0.376305 0.379627 0.550118 0.377303 0.40699 0.551982 0.379652 0.433343 0.555661 0.381058 0.454975 0.550624 0.378267 0.480459 0.552143 0.40756 0.00922101 0.55481 0.406216 0.0283602 0.553165 0.406696 0.0576533 0.554457 0.40572 0.0814451 0.557444 0.404335 0.10476 0.55924 0.409281 0.125135 0.557771 0.407853 0.151575 0.555163 0.408326 0.17677 0.559636 0.401355 0.20218 0.555211 0.403077 0.231359 0.550954 0.400877 0.259231 0.556839 0.409395 0.281553 0.555771 0.404819 0.304813 0.554187 0.400153 0.333221 0.554207 0.40185 0.357184 0.552492 0.408803 0.377136 0.550909 0.403594 0.406083 0.550041 0.40189 0.431126 0.552905 0.40594 0.454263 0.555565 0.407911 0.481864 0.559188 0.428402 0.00822371 0.55136 0.432335 0.0300841 0.551339 0.434523 0.0549433 0.556461 0.428371 0.0776927 0.557279 0.431888 0.105381 0.554237 0.428531 0.134852 0.559646 0.434101 0.156442 0.552365 0.427519 0.175546 0.553415 0.43129 0.203273 0.555864 0.43308 0.225859 0.553118 0.426868 0.25909 0.550243 0.427872 0.281428 0.557409 0.426021 0.304691 0.555278 0.427875 0.331324 0.554263 0.432235 0.353061 0.559666 0.432226 0.379694 0.552347 0.431774 0.402759 0.55623 0.425864 0.431761 0.559644 0.425781 0.453105 0.559866 0.430149 0.482667 0.555276 0.451715 0.00527111 0.557722 0.451961 0.0339901 0.55973 0.450384 0.0537472 0.557875 0.456176 0.0767337 0.552685 0.45039 0.102973 0.554059 0.455865 0.134328 0.557164 0.458699 0.154977 0.556023 0.455613 0.18314 0.552181 0.456473 0.200305 0.558609 0.457482 0.231891 0.559372 0.451113 0.257319 0.554618 0.45997 0.277656 0.557336 0.451307 0.307828 0.553554 0.458154 0.327901 0.556517 0.454757 0.351993 0.55204 0.451468 0.382037 0.550659 0.459184 0.404017 0.553034 0.453903 0.431061 0.557429 0.452356 0.45834 0.550276 0.453703 0.483389 0.554974 0.475684 0.00905323 0.554776 0.476105 0.030823 0.550187 0.481637 0.0556976 0.55032 0.483993 0.0760629 0.555877 0.483519 0.101909 0.557926 0.478323 0.133742 0.552323 0.477863 0.159291 0.552886 0.475781 0.177122 0.554525 0.477821 0.202886 0.553729 0.483419 0.234839 0.558527 0.476695 0.250635 0.555012 0.481917 0.27751 0.557612 0.479471 0.308828 0.554272 0.482703 0.328506 0.552898 0.47915 0.358291 0.550048 0.480072 0.380452 0.559397 0.47596 0.405531 0.55003 0.478767 0.4271 0.553228 0.483762 0.45808 0.55496 0.479761 0.478899 0.55306 0.502638 0.00816549 0.553696 0.508255 0.0309926 0.557839 0.506191 0.0560587 0.556054 0.509615 0.0796453 0.55704 0.501553 0.103557 0.559028 0.507343 0.130041 0.550868 0.503267 0.158305 0.558292 0.503016 0.181606 0.557544 0.507022 0.209318 0.5543 0.50069 0.23258 0.550524 0.500795 0.259176 0.558963 0.502987 0.275195 0.554847 0.503719 0.301579 0.559765 0.508575 0.326236 0.551294 0.50305 0.35192 0.558199 0.502263 0.383271 0.556758 0.509227 0.401493 0.553274 0.503559 0.432839 0.555841 0.501795 0.45983 0.554749 0.504443 0.478192 0.553545 0.534433 0.0078695 0.55317 0.528902 0.0330329 0.554686 0.525345 0.0525182 0.558614 0.52571 0.0845743 0.550382 0.530023 0.100151 0.55965 0.5252 0.131051 0.55197 0.534756 0.154995 0.554043 0.531232 0.180761 0.554035 0.534788 0.209106 0.55628 0.53289 0.225497 0.557482 0.531996 0.259217 0.558598 0.529203 0.280186 0.552811 0.533214 0.307709 0.550012 0.527726 0.332511 0.558744 0.530979 0.350474 0.551284 0.530863 0.375046 0.55314 0.528374 0.408123 0.558129 0.529969 0.425784 0.550795 0.529981 0.45879 0.555238 0.534548 0.48137 0.552354 0.556677 0.00268293 0.552773 0.55911 0.0266409 0.555063 0.556023 0.0573873 0.556334 0.552737 0.075818 0.557914 0.554454 0.10345 0.551263 0.557811 0.132623 0.555657 0.552758 0.152789 0.556861 0.550934 0.178817 0.555525 0.556336 0.201214 0.552895 0.551769 0.226239 0.55083 0.55692 0.250549 0.554817 0.552359 0.275901 0.557036 0.551242 0.306498 0.559542 0.556755 0.326099 0.557254 0.559837 0.355532 0.551238 0.550366 0.383832 0.558024 0.555607 0.401796 0.558626 0.558013 0.43038 0.554101 0.554582 0.459672 0.555529 0.557314 0.481079 0.551387 0.583063 0.00153004 0.558055 0.577819 0.0303385 0.555409 0.582305 0.0539357 0.557305 0.581381 0.083975 0.558667 0.580618 0.108172 0.554959 0.58444 0.127662 0.551515 0.583698 0.155618 0.55134 0.582385 0.182118 0.554146 0.584693 0.204969 0.55461 0.579578 0.230075 0.550753 0.575793 0.250005 0.553706 0.575824 0.275667 0.556869 0.575183 0.30666 0.555098 0.583717 0.331548 0.559671 0.576663 0.35475 0.554018 0.576534 0.375923 0.553694 0.576519 0.404305 0.554258 0.581692 0.426394 0.555496 0.579557 0.451276 0.553155 0.57615 0.481135 0.558313 0.604122 0.00263858 0.551219 0.608274 0.0256055 0.556864 0.605718 0.0551082 0.553291 0.602023 0.0756453 0.550239 0.605558 0.102624 0.558827 0.605007 0.132172 0.554287 0.601002 0.153712 0.558302 0.605634 0.180356 0.557162 0.609085 0.206611 0.55926 0.606169 0.233393 0.558568 0.608615 0.258364 0.556397 0.605702 0.280861 0.559377 0.609596 0.302849 0.552319 0.600001 0.328934 0.554477 0.609027 0.355424 0.552333 0.600945 0.38038 0.556582 0.602523 0.403124 0.559364 0.609828 0.425652 0.556181 0.602634 0.451492 0.556105 0.609389 0.483591 0.552822 0.629952 0.00596699 0.55043 0.631895 0.0339579 0.556057 0.632105 0.0581425 0.556085 0.630798 0.0846035 0.552432 0.632895 0.105868 0.553929 0.633497 0.126295 0.556889 0.62978 0.151774 0.553007 0.630392 0.184093 0.558225 0.632515 0.209902 0.558179 0.631937 0.229506 0.559754 0.62793 0.256646 0.552929 0.625855 0.283134 0.557771 0.627549 0.309518 0.558947 0.625047 0.328453 0.553008 0.632391 0.35807 0.551501 0.634532 0.381943 0.55637 0.631786 0.400299 0.55392 0.625321 0.425082 0.55708 0.625869 0.454254 0.553038 0.628714 0.482453 0.558285 0.654036 0.00329764 0.551553 0.657289 0.0325714 0.551896 0.658238 0.0503404 0.55855 0.657494 0.0828858 0.555097 0.658688 0.101221 0.550636 0.656749 0.128511 0.558735 0.651277 0.155148 0.55003 0.658601 0.178058 0.550925 0.655861 0.202868 0.55732 0.653128 0.230186 0.552376 0.657512 0.258121 0.559819 0.656009 0.280431 0.555085 0.659864 0.302747 0.556535 0.654973 0.332531 0.557451 0.651979 0.351597 0.555243 0.65347 0.37767 0.559851 0.659848 0.405934 0.554886 0.652775 0.429583 0.550739 0.655782 0.457055 0.559336 0.653252 0.483034 0.553013 0.679088 0.00356981 0.556515 0.682579 0.0303988 0.558319 0.676935 0.0561377 0.558085 0.677339 0.0849599 0.555354 0.679414 0.102948 0.553061 0.679797 0.133113 0.558634 0.67723 0.150694 0.556193 0.68286 0.18301 0.552805 0.68025 0.20005 0.554024 0.676989 0.226716 0.553736 0.675234 0.255486 0.55511 0.68317 0.284527 0.552624 0.681124 0.30747 0.556462 0.676041 0.330339 0.556608 0.680996 0.352544 0.555225 0.683235 0.382127 0.555424 0.681152 0.408685 0.559274 0.67794 0.428421 0.551423 0.675136 0.454317 0.555485 0.676092 0.4781 0.558128 0.705858 0.00109666 0.550122 0.708388 0.0266483 0.55071 0.705601 0.0508249 0.55789 0.703202 0.0809746 0.552228 0.708069 0.106662 0.554614 0.705783 0.125458 0.552433 0.707881 0.153098 0.556607 0.708622 0.179593 0.551996 0.700893 0.205429 0.551362 0.702952 0.233264 0.555417 0.7018 0.255557 0.554803 0.701719 0.284878 0.556051 0.702659 0.305051 0.55116 0.703641 0.331231 0.55176 0.70945 0.354951 0.550545 0.708407 0.382751 0.555068 0.700033 0.408275 0.558446 0.709629 0.431876 0.554113 0.708204 0.454434 0.552598 0.703128 0.478183 0.558091 0.73044 0.00128295 0.552512 0.729874 0.0294141 0.556996 0.730335 0.0519169 0.559909 0.725234 0.0796597 0.559218 0.725763 0.103223 0.55025 0.731902 0.125328 0.558605 0.726332 0.150476 0.55486 0.72542 0.181244 0.557195 0.733508 0.201821 0.551536 0.725409 0.22615 0.550577 0.728692 0.251156 0.550563 0.727316 0.281386 0.559267 0.730113 0.300808 0.559309 0.733528 0.334949 0.551537 0.732543 0.350692 0.55998 0.732155 0.380395 0.551459 0.73471 0.402383 0.55483 0.728251 0.425007 0.558339 0.731029 0.456411 0.558408 0.732436 0.483406 0.579096 0.00463213 0.00581986 0.577186 5.96263e-05 0.0251913 0.575118 0.00853576 0.0508555 0.582723 0.00406648 0.0805934 0.584913 0.00582345 0.101724 0.581486 0.00499645 0.1264 0.576567 0.00676448 0.159567 0.583129 0.00718887 0.178358 0.578648 0.00445851 0.20877 0.581098 0.00926681 0.227287 0.581392 0.00977921 0.257128 0.576294 0.00389464 0.283198 0.579768 0.00866743 0.305819 0.583281 0.00628874 0.333408 0.576327 0.00862516 0.351343 0.5785 0.00748868 0.376929 0.582181 0.00206482 0.400213 0.584202 0.00525089 0.425569 0.583192 0.00730903 0.450532 0.57749 0.00274459 0.477656 0.576962 0.0303308 0.0022859 0.582325 0.0250389 0.0321028 0.577657 0.0349345 0.0590132 0.576378 0.0305707 0.0844307 0.581599 0.032717 0.104479 0.578806 0.0264819 0.133025 0.581094 0.0329027 0.155239 0.579387 0.0281971 0.175536 0.584768 0.0319248 0.200125 0.579533 0.0327398 0.226633 0.577181 0.0323456 0.252615 0.580091 0.0329905 0.275755 0.581721 0.0261406 0.304425 0.58213 0.0281286 0.326484 0.579994 0.0305997 0.356314 0.583729 0.033496 0.378493 0.57691 0.0294099 0.407209 0.583133 0.025438 0.427355 0.580902 0.0335215 0.45938 0.582351 0.0255762 0.475049 0.577194 0.0522474 0.00105177 0.577947 0.0588564 0.026611 0.579461 0.0539593 0.0568895 0.57886 0.0584436 0.0783159 0.578021 0.0551375 0.107563 0.580571 0.0568301 0.134299 0.579268 0.0536497 0.159039 0.583241 0.0549348 0.178446 0.583164 0.0530836 0.201239 0.584684 0.0517747 0.233585 0.584723 0.0582999 0.25878 0.578692 0.0561211 0.277236 0.575309 0.0597762 0.302238 0.57992 0.0515475 0.328186 0.584169 0.0525023 0.350274 0.57516 0.0519393 0.378692 0.584039 0.053406 0.403494 0.581168 0.0534005 0.426016 0.580036 0.0554557 0.45427 0.583718 0.0502221 0.480089 0.581102 0.0812484 0.00151501 0.577944 0.0819765 0.0271014 0.57725 0.0800101 0.0509448 0.583886 0.0756471 0.079423 0.581469 0.0784729 0.105378 0.580275 0.0833875 0.128213 0.57825 0.0753131 0.150213 0.581604 0.075651 0.176843 0.576327 0.080209 0.202356 0.576542 0.0769306 0.228694 0.580854 0.0830182 0.251659 0.583123 0.0762979 0.284189 0.579246 0.0797568 0.307273 0.583273 0.0813292 0.329459 0.584691 0.0835569 0.358682 0.577309 0.0800868 0.384306 0.575143 0.0754335 0.403312 0.582263 0.0751524 0.42557 0.582028 0.0840251 0.454008 0.579061 0.078439 0.48112 0.57901 0.102341 0.00533864 0.583561 0.1002 0.028404 0.579886 0.103661 0.0511847 0.581067 0.101447 0.0795925 0.575746 0.107258 0.10964 0.584998 0.100964 0.125177 0.576305 0.109278 0.151108 0.581553 0.104801 0.178366 0.576584 0.101759 0.201839 0.577923 0.108933 0.226095 0.584337 0.103192 0.255933 0.576844 0.105615 0.275125 0.581876 0.102928 0.304079 0.581815 0.103425 0.325144 0.58147 0.103611 0.359208 0.57955 0.103315 0.378085 0.584342 0.107964 0.403597 0.576223 0.104276 0.432489 0.579364 0.104993 0.459822 0.584159 0.105394 0.475581 0.583718 0.129361 0.00361702 0.5802 0.129066 0.0305529 0.582205 0.127852 0.0548168 0.580384 0.128623 0.0778871 0.580303 0.129986 0.109063 0.576731 0.134342 0.133583 0.581066 0.13269 0.158603 0.582321 0.125471 0.181276 0.575824 0.126417 0.209684 0.581659 0.131688 0.231143 0.584352 0.131517 0.252309 0.575406 0.125567 0.278153 0.579604 0.126647 0.301387 0.583956 0.133339 0.32949 0.579619 0.127376 0.350277 0.578255 0.129136 0.379957 0.583171 0.132297 0.40845 0.581865 0.125808 0.433881 0.582584 0.133839 0.452026 0.578312 0.130477 0.481654 0.578681 0.151432 0.00904001 0.579022 0.153575 0.0279708 0.583591 0.153055 0.0579681 0.577148 0.15569 0.0799725 0.584788 0.152158 0.109374 0.577075 0.153106 0.129663 0.577512 0.159903 0.158766 0.577261 0.156599 0.178291 0.576824 0.153316 0.206771 0.579165 0.157277 0.232977 0.57845 0.152713 0.259416 0.579146 0.152837 0.282124 0.577284 0.151411 0.303799 0.578617 0.15371 0.332283 0.577703 0.155918 0.35501 0.577628 0.152701 0.382637 0.583792 0.154956 0.408228 0.58297 0.151786 0.433828 0.580286 0.159506 0.450849 0.575261 0.150893 0.475353 0.578263 0.181539 0.0011917 0.57773 0.181312 0.0329744 0.578636 0.183224 0.0524509 0.578848 0.1838 0.0752579 0.575921 0.175207 0.107208 0.581371 0.177466 0.127579 0.57966 0.178682 0.153269 0.581498 0.1754 0.182676 0.5819 0.178531 0.208686 0.581929 0.182957 0.225078 0.584503 0.184754 0.259263 0.576425 0.180015 0.280507 0.576542 0.184429 0.307375 0.581383 0.178086 0.325049 0.576685 0.175397 0.359153 0.582065 0.181636 0.378458 0.575968 0.177222 0.409747 0.581436 0.175858 0.430464 0.57967 0.175162 0.459095 0.57869 0.178832 0.48367 0.579646 0.203475 0.000338311 0.579796 0.203576 0.0298158 0.576743 0.206539 0.057238 0.580212 0.203633 0.0762851 0.581309 0.209023 0.100201 0.580031 0.204847 0.13242 0.58484 0.206765 0.151055 0.57736 0.20753 0.17892 0.578478 0.200624 0.209209 0.577857 0.204863 0.229259 0.576766 0.201128 0.252391 0.578981 0.201623 0.278223 0.581091 0.205573 0.304441 0.578849 0.204957 0.328682 0.578304 0.207855 0.357859 0.581354 0.20613 0.376606 0.583267 0.200015 0.409185 0.575152 0.204998 0.427438 0.584725 0.208669 0.456615 0.583735 0.200299 0.481301 0.578269 0.231889 0.00138592 0.584382 0.229215 0.0332612 0.575203 0.23274 0.0519796 0.584646 0.232094 0.0838471 0.584403 0.230417 0.108331 0.581547 0.229977 0.13126 0.579857 0.228173 0.155943 0.583908 0.225967 0.175487 0.575439 0.229554 0.208725 0.582996 0.232045 0.226538 0.577486 0.234146 0.256907 0.581228 0.225989 0.276366 0.579251 0.2343 0.30049 0.580086 0.226533 0.333955 0.578225 0.232244 0.356407 0.582887 0.233526 0.379293 0.581679 0.228367 0.405135 0.583838 0.22862 0.429935 0.584145 0.233293 0.452666 0.583459 0.227562 0.481789 0.582322 0.259345 0.00829784 0.581306 0.257739 0.0334347 0.577507 0.255836 0.0503325 0.582419 0.259238 0.0845096 0.57612 0.253749 0.103468 0.579991 0.250164 0.134221 0.575441 0.251119 0.151409 0.584227 0.254041 0.175495 0.57972 0.257546 0.207394 0.580313 0.250513 0.227529 0.576331 0.257856 0.252016 0.581239 0.252537 0.280283 0.577808 0.256932 0.303439 0.584127 0.254571 0.329161 0.576125 0.25566 0.350285 0.578437 0.257076 0.379265 0.579729 0.256077 0.403327 0.582422 0.257073 0.433548 0.57714 0.250853 0.459306 0.576978 0.254484 0.47898 0.575902 0.280712 4.4212e-05 0.579798 0.275715 0.0268734 0.58114 0.28065 0.0548467 0.575378 0.276484 0.0806986 0.581959 0.279012 0.10017 0.5809 0.284979 0.125909 0.577382 0.279496 0.154772 0.575621 0.282151 0.181909 0.583459 0.27516 0.203826 0.582749 0.283559 0.231786 0.582974 0.27881 0.257011 0.580453 0.27794 0.277431 0.577782 0.279864 0.304612 0.581701 0.277758 0.332866 0.581855 0.282465 0.356968 0.583986 0.276958 0.382021 0.581918 0.280314 0.401201 0.578421 0.275587 0.426595 0.582689 0.275209 0.457036 0.5827 0.282875 0.484754 0.584754 0.306723 0.00122604 0.584704 0.305079 0.0315965 0.579232 0.309742 0.0588706 0.577794 0.306027 0.0832634 0.581985 0.306353 0.107308 0.58192 0.308162 0.126058 0.576697 0.301384 0.15908 0.583333 0.30218 0.178195 0.577363 0.304495 0.20369 0.579141 0.308142 0.230031 0.578182 0.308062 0.256757 0.580976 0.308742 0.282167 0.579839 0.306266 0.300308 0.575382 0.304195 0.328816 0.578598 0.309676 0.354759 0.580315 0.300849 0.384051 0.575814 0.307443 0.403082 0.582467 0.307332 0.433916 0.58309 0.306525 0.45871 0.580851 0.301104 0.476646 0.575548 0.32638 0.00470101 0.584673 0.326017 0.0317451 0.57982 0.334437 0.0585912 0.584715 0.333366 0.0807052 0.583565 0.329853 0.107826 0.576929 0.325238 0.128621 0.576144 0.332037 0.157538 0.578735 0.327994 0.17983 0.583191 0.326501 0.202067 0.582851 0.329442 0.231605 0.584391 0.332388 0.253407 0.57621 0.329574 0.281864 0.583076 0.333185 0.300534 0.576534 0.328901 0.327162 0.58151 0.33034 0.358173 0.576406 0.328205 0.382974 0.579516 0.328647 0.400627 0.581739 0.331915 0.43489 0.582006 0.333489 0.452716 0.577712 0.332795 0.479565 0.577624 0.359588 0.0048889 0.579017 0.355592 0.0288146 0.578459 0.357948 0.0545782 0.575689 0.354024 0.0812189 0.579937 0.351598 0.100274 0.575304 0.354139 0.128959 0.579512 0.356187 0.150527 0.582605 0.356298 0.179982 0.575142 0.35407 0.200716 0.582712 0.356533 0.226523 0.583639 0.353269 0.255869 0.58111 0.356259 0.279093 0.577403 0.357636 0.307054 0.579324 0.350793 0.325527 0.58412 0.356865 0.357435 0.582569 0.350605 0.378655 0.577815 0.355986 0.407657 0.577007 0.357825 0.426105 0.578215 0.356617 0.455679 0.584325 0.351903 0.479223 0.580998 0.382914 0.000717092 0.581071 0.376895 0.031637 0.582001 0.377679 0.0546732 0.579319 0.377813 0.0838107 0.578644 0.384839 0.107276 0.577247 0.377299 0.125937 0.583281 0.378681 0.152852 0.583564 0.375108 0.177731 0.57725 0.383939 0.200691 0.580387 0.381906 0.233141 0.583496 0.379823 0.255483 0.579988 0.379922 0.276922 0.583345 0.375579 0.300033 0.580595 0.380244 0.332479 0.57686 0.375279 0.355246 0.581977 0.382829 0.383247 0.577837 0.384621 0.409786 0.579636 0.379013 0.431581 0.580883 0.375479 0.455473 0.583096 0.381173 0.478565 0.582792 0.40983 0.00736828 0.578421 0.400804 0.0345774 0.577887 0.407988 0.051858 0.575177 0.409351 0.0833362 0.582834 0.40121 0.101097 0.584562 0.401948 0.127196 0.576577 0.401464 0.150621 0.580308 0.409616 0.175 0.577754 0.40155 0.20012 0.583314 0.409428 0.228001 0.576828 0.405395 0.251564 0.580774 0.40895 0.282487 0.578778 0.406319 0.301899 0.581067 0.406401 0.328493 0.57875 0.400656 0.35328 0.578307 0.40051 0.376666 0.583887 0.403702 0.402675 0.584747 0.404994 0.431144 0.579044 0.403297 0.459559 0.581025 0.408204 0.479538 0.575624 0.432981 0.00881807 0.584312 0.432392 0.0325231 0.577665 0.428909 0.0529105 0.575209 0.428751 0.0840401 0.58086 0.426498 0.107619 0.576813 0.433173 0.133225 0.575663 0.434258 0.155046 0.584045 0.428861 0.179642 0.576191 0.425404 0.20132 0.576437 0.428036 0.229614 0.57948 0.425142 0.259343 0.576959 0.42927 0.27896 0.575077 0.42774 0.308179 0.584274 0.430222 0.327631 0.577547 0.427365 0.355883 0.579264 0.42881 0.376484 0.575863 0.429755 0.405398 0.577454 0.428826 0.431873 0.584985 0.425744 0.452114 0.581131 0.428324 0.480604 0.580763 0.456598 0.00552323 0.579427 0.458716 0.0253704 0.580946 0.452992 0.0577457 0.579002 0.45748 0.0845545 0.579201 0.455867 0.10645 0.580604 0.45999 0.126257 0.578568 0.451334 0.159862 0.578435 0.454721 0.184888 0.579117 0.454028 0.204878 0.581976 0.458721 0.226762 0.578658 0.45468 0.256901 0.580151 0.452987 0.278781 0.583685 0.459311 0.309603 0.578661 0.452557 0.330451 0.577768 0.454213 0.358892 0.576078 0.45837 0.383999 0.579935 0.450735 0.408541 0.57726 0.459614 0.433685 0.577889 0.456076 0.456885 0.577998 0.456525 0.479769 0.579058 0.47772 0.00718523 0.581213 0.481558 0.0331588 0.576017 0.483632 0.0598503 0.58191 0.479053 0.0792015 0.584416 0.477293 0.105174 0.584724 0.484119 0.129765 0.575607 0.475076 0.150323 0.57824 0.484856 0.177294 0.583664 0.475663 0.20669 0.575062 0.47726 0.22972 0.580569 0.483168 0.255924 0.583992 0.48102 0.284917 0.581917 0.480642 0.30324 0.578552 0.477193 0.331927 0.583911 0.480001 0.35769 0.583157 0.484291 0.382501 0.576839 0.483709 0.40843 0.580296 0.482491 0.429198 0.584263 0.475165 0.455193 0.576859 0.483918 0.47536 0.577141 0.501735 0.00212835 0.575842 0.503165 0.0336741 0.581955 0.508718 0.0551141 0.583779 0.504321 0.0805362 0.578687 0.509577 0.100051 0.583556 0.50094 0.130296 0.583534 0.50125 0.153627 0.583379 0.507607 0.176741 0.577647 0.50062 0.207356 0.584538 0.504951 0.2284 0.577042 0.501183 0.253296 0.581696 0.505941 0.280016 0.5756 0.502504 0.305338 0.577334 0.502884 0.330533 0.576086 0.505436 0.353794 0.579585 0.507743 0.378221 0.584657 0.502646 0.406313 0.583721 0.504297 0.429824 0.575881 0.503842 0.459258 0.581901 0.503854 0.483901 0.581563 0.531099 0.00707917 0.57996 0.530982 0.0262214 0.579821 0.53231 0.0575865 0.579358 0.525392 0.0833964 0.582951 0.532879 0.108224 0.582567 0.531835 0.126464 0.577496 0.530746 0.152004 0.581734 0.533027 0.177892 0.581657 0.530044 0.208385 0.575142 0.529708 0.229721 0.579966 0.527133 0.259221 0.576217 0.527647 0.28114 0.578064 0.525108 0.306446 0.581501 0.53021 0.327738 0.581986 0.531109 0.352193 0.580629 0.528552 0.377471 0.575251 0.527019 0.403589 0.582601 0.532566 0.425439 0.583888 0.532551 0.457388 0.580824 0.532006 0.480103 0.581202 0.552054 0.0028112 0.57972 0.557761 0.0309581 0.584229 0.55129 0.0546482 0.580891 0.558452 0.0831882 0.582115 0.55822 0.108841 0.582449 0.551548 0.126864 0.582854 0.557848 0.152746 0.575079 0.555303 0.175094 0.584114 0.554601 0.20255 0.577301 0.554069 0.231064 0.578701 0.55095 0.25094 0.581271 0.551924 0.275647 0.575116 0.558688 0.303619 0.57548 0.553219 0.333755 0.576859 0.551379 0.35896 0.576893 0.558193 0.375904 0.577688 0.554967 0.404289 0.577652 0.557305 0.428456 0.580845 0.553271 0.457367 0.582488 0.555568 0.476978 0.578323 0.577567 0.00774412 0.579548 0.580536 0.0313466 0.582818 0.579948 0.052163 0.583882 0.583577 0.0799531 0.579287 0.581799 0.102814 0.576991 0.576514 0.134766 0.581892 0.577749 0.151453 0.577255 0.577369 0.184349 0.579107 0.578129 0.203968 0.578611 0.578771 0.232108 0.57768 0.58048 0.255104 0.579315 0.581932 0.279331 0.584706 0.584169 0.302625 0.581922 0.579939 0.331799 0.577663 0.581093 0.357537 0.576653 0.582651 0.383262 0.577378 0.583154 0.40395 0.575862 0.583028 0.425213 0.576509 0.584336 0.458312 0.579657 0.583288 0.480511 0.58128 0.601374 0.00789726 0.584012 0.608112 0.0252185 0.577727 0.60226 0.0592051 0.579949 0.602807 0.0840108 0.584254 0.607878 0.105282 0.575674 0.603497 0.129444 0.581276 0.603077 0.151348 0.580041 0.604538 0.18108 0.578898 0.606329 0.209145 0.581535 0.607733 0.231815 0.579292 0.601554 0.253145 0.576128 0.60643 0.283748 0.576342 0.605343 0.30935 0.58082 0.60303 0.331737 0.578933 0.606348 0.352673 0.581868 0.601917 0.382398 0.575704 0.607114 0.40887 0.583211 0.604398 0.42742 0.58042 0.606096 0.455545 0.582536 0.608426 0.479138 0.580392 0.62746 0.00404615 0.581568 0.634717 0.0260021 0.577419 0.6329 0.0567665 0.575609 0.626813 0.0800622 0.584873 0.634029 0.107528 0.576959 0.628893 0.131679 0.579552 0.63473 0.158381 0.579091 0.625909 0.180483 0.576313 0.629608 0.201837 0.581888 0.63491 0.225248 0.575469 0.634521 0.251958 0.581621 0.628596 0.275481 0.578249 0.628147 0.3075 0.578206 0.633152 0.325973 0.582906 0.634682 0.358838 0.575488 0.629995 0.377641 0.584495 0.631962 0.402303 0.575016 0.634625 0.43431 0.576515 0.634823 0.451937 0.582537 0.625841 0.481692 0.58161 0.657001 0.00619431 0.577331 0.653069 0.0318177 0.578066 0.654953 0.0507113 0.5838 0.655177 0.0808334 0.576005 0.657083 0.109118 0.576135 0.659411 0.130757 0.578605 0.650494 0.158082 0.582413 0.657234 0.184887 0.575094 0.653589 0.200112 0.584261 0.656067 0.229025 0.581064 0.657517 0.251918 0.579697 0.652723 0.275718 0.581532 0.650605 0.304447 0.583808 0.654613 0.327711 0.581027 0.651693 0.358652 0.580411 0.655515 0.379791 0.58069 0.65138 0.409557 0.580121 0.656799 0.425808 0.57537 0.65196 0.457214 0.582352 0.656417 0.481817 0.576975 0.67502 0.00894074 0.584193 0.684491 0.0344477 0.58435 0.67575 0.0544131 0.580343 0.677087 0.0822507 0.576832 0.680416 0.108715 0.581167 0.684457 0.126859 0.58455 0.682133 0.159878 0.575818 0.678109 0.176493 0.580235 0.675763 0.202912 0.582823 0.679887 0.228702 0.583739 0.684319 0.25856 0.581824 0.676373 0.275961 0.577868 0.678019 0.30808 0.578983 0.680006 0.330194 0.575874 0.684869 0.350455 0.583369 0.676838 0.383255 0.575162 0.678847 0.403836 0.577989 0.675019 0.428577 0.57578 0.683479 0.451709 0.584216 0.682638 0.48231 0.583701 0.706857 0.00561007 0.583124 0.706138 0.0292867 0.57984 0.705601 0.0547158 0.58088 0.703746 0.0831912 0.584683 0.700346 0.107111 0.57743 0.709617 0.131916 0.576582 0.709129 0.150371 0.580874 0.707843 0.182808 0.582013 0.703422 0.209619 0.578034 0.706941 0.233641 0.580505 0.704067 0.256662 0.575922 0.705726 0.281759 0.575862 0.709988 0.300954 0.576102 0.707836 0.326849 0.583687 0.706273 0.359632 0.578468 0.707093 0.382466 0.58236 0.706127 0.400203 0.575106 0.703158 0.428558 0.583559 0.709965 0.455867 0.57571 0.708549 0.480059 0.575099 0.728987 0.00244563 0.5774 0.725423 0.0290247 0.576213 0.725475 0.0577746 0.584382 0.733463 0.079867 0.577932 0.734347 0.106999 0.58331 0.732471 0.133378 0.583373 0.733645 0.15149 0.579479 0.725331 0.180033 0.581816 0.726146 0.200086 0.583124 0.73122 0.228811 0.576782 0.732921 0.252238 0.584346 0.726359 0.275427 0.577021 0.727797 0.309217 0.577712 0.732495 0.326932 0.576693 0.730459 0.358133 0.579247 0.728359 0.376794 0.583752 0.730957 0.408726 0.578933 0.733449 0.425389 0.575086 0.727089 0.452731 0.582513 0.732185 0.483616 0.607118 0.00463654 0.0092951 0.609635 0.00211039 0.0293374 0.604297 0.00449722 0.0511293 0.602208 0.00680539 0.0784857 0.601538 0.00821093 0.105446 0.606886 0.00527126 0.13433 0.60142 0.00502266 0.158342 0.60227 0.00781083 0.177546 0.605188 0.00659816 0.204024 0.609995 0.00439106 0.230622 0.607764 0.00787981 0.251051 0.603271 0.00938712 0.284713 0.609374 0.00523522 0.309847 0.609923 0.00780925 0.330752 0.604195 0.00467771 0.351264 0.602983 0.00132859 0.375427 0.607923 0.00533658 0.406767 0.60865 0.00669124 0.42893 0.606521 0.000687155 0.459055 0.607409 0.00489561 0.478643 0.602535 0.0254758 0.00931207 0.604921 0.0272421 0.0316991 0.608302 0.0316781 0.050167 0.605807 0.025706 0.0779816 0.605776 0.0259835 0.101302 0.607249 0.0304653 0.134263 0.600543 0.0339914 0.156206 0.608627 0.0344595 0.175409 0.600979 0.0306754 0.209037 0.601081 0.0256847 0.228773 0.601231 0.0291404 0.251424 0.600533 0.0292827 0.283827 0.604199 0.0316414 0.301921 0.601242 0.0250793 0.327889 0.606459 0.0342182 0.351168 0.60541 0.0276048 0.380362 0.601584 0.0333515 0.408109 0.609026 0.0283315 0.425437 0.601127 0.0329946 0.45615 0.605185 0.027572 0.476287 0.604898 0.0512324 0.00573987 0.608262 0.0512517 0.0326084 0.609415 0.056308 0.0515226 0.601486 0.054526 0.0751407 0.609497 0.0516824 0.10654 0.603031 0.0518265 0.132727 0.605334 0.0524192 0.155559 0.600844 0.0535377 0.17995 0.608916 0.0527375 0.201647 0.60511 0.0508236 0.22511 0.60981 0.0558097 0.254613 0.60571 0.0595351 0.277322 0.601684 0.050247 0.304008 0.604288 0.0509747 0.332325 0.609636 0.0556454 0.356333 0.605777 0.0584027 0.378551 0.602083 0.0594158 0.40598 0.604015 0.0553132 0.428618 0.602952 0.0511423 0.454055 0.605698 0.0503888 0.480681 0.603097 0.0773411 0.00904294 0.606992 0.0777571 0.0271514 0.607176 0.0804579 0.0515363 0.605574 0.0771328 0.0775237 0.606799 0.078091 0.107909 0.605727 0.0761455 0.131906 0.605871 0.0768028 0.158051 0.601683 0.075121 0.177802 0.602866 0.0828009 0.207648 0.606455 0.0781458 0.226746 0.607027 0.076229 0.25122 0.604494 0.0820025 0.284703 0.607191 0.0760205 0.307532 0.607329 0.0845791 0.329624 0.603796 0.0762753 0.355303 0.604796 0.0821167 0.384889 0.609629 0.0844219 0.402698 0.604165 0.0834327 0.427758 0.600572 0.0752699 0.450082 0.602707 0.0791051 0.481274 0.607476 0.101235 0.00692828 0.606413 0.104162 0.0286299 0.609385 0.104813 0.053643 0.607645 0.105463 0.0802277 0.601478 0.106143 0.100047 0.609003 0.103699 0.128873 0.609192 0.105668 0.157498 0.604499 0.106314 0.182112 0.605824 0.100539 0.208853 0.600441 0.103055 0.225755 0.600438 0.107119 0.255567 0.604708 0.106103 0.282732 0.607057 0.107193 0.304075 0.606454 0.101643 0.334415 0.609331 0.105605 0.357868 0.603869 0.107028 0.380114 0.608201 0.104613 0.40934 0.600792 0.102746 0.434068 0.60677 0.108244 0.453538 0.605591 0.104977 0.475479 0.600122 0.133365 0.00429869 0.608775 0.130272 0.0317652 0.600734 0.125394 0.0565298 0.606185 0.12706 0.0830753 0.608475 0.130831 0.109315 0.605012 0.133555 0.127292 0.60397 0.127738 0.156379 0.605716 0.127229 0.181002 0.600292 0.129471 0.205879 0.608615 0.127925 0.234497 0.600563 0.128207 0.258504 0.607826 0.132221 0.283972 0.602639 0.131534 0.306271 0.608348 0.125911 0.325558 0.601045 0.127283 0.356126 0.606404 0.126562 0.380454 0.60786 0.130883 0.40014 0.606555 0.133772 0.425926 0.600243 0.12855 0.454011 0.609847 0.126549 0.476339 0.60621 0.153557 0.000261596 0.606551 0.154596 0.0301443 0.600408 0.155597 0.0525265 0.60974 0.151098 0.0774796 0.600329 0.151835 0.106759 0.609472 0.156253 0.12641 0.60315 0.159159 0.156086 0.606811 0.155724 0.175647 0.604758 0.153787 0.208807 0.606344 0.151139 0.230241 0.602314 0.151493 0.259833 0.602844 0.156507 0.279885 0.602872 0.158865 0.306973 0.601451 0.155975 0.332376 0.609766 0.151971 0.351687 0.607965 0.156957 0.375244 0.608151 0.150492 0.402872 0.607759 0.152123 0.431122 0.601662 0.151401 0.457684 0.601486 0.153785 0.477767 0.604072 0.184442 0.00706206 0.602305 0.178298 0.0256065 0.602589 0.182295 0.0584328 0.604874 0.180612 0.0815374 0.609343 0.180981 0.100804 0.603826 0.178527 0.130393 0.603123 0.18162 0.154732 0.604114 0.177844 0.175888 0.602188 0.178407 0.203426 0.600444 0.179252 0.227801 0.60595 0.177162 0.25454 0.607549 0.179952 0.277632 0.608531 0.183027 0.309041 0.607761 0.183184 0.327176 0.600738 0.177897 0.350195 0.60451 0.179094 0.380557 0.605765 0.178363 0.404856 0.607033 0.176509 0.427875 0.605929 0.184192 0.459689 0.609943 0.178745 0.477619 0.603161 0.205156 0.0075153 0.605974 0.205164 0.0282569 0.600533 0.200729 0.0547425 0.604326 0.20835 0.0772486 0.605649 0.204645 0.104047 0.606979 0.204952 0.127816 0.60282 0.20604 0.159324 0.605447 0.201965 0.17512 0.603594 0.209656 0.203984 0.606754 0.201233 0.225305 0.609273 0.204005 0.258014 0.605773 0.205745 0.284558 0.603402 0.200877 0.309054 0.609303 0.203802 0.327225 0.602993 0.207713 0.35441 0.603754 0.202537 0.379549 0.603295 0.206722 0.40498 0.609528 0.200637 0.428304 0.609253 0.202292 0.455695 0.60964 0.201925 0.482929 0.603757 0.232464 0.00620033 0.604965 0.23447 0.0269226 0.608633 0.234658 0.0528729 0.602079 0.231973 0.0818613 0.601118 0.228755 0.101783 0.608024 0.230186 0.132284 0.607969 0.228139 0.154329 0.60471 0.234483 0.182833 0.606043 0.232654 0.208992 0.604108 0.225127 0.228171 0.602618 0.228605 0.257799 0.606354 0.23482 0.278243 0.601669 0.230284 0.307648 0.602537 0.23206 0.327361 0.602657 0.225345 0.357027 0.601419 0.234547 0.376796 0.601544 0.234004 0.402775 0.607037 0.234504 0.426192 0.601798 0.230671 0.451055 0.601494 0.231103 0.475418 0.607829 0.256463 0.00757791 0.601861 0.251898 0.0259164 0.603026 0.252098 0.0579029 0.605402 0.252554 0.0827851 0.600408 0.252247 0.102281 0.604051 0.253687 0.134709 0.60511 0.257142 0.159238 0.604335 0.257412 0.18481 0.607296 0.251404 0.204192 0.604168 0.259523 0.225528 0.601022 0.259317 0.257391 0.605171 0.258506 0.283052 0.603127 0.259628 0.308769 0.608472 0.25055 0.33224 0.603301 0.252783 0.351789 0.608208 0.255919 0.384848 0.602485 0.251967 0.402616 0.608331 0.254186 0.431978 0.604154 0.259375 0.454644 0.60288 0.255519 0.482536 0.607669 0.280829 0.00526867 0.604869 0.282082 0.0308024 0.60463 0.284305 0.058762 0.604495 0.276446 0.0812037 0.600267 0.282851 0.103979 0.60283 0.280366 0.133316 0.608836 0.278674 0.156945 0.607606 0.276154 0.184371 0.60408 0.276536 0.202343 0.600603 0.275144 0.233548 0.605598 0.282908 0.258013 0.603731 0.279706 0.283632 0.604898 0.284987 0.300876 0.608427 0.279078 0.333532 0.602248 0.284278 0.359434 0.607129 0.27885 0.37694 0.603826 0.282614 0.402967 0.603332 0.281152 0.429674 0.607719 0.284493 0.458621 0.607096 0.275072 0.47546 0.603999 0.30641 0.00914455 0.60334 0.308174 0.0329375 0.605496 0.304968 0.0516018 0.606597 0.301855 0.0772245 0.601283 0.306714 0.10344 0.600112 0.304868 0.132679 0.600449 0.309297 0.159003 0.608225 0.303597 0.177566 0.603673 0.302782 0.208475 0.605564 0.3034 0.231799 0.607323 0.300696 0.259734 0.600836 0.304289 0.278974 0.609562 0.308867 0.307751 0.605144 0.301785 0.331718 0.606673 0.309247 0.354584 0.605404 0.306597 0.382888 0.60478 0.308781 0.409753 0.60638 0.304884 0.434177 0.606237 0.306431 0.457 0.601366 0.303359 0.481398 0.602399 0.33338 0.00554086 0.603061 0.327665 0.0254538 0.600648 0.326367 0.0509483 0.605219 0.326881 0.0802159 0.607931 0.331468 0.109557 0.601933 0.331383 0.130261 0.609777 0.326915 0.155001 0.609454 0.33342 0.184746 0.607995 0.325961 0.208692 0.602953 0.327484 0.233319 0.608988 0.328997 0.25413 0.600687 0.333664 0.277074 0.600118 0.332641 0.301984 0.605987 0.326916 0.32777 0.602637 0.327711 0.352486 0.602677 0.326309 0.383177 0.609607 0.32762 0.408648 0.605039 0.334461 0.43063 0.6031 0.329483 0.450173 0.609814 0.328326 0.481073 0.600794 0.353961 0.0048993 0.606693 0.356413 0.0261788 0.600589 0.350316 0.0584213 0.604618 0.358417 0.0828655 0.601199 0.35539 0.105846 0.607091 0.352937 0.13141 0.606572 0.357312 0.151176 0.604351 0.356551 0.177087 0.60993 0.356417 0.201819 0.603322 0.358714 0.231726 0.604521 0.354885 0.25787 0.605365 0.358099 0.284209 0.604774 0.359394 0.304088 0.601275 0.351642 0.326147 0.603221 0.355423 0.354903 0.603296 0.352843 0.38401 0.604904 0.359342 0.401921 0.605496 0.351592 0.426195 0.608513 0.358349 0.450008 0.604475 0.352425 0.481414 0.608914 0.381179 0.00633378 0.604162 0.381393 0.0310408 0.600941 0.37964 0.0594864 0.6014 0.38117 0.0797229 0.607087 0.383827 0.109186 0.607452 0.384604 0.12852 0.607602 0.378359 0.158232 0.607991 0.384772 0.180524 0.605676 0.379576 0.204209 0.603104 0.383383 0.230487 0.603114 0.381775 0.253987 0.609605 0.380346 0.276168 0.602756 0.380957 0.307324 0.603337 0.381239 0.325221 0.604884 0.384633 0.352561 0.606991 0.384546 0.378264 0.605335 0.382614 0.40156 0.601099 0.376092 0.425797 0.603116 0.381052 0.459422 0.601889 0.379862 0.478182 0.606339 0.401734 1.94263e-05 0.606391 0.407362 0.0335767 0.60371 0.403761 0.0545479 0.606926 0.402201 0.0787102 0.605443 0.407236 0.102573 0.609639 0.400382 0.130208 0.608483 0.406009 0.153453 0.601574 0.401129 0.179882 0.607098 0.403052 0.206066 0.605225 0.407999 0.230264 0.609092 0.401563 0.254528 0.604773 0.406876 0.282988 0.602371 0.402726 0.307391 0.604791 0.403544 0.33334 0.609421 0.409952 0.355164 0.609559 0.400568 0.381026 0.603152 0.407388 0.406202 0.604145 0.404392 0.427997 0.602919 0.403468 0.450419 0.604686 0.405229 0.478734 0.609874 0.433809 0.00270963 0.60602 0.428997 0.0272103 0.601749 0.432467 0.0543161 0.607379 0.4296 0.0827719 0.609201 0.433247 0.102884 0.601664 0.427695 0.133393 0.60033 0.42827 0.156291 0.602478 0.428567 0.181087 0.600293 0.425458 0.20164 0.609921 0.428911 0.2309 0.6069 0.427276 0.252072 0.609327 0.432459 0.277799 0.606469 0.428585 0.305843 0.602003 0.434917 0.330933 0.609433 0.433862 0.357665 0.604794 0.431015 0.375404 0.609753 0.428362 0.406038 0.602112 0.427322 0.431773 0.60132 0.428007 0.457522 0.600115 0.430709 0.483601 0.605247 0.455655 0.00507059 0.60843 0.451573 0.0305123 0.603697 0.450334 0.0588902 0.600347 0.459368 0.0838056 0.609144 0.451942 0.10569 0.600117 0.451283 0.128012 0.604566 0.458146 0.156318 0.607819 0.453622 0.180168 0.601922 0.452823 0.208862 0.604806 0.454069 0.22955 0.605551 0.455944 0.256064 0.608008 0.455263 0.282955 0.607834 0.45062 0.302028 0.608009 0.457227 0.329941 0.609487 0.459546 0.354436 0.605948 0.455904 0.38404 0.603625 0.451955 0.407726 0.602653 0.4581 0.42513 0.601237 0.450083 0.456722 0.609935 0.457607 0.479246 0.606827 0.483822 0.00959474 0.600028 0.484108 0.0263034 0.609181 0.48049 0.0514487 0.603613 0.483875 0.0799491 0.604524 0.478989 0.10533 0.605451 0.477295 0.127021 0.600553 0.484421 0.155013 0.607188 0.477567 0.179767 0.602635 0.480935 0.20619 0.605222 0.483871 0.226289 0.603905 0.479251 0.253764 0.608754 0.477959 0.278932 0.608393 0.480212 0.305184 0.609675 0.478942 0.328789 0.601004 0.478864 0.358225 0.600579 0.480076 0.383052 0.60227 0.484039 0.40248 0.608463 0.478557 0.428635 0.606795 0.47761 0.459024 0.606385 0.478306 0.477901 0.602356 0.502647 0.00653632 0.603365 0.505961 0.0314492 0.603843 0.507884 0.05737 0.600627 0.509581 0.0826887 0.603689 0.503881 0.103988 0.604915 0.50174 0.125646 0.600108 0.500608 0.15832 0.601687 0.501495 0.180196 0.6067 0.503765 0.204831 0.607698 0.506294 0.232359 0.609742 0.505155 0.251079 0.607665 0.503778 0.279379 0.604548 0.508029 0.302605 0.60519 0.500096 0.332407 0.60374 0.504192 0.352978 0.606631 0.509617 0.379634 0.60528 0.508466 0.401238 0.605188 0.507559 0.431184 0.604182 0.505184 0.458268 0.606145 0.50221 0.482974 0.605399 0.529652 0.00124666 0.607048 0.533694 0.0298066 0.605037 0.526122 0.0575173 0.608597 0.53354 0.0819654 0.600419 0.52997 0.102026 0.609691 0.526196 0.134849 0.607257 0.529876 0.150949 0.606245 0.527004 0.175416 0.601388 0.530741 0.203898 0.606517 0.531035 0.234331 0.603299 0.527752 0.259849 0.60014 0.529862 0.277518 0.605197 0.525863 0.302055 0.608414 0.526416 0.334436 0.609349 0.525645 0.354164 0.600745 0.530552 0.378317 0.609153 0.52994 0.40415 0.606807 0.532085 0.427808 0.60403 0.529884 0.454005 0.600738 0.530968 0.477098 0.604786 0.55612 0.00733601 0.604572 0.559979 0.0289324 0.603076 0.557766 0.0552819 0.606067 0.554683 0.0751831 0.602926 0.552424 0.108311 0.607287 0.559329 0.126467 0.606755 0.555013 0.15954 0.603914 0.559663 0.17994 0.606872 0.556396 0.209467 0.601225 0.553304 0.233634 0.603072 0.553209 0.259897 0.603147 0.55779 0.277976 0.60584 0.557482 0.304416 0.60718 0.553445 0.330812 0.606232 0.55075 0.355329 0.606681 0.554139 0.377663 0.609296 0.552333 0.40979 0.602136 0.558512 0.434867 0.608476 0.556203 0.456196 0.606559 0.555495 0.480854 0.609146 0.583599 0.00583119 0.609378 0.581414 0.025839 0.600039 0.580193 0.0537333 0.60269 0.580488 0.0818026 0.600855 0.578974 0.103383 0.604271 0.579845 0.127441 0.608544 0.582139 0.154035 0.608996 0.576745 0.180483 0.603416 0.580943 0.207727 0.609048 0.580773 0.225151 0.605904 0.584369 0.254027 0.605879 0.578591 0.284524 0.608648 0.583715 0.302374 0.608738 0.576372 0.326974 0.609463 0.575329 0.358976 0.602833 0.580676 0.382351 0.601863 0.582151 0.406482 0.609346 0.579331 0.432428 0.609676 0.584715 0.451639 0.607769 0.578089 0.482599 0.602519 0.606431 0.00473486 0.602622 0.601116 0.0258761 0.600394 0.609403 0.0552733 0.601046 0.605314 0.075929 0.606674 0.604322 0.106008 0.602657 0.604948 0.129598 0.609568 0.609816 0.15205 0.608797 0.604108 0.18364 0.604009 0.60662 0.208462 0.603209 0.605598 0.229373 0.6088 0.605841 0.255196 0.606261 0.606999 0.278444 0.604686 0.607969 0.301151 0.600328 0.604933 0.332854 0.604253 0.600313 0.355196 0.602318 0.607661 0.380961 0.603733 0.60953 0.402058 0.608651 0.602345 0.426456 0.609415 0.601346 0.455168 0.609139 0.604482 0.477317 0.608861 0.627566 0.00663852 0.606844 0.634296 0.0254049 0.601467 0.634048 0.0579196 0.60905 0.628006 0.0791924 0.607355 0.631275 0.100414 0.605012 0.626188 0.130143 0.607654 0.628321 0.152006 0.605672 0.633884 0.175105 0.606831 0.633075 0.200576 0.605799 0.626431 0.229538 0.60011 0.630038 0.258395 0.609818 0.63384 0.277031 0.606202 0.626937 0.300523 0.609081 0.628101 0.331793 0.606903 0.634776 0.354977 0.607267 0.630135 0.377975 0.607291 0.627559 0.404178 0.604875 0.633815 0.430174 0.602294 0.629955 0.457498 0.605474 0.631976 0.476167 0.60419 0.650618 0.00403515 0.609113 0.657956 0.0255927 0.609963 0.655481 0.0515917 0.607739 0.652094 0.0793542 0.609194 0.652646 0.104336 0.605337 0.65007 0.12767 0.602472 0.659151 0.157863 0.604862 0.656094 0.176525 0.607995 0.652225 0.20338 0.601937 0.654882 0.231581 0.607943 0.655069 0.256868 0.607533 0.652391 0.28452 0.607604 0.651172 0.302697 0.608271 0.658107 0.329111 0.60865 0.656224 0.351796 0.604551 0.654308 0.3775 0.602386 0.65762 0.405114 0.604578 0.650939 0.428814 0.605094 0.651169 0.457337 0.607585 0.653987 0.47934 0.603586 0.679888 0.00417285 0.604975 0.677187 0.0347612 0.605721 0.675398 0.0543549 0.607951 0.677621 0.0828638 0.607279 0.676478 0.108267 0.601649 0.675481 0.134394 0.605472 0.681429 0.152295 0.60331 0.683632 0.177373 0.603823 0.684558 0.209302 0.602482 0.684517 0.229716 0.603195 0.679766 0.257694 0.606136 0.681849 0.283403 0.607442 0.675915 0.306748 0.606371 0.683966 0.32921 0.606898 0.682523 0.355712 0.603197 0.677773 0.383903 0.60852 0.680172 0.408479 0.607288 0.679446 0.43011 0.609041 0.680652 0.457312 0.608497 0.678319 0.476231 0.609787 0.702519 0.00336251 0.603052 0.701054 0.0272283 0.609457 0.7069 0.0527824 0.606407 0.70398 0.0832986 0.603849 0.700365 0.101927 0.600779 0.700525 0.128467 0.607949 0.708954 0.159991 0.607898 0.703513 0.182995 0.606923 0.701029 0.208677 0.602355 0.703556 0.232162 0.609721 0.704131 0.255416 0.609669 0.700751 0.277356 0.607451 0.702366 0.307298 0.608813 0.707506 0.333971 0.606122 0.708434 0.357123 0.602693 0.704928 0.380925 0.609048 0.709345 0.400815 0.607511 0.709263 0.433225 0.608026 0.703263 0.450919 0.605538 0.705408 0.476986 0.602546 0.73205 0.00699235 0.605237 0.726894 0.0305527 0.605711 0.73341 0.0556675 0.606413 0.734693 0.0808486 0.609354 0.72703 0.102317 0.609993 0.732793 0.130535 0.604482 0.730561 0.157781 0.601855 0.733978 0.177727 0.607873 0.727801 0.209666 0.604929 0.730912 0.228738 0.600152 0.734269 0.252241 0.605437 0.733915 0.284881 0.600894 0.727809 0.307443 0.606932 0.729416 0.330491 0.609882 0.733425 0.35182 0.605914 0.728203 0.381145 0.60707 0.726973 0.405013 0.606165 0.730607 0.426206 0.607049 0.728577 0.453774 0.605344 0.734404 0.483571 0.630347 0.000881273 0.00772174 0.634717 0.00732263 0.0321726 0.625395 0.00114266 0.0549861 0.631468 0.00832709 0.0792063 0.627163 0.00479027 0.107625 0.629806 0.00446116 0.12694 0.632794 0.00341582 0.150813 0.63299 0.000211347 0.177716 0.631264 0.00110916 0.205137 0.628888 0.00798054 0.227452 0.634846 0.0064198 0.257833 0.627248 0.00599168 0.277115 0.626584 0.00244964 0.304735 0.628859 0.00411926 0.329695 0.627824 0.00582698 0.356831 0.628621 0.00949459 0.384035 0.626222 0.00932727 0.40118 0.629497 0.00811297 0.430096 0.625407 0.00334607 0.455077 0.632192 0.004407 0.482045 0.62858 0.0341339 0.0037565 0.626555 0.033843 0.0333664 0.633379 0.0279165 0.0589521 0.630548 0.0323573 0.0761776 0.633851 0.0311355 0.105946 0.633604 0.0253846 0.132678 0.626857 0.0276459 0.151764 0.63498 0.0330424 0.180479 0.626007 0.0314417 0.208891 0.634037 0.0299446 0.229524 0.629712 0.0313481 0.252142 0.63407 0.0327631 0.283388 0.632921 0.0255936 0.304651 0.632558 0.0331433 0.334556 0.625968 0.0336462 0.35534 0.633857 0.0312977 0.375635 0.628303 0.0335434 0.401561 0.63017 0.025803 0.431112 0.631997 0.0274947 0.450322 0.626402 0.0271706 0.478356 0.631584 0.0592321 0.00929577 0.631047 0.0524998 0.0295943 0.631264 0.0544428 0.0563985 0.627041 0.0550472 0.0786811 0.63095 0.052072 0.107167 0.62584 0.057098 0.130902 0.633687 0.0545407 0.153927 0.630406 0.0593128 0.183433 0.625453 0.0557234 0.200756 0.627777 0.0526548 0.228637 0.634185 0.0572259 0.258035 0.634229 0.0515608 0.28303 0.631923 0.0514113 0.300526 0.633414 0.0506206 0.333854 0.627728 0.0512726 0.354162 0.631876 0.059503 0.38053 0.633494 0.0524295 0.401308 0.633862 0.0577002 0.429015 0.625751 0.0596375 0.45058 0.625935 0.0571019 0.480128 0.628486 0.0826328 0.00445517 0.628739 0.0834223 0.0340339 0.633914 0.0841792 0.0596657 0.628031 0.0829851 0.0845262 0.630676 0.0818448 0.109538 0.629719 0.0801188 0.131584 0.627977 0.0753909 0.155021 0.634472 0.0774904 0.177626 0.626281 0.0828563 0.200214 0.633235 0.0771659 0.229169 0.630697 0.079807 0.25142 0.633713 0.075181 0.28301 0.625973 0.0787008 0.308675 0.629395 0.0779009 0.334937 0.631733 0.0781709 0.354638 0.633474 0.0750929 0.376773 0.625897 0.0762739 0.404985 0.632245 0.0803196 0.434284 0.627026 0.0830728 0.456545 0.631554 0.0772045 0.476588 0.633672 0.107179 0.00569777 0.632828 0.10857 0.0265342 0.627288 0.107062 0.0502956 0.631845 0.101062 0.0752763 0.630039 0.108475 0.100208 0.632842 0.108311 0.130185 0.634186 0.104437 0.151128 0.633092 0.102714 0.183848 0.634957 0.107296 0.202058 0.631545 0.109472 0.231504 0.630548 0.104423 0.250419 0.63294 0.1092 0.284676 0.627058 0.10205 0.305417 0.629763 0.108911 0.332772 0.629245 0.104471 0.356426 0.629475 0.107072 0.383355 0.625487 0.100089 0.407515 0.631756 0.104449 0.431835 0.626975 0.103215 0.451969 0.630669 0.102544 0.477545 0.633906 0.133727 0.00524934 0.632069 0.13197 0.0253828 0.630498 0.128432 0.0516676 0.632959 0.126856 0.0817861 0.63305 0.12771 0.106463 0.630688 0.132428 0.131595 0.626291 0.125355 0.153709 0.631005 0.125727 0.17953 0.633592 0.131504 0.202487 0.62548 0.129151 0.228451 0.631292 0.125955 0.250208 0.633958 0.13204 0.282485 0.627524 0.126982 0.301169 0.627317 0.133615 0.327624 0.634421 0.125624 0.357699 0.63014 0.125226 0.384374 0.628893 0.129391 0.407409 0.626118 0.125541 0.428845 0.631788 0.126936 0.454095 0.632845 0.129606 0.4823 0.633118 0.158339 0.00856005 0.627418 0.158787 0.0299469 0.634624 0.152082 0.0593155 0.629196 0.150974 0.0766456 0.625459 0.15747 0.103283 0.630633 0.150912 0.125232 0.628571 0.154055 0.155005 0.631117 0.156012 0.176638 0.630346 0.156359 0.20667 0.625068 0.156655 0.231855 0.627496 0.153799 0.250112 0.63003 0.156234 0.276889 0.633515 0.156004 0.30962 0.625327 0.154019 0.325759 0.629583 0.155199 0.357142 0.632861 0.156739 0.383117 0.632374 0.158379 0.403401 0.628337 0.158507 0.42625 0.629393 0.155002 0.451577 0.627222 0.153359 0.477386 0.628114 0.179271 0.00874546 0.633042 0.183577 0.0301934 0.62657 0.180343 0.0500251 0.634757 0.179196 0.083141 0.627171 0.183823 0.104113 0.626007 0.178164 0.132446 0.630922 0.181456 0.151225 0.627833 0.180887 0.183581 0.633324 0.177738 0.207412 0.631056 0.184567 0.230483 0.629181 0.177085 0.256067 0.631034 0.180436 0.27806 0.633481 0.179024 0.305507 0.634654 0.178888 0.326143 0.631399 0.180083 0.355585 0.632952 0.182497 0.376546 0.625891 0.180992 0.403471 0.626267 0.183144 0.431447 0.633945 0.182232 0.459552 0.628984 0.178545 0.482364 0.634831 0.205356 0.00145479 0.631372 0.20212 0.0347335 0.631648 0.201404 0.057405 0.633411 0.205556 0.0756339 0.62868 0.208625 0.108185 0.625326 0.207793 0.126969 0.627664 0.20335 0.159995 0.630683 0.206131 0.180609 0.631685 0.202511 0.201777 0.626814 0.205841 0.230544 0.62614 0.206446 0.256882 0.626369 0.206455 0.277664 0.633764 0.202018 0.307414 0.627248 0.208386 0.326704 0.628252 0.204235 0.353926 0.627634 0.206136 0.377419 0.627475 0.208653 0.407544 0.626041 0.208027 0.425903 0.626306 0.200224 0.458876 0.629698 0.20649 0.479597 0.629157 0.231562 0.00985577 0.634315 0.233541 0.0338612 0.626708 0.226692 0.0548928 0.626993 0.229119 0.0810182 0.629517 0.225081 0.106178 0.630918 0.232928 0.126237 0.629883 0.232841 0.159911 0.627288 0.225892 0.175764 0.632119 0.231496 0.207559 0.633817 0.230075 0.226103 0.631781 0.227916 0.251927 0.630924 0.227303 0.280298 0.63077 0.234834 0.306595 0.627529 0.23495 0.330593 0.626346 0.226576 0.350308 0.630514 0.234567 0.378189 0.625479 0.233034 0.403211 0.628341 0.231435 0.429066 0.633936 0.233046 0.451829 0.634493 0.22905 0.483378 0.633081 0.25739 0.00869057 0.625163 0.251566 0.0331467 0.625882 0.258146 0.0579993 0.629152 0.251285 0.0795174 0.631706 0.255923 0.100167 0.625928 0.2548 0.125343 0.627461 0.256287 0.150454 0.632282 0.257873 0.182072 0.626896 0.255334 0.202833 0.63006 0.253106 0.234329 0.628929 0.259541 0.251506 0.629041 0.258432 0.28244 0.632388 0.258985 0.304808 0.633437 0.258974 0.331096 0.628986 0.251129 0.352675 0.629589 0.252875 0.38148 0.62644 0.258448 0.40345 0.627051 0.258289 0.426241 0.625092 0.253504 0.45013 0.633703 0.251967 0.477312 0.628397 0.276524 0.00666452 0.626981 0.282402 0.0276975 0.627285 0.275877 0.0599017 0.630771 0.277341 0.0772635 0.633099 0.276267 0.106512 0.625724 0.280158 0.13399 0.634168 0.280832 0.159718 0.633018 0.275982 0.180943 0.628342 0.279749 0.209754 0.632141 0.282437 0.227002 0.633041 0.284733 0.257884 0.634851 0.279323 0.284852 0.633149 0.281616 0.303567 0.634609 0.277483 0.332474 0.628206 0.276209 0.352299 0.633843 0.278177 0.38423 0.629919 0.275604 0.408774 0.63411 0.278549 0.425936 0.628236 0.282233 0.456133 0.62703 0.277309 0.475013 0.629066 0.300081 0.00501483 0.627192 0.306855 0.0269736 0.631795 0.302263 0.057598 0.625216 0.301665 0.0844269 0.630438 0.309496 0.106207 0.633619 0.303384 0.129187 0.633004 0.309737 0.153502 0.634233 0.30552 0.178833 0.626429 0.303745 0.202568 0.627356 0.300472 0.225715 0.628355 0.307966 0.253712 0.634478 0.309843 0.279422 0.629201 0.303564 0.300962 0.628796 0.306474 0.327735 0.633145 0.307084 0.352442 0.633186 0.307043 0.382154 0.630917 0.306807 0.405255 0.629 0.309167 0.433236 0.632854 0.302327 0.453337 0.630233 0.309535 0.476424 0.625466 0.333101 0.00592496 0.625736 0.331014 0.0259199 0.634044 0.325355 0.0570586 0.630894 0.333809 0.0750555 0.632033 0.325978 0.104933 0.625271 0.329364 0.125082 0.626309 0.32764 0.150599 0.633663 0.333288 0.175863 0.631475 0.330739 0.200801 0.631674 0.334396 0.230613 0.626477 0.327909 0.25741 0.629635 0.330463 0.275815 0.632066 0.329689 0.306088 0.626878 0.326573 0.326906 0.634489 0.328267 0.351984 0.63118 0.334558 0.383249 0.630479 0.325885 0.407703 0.634197 0.333157 0.432836 0.626722 0.331595 0.454492 0.63181 0.329376 0.481197 0.630302 0.3523 0.000676358 0.626488 0.351562 0.0346156 0.632504 0.356105 0.0529351 0.628837 0.354604 0.0769981 0.634799 0.35576 0.100324 0.627906 0.35266 0.134958 0.627474 0.358158 0.157053 0.634152 0.356421 0.175665 0.633737 0.352535 0.201934 0.627133 0.358632 0.226626 0.62843 0.352489 0.259494 0.6323 0.357089 0.27905 0.628799 0.354135 0.303039 0.626362 0.351183 0.325247 0.627405 0.357423 0.352741 0.625854 0.351757 0.381373 0.626455 0.354372 0.401448 0.626977 0.353318 0.43472 0.632751 0.353321 0.451811 0.625467 0.35087 0.477252 0.626134 0.379605 0.00395456 0.631981 0.382101 0.0261904 0.625642 0.383869 0.0521583 0.631237 0.381585 0.0784265 0.630404 0.38355 0.101337 0.630558 0.379509 0.126325 0.626247 0.379701 0.15351 0.626085 0.383017 0.184157 0.629829 0.376858 0.205863 0.629872 0.376587 0.233553 0.633179 0.376637 0.255169 0.634519 0.375821 0.281043 0.630626 0.383707 0.308101 0.627942 0.383256 0.328305 0.626941 0.380247 0.357759 0.627895 0.382947 0.375913 0.627627 0.377025 0.401108 0.633308 0.377667 0.429626 0.626019 0.384912 0.454202 0.63214 0.377786 0.479756 0.627929 0.407996 0.00666309 0.627875 0.407581 0.030584 0.62697 0.408635 0.0574087 0.625932 0.409511 0.077488 0.633598 0.406676 0.100648 0.628687 0.404531 0.126567 0.634973 0.405926 0.159464 0.626974 0.4053 0.182783 0.631673 0.404751 0.202195 0.629179 0.409236 0.227049 0.632594 0.400711 0.252785 0.634703 0.406056 0.276361 0.630261 0.409526 0.304046 0.626481 0.40383 0.334087 0.634208 0.401615 0.355761 0.628484 0.408141 0.381129 0.634676 0.404458 0.40365 0.626202 0.409792 0.431286 0.625156 0.404717 0.456645 0.627912 0.408855 0.47624 0.633416 0.425307 0.00577628 0.631655 0.42712 0.0300532 0.62511 0.427119 0.05015 0.633624 0.429474 0.0818004 0.631282 0.429917 0.106397 0.629145 0.429471 0.125726 0.627591 0.425859 0.151388 0.63339 0.43184 0.175162 0.634493 0.426578 0.204061 0.632568 0.430792 0.232821 0.633619 0.430006 0.253803 0.634933 0.428809 0.281836 0.628361 0.432026 0.302019 0.62853 0.432884 0.334724 0.629988 0.432565 0.358895 0.627688 0.425301 0.378613 0.63255 0.431557 0.401452 0.631245 0.431675 0.430288 0.627981 0.428107 0.450383 0.63485 0.426074 0.482569 0.627394 0.455119 0.00122957 0.634968 0.456302 0.0250189 0.628916 0.451282 0.058348 0.631673 0.453144 0.0779839 0.630063 0.459241 0.101598 0.6303 0.458019 0.13278 0.629885 0.456419 0.156758 0.628809 0.450695 0.178707 0.633933 0.458209 0.200858 0.630702 0.456179 0.230846 0.628492 0.45967 0.252042 0.631144 0.452432 0.277813 0.633315 0.452247 0.304033 0.632536 0.45179 0.334944 0.625073 0.459439 0.350154 0.634128 0.456006 0.380424 0.628469 0.456882 0.408148 0.62815 0.453509 0.425742 0.626743 0.459468 0.453535 0.625214 0.455191 0.481866 0.629595 0.477885 0.00837073 0.628525 0.479134 0.0258073 0.629926 0.479698 0.0587774 0.627119 0.482962 0.0786842 0.630235 0.484867 0.104996 0.632898 0.478032 0.128823 0.628464 0.48013 0.156521 0.62979 0.475979 0.178067 0.629473 0.479014 0.201098 0.625099 0.481429 0.2261 0.628045 0.476078 0.250569 0.627178 0.477974 0.284515 0.632623 0.48456 0.301383 0.634197 0.480577 0.329921 0.62572 0.482667 0.35654 0.634077 0.479397 0.375797 0.633149 0.478176 0.402085 0.633798 0.484671 0.427804 0.625592 0.481753 0.457064 0.633884 0.482663 0.481857 0.625739 0.506983 0.00106441 0.625104 0.505625 0.0256137 0.629182 0.504808 0.0510369 0.634474 0.504546 0.0759014 0.625354 0.501414 0.104087 0.632884 0.509856 0.132696 0.626075 0.501309 0.156336 0.631353 0.508588 0.180957 0.628152 0.50373 0.20353 0.626927 0.509805 0.226639 0.627764 0.503805 0.256375 0.632723 0.508519 0.284126 0.633372 0.502023 0.306839 0.629463 0.50174 0.334413 0.634385 0.509697 0.350686 0.633246 0.507345 0.375085 0.626117 0.50157 0.404474 0.628561 0.500242 0.426708 0.6305 0.506778 0.453203 0.633481 0.503233 0.48242 0.627578 0.534244 0.00785983 0.629723 0.532654 0.0322146 0.626177 0.527296 0.0511252 0.631921 0.531047 0.0775687 0.634465 0.534312 0.10233 0.630694 0.529653 0.133094 0.633218 0.530553 0.154039 0.630845 0.529344 0.179768 0.633402 0.532643 0.204794 0.625109 0.532104 0.234283 0.632185 0.525317 0.251761 0.626229 0.529955 0.278811 0.628924 0.526517 0.300999 0.627699 0.532671 0.330725 0.633405 0.533425 0.359094 0.633557 0.527579 0.384827 0.627792 0.529535 0.409 0.630574 0.526622 0.433912 0.627716 0.529276 0.452935 0.634438 0.527975 0.484052 0.634962 0.554474 0.00862228 0.626263 0.55524 0.0337904 0.629702 0.555178 0.0582006 0.634844 0.556643 0.0767295 0.632158 0.550453 0.107195 0.627758 0.557703 0.133466 0.625466 0.555115 0.152424 0.631641 0.552887 0.182198 0.633166 0.551689 0.209197 0.629522 0.555885 0.232058 0.627616 0.559073 0.258256 0.634917 0.557822 0.277933 0.62731 0.556124 0.307201 0.631121 0.558809 0.3284 0.634806 0.552884 0.359124 0.634886 0.556509 0.383984 0.625865 0.553871 0.407906 0.628593 0.559373 0.433296 0.630494 0.555283 0.456791 0.632262 0.554592 0.483911 0.634182 0.58394 0.00533443 0.628653 0.580148 0.0270059 0.63295 0.581665 0.0534569 0.63399 0.575498 0.0841944 0.634031 0.58207 0.102368 0.629967 0.579653 0.128225 0.634328 0.579497 0.1532 0.633799 0.580908 0.178897 0.627063 0.582252 0.206576 0.63084 0.582467 0.230873 0.632836 0.576599 0.253248 0.631749 0.576213 0.277485 0.627535 0.582272 0.30049 0.627256 0.580022 0.330493 0.626772 0.583066 0.359767 0.633963 0.584369 0.38471 0.63367 0.582209 0.404539 0.632013 0.583201 0.426262 0.629161 0.579525 0.452997 0.633894 0.581943 0.480652 0.62555 0.600267 0.00125596 0.629199 0.609225 0.0311223 0.634669 0.607197 0.0548793 0.628601 0.605234 0.0809267 0.628749 0.6041 0.106221 0.627164 0.600199 0.127803 0.627801 0.608808 0.158362 0.626721 0.607904 0.17594 0.6273 0.602143 0.207688 0.632748 0.602627 0.23475 0.630562 0.603197 0.250825 0.631379 0.609147 0.279396 0.634843 0.608377 0.30677 0.634628 0.609778 0.33304 0.634849 0.601445 0.356215 0.628877 0.608645 0.380111 0.626464 0.608173 0.401221 0.630365 0.602736 0.43386 0.626968 0.608795 0.458204 0.628182 0.605567 0.4842 0.625593 0.630715 0.00186921 0.630848 0.632061 0.0293863 0.629671 0.626474 0.0539195 0.633207 0.62899 0.0826309 0.625302 0.631218 0.104011 0.634417 0.633143 0.126957 0.627722 0.62695 0.158336 0.628612 0.625187 0.179755 0.63331 0.625501 0.209918 0.627653 0.627482 0.234069 0.631732 0.63312 0.259358 0.625004 0.633262 0.283367 0.62707 0.6301 0.300078 0.628766 0.634489 0.327345 0.628413 0.628424 0.354092 0.633354 0.62811 0.384741 0.633595 0.628232 0.402979 0.625158 0.628915 0.432563 0.633507 0.634904 0.455938 0.634318 0.633386 0.475643 0.627414 0.658633 0.00783304 0.628266 0.655216 0.0308365 0.632797 0.657693 0.0582726 0.631715 0.65524 0.0780073 0.625569 0.654209 0.104386 0.634476 0.654202 0.131884 0.631526 0.652224 0.154058 0.632272 0.654459 0.184448 0.627324 0.652172 0.205318 0.630973 0.653758 0.233301 0.62919 0.653475 0.257095 0.625138 0.658175 0.284488 0.626692 0.658841 0.302078 0.634007 0.653778 0.331911 0.634516 0.65061 0.352555 0.634522 0.656611 0.38193 0.631717 0.650671 0.405473 0.625368 0.657398 0.432469 0.630084 0.655358 0.454413 0.629935 0.65298 0.484467 0.62629 0.678729 3.48984e-05 0.631015 0.682798 0.0306768 0.631721 0.68497 0.0503161 0.629192 0.679345 0.083099 0.628966 0.680304 0.101928 0.625848 0.676252 0.132912 0.629687 0.676571 0.150114 0.625832 0.680418 0.178308 0.631708 0.682415 0.205712 0.626639 0.67647 0.228208 0.625787 0.681753 0.25965 0.631638 0.679143 0.28389 0.627594 0.684666 0.306173 0.634127 0.678785 0.328467 0.627748 0.680015 0.353575 0.626245 0.679663 0.38096 0.625537 0.68048 0.409091 0.627329 0.676388 0.428156 0.633067 0.675931 0.459035 0.634494 0.677891 0.481414 0.626947 0.706554 0.00450815 0.63199 0.702907 0.0327565 0.633842 0.705138 0.0502342 0.631447 0.709111 0.0761802 0.631506 0.706236 0.108827 0.628998 0.704307 0.126983 0.629892 0.708161 0.153652 0.628353 0.708615 0.182319 0.628936 0.702132 0.207916 0.632145 0.703987 0.225713 0.634306 0.707148 0.25618 0.62695 0.706738 0.279477 0.630572 0.700916 0.303089 0.631896 0.70828 0.326983 0.626218 0.709382 0.357524 0.626376 0.706183 0.379715 0.627929 0.706161 0.409914 0.628571 0.703139 0.432212 0.634238 0.702427 0.452195 0.626569 0.708389 0.481319 0.627231 0.72575 0.00692379 0.634388 0.729132 0.031846 0.628074 0.730416 0.0512122 0.634942 0.72895 0.0821245 0.625501 0.729659 0.106563 0.625916 0.725828 0.12811 0.629343 0.734775 0.154892 0.632683 0.72561 0.17806 0.629391 0.727793 0.204449 0.632427 0.73304 0.231828 0.627523 0.732885 0.253863 0.632235 0.732831 0.279302 0.626132 0.730072 0.309116 0.62908 0.732208 0.329024 0.627013 0.726375 0.358528 0.625189 0.734957 0.37745 0.633048 0.731773 0.402822 0.628534 0.733452 0.429918 0.633234 0.730003 0.457856 0.627368 0.727011 0.479645 0.653942 0.0036478 0.00324524 0.654105 0.00167172 0.0282562 0.657769 7.64846e-06 0.0566281 0.650597 0.00327706 0.07841 0.650638 0.00655217 0.105755 0.654593 0.00276023 0.130616 0.651385 0.00136775 0.158523 0.659309 0.000378297 0.182195 0.654301 0.00026027 0.209504 0.654952 0.00485479 0.232202 0.652178 0.00515465 0.25788 0.658574 0.0082063 0.280998 0.654274 0.00208823 0.307363 0.651683 0.000948487 0.329143 0.650425 0.00501092 0.350294 0.652444 0.00985212 0.382962 0.657533 0.00741914 0.407499 0.65765 0.00176539 0.434487 0.654469 0.00518636 0.455701 0.655046 0.00503286 0.482218 0.652049 0.0259819 0.0023464 0.657516 0.0300135 0.0309935 0.65419 0.027442 0.0541441 0.654153 0.0310465 0.080475 0.655066 0.0326478 0.101335 0.653572 0.0348357 0.133935 0.652434 0.0257853 0.155546 0.658722 0.0301933 0.176427 0.657296 0.0278498 0.205896 0.657841 0.0291393 0.229815 0.656066 0.0283723 0.259526 0.659232 0.0281627 0.279055 0.651109 0.0317651 0.30609 0.657425 0.0305166 0.326205 0.653684 0.0261881 0.358374 0.651577 0.0279731 0.375697 0.657072 0.0298539 0.406285 0.652411 0.0315405 0.425601 0.652236 0.0261997 0.45687 0.656386 0.0286476 0.480355 0.655473 0.0599232 0.00454606 0.652659 0.0575294 0.0346972 0.651068 0.059677 0.0527316 0.653455 0.0554618 0.0754706 0.657178 0.05274 0.104882 0.658771 0.0594712 0.125093 0.654587 0.0531492 0.154377 0.653372 0.058985 0.184188 0.655248 0.0524929 0.209981 0.657711 0.0540839 0.232932 0.654937 0.0580424 0.251595 0.656516 0.0514923 0.28432 0.656814 0.058703 0.302292 0.658222 0.0591854 0.332175 0.65364 0.055227 0.35514 0.659636 0.0510041 0.378583 0.654948 0.0590729 0.40463 0.650509 0.055244 0.428229 0.657008 0.0514688 0.453583 0.656713 0.0531507 0.483494 0.656361 0.0802956 0.00543761 0.657873 0.0776045 0.0278406 0.658708 0.0768415 0.0576373 0.658499 0.0782944 0.0763621 0.651219 0.0760157 0.104429 0.651214 0.075191 0.125016 0.654875 0.0804612 0.151187 0.651977 0.0784955 0.182248 0.651962 0.0784351 0.208753 0.655649 0.0771028 0.227062 0.65168 0.0830826 0.254326 0.650109 0.0797103 0.281306 0.654481 0.0809219 0.308801 0.659101 0.077384 0.325572 0.652643 0.0800311 0.351486 0.65509 0.0763592 0.37874 0.655339 0.0773404 0.403182 0.656562 0.079173 0.43357 0.657076 0.079218 0.459433 0.656449 0.0765259 0.481242 0.65572 0.101546 0.00963956 0.658877 0.103557 0.0264116 0.651828 0.103406 0.0572733 0.65358 0.108531 0.0834438 0.656821 0.109941 0.109348 0.6584 0.101762 0.133174 0.654523 0.10698 0.158128 0.650723 0.101572 0.178007 0.6523 0.101492 0.206146 0.654549 0.100121 0.229835 0.657468 0.102999 0.258675 0.659192 0.106226 0.282685 0.653727 0.103951 0.306193 0.65325 0.108788 0.331805 0.650467 0.100661 0.354988 0.655421 0.102635 0.375385 0.651919 0.100945 0.40197 0.65522 0.102846 0.432478 0.657443 0.105303 0.457198 0.655688 0.106555 0.483965 0.655131 0.131396 0.00342813 0.658064 0.128768 0.0259637 0.65382 0.127918 0.050118 0.65622 0.133557 0.0756299 0.658794 0.132484 0.107981 0.656891 0.127718 0.125873 0.658164 0.133704 0.155666 0.655832 0.125682 0.182263 0.657608 0.132886 0.205434 0.652565 0.132561 0.230676 0.655252 0.130517 0.256423 0.652778 0.134778 0.28317 0.650846 0.129785 0.308122 0.657459 0.127529 0.328211 0.657226 0.129033 0.35873 0.656473 0.133543 0.377426 0.654794 0.127426 0.405693 0.656459 0.133033 0.433455 0.65211 0.133998 0.451325 0.652198 0.125605 0.480521 0.650984 0.155681 0.00712345 0.658721 0.155158 0.0315629 0.653176 0.15687 0.0595456 0.65466 0.155348 0.0771879 0.656559 0.158909 0.104465 0.659919 0.151919 0.132029 0.650355 0.152444 0.150736 0.656672 0.153194 0.176271 0.659625 0.155678 0.207289 0.65914 0.155561 0.234853 0.654313 0.153303 0.258811 0.657609 0.157655 0.278118 0.651179 0.151821 0.308278 0.651813 0.151301 0.328894 0.651506 0.155174 0.352276 0.653494 0.158105 0.378287 0.659295 0.158589 0.40729 0.65464 0.154218 0.429845 0.652402 0.151943 0.452628 0.655254 0.156518 0.478126 0.656261 0.175932 0.00779206 0.659033 0.183984 0.0268795 0.656408 0.181247 0.0586177 0.653157 0.178386 0.0770577 0.655601 0.177421 0.108732 0.651533 0.18027 0.125289 0.653332 0.184523 0.155635 0.655898 0.182161 0.178789 0.651129 0.182969 0.200822 0.65767 0.178576 0.227074 0.658611 0.175177 0.250376 0.659836 0.183415 0.284197 0.651906 0.181108 0.306327 0.656028 0.177646 0.33322 0.655049 0.17542 0.355513 0.653228 0.178711 0.383949 0.655084 0.182418 0.409682 0.65255 0.176295 0.433496 0.658304 0.178203 0.451251 0.65799 0.180168 0.479786 0.65787 0.206025 0.00472273 0.65853 0.202357 0.0311863 0.653663 0.201805 0.0543111 0.65664 0.203853 0.0825629 0.652349 0.208699 0.10661 0.655865 0.207455 0.127884 0.653148 0.203853 0.156033 0.659205 0.208227 0.17925 0.654464 0.20555 0.209488 0.658123 0.208583 0.234877 0.651265 0.206044 0.251064 0.656437 0.201738 0.278824 0.655542 0.207956 0.307778 0.658344 0.206138 0.332931 0.654873 0.204348 0.354735 0.654788 0.205688 0.375939 0.650232 0.201166 0.401333 0.65328 0.205404 0.427285 0.653957 0.200195 0.458913 0.651039 0.208139 0.481007 0.655291 0.234707 0.00537407 0.657443 0.226899 0.0331415 0.650236 0.230661 0.0534218 0.651828 0.231125 0.0795151 0.655417 0.229791 0.101475 0.658905 0.229883 0.133131 0.655621 0.234233 0.158331 0.654795 0.229753 0.182374 0.654038 0.226456 0.208357 0.656647 0.227263 0.229295 0.65189 0.233744 0.254293 0.65372 0.226985 0.282593 0.652103 0.229126 0.302024 0.65732 0.230788 0.330778 0.652236 0.229766 0.35616 0.652467 0.229533 0.382817 0.657214 0.233246 0.40584 0.657897 0.229469 0.425264 0.658793 0.232568 0.454296 0.650244 0.232178 0.478864 0.659752 0.250888 0.00844174 0.651776 0.255474 0.0283559 0.653039 0.254615 0.0579423 0.659795 0.252239 0.0786442 0.654766 0.258881 0.102559 0.655608 0.254262 0.134583 0.657111 0.256191 0.152901 0.657419 0.256197 0.17518 0.6564 0.250773 0.201498 0.655424 0.250405 0.226207 0.658407 0.250684 0.258518 0.658868 0.258758 0.280137 0.650541 0.251263 0.303599 0.65558 0.258536 0.328826 0.651024 0.252088 0.355729 0.653355 0.253896 0.377721 0.65641 0.258936 0.403682 0.656524 0.258413 0.43408 0.650235 0.253019 0.452983 0.652267 0.259405 0.482138 0.656192 0.275957 0.00542971 0.655401 0.282383 0.0303572 0.65857 0.276404 0.0515015 0.653289 0.283975 0.0784951 0.655924 0.275634 0.109773 0.651929 0.283094 0.128815 0.65854 0.281852 0.156995 0.651133 0.275174 0.181985 0.650184 0.279654 0.202402 0.654664 0.279507 0.228567 0.650448 0.283709 0.255196 0.654909 0.275389 0.282933 0.657148 0.283495 0.303202 0.655564 0.282781 0.32644 0.658282 0.281817 0.351896 0.659432 0.281939 0.381641 0.651006 0.28377 0.402105 0.653501 0.283037 0.431089 0.659833 0.27912 0.450429 0.653889 0.279216 0.482342 0.652269 0.305616 0.00893463 0.656771 0.308165 0.031766 0.652736 0.308277 0.0563966 0.659731 0.300725 0.0767918 0.656973 0.302827 0.10945 0.656514 0.306578 0.129898 0.658427 0.304439 0.158896 0.659336 0.309054 0.176395 0.657118 0.307373 0.209906 0.654957 0.309073 0.228659 0.65437 0.30996 0.252415 0.654815 0.307589 0.275091 0.652936 0.307714 0.307986 0.656251 0.307803 0.326472 0.658422 0.302148 0.354216 0.659579 0.30068 0.380662 0.653772 0.304437 0.407546 0.651979 0.30193 0.425177 0.650921 0.304748 0.45832 0.654401 0.304143 0.478535 0.656833 0.325244 0.00777994 0.655843 0.33404 0.0304633 0.65167 0.331726 0.0516965 0.65036 0.326654 0.08253 0.65995 0.330082 0.107578 0.652184 0.330214 0.129739 0.65334 0.331582 0.158059 0.657052 0.334532 0.181226 0.656339 0.332678 0.202224 0.654321 0.32617 0.232495 0.656124 0.331845 0.254419 0.65009 0.333588 0.275522 0.651538 0.331306 0.30015 0.651856 0.32563 0.327388 0.653401 0.325963 0.359658 0.654233 0.32659 0.383466 0.657878 0.334135 0.401314 0.650514 0.333661 0.433812 0.655647 0.334489 0.459625 0.650338 0.334083 0.477255 0.652596 0.350771 0.00840589 0.655185 0.352874 0.0290378 0.652102 0.354549 0.0512185 0.656174 0.35898 0.0762654 0.656943 0.354939 0.106365 0.652191 0.359816 0.1336 0.652395 0.35301 0.157608 0.654224 0.35179 0.179834 0.655054 0.359922 0.201845 0.652615 0.355662 0.231394 0.655525 0.355709 0.256891 0.657902 0.35248 0.276924 0.650043 0.350039 0.300681 0.656358 0.352177 0.328737 0.65141 0.355499 0.358279 0.65073 0.356697 0.383541 0.65772 0.352924 0.400222 0.659633 0.351208 0.430918 0.652493 0.352805 0.459341 0.658395 0.357004 0.476349 0.654669 0.378669 0.00248617 0.654274 0.383682 0.0307168 0.654564 0.38269 0.0581815 0.65934 0.383574 0.0751619 0.65142 0.381344 0.100386 0.659681 0.384507 0.131881 0.658279 0.375218 0.15893 0.656407 0.376664 0.182218 0.654427 0.379383 0.200372 0.650873 0.375391 0.230327 0.655739 0.375859 0.25307 0.656648 0.379511 0.281186 0.653905 0.375655 0.302205 0.653962 0.382688 0.326143 0.650692 0.378893 0.353257 0.652977 0.383018 0.378992 0.651901 0.382488 0.40765 0.652785 0.376619 0.432475 0.651062 0.379892 0.458139 0.654818 0.381719 0.483495 0.654723 0.406772 0.000776122 0.653424 0.408238 0.030779 0.659146 0.408323 0.0537982 0.653075 0.406704 0.0760846 0.651976 0.40075 0.100337 0.652176 0.40294 0.131302 0.657118 0.409818 0.159699 0.650908 0.404121 0.180927 0.656444 0.408882 0.200224 0.654117 0.408156 0.229204 0.653745 0.405515 0.259155 0.657219 0.409898 0.279287 0.653121 0.404003 0.30403 0.654988 0.406888 0.329415 0.656366 0.405688 0.358475 0.656178 0.400868 0.384345 0.654566 0.408821 0.409806 0.656561 0.409044 0.431775 0.650087 0.40351 0.456912 0.658172 0.401451 0.4777 0.653671 0.434037 0.00759441 0.652069 0.425215 0.0346667 0.652465 0.42567 0.0557482 0.65551 0.431675 0.0754916 0.653995 0.427198 0.105562 0.65253 0.425768 0.133252 0.656316 0.432497 0.158239 0.658127 0.433186 0.179106 0.654311 0.43275 0.206533 0.659924 0.430268 0.233487 0.658891 0.430711 0.259333 0.659035 0.427809 0.281035 0.655296 0.432311 0.3005 0.658955 0.433623 0.326716 0.651949 0.425512 0.351243 0.657897 0.429618 0.38075 0.656858 0.434172 0.405943 0.654587 0.426486 0.431257 0.652101 0.430964 0.456809 0.650984 0.433738 0.482721 0.658879 0.45473 0.00320966 0.658318 0.455957 0.0268181 0.653233 0.453024 0.0505862 0.651819 0.459349 0.0800303 0.652997 0.459479 0.102249 0.65725 0.456073 0.127648 0.655522 0.45453 0.158568 0.654566 0.457748 0.182561 0.659931 0.458153 0.208942 0.658075 0.45088 0.229316 0.657169 0.451535 0.252128 0.650083 0.454584 0.280538 0.654868 0.453569 0.304368 0.653906 0.450741 0.328218 0.652908 0.452797 0.353025 0.656526 0.455371 0.378375 0.651274 0.455813 0.408452 0.658182 0.457079 0.429004 0.655917 0.455524 0.452233 0.654218 0.450544 0.483266 0.652363 0.477202 0.00857752 0.653299 0.483823 0.0328646 0.659013 0.478898 0.0508768 0.650669 0.477167 0.0798723 0.655325 0.481376 0.108425 0.655841 0.479808 0.13412 0.655079 0.484754 0.152009 0.651398 0.479122 0.180639 0.65959 0.480004 0.20722 0.657954 0.479269 0.226978 0.652141 0.476389 0.254457 0.656355 0.477287 0.278741 0.650104 0.478756 0.302953 0.650011 0.483884 0.332314 0.653283 0.480047 0.357006 0.659089 0.480864 0.382274 0.655311 0.481945 0.40936 0.651973 0.475861 0.432321 0.656951 0.479365 0.452124 0.655505 0.476347 0.477953 0.657592 0.501846 0.00839964 0.655109 0.505957 0.0311308 0.656673 0.505181 0.0528684 0.653363 0.501268 0.0760696 0.659123 0.504097 0.101754 0.656628 0.506503 0.131771 0.656849 0.502728 0.156172 0.650223 0.501384 0.17565 0.655879 0.502529 0.204053 0.65368 0.503454 0.23482 0.6502 0.500532 0.25713 0.65198 0.501513 0.276367 0.656876 0.503624 0.300849 0.650606 0.50369 0.32514 0.653505 0.50225 0.356036 0.652579 0.507137 0.377569 0.659305 0.50874 0.408172 0.651526 0.50739 0.429052 0.658156 0.500532 0.456634 0.656971 0.505041 0.482493 0.655175 0.528067 0.00112192 0.655942 0.528156 0.0322539 0.656375 0.533496 0.0564477 0.658501 0.53153 0.0790416 0.653261 0.533659 0.103488 0.656031 0.530776 0.125831 0.659088 0.531805 0.159132 0.651113 0.529872 0.176008 0.655892 0.529977 0.20186 0.653385 0.528283 0.234422 0.657663 0.526456 0.252896 0.65907 0.534073 0.283038 0.652504 0.53232 0.307819 0.659011 0.533517 0.332554 0.655114 0.53221 0.356333 0.658237 0.532233 0.383426 0.657351 0.52995 0.403387 0.652013 0.528166 0.426294 0.65789 0.534023 0.453991 0.654782 0.533902 0.48467 0.653642 0.558154 0.00424209 0.659528 0.553571 0.031744 0.652752 0.55769 0.0540568 0.65878 0.55493 0.0830576 0.659309 0.553986 0.104936 0.657476 0.552167 0.126904 0.654176 0.557133 0.152389 0.651557 0.554405 0.18491 0.65403 0.55907 0.201284 0.659588 0.552721 0.23151 0.651649 0.554011 0.253267 0.659463 0.553956 0.279959 0.653967 0.559956 0.309669 0.651222 0.553477 0.331454 0.657423 0.557528 0.35258 0.651417 0.553735 0.377084 0.65049 0.555739 0.406739 0.656593 0.558552 0.431267 0.659023 0.559099 0.453537 0.659309 0.554022 0.48171 0.655056 0.582715 0.00786022 0.65945 0.578535 0.0340478 0.655919 0.575674 0.0552561 0.655854 0.58015 0.0789022 0.652208 0.583751 0.109096 0.650835 0.582156 0.132622 0.651307 0.578681 0.157967 0.653539 0.578195 0.17997 0.651564 0.578141 0.20699 0.655439 0.578181 0.226252 0.651348 0.576368 0.25401 0.655929 0.577814 0.280493 0.652748 0.576236 0.308098 0.654089 0.583745 0.331687 0.650301 0.583461 0.355721 0.652143 0.578351 0.378359 0.651848 0.57799 0.407356 0.652135 0.575169 0.426854 0.658867 0.583032 0.450889 0.650105 0.57773 0.484969 0.656402 0.609417 0.000704794 0.656666 0.600627 0.0263705 0.659134 0.60494 0.0552302 0.651065 0.607038 0.0763285 0.657739 0.600086 0.103911 0.653657 0.606035 0.134741 0.655786 0.603551 0.152756 0.658718 0.609536 0.182634 0.654061 0.600366 0.200646 0.654966 0.604032 0.230359 0.653591 0.609365 0.257595 0.651097 0.607244 0.281141 0.656846 0.601864 0.309306 0.654513 0.60344 0.329218 0.653416 0.605862 0.350535 0.652833 0.603297 0.382878 0.653477 0.608966 0.408858 0.659704 0.607953 0.434721 0.656702 0.600082 0.455986 0.652623 0.609823 0.476085 0.654473 0.634749 0.00954402 0.653932 0.627888 0.030461 0.653896 0.625246 0.0582482 0.654998 0.63089 0.079265 0.65809 0.6348 0.108412 0.656555 0.634548 0.1281 0.659102 0.627777 0.152716 0.653333 0.628613 0.182386 0.654552 0.632278 0.202335 0.659779 0.625166 0.227122 0.658249 0.627465 0.258237 0.650127 0.634322 0.283141 0.65767 0.634258 0.301009 0.65599 0.626697 0.327504 0.654435 0.625781 0.351273 0.650982 0.6309 0.375128 0.651574 0.631171 0.409032 0.651959 0.633043 0.428324 0.653491 0.627543 0.453152 0.656398 0.628182 0.479389 0.652706 0.658747 0.00280777 0.657491 0.654099 0.0336768 0.658009 0.658705 0.0558806 0.654123 0.650567 0.0797388 0.652849 0.651865 0.104077 0.659169 0.657596 0.133477 0.655459 0.65304 0.154182 0.658632 0.65554 0.184693 0.652916 0.651374 0.2052 0.655254 0.654676 0.227915 0.658081 0.657204 0.256111 0.650552 0.653216 0.275315 0.652413 0.653228 0.301071 0.655187 0.656055 0.325482 0.65997 0.653192 0.358556 0.650144 0.650843 0.383838 0.658321 0.651889 0.401206 0.657776 0.65324 0.431045 0.65246 0.654675 0.45876 0.655951 0.651657 0.484166 0.654584 0.680311 0.00198079 0.651691 0.684299 0.0309056 0.65814 0.67623 0.0575826 0.653535 0.684836 0.0831596 0.659132 0.678064 0.10039 0.652511 0.684144 0.130051 0.658646 0.683067 0.153519 0.653895 0.67645 0.183557 0.656573 0.684097 0.205578 0.65382 0.683025 0.234741 0.652001 0.676579 0.25947 0.656265 0.675164 0.282328 0.65814 0.675977 0.304631 0.658959 0.684162 0.333542 0.653413 0.684888 0.353009 0.653003 0.679692 0.375619 0.65558 0.683223 0.402974 0.652363 0.682224 0.42729 0.65416 0.676456 0.458755 0.653221 0.677153 0.4761 0.6565 0.70693 0.00368118 0.6592 0.701045 0.033923 0.657655 0.701733 0.0514831 0.657582 0.705885 0.0848563 0.656587 0.709618 0.102063 0.652567 0.708872 0.126557 0.65993 0.702661 0.156519 0.655739 0.702275 0.176606 0.650599 0.704878 0.203262 0.653933 0.702034 0.231696 0.654385 0.706421 0.259891 0.654596 0.701608 0.279566 0.6525 0.702905 0.308832 0.654077 0.707709 0.331372 0.652322 0.709023 0.352541 0.654773 0.707012 0.384086 0.654264 0.700417 0.409411 0.654633 0.700235 0.425863 0.652041 0.700983 0.458111 0.652218 0.700754 0.483784 0.658388 0.727232 0.00182674 0.659531 0.734649 0.0281933 0.659378 0.733126 0.0522521 0.65503 0.727229 0.0797942 0.656776 0.725384 0.100982 0.658337 0.734955 0.133847 0.651711 0.726341 0.157925 0.653623 0.73433 0.180169 0.656431 0.729004 0.206584 0.650716 0.726713 0.22822 0.659632 0.732505 0.257716 0.657014 0.732735 0.278979 0.65306 0.726147 0.30757 0.650984 0.725076 0.334769 0.655535 0.731569 0.352785 0.653933 0.733245 0.3814 0.657635 0.729677 0.409535 0.651076 0.726384 0.431076 0.654976 0.725495 0.452937 0.654914 0.728504 0.484574 0.683027 0.00859127 0.00265275 0.683062 0.00716198 0.0312402 0.67938 0.0061035 0.0525951 0.683539 0.00411113 0.0783137 0.675613 0.00443028 0.105791 0.676625 0.00204364 0.126865 0.67587 0.00539083 0.159534 0.675246 0.00294166 0.183279 0.677313 0.00366313 0.201504 0.682548 0.00229194 0.227105 0.68086 0.00717299 0.253551 0.682135 0.00190338 0.277088 0.681567 0.00512566 0.302284 0.679065 0.00951085 0.329909 0.676709 0.00343322 0.35927 0.679063 0.00977386 0.375294 0.676645 0.00415273 0.400354 0.684843 0.00264005 0.431794 0.684056 0.00209869 0.454631 0.684968 0.0042878 0.475256 0.678198 0.0294931 0.00703249 0.675072 0.0278535 0.034904 0.679196 0.0314838 0.0550606 0.679387 0.0334225 0.0769156 0.681716 0.0311396 0.10736 0.677542 0.0304931 0.126092 0.684588 0.0308774 0.153549 0.67585 0.0306142 0.177326 0.683513 0.0279247 0.206719 0.684313 0.0253737 0.229597 0.678827 0.0289897 0.25187 0.675275 0.0282772 0.281651 0.679792 0.0322001 0.307285 0.679437 0.0287814 0.329201 0.683356 0.028708 0.35589 0.680462 0.0339271 0.375127 0.683432 0.0296817 0.408441 0.675797 0.0341752 0.427392 0.683984 0.02605 0.453443 0.684672 0.0349662 0.480335 0.683319 0.0581003 0.000240553 0.678165 0.0582627 0.0330247 0.683982 0.0557802 0.0517331 0.678429 0.0518984 0.0758536 0.68473 0.051645 0.107314 0.677644 0.0538632 0.128549 0.678783 0.0550257 0.159981 0.679817 0.0516224 0.184034 0.684501 0.0502533 0.200535 0.679377 0.052249 0.226554 0.677964 0.0527487 0.254368 0.683494 0.0523201 0.282022 0.677177 0.0550169 0.309615 0.679281 0.0567763 0.329806 0.679598 0.0572071 0.355759 0.681606 0.0552258 0.375263 0.678251 0.0527136 0.40453 0.682162 0.0502066 0.431125 0.682672 0.0598586 0.455669 0.677951 0.0557215 0.482253 0.675703 0.0835978 0.00138085 0.6774 0.0836839 0.0293885 0.681158 0.0835631 0.054257 0.682783 0.0823638 0.0831711 0.678995 0.0799129 0.106451 0.675796 0.0766873 0.126175 0.675692 0.0756651 0.15235 0.675214 0.0817842 0.179939 0.675158 0.0814066 0.204747 0.682844 0.0801016 0.227405 0.676335 0.0795449 0.251597 0.679344 0.0802135 0.277009 0.679593 0.0847112 0.308344 0.676654 0.081862 0.334887 0.679481 0.0777053 0.356677 0.678105 0.0775292 0.37842 0.676558 0.0825087 0.408904 0.67978 0.0842876 0.430654 0.679035 0.078299 0.457055 0.679912 0.0821861 0.479178 0.683125 0.105644 0.00478852 0.681304 0.10943 0.0298263 0.683049 0.107338 0.0542379 0.680039 0.108735 0.0762902 0.684827 0.101933 0.109313 0.681197 0.108577 0.125772 0.682224 0.10447 0.152021 0.684177 0.108508 0.184671 0.680435 0.107487 0.204574 0.682445 0.106866 0.230328 0.682262 0.104252 0.250098 0.681869 0.101721 0.284931 0.68374 0.103526 0.307781 0.675883 0.105993 0.325525 0.682789 0.102028 0.356104 0.683792 0.100032 0.377638 0.678176 0.100453 0.400385 0.678426 0.106852 0.425979 0.677417 0.107877 0.453073 0.678622 0.105489 0.482233 0.684267 0.1335 0.00713617 0.681551 0.12905 0.0298671 0.681914 0.129266 0.0510627 0.682308 0.128763 0.0781163 0.683634 0.130432 0.103476 0.68458 0.127283 0.134069 0.676061 0.133097 0.15595 0.677794 0.134272 0.18178 0.677602 0.127243 0.207561 0.676794 0.127315 0.22613 0.683737 0.132217 0.259976 0.68488 0.131007 0.282828 0.683828 0.12577 0.303539 0.67558 0.130521 0.333327 0.680412 0.126264 0.35727 0.684267 0.127759 0.375572 0.684004 0.126778 0.407193 0.680917 0.129641 0.431365 0.676339 0.129364 0.450383 0.683597 0.133593 0.483101 0.677293 0.150057 0.00428059 0.682371 0.155483 0.0316977 0.682452 0.159559 0.0577521 0.676176 0.155714 0.0804969 0.683054 0.156916 0.10726 0.675619 0.156028 0.134512 0.677636 0.155465 0.156242 0.68026 0.150407 0.180699 0.677542 0.155328 0.202829 0.675093 0.158784 0.232215 0.675529 0.157218 0.251601 0.681329 0.155296 0.284464 0.680152 0.159861 0.301963 0.675704 0.152773 0.326612 0.684394 0.150813 0.354272 0.675449 0.155443 0.378399 0.677498 0.150962 0.405766 0.684645 0.15848 0.428319 0.679379 0.151066 0.459791 0.684954 0.158189 0.477127 0.677918 0.175551 0.00534248 0.677806 0.177987 0.0337675 0.675456 0.179108 0.0557094 0.680584 0.184685 0.0767412 0.684144 0.180355 0.106567 0.680242 0.175947 0.128178 0.675639 0.175141 0.158936 0.676664 0.180657 0.182671 0.679768 0.178586 0.201688 0.676231 0.182663 0.22999 0.680316 0.182445 0.254609 0.678533 0.182501 0.281306 0.682316 0.180201 0.308274 0.678461 0.17812 0.326734 0.683341 0.180001 0.3556 0.677602 0.182781 0.378069 0.676141 0.177051 0.402459 0.683631 0.180228 0.425457 0.681421 0.180692 0.458657 0.678113 0.183717 0.476344 0.675879 0.200883 0.00160609 0.680827 0.208702 0.0342472 0.678445 0.201518 0.0517788 0.677684 0.208532 0.0796028 0.681836 0.20392 0.101357 0.681284 0.205039 0.129989 0.68299 0.204719 0.157957 0.678503 0.200265 0.180381 0.683602 0.201108 0.202111 0.682025 0.20302 0.231184 0.678249 0.206628 0.252924 0.677853 0.205842 0.283261 0.675516 0.208091 0.300015 0.679215 0.207371 0.331806 0.680762 0.208569 0.351439 0.68129 0.201183 0.377765 0.675717 0.200471 0.400712 0.679241 0.201929 0.431224 0.680454 0.20464 0.455108 0.683061 0.200617 0.480895 0.679759 0.234368 0.00976232 0.68031 0.234361 0.0278135 0.675885 0.229753 0.0594176 0.680408 0.231828 0.0768021 0.675616 0.230121 0.109813 0.67505 0.225656 0.12707 0.677805 0.227198 0.152951 0.678538 0.230519 0.183705 0.682048 0.229907 0.200173 0.684941 0.232852 0.233775 0.682137 0.229348 0.254388 0.683784 0.232414 0.280335 0.679168 0.23415 0.302203 0.681561 0.228542 0.327592 0.682587 0.233012 0.354559 0.684655 0.23348 0.377761 0.683765 0.233818 0.402457 0.683394 0.226322 0.430799 0.678839 0.229514 0.450413 0.684969 0.232487 0.478193 0.681986 0.257676 0.00222238 0.682317 0.255504 0.0295988 0.680725 0.259873 0.0540707 0.684348 0.257201 0.0828368 0.675634 0.256678 0.105354 0.682636 0.254007 0.128538 0.682203 0.255461 0.15438 0.678414 0.256525 0.183002 0.682395 0.251906 0.208082 0.680628 0.250519 0.233248 0.682985 0.256312 0.256461 0.681698 0.259383 0.275861 0.68414 0.257753 0.302957 0.681615 0.255889 0.325468 0.675389 0.251681 0.350029 0.678399 0.256747 0.381301 0.675038 0.25672 0.400844 0.678651 0.251618 0.426769 0.680648 0.253572 0.452944 0.680835 0.259086 0.483704 0.68418 0.28468 0.00784113 0.675383 0.277528 0.0324349 0.682272 0.283561 0.0579966 0.678911 0.277186 0.0808527 0.676893 0.27748 0.109357 0.680616 0.275766 0.133728 0.675101 0.275277 0.158756 0.680799 0.277523 0.176931 0.678655 0.283264 0.209017 0.682905 0.283683 0.227517 0.68188 0.27515 0.252079 0.679948 0.278311 0.282375 0.684011 0.284892 0.30144 0.676084 0.280564 0.334636 0.675072 0.277357 0.358157 0.684444 0.281581 0.376476 0.67583 0.278889 0.402567 0.676335 0.284316 0.427945 0.679532 0.277017 0.453654 0.68492 0.278862 0.4797 0.683502 0.309821 0.00977246 0.675093 0.302957 0.0341154 0.681682 0.309377 0.0543248 0.677834 0.300653 0.0789123 0.680118 0.305796 0.10332 0.681035 0.300938 0.128543 0.677038 0.304697 0.15253 0.683855 0.301149 0.17663 0.681198 0.30893 0.20632 0.676425 0.308084 0.225282 0.680138 0.300484 0.254223 0.680886 0.306758 0.283259 0.681429 0.306225 0.308661 0.675392 0.305256 0.325743 0.677789 0.308233 0.353608 0.678195 0.307844 0.381382 0.681042 0.306968 0.401655 0.683041 0.30901 0.434309 0.677702 0.303639 0.450741 0.680255 0.304542 0.482824 0.682425 0.333045 0.000411837 0.677831 0.330846 0.0318106 0.683242 0.331771 0.0544388 0.684884 0.327215 0.0806555 0.677504 0.32737 0.105297 0.684996 0.33042 0.130424 0.680617 0.330726 0.156216 0.681654 0.331563 0.179716 0.681894 0.327091 0.207859 0.67512 0.331939 0.225382 0.675186 0.329045 0.259242 0.680394 0.329936 0.284871 0.67732 0.334689 0.300089 0.679857 0.326341 0.329821 0.677851 0.328501 0.352978 0.680891 0.330234 0.377127 0.676027 0.328952 0.404222 0.681251 0.326537 0.431872 0.683184 0.330921 0.450058 0.679124 0.328917 0.484127 0.681485 0.355065 0.00776388 0.683756 0.358657 0.0260782 0.676922 0.356094 0.0578095 0.680997 0.35599 0.0754721 0.677621 0.35442 0.100344 0.679762 0.353845 0.13067 0.678867 0.354921 0.155519 0.67543 0.354099 0.180815 0.682811 0.354664 0.204135 0.682802 0.35954 0.234803 0.676658 0.359056 0.258087 0.676786 0.351574 0.282807 0.676192 0.353207 0.303007 0.684431 0.358475 0.325338 0.678147 0.353842 0.35224 0.684231 0.356912 0.379712 0.678352 0.355613 0.400847 0.684581 0.35202 0.426231 0.683485 0.357565 0.457983 0.678136 0.359942 0.477823 0.679583 0.376878 0.00112224 0.683725 0.381029 0.0282901 0.679039 0.376232 0.0530064 0.681778 0.378919 0.0796353 0.679758 0.38453 0.106286 0.68291 0.378626 0.126459 0.681831 0.377544 0.153386 0.679134 0.377951 0.184936 0.679985 0.384209 0.201046 0.683325 0.376552 0.232603 0.676595 0.375545 0.259811 0.675797 0.376323 0.282506 0.677996 0.38022 0.301107 0.67592 0.378505 0.325925 0.675334 0.382945 0.35418 0.682052 0.379982 0.375705 0.684283 0.375428 0.4025 0.678395 0.383807 0.430712 0.677401 0.382312 0.458378 0.682694 0.381216 0.475783 0.681993 0.409579 0.0039016 0.67783 0.403529 0.0325404 0.683908 0.400483 0.0521537 0.682857 0.409727 0.0789423 0.680337 0.400897 0.108929 0.683042 0.409638 0.13284 0.684307 0.404621 0.15404 0.679022 0.40195 0.182897 0.683535 0.404062 0.209745 0.678576 0.403739 0.226705 0.682214 0.40447 0.25219 0.678627 0.409675 0.28345 0.677173 0.404921 0.300765 0.678662 0.403493 0.326961 0.677396 0.406557 0.356776 0.684763 0.408633 0.383291 0.68322 0.408431 0.408802 0.68261 0.406937 0.426099 0.6778 0.404282 0.453388 0.676896 0.406315 0.482336 0.678124 0.42639 0.0067723 0.675518 0.432874 0.0270573 0.679738 0.427114 0.0558727 0.677365 0.430575 0.079203 0.684421 0.428711 0.103769 0.678864 0.426481 0.129844 0.682071 0.430277 0.155523 0.682463 0.434761 0.176295 0.681735 0.434889 0.207652 0.683011 0.430687 0.227293 0.676249 0.433314 0.251941 0.677701 0.430553 0.280216 0.684071 0.427471 0.303747 0.677908 0.425166 0.334171 0.684309 0.425711 0.354621 0.678751 0.429353 0.375133 0.675644 0.428868 0.407202 0.683625 0.425474 0.426525 0.680846 0.425986 0.456063 0.682364 0.430939 0.478955 0.680614 0.456668 0.00809148 0.679872 0.456655 0.0252864 0.678256 0.45735 0.0595538 0.678165 0.451834 0.0821489 0.68383 0.451241 0.10967 0.68355 0.455162 0.130329 0.681253 0.454792 0.152512 0.680855 0.459157 0.182112 0.680668 0.451359 0.207014 0.67762 0.459203 0.229582 0.682216 0.45611 0.259329 0.67934 0.455954 0.284712 0.677385 0.457614 0.307433 0.679334 0.454308 0.326385 0.682075 0.450654 0.35286 0.681292 0.45448 0.380204 0.676873 0.456552 0.406008 0.68408 0.454305 0.426729 0.677265 0.456066 0.458207 0.67841 0.451765 0.476613 0.683495 0.478013 0.000891673 0.684845 0.478843 0.0337081 0.675255 0.483737 0.0553842 0.684319 0.479985 0.0771296 0.680001 0.484428 0.108775 0.680422 0.475565 0.127544 0.684015 0.475676 0.152967 0.676726 0.484478 0.183364 0.676505 0.484654 0.202284 0.676057 0.481051 0.226735 0.682716 0.483618 0.254388 0.681838 0.482413 0.276702 0.678653 0.480022 0.308028 0.683071 0.480393 0.325781 0.676364 0.478956 0.353459 0.678595 0.48157 0.380731 0.678811 0.480882 0.407284 0.682925 0.47593 0.431809 0.678819 0.480121 0.459535 0.675098 0.483816 0.477874 0.679875 0.505256 0.00549214 0.682211 0.504117 0.0312284 0.680888 0.501723 0.0541309 0.67976 0.502794 0.0792516 0.677887 0.509926 0.102463 0.677786 0.508153 0.126002 0.680358 0.508648 0.155389 0.675495 0.502248 0.183339 0.683665 0.503965 0.201517 0.682583 0.502814 0.230622 0.68293 0.508793 0.25043 0.68037 0.500933 0.28348 0.679013 0.506594 0.30316 0.678321 0.50667 0.326602 0.679013 0.50258 0.356202 0.681255 0.50421 0.377635 0.683694 0.509237 0.40104 0.678954 0.502516 0.432996 0.684994 0.507258 0.459893 0.67521 0.501493 0.484047 0.681203 0.525402 0.00496732 0.680132 0.526421 0.0339046 0.675627 0.53253 0.0504466 0.683818 0.534322 0.0806924 0.675595 0.529012 0.106097 0.683638 0.52854 0.127096 0.679849 0.528634 0.153335 0.67887 0.527091 0.183482 0.676472 0.525011 0.202848 0.67952 0.533815 0.230171 0.677284 0.527847 0.25383 0.679464 0.527553 0.281101 0.682884 0.526433 0.305765 0.681907 0.529408 0.330459 0.67968 0.528766 0.356819 0.684417 0.527005 0.382968 0.679864 0.526091 0.404919 0.680899 0.529477 0.433814 0.676942 0.534872 0.458367 0.684251 0.531432 0.480061 0.679026 0.552942 0.00229192 0.682992 0.550293 0.0326614 0.683794 0.55393 0.0500754 0.680936 0.559309 0.0769313 0.679713 0.557939 0.103161 0.675689 0.558272 0.129988 0.681395 0.55892 0.158666 0.683901 0.559931 0.18218 0.68219 0.554541 0.207192 0.679734 0.551042 0.229058 0.680672 0.554543 0.251693 0.678037 0.552098 0.27547 0.684256 0.55837 0.300682 0.680298 0.552868 0.326811 0.676484 0.552947 0.354847 0.684698 0.557163 0.382854 0.677076 0.55002 0.403353 0.678656 0.558632 0.426141 0.675737 0.559308 0.455733 0.684141 0.556633 0.481231 0.682105 0.576426 0.00474908 0.68003 0.577986 0.0304542 0.678855 0.580209 0.054417 0.676907 0.58268 0.0840438 0.675653 0.584244 0.108593 0.684483 0.58344 0.125333 0.683855 0.582469 0.158484 0.679925 0.578697 0.177325 0.680174 0.578543 0.206596 0.683426 0.578095 0.232244 0.681096 0.581077 0.253093 0.678504 0.58099 0.280695 0.675773 0.579833 0.302745 0.67871 0.582869 0.328686 0.675516 0.575167 0.357757 0.678923 0.57515 0.376333 0.683372 0.580707 0.402918 0.677659 0.576573 0.426809 0.681842 0.580402 0.456857 0.684344 0.580933 0.479011 0.683526 0.601786 0.00412404 0.680938 0.609778 0.0275683 0.677714 0.603571 0.0505628 0.683717 0.605508 0.0773418 0.675835 0.602092 0.100163 0.680119 0.609354 0.132109 0.68433 0.601543 0.15452 0.684045 0.605739 0.175109 0.681696 0.601664 0.202237 0.684183 0.606704 0.233896 0.684798 0.601683 0.258093 0.678629 0.603454 0.278264 0.683592 0.609476 0.301015 0.684343 0.600718 0.329919 0.676044 0.606295 0.351792 0.681081 0.602019 0.378386 0.682898 0.606052 0.401746 0.68132 0.605125 0.432993 0.681036 0.600254 0.459699 0.678161 0.605383 0.484456 0.68338 0.631514 0.00301581 0.679805 0.628231 0.0290278 0.678331 0.631521 0.0541967 0.675595 0.630494 0.0781701 0.681914 0.627982 0.10808 0.679206 0.631973 0.127513 0.675281 0.625352 0.150059 0.684768 0.632541 0.181849 0.681802 0.627663 0.201947 0.684994 0.627879 0.233033 0.678405 0.633327 0.257268 0.68454 0.633032 0.28487 0.677311 0.62996 0.307634 0.679842 0.633179 0.33321 0.678937 0.630557 0.355865 0.679751 0.629914 0.383444 0.683257 0.633206 0.407515 0.681463 0.63416 0.430158 0.676802 0.633025 0.458179 0.684652 0.634547 0.477961 0.67772 0.658073 0.00520667 0.684212 0.65142 0.0296365 0.681458 0.650685 0.0502076 0.677294 0.653827 0.0820952 0.683884 0.6594 0.105935 0.683258 0.653303 0.13404 0.681219 0.65606 0.153439 0.676721 0.654419 0.182671 0.683133 0.658488 0.208295 0.684105 0.652167 0.232038 0.682821 0.652316 0.25437 0.683727 0.65119 0.279995 0.682395 0.65631 0.303303 0.681327 0.650884 0.331818 0.682726 0.65536 0.352376 0.683405 0.650456 0.375225 0.676213 0.655397 0.401933 0.6804 0.653879 0.434868 0.679785 0.652167 0.457977 0.682209 0.65152 0.476263 0.676866 0.680349 0.00507748 0.676092 0.682886 0.0292902 0.682548 0.67935 0.0559744 0.677655 0.683914 0.0829081 0.682975 0.683114 0.109093 0.682823 0.684537 0.132453 0.682351 0.678585 0.159333 0.676982 0.678203 0.178384 0.679542 0.678943 0.200652 0.683416 0.681721 0.23214 0.677086 0.68207 0.255106 0.684515 0.676812 0.280067 0.676234 0.684702 0.300122 0.676227 0.67777 0.328332 0.678597 0.684116 0.358384 0.681292 0.678042 0.381085 0.679292 0.676078 0.407817 0.679673 0.680904 0.427538 0.675409 0.683447 0.451416 0.67569 0.677659 0.484459 0.678903 0.709996 0.000406263 0.681884 0.70261 0.0317925 0.680009 0.703191 0.0550439 0.678945 0.702839 0.077498 0.683705 0.704764 0.109944 0.680547 0.703886 0.131564 0.677271 0.70188 0.157975 0.683906 0.708801 0.180086 0.677684 0.707462 0.208256 0.67915 0.70131 0.227992 0.675591 0.708525 0.255548 0.681268 0.703712 0.282148 0.679805 0.705664 0.308896 0.675532 0.704127 0.32505 0.680707 0.708771 0.355381 0.682567 0.70785 0.382832 0.680739 0.701681 0.405117 0.683215 0.704824 0.426918 0.681343 0.707788 0.459216 0.678985 0.702937 0.483442 0.684043 0.730282 0.00911866 0.675921 0.729658 0.0334583 0.676392 0.730614 0.0522543 0.675718 0.732137 0.0837825 0.675747 0.731691 0.107395 0.678372 0.725332 0.1262 0.68223 0.728545 0.1573 0.682214 0.729418 0.184915 0.678603 0.732195 0.202876 0.678251 0.726352 0.225449 0.681364 0.728603 0.257005 0.683687 0.728734 0.282212 0.677214 0.734663 0.303647 0.68347 0.729725 0.333505 0.676478 0.734285 0.354654 0.681392 0.732369 0.379478 0.682157 0.725848 0.403424 0.677907 0.734656 0.429689 0.677214 0.733591 0.450368 0.681136 0.728464 0.475633 0.709044 0.00968594 0.00247101 0.701836 0.00211406 0.0259005 0.701886 0.00269309 0.0536771 0.702507 0.00846464 0.0793901 0.703893 0.00936481 0.101829 0.703613 0.00486961 0.130334 0.702608 0.00543123 0.155531 0.70153 0.000303719 0.178275 0.705255 0.0075751 0.205253 0.707014 0.00735811 0.226148 0.705983 0.00899505 0.258381 0.706496 0.000587517 0.276534 0.705143 0.00576963 0.304303 0.708149 0.00600155 0.328434 0.701921 0.000489247 0.354676 0.700239 0.00280064 0.381681 0.708234 0.00975696 0.403888 0.708203 0.00611296 0.429428 0.706072 0.00742024 0.454549 0.705122 0.0063243 0.482911 0.703021 0.0308221 0.000256269 0.703564 0.0278909 0.0292353 0.700882 0.0342023 0.0574358 0.707623 0.026522 0.0819024 0.700159 0.032344 0.106793 0.705201 0.0252001 0.128452 0.70168 0.0323965 0.159714 0.703972 0.0316329 0.18003 0.705319 0.0254484 0.206758 0.700597 0.0256448 0.234049 0.706412 0.0271646 0.258171 0.70358 0.0261247 0.277025 0.709101 0.0304936 0.306876 0.702054 0.0250093 0.330316 0.700598 0.0281503 0.354165 0.707584 0.0294993 0.378063 0.705403 0.0314741 0.402854 0.701852 0.0344587 0.42997 0.701341 0.0282102 0.454993 0.706012 0.0274098 0.476399 0.706961 0.058087 0.00266782 0.70144 0.0532837 0.0347977 0.700471 0.0558581 0.05135 0.701884 0.0500277 0.0812599 0.70003 0.0510066 0.107024 0.706593 0.0516155 0.131288 0.705356 0.0564217 0.154262 0.707659 0.0536767 0.179056 0.701625 0.058629 0.208579 0.708065 0.0519511 0.231061 0.700976 0.0514095 0.252892 0.705372 0.0572016 0.275216 0.701917 0.0524058 0.303184 0.701713 0.0508656 0.33293 0.701385 0.0558714 0.35968 0.708656 0.0568361 0.38335 0.700734 0.0500766 0.402155 0.709045 0.0556642 0.427957 0.706783 0.0592003 0.459953 0.702534 0.0535429 0.484067 0.702412 0.0843043 0.00488981 0.708631 0.0774864 0.0286882 0.701698 0.0772292 0.0552713 0.705968 0.07707 0.0828227 0.704093 0.0790511 0.105313 0.7074 0.0774035 0.132258 0.703918 0.0781614 0.158921 0.706095 0.0770653 0.181654 0.702904 0.0836066 0.203849 0.704471 0.0801017 0.225386 0.705198 0.0791268 0.256312 0.70068 0.0803455 0.284713 0.701121 0.0785649 0.302847 0.706343 0.0778754 0.329237 0.706709 0.0754588 0.355287 0.703655 0.0752858 0.380067 0.701536 0.0787908 0.407502 0.702886 0.0828138 0.428414 0.701848 0.0843687 0.451812 0.7048 0.0807937 0.477393 0.708741 0.103019 0.00498003 0.707049 0.106498 0.0310495 0.709269 0.105967 0.0551972 0.709224 0.103601 0.0818202 0.704414 0.106179 0.101258 0.70542 0.108357 0.134329 0.701756 0.101712 0.156316 0.700899 0.104858 0.181284 0.703858 0.104778 0.201399 0.701063 0.102523 0.23033 0.704432 0.101719 0.259405 0.701019 0.100074 0.27815 0.707808 0.104116 0.303984 0.708163 0.109832 0.332379 0.705246 0.103012 0.357679 0.700488 0.106195 0.384567 0.702973 0.103135 0.402085 0.700369 0.100281 0.429303 0.70419 0.100084 0.45938 0.703705 0.100603 0.47564 0.70987 0.133209 0.000564636 0.700855 0.130101 0.0289417 0.706256 0.133038 0.0510338 0.70057 0.129579 0.0801294 0.709565 0.128885 0.1053 0.703465 0.132662 0.128565 0.709015 0.132387 0.159929 0.705999 0.127553 0.176506 0.707045 0.129931 0.202717 0.706351 0.134172 0.226935 0.704521 0.125217 0.257416 0.702263 0.128523 0.283822 0.707674 0.126134 0.305313 0.704564 0.131762 0.334464 0.708959 0.126126 0.357073 0.703242 0.131223 0.384438 0.701773 0.13098 0.408866 0.707609 0.125763 0.426215 0.702435 0.125928 0.45846 0.700779 0.129954 0.476132 0.707582 0.152239 0.00188424 0.705223 0.150117 0.0297107 0.707153 0.158765 0.0539332 0.709155 0.152027 0.0779245 0.704103 0.15681 0.105601 0.707019 0.154886 0.13095 0.709957 0.152835 0.156196 0.702408 0.150131 0.17985 0.706634 0.157037 0.200143 0.703343 0.150158 0.228501 0.706188 0.159398 0.251114 0.701566 0.151916 0.27642 0.700613 0.15471 0.307243 0.70899 0.158533 0.3258 0.705733 0.158943 0.359302 0.701402 0.159004 0.375238 0.705118 0.15871 0.403277 0.703552 0.158371 0.425043 0.709961 0.151298 0.451462 0.70338 0.151451 0.481593 0.709478 0.179721 0.00614894 0.701271 0.176536 0.0345572 0.704474 0.178826 0.0541642 0.707886 0.180404 0.0815486 0.703615 0.175728 0.101445 0.705505 0.184229 0.132874 0.70783 0.183521 0.152203 0.702485 0.183972 0.176236 0.700624 0.175489 0.20474 0.703447 0.17932 0.232623 0.709772 0.176554 0.250775 0.707071 0.182876 0.279539 0.704492 0.182398 0.308509 0.702558 0.182204 0.331833 0.704388 0.183361 0.350205 0.702685 0.180553 0.377158 0.704758 0.181974 0.400745 0.702459 0.178637 0.428408 0.707836 0.181462 0.459907 0.700122 0.175515 0.483854 0.706083 0.20451 0.00352366 0.702688 0.203114 0.0299641 0.706778 0.208469 0.0586286 0.702028 0.203848 0.0755918 0.704538 0.202594 0.109857 0.704872 0.206368 0.128336 0.701092 0.207884 0.15902 0.708071 0.204952 0.176812 0.703732 0.20154 0.206488 0.706321 0.208693 0.22894 0.70235 0.207948 0.255345 0.705155 0.205554 0.279271 0.705342 0.200081 0.304894 0.703895 0.200221 0.325705 0.701296 0.20843 0.350168 0.702121 0.203593 0.376253 0.707123 0.207691 0.407581 0.702025 0.205551 0.433886 0.70242 0.200632 0.455373 0.702483 0.206007 0.484419 0.70199 0.232876 0.00764287 0.705873 0.233578 0.0251458 0.709636 0.232283 0.0535439 0.706594 0.23034 0.0796077 0.708315 0.225915 0.106056 0.700686 0.231756 0.131702 0.703156 0.226137 0.151114 0.70114 0.225426 0.183377 0.701309 0.232452 0.20881 0.706165 0.229785 0.231845 0.706391 0.2303 0.255492 0.7046 0.233378 0.28437 0.709563 0.226754 0.309041 0.701952 0.23089 0.326114 0.701962 0.230026 0.355371 0.700635 0.234472 0.384587 0.708709 0.231376 0.402988 0.707901 0.23404 0.428086 0.704905 0.232454 0.459587 0.701297 0.225095 0.481541 0.704311 0.252549 0.00183168 0.703273 0.259863 0.0327862 0.707324 0.2537 0.0530734 0.700243 0.252174 0.0759755 0.709852 0.252361 0.109173 0.709161 0.258417 0.128952 0.704093 0.250383 0.153911 0.705314 0.251959 0.183476 0.70884 0.257177 0.209714 0.701906 0.257799 0.233855 0.701877 0.252259 0.258192 0.705008 0.251814 0.280657 0.706155 0.259867 0.303183 0.704601 0.257812 0.334277 0.700285 0.2584 0.356812 0.705565 0.256997 0.380866 0.705714 0.257027 0.407055 0.703675 0.259079 0.428187 0.702359 0.254706 0.452642 0.703143 0.255084 0.475107 0.705152 0.283106 0.00639305 0.70646 0.281358 0.0251337 0.703035 0.275442 0.0573563 0.708256 0.284681 0.075294 0.703613 0.280436 0.102246 0.709162 0.284052 0.131594 0.706299 0.280379 0.153921 0.709415 0.281782 0.184655 0.70375 0.282499 0.205341 0.707242 0.27546 0.230238 0.700475 0.277904 0.255204 0.707441 0.277227 0.283984 0.701226 0.280213 0.307138 0.708361 0.276072 0.330052 0.703602 0.283515 0.357897 0.706826 0.276402 0.379297 0.704124 0.275806 0.409215 0.702152 0.275775 0.430735 0.708014 0.284264 0.457912 0.701909 0.282801 0.481974 0.705659 0.302273 0.00683294 0.708537 0.3083 0.0287493 0.701706 0.30922 0.0525103 0.702626 0.309277 0.0843758 0.708341 0.305218 0.10677 0.7036 0.306387 0.130796 0.709492 0.306813 0.151606 0.701624 0.309775 0.183968 0.708276 0.302692 0.200147 0.707259 0.308254 0.23052 0.705707 0.309008 0.257172 0.70426 0.30842 0.275712 0.708893 0.30274 0.301003 0.702746 0.305029 0.326418 0.702492 0.30358 0.353585 0.708233 0.306978 0.383594 0.703079 0.300755 0.402637 0.703224 0.307236 0.42885 0.709723 0.307353 0.45138 0.706451 0.303898 0.477196 0.708057 0.333146 0.00887851 0.704168 0.328475 0.0256565 0.709217 0.329848 0.0527486 0.706485 0.332922 0.0817571 0.704534 0.326724 0.102908 0.701512 0.325685 0.133232 0.702857 0.332416 0.154473 0.70209 0.329402 0.180751 0.709438 0.331691 0.204532 0.709271 0.332198 0.23036 0.701292 0.333326 0.255716 0.706562 0.327199 0.278058 0.703323 0.330206 0.30889 0.707482 0.33403 0.328189 0.702391 0.334278 0.356533 0.707047 0.325757 0.383889 0.700201 0.332607 0.407696 0.702045 0.328061 0.432185 0.700927 0.325188 0.453218 0.701521 0.329614 0.480109 0.709706 0.353028 0.00396097 0.704413 0.356899 0.0317226 0.708287 0.357643 0.058241 0.702384 0.353338 0.0788405 0.70227 0.354189 0.104642 0.707175 0.353133 0.134382 0.702217 0.350746 0.15271 0.709097 0.357204 0.184762 0.705071 0.359542 0.203128 0.704425 0.356456 0.234365 0.706724 0.352954 0.254962 0.706753 0.354776 0.279449 0.705326 0.356961 0.306603 0.705383 0.351771 0.32545 0.704796 0.358576 0.35922 0.703175 0.356089 0.382943 0.702883 0.352196 0.407069 0.709993 0.353293 0.426346 0.706217 0.35542 0.457473 0.707008 0.350969 0.477646 0.703568 0.378115 0.000564033 0.704156 0.376828 0.0313002 0.707787 0.380303 0.0571975 0.707167 0.379007 0.0758965 0.700485 0.381088 0.106524 0.704665 0.380586 0.127643 0.707903 0.375297 0.158627 0.706258 0.382185 0.180389 0.702143 0.377945 0.209353 0.703754 0.384239 0.229094 0.704801 0.375183 0.251565 0.709463 0.380575 0.275183 0.703204 0.383035 0.301493 0.706268 0.379245 0.333933 0.701759 0.375172 0.351743 0.705664 0.382056 0.380469 0.707648 0.377572 0.402278 0.70854 0.383365 0.428322 0.700819 0.378927 0.456309 0.709946 0.37561 0.481736 0.70186 0.403404 0.00877979 0.704034 0.403479 0.0305719 0.70293 0.405761 0.0527674 0.709406 0.400422 0.0805334 0.700414 0.401688 0.103964 0.702311 0.403224 0.133076 0.709022 0.404967 0.153758 0.706326 0.401398 0.180727 0.704123 0.402659 0.207738 0.702634 0.407575 0.226852 0.706909 0.400965 0.254128 0.701161 0.401343 0.279052 0.704188 0.405462 0.307722 0.703307 0.40222 0.333776 0.700045 0.408562 0.35719 0.709799 0.402467 0.378811 0.709198 0.404203 0.40754 0.701144 0.400725 0.433787 0.709093 0.400615 0.453827 0.705445 0.400155 0.479781 0.70147 0.426087 0.000584596 0.700094 0.431167 0.0268411 0.707765 0.434788 0.0536081 0.701136 0.431342 0.07865 0.704044 0.430611 0.109996 0.70339 0.427542 0.130654 0.703186 0.425396 0.158575 0.707967 0.428181 0.182545 0.700081 0.426708 0.200196 0.703403 0.426189 0.226992 0.704497 0.430517 0.252413 0.700938 0.43082 0.282301 0.707724 0.431897 0.309781 0.70801 0.427282 0.328416 0.704061 0.43304 0.354765 0.706017 0.425624 0.382834 0.708512 0.428719 0.408897 0.701373 0.43469 0.428985 0.704503 0.432998 0.459228 0.701299 0.427592 0.480263 0.708601 0.456844 0.00898361 0.701905 0.459983 0.0319805 0.704026 0.452796 0.0557249 0.702595 0.45728 0.0808731 0.704342 0.457524 0.1078 0.706446 0.453723 0.133629 0.707854 0.453615 0.152434 0.700573 0.453462 0.176537 0.706867 0.456828 0.20515 0.709495 0.452475 0.228036 0.706963 0.456654 0.258031 0.706709 0.452031 0.277382 0.701337 0.456972 0.303166 0.701367 0.456078 0.326948 0.707066 0.454764 0.352858 0.708373 0.459096 0.382143 0.702351 0.455851 0.401382 0.702399 0.456778 0.430918 0.702498 0.455612 0.453726 0.706882 0.45053 0.48324 0.706944 0.483699 0.00922946 0.709436 0.479933 0.0312545 0.706475 0.475625 0.0547414 0.704228 0.481028 0.0799668 0.70474 0.480751 0.103696 0.709805 0.477568 0.125594 0.70227 0.477593 0.158962 0.705447 0.476179 0.183745 0.702637 0.484567 0.2055 0.700233 0.483252 0.232807 0.709059 0.478861 0.258378 0.700631 0.475684 0.28276 0.700162 0.481751 0.304611 0.708839 0.484255 0.334473 0.702437 0.480337 0.353044 0.707718 0.482381 0.375022 0.704993 0.483289 0.40278 0.706606 0.479045 0.432487 0.707317 0.479975 0.451845 0.709411 0.479402 0.483462 0.704629 0.500601 0.00297234 0.706789 0.501812 0.0332323 0.700826 0.502754 0.0548984 0.702565 0.509062 0.0804542 0.70553 0.506169 0.100422 0.701671 0.502277 0.13372 0.703964 0.504179 0.150935 0.709506 0.50078 0.182796 0.701063 0.501643 0.208122 0.702949 0.502721 0.230356 0.703586 0.501848 0.256817 0.709265 0.503714 0.278791 0.702141 0.501674 0.307882 0.706002 0.503579 0.325504 0.704457 0.502234 0.352757 0.704317 0.501318 0.383321 0.70252 0.505126 0.401962 0.707272 0.505354 0.425446 0.704864 0.504327 0.457769 0.70983 0.501641 0.482765 0.70445 0.529239 0.00633731 0.705025 0.533901 0.0280691 0.706887 0.53168 0.0595646 0.707839 0.527036 0.0818036 0.709834 0.532016 0.104941 0.705808 0.531733 0.13274 0.703818 0.532535 0.150746 0.706244 0.526681 0.177694 0.70963 0.529393 0.201015 0.704944 0.528019 0.234211 0.705429 0.533365 0.255104 0.70073 0.527742 0.282848 0.707191 0.525417 0.301784 0.70918 0.529916 0.328498 0.706339 0.533227 0.350436 0.708237 0.527494 0.383606 0.704071 0.534838 0.401972 0.70224 0.528176 0.430865 0.701406 0.530055 0.456212 0.700369 0.526741 0.476296 0.7041 0.550545 0.00966201 0.700053 0.558281 0.0341914 0.704034 0.550068 0.0590815 0.70932 0.550478 0.0819588 0.709873 0.550696 0.100325 0.706951 0.552256 0.132894 0.701079 0.554216 0.157536 0.702825 0.55213 0.178862 0.706889 0.552907 0.205652 0.708677 0.550639 0.231523 0.700413 0.556547 0.259564 0.706886 0.558565 0.278939 0.70339 0.551534 0.308384 0.70355 0.553665 0.334462 0.701492 0.555825 0.357053 0.709383 0.551318 0.376897 0.70722 0.558054 0.401603 0.702152 0.557518 0.430434 0.703826 0.550187 0.455697 0.706162 0.550492 0.481742 0.705959 0.578238 0.00579374 0.705277 0.577567 0.0326378 0.705161 0.583283 0.0545609 0.706035 0.578133 0.0820204 0.70911 0.575876 0.103034 0.703087 0.579989 0.127256 0.708434 0.581646 0.150286 0.707732 0.577709 0.182035 0.704633 0.579109 0.209615 0.708255 0.580269 0.233145 0.700954 0.581111 0.254516 0.700969 0.576762 0.284668 0.709721 0.577959 0.304343 0.706764 0.578193 0.327143 0.708478 0.583365 0.351794 0.704217 0.575804 0.382076 0.70299 0.581841 0.404281 0.70065 0.580419 0.429341 0.702373 0.58219 0.458466 0.702666 0.583849 0.482303 0.702518 0.603041 0.00548814 0.702806 0.602129 0.0328065 0.707237 0.606988 0.0504491 0.70352 0.609266 0.0836544 0.709129 0.606247 0.107593 0.709461 0.602189 0.132636 0.70537 0.609838 0.150885 0.70979 0.609352 0.179229 0.704576 0.603006 0.205336 0.707659 0.607432 0.230433 0.700403 0.606735 0.25425 0.703757 0.602503 0.278156 0.709651 0.60177 0.301292 0.703352 0.601852 0.325608 0.706053 0.605916 0.35547 0.70344 0.608203 0.383542 0.702515 0.605258 0.404116 0.707982 0.608646 0.433412 0.704114 0.602357 0.454702 0.708714 0.60135 0.477623 0.704787 0.633867 0.00934 0.704143 0.625058 0.0280773 0.703974 0.630603 0.0569121 0.702819 0.633467 0.0837837 0.704077 0.626587 0.101832 0.702205 0.627018 0.125239 0.700599 0.630117 0.151141 0.702258 0.627762 0.181701 0.700898 0.629428 0.20379 0.702239 0.632731 0.231331 0.709241 0.627239 0.255757 0.706646 0.62753 0.283357 0.70449 0.628913 0.301118 0.708179 0.629041 0.334602 0.709274 0.633558 0.351205 0.705711 0.626084 0.383792 0.702351 0.628297 0.407104 0.702411 0.633754 0.426547 0.701447 0.626947 0.451312 0.704952 0.625843 0.484676 0.708591 0.653462 0.0017962 0.708898 0.65081 0.0282413 0.708207 0.652544 0.0534583 0.703662 0.657148 0.0816425 0.705174 0.655923 0.100904 0.705837 0.652631 0.130285 0.705317 0.652401 0.159536 0.709085 0.657974 0.177359 0.701274 0.657045 0.200393 0.705779 0.651875 0.230699 0.700146 0.659218 0.256231 0.701161 0.656475 0.282888 0.700056 0.65096 0.304474 0.702334 0.659923 0.332663 0.702084 0.658278 0.359549 0.701942 0.653117 0.375592 0.709965 0.657177 0.401056 0.70995 0.655468 0.434551 0.708755 0.658129 0.45454 0.708572 0.650128 0.484874 0.70205 0.676424 0.00185694 0.703109 0.677633 0.0324997 0.706933 0.682475 0.053779 0.70547 0.676754 0.0789982 0.703818 0.681759 0.104648 0.706366 0.679973 0.130091 0.704341 0.684819 0.154437 0.709687 0.676158 0.180224 0.708847 0.683756 0.204081 0.709191 0.680742 0.228328 0.701288 0.677192 0.252812 0.708576 0.68198 0.279019 0.704858 0.683982 0.300371 0.7034 0.679105 0.329801 0.704185 0.682654 0.351248 0.70395 0.681218 0.375306 0.708682 0.680732 0.402957 0.704038 0.684802 0.434762 0.704442 0.677444 0.456784 0.705485 0.677914 0.478921 0.706617 0.708981 0.00898736 0.701822 0.700576 0.0301931 0.70063 0.706562 0.0550752 0.704811 0.705701 0.0777842 0.702803 0.706815 0.104962 0.700518 0.707931 0.130165 0.70186 0.706419 0.150578 0.702529 0.708786 0.180085 0.705768 0.705565 0.208648 0.701761 0.705047 0.231841 0.700236 0.704747 0.253404 0.703353 0.706755 0.281974 0.705997 0.703012 0.307985 0.702611 0.703619 0.334012 0.707537 0.702458 0.350214 0.700165 0.700621 0.380196 0.701913 0.709117 0.40343 0.704397 0.703851 0.427549 0.709762 0.70019 0.456918 0.709396 0.701701 0.476663 0.701928 0.732805 0.00018094 0.70083 0.733552 0.0307129 0.705046 0.726151 0.0526603 0.706811 0.73294 0.080396 0.700039 0.730399 0.101005 0.706691 0.725318 0.12872 0.709273 0.733008 0.150523 0.701273 0.734738 0.179431 0.707984 0.726098 0.208812 0.70735 0.727145 0.230961 0.706315 0.728289 0.250752 0.701781 0.730615 0.278287 0.709188 0.729664 0.309323 0.702475 0.725653 0.330981 0.709453 0.73239 0.357168 0.7004 0.727365 0.384351 0.70693 0.734472 0.407779 0.702356 0.731603 0.431918 0.708793 0.734992 0.459141 0.706268 0.73092 0.481983 0.734599 0.000999679 0.00289901 0.726669 0.00601822 0.0321164 0.734159 0.00795417 0.0573477 0.732639 0.00270418 0.0761773 0.725017 0.00331355 0.105588 0.73199 0.00319254 0.13373 0.725471 0.00546045 0.156034 0.728917 0.00287345 0.177131 0.733984 0.008325 0.207113 0.726287 0.00293352 0.228229 0.725397 0.0048764 0.252132 0.730258 0.00579681 0.283866 0.733169 0.00459448 0.30066 0.725686 0.00695238 0.331991 0.733185 0.000261093 0.359083 0.731025 0.000251326 0.38398 0.731732 0.00691841 0.404029 0.732184 0.00924394 0.427916 0.72623 0.00015854 0.452226 0.726026 0.00110408 0.479365 0.729579 0.0282292 0.00833823 0.726424 0.0332607 0.0338125 0.732839 0.0290382 0.0519974 0.725908 0.0311085 0.0751967 0.727556 0.0326916 0.105429 0.729318 0.0276958 0.129006 0.727624 0.0287914 0.159927 0.734684 0.0346961 0.184217 0.728399 0.0300286 0.203475 0.731681 0.0256112 0.229179 0.730513 0.0259034 0.251431 0.727338 0.025277 0.277151 0.728633 0.0257539 0.308219 0.730416 0.0286823 0.328107 0.727993 0.0284351 0.354844 0.726628 0.0321314 0.376516 0.730309 0.0252896 0.40429 0.725543 0.0295346 0.429165 0.730986 0.0335947 0.451295 0.733324 0.0321485 0.477883 0.726399 0.0500452 0.00394812 0.728645 0.0529012 0.0299029 0.729039 0.0545262 0.0580004 0.734211 0.058688 0.0841914 0.726461 0.0590255 0.10711 0.733506 0.0578872 0.128502 0.734948 0.0537475 0.153977 0.733758 0.0540603 0.183878 0.731029 0.0570005 0.208001 0.728912 0.058546 0.23067 0.728602 0.0544505 0.252338 0.732563 0.0564725 0.277507 0.727761 0.056742 0.307784 0.731069 0.0526993 0.331736 0.728071 0.0503196 0.354931 0.73368 0.0558153 0.375128 0.728162 0.0533272 0.404997 0.734941 0.0562166 0.429065 0.730492 0.0545859 0.450718 0.734259 0.0579826 0.48396 0.726577 0.0785015 0.00385197 0.725177 0.0834341 0.0300206 0.734264 0.081347 0.0588215 0.728057 0.083253 0.0837376 0.728643 0.0810333 0.105103 0.725239 0.0829869 0.126652 0.727718 0.0776232 0.155321 0.725535 0.0779337 0.182543 0.732762 0.0837929 0.2021 0.729013 0.0758535 0.229225 0.731682 0.0807793 0.251753 0.734056 0.0833711 0.275598 0.727977 0.0818388 0.301351 0.730404 0.0800064 0.331077 0.734198 0.0796147 0.354819 0.726048 0.0845847 0.3815 0.725389 0.0804393 0.408825 0.73046 0.0797214 0.429674 0.733593 0.0821538 0.455196 0.72783 0.0802677 0.477265 0.727767 0.103035 0.00055221 0.727116 0.10064 0.0260951 0.730829 0.101678 0.0578251 0.734446 0.10341 0.0843918 0.725797 0.107423 0.105019 0.732875 0.107293 0.133399 0.726859 0.109314 0.152967 0.734788 0.105123 0.181322 0.726719 0.107721 0.200199 0.730338 0.108466 0.23498 0.734852 0.100197 0.252998 0.728159 0.109761 0.283306 0.726397 0.1091 0.305776 0.733521 0.10795 0.32626 0.728644 0.106263 0.353067 0.72521 0.104588 0.383045 0.733722 0.104168 0.400609 0.725011 0.101448 0.427002 0.726618 0.106723 0.457709 0.72798 0.108152 0.47559 0.733286 0.131792 0.00248145 0.730193 0.132437 0.0297438 0.72702 0.133565 0.051301 0.73094 0.125274 0.0791331 0.730234 0.126774 0.105724 0.731635 0.130297 0.130861 0.725275 0.134554 0.158379 0.726035 0.133975 0.181414 0.728934 0.133225 0.207806 0.730157 0.132935 0.230596 0.733381 0.13247 0.253413 0.733624 0.132554 0.275733 0.733478 0.134802 0.30724 0.726692 0.125408 0.334021 0.73447 0.133219 0.356531 0.729733 0.128801 0.383883 0.734174 0.12566 0.407161 0.727568 0.127676 0.425775 0.733989 0.125127 0.456993 0.730706 0.1346 0.477795 0.726048 0.159662 0.00526629 0.728903 0.152817 0.032926 0.730924 0.159749 0.0551732 0.73425 0.158003 0.0811923 0.726343 0.154914 0.10612 0.726017 0.150978 0.125427 0.734592 0.159891 0.153572 0.732025 0.157457 0.175121 0.731206 0.157094 0.20434 0.725736 0.155397 0.226031 0.732698 0.156707 0.250428 0.731932 0.159135 0.281636 0.732725 0.159756 0.301293 0.731776 0.1514 0.327806 0.725854 0.15481 0.355224 0.727448 0.154051 0.382172 0.726576 0.152074 0.406535 0.731474 0.155912 0.429509 0.730107 0.156527 0.453285 0.728826 0.156443 0.476928 0.725486 0.184342 0.00239513 0.730638 0.177261 0.0271302 0.728324 0.184868 0.058553 0.734518 0.184285 0.0788806 0.732035 0.181728 0.103414 0.728477 0.183723 0.134294 0.730574 0.179652 0.156015 0.726307 0.181013 0.177458 0.725916 0.180531 0.205595 0.727087 0.180004 0.228478 0.733844 0.179516 0.252166 0.734523 0.184842 0.278315 0.730373 0.184871 0.305818 0.727036 0.176717 0.332928 0.729226 0.180393 0.357133 0.729416 0.177317 0.384674 0.73225 0.182018 0.402841 0.7287 0.176765 0.432771 0.725645 0.18143 0.45173 0.725824 0.180943 0.484082 0.73179 0.201126 0.00493546 0.726389 0.209543 0.0253739 0.729751 0.204292 0.0578261 0.733171 0.200453 0.0807746 0.726332 0.208206 0.108618 0.731413 0.204121 0.129857 0.731961 0.205207 0.159279 0.734608 0.208146 0.175825 0.725428 0.207805 0.209658 0.730145 0.208441 0.234623 0.734905 0.204055 0.251475 0.733663 0.203999 0.284366 0.730185 0.202748 0.304545 0.73234 0.205269 0.328565 0.727687 0.206028 0.350788 0.725497 0.200301 0.375119 0.732987 0.203923 0.404083 0.733398 0.206806 0.425486 0.733173 0.202837 0.456335 0.732243 0.20132 0.482606 0.733967 0.234567 0.00335972 0.726388 0.227869 0.0294006 0.72556 0.227969 0.0580185 0.727677 0.23495 0.0763675 0.731044 0.227832 0.104956 0.726336 0.234212 0.133518 0.727319 0.233855 0.159493 0.728522 0.233152 0.175688 0.731931 0.227987 0.207188 0.73091 0.229415 0.228308 0.732442 0.229796 0.25734 0.726336 0.22989 0.278156 0.729844 0.228018 0.302072 0.730111 0.234861 0.325463 0.732039 0.233892 0.358056 0.731306 0.23158 0.378277 0.732814 0.228424 0.400476 0.729014 0.226383 0.428605 0.727588 0.227659 0.459588 0.734323 0.229174 0.4797 0.727315 0.250602 0.00496181 0.725091 0.254363 0.0280129 0.731569 0.250283 0.0509288 0.725868 0.259912 0.0846952 0.725581 0.250757 0.105715 0.727039 0.252396 0.132808 0.728256 0.259082 0.151112 0.734917 0.253591 0.184707 0.727601 0.252011 0.206794 0.729462 0.256389 0.228019 0.73392 0.256485 0.251774 0.731213 0.259583 0.280316 0.730656 0.259166 0.309931 0.734978 0.259405 0.326629 0.733707 0.25113 0.356895 0.733609 0.259641 0.381086 0.733722 0.256163 0.40111 0.727406 0.258042 0.43456 0.726443 0.255219 0.450526 0.73218 0.254011 0.480665 0.730621 0.284825 0.00204459 0.730358 0.279266 0.0339083 0.731497 0.282485 0.0520807 0.734669 0.277147 0.0794644 0.733913 0.282312 0.108968 0.730756 0.284795 0.131488 0.727619 0.280543 0.157404 0.728327 0.275328 0.182266 0.732954 0.281339 0.205417 0.726264 0.281203 0.233708 0.729997 0.284514 0.258358 0.727107 0.278971 0.276451 0.730889 0.282437 0.303167 0.726193 0.28255 0.328234 0.732386 0.280998 0.359572 0.73462 0.283056 0.37519 0.730612 0.282295 0.406409 0.732777 0.278416 0.429115 0.728352 0.275145 0.456482 0.734437 0.281844 0.480012 0.732585 0.300752 0.00252051 0.73161 0.300715 0.0267125 0.732846 0.300201 0.056518 0.727933 0.309189 0.0766753 0.734221 0.300685 0.10838 0.728171 0.304596 0.131654 0.72946 0.301583 0.155703 0.733333 0.304996 0.184167 0.731997 0.302529 0.202647 0.730259 0.306307 0.233238 0.733031 0.308926 0.255791 0.728294 0.301677 0.277991 0.732239 0.306315 0.301405 0.731653 0.308216 0.325421 0.733215 0.303531 0.355067 0.727949 0.303182 0.378513 0.73243 0.309976 0.400402 0.729788 0.309788 0.426272 0.725301 0.308809 0.45606 0.734687 0.303037 0.482984 0.732796 0.329562 0.000996395 0.733367 0.33436 0.0312537 0.726027 0.332642 0.0504181 0.729234 0.327781 0.0848068 0.7329 0.329418 0.106956 0.72511 0.32884 0.133775 0.727114 0.332368 0.159382 0.732023 0.332755 0.176446 0.732902 0.328077 0.204341 0.729749 0.330367 0.233357 0.728618 0.326454 0.254528 0.73212 0.333889 0.278005 0.726518 0.326446 0.309553 0.729409 0.32634 0.327728 0.730259 0.326996 0.359269 0.728646 0.331246 0.383567 0.727405 0.332182 0.409917 0.733075 0.327776 0.428867 0.727289 0.330985 0.455987 0.727916 0.327831 0.482761 0.732458 0.359086 0.00423377 0.72632 0.358697 0.0282043 0.730112 0.357008 0.055458 0.732401 0.354436 0.0783274 0.731473 0.354771 0.105978 0.733314 0.358983 0.134835 0.734184 0.355574 0.155469 0.73463 0.358094 0.178425 0.729602 0.353334 0.20123 0.728533 0.350124 0.225053 0.730228 0.357666 0.250334 0.72794 0.351524 0.278667 0.726407 0.352592 0.305137 0.728027 0.352617 0.327028 0.729655 0.356371 0.355579 0.734301 0.353575 0.376069 0.727108 0.355639 0.40134 0.733702 0.352683 0.431923 0.727447 0.353418 0.455678 0.728468 0.359148 0.479745 0.729384 0.382702 0.00623093 0.732185 0.381909 0.0308341 0.734546 0.376109 0.0528375 0.733691 0.381016 0.0799666 0.733969 0.383134 0.105402 0.727608 0.380771 0.134944 0.734776 0.379289 0.151813 0.731645 0.38304 0.183465 0.733131 0.380833 0.200814 0.7343 0.375319 0.226352 0.732152 0.377545 0.257321 0.732872 0.378713 0.283334 0.726205 0.384476 0.309962 0.727034 0.382306 0.326898 0.733585 0.379544 0.354325 0.731793 0.383322 0.382776 0.731687 0.382217 0.409933 0.728258 0.383325 0.427487 0.728707 0.381025 0.457206 0.725453 0.380991 0.483894 0.726516 0.407279 0.00042276 0.730777 0.402097 0.0271832 0.733107 0.406356 0.0563192 0.728902 0.406799 0.0830193 0.733201 0.400193 0.10737 0.73164 0.409637 0.128568 0.727575 0.403268 0.15181 0.734208 0.407504 0.179094 0.727147 0.40206 0.208288 0.726567 0.405858 0.228278 0.733863 0.40322 0.25662 0.729272 0.40905 0.279779 0.730237 0.403654 0.30824 0.731197 0.409137 0.331619 0.72578 0.404413 0.357805 0.726959 0.403177 0.383436 0.732313 0.402581 0.401707 0.734534 0.400914 0.430734 0.732482 0.40837 0.456528 0.732839 0.405744 0.483335 0.732236 0.426009 0.00671958 0.734401 0.433535 0.0329551 0.7322 0.428865 0.05902 0.729473 0.433598 0.0815125 0.731811 0.428347 0.108225 0.734076 0.431997 0.131021 0.728391 0.432345 0.159537 0.72844 0.426357 0.183897 0.733646 0.425967 0.203767 0.732761 0.429192 0.229298 0.734604 0.43233 0.250706 0.725086 0.42677 0.279863 0.732419 0.426784 0.305597 0.73072 0.427497 0.329748 0.728056 0.431224 0.359996 0.730362 0.434521 0.379286 0.734842 0.42892 0.404959 0.727722 0.434601 0.431013 0.727774 0.42778 0.454236 0.734547 0.430479 0.47875 0.72833 0.455426 0.000606424 0.732674 0.458256 0.0319478 0.729853 0.457817 0.0578915 0.72762 0.452332 0.0777129 0.73115 0.457222 0.100033 0.733602 0.457837 0.133445 0.72716 0.456815 0.158055 0.734411 0.455074 0.181377 0.726243 0.458055 0.207154 0.733351 0.457349 0.226167 0.732228 0.457355 0.25784 0.73135 0.45139 0.28264 0.728279 0.458017 0.309346 0.734038 0.456752 0.326654 0.731984 0.450124 0.355179 0.727973 0.454113 0.382902 0.734722 0.458424 0.403358 0.726157 0.450357 0.425185 0.729554 0.456864 0.450989 0.725688 0.455806 0.484582 0.730058 0.483634 0.00831518 0.728903 0.481835 0.0290606 0.728271 0.476343 0.0567431 0.729413 0.475259 0.0849288 0.731204 0.480692 0.103068 0.731279 0.481419 0.128092 0.73409 0.478526 0.158787 0.733327 0.482228 0.175934 0.726712 0.481821 0.208912 0.727566 0.483509 0.231733 0.726126 0.482718 0.25496 0.729407 0.480892 0.282845 0.733402 0.477233 0.300084 0.731097 0.480741 0.331391 0.728536 0.476871 0.357582 0.728786 0.478797 0.37961 0.728899 0.476334 0.407479 0.731732 0.477186 0.427131 0.726539 0.478454 0.457436 0.728962 0.477129 0.483572 0.734976 0.506886 0.00340228 0.731162 0.50942 0.0256127 0.732054 0.502606 0.0526225 0.730155 0.504096 0.0804351 0.734428 0.502504 0.100544 0.726869 0.5006 0.12921 0.731175 0.502616 0.158022 0.727742 0.501454 0.179882 0.728107 0.500113 0.209032 0.727442 0.507209 0.233718 0.733114 0.502333 0.259438 0.733759 0.508437 0.279777 0.730946 0.507538 0.304889 0.725476 0.508848 0.330754 0.733984 0.502792 0.357335 0.7335 0.502761 0.384481 0.728091 0.506803 0.408396 0.727747 0.503389 0.428259 0.725246 0.508221 0.459556 0.725806 0.508319 0.478928 0.72895 0.5263 0.00486732 0.728116 0.528189 0.0287579 0.725983 0.533599 0.0587018 0.730595 0.528463 0.0825369 0.727235 0.527725 0.104892 0.725857 0.530071 0.125936 0.726655 0.525041 0.156267 0.730648 0.530574 0.175204 0.725249 0.530302 0.208976 0.729209 0.5299 0.229548 0.734343 0.525308 0.252585 0.727871 0.531331 0.275245 0.727158 0.531826 0.309012 0.730963 0.53115 0.33077 0.731756 0.533635 0.35454 0.726766 0.525553 0.37658 0.727402 0.525526 0.408763 0.734166 0.525482 0.432114 0.73379 0.527641 0.45458 0.729325 0.528938 0.479377 0.730155 0.553648 0.00840837 0.732555 0.553699 0.0306349 0.73194 0.555128 0.0573004 0.729027 0.553791 0.0760495 0.734828 0.55354 0.106545 0.732385 0.554166 0.130905 0.732482 0.551855 0.158722 0.725211 0.550967 0.178556 0.731501 0.558244 0.202458 0.731796 0.551813 0.226351 0.734329 0.558733 0.258047 0.729134 0.55779 0.275613 0.732065 0.550142 0.30387 0.727075 0.552995 0.327988 0.725787 0.555833 0.359254 0.726273 0.554224 0.381221 0.725473 0.559934 0.401239 0.734855 0.550896 0.427958 0.730954 0.553082 0.457281 0.725491 0.555014 0.482023 0.734177 0.581485 0.000419475 0.727702 0.583822 0.0291213 0.729904 0.576935 0.0500573 0.729827 0.576975 0.077909 0.728457 0.576187 0.106391 0.731459 0.582973 0.129103 0.726576 0.576476 0.157343 0.728951 0.579766 0.18204 0.733494 0.579284 0.202887 0.734163 0.580254 0.228817 0.732923 0.57575 0.251684 0.7334 0.583171 0.276607 0.732814 0.578768 0.306051 0.733202 0.580954 0.327773 0.731423 0.575357 0.357147 0.7321 0.580458 0.384022 0.730728 0.579281 0.405494 0.733514 0.576005 0.425988 0.733787 0.575827 0.451404 0.729507 0.578259 0.479428 0.725127 0.606134 0.00800664 0.730838 0.606744 0.0297996 0.725302 0.607688 0.0547758 0.726839 0.609733 0.0751937 0.732111 0.600701 0.108029 0.730239 0.604201 0.134195 0.729674 0.609771 0.151767 0.733998 0.601634 0.176887 0.732116 0.603758 0.204288 0.727916 0.604828 0.230724 0.731946 0.608677 0.252182 0.728096 0.608094 0.279868 0.727414 0.608864 0.303796 0.72966 0.604962 0.328874 0.729537 0.600831 0.358032 0.730185 0.60628 0.377441 0.726857 0.607773 0.406737 0.729713 0.604287 0.431696 0.727029 0.605545 0.452099 0.730486 0.602055 0.483297 0.731663 0.633519 0.00846068 0.731122 0.631082 0.0282508 0.725988 0.62633 0.0542808 0.731661 0.628855 0.0798106 0.726975 0.631947 0.106592 0.73138 0.628307 0.126094 0.730057 0.625679 0.152895 0.729672 0.625362 0.178645 0.726 0.631842 0.201634 0.73307 0.628743 0.234862 0.729297 0.634902 0.252261 0.728387 0.633393 0.283917 0.725197 0.628535 0.301755 0.727735 0.630971 0.325547 0.7293 0.628638 0.352362 0.73104 0.62659 0.38082 0.730445 0.632262 0.406053 0.726053 0.627087 0.430814 0.726103 0.628593 0.455847 0.733191 0.633829 0.482965 0.731056 0.655074 0.003327 0.728933 0.651577 0.0268964 0.730049 0.651988 0.0564211 0.725125 0.653335 0.0806338 0.733304 0.653528 0.104413 0.732023 0.656978 0.132008 0.731387 0.653372 0.157587 0.729386 0.654885 0.184383 0.730647 0.651602 0.208002 0.731666 0.656828 0.225515 0.729859 0.653967 0.253378 0.731959 0.652317 0.275856 0.728694 0.652574 0.301292 0.729133 0.655513 0.334639 0.72547 0.657557 0.352067 0.734616 0.657231 0.380948 0.729102 0.651151 0.405165 0.734201 0.656097 0.425144 0.729898 0.657348 0.458696 0.725178 0.651051 0.482323 0.734979 0.679815 0.00722183 0.730412 0.683752 0.031245 0.728128 0.682045 0.0537343 0.731511 0.676565 0.0754347 0.727934 0.68069 0.106958 0.725861 0.68443 0.130147 0.729281 0.678749 0.159309 0.731388 0.68017 0.17827 0.73304 0.681549 0.203677 0.732398 0.680731 0.233524 0.729477 0.679058 0.254474 0.73201 0.676999 0.282631 0.726554 0.679904 0.306205 0.727106 0.682156 0.332705 0.729122 0.675939 0.350198 0.730788 0.676217 0.378497 0.733989 0.681082 0.401756 0.725906 0.682104 0.425027 0.73202 0.682371 0.458543 0.72952 0.682234 0.481469 0.734106 0.706416 0.000847576 0.725495 0.703864 0.0250953 0.72514 0.707384 0.0593759 0.731598 0.707541 0.0818564 0.731426 0.70312 0.103445 0.725639 0.706727 0.128599 0.730181 0.701687 0.159448 0.731286 0.703148 0.177379 0.734312 0.708142 0.204581 0.725305 0.703037 0.225687 0.73191 0.703477 0.250514 0.733234 0.701 0.275899 0.733442 0.709788 0.302678 0.728344 0.709173 0.33123 0.732718 0.70697 0.35508 0.732479 0.707864 0.380743 0.732218 0.701554 0.401508 0.734516 0.706928 0.426777 0.728312 0.702475 0.455228 0.731552 0.709413 0.476241 0.734382 0.726417 0.00396194 0.730605 0.725483 0.0326171 0.729782 0.730099 0.0537491 0.733639 0.734907 0.0816045 0.727663 0.7286 0.108015 0.732288 0.729164 0.132782 0.732367 0.726227 0.159515 0.733802 0.729113 0.175441 0.725909 0.730961 0.208991 0.727262 0.733519 0.233395 0.729788 0.73123 0.254877 0.734072 0.731844 0.283382 0.725877 0.734978 0.307622 0.73283 0.725211 0.328631 0.734489 0.731239 0.350989 0.731153 0.73358 0.376787 0.73106 0.727545 0.406606 0.729683 0.73299 0.434527 0.73202 0.730708 0.453811 0.725834 0.725768 0.479515 0.755891 0.00331361 0.00428048 0.752886 0.00314958 0.0304903 0.75619 0.00454374 0.0554063 0.757861 0.00791562 0.0824826 0.758902 0.00224111 0.10852 0.754893 0.00363447 0.130843 0.753686 0.00422415 0.150695 0.750775 0.00809945 0.176454 0.757429 0.0066103 0.206532 0.754692 0.00919927 0.234166 0.751484 0.00120354 0.252508 0.753231 0.00992323 0.28323 0.75593 0.00769204 0.302488 0.756691 0.00314221 0.329155 0.750231 0.00927192 0.358449 0.751995 0.00452899 0.384416 0.756599 0.00508296 0.409043 0.754434 0.00912835 0.430663 0.750631 0.00605451 0.45243 0.755639 0.00172325 0.477139 0.75363 0.0276635 0.00608208 0.758523 0.0341726 0.0347372 0.754936 0.0296981 0.0547095 0.750817 0.02645 0.0837303 0.750045 0.0331611 0.109338 0.757817 0.0330643 0.133484 0.750433 0.0265349 0.154831 0.756807 0.0311899 0.180296 0.759525 0.0330088 0.207842 0.754887 0.0323065 0.229278 0.758255 0.0323365 0.257122 0.7511 0.0329091 0.279455 0.756263 0.0330737 0.306026 0.759315 0.0322779 0.328286 0.752077 0.0261065 0.353493 0.759507 0.0250553 0.379136 0.751713 0.0318662 0.40843 0.753563 0.0289217 0.428632 0.758953 0.030361 0.450515 0.754372 0.0270182 0.480243 0.7515 0.0519816 0.000503817 0.750184 0.0572699 0.0324341 0.756459 0.0538787 0.0594291 0.752719 0.0502555 0.0760316 0.754147 0.0591859 0.102421 0.754825 0.0548293 0.129916 0.757917 0.0520568 0.158411 0.751843 0.0578413 0.17915 0.756051 0.0511173 0.206974 0.75215 0.0569295 0.229945 0.758075 0.0555897 0.255497 0.755067 0.0570193 0.284189 0.751979 0.0538949 0.30156 0.756211 0.0520409 0.334575 0.751481 0.0512237 0.359858 0.752888 0.0580393 0.38426 0.754902 0.0528248 0.405663 0.759038 0.0536571 0.42611 0.751895 0.0590726 0.455193 0.750128 0.0513125 0.476109 0.752922 0.0811588 0.00273504 0.752156 0.0772583 0.0271304 0.754294 0.0813681 0.0558438 0.75405 0.0840097 0.0755905 0.759404 0.0847605 0.101366 0.752359 0.0791629 0.125887 0.758148 0.0837569 0.157628 0.750855 0.0755476 0.181406 0.757 0.0822893 0.208462 0.752061 0.0815846 0.228304 0.757114 0.0802296 0.257475 0.75301 0.0789032 0.281798 0.759155 0.0798224 0.303859 0.754068 0.0801502 0.330846 0.752653 0.078602 0.359725 0.759998 0.0849567 0.384823 0.758104 0.0808689 0.404467 0.753019 0.0815512 0.426136 0.757467 0.0790084 0.450735 0.75333 0.0847272 0.475666 0.755445 0.100621 0.00834942 0.750339 0.107286 0.03112 0.755235 0.101157 0.0554093 0.758968 0.107698 0.0836992 0.756518 0.100628 0.107909 0.754536 0.106839 0.129607 0.750837 0.101917 0.159962 0.758005 0.107764 0.181285 0.759418 0.108481 0.202909 0.754278 0.104733 0.231394 0.755818 0.102164 0.259954 0.759063 0.109628 0.276046 0.752036 0.108513 0.300903 0.752107 0.100045 0.326045 0.75698 0.106383 0.354172 0.753138 0.101737 0.37819 0.759693 0.1041 0.405846 0.753009 0.106093 0.433475 0.757089 0.100296 0.455757 0.75641 0.104725 0.47571 0.752407 0.130215 0.00736609 0.754506 0.128495 0.0263918 0.750077 0.127356 0.0570475 0.75713 0.130553 0.0784916 0.75535 0.130007 0.109118 0.755511 0.125845 0.132481 0.754054 0.130208 0.153588 0.755377 0.129369 0.179861 0.751651 0.125209 0.206709 0.75605 0.127462 0.231027 0.752715 0.13076 0.252805 0.75593 0.127024 0.282296 0.751146 0.134016 0.304292 0.751954 0.133314 0.329061 0.754466 0.134149 0.350836 0.754463 0.13314 0.376223 0.757318 0.129078 0.405596 0.759961 0.133176 0.433522 0.752204 0.126107 0.456183 0.75087 0.130738 0.484351 0.752395 0.152751 0.00504216 0.753147 0.153843 0.0263976 0.75992 0.157821 0.0554344 0.753967 0.15536 0.0831375 0.754921 0.152507 0.108901 0.752225 0.15272 0.130207 0.753385 0.156797 0.155591 0.75259 0.157221 0.18096 0.757222 0.155202 0.204985 0.759911 0.159125 0.228044 0.755454 0.155135 0.25098 0.755894 0.155462 0.284577 0.751663 0.158979 0.303066 0.757107 0.156349 0.329971 0.754952 0.158431 0.35385 0.752473 0.151647 0.380778 0.7539 0.153102 0.401521 0.756948 0.150683 0.430819 0.755663 0.15882 0.455116 0.753668 0.151192 0.484773 0.750158 0.181676 0.00932546 0.755601 0.180823 0.0310964 0.756373 0.175878 0.0511305 0.751807 0.1787 0.0760235 0.75061 0.177625 0.105481 0.753853 0.177158 0.126178 0.757762 0.184671 0.15945 0.752306 0.181879 0.183051 0.75607 0.184587 0.200726 0.756748 0.180148 0.230357 0.759717 0.178507 0.259467 0.75872 0.175718 0.282119 0.754323 0.180605 0.302688 0.757551 0.17746 0.33353 0.756587 0.176424 0.355192 0.758678 0.184339 0.378849 0.751549 0.1782 0.405508 0.75875 0.177614 0.433862 0.755111 0.175269 0.457755 0.753591 0.183926 0.483585 0.754536 0.208095 0.00701044 0.755389 0.20287 0.0300168 0.75331 0.200928 0.0543043 0.756414 0.201524 0.0797322 0.758978 0.206522 0.100252 0.752326 0.200114 0.129405 0.750199 0.206894 0.150319 0.755346 0.202488 0.182322 0.756312 0.204633 0.205164 0.756603 0.20197 0.233232 0.75858 0.209375 0.251217 0.750899 0.208794 0.281455 0.756835 0.209406 0.309191 0.752634 0.202648 0.326248 0.752718 0.20157 0.351011 0.753586 0.202168 0.381126 0.755477 0.203093 0.401386 0.751751 0.207693 0.42624 0.751966 0.204904 0.455156 0.756586 0.204579 0.478846 0.751505 0.227428 0.00133566 0.758481 0.232393 0.0303918 0.751343 0.227973 0.0583813 0.755055 0.234667 0.0804817 0.756934 0.2274 0.105154 0.755018 0.225919 0.128121 0.752888 0.229863 0.157768 0.751619 0.231322 0.179399 0.755537 0.225655 0.204396 0.758283 0.227968 0.231437 0.753107 0.22546 0.255684 0.757393 0.23015 0.280237 0.754834 0.2338 0.30734 0.753079 0.229857 0.32802 0.753753 0.227426 0.355091 0.753425 0.228919 0.378043 0.754246 0.23277 0.404115 0.751509 0.225417 0.431136 0.75604 0.230625 0.452459 0.758551 0.234136 0.479844 0.750807 0.255634 0.00964902 0.756366 0.258958 0.0263999 0.753714 0.257135 0.0569428 0.75357 0.251296 0.08157 0.758608 0.253034 0.109362 0.751988 0.258058 0.133676 0.753276 0.25224 0.152019 0.756543 0.255725 0.181309 0.753613 0.25686 0.208766 0.754277 0.255287 0.233857 0.751361 0.252204 0.250513 0.750706 0.257511 0.284641 0.753143 0.250521 0.307316 0.755564 0.252571 0.333579 0.759551 0.252871 0.351523 0.751518 0.252196 0.377904 0.750443 0.2557 0.400454 0.75487 0.259167 0.425421 0.756736 0.253156 0.458376 0.756953 0.256576 0.476182 0.752938 0.282969 0.00917683 0.759122 0.283745 0.0289529 0.752984 0.280138 0.0582803 0.750337 0.275162 0.0790693 0.756601 0.281945 0.109834 0.752157 0.279463 0.126822 0.757321 0.277557 0.154203 0.755483 0.280263 0.175307 0.75408 0.276433 0.205213 0.751 0.284891 0.225514 0.754119 0.283734 0.257657 0.752977 0.280915 0.277709 0.756535 0.279491 0.30224 0.750014 0.282141 0.328632 0.759129 0.279168 0.352278 0.755443 0.280396 0.379644 0.756577 0.276689 0.408446 0.754204 0.27532 0.430545 0.750528 0.2809 0.454301 0.750206 0.277131 0.480308 0.755097 0.30467 0.00441376 0.751131 0.308652 0.0346243 0.752641 0.306917 0.0593488 0.754652 0.301555 0.0761767 0.758354 0.30906 0.108971 0.753694 0.300305 0.125521 0.758722 0.303044 0.159496 0.75295 0.309897 0.182987 0.753494 0.300886 0.208344 0.75225 0.303346 0.232001 0.754171 0.304549 0.259534 0.750767 0.30671 0.275298 0.753107 0.304981 0.30584 0.757328 0.302653 0.331728 0.755844 0.309639 0.35317 0.755786 0.308969 0.377685 0.759694 0.305917 0.4098 0.753179 0.301411 0.433441 0.75628 0.30074 0.454839 0.757788 0.307147 0.482899 0.753659 0.326218 0.000471035 0.756731 0.333447 0.0346611 0.75143 0.327452 0.0595722 0.759859 0.330315 0.0822204 0.757993 0.330073 0.100523 0.756794 0.325861 0.134109 0.756025 0.326806 0.155374 0.756877 0.328968 0.18277 0.756037 0.326153 0.204846 0.759575 0.332585 0.230463 0.754612 0.333433 0.250705 0.754376 0.333317 0.275967 0.757151 0.331116 0.307169 0.750347 0.333746 0.330939 0.757264 0.334933 0.354573 0.758557 0.326689 0.3826 0.757746 0.32706 0.409204 0.758317 0.332559 0.430979 0.754333 0.333377 0.451457 0.750598 0.33055 0.479266 0.750793 0.350559 0.00136468 0.755005 0.353186 0.0265796 0.752782 0.359087 0.0556482 0.7573 0.354775 0.0811736 0.756634 0.352639 0.107568 0.752514 0.35135 0.133364 0.759616 0.355682 0.15486 0.757973 0.350715 0.179576 0.757871 0.355551 0.203755 0.75051 0.353844 0.226413 0.753797 0.353417 0.256076 0.759508 0.35052 0.282263 0.754399 0.356453 0.305306 0.752283 0.352511 0.32538 0.753493 0.350129 0.355094 0.758693 0.350259 0.380661 0.754632 0.35615 0.400582 0.755347 0.359243 0.434035 0.758347 0.354081 0.457225 0.751698 0.351404 0.481907 0.751078 0.384184 0.000901232 0.759426 0.377323 0.0287388 0.758036 0.3807 0.0597204 0.754551 0.381229 0.0828 0.753016 0.379226 0.104185 0.759647 0.379758 0.128473 0.756198 0.379952 0.156186 0.757549 0.377003 0.180508 0.753872 0.380815 0.204342 0.750051 0.375465 0.229924 0.758888 0.378969 0.251235 0.758497 0.382219 0.282223 0.75344 0.377727 0.308888 0.758409 0.380226 0.325253 0.75626 0.37566 0.356535 0.750207 0.379612 0.379292 0.755349 0.378023 0.406935 0.758356 0.381851 0.431029 0.755899 0.375532 0.451219 0.752766 0.380717 0.47655 0.752767 0.402364 0.000947091 0.756362 0.400964 0.0332194 0.752996 0.401817 0.0540916 0.759907 0.404069 0.0822654 0.752446 0.402128 0.101898 0.755429 0.408194 0.132099 0.751797 0.401322 0.158366 0.755829 0.408775 0.180047 0.750663 0.402103 0.205672 0.752993 0.405452 0.229705 0.75103 0.402142 0.252791 0.756607 0.405727 0.279786 0.758742 0.409002 0.301896 0.759616 0.40845 0.331432 0.753402 0.408509 0.354247 0.751777 0.409799 0.378019 0.759776 0.405086 0.40645 0.756908 0.407161 0.428312 0.752034 0.400493 0.454481 0.75289 0.401211 0.478347 0.75825 0.434267 0.00859344 0.756096 0.432595 0.0311279 0.759611 0.426904 0.0580204 0.758012 0.427232 0.0835428 0.756958 0.432785 0.10918 0.752751 0.43185 0.126151 0.755081 0.432535 0.154893 0.753865 0.429466 0.183024 0.759397 0.425048 0.200489 0.752845 0.433132 0.232025 0.75731 0.42651 0.253276 0.750343 0.42613 0.282119 0.75431 0.427322 0.301631 0.751434 0.430245 0.330891 0.750893 0.426942 0.356095 0.758243 0.430618 0.384387 0.752986 0.428351 0.408581 0.758154 0.428409 0.434857 0.750494 0.434997 0.45689 0.758713 0.43103 0.480611 0.750052 0.459925 0.000412316 0.755363 0.454257 0.0324845 0.751877 0.454637 0.0535645 0.758132 0.452448 0.0804147 0.757765 0.450943 0.104962 0.75127 0.456152 0.13319 0.759138 0.450432 0.151174 0.751901 0.458057 0.17605 0.750125 0.45751 0.208575 0.754726 0.457829 0.22976 0.753496 0.451613 0.253441 0.754404 0.458674 0.276162 0.751718 0.456293 0.307131 0.752609 0.459675 0.32829 0.752897 0.45462 0.35662 0.75554 0.456032 0.377578 0.752012 0.459283 0.404461 0.758762 0.456142 0.428492 0.75833 0.456352 0.452717 0.759717 0.454853 0.479556 0.756383 0.480815 0.00072068 0.753247 0.482924 0.0266425 0.750345 0.475866 0.0533367 0.754781 0.475246 0.080882 0.752589 0.476148 0.107109 0.75715 0.484216 0.134765 0.752217 0.476786 0.151946 0.752474 0.476526 0.180776 0.755374 0.484212 0.205377 0.755147 0.478939 0.227322 0.757352 0.481827 0.254691 0.750804 0.48376 0.279017 0.751723 0.482501 0.305474 0.751378 0.477933 0.32571 0.752067 0.484086 0.356588 0.752117 0.480197 0.375184 0.756878 0.482273 0.402859 0.753737 0.484405 0.428875 0.758229 0.478466 0.456792 0.759249 0.484368 0.476514 0.753076 0.507736 0.00782793 0.754079 0.502233 0.0288071 0.757326 0.506368 0.0593326 0.759194 0.50593 0.0756979 0.753094 0.504909 0.102818 0.75307 0.500749 0.133709 0.750523 0.509888 0.152288 0.758386 0.500927 0.175054 0.752832 0.50348 0.203984 0.755906 0.502572 0.231069 0.751647 0.504608 0.251661 0.752652 0.500686 0.279925 0.757586 0.507638 0.300404 0.750804 0.509704 0.332311 0.758747 0.505995 0.356431 0.755564 0.500426 0.378868 0.756162 0.507174 0.406519 0.754501 0.501809 0.430407 0.758117 0.500773 0.45847 0.75174 0.509097 0.480152 0.754091 0.526068 0.000654679 0.755772 0.533444 0.0298613 0.753972 0.525588 0.0575556 0.752148 0.53208 0.0762975 0.759941 0.533191 0.107789 0.75859 0.525469 0.133492 0.750302 0.534217 0.154906 0.750746 0.533096 0.180576 0.757685 0.530167 0.20764 0.754773 0.526191 0.233982 0.754969 0.53156 0.253011 0.75971 0.526808 0.280696 0.758626 0.529172 0.307436 0.752097 0.533704 0.327261 0.752551 0.526985 0.359497 0.751644 0.533733 0.375851 0.751165 0.533377 0.401556 0.757607 0.530784 0.434484 0.752607 0.527383 0.455127 0.753792 0.534714 0.478991 0.758319 0.552692 0.000114148 0.75851 0.553485 0.0251346 0.756313 0.55661 0.0523435 0.75243 0.552659 0.0781545 0.756248 0.55073 0.104333 0.750154 0.559887 0.134031 0.752375 0.550005 0.150068 0.756003 0.554663 0.179865 0.751814 0.551721 0.205395 0.754487 0.559287 0.233707 0.754743 0.55643 0.251471 0.757636 0.557 0.276556 0.750512 0.550237 0.303926 0.75452 0.557416 0.332637 0.750254 0.553666 0.355345 0.750625 0.558672 0.375517 0.754901 0.556691 0.401255 0.753867 0.550103 0.431443 0.755576 0.553289 0.454476 0.752109 0.554899 0.482476 0.757107 0.577851 0.00919668 0.752951 0.576402 0.0288409 0.754709 0.576978 0.0594102 0.758237 0.579667 0.08148 0.751351 0.582178 0.109141 0.758927 0.584762 0.127543 0.75214 0.580777 0.156331 0.75972 0.579599 0.178473 0.754995 0.578242 0.201277 0.758315 0.584726 0.226266 0.752339 0.581866 0.259053 0.756138 0.584183 0.27786 0.750859 0.582426 0.302415 0.754757 0.57643 0.326712 0.754469 0.582906 0.357599 0.755142 0.577889 0.384484 0.752929 0.576551 0.403433 0.758481 0.575201 0.426101 0.756592 0.582641 0.457317 0.753562 0.576783 0.482724 0.750755 0.602031 0.000966532 0.755162 0.605733 0.0341232 0.756719 0.603277 0.0504371 0.759283 0.608691 0.075957 0.7505 0.600114 0.109775 0.754926 0.601081 0.133751 0.758123 0.606654 0.15637 0.758846 0.600362 0.184162 0.758508 0.601191 0.202955 0.75443 0.60018 0.234316 0.753589 0.608384 0.252514 0.757312 0.609888 0.282083 0.754402 0.603915 0.30369 0.757302 0.602454 0.331612 0.751621 0.604529 0.356105 0.755762 0.60609 0.381769 0.75796 0.608883 0.400011 0.758707 0.600521 0.428149 0.757038 0.605769 0.451468 0.75255 0.60086 0.47953 0.757553 0.634267 0.00956102 0.755541 0.627995 0.0295404 0.757457 0.632958 0.0503376 0.757302 0.633513 0.0809609 0.757825 0.627303 0.104751 0.753521 0.632292 0.133308 0.755462 0.628198 0.154675 0.75971 0.634817 0.177714 0.752931 0.631826 0.206258 0.759391 0.630273 0.23013 0.757149 0.626554 0.25821 0.757114 0.625272 0.284638 0.75627 0.626727 0.309236 0.750279 0.633114 0.326108 0.750491 0.633952 0.350944 0.757176 0.628844 0.375707 0.752819 0.632686 0.407918 0.751976 0.62624 0.427418 0.75952 0.632064 0.458844 0.751728 0.627076 0.476262 0.750355 0.656813 0.00988673 0.754245 0.65832 0.0255497 0.751787 0.655682 0.0522877 0.750118 0.65553 0.0784206 0.757745 0.654778 0.106862 0.759171 0.65758 0.125068 0.759466 0.658631 0.152428 0.750525 0.651849 0.176376 0.753787 0.658047 0.208513 0.759634 0.659163 0.23477 0.757582 0.656064 0.255153 0.754297 0.658224 0.280606 0.757659 0.656291 0.304886 0.750144 0.658426 0.333451 0.753492 0.651523 0.35072 0.755189 0.657541 0.381028 0.750775 0.650772 0.400386 0.754059 0.654254 0.430055 0.758331 0.652722 0.451376 0.754423 0.657361 0.481638 0.750799 0.678219 0.00286528 0.756511 0.675397 0.0343402 0.755589 0.678931 0.0544643 0.756095 0.675741 0.0753985 0.757806 0.67882 0.108797 0.754541 0.675915 0.133681 0.752567 0.677558 0.159751 0.750829 0.677799 0.181852 0.753366 0.684479 0.204395 0.757984 0.677066 0.227192 0.753641 0.682123 0.254404 0.759728 0.68318 0.279231 0.758892 0.680349 0.301189 0.750765 0.678916 0.333742 0.758033 0.676709 0.359361 0.75413 0.67688 0.382455 0.755393 0.675328 0.407233 0.751317 0.681828 0.43217 0.750371 0.683247 0.456442 0.758819 0.675245 0.482393 0.753231 0.704958 0.00484164 0.758142 0.704481 0.0320832 0.757303 0.701924 0.0558113 0.759325 0.704848 0.0757608 0.755253 0.703004 0.106515 0.756741 0.704663 0.132166 0.753761 0.702649 0.150083 0.755419 0.709921 0.179063 0.757346 0.703612 0.2001 0.753558 0.707578 0.230252 0.755421 0.702113 0.251148 0.758521 0.703339 0.280589 0.756884 0.702681 0.306085 0.751823 0.704502 0.329158 0.750145 0.708467 0.352521 0.756583 0.70202 0.377627 0.756512 0.701251 0.40642 0.750444 0.705343 0.433182 0.757627 0.700237 0.457595 0.755204 0.709001 0.479288 0.750225 0.731906 0.00889863 0.756939 0.729834 0.0292195 0.758442 0.73069 0.0586966 0.752735 0.726205 0.0804386 0.752794 0.731277 0.100891 0.757019 0.728953 0.131026 0.757918 0.725558 0.154275 0.752518 0.727759 0.177811 0.756406 0.72772 0.20418 0.759221 0.730755 0.225422 0.75661 0.729652 0.250262 0.750145 0.733149 0.283041 0.75914 0.726369 0.300509 0.752171 0.730492 0.331205 0.754111 0.734586 0.354815 0.753642 0.730912 0.378746 0.754987 0.727626 0.408013 0.752924 0.725989 0.428774 0.751122 0.730232 0.453708 0.751185 0.731164 0.476394 0.775845 0.00622178 0.00830773 0.782521 0.00520548 0.0253273 0.77713 0.000742878 0.0521138 0.778807 0.00213146 0.0790764 0.775983 0.00845455 0.105159 0.778713 0.00332034 0.134098 0.782162 0.00769407 0.159909 0.784285 0.00588841 0.177987 0.78222 0.00997064 0.209397 0.776734 0.00810117 0.229171 0.776529 0.00297145 0.254675 0.775936 0.00446379 0.279775 0.779542 0.00603405 0.303233 0.777346 0.00160506 0.330537 0.776391 0.00926214 0.354043 0.784637 0.00295052 0.378509 0.782525 0.00407738 0.406154 0.779064 0.00713552 0.428364 0.780698 0.00209808 0.456681 0.780273 0.00367414 0.483086 0.780947 0.0333401 0.00589461 0.784637 0.0268088 0.0250292 0.775403 0.0320688 0.0562048 0.776784 0.0281674 0.0799869 0.78114 0.0254769 0.102185 0.783548 0.0331244 0.127803 0.778862 0.0308027 0.151443 0.78265 0.028705 0.175562 0.778126 0.0255072 0.209399 0.784449 0.033603 0.231734 0.781491 0.0331603 0.259092 0.781265 0.0265583 0.278961 0.777534 0.0347004 0.302188 0.783019 0.0291744 0.329219 0.782794 0.0285334 0.35505 0.776304 0.0316227 0.380534 0.783045 0.0317425 0.40677 0.784757 0.0327409 0.430928 0.783011 0.0256584 0.459927 0.779442 0.0304367 0.484367 0.776872 0.059565 0.00963127 0.783453 0.0547318 0.0285112 0.779191 0.0516134 0.0538424 0.778339 0.0532302 0.0827979 0.777217 0.0567671 0.105906 0.778525 0.0528549 0.127407 0.779494 0.0570819 0.15917 0.783542 0.0579718 0.184341 0.777091 0.0568269 0.206035 0.783775 0.0513499 0.232754 0.778866 0.0511449 0.255915 0.784016 0.0565079 0.280774 0.775149 0.0579346 0.302231 0.776355 0.0534131 0.33083 0.781708 0.0511433 0.358754 0.782782 0.0569495 0.379148 0.777911 0.0519361 0.404804 0.784462 0.0539672 0.425881 0.776304 0.0521042 0.453037 0.780166 0.0532197 0.477372 0.777786 0.083642 0.00292765 0.781412 0.0783507 0.0288473 0.784106 0.0781029 0.0573424 0.781212 0.0789739 0.078829 0.776608 0.0757166 0.108819 0.779785 0.0828645 0.132161 0.777695 0.0762503 0.155311 0.782954 0.0793825 0.180161 0.775951 0.0840461 0.208451 0.784226 0.0773681 0.228132 0.781519 0.0809544 0.259645 0.783646 0.0770592 0.284046 0.784394 0.0814115 0.304504 0.783598 0.0775329 0.327597 0.782355 0.0791371 0.356472 0.780205 0.0828447 0.384282 0.77642 0.0814374 0.407851 0.780397 0.079042 0.428694 0.783562 0.0803544 0.451008 0.777673 0.0794544 0.476865 0.775998 0.101091 0.00574622 0.776996 0.109437 0.0313569 0.781362 0.10262 0.0530208 0.779332 0.105959 0.0777851 0.780556 0.1049 0.107431 0.778202 0.106743 0.13303 0.779036 0.100278 0.157352 0.782349 0.104621 0.184964 0.783407 0.106913 0.208923 0.778047 0.1061 0.23222 0.778413 0.108794 0.255353 0.778746 0.108251 0.27877 0.777477 0.102095 0.307506 0.775392 0.104888 0.333784 0.778564 0.108895 0.354136 0.777696 0.106552 0.377924 0.782871 0.105167 0.405321 0.779163 0.109056 0.428887 0.781213 0.10427 0.453698 0.783348 0.103115 0.476872 0.780361 0.125162 0.0093823 0.775323 0.13427 0.0316559 0.776909 0.130104 0.0562317 0.783571 0.131082 0.0778301 0.782014 0.12938 0.109483 0.776376 0.133042 0.127763 0.777236 0.125121 0.156039 0.783395 0.128834 0.178159 0.775922 0.127816 0.204287 0.781747 0.131127 0.229277 0.776747 0.130559 0.253566 0.781915 0.132466 0.278511 0.781397 0.133099 0.301432 0.777036 0.133291 0.327527 0.775403 0.132681 0.359214 0.780651 0.127741 0.382565 0.783127 0.131739 0.407731 0.779265 0.130198 0.426717 0.78326 0.129814 0.455003 0.782675 0.130352 0.478153 0.782022 0.158181 0.00734067 0.778059 0.156986 0.0264859 0.775106 0.153668 0.0581083 0.776289 0.153007 0.0763958 0.777978 0.15234 0.106742 0.782576 0.157299 0.130137 0.7836 0.157528 0.155253 0.781014 0.150275 0.179 0.77711 0.150622 0.207008 0.775909 0.153812 0.226251 0.776102 0.154823 0.251273 0.7815 0.150365 0.279345 0.776633 0.156846 0.303562 0.782147 0.151922 0.326946 0.777242 0.151294 0.35659 0.781618 0.156024 0.375169 0.783022 0.15807 0.407495 0.782054 0.154092 0.433843 0.777056 0.157454 0.45439 0.784212 0.157192 0.475783 0.779258 0.176536 0.00771211 0.776954 0.180035 0.0285034 0.782333 0.176864 0.0588731 0.775039 0.184595 0.0754213 0.780428 0.181214 0.100447 0.783527 0.181272 0.133764 0.776961 0.18083 0.155795 0.783668 0.183545 0.183825 0.781818 0.179684 0.20886 0.776337 0.18157 0.225166 0.779445 0.179068 0.257706 0.781152 0.184059 0.281936 0.782702 0.175251 0.305975 0.777662 0.178438 0.332006 0.782339 0.175458 0.350722 0.778935 0.179221 0.382901 0.782521 0.177518 0.405628 0.782859 0.181154 0.428022 0.777634 0.181744 0.451677 0.77577 0.176419 0.478833 0.784157 0.202565 0.00854884 0.782844 0.201181 0.0252571 0.783906 0.202718 0.0531176 0.777662 0.202474 0.0811683 0.78381 0.202141 0.100368 0.776372 0.20435 0.127273 0.778371 0.208455 0.155328 0.778474 0.201488 0.17525 0.775985 0.20359 0.200059 0.783427 0.201437 0.230904 0.779454 0.206271 0.255706 0.777569 0.209878 0.2782 0.779692 0.202929 0.307019 0.776214 0.205065 0.32868 0.780781 0.202647 0.35499 0.78258 0.203968 0.377374 0.782759 0.204684 0.402143 0.77662 0.203948 0.42658 0.784864 0.207996 0.450508 0.775294 0.207752 0.475861 0.78173 0.231475 0.00840975 0.783599 0.227904 0.0269389 0.776674 0.231215 0.0597013 0.782023 0.229241 0.0817474 0.776997 0.229547 0.103994 0.78231 0.228654 0.132201 0.782587 0.227008 0.153253 0.77525 0.233781 0.181271 0.775307 0.234604 0.200853 0.77992 0.23202 0.228211 0.776074 0.229225 0.259269 0.784708 0.233891 0.278635 0.783652 0.234414 0.303134 0.783354 0.228716 0.332507 0.776498 0.234537 0.35604 0.775173 0.232807 0.380095 0.780684 0.225366 0.4075 0.778673 0.225463 0.43335 0.783397 0.230707 0.456038 0.777589 0.229685 0.479064 0.780394 0.251871 0.00516964 0.783873 0.259948 0.0341393 0.783786 0.255113 0.0531614 0.784945 0.25832 0.0762689 0.781021 0.253274 0.107759 0.77922 0.251237 0.128606 0.781037 0.251109 0.156093 0.775383 0.254653 0.182444 0.78332 0.253693 0.20417 0.77654 0.25315 0.228272 0.778531 0.255597 0.255338 0.781159 0.250907 0.275486 0.781829 0.257315 0.308095 0.779517 0.25806 0.331767 0.78089 0.251028 0.359538 0.78243 0.251943 0.383412 0.78107 0.254613 0.408211 0.776733 0.251321 0.427689 0.777712 0.253167 0.457533 0.7817 0.25186 0.484497 0.783335 0.283491 0.00975296 0.782278 0.275404 0.0288121 0.775372 0.283387 0.0580116 0.775717 0.281446 0.0767028 0.7835 0.276339 0.104649 0.781746 0.278822 0.126059 0.778764 0.281311 0.155221 0.78235 0.284228 0.176394 0.778921 0.282773 0.201302 0.784858 0.283587 0.229234 0.777644 0.27714 0.250903 0.776558 0.280599 0.277451 0.78377 0.284523 0.306948 0.777012 0.279379 0.326922 0.778306 0.279313 0.353279 0.781124 0.284922 0.383634 0.779186 0.280465 0.408525 0.777336 0.280601 0.427143 0.776096 0.284998 0.459626 0.778814 0.284448 0.481382 0.775232 0.305688 0.00927389 0.778495 0.309347 0.0306199 0.784346 0.300579 0.0507646 0.775642 0.304951 0.0755566 0.782235 0.303975 0.100895 0.775973 0.307963 0.130223 0.78074 0.300467 0.151967 0.78289 0.300858 0.184808 0.776637 0.306365 0.206731 0.781027 0.301798 0.229048 0.779201 0.308421 0.253495 0.784416 0.300552 0.275599 0.776551 0.302984 0.302888 0.780316 0.308156 0.329483 0.778848 0.30078 0.355819 0.777 0.304791 0.378287 0.781025 0.307864 0.407859 0.776457 0.300913 0.430706 0.777412 0.309668 0.454813 0.78442 0.300831 0.475307 0.783262 0.328866 0.00947063 0.78174 0.331188 0.0295233 0.784127 0.33196 0.0536205 0.780429 0.330768 0.0801257 0.775203 0.327231 0.10204 0.782976 0.334704 0.132033 0.782223 0.326611 0.152983 0.784737 0.327586 0.177548 0.779711 0.329091 0.208476 0.779234 0.32747 0.231822 0.77782 0.330428 0.255522 0.777635 0.325043 0.276728 0.777934 0.328007 0.307613 0.777931 0.327349 0.325489 0.775653 0.326428 0.351453 0.779447 0.330212 0.380102 0.776081 0.332079 0.408075 0.784626 0.333555 0.432188 0.781434 0.327121 0.450648 0.777174 0.33356 0.475999 0.775863 0.35838 0.00686147 0.78084 0.355355 0.0302443 0.780804 0.359242 0.0556922 0.782244 0.358026 0.0829964 0.781323 0.358716 0.105259 0.784293 0.356308 0.128182 0.779259 0.355082 0.151922 0.775402 0.358569 0.177691 0.776811 0.359258 0.201597 0.781111 0.3544 0.227658 0.780913 0.351466 0.257481 0.780485 0.353941 0.278602 0.783796 0.358383 0.301144 0.777729 0.359796 0.332834 0.784542 0.359976 0.350648 0.781913 0.355719 0.380671 0.780344 0.355686 0.407783 0.776267 0.351024 0.431039 0.777655 0.354995 0.454343 0.777575 0.352238 0.482548 0.775956 0.384924 0.000991261 0.77502 0.382616 0.0274941 0.776023 0.379807 0.0525015 0.781539 0.379578 0.0816469 0.775499 0.381791 0.109575 0.78114 0.375323 0.127354 0.781398 0.375162 0.158389 0.779718 0.37915 0.176058 0.780948 0.381533 0.201093 0.775485 0.381436 0.229099 0.781605 0.375497 0.256679 0.776607 0.378866 0.282849 0.775199 0.382223 0.302275 0.776662 0.377495 0.327727 0.778537 0.381164 0.355023 0.776092 0.378177 0.376239 0.782228 0.37797 0.401148 0.778324 0.384357 0.425466 0.783135 0.382699 0.454822 0.782906 0.378224 0.477597 0.776252 0.406721 0.00996557 0.778426 0.407492 0.0336499 0.775581 0.40689 0.0578845 0.780531 0.40736 0.0802315 0.775295 0.408946 0.109378 0.783156 0.405122 0.126575 0.780753 0.407447 0.155768 0.783519 0.401017 0.182517 0.782842 0.40906 0.207118 0.780229 0.403044 0.226849 0.776449 0.407765 0.252014 0.777706 0.40336 0.281979 0.7832 0.408833 0.308458 0.783824 0.406403 0.330018 0.776804 0.403856 0.356433 0.776355 0.407569 0.38349 0.780151 0.402179 0.404106 0.776223 0.402128 0.432729 0.778393 0.405298 0.45247 0.777688 0.401865 0.476601 0.784859 0.430141 0.00339066 0.782727 0.432209 0.0349939 0.778176 0.426168 0.0579508 0.783783 0.430339 0.0791068 0.783163 0.427815 0.104433 0.777219 0.43134 0.130184 0.783087 0.425593 0.150638 0.779555 0.42579 0.177081 0.77717 0.431418 0.207604 0.775338 0.426006 0.231318 0.78187 0.429964 0.259816 0.776294 0.431756 0.280613 0.783786 0.431352 0.30654 0.781976 0.431819 0.334456 0.78278 0.431039 0.355114 0.777477 0.431875 0.381093 0.778632 0.42937 0.400996 0.775317 0.427369 0.428009 0.781795 0.433274 0.452972 0.776592 0.426956 0.480891 0.777223 0.456016 0.00527555 0.78311 0.454121 0.0344268 0.776899 0.45083 0.0583761 0.781374 0.457538 0.0823776 0.78353 0.450098 0.10319 0.779876 0.455866 0.129985 0.775141 0.457737 0.155766 0.775912 0.452233 0.177085 0.775979 0.454808 0.207543 0.7794 0.45298 0.231519 0.782217 0.455795 0.254525 0.778872 0.453355 0.28108 0.781855 0.455365 0.307065 0.782727 0.456506 0.331337 0.784245 0.452767 0.354311 0.780681 0.450916 0.381974 0.777073 0.458839 0.403267 0.781968 0.457088 0.433962 0.779579 0.451336 0.457056 0.775837 0.457213 0.480912 0.780807 0.476776 0.00154889 0.77802 0.481331 0.0295181 0.78457 0.476944 0.05109 0.784965 0.476349 0.0780573 0.784829 0.476906 0.106585 0.780809 0.477881 0.127819 0.782264 0.478979 0.159063 0.779259 0.484032 0.177888 0.779254 0.48364 0.208834 0.783247 0.476738 0.2266 0.781376 0.480548 0.252667 0.782278 0.476885 0.275743 0.778214 0.483259 0.303202 0.780736 0.48488 0.334664 0.775332 0.482225 0.351362 0.778687 0.480004 0.375698 0.776567 0.484152 0.409483 0.782055 0.480735 0.431486 0.776748 0.476285 0.459042 0.77957 0.47518 0.482754 0.777838 0.503584 0.00796061 0.781674 0.508427 0.0252836 0.781749 0.500974 0.0567968 0.780797 0.507541 0.0765561 0.782135 0.504263 0.109422 0.779322 0.508728 0.130643 0.784967 0.501833 0.153562 0.776218 0.503673 0.176144 0.783714 0.503186 0.202116 0.777687 0.503544 0.229152 0.779744 0.500859 0.251461 0.775961 0.506533 0.283539 0.781307 0.504369 0.305523 0.780715 0.500413 0.334559 0.777662 0.507838 0.353382 0.78193 0.50989 0.380955 0.780404 0.501347 0.402275 0.781903 0.506303 0.430797 0.776659 0.504277 0.455753 0.775953 0.504151 0.481087 0.777741 0.52555 0.00135594 0.777223 0.529135 0.0326549 0.780897 0.533447 0.0562031 0.77939 0.53416 0.0806562 0.781517 0.531627 0.102756 0.780781 0.526404 0.126428 0.777595 0.528859 0.159989 0.778098 0.529201 0.184396 0.780997 0.534725 0.201795 0.781914 0.528409 0.230914 0.784183 0.528333 0.25946 0.780417 0.528499 0.284052 0.780451 0.529752 0.300018 0.780845 0.526652 0.327411 0.782337 0.526418 0.350856 0.783273 0.528045 0.375939 0.781766 0.526582 0.404416 0.781301 0.533463 0.433882 0.776447 0.530511 0.453265 0.778194 0.533721 0.481324 0.778962 0.553438 0.00192604 0.784177 0.556713 0.0313381 0.781458 0.556272 0.0562083 0.783265 0.552265 0.0783129 0.775416 0.559616 0.107066 0.777325 0.5584 0.126088 0.776253 0.552986 0.15822 0.782956 0.552364 0.178276 0.779464 0.552186 0.205923 0.775488 0.554929 0.226523 0.782062 0.551014 0.256601 0.776944 0.553615 0.27699 0.777424 0.554007 0.304663 0.777988 0.552067 0.327247 0.782972 0.559487 0.353718 0.784196 0.557732 0.382724 0.781027 0.554718 0.408661 0.783636 0.552994 0.431766 0.775406 0.555488 0.452576 0.78467 0.554342 0.484359 0.781931 0.575412 0.00407377 0.775182 0.582866 0.0308116 0.782215 0.575145 0.0515294 0.779121 0.579224 0.0802408 0.78271 0.577259 0.105321 0.783878 0.584087 0.13021 0.782594 0.58084 0.156971 0.7762 0.580724 0.177727 0.776968 0.581021 0.203966 0.777117 0.584611 0.226676 0.782642 0.582101 0.253377 0.78466 0.581236 0.278224 0.781345 0.577392 0.309701 0.784057 0.575474 0.334012 0.780671 0.575042 0.351516 0.779193 0.584547 0.37862 0.776861 0.577422 0.406719 0.780168 0.577021 0.425901 0.78226 0.577475 0.459726 0.778886 0.582142 0.477388 0.783913 0.600604 0.00621941 0.778211 0.606723 0.0253744 0.779786 0.604266 0.0566295 0.783125 0.606408 0.078894 0.784075 0.603997 0.101876 0.780709 0.605732 0.128435 0.780459 0.602118 0.150303 0.777122 0.60137 0.178409 0.777487 0.600058 0.202209 0.784889 0.604494 0.229271 0.782598 0.605913 0.252665 0.777133 0.605991 0.280694 0.779088 0.600646 0.305199 0.781747 0.607532 0.333749 0.777452 0.602947 0.354783 0.778458 0.606179 0.378482 0.782162 0.609393 0.403286 0.784623 0.60936 0.433914 0.779829 0.60894 0.459911 0.779914 0.602967 0.482348 0.777963 0.629653 0.00416694 0.781832 0.632198 0.0292881 0.775273 0.634463 0.0547028 0.779707 0.630621 0.0780331 0.784556 0.633622 0.106215 0.781666 0.629314 0.126647 0.780712 0.630429 0.153356 0.775365 0.627839 0.180712 0.783052 0.628487 0.209677 0.784827 0.63255 0.232467 0.784282 0.626346 0.254992 0.776116 0.627139 0.281742 0.781318 0.634371 0.302478 0.779155 0.628492 0.325562 0.784233 0.629075 0.356626 0.779139 0.634915 0.38236 0.782675 0.628221 0.404908 0.778651 0.634316 0.428771 0.775998 0.628686 0.455494 0.78136 0.631513 0.480377 0.783603 0.65781 0.00172854 0.784396 0.653192 0.0306245 0.77625 0.65141 0.0576324 0.778731 0.654638 0.0813597 0.780785 0.651094 0.105573 0.779104 0.657079 0.13125 0.777225 0.654564 0.159561 0.783497 0.654211 0.180758 0.7847 0.65672 0.207514 0.781881 0.65055 0.232602 0.779115 0.655225 0.256212 0.783078 0.659744 0.280104 0.777399 0.650519 0.301367 0.781284 0.656889 0.325397 0.781739 0.651264 0.358162 0.778657 0.6558 0.380363 0.783903 0.657082 0.407987 0.776061 0.653144 0.433443 0.783985 0.651652 0.45154 0.776948 0.654136 0.481895 0.775124 0.682535 0.00605698 0.775962 0.675201 0.027994 0.784246 0.681405 0.0540251 0.780241 0.675862 0.0807818 0.780321 0.684549 0.101889 0.783709 0.675437 0.128129 0.781899 0.682883 0.154248 0.780664 0.684973 0.179582 0.776243 0.679385 0.203616 0.781588 0.677468 0.22909 0.777056 0.683726 0.251074 0.778403 0.683758 0.280309 0.780592 0.67702 0.304809 0.776959 0.67529 0.325286 0.777687 0.676379 0.354999 0.776857 0.67729 0.383659 0.778764 0.678458 0.409834 0.784294 0.683182 0.432749 0.782731 0.675154 0.45987 0.78245 0.680799 0.480526 0.784445 0.701315 0.00267388 0.782826 0.700772 0.0320299 0.780986 0.703816 0.0578654 0.783104 0.701419 0.0757138 0.778344 0.703374 0.103143 0.778481 0.707194 0.134658 0.776044 0.701092 0.159887 0.777672 0.70665 0.184676 0.781713 0.704743 0.208501 0.783126 0.709171 0.227727 0.78104 0.703778 0.253001 0.782306 0.706685 0.279068 0.776287 0.708444 0.304809 0.779111 0.709985 0.333035 0.775795 0.709638 0.354266 0.777859 0.708344 0.377084 0.783743 0.700989 0.404776 0.780293 0.706513 0.431372 0.776515 0.706451 0.459066 0.781728 0.705189 0.477854 0.781737 0.728165 0.0073355 0.783934 0.726986 0.0335998 0.781484 0.732628 0.0522039 0.775483 0.732976 0.0826884 0.781179 0.734397 0.107282 0.779606 0.731944 0.128359 0.778375 0.726225 0.151431 0.776475 0.727068 0.178576 0.778827 0.729699 0.200708 0.779309 0.734214 0.229596 0.781429 0.732045 0.258308 0.783185 0.725058 0.284087 0.778821 0.727265 0.306894 0.776781 0.732075 0.334377 0.782765 0.734227 0.357475 0.784118 0.733314 0.384458 0.776847 0.733609 0.409148 0.777226 0.734368 0.434063 0.777729 0.729402 0.457131 0.782784 0.731556 0.480183 0.801676 0.00627773 0.00369717 0.80677 0.000852385 0.0270285 0.80703 0.00234018 0.0552664 0.808946 0.00921145 0.0826111 0.808505 0.00630457 0.106257 0.808458 0.00400319 0.133635 0.804447 0.00821598 0.154671 0.806545 0.00195121 0.175718 0.809386 0.00661177 0.20287 0.809929 0.000621077 0.22966 0.800314 0.00324911 0.256564 0.802074 0.000513112 0.277148 0.803034 0.00682892 0.303801 0.802606 0.00868664 0.331249 0.803576 0.00563473 0.356869 0.804929 0.00706935 0.384564 0.809044 0.000644733 0.403961 0.805471 0.00487055 0.42662 0.800694 0.00246285 0.45944 0.807332 0.000813631 0.477964 0.807298 0.0256679 0.00898881 0.809979 0.0338899 0.0290908 0.808699 0.0336743 0.0580613 0.805409 0.0341107 0.0816929 0.808834 0.0324822 0.104655 0.809338 0.0326624 0.134908 0.803526 0.0281215 0.159843 0.802468 0.0320379 0.184928 0.809073 0.0343304 0.206849 0.802959 0.0250119 0.233075 0.80881 0.0333334 0.250006 0.808327 0.0261087 0.279221 0.807136 0.0297757 0.306714 0.804237 0.0289155 0.333806 0.800555 0.0326853 0.355135 0.800749 0.0306524 0.380631 0.802483 0.0263815 0.408274 0.805583 0.0251825 0.426009 0.804502 0.0311182 0.454377 0.807988 0.0270835 0.480839 0.803527 0.0554802 0.00558427 0.803666 0.05861 0.0316867 0.806442 0.0523315 0.0560744 0.809553 0.055061 0.0817787 0.805967 0.0535234 0.100444 0.809606 0.0544803 0.128393 0.805639 0.0572092 0.158647 0.800437 0.0593522 0.176291 0.809706 0.0543197 0.206136 0.809276 0.0565326 0.227703 0.808597 0.0550514 0.25678 0.809963 0.0546979 0.279595 0.8083 0.0541533 0.304658 0.80333 0.0588513 0.333563 0.803759 0.0576309 0.356971 0.803507 0.0568543 0.383372 0.809534 0.0567879 0.405199 0.801839 0.052439 0.425548 0.807695 0.0520439 0.455006 0.804761 0.0535666 0.483377 0.808005 0.0816058 0.00714174 0.80584 0.0763639 0.0275683 0.803733 0.0843638 0.0540332 0.809795 0.082929 0.0791107 0.803325 0.0775018 0.106888 0.805512 0.0844476 0.126851 0.804881 0.0790402 0.157538 0.806492 0.0803974 0.17855 0.800991 0.0849949 0.201088 0.809187 0.0824658 0.233771 0.802717 0.0773433 0.250918 0.804285 0.0827488 0.284504 0.807109 0.0846614 0.309297 0.807859 0.0811057 0.333123 0.802489 0.0846776 0.357664 0.807565 0.0842072 0.381187 0.805442 0.0822279 0.403078 0.809338 0.0796326 0.42774 0.805072 0.075739 0.457799 0.800254 0.0845701 0.478251 0.802862 0.108235 0.000834131 0.804412 0.109886 0.0274589 0.808142 0.106951 0.0535315 0.800482 0.102844 0.075045 0.801859 0.102346 0.104127 0.80343 0.100202 0.129488 0.809836 0.102794 0.158673 0.800048 0.100102 0.184486 0.800682 0.106297 0.201443 0.8062 0.106868 0.230373 0.807275 0.10613 0.257721 0.808448 0.103086 0.284665 0.809721 0.102871 0.304853 0.806042 0.104286 0.327541 0.802324 0.108822 0.358516 0.801106 0.102628 0.377481 0.808548 0.106693 0.408015 0.801831 0.104057 0.428342 0.806545 0.108311 0.459607 0.804658 0.109038 0.479053 0.800494 0.132314 0.00572098 0.800794 0.13244 0.0326912 0.803725 0.125728 0.0530333 0.802413 0.127026 0.0827144 0.809629 0.134877 0.104644 0.802294 0.127158 0.128689 0.800164 0.128017 0.152964 0.802535 0.130927 0.184811 0.809622 0.12837 0.206966 0.805644 0.125226 0.2286 0.801949 0.133601 0.255674 0.802279 0.128551 0.278541 0.801158 0.128402 0.306826 0.806628 0.127701 0.330471 0.802924 0.130911 0.351891 0.809156 0.128955 0.375447 0.807821 0.133711 0.408625 0.800695 0.133984 0.431647 0.803599 0.130579 0.4558 0.804962 0.132113 0.47601 0.802609 0.159089 0.00439701 0.800089 0.154155 0.0280095 0.807707 0.153794 0.0583891 0.809946 0.151591 0.0848188 0.804238 0.153506 0.109123 0.806283 0.158949 0.13363 0.800756 0.151253 0.155738 0.80128 0.150899 0.176082 0.804308 0.155396 0.200864 0.803292 0.157103 0.231579 0.80135 0.158607 0.254926 0.804536 0.154626 0.277385 0.801108 0.152064 0.301062 0.806429 0.152413 0.327997 0.807229 0.156369 0.353027 0.80685 0.15241 0.383687 0.800719 0.154941 0.406822 0.801172 0.158707 0.42864 0.801093 0.155128 0.454943 0.801426 0.151401 0.476065 0.801182 0.175106 0.0052684 0.808572 0.180818 0.0334022 0.807112 0.182573 0.057443 0.801071 0.176487 0.0766478 0.805423 0.180509 0.102401 0.804315 0.176457 0.12874 0.804369 0.183479 0.153648 0.802783 0.175949 0.180085 0.805595 0.179282 0.208707 0.804686 0.180603 0.227318 0.803844 0.175282 0.250268 0.800366 0.183501 0.284541 0.80727 0.182162 0.308096 0.80246 0.175751 0.325956 0.807368 0.182388 0.350431 0.800297 0.17924 0.380177 0.800921 0.17657 0.408668 0.80158 0.18321 0.427408 0.80052 0.175625 0.45597 0.800541 0.176741 0.478063 0.809375 0.208338 0.00495394 0.800567 0.200001 0.0343654 0.802727 0.20749 0.0529875 0.808609 0.209435 0.0769948 0.809879 0.208152 0.104573 0.809272 0.204933 0.129216 0.801936 0.20364 0.153713 0.805372 0.201034 0.183351 0.804423 0.209992 0.203892 0.801938 0.200873 0.234665 0.803761 0.205615 0.251629 0.804298 0.209874 0.280421 0.800631 0.200264 0.309877 0.80587 0.207288 0.325524 0.805773 0.204603 0.358145 0.801781 0.209852 0.378093 0.80133 0.208944 0.409895 0.800395 0.209799 0.433528 0.801933 0.201241 0.450363 0.805843 0.208604 0.48284 0.804715 0.22836 0.00990229 0.805377 0.228198 0.0255098 0.804443 0.228527 0.0556163 0.80607 0.230527 0.0770361 0.809494 0.234685 0.100035 0.804437 0.225174 0.131811 0.805694 0.229845 0.159103 0.803365 0.230472 0.178153 0.803478 0.225703 0.206936 0.801231 0.233687 0.230472 0.800404 0.234406 0.253315 0.800816 0.231818 0.28374 0.807809 0.232845 0.304586 0.800714 0.227588 0.333065 0.802496 0.229953 0.358841 0.806233 0.227238 0.380539 0.807377 0.233197 0.401626 0.803289 0.228759 0.427551 0.806262 0.225816 0.454916 0.808004 0.234786 0.483069 0.806169 0.258505 0.00809587 0.801963 0.253063 0.0301999 0.801575 0.256156 0.0587773 0.801897 0.257774 0.0825853 0.801714 0.258954 0.109627 0.809202 0.254887 0.133392 0.806624 0.252919 0.157058 0.800988 0.256951 0.175056 0.807516 0.258351 0.201975 0.805809 0.251572 0.225371 0.803162 0.259288 0.251238 0.800449 0.259208 0.281495 0.80622 0.258638 0.304497 0.802894 0.25995 0.32624 0.80155 0.257813 0.356431 0.805738 0.250779 0.375268 0.808428 0.252535 0.402114 0.80554 0.250154 0.426422 0.809942 0.252292 0.456763 0.806578 0.255876 0.484587 0.804505 0.276193 0.00212958 0.803019 0.279529 0.0273197 0.801483 0.280472 0.0573536 0.800666 0.275948 0.0798226 0.805918 0.279794 0.104134 0.802098 0.276572 0.132321 0.808999 0.281124 0.157935 0.803603 0.276083 0.181232 0.802612 0.278985 0.208474 0.802843 0.276266 0.230799 0.800789 0.281298 0.254557 0.804143 0.280295 0.284588 0.807437 0.278103 0.305183 0.808082 0.280898 0.330157 0.807067 0.279241 0.356477 0.803292 0.277087 0.377787 0.803868 0.276839 0.4009 0.800094 0.281479 0.425882 0.801448 0.278503 0.455389 0.80946 0.2821 0.477976 0.800141 0.302725 0.00468455 0.80961 0.303426 0.0272528 0.808654 0.306906 0.0536808 0.800082 0.301222 0.0848863 0.809855 0.300728 0.104441 0.800745 0.30035 0.134843 0.800058 0.304165 0.159833 0.808713 0.306226 0.175017 0.80418 0.30412 0.20709 0.800278 0.308097 0.233941 0.805582 0.302641 0.259574 0.809204 0.300824 0.282706 0.804622 0.304203 0.307128 0.804648 0.308878 0.327014 0.800112 0.301881 0.355624 0.809621 0.308729 0.377137 0.803168 0.304603 0.407589 0.8034 0.306039 0.425434 0.807624 0.308692 0.451155 0.805008 0.301583 0.479544 0.801273 0.333831 0.00385474 0.803272 0.33231 0.0308125 0.807484 0.326439 0.0593 0.802843 0.333809 0.0772154 0.803121 0.32515 0.106737 0.803979 0.333965 0.125064 0.807231 0.325365 0.15471 0.808544 0.332996 0.182159 0.806765 0.334072 0.205597 0.80061 0.330979 0.234 0.80025 0.331909 0.252285 0.801814 0.333443 0.283127 0.808894 0.332057 0.302245 0.800657 0.326982 0.325944 0.806887 0.330496 0.351567 0.802116 0.330939 0.382902 0.802095 0.332106 0.400398 0.807511 0.325394 0.426324 0.804326 0.333886 0.454036 0.80251 0.328663 0.484986 0.804649 0.352498 0.00553865 0.800083 0.359865 0.0338006 0.805324 0.355162 0.0506656 0.803165 0.355857 0.0786839 0.801158 0.359166 0.104279 0.807405 0.358031 0.128641 0.80393 0.35449 0.151917 0.806926 0.352291 0.181811 0.802035 0.358263 0.207371 0.801744 0.355037 0.23041 0.808703 0.355069 0.255059 0.800375 0.350716 0.280262 0.802287 0.356858 0.304229 0.807459 0.354525 0.328487 0.800665 0.35497 0.359771 0.801262 0.355953 0.382223 0.80659 0.353138 0.400519 0.80042 0.354383 0.434622 0.804985 0.353722 0.452853 0.801416 0.350766 0.477222 0.801918 0.384896 0.00151104 0.803747 0.376983 0.0338623 0.806885 0.375435 0.0541628 0.808107 0.384398 0.0811708 0.809441 0.381498 0.108617 0.805907 0.375582 0.126506 0.803947 0.378716 0.156197 0.804133 0.382171 0.184342 0.809987 0.38048 0.201919 0.80202 0.376743 0.234748 0.808147 0.384406 0.258978 0.800974 0.377532 0.280437 0.807563 0.383777 0.308319 0.805599 0.381884 0.329602 0.801774 0.376026 0.354726 0.801395 0.378831 0.378804 0.801428 0.384343 0.400081 0.807046 0.378293 0.425553 0.805869 0.377432 0.455393 0.809712 0.380186 0.484939 0.801805 0.403411 0.00738756 0.804909 0.40223 0.0266719 0.807799 0.404271 0.0523079 0.804108 0.401121 0.0848925 0.807689 0.404188 0.107647 0.80336 0.400071 0.131305 0.804743 0.404028 0.155346 0.806274 0.401369 0.179475 0.80744 0.409857 0.203811 0.80335 0.406195 0.225672 0.801775 0.401356 0.258123 0.807128 0.406897 0.283476 0.806352 0.40291 0.300065 0.808561 0.401598 0.325955 0.800196 0.405642 0.352361 0.802329 0.408737 0.381689 0.807326 0.408085 0.400815 0.800311 0.400597 0.434956 0.803121 0.404856 0.45495 0.809026 0.40892 0.477623 0.805813 0.431557 0.00375744 0.807003 0.434812 0.0326692 0.808995 0.429242 0.0540196 0.803092 0.425133 0.0765644 0.802701 0.426811 0.109552 0.804319 0.431569 0.129916 0.808729 0.434825 0.159053 0.808736 0.433822 0.183219 0.80556 0.425544 0.204745 0.806907 0.430533 0.233399 0.801177 0.431434 0.255514 0.805572 0.432412 0.27573 0.801316 0.425435 0.305359 0.802658 0.427621 0.327431 0.803374 0.433526 0.357287 0.800205 0.425916 0.384416 0.800829 0.432052 0.401252 0.807525 0.433829 0.428402 0.803703 0.431787 0.453516 0.804243 0.42824 0.481283 0.80694 0.458362 0.0047714 0.804828 0.450574 0.0295818 0.806306 0.455798 0.0579701 0.800141 0.459531 0.078087 0.803356 0.456995 0.106447 0.805023 0.454465 0.125689 0.805668 0.451234 0.154111 0.802816 0.454299 0.178686 0.808308 0.454988 0.208986 0.803312 0.452313 0.234099 0.809388 0.456434 0.252629 0.803893 0.456076 0.279335 0.807571 0.451233 0.30331 0.806218 0.45081 0.325603 0.801509 0.452051 0.357715 0.807483 0.459213 0.376585 0.809314 0.459184 0.405105 0.808583 0.451063 0.425995 0.806096 0.452073 0.456037 0.800366 0.451783 0.481321 0.80391 0.483011 0.00163951 0.808249 0.482421 0.026951 0.80244 0.484997 0.0578049 0.804556 0.481567 0.0831216 0.80565 0.483625 0.109394 0.802158 0.481346 0.132725 0.806842 0.484615 0.151929 0.808672 0.479015 0.177401 0.807887 0.476804 0.207416 0.809586 0.478041 0.228188 0.807354 0.476692 0.258813 0.803969 0.477695 0.27849 0.806183 0.481722 0.3068 0.801825 0.476858 0.334042 0.804406 0.48118 0.351416 0.806985 0.47812 0.381676 0.805298 0.482911 0.407118 0.80359 0.476975 0.43024 0.802577 0.481281 0.451827 0.809572 0.480338 0.482075 0.800151 0.508305 0.00823967 0.806946 0.500383 0.0275226 0.803781 0.507022 0.0505014 0.807716 0.503114 0.075653 0.800283 0.507198 0.104192 0.800052 0.502731 0.126529 0.805249 0.504789 0.154652 0.807544 0.507936 0.179561 0.803745 0.509477 0.201579 0.808916 0.509311 0.231412 0.803452 0.502681 0.252103 0.802776 0.50297 0.283701 0.804034 0.506472 0.301621 0.802822 0.508377 0.330713 0.80762 0.508421 0.355429 0.805575 0.500134 0.380881 0.801764 0.50736 0.40383 0.802502 0.504536 0.428122 0.8 0.509928 0.456728 0.808227 0.505958 0.47846 0.807707 0.526863 0.00350543 0.802725 0.528387 0.0334923 0.809337 0.53329 0.0563118 0.807788 0.528103 0.0837798 0.801917 0.526562 0.100904 0.807859 0.534393 0.134279 0.805027 0.53282 0.154336 0.809131 0.527344 0.179215 0.803512 0.530548 0.209709 0.804519 0.531687 0.22668 0.801658 0.533796 0.255723 0.803514 0.528501 0.280134 0.800855 0.526392 0.307242 0.80054 0.533854 0.326757 0.802644 0.530296 0.358043 0.802834 0.530798 0.381598 0.803112 0.53495 0.40095 0.804607 0.530282 0.425442 0.801702 0.534968 0.454365 0.802258 0.532243 0.482946 0.802239 0.550832 0.000812619 0.807725 0.557438 0.0285946 0.807235 0.550407 0.0580878 0.802282 0.556112 0.0757231 0.802238 0.558354 0.107243 0.802658 0.557202 0.128322 0.806094 0.550681 0.151583 0.802226 0.5539 0.181174 0.808071 0.557335 0.209327 0.80334 0.552253 0.234086 0.804846 0.553261 0.251951 0.800285 0.550241 0.282065 0.804963 0.556556 0.300284 0.805115 0.556523 0.32926 0.801883 0.554664 0.354701 0.805842 0.554239 0.377211 0.805088 0.550394 0.40108 0.802501 0.550213 0.428679 0.807375 0.555289 0.453686 0.800892 0.550294 0.480016 0.800259 0.581852 0.000297869 0.801889 0.581933 0.0263979 0.808273 0.579667 0.0547372 0.802617 0.582435 0.0779453 0.808332 0.576739 0.108562 0.807014 0.575759 0.126597 0.806757 0.581314 0.152366 0.805202 0.575896 0.183147 0.807314 0.578227 0.209902 0.809252 0.57876 0.228934 0.805554 0.582019 0.257311 0.807673 0.575587 0.28486 0.803952 0.5758 0.304885 0.808343 0.577457 0.327288 0.806562 0.583286 0.356065 0.806072 0.58435 0.377689 0.804693 0.580158 0.40185 0.802095 0.582415 0.425735 0.807706 0.584161 0.457716 0.803025 0.576516 0.481616 0.802967 0.606825 0.00221755 0.802607 0.603495 0.0310045 0.800778 0.600327 0.0540408 0.809241 0.600164 0.0767072 0.801634 0.606883 0.103945 0.807344 0.604046 0.127779 0.802338 0.606474 0.153926 0.808511 0.606342 0.178979 0.807064 0.602732 0.2077 0.803715 0.602523 0.233831 0.804171 0.603953 0.25568 0.80737 0.600911 0.28183 0.807748 0.609408 0.30307 0.807369 0.601625 0.330808 0.806089 0.601935 0.350793 0.809988 0.606039 0.376806 0.80653 0.605374 0.405781 0.805787 0.607282 0.433589 0.805358 0.600021 0.450351 0.808437 0.608905 0.477202 0.809995 0.628851 0.00111064 0.807659 0.626874 0.0348236 0.805208 0.627753 0.0529262 0.804042 0.626056 0.0810896 0.80915 0.627479 0.106632 0.80443 0.629296 0.129928 0.802688 0.625035 0.157617 0.800799 0.632928 0.176612 0.803129 0.632004 0.208557 0.807016 0.625274 0.233213 0.809825 0.627233 0.25257 0.801056 0.625174 0.280799 0.8073 0.632992 0.308123 0.808348 0.628271 0.334887 0.804175 0.629001 0.352222 0.80404 0.626178 0.384416 0.801804 0.628192 0.406776 0.800813 0.632922 0.426452 0.806438 0.62759 0.452397 0.802011 0.634053 0.484408 0.808566 0.655007 0.00389944 0.80806 0.655014 0.0339782 0.806054 0.654988 0.0529037 0.807443 0.650684 0.0840405 0.809242 0.650687 0.107359 0.808696 0.650253 0.133347 0.806271 0.655425 0.151366 0.808848 0.655336 0.179616 0.803004 0.658818 0.202352 0.807282 0.651494 0.232684 0.80004 0.656978 0.258467 0.806662 0.654775 0.284401 0.8087 0.655987 0.306493 0.807312 0.658515 0.326815 0.80757 0.650927 0.354747 0.803624 0.650875 0.381813 0.807613 0.651944 0.400672 0.804722 0.651146 0.428924 0.807093 0.657429 0.458555 0.803711 0.653646 0.484588 0.800086 0.680336 0.00410358 0.80633 0.675503 0.031083 0.80741 0.679691 0.0570332 0.808035 0.682433 0.0772916 0.805784 0.683225 0.104817 0.809654 0.676742 0.12872 0.805366 0.684287 0.150295 0.806026 0.683748 0.180622 0.804784 0.684774 0.201462 0.802103 0.682345 0.233104 0.803347 0.677335 0.258775 0.802151 0.675234 0.276162 0.806283 0.679259 0.309986 0.803736 0.681993 0.329886 0.802103 0.683878 0.355383 0.806784 0.679602 0.384965 0.807223 0.682962 0.407078 0.807888 0.678082 0.432762 0.807168 0.681737 0.45538 0.80942 0.678982 0.477248 0.802922 0.703568 0.00722837 0.80403 0.701656 0.0270524 0.80353 0.706323 0.0552945 0.801126 0.701653 0.079789 0.801817 0.709815 0.10906 0.802496 0.703462 0.134206 0.802089 0.700905 0.157599 0.804153 0.708299 0.183056 0.802225 0.701962 0.209932 0.808129 0.703123 0.230859 0.803202 0.703668 0.255075 0.801313 0.706062 0.27877 0.808748 0.703791 0.302603 0.800667 0.709707 0.334296 0.801081 0.701035 0.35982 0.807791 0.704163 0.377118 0.802362 0.701528 0.409353 0.801691 0.705442 0.434493 0.807972 0.703016 0.458627 0.8081 0.706714 0.479379 0.801548 0.726363 0.00401209 0.808331 0.727051 0.0338291 0.807453 0.734326 0.0533218 0.801264 0.734672 0.0786888 0.802192 0.730622 0.100845 0.801494 0.729336 0.132127 0.801507 0.727384 0.15059 0.805924 0.726364 0.178253 0.80363 0.728885 0.207523 0.804185 0.73154 0.232688 0.809522 0.729572 0.257419 0.802746 0.727413 0.280885 0.804532 0.733126 0.30224 0.803382 0.734099 0.326062 0.808356 0.725952 0.351739 0.805627 0.727621 0.376335 0.809802 0.734619 0.40829 0.805757 0.732046 0.431625 0.809056 0.725431 0.451862 0.80297 0.731872 0.477873 0.827761 0.00699878 0.00268802 0.82919 0.00925886 0.0326071 0.831741 0.00770267 0.0563684 0.825581 0.000464537 0.077945 0.827343 0.00223372 0.104162 0.828305 0.00248854 0.130776 0.833206 0.00660634 0.158972 0.829149 0.00863625 0.184716 0.829513 0.0049359 0.204449 0.834837 0.000563455 0.230879 0.830642 0.00826756 0.251341 0.825146 0.00116933 0.27893 0.834498 0.00655566 0.300329 0.833476 0.00707071 0.32838 0.826914 0.00691411 0.353821 0.82829 0.00266639 0.379889 0.825568 0.00860691 0.401357 0.833379 0.00626033 0.433774 0.826351 0.00399248 0.457402 0.833359 0.00285639 0.483387 0.832171 0.027726 0.00456755 0.831708 0.0338056 0.0325082 0.827175 0.0254238 0.0552644 0.831407 0.0256192 0.0753413 0.82606 0.0275689 0.10623 0.831817 0.030667 0.126422 0.825394 0.0299299 0.15394 0.830708 0.030456 0.176303 0.827224 0.0312843 0.206637 0.827844 0.0337534 0.233818 0.832156 0.0324926 0.259803 0.831818 0.0270916 0.282249 0.829875 0.0295116 0.305109 0.828878 0.027806 0.33436 0.834719 0.029551 0.358673 0.832702 0.0325942 0.380708 0.833105 0.0339567 0.403392 0.833324 0.02525 0.428548 0.826983 0.0265783 0.454174 0.833246 0.0317399 0.482366 0.826503 0.0549802 0.00912815 0.832915 0.0533082 0.0315907 0.826165 0.0585185 0.0536967 0.830759 0.0548413 0.082632 0.825541 0.0531473 0.101402 0.830677 0.0539319 0.128088 0.833975 0.0502323 0.151076 0.82703 0.0584954 0.175009 0.832692 0.0571568 0.204824 0.834344 0.0579156 0.227512 0.830554 0.0528392 0.258996 0.828683 0.0528722 0.275286 0.827701 0.0522786 0.301235 0.826854 0.0505873 0.334515 0.828286 0.0546194 0.355744 0.832163 0.0595507 0.378357 0.829061 0.0506483 0.400956 0.825853 0.0557319 0.431493 0.827296 0.0581296 0.453876 0.831661 0.0553866 0.475474 0.830633 0.0842166 0.00216266 0.831128 0.084769 0.0304641 0.830286 0.0812947 0.0589777 0.827303 0.075435 0.0807382 0.834278 0.0825358 0.104316 0.830754 0.0848675 0.134569 0.828054 0.0815832 0.155773 0.834364 0.0751239 0.180243 0.825824 0.0810397 0.202797 0.825983 0.0827028 0.22667 0.828545 0.0777924 0.254895 0.825242 0.0783268 0.283102 0.826579 0.0841864 0.308621 0.830533 0.0773191 0.329394 0.827962 0.0815179 0.35467 0.830261 0.0819806 0.380225 0.832492 0.0753761 0.402141 0.83052 0.0783057 0.431336 0.827032 0.0848396 0.458966 0.832567 0.0837696 0.477765 0.834251 0.108507 0.00940035 0.826701 0.103798 0.0321628 0.834922 0.106111 0.0597008 0.825773 0.100102 0.0780104 0.832669 0.106431 0.106659 0.825414 0.106101 0.132347 0.827062 0.107705 0.15391 0.830501 0.101162 0.180873 0.828216 0.104438 0.203738 0.829564 0.107784 0.233755 0.826804 0.103093 0.252666 0.830304 0.100863 0.275222 0.832244 0.102668 0.302317 0.826487 0.104475 0.326036 0.828625 0.102328 0.357704 0.827019 0.105782 0.37682 0.831111 0.103557 0.406935 0.827474 0.106344 0.4318 0.827819 0.100787 0.45094 0.826578 0.1009 0.480705 0.825947 0.127878 0.00605055 0.83033 0.132064 0.0349378 0.827056 0.133451 0.0593479 0.825459 0.134699 0.0820962 0.828116 0.132614 0.108518 0.834523 0.133175 0.130784 0.828973 0.12789 0.159726 0.835 0.12876 0.18446 0.828796 0.128085 0.208837 0.83029 0.129098 0.231554 0.829457 0.126969 0.254086 0.830841 0.125666 0.283688 0.825436 0.130823 0.307535 0.832431 0.131981 0.333622 0.833344 0.134921 0.350781 0.831004 0.125375 0.377568 0.825647 0.128398 0.402419 0.834414 0.134241 0.425727 0.830984 0.127189 0.450534 0.832103 0.127083 0.483272 0.832569 0.156519 0.0018701 0.833688 0.150585 0.0254446 0.834944 0.159124 0.0515647 0.825552 0.157335 0.0774341 0.834443 0.151482 0.103835 0.828685 0.155888 0.1297 0.833962 0.151546 0.157606 0.826332 0.158214 0.182987 0.834518 0.154671 0.208178 0.827649 0.1582 0.228508 0.830129 0.157006 0.25532 0.826041 0.157938 0.280197 0.827265 0.15287 0.30615 0.82903 0.15495 0.327394 0.83283 0.150659 0.359269 0.829927 0.152221 0.38152 0.829703 0.159434 0.40819 0.829477 0.154958 0.426331 0.832911 0.159461 0.458785 0.827942 0.154178 0.478074 0.826569 0.177797 0.000259458 0.834204 0.178985 0.0327682 0.82518 0.175376 0.059948 0.8314 0.175045 0.0807004 0.828736 0.184636 0.103419 0.833344 0.184173 0.125214 0.830121 0.183666 0.150177 0.82651 0.178161 0.178821 0.831909 0.17962 0.201268 0.828689 0.184948 0.226478 0.833555 0.184637 0.25292 0.831228 0.180929 0.282614 0.828213 0.179697 0.303794 0.826349 0.183899 0.332357 0.829109 0.183603 0.355654 0.832785 0.179032 0.377293 0.825117 0.176249 0.403781 0.830212 0.175043 0.430253 0.834284 0.183634 0.458228 0.825835 0.1752 0.475559 0.832408 0.204038 0.00640969 0.828055 0.200057 0.0317172 0.82966 0.202162 0.0577709 0.829037 0.20118 0.0753583 0.829159 0.208277 0.103457 0.830425 0.206967 0.134614 0.828447 0.200817 0.155518 0.825345 0.20707 0.183883 0.834172 0.209546 0.208458 0.832396 0.208889 0.231683 0.832911 0.202318 0.254389 0.825556 0.206474 0.276116 0.827957 0.200704 0.307385 0.829621 0.206397 0.327679 0.826035 0.20479 0.350754 0.828302 0.209452 0.381918 0.834426 0.203062 0.403443 0.834087 0.206587 0.432454 0.833419 0.207853 0.451186 0.833479 0.20733 0.481497 0.831102 0.23432 0.00323438 0.827177 0.230768 0.0308388 0.827546 0.233113 0.0540413 0.831002 0.23424 0.0758293 0.827421 0.22927 0.102022 0.830375 0.228788 0.125805 0.826013 0.225531 0.155229 0.826992 0.233761 0.178901 0.8288 0.232879 0.206712 0.828609 0.229326 0.231095 0.827622 0.234394 0.258721 0.834466 0.230159 0.27922 0.826419 0.228623 0.308238 0.831195 0.232099 0.325622 0.826799 0.230443 0.351139 0.832882 0.231005 0.382546 0.828424 0.233235 0.408617 0.827822 0.229997 0.429787 0.832886 0.22787 0.4595 0.828459 0.231118 0.478847 0.831584 0.250235 0.00852515 0.826426 0.25904 0.0342426 0.827559 0.259585 0.0550605 0.825977 0.250049 0.0786283 0.834823 0.25757 0.106756 0.82923 0.258945 0.133285 0.830854 0.250966 0.159741 0.829198 0.255998 0.175677 0.828747 0.25581 0.20466 0.828012 0.256637 0.227234 0.834869 0.255411 0.255087 0.82549 0.251168 0.280296 0.831969 0.259735 0.304112 0.828947 0.253615 0.333059 0.828752 0.254981 0.354997 0.825627 0.256048 0.383899 0.834221 0.252825 0.402824 0.827211 0.252477 0.427752 0.829541 0.2563 0.45988 0.829712 0.255702 0.478763 0.833637 0.276585 0.00298513 0.827266 0.279744 0.0302523 0.830152 0.277215 0.0515914 0.828282 0.278415 0.0762854 0.82707 0.283221 0.109107 0.833212 0.280299 0.131099 0.828428 0.284476 0.159984 0.834901 0.283502 0.180625 0.825657 0.279944 0.205368 0.826005 0.277174 0.233587 0.833656 0.284401 0.255403 0.834849 0.283942 0.278519 0.826144 0.277867 0.307165 0.828711 0.280107 0.330496 0.829298 0.283937 0.358855 0.828473 0.282894 0.378675 0.831749 0.28055 0.402482 0.834207 0.283295 0.42904 0.831325 0.282339 0.457097 0.827557 0.279128 0.477786 0.834789 0.301983 0.00625678 0.830887 0.30045 0.0264138 0.830285 0.306469 0.0527166 0.826886 0.301649 0.0841079 0.829157 0.302002 0.101331 0.833946 0.306718 0.12529 0.82526 0.300047 0.155786 0.829505 0.30609 0.182013 0.831418 0.30258 0.207666 0.832447 0.3028 0.2341 0.828471 0.302691 0.250268 0.834766 0.301219 0.282115 0.829177 0.300286 0.303192 0.8347 0.307153 0.330425 0.828557 0.303655 0.353533 0.829912 0.300523 0.375695 0.829116 0.300778 0.404396 0.827154 0.304976 0.427136 0.827336 0.302475 0.454748 0.83395 0.307495 0.480353 0.831224 0.328007 0.00822503 0.829968 0.325565 0.0328294 0.831941 0.33058 0.0582636 0.832138 0.330973 0.0762184 0.832076 0.32962 0.103168 0.827333 0.332261 0.129017 0.830223 0.334831 0.152111 0.829184 0.329525 0.180727 0.827355 0.331918 0.201857 0.833362 0.331482 0.232556 0.829607 0.328278 0.252447 0.83308 0.333267 0.281011 0.831061 0.331663 0.309035 0.827461 0.331205 0.329831 0.826525 0.33162 0.35998 0.831188 0.332974 0.379322 0.827086 0.332714 0.402212 0.833476 0.326774 0.428764 0.82722 0.329062 0.459405 0.828271 0.326641 0.480697 0.834062 0.35526 0.00141685 0.827937 0.357199 0.0311466 0.829088 0.357094 0.0526017 0.827767 0.352673 0.07711 0.829979 0.357415 0.103726 0.827304 0.357414 0.134084 0.831643 0.353124 0.158315 0.833656 0.35299 0.176732 0.832093 0.354 0.206028 0.826594 0.352659 0.229166 0.825275 0.356363 0.25737 0.829473 0.358335 0.27537 0.825787 0.356948 0.300052 0.830889 0.356536 0.327918 0.825755 0.355968 0.352846 0.832603 0.357775 0.38372 0.833436 0.355264 0.400046 0.832364 0.353067 0.434124 0.830259 0.355467 0.4584 0.828168 0.354433 0.484394 0.828946 0.379717 0.00962714 0.833246 0.378677 0.0278374 0.832702 0.378945 0.0569036 0.825255 0.375355 0.0767793 0.832765 0.381293 0.107898 0.825883 0.383281 0.132724 0.82948 0.383659 0.152319 0.834553 0.379355 0.182244 0.825888 0.376134 0.209605 0.8254 0.376289 0.231257 0.832124 0.382571 0.254263 0.826747 0.382986 0.282922 0.834356 0.379519 0.302302 0.825524 0.376309 0.330208 0.827674 0.384958 0.350799 0.834436 0.380246 0.381851 0.830037 0.384153 0.408487 0.83058 0.380512 0.428603 0.826218 0.376665 0.456756 0.831264 0.381369 0.482468 0.831061 0.403246 0.00958898 0.834591 0.406278 0.0293314 0.834635 0.405872 0.0533501 0.833099 0.403437 0.0797927 0.830408 0.401884 0.104515 0.834315 0.40882 0.134083 0.826095 0.409163 0.158344 0.830215 0.405459 0.181978 0.832868 0.408966 0.209994 0.826015 0.406472 0.225213 0.832717 0.40948 0.252657 0.832719 0.40603 0.278509 0.825475 0.400313 0.305881 0.834252 0.402397 0.331062 0.828586 0.406749 0.359697 0.825093 0.407256 0.384116 0.830754 0.407836 0.402347 0.834973 0.40724 0.427568 0.828198 0.407791 0.453117 0.829259 0.407067 0.475615 0.834425 0.432079 0.00990498 0.829072 0.431118 0.0258484 0.830599 0.43012 0.0599218 0.828802 0.427523 0.0821892 0.833017 0.425894 0.108619 0.827365 0.427108 0.125398 0.827882 0.43447 0.151353 0.832689 0.426775 0.179278 0.833035 0.431064 0.201711 0.83384 0.433611 0.226433 0.832225 0.434839 0.258751 0.833372 0.42574 0.277936 0.832537 0.430715 0.306949 0.833018 0.433676 0.333645 0.833764 0.428621 0.355248 0.82778 0.429589 0.377406 0.831221 0.42736 0.408419 0.825583 0.429278 0.431403 0.831116 0.430308 0.453903 0.827078 0.432225 0.480322 0.834313 0.456147 0.00211292 0.826886 0.453862 0.0267469 0.832235 0.45235 0.0555269 0.83199 0.456112 0.0805683 0.833825 0.452875 0.102576 0.827676 0.458154 0.128893 0.829095 0.454413 0.15437 0.830018 0.453062 0.180803 0.833199 0.451737 0.209982 0.829338 0.455618 0.230327 0.830141 0.450325 0.251056 0.832241 0.450752 0.284227 0.825369 0.454468 0.308457 0.834989 0.453197 0.325963 0.827695 0.459805 0.351151 0.834134 0.457502 0.376591 0.832073 0.454302 0.407215 0.827859 0.450629 0.42958 0.827998 0.453456 0.455893 0.833528 0.450586 0.484904 0.833411 0.479154 0.00694236 0.833394 0.48305 0.0253068 0.832133 0.484708 0.0523833 0.831598 0.483577 0.0780304 0.830633 0.475922 0.109394 0.827226 0.47944 0.131078 0.830912 0.481167 0.152641 0.829466 0.477005 0.177455 0.833676 0.47936 0.208925 0.827465 0.481359 0.228623 0.833299 0.476445 0.259964 0.834295 0.481041 0.279132 0.834656 0.475369 0.309881 0.833322 0.477197 0.333909 0.830107 0.477545 0.352887 0.82789 0.484828 0.376516 0.833415 0.480755 0.403692 0.828767 0.476557 0.434339 0.834571 0.48463 0.459544 0.826925 0.476265 0.481767 0.834937 0.503661 0.00801464 0.827346 0.504542 0.0261174 0.832571 0.500841 0.0514078 0.833659 0.508981 0.0846433 0.827355 0.500529 0.107343 0.834181 0.503475 0.131706 0.834699 0.503177 0.155305 0.826957 0.501393 0.183848 0.83412 0.509073 0.208716 0.832174 0.504259 0.233479 0.833076 0.503509 0.256431 0.825711 0.506347 0.282408 0.833249 0.500343 0.307128 0.829201 0.505299 0.333496 0.829588 0.505926 0.355099 0.826311 0.509987 0.38013 0.828382 0.50746 0.406269 0.831073 0.505048 0.429554 0.831813 0.506038 0.453515 0.826322 0.505148 0.482043 0.831351 0.530465 0.000651827 0.825041 0.526246 0.0257563 0.834636 0.534719 0.0504241 0.832238 0.528456 0.0809874 0.829325 0.530267 0.102895 0.830864 0.529207 0.128922 0.831986 0.532391 0.155578 0.827283 0.526153 0.175889 0.834124 0.529799 0.204031 0.830748 0.531858 0.225147 0.825267 0.531326 0.259255 0.828405 0.526827 0.279693 0.829529 0.525032 0.307787 0.826953 0.531165 0.329289 0.825074 0.527831 0.356286 0.830509 0.52908 0.384024 0.829203 0.525673 0.400545 0.832316 0.530035 0.432487 0.826438 0.530507 0.458024 0.831616 0.528886 0.482322 0.833005 0.55653 0.00451539 0.826381 0.553593 0.0329546 0.826967 0.556348 0.0583193 0.829218 0.558915 0.0820697 0.829988 0.557343 0.100854 0.830011 0.551841 0.125095 0.832317 0.550926 0.151955 0.825058 0.550348 0.176451 0.829259 0.55105 0.204123 0.827295 0.557347 0.23386 0.825897 0.554734 0.252108 0.830477 0.550304 0.280132 0.834338 0.558191 0.307664 0.832792 0.556707 0.330477 0.834825 0.553439 0.350621 0.825242 0.554541 0.375297 0.826827 0.556516 0.407861 0.82881 0.555663 0.433037 0.832975 0.558659 0.454324 0.830466 0.558874 0.477303 0.832537 0.578553 0.00163406 0.834812 0.57694 0.0297332 0.834507 0.57753 0.0578613 0.827126 0.583119 0.0828653 0.828998 0.577349 0.107297 0.834372 0.581925 0.132915 0.828215 0.582817 0.158831 0.830271 0.576204 0.183043 0.831214 0.584032 0.201502 0.833538 0.58142 0.23093 0.829102 0.576386 0.252247 0.830099 0.584529 0.28301 0.83097 0.575095 0.300523 0.834181 0.583865 0.329447 0.829223 0.582398 0.355887 0.832497 0.580208 0.377069 0.829952 0.57796 0.409711 0.831974 0.583021 0.430353 0.834298 0.584213 0.455934 0.826657 0.580314 0.481126 0.833902 0.608891 0.00136478 0.828231 0.600337 0.0304761 0.826138 0.601717 0.0581992 0.827322 0.609913 0.0831338 0.832191 0.60148 0.105336 0.82893 0.608639 0.1333 0.827459 0.605986 0.156137 0.825699 0.608965 0.181401 0.827238 0.603842 0.203848 0.830865 0.609717 0.229173 0.825099 0.607894 0.254851 0.830943 0.603081 0.2793 0.831507 0.600401 0.30884 0.831103 0.604753 0.325659 0.828606 0.609834 0.35452 0.833385 0.608756 0.375232 0.826278 0.605302 0.406733 0.830604 0.606619 0.432703 0.833323 0.607951 0.456343 0.829594 0.601681 0.477921 0.828534 0.629665 0.00804041 0.82903 0.630143 0.0330772 0.833574 0.63069 0.0555572 0.826476 0.629995 0.0775071 0.827236 0.632945 0.10267 0.825243 0.625951 0.128575 0.831887 0.626599 0.155785 0.828513 0.634066 0.182626 0.832698 0.633806 0.201787 0.825727 0.630817 0.226037 0.832181 0.63075 0.255334 0.825955 0.633213 0.27701 0.827024 0.63028 0.303426 0.831906 0.630292 0.334308 0.827528 0.629362 0.352836 0.827339 0.633663 0.377119 0.826457 0.63036 0.407103 0.831949 0.625302 0.426556 0.829244 0.632575 0.457421 0.832583 0.628206 0.475154 0.829632 0.658062 0.00679187 0.834908 0.653314 0.0302323 0.832163 0.656459 0.058194 0.831485 0.657165 0.0815426 0.828042 0.652603 0.106978 0.82566 0.651194 0.12564 0.828546 0.654464 0.152237 0.830822 0.659302 0.1837 0.825343 0.653672 0.202017 0.830818 0.658305 0.230314 0.828412 0.657087 0.257365 0.833026 0.650598 0.276543 0.831587 0.658417 0.30969 0.825304 0.656398 0.329876 0.829258 0.654892 0.350834 0.833246 0.65498 0.376954 0.833028 0.658204 0.40917 0.830134 0.651938 0.43191 0.831164 0.656443 0.453018 0.834573 0.654136 0.482995 0.831191 0.67842 0.00630848 0.826961 0.675579 0.03084 0.830967 0.678459 0.0532224 0.834243 0.679823 0.0772089 0.829524 0.678541 0.103435 0.828452 0.679182 0.132344 0.829195 0.678902 0.155516 0.825474 0.676334 0.176613 0.827766 0.678771 0.201093 0.834397 0.684255 0.232147 0.827203 0.679867 0.255233 0.829375 0.683893 0.283976 0.83346 0.683179 0.308268 0.826849 0.675672 0.328078 0.82699 0.680307 0.351212 0.83148 0.675327 0.381358 0.834514 0.677257 0.409686 0.828351 0.684433 0.4261 0.828411 0.67995 0.456481 0.825296 0.683868 0.477657 0.834044 0.703016 0.00135431 0.831575 0.704011 0.0310977 0.825235 0.705326 0.0577085 0.826776 0.703661 0.0836923 0.828578 0.705456 0.102386 0.827214 0.706969 0.13496 0.833432 0.708723 0.155239 0.8346 0.701741 0.176954 0.828054 0.701672 0.204543 0.826863 0.700267 0.226905 0.828975 0.702237 0.254674 0.830944 0.704752 0.281316 0.832792 0.704816 0.304394 0.825462 0.706695 0.330828 0.83395 0.70481 0.35397 0.830351 0.700534 0.376341 0.830788 0.709229 0.40339 0.831897 0.701435 0.429223 0.825141 0.702333 0.457807 0.833043 0.707413 0.475005 0.832498 0.725547 0.00164569 0.828887 0.731986 0.0330957 0.828902 0.733433 0.0519097 0.826412 0.72728 0.075396 0.828868 0.728499 0.103513 0.833591 0.733834 0.128169 0.82604 0.734482 0.152285 0.83057 0.730589 0.180637 0.828179 0.734168 0.209866 0.826775 0.730685 0.233259 0.82558 0.726395 0.258374 0.831932 0.731586 0.275714 0.834634 0.734151 0.309789 0.830914 0.726283 0.331242 0.832469 0.727049 0.350419 0.832525 0.733303 0.380379 0.825073 0.733464 0.405549 0.830704 0.734329 0.433719 0.831088 0.732189 0.452508 0.831599 0.728259 0.483474 0.858422 0.0070954 0.000389799 0.85901 0.00544349 0.0299937 0.854399 0.00458694 0.0563529 0.858265 0.00983636 0.0773118 0.85107 0.00742907 0.100956 0.852628 0.00221313 0.129923 0.85691 0.00252279 0.151845 0.852388 0.00488968 0.17652 0.851195 0.00962808 0.200852 0.857292 0.00400414 0.229715 0.853625 0.00530617 0.258417 0.852186 0.00744913 0.276548 0.859017 0.00357082 0.300708 0.856324 0.00622993 0.333886 0.855681 0.00307313 0.353449 0.857641 0.00985137 0.384052 0.855968 0.00579913 0.403707 0.855095 0.00029173 0.434867 0.851417 0.00234983 0.457215 0.858579 0.00832264 0.478085 0.859029 0.0306358 0.00527827 0.856144 0.0314254 0.0317593 0.852679 0.0263475 0.0574494 0.850319 0.0279704 0.0846813 0.85199 0.0264184 0.106773 0.851286 0.0305349 0.129336 0.855033 0.0274107 0.154696 0.85126 0.0290512 0.182268 0.850637 0.0314942 0.206551 0.855272 0.0259385 0.228651 0.855298 0.0329386 0.253577 0.859262 0.0300387 0.284715 0.851003 0.0289733 0.307932 0.850473 0.0323179 0.327848 0.859989 0.0291192 0.356286 0.858743 0.0297933 0.377835 0.853432 0.0334891 0.40273 0.852465 0.0324047 0.430423 0.851572 0.0293613 0.456682 0.85516 0.033514 0.483068 0.859805 0.0545418 0.00613497 0.858195 0.0547635 0.0331149 0.850168 0.0559952 0.054705 0.857855 0.0561825 0.084971 0.858474 0.0520904 0.104117 0.851366 0.050996 0.134587 0.85389 0.055978 0.157412 0.856796 0.0550674 0.182184 0.85805 0.05653 0.207512 0.850546 0.0576731 0.232404 0.855252 0.0545473 0.250318 0.856733 0.0502731 0.281821 0.850955 0.0581556 0.307754 0.850141 0.0520525 0.330839 0.856285 0.0572785 0.358982 0.852887 0.0511607 0.375766 0.854532 0.0547415 0.401739 0.850332 0.0532308 0.42735 0.854539 0.0523271 0.458754 0.852165 0.0571552 0.482218 0.857558 0.0794975 0.00756347 0.851169 0.0787338 0.0260164 0.853079 0.0839784 0.0505197 0.850573 0.0755392 0.0839621 0.854246 0.0829079 0.107305 0.856807 0.0799409 0.131807 0.852977 0.0834179 0.15215 0.851138 0.0814235 0.175273 0.854577 0.0838 0.207438 0.856057 0.0772747 0.228569 0.85831 0.0820355 0.251621 0.853243 0.0824199 0.284951 0.857251 0.0783656 0.305011 0.854509 0.0792203 0.334554 0.854198 0.0799355 0.355643 0.857336 0.0824212 0.383682 0.850188 0.0771951 0.407763 0.855103 0.0792758 0.43377 0.854132 0.0827532 0.451652 0.852981 0.076233 0.478596 0.858738 0.104057 0.00687612 0.858617 0.105508 0.0265128 0.856477 0.102664 0.0557137 0.850161 0.104102 0.0773303 0.856234 0.10103 0.101053 0.852753 0.106994 0.133034 0.852394 0.100653 0.150884 0.856437 0.103045 0.183001 0.857833 0.105471 0.202678 0.859528 0.100883 0.226023 0.850878 0.106925 0.251625 0.856541 0.104469 0.281907 0.851624 0.108505 0.309786 0.85132 0.108818 0.328765 0.856766 0.101745 0.358809 0.8574 0.105241 0.378412 0.850431 0.10349 0.408607 0.858163 0.109984 0.430462 0.856361 0.101195 0.45558 0.854538 0.105839 0.478803 0.850769 0.127937 0.00907987 0.854513 0.133016 0.0301471 0.853128 0.129202 0.0579193 0.85473 0.134701 0.0849457 0.85883 0.128454 0.10192 0.855669 0.13055 0.128223 0.854326 0.125844 0.151219 0.852323 0.13068 0.182582 0.856588 0.130461 0.208638 0.859971 0.133456 0.225214 0.853521 0.126287 0.25886 0.850675 0.130506 0.281094 0.858096 0.130944 0.302083 0.856844 0.129062 0.331722 0.854976 0.127649 0.353809 0.856692 0.128433 0.375771 0.85834 0.131901 0.402351 0.856085 0.126261 0.430427 0.853648 0.132611 0.455178 0.851844 0.130268 0.478894 0.855933 0.156018 0.00273219 0.855667 0.154871 0.0296723 0.859936 0.157477 0.0589149 0.851762 0.151596 0.077577 0.859986 0.15148 0.100064 0.852971 0.151341 0.130768 0.855892 0.159524 0.152895 0.853326 0.159343 0.178976 0.85937 0.159724 0.209715 0.853839 0.159733 0.22541 0.859872 0.153686 0.259379 0.850925 0.15439 0.283492 0.854924 0.153857 0.304363 0.850396 0.157408 0.331124 0.858878 0.153567 0.351827 0.85563 0.159606 0.384529 0.857776 0.154774 0.408683 0.859176 0.157948 0.427509 0.852254 0.157417 0.453281 0.853515 0.159576 0.476477 0.857731 0.180758 0.00576628 0.856889 0.178424 0.033399 0.850939 0.178474 0.0519268 0.854145 0.184035 0.0774061 0.857672 0.176268 0.101068 0.850087 0.175235 0.129318 0.853119 0.177945 0.157978 0.851941 0.178403 0.177627 0.853068 0.184186 0.202359 0.854144 0.183444 0.233431 0.858311 0.176243 0.259034 0.851911 0.175124 0.282311 0.850337 0.178282 0.309792 0.855199 0.182082 0.32541 0.857445 0.176807 0.357498 0.855282 0.175284 0.384864 0.856083 0.179832 0.404879 0.859071 0.175579 0.427326 0.859583 0.181228 0.450111 0.858398 0.179089 0.476061 0.858551 0.202994 0.00584437 0.853422 0.204651 0.0251747 0.855826 0.20327 0.0524142 0.851528 0.207595 0.0822579 0.857531 0.206922 0.105266 0.852616 0.209166 0.12833 0.855751 0.208093 0.158539 0.859941 0.203994 0.178496 0.853742 0.205848 0.203736 0.859492 0.20331 0.227049 0.850315 0.201096 0.252843 0.852767 0.201982 0.280086 0.850388 0.209223 0.306013 0.859623 0.207365 0.332789 0.850306 0.204787 0.355132 0.851274 0.208232 0.379571 0.859498 0.207986 0.40799 0.853111 0.200539 0.43097 0.859682 0.202344 0.456435 0.855678 0.206726 0.476715 0.852982 0.226442 0.00907204 0.857607 0.230155 0.027116 0.856013 0.230471 0.0503813 0.852404 0.231329 0.08358 0.851716 0.23086 0.104098 0.856423 0.226366 0.131778 0.853961 0.228182 0.154158 0.853669 0.225086 0.177743 0.856634 0.225599 0.206734 0.854364 0.225206 0.226976 0.854452 0.225513 0.25789 0.850787 0.231738 0.276322 0.859735 0.227568 0.305882 0.854535 0.230511 0.332281 0.859863 0.229318 0.357218 0.856966 0.227084 0.375674 0.853378 0.233338 0.402727 0.854813 0.226228 0.425178 0.851016 0.2313 0.458216 0.855384 0.23118 0.484305 0.856471 0.25599 0.00685805 0.85728 0.251218 0.0316937 0.852648 0.254822 0.0588114 0.852773 0.251938 0.0846606 0.851699 0.252391 0.109785 0.856372 0.255262 0.125906 0.851857 0.251704 0.156152 0.856804 0.252176 0.176811 0.859023 0.250327 0.206061 0.857252 0.251139 0.233014 0.856147 0.257581 0.254309 0.859492 0.250263 0.279546 0.855187 0.258629 0.300157 0.859556 0.256919 0.330067 0.850244 0.255535 0.353087 0.856238 0.254677 0.381822 0.854301 0.255049 0.408855 0.859528 0.255823 0.431796 0.850986 0.252664 0.45318 0.856686 0.259274 0.476562 0.850711 0.284283 0.00791142 0.856228 0.278764 0.0295798 0.858004 0.275263 0.0593088 0.855365 0.284153 0.0754009 0.856987 0.278637 0.100465 0.852189 0.280103 0.128506 0.851557 0.281268 0.155282 0.856178 0.275545 0.18463 0.859107 0.278009 0.206474 0.85221 0.282991 0.227421 0.853028 0.281678 0.259075 0.859797 0.277151 0.281148 0.859658 0.283819 0.304413 0.853996 0.282263 0.327388 0.855006 0.277761 0.353182 0.859284 0.278321 0.381201 0.852405 0.278503 0.401605 0.853593 0.275086 0.425189 0.856426 0.281983 0.453884 0.859997 0.27615 0.481876 0.857004 0.301234 0.00963154 0.856197 0.309969 0.0264074 0.850385 0.305639 0.050901 0.850744 0.307096 0.0750343 0.857412 0.305301 0.108971 0.857202 0.305507 0.130793 0.852614 0.300067 0.156709 0.855831 0.303578 0.179514 0.857974 0.304638 0.208853 0.859491 0.305896 0.225424 0.853211 0.309958 0.257878 0.851406 0.300014 0.280191 0.855876 0.308363 0.306619 0.855222 0.300326 0.325706 0.852553 0.30241 0.351949 0.854189 0.305032 0.381629 0.851162 0.302903 0.406822 0.854729 0.309503 0.433282 0.85992 0.303927 0.45504 0.859146 0.309682 0.480846 0.856592 0.331802 0.00598288 0.851944 0.331494 0.0339471 0.854479 0.326194 0.0525465 0.853199 0.329174 0.0837463 0.850018 0.327078 0.1001 0.856836 0.334678 0.128965 0.858193 0.325998 0.157663 0.850874 0.330269 0.175272 0.85464 0.326959 0.200575 0.857036 0.326679 0.233645 0.857738 0.327794 0.257092 0.851702 0.326313 0.27587 0.855328 0.329835 0.300537 0.855856 0.330913 0.327346 0.852725 0.330795 0.357154 0.857803 0.33412 0.379559 0.857424 0.330698 0.409209 0.854574 0.327711 0.426663 0.853857 0.334787 0.455814 0.858624 0.334484 0.47927 0.853049 0.354488 0.00209252 0.856817 0.353299 0.026436 0.851899 0.357721 0.0510767 0.851369 0.352793 0.0772604 0.856383 0.356465 0.100515 0.850371 0.355355 0.132302 0.854639 0.353118 0.155081 0.853911 0.350773 0.175718 0.85583 0.351695 0.205373 0.851392 0.353922 0.230278 0.858788 0.354997 0.257557 0.8584 0.356178 0.28023 0.857127 0.358226 0.307568 0.851869 0.356546 0.327617 0.859922 0.352904 0.355511 0.850515 0.356789 0.375877 0.856542 0.358729 0.40621 0.859031 0.359292 0.429854 0.850138 0.359225 0.456754 0.851239 0.359371 0.478422 0.859304 0.375956 0.00571856 0.855019 0.38334 0.0292889 0.857708 0.376694 0.058881 0.855841 0.375501 0.0765438 0.851794 0.378966 0.103699 0.853344 0.375065 0.133541 0.8594 0.381381 0.158301 0.85158 0.380128 0.182377 0.850753 0.375764 0.20319 0.851191 0.380575 0.230388 0.856612 0.38278 0.253873 0.850764 0.38219 0.277857 0.852759 0.377899 0.309425 0.851137 0.380749 0.328713 0.854402 0.379356 0.359535 0.855778 0.380112 0.381508 0.858462 0.383192 0.402625 0.854176 0.376756 0.429649 0.854959 0.378314 0.450166 0.855091 0.379963 0.481422 0.85965 0.401631 0.00308676 0.856456 0.408118 0.0271273 0.857079 0.409831 0.0549037 0.854325 0.405667 0.0840952 0.851446 0.404531 0.10261 0.852845 0.409794 0.131139 0.852538 0.402663 0.154596 0.859964 0.400173 0.178621 0.854947 0.404342 0.200393 0.850493 0.407808 0.228702 0.851602 0.408388 0.252266 0.859038 0.408603 0.281204 0.857998 0.408275 0.30121 0.858923 0.406099 0.328372 0.859753 0.400463 0.351976 0.850311 0.400163 0.375077 0.85883 0.40772 0.406988 0.850059 0.404047 0.431168 0.858384 0.401281 0.456722 0.858341 0.409416 0.476391 0.851745 0.432071 0.00877224 0.851708 0.433058 0.0290417 0.854944 0.43139 0.0567179 0.853949 0.430023 0.0824303 0.858423 0.427771 0.107193 0.852663 0.427537 0.126943 0.8548 0.425276 0.157311 0.853732 0.43443 0.176225 0.857665 0.429631 0.204628 0.852345 0.431131 0.234611 0.853802 0.429567 0.259675 0.85843 0.426508 0.282174 0.850189 0.432817 0.308592 0.854998 0.431381 0.333337 0.858952 0.433411 0.356232 0.859239 0.434712 0.383226 0.850552 0.432211 0.40191 0.859495 0.427742 0.432983 0.855177 0.434941 0.457551 0.852116 0.430899 0.478342 0.852328 0.455774 0.00292519 0.853818 0.459399 0.0279116 0.850512 0.459323 0.0542901 0.85027 0.453036 0.0828027 0.854532 0.450236 0.106481 0.855915 0.450692 0.132399 0.855101 0.451784 0.159838 0.852294 0.458431 0.176328 0.85116 0.454042 0.20034 0.85386 0.450409 0.227471 0.852601 0.451145 0.259988 0.85882 0.455892 0.279262 0.852931 0.452659 0.309902 0.851541 0.454153 0.330619 0.855634 0.455709 0.350578 0.850438 0.459915 0.384003 0.852324 0.456549 0.407882 0.85648 0.450902 0.426744 0.850688 0.452657 0.453083 0.858499 0.455369 0.482808 0.853285 0.479509 0.00253393 0.853256 0.48022 0.0251768 0.856997 0.475322 0.0592405 0.852915 0.476393 0.078703 0.854182 0.479588 0.104054 0.855249 0.482092 0.131348 0.858827 0.484561 0.156544 0.855277 0.480797 0.179795 0.852377 0.476933 0.201182 0.854445 0.483715 0.228331 0.85064 0.477738 0.256688 0.854607 0.47507 0.27939 0.856999 0.481134 0.309495 0.850638 0.475624 0.329088 0.859936 0.482362 0.353606 0.858192 0.482286 0.382251 0.851007 0.47882 0.406216 0.858898 0.482227 0.433935 0.85712 0.483778 0.458585 0.852988 0.484319 0.477561 0.857411 0.502361 0.00913409 0.855356 0.500096 0.034037 0.855528 0.504342 0.0591007 0.85861 0.502691 0.0798805 0.857713 0.504795 0.105795 0.853467 0.507447 0.13313 0.856221 0.508664 0.159678 0.85123 0.507349 0.183133 0.85327 0.504962 0.203781 0.854703 0.508235 0.229192 0.851086 0.503648 0.256401 0.856833 0.501174 0.278401 0.854845 0.501023 0.309746 0.852147 0.507542 0.331278 0.857363 0.507489 0.358111 0.850878 0.508074 0.382628 0.859244 0.508778 0.408801 0.852555 0.506844 0.425767 0.856309 0.507375 0.453157 0.851056 0.505318 0.482131 0.859253 0.53287 0.00267697 0.85103 0.528765 0.0300742 0.856234 0.526601 0.0593923 0.857521 0.533842 0.0765269 0.858532 0.52604 0.104487 0.853315 0.528668 0.130405 0.854682 0.532915 0.150541 0.855779 0.529737 0.176261 0.85346 0.526955 0.205223 0.858688 0.527547 0.226201 0.858647 0.532392 0.254747 0.856743 0.528058 0.280655 0.850677 0.526266 0.306823 0.853284 0.526978 0.325731 0.854174 0.527624 0.351935 0.854853 0.527299 0.375186 0.851382 0.529635 0.403753 0.850198 0.527124 0.431243 0.854808 0.532717 0.458415 0.852399 0.526206 0.482846 0.859858 0.554545 0.00864961 0.851476 0.555103 0.0347698 0.85048 0.557079 0.0578978 0.858319 0.559436 0.0776553 0.855655 0.559331 0.1025 0.855028 0.555231 0.12691 0.856666 0.553378 0.152942 0.854972 0.551504 0.181024 0.852024 0.555544 0.209713 0.859933 0.55414 0.225761 0.855979 0.559881 0.254862 0.852127 0.554587 0.277341 0.851211 0.551451 0.307936 0.859494 0.551526 0.33484 0.857572 0.552742 0.350709 0.854438 0.551323 0.382091 0.852992 0.551163 0.409782 0.857008 0.557892 0.430885 0.85154 0.558038 0.455273 0.855716 0.553511 0.478651 0.852086 0.581959 0.00319838 0.853413 0.580288 0.0314581 0.857326 0.576636 0.0538321 0.859625 0.577566 0.0827833 0.853015 0.581212 0.101831 0.853999 0.58446 0.1303 0.854441 0.581531 0.156867 0.854213 0.577185 0.182336 0.855441 0.578816 0.200608 0.857937 0.57542 0.225455 0.856615 0.583152 0.253098 0.854596 0.583473 0.283776 0.856433 0.583955 0.302393 0.855833 0.579089 0.331726 0.854006 0.583629 0.358437 0.859766 0.57707 0.383577 0.858447 0.584708 0.402687 0.857321 0.576068 0.428534 0.853093 0.577984 0.459893 0.852054 0.580791 0.476968 0.857802 0.601719 0.00337152 0.850237 0.607659 0.0256099 0.857077 0.604927 0.0587818 0.850221 0.603844 0.0767821 0.850096 0.609531 0.106681 0.851648 0.602011 0.129064 0.856642 0.60526 0.152993 0.854141 0.604862 0.182875 0.858366 0.606064 0.204058 0.857066 0.604721 0.226588 0.858148 0.608962 0.254578 0.852937 0.609199 0.276369 0.85103 0.607158 0.30436 0.85015 0.608633 0.333182 0.853958 0.60667 0.354716 0.852376 0.601043 0.380575 0.858892 0.60227 0.403696 0.85006 0.609158 0.433631 0.853875 0.605514 0.451605 0.857137 0.600944 0.481233 0.850263 0.632944 0.00780608 0.855907 0.626514 0.0288058 0.852302 0.627975 0.058262 0.85072 0.628852 0.0765416 0.856733 0.634074 0.103743 0.8574 0.634458 0.133849 0.858759 0.629478 0.152206 0.85964 0.634547 0.182484 0.858069 0.626363 0.203062 0.852231 0.630704 0.234772 0.859226 0.626635 0.250062 0.85899 0.630489 0.281063 0.856534 0.626704 0.304955 0.854919 0.629095 0.328434 0.858063 0.633297 0.359917 0.856282 0.634277 0.379384 0.859501 0.631964 0.406837 0.859018 0.634356 0.430098 0.859124 0.632458 0.457634 0.857991 0.632713 0.481734 0.855188 0.654312 0.00760255 0.856795 0.650832 0.0337188 0.855494 0.654614 0.0500192 0.854694 0.659355 0.0771316 0.852742 0.651657 0.106977 0.85377 0.650763 0.127025 0.858852 0.654748 0.154851 0.852806 0.655706 0.182745 0.852579 0.656921 0.203483 0.852917 0.656646 0.225688 0.85679 0.657788 0.252208 0.853412 0.654939 0.282394 0.851055 0.652011 0.305117 0.856856 0.656874 0.326138 0.853044 0.654413 0.352552 0.856746 0.659243 0.376339 0.850243 0.656904 0.405952 0.859952 0.652636 0.432658 0.856232 0.653435 0.458761 0.857527 0.659389 0.478061 0.856258 0.676925 0.0098364 0.853839 0.675087 0.0323867 0.855521 0.682976 0.0532188 0.855373 0.680523 0.0789338 0.850344 0.675903 0.108908 0.854391 0.675558 0.128077 0.851064 0.684045 0.158397 0.852289 0.678043 0.177824 0.855527 0.678599 0.200686 0.859462 0.67851 0.22736 0.855971 0.682274 0.253849 0.857965 0.67909 0.27893 0.857356 0.679898 0.307634 0.850561 0.679679 0.33365 0.859052 0.676103 0.352593 0.853177 0.679737 0.383648 0.851908 0.683284 0.407772 0.858032 0.682997 0.425569 0.85119 0.684009 0.451299 0.852586 0.677655 0.476213 0.85449 0.707878 0.00344846 0.854705 0.704272 0.0320975 0.856784 0.704909 0.0573112 0.854004 0.700462 0.0751806 0.852158 0.702717 0.107985 0.853543 0.707042 0.130884 0.857361 0.707009 0.159176 0.85072 0.703109 0.184771 0.856236 0.708243 0.200487 0.857828 0.708516 0.229001 0.8509 0.707544 0.259009 0.853645 0.708923 0.279518 0.853482 0.707588 0.307647 0.859919 0.708073 0.333554 0.854306 0.702314 0.354879 0.858147 0.709745 0.379703 0.857457 0.701697 0.406355 0.854998 0.706559 0.434156 0.851199 0.707071 0.459415 0.85687 0.706311 0.482558 0.853358 0.73069 0.002153 0.857266 0.725867 0.0285219 0.854248 0.726798 0.0595468 0.850361 0.731597 0.0781845 0.858153 0.729939 0.109125 0.857254 0.726328 0.134853 0.853549 0.72719 0.158806 0.855659 0.727318 0.179457 0.853956 0.734694 0.206212 0.853884 0.730635 0.231867 0.856398 0.725121 0.252577 0.853461 0.732871 0.280684 0.85146 0.725958 0.300959 0.854133 0.731046 0.326409 0.851631 0.73108 0.352532 0.854189 0.731392 0.381375 0.854651 0.727711 0.403499 0.856192 0.729864 0.4344 0.854711 0.732323 0.45593 0.854921 0.729729 0.483896 0.875509 0.00916253 0.00374025 0.875186 0.00758073 0.0290773 0.884922 0.00615888 0.0501432 0.87839 0.0072854 0.0788469 0.877846 0.00892407 0.101913 0.884493 0.00424123 0.129426 0.884276 0.00531821 0.151685 0.878154 0.00312488 0.180444 0.882582 0.00695539 0.204281 0.88258 0.00055026 0.225272 0.880796 0.00790618 0.25087 0.884695 0.000294015 0.278692 0.879658 0.00670956 0.300228 0.876722 0.00885161 0.325734 0.877222 0.000904438 0.359262 0.875159 0.0010473 0.382476 0.881454 0.00866533 0.406142 0.884097 0.000619152 0.426749 0.881368 0.0057313 0.453208 0.882194 0.00504412 0.481363 0.878121 0.0276368 0.00368345 0.875 0.0264917 0.0267698 0.881521 0.0257759 0.0563328 0.882878 0.0343437 0.0767201 0.880979 0.0279855 0.101677 0.87648 0.0295981 0.128016 0.880562 0.0321829 0.150086 0.877974 0.0273715 0.179108 0.877291 0.0267436 0.200015 0.880934 0.025174 0.232837 0.87584 0.0302393 0.259792 0.88118 0.033328 0.277505 0.884818 0.0262618 0.301741 0.883121 0.0338481 0.329861 0.883988 0.0335073 0.354515 0.87692 0.0266913 0.382187 0.87608 0.0323588 0.403575 0.875098 0.0269021 0.434974 0.880501 0.0270581 0.450114 0.883595 0.0275701 0.481606 0.878734 0.0560846 0.00146385 0.877641 0.0560486 0.0253964 0.88348 0.0597379 0.0536966 0.884675 0.0503088 0.0807184 0.875789 0.0525929 0.103517 0.884166 0.0594366 0.126891 0.878721 0.0599754 0.154159 0.876054 0.0586628 0.184553 0.88313 0.0526987 0.208687 0.875811 0.0536416 0.230471 0.879578 0.0560972 0.252362 0.875843 0.0533589 0.28347 0.88009 0.0553881 0.30254 0.875546 0.0571264 0.325048 0.88361 0.0530393 0.357832 0.88402 0.0553413 0.382277 0.884362 0.0547372 0.406998 0.882687 0.0552052 0.430738 0.87892 0.0595371 0.458586 0.878806 0.0574818 0.482142 0.875757 0.0847349 0.00539215 0.884215 0.0759078 0.0265528 0.884887 0.0768637 0.0510864 0.88437 0.0770971 0.0846284 0.884005 0.0757193 0.107877 0.884626 0.0836337 0.128953 0.884292 0.0847192 0.15746 0.878781 0.0779589 0.180285 0.876583 0.0823098 0.201217 0.884787 0.0812986 0.230135 0.879942 0.0814071 0.253502 0.880394 0.0763837 0.278421 0.88051 0.0836195 0.306167 0.882126 0.0773204 0.328403 0.878152 0.0826539 0.359891 0.876932 0.0828271 0.380093 0.881847 0.0813811 0.400931 0.878518 0.0816186 0.42694 0.881739 0.0817336 0.459109 0.881151 0.0756547 0.477175 0.882656 0.102624 4.38961e-05 0.87913 0.102536 0.0315406 0.875601 0.107571 0.0552702 0.875444 0.103479 0.077821 0.884211 0.108349 0.100048 0.880164 0.101769 0.125301 0.881118 0.103545 0.15427 0.88027 0.103803 0.182724 0.878867 0.108929 0.200746 0.877558 0.101891 0.227074 0.880207 0.103383 0.258044 0.876566 0.10443 0.279502 0.880231 0.106755 0.308872 0.883189 0.105678 0.327057 0.883249 0.109033 0.35222 0.884058 0.107088 0.380266 0.880826 0.10613 0.408626 0.882408 0.100136 0.433834 0.875638 0.105339 0.459064 0.877573 0.105292 0.483055 0.879551 0.133991 0.00556856 0.883862 0.133005 0.0322349 0.877471 0.12579 0.0523908 0.884494 0.127351 0.0832872 0.883802 0.125352 0.100591 0.882787 0.129641 0.125781 0.877851 0.125116 0.153233 0.883572 0.130544 0.180671 0.876523 0.132287 0.203499 0.875271 0.127832 0.234217 0.87631 0.132172 0.251834 0.879322 0.125189 0.278086 0.879898 0.130843 0.309645 0.877669 0.133615 0.329457 0.876513 0.12872 0.355233 0.875923 0.132433 0.376638 0.880276 0.127804 0.402201 0.88119 0.128939 0.428651 0.883299 0.12655 0.459907 0.879067 0.132868 0.47934 0.883764 0.158236 0.000127041 0.882055 0.150594 0.0331094 0.880511 0.151095 0.0550677 0.875864 0.154246 0.080459 0.876287 0.154918 0.101591 0.877078 0.152785 0.126503 0.880201 0.15542 0.155985 0.879317 0.150997 0.178343 0.883464 0.150131 0.202291 0.879557 0.158843 0.225539 0.880684 0.159313 0.254872 0.88065 0.155319 0.283251 0.884166 0.156882 0.301392 0.881319 0.151521 0.334705 0.882404 0.156284 0.353196 0.876049 0.154462 0.384121 0.881959 0.156999 0.407082 0.881161 0.159125 0.432501 0.883491 0.15266 0.457708 0.883239 0.15045 0.476989 0.882782 0.184173 0.00232699 0.883981 0.18431 0.0268383 0.876626 0.180586 0.0591215 0.882227 0.181737 0.0847049 0.877116 0.180724 0.10643 0.877137 0.1788 0.129204 0.881974 0.18275 0.158161 0.87614 0.184853 0.181162 0.884876 0.177849 0.202426 0.883095 0.180766 0.23123 0.877618 0.17983 0.257014 0.8752 0.177542 0.281282 0.880337 0.183359 0.305946 0.879697 0.179406 0.3291 0.87531 0.180116 0.353248 0.875607 0.18148 0.379866 0.879104 0.182198 0.40072 0.879522 0.175674 0.434712 0.880281 0.179243 0.458438 0.876709 0.176828 0.481895 0.875749 0.209822 0.00574654 0.878064 0.208755 0.0317466 0.875311 0.20045 0.0505547 0.883862 0.205393 0.0842301 0.877857 0.208855 0.101754 0.881037 0.204059 0.12709 0.880539 0.208072 0.150194 0.880541 0.208262 0.183697 0.883396 0.200409 0.201096 0.875143 0.207122 0.226053 0.877493 0.203822 0.258613 0.884462 0.209914 0.280404 0.884356 0.20344 0.307674 0.884214 0.205391 0.334116 0.88243 0.20371 0.35511 0.877006 0.207799 0.383552 0.88114 0.202037 0.407726 0.875915 0.200383 0.42967 0.875792 0.208827 0.452333 0.879273 0.206529 0.482098 0.882318 0.230477 0.000169625 0.879153 0.229996 0.025459 0.880171 0.23344 0.0576496 0.878495 0.232487 0.0760327 0.880847 0.226122 0.10707 0.882066 0.230881 0.130708 0.883668 0.230629 0.153747 0.884868 0.234918 0.178846 0.876004 0.233142 0.202241 0.876891 0.229842 0.228744 0.882424 0.232574 0.251345 0.876425 0.231439 0.27548 0.875066 0.225962 0.304194 0.875191 0.229431 0.334276 0.880133 0.227365 0.355502 0.881342 0.231145 0.37682 0.877637 0.225977 0.409676 0.882676 0.23453 0.43134 0.8817 0.226245 0.455826 0.87681 0.229842 0.484955 0.880646 0.252309 0.00592376 0.882165 0.25419 0.0336385 0.877285 0.25829 0.0513706 0.877788 0.255771 0.0780794 0.883069 0.251336 0.104175 0.879984 0.25177 0.128022 0.884652 0.25395 0.156648 0.879621 0.253027 0.179398 0.875761 0.252674 0.208624 0.880969 0.254112 0.233976 0.876123 0.259383 0.254594 0.87575 0.259716 0.276657 0.875122 0.253831 0.304366 0.880338 0.259701 0.325107 0.879102 0.251315 0.35125 0.87593 0.250954 0.383328 0.876426 0.252616 0.404161 0.883405 0.251417 0.42591 0.879808 0.252939 0.451076 0.875041 0.258798 0.475828 0.877301 0.276518 0.00735675 0.882583 0.281186 0.0299988 0.880858 0.277255 0.0591947 0.876598 0.283974 0.0848129 0.877958 0.275972 0.108917 0.882696 0.278856 0.126006 0.878133 0.276893 0.150377 0.875317 0.278301 0.180292 0.878503 0.277965 0.20217 0.882316 0.27772 0.229398 0.877794 0.27696 0.254329 0.876995 0.278454 0.27729 0.875855 0.275588 0.304172 0.878976 0.28363 0.33254 0.883702 0.277284 0.353031 0.881709 0.276419 0.379824 0.881975 0.275676 0.407188 0.877657 0.277698 0.429685 0.88031 0.276723 0.450717 0.88388 0.280714 0.479133 0.879306 0.301668 0.00687356 0.88413 0.305583 0.0267287 0.879299 0.308394 0.0580019 0.883708 0.305204 0.0772026 0.879082 0.308625 0.106788 0.881442 0.30068 0.129148 0.876048 0.305726 0.153044 0.883159 0.30984 0.177555 0.878926 0.301376 0.20766 0.879327 0.302703 0.232564 0.877068 0.309598 0.259074 0.883283 0.309532 0.282939 0.880478 0.309861 0.30753 0.882296 0.305797 0.333861 0.882759 0.302404 0.355789 0.880767 0.304175 0.378631 0.878429 0.305714 0.408058 0.883903 0.307125 0.4322 0.883437 0.300982 0.453609 0.880975 0.30375 0.482431 0.883909 0.334312 0.0016584 0.877816 0.333668 0.0270706 0.87637 0.333947 0.0536842 0.883389 0.327768 0.0788175 0.877728 0.328123 0.101004 0.883018 0.329603 0.128642 0.87925 0.331163 0.151468 0.87737 0.331925 0.177783 0.879314 0.326972 0.205277 0.882341 0.327118 0.225934 0.881668 0.326894 0.25893 0.881108 0.331676 0.27538 0.882408 0.333494 0.308279 0.883713 0.329969 0.333176 0.882293 0.330638 0.355921 0.881998 0.331143 0.3765 0.877904 0.327718 0.400285 0.879426 0.331557 0.429401 0.880567 0.329589 0.458282 0.880448 0.325884 0.48363 0.881705 0.351601 0.0050292 0.884617 0.350242 0.0316438 0.879245 0.357245 0.0520814 0.882245 0.352946 0.0827447 0.882684 0.350939 0.103157 0.875277 0.351199 0.126886 0.877661 0.353534 0.155399 0.88352 0.350576 0.177784 0.883941 0.355063 0.205386 0.883628 0.355951 0.231251 0.876215 0.357064 0.251834 0.88136 0.355875 0.283709 0.883312 0.351074 0.309773 0.883899 0.352236 0.32919 0.88469 0.350366 0.350881 0.877212 0.350751 0.379609 0.884919 0.35414 0.404135 0.880411 0.354804 0.428124 0.88127 0.359255 0.45728 0.877075 0.357134 0.483982 0.878297 0.383984 0.00382907 0.877743 0.38376 0.0308722 0.884652 0.379321 0.0541007 0.875493 0.380514 0.0848107 0.880981 0.378658 0.107602 0.876496 0.380059 0.125287 0.878813 0.376929 0.157555 0.880732 0.383626 0.184562 0.882401 0.378866 0.206896 0.878994 0.381573 0.226965 0.882595 0.376628 0.257296 0.878031 0.382991 0.281352 0.884369 0.381412 0.302254 0.875141 0.378937 0.331139 0.88431 0.378179 0.356301 0.881097 0.382017 0.380344 0.876545 0.381135 0.40088 0.876545 0.384037 0.426521 0.883626 0.378271 0.45349 0.87929 0.383582 0.47655 0.884101 0.402269 0.00208898 0.875957 0.408992 0.0298404 0.878722 0.406901 0.0592744 0.877309 0.409141 0.0805601 0.881783 0.403324 0.10854 0.881965 0.402869 0.131065 0.879305 0.401018 0.155512 0.884292 0.408191 0.180914 0.880859 0.408119 0.205589 0.875536 0.407715 0.227314 0.884975 0.40192 0.253372 0.881577 0.407796 0.28072 0.877705 0.408681 0.304799 0.884512 0.405171 0.327496 0.881519 0.40349 0.353876 0.880094 0.404256 0.376211 0.879377 0.405582 0.409979 0.875046 0.40762 0.429738 0.884031 0.400322 0.459932 0.884359 0.404027 0.482105 0.879276 0.425628 0.000852472 0.880394 0.431077 0.0324368 0.877901 0.434379 0.0563669 0.875874 0.425695 0.0832342 0.876452 0.431148 0.104603 0.878858 0.430759 0.125611 0.875523 0.426655 0.156365 0.882834 0.430123 0.175812 0.884302 0.430738 0.204518 0.875095 0.434206 0.228367 0.87517 0.428667 0.252021 0.879317 0.433431 0.28118 0.87705 0.427106 0.30656 0.884875 0.432998 0.327507 0.877468 0.433905 0.351074 0.877431 0.432937 0.382757 0.876693 0.428264 0.403944 0.879631 0.434565 0.431223 0.876143 0.429909 0.456674 0.882669 0.425842 0.475353 0.875039 0.456234 0.000210501 0.877222 0.454429 0.0257058 0.881368 0.45983 0.0572442 0.881155 0.454684 0.0788143 0.878304 0.455617 0.107595 0.882049 0.455691 0.134352 0.882794 0.457265 0.156446 0.878508 0.458389 0.183255 0.87875 0.453771 0.207841 0.8754 0.458078 0.232816 0.882945 0.453304 0.251334 0.88229 0.453104 0.275593 0.884462 0.456439 0.301461 0.884443 0.459702 0.334921 0.881545 0.450059 0.359421 0.882856 0.458747 0.380812 0.875036 0.456703 0.401642 0.880925 0.459472 0.426423 0.884915 0.454908 0.452091 0.88288 0.454799 0.481999 0.875266 0.481156 0.00464557 0.883076 0.480427 0.0259786 0.87795 0.475123 0.0543143 0.881781 0.478038 0.0806678 0.878546 0.477816 0.107201 0.882744 0.484776 0.125631 0.876518 0.483942 0.15557 0.88312 0.479682 0.179889 0.876469 0.479012 0.206882 0.884997 0.476021 0.230437 0.876098 0.483161 0.258205 0.877101 0.480211 0.283086 0.875735 0.475333 0.305935 0.876526 0.475035 0.327145 0.875054 0.480485 0.350973 0.875489 0.475742 0.378697 0.880097 0.48072 0.406087 0.878801 0.483378 0.432228 0.883453 0.484731 0.453325 0.877209 0.475265 0.47702 0.875607 0.503272 0.0083397 0.880094 0.503524 0.0272386 0.877375 0.500952 0.0511628 0.882058 0.506856 0.0788996 0.876037 0.506847 0.100867 0.879789 0.507252 0.134829 0.88436 0.504279 0.155545 0.880365 0.507842 0.184423 0.881334 0.5029 0.201513 0.877916 0.502435 0.227629 0.884161 0.508903 0.250434 0.883974 0.502008 0.282673 0.881593 0.50403 0.301797 0.880942 0.507267 0.328205 0.875202 0.501909 0.354488 0.88009 0.500721 0.384745 0.878737 0.506832 0.403229 0.881636 0.508982 0.425839 0.876927 0.504602 0.450515 0.883611 0.507184 0.481942 0.876417 0.534038 0.0064914 0.88064 0.53099 0.0320456 0.881133 0.532279 0.0572274 0.875497 0.527973 0.0789597 0.879174 0.534458 0.100819 0.88113 0.529585 0.134171 0.876923 0.526953 0.153883 0.877313 0.531219 0.179367 0.875374 0.5295 0.20676 0.876032 0.530879 0.225895 0.878373 0.528138 0.254195 0.883544 0.534898 0.283216 0.875561 0.530425 0.306289 0.881546 0.534034 0.325881 0.876586 0.530075 0.351265 0.880014 0.534132 0.376559 0.881711 0.529915 0.401708 0.877382 0.53227 0.425469 0.877421 0.527606 0.457321 0.875304 0.526474 0.481471 0.881197 0.551905 0.00946085 0.876131 0.554478 0.0325259 0.877837 0.558815 0.057638 0.882347 0.555903 0.076026 0.877384 0.552279 0.108303 0.883588 0.558607 0.129068 0.880948 0.559284 0.156472 0.884338 0.55281 0.184107 0.881638 0.555297 0.208491 0.882513 0.556727 0.232811 0.877316 0.552958 0.258242 0.876073 0.555257 0.278978 0.876614 0.55228 0.300868 0.882331 0.558828 0.328559 0.875889 0.557764 0.351023 0.882253 0.559021 0.375634 0.880153 0.553902 0.401825 0.881323 0.558624 0.430533 0.876719 0.55383 0.452923 0.884863 0.556825 0.480186 0.8826 0.579659 0.00298782 0.88006 0.575242 0.0258724 0.882036 0.578953 0.058827 0.884399 0.583136 0.0791479 0.877272 0.584895 0.107604 0.880789 0.582311 0.127427 0.876553 0.57933 0.15369 0.884568 0.581009 0.183623 0.875877 0.584788 0.20964 0.877189 0.578312 0.228418 0.87954 0.579985 0.254978 0.877517 0.578932 0.278161 0.884583 0.57668 0.305629 0.879014 0.583841 0.325871 0.88405 0.584229 0.356573 0.880191 0.584116 0.378521 0.876096 0.578043 0.403762 0.882456 0.582555 0.425181 0.884948 0.577225 0.457579 0.880923 0.57614 0.477859 0.882294 0.601372 0.0032899 0.877266 0.600004 0.0265108 0.880564 0.606789 0.0547754 0.875743 0.601601 0.0849177 0.876882 0.608912 0.100161 0.877479 0.605233 0.129557 0.879802 0.608087 0.157219 0.88351 0.608145 0.177678 0.879096 0.60181 0.200366 0.882597 0.608292 0.22686 0.8805 0.600437 0.255727 0.878116 0.604888 0.280534 0.876114 0.608133 0.300447 0.877987 0.606675 0.325246 0.877488 0.608009 0.35107 0.880522 0.607223 0.375407 0.881591 0.603004 0.40826 0.876559 0.606655 0.428922 0.882848 0.605312 0.459905 0.876967 0.60692 0.47712 0.881243 0.628419 0.00575416 0.882126 0.632906 0.0276944 0.88276 0.628007 0.0513737 0.876624 0.634417 0.0797122 0.878964 0.634476 0.107105 0.878668 0.625183 0.126765 0.877467 0.62907 0.154281 0.879414 0.633546 0.184094 0.881285 0.627551 0.209145 0.878619 0.627799 0.225705 0.884418 0.63075 0.251661 0.875333 0.625427 0.283194 0.876649 0.632332 0.309213 0.878599 0.631939 0.328828 0.881648 0.629289 0.357887 0.881096 0.626932 0.380429 0.883815 0.626781 0.407055 0.878311 0.628183 0.425872 0.884724 0.629005 0.4523 0.87932 0.630349 0.48165 0.880562 0.653313 0.00960727 0.879838 0.654996 0.0345019 0.877967 0.656236 0.0513777 0.883813 0.658525 0.0823086 0.876655 0.657531 0.108664 0.881887 0.651252 0.126516 0.879562 0.659753 0.159909 0.881518 0.653739 0.177282 0.880894 0.65734 0.203747 0.879727 0.652239 0.230254 0.882172 0.654624 0.256442 0.884609 0.652541 0.284115 0.880023 0.650463 0.303875 0.884215 0.659217 0.327707 0.880855 0.650028 0.352782 0.883272 0.652301 0.384049 0.881675 0.655363 0.409224 0.876475 0.654674 0.427199 0.879708 0.651263 0.454704 0.881685 0.651648 0.483712 0.87566 0.677899 0.00453061 0.881842 0.676415 0.029845 0.877506 0.681842 0.0568226 0.883093 0.675525 0.0822971 0.879097 0.675448 0.101973 0.882767 0.677859 0.129632 0.881607 0.682247 0.1591 0.879058 0.684374 0.179906 0.884892 0.683507 0.209637 0.884761 0.679069 0.225067 0.883057 0.683232 0.253441 0.877732 0.6798 0.277148 0.878193 0.682203 0.308527 0.87812 0.679655 0.332532 0.884687 0.678475 0.353864 0.884274 0.678814 0.380285 0.877699 0.676997 0.403691 0.876492 0.682562 0.433491 0.877357 0.675606 0.452595 0.876502 0.683926 0.480901 0.883614 0.707666 0.00403785 0.878093 0.705719 0.0255329 0.877508 0.706923 0.0520012 0.881899 0.704436 0.0813733 0.879704 0.70634 0.107736 0.877977 0.705398 0.130001 0.875843 0.704142 0.150516 0.879801 0.703517 0.183966 0.876218 0.705801 0.201139 0.877818 0.707139 0.231261 0.88214 0.707114 0.251617 0.879766 0.703244 0.280274 0.883459 0.705741 0.305474 0.88062 0.703108 0.326884 0.883521 0.707984 0.352715 0.883879 0.703567 0.381473 0.882742 0.702663 0.407254 0.880164 0.702182 0.427245 0.882646 0.702708 0.45463 0.875252 0.708113 0.477564 0.884647 0.729251 0.00163509 0.882102 0.734025 0.0331956 0.881393 0.725462 0.0586529 0.875787 0.727404 0.0838394 0.881114 0.730152 0.107731 0.875104 0.72651 0.132913 0.884193 0.727059 0.153232 0.875001 0.729976 0.175318 0.882627 0.727487 0.206916 0.87533 0.732307 0.233215 0.880968 0.726411 0.254847 0.875418 0.726393 0.279099 0.878963 0.733111 0.309069 0.876524 0.733155 0.326401 0.881914 0.72894 0.350995 0.883644 0.726466 0.381618 0.878385 0.733449 0.403049 0.876041 0.726645 0.433793 0.877506 0.734005 0.458359 0.875322 0.733077 0.482773 0.902504 0.00225084 0.00063439 0.900897 0.000284828 0.0300138 0.901037 0.00541926 0.056753 0.900137 0.00783234 0.0838699 0.906152 0.00289528 0.103013 0.903193 0.00591235 0.133759 0.909924 0.00228537 0.152393 0.908791 0.000988573 0.177501 0.902342 0.00905453 0.204566 0.903766 0.00112481 0.228319 0.904362 0.0031066 0.250286 0.909294 0.00129861 0.277619 0.902922 0.00514007 0.305054 0.903297 0.00544681 0.327857 0.909664 0.00274781 0.35026 0.907429 0.00702304 0.379471 0.90177 0.00846006 0.402034 0.905029 0.00151101 0.428831 0.909969 0.00165166 0.459433 0.90107 0.00756818 0.475402 0.902703 0.0264547 0.0050099 0.905363 0.0348381 0.0329365 0.902485 0.0289906 0.0531185 0.901026 0.0322056 0.0820116 0.901861 0.0306546 0.109719 0.902443 0.026258 0.13224 0.90095 0.0344812 0.158537 0.900988 0.0329407 0.181402 0.909682 0.0305572 0.209443 0.906988 0.0299366 0.225293 0.905915 0.0325085 0.250825 0.905208 0.0337305 0.278413 0.90604 0.0348184 0.303211 0.904659 0.0259949 0.327029 0.900138 0.0313025 0.35812 0.901909 0.0274071 0.382392 0.906455 0.0338668 0.402296 0.904533 0.033324 0.425174 0.901075 0.0302138 0.453749 0.905798 0.0304347 0.47622 0.904957 0.0500848 0.00410716 0.900421 0.0562356 0.0321422 0.906116 0.059878 0.0553012 0.900113 0.0582141 0.0835882 0.90018 0.0573607 0.100184 0.901076 0.0587122 0.127537 0.90079 0.0552199 0.156688 0.903331 0.0553175 0.183847 0.900219 0.0523529 0.204786 0.909318 0.0502688 0.231186 0.90232 0.0509946 0.253864 0.907316 0.0596816 0.279582 0.900881 0.051954 0.305999 0.905085 0.0556466 0.327117 0.906242 0.0568069 0.35394 0.906544 0.052363 0.377398 0.903046 0.0548948 0.409302 0.901675 0.0519529 0.43231 0.90873 0.0554004 0.45188 0.904881 0.0585478 0.475567 0.902205 0.0753512 0.00729565 0.900414 0.0764825 0.0308104 0.901962 0.0783098 0.0572331 0.900008 0.0757491 0.0810583 0.906066 0.0759459 0.100422 0.905818 0.0836913 0.129592 0.900577 0.0847783 0.153519 0.902021 0.0797849 0.182493 0.900669 0.0752797 0.204858 0.909317 0.077888 0.23125 0.908735 0.0829299 0.255509 0.903338 0.0775485 0.278335 0.908287 0.0776444 0.301636 0.904997 0.0787425 0.334344 0.905528 0.0805484 0.350117 0.901323 0.080696 0.381675 0.909894 0.0819168 0.407996 0.909741 0.0790963 0.43224 0.900853 0.0821694 0.457577 0.902635 0.0802282 0.483792 0.904855 0.102811 0.00896632 0.903775 0.100579 0.0282566 0.900116 0.109462 0.0536109 0.902299 0.106146 0.0797099 0.90143 0.101157 0.106475 0.906105 0.108792 0.129477 0.908325 0.109719 0.155331 0.908963 0.102649 0.175686 0.90439 0.109112 0.200567 0.904643 0.105266 0.234784 0.907613 0.103552 0.253291 0.907092 0.105023 0.283317 0.903608 0.100148 0.304445 0.909226 0.101854 0.328662 0.905909 0.105207 0.356606 0.903761 0.102848 0.379184 0.907632 0.109137 0.402465 0.909985 0.10077 0.430568 0.903199 0.109041 0.454253 0.901736 0.102441 0.475897 0.904341 0.132227 0.00951253 0.905867 0.131226 0.0277194 0.909335 0.132222 0.0528064 0.90709 0.132644 0.0774565 0.901706 0.129881 0.106347 0.902373 0.129725 0.125025 0.908106 0.134298 0.153114 0.90163 0.133817 0.183265 0.903004 0.13005 0.209922 0.901699 0.128879 0.230406 0.904756 0.133475 0.257213 0.901602 0.128086 0.284084 0.904596 0.125944 0.300034 0.907389 0.129517 0.333517 0.902431 0.130839 0.353375 0.901067 0.125746 0.375064 0.900372 0.128284 0.404939 0.903202 0.128278 0.425083 0.900339 0.127844 0.455279 0.903021 0.130874 0.484746 0.904406 0.152615 0.00320484 0.90791 0.150531 0.027713 0.906529 0.158719 0.0593829 0.903764 0.159588 0.0808842 0.904202 0.150775 0.107781 0.904162 0.158818 0.134857 0.90893 0.15937 0.158385 0.906734 0.159237 0.179118 0.907629 0.157722 0.200038 0.906891 0.150105 0.225929 0.903264 0.158481 0.254035 0.904414 0.156852 0.276064 0.901242 0.151533 0.306893 0.901068 0.15051 0.333654 0.907991 0.157042 0.357324 0.909902 0.152259 0.375357 0.909994 0.159817 0.406758 0.907287 0.151103 0.426294 0.908015 0.151005 0.451283 0.900273 0.155823 0.481521 0.904445 0.179323 8.89992e-06 0.90872 0.17965 0.0271219 0.907413 0.181385 0.0512834 0.909184 0.184356 0.0793719 0.902498 0.184894 0.105533 0.902735 0.180102 0.126628 0.900057 0.184321 0.150106 0.906703 0.176441 0.184808 0.906754 0.181949 0.206274 0.90286 0.18338 0.227472 0.907436 0.179519 0.252292 0.905845 0.176494 0.279393 0.90395 0.184384 0.306862 0.901082 0.180913 0.326895 0.907928 0.182517 0.351883 0.901496 0.175142 0.375803 0.900149 0.183611 0.404726 0.900535 0.177865 0.427576 0.907675 0.179423 0.453973 0.902573 0.18281 0.483063 0.909751 0.208663 0.000448866 0.904723 0.209624 0.0329546 0.902523 0.201427 0.0580855 0.909586 0.208345 0.0802057 0.900665 0.206929 0.102615 0.901271 0.201383 0.131737 0.904285 0.206645 0.157005 0.909893 0.205596 0.179464 0.90476 0.202761 0.209604 0.907039 0.207452 0.234224 0.904971 0.208759 0.259844 0.902512 0.202332 0.277082 0.906747 0.200372 0.304469 0.902922 0.209808 0.32862 0.90543 0.202647 0.351946 0.904502 0.208016 0.382057 0.905828 0.209295 0.406455 0.902982 0.202533 0.432589 0.9019 0.207753 0.455325 0.905664 0.203595 0.483308 0.909726 0.226914 0.00235497 0.90528 0.232904 0.0258134 0.905592 0.228366 0.053019 0.907251 0.227613 0.0806111 0.907118 0.227995 0.104664 0.904054 0.231255 0.12566 0.908376 0.233278 0.15485 0.900979 0.227211 0.177778 0.901217 0.23079 0.209589 0.90221 0.22543 0.225438 0.906831 0.229375 0.254085 0.904863 0.234459 0.280605 0.908418 0.231398 0.302983 0.90355 0.233951 0.334083 0.908687 0.227615 0.357434 0.903308 0.231461 0.381653 0.903048 0.231147 0.404074 0.909162 0.232325 0.426068 0.909804 0.225326 0.450332 0.906712 0.23084 0.477574 0.903565 0.257501 0.00673822 0.907034 0.25363 0.0302198 0.907267 0.254861 0.055812 0.90515 0.259785 0.0778545 0.900702 0.254316 0.1036 0.90748 0.252255 0.128062 0.909298 0.255996 0.156224 0.906241 0.254566 0.181166 0.902576 0.25225 0.205363 0.905498 0.259995 0.23405 0.906266 0.258079 0.250144 0.906905 0.256216 0.283303 0.901449 0.250269 0.303786 0.909863 0.258406 0.327116 0.908151 0.259456 0.351945 0.905715 0.255377 0.37951 0.907343 0.252837 0.402248 0.90461 0.259248 0.431574 0.902766 0.256903 0.453335 0.908159 0.252658 0.481164 0.903109 0.278578 0.00981425 0.9028 0.284808 0.0345583 0.9097 0.279409 0.0569349 0.903108 0.278529 0.0786863 0.906633 0.276723 0.108531 0.902857 0.283127 0.131436 0.907273 0.275385 0.153406 0.909807 0.275814 0.177571 0.908912 0.284919 0.205879 0.901616 0.280461 0.232514 0.902426 0.278765 0.250183 0.900959 0.281365 0.284795 0.901738 0.281295 0.30504 0.904192 0.278233 0.326801 0.905943 0.280291 0.350505 0.907094 0.278161 0.377922 0.908102 0.275836 0.4011 0.902068 0.27729 0.42762 0.9011 0.279983 0.45272 0.908963 0.282668 0.477189 0.909413 0.309868 0.00627426 0.907061 0.304031 0.0317954 0.902021 0.304029 0.0579807 0.909802 0.3062 0.081919 0.900822 0.307014 0.107776 0.909174 0.301348 0.128467 0.906622 0.309578 0.158151 0.905002 0.300735 0.181004 0.903682 0.301618 0.207295 0.90138 0.304913 0.22505 0.907183 0.303703 0.258489 0.907947 0.30015 0.284035 0.909363 0.308897 0.307101 0.909094 0.309774 0.329394 0.901776 0.304512 0.352227 0.903123 0.304401 0.375064 0.902789 0.300713 0.408471 0.908181 0.30339 0.427011 0.900838 0.303603 0.457315 0.909418 0.307472 0.477031 0.906121 0.327903 0.00891819 0.903516 0.333816 0.0265943 0.902382 0.326967 0.0522536 0.901778 0.326813 0.0777128 0.901887 0.333642 0.104337 0.903194 0.327864 0.132796 0.905074 0.332657 0.155999 0.909961 0.327947 0.180538 0.90155 0.331917 0.20575 0.90802 0.330691 0.231834 0.902719 0.331172 0.251651 0.901326 0.334428 0.2779 0.906095 0.333324 0.301292 0.905665 0.329492 0.328383 0.904641 0.331032 0.359965 0.905847 0.330585 0.384543 0.903024 0.330061 0.407144 0.906387 0.329199 0.434315 0.900734 0.326606 0.454147 0.906464 0.328598 0.482216 0.902296 0.359163 0.00458298 0.90714 0.353413 0.034875 0.90538 0.356204 0.0541167 0.905463 0.357377 0.0788678 0.90782 0.359034 0.108414 0.901711 0.355883 0.132379 0.902336 0.355968 0.155979 0.906837 0.354206 0.180243 0.901422 0.353686 0.207812 0.901844 0.350036 0.23352 0.900588 0.358309 0.250341 0.90781 0.355834 0.284432 0.900463 0.35151 0.308055 0.902565 0.350019 0.333906 0.905058 0.353807 0.353047 0.907611 0.359073 0.380789 0.906103 0.353849 0.408322 0.90059 0.357229 0.432956 0.903201 0.352617 0.450528 0.903711 0.356362 0.480234 0.90634 0.38125 0.000499326 0.908224 0.381995 0.0272761 0.909553 0.377667 0.0532 0.901227 0.384298 0.0801497 0.901315 0.378465 0.109007 0.903935 0.384052 0.129954 0.90214 0.383351 0.15805 0.909152 0.381808 0.181545 0.909882 0.384648 0.205458 0.901194 0.380487 0.233788 0.902752 0.377968 0.251775 0.901999 0.379369 0.280615 0.908137 0.38249 0.301537 0.907471 0.381176 0.325657 0.903903 0.377941 0.359671 0.909823 0.375037 0.379815 0.906667 0.384494 0.401874 0.907976 0.384479 0.427345 0.909038 0.380695 0.451161 0.906515 0.381682 0.482882 0.902906 0.409197 0.00759054 0.902793 0.407339 0.030917 0.905376 0.409094 0.0586095 0.901495 0.401025 0.0832723 0.904555 0.408654 0.103458 0.900062 0.406448 0.12809 0.905566 0.408178 0.152442 0.905109 0.408125 0.17998 0.905868 0.402386 0.203494 0.901758 0.405047 0.226973 0.900894 0.403785 0.257831 0.902337 0.402847 0.279024 0.909406 0.404303 0.303914 0.906734 0.402981 0.333485 0.904748 0.408011 0.35919 0.902848 0.40662 0.382642 0.904993 0.407959 0.409647 0.909141 0.407294 0.431206 0.905884 0.408444 0.450806 0.900724 0.40098 0.482849 0.906057 0.43217 0.00330595 0.909202 0.433788 0.0330556 0.901046 0.433222 0.050182 0.902674 0.432868 0.0768734 0.901818 0.427193 0.109291 0.909762 0.430349 0.132179 0.900845 0.428213 0.154701 0.905462 0.432578 0.181591 0.905042 0.425034 0.202533 0.902028 0.429392 0.231737 0.900522 0.428435 0.259154 0.908391 0.432148 0.283681 0.907098 0.433084 0.301533 0.900536 0.425558 0.333566 0.903082 0.425198 0.358466 0.904636 0.431788 0.375275 0.900057 0.425413 0.400565 0.902656 0.426819 0.431335 0.90007 0.431734 0.455819 0.901218 0.432776 0.478587 0.904647 0.451023 0.00109447 0.905706 0.450783 0.0329252 0.909439 0.451102 0.0554392 0.904573 0.458806 0.0817046 0.900341 0.459057 0.10902 0.903123 0.451332 0.130202 0.908922 0.450424 0.153083 0.900625 0.4568 0.184678 0.902021 0.455972 0.201992 0.904806 0.459366 0.228524 0.901286 0.453559 0.256923 0.901543 0.454158 0.27536 0.90605 0.453422 0.300703 0.909802 0.450672 0.327726 0.90792 0.450725 0.350866 0.908018 0.454626 0.377454 0.906683 0.455097 0.404259 0.907575 0.456559 0.425666 0.903225 0.457834 0.459735 0.905997 0.45069 0.484947 0.90322 0.478846 0.00302641 0.907154 0.481334 0.0326166 0.902029 0.481798 0.0570305 0.900714 0.478627 0.0827396 0.905922 0.477543 0.101965 0.908187 0.479994 0.133092 0.909375 0.476347 0.156943 0.902136 0.478893 0.179864 0.908219 0.484602 0.203678 0.900082 0.484226 0.232417 0.908866 0.483244 0.250772 0.903424 0.476283 0.280328 0.908181 0.481767 0.307056 0.902739 0.482203 0.330127 0.905672 0.477696 0.356916 0.904658 0.481607 0.375271 0.90949 0.477398 0.404529 0.906546 0.484512 0.425896 0.900417 0.477396 0.453292 0.90513 0.481116 0.475885 0.902443 0.500398 0.00703782 0.908931 0.504211 0.0262857 0.903384 0.509548 0.0513959 0.909419 0.506632 0.0782439 0.90703 0.506253 0.100624 0.907518 0.507582 0.130282 0.906703 0.503408 0.154787 0.900964 0.509571 0.181924 0.901072 0.503209 0.20521 0.905347 0.500006 0.226976 0.908009 0.505843 0.258617 0.905629 0.500561 0.283762 0.907359 0.504917 0.304117 0.905342 0.509984 0.331448 0.909011 0.509158 0.355655 0.901214 0.504087 0.375401 0.909905 0.505243 0.409992 0.909602 0.507132 0.431879 0.908856 0.503297 0.452425 0.904016 0.509049 0.478991 0.903744 0.526264 0.00819359 0.903871 0.525622 0.0272865 0.906228 0.534539 0.0533774 0.903158 0.531843 0.0846421 0.90748 0.529581 0.104959 0.909963 0.528749 0.126393 0.907932 0.525206 0.153035 0.908134 0.527843 0.177422 0.908108 0.532184 0.203437 0.904541 0.533818 0.232565 0.901038 0.525633 0.254815 0.905858 0.525154 0.281914 0.903091 0.532614 0.303429 0.903808 0.527362 0.331321 0.902302 0.531913 0.359415 0.904647 0.525214 0.381049 0.902478 0.532642 0.408678 0.901822 0.531665 0.42756 0.90309 0.528656 0.456553 0.903476 0.528099 0.47999 0.900786 0.558965 0.000854537 0.908462 0.554874 0.0316945 0.901763 0.552199 0.0572881 0.903086 0.554895 0.078723 0.903823 0.558547 0.100115 0.909077 0.558778 0.132684 0.903772 0.555392 0.153604 0.908974 0.554831 0.181561 0.903653 0.553484 0.20492 0.905626 0.557848 0.232252 0.903587 0.558125 0.250505 0.906092 0.559326 0.282314 0.906964 0.555074 0.306461 0.902031 0.557747 0.327186 0.902 0.558066 0.359041 0.907374 0.557987 0.379215 0.909501 0.553892 0.406997 0.909654 0.555729 0.434722 0.908157 0.552597 0.456911 0.907676 0.550847 0.479169 0.905595 0.579966 0.00402043 0.901552 0.583646 0.0318445 0.902317 0.576351 0.0541944 0.905943 0.575884 0.0811194 0.905655 0.579782 0.109639 0.902439 0.583313 0.130544 0.903595 0.584073 0.152945 0.90944 0.583541 0.179692 0.901659 0.57518 0.20391 0.900442 0.580549 0.233265 0.905744 0.582284 0.250674 0.907824 0.584517 0.283271 0.906737 0.58175 0.302939 0.903654 0.577053 0.332146 0.90393 0.576455 0.354004 0.903102 0.580676 0.382611 0.908074 0.575028 0.404181 0.900341 0.577387 0.431128 0.900093 0.575484 0.451908 0.905721 0.58 0.483463 0.905277 0.603395 0.00795369 0.904441 0.60269 0.0263002 0.903999 0.609232 0.0500427 0.901927 0.607084 0.0777296 0.90935 0.609655 0.102281 0.904715 0.609497 0.129311 0.909961 0.601042 0.152912 0.903284 0.608835 0.184735 0.900529 0.608891 0.207946 0.905466 0.609334 0.234389 0.905105 0.603435 0.258065 0.903971 0.602465 0.276553 0.908792 0.609379 0.308202 0.902179 0.605939 0.327392 0.907277 0.605928 0.352792 0.903774 0.607364 0.377217 0.90621 0.604694 0.407917 0.906557 0.607451 0.426738 0.908475 0.60786 0.455003 0.906166 0.605382 0.475286 0.909907 0.627969 0.0057346 0.901132 0.631059 0.030524 0.901161 0.631615 0.054886 0.908526 0.632878 0.0767866 0.902803 0.625725 0.109843 0.904783 0.625196 0.131326 0.908753 0.6274 0.156012 0.900437 0.628701 0.182193 0.903132 0.631492 0.208517 0.901861 0.631892 0.233101 0.900881 0.63097 0.25461 0.901532 0.62723 0.276967 0.904758 0.634162 0.305138 0.901006 0.62922 0.331385 0.90719 0.631081 0.35441 0.901083 0.625407 0.382255 0.907329 0.628809 0.40903 0.90586 0.625749 0.425009 0.90793 0.631208 0.454866 0.901258 0.634256 0.476873 0.907248 0.657624 0.00714592 0.901503 0.657471 0.0314583 0.903718 0.656654 0.0504481 0.906633 0.654094 0.0764526 0.90836 0.650199 0.102309 0.904157 0.654837 0.128565 0.9027 0.6519 0.153384 0.906534 0.655077 0.182909 0.901178 0.653145 0.204983 0.901253 0.652573 0.227521 0.908919 0.651246 0.256634 0.909356 0.655953 0.280825 0.904734 0.651939 0.302007 0.906928 0.656889 0.32948 0.907786 0.657661 0.355548 0.909963 0.650197 0.375175 0.908873 0.658927 0.405692 0.908941 0.650085 0.433735 0.90082 0.658686 0.457661 0.901437 0.654863 0.481709 0.902608 0.681926 0.00443588 0.905571 0.677656 0.0263799 0.903819 0.684238 0.050151 0.909948 0.679424 0.081288 0.906267 0.67731 0.104563 0.90061 0.676437 0.126298 0.907597 0.683655 0.15294 0.908657 0.679052 0.178262 0.909433 0.684664 0.20642 0.905797 0.682619 0.230518 0.904648 0.684187 0.254064 0.900893 0.679889 0.280489 0.900516 0.679861 0.303488 0.909232 0.676422 0.333699 0.905605 0.68079 0.359402 0.900152 0.676965 0.381507 0.907214 0.678055 0.405204 0.906056 0.67652 0.430387 0.906913 0.679312 0.455077 0.900648 0.683904 0.479499 0.904743 0.703852 0.00448977 0.901194 0.704958 0.0324582 0.902667 0.70829 0.0515707 0.906517 0.706241 0.0807187 0.902757 0.70957 0.103224 0.909873 0.700208 0.134925 0.904387 0.701411 0.150106 0.904644 0.702047 0.178643 0.90409 0.708671 0.20997 0.907927 0.702319 0.228139 0.909247 0.700427 0.254963 0.908126 0.7032 0.282963 0.903306 0.705341 0.307312 0.903302 0.704888 0.33394 0.900027 0.700684 0.358569 0.907512 0.702669 0.382225 0.909418 0.706005 0.402828 0.901522 0.701266 0.43309 0.905053 0.706648 0.457565 0.901105 0.705897 0.480058 0.901756 0.727731 0.00089209 0.909848 0.72917 0.0252432 0.9084 0.727441 0.0580746 0.905239 0.732063 0.0810679 0.906825 0.728772 0.108409 0.907255 0.728315 0.13493 0.905669 0.726694 0.152565 0.90989 0.726696 0.179125 0.906042 0.734815 0.208813 0.904714 0.734247 0.234806 0.908073 0.727423 0.251549 0.904151 0.729726 0.27747 0.902706 0.730913 0.30624 0.903452 0.730017 0.333348 0.903088 0.731314 0.353605 0.902728 0.730335 0.378178 0.902448 0.734041 0.407856 0.908225 0.732218 0.428974 0.907692 0.729208 0.451631 0.907149 0.725542 0.483635 0.930288 0.00823065 0.00264661 0.925066 0.00333133 0.0272359 0.930491 0.00177314 0.0516002 0.934851 0.00569066 0.077016 0.927394 0.00211207 0.101423 0.929703 0.0019077 0.126478 0.925728 0.00370896 0.159523 0.92771 0.000278391 0.183854 0.929477 0.00941521 0.205757 0.92674 0.00711625 0.229562 0.930236 0.00837625 0.259652 0.928363 0.00390342 0.275832 0.931743 0.00388076 0.304643 0.932896 0.00557216 0.332575 0.927407 0.000831945 0.351574 0.933193 0.00759416 0.37838 0.92746 0.00137172 0.401896 0.933927 0.00441863 0.433764 0.934864 0.00372137 0.459728 0.928111 0.00709868 0.47961 0.925883 0.0296309 0.00601965 0.932393 0.0335894 0.0282359 0.932966 0.0317589 0.0576032 0.930961 0.0296624 0.0830481 0.932788 0.0338023 0.107155 0.92693 0.0325182 0.132673 0.933947 0.0303068 0.151642 0.92902 0.0307642 0.175452 0.932704 0.0327757 0.203817 0.927142 0.0326563 0.233771 0.92928 0.0272389 0.250422 0.933724 0.029696 0.283233 0.930623 0.034818 0.309806 0.932378 0.0297133 0.329237 0.934801 0.0344694 0.351375 0.932451 0.0288188 0.382483 0.929151 0.0334843 0.409661 0.932385 0.0310995 0.428726 0.931922 0.0275782 0.456132 0.934333 0.0279703 0.483702 0.93151 0.0570954 0.0083818 0.929844 0.0595106 0.0274198 0.932484 0.0544238 0.0520339 0.927243 0.0585849 0.0799344 0.925292 0.0582297 0.108282 0.934925 0.052695 0.128243 0.92697 0.0587847 0.159608 0.925058 0.0534633 0.177366 0.930358 0.0527727 0.206497 0.92783 0.054264 0.231777 0.93408 0.0594017 0.256631 0.925049 0.0532366 0.278377 0.932785 0.050646 0.300957 0.928663 0.0578601 0.330394 0.931305 0.0515163 0.359046 0.932078 0.0509366 0.375742 0.926377 0.0599043 0.409012 0.933391 0.0563684 0.425208 0.934041 0.0545532 0.457454 0.929552 0.0568467 0.481919 0.932235 0.0804224 0.00106238 0.927833 0.0832413 0.0292442 0.92673 0.0801212 0.0576836 0.93255 0.078175 0.0822813 0.933402 0.083843 0.10479 0.928102 0.0758691 0.126367 0.926296 0.0823798 0.152103 0.929974 0.0818893 0.175425 0.926275 0.0842365 0.203142 0.929293 0.0775653 0.234556 0.93207 0.078127 0.259642 0.934252 0.0801796 0.276401 0.92848 0.083419 0.309174 0.934954 0.0787856 0.331093 0.930011 0.0760061 0.351238 0.926133 0.0809807 0.380521 0.92718 0.0809412 0.402122 0.927548 0.0781564 0.431209 0.933377 0.0790477 0.450431 0.931266 0.0813797 0.481253 0.934657 0.109213 0.00433614 0.926094 0.105575 0.0260855 0.92917 0.107578 0.0577079 0.925021 0.108752 0.0772742 0.934522 0.102373 0.106672 0.927008 0.10874 0.129421 0.92555 0.107323 0.150886 0.933682 0.103383 0.181853 0.931724 0.109589 0.207929 0.930089 0.103979 0.2278 0.931722 0.106489 0.251128 0.927577 0.106043 0.275027 0.929771 0.101231 0.300323 0.925202 0.105065 0.330891 0.929029 0.103592 0.356276 0.934669 0.104422 0.382241 0.926108 0.104468 0.409845 0.929572 0.109986 0.425274 0.931677 0.101997 0.455962 0.928933 0.102103 0.47585 0.930771 0.133513 0.00568717 0.928304 0.125472 0.0258714 0.932784 0.126318 0.0599083 0.934606 0.1325 0.0808128 0.928286 0.127047 0.10354 0.925782 0.134862 0.132221 0.927489 0.133066 0.154904 0.925978 0.131141 0.177544 0.929804 0.134942 0.201105 0.926499 0.128811 0.232104 0.929559 0.128059 0.252912 0.929258 0.127227 0.281895 0.93294 0.129879 0.302146 0.925578 0.125029 0.331341 0.9321 0.125027 0.352774 0.932573 0.127441 0.380008 0.934394 0.133728 0.405178 0.931169 0.127096 0.428295 0.931221 0.134345 0.458851 0.927162 0.130577 0.47897 0.933578 0.158825 0.000615277 0.929001 0.150193 0.0323067 0.934307 0.152785 0.0592153 0.925189 0.153318 0.0790857 0.930099 0.155853 0.102969 0.928951 0.154932 0.132608 0.931236 0.156296 0.153526 0.930577 0.154171 0.180765 0.929613 0.156448 0.203275 0.93144 0.153328 0.234354 0.927575 0.153923 0.25127 0.930094 0.156392 0.275809 0.9294 0.153821 0.308188 0.929051 0.152095 0.33029 0.927529 0.154651 0.356695 0.934405 0.150262 0.375633 0.929753 0.150433 0.40157 0.933793 0.159085 0.434796 0.93103 0.157094 0.459403 0.927547 0.152117 0.476097 0.930253 0.180552 0.00835791 0.930114 0.184686 0.0341984 0.932512 0.177911 0.0535149 0.928539 0.18039 0.0823369 0.931178 0.18252 0.109299 0.926888 0.18483 0.126133 0.928237 0.181558 0.152665 0.928667 0.184096 0.176665 0.932086 0.176737 0.204887 0.931199 0.183999 0.22753 0.927727 0.180748 0.259229 0.931043 0.179608 0.276433 0.929271 0.179331 0.302375 0.932658 0.180789 0.3267 0.932365 0.182654 0.350564 0.926866 0.178514 0.376909 0.925906 0.177553 0.40701 0.928176 0.175641 0.429558 0.928408 0.175684 0.451119 0.932482 0.18034 0.481006 0.927599 0.203265 0.00710622 0.934256 0.207842 0.0329898 0.931528 0.200331 0.0507233 0.927814 0.205008 0.0840974 0.92871 0.203184 0.107859 0.931974 0.204554 0.132612 0.928323 0.201425 0.156805 0.925546 0.20824 0.178473 0.932555 0.209375 0.205051 0.930459 0.203136 0.225978 0.92553 0.203675 0.252649 0.930001 0.204462 0.280106 0.930685 0.207028 0.302382 0.928779 0.204361 0.331915 0.927475 0.204923 0.35784 0.928892 0.202967 0.376611 0.931367 0.207844 0.403848 0.926265 0.200109 0.428818 0.934773 0.208582 0.45881 0.931911 0.209594 0.482343 0.926605 0.230897 0.000428873 0.934261 0.22693 0.0291701 0.934702 0.226506 0.0520249 0.929841 0.234476 0.0767781 0.926247 0.231269 0.101871 0.931584 0.230549 0.129336 0.933888 0.228388 0.154858 0.931801 0.226724 0.179313 0.930454 0.227836 0.204222 0.934427 0.230211 0.226076 0.933777 0.227998 0.257057 0.927224 0.230309 0.275644 0.931161 0.231543 0.300261 0.933395 0.232099 0.327705 0.926595 0.228398 0.351072 0.931907 0.226871 0.38256 0.934621 0.225473 0.407373 0.934599 0.234248 0.425084 0.925453 0.227848 0.452017 0.933243 0.226495 0.483416 0.931102 0.257596 0.00872899 0.933628 0.250012 0.0275697 0.93442 0.259765 0.0571076 0.930736 0.256236 0.0813796 0.93204 0.256023 0.102875 0.92536 0.256794 0.131877 0.928863 0.254802 0.151747 0.931751 0.253866 0.181754 0.926856 0.252709 0.201579 0.925308 0.257138 0.227746 0.930271 0.256162 0.251763 0.93482 0.250255 0.284874 0.931285 0.253211 0.309848 0.930136 0.251191 0.327065 0.93385 0.25257 0.352439 0.929821 0.253126 0.383159 0.931036 0.253471 0.407642 0.933327 0.255901 0.431389 0.928349 0.253119 0.458848 0.92502 0.256683 0.477463 0.931068 0.276484 0.00341662 0.933252 0.27506 0.0336138 0.931191 0.277372 0.0546835 0.92986 0.280584 0.0806526 0.933615 0.281761 0.102233 0.933342 0.280539 0.130233 0.934596 0.284722 0.159243 0.932056 0.281679 0.178992 0.9316 0.278886 0.20887 0.93004 0.278983 0.231443 0.930202 0.278007 0.252858 0.930872 0.282351 0.282051 0.927354 0.276373 0.300836 0.932978 0.277077 0.333154 0.926776 0.275687 0.357997 0.931524 0.278523 0.379003 0.926062 0.281954 0.400189 0.931607 0.284594 0.431502 0.932959 0.279422 0.457041 0.929747 0.282776 0.477058 0.925379 0.307104 0.00306761 0.933557 0.307374 0.0309156 0.930358 0.303542 0.0536694 0.930122 0.306448 0.0766561 0.925859 0.308879 0.104186 0.926471 0.301503 0.128441 0.931289 0.305381 0.155668 0.926676 0.303114 0.177744 0.934675 0.301214 0.201388 0.928104 0.302131 0.232445 0.925637 0.305812 0.255273 0.932289 0.307156 0.28307 0.928452 0.306015 0.304835 0.929214 0.30212 0.333726 0.92681 0.304027 0.353782 0.932913 0.308832 0.383774 0.930495 0.305247 0.402273 0.932319 0.301047 0.432494 0.932995 0.305706 0.459908 0.929764 0.303772 0.481644 0.926388 0.327605 0.00786429 0.932736 0.327799 0.0297578 0.925573 0.326678 0.0531782 0.93423 0.333502 0.0829815 0.927592 0.334197 0.107874 0.929587 0.326188 0.125901 0.926833 0.326861 0.151687 0.925941 0.331452 0.184092 0.930647 0.329294 0.203415 0.925535 0.328735 0.230128 0.927367 0.325194 0.256733 0.929414 0.334031 0.275537 0.934775 0.334913 0.303746 0.928928 0.327308 0.330036 0.934538 0.333143 0.359682 0.932106 0.330464 0.375586 0.930606 0.327657 0.40445 0.928747 0.328803 0.431755 0.925419 0.331732 0.450026 0.930117 0.330909 0.476085 0.929571 0.356522 0.00299849 0.926035 0.350164 0.0342632 0.934877 0.358471 0.0594845 0.933815 0.356347 0.0814426 0.926813 0.355545 0.100678 0.929385 0.354902 0.131092 0.925061 0.356571 0.158749 0.926284 0.358316 0.182737 0.929751 0.35747 0.20909 0.93227 0.350849 0.233495 0.930404 0.353929 0.259495 0.932837 0.357748 0.280329 0.931309 0.356607 0.302019 0.926398 0.358484 0.329054 0.930026 0.354996 0.350566 0.93021 0.352249 0.384816 0.92813 0.351481 0.40865 0.934595 0.35588 0.432033 0.930864 0.350258 0.459293 0.933086 0.355727 0.484889 0.933508 0.381768 0.00210501 0.934781 0.379721 0.0276814 0.932217 0.378035 0.0548648 0.932057 0.37535 0.082635 0.926403 0.383471 0.101974 0.930995 0.379152 0.134004 0.929147 0.383049 0.153325 0.927997 0.378638 0.180088 0.927568 0.37588 0.200956 0.929973 0.38224 0.225847 0.925278 0.383996 0.253381 0.930378 0.384818 0.282476 0.932811 0.38102 0.302354 0.930987 0.382917 0.327702 0.928137 0.375593 0.358762 0.931727 0.3843 0.382388 0.929821 0.379076 0.406767 0.930317 0.383506 0.431578 0.933849 0.383395 0.458827 0.932832 0.379697 0.478194 0.927136 0.402612 0.00604578 0.929201 0.405718 0.0331362 0.925731 0.405481 0.0516511 0.927418 0.400854 0.0791339 0.932147 0.404647 0.109813 0.929205 0.402791 0.134731 0.929228 0.408973 0.157565 0.934883 0.405878 0.177627 0.934972 0.400298 0.20258 0.931971 0.405634 0.234957 0.926453 0.405578 0.250464 0.93258 0.409668 0.277221 0.929166 0.403468 0.306628 0.93094 0.405189 0.325885 0.928134 0.404953 0.355912 0.927788 0.401464 0.377143 0.931262 0.406914 0.400123 0.93213 0.407333 0.426796 0.931434 0.402957 0.450797 0.934385 0.402736 0.483253 0.933833 0.42915 6.08867e-05 0.92511 0.431353 0.0253675 0.934427 0.430685 0.0579201 0.931635 0.42656 0.0812714 0.93092 0.426317 0.102871 0.926016 0.426222 0.127808 0.934011 0.430824 0.159324 0.926356 0.433323 0.183967 0.927375 0.42819 0.200341 0.933492 0.428573 0.23034 0.934026 0.433178 0.255419 0.934611 0.430231 0.276383 0.931795 0.429435 0.306869 0.928861 0.432517 0.327937 0.92595 0.42829 0.359143 0.932549 0.432113 0.375726 0.925586 0.430401 0.404089 0.931203 0.43435 0.427766 0.930804 0.425871 0.458726 0.926003 0.428164 0.477893 0.932416 0.454164 0.0072418 0.930386 0.457209 0.0250609 0.92915 0.456157 0.0523663 0.925869 0.456755 0.0752984 0.93425 0.456881 0.102153 0.929878 0.458964 0.127002 0.92596 0.457215 0.158751 0.927722 0.457622 0.179359 0.933791 0.453311 0.203662 0.931487 0.450812 0.234773 0.929782 0.453612 0.259222 0.933681 0.450593 0.281068 0.931893 0.455682 0.303278 0.925219 0.458464 0.327509 0.925322 0.452379 0.358225 0.927339 0.451453 0.379193 0.931061 0.456931 0.40182 0.925412 0.459316 0.432066 0.926088 0.455865 0.456033 0.926298 0.451408 0.484096 0.928199 0.484157 0.00898206 0.934244 0.479191 0.0349622 0.928122 0.479489 0.0514645 0.934779 0.475337 0.0765191 0.927043 0.483435 0.106873 0.932783 0.480046 0.133671 0.927515 0.476411 0.157209 0.932277 0.483227 0.182265 0.931235 0.48177 0.205483 0.928953 0.47927 0.232709 0.927096 0.478422 0.258468 0.934919 0.48201 0.281916 0.925603 0.477857 0.300188 0.929176 0.483043 0.330173 0.9315 0.479604 0.358864 0.928801 0.483679 0.377875 0.926133 0.482834 0.40127 0.933014 0.476559 0.425126 0.933235 0.480133 0.450201 0.929341 0.477986 0.481464 0.928379 0.500585 0.00325724 0.926841 0.506227 0.0284004 0.925053 0.504715 0.0538513 0.925619 0.501017 0.0797592 0.932069 0.505323 0.103771 0.926339 0.506249 0.125015 0.929211 0.507995 0.157677 0.932461 0.502255 0.18361 0.933679 0.505756 0.202384 0.928345 0.504909 0.22682 0.931305 0.501585 0.259801 0.927263 0.508669 0.275007 0.933253 0.509462 0.30568 0.929161 0.504735 0.32864 0.933327 0.509491 0.357891 0.930165 0.502562 0.377916 0.931345 0.500286 0.40468 0.929674 0.50322 0.42992 0.926398 0.505303 0.453348 0.9303 0.506227 0.482918 0.933208 0.533355 0.000734864 0.932386 0.534441 0.0294645 0.930933 0.531902 0.0547673 0.932908 0.528216 0.0827116 0.932011 0.532279 0.10002 0.933419 0.526726 0.131687 0.929469 0.533154 0.154894 0.930504 0.533912 0.184751 0.929876 0.532347 0.200242 0.934588 0.527112 0.234999 0.932439 0.529438 0.253131 0.930021 0.528897 0.275127 0.933559 0.531233 0.304876 0.929282 0.531847 0.333383 0.928075 0.531308 0.359201 0.928797 0.532945 0.377229 0.932011 0.529229 0.405234 0.928083 0.525514 0.430487 0.926528 0.526416 0.458178 0.927658 0.531618 0.481795 0.931595 0.557066 0.00248949 0.92911 0.553812 0.0268498 0.933182 0.556376 0.0576845 0.934727 0.551777 0.0755529 0.934965 0.553744 0.105021 0.926962 0.555659 0.128396 0.933737 0.551747 0.152133 0.929503 0.552914 0.181826 0.934482 0.550569 0.209458 0.927159 0.550564 0.231539 0.931764 0.558072 0.258569 0.932146 0.557885 0.282972 0.926281 0.552094 0.300886 0.928897 0.553528 0.333866 0.929408 0.554054 0.353663 0.926915 0.550391 0.375382 0.926891 0.559351 0.401714 0.933109 0.550545 0.431349 0.931237 0.55876 0.451034 0.933546 0.551767 0.478638 0.928492 0.575404 0.00389123 0.9299 0.576781 0.0333772 0.925986 0.579266 0.0541431 0.93372 0.582039 0.081342 0.928908 0.580819 0.102897 0.925755 0.577359 0.126211 0.928254 0.583634 0.159142 0.92725 0.583856 0.183596 0.928259 0.580208 0.208153 0.926974 0.583161 0.22697 0.932801 0.583459 0.258188 0.930343 0.583188 0.276155 0.930542 0.577056 0.30539 0.92898 0.584146 0.33312 0.934937 0.58172 0.350677 0.925355 0.576412 0.376367 0.92729 0.579146 0.405518 0.927849 0.578232 0.433338 0.926853 0.578128 0.453726 0.932331 0.584589 0.483011 0.933923 0.600798 0.00865886 0.928868 0.600026 0.0320344 0.928277 0.607701 0.055066 0.929904 0.605886 0.0845535 0.931623 0.606058 0.104356 0.929664 0.605667 0.132037 0.930665 0.602871 0.159583 0.929708 0.60098 0.175958 0.927655 0.606953 0.201211 0.931425 0.600101 0.233708 0.933388 0.607904 0.253268 0.930385 0.606982 0.277362 0.931545 0.60664 0.304114 0.929531 0.603573 0.327936 0.932984 0.601742 0.355821 0.925834 0.607476 0.377482 0.92963 0.605274 0.401236 0.934457 0.60446 0.429123 0.928326 0.605481 0.450931 0.927072 0.602447 0.475836 0.934887 0.628725 0.00845111 0.929493 0.625354 0.0298412 0.925061 0.62921 0.0540942 0.927676 0.626334 0.0804424 0.926147 0.626925 0.107004 0.934654 0.630113 0.133688 0.927488 0.629998 0.154199 0.932223 0.632718 0.182878 0.931576 0.625083 0.203069 0.926341 0.633223 0.227957 0.929341 0.629822 0.251961 0.933549 0.629074 0.276043 0.926385 0.630728 0.301267 0.931888 0.633114 0.333861 0.932039 0.625247 0.355357 0.934478 0.62675 0.383941 0.927094 0.631415 0.409907 0.933186 0.631843 0.433537 0.928684 0.627218 0.456494 0.929457 0.633444 0.478727 0.932205 0.658899 0.00426129 0.927114 0.650987 0.0292372 0.929473 0.651136 0.0529513 0.931112 0.654803 0.0814317 0.927048 0.652937 0.107035 0.934531 0.658623 0.128706 0.93274 0.653163 0.158553 0.931216 0.651569 0.176586 0.933846 0.656969 0.207466 0.928078 0.658284 0.229482 0.930232 0.650989 0.258191 0.928068 0.655562 0.281527 0.934208 0.654577 0.303516 0.929868 0.65588 0.334973 0.933769 0.6557 0.359887 0.926469 0.65451 0.381942 0.932359 0.653496 0.405016 0.928309 0.655341 0.432775 0.927336 0.659513 0.456278 0.928834 0.658769 0.481166 0.933264 0.677422 0.000547646 0.93258 0.683522 0.0254609 0.927051 0.682446 0.0506232 0.928647 0.684639 0.0813233 0.92959 0.681955 0.101561 0.929554 0.682352 0.130628 0.925166 0.679025 0.157853 0.93039 0.680519 0.175489 0.927105 0.677561 0.204482 0.931059 0.678982 0.228306 0.931088 0.680315 0.254866 0.93371 0.680555 0.277026 0.926208 0.679954 0.304525 0.925963 0.677547 0.333108 0.925963 0.682341 0.351959 0.927478 0.681574 0.381948 0.931698 0.677936 0.403785 0.927592 0.678923 0.427058 0.930039 0.681782 0.456921 0.930355 0.68479 0.483873 0.927573 0.704587 0.00496237 0.929901 0.704643 0.0285637 0.92714 0.704948 0.0578333 0.925453 0.704381 0.0766965 0.93455 0.709222 0.10061 0.927576 0.704696 0.128195 0.92524 0.709937 0.150166 0.925001 0.702246 0.184632 0.926319 0.707379 0.204731 0.934256 0.700797 0.233005 0.92933 0.706746 0.258431 0.926907 0.702036 0.281685 0.934399 0.702079 0.308528 0.927112 0.700714 0.326153 0.934286 0.700256 0.354786 0.934593 0.707204 0.375838 0.929219 0.702805 0.408373 0.9346 0.707054 0.426221 0.93399 0.709757 0.453886 0.928121 0.707201 0.477147 0.927067 0.725411 0.000939498 0.930966 0.72672 0.0323938 0.934948 0.731067 0.059462 0.932799 0.733836 0.0825234 0.934315 0.730886 0.105936 0.926386 0.728698 0.134638 0.930576 0.732732 0.158045 0.928212 0.730846 0.18387 0.934427 0.733468 0.209925 0.925198 0.731487 0.22722 0.927168 0.727203 0.255664 0.928729 0.729403 0.27548 0.932395 0.726781 0.308038 0.92775 0.733082 0.334763 0.926584 0.726562 0.355926 0.926586 0.729866 0.382763 0.930107 0.733784 0.402663 0.92958 0.731688 0.431043 0.929581 0.727286 0.451462 0.931749 0.725778 0.478322 0.959683 0.00366729 0.00669152 0.952194 0.0022777 0.0258079 0.954316 0.000834753 0.0542369 0.957975 0.0038733 0.0758211 0.951966 0.00802317 0.102143 0.959151 0.00559803 0.125842 0.952341 0.00446416 0.154689 0.95639 0.00359707 0.183631 0.951059 0.00951075 0.204864 0.952656 0.00742294 0.225838 0.950897 0.00170644 0.251168 0.953989 0.00496804 0.282583 0.952392 0.00885259 0.300654 0.956906 0.00687681 0.327471 0.950598 0.00324911 0.352944 0.952651 0.00413 0.377967 0.955328 0.00856343 0.404317 0.959096 0.00582845 0.432399 0.952997 0.00956652 0.455382 0.955631 0.00497374 0.479633 0.953265 0.0328907 0.00848777 0.950741 0.0339662 0.0253379 0.952703 0.0263644 0.0502097 0.959309 0.0320342 0.0844254 0.955842 0.0346205 0.1051 0.955791 0.0307682 0.126209 0.954749 0.0316958 0.157511 0.952738 0.0324682 0.177588 0.952857 0.0327116 0.206449 0.957291 0.0256086 0.227793 0.954138 0.025205 0.25688 0.951036 0.0273082 0.278771 0.951381 0.025176 0.301049 0.952065 0.0274575 0.334981 0.956668 0.0302852 0.350603 0.953752 0.0270004 0.380315 0.957046 0.034704 0.409077 0.953313 0.0276487 0.429298 0.952288 0.0306502 0.451676 0.95429 0.0321885 0.481008 0.95335 0.0586789 0.00380623 0.951102 0.0519668 0.0339394 0.954799 0.0547845 0.058711 0.952568 0.0551166 0.0849051 0.957073 0.0543683 0.106016 0.951642 0.0506277 0.12914 0.95846 0.0575393 0.150304 0.952015 0.0582986 0.178417 0.956311 0.0510847 0.203257 0.955896 0.052762 0.229989 0.952971 0.0595953 0.255308 0.958533 0.0522435 0.278116 0.950539 0.0563434 0.301664 0.95363 0.0517123 0.331069 0.952053 0.0561334 0.356775 0.953239 0.0511308 0.378802 0.959449 0.0578297 0.404809 0.959183 0.052187 0.427803 0.956878 0.0585952 0.455358 0.950913 0.0510861 0.475626 0.951551 0.0781076 0.00814465 0.953256 0.0832218 0.0287904 0.957444 0.0823294 0.0590633 0.95059 0.0778949 0.0837806 0.951829 0.0832207 0.103693 0.950515 0.0775195 0.12842 0.951705 0.0769019 0.156733 0.955308 0.0810003 0.184528 0.954788 0.0838857 0.203684 0.954831 0.0834231 0.233745 0.952026 0.0752817 0.25121 0.951677 0.0809114 0.281471 0.959316 0.0810461 0.303367 0.953268 0.0782338 0.334115 0.950239 0.0776362 0.358176 0.951641 0.0837817 0.376991 0.951835 0.0838191 0.407801 0.951373 0.0783622 0.429034 0.958872 0.0814055 0.45911 0.954105 0.077058 0.475945 0.955647 0.102952 0.00924541 0.957556 0.102793 0.0274666 0.95579 0.102233 0.0522607 0.951386 0.10449 0.0839599 0.956374 0.102918 0.106117 0.95436 0.10628 0.126724 0.959762 0.107498 0.15704 0.958672 0.104292 0.177196 0.95452 0.10481 0.200244 0.951581 0.104667 0.227655 0.953824 0.107084 0.252676 0.955693 0.101288 0.282174 0.95777 0.104719 0.301271 0.957572 0.108636 0.325062 0.953684 0.102909 0.356477 0.951015 0.108981 0.380259 0.95358 0.100933 0.40914 0.953955 0.108349 0.433016 0.957982 0.101951 0.455787 0.956018 0.100822 0.475567 0.950208 0.130899 0.00224866 0.958243 0.128915 0.0273863 0.952587 0.126331 0.0579536 0.958614 0.127664 0.0753688 0.954909 0.131524 0.108409 0.952989 0.131872 0.125858 0.950124 0.1267 0.156682 0.954702 0.125412 0.183412 0.956854 0.130392 0.202435 0.957643 0.132244 0.225692 0.959934 0.126843 0.250579 0.957653 0.133945 0.282824 0.950038 0.130279 0.301065 0.955806 0.132792 0.333456 0.95015 0.132459 0.359912 0.954799 0.125231 0.382241 0.955533 0.134742 0.406925 0.950571 0.13038 0.428937 0.958571 0.126361 0.452393 0.952771 0.13049 0.476333 0.950585 0.151457 0.00607696 0.950492 0.154723 0.0279559 0.959721 0.156241 0.0547576 0.956131 0.157788 0.0767246 0.954061 0.150592 0.102017 0.959027 0.157837 0.129224 0.952657 0.151598 0.158011 0.95218 0.157552 0.17727 0.958423 0.159115 0.205177 0.958219 0.151302 0.227707 0.954477 0.154544 0.254233 0.958307 0.15829 0.276248 0.959803 0.155306 0.304371 0.959562 0.155853 0.327984 0.953702 0.157997 0.357924 0.95105 0.153097 0.379283 0.951729 0.150532 0.40229 0.95951 0.159005 0.433259 0.952098 0.156246 0.456049 0.950987 0.152999 0.478962 0.959047 0.182715 0.0041265 0.956466 0.176465 0.0292433 0.953346 0.180963 0.0564609 0.957383 0.180419 0.0781815 0.955452 0.181048 0.108439 0.959417 0.179386 0.132908 0.958402 0.17844 0.152495 0.957287 0.183308 0.183494 0.95756 0.182972 0.20517 0.954072 0.179273 0.227887 0.95523 0.180937 0.252739 0.956883 0.177171 0.275944 0.956554 0.178761 0.30376 0.95048 0.175216 0.325241 0.9508 0.180547 0.354578 0.957679 0.181183 0.380423 0.954127 0.178393 0.406948 0.950966 0.183413 0.427671 0.955259 0.183592 0.450909 0.956523 0.179925 0.480055 0.955933 0.209636 0.00426857 0.959828 0.208538 0.0297024 0.957649 0.207257 0.0539008 0.959185 0.201627 0.0809308 0.953988 0.205979 0.105492 0.956913 0.206944 0.12646 0.953617 0.204525 0.152714 0.950697 0.200777 0.180139 0.950157 0.206623 0.204179 0.957745 0.201931 0.230615 0.953541 0.20939 0.253495 0.958049 0.205072 0.278791 0.958928 0.207127 0.306897 0.959686 0.205193 0.334863 0.953269 0.209435 0.356753 0.95889 0.207091 0.383137 0.957018 0.205389 0.40494 0.959394 0.2022 0.425529 0.954177 0.208882 0.456326 0.953328 0.207031 0.484083 0.955258 0.23071 0.00414398 0.953853 0.233614 0.0290457 0.958081 0.230749 0.054887 0.959861 0.227242 0.0758728 0.959558 0.234203 0.109711 0.959228 0.22834 0.125086 0.950329 0.229515 0.157334 0.954159 0.233945 0.182621 0.950107 0.227389 0.208095 0.956889 0.229475 0.229064 0.959459 0.230122 0.257007 0.954264 0.234176 0.28003 0.953455 0.226364 0.306716 0.958859 0.232931 0.328871 0.958384 0.228965 0.351728 0.95457 0.232974 0.384185 0.950352 0.225594 0.405545 0.959661 0.225065 0.43055 0.953177 0.22813 0.450789 0.955568 0.229743 0.479041 0.952668 0.25539 0.00687228 0.953885 0.253141 0.0299453 0.955207 0.255083 0.0587707 0.95687 0.254438 0.0751322 0.957046 0.253127 0.101484 0.958553 0.253217 0.130027 0.958185 0.25778 0.153226 0.957942 0.256091 0.179413 0.957861 0.255915 0.200156 0.953265 0.254177 0.229876 0.957403 0.250114 0.256524 0.957696 0.258837 0.276932 0.951476 0.252823 0.309196 0.955065 0.253736 0.332472 0.956385 0.257228 0.355501 0.959566 0.255933 0.380391 0.951499 0.251934 0.401515 0.956439 0.25942 0.426204 0.959691 0.255793 0.45893 0.959771 0.250675 0.481534 0.956911 0.281099 0.000428639 0.955769 0.281778 0.0340945 0.956799 0.284298 0.0523025 0.950534 0.276193 0.0757616 0.952541 0.27864 0.100577 0.958404 0.277544 0.125287 0.953826 0.279914 0.152198 0.957394 0.278931 0.177322 0.952736 0.284538 0.208744 0.950997 0.276393 0.233488 0.95916 0.281024 0.250849 0.956176 0.279436 0.279835 0.952351 0.284675 0.300123 0.951358 0.277659 0.325429 0.958489 0.281081 0.352746 0.954518 0.278693 0.375639 0.954978 0.27697 0.402132 0.954539 0.284285 0.430552 0.950768 0.275509 0.45378 0.959187 0.279567 0.476423 0.951883 0.303089 0.00611176 0.95347 0.303966 0.0281099 0.951694 0.307887 0.0539256 0.951098 0.305451 0.0775991 0.959222 0.307688 0.106213 0.958978 0.300384 0.134647 0.956414 0.300911 0.153627 0.957522 0.302554 0.184756 0.958284 0.301746 0.207129 0.950608 0.301543 0.228968 0.950593 0.301745 0.253411 0.956136 0.302606 0.284002 0.95863 0.3006 0.306712 0.952098 0.303027 0.331552 0.954382 0.307301 0.35484 0.959424 0.309369 0.379918 0.956832 0.302287 0.403341 0.955644 0.309678 0.434945 0.959084 0.304009 0.457479 0.954509 0.309096 0.477771 0.951129 0.329228 0.00950414 0.95902 0.332488 0.0327334 0.951875 0.326539 0.0522608 0.952403 0.332018 0.0773984 0.951617 0.331052 0.104474 0.952141 0.328695 0.129752 0.951322 0.327885 0.152437 0.959332 0.327481 0.17832 0.955905 0.333444 0.208263 0.952369 0.327143 0.230426 0.950763 0.333127 0.252607 0.959284 0.334316 0.281838 0.955497 0.325624 0.302949 0.954863 0.330378 0.32642 0.959132 0.333907 0.357192 0.952095 0.333559 0.380709 0.950097 0.32584 0.403731 0.958918 0.326892 0.427842 0.959304 0.330249 0.457786 0.951742 0.332122 0.478985 0.956758 0.351831 0.00209811 0.958627 0.355995 0.033335 0.953408 0.359507 0.0543386 0.959385 0.351377 0.0793491 0.952022 0.358509 0.104744 0.955667 0.35839 0.125669 0.957392 0.359932 0.155914 0.959936 0.352922 0.177198 0.956383 0.358163 0.200367 0.959516 0.359489 0.22864 0.95383 0.35834 0.250255 0.957376 0.352615 0.276311 0.957385 0.354851 0.309495 0.951281 0.351317 0.333736 0.952012 0.359358 0.357567 0.95603 0.352071 0.380655 0.956107 0.352609 0.400604 0.958423 0.351632 0.427372 0.957713 0.358666 0.457483 0.953657 0.351518 0.478071 0.959751 0.380792 0.00603187 0.950284 0.384259 0.0304269 0.955868 0.376971 0.051189 0.959441 0.377546 0.0806257 0.953297 0.380935 0.108868 0.956298 0.383913 0.126105 0.957426 0.382097 0.155115 0.950305 0.375987 0.181729 0.956048 0.375542 0.203676 0.957184 0.382808 0.232028 0.955655 0.382006 0.252637 0.952713 0.376882 0.283861 0.954335 0.375334 0.309773 0.953253 0.378531 0.331196 0.95665 0.384522 0.35511 0.952286 0.382052 0.382347 0.952059 0.378618 0.401973 0.956056 0.376199 0.429762 0.957097 0.384511 0.459598 0.95886 0.383854 0.478235 0.953433 0.403253 0.00507321 0.959982 0.408177 0.0290043 0.958773 0.404922 0.0542532 0.951537 0.407741 0.0771484 0.951761 0.407508 0.100825 0.957809 0.402226 0.133744 0.951753 0.409843 0.152058 0.953929 0.408677 0.175321 0.958791 0.408019 0.209174 0.959621 0.406319 0.229692 0.955912 0.405158 0.253061 0.959113 0.403365 0.279819 0.957896 0.408821 0.304765 0.952533 0.403253 0.330532 0.955634 0.401918 0.355106 0.952366 0.403773 0.37757 0.952674 0.400622 0.409323 0.95133 0.400364 0.430327 0.954453 0.409578 0.454115 0.955905 0.403383 0.479107 0.959436 0.430266 0.00574743 0.95793 0.433956 0.0343278 0.951903 0.428264 0.0502144 0.957548 0.4327 0.0841641 0.95632 0.425683 0.109546 0.95342 0.426456 0.128131 0.95258 0.42755 0.15323 0.956401 0.430404 0.180279 0.954551 0.431197 0.202511 0.956874 0.433846 0.231158 0.95938 0.42712 0.25559 0.955558 0.432532 0.284477 0.954622 0.43429 0.305889 0.953905 0.425744 0.33072 0.95702 0.434675 0.357465 0.959892 0.434398 0.375856 0.955278 0.430781 0.400362 0.957617 0.429852 0.430641 0.955144 0.427465 0.455417 0.956925 0.434888 0.48137 0.959266 0.456893 0.00619168 0.959748 0.452697 0.0271543 0.950206 0.454533 0.0542588 0.959399 0.454971 0.0832608 0.952455 0.455151 0.10328 0.959083 0.456019 0.131112 0.95336 0.456927 0.151668 0.958641 0.457853 0.178266 0.952387 0.450989 0.200473 0.953013 0.456478 0.231519 0.955188 0.452379 0.255938 0.950419 0.45142 0.281749 0.956437 0.45809 0.300421 0.951034 0.458955 0.331002 0.953435 0.450034 0.350734 0.957304 0.450349 0.384127 0.955929 0.455723 0.408081 0.952412 0.45153 0.429585 0.953949 0.450153 0.453519 0.959297 0.459458 0.479102 0.950837 0.478967 0.00150992 0.9547 0.483879 0.0324105 0.958765 0.475213 0.0503773 0.953666 0.476916 0.0790476 0.954656 0.478932 0.104963 0.952522 0.483322 0.128883 0.955317 0.478616 0.153065 0.954747 0.484758 0.180151 0.952895 0.47671 0.20018 0.953676 0.47699 0.231836 0.952713 0.483341 0.250437 0.959314 0.484567 0.280231 0.953249 0.481428 0.308872 0.950127 0.479732 0.333243 0.951355 0.477252 0.356876 0.955647 0.481964 0.3842 0.955135 0.484648 0.401088 0.957564 0.480534 0.427923 0.951007 0.478446 0.453365 0.9575 0.479142 0.483589 0.950067 0.503612 0.00190057 0.957801 0.502701 0.0344658 0.956009 0.500882 0.0505434 0.953792 0.508489 0.0768606 0.958747 0.508003 0.105596 0.95194 0.507178 0.126977 0.959474 0.502459 0.157966 0.952457 0.506672 0.180122 0.952003 0.50063 0.208567 0.958879 0.508696 0.226451 0.956869 0.503663 0.255277 0.951782 0.505284 0.283719 0.959549 0.503726 0.301941 0.957771 0.50029 0.333808 0.952957 0.500561 0.351726 0.954706 0.505411 0.378578 0.956409 0.509463 0.403629 0.955518 0.505074 0.430543 0.950176 0.501293 0.453024 0.953667 0.506816 0.478537 0.952511 0.526183 0.00914967 0.951374 0.531391 0.0281814 0.955364 0.526861 0.0538061 0.954053 0.531624 0.0767101 0.957262 0.534343 0.107014 0.952466 0.532681 0.125402 0.950654 0.530888 0.159686 0.959305 0.529701 0.177493 0.950653 0.532008 0.209482 0.952438 0.525379 0.225873 0.952114 0.531663 0.252144 0.957024 0.52679 0.282645 0.953673 0.525936 0.303575 0.953546 0.532982 0.330044 0.951391 0.534978 0.359193 0.952754 0.533916 0.38313 0.958625 0.528135 0.40187 0.95248 0.533151 0.427911 0.954715 0.526629 0.454182 0.951546 0.530628 0.475568 0.959418 0.559613 0.00296294 0.955704 0.555624 0.0250749 0.95482 0.556613 0.058379 0.950191 0.55706 0.0773445 0.950443 0.558649 0.108739 0.959388 0.559999 0.132166 0.952888 0.55256 0.151487 0.958615 0.55335 0.18102 0.952478 0.559042 0.209629 0.956705 0.559662 0.234396 0.953881 0.556433 0.259417 0.954104 0.550984 0.281789 0.954781 0.558742 0.300652 0.955446 0.556523 0.327934 0.952511 0.556431 0.353963 0.95861 0.55163 0.380641 0.953515 0.558104 0.404884 0.957275 0.553671 0.427873 0.952631 0.554935 0.453134 0.957564 0.556081 0.476594 0.959733 0.582515 0.00750468 0.956391 0.581937 0.0265968 0.957723 0.584612 0.0594963 0.958758 0.581172 0.0791912 0.951893 0.57692 0.102084 0.956604 0.576658 0.134627 0.957979 0.583964 0.152729 0.955478 0.581678 0.184267 0.952238 0.575886 0.201448 0.957662 0.577407 0.229801 0.952721 0.57799 0.259674 0.957986 0.584223 0.28307 0.957191 0.576413 0.302266 0.951733 0.583075 0.326669 0.95879 0.580665 0.35333 0.958701 0.581375 0.384974 0.955301 0.581244 0.405345 0.951046 0.584535 0.430912 0.953269 0.576887 0.451725 0.956186 0.578116 0.484429 0.953182 0.605486 0.00109479 0.9563 0.606287 0.0336487 0.955382 0.609821 0.0584259 0.951826 0.604688 0.0822896 0.95876 0.606805 0.101427 0.950386 0.60126 0.125755 0.959482 0.609306 0.151024 0.956478 0.600807 0.183257 0.959984 0.605436 0.208603 0.95264 0.6056 0.231435 0.951378 0.606582 0.259485 0.95632 0.601111 0.284701 0.956665 0.60095 0.3078 0.958957 0.6043 0.334801 0.950309 0.605128 0.357373 0.951726 0.601447 0.376541 0.95849 0.602713 0.401118 0.953039 0.6074 0.430153 0.951046 0.606157 0.450052 0.957519 0.604628 0.477894 0.956342 0.634989 0.00567932 0.953448 0.628776 0.031123 0.956075 0.626358 0.0518354 0.950034 0.633322 0.0787825 0.95928 0.633581 0.109776 0.951341 0.631091 0.131138 0.958544 0.629993 0.150256 0.956697 0.625813 0.175957 0.950908 0.62698 0.207617 0.950295 0.631905 0.22646 0.958655 0.629504 0.259164 0.958429 0.632897 0.281735 0.956003 0.632597 0.30229 0.954805 0.625299 0.327048 0.951063 0.629409 0.35204 0.958127 0.63497 0.376227 0.958357 0.629297 0.406558 0.959328 0.63353 0.43175 0.959173 0.625532 0.45378 0.959351 0.627413 0.483297 0.950685 0.656127 0.00404642 0.95835 0.654356 0.0250736 0.955514 0.652474 0.0594143 0.955682 0.658233 0.0825007 0.95644 0.65368 0.107346 0.957367 0.651867 0.12841 0.950725 0.655658 0.154917 0.950878 0.654253 0.17594 0.95559 0.652373 0.201215 0.958928 0.659236 0.229863 0.958333 0.658241 0.25179 0.954052 0.659228 0.284789 0.953276 0.659465 0.306238 0.950502 0.658132 0.332522 0.958296 0.657531 0.358823 0.958924 0.658344 0.384 0.953079 0.655554 0.402372 0.956863 0.655999 0.430329 0.95003 0.659159 0.451842 0.956162 0.656771 0.480672 0.959093 0.678573 0.000138057 0.958328 0.683673 0.02587 0.950012 0.681022 0.0529575 0.957836 0.684064 0.076477 0.951473 0.684021 0.106105 0.95349 0.678378 0.133065 0.950404 0.677646 0.152449 0.950829 0.684101 0.183631 0.954619 0.684698 0.205588 0.956409 0.677898 0.225546 0.952966 0.675982 0.258764 0.954972 0.675504 0.277829 0.951141 0.68012 0.300248 0.95037 0.679365 0.334548 0.95678 0.67644 0.350043 0.953014 0.677402 0.377519 0.956456 0.678899 0.408078 0.95462 0.679632 0.427498 0.953149 0.680916 0.456018 0.954937 0.67853 0.483418 0.950921 0.708628 0.00375805 0.954769 0.704638 0.0346924 0.956272 0.709337 0.0541702 0.953386 0.705792 0.0834756 0.959273 0.70951 0.104926 0.958911 0.70857 0.129029 0.9525 0.70151 0.152783 0.950173 0.709843 0.178972 0.950609 0.700516 0.204798 0.958868 0.708239 0.22568 0.953918 0.709454 0.25522 0.954124 0.701555 0.276296 0.958843 0.700937 0.309895 0.952293 0.707217 0.3308 0.956795 0.701404 0.350777 0.956569 0.702194 0.384524 0.950514 0.704655 0.40831 0.956474 0.703282 0.432257 0.951519 0.701038 0.454132 0.954075 0.703204 0.481272 0.95883 0.728507 0.0047654 0.957609 0.732103 0.030411 0.955903 0.729502 0.0563857 0.955636 0.726073 0.0828127 0.954048 0.731891 0.103313 0.950669 0.727446 0.132888 0.957267 0.728207 0.159422 0.958513 0.734935 0.180072 0.95779 0.725037 0.202381 0.959787 0.726177 0.22701 0.953038 0.728401 0.252684 0.958667 0.726483 0.28012 0.953992 0.733668 0.304239 0.958991 0.734687 0.325336 0.953591 0.729797 0.358076 0.956781 0.734235 0.375169 0.9511 0.734283 0.407113 0.958891 0.727044 0.429824 0.951837 0.732313 0.457646 0.953039 0.733965 0.483949 0.982408 0.00604627 0.00195577 0.984286 0.00600891 0.0252998 0.975266 0.00872553 0.0577958 0.980124 0.0097187 0.0766882 0.980488 0.0068016 0.102348 0.982331 0.00819414 0.132748 0.984535 3.54832e-05 0.15822 0.981556 0.00172079 0.176768 0.983209 0.00958402 0.208574 0.984413 0.00317431 0.232779 0.976575 0.00693259 0.258646 0.976907 0.00387711 0.2834 0.976432 0.00511428 0.300426 0.980065 0.00253268 0.332405 0.976112 0.00915327 0.359143 0.977363 0.00558445 0.378373 0.975132 0.00112219 0.405841 0.982401 0.00499757 0.427789 0.97528 0.00808243 0.45246 0.983335 0.00510429 0.480819 0.976041 0.0323342 0.00847767 0.980538 0.0343521 0.0282674 0.978096 0.0267506 0.0592375 0.979556 0.0256713 0.0811172 0.981222 0.0349857 0.109772 0.980564 0.0263 0.134971 0.982301 0.0297337 0.158307 0.984545 0.0303288 0.184073 0.981012 0.0316216 0.203807 0.977463 0.0274364 0.23054 0.981667 0.0293967 0.256498 0.978151 0.0277962 0.282451 0.979105 0.02856 0.304203 0.977392 0.0347355 0.325446 0.979327 0.0346749 0.352025 0.983737 0.0336689 0.381361 0.976955 0.0279935 0.404877 0.978345 0.0281964 0.434578 0.982927 0.0261317 0.456539 0.981507 0.0342149 0.477792 0.984032 0.0555655 0.00322792 0.984786 0.0555069 0.0340693 0.982101 0.0525331 0.0571018 0.975636 0.0528356 0.0753507 0.976765 0.0590965 0.108509 0.984861 0.0536502 0.129582 0.9835 0.0525578 0.156898 0.984729 0.0568798 0.183813 0.984201 0.0596606 0.206855 0.975432 0.0584983 0.230938 0.984833 0.0576197 0.253292 0.975252 0.0534947 0.284913 0.976749 0.0575787 0.300694 0.982895 0.0546557 0.334272 0.97724 0.0519642 0.352328 0.983906 0.0522345 0.377685 0.975009 0.0562475 0.405868 0.975712 0.0515345 0.427651 0.981073 0.052266 0.458033 0.983421 0.0574686 0.478028 0.975027 0.0796565 0.00736524 0.976108 0.0800843 0.0330988 0.978508 0.0756751 0.0535176 0.978301 0.0795859 0.0817641 0.980707 0.0815367 0.100662 0.983632 0.0773597 0.131428 0.983482 0.0766319 0.154135 0.982124 0.0835262 0.178565 0.982095 0.0823778 0.202618 0.97649 0.0776 0.23334 0.984437 0.0795051 0.253693 0.975836 0.0753023 0.275521 0.983513 0.0750456 0.3048 0.978781 0.0804875 0.333698 0.984173 0.0761353 0.35534 0.979998 0.0795509 0.384985 0.978628 0.080916 0.4052 0.983299 0.0763605 0.426216 0.977699 0.0813442 0.454225 0.981371 0.0774729 0.477348 0.981403 0.109764 0.00723312 0.982229 0.108331 0.0342376 0.978769 0.101255 0.0591054 0.981853 0.107119 0.0777616 0.975377 0.107006 0.109606 0.978217 0.106307 0.133792 0.977588 0.106463 0.151767 0.982347 0.10025 0.178067 0.976749 0.10321 0.20747 0.978726 0.108959 0.227354 0.980984 0.101498 0.253439 0.975268 0.103944 0.284511 0.984526 0.100352 0.305827 0.979398 0.107743 0.328091 0.975734 0.102144 0.355484 0.982399 0.103859 0.375664 0.978563 0.107538 0.405536 0.981313 0.100445 0.432922 0.980311 0.100809 0.451786 0.982626 0.101243 0.477466 0.981074 0.131468 0.00167358 0.980393 0.128613 0.0293793 0.978407 0.126682 0.0537144 0.980506 0.130213 0.0768426 0.98136 0.127719 0.103298 0.979786 0.13411 0.132374 0.983484 0.125594 0.156804 0.978105 0.131904 0.176996 0.976663 0.127041 0.203712 0.98164 0.125325 0.227085 0.980267 0.129697 0.254831 0.981144 0.125225 0.275567 0.983661 0.133639 0.30566 0.979085 0.125927 0.327957 0.980531 0.128924 0.350394 0.976282 0.131292 0.377377 0.976864 0.132368 0.407073 0.982403 0.131018 0.429236 0.984438 0.126011 0.457186 0.979754 0.132224 0.481711 0.978801 0.159671 0.00924004 0.98188 0.152096 0.0327054 0.97866 0.150224 0.0535695 0.982026 0.15072 0.0769823 0.976165 0.159954 0.100886 0.979607 0.152998 0.134693 0.981032 0.154104 0.157855 0.977596 0.156406 0.184364 0.980037 0.154012 0.20243 0.981131 0.156108 0.228694 0.98179 0.159028 0.255687 0.980398 0.153978 0.28443 0.982843 0.1587 0.304714 0.977099 0.158519 0.326728 0.980669 0.152369 0.359402 0.980783 0.157962 0.384207 0.981009 0.154628 0.404253 0.983481 0.150755 0.432123 0.9803 0.159013 0.458106 0.98018 0.154844 0.475057 0.978554 0.179478 0.00219945 0.984328 0.180223 0.0267724 0.981154 0.177005 0.0580422 0.979954 0.176405 0.0776203 0.98132 0.179267 0.100076 0.982712 0.179226 0.125787 0.984545 0.184653 0.152672 0.975514 0.178254 0.17834 0.984758 0.180156 0.201149 0.977328 0.179453 0.233325 0.984269 0.18448 0.255505 0.97959 0.180714 0.28198 0.975389 0.183465 0.300109 0.984448 0.184932 0.332355 0.976795 0.177355 0.350371 0.976969 0.179726 0.376595 0.980114 0.181355 0.404496 0.977288 0.182125 0.433129 0.975623 0.183988 0.450419 0.979563 0.184162 0.476696 0.980866 0.207894 0.00168555 0.978561 0.204763 0.0257448 0.979631 0.205929 0.0501518 0.976081 0.201734 0.0784079 0.979669 0.203363 0.103958 0.982745 0.208109 0.129796 0.983677 0.201277 0.153328 0.975904 0.209165 0.178205 0.980642 0.204794 0.208526 0.984531 0.205365 0.232623 0.984295 0.207667 0.252285 0.97608 0.202057 0.276827 0.978051 0.204716 0.307801 0.980686 0.200952 0.329027 0.984421 0.204615 0.352365 0.983243 0.206127 0.379133 0.979982 0.207521 0.409635 0.977174 0.201465 0.431816 0.98025 0.206131 0.454629 0.976171 0.202569 0.482357 0.984905 0.229001 0.00588321 0.979503 0.225394 0.0295401 0.975741 0.231474 0.0542358 0.977652 0.226082 0.0823452 0.977462 0.22749 0.107082 0.975824 0.229504 0.126027 0.97705 0.230077 0.153921 0.977257 0.22765 0.184243 0.981615 0.228375 0.209104 0.982842 0.225388 0.23466 0.98023 0.230784 0.257511 0.975943 0.229958 0.279505 0.975224 0.228986 0.305717 0.979094 0.228695 0.327864 0.981745 0.23465 0.357597 0.983509 0.229246 0.380418 0.983748 0.225208 0.406532 0.977953 0.230321 0.431342 0.97713 0.225287 0.452174 0.975658 0.232486 0.48112 0.980625 0.259402 0.00886131 0.979877 0.250187 0.0307105 0.979269 0.256143 0.0547679 0.976611 0.25564 0.0768036 0.98381 0.25709 0.101819 0.975091 0.251783 0.131149 0.983215 0.251683 0.151114 0.979148 0.256182 0.180847 0.977532 0.250567 0.202177 0.981175 0.253276 0.23442 0.979756 0.25525 0.257726 0.97788 0.25326 0.280422 0.983718 0.255227 0.300998 0.975962 0.257593 0.331373 0.978709 0.252801 0.355593 0.975238 0.250391 0.381052 0.981485 0.250782 0.403303 0.982738 0.250549 0.426227 0.975341 0.255738 0.457859 0.977763 0.250246 0.47797 0.97586 0.276947 0.00652114 0.979052 0.27879 0.0341217 0.977813 0.281069 0.0578052 0.982965 0.277169 0.0792875 0.978473 0.277132 0.107361 0.981324 0.281447 0.128601 0.979841 0.275984 0.151991 0.982465 0.277132 0.182137 0.975873 0.279705 0.207223 0.977965 0.279061 0.226737 0.984118 0.275977 0.259376 0.983887 0.279715 0.27646 0.982414 0.283505 0.308209 0.983637 0.276082 0.328045 0.977749 0.279712 0.357018 0.983636 0.283782 0.382031 0.979061 0.281554 0.401028 0.975625 0.279453 0.428421 0.97901 0.275128 0.455115 0.982322 0.275237 0.476991 0.981372 0.306559 0.00220066 0.980703 0.303117 0.0320575 0.984137 0.30463 0.0522408 0.979165 0.30772 0.0815828 0.976013 0.301576 0.106452 0.982378 0.304322 0.125356 0.976238 0.308792 0.156433 0.976726 0.302419 0.179261 0.977192 0.30962 0.205374 0.975583 0.307229 0.225616 0.984508 0.30345 0.250014 0.981198 0.307141 0.280727 0.981187 0.303231 0.300427 0.979596 0.307265 0.330001 0.978058 0.301637 0.358673 0.980213 0.304233 0.381041 0.977608 0.308183 0.406228 0.982894 0.30803 0.433646 0.983165 0.306019 0.456248 0.981465 0.3073 0.478587 0.981189 0.328976 0.00360165 0.982484 0.333234 0.0295201 0.977769 0.327495 0.0511002 0.983895 0.334486 0.0794595 0.983892 0.330288 0.104797 0.978599 0.333415 0.131941 0.980477 0.333932 0.152886 0.98396 0.331458 0.175659 0.977084 0.325867 0.200122 0.976203 0.325207 0.233576 0.980093 0.333691 0.257472 0.983411 0.33143 0.278369 0.980834 0.330621 0.304348 0.982016 0.326015 0.325992 0.983351 0.330119 0.35476 0.980883 0.327368 0.3833 0.977418 0.33409 0.406886 0.9784 0.325622 0.432884 0.984632 0.325484 0.459006 0.976568 0.328816 0.47767 0.979265 0.353677 0.00493601 0.978835 0.356924 0.0250527 0.979364 0.350433 0.0532201 0.979527 0.35216 0.0834791 0.9756 0.353629 0.1075 0.978541 0.354317 0.127048 0.978622 0.358729 0.150113 0.978576 0.35406 0.179349 0.984408 0.358744 0.208066 0.984282 0.355954 0.227632 0.983356 0.352245 0.258564 0.975587 0.352617 0.279927 0.977003 0.358388 0.308537 0.980261 0.355952 0.333237 0.983399 0.359786 0.350532 0.980774 0.354618 0.383567 0.976156 0.352851 0.408967 0.979322 0.357502 0.434363 0.975775 0.351464 0.452648 0.98202 0.359124 0.483349 0.977517 0.377199 0.000286612 0.977173 0.375781 0.0263064 0.984323 0.381091 0.0554088 0.979207 0.382343 0.0751858 0.979805 0.37712 0.107395 0.979991 0.375627 0.134918 0.984798 0.384263 0.152111 0.982194 0.380072 0.178417 0.976348 0.377162 0.20095 0.975221 0.383238 0.225828 0.976468 0.378639 0.257539 0.980695 0.381394 0.276607 0.977977 0.37721 0.309507 0.980578 0.381098 0.327289 0.979129 0.383074 0.351335 0.981663 0.379146 0.378666 0.981606 0.381723 0.40219 0.975805 0.383102 0.426423 0.978142 0.37887 0.453256 0.976343 0.383319 0.476691 0.976274 0.404723 0.00213369 0.975451 0.402075 0.0303441 0.975452 0.403146 0.0526969 0.984343 0.405824 0.0773436 0.977677 0.403805 0.105092 0.983397 0.403959 0.134572 0.981184 0.407166 0.15549 0.97564 0.403096 0.177902 0.976752 0.40355 0.206765 0.981839 0.408638 0.234086 0.983793 0.406133 0.259747 0.976346 0.409427 0.27754 0.97848 0.403146 0.308911 0.979402 0.403338 0.327811 0.981132 0.408282 0.35418 0.978459 0.402353 0.384593 0.984533 0.408223 0.403752 0.976816 0.404631 0.426506 0.975513 0.405764 0.456746 0.984073 0.404326 0.483729 0.980552 0.431751 0.000514582 0.980373 0.433263 0.0309306 0.981638 0.425627 0.0556288 0.977341 0.425543 0.0846061 0.983767 0.430281 0.107575 0.976132 0.42823 0.13134 0.982249 0.427716 0.155449 0.982463 0.428304 0.179017 0.984375 0.432121 0.200114 0.983607 0.428961 0.228398 0.975996 0.431302 0.25843 0.978479 0.431612 0.283975 0.979757 0.433651 0.301573 0.98034 0.425271 0.327344 0.980016 0.431262 0.357201 0.984576 0.427725 0.378046 0.981582 0.434516 0.408798 0.976375 0.43223 0.432769 0.984324 0.427256 0.454357 0.976791 0.432682 0.48069 0.984347 0.455863 0.00528684 0.984954 0.451692 0.0270146 0.980649 0.459197 0.0552264 0.984831 0.456916 0.0845549 0.979518 0.45216 0.10543 0.97683 0.459341 0.125378 0.9778 0.459817 0.158051 0.978345 0.452378 0.177964 0.981639 0.458749 0.209471 0.976034 0.453429 0.230862 0.982984 0.454902 0.258565 0.975363 0.45518 0.275148 0.983234 0.45676 0.304767 0.984745 0.451463 0.328003 0.981399 0.455156 0.359461 0.982273 0.459785 0.380455 0.980768 0.455024 0.402952 0.980778 0.45882 0.432515 0.97859 0.456177 0.455292 0.978005 0.458036 0.476711 0.97822 0.476221 0.00509475 0.978882 0.478388 0.0325775 0.983821 0.477021 0.0578049 0.984054 0.475526 0.0783013 0.981798 0.475809 0.1018 0.984214 0.479928 0.130012 0.981405 0.484731 0.158595 0.983414 0.479622 0.184359 0.975128 0.481813 0.202319 0.984817 0.483784 0.230337 0.977724 0.480262 0.255334 0.982772 0.48416 0.283678 0.979857 0.478799 0.30479 0.978149 0.475268 0.329675 0.977436 0.477858 0.354856 0.983772 0.480764 0.379573 0.980362 0.478395 0.408296 0.982505 0.477376 0.432013 0.984973 0.479311 0.453354 0.976615 0.476991 0.48289 0.981315 0.502308 0.00975813 0.976946 0.502172 0.030897 0.979611 0.509944 0.0581891 0.976361 0.506938 0.0844775 0.983737 0.508575 0.104186 0.976829 0.506309 0.126895 0.98043 0.509851 0.151847 0.983448 0.501464 0.183723 0.984273 0.506954 0.203382 0.976592 0.502464 0.23311 0.984028 0.505989 0.250833 0.982155 0.502297 0.277893 0.976394 0.509888 0.304822 0.976683 0.504457 0.330674 0.983796 0.504414 0.357604 0.976838 0.507576 0.382953 0.983648 0.509135 0.401897 0.978861 0.505252 0.430002 0.97716 0.502309 0.453483 0.976251 0.505011 0.481924 0.978861 0.528244 0.00749094 0.97897 0.529677 0.0300523 0.982183 0.533602 0.0540108 0.982355 0.533212 0.0825213 0.979013 0.528852 0.102553 0.981091 0.525444 0.130862 0.979126 0.530989 0.153958 0.97571 0.525499 0.184438 0.980521 0.530965 0.208091 0.983091 0.53492 0.226102 0.976449 0.534 0.258601 0.984393 0.528927 0.284912 0.980729 0.528727 0.304998 0.984355 0.52611 0.334613 0.97579 0.534523 0.356676 0.984953 0.532606 0.382784 0.977806 0.533775 0.409402 0.979196 0.534697 0.42827 0.981899 0.526688 0.452082 0.980071 0.533556 0.478758 0.977155 0.556306 0.00841326 0.978372 0.552002 0.0287656 0.982406 0.550371 0.0590808 0.979429 0.558453 0.07754 0.979211 0.558044 0.100156 0.97955 0.55368 0.126813 0.978676 0.556502 0.154884 0.984067 0.555019 0.184608 0.982489 0.557915 0.204012 0.980642 0.550406 0.233108 0.983543 0.551863 0.254619 0.984767 0.550537 0.281991 0.980633 0.557525 0.309751 0.976918 0.559201 0.333243 0.979084 0.551897 0.354261 0.976438 0.555928 0.37815 0.981373 0.554484 0.403503 0.979735 0.559075 0.42646 0.978352 0.557091 0.454925 0.981059 0.554742 0.483332 0.984679 0.582617 0.00176231 0.976857 0.579053 0.0261152 0.978215 0.583412 0.0566859 0.984646 0.575972 0.0839736 0.98261 0.577769 0.102285 0.978672 0.579254 0.134306 0.976639 0.580998 0.156681 0.980274 0.5751 0.175371 0.982412 0.584998 0.209936 0.982193 0.580364 0.233157 0.980536 0.57528 0.256626 0.981074 0.58263 0.277173 0.980229 0.579418 0.301523 0.983673 0.584728 0.325491 0.979888 0.577921 0.35107 0.979132 0.575642 0.379681 0.975488 0.581173 0.403054 0.97786 0.579321 0.430384 0.978587 0.584776 0.453891 0.978362 0.583562 0.482784 0.975751 0.600277 0.00577217 0.976395 0.600452 0.0275448 0.982192 0.607341 0.0559161 0.979997 0.601207 0.0828241 0.98084 0.600119 0.109944 0.982519 0.605272 0.134367 0.980602 0.607303 0.157457 0.976851 0.607952 0.184112 0.980785 0.603158 0.20259 0.984033 0.60667 0.232416 0.979069 0.604482 0.252436 0.978519 0.60795 0.281289 0.978927 0.607817 0.302999 0.980139 0.606117 0.325346 0.981751 0.602131 0.354139 0.981314 0.600229 0.380598 0.984044 0.604134 0.407459 0.981365 0.601369 0.427676 0.977346 0.604785 0.450065 0.97892 0.605212 0.483353 0.980156 0.634979 0.00783256 0.97987 0.630006 0.0262975 0.978714 0.629012 0.0555977 0.978007 0.632924 0.0837959 0.981551 0.625156 0.101498 0.98194 0.625678 0.132351 0.976686 0.627041 0.154052 0.975803 0.628656 0.177967 0.982303 0.63374 0.208141 0.976159 0.631153 0.226424 0.979575 0.629644 0.256979 0.977822 0.625947 0.276503 0.983123 0.634463 0.300697 0.982185 0.633133 0.331648 0.982921 0.634222 0.3514 0.975426 0.629859 0.375201 0.984731 0.629472 0.408514 0.98307 0.630019 0.426873 0.980409 0.625194 0.454999 0.977081 0.632253 0.484889 0.982284 0.655898 0.00392904 0.982247 0.659836 0.0308871 0.975103 0.658701 0.051364 0.979285 0.655171 0.0805692 0.982804 0.655252 0.103738 0.97728 0.650316 0.131698 0.976579 0.651666 0.152465 0.984108 0.654773 0.176796 0.980454 0.653762 0.202655 0.980766 0.658274 0.225862 0.982159 0.659673 0.256949 0.978695 0.656336 0.276835 0.978235 0.658747 0.30116 0.983134 0.657082 0.328279 0.980538 0.659027 0.350098 0.977344 0.656568 0.381103 0.979678 0.651371 0.408084 0.977743 0.657989 0.434811 0.981175 0.650086 0.453877 0.980928 0.652319 0.481587 0.978076 0.679523 0.00290217 0.98046 0.676654 0.0285441 0.978921 0.682475 0.0551043 0.979274 0.680419 0.0831917 0.98126 0.678893 0.101625 0.979915 0.681458 0.125982 0.977647 0.678439 0.153112 0.975136 0.675888 0.177014 0.976788 0.678924 0.207082 0.981695 0.680561 0.22536 0.979894 0.67521 0.259175 0.97991 0.675534 0.280195 0.980449 0.679398 0.301694 0.976859 0.683299 0.334547 0.97858 0.677152 0.352384 0.980035 0.679805 0.379879 0.982165 0.679745 0.4018 0.979048 0.676269 0.427498 0.97708 0.676422 0.456542 0.983967 0.682684 0.476704 0.979782 0.706407 0.0043531 0.983224 0.700475 0.0333748 0.982007 0.709105 0.0512061 0.984892 0.700945 0.0846903 0.976982 0.708983 0.102406 0.975124 0.708317 0.131462 0.978941 0.70607 0.155347 0.977203 0.704929 0.177128 0.975861 0.701404 0.206875 0.983119 0.700322 0.233762 0.98139 0.707236 0.252572 0.980966 0.706375 0.281548 0.983971 0.703863 0.301517 0.981522 0.703657 0.329396 0.982204 0.709244 0.35289 0.979692 0.709078 0.384797 0.976186 0.701018 0.402148 0.976773 0.70712 0.434863 0.980449 0.703781 0.452949 0.981981 0.708236 0.481978 0.982178 0.734274 0.00239792 0.979469 0.729984 0.0290183 0.984889 0.732637 0.057331 0.976967 0.728276 0.0802463 0.984192 0.730668 0.107773 0.977082 0.726483 0.134058 0.98324 0.725959 0.150271 0.979718 0.73437 0.181445 0.977866 0.733583 0.209664 0.984528 0.7255 0.234361 0.978567 0.73377 0.255098 0.984184 0.72847 0.281934 0.98186 0.73452 0.306942 0.984613 0.730113 0.334962 0.975748 0.733449 0.357412 0.984121 0.728837 0.375941 0.982978 0.729554 0.406749 0.983825 0.727906 0.43469 0.980791 0.725174 0.454644 0.983481 0.726099 0.481848 CELL_DATA 21489 SCALARS scalars double LOOKUP_TABLE default 1 0.975 0.95 0.925 0.9 0.875 0.85 0.825 0.8 0.775 0.75 0.725 0.7 0.675 0.65 0.625 0.6 0.575 0.55 0.975 0.964645 0.944098 0.920943 0.896922 0.872525 0.847931 0.823223 0.798444 0.773615 0.748753 0.723866 0.69896 0.67404 0.649108 0.624168 0.59922 0.574265 0.549306 0.95 0.944098 0.929289 0.909861 0.888197 0.865371 0.841886 0.817997 0.793845 0.769511 0.745049 0.720492 0.695862 0.671176 0.646447 0.621681 0.596887 0.572069 0.547231 0.925 0.920943 0.909861 0.893934 0.875 0.854226 0.832295 0.809606 0.7864 0.762829 0.738992 0.714956 0.690767 0.666458 0.642054 0.617574 0.593029 0.568433 0.543793 0.9 0.896922 0.888197 0.875 0.858579 0.839922 0.819722 0.798444 0.776393 0.753779 0.730742 0.707383 0.683772 0.659963 0.635995 0.611896 0.587689 0.563394 0.539023 0.875 0.872525 0.865371 0.854226 0.839922 0.823223 0.804744 0.784942 0.76415 0.742609 0.720492 0.697924 0.675 0.65179 0.628348 0.604715 0.580924 0.556999 0.532961 0.85 0.847931 0.841886 0.832295 0.819722 0.804744 0.787868 0.769511 0.75 0.729584 0.708452 0.686751 0.66459 0.642054 0.619211 0.596113 0.5728 0.549306 0.525658 0.825 0.823223 0.817997 0.809606 0.798444 0.784942 0.769511 0.752513 0.734246 0.714956 0.694836 0.67404 0.652689 0.630879 0.608688 0.586176 0.563394 0.540381 0.51717 0.8 0.798444 0.793845 0.7864 0.776393 0.76415 0.75 0.734246 0.717157 0.69896 0.679844 0.659963 0.639445 0.618392 0.596887 0.575 0.552786 0.530293 0.507557 0.775 0.773615 0.769511 0.762829 0.753779 0.742609 0.729584 0.714956 0.69896 0.681802 0.663659 0.644683 0.625 0.604715 0.583917 0.562679 0.541061 0.519115 0.496885 0.75 0.748753 0.745049 0.738992 0.730742 0.720492 0.708452 0.694836 0.679844 0.663659 0.646447 0.628348 0.609488 0.58997 0.569884 0.549306 0.528301 0.506923 0.485218 0.725 0.723866 0.720492 0.714956 0.707383 0.697924 0.686751 0.67404 0.659963 0.644683 0.628348 0.611091 0.593029 0.574265 0.554888 0.534973 0.514588 0.493789 0.472624 0.7 0.69896 0.695862 0.690767 0.683772 0.675 0.66459 0.652689 0.639445 0.625 0.609488 0.593029 0.575736 0.557705 0.539023 0.519766 0.5 0.479784 0.459167 0.675 0.67404 0.671176 0.666458 0.659963 0.65179 0.642054 0.630879 0.618392 0.604715 0.58997 0.574265 0.557705 0.540381 0.522376 0.503764 0.484612 0.464977 0.44491 0.65 0.649108 0.646447 0.642054 0.635995 0.628348 0.619211 0.608688 0.596887 0.583917 0.569884 0.554888 0.539023 0.522376 0.505025 0.487043 0.468493 0.449432 0.429912 0.625 0.624168 0.621681 0.617574 0.611896 0.604715 0.596113 0.586176 0.575 0.562679 0.549306 0.534973 0.519766 0.503764 0.487043 0.46967 0.451707 0.433211 0.414231 0.6 0.59922 0.596887 0.593029 0.587689 0.580924 0.5728 0.563394 0.552786 0.541061 0.528301 0.514588 0.5 0.484612 0.468493 0.451707 0.434315 0.416369 0.39792 0.575 0.574265 0.572069 0.568433 0.563394 0.556999 0.549306 0.540381 0.530293 0.519115 0.506923 0.493789 0.479784 0.464977 0.449432 0.433211 0.416369 0.398959 0.381029 0.55 0.549306 0.547231 0.543793 0.539023 0.532961 0.525658 0.51717 0.507557 0.496885 0.485218 0.472624 0.459167 0.44491 0.429912 0.414231 0.39792 0.381029 0.363604 0.525 0.524343 0.522376 0.519115 0.514588 0.508828 0.501879 0.493789 0.484612 0.474405 0.463227 0.451138 0.438195 0.424457 0.409979 0.394814 0.379013 0.362623 0.345687 0.5 0.499375 0.497506 0.494406 0.490098 0.484612 0.477985 0.470259 0.461484 0.451707 0.440983 0.429364 0.416905 0.403657 0.389672 0.375 0.359688 0.34378 0.327319 0.475 0.474405 0.472624 0.46967 0.465561 0.460324 0.453992 0.446601 0.438195 0.428817 0.418515 0.407337 0.395331 0.382546 0.369029 0.354826 0.339981 0.324537 0.308534 0.45 0.449432 0.447732 0.44491 0.440983 0.435974 0.429912 0.42283 0.414765 0.405757 0.395848 0.385081 0.373502 0.361153 0.34808 0.334324 0.319926 0.304928 0.289366 0.425 0.424457 0.42283 0.420129 0.416369 0.41157 0.405757 0.398959 0.39121 0.382546 0.373003 0.362623 0.351444 0.339508 0.326854 0.313523 0.299554 0.284983 0.269846 0.4 0.399479 0.39792 0.395331 0.391724 0.387117 0.381534 0.375 0.367544 0.3592 0.35 0.339981 0.32918 0.317633 0.305378 0.292451 0.27889 0.264728 0.25 0.375 0.3745 0.373003 0.370516 0.367051 0.362623 0.357252 0.350962 0.34378 0.335733 0.326854 0.317175 0.306729 0.29555 0.283673 0.271131 0.257959 0.244189 0.229854 0.35 0.349519 0.34808 0.345687 0.342353 0.33809 0.332917 0.326854 0.319926 0.312159 0.303581 0.29422 0.284109 0.273278 0.261759 0.249583 0.236783 0.223389 0.209431 0.325 0.324537 0.323151 0.320846 0.317633 0.313523 0.308534 0.302684 0.295994 0.288488 0.280191 0.271131 0.261336 0.250834 0.239655 0.227828 0.215382 0.202347 0.188751 0.3 0.299554 0.298217 0.295994 0.292893 0.288927 0.284109 0.278457 0.271989 0.264728 0.256697 0.24792 0.238423 0.228233 0.217376 0.205881 0.193774 0.181083 0.167834 0.975 0.964645 0.944098 0.920943 0.896922 0.872525 0.847931 0.823223 0.798444 0.773615 0.748753 0.723866 0.69896 0.67404 0.649108 0.624168 0.59922 0.574265 0.549306 0.964645 0.956699 0.938763 0.917084 0.893934 0.870096 0.84589 0.821464 0.796899 0.772239 0.747512 0.722737 0.697924 0.673083 0.648219 0.623337 0.598441 0.573532 0.548613 0.944098 0.938763 0.925 0.906459 0.885436 0.863069 0.839922 0.816288 0.792334 0.76816 0.743826 0.719376 0.694836 0.670227 0.645564 0.620856 0.596113 0.571339 0.546541 0.920943 0.917084 0.906459 0.891028 0.872525 0.852098 0.830442 0.807971 0.784942 0.761515 0.737798 0.713862 0.689758 0.665523 0.641182 0.616757 0.592262 0.56771 0.543108 0.896922 0.893934 0.885436 0.872525 0.856386 0.837981 0.817997 0.796899 0.775 0.752513 0.729584 0.706316 0.682786 0.659045 0.635137 0.611091 0.586932 0.562679 0.538345 0.872525 0.870096 0.863069 0.852098 0.837981 0.821464 0.80315 0.783494 0.762829 0.741398 0.719376 0.696891 0.67404 0.650894 0.627508 0.603926 0.580179 0.556294 0.532293 0.847931 0.84589 0.839922 0.830442 0.817997 0.80315 0.7864 0.76816 0.748753 0.72843 0.707383 0.685755 0.663659 0.641182 0.618392 0.59534 0.572069 0.548613 0.525 0.823223 0.821464 0.816288 0.807971 0.796899 0.783494 0.76816 0.751253 0.733073 0.713862 0.693814 0.673083 0.65179 0.630034 0.60789 0.585422 0.562679 0.539701 0.516523 0.798444 0.796899 0.792334 0.784942 0.775 0.762829 0.748753 0.733073 0.716055 0.697924 0.678869 0.659045 0.638579 0.617574 0.596113 0.574265 0.552088 0.529628 0.506923 0.773615 0.772239 0.76816 0.761515 0.752513 0.741398 0.72843 0.713862 0.697924 0.680821 0.662732 0.643805 0.624168 0.603926 0.583167 0.561965 0.540381 0.518466 0.496264 0.748753 0.747512 0.743826 0.737798 0.729584 0.719376 0.707383 0.693814 0.678869 0.662732 0.645564 0.627508 0.608688 0.589208 0.569158 0.548613 0.527639 0.50629 0.484612 0.723866 0.722737 0.719376 0.713862 0.706316 0.696891 0.685755 0.673083 0.659045 0.643805 0.627508 0.610289 0.592262 0.573532 0.554186 0.534302 0.513944 0.493172 0.472032 0.69896 0.697924 0.694836 0.689758 0.682786 0.67404 0.663659 0.65179 0.638579 0.624168 0.608688 0.592262 0.575 0.556999 0.538345 0.519115 0.499375 0.479183 0.45859 0.67404 0.673083 0.670227 0.665523 0.659045 0.650894 0.641182 0.630034 0.617574 0.603926 0.589208 0.573532 0.556999 0.539701 0.521722 0.503135 0.484006 0.464393 0.444347 0.649108 0.648219 0.645564 0.641182 0.635137 0.627508 0.618392 0.60789 0.596113 0.583167 0.569158 0.554186 0.538345 0.521722 0.504394 0.486434 0.467905 0.448865 0.429364 0.624168 0.623337 0.620856 0.616757 0.611091 0.603926 0.59534 0.585422 0.574265 0.561965 0.548613 0.534302 0.519115 0.503135 0.486434 0.469081 0.451138 0.43266 0.413698 0.59922 0.598441 0.596113 0.592262 0.586932 0.580179 0.572069 0.562679 0.552088 0.540381 0.527639 0.513944 0.499375 0.484006 0.467905 0.451138 0.433762 0.415834 0.397401 0.574265 0.573532 0.571339 0.56771 0.562679 0.556294 0.548613 0.539701 0.529628 0.518466 0.50629 0.493172 0.479183 0.464393 0.448865 0.43266 0.415834 0.39844 0.380524 0.549306 0.548613 0.546541 0.543108 0.538345 0.532293 0.525 0.516523 0.506923 0.496264 0.484612 0.472032 0.45859 0.444347 0.429364 0.413698 0.397401 0.380524 0.363113 0.524343 0.523686 0.521722 0.518466 0.513944 0.508192 0.501252 0.493172 0.484006 0.473811 0.462645 0.450568 0.437639 0.423914 0.409449 0.394298 0.37851 0.362132 0.34521 0.499375 0.498752 0.496885 0.493789 0.489486 0.484006 0.477386 0.46967 0.460904 0.451138 0.440424 0.428817 0.416369 0.403133 0.38916 0.3745 0.3592 0.343304 0.326854 0.474405 0.473811 0.472032 0.469081 0.464977 0.459745 0.45342 0.446037 0.437639 0.42827 0.417978 0.406809 0.394814 0.38204 0.368533 0.354341 0.339508 0.324075 0.308082 0.449432 0.448865 0.447166 0.444347 0.440424 0.435421 0.429364 0.422289 0.414231 0.405231 0.395331 0.384573 0.373003 0.360664 0.347601 0.333854 0.319467 0.304479 0.288927 0.424457 0.423914 0.422289 0.419591 0.415834 0.411039 0.405231 0.39844 0.390697 0.38204 0.372505 0.362132 0.350962 0.339035 0.32639 0.313068 0.299108 0.284546 0.269418 0.399479 0.398959 0.397401 0.394814 0.39121 0.386608 0.381029 0.3745 0.367051 0.358712 0.349519 0.339508 0.328714 0.317175 0.304928 0.29201 0.278457 0.264303 0.249583 0.3745 0.374001 0.372505 0.37002 0.366557 0.362132 0.356766 0.350481 0.343304 0.335263 0.32639 0.316717 0.306278 0.295106 0.283236 0.270702 0.257538 0.243776 0.229448 0.349519 0.349039 0.347601 0.34521 0.341878 0.337618 0.332449 0.32639 0.319467 0.311705 0.303132 0.293778 0.283673 0.272848 0.261336 0.249167 0.236374 0.222986 0.209035 0.324537 0.324075 0.322689 0.320386 0.317175 0.313068 0.308082 0.302236 0.29555 0.288048 0.279757 0.270702 0.260913 0.250417 0.239244 0.227423 0.214984 0.201956 0.188366 0.299554 0.299108 0.297771 0.29555 0.292451 0.288488 0.283673 0.278024 0.27156 0.264303 0.256276 0.247504 0.238012 0.227828 0.216977 0.205488 0.193387 0.180702 0.167459 0.95 0.944098 0.929289 0.909861 0.888197 0.865371 0.841886 0.817997 0.793845 0.769511 0.745049 0.720492 0.695862 0.671176 0.646447 0.621681 0.596887 0.572069 0.547231 0.944098 0.938763 0.925 0.906459 0.885436 0.863069 0.839922 0.816288 0.792334 0.76816 0.743826 0.719376 0.694836 0.670227 0.645564 0.620856 0.596113 0.571339 0.546541 0.929289 0.925 0.913397 0.896922 0.877526 0.856386 0.834169 0.811254 0.787868 0.76415 0.740192 0.716055 0.691779 0.667397 0.642929 0.618392 0.593798 0.569158 0.544478 0.909861 0.906459 0.896922 0.88274 0.865371 0.84589 0.825 0.80315 0.780626 0.757616 0.734246 0.710604 0.686751 0.662732 0.638579 0.614319 0.58997 0.565546 0.541061 0.888197 0.885436 0.877526 0.865371 0.85 0.832295 0.812917 0.792334 0.770871 0.748753 0.726139 0.703141 0.679844 0.656307 0.632577 0.608688 0.584669 0.56054 0.536319 0.865371 0.863069 0.856386 0.84589 0.832295 0.816288 0.798444 0.779206 0.758909 0.737798 0.716055 0.693814 0.671176 0.648219 0.625 0.601566 0.577951 0.554186 0.530293 0.841886 0.839922 0.834169 0.825 0.812917 0.798444 0.782055 0.76415 0.745049 0.725 0.704196 0.682786 0.660884 0.638579 0.615943 0.593029 0.569884 0.546541 0.52303 0.817997 0.816288 0.811254 0.80315 0.792334 0.779206 0.76415 0.747512 0.729584 0.710604 0.690767 0.670227 0.649108 0.627508 0.605507 0.583167 0.56054 0.537669 0.514588 0.793845 0.792334 0.787868 0.780626 0.770871 0.758909 0.745049 0.729584 0.712772 0.694836 0.675963 0.656307 0.635995 0.61513 0.593798 0.572069 0.55 0.527639 0.505025 0.769511 0.76816 0.76415 0.757616 0.748753 0.737798 0.725 0.710604 0.694836 0.677898 0.659963 0.641182 0.621681 0.601566 0.580924 0.55983 0.538345 0.516523 0.494406 0.745049 0.743826 0.740192 0.734246 0.726139 0.716055 0.704196 0.690767 0.675963 0.659963 0.642929 0.625 0.6063 0.586932 0.566987 0.546541 0.525658 0.504394 0.482796 0.720492 0.719376 0.716055 0.710604 0.703141 0.693814 0.682786 0.670227 0.656307 0.641182 0.625 0.60789 0.58997 0.571339 0.552088 0.532293 0.512019 0.491325 0.470259 0.695862 0.694836 0.691779 0.686751 0.679844 0.671176 0.660884 0.649108 0.635995 0.621681 0.6063 0.58997 0.5728 0.554888 0.536319 0.51717 0.497506 0.477386 0.456861 0.671176 0.670227 0.667397 0.662732 0.656307 0.648219 0.638579 0.627508 0.61513 0.601566 0.586932 0.571339 0.554888 0.537669 0.519766 0.501252 0.482192 0.462645 0.442663 0.646447 0.645564 0.642929 0.638579 0.632577 0.625 0.615943 0.605507 0.593798 0.580924 0.566987 0.552088 0.536319 0.519766 0.502506 0.484612 0.466146 0.447166 0.427724 0.621681 0.620856 0.618392 0.614319 0.608688 0.601566 0.593029 0.583167 0.572069 0.55983 0.546541 0.532293 0.51717 0.501252 0.484612 0.467318 0.449432 0.43101 0.412101 0.596887 0.596113 0.593798 0.58997 0.584669 0.577951 0.569884 0.56054 0.55 0.538345 0.525658 0.512019 0.497506 0.482192 0.466146 0.449432 0.432109 0.414231 0.395848 0.572069 0.571339 0.569158 0.565546 0.56054 0.554186 0.546541 0.537669 0.527639 0.516523 0.504394 0.491325 0.477386 0.462645 0.447166 0.43101 0.414231 0.396883 0.379013 0.547231 0.546541 0.544478 0.541061 0.536319 0.530293 0.52303 0.514588 0.505025 0.494406 0.482796 0.470259 0.456861 0.442663 0.427724 0.412101 0.395848 0.379013 0.361643 0.522376 0.521722 0.519766 0.516523 0.512019 0.50629 0.499375 0.491325 0.482192 0.472032 0.460904 0.448865 0.435974 0.422289 0.407864 0.392752 0.377003 0.360664 0.34378 0.497506 0.496885 0.495025 0.49194 0.487652 0.482192 0.475596 0.467905 0.459167 0.449432 0.438751 0.427178 0.414765 0.401565 0.387628 0.373003 0.357738 0.341878 0.325463 0.472624 0.472032 0.470259 0.467318 0.463227 0.458013 0.451707 0.444347 0.435974 0.426633 0.416369 0.405231 0.393267 0.380524 0.367051 0.352891 0.33809 0.322689 0.306729 0.447732 0.447166 0.445473 0.442663 0.438751 0.433762 0.427724 0.420668 0.412633 0.403657 0.393782 0.383052 0.37151 0.3592 0.346165 0.332449 0.318091 0.303132 0.28761 0.42283 0.422289 0.420668 0.417978 0.414231 0.409449 0.403657 0.396883 0.38916 0.380524 0.371013 0.360664 0.349519 0.337618 0.325 0.311705 0.297771 0.283236 0.268136 0.39792 0.397401 0.395848 0.393267 0.389672 0.385081 0.379516 0.373003 0.365571 0.357252 0.34808 0.33809 0.327319 0.315803 0.303581 0.290687 0.277158 0.26303 0.248335 0.373003 0.372505 0.371013 0.368533 0.365079 0.360664 0.35531 0.349039 0.341878 0.333854 0.325 0.315347 0.304928 0.293778 0.28193 0.269418 0.256276 0.242537 0.228233 0.34808 0.347601 0.346165 0.34378 0.340455 0.336204 0.331046 0.325 0.318091 0.310344 0.301788 0.292451 0.282365 0.27156 0.260068 0.24792 0.235147 0.221781 0.207851 0.323151 0.322689 0.321306 0.319008 0.315803 0.311705 0.306729 0.300893 0.29422 0.286733 0.278457 0.269418 0.259645 0.249167 0.238012 0.226211 0.213791 0.200782 0.187212 0.298217 0.297771 0.296438 0.29422 0.291128 0.287171 0.282365 0.276726 0.270274 0.26303 0.255017 0.246259 0.236783 0.226615 0.215781 0.204308 0.192225 0.179558 0.166333 0.925 0.920943 0.909861 0.893934 0.875 0.854226 0.832295 0.809606 0.7864 0.762829 0.738992 0.714956 0.690767 0.666458 0.642054 0.617574 0.593029 0.568433 0.543793 0.920943 0.917084 0.906459 0.891028 0.872525 0.852098 0.830442 0.807971 0.784942 0.761515 0.737798 0.713862 0.689758 0.665523 0.641182 0.616757 0.592262 0.56771 0.543108 0.909861 0.906459 0.896922 0.88274 0.865371 0.84589 0.825 0.80315 0.780626 0.757616 0.734246 0.710604 0.686751 0.662732 0.638579 0.614319 0.58997 0.565546 0.541061 0.893934 0.891028 0.88274 0.870096 0.854226 0.836064 0.816288 0.795366 0.773615 0.751253 0.72843 0.705254 0.681802 0.65813 0.634282 0.610289 0.586176 0.561965 0.537669 0.875 0.872525 0.865371 0.854226 0.839922 0.823223 0.804744 0.784942 0.76415 0.742609 0.720492 0.697924 0.675 0.65179 0.628348 0.604715 0.580924 0.556999 0.532961 0.854226 0.852098 0.84589 0.836064 0.823223 0.807971 0.790835 0.772239 0.752513 0.731905 0.710604 0.688753 0.666458 0.643805 0.620856 0.597663 0.574265 0.550695 0.526978 0.832295 0.830442 0.825 0.816288 0.804744 0.790835 0.775 0.757616 0.738992 0.719376 0.69896 0.677898 0.656307 0.634282 0.611896 0.589208 0.566266 0.543108 0.519766 0.809606 0.807971 0.80315 0.795366 0.784942 0.772239 0.757616 0.741398 0.723866 0.705254 0.685755 0.665523 0.644683 0.623337 0.601566 0.579435 0.556999 0.534302 0.511379 0.7864 0.784942 0.780626 0.773615 0.76415 0.752513 0.738992 0.723866 0.707383 0.689758 0.671176 0.65179 0.631727 0.611091 0.58997 0.568433 0.546541 0.524343 0.501879 0.762829 0.761515 0.757616 0.751253 0.742609 0.731905 0.719376 0.705254 0.689758 0.673083 0.655399 0.636854 0.617574 0.597663 0.577212 0.556294 0.534973 0.513302 0.491325 0.738992 0.737798 0.734246 0.72843 0.720492 0.710604 0.69896 0.685755 0.671176 0.655399 0.638579 0.620856 0.602351 0.583167 0.563394 0.543108 0.522376 0.501252 0.479784 0.714956 0.713862 0.710604 0.705254 0.697924 0.688753 0.677898 0.665523 0.65179 0.636854 0.620856 0.603926 0.586176 0.56771 0.548613 0.528964 0.508828 0.488263 0.467318 0.690767 0.689758 0.686751 0.681802 0.675 0.666458 0.656307 0.644683 0.631727 0.617574 0.602351 0.586176 0.569158 0.551391 0.532961 0.513944 0.494406 0.474405 0.453992 0.666458 0.665523 0.662732 0.65813 0.65179 0.643805 0.634282 0.623337 0.611091 0.597663 0.583167 0.56771 0.551391 0.534302 0.516523 0.498129 0.479183 0.459745 0.439866 0.642054 0.641182 0.638579 0.634282 0.628348 0.620856 0.611896 0.601566 0.58997 0.577212 0.563394 0.548613 0.532961 0.516523 0.499375 0.481589 0.463227 0.444347 0.425 0.617574 0.616757 0.614319 0.610289 0.604715 0.597663 0.589208 0.579435 0.568433 0.556294 0.543108 0.528964 0.513944 0.498129 0.481589 0.464393 0.446601 0.42827 0.409449 0.593029 0.592262 0.58997 0.586176 0.580924 0.574265 0.566266 0.556999 0.546541 0.534973 0.522376 0.508828 0.494406 0.479183 0.463227 0.446601 0.429364 0.41157 0.393267 0.568433 0.56771 0.565546 0.561965 0.556999 0.550695 0.543108 0.534302 0.524343 0.513302 0.501252 0.488263 0.474405 0.459745 0.444347 0.42827 0.41157 0.394298 0.376502 0.543793 0.543108 0.541061 0.537669 0.532961 0.526978 0.519766 0.511379 0.501879 0.491325 0.479784 0.467318 0.453992 0.439866 0.425 0.409449 0.393267 0.376502 0.3592 0.519115 0.518466 0.516523 0.513302 0.508828 0.503135 0.496264 0.488263 0.479183 0.469081 0.458013 0.446037 0.433211 0.419591 0.405231 0.390184 0.3745 0.358225 0.341403 0.494406 0.493789 0.49194 0.488874 0.484612 0.479183 0.472624 0.464977 0.456286 0.446601 0.435974 0.424457 0.412101 0.398959 0.385081 0.370516 0.35531 0.339508 0.323151 0.46967 0.469081 0.467318 0.464393 0.460324 0.455138 0.448865 0.441542 0.433211 0.423914 0.413698 0.40261 0.390697 0.378007 0.364587 0.350481 0.335733 0.320386 0.304479 0.44491 0.444347 0.442663 0.439866 0.435974 0.43101 0.425 0.417978 0.409979 0.401043 0.39121 0.380524 0.369029 0.356766 0.34378 0.330112 0.315803 0.300893 0.28542 0.420129 0.419591 0.417978 0.415299 0.41157 0.406809 0.401043 0.394298 0.386608 0.378007 0.368533 0.358225 0.347122 0.335263 0.322689 0.309439 0.29555 0.28106 0.266004 0.395331 0.394814 0.393267 0.390697 0.387117 0.382546 0.377003 0.370516 0.363113 0.354826 0.345687 0.335733 0.325 0.313523 0.301341 0.288488 0.275 0.260913 0.246259 0.370516 0.37002 0.368533 0.366064 0.362623 0.358225 0.352891 0.346643 0.339508 0.331513 0.322689 0.313068 0.302684 0.291569 0.279757 0.267282 0.254178 0.240477 0.226211 0.345687 0.34521 0.34378 0.341403 0.33809 0.333854 0.328714 0.322689 0.315803 0.308082 0.299554 0.290247 0.280191 0.269418 0.257959 0.245845 0.233107 0.219776 0.205881 0.320846 0.320386 0.319008 0.316717 0.313523 0.309439 0.304479 0.298662 0.29201 0.284546 0.276294 0.267282 0.257538 0.247089 0.235965 0.224194 0.211806 0.198829 0.185291 0.295994 0.29555 0.29422 0.29201 0.288927 0.284983 0.280191 0.274569 0.268136 0.260913 0.252922 0.244189 0.234739 0.224597 0.213791 0.202347 0.190293 0.177656 0.164461 0.9 0.896922 0.888197 0.875 0.858579 0.839922 0.819722 0.798444 0.776393 0.753779 0.730742 0.707383 0.683772 0.659963 0.635995 0.611896 0.587689 0.563394 0.539023 0.896922 0.893934 0.885436 0.872525 0.856386 0.837981 0.817997 0.796899 0.775 0.752513 0.729584 0.706316 0.682786 0.659045 0.635137 0.611091 0.586932 0.562679 0.538345 0.888197 0.885436 0.877526 0.865371 0.85 0.832295 0.812917 0.792334 0.770871 0.748753 0.726139 0.703141 0.679844 0.656307 0.632577 0.608688 0.584669 0.56054 0.536319 0.875 0.872525 0.865371 0.854226 0.839922 0.823223 0.804744 0.784942 0.76415 0.742609 0.720492 0.697924 0.675 0.65179 0.628348 0.604715 0.580924 0.556999 0.532961 0.858579 0.856386 0.85 0.839922 0.826795 0.811254 0.793845 0.775 0.755051 0.734246 0.712772 0.690767 0.668338 0.645564 0.622508 0.59922 0.575736 0.552088 0.528301 0.839922 0.837981 0.832295 0.823223 0.811254 0.796899 0.780626 0.762829 0.743826 0.723866 0.703141 0.681802 0.659963 0.637716 0.61513 0.592262 0.569158 0.545852 0.522376 0.819722 0.817997 0.812917 0.804744 0.793845 0.780626 0.765479 0.748753 0.730742 0.711686 0.691779 0.671176 0.65 0.628348 0.6063 0.583917 0.561252 0.538345 0.515232 0.798444 0.796899 0.792334 0.784942 0.775 0.762829 0.748753 0.733073 0.716055 0.697924 0.678869 0.659045 0.638579 0.617574 0.596113 0.574265 0.552088 0.529628 0.506923 0.776393 0.775 0.770871 0.76415 0.755051 0.743826 0.730742 0.716055 0.7 0.682786 0.66459 0.645564 0.625834 0.605507 0.584669 0.563394 0.541742 0.519766 0.497506 0.753779 0.752513 0.748753 0.742609 0.734246 0.723866 0.711686 0.697924 0.682786 0.666458 0.649108 0.630879 0.611896 0.592262 0.572069 0.551391 0.530293 0.508828 0.487043 0.730742 0.729584 0.726139 0.720492 0.712772 0.703141 0.691779 0.678869 0.66459 0.649108 0.632577 0.61513 0.596887 0.577951 0.558412 0.538345 0.517817 0.496885 0.475596 0.707383 0.706316 0.703141 0.697924 0.690767 0.681802 0.671176 0.659045 0.645564 0.630879 0.61513 0.598441 0.580924 0.562679 0.543793 0.524343 0.504394 0.484006 0.463227 0.683772 0.682786 0.679844 0.675 0.668338 0.659963 0.65 0.638579 0.625834 0.611896 0.596887 0.580924 0.56411 0.546541 0.528301 0.509465 0.490098 0.470259 0.45 0.659963 0.659045 0.656307 0.65179 0.645564 0.637716 0.628348 0.617574 0.605507 0.592262 0.577951 0.562679 0.546541 0.529628 0.512019 0.493789 0.475 0.455711 0.435974 0.635995 0.635137 0.632577 0.628348 0.622508 0.61513 0.6063 0.596113 0.584669 0.572069 0.558412 0.543793 0.528301 0.512019 0.495025 0.477386 0.459167 0.440424 0.421208 0.611896 0.611091 0.608688 0.604715 0.59922 0.592262 0.583917 0.574265 0.563394 0.551391 0.538345 0.524343 0.509465 0.493789 0.477386 0.460324 0.442663 0.424457 0.405757 0.587689 0.586932 0.584669 0.580924 0.575736 0.569158 0.561252 0.552088 0.541742 0.530293 0.517817 0.504394 0.490098 0.475 0.459167 0.442663 0.425544 0.407864 0.389672 0.563394 0.562679 0.56054 0.556999 0.552088 0.545852 0.538345 0.529628 0.519766 0.508828 0.496885 0.484006 0.470259 0.455711 0.440424 0.424457 0.407864 0.390697 0.373003 0.539023 0.538345 0.536319 0.532961 0.528301 0.522376 0.515232 0.506923 0.497506 0.487043 0.475596 0.463227 0.45 0.435974 0.421208 0.405757 0.389672 0.373003 0.355795 0.514588 0.513944 0.512019 0.508828 0.504394 0.498752 0.49194 0.484006 0.475 0.464977 0.453992 0.442102 0.429364 0.415834 0.401565 0.386608 0.371013 0.354826 0.33809 0.490098 0.489486 0.487652 0.484612 0.480385 0.475 0.468493 0.460904 0.452277 0.442663 0.432109 0.420668 0.408392 0.395331 0.381534 0.367051 0.351926 0.336204 0.319926 0.465561 0.464977 0.463227 0.460324 0.456286 0.451138 0.44491 0.437639 0.429364 0.420129 0.409979 0.398959 0.387117 0.3745 0.361153 0.347122 0.332449 0.317175 0.301341 0.440983 0.440424 0.438751 0.435974 0.432109 0.427178 0.421208 0.414231 0.406283 0.397401 0.387628 0.377003 0.365571 0.353374 0.340455 0.326854 0.312614 0.297771 0.282365 0.416369 0.415834 0.414231 0.41157 0.407864 0.403133 0.397401 0.390697 0.383052 0.3745 0.365079 0.354826 0.34378 0.331981 0.319467 0.306278 0.292451 0.278024 0.26303 0.391724 0.39121 0.389672 0.387117 0.383559 0.379013 0.373502 0.367051 0.359688 0.351444 0.342353 0.332449 0.321767 0.310344 0.298217 0.28542 0.271989 0.257959 0.243363 0.367051 0.366557 0.365079 0.362623 0.3592 0.354826 0.349519 0.343304 0.336204 0.328249 0.319467 0.309891 0.299554 0.288488 0.276726 0.264303 0.251251 0.237602 0.223389 0.342353 0.341878 0.340455 0.33809 0.334793 0.330579 0.325463 0.319467 0.312614 0.304928 0.296438 0.287171 0.277158 0.26643 0.255017 0.24295 0.23026 0.216977 0.203131 0.317633 0.317175 0.315803 0.313523 0.310344 0.306278 0.301341 0.29555 0.288927 0.281495 0.273278 0.264303 0.254597 0.244189 0.233107 0.221379 0.209035 0.196103 0.182611 0.292893 0.292451 0.291128 0.288927 0.285857 0.28193 0.277158 0.27156 0.265153 0.257959 0.25 0.2413 0.231885 0.221781 0.211013 0.199609 0.187596 0.175 0.161847 0.875 0.872525 0.865371 0.854226 0.839922 0.823223 0.804744 0.784942 0.76415 0.742609 0.720492 0.697924 0.675 0.65179 0.628348 0.604715 0.580924 0.556999 0.532961 0.872525 0.870096 0.863069 0.852098 0.837981 0.821464 0.80315 0.783494 0.762829 0.741398 0.719376 0.696891 0.67404 0.650894 0.627508 0.603926 0.580179 0.556294 0.532293 0.865371 0.863069 0.856386 0.84589 0.832295 0.816288 0.798444 0.779206 0.758909 0.737798 0.716055 0.693814 0.671176 0.648219 0.625 0.601566 0.577951 0.554186 0.530293 0.854226 0.852098 0.84589 0.836064 0.823223 0.807971 0.790835 0.772239 0.752513 0.731905 0.710604 0.688753 0.666458 0.643805 0.620856 0.597663 0.574265 0.550695 0.526978 0.839922 0.837981 0.832295 0.823223 0.811254 0.796899 0.780626 0.762829 0.743826 0.723866 0.703141 0.681802 0.659963 0.637716 0.61513 0.592262 0.569158 0.545852 0.522376 0.823223 0.821464 0.816288 0.807971 0.796899 0.783494 0.76816 0.751253 0.733073 0.713862 0.693814 0.673083 0.65179 0.630034 0.60789 0.585422 0.562679 0.539701 0.516523 0.804744 0.80315 0.798444 0.790835 0.780626 0.76816 0.753779 0.737798 0.720492 0.702091 0.682786 0.662732 0.642054 0.620856 0.59922 0.577212 0.554888 0.532293 0.509465 0.784942 0.783494 0.779206 0.772239 0.762829 0.751253 0.737798 0.722737 0.706316 0.688753 0.670227 0.650894 0.630879 0.610289 0.589208 0.56771 0.545852 0.523686 0.501252 0.76415 0.762829 0.758909 0.752513 0.743826 0.733073 0.720492 0.706316 0.690767 0.67404 0.656307 0.637716 0.618392 0.598441 0.577951 0.556999 0.535646 0.513944 0.49194 0.742609 0.741398 0.737798 0.731905 0.723866 0.713862 0.702091 0.688753 0.67404 0.65813 0.641182 0.623337 0.604715 0.585422 0.565546 0.545165 0.524343 0.503135 0.481589 0.720492 0.719376 0.716055 0.710604 0.703141 0.693814 0.682786 0.670227 0.656307 0.641182 0.625 0.60789 0.58997 0.571339 0.552088 0.532293 0.512019 0.491325 0.470259 0.697924 0.696891 0.693814 0.688753 0.681802 0.673083 0.662732 0.650894 0.637716 0.623337 0.60789 0.591497 0.574265 0.556294 0.537669 0.518466 0.498752 0.478584 0.458013 0.675 0.67404 0.671176 0.666458 0.659963 0.65179 0.642054 0.630879 0.618392 0.604715 0.58997 0.574265 0.557705 0.540381 0.522376 0.503764 0.484612 0.464977 0.44491 0.65179 0.650894 0.648219 0.643805 0.637716 0.630034 0.620856 0.610289 0.598441 0.585422 0.571339 0.556294 0.540381 0.523686 0.50629 0.488263 0.46967 0.450568 0.43101 0.628348 0.627508 0.625 0.620856 0.61513 0.60789 0.59922 0.589208 0.577951 0.565546 0.552088 0.537669 0.522376 0.50629 0.489486 0.472032 0.453992 0.435421 0.416369 0.604715 0.603926 0.601566 0.597663 0.592262 0.585422 0.577212 0.56771 0.556999 0.545165 0.532293 0.518466 0.503764 0.488263 0.472032 0.455138 0.437639 0.419591 0.401043 0.580924 0.580179 0.577951 0.574265 0.569158 0.562679 0.554888 0.545852 0.535646 0.524343 0.512019 0.498752 0.484612 0.46967 0.453992 0.437639 0.420668 0.403133 0.385081 0.556999 0.556294 0.554186 0.550695 0.545852 0.539701 0.532293 0.523686 0.513944 0.503135 0.491325 0.478584 0.464977 0.450568 0.435421 0.419591 0.403133 0.386099 0.368533 0.532961 0.532293 0.530293 0.526978 0.522376 0.516523 0.509465 0.501252 0.49194 0.481589 0.470259 0.458013 0.44491 0.43101 0.416369 0.401043 0.385081 0.368533 0.351444 0.508828 0.508192 0.50629 0.503135 0.498752 0.493172 0.486434 0.478584 0.46967 0.459745 0.448865 0.437083 0.424457 0.411039 0.396883 0.38204 0.366557 0.350481 0.333854 0.484612 0.484006 0.482192 0.479183 0.475 0.46967 0.463227 0.455711 0.447166 0.437639 0.427178 0.415834 0.403657 0.390697 0.377003 0.362623 0.347601 0.331981 0.315803 0.460324 0.459745 0.458013 0.455138 0.451138 0.446037 0.439866 0.43266 0.424457 0.415299 0.405231 0.394298 0.382546 0.37002 0.356766 0.342828 0.328249 0.313068 0.297327 0.435974 0.435421 0.433762 0.43101 0.427178 0.422289 0.416369 0.409449 0.401565 0.392752 0.383052 0.372505 0.361153 0.349039 0.336204 0.322689 0.308534 0.293778 0.278457 0.41157 0.411039 0.409449 0.406809 0.403133 0.39844 0.392752 0.386099 0.37851 0.37002 0.360664 0.350481 0.339508 0.327784 0.315347 0.302236 0.288488 0.274138 0.259223 0.387117 0.386608 0.385081 0.382546 0.379013 0.3745 0.369029 0.362623 0.35531 0.347122 0.33809 0.328249 0.317633 0.306278 0.29422 0.281495 0.268136 0.254178 0.239655 0.362623 0.362132 0.360664 0.358225 0.354826 0.350481 0.34521 0.339035 0.331981 0.324075 0.315347 0.305828 0.29555 0.284546 0.272848 0.26049 0.247504 0.233922 0.219776 0.33809 0.337618 0.336204 0.333854 0.330579 0.32639 0.321306 0.315347 0.308534 0.300893 0.292451 0.283236 0.273278 0.262606 0.251251 0.239244 0.226615 0.213393 0.199609 0.313523 0.313068 0.311705 0.309439 0.306278 0.302236 0.297327 0.291569 0.284983 0.277591 0.269418 0.26049 0.250834 0.240477 0.229448 0.217776 0.205488 0.192612 0.179177 0.288927 0.288488 0.287171 0.284983 0.28193 0.278024 0.273278 0.267709 0.261336 0.254178 0.246259 0.237602 0.228233 0.218175 0.207457 0.196103 0.184142 0.171598 0.158498 0.85 0.847931 0.841886 0.832295 0.819722 0.804744 0.787868 0.769511 0.75 0.729584 0.708452 0.686751 0.66459 0.642054 0.619211 0.596113 0.5728 0.549306 0.525658 0.847931 0.84589 0.839922 0.830442 0.817997 0.80315 0.7864 0.76816 0.748753 0.72843 0.707383 0.685755 0.663659 0.641182 0.618392 0.59534 0.572069 0.548613 0.525 0.841886 0.839922 0.834169 0.825 0.812917 0.798444 0.782055 0.76415 0.745049 0.725 0.704196 0.682786 0.660884 0.638579 0.615943 0.593029 0.569884 0.546541 0.52303 0.832295 0.830442 0.825 0.816288 0.804744 0.790835 0.775 0.757616 0.738992 0.719376 0.69896 0.677898 0.656307 0.634282 0.611896 0.589208 0.566266 0.543108 0.519766 0.819722 0.817997 0.812917 0.804744 0.793845 0.780626 0.765479 0.748753 0.730742 0.711686 0.691779 0.671176 0.65 0.628348 0.6063 0.583917 0.561252 0.538345 0.515232 0.804744 0.80315 0.798444 0.790835 0.780626 0.76816 0.753779 0.737798 0.720492 0.702091 0.682786 0.662732 0.642054 0.620856 0.59922 0.577212 0.554888 0.532293 0.509465 0.787868 0.7864 0.782055 0.775 0.765479 0.753779 0.740192 0.725 0.708452 0.690767 0.672128 0.652689 0.632577 0.611896 0.590732 0.569158 0.547231 0.525 0.502506 0.769511 0.76816 0.76415 0.757616 0.748753 0.737798 0.725 0.710604 0.694836 0.677898 0.659963 0.641182 0.621681 0.601566 0.580924 0.55983 0.538345 0.516523 0.494406 0.75 0.748753 0.745049 0.738992 0.730742 0.720492 0.708452 0.694836 0.679844 0.663659 0.646447 0.628348 0.609488 0.58997 0.569884 0.549306 0.528301 0.506923 0.485218 0.729584 0.72843 0.725 0.719376 0.711686 0.702091 0.690767 0.677898 0.663659 0.648219 0.631727 0.614319 0.596113 0.577212 0.557705 0.537669 0.51717 0.496264 0.475 0.708452 0.707383 0.704196 0.69896 0.691779 0.682786 0.672128 0.659963 0.646447 0.631727 0.615943 0.59922 0.58167 0.563394 0.544478 0.525 0.505025 0.484612 0.46381 0.686751 0.685755 0.682786 0.677898 0.671176 0.662732 0.652689 0.641182 0.628348 0.614319 0.59922 0.583167 0.566266 0.548613 0.530293 0.511379 0.49194 0.472032 0.451707 0.66459 0.663659 0.660884 0.656307 0.65 0.642054 0.632577 0.621681 0.609488 0.596113 0.58167 0.566266 0.55 0.532961 0.515232 0.496885 0.477985 0.45859 0.438751 0.642054 0.641182 0.638579 0.634282 0.628348 0.620856 0.611896 0.601566 0.58997 0.577212 0.563394 0.548613 0.532961 0.516523 0.499375 0.481589 0.463227 0.444347 0.425 0.619211 0.618392 0.615943 0.611896 0.6063 0.59922 0.590732 0.580924 0.569884 0.557705 0.544478 0.530293 0.515232 0.499375 0.482796 0.465561 0.447732 0.429364 0.410509 0.596113 0.59534 0.593029 0.589208 0.583917 0.577212 0.569158 0.55983 0.549306 0.537669 0.525 0.511379 0.496885 0.481589 0.465561 0.448865 0.431559 0.413698 0.395331 0.5728 0.572069 0.569884 0.566266 0.561252 0.554888 0.547231 0.538345 0.528301 0.51717 0.505025 0.49194 0.477985 0.463227 0.447732 0.431559 0.414765 0.397401 0.379516 0.549306 0.548613 0.546541 0.543108 0.538345 0.532293 0.525 0.516523 0.506923 0.496264 0.484612 0.472032 0.45859 0.444347 0.429364 0.413698 0.397401 0.380524 0.363113 0.525658 0.525 0.52303 0.519766 0.515232 0.509465 0.502506 0.494406 0.485218 0.475 0.46381 0.451707 0.438751 0.425 0.410509 0.395331 0.379516 0.363113 0.346165 0.501879 0.501252 0.499375 0.496264 0.49194 0.486434 0.479784 0.472032 0.463227 0.45342 0.442663 0.43101 0.418515 0.405231 0.39121 0.376502 0.361153 0.34521 0.328714 0.477985 0.477386 0.475596 0.472624 0.468493 0.463227 0.456861 0.449432 0.440983 0.431559 0.421208 0.409979 0.39792 0.385081 0.37151 0.357252 0.342353 0.326854 0.310798 0.453992 0.45342 0.451707 0.448865 0.44491 0.439866 0.433762 0.426633 0.418515 0.409449 0.399479 0.388649 0.377003 0.364587 0.351444 0.337618 0.323151 0.308082 0.292451 0.429912 0.429364 0.427724 0.425 0.421208 0.416369 0.410509 0.403657 0.395848 0.387117 0.377505 0.367051 0.355795 0.34378 0.331046 0.317633 0.303581 0.288927 0.273708 0.405757 0.405231 0.403657 0.401043 0.397401 0.392752 0.387117 0.380524 0.373003 0.364587 0.35531 0.34521 0.334324 0.322689 0.310344 0.297327 0.283673 0.269418 0.254597 0.381534 0.381029 0.379516 0.377003 0.373502 0.369029 0.363604 0.357252 0.35 0.341878 0.332917 0.323151 0.312614 0.301341 0.289366 0.276726 0.263454 0.249583 0.235147 0.357252 0.356766 0.35531 0.352891 0.349519 0.34521 0.339981 0.333854 0.326854 0.319008 0.310344 0.300893 0.290687 0.279757 0.268136 0.255856 0.24295 0.229448 0.215382 0.332917 0.332449 0.331046 0.328714 0.325463 0.321306 0.31626 0.310344 0.303581 0.295994 0.28761 0.278457 0.268563 0.257959 0.246674 0.234739 0.222183 0.209035 0.195326 0.308534 0.308082 0.306729 0.304479 0.301341 0.297327 0.292451 0.286733 0.280191 0.272848 0.264728 0.255856 0.246259 0.235965 0.225 0.213393 0.201173 0.188366 0.175 0.284109 0.283673 0.282365 0.280191 0.277158 0.273278 0.268563 0.26303 0.256697 0.249583 0.241712 0.233107 0.223791 0.213791 0.203131 0.191839 0.179939 0.167459 0.154423 0.825 0.823223 0.817997 0.809606 0.798444 0.784942 0.769511 0.752513 0.734246 0.714956 0.694836 0.67404 0.652689 0.630879 0.608688 0.586176 0.563394 0.540381 0.51717 0.823223 0.821464 0.816288 0.807971 0.796899 0.783494 0.76816 0.751253 0.733073 0.713862 0.693814 0.673083 0.65179 0.630034 0.60789 0.585422 0.562679 0.539701 0.516523 0.817997 0.816288 0.811254 0.80315 0.792334 0.779206 0.76415 0.747512 0.729584 0.710604 0.690767 0.670227 0.649108 0.627508 0.605507 0.583167 0.56054 0.537669 0.514588 0.809606 0.807971 0.80315 0.795366 0.784942 0.772239 0.757616 0.741398 0.723866 0.705254 0.685755 0.665523 0.644683 0.623337 0.601566 0.579435 0.556999 0.534302 0.511379 0.798444 0.796899 0.792334 0.784942 0.775 0.762829 0.748753 0.733073 0.716055 0.697924 0.678869 0.659045 0.638579 0.617574 0.596113 0.574265 0.552088 0.529628 0.506923 0.784942 0.783494 0.779206 0.772239 0.762829 0.751253 0.737798 0.722737 0.706316 0.688753 0.670227 0.650894 0.630879 0.610289 0.589208 0.56771 0.545852 0.523686 0.501252 0.769511 0.76816 0.76415 0.757616 0.748753 0.737798 0.725 0.710604 0.694836 0.677898 0.659963 0.641182 0.621681 0.601566 0.580924 0.55983 0.538345 0.516523 0.494406 0.752513 0.751253 0.747512 0.741398 0.733073 0.722737 0.710604 0.696891 0.681802 0.665523 0.648219 0.630034 0.611091 0.591497 0.571339 0.550695 0.529628 0.508192 0.486434 0.734246 0.733073 0.729584 0.723866 0.716055 0.706316 0.694836 0.681802 0.667397 0.65179 0.635137 0.617574 0.59922 0.580179 0.56054 0.540381 0.519766 0.498752 0.477386 0.714956 0.713862 0.710604 0.705254 0.697924 0.688753 0.677898 0.665523 0.65179 0.636854 0.620856 0.603926 0.586176 0.56771 0.548613 0.528964 0.508828 0.488263 0.467318 0.694836 0.693814 0.690767 0.685755 0.678869 0.670227 0.659963 0.648219 0.635137 0.620856 0.605507 0.589208 0.572069 0.554186 0.535646 0.516523 0.496885 0.476789 0.456286 0.67404 0.673083 0.670227 0.665523 0.659045 0.650894 0.641182 0.630034 0.617574 0.603926 0.589208 0.573532 0.556999 0.539701 0.521722 0.503135 0.484006 0.464393 0.444347 0.652689 0.65179 0.649108 0.644683 0.638579 0.630879 0.621681 0.611091 0.59922 0.586176 0.572069 0.556999 0.541061 0.524343 0.506923 0.488874 0.470259 0.451138 0.431559 0.630879 0.630034 0.627508 0.623337 0.617574 0.610289 0.601566 0.591497 0.580179 0.56771 0.554186 0.539701 0.524343 0.508192 0.491325 0.473811 0.455711 0.437083 0.417978 0.608688 0.60789 0.605507 0.601566 0.596113 0.589208 0.580924 0.571339 0.56054 0.548613 0.535646 0.521722 0.506923 0.491325 0.475 0.458013 0.440424 0.422289 0.403657 0.586176 0.585422 0.583167 0.579435 0.574265 0.56771 0.55983 0.550695 0.540381 0.528964 0.516523 0.503135 0.488874 0.473811 0.458013 0.441542 0.424457 0.406809 0.388649 0.563394 0.562679 0.56054 0.556999 0.552088 0.545852 0.538345 0.529628 0.519766 0.508828 0.496885 0.484006 0.470259 0.455711 0.440424 0.424457 0.407864 0.390697 0.373003 0.540381 0.539701 0.537669 0.534302 0.529628 0.523686 0.516523 0.508192 0.498752 0.488263 0.476789 0.464393 0.451138 0.437083 0.422289 0.406809 0.390697 0.374001 0.356766 0.51717 0.516523 0.514588 0.511379 0.506923 0.501252 0.494406 0.486434 0.477386 0.467318 0.456286 0.444347 0.431559 0.417978 0.403657 0.388649 0.373003 0.356766 0.339981 0.493789 0.493172 0.491325 0.488263 0.484006 0.478584 0.472032 0.464393 0.455711 0.446037 0.435421 0.423914 0.41157 0.39844 0.384573 0.37002 0.354826 0.339035 0.322689 0.470259 0.46967 0.467905 0.464977 0.460904 0.455711 0.449432 0.442102 0.433762 0.424457 0.414231 0.403133 0.39121 0.37851 0.365079 0.350962 0.336204 0.320846 0.304928 0.446601 0.446037 0.444347 0.441542 0.437639 0.43266 0.426633 0.419591 0.41157 0.40261 0.392752 0.38204 0.370516 0.358225 0.34521 0.331513 0.317175 0.302236 0.286733 0.42283 0.422289 0.420668 0.417978 0.414231 0.409449 0.403657 0.396883 0.38916 0.380524 0.371013 0.360664 0.349519 0.337618 0.325 0.311705 0.297771 0.283236 0.268136 0.398959 0.39844 0.396883 0.394298 0.390697 0.386099 0.380524 0.374001 0.366557 0.358225 0.349039 0.339035 0.328249 0.316717 0.304479 0.291569 0.278024 0.263878 0.249167 0.375 0.3745 0.373003 0.370516 0.367051 0.362623 0.357252 0.350962 0.34378 0.335733 0.326854 0.317175 0.306729 0.29555 0.283673 0.271131 0.257959 0.244189 0.229854 0.350962 0.350481 0.349039 0.346643 0.343304 0.339035 0.333854 0.327784 0.320846 0.313068 0.304479 0.295106 0.284983 0.274138 0.262606 0.250417 0.237602 0.224194 0.210222 0.326854 0.32639 0.325 0.322689 0.319467 0.315347 0.310344 0.304479 0.297771 0.290247 0.28193 0.272848 0.26303 0.252504 0.2413 0.229448 0.216977 0.203916 0.190293 0.302684 0.302236 0.300893 0.298662 0.29555 0.291569 0.286733 0.28106 0.274569 0.267282 0.259223 0.250417 0.240889 0.230666 0.219776 0.208246 0.196103 0.183376 0.17009 0.278457 0.278024 0.276726 0.274569 0.27156 0.267709 0.26303 0.257538 0.251251 0.244189 0.236374 0.227828 0.218575 0.20864 0.198049 0.186827 0.175 0.162593 0.149632 0.8 0.798444 0.793845 0.7864 0.776393 0.76415 0.75 0.734246 0.717157 0.69896 0.679844 0.659963 0.639445 0.618392 0.596887 0.575 0.552786 0.530293 0.507557 0.798444 0.796899 0.792334 0.784942 0.775 0.762829 0.748753 0.733073 0.716055 0.697924 0.678869 0.659045 0.638579 0.617574 0.596113 0.574265 0.552088 0.529628 0.506923 0.793845 0.792334 0.787868 0.780626 0.770871 0.758909 0.745049 0.729584 0.712772 0.694836 0.675963 0.656307 0.635995 0.61513 0.593798 0.572069 0.55 0.527639 0.505025 0.7864 0.784942 0.780626 0.773615 0.76415 0.752513 0.738992 0.723866 0.707383 0.689758 0.671176 0.65179 0.631727 0.611091 0.58997 0.568433 0.546541 0.524343 0.501879 0.776393 0.775 0.770871 0.76415 0.755051 0.743826 0.730742 0.716055 0.7 0.682786 0.66459 0.645564 0.625834 0.605507 0.584669 0.563394 0.541742 0.519766 0.497506 0.76415 0.762829 0.758909 0.752513 0.743826 0.733073 0.720492 0.706316 0.690767 0.67404 0.656307 0.637716 0.618392 0.598441 0.577951 0.556999 0.535646 0.513944 0.49194 0.75 0.748753 0.745049 0.738992 0.730742 0.720492 0.708452 0.694836 0.679844 0.663659 0.646447 0.628348 0.609488 0.58997 0.569884 0.549306 0.528301 0.506923 0.485218 0.734246 0.733073 0.729584 0.723866 0.716055 0.706316 0.694836 0.681802 0.667397 0.65179 0.635137 0.617574 0.59922 0.580179 0.56054 0.540381 0.519766 0.498752 0.477386 0.717157 0.716055 0.712772 0.707383 0.7 0.690767 0.679844 0.667397 0.65359 0.638579 0.622508 0.605507 0.587689 0.569158 0.55 0.530293 0.510102 0.489486 0.468493 0.69896 0.697924 0.694836 0.689758 0.682786 0.67404 0.663659 0.65179 0.638579 0.624168 0.608688 0.592262 0.575 0.556999 0.538345 0.519115 0.499375 0.479183 0.45859 0.679844 0.678869 0.675963 0.671176 0.66459 0.656307 0.646447 0.635137 0.622508 0.608688 0.593798 0.577951 0.561252 0.543793 0.525658 0.506923 0.487652 0.467905 0.447732 0.659963 0.659045 0.656307 0.65179 0.645564 0.637716 0.628348 0.617574 0.605507 0.592262 0.577951 0.562679 0.546541 0.529628 0.512019 0.493789 0.475 0.455711 0.435974 0.639445 0.638579 0.635995 0.631727 0.625834 0.618392 0.609488 0.59922 0.587689 0.575 0.561252 0.546541 0.530958 0.514588 0.497506 0.479784 0.461484 0.442663 0.423372 0.618392 0.617574 0.61513 0.611091 0.605507 0.598441 0.58997 0.580179 0.569158 0.556999 0.543793 0.529628 0.514588 0.498752 0.482192 0.464977 0.447166 0.428817 0.409979 0.596887 0.596113 0.593798 0.58997 0.584669 0.577951 0.569884 0.56054 0.55 0.538345 0.525658 0.512019 0.497506 0.482192 0.466146 0.449432 0.432109 0.414231 0.395848 0.575 0.574265 0.572069 0.568433 0.563394 0.556999 0.549306 0.540381 0.530293 0.519115 0.506923 0.493789 0.479784 0.464977 0.449432 0.433211 0.416369 0.398959 0.381029 0.552786 0.552088 0.55 0.546541 0.541742 0.535646 0.528301 0.519766 0.510102 0.499375 0.487652 0.475 0.461484 0.447166 0.432109 0.416369 0.4 0.383052 0.365571 0.530293 0.529628 0.527639 0.524343 0.519766 0.513944 0.506923 0.498752 0.489486 0.479183 0.467905 0.455711 0.442663 0.428817 0.414231 0.398959 0.383052 0.366557 0.349519 0.507557 0.506923 0.505025 0.501879 0.497506 0.49194 0.485218 0.477386 0.468493 0.45859 0.447732 0.435974 0.423372 0.409979 0.395848 0.381029 0.365571 0.349519 0.332917 0.484612 0.484006 0.482192 0.479183 0.475 0.46967 0.463227 0.455711 0.447166 0.437639 0.427178 0.415834 0.403657 0.390697 0.377003 0.362623 0.347601 0.331981 0.315803 0.461484 0.460904 0.459167 0.456286 0.452277 0.447166 0.440983 0.433762 0.425544 0.416369 0.406283 0.395331 0.383559 0.371013 0.357738 0.34378 0.32918 0.313979 0.298217 0.438195 0.437639 0.435974 0.433211 0.429364 0.424457 0.418515 0.41157 0.403657 0.394814 0.385081 0.3745 0.363113 0.350962 0.33809 0.324537 0.310344 0.29555 0.280191 0.414765 0.414231 0.412633 0.409979 0.406283 0.401565 0.395848 0.38916 0.381534 0.373003 0.363604 0.353374 0.342353 0.330579 0.318091 0.304928 0.291128 0.276726 0.261759 0.39121 0.390697 0.38916 0.386608 0.383052 0.37851 0.373003 0.366557 0.3592 0.350962 0.341878 0.331981 0.321306 0.309891 0.297771 0.284983 0.27156 0.257538 0.24295 0.367544 0.367051 0.365571 0.363113 0.359688 0.35531 0.35 0.34378 0.336675 0.328714 0.319926 0.310344 0.3 0.288927 0.277158 0.264728 0.251669 0.238012 0.223791 0.34378 0.343304 0.341878 0.339508 0.336204 0.331981 0.326854 0.320846 0.313979 0.306278 0.297771 0.288488 0.278457 0.267709 0.256276 0.244189 0.231479 0.218175 0.204308 0.319926 0.319467 0.318091 0.315803 0.312614 0.308534 0.303581 0.297771 0.291128 0.283673 0.275431 0.26643 0.256697 0.246259 0.235147 0.223389 0.211013 0.198049 0.184525 0.295994 0.29555 0.29422 0.29201 0.288927 0.284983 0.280191 0.274569 0.268136 0.260913 0.252922 0.244189 0.234739 0.224597 0.213791 0.202347 0.190293 0.177656 0.164461 0.271989 0.27156 0.270274 0.268136 0.265153 0.261336 0.256697 0.251251 0.245017 0.238012 0.23026 0.221781 0.212599 0.202739 0.192225 0.181083 0.169338 0.157014 0.144138 0.775 0.773615 0.769511 0.762829 0.753779 0.742609 0.729584 0.714956 0.69896 0.681802 0.663659 0.644683 0.625 0.604715 0.583917 0.562679 0.541061 0.519115 0.496885 0.773615 0.772239 0.76816 0.761515 0.752513 0.741398 0.72843 0.713862 0.697924 0.680821 0.662732 0.643805 0.624168 0.603926 0.583167 0.561965 0.540381 0.518466 0.496264 0.769511 0.76816 0.76415 0.757616 0.748753 0.737798 0.725 0.710604 0.694836 0.677898 0.659963 0.641182 0.621681 0.601566 0.580924 0.55983 0.538345 0.516523 0.494406 0.762829 0.761515 0.757616 0.751253 0.742609 0.731905 0.719376 0.705254 0.689758 0.673083 0.655399 0.636854 0.617574 0.597663 0.577212 0.556294 0.534973 0.513302 0.491325 0.753779 0.752513 0.748753 0.742609 0.734246 0.723866 0.711686 0.697924 0.682786 0.666458 0.649108 0.630879 0.611896 0.592262 0.572069 0.551391 0.530293 0.508828 0.487043 0.742609 0.741398 0.737798 0.731905 0.723866 0.713862 0.702091 0.688753 0.67404 0.65813 0.641182 0.623337 0.604715 0.585422 0.565546 0.545165 0.524343 0.503135 0.481589 0.729584 0.72843 0.725 0.719376 0.711686 0.702091 0.690767 0.677898 0.663659 0.648219 0.631727 0.614319 0.596113 0.577212 0.557705 0.537669 0.51717 0.496264 0.475 0.714956 0.713862 0.710604 0.705254 0.697924 0.688753 0.677898 0.665523 0.65179 0.636854 0.620856 0.603926 0.586176 0.56771 0.548613 0.528964 0.508828 0.488263 0.467318 0.69896 0.697924 0.694836 0.689758 0.682786 0.67404 0.663659 0.65179 0.638579 0.624168 0.608688 0.592262 0.575 0.556999 0.538345 0.519115 0.499375 0.479183 0.45859 0.681802 0.680821 0.677898 0.673083 0.666458 0.65813 0.648219 0.636854 0.624168 0.610289 0.59534 0.579435 0.562679 0.545165 0.526978 0.508192 0.488874 0.469081 0.448865 0.663659 0.662732 0.659963 0.655399 0.649108 0.641182 0.631727 0.620856 0.608688 0.59534 0.580924 0.565546 0.549306 0.532293 0.514588 0.496264 0.477386 0.458013 0.438195 0.644683 0.643805 0.641182 0.636854 0.630879 0.623337 0.614319 0.603926 0.592262 0.579435 0.565546 0.550695 0.534973 0.518466 0.501252 0.483401 0.464977 0.446037 0.426633 0.625 0.624168 0.621681 0.617574 0.611896 0.604715 0.596113 0.586176 0.575 0.562679 0.549306 0.534973 0.519766 0.503764 0.487043 0.46967 0.451707 0.433211 0.414231 0.604715 0.603926 0.601566 0.597663 0.592262 0.585422 0.577212 0.56771 0.556999 0.545165 0.532293 0.518466 0.503764 0.488263 0.472032 0.455138 0.437639 0.419591 0.401043 0.583917 0.583167 0.580924 0.577212 0.572069 0.565546 0.557705 0.548613 0.538345 0.526978 0.514588 0.501252 0.487043 0.472032 0.456286 0.439866 0.42283 0.405231 0.387117 0.562679 0.561965 0.55983 0.556294 0.551391 0.545165 0.537669 0.528964 0.519115 0.508192 0.496264 0.483401 0.46967 0.455138 0.439866 0.423914 0.407337 0.390184 0.372505 0.541061 0.540381 0.538345 0.534973 0.530293 0.524343 0.51717 0.508828 0.499375 0.488874 0.477386 0.464977 0.451707 0.437639 0.42283 0.407337 0.39121 0.3745 0.357252 0.519115 0.518466 0.516523 0.513302 0.508828 0.503135 0.496264 0.488263 0.479183 0.469081 0.458013 0.446037 0.433211 0.419591 0.405231 0.390184 0.3745 0.358225 0.341403 0.496885 0.496264 0.494406 0.491325 0.487043 0.481589 0.475 0.467318 0.45859 0.448865 0.438195 0.426633 0.414231 0.401043 0.387117 0.372505 0.357252 0.341403 0.325 0.474405 0.473811 0.472032 0.469081 0.464977 0.459745 0.45342 0.446037 0.437639 0.42827 0.417978 0.406809 0.394814 0.38204 0.368533 0.354341 0.339508 0.324075 0.308082 0.451707 0.451138 0.449432 0.446601 0.442663 0.437639 0.431559 0.424457 0.416369 0.407337 0.397401 0.386608 0.375 0.362623 0.349519 0.335733 0.321306 0.306278 0.290687 0.428817 0.42827 0.426633 0.423914 0.420129 0.415299 0.409449 0.40261 0.394814 0.386099 0.376502 0.366064 0.354826 0.342828 0.330112 0.316717 0.302684 0.288048 0.272848 0.405757 0.405231 0.403657 0.401043 0.397401 0.392752 0.387117 0.380524 0.373003 0.364587 0.35531 0.34521 0.334324 0.322689 0.310344 0.297327 0.283673 0.269418 0.254597 0.382546 0.38204 0.380524 0.378007 0.3745 0.37002 0.364587 0.358225 0.350962 0.342828 0.333854 0.324075 0.313523 0.302236 0.290247 0.277591 0.264303 0.250417 0.235965 0.3592 0.358712 0.357252 0.354826 0.351444 0.347122 0.341878 0.335733 0.328714 0.320846 0.312159 0.302684 0.292451 0.281495 0.269846 0.257538 0.244603 0.231072 0.216977 0.335733 0.335263 0.333854 0.331513 0.328249 0.324075 0.319008 0.313068 0.306278 0.298662 0.290247 0.28106 0.271131 0.26049 0.249167 0.237193 0.224597 0.211409 0.19766 0.312159 0.311705 0.310344 0.308082 0.304928 0.300893 0.295994 0.290247 0.283673 0.276294 0.268136 0.259223 0.249583 0.239244 0.228233 0.216578 0.204308 0.191452 0.178036 0.288488 0.288048 0.286733 0.284546 0.281495 0.277591 0.272848 0.267282 0.260913 0.253759 0.245845 0.237193 0.227828 0.217776 0.207062 0.195715 0.183759 0.171221 0.158127 0.264728 0.264303 0.26303 0.260913 0.257959 0.254178 0.249583 0.244189 0.238012 0.231072 0.223389 0.214984 0.205881 0.196103 0.185675 0.174621 0.162967 0.150736 0.137953 0.75 0.748753 0.745049 0.738992 0.730742 0.720492 0.708452 0.694836 0.679844 0.663659 0.646447 0.628348 0.609488 0.58997 0.569884 0.549306 0.528301 0.506923 0.485218 0.748753 0.747512 0.743826 0.737798 0.729584 0.719376 0.707383 0.693814 0.678869 0.662732 0.645564 0.627508 0.608688 0.589208 0.569158 0.548613 0.527639 0.50629 0.484612 0.745049 0.743826 0.740192 0.734246 0.726139 0.716055 0.704196 0.690767 0.675963 0.659963 0.642929 0.625 0.6063 0.586932 0.566987 0.546541 0.525658 0.504394 0.482796 0.738992 0.737798 0.734246 0.72843 0.720492 0.710604 0.69896 0.685755 0.671176 0.655399 0.638579 0.620856 0.602351 0.583167 0.563394 0.543108 0.522376 0.501252 0.479784 0.730742 0.729584 0.726139 0.720492 0.712772 0.703141 0.691779 0.678869 0.66459 0.649108 0.632577 0.61513 0.596887 0.577951 0.558412 0.538345 0.517817 0.496885 0.475596 0.720492 0.719376 0.716055 0.710604 0.703141 0.693814 0.682786 0.670227 0.656307 0.641182 0.625 0.60789 0.58997 0.571339 0.552088 0.532293 0.512019 0.491325 0.470259 0.708452 0.707383 0.704196 0.69896 0.691779 0.682786 0.672128 0.659963 0.646447 0.631727 0.615943 0.59922 0.58167 0.563394 0.544478 0.525 0.505025 0.484612 0.46381 0.694836 0.693814 0.690767 0.685755 0.678869 0.670227 0.659963 0.648219 0.635137 0.620856 0.605507 0.589208 0.572069 0.554186 0.535646 0.516523 0.496885 0.476789 0.456286 0.679844 0.678869 0.675963 0.671176 0.66459 0.656307 0.646447 0.635137 0.622508 0.608688 0.593798 0.577951 0.561252 0.543793 0.525658 0.506923 0.487652 0.467905 0.447732 0.663659 0.662732 0.659963 0.655399 0.649108 0.641182 0.631727 0.620856 0.608688 0.59534 0.580924 0.565546 0.549306 0.532293 0.514588 0.496264 0.477386 0.458013 0.438195 0.646447 0.645564 0.642929 0.638579 0.632577 0.625 0.615943 0.605507 0.593798 0.580924 0.566987 0.552088 0.536319 0.519766 0.502506 0.484612 0.466146 0.447166 0.427724 0.628348 0.627508 0.625 0.620856 0.61513 0.60789 0.59922 0.589208 0.577951 0.565546 0.552088 0.537669 0.522376 0.50629 0.489486 0.472032 0.453992 0.435421 0.416369 0.609488 0.608688 0.6063 0.602351 0.596887 0.58997 0.58167 0.572069 0.561252 0.549306 0.536319 0.522376 0.507557 0.49194 0.475596 0.45859 0.440983 0.42283 0.404181 0.58997 0.589208 0.586932 0.583167 0.577951 0.571339 0.563394 0.554186 0.543793 0.532293 0.519766 0.50629 0.49194 0.476789 0.460904 0.444347 0.427178 0.409449 0.39121 0.569884 0.569158 0.566987 0.563394 0.558412 0.552088 0.544478 0.535646 0.525658 0.514588 0.502506 0.489486 0.475596 0.460904 0.445473 0.429364 0.412633 0.395331 0.377505 0.549306 0.548613 0.546541 0.543108 0.538345 0.532293 0.525 0.516523 0.506923 0.496264 0.484612 0.472032 0.45859 0.444347 0.429364 0.413698 0.397401 0.380524 0.363113 0.528301 0.527639 0.525658 0.522376 0.517817 0.512019 0.505025 0.496885 0.487652 0.477386 0.466146 0.453992 0.440983 0.427178 0.412633 0.397401 0.381534 0.365079 0.34808 0.506923 0.50629 0.504394 0.501252 0.496885 0.491325 0.484612 0.476789 0.467905 0.458013 0.447166 0.435421 0.42283 0.409449 0.395331 0.380524 0.365079 0.349039 0.332449 0.485218 0.484612 0.482796 0.479784 0.475596 0.470259 0.46381 0.456286 0.447732 0.438195 0.427724 0.416369 0.404181 0.39121 0.377505 0.363113 0.34808 0.332449 0.31626 0.463227 0.462645 0.460904 0.458013 0.453992 0.448865 0.442663 0.435421 0.427178 0.417978 0.407864 0.396883 0.385081 0.372505 0.3592 0.34521 0.330579 0.315347 0.299554 0.440983 0.440424 0.438751 0.435974 0.432109 0.427178 0.421208 0.414231 0.406283 0.397401 0.387628 0.377003 0.365571 0.353374 0.340455 0.326854 0.312614 0.297771 0.282365 0.418515 0.417978 0.416369 0.413698 0.409979 0.405231 0.399479 0.392752 0.385081 0.376502 0.367051 0.356766 0.345687 0.333854 0.321306 0.308082 0.29422 0.279757 0.264728 0.395848 0.395331 0.393782 0.39121 0.387628 0.383052 0.377505 0.371013 0.363604 0.35531 0.346165 0.336204 0.325463 0.313979 0.301788 0.288927 0.275431 0.261336 0.246674 0.373003 0.372505 0.371013 0.368533 0.365079 0.360664 0.35531 0.349039 0.341878 0.333854 0.325 0.315347 0.304928 0.293778 0.28193 0.269418 0.256276 0.242537 0.228233 0.35 0.349519 0.34808 0.345687 0.342353 0.33809 0.332917 0.326854 0.319926 0.312159 0.303581 0.29422 0.284109 0.273278 0.261759 0.249583 0.236783 0.223389 0.209431 0.326854 0.32639 0.325 0.322689 0.319467 0.315347 0.310344 0.304479 0.297771 0.290247 0.28193 0.272848 0.26303 0.252504 0.2413 0.229448 0.216977 0.203916 0.190293 0.303581 0.303132 0.301788 0.299554 0.296438 0.292451 0.28761 0.28193 0.275431 0.268136 0.260068 0.251251 0.241712 0.231479 0.220577 0.209035 0.196881 0.184142 0.170844 0.280191 0.279757 0.278457 0.276294 0.273278 0.269418 0.264728 0.259223 0.252922 0.245845 0.238012 0.229448 0.220176 0.210222 0.199609 0.188366 0.176517 0.164087 0.151104 0.256697 0.256276 0.255017 0.252922 0.25 0.246259 0.241712 0.236374 0.23026 0.223389 0.215781 0.207457 0.198439 0.188751 0.178416 0.167459 0.155903 0.143773 0.131093 0.725 0.723866 0.720492 0.714956 0.707383 0.697924 0.686751 0.67404 0.659963 0.644683 0.628348 0.611091 0.593029 0.574265 0.554888 0.534973 0.514588 0.493789 0.472624 0.723866 0.722737 0.719376 0.713862 0.706316 0.696891 0.685755 0.673083 0.659045 0.643805 0.627508 0.610289 0.592262 0.573532 0.554186 0.534302 0.513944 0.493172 0.472032 0.720492 0.719376 0.716055 0.710604 0.703141 0.693814 0.682786 0.670227 0.656307 0.641182 0.625 0.60789 0.58997 0.571339 0.552088 0.532293 0.512019 0.491325 0.470259 0.714956 0.713862 0.710604 0.705254 0.697924 0.688753 0.677898 0.665523 0.65179 0.636854 0.620856 0.603926 0.586176 0.56771 0.548613 0.528964 0.508828 0.488263 0.467318 0.707383 0.706316 0.703141 0.697924 0.690767 0.681802 0.671176 0.659045 0.645564 0.630879 0.61513 0.598441 0.580924 0.562679 0.543793 0.524343 0.504394 0.484006 0.463227 0.697924 0.696891 0.693814 0.688753 0.681802 0.673083 0.662732 0.650894 0.637716 0.623337 0.60789 0.591497 0.574265 0.556294 0.537669 0.518466 0.498752 0.478584 0.458013 0.686751 0.685755 0.682786 0.677898 0.671176 0.662732 0.652689 0.641182 0.628348 0.614319 0.59922 0.583167 0.566266 0.548613 0.530293 0.511379 0.49194 0.472032 0.451707 0.67404 0.673083 0.670227 0.665523 0.659045 0.650894 0.641182 0.630034 0.617574 0.603926 0.589208 0.573532 0.556999 0.539701 0.521722 0.503135 0.484006 0.464393 0.444347 0.659963 0.659045 0.656307 0.65179 0.645564 0.637716 0.628348 0.617574 0.605507 0.592262 0.577951 0.562679 0.546541 0.529628 0.512019 0.493789 0.475 0.455711 0.435974 0.644683 0.643805 0.641182 0.636854 0.630879 0.623337 0.614319 0.603926 0.592262 0.579435 0.565546 0.550695 0.534973 0.518466 0.501252 0.483401 0.464977 0.446037 0.426633 0.628348 0.627508 0.625 0.620856 0.61513 0.60789 0.59922 0.589208 0.577951 0.565546 0.552088 0.537669 0.522376 0.50629 0.489486 0.472032 0.453992 0.435421 0.416369 0.611091 0.610289 0.60789 0.603926 0.598441 0.591497 0.583167 0.573532 0.562679 0.550695 0.537669 0.523686 0.508828 0.493172 0.476789 0.459745 0.442102 0.423914 0.405231 0.593029 0.592262 0.58997 0.586176 0.580924 0.574265 0.566266 0.556999 0.546541 0.534973 0.522376 0.508828 0.494406 0.479183 0.463227 0.446601 0.429364 0.41157 0.393267 0.574265 0.573532 0.571339 0.56771 0.562679 0.556294 0.548613 0.539701 0.529628 0.518466 0.50629 0.493172 0.479183 0.464393 0.448865 0.43266 0.415834 0.39844 0.380524 0.554888 0.554186 0.552088 0.548613 0.543793 0.537669 0.530293 0.521722 0.512019 0.501252 0.489486 0.476789 0.463227 0.448865 0.433762 0.417978 0.401565 0.384573 0.367051 0.534973 0.534302 0.532293 0.528964 0.524343 0.518466 0.511379 0.503135 0.493789 0.483401 0.472032 0.459745 0.446601 0.43266 0.417978 0.40261 0.386608 0.37002 0.352891 0.514588 0.513944 0.512019 0.508828 0.504394 0.498752 0.49194 0.484006 0.475 0.464977 0.453992 0.442102 0.429364 0.415834 0.401565 0.386608 0.371013 0.354826 0.33809 0.493789 0.493172 0.491325 0.488263 0.484006 0.478584 0.472032 0.464393 0.455711 0.446037 0.435421 0.423914 0.41157 0.39844 0.384573 0.37002 0.354826 0.339035 0.322689 0.472624 0.472032 0.470259 0.467318 0.463227 0.458013 0.451707 0.444347 0.435974 0.426633 0.416369 0.405231 0.393267 0.380524 0.367051 0.352891 0.33809 0.322689 0.306729 0.451138 0.450568 0.448865 0.446037 0.442102 0.437083 0.43101 0.423914 0.415834 0.406809 0.396883 0.386099 0.3745 0.362132 0.349039 0.335263 0.320846 0.305828 0.290247 0.429364 0.428817 0.427178 0.424457 0.420668 0.415834 0.409979 0.403133 0.395331 0.386608 0.377003 0.366557 0.35531 0.343304 0.330579 0.317175 0.303132 0.288488 0.273278 0.407337 0.406809 0.405231 0.40261 0.398959 0.394298 0.388649 0.38204 0.3745 0.366064 0.356766 0.346643 0.335733 0.324075 0.311705 0.298662 0.284983 0.270702 0.255856 0.385081 0.384573 0.383052 0.380524 0.377003 0.372505 0.367051 0.360664 0.353374 0.34521 0.336204 0.32639 0.315803 0.304479 0.292451 0.279757 0.26643 0.252504 0.238012 0.362623 0.362132 0.360664 0.358225 0.354826 0.350481 0.34521 0.339035 0.331981 0.324075 0.315347 0.305828 0.29555 0.284546 0.272848 0.26049 0.247504 0.233922 0.219776 0.339981 0.339508 0.33809 0.335733 0.332449 0.328249 0.323151 0.317175 0.310344 0.302684 0.29422 0.284983 0.275 0.264303 0.252922 0.240889 0.228233 0.214984 0.201173 0.317175 0.316717 0.315347 0.313068 0.309891 0.305828 0.300893 0.295106 0.288488 0.28106 0.272848 0.263878 0.254178 0.243776 0.2327 0.220978 0.20864 0.195715 0.182229 0.29422 0.293778 0.292451 0.290247 0.287171 0.283236 0.278457 0.272848 0.26643 0.259223 0.251251 0.242537 0.233107 0.222986 0.212202 0.200782 0.188751 0.176137 0.162967 0.271131 0.270702 0.269418 0.267282 0.264303 0.26049 0.255856 0.250417 0.244189 0.237193 0.229448 0.220978 0.211806 0.201956 0.191452 0.18032 0.168586 0.156273 0.143408 0.24792 0.247504 0.246259 0.244189 0.2413 0.237602 0.233107 0.227828 0.221781 0.214984 0.207457 0.199219 0.190293 0.180702 0.170467 0.159613 0.148164 0.136142 0.123573 0.7 0.69896 0.695862 0.690767 0.683772 0.675 0.66459 0.652689 0.639445 0.625 0.609488 0.593029 0.575736 0.557705 0.539023 0.519766 0.5 0.479784 0.459167 0.69896 0.697924 0.694836 0.689758 0.682786 0.67404 0.663659 0.65179 0.638579 0.624168 0.608688 0.592262 0.575 0.556999 0.538345 0.519115 0.499375 0.479183 0.45859 0.695862 0.694836 0.691779 0.686751 0.679844 0.671176 0.660884 0.649108 0.635995 0.621681 0.6063 0.58997 0.5728 0.554888 0.536319 0.51717 0.497506 0.477386 0.456861 0.690767 0.689758 0.686751 0.681802 0.675 0.666458 0.656307 0.644683 0.631727 0.617574 0.602351 0.586176 0.569158 0.551391 0.532961 0.513944 0.494406 0.474405 0.453992 0.683772 0.682786 0.679844 0.675 0.668338 0.659963 0.65 0.638579 0.625834 0.611896 0.596887 0.580924 0.56411 0.546541 0.528301 0.509465 0.490098 0.470259 0.45 0.675 0.67404 0.671176 0.666458 0.659963 0.65179 0.642054 0.630879 0.618392 0.604715 0.58997 0.574265 0.557705 0.540381 0.522376 0.503764 0.484612 0.464977 0.44491 0.66459 0.663659 0.660884 0.656307 0.65 0.642054 0.632577 0.621681 0.609488 0.596113 0.58167 0.566266 0.55 0.532961 0.515232 0.496885 0.477985 0.45859 0.438751 0.652689 0.65179 0.649108 0.644683 0.638579 0.630879 0.621681 0.611091 0.59922 0.586176 0.572069 0.556999 0.541061 0.524343 0.506923 0.488874 0.470259 0.451138 0.431559 0.639445 0.638579 0.635995 0.631727 0.625834 0.618392 0.609488 0.59922 0.587689 0.575 0.561252 0.546541 0.530958 0.514588 0.497506 0.479784 0.461484 0.442663 0.423372 0.625 0.624168 0.621681 0.617574 0.611896 0.604715 0.596113 0.586176 0.575 0.562679 0.549306 0.534973 0.519766 0.503764 0.487043 0.46967 0.451707 0.433211 0.414231 0.609488 0.608688 0.6063 0.602351 0.596887 0.58997 0.58167 0.572069 0.561252 0.549306 0.536319 0.522376 0.507557 0.49194 0.475596 0.45859 0.440983 0.42283 0.404181 0.593029 0.592262 0.58997 0.586176 0.580924 0.574265 0.566266 0.556999 0.546541 0.534973 0.522376 0.508828 0.494406 0.479183 0.463227 0.446601 0.429364 0.41157 0.393267 0.575736 0.575 0.5728 0.569158 0.56411 0.557705 0.55 0.541061 0.530958 0.519766 0.507557 0.494406 0.480385 0.465561 0.45 0.433762 0.416905 0.399479 0.381534 0.557705 0.556999 0.554888 0.551391 0.546541 0.540381 0.532961 0.524343 0.514588 0.503764 0.49194 0.479183 0.465561 0.451138 0.435974 0.420129 0.403657 0.386608 0.369029 0.539023 0.538345 0.536319 0.532961 0.528301 0.522376 0.515232 0.506923 0.497506 0.487043 0.475596 0.463227 0.45 0.435974 0.421208 0.405757 0.389672 0.373003 0.355795 0.519766 0.519115 0.51717 0.513944 0.509465 0.503764 0.496885 0.488874 0.479784 0.46967 0.45859 0.446601 0.433762 0.420129 0.405757 0.390697 0.375 0.358712 0.341878 0.5 0.499375 0.497506 0.494406 0.490098 0.484612 0.477985 0.470259 0.461484 0.451707 0.440983 0.429364 0.416905 0.403657 0.389672 0.375 0.359688 0.34378 0.327319 0.479784 0.479183 0.477386 0.474405 0.470259 0.464977 0.45859 0.451138 0.442663 0.433211 0.42283 0.41157 0.399479 0.386608 0.373003 0.358712 0.34378 0.328249 0.312159 0.459167 0.45859 0.456861 0.453992 0.45 0.44491 0.438751 0.431559 0.423372 0.414231 0.404181 0.393267 0.381534 0.369029 0.355795 0.341878 0.327319 0.312159 0.296438 0.438195 0.437639 0.435974 0.433211 0.429364 0.424457 0.418515 0.41157 0.403657 0.394814 0.385081 0.3745 0.363113 0.350962 0.33809 0.324537 0.310344 0.29555 0.280191 0.416905 0.416369 0.414765 0.412101 0.408392 0.403657 0.39792 0.39121 0.383559 0.375 0.365571 0.35531 0.344256 0.332449 0.319926 0.306729 0.292893 0.278457 0.263454 0.395331 0.394814 0.393267 0.390697 0.387117 0.382546 0.377003 0.370516 0.363113 0.354826 0.345687 0.335733 0.325 0.313523 0.301341 0.288488 0.275 0.260913 0.246259 0.373502 0.373003 0.37151 0.369029 0.365571 0.361153 0.355795 0.349519 0.342353 0.334324 0.325463 0.315803 0.305378 0.29422 0.282365 0.269846 0.256697 0.24295 0.228638 0.351444 0.350962 0.349519 0.347122 0.34378 0.339508 0.334324 0.328249 0.321306 0.313523 0.304928 0.29555 0.28542 0.274569 0.26303 0.250834 0.238012 0.224597 0.210617 0.32918 0.328714 0.327319 0.325 0.321767 0.317633 0.312614 0.306729 0.3 0.292451 0.284109 0.275 0.265153 0.254597 0.243363 0.231479 0.218975 0.205881 0.192225 0.306729 0.306278 0.304928 0.302684 0.299554 0.29555 0.290687 0.284983 0.278457 0.271131 0.26303 0.254178 0.244603 0.23433 0.223389 0.211806 0.199609 0.186827 0.173486 0.284109 0.283673 0.282365 0.280191 0.277158 0.273278 0.268563 0.26303 0.256697 0.249583 0.241712 0.233107 0.223791 0.213791 0.203131 0.191839 0.179939 0.167459 0.154423 0.261336 0.260913 0.259645 0.257538 0.254597 0.250834 0.246259 0.240889 0.234739 0.227828 0.220176 0.211806 0.202739 0.192999 0.182611 0.171598 0.159985 0.147797 0.135058 0.238423 0.238012 0.236783 0.234739 0.231885 0.228233 0.223791 0.218575 0.212599 0.205881 0.198439 0.190293 0.181465 0.171975 0.161847 0.151104 0.139767 0.127862 0.11541 0.675 0.67404 0.671176 0.666458 0.659963 0.65179 0.642054 0.630879 0.618392 0.604715 0.58997 0.574265 0.557705 0.540381 0.522376 0.503764 0.484612 0.464977 0.44491 0.67404 0.673083 0.670227 0.665523 0.659045 0.650894 0.641182 0.630034 0.617574 0.603926 0.589208 0.573532 0.556999 0.539701 0.521722 0.503135 0.484006 0.464393 0.444347 0.671176 0.670227 0.667397 0.662732 0.656307 0.648219 0.638579 0.627508 0.61513 0.601566 0.586932 0.571339 0.554888 0.537669 0.519766 0.501252 0.482192 0.462645 0.442663 0.666458 0.665523 0.662732 0.65813 0.65179 0.643805 0.634282 0.623337 0.611091 0.597663 0.583167 0.56771 0.551391 0.534302 0.516523 0.498129 0.479183 0.459745 0.439866 0.659963 0.659045 0.656307 0.65179 0.645564 0.637716 0.628348 0.617574 0.605507 0.592262 0.577951 0.562679 0.546541 0.529628 0.512019 0.493789 0.475 0.455711 0.435974 0.65179 0.650894 0.648219 0.643805 0.637716 0.630034 0.620856 0.610289 0.598441 0.585422 0.571339 0.556294 0.540381 0.523686 0.50629 0.488263 0.46967 0.450568 0.43101 0.642054 0.641182 0.638579 0.634282 0.628348 0.620856 0.611896 0.601566 0.58997 0.577212 0.563394 0.548613 0.532961 0.516523 0.499375 0.481589 0.463227 0.444347 0.425 0.630879 0.630034 0.627508 0.623337 0.617574 0.610289 0.601566 0.591497 0.580179 0.56771 0.554186 0.539701 0.524343 0.508192 0.491325 0.473811 0.455711 0.437083 0.417978 0.618392 0.617574 0.61513 0.611091 0.605507 0.598441 0.58997 0.580179 0.569158 0.556999 0.543793 0.529628 0.514588 0.498752 0.482192 0.464977 0.447166 0.428817 0.409979 0.604715 0.603926 0.601566 0.597663 0.592262 0.585422 0.577212 0.56771 0.556999 0.545165 0.532293 0.518466 0.503764 0.488263 0.472032 0.455138 0.437639 0.419591 0.401043 0.58997 0.589208 0.586932 0.583167 0.577951 0.571339 0.563394 0.554186 0.543793 0.532293 0.519766 0.50629 0.49194 0.476789 0.460904 0.444347 0.427178 0.409449 0.39121 0.574265 0.573532 0.571339 0.56771 0.562679 0.556294 0.548613 0.539701 0.529628 0.518466 0.50629 0.493172 0.479183 0.464393 0.448865 0.43266 0.415834 0.39844 0.380524 0.557705 0.556999 0.554888 0.551391 0.546541 0.540381 0.532961 0.524343 0.514588 0.503764 0.49194 0.479183 0.465561 0.451138 0.435974 0.420129 0.403657 0.386608 0.369029 0.540381 0.539701 0.537669 0.534302 0.529628 0.523686 0.516523 0.508192 0.498752 0.488263 0.476789 0.464393 0.451138 0.437083 0.422289 0.406809 0.390697 0.374001 0.356766 0.522376 0.521722 0.519766 0.516523 0.512019 0.50629 0.499375 0.491325 0.482192 0.472032 0.460904 0.448865 0.435974 0.422289 0.407864 0.392752 0.377003 0.360664 0.34378 0.503764 0.503135 0.501252 0.498129 0.493789 0.488263 0.481589 0.473811 0.464977 0.455138 0.444347 0.43266 0.420129 0.406809 0.392752 0.378007 0.362623 0.346643 0.330112 0.484612 0.484006 0.482192 0.479183 0.475 0.46967 0.463227 0.455711 0.447166 0.437639 0.427178 0.415834 0.403657 0.390697 0.377003 0.362623 0.347601 0.331981 0.315803 0.464977 0.464393 0.462645 0.459745 0.455711 0.450568 0.444347 0.437083 0.428817 0.419591 0.409449 0.39844 0.386608 0.374001 0.360664 0.346643 0.331981 0.316717 0.300893 0.44491 0.444347 0.442663 0.439866 0.435974 0.43101 0.425 0.417978 0.409979 0.401043 0.39121 0.380524 0.369029 0.356766 0.34378 0.330112 0.315803 0.300893 0.28542 0.424457 0.423914 0.422289 0.419591 0.415834 0.411039 0.405231 0.39844 0.390697 0.38204 0.372505 0.362132 0.350962 0.339035 0.32639 0.313068 0.299108 0.284546 0.269418 0.403657 0.403133 0.401565 0.398959 0.395331 0.390697 0.385081 0.37851 0.371013 0.362623 0.353374 0.343304 0.332449 0.320846 0.308534 0.29555 0.28193 0.267709 0.252922 0.382546 0.38204 0.380524 0.378007 0.3745 0.37002 0.364587 0.358225 0.350962 0.342828 0.333854 0.324075 0.313523 0.302236 0.290247 0.277591 0.264303 0.250417 0.235965 0.361153 0.360664 0.3592 0.356766 0.353374 0.349039 0.34378 0.337618 0.330579 0.322689 0.313979 0.304479 0.29422 0.283236 0.27156 0.259223 0.246259 0.2327 0.218575 0.339508 0.339035 0.337618 0.335263 0.331981 0.327784 0.322689 0.316717 0.309891 0.302236 0.293778 0.284546 0.274569 0.263878 0.252504 0.240477 0.227828 0.214586 0.200782 0.317633 0.317175 0.315803 0.313523 0.310344 0.306278 0.301341 0.29555 0.288927 0.281495 0.273278 0.264303 0.254597 0.244189 0.233107 0.221379 0.209035 0.196103 0.182611 0.29555 0.295106 0.293778 0.291569 0.288488 0.284546 0.279757 0.274138 0.267709 0.26049 0.252504 0.243776 0.23433 0.224194 0.213393 0.201956 0.189907 0.177276 0.164087 0.273278 0.272848 0.27156 0.269418 0.26643 0.262606 0.257959 0.252504 0.246259 0.239244 0.231479 0.222986 0.213791 0.203916 0.193387 0.182229 0.170467 0.158127 0.145234 0.250834 0.250417 0.249167 0.247089 0.244189 0.240477 0.235965 0.230666 0.224597 0.217776 0.210222 0.201956 0.192999 0.183376 0.173108 0.16222 0.150736 0.138678 0.126072 0.228233 0.227828 0.226615 0.224597 0.221781 0.218175 0.213791 0.20864 0.202739 0.196103 0.188751 0.180702 0.171975 0.162593 0.152577 0.14195 0.130733 0.118949 0.106622 0.65 0.649108 0.646447 0.642054 0.635995 0.628348 0.619211 0.608688 0.596887 0.583917 0.569884 0.554888 0.539023 0.522376 0.505025 0.487043 0.468493 0.449432 0.429912 0.649108 0.648219 0.645564 0.641182 0.635137 0.627508 0.618392 0.60789 0.596113 0.583167 0.569158 0.554186 0.538345 0.521722 0.504394 0.486434 0.467905 0.448865 0.429364 0.646447 0.645564 0.642929 0.638579 0.632577 0.625 0.615943 0.605507 0.593798 0.580924 0.566987 0.552088 0.536319 0.519766 0.502506 0.484612 0.466146 0.447166 0.427724 0.642054 0.641182 0.638579 0.634282 0.628348 0.620856 0.611896 0.601566 0.58997 0.577212 0.563394 0.548613 0.532961 0.516523 0.499375 0.481589 0.463227 0.444347 0.425 0.635995 0.635137 0.632577 0.628348 0.622508 0.61513 0.6063 0.596113 0.584669 0.572069 0.558412 0.543793 0.528301 0.512019 0.495025 0.477386 0.459167 0.440424 0.421208 0.628348 0.627508 0.625 0.620856 0.61513 0.60789 0.59922 0.589208 0.577951 0.565546 0.552088 0.537669 0.522376 0.50629 0.489486 0.472032 0.453992 0.435421 0.416369 0.619211 0.618392 0.615943 0.611896 0.6063 0.59922 0.590732 0.580924 0.569884 0.557705 0.544478 0.530293 0.515232 0.499375 0.482796 0.465561 0.447732 0.429364 0.410509 0.608688 0.60789 0.605507 0.601566 0.596113 0.589208 0.580924 0.571339 0.56054 0.548613 0.535646 0.521722 0.506923 0.491325 0.475 0.458013 0.440424 0.422289 0.403657 0.596887 0.596113 0.593798 0.58997 0.584669 0.577951 0.569884 0.56054 0.55 0.538345 0.525658 0.512019 0.497506 0.482192 0.466146 0.449432 0.432109 0.414231 0.395848 0.583917 0.583167 0.580924 0.577212 0.572069 0.565546 0.557705 0.548613 0.538345 0.526978 0.514588 0.501252 0.487043 0.472032 0.456286 0.439866 0.42283 0.405231 0.387117 0.569884 0.569158 0.566987 0.563394 0.558412 0.552088 0.544478 0.535646 0.525658 0.514588 0.502506 0.489486 0.475596 0.460904 0.445473 0.429364 0.412633 0.395331 0.377505 0.554888 0.554186 0.552088 0.548613 0.543793 0.537669 0.530293 0.521722 0.512019 0.501252 0.489486 0.476789 0.463227 0.448865 0.433762 0.417978 0.401565 0.384573 0.367051 0.539023 0.538345 0.536319 0.532961 0.528301 0.522376 0.515232 0.506923 0.497506 0.487043 0.475596 0.463227 0.45 0.435974 0.421208 0.405757 0.389672 0.373003 0.355795 0.522376 0.521722 0.519766 0.516523 0.512019 0.50629 0.499375 0.491325 0.482192 0.472032 0.460904 0.448865 0.435974 0.422289 0.407864 0.392752 0.377003 0.360664 0.34378 0.505025 0.504394 0.502506 0.499375 0.495025 0.489486 0.482796 0.475 0.466146 0.456286 0.445473 0.433762 0.421208 0.407864 0.393782 0.379013 0.363604 0.347601 0.331046 0.487043 0.486434 0.484612 0.481589 0.477386 0.472032 0.465561 0.458013 0.449432 0.439866 0.429364 0.417978 0.405757 0.392752 0.379013 0.364587 0.349519 0.333854 0.317633 0.468493 0.467905 0.466146 0.463227 0.459167 0.453992 0.447732 0.440424 0.432109 0.42283 0.412633 0.401565 0.389672 0.377003 0.363604 0.349519 0.334793 0.319467 0.303581 0.449432 0.448865 0.447166 0.444347 0.440424 0.435421 0.429364 0.422289 0.414231 0.405231 0.395331 0.384573 0.373003 0.360664 0.347601 0.333854 0.319467 0.304479 0.288927 0.429912 0.429364 0.427724 0.425 0.421208 0.416369 0.410509 0.403657 0.395848 0.387117 0.377505 0.367051 0.355795 0.34378 0.331046 0.317633 0.303581 0.288927 0.273708 0.409979 0.409449 0.407864 0.405231 0.401565 0.396883 0.39121 0.384573 0.377003 0.368533 0.3592 0.349039 0.33809 0.32639 0.313979 0.300893 0.287171 0.272848 0.257959 0.389672 0.38916 0.387628 0.385081 0.381534 0.377003 0.37151 0.365079 0.357738 0.349519 0.340455 0.330579 0.319926 0.308534 0.296438 0.283673 0.270274 0.256276 0.241712 0.369029 0.368533 0.367051 0.364587 0.361153 0.356766 0.351444 0.34521 0.33809 0.330112 0.321306 0.311705 0.301341 0.290247 0.278457 0.266004 0.252922 0.239244 0.225 0.34808 0.347601 0.346165 0.34378 0.340455 0.336204 0.331046 0.325 0.318091 0.310344 0.301788 0.292451 0.282365 0.27156 0.260068 0.24792 0.235147 0.221781 0.207851 0.326854 0.32639 0.325 0.322689 0.319467 0.315347 0.310344 0.304479 0.297771 0.290247 0.28193 0.272848 0.26303 0.252504 0.2413 0.229448 0.216977 0.203916 0.190293 0.305378 0.304928 0.303581 0.301341 0.298217 0.29422 0.289366 0.283673 0.277158 0.269846 0.261759 0.252922 0.243363 0.233107 0.222183 0.210617 0.198439 0.185675 0.172353 0.283673 0.283236 0.28193 0.279757 0.276726 0.272848 0.268136 0.262606 0.256276 0.249167 0.2413 0.2327 0.223389 0.213393 0.202739 0.191452 0.179558 0.167083 0.154054 0.261759 0.261336 0.260068 0.257959 0.255017 0.251251 0.246674 0.2413 0.235147 0.228233 0.220577 0.212202 0.203131 0.193387 0.182993 0.171975 0.160357 0.148164 0.135419 0.239655 0.239244 0.238012 0.235965 0.233107 0.229448 0.225 0.219776 0.213791 0.207062 0.199609 0.191452 0.182611 0.173108 0.162967 0.152209 0.140858 0.128937 0.11647 0.217376 0.216977 0.215781 0.213791 0.211013 0.207457 0.203131 0.198049 0.192225 0.185675 0.178416 0.170467 0.161847 0.152577 0.142679 0.132172 0.12108 0.109424 0.0972265 0.625 0.624168 0.621681 0.617574 0.611896 0.604715 0.596113 0.586176 0.575 0.562679 0.549306 0.534973 0.519766 0.503764 0.487043 0.46967 0.451707 0.433211 0.414231 0.624168 0.623337 0.620856 0.616757 0.611091 0.603926 0.59534 0.585422 0.574265 0.561965 0.548613 0.534302 0.519115 0.503135 0.486434 0.469081 0.451138 0.43266 0.413698 0.621681 0.620856 0.618392 0.614319 0.608688 0.601566 0.593029 0.583167 0.572069 0.55983 0.546541 0.532293 0.51717 0.501252 0.484612 0.467318 0.449432 0.43101 0.412101 0.617574 0.616757 0.614319 0.610289 0.604715 0.597663 0.589208 0.579435 0.568433 0.556294 0.543108 0.528964 0.513944 0.498129 0.481589 0.464393 0.446601 0.42827 0.409449 0.611896 0.611091 0.608688 0.604715 0.59922 0.592262 0.583917 0.574265 0.563394 0.551391 0.538345 0.524343 0.509465 0.493789 0.477386 0.460324 0.442663 0.424457 0.405757 0.604715 0.603926 0.601566 0.597663 0.592262 0.585422 0.577212 0.56771 0.556999 0.545165 0.532293 0.518466 0.503764 0.488263 0.472032 0.455138 0.437639 0.419591 0.401043 0.596113 0.59534 0.593029 0.589208 0.583917 0.577212 0.569158 0.55983 0.549306 0.537669 0.525 0.511379 0.496885 0.481589 0.465561 0.448865 0.431559 0.413698 0.395331 0.586176 0.585422 0.583167 0.579435 0.574265 0.56771 0.55983 0.550695 0.540381 0.528964 0.516523 0.503135 0.488874 0.473811 0.458013 0.441542 0.424457 0.406809 0.388649 0.575 0.574265 0.572069 0.568433 0.563394 0.556999 0.549306 0.540381 0.530293 0.519115 0.506923 0.493789 0.479784 0.464977 0.449432 0.433211 0.416369 0.398959 0.381029 0.562679 0.561965 0.55983 0.556294 0.551391 0.545165 0.537669 0.528964 0.519115 0.508192 0.496264 0.483401 0.46967 0.455138 0.439866 0.423914 0.407337 0.390184 0.372505 0.549306 0.548613 0.546541 0.543108 0.538345 0.532293 0.525 0.516523 0.506923 0.496264 0.484612 0.472032 0.45859 0.444347 0.429364 0.413698 0.397401 0.380524 0.363113 0.534973 0.534302 0.532293 0.528964 0.524343 0.518466 0.511379 0.503135 0.493789 0.483401 0.472032 0.459745 0.446601 0.43266 0.417978 0.40261 0.386608 0.37002 0.352891 0.519766 0.519115 0.51717 0.513944 0.509465 0.503764 0.496885 0.488874 0.479784 0.46967 0.45859 0.446601 0.433762 0.420129 0.405757 0.390697 0.375 0.358712 0.341878 0.503764 0.503135 0.501252 0.498129 0.493789 0.488263 0.481589 0.473811 0.464977 0.455138 0.444347 0.43266 0.420129 0.406809 0.392752 0.378007 0.362623 0.346643 0.330112 0.487043 0.486434 0.484612 0.481589 0.477386 0.472032 0.465561 0.458013 0.449432 0.439866 0.429364 0.417978 0.405757 0.392752 0.379013 0.364587 0.349519 0.333854 0.317633 0.46967 0.469081 0.467318 0.464393 0.460324 0.455138 0.448865 0.441542 0.433211 0.423914 0.413698 0.40261 0.390697 0.378007 0.364587 0.350481 0.335733 0.320386 0.304479 0.451707 0.451138 0.449432 0.446601 0.442663 0.437639 0.431559 0.424457 0.416369 0.407337 0.397401 0.386608 0.375 0.362623 0.349519 0.335733 0.321306 0.306278 0.290687 0.433211 0.43266 0.43101 0.42827 0.424457 0.419591 0.413698 0.406809 0.398959 0.390184 0.380524 0.37002 0.358712 0.346643 0.333854 0.320386 0.306278 0.291569 0.276294 0.414231 0.413698 0.412101 0.409449 0.405757 0.401043 0.395331 0.388649 0.381029 0.372505 0.363113 0.352891 0.341878 0.330112 0.317633 0.304479 0.290687 0.276294 0.261336 0.394814 0.394298 0.392752 0.390184 0.386608 0.38204 0.376502 0.37002 0.362623 0.354341 0.34521 0.335263 0.324537 0.313068 0.300893 0.288048 0.274569 0.26049 0.245845 0.375 0.3745 0.373003 0.370516 0.367051 0.362623 0.357252 0.350962 0.34378 0.335733 0.326854 0.317175 0.306729 0.29555 0.283673 0.271131 0.257959 0.244189 0.229854 0.354826 0.354341 0.352891 0.350481 0.347122 0.342828 0.337618 0.331513 0.324537 0.316717 0.308082 0.298662 0.288488 0.277591 0.266004 0.253759 0.240889 0.227423 0.213393 0.334324 0.333854 0.332449 0.330112 0.326854 0.322689 0.317633 0.311705 0.304928 0.297327 0.288927 0.279757 0.269846 0.259223 0.24792 0.235965 0.223389 0.210222 0.196492 0.313523 0.313068 0.311705 0.309439 0.306278 0.302236 0.297327 0.291569 0.284983 0.277591 0.269418 0.26049 0.250834 0.240477 0.229448 0.217776 0.205488 0.192612 0.179177 0.292451 0.29201 0.290687 0.288488 0.28542 0.281495 0.276726 0.271131 0.264728 0.257538 0.249583 0.240889 0.231479 0.221379 0.210617 0.199219 0.187212 0.174621 0.161475 0.271131 0.270702 0.269418 0.267282 0.264303 0.26049 0.255856 0.250417 0.244189 0.237193 0.229448 0.220978 0.211806 0.201956 0.191452 0.18032 0.168586 0.156273 0.143408 0.249583 0.249167 0.24792 0.245845 0.24295 0.239244 0.234739 0.229448 0.223389 0.216578 0.209035 0.200782 0.191839 0.182229 0.171975 0.161102 0.149632 0.137591 0.125 0.227828 0.227423 0.226211 0.224194 0.221379 0.217776 0.213393 0.208246 0.202347 0.195715 0.188366 0.18032 0.171598 0.16222 0.152209 0.141586 0.130374 0.118595 0.106272 0.205881 0.205488 0.204308 0.202347 0.199609 0.196103 0.191839 0.186827 0.181083 0.174621 0.167459 0.159613 0.151104 0.14195 0.132172 0.121792 0.110829 0.0993058 0.0872432 0.6 0.59922 0.596887 0.593029 0.587689 0.580924 0.5728 0.563394 0.552786 0.541061 0.528301 0.514588 0.5 0.484612 0.468493 0.451707 0.434315 0.416369 0.39792 0.59922 0.598441 0.596113 0.592262 0.586932 0.580179 0.572069 0.562679 0.552088 0.540381 0.527639 0.513944 0.499375 0.484006 0.467905 0.451138 0.433762 0.415834 0.397401 0.596887 0.596113 0.593798 0.58997 0.584669 0.577951 0.569884 0.56054 0.55 0.538345 0.525658 0.512019 0.497506 0.482192 0.466146 0.449432 0.432109 0.414231 0.395848 0.593029 0.592262 0.58997 0.586176 0.580924 0.574265 0.566266 0.556999 0.546541 0.534973 0.522376 0.508828 0.494406 0.479183 0.463227 0.446601 0.429364 0.41157 0.393267 0.587689 0.586932 0.584669 0.580924 0.575736 0.569158 0.561252 0.552088 0.541742 0.530293 0.517817 0.504394 0.490098 0.475 0.459167 0.442663 0.425544 0.407864 0.389672 0.580924 0.580179 0.577951 0.574265 0.569158 0.562679 0.554888 0.545852 0.535646 0.524343 0.512019 0.498752 0.484612 0.46967 0.453992 0.437639 0.420668 0.403133 0.385081 0.5728 0.572069 0.569884 0.566266 0.561252 0.554888 0.547231 0.538345 0.528301 0.51717 0.505025 0.49194 0.477985 0.463227 0.447732 0.431559 0.414765 0.397401 0.379516 0.563394 0.562679 0.56054 0.556999 0.552088 0.545852 0.538345 0.529628 0.519766 0.508828 0.496885 0.484006 0.470259 0.455711 0.440424 0.424457 0.407864 0.390697 0.373003 0.552786 0.552088 0.55 0.546541 0.541742 0.535646 0.528301 0.519766 0.510102 0.499375 0.487652 0.475 0.461484 0.447166 0.432109 0.416369 0.4 0.383052 0.365571 0.541061 0.540381 0.538345 0.534973 0.530293 0.524343 0.51717 0.508828 0.499375 0.488874 0.477386 0.464977 0.451707 0.437639 0.42283 0.407337 0.39121 0.3745 0.357252 0.528301 0.527639 0.525658 0.522376 0.517817 0.512019 0.505025 0.496885 0.487652 0.477386 0.466146 0.453992 0.440983 0.427178 0.412633 0.397401 0.381534 0.365079 0.34808 0.514588 0.513944 0.512019 0.508828 0.504394 0.498752 0.49194 0.484006 0.475 0.464977 0.453992 0.442102 0.429364 0.415834 0.401565 0.386608 0.371013 0.354826 0.33809 0.5 0.499375 0.497506 0.494406 0.490098 0.484612 0.477985 0.470259 0.461484 0.451707 0.440983 0.429364 0.416905 0.403657 0.389672 0.375 0.359688 0.34378 0.327319 0.484612 0.484006 0.482192 0.479183 0.475 0.46967 0.463227 0.455711 0.447166 0.437639 0.427178 0.415834 0.403657 0.390697 0.377003 0.362623 0.347601 0.331981 0.315803 0.468493 0.467905 0.466146 0.463227 0.459167 0.453992 0.447732 0.440424 0.432109 0.42283 0.412633 0.401565 0.389672 0.377003 0.363604 0.349519 0.334793 0.319467 0.303581 0.451707 0.451138 0.449432 0.446601 0.442663 0.437639 0.431559 0.424457 0.416369 0.407337 0.397401 0.386608 0.375 0.362623 0.349519 0.335733 0.321306 0.306278 0.290687 0.434315 0.433762 0.432109 0.429364 0.425544 0.420668 0.414765 0.407864 0.4 0.39121 0.381534 0.371013 0.359688 0.347601 0.334793 0.321306 0.30718 0.292451 0.277158 0.416369 0.415834 0.414231 0.41157 0.407864 0.403133 0.397401 0.390697 0.383052 0.3745 0.365079 0.354826 0.34378 0.331981 0.319467 0.306278 0.292451 0.278024 0.26303 0.39792 0.397401 0.395848 0.393267 0.389672 0.385081 0.379516 0.373003 0.365571 0.357252 0.34808 0.33809 0.327319 0.315803 0.303581 0.290687 0.277158 0.26303 0.248335 0.379013 0.37851 0.377003 0.3745 0.371013 0.366557 0.361153 0.354826 0.347601 0.339508 0.330579 0.320846 0.310344 0.299108 0.287171 0.274569 0.261336 0.247504 0.233107 0.359688 0.3592 0.357738 0.35531 0.351926 0.347601 0.342353 0.336204 0.32918 0.321306 0.312614 0.303132 0.292893 0.28193 0.270274 0.257959 0.245017 0.231479 0.217376 0.339981 0.339508 0.33809 0.335733 0.332449 0.328249 0.323151 0.317175 0.310344 0.302684 0.29422 0.284983 0.275 0.264303 0.252922 0.240889 0.228233 0.214984 0.201173 0.319926 0.319467 0.318091 0.315803 0.312614 0.308534 0.303581 0.297771 0.291128 0.283673 0.275431 0.26643 0.256697 0.246259 0.235147 0.223389 0.211013 0.198049 0.184525 0.299554 0.299108 0.297771 0.29555 0.292451 0.288488 0.283673 0.278024 0.27156 0.264303 0.256276 0.247504 0.238012 0.227828 0.216977 0.205488 0.193387 0.180702 0.167459 0.27889 0.278457 0.277158 0.275 0.271989 0.268136 0.263454 0.257959 0.251669 0.244603 0.236783 0.228233 0.218975 0.209035 0.198439 0.187212 0.175379 0.162967 0.15 0.257959 0.257538 0.256276 0.254178 0.251251 0.247504 0.24295 0.237602 0.231479 0.224597 0.216977 0.20864 0.199609 0.189907 0.179558 0.168586 0.157014 0.144868 0.132172 0.236783 0.236374 0.235147 0.233107 0.23026 0.226615 0.222183 0.216977 0.211013 0.204308 0.196881 0.188751 0.179939 0.170467 0.160357 0.149632 0.138316 0.12643 0.113998 0.215382 0.214984 0.213791 0.211806 0.209035 0.205488 0.201173 0.196103 0.190293 0.183759 0.176517 0.168586 0.159985 0.150736 0.140858 0.130374 0.119304 0.107672 0.0954974 0.193774 0.193387 0.192225 0.190293 0.187596 0.184142 0.179939 0.175 0.169338 0.162967 0.155903 0.148164 0.139767 0.130733 0.12108 0.110829 0.1 0.0886137 0.0766907 0.575 0.574265 0.572069 0.568433 0.563394 0.556999 0.549306 0.540381 0.530293 0.519115 0.506923 0.493789 0.479784 0.464977 0.449432 0.433211 0.416369 0.398959 0.381029 0.574265 0.573532 0.571339 0.56771 0.562679 0.556294 0.548613 0.539701 0.529628 0.518466 0.50629 0.493172 0.479183 0.464393 0.448865 0.43266 0.415834 0.39844 0.380524 0.572069 0.571339 0.569158 0.565546 0.56054 0.554186 0.546541 0.537669 0.527639 0.516523 0.504394 0.491325 0.477386 0.462645 0.447166 0.43101 0.414231 0.396883 0.379013 0.568433 0.56771 0.565546 0.561965 0.556999 0.550695 0.543108 0.534302 0.524343 0.513302 0.501252 0.488263 0.474405 0.459745 0.444347 0.42827 0.41157 0.394298 0.376502 0.563394 0.562679 0.56054 0.556999 0.552088 0.545852 0.538345 0.529628 0.519766 0.508828 0.496885 0.484006 0.470259 0.455711 0.440424 0.424457 0.407864 0.390697 0.373003 0.556999 0.556294 0.554186 0.550695 0.545852 0.539701 0.532293 0.523686 0.513944 0.503135 0.491325 0.478584 0.464977 0.450568 0.435421 0.419591 0.403133 0.386099 0.368533 0.549306 0.548613 0.546541 0.543108 0.538345 0.532293 0.525 0.516523 0.506923 0.496264 0.484612 0.472032 0.45859 0.444347 0.429364 0.413698 0.397401 0.380524 0.363113 0.540381 0.539701 0.537669 0.534302 0.529628 0.523686 0.516523 0.508192 0.498752 0.488263 0.476789 0.464393 0.451138 0.437083 0.422289 0.406809 0.390697 0.374001 0.356766 0.530293 0.529628 0.527639 0.524343 0.519766 0.513944 0.506923 0.498752 0.489486 0.479183 0.467905 0.455711 0.442663 0.428817 0.414231 0.398959 0.383052 0.366557 0.349519 0.519115 0.518466 0.516523 0.513302 0.508828 0.503135 0.496264 0.488263 0.479183 0.469081 0.458013 0.446037 0.433211 0.419591 0.405231 0.390184 0.3745 0.358225 0.341403 0.506923 0.50629 0.504394 0.501252 0.496885 0.491325 0.484612 0.476789 0.467905 0.458013 0.447166 0.435421 0.42283 0.409449 0.395331 0.380524 0.365079 0.349039 0.332449 0.493789 0.493172 0.491325 0.488263 0.484006 0.478584 0.472032 0.464393 0.455711 0.446037 0.435421 0.423914 0.41157 0.39844 0.384573 0.37002 0.354826 0.339035 0.322689 0.479784 0.479183 0.477386 0.474405 0.470259 0.464977 0.45859 0.451138 0.442663 0.433211 0.42283 0.41157 0.399479 0.386608 0.373003 0.358712 0.34378 0.328249 0.312159 0.464977 0.464393 0.462645 0.459745 0.455711 0.450568 0.444347 0.437083 0.428817 0.419591 0.409449 0.39844 0.386608 0.374001 0.360664 0.346643 0.331981 0.316717 0.300893 0.449432 0.448865 0.447166 0.444347 0.440424 0.435421 0.429364 0.422289 0.414231 0.405231 0.395331 0.384573 0.373003 0.360664 0.347601 0.333854 0.319467 0.304479 0.288927 0.433211 0.43266 0.43101 0.42827 0.424457 0.419591 0.413698 0.406809 0.398959 0.390184 0.380524 0.37002 0.358712 0.346643 0.333854 0.320386 0.306278 0.291569 0.276294 0.416369 0.415834 0.414231 0.41157 0.407864 0.403133 0.397401 0.390697 0.383052 0.3745 0.365079 0.354826 0.34378 0.331981 0.319467 0.306278 0.292451 0.278024 0.26303 0.398959 0.39844 0.396883 0.394298 0.390697 0.386099 0.380524 0.374001 0.366557 0.358225 0.349039 0.339035 0.328249 0.316717 0.304479 0.291569 0.278024 0.263878 0.249167 0.381029 0.380524 0.379013 0.376502 0.373003 0.368533 0.363113 0.356766 0.349519 0.341403 0.332449 0.322689 0.312159 0.300893 0.288927 0.276294 0.26303 0.249167 0.234739 0.362623 0.362132 0.360664 0.358225 0.354826 0.350481 0.34521 0.339035 0.331981 0.324075 0.315347 0.305828 0.29555 0.284546 0.272848 0.26049 0.247504 0.233922 0.219776 0.34378 0.343304 0.341878 0.339508 0.336204 0.331981 0.326854 0.320846 0.313979 0.306278 0.297771 0.288488 0.278457 0.267709 0.256276 0.244189 0.231479 0.218175 0.204308 0.324537 0.324075 0.322689 0.320386 0.317175 0.313068 0.308082 0.302236 0.29555 0.288048 0.279757 0.270702 0.260913 0.250417 0.239244 0.227423 0.214984 0.201956 0.188366 0.304928 0.304479 0.303132 0.300893 0.297771 0.293778 0.288927 0.283236 0.276726 0.269418 0.261336 0.252504 0.24295 0.2327 0.221781 0.210222 0.198049 0.185291 0.171975 0.284983 0.284546 0.283236 0.28106 0.278024 0.274138 0.269418 0.263878 0.257538 0.250417 0.242537 0.233922 0.224597 0.214586 0.203916 0.192612 0.180702 0.16821 0.155163 0.264728 0.264303 0.26303 0.260913 0.257959 0.254178 0.249583 0.244189 0.238012 0.231072 0.223389 0.214984 0.205881 0.196103 0.185675 0.174621 0.162967 0.150736 0.137953 0.244189 0.243776 0.242537 0.240477 0.237602 0.233922 0.229448 0.224194 0.218175 0.211409 0.203916 0.195715 0.186827 0.177276 0.167083 0.156273 0.144868 0.132893 0.120369 0.223389 0.222986 0.221781 0.219776 0.216977 0.213393 0.209035 0.203916 0.198049 0.191452 0.184142 0.176137 0.167459 0.158127 0.148164 0.137591 0.12643 0.114703 0.102434 0.202347 0.201956 0.200782 0.198829 0.196103 0.192612 0.188366 0.183376 0.177656 0.171221 0.164087 0.156273 0.147797 0.138678 0.128937 0.118595 0.107672 0.0961886 0.084167 0.181083 0.180702 0.179558 0.177656 0.175 0.171598 0.167459 0.162593 0.157014 0.150736 0.143773 0.136142 0.127862 0.118949 0.109424 0.0993058 0.0886137 0.0773679 0.0655884 0.55 0.549306 0.547231 0.543793 0.539023 0.532961 0.525658 0.51717 0.507557 0.496885 0.485218 0.472624 0.459167 0.44491 0.429912 0.414231 0.39792 0.381029 0.363604 0.549306 0.548613 0.546541 0.543108 0.538345 0.532293 0.525 0.516523 0.506923 0.496264 0.484612 0.472032 0.45859 0.444347 0.429364 0.413698 0.397401 0.380524 0.363113 0.547231 0.546541 0.544478 0.541061 0.536319 0.530293 0.52303 0.514588 0.505025 0.494406 0.482796 0.470259 0.456861 0.442663 0.427724 0.412101 0.395848 0.379013 0.361643 0.543793 0.543108 0.541061 0.537669 0.532961 0.526978 0.519766 0.511379 0.501879 0.491325 0.479784 0.467318 0.453992 0.439866 0.425 0.409449 0.393267 0.376502 0.3592 0.539023 0.538345 0.536319 0.532961 0.528301 0.522376 0.515232 0.506923 0.497506 0.487043 0.475596 0.463227 0.45 0.435974 0.421208 0.405757 0.389672 0.373003 0.355795 0.532961 0.532293 0.530293 0.526978 0.522376 0.516523 0.509465 0.501252 0.49194 0.481589 0.470259 0.458013 0.44491 0.43101 0.416369 0.401043 0.385081 0.368533 0.351444 0.525658 0.525 0.52303 0.519766 0.515232 0.509465 0.502506 0.494406 0.485218 0.475 0.46381 0.451707 0.438751 0.425 0.410509 0.395331 0.379516 0.363113 0.346165 0.51717 0.516523 0.514588 0.511379 0.506923 0.501252 0.494406 0.486434 0.477386 0.467318 0.456286 0.444347 0.431559 0.417978 0.403657 0.388649 0.373003 0.356766 0.339981 0.507557 0.506923 0.505025 0.501879 0.497506 0.49194 0.485218 0.477386 0.468493 0.45859 0.447732 0.435974 0.423372 0.409979 0.395848 0.381029 0.365571 0.349519 0.332917 0.496885 0.496264 0.494406 0.491325 0.487043 0.481589 0.475 0.467318 0.45859 0.448865 0.438195 0.426633 0.414231 0.401043 0.387117 0.372505 0.357252 0.341403 0.325 0.485218 0.484612 0.482796 0.479784 0.475596 0.470259 0.46381 0.456286 0.447732 0.438195 0.427724 0.416369 0.404181 0.39121 0.377505 0.363113 0.34808 0.332449 0.31626 0.472624 0.472032 0.470259 0.467318 0.463227 0.458013 0.451707 0.444347 0.435974 0.426633 0.416369 0.405231 0.393267 0.380524 0.367051 0.352891 0.33809 0.322689 0.306729 0.459167 0.45859 0.456861 0.453992 0.45 0.44491 0.438751 0.431559 0.423372 0.414231 0.404181 0.393267 0.381534 0.369029 0.355795 0.341878 0.327319 0.312159 0.296438 0.44491 0.444347 0.442663 0.439866 0.435974 0.43101 0.425 0.417978 0.409979 0.401043 0.39121 0.380524 0.369029 0.356766 0.34378 0.330112 0.315803 0.300893 0.28542 0.429912 0.429364 0.427724 0.425 0.421208 0.416369 0.410509 0.403657 0.395848 0.387117 0.377505 0.367051 0.355795 0.34378 0.331046 0.317633 0.303581 0.288927 0.273708 0.414231 0.413698 0.412101 0.409449 0.405757 0.401043 0.395331 0.388649 0.381029 0.372505 0.363113 0.352891 0.341878 0.330112 0.317633 0.304479 0.290687 0.276294 0.261336 0.39792 0.397401 0.395848 0.393267 0.389672 0.385081 0.379516 0.373003 0.365571 0.357252 0.34808 0.33809 0.327319 0.315803 0.303581 0.290687 0.277158 0.26303 0.248335 0.381029 0.380524 0.379013 0.376502 0.373003 0.368533 0.363113 0.356766 0.349519 0.341403 0.332449 0.322689 0.312159 0.300893 0.288927 0.276294 0.26303 0.249167 0.234739 0.363604 0.363113 0.361643 0.3592 0.355795 0.351444 0.346165 0.339981 0.332917 0.325 0.31626 0.306729 0.296438 0.28542 0.273708 0.261336 0.248335 0.234739 0.220577 0.345687 0.34521 0.34378 0.341403 0.33809 0.333854 0.328714 0.322689 0.315803 0.308082 0.299554 0.290247 0.280191 0.269418 0.257959 0.245845 0.233107 0.219776 0.205881 0.327319 0.326854 0.325463 0.323151 0.319926 0.315803 0.310798 0.304928 0.298217 0.290687 0.282365 0.273278 0.263454 0.252922 0.241712 0.229854 0.217376 0.204308 0.190679 0.308534 0.308082 0.306729 0.304479 0.301341 0.297327 0.292451 0.286733 0.280191 0.272848 0.264728 0.255856 0.246259 0.235965 0.225 0.213393 0.201173 0.188366 0.175 0.289366 0.288927 0.28761 0.28542 0.282365 0.278457 0.273708 0.268136 0.261759 0.254597 0.246674 0.238012 0.228638 0.218575 0.207851 0.196492 0.184525 0.171975 0.15887 0.269846 0.269418 0.268136 0.266004 0.26303 0.259223 0.254597 0.249167 0.24295 0.235965 0.228233 0.219776 0.210617 0.200782 0.190293 0.179177 0.167459 0.155163 0.142314 0.25 0.249583 0.248335 0.246259 0.243363 0.239655 0.235147 0.229854 0.223791 0.216977 0.209431 0.201173 0.192225 0.182611 0.172353 0.161475 0.15 0.137953 0.125357 0.229854 0.229448 0.228233 0.226211 0.223389 0.219776 0.215382 0.210222 0.204308 0.19766 0.190293 0.182229 0.173486 0.164087 0.154054 0.143408 0.132172 0.120369 0.108022 0.209431 0.209035 0.207851 0.205881 0.203131 0.199609 0.195326 0.190293 0.184525 0.178036 0.170844 0.162967 0.154423 0.145234 0.135419 0.125 0.113998 0.102434 0.0903297 0.188751 0.188366 0.187212 0.185291 0.182611 0.179177 0.175 0.17009 0.164461 0.158127 0.151104 0.143408 0.135058 0.126072 0.11647 0.106272 0.0954974 0.084167 0.0723012 0.167834 0.167459 0.166333 0.164461 0.161847 0.158498 0.154423 0.149632 0.144138 0.137953 0.131093 0.123573 0.11541 0.106622 0.0972265 0.0872432 0.0766907 0.0655884 0.0539556 0.525 0.524343 0.522376 0.519115 0.514588 0.508828 0.501879 0.493789 0.484612 0.474405 0.463227 0.451138 0.438195 0.424457 0.409979 0.394814 0.379013 0.362623 0.345687 0.524343 0.523686 0.521722 0.518466 0.513944 0.508192 0.501252 0.493172 0.484006 0.473811 0.462645 0.450568 0.437639 0.423914 0.409449 0.394298 0.37851 0.362132 0.34521 0.522376 0.521722 0.519766 0.516523 0.512019 0.50629 0.499375 0.491325 0.482192 0.472032 0.460904 0.448865 0.435974 0.422289 0.407864 0.392752 0.377003 0.360664 0.34378 0.519115 0.518466 0.516523 0.513302 0.508828 0.503135 0.496264 0.488263 0.479183 0.469081 0.458013 0.446037 0.433211 0.419591 0.405231 0.390184 0.3745 0.358225 0.341403 0.514588 0.513944 0.512019 0.508828 0.504394 0.498752 0.49194 0.484006 0.475 0.464977 0.453992 0.442102 0.429364 0.415834 0.401565 0.386608 0.371013 0.354826 0.33809 0.508828 0.508192 0.50629 0.503135 0.498752 0.493172 0.486434 0.478584 0.46967 0.459745 0.448865 0.437083 0.424457 0.411039 0.396883 0.38204 0.366557 0.350481 0.333854 0.501879 0.501252 0.499375 0.496264 0.49194 0.486434 0.479784 0.472032 0.463227 0.45342 0.442663 0.43101 0.418515 0.405231 0.39121 0.376502 0.361153 0.34521 0.328714 0.493789 0.493172 0.491325 0.488263 0.484006 0.478584 0.472032 0.464393 0.455711 0.446037 0.435421 0.423914 0.41157 0.39844 0.384573 0.37002 0.354826 0.339035 0.322689 0.484612 0.484006 0.482192 0.479183 0.475 0.46967 0.463227 0.455711 0.447166 0.437639 0.427178 0.415834 0.403657 0.390697 0.377003 0.362623 0.347601 0.331981 0.315803 0.474405 0.473811 0.472032 0.469081 0.464977 0.459745 0.45342 0.446037 0.437639 0.42827 0.417978 0.406809 0.394814 0.38204 0.368533 0.354341 0.339508 0.324075 0.308082 0.463227 0.462645 0.460904 0.458013 0.453992 0.448865 0.442663 0.435421 0.427178 0.417978 0.407864 0.396883 0.385081 0.372505 0.3592 0.34521 0.330579 0.315347 0.299554 0.451138 0.450568 0.448865 0.446037 0.442102 0.437083 0.43101 0.423914 0.415834 0.406809 0.396883 0.386099 0.3745 0.362132 0.349039 0.335263 0.320846 0.305828 0.290247 0.438195 0.437639 0.435974 0.433211 0.429364 0.424457 0.418515 0.41157 0.403657 0.394814 0.385081 0.3745 0.363113 0.350962 0.33809 0.324537 0.310344 0.29555 0.280191 0.424457 0.423914 0.422289 0.419591 0.415834 0.411039 0.405231 0.39844 0.390697 0.38204 0.372505 0.362132 0.350962 0.339035 0.32639 0.313068 0.299108 0.284546 0.269418 0.409979 0.409449 0.407864 0.405231 0.401565 0.396883 0.39121 0.384573 0.377003 0.368533 0.3592 0.349039 0.33809 0.32639 0.313979 0.300893 0.287171 0.272848 0.257959 0.394814 0.394298 0.392752 0.390184 0.386608 0.38204 0.376502 0.37002 0.362623 0.354341 0.34521 0.335263 0.324537 0.313068 0.300893 0.288048 0.274569 0.26049 0.245845 0.379013 0.37851 0.377003 0.3745 0.371013 0.366557 0.361153 0.354826 0.347601 0.339508 0.330579 0.320846 0.310344 0.299108 0.287171 0.274569 0.261336 0.247504 0.233107 0.362623 0.362132 0.360664 0.358225 0.354826 0.350481 0.34521 0.339035 0.331981 0.324075 0.315347 0.305828 0.29555 0.284546 0.272848 0.26049 0.247504 0.233922 0.219776 0.345687 0.34521 0.34378 0.341403 0.33809 0.333854 0.328714 0.322689 0.315803 0.308082 0.299554 0.290247 0.280191 0.269418 0.257959 0.245845 0.233107 0.219776 0.205881 0.328249 0.327784 0.32639 0.324075 0.320846 0.316717 0.311705 0.305828 0.299108 0.291569 0.283236 0.274138 0.264303 0.253759 0.242537 0.230666 0.218175 0.205094 0.191452 0.310344 0.309891 0.308534 0.306278 0.303132 0.299108 0.29422 0.288488 0.28193 0.274569 0.26643 0.257538 0.24792 0.237602 0.226615 0.214984 0.202739 0.189907 0.176517 0.29201 0.291569 0.290247 0.288048 0.284983 0.28106 0.276294 0.270702 0.264303 0.257117 0.249167 0.240477 0.231072 0.220978 0.210222 0.198829 0.186827 0.174243 0.161102 0.273278 0.272848 0.27156 0.269418 0.26643 0.262606 0.257959 0.252504 0.246259 0.239244 0.231479 0.222986 0.213791 0.203916 0.193387 0.182229 0.170467 0.158127 0.145234 0.254178 0.253759 0.252504 0.250417 0.247504 0.243776 0.239244 0.233922 0.227828 0.220978 0.213393 0.205094 0.196103 0.186443 0.176137 0.16521 0.153684 0.141586 0.128937 0.234739 0.23433 0.233107 0.231072 0.228233 0.224597 0.220176 0.214984 0.209035 0.202347 0.194938 0.186827 0.178036 0.168586 0.158498 0.147797 0.136504 0.124643 0.112236 0.214984 0.214586 0.213393 0.211409 0.20864 0.205094 0.200782 0.195715 0.189907 0.183376 0.176137 0.16821 0.159613 0.150368 0.140494 0.130014 0.118949 0.107321 0.0951519 0.194938 0.19455 0.193387 0.191452 0.188751 0.185291 0.181083 0.176137 0.170467 0.164087 0.157014 0.149265 0.140858 0.131812 0.122148 0.111884 0.101042 0.0896429 0.0777067 0.174621 0.174243 0.173108 0.171221 0.168586 0.16521 0.161102 0.156273 0.150736 0.144503 0.137591 0.130014 0.121792 0.11294 0.103479 0.0934268 0.0828032 0.0716278 0.0599202 0.154054 0.153684 0.152577 0.150736 0.148164 0.144868 0.140858 0.136142 0.130733 0.124643 0.117886 0.110478 0.102434 0.0937716 0.0845083 0.0746622 0.0642516 0.0532952 0.0418116 0.5 0.499375 0.497506 0.494406 0.490098 0.484612 0.477985 0.470259 0.461484 0.451707 0.440983 0.429364 0.416905 0.403657 0.389672 0.375 0.359688 0.34378 0.327319 0.499375 0.498752 0.496885 0.493789 0.489486 0.484006 0.477386 0.46967 0.460904 0.451138 0.440424 0.428817 0.416369 0.403133 0.38916 0.3745 0.3592 0.343304 0.326854 0.497506 0.496885 0.495025 0.49194 0.487652 0.482192 0.475596 0.467905 0.459167 0.449432 0.438751 0.427178 0.414765 0.401565 0.387628 0.373003 0.357738 0.341878 0.325463 0.494406 0.493789 0.49194 0.488874 0.484612 0.479183 0.472624 0.464977 0.456286 0.446601 0.435974 0.424457 0.412101 0.398959 0.385081 0.370516 0.35531 0.339508 0.323151 0.490098 0.489486 0.487652 0.484612 0.480385 0.475 0.468493 0.460904 0.452277 0.442663 0.432109 0.420668 0.408392 0.395331 0.381534 0.367051 0.351926 0.336204 0.319926 0.484612 0.484006 0.482192 0.479183 0.475 0.46967 0.463227 0.455711 0.447166 0.437639 0.427178 0.415834 0.403657 0.390697 0.377003 0.362623 0.347601 0.331981 0.315803 0.477985 0.477386 0.475596 0.472624 0.468493 0.463227 0.456861 0.449432 0.440983 0.431559 0.421208 0.409979 0.39792 0.385081 0.37151 0.357252 0.342353 0.326854 0.310798 0.470259 0.46967 0.467905 0.464977 0.460904 0.455711 0.449432 0.442102 0.433762 0.424457 0.414231 0.403133 0.39121 0.37851 0.365079 0.350962 0.336204 0.320846 0.304928 0.461484 0.460904 0.459167 0.456286 0.452277 0.447166 0.440983 0.433762 0.425544 0.416369 0.406283 0.395331 0.383559 0.371013 0.357738 0.34378 0.32918 0.313979 0.298217 0.451707 0.451138 0.449432 0.446601 0.442663 0.437639 0.431559 0.424457 0.416369 0.407337 0.397401 0.386608 0.375 0.362623 0.349519 0.335733 0.321306 0.306278 0.290687 0.440983 0.440424 0.438751 0.435974 0.432109 0.427178 0.421208 0.414231 0.406283 0.397401 0.387628 0.377003 0.365571 0.353374 0.340455 0.326854 0.312614 0.297771 0.282365 0.429364 0.428817 0.427178 0.424457 0.420668 0.415834 0.409979 0.403133 0.395331 0.386608 0.377003 0.366557 0.35531 0.343304 0.330579 0.317175 0.303132 0.288488 0.273278 0.416905 0.416369 0.414765 0.412101 0.408392 0.403657 0.39792 0.39121 0.383559 0.375 0.365571 0.35531 0.344256 0.332449 0.319926 0.306729 0.292893 0.278457 0.263454 0.403657 0.403133 0.401565 0.398959 0.395331 0.390697 0.385081 0.37851 0.371013 0.362623 0.353374 0.343304 0.332449 0.320846 0.308534 0.29555 0.28193 0.267709 0.252922 0.389672 0.38916 0.387628 0.385081 0.381534 0.377003 0.37151 0.365079 0.357738 0.349519 0.340455 0.330579 0.319926 0.308534 0.296438 0.283673 0.270274 0.256276 0.241712 0.375 0.3745 0.373003 0.370516 0.367051 0.362623 0.357252 0.350962 0.34378 0.335733 0.326854 0.317175 0.306729 0.29555 0.283673 0.271131 0.257959 0.244189 0.229854 0.359688 0.3592 0.357738 0.35531 0.351926 0.347601 0.342353 0.336204 0.32918 0.321306 0.312614 0.303132 0.292893 0.28193 0.270274 0.257959 0.245017 0.231479 0.217376 0.34378 0.343304 0.341878 0.339508 0.336204 0.331981 0.326854 0.320846 0.313979 0.306278 0.297771 0.288488 0.278457 0.267709 0.256276 0.244189 0.231479 0.218175 0.204308 0.327319 0.326854 0.325463 0.323151 0.319926 0.315803 0.310798 0.304928 0.298217 0.290687 0.282365 0.273278 0.263454 0.252922 0.241712 0.229854 0.217376 0.204308 0.190679 0.310344 0.309891 0.308534 0.306278 0.303132 0.299108 0.29422 0.288488 0.28193 0.274569 0.26643 0.257538 0.24792 0.237602 0.226615 0.214984 0.202739 0.189907 0.176517 0.292893 0.292451 0.291128 0.288927 0.285857 0.28193 0.277158 0.27156 0.265153 0.257959 0.25 0.2413 0.231885 0.221781 0.211013 0.199609 0.187596 0.175 0.161847 0.275 0.274569 0.273278 0.271131 0.268136 0.264303 0.259645 0.254178 0.24792 0.240889 0.233107 0.224597 0.215382 0.205488 0.194938 0.183759 0.171975 0.159613 0.146698 0.256697 0.256276 0.255017 0.252922 0.25 0.246259 0.241712 0.236374 0.23026 0.223389 0.215781 0.207457 0.198439 0.188751 0.178416 0.167459 0.155903 0.143773 0.131093 0.238012 0.237602 0.236374 0.23433 0.231479 0.227828 0.223389 0.218175 0.212202 0.205488 0.198049 0.189907 0.181083 0.171598 0.161475 0.150736 0.139404 0.127504 0.115056 0.218975 0.218575 0.217376 0.215382 0.212599 0.209035 0.204701 0.199609 0.193774 0.187212 0.179939 0.171975 0.16334 0.154054 0.144138 0.133614 0.122504 0.110829 0.0986122 0.199609 0.199219 0.198049 0.196103 0.193387 0.189907 0.185675 0.180702 0.175 0.168586 0.161475 0.153684 0.145234 0.136142 0.12643 0.116117 0.105223 0.0937716 0.0817816 0.179939 0.179558 0.178416 0.176517 0.173864 0.170467 0.166333 0.161475 0.155903 0.149632 0.142679 0.135058 0.126788 0.117886 0.108372 0.0982656 0.0875856 0.0763523 0.0645857 0.159985 0.159613 0.158498 0.156644 0.154054 0.150736 0.146698 0.14195 0.136504 0.130374 0.123573 0.116117 0.108022 0.0993058 0.0899863 0.0800815 0.0696103 0.0585915 0.0470441 0.139767 0.139404 0.138316 0.136504 0.133975 0.130733 0.126788 0.122148 0.116824 0.110829 0.104176 0.0968804 0.0889566 0.0804213 0.0712912 0.0615838 0.0513167 0.0405079 0.0291756 0.475 0.474405 0.472624 0.46967 0.465561 0.460324 0.453992 0.446601 0.438195 0.428817 0.418515 0.407337 0.395331 0.382546 0.369029 0.354826 0.339981 0.324537 0.308534 0.474405 0.473811 0.472032 0.469081 0.464977 0.459745 0.45342 0.446037 0.437639 0.42827 0.417978 0.406809 0.394814 0.38204 0.368533 0.354341 0.339508 0.324075 0.308082 0.472624 0.472032 0.470259 0.467318 0.463227 0.458013 0.451707 0.444347 0.435974 0.426633 0.416369 0.405231 0.393267 0.380524 0.367051 0.352891 0.33809 0.322689 0.306729 0.46967 0.469081 0.467318 0.464393 0.460324 0.455138 0.448865 0.441542 0.433211 0.423914 0.413698 0.40261 0.390697 0.378007 0.364587 0.350481 0.335733 0.320386 0.304479 0.465561 0.464977 0.463227 0.460324 0.456286 0.451138 0.44491 0.437639 0.429364 0.420129 0.409979 0.398959 0.387117 0.3745 0.361153 0.347122 0.332449 0.317175 0.301341 0.460324 0.459745 0.458013 0.455138 0.451138 0.446037 0.439866 0.43266 0.424457 0.415299 0.405231 0.394298 0.382546 0.37002 0.356766 0.342828 0.328249 0.313068 0.297327 0.453992 0.45342 0.451707 0.448865 0.44491 0.439866 0.433762 0.426633 0.418515 0.409449 0.399479 0.388649 0.377003 0.364587 0.351444 0.337618 0.323151 0.308082 0.292451 0.446601 0.446037 0.444347 0.441542 0.437639 0.43266 0.426633 0.419591 0.41157 0.40261 0.392752 0.38204 0.370516 0.358225 0.34521 0.331513 0.317175 0.302236 0.286733 0.438195 0.437639 0.435974 0.433211 0.429364 0.424457 0.418515 0.41157 0.403657 0.394814 0.385081 0.3745 0.363113 0.350962 0.33809 0.324537 0.310344 0.29555 0.280191 0.428817 0.42827 0.426633 0.423914 0.420129 0.415299 0.409449 0.40261 0.394814 0.386099 0.376502 0.366064 0.354826 0.342828 0.330112 0.316717 0.302684 0.288048 0.272848 0.418515 0.417978 0.416369 0.413698 0.409979 0.405231 0.399479 0.392752 0.385081 0.376502 0.367051 0.356766 0.345687 0.333854 0.321306 0.308082 0.29422 0.279757 0.264728 0.407337 0.406809 0.405231 0.40261 0.398959 0.394298 0.388649 0.38204 0.3745 0.366064 0.356766 0.346643 0.335733 0.324075 0.311705 0.298662 0.284983 0.270702 0.255856 0.395331 0.394814 0.393267 0.390697 0.387117 0.382546 0.377003 0.370516 0.363113 0.354826 0.345687 0.335733 0.325 0.313523 0.301341 0.288488 0.275 0.260913 0.246259 0.382546 0.38204 0.380524 0.378007 0.3745 0.37002 0.364587 0.358225 0.350962 0.342828 0.333854 0.324075 0.313523 0.302236 0.290247 0.277591 0.264303 0.250417 0.235965 0.369029 0.368533 0.367051 0.364587 0.361153 0.356766 0.351444 0.34521 0.33809 0.330112 0.321306 0.311705 0.301341 0.290247 0.278457 0.266004 0.252922 0.239244 0.225 0.354826 0.354341 0.352891 0.350481 0.347122 0.342828 0.337618 0.331513 0.324537 0.316717 0.308082 0.298662 0.288488 0.277591 0.266004 0.253759 0.240889 0.227423 0.213393 0.339981 0.339508 0.33809 0.335733 0.332449 0.328249 0.323151 0.317175 0.310344 0.302684 0.29422 0.284983 0.275 0.264303 0.252922 0.240889 0.228233 0.214984 0.201173 0.324537 0.324075 0.322689 0.320386 0.317175 0.313068 0.308082 0.302236 0.29555 0.288048 0.279757 0.270702 0.260913 0.250417 0.239244 0.227423 0.214984 0.201956 0.188366 0.308534 0.308082 0.306729 0.304479 0.301341 0.297327 0.292451 0.286733 0.280191 0.272848 0.264728 0.255856 0.246259 0.235965 0.225 0.213393 0.201173 0.188366 0.175 0.29201 0.291569 0.290247 0.288048 0.284983 0.28106 0.276294 0.270702 0.264303 0.257117 0.249167 0.240477 0.231072 0.220978 0.210222 0.198829 0.186827 0.174243 0.161102 0.275 0.274569 0.273278 0.271131 0.268136 0.264303 0.259645 0.254178 0.24792 0.240889 0.233107 0.224597 0.215382 0.205488 0.194938 0.183759 0.171975 0.159613 0.146698 0.257538 0.257117 0.255856 0.253759 0.250834 0.247089 0.242537 0.237193 0.231072 0.224194 0.216578 0.208246 0.199219 0.189522 0.179177 0.16821 0.156644 0.144503 0.131812 0.239655 0.239244 0.238012 0.235965 0.233107 0.229448 0.225 0.219776 0.213791 0.207062 0.199609 0.191452 0.182611 0.173108 0.162967 0.152209 0.140858 0.128937 0.11647 0.221379 0.220978 0.219776 0.217776 0.214984 0.211409 0.207062 0.201956 0.196103 0.189522 0.182229 0.174243 0.165584 0.156273 0.146331 0.135781 0.124643 0.11294 0.100695 0.202739 0.202347 0.201173 0.199219 0.196492 0.192999 0.188751 0.183759 0.178036 0.171598 0.164461 0.156644 0.148164 0.139041 0.129296 0.118949 0.108022 0.0965345 0.0845083 0.183759 0.183376 0.182229 0.18032 0.177656 0.174243 0.17009 0.16521 0.159613 0.153315 0.146331 0.138678 0.130374 0.121436 0.111884 0.101738 0.0910171 0.0797419 0.0679324 0.164461 0.164087 0.162967 0.161102 0.158498 0.155163 0.151104 0.146331 0.140858 0.134697 0.127862 0.120369 0.112236 0.103479 0.0941165 0.084167 0.0736496 0.0625833 0.0509874 0.144868 0.144503 0.143408 0.141586 0.139041 0.135781 0.131812 0.127145 0.121792 0.115763 0.109074 0.101738 0.0937716 0.0851913 0.0760141 0.0662575 0.0559396 0.0450785 0.0336926 0.125 0.124643 0.123573 0.121792 0.119304 0.116117 0.112236 0.107672 0.102434 0.0965345 0.0899863 0.0828032 0.075 0.0665923 0.0575962 0.0480284 0.0379059 0.0272462 0.0160666 0.45 0.449432 0.447732 0.44491 0.440983 0.435974 0.429912 0.42283 0.414765 0.405757 0.395848 0.385081 0.373502 0.361153 0.34808 0.334324 0.319926 0.304928 0.289366 0.449432 0.448865 0.447166 0.444347 0.440424 0.435421 0.429364 0.422289 0.414231 0.405231 0.395331 0.384573 0.373003 0.360664 0.347601 0.333854 0.319467 0.304479 0.288927 0.447732 0.447166 0.445473 0.442663 0.438751 0.433762 0.427724 0.420668 0.412633 0.403657 0.393782 0.383052 0.37151 0.3592 0.346165 0.332449 0.318091 0.303132 0.28761 0.44491 0.444347 0.442663 0.439866 0.435974 0.43101 0.425 0.417978 0.409979 0.401043 0.39121 0.380524 0.369029 0.356766 0.34378 0.330112 0.315803 0.300893 0.28542 0.440983 0.440424 0.438751 0.435974 0.432109 0.427178 0.421208 0.414231 0.406283 0.397401 0.387628 0.377003 0.365571 0.353374 0.340455 0.326854 0.312614 0.297771 0.282365 0.435974 0.435421 0.433762 0.43101 0.427178 0.422289 0.416369 0.409449 0.401565 0.392752 0.383052 0.372505 0.361153 0.349039 0.336204 0.322689 0.308534 0.293778 0.278457 0.429912 0.429364 0.427724 0.425 0.421208 0.416369 0.410509 0.403657 0.395848 0.387117 0.377505 0.367051 0.355795 0.34378 0.331046 0.317633 0.303581 0.288927 0.273708 0.42283 0.422289 0.420668 0.417978 0.414231 0.409449 0.403657 0.396883 0.38916 0.380524 0.371013 0.360664 0.349519 0.337618 0.325 0.311705 0.297771 0.283236 0.268136 0.414765 0.414231 0.412633 0.409979 0.406283 0.401565 0.395848 0.38916 0.381534 0.373003 0.363604 0.353374 0.342353 0.330579 0.318091 0.304928 0.291128 0.276726 0.261759 0.405757 0.405231 0.403657 0.401043 0.397401 0.392752 0.387117 0.380524 0.373003 0.364587 0.35531 0.34521 0.334324 0.322689 0.310344 0.297327 0.283673 0.269418 0.254597 0.395848 0.395331 0.393782 0.39121 0.387628 0.383052 0.377505 0.371013 0.363604 0.35531 0.346165 0.336204 0.325463 0.313979 0.301788 0.288927 0.275431 0.261336 0.246674 0.385081 0.384573 0.383052 0.380524 0.377003 0.372505 0.367051 0.360664 0.353374 0.34521 0.336204 0.32639 0.315803 0.304479 0.292451 0.279757 0.26643 0.252504 0.238012 0.373502 0.373003 0.37151 0.369029 0.365571 0.361153 0.355795 0.349519 0.342353 0.334324 0.325463 0.315803 0.305378 0.29422 0.282365 0.269846 0.256697 0.24295 0.228638 0.361153 0.360664 0.3592 0.356766 0.353374 0.349039 0.34378 0.337618 0.330579 0.322689 0.313979 0.304479 0.29422 0.283236 0.27156 0.259223 0.246259 0.2327 0.218575 0.34808 0.347601 0.346165 0.34378 0.340455 0.336204 0.331046 0.325 0.318091 0.310344 0.301788 0.292451 0.282365 0.27156 0.260068 0.24792 0.235147 0.221781 0.207851 0.334324 0.333854 0.332449 0.330112 0.326854 0.322689 0.317633 0.311705 0.304928 0.297327 0.288927 0.279757 0.269846 0.259223 0.24792 0.235965 0.223389 0.210222 0.196492 0.319926 0.319467 0.318091 0.315803 0.312614 0.308534 0.303581 0.297771 0.291128 0.283673 0.275431 0.26643 0.256697 0.246259 0.235147 0.223389 0.211013 0.198049 0.184525 0.304928 0.304479 0.303132 0.300893 0.297771 0.293778 0.288927 0.283236 0.276726 0.269418 0.261336 0.252504 0.24295 0.2327 0.221781 0.210222 0.198049 0.185291 0.171975 0.289366 0.288927 0.28761 0.28542 0.282365 0.278457 0.273708 0.268136 0.261759 0.254597 0.246674 0.238012 0.228638 0.218575 0.207851 0.196492 0.184525 0.171975 0.15887 0.273278 0.272848 0.27156 0.269418 0.26643 0.262606 0.257959 0.252504 0.246259 0.239244 0.231479 0.222986 0.213791 0.203916 0.193387 0.182229 0.170467 0.158127 0.145234 0.256697 0.256276 0.255017 0.252922 0.25 0.246259 0.241712 0.236374 0.23026 0.223389 0.215781 0.207457 0.198439 0.188751 0.178416 0.167459 0.155903 0.143773 0.131093 0.239655 0.239244 0.238012 0.235965 0.233107 0.229448 0.225 0.219776 0.213791 0.207062 0.199609 0.191452 0.182611 0.173108 0.162967 0.152209 0.140858 0.128937 0.11647 0.222183 0.221781 0.220577 0.218575 0.215781 0.212202 0.207851 0.202739 0.196881 0.190293 0.182993 0.175 0.166333 0.157014 0.147064 0.136504 0.125357 0.113645 0.10139 0.204308 0.203916 0.202739 0.200782 0.198049 0.19455 0.190293 0.185291 0.179558 0.173108 0.165959 0.158127 0.149632 0.140494 0.130733 0.120369 0.109424 0.0979191 0.0858747 0.186059 0.185675 0.184525 0.182611 0.179939 0.176517 0.172353 0.167459 0.161847 0.155533 0.148531 0.140858 0.132532 0.123573 0.113998 0.103828 0.0930821 0.0817816 0.0699462 0.167459 0.167083 0.165959 0.164087 0.161475 0.158127 0.154054 0.149265 0.143773 0.137591 0.130733 0.123216 0.115056 0.106272 0.0968804 0.0869009 0.0763523 0.065254 0.0536253 0.148531 0.148164 0.147064 0.145234 0.142679 0.139404 0.135419 0.130733 0.125357 0.119304 0.112588 0.105223 0.0972265 0.0886137 0.0794024 0.0696103 0.0592556 0.0483567 0.036932 0.129296 0.128937 0.127862 0.126072 0.123573 0.120369 0.11647 0.111884 0.106622 0.100695 0.0941165 0.0869009 0.079063 0.0706185 0.0615838 0.0519757 0.0418116 0.0311089 0.0198852 0.109775 0.109424 0.108372 0.106622 0.104176 0.101042 0.0972265 0.0927376 0.0875856 0.0817816 0.0753379 0.0682677 0.0605853 0.0523054 0.0434437 0.034016 0.0240389 0.013529 0.00250313 0.425 0.424457 0.42283 0.420129 0.416369 0.41157 0.405757 0.398959 0.39121 0.382546 0.373003 0.362623 0.351444 0.339508 0.326854 0.313523 0.299554 0.284983 0.269846 0.424457 0.423914 0.422289 0.419591 0.415834 0.411039 0.405231 0.39844 0.390697 0.38204 0.372505 0.362132 0.350962 0.339035 0.32639 0.313068 0.299108 0.284546 0.269418 0.42283 0.422289 0.420668 0.417978 0.414231 0.409449 0.403657 0.396883 0.38916 0.380524 0.371013 0.360664 0.349519 0.337618 0.325 0.311705 0.297771 0.283236 0.268136 0.420129 0.419591 0.417978 0.415299 0.41157 0.406809 0.401043 0.394298 0.386608 0.378007 0.368533 0.358225 0.347122 0.335263 0.322689 0.309439 0.29555 0.28106 0.266004 0.416369 0.415834 0.414231 0.41157 0.407864 0.403133 0.397401 0.390697 0.383052 0.3745 0.365079 0.354826 0.34378 0.331981 0.319467 0.306278 0.292451 0.278024 0.26303 0.41157 0.411039 0.409449 0.406809 0.403133 0.39844 0.392752 0.386099 0.37851 0.37002 0.360664 0.350481 0.339508 0.327784 0.315347 0.302236 0.288488 0.274138 0.259223 0.405757 0.405231 0.403657 0.401043 0.397401 0.392752 0.387117 0.380524 0.373003 0.364587 0.35531 0.34521 0.334324 0.322689 0.310344 0.297327 0.283673 0.269418 0.254597 0.398959 0.39844 0.396883 0.394298 0.390697 0.386099 0.380524 0.374001 0.366557 0.358225 0.349039 0.339035 0.328249 0.316717 0.304479 0.291569 0.278024 0.263878 0.249167 0.39121 0.390697 0.38916 0.386608 0.383052 0.37851 0.373003 0.366557 0.3592 0.350962 0.341878 0.331981 0.321306 0.309891 0.297771 0.284983 0.27156 0.257538 0.24295 0.382546 0.38204 0.380524 0.378007 0.3745 0.37002 0.364587 0.358225 0.350962 0.342828 0.333854 0.324075 0.313523 0.302236 0.290247 0.277591 0.264303 0.250417 0.235965 0.373003 0.372505 0.371013 0.368533 0.365079 0.360664 0.35531 0.349039 0.341878 0.333854 0.325 0.315347 0.304928 0.293778 0.28193 0.269418 0.256276 0.242537 0.228233 0.362623 0.362132 0.360664 0.358225 0.354826 0.350481 0.34521 0.339035 0.331981 0.324075 0.315347 0.305828 0.29555 0.284546 0.272848 0.26049 0.247504 0.233922 0.219776 0.351444 0.350962 0.349519 0.347122 0.34378 0.339508 0.334324 0.328249 0.321306 0.313523 0.304928 0.29555 0.28542 0.274569 0.26303 0.250834 0.238012 0.224597 0.210617 0.339508 0.339035 0.337618 0.335263 0.331981 0.327784 0.322689 0.316717 0.309891 0.302236 0.293778 0.284546 0.274569 0.263878 0.252504 0.240477 0.227828 0.214586 0.200782 0.326854 0.32639 0.325 0.322689 0.319467 0.315347 0.310344 0.304479 0.297771 0.290247 0.28193 0.272848 0.26303 0.252504 0.2413 0.229448 0.216977 0.203916 0.190293 0.313523 0.313068 0.311705 0.309439 0.306278 0.302236 0.297327 0.291569 0.284983 0.277591 0.269418 0.26049 0.250834 0.240477 0.229448 0.217776 0.205488 0.192612 0.179177 0.299554 0.299108 0.297771 0.29555 0.292451 0.288488 0.283673 0.278024 0.27156 0.264303 0.256276 0.247504 0.238012 0.227828 0.216977 0.205488 0.193387 0.180702 0.167459 0.284983 0.284546 0.283236 0.28106 0.278024 0.274138 0.269418 0.263878 0.257538 0.250417 0.242537 0.233922 0.224597 0.214586 0.203916 0.192612 0.180702 0.16821 0.155163 0.269846 0.269418 0.268136 0.266004 0.26303 0.259223 0.254597 0.249167 0.24295 0.235965 0.228233 0.219776 0.210617 0.200782 0.190293 0.179177 0.167459 0.155163 0.142314 0.254178 0.253759 0.252504 0.250417 0.247504 0.243776 0.239244 0.233922 0.227828 0.220978 0.213393 0.205094 0.196103 0.186443 0.176137 0.16521 0.153684 0.141586 0.128937 0.238012 0.237602 0.236374 0.23433 0.231479 0.227828 0.223389 0.218175 0.212202 0.205488 0.198049 0.189907 0.181083 0.171598 0.161475 0.150736 0.139404 0.127504 0.115056 0.221379 0.220978 0.219776 0.217776 0.214984 0.211409 0.207062 0.201956 0.196103 0.189522 0.182229 0.174243 0.165584 0.156273 0.146331 0.135781 0.124643 0.11294 0.100695 0.204308 0.203916 0.202739 0.200782 0.198049 0.19455 0.190293 0.185291 0.179558 0.173108 0.165959 0.158127 0.149632 0.140494 0.130733 0.120369 0.109424 0.0979191 0.0858747 0.186827 0.186443 0.185291 0.183376 0.180702 0.177276 0.173108 0.16821 0.162593 0.156273 0.149265 0.141586 0.133253 0.124286 0.114703 0.104525 0.0937716 0.0824625 0.0706185 0.168961 0.168586 0.167459 0.165584 0.162967 0.159613 0.155533 0.150736 0.145234 0.139041 0.132172 0.124643 0.11647 0.107672 0.0982656 0.0882709 0.0777067 0.0665923 0.0549471 0.150736 0.150368 0.149265 0.14743 0.144868 0.141586 0.137591 0.132893 0.127504 0.121436 0.114703 0.107321 0.0993058 0.0906733 0.0814413 0.0716278 0.0612508 0.050329 0.0388809 0.132172 0.131812 0.130733 0.128937 0.12643 0.123216 0.119304 0.114703 0.109424 0.103479 0.0968804 0.0896429 0.0817816 0.0733124 0.0642516 0.0546165 0.0444243 0.0336926 0.0224393 0.113293 0.11294 0.111884 0.110126 0.107672 0.104525 0.100695 0.0961886 0.0910171 0.0851913 0.0787237 0.0716278 0.0639177 0.0556087 0.0467162 0.0372565 0.0272462 0.016702 0.00564091 0.0941165 0.0937716 0.0927376 0.0910171 0.0886137 0.0855329 0.0817816 0.0773679 0.0723012 0.0665923 0.0602527 0.0532952 0.0457333 0.0375812 0.0288538 0.0195664 0.00973488 -0.000624805 -0.0114964 0.4 0.399479 0.39792 0.395331 0.391724 0.387117 0.381534 0.375 0.367544 0.3592 0.35 0.339981 0.32918 0.317633 0.305378 0.292451 0.27889 0.264728 0.25 0.399479 0.398959 0.397401 0.394814 0.39121 0.386608 0.381029 0.3745 0.367051 0.358712 0.349519 0.339508 0.328714 0.317175 0.304928 0.29201 0.278457 0.264303 0.249583 0.39792 0.397401 0.395848 0.393267 0.389672 0.385081 0.379516 0.373003 0.365571 0.357252 0.34808 0.33809 0.327319 0.315803 0.303581 0.290687 0.277158 0.26303 0.248335 0.395331 0.394814 0.393267 0.390697 0.387117 0.382546 0.377003 0.370516 0.363113 0.354826 0.345687 0.335733 0.325 0.313523 0.301341 0.288488 0.275 0.260913 0.246259 0.391724 0.39121 0.389672 0.387117 0.383559 0.379013 0.373502 0.367051 0.359688 0.351444 0.342353 0.332449 0.321767 0.310344 0.298217 0.28542 0.271989 0.257959 0.243363 0.387117 0.386608 0.385081 0.382546 0.379013 0.3745 0.369029 0.362623 0.35531 0.347122 0.33809 0.328249 0.317633 0.306278 0.29422 0.281495 0.268136 0.254178 0.239655 0.381534 0.381029 0.379516 0.377003 0.373502 0.369029 0.363604 0.357252 0.35 0.341878 0.332917 0.323151 0.312614 0.301341 0.289366 0.276726 0.263454 0.249583 0.235147 0.375 0.3745 0.373003 0.370516 0.367051 0.362623 0.357252 0.350962 0.34378 0.335733 0.326854 0.317175 0.306729 0.29555 0.283673 0.271131 0.257959 0.244189 0.229854 0.367544 0.367051 0.365571 0.363113 0.359688 0.35531 0.35 0.34378 0.336675 0.328714 0.319926 0.310344 0.3 0.288927 0.277158 0.264728 0.251669 0.238012 0.223791 0.3592 0.358712 0.357252 0.354826 0.351444 0.347122 0.341878 0.335733 0.328714 0.320846 0.312159 0.302684 0.292451 0.281495 0.269846 0.257538 0.244603 0.231072 0.216977 0.35 0.349519 0.34808 0.345687 0.342353 0.33809 0.332917 0.326854 0.319926 0.312159 0.303581 0.29422 0.284109 0.273278 0.261759 0.249583 0.236783 0.223389 0.209431 0.339981 0.339508 0.33809 0.335733 0.332449 0.328249 0.323151 0.317175 0.310344 0.302684 0.29422 0.284983 0.275 0.264303 0.252922 0.240889 0.228233 0.214984 0.201173 0.32918 0.328714 0.327319 0.325 0.321767 0.317633 0.312614 0.306729 0.3 0.292451 0.284109 0.275 0.265153 0.254597 0.243363 0.231479 0.218975 0.205881 0.192225 0.317633 0.317175 0.315803 0.313523 0.310344 0.306278 0.301341 0.29555 0.288927 0.281495 0.273278 0.264303 0.254597 0.244189 0.233107 0.221379 0.209035 0.196103 0.182611 0.305378 0.304928 0.303581 0.301341 0.298217 0.29422 0.289366 0.283673 0.277158 0.269846 0.261759 0.252922 0.243363 0.233107 0.222183 0.210617 0.198439 0.185675 0.172353 0.292451 0.29201 0.290687 0.288488 0.28542 0.281495 0.276726 0.271131 0.264728 0.257538 0.249583 0.240889 0.231479 0.221379 0.210617 0.199219 0.187212 0.174621 0.161475 0.27889 0.278457 0.277158 0.275 0.271989 0.268136 0.263454 0.257959 0.251669 0.244603 0.236783 0.228233 0.218975 0.209035 0.198439 0.187212 0.175379 0.162967 0.15 0.264728 0.264303 0.26303 0.260913 0.257959 0.254178 0.249583 0.244189 0.238012 0.231072 0.223389 0.214984 0.205881 0.196103 0.185675 0.174621 0.162967 0.150736 0.137953 0.25 0.249583 0.248335 0.246259 0.243363 0.239655 0.235147 0.229854 0.223791 0.216977 0.209431 0.201173 0.192225 0.182611 0.172353 0.161475 0.15 0.137953 0.125357 0.234739 0.23433 0.233107 0.231072 0.228233 0.224597 0.220176 0.214984 0.209035 0.202347 0.194938 0.186827 0.178036 0.168586 0.158498 0.147797 0.136504 0.124643 0.112236 0.218975 0.218575 0.217376 0.215382 0.212599 0.209035 0.204701 0.199609 0.193774 0.187212 0.179939 0.171975 0.16334 0.154054 0.144138 0.133614 0.122504 0.110829 0.0986122 0.202739 0.202347 0.201173 0.199219 0.196492 0.192999 0.188751 0.183759 0.178036 0.171598 0.164461 0.156644 0.148164 0.139041 0.129296 0.118949 0.108022 0.0965345 0.0845083 0.186059 0.185675 0.184525 0.182611 0.179939 0.176517 0.172353 0.167459 0.161847 0.155533 0.148531 0.140858 0.132532 0.123573 0.113998 0.103828 0.0930821 0.0817816 0.0699462 0.168961 0.168586 0.167459 0.165584 0.162967 0.159613 0.155533 0.150736 0.145234 0.139041 0.132172 0.124643 0.11647 0.107672 0.0982656 0.0882709 0.0777067 0.0665923 0.0549471 0.151472 0.151104 0.15 0.148164 0.1456 0.142314 0.138316 0.133614 0.12822 0.122148 0.11541 0.108022 0.1 0.0913609 0.082122 0.0723012 0.0619168 0.0509874 0.0395314 0.133614 0.133253 0.132172 0.130374 0.127862 0.124643 0.120725 0.116117 0.110829 0.104874 0.0982656 0.0910171 0.083144 0.0746622 0.0655884 0.0559396 0.0457333 0.034987 0.0237188 0.11541 0.115056 0.113998 0.112236 0.109775 0.106622 0.102782 0.0982656 0.0930821 0.0872432 0.0807612 0.0736496 0.0659229 0.0575962 0.0486851 0.0392061 0.0291756 0.0186107 0.00752834 0.0968804 0.0965345 0.0954974 0.0937716 0.0913609 0.0882709 0.0845083 0.0800815 0.075 0.0692745 0.0629168 0.0559396 0.0483567 0.0401823 0.0314315 0.0221196 0.0122627 0.00187676 -0.0090218 0.0780456 0.0777067 0.0766907 0.075 0.0726382 0.0696103 0.0659229 0.0615838 0.0566019 0.0509874 0.0447513 0.0379059 0.030464 0.0224393 0.0138459 0.00469854 -0.00498756 -0.015197 -0.0259142 0.375 0.3745 0.373003 0.370516 0.367051 0.362623 0.357252 0.350962 0.34378 0.335733 0.326854 0.317175 0.306729 0.29555 0.283673 0.271131 0.257959 0.244189 0.229854 0.3745 0.374001 0.372505 0.37002 0.366557 0.362132 0.356766 0.350481 0.343304 0.335263 0.32639 0.316717 0.306278 0.295106 0.283236 0.270702 0.257538 0.243776 0.229448 0.373003 0.372505 0.371013 0.368533 0.365079 0.360664 0.35531 0.349039 0.341878 0.333854 0.325 0.315347 0.304928 0.293778 0.28193 0.269418 0.256276 0.242537 0.228233 0.370516 0.37002 0.368533 0.366064 0.362623 0.358225 0.352891 0.346643 0.339508 0.331513 0.322689 0.313068 0.302684 0.291569 0.279757 0.267282 0.254178 0.240477 0.226211 0.367051 0.366557 0.365079 0.362623 0.3592 0.354826 0.349519 0.343304 0.336204 0.328249 0.319467 0.309891 0.299554 0.288488 0.276726 0.264303 0.251251 0.237602 0.223389 0.362623 0.362132 0.360664 0.358225 0.354826 0.350481 0.34521 0.339035 0.331981 0.324075 0.315347 0.305828 0.29555 0.284546 0.272848 0.26049 0.247504 0.233922 0.219776 0.357252 0.356766 0.35531 0.352891 0.349519 0.34521 0.339981 0.333854 0.326854 0.319008 0.310344 0.300893 0.290687 0.279757 0.268136 0.255856 0.24295 0.229448 0.215382 0.350962 0.350481 0.349039 0.346643 0.343304 0.339035 0.333854 0.327784 0.320846 0.313068 0.304479 0.295106 0.284983 0.274138 0.262606 0.250417 0.237602 0.224194 0.210222 0.34378 0.343304 0.341878 0.339508 0.336204 0.331981 0.326854 0.320846 0.313979 0.306278 0.297771 0.288488 0.278457 0.267709 0.256276 0.244189 0.231479 0.218175 0.204308 0.335733 0.335263 0.333854 0.331513 0.328249 0.324075 0.319008 0.313068 0.306278 0.298662 0.290247 0.28106 0.271131 0.26049 0.249167 0.237193 0.224597 0.211409 0.19766 0.326854 0.32639 0.325 0.322689 0.319467 0.315347 0.310344 0.304479 0.297771 0.290247 0.28193 0.272848 0.26303 0.252504 0.2413 0.229448 0.216977 0.203916 0.190293 0.317175 0.316717 0.315347 0.313068 0.309891 0.305828 0.300893 0.295106 0.288488 0.28106 0.272848 0.263878 0.254178 0.243776 0.2327 0.220978 0.20864 0.195715 0.182229 0.306729 0.306278 0.304928 0.302684 0.299554 0.29555 0.290687 0.284983 0.278457 0.271131 0.26303 0.254178 0.244603 0.23433 0.223389 0.211806 0.199609 0.186827 0.173486 0.29555 0.295106 0.293778 0.291569 0.288488 0.284546 0.279757 0.274138 0.267709 0.26049 0.252504 0.243776 0.23433 0.224194 0.213393 0.201956 0.189907 0.177276 0.164087 0.283673 0.283236 0.28193 0.279757 0.276726 0.272848 0.268136 0.262606 0.256276 0.249167 0.2413 0.2327 0.223389 0.213393 0.202739 0.191452 0.179558 0.167083 0.154054 0.271131 0.270702 0.269418 0.267282 0.264303 0.26049 0.255856 0.250417 0.244189 0.237193 0.229448 0.220978 0.211806 0.201956 0.191452 0.18032 0.168586 0.156273 0.143408 0.257959 0.257538 0.256276 0.254178 0.251251 0.247504 0.24295 0.237602 0.231479 0.224597 0.216977 0.20864 0.199609 0.189907 0.179558 0.168586 0.157014 0.144868 0.132172 0.244189 0.243776 0.242537 0.240477 0.237602 0.233922 0.229448 0.224194 0.218175 0.211409 0.203916 0.195715 0.186827 0.177276 0.167083 0.156273 0.144868 0.132893 0.120369 0.229854 0.229448 0.228233 0.226211 0.223389 0.219776 0.215382 0.210222 0.204308 0.19766 0.190293 0.182229 0.173486 0.164087 0.154054 0.143408 0.132172 0.120369 0.108022 0.214984 0.214586 0.213393 0.211409 0.20864 0.205094 0.200782 0.195715 0.189907 0.183376 0.176137 0.16821 0.159613 0.150368 0.140494 0.130014 0.118949 0.107321 0.0951519 0.199609 0.199219 0.198049 0.196103 0.193387 0.189907 0.185675 0.180702 0.175 0.168586 0.161475 0.153684 0.145234 0.136142 0.12643 0.116117 0.105223 0.0937716 0.0817816 0.183759 0.183376 0.182229 0.18032 0.177656 0.174243 0.17009 0.16521 0.159613 0.153315 0.146331 0.138678 0.130374 0.121436 0.111884 0.101738 0.0910171 0.0797419 0.0679324 0.167459 0.167083 0.165959 0.164087 0.161475 0.158127 0.154054 0.149265 0.143773 0.137591 0.130733 0.123216 0.115056 0.106272 0.0968804 0.0869009 0.0763523 0.065254 0.0536253 0.150736 0.150368 0.149265 0.14743 0.144868 0.141586 0.137591 0.132893 0.127504 0.121436 0.114703 0.107321 0.0993058 0.0906733 0.0814413 0.0716278 0.0612508 0.050329 0.0388809 0.133614 0.133253 0.132172 0.130374 0.127862 0.124643 0.120725 0.116117 0.110829 0.104874 0.0982656 0.0910171 0.083144 0.0746622 0.0655884 0.0559396 0.0457333 0.034987 0.0237188 0.116117 0.115763 0.114703 0.11294 0.110478 0.107321 0.103479 0.0989589 0.0937716 0.0879282 0.0814413 0.0743246 0.0665923 0.0582596 0.0493423 0.0398568 0.0298196 0.0192477 0.00815828 0.0982656 0.0979191 0.0968804 0.0951519 0.0927376 0.0896429 0.0858747 0.0814413 0.0763523 0.0706185 0.0642516 0.0572646 0.0496711 0.0414855 0.0327229 0.0233988 0.013529 0.0031299 -0.00778222 0.0800815 0.0797419 0.0787237 0.0770293 0.0746622 0.0716278 0.0679324 0.063584 0.0585915 0.0529652 0.0467162 0.0398568 0.0323999 0.0243592 0.015749 0.00658418 -0.00312013 -0.0133484 -0.024085 0.0615838 0.0612508 0.0602527 0.0585915 0.0562707 0.0532952 0.0496711 0.0454058 0.0405079 0.034987 0.0288538 0.0221196 0.014797 0.0068988 -0.00156128 -0.0105691 -0.0201103 -0.0301699 -0.0407329 0.35 0.349519 0.34808 0.345687 0.342353 0.33809 0.332917 0.326854 0.319926 0.312159 0.303581 0.29422 0.284109 0.273278 0.261759 0.249583 0.236783 0.223389 0.209431 0.349519 0.349039 0.347601 0.34521 0.341878 0.337618 0.332449 0.32639 0.319467 0.311705 0.303132 0.293778 0.283673 0.272848 0.261336 0.249167 0.236374 0.222986 0.209035 0.34808 0.347601 0.346165 0.34378 0.340455 0.336204 0.331046 0.325 0.318091 0.310344 0.301788 0.292451 0.282365 0.27156 0.260068 0.24792 0.235147 0.221781 0.207851 0.345687 0.34521 0.34378 0.341403 0.33809 0.333854 0.328714 0.322689 0.315803 0.308082 0.299554 0.290247 0.280191 0.269418 0.257959 0.245845 0.233107 0.219776 0.205881 0.342353 0.341878 0.340455 0.33809 0.334793 0.330579 0.325463 0.319467 0.312614 0.304928 0.296438 0.287171 0.277158 0.26643 0.255017 0.24295 0.23026 0.216977 0.203131 0.33809 0.337618 0.336204 0.333854 0.330579 0.32639 0.321306 0.315347 0.308534 0.300893 0.292451 0.283236 0.273278 0.262606 0.251251 0.239244 0.226615 0.213393 0.199609 0.332917 0.332449 0.331046 0.328714 0.325463 0.321306 0.31626 0.310344 0.303581 0.295994 0.28761 0.278457 0.268563 0.257959 0.246674 0.234739 0.222183 0.209035 0.195326 0.326854 0.32639 0.325 0.322689 0.319467 0.315347 0.310344 0.304479 0.297771 0.290247 0.28193 0.272848 0.26303 0.252504 0.2413 0.229448 0.216977 0.203916 0.190293 0.319926 0.319467 0.318091 0.315803 0.312614 0.308534 0.303581 0.297771 0.291128 0.283673 0.275431 0.26643 0.256697 0.246259 0.235147 0.223389 0.211013 0.198049 0.184525 0.312159 0.311705 0.310344 0.308082 0.304928 0.300893 0.295994 0.290247 0.283673 0.276294 0.268136 0.259223 0.249583 0.239244 0.228233 0.216578 0.204308 0.191452 0.178036 0.303581 0.303132 0.301788 0.299554 0.296438 0.292451 0.28761 0.28193 0.275431 0.268136 0.260068 0.251251 0.241712 0.231479 0.220577 0.209035 0.196881 0.184142 0.170844 0.29422 0.293778 0.292451 0.290247 0.287171 0.283236 0.278457 0.272848 0.26643 0.259223 0.251251 0.242537 0.233107 0.222986 0.212202 0.200782 0.188751 0.176137 0.162967 0.284109 0.283673 0.282365 0.280191 0.277158 0.273278 0.268563 0.26303 0.256697 0.249583 0.241712 0.233107 0.223791 0.213791 0.203131 0.191839 0.179939 0.167459 0.154423 0.273278 0.272848 0.27156 0.269418 0.26643 0.262606 0.257959 0.252504 0.246259 0.239244 0.231479 0.222986 0.213791 0.203916 0.193387 0.182229 0.170467 0.158127 0.145234 0.261759 0.261336 0.260068 0.257959 0.255017 0.251251 0.246674 0.2413 0.235147 0.228233 0.220577 0.212202 0.203131 0.193387 0.182993 0.171975 0.160357 0.148164 0.135419 0.249583 0.249167 0.24792 0.245845 0.24295 0.239244 0.234739 0.229448 0.223389 0.216578 0.209035 0.200782 0.191839 0.182229 0.171975 0.161102 0.149632 0.137591 0.125 0.236783 0.236374 0.235147 0.233107 0.23026 0.226615 0.222183 0.216977 0.211013 0.204308 0.196881 0.188751 0.179939 0.170467 0.160357 0.149632 0.138316 0.12643 0.113998 0.223389 0.222986 0.221781 0.219776 0.216977 0.213393 0.209035 0.203916 0.198049 0.191452 0.184142 0.176137 0.167459 0.158127 0.148164 0.137591 0.12643 0.114703 0.102434 0.209431 0.209035 0.207851 0.205881 0.203131 0.199609 0.195326 0.190293 0.184525 0.178036 0.170844 0.162967 0.154423 0.145234 0.135419 0.125 0.113998 0.102434 0.0903297 0.194938 0.19455 0.193387 0.191452 0.188751 0.185291 0.181083 0.176137 0.170467 0.164087 0.157014 0.149265 0.140858 0.131812 0.122148 0.111884 0.101042 0.0896429 0.0777067 0.179939 0.179558 0.178416 0.176517 0.173864 0.170467 0.166333 0.161475 0.155903 0.149632 0.142679 0.135058 0.126788 0.117886 0.108372 0.0982656 0.0875856 0.0763523 0.0645857 0.164461 0.164087 0.162967 0.161102 0.158498 0.155163 0.151104 0.146331 0.140858 0.134697 0.127862 0.120369 0.112236 0.103479 0.0941165 0.084167 0.0736496 0.0625833 0.0509874 0.148531 0.148164 0.147064 0.145234 0.142679 0.139404 0.135419 0.130733 0.125357 0.119304 0.112588 0.105223 0.0972265 0.0886137 0.0794024 0.0696103 0.0592556 0.0483567 0.036932 0.132172 0.131812 0.130733 0.128937 0.12643 0.123216 0.119304 0.114703 0.109424 0.103479 0.0968804 0.0896429 0.0817816 0.0733124 0.0642516 0.0546165 0.0444243 0.0336926 0.0224393 0.11541 0.115056 0.113998 0.112236 0.109775 0.106622 0.102782 0.0982656 0.0930821 0.0872432 0.0807612 0.0736496 0.0659229 0.0575962 0.0486851 0.0392061 0.0291756 0.0186107 0.00752834 0.0982656 0.0979191 0.0968804 0.0951519 0.0927376 0.0896429 0.0858747 0.0814413 0.0763523 0.0706185 0.0642516 0.0572646 0.0496711 0.0414855 0.0327229 0.0233988 0.013529 0.0031299 -0.00778222 0.0807612 0.0804213 0.0794024 0.0777067 0.0753379 0.0723012 0.0686032 0.0642516 0.0592556 0.0536253 0.0473721 0.0405079 0.033046 0.025 0.0163842 0.00721352 -0.00249688 -0.0127315 -0.0234745 0.0629168 0.0625833 0.0615838 0.0599202 0.0575962 0.0546165 0.0509874 0.0467162 0.0418116 0.0362832 0.0301418 0.0233988 0.0160666 0.00815828 -0.000312451 -0.00933146 -0.0188842 -0.0289558 -0.0395311 0.0447513 0.0444243 0.0434437 0.0418116 0.0395314 0.0366076 0.033046 0.0288538 0.0240389 0.0186107 0.0125791 0.00595523 -0.00124922 -0.0090218 -0.0173495 -0.0262188 -0.0356158 -0.0455262 -0.0559356 0.325 0.324537 0.323151 0.320846 0.317633 0.313523 0.308534 0.302684 0.295994 0.288488 0.280191 0.271131 0.261336 0.250834 0.239655 0.227828 0.215382 0.202347 0.188751 0.324537 0.324075 0.322689 0.320386 0.317175 0.313068 0.308082 0.302236 0.29555 0.288048 0.279757 0.270702 0.260913 0.250417 0.239244 0.227423 0.214984 0.201956 0.188366 0.323151 0.322689 0.321306 0.319008 0.315803 0.311705 0.306729 0.300893 0.29422 0.286733 0.278457 0.269418 0.259645 0.249167 0.238012 0.226211 0.213791 0.200782 0.187212 0.320846 0.320386 0.319008 0.316717 0.313523 0.309439 0.304479 0.298662 0.29201 0.284546 0.276294 0.267282 0.257538 0.247089 0.235965 0.224194 0.211806 0.198829 0.185291 0.317633 0.317175 0.315803 0.313523 0.310344 0.306278 0.301341 0.29555 0.288927 0.281495 0.273278 0.264303 0.254597 0.244189 0.233107 0.221379 0.209035 0.196103 0.182611 0.313523 0.313068 0.311705 0.309439 0.306278 0.302236 0.297327 0.291569 0.284983 0.277591 0.269418 0.26049 0.250834 0.240477 0.229448 0.217776 0.205488 0.192612 0.179177 0.308534 0.308082 0.306729 0.304479 0.301341 0.297327 0.292451 0.286733 0.280191 0.272848 0.264728 0.255856 0.246259 0.235965 0.225 0.213393 0.201173 0.188366 0.175 0.302684 0.302236 0.300893 0.298662 0.29555 0.291569 0.286733 0.28106 0.274569 0.267282 0.259223 0.250417 0.240889 0.230666 0.219776 0.208246 0.196103 0.183376 0.17009 0.295994 0.29555 0.29422 0.29201 0.288927 0.284983 0.280191 0.274569 0.268136 0.260913 0.252922 0.244189 0.234739 0.224597 0.213791 0.202347 0.190293 0.177656 0.164461 0.288488 0.288048 0.286733 0.284546 0.281495 0.277591 0.272848 0.267282 0.260913 0.253759 0.245845 0.237193 0.227828 0.217776 0.207062 0.195715 0.183759 0.171221 0.158127 0.280191 0.279757 0.278457 0.276294 0.273278 0.269418 0.264728 0.259223 0.252922 0.245845 0.238012 0.229448 0.220176 0.210222 0.199609 0.188366 0.176517 0.164087 0.151104 0.271131 0.270702 0.269418 0.267282 0.264303 0.26049 0.255856 0.250417 0.244189 0.237193 0.229448 0.220978 0.211806 0.201956 0.191452 0.18032 0.168586 0.156273 0.143408 0.261336 0.260913 0.259645 0.257538 0.254597 0.250834 0.246259 0.240889 0.234739 0.227828 0.220176 0.211806 0.202739 0.192999 0.182611 0.171598 0.159985 0.147797 0.135058 0.250834 0.250417 0.249167 0.247089 0.244189 0.240477 0.235965 0.230666 0.224597 0.217776 0.210222 0.201956 0.192999 0.183376 0.173108 0.16222 0.150736 0.138678 0.126072 0.239655 0.239244 0.238012 0.235965 0.233107 0.229448 0.225 0.219776 0.213791 0.207062 0.199609 0.191452 0.182611 0.173108 0.162967 0.152209 0.140858 0.128937 0.11647 0.227828 0.227423 0.226211 0.224194 0.221379 0.217776 0.213393 0.208246 0.202347 0.195715 0.188366 0.18032 0.171598 0.16222 0.152209 0.141586 0.130374 0.118595 0.106272 0.215382 0.214984 0.213791 0.211806 0.209035 0.205488 0.201173 0.196103 0.190293 0.183759 0.176517 0.168586 0.159985 0.150736 0.140858 0.130374 0.119304 0.107672 0.0954974 0.202347 0.201956 0.200782 0.198829 0.196103 0.192612 0.188366 0.183376 0.177656 0.171221 0.164087 0.156273 0.147797 0.138678 0.128937 0.118595 0.107672 0.0961886 0.084167 0.188751 0.188366 0.187212 0.185291 0.182611 0.179177 0.175 0.17009 0.164461 0.158127 0.151104 0.143408 0.135058 0.126072 0.11647 0.106272 0.0954974 0.084167 0.0723012 0.174621 0.174243 0.173108 0.171221 0.168586 0.16521 0.161102 0.156273 0.150736 0.144503 0.137591 0.130014 0.121792 0.11294 0.103479 0.0934268 0.0828032 0.0716278 0.0599202 0.159985 0.159613 0.158498 0.156644 0.154054 0.150736 0.146698 0.14195 0.136504 0.130374 0.123573 0.116117 0.108022 0.0993058 0.0899863 0.0800815 0.0696103 0.0585915 0.0470441 0.144868 0.144503 0.143408 0.141586 0.139041 0.135781 0.131812 0.127145 0.121792 0.115763 0.109074 0.101738 0.0937716 0.0851913 0.0760141 0.0662575 0.0559396 0.0450785 0.0336926 0.129296 0.128937 0.127862 0.126072 0.123573 0.120369 0.11647 0.111884 0.106622 0.100695 0.0941165 0.0869009 0.079063 0.0706185 0.0615838 0.0519757 0.0418116 0.0311089 0.0198852 0.113293 0.11294 0.111884 0.110126 0.107672 0.104525 0.100695 0.0961886 0.0910171 0.0851913 0.0787237 0.0716278 0.0639177 0.0556087 0.0467162 0.0372565 0.0272462 0.016702 0.00564091 0.0968804 0.0965345 0.0954974 0.0937716 0.0913609 0.0882709 0.0845083 0.0800815 0.075 0.0692745 0.0629168 0.0559396 0.0483567 0.0401823 0.0314315 0.0221196 0.0122627 0.00187676 -0.0090218 0.0800815 0.0797419 0.0787237 0.0770293 0.0746622 0.0716278 0.0679324 0.063584 0.0585915 0.0529652 0.0467162 0.0398568 0.0323999 0.0243592 0.015749 0.00658418 -0.00312013 -0.0133484 -0.024085 0.0629168 0.0625833 0.0615838 0.0599202 0.0575962 0.0546165 0.0509874 0.0467162 0.0418116 0.0362832 0.0301418 0.0233988 0.0160666 0.00815828 -0.000312451 -0.00933146 -0.0188842 -0.0289558 -0.0395311 0.0454058 0.0450785 0.0440973 0.0424641 0.0401823 0.0372565 0.0336926 0.0294976 0.0246795 0.0192477 0.0132123 0.00658418 -0.000624805 -0.0084022 -0.016735 -0.0256096 -0.0350121 -0.0449282 -0.0553435 0.0275675 0.0272462 0.0262829 0.0246795 0.0224393 0.0195664 0.0160666 0.0119464 0.00721352 0.00187676 -0.00405428 -0.0105691 -0.0176566 -0.0253048 -0.0335013 -0.0422332 -0.051487 -0.0612493 -0.0715059 0.3 0.299554 0.298217 0.295994 0.292893 0.288927 0.284109 0.278457 0.271989 0.264728 0.256697 0.24792 0.238423 0.228233 0.217376 0.205881 0.193774 0.181083 0.167834 0.299554 0.299108 0.297771 0.29555 0.292451 0.288488 0.283673 0.278024 0.27156 0.264303 0.256276 0.247504 0.238012 0.227828 0.216977 0.205488 0.193387 0.180702 0.167459 0.298217 0.297771 0.296438 0.29422 0.291128 0.287171 0.282365 0.276726 0.270274 0.26303 0.255017 0.246259 0.236783 0.226615 0.215781 0.204308 0.192225 0.179558 0.166333 0.295994 0.29555 0.29422 0.29201 0.288927 0.284983 0.280191 0.274569 0.268136 0.260913 0.252922 0.244189 0.234739 0.224597 0.213791 0.202347 0.190293 0.177656 0.164461 0.292893 0.292451 0.291128 0.288927 0.285857 0.28193 0.277158 0.27156 0.265153 0.257959 0.25 0.2413 0.231885 0.221781 0.211013 0.199609 0.187596 0.175 0.161847 0.288927 0.288488 0.287171 0.284983 0.28193 0.278024 0.273278 0.267709 0.261336 0.254178 0.246259 0.237602 0.228233 0.218175 0.207457 0.196103 0.184142 0.171598 0.158498 0.284109 0.283673 0.282365 0.280191 0.277158 0.273278 0.268563 0.26303 0.256697 0.249583 0.241712 0.233107 0.223791 0.213791 0.203131 0.191839 0.179939 0.167459 0.154423 0.278457 0.278024 0.276726 0.274569 0.27156 0.267709 0.26303 0.257538 0.251251 0.244189 0.236374 0.227828 0.218575 0.20864 0.198049 0.186827 0.175 0.162593 0.149632 0.271989 0.27156 0.270274 0.268136 0.265153 0.261336 0.256697 0.251251 0.245017 0.238012 0.23026 0.221781 0.212599 0.202739 0.192225 0.181083 0.169338 0.157014 0.144138 0.264728 0.264303 0.26303 0.260913 0.257959 0.254178 0.249583 0.244189 0.238012 0.231072 0.223389 0.214984 0.205881 0.196103 0.185675 0.174621 0.162967 0.150736 0.137953 0.256697 0.256276 0.255017 0.252922 0.25 0.246259 0.241712 0.236374 0.23026 0.223389 0.215781 0.207457 0.198439 0.188751 0.178416 0.167459 0.155903 0.143773 0.131093 0.24792 0.247504 0.246259 0.244189 0.2413 0.237602 0.233107 0.227828 0.221781 0.214984 0.207457 0.199219 0.190293 0.180702 0.170467 0.159613 0.148164 0.136142 0.123573 0.238423 0.238012 0.236783 0.234739 0.231885 0.228233 0.223791 0.218575 0.212599 0.205881 0.198439 0.190293 0.181465 0.171975 0.161847 0.151104 0.139767 0.127862 0.11541 0.228233 0.227828 0.226615 0.224597 0.221781 0.218175 0.213791 0.20864 0.202739 0.196103 0.188751 0.180702 0.171975 0.162593 0.152577 0.14195 0.130733 0.118949 0.106622 0.217376 0.216977 0.215781 0.213791 0.211013 0.207457 0.203131 0.198049 0.192225 0.185675 0.178416 0.170467 0.161847 0.152577 0.142679 0.132172 0.12108 0.109424 0.0972265 0.205881 0.205488 0.204308 0.202347 0.199609 0.196103 0.191839 0.186827 0.181083 0.174621 0.167459 0.159613 0.151104 0.14195 0.132172 0.121792 0.110829 0.0993058 0.0872432 0.193774 0.193387 0.192225 0.190293 0.187596 0.184142 0.179939 0.175 0.169338 0.162967 0.155903 0.148164 0.139767 0.130733 0.12108 0.110829 0.1 0.0886137 0.0766907 0.181083 0.180702 0.179558 0.177656 0.175 0.171598 0.167459 0.162593 0.157014 0.150736 0.143773 0.136142 0.127862 0.118949 0.109424 0.0993058 0.0886137 0.0773679 0.0655884 0.167834 0.167459 0.166333 0.164461 0.161847 0.158498 0.154423 0.149632 0.144138 0.137953 0.131093 0.123573 0.11541 0.106622 0.0972265 0.0872432 0.0766907 0.0655884 0.0539556 0.154054 0.153684 0.152577 0.150736 0.148164 0.144868 0.140858 0.136142 0.130733 0.124643 0.117886 0.110478 0.102434 0.0937716 0.0845083 0.0746622 0.0642516 0.0532952 0.0418116 0.139767 0.139404 0.138316 0.136504 0.133975 0.130733 0.126788 0.122148 0.116824 0.110829 0.104176 0.0968804 0.0889566 0.0804213 0.0712912 0.0615838 0.0513167 0.0405079 0.0291756 0.125 0.124643 0.123573 0.121792 0.119304 0.116117 0.112236 0.107672 0.102434 0.0965345 0.0899863 0.0828032 0.075 0.0665923 0.0575962 0.0480284 0.0379059 0.0272462 0.0160666 0.109775 0.109424 0.108372 0.106622 0.104176 0.101042 0.0972265 0.0927376 0.0875856 0.0817816 0.0753379 0.0682677 0.0605853 0.0523054 0.0434437 0.034016 0.0240389 0.013529 0.00250313 0.0941165 0.0937716 0.0927376 0.0910171 0.0886137 0.0855329 0.0817816 0.0773679 0.0723012 0.0665923 0.0602527 0.0532952 0.0457333 0.0375812 0.0288538 0.0195664 0.00973488 -0.000624805 -0.0114964 0.0780456 0.0777067 0.0766907 0.075 0.0726382 0.0696103 0.0659229 0.0615838 0.0566019 0.0509874 0.0447513 0.0379059 0.030464 0.0224393 0.0138459 0.00469854 -0.00498756 -0.015197 -0.0259142 0.0615838 0.0612508 0.0602527 0.0585915 0.0562707 0.0532952 0.0496711 0.0454058 0.0405079 0.034987 0.0288538 0.0221196 0.014797 0.0068988 -0.00156128 -0.0105691 -0.0201103 -0.0301699 -0.0407329 0.0447513 0.0444243 0.0434437 0.0418116 0.0395314 0.0366076 0.033046 0.0288538 0.0240389 0.0186107 0.0125791 0.00595523 -0.00124922 -0.0090218 -0.0173495 -0.0262188 -0.0356158 -0.0455262 -0.0559356 0.0275675 0.0272462 0.0262829 0.0246795 0.0224393 0.0195664 0.0160666 0.0119464 0.00721352 0.00187676 -0.00405428 -0.0105691 -0.0176566 -0.0253048 -0.0335013 -0.0422332 -0.051487 -0.0612493 -0.0715059 0.0100505 0.00973488 0.00878862 0.00721352 0.00501256 0.0021899 -0.00124922 -0.00529846 -0.00995049 -0.015197 -0.0210289 -0.0274361 -0.034408 -0.0419333 -0.05 -0.0585958 -0.0677078 -0.0773231 -0.0874282 0.275 0.274569 0.273278 0.271131 0.268136 0.264303 0.259645 0.254178 0.24792 0.240889 0.233107 0.224597 0.215382 0.205488 0.194938 0.183759 0.171975 0.159613 0.146698 0.274569 0.274138 0.272848 0.270702 0.267709 0.263878 0.259223 0.253759 0.247504 0.240477 0.2327 0.224194 0.214984 0.205094 0.19455 0.183376 0.171598 0.159241 0.146331 0.273278 0.272848 0.27156 0.269418 0.26643 0.262606 0.257959 0.252504 0.246259 0.239244 0.231479 0.222986 0.213791 0.203916 0.193387 0.182229 0.170467 0.158127 0.145234 0.271131 0.270702 0.269418 0.267282 0.264303 0.26049 0.255856 0.250417 0.244189 0.237193 0.229448 0.220978 0.211806 0.201956 0.191452 0.18032 0.168586 0.156273 0.143408 0.268136 0.267709 0.26643 0.264303 0.261336 0.257538 0.252922 0.247504 0.2413 0.23433 0.226615 0.218175 0.209035 0.199219 0.188751 0.177656 0.165959 0.153684 0.140858 0.264303 0.263878 0.262606 0.26049 0.257538 0.253759 0.249167 0.243776 0.237602 0.230666 0.222986 0.214586 0.205488 0.195715 0.185291 0.174243 0.162593 0.150368 0.137591 0.259645 0.259223 0.257959 0.255856 0.252922 0.249167 0.244603 0.239244 0.233107 0.226211 0.218575 0.210222 0.201173 0.191452 0.181083 0.17009 0.158498 0.146331 0.133614 0.254178 0.253759 0.252504 0.250417 0.247504 0.243776 0.239244 0.233922 0.227828 0.220978 0.213393 0.205094 0.196103 0.186443 0.176137 0.16521 0.153684 0.141586 0.128937 0.24792 0.247504 0.246259 0.244189 0.2413 0.237602 0.233107 0.227828 0.221781 0.214984 0.207457 0.199219 0.190293 0.180702 0.170467 0.159613 0.148164 0.136142 0.123573 0.240889 0.240477 0.239244 0.237193 0.23433 0.230666 0.226211 0.220978 0.214984 0.208246 0.200782 0.192612 0.183759 0.174243 0.164087 0.153315 0.14195 0.130014 0.117532 0.233107 0.2327 0.231479 0.229448 0.226615 0.222986 0.218575 0.213393 0.207457 0.200782 0.193387 0.185291 0.176517 0.167083 0.157014 0.146331 0.135058 0.123216 0.110829 0.224597 0.224194 0.222986 0.220978 0.218175 0.214586 0.210222 0.205094 0.199219 0.192612 0.185291 0.177276 0.168586 0.159241 0.149265 0.138678 0.127504 0.115763 0.103479 0.215382 0.214984 0.213791 0.211806 0.209035 0.205488 0.201173 0.196103 0.190293 0.183759 0.176517 0.168586 0.159985 0.150736 0.140858 0.130374 0.119304 0.107672 0.0954974 0.205488 0.205094 0.203916 0.201956 0.199219 0.195715 0.191452 0.186443 0.180702 0.174243 0.167083 0.159241 0.150736 0.141586 0.131812 0.121436 0.110478 0.0989589 0.0869009 0.194938 0.19455 0.193387 0.191452 0.188751 0.185291 0.181083 0.176137 0.170467 0.164087 0.157014 0.149265 0.140858 0.131812 0.122148 0.111884 0.101042 0.0896429 0.0777067 0.183759 0.183376 0.182229 0.18032 0.177656 0.174243 0.17009 0.16521 0.159613 0.153315 0.146331 0.138678 0.130374 0.121436 0.111884 0.101738 0.0910171 0.0797419 0.0679324 0.171975 0.171598 0.170467 0.168586 0.165959 0.162593 0.158498 0.153684 0.148164 0.14195 0.135058 0.127504 0.119304 0.110478 0.101042 0.0910171 0.0804213 0.0692745 0.0575962 0.159613 0.159241 0.158127 0.156273 0.153684 0.150368 0.146331 0.141586 0.136142 0.130014 0.123216 0.115763 0.107672 0.0989589 0.0896429 0.0797419 0.0692745 0.0582596 0.0467162 0.146698 0.146331 0.145234 0.143408 0.140858 0.137591 0.133614 0.128937 0.123573 0.117532 0.110829 0.103479 0.0954974 0.0869009 0.0777067 0.0679324 0.0575962 0.0467162 0.0353109 0.133253 0.132893 0.131812 0.130014 0.127504 0.124286 0.120369 0.115763 0.110478 0.104525 0.0979191 0.0906733 0.0828032 0.0743246 0.065254 0.0556087 0.0454058 0.0346633 0.0233988 0.119304 0.118949 0.117886 0.116117 0.113645 0.110478 0.106622 0.102086 0.0968804 0.0910171 0.0845083 0.0773679 0.0696103 0.0612508 0.0523054 0.0427905 0.0327229 0.0221196 0.010998 0.104874 0.104525 0.103479 0.101738 0.0993058 0.0961886 0.0923933 0.0879282 0.0828032 0.0770293 0.0706185 0.063584 0.0559396 0.0477002 0.0388809 0.0294976 0.0195664 0.00910394 -0.00187325 0.0899863 0.0896429 0.0886137 0.0869009 0.0845083 0.0814413 0.0777067 0.0733124 0.0682677 0.0625833 0.0562707 0.0493423 0.0418116 0.0336926 0.025 0.015749 0.00595523 -0.00436547 -0.015197 0.0746622 0.0743246 0.0733124 0.0716278 0.0692745 0.0662575 0.0625833 0.0582596 0.0532952 0.0477002 0.0414855 0.0346633 0.0272462 0.0192477 0.0106821 0.00156372 -0.00809226 -0.0182706 -0.0289558 0.0589235 0.0585915 0.0575962 0.0559396 0.0536253 0.0506581 0.0470441 0.0427905 0.0379059 0.0323999 0.0262829 0.0195664 0.0122627 0.00438461 -0.00405428 -0.01304 -0.0225581 -0.0325938 -0.0431323 0.0427905 0.0424641 0.0414855 0.0398568 0.0375812 0.0346633 0.0311089 0.026925 0.0221196 0.016702 0.0106821 0.00407079 -0.00312013 -0.0108783 -0.0191909 -0.0280443 -0.0374247 -0.047318 -0.0577098 0.0262829 0.025962 0.025 0.0233988 0.0211614 0.0182923 0.014797 0.0106821 0.00595523 0.000625195 -0.00529846 -0.0118053 -0.0188842 -0.0265233 -0.0347101 -0.0434318 -0.0526752 -0.0624265 -0.0726719 0.00941936 0.00910394 0.00815828 0.00658418 0.00438461 0.00156372 -0.00187325 -0.00591998 -0.0105691 -0.0158125 -0.0216408 -0.0280443 -0.0350121 -0.042533 -0.0505951 -0.059186 -0.068293 -0.0779031 -0.0880028 -0.00778222 -0.00809226 -0.0090218 -0.0105691 -0.0127315 -0.0155048 -0.0188842 -0.0228636 -0.0274361 -0.0325938 -0.038328 -0.0446291 -0.051487 -0.0588909 -0.0668294 -0.0752907 -0.0842624 -0.0937321 -0.103687 0.25 0.249583 0.248335 0.246259 0.243363 0.239655 0.235147 0.229854 0.223791 0.216977 0.209431 0.201173 0.192225 0.182611 0.172353 0.161475 0.15 0.137953 0.125357 0.249583 0.249167 0.24792 0.245845 0.24295 0.239244 0.234739 0.229448 0.223389 0.216578 0.209035 0.200782 0.191839 0.182229 0.171975 0.161102 0.149632 0.137591 0.125 0.248335 0.24792 0.246674 0.244603 0.241712 0.238012 0.233515 0.228233 0.222183 0.215382 0.207851 0.199609 0.190679 0.181083 0.170844 0.159985 0.148531 0.136504 0.123929 0.246259 0.245845 0.244603 0.242537 0.239655 0.235965 0.231479 0.226211 0.220176 0.213393 0.205881 0.19766 0.188751 0.179177 0.168961 0.158127 0.146698 0.134697 0.122148 0.243363 0.24295 0.241712 0.239655 0.236783 0.233107 0.228638 0.223389 0.217376 0.210617 0.203131 0.194938 0.186059 0.176517 0.166333 0.155533 0.144138 0.132172 0.119659 0.239655 0.239244 0.238012 0.235965 0.233107 0.229448 0.225 0.219776 0.213791 0.207062 0.199609 0.191452 0.182611 0.173108 0.162967 0.152209 0.140858 0.128937 0.11647 0.235147 0.234739 0.233515 0.231479 0.228638 0.225 0.220577 0.215382 0.209431 0.202739 0.195326 0.187212 0.178416 0.168961 0.15887 0.148164 0.136866 0.125 0.112588 0.229854 0.229448 0.228233 0.226211 0.223389 0.219776 0.215382 0.210222 0.204308 0.19766 0.190293 0.182229 0.173486 0.164087 0.154054 0.143408 0.132172 0.120369 0.108022 0.223791 0.223389 0.222183 0.220176 0.217376 0.213791 0.209431 0.204308 0.198439 0.191839 0.184525 0.176517 0.167834 0.158498 0.148531 0.137953 0.126788 0.115056 0.102782 0.216977 0.216578 0.215382 0.213393 0.210617 0.207062 0.202739 0.19766 0.191839 0.185291 0.178036 0.17009 0.161475 0.152209 0.142314 0.131812 0.120725 0.109074 0.0968804 0.209431 0.209035 0.207851 0.205881 0.203131 0.199609 0.195326 0.190293 0.184525 0.178036 0.170844 0.162967 0.154423 0.145234 0.135419 0.125 0.113998 0.102434 0.0903297 0.201173 0.200782 0.199609 0.19766 0.194938 0.191452 0.187212 0.182229 0.176517 0.17009 0.162967 0.155163 0.146698 0.137591 0.127862 0.117532 0.106622 0.0951519 0.083144 0.192225 0.191839 0.190679 0.188751 0.186059 0.182611 0.178416 0.173486 0.167834 0.161475 0.154423 0.146698 0.138316 0.129296 0.119659 0.109424 0.0986122 0.0872432 0.0753379 0.182611 0.182229 0.181083 0.179177 0.176517 0.173108 0.168961 0.164087 0.158498 0.152209 0.145234 0.137591 0.129296 0.120369 0.110829 0.100695 0.0899863 0.0787237 0.0669271 0.172353 0.171975 0.170844 0.168961 0.166333 0.162967 0.15887 0.154054 0.148531 0.142314 0.135419 0.127862 0.119659 0.110829 0.10139 0.0913609 0.0807612 0.0696103 0.0579278 0.161475 0.161102 0.159985 0.158127 0.155533 0.152209 0.148164 0.143408 0.137953 0.131812 0.125 0.117532 0.109424 0.100695 0.0913609 0.0814413 0.0709548 0.0599202 0.0483567 0.15 0.149632 0.148531 0.146698 0.144138 0.140858 0.136866 0.132172 0.126788 0.120725 0.113998 0.106622 0.0986122 0.0899863 0.0807612 0.0709548 0.0605853 0.0496711 0.0382308 0.137953 0.137591 0.136504 0.134697 0.132172 0.128937 0.125 0.120369 0.115056 0.109074 0.102434 0.0951519 0.0872432 0.0787237 0.0696103 0.0599202 0.0496711 0.0388809 0.0275675 0.125357 0.125 0.123929 0.122148 0.119659 0.11647 0.112588 0.108022 0.102782 0.0968804 0.0903297 0.083144 0.0753379 0.0669271 0.0579278 0.0483567 0.0382308 0.0275675 0.0163842 0.112236 0.111884 0.110829 0.109074 0.106622 0.103479 0.0996528 0.0951519 0.0899863 0.084167 0.0777067 0.0706185 0.0629168 0.0546165 0.0457333 0.0362832 0.0262829 0.015749 0.00469854 0.0986122 0.0982656 0.0972265 0.0954974 0.0930821 0.0899863 0.0862167 0.0817816 0.0766907 0.0709548 0.0645857 0.0575962 0.05 0.0418116 0.033046 0.0237188 0.0138459 0.00344343 -0.00747208 0.0845083 0.084167 0.083144 0.0814413 0.079063 0.0760141 0.0723012 0.0679324 0.0629168 0.0572646 0.0509874 0.0440973 0.0366076 0.028532 0.0198852 0.0106821 0.00093794 -0.00933146 -0.0201103 0.0699462 0.0696103 0.0686032 0.0669271 0.0645857 0.0615838 0.0579278 0.0536253 0.0486851 0.043117 0.036932 0.0301418 0.022759 0.014797 0.00626965 -0.00280856 -0.0124228 -0.0225581 -0.0331989 0.0549471 0.0546165 0.0536253 0.0519757 0.0496711 0.0467162 0.043117 0.0388809 0.034016 0.028532 0.0224393 0.015749 0.0084734 0.000625195 -0.00778222 -0.016735 -0.0262188 -0.0362191 -0.0467211 0.0395314 0.0392061 0.0382308 0.0366076 0.0343396 0.0314315 0.0278889 0.0237188 0.0189292 0.013529 0.00752834 0.00093794 -0.00623059 -0.013965 -0.0222524 -0.0310795 -0.0404326 -0.0502976 -0.0606602 0.0237188 0.0233988 0.0224393 0.0208422 0.0186107 0.015749 0.0122627 0.00815828 0.00344343 -0.00187325 -0.00778222 -0.0142731 -0.0213349 -0.0289558 -0.0371234 -0.045825 -0.0550474 -0.064777 -0.075 0.00752834 0.00721352 0.00626965 0.00469854 0.00250313 -0.000312451 -0.00374299 -0.00778222 -0.0124228 -0.0176566 -0.0234745 -0.0298665 -0.0368221 -0.0443299 -0.0523783 -0.0609548 -0.0700467 -0.0796411 -0.0897247 -0.0090218 -0.00933146 -0.0102599 -0.0118053 -0.013965 -0.016735 -0.0201103 -0.024085 -0.028652 -0.0338037 -0.0395311 -0.045825 -0.0526752 -0.0600708 -0.0680005 -0.0764525 -0.0854147 -0.0948744 -0.104819 -0.0259142 -0.0262188 -0.0271319 -0.028652 -0.0307764 -0.0335013 -0.0368221 -0.0407329 -0.0452272 -0.0502976 -0.0559356 -0.0621323 -0.0688779 -0.0761622 -0.0839742 -0.0923026 -0.101136 -0.110462 -0.120268 0.225 0.224597 0.223389 0.221379 0.218575 0.214984 0.210617 0.205488 0.199609 0.192999 0.185675 0.177656 0.168961 0.159613 0.149632 0.139041 0.127862 0.116117 0.103828 0.224597 0.224194 0.222986 0.220978 0.218175 0.214586 0.210222 0.205094 0.199219 0.192612 0.185291 0.177276 0.168586 0.159241 0.149265 0.138678 0.127504 0.115763 0.103479 0.223389 0.222986 0.221781 0.219776 0.216977 0.213393 0.209035 0.203916 0.198049 0.191452 0.184142 0.176137 0.167459 0.158127 0.148164 0.137591 0.12643 0.114703 0.102434 0.221379 0.220978 0.219776 0.217776 0.214984 0.211409 0.207062 0.201956 0.196103 0.189522 0.182229 0.174243 0.165584 0.156273 0.146331 0.135781 0.124643 0.11294 0.100695 0.218575 0.218175 0.216977 0.214984 0.212202 0.20864 0.204308 0.199219 0.193387 0.186827 0.179558 0.171598 0.162967 0.153684 0.143773 0.133253 0.122148 0.110478 0.0982656 0.214984 0.214586 0.213393 0.211409 0.20864 0.205094 0.200782 0.195715 0.189907 0.183376 0.176137 0.16821 0.159613 0.150368 0.140494 0.130014 0.118949 0.107321 0.0951519 0.210617 0.210222 0.209035 0.207062 0.204308 0.200782 0.196492 0.191452 0.185675 0.179177 0.171975 0.164087 0.155533 0.146331 0.136504 0.126072 0.115056 0.103479 0.0913609 0.205488 0.205094 0.203916 0.201956 0.199219 0.195715 0.191452 0.186443 0.180702 0.174243 0.167083 0.159241 0.150736 0.141586 0.131812 0.121436 0.110478 0.0989589 0.0869009 0.199609 0.199219 0.198049 0.196103 0.193387 0.189907 0.185675 0.180702 0.175 0.168586 0.161475 0.153684 0.145234 0.136142 0.12643 0.116117 0.105223 0.0937716 0.0817816 0.192999 0.192612 0.191452 0.189522 0.186827 0.183376 0.179177 0.174243 0.168586 0.16222 0.155163 0.14743 0.139041 0.130014 0.120369 0.110126 0.0993058 0.0879282 0.0760141 0.185675 0.185291 0.184142 0.182229 0.179558 0.176137 0.171975 0.167083 0.161475 0.155163 0.148164 0.140494 0.132172 0.123216 0.113645 0.103479 0.0927376 0.0814413 0.0696103 0.177656 0.177276 0.176137 0.174243 0.171598 0.16821 0.164087 0.159241 0.153684 0.14743 0.140494 0.132893 0.124643 0.115763 0.106272 0.0961886 0.0855329 0.0743246 0.0625833 0.168961 0.168586 0.167459 0.165584 0.162967 0.159613 0.155533 0.150736 0.145234 0.139041 0.132172 0.124643 0.11647 0.107672 0.0982656 0.0882709 0.0777067 0.0665923 0.0549471 0.159613 0.159241 0.158127 0.156273 0.153684 0.150368 0.146331 0.141586 0.136142 0.130014 0.123216 0.115763 0.107672 0.0989589 0.0896429 0.0797419 0.0692745 0.0582596 0.0467162 0.149632 0.149265 0.148164 0.146331 0.143773 0.140494 0.136504 0.131812 0.12643 0.120369 0.113645 0.106272 0.0982656 0.0896429 0.0804213 0.0706185 0.0602527 0.0493423 0.0379059 0.139041 0.138678 0.137591 0.135781 0.133253 0.130014 0.126072 0.121436 0.116117 0.110126 0.103479 0.0961886 0.0882709 0.0797419 0.0706185 0.060918 0.0506581 0.0398568 0.028532 0.127862 0.127504 0.12643 0.124643 0.122148 0.118949 0.115056 0.110478 0.105223 0.0993058 0.0927376 0.0855329 0.0777067 0.0692745 0.0602527 0.0506581 0.0405079 0.0298196 0.0186107 0.116117 0.115763 0.114703 0.11294 0.110478 0.107321 0.103479 0.0989589 0.0937716 0.0879282 0.0814413 0.0743246 0.0665923 0.0582596 0.0493423 0.0398568 0.0298196 0.0192477 0.00815828 0.103828 0.103479 0.102434 0.100695 0.0982656 0.0951519 0.0913609 0.0869009 0.0817816 0.0760141 0.0696103 0.0625833 0.0549471 0.0467162 0.0379059 0.028532 0.0186107 0.00815828 -0.00280856 0.0910171 0.0906733 0.0896429 0.0879282 0.0855329 0.0824625 0.0787237 0.0743246 0.0692745 0.063584 0.0572646 0.050329 0.0427905 0.0346633 0.025962 0.016702 0.0068988 -0.00343161 -0.0142731 0.0777067 0.0773679 0.0763523 0.0746622 0.0723012 0.0692745 0.0655884 0.0612508 0.0562707 0.0506581 0.0444243 0.0375812 0.0301418 0.0221196 0.013529 0.00438461 -0.00529846 -0.0155048 -0.0262188 0.0639177 0.063584 0.0625833 0.060918 0.0585915 0.0556087 0.0519757 0.0477002 0.0427905 0.0372565 0.0311089 0.0243592 0.0170198 0.00910394 0.000625195 -0.0084022 -0.0179637 -0.0280443 -0.0386289 0.0496711 0.0493423 0.0483567 0.0467162 0.0444243 0.0414855 0.0379059 0.0336926 0.0288538 0.0233988 0.0173378 0.0106821 0.00344343 -0.00436547 -0.0127315 -0.0216408 -0.0310795 -0.0410331 -0.051487 0.034987 0.0346633 0.0336926 0.032077 0.0298196 0.026925 0.0233988 0.0192477 0.0144798 0.00910394 0.0031299 -0.00343161 -0.0105691 -0.0182706 -0.0265233 -0.035314 -0.0446291 -0.0544548 -0.064777 0.0198852 0.0195664 0.0186107 0.0170198 0.014797 0.0119464 0.0084734 0.00438461 -0.000312451 -0.00560927 -0.0114964 -0.0179637 -0.025 -0.0325938 -0.0407329 -0.0494046 -0.0585958 -0.068293 -0.0784827 0.00438461 0.00407079 0.0031299 0.00156372 -0.000624805 -0.00343161 -0.00685153 -0.0108783 -0.0155048 -0.0207228 -0.0265233 -0.0328964 -0.0398317 -0.047318 -0.0553435 -0.0638961 -0.0729632 -0.0825318 -0.0925887 -0.0114964 -0.0118053 -0.0127315 -0.0142731 -0.0164276 -0.0191909 -0.0225581 -0.0265233 -0.0310795 -0.0362191 -0.0419333 -0.0482128 -0.0550474 -0.0624265 -0.0703387 -0.0787725 -0.0877155 -0.0971554 -0.107079 -0.0277402 -0.0280443 -0.0289558 -0.0304732 -0.0325938 -0.035314 -0.0386289 -0.042533 -0.0470196 -0.0520813 -0.0577098 -0.0638961 -0.0706307 -0.0779031 -0.0857025 -0.0940178 -0.102837 -0.112149 -0.12194 -0.0443299 -0.0446291 -0.0455262 -0.0470196 -0.0491068 -0.0517842 -0.0550474 -0.0588909 -0.0633085 -0.068293 -0.0738366 -0.0799306 -0.0865657 -0.0937321 -0.10142 -0.109617 -0.118313 -0.127497 -0.137157 0.2 0.199609 0.198439 0.196492 0.193774 0.190293 0.186059 0.181083 0.175379 0.168961 0.161847 0.154054 0.1456 0.136504 0.126788 0.11647 0.105573 0.0941165 0.082122 0.199609 0.199219 0.198049 0.196103 0.193387 0.189907 0.185675 0.180702 0.175 0.168586 0.161475 0.153684 0.145234 0.136142 0.12643 0.116117 0.105223 0.0937716 0.0817816 0.198439 0.198049 0.196881 0.194938 0.192225 0.188751 0.184525 0.179558 0.173864 0.167459 0.160357 0.152577 0.144138 0.135058 0.125357 0.115056 0.104176 0.0927376 0.0807612 0.196492 0.196103 0.194938 0.192999 0.190293 0.186827 0.182611 0.177656 0.171975 0.165584 0.158498 0.150736 0.142314 0.133253 0.123573 0.113293 0.102434 0.0910171 0.079063 0.193774 0.193387 0.192225 0.190293 0.187596 0.184142 0.179939 0.175 0.169338 0.162967 0.155903 0.148164 0.139767 0.130733 0.12108 0.110829 0.1 0.0886137 0.0766907 0.190293 0.189907 0.188751 0.186827 0.184142 0.180702 0.176517 0.171598 0.165959 0.159613 0.152577 0.144868 0.136504 0.127504 0.117886 0.107672 0.0968804 0.0855329 0.0736496 0.186059 0.185675 0.184525 0.182611 0.179939 0.176517 0.172353 0.167459 0.161847 0.155533 0.148531 0.140858 0.132532 0.123573 0.113998 0.103828 0.0930821 0.0817816 0.0699462 0.181083 0.180702 0.179558 0.177656 0.175 0.171598 0.167459 0.162593 0.157014 0.150736 0.143773 0.136142 0.127862 0.118949 0.109424 0.0993058 0.0886137 0.0773679 0.0655884 0.175379 0.175 0.173864 0.171975 0.169338 0.165959 0.161847 0.157014 0.151472 0.145234 0.138316 0.130733 0.122504 0.113645 0.104176 0.0941165 0.0834849 0.0723012 0.0605853 0.168961 0.168586 0.167459 0.165584 0.162967 0.159613 0.155533 0.150736 0.145234 0.139041 0.132172 0.124643 0.11647 0.107672 0.0982656 0.0882709 0.0777067 0.0665923 0.0549471 0.161847 0.161475 0.160357 0.158498 0.155903 0.152577 0.148531 0.143773 0.138316 0.132172 0.125357 0.117886 0.109775 0.101042 0.0917049 0.0817816 0.0712912 0.0602527 0.0486851 0.154054 0.153684 0.152577 0.150736 0.148164 0.144868 0.140858 0.136142 0.130733 0.124643 0.117886 0.110478 0.102434 0.0937716 0.0845083 0.0746622 0.0642516 0.0532952 0.0418116 0.1456 0.145234 0.144138 0.142314 0.139767 0.136504 0.132532 0.127862 0.122504 0.11647 0.109775 0.102434 0.0944615 0.0858747 0.0766907 0.0669271 0.0566019 0.0457333 0.0343396 0.136504 0.136142 0.135058 0.133253 0.130733 0.127504 0.123573 0.118949 0.113645 0.107672 0.101042 0.0937716 0.0858747 0.0773679 0.0682677 0.0585915 0.0483567 0.0375812 0.0262829 0.126788 0.12643 0.125357 0.123573 0.12108 0.117886 0.113998 0.109424 0.104176 0.0982656 0.0917049 0.0845083 0.0766907 0.0682677 0.0592556 0.0496711 0.0395314 0.0288538 0.0176559 0.11647 0.116117 0.115056 0.113293 0.110829 0.107672 0.103828 0.0993058 0.0941165 0.0882709 0.0817816 0.0746622 0.0669271 0.0585915 0.0496711 0.0401823 0.0301418 0.0195664 0.0084734 0.105573 0.105223 0.104176 0.102434 0.1 0.0968804 0.0930821 0.0886137 0.0834849 0.0777067 0.0712912 0.0642516 0.0566019 0.0483567 0.0395314 0.0301418 0.0202041 0.00973488 -0.00124922 0.0941165 0.0937716 0.0927376 0.0910171 0.0886137 0.0855329 0.0817816 0.0773679 0.0723012 0.0665923 0.0602527 0.0532952 0.0457333 0.0375812 0.0288538 0.0195664 0.00973488 -0.000624805 -0.0114964 0.082122 0.0817816 0.0807612 0.079063 0.0766907 0.0736496 0.0699462 0.0655884 0.0605853 0.0549471 0.0486851 0.0418116 0.0343396 0.0262829 0.0176559 0.0084734 -0.00124922 -0.0114964 -0.0222524 0.0696103 0.0692745 0.0682677 0.0665923 0.0642516 0.0612508 0.0575962 0.0532952 0.0483567 0.0427905 0.0366076 0.0298196 0.0224393 0.0144798 0.00595523 -0.00312013 -0.0127315 -0.0228636 -0.0335013 0.0566019 0.0562707 0.0552778 0.0536253 0.0513167 0.0483567 0.0447513 0.0405079 0.0356349 0.0301418 0.0240389 0.0173378 0.0100505 0.0021899 -0.00623059 -0.015197 -0.0246951 -0.0347101 -0.0452272 0.043117 0.0427905 0.0418116 0.0401823 0.0379059 0.034987 0.0314315 0.0272462 0.0224393 0.0170198 0.010998 0.00438461 -0.00280856 -0.0105691 -0.0188842 -0.0277402 -0.0371234 -0.0470196 -0.0574143 0.0291756 0.0288538 0.0278889 0.0262829 0.0240389 0.0211614 0.0176559 0.013529 0.00878862 0.00344343 -0.00249688 -0.0090218 -0.0161201 -0.0237798 -0.0319884 -0.0407329 -0.05 -0.0597759 -0.0700467 0.014797 0.0144798 0.013529 0.0119464 0.00973488 0.0068988 0.00344343 -0.000624805 -0.00529846 -0.0105691 -0.0164276 -0.0228636 -0.0298665 -0.0374247 -0.0455262 -0.0541584 -0.0633085 -0.0729632 -0.083109 0 -0.000312451 -0.00124922 -0.00280856 -0.00498756 -0.00778222 -0.0111874 -0.015197 -0.0198039 -0.025 -0.0307764 -0.0371234 -0.0440307 -0.051487 -0.059481 -0.0680005 -0.077033 -0.0865657 -0.0965856 -0.015197 -0.0155048 -0.0164276 -0.0179637 -0.0201103 -0.0228636 -0.0262188 -0.0301699 -0.0347101 -0.0398317 -0.0455262 -0.0517842 -0.0585958 -0.0659503 -0.0738366 -0.082243 -0.0911576 -0.100568 -0.110462 -0.0307764 -0.0310795 -0.0319884 -0.0335013 -0.0356158 -0.038328 -0.0416333 -0.0455262 -0.05 -0.0550474 -0.0606602 -0.0668294 -0.0735455 -0.0807983 -0.0885771 -0.0968705 -0.105667 -0.114955 -0.124722 -0.0467211 -0.0470196 -0.0479146 -0.0494046 -0.051487 -0.0541584 -0.0574143 -0.0612493 -0.0656571 -0.0706307 -0.0761622 -0.082243 -0.0888641 -0.0960155 -0.103687 -0.111868 -0.120547 -0.129712 -0.139353 -0.0630146 -0.0633085 -0.0641898 -0.0656571 -0.0677078 -0.0703387 -0.0735455 -0.0773231 -0.0816654 -0.0865657 -0.0920165 -0.0980096 -0.104536 -0.111587 -0.119151 -0.12722 -0.135782 -0.144825 -0.15434 0.175 0.174621 0.173486 0.171598 0.168961 0.165584 0.161475 0.156644 0.151104 0.144868 0.137953 0.130374 0.122148 0.113293 0.103828 0.0937716 0.083144 0.0719644 0.0602527 0.174621 0.174243 0.173108 0.171221 0.168586 0.16521 0.161102 0.156273 0.150736 0.144503 0.137591 0.130014 0.121792 0.11294 0.103479 0.0934268 0.0828032 0.0716278 0.0599202 0.173486 0.173108 0.171975 0.17009 0.167459 0.164087 0.159985 0.155163 0.149632 0.143408 0.136504 0.128937 0.120725 0.111884 0.102434 0.0923933 0.0817816 0.0706185 0.0589235 0.171598 0.171221 0.17009 0.16821 0.165584 0.16222 0.158127 0.153315 0.147797 0.141586 0.134697 0.127145 0.118949 0.110126 0.100695 0.0906733 0.0800815 0.0689388 0.0572646 0.168961 0.168586 0.167459 0.165584 0.162967 0.159613 0.155533 0.150736 0.145234 0.139041 0.132172 0.124643 0.11647 0.107672 0.0982656 0.0882709 0.0777067 0.0665923 0.0549471 0.165584 0.16521 0.164087 0.16222 0.159613 0.156273 0.152209 0.14743 0.14195 0.135781 0.128937 0.121436 0.113293 0.104525 0.0951519 0.0851913 0.0746622 0.063584 0.0519757 0.161475 0.161102 0.159985 0.158127 0.155533 0.152209 0.148164 0.143408 0.137953 0.131812 0.125 0.117532 0.109424 0.100695 0.0913609 0.0814413 0.0709548 0.0599202 0.0483567 0.156644 0.156273 0.155163 0.153315 0.150736 0.14743 0.143408 0.138678 0.133253 0.127145 0.120369 0.11294 0.104874 0.0961886 0.0869009 0.0770293 0.0665923 0.0556087 0.0440973 0.151104 0.150736 0.149632 0.147797 0.145234 0.14195 0.137953 0.133253 0.127862 0.121792 0.115056 0.107672 0.0996528 0.0910171 0.0817816 0.0719644 0.0615838 0.0506581 0.0392061 0.144868 0.144503 0.143408 0.141586 0.139041 0.135781 0.131812 0.127145 0.121792 0.115763 0.109074 0.101738 0.0937716 0.0851913 0.0760141 0.0662575 0.0559396 0.0450785 0.0336926 0.137953 0.137591 0.136504 0.134697 0.132172 0.128937 0.125 0.120369 0.115056 0.109074 0.102434 0.0951519 0.0872432 0.0787237 0.0696103 0.0599202 0.0496711 0.0388809 0.0275675 0.130374 0.130014 0.128937 0.127145 0.124643 0.121436 0.117532 0.11294 0.107672 0.101738 0.0951519 0.0879282 0.0800815 0.0716278 0.0625833 0.0529652 0.0427905 0.032077 0.0208422 0.122148 0.121792 0.120725 0.118949 0.11647 0.113293 0.109424 0.104874 0.0996528 0.0937716 0.0872432 0.0800815 0.0723012 0.0639177 0.0549471 0.0454058 0.0353109 0.0246795 0.013529 0.113293 0.11294 0.111884 0.110126 0.107672 0.104525 0.100695 0.0961886 0.0910171 0.0851913 0.0787237 0.0716278 0.0639177 0.0556087 0.0467162 0.0372565 0.0272462 0.016702 0.00564091 0.103828 0.103479 0.102434 0.100695 0.0982656 0.0951519 0.0913609 0.0869009 0.0817816 0.0760141 0.0696103 0.0625833 0.0549471 0.0467162 0.0379059 0.028532 0.0186107 0.00815828 -0.00280856 0.0937716 0.0934268 0.0923933 0.0906733 0.0882709 0.0851913 0.0814413 0.0770293 0.0719644 0.0662575 0.0599202 0.0529652 0.0454058 0.0372565 0.028532 0.0192477 0.00941936 -0.000937061 -0.0118053 0.083144 0.0828032 0.0817816 0.0800815 0.0777067 0.0746622 0.0709548 0.0665923 0.0615838 0.0559396 0.0496711 0.0427905 0.0353109 0.0272462 0.0186107 0.00941936 -0.000312451 -0.0105691 -0.0213349 0.0719644 0.0716278 0.0706185 0.0689388 0.0665923 0.063584 0.0599202 0.0556087 0.0506581 0.0450785 0.0388809 0.032077 0.0246795 0.016702 0.00815828 -0.000937061 -0.0105691 -0.0207228 -0.0313826 0.0602527 0.0599202 0.0589235 0.0572646 0.0549471 0.0519757 0.0483567 0.0440973 0.0392061 0.0336926 0.0275675 0.0208422 0.013529 0.00564091 -0.00280856 -0.0118053 -0.0213349 -0.0313826 -0.0419333 0.0480284 0.0477002 0.0467162 0.0450785 0.0427905 0.0398568 0.0362832 0.032077 0.0272462 0.0218001 0.015749 0.00910394 0.00187676 -0.00591998 -0.0142731 -0.0231691 -0.0325938 -0.042533 -0.052972 0.0353109 0.034987 0.034016 0.0323999 0.0301418 0.0272462 0.0237188 0.0195664 0.014797 0.00941936 0.00344343 -0.00312013 -0.0102599 -0.0179637 -0.0262188 -0.0350121 -0.0443299 -0.0541584 -0.0644834 0.0221196 0.0218001 0.0208422 0.0192477 0.0170198 0.0141628 0.0106821 0.00658418 0.00187676 -0.00343161 -0.00933146 -0.0158125 -0.0228636 -0.0304732 -0.0386289 -0.047318 -0.0565273 -0.0662434 -0.0764525 0.0084734 0.00815828 0.00721352 0.00564091 0.00344343 0.000625195 -0.00280856 -0.00685153 -0.0114964 -0.016735 -0.0225581 -0.0289558 -0.0359175 -0.0434318 -0.051487 -0.0600708 -0.0691702 -0.0787725 -0.0888641 -0.00560927 -0.00591998 -0.00685153 -0.0084022 -0.0105691 -0.0133484 -0.016735 -0.0207228 -0.0253048 -0.0304732 -0.0362191 -0.042533 -0.0494046 -0.0568231 -0.064777 -0.0732544 -0.082243 -0.0917303 -0.101703 -0.0201103 -0.0204166 -0.0213349 -0.0228636 -0.025 -0.0277402 -0.0310795 -0.0350121 -0.0395311 -0.0446291 -0.0502976 -0.0565273 -0.0633085 -0.0706307 -0.0784827 -0.0868533 -0.0957304 -0.105102 -0.114955 -0.0350121 -0.035314 -0.0362191 -0.0377259 -0.0398317 -0.042533 -0.045825 -0.0497023 -0.0541584 -0.059186 -0.064777 -0.0709225 -0.0776131 -0.0848387 -0.0925887 -0.100852 -0.109617 -0.118872 -0.128605 -0.0502976 -0.0505951 -0.051487 -0.052972 -0.0550474 -0.0577098 -0.0609548 -0.064777 -0.0691702 -0.0741276 -0.0796411 -0.0857025 -0.0923026 -0.0994317 -0.107079 -0.115235 -0.123888 -0.133027 -0.142639 -0.0659503 -0.0662434 -0.0671223 -0.0685855 -0.0706307 -0.0732544 -0.0764525 -0.0802199 -0.0845506 -0.0894379 -0.0948744 -0.100852 -0.107362 -0.114394 -0.12194 -0.129989 -0.13853 -0.147552 -0.157044 -0.0819543 -0.082243 -0.083109 -0.0845506 -0.0865657 -0.089151 -0.0923026 -0.0960155 -0.100284 -0.105102 -0.110462 -0.116356 -0.122776 -0.129712 -0.137157 -0.145098 -0.153527 -0.162433 -0.171804 0.15 0.149632 0.148531 0.146698 0.144138 0.140858 0.136866 0.132172 0.126788 0.120725 0.113998 0.106622 0.0986122 0.0899863 0.0807612 0.0709548 0.0605853 0.0496711 0.0382308 0.149632 0.149265 0.148164 0.146331 0.143773 0.140494 0.136504 0.131812 0.12643 0.120369 0.113645 0.106272 0.0982656 0.0896429 0.0804213 0.0706185 0.0602527 0.0493423 0.0379059 0.148531 0.148164 0.147064 0.145234 0.142679 0.139404 0.135419 0.130733 0.125357 0.119304 0.112588 0.105223 0.0972265 0.0886137 0.0794024 0.0696103 0.0592556 0.0483567 0.036932 0.146698 0.146331 0.145234 0.143408 0.140858 0.137591 0.133614 0.128937 0.123573 0.117532 0.110829 0.103479 0.0954974 0.0869009 0.0777067 0.0679324 0.0575962 0.0467162 0.0353109 0.144138 0.143773 0.142679 0.140858 0.138316 0.135058 0.131093 0.12643 0.12108 0.115056 0.108372 0.101042 0.0930821 0.0845083 0.0753379 0.0655884 0.0552778 0.0444243 0.033046 0.140858 0.140494 0.139404 0.137591 0.135058 0.131812 0.127862 0.123216 0.117886 0.111884 0.105223 0.0979191 0.0899863 0.0814413 0.0723012 0.0625833 0.0523054 0.0414855 0.0301418 0.136866 0.136504 0.135419 0.133614 0.131093 0.127862 0.123929 0.119304 0.113998 0.108022 0.10139 0.0941165 0.0862167 0.0777067 0.0686032 0.0589235 0.0486851 0.0379059 0.0266039 0.132172 0.131812 0.130733 0.128937 0.12643 0.123216 0.119304 0.114703 0.109424 0.103479 0.0968804 0.0896429 0.0817816 0.0733124 0.0642516 0.0546165 0.0444243 0.0336926 0.0224393 0.126788 0.12643 0.125357 0.123573 0.12108 0.117886 0.113998 0.109424 0.104176 0.0982656 0.0917049 0.0845083 0.0766907 0.0682677 0.0592556 0.0496711 0.0395314 0.0288538 0.0176559 0.120725 0.120369 0.119304 0.117532 0.115056 0.111884 0.108022 0.103479 0.0982656 0.0923933 0.0858747 0.0787237 0.0709548 0.0625833 0.0536253 0.0440973 0.034016 0.0233988 0.0122627 0.113998 0.113645 0.112588 0.110829 0.108372 0.105223 0.10139 0.0968804 0.0917049 0.0858747 0.0794024 0.0723012 0.0645857 0.0562707 0.0473721 0.0379059 0.0278889 0.0173378 0.00626965 0.106622 0.106272 0.105223 0.103479 0.101042 0.0979191 0.0941165 0.0896429 0.0845083 0.0787237 0.0723012 0.065254 0.0575962 0.0493423 0.0405079 0.0311089 0.0211614 0.0106821 -0.000312451 0.0986122 0.0982656 0.0972265 0.0954974 0.0930821 0.0899863 0.0862167 0.0817816 0.0766907 0.0709548 0.0645857 0.0575962 0.05 0.0418116 0.033046 0.0237188 0.0138459 0.00344343 -0.00747208 0.0899863 0.0896429 0.0886137 0.0869009 0.0845083 0.0814413 0.0777067 0.0733124 0.0682677 0.0625833 0.0562707 0.0493423 0.0418116 0.0336926 0.025 0.015749 0.00595523 -0.00436547 -0.015197 0.0807612 0.0804213 0.0794024 0.0777067 0.0753379 0.0723012 0.0686032 0.0642516 0.0592556 0.0536253 0.0473721 0.0405079 0.033046 0.025 0.0163842 0.00721352 -0.00249688 -0.0127315 -0.0234745 0.0709548 0.0706185 0.0696103 0.0679324 0.0655884 0.0625833 0.0589235 0.0546165 0.0496711 0.0440973 0.0379059 0.0311089 0.0237188 0.015749 0.00721352 -0.00187325 -0.0114964 -0.0216408 -0.0322911 0.0605853 0.0602527 0.0592556 0.0575962 0.0552778 0.0523054 0.0486851 0.0444243 0.0395314 0.034016 0.0278889 0.0211614 0.0138459 0.00595523 -0.00249688 -0.0114964 -0.0210289 -0.0310795 -0.0416333 0.0496711 0.0493423 0.0483567 0.0467162 0.0444243 0.0414855 0.0379059 0.0336926 0.0288538 0.0233988 0.0173378 0.0106821 0.00344343 -0.00436547 -0.0127315 -0.0216408 -0.0310795 -0.0410331 -0.051487 0.0382308 0.0379059 0.036932 0.0353109 0.033046 0.0301418 0.0266039 0.0224393 0.0176559 0.0122627 0.00626965 -0.000312451 -0.00747208 -0.015197 -0.0234745 -0.0322911 -0.0416333 -0.051487 -0.061838 0.0262829 0.025962 0.025 0.0233988 0.0211614 0.0182923 0.014797 0.0106821 0.00595523 0.000625195 -0.00529846 -0.0118053 -0.0188842 -0.0265233 -0.0347101 -0.0434318 -0.0526752 -0.0624265 -0.0726719 0.0138459 0.013529 0.0125791 0.010998 0.00878862 0.00595523 0.00250313 -0.00156128 -0.00623059 -0.0114964 -0.0173495 -0.0237798 -0.0307764 -0.038328 -0.0464225 -0.0550474 -0.0641898 -0.0738366 -0.0839742 0.00093794 0.000625195 -0.000312451 -0.00187325 -0.00405428 -0.00685153 -0.0102599 -0.0142731 -0.0188842 -0.024085 -0.0298665 -0.0362191 -0.0431323 -0.0505951 -0.0585958 -0.0671223 -0.0761622 -0.0857025 -0.0957304 -0.0124228 -0.0127315 -0.0136567 -0.015197 -0.0173495 -0.0201103 -0.0234745 -0.0274361 -0.0319884 -0.0371234 -0.0428327 -0.0491068 -0.0559356 -0.0633085 -0.0712143 -0.0796411 -0.0885771 -0.0980096 -0.107926 -0.0262188 -0.0265233 -0.0274361 -0.0289558 -0.0310795 -0.0338037 -0.0371234 -0.0410331 -0.0455262 -0.0505951 -0.0562315 -0.0624265 -0.0691702 -0.0764525 -0.0842624 -0.0925887 -0.10142 -0.110743 -0.120547 -0.0404326 -0.0407329 -0.0416333 -0.0431323 -0.0452272 -0.0479146 -0.0511898 -0.0550474 -0.059481 -0.0644834 -0.0700467 -0.0761622 -0.0828204 -0.0900115 -0.0977249 -0.10595 -0.114675 -0.123888 -0.133578 -0.0550474 -0.0553435 -0.0562315 -0.0577098 -0.0597759 -0.0624265 -0.0656571 -0.0694625 -0.0738366 -0.0787725 -0.0842624 -0.0902981 -0.0968705 -0.10397 -0.111587 -0.11971 -0.128328 -0.137431 -0.147007 -0.0700467 -0.0703387 -0.0712143 -0.0726719 -0.0747093 -0.0773231 -0.0805091 -0.0842624 -0.0885771 -0.0934464 -0.098863 -0.104819 -0.111306 -0.118313 -0.125833 -0.133854 -0.142366 -0.151358 -0.160819 -0.0854147 -0.0857025 -0.0865657 -0.0880028 -0.0900115 -0.0925887 -0.0957304 -0.0994317 -0.103687 -0.10849 -0.113833 -0.11971 -0.126111 -0.133027 -0.140449 -0.148368 -0.156774 -0.165654 -0.175 -0.101136 -0.10142 -0.10227 -0.103687 -0.105667 -0.108208 -0.111306 -0.114955 -0.119151 -0.123888 -0.129159 -0.134956 -0.141271 -0.148096 -0.155422 -0.163239 -0.171537 -0.180307 -0.189538 0.125 0.124643 0.123573 0.121792 0.119304 0.116117 0.112236 0.107672 0.102434 0.0965345 0.0899863 0.0828032 0.075 0.0665923 0.0575962 0.0480284 0.0379059 0.0272462 0.0160666 0.124643 0.124286 0.123216 0.121436 0.118949 0.115763 0.111884 0.107321 0.102086 0.0961886 0.0896429 0.0824625 0.0746622 0.0662575 0.0572646 0.0477002 0.0375812 0.026925 0.015749 0.123573 0.123216 0.122148 0.120369 0.117886 0.114703 0.110829 0.106272 0.101042 0.0951519 0.0886137 0.0814413 0.0736496 0.065254 0.0562707 0.0467162 0.0366076 0.025962 0.014797 0.121792 0.121436 0.120369 0.118595 0.116117 0.11294 0.109074 0.104525 0.0993058 0.0934268 0.0869009 0.0797419 0.0719644 0.063584 0.0546165 0.0450785 0.034987 0.0243592 0.0132123 0.119304 0.118949 0.117886 0.116117 0.113645 0.110478 0.106622 0.102086 0.0968804 0.0910171 0.0845083 0.0773679 0.0696103 0.0612508 0.0523054 0.0427905 0.0327229 0.0221196 0.010998 0.116117 0.115763 0.114703 0.11294 0.110478 0.107321 0.103479 0.0989589 0.0937716 0.0879282 0.0814413 0.0743246 0.0665923 0.0582596 0.0493423 0.0398568 0.0298196 0.0192477 0.00815828 0.112236 0.111884 0.110829 0.109074 0.106622 0.103479 0.0996528 0.0951519 0.0899863 0.084167 0.0777067 0.0706185 0.0629168 0.0546165 0.0457333 0.0362832 0.0262829 0.015749 0.00469854 0.107672 0.107321 0.106272 0.104525 0.102086 0.0989589 0.0951519 0.0906733 0.0855329 0.0797419 0.0733124 0.0662575 0.0585915 0.050329 0.0414855 0.032077 0.0221196 0.0116301 0.000625195 0.102434 0.102086 0.101042 0.0993058 0.0968804 0.0937716 0.0899863 0.0855329 0.0804213 0.0746622 0.0682677 0.0612508 0.0536253 0.0454058 0.0366076 0.0272462 0.0173378 0.0068988 -0.00405428 0.0965345 0.0961886 0.0951519 0.0934268 0.0910171 0.0879282 0.084167 0.0797419 0.0746622 0.0689388 0.0625833 0.0556087 0.0480284 0.0398568 0.0311089 0.0218001 0.0119464 0.00156372 -0.00933146 0.0899863 0.0896429 0.0886137 0.0869009 0.0845083 0.0814413 0.0777067 0.0733124 0.0682677 0.0625833 0.0562707 0.0493423 0.0418116 0.0336926 0.025 0.015749 0.00595523 -0.00436547 -0.015197 0.0828032 0.0824625 0.0814413 0.0797419 0.0773679 0.0743246 0.0706185 0.0662575 0.0612508 0.0556087 0.0493423 0.0424641 0.034987 0.026925 0.0182923 0.00910394 -0.000624805 -0.0108783 -0.0216408 0.075 0.0746622 0.0736496 0.0719644 0.0696103 0.0665923 0.0629168 0.0585915 0.0536253 0.0480284 0.0418116 0.034987 0.0275675 0.0195664 0.010998 0.00187676 -0.00778222 -0.0179637 -0.028652 0.0665923 0.0662575 0.065254 0.063584 0.0612508 0.0582596 0.0546165 0.050329 0.0454058 0.0398568 0.0336926 0.026925 0.0195664 0.0116301 0.0031299 -0.00591998 -0.0155048 -0.0256096 -0.0362191 0.0575962 0.0572646 0.0562707 0.0546165 0.0523054 0.0493423 0.0457333 0.0414855 0.0366076 0.0311089 0.025 0.0182923 0.010998 0.0031299 -0.00529846 -0.0142731 -0.0237798 -0.0338037 -0.0443299 0.0480284 0.0477002 0.0467162 0.0450785 0.0427905 0.0398568 0.0362832 0.032077 0.0272462 0.0218001 0.015749 0.00910394 0.00187676 -0.00591998 -0.0142731 -0.0231691 -0.0325938 -0.042533 -0.052972 0.0379059 0.0375812 0.0366076 0.034987 0.0327229 0.0298196 0.0262829 0.0221196 0.0173378 0.0119464 0.00595523 -0.000624805 -0.00778222 -0.0155048 -0.0237798 -0.0325938 -0.0419333 -0.0517842 -0.0621323 0.0272462 0.026925 0.025962 0.0243592 0.0221196 0.0192477 0.015749 0.0116301 0.0068988 0.00156372 -0.00436547 -0.0108783 -0.0179637 -0.0256096 -0.0338037 -0.042533 -0.0517842 -0.0615437 -0.0717976 0.0160666 0.015749 0.014797 0.0132123 0.010998 0.00815828 0.00469854 0.000625195 -0.00405428 -0.00933146 -0.015197 -0.0216408 -0.028652 -0.0362191 -0.0443299 -0.052972 -0.0621323 -0.0717976 -0.0819543 0.00438461 0.00407079 0.0031299 0.00156372 -0.000624805 -0.00343161 -0.00685153 -0.0108783 -0.0155048 -0.0207228 -0.0265233 -0.0328964 -0.0398317 -0.047318 -0.0553435 -0.0638961 -0.0729632 -0.0825318 -0.0925887 -0.00778222 -0.00809226 -0.0090218 -0.0105691 -0.0127315 -0.0155048 -0.0188842 -0.0228636 -0.0274361 -0.0325938 -0.038328 -0.0446291 -0.051487 -0.0588909 -0.0668294 -0.0752907 -0.0842624 -0.0937321 -0.103687 -0.0204166 -0.0207228 -0.0216408 -0.0231691 -0.0253048 -0.0280443 -0.0313826 -0.035314 -0.0398317 -0.0449282 -0.0505951 -0.0568231 -0.0636024 -0.0709225 -0.0787725 -0.0871407 -0.0960155 -0.105385 -0.115235 -0.0335013 -0.0338037 -0.0347101 -0.0362191 -0.038328 -0.0410331 -0.0443299 -0.0482128 -0.0526752 -0.0577098 -0.0633085 -0.0694625 -0.0761622 -0.0833974 -0.0911576 -0.0994317 -0.108208 -0.117475 -0.12722 -0.0470196 -0.047318 -0.0482128 -0.0497023 -0.0517842 -0.0544548 -0.0577098 -0.0615437 -0.0659503 -0.0709225 -0.0764525 -0.0825318 -0.089151 -0.0963006 -0.10397 -0.112149 -0.120826 -0.129989 -0.139627 -0.0609548 -0.0612493 -0.0621323 -0.0636024 -0.0656571 -0.068293 -0.0715059 -0.0752907 -0.0796411 -0.0845506 -0.0900115 -0.0960155 -0.102554 -0.109617 -0.117195 -0.125278 -0.133854 -0.142913 -0.152443 -0.0752907 -0.0755812 -0.0764525 -0.0779031 -0.0799306 -0.0825318 -0.0857025 -0.0894379 -0.0937321 -0.0985786 -0.10397 -0.109899 -0.116356 -0.123332 -0.130818 -0.138804 -0.147279 -0.156233 -0.165654 -0.0900115 -0.0902981 -0.0911576 -0.0925887 -0.094589 -0.0971554 -0.100284 -0.10397 -0.108208 -0.112991 -0.118313 -0.124166 -0.130542 -0.137431 -0.144825 -0.152714 -0.161088 -0.169936 -0.179248 -0.105102 -0.105385 -0.106232 -0.107644 -0.109617 -0.112149 -0.115235 -0.118872 -0.123054 -0.127774 -0.133027 -0.138804 -0.145098 -0.151901 -0.159202 -0.166994 -0.175266 -0.184008 -0.19321 -0.120547 -0.120826 -0.121662 -0.123054 -0.125 -0.127497 -0.130542 -0.13413 -0.138255 -0.142913 -0.148096 -0.153798 -0.160011 -0.166726 -0.173936 -0.18163 -0.1898 -0.198436 -0.207528 0.1 0.0996528 0.0986122 0.0968804 0.0944615 0.0913609 0.0875856 0.083144 0.0780456 0.0723012 0.0659229 0.0589235 0.0513167 0.043117 0.0343396 0.025 0.0151142 0.00469854 -0.00623059 0.0996528 0.0993058 0.0982656 0.0965345 0.0941165 0.0910171 0.0872432 0.0828032 0.0777067 0.0719644 0.0655884 0.0585915 0.0509874 0.0427905 0.034016 0.0246795 0.014797 0.00438461 -0.00654111 0.0986122 0.0982656 0.0972265 0.0954974 0.0930821 0.0899863 0.0862167 0.0817816 0.0766907 0.0709548 0.0645857 0.0575962 0.05 0.0418116 0.033046 0.0237188 0.0138459 0.00344343 -0.00747208 0.0968804 0.0965345 0.0954974 0.0937716 0.0913609 0.0882709 0.0845083 0.0800815 0.075 0.0692745 0.0629168 0.0559396 0.0483567 0.0401823 0.0314315 0.0221196 0.0122627 0.00187676 -0.0090218 0.0944615 0.0941165 0.0930821 0.0913609 0.0889566 0.0858747 0.082122 0.0777067 0.0726382 0.0669271 0.0605853 0.0536253 0.0460608 0.0379059 0.0291756 0.0198852 0.0100505 -0.000312451 -0.0111874 0.0913609 0.0910171 0.0899863 0.0882709 0.0858747 0.0828032 0.079063 0.0746622 0.0696103 0.0639177 0.0575962 0.0506581 0.043117 0.034987 0.0262829 0.0170198 0.00721352 -0.00312013 -0.013965 0.0875856 0.0872432 0.0862167 0.0845083 0.082122 0.079063 0.0753379 0.0709548 0.0659229 0.0602527 0.0539556 0.0470441 0.0395314 0.0314315 0.022759 0.013529 0.00375706 -0.00654111 -0.0173495 0.083144 0.0828032 0.0817816 0.0800815 0.0777067 0.0746622 0.0709548 0.0665923 0.0615838 0.0559396 0.0496711 0.0427905 0.0353109 0.0272462 0.0186107 0.00941936 -0.000312451 -0.0105691 -0.0213349 0.0780456 0.0777067 0.0766907 0.075 0.0726382 0.0696103 0.0659229 0.0615838 0.0566019 0.0509874 0.0447513 0.0379059 0.030464 0.0224393 0.0138459 0.00469854 -0.00498756 -0.015197 -0.0259142 0.0723012 0.0719644 0.0709548 0.0692745 0.0669271 0.0639177 0.0602527 0.0559396 0.0509874 0.0454058 0.0392061 0.0323999 0.025 0.0170198 0.0084734 -0.000624805 -0.0102599 -0.0204166 -0.0310795 0.0659229 0.0655884 0.0645857 0.0629168 0.0605853 0.0575962 0.0539556 0.0496711 0.0447513 0.0392061 0.033046 0.0262829 0.0189292 0.010998 0.00250313 -0.00654111 -0.0161201 -0.0262188 -0.0368221 0.0589235 0.0585915 0.0575962 0.0559396 0.0536253 0.0506581 0.0470441 0.0427905 0.0379059 0.0323999 0.0262829 0.0195664 0.0122627 0.00438461 -0.00405428 -0.01304 -0.0225581 -0.0325938 -0.0431323 0.0513167 0.0509874 0.05 0.0483567 0.0460608 0.043117 0.0395314 0.0353109 0.030464 0.025 0.0189292 0.0122627 0.00501256 -0.00280856 -0.0111874 -0.0201103 -0.029563 -0.0395311 -0.05 0.043117 0.0427905 0.0418116 0.0401823 0.0379059 0.034987 0.0314315 0.0272462 0.0224393 0.0170198 0.010998 0.00438461 -0.00280856 -0.0105691 -0.0188842 -0.0277402 -0.0371234 -0.0470196 -0.0574143 0.0343396 0.034016 0.033046 0.0314315 0.0291756 0.0262829 0.022759 0.0186107 0.0138459 0.0084734 0.00250313 -0.00405428 -0.0111874 -0.0188842 -0.0271319 -0.0359175 -0.0452272 -0.0550474 -0.0653638 0.025 0.0246795 0.0237188 0.0221196 0.0198852 0.0170198 0.013529 0.00941936 0.00469854 -0.000624805 -0.00654111 -0.01304 -0.0201103 -0.0277402 -0.0359175 -0.0446291 -0.0538619 -0.0636024 -0.0738366 0.0151142 0.014797 0.0138459 0.0122627 0.0100505 0.00721352 0.00375706 -0.000312451 -0.00498756 -0.0102599 -0.0161201 -0.0225581 -0.029563 -0.0371234 -0.0452272 -0.0538619 -0.0630146 -0.0726719 -0.0828204 0.00469854 0.00438461 0.00344343 0.00187676 -0.000312451 -0.00312013 -0.00654111 -0.0105691 -0.015197 -0.0204166 -0.0262188 -0.0325938 -0.0395311 -0.0470196 -0.0550474 -0.0636024 -0.0726719 -0.082243 -0.0923026 -0.00623059 -0.00654111 -0.00747208 -0.0090218 -0.0111874 -0.013965 -0.0173495 -0.0213349 -0.0259142 -0.0310795 -0.0368221 -0.0431323 -0.05 -0.0574143 -0.0653638 -0.0738366 -0.0828204 -0.0923026 -0.10227 -0.0176566 -0.0179637 -0.0188842 -0.0204166 -0.0225581 -0.0253048 -0.028652 -0.0325938 -0.0371234 -0.0422332 -0.0479146 -0.0541584 -0.0609548 -0.068293 -0.0761622 -0.0845506 -0.0934464 -0.102837 -0.112711 -0.029563 -0.0298665 -0.0307764 -0.0322911 -0.034408 -0.0371234 -0.0404326 -0.0443299 -0.0488088 -0.0538619 -0.059481 -0.0656571 -0.0723805 -0.0796411 -0.0874282 -0.0957304 -0.104536 -0.113833 -0.12361 -0.0419333 -0.0422332 -0.0431323 -0.0446291 -0.0467211 -0.0494046 -0.0526752 -0.0565273 -0.0609548 -0.0659503 -0.0715059 -0.0776131 -0.0842624 -0.091444 -0.0991474 -0.107362 -0.116076 -0.125278 -0.134956 -0.0547512 -0.0550474 -0.0559356 -0.0574143 -0.059481 -0.0621323 -0.0653638 -0.0691702 -0.0735455 -0.0784827 -0.0839742 -0.0900115 -0.0965856 -0.103687 -0.111306 -0.119431 -0.128051 -0.137157 -0.146734 -0.0680005 -0.068293 -0.0691702 -0.0706307 -0.0726719 -0.0752907 -0.0784827 -0.082243 -0.0865657 -0.091444 -0.0968705 -0.102837 -0.109335 -0.116356 -0.123888 -0.131923 -0.140449 -0.149456 -0.158933 -0.0816654 -0.0819543 -0.0828204 -0.0842624 -0.086278 -0.0888641 -0.0920165 -0.0957304 -0.1 -0.104819 -0.11018 -0.116076 -0.122497 -0.129436 -0.136882 -0.144825 -0.153256 -0.162164 -0.171537 -0.0957304 -0.0960155 -0.0968705 -0.0982941 -0.100284 -0.102837 -0.10595 -0.109617 -0.113833 -0.118593 -0.123888 -0.129712 -0.136057 -0.142913 -0.150272 -0.158123 -0.166458 -0.175266 -0.184536 -0.11018 -0.110462 -0.111306 -0.112711 -0.114675 -0.117195 -0.120268 -0.123888 -0.128051 -0.132751 -0.137981 -0.143733 -0.15 -0.156774 -0.164045 -0.171804 -0.180042 -0.188749 -0.197915 -0.125 -0.125278 -0.126111 -0.127497 -0.129436 -0.131923 -0.134956 -0.13853 -0.142639 -0.147279 -0.152443 -0.158123 -0.164313 -0.171004 -0.178187 -0.185854 -0.193995 -0.202601 -0.211662 -0.140175 -0.140449 -0.141271 -0.142639 -0.144552 -0.147007 -0.15 -0.153527 -0.157584 -0.162164 -0.167262 -0.17287 -0.178983 -0.185591 -0.192686 -0.20026 -0.208305 -0.216809 -0.225765 0.075 0.0746622 0.0736496 0.0719644 0.0696103 0.0665923 0.0629168 0.0585915 0.0536253 0.0480284 0.0418116 0.034987 0.0275675 0.0195664 0.010998 0.00187676 -0.00778222 -0.0179637 -0.028652 0.0746622 0.0743246 0.0733124 0.0716278 0.0692745 0.0662575 0.0625833 0.0582596 0.0532952 0.0477002 0.0414855 0.0346633 0.0272462 0.0192477 0.0106821 0.00156372 -0.00809226 -0.0182706 -0.0289558 0.0736496 0.0733124 0.0723012 0.0706185 0.0682677 0.065254 0.0615838 0.0572646 0.0523054 0.0467162 0.0405079 0.0336926 0.0262829 0.0182923 0.00973488 0.000625195 -0.0090218 -0.0191909 -0.0298665 0.0719644 0.0716278 0.0706185 0.0689388 0.0665923 0.063584 0.0599202 0.0556087 0.0506581 0.0450785 0.0388809 0.032077 0.0246795 0.016702 0.00815828 -0.000937061 -0.0105691 -0.0207228 -0.0313826 0.0696103 0.0692745 0.0682677 0.0665923 0.0642516 0.0612508 0.0575962 0.0532952 0.0483567 0.0427905 0.0366076 0.0298196 0.0224393 0.0144798 0.00595523 -0.00312013 -0.0127315 -0.0228636 -0.0335013 0.0665923 0.0662575 0.065254 0.063584 0.0612508 0.0582596 0.0546165 0.050329 0.0454058 0.0398568 0.0336926 0.026925 0.0195664 0.0116301 0.0031299 -0.00591998 -0.0155048 -0.0256096 -0.0362191 0.0629168 0.0625833 0.0615838 0.0599202 0.0575962 0.0546165 0.0509874 0.0467162 0.0418116 0.0362832 0.0301418 0.0233988 0.0160666 0.00815828 -0.000312451 -0.00933146 -0.0188842 -0.0289558 -0.0395311 0.0585915 0.0582596 0.0572646 0.0556087 0.0532952 0.050329 0.0467162 0.0424641 0.0375812 0.032077 0.025962 0.0192477 0.0119464 0.00407079 -0.00436547 -0.0133484 -0.0228636 -0.0328964 -0.0434318 0.0536253 0.0532952 0.0523054 0.0506581 0.0483567 0.0454058 0.0418116 0.0375812 0.0327229 0.0272462 0.0211614 0.0144798 0.00721352 -0.000624805 -0.0090218 -0.0179637 -0.0274361 -0.0374247 -0.0479146 0.0480284 0.0477002 0.0467162 0.0450785 0.0427905 0.0398568 0.0362832 0.032077 0.0272462 0.0218001 0.015749 0.00910394 0.00187676 -0.00591998 -0.0142731 -0.0231691 -0.0325938 -0.042533 -0.052972 0.0418116 0.0414855 0.0405079 0.0388809 0.0366076 0.0336926 0.0301418 0.025962 0.0211614 0.015749 0.00973488 0.0031299 -0.00405428 -0.0118053 -0.0201103 -0.0289558 -0.038328 -0.0482128 -0.0585958 0.034987 0.0346633 0.0336926 0.032077 0.0298196 0.026925 0.0233988 0.0192477 0.0144798 0.00910394 0.0031299 -0.00343161 -0.0105691 -0.0182706 -0.0265233 -0.035314 -0.0446291 -0.0544548 -0.064777 0.0275675 0.0272462 0.0262829 0.0246795 0.0224393 0.0195664 0.0160666 0.0119464 0.00721352 0.00187676 -0.00405428 -0.0105691 -0.0176566 -0.0253048 -0.0335013 -0.0422332 -0.051487 -0.0612493 -0.0715059 0.0195664 0.0192477 0.0182923 0.016702 0.0144798 0.0116301 0.00815828 0.00407079 -0.000624805 -0.00591998 -0.0118053 -0.0182706 -0.0253048 -0.0328964 -0.0410331 -0.0497023 -0.0588909 -0.0685855 -0.0787725 0.010998 0.0106821 0.00973488 0.00815828 0.00595523 0.0031299 -0.000312451 -0.00436547 -0.0090218 -0.0142731 -0.0201103 -0.0265233 -0.0335013 -0.0410331 -0.0491068 -0.0577098 -0.0668294 -0.0764525 -0.0865657 0.00187676 0.00156372 0.000625195 -0.000937061 -0.00312013 -0.00591998 -0.00933146 -0.0133484 -0.0179637 -0.0231691 -0.0289558 -0.035314 -0.0422332 -0.0497023 -0.0577098 -0.0662434 -0.0752907 -0.0848387 -0.0948744 -0.00778222 -0.00809226 -0.0090218 -0.0105691 -0.0127315 -0.0155048 -0.0188842 -0.0228636 -0.0274361 -0.0325938 -0.038328 -0.0446291 -0.051487 -0.0588909 -0.0668294 -0.0752907 -0.0842624 -0.0937321 -0.103687 -0.0179637 -0.0182706 -0.0191909 -0.0207228 -0.0228636 -0.0256096 -0.0289558 -0.0328964 -0.0374247 -0.042533 -0.0482128 -0.0544548 -0.0612493 -0.0685855 -0.0764525 -0.0848387 -0.0937321 -0.103121 -0.112991 -0.028652 -0.0289558 -0.0298665 -0.0313826 -0.0335013 -0.0362191 -0.0395311 -0.0434318 -0.0479146 -0.052972 -0.0585958 -0.064777 -0.0715059 -0.0787725 -0.0865657 -0.0948744 -0.103687 -0.112991 -0.122776 -0.0398317 -0.0401322 -0.0410331 -0.042533 -0.0446291 -0.047318 -0.0505951 -0.0544548 -0.0588909 -0.0638961 -0.0694625 -0.0755812 -0.082243 -0.0894379 -0.0971554 -0.105385 -0.114114 -0.123332 -0.133027 -0.051487 -0.0517842 -0.0526752 -0.0541584 -0.0562315 -0.0588909 -0.0621323 -0.0659503 -0.0703387 -0.0752907 -0.0807983 -0.0868533 -0.0934464 -0.100568 -0.108208 -0.116356 -0.125 -0.13413 -0.143733 -0.0636024 -0.0638961 -0.064777 -0.0662434 -0.068293 -0.0709225 -0.0741276 -0.0779031 -0.082243 -0.0871407 -0.0925887 -0.0985786 -0.105102 -0.112149 -0.11971 -0.127774 -0.136332 -0.145371 -0.154881 -0.0761622 -0.0764525 -0.0773231 -0.0787725 -0.0807983 -0.0833974 -0.0865657 -0.0902981 -0.094589 -0.0994317 -0.104819 -0.110743 -0.117195 -0.124166 -0.131647 -0.139627 -0.148096 -0.157044 -0.166458 -0.089151 -0.0894379 -0.0902981 -0.0917303 -0.0937321 -0.0963006 -0.0994317 -0.103121 -0.107362 -0.112149 -0.117475 -0.123332 -0.129712 -0.136607 -0.144006 -0.151901 -0.16028 -0.169134 -0.178452 -0.102554 -0.102837 -0.103687 -0.105102 -0.107079 -0.109617 -0.112711 -0.116356 -0.120547 -0.125278 -0.130542 -0.136332 -0.142639 -0.149456 -0.156774 -0.164581 -0.17287 -0.18163 -0.190851 -0.116356 -0.116636 -0.117475 -0.118872 -0.120826 -0.123332 -0.126388 -0.129989 -0.13413 -0.138804 -0.144006 -0.149728 -0.155963 -0.162702 -0.169936 -0.177657 -0.185854 -0.194519 -0.20364 -0.130542 -0.130818 -0.131647 -0.133027 -0.134956 -0.137431 -0.140449 -0.144006 -0.148096 -0.152714 -0.157854 -0.163508 -0.169669 -0.176329 -0.18348 -0.191113 -0.199218 -0.207787 -0.216809 -0.145098 -0.145371 -0.146189 -0.147552 -0.149456 -0.151901 -0.154881 -0.158393 -0.162433 -0.166994 -0.172071 -0.177657 -0.183744 -0.190326 -0.197393 -0.204938 -0.212951 -0.221423 -0.230345 -0.160011 -0.16028 -0.161088 -0.162433 -0.164313 -0.166726 -0.169669 -0.173137 -0.177126 -0.18163 -0.186644 -0.192162 -0.198176 -0.204678 -0.211662 -0.219119 -0.227039 -0.235415 -0.244237 0.05 0.0496711 0.0486851 0.0470441 0.0447513 0.0418116 0.0382308 0.034016 0.0291756 0.0237188 0.0176559 0.010998 0.00375706 -0.00405428 -0.0124228 -0.0213349 -0.0307764 -0.0407329 -0.0511898 0.0496711 0.0493423 0.0483567 0.0467162 0.0444243 0.0414855 0.0379059 0.0336926 0.0288538 0.0233988 0.0173378 0.0106821 0.00344343 -0.00436547 -0.0127315 -0.0216408 -0.0310795 -0.0410331 -0.051487 0.0486851 0.0483567 0.0473721 0.0457333 0.0434437 0.0405079 0.036932 0.0327229 0.0278889 0.0224393 0.0163842 0.00973488 0.00250313 -0.00529846 -0.0136567 -0.0225581 -0.0319884 -0.0419333 -0.0523783 0.0470441 0.0467162 0.0457333 0.0440973 0.0418116 0.0388809 0.0353109 0.0311089 0.0262829 0.0208422 0.014797 0.00815828 0.00093794 -0.00685153 -0.015197 -0.024085 -0.0335013 -0.0434318 -0.0538619 0.0447513 0.0444243 0.0434437 0.0418116 0.0395314 0.0366076 0.033046 0.0288538 0.0240389 0.0186107 0.0125791 0.00595523 -0.00124922 -0.0090218 -0.0173495 -0.0262188 -0.0356158 -0.0455262 -0.0559356 0.0418116 0.0414855 0.0405079 0.0388809 0.0366076 0.0336926 0.0301418 0.025962 0.0211614 0.015749 0.00973488 0.0031299 -0.00405428 -0.0118053 -0.0201103 -0.0289558 -0.038328 -0.0482128 -0.0585958 0.0382308 0.0379059 0.036932 0.0353109 0.033046 0.0301418 0.0266039 0.0224393 0.0176559 0.0122627 0.00626965 -0.000312451 -0.00747208 -0.015197 -0.0234745 -0.0322911 -0.0416333 -0.051487 -0.061838 0.034016 0.0336926 0.0327229 0.0311089 0.0288538 0.025962 0.0224393 0.0182923 0.013529 0.00815828 0.0021899 -0.00436547 -0.0114964 -0.0191909 -0.0274361 -0.0362191 -0.0455262 -0.0553435 -0.0656571 0.0291756 0.0288538 0.0278889 0.0262829 0.0240389 0.0211614 0.0176559 0.013529 0.00878862 0.00344343 -0.00249688 -0.0090218 -0.0161201 -0.0237798 -0.0319884 -0.0407329 -0.05 -0.0597759 -0.0700467 0.0237188 0.0233988 0.0224393 0.0208422 0.0186107 0.015749 0.0122627 0.00815828 0.00344343 -0.00187325 -0.00778222 -0.0142731 -0.0213349 -0.0289558 -0.0371234 -0.045825 -0.0550474 -0.064777 -0.075 0.0176559 0.0173378 0.0163842 0.014797 0.0125791 0.00973488 0.00626965 0.0021899 -0.00249688 -0.00778222 -0.0136567 -0.0201103 -0.0271319 -0.0347101 -0.0428327 -0.051487 -0.0606602 -0.0703387 -0.0805091 0.010998 0.0106821 0.00973488 0.00815828 0.00595523 0.0031299 -0.000312451 -0.00436547 -0.0090218 -0.0142731 -0.0201103 -0.0265233 -0.0335013 -0.0410331 -0.0491068 -0.0577098 -0.0668294 -0.0764525 -0.0865657 0.00375706 0.00344343 0.00250313 0.00093794 -0.00124922 -0.00405428 -0.00747208 -0.0114964 -0.0161201 -0.0213349 -0.0271319 -0.0335013 -0.0404326 -0.0479146 -0.0559356 -0.0644834 -0.0735455 -0.083109 -0.0931606 -0.00405428 -0.00436547 -0.00529846 -0.00685153 -0.0090218 -0.0118053 -0.015197 -0.0191909 -0.0237798 -0.0289558 -0.0347101 -0.0410331 -0.0479146 -0.0553435 -0.0633085 -0.0717976 -0.0807983 -0.0902981 -0.100284 -0.0124228 -0.0127315 -0.0136567 -0.015197 -0.0173495 -0.0201103 -0.0234745 -0.0274361 -0.0319884 -0.0371234 -0.0428327 -0.0491068 -0.0559356 -0.0633085 -0.0712143 -0.0796411 -0.0885771 -0.0980096 -0.107926 -0.0213349 -0.0216408 -0.0225581 -0.024085 -0.0262188 -0.0289558 -0.0322911 -0.0362191 -0.0407329 -0.045825 -0.051487 -0.0577098 -0.0644834 -0.0717976 -0.0796411 -0.0880028 -0.0968705 -0.106232 -0.116076 -0.0307764 -0.0310795 -0.0319884 -0.0335013 -0.0356158 -0.038328 -0.0416333 -0.0455262 -0.05 -0.0550474 -0.0606602 -0.0668294 -0.0735455 -0.0807983 -0.0885771 -0.0968705 -0.105667 -0.114955 -0.124722 -0.0407329 -0.0410331 -0.0419333 -0.0434318 -0.0455262 -0.0482128 -0.051487 -0.0553435 -0.0597759 -0.064777 -0.0703387 -0.0764525 -0.083109 -0.0902981 -0.0980096 -0.106232 -0.114955 -0.124166 -0.133854 -0.0511898 -0.051487 -0.0523783 -0.0538619 -0.0559356 -0.0585958 -0.061838 -0.0656571 -0.0700467 -0.075 -0.0805091 -0.0865657 -0.0931606 -0.100284 -0.107926 -0.116076 -0.124722 -0.133854 -0.14346 -0.0621323 -0.0624265 -0.0633085 -0.064777 -0.0668294 -0.0694625 -0.0726719 -0.0764525 -0.0807983 -0.0857025 -0.0911576 -0.0971554 -0.103687 -0.110743 -0.118313 -0.126388 -0.134956 -0.144006 -0.153527 -0.0735455 -0.0738366 -0.0747093 -0.0761622 -0.0781929 -0.0807983 -0.0839742 -0.0877155 -0.0920165 -0.0968705 -0.10227 -0.108208 -0.114675 -0.121662 -0.129159 -0.137157 -0.145644 -0.15461 -0.164045 -0.0854147 -0.0857025 -0.0865657 -0.0880028 -0.0900115 -0.0925887 -0.0957304 -0.0994317 -0.103687 -0.10849 -0.113833 -0.11971 -0.126111 -0.133027 -0.140449 -0.148368 -0.156774 -0.165654 -0.175 -0.0977249 -0.0980096 -0.098863 -0.100284 -0.10227 -0.104819 -0.107926 -0.111587 -0.115796 -0.120547 -0.125833 -0.131647 -0.137981 -0.144825 -0.152172 -0.160011 -0.168332 -0.177126 -0.186381 -0.110462 -0.110743 -0.111587 -0.112991 -0.114955 -0.117475 -0.120547 -0.124166 -0.128328 -0.133027 -0.138255 -0.144006 -0.150272 -0.157044 -0.164313 -0.172071 -0.180307 -0.189012 -0.198176 -0.12361 -0.123888 -0.124722 -0.126111 -0.128051 -0.130542 -0.133578 -0.137157 -0.141271 -0.145917 -0.151086 -0.156774 -0.16297 -0.169669 -0.17686 -0.184536 -0.192686 -0.201301 -0.210372 -0.137157 -0.137431 -0.138255 -0.139627 -0.141545 -0.144006 -0.147007 -0.150543 -0.15461 -0.159202 -0.164313 -0.169936 -0.176063 -0.182688 -0.1898 -0.197393 -0.205456 -0.213981 -0.222957 -0.151086 -0.151358 -0.152172 -0.153527 -0.155422 -0.157854 -0.160819 -0.164313 -0.168332 -0.17287 -0.177922 -0.18348 -0.189538 -0.196087 -0.203121 -0.21063 -0.218606 -0.227039 -0.235921 -0.165386 -0.165654 -0.166458 -0.167797 -0.169669 -0.172071 -0.175 -0.178452 -0.182423 -0.186908 -0.1919 -0.197393 -0.203381 -0.209855 -0.216809 -0.224234 -0.232122 -0.240464 -0.24925 -0.180042 -0.180307 -0.181101 -0.182423 -0.184272 -0.186644 -0.189538 -0.192948 -0.196871 -0.201301 -0.206234 -0.211662 -0.21758 -0.223979 -0.230853 -0.238194 -0.245994 -0.254243 -0.262933 POINT_DATA 24000 SCALARS scalars double LOOKUP_TABLE default 0 0.025 0.05 0.075 0.1 0.125 0.15 0.175 0.2 0.225 0.25 0.275 0.3 0.325 0.35 0.375 0.4 0.425 0.45 0.475 0.025 0.0353553 0.0559017 0.0790569 0.103078 0.127475 0.152069 0.176777 0.201556 0.226385 0.251247 0.276134 0.30104 0.32596 0.350892 0.375832 0.40078 0.425735 0.450694 0.475657 0.05 0.0559017 0.0707107 0.0901388 0.111803 0.134629 0.158114 0.182003 0.206155 0.230489 0.254951 0.279508 0.304138 0.328824 0.353553 0.378319 0.403113 0.427931 0.452769 0.477624 0.075 0.0790569 0.0901388 0.106066 0.125 0.145774 0.167705 0.190394 0.2136 0.237171 0.261008 0.285044 0.309233 0.333542 0.357946 0.382426 0.406971 0.431567 0.456207 0.480885 0.1 0.103078 0.111803 0.125 0.141421 0.160078 0.180278 0.201556 0.223607 0.246221 0.269258 0.292617 0.316228 0.340037 0.364005 0.388104 0.412311 0.436606 0.460977 0.485412 0.125 0.127475 0.134629 0.145774 0.160078 0.176777 0.195256 0.215058 0.23585 0.257391 0.279508 0.302076 0.325 0.34821 0.371652 0.395285 0.419076 0.443001 0.467039 0.491172 0.15 0.152069 0.158114 0.167705 0.180278 0.195256 0.212132 0.230489 0.25 0.270416 0.291548 0.313249 0.33541 0.357946 0.380789 0.403887 0.4272 0.450694 0.474342 0.498121 0.175 0.176777 0.182003 0.190394 0.201556 0.215058 0.230489 0.247487 0.265754 0.285044 0.305164 0.32596 0.347311 0.369121 0.391312 0.413824 0.436606 0.459619 0.48283 0.506211 0.2 0.201556 0.206155 0.2136 0.223607 0.23585 0.25 0.265754 0.282843 0.30104 0.320156 0.340037 0.360555 0.381608 0.403113 0.425 0.447214 0.469707 0.492443 0.515388 0.225 0.226385 0.230489 0.237171 0.246221 0.257391 0.270416 0.285044 0.30104 0.318198 0.336341 0.355317 0.375 0.395285 0.416083 0.437321 0.458939 0.480885 0.503115 0.525595 0.25 0.251247 0.254951 0.261008 0.269258 0.279508 0.291548 0.305164 0.320156 0.336341 0.353553 0.371652 0.390512 0.41003 0.430116 0.450694 0.471699 0.493077 0.514782 0.536773 0.275 0.276134 0.279508 0.285044 0.292617 0.302076 0.313249 0.32596 0.340037 0.355317 0.371652 0.388909 0.406971 0.425735 0.445112 0.465027 0.485412 0.506211 0.527376 0.548862 0.3 0.30104 0.304138 0.309233 0.316228 0.325 0.33541 0.347311 0.360555 0.375 0.390512 0.406971 0.424264 0.442295 0.460977 0.480234 0.5 0.520216 0.540833 0.561805 0.325 0.32596 0.328824 0.333542 0.340037 0.34821 0.357946 0.369121 0.381608 0.395285 0.41003 0.425735 0.442295 0.459619 0.477624 0.496236 0.515388 0.535023 0.55509 0.575543 0.35 0.350892 0.353553 0.357946 0.364005 0.371652 0.380789 0.391312 0.403113 0.416083 0.430116 0.445112 0.460977 0.477624 0.494975 0.512957 0.531507 0.550568 0.570088 0.590021 0.375 0.375832 0.378319 0.382426 0.388104 0.395285 0.403887 0.413824 0.425 0.437321 0.450694 0.465027 0.480234 0.496236 0.512957 0.53033 0.548293 0.566789 0.585769 0.605186 0.4 0.40078 0.403113 0.406971 0.412311 0.419076 0.4272 0.436606 0.447214 0.458939 0.471699 0.485412 0.5 0.515388 0.531507 0.548293 0.565685 0.583631 0.60208 0.620987 0.425 0.425735 0.427931 0.431567 0.436606 0.443001 0.450694 0.459619 0.469707 0.480885 0.493077 0.506211 0.520216 0.535023 0.550568 0.566789 0.583631 0.601041 0.618971 0.637377 0.45 0.450694 0.452769 0.456207 0.460977 0.467039 0.474342 0.48283 0.492443 0.503115 0.514782 0.527376 0.540833 0.55509 0.570088 0.585769 0.60208 0.618971 0.636396 0.654313 0.475 0.475657 0.477624 0.480885 0.485412 0.491172 0.498121 0.506211 0.515388 0.525595 0.536773 0.548862 0.561805 0.575543 0.590021 0.605186 0.620987 0.637377 0.654313 0.671751 0.5 0.500625 0.502494 0.505594 0.509902 0.515388 0.522015 0.529741 0.538516 0.548293 0.559017 0.570636 0.583095 0.596343 0.610328 0.625 0.640312 0.65622 0.672681 0.689656 0.525 0.525595 0.527376 0.53033 0.534439 0.539676 0.546008 0.553399 0.561805 0.571183 0.581485 0.592663 0.604669 0.617454 0.630971 0.645174 0.660019 0.675463 0.691466 0.70799 0.55 0.550568 0.552268 0.55509 0.559017 0.564026 0.570088 0.57717 0.585235 0.594243 0.604152 0.614919 0.626498 0.638847 0.65192 0.665676 0.680074 0.695072 0.710634 0.726722 0.575 0.575543 0.57717 0.579871 0.583631 0.58843 0.594243 0.601041 0.60879 0.617454 0.626997 0.637377 0.648556 0.660492 0.673146 0.686477 0.700446 0.715017 0.730154 0.745822 0.6 0.600521 0.60208 0.604669 0.608276 0.612883 0.618466 0.625 0.632456 0.6408 0.65 0.660019 0.67082 0.682367 0.694622 0.707549 0.72111 0.735272 0.75 0.765261 0.625 0.6255 0.626997 0.629484 0.632949 0.637377 0.642748 0.649038 0.65622 0.664267 0.673146 0.682825 0.693271 0.70445 0.716327 0.728869 0.742041 0.755811 0.770146 0.785016 0.65 0.650481 0.65192 0.654313 0.657647 0.66191 0.667083 0.673146 0.680074 0.687841 0.696419 0.70578 0.715891 0.726722 0.738241 0.750417 0.763217 0.776611 0.790569 0.805062 0.675 0.675463 0.676849 0.679154 0.682367 0.686477 0.691466 0.697316 0.704006 0.711512 0.719809 0.728869 0.738664 0.749166 0.760345 0.772172 0.784618 0.797653 0.811249 0.825379 0.7 0.700446 0.701783 0.704006 0.707107 0.711073 0.715891 0.721543 0.728011 0.735272 0.743303 0.75208 0.761577 0.771767 0.782624 0.794119 0.806226 0.818917 0.832166 0.845946 0.725 0.725431 0.726722 0.728869 0.731864 0.735697 0.740355 0.745822 0.75208 0.759111 0.766893 0.775403 0.784618 0.794512 0.805062 0.816241 0.828025 0.840387 0.853302 0.866747 0.025 0.0353553 0.0559017 0.0790569 0.103078 0.127475 0.152069 0.176777 0.201556 0.226385 0.251247 0.276134 0.30104 0.32596 0.350892 0.375832 0.40078 0.425735 0.450694 0.475657 0.0353553 0.0433013 0.0612372 0.0829156 0.106066 0.129904 0.15411 0.178536 0.203101 0.227761 0.252488 0.277263 0.302076 0.326917 0.351781 0.376663 0.401559 0.426468 0.451387 0.476314 0.0559017 0.0612372 0.075 0.0935414 0.114564 0.136931 0.160078 0.183712 0.207666 0.23184 0.256174 0.280624 0.305164 0.329773 0.354436 0.379144 0.403887 0.428661 0.453459 0.478278 0.0790569 0.0829156 0.0935414 0.108972 0.127475 0.147902 0.169558 0.192029 0.215058 0.238485 0.262202 0.286138 0.310242 0.334477 0.358818 0.383243 0.407738 0.43229 0.456892 0.481534 0.103078 0.106066 0.114564 0.127475 0.143614 0.162019 0.182003 0.203101 0.225 0.247487 0.270416 0.293684 0.317214 0.340955 0.364863 0.388909 0.413068 0.437321 0.461655 0.486056 0.127475 0.129904 0.136931 0.147902 0.162019 0.178536 0.19685 0.216506 0.237171 0.258602 0.280624 0.303109 0.32596 0.349106 0.372492 0.396074 0.419821 0.443706 0.467707 0.491808 0.152069 0.15411 0.160078 0.169558 0.182003 0.19685 0.2136 0.23184 0.251247 0.27157 0.292617 0.314245 0.336341 0.358818 0.381608 0.40466 0.427931 0.451387 0.475 0.498748 0.176777 0.178536 0.183712 0.192029 0.203101 0.216506 0.23184 0.248747 0.266927 0.286138 0.306186 0.326917 0.34821 0.369966 0.39211 0.414578 0.437321 0.460299 0.483477 0.506828 0.201556 0.203101 0.207666 0.215058 0.225 0.237171 0.251247 0.266927 0.283945 0.302076 0.321131 0.340955 0.361421 0.382426 0.403887 0.425735 0.447912 0.470372 0.493077 0.515994 0.226385 0.227761 0.23184 0.238485 0.247487 0.258602 0.27157 0.286138 0.302076 0.319179 0.337268 0.356195 0.375832 0.396074 0.416833 0.438035 0.459619 0.481534 0.503736 0.526189 0.251247 0.252488 0.256174 0.262202 0.270416 0.280624 0.292617 0.306186 0.321131 0.337268 0.354436 0.372492 0.391312 0.410792 0.430842 0.451387 0.472361 0.49371 0.515388 0.537355 0.276134 0.277263 0.280624 0.286138 0.293684 0.303109 0.314245 0.326917 0.340955 0.356195 0.372492 0.389711 0.407738 0.426468 0.445814 0.465698 0.486056 0.506828 0.527968 0.549432 0.30104 0.302076 0.305164 0.310242 0.317214 0.32596 0.336341 0.34821 0.361421 0.375832 0.391312 0.407738 0.425 0.443001 0.461655 0.480885 0.500625 0.520817 0.54141 0.562361 0.32596 0.326917 0.329773 0.334477 0.340955 0.349106 0.358818 0.369966 0.382426 0.396074 0.410792 0.426468 0.443001 0.460299 0.478278 0.496865 0.515994 0.535607 0.555653 0.576086 0.350892 0.351781 0.354436 0.358818 0.364863 0.372492 0.381608 0.39211 0.403887 0.416833 0.430842 0.445814 0.461655 0.478278 0.495606 0.513566 0.532095 0.551135 0.570636 0.590551 0.375832 0.376663 0.379144 0.383243 0.388909 0.396074 0.40466 0.414578 0.425735 0.438035 0.451387 0.465698 0.480885 0.496865 0.513566 0.530919 0.548862 0.56734 0.586302 0.605702 0.40078 0.401559 0.403887 0.407738 0.413068 0.419821 0.427931 0.437321 0.447912 0.459619 0.472361 0.486056 0.500625 0.515994 0.532095 0.548862 0.566238 0.584166 0.602599 0.62149 0.425735 0.426468 0.428661 0.43229 0.437321 0.443706 0.451387 0.460299 0.470372 0.481534 0.49371 0.506828 0.520817 0.535607 0.551135 0.56734 0.584166 0.60156 0.619476 0.637868 0.450694 0.451387 0.453459 0.456892 0.461655 0.467707 0.475 0.483477 0.493077 0.503736 0.515388 0.527968 0.54141 0.555653 0.570636 0.586302 0.602599 0.619476 0.636887 0.65479 0.475657 0.476314 0.478278 0.481534 0.486056 0.491808 0.498748 0.506828 0.515994 0.526189 0.537355 0.549432 0.562361 0.576086 0.590551 0.605702 0.62149 0.637868 0.65479 0.672216 0.500625 0.501248 0.503115 0.506211 0.510514 0.515994 0.522614 0.53033 0.539096 0.548862 0.559576 0.571183 0.583631 0.596867 0.61084 0.6255 0.6408 0.656696 0.673146 0.690109 0.525595 0.526189 0.527968 0.530919 0.535023 0.540255 0.54658 0.553963 0.562361 0.57173 0.582022 0.593191 0.605186 0.61796 0.631467 0.645659 0.660492 0.675925 0.691918 0.708431 0.550568 0.551135 0.552834 0.555653 0.559576 0.564579 0.570636 0.577711 0.585769 0.594769 0.604669 0.615427 0.626997 0.639336 0.652399 0.666146 0.680533 0.695521 0.711073 0.727152 0.575543 0.576086 0.577711 0.580409 0.584166 0.588961 0.594769 0.60156 0.609303 0.61796 0.627495 0.637868 0.649038 0.660965 0.67361 0.686932 0.700892 0.715454 0.730582 0.746241 0.600521 0.601041 0.602599 0.605186 0.60879 0.613392 0.618971 0.6255 0.632949 0.641288 0.650481 0.660492 0.671286 0.682825 0.695072 0.70799 0.721543 0.735697 0.750417 0.76567 0.6255 0.625999 0.627495 0.62998 0.633443 0.637868 0.643234 0.649519 0.656696 0.664737 0.67361 0.683283 0.693722 0.704894 0.716764 0.729298 0.742462 0.756224 0.770552 0.785414 0.650481 0.650961 0.652399 0.65479 0.658122 0.662382 0.667551 0.67361 0.680533 0.688295 0.696868 0.706222 0.716327 0.727152 0.738664 0.750833 0.763626 0.777014 0.790965 0.80545 0.675463 0.675925 0.677311 0.679614 0.682825 0.686932 0.691918 0.697764 0.70445 0.711952 0.720243 0.729298 0.739087 0.749583 0.760756 0.772577 0.785016 0.798044 0.811634 0.825757 0.700446 0.700892 0.702229 0.70445 0.707549 0.711512 0.716327 0.721976 0.72844 0.735697 0.743724 0.752496 0.761988 0.772172 0.783023 0.794512 0.806613 0.819298 0.832541 0.846316 0.725431 0.725862 0.727152 0.729298 0.732291 0.736122 0.740777 0.746241 0.752496 0.759523 0.7673 0.775806 0.785016 0.794906 0.80545 0.816624 0.828402 0.840759 0.853669 0.867107 0.05 0.0559017 0.0707107 0.0901388 0.111803 0.134629 0.158114 0.182003 0.206155 0.230489 0.254951 0.279508 0.304138 0.328824 0.353553 0.378319 0.403113 0.427931 0.452769 0.477624 0.0559017 0.0612372 0.075 0.0935414 0.114564 0.136931 0.160078 0.183712 0.207666 0.23184 0.256174 0.280624 0.305164 0.329773 0.354436 0.379144 0.403887 0.428661 0.453459 0.478278 0.0707107 0.075 0.0866025 0.103078 0.122474 0.143614 0.165831 0.188746 0.212132 0.23585 0.259808 0.283945 0.308221 0.332603 0.357071 0.381608 0.406202 0.430842 0.455522 0.480234 0.0901388 0.0935414 0.103078 0.11726 0.134629 0.15411 0.175 0.19685 0.219374 0.242384 0.265754 0.289396 0.313249 0.337268 0.361421 0.385681 0.41003 0.434454 0.458939 0.483477 0.111803 0.114564 0.122474 0.134629 0.15 0.167705 0.187083 0.207666 0.229129 0.251247 0.273861 0.296859 0.320156 0.343693 0.367423 0.391312 0.415331 0.43946 0.463681 0.487981 0.134629 0.136931 0.143614 0.15411 0.167705 0.183712 0.201556 0.220794 0.241091 0.262202 0.283945 0.306186 0.328824 0.351781 0.375 0.398434 0.422049 0.445814 0.469707 0.49371 0.158114 0.160078 0.165831 0.175 0.187083 0.201556 0.217945 0.23585 0.254951 0.275 0.295804 0.317214 0.339116 0.361421 0.384057 0.406971 0.430116 0.453459 0.47697 0.500625 0.182003 0.183712 0.188746 0.19685 0.207666 0.220794 0.23585 0.252488 0.270416 0.289396 0.309233 0.329773 0.350892 0.372492 0.394493 0.416833 0.43946 0.462331 0.485412 0.508675 0.206155 0.207666 0.212132 0.219374 0.229129 0.241091 0.254951 0.270416 0.287228 0.305164 0.324037 0.343693 0.364005 0.38487 0.406202 0.427931 0.45 0.472361 0.494975 0.517808 0.230489 0.23184 0.23585 0.242384 0.251247 0.262202 0.275 0.289396 0.305164 0.322102 0.340037 0.358818 0.378319 0.398434 0.419076 0.44017 0.461655 0.483477 0.505594 0.527968 0.254951 0.256174 0.259808 0.265754 0.273861 0.283945 0.295804 0.309233 0.324037 0.340037 0.357071 0.375 0.3937 0.413068 0.433013 0.453459 0.474342 0.495606 0.517204 0.539096 0.279508 0.280624 0.283945 0.289396 0.296859 0.306186 0.317214 0.329773 0.343693 0.358818 0.375 0.39211 0.41003 0.428661 0.447912 0.467707 0.487981 0.508675 0.529741 0.551135 0.304138 0.305164 0.308221 0.313249 0.320156 0.328824 0.339116 0.350892 0.364005 0.378319 0.3937 0.41003 0.4272 0.445112 0.463681 0.48283 0.502494 0.522614 0.543139 0.564026 0.328824 0.329773 0.332603 0.337268 0.343693 0.351781 0.361421 0.372492 0.38487 0.398434 0.413068 0.428661 0.445112 0.462331 0.480234 0.498748 0.517808 0.537355 0.557337 0.577711 0.353553 0.354436 0.357071 0.361421 0.367423 0.375 0.384057 0.394493 0.406202 0.419076 0.433013 0.447912 0.463681 0.480234 0.497494 0.515388 0.533854 0.552834 0.572276 0.592136 0.378319 0.379144 0.381608 0.385681 0.391312 0.398434 0.406971 0.416833 0.427931 0.44017 0.453459 0.467707 0.48283 0.498748 0.515388 0.532682 0.550568 0.56899 0.587899 0.607248 0.403113 0.403887 0.406202 0.41003 0.415331 0.422049 0.430116 0.43946 0.45 0.461655 0.474342 0.487981 0.502494 0.517808 0.533854 0.550568 0.567891 0.585769 0.604152 0.622997 0.427931 0.428661 0.430842 0.434454 0.43946 0.445814 0.453459 0.462331 0.472361 0.483477 0.495606 0.508675 0.522614 0.537355 0.552834 0.56899 0.585769 0.603117 0.620987 0.639336 0.452769 0.453459 0.455522 0.458939 0.463681 0.469707 0.47697 0.485412 0.494975 0.505594 0.517204 0.529741 0.543139 0.557337 0.572276 0.587899 0.604152 0.620987 0.638357 0.65622 0.477624 0.478278 0.480234 0.483477 0.487981 0.49371 0.500625 0.508675 0.517808 0.527968 0.539096 0.551135 0.564026 0.577711 0.592136 0.607248 0.622997 0.639336 0.65622 0.67361 0.502494 0.503115 0.504975 0.50806 0.512348 0.517808 0.524404 0.532095 0.540833 0.550568 0.561249 0.572822 0.585235 0.598435 0.612372 0.626997 0.642262 0.658122 0.674537 0.691466 0.527376 0.527968 0.529741 0.532682 0.536773 0.541987 0.548293 0.555653 0.564026 0.573367 0.583631 0.594769 0.606733 0.619476 0.632949 0.647109 0.66191 0.677311 0.693271 0.709753 0.552268 0.552834 0.554527 0.557337 0.561249 0.566238 0.572276 0.579332 0.587367 0.596343 0.606218 0.616948 0.62849 0.6408 0.653835 0.667551 0.681909 0.696868 0.71239 0.72844 0.57717 0.577711 0.579332 0.582022 0.585769 0.590551 0.596343 0.603117 0.61084 0.619476 0.628987 0.639336 0.650481 0.662382 0.675 0.688295 0.702229 0.716764 0.731864 0.747496 0.60208 0.602599 0.604152 0.606733 0.610328 0.614919 0.620484 0.626997 0.634429 0.642748 0.65192 0.66191 0.672681 0.684197 0.696419 0.709313 0.722842 0.73697 0.751665 0.766893 0.626997 0.627495 0.628987 0.631467 0.634921 0.639336 0.64469 0.650961 0.658122 0.666146 0.675 0.684653 0.695072 0.706222 0.71807 0.730582 0.743724 0.757463 0.771767 0.786607 0.65192 0.652399 0.653835 0.65622 0.659545 0.663796 0.668954 0.675 0.681909 0.689656 0.698212 0.707549 0.717635 0.72844 0.739932 0.75208 0.764853 0.778219 0.792149 0.806613 0.676849 0.677311 0.678694 0.680992 0.684197 0.688295 0.693271 0.699107 0.70578 0.713267 0.721543 0.730582 0.740355 0.750833 0.761988 0.773789 0.786209 0.799218 0.812788 0.826892 0.701783 0.702229 0.703562 0.70578 0.708872 0.712829 0.717635 0.723274 0.729726 0.73697 0.744983 0.753741 0.763217 0.773385 0.784219 0.795692 0.807775 0.820442 0.833667 0.847423 0.726722 0.727152 0.72844 0.730582 0.73357 0.737394 0.742041 0.747496 0.753741 0.760756 0.768521 0.777014 0.786209 0.796084 0.806613 0.817771 0.829533 0.841873 0.854766 0.868188 0.075 0.0790569 0.0901388 0.106066 0.125 0.145774 0.167705 0.190394 0.2136 0.237171 0.261008 0.285044 0.309233 0.333542 0.357946 0.382426 0.406971 0.431567 0.456207 0.480885 0.0790569 0.0829156 0.0935414 0.108972 0.127475 0.147902 0.169558 0.192029 0.215058 0.238485 0.262202 0.286138 0.310242 0.334477 0.358818 0.383243 0.407738 0.43229 0.456892 0.481534 0.0901388 0.0935414 0.103078 0.11726 0.134629 0.15411 0.175 0.19685 0.219374 0.242384 0.265754 0.289396 0.313249 0.337268 0.361421 0.385681 0.41003 0.434454 0.458939 0.483477 0.106066 0.108972 0.11726 0.129904 0.145774 0.163936 0.183712 0.204634 0.226385 0.248747 0.27157 0.294746 0.318198 0.34187 0.365718 0.389711 0.413824 0.438035 0.462331 0.486698 0.125 0.127475 0.134629 0.145774 0.160078 0.176777 0.195256 0.215058 0.23585 0.257391 0.279508 0.302076 0.325 0.34821 0.371652 0.395285 0.419076 0.443001 0.467039 0.491172 0.145774 0.147902 0.15411 0.163936 0.176777 0.192029 0.209165 0.227761 0.247487 0.268095 0.289396 0.311247 0.333542 0.356195 0.379144 0.402337 0.425735 0.449305 0.473022 0.496865 0.167705 0.169558 0.175 0.183712 0.195256 0.209165 0.225 0.242384 0.261008 0.280624 0.30104 0.322102 0.343693 0.365718 0.388104 0.410792 0.433734 0.456892 0.480234 0.503736 0.190394 0.192029 0.19685 0.204634 0.215058 0.227761 0.242384 0.258602 0.276134 0.294746 0.314245 0.334477 0.355317 0.376663 0.398434 0.420565 0.443001 0.465698 0.488621 0.511737 0.2136 0.215058 0.219374 0.226385 0.23585 0.247487 0.261008 0.276134 0.292617 0.310242 0.328824 0.34821 0.368273 0.388909 0.41003 0.431567 0.453459 0.475657 0.498121 0.520817 0.237171 0.238485 0.242384 0.248747 0.257391 0.268095 0.280624 0.294746 0.310242 0.326917 0.344601 0.363146 0.382426 0.402337 0.422788 0.443706 0.465027 0.486698 0.508675 0.530919 0.261008 0.262202 0.265754 0.27157 0.279508 0.289396 0.30104 0.314245 0.328824 0.344601 0.361421 0.379144 0.397649 0.416833 0.436606 0.456892 0.477624 0.498748 0.520216 0.541987 0.285044 0.286138 0.289396 0.294746 0.302076 0.311247 0.322102 0.334477 0.34821 0.363146 0.379144 0.396074 0.413824 0.43229 0.451387 0.471036 0.491172 0.511737 0.532682 0.553963 0.309233 0.310242 0.313249 0.318198 0.325 0.333542 0.343693 0.355317 0.368273 0.382426 0.397649 0.413824 0.430842 0.448609 0.467039 0.486056 0.505594 0.525595 0.546008 0.566789 0.333542 0.334477 0.337268 0.34187 0.34821 0.356195 0.365718 0.376663 0.388909 0.402337 0.416833 0.43229 0.448609 0.465698 0.483477 0.501871 0.520817 0.540255 0.560134 0.580409 0.357946 0.358818 0.361421 0.365718 0.371652 0.379144 0.388104 0.398434 0.41003 0.422788 0.436606 0.451387 0.467039 0.483477 0.500625 0.518411 0.536773 0.555653 0.575 0.594769 0.382426 0.383243 0.385681 0.389711 0.395285 0.402337 0.410792 0.420565 0.431567 0.443706 0.456892 0.471036 0.486056 0.501871 0.518411 0.535607 0.553399 0.57173 0.590551 0.609816 0.406971 0.407738 0.41003 0.413824 0.419076 0.425735 0.433734 0.443001 0.453459 0.465027 0.477624 0.491172 0.505594 0.520817 0.536773 0.553399 0.570636 0.58843 0.606733 0.6255 0.431567 0.43229 0.434454 0.438035 0.443001 0.449305 0.456892 0.465698 0.475657 0.486698 0.498748 0.511737 0.525595 0.540255 0.555653 0.57173 0.58843 0.605702 0.623498 0.641775 0.456207 0.456892 0.458939 0.462331 0.467039 0.473022 0.480234 0.488621 0.498121 0.508675 0.520216 0.532682 0.546008 0.560134 0.575 0.590551 0.606733 0.623498 0.6408 0.658597 0.480885 0.481534 0.483477 0.486698 0.491172 0.496865 0.503736 0.511737 0.520817 0.530919 0.541987 0.553963 0.566789 0.580409 0.594769 0.609816 0.6255 0.641775 0.658597 0.675925 0.505594 0.506211 0.50806 0.511126 0.515388 0.520817 0.527376 0.535023 0.543714 0.553399 0.564026 0.575543 0.587899 0.601041 0.614919 0.629484 0.64469 0.660492 0.676849 0.693722 0.53033 0.530919 0.532682 0.535607 0.539676 0.544862 0.551135 0.558458 0.566789 0.576086 0.586302 0.59739 0.609303 0.621993 0.635413 0.649519 0.664267 0.679614 0.695521 0.711952 0.55509 0.555653 0.557337 0.560134 0.564026 0.56899 0.575 0.582022 0.590021 0.598957 0.60879 0.619476 0.630971 0.643234 0.65622 0.669888 0.684197 0.699107 0.71458 0.730582 0.579871 0.580409 0.582022 0.584701 0.58843 0.593191 0.598957 0.605702 0.613392 0.621993 0.631467 0.641775 0.652878 0.664737 0.677311 0.690561 0.70445 0.71894 0.733996 0.749583 0.604669 0.605186 0.606733 0.609303 0.612883 0.617454 0.622997 0.629484 0.636887 0.645174 0.654313 0.664267 0.675 0.686477 0.698659 0.711512 0.725 0.739087 0.753741 0.768928 0.629484 0.62998 0.631467 0.633936 0.637377 0.641775 0.647109 0.653357 0.660492 0.668487 0.677311 0.686932 0.697316 0.708431 0.720243 0.732718 0.745822 0.759523 0.773789 0.788591 0.654313 0.65479 0.65622 0.658597 0.66191 0.666146 0.671286 0.677311 0.684197 0.691918 0.700446 0.709753 0.719809 0.730582 0.742041 0.754155 0.766893 0.780224 0.794119 0.808548 0.679154 0.679614 0.680992 0.683283 0.686477 0.690561 0.695521 0.701338 0.70799 0.715454 0.723706 0.732718 0.742462 0.752911 0.764035 0.775806 0.788194 0.801171 0.814709 0.828779 0.704006 0.70445 0.70578 0.70799 0.711073 0.715017 0.719809 0.725431 0.731864 0.739087 0.747078 0.755811 0.765261 0.775403 0.786209 0.797653 0.809707 0.822344 0.835539 0.849264 0.728869 0.729298 0.730582 0.732718 0.735697 0.73951 0.744144 0.749583 0.755811 0.762807 0.770552 0.779022 0.788194 0.798044 0.808548 0.81968 0.831414 0.843727 0.856592 0.869986 0.1 0.103078 0.111803 0.125 0.141421 0.160078 0.180278 0.201556 0.223607 0.246221 0.269258 0.292617 0.316228 0.340037 0.364005 0.388104 0.412311 0.436606 0.460977 0.485412 0.103078 0.106066 0.114564 0.127475 0.143614 0.162019 0.182003 0.203101 0.225 0.247487 0.270416 0.293684 0.317214 0.340955 0.364863 0.388909 0.413068 0.437321 0.461655 0.486056 0.111803 0.114564 0.122474 0.134629 0.15 0.167705 0.187083 0.207666 0.229129 0.251247 0.273861 0.296859 0.320156 0.343693 0.367423 0.391312 0.415331 0.43946 0.463681 0.487981 0.125 0.127475 0.134629 0.145774 0.160078 0.176777 0.195256 0.215058 0.23585 0.257391 0.279508 0.302076 0.325 0.34821 0.371652 0.395285 0.419076 0.443001 0.467039 0.491172 0.141421 0.143614 0.15 0.160078 0.173205 0.188746 0.206155 0.225 0.244949 0.265754 0.287228 0.309233 0.331662 0.354436 0.377492 0.40078 0.424264 0.447912 0.471699 0.495606 0.160078 0.162019 0.167705 0.176777 0.188746 0.203101 0.219374 0.237171 0.256174 0.276134 0.296859 0.318198 0.340037 0.362284 0.38487 0.407738 0.430842 0.454148 0.477624 0.501248 0.180278 0.182003 0.187083 0.195256 0.206155 0.219374 0.234521 0.251247 0.269258 0.288314 0.308221 0.328824 0.35 0.371652 0.3937 0.416083 0.438748 0.461655 0.484768 0.50806 0.201556 0.203101 0.207666 0.215058 0.225 0.237171 0.251247 0.266927 0.283945 0.302076 0.321131 0.340955 0.361421 0.382426 0.403887 0.425735 0.447912 0.470372 0.493077 0.515994 0.223607 0.225 0.229129 0.23585 0.244949 0.256174 0.269258 0.283945 0.3 0.317214 0.33541 0.354436 0.374166 0.394493 0.415331 0.436606 0.458258 0.480234 0.502494 0.525 0.246221 0.247487 0.251247 0.257391 0.265754 0.276134 0.288314 0.302076 0.317214 0.333542 0.350892 0.369121 0.388104 0.407738 0.427931 0.448609 0.469707 0.491172 0.512957 0.535023 0.269258 0.270416 0.273861 0.279508 0.287228 0.296859 0.308221 0.321131 0.33541 0.350892 0.367423 0.38487 0.403113 0.422049 0.441588 0.461655 0.482183 0.503115 0.524404 0.546008 0.292617 0.293684 0.296859 0.302076 0.309233 0.318198 0.328824 0.340955 0.354436 0.369121 0.38487 0.401559 0.419076 0.437321 0.456207 0.475657 0.495606 0.515994 0.536773 0.557898 0.316228 0.317214 0.320156 0.325 0.331662 0.340037 0.35 0.361421 0.374166 0.388104 0.403113 0.419076 0.43589 0.453459 0.471699 0.490535 0.509902 0.529741 0.55 0.570636 0.340037 0.340955 0.343693 0.34821 0.354436 0.362284 0.371652 0.382426 0.394493 0.407738 0.422049 0.437321 0.453459 0.470372 0.487981 0.506211 0.525 0.544289 0.564026 0.584166 0.364005 0.364863 0.367423 0.371652 0.377492 0.38487 0.3937 0.403887 0.415331 0.427931 0.441588 0.456207 0.471699 0.487981 0.504975 0.522614 0.540833 0.559576 0.578792 0.598435 0.388104 0.388909 0.391312 0.395285 0.40078 0.407738 0.416083 0.425735 0.436606 0.448609 0.461655 0.475657 0.490535 0.506211 0.522614 0.539676 0.557337 0.575543 0.594243 0.613392 0.412311 0.413068 0.415331 0.419076 0.424264 0.430842 0.438748 0.447912 0.458258 0.469707 0.482183 0.495606 0.509902 0.525 0.540833 0.557337 0.574456 0.592136 0.610328 0.628987 0.436606 0.437321 0.43946 0.443001 0.447912 0.454148 0.461655 0.470372 0.480234 0.491172 0.503115 0.515994 0.529741 0.544289 0.559576 0.575543 0.592136 0.609303 0.626997 0.645174 0.460977 0.461655 0.463681 0.467039 0.471699 0.477624 0.484768 0.493077 0.502494 0.512957 0.524404 0.536773 0.55 0.564026 0.578792 0.594243 0.610328 0.626997 0.644205 0.66191 0.485412 0.486056 0.487981 0.491172 0.495606 0.501248 0.50806 0.515994 0.525 0.535023 0.546008 0.557898 0.570636 0.584166 0.598435 0.613392 0.628987 0.645174 0.66191 0.679154 0.509902 0.510514 0.512348 0.515388 0.519615 0.525 0.531507 0.539096 0.547723 0.557337 0.567891 0.579332 0.591608 0.604669 0.618466 0.632949 0.648074 0.663796 0.680074 0.696868 0.534439 0.535023 0.536773 0.539676 0.543714 0.548862 0.55509 0.562361 0.570636 0.579871 0.590021 0.601041 0.612883 0.6255 0.638847 0.652878 0.667551 0.682825 0.698659 0.715017 0.559017 0.559576 0.561249 0.564026 0.567891 0.572822 0.578792 0.585769 0.593717 0.602599 0.612372 0.622997 0.634429 0.646626 0.659545 0.673146 0.687386 0.702229 0.717635 0.73357 0.583631 0.584166 0.585769 0.58843 0.592136 0.596867 0.602599 0.609303 0.616948 0.6255 0.634921 0.645174 0.65622 0.668019 0.680533 0.693722 0.707549 0.721976 0.73697 0.752496 0.608276 0.60879 0.610328 0.612883 0.616441 0.620987 0.626498 0.632949 0.640312 0.648556 0.657647 0.667551 0.678233 0.689656 0.701783 0.71458 0.728011 0.742041 0.756637 0.771767 0.632949 0.633443 0.634921 0.637377 0.6408 0.645174 0.650481 0.656696 0.663796 0.671751 0.680533 0.690109 0.700446 0.711512 0.723274 0.735697 0.748749 0.762398 0.776611 0.79136 0.657647 0.658122 0.659545 0.66191 0.665207 0.669421 0.674537 0.680533 0.687386 0.695072 0.703562 0.712829 0.722842 0.73357 0.744983 0.75705 0.76974 0.783023 0.796869 0.811249 0.682367 0.682825 0.684197 0.686477 0.689656 0.693722 0.698659 0.70445 0.711073 0.718505 0.726722 0.735697 0.745403 0.755811 0.766893 0.778621 0.790965 0.803897 0.817389 0.831414 0.707107 0.707549 0.708872 0.711073 0.714143 0.71807 0.722842 0.72844 0.734847 0.742041 0.75 0.7587 0.768115 0.778219 0.788987 0.800391 0.812404 0.825 0.838153 0.851836 0.731864 0.732291 0.73357 0.735697 0.738664 0.742462 0.747078 0.752496 0.7587 0.76567 0.773385 0.781825 0.790965 0.800781 0.811249 0.822344 0.834041 0.846316 0.859142 0.872496 0.125 0.127475 0.134629 0.145774 0.160078 0.176777 0.195256 0.215058 0.23585 0.257391 0.279508 0.302076 0.325 0.34821 0.371652 0.395285 0.419076 0.443001 0.467039 0.491172 0.127475 0.129904 0.136931 0.147902 0.162019 0.178536 0.19685 0.216506 0.237171 0.258602 0.280624 0.303109 0.32596 0.349106 0.372492 0.396074 0.419821 0.443706 0.467707 0.491808 0.134629 0.136931 0.143614 0.15411 0.167705 0.183712 0.201556 0.220794 0.241091 0.262202 0.283945 0.306186 0.328824 0.351781 0.375 0.398434 0.422049 0.445814 0.469707 0.49371 0.145774 0.147902 0.15411 0.163936 0.176777 0.192029 0.209165 0.227761 0.247487 0.268095 0.289396 0.311247 0.333542 0.356195 0.379144 0.402337 0.425735 0.449305 0.473022 0.496865 0.160078 0.162019 0.167705 0.176777 0.188746 0.203101 0.219374 0.237171 0.256174 0.276134 0.296859 0.318198 0.340037 0.362284 0.38487 0.407738 0.430842 0.454148 0.477624 0.501248 0.176777 0.178536 0.183712 0.192029 0.203101 0.216506 0.23184 0.248747 0.266927 0.286138 0.306186 0.326917 0.34821 0.369966 0.39211 0.414578 0.437321 0.460299 0.483477 0.506828 0.195256 0.19685 0.201556 0.209165 0.219374 0.23184 0.246221 0.262202 0.279508 0.297909 0.317214 0.337268 0.357946 0.379144 0.40078 0.422788 0.445112 0.467707 0.490535 0.513566 0.215058 0.216506 0.220794 0.227761 0.237171 0.248747 0.262202 0.277263 0.293684 0.311247 0.329773 0.349106 0.369121 0.389711 0.410792 0.43229 0.454148 0.476314 0.498748 0.521416 0.23585 0.237171 0.241091 0.247487 0.256174 0.266927 0.279508 0.293684 0.309233 0.32596 0.343693 0.362284 0.381608 0.401559 0.422049 0.443001 0.464354 0.486056 0.50806 0.53033 0.257391 0.258602 0.262202 0.268095 0.276134 0.286138 0.297909 0.311247 0.32596 0.34187 0.358818 0.376663 0.395285 0.414578 0.434454 0.454835 0.475657 0.496865 0.518411 0.540255 0.279508 0.280624 0.283945 0.289396 0.296859 0.306186 0.317214 0.329773 0.343693 0.358818 0.375 0.39211 0.41003 0.428661 0.447912 0.467707 0.487981 0.508675 0.529741 0.551135 0.302076 0.303109 0.306186 0.311247 0.318198 0.326917 0.337268 0.349106 0.362284 0.376663 0.39211 0.408503 0.425735 0.443706 0.462331 0.481534 0.501248 0.521416 0.541987 0.562917 0.325 0.32596 0.328824 0.333542 0.340037 0.34821 0.357946 0.369121 0.381608 0.395285 0.41003 0.425735 0.442295 0.459619 0.477624 0.496236 0.515388 0.535023 0.55509 0.575543 0.34821 0.349106 0.351781 0.356195 0.362284 0.369966 0.379144 0.389711 0.401559 0.414578 0.428661 0.443706 0.459619 0.476314 0.49371 0.511737 0.53033 0.549432 0.56899 0.588961 0.371652 0.372492 0.375 0.379144 0.38487 0.39211 0.40078 0.410792 0.422049 0.434454 0.447912 0.462331 0.477624 0.49371 0.510514 0.527968 0.546008 0.564579 0.583631 0.603117 0.395285 0.396074 0.398434 0.402337 0.407738 0.414578 0.422788 0.43229 0.443001 0.454835 0.467707 0.481534 0.496236 0.511737 0.527968 0.544862 0.562361 0.580409 0.598957 0.61796 0.419076 0.419821 0.422049 0.425735 0.430842 0.437321 0.445112 0.454148 0.464354 0.475657 0.487981 0.501248 0.515388 0.53033 0.546008 0.562361 0.579332 0.596867 0.614919 0.633443 0.443001 0.443706 0.445814 0.449305 0.454148 0.460299 0.467707 0.476314 0.486056 0.496865 0.508675 0.521416 0.535023 0.549432 0.564579 0.580409 0.596867 0.613901 0.631467 0.649519 0.467039 0.467707 0.469707 0.473022 0.477624 0.483477 0.490535 0.498748 0.50806 0.518411 0.529741 0.541987 0.55509 0.56899 0.583631 0.598957 0.614919 0.631467 0.648556 0.666146 0.491172 0.491808 0.49371 0.496865 0.501248 0.506828 0.513566 0.521416 0.53033 0.540255 0.551135 0.562917 0.575543 0.588961 0.603117 0.61796 0.633443 0.649519 0.666146 0.683283 0.515388 0.515994 0.517808 0.520817 0.525 0.53033 0.536773 0.544289 0.552834 0.562361 0.572822 0.584166 0.596343 0.609303 0.622997 0.637377 0.652399 0.668019 0.684197 0.700892 0.539676 0.540255 0.541987 0.544862 0.548862 0.553963 0.560134 0.56734 0.575543 0.584701 0.594769 0.605702 0.617454 0.62998 0.643234 0.657172 0.671751 0.686932 0.702673 0.71894 0.564026 0.564579 0.566238 0.56899 0.572822 0.577711 0.583631 0.590551 0.598435 0.607248 0.616948 0.627495 0.638847 0.650961 0.663796 0.677311 0.691466 0.706222 0.721543 0.737394 0.58843 0.588961 0.590551 0.593191 0.596867 0.60156 0.607248 0.613901 0.62149 0.62998 0.639336 0.649519 0.660492 0.672216 0.684653 0.697764 0.711512 0.725862 0.740777 0.756224 0.612883 0.613392 0.614919 0.617454 0.620987 0.6255 0.630971 0.637377 0.64469 0.652878 0.66191 0.671751 0.682367 0.693722 0.70578 0.718505 0.731864 0.745822 0.760345 0.775403 0.637377 0.637868 0.639336 0.641775 0.645174 0.649519 0.65479 0.660965 0.668019 0.675925 0.684653 0.694172 0.70445 0.715454 0.727152 0.73951 0.752496 0.766078 0.780224 0.794906 0.66191 0.662382 0.663796 0.666146 0.669421 0.67361 0.678694 0.684653 0.691466 0.699107 0.707549 0.716764 0.726722 0.737394 0.748749 0.760756 0.773385 0.786607 0.800391 0.814709 0.686477 0.686932 0.688295 0.690561 0.693722 0.697764 0.702673 0.708431 0.715017 0.722409 0.730582 0.73951 0.749166 0.759523 0.770552 0.782224 0.794512 0.807388 0.820823 0.83479 0.711073 0.711512 0.712829 0.715017 0.71807 0.721976 0.726722 0.732291 0.738664 0.745822 0.753741 0.762398 0.771767 0.781825 0.792543 0.803897 0.815858 0.828402 0.841502 0.855132 0.735697 0.736122 0.737394 0.73951 0.742462 0.746241 0.750833 0.756224 0.762398 0.769334 0.777014 0.785414 0.794512 0.804285 0.814709 0.825757 0.837407 0.849632 0.862409 0.875714 0.15 0.152069 0.158114 0.167705 0.180278 0.195256 0.212132 0.230489 0.25 0.270416 0.291548 0.313249 0.33541 0.357946 0.380789 0.403887 0.4272 0.450694 0.474342 0.498121 0.152069 0.15411 0.160078 0.169558 0.182003 0.19685 0.2136 0.23184 0.251247 0.27157 0.292617 0.314245 0.336341 0.358818 0.381608 0.40466 0.427931 0.451387 0.475 0.498748 0.158114 0.160078 0.165831 0.175 0.187083 0.201556 0.217945 0.23585 0.254951 0.275 0.295804 0.317214 0.339116 0.361421 0.384057 0.406971 0.430116 0.453459 0.47697 0.500625 0.167705 0.169558 0.175 0.183712 0.195256 0.209165 0.225 0.242384 0.261008 0.280624 0.30104 0.322102 0.343693 0.365718 0.388104 0.410792 0.433734 0.456892 0.480234 0.503736 0.180278 0.182003 0.187083 0.195256 0.206155 0.219374 0.234521 0.251247 0.269258 0.288314 0.308221 0.328824 0.35 0.371652 0.3937 0.416083 0.438748 0.461655 0.484768 0.50806 0.195256 0.19685 0.201556 0.209165 0.219374 0.23184 0.246221 0.262202 0.279508 0.297909 0.317214 0.337268 0.357946 0.379144 0.40078 0.422788 0.445112 0.467707 0.490535 0.513566 0.212132 0.2136 0.217945 0.225 0.234521 0.246221 0.259808 0.275 0.291548 0.309233 0.327872 0.347311 0.367423 0.388104 0.409268 0.430842 0.452769 0.475 0.497494 0.520216 0.230489 0.23184 0.23585 0.242384 0.251247 0.262202 0.275 0.289396 0.305164 0.322102 0.340037 0.358818 0.378319 0.398434 0.419076 0.44017 0.461655 0.483477 0.505594 0.527968 0.25 0.251247 0.254951 0.261008 0.269258 0.279508 0.291548 0.305164 0.320156 0.336341 0.353553 0.371652 0.390512 0.41003 0.430116 0.450694 0.471699 0.493077 0.514782 0.536773 0.270416 0.27157 0.275 0.280624 0.288314 0.297909 0.309233 0.322102 0.336341 0.351781 0.368273 0.385681 0.403887 0.422788 0.442295 0.462331 0.48283 0.503736 0.525 0.54658 0.291548 0.292617 0.295804 0.30104 0.308221 0.317214 0.327872 0.340037 0.353553 0.368273 0.384057 0.40078 0.41833 0.436606 0.455522 0.475 0.494975 0.515388 0.53619 0.557337 0.313249 0.314245 0.317214 0.322102 0.328824 0.337268 0.347311 0.358818 0.371652 0.385681 0.40078 0.416833 0.433734 0.451387 0.469707 0.488621 0.50806 0.527968 0.548293 0.56899 0.33541 0.336341 0.339116 0.343693 0.35 0.357946 0.367423 0.378319 0.390512 0.403887 0.41833 0.433734 0.45 0.467039 0.484768 0.503115 0.522015 0.54141 0.561249 0.581485 0.357946 0.358818 0.361421 0.365718 0.371652 0.379144 0.388104 0.398434 0.41003 0.422788 0.436606 0.451387 0.467039 0.483477 0.500625 0.518411 0.536773 0.555653 0.575 0.594769 0.380789 0.381608 0.384057 0.388104 0.3937 0.40078 0.409268 0.419076 0.430116 0.442295 0.455522 0.469707 0.484768 0.500625 0.517204 0.534439 0.552268 0.570636 0.589491 0.60879 0.403887 0.40466 0.406971 0.410792 0.416083 0.422788 0.430842 0.44017 0.450694 0.462331 0.475 0.488621 0.503115 0.518411 0.534439 0.551135 0.568441 0.586302 0.604669 0.623498 0.4272 0.427931 0.430116 0.433734 0.438748 0.445112 0.452769 0.461655 0.471699 0.48283 0.494975 0.50806 0.522015 0.536773 0.552268 0.568441 0.585235 0.602599 0.620484 0.638847 0.450694 0.451387 0.453459 0.456892 0.461655 0.467707 0.475 0.483477 0.493077 0.503736 0.515388 0.527968 0.54141 0.555653 0.570636 0.586302 0.602599 0.619476 0.636887 0.65479 0.474342 0.475 0.47697 0.480234 0.484768 0.490535 0.497494 0.505594 0.514782 0.525 0.53619 0.548293 0.561249 0.575 0.589491 0.604669 0.620484 0.636887 0.653835 0.671286 0.498121 0.498748 0.500625 0.503736 0.50806 0.513566 0.520216 0.527968 0.536773 0.54658 0.557337 0.56899 0.581485 0.594769 0.60879 0.623498 0.638847 0.65479 0.671286 0.688295 0.522015 0.522614 0.524404 0.527376 0.531507 0.536773 0.543139 0.550568 0.559017 0.568441 0.578792 0.590021 0.60208 0.614919 0.62849 0.642748 0.657647 0.673146 0.689202 0.70578 0.546008 0.54658 0.548293 0.551135 0.55509 0.560134 0.566238 0.573367 0.581485 0.590551 0.600521 0.611351 0.622997 0.635413 0.648556 0.662382 0.676849 0.691918 0.707549 0.723706 0.570088 0.570636 0.572276 0.575 0.578792 0.583631 0.589491 0.596343 0.604152 0.612883 0.622495 0.632949 0.644205 0.65622 0.668954 0.682367 0.696419 0.711073 0.726292 0.742041 0.594243 0.594769 0.596343 0.598957 0.602599 0.607248 0.612883 0.619476 0.626997 0.635413 0.64469 0.65479 0.665676 0.677311 0.689656 0.702673 0.716327 0.730582 0.745403 0.760756 0.618466 0.618971 0.620484 0.622997 0.626498 0.630971 0.636396 0.642748 0.65 0.658122 0.667083 0.676849 0.687386 0.698659 0.710634 0.723274 0.736546 0.750417 0.764853 0.779824 0.642748 0.643234 0.64469 0.647109 0.650481 0.65479 0.660019 0.666146 0.673146 0.680992 0.689656 0.699107 0.709313 0.720243 0.731864 0.744144 0.75705 0.770552 0.784618 0.799218 0.667083 0.667551 0.668954 0.671286 0.674537 0.678694 0.68374 0.689656 0.696419 0.704006 0.71239 0.721543 0.731437 0.742041 0.753326 0.765261 0.777817 0.790965 0.804674 0.818917 0.691466 0.691918 0.693271 0.695521 0.698659 0.702673 0.707549 0.713267 0.719809 0.727152 0.735272 0.744144 0.753741 0.764035 0.775 0.786607 0.798827 0.811634 0.825 0.838898 0.715891 0.716327 0.717635 0.719809 0.722842 0.726722 0.731437 0.73697 0.743303 0.750417 0.758288 0.766893 0.776209 0.786209 0.796869 0.808161 0.820061 0.832541 0.845577 0.859142 0.740355 0.740777 0.742041 0.744144 0.747078 0.750833 0.755397 0.760756 0.766893 0.773789 0.781425 0.789778 0.798827 0.808548 0.818917 0.82991 0.841502 0.853669 0.866386 0.879631 0.175 0.176777 0.182003 0.190394 0.201556 0.215058 0.230489 0.247487 0.265754 0.285044 0.305164 0.32596 0.347311 0.369121 0.391312 0.413824 0.436606 0.459619 0.48283 0.506211 0.176777 0.178536 0.183712 0.192029 0.203101 0.216506 0.23184 0.248747 0.266927 0.286138 0.306186 0.326917 0.34821 0.369966 0.39211 0.414578 0.437321 0.460299 0.483477 0.506828 0.182003 0.183712 0.188746 0.19685 0.207666 0.220794 0.23585 0.252488 0.270416 0.289396 0.309233 0.329773 0.350892 0.372492 0.394493 0.416833 0.43946 0.462331 0.485412 0.508675 0.190394 0.192029 0.19685 0.204634 0.215058 0.227761 0.242384 0.258602 0.276134 0.294746 0.314245 0.334477 0.355317 0.376663 0.398434 0.420565 0.443001 0.465698 0.488621 0.511737 0.201556 0.203101 0.207666 0.215058 0.225 0.237171 0.251247 0.266927 0.283945 0.302076 0.321131 0.340955 0.361421 0.382426 0.403887 0.425735 0.447912 0.470372 0.493077 0.515994 0.215058 0.216506 0.220794 0.227761 0.237171 0.248747 0.262202 0.277263 0.293684 0.311247 0.329773 0.349106 0.369121 0.389711 0.410792 0.43229 0.454148 0.476314 0.498748 0.521416 0.230489 0.23184 0.23585 0.242384 0.251247 0.262202 0.275 0.289396 0.305164 0.322102 0.340037 0.358818 0.378319 0.398434 0.419076 0.44017 0.461655 0.483477 0.505594 0.527968 0.247487 0.248747 0.252488 0.258602 0.266927 0.277263 0.289396 0.303109 0.318198 0.334477 0.351781 0.369966 0.388909 0.408503 0.428661 0.449305 0.470372 0.491808 0.513566 0.535607 0.265754 0.266927 0.270416 0.276134 0.283945 0.293684 0.305164 0.318198 0.332603 0.34821 0.364863 0.382426 0.40078 0.419821 0.43946 0.459619 0.480234 0.501248 0.522614 0.544289 0.285044 0.286138 0.289396 0.294746 0.302076 0.311247 0.322102 0.334477 0.34821 0.363146 0.379144 0.396074 0.413824 0.43229 0.451387 0.471036 0.491172 0.511737 0.532682 0.553963 0.305164 0.306186 0.309233 0.314245 0.321131 0.329773 0.340037 0.351781 0.364863 0.379144 0.394493 0.410792 0.427931 0.445814 0.464354 0.483477 0.503115 0.523211 0.543714 0.564579 0.32596 0.326917 0.329773 0.334477 0.340955 0.349106 0.358818 0.369966 0.382426 0.396074 0.410792 0.426468 0.443001 0.460299 0.478278 0.496865 0.515994 0.535607 0.555653 0.576086 0.347311 0.34821 0.350892 0.355317 0.361421 0.369121 0.378319 0.388909 0.40078 0.413824 0.427931 0.443001 0.458939 0.475657 0.493077 0.511126 0.529741 0.548862 0.568441 0.58843 0.369121 0.369966 0.372492 0.376663 0.382426 0.389711 0.398434 0.408503 0.419821 0.43229 0.445814 0.460299 0.475657 0.491808 0.508675 0.526189 0.544289 0.562917 0.582022 0.60156 0.391312 0.39211 0.394493 0.398434 0.403887 0.410792 0.419076 0.428661 0.43946 0.451387 0.464354 0.478278 0.493077 0.508675 0.525 0.541987 0.559576 0.577711 0.596343 0.615427 0.413824 0.414578 0.416833 0.420565 0.425735 0.43229 0.44017 0.449305 0.459619 0.471036 0.483477 0.496865 0.511126 0.526189 0.541987 0.558458 0.575543 0.593191 0.611351 0.62998 0.436606 0.437321 0.43946 0.443001 0.447912 0.454148 0.461655 0.470372 0.480234 0.491172 0.503115 0.515994 0.529741 0.544289 0.559576 0.575543 0.592136 0.609303 0.626997 0.645174 0.459619 0.460299 0.462331 0.465698 0.470372 0.476314 0.483477 0.491808 0.501248 0.511737 0.523211 0.535607 0.548862 0.562917 0.577711 0.593191 0.609303 0.625999 0.643234 0.660965 0.48283 0.483477 0.485412 0.488621 0.493077 0.498748 0.505594 0.513566 0.522614 0.532682 0.543714 0.555653 0.568441 0.582022 0.596343 0.611351 0.626997 0.643234 0.660019 0.677311 0.506211 0.506828 0.508675 0.511737 0.515994 0.521416 0.527968 0.535607 0.544289 0.553963 0.564579 0.576086 0.58843 0.60156 0.615427 0.62998 0.645174 0.660965 0.677311 0.694172 0.529741 0.53033 0.532095 0.535023 0.539096 0.544289 0.550568 0.557898 0.566238 0.575543 0.585769 0.596867 0.60879 0.62149 0.634921 0.649038 0.663796 0.679154 0.695072 0.711512 0.553399 0.553963 0.555653 0.558458 0.562361 0.56734 0.573367 0.580409 0.58843 0.59739 0.607248 0.61796 0.629484 0.641775 0.65479 0.668487 0.682825 0.697764 0.713267 0.729298 0.57717 0.577711 0.579332 0.582022 0.585769 0.590551 0.596343 0.603117 0.61084 0.619476 0.628987 0.639336 0.650481 0.662382 0.675 0.688295 0.702229 0.716764 0.731864 0.747496 0.601041 0.60156 0.603117 0.605702 0.609303 0.613901 0.619476 0.625999 0.633443 0.641775 0.650961 0.660965 0.671751 0.683283 0.695521 0.708431 0.721976 0.736122 0.750833 0.766078 0.625 0.6255 0.626997 0.629484 0.632949 0.637377 0.642748 0.649038 0.65622 0.664267 0.673146 0.682825 0.693271 0.70445 0.716327 0.728869 0.742041 0.755811 0.770146 0.785016 0.649038 0.649519 0.650961 0.653357 0.656696 0.660965 0.666146 0.672216 0.679154 0.686932 0.695521 0.704894 0.715017 0.725862 0.737394 0.749583 0.762398 0.775806 0.789778 0.804285 0.673146 0.67361 0.675 0.677311 0.680533 0.684653 0.689656 0.695521 0.702229 0.709753 0.71807 0.727152 0.73697 0.747496 0.7587 0.770552 0.783023 0.796084 0.809707 0.823863 0.697316 0.697764 0.699107 0.701338 0.70445 0.708431 0.713267 0.71894 0.725431 0.732718 0.740777 0.749583 0.759111 0.769334 0.780224 0.791754 0.803897 0.816624 0.82991 0.843727 0.721543 0.721976 0.723274 0.725431 0.72844 0.732291 0.73697 0.742462 0.748749 0.755811 0.763626 0.772172 0.781425 0.79136 0.801951 0.813173 0.825 0.837407 0.850368 0.863858 0.745822 0.746241 0.747496 0.749583 0.752496 0.756224 0.760756 0.766078 0.772172 0.779022 0.786607 0.794906 0.803897 0.813557 0.823863 0.83479 0.846316 0.858414 0.871063 0.884237 0.2 0.201556 0.206155 0.2136 0.223607 0.23585 0.25 0.265754 0.282843 0.30104 0.320156 0.340037 0.360555 0.381608 0.403113 0.425 0.447214 0.469707 0.492443 0.515388 0.201556 0.203101 0.207666 0.215058 0.225 0.237171 0.251247 0.266927 0.283945 0.302076 0.321131 0.340955 0.361421 0.382426 0.403887 0.425735 0.447912 0.470372 0.493077 0.515994 0.206155 0.207666 0.212132 0.219374 0.229129 0.241091 0.254951 0.270416 0.287228 0.305164 0.324037 0.343693 0.364005 0.38487 0.406202 0.427931 0.45 0.472361 0.494975 0.517808 0.2136 0.215058 0.219374 0.226385 0.23585 0.247487 0.261008 0.276134 0.292617 0.310242 0.328824 0.34821 0.368273 0.388909 0.41003 0.431567 0.453459 0.475657 0.498121 0.520817 0.223607 0.225 0.229129 0.23585 0.244949 0.256174 0.269258 0.283945 0.3 0.317214 0.33541 0.354436 0.374166 0.394493 0.415331 0.436606 0.458258 0.480234 0.502494 0.525 0.23585 0.237171 0.241091 0.247487 0.256174 0.266927 0.279508 0.293684 0.309233 0.32596 0.343693 0.362284 0.381608 0.401559 0.422049 0.443001 0.464354 0.486056 0.50806 0.53033 0.25 0.251247 0.254951 0.261008 0.269258 0.279508 0.291548 0.305164 0.320156 0.336341 0.353553 0.371652 0.390512 0.41003 0.430116 0.450694 0.471699 0.493077 0.514782 0.536773 0.265754 0.266927 0.270416 0.276134 0.283945 0.293684 0.305164 0.318198 0.332603 0.34821 0.364863 0.382426 0.40078 0.419821 0.43946 0.459619 0.480234 0.501248 0.522614 0.544289 0.282843 0.283945 0.287228 0.292617 0.3 0.309233 0.320156 0.332603 0.34641 0.361421 0.377492 0.394493 0.412311 0.430842 0.45 0.469707 0.489898 0.510514 0.531507 0.552834 0.30104 0.302076 0.305164 0.310242 0.317214 0.32596 0.336341 0.34821 0.361421 0.375832 0.391312 0.407738 0.425 0.443001 0.461655 0.480885 0.500625 0.520817 0.54141 0.562361 0.320156 0.321131 0.324037 0.328824 0.33541 0.343693 0.353553 0.364863 0.377492 0.391312 0.406202 0.422049 0.438748 0.456207 0.474342 0.493077 0.512348 0.532095 0.552268 0.572822 0.340037 0.340955 0.343693 0.34821 0.354436 0.362284 0.371652 0.382426 0.394493 0.407738 0.422049 0.437321 0.453459 0.470372 0.487981 0.506211 0.525 0.544289 0.564026 0.584166 0.360555 0.361421 0.364005 0.368273 0.374166 0.381608 0.390512 0.40078 0.412311 0.425 0.438748 0.453459 0.469042 0.485412 0.502494 0.520216 0.538516 0.557337 0.576628 0.596343 0.381608 0.382426 0.38487 0.388909 0.394493 0.401559 0.41003 0.419821 0.430842 0.443001 0.456207 0.470372 0.485412 0.501248 0.517808 0.535023 0.552834 0.571183 0.590021 0.609303 0.403113 0.403887 0.406202 0.41003 0.415331 0.422049 0.430116 0.43946 0.45 0.461655 0.474342 0.487981 0.502494 0.517808 0.533854 0.550568 0.567891 0.585769 0.604152 0.622997 0.425 0.425735 0.427931 0.431567 0.436606 0.443001 0.450694 0.459619 0.469707 0.480885 0.493077 0.506211 0.520216 0.535023 0.550568 0.566789 0.583631 0.601041 0.618971 0.637377 0.447214 0.447912 0.45 0.453459 0.458258 0.464354 0.471699 0.480234 0.489898 0.500625 0.512348 0.525 0.538516 0.552834 0.567891 0.583631 0.6 0.616948 0.634429 0.652399 0.469707 0.470372 0.472361 0.475657 0.480234 0.486056 0.493077 0.501248 0.510514 0.520817 0.532095 0.544289 0.557337 0.571183 0.585769 0.601041 0.616948 0.633443 0.650481 0.668019 0.492443 0.493077 0.494975 0.498121 0.502494 0.50806 0.514782 0.522614 0.531507 0.54141 0.552268 0.564026 0.576628 0.590021 0.604152 0.618971 0.634429 0.650481 0.667083 0.684197 0.515388 0.515994 0.517808 0.520817 0.525 0.53033 0.536773 0.544289 0.552834 0.562361 0.572822 0.584166 0.596343 0.609303 0.622997 0.637377 0.652399 0.668019 0.684197 0.700892 0.538516 0.539096 0.540833 0.543714 0.547723 0.552834 0.559017 0.566238 0.574456 0.583631 0.593717 0.604669 0.616441 0.628987 0.642262 0.65622 0.67082 0.686021 0.701783 0.71807 0.561805 0.562361 0.564026 0.566789 0.570636 0.575543 0.581485 0.58843 0.596343 0.605186 0.614919 0.6255 0.636887 0.649038 0.66191 0.675463 0.689656 0.70445 0.719809 0.735697 0.585235 0.585769 0.587367 0.590021 0.593717 0.598435 0.604152 0.61084 0.618466 0.626997 0.636396 0.646626 0.657647 0.669421 0.681909 0.695072 0.708872 0.723274 0.738241 0.753741 0.60879 0.609303 0.61084 0.613392 0.616948 0.62149 0.626997 0.633443 0.6408 0.649038 0.658122 0.668019 0.678694 0.690109 0.702229 0.715017 0.72844 0.742462 0.75705 0.772172 0.632456 0.632949 0.634429 0.636887 0.640312 0.64469 0.65 0.65622 0.663325 0.671286 0.680074 0.689656 0.7 0.711073 0.722842 0.735272 0.748331 0.761988 0.776209 0.790965 0.65622 0.656696 0.658122 0.660492 0.663796 0.668019 0.673146 0.679154 0.686021 0.693722 0.702229 0.711512 0.721543 0.732291 0.743724 0.755811 0.768521 0.781825 0.795692 0.810093 0.680074 0.680533 0.681909 0.684197 0.687386 0.691466 0.696419 0.702229 0.708872 0.716327 0.724569 0.73357 0.743303 0.753741 0.764853 0.776611 0.788987 0.801951 0.815475 0.829533 0.704006 0.70445 0.70578 0.70799 0.711073 0.715017 0.719809 0.725431 0.731864 0.739087 0.747078 0.755811 0.765261 0.775403 0.786209 0.797653 0.809707 0.822344 0.835539 0.849264 0.728011 0.72844 0.729726 0.731864 0.734847 0.738664 0.743303 0.748749 0.754983 0.761988 0.76974 0.778219 0.787401 0.797261 0.807775 0.818917 0.830662 0.842986 0.855862 0.869267 0.75208 0.752496 0.753741 0.755811 0.7587 0.762398 0.766893 0.772172 0.778219 0.785016 0.792543 0.800781 0.809707 0.819298 0.829533 0.840387 0.851836 0.863858 0.876427 0.889522 0.225 0.226385 0.230489 0.237171 0.246221 0.257391 0.270416 0.285044 0.30104 0.318198 0.336341 0.355317 0.375 0.395285 0.416083 0.437321 0.458939 0.480885 0.503115 0.525595 0.226385 0.227761 0.23184 0.238485 0.247487 0.258602 0.27157 0.286138 0.302076 0.319179 0.337268 0.356195 0.375832 0.396074 0.416833 0.438035 0.459619 0.481534 0.503736 0.526189 0.230489 0.23184 0.23585 0.242384 0.251247 0.262202 0.275 0.289396 0.305164 0.322102 0.340037 0.358818 0.378319 0.398434 0.419076 0.44017 0.461655 0.483477 0.505594 0.527968 0.237171 0.238485 0.242384 0.248747 0.257391 0.268095 0.280624 0.294746 0.310242 0.326917 0.344601 0.363146 0.382426 0.402337 0.422788 0.443706 0.465027 0.486698 0.508675 0.530919 0.246221 0.247487 0.251247 0.257391 0.265754 0.276134 0.288314 0.302076 0.317214 0.333542 0.350892 0.369121 0.388104 0.407738 0.427931 0.448609 0.469707 0.491172 0.512957 0.535023 0.257391 0.258602 0.262202 0.268095 0.276134 0.286138 0.297909 0.311247 0.32596 0.34187 0.358818 0.376663 0.395285 0.414578 0.434454 0.454835 0.475657 0.496865 0.518411 0.540255 0.270416 0.27157 0.275 0.280624 0.288314 0.297909 0.309233 0.322102 0.336341 0.351781 0.368273 0.385681 0.403887 0.422788 0.442295 0.462331 0.48283 0.503736 0.525 0.54658 0.285044 0.286138 0.289396 0.294746 0.302076 0.311247 0.322102 0.334477 0.34821 0.363146 0.379144 0.396074 0.413824 0.43229 0.451387 0.471036 0.491172 0.511737 0.532682 0.553963 0.30104 0.302076 0.305164 0.310242 0.317214 0.32596 0.336341 0.34821 0.361421 0.375832 0.391312 0.407738 0.425 0.443001 0.461655 0.480885 0.500625 0.520817 0.54141 0.562361 0.318198 0.319179 0.322102 0.326917 0.333542 0.34187 0.351781 0.363146 0.375832 0.389711 0.40466 0.420565 0.437321 0.454835 0.473022 0.491808 0.511126 0.530919 0.551135 0.57173 0.336341 0.337268 0.340037 0.344601 0.350892 0.358818 0.368273 0.379144 0.391312 0.40466 0.419076 0.434454 0.450694 0.467707 0.485412 0.503736 0.522614 0.541987 0.561805 0.582022 0.355317 0.356195 0.358818 0.363146 0.369121 0.376663 0.385681 0.396074 0.407738 0.420565 0.434454 0.449305 0.465027 0.481534 0.498748 0.516599 0.535023 0.553963 0.573367 0.593191 0.375 0.375832 0.378319 0.382426 0.388104 0.395285 0.403887 0.413824 0.425 0.437321 0.450694 0.465027 0.480234 0.496236 0.512957 0.53033 0.548293 0.566789 0.585769 0.605186 0.395285 0.396074 0.398434 0.402337 0.407738 0.414578 0.422788 0.43229 0.443001 0.454835 0.467707 0.481534 0.496236 0.511737 0.527968 0.544862 0.562361 0.580409 0.598957 0.61796 0.416083 0.416833 0.419076 0.422788 0.427931 0.434454 0.442295 0.451387 0.461655 0.473022 0.485412 0.498748 0.512957 0.527968 0.543714 0.560134 0.57717 0.594769 0.612883 0.631467 0.437321 0.438035 0.44017 0.443706 0.448609 0.454835 0.462331 0.471036 0.480885 0.491808 0.503736 0.516599 0.53033 0.544862 0.560134 0.576086 0.592663 0.609816 0.627495 0.645659 0.458939 0.459619 0.461655 0.465027 0.469707 0.475657 0.48283 0.491172 0.500625 0.511126 0.522614 0.535023 0.548293 0.562361 0.57717 0.592663 0.60879 0.6255 0.642748 0.660492 0.480885 0.481534 0.483477 0.486698 0.491172 0.496865 0.503736 0.511737 0.520817 0.530919 0.541987 0.553963 0.566789 0.580409 0.594769 0.609816 0.6255 0.641775 0.658597 0.675925 0.503115 0.503736 0.505594 0.508675 0.512957 0.518411 0.525 0.532682 0.54141 0.551135 0.561805 0.573367 0.585769 0.598957 0.612883 0.627495 0.642748 0.658597 0.675 0.691918 0.525595 0.526189 0.527968 0.530919 0.535023 0.540255 0.54658 0.553963 0.562361 0.57173 0.582022 0.593191 0.605186 0.61796 0.631467 0.645659 0.660492 0.675925 0.691918 0.708431 0.548293 0.548862 0.550568 0.553399 0.557337 0.562361 0.568441 0.575543 0.583631 0.592663 0.602599 0.613392 0.625 0.637377 0.650481 0.664267 0.678694 0.693722 0.709313 0.725431 0.571183 0.57173 0.573367 0.576086 0.579871 0.584701 0.590551 0.59739 0.605186 0.613901 0.623498 0.633936 0.645174 0.657172 0.669888 0.683283 0.697316 0.711952 0.727152 0.742883 0.594243 0.594769 0.596343 0.598957 0.602599 0.607248 0.612883 0.619476 0.626997 0.635413 0.64469 0.65479 0.665676 0.677311 0.689656 0.702673 0.716327 0.730582 0.745403 0.760756 0.617454 0.61796 0.619476 0.621993 0.6255 0.62998 0.635413 0.641775 0.649038 0.657172 0.666146 0.675925 0.686477 0.697764 0.709753 0.722409 0.735697 0.749583 0.764035 0.779022 0.6408 0.641288 0.642748 0.645174 0.648556 0.652878 0.658122 0.664267 0.671286 0.679154 0.687841 0.697316 0.707549 0.718505 0.730154 0.742462 0.755397 0.768928 0.783023 0.797653 0.664267 0.664737 0.666146 0.668487 0.671751 0.675925 0.680992 0.686932 0.693722 0.701338 0.709753 0.71894 0.728869 0.73951 0.750833 0.762807 0.775403 0.788591 0.80234 0.816624 0.687841 0.688295 0.689656 0.691918 0.695072 0.699107 0.704006 0.709753 0.716327 0.723706 0.731864 0.740777 0.750417 0.760756 0.771767 0.783422 0.795692 0.808548 0.821964 0.835913 0.711512 0.711952 0.713267 0.715454 0.718505 0.722409 0.727152 0.732718 0.739087 0.746241 0.754155 0.762807 0.772172 0.782224 0.792938 0.804285 0.816241 0.828779 0.841873 0.855497 0.735272 0.735697 0.73697 0.739087 0.742041 0.745822 0.750417 0.755811 0.761988 0.768928 0.776611 0.785016 0.794119 0.803897 0.814325 0.825379 0.837033 0.849264 0.862047 0.875357 0.759111 0.759523 0.760756 0.762807 0.76567 0.769334 0.773789 0.779022 0.785016 0.791754 0.799218 0.807388 0.816241 0.825757 0.835913 0.846685 0.85805 0.869986 0.882468 0.895475 0.25 0.251247 0.254951 0.261008 0.269258 0.279508 0.291548 0.305164 0.320156 0.336341 0.353553 0.371652 0.390512 0.41003 0.430116 0.450694 0.471699 0.493077 0.514782 0.536773 0.251247 0.252488 0.256174 0.262202 0.270416 0.280624 0.292617 0.306186 0.321131 0.337268 0.354436 0.372492 0.391312 0.410792 0.430842 0.451387 0.472361 0.49371 0.515388 0.537355 0.254951 0.256174 0.259808 0.265754 0.273861 0.283945 0.295804 0.309233 0.324037 0.340037 0.357071 0.375 0.3937 0.413068 0.433013 0.453459 0.474342 0.495606 0.517204 0.539096 0.261008 0.262202 0.265754 0.27157 0.279508 0.289396 0.30104 0.314245 0.328824 0.344601 0.361421 0.379144 0.397649 0.416833 0.436606 0.456892 0.477624 0.498748 0.520216 0.541987 0.269258 0.270416 0.273861 0.279508 0.287228 0.296859 0.308221 0.321131 0.33541 0.350892 0.367423 0.38487 0.403113 0.422049 0.441588 0.461655 0.482183 0.503115 0.524404 0.546008 0.279508 0.280624 0.283945 0.289396 0.296859 0.306186 0.317214 0.329773 0.343693 0.358818 0.375 0.39211 0.41003 0.428661 0.447912 0.467707 0.487981 0.508675 0.529741 0.551135 0.291548 0.292617 0.295804 0.30104 0.308221 0.317214 0.327872 0.340037 0.353553 0.368273 0.384057 0.40078 0.41833 0.436606 0.455522 0.475 0.494975 0.515388 0.53619 0.557337 0.305164 0.306186 0.309233 0.314245 0.321131 0.329773 0.340037 0.351781 0.364863 0.379144 0.394493 0.410792 0.427931 0.445814 0.464354 0.483477 0.503115 0.523211 0.543714 0.564579 0.320156 0.321131 0.324037 0.328824 0.33541 0.343693 0.353553 0.364863 0.377492 0.391312 0.406202 0.422049 0.438748 0.456207 0.474342 0.493077 0.512348 0.532095 0.552268 0.572822 0.336341 0.337268 0.340037 0.344601 0.350892 0.358818 0.368273 0.379144 0.391312 0.40466 0.419076 0.434454 0.450694 0.467707 0.485412 0.503736 0.522614 0.541987 0.561805 0.582022 0.353553 0.354436 0.357071 0.361421 0.367423 0.375 0.384057 0.394493 0.406202 0.419076 0.433013 0.447912 0.463681 0.480234 0.497494 0.515388 0.533854 0.552834 0.572276 0.592136 0.371652 0.372492 0.375 0.379144 0.38487 0.39211 0.40078 0.410792 0.422049 0.434454 0.447912 0.462331 0.477624 0.49371 0.510514 0.527968 0.546008 0.564579 0.583631 0.603117 0.390512 0.391312 0.3937 0.397649 0.403113 0.41003 0.41833 0.427931 0.438748 0.450694 0.463681 0.477624 0.492443 0.50806 0.524404 0.54141 0.559017 0.57717 0.595819 0.614919 0.41003 0.410792 0.413068 0.416833 0.422049 0.428661 0.436606 0.445814 0.456207 0.467707 0.480234 0.49371 0.50806 0.523211 0.539096 0.555653 0.572822 0.590551 0.60879 0.627495 0.430116 0.430842 0.433013 0.436606 0.441588 0.447912 0.455522 0.464354 0.474342 0.485412 0.497494 0.510514 0.524404 0.539096 0.554527 0.570636 0.587367 0.604669 0.622495 0.6408 0.450694 0.451387 0.453459 0.456892 0.461655 0.467707 0.475 0.483477 0.493077 0.503736 0.515388 0.527968 0.54141 0.555653 0.570636 0.586302 0.602599 0.619476 0.636887 0.65479 0.471699 0.472361 0.474342 0.477624 0.482183 0.487981 0.494975 0.503115 0.512348 0.522614 0.533854 0.546008 0.559017 0.572822 0.587367 0.602599 0.618466 0.634921 0.65192 0.669421 0.493077 0.49371 0.495606 0.498748 0.503115 0.508675 0.515388 0.523211 0.532095 0.541987 0.552834 0.564579 0.57717 0.590551 0.604669 0.619476 0.634921 0.650961 0.667551 0.684653 0.514782 0.515388 0.517204 0.520216 0.524404 0.529741 0.53619 0.543714 0.552268 0.561805 0.572276 0.583631 0.595819 0.60879 0.622495 0.636887 0.65192 0.667551 0.68374 0.700446 0.536773 0.537355 0.539096 0.541987 0.546008 0.551135 0.557337 0.564579 0.572822 0.582022 0.592136 0.603117 0.614919 0.627495 0.6408 0.65479 0.669421 0.684653 0.700446 0.716764 0.559017 0.559576 0.561249 0.564026 0.567891 0.572822 0.578792 0.585769 0.593717 0.602599 0.612372 0.622997 0.634429 0.646626 0.659545 0.673146 0.687386 0.702229 0.717635 0.73357 0.581485 0.582022 0.583631 0.586302 0.590021 0.594769 0.600521 0.607248 0.614919 0.623498 0.632949 0.643234 0.654313 0.666146 0.678694 0.691918 0.70578 0.720243 0.735272 0.750833 0.604152 0.604669 0.606218 0.60879 0.612372 0.616948 0.622495 0.628987 0.636396 0.64469 0.653835 0.663796 0.674537 0.686021 0.698212 0.711073 0.724569 0.738664 0.753326 0.768521 0.626997 0.627495 0.628987 0.631467 0.634921 0.639336 0.64469 0.650961 0.658122 0.666146 0.675 0.684653 0.695072 0.706222 0.71807 0.730582 0.743724 0.757463 0.771767 0.786607 0.65 0.650481 0.65192 0.654313 0.657647 0.66191 0.667083 0.673146 0.680074 0.687841 0.696419 0.70578 0.715891 0.726722 0.738241 0.750417 0.763217 0.776611 0.790569 0.805062 0.673146 0.67361 0.675 0.677311 0.680533 0.684653 0.689656 0.695521 0.702229 0.709753 0.71807 0.727152 0.73697 0.747496 0.7587 0.770552 0.783023 0.796084 0.809707 0.823863 0.696419 0.696868 0.698212 0.700446 0.703562 0.707549 0.71239 0.71807 0.724569 0.731864 0.739932 0.748749 0.758288 0.768521 0.779423 0.790965 0.803119 0.815858 0.829156 0.842986 0.719809 0.720243 0.721543 0.723706 0.726722 0.730582 0.735272 0.740777 0.747078 0.754155 0.761988 0.770552 0.779824 0.789778 0.800391 0.811634 0.823483 0.835913 0.848896 0.862409 0.743303 0.743724 0.744983 0.747078 0.75 0.753741 0.758288 0.763626 0.76974 0.776611 0.784219 0.792543 0.801561 0.811249 0.821584 0.832541 0.844097 0.856227 0.868907 0.882114 0.766893 0.7673 0.768521 0.770552 0.773385 0.777014 0.781425 0.786607 0.792543 0.799218 0.806613 0.814709 0.823483 0.832917 0.842986 0.853669 0.864942 0.876784 0.889171 0.902081 0.275 0.276134 0.279508 0.285044 0.292617 0.302076 0.313249 0.32596 0.340037 0.355317 0.371652 0.388909 0.406971 0.425735 0.445112 0.465027 0.485412 0.506211 0.527376 0.548862 0.276134 0.277263 0.280624 0.286138 0.293684 0.303109 0.314245 0.326917 0.340955 0.356195 0.372492 0.389711 0.407738 0.426468 0.445814 0.465698 0.486056 0.506828 0.527968 0.549432 0.279508 0.280624 0.283945 0.289396 0.296859 0.306186 0.317214 0.329773 0.343693 0.358818 0.375 0.39211 0.41003 0.428661 0.447912 0.467707 0.487981 0.508675 0.529741 0.551135 0.285044 0.286138 0.289396 0.294746 0.302076 0.311247 0.322102 0.334477 0.34821 0.363146 0.379144 0.396074 0.413824 0.43229 0.451387 0.471036 0.491172 0.511737 0.532682 0.553963 0.292617 0.293684 0.296859 0.302076 0.309233 0.318198 0.328824 0.340955 0.354436 0.369121 0.38487 0.401559 0.419076 0.437321 0.456207 0.475657 0.495606 0.515994 0.536773 0.557898 0.302076 0.303109 0.306186 0.311247 0.318198 0.326917 0.337268 0.349106 0.362284 0.376663 0.39211 0.408503 0.425735 0.443706 0.462331 0.481534 0.501248 0.521416 0.541987 0.562917 0.313249 0.314245 0.317214 0.322102 0.328824 0.337268 0.347311 0.358818 0.371652 0.385681 0.40078 0.416833 0.433734 0.451387 0.469707 0.488621 0.50806 0.527968 0.548293 0.56899 0.32596 0.326917 0.329773 0.334477 0.340955 0.349106 0.358818 0.369966 0.382426 0.396074 0.410792 0.426468 0.443001 0.460299 0.478278 0.496865 0.515994 0.535607 0.555653 0.576086 0.340037 0.340955 0.343693 0.34821 0.354436 0.362284 0.371652 0.382426 0.394493 0.407738 0.422049 0.437321 0.453459 0.470372 0.487981 0.506211 0.525 0.544289 0.564026 0.584166 0.355317 0.356195 0.358818 0.363146 0.369121 0.376663 0.385681 0.396074 0.407738 0.420565 0.434454 0.449305 0.465027 0.481534 0.498748 0.516599 0.535023 0.553963 0.573367 0.593191 0.371652 0.372492 0.375 0.379144 0.38487 0.39211 0.40078 0.410792 0.422049 0.434454 0.447912 0.462331 0.477624 0.49371 0.510514 0.527968 0.546008 0.564579 0.583631 0.603117 0.388909 0.389711 0.39211 0.396074 0.401559 0.408503 0.416833 0.426468 0.437321 0.449305 0.462331 0.476314 0.491172 0.506828 0.523211 0.540255 0.557898 0.576086 0.594769 0.613901 0.406971 0.407738 0.41003 0.413824 0.419076 0.425735 0.433734 0.443001 0.453459 0.465027 0.477624 0.491172 0.505594 0.520817 0.536773 0.553399 0.570636 0.58843 0.606733 0.6255 0.425735 0.426468 0.428661 0.43229 0.437321 0.443706 0.451387 0.460299 0.470372 0.481534 0.49371 0.506828 0.520817 0.535607 0.551135 0.56734 0.584166 0.60156 0.619476 0.637868 0.445112 0.445814 0.447912 0.451387 0.456207 0.462331 0.469707 0.478278 0.487981 0.498748 0.510514 0.523211 0.536773 0.551135 0.566238 0.582022 0.598435 0.615427 0.632949 0.650961 0.465027 0.465698 0.467707 0.471036 0.475657 0.481534 0.488621 0.496865 0.506211 0.516599 0.527968 0.540255 0.553399 0.56734 0.582022 0.59739 0.613392 0.62998 0.647109 0.664737 0.485412 0.486056 0.487981 0.491172 0.495606 0.501248 0.50806 0.515994 0.525 0.535023 0.546008 0.557898 0.570636 0.584166 0.598435 0.613392 0.628987 0.645174 0.66191 0.679154 0.506211 0.506828 0.508675 0.511737 0.515994 0.521416 0.527968 0.535607 0.544289 0.553963 0.564579 0.576086 0.58843 0.60156 0.615427 0.62998 0.645174 0.660965 0.677311 0.694172 0.527376 0.527968 0.529741 0.532682 0.536773 0.541987 0.548293 0.555653 0.564026 0.573367 0.583631 0.594769 0.606733 0.619476 0.632949 0.647109 0.66191 0.677311 0.693271 0.709753 0.548862 0.549432 0.551135 0.553963 0.557898 0.562917 0.56899 0.576086 0.584166 0.593191 0.603117 0.613901 0.6255 0.637868 0.650961 0.664737 0.679154 0.694172 0.709753 0.725862 0.570636 0.571183 0.572822 0.575543 0.579332 0.584166 0.590021 0.596867 0.604669 0.613392 0.622997 0.633443 0.64469 0.656696 0.669421 0.682825 0.696868 0.711512 0.726722 0.742462 0.592663 0.593191 0.594769 0.59739 0.601041 0.605702 0.611351 0.61796 0.6255 0.633936 0.643234 0.653357 0.664267 0.675925 0.688295 0.701338 0.715017 0.729298 0.744144 0.759523 0.614919 0.615427 0.616948 0.619476 0.622997 0.627495 0.632949 0.639336 0.646626 0.65479 0.663796 0.67361 0.684197 0.695521 0.707549 0.720243 0.73357 0.747496 0.761988 0.777014 0.637377 0.637868 0.639336 0.641775 0.645174 0.649519 0.65479 0.660965 0.668019 0.675925 0.684653 0.694172 0.70445 0.715454 0.727152 0.73951 0.752496 0.766078 0.780224 0.794906 0.660019 0.660492 0.66191 0.664267 0.667551 0.671751 0.676849 0.682825 0.689656 0.697316 0.70578 0.715017 0.725 0.735697 0.747078 0.759111 0.771767 0.785016 0.798827 0.813173 0.682825 0.683283 0.684653 0.686932 0.690109 0.694172 0.699107 0.704894 0.711512 0.71894 0.727152 0.736122 0.745822 0.756224 0.7673 0.779022 0.79136 0.804285 0.817771 0.83179 0.70578 0.706222 0.707549 0.709753 0.712829 0.716764 0.721543 0.727152 0.73357 0.740777 0.748749 0.757463 0.766893 0.777014 0.787798 0.799218 0.811249 0.823863 0.837033 0.850735 0.728869 0.729298 0.730582 0.732718 0.735697 0.73951 0.744144 0.749583 0.755811 0.762807 0.770552 0.779022 0.788194 0.798044 0.808548 0.81968 0.831414 0.843727 0.856592 0.869986 0.75208 0.752496 0.753741 0.755811 0.7587 0.762398 0.766893 0.772172 0.778219 0.785016 0.792543 0.800781 0.809707 0.819298 0.829533 0.840387 0.851836 0.863858 0.876427 0.889522 0.775403 0.775806 0.777014 0.779022 0.781825 0.785414 0.789778 0.794906 0.800781 0.807388 0.814709 0.822724 0.831414 0.840759 0.850735 0.861322 0.872496 0.884237 0.896521 0.909327 0.3 0.30104 0.304138 0.309233 0.316228 0.325 0.33541 0.347311 0.360555 0.375 0.390512 0.406971 0.424264 0.442295 0.460977 0.480234 0.5 0.520216 0.540833 0.561805 0.30104 0.302076 0.305164 0.310242 0.317214 0.32596 0.336341 0.34821 0.361421 0.375832 0.391312 0.407738 0.425 0.443001 0.461655 0.480885 0.500625 0.520817 0.54141 0.562361 0.304138 0.305164 0.308221 0.313249 0.320156 0.328824 0.339116 0.350892 0.364005 0.378319 0.3937 0.41003 0.4272 0.445112 0.463681 0.48283 0.502494 0.522614 0.543139 0.564026 0.309233 0.310242 0.313249 0.318198 0.325 0.333542 0.343693 0.355317 0.368273 0.382426 0.397649 0.413824 0.430842 0.448609 0.467039 0.486056 0.505594 0.525595 0.546008 0.566789 0.316228 0.317214 0.320156 0.325 0.331662 0.340037 0.35 0.361421 0.374166 0.388104 0.403113 0.419076 0.43589 0.453459 0.471699 0.490535 0.509902 0.529741 0.55 0.570636 0.325 0.32596 0.328824 0.333542 0.340037 0.34821 0.357946 0.369121 0.381608 0.395285 0.41003 0.425735 0.442295 0.459619 0.477624 0.496236 0.515388 0.535023 0.55509 0.575543 0.33541 0.336341 0.339116 0.343693 0.35 0.357946 0.367423 0.378319 0.390512 0.403887 0.41833 0.433734 0.45 0.467039 0.484768 0.503115 0.522015 0.54141 0.561249 0.581485 0.347311 0.34821 0.350892 0.355317 0.361421 0.369121 0.378319 0.388909 0.40078 0.413824 0.427931 0.443001 0.458939 0.475657 0.493077 0.511126 0.529741 0.548862 0.568441 0.58843 0.360555 0.361421 0.364005 0.368273 0.374166 0.381608 0.390512 0.40078 0.412311 0.425 0.438748 0.453459 0.469042 0.485412 0.502494 0.520216 0.538516 0.557337 0.576628 0.596343 0.375 0.375832 0.378319 0.382426 0.388104 0.395285 0.403887 0.413824 0.425 0.437321 0.450694 0.465027 0.480234 0.496236 0.512957 0.53033 0.548293 0.566789 0.585769 0.605186 0.390512 0.391312 0.3937 0.397649 0.403113 0.41003 0.41833 0.427931 0.438748 0.450694 0.463681 0.477624 0.492443 0.50806 0.524404 0.54141 0.559017 0.57717 0.595819 0.614919 0.406971 0.407738 0.41003 0.413824 0.419076 0.425735 0.433734 0.443001 0.453459 0.465027 0.477624 0.491172 0.505594 0.520817 0.536773 0.553399 0.570636 0.58843 0.606733 0.6255 0.424264 0.425 0.4272 0.430842 0.43589 0.442295 0.45 0.458939 0.469042 0.480234 0.492443 0.505594 0.519615 0.534439 0.55 0.566238 0.583095 0.600521 0.618466 0.636887 0.442295 0.443001 0.445112 0.448609 0.453459 0.459619 0.467039 0.475657 0.485412 0.496236 0.50806 0.520817 0.534439 0.548862 0.564026 0.579871 0.596343 0.613392 0.630971 0.649038 0.460977 0.461655 0.463681 0.467039 0.471699 0.477624 0.484768 0.493077 0.502494 0.512957 0.524404 0.536773 0.55 0.564026 0.578792 0.594243 0.610328 0.626997 0.644205 0.66191 0.480234 0.480885 0.48283 0.486056 0.490535 0.496236 0.503115 0.511126 0.520216 0.53033 0.54141 0.553399 0.566238 0.579871 0.594243 0.609303 0.625 0.641288 0.658122 0.675463 0.5 0.500625 0.502494 0.505594 0.509902 0.515388 0.522015 0.529741 0.538516 0.548293 0.559017 0.570636 0.583095 0.596343 0.610328 0.625 0.640312 0.65622 0.672681 0.689656 0.520216 0.520817 0.522614 0.525595 0.529741 0.535023 0.54141 0.548862 0.557337 0.566789 0.57717 0.58843 0.600521 0.613392 0.626997 0.641288 0.65622 0.671751 0.687841 0.70445 0.540833 0.54141 0.543139 0.546008 0.55 0.55509 0.561249 0.568441 0.576628 0.585769 0.595819 0.606733 0.618466 0.630971 0.644205 0.658122 0.672681 0.687841 0.703562 0.719809 0.561805 0.562361 0.564026 0.566789 0.570636 0.575543 0.581485 0.58843 0.596343 0.605186 0.614919 0.6255 0.636887 0.649038 0.66191 0.675463 0.689656 0.70445 0.719809 0.735697 0.583095 0.583631 0.585235 0.587899 0.591608 0.596343 0.60208 0.60879 0.616441 0.625 0.634429 0.64469 0.655744 0.667551 0.680074 0.693271 0.707107 0.721543 0.736546 0.75208 0.604669 0.605186 0.606733 0.609303 0.612883 0.617454 0.622997 0.629484 0.636887 0.645174 0.654313 0.664267 0.675 0.686477 0.698659 0.711512 0.725 0.739087 0.753741 0.768928 0.626498 0.626997 0.62849 0.630971 0.634429 0.638847 0.644205 0.650481 0.657647 0.665676 0.674537 0.684197 0.694622 0.70578 0.717635 0.730154 0.743303 0.75705 0.771362 0.786209 0.648556 0.649038 0.650481 0.652878 0.65622 0.660492 0.665676 0.671751 0.678694 0.686477 0.695072 0.70445 0.71458 0.725431 0.73697 0.749166 0.761988 0.775403 0.789383 0.803897 0.67082 0.671286 0.672681 0.675 0.678233 0.682367 0.687386 0.693271 0.7 0.707549 0.715891 0.725 0.734847 0.745403 0.756637 0.768521 0.781025 0.794119 0.807775 0.821964 0.693271 0.693722 0.695072 0.697316 0.700446 0.70445 0.709313 0.715017 0.721543 0.728869 0.73697 0.745822 0.755397 0.76567 0.776611 0.788194 0.800391 0.813173 0.826514 0.840387 0.715891 0.716327 0.717635 0.719809 0.722842 0.726722 0.731437 0.73697 0.743303 0.750417 0.758288 0.766893 0.776209 0.786209 0.796869 0.808161 0.820061 0.832541 0.845577 0.859142 0.738664 0.739087 0.740355 0.742462 0.745403 0.749166 0.753741 0.759111 0.765261 0.772172 0.779824 0.788194 0.797261 0.807001 0.817389 0.828402 0.840015 0.852203 0.864942 0.878208 0.761577 0.761988 0.763217 0.765261 0.768115 0.771767 0.776209 0.781425 0.787401 0.794119 0.801561 0.809707 0.818535 0.828025 0.838153 0.848896 0.860233 0.872138 0.88459 0.897566 0.784618 0.785016 0.786209 0.788194 0.790965 0.794512 0.798827 0.803897 0.809707 0.816241 0.823483 0.831414 0.840015 0.849264 0.859142 0.869626 0.880696 0.892328 0.904503 0.917197 0.325 0.32596 0.328824 0.333542 0.340037 0.34821 0.357946 0.369121 0.381608 0.395285 0.41003 0.425735 0.442295 0.459619 0.477624 0.496236 0.515388 0.535023 0.55509 0.575543 0.32596 0.326917 0.329773 0.334477 0.340955 0.349106 0.358818 0.369966 0.382426 0.396074 0.410792 0.426468 0.443001 0.460299 0.478278 0.496865 0.515994 0.535607 0.555653 0.576086 0.328824 0.329773 0.332603 0.337268 0.343693 0.351781 0.361421 0.372492 0.38487 0.398434 0.413068 0.428661 0.445112 0.462331 0.480234 0.498748 0.517808 0.537355 0.557337 0.577711 0.333542 0.334477 0.337268 0.34187 0.34821 0.356195 0.365718 0.376663 0.388909 0.402337 0.416833 0.43229 0.448609 0.465698 0.483477 0.501871 0.520817 0.540255 0.560134 0.580409 0.340037 0.340955 0.343693 0.34821 0.354436 0.362284 0.371652 0.382426 0.394493 0.407738 0.422049 0.437321 0.453459 0.470372 0.487981 0.506211 0.525 0.544289 0.564026 0.584166 0.34821 0.349106 0.351781 0.356195 0.362284 0.369966 0.379144 0.389711 0.401559 0.414578 0.428661 0.443706 0.459619 0.476314 0.49371 0.511737 0.53033 0.549432 0.56899 0.588961 0.357946 0.358818 0.361421 0.365718 0.371652 0.379144 0.388104 0.398434 0.41003 0.422788 0.436606 0.451387 0.467039 0.483477 0.500625 0.518411 0.536773 0.555653 0.575 0.594769 0.369121 0.369966 0.372492 0.376663 0.382426 0.389711 0.398434 0.408503 0.419821 0.43229 0.445814 0.460299 0.475657 0.491808 0.508675 0.526189 0.544289 0.562917 0.582022 0.60156 0.381608 0.382426 0.38487 0.388909 0.394493 0.401559 0.41003 0.419821 0.430842 0.443001 0.456207 0.470372 0.485412 0.501248 0.517808 0.535023 0.552834 0.571183 0.590021 0.609303 0.395285 0.396074 0.398434 0.402337 0.407738 0.414578 0.422788 0.43229 0.443001 0.454835 0.467707 0.481534 0.496236 0.511737 0.527968 0.544862 0.562361 0.580409 0.598957 0.61796 0.41003 0.410792 0.413068 0.416833 0.422049 0.428661 0.436606 0.445814 0.456207 0.467707 0.480234 0.49371 0.50806 0.523211 0.539096 0.555653 0.572822 0.590551 0.60879 0.627495 0.425735 0.426468 0.428661 0.43229 0.437321 0.443706 0.451387 0.460299 0.470372 0.481534 0.49371 0.506828 0.520817 0.535607 0.551135 0.56734 0.584166 0.60156 0.619476 0.637868 0.442295 0.443001 0.445112 0.448609 0.453459 0.459619 0.467039 0.475657 0.485412 0.496236 0.50806 0.520817 0.534439 0.548862 0.564026 0.579871 0.596343 0.613392 0.630971 0.649038 0.459619 0.460299 0.462331 0.465698 0.470372 0.476314 0.483477 0.491808 0.501248 0.511737 0.523211 0.535607 0.548862 0.562917 0.577711 0.593191 0.609303 0.625999 0.643234 0.660965 0.477624 0.478278 0.480234 0.483477 0.487981 0.49371 0.500625 0.508675 0.517808 0.527968 0.539096 0.551135 0.564026 0.577711 0.592136 0.607248 0.622997 0.639336 0.65622 0.67361 0.496236 0.496865 0.498748 0.501871 0.506211 0.511737 0.518411 0.526189 0.535023 0.544862 0.555653 0.56734 0.579871 0.593191 0.607248 0.621993 0.637377 0.653357 0.669888 0.686932 0.515388 0.515994 0.517808 0.520817 0.525 0.53033 0.536773 0.544289 0.552834 0.562361 0.572822 0.584166 0.596343 0.609303 0.622997 0.637377 0.652399 0.668019 0.684197 0.700892 0.535023 0.535607 0.537355 0.540255 0.544289 0.549432 0.555653 0.562917 0.571183 0.580409 0.590551 0.60156 0.613392 0.625999 0.639336 0.653357 0.668019 0.683283 0.699107 0.715454 0.55509 0.555653 0.557337 0.560134 0.564026 0.56899 0.575 0.582022 0.590021 0.598957 0.60879 0.619476 0.630971 0.643234 0.65622 0.669888 0.684197 0.699107 0.71458 0.730582 0.575543 0.576086 0.577711 0.580409 0.584166 0.588961 0.594769 0.60156 0.609303 0.61796 0.627495 0.637868 0.649038 0.660965 0.67361 0.686932 0.700892 0.715454 0.730582 0.746241 0.596343 0.596867 0.598435 0.601041 0.604669 0.609303 0.614919 0.62149 0.628987 0.637377 0.646626 0.656696 0.667551 0.679154 0.691466 0.70445 0.71807 0.732291 0.747078 0.762398 0.617454 0.61796 0.619476 0.621993 0.6255 0.62998 0.635413 0.641775 0.649038 0.657172 0.666146 0.675925 0.686477 0.697764 0.709753 0.722409 0.735697 0.749583 0.764035 0.779022 0.638847 0.639336 0.6408 0.643234 0.646626 0.650961 0.65622 0.662382 0.669421 0.677311 0.686021 0.695521 0.70578 0.716764 0.72844 0.740777 0.753741 0.7673 0.781425 0.796084 0.660492 0.660965 0.662382 0.664737 0.668019 0.672216 0.677311 0.683283 0.690109 0.697764 0.706222 0.715454 0.725431 0.736122 0.747496 0.759523 0.772172 0.785414 0.799218 0.813557 0.682367 0.682825 0.684197 0.686477 0.689656 0.693722 0.698659 0.70445 0.711073 0.718505 0.726722 0.735697 0.745403 0.755811 0.766893 0.778621 0.790965 0.803897 0.817389 0.831414 0.70445 0.704894 0.706222 0.708431 0.711512 0.715454 0.720243 0.725862 0.732291 0.73951 0.747496 0.756224 0.76567 0.775806 0.786607 0.798044 0.810093 0.822724 0.835913 0.849632 0.726722 0.727152 0.72844 0.730582 0.73357 0.737394 0.742041 0.747496 0.753741 0.760756 0.768521 0.777014 0.786209 0.796084 0.806613 0.817771 0.829533 0.841873 0.854766 0.868188 0.749166 0.749583 0.750833 0.752911 0.755811 0.759523 0.764035 0.769334 0.775403 0.782224 0.789778 0.798044 0.807001 0.816624 0.826892 0.83778 0.849264 0.861322 0.873928 0.88706 0.771767 0.772172 0.773385 0.775403 0.778219 0.781825 0.786209 0.79136 0.797261 0.803897 0.811249 0.819298 0.828025 0.837407 0.847423 0.85805 0.869267 0.881051 0.893378 0.906228 0.794512 0.794906 0.796084 0.798044 0.800781 0.804285 0.808548 0.813557 0.819298 0.825757 0.832917 0.840759 0.849264 0.858414 0.868188 0.878564 0.889522 0.901041 0.913099 0.925675 0.35 0.350892 0.353553 0.357946 0.364005 0.371652 0.380789 0.391312 0.403113 0.416083 0.430116 0.445112 0.460977 0.477624 0.494975 0.512957 0.531507 0.550568 0.570088 0.590021 0.350892 0.351781 0.354436 0.358818 0.364863 0.372492 0.381608 0.39211 0.403887 0.416833 0.430842 0.445814 0.461655 0.478278 0.495606 0.513566 0.532095 0.551135 0.570636 0.590551 0.353553 0.354436 0.357071 0.361421 0.367423 0.375 0.384057 0.394493 0.406202 0.419076 0.433013 0.447912 0.463681 0.480234 0.497494 0.515388 0.533854 0.552834 0.572276 0.592136 0.357946 0.358818 0.361421 0.365718 0.371652 0.379144 0.388104 0.398434 0.41003 0.422788 0.436606 0.451387 0.467039 0.483477 0.500625 0.518411 0.536773 0.555653 0.575 0.594769 0.364005 0.364863 0.367423 0.371652 0.377492 0.38487 0.3937 0.403887 0.415331 0.427931 0.441588 0.456207 0.471699 0.487981 0.504975 0.522614 0.540833 0.559576 0.578792 0.598435 0.371652 0.372492 0.375 0.379144 0.38487 0.39211 0.40078 0.410792 0.422049 0.434454 0.447912 0.462331 0.477624 0.49371 0.510514 0.527968 0.546008 0.564579 0.583631 0.603117 0.380789 0.381608 0.384057 0.388104 0.3937 0.40078 0.409268 0.419076 0.430116 0.442295 0.455522 0.469707 0.484768 0.500625 0.517204 0.534439 0.552268 0.570636 0.589491 0.60879 0.391312 0.39211 0.394493 0.398434 0.403887 0.410792 0.419076 0.428661 0.43946 0.451387 0.464354 0.478278 0.493077 0.508675 0.525 0.541987 0.559576 0.577711 0.596343 0.615427 0.403113 0.403887 0.406202 0.41003 0.415331 0.422049 0.430116 0.43946 0.45 0.461655 0.474342 0.487981 0.502494 0.517808 0.533854 0.550568 0.567891 0.585769 0.604152 0.622997 0.416083 0.416833 0.419076 0.422788 0.427931 0.434454 0.442295 0.451387 0.461655 0.473022 0.485412 0.498748 0.512957 0.527968 0.543714 0.560134 0.57717 0.594769 0.612883 0.631467 0.430116 0.430842 0.433013 0.436606 0.441588 0.447912 0.455522 0.464354 0.474342 0.485412 0.497494 0.510514 0.524404 0.539096 0.554527 0.570636 0.587367 0.604669 0.622495 0.6408 0.445112 0.445814 0.447912 0.451387 0.456207 0.462331 0.469707 0.478278 0.487981 0.498748 0.510514 0.523211 0.536773 0.551135 0.566238 0.582022 0.598435 0.615427 0.632949 0.650961 0.460977 0.461655 0.463681 0.467039 0.471699 0.477624 0.484768 0.493077 0.502494 0.512957 0.524404 0.536773 0.55 0.564026 0.578792 0.594243 0.610328 0.626997 0.644205 0.66191 0.477624 0.478278 0.480234 0.483477 0.487981 0.49371 0.500625 0.508675 0.517808 0.527968 0.539096 0.551135 0.564026 0.577711 0.592136 0.607248 0.622997 0.639336 0.65622 0.67361 0.494975 0.495606 0.497494 0.500625 0.504975 0.510514 0.517204 0.525 0.533854 0.543714 0.554527 0.566238 0.578792 0.592136 0.606218 0.620987 0.636396 0.652399 0.668954 0.686021 0.512957 0.513566 0.515388 0.518411 0.522614 0.527968 0.534439 0.541987 0.550568 0.560134 0.570636 0.582022 0.594243 0.607248 0.620987 0.635413 0.650481 0.666146 0.682367 0.699107 0.531507 0.532095 0.533854 0.536773 0.540833 0.546008 0.552268 0.559576 0.567891 0.57717 0.587367 0.598435 0.610328 0.622997 0.636396 0.650481 0.665207 0.680533 0.696419 0.712829 0.550568 0.551135 0.552834 0.555653 0.559576 0.564579 0.570636 0.577711 0.585769 0.594769 0.604669 0.615427 0.626997 0.639336 0.652399 0.666146 0.680533 0.695521 0.711073 0.727152 0.570088 0.570636 0.572276 0.575 0.578792 0.583631 0.589491 0.596343 0.604152 0.612883 0.622495 0.632949 0.644205 0.65622 0.668954 0.682367 0.696419 0.711073 0.726292 0.742041 0.590021 0.590551 0.592136 0.594769 0.598435 0.603117 0.60879 0.615427 0.622997 0.631467 0.6408 0.650961 0.66191 0.67361 0.686021 0.699107 0.712829 0.727152 0.742041 0.757463 0.610328 0.61084 0.612372 0.614919 0.618466 0.622997 0.62849 0.634921 0.642262 0.650481 0.659545 0.669421 0.680074 0.691466 0.703562 0.716327 0.729726 0.743724 0.758288 0.773385 0.630971 0.631467 0.632949 0.635413 0.638847 0.643234 0.648556 0.65479 0.66191 0.669888 0.678694 0.688295 0.698659 0.709753 0.721543 0.733996 0.747078 0.760756 0.775 0.789778 0.65192 0.652399 0.653835 0.65622 0.659545 0.663796 0.668954 0.675 0.681909 0.689656 0.698212 0.707549 0.717635 0.72844 0.739932 0.75208 0.764853 0.778219 0.792149 0.806613 0.673146 0.67361 0.675 0.677311 0.680533 0.684653 0.689656 0.695521 0.702229 0.709753 0.71807 0.727152 0.73697 0.747496 0.7587 0.770552 0.783023 0.796084 0.809707 0.823863 0.694622 0.695072 0.696419 0.698659 0.701783 0.70578 0.710634 0.716327 0.722842 0.730154 0.738241 0.747078 0.756637 0.766893 0.777817 0.789383 0.801561 0.814325 0.827647 0.841502 0.716327 0.716764 0.71807 0.720243 0.723274 0.727152 0.731864 0.737394 0.743724 0.750833 0.7587 0.7673 0.776611 0.786607 0.797261 0.808548 0.820442 0.832917 0.845946 0.859506 0.738241 0.738664 0.739932 0.742041 0.744983 0.748749 0.753326 0.7587 0.764853 0.771767 0.779423 0.787798 0.796869 0.806613 0.817007 0.828025 0.839643 0.851836 0.864581 0.877852 0.760345 0.760756 0.761988 0.764035 0.766893 0.770552 0.775 0.780224 0.786209 0.792938 0.800391 0.808548 0.817389 0.826892 0.837033 0.847791 0.859142 0.871063 0.88353 0.896521 0.782624 0.783023 0.784219 0.786209 0.788987 0.792543 0.796869 0.801951 0.807775 0.814325 0.821584 0.829533 0.838153 0.847423 0.857321 0.867828 0.87892 0.890576 0.902774 0.915492 0.805062 0.80545 0.806613 0.808548 0.811249 0.814709 0.818917 0.823863 0.829533 0.835913 0.842986 0.850735 0.859142 0.868188 0.877852 0.888116 0.898958 0.910357 0.922293 0.934746 0.375 0.375832 0.378319 0.382426 0.388104 0.395285 0.403887 0.413824 0.425 0.437321 0.450694 0.465027 0.480234 0.496236 0.512957 0.53033 0.548293 0.566789 0.585769 0.605186 0.375832 0.376663 0.379144 0.383243 0.388909 0.396074 0.40466 0.414578 0.425735 0.438035 0.451387 0.465698 0.480885 0.496865 0.513566 0.530919 0.548862 0.56734 0.586302 0.605702 0.378319 0.379144 0.381608 0.385681 0.391312 0.398434 0.406971 0.416833 0.427931 0.44017 0.453459 0.467707 0.48283 0.498748 0.515388 0.532682 0.550568 0.56899 0.587899 0.607248 0.382426 0.383243 0.385681 0.389711 0.395285 0.402337 0.410792 0.420565 0.431567 0.443706 0.456892 0.471036 0.486056 0.501871 0.518411 0.535607 0.553399 0.57173 0.590551 0.609816 0.388104 0.388909 0.391312 0.395285 0.40078 0.407738 0.416083 0.425735 0.436606 0.448609 0.461655 0.475657 0.490535 0.506211 0.522614 0.539676 0.557337 0.575543 0.594243 0.613392 0.395285 0.396074 0.398434 0.402337 0.407738 0.414578 0.422788 0.43229 0.443001 0.454835 0.467707 0.481534 0.496236 0.511737 0.527968 0.544862 0.562361 0.580409 0.598957 0.61796 0.403887 0.40466 0.406971 0.410792 0.416083 0.422788 0.430842 0.44017 0.450694 0.462331 0.475 0.488621 0.503115 0.518411 0.534439 0.551135 0.568441 0.586302 0.604669 0.623498 0.413824 0.414578 0.416833 0.420565 0.425735 0.43229 0.44017 0.449305 0.459619 0.471036 0.483477 0.496865 0.511126 0.526189 0.541987 0.558458 0.575543 0.593191 0.611351 0.62998 0.425 0.425735 0.427931 0.431567 0.436606 0.443001 0.450694 0.459619 0.469707 0.480885 0.493077 0.506211 0.520216 0.535023 0.550568 0.566789 0.583631 0.601041 0.618971 0.637377 0.437321 0.438035 0.44017 0.443706 0.448609 0.454835 0.462331 0.471036 0.480885 0.491808 0.503736 0.516599 0.53033 0.544862 0.560134 0.576086 0.592663 0.609816 0.627495 0.645659 0.450694 0.451387 0.453459 0.456892 0.461655 0.467707 0.475 0.483477 0.493077 0.503736 0.515388 0.527968 0.54141 0.555653 0.570636 0.586302 0.602599 0.619476 0.636887 0.65479 0.465027 0.465698 0.467707 0.471036 0.475657 0.481534 0.488621 0.496865 0.506211 0.516599 0.527968 0.540255 0.553399 0.56734 0.582022 0.59739 0.613392 0.62998 0.647109 0.664737 0.480234 0.480885 0.48283 0.486056 0.490535 0.496236 0.503115 0.511126 0.520216 0.53033 0.54141 0.553399 0.566238 0.579871 0.594243 0.609303 0.625 0.641288 0.658122 0.675463 0.496236 0.496865 0.498748 0.501871 0.506211 0.511737 0.518411 0.526189 0.535023 0.544862 0.555653 0.56734 0.579871 0.593191 0.607248 0.621993 0.637377 0.653357 0.669888 0.686932 0.512957 0.513566 0.515388 0.518411 0.522614 0.527968 0.534439 0.541987 0.550568 0.560134 0.570636 0.582022 0.594243 0.607248 0.620987 0.635413 0.650481 0.666146 0.682367 0.699107 0.53033 0.530919 0.532682 0.535607 0.539676 0.544862 0.551135 0.558458 0.566789 0.576086 0.586302 0.59739 0.609303 0.621993 0.635413 0.649519 0.664267 0.679614 0.695521 0.711952 0.548293 0.548862 0.550568 0.553399 0.557337 0.562361 0.568441 0.575543 0.583631 0.592663 0.602599 0.613392 0.625 0.637377 0.650481 0.664267 0.678694 0.693722 0.709313 0.725431 0.566789 0.56734 0.56899 0.57173 0.575543 0.580409 0.586302 0.593191 0.601041 0.609816 0.619476 0.62998 0.641288 0.653357 0.666146 0.679614 0.693722 0.708431 0.723706 0.73951 0.585769 0.586302 0.587899 0.590551 0.594243 0.598957 0.604669 0.611351 0.618971 0.627495 0.636887 0.647109 0.658122 0.669888 0.682367 0.695521 0.709313 0.723706 0.738664 0.754155 0.605186 0.605702 0.607248 0.609816 0.613392 0.61796 0.623498 0.62998 0.637377 0.645659 0.65479 0.664737 0.675463 0.686932 0.699107 0.711952 0.725431 0.73951 0.754155 0.769334 0.625 0.6255 0.626997 0.629484 0.632949 0.637377 0.642748 0.649038 0.65622 0.664267 0.673146 0.682825 0.693271 0.70445 0.716327 0.728869 0.742041 0.755811 0.770146 0.785016 0.645174 0.645659 0.647109 0.649519 0.652878 0.657172 0.662382 0.668487 0.675463 0.683283 0.691918 0.701338 0.711512 0.722409 0.733996 0.746241 0.759111 0.772577 0.786607 0.801171 0.665676 0.666146 0.667551 0.669888 0.673146 0.677311 0.682367 0.688295 0.695072 0.702673 0.711073 0.720243 0.730154 0.740777 0.75208 0.764035 0.776611 0.789778 0.803508 0.817771 0.686477 0.686932 0.688295 0.690561 0.693722 0.697764 0.702673 0.708431 0.715017 0.722409 0.730582 0.73951 0.749166 0.759523 0.770552 0.782224 0.794512 0.807388 0.820823 0.83479 0.707549 0.70799 0.709313 0.711512 0.71458 0.718505 0.723274 0.728869 0.735272 0.742462 0.750417 0.759111 0.768521 0.778621 0.789383 0.800781 0.812788 0.825379 0.838525 0.852203 0.728869 0.729298 0.730582 0.732718 0.735697 0.73951 0.744144 0.749583 0.755811 0.762807 0.770552 0.779022 0.788194 0.798044 0.808548 0.81968 0.831414 0.843727 0.856592 0.869986 0.750417 0.750833 0.75208 0.754155 0.75705 0.760756 0.765261 0.770552 0.776611 0.783422 0.790965 0.799218 0.808161 0.817771 0.828025 0.838898 0.850368 0.862409 0.875 0.888116 0.772172 0.772577 0.773789 0.775806 0.778621 0.782224 0.786607 0.791754 0.797653 0.804285 0.811634 0.81968 0.828402 0.83778 0.847791 0.858414 0.869626 0.881405 0.893728 0.906573 0.794119 0.794512 0.795692 0.797653 0.800391 0.803897 0.808161 0.813173 0.818917 0.825379 0.832541 0.840387 0.848896 0.85805 0.867828 0.878208 0.889171 0.900694 0.912757 0.925338 0.816241 0.816624 0.817771 0.81968 0.822344 0.825757 0.82991 0.83479 0.840387 0.846685 0.853669 0.861322 0.869626 0.878564 0.888116 0.898262 0.908983 0.920258 0.932068 0.944391 0.4 0.40078 0.403113 0.406971 0.412311 0.419076 0.4272 0.436606 0.447214 0.458939 0.471699 0.485412 0.5 0.515388 0.531507 0.548293 0.565685 0.583631 0.60208 0.620987 0.40078 0.401559 0.403887 0.407738 0.413068 0.419821 0.427931 0.437321 0.447912 0.459619 0.472361 0.486056 0.500625 0.515994 0.532095 0.548862 0.566238 0.584166 0.602599 0.62149 0.403113 0.403887 0.406202 0.41003 0.415331 0.422049 0.430116 0.43946 0.45 0.461655 0.474342 0.487981 0.502494 0.517808 0.533854 0.550568 0.567891 0.585769 0.604152 0.622997 0.406971 0.407738 0.41003 0.413824 0.419076 0.425735 0.433734 0.443001 0.453459 0.465027 0.477624 0.491172 0.505594 0.520817 0.536773 0.553399 0.570636 0.58843 0.606733 0.6255 0.412311 0.413068 0.415331 0.419076 0.424264 0.430842 0.438748 0.447912 0.458258 0.469707 0.482183 0.495606 0.509902 0.525 0.540833 0.557337 0.574456 0.592136 0.610328 0.628987 0.419076 0.419821 0.422049 0.425735 0.430842 0.437321 0.445112 0.454148 0.464354 0.475657 0.487981 0.501248 0.515388 0.53033 0.546008 0.562361 0.579332 0.596867 0.614919 0.633443 0.4272 0.427931 0.430116 0.433734 0.438748 0.445112 0.452769 0.461655 0.471699 0.48283 0.494975 0.50806 0.522015 0.536773 0.552268 0.568441 0.585235 0.602599 0.620484 0.638847 0.436606 0.437321 0.43946 0.443001 0.447912 0.454148 0.461655 0.470372 0.480234 0.491172 0.503115 0.515994 0.529741 0.544289 0.559576 0.575543 0.592136 0.609303 0.626997 0.645174 0.447214 0.447912 0.45 0.453459 0.458258 0.464354 0.471699 0.480234 0.489898 0.500625 0.512348 0.525 0.538516 0.552834 0.567891 0.583631 0.6 0.616948 0.634429 0.652399 0.458939 0.459619 0.461655 0.465027 0.469707 0.475657 0.48283 0.491172 0.500625 0.511126 0.522614 0.535023 0.548293 0.562361 0.57717 0.592663 0.60879 0.6255 0.642748 0.660492 0.471699 0.472361 0.474342 0.477624 0.482183 0.487981 0.494975 0.503115 0.512348 0.522614 0.533854 0.546008 0.559017 0.572822 0.587367 0.602599 0.618466 0.634921 0.65192 0.669421 0.485412 0.486056 0.487981 0.491172 0.495606 0.501248 0.50806 0.515994 0.525 0.535023 0.546008 0.557898 0.570636 0.584166 0.598435 0.613392 0.628987 0.645174 0.66191 0.679154 0.5 0.500625 0.502494 0.505594 0.509902 0.515388 0.522015 0.529741 0.538516 0.548293 0.559017 0.570636 0.583095 0.596343 0.610328 0.625 0.640312 0.65622 0.672681 0.689656 0.515388 0.515994 0.517808 0.520817 0.525 0.53033 0.536773 0.544289 0.552834 0.562361 0.572822 0.584166 0.596343 0.609303 0.622997 0.637377 0.652399 0.668019 0.684197 0.700892 0.531507 0.532095 0.533854 0.536773 0.540833 0.546008 0.552268 0.559576 0.567891 0.57717 0.587367 0.598435 0.610328 0.622997 0.636396 0.650481 0.665207 0.680533 0.696419 0.712829 0.548293 0.548862 0.550568 0.553399 0.557337 0.562361 0.568441 0.575543 0.583631 0.592663 0.602599 0.613392 0.625 0.637377 0.650481 0.664267 0.678694 0.693722 0.709313 0.725431 0.565685 0.566238 0.567891 0.570636 0.574456 0.579332 0.585235 0.592136 0.6 0.60879 0.618466 0.628987 0.640312 0.652399 0.665207 0.678694 0.69282 0.707549 0.722842 0.738664 0.583631 0.584166 0.585769 0.58843 0.592136 0.596867 0.602599 0.609303 0.616948 0.6255 0.634921 0.645174 0.65622 0.668019 0.680533 0.693722 0.707549 0.721976 0.73697 0.752496 0.60208 0.602599 0.604152 0.606733 0.610328 0.614919 0.620484 0.626997 0.634429 0.642748 0.65192 0.66191 0.672681 0.684197 0.696419 0.709313 0.722842 0.73697 0.751665 0.766893 0.620987 0.62149 0.622997 0.6255 0.628987 0.633443 0.638847 0.645174 0.652399 0.660492 0.669421 0.679154 0.689656 0.700892 0.712829 0.725431 0.738664 0.752496 0.766893 0.781825 0.640312 0.6408 0.642262 0.64469 0.648074 0.652399 0.657647 0.663796 0.67082 0.678694 0.687386 0.696868 0.707107 0.71807 0.729726 0.742041 0.754983 0.768521 0.782624 0.797261 0.660019 0.660492 0.66191 0.664267 0.667551 0.671751 0.676849 0.682825 0.689656 0.697316 0.70578 0.715017 0.725 0.735697 0.747078 0.759111 0.771767 0.785016 0.798827 0.813173 0.680074 0.680533 0.681909 0.684197 0.687386 0.691466 0.696419 0.702229 0.708872 0.716327 0.724569 0.73357 0.743303 0.753741 0.764853 0.776611 0.788987 0.801951 0.815475 0.829533 0.700446 0.700892 0.702229 0.70445 0.707549 0.711512 0.716327 0.721976 0.72844 0.735697 0.743724 0.752496 0.761988 0.772172 0.783023 0.794512 0.806613 0.819298 0.832541 0.846316 0.72111 0.721543 0.722842 0.725 0.728011 0.731864 0.736546 0.742041 0.748331 0.755397 0.763217 0.771767 0.781025 0.790965 0.801561 0.812788 0.824621 0.837033 0.85 0.863496 0.742041 0.742462 0.743724 0.745822 0.748749 0.752496 0.75705 0.762398 0.768521 0.775403 0.783023 0.79136 0.800391 0.810093 0.820442 0.831414 0.842986 0.855132 0.867828 0.881051 0.763217 0.763626 0.764853 0.766893 0.76974 0.773385 0.777817 0.783023 0.788987 0.795692 0.803119 0.811249 0.820061 0.829533 0.839643 0.850368 0.861684 0.87357 0.886002 0.898958 0.784618 0.785016 0.786209 0.788194 0.790965 0.794512 0.798827 0.803897 0.809707 0.816241 0.823483 0.831414 0.840015 0.849264 0.859142 0.869626 0.880696 0.892328 0.904503 0.917197 0.806226 0.806613 0.807775 0.809707 0.812404 0.815858 0.820061 0.825 0.830662 0.837033 0.844097 0.851836 0.860233 0.869267 0.87892 0.889171 0.9 0.911386 0.923309 0.935748 0.828025 0.828402 0.829533 0.831414 0.834041 0.837407 0.841502 0.846316 0.851836 0.85805 0.864942 0.872496 0.880696 0.889522 0.898958 0.908983 0.919579 0.930726 0.942404 0.954594 0.425 0.425735 0.427931 0.431567 0.436606 0.443001 0.450694 0.459619 0.469707 0.480885 0.493077 0.506211 0.520216 0.535023 0.550568 0.566789 0.583631 0.601041 0.618971 0.637377 0.425735 0.426468 0.428661 0.43229 0.437321 0.443706 0.451387 0.460299 0.470372 0.481534 0.49371 0.506828 0.520817 0.535607 0.551135 0.56734 0.584166 0.60156 0.619476 0.637868 0.427931 0.428661 0.430842 0.434454 0.43946 0.445814 0.453459 0.462331 0.472361 0.483477 0.495606 0.508675 0.522614 0.537355 0.552834 0.56899 0.585769 0.603117 0.620987 0.639336 0.431567 0.43229 0.434454 0.438035 0.443001 0.449305 0.456892 0.465698 0.475657 0.486698 0.498748 0.511737 0.525595 0.540255 0.555653 0.57173 0.58843 0.605702 0.623498 0.641775 0.436606 0.437321 0.43946 0.443001 0.447912 0.454148 0.461655 0.470372 0.480234 0.491172 0.503115 0.515994 0.529741 0.544289 0.559576 0.575543 0.592136 0.609303 0.626997 0.645174 0.443001 0.443706 0.445814 0.449305 0.454148 0.460299 0.467707 0.476314 0.486056 0.496865 0.508675 0.521416 0.535023 0.549432 0.564579 0.580409 0.596867 0.613901 0.631467 0.649519 0.450694 0.451387 0.453459 0.456892 0.461655 0.467707 0.475 0.483477 0.493077 0.503736 0.515388 0.527968 0.54141 0.555653 0.570636 0.586302 0.602599 0.619476 0.636887 0.65479 0.459619 0.460299 0.462331 0.465698 0.470372 0.476314 0.483477 0.491808 0.501248 0.511737 0.523211 0.535607 0.548862 0.562917 0.577711 0.593191 0.609303 0.625999 0.643234 0.660965 0.469707 0.470372 0.472361 0.475657 0.480234 0.486056 0.493077 0.501248 0.510514 0.520817 0.532095 0.544289 0.557337 0.571183 0.585769 0.601041 0.616948 0.633443 0.650481 0.668019 0.480885 0.481534 0.483477 0.486698 0.491172 0.496865 0.503736 0.511737 0.520817 0.530919 0.541987 0.553963 0.566789 0.580409 0.594769 0.609816 0.6255 0.641775 0.658597 0.675925 0.493077 0.49371 0.495606 0.498748 0.503115 0.508675 0.515388 0.523211 0.532095 0.541987 0.552834 0.564579 0.57717 0.590551 0.604669 0.619476 0.634921 0.650961 0.667551 0.684653 0.506211 0.506828 0.508675 0.511737 0.515994 0.521416 0.527968 0.535607 0.544289 0.553963 0.564579 0.576086 0.58843 0.60156 0.615427 0.62998 0.645174 0.660965 0.677311 0.694172 0.520216 0.520817 0.522614 0.525595 0.529741 0.535023 0.54141 0.548862 0.557337 0.566789 0.57717 0.58843 0.600521 0.613392 0.626997 0.641288 0.65622 0.671751 0.687841 0.70445 0.535023 0.535607 0.537355 0.540255 0.544289 0.549432 0.555653 0.562917 0.571183 0.580409 0.590551 0.60156 0.613392 0.625999 0.639336 0.653357 0.668019 0.683283 0.699107 0.715454 0.550568 0.551135 0.552834 0.555653 0.559576 0.564579 0.570636 0.577711 0.585769 0.594769 0.604669 0.615427 0.626997 0.639336 0.652399 0.666146 0.680533 0.695521 0.711073 0.727152 0.566789 0.56734 0.56899 0.57173 0.575543 0.580409 0.586302 0.593191 0.601041 0.609816 0.619476 0.62998 0.641288 0.653357 0.666146 0.679614 0.693722 0.708431 0.723706 0.73951 0.583631 0.584166 0.585769 0.58843 0.592136 0.596867 0.602599 0.609303 0.616948 0.6255 0.634921 0.645174 0.65622 0.668019 0.680533 0.693722 0.707549 0.721976 0.73697 0.752496 0.601041 0.60156 0.603117 0.605702 0.609303 0.613901 0.619476 0.625999 0.633443 0.641775 0.650961 0.660965 0.671751 0.683283 0.695521 0.708431 0.721976 0.736122 0.750833 0.766078 0.618971 0.619476 0.620987 0.623498 0.626997 0.631467 0.636887 0.643234 0.650481 0.658597 0.667551 0.677311 0.687841 0.699107 0.711073 0.723706 0.73697 0.750833 0.765261 0.780224 0.637377 0.637868 0.639336 0.641775 0.645174 0.649519 0.65479 0.660965 0.668019 0.675925 0.684653 0.694172 0.70445 0.715454 0.727152 0.73951 0.752496 0.766078 0.780224 0.794906 0.65622 0.656696 0.658122 0.660492 0.663796 0.668019 0.673146 0.679154 0.686021 0.693722 0.702229 0.711512 0.721543 0.732291 0.743724 0.755811 0.768521 0.781825 0.795692 0.810093 0.675463 0.675925 0.677311 0.679614 0.682825 0.686932 0.691918 0.697764 0.70445 0.711952 0.720243 0.729298 0.739087 0.749583 0.760756 0.772577 0.785016 0.798044 0.811634 0.825757 0.695072 0.695521 0.696868 0.699107 0.702229 0.706222 0.711073 0.716764 0.723274 0.730582 0.738664 0.747496 0.75705 0.7673 0.778219 0.789778 0.801951 0.814709 0.828025 0.841873 0.715017 0.715454 0.716764 0.71894 0.721976 0.725862 0.730582 0.736122 0.742462 0.749583 0.757463 0.766078 0.775403 0.785414 0.796084 0.807388 0.819298 0.83179 0.844837 0.858414 0.735272 0.735697 0.73697 0.739087 0.742041 0.745822 0.750417 0.755811 0.761988 0.768928 0.776611 0.785016 0.794119 0.803897 0.814325 0.825379 0.837033 0.849264 0.862047 0.875357 0.755811 0.756224 0.757463 0.759523 0.762398 0.766078 0.770552 0.775806 0.781825 0.788591 0.796084 0.804285 0.813173 0.822724 0.832917 0.843727 0.855132 0.867107 0.879631 0.892679 0.776611 0.777014 0.778219 0.780224 0.783023 0.786607 0.790965 0.796084 0.801951 0.808548 0.815858 0.823863 0.832541 0.841873 0.851836 0.862409 0.87357 0.885297 0.897566 0.910357 0.797653 0.798044 0.799218 0.801171 0.803897 0.807388 0.811634 0.816624 0.822344 0.828779 0.835913 0.843727 0.852203 0.861322 0.871063 0.881405 0.892328 0.903811 0.915833 0.928372 0.818917 0.819298 0.820442 0.822344 0.825 0.828402 0.832541 0.837407 0.842986 0.849264 0.856227 0.863858 0.872138 0.881051 0.890576 0.900694 0.911386 0.922632 0.934412 0.946705 0.840387 0.840759 0.841873 0.843727 0.846316 0.849632 0.853669 0.858414 0.863858 0.869986 0.876784 0.884237 0.892328 0.901041 0.910357 0.920258 0.930726 0.94174 0.953284 0.965337 0.45 0.450694 0.452769 0.456207 0.460977 0.467039 0.474342 0.48283 0.492443 0.503115 0.514782 0.527376 0.540833 0.55509 0.570088 0.585769 0.60208 0.618971 0.636396 0.654313 0.450694 0.451387 0.453459 0.456892 0.461655 0.467707 0.475 0.483477 0.493077 0.503736 0.515388 0.527968 0.54141 0.555653 0.570636 0.586302 0.602599 0.619476 0.636887 0.65479 0.452769 0.453459 0.455522 0.458939 0.463681 0.469707 0.47697 0.485412 0.494975 0.505594 0.517204 0.529741 0.543139 0.557337 0.572276 0.587899 0.604152 0.620987 0.638357 0.65622 0.456207 0.456892 0.458939 0.462331 0.467039 0.473022 0.480234 0.488621 0.498121 0.508675 0.520216 0.532682 0.546008 0.560134 0.575 0.590551 0.606733 0.623498 0.6408 0.658597 0.460977 0.461655 0.463681 0.467039 0.471699 0.477624 0.484768 0.493077 0.502494 0.512957 0.524404 0.536773 0.55 0.564026 0.578792 0.594243 0.610328 0.626997 0.644205 0.66191 0.467039 0.467707 0.469707 0.473022 0.477624 0.483477 0.490535 0.498748 0.50806 0.518411 0.529741 0.541987 0.55509 0.56899 0.583631 0.598957 0.614919 0.631467 0.648556 0.666146 0.474342 0.475 0.47697 0.480234 0.484768 0.490535 0.497494 0.505594 0.514782 0.525 0.53619 0.548293 0.561249 0.575 0.589491 0.604669 0.620484 0.636887 0.653835 0.671286 0.48283 0.483477 0.485412 0.488621 0.493077 0.498748 0.505594 0.513566 0.522614 0.532682 0.543714 0.555653 0.568441 0.582022 0.596343 0.611351 0.626997 0.643234 0.660019 0.677311 0.492443 0.493077 0.494975 0.498121 0.502494 0.50806 0.514782 0.522614 0.531507 0.54141 0.552268 0.564026 0.576628 0.590021 0.604152 0.618971 0.634429 0.650481 0.667083 0.684197 0.503115 0.503736 0.505594 0.508675 0.512957 0.518411 0.525 0.532682 0.54141 0.551135 0.561805 0.573367 0.585769 0.598957 0.612883 0.627495 0.642748 0.658597 0.675 0.691918 0.514782 0.515388 0.517204 0.520216 0.524404 0.529741 0.53619 0.543714 0.552268 0.561805 0.572276 0.583631 0.595819 0.60879 0.622495 0.636887 0.65192 0.667551 0.68374 0.700446 0.527376 0.527968 0.529741 0.532682 0.536773 0.541987 0.548293 0.555653 0.564026 0.573367 0.583631 0.594769 0.606733 0.619476 0.632949 0.647109 0.66191 0.677311 0.693271 0.709753 0.540833 0.54141 0.543139 0.546008 0.55 0.55509 0.561249 0.568441 0.576628 0.585769 0.595819 0.606733 0.618466 0.630971 0.644205 0.658122 0.672681 0.687841 0.703562 0.719809 0.55509 0.555653 0.557337 0.560134 0.564026 0.56899 0.575 0.582022 0.590021 0.598957 0.60879 0.619476 0.630971 0.643234 0.65622 0.669888 0.684197 0.699107 0.71458 0.730582 0.570088 0.570636 0.572276 0.575 0.578792 0.583631 0.589491 0.596343 0.604152 0.612883 0.622495 0.632949 0.644205 0.65622 0.668954 0.682367 0.696419 0.711073 0.726292 0.742041 0.585769 0.586302 0.587899 0.590551 0.594243 0.598957 0.604669 0.611351 0.618971 0.627495 0.636887 0.647109 0.658122 0.669888 0.682367 0.695521 0.709313 0.723706 0.738664 0.754155 0.60208 0.602599 0.604152 0.606733 0.610328 0.614919 0.620484 0.626997 0.634429 0.642748 0.65192 0.66191 0.672681 0.684197 0.696419 0.709313 0.722842 0.73697 0.751665 0.766893 0.618971 0.619476 0.620987 0.623498 0.626997 0.631467 0.636887 0.643234 0.650481 0.658597 0.667551 0.677311 0.687841 0.699107 0.711073 0.723706 0.73697 0.750833 0.765261 0.780224 0.636396 0.636887 0.638357 0.6408 0.644205 0.648556 0.653835 0.660019 0.667083 0.675 0.68374 0.693271 0.703562 0.71458 0.726292 0.738664 0.751665 0.765261 0.779423 0.794119 0.654313 0.65479 0.65622 0.658597 0.66191 0.666146 0.671286 0.677311 0.684197 0.691918 0.700446 0.709753 0.719809 0.730582 0.742041 0.754155 0.766893 0.780224 0.794119 0.808548 0.672681 0.673146 0.674537 0.676849 0.680074 0.684197 0.689202 0.695072 0.701783 0.709313 0.717635 0.726722 0.736546 0.747078 0.758288 0.770146 0.782624 0.795692 0.809321 0.823483 0.691466 0.691918 0.693271 0.695521 0.698659 0.702673 0.707549 0.713267 0.719809 0.727152 0.735272 0.744144 0.753741 0.764035 0.775 0.786607 0.798827 0.811634 0.825 0.838898 0.710634 0.711073 0.71239 0.71458 0.717635 0.721543 0.726292 0.731864 0.738241 0.745403 0.753326 0.761988 0.771362 0.781425 0.792149 0.803508 0.815475 0.828025 0.84113 0.854766 0.730154 0.730582 0.731864 0.733996 0.73697 0.740777 0.745403 0.750833 0.75705 0.764035 0.771767 0.780224 0.789383 0.799218 0.809707 0.820823 0.832541 0.844837 0.857686 0.871063 0.75 0.750417 0.751665 0.753741 0.756637 0.760345 0.764853 0.770146 0.776209 0.783023 0.790569 0.798827 0.807775 0.817389 0.827647 0.838525 0.85 0.862047 0.874643 0.887764 0.770146 0.770552 0.771767 0.773789 0.776611 0.780224 0.784618 0.789778 0.795692 0.80234 0.809707 0.817771 0.826514 0.835913 0.845946 0.856592 0.867828 0.879631 0.891978 0.904848 0.790569 0.790965 0.792149 0.794119 0.796869 0.800391 0.804674 0.809707 0.815475 0.821964 0.829156 0.837033 0.845577 0.854766 0.864581 0.875 0.886002 0.897566 0.90967 0.922293 0.811249 0.811634 0.812788 0.814709 0.817389 0.820823 0.825 0.82991 0.835539 0.841873 0.848896 0.856592 0.864942 0.873928 0.88353 0.893728 0.904503 0.915833 0.927699 0.94008 0.832166 0.832541 0.833667 0.835539 0.838153 0.841502 0.845577 0.850368 0.855862 0.862047 0.868907 0.876427 0.88459 0.893378 0.902774 0.912757 0.923309 0.934412 0.946044 0.958188 0.853302 0.853669 0.854766 0.856592 0.859142 0.862409 0.866386 0.871063 0.876427 0.882468 0.889171 0.896521 0.904503 0.913099 0.922293 0.932068 0.942404 0.953284 0.964689 0.976601 0.475 0.475657 0.477624 0.480885 0.485412 0.491172 0.498121 0.506211 0.515388 0.525595 0.536773 0.548862 0.561805 0.575543 0.590021 0.605186 0.620987 0.637377 0.654313 0.671751 0.475657 0.476314 0.478278 0.481534 0.486056 0.491808 0.498748 0.506828 0.515994 0.526189 0.537355 0.549432 0.562361 0.576086 0.590551 0.605702 0.62149 0.637868 0.65479 0.672216 0.477624 0.478278 0.480234 0.483477 0.487981 0.49371 0.500625 0.508675 0.517808 0.527968 0.539096 0.551135 0.564026 0.577711 0.592136 0.607248 0.622997 0.639336 0.65622 0.67361 0.480885 0.481534 0.483477 0.486698 0.491172 0.496865 0.503736 0.511737 0.520817 0.530919 0.541987 0.553963 0.566789 0.580409 0.594769 0.609816 0.6255 0.641775 0.658597 0.675925 0.485412 0.486056 0.487981 0.491172 0.495606 0.501248 0.50806 0.515994 0.525 0.535023 0.546008 0.557898 0.570636 0.584166 0.598435 0.613392 0.628987 0.645174 0.66191 0.679154 0.491172 0.491808 0.49371 0.496865 0.501248 0.506828 0.513566 0.521416 0.53033 0.540255 0.551135 0.562917 0.575543 0.588961 0.603117 0.61796 0.633443 0.649519 0.666146 0.683283 0.498121 0.498748 0.500625 0.503736 0.50806 0.513566 0.520216 0.527968 0.536773 0.54658 0.557337 0.56899 0.581485 0.594769 0.60879 0.623498 0.638847 0.65479 0.671286 0.688295 0.506211 0.506828 0.508675 0.511737 0.515994 0.521416 0.527968 0.535607 0.544289 0.553963 0.564579 0.576086 0.58843 0.60156 0.615427 0.62998 0.645174 0.660965 0.677311 0.694172 0.515388 0.515994 0.517808 0.520817 0.525 0.53033 0.536773 0.544289 0.552834 0.562361 0.572822 0.584166 0.596343 0.609303 0.622997 0.637377 0.652399 0.668019 0.684197 0.700892 0.525595 0.526189 0.527968 0.530919 0.535023 0.540255 0.54658 0.553963 0.562361 0.57173 0.582022 0.593191 0.605186 0.61796 0.631467 0.645659 0.660492 0.675925 0.691918 0.708431 0.536773 0.537355 0.539096 0.541987 0.546008 0.551135 0.557337 0.564579 0.572822 0.582022 0.592136 0.603117 0.614919 0.627495 0.6408 0.65479 0.669421 0.684653 0.700446 0.716764 0.548862 0.549432 0.551135 0.553963 0.557898 0.562917 0.56899 0.576086 0.584166 0.593191 0.603117 0.613901 0.6255 0.637868 0.650961 0.664737 0.679154 0.694172 0.709753 0.725862 0.561805 0.562361 0.564026 0.566789 0.570636 0.575543 0.581485 0.58843 0.596343 0.605186 0.614919 0.6255 0.636887 0.649038 0.66191 0.675463 0.689656 0.70445 0.719809 0.735697 0.575543 0.576086 0.577711 0.580409 0.584166 0.588961 0.594769 0.60156 0.609303 0.61796 0.627495 0.637868 0.649038 0.660965 0.67361 0.686932 0.700892 0.715454 0.730582 0.746241 0.590021 0.590551 0.592136 0.594769 0.598435 0.603117 0.60879 0.615427 0.622997 0.631467 0.6408 0.650961 0.66191 0.67361 0.686021 0.699107 0.712829 0.727152 0.742041 0.757463 0.605186 0.605702 0.607248 0.609816 0.613392 0.61796 0.623498 0.62998 0.637377 0.645659 0.65479 0.664737 0.675463 0.686932 0.699107 0.711952 0.725431 0.73951 0.754155 0.769334 0.620987 0.62149 0.622997 0.6255 0.628987 0.633443 0.638847 0.645174 0.652399 0.660492 0.669421 0.679154 0.689656 0.700892 0.712829 0.725431 0.738664 0.752496 0.766893 0.781825 0.637377 0.637868 0.639336 0.641775 0.645174 0.649519 0.65479 0.660965 0.668019 0.675925 0.684653 0.694172 0.70445 0.715454 0.727152 0.73951 0.752496 0.766078 0.780224 0.794906 0.654313 0.65479 0.65622 0.658597 0.66191 0.666146 0.671286 0.677311 0.684197 0.691918 0.700446 0.709753 0.719809 0.730582 0.742041 0.754155 0.766893 0.780224 0.794119 0.808548 0.671751 0.672216 0.67361 0.675925 0.679154 0.683283 0.688295 0.694172 0.700892 0.708431 0.716764 0.725862 0.735697 0.746241 0.757463 0.769334 0.781825 0.794906 0.808548 0.822724 0.689656 0.690109 0.691466 0.693722 0.696868 0.700892 0.70578 0.711512 0.71807 0.725431 0.73357 0.742462 0.75208 0.762398 0.773385 0.785016 0.797261 0.810093 0.823483 0.837407 0.70799 0.708431 0.709753 0.711952 0.715017 0.71894 0.723706 0.729298 0.735697 0.742883 0.750833 0.759523 0.768928 0.779022 0.789778 0.801171 0.813173 0.825757 0.838898 0.85257 0.726722 0.727152 0.72844 0.730582 0.73357 0.737394 0.742041 0.747496 0.753741 0.760756 0.768521 0.777014 0.786209 0.796084 0.806613 0.817771 0.829533 0.841873 0.854766 0.868188 0.745822 0.746241 0.747496 0.749583 0.752496 0.756224 0.760756 0.766078 0.772172 0.779022 0.786607 0.794906 0.803897 0.813557 0.823863 0.83479 0.846316 0.858414 0.871063 0.884237 0.765261 0.76567 0.766893 0.768928 0.771767 0.775403 0.779824 0.785016 0.790965 0.797653 0.805062 0.813173 0.821964 0.831414 0.841502 0.852203 0.863496 0.875357 0.887764 0.900694 0.785016 0.785414 0.786607 0.788591 0.79136 0.794906 0.799218 0.804285 0.810093 0.816624 0.823863 0.83179 0.840387 0.849632 0.859506 0.869986 0.881051 0.892679 0.904848 0.917537 0.805062 0.80545 0.806613 0.808548 0.811249 0.814709 0.818917 0.823863 0.829533 0.835913 0.842986 0.850735 0.859142 0.868188 0.877852 0.888116 0.898958 0.910357 0.922293 0.934746 0.825379 0.825757 0.826892 0.828779 0.831414 0.83479 0.838898 0.843727 0.849264 0.855497 0.862409 0.869986 0.878208 0.88706 0.896521 0.906573 0.917197 0.928372 0.94008 0.9523 0.845946 0.846316 0.847423 0.849264 0.851836 0.855132 0.859142 0.863858 0.869267 0.875357 0.882114 0.889522 0.897566 0.906228 0.915492 0.925338 0.935748 0.946705 0.958188 0.97018 0.866747 0.867107 0.868188 0.869986 0.872496 0.875714 0.879631 0.884237 0.889522 0.895475 0.902081 0.909327 0.917197 0.925675 0.934746 0.944391 0.954594 0.965337 0.976601 0.98837 0.5 0.500625 0.502494 0.505594 0.509902 0.515388 0.522015 0.529741 0.538516 0.548293 0.559017 0.570636 0.583095 0.596343 0.610328 0.625 0.640312 0.65622 0.672681 0.689656 0.500625 0.501248 0.503115 0.506211 0.510514 0.515994 0.522614 0.53033 0.539096 0.548862 0.559576 0.571183 0.583631 0.596867 0.61084 0.6255 0.6408 0.656696 0.673146 0.690109 0.502494 0.503115 0.504975 0.50806 0.512348 0.517808 0.524404 0.532095 0.540833 0.550568 0.561249 0.572822 0.585235 0.598435 0.612372 0.626997 0.642262 0.658122 0.674537 0.691466 0.505594 0.506211 0.50806 0.511126 0.515388 0.520817 0.527376 0.535023 0.543714 0.553399 0.564026 0.575543 0.587899 0.601041 0.614919 0.629484 0.64469 0.660492 0.676849 0.693722 0.509902 0.510514 0.512348 0.515388 0.519615 0.525 0.531507 0.539096 0.547723 0.557337 0.567891 0.579332 0.591608 0.604669 0.618466 0.632949 0.648074 0.663796 0.680074 0.696868 0.515388 0.515994 0.517808 0.520817 0.525 0.53033 0.536773 0.544289 0.552834 0.562361 0.572822 0.584166 0.596343 0.609303 0.622997 0.637377 0.652399 0.668019 0.684197 0.700892 0.522015 0.522614 0.524404 0.527376 0.531507 0.536773 0.543139 0.550568 0.559017 0.568441 0.578792 0.590021 0.60208 0.614919 0.62849 0.642748 0.657647 0.673146 0.689202 0.70578 0.529741 0.53033 0.532095 0.535023 0.539096 0.544289 0.550568 0.557898 0.566238 0.575543 0.585769 0.596867 0.60879 0.62149 0.634921 0.649038 0.663796 0.679154 0.695072 0.711512 0.538516 0.539096 0.540833 0.543714 0.547723 0.552834 0.559017 0.566238 0.574456 0.583631 0.593717 0.604669 0.616441 0.628987 0.642262 0.65622 0.67082 0.686021 0.701783 0.71807 0.548293 0.548862 0.550568 0.553399 0.557337 0.562361 0.568441 0.575543 0.583631 0.592663 0.602599 0.613392 0.625 0.637377 0.650481 0.664267 0.678694 0.693722 0.709313 0.725431 0.559017 0.559576 0.561249 0.564026 0.567891 0.572822 0.578792 0.585769 0.593717 0.602599 0.612372 0.622997 0.634429 0.646626 0.659545 0.673146 0.687386 0.702229 0.717635 0.73357 0.570636 0.571183 0.572822 0.575543 0.579332 0.584166 0.590021 0.596867 0.604669 0.613392 0.622997 0.633443 0.64469 0.656696 0.669421 0.682825 0.696868 0.711512 0.726722 0.742462 0.583095 0.583631 0.585235 0.587899 0.591608 0.596343 0.60208 0.60879 0.616441 0.625 0.634429 0.64469 0.655744 0.667551 0.680074 0.693271 0.707107 0.721543 0.736546 0.75208 0.596343 0.596867 0.598435 0.601041 0.604669 0.609303 0.614919 0.62149 0.628987 0.637377 0.646626 0.656696 0.667551 0.679154 0.691466 0.70445 0.71807 0.732291 0.747078 0.762398 0.610328 0.61084 0.612372 0.614919 0.618466 0.622997 0.62849 0.634921 0.642262 0.650481 0.659545 0.669421 0.680074 0.691466 0.703562 0.716327 0.729726 0.743724 0.758288 0.773385 0.625 0.6255 0.626997 0.629484 0.632949 0.637377 0.642748 0.649038 0.65622 0.664267 0.673146 0.682825 0.693271 0.70445 0.716327 0.728869 0.742041 0.755811 0.770146 0.785016 0.640312 0.6408 0.642262 0.64469 0.648074 0.652399 0.657647 0.663796 0.67082 0.678694 0.687386 0.696868 0.707107 0.71807 0.729726 0.742041 0.754983 0.768521 0.782624 0.797261 0.65622 0.656696 0.658122 0.660492 0.663796 0.668019 0.673146 0.679154 0.686021 0.693722 0.702229 0.711512 0.721543 0.732291 0.743724 0.755811 0.768521 0.781825 0.795692 0.810093 0.672681 0.673146 0.674537 0.676849 0.680074 0.684197 0.689202 0.695072 0.701783 0.709313 0.717635 0.726722 0.736546 0.747078 0.758288 0.770146 0.782624 0.795692 0.809321 0.823483 0.689656 0.690109 0.691466 0.693722 0.696868 0.700892 0.70578 0.711512 0.71807 0.725431 0.73357 0.742462 0.75208 0.762398 0.773385 0.785016 0.797261 0.810093 0.823483 0.837407 0.707107 0.707549 0.708872 0.711073 0.714143 0.71807 0.722842 0.72844 0.734847 0.742041 0.75 0.7587 0.768115 0.778219 0.788987 0.800391 0.812404 0.825 0.838153 0.851836 0.725 0.725431 0.726722 0.728869 0.731864 0.735697 0.740355 0.745822 0.75208 0.759111 0.766893 0.775403 0.784618 0.794512 0.805062 0.816241 0.828025 0.840387 0.853302 0.866747 0.743303 0.743724 0.744983 0.747078 0.75 0.753741 0.758288 0.763626 0.76974 0.776611 0.784219 0.792543 0.801561 0.811249 0.821584 0.832541 0.844097 0.856227 0.868907 0.882114 0.761988 0.762398 0.763626 0.76567 0.768521 0.772172 0.776611 0.781825 0.787798 0.794512 0.801951 0.810093 0.818917 0.828402 0.838525 0.849264 0.860596 0.872496 0.884944 0.897914 0.781025 0.781425 0.782624 0.784618 0.787401 0.790965 0.795299 0.800391 0.806226 0.812788 0.820061 0.828025 0.83666 0.845946 0.855862 0.866386 0.877496 0.889171 0.901388 0.914125 0.800391 0.800781 0.801951 0.803897 0.806613 0.810093 0.814325 0.819298 0.825 0.831414 0.838525 0.846316 0.854766 0.863858 0.87357 0.883883 0.894777 0.906228 0.918218 0.930726 0.820061 0.820442 0.821584 0.823483 0.826136 0.829533 0.833667 0.838525 0.844097 0.850368 0.857321 0.864942 0.873212 0.882114 0.891628 0.901734 0.912414 0.923648 0.935414 0.947695 0.840015 0.840387 0.841502 0.843356 0.845946 0.849264 0.853302 0.85805 0.863496 0.869626 0.876427 0.883883 0.891978 0.900694 0.910014 0.919918 0.93039 0.941409 0.952956 0.965013 0.860233 0.860596 0.861684 0.863496 0.866025 0.869267 0.873212 0.877852 0.883176 0.889171 0.895824 0.90312 0.911043 0.919579 0.928709 0.938416 0.948683 0.959492 0.970824 0.982662 0.880696 0.881051 0.882114 0.883883 0.886355 0.889522 0.893378 0.897914 0.90312 0.908983 0.915492 0.922632 0.93039 0.938749 0.947695 0.957209 0.967277 0.97788 0.989002 1.00062 0.525 0.525595 0.527376 0.53033 0.534439 0.539676 0.546008 0.553399 0.561805 0.571183 0.581485 0.592663 0.604669 0.617454 0.630971 0.645174 0.660019 0.675463 0.691466 0.70799 0.525595 0.526189 0.527968 0.530919 0.535023 0.540255 0.54658 0.553963 0.562361 0.57173 0.582022 0.593191 0.605186 0.61796 0.631467 0.645659 0.660492 0.675925 0.691918 0.708431 0.527376 0.527968 0.529741 0.532682 0.536773 0.541987 0.548293 0.555653 0.564026 0.573367 0.583631 0.594769 0.606733 0.619476 0.632949 0.647109 0.66191 0.677311 0.693271 0.709753 0.53033 0.530919 0.532682 0.535607 0.539676 0.544862 0.551135 0.558458 0.566789 0.576086 0.586302 0.59739 0.609303 0.621993 0.635413 0.649519 0.664267 0.679614 0.695521 0.711952 0.534439 0.535023 0.536773 0.539676 0.543714 0.548862 0.55509 0.562361 0.570636 0.579871 0.590021 0.601041 0.612883 0.6255 0.638847 0.652878 0.667551 0.682825 0.698659 0.715017 0.539676 0.540255 0.541987 0.544862 0.548862 0.553963 0.560134 0.56734 0.575543 0.584701 0.594769 0.605702 0.617454 0.62998 0.643234 0.657172 0.671751 0.686932 0.702673 0.71894 0.546008 0.54658 0.548293 0.551135 0.55509 0.560134 0.566238 0.573367 0.581485 0.590551 0.600521 0.611351 0.622997 0.635413 0.648556 0.662382 0.676849 0.691918 0.707549 0.723706 0.553399 0.553963 0.555653 0.558458 0.562361 0.56734 0.573367 0.580409 0.58843 0.59739 0.607248 0.61796 0.629484 0.641775 0.65479 0.668487 0.682825 0.697764 0.713267 0.729298 0.561805 0.562361 0.564026 0.566789 0.570636 0.575543 0.581485 0.58843 0.596343 0.605186 0.614919 0.6255 0.636887 0.649038 0.66191 0.675463 0.689656 0.70445 0.719809 0.735697 0.571183 0.57173 0.573367 0.576086 0.579871 0.584701 0.590551 0.59739 0.605186 0.613901 0.623498 0.633936 0.645174 0.657172 0.669888 0.683283 0.697316 0.711952 0.727152 0.742883 0.581485 0.582022 0.583631 0.586302 0.590021 0.594769 0.600521 0.607248 0.614919 0.623498 0.632949 0.643234 0.654313 0.666146 0.678694 0.691918 0.70578 0.720243 0.735272 0.750833 0.592663 0.593191 0.594769 0.59739 0.601041 0.605702 0.611351 0.61796 0.6255 0.633936 0.643234 0.653357 0.664267 0.675925 0.688295 0.701338 0.715017 0.729298 0.744144 0.759523 0.604669 0.605186 0.606733 0.609303 0.612883 0.617454 0.622997 0.629484 0.636887 0.645174 0.654313 0.664267 0.675 0.686477 0.698659 0.711512 0.725 0.739087 0.753741 0.768928 0.617454 0.61796 0.619476 0.621993 0.6255 0.62998 0.635413 0.641775 0.649038 0.657172 0.666146 0.675925 0.686477 0.697764 0.709753 0.722409 0.735697 0.749583 0.764035 0.779022 0.630971 0.631467 0.632949 0.635413 0.638847 0.643234 0.648556 0.65479 0.66191 0.669888 0.678694 0.688295 0.698659 0.709753 0.721543 0.733996 0.747078 0.760756 0.775 0.789778 0.645174 0.645659 0.647109 0.649519 0.652878 0.657172 0.662382 0.668487 0.675463 0.683283 0.691918 0.701338 0.711512 0.722409 0.733996 0.746241 0.759111 0.772577 0.786607 0.801171 0.660019 0.660492 0.66191 0.664267 0.667551 0.671751 0.676849 0.682825 0.689656 0.697316 0.70578 0.715017 0.725 0.735697 0.747078 0.759111 0.771767 0.785016 0.798827 0.813173 0.675463 0.675925 0.677311 0.679614 0.682825 0.686932 0.691918 0.697764 0.70445 0.711952 0.720243 0.729298 0.739087 0.749583 0.760756 0.772577 0.785016 0.798044 0.811634 0.825757 0.691466 0.691918 0.693271 0.695521 0.698659 0.702673 0.707549 0.713267 0.719809 0.727152 0.735272 0.744144 0.753741 0.764035 0.775 0.786607 0.798827 0.811634 0.825 0.838898 0.70799 0.708431 0.709753 0.711952 0.715017 0.71894 0.723706 0.729298 0.735697 0.742883 0.750833 0.759523 0.768928 0.779022 0.789778 0.801171 0.813173 0.825757 0.838898 0.85257 0.725 0.725431 0.726722 0.728869 0.731864 0.735697 0.740355 0.745822 0.75208 0.759111 0.766893 0.775403 0.784618 0.794512 0.805062 0.816241 0.828025 0.840387 0.853302 0.866747 0.742462 0.742883 0.744144 0.746241 0.749166 0.752911 0.757463 0.762807 0.768928 0.775806 0.783422 0.791754 0.800781 0.810478 0.820823 0.83179 0.843356 0.855497 0.868188 0.881405 0.760345 0.760756 0.761988 0.764035 0.766893 0.770552 0.775 0.780224 0.786209 0.792938 0.800391 0.808548 0.817389 0.826892 0.837033 0.847791 0.859142 0.871063 0.88353 0.896521 0.778621 0.779022 0.780224 0.782224 0.785016 0.788591 0.792938 0.798044 0.803897 0.810478 0.817771 0.825757 0.834416 0.843727 0.853669 0.864219 0.875357 0.88706 0.899305 0.912072 0.797261 0.797653 0.798827 0.800781 0.803508 0.807001 0.811249 0.816241 0.821964 0.828402 0.835539 0.843356 0.851836 0.860959 0.870704 0.881051 0.891978 0.903466 0.915492 0.928036 0.816241 0.816624 0.817771 0.81968 0.822344 0.825757 0.82991 0.83479 0.840387 0.846685 0.853669 0.861322 0.869626 0.878564 0.888116 0.898262 0.908983 0.920258 0.932068 0.944391 0.835539 0.835913 0.837033 0.838898 0.841502 0.844837 0.848896 0.853669 0.859142 0.865303 0.872138 0.879631 0.887764 0.896521 0.905884 0.915833 0.92635 0.937417 0.949013 0.961119 0.855132 0.855497 0.856592 0.858414 0.860959 0.864219 0.868188 0.872855 0.878208 0.884237 0.890926 0.898262 0.906228 0.914809 0.923986 0.933742 0.94406 0.954921 0.966307 0.9782 0.875 0.875357 0.876427 0.878208 0.880696 0.883883 0.887764 0.892328 0.897566 0.903466 0.910014 0.917197 0.925 0.933408 0.942404 0.951972 0.962094 0.972754 0.983933 0.995615 0.895126 0.895475 0.896521 0.898262 0.900694 0.903811 0.907607 0.912072 0.917197 0.922971 0.929382 0.936416 0.94406 0.9523 0.961119 0.970502 0.980434 0.990896 1.00187 1.01335 0.55 0.550568 0.552268 0.55509 0.559017 0.564026 0.570088 0.57717 0.585235 0.594243 0.604152 0.614919 0.626498 0.638847 0.65192 0.665676 0.680074 0.695072 0.710634 0.726722 0.550568 0.551135 0.552834 0.555653 0.559576 0.564579 0.570636 0.577711 0.585769 0.594769 0.604669 0.615427 0.626997 0.639336 0.652399 0.666146 0.680533 0.695521 0.711073 0.727152 0.552268 0.552834 0.554527 0.557337 0.561249 0.566238 0.572276 0.579332 0.587367 0.596343 0.606218 0.616948 0.62849 0.6408 0.653835 0.667551 0.681909 0.696868 0.71239 0.72844 0.55509 0.555653 0.557337 0.560134 0.564026 0.56899 0.575 0.582022 0.590021 0.598957 0.60879 0.619476 0.630971 0.643234 0.65622 0.669888 0.684197 0.699107 0.71458 0.730582 0.559017 0.559576 0.561249 0.564026 0.567891 0.572822 0.578792 0.585769 0.593717 0.602599 0.612372 0.622997 0.634429 0.646626 0.659545 0.673146 0.687386 0.702229 0.717635 0.73357 0.564026 0.564579 0.566238 0.56899 0.572822 0.577711 0.583631 0.590551 0.598435 0.607248 0.616948 0.627495 0.638847 0.650961 0.663796 0.677311 0.691466 0.706222 0.721543 0.737394 0.570088 0.570636 0.572276 0.575 0.578792 0.583631 0.589491 0.596343 0.604152 0.612883 0.622495 0.632949 0.644205 0.65622 0.668954 0.682367 0.696419 0.711073 0.726292 0.742041 0.57717 0.577711 0.579332 0.582022 0.585769 0.590551 0.596343 0.603117 0.61084 0.619476 0.628987 0.639336 0.650481 0.662382 0.675 0.688295 0.702229 0.716764 0.731864 0.747496 0.585235 0.585769 0.587367 0.590021 0.593717 0.598435 0.604152 0.61084 0.618466 0.626997 0.636396 0.646626 0.657647 0.669421 0.681909 0.695072 0.708872 0.723274 0.738241 0.753741 0.594243 0.594769 0.596343 0.598957 0.602599 0.607248 0.612883 0.619476 0.626997 0.635413 0.64469 0.65479 0.665676 0.677311 0.689656 0.702673 0.716327 0.730582 0.745403 0.760756 0.604152 0.604669 0.606218 0.60879 0.612372 0.616948 0.622495 0.628987 0.636396 0.64469 0.653835 0.663796 0.674537 0.686021 0.698212 0.711073 0.724569 0.738664 0.753326 0.768521 0.614919 0.615427 0.616948 0.619476 0.622997 0.627495 0.632949 0.639336 0.646626 0.65479 0.663796 0.67361 0.684197 0.695521 0.707549 0.720243 0.73357 0.747496 0.761988 0.777014 0.626498 0.626997 0.62849 0.630971 0.634429 0.638847 0.644205 0.650481 0.657647 0.665676 0.674537 0.684197 0.694622 0.70578 0.717635 0.730154 0.743303 0.75705 0.771362 0.786209 0.638847 0.639336 0.6408 0.643234 0.646626 0.650961 0.65622 0.662382 0.669421 0.677311 0.686021 0.695521 0.70578 0.716764 0.72844 0.740777 0.753741 0.7673 0.781425 0.796084 0.65192 0.652399 0.653835 0.65622 0.659545 0.663796 0.668954 0.675 0.681909 0.689656 0.698212 0.707549 0.717635 0.72844 0.739932 0.75208 0.764853 0.778219 0.792149 0.806613 0.665676 0.666146 0.667551 0.669888 0.673146 0.677311 0.682367 0.688295 0.695072 0.702673 0.711073 0.720243 0.730154 0.740777 0.75208 0.764035 0.776611 0.789778 0.803508 0.817771 0.680074 0.680533 0.681909 0.684197 0.687386 0.691466 0.696419 0.702229 0.708872 0.716327 0.724569 0.73357 0.743303 0.753741 0.764853 0.776611 0.788987 0.801951 0.815475 0.829533 0.695072 0.695521 0.696868 0.699107 0.702229 0.706222 0.711073 0.716764 0.723274 0.730582 0.738664 0.747496 0.75705 0.7673 0.778219 0.789778 0.801951 0.814709 0.828025 0.841873 0.710634 0.711073 0.71239 0.71458 0.717635 0.721543 0.726292 0.731864 0.738241 0.745403 0.753326 0.761988 0.771362 0.781425 0.792149 0.803508 0.815475 0.828025 0.84113 0.854766 0.726722 0.727152 0.72844 0.730582 0.73357 0.737394 0.742041 0.747496 0.753741 0.760756 0.768521 0.777014 0.786209 0.796084 0.806613 0.817771 0.829533 0.841873 0.854766 0.868188 0.743303 0.743724 0.744983 0.747078 0.75 0.753741 0.758288 0.763626 0.76974 0.776611 0.784219 0.792543 0.801561 0.811249 0.821584 0.832541 0.844097 0.856227 0.868907 0.882114 0.760345 0.760756 0.761988 0.764035 0.766893 0.770552 0.775 0.780224 0.786209 0.792938 0.800391 0.808548 0.817389 0.826892 0.837033 0.847791 0.859142 0.871063 0.88353 0.896521 0.777817 0.778219 0.779423 0.781425 0.784219 0.787798 0.792149 0.797261 0.803119 0.809707 0.817007 0.825 0.833667 0.842986 0.852936 0.863496 0.874643 0.886355 0.89861 0.911386 0.795692 0.796084 0.797261 0.799218 0.801951 0.80545 0.809707 0.814709 0.820442 0.826892 0.834041 0.841873 0.850368 0.859506 0.869267 0.879631 0.890576 0.902081 0.914125 0.926688 0.813941 0.814325 0.815475 0.817389 0.820061 0.823483 0.827647 0.832541 0.838153 0.844467 0.851469 0.859142 0.867468 0.876427 0.886002 0.896172 0.906918 0.918218 0.930054 0.942404 0.832541 0.832917 0.834041 0.835913 0.838525 0.841873 0.845946 0.850735 0.856227 0.862409 0.869267 0.876784 0.884944 0.893728 0.90312 0.913099 0.923648 0.934746 0.946375 0.958514 0.851469 0.851836 0.852936 0.854766 0.857321 0.860596 0.864581 0.869267 0.874643 0.880696 0.887412 0.894777 0.902774 0.911386 0.920598 0.93039 0.940744 0.951643 0.963068 0.975 0.870704 0.871063 0.872138 0.873928 0.876427 0.879631 0.88353 0.888116 0.893378 0.899305 0.905884 0.913099 0.920937 0.929382 0.938416 0.948024 0.958188 0.968891 0.980115 0.991842 0.890225 0.890576 0.891628 0.893378 0.895824 0.898958 0.902774 0.907262 0.912414 0.918218 0.924662 0.931732 0.939415 0.947695 0.956556 0.965984 0.975961 0.986471 0.997497 1.00902 0.910014 0.910357 0.911386 0.913099 0.915492 0.918559 0.922293 0.926688 0.931732 0.937417 0.943729 0.950658 0.958188 0.966307 0.975 0.984251 0.994045 1.00437 1.0152 1.02652 0.575 0.575543 0.57717 0.579871 0.583631 0.58843 0.594243 0.601041 0.60879 0.617454 0.626997 0.637377 0.648556 0.660492 0.673146 0.686477 0.700446 0.715017 0.730154 0.745822 0.575543 0.576086 0.577711 0.580409 0.584166 0.588961 0.594769 0.60156 0.609303 0.61796 0.627495 0.637868 0.649038 0.660965 0.67361 0.686932 0.700892 0.715454 0.730582 0.746241 0.57717 0.577711 0.579332 0.582022 0.585769 0.590551 0.596343 0.603117 0.61084 0.619476 0.628987 0.639336 0.650481 0.662382 0.675 0.688295 0.702229 0.716764 0.731864 0.747496 0.579871 0.580409 0.582022 0.584701 0.58843 0.593191 0.598957 0.605702 0.613392 0.621993 0.631467 0.641775 0.652878 0.664737 0.677311 0.690561 0.70445 0.71894 0.733996 0.749583 0.583631 0.584166 0.585769 0.58843 0.592136 0.596867 0.602599 0.609303 0.616948 0.6255 0.634921 0.645174 0.65622 0.668019 0.680533 0.693722 0.707549 0.721976 0.73697 0.752496 0.58843 0.588961 0.590551 0.593191 0.596867 0.60156 0.607248 0.613901 0.62149 0.62998 0.639336 0.649519 0.660492 0.672216 0.684653 0.697764 0.711512 0.725862 0.740777 0.756224 0.594243 0.594769 0.596343 0.598957 0.602599 0.607248 0.612883 0.619476 0.626997 0.635413 0.64469 0.65479 0.665676 0.677311 0.689656 0.702673 0.716327 0.730582 0.745403 0.760756 0.601041 0.60156 0.603117 0.605702 0.609303 0.613901 0.619476 0.625999 0.633443 0.641775 0.650961 0.660965 0.671751 0.683283 0.695521 0.708431 0.721976 0.736122 0.750833 0.766078 0.60879 0.609303 0.61084 0.613392 0.616948 0.62149 0.626997 0.633443 0.6408 0.649038 0.658122 0.668019 0.678694 0.690109 0.702229 0.715017 0.72844 0.742462 0.75705 0.772172 0.617454 0.61796 0.619476 0.621993 0.6255 0.62998 0.635413 0.641775 0.649038 0.657172 0.666146 0.675925 0.686477 0.697764 0.709753 0.722409 0.735697 0.749583 0.764035 0.779022 0.626997 0.627495 0.628987 0.631467 0.634921 0.639336 0.64469 0.650961 0.658122 0.666146 0.675 0.684653 0.695072 0.706222 0.71807 0.730582 0.743724 0.757463 0.771767 0.786607 0.637377 0.637868 0.639336 0.641775 0.645174 0.649519 0.65479 0.660965 0.668019 0.675925 0.684653 0.694172 0.70445 0.715454 0.727152 0.73951 0.752496 0.766078 0.780224 0.794906 0.648556 0.649038 0.650481 0.652878 0.65622 0.660492 0.665676 0.671751 0.678694 0.686477 0.695072 0.70445 0.71458 0.725431 0.73697 0.749166 0.761988 0.775403 0.789383 0.803897 0.660492 0.660965 0.662382 0.664737 0.668019 0.672216 0.677311 0.683283 0.690109 0.697764 0.706222 0.715454 0.725431 0.736122 0.747496 0.759523 0.772172 0.785414 0.799218 0.813557 0.673146 0.67361 0.675 0.677311 0.680533 0.684653 0.689656 0.695521 0.702229 0.709753 0.71807 0.727152 0.73697 0.747496 0.7587 0.770552 0.783023 0.796084 0.809707 0.823863 0.686477 0.686932 0.688295 0.690561 0.693722 0.697764 0.702673 0.708431 0.715017 0.722409 0.730582 0.73951 0.749166 0.759523 0.770552 0.782224 0.794512 0.807388 0.820823 0.83479 0.700446 0.700892 0.702229 0.70445 0.707549 0.711512 0.716327 0.721976 0.72844 0.735697 0.743724 0.752496 0.761988 0.772172 0.783023 0.794512 0.806613 0.819298 0.832541 0.846316 0.715017 0.715454 0.716764 0.71894 0.721976 0.725862 0.730582 0.736122 0.742462 0.749583 0.757463 0.766078 0.775403 0.785414 0.796084 0.807388 0.819298 0.83179 0.844837 0.858414 0.730154 0.730582 0.731864 0.733996 0.73697 0.740777 0.745403 0.750833 0.75705 0.764035 0.771767 0.780224 0.789383 0.799218 0.809707 0.820823 0.832541 0.844837 0.857686 0.871063 0.745822 0.746241 0.747496 0.749583 0.752496 0.756224 0.760756 0.766078 0.772172 0.779022 0.786607 0.794906 0.803897 0.813557 0.823863 0.83479 0.846316 0.858414 0.871063 0.884237 0.761988 0.762398 0.763626 0.76567 0.768521 0.772172 0.776611 0.781825 0.787798 0.794512 0.801951 0.810093 0.818917 0.828402 0.838525 0.849264 0.860596 0.872496 0.884944 0.897914 0.778621 0.779022 0.780224 0.782224 0.785016 0.788591 0.792938 0.798044 0.803897 0.810478 0.817771 0.825757 0.834416 0.843727 0.853669 0.864219 0.875357 0.88706 0.899305 0.912072 0.795692 0.796084 0.797261 0.799218 0.801951 0.80545 0.809707 0.814709 0.820442 0.826892 0.834041 0.841873 0.850368 0.859506 0.869267 0.879631 0.890576 0.902081 0.914125 0.926688 0.813173 0.813557 0.814709 0.816624 0.819298 0.822724 0.826892 0.83179 0.837407 0.843727 0.850735 0.858414 0.866747 0.875714 0.885297 0.895475 0.906228 0.917537 0.929382 0.94174 0.831039 0.831414 0.832541 0.834416 0.837033 0.840387 0.844467 0.849264 0.854766 0.860959 0.867828 0.875357 0.88353 0.892328 0.901734 0.911729 0.922293 0.933408 0.945053 0.957209 0.849264 0.849632 0.850735 0.85257 0.855132 0.858414 0.862409 0.867107 0.872496 0.878564 0.885297 0.892679 0.900694 0.909327 0.918559 0.928372 0.938749 0.949671 0.961119 0.973075 0.867828 0.868188 0.869267 0.871063 0.87357 0.876784 0.880696 0.885297 0.890576 0.896521 0.90312 0.910357 0.918218 0.926688 0.935748 0.945384 0.955576 0.966307 0.977561 0.989318 0.886707 0.88706 0.888116 0.889874 0.892328 0.895475 0.899305 0.903811 0.908983 0.914809 0.921276 0.928372 0.936082 0.944391 0.953284 0.962743 0.972754 0.983298 0.994359 1.00592 0.905884 0.906228 0.907262 0.908983 0.911386 0.914467 0.918218 0.922632 0.927699 0.933408 0.939747 0.946705 0.954267 0.962419 0.971146 0.980434 0.990265 1.00062 1.0115 1.02286 0.925338 0.925675 0.926688 0.928372 0.930726 0.933742 0.937417 0.94174 0.946705 0.9523 0.958514 0.965337 0.972754 0.980752 0.989318 0.998436 1.00809 1.01827 1.02896 1.04013 0.6 0.600521 0.60208 0.604669 0.608276 0.612883 0.618466 0.625 0.632456 0.6408 0.65 0.660019 0.67082 0.682367 0.694622 0.707549 0.72111 0.735272 0.75 0.765261 0.600521 0.601041 0.602599 0.605186 0.60879 0.613392 0.618971 0.6255 0.632949 0.641288 0.650481 0.660492 0.671286 0.682825 0.695072 0.70799 0.721543 0.735697 0.750417 0.76567 0.60208 0.602599 0.604152 0.606733 0.610328 0.614919 0.620484 0.626997 0.634429 0.642748 0.65192 0.66191 0.672681 0.684197 0.696419 0.709313 0.722842 0.73697 0.751665 0.766893 0.604669 0.605186 0.606733 0.609303 0.612883 0.617454 0.622997 0.629484 0.636887 0.645174 0.654313 0.664267 0.675 0.686477 0.698659 0.711512 0.725 0.739087 0.753741 0.768928 0.608276 0.60879 0.610328 0.612883 0.616441 0.620987 0.626498 0.632949 0.640312 0.648556 0.657647 0.667551 0.678233 0.689656 0.701783 0.71458 0.728011 0.742041 0.756637 0.771767 0.612883 0.613392 0.614919 0.617454 0.620987 0.6255 0.630971 0.637377 0.64469 0.652878 0.66191 0.671751 0.682367 0.693722 0.70578 0.718505 0.731864 0.745822 0.760345 0.775403 0.618466 0.618971 0.620484 0.622997 0.626498 0.630971 0.636396 0.642748 0.65 0.658122 0.667083 0.676849 0.687386 0.698659 0.710634 0.723274 0.736546 0.750417 0.764853 0.779824 0.625 0.6255 0.626997 0.629484 0.632949 0.637377 0.642748 0.649038 0.65622 0.664267 0.673146 0.682825 0.693271 0.70445 0.716327 0.728869 0.742041 0.755811 0.770146 0.785016 0.632456 0.632949 0.634429 0.636887 0.640312 0.64469 0.65 0.65622 0.663325 0.671286 0.680074 0.689656 0.7 0.711073 0.722842 0.735272 0.748331 0.761988 0.776209 0.790965 0.6408 0.641288 0.642748 0.645174 0.648556 0.652878 0.658122 0.664267 0.671286 0.679154 0.687841 0.697316 0.707549 0.718505 0.730154 0.742462 0.755397 0.768928 0.783023 0.797653 0.65 0.650481 0.65192 0.654313 0.657647 0.66191 0.667083 0.673146 0.680074 0.687841 0.696419 0.70578 0.715891 0.726722 0.738241 0.750417 0.763217 0.776611 0.790569 0.805062 0.660019 0.660492 0.66191 0.664267 0.667551 0.671751 0.676849 0.682825 0.689656 0.697316 0.70578 0.715017 0.725 0.735697 0.747078 0.759111 0.771767 0.785016 0.798827 0.813173 0.67082 0.671286 0.672681 0.675 0.678233 0.682367 0.687386 0.693271 0.7 0.707549 0.715891 0.725 0.734847 0.745403 0.756637 0.768521 0.781025 0.794119 0.807775 0.821964 0.682367 0.682825 0.684197 0.686477 0.689656 0.693722 0.698659 0.70445 0.711073 0.718505 0.726722 0.735697 0.745403 0.755811 0.766893 0.778621 0.790965 0.803897 0.817389 0.831414 0.694622 0.695072 0.696419 0.698659 0.701783 0.70578 0.710634 0.716327 0.722842 0.730154 0.738241 0.747078 0.756637 0.766893 0.777817 0.789383 0.801561 0.814325 0.827647 0.841502 0.707549 0.70799 0.709313 0.711512 0.71458 0.718505 0.723274 0.728869 0.735272 0.742462 0.750417 0.759111 0.768521 0.778621 0.789383 0.800781 0.812788 0.825379 0.838525 0.852203 0.72111 0.721543 0.722842 0.725 0.728011 0.731864 0.736546 0.742041 0.748331 0.755397 0.763217 0.771767 0.781025 0.790965 0.801561 0.812788 0.824621 0.837033 0.85 0.863496 0.735272 0.735697 0.73697 0.739087 0.742041 0.745822 0.750417 0.755811 0.761988 0.768928 0.776611 0.785016 0.794119 0.803897 0.814325 0.825379 0.837033 0.849264 0.862047 0.875357 0.75 0.750417 0.751665 0.753741 0.756637 0.760345 0.764853 0.770146 0.776209 0.783023 0.790569 0.798827 0.807775 0.817389 0.827647 0.838525 0.85 0.862047 0.874643 0.887764 0.765261 0.76567 0.766893 0.768928 0.771767 0.775403 0.779824 0.785016 0.790965 0.797653 0.805062 0.813173 0.821964 0.831414 0.841502 0.852203 0.863496 0.875357 0.887764 0.900694 0.781025 0.781425 0.782624 0.784618 0.787401 0.790965 0.795299 0.800391 0.806226 0.812788 0.820061 0.828025 0.83666 0.845946 0.855862 0.866386 0.877496 0.889171 0.901388 0.914125 0.797261 0.797653 0.798827 0.800781 0.803508 0.807001 0.811249 0.816241 0.821964 0.828402 0.835539 0.843356 0.851836 0.860959 0.870704 0.881051 0.891978 0.903466 0.915492 0.928036 0.813941 0.814325 0.815475 0.817389 0.820061 0.823483 0.827647 0.832541 0.838153 0.844467 0.851469 0.859142 0.867468 0.876427 0.886002 0.896172 0.906918 0.918218 0.930054 0.942404 0.831039 0.831414 0.832541 0.834416 0.837033 0.840387 0.844467 0.849264 0.854766 0.860959 0.867828 0.875357 0.88353 0.892328 0.901734 0.911729 0.922293 0.933408 0.945053 0.957209 0.848528 0.848896 0.85 0.851836 0.8544 0.857686 0.861684 0.866386 0.87178 0.877852 0.88459 0.891978 0.9 0.908639 0.917878 0.927699 0.938083 0.949013 0.960469 0.972433 0.866386 0.866747 0.867828 0.869626 0.872138 0.875357 0.879275 0.883883 0.889171 0.895126 0.901734 0.908983 0.916856 0.925338 0.934412 0.94406 0.954267 0.965013 0.976281 0.988054 0.88459 0.884944 0.886002 0.887764 0.890225 0.893378 0.897218 0.901734 0.906918 0.912757 0.919239 0.92635 0.934077 0.942404 0.951315 0.960794 0.970824 0.981389 0.992472 1.00405 0.90312 0.903466 0.904503 0.906228 0.908639 0.911729 0.915492 0.919918 0.925 0.930726 0.937083 0.94406 0.951643 0.959818 0.968569 0.97788 0.987737 0.998123 1.00902 1.02042 0.921954 0.922293 0.923309 0.925 0.927362 0.93039 0.934077 0.938416 0.943398 0.949013 0.955249 0.962094 0.969536 0.977561 0.986154 0.995301 1.00499 1.0152 1.02591 1.03712 0.941077 0.941409 0.942404 0.94406 0.946375 0.949342 0.952956 0.957209 0.962094 0.9676 0.973717 0.980434 0.987737 0.995615 1.00405 1.01304 1.02256 1.03259 1.04313 1.05416 0.625 0.6255 0.626997 0.629484 0.632949 0.637377 0.642748 0.649038 0.65622 0.664267 0.673146 0.682825 0.693271 0.70445 0.716327 0.728869 0.742041 0.755811 0.770146 0.785016 0.6255 0.625999 0.627495 0.62998 0.633443 0.637868 0.643234 0.649519 0.656696 0.664737 0.67361 0.683283 0.693722 0.704894 0.716764 0.729298 0.742462 0.756224 0.770552 0.785414 0.626997 0.627495 0.628987 0.631467 0.634921 0.639336 0.64469 0.650961 0.658122 0.666146 0.675 0.684653 0.695072 0.706222 0.71807 0.730582 0.743724 0.757463 0.771767 0.786607 0.629484 0.62998 0.631467 0.633936 0.637377 0.641775 0.647109 0.653357 0.660492 0.668487 0.677311 0.686932 0.697316 0.708431 0.720243 0.732718 0.745822 0.759523 0.773789 0.788591 0.632949 0.633443 0.634921 0.637377 0.6408 0.645174 0.650481 0.656696 0.663796 0.671751 0.680533 0.690109 0.700446 0.711512 0.723274 0.735697 0.748749 0.762398 0.776611 0.79136 0.637377 0.637868 0.639336 0.641775 0.645174 0.649519 0.65479 0.660965 0.668019 0.675925 0.684653 0.694172 0.70445 0.715454 0.727152 0.73951 0.752496 0.766078 0.780224 0.794906 0.642748 0.643234 0.64469 0.647109 0.650481 0.65479 0.660019 0.666146 0.673146 0.680992 0.689656 0.699107 0.709313 0.720243 0.731864 0.744144 0.75705 0.770552 0.784618 0.799218 0.649038 0.649519 0.650961 0.653357 0.656696 0.660965 0.666146 0.672216 0.679154 0.686932 0.695521 0.704894 0.715017 0.725862 0.737394 0.749583 0.762398 0.775806 0.789778 0.804285 0.65622 0.656696 0.658122 0.660492 0.663796 0.668019 0.673146 0.679154 0.686021 0.693722 0.702229 0.711512 0.721543 0.732291 0.743724 0.755811 0.768521 0.781825 0.795692 0.810093 0.664267 0.664737 0.666146 0.668487 0.671751 0.675925 0.680992 0.686932 0.693722 0.701338 0.709753 0.71894 0.728869 0.73951 0.750833 0.762807 0.775403 0.788591 0.80234 0.816624 0.673146 0.67361 0.675 0.677311 0.680533 0.684653 0.689656 0.695521 0.702229 0.709753 0.71807 0.727152 0.73697 0.747496 0.7587 0.770552 0.783023 0.796084 0.809707 0.823863 0.682825 0.683283 0.684653 0.686932 0.690109 0.694172 0.699107 0.704894 0.711512 0.71894 0.727152 0.736122 0.745822 0.756224 0.7673 0.779022 0.79136 0.804285 0.817771 0.83179 0.693271 0.693722 0.695072 0.697316 0.700446 0.70445 0.709313 0.715017 0.721543 0.728869 0.73697 0.745822 0.755397 0.76567 0.776611 0.788194 0.800391 0.813173 0.826514 0.840387 0.70445 0.704894 0.706222 0.708431 0.711512 0.715454 0.720243 0.725862 0.732291 0.73951 0.747496 0.756224 0.76567 0.775806 0.786607 0.798044 0.810093 0.822724 0.835913 0.849632 0.716327 0.716764 0.71807 0.720243 0.723274 0.727152 0.731864 0.737394 0.743724 0.750833 0.7587 0.7673 0.776611 0.786607 0.797261 0.808548 0.820442 0.832917 0.845946 0.859506 0.728869 0.729298 0.730582 0.732718 0.735697 0.73951 0.744144 0.749583 0.755811 0.762807 0.770552 0.779022 0.788194 0.798044 0.808548 0.81968 0.831414 0.843727 0.856592 0.869986 0.742041 0.742462 0.743724 0.745822 0.748749 0.752496 0.75705 0.762398 0.768521 0.775403 0.783023 0.79136 0.800391 0.810093 0.820442 0.831414 0.842986 0.855132 0.867828 0.881051 0.755811 0.756224 0.757463 0.759523 0.762398 0.766078 0.770552 0.775806 0.781825 0.788591 0.796084 0.804285 0.813173 0.822724 0.832917 0.843727 0.855132 0.867107 0.879631 0.892679 0.770146 0.770552 0.771767 0.773789 0.776611 0.780224 0.784618 0.789778 0.795692 0.80234 0.809707 0.817771 0.826514 0.835913 0.845946 0.856592 0.867828 0.879631 0.891978 0.904848 0.785016 0.785414 0.786607 0.788591 0.79136 0.794906 0.799218 0.804285 0.810093 0.816624 0.823863 0.83179 0.840387 0.849632 0.859506 0.869986 0.881051 0.892679 0.904848 0.917537 0.800391 0.800781 0.801951 0.803897 0.806613 0.810093 0.814325 0.819298 0.825 0.831414 0.838525 0.846316 0.854766 0.863858 0.87357 0.883883 0.894777 0.906228 0.918218 0.930726 0.816241 0.816624 0.817771 0.81968 0.822344 0.825757 0.82991 0.83479 0.840387 0.846685 0.853669 0.861322 0.869626 0.878564 0.888116 0.898262 0.908983 0.920258 0.932068 0.944391 0.832541 0.832917 0.834041 0.835913 0.838525 0.841873 0.845946 0.850735 0.856227 0.862409 0.869267 0.876784 0.884944 0.893728 0.90312 0.913099 0.923648 0.934746 0.946375 0.958514 0.849264 0.849632 0.850735 0.85257 0.855132 0.858414 0.862409 0.867107 0.872496 0.878564 0.885297 0.892679 0.900694 0.909327 0.918559 0.928372 0.938749 0.949671 0.961119 0.973075 0.866386 0.866747 0.867828 0.869626 0.872138 0.875357 0.879275 0.883883 0.889171 0.895126 0.901734 0.908983 0.916856 0.925338 0.934412 0.94406 0.954267 0.965013 0.976281 0.988054 0.883883 0.884237 0.885297 0.88706 0.889522 0.892679 0.896521 0.901041 0.906228 0.912072 0.918559 0.925675 0.933408 0.94174 0.950658 0.960143 0.97018 0.980752 0.991842 1.00343 0.901734 0.902081 0.90312 0.904848 0.907262 0.910357 0.914125 0.918559 0.923648 0.929382 0.935748 0.942735 0.950329 0.958514 0.967277 0.976601 0.986471 0.99687 1.00778 1.01919 0.919918 0.920258 0.921276 0.922971 0.925338 0.928372 0.932068 0.936416 0.941409 0.947035 0.953284 0.960143 0.9676 0.975641 0.984251 0.993416 1.00312 1.01335 1.02408 1.03531 0.938416 0.938749 0.939747 0.941409 0.943729 0.946705 0.950329 0.954594 0.959492 0.965013 0.971146 0.97788 0.985203 0.993101 1.00156 1.01057 1.02011 1.03017 1.04073 1.05178 0.957209 0.957536 0.958514 0.960143 0.962419 0.965337 0.968891 0.973075 0.97788 0.983298 0.989318 0.995929 1.00312 1.01088 1.01919 1.02804 1.03742 1.04732 1.05771 1.06859 0.65 0.650481 0.65192 0.654313 0.657647 0.66191 0.667083 0.673146 0.680074 0.687841 0.696419 0.70578 0.715891 0.726722 0.738241 0.750417 0.763217 0.776611 0.790569 0.805062 0.650481 0.650961 0.652399 0.65479 0.658122 0.662382 0.667551 0.67361 0.680533 0.688295 0.696868 0.706222 0.716327 0.727152 0.738664 0.750833 0.763626 0.777014 0.790965 0.80545 0.65192 0.652399 0.653835 0.65622 0.659545 0.663796 0.668954 0.675 0.681909 0.689656 0.698212 0.707549 0.717635 0.72844 0.739932 0.75208 0.764853 0.778219 0.792149 0.806613 0.654313 0.65479 0.65622 0.658597 0.66191 0.666146 0.671286 0.677311 0.684197 0.691918 0.700446 0.709753 0.719809 0.730582 0.742041 0.754155 0.766893 0.780224 0.794119 0.808548 0.657647 0.658122 0.659545 0.66191 0.665207 0.669421 0.674537 0.680533 0.687386 0.695072 0.703562 0.712829 0.722842 0.73357 0.744983 0.75705 0.76974 0.783023 0.796869 0.811249 0.66191 0.662382 0.663796 0.666146 0.669421 0.67361 0.678694 0.684653 0.691466 0.699107 0.707549 0.716764 0.726722 0.737394 0.748749 0.760756 0.773385 0.786607 0.800391 0.814709 0.667083 0.667551 0.668954 0.671286 0.674537 0.678694 0.68374 0.689656 0.696419 0.704006 0.71239 0.721543 0.731437 0.742041 0.753326 0.765261 0.777817 0.790965 0.804674 0.818917 0.673146 0.67361 0.675 0.677311 0.680533 0.684653 0.689656 0.695521 0.702229 0.709753 0.71807 0.727152 0.73697 0.747496 0.7587 0.770552 0.783023 0.796084 0.809707 0.823863 0.680074 0.680533 0.681909 0.684197 0.687386 0.691466 0.696419 0.702229 0.708872 0.716327 0.724569 0.73357 0.743303 0.753741 0.764853 0.776611 0.788987 0.801951 0.815475 0.829533 0.687841 0.688295 0.689656 0.691918 0.695072 0.699107 0.704006 0.709753 0.716327 0.723706 0.731864 0.740777 0.750417 0.760756 0.771767 0.783422 0.795692 0.808548 0.821964 0.835913 0.696419 0.696868 0.698212 0.700446 0.703562 0.707549 0.71239 0.71807 0.724569 0.731864 0.739932 0.748749 0.758288 0.768521 0.779423 0.790965 0.803119 0.815858 0.829156 0.842986 0.70578 0.706222 0.707549 0.709753 0.712829 0.716764 0.721543 0.727152 0.73357 0.740777 0.748749 0.757463 0.766893 0.777014 0.787798 0.799218 0.811249 0.823863 0.837033 0.850735 0.715891 0.716327 0.717635 0.719809 0.722842 0.726722 0.731437 0.73697 0.743303 0.750417 0.758288 0.766893 0.776209 0.786209 0.796869 0.808161 0.820061 0.832541 0.845577 0.859142 0.726722 0.727152 0.72844 0.730582 0.73357 0.737394 0.742041 0.747496 0.753741 0.760756 0.768521 0.777014 0.786209 0.796084 0.806613 0.817771 0.829533 0.841873 0.854766 0.868188 0.738241 0.738664 0.739932 0.742041 0.744983 0.748749 0.753326 0.7587 0.764853 0.771767 0.779423 0.787798 0.796869 0.806613 0.817007 0.828025 0.839643 0.851836 0.864581 0.877852 0.750417 0.750833 0.75208 0.754155 0.75705 0.760756 0.765261 0.770552 0.776611 0.783422 0.790965 0.799218 0.808161 0.817771 0.828025 0.838898 0.850368 0.862409 0.875 0.888116 0.763217 0.763626 0.764853 0.766893 0.76974 0.773385 0.777817 0.783023 0.788987 0.795692 0.803119 0.811249 0.820061 0.829533 0.839643 0.850368 0.861684 0.87357 0.886002 0.898958 0.776611 0.777014 0.778219 0.780224 0.783023 0.786607 0.790965 0.796084 0.801951 0.808548 0.815858 0.823863 0.832541 0.841873 0.851836 0.862409 0.87357 0.885297 0.897566 0.910357 0.790569 0.790965 0.792149 0.794119 0.796869 0.800391 0.804674 0.809707 0.815475 0.821964 0.829156 0.837033 0.845577 0.854766 0.864581 0.875 0.886002 0.897566 0.90967 0.922293 0.805062 0.80545 0.806613 0.808548 0.811249 0.814709 0.818917 0.823863 0.829533 0.835913 0.842986 0.850735 0.859142 0.868188 0.877852 0.888116 0.898958 0.910357 0.922293 0.934746 0.820061 0.820442 0.821584 0.823483 0.826136 0.829533 0.833667 0.838525 0.844097 0.850368 0.857321 0.864942 0.873212 0.882114 0.891628 0.901734 0.912414 0.923648 0.935414 0.947695 0.835539 0.835913 0.837033 0.838898 0.841502 0.844837 0.848896 0.853669 0.859142 0.865303 0.872138 0.879631 0.887764 0.896521 0.905884 0.915833 0.92635 0.937417 0.949013 0.961119 0.851469 0.851836 0.852936 0.854766 0.857321 0.860596 0.864581 0.869267 0.874643 0.880696 0.887412 0.894777 0.902774 0.911386 0.920598 0.93039 0.940744 0.951643 0.963068 0.975 0.867828 0.868188 0.869267 0.871063 0.87357 0.876784 0.880696 0.885297 0.890576 0.896521 0.90312 0.910357 0.918218 0.926688 0.935748 0.945384 0.955576 0.966307 0.977561 0.989318 0.88459 0.884944 0.886002 0.887764 0.890225 0.893378 0.897218 0.901734 0.906918 0.912757 0.919239 0.92635 0.934077 0.942404 0.951315 0.960794 0.970824 0.981389 0.992472 1.00405 0.901734 0.902081 0.90312 0.904848 0.907262 0.910357 0.914125 0.918559 0.923648 0.929382 0.935748 0.942735 0.950329 0.958514 0.967277 0.976601 0.986471 0.99687 1.00778 1.01919 0.919239 0.919579 0.920598 0.922293 0.924662 0.927699 0.931397 0.935748 0.940744 0.946375 0.952628 0.959492 0.966954 0.975 0.983616 0.992786 1.0025 1.01273 1.02347 1.03471 0.937083 0.937417 0.938416 0.94008 0.942404 0.945384 0.949013 0.953284 0.958188 0.963717 0.969858 0.976601 0.983933 0.991842 1.00031 1.00933 1.01888 1.02896 1.03953 1.0506 0.955249 0.955576 0.956556 0.958188 0.960469 0.963392 0.966954 0.971146 0.975961 0.981389 0.987421 0.994045 1.00125 1.00902 1.01735 1.02622 1.03562 1.04553 1.05594 1.06683 0.973717 0.974038 0.975 0.976601 0.978839 0.981708 0.985203 0.989318 0.994045 0.999375 1.0053 1.01181 1.01888 1.02652 1.03471 1.04343 1.05268 1.06243 1.07267 1.0834 0.675 0.675463 0.676849 0.679154 0.682367 0.686477 0.691466 0.697316 0.704006 0.711512 0.719809 0.728869 0.738664 0.749166 0.760345 0.772172 0.784618 0.797653 0.811249 0.825379 0.675463 0.675925 0.677311 0.679614 0.682825 0.686932 0.691918 0.697764 0.70445 0.711952 0.720243 0.729298 0.739087 0.749583 0.760756 0.772577 0.785016 0.798044 0.811634 0.825757 0.676849 0.677311 0.678694 0.680992 0.684197 0.688295 0.693271 0.699107 0.70578 0.713267 0.721543 0.730582 0.740355 0.750833 0.761988 0.773789 0.786209 0.799218 0.812788 0.826892 0.679154 0.679614 0.680992 0.683283 0.686477 0.690561 0.695521 0.701338 0.70799 0.715454 0.723706 0.732718 0.742462 0.752911 0.764035 0.775806 0.788194 0.801171 0.814709 0.828779 0.682367 0.682825 0.684197 0.686477 0.689656 0.693722 0.698659 0.70445 0.711073 0.718505 0.726722 0.735697 0.745403 0.755811 0.766893 0.778621 0.790965 0.803897 0.817389 0.831414 0.686477 0.686932 0.688295 0.690561 0.693722 0.697764 0.702673 0.708431 0.715017 0.722409 0.730582 0.73951 0.749166 0.759523 0.770552 0.782224 0.794512 0.807388 0.820823 0.83479 0.691466 0.691918 0.693271 0.695521 0.698659 0.702673 0.707549 0.713267 0.719809 0.727152 0.735272 0.744144 0.753741 0.764035 0.775 0.786607 0.798827 0.811634 0.825 0.838898 0.697316 0.697764 0.699107 0.701338 0.70445 0.708431 0.713267 0.71894 0.725431 0.732718 0.740777 0.749583 0.759111 0.769334 0.780224 0.791754 0.803897 0.816624 0.82991 0.843727 0.704006 0.70445 0.70578 0.70799 0.711073 0.715017 0.719809 0.725431 0.731864 0.739087 0.747078 0.755811 0.765261 0.775403 0.786209 0.797653 0.809707 0.822344 0.835539 0.849264 0.711512 0.711952 0.713267 0.715454 0.718505 0.722409 0.727152 0.732718 0.739087 0.746241 0.754155 0.762807 0.772172 0.782224 0.792938 0.804285 0.816241 0.828779 0.841873 0.855497 0.719809 0.720243 0.721543 0.723706 0.726722 0.730582 0.735272 0.740777 0.747078 0.754155 0.761988 0.770552 0.779824 0.789778 0.800391 0.811634 0.823483 0.835913 0.848896 0.862409 0.728869 0.729298 0.730582 0.732718 0.735697 0.73951 0.744144 0.749583 0.755811 0.762807 0.770552 0.779022 0.788194 0.798044 0.808548 0.81968 0.831414 0.843727 0.856592 0.869986 0.738664 0.739087 0.740355 0.742462 0.745403 0.749166 0.753741 0.759111 0.765261 0.772172 0.779824 0.788194 0.797261 0.807001 0.817389 0.828402 0.840015 0.852203 0.864942 0.878208 0.749166 0.749583 0.750833 0.752911 0.755811 0.759523 0.764035 0.769334 0.775403 0.782224 0.789778 0.798044 0.807001 0.816624 0.826892 0.83778 0.849264 0.861322 0.873928 0.88706 0.760345 0.760756 0.761988 0.764035 0.766893 0.770552 0.775 0.780224 0.786209 0.792938 0.800391 0.808548 0.817389 0.826892 0.837033 0.847791 0.859142 0.871063 0.88353 0.896521 0.772172 0.772577 0.773789 0.775806 0.778621 0.782224 0.786607 0.791754 0.797653 0.804285 0.811634 0.81968 0.828402 0.83778 0.847791 0.858414 0.869626 0.881405 0.893728 0.906573 0.784618 0.785016 0.786209 0.788194 0.790965 0.794512 0.798827 0.803897 0.809707 0.816241 0.823483 0.831414 0.840015 0.849264 0.859142 0.869626 0.880696 0.892328 0.904503 0.917197 0.797653 0.798044 0.799218 0.801171 0.803897 0.807388 0.811634 0.816624 0.822344 0.828779 0.835913 0.843727 0.852203 0.861322 0.871063 0.881405 0.892328 0.903811 0.915833 0.928372 0.811249 0.811634 0.812788 0.814709 0.817389 0.820823 0.825 0.82991 0.835539 0.841873 0.848896 0.856592 0.864942 0.873928 0.88353 0.893728 0.904503 0.915833 0.927699 0.94008 0.825379 0.825757 0.826892 0.828779 0.831414 0.83479 0.838898 0.843727 0.849264 0.855497 0.862409 0.869986 0.878208 0.88706 0.896521 0.906573 0.917197 0.928372 0.94008 0.9523 0.840015 0.840387 0.841502 0.843356 0.845946 0.849264 0.853302 0.85805 0.863496 0.869626 0.876427 0.883883 0.891978 0.900694 0.910014 0.919918 0.93039 0.941409 0.952956 0.965013 0.855132 0.855497 0.856592 0.858414 0.860959 0.864219 0.868188 0.872855 0.878208 0.884237 0.890926 0.898262 0.906228 0.914809 0.923986 0.933742 0.94406 0.954921 0.966307 0.9782 0.870704 0.871063 0.872138 0.873928 0.876427 0.879631 0.88353 0.888116 0.893378 0.899305 0.905884 0.913099 0.920937 0.929382 0.938416 0.948024 0.958188 0.968891 0.980115 0.991842 0.886707 0.88706 0.888116 0.889874 0.892328 0.895475 0.899305 0.903811 0.908983 0.914809 0.921276 0.928372 0.936082 0.944391 0.953284 0.962743 0.972754 0.983298 0.994359 1.00592 0.90312 0.903466 0.904503 0.906228 0.908639 0.911729 0.915492 0.919918 0.925 0.930726 0.937083 0.94406 0.951643 0.959818 0.968569 0.97788 0.987737 0.998123 1.00902 1.02042 0.919918 0.920258 0.921276 0.922971 0.925338 0.928372 0.932068 0.936416 0.941409 0.947035 0.953284 0.960143 0.9676 0.975641 0.984251 0.993416 1.00312 1.01335 1.02408 1.03531 0.937083 0.937417 0.938416 0.94008 0.942404 0.945384 0.949013 0.953284 0.958188 0.963717 0.969858 0.976601 0.983933 0.991842 1.00031 1.00933 1.01888 1.02896 1.03953 1.0506 0.954594 0.954921 0.955903 0.957536 0.959818 0.962743 0.966307 0.970502 0.97532 0.980752 0.986788 0.993416 1.00062 1.0084 1.01673 1.02561 1.03501 1.04493 1.05534 1.06624 0.972433 0.972754 0.973717 0.97532 0.977561 0.980434 0.983933 0.988054 0.992786 0.998123 1.00405 1.01057 1.01766 1.0253 1.0335 1.04223 1.05149 1.06125 1.07151 1.08224 0.990581 0.990896 0.991842 0.993416 0.995615 0.998436 1.00187 1.00592 1.01057 1.01581 1.02164 1.02804 1.03501 1.04253 1.0506 1.05919 1.06829 1.0779 1.088 1.09858 0.7 0.700446 0.701783 0.704006 0.707107 0.711073 0.715891 0.721543 0.728011 0.735272 0.743303 0.75208 0.761577 0.771767 0.782624 0.794119 0.806226 0.818917 0.832166 0.845946 0.700446 0.700892 0.702229 0.70445 0.707549 0.711512 0.716327 0.721976 0.72844 0.735697 0.743724 0.752496 0.761988 0.772172 0.783023 0.794512 0.806613 0.819298 0.832541 0.846316 0.701783 0.702229 0.703562 0.70578 0.708872 0.712829 0.717635 0.723274 0.729726 0.73697 0.744983 0.753741 0.763217 0.773385 0.784219 0.795692 0.807775 0.820442 0.833667 0.847423 0.704006 0.70445 0.70578 0.70799 0.711073 0.715017 0.719809 0.725431 0.731864 0.739087 0.747078 0.755811 0.765261 0.775403 0.786209 0.797653 0.809707 0.822344 0.835539 0.849264 0.707107 0.707549 0.708872 0.711073 0.714143 0.71807 0.722842 0.72844 0.734847 0.742041 0.75 0.7587 0.768115 0.778219 0.788987 0.800391 0.812404 0.825 0.838153 0.851836 0.711073 0.711512 0.712829 0.715017 0.71807 0.721976 0.726722 0.732291 0.738664 0.745822 0.753741 0.762398 0.771767 0.781825 0.792543 0.803897 0.815858 0.828402 0.841502 0.855132 0.715891 0.716327 0.717635 0.719809 0.722842 0.726722 0.731437 0.73697 0.743303 0.750417 0.758288 0.766893 0.776209 0.786209 0.796869 0.808161 0.820061 0.832541 0.845577 0.859142 0.721543 0.721976 0.723274 0.725431 0.72844 0.732291 0.73697 0.742462 0.748749 0.755811 0.763626 0.772172 0.781425 0.79136 0.801951 0.813173 0.825 0.837407 0.850368 0.863858 0.728011 0.72844 0.729726 0.731864 0.734847 0.738664 0.743303 0.748749 0.754983 0.761988 0.76974 0.778219 0.787401 0.797261 0.807775 0.818917 0.830662 0.842986 0.855862 0.869267 0.735272 0.735697 0.73697 0.739087 0.742041 0.745822 0.750417 0.755811 0.761988 0.768928 0.776611 0.785016 0.794119 0.803897 0.814325 0.825379 0.837033 0.849264 0.862047 0.875357 0.743303 0.743724 0.744983 0.747078 0.75 0.753741 0.758288 0.763626 0.76974 0.776611 0.784219 0.792543 0.801561 0.811249 0.821584 0.832541 0.844097 0.856227 0.868907 0.882114 0.75208 0.752496 0.753741 0.755811 0.7587 0.762398 0.766893 0.772172 0.778219 0.785016 0.792543 0.800781 0.809707 0.819298 0.829533 0.840387 0.851836 0.863858 0.876427 0.889522 0.761577 0.761988 0.763217 0.765261 0.768115 0.771767 0.776209 0.781425 0.787401 0.794119 0.801561 0.809707 0.818535 0.828025 0.838153 0.848896 0.860233 0.872138 0.88459 0.897566 0.771767 0.772172 0.773385 0.775403 0.778219 0.781825 0.786209 0.79136 0.797261 0.803897 0.811249 0.819298 0.828025 0.837407 0.847423 0.85805 0.869267 0.881051 0.893378 0.906228 0.782624 0.783023 0.784219 0.786209 0.788987 0.792543 0.796869 0.801951 0.807775 0.814325 0.821584 0.829533 0.838153 0.847423 0.857321 0.867828 0.87892 0.890576 0.902774 0.915492 0.794119 0.794512 0.795692 0.797653 0.800391 0.803897 0.808161 0.813173 0.818917 0.825379 0.832541 0.840387 0.848896 0.85805 0.867828 0.878208 0.889171 0.900694 0.912757 0.925338 0.806226 0.806613 0.807775 0.809707 0.812404 0.815858 0.820061 0.825 0.830662 0.837033 0.844097 0.851836 0.860233 0.869267 0.87892 0.889171 0.9 0.911386 0.923309 0.935748 0.818917 0.819298 0.820442 0.822344 0.825 0.828402 0.832541 0.837407 0.842986 0.849264 0.856227 0.863858 0.872138 0.881051 0.890576 0.900694 0.911386 0.922632 0.934412 0.946705 0.832166 0.832541 0.833667 0.835539 0.838153 0.841502 0.845577 0.850368 0.855862 0.862047 0.868907 0.876427 0.88459 0.893378 0.902774 0.912757 0.923309 0.934412 0.946044 0.958188 0.845946 0.846316 0.847423 0.849264 0.851836 0.855132 0.859142 0.863858 0.869267 0.875357 0.882114 0.889522 0.897566 0.906228 0.915492 0.925338 0.935748 0.946705 0.958188 0.97018 0.860233 0.860596 0.861684 0.863496 0.866025 0.869267 0.873212 0.877852 0.883176 0.889171 0.895824 0.90312 0.911043 0.919579 0.928709 0.938416 0.948683 0.959492 0.970824 0.982662 0.875 0.875357 0.876427 0.878208 0.880696 0.883883 0.887764 0.892328 0.897566 0.903466 0.910014 0.917197 0.925 0.933408 0.942404 0.951972 0.962094 0.972754 0.983933 0.995615 0.890225 0.890576 0.891628 0.893378 0.895824 0.898958 0.902774 0.907262 0.912414 0.918218 0.924662 0.931732 0.939415 0.947695 0.956556 0.965984 0.975961 0.986471 0.997497 1.00902 0.905884 0.906228 0.907262 0.908983 0.911386 0.914467 0.918218 0.922632 0.927699 0.933408 0.939747 0.946705 0.954267 0.962419 0.971146 0.980434 0.990265 1.00062 1.0115 1.02286 0.921954 0.922293 0.923309 0.925 0.927362 0.93039 0.934077 0.938416 0.943398 0.949013 0.955249 0.962094 0.969536 0.977561 0.986154 0.995301 1.00499 1.0152 1.02591 1.03712 0.938416 0.938749 0.939747 0.941409 0.943729 0.946705 0.950329 0.954594 0.959492 0.965013 0.971146 0.97788 0.985203 0.993101 1.00156 1.01057 1.02011 1.03017 1.04073 1.05178 0.955249 0.955576 0.956556 0.958188 0.960469 0.963392 0.966954 0.971146 0.975961 0.981389 0.987421 0.994045 1.00125 1.00902 1.01735 1.02622 1.03562 1.04553 1.05594 1.06683 0.972433 0.972754 0.973717 0.97532 0.977561 0.980434 0.983933 0.988054 0.992786 0.998123 1.00405 1.01057 1.01766 1.0253 1.0335 1.04223 1.05149 1.06125 1.07151 1.08224 0.989949 0.990265 0.991211 0.992786 0.994987 0.99781 1.00125 1.0053 1.00995 1.0152 1.02103 1.02744 1.03441 1.04193 1.05 1.0586 1.06771 1.07732 1.08743 1.09801 1.00778 1.00809 1.00902 1.01057 1.01273 1.0155 1.01888 1.02286 1.02744 1.03259 1.03833 1.04463 1.05149 1.05889 1.06683 1.07529 1.08426 1.09373 1.10369 1.11411 0.725 0.725431 0.726722 0.728869 0.731864 0.735697 0.740355 0.745822 0.75208 0.759111 0.766893 0.775403 0.784618 0.794512 0.805062 0.816241 0.828025 0.840387 0.853302 0.866747 0.725431 0.725862 0.727152 0.729298 0.732291 0.736122 0.740777 0.746241 0.752496 0.759523 0.7673 0.775806 0.785016 0.794906 0.80545 0.816624 0.828402 0.840759 0.853669 0.867107 0.726722 0.727152 0.72844 0.730582 0.73357 0.737394 0.742041 0.747496 0.753741 0.760756 0.768521 0.777014 0.786209 0.796084 0.806613 0.817771 0.829533 0.841873 0.854766 0.868188 0.728869 0.729298 0.730582 0.732718 0.735697 0.73951 0.744144 0.749583 0.755811 0.762807 0.770552 0.779022 0.788194 0.798044 0.808548 0.81968 0.831414 0.843727 0.856592 0.869986 0.731864 0.732291 0.73357 0.735697 0.738664 0.742462 0.747078 0.752496 0.7587 0.76567 0.773385 0.781825 0.790965 0.800781 0.811249 0.822344 0.834041 0.846316 0.859142 0.872496 0.735697 0.736122 0.737394 0.73951 0.742462 0.746241 0.750833 0.756224 0.762398 0.769334 0.777014 0.785414 0.794512 0.804285 0.814709 0.825757 0.837407 0.849632 0.862409 0.875714 0.740355 0.740777 0.742041 0.744144 0.747078 0.750833 0.755397 0.760756 0.766893 0.773789 0.781425 0.789778 0.798827 0.808548 0.818917 0.82991 0.841502 0.853669 0.866386 0.879631 0.745822 0.746241 0.747496 0.749583 0.752496 0.756224 0.760756 0.766078 0.772172 0.779022 0.786607 0.794906 0.803897 0.813557 0.823863 0.83479 0.846316 0.858414 0.871063 0.884237 0.75208 0.752496 0.753741 0.755811 0.7587 0.762398 0.766893 0.772172 0.778219 0.785016 0.792543 0.800781 0.809707 0.819298 0.829533 0.840387 0.851836 0.863858 0.876427 0.889522 0.759111 0.759523 0.760756 0.762807 0.76567 0.769334 0.773789 0.779022 0.785016 0.791754 0.799218 0.807388 0.816241 0.825757 0.835913 0.846685 0.85805 0.869986 0.882468 0.895475 0.766893 0.7673 0.768521 0.770552 0.773385 0.777014 0.781425 0.786607 0.792543 0.799218 0.806613 0.814709 0.823483 0.832917 0.842986 0.853669 0.864942 0.876784 0.889171 0.902081 0.775403 0.775806 0.777014 0.779022 0.781825 0.785414 0.789778 0.794906 0.800781 0.807388 0.814709 0.822724 0.831414 0.840759 0.850735 0.861322 0.872496 0.884237 0.896521 0.909327 0.784618 0.785016 0.786209 0.788194 0.790965 0.794512 0.798827 0.803897 0.809707 0.816241 0.823483 0.831414 0.840015 0.849264 0.859142 0.869626 0.880696 0.892328 0.904503 0.917197 0.794512 0.794906 0.796084 0.798044 0.800781 0.804285 0.808548 0.813557 0.819298 0.825757 0.832917 0.840759 0.849264 0.858414 0.868188 0.878564 0.889522 0.901041 0.913099 0.925675 0.805062 0.80545 0.806613 0.808548 0.811249 0.814709 0.818917 0.823863 0.829533 0.835913 0.842986 0.850735 0.859142 0.868188 0.877852 0.888116 0.898958 0.910357 0.922293 0.934746 0.816241 0.816624 0.817771 0.81968 0.822344 0.825757 0.82991 0.83479 0.840387 0.846685 0.853669 0.861322 0.869626 0.878564 0.888116 0.898262 0.908983 0.920258 0.932068 0.944391 0.828025 0.828402 0.829533 0.831414 0.834041 0.837407 0.841502 0.846316 0.851836 0.85805 0.864942 0.872496 0.880696 0.889522 0.898958 0.908983 0.919579 0.930726 0.942404 0.954594 0.840387 0.840759 0.841873 0.843727 0.846316 0.849632 0.853669 0.858414 0.863858 0.869986 0.876784 0.884237 0.892328 0.901041 0.910357 0.920258 0.930726 0.94174 0.953284 0.965337 0.853302 0.853669 0.854766 0.856592 0.859142 0.862409 0.866386 0.871063 0.876427 0.882468 0.889171 0.896521 0.904503 0.913099 0.922293 0.932068 0.942404 0.953284 0.964689 0.976601 0.866747 0.867107 0.868188 0.869986 0.872496 0.875714 0.879631 0.884237 0.889522 0.895475 0.902081 0.909327 0.917197 0.925675 0.934746 0.944391 0.954594 0.965337 0.976601 0.98837 0.880696 0.881051 0.882114 0.883883 0.886355 0.889522 0.893378 0.897914 0.90312 0.908983 0.915492 0.922632 0.93039 0.938749 0.947695 0.957209 0.967277 0.97788 0.989002 1.00062 0.895126 0.895475 0.896521 0.898262 0.900694 0.903811 0.907607 0.912072 0.917197 0.922971 0.929382 0.936416 0.94406 0.9523 0.961119 0.970502 0.980434 0.990896 1.00187 1.01335 0.910014 0.910357 0.911386 0.913099 0.915492 0.918559 0.922293 0.926688 0.931732 0.937417 0.943729 0.950658 0.958188 0.966307 0.975 0.984251 0.994045 1.00437 1.0152 1.02652 0.925338 0.925675 0.926688 0.928372 0.930726 0.933742 0.937417 0.94174 0.946705 0.9523 0.958514 0.965337 0.972754 0.980752 0.989318 0.998436 1.00809 1.01827 1.02896 1.04013 0.941077 0.941409 0.942404 0.94406 0.946375 0.949342 0.952956 0.957209 0.962094 0.9676 0.973717 0.980434 0.987737 0.995615 1.00405 1.01304 1.02256 1.03259 1.04313 1.05416 0.957209 0.957536 0.958514 0.960143 0.962419 0.965337 0.968891 0.973075 0.97788 0.983298 0.989318 0.995929 1.00312 1.01088 1.01919 1.02804 1.03742 1.04732 1.05771 1.06859 0.973717 0.974038 0.975 0.976601 0.978839 0.981708 0.985203 0.989318 0.994045 0.999375 1.0053 1.01181 1.01888 1.02652 1.03471 1.04343 1.05268 1.06243 1.07267 1.0834 0.990581 0.990896 0.991842 0.993416 0.995615 0.998436 1.00187 1.00592 1.01057 1.01581 1.02164 1.02804 1.03501 1.04253 1.0506 1.05919 1.06829 1.0779 1.088 1.09858 1.00778 1.00809 1.00902 1.01057 1.01273 1.0155 1.01888 1.02286 1.02744 1.03259 1.03833 1.04463 1.05149 1.05889 1.06683 1.07529 1.08426 1.09373 1.10369 1.11411 1.0253 1.02561 1.02652 1.02804 1.03017 1.0329 1.03622 1.04013 1.04463 1.0497 1.05534 1.06154 1.06829 1.07558 1.0834 1.09173 1.10057 1.1099 1.11971 1.12999 0.75 0.750417 0.751665 0.753741 0.756637 0.760345 0.764853 0.770146 0.776209 0.783023 0.790569 0.798827 0.807775 0.817389 0.827647 0.838525 0.85 0.862047 0.874643 0.887764 0.750417 0.750833 0.75208 0.754155 0.75705 0.760756 0.765261 0.770552 0.776611 0.783422 0.790965 0.799218 0.808161 0.817771 0.828025 0.838898 0.850368 0.862409 0.875 0.888116 0.751665 0.75208 0.753326 0.755397 0.758288 0.761988 0.766485 0.771767 0.777817 0.784618 0.792149 0.800391 0.809321 0.818917 0.829156 0.840015 0.851469 0.863496 0.876071 0.889171 0.753741 0.754155 0.755397 0.757463 0.760345 0.764035 0.768521 0.773789 0.779824 0.786607 0.794119 0.80234 0.811249 0.820823 0.831039 0.841873 0.853302 0.865303 0.877852 0.890926 0.756637 0.75705 0.758288 0.760345 0.763217 0.766893 0.771362 0.776611 0.782624 0.789383 0.796869 0.805062 0.813941 0.823483 0.833667 0.844467 0.855862 0.867828 0.880341 0.893378 0.760345 0.760756 0.761988 0.764035 0.766893 0.770552 0.775 0.780224 0.786209 0.792938 0.800391 0.808548 0.817389 0.826892 0.837033 0.847791 0.859142 0.871063 0.88353 0.896521 0.764853 0.765261 0.766485 0.768521 0.771362 0.775 0.779423 0.784618 0.790569 0.797261 0.804674 0.812788 0.821584 0.831039 0.84113 0.851836 0.863134 0.875 0.887412 0.900347 0.770146 0.770552 0.771767 0.773789 0.776611 0.780224 0.784618 0.789778 0.795692 0.80234 0.809707 0.817771 0.826514 0.835913 0.845946 0.856592 0.867828 0.879631 0.891978 0.904848 0.776209 0.776611 0.777817 0.779824 0.782624 0.786209 0.790569 0.795692 0.801561 0.808161 0.815475 0.823483 0.832166 0.841502 0.851469 0.862047 0.873212 0.884944 0.897218 0.910014 0.783023 0.783422 0.784618 0.786607 0.789383 0.792938 0.797261 0.80234 0.808161 0.814709 0.821964 0.82991 0.838525 0.847791 0.857686 0.868188 0.879275 0.890926 0.90312 0.915833 0.790569 0.790965 0.792149 0.794119 0.796869 0.800391 0.804674 0.809707 0.815475 0.821964 0.829156 0.837033 0.845577 0.854766 0.864581 0.875 0.886002 0.897566 0.90967 0.922293 0.798827 0.799218 0.800391 0.80234 0.805062 0.808548 0.812788 0.817771 0.823483 0.82991 0.837033 0.844837 0.853302 0.862409 0.872138 0.882468 0.893378 0.904848 0.916856 0.929382 0.807775 0.808161 0.809321 0.811249 0.813941 0.817389 0.821584 0.826514 0.832166 0.838525 0.845577 0.853302 0.861684 0.870704 0.880341 0.890576 0.901388 0.912757 0.924662 0.937083 0.817389 0.817771 0.818917 0.820823 0.823483 0.826892 0.831039 0.835913 0.841502 0.847791 0.854766 0.862409 0.870704 0.879631 0.889171 0.899305 0.910014 0.921276 0.933073 0.945384 0.827647 0.828025 0.829156 0.831039 0.833667 0.837033 0.84113 0.845946 0.851469 0.857686 0.864581 0.872138 0.880341 0.889171 0.89861 0.908639 0.919239 0.93039 0.942072 0.954267 0.838525 0.838898 0.840015 0.841873 0.844467 0.847791 0.851836 0.856592 0.862047 0.868188 0.875 0.882468 0.890576 0.899305 0.908639 0.918559 0.929045 0.94008 0.951643 0.963717 0.85 0.850368 0.851469 0.853302 0.855862 0.859142 0.863134 0.867828 0.873212 0.879275 0.886002 0.893378 0.901388 0.910014 0.919239 0.929045 0.939415 0.950329 0.961769 0.973717 0.862047 0.862409 0.863496 0.865303 0.867828 0.871063 0.875 0.879631 0.884944 0.890926 0.897566 0.904848 0.912757 0.921276 0.93039 0.94008 0.950329 0.961119 0.972433 0.984251 0.874643 0.875 0.876071 0.877852 0.880341 0.88353 0.887412 0.891978 0.897218 0.90312 0.90967 0.916856 0.924662 0.933073 0.942072 0.951643 0.961769 0.972433 0.983616 0.995301 0.887764 0.888116 0.889171 0.890926 0.893378 0.896521 0.900347 0.904848 0.910014 0.915833 0.922293 0.929382 0.937083 0.945384 0.954267 0.963717 0.973717 0.984251 0.995301 1.00685 0.901388 0.901734 0.902774 0.904503 0.906918 0.910014 0.913783 0.918218 0.923309 0.929045 0.935414 0.942404 0.95 0.958188 0.966954 0.976281 0.986154 0.996557 1.00747 1.01888 0.915492 0.915833 0.916856 0.918559 0.920937 0.923986 0.927699 0.932068 0.937083 0.942735 0.949013 0.955903 0.963392 0.971468 0.980115 0.989318 0.999062 1.00933 1.02011 1.03138 0.930054 0.93039 0.931397 0.933073 0.935414 0.938416 0.942072 0.946375 0.951315 0.956883 0.963068 0.969858 0.977241 0.985203 0.99373 1.00281 1.01242 1.02256 1.0332 1.04433 0.945053 0.945384 0.946375 0.948024 0.950329 0.953284 0.956883 0.961119 0.965984 0.971468 0.977561 0.984251 0.991527 0.999375 1.00778 1.01673 1.02622 1.03622 1.04672 1.05771 0.960469 0.960794 0.961769 0.963392 0.96566 0.968569 0.972111 0.976281 0.981071 0.986471 0.992472 0.999062 1.00623 1.01396 1.02225 1.03108 1.04043 1.0503 1.06066 1.07151 0.976281 0.976601 0.977561 0.979158 0.981389 0.984251 0.987737 0.991842 0.996557 1.00187 1.00778 1.01427 1.02133 1.02896 1.03712 1.04583 1.05505 1.06478 1.075 1.0857 0.992472 0.992786 0.99373 0.995301 0.997497 1.00031 1.00374 1.00778 1.01242 1.01766 1.02347 1.02987 1.03682 1.04433 1.05238 1.06095 1.07005 1.07964 1.08972 1.10028 1.00902 1.00933 1.01026 1.01181 1.01396 1.01673 1.02011 1.02408 1.02865 1.0338 1.03953 1.04583 1.05268 1.06007 1.068 1.07645 1.08541 1.09487 1.10482 1.11524 1.02591 1.02622 1.02713 1.02865 1.03078 1.0335 1.03682 1.04073 1.04523 1.0503 1.05594 1.06213 1.06888 1.07616 1.08397 1.0923 1.10114 1.11046 1.12027 1.13054 1.04313 1.04343 1.04433 1.04583 1.04791 1.0506 1.05386 1.05771 1.06213 1.06712 1.07267 1.07877 1.08541 1.09259 1.10028 1.10849 1.1172 1.12639 1.13606 1.14619 0.775 0.775403 0.776611 0.778621 0.781425 0.785016 0.789383 0.794512 0.800391 0.807001 0.814325 0.822344 0.831039 0.840387 0.850368 0.860959 0.872138 0.883883 0.896172 0.908983 0.775403 0.775806 0.777014 0.779022 0.781825 0.785414 0.789778 0.794906 0.800781 0.807388 0.814709 0.822724 0.831414 0.840759 0.850735 0.861322 0.872496 0.884237 0.896521 0.909327 0.776611 0.777014 0.778219 0.780224 0.783023 0.786607 0.790965 0.796084 0.801951 0.808548 0.815858 0.823863 0.832541 0.841873 0.851836 0.862409 0.87357 0.885297 0.897566 0.910357 0.778621 0.779022 0.780224 0.782224 0.785016 0.788591 0.792938 0.798044 0.803897 0.810478 0.817771 0.825757 0.834416 0.843727 0.853669 0.864219 0.875357 0.88706 0.899305 0.912072 0.781425 0.781825 0.783023 0.785016 0.787798 0.79136 0.795692 0.800781 0.806613 0.813173 0.820442 0.828402 0.837033 0.846316 0.856227 0.866747 0.877852 0.889522 0.901734 0.914467 0.785016 0.785414 0.786607 0.788591 0.79136 0.794906 0.799218 0.804285 0.810093 0.816624 0.823863 0.83179 0.840387 0.849632 0.859506 0.869986 0.881051 0.892679 0.904848 0.917537 0.789383 0.789778 0.790965 0.792938 0.795692 0.799218 0.803508 0.808548 0.814325 0.820823 0.828025 0.835913 0.844467 0.853669 0.863496 0.873928 0.884944 0.896521 0.908639 0.921276 0.794512 0.794906 0.796084 0.798044 0.800781 0.804285 0.808548 0.813557 0.819298 0.825757 0.832917 0.840759 0.849264 0.858414 0.868188 0.878564 0.889522 0.901041 0.913099 0.925675 0.800391 0.800781 0.801951 0.803897 0.806613 0.810093 0.814325 0.819298 0.825 0.831414 0.838525 0.846316 0.854766 0.863858 0.87357 0.883883 0.894777 0.906228 0.918218 0.930726 0.807001 0.807388 0.808548 0.810478 0.813173 0.816624 0.820823 0.825757 0.831414 0.83778 0.844837 0.85257 0.860959 0.869986 0.879631 0.889874 0.900694 0.912072 0.923986 0.936416 0.814325 0.814709 0.815858 0.817771 0.820442 0.823863 0.828025 0.832917 0.838525 0.844837 0.851836 0.859506 0.867828 0.876784 0.886355 0.896521 0.907262 0.918559 0.93039 0.942735 0.822344 0.822724 0.823863 0.825757 0.828402 0.83179 0.835913 0.840759 0.846316 0.85257 0.859506 0.867107 0.875357 0.884237 0.893728 0.903811 0.914467 0.925675 0.937417 0.949671 0.831039 0.831414 0.832541 0.834416 0.837033 0.840387 0.844467 0.849264 0.854766 0.860959 0.867828 0.875357 0.88353 0.892328 0.901734 0.911729 0.922293 0.933408 0.945053 0.957209 0.840387 0.840759 0.841873 0.843727 0.846316 0.849632 0.853669 0.858414 0.863858 0.869986 0.876784 0.884237 0.892328 0.901041 0.910357 0.920258 0.930726 0.94174 0.953284 0.965337 0.850368 0.850735 0.851836 0.853669 0.856227 0.859506 0.863496 0.868188 0.87357 0.879631 0.886355 0.893728 0.901734 0.910357 0.919579 0.929382 0.939747 0.950658 0.962094 0.974038 0.860959 0.861322 0.862409 0.864219 0.866747 0.869986 0.873928 0.878564 0.883883 0.889874 0.896521 0.903811 0.911729 0.920258 0.929382 0.939082 0.949342 0.960143 0.971468 0.983298 0.872138 0.872496 0.87357 0.875357 0.877852 0.881051 0.884944 0.889522 0.894777 0.900694 0.907262 0.914467 0.922293 0.930726 0.939747 0.949342 0.959492 0.97018 0.981389 0.993101 0.883883 0.884237 0.885297 0.88706 0.889522 0.892679 0.896521 0.901041 0.906228 0.912072 0.918559 0.925675 0.933408 0.94174 0.950658 0.960143 0.97018 0.980752 0.991842 1.00343 0.896172 0.896521 0.897566 0.899305 0.901734 0.904848 0.908639 0.913099 0.918218 0.923986 0.93039 0.937417 0.945053 0.953284 0.962094 0.971468 0.981389 0.991842 1.00281 1.01427 0.908983 0.909327 0.910357 0.912072 0.914467 0.917537 0.921276 0.925675 0.930726 0.936416 0.942735 0.949671 0.957209 0.965337 0.974038 0.983298 0.993101 1.00343 1.01427 1.02561 0.922293 0.922632 0.923648 0.925338 0.927699 0.930726 0.934412 0.938749 0.943729 0.949342 0.955576 0.962419 0.969858 0.97788 0.986471 0.995615 1.0053 1.0155 1.02622 1.03742 0.936082 0.936416 0.937417 0.939082 0.941409 0.944391 0.948024 0.9523 0.957209 0.962743 0.968891 0.975641 0.98298 0.990896 0.999375 1.0084 1.01796 1.02804 1.03863 1.0497 0.950329 0.950658 0.951643 0.953284 0.955576 0.958514 0.962094 0.966307 0.971146 0.976601 0.982662 0.989318 0.996557 1.00437 1.01273 1.02164 1.03108 1.04103 1.05149 1.06243 0.965013 0.965337 0.966307 0.967923 0.97018 0.973075 0.976601 0.980752 0.98552 0.990896 0.99687 1.00343 1.01057 1.01827 1.02652 1.03531 1.04463 1.05445 1.06478 1.07558 0.980115 0.980434 0.981389 0.98298 0.985203 0.988054 0.991527 0.995615 1.00031 1.00561 1.0115 1.01796 1.025 1.03259 1.04073 1.0494 1.0586 1.06829 1.07848 1.08915 0.995615 0.995929 0.99687 0.998436 1.00062 1.00343 1.00685 1.01088 1.0155 1.02072 1.02652 1.0329 1.03983 1.04732 1.05534 1.0639 1.07296 1.08253 1.09259 1.10312 1.0115 1.01181 1.01273 1.01427 1.01643 1.01919 1.02256 1.02652 1.03108 1.03622 1.04193 1.04821 1.05505 1.06243 1.07034 1.07877 1.08772 1.09716 1.10708 1.11747 1.02774 1.02804 1.02896 1.03047 1.03259 1.03531 1.03863 1.04253 1.04702 1.05208 1.05771 1.0639 1.07063 1.0779 1.0857 1.09402 1.10284 1.11215 1.12194 1.1322 1.04433 1.04463 1.04553 1.04702 1.04911 1.05178 1.05505 1.05889 1.06331 1.06829 1.07384 1.07993 1.08657 1.09373 1.10142 1.10962 1.11831 1.1275 1.13716 1.14728 1.06125 1.06154 1.06243 1.0639 1.06595 1.06859 1.0718 1.07558 1.07993 1.08484 1.0903 1.0963 1.10284 1.1099 1.11747 1.12556 1.13413 1.14319 1.15271 1.1627 0.8 0.800391 0.801561 0.803508 0.806226 0.809707 0.813941 0.818917 0.824621 0.831039 0.838153 0.845946 0.8544 0.863496 0.873212 0.88353 0.894427 0.905884 0.917878 0.93039 0.800391 0.800781 0.801951 0.803897 0.806613 0.810093 0.814325 0.819298 0.825 0.831414 0.838525 0.846316 0.854766 0.863858 0.87357 0.883883 0.894777 0.906228 0.918218 0.930726 0.801561 0.801951 0.803119 0.805062 0.807775 0.811249 0.815475 0.820442 0.826136 0.832541 0.839643 0.847423 0.855862 0.864942 0.874643 0.884944 0.895824 0.907262 0.919239 0.931732 0.803508 0.803897 0.805062 0.807001 0.809707 0.813173 0.817389 0.822344 0.828025 0.834416 0.841502 0.849264 0.857686 0.866747 0.876427 0.886707 0.897566 0.908983 0.920937 0.933408 0.806226 0.806613 0.807775 0.809707 0.812404 0.815858 0.820061 0.825 0.830662 0.837033 0.844097 0.851836 0.860233 0.869267 0.87892 0.889171 0.9 0.911386 0.923309 0.935748 0.809707 0.810093 0.811249 0.813173 0.815858 0.819298 0.823483 0.828402 0.834041 0.840387 0.847423 0.855132 0.863496 0.872496 0.882114 0.892328 0.90312 0.914467 0.92635 0.938749 0.813941 0.814325 0.815475 0.817389 0.820061 0.823483 0.827647 0.832541 0.838153 0.844467 0.851469 0.859142 0.867468 0.876427 0.886002 0.896172 0.906918 0.918218 0.930054 0.942404 0.818917 0.819298 0.820442 0.822344 0.825 0.828402 0.832541 0.837407 0.842986 0.849264 0.856227 0.863858 0.872138 0.881051 0.890576 0.900694 0.911386 0.922632 0.934412 0.946705 0.824621 0.825 0.826136 0.828025 0.830662 0.834041 0.838153 0.842986 0.848528 0.854766 0.861684 0.869267 0.877496 0.886355 0.895824 0.905884 0.916515 0.927699 0.939415 0.951643 0.831039 0.831414 0.832541 0.834416 0.837033 0.840387 0.844467 0.849264 0.854766 0.860959 0.867828 0.875357 0.88353 0.892328 0.901734 0.911729 0.922293 0.933408 0.945053 0.957209 0.838153 0.838525 0.839643 0.841502 0.844097 0.847423 0.851469 0.856227 0.861684 0.867828 0.874643 0.882114 0.890225 0.898958 0.908295 0.918218 0.928709 0.939747 0.951315 0.963392 0.845946 0.846316 0.847423 0.849264 0.851836 0.855132 0.859142 0.863858 0.869267 0.875357 0.882114 0.889522 0.897566 0.906228 0.915492 0.925338 0.935748 0.946705 0.958188 0.97018 0.8544 0.854766 0.855862 0.857686 0.860233 0.863496 0.867468 0.872138 0.877496 0.88353 0.890225 0.897566 0.905539 0.914125 0.923309 0.933073 0.943398 0.954267 0.96566 0.977561 0.863496 0.863858 0.864942 0.866747 0.869267 0.872496 0.876427 0.881051 0.886355 0.892328 0.898958 0.906228 0.914125 0.922632 0.931732 0.941409 0.951643 0.962419 0.973717 0.98552 0.873212 0.87357 0.874643 0.876427 0.87892 0.882114 0.886002 0.890576 0.895824 0.901734 0.908295 0.915492 0.923309 0.931732 0.940744 0.950329 0.960469 0.971146 0.982344 0.994045 0.88353 0.883883 0.884944 0.886707 0.889171 0.892328 0.896172 0.900694 0.905884 0.911729 0.918218 0.925338 0.933073 0.941409 0.950329 0.959818 0.969858 0.980434 0.991527 1.00312 0.894427 0.894777 0.895824 0.897566 0.9 0.90312 0.906918 0.911386 0.916515 0.922293 0.928709 0.935748 0.943398 0.951643 0.960469 0.969858 0.979796 0.990265 1.00125 1.01273 0.905884 0.906228 0.907262 0.908983 0.911386 0.914467 0.918218 0.922632 0.927699 0.933408 0.939747 0.946705 0.954267 0.962419 0.971146 0.980434 0.990265 1.00062 1.0115 1.02286 0.917878 0.918218 0.919239 0.920937 0.923309 0.92635 0.930054 0.934412 0.939415 0.945053 0.951315 0.958188 0.96566 0.973717 0.982344 0.991527 1.00125 1.0115 1.02225 1.0335 0.93039 0.930726 0.931732 0.933408 0.935748 0.938749 0.942404 0.946705 0.951643 0.957209 0.963392 0.97018 0.977561 0.98552 0.994045 1.00312 1.01273 1.02286 1.0335 1.04463 0.943398 0.943729 0.944722 0.946375 0.948683 0.951643 0.955249 0.959492 0.964365 0.969858 0.975961 0.982662 0.989949 0.99781 1.00623 1.0152 1.0247 1.03471 1.04523 1.05623 0.956883 0.957209 0.958188 0.959818 0.962094 0.965013 0.968569 0.972754 0.977561 0.98298 0.989002 0.995615 1.00281 1.01057 1.01888 1.02774 1.03712 1.04702 1.05741 1.06829 0.970824 0.971146 0.972111 0.973717 0.975961 0.978839 0.982344 0.986471 0.991211 0.996557 1.0025 1.00902 1.01612 1.02378 1.03199 1.04073 1.05 1.05978 1.07005 1.0808 0.985203 0.98552 0.986471 0.988054 0.990265 0.993101 0.996557 1.00062 1.0053 1.01057 1.01643 1.02286 1.02987 1.03742 1.04553 1.05416 1.06331 1.07296 1.08311 1.09373 1 1.00031 1.00125 1.00281 1.00499 1.00778 1.01119 1.0152 1.0198 1.025 1.03078 1.03712 1.04403 1.05149 1.05948 1.068 1.07703 1.08657 1.09659 1.10708 1.0152 1.0155 1.01643 1.01796 1.02011 1.02286 1.02622 1.03017 1.03471 1.03983 1.04553 1.05178 1.0586 1.06595 1.07384 1.08224 1.09116 1.10057 1.11046 1.12083 1.03078 1.03108 1.03199 1.0335 1.03562 1.03833 1.04163 1.04553 1.05 1.05505 1.06066 1.06683 1.07355 1.0808 1.08858 1.09687 1.10567 1.11496 1.12472 1.13496 1.04672 1.04702 1.04791 1.0494 1.05149 1.05416 1.05741 1.06125 1.06566 1.07063 1.07616 1.08224 1.08886 1.09602 1.10369 1.11187 1.12055 1.12971 1.13935 1.14946 1.06301 1.06331 1.06419 1.06566 1.06771 1.07034 1.07355 1.07732 1.08167 1.08657 1.09202 1.09801 1.10454 1.11159 1.11915 1.12722 1.13578 1.14483 1.15434 1.16431 1.07964 1.07993 1.0808 1.08224 1.08426 1.08685 1.09001 1.09373 1.09801 1.10284 1.10821 1.11411 1.12055 1.1275 1.13496 1.14291 1.15136 1.16028 1.16967 1.17951 0.825 0.825379 0.826514 0.828402 0.831039 0.834416 0.838525 0.843356 0.848896 0.855132 0.862047 0.869626 0.877852 0.886707 0.896172 0.906228 0.916856 0.928036 0.939747 0.951972 0.825379 0.825757 0.826892 0.828779 0.831414 0.83479 0.838898 0.843727 0.849264 0.855497 0.862409 0.869986 0.878208 0.88706 0.896521 0.906573 0.917197 0.928372 0.94008 0.9523 0.826514 0.826892 0.828025 0.82991 0.832541 0.835913 0.840015 0.844837 0.850368 0.856592 0.863496 0.871063 0.879275 0.888116 0.897566 0.907607 0.918218 0.929382 0.941077 0.953284 0.828402 0.828779 0.82991 0.83179 0.834416 0.83778 0.841873 0.846685 0.852203 0.858414 0.865303 0.872855 0.881051 0.889874 0.899305 0.909327 0.919918 0.931061 0.942735 0.954921 0.831039 0.831414 0.832541 0.834416 0.837033 0.840387 0.844467 0.849264 0.854766 0.860959 0.867828 0.875357 0.88353 0.892328 0.901734 0.911729 0.922293 0.933408 0.945053 0.957209 0.834416 0.83479 0.835913 0.83778 0.840387 0.843727 0.847791 0.85257 0.85805 0.864219 0.871063 0.878564 0.886707 0.895475 0.904848 0.914809 0.925338 0.936416 0.948024 0.960143 0.838525 0.838898 0.840015 0.841873 0.844467 0.847791 0.851836 0.856592 0.862047 0.868188 0.875 0.882468 0.890576 0.899305 0.908639 0.918559 0.929045 0.94008 0.951643 0.963717 0.843356 0.843727 0.844837 0.846685 0.849264 0.85257 0.856592 0.861322 0.866747 0.872855 0.879631 0.88706 0.895126 0.903811 0.913099 0.922971 0.933408 0.944391 0.955903 0.967923 0.848896 0.849264 0.850368 0.852203 0.854766 0.85805 0.862047 0.866747 0.872138 0.878208 0.884944 0.892328 0.900347 0.908983 0.918218 0.928036 0.938416 0.949342 0.960794 0.972754 0.855132 0.855497 0.856592 0.858414 0.860959 0.864219 0.868188 0.872855 0.878208 0.884237 0.890926 0.898262 0.906228 0.914809 0.923986 0.933742 0.94406 0.954921 0.966307 0.9782 0.862047 0.862409 0.863496 0.865303 0.867828 0.871063 0.875 0.879631 0.884944 0.890926 0.897566 0.904848 0.912757 0.921276 0.93039 0.94008 0.950329 0.961119 0.972433 0.984251 0.869626 0.869986 0.871063 0.872855 0.875357 0.878564 0.882468 0.88706 0.892328 0.898262 0.904848 0.912072 0.919918 0.928372 0.937417 0.947035 0.957209 0.967923 0.979158 0.990896 0.877852 0.878208 0.879275 0.881051 0.88353 0.886707 0.890576 0.895126 0.900347 0.906228 0.912757 0.919918 0.927699 0.936082 0.945053 0.954594 0.964689 0.97532 0.986471 0.998123 0.886707 0.88706 0.888116 0.889874 0.892328 0.895475 0.899305 0.903811 0.908983 0.914809 0.921276 0.928372 0.936082 0.944391 0.953284 0.962743 0.972754 0.983298 0.994359 1.00592 0.896172 0.896521 0.897566 0.899305 0.901734 0.904848 0.908639 0.913099 0.918218 0.923986 0.93039 0.937417 0.945053 0.953284 0.962094 0.971468 0.981389 0.991842 1.00281 1.01427 0.906228 0.906573 0.907607 0.909327 0.911729 0.914809 0.918559 0.922971 0.928036 0.933742 0.94008 0.947035 0.954594 0.962743 0.971468 0.980752 0.990581 1.00094 1.01181 1.02317 0.916856 0.917197 0.918218 0.919918 0.922293 0.925338 0.929045 0.933408 0.938416 0.94406 0.950329 0.957209 0.964689 0.972754 0.981389 0.990581 1.00031 1.01057 1.02133 1.03259 0.928036 0.928372 0.929382 0.931061 0.933408 0.936416 0.94008 0.944391 0.949342 0.954921 0.961119 0.967923 0.97532 0.983298 0.991842 1.00094 1.01057 1.02072 1.03138 1.04253 0.939747 0.94008 0.941077 0.942735 0.945053 0.948024 0.951643 0.955903 0.960794 0.966307 0.972433 0.979158 0.986471 0.994359 1.00281 1.01181 1.02133 1.03138 1.04193 1.05297 0.951972 0.9523 0.953284 0.954921 0.957209 0.960143 0.963717 0.967923 0.972754 0.9782 0.984251 0.990896 0.998123 1.00592 1.01427 1.02317 1.03259 1.04253 1.05297 1.0639 0.964689 0.965013 0.965984 0.9676 0.969858 0.972754 0.976281 0.980434 0.985203 0.990581 0.996557 1.00312 1.01026 1.01796 1.02622 1.03501 1.04433 1.05416 1.06448 1.07529 0.97788 0.9782 0.979158 0.980752 0.98298 0.985837 0.989318 0.993416 0.998123 1.00343 1.00933 1.01581 1.02286 1.03047 1.03863 1.04732 1.05653 1.06624 1.07645 1.08714 0.991527 0.991842 0.992786 0.994359 0.996557 0.999375 1.00281 1.00685 1.0115 1.01673 1.02256 1.02896 1.03592 1.04343 1.05149 1.06007 1.06917 1.07877 1.08886 1.09943 1.00561 1.00592 1.00685 1.0084 1.01057 1.01335 1.01673 1.02072 1.0253 1.03047 1.03622 1.04253 1.0494 1.05682 1.06478 1.07325 1.08224 1.09173 1.1017 1.11215 1.02011 1.02042 1.02133 1.02286 1.025 1.02774 1.03108 1.03501 1.03953 1.04463 1.0503 1.05653 1.06331 1.07063 1.07848 1.08685 1.09573 1.1051 1.11496 1.12528 1.03501 1.03531 1.03622 1.03773 1.03983 1.04253 1.04583 1.0497 1.05416 1.05919 1.06478 1.07092 1.07761 1.08484 1.09259 1.10085 1.10962 1.11887 1.12861 1.1388 1.0503 1.0506 1.05149 1.05297 1.05505 1.05771 1.06095 1.06478 1.06917 1.07413 1.07964 1.0857 1.0923 1.09943 1.10708 1.11524 1.12389 1.13303 1.14264 1.15271 1.06595 1.06624 1.06712 1.06859 1.07063 1.07325 1.07645 1.08022 1.08455 1.08944 1.09487 1.10085 1.10736 1.11439 1.12194 1.12999 1.13853 1.14755 1.15704 1.16699 1.08195 1.08224 1.08311 1.08455 1.08657 1.08915 1.0923 1.09602 1.10028 1.1051 1.11046 1.11636 1.12278 1.12971 1.13716 1.1451 1.15353 1.16243 1.1718 1.18163 1.09829 1.09858 1.09943 1.10085 1.10284 1.10538 1.10849 1.11215 1.11636 1.1211 1.12639 1.1322 1.13853 1.14537 1.15271 1.16055 1.16887 1.17766 1.18691 1.19661 0.85 0.850368 0.851469 0.853302 0.855862 0.859142 0.863134 0.867828 0.873212 0.879275 0.886002 0.893378 0.901388 0.910014 0.919239 0.929045 0.939415 0.950329 0.961769 0.973717 0.850368 0.850735 0.851836 0.853669 0.856227 0.859506 0.863496 0.868188 0.87357 0.879631 0.886355 0.893728 0.901734 0.910357 0.919579 0.929382 0.939747 0.950658 0.962094 0.974038 0.851469 0.851836 0.852936 0.854766 0.857321 0.860596 0.864581 0.869267 0.874643 0.880696 0.887412 0.894777 0.902774 0.911386 0.920598 0.93039 0.940744 0.951643 0.963068 0.975 0.853302 0.853669 0.854766 0.856592 0.859142 0.862409 0.866386 0.871063 0.876427 0.882468 0.889171 0.896521 0.904503 0.913099 0.922293 0.932068 0.942404 0.953284 0.964689 0.976601 0.855862 0.856227 0.857321 0.859142 0.861684 0.864942 0.868907 0.87357 0.87892 0.884944 0.891628 0.898958 0.906918 0.915492 0.924662 0.934412 0.944722 0.955576 0.966954 0.978839 0.859142 0.859506 0.860596 0.862409 0.864942 0.868188 0.872138 0.876784 0.882114 0.888116 0.894777 0.902081 0.910014 0.918559 0.927699 0.937417 0.947695 0.958514 0.969858 0.981708 0.863134 0.863496 0.864581 0.866386 0.868907 0.872138 0.876071 0.880696 0.886002 0.891978 0.89861 0.905884 0.913783 0.922293 0.931397 0.941077 0.951315 0.962094 0.973396 0.985203 0.867828 0.868188 0.869267 0.871063 0.87357 0.876784 0.880696 0.885297 0.890576 0.896521 0.90312 0.910357 0.918218 0.926688 0.935748 0.945384 0.955576 0.966307 0.977561 0.989318 0.873212 0.87357 0.874643 0.876427 0.87892 0.882114 0.886002 0.890576 0.895824 0.901734 0.908295 0.915492 0.923309 0.931732 0.940744 0.950329 0.960469 0.971146 0.982344 0.994045 0.879275 0.879631 0.880696 0.882468 0.884944 0.888116 0.891978 0.896521 0.901734 0.907607 0.914125 0.921276 0.929045 0.937417 0.946375 0.955903 0.965984 0.976601 0.987737 0.999375 0.886002 0.886355 0.887412 0.889171 0.891628 0.894777 0.89861 0.90312 0.908295 0.914125 0.920598 0.927699 0.935414 0.943729 0.952628 0.962094 0.972111 0.982662 0.99373 1.0053 0.893378 0.893728 0.894777 0.896521 0.898958 0.902081 0.905884 0.910357 0.915492 0.921276 0.927699 0.934746 0.942404 0.950658 0.959492 0.968891 0.978839 0.989318 1.00031 1.01181 0.901388 0.901734 0.902774 0.904503 0.906918 0.910014 0.913783 0.918218 0.923309 0.929045 0.935414 0.942404 0.95 0.958188 0.966954 0.976281 0.986154 0.996557 1.00747 1.01888 0.910014 0.910357 0.911386 0.913099 0.915492 0.918559 0.922293 0.926688 0.931732 0.937417 0.943729 0.950658 0.958188 0.966307 0.975 0.984251 0.994045 1.00437 1.0152 1.02652 0.919239 0.919579 0.920598 0.922293 0.924662 0.927699 0.931397 0.935748 0.940744 0.946375 0.952628 0.959492 0.966954 0.975 0.983616 0.992786 1.0025 1.01273 1.02347 1.03471 0.929045 0.929382 0.93039 0.932068 0.934412 0.937417 0.941077 0.945384 0.950329 0.955903 0.962094 0.968891 0.976281 0.984251 0.992786 1.00187 1.0115 1.02164 1.03229 1.04343 0.939415 0.939747 0.940744 0.942404 0.944722 0.947695 0.951315 0.955576 0.960469 0.965984 0.972111 0.978839 0.986154 0.994045 1.0025 1.0115 1.02103 1.03108 1.04163 1.05268 0.950329 0.950658 0.951643 0.953284 0.955576 0.958514 0.962094 0.966307 0.971146 0.976601 0.982662 0.989318 0.996557 1.00437 1.01273 1.02164 1.03108 1.04103 1.05149 1.06243 0.961769 0.962094 0.963068 0.964689 0.966954 0.969858 0.973396 0.977561 0.982344 0.987737 0.99373 1.00031 1.00747 1.0152 1.02347 1.03229 1.04163 1.05149 1.06184 1.07267 0.973717 0.974038 0.975 0.976601 0.978839 0.981708 0.985203 0.989318 0.994045 0.999375 1.0053 1.01181 1.01888 1.02652 1.03471 1.04343 1.05268 1.06243 1.07267 1.0834 0.986154 0.986471 0.987421 0.989002 0.991211 0.994045 0.997497 1.00156 1.00623 1.0115 1.01735 1.02378 1.03078 1.03833 1.04642 1.05505 1.06419 1.07384 1.08397 1.09459 0.999062 0.999375 1.00031 1.00187 1.00405 1.00685 1.01026 1.01427 1.01888 1.02408 1.02987 1.03622 1.04313 1.0506 1.0586 1.06712 1.07616 1.0857 1.09573 1.10623 1.01242 1.01273 1.01366 1.0152 1.01735 1.02011 1.02347 1.02744 1.03199 1.03712 1.04283 1.04911 1.05594 1.06331 1.07121 1.07964 1.08858 1.09801 1.10793 1.11831 1.02622 1.02652 1.02744 1.02896 1.03108 1.0338 1.03712 1.04103 1.04553 1.0506 1.05623 1.06243 1.06917 1.07645 1.08426 1.09259 1.10142 1.11074 1.12055 1.13082 1.04043 1.04073 1.04163 1.04313 1.04523 1.04791 1.05119 1.05505 1.05948 1.06448 1.07005 1.07616 1.08282 1.09001 1.09772 1.10595 1.11467 1.12389 1.13358 1.14373 1.05505 1.05534 1.05623 1.05771 1.05978 1.06243 1.06566 1.06946 1.07384 1.07877 1.08426 1.0903 1.09687 1.10397 1.11159 1.11971 1.12833 1.13743 1.14701 1.15704 1.07005 1.07034 1.07121 1.07267 1.07471 1.07732 1.08051 1.08426 1.08858 1.09345 1.09886 1.10482 1.11131 1.11831 1.12583 1.13385 1.14237 1.15136 1.16082 1.17074 1.08541 1.0857 1.08657 1.088 1.09001 1.09259 1.09573 1.09943 1.10369 1.10849 1.11383 1.11971 1.12611 1.13303 1.14045 1.14837 1.15677 1.16565 1.175 1.1848 1.10114 1.10142 1.10227 1.10369 1.10567 1.10821 1.11131 1.11496 1.11915 1.12389 1.12916 1.13496 1.14127 1.1481 1.15542 1.16324 1.17154 1.18031 1.18954 1.19922 1.1172 1.11747 1.11831 1.11971 1.12166 1.12417 1.12722 1.13082 1.13496 1.13963 1.14483 1.15054 1.15677 1.16351 1.17074 1.17845 1.18664 1.1953 1.20442 1.21398 0.875 0.875357 0.876427 0.878208 0.880696 0.883883 0.887764 0.892328 0.897566 0.903466 0.910014 0.917197 0.925 0.933408 0.942404 0.951972 0.962094 0.972754 0.983933 0.995615 0.875357 0.875714 0.876784 0.878564 0.881051 0.884237 0.888116 0.892679 0.897914 0.903811 0.910357 0.917537 0.925338 0.933742 0.942735 0.9523 0.962419 0.973075 0.984251 0.995929 0.876427 0.876784 0.877852 0.879631 0.882114 0.885297 0.889171 0.893728 0.898958 0.904848 0.911386 0.918559 0.92635 0.934746 0.943729 0.953284 0.963392 0.974038 0.985203 0.99687 0.878208 0.878564 0.879631 0.881405 0.883883 0.88706 0.890926 0.895475 0.900694 0.906573 0.913099 0.920258 0.928036 0.936416 0.945384 0.954921 0.965013 0.975641 0.986788 0.998436 0.880696 0.881051 0.882114 0.883883 0.886355 0.889522 0.893378 0.897914 0.90312 0.908983 0.915492 0.922632 0.93039 0.938749 0.947695 0.957209 0.967277 0.97788 0.989002 1.00062 0.883883 0.884237 0.885297 0.88706 0.889522 0.892679 0.896521 0.901041 0.906228 0.912072 0.918559 0.925675 0.933408 0.94174 0.950658 0.960143 0.97018 0.980752 0.991842 1.00343 0.887764 0.888116 0.889171 0.890926 0.893378 0.896521 0.900347 0.904848 0.910014 0.915833 0.922293 0.929382 0.937083 0.945384 0.954267 0.963717 0.973717 0.984251 0.995301 1.00685 0.892328 0.892679 0.893728 0.895475 0.897914 0.901041 0.904848 0.909327 0.914467 0.920258 0.926688 0.933742 0.941409 0.949671 0.958514 0.967923 0.97788 0.98837 0.999375 1.01088 0.897566 0.897914 0.898958 0.900694 0.90312 0.906228 0.910014 0.914467 0.919579 0.925338 0.931732 0.938749 0.946375 0.954594 0.963392 0.972754 0.982662 0.993101 1.00405 1.0155 0.903466 0.903811 0.904848 0.906573 0.908983 0.912072 0.915833 0.920258 0.925338 0.931061 0.937417 0.944391 0.951972 0.960143 0.968891 0.9782 0.988054 0.998436 1.00933 1.02072 0.910014 0.910357 0.911386 0.913099 0.915492 0.918559 0.922293 0.926688 0.931732 0.937417 0.943729 0.950658 0.958188 0.966307 0.975 0.984251 0.994045 1.00437 1.0152 1.02652 0.917197 0.917537 0.918559 0.920258 0.922632 0.925675 0.929382 0.933742 0.938749 0.944391 0.950658 0.957536 0.965013 0.973075 0.981708 0.990896 1.00062 1.01088 1.02164 1.0329 0.925 0.925338 0.92635 0.928036 0.93039 0.933408 0.937083 0.941409 0.946375 0.951972 0.958188 0.965013 0.972433 0.980434 0.989002 0.998123 1.00778 1.01796 1.02865 1.03983 0.933408 0.933742 0.934746 0.936416 0.938749 0.94174 0.945384 0.949671 0.954594 0.960143 0.966307 0.973075 0.980434 0.98837 0.99687 1.00592 1.0155 1.02561 1.03622 1.04732 0.942404 0.942735 0.943729 0.945384 0.947695 0.950658 0.954267 0.958514 0.963392 0.968891 0.975 0.981708 0.989002 0.99687 1.0053 1.01427 1.02378 1.0338 1.04433 1.05534 0.951972 0.9523 0.953284 0.954921 0.957209 0.960143 0.963717 0.967923 0.972754 0.9782 0.984251 0.990896 0.998123 1.00592 1.01427 1.02317 1.03259 1.04253 1.05297 1.0639 0.962094 0.962419 0.963392 0.965013 0.967277 0.97018 0.973717 0.97788 0.982662 0.988054 0.994045 1.00062 1.00778 1.0155 1.02378 1.03259 1.04193 1.05178 1.06213 1.07296 0.972754 0.973075 0.974038 0.975641 0.97788 0.980752 0.984251 0.98837 0.993101 0.998436 1.00437 1.01088 1.01796 1.02561 1.0338 1.04253 1.05178 1.06154 1.0718 1.08253 0.983933 0.984251 0.985203 0.986788 0.989002 0.991842 0.995301 0.999375 1.00405 1.00933 1.0152 1.02164 1.02865 1.03622 1.04433 1.05297 1.06213 1.0718 1.08195 1.09259 0.995615 0.995929 0.99687 0.998436 1.00062 1.00343 1.00685 1.01088 1.0155 1.02072 1.02652 1.0329 1.03983 1.04732 1.05534 1.0639 1.07296 1.08253 1.09259 1.10312 1.00778 1.00809 1.00902 1.01057 1.01273 1.0155 1.01888 1.02286 1.02744 1.03259 1.03833 1.04463 1.05149 1.05889 1.06683 1.07529 1.08426 1.09373 1.10369 1.11411 1.02042 1.02072 1.02164 1.02317 1.0253 1.02804 1.03138 1.03531 1.03983 1.04493 1.0506 1.05682 1.0636 1.07092 1.07877 1.08714 1.09602 1.10538 1.11524 1.12556 1.0335 1.0338 1.03471 1.03622 1.03833 1.04103 1.04433 1.04821 1.05268 1.05771 1.06331 1.06946 1.07616 1.0834 1.09116 1.09943 1.10821 1.11747 1.12722 1.13743 1.04702 1.04732 1.04821 1.0497 1.05178 1.05445 1.05771 1.06154 1.06595 1.07092 1.07645 1.08253 1.08915 1.0963 1.10397 1.11215 1.12083 1.12999 1.13963 1.14973 1.06095 1.06125 1.06213 1.0636 1.06566 1.06829 1.07151 1.07529 1.07964 1.08455 1.09001 1.09602 1.10255 1.10962 1.1172 1.12528 1.13385 1.14291 1.15244 1.16243 1.07529 1.07558 1.07645 1.0779 1.07993 1.08253 1.0857 1.08944 1.09373 1.09858 1.10397 1.1099 1.11636 1.12333 1.13082 1.1388 1.14728 1.15623 1.16565 1.17553 1.09001 1.0903 1.09116 1.09259 1.09459 1.09716 1.10028 1.10397 1.10821 1.11299 1.11831 1.12417 1.13054 1.13743 1.14483 1.15271 1.16109 1.16994 1.17925 1.18901 1.1051 1.10538 1.10623 1.10764 1.10962 1.11215 1.11524 1.11887 1.12305 1.12777 1.13303 1.1388 1.1451 1.1519 1.1592 1.16699 1.17527 1.18401 1.19321 1.20286 1.12055 1.12083 1.12166 1.12305 1.125 1.1275 1.13054 1.13413 1.13826 1.14291 1.1481 1.1538 1.16001 1.16673 1.17394 1.18163 1.1898 1.19844 1.20753 1.21707 1.13633 1.13661 1.13743 1.1388 1.14072 1.14319 1.14619 1.14973 1.1538 1.15839 1.16351 1.16913 1.17527 1.18189 1.18901 1.19661 1.20468 1.21321 1.22219 1.23161 0.9 0.900347 0.901388 0.90312 0.905539 0.908639 0.912414 0.916856 0.921954 0.927699 0.934077 0.941077 0.948683 0.956883 0.96566 0.975 0.984886 0.995301 1.00623 1.01766 0.900347 0.900694 0.901734 0.903466 0.905884 0.908983 0.912757 0.917197 0.922293 0.928036 0.934412 0.941409 0.949013 0.957209 0.965984 0.97532 0.985203 0.995615 1.00654 1.01796 0.901388 0.901734 0.902774 0.904503 0.906918 0.910014 0.913783 0.918218 0.923309 0.929045 0.935414 0.942404 0.95 0.958188 0.966954 0.976281 0.986154 0.996557 1.00747 1.01888 0.90312 0.903466 0.904503 0.906228 0.908639 0.911729 0.915492 0.919918 0.925 0.930726 0.937083 0.94406 0.951643 0.959818 0.968569 0.97788 0.987737 0.998123 1.00902 1.02042 0.905539 0.905884 0.906918 0.908639 0.911043 0.914125 0.917878 0.922293 0.927362 0.933073 0.939415 0.946375 0.953939 0.962094 0.970824 0.980115 0.989949 1.00031 1.01119 1.02256 0.908639 0.908983 0.910014 0.911729 0.914125 0.917197 0.920937 0.925338 0.93039 0.936082 0.942404 0.949342 0.956883 0.965013 0.973717 0.98298 0.992786 1.00312 1.01396 1.0253 0.912414 0.912757 0.913783 0.915492 0.917878 0.920937 0.924662 0.929045 0.934077 0.939747 0.946044 0.952956 0.960469 0.968569 0.977241 0.986471 0.996243 1.00654 1.01735 1.02865 0.916856 0.917197 0.918218 0.919918 0.922293 0.925338 0.929045 0.933408 0.938416 0.94406 0.950329 0.957209 0.964689 0.972754 0.981389 0.990581 1.00031 1.01057 1.02133 1.03259 0.921954 0.922293 0.923309 0.925 0.927362 0.93039 0.934077 0.938416 0.943398 0.949013 0.955249 0.962094 0.969536 0.977561 0.986154 0.995301 1.00499 1.0152 1.02591 1.03712 0.927699 0.928036 0.929045 0.930726 0.933073 0.936082 0.939747 0.94406 0.949013 0.954594 0.960794 0.9676 0.975 0.98298 0.991527 1.00062 1.01026 1.02042 1.03108 1.04223 0.934077 0.934412 0.935414 0.937083 0.939415 0.942404 0.946044 0.950329 0.955249 0.960794 0.966954 0.973717 0.981071 0.989002 0.997497 1.00654 1.01612 1.02622 1.03682 1.04791 0.941077 0.941409 0.942404 0.94406 0.946375 0.949342 0.952956 0.957209 0.962094 0.9676 0.973717 0.980434 0.987737 0.995615 1.00405 1.01304 1.02256 1.03259 1.04313 1.05416 0.948683 0.949013 0.95 0.951643 0.953939 0.956883 0.960469 0.964689 0.969536 0.975 0.981071 0.987737 0.994987 1.00281 1.01119 1.02011 1.02956 1.03953 1.05 1.06095 0.956883 0.957209 0.958188 0.959818 0.962094 0.965013 0.968569 0.972754 0.977561 0.98298 0.989002 0.995615 1.00281 1.01057 1.01888 1.02774 1.03712 1.04702 1.05741 1.06829 0.96566 0.965984 0.966954 0.968569 0.970824 0.973717 0.977241 0.981389 0.986154 0.991527 0.997497 1.00405 1.01119 1.01888 1.02713 1.03592 1.04523 1.05505 1.06536 1.07616 0.975 0.97532 0.976281 0.97788 0.980115 0.98298 0.986471 0.990581 0.995301 1.00062 1.00654 1.01304 1.02011 1.02774 1.03592 1.04463 1.05386 1.0636 1.07384 1.08455 0.984886 0.985203 0.986154 0.987737 0.989949 0.992786 0.996243 1.00031 1.00499 1.01026 1.01612 1.02256 1.02956 1.03712 1.04523 1.05386 1.06301 1.07267 1.08282 1.09345 0.995301 0.995615 0.996557 0.998123 1.00031 1.00312 1.00654 1.01057 1.0152 1.02042 1.02622 1.03259 1.03953 1.04702 1.05505 1.0636 1.07267 1.08224 1.0923 1.10284 1.00623 1.00654 1.00747 1.00902 1.01119 1.01396 1.01735 1.02133 1.02591 1.03108 1.03682 1.04313 1.05 1.05741 1.06536 1.07384 1.08282 1.0923 1.10227 1.11271 1.01766 1.01796 1.01888 1.02042 1.02256 1.0253 1.02865 1.03259 1.03712 1.04223 1.04791 1.05416 1.06095 1.06829 1.07616 1.08455 1.09345 1.10284 1.11271 1.12305 1.02956 1.02987 1.03078 1.03229 1.03441 1.03712 1.04043 1.04433 1.04881 1.05386 1.05948 1.06566 1.07238 1.07964 1.08743 1.09573 1.10454 1.11383 1.12361 1.13385 1.04193 1.04223 1.04313 1.04463 1.04672 1.0494 1.05268 1.05653 1.06095 1.06595 1.07151 1.07761 1.08426 1.09144 1.09915 1.10736 1.11608 1.12528 1.13496 1.1451 1.05475 1.05505 1.05594 1.05741 1.05948 1.06213 1.06536 1.06917 1.07355 1.07848 1.08397 1.09001 1.09659 1.10369 1.11131 1.11943 1.12805 1.13716 1.14673 1.15677 1.068 1.06829 1.06917 1.07063 1.07267 1.07529 1.07848 1.08224 1.08657 1.09144 1.09687 1.10284 1.10934 1.11636 1.12389 1.13192 1.14045 1.14946 1.15893 1.16887 1.08167 1.08195 1.08282 1.08426 1.08628 1.08886 1.09202 1.09573 1.1 1.10482 1.11018 1.11608 1.1225 1.12944 1.13688 1.14483 1.15326 1.16216 1.17154 1.18137 1.09573 1.09602 1.09687 1.09829 1.10028 1.10284 1.10595 1.10962 1.11383 1.11859 1.12389 1.12971 1.13606 1.14291 1.15027 1.15812 1.16646 1.17527 1.18454 1.19426 1.11018 1.11046 1.11131 1.11271 1.11467 1.1172 1.12027 1.12389 1.12805 1.13275 1.13798 1.14373 1.15 1.15677 1.16404 1.1718 1.18004 1.18875 1.19791 1.20753 1.125 1.12528 1.12611 1.1275 1.12944 1.13192 1.13496 1.13853 1.14264 1.14728 1.15244 1.15812 1.16431 1.171 1.17819 1.18585 1.194 1.2026 1.21166 1.22117 1.14018 1.14045 1.14127 1.14264 1.14455 1.14701 1.15 1.15353 1.15758 1.16216 1.16726 1.17287 1.17898 1.18559 1.19269 1.20026 1.2083 1.21681 1.22577 1.23516 1.15569 1.15596 1.15677 1.15812 1.16001 1.16243 1.16539 1.16887 1.17287 1.17739 1.18242 1.18796 1.194 1.20052 1.20753 1.21501 1.22296 1.23136 1.24021 1.2495 0.925 0.925338 0.92635 0.928036 0.93039 0.933408 0.937083 0.941409 0.946375 0.951972 0.958188 0.965013 0.972433 0.980434 0.989002 0.998123 1.00778 1.01796 1.02865 1.03983 0.925338 0.925675 0.926688 0.928372 0.930726 0.933742 0.937417 0.94174 0.946705 0.9523 0.958514 0.965337 0.972754 0.980752 0.989318 0.998436 1.00809 1.01827 1.02896 1.04013 0.92635 0.926688 0.927699 0.929382 0.931732 0.934746 0.938416 0.942735 0.947695 0.953284 0.959492 0.966307 0.973717 0.981708 0.990265 0.999375 1.00902 1.01919 1.02987 1.04103 0.928036 0.928372 0.929382 0.931061 0.933408 0.936416 0.94008 0.944391 0.949342 0.954921 0.961119 0.967923 0.97532 0.983298 0.991842 1.00094 1.01057 1.02072 1.03138 1.04253 0.93039 0.930726 0.931732 0.933408 0.935748 0.938749 0.942404 0.946705 0.951643 0.957209 0.963392 0.97018 0.977561 0.98552 0.994045 1.00312 1.01273 1.02286 1.0335 1.04463 0.933408 0.933742 0.934746 0.936416 0.938749 0.94174 0.945384 0.949671 0.954594 0.960143 0.966307 0.973075 0.980434 0.98837 0.99687 1.00592 1.0155 1.02561 1.03622 1.04732 0.937083 0.937417 0.938416 0.94008 0.942404 0.945384 0.949013 0.953284 0.958188 0.963717 0.969858 0.976601 0.983933 0.991842 1.00031 1.00933 1.01888 1.02896 1.03953 1.0506 0.941409 0.94174 0.942735 0.944391 0.946705 0.949671 0.953284 0.957536 0.962419 0.967923 0.974038 0.980752 0.988054 0.995929 1.00437 1.01335 1.02286 1.0329 1.04343 1.05445 0.946375 0.946705 0.947695 0.949342 0.951643 0.954594 0.958188 0.962419 0.967277 0.972754 0.978839 0.98552 0.992786 1.00062 1.00902 1.01796 1.02744 1.03742 1.04791 1.05889 0.951972 0.9523 0.953284 0.954921 0.957209 0.960143 0.963717 0.967923 0.972754 0.9782 0.984251 0.990896 0.998123 1.00592 1.01427 1.02317 1.03259 1.04253 1.05297 1.0639 0.958188 0.958514 0.959492 0.961119 0.963392 0.966307 0.969858 0.974038 0.978839 0.984251 0.990265 0.99687 1.00405 1.01181 1.02011 1.02896 1.03833 1.04821 1.0586 1.06946 0.965013 0.965337 0.966307 0.967923 0.97018 0.973075 0.976601 0.980752 0.98552 0.990896 0.99687 1.00343 1.01057 1.01827 1.02652 1.03531 1.04463 1.05445 1.06478 1.07558 0.972433 0.972754 0.973717 0.97532 0.977561 0.980434 0.983933 0.988054 0.992786 0.998123 1.00405 1.01057 1.01766 1.0253 1.0335 1.04223 1.05149 1.06125 1.07151 1.08224 0.980434 0.980752 0.981708 0.983298 0.98552 0.98837 0.991842 0.995929 1.00062 1.00592 1.01181 1.01827 1.0253 1.0329 1.04103 1.0497 1.05889 1.06859 1.07877 1.08944 0.989002 0.989318 0.990265 0.991842 0.994045 0.99687 1.00031 1.00437 1.00902 1.01427 1.02011 1.02652 1.0335 1.04103 1.04911 1.05771 1.06683 1.07645 1.08657 1.09716 0.998123 0.998436 0.999375 1.00094 1.00312 1.00592 1.00933 1.01335 1.01796 1.02317 1.02896 1.03531 1.04223 1.0497 1.05771 1.06624 1.07529 1.08484 1.09487 1.10538 1.00778 1.00809 1.00902 1.01057 1.01273 1.0155 1.01888 1.02286 1.02744 1.03259 1.03833 1.04463 1.05149 1.05889 1.06683 1.07529 1.08426 1.09373 1.10369 1.11411 1.01796 1.01827 1.01919 1.02072 1.02286 1.02561 1.02896 1.0329 1.03742 1.04253 1.04821 1.05445 1.06125 1.06859 1.07645 1.08484 1.09373 1.10312 1.11299 1.12333 1.02865 1.02896 1.02987 1.03138 1.0335 1.03622 1.03953 1.04343 1.04791 1.05297 1.0586 1.06478 1.07151 1.07877 1.08657 1.09487 1.10369 1.11299 1.12278 1.13303 1.03983 1.04013 1.04103 1.04253 1.04463 1.04732 1.0506 1.05445 1.05889 1.0639 1.06946 1.07558 1.08224 1.08944 1.09716 1.10538 1.11411 1.12333 1.13303 1.14319 1.05149 1.05178 1.05268 1.05416 1.05623 1.05889 1.06213 1.06595 1.07034 1.07529 1.0808 1.08685 1.09345 1.10057 1.10821 1.11636 1.125 1.13413 1.14373 1.1538 1.0636 1.0639 1.06478 1.06624 1.06829 1.07092 1.07413 1.0779 1.08224 1.08714 1.09259 1.09858 1.1051 1.11215 1.11971 1.12777 1.13633 1.14537 1.15488 1.16485 1.07616 1.07645 1.07732 1.07877 1.0808 1.0834 1.08657 1.0903 1.09459 1.09943 1.10482 1.11074 1.1172 1.12417 1.13165 1.13963 1.1481 1.15704 1.16646 1.17633 1.08915 1.08944 1.0903 1.09173 1.09373 1.0963 1.09943 1.10312 1.10736 1.11215 1.11747 1.12333 1.12971 1.13661 1.14401 1.1519 1.16028 1.16913 1.17845 1.18822 1.10255 1.10284 1.10369 1.1051 1.10708 1.10962 1.11271 1.11636 1.12055 1.12528 1.13054 1.13633 1.14264 1.14946 1.15677 1.16458 1.17287 1.18163 1.19085 1.20052 1.11636 1.11664 1.11747 1.11887 1.12083 1.12333 1.12639 1.12999 1.13413 1.1388 1.14401 1.14973 1.15596 1.1627 1.16994 1.17766 1.18585 1.19452 1.20364 1.21321 1.13054 1.13082 1.13165 1.13303 1.13496 1.13743 1.14045 1.14401 1.1481 1.15271 1.15785 1.16351 1.16967 1.17633 1.18348 1.19111 1.19922 1.20779 1.21681 1.22627 1.1451 1.14537 1.14619 1.14755 1.14946 1.1519 1.15488 1.15839 1.16243 1.16699 1.17207 1.17766 1.18374 1.19033 1.19739 1.20494 1.21295 1.22142 1.23035 1.23971 1.16001 1.16028 1.16109 1.16243 1.16431 1.16673 1.16967 1.17314 1.17713 1.18163 1.18664 1.19216 1.19818 1.20468 1.21166 1.21912 1.22704 1.23541 1.24424 1.2535 1.17527 1.17553 1.17633 1.17766 1.17951 1.18189 1.1848 1.18822 1.19216 1.19661 1.20156 1.20701 1.21295 1.21937 1.22627 1.23364 1.24147 1.24975 1.25847 1.26763 0.95 0.950329 0.951315 0.952956 0.955249 0.958188 0.961769 0.965984 0.970824 0.976281 0.982344 0.989002 0.996243 1.00405 1.01242 1.02133 1.03078 1.04073 1.05119 1.06213 0.950329 0.950658 0.951643 0.953284 0.955576 0.958514 0.962094 0.966307 0.971146 0.976601 0.982662 0.989318 0.996557 1.00437 1.01273 1.02164 1.03108 1.04103 1.05149 1.06243 0.951315 0.951643 0.952628 0.954267 0.956556 0.959492 0.963068 0.967277 0.972111 0.977561 0.983616 0.990265 0.997497 1.0053 1.01366 1.02256 1.03199 1.04193 1.05238 1.06331 0.952956 0.953284 0.954267 0.955903 0.958188 0.961119 0.964689 0.968891 0.973717 0.979158 0.985203 0.991842 0.999062 1.00685 1.0152 1.02408 1.0335 1.04343 1.05386 1.06478 0.955249 0.955576 0.956556 0.958188 0.960469 0.963392 0.966954 0.971146 0.975961 0.981389 0.987421 0.994045 1.00125 1.00902 1.01735 1.02622 1.03562 1.04553 1.05594 1.06683 0.958188 0.958514 0.959492 0.961119 0.963392 0.966307 0.969858 0.974038 0.978839 0.984251 0.990265 0.99687 1.00405 1.01181 1.02011 1.02896 1.03833 1.04821 1.0586 1.06946 0.961769 0.962094 0.963068 0.964689 0.966954 0.969858 0.973396 0.977561 0.982344 0.987737 0.99373 1.00031 1.00747 1.0152 1.02347 1.03229 1.04163 1.05149 1.06184 1.07267 0.965984 0.966307 0.967277 0.968891 0.971146 0.974038 0.977561 0.981708 0.986471 0.991842 0.99781 1.00437 1.0115 1.01919 1.02744 1.03622 1.04553 1.05534 1.06566 1.07645 0.970824 0.971146 0.972111 0.973717 0.975961 0.978839 0.982344 0.986471 0.991211 0.996557 1.0025 1.00902 1.01612 1.02378 1.03199 1.04073 1.05 1.05978 1.07005 1.0808 0.976281 0.976601 0.977561 0.979158 0.981389 0.984251 0.987737 0.991842 0.996557 1.00187 1.00778 1.01427 1.02133 1.02896 1.03712 1.04583 1.05505 1.06478 1.075 1.0857 0.982344 0.982662 0.983616 0.985203 0.987421 0.990265 0.99373 0.99781 1.0025 1.00778 1.01366 1.02011 1.02713 1.03471 1.04283 1.05149 1.06066 1.07034 1.08051 1.09116 0.989002 0.989318 0.990265 0.991842 0.994045 0.99687 1.00031 1.00437 1.00902 1.01427 1.02011 1.02652 1.0335 1.04103 1.04911 1.05771 1.06683 1.07645 1.08657 1.09716 0.996243 0.996557 0.997497 0.999062 1.00125 1.00405 1.00747 1.0115 1.01612 1.02133 1.02713 1.0335 1.04043 1.04791 1.05594 1.06448 1.07355 1.08311 1.09316 1.10369 1.00405 1.00437 1.0053 1.00685 1.00902 1.01181 1.0152 1.01919 1.02378 1.02896 1.03471 1.04103 1.04791 1.05534 1.06331 1.0718 1.0808 1.0903 1.10028 1.11074 1.01242 1.01273 1.01366 1.0152 1.01735 1.02011 1.02347 1.02744 1.03199 1.03712 1.04283 1.04911 1.05594 1.06331 1.07121 1.07964 1.08858 1.09801 1.10793 1.11831 1.02133 1.02164 1.02256 1.02408 1.02622 1.02896 1.03229 1.03622 1.04073 1.04583 1.05149 1.05771 1.06448 1.0718 1.07964 1.088 1.09687 1.10623 1.11608 1.12639 1.03078 1.03108 1.03199 1.0335 1.03562 1.03833 1.04163 1.04553 1.05 1.05505 1.06066 1.06683 1.07355 1.0808 1.08858 1.09687 1.10567 1.11496 1.12472 1.13496 1.04073 1.04103 1.04193 1.04343 1.04553 1.04821 1.05149 1.05534 1.05978 1.06478 1.07034 1.07645 1.08311 1.0903 1.09801 1.10623 1.11496 1.12417 1.13385 1.14401 1.05119 1.05149 1.05238 1.05386 1.05594 1.0586 1.06184 1.06566 1.07005 1.075 1.08051 1.08657 1.09316 1.10028 1.10793 1.11608 1.12472 1.13385 1.14346 1.15353 1.06213 1.06243 1.06331 1.06478 1.06683 1.06946 1.07267 1.07645 1.0808 1.0857 1.09116 1.09716 1.10369 1.11074 1.11831 1.12639 1.13496 1.14401 1.15353 1.16351 1.07355 1.07384 1.07471 1.07616 1.07819 1.0808 1.08397 1.08772 1.09202 1.09687 1.10227 1.10821 1.11467 1.12166 1.12916 1.13716 1.14564 1.15461 1.16404 1.17394 1.08541 1.0857 1.08657 1.088 1.09001 1.09259 1.09573 1.09943 1.10369 1.10849 1.11383 1.11971 1.12611 1.13303 1.14045 1.14837 1.15677 1.16565 1.175 1.1848 1.09772 1.09801 1.09886 1.10028 1.10227 1.10482 1.10793 1.11159 1.1158 1.12055 1.12583 1.13165 1.13798 1.14483 1.15217 1.16001 1.16833 1.17713 1.18638 1.19609 1.11046 1.11074 1.11159 1.11299 1.11496 1.11747 1.12055 1.12417 1.12833 1.13303 1.13826 1.14401 1.15027 1.15704 1.16431 1.17207 1.18031 1.18901 1.19818 1.20779 1.12361 1.12389 1.12472 1.12611 1.12805 1.13054 1.13358 1.13716 1.14127 1.14592 1.15109 1.15677 1.16297 1.16967 1.17686 1.18454 1.19269 1.2013 1.21037 1.21989 1.13716 1.13743 1.13826 1.13963 1.14155 1.14401 1.14701 1.15054 1.15461 1.1592 1.16431 1.16994 1.17606 1.18269 1.1898 1.19739 1.20546 1.21398 1.22296 1.23238 1.15109 1.15136 1.15217 1.15353 1.15542 1.15785 1.16082 1.16431 1.16833 1.17287 1.17792 1.18348 1.18954 1.19609 1.20312 1.21063 1.21861 1.22704 1.23592 1.24524 1.16539 1.16565 1.16646 1.1678 1.16967 1.17207 1.175 1.17845 1.18242 1.18691 1.1919 1.19739 1.20338 1.20986 1.21681 1.22423 1.23212 1.24046 1.24925 1.25847 1.18004 1.18031 1.1811 1.18242 1.18427 1.18664 1.18954 1.19295 1.19687 1.2013 1.20623 1.21166 1.21758 1.22398 1.23085 1.23819 1.24599 1.25424 1.26293 1.27206 1.19504 1.1953 1.19609 1.19739 1.19922 1.20156 1.20442 1.20779 1.21166 1.21604 1.22091 1.22627 1.23212 1.23845 1.24524 1.2525 1.26021 1.26837 1.27696 1.28598 0.975 0.97532 0.976281 0.97788 0.980115 0.98298 0.986471 0.990581 0.995301 1.00062 1.00654 1.01304 1.02011 1.02774 1.03592 1.04463 1.05386 1.0636 1.07384 1.08455 0.97532 0.975641 0.976601 0.9782 0.980434 0.983298 0.986788 0.990896 0.995615 1.00094 1.00685 1.01335 1.02042 1.02804 1.03622 1.04493 1.05416 1.0639 1.07413 1.08484 0.976281 0.976601 0.977561 0.979158 0.981389 0.984251 0.987737 0.991842 0.996557 1.00187 1.00778 1.01427 1.02133 1.02896 1.03712 1.04583 1.05505 1.06478 1.075 1.0857 0.97788 0.9782 0.979158 0.980752 0.98298 0.985837 0.989318 0.993416 0.998123 1.00343 1.00933 1.01581 1.02286 1.03047 1.03863 1.04732 1.05653 1.06624 1.07645 1.08714 0.980115 0.980434 0.981389 0.98298 0.985203 0.988054 0.991527 0.995615 1.00031 1.00561 1.0115 1.01796 1.025 1.03259 1.04073 1.0494 1.0586 1.06829 1.07848 1.08915 0.98298 0.983298 0.984251 0.985837 0.988054 0.990896 0.994359 0.998436 1.00312 1.0084 1.01427 1.02072 1.02774 1.03531 1.04343 1.05208 1.06125 1.07092 1.08109 1.09173 0.986471 0.986788 0.987737 0.989318 0.991527 0.994359 0.99781 1.00187 1.00654 1.01181 1.01766 1.02408 1.03108 1.03863 1.04672 1.05534 1.06448 1.07413 1.08426 1.09487 0.990581 0.990896 0.991842 0.993416 0.995615 0.998436 1.00187 1.00592 1.01057 1.01581 1.02164 1.02804 1.03501 1.04253 1.0506 1.05919 1.06829 1.0779 1.088 1.09858 0.995301 0.995615 0.996557 0.998123 1.00031 1.00312 1.00654 1.01057 1.0152 1.02042 1.02622 1.03259 1.03953 1.04702 1.05505 1.0636 1.07267 1.08224 1.0923 1.10284 1.00062 1.00094 1.00187 1.00343 1.00561 1.0084 1.01181 1.01581 1.02042 1.02561 1.03138 1.03773 1.04463 1.05208 1.06007 1.06859 1.07761 1.08714 1.09716 1.10764 1.00654 1.00685 1.00778 1.00933 1.0115 1.01427 1.01766 1.02164 1.02622 1.03138 1.03712 1.04343 1.0503 1.05771 1.06566 1.07413 1.08311 1.09259 1.10255 1.11299 1.01304 1.01335 1.01427 1.01581 1.01796 1.02072 1.02408 1.02804 1.03259 1.03773 1.04343 1.0497 1.05653 1.0639 1.0718 1.08022 1.08915 1.09858 1.10849 1.11887 1.02011 1.02042 1.02133 1.02286 1.025 1.02774 1.03108 1.03501 1.03953 1.04463 1.0503 1.05653 1.06331 1.07063 1.07848 1.08685 1.09573 1.1051 1.11496 1.12528 1.02774 1.02804 1.02896 1.03047 1.03259 1.03531 1.03863 1.04253 1.04702 1.05208 1.05771 1.0639 1.07063 1.0779 1.0857 1.09402 1.10284 1.11215 1.12194 1.1322 1.03592 1.03622 1.03712 1.03863 1.04073 1.04343 1.04672 1.0506 1.05505 1.06007 1.06566 1.0718 1.07848 1.0857 1.09345 1.1017 1.11046 1.11971 1.12944 1.13963 1.04463 1.04493 1.04583 1.04732 1.0494 1.05208 1.05534 1.05919 1.0636 1.06859 1.07413 1.08022 1.08685 1.09402 1.1017 1.1099 1.11859 1.12777 1.13743 1.14755 1.05386 1.05416 1.05505 1.05653 1.0586 1.06125 1.06448 1.06829 1.07267 1.07761 1.08311 1.08915 1.09573 1.10284 1.11046 1.11859 1.12722 1.13633 1.14592 1.15596 1.0636 1.0639 1.06478 1.06624 1.06829 1.07092 1.07413 1.0779 1.08224 1.08714 1.09259 1.09858 1.1051 1.11215 1.11971 1.12777 1.13633 1.14537 1.15488 1.16485 1.07384 1.07413 1.075 1.07645 1.07848 1.08109 1.08426 1.088 1.0923 1.09716 1.10255 1.10849 1.11496 1.12194 1.12944 1.13743 1.14592 1.15488 1.16431 1.1742 1.08455 1.08484 1.0857 1.08714 1.08915 1.09173 1.09487 1.09858 1.10284 1.10764 1.11299 1.11887 1.12528 1.1322 1.13963 1.14755 1.15596 1.16485 1.1742 1.18401 1.09573 1.09602 1.09687 1.09829 1.10028 1.10284 1.10595 1.10962 1.11383 1.11859 1.12389 1.12971 1.13606 1.14291 1.15027 1.15812 1.16646 1.17527 1.18454 1.19426 1.10736 1.10764 1.10849 1.1099 1.11187 1.11439 1.11747 1.1211 1.12528 1.12999 1.13523 1.141 1.14728 1.15407 1.16136 1.16913 1.17739 1.18612 1.1953 1.20494 1.11943 1.11971 1.12055 1.12194 1.12389 1.12639 1.12944 1.13303 1.13716 1.14182 1.14701 1.15271 1.15893 1.16565 1.17287 1.18057 1.18875 1.19739 1.20649 1.21604 1.13192 1.1322 1.13303 1.13441 1.13633 1.1388 1.14182 1.14537 1.14946 1.15407 1.1592 1.16485 1.171 1.17766 1.1848 1.19242 1.20052 1.20908 1.21809 1.22755 1.14483 1.1451 1.14592 1.14728 1.14918 1.15163 1.15461 1.15812 1.16216 1.16673 1.1718 1.17739 1.18348 1.19006 1.19713 1.20468 1.21269 1.22117 1.23009 1.23946 1.15812 1.15839 1.1592 1.16055 1.16243 1.16485 1.1678 1.17127 1.17527 1.17978 1.1848 1.19033 1.19635 1.20286 1.20986 1.21732 1.22526 1.23364 1.24248 1.25175 1.1718 1.17207 1.17287 1.1742 1.17606 1.17845 1.18137 1.1848 1.18875 1.19321 1.19818 1.20364 1.2096 1.21604 1.22296 1.23035 1.23819 1.2465 1.25524 1.26442 1.18585 1.18612 1.18691 1.18822 1.19006 1.19242 1.1953 1.1987 1.2026 1.20701 1.21192 1.21732 1.22321 1.22958 1.23643 1.24373 1.2515 1.25971 1.26837 1.27745 1.20026 1.20052 1.2013 1.2026 1.20442 1.20675 1.2096 1.21295 1.21681 1.22117 1.22602 1.23136 1.23718 1.24348 1.25025 1.25748 1.26516 1.27328 1.28184 1.29083 1.21501 1.21527 1.21604 1.21732 1.21912 1.22142 1.22423 1.22755 1.23136 1.23567 1.24046 1.24574 1.2515 1.25773 1.26442 1.27156 1.27916 1.2872 1.29567 1.30456 mayavi-4.5.0/mayavi/tests/data/shuttle.obj0000644000076500000240000003645212747716314021165 0ustar prabhustaff00000000000000# Viewpoint Datalabs International, Inc. Copyright 1996 mtllib ./vp.mtl g v 3.070224 -0.119728 0.996443 v 5.942016 -0.012019 4.157199 v 6.614015 -0.063428 4.157199 v 5.759114 0.000000 1.664500 v 3.070224 -0.449143 0.929434 v 5.000295 -0.539011 1.315104 v 3.070224 -0.604752 0.872464 v 3.070224 -0.866525 0.730690 v 3.070224 -0.959007 0.650256 v 3.070224 -1.053631 0.163277 v 2.983248 -1.080021 -0.880639 v 6.130317 -1.100022 -1.106943 v 3.739287 -4.334102 -0.876958 v 4.400283 -4.682100 -0.952940 v 3.038248 -4.334102 -0.811319 v 3.180259 -4.550090 -0.921939 v 2.700250 -4.334102 -0.947940 v 0.840214 -2.480049 -1.050312 v 1.208789 -1.060728 0.203820 v 1.208789 -1.054148 0.411073 v 1.208789 -0.958092 0.610367 v 1.208789 -0.875165 0.685964 v 1.208789 -0.621528 0.854704 v 1.208789 -0.467365 0.922276 v -4.649089 -1.039587 0.209476 v -4.649345 -0.922345 0.432259 v -4.649708 -0.652575 0.753550 v -4.999902 -1.012545 0.094530 v -4.999240 -0.870266 0.347384 v -4.999321 -0.802315 0.416133 v -4.906714 -0.620194 0.686502 v -4.999759 -0.491153 0.805206 v -5.568033 -0.119200 0.568687 v -5.349121 -0.814175 0.247113 v -5.348800 -0.938377 -0.030175 v -6.499984 -0.676000 -0.433500 v -6.499984 -0.610000 -0.164800 v -6.499984 -0.240000 0.109600 v -7.649984 0.000000 -0.620000 v 1.209237 -1.080021 -1.321617 v 3.070224 0.119728 0.996443 v 3.093016 0.040804 1.276300 v 6.614015 0.063428 4.157199 v 3.070224 0.449143 0.929434 v 5.000295 0.539011 1.315104 v 3.070224 0.604752 0.872464 v 3.070224 0.866525 0.730690 v 5.000295 1.149023 1.260104 v 3.070224 0.959007 0.650256 v 3.070224 1.053627 0.449897 v 5.000295 1.428028 0.442095 v 3.070224 1.053631 0.163277 v 2.983248 1.080021 -0.880639 v 5.000295 1.302926 -1.259946 v 3.739287 4.334102 -0.876958 v 4.400283 4.682100 -0.952940 v 3.038248 4.334102 -0.811319 v 3.180259 4.550090 -0.921939 v 1.209237 1.080021 -0.636414 v 2.700250 4.334102 -0.947940 v 0.169216 1.990039 -1.063281 v 1.208789 1.060728 0.203820 v 1.208789 1.054148 0.411073 v 1.208789 0.958092 0.610367 v 1.208789 0.875165 0.685964 v 1.208789 0.621528 0.854704 v 1.208789 0.467365 0.922276 v -4.649089 1.039587 0.209476 v -4.649345 0.922345 0.432259 v -4.649708 0.652575 0.753550 v -4.649856 0.514670 0.885149 v -4.649964 0.160748 0.994500 v -4.999902 1.012545 0.094530 v -4.999240 0.870266 0.347384 v -4.999321 0.802315 0.416133 v -4.999759 0.491153 0.805206 v -4.999948 0.160720 0.980689 v -5.299752 0.147914 0.811038 v -5.349121 0.814175 0.247113 v -5.348800 0.938377 -0.030175 v -6.499984 0.676000 -0.433500 v -6.499931 0.693962 -0.748535 v -6.499984 0.610000 -0.164800 v -6.499984 0.523000 -0.048800 v -6.499984 0.240000 0.109600 v 1.209237 1.080021 -1.321617 v -5.568033 0.119200 0.568687 v -5.299752 -0.147914 0.811038 v -4.999948 -0.160720 0.980689 v -4.649964 -0.160748 0.994500 v 1.208789 -0.130179 0.996071 v 1.208789 0.130179 0.996071 v 3.093016 -0.040804 1.276300 v 5.942016 0.012019 4.157199 v 7.043714 0.000000 4.157199 v 4.998233 -0.130896 1.193100 v 5.171283 -1.310384 -1.055942 v 6.130317 1.100022 -1.106943 v 2.983248 -1.080021 -1.351649 v 2.983248 1.080021 -1.351649 v -6.499931 -0.693962 -0.748535 v -4.999902 -1.000020 -0.943979 v 0.169216 -1.990039 -1.063281 v 5.000295 -1.510030 0.750093 v 5.000295 -0.874017 1.399122 v 5.000295 -1.149023 1.260104 v 5.000295 0.874017 1.399122 v -7.074984 -0.304058 -0.264426 v -7.074984 0.139529 -0.169387 v -7.074984 0.304058 -0.264426 v -7.074957 0.403450 -0.684268 v -7.074984 0.393008 -0.495246 v -7.074984 0.354637 -0.334026 v -7.074984 0.057454 -0.155083 v -7.074984 -0.354637 -0.334026 v -7.074984 -0.393008 -0.495246 v -7.074957 -0.403450 -0.684268 v -7.074984 -0.139529 -0.169387 v -7.074984 -0.057454 -0.155083 v 5.257180 -0.244260 -0.448877 v 5.275361 -0.389797 -0.446328 v 5.534085 -0.255527 -0.410058 v 5.858724 -0.171973 -0.364548 v 6.246687 -0.127423 -0.310161 v 6.245811 -0.209802 -0.310283 v 5.957494 -0.242908 -0.350702 v 5.684797 -0.367023 -0.388930 v 5.030259 -0.310424 -0.039389 v 5.218888 -0.403501 -0.175729 v 5.254566 -0.476272 -0.297997 v 5.497149 -0.409135 -0.146573 v 5.811742 -0.367356 -0.029404 v 6.194348 -0.345081 0.063191 v 6.203377 -0.386271 -0.007583 v 5.919040 -0.402825 -0.076394 v 5.661265 -0.464884 -0.221067 v 5.030257 -0.815056 -0.039376 v 5.218887 -0.721987 -0.175721 v 5.254566 -0.649223 -0.297993 v 5.497147 -0.716354 -0.146565 v 5.811740 -0.758129 -0.029394 v 6.194347 -0.780403 0.063202 v 6.203376 -0.739216 -0.007574 v 5.919039 -0.722663 -0.076386 v 5.661264 -0.660610 -0.221062 v 5.533661 -0.562752 -0.410117 v 5.257178 -0.881243 -0.448860 v 5.275359 -0.735706 -0.446319 v 5.534083 -0.869976 -0.410042 v 5.858722 -0.953530 -0.364528 v 6.246684 -0.998080 -0.310138 v 6.245809 -0.915701 -0.310265 v 5.957492 -0.882595 -0.350685 v 5.684796 -0.758480 -0.388920 v 5.151601 -0.815102 -0.904963 v 5.295470 -0.722016 -0.722016 v 5.296154 -0.649239 -0.594654 v 5.571022 -0.716382 -0.673535 v 5.905705 -0.758165 -0.699682 v 6.299025 -0.780442 -0.683500 v 6.288245 -0.739248 -0.612975 v 5.995947 -0.722692 -0.625000 v 5.708329 -0.660628 -0.556788 v 5.295474 -0.403530 -0.722041 v 5.296155 -0.476288 -0.594668 v 5.571025 -0.409163 -0.673559 v 5.905710 -0.367392 -0.699712 v 6.299029 -0.345120 -0.683534 v 6.288249 -0.386303 -0.613002 v 5.995951 -0.402854 -0.625025 v 5.708331 -0.464902 -0.556803 v 5.218888 0.403501 -0.175729 v 5.257180 0.244260 -0.448877 v 5.254566 0.476272 -0.297997 v 5.275361 0.389797 -0.446328 v 5.497149 0.409135 -0.146573 v 5.534085 0.255527 -0.410058 v 5.811742 0.367356 -0.029404 v 5.858724 0.171973 -0.364548 v 6.194348 0.345081 0.063191 v 6.246687 0.127423 -0.310161 v 6.203377 0.386271 -0.007583 v 6.245811 0.209802 -0.310283 v 5.919040 0.402825 -0.076394 v 5.957494 0.242908 -0.350702 v 5.661265 0.464884 -0.221067 v 5.684797 0.367023 -0.388930 v 5.218887 0.721987 -0.175721 v 5.254566 0.649223 -0.297993 v 5.497147 0.716354 -0.146565 v 5.811740 0.758129 -0.029394 v 6.194347 0.780403 0.063202 v 6.203376 0.739216 -0.007574 v 5.919039 0.722663 -0.076386 v 5.661264 0.660610 -0.221062 v 5.257178 0.881243 -0.448860 v 5.275359 0.735706 -0.446319 v 5.534083 0.869976 -0.410042 v 5.858722 0.953530 -0.364528 v 6.246684 0.998080 -0.310138 v 6.245809 0.915701 -0.310265 v 5.957492 0.882595 -0.350685 v 5.684796 0.758480 -0.388920 v 5.533661 0.562752 -0.410117 v 5.295470 0.722016 -0.722016 v 5.296154 0.649239 -0.594654 v 5.571022 0.716382 -0.673535 v 5.905705 0.758165 -0.699682 v 6.299025 0.780442 -0.683500 v 6.288245 0.739248 -0.612975 v 5.995947 0.722692 -0.625000 v 5.708329 0.660628 -0.556788 v 5.295474 0.403530 -0.722041 v 5.296155 0.476288 -0.594668 v 5.571025 0.409163 -0.673559 v 5.905710 0.367392 -0.699712 v 6.299029 0.345120 -0.683534 v 6.288249 0.386303 -0.613002 v 5.995951 0.402854 -0.625025 v 5.708331 0.464902 -0.556803 v 5.165639 -0.318491 0.637328 v 5.166101 -0.159250 0.913146 v 4.998497 -0.252327 1.074635 v 5.183997 -0.172954 0.637297 v 5.184248 -0.086480 0.787078 v 5.445252 -0.307224 0.636859 v 5.445698 -0.153617 0.902920 v 5.773065 -0.390779 0.636310 v 5.773632 -0.195395 0.974730 v 6.164821 -0.435329 0.635652 v 6.165453 -0.217671 1.012654 v 6.163937 -0.352950 0.635654 v 6.164450 -0.176480 0.941314 v 5.872800 -0.319843 0.636142 v 5.873264 -0.159926 0.913131 v 5.597437 -0.195729 0.636604 v 5.597722 -0.097867 0.806108 v 5.444824 0.000000 0.636860 v 5.166102 0.159236 0.913155 v 5.184248 0.086472 0.787083 v 5.445698 0.153603 0.902928 v 5.773632 0.195378 0.974740 v 6.165453 0.217651 1.012665 v 6.164450 0.176464 0.941323 v 5.873265 0.159912 0.913140 v 5.597722 0.097858 0.806113 v 5.165639 0.318491 0.637345 v 4.997765 0.504639 0.637636 v 5.183997 0.172954 0.637307 v 5.445252 0.307224 0.636875 v 5.773065 0.390779 0.636330 v 6.164821 0.435329 0.635675 v 6.163937 0.352950 0.635673 v 5.872800 0.319843 0.636159 v 5.597437 0.195729 0.636614 v 5.165176 0.159265 0.361518 v 4.997031 0.252350 0.200598 v 5.183746 0.086488 0.487521 v 5.444806 0.153631 0.370806 v 5.772497 0.195413 0.297899 v 6.164188 0.217691 0.258662 v 6.163424 0.176496 0.330003 v 5.872335 0.159941 0.359162 v 5.597153 0.097876 0.467105 v 5.165176 -0.159221 0.361493 v 4.997031 -0.252281 0.200558 v 5.183746 -0.086464 0.487507 v 5.444806 -0.153589 0.370782 v 5.772497 -0.195360 0.297868 v 6.164188 -0.217631 0.258628 v 6.163424 -0.176448 0.329975 v 5.872335 -0.159897 0.359136 v 5.597153 -0.097850 0.467090 v 5.090927 -1.067391 -0.472156 v 5.171283 1.310384 -1.055942 v 5.151606 0.310470 -0.905003 v 5.151606 -0.310470 -0.905003 v 5.030257 0.815056 -0.039376 v 5.030259 0.310424 -0.039389 v 5.090930 -0.058113 -0.472183 v 5.090930 0.058113 -0.472183 v 5.000295 -1.210004 0.173074 v 5.000295 1.210004 0.173074 v 5.000295 -1.428028 0.442095 v 4.997764 -0.504639 0.637610 v 4.998497 0.252304 1.074648 v 4.998233 0.130896 1.193100 v 5.000295 1.510030 0.750093 v 5.151601 0.815102 -0.904963 v 5.090927 1.067391 -0.472156 v 3.070224 -1.053627 0.449897 v -5.349205 0.737229 0.323968 v -5.349205 -0.737229 0.323968 v -5.349476 -0.470935 0.566062 v -6.499984 -0.098825 0.133439 v -6.499984 0.098825 0.133439 v -6.499984 -0.523000 -0.048800 v -5.349476 0.470935 0.566062 v -4.999902 1.000020 -0.943979 v 0.840214 2.480049 -1.050312 v 1.209237 -1.080021 -0.636414 v 3.804262 4.682100 -0.938960 v 5.000295 -1.302926 -1.259946 v 3.804262 -4.682100 -0.938960 v -4.649856 -0.514670 0.885149 v -4.999492 0.681710 0.569242 v -4.649417 0.860391 0.497003 v -4.906714 0.620194 0.686502 v -4.649417 -0.860391 0.497003 v -4.999492 -0.681710 0.569242 # 310 vertices # 0 vertex parms # 0 texture vertices # 0 normals g windows usemtl glass s 1 f 310 32 294 f 76 308 306 f 294 88 33 f 310 31 32 f 88 294 32 f 87 33 88 78 f 87 78 298 f 298 76 306 f 298 78 76 g tail usemtl bone s 4 f 95 3 96 4 f 4 287 43 95 f 94 2 3 43 f 3 2 93 96 f 41 1 93 42 f 41 42 287 f 43 3 95 f 287 42 94 43 f 42 93 2 94 f 96 93 1 g rearbody s 6 f 275 98 54 f 96 223 286 287 f 97 277 155 f 276 281 280 277 f 276 275 289 f 283 282 128 279 f 283 290 275 f 257 51 248 f 282 303 97 f 96 6 106 f 303 12 97 f 104 285 223 f 97 155 274 f 284 282 266 f 286 288 287 f 137 128 282 f 283 279 278 f 248 288 286 f 6 105 106 f 275 54 283 f 284 266 285 f 96 287 4 f 284 285 104 f 248 51 288 f 283 278 290 f 274 137 282 f 289 275 290 f 97 12 98 275 f 48 107 45 f 96 106 104 f 282 283 257 266 f 97 275 276 277 f 104 223 96 f 257 283 51 f 97 274 282 f 128 280 281 279 f 287 288 48 f 287 48 45 g body s 7 f 309 31 310 f 294 33 295 f 108 118 39 f 80 79 74 73 f 49 47 48 f 5 1 91 24 f 10 291 20 19 f 294 295 38 f 78 77 76 f 81 82 111 112 f 65 66 46 47 f 30 309 310 f 5 105 6 f 30 29 26 309 f 68 62 59 299 f 78 88 89 77 f 118 38 295 119 f 83 81 112 113 f 64 65 47 49 f 35 37 36 f 23 8 7 f 24 91 90 305 f 62 52 53 59 f 296 85 109 114 f 79 292 75 74 f 50 49 288 f 22 23 27 f 282 10 11 303 f 293 294 297 f 71 72 92 67 f 112 39 113 f 310 294 293 f 305 90 89 f 308 70 307 f 296 87 298 f 114 39 119 f 71 77 72 f 45 107 44 f 8 23 22 f 7 5 24 23 f 287 44 41 f 307 69 74 75 f 92 91 1 41 f 63 62 68 f 28 29 34 35 f 105 7 8 106 f 32 89 88 f 49 48 288 f 82 81 299 f 115 37 297 108 f 113 39 110 f 73 74 69 68 f 29 30 293 34 f 291 104 9 f 22 27 309 f 54 53 52 283 f 83 79 80 f 83 80 81 f 48 47 46 107 f 25 20 21 26 f 301 11 10 19 f 39 115 108 f 306 307 75 f 110 39 109 f 292 298 306 f 306 308 307 f 70 66 65 f 294 38 297 f 5 6 96 f 85 84 110 109 f 62 63 50 52 f 102 25 28 f 9 106 8 f 310 293 30 f 70 71 66 f 77 89 90 72 f 66 71 67 f 297 37 34 293 f 106 9 104 f 25 19 20 f 44 107 46 f 85 296 298 f 117 101 36 116 f 111 39 112 f 307 70 65 f 35 34 37 f 23 305 27 f 102 301 19 25 f 50 288 51 f 80 73 299 f 84 298 292 f 49 50 63 64 f 32 305 89 f 1 5 96 f 32 31 27 305 f 66 67 44 46 f 296 295 33 87 f 291 10 282 f 81 80 299 f 309 27 31 f 84 85 298 f 116 36 37 115 f 292 79 83 84 f 283 52 51 f 309 26 21 22 f 284 291 282 f 102 36 101 f 65 64 69 307 f 295 296 114 119 f 73 68 299 f 39 116 115 f 105 5 7 f 23 24 305 f 39 117 116 f 77 71 76 f 109 39 114 f 297 38 118 108 f 75 292 306 f 39 118 119 f 21 20 291 9 f 9 8 22 21 f 287 45 44 f 71 70 308 76 f 84 83 113 110 f 67 92 41 44 f 25 26 29 28 f 104 291 284 f 102 28 35 f 69 64 63 68 f 72 90 91 92 f 52 50 51 f 102 35 36 g wings s 5 f 16 15 17 f 304 15 16 f 300 57 60 f 14 13 304 f 59 53 55 57 f 60 57 58 f 18 301 103 f 300 59 57 f 304 13 15 f 56 55 53 54 f 15 13 11 301 f 61 59 300 f 57 55 302 f 103 301 102 f 17 15 301 f 303 11 13 14 f 58 57 302 f 302 55 56 f 17 301 18 f 299 59 61 g tiles usemtl fldkdkgrey s 3 f 302 56 54 f 18 103 40 f 16 17 99 f 86 61 300 f 99 304 16 f 303 14 304 f 99 303 304 f 17 18 99 f 302 54 100 f 58 302 100 f 100 86 300 f 18 40 99 f 100 60 58 f 100 300 60 f 101 117 111 82 f 102 101 82 299 f 117 39 111 f 99 100 54 303 f 303 54 98 12 f 86 100 99 40 f 40 103 61 86 f 299 61 103 102 g enginside usemtl redbrick s 9 f 238 255 246 f 194 202 201 193 f 153 162 163 154 f 144 153 154 145 f 184 194 193 182 f 238 246 237 f 272 234 232 271 f 236 237 235 234 f 204 195 186 f 134 143 144 135 f 143 152 153 144 f 204 203 195 f 237 246 245 235 f 273 236 234 272 f 238 237 236 f 185 184 182 183 f 135 144 145 136 f 154 163 146 f 195 203 202 194 f 235 245 244 233 f 264 273 272 263 f 219 185 183 218 f 187 186 184 185 f 136 145 146 f 161 169 170 162 f 204 220 212 f 255 264 263 254 f 234 235 233 232 f 186 195 194 184 f 145 154 146 f 152 161 162 153 f 204 212 203 f 246 255 254 245 f 238 236 273 f 204 187 220 f 169 125 126 170 f 126 135 136 127 f 163 171 146 f 203 212 211 202 f 245 254 253 244 f 238 273 264 f 211 219 218 210 f 170 126 127 171 f 127 136 146 f 162 170 171 163 f 202 211 210 201 f 238 264 255 f 254 263 262 253 f 212 220 219 211 f 171 127 146 f 125 134 135 126 f 204 186 187 f 220 187 185 219 f 263 272 271 262 g engout usemtl black f 251 260 259 250 f 209 217 216 208 f 157 165 166 158 f 132 141 142 133 f 179 178 176 177 f 215 177 175 214 f 270 230 228 269 f 227 241 240 225 f 191 199 198 190 f 150 159 160 151 f 131 140 141 132 f 177 176 174 175 f 230 231 229 228 f 269 228 226 268 f 229 242 241 227 f 192 200 199 191 f 139 148 149 140 f 130 139 140 131 f 180 192 191 178 f 228 229 227 226 f 268 226 224 267 f 231 243 242 229 f 176 190 189 174 f 140 149 150 141 f 149 158 159 150 f 190 198 197 189 f 243 252 251 242 f 259 268 267 258 f 216 179 177 215 f 181 180 178 179 f 121 130 131 122 f 167 123 124 168 f 208 216 215 207 f 250 259 258 249 f 252 261 260 251 f 198 207 206 197 f 158 166 167 159 f 123 132 133 124 f 166 122 123 167 f 207 215 214 206 f 261 270 269 260 f 241 250 249 240 f 199 208 207 198 f 159 167 168 160 f 122 131 132 123 f 165 121 122 166 f 217 181 179 216 f 260 269 268 259 f 242 251 250 241 f 200 209 208 199 f 148 157 158 149 f 141 150 151 142 f 178 191 190 176 f 226 227 225 224 g engmount usemtl brass s 11 f 225 240 239 222 f 164 120 121 165 f 128 137 138 129 f 196 205 289 290 f 265 221 285 266 f 206 214 213 205 f 138 147 148 139 f 174 189 188 172 f 249 258 256 247 f 221 222 223 285 f 155 277 164 156 f 274 155 156 147 f 213 173 281 276 f 258 267 265 256 f 189 197 196 188 f 120 129 130 121 f 173 172 279 281 f 239 247 248 286 f 205 213 276 289 f 137 274 147 138 f 156 164 165 157 f 224 225 222 221 f 247 256 257 248 f 172 188 278 279 f 280 128 129 120 f 188 196 290 278 f 256 265 266 257 f 214 175 173 213 f 147 156 157 148 f 175 174 172 173 f 240 249 247 239 f 222 239 286 223 f 277 280 120 164 f 129 138 139 130 f 197 206 205 196 f 267 224 221 265 g engrim usemtl dkdkgrey s off f 233 244 243 231 f 124 133 134 125 f 262 271 270 261 f 142 151 152 143 f 253 262 261 252 f 151 160 161 152 f 244 253 252 243 f 160 168 169 161 f 201 210 209 200 f 271 232 230 270 f 133 142 143 134 f 232 233 231 230 f 183 182 180 181 f 218 183 181 217 f 182 193 192 180 f 210 218 217 209 f 193 201 200 192 f 168 124 125 169 # 393 elements mayavi-4.5.0/mayavi/tests/data/texThres2.vtk0000644000076500000240000000224612747716314021411 0ustar prabhustaff00000000000000# vtk DataFile Version 1.0 Texture map for thresholding data (use boolean textures for 2D map) ASCII DATASET STRUCTURED_POINTS DIMENSIONS 128 1 1 ASPECT_RATIO 1 1 1 ORIGIN 0.0 0.0 0.0 POINT_DATA 128 COLOR_SCALARS texture 2 1.0 0 1.0 0 1.0 0 1.0 0 1.0 0 1.0 0 1.0 0 1.0 0 1.0 0 1.0 0 1.0 0 1.0 0 1.0 0 1.0 0 1.0 0 1.0 0 1.0 0 1.0 0 1.0 0 1.0 0 1.0 0 1.0 0 1.0 0 1.0 0 1.0 0 1.0 0 1.0 0 1.0 0 1.0 0 1.0 0 1.0 0 1.0 0 1.0 0 1.0 0 1.0 0 1.0 0 1.0 0 1.0 0 1.0 0 1.0 0 1.0 0 1.0 0 1.0 0 1.0 0 1.0 0 1.0 0 1.0 0 1.0 0 1.0 0 1.0 0 1.0 0 1.0 0 1.0 0 1.0 0 1.0 0 1.0 0 1.0 0 1.0 0 1.0 0 1.0 0 1.0 0 1.0 0 0.0 0.0 0.0 1.0 0.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 mayavi-4.5.0/mayavi/tests/data/thio3xx.xyz0000644000076500000240000015353312747716314021163 0ustar prabhustaff00000000000000 21 Comment S 0.93847 -1.65611 -0.74207 C 2.16065 -0.782 0.32718 C 2.29723 0.72462 0.06064 S 0.9218 1.79289 0.66141 C -0.2798 1.81206 -0.76037 C -1.72631 1.53867 -0.31437 S -2.31085 -0.20663 -0.32472 C -1.29776 -1.03185 0.9733 C -0.38115 -2.1402 0.43663 H 3.13882 -1.26125 0.14413 H 1.89816 -0.96537 1.38104 H 3.18428 1.10014 0.60087 H 2.46979 0.92418 -1.00905 H -0.22524 2.81515 -1.21665 H 0.04445 1.06882 -1.5023 H -2.416 2.02355 -1.02702 H -1.92886 1.98741 0.67237 H -1.99911 -1.48366 1.69705 H -0.71891 -0.25955 1.501 H -0.97141 -2.88225 -0.12587 H 0.08296 -2.67747 1.28327 21 Comment S 0.97547 -1.65611 -0.68674 C 2.14057 -0.782 0.43981 C 2.2909 0.72462 0.18079 S 0.88538 1.79289 0.71394 C -0.23962 1.81206 -0.77397 C -1.70749 1.53867 -0.40428 S -2.29123 -0.20663 -0.44003 C -1.34692 -1.03185 0.90405 C -0.40348 -2.1402 0.41608 H 3.12697 -1.26125 0.3082 H 1.82328 -0.96537 1.47849 H 3.14847 1.10014 0.7667 H 2.51921 0.92418 -0.87841 H -0.16126 2.81515 -1.22677 H 0.12301 1.06882 -1.49792 H -2.35894 2.02355 -1.15206 H -1.96141 1.98741 0.5705 H -2.08518 -1.48366 1.5901 H -0.79648 -0.25955 1.46132 H -0.96349 -2.88225 -0.17654 H 0.01569 -2.67747 1.28586 21 Comment S 1.00926 -1.65611 -0.62962 C 2.11462 -0.782 0.55124 C 2.2783 0.72462 0.30043 S 0.84599 1.79289 0.76442 C -0.19879 1.81206 -0.78545 C -1.68399 1.53867 -0.49309 S -2.26587 -0.20663 -0.55421 C -1.39239 -1.03185 0.83232 C -0.42471 -2.1402 0.39439 H 3.10656 -1.26125 0.47144 H 1.7434 -0.96537 1.57189 H 3.10403 1.10014 0.93043 H 2.56173 0.92418 -0.74536 H -0.09683 2.81515 -1.23353 H 0.20124 1.06882 -1.48943 H -2.29541 2.02355 -1.27394 H -1.98858 1.98741 0.46707 H -2.16554 -1.48366 1.47879 H -0.87187 -0.25955 1.41763 H -0.95293 -2.88225 -0.22672 H -0.05163 -2.67747 1.28491 21 Comment S 1.03976 -1.65611 -0.5709 C 2.08287 -0.782 0.66115 C 2.25946 0.72462 0.41926 S 0.80375 1.79289 0.81269 C -0.15741 1.81206 -0.79478 C -1.65588 1.53867 -0.58055 S -2.23483 -0.20663 -0.667 C -1.43404 -1.03185 0.75831 C -0.44477 -2.1402 0.37162 H 3.07762 -1.26125 0.63337 H 1.65875 -0.96537 1.66098 H 3.05108 1.10014 1.0916 H 2.59723 0.92418 -0.61027 H -0.03214 2.81515 -1.2369 H 0.27892 1.06882 -1.47686 H -2.22559 2.02355 -1.39232 H -2.0103 1.98741 0.36235 H -2.23997 -1.48366 1.36343 H -0.94487 -0.25955 1.37006 H -0.93976 -2.88225 -0.27629 H -0.1188 -2.67747 1.28045 21 Comment S 1.0669 -1.65611 -0.51079 C 2.04541 -0.782 0.76925 C 2.23442 0.72462 0.53694 S 0.7588 1.79289 0.85856 C -0.1156 1.81206 -0.80193 C -1.62322 1.53867 -0.66642 S -2.19818 -0.20663 -0.77813 C -1.47176 -1.03185 0.68222 C -0.46361 -2.1402 0.34784 H 3.04026 -1.26125 0.79358 H 1.56954 -0.96537 1.74551 H 2.98977 1.10014 1.24979 H 2.62561 0.92418 -0.47351 H 0.03264 2.81515 -1.23689 H 0.35583 1.06882 -1.46023 H -2.14967 2.02355 -1.5069 H -2.02651 1.98741 0.25664 H -2.30826 -1.48366 1.24433 H -1.01528 -0.25955 1.31873 H -0.92401 -2.88225 -0.32509 H -0.18566 -2.67747 1.27248 21 Comment S 1.09062 -1.65611 -0.44948 C 2.00235 -0.782 0.87525 C 2.20326 0.72462 0.65314 S 0.71128 1.79289 0.90187 C -0.07347 1.81206 -0.80688 C -1.58612 1.53867 -0.75046 S -2.15599 -0.20663 -0.88734 C -1.50545 -1.03185 0.60426 C -0.48117 -2.1402 0.3231 H 2.99456 -1.26125 0.9516 H 1.47604 -0.96537 1.82527 H 2.92026 1.10014 1.40455 H 2.64679 0.92418 -0.33544 H 0.09733 2.81515 -1.23349 H 0.43176 1.06882 -1.43961 H -2.06786 2.02355 -1.61734 H -2.03716 1.98741 0.15023 H -2.37022 -1.48366 1.12182 H -1.0829 -0.25955 1.26379 H -0.90573 -2.88225 -0.373 H -0.252 -2.67747 1.26102 21 Comment S 1.11088 -1.65611 -0.38717 C 1.9538 -0.782 0.97884 C 2.16605 0.72462 0.76755 S 0.66133 1.79289 0.94246 C -0.03114 1.81206 -0.80962 C -1.54467 1.53867 -0.83244 S -2.10837 -0.20663 -0.99435 C -1.53501 -1.03185 0.52464 C -0.49742 -2.1402 0.29747 H 2.94065 -1.26125 1.10702 H 1.37849 -0.96537 1.90001 H 2.84275 1.10014 1.55546 H 2.66072 0.92418 -0.19646 H 0.16175 2.81515 -1.2267 H 0.50651 1.06882 -1.41504 H -1.98038 2.02355 -1.72334 H -2.04223 1.98741 0.04341 H -2.42568 -1.48366 0.99623 H -1.14756 -0.25955 1.20538 H -0.88497 -2.88225 -0.41989 H -0.31765 -2.67747 1.2461 21 Comment S 1.12765 -1.65611 -0.32409 C 1.89989 -0.782 1.07976 C 2.12291 0.72462 0.87987 S 0.60913 1.79289 0.9802 C 0.01128 1.81206 -0.81014 C -1.49899 1.53867 -0.91214 S -2.05541 -0.20663 -1.09891 C -1.56036 -1.03185 0.44358 C -0.51231 -2.1402 0.27103 H 2.87869 -1.26125 1.25941 H 1.27716 -0.96537 1.96955 H 2.75745 1.10014 1.7021 H 2.66736 0.92418 -0.05694 H 0.22573 2.81515 -1.21656 H 0.57988 1.06882 -1.38659 H -1.88748 2.02355 -1.82463 H -2.0417 1.98741 -0.06353 H -2.47449 -1.48366 0.86791 H -1.20907 -0.25955 1.14367 H -0.86178 -2.88225 -0.46563 H -0.38243 -2.67747 1.22777 21 Comment S 1.14092 -1.65611 -0.26041 C 1.84078 -0.782 1.17771 C 2.07396 0.72462 0.98976 S 0.55485 1.79289 1.01495 C 0.05366 1.81206 -0.80844 C -1.4492 1.53867 -0.98934 S -1.99722 -0.20663 -1.20077 C -1.58144 -1.03185 0.36131 C -0.52579 -2.1402 0.24385 H 2.80883 -1.26125 1.40834 H 1.17233 -0.96537 2.0337 H 2.66459 1.10014 1.84409 H 2.66668 0.92418 0.08274 H 0.28909 2.81515 -1.20308 H 0.65165 1.06882 -1.35434 H -1.7894 2.02355 -1.92091 H -2.03558 1.98741 -0.1703 H -2.51653 -1.48366 0.73722 H -1.26727 -0.25955 1.07882 H -0.83623 -2.88225 -0.5101 H -0.44616 -2.67747 1.20607 21 Comment S 1.15069 -1.65611 -0.19636 C 1.77662 -0.782 1.27243 C 2.01931 0.72462 1.09695 S 0.49868 1.79289 1.04658 C 0.0959 1.81206 -0.80452 C -1.39543 1.53867 -1.06383 S -1.93394 -0.20663 -1.29966 C -1.59818 -1.03185 0.27805 C -0.53784 -2.1402 0.216 H 2.73127 -1.26125 1.55341 H 1.06429 -0.96537 2.09227 H 2.56442 1.10014 1.98101 H 2.6587 0.92418 0.22219 H 0.35166 2.81515 -1.1863 H 0.72164 1.06882 -1.31838 H -1.68641 2.02355 -2.01193 H -2.02388 1.98741 -0.2766 H -2.55166 -1.48366 0.60451 H -1.322 -0.25955 1.01102 H -0.80838 -2.88225 -0.55316 H -0.50867 -2.67747 1.18107 21 Comment S 1.15696 -1.65611 -0.13213 C 1.70759 -0.782 1.36367 C 1.95914 0.72462 1.20113 S 0.44079 1.79289 1.07499 C 0.13787 1.81206 -0.7984 C -1.33784 1.53867 -1.1354 S -1.8657 -0.20663 -1.39535 C -1.61054 -1.03185 0.19403 C -0.5484 -2.1402 0.18755 H 2.64623 -1.26125 1.69423 H 0.95333 -0.96537 2.1451 H 2.45723 1.10014 2.11251 H 2.64343 0.92418 0.36103 H 0.41326 2.81515 -1.16627 H 0.78965 1.06882 -1.27881 H -1.5788 2.02355 -2.09743 H -2.00663 1.98741 -0.38214 H -2.5798 -1.48366 0.47013 H -1.3731 -0.25955 0.94045 H -0.77833 -2.88225 -0.59471 H -0.56979 -2.67747 1.15283 21 Comment S 1.15975 -1.65611 -0.0679 C 1.63388 -0.782 1.45117 C 1.89359 0.72462 1.30202 S 0.38139 1.79289 1.10007 C 0.17947 1.81206 -0.79009 C -1.27659 1.53867 -1.20387 S -1.79266 -0.20663 -1.48759 C -1.61849 -1.03185 0.10947 C -0.55747 -2.1402 0.15859 H 2.55393 -1.26125 1.8304 H 0.83976 -0.96537 2.19205 H 2.3433 1.10014 2.23821 H 2.62091 0.92418 0.49888 H 0.47373 2.81515 -1.14304 H 0.85549 1.06882 -1.23573 H -1.46687 2.02355 -2.17718 H -1.98388 1.98741 -0.48664 H -2.60087 -1.48366 0.33447 H -1.42043 -0.25955 0.8673 H -0.74613 -2.88225 -0.63463 H -0.62934 -2.67747 1.12143 21 Comment S 1.1591 -1.65611 -0.00389 C 1.55569 -0.782 1.53469 C 1.82285 0.72462 1.39934 S 0.32068 1.79289 1.12176 C 0.22057 1.81206 -0.77962 C -1.21183 1.53867 -1.26903 S -1.71496 -0.20663 -1.57615 C -1.622 -1.03185 0.02462 C -0.565 -2.1402 0.1292 H 2.45464 -1.26125 1.96155 H 0.72389 -0.96537 2.233 H 2.22295 1.10014 2.35779 H 2.59121 0.92418 0.63536 H 0.5329 2.81515 -1.11668 H 0.91899 1.06882 -1.18926 H -1.35091 2.02355 -2.25097 H -1.95569 1.98741 -0.5898 H -2.61481 -1.48366 0.1979 H -1.46388 -0.25955 0.79177 H -0.7119 -2.88225 -0.67281 H -0.68717 -2.67747 1.08695 21 Comment S 1.15505 -1.65611 0.05974 C 1.47324 -0.782 1.61401 C 1.74712 0.72462 1.49282 S 0.25887 1.79289 1.13996 C 0.26107 1.81206 -0.767 C -1.14376 1.53867 -1.33071 S -1.63278 -0.20663 -1.66078 C -1.62107 -1.03185 -0.06031 C -0.57099 -2.1402 0.09945 H 2.34861 -1.26125 2.08733 H 0.60603 -0.96537 2.26782 H 2.09651 1.10014 2.4709 H 2.5544 0.92418 0.77011 H 0.59062 2.81515 -1.08726 H 0.97998 1.06882 -1.13954 H -1.23126 2.02355 -2.31858 H -1.92214 1.98741 -0.69134 H -2.62158 -1.48366 0.06078 H -1.50331 -0.25955 0.71407 H -0.67571 -2.88225 -0.70915 H -0.74311 -2.67747 1.0495 21 Comment S 1.14766 -1.65611 0.12279 C 1.38675 -0.782 1.6889 C 1.6666 0.72462 1.58221 S 0.19616 1.79289 1.15463 C 0.30086 1.81206 -0.75229 C -1.07254 1.53867 -1.38875 S -1.54631 -0.20663 -1.74127 C -1.61569 -1.03185 -0.14506 C -0.57541 -2.1402 0.06943 H 2.23615 -1.26125 2.20739 H 0.48651 -0.96537 2.29643 H 1.96432 1.10014 2.57723 H 2.5106 0.92418 0.90274 H 0.64671 2.81515 -1.05486 H 1.03827 1.06882 -1.08669 H -1.10822 2.02355 -2.37985 H -1.88333 1.98741 -0.79099 H -2.62117 -1.48366 -0.07651 H -1.53862 -0.25955 0.63441 H -0.63767 -2.88225 -0.74354 H -0.79702 -2.67747 1.00917 21 Comment S 1.13698 -1.65611 0.1851 C 1.29646 -0.782 1.75916 C 1.58151 0.72462 1.66726 S 0.13279 1.79289 1.16573 C 0.33982 1.81206 -0.73551 C -0.99839 1.53867 -1.44298 S -1.45574 -0.20663 -1.8174 C -1.60588 -1.03185 -0.22942 C -0.57826 -2.1402 0.03922 H 2.11756 -1.26125 2.32139 H 0.36566 -0.96537 2.31875 H 1.82674 1.10014 2.6765 H 2.45991 0.92418 1.0329 H 0.70103 2.81515 -1.01957 H 1.09372 1.06882 -1.03086 H -0.98215 2.02355 -2.43458 H -1.83935 1.98741 -0.88847 H -2.61358 -1.48366 -0.21359 H -1.56972 -0.25955 0.55302 H -0.59788 -2.88225 -0.7759 H -0.84875 -2.67747 0.96607 21 Comment S 1.12309 -1.65611 0.24649 C 1.20262 -0.782 1.8246 C 1.49208 0.72462 1.74775 S 0.06895 1.79289 1.17322 C 0.37784 1.81206 -0.71672 C -0.92151 1.53867 -1.49325 S -1.36127 -0.20663 -1.88896 C -1.59168 -1.03185 -0.31316 C -0.57952 -2.1402 0.00891 H 1.99317 -1.26125 2.42904 H 0.2438 -0.96537 2.33471 H 1.68416 1.10014 2.76844 H 2.40248 0.92418 1.16022 H 0.75343 2.81515 -0.98148 H 1.14617 1.06882 -0.9722 H -0.85339 2.02355 -2.48265 H -1.79033 1.98741 -0.98352 H -2.59882 -1.48366 -0.35008 H -1.59651 -0.25955 0.47011 H -0.55646 -2.88225 -0.80612 H -0.89814 -2.67747 0.92033 21 Comment S 1.10607 -1.65611 0.30681 C 1.10548 -0.782 1.88504 C 1.39856 0.72462 1.82344 S 0.00488 1.79289 1.17709 C 0.41484 1.81206 -0.69596 C -0.84209 1.53867 -1.53943 S -1.26312 -0.20663 -1.95574 C -1.57311 -1.03185 -0.39603 C -0.57919 -2.1402 -0.02143 H 1.86331 -1.26125 2.53002 H 0.12128 -0.96537 2.34427 H 1.53697 1.10014 2.85279 H 2.33847 0.92418 1.28437 H 0.80376 2.81515 -0.94071 H 1.19548 1.06882 -0.91089 H -0.72229 2.02355 -2.52391 H -1.7364 1.98741 -1.07587 H -2.57693 -1.48366 -0.48561 H -1.61892 -0.25955 0.38591 H -0.5135 -2.88225 -0.83414 H -0.94508 -2.67747 0.87206 21 Comment S 1.08601 -1.65611 0.36589 C 1.00531 -0.782 1.94031 C 1.30122 0.72462 1.89414 S -0.05922 1.79289 1.17735 C 0.45069 1.81206 -0.6733 C -0.76037 1.53867 -1.58139 S -1.16152 -0.20663 -2.01755 C -1.55022 -1.03185 -0.47782 C -0.57728 -2.1402 -0.05172 H 1.72835 -1.26125 2.62407 H -0.00158 -0.96537 2.3474 H 1.38556 1.10014 2.92932 H 2.26805 0.92418 1.40499 H 0.8519 2.81515 -0.89735 H 1.24152 1.06882 -0.84707 H -0.58921 2.02355 -2.55825 H -1.67772 1.98741 -1.16527 H -2.54799 -1.48366 -0.61981 H -1.6369 -0.25955 0.30065 H -0.46914 -2.88225 -0.85987 H -0.98942 -2.67747 0.82141 21 Comment S 1.06301 -1.65611 0.42359 C 0.90238 -0.782 1.99027 C 1.2003 0.72462 1.95964 S -0.12312 1.79289 1.174 C 0.48531 1.81206 -0.64879 C -0.67656 1.53867 -1.61902 S -1.05671 -0.20663 -2.07421 C -1.52309 -1.03185 -0.55829 C -0.57378 -2.1402 -0.08186 H 1.58864 -1.26125 2.71093 H -0.12443 -0.96537 2.3441 H 1.23035 1.10014 2.99782 H 2.19141 0.92418 1.52177 H 0.89769 2.81515 -0.85154 H 1.28415 1.06882 -0.78093 H -0.45451 2.02355 -2.58558 H -1.61443 1.98741 -1.25148 H -2.51206 -1.48366 -0.75231 H -1.65039 -0.25955 0.21457 H -0.4235 -2.88225 -0.88325 H -1.03106 -2.67747 0.7685 21 Comment S 1.03716 -1.65611 0.47978 C 0.79698 -0.782 2.03477 C 1.0961 0.72462 2.01978 S -0.18662 1.79289 1.16709 C 0.5186 1.81206 -0.6225 C -0.5909 1.53867 -1.65221 S -0.94893 -0.20663 -2.12554 C -1.49179 -1.03185 -0.63724 C -0.56871 -2.1402 -0.11178 H 1.44459 -1.26125 2.79036 H -0.24694 -0.96537 2.33438 H 1.07177 1.10014 3.0581 H 2.10876 0.92418 1.63437 H 0.94103 2.81515 -0.80339 H 1.32326 1.06882 -0.71266 H -0.31857 2.02355 -2.60583 H -1.54672 1.98741 -1.33426 H -2.46924 -1.48366 -0.88275 H -1.65936 -0.25955 0.1279 H -0.37669 -2.88225 -0.9042 H -1.06986 -2.67747 0.71349 21 Comment S 1.00857 -1.65611 0.53432 C 0.6894 -0.782 2.07369 C 0.98889 0.72462 2.07437 S -0.24951 1.79289 1.15664 C 0.55047 1.81206 -0.5945 C -0.50362 1.53867 -1.68087 S -0.83845 -0.20663 -2.17137 C -1.45639 -1.03185 -0.71444 C -0.56208 -2.1402 -0.14139 H 1.29657 -1.26125 2.86214 H -0.36877 -0.96537 2.31825 H 0.91025 1.10014 3.11 H 2.02033 0.92418 1.7425 H 0.98178 2.81515 -0.75304 H 1.35874 1.06882 -0.64243 H -0.18175 2.02355 -2.61893 H -1.47477 1.98741 -1.41338 H -2.41966 -1.48366 -1.01077 H -1.66378 -0.25955 0.04088 H -0.32886 -2.88225 -0.92268 H -1.10574 -2.67747 0.65652 21 Comment S 0.97735 -1.65611 0.58709 C 0.57992 -0.782 2.10693 C 0.87897 0.72462 2.12329 S -0.31157 1.79289 1.14271 C 0.58083 1.81206 -0.56488 C -0.41496 1.53867 -1.70493 S -0.72553 -0.20663 -2.21156 C -1.417 -1.03185 -0.78968 C -0.55391 -2.1402 -0.17061 H 1.145 -1.26125 2.92607 H -0.4896 -0.96537 2.29578 H 0.74624 1.10014 3.15338 H 1.92637 0.92418 1.84584 H 1.01985 2.81515 -0.70062 H 1.3905 1.06882 -0.57043 H -0.04444 2.02355 -2.62485 H -1.39878 1.98741 -1.48863 H -2.36344 -1.48366 -1.13602 H -1.66364 -0.25955 -0.04625 H -0.28012 -2.88225 -0.93862 H -1.13858 -2.67747 0.59775 21 Comment S 0.94362 -1.65611 0.63797 C 0.46886 -0.782 2.13439 C 0.76664 0.72462 2.16638 S -0.37261 1.79289 1.12538 C 0.6096 1.81206 -0.53371 C -0.32517 1.53867 -1.72431 S -0.61045 -0.20663 -2.24596 C -1.37373 -1.03185 -0.86276 C -0.54422 -2.1402 -0.19937 H 0.99029 -1.26125 2.98199 H -0.60908 -0.96537 2.26701 H 0.58018 1.10014 3.18811 H 1.82713 0.92418 1.94413 H 1.05512 2.81515 -0.64629 H 1.41845 1.06882 -0.49688 H 0.09299 2.02355 -2.62358 H -1.31895 1.98741 -1.55979 H -2.30075 -1.48366 -1.25816 H -1.65894 -0.25955 -0.13325 H -0.23061 -2.88225 -0.952 H -1.16831 -2.67747 0.53734 21 Comment S 0.9075 -1.65611 0.68687 C 0.35651 -0.782 2.156 C 0.65221 0.72462 2.20353 S -0.43243 1.79289 1.10472 C 0.63669 1.81206 -0.50107 C -0.23448 1.53867 -1.73896 S -0.49351 -0.20663 -2.27444 C -1.3267 -1.03185 -0.93347 C -0.53304 -2.1402 -0.22757 H 0.83287 -1.26125 3.02973 H -0.72689 -0.96537 2.23202 H 0.41253 1.10014 3.21411 H 1.72287 0.92418 2.03709 H 1.0875 2.81515 -0.59018 H 1.44251 1.06882 -0.42196 H 0.23017 2.02355 -2.61512 H -1.23551 1.98741 -1.62668 H -2.23175 -1.48366 -1.37685 H -1.64969 -0.25955 -0.21989 H -0.18047 -2.88225 -0.96276 H -1.19483 -2.67747 0.47546 21 Comment S 0.86912 -1.65611 0.73368 C 0.24319 -0.782 2.17171 C 0.53599 0.72462 2.23465 S -0.49085 1.79289 1.08083 C 0.66205 1.81206 -0.46706 C -0.14315 1.53867 -1.74885 S -0.37499 -0.20663 -2.2969 C -1.27602 -1.03185 -1.00163 C -0.5204 -2.1402 -0.25516 H 0.67317 -1.26125 3.06917 H -0.84271 -0.96537 2.19092 H 0.24376 1.10014 3.23129 H 1.6139 0.92418 2.12447 H 1.11689 2.81515 -0.53246 H 1.46262 1.06882 -0.34589 H 0.36672 2.02355 -2.59949 H -1.14869 1.98741 -1.68912 H -2.15663 -1.48366 -1.49176 H -1.63592 -0.25955 -0.30593 H -0.12983 -2.88225 -0.97089 H -1.21807 -2.67747 0.41227 21 Comment S 0.82858 -1.65611 0.77831 C 0.1292 -0.782 2.18146 C 0.4183 0.72462 2.25963 S -0.54769 1.79289 1.05381 C 0.68558 1.81206 -0.43178 C -0.05142 1.53867 -1.75394 S -0.25521 -0.20663 -2.31323 C -1.22185 -1.03185 -1.06704 C -0.50633 -2.1402 -0.28205 H 0.51162 -1.26125 3.10019 H -0.95622 -0.96537 2.14381 H 0.07431 1.10014 3.23962 H 1.5005 0.92418 2.20602 H 1.14323 2.81515 -0.47327 H 1.47872 1.06882 -0.26887 H 0.50227 2.02355 -2.57673 H -1.05871 1.98741 -1.74692 H -2.0756 -1.48366 -1.60259 H -1.61767 -0.25955 -0.39113 H -0.07884 -2.88225 -0.97635 H -1.23798 -2.67747 0.34796 21 Comment S 0.78604 -1.65611 0.82068 C 0.01485 -0.782 2.18523 C 0.29947 0.72462 2.27843 S -0.60277 1.79289 1.02377 C 0.70724 1.81206 -0.3953 C 0.04044 1.53867 -1.75423 S -0.13447 -0.20663 -2.32335 C -1.16434 -1.03185 -1.12952 C -0.49088 -2.1402 -0.30816 H 0.34866 -1.26125 3.12272 H -1.0671 -0.96537 2.09083 H -0.09534 1.10014 3.23907 H 1.38299 0.92418 2.28153 H 1.16643 2.81515 -0.41279 H 1.49076 1.06882 -0.19111 H 0.63643 2.02355 -2.54691 H -0.96583 1.98741 -1.79993 H -1.98888 -1.48366 -1.70902 H -1.59498 -0.25955 -0.47525 H -0.02764 -2.88225 -0.97914 H -1.25449 -2.67747 0.28269 21 Comment S 0.7416 -1.65611 0.86071 C -0.09954 -0.782 2.18301 C 0.17982 0.72462 2.29098 S -0.65593 1.79289 0.99084 C 0.72696 1.81206 -0.35775 C 0.1322 1.53867 -1.74971 S -0.01311 -0.20663 -2.32718 C -1.10363 -1.03185 -1.18891 C -0.47408 -2.1402 -0.33343 H 0.18476 -1.26125 3.13669 H -1.17507 -0.96537 2.03212 H -0.26473 1.10014 3.22964 H 1.26169 0.92418 2.35078 H 1.18644 2.81515 -0.35118 H 1.49872 1.06882 -0.11283 H 0.76886 2.02355 -2.51012 H -0.87031 1.98741 -1.84801 H -1.89671 -1.48366 -1.81077 H -1.56792 -0.25955 -0.55808 H 0.02364 -2.88225 -0.97924 H -1.26757 -2.67747 0.21665 21 Comment S 0.6954 -1.65611 0.89834 C -0.21365 -0.782 2.17481 C 0.05967 0.72462 2.29725 S -0.70703 1.79289 0.95516 C 0.74469 1.81206 -0.31921 C 0.22359 1.53867 -1.74039 S 0.10857 -0.20663 -2.32467 C -1.03989 -1.03185 -1.24504 C -0.45598 -2.1402 -0.35778 H 0.02034 -1.26125 3.14206 H -1.27981 -0.96537 1.96784 H -0.43339 1.10014 3.21136 H 1.13693 0.92418 2.41359 H 1.20319 2.81515 -0.28861 H 1.50257 1.06882 -0.03424 H 0.89917 2.02355 -2.46644 H -0.7724 1.98741 -1.89103 H -1.79935 -1.48366 -1.90755 H -1.53657 -0.25955 -0.63937 H 0.07486 -2.88225 -0.97666 H -1.27717 -2.67747 0.15001 21 Comment S 0.64757 -1.65611 0.93351 C -0.32718 -0.782 2.16065 C -0.06064 0.72462 2.29723 S -0.75591 1.79289 0.91685 C 0.76037 1.81206 -0.2798 C 0.31437 1.53867 -1.72631 S 0.23022 -0.20663 -2.3158 C -0.9733 -1.03185 -1.29776 C -0.43663 -2.1402 -0.38115 H -0.14413 -1.26125 3.13882 H -1.38104 -0.96537 1.89816 H -0.60087 1.10014 3.18428 H 1.00905 0.92418 2.46979 H 1.21665 2.81515 -0.22524 H 1.5023 1.06882 0.04445 H 1.02702 2.02355 -2.416 H -0.67237 1.98741 -1.92886 H -1.69705 -1.48366 -1.99911 H -1.501 -0.25955 -0.71891 H 0.12587 -2.88225 -0.97141 H -1.28327 -2.67747 0.08296 21 Comment S 0.59823 -1.65611 0.96617 C -0.43981 -0.782 2.14057 C -0.18079 0.72462 2.2909 S -0.80245 1.79289 0.87608 C 0.77397 1.81206 -0.23962 C 0.40428 1.53867 -1.70749 S 0.35151 -0.20663 -2.30053 C -0.90405 -1.03185 -1.34692 C -0.41608 -2.1402 -0.40348 H -0.3082 -1.26125 3.12697 H -1.47849 -0.96537 1.82328 H -0.7667 1.10014 3.14847 H 0.87841 0.92418 2.51921 H 1.22677 2.81515 -0.16126 H 1.49792 1.06882 0.12301 H 1.15206 2.02355 -2.35894 H -0.5705 1.98741 -1.96141 H -1.5901 -1.48366 -2.08518 H -1.46132 -0.25955 -0.79648 H 0.17654 -2.88225 -0.96349 H -1.28586 -2.67747 0.01569 21 Comment S 0.54752 -1.65611 0.99626 C -0.55124 -0.782 2.11462 C -0.30043 0.72462 2.2783 S -0.84653 1.79289 0.83299 C 0.78545 1.81206 -0.19879 C 0.49309 1.53867 -1.68399 S 0.47211 -0.20663 -2.27888 C -0.83232 -1.03185 -1.39239 C -0.39439 -2.1402 -0.42471 H -0.47144 -1.26125 3.10656 H -1.57189 -0.96537 1.7434 H -0.93043 1.10014 3.10403 H 0.74536 0.92418 2.56173 H 1.23353 2.81515 -0.09683 H 1.48943 1.06882 0.20124 H 1.27394 2.02355 -2.29541 H -0.46707 1.98741 -1.98858 H -1.47879 -1.48366 -2.16554 H -1.41763 -0.25955 -0.87187 H 0.22672 -2.88225 -0.95293 H -1.28491 -2.67747 -0.05163 21 Comment S 0.49556 -1.65611 1.02375 C -0.66115 -0.782 2.08287 C -0.41926 0.72462 2.25946 S -0.88803 1.79289 0.78774 C 0.79478 1.81206 -0.15741 C 0.58055 1.53867 -1.65588 S 0.59166 -0.20663 -2.25085 C -0.75831 -1.03185 -1.43404 C -0.37162 -2.1402 -0.44477 H -0.63337 -1.26125 3.07762 H -1.66098 -0.96537 1.65875 H -1.0916 1.10014 3.05108 H 0.61027 0.92418 2.59723 H 1.2369 2.81515 -0.03214 H 1.47686 1.06882 0.27892 H 1.39232 2.02355 -2.22559 H -0.36235 1.98741 -2.0103 H -1.36343 -1.48366 -2.23997 H -1.37006 -0.25955 -0.94487 H 0.27629 -2.88225 -0.93976 H -1.28045 -2.67747 -0.1188 21 Comment S 0.44249 -1.65611 1.0486 C -0.76925 -0.782 2.04541 C -0.53694 0.72462 2.23442 S -0.92686 1.79289 0.7405 C 0.80193 1.81206 -0.1156 C 0.66642 1.53867 -1.62322 S 0.70983 -0.20663 -2.21648 C -0.68222 -1.03185 -1.47176 C -0.34784 -2.1402 -0.46361 H -0.79358 -1.26125 3.04026 H -1.74551 -0.96537 1.56954 H -1.24979 1.10014 2.98977 H 0.47351 0.92418 2.62561 H 1.23689 2.81515 0.03264 H 1.46023 1.06882 0.35583 H 1.5069 2.02355 -2.14967 H -0.25664 1.98741 -2.02651 H -1.24433 -1.48366 -2.30826 H -1.31873 -0.25955 -1.01528 H 0.32509 -2.88225 -0.92401 H -1.27248 -2.67747 -0.18566 21 Comment S 0.38841 -1.65611 1.07078 C -0.87525 -0.782 2.00235 C -0.65314 0.72462 2.20326 S -0.96293 1.79289 0.69144 C 0.80688 1.81206 -0.07347 C 0.75046 1.53867 -1.58612 S 0.82627 -0.20663 -2.17583 C -0.60426 -1.03185 -1.50545 C -0.3231 -2.1402 -0.48117 H -0.9516 -1.26125 2.99456 H -1.82527 -0.96537 1.47604 H -1.40455 1.10014 2.92026 H 0.33544 0.92418 2.64679 H 1.23349 2.81515 0.09733 H 1.43961 1.06882 0.43176 H 1.61734 2.02355 -2.06786 H -0.15023 1.98741 -2.03716 H -1.12182 -1.48366 -2.37022 H -1.26379 -0.25955 -1.0829 H 0.373 -2.88225 -0.90573 H -1.26102 -2.67747 -0.252 21 Comment S 0.33347 -1.65611 1.09026 C -0.97884 -0.782 1.9538 C -0.76755 0.72462 2.16605 S -0.99616 1.79289 0.64072 C 0.80962 1.81206 -0.03114 C 0.83244 1.53867 -1.54467 S 0.94065 -0.20663 -2.12898 C -0.52464 -1.03185 -1.53501 C -0.29747 -2.1402 -0.49742 H -1.10702 -1.26125 2.94065 H -1.90001 -0.96537 1.37849 H -1.55546 1.10014 2.84275 H 0.19646 0.92418 2.66072 H 1.2267 2.81515 0.16175 H 1.41504 1.06882 0.50651 H 1.72334 2.02355 -1.98038 H -0.04341 1.98741 -2.04223 H -0.99623 -1.48366 -2.42568 H -1.20538 -0.25955 -1.14756 H 0.41989 -2.88225 -0.88497 H -1.2461 -2.67747 -0.31765 21 Comment S 0.27779 -1.65611 1.10704 C -1.07976 -0.782 1.89989 C -0.87987 0.72462 2.12291 S -1.0265 1.79289 0.58852 C 0.81014 1.81206 0.01128 C 0.91214 1.53867 -1.49899 S 1.05261 -0.20663 -2.07602 C -0.44358 -1.03185 -1.56036 C -0.27103 -2.1402 -0.51231 H -1.25941 -1.26125 2.87869 H -1.96955 -0.96537 1.27716 H -1.7021 1.10014 2.75745 H 0.05694 0.92418 2.66736 H 1.21656 2.81515 0.22573 H 1.38659 1.06882 0.57988 H 1.82463 2.02355 -1.88748 H 0.06353 1.98741 -2.0417 H -0.86791 -1.48366 -2.47449 H -1.14367 -0.25955 -1.20907 H 0.46563 -2.88225 -0.86178 H -1.22777 -2.67747 -0.38243 21 Comment S 0.22148 -1.65611 1.12108 C -1.17771 -0.782 1.84078 C -0.98976 0.72462 2.07396 S -1.05389 1.79289 0.53501 C 0.80844 1.81206 0.05366 C 0.98934 1.53867 -1.4492 S 1.16183 -0.20663 -2.01706 C -0.36131 -1.03185 -1.58144 C -0.24385 -2.1402 -0.52579 H -1.40834 -1.26125 2.80883 H -2.0337 -0.96537 1.17233 H -1.84409 1.10014 2.66459 H -0.08274 0.92418 2.66668 H 1.20308 2.81515 0.28909 H 1.35434 1.06882 0.65165 H 1.92091 2.02355 -1.7894 H 0.1703 1.98741 -2.03558 H -0.73722 -1.48366 -2.51653 H -1.07882 -0.25955 -1.26727 H 0.5101 -2.88225 -0.83623 H -1.20607 -2.67747 -0.44616 21 Comment S 0.16466 -1.65611 1.13239 C -1.27243 -0.782 1.77662 C -1.09695 0.72462 2.01931 S -1.07828 1.79289 0.48037 C 0.80452 1.81206 0.0959 C 1.06383 1.53867 -1.39543 S 1.26796 -0.20663 -1.95224 C -0.27805 -1.03185 -1.59818 C -0.216 -2.1402 -0.53784 H -1.55341 -1.26125 2.73127 H -2.09227 -0.96537 1.06429 H -1.98101 1.10014 2.56442 H -0.22219 0.92418 2.6587 H 1.1863 2.81515 0.35166 H 1.31838 1.06882 0.72164 H 2.01193 2.02355 -1.68641 H 0.2766 1.98741 -2.02388 H -0.60451 -1.48366 -2.55166 H -1.01102 -0.25955 -1.322 H 0.55316 -2.88225 -0.80838 H -1.18107 -2.67747 -0.50867 21 Comment S 0.10747 -1.65611 1.14094 C -1.36367 -0.782 1.70759 C -1.20113 0.72462 1.95914 S -1.09965 1.79289 0.42477 C 0.7984 1.81206 0.13787 C 1.1354 1.53867 -1.33784 S 1.37069 -0.20663 -1.88172 C -0.19403 -1.03185 -1.61054 C -0.18755 -2.1402 -0.5484 H -1.69423 -1.26125 2.64623 H -2.1451 -0.96537 0.95333 H -2.11251 1.10014 2.45723 H -0.36103 0.92418 2.64343 H 1.16627 2.81515 0.41326 H 1.27881 1.06882 0.78965 H 2.09743 2.02355 -1.5788 H 0.38214 1.98741 -2.00663 H -0.47013 -1.48366 -2.5798 H -0.94045 -0.25955 -1.3731 H 0.59471 -2.88225 -0.77833 H -1.15283 -2.67747 -0.56979 21 Comment S 0.05001 -1.65611 1.14675 C -1.45117 -0.782 1.63388 C -1.30202 0.72462 1.89359 S -1.11797 1.79289 0.36838 C 0.79009 1.81206 0.17947 C 1.20387 1.53867 -1.27659 S 1.46969 -0.20663 -1.80566 C -0.10947 -1.03185 -1.61849 C -0.15859 -2.1402 -0.55747 H -1.8304 -1.26125 2.55393 H -2.19205 -0.96537 0.83976 H -2.23821 1.10014 2.3433 H -0.49888 0.92418 2.62091 H 1.14304 2.81515 0.47373 H 1.23573 1.06882 0.85549 H 2.17718 2.02355 -1.46687 H 0.48664 1.98741 -1.98388 H -0.33447 -1.48366 -2.60087 H -0.8673 -0.25955 -1.42043 H 0.63463 -2.88225 -0.74613 H -1.12143 -2.67747 -0.62934 21 Comment S -0.0076 -1.65611 1.1498 C -1.53469 -0.782 1.55569 C -1.39934 0.72462 1.82285 S -1.13324 1.79289 0.31137 C 0.77962 1.81206 0.22057 C 1.26903 1.53867 -1.21183 S 1.56466 -0.20663 -1.72426 C -0.02462 -1.03185 -1.622 C -0.1292 -2.1402 -0.565 H -1.96155 -1.26125 2.45464 H -2.233 -0.96537 0.72389 H -2.35779 1.10014 2.22295 H -0.63536 0.92418 2.59121 H 1.11668 2.81515 0.5329 H 1.18926 1.06882 0.91899 H 2.25097 2.02355 -1.35091 H 0.5898 1.98741 -1.95569 H -0.1979 -1.48366 -2.61481 H -0.79177 -0.25955 -1.46388 H 0.67281 -2.88225 -0.7119 H -1.08695 -2.67747 -0.68717 21 Comment S -0.06524 -1.65611 1.1501 C -1.61401 -0.782 1.47324 C -1.49282 0.72462 1.74712 S -1.14546 1.79289 0.25391 C 0.767 1.81206 0.26107 C 1.33071 1.53867 -1.14376 S 1.65528 -0.20663 -1.63773 C 0.06031 -1.03185 -1.62107 C -0.09945 -2.1402 -0.57099 H -2.08733 -1.26125 2.34861 H -2.26782 -0.96537 0.60603 H -2.4709 1.10014 2.09651 H -0.77011 0.92418 2.5544 H 1.08726 2.81515 0.59062 H 1.13954 1.06882 0.97998 H 2.31858 2.02355 -1.23126 H 0.69134 1.98741 -1.92214 H -0.06078 -1.48366 -2.62158 H -0.71407 -0.25955 -1.50331 H 0.70915 -2.88225 -0.67571 H -1.0495 -2.67747 -0.74311 21 Comment S -0.12279 -1.65611 1.14766 C -1.6889 -0.782 1.38675 C -1.58221 0.72462 1.6666 S -1.15463 1.79289 0.19616 C 0.75229 1.81206 0.30086 C 1.38875 1.53867 -1.07254 S 1.74127 -0.20663 -1.54631 C 0.14506 -1.03185 -1.61569 C -0.06943 -2.1402 -0.57541 H -2.20739 -1.26125 2.23615 H -2.29643 -0.96537 0.48651 H -2.57723 1.10014 1.96432 H -0.90274 0.92418 2.5106 H 1.05486 2.81515 0.64671 H 1.08669 1.06882 1.03827 H 2.37985 2.02355 -1.10822 H 0.79099 1.98741 -1.88333 H 0.07651 -1.48366 -2.62117 H -0.63441 -0.25955 -1.53862 H 0.74354 -2.88225 -0.63767 H -1.00917 -2.67747 -0.79702 21 Comment S -0.18015 -1.65611 1.14248 C -1.75916 -0.782 1.29646 C -1.66726 0.72462 1.58151 S -1.16077 1.79289 0.13829 C 0.73551 1.81206 0.33982 C 1.44298 1.53867 -0.99839 S 1.82236 -0.20663 -1.45024 C 0.22942 -1.03185 -1.60588 C -0.03922 -2.1402 -0.57826 H -2.32139 -1.26125 2.11756 H -2.31875 -0.96537 0.36566 H -2.6765 1.10014 1.82674 H -1.0329 0.92418 2.45991 H 1.01957 2.81515 0.70103 H 1.03086 1.06882 1.09372 H 2.43458 2.02355 -0.98215 H 0.88847 1.98741 -1.83935 H 0.21359 -1.48366 -2.61358 H -0.55302 -0.25955 -1.56972 H 0.7759 -2.88225 -0.59788 H -0.96607 -2.67747 -0.84875 21 Comment S -0.23719 -1.65611 1.13458 C -1.8246 -0.782 1.20262 C -1.74775 0.72462 1.49208 S -1.16391 1.79289 0.08044 C 0.71672 1.81206 0.37784 C 1.49325 1.53867 -0.92151 S 1.89826 -0.20663 -1.34978 C 0.31316 -1.03185 -1.59168 C -0.00891 -2.1402 -0.57952 H -2.42904 -1.26125 1.99317 H -2.33471 -0.96537 0.2438 H -2.76844 1.10014 1.68416 H -1.16022 0.92418 2.40248 H 0.98148 2.81515 0.75343 H 0.9722 1.06882 1.14617 H 2.48265 2.02355 -0.85339 H 0.98352 1.98741 -1.79033 H 0.35008 -1.48366 -2.59882 H -0.47011 -0.25955 -1.59651 H 0.80612 -2.88225 -0.55646 H -0.92033 -2.67747 -0.89814 21 Comment S -0.2938 -1.65611 1.12397 C -1.88504 -0.782 1.10548 C -1.82344 0.72462 1.39856 S -1.16409 1.79289 0.02278 C 0.69596 1.81206 0.41484 C 1.53943 1.53867 -0.84209 S 1.96875 -0.20663 -1.24523 C 0.39603 -1.03185 -1.57311 C 0.02143 -2.1402 -0.57919 H -2.53002 -1.26125 1.86331 H -2.34427 -0.96537 0.12128 H -2.85279 1.10014 1.53697 H -1.28437 0.92418 2.33847 H 0.94071 2.81515 0.80376 H 0.91089 1.06882 1.19548 H 2.52391 2.02355 -0.72229 H 1.07587 1.98741 -1.7364 H 0.48561 -1.48366 -2.57693 H -0.38591 -0.25955 -1.61892 H 0.83414 -2.88225 -0.5135 H -0.87206 -2.67747 -0.94508 21 Comment S -0.34987 -1.65611 1.11067 C -1.94031 -0.782 1.00531 C -1.89414 0.72462 1.30122 S -1.16133 1.79289 -0.03456 C 0.6733 1.81206 0.45069 C 1.58139 1.53867 -0.76037 S 2.03357 -0.20663 -1.13686 C 0.47782 -1.03185 -1.55022 C 0.05172 -2.1402 -0.57728 H -2.62407 -1.26125 1.72835 H -2.3474 -0.96537 -0.00158 H -2.92932 1.10014 1.38556 H -1.40499 0.92418 2.26805 H 0.89735 2.81515 0.8519 H 0.84707 1.06882 1.24152 H 2.55825 2.02355 -0.58921 H 1.16527 1.98741 -1.67772 H 0.61981 -1.48366 -2.54799 H -0.30065 -0.25955 -1.6369 H 0.85987 -2.88225 -0.46914 H -0.82141 -2.67747 -0.98942 21 Comment S -0.40529 -1.65611 1.09471 C -1.99027 -0.782 0.90238 C -1.95964 0.72462 1.2003 S -1.1557 1.79289 -0.09142 C 0.64879 1.81206 0.48531 C 1.61902 1.53867 -0.67656 S 2.09251 -0.20663 -1.02501 C 0.55829 -1.03185 -1.52309 C 0.08186 -2.1402 -0.57378 H -2.71093 -1.26125 1.58864 H -2.3441 -0.96537 -0.12443 H -2.99782 1.10014 1.23035 H -1.52177 0.92418 2.19141 H 0.85154 2.81515 0.89769 H 0.78093 1.06882 1.28415 H 2.58558 2.02355 -0.45451 H 1.25148 1.98741 -1.61443 H 0.75231 -1.48366 -2.51206 H -0.21457 -0.25955 -1.65039 H 0.88325 -2.88225 -0.4235 H -0.7685 -2.67747 -1.03106 mayavi-4.5.0/mayavi/tests/data/tiny.q0000644000076500000240000000202012747716314020126 0ustar prabhustaff00000000000000<<?PGfff?fff?fff?fff?fff?fff?fff?fff?•?•?•?•?•?•?•?•?q=?q=?q=?q=?q=?q=?q=?q=?p}?p}?p}?p}?p}?p}?p}?p}?~@~@~@~@~@~@~@~@?PGfff?fff?fff?fff?fff?fff?fff?fff?•?•?•?•?•?•?•?•?q=?q=?q=?q=?q=?q=?q=?q=?p}?p}?p}?p}?p}?p}?p}?p}?~@~@~@~@~@~@~@~@?PGfff?fff?fff?fff?fff?fff?fff?fff?•?•?•?•?•?•?•?•?q=?q=?q=?q=?q=?q=?q=?q=?p}?p}?p}?p}?p}?p}?p}?p}?~@~@~@~@~@~@~@~@?PGfff?fff?fff?fff?fff?fff?fff?fff?•?•?•?•?•?•?•?•?q=?q=?q=?q=?q=?q=?q=?q=?p}?p}?p}?p}?p}?p}?p}?p}?~@~@~@~@~@~@~@~@?PGfff?fff?fff?fff?fff?fff?fff?fff?•?•?•?•?•?•?•?•?q=?q=?q=?q=?q=?q=?q=?q=?p}?p}?p}?p}?p}?p}?p}?p}?~@~@~@~@~@~@~@~@mayavi-4.5.0/mayavi/tests/data/tiny.xyz0000644000076500000240000000113012747716314020521 0ustar prabhustaff00000000000000<<`?@?@?@?@??@@??@@????@@@@``@@@@@@@@@@@@??@@??@@????@@@@``@@@@@@@@@@@@??@@??@@????@@@@``@@@@@@@@??@@??@@????@@@@``@@@@@@@@??@@??@@????@@@@`mayavi-4.5.0/mayavi/tests/data/uGridEx.vtk0000644000076500000240000000176412747716314021074 0ustar prabhustaff00000000000000# vtk DataFile Version 1.0 Unstructured Grid Example ASCII DATASET UNSTRUCTURED_GRID POINTS 27 float 0.0 0.0 0.0 1.0 0.0 0.0 2.0 0.0 0.0 0.0 1.0 0.0 1.0 1.0 0.0 2.0 1.0 0.0 0.0 0.0 1.0 1.0 0.0 1.0 2.0 0.0 1.0 0.0 1.0 1.0 1.0 1.0 1.0 2.0 1.0 1.0 0.0 1.0 2.0 1.0 1.0 2.0 2.0 1.0 2.0 0.0 1.0 3.0 1.0 1.0 3.0 2.0 1.0 3.0 0.0 1.0 4.0 1.0 1.0 4.0 2.0 1.0 4.0 0.0 1.0 5.0 1.0 1.0 5.0 2.0 1.0 5.0 0.0 1.0 6.0 1.0 1.0 6.0 2.0 1.0 6.0 CELLS 12 63 8 0 1 4 3 6 7 10 9 8 1 2 5 4 7 8 11 10 4 7 10 9 12 4 8 11 10 14 6 15 16 17 14 13 12 6 18 15 19 16 20 17 4 22 23 20 19 3 21 22 18 3 22 19 18 2 23 26 2 21 24 1 25 CELL_TYPES 12 12 12 10 10 7 6 9 5 5 3 3 1 POINT_DATA 27 SCALARS scalars float LOOKUP_TABLE default 0.0 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 10.0 11.0 12.0 13.0 14.0 15.0 16.0 17.0 18.0 19.0 20.0 21.0 22.0 23.0 24.0 25.0 26.0 VECTORS vectors float 1 0 0 1 1 0 0 2 0 1 0 0 1 1 0 0 2 0 1 0 0 1 1 0 0 2 0 1 0 0 1 1 0 0 2 0 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 0 0 1 mayavi-4.5.0/mayavi/tests/data_reader_test_base.py0000644000076500000240000000570712747716314022725 0ustar prabhustaff00000000000000# Author: Suyog Dutt Jain # Copyright (c) 2009, Enthought, Inc. # License: BSD Style. # Standard library imports. from os.path import abspath from io import BytesIO import copy import unittest import numpy from mayavi.core.null_engine import NullEngine from mayavi.modules.outline import Outline class DataReaderTestBase(unittest.TestCase): def setup_reader(self): """"Setup the reader in here. This is called after the engine has been created and started. The engine is available as self.e. This method is called by setUp(). """ raise NotImplementedError() def setup_viz(self): """Setup the visualization.""" # Create an outline for the data. o = Outline() self.e.add_module(o) def setUp(self): e = NullEngine() # Uncomment to see visualization for debugging etc. #e = Engine() e.start() self.e = e s = e.new_scene() self.scene = e.current_scene self.setup_reader() self.setup_viz() return def tearDown(self): """For necessary clean up, automatically called by TestCase after the test methods have been invoked""" self.e.stop() return def check(self, scene, bounds, error = 1.01e-02): """Do the actual testing.""" src = scene.children[0] ot = src.children[0].children[0] ot.render() # Flush the pipeline. # Check the outline bounds got = ot.outline_filter.output.bounds msg = "Got: %s; expected: %s"%(got, bounds) self.assertEqual(numpy.allclose(got, bounds, atol=error), True, msg) def check_saving(self, engine, scene, bounds, error = 1.01e-02): # Save visualization. f = BytesIO() f.name = abspath('test.mv2') # We simulate a file. engine.save_visualization(f) f.seek(0) # So we can read this saved data. # Remove existing scene. engine.close_scene(scene) # Load visualization engine.load_visualization(f) self.scene = engine.current_scene self.check(scene,bounds,error) def check_deepcopying(self, scene, bounds, error = 1.01e-02): """Test if the MayaVi2 visualization can be deep-copied.""" ############################################################ # Test if the MayaVi2 visualization can be deep-copied. # Pop the source object. source = scene.children.pop() # Add it back to see if that works without error. scene.children.append(source) self.check(scene, bounds, error) # Now deepcopy the source and replace the existing one with # the copy. This basically simulates cutting/copying the # object from the UI via the right-click menu on the tree # view, and pasting the copy back. source1 = copy.deepcopy(source) scene.children[0] = source1 self.check(scene, bounds, error) mayavi-4.5.0/mayavi/tests/datasets.py0000644000076500000240000001254212747716314020244 0ustar prabhustaff00000000000000# Author: Suyog Dutt Jain # Prabhu Ramachandran # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. # Standard library imports. import numpy from numpy import linspace, cos, sin, pi, empty, sqrt,array,arange,random # Enthought library imports from tvtk.api import tvtk def generate_annulus(r=None, theta=None, z=None): """ Generate points for structured grid for a cylindrical annular volume. This method is useful for generating a unstructured cylindrical mesh for VTK (and perhaps other tools). Parameters ---------- r : array : The radial values of the grid points. It defaults to linspace(1.0, 2.0, 11). theta : array : The angular values of the x axis for the grid points. It defaults to linspace(0,2*pi,11). z: array : The values along the z axis of the grid points. It defaults to linspace(0,0,1.0, 11). Return ------ points : array Nx3 array of points that make up the volume of the annulus. They are organized in planes starting with the first value of z and with the inside "ring" of the plane as the first set of points. The default point array will be 1331x3. """ # Default values for the annular grid. if r is None: r = linspace(1.0,2.0, 11) if theta is None: theta = linspace(0,2*pi,11) if z is None: z = linspace(0.0,1.0, 11) # Find the x values and y values for each plane. x_plane = (cos(theta)*r[:,None]).ravel() y_plane = (sin(theta)*r[:,None]).ravel() # Allocate an array for all the points. We'll have len(x_plane) # points on each plane, and we have a plane for each z value, so # we need len(x_plane)*len(z) points. points = empty([len(x_plane)*len(z),3]) # Loop through the points for each plane and fill them with the # correct x,y,z values. start = 0 for z_plane in z: end = start+len(x_plane) # slice out a plane of the output points and fill it # with the x,y, and z values for this plane. The x,y # values are the same for every plane. The z value # is set to the current z plane_points = points[start:end] plane_points[:,0] = x_plane plane_points[:,1] = y_plane plane_points[:,2] = z_plane start = end return points def single_type_ug(): """Simple example showing how to create an unstructured grid consisting of cells of a single type. """ points = array([[0,0,0], [1,0,0], [0,1,0], [0,0,1], # tets [1,0,0], [2,0,0], [1,1,0], [1,0,1], [2,0,0], [3,0,0], [2,1,0], [2,0,1], ], 'f') tets = array([[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]]) tet_type = tvtk.Tetra().cell_type ug = tvtk.UnstructuredGrid(points=points) ug.set_cells(tet_type, tets) return ug def mixed_type_ug(): """A slightly more complex example of how to generate an unstructured grid with different cell types. Returns a created unstructured grid. """ points = array([[0,0,0], [1,0,0], [0,1,0], [0,0,1], # tetra [2,0,0], [3,0,0], [3,1,0], [2,1,0], [2,0,1], [3,0,1], [3,1,1], [2,1,1], # Hex ], 'f') # shift the points so we can show both. points[:,1] += 2.0 # The cells cells = array([4, 0, 1, 2, 3, # tetra 8, 4, 5, 6, 7, 8, 9, 10, 11 # hex ]) # The offsets for the cells, i.e. the indices where the cells # start. offset = array([0, 5]) tetra_type = tvtk.Tetra().cell_type # VTK_TETRA == 10 hex_type = tvtk.Hexahedron().cell_type # VTK_HEXAHEDRON == 12 cell_types = array([tetra_type, hex_type]) # Create the array of cells unambiguously. cell_array = tvtk.CellArray() cell_array.set_cells(2, cells) # Now create the UG. ug = tvtk.UnstructuredGrid(points=points) # Now just set the cell types and reuse the ug locations and cells. ug.set_cells(cell_types, offset, cell_array) return ug def generateStructuredGrid(): """Generates Structured Grid""" dims = (32, 32, 12) sgrid = tvtk.StructuredGrid(dimensions=(dims[1], dims[0], dims[2])) r = linspace(1, 10, dims[0]) theta = linspace(0, 2*numpy.pi, dims[1]) z = linspace(0, 5, dims[2]) pts = generate_annulus(r, theta, z) sgrid.points = pts s = sqrt(pts[:,0]**2 + pts[:,1]**2 + pts[:,2]**2) sgrid.point_data.scalars = numpy.ravel(s.copy()) sgrid.point_data.scalars.name = 'scalars' return sgrid def generateUnstructuredGrid_single(): """Generates Untructured Grid""" ug = single_type_ug() temperature = arange(0, 120, 10, 'd') velocity = random.randn(12, 3) ug.point_data.scalars = temperature ug.point_data.scalars.name = 'temperature' # Some vectors. ug.point_data.vectors = velocity ug.point_data.vectors.name = 'velocity' return ug def generateUnstructuredGrid_mixed(): """Generates Untructured Grid""" ug = mixed_type_ug() temperature = arange(0, 120, 10, 'd') velocity = random.randn(12, 3) ug.point_data.scalars = temperature ug.point_data.scalars.name = 'temperature' # Some vectors. ug.point_data.vectors = velocity ug.point_data.vectors.name = 'velocity' return ug mayavi-4.5.0/mayavi/tests/README.txt0000644000076500000240000000241412747716314017555 0ustar prabhustaff00000000000000======================= Notes on testing Mayavi ======================= This directory contains unit tests for mayavi. Running the tests ================= The best way to run the tests in this directory is to do:: $ ./runtests.py . Try ``runtests.py --help`` to see all help options. You may also run each test individually. For example:: $ python test_contour.py You can also use nosetests but nosetests runs everything in the same process often tripping up on valid tests. Debugging using on-screen rendering =================================== Many of these unit tests run off screen and make use of TestEngine. TestEngine can be replaced by Engine to allow for scene creation which may be useful in debugging. This can be easily done by uncommenting the following line from the setUp() functions:: e = Engine() # This is commented by default It must be followed by the commenting of : e = TestEngine() # This is uncommented by default Debugging using an IPython Shell =================================== The IPython Shell can be embedded anywhere in the program. You need to import the `IPython` module and then add the following lines wherver you want to embed the shell:: embedshell = IPython.Shell.IPShellEmbed() embedshell() mayavi-4.5.0/mayavi/tests/runtests.py0000644000076500000240000001540012747716314020317 0ustar prabhustaff00000000000000#!/usr/bin/env python """Script to run all the tests each in its own subprocess to ensure maximal correctness and minimal pain. This does make running the tests quite slow but the tests will be run correctly -- which is the important thing. """ # Author: Prabhu Ramachandran # Copyright (c) 2009-2015, Enthought Inc. # License: BSD Style. from __future__ import print_function import sys from os.path import dirname, join, isfile, isdir from glob import glob import subprocess import time import re import optparse # Use nosetests when it is available USE_NOSE = False def get_test_runner(): """Get a test runner for the tests. Uses nose if available.""" result = [sys.executable] if USE_NOSE: try: import nose except ImportError: result = [sys.executable] else: result = ['nosetests'] return result def get_tests_in_dir(pth): """Get all tests in given directory `pth`.""" files = [] files.extend(glob(join(pth, 'test*.py'))) files.extend(glob(join(pth, '*_test_case.py'))) files.extend(glob(join(pth, 'test', 'test*.py'))) files.extend(glob(join(pth, 'test', '*_test_case.py'))) files.extend(glob(join(pth, 'tests', 'test*.py'))) files.extend(glob(join(pth, 'tests', '*_test_case.py'))) return files def find_tests(tests): """Find test files given list of arguments which may be files, directories or modules.""" files = [] for test in tests: if isfile(test): files.append(test) elif isdir(test): files.extend(get_tests_in_dir(test)) else: # A module. try: # Import the module components = test.split('.') if len(components) > 1: modname = '.'.join(components[:-1]) symbol = components[-1] mod = __import__(modname, globals(), locals(), [symbol]) s = getattr(mod, symbol) d = dirname(s.__file__) else: modname = components[0] mod = __import__(modname, globals(), locals(), []) d = dirname(mod.__file__) files.extend(get_tests_in_dir(d)) except ImportError: msg = 'Warning: %s is neither a file/directory or '\ 'module. Ignoring.'%test print(msg) return files def run(tests, verbose=1): """Run the given tests. Each test file is run as a unittest in a subprocess. **Parameters** :tests: List of test file paths to run as tests. These tests are best written as unittests. :verbose: An integer in (0, 1, 2). 0 specifies no output. 1 specifies moderate output and 2 very verbose output. **Returns** The error code is returned. If there are errors this is 1 if everything ran fine it returns 0. """ PIPE = subprocess.PIPE errors = [] total = 0 tot_err = 0 tot_fail = 0 total_time = 0.0 cmd_base = get_test_runner() has_nose = 'nosetests' in cmd_base for test in tests: if verbose > 1 and has_nose: cmd = cmd_base + ['-v', test] else: cmd = cmd_base + [test] # Run the test in a subprocess. if verbose > 1: print('Running:', ' '.join(cmd)) t1 = time.time() pipe = subprocess.Popen(cmd, stdout=PIPE, stderr=PIPE, close_fds=True) # Get the status, stdout and stderr. st = pipe.wait() t2 = time.time() out, err = pipe.communicate() # Calculate number of tests run, errors and failures based on output. res = re.search('Ran\s*(\d*)\s*test', err) nt = 1 if res: nt = int(res.group(1)) total += nt res = re.search('failures=(\d*)', err) nfail = 0 if res: nfail = int(res.group(1)) nerr = 0 res = re.search('errors=(\d*)', err) if res: nerr = int(res.group(1)) tot_err += nerr tot_fail += nfail # Print output catching any errors. if verbose > 0: nsuccess = nt - nerr - nfail res = '.'*nsuccess + 'F'*nfail + 'E'*nerr sys.stdout.write(res) if st != 0: errors.append([test, st, out, err, t2 - t1]) if verbose > 1: print(out) print(err) sys.stdout.flush() total_time += t2 - t1 print('\n' + '-'*70) print("Ran %d tests in %.4g seconds\n"%(total, total_time)) errorcode = 0 if len(errors) > 0: print('FAILED: there were %d failures and %d errors'\ %(tot_fail, tot_err)) for err in errors: test, st, out, err, t = err print('File:', test) print(out) print(err) errorcode = 1 else: print('OK') return errorcode def m2_tests(verbose=1): """Run all the TVTK and mayavi tests. """ if verbose > 0: print("-"*70) print("Running TVTK tests.") tests = find_tests(['tvtk']) err = run(tests, verbose) if verbose > 0: print("-"*70) print("Running Mayavi tests.") tests = find_tests(['mayavi']) err += run(tests, verbose) return err def main(): usage = """%prog [options] directories/files/modules This program runs any tests in the given files and directories and also scans a module's directory for directories called 'tests' or 'test' which contain 'test_*.py' files and runs them each in a separate subprocess. """ parser = optparse.OptionParser(usage) parser.add_option("-v", "--verbose", action="store_true", default=False, dest="verbose", help="run tests in verbose mode") parser.add_option("-q", "--quiet", action="store_true", default=False, dest="quiet", help="run tests in quiet mode") parser.add_option("-n", "--nose", action="store_true", default=False, dest="nose", help="run tests using nose if it is available") options, args = parser.parse_args() verbose = 1 global USE_NOSE if options.nose: USE_NOSE = True if options.verbose: verbose = 2 if options.quiet: verbose = 0 status = 0 if len(args) == 0: status = m2_tests(verbose) else: tests = find_tests(args) if len(tests) > 0: status = run(tests, verbose=verbose) sys.exit(status) if __name__ == "__main__": main() mayavi-4.5.0/mayavi/tests/test_array_source.py0000644000076500000240000001541212747716314022170 0ustar prabhustaff00000000000000""" Tests for the ArraySource class. """ # Author: Prabhu Ramachandran # Copyright (c) 2008, Prabhu Ramachandran Enthought, Inc. # License: BSD Style. import unittest import pickle import numpy # Enthought library imports. from traits.api import TraitError from mayavi.sources.array_source import ArraySource from mayavi.modules.outline import Outline from mayavi.modules.surface import Surface class TestArraySource(unittest.TestCase): def setUp(self): """Initial setting up of test fixture, automatically called by TestCase before any other test method is invoked""" d = ArraySource() self.data = d def tearDown(self): """For necessary clean up, automatically called by TestCase after the test methods have been invoked""" return def make_2d_data(self): s = numpy.array([[0, 1],[2, 3]], 'd') v = numpy.array([[[1,1,1], [1,0,0]],[[0,1,0], [0,0,1]]], 'd') tps = numpy.transpose s, v = tps(s), tps(v, (1, 0, 2)) return s, v def make_3d_data(self): s = numpy.array([[[0, 1],[2, 3]], [[4, 5],[6, 7]]], 'd') v = numpy.array([[[[0,0,0], [1,0,0]], [[0,1,0], [1,1,0]]], [[[0,0,1], [1,0,1]], [[0,1,1], [1,1,1]]]], 'd') tps = numpy.transpose s, v = tps(s), tps(v, (2, 1, 0, 3)) return s, v def test_input_validation(self): """Tests if only the correct forms of input arrays are supported.""" obj = self.data # These should work. obj.scalar_data = numpy.zeros((2,2), 'd') obj.scalar_data = numpy.zeros((2,2,2), 'd') obj.scalar_data = None obj.vector_data = numpy.zeros((2,2,3), 'd') obj.vector_data = numpy.zeros((2,2,2,3), 'd') obj.vector_data = None # These should not. self.assertRaises(TraitError, setattr, obj, 'scalar_data', [1,2,3]) self.assertRaises(TraitError, setattr, obj, 'scalar_data', numpy.zeros((2,2,2,3), 'd')) obj.scalar_data = None self.assertRaises(TraitError, setattr, obj, 'vector_data', [[1,2,3]]) self.assertRaises(TraitError, setattr, obj, 'vector_data', numpy.zeros((2,2,2,1), 'd')) obj.vector_data = None obj.scalar_data = numpy.zeros((2,2), 'd') self.assertRaises(TraitError, setattr, obj, 'vector_data', numpy.zeros((4,4,3), 'd')) obj.vector_data = numpy.zeros((2,2,3), 'd') self.assertRaises(TraitError, setattr, obj, 'scalar_data', numpy.zeros((4,3), 'i')) self.assertRaises(TraitError, setattr, obj, 'scalar_data', numpy.zeros((2,2,2), 'i')) obj.scalar_data = numpy.zeros((2,2), 'f') # Clean up the object so it can be used for further testing. obj.scalar_data = obj.vector_data = None def test_2d_data(self): """Generic tests for 2D data arrays.""" d = self.data sc, vec = self.make_2d_data() d.origin = (-1, -1, 0) d.scalar_data = sc d.vector_data = vec d.start() # Start the object so it flushes the pipeline etc. # Create an outline for the data. o = Outline() d.add_child(o) o.start() self.assertEqual(tuple(o.actor.actor.bounds), (-1., 0., -1., 0., 0., 0.)) # Create a surface module. surf = Surface() d.add_child(surf) self.assertEqual(surf.running, True) tps = numpy.transpose expect = [tps(sc), tps(vec, (1, 0, 2))] sc1 = surf.actor.mapper.input.point_data.scalars.to_array() self.assertEqual(numpy.allclose(sc1.flatten(), expect[0].flatten()), True) vec1 = surf.actor.mapper.input.point_data.vectors.to_array() self.assertEqual(numpy.allclose(vec1.flatten(), expect[1].flatten()), True) def test_3d_data(self): "Test for 3D data arrays." # Add a 3D data source d = self.data sc, vec = self.make_3d_data() d.scalar_data = sc d.vector_data = vec d.start() # Start the object so it flushes the pipeline etc. # Create an outline for the data. o = Outline() d.add_child(o) o.start() self.assertEqual(tuple(o.actor.actor.bounds), (0, 1., 0., 1., 0., 1.)) # Create a surface module. surf = Surface() d.add_child(surf) self.assertEqual(surf.running, True) tps = numpy.transpose expect = [tps(sc), tps(vec, (2,1,0,3))] sc2 = surf.actor.mapper.input.point_data.scalars.to_array() self.assertEqual(numpy.allclose(sc2.flatten(), expect[0].flatten()), True) vec2 = surf.actor.mapper.input.point_data.vectors.to_array() self.assertEqual(numpy.allclose(vec2.flatten(), expect[1].flatten()), True) def test_pickle(self): "Test if pickling works." # Test if saving a visualization and restoring it works. d = self.data sc, vec = self.make_3d_data() d.scalar_data = sc d.vector_data = vec d.spacing = [1, 2, 3] d.origin = [4, 5, 6] d.start() # Start the object so it flushes the pipeline etc. # Create an outline for the data. o = Outline() d.add_child(o) o.start() # Create a surface module. surf = Surface() d.add_child(surf) data = pickle.dumps(d) del d, surf, o d = pickle.loads(data) # We must explicitly start the object. d.start() mm = d.children[0] o, surf = mm.children # Test the unpciked state. self.assertEqual(tuple(o.actor.actor.bounds), (4., 5., 5., 7., 6., 9.)) self.assertEqual(surf.running, True) self.assertEqual(o.running, True) self.assertEqual(d.running, True) self.assertEqual(numpy.allclose(d.spacing, [1, 2, 3]), True) self.assertEqual(numpy.allclose(d.origin, [4, 5, 6]), True) tps = numpy.transpose expect = [tps(sc), tps(vec, (2,1,0,3))] sc2 = surf.actor.mapper.input.point_data.scalars.to_array() self.assertEqual(numpy.allclose(sc2.flatten(), expect[0].flatten()), True) vec2 = surf.actor.mapper.input.point_data.vectors.to_array() self.assertEqual(numpy.allclose(vec2.flatten(), expect[1].flatten()), True) if __name__ == '__main__': unittest.main() mayavi-4.5.0/mayavi/tests/test_builtin_image.py0000644000076500000240000001013312747716314022275 0ustar prabhustaff00000000000000# Author: Suyog Dutt Jain # Prabhu Ramachandran # Copyright (c) 2008-2015, Enthought, Inc. # License: BSD Style. # Standard library imports. from os.path import abspath from io import BytesIO import numpy import unittest from numpy import array # Enthought library imports. from tvtk.common import is_old_pipeline from mayavi.core.null_engine import NullEngine from mayavi.sources.builtin_image import BuiltinImage from mayavi.modules.surface import Surface from mayavi.modules.outline import Outline class TestBuiltinImageSource(unittest.TestCase): def setUp(self): e = NullEngine() # Uncomment to see visualization for debugging etc. #e = Engine() e.start() s=e.new_scene() image_data = BuiltinImage() e.add_source(image_data) outline = Outline() e.add_module(outline) surface = Surface() e.add_module(surface) image_data.data_source.radius = array([ 80., 80., 80.]) image_data.data_source.center = array([ 150., 150., 0.]) image_data.data_source.whole_extent = array([ 10, 245, 10, 245, 0, 0]) if is_old_pipeline(): image_data.data_source.update_whole_extent() else: image_data.data_source.set_update_extent_to_whole_extent() self.e=e self.scene = e.current_scene return def tearDown(self): self.e.stop() return def test_data_source(self): s = self.scene src = s.children[0] self.assertEqual(src.source,'ellipsoid') self.assertEqual(numpy.allclose(src.data_source.center,(150., 150., 0.)),True) self.assertEqual(numpy.allclose(src.data_source.radius,(80., 80., 80.)),True) self.assertEqual(numpy.allclose(src.data_source.whole_extent,(10, 245, 10, 245, 0, 0)),True) def check(self): s = self.scene src = s.children[0] ot = src.children[0].children[0] ot.render() # Check with the default properties of gaussian image to verify # that the source has actually changed self.assertEqual(src.source,'gaussian') self.assertEqual(numpy.allclose(src.data_source.center,(0., 0., 0.)),True) self.assertEqual(src.data_source.maximum,2.0) self.assertEqual(src.data_source.standard_deviation,15) # Check the scalar ranges sc = src.outputs[0].point_data.scalars self.assertEqual(numpy.allclose(sc.range, (0, 2.0), atol=1.01e-03), True) def test_change(self): s = self.scene src = s.children[0] ot = src.children[0].children[0] src.source = 'gaussian' # Check with the default properties of gaussian image to verify # that the source has actually changed self.assertEqual(src.source,'gaussian') self.assertEqual(numpy.allclose(src.data_source.center,(0., 0., 0.)),True) self.assertEqual(src.data_source.maximum,1.0) self.assertEqual(src.data_source.standard_deviation,100) #Check the scalar ranges self.assertEqual(numpy.allclose(src.outputs[0].point_data.scalars.range,(0.00149, 1.0),atol=1.01e-03),True) src.data_source.maximum = 2.0 src.data_source.standard_deviation = 15 if not is_old_pipeline(): src.data_source.update() self.check() def test_save_and_restore(self): """Test if saving a visualization and restoring it works.""" engine = self.e scene = self.scene src = scene.children[0] src.source = 'gaussian' src.data_source.maximum = 2.0 src.data_source.standard_deviation = 15 # Save visualization. f = BytesIO() f.name = abspath('test.mv2') # We simulate a file. engine.save_visualization(f) f.seek(0) # So we can read this saved data. # Remove existing scene. engine.close_scene(scene) # Load visualization engine.load_visualization(f) self.scene = engine.current_scene self.check() if __name__ == '__main__': unittest.main() mayavi-4.5.0/mayavi/tests/test_builtin_surface.py0000644000076500000240000001004012747716314022640 0ustar prabhustaff00000000000000# Author: Suyog Dutt Jain # Prabhu Ramachandran # Copyright (c) 2008-2015, Enthought, Inc. # License: BSD Style. # Standard library imports. from os.path import abspath from io import BytesIO import numpy import unittest # Enthought library imports. from mayavi.core.null_engine import NullEngine from mayavi.sources.builtin_surface import BuiltinSurface from mayavi.modules.surface import Surface from mayavi.modules.outline import Outline class TestBuiltinSurfaceSource(unittest.TestCase): def setUp(self): """Initial setting up of test fixture, automatically called by TestCase before any other test method is invoked""" e = NullEngine() # Uncomment to see visualization for debugging etc. #e = Engine() e.start() s=e.new_scene() poly_data = BuiltinSurface() e.add_source(poly_data) outline = Outline() e.add_module(outline) surface = Surface() e.add_module(surface) poly_data.data_source.shaft_radius = 0.05 poly_data.data_source.shaft_resolution = 7 poly_data.data_source.tip_radius = 0.1 self.e=e self.scene = e.current_scene return def tearDown(self): """For necessary clean up, automatically called by TestCase after the test methods have been invoked""" self.e.stop() return def test_poly_data_source(self): """Do the basic testing""" s = self.scene src = s.children[0] #Check the properties of the default source self.assertEqual(src.source,'arrow') self.assertEqual(src.data_source.shaft_radius,0.05) self.assertEqual(src.data_source.shaft_resolution,7) self.assertEqual(src.data_source.tip_radius,0.1) def check(self): """Do the actual testing.""" s = self.scene src = s.children[0] ot = src.children[0].children[0] ot.render() # Flush the pipeline. # Check the outline bounds self.assertEqual(numpy.allclose(ot.outline_filter.output.bounds, (-0.5, 0.5, -0.5, 0.5, -0.475, 0.475), atol=1.01e-03), True) self.assertEqual(numpy.allclose(src.data_source.angle, 26.565, atol=1.01e-03),True) self.assertEqual(numpy.allclose(src.data_source.direction,(1., 0., 0.)),True) self.assertEqual(src.data_source.radius,0.5) self.assertEqual(src.data_source.height,1.0) self.assertEqual(numpy.allclose(src.data_source.center,(0., 0., 0.)),True) self.assertEqual(src.data_source.resolution, 10) #Modify Properties and check again src.data_source.height = 1.5 src.data_source.angle = 30 src.data_source.modified() self.assertEqual(numpy.allclose(src.data_source.radius,0.866,atol=1.01e-03),True) def test_change(self): """Test if it works fine on changing the source""" s = self.scene src = s.children[0] ot = src.children[0].children[0] src.source = 'cone' src.data_source.resolution = 10 # Check with the default properties of cone to verify that the # source has actually changed self.assertEqual(src.source,'cone') self.check() def test_save_and_restore(self): """Test if saving a visualization and restoring it works.""" engine = self.e scene = self.scene src = scene.children[0] src.source = 'cone' src.data_source.resolution = 10 # Save visualization. f = BytesIO() f.name = abspath('test.mv2') # We simulate a file. engine.save_visualization(f) f.seek(0) # So we can read this saved data. # Remove existing scene. engine.close_scene(scene) # Load visualization engine.load_visualization(f) self.scene = engine.current_scene self.check() if __name__ == '__main__': unittest.main() mayavi-4.5.0/mayavi/tests/test_contour.py0000644000076500000240000001364712747716314021173 0ustar prabhustaff00000000000000# Author: Suyog Dutt Jain # Prabhu Ramachandran # Copyright (c) 2008-2015, Enthought, Inc. # License: BSD Style. # Standard library imports. from os.path import abspath from io import BytesIO import copy import numpy import unittest # Local imports. from mayavi.core.null_engine import NullEngine from mayavi.sources.vtk_data_source import VTKDataSource from mayavi.modules.outline import Outline from mayavi.modules.iso_surface import IsoSurface from mayavi.modules.contour_grid_plane import ContourGridPlane from mayavi.modules.scalar_cut_plane import ScalarCutPlane from mayavi.tests import datasets class TestContour(unittest.TestCase): def setUp(self): """Initial setting up of test fixture, automatically called by TestCase before any other test method is invoked""" e = NullEngine() # Uncomment to see visualization for debugging etc. #e = Engine() e.start() e.new_scene() self.e=e sgrid=datasets.generateStructuredGrid() src = VTKDataSource(data = sgrid) e.add_source(src) # Create an outline for the data. o = Outline() e.add_module(o) # Create one ContourGridPlane normal to the 'x' axis. cgp1 = ContourGridPlane() e.add_module(cgp1) # Set the position to the middle of the data. cgp1.grid_plane.position = 15 # Another with filled contours normal to 'y' axis. cgp2 = ContourGridPlane() cgp2.contour.filled_contours = True # Set the axis and position to the middle of the data. cgp2.grid_plane.axis = 'y' cgp2.grid_plane.position = 15 e.add_module(cgp2) # An isosurface module. iso = IsoSurface(compute_normals=True) e.add_module(iso) iso.contour.contours = [5] # An interactive scalar cut plane. cp = ScalarCutPlane() e.add_module(cp) ip = cp.implicit_plane ip.normal = 0,0,1 ip.origin = 0.5, 0.5, 1.0 # Since this is running offscreen this seems necessary. ip.widget.origin = 0.5, 0.5, 1.0 ip.widget.enabled = False self.scene = e.current_scene self.cgp2=cgp2 self.iso=iso self.cp=cp return def tearDown(self): """For necessary clean up, automatically called by TestCase after the test methods have been invoked""" self.e.stop() return def check(self): """Do the actual testing.""" scene = self.scene src = scene.children[0] mm = src.children[0] cgp1 = mm.children[1] self.assertEqual(cgp1.grid_plane.position,15) cgp2 = mm.children[2] self.assertEqual(cgp2.contour.filled_contours,True) self.assertEqual(cgp2.grid_plane.axis, 'y') self.assertEqual(cgp2.grid_plane.position,15) iso = mm.children[3] ctr = iso.contour.contours self.assertEqual(iso.compute_normals,True) self.assertEqual(ctr, [5.0]) rng = iso.actor.mapper.input.point_data.scalars.range self.assertEqual(rng[0],5.0) self.assertEqual(rng[1],5.0) cp = mm.children[4] ip = cp.implicit_plane self.assertAlmostEqual(numpy.sum(ip.normal - (0,0,1)) , 1e-16) self.assertAlmostEqual(numpy.sum(ip.origin - (0.5, 0.5, 1.0)), 0.0) self.assertEqual(ip.widget.enabled,False) def test_contour(self): "Test if the test fixture works" #Now test. self.check() #from mayavi.tools.show import show #show() def test_components_changed(self): """Test if the modules respond correctly when the components are changed.""" cgp2=self.cgp2 cp =self.cp iso =self.iso ctr = cgp2.contour cgp2.contour = ctr.__class__() cgp2.contour = ctr cgp2.actor = cgp2.actor.__class__() iso.contour = iso.contour.__class__() iso.contour.contours = [5.0] iso.actor = iso.actor.__class__() iso.normals = iso.normals.__class__() ip = cp.implicit_plane cp.implicit_plane = cp.implicit_plane.__class__() cp.implicit_plane = ip ip.widget.enabled = False cp.contour = cp.contour.__class__() cp.cutter = cp.cutter.__class__() cp.actor = cp.actor.__class__() # Now check. self.check() def test_save_and_restore(self): """Test if saving a visualization and restoring it works.""" engine = self.e scene = self.scene # Save visualization. f = BytesIO() f.name = abspath('test.mv2') # We simulate a file. engine.save_visualization(f) f.seek(0) # So we can read this saved data. # Remove existing scene. engine.close_scene(scene) # Load visualization engine.load_visualization(f) self.scene = engine.current_scene self.check() def test_deepcopied(self): """Test if the MayaVi2 visualization can be deep-copied.""" ############################################################ # Test if the MayaVi2 visualization can be deep-copied. # Pop the source object. s = self.scene source = s.children.pop() # Add it back to see if that works without error. s.children.append(source) cp = source.children[0].children[-1] cp.implicit_plane.widget.enabled = False self.check() # Now deepcopy the source and replace the existing one with # the copy. This basically simulates cutting/copying the # object from the UI via the right-click menu on the tree # view, and pasting the copy back. source1 = copy.deepcopy(source) s.children[0] = source1 cp = source1.children[0].children[-1] cp.implicit_plane.widget.enabled = False self.check() if __name__ == '__main__': unittest.main() mayavi-4.5.0/mayavi/tests/test_core_common.py0000644000076500000240000001055212747716314021772 0ustar prabhustaff00000000000000""" Tests for the mayavi.core.common module. """ # Author: Prabhu Ramachandran # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. import unittest from mayavi.core.common import get_object_path, get_engine from mayavi.core.file_data_source import NoUITimer from mayavi.sources.parametric_surface import \ ParametricSurface from mayavi.modules.outline import Outline from mayavi.core.null_engine import NullEngine class TestCoreCommon(unittest.TestCase): def setUp(self): e = NullEngine() e.start() e.new_scene() scene = e.scenes[-1] s = ParametricSurface() e.add_source(s) o = Outline() s.add_child(o) o1 = Outline() s.add_child(o1) self.scene = scene self.e = e self.s = s self.o = o self.o1 = o1 return def test_get_object_path(self): "Check if the get_object_path method works correctly." e, scene, s, o, o1 = self.e, self.scene, self.s, self.o, self.o1 value = get_object_path(scene, e) self.assertEqual(value, 'engine.scenes[0]') value = get_object_path(s, e) self.assertEqual(value, 'engine.scenes[0].children[0]') value = get_object_path(o.module_manager, e) self.assertEqual(value, 'engine.scenes[0].children[0].children[0]') value = get_object_path(o, e) self.assertEqual(value, 'engine.scenes[0].children[0].children[0].children[0]') value = get_object_path(o1, e) self.assertEqual(value, 'engine.scenes[0].children[0].children[0].children[1]') # With respect to the scene. value = get_object_path(o, scene, 'scene') self.assertEqual(value, 'scene.children[0].children[0].children[0]') # With respect to the source. value = get_object_path(o, s, 's') self.assertEqual(value, 's.children[0].children[0]') value = get_object_path(o1, s, 's') self.assertEqual(value, 's.children[0].children[1]') def test_get_engine(self): e, scene, s, o, o1 = self.e, self.scene, self.s, self.o, self.o1 self.assertEqual(e, get_engine(scene)) self.assertEqual(e, get_engine(s)) self.assertEqual(e, get_engine(o)) self.assertEqual(e, get_engine(o1)) self.assertEqual(e, get_engine(o.module_manager)) self.assertEqual(e, get_engine(o1.module_manager)) def test_remove(self): "Does obj.remove() work correctly" # Fails only when the current object is the one that is removed. self.e.current_object = self.o1 mm = self.o1.module_manager # Remove the object. self.o1.remove() # Now add another object. o1 = Outline() self.e.add_module(o1) # Is it really added? self.assertEqual(o1.module_manager, mm) self.assertEqual(o1.parent, mm) class TestNoUITimer(unittest.TestCase): def test_simple_timer(self): class A(object): def __init__(self): self.count = 0 self.timer = NoUITimer(10, self.step) def step(self): self.count +=1 if self.count > 10: self.timer.Stop() a = A() a.timer.Start() self.assertEqual(a.count, 11) self.assertFalse(a.timer.IsRunning()) def test_timer_stops_on_error_and_raises(self): class A(object): def __init__(self): self.count = 0 self.timer = NoUITimer(10, self.step) def step(self): self.count +=1 raise(RuntimeError('Oops')) a = A() self.assertRaises(RuntimeError, a.timer.Start) self.assertEqual(a.count, 1) self.assertFalse(a.timer.IsRunning()) def test_timer_stops_on_stop_iteration(self): class A(object): def __init__(self): self.count = 0 self.timer = NoUITimer(10, self.step) def step(self): self.count +=1 if self.count > 10: raise(StopIteration('Stop')) a = A() a.timer.Start() self.assertEqual(a.count, 11) self.assertFalse(a.timer.IsRunning()) if __name__ == '__main__': unittest.main() mayavi-4.5.0/mayavi/tests/test_csv_sniff.py0000644000076500000240000001357012747716314021455 0ustar prabhustaff00000000000000""" Tests for the CSV file sniffer """ # Author: Ilan Schnell # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. import glob import os import os.path import sys import unittest import tempfile import nose from numpy import array, ndarray from mayavi.tools.data_wizards.csv_sniff import \ Sniff, loadtxt, loadtxt_unknown, array2dict class Util(unittest.TestCase): def assertNamedClose(self, x, y): self.assertEqual(x.shape, y.shape) self.assertEqual(x.dtype.names, y.dtype.names) for name in x.dtype.names: self.assertAllClose(x[name], y[name]) def assertAllClose(self, x, y): self.assertEqual(len(x), len(y)) for a, b in zip(x, y): self.assertClose(a, b) def assertClose(self, a, b): if isinstance(a, (int, float)): if repr(a) == 'nan': self.assertTrue(repr(b) == 'nan') else: self.assertTrue(abs(a - b) < 1e-6 * max(1, abs(a)), '%r != %r %r' % (a, b, abs(a - b))) elif isinstance(a, (str, bytes)): self.assertEqual(a, b) else: self.assertFalse("Hmm, did not expect: %s" % a) class Test(Util): def test_API(self): fo = tempfile.mktemp() with open(fo, 'w') as f: f.write(''' "A", "B", "C" 1, 2, 3.2 7, 4, 1.87''') s = Sniff(fo) self.assertEqual(s.comments(), '#') self.assertEqual(s.delimiter(), ',') self.assertEqual(s.skiprows(), 1) self.assertEqual(s.dtype(), {'names': ('A', 'B', 'C'), 'formats': (float, float, float)}) x = s.loadtxt() y = array([(1.0, 2.0, 3.20), (7.0, 4.0, 1.87)], dtype=[('A', float), ('B', float), ('C', float)]) self.assertNamedClose(x, y) y = loadtxt(fo, **s.kwds()) self.assertNamedClose(x, y) y = loadtxt_unknown(fo) self.assertNamedClose(x, y) d = array2dict(y) self.assertEqual(type(d), type({})) self.assertAllClose(x['A'], [1, 7]) self.assertAllClose(x['B'], [2, 4]) self.assertAllClose(x['C'], [3.2, 1.87]) def test_comment(self): fo = tempfile.mktemp() with open(fo, 'w') as f: f.write(''' % "A" "B" "C" 1 2 4.2 % comment''') s = Sniff(fo) self.assertEqual(s.kwds(), {'dtype': {'names': ('A', 'B', 'C'), 'formats': (float, float, float)}, 'delimiter': None, 'skiprows': 0, # FIXME 'comments': '%'}) def test_tabs(self): fo = tempfile.mktemp() with open(fo, 'w') as f: f.write('''54\t87\n21\t32''') s = Sniff(fo) self.assertEqual(s.delimiter(), None) self.assertEqual(s.skiprows(), 0) def test_nohead(self): fo = tempfile.mktemp() with open(fo, 'w') as f: f.write('''Hello;54;87\nWorld;42;86.5''') s = Sniff(fo) self.assertEqual(s.kwds(), {'comments': '#', 'delimiter': ';', 'skiprows': 0, 'dtype': {'names': ('Column 1', 'Column 2', 'Column 3'), 'formats': ('S5', float, float)}}) def test_empty_file(self): fo = tempfile.mktemp() with open(fo, 'w') as f: f.write('') self.assertRaises(IndexError, Sniff, fo) class Test_csv_py_files(Util): """ These tests require files in csv_files/ """ def check(self, name, skip_if_win=False): """ Check if the output array from csv_files/.csv (which is of unkown format) is the same as the array in csv_files/.py """ if skip_if_win and sys.platform.startswith('win'): raise nose.SkipTest # Note: The files needed for the test are currently accessed directly. # This assumes that the files are present, and not in a zipped # egg. traits.util.resource as supposed to always work, but # when it ran the striped the tests in the EPD installer tests, # it was broken. Since we define zip_safe = False in setup.py # it is safe to assume the files are always present. s = Sniff(os.path.join(os.path.dirname(__file__), 'csv_files', name + '.csv')) f_py = os.path.join(os.path.dirname(__file__), 'csv_files', name + '.py') if not sys.platform.startswith('win'): nan = float('nan') # must be in namespace for some .py files d = eval(open(f_py).read()) self.assertEqual(d['kwds'], s.kwds()) self.assertNamedClose(d['array'], s.loadtxt()) def test_11(self): self.check('11') def test_1col(self): self.check('1col') def test_54(self): self.check('54') def test_79(self): self.check('79') def test_82(self): self.check('82') def test_89(self): self.check('89') def test_99(self): self.check('99') def test_colors(self): self.check('colors') def test_example1(self): # this test need to be skipped on Windows because the data file # has some floats nan, and float('nan') fails on on Windows. self.check('example1', skip_if_win=True) def test_hp11c(self): self.check('hp11c') def test_loc(self): self.check('loc') def test_multi_col(self): self.check('multi-col') def test_mydata(self): self.check('mydata') def test_OObeta3(self): self.check('OObeta3') def test_post(self): self.check('post') def test_webaccess(self): self.check('webaccess') if __name__ == '__main__': unittest.main() mayavi-4.5.0/mayavi/tests/test_customize.py0000644000076500000240000000123012747716314021505 0ustar prabhustaff00000000000000"""Tests for mayavi.core.customize.""" import unittest # We need this import of NullEngine since importing customize first can # result in circular imports. from mayavi.core.null_engine import NullEngine from mayavi.core import customize class TestCustomize(unittest.TestCase): def test_import_contrib(self): """Test the import_contrib function.""" for mname in ('mayavi.api', 'mayavi', 'mayavi.core', 'mayavi.core.base'): mod = customize._import_contrib(mname) self.assertEqual(mod.__name__, mname) if __name__ == '__main__': unittest.main() mayavi-4.5.0/mayavi/tests/test_cut_plane.py0000644000076500000240000000452112747716314021443 0ustar prabhustaff00000000000000# Author: Deepak Surti # Copyright (c) 2015, Enthought, Inc. # License: BSD Style. # Standard library imports. import unittest # Local imports. from . import datasets from .common import get_example_data # Enthought library imports from mayavi.core.null_engine import NullEngine from mayavi.sources.vtk_data_source import VTKDataSource from mayavi.modules.scalar_cut_plane import ScalarCutPlane from mayavi.sources.unstructured_grid_reader import UnstructuredGridReader class TestCutter(unittest.TestCase): def setUp(self): """Initial setting up of test fixture, automatically called by TestCase before any other test method is invoked""" e = NullEngine() # Uncomment to see visualization for debugging etc. #from mayavi.core.engine import Engine #e = Engine() e.start() e.new_scene() self.e = e def tearDown(self): """For necessary clean up, automatically called by TestCase after the test methods have been invoked""" self.e.stop() return def check(self): """ Configures the scalar cut plane and checks the cutter output changes when the plane is changed. """ e = self.e # An interactive scalar cut plane. cp = ScalarCutPlane() e.add_module(cp) self.cp = cp ip = cp.implicit_plane ip.origin = -1.5, -1.5, -1.5 poly_data = cp.cutter.outputs[0].output initial_cells = poly_data.number_of_cells # Change the plane normal ip.normal = 1, 1, 1 updated_cells = poly_data.number_of_cells self.assertNotEqual(initial_cells, updated_cells) # Change the plane origin ip.normal = 1, 1, 1 updated_cells = poly_data.number_of_cells self.assertNotEqual(initial_cells, updated_cells) def test_with_structured_data(self): e = self.e sgrid=datasets.generateStructuredGrid() src = VTKDataSource(data = sgrid) e.add_source(src) self.check() def test_with_unstructured_data(self): e = self.e # Read a AVSUCD data file. r = UnstructuredGridReader() r.initialize(get_example_data('cellsnd.ascii.inp')) e.add_source(r) self.check() if __name__ == '__main__': unittest.main() mayavi-4.5.0/mayavi/tests/test_dataset_manager.py0000644000076500000240000001627212747716314022616 0ustar prabhustaff00000000000000""" Test for the dataset_manager.py module. """ # Author: Prabhu Ramachandran # Copyright (c) 2008-2015, Enthought, Inc. # License: BSD Style. import unittest import numpy as N from tvtk.api import tvtk from mayavi.core.dataset_manager import DatasetManager def make_data(): points = N.array([[0,0,0], [1,0,0], [0,1,0], [0,0,1], # tets [1,0,0], [2,0,0], [1,1,0], [1,0,1], [2,0,0], [3,0,0], [2,1,0], [2,0,1], ], 'f') tets = N.array([[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]]) tet_type = tvtk.Tetra().cell_type ug = tvtk.UnstructuredGrid(points=points) ug.set_cells(tet_type, tets) # Setup the point attributes. temp = N.random.random(12) v = N.random.randn(12, 3) ten = N.random.randn(12, 9) a = tvtk.FloatArray(name='p') a.from_array(N.random.randn(12)) ug.point_data.add_array(a) ug.point_data.scalars = temp ug.point_data.scalars.name = 't' ug.point_data.vectors = v ug.point_data.vectors.name = 'v' ug.point_data.tensors = ten ug.point_data.tensors.name = 'ten' # Setup the cell attributes. temp = N.random.random(3) v = N.random.randn(3, 3) ten = N.random.randn(3, 9) ug.cell_data.scalars = temp ug.cell_data.scalars.name = 't' ug.cell_data.vectors = v ug.cell_data.vectors.name = 'v' ug.cell_data.tensors = ten ug.cell_data.tensors.name = 'ten' return ug class TestDataSetManager(unittest.TestCase): def setUp(self): self.data = make_data() self.dm = DatasetManager(dataset=self.data) return def tearDown(self): return def test_point_arrays(self): "Are the point data arrays of the manager setup right?" dm = self.dm sc = sorted(dm.point_scalars.keys()) self.assertEqual(sc, ['p', 't']) vec = list(dm.point_vectors.keys()) self.assertEqual(vec, ['v']) ten = list(dm.point_tensors.keys()) self.assertEqual(ten, ['ten']) def test_point_array_view(self): "Are the manager's point arrays views of the VTK data?" # Check that the array we have is really a view of the VTK data. dm = self.dm data = self.data t = dm.point_scalars['t'] t[0] += 1.0 self.assertEqual(t[0], data.point_data.scalars[0]) v = dm.point_vectors['v'] v[0][0] += 1.0 self.assertEqual(v[0][0], data.point_data.vectors[0][0]) ten = dm.point_tensors['ten'] ten[0][0] += 1.0 self.assertEqual(ten[0][0], data.point_data.tensors[0][0]) def test_cell_arrays(self): "Are the cell arrays of the manager setup right?" dm = self.dm sc = list(dm.cell_scalars.keys()) self.assertEqual(sc, ['t']) vec = list(dm.cell_vectors.keys()) self.assertEqual(vec, ['v']) ten = list(dm.cell_tensors.keys()) self.assertEqual(ten, ['ten']) def test_cell_array_view(self): "Are the manager's cell arrays views of the VTK data?" # Check that the array we have is really a view of the VTK data. dm = self.dm data = self.data t = dm.cell_scalars['t'] t[0] += 1.0 self.assertEqual(t[0], data.cell_data.scalars[0]) v = dm.cell_vectors['v'] v[0][0] += 1.0 self.assertEqual(v[0][0], data.cell_data.vectors[0][0]) ten = dm.cell_tensors['ten'] ten[0][0] += 1.0 self.assertEqual(ten[0][0], data.cell_data.tensors[0][0]) def test_remove_array(self): "Does the remove_array method work correctly." dm = self.dm data = self.data dm.remove_array('t', 'point') self.assertEqual(len(dm.point_scalars), 1) self.assertEqual(list(dm.point_scalars.keys()), ['p']) dm.remove_array('ten', 'point') self.assertEqual(len(dm.point_tensors), 0) # Make sure the default category is point. dm.remove_array('v') self.assertEqual(len(dm.point_vectors), 0) # Cell arrays. dm.remove_array('t', 'cell') self.assertEqual(len(dm.cell_scalars), 0) dm.remove_array('ten', 'cell') self.assertEqual(len(dm.cell_tensors), 0) dm.remove_array('v', 'cell') self.assertEqual(len(dm.cell_vectors), 0) def test_rename_array(self): "Does array renaming work." dm = self.dm data = self.data dm.rename_array('ten', 'ten1', 'point') self.assertEqual(list(dm.point_tensors.keys()), ['ten1']) pd = data.point_data arrs = [pd.get_array_name(x) for x in range(pd.number_of_arrays)] arrs.sort() self.assertEqual(arrs, ['p', 't', 'ten1', 'v']) dm.rename_array('t', 'temp', 'cell') self.assertEqual(list(dm.cell_scalars.keys()), ['temp']) cd = data.cell_data arrs = [cd.get_array_name(x) for x in range(cd.number_of_arrays)] arrs.sort() self.assertEqual(arrs, ['temp', 'ten', 'v']) def test_add_array(self): "Does the add_array method work." dm = self.dm data = self.data pd = data.point_data cd = data.cell_data # Point data. s = N.random.randn(12) v = N.random.randn(12,3) t = N.random.randn(12, 9) dm.add_array(s, 'scalar') sc = sorted(self.dm.point_scalars.keys()) self.assertEqual(sc, ['p', 'scalar', 't']) x = pd.get_array('scalar') self.assertNotEqual(x, None) dm.add_array(v, 'vector') vc = sorted(self.dm.point_vectors.keys()) self.assertEqual(vc, ['v', 'vector']) x = pd.get_array('vector') self.assertNotEqual(x, None) dm.add_array(t, 'tensor') vc = sorted(self.dm.point_tensors.keys()) self.assertEqual(vc, ['ten', 'tensor']) x = pd.get_array('tensor') self.assertNotEqual(x, None) # cell data. s = N.random.randn(3) v = N.random.randn(3, 3) t = N.random.randn(3, 9) dm.add_array(s, 'scalar', 'cell') sc = sorted(self.dm.cell_scalars.keys()) self.assertEqual(sc, ['scalar', 't']) x = cd.get_array('scalar') self.assertNotEqual(x, None) dm.add_array(v, 'vector', 'cell') vc = sorted(self.dm.cell_vectors.keys()) self.assertEqual(vc, ['v', 'vector']) x = cd.get_array('vector') self.assertNotEqual(x, None) dm.add_array(t, 'tensor', 'cell') vc = sorted(self.dm.cell_tensors.keys()) self.assertEqual(vc, ['ten', 'tensor']) x = cd.get_array('tensor') self.assertNotEqual(x, None) def test_activate(self): "Does activating a particular array work." dm = self.dm data = self.dm.output dm.activate('p') self.assertEqual(data.point_data.scalars.name, 'p') dm.activate('t') self.assertEqual(data.point_data.scalars.name, 't') s = N.random.randn(3) dm.add_array(s, 'foo', 'cell') dm.activate('foo', 'cell') self.assertEqual(data.cell_data.scalars.name, 'foo') dm.activate('t', 'cell') self.assertEqual(data.cell_data.scalars.name, 't') if __name__ == '__main__': unittest.main() mayavi-4.5.0/mayavi/tests/test_engine_manager.py0000644000076500000240000000541712747716314022435 0ustar prabhustaff00000000000000""" Tests for mayavi.tools.engine_manager """ import unittest from mock import patch from mayavi.core.null_engine import NullEngine from mayavi.plugins.envisage_engine import EnvisageEngine from mayavi.api import OffScreenEngine, Engine from mayavi.tools.engine_manager import get_engine def patch_registry_engines(engines): return patch("mayavi.tools.engine_manager.registry.engines", engines) def patch_backend(backend): return patch("mayavi.tools.engine_manager.options.backend", backend) def patch_offscreen(switch_on): return patch("mayavi.tools.engine_manager.options.offscreen", switch_on) class TestEngineManager(unittest.TestCase): @patch_backend("test") def test_get_engine_backend_test(self): self.assertIsInstance(get_engine(), NullEngine) @patch_backend("envisage") @patch_registry_engines({"EnvisageEngine1": EnvisageEngine()}) def test_get_engine_backend_envisage(self): self.assertIs(type(get_engine()), EnvisageEngine) @patch_backend("simple") @patch_registry_engines({"Engine1": NullEngine()}) def test_get_engine_backend_simple_with_existing_engine(self): self.assertIs(type(get_engine()), Engine) @patch_backend("auto") @patch_registry_engines({"Engine1": EnvisageEngine()}) def test_get_engine_backend_auto_with_existing_engine(self): self.assertIs(type(get_engine()), EnvisageEngine) @patch_backend("envisage") @patch_registry_engines({"EnvisageEngine1": EnvisageEngine()}) @patch_offscreen(True) def test_get_engine_offscreen_backend_envisage(self): self.assertIs(type(get_engine()), EnvisageEngine) @patch_backend("test") @patch_offscreen(True) def test_get_engine_offscreen_backend_test(self): self.assertIs(type(get_engine()), NullEngine) @patch_backend("auto") @patch_offscreen(True) @patch_registry_engines({"Engine1": Engine()}) def test_get_engine_offscreen_backend_auto_with_existing_engine(self): self.assertIs(type(get_engine()), OffScreenEngine) @patch_backend("auto") @patch_offscreen(True) @patch_registry_engines({"Engine1": Engine()}) def test_get_engine_offscreen_backend_auto_switched_twice(self): self.assertIs(type(get_engine()), OffScreenEngine) # Now OffScreenEngine is the last used engine # if offscreen is switched back to False # get_engine should not return an OffScreenEngine from mayavi.tools.engine_manager import options options.offscreen = False self.assertIs(type(get_engine()), Engine) @patch_backend("simple") @patch_offscreen(True) @patch_registry_engines({"Engine1": Engine()}) def test_get_engine_offscreen_backend_simple_with_started_engine(self): self.assertIs(type(get_engine()), OffScreenEngine) mayavi-4.5.0/mayavi/tests/test_extract_grid_filter.py0000644000076500000240000001537412747716314023525 0ustar prabhustaff00000000000000# Author: Suyog Dutt Jain # Prabhu Ramachandran # Copyright (c) 2009, Enthought, Inc. # License: BSD Style. # Standard library imports. import unittest from numpy import random, allclose, arange # Local imports. from mayavi.core.null_engine import NullEngine # Enthought library imports from mayavi.sources.vtk_data_source import VTKDataSource from mayavi.modules.grid_plane import GridPlane from mayavi.modules.axes import Axes from mayavi.filters.extract_grid import ExtractGrid from tvtk.api import tvtk from tvtk.common import is_old_pipeline class TestExtractGridFilter(unittest.TestCase): def make_scatter(self): pd = tvtk.PolyData() pd.points = 100 + 100*random.random((1000, 3)) verts = arange(0, 1000, 1) verts.shape = (1000, 1) pd.verts = verts pd.point_data.scalars = random.random(1000) pd.point_data.scalars.name = 'scalars' return pd def make_grid4scatter(self): src = VTKDataSource() xmin, xmax, dx = 100, 200, 2 nx = int((xmax-xmin)/dx)+1 ymin, ymax, dy = 100, 200, 2 ny = int((ymax-ymin)/dy)+1 zmin, zmax, dz = 100, 200, 2 nz = int((zmax-zmin)/dz)+1 image_data = tvtk.ImageData(origin=(xmin, ymin, zmin), spacing=(dx, dy, dz), extent=(0, nx-1, 0, ny-1, 0, nz-1)) if is_old_pipeline(): image_data.whole_extent = image_data.extent src.data = image_data return src def setUp(self): """Initial setting up of test fixture, automatically called by TestCase before any other test method is invoked""" e = NullEngine() # Uncomment to see visualization for debugging etc. #e = Engine() e.start() s=e.new_scene() self.e=e self.s=s ############################################################ # Create a new scene and set up the visualization. #Make the grid grid = self.make_grid4scatter() e.add_source(grid) eg = ExtractGrid() e.add_filter(eg) nb_ticks = 6 eg.x_ratio = eg.y_ratio = eg.z_ratio = 100/(nb_ticks-1)/2 gpx = GridPlane() e.add_module(gpx) gpx.grid_plane.axis = 'x' gpy = GridPlane() e.add_module(gpy) gpy.grid_plane.axis = 'y' gpz = GridPlane() e.add_module(gpz) gpz.grid_plane.axis = 'z' #Add the scatter d = VTKDataSource() d.data = self.make_scatter() e.add_source(d) if is_old_pipeline(): a = Axes() e.add_module(a) a.axes.number_of_labels = nb_ticks self.eg = eg self.gpx = gpx self.gpy = gpy self.gpz = gpz self.scene = e.current_scene return def tearDown(self): """For necessary clean up, automatically called by TestCase after the test methods have been invoked""" self.e.stop() return def test_extract_grid_filter_sample(self): import sys if sys.platform != "darwin": from nose import SkipTest raise SkipTest("actor.bounds returns incorrect values") "Test if the sample rate works." eg = self.eg gpx = self.gpx gpy = self.gpy gpz = self.gpz self.assertEqual(allclose(gpx.actor.actor.bounds, (100.0, 100.0, 100.0, 200.0, 100.0, 200.0)), True) self.assertEqual(allclose(gpy.actor.actor.bounds, (100.0, 200.0, 100.0, 100.0, 100.0, 200.0)), True) self.assertEqual(allclose(gpz.actor.actor.bounds, (100.0, 200.0, 100.0, 200.0, 100.0, 100.0)), True) eg.x_ratio = eg.y_ratio = eg.z_ratio = 25 self.assertEqual(allclose(gpx.actor.actor.bounds, (100.0, 100.0, 100.0, 200.0, 100.0, 200.0)), True) self.assertEqual(allclose(gpy.actor.actor.bounds, (100.0, 200.0, 100.0, 100.0, 100.0, 200.0)), True) self.assertEqual(allclose(gpz.actor.actor.bounds, (100.0, 200.0, 100.0, 200.0, 100.0, 100.0)), True) eg.x_ratio = eg.y_ratio = eg.z_ratio = 5 self.assertEqual(allclose(gpx.actor.actor.bounds, (100.0, 100.0, 100.0, 200.0, 100.0, 200.0)), True) self.assertEqual(allclose(gpy.actor.actor.bounds, (100.0, 200.0, 100.0, 100.0, 100.0, 200.0)), True) self.assertEqual(allclose(gpz.actor.actor.bounds, (100.0, 200.0, 100.0, 200.0, 100.0, 100.0)), True) return def test_voi(self): import sys if sys.platform != "darwin": from nose import SkipTest raise SkipTest("actor.bounds returns incorrect values") "Test if setting the VOI works correctly." eg = self.eg gpx = self.gpx gpy = self.gpy gpz = self.gpz self.assertEqual(allclose(gpx.actor.actor.bounds, (100.0, 100.0, 100.0, 200.0, 100.0, 200.0)), True) self.assertEqual(allclose(gpy.actor.actor.bounds, (100.0, 200.0, 100.0, 100.0, 100.0, 200.0)), True) self.assertEqual(allclose(gpz.actor.actor.bounds, (100.0, 200.0, 100.0, 200.0, 100.0, 100.0)), True) eg.x_ratio = eg.y_ratio = eg.z_ratio = 10 # Now changing the VOI and then setting the ratio used to # show a stupid bug in the grid plane so we test that here. eg.set(x_min=10, x_max=40) eg.x_ratio = 5 self.assertEqual(allclose(gpx.actor.actor.bounds, (120.0, 120.0, 100.0, 200.0, 100.0, 200.0)), True) self.assertEqual(allclose(gpy.actor.actor.bounds, (120.0, 180.0, 100.0, 100.0, 100.0, 200.0)), True) self.assertEqual(allclose(gpz.actor.actor.bounds, (120.0, 180.0, 100.0, 200.0, 100.0, 100.0)), True) # Set some smaller VOI. eg.set(y_min=20, y_max=40, z_min=10, z_max=30) eg.set(x_ratio = 1, y_ratio=1, z_ratio=1) # Reset it and it should go right back. eg.set(x_min=0, x_max=50, y_min=0, y_max=50, z_min=0, z_max=50) self.assertEqual(allclose(gpx.actor.actor.bounds, (100.0, 100.0, 100.0, 200.0, 100.0, 200.0)), True) self.assertEqual(allclose(gpy.actor.actor.bounds, (100.0, 200.0, 100.0, 100.0, 100.0, 200.0)), True) self.assertEqual(allclose(gpz.actor.actor.bounds, (100.0, 200.0, 100.0, 200.0, 100.0, 100.0)), True) #from mayavi.tools.show import show #show() if __name__ == '__main__': unittest.main() mayavi-4.5.0/mayavi/tests/test_file_timestep.py0000644000076500000240000001306212747716314022322 0ustar prabhustaff00000000000000import os import unittest import tempfile import shutil import mock from mayavi.core.null_engine import NullEngine from mayavi.sources.vtk_xml_file_reader import VTKXMLFileReader from mayavi.modules.outline import Outline from mayavi.tests.common import get_example_data from tvtk.pyface.movie_maker import MovieMaker from tvtk.pyface.tvtk_scene import TVTKScene def make_mock_scene(): """Mocks a scene suitable for testing the movie generation. """ s = mock.Mock(spec=TVTKScene) s.foreground = (1,0,0) s.off_screen_rendering = True mm = mock.MagicMock(spec=MovieMaker) s.movie_maker = mm return s class TestFileDataSourceTimestep(unittest.TestCase): def setUp(self): self.root = tempfile.mkdtemp() abc1 = os.path.join(self.root, 'abc_1.vti') abc2 = os.path.join(self.root, 'abc_2.vti') def1 = os.path.join(self.root, 'def_1.vti') def2 = os.path.join(self.root, 'def_2.vti') xyz1 = os.path.join(self.root, 'xyz_1.vti') cube = get_example_data('cube.vti') self.abc1, self.abc2 = abc1, abc2 self.def1, self.def2 = def1, def2 self.xyz1 = xyz1 self.cube = cube for i in (abc1, abc2, def1, def2, xyz1): shutil.copy(cube, i) e = NullEngine() # Uncomment to see visualization for debugging etc. #e = Engine() e.start() e.new_scene() self.engine = e def tearDown(self): self.engine.stop() shutil.rmtree(self.root) def test_sync_timesteps_steps_relevant_readers(self): # Given e = self.engine # Read a VTK XML data file. r = VTKXMLFileReader() r.initialize(self.abc1) e.add_source(r) # Create an outline for the data. o = Outline() e.add_module(o) r2 = VTKXMLFileReader() r2.initialize(self.def1) e.add_source(r2) r3 = VTKXMLFileReader() r3.initialize(self.xyz1) e.add_source(r3) # When r.sync_timestep = True r.timestep = 1 # Then self.assertEqual(r.timestep, r2.timestep) self.assertNotEqual(r.timestep, r3.timestep) r.timestep = 0 self.assertEqual(r.timestep, r2.timestep) def test_play_updates_timestep(self): # Given e = self.engine # Read a VTK XML data file. r = VTKXMLFileReader() r.initialize(self.abc1) r.timestep = 0 e.add_source(r) # Create an outline for the data. o = Outline() e.add_module(o) r2 = VTKXMLFileReader() r2.initialize(self.def1) e.add_source(r2) # When r.play = True # Then self.assertEqual(r.timestep, 1) self.assertEqual(r2.timestep, 0) def test_loop_loops_timesteps(self): # Given e = self.engine # Read a VTK XML data file. r = VTKXMLFileReader() r.initialize(self.abc1) r.timestep = 0 e.add_source(r) # Create an outline for the data. o = Outline() e.add_module(o) values = [] def callback(new): values.append(new) # Shut off so only one loop is done. if new == 0: r.loop = False r.on_trait_change(callback, 'timestep') # When r.loop = True r.play = True # Then expected = [1, 0, 1] self.assertEqual(values, expected) self.assertEqual(r.timestep, 1) self.assertEqual(r.loop, False) def test_play_calls_movie_maker_correctly(self): # Given e = self.engine # Read a VTK XML data file. r = VTKXMLFileReader() r.initialize(self.abc1) r.timestep = 0 e.add_source(r) # Mock s = make_mock_scene() r.scene = s mm = s.movie_maker # Create an outline for the data. o = Outline() e.add_module(o) # When r.play = True # Then mm.animation_start.assert_called_once_with() self.assertEqual(mm.animation_step.call_count, 1) mm.animation_stop.assert_called_once_with() def test_update_files_updates_file_list(self): # Given e = self.engine # Read a VTK XML data file. r = VTKXMLFileReader() r.initialize(self.abc1) r.timestep = 0 e.add_source(r) self.assertEqual(r._max_timestep, 1) self.assertEqual(len(r.file_list), 2) # When shutil.copy(self.abc1, os.path.join(self.root, 'abc_3.vti')) r.update_files = True # Then self.assertEqual(r._max_timestep, 2) self.assertEqual(len(r.file_list), 3) def test_update_files_updates_all_file_lists(self): # Given e = self.engine # Read a VTK XML data file. r = VTKXMLFileReader() r.initialize(self.abc1) e.add_source(r) r2 = VTKXMLFileReader() r2.initialize(self.def1) e.add_source(r2) r.sync_timestep = True r.timestep = 0 self.assertEqual(r._max_timestep, 1) self.assertEqual(len(r.file_list), 2) # When shutil.copy(self.abc1, os.path.join(self.root, 'abc_3.vti')) shutil.copy(self.def1, os.path.join(self.root, 'def_3.vti')) r.update_files = True # Then self.assertEqual(r._max_timestep, 2) self.assertEqual(len(r.file_list), 3) self.assertEqual(r2._max_timestep, 2) self.assertEqual(len(r2.file_list), 3) if __name__ == '__main__': unittest.main() mayavi-4.5.0/mayavi/tests/test_garbage_collection.py0000644000076500000240000000674512747716314023306 0ustar prabhustaff00000000000000""" Tests for the garbage collection of objects in mayavi package. """ # Authors: Deepak Surti, Ioannis Tziakos # Copyright (c) 2015, Enthought, Inc. # License: BSD Style. from numpy import sqrt, sin, mgrid from traits.api import Instance, HasTraits from traitsui.api import View, Item from traits.etsconfig.api import ETSConfig from tvtk.pyface.scene_editor import SceneEditor from tvtk.tests.common import TestGarbageCollection from mayavi.core.ui.mayavi_scene import MayaviScene from mayavi.core.engine import Engine from mayavi.core.null_engine import NullEngine from mayavi.tools.mlab_scene_model import MlabSceneModel class TestMayaviGarbageCollection(TestGarbageCollection): """ See: tvtk.tests.common.TestGarbageCollection """ def test_mlab_scene_model_with_gui(self): """ Tests if MlabSceneModel with GUI can be garbage collected.""" class MlabApp(HasTraits): # The scene model. scene = Instance(MlabSceneModel, ()) view = View(Item(name='scene', editor=SceneEditor(scene_class=MayaviScene), show_label=False, resizable=True, height=500, width=500), resizable=True ) def __init__(self, **traits): self.generate_data() def generate_data(self): # Create some data X, Y = mgrid[-2:2:100j, -2:2:100j] R = 10*sqrt(X**2 + Y**2) Z = sin(R)/R self.scene.mlab.surf(X, Y, Z, colormap='gist_earth') def close_fn(o): o.owner.ui = None if ETSConfig.toolkit == 'qt4': o.control = None o.dispose() def create_fn(): app = MlabApp() return app.edit_traits() self.check_object_garbage_collected(create_fn, close_fn) def test_mlab_scene_model(self): """ Tests if MlabSceneModel can be garbage collected.""" def create_fn(): return MlabSceneModel() def close_fn(o): o.closing = True self.check_object_garbage_collected(create_fn, close_fn) def test_scene(self): """ Tests if core Scene can be garbage collected.""" def create_fn(): e = NullEngine() e.start() scene = e.new_scene() return scene def close_fn(o): o.closing = True self.check_object_garbage_collected(create_fn, close_fn) def test_mayavi_scene(self): """ Tests if Mayavi UI Scene can be garbage collected.""" def create_fn(): scene = MayaviScene(parent=None) return scene def close_fn(o): o.closing = True def test_null_engine(self): """ Tests if core Null Engine can be garbage collected.""" def create_fn(): e = NullEngine() e.start() e.new_scene() e.new_scene() e.new_scene() return e def close_fn(o): o.stop() self.check_object_garbage_collected(create_fn, close_fn) def test_engine(self): """ Tests if core Engine can be garbage collected.""" def create_fn(): e = Engine() e.start() return e def close_fn(o): o.stop() self.check_object_garbage_collected(create_fn, close_fn) mayavi-4.5.0/mayavi/tests/test_glyph.py0000644000076500000240000001651512747716314020622 0ustar prabhustaff00000000000000# Author: Suyog Dutt Jain # Prabhu Ramachandran # Copyright (c) 2008-2015, Enthought, Inc. # License: BSD Style. # Standard library imports. from os.path import abspath from io import BytesIO import platform import copy import numpy import unittest # Local imports. from mayavi.core.null_engine import NullEngine # Enthought library imports from mayavi.sources.array_source import ArraySource from mayavi.modules.outline import Outline from mayavi.modules.glyph import Glyph from mayavi.modules.vector_cut_plane import VectorCutPlane class TestGlyph(unittest.TestCase): def make_data(self): """Trivial data -- creates an elementatry scalar field and a constant vector field along the 'x' axis.""" s = numpy.arange(0.0, 10.0, 0.01) s = numpy.reshape(s, (10,10,10)) s = numpy.transpose(s) v = numpy.zeros(3000, 'd') v[1::3] = 1.0 v = numpy.reshape(v, (10,10,10,3)) return s, v def setUp(self): """Initial setting up of test fixture, automatically called by TestCase before any other test method is invoked""" e = NullEngine() # Uncomment to see visualization for debugging etc. #e = Engine() e.start() s=e.new_scene() self.e=e self.s=s ############################################################ # Create a new scene and set up the visualization. d = ArraySource() sc, vec = self.make_data() d.origin = (-5, -5, -5) d.scalar_data = sc d.vector_data = vec e.add_source(d) # Create an outline for the data. o = Outline() e.add_module(o) # Glyphs for the scalars g = Glyph() e.add_module(g) g.glyph.glyph_source.glyph_position = 'center' g.glyph.glyph.vector_mode = 'use_normal' g.glyph.glyph.scale_factor = 0.5 g.glyph.mask_points.on_ratio = 20 g.actor.property.line_width = 1.0 v = VectorCutPlane() glyph = v.glyph gs = glyph.glyph_source gs.glyph_position = 'tail' gs.glyph_source = gs.glyph_list[1] e.add_module(v) v.implicit_plane.set(normal=(0, 1, 0), origin=(0, 3, 0)) v = VectorCutPlane() glyph = v.glyph gs = glyph.glyph_source gs.glyph_source = gs.glyph_list[2] gs.glyph_position = 'head' e.add_module(v) v.implicit_plane.set(normal=(0, 1, 0), origin=(0, -2, 0)) self.g=g self.v=v self.scene = e.current_scene return def tearDown(self): """For necessary clean up, automatically called by TestCase after the test methods have been invoked""" self.e.stop() return def check(self, mask=False, mask_random_mode=False): """Do the actual testing with and without masking. For masking, both the presence and absence of random mode is also tested. """ s = self.scene src = s.children[0] g = src.children[0].children[1] self.assertEqual(g.glyph.glyph_source.glyph_position,'center') self.assertEqual(g.glyph.glyph.vector_mode,'use_normal') self.assertEqual(g.glyph.glyph.scale_factor,0.5) self.assertEqual(g.actor.property.line_width,1.0) # Test masking n_output_points = src.outputs[0].number_of_points n_glyph_input_points = g.glyph.glyph.input.number_of_points if mask: self.assertNotEqual(n_glyph_input_points , 0) if mask_random_mode: self.assertLessEqual(n_glyph_input_points , n_output_points) else: on_ratio = g.glyph.mask_points.on_ratio self.assertEqual(n_glyph_input_points, n_output_points / on_ratio) else: self.assertEqual(n_glyph_input_points, n_output_points) v = src.children[0].children[2] glyph = v.glyph gs = glyph.glyph_source self.assertEqual(gs.glyph_position,'tail') self.assertEqual(gs.glyph_source,gs.glyph_list[1]) self.assertEqual(numpy.allclose(v.implicit_plane.normal, (0., 1., 0.)),True) v = src.children[0].children[3] glyph = v.glyph gs = glyph.glyph_source self.assertEqual(gs.glyph_source,gs.glyph_list[2]) self.assertEqual(gs.glyph_position,'head') self.assertEqual(numpy.allclose(v.implicit_plane.normal, (0., 1., 0.)),True) def test_glyph(self): "Test if the test fixture works" self.check() @unittest.skipIf(platform.system() == "Darwin", "Test crashes on OSX. See issue #373") def test_mask_input_points_with_random_mode(self): """Test if masking input points works with random mode. Tests Issue #165""" s = self.scene src = s.children[0] g = src.children[0].children[1] g.glyph.mask_input_points = True self.check(mask=True, mask_random_mode=True) def test_mask_input_points_without_random_mode(self): """Test if masking input points works without random mode. Tests Issue #165""" s = self.scene src = s.children[0] g = src.children[0].children[1] g.glyph.mask_points.random_mode = 0 g.glyph.mask_input_points = True self.check(mask=True) def test_components_changed(self): """"Test if the modules respond correctly when the components are changed.""" g=self.g v=self.v g.actor = g.actor.__class__() glyph = g.glyph g.glyph = glyph.__class__() g.glyph = glyph glyph = v.glyph v.glyph = glyph.__class__() v.glyph = glyph v.actor = v.actor.__class__() v.cutter = v.cutter.__class__() ip = v.implicit_plane v.implicit_plane = ip.__class__() v.implicit_plane = ip self.check() def test_save_and_restore(self): """Test if saving a visualization and restoring it works.""" engine = self.e scene = self.scene # Save visualization. f = BytesIO() f.name = abspath('test.mv2') # We simulate a file. engine.save_visualization(f) f.seek(0) # So we can read this saved data. # Remove existing scene. engine.close_scene(scene) # Load visualization engine.load_visualization(f) self.scene = engine.current_scene self.check() def test_deepcopied(self): """Test if the MayaVi2 visualization can be deep-copied.""" ############################################################ # Test if the MayaVi2 visualization can be deep-copied. # Pop the source object. s = self.scene sources = s.children s.children = [] # Add it back to see if that works without error. s.children.extend(sources) self.check() # Now deepcopy the source and replace the existing one with # the copy. This basically simulates cutting/copying the # object from the UI via the right-click menu on the tree # view, and pasting the copy back. sources1 = copy.deepcopy(sources) s.children[:] = sources1 self.check() if __name__ == '__main__': unittest.main() mayavi-4.5.0/mayavi/tests/test_grid_plane.py0000644000076500000240000001021012747716314021565 0ustar prabhustaff00000000000000# Author: Suyog Dutt Jain # Prabhu Ramachandran # Copyright (c) 2008-2015, Enthought, Inc. # License: BSD Style. # Standard library imports. from os.path import abspath from io import BytesIO import copy import unittest from mayavi.tests import datasets # Local imports. from mayavi.core.engine import Engine from mayavi.core.null_engine import NullEngine # Enthought library imports from mayavi.sources.vtk_data_source import VTKDataSource from mayavi.modules.outline import Outline from mayavi.modules.grid_plane import GridPlane class TestGridPlane(unittest.TestCase): def setUp(self): """Initial setting up of test fixture, automatically called by TestCase before any other test method is invoked""" e = NullEngine() # Uncomment to see visualization for debugging etc. #e = Engine() e.start() e.new_scene() self.e=e sgrid = datasets.generateStructuredGrid() src = VTKDataSource(data = sgrid) e.add_source(src) # Create an outline for the data. o = Outline() e.add_module(o) # Create three simple grid plane modules. # First normal to 'x' axis. gp1 = GridPlane() e.add_module(gp1) # Second normal to 'y' axis. gp2 = GridPlane() # We'll test how robust things are by setting attributes gp2.grid_plane.axis = 'y' gp2.grid_plane.position = 16 e.add_module(gp2) # Third normal to 'z' axis. gp3 = GridPlane() e.add_module(gp3) gp3.grid_plane.axis = 'z' gp3.grid_plane.position = 6 for gp in (gp1, gp2, gp3): gp.actor.property.set(ambient=1.0) self.scene = e.current_scene return def tearDown(self): """For necessary clean up, automatically called by TestCase after the test methods have been invoked""" self.e.stop() return def check(self): """Do the actual testing.""" s = self.scene mm = s.children[0].children[0] gp1, gp2, gp3 = mm.children[1:] self.assertEqual(gp1.grid_plane.axis,'x') self.assertEqual(gp1.grid_plane.position,0) self.assertEqual(gp1.actor.property.ambient,1.0) self.assertEqual(gp2.grid_plane.axis,'y') self.assertEqual(gp2.grid_plane.position,16) self.assertEqual(gp2.actor.property.ambient,1.0) self.assertEqual(gp3.grid_plane.axis,'z') self.assertEqual(gp3.grid_plane.position,6) self.assertEqual(gp3.actor.property.ambient,1.0) def test_grid_plane(self): "Test if the test fixture works" self.check() #from mayavi.tools.show import show #show() def test_save_and_restore(self): """Test if saving a visualization and restoring it works.""" engine = self.e scene = self.scene # Save visualization. f = BytesIO() f.name = abspath('test.mv2') # We simulate a file. engine.save_visualization(f) f.seek(0) # So we can read this saved data. # Remove existing scene. engine.close_scene(scene) # Load visualization engine.load_visualization(f) self.scene = engine.current_scene self.check() def test_deepcopied(self): """Test if the MayaVi2 visualization can be deep-copied.""" ############################################################ # Test if the MayaVi2 visualization can be deep-copied. # Pop the source object. s = self.scene source = s.children.pop() # Add it back to see if that works without error. s.children.append(source) self.check() # Now deepcopy the source and replace the existing one with # the copy. This basically simulates cutting/copying the # object from the UI via the right-click menu on the tree # view, and pasting the copy back. source1 = copy.deepcopy(source) s.children[0] = source1 self.check() #from mayavi.tools.show import show #show() if __name__ == '__main__': unittest.main() mayavi-4.5.0/mayavi/tests/test_image_data_probe.py0000644000076500000240000001006712747716314022735 0ustar prabhustaff00000000000000# Author: Suyog Dutt Jain # Prabhu Ramachandran # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. # Standard library imports. from os.path import abspath from io import BytesIO import copy import unittest # Local imports. from mayavi.tests.common import get_example_data # Enthought library imports from mayavi.core.null_engine import NullEngine from mayavi.sources.vtk_xml_file_reader import VTKXMLFileReader from mayavi.modules.api import ContourGridPlane from mayavi.filters.image_data_probe import ImageDataProbe class TestImageDataProbe(unittest.TestCase): def setUp(self): """Initial setting up of test fixture, automatically called by TestCase before any other test method is invoked""" e = NullEngine() # Uncomment to see visualization for debugging etc. #e = Engine() e.start() e.new_scene() self.e=e # Read a VTK (old style) data file. r = VTKXMLFileReader() r.initialize(get_example_data('pyramid_ug.vtu')) e.add_source(r) # Create the filters. idp = ImageDataProbe() idp.rescale_scalars = True e.add_filter(idp) cgp = ContourGridPlane(enable_contours=False) e.add_module(cgp) cgp.grid_plane.axis = 'z' cgp.grid_plane.position = 1 self.scene = e.current_scene return def tearDown(self): """For necessary clean up, automatically called by TestCase after the test methods have been invoked""" self.e.stop() return def check(self): """Do the actual testing""" scene = self.scene src = scene.children[0] idp = src.children[0] mm = idp.children[0] self.assertEqual(src.get_output_dataset().is_a('vtkUnstructuredGrid'),True) self.assertEqual(idp.get_output_dataset().is_a('vtkImageData'),True) sc = idp.get_output_dataset().point_data.scalars vc = idp.get_output_dataset().point_data.vectors self.assertEqual(sc.name,idp.rescaled_scalar_name) self.assertEqual(vc.name,'velocity') self.assertEqual(mm.scalar_lut_manager.data_name, idp.rescaled_scalar_name) self.assertEqual((abs(sc.range[0]) < 1e-2),True) self.assertEqual( abs(sc.range[1] - 65535.0) < 1.e-2,True) self.assertEqual((idp.get_output_dataset().dimensions == (3, 3, 2)).all(),True) def test_image_data_probe(self): "Test if the test fixture works" #Now test. self.check() #from mayavi.tools.show import show #show() def test_save_and_restore(self): """Test if saving a visualization and restoring it works.""" engine = self.e scene = self.scene self.check() # Save visualization. f = BytesIO() f.name = abspath('test.mv2') # We simulate a file. engine.save_visualization(f) f.seek(0) # So we can read this saved data. # Remove existing scene. engine.close_scene(scene) # Load visualization engine.load_visualization(f) self.scene = engine.current_scene self.check() def test_deepcopied(self): """Test if the MayaVi2 visualization can be deep-copied.""" ############################################################ # Test if the MayaVi2 visualization can be deep-copied. # Pop the source object. s = self.scene source = s.children.pop() # Add it back to see if that works without error. s.children.append(source) self.check() # Now deepcopy the source and replace the existing one with # the copy. This basically simulates cutting/copying the # object from the UI via the right-click menu on the tree # view, and pasting the copy back. source1 = copy.deepcopy(source) s.children[0] = source1 self.check() #from mayavi.tools.show import show #show() if __name__ == '__main__': unittest.main() mayavi-4.5.0/mayavi/tests/test_image_data_reader.py0000644000076500000240000000702612747716314023071 0ustar prabhustaff00000000000000# Author: Suyog Dutt Jain # Copyright (c) 2009, Enthought, Inc. # License: BSD Style. # Standard library imports. import unittest import numpy # Local imports. from mayavi.tests.common import get_example_data # Enthought library imports from mayavi.sources.image_reader import ImageReader from mayavi.tests.data_reader_test_base import DataReaderTestBase class TestDEMImageReader(DataReaderTestBase): def setup_reader(self): """"Setup the reader in here. This is called after the engine has been created and started. The engine is available as self.e. This method is called by setUp(). """ # Read a DEM Image file. r = ImageReader() r.initialize(get_example_data('example.dem')) self.e.add_source(r) self.bounds =(557945.0, 567725.0, 5107991.5, 5121971.5, 682.0, 682.0) def check(self, scene, bounds, error = 1.01e-02): """Do the actual testing.""" src = scene.children[0] ot = src.children[0].children[0] ot.render() # Flush the pipeline. # Check the outline bounds self.assertEqual(numpy.allclose(ot.outline_filter.output.bounds,bounds, atol=error), True) self.assertEqual(src.reader.spatial_resolution, (30.0, 30.0, 1.0)) self.assertEqual(src.reader.elevation_bounds, (682.0, 2543.0)) def test_dem_image_data_reader(self): "Test if the test fixture works" #Now test. self.check(self.scene, self.bounds) def test_save_and_restore(self): """Test if saving a visualization and restoring it works.""" self.check_saving(self.e, self.scene, self.bounds) def test_deepcopied(self): """Test if the MayaVi2 visualization can be deep-copied.""" ############################################################ # Test if the MayaVi2 visualization can be deep-copied. self.check_deepcopying(self.scene, self.bounds) class TestMHAImageReader(DataReaderTestBase): def setup_reader(self): """"Setup the reader in here. This is called after the engine has been created and started. The engine is available as self.e. This method is called by setUp(). """ # Read a Meta Image file. r = ImageReader() r.initialize(get_example_data('foot.mha')) self.e.add_source(r) self.bounds =(0.0, 255.0, 0.0, 255.0, 0.0, 0.0) def check(self, scene, bounds, error = 1.01e-02): """Do the actual testing.""" src = scene.children[0] ot = src.children[0].children[0] ot.render() # Flush the pipeline. # Check the outline bounds self.assertEqual(numpy.allclose(ot.outline_filter.output.bounds,bounds, atol=error), True) self.assertEqual(numpy.allclose(src.reader.data_spacing,(1., 1., 1.)),True) def test_mha_image_data_reader(self): "Test if the test fixture works" #Now test. self.check(self.scene, self.bounds) def test_save_and_restore(self): """Test if saving a visualization and restoring it works.""" self.check_saving(self.e, self.scene, self.bounds) def test_deepcopied(self): """Test if the MayaVi2 visualization can be deep-copied.""" ############################################################ # Test if the MayaVi2 visualization can be deep-copied. self.check_deepcopying(self.scene, self.bounds) if __name__ == '__main__': unittest.main() mayavi-4.5.0/mayavi/tests/test_image_plane_widget.py0000644000076500000240000001217112747716314023275 0ustar prabhustaff00000000000000# Author: Suyog Dutt Jain # Prabhu Ramachandran # Copyright (c) 2008-2015, Enthought, Inc. # License: BSD Style. # Standard library imports. from os.path import abspath from io import BytesIO import copy import numpy import unittest from mock import patch # Enthought library imports from mayavi.core.engine import Engine from mayavi.core.null_engine import NullEngine from mayavi.sources.array_source import ArraySource from mayavi.modules.outline import Outline from mayavi.modules.image_plane_widget import ImagePlaneWidget from mayavi.tests.common import get_example_data from mayavi import mlab class TestImagePlaneWidget(unittest.TestCase): def make_data(self): """Creates suitable data for the test.""" dims = numpy.array((64, 64, 64), 'i') # Create some scalars to render. dx, dy, dz = 10.0/(dims - 1) x = numpy.reshape(numpy.arange(-5.0, 5.0+dx*0.5, dx, 'f'), (dims[0], 1, 1)) y = numpy.reshape(numpy.arange(-5.0, 5.0+dy*0.5, dy, 'f'), (1, dims[1], 1)) z = numpy.reshape(numpy.arange(-5.0, 5.0+dz*0.5, dz, 'f'), (1, 1, dims[0])) scalars = numpy.sin(x*y*z)/(x*y*z) return scalars def setUp(self): """Initial setting up of test fixture, automatically called by TestCase before any other test method is invoked""" e = NullEngine() # Uncomment to see visualization for debugging etc. #e = Engine() e.start() s=e.new_scene() self.e=e self.s=s ############################################################ # Create a new scene and set up the visualization. d = ArraySource() sc = self.make_data() d.scalar_data = sc e.add_source(d) # Create an outline for the data. o = Outline() e.add_module(o) # ImagePlaneWidgets for the scalars ipw = ImagePlaneWidget() e.add_module(ipw) ipw_y = ImagePlaneWidget() e.add_module(ipw_y) ipw_y.ipw.plane_orientation = 'y_axes' ipw_z = ImagePlaneWidget() e.add_module(ipw_z) ipw_z.ipw.plane_orientation = 'z_axes' self.scene = e.current_scene return def tearDown(self): """For necessary clean up, automatically called by TestCase after the test methods have been invoked""" self.e.stop() return def check(self): """Do the actual testing.""" s=self.scene src = s.children[0] i1, i2, i3 = src.children[0].children[1:] self.assertEqual(i1.ipw.plane_orientation,'x_axes') self.assertEqual(numpy.allclose(i1.ipw.center, (0, 31.5, 31.5)),True) self.assertEqual( i2.ipw.plane_orientation,'y_axes') self.assertEqual(numpy.allclose(i2.ipw.center, (31.5, 0, 31.5)),True) self.assertEqual(i3.ipw.plane_orientation,'z_axes') self.assertEqual( numpy.allclose(i3.ipw.center, (31.5, 31.5, 0)),True) def test_image_plane_widget(self): "Test if the test fixture works" self.check() def test_save_and_restore(self): """Test if saving a visualization and restoring it works.""" engine = self.e scene = self.scene # Save visualization. f = BytesIO() f.name = abspath('test.mv2') # We simulate a file. engine.save_visualization(f) f.seek(0) # So we can read this saved data. # Remove existing scene. engine.close_scene(scene) # Load visualization engine.load_visualization(f) self.scene = engine.current_scene self.check() def test_deepcopied(self): """Test if the MayaVi2 visualization can be deep-copied.""" ############################################################ # Test if the MayaVi2 visualization can be deep-copied. # Pop the source object. s = self.scene sources = s.children s.children = [] # Add it back to see if that works without error. s.children.extend(sources) self.check() # Now deepcopy the source and replace the existing one with # the copy. This basically simulates cutting/copying the # object from the UI via the right-click menu on the tree # view, and pasting the copy back. sources1 = copy.deepcopy(sources) s.children[:] = sources1 self.check() class TestImagePlaneWidgetNewPipeline(unittest.TestCase): def setUp(self): self._orig_backend = mlab.options.backend mlab.options.backend = "test" def tearDown(self): mlab.options.backend = self._orig_backend def test_ipw_works_with_image_data_probe(self): src = mlab.pipeline.open(get_example_data('pyramid_ug.vtu')) idp = mlab.pipeline.image_data_probe(src) with patch('pyface.api.error') as m: ipw = mlab.pipeline.image_plane_widget(idp) self.assertEqual(m.call_count, 0) self.assertEqual(numpy.allclose(ipw.ipw.center, (0.0, 3.0, 1.5)),True) if __name__ == '__main__': unittest.main() mayavi-4.5.0/mayavi/tests/test_ipw_multiple_scalars.py0000644000076500000240000000601012747716314023706 0ustar prabhustaff00000000000000import unittest from numpy import zeros, random from tvtk.api import tvtk from tvtk.common import is_old_pipeline from mayavi.sources.vtk_data_source import VTKDataSource from mayavi.core.null_engine import NullEngine from mayavi.modules.image_plane_widget import ImagePlaneWidget class TestIPWMultipleScalars(unittest.TestCase): def setUp(self): # Create dataset with multiple scalars. arr1 = zeros(27, 'f') for n in range(27): arr1[n] = (1+float(n))/10.0 arr2 = (arr1 + 1).astype('d') arr3 = arr1 + 2.0*(0.5 - random.random(27)) arr3 = arr3.astype('f') if is_old_pipeline(): p = tvtk.ImageData(dimensions=[3,3,3],spacing=[1,1,1], scalar_type='int') else: p = tvtk.ImageData(dimensions=[3,3,3],spacing=[1,1,1]) p.point_data.scalars = arr1 p.point_data.scalars.name = 'first' j2 = p.point_data.add_array(arr2) p.point_data.get_array(j2).name='second' j3 = p.point_data.add_array(arr3) p.point_data.get_array(j3).name='third' self.img = p self.first = arr1 self.second = arr2 self.third = arr3 # Setup the mayavi pipeline. e = NullEngine() e.start() e.new_scene() self.e = e src = VTKDataSource(data=p) e.add_source(src) self.src = src ipw = ImagePlaneWidget() e.add_module(ipw) self.ipw = ipw def tearDown(self): self.e.stop() return def test_ipw(self): """Test the image plane widget.""" arr1, arr2, arr3 = self.first, self.second, self.third ipw = self.ipw.ipw scalars = ipw.input.point_data.scalars r = scalars.range expect = min(arr1), max(arr1) self.assertEqual(r, expect) o = self.src.outputs[0] o.update_traits() if is_old_pipeline(): st = ipw.input.scalar_type else: st = ipw.input.scalar_type_as_string self.assertEqual(scalars.data_type, 10) self.assertEqual(st, 'float') self.src.point_scalars_name = 'second' scalars = ipw.input.point_data.scalars r = scalars.range expect = min(arr2), max(arr2) self.assertEqual(r, expect) o.update_traits() if is_old_pipeline(): st = ipw.input.scalar_type else: st = ipw.input.scalar_type_as_string self.assertEqual(scalars.data_type, 11) self.assertEqual(st, 'double') self.src.point_scalars_name = 'third' scalars = ipw.input.point_data.scalars r = scalars.range expect = min(arr3), max(arr3) self.assertEqual(r, expect) o.update_traits() if is_old_pipeline(): st = ipw.input.scalar_type else: st = ipw.input.scalar_type_as_string self.assertEqual(scalars.data_type, 10) self.assertEqual(st, 'float') if __name__ == '__main__': unittest.main() mayavi-4.5.0/mayavi/tests/test_mayavi_traits.py0000644000076500000240000001043612747716314022347 0ustar prabhustaff00000000000000""" Tests for traits defined in mayavi.core.traits """ # Author: Prabhu Ramachandran # Copyright (c) 2008, Prabhu Ramachandran Enthought, Inc. # License: BSD Style. import unittest import numpy from traits.api import (HasTraits, Either, Array, Any, TraitError, Float, Int) from mayavi.core.trait_defs import (ArrayNumberOrNone, ArrayOrNone, ShadowProperty) class DataNotSmart(HasTraits): x = ShadowProperty(ArrayOrNone, smart_notify=False) # Test attribute. _test = Any def _x_changed(self, value): self._test = value.copy() class DataSmart(HasTraits): x = ShadowProperty(ArrayOrNone, smart_notify=True) # Test attribute. _test = Any def _x_changed(self, value): self._test = value.copy() class Simple(HasTraits): x = ShadowProperty(Float) # Test attribute. _test = Int(0) def _x_changed(self, value): self._test += 1 class HasArrays(HasTraits): x = ArrayOrNone y = ArrayNumberOrNone # Test attribute. _test_x = Int(0) _test_y = Int(0) def _x_changed(self, value): self._test_x += 1 def _y_changed(self, value): self._test_y += 1 class TestShadowProperty(unittest.TestCase): def test_simple_case(self): "Test a simple trait wrapped as a shadow property." s = Simple(x=10.0) self.assertEqual(s._test, 1) self.assertEqual(s.x, 10.0) s.x = 10.0 self.assertEqual(s._test, 1) self.assertEqual(s.x, 10.0) s.x = 20.0 self.assertEqual(s._test, 2) self.assertEqual(s.x, 20.0) self.assertRaises(TraitError, s.__setattr__, 'x', 'hey') def test_shadow_property_smart(self): "Test if the shadow property trait type works correctly." x = numpy.linspace(0, 1) d = DataSmart(x=x) self.assertEqual(numpy.all(d.x == x), True) self.assertEqual(numpy.all(d._x == x), True) self.assertEqual(numpy.all(d._test == x), True) old = x.copy() x *= 2 d.x = x self.assertEqual(numpy.all(d.x == x), True) self.assertEqual(numpy.all(d._x == x), True) # Notifier shouldn't be called. self.assertEqual(numpy.all(d._test == old), True) def test_shadow_property_not_smart(self): "Test if the shadow property trait type works correctly." x = numpy.linspace(0, 1) d = DataNotSmart(x=x) self.assertEqual(numpy.all(d.x == x), True) self.assertEqual(numpy.all(d._x == x), True) self.assertEqual(numpy.all(d._test == x), True) x *= 2 d.x = x self.assertEqual(numpy.all(d.x == x), True) self.assertEqual(numpy.all(d._x == x), True) self.assertEqual(numpy.all(d._test == x), True) def test_type_checking(self): "Test if the validation works correctly." x = numpy.linspace(0, 1) d = DataNotSmart(x=x) self.assertRaises(TraitError, d.__setattr__, 'x', 'hey') def test_set_trait_change_notify(self): "If trait_change_notify is honored." s = Simple() trait_names = s.trait_names() s.x = 10.0 self.assertEqual(s._test, 1) self.assertEqual(s.x, 10.0) s.set(x=20.0, trait_change_notify=False) self.assertEqual(s._test, 1) self.assertEqual(s.x, 20.0) # Assert that no new traits were added and no new notifiers were # added. self.assertEqual(s.trait_names(), trait_names) self.assertEqual(s._notifiers(False), None) class TestArrayOrNone(unittest.TestCase): def test_default(self): a = HasArrays() self.assertIsNone(a.x) self.assertIsNone(a.y) def test_no_compare(self): a = HasArrays() a.x = numpy.arange(10) self.assertEqual(a._test_x, 1) a.x = numpy.arange(10) self.assertEqual(a._test_x, 2) a.x = a.x self.assertEqual(a._test_x, 3) a.x = None self.assertEqual(a._test_x, 4) a.y = numpy.arange(10) self.assertEqual(a._test_y, 1) a.y = 1.0 self.assertEqual(a.y.shape, (1,)) self.assertEqual(a._test_y, 2) a.y = a.y self.assertEqual(a._test_y, 3) a.y = None self.assertEqual(a._test_y, 4) if __name__ == '__main__': unittest.main() mayavi-4.5.0/mayavi/tests/test_mlab_integration.py0000644000076500000240000003647512747716314023024 0ustar prabhustaff00000000000000""" Integration tests of mlab with the null engine. This also tests some numerics with VTK. """ import unittest import mock import numpy as np from traits.testing.unittest_tools import UnittestTools from mayavi import mlab from mayavi.core.engine import Engine from tvtk.api import tvtk from mayavi.tools.engine_manager import engine_manager from mayavi.core.registry import registry ################################################################################ # class `TestMlabNullEngine` ################################################################################ class TestMlabNullEngine(unittest.TestCase): """ Stub mlab to isolate as well as possible from creation of a new figure. """ def setUp(self): mlab.options.backend = 'test' e = mlab.get_engine() self.e = e def tearDown(self): # Check that the NullEngine is still the mlab engine current_engine = mlab.get_engine() engine_overridden = not current_engine is self.e engine_manager.current_engine = None self.e.stop() registry.unregister_engine(self.e) if engine_overridden: current_engine.stop() registry.unregister_engine(current_engine) raise AssertionError("The NullEngine has been overridden") ################################################################################ # class `TestMlabNullEngineMisc` ################################################################################ class TestMlabNullEngineMisc(TestMlabNullEngine): """ Misc tests for mlab with the null engine """ def test_contour_filter(self): a = np.zeros((3, 3, 3)) a[1, 1, 1] = 1 src = mlab.pipeline.scalar_field(a) filter = mlab.pipeline.contour(src) x, y, z = filter.get_output_dataset().points.to_array().T # Check that the contour filter indeed did its work: np.testing.assert_almost_equal(x, [ 2. , 2. , 1.5, 2.5, 2. , 2. ]) np.testing.assert_almost_equal(y, [ 2. , 1.5, 2. , 2. , 2.5, 2. ]) np.testing.assert_almost_equal(z, [ 1.5, 2. , 2. , 2. , 2. , 2.5]) # Check that the filter was not added to a live scene: if filter.scene is not None: raise AssertionError("The NullEngine seems not to work") def test_user_defined_filter(self): x, y, z = np.random.random((3, 100)) src = mlab.pipeline.scalar_scatter(x, y, z) density = mlab.pipeline.user_defined(src, filter='GaussianSplatter') self.assertEqual(len(density.outputs), 1) self.assertTrue(isinstance(density.get_output_dataset(), tvtk.ImageData)) def test_mlab_source(self): """ Check that the different objects created by mlab have an 'mlab_source' attribute. """ # Test for functions taking 3D scalar data pipelines = ( (mlab.pipeline.scalar_scatter, ), (mlab.pipeline.scalar_field, ), (mlab.pipeline.scalar_field, mlab.pipeline.image_plane_widget), (mlab.contour3d, ), (mlab.points3d, ), ) data = np.random.random((3, 3, 3)) for pipeline in pipelines: obj = pipeline[0](data) for factory in pipeline[1:]: obj = factory(obj) self.assertTrue(hasattr(obj, 'mlab_source')) # Test for functions taking x, y, z 2d arrays. x, y, z = np.random.random((3, 3, 3)) pipelines = ( (mlab.mesh, ), (mlab.surf, ), (mlab.quiver3d, ), (mlab.pipeline.vector_scatter, ), (mlab.pipeline.vector_scatter, mlab.pipeline.extract_vector_components), (mlab.pipeline.vector_scatter, mlab.pipeline.extract_vector_norm), (mlab.pipeline.array2d_source, ), ) for pipeline in pipelines: obj = pipeline[0](x, y, z) for factory in pipeline[1:]: obj = factory(obj) self.assertTrue(hasattr(obj, 'mlab_source')) def test_figure(self): """ Various tests for mlab.figure(). """ # Test when specifying figure instances f1 = mlab.figure() e = mlab.get_engine() self.assertTrue(e.current_scene is f1) f2 = mlab.figure() self.assertTrue(e.current_scene is f2) mlab.figure(f1) self.assertTrue(e.current_scene is f1) # Test when specifying figure numbers f1 = mlab.figure(3) self.assertTrue(e.current_scene is f1) f2 = mlab.figure(4) self.assertTrue(e.current_scene is f2) mlab.figure(3) self.assertTrue(e.current_scene is f1) # Test when specifying figure names f1 = mlab.figure('Test 1') self.assertTrue(e.current_scene is f1) f2 = mlab.figure('Test 2') self.assertTrue(e.current_scene is f2) mlab.figure('Test 1') self.assertTrue(e.current_scene is f1) def test_close(self): """ Various tests for mlab.close(). """ f = mlab.figure() self.assertTrue(f.running) mlab.close(f) self.assertFalse(f.running) f = mlab.figure(314) self.assertTrue(f.running) mlab.close(314) self.assertFalse(f.running) f = mlab.figure('test_figure') self.assertTrue(f.running) mlab.close('test_figure') self.assertFalse(f.running) f = mlab.figure() self.assertTrue(f.running) mlab.close() self.assertFalse(f.running) figs = [mlab.figure() for i in range(5)] for f in figs: self.assertTrue(f.running) mlab.close(all=True) for f in figs: self.assertFalse(f.running) def test_triangular_mesh_reset(self): """ When reseting the triangular mesh (ie polydata), if we are not careful, we can create a segfault by passing triangules between points that do not exist. """ # We need to run this as a full test of mlab, rather than only a # test of the source, as to get a segfault, we need a module # opened on the source. n = 100 triangles = np.c_[np.arange(n-3), np.arange(n-3)+1, n-1-np.arange(n-3)] x, y, z = np.random.random((3, n)) src = mlab.triangular_mesh(x, y, z, triangles) # Now grow the mesh n = 1000 triangles = np.c_[np.arange(n-3), np.arange(n-3)+1, n-1-np.arange(n-3)] x, y, z = np.random.random((3, n)) src.mlab_source.reset(x=x, y=y, z=z, triangles=triangles) def test_colorbar(self): """ Test that when an object with scalars hidden is created, it does not get a colorbar, unless no other is avalaible. """ a = np.random.random((5, 5)) s1 = mlab.surf(a, colormap='gist_earth') s2 = mlab.surf(a, color=(0, 0, 0)) mlab.colorbar() self.assertEqual( s2.module_manager.scalar_lut_manager.show_scalar_bar, False) self.assertEqual( s1.module_manager.scalar_lut_manager.show_scalar_bar, True) ################################################################################ # class `TestMlabPipeline` ################################################################################ class TestMlabPipeline(TestMlabNullEngine): """ Test the pipeline functions. For vtk versions greater than 5.10, widgets need a render window interactor to be set, otherwise an error is raised. As such this test checks for the current VTK version and setups a real engine for vtk > 5.10 and null engine otherwise. """ def setUp(self): ver = tvtk.Version() self.less_than_or_equal_to_vtk_5_10 = True if ver.vtk_major_version >= 5 and ver.vtk_minor_version > 10: self.less_than_or_equal_to_vtk_5_10 = False if self.less_than_or_equal_to_vtk_5_10: super(TestMlabPipeline, self).setUp() else: e = Engine() e.start() mlab.set_engine(e) def tearDown(self): if self.less_than_or_equal_to_vtk_5_10: super(TestMlabPipeline, self).tearDown() else: for engine in list(registry.engines.keys()): registry.unregister_engine(engine) def test_probe_data(self): """ Test probe_data """ x, y, z = np.mgrid[0:1:10j, 0:1:10j, 0:1:10j] r = np.sqrt(x**2 + y**2 + z**2) iso = mlab.contour3d(x, y, z, r) x_, y_, z_ = np.random.random((3, 10, 4, 2)) r_ = mlab.pipeline.probe_data(iso, x_, y_, z_) np.testing.assert_array_almost_equal(r_, np.sqrt(x_**2 + y_**2 + z_**2), decimal=1) flow = mlab.flow(x, y, z, x, y, z) u_, v_, w_ = mlab.pipeline.probe_data(flow, x_, y_, z_, type='vectors') np.testing.assert_array_almost_equal(u_, x_, decimal=2) np.testing.assert_array_almost_equal(v_, y_, decimal=2) np.testing.assert_array_almost_equal(w_, z_, decimal=3) ################################################################################ # class `TestMlabHelperFunctions` ################################################################################ class TestMlabHelperFunctions(TestMlabNullEngine, UnittestTools): """ Test various behaviors of the mlab helper functions. """ def test_barchart(self): s = np.random.random((10, 10)) x, y = np.indices(s.shape) bar1 = mlab.barchart(x, y, s) bar2 = mlab.barchart(s) bar3 = mlab.barchart(s, auto_scale=False) # Check that auto scaling worked well in the different # configurations for bar in bar1, bar2, bar3: self.assertEqual(bar.glyph.glyph_source.glyph_source.y_length, 0.9) def test_imshow(self): s = np.random.random((10, 10)) # This should work. obj = mlab.imshow(s) def test_imshow_extent(self): mlab.imshow(np.random.rand(10, 20), extent=[-1, 11, -1, 21, 0, 0]) def test_imshow_colormap(self): # Check if the pipeline is refreshed when we change colormap. # See issue #262 a = np.random.random_integers(0, 10, (100, 100)) actor = mlab.imshow(a, colormap="cool") with self.assertTraitChanges(actor, 'pipeline_changed'): actor.module_manager.scalar_lut_manager.lut_mode = 'jet' ################################################################################ # class `TestMlabModules` ################################################################################ class TestMlabModules(TestMlabNullEngine): """ Test the mlab modules. """ def test_volume(self): """ Test the mlab volume factory. """ scalars = np.zeros((3, 3, 3)) scalars[0] = 1 src = mlab.pipeline.scalar_field(scalars) color = (1, 0.1, 0.314) vol = mlab.pipeline.volume(src, vmin=0.5, vmax=0.9, color=color) # Test the color feature for value in np.random.random(10): # get_color() will sometimes return .314 as .313999...9995, so we # use allclose() to match the tuples. np.allclose(vol._ctf.get_color(value), color) # Test the vmin and vmax features for value in 0.5*np.random.random(10): self.assertEqual(vol._otf.get_value(value), 0) for value in (0.9+0.1*np.random.random(10)): self.assertEqual(vol._otf.get_value(value), 0.2) # Test the rescaling of the colormap when using vmin and vmax # Rmq: we have to be careful: the range of the ctf can change vol1 = mlab.pipeline.volume(src) range1 = vol1._ctf.range[1] - vol1._ctf.range[0] vol2 = mlab.pipeline.volume(src, vmin=0.25, vmax=0.75) range2 = vol2._ctf.range[1] - vol2._ctf.range[0] for value in 0.5*np.random.random(10): np.testing.assert_array_almost_equal( vol1._ctf.get_color(2*range1*value), vol2._ctf.get_color(0.25+range2*value)) # Test outside the special [0, 1] range src = mlab.pipeline.scalar_field(2*scalars) vol1 = mlab.pipeline.volume(src) range1 = vol1._ctf.range[1] - vol1._ctf.range[0] vol2 = mlab.pipeline.volume(src, vmin=0.5, vmax=1.5) range2 = vol2._ctf.range[1] - vol2._ctf.range[0] for value in np.random.random(10): np.testing.assert_array_almost_equal( vol1._ctf.get_color(2*range1*value), vol2._ctf.get_color(0.5+range2*value)) def test_text(self): """ Test the text module. """ data = np.random.random((3, 3, 3)) src = mlab.pipeline.scalar_field(data) # Some smoke testing mlab.text(0.1, 0.9, 'foo') mlab.text(3, 3, 'foo', z=3) mlab.title('foo') # Check that specifying 2D positions larger than 1 raises an # error self.assertRaises(ValueError, mlab.text, 0, 1.5, 'test') def test_text3d(self): """ Test the text3d module. """ data = np.random.random((3, 3, 3)) src = mlab.pipeline.scalar_field(data) t = mlab.text3d(0, 0, 0, 'foo', opacity=0.5, scale=2, orient_to_camera=False, color=(0, 0, 0), orientation=(90, 0, 0)) def test_contour_grid_plane(self): """Test the contour_grid_plane. """ data = np.random.random((10, 10, 10)) src = mlab.pipeline.scalar_field(data) mlab.pipeline.outline(src) mlab.pipeline.grid_plane(src) mlab.pipeline.contour_grid_plane(src) def test_barchart(self): """Test the barchart function.""" s = np.abs(np.random.random((3,3))) b = mlab.barchart(s) self.assertEqual(b.glyph.glyph.scale_mode, 'scale_by_vector_components') s += 1 b.mlab_source.update() self.assertEqual(b.glyph.glyph.scale_mode, 'scale_by_vector_components') ################################################################################ # class `TestMlabAnimate` ################################################################################ class TestMlabAnimate(TestMlabNullEngine): def test_animate_sets_up_movie_maker(self): # Given @mlab.animate def anim(): for i in range(5): yield self.e.new_scene() from mayavi.tests.test_file_timestep import make_mock_scene self.e.current_scene.scene = make_mock_scene() mm = self.e.current_scene.scene.movie_maker # When from mayavi.core.file_data_source import NoUITimer with mock.patch('mayavi.tools.animator.Timer', NoUITimer): a = anim() a.timer.Start() # Then mm.animation_start.assert_called_once_with() self.assertEqual(mm.animation_step.call_count, 4) mm.animation_stop.assert_called_once_with() if __name__ == '__main__': unittest.main() mayavi-4.5.0/mayavi/tests/test_mlab_null_engine.py0000644000076500000240000000400312747716314022756 0ustar prabhustaff00000000000000""" Test the mlab null engine. """ import unittest from mayavi import mlab from mayavi.core.engine import Engine from mayavi.tools.engine_manager import engine_manager from mayavi.core.registry import registry from mayavi.tests.common import get_example_data ################################################################################ # class `TestMlabNullEngineBase` ################################################################################ class TestMlabNullEngineBase(unittest.TestCase): """ Base class to test mlab with the null engine """ def setUp(self): e = Engine() e.start() self._non_null_engine = e mlab.set_engine(e) def tearDown(self): # Check that the NullEngine was not set as the default mlab engine. if not mlab.get_engine() is self._non_null_engine: raise AssertionError("The NullEngine has overridden the default one") engine_manager.current_engine = None # Unregistering all unused engines. registry.unregister_engine(self._non_null_engine) for engine in list(registry.engines): registry.unregister_engine(engine) ################################################################################ # class `TestRealMlabNullEngine` ################################################################################ class TestRealMlabNullEngine(unittest.TestCase): """Tests if the mlab settings via the options.backend and offscreen options work correctly.""" def setUp(self): self.backend = mlab.options.backend def tearDown(self): mlab.options.backend = self.backend for engine in list(registry.engines): registry.unregister_engine(engine) def test_test_backend(self): """Test if setting the backend to 'test' works.""" mlab.options.backend = 'test' mlab.test_contour3d() mlab.clf() mlab.pipeline.open(get_example_data('cube.vti')) mlab.clf() if __name__ == '__main__': unittest.main() mayavi-4.5.0/mayavi/tests/test_mlab_scene_model.py0000644000076500000240000000265312747716314022745 0ustar prabhustaff00000000000000""" Testing the MlabSceneModel """ import unittest import numpy as np from traits.api import HasTraits, Instance from mayavi.tools.mlab_scene_model import MlabSceneModel from mayavi import mlab from mayavi.tests.test_mlab_integration import TestMlabNullEngine ############################################################################### # class `TestMlabSceneModel` ############################################################################### class TestMlabSceneModel(TestMlabNullEngine): """ Testing the MlabSceneModel, in particular the magic mlab attribute. """ def test_several_scene_models(self): """ Check that plotting to scene attributes using their mlab attribute does create objects as children, and does not unset the current scene """ class TestObject(HasTraits): scene1 = Instance(MlabSceneModel, ()) scene2 = Instance(MlabSceneModel, ()) test_object = TestObject() x, y, z = np.random.random((3, 10)) plt = mlab.plot3d(x, y, z, figure=test_object.scene1.mayavi_scene) pts = mlab.points3d(x, y, z, figure=test_object.scene2.mayavi_scene) # Check that each figure got the module it should have self.assertEqual(plt.scene, test_object.scene1) self.assertEqual(pts.scene, test_object.scene2) if __name__ == '__main__': unittest.main() mayavi-4.5.0/mayavi/tests/test_mlab_source.py0000644000076500000240000006722212747716314021773 0ustar prabhustaff00000000000000""" Test for MlabSource and its subclasses. """ # Author: Prabhu Ramachandran # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. import unittest import numpy as N from mayavi.tools import sources ################################################################################ # `TestMGlyphSource` ################################################################################ class TestMGlyphSource(unittest.TestCase): def setUp(self): self.x = x = N.ones(10, float) self.y = y = N.ones(10, float)*2.0 self.z = z = N.linspace(0, 10, 10) self.v = v = N.ones((10, 3), float)*10.0 self.s = s = N.ones(10, float) src = sources.MGlyphSource() src.reset(x=x, y=y, z=z, u=v[:,0], v=v[:,1], w=v[:,2], scalars=s) self.src = src def tearDown(self): return def get_data(self): return self.x, self.y, self.z, self.v, self.s, self.src def check_traits(self): """Check if the sources traits are set correctly.""" x, y, z, v, s, src = self.get_data() # Check if points are set correctly. self.assertEqual(N.alltrue(src.points[:,0].ravel() == x.ravel()), True) self.assertEqual(N.alltrue(src.points[:,1].ravel() == y.ravel()), True) self.assertEqual(N.alltrue(src.points[:,2].ravel() == z.ravel()), True) # Check the vectors and scalars. self.assertEqual(N.alltrue(src.vectors == v), True) self.assertEqual(N.alltrue(src.scalars == s), True) def check_dataset(self): """Check the TVTK dataset.""" x, y, z, v, s, src = self.get_data() # Check if the dataset is setup right. pts = src.dataset.points.to_array() self.assertEqual(N.alltrue(pts[:,0].ravel() == x.ravel()), True) self.assertEqual(N.alltrue(pts[:,1].ravel() == y.ravel()), True) self.assertEqual(N.alltrue(pts[:,2].ravel() == z.ravel()), True) vec = src.dataset.point_data.vectors.to_array() sc = src.dataset.point_data.scalars.to_array() self.assertEqual(N.alltrue(vec == v), True) self.assertEqual(N.alltrue(sc == s.ravel()), True) def test_reset_with_same_size_data(self): x, y, z, v, s, src = self.get_data() self.check_traits() self.check_dataset() # Call reset again with just a few things changed to see if it # works correctly. x *= 5 s *= 10 v *= 0.1 src.reset(x=x, u=v[:,0], v=v[:,1], w=v[:,2], scalars=s) self.check_traits() self.check_dataset() def test_reset_with_resized_data(self): x, y, z, v, s, src = self.get_data() self.check_traits() self.check_dataset() # Call reset again with just a few things changed to see if it # works correctly. self.x = x = N.ones(20, float)*30.0 self.y = y = N.ones(20, float)*30.0 self.z = z = N.ones(20, float)*30.0 points = N.ones((20, 3), float)*30.0 self.s = s = N.ones(20, float) self.v = v = N.ones((20, 3), float)*30.0 src.reset(x=x,y=y,z=z, u=v[:,0], v=v[:,1], w=v[:,2], scalars=s,points=points,vectors=v) self.check_traits() self.check_dataset() def test_reset_strange_shape(self): " Test the reset method when the inputs are 2-d arrays." x, y, z, v, s, src = self.get_data() self.x = x = N.reshape(x, (5,2)) self.y = y = N.reshape(y, (5,2)) self.z = z = N.reshape(z, (5,2)) u = N.reshape(v[:,0], (5,2)) vv = N.reshape(v[:,1], (5,2)) w = N.reshape(v[:,2], (5,2)) self.s = s = N.reshape(s, (5,2)) src.reset(x=x, y=y, z=z, u=u, v=vv, w=w, scalars=s) self.check_traits() self.check_dataset() def test_handlers(self): "Test if the various static handlers work correctly." x, y, z, v, s, src = self.get_data() x *= 2 y *= 2 z *= 2 v *= 2 s *= 2 src.x = x src.y = y src.z = z src.u = v[:,0] src.v = v[:,1] src.w = v[:,2] src.scalars = s self.check_traits() self.check_dataset() def test_handlers_strange_shape(self): "Test if the various static handlers work correctly for strange shapes." # Initialize with 2-d array data. x, y, z, v, s, src = self.get_data() x = N.reshape(x, (5,2)) y = N.reshape(y, (5,2)) z = N.reshape(z, (5,2)) u = N.reshape(v[:,0], (5,2)) vv = N.reshape(v[:,1], (5,2)) w = N.reshape(v[:,2], (5,2)) s = N.reshape(s, (5,2)) src.reset(x=x, y=y, z=z, u=u, v=vv, w=w, scalars=s) # modify variables in src to check handlers self.x = src.x = 2*x self.y = src.y = 2*y self.z = src.z = 2*z src.u = 2*z src.v = 2*vv src.w = 2*w self.v[:,0] = src.u.ravel() self.v[:,1] = src.v.ravel() self.v[:,2] = src.w.ravel() self.s = src.scalars = 2*s self.check_traits() self.check_dataset() def test_set(self): "Test if the set method works correctly." x, y, z, v, s, src = self.get_data() x *= 2 z *= 2 s *= 2 src.set(x=x, z=z, scalars=s) self.check_traits() self.check_dataset() def test_strange_shape(self): " Test the MGlyphSource with strange shapes for the arguments " x, y, z, v, s, src = self.get_data() x = y = z = v = s = 0 src.reset(x=x, y=y, z=z, u=v, v=v, w=v, scalars=None) src.reset(x=x, y=y, z=z, u=v, v=v, w=v, scalars=s) x = y = z = v = s = 1 src.set(x=x, y=y, z=z, u=v, v=v, w=v, scalars=None) src.set(x=x, y=y, z=z, u=v, v=v, w=v, scalars=s) ################################################################################ # `TestMGlyphSource` ################################################################################ class TestMVerticalSource(unittest.TestCase): def setUp(self): self.x = x = N.ones(10, float) self.y = y = N.ones(10, float)*2.0 self.z = z = N.linspace(0, 10, 10) self.s = s = N.ones(10, float) src = sources.MVerticalGlyphSource() src.reset(x=x, y=y, z=z, scalars=s) self.src = src def tearDown(self): return def get_data(self): return self.x, self.y, self.z, self.s, self.src def check_traits(self): """Check if the sources traits are set correctly.""" x, y, z, s, src = self.get_data() # Check if points are set correctly. self.assertEqual(N.alltrue(src.points[:,0].ravel() == x), True) self.assertEqual(N.alltrue(src.points[:,1].ravel() == y), True) self.assertEqual(N.alltrue(src.points[:,2].ravel() == z), True) # Check the vectors and scalars. self.assertEqual(N.alltrue(src.vectors[:, -1] == s), True) self.assertEqual(N.alltrue(src.vectors[:, :-1] == 1), True) self.assertEqual(N.alltrue(src.scalars == s), True) def check_dataset(self): """Check the TVTK dataset.""" x, y, z, s, src = self.get_data() # Check if the dataset is setup right. pts = src.dataset.points.to_array() self.assertEqual(N.alltrue(pts[:,0].ravel() == x), True) self.assertEqual(N.alltrue(pts[:,1].ravel() == y), True) self.assertEqual(N.alltrue(pts[:,2].ravel() == z), True) vec = src.dataset.point_data.vectors.to_array() sc = src.dataset.point_data.scalars.to_array() self.assertEqual(N.alltrue(vec[:, -1] == s), True) self.assertEqual(N.alltrue(vec[:, :-1] == 1), True) self.assertEqual(N.alltrue(sc == s), True) def test_reset(self): "Test the reset method." x, y, z, s, src = self.get_data() self.check_traits() self.check_dataset() # Call reset again with just a few things changed to see if it # works correctly. x *= 5 s *= 10 src.reset(x=x, scalars=s) self.check_traits() self.check_dataset() def test_reset1(self): "Test the reset method." x, y, z, s, src = self.get_data() self.check_traits() self.check_dataset() # Call reset again with just a few things changed to see if it # works correctly. self.x = x = N.ones(20, float)*30.0 self.y = y = N.ones(20, float)*30.0 self.z = z = N.ones(20, float)*30.0 points = N.ones((20, 3), float)*30.0 self.s = s = N.ones(20, float) src.reset(x=x, y=y, z=z, scalars=s, points=points) self.check_traits() self.check_dataset() def test_handlers(self): "Test if the various static handlers work correctly." x, y, z, s, src = self.get_data() x *= 2 y *= 2 z *= 2 s *= 2 src.x = x src.y = y src.z = z src.scalars = s self.check_traits() self.check_dataset() def test_set(self): "Test if the set method works correctly." x, y, z, s, src = self.get_data() x *= 2 z *= 2 s *= 2 src.set(x=x, z=z, scalars=s) self.check_traits() self.check_dataset() ################################################################################ # `TestMArraySource` ################################################################################ class TestMArraySource(unittest.TestCase): def setUp(self): x, y, z = N.ogrid[-10:10:11j, -10:10:12j, -10:10:20j] self.x, self.y, self.z = x, y, z dims = (x.shape[0], y.shape[1], z.shape[2]) self.v = v = N.ones(dims + (3,), float) v[...,2] = 2 v[...,2] = 3 self.s = s = N.ones(dims, float) src = sources.MArraySource() src.reset(x=x, y=y, z=z, u=v[...,0], v=v[...,1], w=v[...,2], scalars=s) self.src = src def tearDown(self): return def get_data(self): return self.x, self.y, self.z, self.v, self.s, self.src def check_traits(self): """Check if the sources traits are set correctly.""" x, y, z, v, s, src = self.get_data() # Check if points are set correctly. self.assertEqual(N.alltrue(src.x == x), True) self.assertEqual(N.alltrue(src.y == y), True) self.assertEqual(N.alltrue(src.z == z), True) # Check the vectors and scalars. self.assertEqual(N.alltrue(src.vectors == v), True) self.assertEqual(N.alltrue(src.scalars == s), True) def check_dataset(self): """Check the TVTK dataset.""" x, y, z, v, s, src = self.get_data() # Check if the dataset is setup right. dx = x[1, 0, 0] - x[0, 0, 0] dy = y[0, 1, 0] - y[0, 0, 0] dz = z[0, 0, 1] - z[0, 0, 0] origin = [x.min(), y.min(), z.min()] spacing = [dx, dy, dz] dimensions = (x.shape[0], y.shape[1], z.shape[2]) ds = src.dataset self.assertEqual(N.all(src.m_data.origin == origin), True) self.assertEqual(N.allclose(src.m_data.spacing, spacing), True) self.assertEqual(N.allclose(ds.dimensions, dimensions), True) vec = src.dataset.point_data.vectors.to_array() sc = src.dataset.point_data.scalars.to_array() v1 = v.transpose((2, 0, 1, 3)) self.assertEqual(N.alltrue(vec.ravel() == v1.ravel()), True) s1 = s.transpose() self.assertEqual(N.alltrue(sc.ravel() == s1.ravel()), True) def test_reset(self): "Test the reset method." x, y, z, v, s, src = self.get_data() self.check_traits() self.check_dataset() # Call reset again with just a few things changed to see if it # works correctly. x *= 5 s *= 10 v *= 0.1 src.reset(x=x, u=v[...,0], v=v[...,1], w=v[...,2], scalars=s) self.check_traits() self.check_dataset() def test_reset1(self): "Test the reset method." x, y, z, v, s, src = self.get_data() self.check_traits() self.check_dataset() # Call reset again with just a few things changed to see if it # works correctly. x, y, z = N.ogrid[-10:10:11j, -10:10:12j, -10:10:20j] self.x, self.y, self.z = x, y, z dims = (x.shape[0], y.shape[1], z.shape[2]) self.v = v = N.ones(dims + (3,), float) v[...,2] = 2 v[...,2] = 3 self.s = s = N.ones(dims, float) src = sources.MArraySource() src.reset(x=x, y=y, z=z, u=v[...,0], v=v[...,1], w=v[...,2], scalars=s,vectors=v) self.check_traits() self.check_dataset() def test_handlers(self): "Test if the various static handlers work correctly." x, y, z, v, s, src = self.get_data() x *= 2 y *= 2 z *= 2 v *= 2 s *= 2 src.x = x src.y = y src.z = z src.u = v[...,0] src.v = v[...,1] src.w = v[...,2] src.scalars = s self.check_traits() self.check_dataset() def test_set(self): "Test if the set method works correctly." x, y, z, v, s, src = self.get_data() x *= 2 z *= 2 s *= 2 src.set(x=x, z=z, scalars=s) self.check_traits() self.check_dataset() ################################################################################ # `TestMLineSource` ################################################################################ class TestMLineSource(unittest.TestCase): def setUp(self): self.x = x = N.ones(10, float) self.y = y = N.ones(10, float)*2.0 self.z = z = N.linspace(0, 10, 10) self.s = s = N.ones(10, float) src = sources.MLineSource() src.reset(x=x, y=y, z=z, scalars=s) self.src = src def tearDown(self): return def get_data(self): return self.x, self.y, self.z, self.s, self.src def check_traits(self): """Check if the sources traits are set correctly.""" x, y, z, s, src = self.get_data() # Check if points are set correctly. self.assertEqual(N.alltrue(src.points[:,0].ravel() == x), True) self.assertEqual(N.alltrue(src.points[:,1].ravel() == y), True) self.assertEqual(N.alltrue(src.points[:,2].ravel() == z), True) # Check the scalars. self.assertEqual(N.alltrue(src.scalars == s), True) def check_dataset(self): """Check the TVTK dataset.""" x, y, z, s, src = self.get_data() # Check if the dataset is setup right. pts = src.dataset.points.to_array() self.assertEqual(N.alltrue(pts[:,0].ravel() == x), True) self.assertEqual(N.alltrue(pts[:,1].ravel() == y), True) self.assertEqual(N.alltrue(pts[:,2].ravel() == z), True) sc = src.dataset.point_data.scalars.to_array() self.assertEqual(N.alltrue(sc == s), True) def test_reset(self): "Test the reset method." x, y, z, s, src = self.get_data() self.check_traits() self.check_dataset() # Call reset again with just a few things changed to see if it # works correctly. x *= 5 s *= 10 src.reset(x=x, scalars=s) self.check_traits() self.check_dataset() y *= 6 x *= 4 src.reset(x=x, y=y) self.check_traits() self.check_dataset() s *= 4.5 y /= 4 src.reset(y=y, s=s) self.check_traits() self.check_dataset() def test_reset1(self): "Test the reset method." x, y, z, s, src = self.get_data() self.check_traits() self.check_dataset() # Call reset again with just a few things changed to see if it # works correctly. self.x = x = N.ones(20, float)*30.0 self.y = y = N.ones(20, float)*30.0 self.z = z = N.ones(20, float)*30.0 points = N.ones((20, 3), float)*30.0 self.s = s = N.ones(20, float) src.reset(x=x,y=y,z=z,scalars=s,points=points) self.check_traits() self.check_dataset() def test_handlers(self): "Test if the various static handlers work correctly." x, y, z, s, src = self.get_data() x *= 2 y *= 2 z *= 2 s *= 2 src.x = x src.y = y src.z = z src.scalars = s self.check_traits() self.check_dataset() def test_set(self): "Test if the set method works correctly." x, y, z, s, src = self.get_data() x *= 2 z *= 2 s *= 2 src.set(x=x, z=z, scalars=s) self.check_traits() self.check_dataset() y *= 2 s *= 2 src.set(y=y, scalars=s) self.check_traits() self.check_dataset() ################################################################################ # `TestMArray2DSource` ################################################################################ class TestMArray2DSource(unittest.TestCase): def setUp(self): x, y = N.mgrid[-10:10:11j, -10:10:12j] self.x, self.y = x, y dims = (x.shape[0], y.shape[1]) self.s = s = N.ones(dims, float) src = sources.MArray2DSource() src.reset(x=x, y=y,scalars=s) self.src = src def tearDown(self): return def get_data(self): return self.x, self.y, self.s, self.src def check_traits(self): """Check if the sources traits are set correctly.""" x, y, s, src = self.get_data() # Check if points are set correctly. self.assertEqual(N.alltrue(src.x == x), True) self.assertEqual(N.alltrue(src.y == y), True) # Check the scalars. self.assertEqual(N.alltrue(src.scalars == s), True) def check_dataset(self): """Check the TVTK dataset.""" x, y, s, src = self.get_data() # Check if the dataset is setup right. x = N.atleast_2d(x.squeeze().T)[0, :].squeeze() y = N.atleast_2d(y.squeeze())[0, :].squeeze() dx = x[1] - x[0] dy = y[1] - y[0] origin = [x.min(), y.min(),0 ] spacing = [dx, dy, 1] ds = src.dataset self.assertEqual(N.all(ds.origin == origin), True) self.assertEqual(N.allclose(src.m_data.spacing, spacing), True) sc = src.dataset.point_data.scalars.to_array() s1 = s.transpose() self.assertEqual(N.alltrue(sc.ravel() == s1.ravel()), True) def test_reset(self): x, y, s, src = self.get_data() self.check_traits() self.check_dataset() # Call reset again with just a few things changed to see if it # works correctly. x *= 5 s *= 10 src.reset(x=x,y=y, scalars=s) self.check_traits() self.check_dataset() def test_handlers(self): "Test if the various static handlers work correctly." x, y, s, src = self.get_data() x *= 2 y *= 2 s *= 2 src.x = x src.y = y src.scalars = s self.check_traits() self.check_dataset() def test_set(self): "Test if the set method works correctly." x, y, s, src = self.get_data() x *= 2 s *= 2 src.set(x=x,scalars=s) self.check_traits() self.check_dataset() y *= 9 s *= 2 src.set(y=y, scalars=s) self.check_traits() self.check_dataset() ################################################################################ # `TestMGridSource` ################################################################################ class TestMGridSource(unittest.TestCase): def setUp(self): self.x = x = N.ones([10,10], float) self.y = y = N.ones([10,10], float)*2.0 self.z = z = N.ones([10,10], float)*3.0 self.s = s = N.ones([10,10], float) src = sources.MGridSource() src.reset(x=x, y=y, z=z, scalars=s) self.src = src def tearDown(self): return def get_data(self): return self.x, self.y, self.z, self.s, self.src def check_traits(self): """Check if the sources traits are set correctly.""" x, y, z, s, src = self.get_data() # Check if points are set correctly. self.assertEqual(N.alltrue(src.points[:,0].ravel() == x.ravel()), True) self.assertEqual(N.alltrue(src.points[:,1].ravel() == y.ravel()), True) self.assertEqual(N.alltrue(src.points[:,2].ravel() == z.ravel()), True) # Check the scalars. self.assertEqual(N.alltrue(src.scalars == s), True) def check_dataset(self): """Check the TVTK dataset.""" x, y, z, s, src = self.get_data() # Check if the dataset is setup right. pts = src.dataset.points.to_array() self.assertEqual(N.alltrue(pts[:,0].ravel() == x.ravel()), True) self.assertEqual(N.alltrue(pts[:,1].ravel() == y.ravel()), True) self.assertEqual(N.alltrue(pts[:,2].ravel() == z.ravel()), True) sc = src.dataset.point_data.scalars.to_array() self.assertEqual(N.alltrue(sc == s.ravel()), True) def test_reset(self): "Test the reset method." x, y, z, s, src = self.get_data() self.check_traits() self.check_dataset() # Call reset again with just a few things changed to see if it # works correctly. x *= 5 s *= 10 src.reset(x=x, scalars=s) self.check_traits() self.check_dataset() def test_handlers(self): "Test if the various static handlers work correctly." x, y, z, s, src = self.get_data() x *= 2 y *= 2 z *= 2 s *= 2 src.x = x src.y = y src.z = z src.scalars = s self.check_traits() self.check_dataset() def test_set(self): "Test if the set method works correctly." x, y, z, s, src = self.get_data() x *= 2 z *= 2 s *= 2 src.set(x=x, z=z, scalars=s) self.check_traits() self.check_dataset() ################################################################################ # `TestMArray2DSourceNoArgs` ################################################################################ class TestMArray2DSourceNoArgs(unittest.TestCase): """Special Test Case for MArray2DSource when both x and y are specified as None""" def setUp(self): x=None y=None self.x, self.y = x, y if x is not None and y is not None: dims = (x.shape[0], y.shape[1]) else: dims=(10,10) self.s = s = N.ones(dims, float) src = sources.MArray2DSource() src.reset(x=x, y=y,scalars=s) self.src = src def tearDown(self): return def get_data(self): return self.x, self.y, self.s, self.src def check_traits(self): """Check if the sources traits are set correctly.""" x, y, s, src = self.get_data() # Check if points are set correctly. if x is not None and y is not None: self.assertEqual(N.alltrue(src.x == x), True) self.assertEqual(N.alltrue(src.y == y), True) else: nx, ny = s.shape x1, y1 = N.mgrid[-nx/2.:nx/2, -ny/2.:ny/2] self.assertEqual(N.alltrue(src.x == x1), True) self.assertEqual(N.alltrue(src.y == y1), True) # Check the scalars. self.assertEqual(N.alltrue(src.scalars == s), True) def check_dataset(self): """Check the TVTK dataset.""" x, y, s, src = self.get_data() # Check if the dataset is setup right. nx, ny = src.scalars.shape if x is None and y is None: x, y = N.mgrid[-nx/2.:nx/2, -ny/2.:ny/2] x = N.atleast_2d(x.squeeze().T)[0, :].squeeze() y = N.atleast_2d(y.squeeze())[0, :].squeeze() dx = x[1] - x[0] dy = y[1] - y[0] origin = [x.min(), y.min(),0 ] spacing = [dx, dy, 1] ds = src.dataset self.assertEqual(N.all(ds.origin == origin), True) self.assertEqual(N.allclose(ds.spacing, spacing), True) sc = src.dataset.point_data.scalars.to_array() s1 = s.transpose() self.assertEqual(N.alltrue(sc.ravel() == s1.ravel()), True) def test_reset(self): "Test the reset method." x, y, s, src = self.get_data() self.check_traits() self.check_dataset() # Call reset again with just a few things changed to see if it # works correctly. s *= 10 src.reset(x=x,y=y, scalars=s) self.check_traits() self.check_dataset() def test_handlers(self): "Test if the various static handlers work correctly." x, y, s, src = self.get_data() s *= 2 src.scalars = s self.check_traits() self.check_dataset() def test_set(self): "Test if the set method works correctly." x, y, s, src = self.get_data() s *= 2 src.set(x=x,y=y,scalars=s) self.check_traits() self.check_dataset() ################################################################################ # `TestMTriangularMeshSource` ################################################################################ class TestMTriangularMeshSource(unittest.TestCase): def setUp(self): x, y, z = N.array([0, 0, 0]), N.array([0, 0, 1]), N.array([0, 1, 1]) s = N.array([0.1, 0.2, 0.3]) self.x, self.y, self.z, self.s = x, y, z, s self.triangles = triangles = N.array([[0, 1, 2]]) src = sources.MTriangularMeshSource() src.reset(x=x, y=y, z=z, triangles=triangles, scalars=s) self.src = src def tearDown(self): return def get_data(self): return self.x, self.y, self.z, self.triangles, self.s, self.src def check_traits(self): """Check if the sources traits are set correctly.""" x, y, z, triangles, s, src = self.get_data() # Check if points are set correctly. self.assertEqual(N.alltrue(src.x == x), True) self.assertEqual(N.alltrue(src.y == y), True) self.assertEqual(N.alltrue(src.z == z), True) # Check the scalars. self.assertEqual(N.alltrue(src.scalars == s), True) def test_reset(self): "Test the reset method." x, y, z, triangles, s, src = self.get_data() self.check_traits() # Call reset again with just a few things changed to see if it # works correctly. x *= 5 s *= 10 src.reset(x=x,y=y,z=z, triangles=triangles, scalars=s) self.check_traits() def test_changed_size(self): """ Change the number of the points, and establish to new points, to check that we don't get errors with the dimensions of the scalars. """ n = 100 _, _, _, _, _, src = self.get_data() triangles = N.c_[N.arange(n-3), N.arange(n-3)+1, n-1-N.arange(n-3)] x, y, z = N.random.random((3, n)) src.reset(x=x, y=y, z=z, triangles=triangles) def test_handlers(self): "Test if the various static handlers work correctly." x, y, z, triangles, s, src = self.get_data() x *= 2 y *= 2 s *= 2 src.x = x src.y = y src.scalars = s src.triangles = triangles self.check_traits() def test_set(self): "Test if the set method works correctly." x, y, z, triangles, s, src = self.get_data() x *= 2 s *= 2 src.set(x=x,scalars=s) self.check_traits() y *= 9 s *= 2 src.set(y=y, scalars=s) self.check_traits() if __name__ == '__main__': unittest.main() mayavi-4.5.0/mayavi/tests/test_mlab_source_integration.py0000644000076500000240000004041512747716314024371 0ustar prabhustaff00000000000000""" Test for the various mlab source functions. These tests are higher level than the tests testing directly the MlabSource subclasses. They are meant to capture errors in the formatting of the input arguments. """ # Author: Gael Varoquaux # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. import unittest import numpy as np from mayavi.tools import sources ################################################################################ # `BaseTestSource` ################################################################################ class BaseTestSource(unittest.TestCase): def setUp(self): return def tearDown(self): return def all_close(self, a, b): """ Similar to numpy's allclose, but works also for a=None. """ if a is None or b is None: self.assertIsNone(a) self.assertIsNone(b) else: self.assertTrue(np.allclose(a, a)) def check_positions(self, source, x, y, z): """ Check that the position vectors of the source do correspond to the given input positions """ self.assertTrue(np.allclose(source.mlab_source.x, x)) self.assertTrue(np.allclose(source.mlab_source.y, y)) self.assertTrue(np.allclose(source.mlab_source.z, z)) def check_vectors(self, source, u, v, w): """ Check that the vector data corresponds to the given arrays. """ self.all_close(source.mlab_source.u, u) self.all_close(source.mlab_source.v, v) self.all_close(source.mlab_source.w, w) def check_scalars(self, source, s): """ Check that the scalar data corresponds to the given array. """ self.all_close(source.mlab_source.scalars, s) ################################################################################ # `TestScalarScatter` ################################################################################ class TestScalarScatter(BaseTestSource): def test_input_args(self): """ Check that scalar_scatter can take different input arguments """ # Check for a single number as position vectors. ss = sources.scalar_scatter(0, 0, 0, figure=None) self.check_positions(ss, 0, 0, 0) self.check_scalars(ss, None) self.check_vectors(ss, None, None, None) # Check for a single number as scalar data, and no position # vectors. ss = sources.scalar_scatter(0, figure=None) self.check_positions(ss, 0, 0, 0) self.check_scalars(ss, 0) self.check_vectors(ss, None, None, None) # Check for a list as position vectors. ss = sources.scalar_scatter([0, 1], [0, 1], [0, 1], figure=None) self.check_positions(ss, [0, 1], [0, 1], [0, 1]) self.check_scalars(ss, None) self.check_vectors(ss, None, None, None) # Check for a list as scalar data, and no position vectors. ss = sources.scalar_scatter([0, 1], figure=None) self.check_scalars(ss, [0, 1]) self.check_vectors(ss, None, None, None) # Check for a 1D array as position vectors. a = np.array([0, 1]) ss = sources.scalar_scatter(a, a, a, figure=None) self.check_positions(ss, a, a, a) self.check_scalars(ss, None) self.check_vectors(ss, None, None, None) # Check for a 1D array as a scalar data, and no position vectors. ss = sources.scalar_scatter(a, figure=None) self.check_scalars(ss, a) self.check_vectors(ss, None, None, None) # Check for a 2D array as position vectors. a = np.array([[0, 1], [2, 3]]) ss = sources.scalar_scatter(a, a, a, figure=None) self.check_positions(ss, a, a, a) self.check_scalars(ss, None) self.check_vectors(ss, None, None, None) # Check for a 2D array as scalar data, and no position vectors. ss = sources.scalar_scatter(a, figure=None) self.check_scalars(ss, a) self.check_vectors(ss, None, None, None) # Check for a 2D array as scalar data, and no position vectors. ss = sources.scalar_scatter(a, figure=None) self.check_scalars(ss, a) self.check_vectors(ss, None, None, None) ################################################################################ # `TestVectorScatter` ################################################################################ class TestVectorScatter(BaseTestSource): def test_input_args(self): """ Check that vector_scatter can take different input arguments """ # Check for a single number as a position vector. ss = sources.vector_scatter(0, 0, 0, 0, 0, 0, figure=None) self.check_positions(ss, 0, 0, 0) self.check_scalars(ss, None) self.check_vectors(ss, 0, 0, 0) # Check for no position vectors, and single numbers for vector # data. ss = sources.vector_scatter(0, 0, 0, figure=None) self.check_positions(ss, 0, 0, 0) self.check_scalars(ss, None) self.check_vectors(ss, 0, 0, 0) # Check for a list as a position vector. ss = sources.vector_scatter([0, 1], [0, 1], [0, 1], [0, 1], [0, 1], [0, 1], figure=None) self.check_positions(ss, [0, 1], [0, 1], [0, 1]) self.check_scalars(ss, None) self.check_vectors(ss, [0, 1], [0, 1], [0, 1]) # Check for a lists as a vector data, and no position vectors ss = sources.vector_scatter([0, 1], [0, 1], [0, 1], figure=None) self.check_scalars(ss, None) self.check_vectors(ss, [0, 1], [0, 1], [0, 1]) # Check for a 1D array as a position vector. a = np.array([0, 1]) ss = sources.vector_scatter(a, a, a, a, a, a, figure=None) self.check_positions(ss, a, a, a) self.check_scalars(ss, None) self.check_vectors(ss, a, a, a) # Check for a 1D array as vector data, and no position vectors. ss = sources.vector_scatter(a, a, a, figure=None) self.check_scalars(ss, None) self.check_vectors(ss, a, a, a) # Check for a 2D array as a position vector. a = np.array([[0, 1], [2, 3]]) ss = sources.vector_scatter(a, a, a, a, a, a, figure=None) self.check_positions(ss, a, a, a) self.check_scalars(ss, None) self.check_vectors(ss, a, a, a) # Check for a 2D array as vector data, and no position vectors. ss = sources.vector_scatter(a, a, a, figure=None) self.check_scalars(ss, None) self.check_vectors(ss, a, a, a) # Check for a 3D array as a position vector. x, y, z = np.mgrid[0:3, 0:3, 0:3] ss = sources.vector_scatter(x, y, z, x, y, z, figure=None) self.check_positions(ss, x, y, z) self.check_scalars(ss, None) self.check_vectors(ss, x, y, z) # Check for a 3D array as vector data, and no position vectors. x, y, z = np.mgrid[0:3, 0:3, 0:3] ss = sources.scalar_scatter(z, figure=None) self.check_scalars(ss, z) X, Y, Z = np.indices(z.shape) self.check_positions(ss, X, Y, Z) ################################################################################ # `TestArray2DSource` ################################################################################ class TestArray2DSource(BaseTestSource): def test_input_args(self): """ Check that array2d_source can take different input arguments """ # Check for a single number as data and no position arrays. ss = sources.array2d_source(0, figure=None) self.check_scalars(ss, 0) # Check for a list as data, and no position arrays. ss = sources.array2d_source([0, 1], figure=None) self.check_scalars(ss, [0, 1]) # Check for a 1D array as data, and no position arrays. a = np.array([0, 1]) ss = sources.array2d_source(a, figure=None) self.check_scalars(ss, a) # Check for a 2D array as data, and no position arrays. a = np.array([[0, 1], [2, 3]]) ss = sources.array2d_source(a, figure=None) self.check_scalars(ss, a) # Check for 2 lists as positions vectors, and a 2D list as data x = [0, 1] y = [0, 1] s = [[0, 1], [2, 3]] ss = sources.array2d_source(x, y, s, figure=None) self.check_scalars(ss, s) # Check for an ogrid as position vectors, and a function for the # scalars x, y = np.ogrid[-3:3, -3:3] f = lambda x, y: x**2 + y**2 ss = sources.array2d_source(x, y, f, figure=None) self.check_scalars(ss, f(x, y)) # Check for an mgrid as position vectors, and a 2D array for the # scalars x, y = np.mgrid[-3:3, -3:3] s = np.zeros_like(x) ss = sources.array2d_source(x, y, x, figure=None) self.check_scalars(ss, s) ################################################################################ # `TestScalarField` ################################################################################ class TestScalarField(BaseTestSource): def test_input_args(self): """ Check that scalar_field can take different input arguments """ # Check for 2D arrays as positions vectors, and a function for # the data f = lambda x, y, z: x**2 + y**2 x, y = np.mgrid[-3:3, -3:3] z = np.zeros_like(x) ss = sources.scalar_field(x, y, z, f, figure=None) self.check_positions(ss, x, y, z) s = f(x, y, z) self.check_scalars(ss, s) # Check for a 2D array as data, and no position vectors s = np.random.random((10, 10)) ss = sources.scalar_field(s, figure=None) self.check_scalars(ss, s) # Check for a 3D array as data, and no position vectors s = np.random.random((10, 10, 10)) ss = sources.scalar_field(s, figure=None) self.check_scalars(ss, s) # Check for a 3D array as data, and 3D arrays as position x, y, z = np.mgrid[-3:3, -3:3, -3:3] ss = sources.scalar_field(x, y, z, z, figure=None) self.check_positions(ss, x, y, z) self.check_scalars(ss, z) ################################################################################ # `TestVectorField` ################################################################################ class TestVectorField(BaseTestSource): def test_input_args(self): """ Check that vector_field can take different input arguments """ # Check for 2D arrays as positions vectors, and a function for # the data x, y = np.mgrid[-3:3, -3:3] z = np.zeros_like(x) def f(x, y, z): return y, z, x ss = sources.vector_field(x, y, z, f, figure=None) self.check_scalars(ss, None) self.check_vectors(ss, y, z, x) # Check for a 2D array as data, and no position vectors u = np.random.random((10, 10)) v = np.random.random((10, 10)) w = np.random.random((10, 10)) ss = sources.vector_field(u, v, w, figure=None) self.check_scalars(ss, None) self.check_vectors(ss, u, v, w) # Check for a 3D array as data, and no position vectors u = np.random.random((10, 10, 10)) v = np.random.random((10, 10, 10)) w = np.random.random((10, 10, 10)) ss = sources.vector_field(u, v, w, figure=None) self.check_scalars(ss, None) self.check_vectors(ss, u, v, w) # Check for a 3D array as data, and 3D arrays as position x, y, z = np.mgrid[-3:3, -3:3, -3:3] ss = sources.vector_field(x, y, z, y, z, x, figure=None) self.check_scalars(ss, None) self.check_positions(ss, x, y, z) self.check_vectors(ss, y, z, x) ################################################################################ # `TestLineSource` ################################################################################ class TestLineSource(BaseTestSource): def test_input_args(self): """ Check that vector_field can take different input arguments """ # Check for numbers as position vectors ss = sources.line_source(0, 0, 0, figure=None) self.check_positions(ss, 0, 0, 0) self.check_scalars(ss, None) # Check for lists as position vectors and as data ss = sources.line_source([0, 1], [0, 1], [0, 1], [2, 3], figure=None) self.check_positions(ss, [0, 1], [0, 1], [0, 1]) self.check_scalars(ss, [2, 3]) # Check for arrays as position vectors and a function as data x, y, z = np.random.random((3, 10)) f = lambda x, y, z: x + y + z ss = sources.line_source(x, y, z, f, figure=None) self.check_positions(ss, x, y, z) self.check_scalars(ss, f(x, y, z)) ################################################################################ # `TestVerticalVectorsSource` ################################################################################ class TestVerticalVectorsSource(BaseTestSource): def test_input_args(self): """ Check that vector_field can take different input arguments """ # Check for numbers as position vectors ss = sources.vertical_vectors_source(0, 0, 1, figure=None) self.check_positions(ss, 0, 0, 0) self.check_scalars(ss, 1) self.check_vectors(ss, 0, 0, 1) ss = sources.vertical_vectors_source(0, 0, 1, 1, figure=None) self.check_positions(ss, 0, 0, 1) self.check_scalars(ss, 1) self.check_vectors(ss, 0, 0, 1) # Check for lists as position vectors and as data ss = sources.vertical_vectors_source([0, 1], [0, 1], [0, 1], [2, 3], figure=None) self.check_positions(ss, [0, 1], [0, 1], [0, 1]) self.check_scalars(ss, [2, 3]) self.check_vectors(ss, [0, 0], [0, 0], [2, 3]) # Check for arrays as position vectors and a function as data x, y, z = np.random.random((3, 10)) zeros = np.zeros_like(x) f = lambda x, y, z: x + y + z ss = sources.vertical_vectors_source(x, y, z, f, figure=None) self.check_positions(ss, x, y, z) self.check_scalars(ss, f(x, y, z)) self.check_vectors(ss, zeros, zeros, z) ss = sources.vertical_vectors_source(x, y, z, figure=None) self.check_positions(ss, x, y, zeros) self.check_scalars(ss, z) self.check_vectors(ss, zeros, zeros, z) ################################################################################ # `TestSourceInfinite` ################################################################################ class TestVerticalVectorsSource(unittest.TestCase): def test_infinite(self): """ Check that passing in arrays with infinite values raises errors """ # Some arrays x = np.random.random((10, 3, 4)) y = np.random.random((10, 3, 4)) z = np.random.random((10, 3, 4)) u = np.random.random((10, 3, 4)) v = np.random.random((10, 3, 4)) w = np.random.random((10, 3, 4)) s = np.random.random((10, 3, 4)) # Add a few infinite values: u[2, 2, 1] = np.inf s[0, 0, 0] = -np.inf # Check value errors are raised because of the infinite values self.assertRaises(ValueError, sources.grid_source, x[0], y[0], z[0], scalars=s[0], figure=None) self.assertRaises(ValueError, sources.vertical_vectors_source, x, y, z, s, figure=None) self.assertRaises(ValueError, sources.array2d_source, x[0], y[0], s[0], figure=None) self.assertRaises(ValueError, sources.scalar_field, x, y, z, s, figure=None) self.assertRaises(ValueError, sources.scalar_scatter, x, y, z, s, figure=None) self.assertRaises(ValueError, sources.vector_scatter, x, y, z, u, v, w, figure=None) self.assertRaises(ValueError, sources.vector_field, x, y, z, u, v, w, figure=None) self.assertRaises(ValueError, sources.line_source, x[0, 0], y[0, 0], z[0, 0], s[0, 0], figure=None) if __name__ == '__main__': unittest.main() mayavi-4.5.0/mayavi/tests/test_mouse_pick_dispatcher.py0000644000076500000240000000567112747716314024044 0ustar prabhustaff00000000000000""" Test the MousePickDispatcher. """ import unittest from traits.api import HasTraits, Instance from mayavi.core.null_engine import NullEngine, DummyViewer from tvtk.api import tvtk from mayavi.tools.engine_manager import engine_manager from mayavi.core.registry import registry from mayavi.core.mouse_pick_dispatcher import \ MousePickDispatcher from tvtk.pyface.picker import Picker ################################################################################ # class `DummyScene` ################################################################################ class DummyScene(HasTraits): """ Mimics the API of a TVTK scene. """ interactor = Instance(tvtk.GenericRenderWindowInteractor, ()) picker = Instance(Picker, (None, )) ################################################################################ # class `DummyMousePickDispatcher` ################################################################################ class DummyMousePickDispatcher(MousePickDispatcher): """ A MousePickDispatcher that accepts the DummyViewer as a Scene. """ scene = Instance(DummyViewer) ################################################################################ # class `TestMousePickerDispatcher` ################################################################################ class TestMousePickerDispatcher(unittest.TestCase): """ Create a fake figure, to make sure that observers are well registered and removed. """ def setUp(self): e = NullEngine() e.start() registry.register_engine(e) engine_manager.current_engine = e self.e = e self.s = e.new_scene() self.s.scene = DummyScene() def tearDown(self): engine_manager.current_engine = None # Unregistering the engine, to avoid side-effects between tests self.e.stop() registry.unregister_engine(self.e) def test_callback_registering(self): def test(picker): pass dispatcher = DummyMousePickDispatcher(scene=self.s) initial_interactor_callbacks = frozenset([i for i in range(100) if self.s.scene.interactor.has_observer(i) ]) dispatcher.callbacks.append((test, 'point', 'Left')) # Check that VTK observers were established self.assertTrue(dispatcher._mouse_mvt_callback_nb) self.assertTrue('Left' in dispatcher._mouse_press_callback_nbs) self.assertTrue('Left' in dispatcher._mouse_release_callback_nbs) # Check that we are back to no observers dispatcher.callbacks[:] = [] interactor_callbacks = frozenset([i for i in range(100) if self.s.scene.interactor.has_observer(i) ]) self.assertEqual(interactor_callbacks, initial_interactor_callbacks) if __name__ == '__main__': unittest.main() mayavi-4.5.0/mayavi/tests/test_no_ui_toolkit.py0000644000076500000240000000404212747716314022345 0ustar prabhustaff00000000000000""" Tests to try and ensure that important mayavi imports work with no UI. """ # Author: Prabhu Ramachandran # Copyright (c) 2009, Enthought, Inc. # License: BSD Style. import sys import unittest from traits.etsconfig.api import ETSConfig class TestNoUIToolkit(unittest.TestCase): """Test if any important mayavi imports work with no UI whatsoever.""" def setUp(self): self.orig_tk = ETSConfig.toolkit ETSConfig._toolkit = 'null' # Import something from Pyface to force any potential imports # from a UI toolkit. Why did I pick Pyface? Well, adder_node # imports ImageResource and this seems to trigger some UI # toolkit import and this makes life difficult as far as the # testing goes. Forcing the issue here should let us test # safely since the Pyface imports will be done. from pyface.api import GUI # Remove any references to wx and Qt saved = {} for mod in ['wx', 'PyQt4', 'PySide']: saved[mod] = sys.modules.pop(mod, None) self.saved = saved def tearDown(self): ETSConfig._toolkit = self.orig_tk # Add back any any references to wx and Qt for mod in ['wx', 'PyQt4', 'PySide']: m = self.saved[mod] if m is not None: sys.modules[mod] = m def test_no_ui(self): """Test if mayavi imports work without any UI (wx or PyQt4).""" # These imports should work without any UI. from mayavi import mlab from mayavi.api import Engine from mayavi.sources.api import VTKDataSource from mayavi.filters.api import Optional from mayavi.modules.api import Outline from mayavi.preferences.api import preference_manager # Should not have triggered an import wx or PyQt4. self.assertEqual('wx' in sys.modules, False) self.assertEqual('PyQt4' in sys.modules, False) self.assertEqual('PySide' in sys.modules, False) if __name__ == '__main__': unittest.main() mayavi-4.5.0/mayavi/tests/test_optional_collection.py0000644000076500000240000001114412747716314023530 0ustar prabhustaff00000000000000# Author: Suyog Dutt Jain # Prabhu Ramachandran # Copyright (c) 2008-2015, Enthought, Inc. # License: BSD Style. # Standard library imports. from os.path import abspath from io import BytesIO import copy import numpy as np import unittest # Enthought library imports from mayavi.core.null_engine import NullEngine from mayavi.filters.contour import Contour from mayavi.filters.optional import Optional from mayavi.filters.collection import Collection from mayavi.filters.api import PolyDataNormals from mayavi.modules.api import Surface from mayavi.sources.vtk_data_source import VTKDataSource from mayavi.tests import datasets class TestOptionalCollection(unittest.TestCase): def setUp(self): """Initial setting up of test fixture, automatically called by TestCase before any other test method is invoked""" e = NullEngine() # Uncomment to see visualization for debugging etc. #e = Engine() e.start() e.new_scene() self.e=e sgrid=datasets.generateStructuredGrid() src = VTKDataSource(data = sgrid) e.add_source(src) c = Contour() # `name` is used for the notebook tabs. n = PolyDataNormals(name='Normals') o = Optional(filter=n, label_text='Compute normals') coll = Collection(filters=[c, o], name='IsoSurface') e.add_filter(coll) s = Surface() e.add_module(s) self.coll = coll self.scene = e.current_scene return def tearDown(self): """For necessary clean up, automatically called by TestCase after the test methods have been invoked""" self.e.stop() return def check(self,coll): """Do the actual testing.""" scene = self.scene """Check if test status is OK given the collection.""" c, o = coll.filters c = c.filter n = o.filter r = coll.get_output_dataset().point_data.scalars.range self.assertEqual(np.allclose(r, (6.09,6.09), atol=1.01e-03), True) # Adding a contour should create the appropriate output in # the collection. c.contours.append(200) self.assertEqual(np.allclose(r, [6.09,6.09], atol=1.01e-03), True) # the collection's output should be that of the normals. self.assertEqual(coll.outputs[0] is n.outputs[0],True) # disable the optional filter and check. o.enabled = False self.assertEqual('disabled' in o.name,True) self.assertEqual(coll.outputs[0] is c.outputs[0],True) # Set back everything to original state. c.contours.pop() o.enabled = True self.assertEqual(np.allclose(r, (6.09,6.09), atol=1.01e-03), True) self.assertEqual(coll.outputs[0] is n.outputs[0], True) self.assertEqual('disabled' not in o.name, True) def test_optional_collection(self): "Test if the test fixture works" #Now test. coll = self.coll self.check(coll) #from mayavi.tools.show import show #show() def test_save_and_restore(self): """Test if saving a visualization and restoring it works.""" engine = self.e scene = self.scene # Save visualization. f = BytesIO() f.name = abspath('test.mv2') # We simulate a file. engine.save_visualization(f) f.seek(0) # So we can read this saved data. # Remove existing scene. engine.close_scene(scene) # Load visualization engine.load_visualization(f) self.scene = engine.current_scene coll = self.scene.children[0].children[0] self.check(coll) def test_deepcopied(self): """Test if the MayaVi2 visualization can be deep-copied.""" ############################################################ # Test if the MayaVi2 visualization can be deep-copied. # Pop the source object. s = self.scene source = s.children.pop() # Add it back to see if that works without error. s.children.append(source) coll = s.children[0].children[0] self.check(coll) # Now deepcopy the source and replace the existing one with # the copy. This basically simulates cutting/copying the # object from the UI via the right-click menu on the tree # view, and pasting the copy back. source1 = copy.deepcopy(source) s.children[0] = source1 coll = s.children[0].children[0] self.check(coll) #from mayavi.tools.show import show #show() if __name__ == '__main__': unittest.main() mayavi-4.5.0/mayavi/tests/test_pipeline_info.py0000644000076500000240000000276412747716314022320 0ustar prabhustaff00000000000000""" Tests for the pipeline_info.py module """ # Author: Prabhu Ramachandran # Copyright (c) 2008, Prabhu Ramachandran Enthought, Inc. # License: BSD Style. import unittest from tvtk.api import tvtk from mayavi.core import pipeline_info class TestPipelineInfoTest(unittest.TestCase): def test_tvtk_dataset_name(self): "Can tvtk datasets can be converted to names correctly." datasets = [tvtk.ImageData(), tvtk.StructuredPoints(), tvtk.RectilinearGrid(), tvtk.StructuredGrid(), tvtk.PolyData(), tvtk.UnstructuredGrid(), tvtk.Property(), # Not a dataset! 'foo', # Not a TVTK object. ] expect = ['image_data', 'image_data', 'rectilinear_grid', 'structured_grid', 'poly_data', 'unstructured_grid', 'none', 'none' ] result = [pipeline_info.get_tvtk_dataset_name(d) for d in datasets] self.assertEqual(result, expect) def test_default_pipeline_info(self): "Is the default PipelineInfo class built right." p = pipeline_info.PipelineInfo() self.assertEqual(len(p.datasets), 0) self.assertEqual(len(p.attribute_types), 0) self.assertEqual(len(p.attributes), 0) if __name__ == '__main__': unittest.main() mayavi-4.5.0/mayavi/tests/test_plot3d_mb_reader.py0000644000076500000240000000716212747716314022702 0ustar prabhustaff00000000000000# Author: Suyog Dutt Jain # Prabhu Ramachandran # Copyright (c) 2008-2015, Enthought, Inc. # License: BSD Style. # Standard library imports. from os.path import abspath from io import BytesIO import copy import unittest # Local imports. from mayavi.tests.common import get_example_data # Enthought library imports from mayavi.core.null_engine import NullEngine from mayavi.sources.plot3d_reader import PLOT3DReader from mayavi.filters.select_output import SelectOutput from mayavi.modules.outline import Outline class TestPlot3dMbReader(unittest.TestCase): def setUp(self): """Initial setting up of test fixture, automatically called by TestCase before any other test method is invoked""" e = NullEngine() # Uncomment to see visualization for debugging etc. #e = Engine() e.start() e.new_scene() self.e=e # Read the multi-block plot3d file. r = PLOT3DReader() r.reader.set(has_byte_count=True, multi_grid=True, byte_order='little_endian') r.initialize(get_example_data('tiny.xyz'), get_example_data('tiny.q'), configure=False) e.add_source(r) # Add the filter. f = SelectOutput() e.add_filter(f) # Create an outline for the data. o = Outline() e.add_module(o) o.render() self.o=o self.r=r self.e=e self.scene = e.current_scene return def tearDown(self): """For necessary clean up, automatically called by TestCase after the test methods have been invoked""" self.e.stop() return def test_plot3d_mb_reader(self): "Test if the test fixture works" s=self.scene o=self.o #Check the bounds of the outline. self.assertEqual(o.outline_filter.output.bounds, (1.0, 2.0, 1.0, 2.0, 1.0, 2.0)) #from mayavi.tools.show import show #show() def test_save_and_restore(self): """Test if saving a visualization and restoring it works.""" engine = self.e scene = self.scene # Save visualization. f = BytesIO() f.name = abspath('test.mv2') # We simulate a file. engine.save_visualization(f) f.seek(0) # So we can read this saved data. # Remove existing scene. engine.close_scene(scene) # Load visualization engine.load_visualization(f) s=self.scene = engine.current_scene o = s.children[0].children[0].children[0].children[0] self.assertEqual(o.outline_filter.output.bounds, (1.0, 2.0, 1.0, 2.0, 1.0, 2.0)) def test_deepcopied(self): """Test if the MayaVi2 visualization can be deep-copied. XXX: The plot 3d reader and multi block version are broken in vtk 5.10.1. This will be fixed in next Mayavi release.""" ############################################################ # Copy the reader to see if it does not pop up the UI. # Pop the source object. r=self.r e=self.e r1 = copy.deepcopy(r) e.add_source(r1) o1 = r1.children[0].children[0].children[0] self.assertEqual(o1.outline_filter.output.bounds, (1.0, 2.0, 1.0, 2.0, 1.0, 2.0)) r1.children[0].output_index = 1 self.assertEqual(o1.outline_filter.output.bounds, (2.0, 3.0, 1.0, 2.0, 1.0, 2.0)) if __name__ == '__main__': unittest.main() mayavi-4.5.0/mayavi/tests/test_poly_data_reader.py0000644000076500000240000002514312747716314022772 0ustar prabhustaff00000000000000# Author: Suyog Dutt Jain # Copyright (c) 2009-2015, Enthought, Inc. # License: BSD Style. # Standard library imports. import unittest # Local imports. from mayavi.tests.common import get_example_data # Enthought library imports from mayavi.sources.poly_data_reader import PolyDataReader from mayavi.tests.data_reader_test_base import DataReaderTestBase # External library imports import vtk vtk_major_version = vtk.vtkVersion.GetVTKMajorVersion() vtk_minor_version = vtk.vtkVersion.GetVTKMinorVersion() class TestPDBReader(DataReaderTestBase): def setup_reader(self): """"Setup the reader in here. This is called after the engine has been created and started. The engine is available as self.e. This method is called by setUp(). """ # Read a PDB data file. r = PolyDataReader() r.initialize(get_example_data('caffeine.pdb')) self.e.add_source(r) self.bounds = (3.10, 10.78, -2.39, 4.03, -10.60, -6.31) def test_pdb_data_reader(self): "Test if the test fixture works" #Now test. self.check(self.scene, self.bounds) def test_save_and_restore(self): """Test if saving a visualization and restoring it works.""" self.check_saving(self.e, self.scene, self.bounds) def test_deepcopied(self): """Test if the MayaVi2 visualization can be deep-copied.""" ############################################################ # Test if the MayaVi2 visualization can be deep-copied. self.check_deepcopying(self.scene, self.bounds) class TestBYUReader(DataReaderTestBase): def setup_reader(self): """"Setup the reader in here. This is called after the engine has been created and started. The engine is available as self.e. This method is called by setUp(). """ # Read a BYU data file. r = PolyDataReader() r.initialize(get_example_data('cow.g')) self.e.add_source(r) self.bounds = (-4.445, 5.998, -3.608, 2.760, -1.690, 1.690) def test_byu_data_reader(self): "Test if the test fixture works" #Now test. self.check(self.scene, self.bounds) def test_save_and_restore(self): """Test if saving a visualization and restoring it works.""" self.check_saving(self.e, self.scene, self.bounds) def test_deepcopied(self): """Test if the MayaVi2 visualization can be deep-copied.""" ############################################################ # Test if the MayaVi2 visualization can be deep-copied. self.check_deepcopying(self.scene, self.bounds) class TestOBJReader(DataReaderTestBase): def setup_reader(self): """"Setup the reader in here. This is called after the engine has been created and started. The engine is available as self.e. This method is called by setUp(). """ # Read a OBJ data file. r = PolyDataReader() r.initialize(get_example_data('shuttle.obj')) self.e.add_source(r) self.bounds = (-7.65, 7.04, -4.68, 4.68, -1.35, 4.16) def test_obj_data_reader(self): "Test if the test fixture works" #Now test. self.check(self.scene, self.bounds) def test_save_and_restore(self): """Test if saving a visualization and restoring it works.""" self.check_saving(self.e, self.scene, self.bounds) def test_deepcopied(self): """Test if the MayaVi2 visualization can be deep-copied.""" ############################################################ # Test if the MayaVi2 visualization can be deep-copied. self.check_deepcopying(self.scene, self.bounds) class TestParticleReader(DataReaderTestBase): def setup_reader(self): """"Setup the reader in here. This is called after the engine has been created and started. The engine is available as self.e. This method is called by setUp(). """ # Read a Particle data file. r = PolyDataReader() r.initialize(get_example_data('Particles.raw')) self.e.add_source(r) r.reader.set(data_byte_order='big_endian', data_type='float', file_type='binary') self.bounds = (817.33, 826.09, 545.02, 571.02, 1443.48, 1511.18) def test_particle_data_reader(self): "Test if the test fixture works" #Now test. self.check(self.scene, self.bounds) def test_save_and_restore(self): """Test if saving a visualization and restoring it works.""" self.check_saving(self.e, self.scene, self.bounds) def test_deepcopied(self): """Test if the MayaVi2 visualization can be deep-copied.""" ############################################################ # Test if the MayaVi2 visualization can be deep-copied. self.check_deepcopying(self.scene, self.bounds) class TestPLYReader(DataReaderTestBase): def setup_reader(self): """"Setup the reader in here. This is called after the engine has been created and started. The engine is available as self.e. This method is called by setUp(). """ # Read a PLY data file. r = PolyDataReader() r.initialize(get_example_data('pyramid.ply')) self.e.add_source(r) self.bounds = (0.0, 1.0, 0.0, 1.0, 0.0, 1.60) def test_ply_data_reader(self): "Test if the test fixture works" self._skip_if_broken_version() #Now test. self.check(self.scene, self.bounds) def test_save_and_restore(self): """Test if saving a visualization and restoring it works.""" self._skip_if_broken_version() self.check_saving(self.e, self.scene, self.bounds) def test_deepcopied(self): """Test if the MayaVi2 visualization can be deep-copied.""" ############################################################ # Test if the MayaVi2 visualization can be deep-copied. self._skip_if_broken_version() self.check_deepcopying(self.scene, self.bounds) def _skip_if_broken_version(self): version_str = "{}.{}".format(vtk_major_version, vtk_minor_version) # Skipping for known versions. See issue #328 if version_str in ["5.6", "5.8", "6.2"]: raise unittest.SkipTest( 'PLY reader broken in this version of VTK. See issue #328') class TestPointsReader(DataReaderTestBase): def setup_reader(self): """"Setup the reader in here. This is called after the engine has been created and started. The engine is available as self.e. This method is called by setUp(). """ # Read a Points data file. r = PolyDataReader() r.initialize(get_example_data('points.txt')) self.e.add_source(r) self.bounds = (0.0, 1.0, 0.0, 1.0, 0.0, 1.0) def test_points_data_reader(self): "Test if the test fixture works" #Now test. self.check(self.scene, self.bounds) def test_save_and_restore(self): """Test if saving a visualization and restoring it works.""" self.check_saving(self.e, self.scene, self.bounds) def test_deepcopied(self): """Test if the MayaVi2 visualization can be deep-copied.""" ############################################################ # Test if the MayaVi2 visualization can be deep-copied. self.check_deepcopying(self.scene, self.bounds) class TestSTLReader(DataReaderTestBase): def setup_reader(self): """"Setup the reader in here. This is called after the engine has been created and started. The engine is available as self.e. This method is called by setUp(). """ # Read a STL data file. r = PolyDataReader() r.initialize(get_example_data('humanoid_tri.stla')) self.e.add_source(r) self.bounds = (0.60, 3.47, -3.96, 3.95, 3.05, 17.39) def test_stl_data_reader(self): "Test if the test fixture works" #Now test. self.check(self.scene, self.bounds) def test_save_and_restore(self): """Test if saving a visualization and restoring it works.""" self.check_saving(self.e, self.scene, self.bounds) def test_deepcopied(self): """Test if the MayaVi2 visualization can be deep-copied.""" ############################################################ # Test if the MayaVi2 visualization can be deep-copied. self.check_deepcopying(self.scene, self.bounds) class TestFacetReader(DataReaderTestBase): def setup_reader(self): """"Setup the reader in here. This is called after the engine has been created and started. The engine is available as self.e. This method is called by setUp(). """ # Read a Facet data file. r = PolyDataReader() r.initialize(get_example_data('clown.facet')) self.e.add_source(r) self.bounds = (-0.5, 0.69, -0.49, 0.49, -1.09, 0.5) def test_facet_data_reader(self): "Test if the test fixture works" #Now test. self.check(self.scene, self.bounds) def test_save_and_restore(self): """Test if saving a visualization and restoring it works.""" self.check_saving(self.e, self.scene, self.bounds) def test_deepcopied(self): """Test if the MayaVi2 visualization can be deep-copied.""" ############################################################ # Test if the MayaVi2 visualization can be deep-copied. self.check_deepcopying(self.scene, self.bounds) class TestSLCReader(DataReaderTestBase): def setup_reader(self): """"Setup the reader in here. This is called after the engine has been created and started. The engine is available as self.e. This method is called by setUp(). """ # Read a SLC data file. r = PolyDataReader() r.initialize(get_example_data('nut.slc')) self.e.add_source(r) self.bounds = (0.0, 67.0, 0.0, 40.0, 0.0, 58.0) def test_slc_data_reader(self): "Test if the test fixture works" #Now test. self.check(self.scene, self.bounds) def test_save_and_restore(self): """Test if saving a visualization and restoring it works.""" self.check_saving(self.e, self.scene, self.bounds) def test_deepcopied(self): """Test if the MayaVi2 visualization can be deep-copied.""" ############################################################ # Test if the MayaVi2 visualization can be deep-copied. self.check_deepcopying(self.scene, self.bounds) if __name__ == '__main__': unittest.main() mayavi-4.5.0/mayavi/tests/test_preference.ini0000644000076500000240000000005412747716314021733 0ustar prabhustaff00000000000000[test] bg = 'black' width = 10 show = False mayavi-4.5.0/mayavi/tests/test_preferences_mirror.py0000644000076500000240000000552312747716314023367 0ustar prabhustaff00000000000000# Author: Prabhu Ramachandran # Copyright (c) 2008, Enthought Inc. # License: BSD Style. import unittest from pkg_resources import resource_filename from traits.api import Str, Int, Bool from apptools.preferences.api import set_default_preferences from apptools.preferences.api import Preferences, PreferencesHelper from mayavi.tools.preferences_mirror import PreferencesMirror class TestPreference(PreferencesHelper): """A simple test preference helper.""" preferences_path = "test" bg = Str width = Int show = Bool class ClassNameTest(unittest.TestCase): def setUp(self): """Called before each test is run""" self.preferences = set_default_preferences(Preferences()) # The filename of the example preferences file. pref_file = resource_filename('mayavi.tests', 'test_preference.ini') self.preferences.load(pref_file) self.pref = TestPreference() self.mirror = PreferencesMirror() self.mirror.preferences = self.pref def test_mirroring(self): """Are the traits properly mirrored?""" pref = self.pref mirror = self.mirror self.assertEqual(pref.bg, mirror.bg) self.assertEqual(pref.width, mirror.width) self.assertEqual(pref.show, mirror.show) def test_sync(self): """Does the mirror listen for changes on original preference.""" pref = self.pref mirror = self.mirror # Save original state. saved = pref.get() pref.set(bg = 'white', width=20, show=True) self.assertEqual(pref.bg, mirror.bg) self.assertEqual(pref.width, mirror.width) self.assertEqual(pref.show, mirror.show) # Reset preferences back to defaults. pref.set(saved) def test_no_reverse_sync(self): """mirror must not sync changes back to the original preferences.""" pref = self.pref mirror = self.mirror saved = pref.get() mirror.set(bg = 'white', width=20, show=True) self.assertNotEqual(pref.bg, mirror.bg) self.assertNotEqual(pref.width, mirror.width) self.assertNotEqual(pref.show, mirror.show) self.assertEqual(pref.bg, saved['bg']) self.assertEqual(pref.width, saved['width']) self.assertEqual(pref.show, saved['show']) def test_save(self): """Are Mirror's preferences saved correctly""" pref = self.pref mirror = self.mirror saved = pref.get() mirror.set(bg = 'white', width=20, show=True) mirror.save() self.assertEqual(pref.bg, mirror.bg) self.assertEqual(pref.width, mirror.width) self.assertEqual(pref.show, mirror.show) # Reset preferences back to defaults. pref.set(saved) if __name__ == '__main__': unittest.main() mayavi-4.5.0/mayavi/tests/test_pylab_luts.py0000644000076500000240000000110212747716314021637 0ustar prabhustaff00000000000000import sys import unittest from mock import patch class TestPylabLuts(unittest.TestCase): @unittest.skipIf("mayavi.core.lut_manager" in sys.modules, ("mayavi.core.lut_manager is already loaded in " "another tests. Can't run this test.")) @patch("mayavi.core.lut.__file__", "wrong_path/for_lut.py") def test_fail_load_pylab_luts(self): """ Test if lut_manager can be loaded despite faulty pylab_luts.pkl """ from mayavi.core.lut_manager import pylab_luts self.assertEqual(pylab_luts, {}) mayavi-4.5.0/mayavi/tests/test_recorder.py0000644000076500000240000003434612747716314021306 0ustar prabhustaff00000000000000""" Unit tests for the script recorder -- the script recorder has been refactored to move to AppTools however we repeat the tests here with a TVTK object to ensure that the test works with TVTK objects. """ # Author: Prabhu Ramachandran # Copyright (c) 2008-2015, Enthought, Inc. # License: BSD Style. import sys import unittest from traits.api import (HasTraits, Float, Instance, Str, List, Bool) from tvtk.api import tvtk from apptools.scripting.api import (Recorder, recordable, set_recorder) ###################################################################### # Test classes. class Toy(HasTraits): color = Str type = Str ignore = Bool(False, record=False) class Child(HasTraits): name = Str('child') age = Float(10.0) property = Instance(tvtk.Property, (), record=True) toy = Instance(Toy, record=True) friends = List(Str) @recordable def grow(self, x): """Increase age by x years.""" self.age += x self.f(1) @recordable def f(self, args): """Function f.""" return args def not_recordable(self): pass class Parent(HasTraits): children = List(Child, record=True) recorder = Instance(Recorder, record=False) class Test(HasTraits): # This should be set. recorder = Instance(HasTraits) # These should be ignored. _ignore = Bool(False) ignore_ = Bool(False) class TestRecorder(unittest.TestCase): def setUp(self): self.tape = Recorder() set_recorder(self.tape) p = Parent() c = Child() toy = Toy(color='blue', type='bunny') c.toy = toy p.children.append(c) self.p = p return def tearDown(self): self.tape.clear() set_recorder(None) return def test_unique_name(self): "Does the get_unique_id method work." t = tvtk.XMLUnstructuredGridWriter() tape = self.tape self.assertEqual(tape._get_unique_name(t), 'xml_unstructured_grid_writer') self.assertEqual(tape._get_unique_name(t), 'xml_unstructured_grid_writer1') t = Toy() self.assertEqual(tape._get_unique_name(t), 'toy') t = (1, 2) self.assertEqual(tape._get_unique_name(t), 'tuple0') l = [1, 2] self.assertEqual(tape._get_unique_name(l), 'list0') d = {'a': 1} self.assertEqual(tape._get_unique_name(d), 'dict0') self.assertEqual(tape._get_unique_name(1), 'int0') def test_record(self): "Does recording work correctly." tape = self.tape p = self.p c = p.children[0] toy = c.toy # start recording. tape.recording = True tape.register(p) # Test if p's recorder attribute is set. self.assertEqual(tape, p.recorder) # Test script ids and object path. self.assertEqual(tape.get_script_id(p), 'parent') self.assertEqual(tape.get_object_path(p), '') self.assertEqual(tape.get_script_id(c), 'child') self.assertEqual(tape.get_object_path(c), 'parent.children[0]') self.assertEqual(tape.get_script_id(toy), 'child.toy') self.assertEqual(tape.get_object_path(toy), 'parent.children[0].toy') c.name = 'Ram' # The child should first be instantiated. self.assertEqual(tape.lines[-2], "child = parent.children[0]") # Then its trait set. self.assertEqual(tape.lines[-1], "child.name = 'Ram'") c.age = 10.5 self.assertEqual(tape.lines[-1], "child.age = 10.5") c.property.representation = 'w' self.assertEqual(tape.lines[-1], "child.property.representation = 'wireframe'") c.property.color = (1, 0, 0) self.assertEqual(tape.lines[-1], "child.property.color = (1.0, 0.0, 0.0)") toy.color = 'red' self.assertEqual(tape.lines[-1], "child.toy.color = 'red'") toy.type = 'teddy' self.assertEqual(tape.lines[-1], "child.toy.type = 'teddy'") # This trait should be ignored. toy.ignore = True self.assertEqual(tape.lines[-1], "child.toy.type = 'teddy'") # Turn of recording and test. tape.recording = False toy.type = 'rat' self.assertEqual(tape.lines[-1], "child.toy.type = 'teddy'") #print tape.script # Stop recording. n = len(tape.lines) tape.unregister(p) c.property.representation = 'points' toy.type = 'bunny' self.assertEqual(tape.lines[-1], "child.toy.type = 'teddy'") self.assertEqual(n, len(tape.lines)) # Make sure the internal data of the recorder is cleared. self.assertEqual(0, len(tape._registry)) self.assertEqual(0, len(tape._reverse_registry)) self.assertEqual(0, len(tape._known_ids)) def test_recorded_trait_replaced(self): "Does recording work right when a trait is replaced." tape = self.tape p = self.p c = p.children[0] toy = c.toy # start recording. tape.recording = True tape.register(p) # Test the original trait. toy.color = 'red' self.assertEqual(tape.lines[-1], "child.toy.color = 'red'") # Now reassign the toy. t1 = Toy(name='ball') c.toy = t1 t1.color = 'yellow' self.assertEqual(tape.lines[-1], "child.toy.color = 'yellow'") def test_clear(self): "Test the clear method." p = self.p tape = self.tape tape.register(p) tape.clear() # Everything should be unregistered. self.assertEqual(p.recorder, None) # Internal data should be wiped clean. self.assertEqual(0, len(tape._registry)) self.assertEqual(0, len(tape._reverse_registry)) self.assertEqual(0, len(tape._known_ids)) self.assertEqual(0, len(tape._name_map)) def test_create_object(self): "Is the object imported and created if unknown?" tape = self.tape tape.recording = True t = Toy() tape.register(t) t.type = 'computer' # Since the name toy is unknown, there should be a # line to create it. self.assertEqual(tape.lines[-3][-10:], "import Toy") self.assertEqual(tape.lines[-2], "toy = Toy()") self.assertEqual(tape.lines[-1], "toy.type = 'computer'") # Since this one is known, there should be no imports or # anything. t1 = Toy() tape.register(t1, known=True) t1.type = 'ball' self.assertEqual(tape.lines[-2], "toy.type = 'computer'") self.assertEqual(tape.lines[-1], "toy1.type = 'ball'") def test_list_items_changed(self): "Test if a list item is changed does the change get recorded." p = self.p tape = self.tape child = p.children[0] tape.register(p, known=True) tape.recording = True child.friends = ['Krishna', 'Ajay', 'Ali'] self.assertEqual(tape.lines[-1], "child.friends = ['Krishna', 'Ajay', 'Ali']") child.friends[1:] = ['Sam', 'Frodo'] self.assertEqual(tape.lines[-1], "child.friends[1:3] = ['Sam', 'Frodo']") child.friends[1] = 'Hari' self.assertEqual(tape.lines[-1], "child.friends[1:2] = ['Hari']") # What if we change a list where record=True. child1 = Child() tape.register(child1) p.children.append(child1) self.assertEqual(tape.lines[-1], "parent.children[1:1] = [child1]") del p.children[1] self.assertEqual(tape.lines[-1], "parent.children[1:2] = []") p.children[0] = child1 self.assertEqual(tape.lines[-1], "parent.children[0:1] = [child1]") def test_path_change_on_list(self): "Does the object path update when a list has changed?" # Test the case where we have a hierarchy and we change the # list. tape = self.tape p = self.p child1 = Child() p.children.append(child1) tape.register(p) tape.recording = True self.assertEqual(tape.get_object_path(child1), 'parent.children[1]') self.assertEqual(tape.get_script_id(child1), 'child1') del p.children[0] self.assertEqual(tape.get_object_path(child1), 'parent.children[0]') self.assertEqual(tape.get_script_id(child1), 'child1') def test_write_script_id_in_namespace(self): "Test the write_script_id_in_namespace method." tape = self.tape tape.recording = True # This should not cause an error but insert the name 'foo' in the # namespace. tape.write_script_id_in_namespace('foo') def test_recorder_and_ignored(self): "Test if recorder trait is set and private traits are ignored." t = Test() self.assertEqual(t.recorder, None) self.assertEqual(t._ignore, False) self.assertEqual(t.ignore_, False) tape = Recorder() tape.register(t) tape.recording = True self.assertEqual(t.recorder, tape) t._ignore = True t.ignore_ = True self.assertEqual(len(tape.script.strip()), 0) def test_record_function(self): "See if recordable function calls are handled correctly." # Note that the global recorder is set in setUp and removed in # tearDown. tape = self.tape c = self.p.children[0] tape.register(c) tape.recording = True # Setting the age should be recorded. c.age = 11 self.assertEqual(tape.lines[-1], "child.age = 11.0") # This should also work without problems. c.f(c.toy) self.assertEqual(tape.lines[-2], "child.age = 11.0") self.assertEqual(tape.lines[-1], 'child.toy = child.f(child.toy)') # Calling f should be recorded. c.f(1) self.assertEqual(tape.lines[-1], "child.f(1)") # This should not record the call to f or the change to the age # trait inside grow. c.grow(1) self.assertEqual(c.age, 12.0) self.assertEqual(tape.lines[-2], "child.f(1)") self.assertEqual(tape.lines[-1], "child.grow(1)") # Non-recordable functions shouldn't be. c.not_recordable() self.assertEqual(tape.lines[-1], "child.grow(1)") # Test a simple recordable function. @recordable def func(x, y): return x, y result = func(1, 2) self.assertEqual(tape.lines[-1], "tuple0 = func(1, 2)") def test_non_has_traits(self): "Can classes not using traits be handled?" tape = self.tape p = self.p c = p.children[0] class A(object): @recordable def __init__(self, x, y=1): self.x = x self.y = y @recordable def f(self, x, y): return x, y @recordable def g(self, x): return x def not_recordable(self): pass tape.register(p) tape.recording = True # Test if __init__ is recorded correctly. a = A(x=1) # Should record. a.f(1, 'asd') self.assertEqual(tape.lines[-3][-8:], "import A") self.assertEqual(tape.lines[-2], "a = A(x=1)") self.assertEqual(tape.lines[-1], "tuple0 = a.f(1, 'asd')") result = a.f(p, c) # This should instantiate the parent first, get the child from # that and then record the call itself. self.assertEqual(tape.lines[-3], "parent = Parent()") self.assertEqual(tape.lines[-2], "child = parent.children[0]") self.assertEqual(tape.lines[-1], "tuple1 = a.f(parent, child)") # This should simply refer to the child. result = a.g(c) self.assertEqual(tape.lines[-1], "child = a.g(child)") # Should do nothing. a.not_recordable() self.assertEqual(tape.lines[-1], "child = a.g(child)") # When a function is called with unknown args it should attempt # to create the objects. r = a.g(Toy()) self.assertEqual(tape.lines[-3][-10:], "import Toy", '\n'.join(tape.lines[-5:])) self.assertEqual(tape.lines[-2], "toy = Toy()") self.assertEqual(tape.lines[-1], "toy = a.g(toy)") def test_set_script_id(self): "Test if setting script_id at registration time works." tape = self.tape p = self.p c = p.children[0] tape.register(p, script_id='child') tape.recording = True # Ask to be called child. self.assertEqual(tape.get_script_id(p), 'child') # Register another Child. c1 = Child() tape.register(c1) # Will be child2 since child1 is taken. self.assertEqual(tape.get_script_id(c1), 'child2') # Test if recording works correctly with the changed script_id. p.children.append(c1) self.assertEqual(tape.lines[-1], "child.children[1:1] = [child2]") def test_save(self): "Test if saving tape to file works." tape = self.tape p = self.p c = p.children[0] toy = c.toy # Start recording tape.register(p) tape.recording = True toy.type = 'teddy' # Now stop. tape.recording = False tape.unregister(p) import io f = io.StringIO() tape.save(f) # Test if the file is OK. expect = ["child = parent.children[0]\n", "child.toy.type = 'teddy'\n" ] f.seek(0) lines = f.readlines() self.assertEqual(expect, lines) f.close() if __name__ == '__main__': unittest.main() mayavi-4.5.0/mayavi/tests/test_registry.py0000644000076500000240000001346212747716314021345 0ustar prabhustaff00000000000000# Author: Suyog Dutt Jain # Copyright (c) 2009-2015, Enthought, Inc. # License: BSD Style. # Standard library imports. import unittest # Enthought library imports from mayavi.core.null_engine import NullEngine from mayavi.core.registry import registry from mayavi.sources.plot3d_reader import PLOT3DReader from mayavi.core.metadata import SourceMetadata from mayavi.core.pipeline_info import PipelineInfo # Local Imports from mayavi.tests.common import get_example_data class DummyReader(PLOT3DReader): def print_info(self): """This is a Dummy Reader for Testing Purposes Its extended from PLOT3D Reader""" pass # Callable which always returns false def check_read(cls, filename): """ Callable which alwasy returns False """ return False check_read = classmethod(check_read) class TestRegistry(unittest.TestCase): def setUp(self): """Initial setting up of test fixture, automatically called by TestCase before any other test method is invoked""" e = NullEngine() #Uncomment to see visualization for debugging etc. #e = Engine() e.start() e.new_scene() self.e=e self.scene = e.current_scene return def tearDown(self): """For necessary clean up, automatically called by TestCase after the test methods have been invoked""" self.e.stop() return def test_unique_reader(self): "Check if a file with a unique reader in Mayavi2 can be read" e = self.e reader = e.open(get_example_data('prism.neu')) self.assertNotEqual(reader, None) def test_unsupported_file(self): "Test if the mechanism to handle unsupported files works fine" reader = registry.get_file_reader('junk.abc') self.assertEqual(reader, None) def test_multipe_readers(self): "Test if reader conflict is resolved" # Testing two files with same extensions but have to be read # by different readers reader = registry.get_file_reader(get_example_data('tiny.xyz')) callable = reader.get_callable() self.assertEqual(callable.__name__, 'PLOT3DReader') reader = registry.get_file_reader(get_example_data('thio3xx.xyz')) callable = reader.get_callable() self.assertEqual(callable.__name__, 'PolyDataReader') def test_multiple_valid_readers(self): """Test if the fixture works fine if there are multiple readers capable of reading the file properly""" # Inserting a dummy reader into the registry also capable of # reading files with extension 'xyz' open_dummy = SourceMetadata( id = "DummyFile", class_name = "mayavi.tests.test_registry.DummyReader", menu_name = "&PLOT3D file", tooltip = "Open a PLOT3D data data", desc = "Open a PLOT3D data data", help = "Open a PLOT3D data data", extensions = ['xyz'], wildcard = 'PLOT3D files (*.xyz)|*.xyz', can_read_test = 'mayavi.tests.test_registry:DummyReader.check_read', output_info = PipelineInfo(datasets=['structured_grid'], attribute_types=['any'], attributes=['any']) ) registry.sources.append(open_dummy) reader = registry.get_file_reader(get_example_data('tiny.xyz')) callable = reader.get_callable() self.assertEqual(callable.__name__, 'PLOT3DReader') # Removing existing readers for .xyz extensions to check if the Dummy # reader now reads it. remove = [] for index, src in enumerate(registry.sources[:]): if 'xyz' in src.extensions and src.id != 'DummyFile': remove.append((index, src)) registry.sources.remove(src) reader = registry.get_file_reader(get_example_data('tiny.xyz')) callable = reader.get_callable() self.assertEqual(callable.__name__, 'DummyReader') for index, src in remove: registry.sources.insert(index, src) registry.sources.remove(open_dummy) def test_no_valid_reader(self): """Test that if there is no reader which can read the file with assurity, the registry returns the last one of the readers which dont have a can_read_test and claim to read the file with the given extension""" open_dummy = SourceMetadata( id = "DummyFile", class_name = "mayavi.tests.test_registry.DummyReader", menu_name = "&PLOT3D file", tooltip = "Open a PLOT3D data data", desc = "Open a PLOT3D data data", help = "Open a PLOT3D data data", extensions = ['xyz'], wildcard = 'PLOT3D files (*.xyz)|*.xyz', can_read_test = 'mayavi.tests.test_registry:DummyReader.check_read', output_info = PipelineInfo(datasets=['structured_grid'], attribute_types=['any'], attributes=['any']) ) registry.sources.append(open_dummy) # Remove the poly data reader. for index, src in enumerate(registry.sources[:]): if src.id == 'PolyDataFile': poly = src registry.sources.remove(src) break reader = registry.get_file_reader(get_example_data('tiny.xyz')) callable = reader.get_callable() self.assertEqual(callable.__name__, 'PLOT3DReader') # Add back the poly data reader. registry.sources.insert(index, poly) registry.sources.remove(open_dummy) if __name__ == '__main__': unittest.main() mayavi-4.5.0/mayavi/tests/test_script_recording.py0000644000076500000240000000721712747716314023036 0ustar prabhustaff00000000000000""" A simple test for script recording in Mayavi. """ # Author: Prabhu Ramachandran # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. import unittest from apptools.scripting.api import Recorder, set_recorder from mayavi.sources.parametric_surface import \ ParametricSurface from mayavi.modules.outline import Outline from mayavi.modules.surface import Surface from mayavi.core.null_engine import NullEngine class TestScriptRecording(unittest.TestCase): def setUp(self): tape = Recorder() # Set the global recorder. set_recorder(tape) self.tape = tape def tearDown(self): self.tape.clear() set_recorder(None) def test_script_recording(self): "Does script recording work correctly." # Create a mayavi pipeline and record it. tape = self.tape e = NullEngine() e.start() # Start recording. tape.recording = True tape.register(e, known=True, script_id='engine') e.new_scene() #print tape.script self.assertEqual(tape.lines[-1], "dummy_viewer = engine.new_scene()") src = ParametricSurface() e.add_source(src) expect = 'from mayavi.sources.parametric_surface '\ 'import ParametricSurface' self.assertEqual(tape.lines[-3], expect) self.assertEqual(tape.lines[-2], "parametric_surface = ParametricSurface()") self.assertEqual(tape.lines[-1], "engine.add_source(parametric_surface)") src.function = 'dini' self.assertEqual(tape.lines[-1], "parametric_surface.function = 'dini'") o = Outline() e.add_module(o) expect = 'from mayavi.modules.outline import Outline' self.assertEqual(tape.lines[-3], expect) self.assertEqual(tape.lines[-2], "outline = Outline()") self.assertEqual(tape.lines[-1], "engine.add_module(outline)") o.actor.property.color = (1,0,0) self.assertEqual(tape.lines[-1], "outline.actor.property.color = (1.0, 0.0, 0.0)") s = Surface() e.add_module(s) expect = 'from mayavi.modules.surface import Surface' self.assertEqual(tape.lines[-3], expect) self.assertEqual(tape.lines[-2], "surface = Surface()") self.assertEqual(tape.lines[-1], "engine.add_module(surface)") s.actor.property.representation = 'wireframe' self.assertEqual(tape.lines[-1], "surface.actor.property.representation = 'wireframe'") o.actor.property.representation = 'wireframe' self.assertEqual(tape.lines[-1], "outline.actor.property.representation = 'wireframe'") s.actor.property.opacity = 0.5 self.assertEqual(tape.lines[-1], "surface.actor.property.opacity = 0.5") s.actor.mapper.scalar_visibility = False self.assertEqual(tape.lines[-1], "surface.actor.mapper.scalar_visibility = False") #print tape.script # Stop recording and test. tape.unregister(e) tape.record('#end') # Placeholder o.actor.property.opacity = 0.5 self.assertEqual(tape.lines[-1], '#end') s.actor.property.color = (1,0,0) self.assertEqual(tape.lines[-1], '#end') s.enable_contours = True self.assertEqual(tape.lines[-1], '#end') src.function = 'klein' self.assertEqual(tape.lines[-1], '#end') if __name__ == '__main__': unittest.main() mayavi-4.5.0/mayavi/tests/test_set_active_attribute.py0000644000076500000240000001006112747716314023676 0ustar prabhustaff00000000000000# Author: Suyog Dutt Jain # Prabhu Ramachandran # Copyright (c) 2008-2015, Enthought, Inc. # License: BSD Style. # Standard library imports. from os.path import abspath from io import BytesIO import copy import unittest # Enthought library imports from mayavi.core.null_engine import NullEngine from mayavi.core.common import get_output from mayavi.sources.api import VTKXMLFileReader from mayavi.filters.contour import Contour from mayavi.filters.api import PolyDataNormals from mayavi.filters.set_active_attribute import SetActiveAttribute from mayavi.modules.api import Surface, Outline # Local imports. from mayavi.tests.common import get_example_data class TestSetActiveAttribute(unittest.TestCase): def setUp(self): """Initial setting up of test fixture, automatically called by TestCase before any other test method is invoked""" e = NullEngine() # Uncomment to see visualization for debugging etc. #e = Engine() e.start() e.new_scene() self.e=e r = VTKXMLFileReader() r.initialize(get_example_data('pyramid_ug.vtu')) e.add_source(r) r.point_scalars_name = 'temperature' o = Outline() e.add_module(o) c = Contour() e.add_filter(c) n = PolyDataNormals() e.add_filter(n) aa = SetActiveAttribute() e.add_filter(aa) aa.point_scalars_name = 'pressure' s = Surface() e.add_module(s) self.scene = e.current_scene return def tearDown(self): """For necessary clean up, automatically called by TestCase after the test methods have been invoked""" self.e.stop() return def check(self): """Do the actual testing""" scene = self.scene src = scene.children[0] self.assertEqual(src.point_scalars_name,'temperature') c = src.children[1] sc = get_output(c.outputs[0]).point_data.scalars self.assertEqual(sc.name,'temperature') # It is an iso-contour! self.assertEqual(sc.range[0],sc.range[1]) aa = c.children[0].children[0] self.assertEqual(aa.point_scalars_name,'pressure') sc = get_output(aa.outputs[0]).point_data.scalars self.assertEqual(sc.name, 'pressure') self.assertEqual((abs(sc.range[0] - 70) < 1.0),True) self.assertEqual((abs(sc.range[1] - 70) < 1.0),True) s = aa.children[0].children[0] def test_set_active_attribute(self): "Test if the test fixture works" #Now test. self.check() #from mayavi.tools.show import show #show() def test_save_and_restore(self): """Test if saving a visualization and restoring it works.""" engine = self.e scene = self.scene # Save visualization. f = BytesIO() f.name = abspath('test.mv2') # We simulate a file. engine.save_visualization(f) f.seek(0) # So we can read this saved data. # Remove existing scene. engine.close_scene(scene) # Load visualization engine.load_visualization(f) self.scene = engine.current_scene self.check() def test_deepcopied(self): """Test if the MayaVi2 visualization can be deep-copied.""" ############################################################ # Test if the MayaVi2 visualization can be deep-copied. # Pop the source object. s = self.scene source = s.children.pop() # Add it back to see if that works without error. s.children.append(source) self.check() # Now deepcopy the source and replace the existing one with # the copy. This basically simulates cutting/copying the # object from the UI via the right-click menu on the tree # view, and pasting the copy back. source1 = copy.deepcopy(source) s.children[0] = source1 self.check() #from mayavi.tools.show import show #show() if __name__ == '__main__': unittest.main() mayavi-4.5.0/mayavi/tests/test_sources.py0000644000076500000240000000126212747716314021153 0ustar prabhustaff00000000000000# Author: Stefano Borini # Copyright (c) 2009-2016, Enthought, Inc. # License: BSD Style. # Standard library imports. import unittest import numpy as np # Local imports. from mayavi.tools.sources import convert_to_arrays class TestSources(unittest.TestCase): def test_convert_to_arrays(self): """Test if the convert_to_arrays routine works properly""" values = convert_to_arrays( (1, 2, 3, np.float(4), np.float64(5), np.array([6]))) all_dims = set(x.shape for x in values) self.assertEqual(len(all_dims), 1) self.assertIn((1,), all_dims) if __name__ == '__main__': unittest.main() mayavi-4.5.0/mayavi/tests/test_streamline.py0000644000076500000240000001374612747716314021645 0ustar prabhustaff00000000000000# Author: Suyog Dutt Jain # Prabhu Ramachandran # Copyright (c) 2008-2015, Enthought, Inc. # License: BSD Style. # Standard library imports. from os.path import abspath from io import BytesIO import copy import numpy import unittest # Enthought library imports from mayavi.core.null_engine import NullEngine from mayavi.sources.array_source import ArraySource from mayavi.modules.outline import Outline from mayavi.modules.streamline import Streamline class TestStreamline(unittest.TestCase): def make_data(self): """Trivial data -- creates an elementatry scalar field and a constant vector field along the 'x' axis.""" s = numpy.arange(0.0, 10.0, 0.01) s = numpy.reshape(s, (10,10,10)) s = numpy.transpose(s) v = numpy.zeros(3000, 'd') v[1::3] = 1.0 v = numpy.reshape(v, (10,10,10,3)) return s, v def setUp(self): """Initial setting up of test fixture, automatically called by TestCase before any other test method is invoked""" e = NullEngine() # Uncomment to see visualization for debugging etc. #e = Engine() e.start() s=e.new_scene() self.e=e self.s=s ############################################################ # Create a new scene and set up the visualization. d = ArraySource() sc, vec = self.make_data() d.origin = (-5, -5, -5) d.scalar_data = sc d.vector_data = vec e.add_source(d) # Create an outline for the data. o = Outline() e.add_module(o) # View the data. st = Streamline() e.add_module(st) widget = st.seed.widget widget.set(radius=1.0, center=(-4.0, -4.0, -4.0), theta_resolution=4, phi_resolution=4) st = Streamline(streamline_type='ribbon') seed = st.seed seed.widget = seed.widget_list[1] e.add_module(st) seed.widget.set(point1=(-5.0, -4.5, -4.0), point2=(-5.0, -4.5, 4.0)) st.ribbon_filter.width = 0.25 st = Streamline(streamline_type='tube') seed = st.seed seed.widget = seed.widget_list[2] e.add_module(st) seed.widget.set(center=(-5.0, 1.5, -2.5)) st.tube_filter.radius = 0.15 st = Streamline(streamline_type='tube') seed = st.seed seed.widget = seed.widget_list[3] e.add_module(st) seed.widget.position=(-5.0, 3.75, 3.75) st.tube_filter.radius = 0.2 self.st = st self.scene = e.current_scene return def tearDown(self): """For necessary clean up, automatically called by TestCase after the test methods have been invoked""" self.e.stop() return def check(self): """Do the actual testing.""" s=self.scene src = s.children[0] st = src.children[0].children[2] self.assertEqual(st.streamline_type,'ribbon') self.assertEqual(st.ribbon_filter.width,0.25) self.assertEqual(st.seed.widget,st.seed.widget_list[1]) self.assertEqual(numpy.allclose(st.seed.widget.point1, (-5.0, -4.5, -4.0)),True) self.assertEqual(numpy.allclose(st.seed.widget.point2, (-5.0, -4.5, 4.0)),True) st = src.children[0].children[3] self.assertEqual(st.streamline_type,'tube') self.assertEqual(st.tube_filter.radius,0.15) self.assertEqual(st.seed.widget,st.seed.widget_list[2]) self.assertEqual(numpy.allclose(st.seed.widget.center, (-5.0, 1.5, -2.5)),True) st = src.children[0].children[4] self.assertEqual(st.streamline_type,'tube') self.assertEqual(st.tube_filter.radius,0.2) self.assertEqual(st.seed.widget,st.seed.widget_list[3]) self.assertEqual(numpy.allclose(st.seed.widget.position, (-5.0, 3.75, 3.75)),True) def test_streamline(self): "Test if the test fixture works" self.check() def test_components_changed(self): """Test if the modules respond correctly when the components are changed.""" st = self.st tf = st.tube_filter st.tube_filter = tf.__class__() st.tube_filter = tf st.ribbon_filter = st.ribbon_filter.__class__() seed = st.seed st.seed = seed.__class__() st.seed = seed st.actor = st.actor.__class__() tracer = st.stream_tracer st.stream_tracer = tracer.__class__() st.stream_tracer = tracer self.check() def test_save_and_restore(self): """Test if saving a visualization and restoring it works.""" engine = self.e scene = self.scene # Save visualization. f = BytesIO() f.name = abspath('test.mv2') # We simulate a file. engine.save_visualization(f) f.seek(0) # So we can read this saved data. # Remove existing scene. engine.close_scene(scene) # Load visualization engine.load_visualization(f) self.scene = engine.current_scene self.check() def test_deepcopied(self): """Test if the MayaVi2 visualization can be deep-copied.""" ############################################################ # Test if the MayaVi2 visualization can be deep-copied. # Pop the source object. s = self.scene sources = s.children s.children = [] # Add it back to see if that works without error. s.children.extend(sources) self.check() # Now deepcopy the source and replace the existing one with # the copy. This basically simulates cutting/copying the # object from the UI via the right-click menu on the tree # view, and pasting the copy back. sources1 = copy.deepcopy(sources) s.children[:] = sources1 self.check() if __name__ == '__main__': unittest.main() mayavi-4.5.0/mayavi/tests/test_text3d.py0000644000076500000240000000557612747716314020717 0ustar prabhustaff00000000000000# Author: Gael Varoquaux # Copyright (c) 2009-2015, Enthought, Inc. # License: BSD Style. # Standard library imports. import unittest from io import BytesIO from os.path import abspath import numpy as np # Local imports. from mayavi.core.null_engine import NullEngine from tvtk.api import tvtk # Enthought library imports from mayavi.sources.array_source import ArraySource from mayavi.modules.text3d import Text3D class TestText3D(unittest.TestCase): def make_data(self): """Trivial data """ return np.zeros((10,10,10)) def setUp(self): """Initial setting up of test fixture, automatically called by TestCase before any other test method is invoked""" e = NullEngine() # Uncomment to see visualization for debugging etc. #e = Engine() e.start() s=e.new_scene() self.e=e self.s=s ############################################################ # Create a new scene and set up the visualization. d = ArraySource() sc = self.make_data() d.scalar_data = sc e.add_source(d) self.t = Text3D() e.add_module(self.t) self.scene = e.current_scene return def save_and_reload(self): # Save visualization. f = BytesIO() f.name = abspath('test.mv2') # We simulate a file. self.e.save_visualization(f) f.seek(0) # So we can read this saved data. # Remove existing scene. self.e.close_scene(self.scene) # Load visualization self.e.load_visualization(f) self.scene = self.e.current_scene def tearDown(self): """For necessary clean up, automatically called by TestCase after the test methods have been invoked""" self.e.stop() return def test_text3d(self): "Test if the text3d has been properly instanciated" self.assertTrue(isinstance(self.t, Text3D)) def test_follower(self): """ Test if changing 'orient_to_camera' switches between plain actor and follower """ self.t.orient_to_camera = True self.assertTrue(isinstance(self.t.actor.actor, tvtk.Follower)) self.t.orient_to_camera = False self.assertFalse(isinstance(self.t.actor.actor, tvtk.Follower)) def test_persistence(self): # First test persistence without follower self.save_and_reload() self.t.orient_to_camera = False self.assertFalse(isinstance(self.t.actor.actor, tvtk.Follower)) self.assertFalse(self.t.orient_to_camera) self.t.orient_to_camera = True self.assertTrue(isinstance(self.t.actor.actor, tvtk.Follower)) self.save_and_reload() self.assertTrue(self.t.orient_to_camera) self.assertTrue(isinstance(self.t.actor.actor, tvtk.Follower)) if __name__ == '__main__': unittest.main() mayavi-4.5.0/mayavi/tests/test_threshold_filter.py0000644000076500000240000000772012747716314023036 0ustar prabhustaff00000000000000# Author: Gael Varoquaux # Copyright (c) 2010, Enthought, Inc. # License: BSD Style. # Standard library imports. import unittest import numpy as np # Local imports. from mayavi.core.null_engine import NullEngine # Enthought library imports from mayavi.filters.threshold import Threshold from mayavi.sources.array_source import ArraySource class TestThresholdFilter(unittest.TestCase): def make_src(self, nan=False): data = np.empty((3, 3, 3)) if nan: data[0] = np.nan data.flat[:] = np.arange(data.size) return ArraySource(scalar_data=data) def setUp(self): """Initial setting up of test fixture, automatically called by TestCase before any other test method is invoked""" e = NullEngine() # Uncomment to see visualization for debugging etc. #e = Engine() e.start() s = e.new_scene() self.e = e self.s = s self.scene = e.current_scene return def tearDown(self): """For necessary clean up, automatically called by TestCase after the test methods have been invoked""" self.e.stop() return def test_threshold_filter_nan(self): src = self.make_src(nan=True) self.e.add_source(src) threshold = Threshold() self.e.add_filter(threshold) self.assertEqual( np.nanmin(src.scalar_data), np.nanmin( threshold.get_output_dataset().point_data.scalars.to_array() ) ) self.assertEqual( np.nanmax(src.scalar_data), np.nanmax( threshold.get_output_dataset().point_data.scalars.to_array() ) ) def test_threshold_filter_threhsold(self): src = self.make_src() self.e.add_source(src) threshold = Threshold() self.e.add_filter(threshold) threshold.upper_threshold = 20. self.assertTrue( 20 >= np.nanmax( threshold.get_output_dataset().point_data.scalars.to_array() ) ) return def test_threshold_filter_data_range_changes(self): # Regression test for GitHub issue #136. src = self.make_src() self.e.add_source(src) threshold = Threshold() self.e.add_filter(threshold) # Move from one data range to another non-overlapping range, # first downwards, then back up. src.scalar_data = np.linspace(3.0, 5.0, 27).reshape((3, 3, 3)) self.assertAlmostEqual(threshold.lower_threshold, 3.0) self.assertAlmostEqual(threshold.upper_threshold, 5.0) src.scalar_data = np.linspace(-5.0, -3.0, 27).reshape((3, 3, 3)) self.assertAlmostEqual(threshold.lower_threshold, -5.0) self.assertAlmostEqual(threshold.upper_threshold, -3.0) src.scalar_data = np.linspace(3.0, 5.0, 27).reshape((3, 3, 3)) self.assertAlmostEqual(threshold.lower_threshold, 3.0) self.assertAlmostEqual(threshold.upper_threshold, 5.0) # Narrow and widen. src.scalar_data = np.linspace(4.2, 4.6, 27).reshape((3, 3, 3)) self.assertAlmostEqual(threshold.lower_threshold, 4.2) self.assertAlmostEqual(threshold.upper_threshold, 4.6) src.scalar_data = np.linspace(-20.0, 20.0, 27).reshape((3, 3, 3)) self.assertAlmostEqual(threshold.lower_threshold, -20.0) self.assertAlmostEqual(threshold.upper_threshold, 20.0) # Shift to a range overlapping the previous one. src.scalar_data = np.linspace(-10.0, -30.0, 27).reshape((3, 3, 3)) self.assertAlmostEqual(threshold.lower_threshold, -30.0) self.assertAlmostEqual(threshold.upper_threshold, -10.0) src.scalar_data = np.linspace(-20.0, 20.0, 27).reshape((3, 3, 3)) self.assertAlmostEqual(threshold.lower_threshold, -20.0) self.assertAlmostEqual(threshold.upper_threshold, 20.0) if __name__ == '__main__': unittest.main() mayavi-4.5.0/mayavi/tests/test_unstructured_data_reader.py0000644000076500000240000001145012747716314024552 0ustar prabhustaff00000000000000# Author: Suyog Dutt Jain # Copyright (c) 2009, Enthought, Inc. # License: BSD Style. # Standard library imports. import unittest # Enthought library imports from tvtk.common import is_old_pipeline from mayavi.sources.unstructured_grid_reader import UnstructuredGridReader from mayavi.tests.data_reader_test_base import DataReaderTestBase # Local imports. from mayavi.tests.common import get_example_data old_pipeline = is_old_pipeline() class TestAVSUCDReader(DataReaderTestBase): def setup_reader(self): """"Setup the reader in here. This is called after the engine has been created and started. The engine is available as self.e. This method is called by setUp(). """ # Read a AVSUCD data file. r = UnstructuredGridReader() r.initialize(get_example_data('cellsnd.ascii.inp')) self.e.add_source(r) self.bounds =(-2.0, 2.0, -2.0, 2.0, 0.0, 0.0) def test_avsucd_data_reader(self): "Test if the test fixture works" #Now test. self.check(self.scene, self.bounds) def test_save_and_restore(self): """Test if saving a visualization and restoring it works.""" self.check_saving(self.e, self.scene, self.bounds) def test_deepcopied(self): """Test if the MayaVi2 visualization can be deep-copied.""" ############################################################ # Test if the MayaVi2 visualization can be deep-copied. self.check_deepcopying(self.scene, self.bounds) @unittest.skipIf(not old_pipeline, "ExodusReader is not supported VTK 6.0 onwards.") class TestExodusReader(DataReaderTestBase): def setup_reader(self): """"Setup the reader in here. This is called after the engine has been created and started. The engine is available as self.e. This method is called by setUp(). """ # Read a Exodus data file. r = UnstructuredGridReader() r.initialize(get_example_data('edgeFaceElem.exii')) self.e.add_source(r) self.bounds =(-3.0, 3.0, -3.0, 3.0, -3.0, 3.0) def test_exodus_data_reader(self): "Test if the test fixture works" #Now test. self.check(self.scene, self.bounds) def test_save_and_restore(self): """Test if saving a visualization and restoring it works.""" self.check_saving(self.e, self.scene, self.bounds) def test_deepcopied(self): """Test if the MayaVi2 visualization can be deep-copied.""" ############################################################ # Test if the MayaVi2 visualization can be deep-copied. self.check_deepcopying(self.scene, self.bounds) #TODO: Update the ExodusIIReader test for scenarios as for the other readers #in this module. @unittest.skip("ExodusIIReader support is disabled for now.") class TestExodusIIReader(DataReaderTestBase): def setup_reader(self): """"Setup the reader in here. This is called after the engine has been created and started. The engine is available as self.e. This method is called by setUp(). """ # Read a Exodus data file. r = UnstructuredGridReader() r.initialize(get_example_data('disk_out_ref.ex2')) self.e.add_source(r) def test_point_cell_data(self): """ Test if the point and cell data is parsed correctly.""" u_grid = self.scene.children[0].outputs[0] self.assertEqual(u_grid.point_data.number_of_arrays, 7) self.assertEqual(u_grid.cell_data.number_of_arrays, 1) self.assertEqual(u_grid.point_data.number_of_tuples, 8499) self.assertEqual(u_grid.cell_data.number_of_tuples, 7472) class TestGambitReader(DataReaderTestBase): def setup_reader(self): """"Setup the reader in here. This is called after the engine has been created and started. The engine is available as self.e. This method is called by setUp(). """ # Read a Gambit data file. r = UnstructuredGridReader() r.initialize(get_example_data('prism.neu')) self.e.add_source(r) self.bounds = (-1.0, 1.0, -1.0, 1.0, 0.0, 1.0) def test_gambit_data_reader(self): "Test if the test fixture works" #Now test. self.check(self.scene, self.bounds) def test_save_and_restore(self): """Test if saving a visualization and restoring it works.""" self.check_saving(self.e, self.scene, self.bounds) def test_deepcopied(self): """Test if the MayaVi2 visualization can be deep-copied.""" ############################################################ # Test if the MayaVi2 visualization can be deep-copied. self.check_deepcopying(self.scene, self.bounds) if __name__ == '__main__': unittest.main() mayavi-4.5.0/mayavi/tests/test_user_defined.py0000644000076500000240000001244312747716314022127 0ustar prabhustaff00000000000000# Author: Suyog Dutt Jain # Prabhu Ramachandran # Copyright (c) 2008-2015, Enthought, Inc. # License: BSD Style. # Standard library imports. from os.path import abspath from io import BytesIO import copy import unittest # Enthought library imports from mayavi.core.null_engine import NullEngine from mayavi.filters.optional import Optional from mayavi.filters.user_defined import UserDefined from mayavi.filters.api import (CellToPointData, ExtractVectorNorm, ExtractVectorComponents) from mayavi.modules.api import ScalarCutPlane from mayavi.sources.vtk_xml_file_reader import VTKXMLFileReader from tvtk.api import tvtk # Local imports. from mayavi.tests.common import get_example_data class TestUserDefined(unittest.TestCase): def setUp(self): """Initial setting up of test fixture, automatically called by TestCase before any other test method is invoked""" e = NullEngine() # Uncomment to see visualization for debugging etc. #e = Engine() e.start() e.new_scene() self.e=e # Read a VTK (old style) data file. r = VTKXMLFileReader() r.initialize(get_example_data('pyramid_ug.vtu')) e.add_source(r) # Create the filters. # CellDerivatives cd = tvtk.CellDerivatives() ud = UserDefined(filter=cd) e.add_filter(ud) ctp = CellToPointData() ctp.filter.pass_cell_data = False e.add_filter(ctp) evn = ExtractVectorNorm() e.add_filter(evn) evc = ExtractVectorComponents(component='y-component') o = Optional(filter=evc) e.add_filter(o) e.add_module(ScalarCutPlane()) self.scene = e.current_scene s = self.scene return def tearDown(self): """For necessary clean up, automatically called by TestCase after the test methods have been invoked""" self.e.stop() return def check(self): """Do the actual testing.""" scene = self.scene src = scene.children[0] ud = src.children[0] o = ud.children[0].children[0].children[0] mm = o.children[0] assert src.get_output_dataset().point_data.scalars.name == 'temperature' assert src.get_output_dataset().point_data.vectors.name == 'velocity' expect = ['ScalarGradient', 'Vorticity'] expect1 = [x +'-y' for x in expect] expect2 = [x + ' magnitude' for x in expect] o.enabled = True assert o.get_output_dataset().point_data.scalars.name in expect1 assert o.get_output_dataset().point_data.vectors.name in expect assert mm.scalar_lut_manager.data_name in expect1 # Turn of extraction. o.enabled = False assert o.get_output_dataset().point_data.scalars.name in expect2 assert o.get_output_dataset().point_data.vectors.name in expect assert mm.scalar_lut_manager.data_name in expect2 # Compute the vorticity ud.filter.vector_mode = 'compute_vorticity' assert o.get_output_dataset().point_data.scalars.name == 'Vorticity magnitude' assert o.get_output_dataset().point_data.vectors.name == 'Vorticity' assert mm.scalar_lut_manager.data_name == 'Vorticity magnitude' # Turn on extraction. o.enabled = True assert o.get_output_dataset().point_data.scalars.name == 'Vorticity-y' assert o.get_output_dataset().point_data.vectors.name == 'Vorticity' assert mm.scalar_lut_manager.data_name == 'Vorticity-y' # Turn off extraction. o.enabled = False def test_user_defined(self): "Test if the test fixture works" #Now test. s = self.scene self.check() #from mayavi.tools.show import show #show() def test_save_and_restore(self): """Test if saving a visualization and restoring it works.""" engine = self.e scene = self.scene # Save visualization. f = BytesIO() f.name = abspath('test.mv2') # We simulate a file. engine.save_visualization(f) f.seek(0) # So we can read this saved data. # Remove existing scene. engine.close_scene(scene) # Load visualization engine.load_visualization(f) self.scene = engine.current_scene s = self.scene self.check() def test_deepcopied(self): """Test if the MayaVi2 visualization can be deep-copied.""" ############################################################ # Test if the MayaVi2 visualization can be deep-copied. # Pop the source object. s = self.scene source = s.children.pop() # Add it back to see if that works without error. s.children.append(source) cp = source.children[0].children[-1] s = self.scene self.check() # Now deepcopy the source and replace the existing one with # the copy. This basically simulates cutting/copying the # object from the UI via the right-click menu on the tree # view, and pasting the copy back. source1 = copy.deepcopy(source) s.children[0] = source1 s = self.scene self.check() #from mayavi.tools.show import show #show() if __name__ == '__main__': unittest.main() mayavi-4.5.0/mayavi/tests/test_volume.py0000644000076500000240000000154712747716314021005 0ustar prabhustaff00000000000000# Standard library imports. import numpy as np import unittest from mock import patch # Enthought library imports from mayavi.tests.common import get_example_data from mayavi import mlab class TestVolumeWorksWithProbe(unittest.TestCase): def setUp(self): self._orig_backend = mlab.options.backend mlab.options.backend = "test" def tearDown(self): mlab.options.backend = self._orig_backend def test_volume_works_with_probe(self): src = mlab.pipeline.open(get_example_data('pyramid_ug.vtu')) idp = mlab.pipeline.image_data_probe(src) with patch('pyface.api.error') as m: vol = mlab.pipeline.volume(idp) self.assertEqual(m.call_count, 0) self.assertEqual( np.allclose(vol.volume.center, (3.0, 3.0, 1.5)),True ) if __name__ == '__main__': unittest.main() mayavi-4.5.0/mayavi/tests/test_vtk_data_source.py0000644000076500000240000001256712747716314022657 0ustar prabhustaff00000000000000# Author: Suyog Dutt Jain # Prabhu Ramachandran # Copyright (c) 2008-2015, Enthought, Inc. # License: BSD Style. # Standard library imports. from os.path import abspath from io import BytesIO import copy import numpy import unittest # Enthought library imports from mayavi.core.null_engine import NullEngine from mayavi.sources.vtk_data_source import VTKDataSource from mayavi.modules.outline import Outline from mayavi.modules.iso_surface import IsoSurface from mayavi.modules.contour_grid_plane import ContourGridPlane from mayavi.modules.scalar_cut_plane import ScalarCutPlane from tvtk.api import tvtk from mayavi.tests import datasets class TestVTKDataSource(unittest.TestCase): def setUp(self): """Initial setting up of test fixture, automatically called by TestCase before any other test method is invoked""" e = NullEngine() # Uncomment to see visualization for debugging etc. #e = Engine() e.start() e.new_scene() self.e=e sgrid=datasets.generateStructuredGrid() src = VTKDataSource(data = sgrid) e.add_source(src) # Create an outline for the data. o = Outline() e.add_module(o) # Create one ContourGridPlane normal to the 'x' axis. cgp1 = ContourGridPlane() e.add_module(cgp1) # Set the position to the middle of the data. cgp1.grid_plane.position = 15 # Another with filled contours normal to 'y' axis. cgp2 = ContourGridPlane() cgp2.contour.filled_contours = True # Set the axis and position to the middle of the data. cgp2.grid_plane.axis = 'y' cgp2.grid_plane.position = 15 e.add_module(cgp2) # An isosurface module. iso = IsoSurface(compute_normals=True) e.add_module(iso) iso.contour.contours = [5] # An interactive scalar cut plane. cp = ScalarCutPlane() e.add_module(cp) ip = cp.implicit_plane ip.normal = 0,0,1 ip.origin = 0.5, 0.5, 1.0 # Since this is running offscreen this seems necessary. ip.widget.origin = 0.5, 0.5, 1.0 ip.widget.enabled = False self.scene = e.current_scene self.cgp2=cgp2 self.iso=iso self.cp=cp return def tearDown(self): """For necessary clean up, automatically called by TestCase after the test methods have been invoked""" self.e.stop() return def check(self): """Do the actual testing.""" scene = self.scene src = scene.children[0] mm = src.children[0] cgp1 = mm.children[1] self.assertEqual(cgp1.grid_plane.position,15) cgp2 = mm.children[2] self.assertEqual(cgp2.contour.filled_contours,True) self.assertEqual(cgp2.grid_plane.axis, 'y') self.assertEqual(cgp2.grid_plane.position,15) iso = mm.children[3] ctr = iso.contour.contours self.assertEqual(iso.compute_normals,True) self.assertEqual(ctr, [5.0]) rng = iso.actor.mapper.input.point_data.scalars.range self.assertEqual(rng[0],5.0) self.assertEqual(rng[1],5.0) cp = mm.children[4] ip = cp.implicit_plane self.assertAlmostEqual(numpy.sum(ip.normal - (0,0,1)) , 1e-16) self.assertAlmostEqual(numpy.sum(ip.origin - (0.5, 0.5, 1.0)), 0.0) self.assertEqual(ip.widget.enabled,False) def test_vtk_data_source(self): "Test if the test fixture works" #Now test. self.check() #from mayavi.tools.show import show #show() def test_save_and_restore(self): """Test if saving a visualization and restoring it works.""" engine = self.e scene = self.scene # Save visualization. f = BytesIO() f.name = abspath('test.mv2') # We simulate a file. engine.save_visualization(f) f.seek(0) # So we can read this saved data. # Remove existing scene. engine.close_scene(scene) # Load visualization engine.load_visualization(f) self.scene = engine.current_scene self.check() def test_deepcopied(self): """Test if the MayaVi2 visualization can be deep-copied.""" ############################################################ # Test if the MayaVi2 visualization can be deep-copied. # Pop the source object. s = self.scene source = s.children.pop() # Add it back to see if that works without error. s.children.append(source) cp = source.children[0].children[-1] cp.implicit_plane.widget.enabled = False self.check() # Now deepcopy the source and replace the existing one with # the copy. This basically simulates cutting/copying the # object from the UI via the right-click menu on the tree # view, and pasting the copy back. source1 = copy.deepcopy(source) s.children[0] = source1 cp = source1.children[0].children[-1] cp.implicit_plane.widget.enabled = False self.check() def test_add_child(self): """Test if adding a source as a child works correctly.""" src = self.e.scenes[0].children[0] new_src = VTKDataSource(data=tvtk.PolyData()) src.add_child(new_src) if __name__ == '__main__': unittest.main() mayavi-4.5.0/mayavi/tests/test_vtk_file_reader.py0000644000076500000240000000341412747716314022616 0ustar prabhustaff00000000000000# Copyright (c) 2015, Enthought, Inc. # License: BSD Style. # Standard library imports. import unittest # External library imports import vtk # Enthought library imports from mayavi.sources.vtk_file_reader import VTKFileReader # Local imports. from mayavi.tests.common import get_example_data vtk_major_version = vtk.vtkVersion.GetVTKMajorVersion() vtk_minor_version = vtk.vtkVersion.GetVTKMinorVersion() class TestVTKFileReader(unittest.TestCase): def setUp(self): # Read a VTK data file. self.src = VTKFileReader() def tearDown(self): """For necessary clean up, automatically called by TestCase after the test methods have been invoked""" self.src = None return def check(self, n_points, n_cells): """Do the actual testing.""" output = self.src.outputs[0] self.assertEqual(output.number_of_points, n_points) self.assertEqual(output.number_of_cells, n_cells) def test_structured_points_file(self): self.src.initialize(get_example_data('texThres2.vtk')) self.check(128, 127) def test_rectiliner_grid_file(self): self.src.initialize(get_example_data('RectGrid2.vtk')) self.check(17061, 14720) def test_polydata_file(self): self.src.initialize(get_example_data('polyEx.vtk')) self.check(8, 6) def test_structured_grid_file(self): self.src.initialize(get_example_data('SampleStructGrid.vtk')) self.check(24000, 21489) def test_unstructured_grid_file(self): self.src.initialize(get_example_data('uGridEx.vtk')) self.check(27, 12) def test_field_file(self): self.src.initialize(get_example_data('fieldfile.vtk')) self.check(18, 3) if __name__ == '__main__': unittest.main() mayavi-4.5.0/mayavi/tests/test_vtk_xml_reader.py0000644000076500000240000001120412747716314022473 0ustar prabhustaff00000000000000# Author: Suyog Dutt Jain # Prabhu Ramachandran # Copyright (c) 2008-2015, Enthought, Inc. # License: BSD Style. # Standard library imports. from os.path import abspath from io import BytesIO import copy import unittest import numpy # Enthought library imports from mayavi.core.null_engine import NullEngine from mayavi.sources.vtk_xml_file_reader import VTKXMLFileReader from mayavi.modules.outline import Outline from mayavi.modules.contour_grid_plane import ContourGridPlane from mayavi.modules.scalar_cut_plane import ScalarCutPlane # Local imports. from mayavi.tests.common import get_example_data class TestVTKXMLReader(unittest.TestCase): def setUp(self): e = NullEngine() # Uncomment to see visualization for debugging etc. #e = Engine() e.start() e.new_scene() self.e=e # Read a VTK XML data file. r = VTKXMLFileReader() r.initialize(get_example_data('cube.vti')) e.add_source(r) # Create an outline for the data. o = Outline() e.add_module(o) # Create one ContourGridPlane normal to the 'x' axis. cgp1 = ContourGridPlane() e.add_module(cgp1) # Set the position to the middle of the data. cgp1.grid_plane.position = 1 # Another with filled contours normal to 'y' axis. cgp2 = ContourGridPlane() cgp2.contour.filled_contours = True # Set the axis and position to the middle of the data. cgp2.grid_plane.axis = 'y' cgp2.grid_plane.position = 1 e.add_module(cgp2) # An interactive scalar cut plane. cp = ScalarCutPlane() e.add_module(cp) ip = cp.implicit_plane ip.normal = 0,0,1 ip.origin = 0.5, 0.5, 1.0 # Since this is running offscreen this seems necessary. ip.widget.origin = 0.5, 0.5, 1.0 ip.widget.enabled = False self.scene = e.current_scene self.cgp2=cgp2 self.cp=cp return def tearDown(self): """For necessary clean up, automatically called by TestCase after the test methods have been invoked""" self.e.stop() return def check(self): """Do the actual testing.""" scene = self.scene src = scene.children[0] mm = src.children[0] cgp1 = mm.children[1] self.assertEqual(cgp1.grid_plane.position,1) cgp2 = mm.children[2] self.assertEqual(cgp2.contour.filled_contours,True) self.assertEqual(cgp2.grid_plane.axis, 'y') self.assertEqual(cgp2.grid_plane.position,1) cp = mm.children[3] ip = cp.implicit_plane self.assertAlmostEqual(numpy.sum(ip.normal - (0,0,1)) , 1e-16) self.assertAlmostEqual(numpy.sum(ip.origin - (0.5, 0.5, 1.0)), 0.0) self.assertEqual(ip.widget.enabled,False) def test_vtk_xml_reader(self): "Test if the test fixture works" #Now test. self.check() #from mayavi.tools.show import show #show() def test_save_and_restore(self): """Test if saving a visualization and restoring it works.""" engine = self.e scene = self.scene # Save visualization. f = BytesIO() f.name = abspath('test.mv2') # We simulate a file. engine.save_visualization(f) f.seek(0) # So we can read this saved data. # Remove existing scene. engine.close_scene(scene) # Load visualization engine.load_visualization(f) self.scene = engine.current_scene self.check() def test_deepcopied(self): """Test if the MayaVi2 visualization can be deep-copied.""" ############################################################ # Test if the MayaVi2 visualization can be deep-copied. # Pop the source object. s = self.scene source = s.children.pop() # Add it back to see if that works without error. s.children.append(source) cp = source.children[0].children[-1] cp.implicit_plane.widget.enabled = False self.check() # Now deepcopy the source and replace the existing one with # the copy. This basically simulates cutting/copying the # object from the UI via the right-click menu on the tree # view, and pasting the copy back. source1 = copy.deepcopy(source) s.children[0] = source1 cp = source1.children[0].children[-1] cp.implicit_plane.widget.enabled = False self.check() #from mayavi.tools.show import show #show() if __name__ == '__main__': unittest.main() mayavi-4.5.0/mayavi/tools/0000755000076500000240000000000012747722127016053 5ustar prabhustaff00000000000000mayavi-4.5.0/mayavi/tools/__init__.py0000644000076500000240000000013212747716314020161 0ustar prabhustaff00000000000000# Author: Prabhu Ramachandran # Copyright (c) 2007, Enthought, Inc. # License: BSD Style. mayavi-4.5.0/mayavi/tools/animator.py0000644000076500000240000001777312747716314020257 0ustar prabhustaff00000000000000""" Simple utility code for animations. """ # Author: Prabhu Ramachandran # Copyright (c) 2009, Enthought, Inc. # License: BSD Style. import types from functools import wraps try: from decorator import decorator HAS_DECORATOR = True except ImportError: HAS_DECORATOR = False from pyface.timer.api import Timer from traits.api import Any, HasTraits, Button, Instance, Range from traitsui.api import View, Group, Item ############################################################################### # `Animator` class. ############################################################################### class Animator(HasTraits): """ Convenience class to manage a timer and present a convenient UI. This is based on the code in `tvtk.tools.visual`. Here is a simple example of using this class:: >>> from mayavi import mlab >>> def anim(): ... f = mlab.gcf() ... while 1: ... f.scene.camera.azimuth(10) ... f.scene.render() ... yield ... >>> anim = anim() >>> t = Animator(500, anim.next) >>> t.edit_traits() This makes it very easy to animate your visualizations and control it from a simple UI. **Notes** If you want to modify the data plotted by an `mlab` function call, please refer to the section on: :ref:`mlab-animating-data` """ ######################################## # Traits. start = Button('Start Animation') stop = Button('Stop Animation') delay = Range(10, 100000, 500, desc='frequency with which timer is called') # The internal timer we manage. timer = Any ###################################################################### # User interface view traits_view = View(Group(Item('start'), Item('stop'), show_labels=False), Item('_'), Item(name='delay'), title='Animation Controller', buttons=['OK']) ###################################################################### # Initialize object def __init__(self, millisec, callable, *args, **kwargs): """Constructor. **Parameters** :millisec: int specifying the delay in milliseconds between calls to the callable. :callable: callable function to call after the specified delay. :\*args: optional arguments to be passed to the callable. :\*\*kwargs: optional keyword arguments to be passed to the callable. """ HasTraits.__init__(self) self.delay = millisec self.ui = None self.timer = Timer(millisec, callable, *args, **kwargs) ###################################################################### # `Animator` protocol. ###################################################################### def show(self): """Show the animator UI. """ self.ui = self.edit_traits() def close(self): """Close the animator UI. """ if self.ui is not None: self.ui.dispose() ###################################################################### # Non-public methods, Event handlers def _start_fired(self): self.timer.Start(self.delay) def _stop_fired(self): self.timer.Stop() def _delay_changed(self, value): t = self.timer if t is None: return if t.IsRunning(): t.Stop() t.Start(value) ############################################################################### # Decorators. def animate(func=None, delay=500, ui=True, support_movie=True): """A convenient decorator to animate a generator that performs an animation. The `delay` parameter specifies the delay (in milliseconds) between calls to the decorated function. If `ui` is True, then a simple UI for the animator is also popped up. The decorated function will return the `Animator` instance used and a user may call its `Stop` method to stop the animation. The `support_movie` parameter is True by default and this makes it easy to record a movie with the decorator. If this is turned off, one cannot record a movie of the animation. If an ordinary function is decorated a `TypeError` will be raised. **Parameters** :delay: int specifying the time interval in milliseconds between calls to the function. :ui: bool specifying if a UI controlling the animation is to be provided. :support_movie: bool specifying if the animation will support recording of a movie. **Returns** The decorated function returns an `Animator` instance. **Examples** Here is the example provided in the Animator class documentation:: >>> from mayavi import mlab >>> @mlab.animate ... def anim(): ... f = mlab.gcf() ... while 1: ... f.scene.camera.azimuth(10) ... f.scene.render() ... yield ... >>> a = anim() # Starts the animation. For more specialized use you can pass arguments to the decorator:: >>> from mayavi import mlab >>> @mlab.animate(delay=500, ui=False) ... def anim(): ... f = mlab.gcf() ... while 1: ... f.scene.camera.azimuth(10) ... f.scene.render() ... yield ... >>> a = anim() # Starts the animation without a UI. **Notes** If you want to modify the data plotted by an `mlab` function call, please refer to the section on: :ref:`mlab-animating-data`. """ class Wrapper(object): # The wrapper which calls the decorated function. def __init__(self, function): self.func = function self.ui = ui self.delay = delay self._support_movie = support_movie self._movie_maker = None self._next = None def __call__(self, *args, **kw): if isinstance(self.func, types.GeneratorType): f = self.func else: f = self.func(*args, **kw) if isinstance(f, types.GeneratorType): _next = f.next if hasattr(f, 'next') else f.__next__ self._next = _next self._movie_maker = None a = Animator(self.delay, self._step) if self.ui: a.show() return a else: msg = 'The function "%s" must be a generator '\ '(use yield)!' % (self.func.__name__) raise TypeError(msg) def _step(self): try: self._next() if self._support_movie: self._update_movie_maker() except StopIteration: if self._support_movie: self._movie_maker.animation_stop() raise def _update_movie_maker(self): if self._movie_maker is None: from .engine_manager import get_engine scene = get_engine().current_scene.scene self._movie_maker = scene.movie_maker self._movie_maker.animation_start() else: self._movie_maker.animation_step() def decorator_call(self, func, *args, **kw): return self(*args, **kw) def _wrapper(function): # Needed to create the Wrapper in the right scope. if HAS_DECORATOR: # The decorator calls a callable with (func, *args, **kw) signature return decorator(Wrapper(function).decorator_call, function) else: return wraps(function)(Wrapper(function)) if func is None: return _wrapper else: return _wrapper(func) mayavi-4.5.0/mayavi/tools/auto_doc.py0000644000076500000240000000426112747716314020226 0ustar prabhustaff00000000000000""" Automatic documentation from traited objects. """ # Author: Gael Varoquaux # Copyright (c) 2007-2015, Enthought, Inc. # License: BSD Style. from textwrap import wrap, dedent import types old_dedent = dedent def dedent(text): """ Removes as much indentation as possible from some text, but does not modify the first line. """ text_lines = [line.rstrip() for line in text.split("\n")] if len(text_lines) > 0: return text_lines[0] + "\n" + old_dedent( "\n".join(text_lines[1:])) else: return text def make_doc(klass): """ Builds a docstring from the object's docstring, and it's traits help. """ if hasattr(klass, '__doc__'): doc = dedent(klass.__doc__) + "\n" else: doc = "" doc += dedent("""**Keyword arguments:**""") traits = klass.class_traits().copy() traits.pop('trait_added') traits.pop('trait_modified') doc += traits_doc(traits) return doc def traits_doc(traits): doc = "" traits_names = sorted(traits.keys()) for trait_name in traits_names: trait_obj = traits[trait_name] if not trait_name[0] == '_': doc += format_argument(trait_name, trait_obj) return doc def format_argument(trait_name, trait_obj): doc = "\n :%s: " % trait_name pad = "\n" + (len(doc) - 1) * " " help = trait_obj.help if help is not None: arg_desc = help else: arg_desc = '' desc = trait_obj.desc if desc is not None: arg_desc += desc.rstrip() handler = trait_obj.handler if handler is not None: if (not hasattr(handler, 'aType') or not handler.aType in (int, float)): # These types are simple enough arg_desc += ' Must be %s.' % handler.info() default = trait_obj.default_value()[1] if not default in ('', None) and not trait_obj.array: arg_desc = arg_desc.rstrip() + " Default: %s" % str(default) desc_width = 75 - len(doc) for line in wrap(arg_desc, width=desc_width): doc += line doc += pad return doc mayavi-4.5.0/mayavi/tools/camera.py0000644000076500000240000003467612747716314017676 0ustar prabhustaff00000000000000""" Controlling the camera. """ # Author: Gael Varoquaux and Prabhu Ramachandran # Copyright (c) 2007-2008, Enthought, Inc. # License: BSD Style. # Standard library imports. import warnings try: import numpy as np except ImportError as m: msg = '''%s\n%s\nPlease check your numpy installation. If you need numpy, 'easy_install numpy' will install it. http://numpy.scipy.org ''' % (m, '_' * 80) raise ImportError(msg) from numpy import pi # We can't use gcf, as it creates a circular import in camera management # routines. from .engine_manager import get_engine def world_to_display(x, y, z, figure=None): """ Converts 3D world coordinates to screenshot pixel coordinates. **Parameters** :x: float World x coordinate :y: float World y coordinate :z: float World z coordinate :figure: Mayavi figure or None The figure to use for the conversion. If None, the current one is used. **Output** :x: float Screenshot x coordinate :y: float Screenshot y coordinate """ if figure is None: f = get_engine().current_scene else: f = figure if f is None or f.scene is None: return 0, 0 f.scene._renderer.world_point = [x, y, z, 1] f.scene._renderer.world_to_display() x, y, _ = f.scene._renderer.display_point return x, y def roll(roll=None, figure=None): """ Sets or returns the absolute roll angle of the camera. **See also** :mlab.view: control the position and direction of the camera """ if figure is None: f = get_engine().current_scene else: f = figure if f is None: return scene = f.scene if scene is None: return cam = scene.camera if roll is not None: cam.set_roll(roll) if not scene.disable_render: scene.render() return cam.get_roll() # This is needed for usage inside the view function, where roll is a # local variable _roll = roll def rad2deg(rad): """Converts radians to degrees.""" return rad * 180. / pi def deg2rad(deg): """Converts degrees to radians.""" return deg * pi / 180. def get_camera_direction(cam): """ Return the polar coordinates for the camera position: r, theta, phi, as well as the focal point. """ fp = cam.focal_point pos = cam.position x, y, z = pos - fp r = np.sqrt(x * x + y * y + z * z) theta = np.arccos(z / r) phi = np.arctan2(y, x) return r, theta, phi, fp def get_outline_bounds(figure=None): """ Return the pixel bounds of the objects visible on the figure. """ if figure is None: f = get_engine().current_scene else: f = figure if f is None: return scene = f.scene if scene is None: return 1, 1, 1, 1 # Lazy import, to avoid circular imports from .figure import screenshot red, green, blue = scene.background # Use mode='rgba' to have float values, as with fig.scene.background outline = screenshot(mode='rgba') outline = ((outline[..., 0] != red) + (outline[..., 1] != green) + (outline[..., 2] != blue) ) outline_x = outline.sum(axis=0) outline_y = outline.sum(axis=1) height, width = outline.shape width = float(width) height = float(height) outline_x = np.where(outline_x)[0] outline_y = np.where(outline_y)[0] if len(outline_x) == 0: x_min = x_max = .5 * width else: x_min = outline_x.min() x_max = outline_x.max() if len(outline_y) == 0: y_min = y_max = .5 * height else: y_min = outline_y.min() y_max = outline_y.max() return x_min, x_max, y_min, y_max, width, height def view(azimuth=None, elevation=None, distance=None, focalpoint=None, roll=None, reset_roll=True, figure=None): """ Sets/Gets the view point for the camera:: view(azimuth=None, elevation=None, distance=None, focalpoint=None, roll=None, reset_roll=True, figure=None) If called with no arguments this returns the current view of the camera. To understand how this function works imagine the surface of a sphere centered around the visualization. The `azimuth` argument specifies the angle "phi" on the x-y plane which varies from 0-360 degrees. The `elevation` argument specifies the angle "theta" from the z axis and varies from 0-180 degrees. The `distance` argument is the radius of the sphere and the `focalpoint`, the center of the sphere. Note that if the `elevation` is close to zero or 180, then the `azimuth` angle refers to the amount of rotation of a standard x-y plot with respect to the x-axis. Thus, specifying ``view(0,0)`` will give you a typical x-y plot with x varying from left to right and y from bottom to top. **Keyword arguments**: :azimuth: float, optional. The azimuthal angle (in degrees, 0-360), i.e. the angle subtended by the position vector on a sphere projected on to the x-y plane with the x-axis. :elevation: float, optional. The zenith angle (in degrees, 0-180), i.e. the angle subtended by the position vector and the z-axis. :distance: float or 'auto', optional. A positive floating point number representing the distance from the focal point to place the camera. New in Mayavi 3.4.0: if 'auto' is passed, the distance is computed to have a best fit of objects in the frame. :focalpoint: array_like or 'auto', optional. An array of 3 floating point numbers representing the focal point of the camera. New in Mayavi 3.4.0: if 'auto' is passed, the focal point is positioned at the center of all objects in the scene. :roll: float, optional Controls the roll, ie the rotation of the camera around its axis. :reset_roll: boolean, optional. If True, and 'roll' is not specified, the roll orientation of the camera is reset. :figure: The Mayavi figure to operate on. If None is passed, the current one is used. **Returns**: If no arguments are supplied it returns a tuple of 4 values ``(azimuth, elevation, distance, focalpoint)``, representing the current view. Note that these can be used later on to set the view. If arguments are supplied it returns `None`. **Examples**: Get the current view:: >>> v = view() >>> v (45.0, 45.0, 25.02794981, array([ 0.01118028, 0. , 4.00558996])) Set the view in different ways:: >>> view(45, 45) >>> view(240, 120) >>> view(distance=20) >>> view(focalpoint=(0,0,9)) Set the view to that saved in `v` above:: >>> view(*v) **See also** :mlab.roll: control the roll angle of the camera, ie the direction pointing up """ if figure is None: f = get_engine().current_scene else: f = figure if f is None: return scene = f.scene if scene is None: return ren = scene.renderer cam = scene.camera cos = np.cos sin = np.sin # First compute the current state of the camera. r, theta, phi, fp = get_camera_direction(cam) # If no arguments were specified, just return the current view. if azimuth is None and elevation is None and distance is None \ and focalpoint is None and roll is None: return rad2deg(phi), rad2deg(theta), r, fp # Convert radians to if azimuth is None: azimuth = rad2deg(phi) else: phi = deg2rad(azimuth) if elevation is None: elevation = rad2deg(theta) else: theta = deg2rad(elevation) # We compute the position of the camera on the surface of a sphere # centered at the center of the bounds, with radius chosen from the # bounds. bounds = np.array(ren.compute_visible_prop_bounds()) if distance is not None and not distance == 'auto': r = distance else: r = max(bounds[1::2] - bounds[::2]) * 2.0 cen = (bounds[1::2] + bounds[::2]) * 0.5 if focalpoint is not None and not focalpoint == 'auto': cen = np.asarray(focalpoint) # Find camera position. x = r * cos(phi) * sin(theta) y = r * sin(phi) * sin(theta) z = r * cos(theta) # Now setup the view. cam.focal_point = cen cam.position = cen + [x, y, z] cam.compute_view_plane_normal() ren.reset_camera_clipping_range() if roll is not None: print("setting roll") _roll(roll) elif reset_roll: # Now calculate the view_up vector of the camera. If the view up is # close to the 'z' axis, the view plane normal is parallel to the # camera which is unacceptable, so we use a different view up. view_up = [0, 0, 1] if abs(elevation) < 5. or abs(elevation) > 175.: view_up = [sin(phi), cos(phi), 0] cam.view_up = view_up if distance == 'auto': # Reset the zoom, to have the full extents: scene.reset_zoom() x_min, x_max, y_min, y_max, w, h = get_outline_bounds(figure=figure) x_focus, y_focus = world_to_display(cen[0], cen[1], cen[2], figure=figure) ratio = 1.1 * max((x_focus - x_min) / x_focus, (x_max - x_focus) / (w - x_focus), (y_focus - y_min) / y_focus, (y_max - y_focus) / (h - y_focus), ) distance = get_camera_direction(cam)[0] r = distance * ratio # Reset the camera position. x = r * cos(phi) * sin(theta) y = r * sin(phi) * sin(theta) z = r * cos(theta) # Now setup the view. cam.position = cen + [x, y, z] cam.compute_view_plane_normal() ren.reset_camera_clipping_range() if not scene.disable_render: scene.render() return rad2deg(phi), rad2deg(theta), r, fp def move(forward=None, right=None, up=None): """ Translates the camera and focal point together. The arguments specify the relative distance to translate the camera and focal point, so as to produce the appearence of moving the camera without changing the effective field of view. If called with no arguments, the function returns the absolute position of the camera and focal pointon a cartesian coordinate system. Note that the arguments specify relative motion, although the return value with no arguments is in an absolute coordinate system. **Keyword arguments**: :forward: float, optional. The distance in space to translate the camera forward (if positive) or backward (if negative) :right: float, optional. The distance in space to translate the camera to the right (if positive) or left (if negative) :up: float, optional. The distance in space to translate the camera up (if positive) or down (if negative) **Returns**: If no arguments are supplied (or all are None), returns a tuple (camera_position, focal_point_position) otherwise, returns None **Examples**: Get the current camera position:: >>> cam,foc = move() >>> cam array([-0.06317079, -0.52849738, -1.68316389]) >>> foc array([ 1.25909623, 0.15692708, -0.37576693]) Translate the camera:: >>> move(3,-1,-1.2) >>> move() (array([ 2.93682921, -1.52849738, -2.88316389]), array([ 4.25909623, -0.84307292, -1.57576693])) Return to the starting position:: >>> move(-3,1,1.2) >>> move() (array([-0.06317079, -0.52849738, -1.68316389]), array([ 1.25909623, 0.15692708, -0.37576693])) **See also** :mlab.yaw: yaw the camera (tilt left-right) :mlab.pitch: pitch the camera (tilt up-down) :mlab.roll: control the absolute roll angle of the camera :mlab.view: set the camera position relative to the focal point instead of in absolute space """ f = get_engine().current_scene if f is None: return scene = f.scene if scene is None: return ren = scene.renderer cam = scene.camera if forward is None and right is None and up is None: return cam.position, cam.focal_point # vector to offset the camera loc and focal point v = np.zeros(3) # view plane vetor points behind viewing direction, so we invert it yhat = -1. * np.array(cam.view_plane_normal) zhat = cam.view_up xhat = np.cross(yhat, zhat) if forward is not None: v += forward * yhat if right is not None: v += right * xhat if up is not None: v += up * zhat # Apply the offset and setup the view. cam.position = cam.position + v cam.focal_point = cam.focal_point + v ren.reset_camera_clipping_range() scene.render() def yaw(degrees): """ Rotates the camera about the axis corresponding to the "up" direction of the current view. Note that this will change the location of the focal point (although not the camera location). This angle is relative to the current direction - the angle is NOT an absolute angle in a fixed coordinate system. **See also** :mlab.pitch: relative rotation about the "right" direction :mlab.roll: absolute roll angle (i.e. "up" direction) :mlab.move: relative translation of the camera and focal point """ f = get_engine().current_scene if f is None: return scene = f.scene if scene is None: return ren = scene.renderer cam = scene.camera cam.yaw(degrees) ren.reset_camera_clipping_range() scene.render() def pitch(degrees): """ Rotates the camera about the axis corresponding to the "right" direction of the current view. Note that this will change the location of the focal point (although not the camera location). This angle is relative to the current direction - the angle is NOT an absolute angle in a fixed coordinate system. **See also** :mlab.yaw: relative rotation about the "up" direction :mlab.roll: absolute roll angle (i.e. "up" direction) :mlab.move: relative translation of the camera and focal point """ f = get_engine().current_scene if f is None: return scene = f.scene if scene is None: return ren = scene.renderer cam = scene.camera cam.pitch(degrees) ren.reset_camera_clipping_range() scene.render() mayavi-4.5.0/mayavi/tools/data_wizards/0000755000076500000240000000000012747722127020527 5ustar prabhustaff00000000000000mayavi-4.5.0/mayavi/tools/data_wizards/__init__.py0000644000076500000240000000000012747716314022627 0ustar prabhustaff00000000000000mayavi-4.5.0/mayavi/tools/data_wizards/csv_loader.py0000644000076500000240000001553512747716314023234 0ustar prabhustaff00000000000000# Author: Ilan Schnell # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. from traits.api import HasTraits, Str, Int, Array, List, \ Instance, on_trait_change, Property, Button from pyface.api import GUI from traitsui.api import View, Item, HGroup, Group, \ ListEditor, TabularEditor, spring, TextEditor, Controller, VSplit from traitsui.tabular_adapter import TabularAdapter from mayavi.tools.data_wizards.csv_sniff import Sniff, loadtxt, \ array2dict ############################################################################## # ListItem class ############################################################################## class ListItem(HasTraits): """ Class used to represent an item in a list with traits UI. """ column_number = Int name = Str my_name = Str parent = Instance(HasTraits) view = View( HGroup( Item('name', style='readonly', show_label=False, resizable=False), Item('my_name', style='simple', show_label=False, editor=TextEditor(auto_set=False, enter_set=True), springy=True), ) ) ############################################################################## # CSVLoader class ############################################################################## class CSVLoader(HasTraits): """ User interface to load CSV files. """ # The name of the file being loaded. filename = Str # The comment characters comments = Str(desc="The comment characters") # The character giving the delimiter between the columns. delimiter = Str( desc="The character giving the delimiter between the columns") # The number of rows to skip at the beginning of the file skiprows = Int( desc="The number of rows to skip at the beginning of the file") columns = List(ListItem) data = Array data_dict = Property(depends_on='data') def _get_data_dict(self): return array2dict(self.data) def guess_defaults(self): try: kwds = Sniff(self.filename).kwds() except: kwds = {'comments': '#', 'delimiter': ',', 'dtype': float, 'skiprows': 0} if kwds['delimiter']: self.delimiter = kwds['delimiter'] else: self.delimiter = ' ' self.comments = kwds['comments'] self.skiprows = kwds['skiprows'] self.names = list(kwds['dtype']['names']) self.formats = list(kwds['dtype']['formats']) self.columns = [ListItem(name='Column %i:' % (i + 1), parent=self, column_number=i, my_name=val) for i, val in enumerate(self.names)] self.load_data() def load_data(self): kwds = {} kwds['delimiter'] = self.delimiter kwds['comments'] = self.comments kwds['skiprows'] = self.skiprows kwds['dtype'] = dict(names=self.names, formats=self.formats) try: self.data = loadtxt(self.filename, **kwds) except: pass ############################################################################## # CSVLoaderController class ############################################################################## class CSVLoaderController(Controller): """ A controller for the CSVLoader. """ tabular_editor = Instance(HasTraits) def _tabular_editor_default(self): class ArrayAdapter(TabularAdapter): columns = [(n, i) for i, n in enumerate(self.model.names)] font = 'Courier 10' alignment = 'right' format = '%s' return TabularEditor(adapter=ArrayAdapter()) update_preview = Button('Update preview') @on_trait_change('update_preview') def load_data(self): self.model.load_data() @on_trait_change('model.columns.my_name,model.data') def update_table_editor(self, object, name, old, new): if isinstance(object, ListItem): self.tabular_editor.adapter.columns[object.column_number] = \ (new, object.column_number) GUI.set_trait_later(self.info.ui, 'updated', True) file_content = Str @on_trait_change('model.filename') def update_file(self): f = open(self.model.filename) self.file_content = f.read(300) def default_traits_view(self): view = View( VSplit( HGroup( Group( spring, Item('delimiter', label='Column delimiter character'), Item('comments', label='Comment character'), Item('skiprows', label='Number of lines to skip at the ' 'beginning of the file'), spring, Item('handler.update_preview', show_label=False), ), Group( Item('columns', show_label=False, style='readonly', editor=ListEditor(style='custom'), springy=True, ), label="Column names", show_border=True, ), ), Group( Group( Item('data', show_label=False, editor=self.tabular_editor, ), label="Preview table", ), Group( Item('handler.file_content', style='readonly', show_label=False, springy=True), label="%s" % self.model.filename, ), layout='tab'), ), buttons=['OK', 'Cancel', 'Help'], id='csv_load_editor', resizable=True, width=640, height=580, title='CSV import - [%s]' % self.model.filename ) return view if __name__ == '__main__': from pyface.api import GUI csv_loader = CSVLoader(filename='mydata.csv') csv_loader.guess_defaults() controller = CSVLoaderController(model=csv_loader) controller.edit_traits() GUI().start_event_loop() mayavi-4.5.0/mayavi/tools/data_wizards/csv_sniff.py0000644000076500000240000001416412747716314023070 0ustar prabhustaff00000000000000# Author: Ilan Schnell # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. # TODO: should derive from HasTraits import csv # FIXME: see loadtxt.py (should really be the loadtxt from numpy) from mayavi.tools.data_wizards.loadtxt import loadtxt class Sniff(object): """ Sniff a CSV file and determine some of it's properties. The properties determined here allow an CSV of unknown format to be read by numpy.loadtxt, i.e. the methods and attributes are suitable to determine required keyword arguments for numpy.loadtxt Example:: s = Sniff('mydata.csv') print repr(s.delimiter()) # ',' print s.skiprows() # 2 a = s.loadtxt() # a is now the array from numpy import loadtxt # make sure it's numpy 1.1.0 or # higher b = loadtxt('mydata.csv', **s.kwds()) """ def __init__(self, filename): self._filename = filename self._lines = self._read_few_lines() self._reallines = [line for line in self._lines if line.strip()] self._dialect = csv.Sniffer().sniff(self._reallines[-1]) self._get_comment() if self._dialect.delimiter.isalnum(): self._usePySplit = True self._numcols = 1 else: self._usePySplit = not self._dialect.delimiter.strip() self._numcols = len(self._split(self._reallines[-1])) self._datatypes = self._datatypes_of_line(self._reallines[-1]) def _get_comment(self): self._comment = '#' line0 = self._reallines[0] if line0.startswith('#') or line0.startswith('%'): self._comment = line0[0] self._reallines[0] = self._dialect.delimiter.join( line0.split()[1:]) for i in range(1, len(self._reallines)): self._reallines[i] = \ self._reallines[i].split(self._comment)[0] def _read_few_lines(self): res = [] f = open(self._filename, 'rb') for line in f: line = line.strip().decode('utf-8') res.append(line) if len(res) > 20: break f.close() return res def _split(self, line): if self._usePySplit: return line.split() else: return next(csv.reader([line], self._dialect)) def _names(self): if self._datatypes != self._numcols * (str,): for line in self._reallines: if len(self._split(line)) != self._numcols: continue if self._datatypes_of_line(line) != self._numcols * (str,): continue return tuple(t.strip('"\' \t') for t in self._split(line)) return tuple('Column %i' % (i + 1) for i in range(self._numcols)) def _formats(self): res = [] for c, t in enumerate(self._datatypes): if t == str: items = [len(self._split(l)[c]) for l in self._reallines[1:] if self._datatypes_of_line(l) == self._datatypes] items.append(1) res.append('S%i' % max(items)) elif t == float: res.append(t) else: raise TypeError("Hmm, did not expect: %r" % t) return tuple(res) def _datatypes_of_line(self, line): def isFloat(s): try: float(s) return True except ValueError: return False res = [] for s in self._split(line): if isFloat(s): res.append(float) else: res.append(str) return tuple(res) def _debug(self): print('===== Sniffed information for file %r:' % self._filename) print('delimiter = %r' % self.delimiter()) print('comments = %r' % self.comments()) print('dtype = %r' % self.dtype()) print('skiprows = %r' % self.skiprows()) #----------------------------------------------------------------------- # Public API: #----------------------------------------------------------------------- def comments(self): """ Return the character used for comments (usually '#'). """ return self._comment def delimiter(self): """ Return the delimiter string. When whitespace is used as the delimiter, None is returned. """ if self._usePySplit: return None else: return self._dialect.delimiter def skiprows(self): """ The number (int) of rows from the top to skip. """ for n, line in enumerate(self._lines): if self._datatypes == self._datatypes_of_line(line): return n return 0 def dtype(self): """ Return a dict suitable to be used as the dtype keyword argument of loadtxt. """ return {'names': self._names(), 'formats': self._formats()} def kwds(self): """ Return a dict of the keyword argument needed by numpy.loadtxt """ return {'comments': self.comments(), 'delimiter': self.delimiter(), 'skiprows': self.skiprows(), 'dtype': self.dtype()} def loadtxt(self): """ Return the array (by using numpy.loadtxt), using the sniffed information in the keyword arguments. """ return loadtxt(self._filename, **self.kwds()) def loadtxt_unknown(filename, verbose=0): """ Like numpy.loadtxt but more general, in the sense that it uses Sniff first to determine the necessary keyword arguments for loadtxt. """ s = Sniff(filename) if verbose: s._debug() return s.loadtxt() def array2dict(arr): """ Takes an array with special names dtypes and returns a dict where each name is a key and the corresponding data (as a 1d array) is the value. """ res = {} for k in arr.dtype.names: res[k] = arr[k] return res mayavi-4.5.0/mayavi/tools/data_wizards/csv_source_factory.py0000644000076500000240000000324512747716314025010 0ustar prabhustaff00000000000000""" Factory used by mayavi to import csv-like files into datasets. """ # Author: Gael Varoquaux # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. from traits.api import HasTraits, Callable from mayavi.tools.data_wizards.data_source_wizard import \ DataSourceWizardView from mayavi.tools.data_wizards.csv_loader import \ CSVLoader, CSVLoaderController class CallbackCSVLoader(CSVLoaderController): """ Simple handler for a TraitsUI view to call a given callback on exit. """ # A callable called when the TraitsUI view is closed. The instance # that the view was editing is passed to this callable. callback = Callable() def closed(self, info, is_ok): print("CallbackHander") if is_ok: self.callback(self.model) class CSVSourceFactory(HasTraits): """ Functor to load a CSV-like data from a file. """ def csv_loaded_callback(self, object): """ """ self.data_source_wizard = DataSourceWizardView( data_sources=self.csv_loader.data_dict) self.data_source_wizard.edit_traits() def __call__(self, fname): """ Pops up the dialogs required for the import of the CSV to happen. """ self.csv_loader = CSVLoader(filename=fname) self.csv_loader.guess_defaults() controller = CallbackCSVLoader(model=self.csv_loader, callback=self.csv_loaded_callback) controller.edit_traits() if __name__ == '__main__': from pyface.api import GUI source_factory = CSVSourceFactory() source_factory('mydata.csv') GUI().start_event_loop() mayavi-4.5.0/mayavi/tools/data_wizards/data_source_factory.py0000644000076500000240000002015212747716314025122 0ustar prabhustaff00000000000000 from numpy import c_, zeros, arange from traits.api import HasStrictTraits, \ true, false, Instance from mayavi.sources.vtk_data_source import VTKDataSource from mayavi.sources.array_source import ArraySource from mayavi.core.source import Source from mayavi.core.trait_defs import ArrayOrNone from tvtk.api import tvtk ############################################################################ # The DataSourceFactory class ############################################################################ class DataSourceFactory(HasStrictTraits): """ Factory for creating data sources. The information about the organisation of the data is given by setting the public traits. """ # Whether the position is implicitely inferred from the array indices position_implicit = false # Whether the data is on an orthogonal grid orthogonal_grid = false # If the data is unstructured unstructured = false # If the factory should attempt to connect the data points connected = true # The position of the data points position_x = ArrayOrNone position_y = ArrayOrNone position_z = ArrayOrNone # Connectivity array. If none, it is implicitely inferred from the array # indices connectivity_triangles = ArrayOrNone # Whether or not the data points should be connected. lines = false # The scalar data array scalar_data = ArrayOrNone # Whether there is vector data has_vector_data = false # The vector components vector_u = ArrayOrNone vector_v = ArrayOrNone vector_w = ArrayOrNone #---------------------------------------------------------------------- # Private traits #---------------------------------------------------------------------- _vtk_source = Instance(tvtk.DataSet) _mayavi_source = Instance(Source) #---------------------------------------------------------------------- # Private interface #---------------------------------------------------------------------- def _add_scalar_data(self): """ Adds the scalar data to the vtk source. """ if self.scalar_data is not None: scalars = self.scalar_data.ravel() self._vtk_source.point_data.scalars = scalars def _add_vector_data(self): """ Adds the vector data to the vtk source. """ if self.has_vector_data: vectors = c_[self.vector_u.ravel(), self.vector_v.ravel(), self.vector_w.ravel(), ] self._vtk_source.point_data.vectors = vectors def _mk_polydata(self): """ Creates a PolyData vtk data set using the factory's attributes. """ points = c_[self.position_x.ravel(), self.position_y.ravel(), self.position_z.ravel(), ] lines = None if self.lines: np = len(points) - 1 lines = zeros((np, 2), 'l') lines[:, 0] = arange(0, np - 0.5, 1, 'l') lines[:, 1] = arange(1, np + 0.5, 1, 'l') self._vtk_source = tvtk.PolyData(points=points, lines=lines) if (self.connectivity_triangles is not None and self.connected): assert self.connectivity_triangles.shape[1] == 3, \ "The connectivity list must be Nx3." self._vtk_source.polys = self.connectivity_triangles self._mayavi_source = VTKDataSource(data=self._vtk_source) def _mk_image_data(self): """ Creates an ImageData VTK data set and the associated ArraySource using the factory's attributes. """ self._mayavi_source = ArraySource(transpose_input_array=True, scalar_data=self.scalar_data, origin=[0., 0., 0], spacing=[1, 1, 1]) self._vtk_source = self._mayavi_source.image_data def _mk_rectilinear_grid(self): """ Creates a RectilinearGrid VTK data set using the factory's attributes. """ rg = tvtk.RectilinearGrid() x = self.position_x.squeeze() if x.ndim == 3: x = x[:, 0, 0] y = self.position_y.squeeze() if y.ndim == 3: y = y[0, :, 0] z = self.position_z.squeeze() if z.ndim == 3: z = z[0, 0, :] # FIXME: We should check array size here. rg.dimensions = (x.size, y.size, z.size) rg.x_coordinates = x rg.y_coordinates = y rg.z_coordinates = z self._vtk_source = rg self._mayavi_source = VTKDataSource(data=self._vtk_source) def _mk_structured_grid(self): """ Creates a StructuredGrid VTK data set using the factory's attributes. """ # FIXME: We need to figure out the dimensions of the data # here, if any. sg = tvtk.StructuredGrid(dimensions=self.scalar_data.shape) sg.points = c_[self.position_x.ravel(), self.position_y.ravel(), self.position_z.ravel(), ] self._vtk_source = sg self._mayavi_source = VTKDataSource(data=self._vtk_source) #---------------------------------------------------------------------- # Public interface #---------------------------------------------------------------------- def build_data_source(self, **traits): """ Uses all the information given by the user on his data structure to figure out the right data structure. """ self.set(**traits) if not self.lines: if self.position_implicit: self._mk_image_data() elif self.orthogonal_grid: self._mk_rectilinear_grid() elif self.connectivity_triangles is None: if self.unstructured: self._mk_polydata() else: self._mk_structured_grid() else: self._mk_polydata() else: self._mk_polydata() self._add_scalar_data() self._add_vector_data() return self._mayavi_source def view(src): """ Open up a mayavi scene and display the dataset in it. """ from mayavi import mlab mayavi = mlab.get_engine() fig = mlab.figure(bgcolor=(1, 1, 1), fgcolor=(0, 0, 0),) mayavi.add_source(src) mlab.pipeline.surface(src, opacity=0.1) mlab.pipeline.surface(mlab.pipeline.extract_edges(src), color=(0, 0, 0), ) def test_image_data(): from numpy import random scalars = random.random((3, 3, 3)) factory = DataSourceFactory() image_data = factory.build_data_source(scalar_data=scalars, position_implicit=True,) view(image_data) def test_rectilinear_grid(): from numpy import random, mgrid factory = DataSourceFactory() scalars = random.random((3, 3, 3)) x = arange(3) ** 2 y = 0.5 * arange(3) ** 2 z = arange(3) ** 2 rectilinear_grid = factory.build_data_source(scalar_data=scalars, position_implicit=False, orthogonal_grid=True, position_x=x, position_y=y, position_z=z) view(rectilinear_grid) def test_structured_grid(): from numpy import random, mgrid factory = DataSourceFactory() scalars = random.random((3, 3, 3)) x, y, z = mgrid[0:3, 0:3, 0:3] x = x + 0.5 * random.random(x.shape) y = y + 0.5 * random.random(y.shape) z = z + 0.5 * random.random(z.shape) structured_grid = factory.build_data_source(scalar_data=scalars, position_x=x, position_y=y, position_z=z) view(structured_grid) if __name__ == '__main__': from pyface.api import GUI test_image_data() test_rectilinear_grid() test_structured_grid() GUI().start_event_loop() mayavi-4.5.0/mayavi/tools/data_wizards/data_source_wizard.py0000644000076500000240000006674012747716314024770 0ustar prabhustaff00000000000000 from numpy import ones, resize, linspace, atleast_3d from traits.api import Property, Str, Button, Trait, \ Any, Instance, HasStrictTraits, false, Dict, HasTraits, \ CArray, Bool from traitsui.api import EnumEditor, View, Item, HGroup, \ VGroup, spring, Group, TextEditor, HTMLEditor, InstanceEditor, \ TabularEditor, TitleEditor, Label, ArrayEditor, ImageEditor from traitsui.tabular_adapter import TabularAdapter from traitsui.image.image import ImageLibrary from pyface.api import ImageResource from .data_source_factory import DataSourceFactory from .preview_window import PreviewWindow from mayavi.modules.api import Surface, Glyph from mayavi.filters.api import ExtractEdges ############################################################################ # The DataSourceWizard class ############################################################################ class DataSourceWizard(HasTraits): data_sources = Dict _data_sources_names = Property(depends_on='data_sources') def _get__data_sources_names(self): names = [] for name in self.data_sources: try: self.data_sources[name] + 1 names.append(name) except TypeError: pass names.sort() return names # Dictionnary mapping the views data_type = Trait('point', {'A surface': 'surface', 'A set of points, that can be connected by lines': 'point', 'A set of vectors': 'vector', 'Volumetric data': 'volumetric', }) position_type = Trait('image data', {'Specified explicitly': 'explicit', 'Implicitely positioned on a regular grid': 'image data', 'On an orthogonal grid with varying spacing': 'orthogonal grid', }) # The array that is used for finding out the shape of the grid, # when creating an ImageData grid_shape_source = Property(depends_on='grid_shape_source_') def _get_grid_shape_source(self): if self.grid_shape_source_ == '': # catter for improperly initialized view keys = self._data_sources_names if not self.grid_shape.any(): self.grid_shape = \ self.data_sources[keys[0]].shape return keys[0] elif self.grid_shape_source_[:16] == 'Shape of array: ': return self.grid_shape_source_[17:-1] else: return "" # Shadow traits for grid_shape_source grid_shape_source_ = Str def _grid_shape_source_changed(self): if not self.grid_shape_source == '': array_shape = \ atleast_3d(self.data_sources[self.grid_shape_source]).shape grid_shape = ones((3, )) grid_shape[:len(array_shape)] = array_shape self.grid_shape = grid_shape _grid_shape_source_labels = Property(depends_on='_data_sources_names') def _get__grid_shape_source_labels(self): values = ['Shape of array: "%s"' % name for name in self._data_sources_names] values.sort values.append('Specified explicitly') return values # The shape of the grid array. Used when position is implicit grid_shape = CArray(shape=(3,), dtype='i') # Whether or not the data points should be connected. lines = false # The scalar data selection scalar_data = Str('', help="Select the array that gives the value of the " "scalars plotted.") position_x = Str(help="Select the array that gives the x " "position of the data points") position_y = Str(help="Select the array that gives the y " "position of the data points") position_z = Str(help="Select the array that gives the z " "position of the data points") connectivity_triangles = Str has_vector_data = false(help="""Do you want to plot vector components?""") # A boolean to ask the user if he wants to load scalar data has_scalar_data = false vector_u = Str vector_v = Str vector_w = Str #---------------------------------------------------------------------- # Public interface #---------------------------------------------------------------------- def init_arrays(self): # Force all the array names to be properly initialized array_names = set(self.data_sources.keys()) if len(array_names) == 0: # We should probably bail out here. return False for attr in ('position_x', 'position_y', 'position_z', 'scalar_data', 'vector_u', 'vector_v', 'vector_w', 'connectivity_triangles', ): if len(array_names) > 0: array_name = array_names.pop() setattr(self, attr, array_name) def guess_arrays(self): """ Do some guess work on the arrays to find sensible default. """ array_names = set(self._data_sources_names) found_some = False if set(('x', 'y', 'z')).issubset(array_names): self.position_x = 'x' self.position_y = 'y' self.position_z = 'z' array_names = array_names.difference(('x', 'y', 'z')) found_some = True elif set(('X', 'Y', 'Z')).issubset(array_names): self.position_x = 'X' self.position_y = 'Y' self.position_z = 'Z' array_names = array_names.difference(('X', 'Y', 'Z')) found_some = True if set(('u', 'v', 'w')).issubset(array_names): self.vector_u = 'u' self.vector_v = 'v' self.vector_w = 'w' array_names = array_names.difference(('u', 'v', 'w')) found_some = True elif set(('U', 'V', 'W')).issubset(array_names): self.vector_u = 'U' self.vector_v = 'V' self.vector_w = 'W' array_names = array_names.difference(('U', 'V', 'W')) found_some = True if found_some: # Need to re-attribute the guessed names. for attr in ('scalar_data', 'vector_u', 'vector_v', 'vector_w', 'connectivity_triangles'): if len(array_names) > 0: setattr(self, attr, array_names.pop()) else: break def build_data_source(self): """ This is where we apply the selections made by the user in in the wizard to build the data source. """ factory = DataSourceFactory() # Keep a reference to the factory to be able to replay it, say # on other data. self._factory = factory if self.data_type_ == 'point': # The user wants to explicitly position vector, # thus only sensible data structures for points is with # explicit positioning. self.position_type_ == 'explicit' # In addition, this view does not allow for # connectivity. factory.unstructured = True factory.connected = False else: factory.connected = True if (self.position_type_ == "image data" and not self.data_type_ == "point"): if not self.has_scalar_data and not self.vector_u == '': # With image data we need a scalar array always: factory.scalar_data = ones(self.grid_shape) factory.position_implicit = True else: factory.position_x = self.get_sdata(self.position_x) factory.position_y = self.get_sdata(self.position_y) factory.position_z = self.get_sdata(self.position_z) if self.position_type_ == "orthogonal grid": factory.orthogonal_grid = True if self.position_type_ == "explicit" and self.data_type_ == "surface": factory.connectivity_triangles = self.get_data( self.connectivity_triangles) if self.lines and self.data_type_ == "point": factory.lines = True if self.has_vector_data or self.data_type_ == 'vector': # In the vector view, the user is not explicitly asked to # Enable vectors. factory.has_vector_data = True factory.vector_u = self.get_sdata(self.vector_u) factory.vector_v = self.get_sdata(self.vector_v) factory.vector_w = self.get_sdata(self.vector_w) if self.has_scalar_data or self.data_type_ == 'volumetric': # In the volumetric view, the user is not explicitly asked to # Enable scalars. factory.scalar_data = self.get_sdata(self.scalar_data) if self.connectivity_triangles == '': factory.connectivity_triangles = None self.data_source = factory.build_data_source() if self.has_scalar_data: if hasattr(self.data_source, 'scalar_name'): self.data_source.scalar_name = self.scalar_data elif hasattr(self.data_source, 'point_scalar_name'): self.data_source.point_scalar_name = self.scalars #---------------------------------------------------------------------- # Private interface #---------------------------------------------------------------------- def get_data(self, name): return self.data_sources[name] def get_sdata(self, name): ary = self.data_sources[name] if not self.data_type_ == 'point': ary = resize(ary, self.grid_shape) return ary def active_arrays(self): """ Return the list of the active array-selection drop-downs. """ arrays = [] if self.data_type_ == 'point' or self.position_type_ == 'explicit': arrays.extend( ['position_x', 'position_y', 'position_z', ]) if self.data_type_ == 'vector' or self.has_vector_data: arrays.extend(['vector_u', 'vector_v', 'vector_w']) if self.has_scalar_data or self.data_type_ == 'volumetric': arrays.extend(['scalar_data']) return arrays def check_arrays(self): """ Checks that all the array have the right size. """ arrays_to_check = self.active_arrays() if len(arrays_to_check) == 0: return True size = self.get_data(getattr(self, arrays_to_check.pop())).size for attr in arrays_to_check: if not self.get_data(getattr(self, attr)).size == size: return False if (self.data_type_ == 'surface' and self.position_type_ == "explicit"): if not self.connectivity_triangles.size / 3 == size: return False return True ########################################################################### # class ArrayColumnWrapper ########################################################################### class ArrayColumnWrapper(HasStrictTraits): name = Str shape = Str ############################################################################ # class ArrayColumnAdapter ############################################################################ class ArrayColumnAdapter(TabularAdapter): columns = [('name', 'name'), ('shape', 'shape'), ] width = 100 ############################################################################ # The DataSourceWizardView class ############################################################################ class DataSourceWizardView(DataSourceWizard): #---------------------------------------------------------------------- # Private traits #---------------------------------------------------------------------- _top_label = Str('Describe your data') _info_text = Str('Array size do not match') _array_label = Str('Available arrays') _data_type_text = Str("What does your data represents?") _lines_text = Str("Connect the points with lines") _scalar_data_text = Str("Array giving the value of the scalars") _optional_scalar_data_text = Str("Associate scalars with the data points") _connectivity_text = Str("Array giving the triangles") _vector_data_text = Str("Associate vector components") _position_text = Property(depends_on="position_type_") _position_text_dict = {'explicit': 'Coordinnates of the data points:', 'orthogonal grid': 'Position of the layers along each axis:', } def _get__position_text(self): return self._position_text_dict.get(self.position_type_, "") _shown_help_text = Str _data_sources_wrappers = Property(depends_on='data_sources') def _get__data_sources_wrappers(self): return [ ArrayColumnWrapper(name=name, shape=repr(self.data_sources[name].shape)) for name in self._data_sources_names ] # A traits pointing to the object, to play well with traitsUI _self = Instance(DataSourceWizard) _suitable_traits_view = Property(depends_on="data_type_") def _get__suitable_traits_view(self): return "_%s_data_view" % self.data_type_ ui = Any(False) _preview_button = Button(label='Preview structure') def __preview_button_fired(self): if self.ui: self.build_data_source() self.preview() _ok_button = Button(label='OK') def __ok_button_fired(self): if self.ui: self.ui.dispose() self.build_data_source() _cancel_button = Button(label='Cancel') def __cancel_button_fired(self): if self.ui: self.ui.dispose() _is_ok = Bool _is_not_ok = Bool def _anytrait_changed(self): """ Validates if the OK button is enabled. """ if self.ui: self._is_ok = self.check_arrays() self._is_not_ok = not self._is_ok _preview_window = Instance(PreviewWindow, ()) _info_image = Instance(ImageResource, ImageLibrary.image_resource('@std:alert16',)) #---------------------------------------------------------------------- # TraitsUI views #---------------------------------------------------------------------- _coordinates_group = \ HGroup( Item('position_x', label='x', editor=EnumEditor(name='_data_sources_names', invalid='_is_not_ok')), Item('position_y', label='y', editor=EnumEditor(name='_data_sources_names', invalid='_is_not_ok')), Item('position_z', label='z', editor=EnumEditor(name='_data_sources_names', invalid='_is_not_ok')), ) _position_group = \ Group( Item('position_type'), Group( Item('_position_text', style='readonly', resizable=False, show_label=False), _coordinates_group, visible_when='not position_type_=="image data"', ), Group( Item('grid_shape_source_', label='Grid shape', editor=EnumEditor( name='_grid_shape_source_labels', invalid='_is_not_ok')), HGroup( spring, Item('grid_shape', style='custom', editor=ArrayEditor(width=-60), show_label=False), enabled_when='grid_shape_source==""', ), visible_when='position_type_=="image data"', ), label='Position of the data points', show_border=True, show_labels=False, ), _connectivity_group = \ Group( HGroup( Item('_connectivity_text', style='readonly', resizable=False), spring, Item('connectivity_triangles', editor=EnumEditor(name='_data_sources_names'), show_label=False, ), show_labels=False, ), label='Connectivity information', show_border=True, show_labels=False, enabled_when='position_type_=="explicit"', ), _scalar_data_group = \ Group( Item('_scalar_data_text', style='readonly', resizable=False, show_label=False), HGroup( spring, Item('scalar_data', editor=EnumEditor(name='_data_sources_names', invalid='_is_not_ok')), show_labels=False, ), label='Scalar value', show_border=True, show_labels=False, ) _optional_scalar_data_group = \ Group( HGroup( 'has_scalar_data', Item('_optional_scalar_data_text', resizable=False, style='readonly'), show_labels=False, ), Item('_scalar_data_text', style='readonly', resizable=False, enabled_when='has_scalar_data', show_label=False), HGroup( spring, Item('scalar_data', editor=EnumEditor(name='_data_sources_names', invalid='_is_not_ok'), enabled_when='has_scalar_data'), show_labels=False, ), label='Scalar data', show_border=True, show_labels=False, ), _vector_data_group = \ VGroup( HGroup( Item('vector_u', label='u', editor=EnumEditor(name='_data_sources_names', invalid='_is_not_ok')), Item('vector_v', label='v', editor=EnumEditor(name='_data_sources_names', invalid='_is_not_ok')), Item('vector_w', label='w', editor=EnumEditor(name='_data_sources_names', invalid='_is_not_ok')), ), label='Vector data', show_border=True, ), _optional_vector_data_group = \ VGroup( HGroup( Item('has_vector_data', show_label=False), Item('_vector_data_text', style='readonly', resizable=False, show_label=False), ), HGroup( Item('vector_u', label='u', editor=EnumEditor(name='_data_sources_names', invalid='_is_not_ok')), Item('vector_v', label='v', editor=EnumEditor(name='_data_sources_names', invalid='_is_not_ok')), Item('vector_w', label='w', editor=EnumEditor(name='_data_sources_names', invalid='_is_not_ok')), enabled_when='has_vector_data', ), label='Vector data', show_border=True, ), _array_view = \ View( Item('_array_label', editor=TitleEditor(), show_label=False), Group( Item('_data_sources_wrappers', editor=TabularEditor( adapter=ArrayColumnAdapter(), ), ), show_border=True, show_labels=False )) _questions_view = View( Item('_top_label', editor=TitleEditor(), show_label=False), HGroup( Item('_data_type_text', style='readonly', resizable=False), spring, 'data_type', spring, show_border=True, show_labels=False, ), HGroup( Item('_self', style='custom', editor=InstanceEditor( view_name='_suitable_traits_view'), ), Group( # FIXME: Giving up on context sensitive help # because of lack of time. #Group( # Item('_shown_help_text', editor=HTMLEditor(), # width=300, # label='Help', # ), # show_labels=False, # label='Help', #), #Group( Item('_preview_button', enabled_when='_is_ok'), Item('_preview_window', style='custom', label='Preview structure'), show_labels=False, #label='Preview structure', #), #layout='tabbed', #dock='tab', ), show_labels=False, show_border=True, ), ) _point_data_view = \ View(Group( Group(_coordinates_group, label='Position of the data points', show_border=True, ), HGroup( 'lines', Item('_lines_text', style='readonly', resizable=False), label='Lines', show_labels=False, show_border=True, ), _optional_scalar_data_group, _optional_vector_data_group, # XXX: hack to have more vertical space Label('\n'), Label('\n'), Label('\n'), )) _surface_data_view = \ View(Group( _position_group, _connectivity_group, _optional_scalar_data_group, _optional_vector_data_group, )) _vector_data_view = \ View(Group( _vector_data_group, _position_group, _optional_scalar_data_group, )) _volumetric_data_view = \ View(Group( _scalar_data_group, _position_group, _optional_vector_data_group, )) _wizard_view = View( Group( HGroup( Item('_self', style='custom', show_label=False, editor=InstanceEditor(view='_array_view'), width=0.17, ), '_', Item('_self', style='custom', show_label=False, editor=InstanceEditor(view='_questions_view'), ), ), HGroup( Item('_info_image', editor=ImageEditor(), visible_when="_is_not_ok"), Item('_info_text', style='readonly', resizable=False, visible_when="_is_not_ok"), spring, '_cancel_button', Item('_ok_button', enabled_when='_is_ok'), show_labels=False, ), ), title='Import arrays', resizable=True, ) #---------------------------------------------------------------------- # Public interface #---------------------------------------------------------------------- def __init__(self, **traits): DataSourceFactory.__init__(self, **traits) self._self = self def view_wizard(self): """ Pops up the view of the wizard, and keeps the reference it to be able to close it. """ # FIXME: Workaround for traits bug in enabled_when self.position_type_ self.data_type_ self._suitable_traits_view self.grid_shape_source self._is_ok self.ui = self.edit_traits(view='_wizard_view') def preview(self): """ Display a preview of the data structure in the preview window. """ self._preview_window.clear() self._preview_window.add_source(self.data_source) data = lambda name: self.data_sources[name] g = Glyph() g.glyph.glyph_source.glyph_source = \ g.glyph.glyph_source.glyph_list[0] g.glyph.scale_mode = 'data_scaling_off' if not (self.has_vector_data or self.data_type_ == 'vector'): g.glyph.glyph_source.glyph_source.glyph_type = 'cross' g.actor.property.representation = 'points' g.actor.property.point_size = 3. self._preview_window.add_module(g) if not self.data_type_ in ('point', 'vector') or self.lines: s = Surface() s.actor.property.opacity = 0.3 self._preview_window.add_module(s) if not self.data_type_ == 'point': self._preview_window.add_filter(ExtractEdges()) s = Surface() s.actor.property.opacity = 0.2 self._preview_window.add_module(s) if __name__ == '__main__': from numpy import mgrid x, y, z = mgrid[-5:5, -5:5, -5:5] r = x ** 2 + y ** 2 + z ** 2 X = linspace(0, 8) data_sources = { 'x': X, 'y': y, 'z': z, 'r': r } wizard = DataSourceWizardView(data_sources=data_sources) wizard.init_arrays() wizard.guess_arrays() wizard.view_wizard() mayavi-4.5.0/mayavi/tools/data_wizards/loadtxt.py0000644000076500000240000001015512747716314022563 0ustar prabhustaff00000000000000# FIXME: # This file contains the loadtxt function from numpy 1.1.0 because there # is a bug the loadtxt function of numpy 1.0.4. # In the future this file can be removed, once Mayavi depends on # numpy 1.1.0 (or higher). import numpy as np def _string_like(obj): try: obj + '' except (TypeError, ValueError): return 0 return 1 def _getconv(dtype): typ = dtype.type if issubclass(typ, np.bool_): return lambda x: bool(int(x)) if issubclass(typ, np.integer): return lambda x: int(float(x)) elif issubclass(typ, np.floating): return float elif issubclass(typ, np.complex): return complex else: return str def loadtxt(fname, dtype=float, comments='#', delimiter=None, converters=None, skiprows=0, usecols=None, unpack=False): """ Load ASCII data from fname into an array and return the array. The data must be regular, same number of values in every row Parameters ---------- fname : filename or a file handle. Support for gzipped files is automatic, if the filename ends in .gz dtype : data-type Data type of the resulting array. If this is a record data-type, the resulting array will be 1-d and each row will be interpreted as an element of the array. The number of columns used must match the number of fields in the data-type in this case. comments : str The character used to indicate the start of a comment in the file. delimiter : str A string-like character used to separate values in the file. If delimiter is unspecified or none, any whitespace string is a separator. converters : {} A dictionary mapping column number to a function that will convert that column to a float. Eg, if column 0 is a date string: converters={0:datestr2num}. Converters can also be used to provide a default value for missing data: converters={3:lambda s: float(s or 0)}. skiprows : int The number of rows from the top to skip. usecols : sequence A sequence of integer column indexes to extract where 0 is the first column, eg. usecols=(1,4,5) will extract the 2nd, 5th and 6th columns. unpack : bool If True, will transpose the matrix allowing you to unpack into named arguments on the left hand side. Examples -------- >>> X = loadtxt('test.dat') # data in two columns >>> x,y,z = load('somefile.dat', usecols=(3,5,7), unpack=True) >>> r = np.loadtxt('record.dat', dtype={'names':('gender','age','weight'), 'formats': ('S1','i4', 'f4')}) SeeAlso: scipy.io.loadmat to read and write matfiles. """ if _string_like(fname): if fname.endswith('.gz'): import gzip fh = gzip.open(fname) else: fh = open(fname, 'r') elif hasattr(fname, 'seek'): fh = fname else: raise ValueError('fname must be a string or file handle') X = [] dtype = np.dtype(dtype) defconv = _getconv(dtype) converterseq = None if converters is None: converters = {} if dtype.names is not None: converterseq = [_getconv(dtype.fields[name][0]) \ for name in dtype.names] for i, line in enumerate(fh): if i < skiprows: continue comment_start = line.find(comments) if comment_start != -1: line = line[:comment_start].strip() else: line = line.strip() if not len(line): continue vals = line.split(delimiter) if converterseq is None: converterseq = [converters.get(j, defconv) \ for j in range(len(vals))] if usecols is not None: row = [converterseq[j](vals[j]) for j in usecols] else: row = [converterseq[j](val) for j, val in enumerate(vals)] if dtype.names is not None: row = tuple(row) X.append(row) X = np.array(X, dtype) X = np.squeeze(X) if unpack: return X.T else: return X mayavi-4.5.0/mayavi/tools/data_wizards/mydata.csv0000644000076500000240000000014612747716314022525 0ustar prabhustaff00000000000000% This is my sample data: % "Sample Name":"Radius":"Speed" Foo:12.5:85.4 Bar:14.1:87.6 Baz:14.3:89.0 mayavi-4.5.0/mayavi/tools/data_wizards/preview_window.py0000644000076500000240000000406512747716314024157 0ustar prabhustaff00000000000000""" HasTraits class providing window with a mayavi engine, to preview pipeline elements. """ from traits.api import HasTraits, Instance from traitsui.api import View, Item from tvtk.pyface.scene_editor import SceneEditor from tvtk.pyface.scene_model import SceneModel from tvtk.pyface.scene import Scene from mayavi.core.engine import Engine ############################################################################## # PreviewWindow class ############################################################################## class PreviewWindow(HasTraits): """ A window with a mayavi engine, to preview pipeline elements. """ # The engine that manages the preview view _engine = Instance(Engine) _scene = Instance(SceneModel, ()) view = View(Item('_scene', editor=SceneEditor(scene_class=Scene), show_label=False), width=500, height=500) #----------------------------------------------------------------------- # Public API #----------------------------------------------------------------------- def add_source(self, src): self._engine.add_source(src) def add_module(self, module): self._engine.add_module(module) def add_filter(self, filter): self._engine.add_module(filter) def clear(self): self._engine.current_scene.scene.disable_render = True self._engine.current_scene.children[:] = [] self._engine.current_scene.scene.disable_render = False #----------------------------------------------------------------------- # Private API #----------------------------------------------------------------------- def __engine_default(self): e = Engine() e.start() e.new_scene(self._scene) return e if __name__ == '__main__': from pyface.api import GUI from mayavi.sources.api import ParametricSurface from mayavi.modules.api import Outline, Surface pw = PreviewWindow() pw.add_source(ParametricSurface()) pw.add_module(Outline()) pw.add_module(Surface()) pw.edit_traits() mayavi-4.5.0/mayavi/tools/decorations.py0000644000076500000240000004613412747716314020750 0ustar prabhustaff00000000000000""" Functions for adding decorations (axes, colorbar, outlines..) to the pipeline in a procedural way. """ # Author: Gael Varoquaux # Copyright (c) 2007-2015 Enthought, Inc. # License: BSD Style. import numbers import numpy as np # Enthought library imports. from traits.api import String, CFloat, Instance, HasTraits, \ Trait, CArray, true, Any, Range, Either from . import tools from .figure import draw, gcf # Mayavi imports import mayavi.modules.api as modules from .pipe_base import make_function from .modules import ModuleFactory from .engine_manager import get_engine, engine_manager ############################################################################# # Colorbar related functions def _orient_colorbar(lut_mgr, orientation): """Orients the given LUTManager (make it horizontal or vertical). """ rep = lut_mgr.scalar_bar_representation colorbar = lut_mgr.scalar_bar if orientation == "vertical": if rep is None: # VTK < 5.2 colorbar.orientation = "vertical" else: rep.orientation = 1 rep.position = (0.01, 0.15) rep.position2 = (0.1, 0.8) colorbar.width = 0.1 colorbar.height = 0.8 colorbar.position = (0.01, 0.15) elif orientation == "horizontal": if rep is None: colorbar.orientation = "horizontal" else: rep.orientation = 0 rep.position = (0.1, 0.01) rep.position2 = (0.8, 0.17) colorbar.width = 0.8 colorbar.height = 0.17 colorbar.position = (0.1, 0.01) else: raise ValueError("Unknown orientation: %s" % orientation) draw() def _lut_manager_properties(lut_manager, **props): """ Internal function used to apply properties to a colorbar. """ need_redraw = False orientation = props.get('orientation', None) if orientation is not None: _orient_colorbar(lut_manager, orientation) colorbar = lut_manager.scalar_bar title = props.get('title', None) if title is not None: colorbar.title = title need_redraw = True label_fmt = props.get('label_fmt', None) if label_fmt is not None: colorbar.label_format = label_fmt need_redraw = True nb_labels = props.get('nb_labels', None) if nb_labels is not None: colorbar.number_of_labels = nb_labels need_redraw = True nb_colors = props.get('nb_colors', None) if nb_colors is not None: colorbar.maximum_number_of_colors = nb_colors need_redraw = True if need_redraw: draw() def scalarbar(object=None, title=None, orientation=None, nb_labels=None, nb_colors=None, label_fmt=None): """Adds a colorbar for the scalar color mapping of the given object. If no object is specified, the first object with scalar data in the scene is used. **Keyword arguments**: :object: Optional object to get the scalar color map from :title: The title string :orientation: Can be 'horizontal' or 'vertical' :nb_labels: The number of labels to display on the colorbar. :label_fmt: The string formater for the labels. This needs to be a formater for float number, eg '%.1f'. :nb_colors: The maximum number of colors displayed on the colorbar. """ module_manager = tools._find_module_manager(object=object, data_type="scalar") if module_manager is None: return if not module_manager.scalar_lut_manager.show_scalar_bar: if title is None: title = '' if orientation is None: orientation = 'horizontal' lut_mgr = module_manager.scalar_lut_manager module_manager.scalar_lut_manager.show_scalar_bar = True _lut_manager_properties(lut_mgr, title=title, orientation=orientation, nb_labels=nb_labels, nb_colors=nb_colors, label_fmt=label_fmt) return lut_mgr def vectorbar(object=None, title=None, orientation=None, nb_labels=None, nb_colors=None, label_fmt=None): """Adds a colorbar for the vector color mapping of the given object. If no object is specified, the first object with vector data in the scene is used. **Keyword arguments** :object: Optional object to get the vector color map from :title: The title string :orientation: Can be 'horizontal' or 'vertical' :nb_labels: The number of labels to display on the colorbar. :label_fmt: The string formater for the labels. This needs to be a formater for float number, eg '%.1f'. :nb_colors: The maximum number of colors displayed on the colorbar. """ module_manager = tools._find_module_manager(object=object, data_type="vector") if module_manager is None: return if not module_manager.vector_lut_manager.show_scalar_bar: if title is None: title = '' orientation = 'horizontal' lut_mgr = module_manager.vector_lut_manager lut_mgr.show_scalar_bar = True _lut_manager_properties(lut_mgr, title=title, orientation=orientation, nb_labels=nb_labels, nb_colors=nb_colors, label_fmt=label_fmt) return lut_mgr def colorbar(object=None, title=None, orientation=None, nb_labels=None, nb_colors=None, label_fmt=None): """Adds a colorbar for the color mapping of the given object. If the object has scalar data, the scalar color mapping is represented. Elsewhere the vector color mapping is represented, if available. If no object is specified, the first object with a color map in the scene is used. **Keyword arguments**: :object: Optional object to get the color map from :title: The title string :orientation: Can be 'horizontal' or 'vertical' :nb_labels: The number of labels to display on the colorbar. :label_fmt: The string formater for the labels. This needs to be a formater for float number, eg '%.1f'. :nb_colors: The maximum number of colors displayed on the colorbar. """ colorbar = scalarbar(object=object, title=title, orientation=orientation, nb_labels=nb_labels, nb_colors=nb_colors, label_fmt=label_fmt) if colorbar is None: colorbar = vectorbar(object=object, title=title, orientation=orientation, nb_labels=nb_labels, nb_colors=nb_colors, label_fmt=label_fmt) return colorbar ############################################################################# class SingletonModuleFactory(ModuleFactory): """ Base classe for factories that can find an existing object matching certain criteria instead of building a new one""" # The parent object on which this module is going to be added. _parent = Any def __init__(self, *args, **kwargs): """ Try to find an module actor with the same name, on the given parent (if any) and use it rather than building a new module.""" # Call the HasTraits constructor, but not the PipeBase one. HasTraits.__init__(self) self._scene = gcf() if not 'figure' in kwargs: self._engine = get_engine() else: figure = kwargs['figure'] self._engine = engine_manager.find_figure_engine(figure) self._engine.current_scene = figure kwargs.pop('figure') if self._scene.scene is not None: self._scene.scene.disable_render = True # Process the arguments if len(args) == 1: (parent, ) = args elif len(args) == 0: parent = self._engine.current_object else: raise ValueError("Wrong number of arguments") # Try to find an existing module, if not add one to the pipeline if parent is None: target = self._scene else: target = parent klass = self._target.__class__ for obj in tools._traverse(target): if (isinstance(obj, klass) and obj.name == self.name): self._target = obj break else: # Keep a reference to the parent self._parent = parent self._engine.add_module(self._target, obj=parent) # Now calling the traits setter, so that traits handlers are # called self.set(**kwargs) if self._scene.scene is not None: self._scene.scene.disable_render = False ############################################################################# class AxesLikeModuleFactory(SingletonModuleFactory): """ Base class for axes and outline""" extent = CArray(shape=(6,), help="""[xmin, xmax, ymin, ymax, zmin, zmax] Default is the object's extents.""", ) def _extent_changed(self): """ There is no universal way of setting extents for decoration objects. This should be implemented in subclasses """ pass # Override the color and opacity handlers: axes and outlines do not # behave like other modules def _color_changed(self): if self.color: try: self._target.property.color = self.color except AttributeError: try: self._target.actor.property.color = self.color except AttributeError: pass def _opacity_changed(self): try: self._target.property.opacity = self.opacity except AttributeError: try: self._target.actor.property.opacity = self.opacity except AttributeError: pass def __init__(self, *args, **kwargs): """ Overide the call method to be able to catch the extents of the object, if any. """ SingletonModuleFactory.__init__(self, *args, **kwargs) if not 'extent' in kwargs: try: # XXX: Do not use tools.set_extent, as it does not work # on axes. self.extent = self._parent.actor.actor.bounds except AttributeError: """ Either this is not a module, or it has no actors""" ############################################################################# class Outline(AxesLikeModuleFactory): """ Creates an outline for the current (or given) object.""" _target = Instance(modules.Outline, ()) def _extent_changed(self): self._target.manual_bounds = True self._target.bounds = self.extent outline = make_function(Outline) ############################################################################# class Axes(AxesLikeModuleFactory): """ Creates axes for the current (or given) object.""" xlabel = String(None, adapts='axes.x_label', help='the label of the x axis') ylabel = String(None, adapts='axes.y_label', help='the label of the y axis') zlabel = String(None, adapts='axes.z_label', help='the label of the z axis') nb_labels = Range(0, 50, 2, adapts='axes.number_of_labels', desc='The number of labels along each direction') ranges = Trait(None, None, CArray(shape=(6,)), help="""[xmin, xmax, ymin, ymax, zmin, zmax] Ranges of the labels displayed on the axes. Default is the object's extents.""", ) x_axis_visibility = true(adapts='axes.x_axis_visibility', help="Whether or not the x axis is visible (boolean)") y_axis_visibility = true(adapts='axes.y_axis_visibility', help="Whether or not the y axis is visible (boolean)") z_axis_visibility = true(adapts='axes.z_axis_visibility', help="Whether or not the z axis is visible (boolean)") _target = Instance(modules.Axes, ()) def _extent_changed(self): """ Code to modify the extents for """ axes = self._target axes.axes.use_data_bounds = False axes.axes.bounds = self.extent if self.ranges is None: axes.axes.ranges = \ axes.module_manager.source.outputs[0].bounds def _ranges_changed(self): if self.ranges is not None: self._target.axes.ranges = self.ranges self._target.axes.use_ranges = True axes = make_function(Axes) def xlabel(text, object=None): """ Creates a set of axes if there isn't already one, and sets the x label **Keyword arguments**: :object: The object to apply the module to, if not the whole scene is searched for a suitable object. """ return axes(object, xlabel=text) def ylabel(text, object=None): """ Creates a set of axes if there isn't already one, and sets the y label **Keyword arguments**: :object: The object to apply the module to, if not the whole scene is searched for a suitable object. """ return axes(object, ylabel=text) def zlabel(text, object=None): """ Creates a set of axes if there isn't already one, and sets the z label **Keyword arguments** :object: The object to apply the module to, if not the whole scene is searched for a suitable object. """ return axes(object, zlabel=text) ############################################################################## class OrientationAxesFactory(SingletonModuleFactory): """Applies the OrientationAxes mayavi module to the given VTK data object. """ xlabel = String(None, adapts='axes.x_axis_label_text', help='the label of the x axis') ylabel = String(None, adapts='axes.y_axis_label_text', help='the label of the y axis') zlabel = String(None, adapts='axes.z_axis_label_text', help='the label of the z axis') _target = Instance(modules.OrientationAxes, ()) orientation_axes = make_function(OrientationAxesFactory) ############################################################################### class Text(ModuleFactory): """ Adds a text on the figure. **Function signature**:: text(x, y, text, ...) x, and y are the position of the origin of the text. If no z keyword argument is given, x and y are the 2D projection of the figure, they belong to [0, 1]. If a z keyword argument is given, the text is positionned in 3D, in figure coordinnates. """ width = Trait(None, None, CFloat, adapts='width', help="""width of the text.""") z = Trait(None, None, CFloat, help="""Optional z position. When specified, the text is positioned in 3D""") _target = Instance(modules.Text, ()) opacity = CFloat(1, adapts="property.opacity", help="""The opacity of the text.""") def __init__(self, x, y, text, **kwargs): """ Override init as for different positional arguments.""" if 'z' in kwargs and kwargs['z'] is not None: self._target.z_position = kwargs['z'] self._target.position_in_3d = True elif not (x < 1. and x > 0. and y > 0. and y < 1.): raise ValueError('Text positions should be in [0, 1] if no z' 'position is given') super(Text, self).__init__(None, **kwargs) self._target.text = text self._target.x_position = x self._target.y_position = y text = make_function(Text) ############################################################################### class Text3D(ModuleFactory): """ Positions text at a 3D location in the scene. **Function signature**:: text3d(x, y, z, text, ...) x, y, and z are the position of the origin of the text. The text is positionned in 3D, in figure coordinnates. """ _target = Instance(modules.Text3D, ()) scale = Either(CFloat(1), CArray(shape=(3,)), help="""The scale of the text, in figure units. Either a float, or 3-tuple of floats.""") orientation = CArray(shape=(3,), adapts='orientation', desc="""the angles giving the orientation of the text. If the text is oriented to the camera, these angles are referenced to the axis of the camera. If not, these angles are referenced to the z axis.""") orient_to_camera = true(adapts='orient_to_camera', desc="""if the text is kept oriented to the camera, or is pointing in a specific direction, regardless of the camera position.""") def __init__(self, x, y, z, text, **kwargs): """ Override init as for different positional arguments.""" if not 'scale' in kwargs: kwargs['scale'] = 1 super(Text3D, self).__init__(None, **kwargs) self._target.text = text self._target.position = (x, y, z) def _scale_changed(self): scale = self.scale if isinstance(scale, numbers.Number): scale = scale * np.ones((3,)) self._target.scale = scale text3d = make_function(Text3D) ############################################################################# class Title(SingletonModuleFactory): """Creates a title for the figure. **Function signature**:: title(text, ...) """ size = CFloat(1, help="the size of the title") height = CFloat(0.8, adapts='y_position', help="""height of the title, in portion of the figure height""") def _size_changed(self): self._target.width = min(0.05 * self.size * len(self._text), 1) self._target.x_position = 0.5 * (1 - self._target.width) _target = Instance(modules.Text) def __target_default(self): """ This is called only if no existing title is found.""" width = min(0.05 * self.size * len(self._text), 1) text = modules.Text(text=self._text, y_position=self.height, x_position=0.5 * (1 - width),) text.width = width return text def __init__(self, text, **kwargs): self._text = text # This will be used by _size_changed if not 'name' in kwargs: # The name is used as au unique marker to identify the # title. We need to set it ASAP. self.name = kwargs['name'] = 'Title' super(Title, self).__init__(**kwargs) self._target.text = self._text # We need to set position after Text is initiated, as text will # override these positions self._target.y_position = self.height self._size_changed() title = make_function(Title) mayavi-4.5.0/mayavi/tools/engine_manager.py0000644000076500000240000001704712747716314021376 0ustar prabhustaff00000000000000""" Central registry for figures with mlab. """ # Standard library imports import warnings # Enthought librairies imports from traits.api import HasTraits, Instance # Local imports from mayavi.preferences.api import preference_manager from mayavi.core.registry import registry from mayavi.core.engine import Engine from mayavi.core.off_screen_engine import OffScreenEngine from mayavi.core.null_engine import NullEngine from mayavi.core.common import process_ui_events from .preferences_mirror import PreferencesMirror # The mlab options. options = PreferencesMirror() options.preferences = preference_manager.mlab ###################################################################### def check_backend(): """ Check if either we are in test mode, or if there is a suitable traits backend installed. """ from traitsui.toolkit import toolkit from traits.etsconfig.api import ETSConfig from mayavi.tools.engine_manager import options toolkit() # This forces the selection of a toolkit. if (options.backend != 'test' and options.offscreen != True) and \ ETSConfig.toolkit in ('null', ''): raise ImportError('''Could not import backend for traits _______________________________________________________________________________ Make sure that you have either the TraitsBackendWx or the TraitsBackendQt projects installed. If you installed Mayavi with easy_install, try easy_install . easy_install Mayavi[app] will also work. If you performed a source checkout, be sure to run 'python setup.py install' in Traits, TraitsGUI, and the Traits backend of your choice. Also make sure that either wxPython or PyQT is installed. wxPython: http://www.wxpython.org/ PyQT: http://www.riverbankcomputing.co.uk/software/pyqt/intro ''') ############################################################################### # `EngineManager` class. ############################################################################### class EngineManager(HasTraits): """ Central registry for figures with mlab. This is a container for a list of engines having declared themselves as usable by mlab. This object is meant to be a thin wrapper on top of the different Engine classes, making sure that mlab knows how to start an engine and get a figure. """ current_engine = Instance(Engine) def get_engine(self): """ Returns an engine in agreement with the options. """ # First check if the current engine is running and if it is in # the registered engines. ce = self.current_engine if ce is not None: if not ce.running or ce not in registry.engines.values(): self.current_engine = None if self.current_engine is not None: engines = list((self.current_engine,)) else: engines = list() engines.extend(list(registry.engines.values())) if options.backend == 'envisage': suitable = [e for e in engines if e.__class__.__name__ == 'EnvisageEngine'] elif options.backend == 'test': suitable = [e for e in engines if e.__class__.__name__ == 'NullEngine'] elif options.offscreen: suitable = [e for e in engines if e.__class__.__name__ == 'OffScreenEngine'] elif options.backend == 'auto': suitable = [e for e in engines if e.__class__.__name__ not in ('NullEngine', 'OffScreenEngine')] else: suitable = [e for e in engines if e.__class__.__name__ == 'Engine'] if len(suitable) == 0: return self.new_engine() else: # Return the most engine add to the list most recently. self.current_engine = suitable[-1] return suitable[-1] def get_null_engine(self): """Return a suitable null engine and make that the current engine. """ # First check if the current engine is running and if it is in # the registered engines. ce = self.current_engine if ce is not None: if not ce.running or ce not in registry.engines.values(): self.current_engine = None if self.current_engine is not None: engines = list((self.current_engine,)) else: engines = list() engines.extend(list(registry.engines.values())) engine = None for e in engines: if e.__class__.__name__ == 'NullEngine': engine = e break else: engine = NullEngine(name='Null Mlab Engine') engine.start() self.current_engine = engine return engine def set_engine(self, engine): """ Sets the mlab engine. """ if not engine.running: warnings.warn('Engine is not running', stacklevel=2) self.current_engine = engine registry.register_engine(engine) def new_engine(self): """ Creates a new engine, envisage or not depending on the options. """ check_backend() if options.backend == 'envisage': from mayavi.plugins.app import Mayavi m = Mayavi(start_gui_event_loop=False) m.main() process_ui_events() window = m.application.workbench.active_window engine = window.get_service(Engine) elif options.backend == 'test': engine = NullEngine(name='Null Mlab Engine') engine.start() else: if options.offscreen: engine = OffScreenEngine(name='Mlab offscreen Engine') engine.start() else: engine = Engine(name='Mlab Engine') engine.start() self.current_engine = engine return engine def find_figure_engine(self, fig): """ Find the engine corresponding to a given mayavi scene. """ for engine in registry.engines.values(): if fig in engine.scenes: return engine else: raise TypeError("Figure not attached to a mayavi engine.") def show_engine(self, engine=None, rich_view=True): """ Show a dialog with the mayavi pipeline. This dialog allows to edit graphicaly the properties of the different objects on the scenes. """ if engine is None: engine = self.get_engine() if engine.__class__.__name__ == 'EnvisageEngine' or \ options.backend == 'test': # FIXME: This should pop up the relevent envisage view pass elif rich_view: from mayavi.core.ui.engine_rich_view import \ EngineRichView figure = engine.current_scene view = EngineRichView(engine=engine) if figure is None: scene = None else: scene = figure.scene return view.scene_editing_view(scene=scene) else: from mayavi.core.ui.engine_view import \ EngineView scene = engine.current_scene view = EngineView(engine=engine) return view.edit_traits() engine_manager = EngineManager() get_engine = engine_manager.get_engine get_null_engine = engine_manager.get_null_engine set_engine = engine_manager.set_engine show_pipeline = engine_manager.show_engine mayavi-4.5.0/mayavi/tools/figure.py0000644000076500000240000002562012747716314017714 0ustar prabhustaff00000000000000""" Functions related to creating the engine or the figures. """ # Author: Gael Varoquaux # Copyright (c) 2007, Enthought, Inc. # License: BSD Style. # Standard library imports. import gc import warnings import copy import numpy as np # Enthought imports from pyface.timer.api import do_later # imports from tvtk.api import tvtk from mayavi.core.scene import Scene from mayavi.core.registry import registry from .camera import view from .engine_manager import get_engine, options, set_engine ###################################################################### # A list to store the allocated scene numbers __scene_number_list = set((0,)) def figure(figure=None, bgcolor=None, fgcolor=None, engine=None, size=(400, 350)): """ Creates a new scene or retrieves an existing scene. If the mayavi engine is not running this also starts it. **Keyword arguments** :figure: The name of the figure, or handle to it. :bgcolor: The color of the background (None is default). :fgcolor: The color of the foreground, that is the color of all text annotation labels (axes, orientation axes, scalar bar labels). It should be sufficiently far from `bgcolor` to see the annotation texts. (None is default). :engine: The mayavi engine that controls the figure. :size: The size of the scene created, in pixels. May not apply for certain scene viewer. """ if isinstance(figure, Scene): if figure.scene is None: engine = registry.find_scene_engine(figure) else: engine = registry.find_scene_engine(figure.scene) set_engine(engine) engine.current_scene = figure else: if engine is None: engine = get_engine() if figure is None: name = max(__scene_number_list) + 1 __scene_number_list.update((name,)) name = 'Mayavi Scene %d' % name engine.new_scene(name=name, size=size) engine.current_scene.name = name else: if type(figure) in (int, np.int, np.int0, np.int8, np.int16, np.int32, np.int64): name = int(figure) __scene_number_list.update((name,)) name = 'Mayavi Scene %d' % name else: name = str(figure) # Go looking in the engine see if the scene is not already # running for scene in engine.scenes: if scene.name == name: engine.current_scene = scene return scene else: engine.new_scene(name=name, size=size) engine.current_scene.name = name figure = engine.current_scene scene = figure.scene if scene is not None: if hasattr(scene, 'isometric_view'): scene.isometric_view() else: # Not every viewer might implement this method view(40, 50) scene = figure.scene if scene is not None: if bgcolor is None: bgcolor = options.background_color scene.background = bgcolor if fgcolor is None: fgcolor = options.foreground_color scene.foreground = fgcolor return figure def gcf(engine=None): """Return a handle to the current figure. You can supply the engine from which you want to retrieve the current figure, if you have several mayavi engines. """ if engine is None: engine = get_engine() scene = engine.current_scene if scene is None: return figure(engine=engine) return scene def clf(figure=None): """Clear the current figure. You can also supply the figure that you want to clear. """ try: if figure is None: scene = gcf() else: scene = figure disable_render = scene.scene.disable_render scene.scene.disable_render = True scene.children[:] = [] scene._mouse_pick_dispatcher.clear_callbacks() scene.scene.disable_render = disable_render except AttributeError: pass gc.collect() def close(scene=None, all=False): """ Close a figure window close() by itself closes the current figure. close(num) closes figure number num. close(name) closes figure named name. close(figure), where figure is a scene instance, closes that figure. close(all=True) closes all figures controlled by mlab """ if all is True: engine = get_engine() # We need the copy, as the list gets pruned as we close scenes for scene in copy.copy(engine.scenes): engine.close_scene(scene) return if not isinstance(scene, Scene): engine = get_engine() if scene is None: scene = engine.current_scene else: if type(scene) in (int, np.int, np.int0, np.int8, np.int16, np.int32, np.int64): scene = int(scene) name = 'Mayavi Scene %d' % scene else: name = str(scene) # Go looking in the engine see if the scene is not already # running for scene in engine.scenes: if scene.name == name: break else: warnings.warn('Scene %s not managed by mlab' % name) return else: if scene.scene is None: engine = registry.find_scene_engine(scene) else: engine = registry.find_scene_engine(scene.scene) engine.close_scene(scene) def draw(figure=None): """ Forces a redraw of the current figure. """ if figure is None: figure = gcf() figure.render() def savefig(filename, size=None, figure=None, magnification='auto', **kwargs): """ Save the current scene. The output format are deduced by the extension to filename. Possibilities are png, jpg, bmp, tiff, ps, eps, pdf, rib (renderman), oogl (geomview), iv (OpenInventor), vrml, obj (wavefront) **Parameters** :size: the size of the image created (unless magnification is set, in which case it is the size of the window used for rendering). :figure: the figure instance to save to a file. :magnification: the magnification is the scaling between the pixels on the screen, and the pixels in the file saved. If you do not specify it, it will be calculated so that the file is saved with the specified size. If you specify a magnification, Mayavi will use the given size as a screen size, and the file size will be 'magnification * size'. **Notes** If the size specified is larger than the window size, and no magnification parameter is passed, the magnification of the scene is changed so that the image created has the requested size. Please note that if you are trying to save images with sizes larger than the window size, there will be additional computation cost. Any extra keyword arguments are passed along to the respective image format's save method. """ if figure is None: figure = gcf() current_mag = figure.scene.magnification try: if size is not None: current_x, current_y = tuple(figure.scene.get_size()) target_x, target_y = size if magnification is 'auto': magnification = max(target_x // current_x, target_y // current_y) + 1 target_x = int(target_x / magnification) target_y = int(target_y / magnification) size = target_x, target_y elif magnification is 'auto': magnification = 1 figure.scene.magnification = int(magnification) figure.scene.save(filename, size=size, **kwargs) finally: figure.scene.magnification = int(current_mag) def sync_camera(reference_figure, target_figure): """ Synchronise the camera of the target_figure on the camera of the reference_figure. """ reference_figure.scene._renderer.sync_trait('active_camera', target_figure.scene._renderer) target_figure.scene._renderer.active_camera.on_trait_change( lambda: do_later(target_figure.scene.render)) def screenshot(figure=None, mode='rgb', antialiased=False): """ Return the current figure pixmap as an array. **Parameters** :figure: a figure instance or None, optional If specified, the figure instance to capture the view of. :mode: {'rgb', 'rgba'} The color mode of the array captured. :antialiased: {True, False} Use anti-aliasing for rendering the screenshot. Uses the number of aa frames set by figure.scene.anti_aliasing_frames **Notes** On most systems, this works similarly to taking a screenshot of the rendering window. Thus if it is hidden by another window, you will capture the other window. This limitation is due to the heavy use of the hardware graphics system. **Examples** This function can be useful for integrating 3D plotting with Mayavi in a 2D plot created by matplotlib. >>> from mayavi import mlab >>> mlab.test_plot3d() >>> arr = mlab.screenshot() >>> import pylab as pl >>> pl.imshow(arr) >>> pl.axis('off') >>> pl.show() """ if figure is None: figure = gcf() x, y = tuple(figure.scene.get_size()) # Try to lift the window figure.scene._lift() if mode == 'rgb': out = tvtk.UnsignedCharArray() shape = (y, x, 3) pixel_getter = figure.scene.render_window.get_pixel_data pg_args = (0, 0, x - 1, y - 1, 1, out) elif mode == 'rgba': out = tvtk.FloatArray() shape = (y, x, 4) pixel_getter = figure.scene.render_window.get_rgba_pixel_data pg_args = (0, 0, x - 1, y - 1, 1, out) else: raise ValueError('mode type not understood') if antialiased: # save the current aa value to restore it later old_aa = figure.scene.render_window.aa_frames figure.scene.render_window.aa_frames = figure.scene.anti_aliasing_frames figure.scene.render() pixel_getter(*pg_args) figure.scene.render_window.aa_frames = old_aa figure.scene.render() else: pixel_getter(*pg_args) # Return the array in a way that pylab.imshow plots it right: out = out.to_array() out.shape = shape out = np.flipud(out) return out mayavi-4.5.0/mayavi/tools/filters.py0000644000076500000240000001726612747716314020112 0ustar prabhustaff00000000000000""" Filter factories and their associated functions for mlab. Module functions meant to be applied to a data source object should take only one positional argument, the data object, to be easily used in helper functions. """ # Author: Gael Varoquaux # Prabhu Ramachandran # Copyright (c) 2007-2015, Enthought, Inc. # License: BSD Style. from traits.api import Instance, CFloat, CInt, CArray, Trait, \ Enum, Property, Any, String from tvtk.common import camel2enthought from tvtk.api import tvtk import mayavi.filters.api as filters from mayavi.core.registry import registry from .pipe_base import PipeFactory, make_function # This the list is dynamically populated further down below at the end. __all__ = ['tube', 'warp_scalar', 'threshold', 'elevation_filter', 'set_active_attribute', 'user_defined' ] def new_class(name, bases, dict_): try: import new return new.classobj(name, bases, dict_) except ImportError: return type(name, bases, dict_) ############################################################################## class TubeFactory(PipeFactory): """Applies the Tube mayavi filter to the given VTK object.""" _target = Instance(filters.Tube, ()) tube_sides = CInt(6, adapts='filter.number_of_sides', desc="""number of sides of the tubes used to represent the lines.""") tube_radius = CFloat(0.05, adapts='filter.radius', desc="""radius of the tubes used to represent the lines.""") tube = make_function(TubeFactory) ############################################################################## class WarpScalarFactory(PipeFactory): """Applies the WarpScalar mayavi filter to the given VTK object.""" _target = Instance(filters.WarpScalar, ()) warp_scale = CFloat(1.0, adapts="filter.scale_factor", help="scale of the warp scalar") warp_scalar = make_function(WarpScalarFactory) ############################################################################## class ThresholdFactory(PipeFactory): """Applies the Threshold mayavi filter to the given VTK object.""" _target = Instance(filters.Threshold, ()) filter_type = Enum('cells', 'points', adapts='filter_type', help="If threshold is put on cells or points") low = Trait(None, None, CFloat, help="The lower threshold") def _low_changed(self): if self.low is None: pass else: self._target.lower_threshold = self.low up = Trait(None, None, CFloat, help="The upper threshold") def _up_changed(self): if self.up is None: pass else: self._target.upper_threshold = self.up threshold = make_function(ThresholdFactory) ############################################################################## class ElevationFilterFactory(PipeFactory): """Applies the Elevation Filter mayavi filter to the given VTK object.""" high_point = CArray(default=[0, 0, 1], shape=(3,), adapts="filter.high_point", help="The end point of the projection line") low_point = CArray(default=[0, 0, 0], shape=(3,), adapts="filter.low_point", help="The start point of the projection line") _target = Instance(filters.ElevationFilter, ()) elevation_filter = make_function(ElevationFilterFactory) ############################################################################## class SetActiveAttributeFactory(PipeFactory): """ Applies the SetActiveAttribute Filter mayavi filter to the given VTK object. """ point_scalars = String( adapts="point_scalars_name", help="The name of the active point scalars") point_vectors = String( adapts="point_vectors_name", help="The name of the active point vectors") point_tensors = String( adapts="point_tensors_name", help="The name of the active point tensors") cell_scalars = String( adapts="cell_scalars_name", help="The name of the active cell scalars") cell_vectors = String( adapts="cell_vectors_name", help="The name of the active cell vectors") cell_tensors = String( adapts="cell_tensors_name", help="The name of the active cell tensors") _target = Instance(filters.SetActiveAttribute, ()) set_active_attribute = make_function(SetActiveAttributeFactory) ############################################################################## class UserDefinedFactory(PipeFactory): """Applies the UserDefined mayavi filter to the given TVTK object.""" _target = Instance(filters.UserDefined, ()) filter = Instance(tvtk.Object, adapts="filter", help="the tvtk filter to adapt. This" "be either an instance of the filter, or the" "name of this filter.") def __init__(self, parent, **kwargs): if 'filter' in kwargs: filter = kwargs['filter'] if not isinstance(filter, tvtk.Object): try: filter = getattr(tvtk, filter) except AttributeError: raise Exception('Filter %s unknown to TVTK' % filter) kwargs['filter'] = filter() self._target.filter = kwargs['filter'] self._target.setup_filter() else: self._target.filter = kwargs['filter'] if not 'name' in kwargs: kwargs['name'] = 'UserDefined(%s)' % \ kwargs['filter'].__class__.__name__ super(UserDefinedFactory, self).__init__(parent, **kwargs) user_defined = make_function(UserDefinedFactory) ############################################################################ # Automatically generated filters from registry. ############################################################################ class _AutomaticFilterFactory(PipeFactory): """The base class for any auto-generated factory classes. NOTE: This class requires that the `_metadata` trait be set to the metadata object for the object for which this is a factory. """ # The target. _target = Property # The saved target that is created once and then always returned. _saved_target = Any(None) def _get__target(self): """Getter for the _target trait.""" if self._saved_target is None: self._saved_target = self._metadata.get_callable()() return self._saved_target def _make_functions(namespace): """Make the functions for adding filters and add them to the namespace automatically. """ for fil in registry.filters: func_name = camel2enthought(fil.id) class_name = fil.id if func_name.endswith('_filter'): func_name = func_name[:-7] class_name = class_name[:-6] class_name = class_name + 'Factory' # Don't create any that are already defined. if class_name in namespace: continue # The class to wrap. klass = new_class( class_name, (_AutomaticFilterFactory,), {'__doc__': fil.help, } ) klass._metadata = fil # The mlab helper function. func = make_function(klass) # Inject class/function into the namespace and __all__. namespace[class_name] = klass namespace[func_name] = func __all__.append(func_name) # Create the module related functions. _make_functions(locals()) mayavi-4.5.0/mayavi/tools/helper_functions.py0000644000076500000240000011651012747716314022001 0ustar prabhustaff00000000000000""" Helper functions for mlab. These combine creation of the data sources, and applying the modules to them to make standard visualization operation. They should always return the module object created, for consistency, and because retrieving the vtk data source from a module object is possible via tools.get_vtk_src Each helper function should have a test function associated with it, both for testing and to ilustrate its use. """ # Author: Gael Varoquaux # Copyright (c) 2007, Enthought, Inc. # License: BSD Style. from .modules import VectorsFactory, StreamlineFactory, GlyphFactory, \ IsoSurfaceFactory, SurfaceFactory, ContourSurfaceFactory, \ ImageActorFactory, glyph_mode_dict from .sources import vector_scatter, vector_field, scalar_scatter, \ scalar_field, line_source, array2d_source, grid_source, \ triangular_mesh_source, vertical_vectors_source from .filters import ExtractVectorNormFactory, WarpScalarFactory, \ TubeFactory, ExtractEdgesFactory, PolyDataNormalsFactory, \ StripperFactory from .animator import animate from mayavi.core.scene import Scene from .auto_doc import traits_doc, dedent from . import tools from traits.api import Array, Callable, CFloat, HasTraits, \ List, Trait, Any, Instance, TraitError, true import numpy def document_pipeline(pipeline): def the_function(*args, **kwargs): return pipeline(*args, **kwargs) if hasattr(pipeline, 'doc'): doc = pipeline.doc elif pipeline.__doc__ is not None: doc = pipeline.__doc__ else: doc = '' the_function.__doc__ = dedent("""%s **Keyword arguments:** %s""") % (dedent(doc), traits_doc(pipeline.get_all_traits()),) return the_function ############################################################################# class Pipeline(HasTraits): """ Function used to build pipelines for helper functions """ #doc = '' _source_function = Callable() _pipeline = List() # Traits here only for documentation purposes figure = Instance('mayavi.core.scene.Scene', help='Figure to populate.') def __call__(self, *args, **kwargs): """ Calls the logics of the factory, but only after disabling rendering, if needed. """ # First retrieve the scene, if any. if 'figure' in kwargs: figure = kwargs['figure'] assert isinstance(figure, (Scene, None)) scene = figure.scene else: scene = tools.gcf().scene if scene is not None: self._do_redraw = not scene.disable_render scene.disable_render = True # Then call the real logic output = self.__call_internal__(*args, **kwargs) # And re-enable the rendering, if needed. if scene is not None: scene.disable_render = not self._do_redraw return output def __call_internal__(self, *args, **kwargs): """ Builds the source and runs through the pipeline, returning the last object created by the pipeline.""" self.store_kwargs(kwargs) self.source = self._source_function(*args, **kwargs) # Copy the pipeline so as not to modify it for the next call self.pipeline = self._pipeline[:] return self.build_pipeline() def store_kwargs(self, kwargs): """ Merges the given keyword argument, with traits default and store the resulting dictionary in self.kwargs.""" kwargs = kwargs.copy() all_traits = self.get_all_traits() if not set(kwargs.keys()).issubset(list(all_traits.keys())): raise ValueError("Invalid keyword arguments : %s" % \ ', '.join( str(k) for k in set(kwargs.keys()).difference(list(all_traits.keys())))) traits = self.get(self.class_trait_names()) [traits.pop(key) for key in list(traits.keys()) if key[0] == '_'] traits.update(kwargs) self.kwargs = traits def build_pipeline(self): """ Runs through the pipeline, applying pipe after pipe. """ object = self.source for pipe in self.pipeline: keywords = set(pipe.class_trait_names()) keywords.remove('trait_added') keywords.remove('trait_modified') this_kwargs = {} for key, value in self.kwargs.items(): if key in keywords: this_kwargs[key] = value object = pipe(object, **this_kwargs)._target return object def get_all_traits(self): """ Returns all the traits of class, and the classes in the pipeline. """ traits = {} for pipe in self._pipeline: traits.update(pipe.class_traits()) traits.update(self.class_traits()) traits.pop('trait_added') traits.pop('trait_modified') return traits ############################################################################# class Points3d(Pipeline): """ Plots glyphs (like points) at the position of the supplied data. **Function signatures**:: points3d(x, y, z...) points3d(x, y, z, s, ...) points3d(x, y, z, f, ...) x, y and z are numpy arrays, or lists, all of the same shape, giving the positions of the points. If only 3 arrays x, y, z are given, all the points are drawn with the same size and color. In addition, you can pass a fourth array s of the same shape as x, y, and z giving an associated scalar value for each point, or a function f(x, y, z) returning the scalar value. This scalar value can be used to modulate the color and the size of the points.""" _source_function = Callable(scalar_scatter) _pipeline = [GlyphFactory, ] scale_factor = Any('auto', help='The scaling applied to the glyphs. ' 'the size of the glyph is by default calculated ' 'from the inter-glyph spacing. Specify a float to ' 'give the maximum glyph size in drawing units' ) def __call_internal__(self, *args, **kwargs): """ Override the call to be able to scale automatically the glyphs. """ scale_factor = kwargs.get('scale_factor', 'auto') if scale_factor == 'auto': kwargs['scale_factor'] = 1 g = Pipeline.__call_internal__(self, *args, **kwargs) if scale_factor == 'auto': g.glyph.glyph.scale_factor = \ tools._typical_distance(g.mlab_source.dataset) g.glyph.glyph.clamping = True else: g.glyph.glyph.clamping = False return g points3d = document_pipeline(Points3d()) def test_points3d(): t = numpy.linspace(0, 4 * numpy.pi, 20) cos = numpy.cos sin = numpy.sin x = sin(2 * t) y = cos(t) z = cos(2 * t) s = 2 + sin(t) return points3d(x, y, z, s, colormap="copper", scale_factor=.25) @animate def test_points3d_anim(obj=None): """Animates the test_points3d example.""" g = obj if obj is not None else test_points3d() t = numpy.linspace(0, 4 * numpy.pi, 20) # Animate the points3d. ms = g.mlab_source for i in range(10): ms.z = numpy.cos(2 * t * 0.1 * (i + 1)) yield def test_molecule(): """Generates and shows a Caffeine molecule.""" o = [[30, 62, 19], [8, 21, 10]] ox, oy, oz = list(map(numpy.array, zip(*o))) n = [[31, 21, 11], [18, 42, 14], [55, 46, 17], [56, 25, 13]] nx, ny, nz = list(map(numpy.array, zip(*n))) c = [[5, 49, 15], [30, 50, 16], [42, 42, 15], [43, 29, 13], [18, 28, 12], [32, 6, 8], [63, 36, 15], [59, 60, 20]] cx, cy, cz = list(map(numpy.array, zip(*c))) h = [[23, 5, 7], [32, 0, 16], [37, 5, 0], [73, 36, 16], [69, 60, 20], [54, 62, 28], [57, 66, 12], [6, 59, 16], [1, 44, 22], [0, 49, 6]] hx, hy, hz = list(map(numpy.array, zip(*h))) oxygen = points3d(ox, oy, oz, scale_factor=16, scale_mode='none', resolution=20, color=(1, 0, 0), name='Oxygen') nitrogen = points3d(nx, ny, nz, scale_factor=20, scale_mode='none', resolution=20, color=(0, 0, 1), name='Nitrogen') carbon = points3d(cx, cy, cz, scale_factor=20, scale_mode='none', resolution=20, color=(0, 1, 0), name='Carbon') hydrogen = points3d(hx, hy, hz, scale_factor=10, scale_mode='none', resolution=20, color=(1, 1, 1), name='Hydrogen') return oxygen, nitrogen, carbon, hydrogen ############################################################################# class Quiver3D(Points3d): """ Plots glyphs (like arrows) indicating the direction of the vectors at the positions supplied. **Function signatures**:: quiver3d(u, v, w, ...) quiver3d(x, y, z, u, v, w, ...) quiver3d(x, y, z, f, ...) u, v, w are numpy arrays giving the components of the vectors. If only 3 arrays, u, v, and w are passed, they must be 3D arrays, and the positions of the arrows are assumed to be the indices of the corresponding points in the (u, v, w) arrays. If 6 arrays, (x, y, z, u, v, w) are passed, the 3 first arrays give the position of the arrows, and the 3 last the components. They can be of any shape. If 4 positional arguments, (x, y, z, f) are passed, the last one must be a callable, f, that returns vectors components (u, v, w) given the positions (x, y, z).""" scalars = Array(help="""optional scalar data.""") _source_function = Callable(vector_scatter) _pipeline = [VectorsFactory, ] quiver3d = document_pipeline(Quiver3D()) def test_quiver3d(): x, y, z = numpy.mgrid[-2:3, -2:3, -2:3] r = numpy.sqrt(x ** 2 + y ** 2 + z ** 4) u = y * numpy.sin(r) / (r + 0.001) v = -x * numpy.sin(r) / (r + 0.001) w = numpy.zeros_like(z) obj = quiver3d(x, y, z, u, v, w, line_width=3, scale_factor=1) return obj def test_quiver3d_cone(): xmin, xmax, ymin, ymax, zmin, zmax = [-5, 5, -5, 5, -5, 5] x, y, z = numpy.mgrid[-5:5:8j, -5:5:8j, -5:5:8j] x = x.astype('f') y = y.astype('f') z = z.astype('f') sin = numpy.sin cos = numpy.cos u = cos(x) v = sin(y) w = sin(x * z) obj = quiver3d(x, y, z, u, v, w, mode='cone', extent=(0, 1, 0, 1, 0, 1), scale_factor=0.9) return obj def test_quiver3d_2d_data(): dims = [32, 32] xmin, xmax, ymin, ymax = [-5, 5, -5, 5] x, y = numpy.mgrid[xmin:xmax:dims[0] * 1j, ymin:ymax:dims[1] * 1j] x = x.astype('f') y = y.astype('f') sin = numpy.sin cos = numpy.cos u = cos(x) v = sin(y) w = numpy.zeros_like(x) return quiver3d(x, y, w, u, v, w, colormap="Purples", scale_factor=0.5, mode="2dthick_arrow") ############################################################################# class Flow(Pipeline): """ Creates a trajectory of particles following the flow of a vector field. **Function signatures**:: flow(u, v, w, ...) flow(x, y, z, u, v, w, ...) flow(x, y, z, f, ...) u, v, w are numpy arrays giving the components of the vectors. If only 3 arrays, u, v, and w are passed, they must be 3D arrays, and the positions of the arrows are assumed to be the indices of the corresponding points in the (u, v, w) arrays. If 6 arrays, (x, y, z, u, v, w) are passed, the 3 first arrays give the position of the arrows, and the 3 last the components. The x, y and z arrays are then supposed to have been generated by `numpy.mgrid`, in other words, they are 3D arrays, with positions lying on a 3D orthogonal and regularly spaced grid with nearest neighbor in space matching nearest neighbor in the array. The function builds a vector field assuming the points are regularly spaced. If 4 positional arguments, (x, y, z, f) are passed, the last one must be a callable, f, that returns vectors components (u, v, w) given the positions (x, y, z).""" scalars = Array(help="""optional scalar data.""") _source_function = Callable(vector_field) _pipeline = [ExtractVectorNormFactory, StreamlineFactory, ] def __call_internal__(self, *args, **kwargs): """ Override the call to be able to choose whether to apply an ExtractVectorNorm filter. """ self.source = self._source_function(*args, **kwargs) kwargs.pop('name', None) self.store_kwargs(kwargs) # Copy the pipeline so as not to modify it for the next call self.pipeline = self._pipeline[:] if tools._has_scalar_data(self.source): self.pipeline.pop(0) return self.build_pipeline() flow = document_pipeline(Flow()) def test_flow(): x, y, z = numpy.mgrid[-4:4:40j, -4:4:40j, 0:4:20j] r = numpy.sqrt(x ** 2 + y ** 2 + z ** 2 + 0.1) u = y * numpy.sin(r) / r v = -x * numpy.sin(r) / r w = numpy.ones_like(z)*0.05 obj = flow(u, v, w) return obj def test_flow_tubes(): dims = [32, 32, 32] xmin, xmax, ymin, ymax, zmin, zmax = [-5, 5, -5, 5, -5, 5] x, y, z = numpy.mgrid[xmin:xmax:dims[0] * 1j, ymin:ymax:dims[1] * 1j, zmin:zmax:dims[2] * 1j] x = x.astype('f') y = y.astype('f') z = z.astype('f') sin = numpy.sin cos = numpy.cos u = cos(x / 2.) v = sin(y / 2.) w = sin(x * z / 4.) obj = flow(x, y, z, u, v, w, linetype='tube') return obj @animate def test_flow_anim(obj=None): obj = obj if obj is not None else test_flow_tubes() # Now animate the flow. ms = obj.mlab_source x, y, z = ms.x, ms.y, ms.z for i in range(10): u = numpy.cos(x / 2. + numpy.pi * (i + 1) / 10.) w = numpy.sin(x * z / 4. + numpy.pi * (i + 1) / 10.) ms.set(u=u, w=w) yield def test_flow_scalars(): dims = [32, 32, 32] xmin, xmax, ymin, ymax, zmin, zmax = [-5, 5, -5, 5, -5, 5] x, y, z = numpy.mgrid[xmin:xmax:dims[0] * 1j, ymin:ymax:dims[1] * 1j, zmin:zmax:dims[2] * 1j] x = x.astype('f') y = y.astype('f') z = z.astype('f') sin = numpy.sin cos = numpy.cos u = cos(x / 2.) v = sin(y / 2.) w = sin(x * z / 8.) t = x * z obj = flow(u, v, w, scalars=t, seedtype='plane', linetype='tube', colormap='Spectral') return obj ############################################################################# class Contour3d(Pipeline): """ Plots iso-surfaces for a 3D volume of data suplied as arguments. **Function signatures**:: contour3d(scalars, ...) contour3d(x, y, z, scalars, ...) scalars is a 3D numpy arrays giving the data on a grid. If 4 arrays, (x, y, z, scalars) are passed, the 3 first arrays give the position of the arrows, and the last the scalar value. The x, y and z arrays are then supposed to have been generated by `numpy.mgrid`, in other words, they are 3D arrays, with positions lying on a 3D orthogonal and regularly spaced grid with nearest neighbor in space matching nearest neighbor in the array. The function builds a scalar field assuming the points are regularly spaced. If 4 positional arguments, (x, y, z, f) are passed, the last one can also be a callable, f, that returns vectors components (u, v, w) given the positions (x, y, z).""" _source_function = Callable(scalar_field) _pipeline = [IsoSurfaceFactory, ] contour3d = document_pipeline(Contour3d()) def test_contour3d(): x, y, z = numpy.ogrid[-5:5:64j, -5:5:64j, -5:5:64j] scalars = x * x * 0.5 + y * y + z * z * 2.0 obj = contour3d(scalars, contours=4, transparent=True) return obj @animate def test_contour3d_anim(obj=None): obj = obj if obj is not None else test_contour3d() x, y, z = numpy.ogrid[-5:5:64j, -5:5:64j, -5:5:64j] # Now animate the contours. ms = obj.mlab_source for i in range(1, 10): ms.scalars = x * x * 0.5 + y * x * 0.1 * (i + 1) + z * z * 0.25 yield ############################################################################# class Plot3d(Pipeline): """ Draws lines between points. **Function signatures**:: plot3d(x, y, z, ...) plot3d(x, y, z, s, ...) x, y, z and s are numpy arrays or lists of the same shape. x, y and z give the positions of the successive points of the line. s is an optional scalar value associated with each point.""" tube_radius = Trait(0.025, CFloat, None, adapts='filter.radius', help="""radius of the tubes used to represent the lines, If None, simple lines are used. """) _source_function = Callable(line_source) _pipeline = [StripperFactory, TubeFactory, SurfaceFactory, ] def __call_internal__(self, *args, **kwargs): """ Override the call to be able to choose whether to apply filters. """ self.source = self._source_function(*args, **kwargs) kwargs.pop('name', None) self.store_kwargs(kwargs) # Copy the pipeline so as not to modify it for the next call self.pipeline = self._pipeline[:] if self.kwargs['tube_radius'] is None: self.pipeline.remove(TubeFactory) self.pipeline.remove(StripperFactory) return self.build_pipeline() plot3d = document_pipeline(Plot3d()) def test_plot3d(): """Generates a pretty set of lines.""" n_mer, n_long = 6, 11 pi = numpy.pi dphi = pi / 1000.0 phi = numpy.arange(0.0, 2 * pi + 0.5 * dphi, dphi) mu = phi * n_mer x = numpy.cos(mu) * (1 + numpy.cos(n_long * mu / n_mer) * 0.5) y = numpy.sin(mu) * (1 + numpy.cos(n_long * mu / n_mer) * 0.5) z = numpy.sin(n_long * mu / n_mer) * 0.5 l = plot3d(x, y, z, numpy.sin(mu), tube_radius=0.025, colormap='Spectral') return l @animate def test_plot3d_anim(obj=None): """Generates a pretty set of lines and animates it.""" # Run the standard example and get the module generated. obj = obj if obj is not None else test_plot3d() # Some data from the test example for the animation. n_mer, n_long = 6, 11 pi = numpy.pi dphi = pi / 1000.0 phi = numpy.arange(0.0, 2 * pi + 0.5 * dphi, dphi, 'd') mu = phi * n_mer # Now animate the data. ms = obj.mlab_source for i in range(10): x = numpy.cos(mu) * (1 + numpy.cos(n_long * mu / n_mer + numpy.pi * (i + 1) / 5.) * 0.5) scalars = numpy.sin(mu + numpy.pi * (i + 1) / 5) ms.set(x=x, scalars=scalars) yield ############################################################################# class ImShow(Pipeline): """ View a 2D array as an image. **Function signatures**:: imshow(s, ...) s is a 2 dimension array. The values of s are mapped to a color using the colormap.""" _source_function = Callable(array2d_source) _pipeline = [ImageActorFactory, ] imshow = document_pipeline(ImShow()) def test_imshow(): """ Use imshow to visualize a 2D 10x10 random array. """ s = numpy.random.random((10, 10)) return imshow(s, colormap='gist_earth') ############################################################################# class Surf(Pipeline): """ Plots a surface using regularly-spaced elevation data supplied as a 2D array. **Function signatures**:: surf(s, ...) surf(x, y, s, ...) surf(x, y, f, ...) s is the elevation matrix, a 2D array, where indices along the first array axis represent x locations, and indices along the second array axis represent y locations. x and y can be 1D or 2D arrays such as returned by numpy.ogrid or numpy.mgrid. Arrays returned by numpy.meshgrid require a transpose first to obtain correct indexing order. The points should be located on an orthogonal grid (possibly non-uniform). In other words, all the points sharing a same index in the s array need to have the same x or y value. For arbitrary-shaped position arrays (non-orthogonal grids), see the mesh function. If only 1 array s is passed, the x and y arrays are assumed to be made from the indices of arrays, and an uniformly-spaced data set is created. If 3 positional arguments are passed the last one must be an array s, or a callable, f, that returns an array. x and y give the coordinates of positions corresponding to the s values.""" _source_function = Callable(array2d_source) _pipeline = [WarpScalarFactory, PolyDataNormalsFactory, SurfaceFactory] warp_scale = Any(1, help="""scale of the z axis (warped from the value of the scalar). By default this scale is a float value. If you specify 'auto', the scale is calculated to give a pleasant aspect ratio to the plot, whatever the bounds of the data. If you specify a value for warp_scale in addition to an extent, the warp scale will be determined by the warp_scale, and the plot be positioned along the z axis with the zero of the data centered on the center of the extent. If you are using explicit extents, this is the best way to control the vertical scale of your plots. If you want to control the extent (or range) of the surface object, rather than its scale, see the `extent` keyword argument. """) mask = Array(help="""boolean mask array to suppress some data points. Note: this works based on colormapping of scalars and will not work if you specify a solid color using the `color` keyword.""") def __call_internal__(self, *args, **kwargs): """ Override the call to be able to scale automatically the axis. """ self.source = self._source_function(*args, **kwargs) kwargs.pop('name', None) # Deal with both explicit warp scale and extent, this is # slightly hairy. The wigner example is a good test case for # this. if not 'warp_scale' in kwargs and not 'extent' in kwargs: try: xi, xf, yi, yf, _, _ = self.source.data.bounds zi, zf = self.source.data.scalar_range except AttributeError: xi, xf, yi, yf, _, _ = self.source.image_data.bounds zi, zf = self.source.image_data.scalar_range aspect_ratios = [(zf - zi) / (xf - xi), (zf - zi) / (yf - yi)] if min(aspect_ratios) < 0.01 or max(aspect_ratios) > 100: print('Warning: the range of your scalar values differs by ' \ 'more than a factor 100 than the range of the grid values ' \ 'and you did not '\ 'specify a warp_scale. You could try warp_scale="auto".') if 'warp_scale' in kwargs and not kwargs['warp_scale'] == 'auto' \ and 'extent' in kwargs: # XXX: I should use the logging module. print('Warning: both warp_scale and extent keyword argument ' \ 'specified, the z bounds of the extents will be overridden') xi, xf, yi, yf, zi, zf = kwargs['extent'] zo = 0.5 * (zi + zf) try: si, sf = self.source.data.scalar_range except AttributeError: si, sf = self.source.image_data.scalar_range z_span = kwargs['warp_scale'] * abs(sf - si) zi = zo + si * kwargs['warp_scale'] zf = zi + z_span kwargs['extent'] = (xi, xf, yi, yf, zi, zf) kwargs['warp_scale'] = 1 elif kwargs.get('warp_scale', 1) == 'auto': if 'extent' in kwargs: if 'warp_scale' in kwargs: print("Warning: extent specified, warp_scale='auto' " \ "ignored.") else: try: xi, xf, yi, yf, _, _ = self.source.data.bounds zi, zf = self.source.data.scalar_range except AttributeError: xi, xf, yi, yf, _, _ = self.source.image_data.bounds zi, zf = self.source.image_data.scalar_range z0 = zf - zi dz = 0.3 * ((xf - xi) + (yf - yi)) zi = z0 - 0.5 * dz zf = z0 + 0.5 * dz kwargs['extent'] = (xi, xf, yi, yf, zi, zf) kwargs['warp_scale'] = 1. self.store_kwargs(kwargs) # Copy the pipeline so as not to modify it for the next call self.pipeline = self._pipeline[:] return self.build_pipeline() surf = document_pipeline(Surf()) def test_simple_surf(): """Test Surf with a simple collection of points.""" x, y = numpy.mgrid[0:3:1, 0:3:1] return surf(x, y, numpy.asarray(x, 'd')) @animate def test_simple_surf_anim(obj=None): """Test Surf with a simple collection of points and animate it.""" obj = obj if obj is not None else test_simple_surf() ms = obj.mlab_source x = ms.x for i in range(10): ms.scalars = numpy.asarray(x * 0.1 * (i + 1), 'd') yield def test_surf(): """Test surf on regularly spaced co-ordinates like MayaVi.""" def f(x, y): sin, cos = numpy.sin, numpy.cos return sin(x + y) + sin(2 * x - y) + cos(3 * x + 4 * y) x, y = numpy.mgrid[-7.:7.05:0.1, -5.:5.05:0.05] s = surf(x, y, f) #cs = contour_surf(x, y, f, contour_z=0) return s def test_surf_wigner(): def cat(x, y, alpha=2, eta=1, purity=1): """ Multiphoton shrodinger cat. eta is the fidelity, alpha the number of photons""" cos = numpy.cos exp = numpy.exp return (1 + eta * (exp(-x ** 2 - (y - alpha) ** 2) + exp(-x ** 2 - (y + alpha) ** 2) + 2 * purity * exp(-x ** 2 - y ** 2) * cos(2 * alpha * x)) / (2 * (1 + exp(-alpha ** 2)))) / 2 x, y = numpy.mgrid[-5:5:0.1, -5:5:0.1] return surf(x, y, cat) ############################################################################# class Mesh(Pipeline): """ Plots a surface using grid-spaced data supplied as 2D arrays. **Function signatures**:: mesh(x, y, z, ...) x, y, z are 2D arrays, all of the same shape, giving the positions of the vertices of the surface. The connectivity between these points is implied by the connectivity on the arrays. For simple structures (such as orthogonal grids) prefer the `surf` function, as it will create more efficient data structures. For mesh defined by triangles rather than regular implicit connectivity, see the `triangular_mesh` function. """ scale_mode = Trait('none', {'none': 'data_scaling_off', 'scalar': 'scale_by_scalar', 'vector': 'scale_by_vector'}, help="""the scaling mode for the glyphs ('vector', 'scalar', or 'none').""") scale_factor = CFloat(0.05, desc="""scale factor of the glyphs used to represent the vertices, in fancy_mesh mode. """) tube_radius = Trait(0.025, CFloat, None, help="""radius of the tubes used to represent the lines, in mesh mode. If None, simple lines are used. """) scalars = Array(help="""optional scalar data.""") mask = Array(help="""boolean mask array to suppress some data points. Note: this works based on colormapping of scalars and will not work if you specify a solid color using the `color` keyword.""") representation = Trait('surface', 'wireframe', 'points', 'mesh', 'fancymesh', desc="""the representation type used for the surface.""") _source_function = Callable(grid_source) _pipeline = [ExtractEdgesFactory, GlyphFactory, TubeFactory, SurfaceFactory] def __call_internal__(self, *args, **kwargs): """ Override the call to be able to choose whether to apply filters. """ self.source = self._source_function(*args, **kwargs) kwargs.pop('name', None) self.store_kwargs(kwargs) # Copy the pipeline so as not to modify it for the next call self.pipeline = self._pipeline[:] if not self.kwargs['representation'] in ('mesh', 'fancymesh'): self.pipeline.remove(ExtractEdgesFactory) self.pipeline.remove(TubeFactory) self.pipeline.remove(GlyphFactory) self.pipeline = [PolyDataNormalsFactory, ] + self.pipeline else: if self.kwargs['tube_radius'] is None: self.pipeline.remove(TubeFactory) if not self.kwargs['representation'] == 'fancymesh': self.pipeline.remove(GlyphFactory) self.kwargs['representation'] = 'surface' return self.build_pipeline() mesh = document_pipeline(Mesh()) def test_mesh(): """A very pretty picture of spherical harmonics translated from the octaviz example.""" pi = numpy.pi cos = numpy.cos sin = numpy.sin dphi, dtheta = pi / 250.0, pi / 250.0 [phi, theta] = numpy.mgrid[0:pi + dphi * 1.5:dphi, 0:2 * pi + dtheta * 1.5:dtheta] m0 = 4 m1 = 3 m2 = 2 m3 = 3 m4 = 6 m5 = 2 m6 = 6 m7 = 4 r = sin(m0 * phi) ** m1 + cos(m2 * phi) ** m3 + \ sin(m4 * theta) ** m5 + cos(m6 * theta) ** m7 x = r * sin(phi) * cos(theta) y = r * cos(phi) z = r * sin(phi) * sin(theta) return mesh(x, y, z, colormap="bone") def test_mesh_sphere(r=1.0, npts=(100, 100), colormap='jet'): """Create a simple sphere.""" pi = numpy.pi cos = numpy.cos sin = numpy.sin np_phi = npts[0] * 1j np_theta = npts[1] * 1j phi, theta = numpy.mgrid[0:pi:np_phi, 0:2 * pi:np_theta] x = r * sin(phi) * cos(theta) y = r * sin(phi) * sin(theta) z = r * cos(phi) return mesh(x, y, z, colormap=colormap) @animate def test_mesh_sphere_anim(obj=None, r=1.0, npts=(100, 100), colormap='jet'): """Create a simple sphere and animate it.""" obj = obj if obj is not None else test_mesh_sphere(r, npts, colormap) pi = numpy.pi cos = numpy.cos np_phi = npts[0] * 1j np_theta = npts[1] * 1j phi, theta = numpy.mgrid[0:pi:np_phi, 0:2 * pi:np_theta] ms = obj.mlab_source for i in range(1, 10): z = (r + i * 0.25) * cos(phi) ms.set(z=z, scalars=z) yield def test_mesh_mask_custom_colors(r=1.0, npts=(100, 100)): """Create a sphere with masking and using a custom colormap. Note that masking works only when scalars are set. The custom colormap illustrates how one can completely customize the colors with numpy arrays. In this case we use a simple 2 color colormap. """ # Create the data like for test_mesh_sphere. pi = numpy.pi cos = numpy.cos sin = numpy.sin np_phi = npts[0] * 1j np_theta = npts[1] * 1j phi, theta = numpy.mgrid[0:pi:np_phi, 0:2 * pi:np_theta] x = r * sin(phi) * cos(theta) y = r * sin(phi) * sin(theta) z = r * cos(phi) # Setup the mask array. mask = numpy.zeros_like(x).astype(bool) mask[::5] = True mask[:,::5] = True # Create the mesh with the default colormapping. m = mesh(x, y, z, scalars=z, mask=mask) # Setup the colormap. This is an array of (R, G, B, A) values (each in # range 0-255), there should be at least 2 colors in the array. If you # want a constant color set the two colors to the same value. colors = numpy.zeros((2, 4), dtype='uint8') colors[0,2] = 255 colors[1,1] = 255 # Set the alpha value to fully visible. colors[:,3] = 255 # Now setup the lookup table to use these colors. m.module_manager.scalar_lut_manager.lut.table = colors return m def test_fancy_mesh(): """Create a fancy looking mesh using mesh (example taken from octaviz).""" pi = numpy.pi cos = numpy.cos du, dv = pi / 20.0, pi / 20.0 u, v = numpy.mgrid[0.01:pi + du * 1.5:du, 0:2 * pi + dv * 1.5:dv] x = (1 - cos(u)) * cos(u + 2 * pi / 3) * cos(v + 2 * pi / 3.0) * 0.5 y = (1 - cos(u)) * cos(u + 2 * pi / 3) * cos(v - 2 * pi / 3.0) * 0.5 z = -cos(u - 2 * pi / 3.) m = mesh(x, y, z, representation='fancymesh', tube_radius=0.0075, colormap="RdYlGn") return m ############################################################################# class ContourSurf(Pipeline): """ Plots a the contours of a surface using grid-spaced data for elevation supplied as a 2D array. **Function signatures**:: contour_surf(s, ...) contour_surf(x, y, s, ...) contour_surf(x, y, f, ...) s is the elevation matrix, a 2D array. The contour lines plotted are lines of equal s value. x and y can be 1D or 2D arrays (such as returned by numpy.ogrid or numpy.mgrid), but the points should be located on an orthogonal grid (possibly non-uniform). In other words, all the points sharing a same index in the s array need to have the same x or y value. For arbitrary-shaped position arrays (non-orthogonal grids), see the mesh function. If only 1 array s is passed, the x and y arrays are assumed to be made from the indices of arrays, and an uniformly-spaced data set is created. If 3 positional arguments are passed the last one must be an array s, or a callable, f, that returns an array. x and y give the coordinates of positions corresponding to the s values.""" _source_function = Callable(array2d_source) _pipeline = [WarpScalarFactory, ContourSurfaceFactory] contour_surf = document_pipeline(ContourSurf()) def test_contour_surf(): """Test contour_surf on regularly spaced co-ordinates like MayaVi.""" def f(x, y): sin, cos = numpy.sin, numpy.cos return sin(x + y) + sin(2 * x - y) + cos(3 * x + 4 * y) x, y = numpy.mgrid[-7.:7.05:0.1, -5.:5.05:0.05] s = contour_surf(x, y, f) return s ############################################################################# # Expose only the glyphs that make (more or less) sense for a barchart. bar_mode_dict = dict() for item in ('cube', '2dtriangle', '2dsquare', '2dvertex', '2dthick_cross', '2ddiamond', '2dcross', '2dcircle'): bar_mode_dict[item] = glyph_mode_dict[item] class BarChart(Pipeline): """ Plots vertical glyphs (like bars) scaled vertical, to do histogram-like plots. This functions accepts a wide variety of inputs, with positions given in 2-D or in 3-D. **Function signatures**:: barchart(s, ...) barchart(x, y, s, ...) barchart(x, y, f, ...) barchart(x, y, z, s, ...) barchart(x, y, z, f, ...) If only one positional argument is passed, it can be a 1-D, 2-D, or 3-D array giving the length of the vectors. The positions of the data points are deducted from the indices of array, and an uniformly-spaced data set is created. If 3 positional arguments (x, y, s) are passed the last one must be an array s, or a callable, f, that returns an array. x and y give the 2D coordinates of positions corresponding to the s values. If 4 positional arguments (x, y, z, s) are passed, the 3 first are arrays giving the 3D coordinates of the data points, and the last one is an array s, or a callable, f, that returns an array giving the data value. """ _source_function = Callable(vertical_vectors_source) _pipeline = [VectorsFactory, ] mode = Trait('cube', bar_mode_dict, desc='The glyph used to represent the bars.') lateral_scale = CFloat(0.9, desc='The lateral scale of the glyph, ' 'in units of the distance between nearest points') auto_scale = true(desc='whether to compute automatically the ' 'lateral scaling of the glyphs. This might be ' 'computationally expensive.') def __call_internal__(self, *args, **kwargs): """ Override the call to be able to scale automatically the axis. """ g = Pipeline.__call_internal__(self, *args, **kwargs) gs = g.glyph.glyph_source # Use a cube source for glyphs. if not 'mode' in kwargs: gs.glyph_source = gs.glyph_dict['cube_source'] # Position the glyph tail on the point. gs.glyph_position = 'tail' gs.glyph_source.center = (0.0, 0.0, 0.5) g.glyph.glyph.orient = False if not 'color' in kwargs: g.glyph.color_mode = 'color_by_scalar' if not 'scale_mode' in kwargs: g.glyph.scale_mode = 'scale_by_vector_components' g.glyph.glyph.clamping = False # The auto-scaling code. It involves finding the minimum # distance between points, which can be very expensive. We # shortcut this calculation for structured data if len(args) == 1 or self.auto_scale: min_axis_distance = 1 else: x, y, z = g.mlab_source.x, g.mlab_source.y, g.mlab_source.z min_axis_distance = \ tools._min_axis_distance(x, y, z) scale_factor = g.glyph.glyph.scale_factor * min_axis_distance lateral_scale = kwargs.pop('lateral_scale', self.lateral_scale) try: g.glyph.glyph_source.glyph_source.y_length = \ lateral_scale / (scale_factor) g.glyph.glyph_source.glyph_source.x_length = \ lateral_scale / (scale_factor) except TraitError: " Not all types of glyphs have controlable y_length and x_length" return g barchart = document_pipeline(BarChart()) def test_barchart(): """ Demo the bar chart plot with a 2D array. """ s = numpy.abs(numpy.random.random((3, 3))) return barchart(s) ############################################################################# class TriangularMesh(Mesh): """ Plots a surface using a mesh defined by the position of its vertices and the triangles connecting them. **Function signatures**:: triangular_mesh(x, y, z, triangles ...) x, y, z are arrays giving the positions of the vertices of the surface. triangles is a list of triplets (or an array) list the vertices in each triangle. Vertices are indexes by their appearance number in the position arrays. For simple structures (such as rectangular grids) prefer the surf or mesh functions, as they will create more efficient data structures. """ _source_function = Callable(triangular_mesh_source) triangular_mesh = document_pipeline(TriangularMesh()) def test_triangular_mesh(): """An example of a cone, ie a non-regular mesh defined by its triangles. """ n = 8 t = numpy.linspace(-numpy.pi, numpy.pi, n) z = numpy.exp(1j * t) x = z.real.copy() y = z.imag.copy() z = numpy.zeros_like(x) triangles = [(0, i, i + 1) for i in range(1, n)] x = numpy.r_[0, x] y = numpy.r_[0, y] z = numpy.r_[1, z] t = numpy.r_[0, t] return triangular_mesh(x, y, z, triangles, scalars=t) mayavi-4.5.0/mayavi/tools/mlab.py0000644000076500000240000000044512747716314017344 0ustar prabhustaff00000000000000# Author: Gael Varoquaux # Copyright (c) 2007-2015, Enthought, Inc. # License: BSD Style. print("!! mayavi.tools.mlab is obsolete and has been replaced by !!") print("!! mayavi.mlab. Please update your code. !!") from mayavi.mlab import * mayavi-4.5.0/mayavi/tools/mlab_scene_model.py0000644000076500000240000000342312747716314021700 0ustar prabhustaff00000000000000"""`MlabSceneModel` makes it easy to plug `mayavi.mlab` in traits UI views. """ # Authors: Prabhu Ramachandran # Copyright (c) 2007, Enthought, Inc. # License: BSD Style. from traits.api import Instance, Property from tvtk.pyface.scene_model import SceneModel from mayavi.core.engine import Engine from mayavi.core.scene import Scene from mayavi import mlab as m2_mlab ###################################################################### # `MlabSceneModel` class ###################################################################### class MlabSceneModel(SceneModel): """ An container for an mlab model, that can be exposed using a Mayavi scene in a TraitsUI view. """ # The mayavi engine. engine = Instance(Engine) # The mlab instance. mlab = Property() # A reference to the mayavi scene object mayavi_scene = Instance(Scene) def __init__(self, parent=None, **traits): super(MlabSceneModel, self).__init__(parent, **traits) # Store the current mlab figure: current_figure = self.engine.current_scene # register ourselves with the engine. self.engine.new_scene(self) # XXX: This is not thread-safe self.mayavi_scene = self.engine.current_scene # Restore the current figure. We do this, because MlabSceneModel # can be created lazy by Traits, on access. Having side effects # thus renders the code quite unpredictable self.engine.current_scene = current_figure ################################################################### # Private API. ################################################################### def _engine_default(self): return m2_mlab.get_engine() def _get_mlab(self): return m2_mlab mayavi-4.5.0/mayavi/tools/modules.py0000644000076500000240000006606612747716314020114 0ustar prabhustaff00000000000000""" Modules factories and their associated functions for mlab. Module functions meant to be applied to a data source object or a filter should take only one positional argument, the input, to be easily used in helper functions. """ # Author: Gael Varoquaux # Prabhu Ramachandran # Copyright (c) 2007-2015, Enthought, Inc. # License: BSD Style. import numpy from traits.api import Trait, CArray, Instance, CFloat, \ Any, false, true, TraitTuple, Range, Bool, Property, CInt, Enum, Either from traits.trait_errors import TraitError from tvtk.api import tvtk from tvtk.common import camel2enthought from mayavi.core.lut_manager import lut_mode_list import mayavi.modules.api as modules from mayavi.core.registry import registry from . import tools from .pipe_base import PipeFactory, make_function from .filters import new_class # This the list is dynamically populated further down below at the end. __all__ = ['vectors', 'glyph', 'streamline', 'surface', 'iso_surface', 'image_actor', 'contour_surface', 'contour_grid_plane', 'custom_grid_plane', 'image_plane_widget', 'scalar_cut_plane', 'vector_cut_plane', 'volume', ] ############################################################################## # Abstract module classes ############################################################################## class ModuleFactory(PipeFactory): """ Base class for all the modules factories""" color = Trait(None, None, TraitTuple(Range(0., 1.), Range(0., 1.), Range(0., 1.)), help="""the color of the vtk object. Overides the colormap, if any, when specified. This is specified as a triplet of float ranging from 0 to 1, eg (1, 1, 1) for white.""", ) def _color_changed(self): if self.color: self._target.actor.property.color = self.color if hasattr(self._target.actor.mapper, "scalar_visibility"): self._target.actor.mapper.scalar_visibility = False if hasattr(self._target, "property"): self._target.property.color = self.color opacity = CFloat(1., desc="""The overall opacity of the vtk object.""") def _opacity_changed(self): try: self._target.actor.property.opacity = self.opacity except AttributeError: try: self._target.property.opacity = self.opacity except AttributeError: pass line_width = CFloat(2., desc=""" The width of the lines, if any used.""") def _line_width_changed(self): try: self._target.actor.property.line_width = self.line_width except (AttributeError, TraitError): try: self._target.property.line_width = self.line_width except (AttributeError, TraitError): pass ############################################################################## class DataModuleFactory(ModuleFactory): """ Base class for all the module factories operating on data (ie not text and outline) """ reset_zoom = true(help="""Reset the zoom to accomodate the data newly added to the scene. Defaults to True.""") extent = CArray(shape=(6,), help="""[xmin, xmax, ymin, ymax, zmin, zmax] Default is the x, y, z arrays extent. Use this to change the extent of the object created.""", ) def _extent_changed(self): tools.set_extent(self._target, self.extent) transparent = false(help="""make the opacity of the actor depend on the scalar.""") def _transparent_changed(self): if self.transparent: data_range = \ self._target.module_manager.scalar_lut_manager.data_range self._target.module_manager.scalar_lut_manager.lut.alpha_range = \ (0.2, 0.8) data_range = (numpy.mean(data_range) + 0.4 * (data_range.max() - data_range.min()) * numpy.array([-1, 1])) self._target.module_manager.scalar_lut_manager.data_range = \ data_range colormap = Trait('blue-red', lut_mode_list(), help="""type of colormap to use.""") def _colormap_changed(self): colormap = self.colormap if colormap[-2:] == "_r": colormap = colormap[:-2] self._target.module_manager.scalar_lut_manager.reverse_lut = True self._target.module_manager.vector_lut_manager.reverse_lut = True self._target.module_manager.scalar_lut_manager.lut_mode = colormap self._target.module_manager.vector_lut_manager.lut_mode = colormap vmin = Trait(None, None, CFloat, help="""vmin is used to scale the colormap. If None, the min of the data will be used""") vmax = Trait(None, None, CFloat, help="""vmax is used to scale the colormap. If None, the max of the data will be used""") def _vmin_changed(self): if self.vmin is None and self.vmax is None: self._target.module_manager.scalar_lut_manager.use_default_range\ = True return self._target.module_manager.scalar_lut_manager.use_default_range \ = False vmin, vmax = \ self._target.module_manager.scalar_lut_manager.data_range if self.vmin is not None: vmin = self.vmin if self.vmax is not None: vmax = self.vmax self._target.module_manager.scalar_lut_manager.data_range = \ (vmin, vmax) _vmax_changed = _vmin_changed def __init__(self, *args, **kwargs): super(DataModuleFactory, self).__init__(*args, **kwargs) # We are adding data to the scene, reset the zoom: scene = self._scene.scene if scene is not None and self.reset_zoom: scene.reset_zoom() class ContourModuleFactory(DataModuleFactory): """ Base class for all the module factories with contours """ contours = Any(5, help="""Integer/list specifying number/list of contours. Specifying a list of values will only give the requested contours asked for.""") def _contours_changed(self): contour_list = True try: len(self.contours) except TypeError: contour_list = False if contour_list: self._target.contour.auto_contours = False self._target.contour.contours = self.contours else: assert type(self.contours) == int, \ "The contours argument must be an integer" assert self.contours > 0, "The contours argument must be positive" self._target.contour.set(auto_contours=True, number_of_contours=self.contours) if hasattr(self._target, 'enable_contours'): self._target.enable_contours = True ############################################################################## class CutPlaneFactory(DataModuleFactory): """ Base class for modules with a cut plane. """ plane_orientation = Enum('x_axes', 'y_axes', 'z_axes', desc="""the orientation of the plane""") view_controls = Bool(True, adapts='implicit_plane.visible', desc=("Whether or not the controls of the " "cut plane are shown.")) def _plane_orientation_changed(self): choices = dict(x_axes=numpy.array([1., 0., 0.]), y_axes=numpy.array([0., 1., 0.]), z_axes=numpy.array([0., 0., 1.])) self._target.implicit_plane.normal = \ choices[self.plane_orientation] ############################################################################## # Concrete module classes ############################################################################## # The list of possible glyph modes glyph_mode_dict = {'2darrow': 0, '2dcircle': 0, '2dcross': 0, '2ddash': 0, '2ddiamond': 0, '2dhooked_arrow': 0, '2dsquare': 0, '2dthick_arrow': 0, '2dthick_cross': 0, '2dtriangle': 0, '2dvertex': 0, 'arrow': 1, 'cone': 2, 'cylinder': 3, 'sphere': 4, 'cube': 5, 'axes': 6, 'point': 7} ############################################################################## class VectorsFactory(DataModuleFactory): """Applies the Vectors mayavi module to the given data object source (Mayavi source, or VTK dataset). """ _target = Instance(modules.Vectors, ()) scale_factor = CFloat(1., adapts='glyph.glyph.scale_factor', desc="""the scaling applied to the glyphs. The size of the glyph is by default in drawing units.""") scale_mode = Trait('vector', {'none': 'data_scaling_off', 'scalar': 'scale_by_scalar', 'vector': 'scale_by_vector'}, help="""the scaling mode for the glyphs ('vector', 'scalar', or 'none').""") resolution = CInt(8, desc="The resolution of the glyph created. For " "spheres, for instance, this is the number of " "divisions along theta and phi.") mask_points = Either(None, CInt, desc="If supplied, only one out of 'mask_points' " "data point is displayed. This option is useful " "to reduce the number of points displayed " "on large datasets") def _resolution_changed(self): glyph = self._target.glyph.glyph_source.glyph_source if hasattr(glyph, 'theta_resolution'): glyph.theta_resolution = self.resolution if hasattr(glyph, 'phi_resolution'): glyph.phi_resolution = self.resolution if hasattr(glyph, 'resolution'): glyph.resolution = self.resolution if hasattr(glyph, 'shaft_resolution'): glyph.shaft_resolution = self.resolution if hasattr(glyph, 'tip_resolution'): glyph.tip_resolution = self.resolution def _mask_points_changed(self): if self.mask_points is not None: self._target.glyph.mask_input_points = True self._target.glyph.mask_points.on_ratio = self.mask_points def _scale_mode_changed(self): self._target.glyph.scale_mode = self.scale_mode_ mode = Trait('2darrow', glyph_mode_dict, desc="""the mode of the glyphs.""") def _mode_changed(self): v = self._target # Workaround for different version of VTK: if hasattr(v.glyph.glyph_source, 'glyph_source'): g = v.glyph.glyph_source else: g = v.glyph if self.mode == 'point': g.glyph_source = tvtk.PointSource(radius=0, number_of_points=1) else: g.glyph_source = g.glyph_list[self.mode_] if self.mode_ == 0: g.glyph_source.glyph_type = self.mode[2:] vectors = make_function(VectorsFactory) ############################################################################## class GlyphFactory(VectorsFactory): """Applies the Glyph mayavi module to the given VTK data source (Mayavi source, or VTK dataset). """ _target = Instance(modules.Glyph, ()) scale_mode = Trait('scalar', {'none': 'data_scaling_off', 'scalar': 'scale_by_scalar', 'vector': 'scale_by_vector'}, help="""the scaling mode for the glyphs ('vector', 'scalar', or 'none').""") mode = Trait('sphere', glyph_mode_dict, desc="""the mode of the glyphs.""") glyph = make_function(GlyphFactory) ############################################################################## class StreamlineFactory(DataModuleFactory): """Applies the Streamline mayavi module to the given VTK data object.""" _target = Instance(modules.Streamline, ()) linetype = Trait('line', 'ribbon', 'tube', adapts='streamline_type', desc="""the type of line-like object used to display the streamline.""") seedtype = Trait('sphere', {'sphere': 0, 'line': 1, 'plane': 2, 'point': 3}, desc="""the widget used as a seed for the streamlines.""") seed_visible = Bool(True, adapts='seed.widget.enabled', desc="Control the visibility of the seed.", ) seed_scale = CFloat(1., desc="Scales the seed around its default center", ) seed_resolution = Either(None, CInt, desc='The resolution of the seed. Determines the number of ' 'seed points') integration_direction = Trait('forward', 'backward', 'both', adapts='stream_tracer.integration_direction', desc="The direction of the integration.", ) def _seedtype_changed(self): # XXX: this also acts for seed_scale and seed_resolution, but no # need to define explicit callbacks, as all the callbacks are # being called anyhow. self._target.seed.widget = widget = \ self._target.seed.widget_list[self.seedtype_] if not self.seed_scale == 1.: widget.enabled = True if self.seedtype == 'line': p1 = widget.point1 p2 = widget.point2 center = (p1 + p2) / 2. widget.point1 = center + self.seed_scale * (p1 - center) widget.point2 = center + self.seed_scale * (p2 - center) elif self.seedtype == 'plane': p1 = widget.point1 p2 = widget.point2 center = (p1 + p2) / 2. o = widget.origin widget.point1 = center + self.seed_scale * (p1 - center) widget.point2 = center + self.seed_scale * (p2 - center) widget.origin = center + self.seed_scale * (o - center) elif self.seedtype == 'sphere': widget.radius *= self.seed_scale # XXX: Very ugly, but this is only way I have found to # propagate changes. self._target.seed.stop() self._target.seed.start() widget.enabled = self.seed_visible if self.seed_resolution is not None: widget.enabled = True if self.seedtype in ('plane', 'line'): widget.resolution = self.seed_resolution elif self.seedtype == 'sphere': widget.phi_resolution = widget.theta_resolution = \ self.seed_resolution # XXX: Very ugly, but this is only way I have found to # propagate changes. self._target.seed.stop() self._target.seed.start() widget.enabled = self.seed_visible streamline = make_function(StreamlineFactory) ############################################################################## class SurfaceFactory(DataModuleFactory): """Applies the Surface mayavi module to the given data source (Mayavi source, or VTK dataset). """ _target = Instance(modules.Surface, ()) representation = Trait('surface', 'wireframe', 'points', adapts='actor.property.representation', desc="""the representation type used for the surface.""") surface = make_function(SurfaceFactory) ############################################################################## class IsoSurfaceFactory(ContourModuleFactory): """Applies the IsoSurface mayavi module to the given data source (Mayavi source, or VTK dataset). """ _target = Instance(modules.IsoSurface, ()) iso_surface = make_function(IsoSurfaceFactory) ############################################################################## class ContourSurfaceFactory(ContourModuleFactory): """Applies the Surface mayavi module to the given data source (Mayavi source, or VTK dataset) and turns contours on. """ _target = Instance(modules.Surface, ()) def __init__(self, *args, **kwargs): """ Overriding the __init__ to turn contours on.""" super(ContourSurfaceFactory, self).__init__(*args, **kwargs) self._contours_changed() contour_surface = make_function(ContourSurfaceFactory) ############################################################################## class ImageActorFactory(DataModuleFactory): """Applies the ImageActor mayavi module to the given VTK data object.""" _target = Instance(modules.ImageActor, ()) interpolate = Bool(True, adapts='actor.interpolate', desc="""if the pixels in the image are to be interpolated or not.""") opacity = Range(0.0, 1.0, 1.0, adapts='actor.opacity', desc="""the opacity of the image.""") image_actor = make_function(ImageActorFactory) ############################################################################## class ImagePlaneWidgetFactory(DataModuleFactory): """ Applies the ImagePlaneWidget mayavi module to the given data source (Mayavi source, or VTK dataset). """ _target = Instance(modules.ImagePlaneWidget, ()) slice_index = CInt(0, adapts='ipw.slice_index', help="""The index along wich the image is sliced.""") plane_opacity = Range(0.0, 1.0, 1.0, adapts='ipw.plane_property.opacity', desc="""the opacity of the plane actor.""") plane_orientation = Enum('x_axes', 'y_axes', 'z_axes', adapts='ipw.plane_orientation', desc="""the orientation of the plane""") image_plane_widget = make_function(ImagePlaneWidgetFactory) ############################################################################## class ScalarCutPlaneFactory(CutPlaneFactory): """ Applies the ScalarCutPlane mayavi module to the given data source (Mayavi source, or VTK dataset). """ _target = Instance(modules.ScalarCutPlane, ()) scalar_cut_plane = make_function(ScalarCutPlaneFactory) ############################################################################## class VectorCutPlaneFactory(CutPlaneFactory, VectorsFactory): """ Applies the VectorCutPlane mayavi module to the given data source (Mayavi source, or VTK dataset). """ _target = Instance(modules.VectorCutPlane, ()) vector_cut_plane = make_function(VectorCutPlaneFactory) ############################################################################## class ContourGridPlaneFactory(ContourModuleFactory): """ Applies the ContourGridPlane mayavi module to the given data source (Mayavi source, or VTK dataset). """ _target = Instance(modules.ContourGridPlane, ()) contour_grid_plane = make_function(ContourGridPlaneFactory) ############################################################################## class CustomGridPlaneFactory(ContourModuleFactory): """ Applies the CustomGridPlane mayavi module to the given VTK data source (Mayavi source, or VTK dataset). """ _target = Instance(modules.CustomGridPlane, ()) custom_grid_plane = make_function(CustomGridPlaneFactory) ############################################################################## class VolumeFactory(PipeFactory): """ Applies the Volume mayavi module to the given VTK data source (Mayavi source, or VTK dataset). **Note** The range of the colormap can be changed simply using the vmin/vmax parameters (see below). For more complex modifications of the colormap, here is some pseudo code to change the ctf (color transfer function), or the otf (opacity transfer function):: vol = mlab.pipeline.volume(src) # Changing the ctf: from tvtk.util.ctf import ColorTransferFunction ctf = ColorTransferFunction() ctf.add_rgb_point(value, r, g, b) # r, g, and b are float # between 0 and 1 ctf.add_hsv_point(value, h, s, v) # ... vol._volume_property.set_color(ctf) vol._ctf = ctf vol.update_ctf = True # Changing the otf: from tvtk.util.ctf import PiecewiseFunction otf = PiecewiseFunction() otf.add_point(value, opacity) vol._otf = otf vol._volume_property.set_scalar_opacity(otf) Also, it might be useful to change the range of the ctf:: ctf.range = [0, 1] """ color = Trait(None, None, TraitTuple(Range(0., 1.), Range(0., 1.), Range(0., 1.)), help="""the color of the vtk object. Overides the colormap, if any, when specified. This is specified as a triplet of float ranging from 0 to 1, eg (1, 1, 1) for white.""", ) vmin = Trait(None, None, CFloat, help="""vmin is used to scale the transparency gradient. If None, the min of the data will be used""") vmax = Trait(None, None, CFloat, help="""vmax is used to scale the transparency gradient. If None, the max of the data will be used""") _target = Instance(modules.Volume, ()) __ctf_rescaled = Bool(False) ###################################################################### # Non-public interface. ###################################################################### def _color_changed(self): if not self.color: return range_min, range_max = self._target.current_range from tvtk.util.ctf import ColorTransferFunction ctf = ColorTransferFunction() try: ctf.range = (range_min, range_max) except Exception: # VTK versions < 5.2 don't seem to need this. pass r, g, b = self.color ctf.add_rgb_point(range_min, r, g, b) ctf.add_rgb_point(range_max, r, g, b) self._target._ctf = ctf self._target._volume_property.set_color(ctf) self._target.update_ctf = True def _vmin_changed(self): vmin = self.vmin vmax = self.vmax range_min, range_max = self._target.current_range if vmin is None: vmin = range_min if vmax is None: vmax = range_max # Change the opacity function from tvtk.util.ctf import PiecewiseFunction, save_ctfs otf = PiecewiseFunction() if range_min < vmin: otf.add_point(range_min, 0.) if range_max > vmax: otf.add_point(range_max, 0.2) otf.add_point(vmin, 0.) otf.add_point(vmax, 0.2) self._target._otf = otf self._target._volume_property.set_scalar_opacity(otf) if self.color is None and not self.__ctf_rescaled and \ ((self.vmin is not None) or (self.vmax is not None)): # FIXME: We don't use 'rescale_ctfs' because it screws up the # nodes. def _rescale_value(x): nx = (x - range_min) / (range_max - range_min) return vmin + nx * (vmax - vmin) # The range of the existing ctf can vary. scale_min, scale_max = self._target._ctf.range def _rescale_node(x): nx = (x - scale_min) / (scale_max - scale_min) return range_min + nx * (range_max - range_min) if hasattr(self._target._ctf, 'nodes'): rgb = list() for value in self._target._ctf.nodes: r, g, b = \ self._target._ctf.get_color(value) rgb.append((_rescale_node(value), r, g, b)) else: rgb = save_ctfs(self._target.volume_property)['rgb'] from tvtk.util.ctf import ColorTransferFunction ctf = ColorTransferFunction() try: ctf.range = (range_min, range_max) except Exception: # VTK versions < 5.2 don't seem to need this. pass rgb.sort() v = rgb[0] ctf.add_rgb_point(range_min, v[1], v[2], v[3]) for v in rgb: ctf.add_rgb_point(_rescale_value(v[0]), v[1], v[2], v[3]) ctf.add_rgb_point(range_max, v[1], v[2], v[3]) self._target._ctf = ctf self._target._volume_property.set_color(ctf) self.__ctf_rescaled = True self._target.update_ctf = True # This is not necessary: the job is already done by _vmin_changed #_vmax_changed = _vmin_changed volume = make_function(VolumeFactory) ############################################################################ # Automatically generated modules from registry. ############################################################################ class _AutomaticModuleFactory(DataModuleFactory): """The base class for any auto-generated factory classes. NOTE: This class requires the `_metadata` trait be set to the metadata object for the object for which this is a factory. """ # The target. _target = Property # The saved target that is created once and then always returned. _saved_target = Any(None) def _get__target(self): """Getter for the _target trait.""" if self._saved_target is None: self._saved_target = self._metadata.get_callable()() return self._saved_target def _make_functions(namespace): """Make the functions for adding modules and add them to the namespace automatically. """ # Ignore these since they are already provided. ignore = ['axes', 'text', 'orientation_axes'] for mod in registry.modules: func_name = camel2enthought(mod.id) class_name = mod.id if func_name.endswith('_module'): func_name = func_name[:-7] class_name = class_name[:-6] class_name = class_name + 'Factory' # Don't create any that are already defined or ignored. if class_name in namespace or func_name in ignore: continue # The class to wrap. klass = new_class( class_name, (_AutomaticModuleFactory,), {'__doc__': mod.help, } ) klass._metadata = mod # The mlab helper function. func = make_function(klass) # Inject class/function into the namespace and __all__. namespace[class_name] = klass namespace[func_name] = func __all__.append(func_name) # Create the module related functions. _make_functions(locals()) mayavi-4.5.0/mayavi/tools/notebook.py0000644000076500000240000001001712747716314020245 0ustar prabhustaff00000000000000"""Functionality to display Mayavi scenes inside Jupyter notebooks. """ from __future__ import print_function import base64 from itertools import count from tvtk.api import tvtk from tvtk.common import configure_input _backend = 'x3d' _width = None _height = None _local = True counter = count() def init(backend='x3d', width=None, height=None, local=True): """Initialize a suitable backend for Jupyter notebooks. Parameters ---------- backend :str: one of ('png', 'x3d') width :int: suggested default width of the element height :int: suggested default height of the element local :bool: Use local copy of x3dom.js instead of online version. """ global _backend, _width, _height backends = ('png', 'x3d') error_msg = "Backend must be one of %r, got %s"%(backends, backend) assert backend in backends, error_msg from mayavi import mlab mlab.options.offscreen = True _backend = backend _width, _height = width, height _local = local _monkey_patch_for_ipython() print("Notebook initialized with %s backend."%backend) def _monkey_patch_for_ipython(): from mayavi.core.base import Base from tvtk.pyface.tvtk_scene import TVTKScene Base._repr_html_ = _repr_html_ TVTKScene._repr_html_ = _repr_html_ def _repr_html_(self): """Method for displaying elements on the Jupyter notebook. """ if hasattr(self, 'render_window'): scene = self elif hasattr(self, 'scene'): scene = self.scene if _backend == 'png': return scene_to_png(scene) elif _backend == 'x3d': return scene_to_x3d(scene) def _fix_x3d_header(x3d): id = 'scene_%d' % next(counter) rep = '', rep ) return x3d def scene_to_x3d(scene): ex = tvtk.X3DExporter() ex.input = scene.render_window lm = scene.light_manager.light_mode # The default raymond mode is too bright so switch back to vtk mode. scene.light_manager.light_mode = 'vtk' ex.write_to_output_string = True ex.update() ex.write() # Switch back scene.light_manager.light_mode = lm if _local: url_base = "/nbextensions/mayavi/x3d" else: url_base = "http://www.x3dom.org/download" x3d_elem = _fix_x3d_header(ex.output_string) html = ''' %s '''%(x3d_elem, url_base, url_base) return html def scene_to_png(scene): w2if = tvtk.WindowToImageFilter() w2if.input = scene.render_window ex = tvtk.PNGWriter() ex.write_to_memory = True configure_input(ex, w2if) ex.update() ex.write() data = base64.b64encode(ex.result.to_array()).decode('ascii') html = 'PNG image' return html % data def display(obj, backend=None): """Display given object on Jupyter notebook using given backend. This is largely for testing. """ global _backend from IPython.display import HTML, display as ipy_display backend = _backend if backend is None else backend orig_backend = _backend _backend = backend html = _repr_html_(obj) _backend = orig_backend return ipy_display(HTML(html)) mayavi-4.5.0/mayavi/tools/pipe_base.py0000644000076500000240000001671112747716314020363 0ustar prabhustaff00000000000000""" Base class for factories for adding objects to the pipeline. """ # Author: Gael Varoquaux # Copyright (c) 2007-2015, Enthought, Inc. # License: BSD Style. import warnings from traits.api import HasPrivateTraits, Str, TraitError,\ Instance, Any, Bool from mayavi.core.filter import Filter from mayavi.core.engine import Engine from mayavi.core.source import Source from mayavi.core.scene import Scene from mayavi.core.module_manager import ModuleManager from tvtk.api import tvtk from .auto_doc import make_doc from . import tools from .engine_manager import get_engine def get_obj(obj, components): """ Get the target object for the specified components. """ for component in components: obj = getattr(obj, component) return obj def make_function(factory_class): def the_function(*args, **kwargs): factory = factory_class(*args, **kwargs) return factory._target the_function.__doc__ = make_doc(factory_class) the_function.__name__ = factory_class.__name__.lower() return the_function def get_module_manager(obj): """ Returns the module manager that would be used when a module is added on the given object, if any, and None elsewhere. """ if hasattr(obj, 'module_manager'): return obj.module_manager elif isinstance(obj, ModuleManager): return obj for child in reversed(obj.children): if isinstance(child, ModuleManager): return child else: return None ############################################################################## class PipeFactory(HasPrivateTraits): """ Base class for all factories adding pipes on the pipeline """ name = Str(adapts='name', help='the name of the vtk object created.') figure = Instance(Scene) _engine = Instance(Engine, help=('the figure on which the object ' 'should be added')) _target = Any _do_redraw = Bool def add_module(self, parent, kwargs=dict()): """ Add the target module to the given object. """ # We check to see if the module-manager-related option require to # add a new module manager: if parent is not None: module_manager = get_module_manager(parent) if (module_manager is not None and len(module_manager.children) > 0): scalar_lut = module_manager.scalar_lut_manager vector_lut = module_manager.vector_lut_manager if 'vmin' in kwargs: if not scalar_lut.use_default_range and \ kwargs['vmin'] != scalar_lut.data_range[0]: parent = self._engine.add_module(ModuleManager(), module_manager.parent) elif not scalar_lut.use_default_range and \ kwargs['vmin'] != scalar_lut.data_range[0]: parent = self._engine.add_module(ModuleManager(), module_manager.parent) elif 'vmax' in kwargs: if not scalar_lut.use_default_range and \ kwargs['vmax'] != scalar_lut.data_range[1]: parent = self._engine.add_module(ModuleManager(), module_manager.parent) elif not scalar_lut.use_default_range and \ kwargs['vmax'] != scalar_lut.data_range[1]: parent = self._engine.add_module(ModuleManager(), module_manager.parent) elif 'colormap' in kwargs: cmap = kwargs['colormap'] if (scalar_lut.lut_mode != cmap or vector_lut.lut_mode != cmap): parent = self._engine.add_module(ModuleManager(), module_manager.parent) self._engine.add_module(self._target, obj=parent) def __init__(self, parent, **kwargs): # We are not passing the traits to the parent class super(PipeFactory, self).__init__() # Try to find the right engine and scene to work with ancester = parent while hasattr(ancester, 'parent'): ancester = getattr(ancester, 'parent') if isinstance(ancester, Scene): self._scene = ancester self._engine = ancester.parent break else: if self.figure is not None: self._scene = self.figure else: self._scene = tools.gcf() self._engine = get_engine() scene = self._scene.scene if self.figure is not None and self.figure is not self._scene: warnings.warn('Trying to add a module on the wrong scene') if isinstance(parent, (Source, tvtk.DataSet)) \ and not isinstance(parent, Filter) and scene is not None: # Search the current scene to see if the source is already # in it, if not add it. if not parent in self._scene.children: parent = tools.add_dataset(parent, figure=self._scene) if scene is not None: self._do_redraw = not scene.disable_render scene.disable_render = True if issubclass(self._target.__class__, Filter): self._engine.add_filter(self._target, obj=parent) else: self.add_module(parent, kwargs) # Inject the magical mlab source trait. if hasattr(parent, 'mlab_source'): ms = parent.mlab_source self._target.add_trait('mlab_source', Instance(ms.__class__)) self._target.mlab_source = ms traits = self.get(self.class_trait_names()) [traits.pop(key) for key in list(traits.keys()) if key[0] == '_' or key is None] traits.update(kwargs) # Now calling the traits setter, so that traits handlers are # called self.set(**traits) if scene is not None: scene.disable_render = not self._do_redraw def set(self, trait_change_notify=True, **traits): """ Same as HasTraits.set except that notification is forced, unless trait_change_notify==False""" HasPrivateTraits.set(self, trait_change_notify=trait_change_notify, **traits) if trait_change_notify == False: return for trait in traits: callback = getattr(self, '_%s_changed' % trait) value = getattr(self, trait) try: if callback is not None: callback() self._anytrait_changed(trait, value) except TraitError: if value is None: # This means "default" pass else: raise def _anytrait_changed(self, name, value): """ This is where we implement the adaptation code. """ trait = self.trait(name) if name[0] == '_': # Private attribute return # hasattr(traits, "adapts") always returns True :-<. if not trait.adapts is None: components = trait.adapts.split('.') obj = get_obj(self._target, components[:-1]) setattr(obj, components[-1], value) mayavi-4.5.0/mayavi/tools/pipeline.py0000644000076500000240000000067012747716314020236 0ustar prabhustaff00000000000000""" API module grouping all the mlab functions to manipulate directly the pipeline. """ # Author: Gael Varoquaux # Copyright (c) 2007-2015, Enthought, Inc. # License: BSD Style. from .modules import * from .sources import * from .filters import * from .tools import add_dataset, set_extent, add_module_manager, \ get_vtk_src from .probe_data import probe_data from .tools import _traverse as traverse mayavi-4.5.0/mayavi/tools/preferences_mirror.py0000644000076500000240000000406212747716314022323 0ustar prabhustaff00000000000000# Author: Prabhu Ramachandran # Copyright (c) 2008, Prabhu Ramachandran # License: BSD Style. # Enthought library imports. from traits.api import HasTraits, List, Str, Instance from apptools.preferences.api import PreferencesHelper ############################################################################### # `PreferencesMirror` class. ############################################################################### class PreferencesMirror(HasTraits): """ This class mirrors preferences from a PreferencesHelper such that users can use them and change them but nothing is saved to disk till the user asks for an explicit save. """ # The preferences we mirror. preferences = Instance(PreferencesHelper) # Private trait to store names of traits. _trait_names = List(Str) ###################################################################### # Public interface. ###################################################################### def save(self): """Updates the actual preferences and thereby persists them to disk. """ for name in self._trait_names: setattr(self.preferences, name, getattr(self, name)) ###################################################################### # Private interface. ###################################################################### def _preferences_changed(self): """Setup traits of our own based on those of the mayavi preferences. """ trait_names = [] opts = self.preferences for key, value in opts.traits().items(): if key not in ['trait_added', 'trait_modified', 'preferences', 'preferences_path']: self.add_trait(key, value) setattr(self, key, getattr(opts, key)) trait_names.append(key) opts.on_trait_change(self._update, key) self._trait_names = trait_names def _update(self, obj, name, old, new): setattr(self, name, new) mayavi-4.5.0/mayavi/tools/probe_data.py0000644000076500000240000000544512747716314020536 0ustar prabhustaff00000000000000""" A helper function to retrieve the data from Mayavi structures on arbitrary points. """ import numpy as np from tvtk.api import tvtk from . import tools import tvtk.common as tvtk_common def probe_data(mayavi_object, x, y, z, type='scalars', location='points'): """ Retrieve the data from a described by Mayavi visualization object at points x, y, z. **Parameters** :viz_obj: A Mayavi visualization object, or a VTK dataset The object describing the data you are interested in. :x: float or ndarray. The x position where you want to retrieve the data. :y: float or ndarray. The y position where you want to retrieve the data. :z: float or ndarray The z position where you want to retrieve the data. :type: 'scalars', 'vectors' or 'tensors', optional The type of the data to retrieve. :location: 'points' or 'cells', optional The location of the data to retrieve. **Returns** The values of the data at the given point, as an ndarray (or multiple arrays, in the case of vectors or tensors) of the same shape as x, y, and z. """ dataset = tools.get_vtk_src(mayavi_object)[0] assert type in ('scalars', 'vectors', 'cells'), ( "Invalid value for type: must be 'scalars', 'vectors' or " "'cells', but '%s' was given" % type) x = np.atleast_1d(x) y = np.atleast_1d(y) z = np.atleast_1d(z) shape = x.shape assert y.shape == z.shape == shape, \ 'The x, y and z arguments must have the same shape' probe_data = mesh = tvtk.PolyData(points=np.c_[x.ravel(), y.ravel(), z.ravel()]) shape = list(shape) probe = tvtk.ProbeFilter() tvtk_common.configure_input_data(probe, probe_data) tvtk_common.configure_source_data(probe, dataset) probe.update() if location == 'points': data = probe.output.point_data elif location == 'cells': data = probe.output.cell_data else: raise ValueError("Invalid value for data location, must be " "'points' or 'cells', but '%s' was given." % location) values = getattr(data, type) if values is None: raise ValueError("The object given has no %s data of type %s" % (location, type)) values = values.to_array() if type == 'scalars': values = np.reshape(values, shape) elif type == 'vectors': values = np.reshape(values, shape + [3, ]) values = np.rollaxis(values, -1) else: values = np.reshape(values, shape + [-1, ]) values = np.rollaxis(values, -1) return values mayavi-4.5.0/mayavi/tools/server.py0000644000076500000240000002214712747716314017742 0ustar prabhustaff00000000000000""" Powerful utility for running a TCP/UDP server that is used to script Mayavi2 from the network. This uses Twisted. This particular version has been written for the wxPython, adding support for a Qt4 version should be trivial. The key functions exposed are:: serve_tcp(...) serve_udp(...) See the function documentation for more information. Here is sample usage:: from mayavi import mlab from mayavi.tools import server mlab.test_plot3d() server.serve_tcp() The TCP server will listen on port 8007 by default in the above. Any data sent to the server is simply exec'd, meaning you can do pretty much anything you want. The `engine`, `scene`, `camera` and `mlab` are all available and can be used. For example after running the above you can do this:: $ telnet localhost 8007 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. scene.camera.azimuth(45) mlab.clf() mlab.test_contour3d() scene.camera.zoom(1.5) The nice thing about this is that you do not loose any interactivity of your app and can continue to use its UI as before, any network commands will be simply run on top of this. **Warning** while this is very powerful it is also a **huge security hole** since the remote user can do pretty much anything they want. """ # Author: Prabhu Ramachandran # Copyright (c) 2009-2015, Enthought, Inc. # License: BSD Style. import sys import wx # Install wxreactor; must be done before the reactor is imported below. from twisted.internet import wxreactor wxreactor.install() # The usual twisted imports. from twisted.internet.protocol import Protocol, DatagramProtocol, Factory from twisted.internet import reactor from twisted.python import log ############################################################################### # `M2UDP` protocol. ############################################################################### class M2UDP(DatagramProtocol): """Implements a brain dead but supremely powerful UDP API. Any data coming in is simply exec'd. Meaning you can do pretty much anything you want. The `engine`, `scene`, `camera` and `mlab` are all available and can be used. For example you can easily send this on the network:: scene.camera.azimuth(45) mlab.clf() mlab.test_contour3d() scene.camera.zoom(1.5) And these will run just fine retaining the full interactivity of the mayavi app. """ def datagramReceived(self, data, host_port): """Given a line of data, simply execs it to do whatever.""" host, port = host_port log.msg("Received: %r from %s:%d" % (data, host, port)) c = data.strip() if len(c) > 0: mlab = self.mlab engine = self.engine scene = self.scene camera = scene.camera try: exec(c, locals(), globals()) except: log.err() scene.render() ############################################################################### # `M2TCP` protocol ############################################################################### class M2TCP(Protocol): """Implements a brain dead but suprememly powerful TCP API. Any data coming in is simply exec'd. Meaning you can do pretty much anything you want. The `engine`, `scene`, `camera` and `mlab` are all available and can be used. For example you can easily send this on the network:: scene.camera.azimuth(45) mlab.clf() mlab.test_contour3d() scene.camera.zoom(1.5) And these will run just fine retaining the full interactivity of the mayavi app. """ # Maximum number of concurrent connections allowed. maxConnect = 1 def connectionMade(self): log.msg('ConnectionMade') self.factory.numConnect += 1 if self.factory.numConnect > self.maxConnect: self.transport.write("Server already in use, try later\n") self.transport.loseConnection() def connectionLost(self, reason): log.msg('ConnectionLost') self.factory.numConnect -= 1 def dataReceived(self, data): """Given a line of data, simply execs it to do whatever.""" c = data.strip() log.msg('Received:', c) if len(c) > 0: mlab = self.factory.mlab engine = self.factory.engine scene = self.factory.scene camera = scene.camera try: exec(c, locals(), globals()) except: log.err() scene.render() ############################################################################### # Utility functions. ############################################################################### def serve_udp(engine=None, port=9007, logto=sys.stdout): """Serve the `M2UDP` protocol using the given `engine` on the specified `port` logging messages to given `logto` which is a file-like object. This function will block till the service is closed. There is no need to call `mlab.show()` after or before this. The Mayavi UI will be fully responsive. **Parameters** :engine: Mayavi engine to use. If this is `None`, `mlab.get_engine()` is used to find an appropriate engine. :port: int: port to serve on. :logto: file : File like object to log messages to. If this is `None` it disables logging. **Examples** Here is a very simple example:: from mayavi import mlab from mayavi.tools import server mlab.test_plot3d() server.serve_udp() Test it like so:: import socket s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.bind(('', 9008)) s.sendto('camera.azimuth(10)', ('', 9007)) **Warning** Data sent is exec'd so this is a security hole. """ from mayavi import mlab e = engine or mlab.get_engine() # Setup the protocol with the right attributes. proto = M2UDP() proto.engine = e proto.scene = e.current_scene.scene proto.mlab = mlab if logto is not None: log.startLogging(logto) log.msg('Serving Mayavi2 UDP server on port', port) log.msg('Using Engine', e) # Register the running wxApp. reactor.registerWxApp(wx.GetApp()) # Listen on port 9007 using above protocol. reactor.listenUDP(port, proto) # Run the server + app. This will block. reactor.run() def serve_tcp(engine=None, port=8007, logto=sys.stdout, max_connect=1): """Serve the `M2TCP` protocol using the given `engine` on the specified `port` logging messages to given `logto` which is a file-like object. This function will block till the service is closed. There is no need to call `mlab.show()` after or before this. The Mayavi UI will be fully responsive. **Parameters** :engine: Mayavi engine to use. If this is `None`, `mlab.get_engine()` is used to find an appropriate engine. :port: int: port to serve on. :logto: file: File like object to log messages to. If this is `None` it disables logging. :max_connect: int: Maximum number of simultaneous connections to support. **Examples** Here is a very simple example:: from mayavi import mlab from mayavi.tools import server mlab.test_plot3d() server.serve_tcp() The TCP server will listen on port 8007 by default in the above. Any data sent to the server is simply exec'd, meaning you can do pretty much anything you want. The `engine`, `scene`, `camera` and `mlab` are all available and can be used. For example after running the above you can do this:: $ telnet localhost 8007 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. scene.camera.azimuth(45) mlab.clf() mlab.test_contour3d() scene.camera.zoom(1.5) **Warning** Data sent is exec'd so this is a security hole. """ from mayavi import mlab e = engine or mlab.get_engine() # Setup the factory with the right attributes. factory = Factory() factory.protocol = M2TCP factory.maxConnect = max_connect factory.numConnect = 0 factory.engine = e factory.scene = e.current_scene.scene factory.mlab = mlab if logto is not None: log.startLogging(logto) log.msg('Serving Mayavi2 TCP server on port', port) log.msg('Using Engine', e) # Register the running wxApp. reactor.registerWxApp(wx.GetApp()) # Listen on port 9007 using above protocol. reactor.listenTCP(port, factory) # Run the server + app. This will block. reactor.run() ############################################################################### # Examples and tests. ############################################################################### def test_tcp(): """Simple test for the TCP server.""" from mayavi import mlab mlab.test_plot3d() serve_tcp() def test_udp(): """Simple test for the UDP server.""" from mayavi import mlab mlab.test_plot3d() serve_udp() if __name__ == '__main__': test_tcp() mayavi-4.5.0/mayavi/tools/show.py0000644000076500000240000001064512747716314017414 0ustar prabhustaff00000000000000# Author: Prabhu Ramachandran # Copyright (c) 2008, Enthought, Inc. # License: BSD Style. from traits.etsconfig.api import ETSConfig from pyface.api import GUI, ApplicationWindow from traits.api import HasTraits, Button, Any from traitsui.api import View, Group, Item from pyface.util import guisupport # Globals. # The GUI instance. _gui = None # The stop show instance. _stop_show = None def is_ui_running(): """ Returns True if the UI event loop is running. """ from .engine_manager import options if options.offscreen: return True elif ETSConfig.toolkit == 'wx': return guisupport.is_event_loop_running_wx() elif ETSConfig.toolkit == 'qt4': return guisupport.is_event_loop_running_qt4() else: return False ############################################################################### # `StopShow` class. ############################################################################### class StopShow(HasTraits): ######################################## # Traits stop = Button('Stop interaction', desc='if the UI interaction is to be stopped') # Private traits. # Stores a reference to the UI object so it can be disposed when the # interaction is stopped. _ui = Any view = View(Group(Item('stop'), show_labels=False), buttons=[], title='Control Show') ###################################################################### # `object` interface. ###################################################################### def __init__(self, **traits): super(StopShow, self).__init__(**traits) self._ui = self.edit_traits() ###################################################################### # Non-public interface. ###################################################################### def _stop_fired(self): _gui.stop_event_loop() self._ui.dispose() def show(func=None, stop=False): """ Start interacting with the figure. By default, this function simply creates a GUI and starts its event loop if needed. If it is used as a decorator, then it may be used to decorate a function which requires a UI. If the GUI event loop is already running it simply runs the function. If not the event loop is started and function is run in the toolkit's event loop. The choice of UI is via `ETSConfig.toolkit`. If the argument stop is set to True then it pops up a UI where the user can stop the event loop. Subsequent calls to `show` will restart the event loop. **Parameters** :stop: A boolean which specifies if a UI dialog is displayed which allows the event loop to be stopped. **Examples** Here is a simple example demonstrating the use of show:: >>> from mayavi import mlab >>> mlab.test_contour3d() >>> mlab.show() You can stop interaction via a simple pop up UI like so:: >>> mlab.test_contour3d() >>> mlab.show(stop=True) The decorator can be used like so:: >>> @mlab.show ... def do(): ... mlab.test_contour3d() ... >>> do() The decorator can also be passed the stop argument:: >>> @mlab.show(stop=True) ... def do(): ... mlab.test_contour3d() ... >>> do() """ global _gui, _stop_show if func is None: if not is_ui_running(): g = GUI() _gui = g if stop: _stop_show = StopShow() g.start_event_loop() return def wrapper(*args, **kw): """Wrapper function to run given function inside the GUI event loop. """ global _gui, _stop_show tk = ETSConfig.toolkit if is_ui_running(): # In this case we should not pop up the UI since we likely # don't want to stop the mainloop. return func(*args, **kw) else: g = GUI() if tk == 'wx': # Create a dummy app so invoke later works on wx. a = ApplicationWindow(size=(1, 1)) GUI.invoke_later(lambda: a.close()) a.open() GUI.invoke_later(func, *args, **kw) _gui = g if stop: # Pop up the UI to stop the mainloop. _stop_show = StopShow() g.start_event_loop() return wrapper mayavi-4.5.0/mayavi/tools/sources.py0000644000076500000240000014043312747716314020116 0ustar prabhustaff00000000000000""" Data sources classes and their associated functions for mlab. """ # Author: Gael Varoquaux # Prabhu Ramachandran # Copyright (c) 2007-2010, Enthought, Inc. # License: BSD Style. import numpy as np from traits.api import Bool, HasTraits, Instance, on_trait_change from tvtk.api import tvtk from tvtk.common import camel2enthought from mayavi.sources.array_source import ArraySource from mayavi.core.registry import registry from mayavi.core.trait_defs import ArrayNumberOrNone, ArrayOrNone from . import tools from .engine_manager import get_null_engine, engine_manager __all__ = ['vector_scatter', 'vector_field', 'scalar_scatter', 'scalar_field', 'line_source', 'array2d_source', 'grid_source', 'open', 'triangular_mesh_source', 'vertical_vectors_source', ] ############################################################################### # `MlabSource` class. ############################################################################### class MlabSource(HasTraits): """ This class represents the base class for all mlab sources. These classes allow a user to easily update the data without having to recreate the whole pipeline. """ # The TVTK dataset we manage. dataset = Instance(tvtk.DataSet) # The Mayavi data source we manage. m_data = Instance(HasTraits) ######################################## # Private traits. # Disable the update when data is changed. _disable_update = Bool(False) ###################################################################### # `MlabSource` interface. ###################################################################### def reset(self, **traits): """Function to create the data from input arrays etc. This is to be used when the size of the arrays change or the first time when the data is created. This regenerates the data structures and will be slower in general. """ raise NotImplementedError() def update(self): """Update the visualization. This is to be called after the data of the visualization has changed. """ if not self._disable_update: self.dataset.modified() md = self.m_data if md is not None: if hasattr(md, '_assign_attribute'): md._assign_attribute.update() md.data_changed = True def set(self, trait_change_notify=True, **traits): """Shortcut for setting object trait attributes. This is an overridden method that will make changing multiple traits easier. This method is to be called when the arrays have changed content but not in shape/size. In that case one must call the `reset` method. Parameters ---------- trait_change_notify : Boolean If **True** (the default), then each value assigned may generate a trait change notification. If **False**, then no trait change notifications will be generated. (see also: trait_setq) traits : list of key/value pairs Trait attributes and their values to be set Returns ------- self The method returns this object, after setting attributes. """ try: self._disable_update = True super(MlabSource, self).set(trait_change_notify, **traits) finally: self._disable_update = False if trait_change_notify: self.update() return self ###################################################################### # Non-public interface. ###################################################################### def _m_data_changed(self, ds): if not hasattr(ds, 'mlab_source'): ds.add_trait('mlab_source', Instance(MlabSource)) ds.mlab_source = self ############################################################################### # `MGlyphSource` class. ############################################################################### class MGlyphSource(MlabSource): """ This class represents a glyph data source for Mlab objects and allows the user to set the x, y, z, scalar/vector attributes. """ # The x, y, z and points of the glyphs. x = ArrayNumberOrNone y = ArrayNumberOrNone z = ArrayNumberOrNone points = ArrayOrNone # The scalars shown on the glyphs. scalars = ArrayNumberOrNone # The u, v, w components of the vector and the vectors. u = ArrayNumberOrNone v = ArrayNumberOrNone w = ArrayNumberOrNone vectors = ArrayOrNone ###################################################################### # `MlabSource` interface. ###################################################################### def reset(self, **traits): """Creates the dataset afresh or resets existing data source.""" # First convert numbers to arrays. for name in ('x', 'y', 'z', 'u', 'v', 'w', 'scalars'): if name in traits and traits[name] is not None: traits[name] = np.atleast_1d(traits[name]) # First set the attributes without really doing anything since # the notification handlers are not called. self.set(trait_change_notify=False, **traits) vectors = self.vectors scalars = self.scalars points = self.points x, y, z = self.x, self.y, self.z x = np.atleast_1d(x) y = np.atleast_1d(y) z = np.atleast_1d(z) if 'points' in traits: x = points[:, 0].ravel() y = points[:, 1].ravel() z = points[:, 2].ravel() self.set(x=x, y=y, z=z, trait_change_notify=False) else: points = np.c_[x.ravel(), y.ravel(), z.ravel()].ravel() points.shape = (-1, 3) self.set(points=points, trait_change_notify=False) u, v, w = self.u, self.v, self.w if u is not None: u = np.atleast_1d(u) v = np.atleast_1d(v) w = np.atleast_1d(w) if len(u) > 0: vectors = np.c_[u.ravel(), v.ravel(), w.ravel()].ravel() vectors.shape = (-1, 3) self.set(vectors=vectors, trait_change_notify=False) if 'vectors' in traits: u = vectors[:, 0].ravel() v = vectors[:, 1].ravel() w = vectors[:, 2].ravel() self.set(u=u, v=v, w=w, trait_change_notify=False) else: if u is not None and len(u) > 0: vectors = np.c_[u.ravel(), v.ravel(), w.ravel()].ravel() vectors.shape = (-1, 3) self.set(vectors=vectors, trait_change_notify=False) if vectors is not None and len(vectors) > 0: assert len(points) == len(vectors) if scalars is not None: scalars = np.atleast_1d(scalars) if len(scalars) > 0: assert len(points) == len(scalars.ravel()) # Create the dataset. polys = np.arange(0, len(points), 1, 'l') polys = np.reshape(polys, (len(points), 1)) if self.dataset is None: # Create new dataset if none exists pd = tvtk.PolyData() else: # Modify existing one. pd = self.dataset pd.set(points=points, polys=polys) if self.vectors is not None: pd.point_data.vectors = self.vectors pd.point_data.vectors.name = 'vectors' if self.scalars is not None: pd.point_data.scalars = self.scalars.ravel() pd.point_data.scalars.name = 'scalars' self.dataset = pd ###################################################################### # Non-public interface. ###################################################################### def _x_changed(self, x): x = np.atleast_1d(x) self.points[:, 0] = x.ravel() self.update() def _y_changed(self, y): y = np.atleast_1d(y) self.points[:, 1] = y.ravel() self.update() def _z_changed(self, z): z = np.atleast_1d(z) self.points[:, 2] = z.ravel() self.update() def _u_changed(self, u): u = np.atleast_1d(u) self.vectors[:, 0] = u.ravel() self.update() def _v_changed(self, v): v = np.atleast_1d(v) self.vectors[:, 1] = v.ravel() self.update() def _w_changed(self, w): w = np.atleast_1d(w) self.vectors[:, 2] = w.ravel() self.update() def _points_changed(self, p): p = np.atleast_2d(p) self.dataset.points = p self.update() def _scalars_changed(self, s): if s is None: self.dataset.point_data.scalars = None self.dataset.point_data.remove_array('scalars') else: s = np.atleast_1d(s) self.dataset.point_data.scalars = s.ravel() self.dataset.point_data.scalars.name = 'scalars' self.update() def _vectors_changed(self, v): self.dataset.point_data.vectors = v self.dataset.point_data.vectors.name = 'vectors' self.update() ############################################################################### # `MVerticalGlyphSource` class. ############################################################################### class MVerticalGlyphSource(MGlyphSource): """ This class represents a vertical glyph data source for Mlab objects and allows the user to set the x, y, z, scalar attributes. The vectors are created from the scalars to represent them in the vertical direction. """ def reset(self, **traits): """Creates the dataset afresh or resets existing data source.""" if 'scalars' in traits: s = traits['scalars'] if s is not None: traits['u'] = traits['v'] = np.ones_like(s), traits['w'] = s super(MVerticalGlyphSource, self).reset(**traits) def _scalars_changed(self, s): self.dataset.point_data.scalars = s self.dataset.point_data.scalars.name = 'scalars' self.set(vectors=np.c_[np.ones_like(s), np.ones_like(s), s]) self.update() ############################################################################### # `MArraySource` class. ############################################################################### class MArraySource(MlabSource): """ This class represents an array data source for Mlab objects and allows the user to set the x, y, z, scalar/vector attributes. """ # The x, y, z arrays for the volume. x = ArrayOrNone y = ArrayOrNone z = ArrayOrNone # The scalars shown on the glyphs. scalars = ArrayOrNone # The u, v, w components of the vector and the vectors. u = ArrayOrNone v = ArrayOrNone w = ArrayOrNone vectors = ArrayOrNone ###################################################################### # `MlabSource` interface. ###################################################################### def reset(self, **traits): """Creates the dataset afresh or resets existing data source.""" # First set the attributes without really doing anything since # the notification handlers are not called. self.set(trait_change_notify=False, **traits) vectors = self.vectors scalars = self.scalars x, y, z = [np.atleast_3d(a) for a in (self.x, self.y, self.z)] u, v, w = self.u, self.v, self.w if 'vectors' in traits: u = vectors[:, 0].ravel() v = vectors[:, 1].ravel() w = vectors[:, 2].ravel() self.set(u=u, v=v, w=w, trait_change_notify=False) else: if u is not None and len(u) > 0: #vectors = np.concatenate([u[..., np.newaxis], # v[..., np.newaxis], # w[..., np.newaxis] ], # axis=3) vectors = np.c_[u.ravel(), v.ravel(), w.ravel()].ravel() vectors.shape = (u.shape[0], u.shape[1], w.shape[2], 3) self.set(vectors=vectors, trait_change_notify=False) if vectors is not None and len(vectors) > 0 and scalars is not None: assert len(scalars) == len(vectors) if x.shape[0] <= 1: dx = 1 else: dx = x[1, 0, 0] - x[0, 0, 0] if y.shape[1] <= 1: dy = 1 else: dy = y[0, 1, 0] - y[0, 0, 0] if z.shape[2] <= 1: dz = 1 else: dz = z[0, 0, 1] - z[0, 0, 0] if self.m_data is None: ds = ArraySource(transpose_input_array=True) else: ds = self.m_data old_scalar = ds.scalar_data ds.set(vector_data=vectors, origin=[x.min(), y.min(), z.min()], spacing=[dx, dy, dz], scalar_data=scalars) if scalars is old_scalar: ds._scalar_data_changed(scalars) self.dataset = ds.image_data self.m_data = ds ###################################################################### # Non-public interface. ###################################################################### @on_trait_change('[x, y, z]') def _xyz_changed(self): x, y, z = self.x, self.y, self.z dx = x[1, 0, 0] - x[0, 0, 0] dy = y[0, 1, 0] - y[0, 0, 0] dz = z[0, 0, 1] - z[0, 0, 0] ds = self.dataset ds.origin = [x.min(), y.min(), z.min()] ds.spacing = [dx, dy, dz] if self.m_data is not None: self.m_data.set(origin=ds.origin, spacing=ds.spacing) self.update() def _u_changed(self, u): self.vectors[..., 0] = u self.m_data._vector_data_changed(self.vectors) def _v_changed(self, v): self.vectors[..., 1] = v self.m_data._vector_data_changed(self.vectors) def _w_changed(self, w): self.vectors[..., 2] = w self.m_data._vector_data_changed(self.vectors) def _scalars_changed(self, s): old = self.m_data.scalar_data self.m_data.scalar_data = s if old is s: self.m_data._scalar_data_changed(s) def _vectors_changed(self, v): self.m_data.vector_data = v ############################################################################### # `MLineSource` class. ############################################################################### class MLineSource(MlabSource): """ This class represents a line data source for Mlab objects and allows the user to set the x, y, z, scalar attributes. """ # The x, y, z and points of the glyphs. x = ArrayOrNone y = ArrayOrNone z = ArrayOrNone points = ArrayOrNone # The scalars shown on the glyphs. scalars = ArrayOrNone ###################################################################### # `MlabSource` interface. ###################################################################### def reset(self, **traits): """Creates the dataset afresh or resets existing data source.""" # First set the attributes without really doing anything since # the notification handlers are not called. self.set(trait_change_notify=False, **traits) points = self.points scalars = self.scalars x, y, z = self.x, self.y, self.z if 'points' in traits: x = points[:, 0].ravel() y = points[:, 1].ravel() z = points[:, 2].ravel() self.set(x=x, y=y, z=z, trait_change_notify=False) else: points = np.c_[x.ravel(), y.ravel(), z.ravel()].ravel() points.shape = (len(x), 3) self.set(points=points, trait_change_notify=False) # Create the dataset. n_pts = len(points) - 1 lines = np.zeros((n_pts, 2), 'l') lines[:, 0] = np.arange(0, n_pts - 0.5, 1, 'l') lines[:, 1] = np.arange(1, n_pts + 0.5, 1, 'l') if self.dataset is None: pd = tvtk.PolyData() else: pd = self.dataset # Avoid lines refering to non existing points: First set the # lines to None, then set the points, then set the lines # refering to the new points. pd.set(lines=None) pd.set(points=points) pd.set(lines=lines) if scalars is not None and len(scalars) > 0: assert len(x) == len(scalars) pd.point_data.scalars = np.ravel(scalars) pd.point_data.scalars.name = 'scalars' self.dataset = pd ###################################################################### # Non-public interface. ###################################################################### def _x_changed(self, x): self.points[:, 0] = x self.update() def _y_changed(self, y): self.points[:, 1] = y self.update() def _z_changed(self, z): self.points[:, 2] = z self.update() def _points_changed(self, p): self.dataset.points = p self.update() def _scalars_changed(self, s): self.dataset.point_data.scalars = s.ravel() self.dataset.point_data.scalars.name = 'scalars' self.update() ############################################################################### # `MArray2DSource` class. ############################################################################### class MArray2DSource(MlabSource): """ This class represents a 2D array data source for Mlab objects and allows the user to set the x, y and scalar attributes. """ # The x, y values. # Values of X and Y as None are accepted, in that case we would build # values of X and Y automatically from the shape of scalars x = ArrayOrNone y = ArrayOrNone # The scalars shown on the glyphs. scalars = ArrayOrNone # The masking array. mask = ArrayOrNone ###################################################################### # `MlabSource` interface. ###################################################################### def reset(self, **traits): """Creates the dataset afresh or resets existing data source.""" # First set the attributes without really doing anything since # the notification handlers are not called. self.set(trait_change_notify=False, **traits) x, y, mask = self.x, self.y, self.mask scalars = self.scalars # We may have used this without specifying x and y at all in # which case we set them from the shape of scalars. nx, ny = scalars.shape #Build X and Y from shape of Scalars if they are none if x is None and y is None: x, y = np.mgrid[-nx / 2.:nx / 2, -ny / 2.:ny / 2] if mask is not None and len(mask) > 0: scalars[mask.astype('bool')] = np.nan # The NaN trick only works with floats. scalars = scalars.astype('float') self.set(scalars=scalars, trait_change_notify=False) z = np.array([0]) self.set(x=x, y=y, z=z, trait_change_notify=False) # Do some magic to extract the first row/column, independently of # the shape of x and y x = np.atleast_2d(x.squeeze().T)[0, :].squeeze() y = np.atleast_2d(y.squeeze())[0, :].squeeze() if x.ndim == 0: dx = 1 else: dx = x[1] - x[0] if y.ndim == 0: dy = 1 else: dy = y[1] - y[0] if self.m_data is None: ds = ArraySource(transpose_input_array=True) else: ds = self.m_data old_scalar = ds.scalar_data ds.set(origin=[x.min(), y.min(), 0], spacing=[dx, dy, 1], scalar_data=scalars) if old_scalar is scalars: ds._scalar_data_changed(scalars) self.dataset = ds.outputs[0] self.m_data = ds ##################################################################### # Non-public interface. ##################################################################### @on_trait_change('[x, y]') def _xy_changed(self): x, y, scalars = self.x, self.y, self.scalars nx, ny = scalars.shape if x is None or y is None: x, y = np.mgrid[-nx / 2.:nx / 2, -ny / 2.:ny / 2] self.trait_setq(x=x, y=y) x = np.atleast_2d(x.squeeze().T)[0, :].squeeze() y = np.atleast_2d(y.squeeze())[0, :].squeeze() dx = x[1] - x[0] dy = y[1] - y[0] ds = self.dataset ds.origin = [x.min(), y.min(), 0] ds.spacing = [dx, dy, 1] if self.m_data is not None: self.m_data.set(origin=ds.origin, spacing=ds.spacing) self.update() def _scalars_changed(self, s): mask = self.mask if mask is not None and len(mask) > 0: s[mask.astype('bool')] = np.nan # The NaN tric only works with floats. s = s.astype('float') self.set(scalars=s, trait_change_notify=False) old = self.m_data.scalar_data self.m_data.scalar_data = s if s is old: self.m_data._scalar_data_changed(s) ############################################################################## # `MGridSource` class. ############################################################################## class MGridSource(MlabSource): """ This class represents a grid source for Mlab objects and allows the user to set the x, y, scalar attributes. """ # The x, y, z and points of the grid. x = ArrayOrNone y = ArrayOrNone z = ArrayOrNone points = ArrayOrNone # The scalars shown on the glyphs. scalars = ArrayOrNone # The masking array. mask = ArrayOrNone ###################################################################### # `MlabSource` interface. ###################################################################### def reset(self, **traits): """Creates the dataset afresh or resets existing data source.""" # First set the attributes without really doing anything since # the notification handlers are not called. self.set(trait_change_notify=False, **traits) points = self.points scalars = self.scalars x, y, z, mask = self.x, self.y, self.z, self.mask if mask is not None and len(mask) > 0: scalars[mask.astype('bool')] = np.nan # The NaN trick only works with floats. scalars = scalars.astype('float') self.set(scalars=scalars, trait_change_notify=False) assert len(x.shape) == 2, "Array x must be 2 dimensional." assert len(y.shape) == 2, "Array y must be 2 dimensional." assert len(z.shape) == 2, "Array z must be 2 dimensional." assert x.shape == y.shape, "Arrays x and y must have same shape." assert y.shape == z.shape, "Arrays y and z must have same shape." # Points in the grid source will always be created using x,y,z # Changing of points is not allowed because it cannot be used to # modify values of x,y,z nx, ny = x.shape points = np.c_[x.ravel(), y.ravel(), z.ravel()].ravel() points.shape = (nx * ny, 3) self.set(points=points, trait_change_notify=False) i, j = np.mgrid[0:nx - 1, 0:ny - 1] i, j = np.ravel(i), np.ravel(j) t1 = i * ny + j, (i + 1) * ny + j, (i + 1) * ny + (j + 1) t2 = (i + 1) * ny + (j + 1), i * ny + (j + 1), i * ny + j nt = len(t1[0]) triangles = np.zeros((nt * 2, 3), 'l') triangles[0:nt, 0], triangles[0:nt, 1], triangles[0:nt, 2] = t1 triangles[nt:, 0], triangles[nt:, 1], triangles[nt:, 2] = t2 if self.dataset is None: pd = tvtk.PolyData() else: pd = self.dataset pd.set(points=points, polys=triangles) if scalars is not None and len(scalars) > 0: if not scalars.flags.contiguous: scalars = scalars.copy() self.set(scalars=scalars, trait_change_notify=False) assert x.shape == scalars.shape pd.point_data.scalars = scalars.ravel() pd.point_data.scalars.name = 'scalars' self.dataset = pd ###################################################################### # Non-public interface. ###################################################################### def _x_changed(self, x): self.trait_setq(x=x) self.points[:, 0] = x.ravel() self.update() def _y_changed(self, y): self.trait_setq(y=y) self.points[:, 1] = y.ravel() self.update() def _z_changed(self, z): self.trait_setq(z=z) self.points[:, 2] = z.ravel() self.update() def _points_changed(self, p): self.dataset.points = p self.update() def _scalars_changed(self, s): mask = self.mask if mask is not None and len(mask) > 0: s[mask.astype('bool')] = np.nan # The NaN tric only works with floats. s = s.astype('float') self.set(scalars=s, trait_change_notify=False) self.dataset.point_data.scalars = s.ravel() self.dataset.point_data.scalars.name = 'scalars' self.update() ############################################################################### # `MTriangularMeshSource` class. ############################################################################### class MTriangularMeshSource(MlabSource): """ This class represents a triangular mesh source for Mlab objects and allows the user to set the x, y, scalar attributes. """ # The x, y, z and points of the grid. x = ArrayOrNone y = ArrayOrNone z = ArrayOrNone points = ArrayOrNone triangles = ArrayOrNone # The scalars shown on the glyphs. scalars = ArrayOrNone ###################################################################### # `MlabSource` interface. ###################################################################### def reset(self, **traits): """Creates the dataset afresh or resets existing data source.""" # First set the attributes without really doing anything since # the notification handlers are not called. self.set(trait_change_notify=False, **traits) points = self.points scalars = self.scalars x, y, z = self.x, self.y, self.z points = np.c_[x.ravel(), y.ravel(), z.ravel()].ravel() points.shape = (-1, 3) self.set(points=points, trait_change_notify=False) triangles = self.triangles assert triangles.shape[1] == 3, \ "The shape of the triangles array must be (X, 3)" assert triangles.max() < len(points), \ "The triangles indices must be smaller that the number of points" assert triangles.min() >= 0, \ "The triangles indices must be positive or null" if self.dataset is None: pd = tvtk.PolyData() else: pd = self.dataset # Set the points first, and the triangles after: so that the # polygone can refer to the right points, in the polydata. pd.set(points=points) pd.set(polys=triangles) if (not 'scalars' in traits and scalars is not None and scalars.shape != x.shape): # The scalars where set probably automatically to z, by the # factory. We need to reset them, as the size has changed. scalars = z if scalars is not None and len(scalars) > 0: if not scalars.flags.contiguous: scalars = scalars.copy() self.set(scalars=scalars, trait_change_notify=False) assert x.shape == scalars.shape pd.point_data.scalars = scalars.ravel() pd.point_data.scalars.name = 'scalars' self.dataset = pd ###################################################################### # Non-public interface. ###################################################################### def _x_changed(self, x): self.trait_setq(x=x) self.points[:, 0] = x.ravel() self.update() def _y_changed(self, y): self.trait_setq(y=y) self.points[:, 1] = y.ravel() self.update() def _z_changed(self, z): self.trait_setq(z=z) self.points[:, 2] = z.ravel() self.update() def _points_changed(self, p): self.dataset.points = p self.update() def _scalars_changed(self, s): self.dataset.point_data.scalars = s.ravel() self.dataset.point_data.scalars.name = 'scalars' self.update() def _triangles_changed(self, triangles): if triangles.min() < 0: raise ValueError('The triangles array has negative values') if triangles.max() > self.x.size: raise ValueError('The triangles array has values larger than' \ 'the number of points') self.dataset.polys = triangles self.update() ############################################################################ # Argument processing ############################################################################ def convert_to_arrays(args): """ Converts a list of iterables to a list of arrays or callables, if needed. """ args = list(args) for index, arg in enumerate(args): if not callable(arg): if not hasattr(arg, 'shape'): arg = np.array(arg) arg = np.atleast_1d(arg) if np.any(np.isinf(arg)): raise ValueError("""Input array contains infinite values You can remove them using: a[np.isinf(a)] = np.nan """) args[index] = arg return args def process_regular_vectors(*args): """ Converts different signatures to (x, y, z, u, v, w). """ args = convert_to_arrays(args) if len(args) == 3: u, v, w = [np.atleast_3d(a) for a in args] assert len(u.shape) == 3, "3D array required" x, y, z = np.indices(u.shape) elif len(args) == 6: x, y, z, u, v, w = args elif len(args) == 4: x, y, z, f = args if not callable(f): raise ValueError("When 4 arguments are provided, the fourth must " "be a callable") u, v, w = f(x, y, z) else: raise ValueError("wrong number of arguments") assert (x.shape == y.shape and y.shape == z.shape and u.shape == z.shape and v.shape == u.shape and w.shape == v.shape), "argument shape are not equal" return x, y, z, u, v, w def process_regular_scalars(*args): """ Converts different signatures to (x, y, z, s). """ args = convert_to_arrays(args) if len(args) == 1: s = np.atleast_3d(args[0]) assert len(s.shape) == 3, "3D array required" x, y, z = np.indices(s.shape) elif len(args) == 3: x, y, z = args s = None elif len(args) == 4: x, y, z, s = args if callable(s): s = s(x, y, z) else: raise ValueError("wrong number of arguments") assert (x.shape == y.shape and y.shape == z.shape and (s is None or s.shape == z.shape)), "argument shape are not equal" return x, y, z, s def process_regular_2d_scalars(*args, **kwargs): """ Converts different signatures to (x, y, s). """ args = convert_to_arrays(args) for index, arg in enumerate(args): if not callable(arg): args[index] = np.atleast_2d(arg) if len(args) == 1: s = args[0] assert len(s.shape) == 2, "2D array required" x, y = np.indices(s.shape) elif len(args) == 3: x, y, s = args if callable(s): s = s(x, y) else: raise ValueError("wrong number of arguments") assert len(s.shape) == 2, "2D array required" if 'mask' in kwargs: mask = kwargs['mask'] s[mask.astype('bool')] = np.nan # The NaN tric only works with floats. s = s.astype('float') return x, y, s ############################################################################ # Sources ############################################################################ def vector_scatter(*args, **kwargs): """ Creates scattered vector data. **Function signatures**:: vector_scatter(u, v, w, ...) vector_scatter(x, y, z, u, v, w, ...) vector_scatter(x, y, z, f, ...) If only 3 arrays u, v, w are passed the x, y and z arrays are assumed to be made from the indices of vectors. If 4 positional arguments are passed the last one must be a callable, f, that returns vectors. **Keyword arguments**: :name: the name of the vtk object created. :scalars: optional scalar data. :figure: optionally, the figure on which to add the data source. If None, the source is not added to any figure, and will be added automatically by the modules or filters. If False, no figure will be created by modules or filters applied to the source: the source can only be used for testing, or numerical algorithms, not visualization.""" x, y, z, u, v, w = process_regular_vectors(*args) scalars = kwargs.pop('scalars', None) if scalars is not None: scalars = np.ravel(scalars) name = kwargs.pop('name', 'VectorScatter') data_source = MGlyphSource() data_source.reset(x=x, y=y, z=z, u=u, v=v, w=w, scalars=scalars) ds = tools.add_dataset(data_source.dataset, name, **kwargs) data_source.m_data = ds return ds def vector_field(*args, **kwargs): """ Creates vector field data. **Function signatures**:: vector_field(u, v, w, ...) vector_field(x, y, z, u, v, w, ...) vector_field(x, y, z, f, ...) If only 3 arrays u, v, w are passed the x, y and z arrays are assumed to be made from the indices of vectors. If the x, y and z arrays are passed, they should have been generated by `numpy.mgrid` or `numpy.ogrid`. The function builds a scalar field assuming the points are regularily spaced on an orthogonal grid. If 4 positional arguments are passed the last one must be a callable, f, that returns vectors. **Keyword arguments**: :name: the name of the vtk object created. :scalars: optional scalar data. :figure: optionally, the figure on which to add the data source. If None, the source is not added to any figure, and will be added automatically by the modules or filters. If False, no figure will be created by modules or filters applied to the source: the source can only be used for testing, or numerical algorithms, not visualization.""" if len(args) == 3: x = y = z = np.atleast_3d(1) u, v, w = [np.atleast_3d(a) for a in args] else: x, y, z, u, v, w = [np.atleast_3d(a) for a in process_regular_vectors(*args)] scalars = kwargs.pop('scalars', None) if scalars is not None: scalars = np.atleast_3d(scalars) data_source = MArraySource() data_source.reset(x=x, y=y, z=z, u=u, v=v, w=w, scalars=scalars) name = kwargs.pop('name', 'VectorField') return tools.add_dataset(data_source.m_data, name, **kwargs) def scalar_scatter(*args, **kwargs): """ Creates scattered scalar data. **Function signatures**:: scalar_scatter(s, ...) scalar_scatter(x, y, z, s, ...) scalar_scatter(x, y, z, s, ...) scalar_scatter(x, y, z, f, ...) If only 1 array s is passed the x, y and z arrays are assumed to be made from the indices of vectors. If 4 positional arguments are passed the last one must be an array s, or a callable, f, that returns an array. **Keyword arguments**: :name: the name of the vtk object created. :figure: optionally, the figure on which to add the data source. If None, the source is not added to any figure, and will be added automatically by the modules or filters. If False, no figure will be created by modules or filters applied to the source: the source can only be used for testing, or numerical algorithms, not visualization.""" x, y, z, s = process_regular_scalars(*args) if s is not None: s = np.ravel(s) data_source = MGlyphSource() data_source.reset(x=x, y=y, z=z, scalars=s) name = kwargs.pop('name', 'ScalarScatter') ds = tools.add_dataset(data_source.dataset, name, **kwargs) data_source.m_data = ds return ds def scalar_field(*args, **kwargs): """ Creates a scalar field data. **Function signatures**:: scalar_field(s, ...) scalar_field(x, y, z, s, ...) scalar_field(x, y, z, f, ...) If only 1 array s is passed the x, y and z arrays are assumed to be made from the indices of arrays. If the x, y and z arrays are passed they are supposed to have been generated by `numpy.mgrid`. The function builds a scalar field assuming the points are regularily spaced. If 4 positional arguments are passed the last one must be an array s, or a callable, f, that returns an array. **Keyword arguments**: :name: the name of the vtk object created. :figure: optionally, the figure on which to add the data source. If None, the source is not added to any figure, and will be added automatically by the modules or filters. If False, no figure will be created by modules or filters applied to the source: the source can only be used for testing, or numerical algorithms, not visualization.""" if len(args) == 1: # Be lazy, don't create three big arrays for 1 input array. The # MArraySource is clever-enough to handle flat arrays x = y = z = np.atleast_1d(1) s = args[0] else: x, y, z, s = process_regular_scalars(*args) data_source = MArraySource() data_source.reset(x=x, y=y, z=z, scalars=s) name = kwargs.pop('name', 'ScalarField') return tools.add_dataset(data_source.m_data, name, **kwargs) def line_source(*args, **kwargs): """ Creates line data. **Function signatures**:: line_source(x, y, z, ...) line_source(x, y, z, s, ...) line_source(x, y, z, f, ...) If 4 positional arguments are passed the last one must be an array s, or a callable, f, that returns an array. **Keyword arguments**: :name: the name of the vtk object created. :figure: optionally, the figure on which to add the data source. If None, the source is not added to any figure, and will be added automatically by the modules or filters. If False, no figure will be created by modules or filters applied to the source: the source can only be used for testing, or numerical algorithms, not visualization.""" if len(args) == 1: raise ValueError("wrong number of arguments") x, y, z, s = process_regular_scalars(*args) data_source = MLineSource() data_source.reset(x=x, y=y, z=z, scalars=s) name = kwargs.pop('name', 'LineSource') ds = tools.add_dataset(data_source.dataset, name, **kwargs) data_source.m_data = ds return ds def array2d_source(*args, **kwargs): """ Creates structured 2D data from a 2D array. **Function signatures**:: array2d_source(s, ...) array2d_source(x, y, s, ...) array2d_source(x, y, f, ...) If 3 positional arguments are passed the last one must be an array s, or a callable, f, that returns an array. x and y give the coordinnates of positions corresponding to the s values. x and y can be 1D or 2D arrays (such as returned by numpy.ogrid or numpy.mgrid), but the points should be located on an orthogonal grid (possibly non-uniform). In other words, all the points sharing a same index in the s array need to have the same x or y value. If only 1 array s is passed the x and y arrays are assumed to be made from the indices of arrays, and an uniformly-spaced data set is created. **Keyword arguments**: :name: the name of the vtk object created. :figure: optionally, the figure on which to add the data source. If None, the source is not added to any figure, and will be added automatically by the modules or filters. If False, no figure will be created by modules or filters applied to the source: the source can only be used for testing, or numerical algorithms, not visualization. :mask: Mask points specified in a boolean masking array. """ data_source = MArray2DSource() mask = kwargs.pop('mask', None) if len(args) == 1: args = convert_to_arrays(args) s = np.atleast_2d(args[0]) data_source.reset(scalars=s, mask=mask) else: x, y, s = process_regular_2d_scalars(*args, **kwargs) data_source.reset(x=x, y=y, scalars=s, mask=mask) name = kwargs.pop('name', 'Array2DSource') return tools.add_dataset(data_source.m_data, name, **kwargs) def grid_source(x, y, z, **kwargs): """ Creates 2D grid data. x, y, z are 2D arrays giving the positions of the vertices of the surface. The connectivity between these points is implied by the connectivity on the arrays. For simple structures (such as orthogonal grids) prefer the array2dsource function, as it will create more efficient data structures. **Keyword arguments**: :name: the name of the vtk object created. :scalars: optional scalar data. :figure: optionally, the figure on which to add the data source. If None, the source is not added to any figure, and will be added automatically by the modules or filters. If False, no figure will be created by modules or filters applied to the source: the source can only be used for testing, or numerical algorithms, not visualization. :mask: Mask points specified in a boolean masking array. """ scalars = kwargs.pop('scalars', None) if scalars is None: scalars = z mask = kwargs.pop('mask', None) x, y, z, scalars = convert_to_arrays((x, y, z, scalars)) data_source = MGridSource() data_source.reset(x=x, y=y, z=z, scalars=scalars, mask=mask) name = kwargs.pop('name', 'GridSource') ds = tools.add_dataset(data_source.dataset, name, **kwargs) data_source.m_data = ds return ds def vertical_vectors_source(*args, **kwargs): """ Creates a set of vectors pointing upward, useful eg for bar graphs. **Function signatures**:: vertical_vectors_source(s, ...) vertical_vectors_source(x, y, s, ...) vertical_vectors_source(x, y, f, ...) vertical_vectors_source(x, y, z, s, ...) vertical_vectors_source(x, y, z, f, ...) If only one positional argument is passed, it can be a 1D, 2D, or 3D array giving the length of the vectors. The positions of the data points are deducted from the indices of array, and an uniformly-spaced data set is created. If 3 positional arguments (x, y, s) are passed the last one must be an array s, or a callable, f, that returns an array. x and y give the 2D coordinates of positions corresponding to the s values. The vertical position is assumed to be 0. If 4 positional arguments (x, y, z, s) are passed, the 3 first are arrays giving the 3D coordinates of the data points, and the last one is an array s, or a callable, f, that returns an array giving the data value. **Keyword arguments**: :name: the name of the vtk object created. :figure: optionally, the figure on which to add the data source. If None, the source is not added to any figure, and will be added automatically by the modules or filters. If False, no figure will be created by modules or filters applied to the source: the source can only be used for testing, or numerical algorithms, not visualization. """ if len(args) == 3: x, y, data = args if np.isscalar(x): z = 0 else: z = np.zeros_like(x) args = (x, y, z, data) x, y, z, s = process_regular_scalars(*args) if s is not None: s = np.ravel(s) data_source = MVerticalGlyphSource() data_source.reset(x=x, y=y, z=z, scalars=s) name = kwargs.pop('name', 'VerticalVectorsSource') ds = tools.add_dataset(data_source.dataset, name, **kwargs) data_source.m_data = ds return ds def triangular_mesh_source(x, y, z, triangles, **kwargs): """ Creates 2D mesh by specifying points and triangle connectivity. x, y, z are 2D arrays giving the positions of the vertices of the surface. The connectivity between these points is given by listing triplets of vertices inter-connected. These vertices are designed by there position index. **Keyword arguments**: :name: the name of the vtk object created. :scalars: optional scalar data. :figure: optionally, the figure on which to add the data source. If None, the source is not added to any figure, and will be added automatically by the modules or filters. If False, no figure will be created by modules or filters applied to the source: the source can only be used for testing, or numerical algorithms, not visualization. """ x, y, z, triangles = convert_to_arrays((x, y, z, triangles)) if triangles.min() < 0: raise ValueError('The triangles array has negative values') if triangles.max() > x.size: raise ValueError('The triangles array has values larger than' \ 'the number of points') scalars = kwargs.pop('scalars', None) if scalars is None: scalars = z data_source = MTriangularMeshSource() data_source.reset(x=x, y=y, z=z, triangles=triangles, scalars=scalars) name = kwargs.pop('name', 'TriangularMeshSource') ds = tools.add_dataset(data_source.dataset, name, **kwargs) data_source.m_data = ds return ds def open(filename, figure=None): """Open a supported data file given a filename. Returns the source object if a suitable reader was found for the file. If 'figure' is False, no view is opened, and the code does not need GUI or openGL context. """ if figure is None: engine = tools.get_engine() elif figure is False: # Get a null engine that we can use. engine = get_null_engine() else: engine = engine_manager.find_figure_engine(figure) engine.current_scene = figure src = engine.open(filename) return src ############################################################################ # Automatically generated sources from registry. ############################################################################ def _create_data_source(metadata): """Creates a data source and adds it to the mayavi engine given metadata of the source. Returns the created source. """ factory = metadata.get_callable() src = factory() engine = tools.get_engine() engine.add_source(src) return src def _make_functions(namespace): """Make the automatic functions and add them to the namespace.""" for src in registry.sources: if len(src.extensions) == 0: func_name = camel2enthought(src.id) if func_name.endswith('_source'): func_name = func_name[:-7] func = lambda metadata=src: _create_data_source(metadata) func.__doc__ = src.help func.__name__ = func_name # Inject function into the namespace and __all__. namespace[func_name] = func __all__.append(func_name) _make_functions(locals()) mayavi-4.5.0/mayavi/tools/static/0000755000076500000240000000000012747722127017342 5ustar prabhustaff00000000000000mayavi-4.5.0/mayavi/tools/static/x3d/0000755000076500000240000000000012747722127020040 5ustar prabhustaff00000000000000mayavi-4.5.0/mayavi/tools/static/x3d/LICENSE.txt0000644000076500000240000000430312747716314021664 0ustar prabhustaff00000000000000Dual licensed under the MIT and GPL licenses. ==[MIT]==================================================================== Copyright (c) 2009 X3DOM Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ==[GPL]==================================================================== X3DOM - Declarative 3D for HTML Copyright (C) 2009 X3DOM 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 . mayavi-4.5.0/mayavi/tools/static/x3d/x3dom.css0000644000076500000240000001462712747716314021617 0ustar prabhustaff00000000000000/* * X3DOM JavaScript Library * http://www.x3dom.org * * (C)2009 Fraunhofer IGD, Darmstadt, Germany * Dual licensed under the MIT and GPL * * Based on code originally provided by * Philip Taylor: http://philip.html5.org */ X3D, x3d { position:relative; /* in order to be able to position stat-div within X3D */ float:left; /* float the element so it has the same size like the canvas */ cursor:pointer; margin: 0; padding: 0; border: 1px solid #000; } object { margin: 0; padding: 0; border: none; z-index: 0; width:100%; height:100%; float:left; } X3D:hover, x3d:hover, .x3dom-canvas:hover { -webkit-user-select: none; -webkit-touch-callout: none; } .x3dom-canvas { border:none; cursor:pointer; cursor:-webkit-grab; cursor:grab; width:100%; height:100%; float:left; } .x3dom-canvas-mousedown { cursor:-webkit-grabbing; cursor:grabbing; } .x3dom-canvas:focus { outline:none; } .x3dom-progress { margin: 0; padding: 6px 8px 0px 26px; left: 0px; top: 0px; position: absolute; color: #0f0; font-family: Helvetica, sans-serif; line-height:10px; font-size: 10px; min-width: 45px; min-height: 20px; border: 0px; background-position: 4px 4px; background-repeat: no-repeat; background-color: #333; background-color: rgba(51, 51, 51, 0.9); z-index: 100; background-image: url('data:image/gif;base64,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'); } .x3dom-progress.bar span { position: absolute; left: 0; top: 0; line-height: 20px; background-color: red; } .x3dom-statdiv { margin: 0; padding: 0; right: 10px; top: 10px; position: absolute; color: #0f0; font-family: Helvetica, sans-serif; line-height:10px; font-size: 10px; width: 75px; height: 70px; border: 0px; } #x3dom-state-canvas { margin: 2px; padding: 0; right: 0%; top: 0%; position: absolute; } #x3dom-state-viewer { position: absolute; margin: 2px; padding: 5px; width: 135px; top: 0%; right: 0%; opacity: 0.9; background-color: #323232; z-index: 1000; font-family: Arial, sans-serif; color: #C8C8C8; font-weight: bold; text-transform: uppercase; cursor: help; } .x3dom-states-head { display: block; font-size: 26px; } .x3dom-states-rendermode-software { font-size: 10px; margin: 0 0 2px 2px; } .x3dom-states-rendermode-hardware { font-size: 10px; margin: 0 0 2px 2px; } .x3dom-states-head2 { font-size: 10px; } .x3dom-states-list { float: left; width: 100%; border-top: 1px solid #C8C8C8; list-style: none; font-size: 9px; line-height: 16px; margin:0; padding: 0; padding-top: 2px; } .x3dom-states-item { width: 100%; float: left; } .x3dom-states-item-title { float: left; margin-left: 2px; } .x3dom-states-item-value { float: right; margin-right: 2px; } .x3dom-touch-marker { display: inline; padding: 5px; border-radius: 10px; position: absolute; font-family: Helvetica, sans-serif; line-height:10px; font-size: 10px; color: darkorange; background: cornsilk; opacity: 0.6; border: 2px solid orange; z-index: 200; } .x3dom-logContainer { border: 2px solid olivedrab; height: 200px; padding: 4px; overflow: auto; white-space: pre-wrap; font-family: sans-serif; font-size: x-small; color: #00ff00; background-color: black; margin-right: 10px; } .x3dom-nox3d { font-family: Helvetica, sans-serif; font-size: 14px; background-color: #eb7a7a; padding: 1em; opacity: 0.75; } .x3dom-nox3d p { color: #fff; font-size: 14px; } .x3dom-nox3d a { color: #fff; font-size: 14px; } /* self-clearing floats */ .group:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; } mayavi-4.5.0/mayavi/tools/static/x3d/x3dom.js0000644000076500000240000347103312747716314021444 0ustar prabhustaff00000000000000/** X3DOM Runtime, http://www.x3dom.org/ 1.7.1 - 27d2b19b572f365b32d12cd9883e4bf894e60cef - Tue Jan 5 13:25:24 2016 +0100 */ if(!Array.forEach){Array.forEach=function(array,fun,thisp){var len=array.length;for(var i=0;ix3dom.debug.maxLinesToLog){return;} var node=document.createElement("p");node.style.margin=0;switch(logType){case x3dom.debug.INFO:node.style.color="#00ff00";break;case x3dom.debug.WARNING:node.style.color="#cd853f";break;case x3dom.debug.ERROR:node.style.color="#ff4500";break;case x3dom.debug.EXCEPTION:node.style.color="#ffff00";break;default:node.style.color="#00ff00";break;} try{node.innerHTML=logType+": "+msg;x3dom.debug.logContainer.insertBefore(node,x3dom.debug.logContainer.firstChild);}catch(err){if(window.console.firebug!==undefined){window.console.warn(msg);}} if(x3dom.debug.isFirebugAvailable){switch(logType){case x3dom.debug.INFO:window.console.info(msg);break;case x3dom.debug.WARNING:window.console.warn(msg);break;case x3dom.debug.ERROR:window.console.error(msg);break;case x3dom.debug.EXCEPTION:window.console.debug(msg);break;default:break;}} x3dom.debug.numLinesLogged++;},logInfo:function(msg){x3dom.debug.doLog(msg,x3dom.debug.INFO);},logWarning:function(msg){x3dom.debug.doLog(msg,x3dom.debug.WARNING);},logError:function(msg){x3dom.debug.doLog(msg,x3dom.debug.ERROR);},logException:function(msg){x3dom.debug.doLog(msg,x3dom.debug.EXCEPTION);},assert:function(c,msg){if(!c){x3dom.debug.doLog("Assertion failed in "+ x3dom.debug.assert.caller.name+': '+ msg,x3dom.debug.ERROR);}},typeOf:function(obj){var type=typeof obj;return type==="object"&&!obj?"null":type;},exists:function(obj,name,type){type=type||"function";return(obj?this.typeOf(obj[name]):"null")===type;},dumpFields:function(node){var str="";for(var fName in node){str+=(fName+", ");} str+='\n';x3dom.debug.logInfo(str);return str;}};x3dom.debug.setup();x3dom.arc={};x3dom.arc.instance=null;x3dom.arc.Limits=function(min,max,initial) {this._min=min;this._max=max;this.getValue=function(value) {value=this._min+(this._max-this._min)*value;return this._max>=value?(this._min<=value?value:this._min):this._max;};};x3dom.arc.ARF=function(name,min,max,dirFac,factorGetterFunc,factorSetterFunc,getterFunc,setterFunc) {this._name=name;this._stateValue=[0.5,0.5];this._limits=new x3dom.arc.Limits(min,max);this._factorGetterFunc=factorGetterFunc;this._factorSetterFunc=factorSetterFunc;this._setterFunc=setterFunc;this._getterFunc=getterFunc;this._dirFac=dirFac;this.getFactor=function() {return this._factorGetterFunc();};this.update=function(state,step) {var stateVal=this._stateValue[state]+step*this._dirFac;this._stateValue[state]=0<=stateVal?(1>=stateVal?stateVal:1):0;this._setterFunc(this._limits.getValue(this._stateValue[state]));};this.reset=function() {this._stateValue[0]=0.5;this._stateValue[1]=0.5;};};x3dom.arc.AdaptiveRenderControl=defineClass(null,function(scene) {x3dom.arc.instance=this;this._scene=scene;this._targetFrameRate=[];this._targetFrameRate[0]=this._scene._vf.minFrameRate;this._targetFrameRate[1]=this._scene._vf.maxFrameRate;this._currentState=0;var that=this;var environment=that._scene.getEnvironment();this._arfs=[];this._arfs.push(new x3dom.arc.ARF("smallFeatureCulling",0,10,-1,function() {return environment._vf.smallFeatureFactor;},function(value) {environment._vf.smallFeatureFactor=value;},function() {return environment._vf.smallFeatureThreshold;},function(value) {environment._vf.smallFeatureThreshold=value;}));this._arfs.push(new x3dom.arc.ARF("lowPriorityCulling",0,100,1,function() {return environment._vf.lowPriorityFactor;},function(value) {environment._vf.lowPriorityFactor=value;},function() {return environment._vf.lowPriorityThreshold*100;},function(value) {environment._vf.lowPriorityThreshold=value/100;}));this._arfs.push(new x3dom.arc.ARF("tessellationDetailCulling",1,12,-1,function() {return environment._vf.tessellationErrorFactor;},function(value) {environment._vf.tessellationErrorFactor=value;},function() {return environment.tessellationErrorThreshold;},function(value) {environment.tessellationErrorThreshold=value;}));this._stepWidth=0.1;},{update:function(state,fps) {this._currentState=state;var delta=fps-this._targetFrameRate[state];this._stepWidth=Math.abs(delta)>10?0.1:0.01;var factorSum=0;var normFactors=[];var i,n=this._arfs.length;for(i=0;i0) factorSum+=normFactors[i];} var dirFac=delta<0?-1:1;for(i=0;i0) {normFactors[i]/=factorSum;this._arfs[i].update(state,this._stepWidth*normFactors[i]*dirFac);}}},reset:function() {for(var i=0,n=this._arfs.length;i1) {var pixels=parts.colorMap.getPixels();for(i=0;i1) {var diffuseColors=[];for(i=0;i1) {var pixels=parts.emissiveMap.getPixels();for(i=0;i1) {var emissiveColors=[];for(i=0;i1) {var pixels=parts.specularMap.getPixels();for(i=0;i1) {var specularColors=[];for(i=0;i1) {var pixels=parts.colorMap.getPixels();for(i=0;i1) {var transparencies=[];for(i=0;i1) {var pixels=parts.specularMap.getPixels();for(i=0;i1) {var shininesses=[];for(i=0;i1) {var pixels=parts.emissiveMap.getPixels();for(i=0;i1) {var ambientIntensities=[];for(i=0;i1) {var dtPixels=parts.colorMap.getPixels();var eaPixels=parts.emissiveMap.getPixels();var ssPixels=parts.specularMap.getPixels();dtColor=new x3dom.fields.SFColorRGBA(0,0,0,1.0);eaColor=new x3dom.fields.SFColorRGBA(color.r,color.g,color.b,0);ssColor=new x3dom.fields.SFColorRGBA(0,0,0,0);for(i=0;i1) {var dtPixels=parts.colorMap.getPixels();var eaPixels=parts.emissiveMap.getPixels();var ssPixels=parts.specularMap.getPixels();for(i=0;i1) {var dtPixels=parts.colorMap.getPixels();var eaPixels=parts.emissiveMap.getPixels();var ssPixels=parts.specularMap.getPixels();for(i=0;i1)){x=parts.ids[0]%parts.colorMap.getWidth();y=Math.floor(parts.ids[0]/parts.colorMap.getWidth());var pixel=parts.visibilityMap.getPixel(x,y);visibilityAsInt=(visibility)?1:0;if(pixel.r!=visibilityAsInt){pixel.r=visibilityAsInt;this.multiPart._partVisibility[parts.ids[0]]=visibility;usage=this.multiPart._idMap.mapping[parts.ids[0]].usage;for(j=0;j0){visibleCount.val--;} if(visibleCount.val){this.multiPart._inlineNamespace.defMap[usage[j]]._vf.render=true;}else{this.multiPart._inlineNamespace.defMap[usage[j]]._vf.render=false;}}} parts.visibilityMap.setPixel(x,y,pixel);this.multiPart.invalidateVolume();} else {var pixels=parts.visibilityMap.getPixels();for(i=0;i0){visibleCount.val--;} if(visibleCount.val){this.multiPart._inlineNamespace.defMap[usage[j]]._vf.render=true;}else{this.multiPart._inlineNamespace.defMap[usage[j]]._vf.render=false;}}}} parts.visibilityMap.setPixels(pixels);this.multiPart.invalidateVolume();}};this.getVolume=function(){var volume;var transmat=this.multiPart.getCurrentTransform();if(ids.length&&ids.length>1) {volume=new x3dom.fields.BoxVolume();for(var i=0;i1){node.prev.next=node.next;node.next.prev=node.prev;if(node==this.first){this.first=node.next;} if(node==this.last){this.last=node.prev;}}else{this.first=null;this.last=null;} node.prev=null;node.next=null;this.length--;};x3dom.DoublyLinkedList.prototype.getNode=function(index){var node=null;if(index>this.length){return node;} for(var i=0;i80*dim){minX=maxX=data[0];minY=maxY=data[1];for(var i=dim;imaxX)maxX=x;if(y>maxY)maxY=y;} size=Math.max(maxX-minX,maxY-minY);} earcutLinked(outerNode,triangles,dim,minX,minY,size);if(clockwise===false){triangles.reverse();} return triangles;} function windingOrder(data,start,end,dim){var sum=0;for(i=start,j=end-dim;i0;} function linkedList(data,start,end,dim,clockwise,oclockwise){var i,j,last;if(clockwise===oclockwise){for(i=start;i=start;i-=dim)last=insertNode(i,data[i],data[i+1],last);} return last;} function filterPoints(start,end){if(!start)return start;if(!end)end=start;var p=start,again;do{again=false;if(!p.steiner&&(equals(p,p.next)||area(p.prev,p,p.next)===0)){removeNode(p);p=end=p.prev;if(p===p.next)return null;again=true;}else{p=p.next;}}while(again||p!==end);return end;} function earcutLinked(ear,triangles,dim,minX,minY,size,pass){if(!ear)return;if(!pass&&size)indexCurve(ear,minX,minY,size);var stop=ear,prev,next;while(ear.prev!==ear.next){prev=ear.prev;next=ear.next;if(size?isEarHashed(ear,minX,minY,size):isEar(ear)){triangles.push(prev.i/dim);triangles.push(ear.i/dim);triangles.push(next.i/dim);removeNode(ear);ear=next.next;stop=next.next;continue;} ear=next;if(ear===stop){if(!pass){earcutLinked(filterPoints(ear),triangles,dim,minX,minY,size,1);}else if(pass===1){ear=cureLocalIntersections(ear,triangles,dim);earcutLinked(ear,triangles,dim,minX,minY,size,2);}else if(pass===2){splitEarcut(ear,triangles,dim,minX,minY,size);} break;}}} function isEar(ear){var a=ear.prev,b=ear,c=ear.next;if(area(a,b,c)>=0)return false;var p=ear.next.next;while(p!==ear.prev){if(pointInTriangle(a.x,a.y,b.x,b.y,c.x,c.y,p.x,p.y)&&area(p.prev,p,p.next)>=0)return false;p=p.next;} return true;} function isEarHashed(ear,minX,minY,size){var a=ear.prev,b=ear,c=ear.next;if(area(a,b,c)>=0)return false;var minTX=a.xb.x?(a.x>c.x?a.x:c.x):(b.x>c.x?b.x:c.x),maxTY=a.y>b.y?(a.y>c.y?a.y:c.y):(b.y>c.y?b.y:c.y);var minZ=zOrder(minTX,minTY,minX,minY,size),maxZ=zOrder(maxTX,maxTY,minX,minY,size);var p=ear.nextZ;while(p&&p.z<=maxZ){if(p!==ear.prev&&p!==ear.next&&pointInTriangle(a.x,a.y,b.x,b.y,c.x,c.y,p.x,p.y)&&area(p.prev,p,p.next)>=0)return false;p=p.nextZ;} p=ear.prevZ;while(p&&p.z>=minZ){if(p!==ear.prev&&p!==ear.next&&pointInTriangle(a.x,a.y,b.x,b.y,c.x,c.y,p.x,p.y)&&area(p.prev,p,p.next)>=0)return false;p=p.prevZ;} return true;} function cureLocalIntersections(start,triangles,dim){var p=start;do{var a=p.prev,b=p.next.next;if(intersects(a,p,p.next,b)&&locallyInside(a,b)&&locallyInside(b,a)){triangles.push(a.i/dim);triangles.push(p.i/dim);triangles.push(b.i/dim);removeNode(p);removeNode(p.next);p=start=b;} p=p.next;}while(p!==start);return p;} function splitEarcut(start,triangles,dim,minX,minY,size){var a=start;do{var b=a.next.next;while(b!==a.prev){if(a.i!==b.i&&isValidDiagonal(a,b)){var c=splitPolygon(a,b);a=filterPoints(a,a.next);c=filterPoints(c,c.next);earcutLinked(a,triangles,dim,minX,minY,size);earcutLinked(c,triangles,dim,minX,minY,size);return;} b=b.next;} a=a.next;}while(a!==start);} function eliminateHoles(data,holeIndices,outerNode,dim){var queue=[],i,len,start,end,list;for(i=0,len=holeIndices.length;i=p.next.y){var x=p.x+(hy-p.y)*(p.next.x-p.x)/(p.next.y-p.y);if(x<=hx&&x>qx){qx=x;m=p.x=p.x&&p.x>=m.x&&pointInTriangle(hym.x))&&locallyInside(p,hole)){m=p;tanMin=tan;}} p=p.next;} return m;} function indexCurve(start,minX,minY,size){var p=start;do{if(p.z===null)p.z=zOrder(p.x,p.y,minX,minY,size);p.prevZ=p.prev;p.nextZ=p.next;p=p.next;}while(p!==start);p.prevZ.nextZ=null;p.prevZ=null;sortLinked(p);} function sortLinked(list){var i,p,q,e,tail,numMerges,pSize,qSize,inSize=1;do{p=list;list=null;tail=null;numMerges=0;while(p){numMerges++;q=p;pSize=0;for(i=0;i0||(qSize>0&&q)){if(pSize===0){e=q;q=q.nextZ;qSize--;}else if(qSize===0||!q){e=p;p=p.nextZ;pSize--;}else if(p.z<=q.z){e=p;p=p.nextZ;pSize--;}else{e=q;q=q.nextZ;qSize--;} if(tail)tail.nextZ=e;else list=e;e.prevZ=tail;tail=e;} p=q;} tail.nextZ=null;inSize*=2;}while(numMerges>1);return list;} function zOrder(x,y,minX,minY,size){x=32767*(x-minX)/size;y=32767*(y-minY)/size;x=(x|(x<<8))&0x00FF00FF;x=(x|(x<<4))&0x0F0F0F0F;x=(x|(x<<2))&0x33333333;x=(x|(x<<1))&0x55555555;y=(y|(y<<8))&0x00FF00FF;y=(y|(y<<4))&0x0F0F0F0F;y=(y|(y<<2))&0x33333333;y=(y|(y<<1))&0x55555555;return x|(y<<1);} function getLeftmost(start){var p=start,leftmost=start;do{if(p.x=0&&(ax-px)*(by-py)-(bx-px)*(ay-py)>=0&&(bx-px)*(cy-py)-(cx-px)*(by-py)>=0;} function isValidDiagonal(a,b){return equals(a,b)||a.next.i!==b.i&&a.prev.i!==b.i&&!intersectsPolygon(a,b)&&locallyInside(a,b)&&locallyInside(b,a)&&middleInside(a,b);} function area(p,q,r){return(q.y-p.y)*(r.x-q.x)-(q.x-p.x)*(r.y-q.y);} function equals(p1,p2){return p1.x===p2.x&&p1.y===p2.y;} function intersects(p1,q1,p2,q2){return area(p1,q1,p2)>0!==area(p1,q1,q2)>0&&area(p2,q2,p1)>0!==area(p2,q2,q1)>0;} function intersectsPolygon(a,b){var p=a;do{if(p.i!==a.i&&p.next.i!==a.i&&p.i!==b.i&&p.next.i!==b.i&&intersects(p,p.next,a,b))return true;p=p.next;}while(p!==a);return false;} function locallyInside(a,b){return area(a.prev,a,a.next)<0?area(a,b,a.next)>=0&&area(a,a.prev,b)>=0:area(a,b,a.prev)<0||area(a,a.next,b)<0;} function middleInside(a,b){var p=a,inside=false,px=(a.x+b.x)/2,py=(a.y+b.y)/2;do{if(((p.y>py)!==(p.next.y>py))&&(px<(p.next.x-p.x)*(py-p.y)/(p.next.y-p.y)+p.x)) inside=!inside;p=p.next;}while(p!==a);return inside;} function splitPolygon(a,b){var a2=new Node(a.i,a.x,a.y),b2=new Node(b.i,b.x,b.y),an=a.next,bp=b.prev;a.next=b;b.prev=a;a2.next=an;an.prev=a2;b2.next=a2;a2.prev=b2;bp.next=b2;b2.prev=bp;return b2;} function insertNode(i,x,y,last){var p=new Node(i,x,y);if(!last){p.prev=p;p.next=p;}else{p.next=last.next;p.prev=last;last.next.prev=p;last.next=p;} return p;} function removeNode(p){p.next.prev=p.prev;p.prev.next=p.next;if(p.prevZ)p.prevZ.nextZ=p.nextZ;if(p.nextZ)p.nextZ.prevZ=p.prevZ;} function Node(i,x,y){this.i=i;this.x=x;this.y=y;this.prev=null;this.next=null;this.z=null;this.prevZ=null;this.nextZ=null;this.steiner=false;}}} x3dom.Utils={};x3dom.Utils.maxIndexableCoords=65535;x3dom.Utils.needLineWidth=false;x3dom.Utils.measurements=[];window.performance=window.performance||{};performance.now=(function(){return performance.now||performance.mozNow||performance.msNow||performance.oNow||performance.webkitNow||function(){return new Date().getTime();};})();x3dom.Utils.startMeasure=function(name){var uname=name.toUpperCase();if(!x3dom.Utils.measurements[uname]){if(performance&&performance.now){x3dom.Utils.measurements[uname]=performance.now();}else{x3dom.Utils.measurements[uname]=new Date().getTime();}}};x3dom.Utils.stopMeasure=function(name){var uname=name.toUpperCase();if(x3dom.Utils.measurements[uname]){var startTime=x3dom.Utils.measurements[uname];delete x3dom.Utils.measurements[uname];if(performance&&performance.now){return performance.now()-startTime;}else{return new Date().getTime()-startTime;}} return 0;};x3dom.Utils.isNumber=function(n){return!isNaN(parseFloat(n))&&isFinite(n);};x3dom.Utils.createTexture2D=function(gl,doc,src,bgnd,crossOrigin,scale,genMipMaps) {var texture=gl.createTexture();var data=new Uint8Array([0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255]);gl.bindTexture(gl.TEXTURE_2D,texture);gl.texImage2D(gl.TEXTURE_2D,0,gl.RGBA,2,2,0,gl.RGBA,gl.UNSIGNED_BYTE,data);if(genMipMaps){gl.generateMipmap(gl.TEXTURE_2D);} gl.bindTexture(gl.TEXTURE_2D,null);texture.ready=false;if(src==null||src=='') return texture;var image=new Image();switch(crossOrigin.toLowerCase()){case'anonymous':{image.crossOrigin='anonymous';}break;case'use-credentials':{image.crossOrigin='use-credentials'}break;case'none':{}break;default:{if(x3dom.Utils.forbiddenBySOP(src)){image.crossOrigin='anonymous';}}} image.src=src;doc.downloadCount++;image.onload=function(){if(scale) image=x3dom.Utils.scaleImage(image);if(bgnd==true){gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL,true);} gl.bindTexture(gl.TEXTURE_2D,texture);gl.texImage2D(gl.TEXTURE_2D,0,gl.RGBA,gl.RGBA,gl.UNSIGNED_BYTE,image);if(genMipMaps){gl.generateMipmap(gl.TEXTURE_2D);} gl.bindTexture(gl.TEXTURE_2D,null);if(bgnd==true){gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL,false);} texture.width=image.width;texture.height=image.height;texture.ready=true;doc.downloadCount--;doc.needRender=true;};image.onerror=function(error){if(x3dom.caps.EXTENSIONS.indexOf('WEBGL_compressed_texture_s3tc')!==-1){x3dom.Utils.tryCompressedTexture2D(texture,gl,doc,src,bgnd,crossOrigin,genMipMaps,function(success){if(success){}else{x3dom.debug.logError("[Utils|createTexture2D] Can't load Image: "+src);} doc.downloadCount--;});}else{x3dom.debug.logError("[Utils|createTexture2D] Can't load Image: "+src);doc.downloadCount--;}};return texture;};x3dom.Utils.createCompressedTexture2D=function(gl,doc,src,bgnd,crossOrigin,genMipMaps) {var texture=gl.createTexture();var data=new Uint8Array([0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255]);gl.bindTexture(gl.TEXTURE_2D,texture);gl.texImage2D(gl.TEXTURE_2D,0,gl.RGBA,2,2,0,gl.RGBA,gl.UNSIGNED_BYTE,data);if(genMipMaps){gl.generateMipmap(gl.TEXTURE_2D);} gl.bindTexture(gl.TEXTURE_2D,null);texture.ready=false;if(src==null||src=='') return texture;ddsXhr=new XMLHttpRequest();var ext=gl.getExtension('WEBGL_compressed_texture_s3tc');ddsXhr.open('GET',src,true);ddsXhr.responseType="arraybuffer";ddsXhr.onload=function(){gl.bindTexture(gl.TEXTURE_2D,texture);var mipmaps=uploadDDSLevels(gl,ext,this.response);gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MAG_FILTER,gl.LINEAR);gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MIN_FILTER,mipmaps>1?gl.LINEAR_MIPMAP_LINEAR:gl.LINEAR);texture.ready=true;doc.downloadCount--;doc.needRender=true;};doc.downloadCount++;ddsXhr.send(null);return texture;};x3dom.Utils.tryCompressedTexture2D=function(texture,gl,doc,src,bgnd,crossOrigin,genMipMaps,cb) {ddsXhr=new XMLHttpRequest();var ext=gl.getExtension('WEBGL_compressed_texture_s3tc');ddsXhr.open('GET',src,true);ddsXhr.responseType="arraybuffer";ddsXhr.onload=function(){gl.bindTexture(gl.TEXTURE_2D,texture);var mipmaps=uploadDDSLevels(gl,ext,this.response);gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MAG_FILTER,gl.LINEAR);gl.texParameteri(gl.TEXTURE_2D,gl.TEXTURE_MIN_FILTER,mipmaps>1?gl.LINEAR_MIPMAP_LINEAR:gl.LINEAR);texture.ready=true;doc.needRender=true;cb(true);};ddsXhr.onerror=function(){cb(false);};ddsXhr.send(null);};function uploadDDSLevels(gl,ext,arrayBuffer,loadMipmaps){var DDS_MAGIC=0x20534444;var DDSD_CAPS=0x1,DDSD_HEIGHT=0x2,DDSD_WIDTH=0x4,DDSD_PITCH=0x8,DDSD_PIXELFORMAT=0x1000,DDSD_MIPMAPCOUNT=0x20000,DDSD_LINEARSIZE=0x80000,DDSD_DEPTH=0x800000;var DDSCAPS_COMPLEX=0x8,DDSCAPS_MIPMAP=0x400000,DDSCAPS_TEXTURE=0x1000;var DDSCAPS2_CUBEMAP=0x200,DDSCAPS2_CUBEMAP_POSITIVEX=0x400,DDSCAPS2_CUBEMAP_NEGATIVEX=0x800,DDSCAPS2_CUBEMAP_POSITIVEY=0x1000,DDSCAPS2_CUBEMAP_NEGATIVEY=0x2000,DDSCAPS2_CUBEMAP_POSITIVEZ=0x4000,DDSCAPS2_CUBEMAP_NEGATIVEZ=0x8000,DDSCAPS2_VOLUME=0x200000;var DDPF_ALPHAPIXELS=0x1,DDPF_ALPHA=0x2,DDPF_FOURCC=0x4,DDPF_RGB=0x40,DDPF_YUV=0x200,DDPF_LUMINANCE=0x20000;function FourCCToInt32(value){return value.charCodeAt(0)+ (value.charCodeAt(1)<<8)+ (value.charCodeAt(2)<<16)+ (value.charCodeAt(3)<<24);} function Int32ToFourCC(value){return String.fromCharCode(value&0xff,(value>>8)&0xff,(value>>16)&0xff,(value>>24)&0xff);} var FOURCC_DXT1=FourCCToInt32("DXT1");var FOURCC_DXT5=FourCCToInt32("DXT5");var headerLengthInt=31;var off_magic=0;var off_size=1;var off_flags=2;var off_height=3;var off_width=4;var off_mipmapCount=7;var off_pfFlags=20;var off_pfFourCC=21;var header=new Int32Array(arrayBuffer,0,headerLengthInt),fourCC,blockBytes,internalFormat,width,height,dataLength,dataOffset,byteArray,mipmapCount,i;if(header[off_magic]!=DDS_MAGIC){console.error("Invalid magic number in DDS header");return 0;} if(!header[off_pfFlags]&DDPF_FOURCC){console.error("Unsupported format, must contain a FourCC code");return 0;} fourCC=header[off_pfFourCC];switch(fourCC){case FOURCC_DXT1:blockBytes=8;internalFormat=ext.COMPRESSED_RGBA_S3TC_DXT1_EXT;break;case FOURCC_DXT5:blockBytes=16;internalFormat=ext.COMPRESSED_RGBA_S3TC_DXT5_EXT;break;default:console.error("Unsupported FourCC code:",Int32ToFourCC(fourCC));return null;} mipmapCount=1;if(header[off_flags]&DDSD_MIPMAPCOUNT&&loadMipmaps!==false){mipmapCount=Math.max(1,header[off_mipmapCount]);} width=header[off_width];height=header[off_height];dataOffset=header[off_size]+4;for(i=0;i-1){filename=url.substr(url.lastIndexOf("/")+1);} else if(url.lastIndexOf("\\")>-1){filename=url.substr(url.lastIndexOf("\\")+1);} else{filename=url;} return filename;};x3dom.Utils.findTextureByName=function(texture,name) {for(var i=0;i>i;} return(x+1);};x3dom.Utils.nextBestPowerOfTwo=function(x) {var log2x=Math.log(x)/0.693147180559945;return Math.pow(2,Math.round(log2x));};x3dom.Utils.getDataTypeSize=function(type) {switch(type) {case"Int8":case"Uint8":return 1;case"Int16":case"Uint16":return 2;case"Int32":case"Uint32":case"Float32":return 4;case"Float64":default:return 8;}};x3dom.Utils.getOffsetMultiplier=function(indexType,gl) {switch(indexType) {case gl.UNSIGNED_SHORT:return 1;case gl.UNSIGNED_INT:return 2;case gl.UNSIGNED_BYTE:return 0.5;default:return 1;}};x3dom.Utils.getByteAwareOffset=function(offset,indexType,gl) {switch(indexType) {case gl.UNSIGNED_SHORT:return 2*offset;case gl.UNSIGNED_INT:return 4*offset;case gl.UNSIGNED_BYTE:return offset;default:return 2*offset;}};x3dom.Utils.getVertexAttribType=function(type,gl) {var dataType=gl.NONE;switch(type) {case"Int8":dataType=gl.BYTE;break;case"Uint8":dataType=gl.UNSIGNED_BYTE;break;case"Int16":dataType=gl.SHORT;break;case"Uint16":dataType=gl.UNSIGNED_SHORT;break;case"Int32":dataType=gl.INT;break;case"Uint32":dataType=gl.UNSIGNED_INT;break;case"Float32":dataType=gl.FLOAT;break;case"Float64":default:x3dom.debug.logError("Can't find this.gl data type for "+type+", getting FLOAT...");dataType=gl.FLOAT;break;} return dataType;};x3dom.Utils.getArrayBufferView=function(type,buffer) {var array=null;switch(type) {case"Int8":array=new Int8Array(buffer);break;case"Uint8":array=new Uint8Array(buffer);break;case"Int16":array=new Int16Array(buffer);break;case"Uint16":array=new Uint16Array(buffer);break;case"Int32":array=new Int32Array(buffer);break;case"Uint32":array=new Uint32Array(buffer);break;case"Float32":array=new Float32Array(buffer);break;case"Float64":array=new Float64Array(buffer);break;default:x3dom.debug.logError("Can't create typed array view of type "+type+", trying Float32...");array=new Float32Array(buffer);break;} return array;};x3dom.Utils.isUnsignedType=function(str) {return(str=="Uint8"||str=="Uint16"||str=="Uint16"||str=="Uint32");};x3dom.Utils.checkDirtyLighting=function(viewarea) {return(viewarea.getLights().length+viewarea._scene.getNavigationInfo()._vf.headlight);};x3dom.Utils.checkDirtyEnvironment=function(viewarea,shaderProperties) {var environment=viewarea._scene.getEnvironment();return(shaderProperties.GAMMACORRECTION!=environment._vf.gammaCorrectionDefault);};x3dom.Utils.minFilterDic=function(gl,minFilter) {switch(minFilter.toUpperCase()) {case"NEAREST":return gl.NEAREST;case"LINEAR":return gl.LINEAR;case"NEAREST_MIPMAP_NEAREST":return gl.NEAREST_MIPMAP_NEAREST;case"NEAREST_MIPMAP_LINEAR":return gl.NEAREST_MIPMAP_LINEAR;case"LINEAR_MIPMAP_NEAREST":return gl.LINEAR_MIPMAP_NEAREST;case"LINEAR_MIPMAP_LINEAR":return gl.LINEAR_MIPMAP_LINEAR;case"AVG_PIXEL":return gl.LINEAR;case"AVG_PIXEL_AVG_MIPMAP":return gl.LINEAR_MIPMAP_LINEAR;case"AVG_PIXEL_NEAREST_MIPMAP":return gl.LINEAR_MIPMAP_NEAREST;case"DEFAULT":return gl.LINEAR_MIPMAP_LINEAR;case"FASTEST":return gl.NEAREST;case"NEAREST_PIXEL":return gl.NEAREST;case"NEAREST_PIXEL_AVG_MIPMAP":return gl.NEAREST_MIPMAP_LINEAR;case"NEAREST_PIXEL_NEAREST_MIPMAP":return gl.NEAREST_MIPMAP_NEAREST;case"NICEST":return gl.LINEAR_MIPMAP_LINEAR;default:return gl.LINEAR;}};x3dom.Utils.magFilterDic=function(gl,magFilter) {switch(magFilter.toUpperCase()) {case"NEAREST":return gl.NEAREST;case"LINEAR":return gl.LINEAR;case"AVG_PIXEL":return gl.LINEAR;case"DEFAULT":return gl.LINEAR;case"FASTEST":return gl.NEAREST;case"NEAREST_PIXEL":return gl.NEAREST;case"NICEST":return gl.LINEAR;default:return gl.LINEAR;}};x3dom.Utils.boundaryModesDic=function(gl,mode) {switch(mode.toUpperCase()) {case"CLAMP":return gl.CLAMP_TO_EDGE;case"CLAMP_TO_EDGE":return gl.CLAMP_TO_EDGE;case"CLAMP_TO_BOUNDARY":return gl.CLAMP_TO_EDGE;case"MIRRORED_REPEAT":return gl.MIRRORED_REPEAT;case"REPEAT":return gl.REPEAT;default:return gl.REPEAT;}};x3dom.Utils.primTypeDic=function(gl,type) {switch(type.toUpperCase()) {case"POINTS":return gl.POINTS;case"LINES":return gl.LINES;case"LINELOOP":return gl.LINE_LOOP;case"LINESTRIP":return gl.LINE_STRIP;case"TRIANGLES":return gl.TRIANGLES;case"TRIANGLESTRIP":return gl.TRIANGLE_STRIP;case"TRIANGLEFAN":return gl.TRIANGLE_FAN;default:return gl.TRIANGLES;}};x3dom.Utils.depthFunc=function(gl,func) {switch(func.toUpperCase()) {case"NEVER":return gl.NEVER;case"ALWAYS":return gl.ALWAYS;case"LESS":return gl.LESS;case"EQUAL":return gl.EQUAL;case"LEQUAL":return gl.LEQUAL;case"GREATER":return gl.GREATER;case"GEQUAL":return gl.GEQUAL;case"NOTEQUAL":return gl.NOTEQUAL;default:return gl.LEQUAL;}};x3dom.Utils.blendFunc=function(gl,func) {switch(func.toLowerCase()) {case"zero":return gl.ZERO;case"one":return gl.ONE;case"dst_color":return gl.DST_COLOR;case"dst_alpha":return gl.DST_ALPHA;case"src_color":return gl.SRC_COLOR;case"src_alpha":return gl.SRC_ALPHA;case"one_minus_dst_color":return gl.ONE_MINUS_DST_COLOR;case"one_minus_dst_alpha":return gl.ONE_MINUS_DST_ALPHA;case"one_minus_src_color":return gl.ONE_MINUS_SRC_COLOR;case"one_minus_src_alpha":return gl.ONE_MINUS_SRC_ALPHA;case"src_alpha_saturate":return gl.SRC_ALPHA_SATURATE;case"constant_color":return gl.CONSTANT_COLOR;case"constant_alpha":return gl.CONSTANT_ALPHA;case"one_minus_constant_color":return gl.ONE_MINUS_CONSTANT_COLOR;case"one_minus_constant_alpha":return gl.ONE_MINUS_CONSTANT_ALPHA;default:return 0;}};x3dom.Utils.blendEquation=function(gl,func) {switch(func.toLowerCase()) {case"func_add":return gl.FUNC_ADD;case"func_subtract":return gl.FUNC_SUBTRACT;case"func_reverse_subtract":return gl.FUNC_REVERSE_SUBTRACT;case"min":return 0;case"max":return 0;case"logic_op":return 0;default:return 0;}};x3dom.Utils.gunzip=function(arraybuffer) {var byteArray=new Uint8Array(arraybuffer);try{arraybuffer=new Zlib.Gunzip(byteArray).decompress().buffer;}catch(e){} return arraybuffer;};x3dom.Utils.generateProperties=function(viewarea,shape) {var property={};var geometry=shape._cf.geometry.node;var appearance=shape._cf.appearance.node;var texture=appearance?appearance._cf.texture.node:null;var material=appearance?appearance._cf.material.node:null;var environment=viewarea._scene.getEnvironment();if(appearance&&appearance._shader&&x3dom.isa(appearance._shader,x3dom.nodeTypes.ComposedShader)){property.CSHADER=appearance._shader._id;} else if(geometry){property.CSHADER=-1;property.SOLID=(shape.isSolid())?1:0;property.TEXT=(x3dom.isa(geometry,x3dom.nodeTypes.Text))?1:0;property.POPGEOMETRY=(x3dom.isa(geometry,x3dom.nodeTypes.PopGeometry))?1:0;property.IMAGEGEOMETRY=(x3dom.isa(geometry,x3dom.nodeTypes.ImageGeometry))?1:0;property.BINARYGEOMETRY=(x3dom.isa(geometry,x3dom.nodeTypes.BinaryGeometry))?1:0;property.EXTERNALGEOMETRY=(x3dom.isa(geometry,x3dom.nodeTypes.ExternalGeometry))?1:0;property.IG_PRECISION=(property.IMAGEGEOMETRY)?geometry.numCoordinateTextures():0;property.IG_INDEXED=(property.IMAGEGEOMETRY&&geometry.getIndexTexture()!=null)?1:0;property.POINTLINE2D=!geometry.needLighting()?1:0;property.VERTEXID=((property.BINARYGEOMETRY||property.EXTERNALGEOMETRY)&&geometry._vf.idsPerVertex)?1:0;property.IS_PARTICLE=(x3dom.isa(geometry,x3dom.nodeTypes.ParticleSet))?1:0;property.TWOSIDEDMAT=(property.APPMAT&&x3dom.isa(material,x3dom.nodeTypes.TwoSidedMaterial))?1:0;property.SEPARATEBACKMAT=(property.TWOSIDEDMAT&&material._vf.separateBackColor)?1:0;property.SHADOW=(viewarea.getLightsShadow())?1:0;property.FOG=(viewarea._scene.getFog()._vf.visibilityRange>0)?1:0;property.CSSHADER=(appearance&&appearance._shader&&x3dom.isa(appearance._shader,x3dom.nodeTypes.CommonSurfaceShader))?1:0;property.APPMAT=(appearance&&(material||property.CSSHADER))?1:0;property.LIGHTS=(!property.POINTLINE2D&&appearance&&shape.isLit()&&(material||property.CSSHADER))?viewarea.getLights().length+(viewarea._scene.getNavigationInfo()._vf.headlight):0;property.TEXTURED=(texture||property.TEXT||(property.CSSHADER&&appearance._shader.needTexcoords()))?1:0;property.CUBEMAP=(texture&&x3dom.isa(texture,x3dom.nodeTypes.X3DEnvironmentTextureNode))||(property.CSSHADER&&appearance._shader.getEnvironmentMap())?1:0;property.PIXELTEX=(texture&&x3dom.isa(texture,x3dom.nodeTypes.PixelTexture))?1:0;property.TEXTRAFO=(appearance&&appearance._cf.textureTransform.node)?1:0;property.DIFFUSEMAP=(texture&&!x3dom.isa(texture,x3dom.nodeTypes.X3DEnvironmentTextureNode))||(property.CSSHADER&&appearance._shader.getDiffuseMap())?1:0;property.NORMALMAP=(property.CSSHADER&&appearance._shader.getNormalMap())?1:0;property.NORMALSPACE=(property.NORMALMAP)?appearance._shader._vf.normalSpace.toUpperCase():"";property.SPECMAP=(property.CSSHADER&&appearance._shader.getSpecularMap())?1:0;property.SHINMAP=(property.CSSHADER&&appearance._shader.getShininessMap())?1:0;property.DISPLACEMENTMAP=(property.CSSHADER&&appearance._shader.getDisplacementMap())?1:0;property.DIFFPLACEMENTMAP=(property.CSSHADER&&appearance._shader.getDiffuseDisplacementMap())?1:0;property.MULTIDIFFALPMAP=(property.VERTEXID&&property.CSSHADER&&appearance._shader.getMultiDiffuseAlphaMap())?1:0;property.MULTIEMIAMBMAP=(property.VERTEXID&&property.CSSHADER&&appearance._shader.getMultiEmissiveAmbientMap())?1:0;property.MULTISPECSHINMAP=(property.VERTEXID&&property.CSSHADER&&appearance._shader.getMultiSpecularShininessMap())?1:0;property.MULTIVISMAP=(property.VERTEXID&&property.CSSHADER&&appearance._shader.getMultiVisibilityMap())?1:0;property.BLENDING=(property.TEXT||property.CUBEMAP||(texture&&texture._blending))?1:0;property.REQUIREBBOX=(geometry._vf.coordType!==undefined&&geometry._vf.coordType!="Float32")?1:0;property.REQUIREBBOXNOR=(geometry._vf.normalType!==undefined&&geometry._vf.normalType!="Float32")?1:0;property.REQUIREBBOXCOL=(geometry._vf.colorType!==undefined&&geometry._vf.colorType!="Float32")?1:0;property.REQUIREBBOXTEX=(geometry._vf.texCoordType!==undefined&&geometry._vf.texCoordType!="Float32")?1:0;property.COLCOMPONENTS=geometry._mesh._numColComponents;property.NORCOMPONENTS=geometry._mesh._numNormComponents;property.POSCOMPONENTS=geometry._mesh._numPosComponents;property.SPHEREMAPPING=(geometry._cf.texCoord!==undefined&&geometry._cf.texCoord.node!==null&&geometry._cf.texCoord.node._vf.mode&&geometry._cf.texCoord.node._vf.mode.toLowerCase()=="sphere")?1:0;property.VERTEXCOLOR=(geometry._mesh._colors[0].length>0||(property.IMAGEGEOMETRY&&geometry.getColorTexture())||(property.POPGEOMETRY&&geometry.hasColor())||(geometry._vf.color!==undefined&&geometry._vf.color.length>0))?1:0;property.CLIPPLANES=shape._clipPlanes.length;property.ALPHATHRESHOLD=(appearance)?appearance._vf.alphaClipThreshold.toFixed(2):0.1;property.GAMMACORRECTION=environment._vf.gammaCorrectionDefault;} property.toIdentifier=function(){var id="";for(var p in this){if(this[p]!=this.toIdentifier&&this[p]!=this.toString){id+=this[p];}} this.id=id;return id;};property.toString=function(){var str="";for(var p in this){if(this[p]!=this.toIdentifier&&this[p]!=this.toString){str+=p+": "+this[p]+", ";}} return str;};property.toIdentifier();return property;};x3dom.Utils.wrapProgram=function(gl,program,shaderID) {var shader={shaderID:shaderID,program:program};shader.bind=function(){gl.useProgram(program);};var loc=null;var obj=null;var i,glErr;var numUniforms=gl.getProgramParameter(program,gl.ACTIVE_UNIFORMS);for(i=0;izFar) {return;} zNear=(zNear>1)?1:zNear;zFar=(zFar>1)?1:zFar;if(this.states['depthRange'].zNear!=zNear||this.states['depthRange'].zFar!=zFar) {this.gl.depthRange(zNear,zFar);this.states['depthRange'].zNear=zNear;this.states['depthRange'].zFar=zFar;}};x3dom.StateManager.prototype.viewport=function(x,y,width,height) {if(this.states['viewport'].x!=x||this.states['viewport'].y!=y||this.states['viewport'].width!=width||this.states['viewport'].height!=height) {this.gl.viewport(x,y,width,height);this.states['viewport'].x=x;this.states['viewport'].y=y;this.states['viewport'].width=width;this.states['viewport'].height=height;}};x3dom.StateManager.prototype.bindFramebuffer=function(target,framebuffer) {this.gl.bindFramebuffer(target,framebuffer);this.initStates();};x3dom.BinaryContainerLoader={outOfMemory:false,checkError:function(gl){var glErr=gl.getError();if(glErr){if(glErr==gl.OUT_OF_MEMORY){this.outOfMemory=true;x3dom.debug.logError("GL-Error "+glErr+" on loading binary container (out of memory).");console.error("WebGL: OUT_OF_MEMORY");} else{x3dom.debug.logError("GL-Error "+glErr+" on loading binary container.");}}}};x3dom.BinaryContainerLoader.setupBinGeo=function(shape,sp,gl,viewarea,currContext) {if(this.outOfMemory){return;} var t00=new Date().getTime();var that=this;var binGeo=shape._cf.geometry.node;shape._webgl.binaryGeometry=-1;shape._webgl.internalDownloadCount=((binGeo._vf.index.length>0)?1:0)+ ((binGeo._hasStrideOffset&&binGeo._vf.coord.length>0)?1:0)+ ((!binGeo._hasStrideOffset&&binGeo._vf.coord.length>0)?1:0)+ ((!binGeo._hasStrideOffset&&binGeo._vf.normal.length>0)?1:0)+ ((!binGeo._hasStrideOffset&&binGeo._vf.texCoord.length>0)?1:0)+ ((!binGeo._hasStrideOffset&&binGeo._vf.color.length>0)?1:0);var createTriangleSoup=(binGeo._vf.normalPerVertex==false)||((binGeo._vf.index.length>0)&&(binGeo._vf.indexType=="Int32"||(binGeo._vf.indexType=="Uint32"&&!x3dom.caps.INDEX_UINT)));shape._webgl.makeSeparateTris={index:null,coord:null,normal:null,texCoord:null,color:null,pushBuffer:function(name,buf){this[name]=buf;if(--shape._webgl.internalDownloadCount==0){if(this.coord) this.createMesh();shape._nameSpace.doc.needRender=true;} if(--shape._nameSpace.doc.downloadCount==0) shape._nameSpace.doc.needRender=true;},createMesh:function(){var geoNode=binGeo;if(geoNode._hasStrideOffset){x3dom.debug.logError(geoNode._vf.indexType+" index type and per-face normals not supported for interleaved arrays.");return;} for(var k=0;k3)posBuf.push(this.coord[j+3]);if(this.color){colBuf.push(this.color[j]);colBuf.push(this.color[j+1]);colBuf.push(this.color[j+2]);if(dataLen>3)colBuf.push(this.color[j+3]);} if(this.texCoord){l=texDataLen*(this.index?this.index[i]:i);texcBuf.push(this.texCoord[l]);texcBuf.push(this.texCoord[l+1]);if(texDataLen>3){texcBuf.push(this.texCoord[l+2]);texcBuf.push(this.texCoord[l+3]);}} j=dataLen*(this.index?this.index[i+1]:i+1);var p1=new x3dom.fields.SFVec3f(bgSize.x*this.coord[j]/bgPrecisionMax,bgSize.y*this.coord[j+1]/bgPrecisionMax,bgSize.z*this.coord[j+2]/bgPrecisionMax);posBuf.push(this.coord[j]);posBuf.push(this.coord[j+1]);posBuf.push(this.coord[j+2]);if(dataLen>3)posBuf.push(this.coord[j+3]);if(this.color){colBuf.push(this.color[j]);colBuf.push(this.color[j+1]);colBuf.push(this.color[j+2]);if(dataLen>3)colBuf.push(this.color[j+3]);} if(this.texCoord){l=texDataLen*(this.index?this.index[i+1]:i+1);texcBuf.push(this.texCoord[l]);texcBuf.push(this.texCoord[l+1]);if(texDataLen>3){texcBuf.push(this.texCoord[l+2]);texcBuf.push(this.texCoord[l+3]);}} j=dataLen*(this.index?this.index[i+2]:i+2);var p2=new x3dom.fields.SFVec3f(bgSize.x*this.coord[j]/bgPrecisionMax,bgSize.y*this.coord[j+1]/bgPrecisionMax,bgSize.z*this.coord[j+2]/bgPrecisionMax);posBuf.push(this.coord[j]);posBuf.push(this.coord[j+1]);posBuf.push(this.coord[j+2]);if(dataLen>3)posBuf.push(this.coord[j+3]);if(this.color){colBuf.push(this.color[j]);colBuf.push(this.color[j+1]);colBuf.push(this.color[j+2]);if(dataLen>3)colBuf.push(this.color[j+3]);} if(this.texCoord){l=texDataLen*(this.index?this.index[i+2]:i+2);texcBuf.push(this.texCoord[l]);texcBuf.push(this.texCoord[l+1]);if(texDataLen>3){texcBuf.push(this.texCoord[l+2]);texcBuf.push(this.texCoord[l+3]);}} var a=p0.subtract(p1);var b=p1.subtract(p2);var norm=a.cross(b).normalize();for(j=0;j<3;j++){normBuf.push(norm.x);normBuf.push(norm.y);normBuf.push(norm.z);}} var buffer=gl.createBuffer();shape._webgl.buffers[1]=buffer;gl.bindBuffer(gl.ARRAY_BUFFER,buffer);gl.bufferData(gl.ARRAY_BUFFER,x3dom.Utils.getArrayBufferView(geoNode._vf.coordType,posBuf),gl.STATIC_DRAW);gl.vertexAttribPointer(sp.position,geoNode._mesh._numPosComponents,shape._webgl.coordType,false,shape._coordStrideOffset[0],shape._coordStrideOffset[1]);gl.enableVertexAttribArray(sp.position);buffer=gl.createBuffer();shape._webgl.buffers[2]=buffer;gl.bindBuffer(gl.ARRAY_BUFFER,buffer);gl.bufferData(gl.ARRAY_BUFFER,new Float32Array(normBuf),gl.STATIC_DRAW);gl.vertexAttribPointer(sp.normal,geoNode._mesh._numNormComponents,shape._webgl.normalType,false,shape._normalStrideOffset[0],shape._normalStrideOffset[1]);gl.enableVertexAttribArray(sp.normal);if(this.texCoord) {buffer=gl.createBuffer();shape._webgl.buffers[3]=buffer;gl.bindBuffer(gl.ARRAY_BUFFER,buffer);gl.bufferData(gl.ARRAY_BUFFER,x3dom.Utils.getArrayBufferView(geoNode._vf.texCoordType,texcBuf),gl.STATIC_DRAW);gl.vertexAttribPointer(sp.texcoord,geoNode._mesh._numTexComponents,shape._webgl.texCoordType,false,shape._texCoordStrideOffset[0],shape._texCoordStrideOffset[1]);gl.enableVertexAttribArray(sp.texcoord);} if(this.color) {buffer=gl.createBuffer();shape._webgl.buffers[4]=buffer;gl.bindBuffer(gl.ARRAY_BUFFER,buffer);gl.bufferData(gl.ARRAY_BUFFER,x3dom.Utils.getArrayBufferView(geoNode._vf.colorType,colBuf),gl.STATIC_DRAW);gl.vertexAttribPointer(sp.color,geoNode._mesh._numColComponents,shape._webgl.colorType,false,shape._colorStrideOffset[0],shape._colorStrideOffset[1]);gl.enableVertexAttribArray(sp.color);} geoNode._vf.vertexCount=[];geoNode._vf.vertexCount[0]=posBuf.length/dataLen;geoNode._mesh._numCoords=geoNode._vf.vertexCount[0];geoNode._mesh._numFaces=geoNode._vf.vertexCount[0]/3;shape._webgl.primType=[];shape._webgl.primType[0]=gl.TRIANGLES;posBuf=null;normBuf=null;texcBuf=null;colBuf=null;this.index=null;this.coord=null;this.normal=null;this.texCoord=null;this.color=null;that.checkError(gl);delete shape._webgl.shader;shape._webgl.shader=currContext.cache.getDynamicShader(gl,viewarea,shape);}};if(binGeo._vf.index.length>0) {shape._webgl.binaryGeometry=1;var xmlhttp0=new XMLHttpRequest();xmlhttp0.open("GET",shape._nameSpace.getURL(binGeo._vf.index),true);xmlhttp0.responseType="arraybuffer";shape._nameSpace.doc.downloadCount+=1;xmlhttp0.send(null);xmlhttp0.onload=function() {if(xmlhttp0.status!=200){shape._nameSpace.doc.downloadCount-=1;x3dom.debug.logError("XHR1/ index load failed with status: "+xmlhttp0.status);return;} if(!shape._webgl) return;var XHR_buffer=binGeo._vf.compressed==true?x3dom.Utils.gunzip(xmlhttp0.response):xmlhttp0.response;var geoNode=binGeo;var attribTypeStr=geoNode._vf.indexType;var indexArray=x3dom.Utils.getArrayBufferView(attribTypeStr,XHR_buffer);if(createTriangleSoup){shape._webgl.makeSeparateTris.pushBuffer("index",indexArray);return;} var indicesBuffer=gl.createBuffer();if(x3dom.caps.INDEX_UINT&&attribTypeStr=="Uint32"){shape._webgl.indexType=gl.UNSIGNED_INT;} else{shape._webgl.indexType=gl.UNSIGNED_SHORT;} gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER,indicesBuffer);gl.bufferData(gl.ELEMENT_ARRAY_BUFFER,indexArray,gl.STATIC_DRAW);gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER,null);if(geoNode._vf.vertexCount[0]==0) geoNode._vf.vertexCount[0]=indexArray.length;geoNode._mesh._numFaces=0;for(var i=0;i0) {var xmlhttp=new XMLHttpRequest();xmlhttp.open("GET",shape._nameSpace.getURL(binGeo._vf.coord),true);xmlhttp.responseType="arraybuffer";shape._nameSpace.doc.downloadCount+=1;xmlhttp.send(null);xmlhttp.onload=function() {if(xmlhttp.status!=200){shape._nameSpace.doc.downloadCount-=1;x3dom.debug.logError("XHR1/ interleaved array load failed with status: "+xmlhttp.status);return;} if(!shape._webgl) return;var XHR_buffer=binGeo._vf.compressed==true?x3dom.Utils.gunzip(xmlhttp.response):xmlhttp.response;var geoNode=binGeo;var attribTypeStr=geoNode._vf.coordType;shape._webgl.coordType=x3dom.Utils.getVertexAttribType(attribTypeStr,gl);shape._webgl.normalType=shape._webgl.coordType;shape._webgl.texCoordType=shape._webgl.coordType;shape._webgl.colorType=shape._webgl.coordType;var attributes=x3dom.Utils.getArrayBufferView(attribTypeStr,XHR_buffer);var dataLen=shape._coordStrideOffset[0]/x3dom.Utils.getDataTypeSize(attribTypeStr);if(dataLen) geoNode._mesh._numCoords=attributes.length/dataLen;if(geoNode._vf.index.length==0){for(var i=0;i0) {shape._webgl.buffers[2]=buffer;gl.bindBuffer(gl.ARRAY_BUFFER,buffer);gl.bufferData(gl.ARRAY_BUFFER,attributes,gl.STATIC_DRAW);gl.vertexAttribPointer(sp.normal,geoNode._mesh._numNormComponents,shape._webgl.normalType,false,shape._normalStrideOffset[0],shape._normalStrideOffset[1]);gl.enableVertexAttribArray(sp.normal);} if(geoNode._vf.texCoord.length>0) {shape._webgl.buffers[3]=buffer;gl.bindBuffer(gl.ARRAY_BUFFER,buffer);gl.bufferData(gl.ARRAY_BUFFER,attributes,gl.STATIC_DRAW);gl.vertexAttribPointer(sp.texcoord,geoNode._mesh._numTexComponents,shape._webgl.texCoordType,false,shape._texCoordStrideOffset[0],shape._texCoordStrideOffset[1]);gl.enableVertexAttribArray(sp.texcoord);} if(geoNode._vf.color.length>0) {shape._webgl.buffers[4]=buffer;gl.bindBuffer(gl.ARRAY_BUFFER,buffer);gl.bufferData(gl.ARRAY_BUFFER,attributes,gl.STATIC_DRAW);gl.vertexAttribPointer(sp.color,geoNode._mesh._numColComponents,shape._webgl.colorType,false,shape._colorStrideOffset[0],shape._colorStrideOffset[1]);gl.enableVertexAttribArray(sp.color);} attributes=null;shape._nameSpace.doc.downloadCount-=1;shape._webgl.internalDownloadCount-=1;if(shape._webgl.internalDownloadCount==0) shape._nameSpace.doc.needRender=true;that.checkError(gl);var t11=new Date().getTime()-t00;x3dom.debug.logInfo("XHR/ interleaved array load time: "+t11+" ms");shape._webgl.buffers[1]=buffer;};} if(!binGeo._hasStrideOffset&&binGeo._vf.coord.length>0) {var xmlhttp1=new XMLHttpRequest();xmlhttp1.open("GET",shape._nameSpace.getURL(binGeo._vf.coord),true);xmlhttp1.responseType="arraybuffer";shape._nameSpace.doc.downloadCount+=1;xmlhttp1.send(null);xmlhttp1.onload=function() {if(xmlhttp1.status!=200){shape._nameSpace.doc.downloadCount-=1;x3dom.debug.logError("XHR1/ coord load failed with status: "+xmlhttp1.status);return;} if(!shape._webgl) return;var XHR_buffer=binGeo._vf.compressed==true?x3dom.Utils.gunzip(xmlhttp1.response):xmlhttp1.response;var geoNode=binGeo;var i=0;var attribTypeStr=geoNode._vf.coordType;shape._webgl.coordType=x3dom.Utils.getVertexAttribType(attribTypeStr,gl);var vertices=x3dom.Utils.getArrayBufferView(attribTypeStr,XHR_buffer);if(createTriangleSoup){shape._webgl.makeSeparateTris.pushBuffer("coord",vertices);return;} gl.bindAttribLocation(sp.program,0,"position");var positionBuffer=gl.createBuffer();gl.bindBuffer(gl.ARRAY_BUFFER,positionBuffer);gl.bufferData(gl.ARRAY_BUFFER,vertices,gl.STATIC_DRAW);gl.bindBuffer(gl.ARRAY_BUFFER,null);geoNode._mesh._numCoords=vertices.length/geoNode._mesh._numPosComponents;if(geoNode._vf.index.length==0){for(i=0;ivertices[i+0]){min.x=vertices[i+0];} if(min.y>vertices[i+1]){min.y=vertices[i+1];} if(min.z>vertices[i+2]){min.z=vertices[i+2];} if(max.x0) {var xmlhttp2=new XMLHttpRequest();xmlhttp2.open("GET",shape._nameSpace.getURL(binGeo._vf.normal),true);xmlhttp2.responseType="arraybuffer";shape._nameSpace.doc.downloadCount+=1;xmlhttp2.send(null);xmlhttp2.onload=function() {if(xmlhttp2.status!=200){shape._nameSpace.doc.downloadCount-=1;x3dom.debug.logError("XHR2/ normal load failed with status: "+xmlhttp2.status);return;} if(!shape._webgl) return;var XHR_buffer=binGeo._vf.compressed==true?x3dom.Utils.gunzip(xmlhttp2.response):xmlhttp2.response;var attribTypeStr=binGeo._vf.normalType;shape._webgl.normalType=x3dom.Utils.getVertexAttribType(attribTypeStr,gl);var normals=x3dom.Utils.getArrayBufferView(attribTypeStr,XHR_buffer);if(createTriangleSoup){shape._webgl.makeSeparateTris.pushBuffer("normal",normals);return;} var normalBuffer=gl.createBuffer();gl.bindBuffer(gl.ARRAY_BUFFER,normalBuffer);gl.bufferData(gl.ARRAY_BUFFER,normals,gl.STATIC_DRAW);gl.bindBuffer(gl.ARRAY_BUFFER,null);normals=null;shape._nameSpace.doc.downloadCount-=1;shape._webgl.internalDownloadCount-=1;if(shape._webgl.internalDownloadCount==0) shape._nameSpace.doc.needRender=true;that.checkError(gl);var t11=new Date().getTime()-t00;x3dom.debug.logInfo("XHR2/ normal load time: "+t11+" ms");shape._webgl.buffers[2]=normalBuffer;};} if(!binGeo._hasStrideOffset&&binGeo._vf.texCoord.length>0) {var xmlhttp3=new XMLHttpRequest();xmlhttp3.open("GET",shape._nameSpace.getURL(binGeo._vf.texCoord),true);xmlhttp3.responseType="arraybuffer";shape._nameSpace.doc.downloadCount+=1;xmlhttp3.send(null);xmlhttp3.onload=function() {var i,j;var tmp;if(xmlhttp3.status!=200){shape._nameSpace.doc.downloadCount-=1;x3dom.debug.logError("XHR3/ texcoord load failed with status: "+xmlhttp3.status);return;} if(!shape._webgl) return;var XHR_buffer=binGeo._vf.compressed==true?x3dom.Utils.gunzip(xmlhttp3.response):xmlhttp3.response;var attribTypeStr=binGeo._vf.texCoordType;shape._webgl.texCoordType=x3dom.Utils.getVertexAttribType(attribTypeStr,gl);var texCoords=x3dom.Utils.getArrayBufferView(attribTypeStr,XHR_buffer);if(createTriangleSoup){shape._webgl.makeSeparateTris.pushBuffer("texCoord",texCoords);return;} if(binGeo._vf["idsPerVertex"]) {var idBuffer=gl.createBuffer();gl.bindBuffer(gl.ARRAY_BUFFER,idBuffer);var ids=x3dom.Utils.getArrayBufferView("Float32",texCoords.length/2);for(i=0,j=0;i0) {var xmlhttp4=new XMLHttpRequest();xmlhttp4.open("GET",shape._nameSpace.getURL(binGeo._vf.color),true);xmlhttp4.responseType="arraybuffer";shape._nameSpace.doc.downloadCount+=1;xmlhttp4.send(null);xmlhttp4.onload=function() {if(xmlhttp4.status!=200){shape._nameSpace.doc.downloadCount-=1;x3dom.debug.logError("XHR4/ color load failed with status: "+xmlhttp4.status);return;} if(!shape._webgl) return;var XHR_buffer=binGeo._vf.compressed==true?x3dom.Utils.gunzip(xmlhttp4.response):xmlhttp4.response;var attribTypeStr=binGeo._vf.colorType;shape._webgl.colorType=x3dom.Utils.getVertexAttribType(attribTypeStr,gl);var colors=x3dom.Utils.getArrayBufferView(attribTypeStr,XHR_buffer);if(createTriangleSoup){shape._webgl.makeSeparateTris.pushBuffer("color",colors);return;} var colorBuffer=gl.createBuffer();gl.bindBuffer(gl.ARRAY_BUFFER,colorBuffer);gl.bufferData(gl.ARRAY_BUFFER,colors,gl.STATIC_DRAW);gl.bindBuffer(gl.ARRAY_BUFFER,null);colors=null;shape._nameSpace.doc.downloadCount-=1;shape._webgl.internalDownloadCount-=1;if(shape._webgl.internalDownloadCount==0) shape._nameSpace.doc.needRender=true;that.checkError(gl);var t11=new Date().getTime()-t00;x3dom.debug.logInfo("XHR4/ color load time: "+t11+" ms");shape._webgl.buffers[4]=colorBuffer;};}};x3dom.BinaryContainerLoader.setupPopGeo=function(shape,sp,gl,viewarea,currContext) {if(this.outOfMemory){return;} var popGeo=shape._cf.geometry.node;if(popGeo.hasIndex()){shape._webgl.popGeometry=1;shape._webgl.buffers[0]=gl.createBuffer();gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER,shape._webgl.buffers[0]);gl.bufferData(gl.ELEMENT_ARRAY_BUFFER,popGeo.getTotalNumberOfIndices()*2,gl.STATIC_DRAW);shape._webgl.buffers[5]=gl.createBuffer();var idBuffer=new Float32Array(popGeo._vf.vertexBufferSize);(function(){for(var i=0;i0){redrawNeeded=true;var indexDataView=new Uint8Array(data,0,indexDataLengthInBytes);gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER,shape._webgl.buffers[0]);(function(){var indexDataOffset=0;for(var i=0;i0){redrawNeeded=true;var attributeDataView=new Uint8Array(data,indexDataLengthInBytes,vertexDataLengthInBytes);gl.bindBuffer(gl.ARRAY_BUFFER,shape._webgl.buffers[1]);if(!popGeo.hasIndex()){gl.bufferSubData(gl.ARRAY_BUFFER,shape._webgl.currentNumVertices*popGeo.getAttributeStride(),attributeDataView);} else{gl.bufferSubData(gl.ARRAY_BUFFER,popGeo.getVertexDataBufferOffset(lvl)*popGeo.getAttributeStride(),attributeDataView);} shape._webgl.numVerticesAtLevel[lvl]=vertexDataLengthInBytes/popGeo.getAttributeStride();shape._webgl.currentNumVertices+=shape._webgl.numVerticesAtLevel[lvl];} (function(){var numValidIndices=0;for(var i=shape._webgl.levelsAvailable;i0&&env._lowPriorityThreshold<1);this.sortTrans=drawableCollectionConfig.sortTrans;this.prioLevels=10;this.maxTreshold=100;this.sortBySortKey=false;this.sortByPriority=false;this.numberOfNodes=0;this.length=0;};x3dom.DrawableCollection.prototype.cull=function(transform,graphState,singlePath,planeMask){var node=graphState.boundedNode;if(!node||!node._vf.render){return-1;} var volume=node.getVolume();var MASK_SET=63;if(this.frustumCulling&&graphState.needCulling){var wvol;if(singlePath&&!graphState.worldVolume.isValid()){graphState.worldVolume.transformFrom(transform,volume);wvol=graphState.worldVolume;} else if(planeMask0||node.forceUpdateCoverage()){var modelViewMat=this.viewMatrix.mult(transform);graphState.center=modelViewMat.multMatrixPnt(volume.getCenter());var rVec=modelViewMat.multMatrixVec(volume.getRadialVec());var r=rVec.length();var dist=Math.max(-graphState.center.z-r,this.near);var projPixelLength=dist*this.pixelHeightAtDistOne;graphState.coverage=(r*2.0)/projPixelLength;if(this.smallFeatureThreshold>0&&graphState.coverage0){drawable.zPos=graphState.center.z;} else{var center=transform.multMatrixPnt(shape.getCenter());center=this.viewMatrix.multMatrixPnt(center);drawable.zPos=center.z;}} if(!this.sortBySortKey&&drawable.sortKey!=0){this.sortBySortKey=true;} if(this.collection[drawable.sortType]===undefined){this.collection[drawable.sortType]=[];} this.collection[drawable.sortType].push(drawable);this.length++;if(this.context&&this.gl){this.context.setupShape(this.gl,drawable,this.viewarea);}};x3dom.DrawableCollection.prototype.addDrawable=function(drawable){drawable.shaderID=drawable.shape.getShaderProperties(this.viewarea).id;var appearance=drawable.shape._cf.appearance.node;drawable.sortType=appearance?appearance._vf.sortType.toLowerCase():"opaque";drawable.sortKey=appearance?appearance._vf.sortKey:0;if(drawable.sortType=='transparent'){var center=drawable.transform.multMatrixPnt(drawable.shape.getCenter());center=this.viewMatrix.multMatrixPnt(center);drawable.zPos=center.z;} if(!this.sortBySortKey&&drawable.sortKey!=0){this.sortBySortKey=true;} if(this.collection[drawable.sortType]===undefined){this.collection[drawable.sortType]=[];} this.collection[drawable.sortType].push(drawable);this.length++;if(this.context&&this.gl){this.context.setupShape(this.gl,drawable,this.viewarea);}};x3dom.DrawableCollection.prototype.calculatePriority=function(graphState){var priority=Math.max(0,graphState.coverage);var pl=this.prioLevels-1;priority=Math.min(Math.round(priority/(this.maxTreshold/pl)),pl);return priority;};x3dom.DrawableCollection.prototype.concat=function(){var opaque=(this.collection['opaque']!==undefined)?this.collection['opaque']:[];var transparent=(this.collection['transparent']!==undefined)?this.collection['transparent']:[];this.collection=opaque.concat(transparent);};x3dom.DrawableCollection.prototype.get=function(idx){return this.collection[idx];};x3dom.DrawableCollection.prototype.sort=function(){var opaque=[];var transparent=[];var that=this;if(this.collection['opaque']!==undefined){if(this.sortOpaque){this.collection['opaque'].sort(function(a,b){if(a.sortKey==b.sortKey||!that.sortBySortKey){return b.priority-a.priority;} return a.sortKey-b.sortKey;});} opaque=this.collection['opaque'];} if(this.collection['transparent']!==undefined){if(this.sortTrans){this.collection['transparent'].sort(function(a,b){if(a.sortKey==b.sortKey||!that.sortBySortKey){if(a.priority==b.priority||!that.sortByPriority){return a.zPos-b.zPos;} return b.priority-a.priority;} return a.sortKey-b.sortKey;});} transparent=this.collection['transparent'];} this.collection=opaque.concat(transparent);};x3dom.DrawableCollection.prototype.forEach=function(fnc,maxPriority){maxPriority=(maxPriority!==undefined)?Math.min(maxPriority,this.prioLevels):this.prioLevels;var sortKey,priority,shaderID,drawable;for(sortKey=0;sortKey0;--priority) {if(this.collection['opaque'][sortKey][priority]!==undefined) {for(shaderID in this.collection['opaque'][sortKey][priority]) {for(drawable=0;drawable0;--priority) {if(this.collection['transparent'][sortKey][priority]!==undefined) {for(var shaderId in this.collection['transparent'][sortKey][priority]) {this.collection['transparent'][sortKey][priority][shaderId].sort(function(a,b){return a.zPos-b.zPos});for(drawable=0;drawable0&&that._buttonState!=4){var x=that._gridSize*Math.round(track.x/that._gridSize);var y=that._gridSize*Math.round(track.y/that._gridSize);var z=that._gridSize*Math.round(track.z/that._gridSize);track=new x3dom.fields.SFVec3f(x,y,z);} if(!that._matrixTrafo){if(that._buttonState==4){that._moveable.setAttribute("rotation",track.toAxisAngle().toString());} else{that._moveable.setAttribute("translation",track.toString());}} else{if(that._buttonState==4){that._matrixTrafo.setRotate(track);} else{that._matrixTrafo.setTranslate(track);} that._moveable.setAttribute("matrix",that._matrixTrafo.toGL().toString());} if(that._callback){that._callback(that._moveable,track);}} that._lastX=pos[0];that._lastY=pos[1];}}};x3dom.Moveable.prototype.stop=function(event){for(var i=0,n=this._iMove.length;i>>8&255]<<16|H[b>>>16&255]<<8|H[b>>>24&255])>>32-a:H[b]>>8-a);if(8>a+f)g=g<>a-k-1&1,8===++f&&(f=0,d[e++]=H[g],g=0,e===d.length&&(d=this.f()));d[e]=g;this.buffer=d;this.m=f;this.index=e};F.prototype.finish=function(){var b=this.buffer,a=this.index,c;0ca;++ca){for(var K=ca,da=K,ea=7,K=K>>>1;K;K>>>=1)da<<=1,da|=K&1,--ea;ba[ca]=(da<>>0}var H=ba;function ja(b,a,c){var d,e="number"===typeof a?a:a=0,f="number"===typeof c?c:b.length;d=-1;for(e=f&7;e--;++a)d=d>>>8^O[(d^b[a])&255];for(e=f>>3;e--;a+=8)d=d>>>8^O[(d^b[a])&255],d=d>>>8^O[(d^b[a+1])&255],d=d>>>8^O[(d^b[a+2])&255],d=d>>>8^O[(d^b[a+3])&255],d=d>>>8^O[(d^b[a+4])&255],d=d>>>8^O[(d^b[a+5])&255],d=d>>>8^O[(d^b[a+6])&255],d=d>>>8^O[(d^b[a+7])&255];return(d^4294967295)>>>0} var ka=[0,1996959894,3993919788,2567524794,124634137,1886057615,3915621685,2657392035,249268274,2044508324,3772115230,2547177864,162941995,2125561021,3887607047,2428444049,498536548,1789927666,4089016648,2227061214,450548861,1843258603,4107580753,2211677639,325883990,1684777152,4251122042,2321926636,335633487,1661365465,4195302755,2366115317,997073096,1281953886,3579855332,2724688242,1006888145,1258607687,3524101629,2768942443,901097722,1119000684,3686517206,2898065728,853044451,1172266101,3705015759,2882616665,651767980,1373503546,3369554304,3218104598,565507253,1454621731,3485111705,3099436303,671266974,1594198024,3322730930,2970347812,795835527,1483230225,3244367275,3060149565,1994146192,31158534,2563907772,4023717930,1907459465,112637215,2680153253,3904427059,2013776290,251722036,2517215374,3775830040,2137656763,141376813,2439277719,3865271297,1802195444,476864866,2238001368,4066508878,1812370925,453092731,2181625025,4111451223,1706088902,314042704,2344532202,4240017532,1658658271,366619977,2362670323,4224994405,1303535960,984961486,2747007092,3569037538,1256170817,1037604311,2765210733,3554079995,1131014506,879679996,2909243462,3663771856,1141124467,855842277,2852801631,3708648649,1342533948,654459306,3188396048,3373015174,1466479909,544179635,3110523913,3462522015,1591671054,702138776,2966460450,3352799412,1504918807,783551873,3082640443,3233442989,3988292384,2596254646,62317068,1957810842,3939845945,2647816111,81470997,1943803523,3814918930,2489596804,225274430,2053790376,3826175755,2466906013,167816743,2097651377,4027552580,2265490386,503444072,1762050814,4150417245,2154129355,426522225,1852507879,4275313526,2312317920,282753626,1742555852,4189708143,2394877945,397917763,1622183637,3604390888,2714866558,953729732,1340076626,3518719985,2797360999,1068828381,1219638859,3624741850,2936675148,906185462,1090812512,3747672003,2825379669,829329135,1181335161,3412177804,3160834842,628085408,1382605366,3423369109,3138078467,570562233,1426400815,3317316542,2998733608,733239954,1555261956,3268935591,3050360625,752459403,1541320221,2607071920,3965973030,1969922972,40735498,2617837225,3943577151,1913087877,83908371,2512341634,3803740692,2075208622,213261112,2463272603,3855990285,2094854071,198958881,2262029012,4057260610,1759359992,534414190,2176718541,4139329115,1873836001,414664567,2282248934,4279200368,1711684554,285281116,2405801727,4167216745,1634467795,376229701,2685067896,3608007406,1308918612,956543938,2808555105,3495958263,1231636301,1047427035,2932959818,3654703836,1088359270,936918E3,2847714899,3736837829,1202900863,817233897,3183342108,3401237130,1404277552,615818150,3134207493,3453421203,1423857449,601450431,3009837614,3294710456,1567103746,711928724,3020668471,3272380065,1510334235,755167117],O=B?new Uint32Array(ka):ka;function P(){}P.prototype.getName=function(){return this.name};P.prototype.getData=function(){return this.data};P.prototype.Y=function(){return this.Z};A("Zlib.GunzipMember",P);A("Zlib.GunzipMember.prototype.getName",P.prototype.getName);A("Zlib.GunzipMember.prototype.getData",P.prototype.getData);A("Zlib.GunzipMember.prototype.getMtime",P.prototype.Y);function la(b){this.buffer=new(B?Uint16Array:Array)(2*b);this.length=0}la.prototype.getParent=function(b){return 2*((b-2)/4|0)};la.prototype.push=function(b,a){var c,d,e=this.buffer,f;c=this.length;e[this.length++]=a;for(e[this.length++]=b;0e[d])f=e[c],e[c]=e[d],e[d]=f,f=e[c+1],e[c+1]=e[d+1],e[d+1]=f,c=d;else break;return this.length};la.prototype.pop=function(){var b,a,c=this.buffer,d,e,f;a=c[0];b=c[1];this.length-=2;c[0]=c[this.length];c[1]=c[this.length+1];for(f=0;;){e=2*f+2;if(e>=this.length)break;e+2c[e]&&(e+=2);if(c[e]>c[f])d=c[f],c[f]=c[e],c[e]=d,d=c[f+1],c[f+1]=c[e+1],c[e+1]=d;else break;f=e}return{index:b,value:a,length:this.length}};function ma(b){var a=b.length,c=0,d=Number.POSITIVE_INFINITY,e,f,g,k,h,l,s,p,m,n;for(p=0;pc&&(c=b[p]),b[p]>=1;n=g<<16|p;for(m=l;mS;S++)switch(u){case 143>=S:sa.push([S+48,8]);break;case 255>=S:sa.push([S-144+400,9]);break;case 279>=S:sa.push([S-256+0,7]);break;case 287>=S:sa.push([S-280+192,8]);break;default:q("invalid literal: "+S)} na.prototype.g=function(){var b,a,c,d,e=this.input;switch(this.k){case 0:c=0;for(d=e.length;c>>8&255;m[n++]=l&255;m[n++]=l>>>8&255;if(B)m.set(f,n),n+=f.length,m=m.subarray(0,n);else{s=0;for(p=f.length;sz)for(;0z?z:138,D>z-3&&D=D?(I[G++]=17,I[G++]=D-3,M[17]++):(I[G++]=18,I[G++]=D-11,M[18]++),z-=D;else if(I[G++]=J[w],M[J[w]]++,z--,3>z)for(;0z?z:6,D>z-3&&DC;C++)wa[C]=oa[pb[C]];for(Z=19;4=a:return[265,a-11,1];case 14>=a:return[266,a-13,1];case 16>=a:return[267,a-15,1];case 18>=a:return[268,a-17,1];case 22>=a:return[269,a-19,2];case 26>=a:return[270,a-23,2];case 30>=a:return[271,a-27,2];case 34>=a:return[272,a-31,2];case 42>=a:return[273,a-35,3];case 50>=a:return[274,a-43,3];case 58>=a:return[275,a-51,3];case 66>=a:return[276,a-59,3];case 82>=a:return[277,a-67,4];case 98>=a:return[278,a-83,4];case 114>=a:return[279,a-99,4];case 130>=a:return[280,a-115,4];case 162>=a:return[281,a-131,5];case 194>=a:return[282,a-163,5];case 226>=a:return[283,a-195,5];case 257>=a:return[284,a-227,5];case 258===a:return[285,a-258,0];default:q("invalid length: "+a)}}var a=[],c,d;for(c=3;258>=c;c++)d=b(c),a[c]=d[2]<<24|d[1]<<16|d[0];return a}(),Aa=B?new Uint32Array(ya):ya;function ta(b,a){function c(a,c){var b=a.Q,d=[],e=0,f;f=Aa[a.length];d[e++]=f&65535;d[e++]=f>>16&255;d[e++]=f>>24;var g;switch(u){case 1===b:g=[0,b-1,0];break;case 2===b:g=[1,b-2,0];break;case 3===b:g=[2,b-3,0];break;case 4===b:g=[3,b-4,0];break;case 6>=b:g=[4,b-5,1];break;case 8>=b:g=[5,b-7,1];break;case 12>=b:g=[6,b-9,2];break;case 16>=b:g=[7,b-13,2];break;case 24>=b:g=[8,b-17,3];break;case 32>=b:g=[9,b-25,3];break;case 48>=b:g=[10,b-33,4];break;case 64>=b:g=[11,b-49,4];break;case 96>=b:g=[12,b- 65,5];break;case 128>=b:g=[13,b-97,5];break;case 192>=b:g=[14,b-129,6];break;case 256>=b:g=[15,b-193,6];break;case 384>=b:g=[16,b-257,7];break;case 512>=b:g=[17,b-385,7];break;case 768>=b:g=[18,b-513,8];break;case 1024>=b:g=[19,b-769,8];break;case 1536>=b:g=[20,b-1025,9];break;case 2048>=b:g=[21,b-1537,9];break;case 3072>=b:g=[22,b-2049,10];break;case 4096>=b:g=[23,b-3073,10];break;case 6144>=b:g=[24,b-4097,11];break;case 8192>=b:g=[25,b-6145,11];break;case 12288>=b:g=[26,b-8193,12];break;case 16384>=b:g=[27,b-12289,12];break;case 24576>=b:g=[28,b-16385,13];break;case 32768>=b:g=[29,b-24577,13];break;default:q("invalid distance")}f=g;d[e++]=f[0];d[e++]=f[1];d[e++]=f[2];var h,k;h=0;for(k=d.length;h=f;)v[f++]=0;for(f=0;29>=f;)x[f++]=0}v[256]=1;d=0;for(e=a.length;d=e){p&&c(p,-1);f=0;for(g=e-d;fg&&a+gf&&(e=d,f=g);if(258===g)break}return new xa(f,a-e)} function ua(b,a){var c=b.length,d=new la(572),e=new(B?Uint8Array:Array)(c),f,g,k,h,l;if(!B)for(h=0;h2*e[n-1]+f[n]&&(e[n]=2*e[n-1]+f[n]),k[n]=Array(e[n]),h[n]=Array(e[n]);for(m=0;mb[m]?(k[n][r]=v,h[n][r]=a,x+=2):(k[n][r]=b[m],h[n][r]=m,++m);l[n]=0;1===f[n]&&d(n)}return g} function va(b){var a=new(B?Uint16Array:Array)(b.length),c=[],d=[],e=0,f,g,k,h;f=0;for(g=b.length;f>>=1}return a};function Da(b,a){this.input=b;this.b=this.c=0;this.i={};a&&(a.flags&&(this.i=a.flags),"string"===typeof a.filename&&(this.filename=a.filename),"string"===typeof a.comment&&(this.A=a.comment),a.deflateOptions&&(this.l=a.deflateOptions));this.l||(this.l={})} Da.prototype.g=function(){var b,a,c,d,e,f,g,k,h=new(B?Uint8Array:Array)(32768),l=0,s=this.input,p=this.c,m=this.filename,n=this.A;h[l++]=31;h[l++]=139;h[l++]=8;b=0;this.i.fname&&(b|=Ea);this.i.fcomment&&(b|=Fa);this.i.fhcrc&&(b|=Ga);h[l++]=b;a=(Date.now?Date.now():+new Date)/1E3|0;h[l++]=a&255;h[l++]=a>>>8&255;h[l++]=a>>>16&255;h[l++]=a>>>24&255;h[l++]=0;h[l++]=Ha;if(this.i.fname!==t){g=0;for(k=m.length;g>>8&255),h[l++]=f&255;h[l++]=0}if(this.i.comment){g=0;for(k=n.length;g>>8&255),h[l++]=f&255;h[l++]=0}this.i.fhcrc&&(c=ja(h,0,l)&65535,h[l++]=c&255,h[l++]=c>>>8&255);this.l.outputBuffer=h;this.l.outputIndex=l;e=new na(s,this.l);h=e.g();l=e.b;B&&(l+8>h.buffer.byteLength?(this.a=new Uint8Array(l+8),this.a.set(new Uint8Array(h.buffer)),h=this.a):h=new Uint8Array(h.buffer));d=ja(s,t,t);h[l++]=d&255;h[l++]=d>>>8&255;h[l++]=d>>>16&255;h[l++]=d>>>24&255;k=s.length;h[l++]=k&255;h[l++]=k>>>8&255;h[l++]=k>>>16&255;h[l++]=k>>>24&255;this.c=p;B&&l>>=1;switch(b){case 0:var a=this.input,c=this.c,d=this.a,e=this.b,f=a.length,g=t,k=t,h=d.length,l=t;this.e=this.j=0;c+1>=f&&q(Error("invalid uncompressed block header: LEN"));g=a[c++]|a[c++]<<8;c+1>=f&&q(Error("invalid uncompressed block header: NLEN"));k=a[c++]|a[c++]<<8;g===~k&&q(Error("invalid uncompressed block header: length verify"));c+g>a.length&&q(Error("input buffer is broken"));switch(this.r){case Ja:for(;e+g>d.length;){l=h-e;g-=l;if(B)d.set(a.subarray(c,c+l),e),e+=l,c+=l;else for(;l--;)d[e++]=a[c++];this.b=e;d=this.f();e=this.b}break;case Ia:for(;e+g>d.length;)d=this.f({F:2});break;default:q(Error("invalid inflate mode"))}if(B)d.set(a.subarray(c,c+g),e),e+=g,c+=g;else for(;g--;)d[e++]=a[c++];this.c=c;this.b=e;this.a=d;break;case 1:this.s(Za,$a);break;case 2:ab(this);break;default:q(Error("unknown BTYPE: "+b))}}return this.B()};var bb=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],cb=B?new Uint16Array(bb):bb,db=[3,4,5,6,7,8,9,10,11,13,15,17,19,23,27,31,35,43,51,59,67,83,99,115,131,163,195,227,258,258,258],eb=B?new Uint16Array(db):db,fb=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0],gb=B?new Uint8Array(fb):fb,hb=[1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577],ib=B?new Uint16Array(hb):hb,jb=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],kb=B?new Uint8Array(jb):jb,lb=new(B?Uint8Array:Array)(288),V,mb;V=0;for(mb=lb.length;V=V?8:255>=V?9:279>=V?7:8;var Za=ma(lb),nb=new(B?Uint8Array:Array)(30),ob,qb;ob=0;for(qb=nb.length;ob=g&&q(Error("input buffer is broken")),c|=e[f++]<>>a;b.e=d-a;b.c=f;return k} function rb(b,a){for(var c=b.j,d=b.e,e=b.input,f=b.c,g=e.length,k=a[0],h=a[1],l,s;d=g);)c|=e[f++]<>>16;b.j=c>>s;b.e=d-s;b.c=f;return l&65535} function ab(b){function a(a,b,c){var d,e=this.J,f,g;for(g=0;gf)d>=e&&(this.b=d,c=this.f(),d=this.b),c[d++]=f;else{g=f-257;h=eb[g];0=e&&(this.b=d,c=this.f(),d=this.b);for(;h--;)c[d]=c[d++-k]}for(;8<=this.e;)this.e-=8,this.c--;this.b=d};T.prototype.T=function(b,a){var c=this.a,d=this.b;this.C=b;for(var e=c.length,f,g,k,h;256!==(f=rb(this,b));)if(256>f)d>=e&&(c=this.f(),e=c.length),c[d++]=f;else{g=f-257;h=eb[g];0e&&(c=this.f(),e=c.length);for(;h--;)c[d]=c[d++-k]}for(;8<=this.e;)this.e-=8,this.c--;this.b=d};T.prototype.f=function(){var b=new(B?Uint8Array:Array)(this.b-32768),a=this.b-32768,c,d,e=this.a;if(B)b.set(e.subarray(32768,b.length));else{c=0;for(d=b.length;cc;++c)e[c]=e[a+c];this.b=32768;return e};T.prototype.U=function(b){var a,c=this.input.length/this.c+1|0,d,e,f,g=this.input,k=this.a;b&&("number"===typeof b.F&&(c=b.F),"number"===typeof b.P&&(c+=b.P));2>c?(d=(g.length-this.c)/this.C[2],f=258*(d/2)|0,e=fa&&(this.a.length=a),b=this.a);return this.buffer=b};function sb(b){this.input=b;this.c=0;this.t=[];this.D=!1}sb.prototype.X=function(){this.D||this.h();return this.t.slice()};sb.prototype.h=function(){for(var b=this.input.length;this.c>>0;ja(e,t,t)!==s&&q(Error("invalid CRC-32 checksum: 0x"+ja(e,t,t).toString(16)+" / 0x"+s.toString(16)));a.da=c=(p[m++]|p[m++]<<8|p[m++]<<16|p[m++]<<24)>>>0;(e.length&4294967295)!==c&&q(Error("invalid input size: "+(e.length&4294967295)+" / "+c));this.t.push(a);this.c=m}this.D=u;var n=this.t,r,v,x=0,Q=0,y;r=0;for(v=n.length;r>>0;b=a}for(var e=1,f=0,g=b.length,k,h=0;0>>0};function ub(b,a){var c,d;this.input=b;this.c=0;if(a||!(a={}))a.index&&(this.c=a.index),a.verify&&(this.$=a.verify);c=b[this.c++];d=b[this.c++];switch(c&15){case vb:this.method=vb;break;default:q(Error("unsupported compression method"))}0!==((c<<8)+d)%31&&q(Error("invalid fcheck flag:"+((c<<8)+d)%31));d&32&&q(Error("fdict flag is not supported"));this.L=new T(b,{index:this.c,bufferSize:a.bufferSize,bufferType:a.bufferType,resize:a.resize})} ub.prototype.h=function(){var b=this.input,a,c;a=this.L.h();this.c=this.L.c;this.$&&(c=(b[this.c++]<<24|b[this.c++]<<16|b[this.c++]<<8|b[this.c++])>>>0,c!==tb(a)&&q(Error("invalid adler-32 checksum")));return a};var vb=8;function wb(b,a){this.input=b;this.a=new(B?Uint8Array:Array)(32768);this.k=W.o;var c={},d;if((a||!(a={}))&&"number"===typeof a.compressionType)this.k=a.compressionType;for(d in a)c[d]=a[d];c.outputBuffer=this.a;this.K=new na(this.input,c)}var W=ra;wb.prototype.g=function(){var b,a,c,d,e,f,g,k=0;g=this.a;b=vb;switch(b){case vb:a=Math.LOG2E*Math.log(32768)-8;break;default:q(Error("invalid compression method"))}c=a<<4|b;g[k++]=c;switch(b){case vb:switch(this.k){case W.NONE:e=0;break;case W.v:e=1;break;case W.o:e=2;break;default:q(Error("unsupported compression type"))}break;default:q(Error("invalid compression method"))}d=e<<6|0;g[k++]=d|31-(256*c+d)%31;f=tb(this.input);this.K.b=k;g=this.K.g();k=g.length;B&&(g=new Uint8Array(g.buffer),g.length<=k+4&&(this.a=new Uint8Array(g.length+4),this.a.set(g),g=this.a),g=g.subarray(0,k+4));g[k++]=f>>24&255;g[k++]=f>>16&255;g[k++]=f>>8&255;g[k++]=f&255;return g};function xb(b,a){var c,d,e,f;if(Object.keys)c=Object.keys(a);else for(d in c=[],e=0,a)c[e++]=d;e=0;for(f=c.length;e-1);this.backend=this.x3dElem.getAttribute('backend');if(this.backend) this.backend=this.backend.toLowerCase();else this.backend='none';if(this.backend=='flash'){this.backend='flash';this.canvas=this._createFlashObject(x3dElem);if(this.canvas!=null){this.canvas.parent=this;this.gl=this._initFlashContext(this.canvas,this.flash_renderType);}else{this._createInitFailedDiv(x3dElem);return;}}else{this.canvas=this._createHTMLCanvas(x3dElem);this.canvas.parent=this;this.gl=this._initContext(this.canvas,(this.backend.search("desktop")>=0),(this.backend.search("mobile")>=0),(this.backend.search("flashie")>=0),(this.backend.search("webgl2")>=0));this.backend='webgl';if(this.gl==null) {x3dom.debug.logInfo("Fallback to Flash Renderer");this.backend='flash';this.canvas=this._createFlashObject(x3dElem);if(this.canvas!=null){this.canvas.parent=this;this.gl=this._initFlashContext(this.canvas,this.flash_renderType);}else{this._createInitFailedDiv(x3dElem);return;}}} x3dom.caps.BACKEND=this.backend;var runtimeEnabled=x3dElem.getAttribute("runtimeEnabled");if(runtimeEnabled!==null){this.hasRuntime=(runtimeEnabled.toLowerCase()=="true");}else{this.hasRuntime=x3dElem.hasRuntime;} if(this.gl===null){this.hasRuntime=false;} if(this.backend!="flash"){this.showStat=x3dElem.getAttribute("showStat");this.stateViewer=new x3dom.States(x3dElem);if(this.showStat!==null&&this.showStat=="true"){this.stateViewer.display(true);} this.x3dElem.appendChild(this.stateViewer.viewer);} this.showProgress=x3dElem.getAttribute("showProgress");this.progressDiv=this._createProgressDiv();this.progressDiv.style.display=(this.showProgress!==null&&this.showProgress=="true")?"inline":"none";this.x3dElem.appendChild(this.progressDiv);this.showTouchpoints=x3dElem.getAttribute("showTouchpoints");this.showTouchpoints=this.showTouchpoints?!(this.showTouchpoints.toLowerCase()=="false"):true;this.disableTouch=x3dElem.getAttribute("disableTouch");this.disableTouch=this.disableTouch?(this.disableTouch.toLowerCase()=="true"):false;this.disableKeys=x3dElem.getAttribute("keysEnabled");this.disableKeys=this.disableKeys?(this.disableKeys.toLowerCase()=="true"):false;this.disableRightDrag=x3dElem.getAttribute("disableRightDrag");this.disableRightDrag=this.disableRightDrag?(this.disableRightDrag.toLowerCase()=="true"):false;this.disableLeftDrag=x3dElem.getAttribute("disableLeftDrag");this.disableLeftDrag=this.disableLeftDrag?(this.disableLeftDrag.toLowerCase()=="true"):false;this.disableMiddleDrag=x3dElem.getAttribute("disableMiddleDrag");this.disableMiddleDrag=this.disableMiddleDrag?(this.disableMiddleDrag.toLowerCase()=="true"):false;if(this.canvas!==null&&this.gl!==null&&this.hasRuntime&&this.backend!=="flash"){this.canvas.mouse_dragging=false;this.canvas.mouse_button=0;this.canvas.mouse_drag_x=0;this.canvas.mouse_drag_y=0;this.canvas.isMulti=false;this.canvas.oncontextmenu=function(evt){evt.preventDefault();evt.stopPropagation();return false;};this.canvas.addEventListener("webglcontextlost",function(event){x3dom.debug.logError("WebGL context lost");event.preventDefault();},false);this.canvas.addEventListener("webglcontextrestored",function(event){x3dom.debug.logError("recover WebGL state and resources on context lost NYI");event.preventDefault();},false);this.canvas.addEventListener('mousedown',function(evt){if(!this.isMulti){this.focus();this.classList.add('x3dom-canvas-mousedown');switch(evt.button){case 0:this.mouse_button=1;break;case 1:this.mouse_button=4;break;case 2:this.mouse_button=2;break;default:this.mouse_button=0;break;} if(evt.shiftKey){this.mouse_button=1;} if(evt.ctrlKey){this.mouse_button=4;} if(evt.altKey){this.mouse_button=2;} var pos=this.parent.mousePosition(evt);this.mouse_drag_x=pos.x;this.mouse_drag_y=pos.y;this.mouse_dragging=true;this.parent.doc.onMousePress(that.gl,this.mouse_drag_x,this.mouse_drag_y,this.mouse_button);this.parent.doc.needRender=true;}},false);this.canvas.addEventListener('mouseup',function(evt){if(!this.isMulti){var prev_mouse_button=this.mouse_button;this.classList.remove('x3dom-canvas-mousedown');this.mouse_button=0;this.mouse_dragging=false;this.parent.doc.onMouseRelease(that.gl,this.mouse_drag_x,this.mouse_drag_y,this.mouse_button,prev_mouse_button);this.parent.doc.needRender=true;}},false);this.canvas.addEventListener('mouseover',function(evt){if(!this.isMulti){this.mouse_button=0;this.mouse_dragging=false;this.parent.doc.onMouseOver(that.gl,this.mouse_drag_x,this.mouse_drag_y,this.mouse_button);this.parent.doc.needRender=true;}},false);this.canvas.addEventListener('mouseout',function(evt){if(!this.isMulti){this.mouse_button=0;this.mouse_dragging=false;this.classList.remove('x3dom-canvas-mousedown');this.parent.doc.onMouseOut(that.gl,this.mouse_drag_x,this.mouse_drag_y,this.mouse_button);this.parent.doc.needRender=true;}},false);this.canvas.addEventListener('dblclick',function(evt){if(!this.isMulti){this.mouse_button=0;var pos=this.parent.mousePosition(evt);this.mouse_drag_x=pos.x;this.mouse_drag_y=pos.y;this.mouse_dragging=false;this.parent.doc.onDoubleClick(that.gl,this.mouse_drag_x,this.mouse_drag_y);this.parent.doc.needRender=true;}},false);this.canvas.addEventListener('mousemove',function(evt){if(!this.isMulti){var pos=this.parent.mousePosition(evt);if(pos.x!=that.lastMousePos.x||pos.y!=that.lastMousePos.y){that.lastMousePos=pos;if(evt.shiftKey){this.mouse_button=1;} if(evt.ctrlKey){this.mouse_button=4;} if(evt.altKey){this.mouse_button=2;} this.mouse_drag_x=pos.x;this.mouse_drag_y=pos.y;if(this.mouse_dragging){if(this.mouse_button==1&&!this.parent.disableLeftDrag||this.mouse_button==2&&!this.parent.disableRightDrag||this.mouse_button==4&&!this.parent.disableMiddleDrag) {this.parent.doc.onDrag(that.gl,this.mouse_drag_x,this.mouse_drag_y,this.mouse_button);}} else{this.parent.doc.onMove(that.gl,this.mouse_drag_x,this.mouse_drag_y,this.mouse_button);} this.parent.doc.needRender=true;evt.preventDefault();evt.stopPropagation();}}},false);this.canvas.addEventListener('DOMMouseScroll',function(evt){if(!this.isMulti){this.focus();var originalY=this.parent.mousePosition(evt).y;this.mouse_drag_y+=2*evt.detail;this.parent.doc.onWheel(that.gl,this.mouse_drag_x,this.mouse_drag_y,originalY);this.parent.doc.needRender=true;evt.preventDefault();evt.stopPropagation();}},false);this.canvas.addEventListener('mousewheel',function(evt){if(!this.isMulti){this.focus();var originalY=this.parent.mousePosition(evt).y;this.mouse_drag_y-=0.1*evt.wheelDelta;this.parent.doc.onWheel(that.gl,this.mouse_drag_x,this.mouse_drag_y,originalY);this.parent.doc.needRender=true;evt.preventDefault();evt.stopPropagation();}},false);this.canvas.addEventListener('keypress',function(evt){if(!this.parent.disableKeys){this.parent.doc.onKeyPress(evt.charCode);} this.parent.doc.needRender=true;},true);this.canvas.addEventListener('keyup',function(evt){if(!this.parent.disableKeys){this.parent.doc.onKeyUp(evt.keyCode);} this.parent.doc.needRender=true;},true);this.canvas.addEventListener('keydown',function(evt){if(!this.parent.disableKeys){this.parent.doc.onKeyDown(evt.keyCode);} this.parent.doc.needRender=true;},true);var touches={numTouches:0,firstTouchTime:new Date().getTime(),firstTouchPoint:new x3dom.fields.SFVec2f(0,0),lastPos:new x3dom.fields.SFVec2f(),lastDrag:new x3dom.fields.SFVec2f(),lastMiddle:new x3dom.fields.SFVec2f(),lastSquareDistance:0,lastAngle:0,lastLayer:[],examineNavType:1,calcAngle:function(vector) {var rotation=vector.normalize().dot(new x3dom.fields.SFVec2f(1,0));rotation=Math.acos(rotation);if(vector.y<0) rotation=Math.PI+(Math.PI-rotation);return rotation;},disableTouch:this.disableTouch,visMarker:this.showTouchpoints,visMarkerBag:[],visualizeTouches:function(evt) {if(!this.visMarker) return;var touchBag=[];var marker=null;for(var i=0;i=0){marker=document.getElementById("visMarker"+id);marker.style.left=(evt.touches[i].pageX)+"px";marker.style.top=(evt.touches[i].pageY)+"px";} else{marker=document.createElement("div");marker.appendChild(document.createTextNode("#"+id));marker.id="visMarker"+id;marker.className="x3dom-touch-marker";document.body.appendChild(marker);index=this.visMarkerBag.length;this.visMarkerBag[index]=id;} touchBag.push(id);} for(var j=this.visMarkerBag.length-1;j>=0;j--){var oldId=this.visMarkerBag[j];if(touchBag.indexOf(oldId)<0){this.visMarkerBag.splice(j,1);marker=document.getElementById("visMarker"+oldId);document.body.removeChild(marker);}}}};var mozilla_ids=[];var mozilla_touches={touches:[],preventDefault:function(){}};var touchStartHandler=function(evt,doc) {this.isMulti=true;evt.preventDefault();touches.visualizeTouches(evt);this.focus();if(doc==null) doc=this.parent.doc;var navi=doc._scene.getNavigationInfo();switch(navi.getType()){case"examine":touches.examineNavType=1;break;case"turntable":touches.examineNavType=2;break;default:touches.examineNavType=0;break;} touches.lastLayer=[];var i,pos;for(i=0;i=2){touches.numTouches=2;var touch0=new x3dom.fields.SFVec2f(evt.touches[0].screenX,evt.touches[0].screenY);var touch1=new x3dom.fields.SFVec2f(evt.touches[1].screenX,evt.touches[1].screenY);var distance=touch1.subtract(touch0);var middle=distance.multiply(0.5).add(touch0);var squareDistance=distance.dot(distance);touches.lastMiddle=middle;touches.lastSquareDistance=squareDistance;touches.lastAngle=touches.calcAngle(distance);touches.lastPos=this.parent.mousePosition(evt.touches[0]);} doc._scene.updateVolume();if(touches.examineNavType==1){for(i=0;i=2){touch0=new x3dom.fields.SFVec2f(evt.touches[0].screenX,evt.touches[0].screenY);touch1=new x3dom.fields.SFVec2f(evt.touches[1].screenX,evt.touches[1].screenY);distance=touch1.subtract(touch0);middle=distance.multiply(0.5).add(touch0);squareDistance=distance.dot(distance);deltaMiddle=middle.subtract(touches.lastMiddle);deltaZoom=squareDistance-touches.lastSquareDistance;deltaMove=new x3dom.fields.SFVec3f(deltaMiddle.x/screen.width,-deltaMiddle.y/screen.height,deltaZoom/(screen.width*screen.height*0.2));var rotation=touches.calcAngle(distance);var angleDelta=touches.lastAngle-rotation;touches.lastAngle=rotation;rotMatrix=x3dom.fields.SFMatrix4f.rotationZ(angleDelta);touches.lastMiddle=middle;touches.lastSquareDistance=squareDistance;doc.onMoveView(that.gl,deltaMove,rotMatrix);}} else if(evt.touches.length){if(touches.examineNavType==2&&evt.touches.length>=2){touch0=new x3dom.fields.SFVec2f(evt.touches[0].screenX,evt.touches[0].screenY);touch1=new x3dom.fields.SFVec2f(evt.touches[1].screenX,evt.touches[1].screenY);distance=touch1.subtract(touch0);squareDistance=distance.dot(distance);deltaZoom=(squareDistance-touches.lastSquareDistance)/(0.1*(screen.width+screen.height));touches.lastPos.y+=deltaZoom;touches.lastSquareDistance=squareDistance;doc.onDrag(that.gl,touches.lastPos.x,touches.lastPos.y,2);} else{pos=this.parent.mousePosition(evt.touches[0]);doc.onDrag(that.gl,pos.x,pos.y,1);}} doc.needRender=true;};var touchMoveHandlerMoz=function(evt) {evt.preventDefault();for(var i=0;icrossdomain.xml "+"file in the root directory of your domain to access textures");} var width=this.x3dElem.getAttribute("width");var idx=-1;if(width==null){width=550;}else{idx=width.indexOf("px");if(idx!=-1){width=width.substr(0,idx);}} var height=this.x3dElem.getAttribute("height");if(height==null){height=400;}else{idx=height.indexOf("px");if(idx!=-1){height=height.substr(0,idx);}} var renderType=this.x3dElem.getAttribute("flashrenderer");if(renderType==null){this.flash_renderType="forward";}else{this.flash_renderType="deferred";} var obj=document.createElement('object');obj.setAttribute('width','100%');obj.setAttribute('height','100%');obj.setAttribute('id',id);if(!document.doctype||document.doctype&&document.doctype.publicId&&document.doctype.publicId.search(/DTD XHTML/i)!=-1){x3dom.debug.logWarning("Flash backend doesn't like XHTML, please use HTML5!");obj.setAttribute('style','width:'+width+'px; height:'+height+'px;');}else{if(x3dElem.getAttribute('style')==null){x3dElem.setAttribute('style','width:'+width+'px; height:'+height+'px;');}} this.appendParam(obj,'menu','false');this.appendParam(obj,'quality','high');this.appendParam(obj,'wmode','direct');this.appendParam(obj,'allowScriptAccess','always');this.appendParam(obj,'flashvars','canvasIdx='+this._canvasIdx+'&renderType='+this.flash_renderType);this.appendParam(obj,'movie',swf_path);if(navigator.appName=="Microsoft Internet Explorer"){x3dElem.appendChild(obj);obj.setAttribute('classid','clsid:d27cdb6e-ae6d-11cf-96b8-444553540000');}else{obj.setAttribute('type','application/x-shockwave-flash');obj.setAttribute('data',swf_path);x3dElem.appendChild(obj);} return obj;}};x3dom.X3DCanvas.prototype._createHTMLCanvas=function(x3dElem) {x3dom.debug.logInfo("Creating canvas for (X)3D element...");var canvas=document.createElement('canvas');canvas.setAttribute("class","x3dom-canvas");var userStyle=x3dElem.getAttribute("style");if(userStyle){x3dom.debug.logInfo("Inline X3D styles detected");} var evtArr=["onmousedown","onmousemove","onmouseout","onmouseover","onmouseup","onclick","ondblclick","onkeydown","onkeypress","onkeyup","ontouchstart","ontouchmove","ontouchend","ontouchcancel","ontouchleave","ontouchenter","ondragstart","ondrop","ondragover"];for(var i=0;i=0){x3dom.debug.logWarning("The width attribute is to be specified in pixels not in percent.");} canvas.style.width=w;canvas.setAttribute("width",w);} if((h=x3dElem.getAttribute("height"))!==null){if(h.indexOf("%")>=0){x3dom.debug.logWarning("The height attribute is to be specified in pixels not in percent.");} canvas.style.height=h;canvas.setAttribute("height",h);} canvas.setAttribute("tabindex","0");return canvas;};x3dom.X3DCanvas.prototype._watchForResize=function(){var new_dim=[parseInt(x3dom.getStyle(this.canvas,"width")),parseInt(x3dom.getStyle(this.canvas,"height"))];if((this._current_dim[0]!=new_dim[0])||(this._current_dim[1]!=new_dim[1])){this._current_dim=new_dim;this.x3dElem.setAttribute("width",new_dim[0]+"px");this.x3dElem.setAttribute("height",new_dim[1]+"px");}};x3dom.X3DCanvas.prototype._createProgressDiv=function(){var progressDiv=document.createElement('div');progressDiv.setAttribute("class","x3dom-progress");var _text=document.createElement('strong');_text.appendChild(document.createTextNode('Loading...'));progressDiv.appendChild(_text);var _inner=document.createElement('span');_inner.setAttribute('style',"width: 25%;");_inner.appendChild(document.createTextNode(' '));progressDiv.appendChild(_inner);progressDiv.oncontextmenu=progressDiv.onmousedown=function(evt){evt.preventDefault();evt.stopPropagation();return false;};return progressDiv;};x3dom.X3DCanvas.prototype.mousePosition=function(evt) {var x=0,y=0;if("getBoundingClientRect"in document.documentElement){var elem=evt.target.offsetParent;var box=elem.getBoundingClientRect();var scrollLeft=window.pageXOffset||document.documentElement.scrollLeft;var scrollTop=window.pageYOffset||document.documentElement.scrollTop;var compStyle=document.defaultView.getComputedStyle(elem,null);var paddingLeft=parseFloat(compStyle.getPropertyValue('padding-left'));var borderLeftWidth=parseFloat(compStyle.getPropertyValue('border-left-width'));var paddingTop=parseFloat(compStyle.getPropertyValue('padding-top'));var borderTopWidth=parseFloat(compStyle.getPropertyValue('border-top-width'));x=Math.round(evt.pageX-(box.left+paddingLeft+borderLeftWidth+scrollLeft));y=Math.round(evt.pageY-(box.top+paddingTop+borderTopWidth+scrollTop));} else{x3dom.debug.logError('NO getBoundingClientRect');} return new x3dom.fields.SFVec2f(x,y);};x3dom.X3DCanvas.prototype.tick=function() {var that=this;var runtime=this.x3dElem.runtime;var d=new Date().getTime();var diff=d-this.lastTimeFPSWasTaken;var fps=1000.0/(d-this.fps_t0);this.fps_t0=d;this.doc.advanceTime(d/1000.0);var animD=new Date().getTime()-d;if(this.doc.needRender){if(diff>=1000){runtime.fps=this.framesSinceLastTime/(diff/1000.0);runtime.addMeasurement('FPS',runtime.fps);this.framesSinceLastTime=0;this.lastTimeFPSWasTaken=d;} this.framesSinceLastTime++;runtime.addMeasurement('ANIM',animD);if(runtime.isReady==false){runtime.ready();runtime.isReady=true;} runtime.enterFrame();if(this.backend=='flash'){if(this.isFlashReady){this.canvas.setFPS({fps:fps});this.doc.needRender=false;this.doc.render(this.gl);}} else{this.doc.needRender=false;this.doc.render(this.gl);if(!this.doc._scene._vf.doPickPass) runtime.removeMeasurement('PICKING');} runtime.exitFrame();} if(this.progressDiv){if(this.doc.downloadCount>0){runtime.addInfo("#LOADS:",this.doc.downloadCount);}else{runtime.removeInfo("#LOADS:");} if(this.doc.properties.getProperty("showProgress")!=='false'){if(this.progressDiv){this.progressDiv.childNodes[0].textContent='Loading: '+(+this.doc.downloadCount);if(this.doc.downloadCount>0){this.progressDiv.style.display='inline';}else{this.progressDiv.style.display='none';}}}else{this.progressDiv.style.display='none';}} if(this.doc.downloadCount==0&&this.doc.previousDownloadCount>0) {var evt;if(document.createEvent){evt=document.createEvent("Events");evt.initEvent("downloadsfinished",true,true);that.x3dElem.dispatchEvent(evt);}else if(document.createEventObject){evt=document.createEventObject();that.x3dElem.fireEvent("ondownloadsfinished",evt);}} this.doc.previousDownloadCount=this.doc.downloadCount;};x3dom.X3DCanvas.prototype.load=function(uri,sceneElemPos,settings){this.doc=new x3dom.X3DDocument(this.canvas,this.gl,settings);var x3dCanvas=this;this.doc.onload=function(){if(x3dCanvas.hasRuntime){(function mainloop(){if(x3dCanvas.doc&&x3dCanvas.x3dElem.runtime){x3dCanvas._watchForResize();x3dCanvas.tick();window.requestAnimFrame(mainloop,x3dCanvas);}})();}else{x3dCanvas.tick();}};this.x3dElem.render=function(){if(x3dCanvas.hasRuntime){x3dCanvas.doc.needRender=true;}else{x3dCanvas.doc.render(x3dCanvas.gl);}};this.x3dElem.context=x3dCanvas.gl.ctx3d;this.doc.onerror=function(){alert('Failed to load X3D document');};this.doc.load(uri,sceneElemPos);};x3dom.runtime={};x3dom.Runtime=function(doc,canvas){this.doc=doc;this.canvas=canvas;this.config={};this.isReady=false;this.fps=0;this.states={measurements:[],infos:[]};};x3dom.Runtime.prototype.addMeasurement=function(title,value){this.states.measurements[title]=value;};x3dom.Runtime.prototype.removeMeasurement=function(title){if(this.states.measurements[title]){delete this.states.measurements[title];}};x3dom.Runtime.prototype.addInfo=function(title,value){this.states.infos[title]=value;};x3dom.Runtime.prototype.removeInfo=function(title){delete this.states.infos[title];};x3dom.Runtime.prototype.initialize=function(doc,canvas){this.doc=doc;this.canvas=canvas;this.config={};this.isReady=false;this.fps=0;};x3dom.Runtime.prototype.noBackendFound=function(){x3dom.debug.logInfo('No backend found. Unable to render.');};x3dom.Runtime.prototype.ready=function(){x3dom.debug.logInfo('System ready.');};x3dom.Runtime.prototype.enterFrame=function(){};x3dom.Runtime.prototype.exitFrame=function(){};x3dom.Runtime.prototype.triggerRedraw=function(){this.canvas.doc.needRender=true;};x3dom.Runtime.prototype.getActiveBindable=function(typeName){var stacks;var i,current,result;var type;stacks=this.canvas.doc._bindableBag._stacks;result=[];type=x3dom.nodeTypesLC[typeName.toLowerCase()];if(!type){x3dom.debug.logError('No node of type "'+typeName+'" found.');return null;} for(i=0;i0){this.canvas.doc._viewarea.animateTo(this.canvas.doc._viewarea.getLightMatrix()[0],this.canvas.doc._scene.getViewpoint());return true;}else{x3dom.debug.logInfo("No lights to navigate to.");return false;}};x3dom.Runtime.prototype.uprightView=function(){this.canvas.doc._viewarea.uprightView();};x3dom.Runtime.prototype.fitAll=function(updateCenterOfRotation) {if(updateCenterOfRotation===undefined){updateCenterOfRotation=true;} var scene=this.canvas.doc._scene;scene.updateVolume();this.canvas.doc._viewarea.fit(scene._lastMin,scene._lastMax,updateCenterOfRotation);};x3dom.Runtime.prototype.fitObject=function(obj,updateCenterOfRotation) {if(obj&&obj._x3domNode) {if(updateCenterOfRotation===undefined){updateCenterOfRotation=true;} var min=x3dom.fields.SFVec3f.MAX();var max=x3dom.fields.SFVec3f.MIN();var vol=obj._x3domNode.getVolume();vol.getBounds(min,max);var mat=obj._x3domNode.getCurrentTransform();min=mat.multMatrixPnt(min);max=mat.multMatrixPnt(max);if(x3dom.isa(obj._x3domNode,x3dom.nodeTypes.X3DTransformNode)) {var invMat=obj._x3domNode._trafo.inverse();min=invMat.multMatrixPnt(min);max=invMat.multMatrixPnt(max);} this.canvas.doc._viewarea.fit(min,max,updateCenterOfRotation);}};x3dom.Runtime.prototype.showAll=function(axis){this.canvas.doc._viewarea.showAll(axis);};x3dom.Runtime.prototype.showObject=function(obj) {if(obj&&obj._x3domNode) {var min=x3dom.fields.SFVec3f.MAX();var max=x3dom.fields.SFVec3f.MIN();var vol=obj._x3domNode.getVolume();vol.getBounds(min,max);var mat=obj._x3domNode.getCurrentTransform();min=mat.multMatrixPnt(min);max=mat.multMatrixPnt(max);var viewarea=this.canvas.doc._viewarea;var focalLen=(viewarea._widthx3dom.fields.Eps){focalLen/=ta;} var w=viewarea._width-1;var h=viewarea._height-1;var frame=0.25;var minScreenPos=new x3dom.fields.SFVec2f(frame*w,frame*h);frame=0.75;var maxScreenPos=new x3dom.fields.SFVec2f(frame*w,frame*h);var dia2=max.subtract(min).multiply(0.5);var rw=dia2.length();var pc=min.add(dia2);var vc=maxScreenPos.subtract(minScreenPos).multiply(0.5);var rs=1.5*vc.length();vc=vc.add(minScreenPos);var dist=1.0;if(rs>x3dom.fields.Eps){dist=(rw/rs)*Math.sqrt(vc.x*vc.x+vc.y*vc.y+focalLen*focalLen);} n0=mat.multMatrixVec(n0).normalize();n0=n0.multiply(dist);var p0=pc.add(n0);var qDir=x3dom.fields.Quaternion.rotateFromTo(new x3dom.fields.SFVec3f(0,0,1),n0);var R=qDir.toMatrix();var T=x3dom.fields.SFMatrix4f.translation(p0.negate());var M=x3dom.fields.SFMatrix4f.translation(p0);M=M.mult(R).mult(T).mult(M);var viewmat=M.inverse();viewarea.animateTo(viewmat,viewpoint);}};x3dom.Runtime.prototype.getCenter=function(domNode){if(domNode&&domNode._x3domNode&&(this.isA(domNode,"X3DShapeNode")||this.isA(domNode,"X3DGeometryNode"))) {return domNode._x3domNode.getCenter();} return null;};x3dom.Runtime.prototype.getCurrentTransform=function(domNode){if(domNode&&domNode._x3domNode) {return domNode._x3domNode.getCurrentTransform();} return null;};x3dom.Runtime.prototype.getBBox=function(domNode){if(domNode&&domNode._x3domNode&&this.isA(domNode,"X3DBoundedObject")) {var vol=domNode._x3domNode.getVolume();return{min:x3dom.fields.SFVec3f.copy(vol.min),max:x3dom.fields.SFVec3f.copy(vol.max)}} return null;};x3dom.Runtime.prototype.getSceneBBox=function(){var scene=this.canvas.doc._scene;scene.updateVolume();return{min:x3dom.fields.SFVec3f.copy(scene._lastMin),max:x3dom.fields.SFVec3f.copy(scene._lastMax)}};x3dom.Runtime.prototype.debug=function(show){var doc=this.canvas.doc;if(doc._viewarea._visDbgBuf===undefined) doc._viewarea._visDbgBuf=(doc._x3dElem.getAttribute("showLog")==='true');if(arguments.length>0){if(show===true){doc._viewarea._visDbgBuf=true;x3dom.debug.logContainer.style.display="block";} else{doc._viewarea._visDbgBuf=false;x3dom.debug.logContainer.style.display="none";}} else{doc._viewarea._visDbgBuf=!doc._viewarea._visDbgBuf;x3dom.debug.logContainer.style.display=(doc._viewarea._visDbgBuf==true)?"block":"none";} doc.needRender=true;return doc._viewarea._visDbgBuf;};x3dom.Runtime.prototype.navigationType=function(){return this.canvas.doc._scene.getNavigationInfo().getType();};x3dom.Runtime.prototype.noNav=function(){this.canvas.doc._scene.getNavigationInfo().setType("none");};x3dom.Runtime.prototype.examine=function(){this.canvas.doc._scene.getNavigationInfo().setType("examine");};x3dom.Runtime.prototype.turnTable=function(){this.canvas.doc._scene.getNavigationInfo().setType("turntable");};x3dom.Runtime.prototype.fly=function(){this.canvas.doc._scene.getNavigationInfo().setType("fly");};x3dom.Runtime.prototype.freeFly=function(){this.canvas.doc._scene.getNavigationInfo().setType("freefly");};x3dom.Runtime.prototype.lookAt=function(){this.canvas.doc._scene.getNavigationInfo().setType("lookat");};x3dom.Runtime.prototype.lookAround=function(){this.canvas.doc._scene.getNavigationInfo().setType("lookaround");};x3dom.Runtime.prototype.walk=function(){this.canvas.doc._scene.getNavigationInfo().setType("walk");};x3dom.Runtime.prototype.game=function(){this.canvas.doc._scene.getNavigationInfo().setType("game");};x3dom.Runtime.prototype.helicopter=function(){this.canvas.doc._scene.getNavigationInfo().setType("helicopter");};x3dom.Runtime.prototype.resetExamin=function(){var viewarea=this.canvas.doc._viewarea;viewarea._rotMat=x3dom.fields.SFMatrix4f.identity();viewarea._transMat=x3dom.fields.SFMatrix4f.identity();viewarea._movement=new x3dom.fields.SFVec3f(0,0,0);viewarea._needNavigationMatrixUpdate=true;this.canvas.doc.needRender=true;};x3dom.Runtime.prototype.disableKeys=function(){this.canvas.disableKeys=true;};x3dom.Runtime.prototype.enableKeys=function(){this.canvas.disableKeys=false;};x3dom.Runtime.prototype.disableLeftDrag=function(){this.canvas.disableLeftDrag=true;};x3dom.Runtime.prototype.enableLeftDrag=function(){this.canvas.disableLeftDrag=false;};x3dom.Runtime.prototype.disableRightDrag=function(){this.canvas.disableRightDrag=true;};x3dom.Runtime.prototype.enableRightDrag=function(){this.canvas.disableRightDrag=false;};x3dom.Runtime.prototype.disableMiddleDrag=function(){this.canvas.disableMiddleDrag=true;};x3dom.Runtime.prototype.enableMiddleDrag=function(){this.canvas.disableMiddleDrag=false;};x3dom.Runtime.prototype.togglePoints=function(lines){var doc=this.canvas.doc;var mod=(lines===true)?3:2;doc._viewarea._points=++doc._viewarea._points%mod;doc.needRender=true;return doc._viewarea._points;};x3dom.Runtime.prototype.pickRect=function(x1,y1,x2,y2){return this.canvas.doc.onPickRect(this.canvas.gl,x1,y1,x2,y2);};x3dom.Runtime.prototype.pickMode=function(options){if(options&&options.internal===true){return this.canvas.doc._scene._vf.pickMode;} return this.canvas.doc._scene._vf.pickMode.toLowerCase();};x3dom.Runtime.prototype.changePickMode=function(type){type=type.toLowerCase();switch(type){case'idbuf':type='idBuf';break;case'idbuf24':type='idBuf24';break;case'idbufid':type='idBufId';break;case'texcoord':type='texCoord';break;case'color':type='color';break;case'box':type='box';break;default:x3dom.debug.logWarning("Switch pickMode to "+type+' unknown intersect type');type=undefined;} if(type!==undefined){this.canvas.doc._scene._vf.pickMode=type;x3dom.debug.logInfo("Switched pickMode to '"+type+"'.");return true;} return false;};x3dom.Runtime.prototype.speed=function(newSpeed){var navi=this.canvas.doc._scene.getNavigationInfo();if(newSpeed){navi._vf.speed=newSpeed;x3dom.debug.logInfo("Changed navigation speed to "+navi._vf.speed);} return navi._vf.speed;};x3dom.Runtime.prototype.statistics=function(mode){var states=this.canvas.stateViewer;if(states){this.canvas.doc.needRender=true;if(mode===true){states.display(mode);return true;} else if(mode===false){states.display(mode);return false;} else{states.display(!states.active);return states.active;}} return false;};x3dom.Runtime.prototype.processIndicator=function(mode){var processDiv=this.canvas.progressDiv;if(processDiv){if(mode===true){processDiv.style.display='inline';return true;} else if(mode===false){processDiv.style.display='none';return false;} return processDiv.style.display!='none'} return false;};x3dom.Runtime.prototype.properties=function(){return this.canvas.doc.properties;};x3dom.Runtime.prototype.backendName=function(){return this.canvas.backend;};x3dom.Runtime.prototype.getFPS=function(){return this.fps;};x3dom.Runtime.prototype.isA=function(domNode,nodeType){var inherits=false;if(nodeType&&domNode&&domNode._x3domNode){if(nodeType===""){nodeType="X3DNode";} inherits=x3dom.isa(domNode._x3domNode,x3dom.nodeTypesLC[nodeType.toLowerCase()]);} return inherits;};x3dom.detectActiveX=function(){var isInstalled=false;if(window.ActiveXObject){var control=null;try{control=new ActiveXObject('AVALONATX.InstantPluginATXCtrl.1');}catch(e){} if(control){isInstalled=true;}} return isInstalled;};x3dom.rerouteSetAttribute=function(node,browser){node._setAttribute=node.setAttribute;node.setAttribute=function(name,value){var id=node.getAttribute("_x3domNode");var anode=browser.findNode(id);if(anode) return anode.parseField(name,value);else return 0;};for(var i=0;i" +x3dom.versionInfo.revision+", "+"Date "+x3dom.versionInfo.date);} x3dom.debug.logInfo("Found "+(x3ds.length-w3sg.length)+" X3D and "+ w3sg.length+" (experimental) WebSG nodes...");var x3d_element;var x3dcanvas;var altDiv,altP,aLnk,altImg;var t0,t1;for(i=0;i2.3) {font_size=2.3;}} var textX,textY;var paragraph=this.node._vf.string;var maxExtent=this.node._vf.maxExtent;var lengths=[];var text_canvas=document.createElement('canvas');text_canvas.dir=leftToRight;var x3dToPx=42;var textHeight=font_size*x3dToPx;var textAlignment=font_justify;document.body.appendChild(text_canvas);var text_ctx=text_canvas.getContext('2d');text_ctx.font=font_style+" "+textHeight+"px "+font_family;var maxWidth=0,pWidth,pLength;var i,j;for(i=0;imaxWidth){maxWidth=pWidth;} pLength=this.node._vf.length[i]|0;if(maxExtent>0&&(pLength>maxExtent||pLength==0)){pLength=maxExtent;} lengths[i]=pLength<=0?pWidth:pLength*x3dToPx;} var canvas_extra=0.1*textHeight;var txtW=maxWidth;var txtH=textHeight*font_spacing*paragraph.length+canvas_extra;textX=0;textY=0;var x_offset=0,y_offset=0,baseLine='top';switch(font_justify){case"center":x_offset=-txtW/2;textX=txtW/2;break;case"left":x_offset=leftToRight=='ltr'?0:-txtW;textX=0;break;case"right":x_offset=leftToRight=='ltr'?-txtW:0;textX=txtW;break;} switch(minor_alignment){case"MIDDLE":y_offset=txtH/2;break;case"BEGIN":y_offset=topToBottom?0:txtH-canvas_extra;baseLine=topToBottom?'top':'bottom';textY=topToBottom?0:textHeight;break;case"FIRST":y_offset=topToBottom?textHeight:txtH-canvas_extra;baseLine=topToBottom?'alphabetic':'bottom';textY=topToBottom?textHeight:textHeight;break;case"END":y_offset=topToBottom?txtH-canvas_extra:0;baseLine=topToBottom?'bottom':'top';textY=topToBottom?textHeight:0;break;} var pxToX3d=1/42.0;var w=txtW*pxToX3d;var h=txtH*pxToX3d;x_offset*=pxToX3d;y_offset*=pxToX3d;text_canvas.width=txtW*oversample;text_canvas.height=txtH*oversample;text_canvas.dir=leftToRight;text_ctx.scale(oversample,oversample);text_ctx.fillStyle='rgba(0,0,0,0)';text_ctx.fillRect(0,0,text_ctx.canvas.width,text_ctx.canvas.height);text_ctx.fillStyle='white';text_ctx.textBaseline=baseLine;text_ctx.font=font_style+" "+textHeight+"px "+font_family;text_ctx.textAlign=textAlignment;for(i=0;i1){x3dom.debug.logError("X3D element has more than one Scene child (has "+ x3dElem.childNodes.length+").");} else{return sceneElems[0];} return null;};x3dom.X3DDocument.prototype._setup=function(sceneDoc,uriDocs,sceneElemPos){var doc=this;function cleanNodeBag(bag,node){for(var i=0,n=bag.length;i0){this._viewarea.animateTo(this._viewarea.getLightMatrix()[0],this._scene.getViewpoint());} break;case 117:this._viewarea.uprightView();break;case 118:var that=this;(function(){var viewpoint=that._viewarea._scene.getViewpoint();var mat_view=that._viewarea.getViewMatrix().inverse();var rotation=new x3dom.fields.Quaternion(0,0,1,0);rotation.setValue(mat_view);var rot=rotation.toAxisAngle();var translation=mat_view.e3();x3dom.debug.logInfo('\n<Viewpoint position="'+translation.x.toFixed(5)+' ' +translation.y.toFixed(5)+' '+translation.z.toFixed(5)+'" '+'orientation="'+rot[0].x.toFixed(5)+' '+rot[0].y.toFixed(5)+' ' +rot[0].z.toFixed(5)+' '+rot[1].toFixed(5)+'" \n\t'+'zNear="'+viewpoint.getNear().toFixed(5)+'" '+'zFar="'+viewpoint.getFar().toFixed(5)+'" '+'description="'+viewpoint._vf.description+'">'+'</Viewpoint>');})();break;case 119:nav.setType("walk",this._viewarea);break;case 121:nav.setType("freefly",this._viewarea);break;default:}};x3dom.X3DDocument.prototype.shutdown=function(ctx) {if(!ctx){return;} ctx.shutdown(this._viewarea);};x3dom.MatrixMixer=function(beginTime,endTime){if(arguments.length===0){this._beginTime=0;this._endTime=1;} else{this._beginTime=beginTime;this._endTime=endTime;} this._beginMat=x3dom.fields.SFMatrix4f.identity();this._beginInvMat=x3dom.fields.SFMatrix4f.identity();this._beginLogMat=x3dom.fields.SFMatrix4f.identity();this._endMat=x3dom.fields.SFMatrix4f.identity();this._endLogMat=x3dom.fields.SFMatrix4f.identity();this._beginRot=new x3dom.fields.Quaternion();this._endRot=new x3dom.fields.Quaternion();this._beginPos=new x3dom.fields.SFVec3f();this._endPos=new x3dom.fields.SFVec3f();this._result=x3dom.fields.SFMatrix4f.identity();this._useQuaternion=false;};x3dom.MatrixMixer.prototype.calcFraction=function(time){var fraction=(time-this._beginTime)/(this._endTime-this._beginTime);return(Math.sin((fraction*Math.PI)-(Math.PI/2))+1)/2.0;};x3dom.MatrixMixer.prototype._isValid=function(){var angles=this._beginMat.inverse().mult(this._endMat).getEulerAngles();return(Math.abs(angles[0])!=Math.PI&&Math.abs(angles[1])!=Math.PI&&Math.abs(angles[2])!=Math.PI);};x3dom.MatrixMixer.prototype._prepareQuaternionAnimation=function(){this._beginRot.setValue(this._beginMat);this._endRot.setValue(this._endMat);this._beginPos=this._beginMat.e3();this._endPos=this._endMat.e3();this._useQuaternion=true;};x3dom.MatrixMixer.prototype.setBeginMatrix=function(mat){this._beginMat.setValues(mat);this._beginInvMat=mat.inverse();this._beginLogMat=x3dom.fields.SFMatrix4f.zeroMatrix();};x3dom.MatrixMixer.prototype.reset=function(){this._beginTime=0;this._endTime=0;this._useQuaternion=false;};x3dom.MatrixMixer.prototype.setEndMatrix=function(mat){this._endMat.setValues(mat);if(!this._isValid()){this._prepareQuaternionAnimation();} this._endLogMat=this._endMat.mult(this._beginInvMat).log();this._logDiffMat=this._endLogMat.addScaled(this._beginLogMat,-1);};x3dom.MatrixMixer.prototype.mixQuaternion=function(time){var fraction=this.calcFraction(time);var rotation=this._beginRot.slerp(this._endRot,fraction);var translation=this._beginPos.addScaled(this._endPos.subtract(this._beginPos),fraction);this._result.setRotate(rotation);this._result.setTranslate(translation);return this._result.copy();};x3dom.MatrixMixer.prototype.mixMatrix=function(time){var mat=null;if(time<=this._beginTime){mat=x3dom.fields.SFMatrix4f.copy(this._beginLogMat);} else{if(time>=this._endTime){mat=x3dom.fields.SFMatrix4f.copy(this._endLogMat);} else{var fraction=this.calcFraction(time);mat=this._logDiffMat.multiply(fraction).add(this._beginLogMat);}} return mat.exp().mult(this._beginMat);};x3dom.MatrixMixer.prototype.mix=function(time){if(this._useQuaternion){return this.mixQuaternion(time);}else{return this.mixMatrix(time);}};x3dom.InputTypes={NAVIGATION:1,INTERACTION:2};x3dom.Viewarea=function(document,scene){this._doc=document;this._scene=scene;document._nodeBag.viewarea.push(this);this._pickingInfo={pickPos:new x3dom.fields.SFVec3f(0,0,0),pickNorm:new x3dom.fields.SFVec3f(0,0,1),pickObj:null,firstObj:null,lastObj:null,lastClickObj:null,shadowObjectId:-1};this._currentInputType=x3dom.InputTypes.NAVIGATION;this._rotMat=x3dom.fields.SFMatrix4f.identity();this._transMat=x3dom.fields.SFMatrix4f.identity();this._movement=new x3dom.fields.SFVec3f(0,0,0);this._needNavigationMatrixUpdate=true;this._deltaT=0;this._flyMat=null;this._pitch=0;this._yaw=0;this._eyePos=new x3dom.fields.SFVec3f(0,0,0);this._width=400;this._height=300;this._dx=0;this._dy=0;this._lastX=-1;this._lastY=-1;this._pressX=-1;this._pressY=-1;this._lastButton=0;this._points=0;this._numRenderedNodes=0;this._pick=new x3dom.fields.SFVec3f(0,0,0);this._pickNorm=new x3dom.fields.SFVec3f(0,0,1);this._isAnimating=false;this._isMoving=false;this._lastTS=0;this._mixer=new x3dom.MatrixMixer();this.arc=null;};x3dom.Viewarea.prototype.tick=function(timeStamp) {var needMixAnim=false;var env=this._scene.getEnvironment();if(env._vf.enableARC&&this.arc==null) {this.arc=new x3dom.arc.AdaptiveRenderControl(this._scene);} if(this._mixer._beginTime>0) {needMixAnim=true;if(timeStamp>=this._mixer._beginTime) {if(timeStamp<=this._mixer._endTime) {var mat=this._mixer.mix(timeStamp);this._scene.getViewpoint().setView(mat);} else{this._mixer.reset();this._scene.getViewpoint().setView(this._mixer._endMat);}} else{this._mixer.reset();this._scene.getViewpoint().setView(this._mixer._beginMat);}} var needNavAnim=this.navigateTo(timeStamp);var lastIsAnimating=this._isAnimating;this._lastTS=timeStamp;this._isAnimating=(needMixAnim||needNavAnim);if(this.arc!=null) {this.arc.update(this.isMovingOrAnimating()?1:0,this._doc._x3dElem.runtime.getFPS());} return(this._isAnimating||lastIsAnimating);};x3dom.Viewarea.prototype.isMoving=function() {return this._isMoving;};x3dom.Viewarea.prototype.isAnimating=function() {return this._isAnimating;};x3dom.Viewarea.prototype.isMovingOrAnimating=function() {return(this._isMoving||this._isAnimating);};x3dom.Viewarea.prototype.navigateTo=function(timeStamp) {var navi=this._scene.getNavigationInfo();var navType=navi.getType();var savedPickingInfo=null;var needNavAnim=(this._currentInputType==x3dom.InputTypes.NAVIGATION)&&(navType==="game"||(this._lastButton>0&&(navType.indexOf("fly")>=0||navType==="walk"||navType==="helicopter"||navType.substr(0,5)==="looka")));this._deltaT=timeStamp-this._lastTS;var removeZeroMargin=function(val,offset){if(val>0){if(val<=offset){return 0;}else{return val-offset;}}else if(val<=0){if(val>=-offset){return 0;}else{return val+offset;}}};var humanizeDiff=function(scale,diff){return((diff<0)?-1:1)*Math.pow(scale*Math.abs(diff),1.65);};if(needNavAnim) {if(this._pickingInfo.pickObj!==null){savedPickingInfo={pickPos:this._pickingInfo.pickPos,pickNorm:this._pickingInfo.pickNorm,pickObj:this._pickingInfo.pickObj,firstObj:this._pickingInfo.firstObj,lastObj:this._pickingInfo.lastObj,lastClickObj:this._pickingInfo.lastClickObj,shadowObjectId:this._pickingInfo.shadowObjectId};} var avatarRadius=0.25;var avatarHeight=1.6;var avatarKnee=0.75;if(navi._vf.avatarSize.length>2){avatarRadius=navi._vf.avatarSize[0];avatarHeight=navi._vf.avatarSize[1];avatarKnee=navi._vf.avatarSize[2];} var currViewMat=this.getViewMatrix();var dist=0;var screenSize=Math.min(this._width,this._height);var rdeltaX=removeZeroMargin((this._pressX-this._lastX)/screenSize,0.01);var rdeltaY=removeZeroMargin((this._pressY-this._lastY)/screenSize,0.01);var userXdiff=humanizeDiff(1,rdeltaX);var userYdiff=humanizeDiff(1,rdeltaY);var step=(this._lastButton&2)?-1:1;step*=(this._deltaT*navi._vf.speed);var userXstep=this._deltaT*navi._vf.speed*userXdiff;var userYstep=this._deltaT*navi._vf.speed*userYdiff;var phi=Math.PI*this._deltaT*userXdiff;var theta=Math.PI*this._deltaT*userYdiff;if(this._needNavigationMatrixUpdate===true) {this._needNavigationMatrixUpdate=false;this._rotMat=x3dom.fields.SFMatrix4f.identity();this._transMat=x3dom.fields.SFMatrix4f.identity();this._movement=new x3dom.fields.SFVec3f(0,0,0);var angleX=0;var angleY=Math.asin(currViewMat._02);var C=Math.cos(angleY);if(Math.abs(C)>0.0001){angleX=Math.atan2(-currViewMat._12/C,currViewMat._22/C);} this._flyMat=currViewMat.inverse();this._from=this._flyMat.e3();this._at=this._from.subtract(this._flyMat.e2());if(navType==="helicopter") this._at.y=this._from.y;this._up=this._flyMat.e1();this._pitch=angleX*180/Math.PI;this._yaw=angleY*180/Math.PI;this._eyePos=this._from.negate();} var tmpAt=null,tmpUp=null,tmpMat=null;var q,temp,fin;var lv,sv,up;if(navType==="game") {this._pitch+=this._dy;this._yaw+=this._dx;if(this._pitch>=89)this._pitch=89;if(this._pitch<=-89)this._pitch=-89;if(this._yaw>=360)this._yaw-=360;if(this._yaw<0)this._yaw=360+this._yaw;this._dx=0;this._dy=0;var xMat=x3dom.fields.SFMatrix4f.rotationX(this._pitch/180*Math.PI);var yMat=x3dom.fields.SFMatrix4f.rotationY(this._yaw/180*Math.PI);var fPos=x3dom.fields.SFMatrix4f.translation(this._eyePos);this._flyMat=xMat.mult(yMat).mult(fPos);var flyMat=this._flyMat.inverse();var tmpFrom=flyMat.e3();tmpUp=new x3dom.fields.SFVec3f(0,-1,0);tmpAt=tmpFrom.add(tmpUp);tmpUp=flyMat.e0().cross(tmpUp).normalize();tmpMat=x3dom.fields.SFMatrix4f.lookAt(tmpFrom,tmpAt,tmpUp);tmpMat=tmpMat.inverse();this._scene._nameSpace.doc.ctx.pickValue(this,this._width/2,this._height/2,this._lastButton,tmpMat,this.getProjectionMatrix().mult(tmpMat));if(this._pickingInfo.pickObj) {dist=this._pickingInfo.pickPos.subtract(tmpFrom).length();tmpFrom.y+=(avatarHeight-dist);flyMat.setTranslate(tmpFrom);this._eyePos=flyMat.e3().negate();this._flyMat=flyMat.inverse();this._pickingInfo.pickObj=null;} this._scene.getViewpoint().setView(this._flyMat);return needNavAnim;} else if(navType==="helicopter"){var typeParams=navi.getTypeParams();if(this._lastButton&2) {var stepUp=200*userYstep;typeParams[1]+=stepUp;navi.setTypeParams(typeParams);} if(this._lastButton&1){step=300*userYstep;} else{step=0;} theta=typeParams[0];this._from.y=typeParams[1];this._at.y=this._from.y;q=x3dom.fields.Quaternion.axisAngle(this._up,phi);temp=q.toMatrix();fin=x3dom.fields.SFMatrix4f.translation(this._from);fin=fin.mult(temp);temp=x3dom.fields.SFMatrix4f.translation(this._from.negate());fin=fin.mult(temp);this._at=fin.multMatrixPnt(this._at);lv=this._at.subtract(this._from).normalize();sv=lv.cross(this._up).normalize();up=sv.cross(lv).normalize();lv=lv.multiply(step);this._from=this._from.add(lv);this._at=this._at.add(lv);q=x3dom.fields.Quaternion.axisAngle(sv,theta);temp=q.toMatrix();fin=x3dom.fields.SFMatrix4f.translation(this._from);fin=fin.mult(temp);temp=x3dom.fields.SFMatrix4f.translation(this._from.negate());fin=fin.mult(temp);var at=fin.multMatrixPnt(this._at);this._flyMat=x3dom.fields.SFMatrix4f.lookAt(this._from,at,up);this._scene.getViewpoint().setView(this._flyMat.inverse());return needNavAnim;} q=x3dom.fields.Quaternion.axisAngle(this._up,phi);temp=q.toMatrix();fin=x3dom.fields.SFMatrix4f.translation(this._from);fin=fin.mult(temp);temp=x3dom.fields.SFMatrix4f.translation(this._from.negate());fin=fin.mult(temp);this._at=fin.multMatrixPnt(this._at);lv=this._at.subtract(this._from).normalize();sv=lv.cross(this._up).normalize();up=sv.cross(lv).normalize();q=x3dom.fields.Quaternion.axisAngle(sv,theta);temp=q.toMatrix();fin=x3dom.fields.SFMatrix4f.translation(this._from);fin=fin.mult(temp);temp=x3dom.fields.SFMatrix4f.translation(this._from.negate());fin=fin.mult(temp);this._at=fin.multMatrixPnt(this._at);if(navType.substr(0,5)!=="looka") {var currProjMat=this.getProjectionMatrix();if(navType!=="freefly"){if(step<0){tmpMat=new x3dom.fields.SFMatrix4f();tmpMat.setValue(this._last_mat_view.e0(),this._last_mat_view.e1(),this._last_mat_view.e2().negate(),this._last_mat_view.e3());this._scene._nameSpace.doc.ctx.pickValue(this,this._width/2,this._height/2,this._lastButton,tmpMat,currProjMat.mult(tmpMat));} else{this._scene._nameSpace.doc.ctx.pickValue(this,this._width/2,this._height/2,this._lastButton);} if(this._pickingInfo.pickObj) {dist=this._pickingInfo.pickPos.subtract(this._from).length();if(dist<=avatarRadius){step=0;}}} lv=this._at.subtract(this._from).normalize().multiply(step);this._at=this._at.add(lv);this._from=this._from.add(lv);if(navType==="walk") {tmpAt=this._from.addScaled(up,-1.0);tmpUp=sv.cross(up.negate()).normalize();tmpMat=x3dom.fields.SFMatrix4f.lookAt(this._from,tmpAt,tmpUp);tmpMat=tmpMat.inverse();this._scene._nameSpace.doc.ctx.pickValue(this,this._width/2,this._height/2,this._lastButton,tmpMat,currProjMat.mult(tmpMat));if(this._pickingInfo.pickObj) {dist=this._pickingInfo.pickPos.subtract(this._from).length();this._at=this._at.add(up.multiply(avatarHeight-dist));this._from=this._from.add(up.multiply(avatarHeight-dist));}} this._pickingInfo.pickObj=null;} this._flyMat=x3dom.fields.SFMatrix4f.lookAt(this._from,this._at,up);this._scene.getViewpoint().setView(this._flyMat.inverse());if(savedPickingInfo!==null){this._pickingInfo=savedPickingInfo;}} return needNavAnim;};x3dom.Viewarea.prototype.moveFwd=function() {var navi=this._scene.getNavigationInfo();if(navi.getType()==="game") {var avatarRadius=0.25;var avatarHeight=1.6;if(navi._vf.avatarSize.length>2){avatarRadius=navi._vf.avatarSize[0];avatarHeight=navi._vf.avatarSize[1];} var speed=5*this._deltaT*navi._vf.speed;var yRotRad=(this._yaw/180*Math.PI);var xRotRad=(this._pitch/180*Math.PI);var dist=0;var fMat=this._flyMat.inverse();this._scene._nameSpace.doc.ctx.pickValue(this,this._width/2,this._height/2,this._lastButton);if(this._pickingInfo.pickObj) {dist=this._pickingInfo.pickPos.subtract(fMat.e3()).length();if(dist<=2*avatarRadius){} else{this._eyePos.x-=Math.sin(yRotRad)*speed;this._eyePos.z+=Math.cos(yRotRad)*speed;this._eyePos.y+=Math.sin(xRotRad)*speed;}}}};x3dom.Viewarea.prototype.moveBwd=function() {var navi=this._scene.getNavigationInfo();if(navi.getType()==="game") {var speed=5*this._deltaT*navi._vf.speed;var yRotRad=(this._yaw/180*Math.PI);var xRotRad=(this._pitch/180*Math.PI);this._eyePos.x+=Math.sin(yRotRad)*speed;this._eyePos.z-=Math.cos(yRotRad)*speed;this._eyePos.y-=Math.sin(xRotRad)*speed;}};x3dom.Viewarea.prototype.strafeRight=function() {var navi=this._scene.getNavigationInfo();if(navi.getType()==="game") {var speed=5*this._deltaT*navi._vf.speed;var yRotRad=(this._yaw/180*Math.PI);this._eyePos.x-=Math.cos(yRotRad)*speed;this._eyePos.z-=Math.sin(yRotRad)*speed;}};x3dom.Viewarea.prototype.strafeLeft=function() {var navi=this._scene.getNavigationInfo();if(navi.getType()==="game") {var speed=5*this._deltaT*navi._vf.speed;var yRotRad=(this._yaw/180*Math.PI);this._eyePos.x+=Math.cos(yRotRad)*speed;this._eyePos.z+=Math.sin(yRotRad)*speed;}};x3dom.Viewarea.prototype.animateTo=function(target,prev,dur) {var navi=this._scene.getNavigationInfo();if(x3dom.isa(target,x3dom.nodeTypes.X3DViewpointNode)){target=target.getViewMatrix().mult(target.getCurrentTransform().inverse());} if(navi._vf.transitionType[0].toLowerCase()!=="teleport"&&dur!=0&&navi.getType()!=="game") {if(prev&&x3dom.isa(prev,x3dom.nodeTypes.X3DViewpointNode)){prev=prev.getViewMatrix().mult(prev.getCurrentTransform().inverse()).mult(this._transMat).mult(this._rotMat);this._mixer._beginTime=this._lastTS;if(arguments.length>=3){this._mixer._endTime=this._lastTS+dur;} else{this._mixer._endTime=this._lastTS+navi._vf.transitionTime;} this._mixer.setBeginMatrix(prev);this._mixer.setEndMatrix(target);this._scene.getViewpoint().setView(prev);} else{this._scene.getViewpoint().setView(target);}} else {this._scene.getViewpoint().setView(target);} this._rotMat=x3dom.fields.SFMatrix4f.identity();this._transMat=x3dom.fields.SFMatrix4f.identity();this._movement=new x3dom.fields.SFVec3f(0,0,0);this._needNavigationMatrixUpdate=true;};x3dom.Viewarea.prototype.getLights=function(){var enabledLights=[];for(var i=0;i0.0){return true;}} return false;};x3dom.Viewarea.prototype.updateSpecialNavigation=function(viewpoint,mat_viewpoint){var navi=this._scene.getNavigationInfo();var navType=navi.getType();if(navType=="helicopter"&&!navi._heliUpdated) {var typeParams=navi.getTypeParams();var theta=typeParams[0];var currViewMat=viewpoint.getViewMatrix().mult(mat_viewpoint.inverse()).inverse();this._from=currViewMat.e3();this._at=this._from.subtract(currViewMat.e2());this._up=new x3dom.fields.SFVec3f(0,1,0);this._from.y=typeParams[1];this._at.y=this._from.y;var sv=currViewMat.e0();var q=x3dom.fields.Quaternion.axisAngle(sv,theta);var temp=q.toMatrix();var fin=x3dom.fields.SFMatrix4f.translation(this._from);fin=fin.mult(temp);temp=x3dom.fields.SFMatrix4f.translation(this._from.negate());fin=fin.mult(temp);this._at=fin.multMatrixPnt(this._at);this._flyMat=x3dom.fields.SFMatrix4f.lookAt(this._from,this._at,this._up);this._scene.getViewpoint().setView(this._flyMat.inverse());navi._heliUpdated=true;}};x3dom.Viewarea.prototype.getViewpointMatrix=function() {var viewpoint=this._scene.getViewpoint();var mat_viewpoint=viewpoint.getCurrentTransform();this.updateSpecialNavigation(viewpoint,mat_viewpoint);return viewpoint.getViewMatrix().mult(mat_viewpoint.inverse());};x3dom.Viewarea.prototype.getViewMatrix=function() {return this.getViewpointMatrix().mult(this._transMat).mult(this._rotMat);};x3dom.Viewarea.prototype.getLightMatrix=function() {var lights=this._doc._nodeBag.lights;var i,n=lights.length;if(n>0) {var vol=this._scene.getVolume();if(vol.isValid()) {var min=x3dom.fields.SFVec3f.MAX();var max=x3dom.fields.SFVec3f.MIN();vol.getBounds(min,max);var l_arr=[];var viewpoint=this._scene.getViewpoint();var fov=viewpoint.getFieldOfView();var dia=max.subtract(min);var dist1=(dia.y/2.0)/Math.tan(fov/2.0)+(dia.z/2.0);var dist2=(dia.x/2.0)/Math.tan(fov/2.0)+(dia.z/2.0);dia=min.add(dia.multiply(0.5));for(i=0;idist2?dist1:dist2)));} l_arr[i]=lights[i].getViewMatrix(dia);} return l_arr;}} return[this.getViewMatrix()];};x3dom.Viewarea.prototype.getWCtoLCMatrix=function(lMat) {var proj=this.getProjectionMatrix();var view;if(arguments.length===0){view=this.getLightMatrix()[0];} else{view=lMat;} return proj.mult(view);};x3dom.Viewarea.prototype.getWCtoLCMatricesPointLight=function(view,lightNode,mat_proj) {var zNear=lightNode._vf.zNear;var zFar=lightNode._vf.zFar;var proj=this.getLightProjectionMatrix(view,zNear,zFar,false,mat_proj);proj._00=1;proj._11=1;var matrices=[];matrices[0]=proj.mult(view);var rotationMatrix;for(var i=1;i<=3;i++){rotationMatrix=x3dom.fields.SFMatrix4f.rotationY(i*Math.PI/2);matrices[i]=proj.mult(rotationMatrix.mult(view));} rotationMatrix=x3dom.fields.SFMatrix4f.rotationX(Math.PI/2);matrices[4]=proj.mult(rotationMatrix.mult(view));rotationMatrix=x3dom.fields.SFMatrix4f.rotationX(3*Math.PI/2);matrices[5]=proj.mult(rotationMatrix.mult(view));return matrices;};x3dom.Viewarea.prototype.getWCtoLCMatricesCascaded=function(view,lightNode,mat_proj) {var numCascades=Math.max(1,Math.min(lightNode._vf.shadowCascades,6));var splitFactor=Math.max(0,Math.min(lightNode._vf.shadowSplitFactor,1));var splitOffset=Math.max(0,Math.min(lightNode._vf.shadowSplitOffset,1));var isSpotLight=x3dom.isa(lightNode,x3dom.nodeTypes.SpotLight);var zNear=lightNode._vf.zNear;var zFar=lightNode._vf.zFar;var proj=this.getLightProjectionMatrix(view,zNear,zFar,true,mat_proj);if(isSpotLight){proj._00=1;proj._11=1;} var viewProj=proj.mult(view);var matrices=[];if(numCascades==1){matrices[0]=viewProj;return matrices;} var cascadeSplits=this.getShadowSplitDepths(numCascades,splitFactor,splitOffset,true,mat_proj);for(var i=0;i0||zFar>0){var lightPos=lMat.inverse().e3();var nearScale=0.8;var farScale=1.2;var min=x3dom.fields.SFVec3f.copy(this._scene._lastMin);var max=x3dom.fields.SFVec3f.copy(this._scene._lastMax);var dia=max.subtract(min);var sRad=dia.length()/2;var sCenter=min.add(dia.multiply(0.5));var vDist=(lightPos.subtract(sCenter)).length();var near,far;if(sRad){if(vDist>sRad) near=(vDist-sRad)*nearScale;else near=1;far=(vDist+sRad)*farScale;} if(zNear>0)near=zNear;if(zFar>0)far=zFar;proj._22=-(far+near)/(far-near);proj._23=-2.0*far*near/(far-near);return proj;} else{var cropMatrix=this.getLightCropMatrix(proj.mult(lMat));return cropMatrix.mult(proj);}};x3dom.Viewarea.prototype.getProjectionMatrix=function() {var viewpoint=this._scene.getViewpoint();return viewpoint.getProjectionMatrix(this._width/this._height);};x3dom.Viewarea.prototype.getViewfrustum=function(clipMat) {var env=this._scene.getEnvironment();if(env._vf.frustumCulling==true) {if(arguments.length==0){var proj=this.getProjectionMatrix();var view=this.getViewMatrix();return new x3dom.fields.FrustumVolume(proj.mult(view));} else{return new x3dom.fields.FrustumVolume(clipMat);}} return null;};x3dom.Viewarea.prototype.getWCtoCCMatrix=function() {var view=this.getViewMatrix();var proj=this.getProjectionMatrix();return proj.mult(view);};x3dom.Viewarea.prototype.getCCtoWCMatrix=function() {var mat=this.getWCtoCCMatrix();return mat.inverse();};x3dom.Viewarea.prototype.calcViewRay=function(x,y,mat) {var cctowc=mat?mat:this.getCCtoWCMatrix();var rx=x/(this._width-1.0)*2.0-1.0;var ry=(this._height-1.0-y)/(this._height-1.0)*2.0-1.0;var from=cctowc.multFullMatrixPnt(new x3dom.fields.SFVec3f(rx,ry,-1));var at=cctowc.multFullMatrixPnt(new x3dom.fields.SFVec3f(rx,ry,1));var dir=at.subtract(from);return new x3dom.fields.Ray(from,dir);};x3dom.Viewarea.prototype.showAll=function(axis) {if(axis===undefined) axis="negZ";var scene=this._scene;scene.updateVolume();var min=x3dom.fields.SFVec3f.copy(scene._lastMin);var max=x3dom.fields.SFVec3f.copy(scene._lastMax);var x="x",y="y",z="z";var sign=1;var to,from=new x3dom.fields.SFVec3f(0,0,-1);switch(axis){case"posX":sign=-1;case"negX":z="x";x="y";y="z";to=new x3dom.fields.SFVec3f(sign,0,0);break;case"posY":sign=-1;case"negY":z="y";x="z";y="x";to=new x3dom.fields.SFVec3f(0,sign,0);break;case"posZ":sign=-1;case"negZ":default:to=new x3dom.fields.SFVec3f(0,0,-sign);break;} var viewpoint=scene.getViewpoint();var fov=viewpoint.getFieldOfView();var dia=max.subtract(min);var diaz2=dia[z]/2.0,tanfov2=Math.tan(fov/2.0);var dist1=(dia[y]/2.0)/tanfov2+diaz2;var dist2=(dia[x]/2.0)/tanfov2+diaz2;dia=min.add(dia.multiply(0.5));dia[z]+=sign*(dist1>dist2?dist1:dist2)*1.01;var quat=x3dom.fields.Quaternion.rotateFromTo(from,to);var viewmat=quat.toMatrix();viewmat=viewmat.mult(x3dom.fields.SFMatrix4f.translation(dia.negate()));this.animateTo(viewmat,viewpoint);};x3dom.Viewarea.prototype.fit=function(min,max,updateCenterOfRotation) {if(updateCenterOfRotation===undefined){updateCenterOfRotation=true;} var dia2=max.subtract(min).multiply(0.5);var center=min.add(dia2);var bsr=dia2.length();var viewpoint=this._scene.getViewpoint();var fov=viewpoint.getFieldOfView();var viewmat=x3dom.fields.SFMatrix4f.copy(this.getViewMatrix());var rightDir=new x3dom.fields.SFVec3f(viewmat._00,viewmat._01,viewmat._02);var upDir=new x3dom.fields.SFVec3f(viewmat._10,viewmat._11,viewmat._12);var viewDir=new x3dom.fields.SFVec3f(viewmat._20,viewmat._21,viewmat._22);var tanfov2=Math.tan(fov/2.0);var dist=bsr/tanfov2;var eyePos=center.add(viewDir.multiply(dist));viewmat._03=-rightDir.dot(eyePos);viewmat._13=-upDir.dot(eyePos);viewmat._23=-viewDir.dot(eyePos);if(updateCenterOfRotation){viewpoint.setCenterOfRotation(center);} if(x3dom.isa(viewpoint,x3dom.nodeTypes.OrthoViewpoint)) {viewpoint._vf.fieldOfView[0]=-dist;viewpoint._vf.fieldOfView[1]=-dist;viewpoint._vf.fieldOfView[2]=dist;viewpoint._vf.fieldOfView[3]=dist;viewpoint._projMatrix=null;this.animateTo(viewmat,viewpoint,0);} else {this.animateTo(viewmat,viewpoint);}};x3dom.Viewarea.prototype.resetView=function() {var navi=this._scene.getNavigationInfo();if(navi._vf.transitionType[0].toLowerCase()!=="teleport"&&navi.getType()!=="game") {this._mixer._beginTime=this._lastTS;this._mixer._endTime=this._lastTS+navi._vf.transitionTime;this._mixer.setBeginMatrix(this.getViewMatrix());var target=this._scene.getViewpoint();target.resetView();target=target.getViewMatrix().mult(target.getCurrentTransform().inverse());this._mixer.setEndMatrix(target);} else {this._scene.getViewpoint().resetView();} this.resetNavHelpers();navi._heliUpdated=false;};x3dom.Viewarea.prototype.resetNavHelpers=function() {this._rotMat=x3dom.fields.SFMatrix4f.identity();this._transMat=x3dom.fields.SFMatrix4f.identity();this._movement=new x3dom.fields.SFVec3f(0,0,0);this._needNavigationMatrixUpdate=true;};x3dom.Viewarea.prototype.uprightView=function() {var mat=this.getViewMatrix().inverse();var from=mat.e3();var at=from.subtract(mat.e2());var up=new x3dom.fields.SFVec3f(0,1,0);var s=mat.e2().cross(up).normalize();var v=s.cross(up).normalize();at=from.add(v);mat=x3dom.fields.SFMatrix4f.lookAt(from,at,up);mat=mat.inverse();this.animateTo(mat,this._scene.getViewpoint());};x3dom.Viewarea.prototype.callEvtHandler=function(node,eventType,event) {if(!node||!node._xmlNode) return null;try{var attrib=node._xmlNode[eventType];if(typeof(attrib)==="function"){attrib.call(node._xmlNode,event);} else{var funcStr=node._xmlNode.getAttribute(eventType);var func=new Function('event',funcStr);func.call(node._xmlNode,event);} var list=node._listeners[event.type];if(list){for(var it=0;it0&&func!==undefined) {for(i=0;i=0)&&navType==="lookat"&&this._pressX===x&&this._pressY===y) {var step=(this._lastButton&2)?-1:1;var dist=this._pickingInfo.pickPos.subtract(this._from).length()/tDist;var laMat=new x3dom.fields.SFMatrix4f();laMat.setValues(this.getViewMatrix());laMat=laMat.inverse();var from=laMat.e3();var at=from.subtract(laMat.e2());var up=laMat.e1();dir=this._pickingInfo.pickPos.subtract(from);var len=dir.length();dir=dir.normalize();var newAt=from.addScaled(dir,len);var s=dir.cross(up).normalize();dir=s.cross(up).normalize();if(step<0){dist=(0.5+len+dist)*2;} var newFrom=newAt.addScaled(dir,dist);laMat=x3dom.fields.SFMatrix4f.lookAt(newFrom,newAt,up);laMat=laMat.inverse();dist=newFrom.subtract(from).length();var dur=Math.max(0.5,Math.log((1+dist)/navi._vf.speed));this.animateTo(laMat,this._scene.getViewpoint(),dur);} this._dx=0;this._dy=0;this._lastX=x;this._lastY=y;this._lastButton=buttonState;this._isMoving=false;};x3dom.Viewarea.prototype.onMouseOver=function(x,y,buttonState) {this._dx=0;this._dy=0;this._lastButton=0;this._isMoving=false;this._lastX=x;this._lastY=y;this._deltaT=0;};x3dom.Viewarea.prototype.onMouseOut=function(x,y,buttonState) {this._dx=0;this._dy=0;this._lastButton=0;this._isMoving=false;this._lastX=x;this._lastY=y;this._deltaT=0;var i;var affectedPointingSensorsList=this._doc._nodeBag.affectedPointingSensors;for(i=0;i=6){var min=-navi._vf.typeParams[5];var max=navi._vf.typeParams[4];this._movement.z=Math.min(Math.max(this._movement.z,min),max);} this._movement=this._movement.add(vec);mat=this.getViewpointMatrix().mult(this._transMat);this._transMat=mat.inverse().mult(x3dom.fields.SFMatrix4f.translation(this._movement)).mult(mat);}} this._isMoving=true;} else if(navType==="turntable") {if(!this._flyMat) this.initTurnTable(navi,false);if(buttonState&1) {alpha=(dy*2*Math.PI)/this._height;beta=(dx*2*Math.PI)/this._width;this._flyMat=this.calcOrbit(alpha,beta,navi);viewpoint.setView(this._flyMat.inverse());} else if(buttonState&2) {d=(this._scene._lastMax.subtract(this._scene._lastMin)).length();d=((d=5&&navi._vf.typeParams[4]>0) {var newDist=Math.min(zoomAmount,lastDirL-navi._vf.typeParams[4]);this._from=this._from.addScaled(lastDir,newDist);} else {var diff=zoomAmount-lastDirL+0.01;if(diff>=0){cor=cor.addScaled(lastDir,diff);viewpoint.setCenterOfRotation(cor);} this._from=this._from.addScaled(lastDir,zoomAmount);} this._from=this._from.addScaled(lastDir,zoomAmount);this._flyMat=x3dom.fields.SFMatrix4f.lookAt(this._from,cor,this._up);viewpoint.setView(this._flyMat.inverse());} else if(buttonState&4) {d=(this._scene._lastMax.subtract(this._scene._lastMin)).length();d=((d0) {this._currentInputType=x3dom.InputTypes.INTERACTION;} else {this._currentInputType=x3dom.InputTypes.NAVIGATION;}};x3dom.Viewarea.prototype.getRenderMode=function() {return this._points;};x3dom.Viewarea.prototype.getShadowedLights=function() {var shadowedLights=[];var shadowIndex=0;var slights=this.getLights();for(var i=0;i0.0){shadowedLights[shadowIndex]=slights[i];shadowIndex++;}} return shadowedLights;};x3dom.Viewarea.prototype.getShadowSplitDepths=function(numCascades,splitFactor,splitOffset,postProject,mat_proj) {var logSplit;var practSplit=[];var viewPoint=this._scene.getViewpoint();var zNear=viewPoint.getNear();var zFar=viewPoint.getFar();practSplit[0]=zNear;zNear=zNear+splitOffset*(zFar-zNear)/10;for(var i=1;i1.0||xMax<-1.0){xMin=-1.0;xMax=1.0;}else{xMin=Math.max(xMin,-1.0);xMax=Math.min(xMax,1.0);} if(yMin>1.0||yMax<-1.0){yMin=-1.0;yMax=1.0;}else{yMin=Math.max(yMin,-1.0);yMax=Math.min(yMax,1.0);} if(zMin>1.0||zMax<-1.0){zMin=-1.0;zMax=1.0;}else{zMin=Math.max(zMin,-1.0);zMax=Math.min(zMax,1.0);} var minValues=new x3dom.fields.SFVec3f(xMin,yMin,zMin);var maxValues=new x3dom.fields.SFVec3f(xMax,yMax,zMax);return new x3dom.fields.BoxVolume(minValues,maxValues);} var frustumBB=clip(minFrustum,maxFrustum);var scaleX=2.0/(frustumBB.max.x-frustumBB.min.x);var scaleY=2.0/(frustumBB.max.y-frustumBB.min.y);var offsetX=-(scaleX*(frustumBB.max.x+frustumBB.min.x))/2.0;var offsetY=-(scaleY*(frustumBB.max.y+frustumBB.min.y))/2.0;var fittingMatrix=x3dom.fields.SFMatrix4f.identity();fittingMatrix._00=scaleX;fittingMatrix._11=scaleY;fittingMatrix._03=offsetX;fittingMatrix._13=offsetY;return fittingMatrix;};x3dom.Mesh=function(parent) {this._parent=parent;this._vol=new x3dom.fields.BoxVolume();this._invalidate=true;this._numFaces=0;this._numCoords=0;this._primType='TRIANGLES';this._positions=[];this._normals=[];this._texCoords=[];this._colors=[];this._indices=[];this._positions[0]=[];this._normals[0]=[];this._texCoords[0]=[];this._colors[0]=[];this._indices[0]=[];};x3dom.Mesh.prototype._dynamicFields={};x3dom.Mesh.prototype._numPosComponents=3;x3dom.Mesh.prototype._numTexComponents=2;x3dom.Mesh.prototype._numColComponents=3;x3dom.Mesh.prototype._numNormComponents=3;x3dom.Mesh.prototype._lit=true;x3dom.Mesh.prototype._vol=null;x3dom.Mesh.prototype._invalidate=true;x3dom.Mesh.prototype._numFaces=0;x3dom.Mesh.prototype._numCoords=0;x3dom.Mesh.prototype.setMeshData=function(positions,normals,texCoords,colors,indices) {this._positions[0]=positions;this._normals[0]=normals;this._texCoords[0]=texCoords;this._colors[0]=colors;this._indices[0]=indices;this._invalidate=true;this._numFaces=this._indices[0].length/3;this._numCoords=this._positions[0].length/3;};x3dom.Mesh.prototype.getVolume=function() {if(this._invalidate==true&&!this._vol.isValid()) {var coords=this._positions[0];var n=coords.length;if(n>3) {var initVal=new x3dom.fields.SFVec3f(coords[0],coords[1],coords[2]);this._vol.setBounds(initVal,initVal);for(var i=3;icoords[i]){this._vol.min.x=coords[i];} if(this._vol.min.y>coords[i+1]){this._vol.min.y=coords[i+1];} if(this._vol.min.z>coords[i+2]){this._vol.min.z=coords[i+2];} if(this._vol.max.xm)?this._posSize/3:m/3;num=3*((num-Math.floor(num)>0)?Math.floor(num+1):num);for(i=0;ix3dom.fields.Eps) {for(i=0;i=0);if(k){this._indices[i]=indices.slice(i*MAX,(i+1)*MAX);}else{this._indices[i]=indices.slice(i*MAX);} if(!isMultiInd){if(i){var m=i*MAX;for(var j=0,l=this._indices[i].length;j++i*MAX*3);};x3dom.Mesh.prototype.calcTexCoords=function(mode) {this._texCoords[0]=[];if(mode.toLowerCase()==="sphere-local") {for(var i=0,j=0,n=this._normals[0].length;i=dia.y) {if(dia.x>=dia.z) {S=0;T=dia.y>=dia.z?1:2;} else {S=2;T=0;}} else {if(dia.y>=dia.z) {S=1;T=dia.x>=dia.z?0:2;} else {S=2;T=1;}} var sDenom=1,tDenom=1;var sMin=0,tMin=0;switch(S){case 0:sDenom=dia.x;sMin=min.x;break;case 1:sDenom=dia.y;sMin=min.y;break;case 2:sDenom=dia.z;sMin=min.z;break;} switch(T){case 0:tDenom=dia.x;tMin=min.x;break;case 1:tDenom=dia.y;tMin=min.y;break;case 2:tDenom=dia.z;tMin=min.z;break;} for(var k=0,l=0,m=this._positions[0].length;k=16) {if(!needTranspose){return new x3dom.fields.SFMatrix4f(arr[0],arr[1],arr[2],arr[3],arr[4],arr[5],arr[6],arr[7],arr[8],arr[9],arr[10],arr[11],arr[12],arr[13],arr[14],arr[15]);} else{return new x3dom.fields.SFMatrix4f(arr[0],arr[4],arr[8],arr[12],arr[1],arr[5],arr[9],arr[13],arr[2],arr[6],arr[10],arr[14],arr[3],arr[7],arr[11],arr[15]);}} else if(arr.length===6){return new x3dom.fields.SFMatrix4f(arr[0],arr[1],0,arr[4],arr[2],arr[3],0,arr[5],0,0,1,0,0,0,0,1);} else{x3dom.debug.logWarning("SFMatrix4f - can't parse string: "+str);return x3dom.fields.SFMatrix4f.identity();}};x3dom.fields.SFMatrix4f.prototype.mult=function(that){return new x3dom.fields.SFMatrix4f(this._00*that._00+this._01*that._10+this._02*that._20+this._03*that._30,this._00*that._01+this._01*that._11+this._02*that._21+this._03*that._31,this._00*that._02+this._01*that._12+this._02*that._22+this._03*that._32,this._00*that._03+this._01*that._13+this._02*that._23+this._03*that._33,this._10*that._00+this._11*that._10+this._12*that._20+this._13*that._30,this._10*that._01+this._11*that._11+this._12*that._21+this._13*that._31,this._10*that._02+this._11*that._12+this._12*that._22+this._13*that._32,this._10*that._03+this._11*that._13+this._12*that._23+this._13*that._33,this._20*that._00+this._21*that._10+this._22*that._20+this._23*that._30,this._20*that._01+this._21*that._11+this._22*that._21+this._23*that._31,this._20*that._02+this._21*that._12+this._22*that._22+this._23*that._32,this._20*that._03+this._21*that._13+this._22*that._23+this._23*that._33,this._30*that._00+this._31*that._10+this._32*that._20+this._33*that._30,this._30*that._01+this._31*that._11+this._32*that._21+this._33*that._31,this._30*that._02+this._31*that._12+this._32*that._22+this._33*that._32,this._30*that._03+this._31*that._13+this._32*that._23+this._33*that._33);};x3dom.fields.SFMatrix4f.prototype.multMatrixPnt=function(vec){return new x3dom.fields.SFVec3f(this._00*vec.x+this._01*vec.y+this._02*vec.z+this._03,this._10*vec.x+this._11*vec.y+this._12*vec.z+this._13,this._20*vec.x+this._21*vec.y+this._22*vec.z+this._23);};x3dom.fields.SFMatrix4f.prototype.multMatrixVec=function(vec){return new x3dom.fields.SFVec3f(this._00*vec.x+this._01*vec.y+this._02*vec.z,this._10*vec.x+this._11*vec.y+this._12*vec.z,this._20*vec.x+this._21*vec.y+this._22*vec.z);};x3dom.fields.SFMatrix4f.prototype.multFullMatrixPnt=function(vec){var w=this._30*vec.x+this._31*vec.y+this._32*vec.z+this._33;if(w){w=1.0/w;} return new x3dom.fields.SFVec3f((this._00*vec.x+this._01*vec.y+this._02*vec.z+this._03)*w,(this._10*vec.x+this._11*vec.y+this._12*vec.z+this._13)*w,(this._20*vec.x+this._21*vec.y+this._22*vec.z+this._23)*w);};x3dom.fields.SFMatrix4f.prototype.multMatrixPlane=function(plane){var normal=new x3dom.fields.SFVec3f(plane.x,plane.y,plane.z);var memberPnt=normal.multiply(-plane.w);memberPnt=this.multMatrixPnt(memberPnt);var invTranspose=this.inverse().transpose();normal=invTranspose.multMatrixVec(normal);var d=-normal.dot(memberPnt);return new x3dom.fields.SFVec4f(normal.x,normal.y,normal.z,d);};x3dom.fields.SFMatrix4f.prototype.transpose=function(){return new x3dom.fields.SFMatrix4f(this._00,this._10,this._20,this._30,this._01,this._11,this._21,this._31,this._02,this._12,this._22,this._32,this._03,this._13,this._23,this._33);};x3dom.fields.SFMatrix4f.prototype.negate=function(){return new x3dom.fields.SFMatrix4f(-this._00,-this._01,-this._02,-this._03,-this._10,-this._11,-this._12,-this._13,-this._20,-this._21,-this._22,-this._23,-this._30,-this._31,-this._32,-this._33);};x3dom.fields.SFMatrix4f.prototype.multiply=function(s){return new x3dom.fields.SFMatrix4f(s*this._00,s*this._01,s*this._02,s*this._03,s*this._10,s*this._11,s*this._12,s*this._13,s*this._20,s*this._21,s*this._22,s*this._23,s*this._30,s*this._31,s*this._32,s*this._33);};x3dom.fields.SFMatrix4f.prototype.add=function(that){return new x3dom.fields.SFMatrix4f(this._00+that._00,this._01+that._01,this._02+that._02,this._03+that._03,this._10+that._10,this._11+that._11,this._12+that._12,this._13+that._13,this._20+that._20,this._21+that._21,this._22+that._22,this._23+that._23,this._30+that._30,this._31+that._31,this._32+that._32,this._33+that._33);};x3dom.fields.SFMatrix4f.prototype.addScaled=function(that,s){return new x3dom.fields.SFMatrix4f(this._00+s*that._00,this._01+s*that._01,this._02+s*that._02,this._03+s*that._03,this._10+s*that._10,this._11+s*that._11,this._12+s*that._12,this._13+s*that._13,this._20+s*that._20,this._21+s*that._21,this._22+s*that._22,this._23+s*that._23,this._30+s*that._30,this._31+s*that._31,this._32+s*that._32,this._33+s*that._33);};x3dom.fields.SFMatrix4f.prototype.setValues=function(that){this._00=that._00;this._01=that._01;this._02=that._02;this._03=that._03;this._10=that._10;this._11=that._11;this._12=that._12;this._13=that._13;this._20=that._20;this._21=that._21;this._22=that._22;this._23=that._23;this._30=that._30;this._31=that._31;this._32=that._32;this._33=that._33;};x3dom.fields.SFMatrix4f.prototype.setValue=function(v1,v2,v3,v4){this._00=v1.x;this._01=v2.x;this._02=v3.x;this._10=v1.y;this._11=v2.y;this._12=v3.y;this._20=v1.z;this._21=v2.z;this._22=v3.z;this._30=0;this._31=0;this._32=0;if(arguments.length>3){this._03=v4.x;this._13=v4.y;this._23=v4.z;this._33=1;}};x3dom.fields.SFMatrix4f.prototype.setFromArray=function(a){this._00=a[0];this._01=a[4];this._02=a[8];this._03=a[12];this._10=a[1];this._11=a[5];this._12=a[9];this._13=a[13];this._20=a[2];this._21=a[6];this._22=a[10];this._23=a[14];this._30=a[3];this._31=a[7];this._32=a[11];this._33=a[15];};x3dom.fields.SFMatrix4f.prototype.toGL=function(){return[this._00,this._10,this._20,this._30,this._01,this._11,this._21,this._31,this._02,this._12,this._22,this._32,this._03,this._13,this._23,this._33];};x3dom.fields.SFMatrix4f.prototype.at=function(i,j){var field="_"+i+j;return this[field];};x3dom.fields.SFMatrix4f.prototype.sqrt=function(){var Y=x3dom.fields.SFMatrix4f.identity();var result=x3dom.fields.SFMatrix4f.copy(this);for(var i=0;i<6;i++) {var iX=result.inverse();var iY=(i==0)?x3dom.fields.SFMatrix4f.identity():Y.inverse();var rd=result.det(),yd=Y.det();var g=Math.abs(Math.pow(rd*yd,-0.125));var ig=1.0/g;result=result.multiply(g);result=result.addScaled(iY,ig);result=result.multiply(0.5);Y=Y.multiply(g);Y=Y.addScaled(iX,ig);Y=Y.multiply(0.5);} return result;};x3dom.fields.SFMatrix4f.prototype.normInfinity=function(){var t=0,m=0;if((t=Math.abs(this._00))>m){m=t;} if((t=Math.abs(this._01))>m){m=t;} if((t=Math.abs(this._02))>m){m=t;} if((t=Math.abs(this._03))>m){m=t;} if((t=Math.abs(this._10))>m){m=t;} if((t=Math.abs(this._11))>m){m=t;} if((t=Math.abs(this._12))>m){m=t;} if((t=Math.abs(this._13))>m){m=t;} if((t=Math.abs(this._20))>m){m=t;} if((t=Math.abs(this._21))>m){m=t;} if((t=Math.abs(this._22))>m){m=t;} if((t=Math.abs(this._23))>m){m=t;} if((t=Math.abs(this._30))>m){m=t;} if((t=Math.abs(this._31))>m){m=t;} if((t=Math.abs(this._32))>m){m=t;} if((t=Math.abs(this._33))>m){m=t;} return m;};x3dom.fields.SFMatrix4f.prototype.norm1_3x3=function(){var max=Math.abs(this._00)+ Math.abs(this._10)+ Math.abs(this._20);var t=0;if((t=Math.abs(this._01)+ Math.abs(this._11)+ Math.abs(this._21))>max){max=t;} if((t=Math.abs(this._02)+ Math.abs(this._12)+ Math.abs(this._22))>max){max=t;} return max;};x3dom.fields.SFMatrix4f.prototype.normInf_3x3=function(){var max=Math.abs(this._00)+ Math.abs(this._01)+ Math.abs(this._02);var t=0;if((t=Math.abs(this._10)+ Math.abs(this._11)+ Math.abs(this._12))>max){max=t;} if((t=Math.abs(this._20)+ Math.abs(this._21)+ Math.abs(this._22))>max){max=t;} return max;};x3dom.fields.SFMatrix4f.prototype.adjointT_3x3=function(){var result=x3dom.fields.SFMatrix4f.identity();result._00=this._11*this._22-this._12*this._21;result._01=this._12*this._20-this._10*this._22;result._02=this._10*this._21-this._11*this._20;result._10=this._21*this._02-this._22*this._01;result._11=this._22*this._00-this._20*this._02;result._12=this._20*this._01-this._21*this._00;result._20=this._01*this._12-this._02*this._11;result._21=this._02*this._10-this._00*this._12;result._22=this._00*this._11-this._01*this._10;return result;};x3dom.fields.SFMatrix4f.prototype.equals=function(that){var eps=0.000000000001;return Math.abs(this._00-that._00)4){m=x3dom.fields.SFMatrix4f.translation(center.negate());m=m.mult(this);var c=x3dom.fields.SFMatrix4f.translation(center);m=m.mult(c);} else{m=x3dom.fields.SFMatrix4f.copy(this);} var flip=m.decompose(translation,rotation,scaleFactor,scaleOrientation);scaleFactor.setValues(scaleFactor.multiply(flip));};x3dom.fields.SFMatrix4f.prototype.decompose=function(t,r,s,so) {var A=x3dom.fields.SFMatrix4f.copy(this);var Q=x3dom.fields.SFMatrix4f.identity(),S=x3dom.fields.SFMatrix4f.identity(),SO=x3dom.fields.SFMatrix4f.identity();t.x=A._03;t.y=A._13;t.z=A._23;A._03=0.0;A._13=0.0;A._23=0.0;A._30=0.0;A._31=0.0;A._32=0.0;var det=A.polarDecompose(Q,S);var f=1.0;if(det<0.0){Q=Q.negate();f=-1.0;} r.setValue(Q);S.spectralDecompose(SO,s);so.setValue(SO);return f;};x3dom.fields.SFMatrix4f.prototype.polarDecompose=function(Q,S) {var TOL=0.000000000001;var Mk=this.transpose();var Ek=x3dom.fields.SFMatrix4f.identity();var Mk_one=Mk.norm1_3x3();var Mk_inf=Mk.normInf_3x3();var MkAdjT;var MkAdjT_one,MkAdjT_inf;var Ek_one,Mk_det;do {MkAdjT=Mk.adjointT_3x3();Mk_det=Mk._00*MkAdjT._00+ Mk._01*MkAdjT._01+ Mk._02*MkAdjT._02;if(Mk_det==0.0) {x3dom.debug.logWarning("polarDecompose: Mk_det == 0.0");break;} MkAdjT_one=MkAdjT.norm1_3x3();MkAdjT_inf=MkAdjT.normInf_3x3();var gamma=Math.sqrt(Math.sqrt((MkAdjT_one*MkAdjT_inf)/(Mk_one*Mk_inf))/Math.abs(Mk_det));var g1=0.5*gamma;var g2=0.5/(gamma*Mk_det);Ek.setValues(Mk);Mk=Mk.multiply(g1);Mk=Mk.addScaled(MkAdjT,g2);Ek=Ek.addScaled(Mk,-1.0);Ek_one=Ek.norm1_3x3();Mk_one=Mk.norm1_3x3();Mk_inf=Mk.normInf_3x3();}while(Ek_one>(Mk_one*TOL));Q.setValues(Mk.transpose());S.setValues(Mk.mult(this));for(var i=0;i<3;++i) {for(var j=i;j<3;++j) {S['_'+j+i]=0.5*(S['_'+j+i]+S['_'+i+j]);S['_'+i+j]=0.5*(S['_'+j+i]+S['_'+i+j]);}} return Mk_det;};x3dom.fields.SFMatrix4f.prototype.spectralDecompose=function(SO,k) {var next=[1,2,0];var maxIterations=20;var diag=[this._00,this._11,this._22];var offDiag=[this._12,this._20,this._01];for(var iter=0;iter=0;--i) {var p=next[i];var q=next[p];var absOffDiag=Math.abs(offDiag[i]);var g=100.0*absOffDiag;if(absOffDiag>0.0) {var t=0,h=diag[q]-diag[p];var absh=Math.abs(h);if(absh+g==absh) {t=offDiag[i]/h;} else {var theta=0.5*h/offDiag[i];t=1.0/(Math.abs(theta)+Math.sqrt(theta*theta+1.0));t=theta<0.0?-t:t;} var c=1.0/Math.sqrt(t*t+1.0);var s=t*c;var tau=s/(c+1.0);var ta=t*offDiag[i];offDiag[i]=0.0;diag[p]-=ta;diag[q]+=ta;var offDiagq=offDiag[q];offDiag[q]-=s*(offDiag[p]+tau*offDiagq);offDiag[p]+=s*(offDiagq-tau*offDiag[p]);for(var j=2;j>=0;--j) {var a=SO['_'+j+p];var b=SO['_'+j+q];SO['_'+j+p]-=s*(b+tau*a);SO['_'+j+q]+=s*(a-tau*b);}}}} k.x=diag[0];k.y=diag[1];k.z=diag[2];};x3dom.fields.SFMatrix4f.prototype.log=function(){var maxiter=12;var eps=1e-12;var A=x3dom.fields.SFMatrix4f.copy(this),Z=x3dom.fields.SFMatrix4f.copy(this);Z._00-=1;Z._11-=1;Z._22-=1;Z._33-=1;var k=0;while(Z.normInfinity()>0.5) {A=A.sqrt();Z.setValues(A);Z._00-=1;Z._11-=1;Z._22-=1;Z._33-=1;k++;} A._00-=1;A._11-=1;A._22-=1;A._33-=1;A=A.negate();Z.setValues(A);var result=x3dom.fields.SFMatrix4f.copy(A);var i=1;while(Z.normInfinity()>eps&&i0.0001){theta_1=-Math.asin(this._20);theta_2=Math.PI-theta_1;cos_theta_1=Math.cos(theta_1);cos_theta_2=Math.cos(theta_2);psi_1=Math.atan2(this._21/cos_theta_1,this._22/cos_theta_1);psi_2=Math.atan2(this._21/cos_theta_2,this._22/cos_theta_2);phi_1=Math.atan2(this._10/cos_theta_1,this._00/cos_theta_1);phi_2=Math.atan2(this._10/cos_theta_2,this._00/cos_theta_2);return[psi_1,theta_1,phi_1,psi_2,theta_2,phi_2];} else{phi=0;if(this._20==-1.0){theta=Math.PI/2.0;psi=phi+Math.atan2(this._01,this._02);} else{theta=-(Math.PI/2.0);psi=-phi+Math.atan2(-this._01,-this._02);} return[psi,theta,phi,psi,theta,phi];}};x3dom.fields.SFMatrix4f.prototype.toString=function(){return'\n'+ this._00.toFixed(6)+', '+this._01.toFixed(6)+', '+ this._02.toFixed(6)+', '+this._03.toFixed(6)+', \n'+ this._10.toFixed(6)+', '+this._11.toFixed(6)+', '+ this._12.toFixed(6)+', '+this._13.toFixed(6)+', \n'+ this._20.toFixed(6)+', '+this._21.toFixed(6)+', '+ this._22.toFixed(6)+', '+this._23.toFixed(6)+', \n'+ this._30.toFixed(6)+', '+this._31.toFixed(6)+', '+ this._32.toFixed(6)+', '+this._33.toFixed(6);};x3dom.fields.SFMatrix4f.prototype.setValueByStr=function(str){var needTranspose=false;var val=/matrix.*\((.+)\)/;if(val.exec(str)){str=RegExp.$1;needTranspose=true;} var arr=Array.map(str.split(/[,\s]+/),function(n){return+n;});if(arr.length>=16) {if(!needTranspose){this._00=arr[0];this._01=arr[1];this._02=arr[2];this._03=arr[3];this._10=arr[4];this._11=arr[5];this._12=arr[6];this._13=arr[7];this._20=arr[8];this._21=arr[9];this._22=arr[10];this._23=arr[11];this._30=arr[12];this._31=arr[13];this._32=arr[14];this._33=arr[15];} else{this._00=arr[0];this._01=arr[4];this._02=arr[8];this._03=arr[12];this._10=arr[1];this._11=arr[5];this._12=arr[9];this._13=arr[13];this._20=arr[2];this._21=arr[6];this._22=arr[10];this._23=arr[14];this._30=arr[3];this._31=arr[7];this._32=arr[11];this._33=arr[15];}} else if(arr.length===6){this._00=arr[0];this._01=arr[1];this._02=0;this._03=arr[4];this._10=arr[2];this._11=arr[3];this._12=0;this._13=arr[5];this._20=0;this._21=0;this._22=1;this._23=0;this._30=0;this._31=0;this._32=0;this._33=1;} else{x3dom.debug.logWarning("SFMatrix4f - can't parse string: "+str);} return this;};x3dom.fields.SFVec2f=function(x,y){if(arguments.length===0){this.x=0;this.y=0;} else{this.x=x;this.y=y;}};x3dom.fields.SFVec2f.copy=function(v){return new x3dom.fields.SFVec2f(v.x,v.y);};x3dom.fields.SFVec2f.parse=function(str){var m=/^\s*([+\-]?\d*\.*\d*[eE]?[+\-]?\d*?)\s*,?\s*([+\-]?\d*\.*\d*[eE]?[+\-]?\d*?)\s*$/.exec(str);return new x3dom.fields.SFVec2f(+m[1],+m[2]);};x3dom.fields.SFVec2f.prototype.copy=function(){return x3dom.fields.SFVec2f.copy(this);};x3dom.fields.SFVec2f.prototype.setValues=function(that){this.x=that.x;this.y=that.y;};x3dom.fields.SFVec2f.prototype.at=function(i){switch(i){case 0:return this.x;case 1:return this.y;default:return this.x;}};x3dom.fields.SFVec2f.prototype.add=function(that){return new x3dom.fields.SFVec2f(this.x+that.x,this.y+that.y);};x3dom.fields.SFVec2f.prototype.subtract=function(that){return new x3dom.fields.SFVec2f(this.x-that.x,this.y-that.y);};x3dom.fields.SFVec2f.prototype.negate=function(){return new x3dom.fields.SFVec2f(-this.x,-this.y);};x3dom.fields.SFVec2f.prototype.dot=function(that){return this.x*that.x+this.y*that.y;};x3dom.fields.SFVec2f.prototype.reflect=function(n){var d2=this.dot(n)*2;return new x3dom.fields.SFVec2f(this.x-d2*n.x,this.y-d2*n.y);};x3dom.fields.SFVec2f.prototype.normalize=function(){var n=this.length();if(n){n=1.0/n;} return new x3dom.fields.SFVec2f(this.x*n,this.y*n);};x3dom.fields.SFVec2f.prototype.multComponents=function(that){return new x3dom.fields.SFVec2f(this.x*that.x,this.y*that.y);};x3dom.fields.SFVec2f.prototype.multiply=function(n){return new x3dom.fields.SFVec2f(this.x*n,this.y*n);};x3dom.fields.SFVec2f.prototype.divide=function(n){var denom=n?(1.0/n):1.0;return new x3dom.fields.SFVec2f(this.x*denom,this.y*denom);};x3dom.fields.SFVec2f.prototype.equals=function(that,eps){return Math.abs(this.x-that.x)x3dom.fields.Eps) {var s=Math.sin(a/2)/t;var c=Math.cos(a/2);return new x3dom.fields.Quaternion(axis.x*s,axis.y*s,axis.z*s,c);} else {return new x3dom.fields.Quaternion(0,0,0,1);}};x3dom.fields.Quaternion.prototype.copy=function(){return x3dom.fields.Quaternion.copy(this);};x3dom.fields.Quaternion.prototype.toMatrix=function(){var xx=this.x*this.x;var xy=this.x*this.y;var xz=this.x*this.z;var yy=this.y*this.y;var yz=this.y*this.z;var zz=this.z*this.z;var wx=this.w*this.x;var wy=this.w*this.y;var wz=this.w*this.z;return new x3dom.fields.SFMatrix4f(1-2*(yy+zz),2*(xy-wz),2*(xz+wy),0,2*(xy+wz),1-2*(xx+zz),2*(yz-wx),0,2*(xz-wy),2*(yz+wx),1-2*(xx+yy),0,0,0,0,1);};x3dom.fields.Quaternion.prototype.toAxisAngle=function() {var x=0,y=0,z=0;var s=0,a=0;var that=this;if(this.w>1) {that=x3dom.fields.Quaternion.normalize(this);} a=2*Math.acos(that.w);s=Math.sqrt(1-that.w*that.w);if(s==0) {x=that.x;y=that.y;z=that.z;} else {x=that.x/s;y=that.y/s;z=that.z/s;} return[new x3dom.fields.SFVec3f(x,y,z),a];};x3dom.fields.Quaternion.prototype.angle=function() {return 2*Math.acos(this.w);};x3dom.fields.Quaternion.prototype.setValue=function(matrix) {var tr,s=1;var qt=[0,0,0];var i=0,j=0,k=0;var nxt=[1,2,0];tr=matrix._00+matrix._11+matrix._22;if(tr>0.0) {s=Math.sqrt(tr+1.0);this.w=s*0.5;s=0.5/s;this.x=(matrix._21-matrix._12)*s;this.y=(matrix._02-matrix._20)*s;this.z=(matrix._10-matrix._01)*s;} else {if(matrix._11>matrix._00){i=1;} else{i=0;} if(matrix._22>matrix.at(i,i)){i=2;} j=nxt[i];k=nxt[j];s=Math.sqrt(matrix.at(i,i)-(matrix.at(j,j)+matrix.at(k,k))+1.0);qt[i]=s*0.5;s=0.5/s;this.w=(matrix.at(k,j)-matrix.at(j,k))*s;qt[j]=(matrix.at(j,i)+matrix.at(i,j))*s;qt[k]=(matrix.at(k,i)+matrix.at(i,k))*s;this.x=qt[0];this.y=qt[1];this.z=qt[2];} if(this.w>1.0||this.w<-1.0) {var errThreshold=1+(x3dom.fields.Eps*100);if(this.w>errThreshold||this.w<-errThreshold) {x3dom.debug.logInfo("MatToQuat: BUG: |quat[4]| ("+this.w+") >> 1.0 !");} if(this.w>1.0){this.w=1.0;} else{this.w=-1.0;}}};x3dom.fields.Quaternion.prototype.setFromEuler=function(alpha,beta,gamma){var sx=Math.sin(alpha*0.5);var cx=Math.cos(alpha*0.5);var sy=Math.sin(beta*0.5);var cy=Math.cos(beta*0.5);var sz=Math.sin(gamma*0.5);var cz=Math.cos(gamma*0.5);this.x=(sx*cy*cz)-(cx*sy*sz);this.y=(cx*sy*cz)+(sx*cy*sz);this.z=(cx*cy*sz)-(sx*sy*cz);this.w=(cx*cy*cz)+(sx*sy*sz);};x3dom.fields.Quaternion.prototype.dot=function(that){return this.x*that.x+this.y*that.y+this.z*that.z+this.w*that.w;};x3dom.fields.Quaternion.prototype.add=function(that){return new x3dom.fields.Quaternion(this.x+that.x,this.y+that.y,this.z+that.z,this.w+that.w);};x3dom.fields.Quaternion.prototype.subtract=function(that){return new x3dom.fields.Quaternion(this.x-that.x,this.y-that.y,this.z-that.z,this.w-that.w);};x3dom.fields.Quaternion.prototype.setValues=function(that){this.x=that.x;this.y=that.y;this.z=that.z;this.w=that.w;};x3dom.fields.Quaternion.prototype.equals=function(that,eps){return(this.dot(that)>=1.0-eps);};x3dom.fields.Quaternion.prototype.multScalar=function(s){return new x3dom.fields.Quaternion(this.x*s,this.y*s,this.z*s,this.w*s);};x3dom.fields.Quaternion.prototype.normalize=function(that){var d2=this.dot(that);var id=1.0;if(d2){id=1.0/Math.sqrt(d2);} return new x3dom.fields.Quaternion(this.x*id,this.y*id,this.z*id,this.w*id);};x3dom.fields.Quaternion.prototype.negate=function(){return new x3dom.fields.Quaternion(-this.x,-this.y,-this.z,-this.w);};x3dom.fields.Quaternion.prototype.inverse=function(){return new x3dom.fields.Quaternion(-this.x,-this.y,-this.z,this.w);};x3dom.fields.Quaternion.prototype.slerp=function(that,t){var cosom=this.dot(that);var rot1;if(cosom<0.0) {cosom=-cosom;rot1=that.negate();} else {rot1=new x3dom.fields.Quaternion(that.x,that.y,that.z,that.w);} var scalerot0,scalerot1;if((1.0-cosom)>0.00001) {var omega=Math.acos(cosom);var sinom=Math.sin(omega);scalerot0=Math.sin((1.0-t)*omega)/sinom;scalerot1=Math.sin(t*omega)/sinom;} else {scalerot0=1.0-t;scalerot1=t;} return this.multScalar(scalerot0).add(rot1.multScalar(scalerot1));};x3dom.fields.Quaternion.rotateFromTo=function(fromVec,toVec){var from=fromVec.normalize();var to=toVec.normalize();var cost=from.dot(to);if(cost>0.99999) {return new x3dom.fields.Quaternion(0,0,0,1);} else if(cost<-0.99999) {var cAxis=new x3dom.fields.SFVec3f(1,0,0);var tmp=from.cross(cAxis);if(tmp.length()<0.00001) {cAxis.x=0;cAxis.y=1;cAxis.z=0;tmp=from.cross(cAxis);} tmp=tmp.normalize();return x3dom.fields.Quaternion.axisAngle(tmp,Math.PI);} var axis=fromVec.cross(toVec);axis=axis.normalize();var s=Math.sqrt(0.5*(1.0-cost));axis=axis.multiply(s);s=Math.sqrt(0.5*(1.0+cost));return new x3dom.fields.Quaternion(axis.x,axis.y,axis.z,s);};x3dom.fields.Quaternion.prototype.toGL=function(){var val=this.toAxisAngle();return[val[0].x,val[0].y,val[0].z,val[1]];};x3dom.fields.Quaternion.prototype.toString=function(){return this.x+" "+this.y+" "+this.z+", "+this.w;};x3dom.fields.Quaternion.prototype.setValueByStr=function(str){var m=/^\s*([+\-]?\d*\.*\d*[eE]?[+\-]?\d*?)\s*,?\s*([+\-]?\d*\.*\d*[eE]?[+\-]?\d*?)\s*,?\s*([+\-]?\d*\.*\d*[eE]?[+\-]?\d*?)\s*,?\s*([+\-]?\d*\.*\d*[eE]?[+\-]?\d*?)\s*$/.exec(str);var quat=x3dom.fields.Quaternion.axisAngle(new x3dom.fields.SFVec3f(+m[1],+m[2],+m[3]),+m[4]);this.x=quat.x;this.y=quat.y;this.z=quat.z;this.w=quat.w;return this;};x3dom.fields.SFColor=function(r,g,b){if(arguments.length===0){this.r=0;this.g=0;this.b=0;} else{this.r=r;this.g=g;this.b=b;}};x3dom.fields.SFColor.parse=function(str){try{var m=/^\s*([+\-]?\d*\.*\d*[eE]?[+\-]?\d*?)\s*,?\s*([+\-]?\d*\.*\d*[eE]?[+\-]?\d*?)\s*,?\s*([+\-]?\d*\.*\d*[eE]?[+\-]?\d*?)\s*$/.exec(str);return new x3dom.fields.SFColor(+m[1],+m[2],+m[3]);} catch(e){return x3dom.fields.SFColor.colorParse(str);}};x3dom.fields.SFColor.copy=function(that){return new x3dom.fields.SFColor(that.r,that.g,that.b);};x3dom.fields.SFColor.prototype.copy=function(){return x3dom.fields.SFColor.copy(this);};x3dom.fields.SFColor.prototype.setHSV=function(h,s,v){x3dom.debug.logWarning("SFColor.setHSV() NYI");};x3dom.fields.SFColor.prototype.getHSV=function(){var h=0,s=0,v=0;x3dom.debug.logWarning("SFColor.getHSV() NYI");return[h,s,v];};x3dom.fields.SFColor.prototype.setValues=function(color){this.r=color.r;this.g=color.g;this.b=color.b;};x3dom.fields.SFColor.prototype.equals=function(that,eps){return Math.abs(this.r-that.r)>>0;};x3dom.fields.SFColorRGBA.colorParse=function(color){var red=0,green=0,blue=0,alpha=0;var color_names={aliceblue:'f0f8ff',antiquewhite:'faebd7',aqua:'00ffff',aquamarine:'7fffd4',azure:'f0ffff',beige:'f5f5dc',bisque:'ffe4c4',black:'000000',blanchedalmond:'ffebcd',blue:'0000ff',blueviolet:'8a2be2',brown:'a52a2a',burlywood:'deb887',cadetblue:'5f9ea0',chartreuse:'7fff00',chocolate:'d2691e',coral:'ff7f50',cornflowerblue:'6495ed',cornsilk:'fff8dc',crimson:'dc143c',cyan:'00ffff',darkblue:'00008b',darkcyan:'008b8b',darkgoldenrod:'b8860b',darkgray:'a9a9a9',darkgreen:'006400',darkkhaki:'bdb76b',darkmagenta:'8b008b',darkolivegreen:'556b2f',darkorange:'ff8c00',darkorchid:'9932cc',darkred:'8b0000',darksalmon:'e9967a',darkseagreen:'8fbc8f',darkslateblue:'483d8b',darkslategray:'2f4f4f',darkturquoise:'00ced1',darkviolet:'9400d3',deeppink:'ff1493',deepskyblue:'00bfff',dimgray:'696969',dodgerblue:'1e90ff',feldspar:'d19275',firebrick:'b22222',floralwhite:'fffaf0',forestgreen:'228b22',fuchsia:'ff00ff',gainsboro:'dcdcdc',ghostwhite:'f8f8ff',gold:'ffd700',goldenrod:'daa520',gray:'808080',green:'008000',greenyellow:'adff2f',honeydew:'f0fff0',hotpink:'ff69b4',indianred:'cd5c5c',indigo:'4b0082',ivory:'fffff0',khaki:'f0e68c',lavender:'e6e6fa',lavenderblush:'fff0f5',lawngreen:'7cfc00',lemonchiffon:'fffacd',lightblue:'add8e6',lightcoral:'f08080',lightcyan:'e0ffff',lightgoldenrodyellow:'fafad2',lightgrey:'d3d3d3',lightgreen:'90ee90',lightpink:'ffb6c1',lightsalmon:'ffa07a',lightseagreen:'20b2aa',lightskyblue:'87cefa',lightslateblue:'8470ff',lightslategray:'778899',lightsteelblue:'b0c4de',lightyellow:'ffffe0',lime:'00ff00',limegreen:'32cd32',linen:'faf0e6',magenta:'ff00ff',maroon:'800000',mediumaquamarine:'66cdaa',mediumblue:'0000cd',mediumorchid:'ba55d3',mediumpurple:'9370d8',mediumseagreen:'3cb371',mediumslateblue:'7b68ee',mediumspringgreen:'00fa9a',mediumturquoise:'48d1cc',mediumvioletred:'c71585',midnightblue:'191970',mintcream:'f5fffa',mistyrose:'ffe4e1',moccasin:'ffe4b5',navajowhite:'ffdead',navy:'000080',oldlace:'fdf5e6',olive:'808000',olivedrab:'6b8e23',orange:'ffa500',orangered:'ff4500',orchid:'da70d6',palegoldenrod:'eee8aa',palegreen:'98fb98',paleturquoise:'afeeee',palevioletred:'d87093',papayawhip:'ffefd5',peachpuff:'ffdab9',peru:'cd853f',pink:'ffc0cb',plum:'dda0dd',powderblue:'b0e0e6',purple:'800080',red:'ff0000',rosybrown:'bc8f8f',royalblue:'4169e1',saddlebrown:'8b4513',salmon:'fa8072',sandybrown:'f4a460',seagreen:'2e8b57',seashell:'fff5ee',sienna:'a0522d',silver:'c0c0c0',skyblue:'87ceeb',slateblue:'6a5acd',slategray:'708090',snow:'fffafa',springgreen:'00ff7f',steelblue:'4682b4',tan:'d2b48c',teal:'008080',thistle:'d8bfd8',tomato:'ff6347',turquoise:'40e0d0',violet:'ee82ee',violetred:'d02090',wheat:'f5deb3',white:'ffffff',whitesmoke:'f5f5f5',yellow:'ffff00',yellowgreen:'9acd32'};if(color_names[color]){color="#"+color_names[color]+"ff";} if(color.substr&&color.substr(0,1)==="#"){color=color.substr(1);var len=color.length;if(len===8){red=parseInt("0x"+color.substr(0,2),16)/255.0;green=parseInt("0x"+color.substr(2,2),16)/255.0;blue=parseInt("0x"+color.substr(4,2),16)/255.0;alpha=parseInt("0x"+color.substr(6,2),16)/255.0;} else if(len===6){red=parseInt("0x"+color.substr(0,2),16)/255.0;green=parseInt("0x"+color.substr(2,2),16)/255.0;blue=parseInt("0x"+color.substr(4,2),16)/255.0;alpha=1.0;} else if(len===4){red=parseInt("0x"+color.substr(0,1),16)/15.0;green=parseInt("0x"+color.substr(1,1),16)/15.0;blue=parseInt("0x"+color.substr(2,1),16)/15.0;alpha=parseInt("0x"+color.substr(3,1),16)/15.0;} else if(len===3){red=parseInt("0x"+color.substr(0,1),16)/15.0;green=parseInt("0x"+color.substr(1,1),16)/15.0;blue=parseInt("0x"+color.substr(2,1),16)/15.0;alpha=1.0;}} return new x3dom.fields.SFColorRGBA(red,green,blue,alpha);};x3dom.fields.SFImage=function(w,h,c,arr){if(arguments.length===0||!(arr&&arr.map)){this.width=0;this.height=0;this.comp=0;this.array=[];} else{this.width=w;this.height=h;this.comp=c;var that=this.array;arr.map(function(v){that.push(v);},this.array);}};x3dom.fields.SFImage.parse=function(str){var img=new x3dom.fields.SFImage();img.setValueByStr(str);return img;};x3dom.fields.SFImage.copy=function(that){var destination=new x3dom.fields.SFImage();destination.width=that.width;destination.height=that.height;destination.comp=that.comp;destination.setPixels(that.getPixels());return destination;};x3dom.fields.SFImage.prototype.copy=function(){return x3dom.fields.SFImage.copy(this);};x3dom.fields.SFImage.prototype.setValueByStr=function(str){var mc=str.match(/(\w+)/g);var n=mc.length;var c2=0;var hex="0123456789ABCDEF";this.array=[];if(n>2){this.width=+mc[0];this.height=+mc[1];this.comp=+mc[2];c2=2*this.comp;}else{this.width=0;this.height=0;this.comp=0;return;} var len,i;for(i=3;i>8&255;g=inp&255;this.array.push(r,g);} else if(this.comp===3){r=inp>>16&255;g=inp>>8&255;b=inp&255;this.array.push(r,g,b);} else if(this.comp===4){r=inp>>24&255;g=inp>>16&255;b=inp>>8&255;a=inp&255;this.array.push(r,g,b,a);}} else if(mc[i].substr(1,1).toLowerCase()==="x"){mc[i]=mc[i].substr(2);len=mc[i].length;if(len===c2){if(this.comp===1){r=parseInt("0x"+mc[i].substr(0,2),16);this.array.push(r);} else if(this.comp===2){r=parseInt("0x"+mc[i].substr(0,2),16);g=parseInt("0x"+mc[i].substr(2,2),16);this.array.push(r,g);} else if(this.comp===3){r=parseInt("0x"+mc[i].substr(0,2),16);g=parseInt("0x"+mc[i].substr(2,2),16);b=parseInt("0x"+mc[i].substr(4,2),16);this.array.push(r,g,b);} else if(this.comp===4){r=parseInt("0x"+mc[i].substr(0,2),16);g=parseInt("0x"+mc[i].substr(2,2),16);b=parseInt("0x"+mc[i].substr(4,2),16);a=parseInt("0x"+mc[i].substr(6,2),16);this.array.push(r,g,b,a);}}}}};x3dom.fields.SFImage.prototype.setPixel=function(x,y,color){var startIdx=(y*this.width+x)*this.comp;if(this.comp===1&&startIdx0);} return false;};x3dom.fields.MFNode.prototype.addLink=function(node){this.nodes.push(node);return true;};x3dom.fields.MFNode.prototype.rmLink=function(node){for(var i=0,n=this.nodes.length;ix3dom.fields.Eps) {r=1.0/this.dir.x;te=(low.x-this.pos.x)*r;tl=(high.x-this.pos.x)*r;if(tlisect){isect=te;}} else if(this.dir.x<-x3dom.fields.Eps) {r=1.0/this.dir.x;te=(high.x-this.pos.x)*r;tl=(low.x-this.pos.x)*r;if(tlisect){isect=te;}} else if(this.pos.xhigh.x) {return false;} if(this.dir.y>x3dom.fields.Eps) {r=1.0/this.dir.y;te=(low.y-this.pos.y)*r;tl=(high.y-this.pos.y)*r;if(tlisect){isect=te;} if(isect-out>=x3dom.fields.Eps){return false;}} else if(this.dir.y<-x3dom.fields.Eps) {r=1.0/this.dir.y;te=(high.y-this.pos.y)*r;tl=(low.y-this.pos.y)*r;if(tlisect){isect=te;} if(isect-out>=x3dom.fields.Eps){return false;}} else if(this.pos.yhigh.y) {return false;} if(this.dir.z>x3dom.fields.Eps) {r=1.0/this.dir.z;te=(low.z-this.pos.z)*r;tl=(high.z-this.pos.z)*r;if(tlisect){isect=te;}} else if(this.dir.z<-x3dom.fields.Eps) {r=1.0/this.dir.z;te=(high.z-this.pos.z)*r;tl=(low.z-this.pos.z)*r;if(tlisect){isect=te;}} else if(this.pos.zhigh.z) {return false;} this.enter=isect;this.exit=out;return(isect-outmin.x){this.min.x=min.x;} if(this.min.y>min.y){this.min.y=min.y;} if(this.min.z>min.z){this.min.z=min.z;} if(this.max.x=b){xmax+=a;xmin+=b;} else{xmax+=b;xmin+=a;} a=this.max.y*m._01;b=this.min.y*m._01;if(a>=b){xmax+=a;xmin+=b;} else{xmax+=b;xmin+=a;} a=this.max.z*m._02;b=this.min.z*m._02;if(a>=b){xmax+=a;xmin+=b;} else{xmax+=b;xmin+=a;} a=this.max.x*m._10;b=this.min.x*m._10;if(a>=b){ymax+=a;ymin+=b;} else{ymax+=b;ymin+=a;} a=this.max.y*m._11;b=this.min.y*m._11;if(a>=b){ymax+=a;ymin+=b;} else{ymax+=b;ymin+=a;} a=this.max.z*m._12;b=this.min.z*m._12;if(a>=b){ymax+=a;ymin+=b;} else{ymax+=b;ymin+=a;} a=this.max.x*m._20;b=this.min.x*m._20;if(a>=b){zmax+=a;zmin+=b;} else{zmax+=b;zmin+=a;} a=this.max.y*m._21;b=this.min.y*m._21;if(a>=b){zmax+=a;zmin+=b;} else{zmax+=b;zmin+=a;} a=this.max.z*m._22;b=this.min.z*m._22;if(a>=b){zmax+=a;zmin+=b;} else{zmax+=b;zmin+=a;} this.min.x=xmin;this.min.y=ymin;this.min.z=zmin;this.max.x=xmax;this.max.y=ymax;this.max.z=zmax;this.updateInternals();};x3dom.fields.BoxVolume.prototype.transformFrom=function(m,other) {var xmin,ymin,zmin;var xmax,ymax,zmax;xmin=xmax=m._03;ymin=ymax=m._13;zmin=zmax=m._23;var a=other.max.x*m._00;var b=other.min.x*m._00;if(a>=b){xmax+=a;xmin+=b;} else{xmax+=b;xmin+=a;} a=other.max.y*m._01;b=other.min.y*m._01;if(a>=b){xmax+=a;xmin+=b;} else{xmax+=b;xmin+=a;} a=other.max.z*m._02;b=other.min.z*m._02;if(a>=b){xmax+=a;xmin+=b;} else{xmax+=b;xmin+=a;} a=other.max.x*m._10;b=other.min.x*m._10;if(a>=b){ymax+=a;ymin+=b;} else{ymax+=b;ymin+=a;} a=other.max.y*m._11;b=other.min.y*m._11;if(a>=b){ymax+=a;ymin+=b;} else{ymax+=b;ymin+=a;} a=other.max.z*m._12;b=other.min.z*m._12;if(a>=b){ymax+=a;ymin+=b;} else{ymax+=b;ymin+=a;} a=other.max.x*m._20;b=other.min.x*m._20;if(a>=b){zmax+=a;zmin+=b;} else{zmax+=b;zmin+=a;} a=other.max.y*m._21;b=other.min.y*m._21;if(a>=b){zmax+=a;zmin+=b;} else{zmax+=b;zmin+=a;} a=other.max.z*m._22;b=other.min.z*m._22;if(a>=b){zmax+=a;zmin+=b;} else{zmax+=b;zmin+=a;} this.min.x=xmin;this.min.y=ymin;this.min.z=zmin;this.max.x=xmax;this.max.y=ymax;this.max.z=zmax;this.updateInternals();this.valid=true;};x3dom.fields.FrustumVolume=function(clipMat) {this.planeNormals=[];this.planeDistances=[];this.directionIndex=[];if(arguments.length===0){return;} var planeEquation=[];for(var i=0;i<6;i++){this.planeNormals[i]=new x3dom.fields.SFVec3f(0,0,0);this.planeDistances[i]=0;this.directionIndex[i]=0;planeEquation[i]=new x3dom.fields.SFVec4f(0,0,0,0);} planeEquation[0].x=clipMat._30-clipMat._00;planeEquation[0].y=clipMat._31-clipMat._01;planeEquation[0].z=clipMat._32-clipMat._02;planeEquation[0].w=clipMat._33-clipMat._03;planeEquation[1].x=clipMat._30+clipMat._00;planeEquation[1].y=clipMat._31+clipMat._01;planeEquation[1].z=clipMat._32+clipMat._02;planeEquation[1].w=clipMat._33+clipMat._03;planeEquation[2].x=clipMat._30+clipMat._10;planeEquation[2].y=clipMat._31+clipMat._11;planeEquation[2].z=clipMat._32+clipMat._12;planeEquation[2].w=clipMat._33+clipMat._13;planeEquation[3].x=clipMat._30-clipMat._10;planeEquation[3].y=clipMat._31-clipMat._11;planeEquation[3].z=clipMat._32-clipMat._12;planeEquation[3].w=clipMat._33-clipMat._13;planeEquation[4].x=clipMat._30+clipMat._20;planeEquation[4].y=clipMat._31+clipMat._21;planeEquation[4].z=clipMat._32+clipMat._22;planeEquation[4].w=clipMat._33+clipMat._23;planeEquation[5].x=clipMat._30-clipMat._20;planeEquation[5].y=clipMat._31-clipMat._21;planeEquation[5].z=clipMat._32-clipMat._22;planeEquation[5].w=clipMat._33-clipMat._23;for(i=0;i<6;i++){var vectorLength=Math.sqrt(planeEquation[i].x*planeEquation[i].x+ planeEquation[i].y*planeEquation[i].y+ planeEquation[i].z*planeEquation[i].z);planeEquation[i].x/=vectorLength;planeEquation[i].y/=vectorLength;planeEquation[i].z/=vectorLength;planeEquation[i].w/=-vectorLength;} var updateDirectionIndex=function(normalVec){var ind=0;if(normalVec.x>0)ind|=1;if(normalVec.y>0)ind|=2;if(normalVec.z>0)ind|=4;return ind;};this.planeNormals[3].setValues(planeEquation[0]);this.planeDistances[3]=planeEquation[0].w;this.directionIndex[3]=updateDirectionIndex(this.planeNormals[3]);this.planeNormals[2].setValues(planeEquation[1]);this.planeDistances[2]=planeEquation[1].w;this.directionIndex[2]=updateDirectionIndex(this.planeNormals[2]);this.planeNormals[5].setValues(planeEquation[2]);this.planeDistances[5]=planeEquation[2].w;this.directionIndex[5]=updateDirectionIndex(this.planeNormals[5]);this.planeNormals[4].setValues(planeEquation[3]);this.planeDistances[4]=planeEquation[3].w;this.directionIndex[4]=updateDirectionIndex(this.planeNormals[4]);this.planeNormals[0].setValues(planeEquation[4]);this.planeDistances[0]=planeEquation[4].w;this.directionIndex[0]=updateDirectionIndex(this.planeNormals[0]);this.planeNormals[1].setValues(planeEquation[5]);this.planeDistances[1]=planeEquation[5].w;this.directionIndex[1]=updateDirectionIndex(this.planeNormals[1]);};x3dom.fields.FrustumVolume.prototype.intersect=function(vol,planeMask) {if(this.planeNormals.length<6){x3dom.debug.logWarning("FrustumVolume not initialized!");return false;} var that=this;var min=vol.min,max=vol.max;var setDirectionIndexPoint=function(index){var pnt=new x3dom.fields.SFVec3f(0,0,0);if(index&1){pnt.x=min.x;} else{pnt.x=max.x;} if(index&2){pnt.y=min.y;} else{pnt.y=max.y;} if(index&4){pnt.z=min.z;} else{pnt.z=max.z;} return pnt;};var pntIsInHalfSpace=function(i,pnt){var s=that.planeNormals[i].dot(pnt)-that.planeDistances[i];return(s>=0);};var isInHalfSpace=function(i){var p=setDirectionIndexPoint(that.directionIndex[i]);return pntIsInHalfSpace(i,p);};var isOutHalfSpace=function(i){var p=setDirectionIndexPoint(that.directionIndex[i]^7);return!pntIsInHalfSpace(i,p);};var mask=1;if(planeMask<0)planeMask=0;for(var i=0;i<6;i++,mask<<=1){if((planeMask&mask)!=0) continue;if(isOutHalfSpace(i)) return-1;if(isInHalfSpace(i)) planeMask|=mask;} return planeMask;};x3dom.docs={};x3dom.docs.specURLMap={CADGeometry:"CADGeometry.html",Core:"core.html",DIS:"dis.html",CubeMapTexturing:"env_texture.html",EnvironmentalEffects:"enveffects.html",EnvironmentalSensor:"envsensor.html",Followers:"followers.html",Geospatial:"geodata.html",Geometry2D:"geometry2D.html",Geometry3D:"geometry3D.html",Grouping:"group.html","H-Anim":"hanim.html",Interpolation:"interp.html",KeyDeviceSensor:"keyboard.html",Layering:"layering.html",Layout:"layout.html",Lighting:"lighting.html",Navigation:"navigation.html",Networking:"networking.html",NURBS:"nurbs.html",ParticleSystems:"particle_systems.html",Picking:"picking.html",PointingDeviceSensor:"pointingsensor.html",Rendering:"rendering.html",RigidBodyPhysics:"rigid_physics.html",Scripting:"scripting.html",Shaders:"shaders.html",Shape:"shape.html",Sound:"sound.html",Text:"text.html",Texturing3D:"texture3D.html",Texturing:"texturing.html",Time:"time.html",EventUtilities:"utils.html",VolumeRendering:"volume.html"};x3dom.docs.specBaseURL="http://www.web3d.org/x3d/specifications/ISO-IEC-19775-1.2-X3D-AbstractSpecification/Part01/components/";x3dom.docs.getNodeTreeInfo=function(){var tn,t;var types="";var objInArray=function(array,obj){for(var i=0;i"+ t+"   "+ x3dom.nodeTypes[t]._compName+"
";for(var i in x3dom.nodeTypes[t].childTypes[t]){dump(x3dom.nodeTypes[t].childTypes[t][i],indent+1);}};for(tn in x3dom.nodeTypes){var t=x3dom.nodeTypes[tn];if(t.childTypes===undefined){t.childTypes={};} while(t.superClass){if(t.superClass.childTypes[t.superClass._typeName]===undefined){t.superClass.childTypes[t.superClass._typeName]=[];} if(!objInArray(t.superClass.childTypes[t.superClass._typeName],t._typeName)){t.superClass.childTypes[t.superClass._typeName].push(t._typeName);} t=t.superClass;}} dump("X3DNode",0);return"